Wizards is a Domination game.
Select your Wizard class and capture the map objectives to score.

[img] tag
  • Multi-Arena and BungeeCord support.
  • Achievements.
  • SQLite and MySQL support.
  • Extremely configurable.
    • Signs, Scoreboard, messages, options and more.
  • Save and restore player inventory, levels and more.
  • API with Game events.
  • Custom items.
  • Leveling Up/Ranking System.
  • Game top Kills.
  • Holographic Leaderboards.
    • Top Damage, Heal, Kills and Wins.
  • Reward System.
  • Class Script system.
  • Kits or Classes.
  • Kill-Assist system.
  • Avoid constant draws.
  • Very easy to setup.
  • Mounts.
[img] tag
Bugs
If you have any issues, report via discussion or private message. Do not use the rating area to report bugs or request features. Please go to discussion.

Default Game System
If you don't want to have skills and want to enable a kit system this is 100% possible, this system will be available soon with more gamemodes.

Dependencies
Wizards can run all systems by himself, however, you can install Holographic Displays to enable Leaderboards and Vault to work with global economy.

You can also install ItemBridge to hook with QualityArmory. You should be able to use CrackShot without ItemBridge.

PlaceholderAPI support
The following placeholders are available, they are self explanatory:

%wizards_wins%
%wizards_gamesplayed%
%wizards_losses%
%wizards_kills%
%wizards_assists%
%wizards_deaths%
%wizards_damagecaused%
%wizards_healingdone%
%wizards_balance%

-- Arena Placeholders --
%wizards_arena_players_{arena}%
%wizards_arena_max_players_{arena}%
%wizards_arena_min_xplayers_{arena}%
%wizards_arena_status_{arena}%
%wizards_points-to-win_{arena}%

Usage example (DeluxeMenus):
[img] tag

An extra placeholder is %wizards_team_color% that returns player's team color, if in game. This was added in case you need to use a third party nametag plugin.

[img] tag

Arena setup
    Required permission: wizards.setup
    First of all set global spawn using /wizards setgspawn
  • Create your arena - /wizards create <name>.
  • Add spawn - /wizards setLocation <name> <location>
    • Locations: BLUE_SPAWN, RED_SPAWN, LOBBY.
  • Add arena objective - /wizards setObjective <name> <objective>
    • Objectives: A, B, C.
    • Objectives are a 3x3 area with e beacon on center of the objective (center set by this command)
  • Set min players - /wizards setMinPlayers <name> <amount>
  • Set max players - /wizards setMaxPlayers <name> <amount>
  • (Optional) Set arena bounds /wizards setBounds <arena>
    • Use the tool /wizards wand to select arena corners.
    • It will prevent players from leaving the arena while in-game.
  • Finish setup and create game - /wizards finish <name>
Objectives are a 3x3 area with e beacon on center.

Sign format:
  • [Wizards]
  • join
  • ArenaName
Video:




Leaderboards
You need HolographicDisplays to work with Leaderboards, just use the placeholder:
  • {wizards_wins_number}
    • e.g: {wizards_wins_1} will return player with most wins.
    • {wizards_wins_2} etc
  • {wizards_kills_number}
    • e.g: {wizards_kills_1} will return player with most checkpoints
    • {wizards_kills_2} etc
Placeholders:
  • {wizards_kills_NUMBER}
    • %kills% from player.
  • {wizards_wins_NUMBER}
    • %wins% from player.
  • {wizards_damage_NUMBER}
    • %damage% from player.
  • {wizards_healing_NUMBER}
    • %healing% from player.

[img] tag

Command: wizards
Aliases: wzds, wrz.
  • /wizards join <arena> - no permission.
  • /wizards leave - no permission.
  • /wizards stats - no permission.
Manager commands
  • /wizards setgspawn - wizards.admin
  • /wizards start <arena> - wizads.moderator/sr.admin
  • /wizards stop <arena> - wizads.moderator/sr.admin
  • /wizards reload - wizards.admin
    • SAVES all config files.
