From 2bd13d1eb0a9d1013628c16a2b5e457d7abdc057 Mon Sep 17 00:00:00 2001 From: aPunch Date: Thu, 26 Jan 2012 15:08:32 -0600 Subject: [PATCH] added command requirements and NPC owners --- lib/CitizensAPI.jar | Bin 17709 -> 18410 bytes src/net/citizensnpcs/Citizens.java | 6 ++- .../citizensnpcs/command/CommandManager.java | 38 +++++++++++++----- .../command/annotation/Requirements.java | 4 +- .../command/command/AdminCommands.java | 15 +++++++ .../command/command/NPCCommands.java | 18 ++++++--- .../citizensnpcs/npc/CitizensNPCManager.java | 4 +- 7 files changed, 66 insertions(+), 19 deletions(-) create mode 100644 src/net/citizensnpcs/command/command/AdminCommands.java diff --git a/lib/CitizensAPI.jar b/lib/CitizensAPI.jar index 33c46ed91e0859d5aba2d4adb21cc6b1cb2a8ffc..089f0383ee6e2edd65f7d7b05e02432d7563d2a4 100644 GIT binary patch delta 4040 zcmZWs2T)VZ7Eb8Bh8}to6bKUO1VZ^0>0Ll-K#*RPCKy191_UvnAiW!@Qbf8`MT#_$ zE?s&@KvZ71_`f&KyE8lA*>Asd_T1de**zr~@M=7mN?(hRhyrx>SotJSi4ffMNsx&l zB-W5m=->w6+odzWGJ|0NYJ#N!gb@f~QxO!@|MNdnHG|>6>UXfrAC)}en!7yKoj~Pm zURh4?g#a)x#L0w!AxM4~3>fJY(DS7Rd=>z+Ow)3{R7^KSK#zA{) z7A(SwPXSul&Uocq_Y)Ef26S}h%tR<+5U7qC1QNyTpxAt7ZZx$sGRCw>Q^m-Ajqu4U zoUv#Y1oIgY?GOJG>g89PmhQMpCiShnQIeOv&891gl3$9l8#Coa z74C^vI=xh0+|E8dqD$`t!amT^UJvDgc8)- za$AMgU;EYYU(w9ePT}J<9gN1xA8U3D#bv~#9(OSI`k2&qO=XQc76~_LY)9t2?p*8& z_Li*Hw?LcQ{or$Z-(#8Q@}<&Tq&!@`p&Cn9%=^B>4V%y1+JNbFx!=2evt#aHk4|WV0W#9jn|EDXw^0L zc76Ss`3>37sW|wV1O`Db(H~ic-ujXiue8T!+>*n}S9xqGiHc3lxl|ugbMp3sW*cvD z#hapy-3kwh9oZ}UsLZHu{e^ZQQsW!!yEFUl5R*}MXd=9LHZCgub*UX;=F21FHm9ST zZB~=$p>5(#5!p$MwrJDvcGA1x$0wpq1KVOvL)%LC`@QHS+}_W1M~|84t*o|IB+NeA zoL~^4cXLg=u(XDNeA4{p8z{=jTW!8=9S2{t?H#vap*_i2sB@4jsO)16m`2b>rRmld z5v@fC21@K ziEeMtpKCUd^lp=_$@Bw#@{K%<_0u0#%w#W7lkMS@*mWm&{|OH164rm(%R#&?`yER3?Jx zu()tcsY)wK)5*-VTp-TCfbt82&+ZJQG5ajd3P%xT{Kd8~VoQO}mF{bN%vIe&rj$*`yzS!nt`(|jm zYzr*XR$`v%(}v?F&GuMt`GW`X+0-66xzq?7`r7;9_jRxTw)RIyHglBCC2IeM_o2OX z%KP?2{BA$J%a{&+{<`;l0EGeHt5}Oj1O9pQU1~ETMk)TJL5}>pG^mWSlMFAyjIvVD zZ)`)o}0q)E@SvdHFKQFA^);~fk}B7<^BPr4(&}T$*eLeHx< z5&yusbX0KmoM{k-pBsA@=+6yOQKIwXf<`QY2ndrTc^)R_vI!u;&PyH8TlvVVkXV)< zQxJea`9vTP3}5^CuwNBO(0cwJjy~cjH#=Y7#|GUVL;7?|GJeqak|7a@fIP7<1hlY& z>{*rvrjFNzxumYyyR6mSsJ>zZ0CPs}}jG#6E4o50hSZLtSC zx+Is!9Q)JyBp)=fWROLTWl*)ZEFP<f~j$4NhyM8JIXK0Rm@{R z$_@7pgAUUw{kJ}6qJRA+4Hc|{^w>F)mCd=c6)}`{y)Ct+-ntOLBI8i(>tz(hJFmn> z%vJ*t*g>Sy4j$3f9G~( zt)?NmrKc;kiS;798hVU;>AMH&+=> zHpbW3G@eekqo0gwv);NZYKjxUrZV& zq^@!pNOBr6WW=~o615ODL1F#D;bsCa3>)%#5EiQ%=DDse&Fo){j(_=L3L(*{-|=LR zUpS05oW(PO?y5_nJx^>dW}{yz&y(b8@K>^Ix{Lv+F8fynzXf3h7ZF%qwYVpT5vl@qyGw{nW7 zuy|-7$p?QBMPgSi1>wT(Cs@A*8!~+TLUybj**tjAIC%;=$JA|4zYkJKrsOmr7uzu+ zdPea^=-z?=pIl78LjFC0Wb$XepAshfTpzgS-H%NCvLGF``+{Ngj;%=rT6wA3&M%r( zu0U}eP4YZp#h?+2v+m>wkkYS(7%1l>r%-OyB{fprkH!KvU3tgjTe&J@t%h3T)$4UZS_#vJd4~)Kkk!w* z1B_ayauS_!A#&^|7EbHea7_u(r2a`Rra=*Te7rd4NwXa9Jtq5%9$#%w?m0pCg2&I> zMx@3sR(YV_*nB9l$nubpR<8t^#PRa2@DmvK91!`M!byfY%gt08CaiKj#%~05nyy z1h7iU7(hzI`MMM0CNS?r*ixUhH2-Z?uu{re1jHKHP-Q3q8x-rUz=5q*W&*SW${YlG zTmTiyMTccmq2f7nRY_h@FU2=*tN0;)*1`RG^1?Q`vDqqISd0H;%~H7n1fy9;IE~;rS$u1C@h{CZFA!`RNsfgg8GwW&ksJiS`2NuJ*bpQ? z5X1Z79upStKS>AzN&OXLK=6;4A4o{!`sW90c)<<4`0vcCu{^3uz#g`$90cnZ@Gs4a z%}^BusBS!k@8`}b7A%h%53p@hkYJrS{ce{+Suwj~t<#0W7cHeHPhh*7M@K@cYi z(5q@}fPaR_7Lo*?i4OkO0RPKB;xZttzsz*z4~RiV9dYG&(IS3`{w1E20>lOCEIj{r z5BWe44f*?WALn;tR8+h6O E0Q*s{uIkXD^KNJHZ8G0B*3``2xAhII=%imSiKvh9@6{_}+N)yC0Fybzj z7Q=dBV28?>1_wKmEa#wLCxcaJkE){20*uVE*X~gToFDcgF+5>=kzc$~P_FALYDCUy zwP9yQ2&4oFfye=!(n7#%T`r)UpPj-YL!jE^lZlpR=HX&|mU&i0S>F6;_7(wyItec+ zyIIm^agok@r3=M=-TM|DoVPx5Y?(Ma53hOMJSOaBQ(5vdczUF=qu+ZpxZ_)|PR%y^ z81DsyyV|r>)xj8!U@gqW2<)Nw@eEG>v)X#|!x;auoZ=ClH=D2@x&k5-;#f-5AtvXB z#uXwDV&TeJ0z4Y=bvw9k!(4pqQaUY%cz_C_ua&&54<kF_3WJsdOLI#u%P&WER`#cq8#qosjAbHG&WjOO$e_kJ7EGtxg|(jO!zadESq z5JHLgg=NBO9v3P9P&6xu$n|lsucatd7wlho?!n7fpE;v!-EZuM@pZ^iDRe_?b}y)x zHy7tcHF8F#rD7c&oRz6;8^=w#TXI*1vRqUfDz!d`rJ6hm3-M#;F)kOc>u@o~UO@Y) zTYjX83qIO#rXMlj{PkaNOmK^p5iCtiiED>L?mD4sdYrA-#Tnfl`_<%&1g7~ zOm4U>NaIc`T1ueq6QnhS3DTN41lh+M7OTR)yN8xpzIqihcyw8BE#O)Tb2-k4cPT`K zI+Ojq0)LCWtIR&oHL-lo?dgCk2ghdCk8>?S$GkIy!bk2iU%6+RV$0H3+U-y=YBTUK zW_aZSKKgi@K&Wm_t2T74LYguVHY`let+y zGOx~wsnr4WL})yFP<9G(XubOA{NepEevySI`^4JPW{f)?z2$Q4$*$?H@{y4A!)0Ov zS`wWdEds>`2D($Z>ONOZ&E|NzVtY`8v$ux)H#nAb(udKO>s(yD*LEmG{rcgFA?N_1 z>NVd8X5fOwV$`YU?4Ov!s_I{OhJ4$%kf0OCy@RBo%(|8Yw%2J*%=L!C;_Ib9f>S<0 zU_zVmU&oc|Ty;Fy#{|4NQmfHa0klG`L2_#R*GC7Nicz@QTsyXUitd;@j@Zd41gK6i z^@?r^Ccc2|6Tw})>OhGxv#QN?3e1J*TpozmnWzo3Sz@VLm?#}mP(FA=M|ValR3_~q zAC<#0Z@rl(7Bxi`t*@_4j}!^+BZ=WEnDT>=M#+7AG7IFJyg}75w!;r@R}40JE0H&^ zW)e{&dbaxtdr!noZjiIg$UE?J-}!aTGCJyAg(E9>9(MS2@->#bp|2U~7uj@b&g zXg-Y-c@#+g%Z=3ijTG*D*S8y?e0glYg7d0t%Z$@P@-oiK zXBnFh)+;i0boNs0_<8P^%m$HDGOAlDTGN6u+A8i`8ODnf@C8N=p}5b2+e-|Ocl+Sy)V5;4XHrc(SrJSRDAQvciIk*C5uAc*!k*j+z7IEQ7Blvn=%Z zI1J}2nm3qY*3VzaZKzx_l%$M@so+VO5UdL}jg>V_I$!6yaAfKLYxpoE5!+?&H~4J;Z>7|B&l(_5;9 z*9zM;_2XBo1}3}D91iQFMAc7wusE`MJ(KgeyXAb?^T1l)=Q^qlUl;pnEiSlVxAa)|WA zaXY8NjMuWi;eFxH=8vcx%ib4J9iekpcTd0cG8uC^e18BFy_|YZz)fORn?6c zs;19iV5e!Y^?$iI7I&0@@I`zUnmSOmYS77~G0w;C+!0`BW!=1FYoT;SZI*R6xFGxpJGso9D*`Ml$u04#M zo4KQ$HIf^1Z=X|ga`jia^=+HkzQ3sukI(eM#WILG zF35NF^;UYA86t1s@h@TBhgMj~`bUm;y)4rIG%a6`PtQ#o)~E{}aN5^#^{Mys{XWCB zzaG%02+`?BNBwkr<|%M`8sq2RP<7Nun)HQ}>kbqHLAsCMk&?Sum%!ODu{#y()gl>}n<_HQ#76xgbBSPri z62!Dgy+XPR&e5A9z5RZ&FU^X8!kQzZpwQLw(~%N7J5Fy>zg2Y1zBGXbg(9LzK!$`s z?|Liy0>Qh7PO8&gTmBDmpC~8}APIvjNg|M7Kal0xgCJ>l_05u+db7MxPU0#Cz${`?-MNs`eR0XQT diff --git a/src/net/citizensnpcs/Citizens.java b/src/net/citizensnpcs/Citizens.java index ea6f5e13f..db01566f2 100644 --- a/src/net/citizensnpcs/Citizens.java +++ b/src/net/citizensnpcs/Citizens.java @@ -17,6 +17,7 @@ import net.citizensnpcs.api.npc.trait.Character; import net.citizensnpcs.api.npc.trait.DefaultInstanceFactory; import net.citizensnpcs.api.npc.trait.InstanceFactory; import net.citizensnpcs.api.npc.trait.Trait; +import net.citizensnpcs.api.npc.trait.trait.Owner; import net.citizensnpcs.api.npc.trait.trait.SpawnLocation; import net.citizensnpcs.command.CommandManager; import net.citizensnpcs.command.Injector; @@ -52,7 +53,7 @@ public class Citizens extends JavaPlugin { private CitizensNPCManager npcManager; private final InstanceFactory characterManager = new DefaultInstanceFactory(); private final InstanceFactory traitManager = new DefaultInstanceFactory(); - private final CommandManager cmdManager = new CommandManager(); + private CommandManager cmdManager; private Settings config; @Override @@ -180,6 +181,7 @@ public class Citizens extends JavaPlugin { private void setupNPCs() throws NPCLoadException { traitManager.register("location", SpawnLocation.class); + traitManager.register("owner", Owner.class); for (DataKey key : getNPCStorage().getKey("npc").getIntegerSubKeys()) { int id = Integer.parseInt(key.name()); @@ -228,8 +230,10 @@ public class Citizens extends JavaPlugin { } private void registerCommands() { + cmdManager = new CommandManager(npcManager); cmdManager.setInjector(new Injector(npcManager, characterManager)); + // cmdManager.register(AdminCommands.class); cmdManager.register(NPCCommands.class); } diff --git a/src/net/citizensnpcs/command/CommandManager.java b/src/net/citizensnpcs/command/CommandManager.java index f938708b1..faf455eb1 100644 --- a/src/net/citizensnpcs/command/CommandManager.java +++ b/src/net/citizensnpcs/command/CommandManager.java @@ -30,6 +30,8 @@ import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; +import net.citizensnpcs.api.npc.NPC; +import net.citizensnpcs.api.npc.trait.trait.Owner; import net.citizensnpcs.command.annotation.Command; import net.citizensnpcs.command.annotation.Requirements; import net.citizensnpcs.command.annotation.NestedCommand; @@ -39,9 +41,11 @@ import net.citizensnpcs.command.exception.CommandException; import net.citizensnpcs.command.exception.CommandUsageException; import net.citizensnpcs.command.exception.MissingNestedCommandException; import net.citizensnpcs.command.exception.NoPermissionsException; +import net.citizensnpcs.command.exception.RequirementMissingException; import net.citizensnpcs.command.exception.ServerCommandException; import net.citizensnpcs.command.exception.UnhandledCommandException; import net.citizensnpcs.command.exception.WrappedCommandException; +import net.citizensnpcs.npc.CitizensNPCManager; import net.citizensnpcs.util.Messaging; import org.bukkit.command.ConsoleCommandSender; @@ -55,8 +59,8 @@ public class CommandManager { /* * Mapping of commands (including aliases) with a description. Root commands * are stored under a key of null, whereas child commands are cached under - * their respective {@link Method}. The child map has the key of the command - * name (one for each alias) with the method. + * their respective Method. The child map has the key of the command name + * (one for each alias) with the method. */ private final Map> commands = new HashMap>(); @@ -76,10 +80,16 @@ public class CommandManager { private final Map serverCommands = new HashMap(); + private final CitizensNPCManager npcManager; + + public CommandManager(CitizensNPCManager npcManager) { + this.npcManager = npcManager; + } + /* - * Register an class that contains commands (denoted by {@link Command}. If - * no dependency injector is specified, then the methods of the class will - * be registered to be called statically. Otherwise, new instances will be + * Register an class that contains commands (denoted by Command. If no + * dependency injector is specified, then the methods of the class will be + * registered to be called statically. Otherwise, new instances will be * created of the command classes and methods will not be called statically. */ public void register(Class clazz) { @@ -313,11 +323,19 @@ public class CommandManager { executeMethod(method, args, player, methodArgs, level + 1); else if (methodArgs[1] instanceof Player) { Requirements cmdRequirements = requirements.get(method); + if (cmdRequirements != null) { + if (methodArgs[2] instanceof NPC) { + NPC npc = npcManager.getSelectedNPC(player); + if (npc != null) + methodArgs[2] = npc; - // TODO add requirements - if (cmdRequirements != null) - Messaging.debug(""); - else + if (cmdRequirements.selected() && npc == null) + throw new RequirementMissingException("You must have an NPC selected to execute that command."); + if (cmdRequirements.ownership() && !npc.getTrait(Owner.class).getOwner().equals(player.getName())) + throw new RequirementMissingException( + "You must be the owner of this NPC to execute that command."); + } + } else Messaging.debug("No annotation present."); } @@ -368,7 +386,7 @@ public class CommandManager { // Returns whether a player has permission. private boolean hasPermission(Player player, String perm) { - return ((Player) player).hasPermission("citizens." + perm); + return player.hasPermission("citizens." + perm); } public String[] getAllCommandModifiers(String command) { diff --git a/src/net/citizensnpcs/command/annotation/Requirements.java b/src/net/citizensnpcs/command/annotation/Requirements.java index 455bf6f0f..774fb5b35 100644 --- a/src/net/citizensnpcs/command/annotation/Requirements.java +++ b/src/net/citizensnpcs/command/annotation/Requirements.java @@ -6,7 +6,7 @@ import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) public @interface Requirements { - boolean requireSelected() default false; + boolean selected() default false; - boolean requireOwnership() default false; + boolean ownership() default false; } \ No newline at end of file diff --git a/src/net/citizensnpcs/command/command/AdminCommands.java b/src/net/citizensnpcs/command/command/AdminCommands.java new file mode 100644 index 000000000..9aa96cc2b --- /dev/null +++ b/src/net/citizensnpcs/command/command/AdminCommands.java @@ -0,0 +1,15 @@ +package net.citizensnpcs.command.command; + +import net.citizensnpcs.api.npc.trait.Character; +import net.citizensnpcs.api.npc.trait.DefaultInstanceFactory; +import net.citizensnpcs.npc.CitizensNPCManager; + +public class AdminCommands { + private final CitizensNPCManager npcManager; + private final DefaultInstanceFactory characterManager; + + public AdminCommands(CitizensNPCManager npcManager, DefaultInstanceFactory characterManager) { + this.npcManager = npcManager; + this.characterManager = characterManager; + } +} \ No newline at end of file diff --git a/src/net/citizensnpcs/command/command/NPCCommands.java b/src/net/citizensnpcs/command/command/NPCCommands.java index 8f3aed9db..dc4440b54 100644 --- a/src/net/citizensnpcs/command/command/NPCCommands.java +++ b/src/net/citizensnpcs/command/command/NPCCommands.java @@ -6,15 +6,17 @@ import org.bukkit.entity.Player; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.api.npc.trait.Character; import net.citizensnpcs.api.npc.trait.DefaultInstanceFactory; +import net.citizensnpcs.api.npc.trait.trait.Owner; import net.citizensnpcs.command.CommandContext; import net.citizensnpcs.command.annotation.Command; import net.citizensnpcs.command.annotation.Permission; +import net.citizensnpcs.command.annotation.Requirements; import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.CitizensNPCManager; import net.citizensnpcs.util.Messaging; import net.citizensnpcs.util.StringHelper; -// TODO add requirements +@Requirements(selected = true, ownership = true) public class NPCCommands { private final CitizensNPCManager npcManager; private final DefaultInstanceFactory characterManager; @@ -32,6 +34,7 @@ public class NPCCommands { min = 2, max = 3) @Permission("npc.create") + @Requirements public void createNPC(CommandContext args, Player player, NPC npc) { CitizensNPC create = (CitizensNPC) npcManager.createNPC(args.getString(1)); String msg = ChatColor.GREEN + "You created " + StringHelper.wrap(create.getName()); @@ -41,6 +44,10 @@ public class NPCCommands { } msg += " at your location."; + // Set the owner + create.addTrait(new Owner(player.getName())); + create.getTrait(Owner.class).setOwner(player.getName()); + create.spawn(player.getLocation()); npcManager.selectNPC(player, create); Messaging.send(player, msg); @@ -54,6 +61,7 @@ public class NPCCommands { min = 2, max = 2) @Permission("npc.spawn") + @Requirements(ownership = true) public void spawnNPC(CommandContext args, Player player, NPC npc) { CitizensNPC respawn = (CitizensNPC) npcManager.getNPC(args.getInteger(1)); if (respawn == null) { @@ -66,7 +74,8 @@ public class NPCCommands { Messaging.send(player, ChatColor.GREEN + "You respawned " + StringHelper.wrap(respawn.getName()) + " at your location."); } else - Messaging.sendError(player, respawn.getName() + " is already spawned at another location."); + Messaging.sendError(player, respawn.getName() + + " is already spawned at another location. Use '/npc tp' to teleport the NPC to your location."); } @Command( @@ -78,9 +87,8 @@ public class NPCCommands { max = 1) @Permission("npc.despawn") public void despawnNPC(CommandContext args, Player player, NPC npc) { - CitizensNPC despawn = (CitizensNPC) npcManager.getSelectedNPC(player); - despawn.despawn(); + npc.despawn(); npcManager.deselectNPC(player); - Messaging.send(player, ChatColor.GREEN + "You despawned " + StringHelper.wrap(despawn.getName()) + "."); + Messaging.send(player, ChatColor.GREEN + "You despawned " + StringHelper.wrap(npc.getName()) + "."); } } \ No newline at end of file diff --git a/src/net/citizensnpcs/npc/CitizensNPCManager.java b/src/net/citizensnpcs/npc/CitizensNPCManager.java index 629679a95..ec9410745 100644 --- a/src/net/citizensnpcs/npc/CitizensNPCManager.java +++ b/src/net/citizensnpcs/npc/CitizensNPCManager.java @@ -11,6 +11,7 @@ import net.citizensnpcs.api.CitizensAPI; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.api.npc.NPCManager; import net.citizensnpcs.api.npc.trait.Character; +import net.citizensnpcs.api.npc.trait.trait.Owner; import net.citizensnpcs.api.npc.trait.trait.SpawnLocation; import net.citizensnpcs.resources.lib.CraftNPC; import net.citizensnpcs.storage.Storage; @@ -160,7 +161,8 @@ public class CitizensNPCManager implements NPCManager { public boolean canSelectNPC(Player player, NPC npc) { if (player.hasPermission("citizens.npc.select")) - return player.getItemInHand().getTypeId() == Setting.SELECTION_ITEM.getInt(); + return player.getItemInHand().getTypeId() == Setting.SELECTION_ITEM.getInt() + && npc.getTrait(Owner.class).getOwner().equals(player.getName()); return false; }