Skip to content

Commit

Permalink
Update the Jinglenote library inside CommandBook, to use the same
Browse files Browse the repository at this point in the history
version as in CraftBook. This has been modified a little to remove the
SearchArea dependency. (CommandBook just plays it to the player anyway)
  • Loading branch information
me4502 authored and wizjany committed Jan 3, 2014
1 parent 531af3b commit 62364f2
Show file tree
Hide file tree
Showing 8 changed files with 533 additions and 229 deletions.
6 changes: 6 additions & 0 deletions src/main/java/com/sk89q/jinglenote/Instrument.java
@@ -0,0 +1,6 @@
package com.sk89q.jinglenote;

public enum Instrument {

GUITAR, PIANO, BASS, BASS_GUITAR, STICKS, BASS_DRUM, SNARE_DRUM;
}
51 changes: 26 additions & 25 deletions src/main/java/com/sk89q/jinglenote/JingleNoteComponent.java
Expand Up @@ -18,14 +18,14 @@

package com.sk89q.jinglenote;

import com.sk89q.commandbook.CommandBook;
import com.sk89q.commandbook.util.PlayerUtil;
import com.sk89q.minecraft.util.commands.Command;
import com.sk89q.minecraft.util.commands.CommandContext;
import com.sk89q.minecraft.util.commands.CommandException;
import com.sk89q.minecraft.util.commands.CommandPermissions;
import com.zachsthings.libcomponents.ComponentInformation;
import com.zachsthings.libcomponents.bukkit.BukkitComponent;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.logging.Level;

import javax.sound.midi.InvalidMidiDataException;
import javax.sound.midi.MidiUnavailableException;

import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
Expand All @@ -34,12 +34,14 @@
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;

import javax.sound.midi.InvalidMidiDataException;
import javax.sound.midi.MidiUnavailableException;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.logging.Level;
import com.sk89q.commandbook.CommandBook;
import com.sk89q.commandbook.util.PlayerUtil;
import com.sk89q.minecraft.util.commands.Command;
import com.sk89q.minecraft.util.commands.CommandContext;
import com.sk89q.minecraft.util.commands.CommandException;
import com.sk89q.minecraft.util.commands.CommandPermissions;
import com.zachsthings.libcomponents.ComponentInformation;
import com.zachsthings.libcomponents.bukkit.BukkitComponent;