Others:
  • /wizards coins set/add/remve <player> <amount>
    • Permission: wizards.admin
    • Updates player balance, command will not work with Vault support enabled.
  • /wizards update <player>
    • Permission: wizards.admin
    • Sends a update to database.
  • /wizards updateLeaderboard
    • Permission: wizards.admin
    • Updates the Leaderboard.
  • /wizards portals
    • Permission: wizards.admin
    • Manage arena portals (see below)
  • /wizards reloadClasses
    • Permission: wizards.admin
    • Will reload all classes files, you can now modify a value then use this command to apply the changes.
      • This command reloads all events, so it cannot be used if there is a game running.
  • /wizards kits
    • Permission: wizards.manager.kits
    • /wizards kits create <name> (price) (needsPerm) (perm) (display-item)
      • () are for optional arguments, it has default values: 1000, false, kits.{name}, random item with kit's name.
      • I'd recommend you to manully modify your kit in kits file then using kits reload command.
    • /wizards kits delete <name>
      • Deletes a kit from kits.yml.
    • /wizards kits reload
      • Reloads all kits.

[img] tag

Classes
The main objective of all classes are the same - shoot a spell or projectile to cause damage, you will decide everything else of the class.

[img] tag

There are 9 classes on v3.0, suggestions for classes are appreciated.
  • Pyromancer
    • Fires a spell of Fire, you can modify everything else at pyromancer.yml.
  • Aquamancer
    • Fires a spell of water, you can modify everything else at aquamancer.yml.
    • Can heal allies, you can set the amount and area of healing.
  • Herobrine
    • Fires a particle spell that will strike and bump up the damage, you can modify everything else at herobrine.yml.
  • Wither
    • Fires a wither skull, you can modify everything else at wither.yml.
  • Enderman
    • Fires a ender spell and has a RECALL ability.
  • Mage
    • Fires a spell that will follow players until collide or until reaches the travel-limit.
    • [img] tag
  • Fighter
    • Loads a single-target super punch.
    • [img] tag
  • Crusader
    • Creates a temporary shield for you and to nearby teammates.[img] tag
  • Shaman
    • Creates a tornado pushing players and applying slow.
  • Arcanist NEW!
    • Shots a instant spell that will cause area damage if impacts on a enemy.
You can modify everything of all classes, the damage, explosion area and more.


display-name: 'Aquamancer'
description:
- '&9Aquamancer'
- ' '
- '&7Shots a spell of Aqua'
- '&7causing damage to enimies and'
- '&7healing teammates.'
price: 500
mana-cost-per-use: 25
mana-per-hit: 2
max-distance: 80
damage: 2.5
damage-area: 4.0
explosion-radius: 2.5
display-item: 'IRON_AXE: 1'
weapon: 'IRON_AXE : 1 : name:&bHealing'
helmet: 'IRON_HELMET : 1'
chestplate: 'IRON_CHESTPLATE : 1'
leggings: 'IRON_LEGGINGS : 1'
boots: 'IRON_BOOTS : 1'
scripts: []
target-scripts: []

Optional: Class Permission
By setting Options.Use-Class-Permission-As-Owned to true, players with the class permission will be able to select the class without needing to purchase it.

If Options.Use-Class-Permission-As-Owned is set to false, players will need the permission to purchase the class.

For that, make sure to add a 'permission' line to the class file, for example:
[img] tag

3.0 and above
With version 3.0 or above you can give items to players using Classes.

