3
0
Mirror von https://github.com/St3venAU/ArmorStandTools.git synchronisiert 2024-12-28 20:40:12 +01:00

Updated for Spigot/Craftbukkit 1.9 (Backwards compatible with 1.8.x)

Added GUI slot for setting the item in the Armor Stand's left hand (1.9 only)
Added config.yml option for default item in left hand (inOffHand)
Workaround for setting player skulls in 1.9
Dieser Commit ist enthalten in:
Steven 2016-03-27 14:11:26 +08:00
Ursprung 7d8cb88876
Commit d66c6c5e1e
10 geänderte Dateien mit 313 neuen und 197 gelöschten Zeilen

Datei anzeigen

@ -41,11 +41,14 @@ class ArmorStandGUI implements Listener {
ItemMeta im = filler.getItemMeta();
im.setDisplayName(" ");
filler.setItemMeta(im);
invSlots.add(0);
invSlots.add(9);
invSlots.add(10);
invSlots.add(18);
invSlots.add(27);
if(Main.one_nine) {
invSlots.add(12);
}
invSlots.add(2);
invSlots.add(11);
invSlots.add(20);
invSlots.add(29);
}
this.plugin = plugin;
plugin.getServer().getPluginManager().registerEvents(this, plugin);
@ -65,11 +68,16 @@ class ArmorStandGUI implements Listener {
i.setItem(tool.getSlot(), updateLore(tool));
}
}
i.setItem(0, as.getHelmet());
i.setItem(9, as.getChestplate());
i.setItem(10, as.getItemInHand());
i.setItem(18, as.getLeggings());
i.setItem(27, as.getBoots());
if(Main.one_nine) {
i.setItem(10, as.getEquipment().getItemInMainHand());
i.setItem(12, as.getEquipment().getItemInOffHand());
} else {
i.setItem(10, as.getItemInHand());
}
i.setItem(2, as.getHelmet());
i.setItem(11, as.getChestplate());
i.setItem(20, as.getLeggings());
i.setItem(29, as.getBoots());
inUse.add(as.getEntityId());
p.openInventory(i);
}
@ -148,32 +156,32 @@ class ArmorStandGUI implements Listener {
switch (t) {
case INVIS:
as.setVisible(!as.isVisible());
Utils.actionBarMsg(p, ChatColor.GREEN + Config.asVisible + ": " + (as.isVisible() ? Config.isTrue : Config.isFalse));
Utils.actionBarMsg(p, Config.asVisible + ": " + (as.isVisible() ? Config.isTrue : Config.isFalse));
break;
case CLONE:
p.closeInventory();
plugin.pickUpArmorStand(plugin.clone(as), p, true);
Utils.actionBarMsg(p, ChatColor.GREEN + Config.carrying);
Utils.actionBarMsg(p, Config.carrying);
break;
case SAVE:
plugin.generateCmdBlock(p.getLocation(), as);
Utils.actionBarMsg(p, ChatColor.GREEN + Config.cbCreated);
Utils.actionBarMsg(p, Config.cbCreated);
break;
case SIZE:
as.setSmall(!as.isSmall());
Utils.actionBarMsg(p, ChatColor.GREEN + Config.size + ": " + (as.isSmall() ? Config.small : Config.normal));
Utils.actionBarMsg(p, Config.size + ": " + (as.isSmall() ? Config.small : Config.normal));
break;
case BASE:
as.setBasePlate(!as.hasBasePlate());
Utils.actionBarMsg(p, ChatColor.GREEN + Config.basePlate + ": " + (as.hasBasePlate() ? Config.isOn : Config.isOff));
Utils.actionBarMsg(p, Config.basePlate + ": " + (as.hasBasePlate() ? Config.isOn : Config.isOff));
break;
case GRAV:
as.setGravity(!as.hasGravity());
Utils.actionBarMsg(p, ChatColor.GREEN + Config.gravity + ": " + (as.hasGravity() ? Config.isOn : Config.isOff));
Utils.actionBarMsg(p, Config.gravity + ": " + (as.hasGravity() ? Config.isOn : Config.isOff));
break;
case ARMS:
as.setArms(!as.hasArms());
Utils.actionBarMsg(p, ChatColor.GREEN + Config.arms + ": " + (as.hasArms() ? Config.isOn : Config.isOff));
Utils.actionBarMsg(p, Config.arms + ": " + (as.hasArms() ? Config.isOn : Config.isOff));
break;
case NAME:
p.closeInventory();
@ -184,10 +192,10 @@ class ArmorStandGUI implements Listener {
plugin.setPlayerSkull(p, as);
break;
case INVUL:
Utils.actionBarMsg(p, ChatColor.GREEN + Config.invul + ": " + (NBT.toggleInvulnerability(as) ? Config.isOn : Config.isOff));
Utils.actionBarMsg(p, Config.invul + ": " + (NBT.toggleInvulnerability(as) ? Config.isOn : Config.isOff));
break;
case SLOTS:
Utils.actionBarMsg(p, ChatColor.GREEN + Config.equip + ": " + (NBT.toggleSlotsDisabled(as) ? Config.locked : Config.unLocked));
Utils.actionBarMsg(p, Config.equip + ": " + (NBT.toggleSlotsDisabled(as) ? Config.locked : Config.unLocked));
break;
case MOVE:
p.closeInventory();
@ -197,16 +205,16 @@ class ArmorStandGUI implements Listener {
Utils.actionBarMsg(p, Config.asDropped);
} else {
plugin.pickUpArmorStand(as, p, false);
Utils.actionBarMsg(p, ChatColor.GREEN + Config.carrying);
Utils.actionBarMsg(p, Config.carrying);
}
break;
case NODEL: // Developer tool - do not use
if(as.getMaxHealth() == 50) {
as.setMaxHealth(20);
Utils.actionBarMsg(p, ChatColor.GREEN + "Deletion Protection: Disabled");
Utils.actionBarMsg(p, "Deletion Protection: Disabled");
} else {
as.setMaxHealth(50);
Utils.actionBarMsg(p, ChatColor.GREEN + "Deletion Protection: Enabled");
Utils.actionBarMsg(p, "Deletion Protection: Enabled");
}
break;
default:
@ -245,11 +253,16 @@ class ArmorStandGUI implements Listener {
@Override
public void run() {
if(as == null || i == null) return;
as.setHelmet(i.getItem(0));
as.setChestplate(i.getItem(9));
as.setItemInHand(i.getItem(10));
as.setLeggings(i.getItem(18));
as.setBoots(i.getItem(27));
if(Main.one_nine) {
as.getEquipment().setItemInMainHand(i.getItem(10));
as.getEquipment().setItemInOffHand(i.getItem(12));
} else {
as.setItemInHand(i.getItem(10));
}
as.setHelmet(i.getItem(2));
as.setChestplate(i.getItem(11));
as.setLeggings(i.getItem(20));
as.setBoots(i.getItem(29));
}
}.runTaskLater(plugin, 1L);
}

Datei anzeigen

@ -33,18 +33,18 @@ public enum ArmorStandTool {
SUMMON ("summon", Material.ARMOR_STAND, (short) 0, 0, false, true, "astools.use"),
GUI ("gui", Material.NETHER_STAR, (short) 0, 1, false, true, "astools.use"),
ROTAT ("rotat", Material.MAGMA_CREAM, (short) 0, 2, false, true, "astools.use"),
CLONE ("gui_clone", Material.GLOWSTONE_DUST, (short) 0, 16, true, true, "astools.clone"),
SAVE ("gui_save", Material.DIAMOND, (short) 0, 17, true, true, "astools.cmdblock"),
INVIS ("gui_invis", Material.GOLD_NUGGET, (short) 0, 14, true, true, "astools.use"),
SIZE ("gui_size", Material.EMERALD, (short) 0, 23, true, true, "astools.use"),
BASE ("gui_base", Material.BOOK, (short) 0, 22, true, true, "astools.use"),
GRAV ("gui_grav", Material.GHAST_TEAR, (short) 0, 24, true, true, "astools.use"),
ARMS ("gui_arms", Material.ARROW, (short) 0, 21, true, true, "astools.use"),
NAME ("gui_name", Material.NAME_TAG, (short) 0, 12, true, true, "astools.use"),
SLOTS ("gui_slots", Material.IRON_HOE, (short) 0, 26, true, true, "astools.use"),
PHEAD ("gui_pHead", Material.SKULL_ITEM, (short) 3, 13, true, true, "astools.use"),
INVUL ("gui_invul", Material.GOLDEN_CARROT, (short) 0, 25, true, true, "astools.use"),
MOVE ("gui_move", Material.FEATHER, (short) 0, 15, true, true, "astools.use"),
CLONE ("gui_clone", Material.GLOWSTONE_DUST, (short) 0, 15, true, true, "astools.clone"),
SAVE ("gui_save", Material.DIAMOND, (short) 0, 16, true, true, "astools.cmdblock"),
INVIS ("gui_invis", Material.GOLD_NUGGET, (short) 0, 7, true, true, "astools.use"),
SIZE ("gui_size", Material.EMERALD, (short) 0, 25, true, true, "astools.use"),
BASE ("gui_base", Material.BOOK, (short) 0, 24, true, true, "astools.use"),
GRAV ("gui_grav", Material.GHAST_TEAR, (short) 0, 32, true, true, "astools.use"),
ARMS ("gui_arms", Material.ARROW, (short) 0, 23, true, true, "astools.use"),
NAME ("gui_name", Material.NAME_TAG, (short) 0, 5, true, true, "astools.use"),
SLOTS ("gui_slots", Material.IRON_HOE, (short) 0, 34, true, true, "astools.use"),
PHEAD ("gui_pHead", Material.SKULL_ITEM, (short) 3, 6, true, true, "astools.use"),
INVUL ("gui_invul", Material.GOLDEN_CARROT, (short) 0, 33, true, true, "astools.use"),
MOVE ("gui_move", Material.FEATHER, (short) 0, 14, true, true, "astools.use"),
NODEL ("gui_noDel", Material.WOOD_SPADE, (short) 0, 35, true, false, "astools.use"); // Developer tool, disabled by default
private final ItemStack item;

Datei anzeigen

@ -19,7 +19,7 @@ class Config {
public static WorldGuardPlugin worldGuardPlugin;
public static ItemStack helmet, chest, pants, boots, itemInHand;
public static ItemStack helmet, chest, pants, boots, itemInHand, itemInOffHand;
public static boolean isVisible = true;
public static boolean isSmall = false;
public static boolean hasArms = true;
@ -100,6 +100,7 @@ class Config {
pants = toItemStack(config.getString("pants"));
boots = toItemStack(config.getString("boots"));
itemInHand = toItemStack(config.getString("inHand"));
itemInOffHand = toItemStack(config.getString("inOffHand"));
isVisible = config.getBoolean("isVisible");
isSmall = config.getBoolean("isSmall");
hasArms = config.getBoolean("hasArms");

Datei anzeigen

@ -27,10 +27,12 @@ public class Main extends JavaPlugin {
public final HashMap<UUID, ItemStack[]> savedInventories = new HashMap<UUID, ItemStack[]>();
private final EulerAngle zero = new EulerAngle(0D, 0D, 0D);
static String NMS_VERSION;
static boolean one_nine;
@Override
public void onEnable() {
NMS_VERSION = getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3];
one_nine = NMS_VERSION.startsWith("v1_9");
getServer().getPluginManager().registerEvents(new MainListener(this), this);
CommandExecutor ce = new Commands(this);
getCommand("astools").setExecutor(ce);
@ -77,15 +79,30 @@ public class Main extends JavaPlugin {
void generateCmdBlock(Location l, ArmorStand as) {
Location loc = as.getLocation();
int dSlots = NBT.getDisabledSlots(as);
int hand = as.getItemInHand() == null ? 0 : as.getItemInHand().getTypeId();
int handDmg = as.getItemInHand() == null ? 0 : as.getItemInHand().getDurability();
int boots = as.getBoots() == null ? 0 : as.getBoots().getTypeId();
String hand, boots, legs, chest, helm, offHand = "0";
int handDmg, offHandDmg = 0;
if(one_nine) {
hand = as.getEquipment().getItemInMainHand() == null ? "air" : Utils.getNmsName(as.getEquipment().getItemInMainHand().getType());
offHand = as.getEquipment().getItemInOffHand() == null ? "air" : Utils.getNmsName(as.getEquipment().getItemInOffHand().getType());
boots = as.getBoots() == null ? "air" : Utils.getNmsName(as.getBoots().getType());
legs = as.getLeggings() == null ? "air" : Utils.getNmsName(as.getLeggings().getType());
chest = as.getChestplate() == null ? "air" : Utils.getNmsName(as.getChestplate().getType());
helm = as.getHelmet() == null ? "air" : Utils.getNmsName(as.getHelmet().getType());
handDmg = as.getEquipment().getItemInMainHand() == null ? 0 : as.getEquipment().getItemInMainHand().getDurability();
offHandDmg = as.getEquipment().getItemInOffHand() == null ? 0 : as.getEquipment().getItemInOffHand().getDurability();
} else {
hand = as.getItemInHand() == null ? "0" : String.valueOf(as.getItemInHand().getTypeId());
boots = as.getBoots() == null ? "0" : String.valueOf(as.getBoots().getTypeId());
legs = as.getLeggings() == null ? "0" : String.valueOf(as.getLeggings().getTypeId());
chest = as.getChestplate() == null ? "0" : String.valueOf(as.getChestplate().getTypeId());
helm = as.getHelmet() == null ? "0" : String.valueOf(as.getHelmet().getTypeId());
handDmg = as.getItemInHand() == null ? 0 : as.getItemInHand().getDurability();
}
int bootsDmg = as.getBoots() == null ? 0 : as.getBoots().getDurability();
int legs = as.getLeggings() == null ? 0 : as.getLeggings().getTypeId();
int legsDmg = as.getLeggings() == null ? 0 : as.getLeggings().getDurability();
int chest = as.getChestplate() == null ? 0 : as.getChestplate().getTypeId();
int chestDmg = as.getChestplate() == null ? 0 : as.getChestplate().getDurability();
int helm = as.getHelmet() == null ? 0 : as.getHelmet().getTypeId();
int helmDmg = as.getHelmet() == null ? 0 : as.getHelmet().getDurability();
EulerAngle he = as.getHeadPose();
EulerAngle ll = as.getLeftLegPose();
@ -93,33 +110,65 @@ public class Main extends JavaPlugin {
EulerAngle la = as.getLeftArmPose();
EulerAngle ra = as.getRightArmPose();
EulerAngle bo = as.getBodyPose();
String cmd =
"summon ArmorStand " + Utils.twoDec(loc.getX()) + " " + Utils.twoDec(loc.getY()) + " " + Utils.twoDec(loc.getZ()) + " {"
+ (as.getMaxHealth() != 20 ? "Attributes:[{Name:\"generic.maxHealth\", Base:" + as.getMaxHealth() + "}]," : "")
+ (as.isVisible() ? "" : "Invisible:1,")
+ (as.hasBasePlate() ? "" : "NoBasePlate:1,")
+ (as.hasGravity() ? "" : "NoGravity:1,")
+ (as.hasArms() ? "ShowArms:1," : "")
+ (as.isSmall() ? "Small:1," : "")
+ (NBT.isInvulnerable(as) ? "Invulnerable:1," : "")
+ (dSlots == 0 ? "" : ("DisabledSlots:" + dSlots + ","))
+ (as.isCustomNameVisible() ? "CustomNameVisible:1," : "")
+ (as.getCustomName() == null ? "" : ("CustomName:\"" + as.getCustomName() + "\","))
+ (loc.getYaw() == 0F ? "" : ("Rotation:[" + Utils.twoDec(loc.getYaw()) + "f],"))
+ (hand == 0 && boots == 0 && legs == 0 && chest == 0 && helm == 0 ? "" : (
"Equipment:["
+ "{id:" + hand + ",Count:" + as.getItemInHand().getAmount() + ",Damage:" + handDmg + NBT.getItemStackTags(as.getItemInHand()) + "},"
+ "{id:" + boots + ",Count:" + as.getBoots().getAmount() + ",Damage:" + bootsDmg + NBT.getItemStackTags(as.getBoots()) + "},"
+ "{id:" + legs + ",Count:" + as.getLeggings().getAmount() + ",Damage:" + legsDmg + NBT.getItemStackTags(as.getLeggings()) + "},"
+ "{id:" + chest + ",Count:" + as.getChestplate().getAmount() + ",Damage:" + chestDmg + NBT.getItemStackTags(as.getChestplate()) + "},"
+ "{id:" + helm + ",Count:" + as.getHelmet().getAmount() + ",Damage:" + helmDmg + NBT.getItemStackTags(as.getHelmet()) + NBT.skullOwner(as.getHelmet()) + "}],"))
+ "Pose:{"
+ (bo.equals(zero) ? "" : ("Body:[" + Utils.angle(bo.getX()) + "f," + Utils.angle(bo.getY()) + "f," + Utils.angle(bo.getZ()) + "f],"))
+ (he.equals(zero) ? "" : ("Head:[" + Utils.angle(he.getX()) + "f," + Utils.angle(he.getY()) + "f," + Utils.angle(he.getZ()) + "f],"))
+ (ll.equals(zero) ? "" : ("LeftLeg:[" + Utils.angle(ll.getX()) + "f," + Utils.angle(ll.getY()) + "f," + Utils.angle(ll.getZ()) + "f],"))
+ (rl.equals(zero) ? "" : ("RightLeg:[" + Utils.angle(rl.getX()) + "f," + Utils.angle(rl.getY()) + "f," + Utils.angle(rl.getZ()) + "f],"))
+ (la.equals(zero) ? "" : ("LeftArm:[" + Utils.angle(la.getX()) + "f," + Utils.angle(la.getY()) + "f," + Utils.angle(la.getZ()) + "f],"))
+ "RightArm:[" + Utils.angle(ra.getX()) + "f," + Utils.angle(ra.getY()) + "f," + Utils.angle(ra.getZ()) + "f]}}";
String cmd;
if(one_nine) {
cmd = "summon ArmorStand " + Utils.twoDec(loc.getX()) + " " + Utils.twoDec(loc.getY()) + " " + Utils.twoDec(loc.getZ()) + " {"
+ (as.getMaxHealth() != 20 ? "Attributes:[{Name:\"generic.maxHealth\", Base:" + as.getMaxHealth() + "}]," : "")
+ (as.isVisible() ? "" : "Invisible:1,")
+ (as.hasBasePlate() ? "" : "NoBasePlate:1,")
+ (as.hasGravity() ? "" : "NoGravity:1,")
+ (as.hasArms() ? "ShowArms:1," : "")
+ (as.isSmall() ? "Small:1," : "")
+ (NBT.isInvulnerable(as) ? "Invulnerable:1," : "")
+ (dSlots == 0 ? "" : ("DisabledSlots:" + dSlots + ","))
+ (as.isCustomNameVisible() ? "CustomNameVisible:1," : "")
+ (as.getCustomName() == null ? "" : ("CustomName:\"" + as.getCustomName() + "\","))
+ (loc.getYaw() == 0F ? "" : ("Rotation:[" + Utils.twoDec(loc.getYaw()) + "f],"))
+ (as.getBoots() == null && as.getLeggings() == null && as.getChestplate() == null && as.getHelmet() == null ? "" : (
"ArmorItems:["
+ "{id:" + boots + ",Count:" + as.getBoots().getAmount() + ",Damage:" + bootsDmg + NBT.getItemStackTags(as.getBoots()) + "},"
+ "{id:" + legs + ",Count:" + as.getLeggings().getAmount() + ",Damage:" + legsDmg + NBT.getItemStackTags(as.getLeggings()) + "},"
+ "{id:" + chest + ",Count:" + as.getChestplate().getAmount() + ",Damage:" + chestDmg + NBT.getItemStackTags(as.getChestplate()) + "},"
+ "{id:" + helm + ",Count:" + as.getHelmet().getAmount() + ",Damage:" + helmDmg + NBT.getItemStackTags(as.getHelmet()) + NBT.skullOwner(as.getHelmet()) + "}],"))
+ (as.getEquipment().getItemInMainHand() == null && as.getEquipment().getItemInOffHand() == null ? "" : (
"HandItems:["
+ "{id:" + hand + ",Count:" + as.getEquipment().getItemInMainHand().getAmount() + ",Damage:" + handDmg + NBT.getItemStackTags(as.getEquipment().getItemInMainHand()) + "},"
+ "{id:" + offHand + ",Count:" + as.getEquipment().getItemInOffHand().getAmount() + ",Damage:" + offHandDmg + NBT.getItemStackTags(as.getEquipment().getItemInOffHand()) + "}],"))
+ "Pose:{"
+ (bo.equals(zero) ? "" : ("Body:[" + Utils.angle(bo.getX()) + "f," + Utils.angle(bo.getY()) + "f," + Utils.angle(bo.getZ()) + "f],"))
+ (he.equals(zero) ? "" : ("Head:[" + Utils.angle(he.getX()) + "f," + Utils.angle(he.getY()) + "f," + Utils.angle(he.getZ()) + "f],"))
+ (ll.equals(zero) ? "" : ("LeftLeg:[" + Utils.angle(ll.getX()) + "f," + Utils.angle(ll.getY()) + "f," + Utils.angle(ll.getZ()) + "f],"))
+ (rl.equals(zero) ? "" : ("RightLeg:[" + Utils.angle(rl.getX()) + "f," + Utils.angle(rl.getY()) + "f," + Utils.angle(rl.getZ()) + "f],"))
+ (la.equals(zero) ? "" : ("LeftArm:[" + Utils.angle(la.getX()) + "f," + Utils.angle(la.getY()) + "f," + Utils.angle(la.getZ()) + "f],"))
+ "RightArm:[" + Utils.angle(ra.getX()) + "f," + Utils.angle(ra.getY()) + "f," + Utils.angle(ra.getZ()) + "f]}}";
} else {
cmd = "summon ArmorStand " + Utils.twoDec(loc.getX()) + " " + Utils.twoDec(loc.getY()) + " " + Utils.twoDec(loc.getZ()) + " {"
+ (as.getMaxHealth() != 20 ? "Attributes:[{Name:\"generic.maxHealth\", Base:" + as.getMaxHealth() + "}]," : "")
+ (as.isVisible() ? "" : "Invisible:1,")
+ (as.hasBasePlate() ? "" : "NoBasePlate:1,")
+ (as.hasGravity() ? "" : "NoGravity:1,")
+ (as.hasArms() ? "ShowArms:1," : "")
+ (as.isSmall() ? "Small:1," : "")
+ (NBT.isInvulnerable(as) ? "Invulnerable:1," : "")
+ (dSlots == 0 ? "" : ("DisabledSlots:" + dSlots + ","))
+ (as.isCustomNameVisible() ? "CustomNameVisible:1," : "")
+ (as.getCustomName() == null ? "" : ("CustomName:\"" + as.getCustomName() + "\","))
+ (loc.getYaw() == 0F ? "" : ("Rotation:[" + Utils.twoDec(loc.getYaw()) + "f],"))
+ (as.getItemInHand() == null && as.getBoots() == null && as.getLeggings() == null && as.getChestplate() == null && as.getHelmet() == null ? "" : (
"Equipment:["
+ "{id:" + hand + ",Count:" + as.getItemInHand().getAmount() + ",Damage:" + handDmg + NBT.getItemStackTags(as.getItemInHand()) + "},"
+ "{id:" + boots + ",Count:" + as.getBoots().getAmount() + ",Damage:" + bootsDmg + NBT.getItemStackTags(as.getBoots()) + "},"
+ "{id:" + legs + ",Count:" + as.getLeggings().getAmount() + ",Damage:" + legsDmg + NBT.getItemStackTags(as.getLeggings()) + "},"
+ "{id:" + chest + ",Count:" + as.getChestplate().getAmount() + ",Damage:" + chestDmg + NBT.getItemStackTags(as.getChestplate()) + "},"
+ "{id:" + helm + ",Count:" + as.getHelmet().getAmount() + ",Damage:" + helmDmg + NBT.getItemStackTags(as.getHelmet()) + NBT.skullOwner(as.getHelmet()) + "}],"))
+ "Pose:{"
+ (bo.equals(zero) ? "" : ("Body:[" + Utils.angle(bo.getX()) + "f," + Utils.angle(bo.getY()) + "f," + Utils.angle(bo.getZ()) + "f],"))
+ (he.equals(zero) ? "" : ("Head:[" + Utils.angle(he.getX()) + "f," + Utils.angle(he.getY()) + "f," + Utils.angle(he.getZ()) + "f],"))
+ (ll.equals(zero) ? "" : ("LeftLeg:[" + Utils.angle(ll.getX()) + "f," + Utils.angle(ll.getY()) + "f," + Utils.angle(ll.getZ()) + "f],"))
+ (rl.equals(zero) ? "" : ("RightLeg:[" + Utils.angle(rl.getX()) + "f," + Utils.angle(rl.getY()) + "f," + Utils.angle(rl.getZ()) + "f],"))
+ (la.equals(zero) ? "" : ("LeftArm:[" + Utils.angle(la.getX()) + "f," + Utils.angle(la.getY()) + "f," + Utils.angle(la.getZ()) + "f],"))
+ "RightArm:[" + Utils.angle(ra.getX()) + "f," + Utils.angle(ra.getY()) + "f," + Utils.angle(ra.getZ()) + "f]}}";
}
Block b = l.getBlock();
b.setType(Material.COMMAND);
b.setData((byte) 0);

Datei anzeigen

@ -1,11 +1,10 @@
package com.gmail.St3venAU.plugins.ArmorStandTools;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.SkullType;
import org.bukkit.block.Block;
import org.bukkit.block.Skull;
import org.bukkit.entity.ArmorStand;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
@ -64,7 +63,7 @@ public class MainListener implements Listener {
p.sendMessage(ChatColor.RED + Config.wgNoPerm);
}
}
ArmorStandTool tool = ArmorStandTool.get(p.getItemInHand());
ArmorStandTool tool = ArmorStandTool.get(p.getInventory().getItemInMainHand());
if(tool == null) return;
ArmorStand as = (ArmorStand) event.getRightClicked();
if (!plugin.playerHasPermission(p, event.getRightClicked().getLocation().getBlock(), tool)) {
@ -190,7 +189,7 @@ public class MainListener implements Listener {
return;
}
as.teleport(Utils.getLocationFacing(event.getTo()));
Utils.actionBarMsg(p, ChatColor.GREEN + Config.carrying);
Utils.actionBarMsg(p, Config.carrying);
}
}
@ -210,7 +209,7 @@ public class MainListener implements Listener {
@Override
public void run() {
as.teleport(Utils.getLocationFacing(p.getLocation()));
Utils.actionBarMsg(p, ChatColor.GREEN + Config.carrying);
Utils.actionBarMsg(p, Config.carrying);
}
}.runTaskLater(plugin, 1L);
} else {
@ -315,7 +314,7 @@ public class MainListener implements Listener {
}
Location l = Utils.getLocationFacing(p.getLocation());
plugin.pickUpArmorStand(spawnArmorStand(l), p, true);
Utils.actionBarMsg(p, ChatColor.GREEN + Config.carrying);
Utils.actionBarMsg(p, Config.carrying);
}
new BukkitRunnable() {
@Override
@ -327,7 +326,7 @@ public class MainListener implements Listener {
@EventHandler
public void onEntityDamageByEntity(EntityDamageByEntityEvent event) {
if(event.getEntity() instanceof ArmorStand && event.getDamager() instanceof Player && ArmorStandTool.isTool(((Player) event.getDamager()).getItemInHand())) {
if(event.getEntity() instanceof ArmorStand && event.getDamager() instanceof Player && ArmorStandTool.isTool(((Player) event.getDamager()).getInventory().getItemInMainHand())) {
event.setCancelled(true);
if(noCooldown(event.getDamager())) {
Utils.cycleInventory((Player) event.getDamager());
@ -350,7 +349,12 @@ public class MainListener implements Listener {
as.setChestplate(Config.chest);
as.setLeggings(Config.pants);
as.setBoots(Config.boots);
as.setItemInHand(Config.itemInHand);
if(Main.one_nine) {
as.getEquipment().setItemInMainHand(Config.itemInHand);
as.getEquipment().setItemInOffHand(Config.itemInOffHand);
} else {
as.setItemInHand(Config.itemInHand);
}
as.setVisible(Config.isVisible);
as.setSmall(Config.isSmall);
as.setArms(Config.hasArms);
@ -379,7 +383,6 @@ public class MainListener implements Listener {
if(event.getBlock().hasMetadata("armorStand")) {
final Block b = event.getBlock();
final ArmorStand as = getArmorStand(b);
boolean delete = true;
if (as != null) {
String input = "";
for (String line : event.getLines()) {
@ -400,58 +403,27 @@ public class MainListener implements Listener {
if(MC_USERNAME_PATTERN.matcher(input).matches()) {
final String name = input;
b.setMetadata("protected", new FixedMetadataValue(plugin, true));
b.setType(Material.SKULL);
final Skull s = (Skull) b.getState();
s.setSkullType(SkullType.PLAYER);
delete = false;
event.getPlayer().sendMessage(ChatColor.GOLD + Config.pleaseWait);
new BukkitRunnable() {
@Override
public void run() {
final boolean ok = Utils.loadProfile(name);
new BukkitRunnable() {
@Override
public void run() {
if (ok) {
s.setOwner(name);
s.update();
new BukkitRunnable() {
int n = 0;
ItemStack skull;
@Override
public void run() {
if(++n > 20) {
this.cancel();
event.getPlayer().sendMessage(ChatColor.RED + Config.headFailed);
b.setType(Material.AIR);
b.setData((byte) 0);
b.removeMetadata("protected", plugin);
return;
}
skull = b.getDrops().iterator().next();
if(skull.getType() == Material.SKULL_ITEM && skull.getData().getData() == (byte) 3) {
SkullMeta meta = (SkullMeta) skull.getItemMeta();
if(meta.hasOwner() && meta.getOwner().equalsIgnoreCase(name)) {
as.setHelmet(skull);
event.getPlayer().sendMessage(ChatColor.GREEN + Config.appliedHead + ChatColor.GOLD + " " + name);
b.setType(Material.AIR);
b.setData((byte) 0);
b.removeMetadata("protected", plugin);
this.cancel();
}
}
}
}.runTaskTimer(plugin, 10L, 10L);
} else {
event.getPlayer().sendMessage(ChatColor.RED + Config.noHead + ChatColor.GOLD + " " + name);
b.setType(Material.AIR);
b.setData((byte) 0);
b.removeMetadata("protected", plugin);
}
}
}.runTask(plugin);
String cmd = "give " + event.getPlayer().getName() + " minecraft:skull 1 3 {SkullOwner:\"" + name + "\"}";
String current = b.getWorld().getGameRuleValue("sendCommandFeedback");
b.getWorld().setGameRuleValue("sendCommandFeedback", "false");
Bukkit.getServer().dispatchCommand(Bukkit.getServer().getConsoleSender(), cmd);
b.getWorld().setGameRuleValue("sendCommandFeedback", current);
boolean found = false;
for(int slot : event.getPlayer().getInventory().all(Material.SKULL_ITEM).keySet()) {
ItemStack skull = event.getPlayer().getInventory().getItem(slot);
SkullMeta sm = (SkullMeta) skull.getItemMeta();
if(sm.hasOwner() && name.equalsIgnoreCase(sm.getOwner())) {
as.setHelmet(skull);
event.getPlayer().sendMessage(ChatColor.GREEN + Config.appliedHead + ChatColor.GOLD + " " + name);
event.getPlayer().getInventory().setItem(slot, null);
found = true;
break;
}
}.runTaskAsynchronously(plugin);
}
if(!found) {
event.getPlayer().sendMessage(ChatColor.GOLD + Config.headFailed);
}
} else {
event.getPlayer().sendMessage(ChatColor.RED + input + " " + Config.invalidName);
}
@ -461,10 +433,8 @@ public class MainListener implements Listener {
b.removeMetadata("armorStand", plugin);
b.removeMetadata("setName", plugin);
b.removeMetadata("setSkull", plugin);
if(delete) {
b.setType(Material.AIR);
b.setData((byte) 0);
}
b.setType(Material.AIR);
b.setData((byte) 0);
}
}

Datei anzeigen

@ -6,66 +6,124 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.LeatherArmorMeta;
import org.bukkit.inventory.meta.SkullMeta;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Map;
class NBT {
static boolean toggleSlotsDisabled(ArmorStand as) {
Object nmsEntity = getNmsEntity(as);
if(nmsEntity == null) return false;
Object tag = getTag(nmsEntity);
if(tag == null) return false;
boolean slotsDisabled = getInt(tag, "DisabledSlots") == 0;
setInt(tag, "DisabledSlots", slotsDisabled ? 2039583 : 0);
saveTagA(nmsEntity, tag);
boolean slotsDisabled = getDisabledSlots(as) == 0;
setSlotsDisabled(as, slotsDisabled);
return slotsDisabled;
}
static boolean toggleInvulnerability(ArmorStand as) {
Object nmsEntity = getNmsEntity(as);
if(nmsEntity == null) return false;
Object tag = getTag(nmsEntity);
if(tag == null) return false;
boolean invulnerable = !getBoolean(tag, "Invulnerable");
setBoolean(tag, "Invulnerable", invulnerable);
saveTagF(nmsEntity, tag);
return invulnerable;
}
static void setSlotsDisabled(ArmorStand as, boolean slotsDisabled) {
Object nmsEntity = getNmsEntity(as);
if(nmsEntity == null) return;
Object tag = getTag(nmsEntity);
if(tag == null) return;
setInt(tag, "DisabledSlots", slotsDisabled ? 2039583 : 0);
saveTagA(nmsEntity, tag);
}
static void setInvulnerable(ArmorStand as, boolean invulnerable) {
Object nmsEntity = getNmsEntity(as);
if(nmsEntity == null) return;
Object tag = getTag(nmsEntity);
if(tag == null) return;
setBoolean(tag, "Invulnerable", invulnerable);
saveTagF(nmsEntity, tag);
}
static boolean isInvulnerable(ArmorStand as) {
Object nmsEntity = getNmsEntity(as);
if (nmsEntity == null) return false;
Object tag = getTag(nmsEntity);
return tag != null && getBoolean(tag, "Invulnerable");
}
static int getDisabledSlots(ArmorStand as) {
Object nmsEntity = getNmsEntity(as);
if(nmsEntity == null) return 0;
Object tag = getTag(nmsEntity);
if (tag == null) return 0;
return getInt(tag, "DisabledSlots");
if(Main.one_nine) {
Field f;
try {
f = nmsEntity.getClass().getDeclaredField("bz");
} catch (NoSuchFieldException e) {
e.printStackTrace();
return 0;
}
f.setAccessible(true);
try {
return (Integer) f.get(nmsEntity);
} catch (IllegalAccessException e) {
e.printStackTrace();
return 0;
}
} else {
Object tag = getTag(nmsEntity);
if (tag == null) return 0;
return getInt(tag, "DisabledSlots");
}
}
static void setSlotsDisabled(ArmorStand as, boolean slotsDisabled) {
Object nmsEntity = getNmsEntity(as);
if (nmsEntity == null) return;
if(Main.one_nine) {
Field f;
try {
f = nmsEntity.getClass().getDeclaredField("bz");
} catch (NoSuchFieldException e) {
e.printStackTrace();
return;
}
f.setAccessible(true);
try {
f.set(nmsEntity, slotsDisabled ? 2039583 : 0);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
} else {
Object tag = getTag(nmsEntity);
if (tag == null) return;
setInt(tag, "DisabledSlots", slotsDisabled ? 2039583 : 0);
saveTagA(nmsEntity, tag);
}
}
static boolean toggleInvulnerability(ArmorStand as) {
boolean isInvulnerable = !isInvulnerable(as);
setInvulnerable(as, isInvulnerable);
return isInvulnerable;
}
static boolean isInvulnerable(ArmorStand as) {
Object nmsEntity = getNmsEntity(as);
if (nmsEntity == null) return false;
if(Main.one_nine) {
Field f;
try {
f = Utils.getNMSClass("Entity").getDeclaredField("invulnerable");
} catch (Exception e) {
e.printStackTrace();
return false;
}
f.setAccessible(true);
try {
return (Boolean) f.get(nmsEntity);
} catch (IllegalAccessException e) {
e.printStackTrace();
return false;
}
} else {
Object tag = getTag(nmsEntity);
return tag != null && getBoolean(tag, "Invulnerable");
}
}
static void setInvulnerable(ArmorStand as, boolean invulnerable) {
Object nmsEntity = getNmsEntity(as);
if (nmsEntity == null) return;
if(Main.one_nine) {
Field f;
try {
f = Utils.getNMSClass("Entity").getDeclaredField("invulnerable");
} catch (Exception e) {
e.printStackTrace();
return;
}
f.setAccessible(true);
try {
f.set(nmsEntity, invulnerable);
} catch (Exception e) {
e.printStackTrace();
}
} else {
Object tag = getTag(nmsEntity);
if(tag == null) return;
setBoolean(tag, "Invulnerable", invulnerable);
saveTagF(nmsEntity, tag);
}
}
private static Object getNmsEntity(org.bukkit.entity.Entity entity) {
try {
return entity.getClass().getMethod("getHandle").invoke(entity);
@ -76,6 +134,7 @@ class NBT {
}
private static Object getTag(Object nmsEntity) {
try {
Method method = nmsEntity.getClass().getMethod("getNBTTag");
Object tag = method.invoke(nmsEntity);

Datei anzeigen

@ -13,6 +13,7 @@ import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.Arrays;
import java.util.Collection;
import java.util.Set;
class Utils {
@ -93,7 +94,7 @@ class Utils {
static void actionBarMsg(Player p, String msg) {
try {
Object chat = getNMSClass("ChatSerializer").getMethod("a", String.class).invoke(null, "{text:\"" + msg + "\"}");
Object chat = getNMSClass("ChatSerializer").getMethod("a", String.class).invoke(null, "{\"text\":\"" + msg + "\",\"color\":\"green\"}");
Object packet = getNMSClass("PacketPlayOutChat").getConstructor(getNMSClass("IChatBaseComponent"), byte.class).newInstance(chat, (byte) 2);
sendPacket(p, packet);
} catch (Exception e) {
@ -120,17 +121,6 @@ class Utils {
return Class.forName("net.minecraft.server." + Main.NMS_VERSION + "." + nmsClassString);
}
static boolean loadProfile(String name) {
try {
Object server = getNMSClass("MinecraftServer").getMethod("getServer").invoke(null);
Object cache = server.getClass().getMethod("getUserCache").invoke(server);
return cache.getClass().getMethod("getProfile", String.class).invoke(cache, name) != null;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
private static void sendPacket(Player p, Object packet) {
try {
Object player = p.getClass().getMethod("getHandle").invoke(p);
@ -169,4 +159,37 @@ class Utils {
return is;
}
static String getNmsName(Material m) {
try {
Class block = getNMSClass("Block");
Class item = getNMSClass("Item");
Class registryBlocks = getNMSClass("RegistryBlocks");
Class registryMaterials = getNMSClass("RegistryMaterials");
Class regKey = getNMSClass("MinecraftKey");
Object registry = block.getDeclaredField("REGISTRY").get(null);
Set<Object> set = (Set<Object>) registry.getClass().getMethod("keySet").invoke(registry);
for(Object key : set) {
Object b = registryBlocks.getMethod("get", Object.class).invoke(registry, key);
Integer id = (Integer) block.getMethod("getId", block).invoke(null, b);
if(id == m.getId()) {
return (String) regKey.getMethod("a").invoke(key);
}
}
registry = item.getDeclaredField("REGISTRY").get(null);
set = (Set<Object>) registry.getClass().getMethod("keySet").invoke(registry);
for(Object key : set) {
Object i = registryMaterials.getMethod("get", Object.class).invoke(registry, key);
Integer id = (Integer) item.getMethod("getId", item).invoke(null, i);
if(id == m.getId()) {
return (String) regKey.getMethod("a").invoke(key);
}
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
return null;
}
}

Datei anzeigen

@ -4,7 +4,7 @@
#
# Main Config
#
# File generated by: v2.06
# File generated by: v2.1
# (If this is not the version you are running, consider deleting this
# config to allow it to be re-created. There may be new config options)
#
@ -13,7 +13,7 @@
# - Name armor stands
# - Toggle: Gravity, Visibility, Arms, Base, Size, Invulnerability, Equipment Lock
# - Manipulate the position of the Head, Body, Arms and Legs
# - Full control over armor stand's inventory (armor & item in hand)
# - Full control over armor stand's inventory (armor & items in hands)
# - Clone armor stand tool
# - Create command block tool: Creates a command block with the command that will summon this
# armor stand in its current state
@ -44,6 +44,7 @@ chest: IRON_CHESTPLATE 0
pants: IRON_LEGGINGS 0
boots: IRON_BOOTS 0
inHand: AIR 0
inOffHand: AIR 0
isVisible: true
isSmall: false
hasArms: true

Datei anzeigen

@ -4,7 +4,7 @@
#
# Language Config
#
# File generated by: v2.06
# File generated by: v2.1
# (If this is not the version you are running, consider deleting this
# config to allow it to be re-created. There may be new config options)
#

Datei anzeigen

@ -1,6 +1,6 @@
main: com.gmail.St3venAU.plugins.ArmorStandTools.Main
name: ArmorStandTools
version: 2.06
version: 2.1
author: St3venAU
description: Armor stand manipulation tools
softdepend: [WorldGuard, PlotSquared]