@ComponentInformation(friendlyName = "JingleNote", desc = "MIDI sequencer for note blocks with commands.")
public class JingleNoteComponent extends BukkitComponent implements Listener {
Expand All @@ -50,7 +52,7 @@ public class JingleNoteComponent extends BukkitComponent implements Listener {
public void enable() {
// Jingle note manager
jingleNoteManager = new JingleNoteManager();

registerCommands(Commands.class);
CommandBook.registerEvents(this);
}
Expand All @@ -76,8 +78,8 @@ public void onJoin(PlayerJoinEvent event) {
try {
File file = new File(CommandBook.inst().getDataFolder(), "intro.mid");
if (file.exists()) {
sequencer = new MidiJingleSequencer(file);
getJingleNoteManager().play(event.getPlayer(), sequencer, 2000);
sequencer = new MidiJingleSequencer(file, false);
getJingleNoteManager().play(event.getPlayer().getName(), sequencer);
}
} catch (MidiUnavailableException e) {
CommandBook.logger().log(Level.WARNING, "Failed to access MIDI: "
Expand All @@ -94,7 +96,7 @@ public void onJoin(PlayerJoinEvent event) {

@EventHandler
public void onQuit(PlayerQuitEvent event) {
getJingleNoteManager().stop(event.getPlayer());
getJingleNoteManager().stop(event.getPlayer().getName());
}

public class Commands {
Expand All @@ -110,7 +112,7 @@ public void intro(CommandContext args, CommandSender sender) throws CommandExcep
} else {
targets = PlayerUtil.matchPlayers(sender, args.getString(0));
}

for (Player target : targets) {
if (target != sender) {
CommandBook.inst().checkPermission(sender, "commandbook.intro.other");
Expand All @@ -119,10 +121,9 @@ public void intro(CommandContext args, CommandSender sender) throws CommandExcep
}

try {
MidiJingleSequencer sequencer = new MidiJingleSequencer(
new File(CommandBook.inst().getDataFolder(), "intro.mid"));
MidiJingleSequencer sequencer = new MidiJingleSequencer(new File(CommandBook.inst().getDataFolder(), "intro.mid"), false);
for (Player player : targets) {
getJingleNoteManager().play(player, sequencer, 0);
getJingleNoteManager().play(player.getName(), sequencer);
player.sendMessage(ChatColor.YELLOW + "Playing intro.midi...");
}
} catch (MidiUnavailableException e) {
Expand Down Expand Up @@ -159,7 +160,7 @@ public void midi(CommandContext args, CommandSender sender) throws CommandExcept

if (args.argsLength() == 0) {
for (Player target : targets) {
if (getJingleNoteManager().stop(target)) {
if (getJingleNoteManager().stop(target.getName())) {
target.sendMessage(ChatColor.YELLOW + "All music stopped.");
}
}
Expand Down Expand Up @@ -197,9 +198,9 @@ public void midi(CommandContext args, CommandSender sender) throws CommandExcept
}

try {
MidiJingleSequencer sequencer = new MidiJingleSequencer(file);
MidiJingleSequencer sequencer = new MidiJingleSequencer(file, false);
for (Player player : targets) {
getJingleNoteManager().play(player, sequencer, 0);
getJingleNoteManager().play(player.getName(), sequencer);
player.sendMessage(ChatColor.YELLOW + "Playing " + file.getName()
+ "... Use '/midi' to stop.");
}
Expand Down
89 changes: 32 additions & 57 deletions src/main/java/com/sk89q/jinglenote/JingleNoteManager.java
@@ -1,89 +1,64 @@
// $Id$
/*
* Tetsuuuu plugin for SK's Minecraft Server
* Copyright (C) 2010 sk89q <http://www.sk89q.com>
* All rights reserved.
*/
* Tetsuuuu plugin for SK's Minecraft Server Copyright (C) 2010 sk89q <http://www.sk89q.com> All rights reserved.
*/

package com.sk89q.jinglenote;

import java.util.HashMap;
import java.util.Map;

import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.entity.Player;
import com.sk89q.worldedit.blocks.BlockType;
import com.sk89q.jinglenote.bukkit.BukkitJingleNotePlayer;

/**
* A manager of play instances.
*
*
* @author sk89q
*/
public class JingleNoteManager {

/**
* List of instances.
*/
protected final Map<String, JingleNotePlayer> instances
= new HashMap<String, JingleNotePlayer>();

public void play(Player player, JingleSequencer sequencer, int delay) {
String name = player.getName();
Location loc = findLocation(player);

protected final Map<String, JingleNotePlayer> instances = new HashMap<String, JingleNotePlayer>();

public void play(String player, JingleSequencer sequencer) {

// Existing player found!
if (instances.containsKey(name)) {
JingleNotePlayer existing = instances.get(name);
Location existingLoc = existing.getLocation();

existing.stop(
existingLoc.getBlockX() == loc.getBlockX()
&& existingLoc.getBlockY() == loc.getBlockY()
&& existingLoc.getBlockZ() == loc.getBlockZ());

instances.remove(name);
if (instances.containsKey(player)) {
JingleNotePlayer existing = instances.get(player);
existing.stop();
instances.remove(player);
}
JingleNotePlayer notePlayer = new JingleNotePlayer(player, loc, sequencer, delay);

JingleNotePlayer notePlayer = new BukkitJingleNotePlayer(player, sequencer);
Thread thread = new Thread(notePlayer);
thread.setName("JingleNotePlayer for " + player.getName());
thread.setDaemon(true);
thread.setPriority(Thread.MAX_PRIORITY);
thread.setName("JingleNotePlayer for " + player);
thread.start();
instances.put(name, notePlayer);

instances.put(player, notePlayer);
}

public boolean stop(Player player) {
String name = player.getName();


public boolean stop(String player) {

// Existing player found!
if (instances.containsKey(name)) {
JingleNotePlayer existing = instances.get(name);
existing.stop(false);
instances.remove(name);
if (instances.containsKey(player)) {
JingleNotePlayer existing = instances.get(player);
existing.stop();
instances.remove(player);
return true;
}
return false;
}

public void stopAll() {

for (JingleNotePlayer notePlayer : instances.values()) {
notePlayer.stop(false);
notePlayer.stop();
}

instances.clear();
}

private Location findLocation(Player player) {
World world = player.getWorld();
Location loc = player.getLocation();
loc.setY(loc.getY() - 2);

if (!BlockType.canPassThrough(world.getBlockTypeIdAt(loc))) {
return loc;
}

loc.setY(loc.getY() + 4);

return loc;
}
}
}
92 changes: 30 additions & 62 deletions src/main/java/com/sk89q/jinglenote/JingleNotePlayer.java
@@ -1,94 +1,62 @@
// $Id$
/*
* Tetsuuuu plugin for SK's Minecraft Server
* Copyright (C) 2010 sk89q <http://www.sk89q.com>
* All rights reserved.
*/
* Tetsuuuu plugin for SK's Minecraft Server Copyright (C) 2010 sk89q <http://www.sk89q.com> All rights reserved.
*/

package com.sk89q.jinglenote;

import com.sk89q.commandbook.CommandBook;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import com.sk89q.jinglenote.JingleSequencer.Note;

public class JingleNotePlayer implements Runnable {
protected final Player player;
protected final Location loc;
public abstract class JingleNotePlayer implements Runnable {

protected final String player;
protected JingleSequencer sequencer;
protected final int delay;

protected boolean keepMusicBlock = false;

public JingleNotePlayer(Player player,
Location loc, JingleSequencer seq, int delay) {

/**
* Constructs a new JingleNotePlayer
*
* @param player The player who is hearing this's name.
* @param seq The JingleSequencer to play.
* @param area The SearchArea for this player. (optional)
*/
public JingleNotePlayer(String player, JingleSequencer seq) {

this.player = player;
this.loc = loc;
this.sequencer = seq;
this.delay = delay;
sequencer = seq;
}


@Override
public void run() {

if(sequencer == null)
return;
try {
if (delay > 0) {
Thread.sleep(delay);
}

// Create a fake note block
player.sendBlockChange(loc, 25, (byte) 0);
Thread.sleep(100);

try {
sequencer.run(this);
} catch (Throwable t) {
t.printStackTrace();
}

Thread.sleep(500);

if (!keepMusicBlock) {
// Restore music block
CommandBook.server().getScheduler().scheduleSyncDelayedTask(CommandBook.inst(), new Runnable() {

public void run() {
int prevId = player.getWorld().getBlockTypeIdAt(loc);
byte prevData = player.getWorld().getBlockAt(loc).getData();
player.sendBlockChange(loc, prevId, prevData);
}
});
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
sequencer.stop();
sequencer = null;
}
}

public boolean isActive() {
return player.isOnline();
}

public Player getPlayer() {

public String getPlayer() {

return player;
}

public Location getLocation() {
return loc;
}
public void stop() {

public void stop(boolean keepMusicBlock) {
this.keepMusicBlock = keepMusicBlock;

if (sequencer != null) {
sequencer.stop();
}
}

public void play(byte instrument, byte note) {
if (!player.isOnline()) {
return;
}

player.playNote(loc, instrument, note);
}
}

public abstract void play(Note note);
}

0 comments on commit 62364f2

Please sign in to comment.