display-name: 'Herobrine'
description:
- '&9Herobrine'
- ' '
- '&7Shots a spell of Lightning'
- '&7causing with &c3.0❤ &7of damage.'
price: 1000
mana-cost-per-use: 35
mana-per-hit: 1
max-distance: 80
damage: 6.0
damage-area: 5.0
explosion-radius: 4.5
weapon: 'GOLDEN_AXE : 1 : name:&bStrike'
helmet: 'IRON_HELMET : 1'
chestplate: 'IRON_CHESTPLATE : 1'
leggings: 'IRON_LEGGINGS : 1'
boots: 'IRON_BOOTS : 1'
scripts: []
target-scripts: []
items:
  - 'ARROW : 64'

So just add
items:
  - 'ITEM : AMOUNT'

Full tutorial on items can be found in pyromancer.yml at your classes folder.

(API) Creating your own Class
A quick note on this, you cannot use the class reload command when using the API to inject a new class, it will not register the class injected via API. Create your own reload command and access the API to manually reload and register your class again.

To create your own class, simple create a new Class that extends WizardClass and register on your onEnable using

WizardClasses.injectClass(Class<? extends WizardClass> clazz, String name, String fileName);

Where Class<? extends WizardClass> will be your Class, name the (original) name of the class and fileName the file name that will be generated.

After that, you need to manually add your class to the shop.yml.

Example:

import com.floodeer.wizards.Wizards;
import com.floodeer.wizards.game.GamePlayer;
import com.floodeer.wizards.game.classes.WizardClass;
import com.floodeer.wizards.particles.ParticleEffect;
import com.floodeer.wizards.script.ScriptManager;
import com.floodeer.wizards.util.ItemFactory;
import com.floodeer.wizards.util.LocationUtils;
import com.floodeer.wizards.util.Util;
import org.bukkit.Location;
import org.bukkit.entity.Player;

import java.io.File;

public class Reaper extends WizardClass  {

    public Reaper(String name, File configFile) {
        super(name, configFile);
    }

    @Override
    public void give(Player player) {
        player.getInventory().addItem(ItemFactory.unbreakable(getWeapon()));
        player.getInventory().setHelmet(ItemFactory.unbreakable(getHelmet()));
        player.getInventory().setChestplate(ItemFactory.unbreakable(getChesplate()));
        player.getInventory().setLeggings(ItemFactory.unbreakable(getLeggings()));
        player.getInventory().setBoots(ItemFactory.unbreakable(getBoots()));
    }

    @Override
    public void onInteract(Player player) {
        GamePlayer gp = GamePlayer.get(player.getUniqueId());
        if (gp.getMana() < getManaCost()) { //Mana Manager
            if(!Wizards.get().getMessages().enoughMana.isEmpty())
                gp.getP().sendMessage(Util.colorString(Wizards.get().getMessages().enoughMana.replaceAll("%prefix%", Wizards.get().getMessages().prefix)));
            if(!Wizards.get().getOptions().enoughMana.isEmpty())
                Util.playSound(gp.getP(), Wizards.get().getOptions().enoughMana);
        } else {
            ScriptManager.run(gp, getScript()); //Script system, if enabled

            gp.setMana(gp.getMana() - getManaCost()); //Remove player mana

            //Skill start
            Location location = player.getLocation();

            //Skill Particle Effect
            LocationUtils.getCircle(location.clone().add(0.0D, 1.0D, 0.0D), 5.0D, 40).forEach(l -> {
                ParticleEffect.CRIT_MAGIC.display(0.0F, 0.0F, 0.0F, 0.1F, 3, l, 126);
                ParticleEffect.CLOUD.display(0.0F, 0.0F, 0.0F, 0.01F, 1, l, 126);
            });

            //Apply skill damage and effects
            Util.filterAreaDamage(player, getDamage(), location, getAreaDamage(), false, Wizards.get().getMessages().magic).forEach(target -> {
                ScriptManager.run(gp, GamePlayer.get(target), getTargetScript());
                GamePlayer targetgp = GamePlayer.get(target);
                targetgp.setMana(0);
                target.sendMessage(Util.colorString("&cYour mana has been devoured by &4" + player.getName() + "&c!"));
            });

            //Skill end
        }
    }
}

