Tutorial Make a minigame plugin!

Discussion in 'Resources' started by xTrollxDudex, Aug 15, 2013.

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

    xTrollxDudex

    ____________________ANNOUNCEMENTS_____________________
    [ANNOUNCEMENT]
    Assist will be helping out, check out his comment below to see what he will be doing. Please use Assist in order to receive his help, I get notifications automatically, you don't need to tahg me.

    [ANNOUNCEMENT] For anyone who doesn't know, here's the repository containing an example of how to implement this, it is PURELY just this code with only a few addons, such as a listener. This can be your base, this can be compiled, and this can be redistributed as long as you retain the original README.md is distributed in its original form.
    It can be found on GitHub here: https://github.com/AgentTroll/ArenaPVP
    Please note that I included something like this so you can learn, not copy code. You can copy it if you'd like, but that would defeat the entire purpose of it being put up.

    _______________________PRE NOTE_________________________

    First off, this project is for intermediate plugin developers with at least few months of plugin developing, but if you think you can take this up, great!

    ________________________ARENA__________________________

    Lets start off by creating your Arena object. Now what this does is store all the info about your arena. Lets call it Arena.class. In my examples, I'll be making a simple PVP arena plugin.

    The arena object is like a safe that keeps your stuff, except this time information. This can be constantly updated, and has multiple methods for getting various things specific to a single arena.

    PHP:
    import org.bukkit.Location;

    import java.util.ArrayList;
    import java.util.List;
    import java.util.UUID;

    // Also NOT thread safe
    public class Arena {
        
    // Individual arena info here

        // Ofc, this CAN'T be the ID COULD IT? (jk)
        
    private final int id;
        private final 
    Location spawn;
        private final List<
    UUIDplayers = new ArrayList<UUID>();

        public 
    Arena(Location spawnint id) {
            
    this.spawn spawn;
            
    this.id id;
        }

        
    // Getters

        
    public int getId() {
            return 
    this.id;
        }

        public List<
    UUIDgetPlayers() {
            return 
    this.players;
        }
    }
    _____________________ARENA MANAGER___________________

    Now since this is a small plugin, we will not need a manager, but since I have nothing better to do other than make this tutorial, I'll just put one in.

    The arena manager allows us to modify our arenas in bulk without having to get our arena objects every time, things that aren't specific to every single arena can go here.

    PHP:
    import org.bukkit.Bukkit;
    import org.bukkit.Location;
    import org.bukkit.entity.Player;
    import org.bukkit.inventory.ItemStack;

    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.UUID;

    // NOT THREAD SAFE!
    public class ArenaManager{
        
    // Singleton instance
        
    private static ArenaManager am;

        
    // Player data
        
    private final Map<UUIDLocationlocs = new HashMap<UUIDLocation>();
        private final 
    Map<UUIDItemStack[]> inv = new HashMap<UUIDItemStack[]>();
        private final 
    Map<UUIDItemStack[]> armor = new HashMap<UUIDItemStack[]>();

        
    // Hmm, what do you think THIS might be?
        
    private final List<Arenaarenas = new ArrayList<Arena>();
        
    // Keep track of the current arena ID
        
    private int arenaSize 0;

        private 
    ArenaManager() {} // Prevent instantiation

        // Singleton accessor with lazy initialization
        
    public static ArenaManager getManager() {
            if (
    this.am == null)
                
    this.am = new ArenaManager();

            return 
    this.am;
        }

        
    /**
         * Acquires an arena based on its ID number
         *
         * @param i the ID to search the arenas for
         * @return the arena possessing the specified ID
         */
        
    public Arena getArena(int i){
            for (
    Arena a this.arenas) {
                if (
    a.getId() == i) {
                    return 
    a;
                }
            }

            return 
    null// Not found
        
    }

        
    /**
         * Adds the player to an arena
         *
         * <p>Gets the arena by ID, checks that it exists,
         * and check the player isn't already in a game.</p>
         *
         * @param p the player to add
         * @param i the arena ID. A check will be done to ensure its validity.
         */
        
    public void addPlayer(Player pint i) {
            
    Arena a this.getArena(i);
            if (
    == null) {
                
    p.sendMessage("Invalid arena!");
                return;
            }

            if (
    this.isInGame(p)) {
                
    p.sendMessage("Cannot join more than 1 game!");
                return;
            }

            
    // Adds the player to the arena player list
            
    a.getPlayers().add(p.getUniqueId());

            
    // Save the inventory and armor
            
    inv.put(p.getUniqueId(), p.getInventory().getContents());
            
    armor.put(p.getUniqueId(), p.getInventory().getArmorContents());

            
    // Clear inventory and armor
            
    p.getInventory().setArmorContents(null);
            
    p.getInventory().clear();

            
    // Save the players's last location before joining,
            // then teleporting them to the arena spawn
            
    locs.put(p.getUniqueId(), p.getLocation());
            
    p.teleport(a.spawn);
        }

        
    /**
         * Removes the player from their current arena.
         *
         * <p>The player is allowed to not be in game, a check
         * will be performed to ensure the validity of the arena</p>
         *
         * @param p the player to remove from the arena
         */
        
    public void removePlayer(Player p) {
            
    Arena a null;

            
    // Searches each arena for the player
            
    for (Arena arena this.arenas) {
                if (
    arena.getPlayers().contains(p.getUniqueId()))
                    
    arena;
            }

            
    // Check arena validity
            
    if (== null) {
                
    p.sendMessage("Invalid operation!");
                return;
            }

            
    // Remove from arena player lost
            
    a.getPlayers().remove(p.getName());

            
    // Remove inventory acquired during the game
            
    p.getInventory().clear();
            
    p.getInventory().setArmorContents(null);

            
    // Restore inventory and armor
            
    p.getInventory().setContents(inv.get(p.getName()));
            
    p.getInventory().setArmorContents(armor.get(p.getName()));

            
    // Remove player data entries
            
    inv.remove(p.getUniqueId());
            
    armor.remove(p.getUniqueId());

            
    // Teleport to original location, remove it too
            
    p.teleport(locs.get(p.getUniqueId()));
            
    locs.remove(p.getUniqueId());
      
            
    // Heh, you're safe now :)
            
    p.setFireTicks(0);
        }

        
    /**
         * Creates an arena at the specified location
         *
         * @param l the location for arena spawn
         * @return the arena created
         */
        
    public Arena createArena(Location l) {       
            
    this.arenaSize++;

            
    Arena a = new Arena(lthis.arenaSize);
            
    this.arenas.add(a);

            return 
    a;
        }

        
    /**
         * Checks if the player is currently in an arena
         *
         * @param p the player to check
         * @return {@code true} if the player is in game
         */
        
    public boolean isInGame(Player p) {
            for (
    Arena a this.arenas) {
                if (
    a.getPlayers().contains(p.getUniqueId()))
                    return 
    true;
            }
            return 
    false;
        }

        
    // UTILITY METHODS

        
    public String serializeLoc(Location l){
            return 
    l.getWorld().getName() + "," l.getBlockX() + "," l.getBlockY() + "," l.getBlockZ();
        }

        public 
    Location deserializeLoc(String s){
            
    String[] st s.split(",");
            return new 
    Location(Bukkit.getWorld(st[0]), Integer.parseInt(st[1]), Integer.parseInt(st[2]), Integer.parseInt(st[3]));
        }
    }
    Whew! Done with the hard part.

    ____________IMPORTANT: Too many people have missed this!_________

    You will need a load() method to load up new instances of the Arena after the server has restarted/reloaded. You also may want to add a deleteArena() method and a method to persist the player inventory hashmaps.

    ___________________EXAMPLE USAGE________________________

    Now for some commands, lets assume I have my onCommand method already. I will have 3 commands: join, leave, and create.
    PHP:
    // Check the command name, if sender instanceof Player,
    // args length for join, blahblahblah

    Player p = (Playersender;

    // Create
    ArenaManager.getManager().createArena(p.getLocation());

    // Join
    int num 0;
    try {
        
    num Integer.parseInt(args[0]);
    } catch (
    NumberFormatException e) {
        
    p.sendMessage("Invalid arena ID");
        return;
    }
    ArenaManager.getManager().addPlayer(pnum);

    // Leave
    ArenaManager.getManager().removePlayer(p);
    Now, just finish the rest of the plugin, onEnable, disable, plugin.yml and you are set! Hope this helps, good luck on your plugin :D, all feedback much appreciated.

    Edit: The ArenaManager is not thread safe. This is because the access through a singleton can mean that the class instance can be NULL at any point in time within an asynchronous environment, see
    http://forums.bukkit.org/threads/de...-why-you-should-use-them.210620/#post-2184273
    For an overview on thread safety in singletons.

    _____________________HOW IT WORKS_______________________

    Now, here's why it works in a nutshell, so you can further add on or not need to refer back to this everytime you need arenas:
    Basically, we are using taking advantage of Object Oriented Programming, or OOP as commonly referred to. This is the idea that Java revolves around. By using OOP, you create things called "Objects" which can be stored on conventional lists and be used as wrappers, and utilities. Our very own Arena class is an Object, a "thing" store able in memory, and duplicable. We can create several Arena objects to handle each arena, each Object handles the arena for us so we don't have to have a bunch of fields or hashmaps relating each attribute to a specific arena.

    Our ArenaManager is a special type of Java class called a singleton, which is designed to have only ONE in memory at any given time, we can branch off of it and get methods and stuff with a single static method, which is very convenient as you do not want a bunch of methods amongst every singleton there is. This is useful to prevent a bunch of static methods from floating around and a bunch of redundancies with references and new instances of this object from being formed and bogging down. Plus, I hate using an extra line to declare and make the instance field of the manager look.

    Singletons are like the bridge between static and OOP, they are better performing than creating a new object each time, reducing overhead. Static methods are also better performing, so we can access our object. See http://ideone.com/ioErB6 to view a performance diff between using Singletons and creating a new object each time.

    _________________________FAQ____________________________

    Q: HELP ME! It's not working!
    A: No. I can provide general support and edits from my end, but if it's your own problem, then no. Feel free to correct me of any errors I may have made, but you shouldn't be putting any questions in the comments box. However, if you'd like to annoy me (and bump my thread) then it won't stop you :)

    Q: I need to add a feature...
    A: You've gotta be kidding me -_- this is a tutorial on how to make a MINIGAME plugin, the features are supposed to be added by yourself. I tried to make it as easy as possible, and if you need an example of what I'm talking about, for the hundredth time, PLEASE go to the repository I have linked.

    Q: How would I do this/that
    A: That would be a nice question for Plugin Development, not resources.

    Q: You're missing something
    A: Yeah, I may be missing something for a reason, read the comments and the description... Or suggest it...

    Q: All my arenas disappeared! How do I remove arenas?
    A: You will need to have a loadGames() method, check the repository. Also check the repository for a removeArena method.

    Q: Why numbers not arena names?
    A: Because IDs are used in most mini game plugins, I though most users would be used to this so I used it instead. If you would like arena names, check out the important links below. <3 JPG/Ultimate

    Q: I can't get it to work!
    A: Learn java, this is not a subject to be taken lightly as we are diving into efficiency, OOP, and more advanced concepts an ambitious dev will most likely get confused on.

    _________________________NOTES___________________________

    Most important links:
    Other stuff:
    I will try to add JavaDoc comments to the repository so people know exactly what I'm talking about

    Until next time. Anything advanced you'd like to know? PM me and try to persuade me to make a tutorial on it! (Immature response should be expected from me ;))

    Source of this post (In case you liked the headers, design and formatting, please give credit to me and me specifically for the design if used) edit: looks fine on an iPad, terrible on a computer screen:
    Code:
    [B]____________________ANNOUNCEMENTS_____________________
    [ANNOUNCEMENT][/B] [USER=90859549]Assist[/USER] will be helping out, check out his comment below to see what he will be doing. Please use [USER=90859549]Assist[/USER] in order to receive his help, I get notifications automatically, you don't need to tahg me.
    
    [B][ANNOUNCEMENT][/B] For anyone who doesn't know, here's the repository containing an example of how to implement this, it is PURELY just this code with only a few addons, such as a listener. This can be your base, this can be compiled, and this can be redistributed as long as you retain the original README.md is distributed in its original form.
    It can be found on GitHub here: [URL]https://github.com/AgentTroll/ArenaPVP[/URL]
    Please note that I included something like this so you can learn, not copy code. You can copy it if you'd like, but that would defeat the entire purpose of it being put up.
    
    [B]_______________________PRE NOTE_________________________[/B]
    
    First off, this project is for [B]intermediate plugin developers with at least few months of plugin developing[/B], but if you think you can take this up, great!
    
    [B]________________________ARENA__________________________[/B]
    
    Lets start off by creating your [B]Arena object[/B]. Now what this does is store all the info about your arena. Lets call it Arena.class. In my examples, I'll be making a simple PVP arena plugin.
    
    [U]The arena object is like a safe that keeps your stuff, except this time information. This can be constantly updated, and has multiple methods for getting various things specific to a single arena.[/U]
    
    [php]-snip-[/php]
    
    [B]_____________________ARENA MANAGER___________________[/B]
    
    Now since this is a small plugin, we will not need a manager, but since I have nothing better to do other than make this tutorial, I'll just put one in.
    
    [U]The arena manager allows us to modify our arenas in bulk without having to get our arena objects every time, things that aren't specific to every single arena can go here.[/U]
    
    [php]-snip-[/php]
    
    Whew! Done with the hard part.
    
    [B]____________IMPORTANT: Too many people have missed this!_________[/B]
    
    [U]You will need a load() method to load up new instances of the Arena after the server has restarted/reloaded. You also may want to add a deleteArena() method and a method to persist the player inventory hashmaps.[/U]
    
    [B]___________________EXAMPLE USAGE________________________[/B]
    
    Now for some commands,[U] lets assume I have my onCommand method [B]already[/B][/U]. I will have 3 commands: join, leave, and create.
    [php]-snip-[/php]
    
    Now, just finish the rest of the plugin, onEnable, disable, plugin.yml and you are set! Hope this helps, good luck on your plugin :D, all feedback much appreciated.
    
    Edit: The ArenaManager is [B]not thread safe[/B]. This is because the access through a singleton can mean that the class instance can be NULL at any point in time within an asynchronous environment, see
    [URL]http://forums.bukkit.org/threads/design-patterns-what-are-they-and-why-you-should-use-them.210620/#post-2184273[/URL]
    For an overview on thread safety in singletons.
    
    [B]_____________________HOW IT WORKS_______________________[/B]
    
    Now, here's why it works in a nutshell, so you can further add on or not need to refer back to this everytime you need arenas:
    Basically, we are [S]using[/S] taking advantage of Object Oriented Programming, or OOP as commonly referred to. This is the idea that Java revolves around. By using OOP, you create things called "Objects" which can be stored on conventional lists and be used as wrappers, and utilities. Our very own Arena class is an Object, a "thing" store able in memory, and duplicable. We can create several Arena objects to handle each arena, each Object handles the arena for us so we don't have to have a bunch of fields or hashmaps relating each attribute to a specific arena.
    
    Our ArenaManager is a special type of Java class called a singleton, which is designed to have only ONE in memory at any given time, we can branch off of it and get methods and stuff with a single static method, which is very convenient as you do not want a bunch of methods amongst every singleton there is. This is useful to prevent a bunch of static methods from floating around and a bunch of redundancies with references and new instances of this object from being formed and bogging down. Plus, I hate using an extra line to declare and make the instance field of the manager look.
    
    Singletons are like the bridge between static and OOP, they are better performing than creating a new object each time, reducing overhead. Static methods are also better performing, so we can access our object. See [URL]http://ideone.com/ioErB6[/URL] to view a performance diff between using Singletons and creating a new object each time.
    
    [B]_________________________FAQ____________________________[/B]
    
    [B]Q: HELP ME! It's not working![/B]
    A: No. I can provide general support and edits from my end, but if it's your own problem, then no. Feel free to correct me of any errors I may have made, but you shouldn't be putting any questions in the comments box. However, if you'd like to annoy me (and bump my thread) then it won't stop you :)
    
    [B]Q: I need to add a feature...[/B]
    A: You've gotta be kidding me -_- this is a tutorial on how to make a MINIGAME plugin, the features are supposed to be added by yourself. I tried to make it as easy as possible, and if you need an example of what I'm talking about, for the hundredth time, PLEASE go to the repository I have linked.
    
    [B]Q: How would I do this/that[/B]
    A: That would be a nice question for Plugin Development, not resources.
    
    [B]Q: You're missing something[/B]
    A: Yeah, I may be missing something for a reason, read the comments and the description... Or suggest it...
    
    [B]Q: All my arenas disappeared! How do I remove arenas?[/B]
    A: You will need to have a loadGames() method, check the repository. Also check the repository for a removeArena method.
    
    [B]Q: Why numbers not arena names?[/B]
    A: Because IDs are used in most mini game plugins, I though most users would be used to this so I used it instead. If you would like arena names, check out the important links below. <3 JPG/Ultimate
    
    [B]Q: I can't get it to work![/B]
    A: Learn java, this is not a subject to be taken lightly as we are diving into efficiency, OOP, and more advanced concepts an ambitious dev will most likely get confused on.
    
    [B]_________________________NOTES___________________________[/B]
    
    [B]Most important links:[/B]
    [LIST]
    [*]PLUGIN DEVELOPMENT SECTION(Go here for help): [URL]http://forums.bukkit.org/forums/plugin-development.5/[/URL]
    [*]REPOSITORY(Example is found here): [URL]https://github.com/AgentTroll/ArenaPVP[/URL]
    [*]OTHER TUTORIAL(By JPG2000, with arena names): [URL]http://forums.bukkit.org/threads/tut-create-a-minigame-with-arena-names.193908/[/URL]
    [*]YET ANOTHER TUTORIAL(By Ultimate_n00b, but he removed most of them :(): [URL]http://forums.bukkit.org/threads/tutorial-medium-arenas-and-managers.177467/[/URL]
    [/LIST]
    [B]Other stuff:[/B]
    I will try to add JavaDoc comments to the repository so people know exactly what I'm talking about
    
    Until next time. Anything advanced you'd like to know? PM me and try to persuade me to make a tutorial on it! (Immature response should be expected from me ;))
     
    Last edited by a moderator: Jan 17, 2015
  2. Offline

    artish1

    xTrollxDudex
    Good job on it. Hopefully now people will look at this thread instead of asking repetetively on how to make an Arena Type plugin.
     
  3. Offline

    xTrollxDudex

  4. Offline

    RoadNation

    This is really helpful except how would you add multiple spawn points?
     
  5. Offline

    xTrollxDudex

    RoadNation
    Have multiple spawn points contained inside the Arena class and when setting up, add them to a list, and make the player use a command to go through each spawn location in the arena and initialize with the player's current position.
     
  6. Offline

    RoadNation

    All I need is two spawn points which when players join a lobby, it counts 30 seconds then splits them equally into the red or blue team.
     
  7. Offline

    xTrollxDudex

    RoadNation
    Add another location field to the Arena class and create a command for setting the spawns. Then, I would increase a number everytime a player joins and see if it is even or odd, then place them on the corresponding teams. Reset the number everyone in a while.
     
  8. Offline

    xCyanide

    xTrollxDudex
    This is sooooo great since I never knew how to create arenas :) The way I made my mini-games was basically 1 game per server since I never knew how to create arenas
     
    xTrollxDudex likes this.
  9. Offline

    xTrollxDudex

  10. Offline

    phips99

    You made a mistake at this line:
    Code:java
    1. public int getId(){
    2. return this.id; //This Line
    3. }
    Because there is no ID item. You called it number. And can you please change the markdown or however the name is to Java.
     
  11. Offline

    xTrollxDudex

    phips99
    Alright. I personally prefer php until I get enough negative feedback to change it to java syntax :p
     
    KingFaris11 likes this.
  12. Offline

    phips99

    xTrollxDudex What IDE do you actually use?! Because there are so much simple errors which has to be fixed...
     
  13. Offline

    Kyle FYI

    Oh wow, I never known about this. Is it possible to make classes E.G PlayerMoveEvent etc... To do different things but stay the same in the real game?
     
  14. Offline

    xTrollxDudex

    phips99
    [you don't say face]an iPad! :D
    Kyle FYI
    Yes. But it depends on what you mean by "stay in the same game"
     
  15. Offline

    bloodless2010

    Could you possibly make a small example minigame? I'm sure it will help a lot of people.
     
  16. Offline

    xTrollxDudex

    bloodless2010
    I pretty much just did :p. Let me get on my computer later though.
     
  17. Offline

    Secriz

    Thanks, Good Job!
    This is really helpful!
     
    xTrollxDudex likes this.
  18. Offline

    Kyle FYI

    Okay, so I want to add something into my server. However when they are in the minigame/arena it gives them a different plugin. I was thinking I could do an array then just say if(players.contains(player.getName()){ kinda thing But was wondering if there is a better way to do this.
     
  19. Offline

    xTrollxDudex

    Secriz
    Thanks :D
    Kyle FYI
    I guess you could do that, but there could be an easier way if there are specifics to what you want to do
     
  20. Offline

    bloodless2010

    xTrollxDudex When are you gonna add an example version? Maybe a basic pvp minigame?
    Also, what if the server restarts? The players will lose their inventory and armor (because it will reset the hashmap)

    EDIT: Also, noticed some errors in the manager, it should be this:
    Code:java
    1. public class ArenaManager{
    2.  
    3. //make a new instance of the class
    4. public static ArenaManager a = new ArenaManager();
    5. //a few other fields
    6. Map<String, ItemStack[]> inv = new HashMap<String, ItemStack[]>();
    7. Map<String, ItemStack[]> armor = new HashMap<String, ItemStack[]>();
    8. //list of arenas
    9. List<Arena> arenas = new ArrayList<Arena>();
    10. int arenaSize = 0;
    11.  
    12. //we want to get an instance of the manager to work with it statically
    13. public static ArenaManager getManager(){
    14. return a;
    15. }
    16.  
    17. //get an Arena object from the list
    18. public Arena getArena(int i){
    19. for(Arena a : arenas){
    20. if(a.getId() == i) {
    21. return a;
    22. }
    23. }
    24. return null;
    25. }
    26.  
    27. //add players to the arena, save their inventory
    28. public void addPlayer(Player p, int i){
    29. Arena a = getArena(i);//get the arena you want to join
    30. if(a == null){//make sure it is not null
    31. p.sendMessage("Invalid arena!");
    32. return;
    33. }
    34.  
    35. a.getPlayers().add(p.getName());//add them to the arena list of players
    36. inv.put(p.getName(), p.getInventory().getContents());//save inventory
    37. armor.put(p.getName(), p.getInventory().getArmorContents());
    38. p.teleport(a.spawn);//teleport to the arena spawn
    39. }
    40.  
    41. //remove players
    42. public void removePlayer(Player p){
    43. Arena a = null;//make an arena
    44. for(Arena arena : arenas){
    45. if(arena.getPlayers().contains(p.getName())){
    46. a = arena;//if the arena has the player, the arena field would be the arena containing the player
    47. }
    48. //if none is found, the arena will be null
    49. }
    50. if(a == null || !a.getPlayers().contains(p.getName())){//make sure it is not null
    51. p.sendMessage("Invalid operation!");
    52. return;
    53. }
    54.  
    55. a.getPlayers().remove(p.getName());//remove from arena
    56. p.getInventory().setContents(inv.get(p.getName()));//restore inventory
    57. p.getInventory().setArmorContents(armor.get(p.getName()));
    58.  
    59. inv.remove(p.getName());//remove entries from hashmaps
    60. armor.remove(p.getName());
    61. //teleport them somewhere
    62. }
    63.  
    64. //create arena
    65. public void createArena(Location l){
    66. int num = arenaSize + 1;
    67. arenaSize++;
    68.  
    69. Arena a = new Arena(l, num);
    70. arenas.add(a);
    71. }
    72. }


    And ALSO, in the Arena class, you need to declare the num int, otherwise it will throw some errors :)
     
  21. Offline

    xTrollxDudex

  22. Offline

    bloodless2010

    xTrollxDudex Nice one, my internet cut off yesterday so I decided to go through it, found a little problem, you should clear a users inventory (considering you save it) before you enter the arena, because they can dupe with it (join arena with item, drop it, leave arena get it back and pickup one on floor :eek:) I also like the config stuff you added to that github, will help a lot! :D

    OH and possibly if you could add your config.yml that would be awesome xD

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Dec 6, 2015
  23. Offline

    xTrollxDudex

    bloodless2010
    Yeah, I'm not done with it, got worked up making battledome xD
     
  24. Offline

    bloodless2010

    @xTrollxDudexkay well I just needed the config because it throws a NPE because of loadGames :p I'm not quite sure how you set up the config though so thats why i asked
     
  25. Offline

    MattexFilms

  26. Offline

    xTrollxDudex

    MattexFilms
    Yeah I know, I'm a little busy on BattleDome atm
     
  27. Offline

    ejzz

    ChipDev, ilethz and dark_alex like this.
  28. Offline

    ilethz

    Woowww Thank you for making this tutorial! And it's no finish ... I going follow this topic but next thing teach how to make Spawn Points ... that can be awesome
    Thanks! Very Helpeful!
    ~ ilethz
     
    ChipDev likes this.
  29. I could continue this tutorial every so often, and add requested minigameish features to it, if xTrollxDudex grants me the permission to do so.

    Edit: What I mean by continuing this is either making a new thread, or posting them in the comments.
     
  30. Offline

    Connal

    xTrollxDudex Assist Does it matter if in the arena manager i get red underlines on arenas,locs,armor and inv? do i need to fix this or do i leave the underlines there?
     
Thread Status:
Not open for further replies.

Share This Page