API 
Gradle 
repositories 
repositories {
 maven { url "https://repo.recorehosting.com/repository/maven-snapshots/" } // snapshots
 maven { url "https://repo.recorehosting.com/repository/development/" }  // beta & release candidatedependencies 
Kingdom plugin 
 compileOnly   'me.map:ultimatekingdom:1.45.4.1-SNAPSHOT' //development voor deze versie is gestopt
 
 compileOnly   'me.map:ultimatekingdom:2.12.0.0-RC1'Exchange 
 compileOnly   'me.map.exchange:API:2.12.0.0-RC1'
 compileOnly   'me.map.exchange:bungeecord:2.12.0.0-RC1'
 compileOnly   'me.map.exchange:velocity:2.12.0.0-RC1'Toegang tot API 
De plugin is via een static class bereikbaar.
UltimateKingdom. .....
UltimateKingdom.Kingdoms() .....
UltimateKingdom.getKingdomServer()voorbeeld 1 
public class myClass {
    
    public void doSomething() {
        Kingdom k1 = UltimateKingdom.Kingdoms().getKingdom("kingdomname"); //haal een kingdom op
        Kingdom k = Kingdom.get("anotherkingdomname");   // mag ook
        k1.setSlogan("&athis &fwill &cbe &6the &8new &aslogan" ,(result,kingdom) -> {
          
            if (result.isOk()) { //result is ok...
                Bukkit.getLogger().info("Changed kingdom slogan to " +  kingdom.getSlogan()); 
            } else {
                Bukkit.getLogger().severe("Something has happend" +  result.toString());
            }
        });
    }
}voorbeeld 2 KingdomPlayer 
  public void doSomething() {
        UUID uuid = UUID.randomUUID(); //voorbeeld
        KingdomPlayer playerOne = UltimateKingdom.Players().getPlayer(uuid);
        KingdomPlayer playerTwo = KingdomPlayer.get(uuid); //tomayto, tomahto tomato
        playerOne.setmod(false,(result,player) -> {
            
            if (result.isOk()) {
                Bukkit.getLogger().info("player:" + player.getName() + " mod " + player.isMod()); //
            } else {
                Bukkit.getLogger().severe(result.toString());
            }
        });
    }voorbeeld 3 uitzondering 
Uitzondering op setRank
   public void doSomething() {
        UUID uuid = UUID.randomUUID(); //voorbeeld
        KingdomPlayer playerOne = UltimateKingdom.Players().getPlayer(uuid);
        KingdomPlayer playerTwo = KingdomPlayer.get(uuid); //tomayto, tomahto tomato
        Rank rank = Rank.get("Koning");
        
        playerOne.setRank(rank,(result,player,kingdom) -> {  //[!code hl]  //setrank geeft 3 objecten terug (result,player,kingdom)
        
            if (result.isOk()) {
                Bukkit.getLogger().info("player new rank  :" + player.getRank().getName() + " kingdom  " + kingdom.getName()); //
            } else {
                Bukkit.getLogger().severe(result.toString());
            }
        });
    }Gebruikte bibliotheken 
De kingdom plugin gebruikt de onderstaande bibliotheken
- Kyori Adventure
- WorldGuardWrapper
- xseries
- Okaeri Placeholders
- okaeri-tasker [1]
- Scoreboard-library
- Universal Scheduler
- Simple-Yaml
Hooks 
De onderstaande hooks/bibliotheren zijn beschikbaar.
| bibliotheken/hooks | via | 
|---|---|
| Scoreboard-library | UltimateKingdom.getKingdomServer().ScoreboardLibrary() | 
| Kyori Adventure | UltimateKingdom.getKingdomServer().Adventurehook() | 
| Okaeri Placeholders | UltimateKingdom.getKingdomServer().Messages().getPlaceHolders() | 
| EssentialX | UltimateKingdom.getKingdomServer().EssentialsHook() | 
| Universal Scheduler | UltimateKingdom.getKingdomServer().UniversalScheduler() | 
| Okaeri-tasker | UltimateKingdom.getKingdomServer().Tasker() | 
| Teleport queue | UltimateKingdom.getKingdomServer().QueuedTeleports() | 
| Runnable queue | UltimateKingdom.getKingdomServer().QueuedRunnables() | 
Commands 
We gebruiken een aangepaste brigadier van mojang. Hieronder staat een voorbeeld van een commando die de display naam van de kingdom aanpast.
public class MyCommand extends AbstractCommand  {
    public list() {
        super("mycommand");
        setDescription("Geef hier een omschrijving");  //deze omschrijving is zichtbaar in /k help
        setLongDescription("Geef hier eventueel een lange omschriving, deze is zichtbaar in /k help mycommand"); // (optioneel)
        setAliases("l");  //geef hier een alias in voor het commando. (optioneel)
        setPlayerOnly(true); //optioneel
        setPermission("kingdom.mycommand"); //permissie
    }
  public void createCommand(KingdomCommand brigadierCommand) {
        brigadierCommand
         .then(literal("setdisplayname")  //commando is dus:  /k mycommand setdisplayname <kingdom naam> <string>
                        .requires(c -> c.hasKingdom()  && c.isMod() && c.isPlayer() ) 
                        .then(argument("kingdom", KingdomArgumentType.kingdom())   //Kingdom argument
                                .then(argument("displayname", StringArgumentType.greedyString()) //String argument
                                        .suggests(new StringSuggestion("geef naam op")) // "geef naam op" weergeven als suggestie bij de argument displayname
                                        .executes(c -> {
                                            String displayname = c.getArgument("displayname", String.class); //haal String argument op
                                            Kingdom kingdom = c.getArgument("kingdom", Kingdom.class);  //haal Kingdom argument op
                                            kingdom.setDisplayName(displayname, (res,rm) -> {
                                               
                                               if (res.isOk()) {
                                                    c.getSource().sendMessage("we hebben het aangepast");
                                                } else {
                                                    c.getSource().sendMessage("Big Error... " + res);  
                                                }
                                            });
                                            return Command.SINGLE_SUCCESS;
                                        }))));
 }Registreren command 
new MyCommand().register();ArgumentTypes 
De onderstaande argumentypes zijn beschikbaar in de plugin.
| type | omschrijving | 
|---|---|
| KingdomArgumentType | argument voor kingdoms (Kingdom) | 
| KingdomPlayerArgumentType | argument voor online spelers (KingdomPlayer) | 
| ServerSpawnArgumentType | argument voor server spawns (KingdomLocation) | 
| ServerSpawnArgumentType | argument voor rank groep (String) | 
| PlayerLevelArgumentType | argument voor player levels (KingdomLevel) | 
| KingdomLevelArgumentType | argument voor kingdom levels (PlayerLevel) | 
| ChatChannelArgumentType | argument voor channels (Channels) | 
| CommandsArgumentType | argument voor commands (AbstractCommand) | 
| PlayerArgumentType | argument voor online spelers (lokaal Players) | 
| MultiServerCachedPlayerType | argument voor online spelers (CachedPlayers) | 
| RankArgumentTypeType | argument voor Rank (Rank) zie voorbeeld 3 | 
| YesNoArgumentsType | argument voor Yes/No (Boolean) | 
| BooleanWithWordsType | argument voor True/False (Boolean) | 
| ColorArgumentType | argument voor Colors (voorbeeld :0 0 0 255) | 
| HexArgumentType | argument voor Hex ( voorbeeld :404040) | 
| UuidMemberArgumentType | argument voor Kingdom members. Geeft UUID van speler | 
voorbeeld 1 
public class MyCommand extends AbstractCommand {
    public MyCommand() {
        super("MyCommand");
        setDescription("this command does nothing");
        setLongDescription("This is just a demo. So don't get angry.. please...");
        setPermission("demo.set");
        setPlayerOnly(false);
    }
    @Override
    public void createCommand(KingdomCommand command) {
        command
                .then(argument("kingdom", KingdomArgumentType.kingdom()) //eerste argument van commando
                        .executes(c -> {
                            Kingdom kingdom = c.getArgument("kingdom", Kingdom.class);  //[!code hl] //ophalen argument
                            ... //do something
                            return Command.SINGLE_SUCCESS;
                        }));
    }
}voorbeeld 2 
public class MyCommand extends AbstractCommand {
    public MyCommand() {
        super("MyCommand");
        setDescription("this command does nothing");
        setLongDescription("This is just a demo. So don't get angry.. please...");
        setPermission("demo.set");
        setPlayerOnly(false);
    }
    @Override
    public void createCommand(KingdomCommand command) {
        command
                .then(argument("action", OptionCollectionArgumentType.get(Arrays.asList("enable", "disable", "status"))) 
                        .executes(c -> {
                            String action = c.getArgument("action", String.class); 
                            switch (action.toLowerCase()) { 
                                case "on": 
                                     break; 
                                case "disable": 
                                    break; 
                                case "status": 
                                    break;
                            }
                            return Command.SINGLE_SUCCESS;
                        }));
    }
}voorbeeld 3 
De argument RankArgumentTypeType geeft standaard de ranken uit de groep default
 Met 'suggests' kan een andere lijst worden gegeven.
In het onderstaande voorbeeld wordt de ranken opgehaald van de kingdom , waar de speler die het commando uitvoert, lid van is. De speler moet een echte speler zijn en moet lid zijn van een kingdom om het commando te kunnen zien.
public class MyCommand extends AbstractCommand {
    public MyCommand() {
        super("MyCommand");
        setDescription("this command does nothing");
        setLongDescription("This is just a demo. So don't get angry.. please...");
        setPermission("demo.set");
        setPlayerOnly(false);  //controle van player-only doen we in het commando zelf. 
    }
    
    //dit regelt de nieuwe suggestie van ranks
    private CompletableFuture<Suggestions> PlayerKingdomRank(CommandContext<CommandSource> suggestionsBuilder, SuggestionsBuilder builder) { 
        KingdomPlayer player = suggestionsBuilder.getSource().asKingdomPlayerOrNull(); 
         for (Rank rank : player.getKingdom().getRanksList()) { 
          builder.suggest(rank.getName()); 
         } 
        return builder.buildFuture(); 
    } 
    @Override
    public void createCommand(KingdomCommand command) {
        command
                .then(argument("rank", RankArgumentTypeType.get())  
                        .requires(c -> c.isPlayer() && c.hasKingdom()) //player-only && speler heeft kingdom
                        .suggests(this::PlayerKingdomRank) //verwijst naar de nieuwe suggestie
                        .executes(c -> { 
                            Rank rank = c.getArgument("rank",Rank.class);
                            
                            ... do something
                            
                            return Command.SINGLE_SUCCESS;
                        }));
    }
    
}Gegevens opslaan 
In de plugin kan je gegevens opslaan die je op een andere server weer kan gebruiken.
Je hebt 3 plekken waar je data kan bewaren.
- spelers data
- kingdom data
- server data
De data kan je bewaren dmv MetaData
Voorbeeld kingdom data
Kingdom kingdom = Kingdom.get("MyKingdom");
MetaData md = new IntegerDataField("myplugin_key");//zorg dat je plugin naam er in zit ivm andere plugins
md.setValue(10);
kingdom.addMeta(md, (result, kd)-> {
      //do something
});Voorbeeld server data
Kingdom kingdom = Kingdom.get("MyKingdom");
MetaData md = new IntegerDataField("myplugin_key"); //zorg dat je plugin naam er in zit ivm andere plugins
md.setValue(10);
UltimateKingdom.Settings().addMeta(md, (result, kd)-> {
        //do something
});Metadata objecten 
Alleen serializable objects
| type | 
|---|
| BooleanDataField | 
| DecimalDataField | 
| IntegerDataField | 
| LongDataField | 
| ListDataFiend | 
| HashMapStringBooleanField | 
| HashMapStringIntegerField | 
Placeholders 
Kingdom/player object 
De kingdom plugin gebruikt de onderstaande metadata labels.
| label | Type | object | omschrijving | 
|---|---|---|---|
| strokeColor | String | kingdom | in gebruik bij setdynmap | 
| strokeopacity | Double | kingdom | in gebruik bij setdynmap | 
| strokeweight | Integer | kingdom | in gebruik bij setdynmap | 
| fillcolor | String | kingdom | in gebruik bij setdynmap | 
| fillopacity | Double | kingdom | in gebruik bij setdynmap | 
| spawnicon | String | kingdom | in gebruik bij setdynmap | 
| warpicon | String | kingdom | in gebruik bij setdynmap | 
Settings 
De kingdom plugin gebruikt de onderstaande metadata settings labels.
| label | Type | omschrijving | 
|---|---|---|
| ultimate_leavelocation | String | KingdomLocatie als String | 
| ultimate_kicklocation | String | KingdomLocatie als String | 
Events 
onderstaande is nog niet compleet.
WorldGuard Events 
| type | omschrijving | 
|---|---|
| RegionEnteredEvent | als een speler een regio binnen gaat | 
| RegionLeftEvent | als een speler een regio verlaat | 
| RegionsChangedEvent | als een speler van regio veranderd | 
| RegionsLeftEvent | als een speler een regio verlaat. | 
GamePlay events 
Alle gamePlay events waar je iets meer kan doen.
Action events 
| type | omschrijving | 
|---|---|
| KingdomSwitchEvent | als een speler iets omzet zoals een schakelaar | 
| KingdomItemuseEvent | als een speler een item gebruikt | 
| KingdomDestroyEvent | als een speler iets kapot maakt | 
| KingdomBuildEvent | als een speler iets bouwt | 
| KingdomActionEvent | alles hierboven | 
Damage events 
| type | omschrijving | 
|---|---|
| KingdomPlayerDamagePlayerEvent | Speler tegen speler damage | 
| KingdomDamageEvent | alles hier boven | 
Chat events 
| type | omschrijving | 
|---|---|
| AsyncNonReportableChatEvent | waneer een admin chat (nochatreport in config.yml moet aan staan) | 
| AsyncPostNonReportableChatEvent | waneer een admin chat (nochatreport in config.yml moet aan staan) | 
| KingdomChatEvent | wanneer eens speler chat | 
Kingdom events 
| type | omschrijving | 
|---|---|
| KingdomSetEvent | Speler in kingdom zetten | 
| KingdomCreateEvent | kingdom aanmaken | 
| KingdomDeleteEvent | kingdom verwijderen | 
| KingdomRenameEvent | kingdom hernoemen | 
| KingdomAddPointsEvent | toevoegen punten | 
| KingdomAddSpawnEvent | toevoegen spawn | 
| KingdomDeleteSpawnEvent | verwijderen spawn | 
| KingdomAddWarpEvent | toevoegen warp | 
| KingdomDeleteWarpEvent | verwijderen warp | 
| KingdomMaxMembersEvent | instellen max. aantal leden | 
| KingdomRemoveLevelEvent | verwijderen van level | 
| KingdomRemoveMember | verwijderen van kingdom lid | 
| KingdomRemovePointsEvent | verwijderen van punten | 
| KingdomRemoveRankMaximumEvent | verwijderen van een rank max. | 
| KingdomSetFriendlyFireEvent | instellen friendly-fire | 
| KingdomSetInviteOnly | instellen invite-only | 
| KingdomSetLevelEvent | instellen kingdom level | 
| KingdomSetPlaceHolderEvent | instellen placeholder | 
| KingdomSetRankMaximumEvent | instellen max rank | 
| KingdomSetRelationEvent | instellen relatie | 
| KingdomSetSpawnEvent | instellen spawn | 
| KingdomSetWarpEvent | instellen warp | 
| KingdomPlayerSetRank | instellen rank | 
Player events 
| type | 
|---|
| PlayerJoinKingdomEvent | 
| PlayerJoinServerEvent | 
| PlayerDeathMessageEvent | 
| PlayerKilledPlayerDeathMessageEvent | 
| PlayerDeathMessageEvent | 
WorldGuardWrapper Events 
| type | 
|---|
| WrappedUseEntityEvent | 
| WrappedDisallowedPVPEvent | 
| WrappedDamageEntityEvent | 
| AbstractWrappedEvent | 
- Er zit een aangepaste variant in de plugin, voor ondersteuning van de Universal scheduler. (UniversalTasker) ↩︎ 