To tell Wizards that you have a class to add, add the following code to your onEnable

 WizardClasses.injectClass(Reaper.class, "Reaper", "reaper.yml");

Where Reaper is the class that extends WizardClass, Reaper is the Original name and reaper.yml the class file name that will be generated so you can change it however you want.

After creating the class, you need to manually add to the shop.yml;
reaper:
  item: 'DIAMOND_SWORD : 1'
  name: '&6Reaper Class'
  lore:
    - '&7Removes mana from'
    - '&7nearby players.'
  slot: 23

Where's everything you need from WizardClass


  public String getOriginalName();

    public String getDisplayName();

    public List<String> getDescription();

    public int getPrice();

    public int getMaxDistance();

    public int getManaCost();

    public ItemStack getHelmet();

    public ItemStack getChesplate();

    public ItemStack getLeggings();

    public ItemStack getBoots();

    public ItemStack getWeapon();

    public double getDamage();

    public double getAreaDamage();

    public double getExplosionRadius();

    public List<String> getScript();

    public List<String> getTargetScript();

    public int getManaPerHit();

    public Collection<PotionEffect> getEffects();

    public List<ItemStack> getItems();
    

Everything from here is taken from your class.yml, you can, of course, ignore all of that and create the class however you want without interacting with the class file.

That's it! There was no plan to let you add Classes via the API, but since it was possible to make it work... why not.

Kits
You can use Kits instead of classes.

Enabling Use-Kits-Instead-Of-Classes in options.yml will disable all Game Effects caused by the Classes
  • No more speed and jump.
  • No more custom PvP damage.
  • No more Classes Shop, only kits.
  • No more custom Healing potions.
  • No more double-jumps.
A kit.yml file will be created and you will be able to add your kits.
  kits.yml

Wizards Gamemodes
Some users are using Wizards as a TDM Gamemode and/or playing with Guns, this is totally possible! You can disable all game objectives and set points per kill.

For the default Domination gamemode, you can check those options below.
[img] tag

Examples
  • Capture-Rate: Default > 1
    • Decrease to add capture time.
  • Capture-Max: Default > 24
    • Increase to add capture time.
  • Unbreakable-Armor
  • Enable or disable explosions.
  • Modify points per kill, points per second, game ticks that change game events, hand-damage, weapon damage and more.
  • A lot more! Check options.yml below.

Scripts
Wizards can run a "script" system, called when players use the skill and a target gets hurt by a skill.

You need to set "JS-Engine" to true in options.yml to run Scripts.

Example 1 - sending a message to the player who used the skill.
scripts:
- "player.sendMessage(\"You used your skill.\");"

Example 2 - setting target (if valid) on fire for 3 seconds.
target-scripts:
- "target.setFireTicks(60)"

Supported methods
  • Bukkit#
  • Player#
  • Wizard#
    • "wizard.explode(target);" - For target type only, will generate a explosion.
    • "wizard.damage(target, amount);" - For target and player, will cause random damage.
    • "wizard.heal(target, amount);" - For target and player, will heal.
  • Wizards API (see below).
Supported parameters
  • player, gameplayer, api, wizard, server, ally, allyplayer, target, targetplayer
  • GamePlayer (gameplayer, gametarget and gameally) refers to Wizard's player class, you can modify in-game and database data with this class.
You cannot summon new objects with Scripts.

Updates & Timer

Options:
 Game:
  Mana-Update-Type: '75'

This means that the update type is set to TICK_2 (1 mana every0,075s)

Update division

SEC = 1000 (1s)
FAST = 500 (0,5s)
FASTER = 250 (0,25s)
FASTEST = 125 (0,125s)
TICKS_2 = 75 (0,075s)
TICK = 49 (0,049s)

Leveling Up System (BETA)
Disabled by default. Enable it at options.yml.

When enabled, a new file will be generated, levels.yml, with this file you will be able to add your levels, rewards and more:


