Skip to content

Commit

Permalink
Make Sign command attach signs to surfaces.
Browse files Browse the repository at this point in the history
  • Loading branch information
davidcernat committed Jul 9, 2013
1 parent 4e845a8 commit a570bb2
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 16 deletions.
11 changes: 11 additions & 0 deletions src/main/java/net/aufdemrand/denizen/objects/dList.java
Expand Up @@ -150,6 +150,17 @@ public String getType() {
return "List";
}

public String[] toArray() {

List<String> list = new ArrayList<String>();

for (String string : this) {
list.add(string);
}

return list.toArray(new String[list.size()]);
}

// Return a list that includes only elements belonging to a certain class
public List<dObject> filter(Class<? extends dObject> dClass) {

Expand Down
Expand Up @@ -7,6 +7,8 @@
import net.aufdemrand.denizen.objects.dLocation;
import net.aufdemrand.denizen.scripts.ScriptEntry;
import net.aufdemrand.denizen.scripts.commands.AbstractCommand;
import net.aufdemrand.denizen.utilities.Utilities;
import net.aufdemrand.denizen.utilities.debugging.dB;

import org.bukkit.Material;
import org.bukkit.block.Block;
Expand Down Expand Up @@ -48,6 +50,11 @@ else if (!scriptEntry.hasObject("text")

if (!scriptEntry.hasObject("location"))
throw new InvalidArgumentsException("Must specify a Sign location!");

// Default to SIGN_POST type

if (!scriptEntry.hasObject("type"))
scriptEntry.addObject("type", Type.SIGN_POST);
}

@SuppressWarnings("unchecked")
Expand All @@ -59,23 +66,16 @@ public void execute(final ScriptEntry scriptEntry) throws CommandExecutionExcept
dList text = (dList) scriptEntry.getObject("text");
dLocation location = (dLocation) scriptEntry.getObject("location");

Block sign = location.getBlock();

if (type.equals(Type.WALL_SIGN))
sign.setType(Material.WALL_SIGN);
else
sign.setType(Material.SIGN_POST);
// Report to dB
dB.report(getName(), type.name() + ", "
+ location.debug()
+ text.debug());

Block sign = location.getBlock();
sign.setType(Material.valueOf(type.name()));
BlockState signState = sign.getState();

int n = 0;

for (String line : text) {

((Sign) signState).setLine(n, line);
n++;
}

signState.update();
Utilities.setSignLines((Sign) signState, text.toArray());
Utilities.setSignRotation(signState);
}
}
37 changes: 36 additions & 1 deletion src/main/java/net/aufdemrand/denizen/utilities/Utilities.java
Expand Up @@ -2,15 +2,25 @@

import java.io.File;
import java.io.FilenameFilter;
import java.util.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.Random;
import java.util.Set;

import net.aufdemrand.denizen.Settings;
import net.aufdemrand.denizen.objects.dNPC;
import net.aufdemrand.denizen.objects.dPlayer;
import net.aufdemrand.denizen.tags.TagManager;

import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.BlockState;
import org.bukkit.block.Sign;
import org.bukkit.entity.LivingEntity;
Expand Down Expand Up @@ -316,6 +326,13 @@ public static Random getRandom() {
return random;
}

/**
* Set the lines on a sign to the strings in a string array
*
* @param sign The sign
* @param lines The string array
*/

public static void setSignLines(Sign sign, String[] lines) {

int n = 0;
Expand All @@ -327,5 +344,23 @@ public static void setSignLines(Sign sign, String[] lines) {

sign.update();
}

/**
* Make a wall sign attach itself to an available surface
*
* @param signState The sign's blockState
*/

public static void setSignRotation(BlockState signState) {

BlockFace[] blockFaces = {BlockFace.EAST, BlockFace.NORTH, BlockFace.WEST, BlockFace.SOUTH};
for (BlockFace bf : blockFaces) {
Block bu = signState.getBlock().getRelative(bf);
if ((bu.getType() != Material.AIR)) {
((org.bukkit.material.Sign) signState.getData()).setFacingDirection(bf.getOppositeFace());
signState.update();
}
}
}

}

0 comments on commit a570bb2

Please sign in to comment.