The Mesmer Plugin - NPC

Discussion in 'Plugin Development' started by klofno1, Jul 11, 2013.

Thread Status:
Not open for further replies.
  1. Offline

    klofno1

    Hello, I was wondering if you could help with my plugin.
    I've got the basics but now I need to write some code which will spawn 2 clones which will attack your opponent while you turn invisible for a short time. This all should be triggered by left clicking.

    I will make a paypal donation when the plugin is finished.

    Code :

    Mesmer.java
    Code:java
    1. package me.JonathanNLD.Mesmer;
    2.  
    3. import java.util.logging.Logger;
    4.  
    5.  
    6. import org.bukkit.event.Listener;
    7. import org.bukkit.plugin.java.JavaPlugin;
    8.  
    9. public class Mesmer extends JavaPlugin {
    10. private static final Logger log = Logger.getLogger("Minecraft");
    11. public static Mesmer plugin;
    12.  
    13. @Override
    14. public void onEnable(){
    15. getServer().getPluginManager().registerEvents((Listener) new MesmerListener(), this);
    16. log.info("The Mesmer plugin has been enabled!");
    17. }
    18.  
    19. @Override
    20. public void onDisable(){
    21. log.info("The Mesmer plugin has been disabled!");
    22. }
    23.  
    24. }


    MesmerListener.java

    Code:java
    1. package me.JonathanNLD.Mesmer;
    2.  
    3. import org.bukkit.entity.Player;
    4. import org.bukkit.event.EventHandler;
    5. import org.bukkit.event.Listener;
    6. import org.bukkit.event.block.Action;
    7. import org.bukkit.event.player.PlayerInteractEvent;
    8.  
    9. public class MesmerListener implements Listener {
    10. @EventHandler
    11. public void onInteract(PlayerInteractEvent e){
    12. if(e.getAction() == Action.LEFT_CLICK_AIR || e.getAction() == Action.LEFT_CLICK_BLOCK){
    13. Player player = e.getPlayer();
    14. }
    15. }
    16. }
    17.  


    @Sessional
    @xTrollxDudex
     
  2. Offline

    xTrollxDudex

  3. Offline

    kreashenz

    klofno1 NPCLib would work, but I don't think it's updated for 1.6.1/1.6.2 so you'd have to wait.
     
  4. Offline

    timtower Administrator Administrator Moderator

  5. Offline

    klofno1

    Is it possible to spawn 2 modified Zombies? I'd Like them to not burn at daylight
     
  6. Offline

    xTrollxDudex

    klofno1
    On entitycombust event check if the entity is instanceof Zombie and if it is your zombie. Then, set its fire ticks to 0
     
  7. Offline

    klofno1

  8. Offline

    xTrollxDudex

    klofno1
    Most of them are offline. And yes, how may I serve you?
     
  9. Offline

    timtower Administrator Administrator Moderator

    klofno1 Don't work with mobs, don't ask me for this ;)
     
  10. Offline

    klofno1


    Well my main goal is to spawn 2 NPCs or 2 modifies zombies with the same skin as the player has, automatically attacking the opponent and explode when killed. And no burning in the sun.

    But first, spawn 2 not burning zombies and turn the spawner invisible for 2 seconds.

    @xTrollxDudex
     
  11. Offline

    Sessional

    klofno1 xTrollxDudex
    I don't know about setting skins of zombies - there is a way to modify what a player looks like through packet manipulation, but that is about as much as I know. Like I said you could send the packet for two false players through the server and really simulate them as a zombie entity, that may be easier.

    For starters I'd just make it spawn zombies and set their target to someone, and try to interrupt the packet that displays the player (therefore making it invisible)

    EDIT: hidePlayer(Player player)
    Hides a player from this player

    Player's apparently have a method that you can hide the player from another given player, you can use this to hide the player.
     
  12. Offline

    klofno1

    Sessional xTrollxDudex timtower

    I added 2 zombies to the game if I right click but for some reason, the right click air (yes I changed it to right) only works if I hold an item.

    And now I need to make those 2 zombies friendly otherwise they would attack me. Can anyone do that for me? I've got the code.

    My code :

    1
    Code:java
    1. package me.JonathanNLD.Mesmer;
    2.  
    3. import java.util.logging.Logger;
    4.  
    5.  
    6. import org.bukkit.event.Listener;
    7. import org.bukkit.plugin.java.JavaPlugin;
    8.  
    9. public class Mesmer extends JavaPlugin {
    10. private static final Logger log = Logger.getLogger("Minecraft");
    11. public static Mesmer plugin;
    12.  
    13. @Override
    14. public void onEnable(){
    15. getServer().getPluginManager().registerEvents((Listener) new MesmerListener(), this);
    16. log.info("The Mesmer plugin has been enabled!");
    17. }
    18.  
    19. @Override
    20. public void onDisable(){
    21. log.info("The Mesmer plugin has been disabled!");
    22. }
    23.  
    24. }


    Code:java
    1. package me.JonathanNLD.Mesmer;
    2.  
    3. import org.bukkit.Location;
    4. import org.bukkit.entity.Player;
    5. import org.bukkit.entity.Zombie;
    6. import org.bukkit.event.EventHandler;
    7. import org.bukkit.event.Listener;
    8. import org.bukkit.event.block.Action;
    9. import org.bukkit.event.player.PlayerInteractEvent;
    10. import org.bukkit.potion.PotionEffect;
    11. import org.bukkit.potion.PotionEffectType;
    12.  
    13. public class MesmerListener implements Listener {
    14.  
    15. @EventHandler
    16. public void onInteract(PlayerInteractEvent e){
    17. if(e.getAction() == (Action.RIGHT_CLICK_AIR) || e.getAction() == (Action.RIGHT_CLICK_BLOCK)){
    18. Player player = e.getPlayer();
    19. player.addPotionEffect(new PotionEffect(PotionEffectType.INVISIBILITY, 40, 2));} }
    20. private void spawnZombie(Location spawnLocation) {
    21. spawnLocation.getWorld().spawn(spawnLocation, Zombie.class);
    22. }
    23. @EventHandler
    24. public void onBlockRightClick(PlayerInteractEvent event) {
    25. if(event.getAction() == (Action.RIGHT_CLICK_BLOCK) || event.getAction() == (Action.RIGHT_CLICK_AIR)) {
    26. }
    27. this.spawnZombie(event.getClickedBlock().getLocation().add(0, 1, 0));
    28. this.spawnZombie(event.getClickedBlock().getLocation().add(2, 1, 0));
    29. }
    30. {
    31. }
    32.  
    33. }
    34.  


    The friendly mob code :

    Until now the problem is: The Zombie is a Zombie. And it will attack the player who spawned him. Because we don't like this, it's going to be changed in our spawnZombie method. Let's put the Zombie under our control, removing any default behaviors it had. It's like brain-washing (well.. bad example for a Zombie). But before we do that, we need a place to save all the zombie instances (so we can interact with them later). Add the following to our main class:

    Code:java
    1. private HashMap<Player,ControllableMob<Zombie>> zombieMap;
    2. Add the following to our onEnable method to initialize the map:
    3.  
    4. this.zombieMap = new HashMap<Player,ControllableMob<Zombie>>();
    5. Now, let's change the spawnZombie method:
    6.  
    7. private void spawnZombie(Player owner, Location spawnLocation) {
    8. Zombie zombie = spawnLocation.getWorld().spawn(spawnLocation, Zombie.class);
    9. ControllableMob<Zombie> controlledZombie = ControllableMobs.assign(zombie, true);
    10. this.zombieMap.put(owner, controlledZombie);
    11. }
    12. As you can see, we will bind each zombie to its owner. Therefore, we have to change the spawnZombie-call in onBlockRightClick to:
    13.  
    14. this.spawnZombie(event.getPlayer(), event.getClickedBlock().getLocation().add(0, 1, 0));

     
  13. Offline

    Sessional

    klofno1
    Right clicking the air should work, I'm not quite sure. Do some printing to see if the action even fires on a right click of air with nothing - you aren't doing anything, wouldn't surprise me if the server isn't notified of a useless rightclick like that.
    As for zombies, you have to over ride the update method or hook into an event (I'm not sure if one exists) and make sure any time it changes target the target CAN NOT BE the owner.
     
  14. Offline

    kreashenz

    I've worked with spawning NPC players, but theCodeBro could help you, I've seen some of his awesome customized mobs.
     
  15. Offline

    xTrollxDudex

    klofno1
    Well after 5 hours...
    Code:java
    1. private class NPCSpawner{
    2. //arraylist of npcs
    3. List<Utiliception> npcs = new ArrayList<Utiliception>();
    4. //constructor to spawn npc
    5. public NPCSpawner(Player p){
    6. //location to spawn
    7. Location l = p.getLocation()
    8. //make an id for the npc
    9. int id = 0
    10. //his name
    11. String s = p.getName();
    12. //field for our world
    13. WorldServer wS = ((CraftWorld) l.getWorld()).getHandle();
    14. //create the npc entity
    15. NPCthing t = new NPCthing(((CraftServer) Bukkit.getServer()).getServer(), wS, s, new PlayerInteractManager(wS));
    16. //put the npc here
    17. t.setPositionRotation(l.getX(), l.getY(), l.getZ(), l.getYaw(), l.getPitch());
    18. //add the entity to the world
    19. wS.addEntity(t);
    20. //return the called npc
    21. Utilityception u = NPCUtilities(t);
    22. //the owner.
    23. u.setSpawner(p);
    24. //add to arraylist
    25. ncps.add(id, u)
    26. return u;
    27. //increase the id by 1
    28. id++;
    29. if(id == 3000){
    30. is = 0
    31. }
    32. }
    33. //the npc entity
    34. private class NPCthing extends EntityPlayer{
    35. //default constructor
    36. public NPCthing(MinecraftServer se, World w, String s, PlayerInteractManager mng){
    37. //arguments in constructor for EntityPlayer.class
    38. super(se, w, s, mng);
    39. }
    40. }
    41. //utility classes
    42. private class NPCUtilities extends Utilityception{
    43. //default constructor
    44. public NPCUtilities(NPCthing thing){
    45. super(thing);
    46. }
    47. //swing like a boss!
    48. public void animateArmSwing() {
    49. ((WorldServer) getEntity().world).tracker.a(getEntity(), new Packet18ArmAnimation(getEntity(), 1));
    50. }
    51. //turn red like when damaged
    52. public void actAsHurt() {
    53. ((WorldServer) getEntity().world).tracker.a(getEntity(), new Packet18ArmAnimation(getEntity(), 2));
    54. }
    55. //set item in hand
    56. public void setItemInHand(Material m, short damage) {
    57. ((HumanEntity) getEntity().getBukkitEntity()).setItemInHand(new ItemStack(m, 1, damage));
    58. //remove the npc
    59. public void remove(id){
    60. if(ncp.get(id) != null){
    61. Utilityception ncp = ncps.get(0);
    62. ncps.remove(id);
    63. ncp.removeFromWorld();
    64. }
    65. }
    66. private class Utilityception{
    67. //entity declaration
    68. Entity ent;
    69. //owner
    70. Player p;
    71. //default constructor
    72. public Utilityception(Entity ent){
    73. this.ent = ent;
    74. }
    75. //get entity
    76. public Entity getEnt(){
    77. return ent;
    78. }
    79. //owner get/set
    80. public setSpawner(Player p){
    81. this.p = p;
    82. }
    83. public getSpawner(){
    84. return p;
    85. }
    86. }
    87. }

    Ill get to the navigation in the morning. Or tomorrow I might be busy today. You can still use that method above except the zombie might be a bit too easy xD
    The advantage of npcs are FULL control. Cons? Difficult and long to code in
    Zombies-Unpredictable, but has hard coded methods for it. Sorta....

    klofno1
    All right, copy and paste word for word my "library" above under the listener body but inside the listener class
    Code:java
    1. public class mylistener implements Listener{
    2. public void listenerlisten(stuff event){
    3. //main body
    4. }
    5. //my code would go here
    6. }

    Then in your listener BODY put after the if check
    Code:java
    1. NPCSpawner 1 = new NPCSpawner(event.getPlayer());
    2. NPCSpawner 2 = new NPCSpawner(event.getPlayer());
    3. //spawns 2 npcs

    How would you choose the target?

    *on a side note, do some additional if statements because player interact event is fired many times, most not in combat.

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jun 3, 2016
    chasechocolate likes this.
  16. Offline

    klofno1

    xTrollxDudex

    Do I have to remover everything I have written about the zombie? :)And what is the body exactly?

    It does not recognise ' NPCSpawner, NPCThing, Utilityception' and everything actually with NPC in fron of it

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jun 3, 2016
  17. Offline

    xTrollxDudex

    klofno1
    The body (in your case) is public void onInteract(PlayerInteractEvent e){ and everything within that method.

    Under it, you put the class I made up there(the code in the post starting with "well after 5 hours". Unless I'm missing something, if you put the my code under the body you should not have these errors.

    And about removing the zombies-you can decide to use that method or mine. But if you use mine then yes, you have to remove it.
     
  18. Offline

    klofno1


    Read your Pm it is not working

    xTrollxDudex kreashenz Sessional

    Hi now I've got this but it is filled with error

    Code:java
    1. package me.JonathanNLD.Mesmer;
    2.  
    3. import net.minecraft.server.v1_5_R3.EntityPlayer;
    4. import net.minecraft.server.v1_5_R3.MinecraftServer;
    5. import net.minecraft.server.v1_5_R3.Packet18ArmAnimation;
    6. import net.minecraft.server.v1_5_R3.PlayerInteractManager;
    7. import net.minecraft.server.v1_5_R3.WorldServer;
    8.  
    9. import org.bukkit.Bukkit;
    10. import org.bukkit.Location;
    11. import org.bukkit.Material;
    12. import org.bukkit.World;
    13. import org.bukkit.craftbukkit.v1_5_R3.CraftServer;
    14. import org.bukkit.craftbukkit.v1_5_R3.CraftWorld;
    15. import org.bukkit.entity.Entity;
    16. import org.bukkit.entity.HumanEntity;
    17. import org.bukkit.entity.Player;
    18. import org.bukkit.event.EventHandler;
    19. import org.bukkit.event.Listener;
    20. import org.bukkit.event.block.Action;
    21. import org.bukkit.event.player.PlayerInteractEvent;
    22. import org.bukkit.inventory.ItemStack;
    23. import org.bukkit.potion.PotionEffect;
    24. import org.bukkit.potion.PotionEffectType;
    25.  
    26. public class MesmerListener implements Listener {
    27. public void listenerlisten(stuff event){
    28. @EventHandler
    29. public void onInteract(PlayerInteractEvent e){
    30. if(e.getAction() == (Action.RIGHT_CLICK_AIR) || e.getAction() == (Action.RIGHT_CLICK_BLOCK)){
    31. NPCSpawner 1 = new NPCSpawner(event.getPlayer());
    32. NPCSpawner 2 = new NPCSpawner(event.getPlayer());
    33. Player player = e.getPlayer();
    34. player.addPotionEffect(new PotionEffect(PotionEffectType.INVISIBILITY, 40, 2));}
    35. }
    36.  
    37. private class NPCSpawner{
    38. List<Utiliception> npcs = new ArrayList<Utiliception>();
    39. public NPCSpawner(Player p){
    40. Location l = p.getLocation()
    41. int id = 0
    42. String s = p.getName();
    43. WorldServer wS = ((CraftWorld) l.getWorld()).getHandle();
    44. NPCthing t = new NPCthing(((CraftServer) Bukkit.getServer()).getServer(), wS, s, new PlayerInteractManager(wS));
    45. t.setPositionRotation(l.getX(), l.getY(), l.getZ(), l.getYaw(), l.getPitch());
    46. wS.addEntity(t);
    47. Utilityception u = NPCUtilities(t);
    48. u.setSpawner(p);
    49. ncps.add(id, u)
    50. return u;
    51. id++;
    52. if(id == 3000){
    53. is = 0
    54. }
    55. }
    56. private class NPCthing extends EntityPlayer{
    57. public NPCthing(MinecraftServer se, World w, String s, PlayerInteractManager mng){
    58. super(se, w, s, mng);
    59. }
    60. }
    61. private class NPCUtilities extends Utilityception{
    62. public NPCUtilities(NPCthing thing){
    63. super(thing);
    64. }
    65. public void animateArmSwing() {
    66. ((WorldServer) getEntity().world).tracker.a(getEntity(), new Packet18ArmAnimation(getEntity(), 1));
    67. }
    68. public void actAsHurt() {
    69. ((WorldServer) getEntity().world).tracker.a(getEntity(), new Packet18ArmAnimation(getEntity(), 2));
    70. }
    71. public void setItemInHand(Material m, short damage) {
    72. ((HumanEntity) getEntity().getBukkitEntity()).setItemInHand(new ItemStack(m, 1, damage));
    73. public void remove(id){
    74. if(ncp.get(id) != null){
    75. Utilityception ncp = ncps.get(0);
    76. ncps.remove(id);
    77. ncp.removeFromWorld();
    78. }
    79. }
    80. private class Utilityception{
    81. Entity ent;
    82. Player p;
    83. public Utilityception(Entity ent){
    84. this.ent = ent;
    85. }
    86. public Entity getEnt(){
    87. return ent;
    88. }
    89. public setSpawner(Player p){
    90. this.p = p;
    91. }
    92. public getSpawner(){
    93. return p;
    94. }
    95. }
    96. }
    97. }
    98.  
    99. }
    100. }
    101.  
    102.  
    103. {
    104. }
    105.  
    106. }
    107.  
    108.  
    109.  


    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jun 3, 2016
  19. Offline

    kreashenz

    klofno1 What are you trying to do.. You've got like.. 10+ methods in a method.
     
  20. Offline

    Sessional

    klofno1
    If I were you I would avoid inner classes. Also, embedded methods don't work. Fix your braces, they don't match up where they need to be.
     
  21. Offline

    klofno1

    Sessional kreashenz
    Thank you but now you have told me what is wrong but not how to fix it and what is right
     
  22. Offline

    xTrollxDudex

  23. Offline

    Sessional

    klofno1
    You don't have closing braces on your first method, because of this the WHOLE entire file is formatted wrong and will not compile. Go through and make sure that for every opening brace you have a closing one, and do try to get it in the right spot...

    EDIT: I take that back - it's just formatted very poorly, missed a few here and there. Lemme look closer...

    first things first: take out the inner classes - all those private classes inside the public one and move them to a separate file - it will make it easier to read and diagnose the problem. Repost all the files and even a few errors would be nice to figure out what is wrong.
     
  24. Offline

    klofno1

    I have decided to take a step back because NPCs are way too advanced for a beginner. I'll start with zombie clones and when I am more advanced I well edit the plugin to max functionality. What I am now trying to do is :

    1. Make zombies friendly to the spawner
    2. Stop zombies from burning in the sun
    3. spawning/invisibilty delay (once every 10 seconds)
    (4). let zombies attack other hostile creatures (for PvE battles)

    Do you know how to do that? or one of them
    Ill place the code in a sec!

    Edit :

    The source code
    MAIN (Main.java)
    Code:java
    1. package me.JonathanNLD.GuildWars2;
    2.  
    3. import java.util.logging.Logger;
    4. import org.bukkit.event.Listener;
    5. import org.bukkit.plugin.java.JavaPlugin;
    6.  
    7. public class Main extends JavaPlugin {
    8. private static final Logger log = Logger.getLogger("Minecraft");
    9. public static Main plugin;
    10.  
    11. public void onEnable(){
    12. getServer().getPluginManager().registerEvents((Listener) new GuildWars2Listener(), this);
    13. log.info("The Guild Wars 2 plugin has been enabled!");
    14. }
    15.  
    16. public void onDisable(){
    17. log.info("The Guild Wars 2 plugin has been disabled!");
    18. }
    19. }


    LISTENER (GuildWars2Listener.java)
    Code:java
    1. package me.JonathanNLD.GuildWars2;
    2.  
    3. import org.bukkit.Location;
    4. import org.bukkit.Material;
    5. import org.bukkit.entity.Player;
    6. import org.bukkit.entity.Zombie;
    7. import org.bukkit.event.EventHandler;
    8. import org.bukkit.event.Listener;
    9. import org.bukkit.event.block.Action;
    10. import org.bukkit.event.player.PlayerInteractEvent;
    11. import org.bukkit.potion.PotionEffect;
    12. import org.bukkit.potion.PotionEffectType;
    13.  
    14. public class GuildWars2Listener implements Listener {
    15. private void spawnZombie(Location spawnLocation) {
    16. spawnLocation.getWorld().spawn(spawnLocation, Zombie.class);
    17. }
    18.  
    19. @EventHandler
    20. public void onInteract(PlayerInteractEvent e){
    21. if(e.getPlayer().getItemInHand().getType()==Material.IRON_SWORD)
    22. if(e.getAction() == (Action.RIGHT_CLICK_BLOCK)){
    23. Player player = e.getPlayer();
    24. this.spawnZombie(e.getClickedBlock().getLocation().add(0, 3, 0));
    25. this.spawnZombie(e.getClickedBlock().getLocation().add(2, 3, 0));
    26. player.sendMessage("You vanished and left behind a clone!");
    27. player.addPotionEffect(new PotionEffect(PotionEffectType.INVISIBILITY, 40, 2));}
    28. {
    29. }
    30.  
    31. }
    32. }


    @xTrollxDudex
     
  25. Offline

    xTrollxDudex

    klofno1
    That did waste some time...
    1. you have to have a specified target somehow.
    Code:java
    1. Zombie zombie = (Zombie) player.getWorld.spawnEntity(player.getLocation(), EntityType.ZOMBIE);
    2. Entity e = (Entity) zombie;
    3.  
    4. List<Entity> entities = e.getNearbyEntities(16, 16, 16);
    5. entities.remove(player);
    6.  
    7. Navigation nav = ((EntityInsentient)((CraftEntity) e).getHandle()).getNavigation();
    8. Entity target = entities.get(0);
    9. Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable(){
    10.  
    11. @Override
    12. public void run(){
    13.  
    14. if(target.isAlive() == true){
    15. Location loc = target.getLocation();
    16. nav.a(loc.getX(), loc.getY(), loc.getZ(), 0.3f);
    17. }else if(target.isAlive() == false){
    18. this.cancel();
    19. }
    20. }, 0L, 1L);

    2. Add a listener for entitycombust event and set fireticks to 0 if it is a zombie/is the zombie in the code
    3: I don't get this one
    4. The code above allows this!

    Sessional wait are lines 5-9 calculated when you call them or are they auto updated?
     
  26. Offline

    klofno1

    xTrollxDudex No you did not waste your time, I will be using it but in the future for my plugin without a doubt. First I need to learn the basic, then the more advanced stuff like you already know :).

    Btw, could you tell me + explanation where to add this code?

    xTrollxDudex And explanation for 3 = I can turn myself invisible and spawn clones instantly, so I need some kind of delay which stops the Mesmer from casting that spell instantly. A 10 second delay.

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jun 3, 2016
  27. Offline

    xTrollxDudex

    klofno1
    You put the code where you want to spawn the zombie. This can be oncommand or the original player interact event(line 24 of the listener).

    Code:java
    1. Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable(){
    2.  
    3. @Override
    4. public void run(){
    5. //what you want delayed goes here
    6. }
    7.  
    8. //delay in ticks. Each second is 20 ticks so 10 seconds is 20*10 or 200
    9. }, 200L);


    EDIT: don't forget to declare the plugin variable at the top of the listener for the delayed task to work
    Code:java
    1. Main plugin;
    2. public GuildWars2Listener(Main plugin){
    3. this.plugin = plugin;
    4. }
     
  28. Offline

    klofno1

    xTrollxDudex I've got some errors!
    No autofixes available, the ones which were available have already been used!

    [​IMG]
     
  29. Offline

    xTrollxDudex

    klofno1
    Awesome! A screenshot
    1. Rename it. Change from e to entity it won't interfere with e as in event
    2. Import that. It's java.util.ArrayList
    3. Import that. It's org.bukkit.v1_6_R1.craftbukkit.CraftEntity and org.bukkit.v1_6_R1.craftbukkit.CraftInsentient unless you still are building against 1_5_R3
    4. missing brace. Add one more in between the line with 0L, 1L and the brace after this.cancel();
    5. Remove the middle brace. There are 3 of them at the end
     
  30. Offline

    klofno1

    xTrollxDudex
    1. Add extra }
    2. remove }

    if I touch one of those brackets the 'if.target is alive == etc freaks out.
    [​IMG]
     
Thread Status:
Not open for further replies.

Share This Page