Add method to send fake sign updates to players. Adds BUKKIT-2300

This commit is contained in:
Patrick Seidel 2013-03-21 16:51:35 -04:00 committed by Travis Watkins
parent 903575ff2e
commit 0df7555cec
4 changed files with 53 additions and 24 deletions

View File

@ -1583,12 +1583,7 @@ public class PlayerConnection implements PacketPlayInListener {
this.server.getPluginManager().callEvent(event); this.server.getPluginManager().callEvent(event);
if (!event.isCancelled()) { if (!event.isCancelled()) {
for (int l = 0; l < 4; ++l) { tileentitysign1.lines = org.bukkit.craftbukkit.block.CraftSign.sanitizeLines(event.getLines());
tileentitysign1.lines[l] = event.getLine(l);
if(tileentitysign1.lines[l] == null) {
tileentitysign1.lines[l] = "";
}
}
tileentitysign1.isEditable = false; tileentitysign1.isEditable = false;
} }
// System.arraycopy(packetplayinupdatesign.f(), 0, tileentitysign1.lines, 0, 4); // System.arraycopy(packetplayinupdatesign.f(), 0, tileentitysign1.lines, 0, 4);

View File

@ -30,17 +30,7 @@ public class TileEntitySign extends TileEntity {
} }
public Packet getUpdatePacket() { public Packet getUpdatePacket() {
String[] astring = new String[4]; String[] astring = sanitizeLines(this.lines); // CraftBukkit - call sign line sanitizer to limit line length
// CraftBukkit start - Limit sign text to 15 chars per line
for (int i = 0; i < 4; ++i) {
astring[i] = this.lines[i];
if (this.lines[i].length() > 15) {
astring[i] = this.lines[i].substring(0, 15);
}
}
// CraftBukkit end
return new PacketPlayOutUpdateSign(this.x, this.y, this.z, astring); return new PacketPlayOutUpdateSign(this.x, this.y, this.z, astring);
} }
@ -56,4 +46,18 @@ public class TileEntitySign extends TileEntity {
public EntityHuman b() { public EntityHuman b() {
return this.k; return this.k;
} }
// CraftBukkit start - central method to limit sign text to 15 chars per line
public static String[] sanitizeLines(String[] lines) {
String[] astring = new String[4];
for (int i = 0; i < 4; ++i) {
astring[i] = lines[i];
if (lines[i].length() > 15) {
astring[i] = lines[i].substring(0, 15);
}
}
return astring;
}
// CraftBukkit end
} }

View File

@ -35,16 +35,24 @@ public class CraftSign extends CraftBlockState implements Sign {
boolean result = super.update(force, applyPhysics); boolean result = super.update(force, applyPhysics);
if (result) { if (result) {
for(int i = 0; i < 4; i++) { sign.lines = sanitizeLines(lines);
if(lines[i] != null) {
sign.lines[i] = lines[i];
} else {
sign.lines[i] = "";
}
}
sign.update(); sign.update();
} }
return result; return result;
} }
public static String[] sanitizeLines(String[] lines) {
String[] astring = new String[4];
for (int i = 0; i < 4; i++) {
if (i < lines.length && lines[i] != null) {
astring[i] = lines[i];
} else {
astring[i] = "";
}
}
return TileEntitySign.sanitizeLines(astring);
}
} }

View File

@ -31,6 +31,7 @@ import org.bukkit.configuration.serialization.DelegateDeserialization;
import org.bukkit.conversations.Conversation; import org.bukkit.conversations.Conversation;
import org.bukkit.conversations.ConversationAbandonedEvent; import org.bukkit.conversations.ConversationAbandonedEvent;
import org.bukkit.conversations.ManuallyAbandonedConversationCanceller; import org.bukkit.conversations.ManuallyAbandonedConversationCanceller;
import org.bukkit.craftbukkit.block.CraftSign;
import org.bukkit.craftbukkit.conversations.ConversationTracker; import org.bukkit.craftbukkit.conversations.ConversationTracker;
import org.bukkit.craftbukkit.CraftEffect; import org.bukkit.craftbukkit.CraftEffect;
import org.bukkit.craftbukkit.CraftOfflinePlayer; import org.bukkit.craftbukkit.CraftOfflinePlayer;
@ -368,6 +369,27 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
getHandle().playerConnection.sendPacket(packet); getHandle().playerConnection.sendPacket(packet);
} }
@Override
public void sendSignChange(Location loc, String[] lines) {
if (getHandle().playerConnection == null) {
return;
}
if (lines == null) {
lines = new String[4];
}
Validate.notNull(loc, "Location can not be null");
if (lines.length < 4) {
throw new IllegalArgumentException("Must have at least 4 lines");
}
// Limit to 15 chars per line and set null lines to blank
String[] astring = CraftSign.sanitizeLines(lines);
getHandle().playerConnection.sendPacket(new PacketPlayOutUpdateSign(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), astring));
}
@Override @Override
public boolean sendChunkChange(Location loc, int sx, int sy, int sz, byte[] data) { public boolean sendChunkChange(Location loc, int sx, int sy, int sz, byte[] data) {
if (getHandle().playerConnection == null) return false; if (getHandle().playerConnection == null) return false;