Levels:
  Level-1: #Do not change the Level-1 section
    exp: 0 #Required Exp
    display-name: "&6Level 1" #Display name in level up message
    prefix: "&6[1]" #Chat prefix, if enabled, hooked to PAPI
    commands-to-execute: [] #Commands to execute when reaching the level
    level-up-message: [] #Message to display
  Level-2: #From now on you can change
    exp: 10
    display-name: "&6Level 2"
    prefix: "&6[2]"
    commands-to-execute:
      - wizards coins add %player% 100
    level-up-message:
      - '&7&m--------------&7[&6&lWIZARDS&7]&m--------------'
      - ''
      - '&a&lLevel Up &e&l%level%'
      - ''
      - '&9Next level: &b%next_level% &7(%until_next_level%/%next_level_exp% EXP)'
      - ''
      - '&7&m-------------------------------------'
  Level-3:
    exp: 20
    display-name: "&6Level 3"
    prefix: "&6[3]"
    commands-to-execute:
      - wizards coins add %player% 100
    level-up-message:
      - '&7&m--------------&7[&6&lWIZARDS&7]&m--------------'
      - ''
      - '&a&lLevel Up &e&l%level%'
      - ''
      - '&9Next level: &b%next_level% &7(%until_next_level%/%next_level_exp% EXP)'
      - ''
      - '&7&m-------------------------------------'

Please do not change Level-1 as it is the default Database value, you can just use display-name to not show "Level-1" in game, the section name is just a backend thing.

Note that the reload command will not apply changes for levels.yml ATM.

How to Earn Exp
Players can earn Exp by playing, kills/assists, wins cand capturing points, check options.yml and you will see a new Exp section to modify.

Give Exp to old players

Set Options.Update-Levels to true in options.yml, when a player joins the server after this update, players will get exp based on wins, games played and kills/assists.

Note that some exp methods (like point captured) is not stored to calculate.

What if I don't want to use Leveling system?
Just don't enable the option. Everything will work just fine without it.

Scoreboard

You can fully customize the Scoreboard.
Players that are not in a game/in same game (or no playing) will not see colored tablist for teams.
[img] tag
[img] tag
  • In-Game Placeholder list:
    • %kit% - Player kit or class.
    • %formatted_time% - Game time in mm:ss
    • %kills% - Game Kills
    • %deaths% - Game Deaths
    • %red_points% - Red points
    • %blue_points% - Blue points
    • %red_points_per_second% - Red points per second
    • %blue_points_per_second% - Blue points per second
    • %objectives% - Will replace all next lines with the amount of objectives you have.
  • Lobby placeholders list:
    • %players% - Current number of players
    • %maxplayers% - Max amount of players
    • %minplayers% - Min amount of players
    • %mapname% - The map name
    • %timer% - Starting timer
    • %state% and %capitalize_state% - Game state
    • %wins% - Player wins stat
    • %games_played% - Player Games played stat
    • %balance% - Player balance
    • %kit% - Player kit or class.
Avoid Draw System
To avoid constant draws you can enable the avoid-draw system.

If game reaches max time will end in a Draw, however, with avoid-draw the game will check the team with most kills and this team will win.

If both teams has same amount of kills the game will draw - A overtime system was tested but not implemented.

Teams
There are two teams, so the amount of players per team is the division of max players per game by 2, make sure to set the max of players multiples of 2.

If the team size is smaller than game player amount divided by 2 the player will not be able to join.

Portals
This is a game mechanic to be used with Elytra, it will give you a velocity boost.
[img] tag

Some information about  the portals:
  • Each portal can have different particle, velocity and more.
  • Portals are saved in arena folder.
    • They are not saved in arena file due dynamic access, arena file should not be constantly accessed.
    • Each portal will have a different name in arena file so you can indentify them.
Here's a example of an portal file.
  Screenshot

Mounts
You can enable mounts if your map is too big  and you don't have jump or speed enabled, mounts will work with kits or classes.

Some information about  the mount system:
  • You will receive a item (you can edit this item) when game starts, right click on it to spawn your horse.
  • Horses will not receive damage, however he will despawn if the passenger receives any damage.
  • Horse will despawn when you press shift.
  • You can modify the horse varient, speed and jump.
  • Has a cooldown to use, you can modify it.
    • Cooldown will trigger after you dismount  the horse.

This feature is disabled by default  so you will not receive the mount item. You can enable it on the options.yml file.

Guns
Quality Armory
You will need ItemBridge to work with Quality Armory.
  • Set ItemBridge to true in options.yml.
  • Set the weapon/ammo name the same as provided by Quality Armory.
  • Add 'weapon' tag to the item in kits.yml
Example:
 weaponTest:
  needs-permission: true
  permission: "wizards.kits.weapons"
  slot: 3
  price: 200
  display-item: 'CROSSBOW : 1 : name:ak47'
  helmet: 'IRON_HELMET : 1'
  chestplate: 'IRON_CHESTPLATE : 1'
  leggings: 'IRON_LEGGINGS : 1'
  boots: 'IRON_BOOTS : 1'
  items:
  - 'CROSSBOW : 1 : weapon : name:ak47'
  - 'CROSSBOW : 1 : weapon : name:kar98k'
  lore:
  - '&7Test weapon kit'
  potion-effects: []

Crackshot should just work right away, you don't need the weapon tag.

Custom Item Tags & ModelData
  • HideItemInfo (custom flag)
    • Will hide attributes, unbreakable, enchants, dye and Potion Effects.
    • Example:
       item: 'GOLDEN_HOE : 1 : HideItemInfo'
  • Item Flags - ItemFlag
    • Example:
       item: 'GOLDEN_AXE : 1 : ItemFlag:HIDE_ATTRIBUTES'
  • (1.14+) CustomModelData - ModelData:{Value}
    • Example:
       item: 'CARROT_ON_A_STICK : 1 : ModelData:1'
Game Arena
Spawn-Protection-Size & Objective-Protection-Size
In your arena.yml you will see Spawn-Protection-Size and Objective-Protection-Size, this will set the protected area where skills cannot explode blocks.

Extra permissions
  • wizards.joinfull - Allows you to join in full games.
  • wizards.kits.all - Access to all classes/kits.
Common problems
FPS Instability
This is a minecraft-side problem, I can't do much about it.

Disabling fireworks, explosions and falling blocks in config should help.

(This is fixed in v3.0)
Caused by: java.lang.IllegalArgumentException: No enum constant org.bukkit.Sound.....

How to fix:
If you are using 1.9 or above, you have to change all sound values in options.yml to 1.9.

Please DO NOT use /reload with Wizards.

Sounds List
https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Sound.html

Potion Effect Types
https://hub.spigotmc.org/javadocs/spigot/org/bukkit/potion/PotionEffectType.html

Material list
https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Material.html

API


import org.bukkit.event.EventHandler;

import com.floodeer.wizards.api.DamageBlockEvent;
import com.floodeer.wizards.api.GameEndEvent;
import com.floodeer.wizards.api.GameStartEvent;
import com.floodeer.wizards.api.PlayerAchievementEvent;
import com.floodeer.wizards.api.PlayerHitEvent;
import com.floodeer.wizards.api.PlayerSkillUseEvent;
import com.floodeer.wizards.game.GamePlayer;
import com.floodeer.wizards.game.achievements.AchievementType;

public class APIShowcase {

    WizardsAPI api = null;

    public APIShowcase() {
        api = Wizards.getAPI();
    }
  //API methods

    public GamePlayer getPlayerData(Player bukkitPlayer);

    public GamePlayer getPlayerData(UUID uuid);

    public GamePlayer getPlayerData(String name);

    public Game getGame(String name);

    public Game getGame(GamePlayer fromPlayer);

    public void saveData(Player... players);

    public boolean forwardData(Player player, String server, String key);

    public List<Entry<String, Integer>> getWinsLeaderboard();

    public List<Entry<String, Integer>> getKillsLeaderboard();

    public List<Entry<String, Integer>> getDamageLeaderboard();

    public List<Entry<String, Integer>> getHealLeaderboard();

    public OfflineGamePlayer getOfflineGamePlayer(String name);

    //API usage
    public String getPlayerWithMostWins() {
        String player = "";
        int wins = 0;
        if(api.getWinsLeaderboard().get(0) != null) {
            player = api.getWinsLeaderboard().get(0).getKey();
            wins = api.getWinsLeaderboard().get(0).getValue();
        }
        return player + " with " + wins + " wins";
    }

    //Events
    @EventHandler
    public void onSkillUse(PlayerSkillUseEvent event) {
        GamePlayer player = event.getPlayer();
        if(player.getP().isSneaking())
            player.setMana(player.getMana()+5);
    }

    @EventHandler
    public void onGameStart(GameStartEvent event) {
        event.getGame().sendTitle("The", "start");
    }

    @EventHandler
    public void onGameEnd(GameEndEvent event) {
        event.getWinner().getPlayers().forEach(player -> player.sendMessage("You won!"));
    }

    @EventHandler
    public void onAchievement(PlayerAchievementEvent event) {
        if(event.getType() == AchievementType.WINS) {
            event.getPlayer().sendMessage("Wins!");
        }
    }

    @EventHandler
    public void onPlayerDamage(PlayerHitEvent event) {
        GamePlayer damager = event.getDamager();
        GamePlayer target = event.getPlayer();
        if(target.getName().equalsIgnoreCase("Floodeer")) {
            event.setCancelled(true);
        }else{
            if(!target.getP().isSneaking())
                event.setDamage(event.getDamage() + 2);

            damager.getP().sendMessage("Hit " + target.getName() + " with " + event.getDamage() + " of damage.");
        }
    }

    @EventHandler
    public void onDamageBlock(DamageBlockEvent event) {
        GamePlayer damager = event.getDamager();
        GamePlayer blocker = event.getPlayer();
        if(blocker.getP().isSneaking()) {
            event.setDamage(event.getDamage()/2);
        }
        blocker.getP().sendMessage("Blocked " + event.getDamage() + " from " + damager.getName());
    }
}

Files and Screenshots
  Screenshots

UTF-8 support for all files.

  {arena}.yml

  language.yml

  options.yml

  {class}.yml

Reviews:
[img] tag

Q&A
Q: The game says the team is full but there is no player on the team/team is not full.
A
: This happens because of the team balancing system that tries to match teams according the amount of players.

Q: What can I do with the Script system?
A
: Script system is very simple, was just made to run small tasks like summon methods, all the info are above.

Q: Can I add more classes?
A
: Yes, check above to see how.

Q: Plugin is causing TPS problems, what can I do?
A
: You should not run Wizards with low memory, try disabling some particles, explosions or/and game effects like falling blocks and fireworks. Also try using kits if your server is not supporting the plugin. Wizards tasks should not cause your server any performance instability.

Q: Why is wizard's size more than 390KB?
A
: There's a lot of files inside the plugin, not just code. Whenever a class is not used or gets deprecated a update should replace or remove them, there's also a lot of things for planned features.

If you have any suggestions go to Discussion and I'll be happy to read them.

By buying Wizards you agree to
  • You are not allowed to distribute this plugin.
  • You are not allowed to decompile this plugin.
  • Use only for your network/server.
  • NO refunds.
  • All support given is on Spigot and Polymart only. You will not have Discord, Skype or any of those type of contact to ask for support. I'll probably reply in a few minutes! Otherwise, wait at least 12 hours or check my profile to see any updates.
  • Accept future terms.