]> git.seodisparate.com - TurnBasedMinecraftMod/commitdiff
WIP 1.18.3: Impl in-game server config editing
authorStephen Seo <seo.disparate@gmail.com>
Thu, 9 Jun 2022 07:42:21 +0000 (16:42 +0900)
committerStephen Seo <seo.disparate@gmail.com>
Thu, 9 Jun 2022 07:42:21 +0000 (16:42 +0900)
src/main/java/com/burnedkirby/TurnBasedMinecraft/client/ClientProxy.java
src/main/java/com/burnedkirby/TurnBasedMinecraft/common/Config.java
src/main/java/com/burnedkirby/TurnBasedMinecraft/common/TurnBasedMinecraftMod.java

index 80c2ae67306182494eb68b2c6c671ea78c72e130..872d8ddec2325b7bbb77d1b0e6b5fc6cfb278f71 100644 (file)
@@ -7,6 +7,7 @@ import com.burnedkirby.TurnBasedMinecraft.common.TurnBasedMinecraftMod;
 import com.burnedkirby.TurnBasedMinecraft.common.networking.PacketBattleMessage;
 import com.burnedkirby.TurnBasedMinecraft.common.networking.PacketEditingMessage;
 import com.burnedkirby.TurnBasedMinecraft.common.networking.PacketGeneralMessage;
+import net.minecraft.ChatFormatting;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.Options;
 import net.minecraft.network.chat.*;
@@ -581,29 +582,28 @@ public class ClientProxy extends CommonProxy {
                     parent.setStyle(parent.getStyle().withColor(TextColor.fromRgb(0xFFFFFFFF)).withBold(false));
 
                     TextComponent sub = new TextComponent("leave_battle_cooldown ");
-                    sub.setStyle(sub.getStyle().withColor(0xFFFFFF00).withBold(true));
+                    sub.setStyle(sub.getStyle().withColor(ChatFormatting.YELLOW).withBold(true));
+                    parent.append(sub);
 
                     for (int i = 1; i <= 10; ++i) {
-                        TextComponent value = new TextComponent(String.valueOf(i) + ' ');
-                        value.setStyle(
-                            value.getStyle()
-                                .withColor(0xFF00FF00)
+                        sub = new TextComponent(String.valueOf(i) + ' ');
+                        sub.setStyle(
+                            sub.getStyle()
+                                .withColor(ChatFormatting.GREEN)
                                 .withClickEvent(new ClickEvent(
                                     ClickEvent.Action.RUN_COMMAND,
                                     "/tbm-server-edit leave_battle_cooldown " + i)));
-                        sub.append(value);
+                        parent.append(sub);
                     }
 
-                    parent.append(sub);
-
                     sub = new TextComponent("aggro_start_battle_max_distance ");
-                    sub.setStyle(sub.getStyle().withColor(0xFFFFFF00).withBold(true));
+                    sub.setStyle(sub.getStyle().withColor(ChatFormatting.YELLOW).withBold(true));
                     parent.append(sub);
 
                     sub = new TextComponent("5 ");
                     sub.setStyle(
                         sub.getStyle()
-                            .withColor(0xFF00FF00)
+                            .withColor(ChatFormatting.GREEN)
                             .withClickEvent(new ClickEvent(
                                 ClickEvent.Action.RUN_COMMAND,
                                 "/tbm-server-edit aggro_start_battle_max_distance 5")));
@@ -612,7 +612,7 @@ public class ClientProxy extends CommonProxy {
                     sub = new TextComponent("8 ");
                     sub.setStyle(
                         sub.getStyle()
-                            .withColor(0xFF00FF00)
+                            .withColor(ChatFormatting.GREEN)
                             .withClickEvent(new ClickEvent(
                                 ClickEvent.Action.RUN_COMMAND,
                                 "/tbm-server-edit aggro_start_battle_max_distance 8")));
@@ -622,7 +622,7 @@ public class ClientProxy extends CommonProxy {
                         sub = new TextComponent(String.valueOf(i) + ' ');
                         sub.setStyle(
                             sub.getStyle()
-                                .withColor(0xFF00FF00)
+                                .withColor(ChatFormatting.GREEN)
                                 .withClickEvent(new ClickEvent(
                                     ClickEvent.Action.RUN_COMMAND,
                                     "/tbm-server-edit aggro_start_battle_max_distance " + String.valueOf(i))));
@@ -631,7 +631,7 @@ public class ClientProxy extends CommonProxy {
 
                     sub = new TextComponent("old_battle_behavior ");
                     sub.setStyle(sub.getStyle()
-                        .withColor(0xFFFFFF00)
+                        .withColor(ChatFormatting.YELLOW)
                         .withHoverEvent(new HoverEvent(
                             HoverEvent.Action.SHOW_TEXT,
                             new TextComponent("If enabled, battles only start on a hit, not including mobs targeting players")))
@@ -641,7 +641,7 @@ public class ClientProxy extends CommonProxy {
                     sub = new TextComponent("true ");
                     sub.setStyle(
                         sub.getStyle()
-                            .withColor(0xFF00FF00)
+                            .withColor(ChatFormatting.GREEN)
                             .withClickEvent(new ClickEvent(
                                 ClickEvent.Action.RUN_COMMAND,
                                 "/tbm-server-edit old_battle_behavior true")));
@@ -650,7 +650,7 @@ public class ClientProxy extends CommonProxy {
                     sub = new TextComponent("false ");
                     sub.setStyle(
                         sub.getStyle()
-                            .withColor(0xFF00FF00)
+                            .withColor(ChatFormatting.GREEN)
                             .withClickEvent(new ClickEvent(
                                 ClickEvent.Action.RUN_COMMAND,
                                 "/tbm-server-edit old_battle_behavior false")));
@@ -658,7 +658,7 @@ public class ClientProxy extends CommonProxy {
 
                     sub = new TextComponent("anyone_can_disable_tbm_for_self ");
                     sub.setStyle(sub.getStyle()
-                        .withColor(0xFFFFFF00)
+                        .withColor(ChatFormatting.YELLOW)
                         .withHoverEvent(new HoverEvent(
                             HoverEvent.Action.SHOW_TEXT,
                             new TextComponent("Allows use for /tbm-disable and /tbm-enable for all")))
@@ -668,7 +668,7 @@ public class ClientProxy extends CommonProxy {
                     sub = new TextComponent("true ");
                     sub.setStyle(
                         sub.getStyle()
-                            .withColor(0xFF00FF00)
+                            .withColor(ChatFormatting.GREEN)
                             .withClickEvent(new ClickEvent(
                                 ClickEvent.Action.RUN_COMMAND,
                                 "/tbm-server-edit anyone_can_disable_tbm_for_self true")));
@@ -677,19 +677,19 @@ public class ClientProxy extends CommonProxy {
                     sub = new TextComponent("false ");
                     sub.setStyle(
                         sub.getStyle()
-                            .withColor(0xFF00FF00)
+                            .withColor(ChatFormatting.GREEN)
                             .withClickEvent(new ClickEvent(
                                 ClickEvent.Action.RUN_COMMAND,
                                 "/tbm-server-edit anyone_can_disable_tbm_for_self false")));
                     parent.append(sub);
 
                     sub = new TextComponent("max_in_battle ");
-                    sub.setStyle(sub.getStyle().withColor(0xFFFFFF00).withBold(true));
+                    sub.setStyle(sub.getStyle().withColor(ChatFormatting.YELLOW).withBold(true));
                     parent.append(sub);
 
                     sub = new TextComponent("2 ");
                     sub.setStyle(sub.getStyle()
-                        .withColor(0xFF00FF00)
+                        .withColor(ChatFormatting.GREEN)
                         .withClickEvent(new ClickEvent(
                             ClickEvent.Action.RUN_COMMAND,
                             "/tbm-server-edit max_in_battle 2")));
@@ -698,7 +698,7 @@ public class ClientProxy extends CommonProxy {
                     for (int i = 5; i < 30; i += 5) {
                         sub = new TextComponent(String.valueOf(i) + ' ');
                         sub.setStyle(sub.getStyle()
-                            .withColor(0xFF00FF00)
+                            .withColor(ChatFormatting.GREEN)
                             .withClickEvent(new ClickEvent(
                                 ClickEvent.Action.RUN_COMMAND,
                                 "/tbm-server-edit max_in_battle " + String.valueOf(i))));
@@ -706,12 +706,12 @@ public class ClientProxy extends CommonProxy {
                     }
 
                     sub = new TextComponent("freeze_battle_combatants ");
-                    sub.setStyle(sub.getStyle().withColor(0xFFFFFF00).withBold(true));
+                    sub.setStyle(sub.getStyle().withColor(ChatFormatting.YELLOW).withBold(true));
                     parent.append(sub);
 
                     sub = new TextComponent("true ");
                     sub.setStyle(sub.getStyle()
-                        .withColor(0xFF00FF00)
+                        .withColor(ChatFormatting.GREEN)
                         .withClickEvent(new ClickEvent(
                             ClickEvent.Action.RUN_COMMAND,
                             "/tbm-server-edit freeze_battle_combatants true"
@@ -720,7 +720,7 @@ public class ClientProxy extends CommonProxy {
 
                     sub = new TextComponent("false ");
                     sub.setStyle(sub.getStyle()
-                        .withColor(0xFF00FF00)
+                        .withColor(ChatFormatting.GREEN)
                         .withClickEvent(new ClickEvent(
                             ClickEvent.Action.RUN_COMMAND,
                             "/tbm-server-edit freeze_battle_combatants false"
@@ -729,7 +729,7 @@ public class ClientProxy extends CommonProxy {
 
                     sub = new TextComponent("ignore_battle_types ");
                     sub.setStyle(sub.getStyle()
-                        .withColor(0xFF00FF00)
+                        .withColor(ChatFormatting.DARK_GREEN)
                         .withClickEvent(new ClickEvent(
                             ClickEvent.Action.RUN_COMMAND,
                             "/tbm-server-edit ignore_battle_types"))
@@ -742,7 +742,7 @@ public class ClientProxy extends CommonProxy {
 
                     sub = new TextComponent("player_speed ");
                     sub.setStyle(sub.getStyle()
-                        .withColor(0xFFFFFF00)
+                        .withColor(ChatFormatting.YELLOW)
                         .withBold(true)
                         .withHoverEvent(new HoverEvent(
                             HoverEvent.Action.SHOW_TEXT,
@@ -752,7 +752,7 @@ public class ClientProxy extends CommonProxy {
                     for (int i = 0; i <= 100; i += 5) {
                         sub = new TextComponent(String.valueOf(i) + ' ');
                         sub.setStyle(sub.getStyle()
-                            .withColor(0xFF00FF00)
+                            .withColor(ChatFormatting.GREEN)
                             .withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND,
                                 "/tbm-server-edit player_speed " + i)));
                         parent.append(sub);
@@ -760,7 +760,7 @@ public class ClientProxy extends CommonProxy {
 
                     sub = new TextComponent("player_haste_speed ");
                     sub.setStyle(sub.getStyle()
-                        .withColor(0xFFFFFF00)
+                        .withColor(ChatFormatting.YELLOW)
                         .withBold(true)
                         .withHoverEvent(new HoverEvent(
                             HoverEvent.Action.SHOW_TEXT,
@@ -771,7 +771,7 @@ public class ClientProxy extends CommonProxy {
                     for (int i = 0; i <= 100; i += 5) {
                         sub = new TextComponent(String.valueOf(i) + ' ');
                         sub.setStyle(sub.getStyle()
-                            .withColor(0xFF00FF00)
+                            .withColor(ChatFormatting.GREEN)
                             .withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND,
                                 "/tbm-server-edit player_haste_speed " + i)));
                         parent.append(sub);
@@ -779,7 +779,7 @@ public class ClientProxy extends CommonProxy {
 
                     sub = new TextComponent("player_slow_speed ");
                     sub.setStyle(sub.getStyle()
-                        .withColor(0xFFFFFF00)
+                        .withColor(ChatFormatting.YELLOW)
                         .withBold(true)
                         .withHoverEvent(new HoverEvent(
                             HoverEvent.Action.SHOW_TEXT,
@@ -790,12 +790,177 @@ public class ClientProxy extends CommonProxy {
                     for (int i = 0; i <= 100; i += 5) {
                         sub = new TextComponent(String.valueOf(i) + ' ');
                         sub.setStyle(sub.getStyle()
-                            .withColor(0xFF00FF00)
+                            .withColor(ChatFormatting.GREEN)
                             .withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND,
                                 "/tbm-server-edit player_slow_speed " + i)));
                         parent.append(sub);
                     }
 
+                    sub = new TextComponent("player_attack_probability ");
+                    sub.setStyle(sub.getStyle()
+                        .withColor(ChatFormatting.YELLOW)
+                        .withBold(true)
+                        .withHoverEvent(new HoverEvent(
+                            HoverEvent.Action.SHOW_TEXT,
+                            new TextComponent("Base Player attack probability in percentage")
+                        )));
+                    parent.append(sub);
+
+                    for (int i = 0; i <= 100; i += 5) {
+                        if (i == 0) {
+                            sub = new TextComponent("1 ");
+                            sub.setStyle(sub.getStyle()
+                                .withColor(ChatFormatting.GREEN)
+                                .withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND,
+                                    "/tbm-server-edit player_attack_probability 1")));
+                        } else {
+                            sub = new TextComponent(String.valueOf(i) + ' ');
+                            sub.setStyle(sub.getStyle()
+                                .withColor(ChatFormatting.GREEN)
+                                .withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND,
+                                    "/tbm-server-edit player_attack_probability " + i)));
+                        }
+                        parent.append(sub);
+                    }
+
+                    sub = new TextComponent("player_evasion ");
+                    sub.setStyle(sub.getStyle()
+                        .withColor(ChatFormatting.YELLOW)
+                        .withBold(true)
+                        .withHoverEvent(new HoverEvent(
+                            HoverEvent.Action.SHOW_TEXT,
+                            new TextComponent("Base Player evasion rate in percentage")
+                        )));
+                    parent.append(sub);
+
+                    for (int i = 0; i <= 100; i += 5) {
+                        sub = new TextComponent(String.valueOf(i) + ' ');
+                        sub.setStyle(sub.getStyle()
+                            .withColor(ChatFormatting.GREEN)
+                            .withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND,
+                                "/tbm-server-edit player_evasion " + i)));
+                        parent.append(sub);
+                    }
+
+                    sub = new TextComponent("defense_duration ");
+                    sub.setStyle(sub.getStyle()
+                        .withColor(ChatFormatting.YELLOW)
+                        .withBold(true)
+                        .withHoverEvent(new HoverEvent(
+                            HoverEvent.Action.SHOW_TEXT,
+                            new TextComponent("Number of attacks that a \"Defend\" move blocks (lasts until next action)")
+                        )));
+                    parent.append(sub);
+
+                    for (int i = 0; i <= 5; ++i) {
+                        sub = new TextComponent(String.valueOf(i) + ' ');
+                        sub.setStyle(sub.getStyle()
+                            .withColor(ChatFormatting.GREEN)
+                            .withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND,
+                                "/tbm-server-edit defense_duration " + i)));
+                        parent.append(sub);
+                    }
+
+                    sub = new TextComponent("flee_good_probability ");
+                    sub.setStyle(sub.getStyle()
+                        .withColor(ChatFormatting.YELLOW)
+                        .withBold(true)
+                        .withHoverEvent(new HoverEvent(
+                            HoverEvent.Action.SHOW_TEXT,
+                            new TextComponent("Probability of flee success when Player's speed is higher than the fastest opposing Entity")
+                        )));
+                    parent.append(sub);
+
+                    for (int i = 0; i <= 100; i += 5) {
+                        if (i == 0) {
+                            sub = new TextComponent("1 ");
+                            sub.setStyle(sub.getStyle()
+                                .withColor(ChatFormatting.GREEN)
+                                .withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND,
+                                    "/tbm-server-edit flee_good_probability 1")));
+                        } else {
+                            sub = new TextComponent(String.valueOf(i) + ' ');
+                            sub.setStyle(sub.getStyle()
+                                .withColor(ChatFormatting.GREEN)
+                                .withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND,
+                                    "/tbm-server-edit flee_good_probability " + i)));
+                        }
+                        parent.append(sub);
+                    }
+
+                    sub = new TextComponent("flee_bad_probability ");
+                    sub.setStyle(sub.getStyle()
+                        .withColor(ChatFormatting.YELLOW)
+                        .withBold(true)
+                        .withHoverEvent(new HoverEvent(
+                            HoverEvent.Action.SHOW_TEXT,
+                            new TextComponent("Probability of flee success when Player's speed is lower than the fastest opposing Entity")
+                        )));
+                    parent.append(sub);
+
+                    for (int i = 0; i <= 100; i += 5) {
+                        if (i == 0) {
+                            sub = new TextComponent("1 ");
+                            sub.setStyle(sub.getStyle()
+                                .withColor(ChatFormatting.GREEN)
+                                .withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND,
+                                    "/tbm-server-edit flee_bad_probability 1")));
+                        } else {
+                            sub = new TextComponent(String.valueOf(i) + ' ');
+                            sub.setStyle(sub.getStyle()
+                                .withColor(ChatFormatting.GREEN)
+                                .withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND,
+                                    "/tbm-server-edit flee_bad_probability " + i)));
+                        }
+                        parent.append(sub);
+                    }
+
+                    sub = new TextComponent("minimum_hit_percentage ");
+                    sub.setStyle(sub.getStyle()
+                        .withColor(ChatFormatting.YELLOW)
+                        .withBold(true)
+                        .withHoverEvent(new HoverEvent(
+                            HoverEvent.Action.SHOW_TEXT,
+                            new TextComponent("The minimum percentage possible when calculating hit percentage for any attacker")
+                        )));
+                    parent.append(sub);
+
+                    for (int i = 0; i <= 100; i += 5) {
+                        if (i == 0) {
+                            sub = new TextComponent("1 ");
+                            sub.setStyle(sub.getStyle()
+                                .withColor(ChatFormatting.GREEN)
+                                .withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND,
+                                    "/tbm-server-edit minimum_hit_percentage 1")));
+                        } else {
+                            sub = new TextComponent(String.valueOf(i) + ' ');
+                            sub.setStyle(sub.getStyle()
+                                .withColor(ChatFormatting.GREEN)
+                                .withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND,
+                                    "/tbm-server-edit minimum_hit_percentage " + i)));
+                        }
+                        parent.append(sub);
+                    }
+
+                    sub = new TextComponent("battle_turn_time_seconds ");
+                    sub.setStyle(sub.getStyle()
+                        .withColor(ChatFormatting.YELLOW)
+                        .withBold(true)
+                        .withHoverEvent(new HoverEvent(
+                            HoverEvent.Action.SHOW_TEXT,
+                            new TextComponent("The time in seconds to wait for all Players to choose their move")
+                        )));
+                    parent.append(sub);
+
+                    for (int i = 5; i <= 60; i += 5) {
+                        sub = new TextComponent(String.valueOf(i) + ' ');
+                        sub.setStyle(sub.getStyle()
+                            .withColor(ChatFormatting.GREEN)
+                            .withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND,
+                                "/tbm-server-edit battle_turn_time_seconds " + i)));
+                        parent.append(sub);
+                    }
+
                     TurnBasedMinecraftMod.proxy.displayComponent(parent);
                     break;
                 }
index 8c3431c3ad0ddcafde0513ff52fb9f4e83f3a955..9b8cc113d6eb416fb5cc1ce73b5abb15ed11fa07 100644 (file)
@@ -981,26 +981,72 @@ public class Config
         return playerAttackProbability;
     }
 
+    public void setPlayerAttackProbability(int probability) {
+        if (probability < 1) {
+            probability = 1;
+        } else if (probability > 100) {
+            probability = 100;
+        }
+        playerAttackProbability = probability;
+    }
+
     public int getPlayerEvasion()
     {
         return playerEvasion;
     }
 
+    public void setPlayerEvasion(int evasion) {
+        if (evasion < 0) {
+            evasion = 0;
+        } else if (evasion > 100) {
+            evasion = 100;
+        }
+        playerEvasion = evasion;
+    }
+
     public int getDefenseDuration()
     {
         return defenseDuration;
     }
 
+    public void setDefenseDuration(int turns) {
+        if (turns < 0) {
+            turns = 0;
+        } else if (turns > 5) {
+            turns = 5;
+        }
+
+        defenseDuration = turns;
+    }
+
     public int getFleeGoodProbability()
     {
         return fleeGoodProbability;
     }
 
+    public void setFleeGoodProbability(int probability) {
+        if (probability < 1) {
+            probability = 1;
+        } else if (probability > 100) {
+            probability = 100;
+        }
+        fleeGoodProbability = probability;
+    }
+
     public int getFleeBadProbability()
     {
         return fleeBadProbability;
     }
 
+    public void setFleeBadProbability(int probability) {
+        if (probability < 1) {
+            probability = 1;
+        } else if (probability > 100) {
+            probability = 100;
+        }
+        fleeBadProbability = probability;
+    }
+
     /**
      * Returns a clone of an EntityInfo (to prevent editing it).
      * @param classFullName
@@ -1210,6 +1256,15 @@ public class Config
         return minimumHitPercentage;
     }
 
+    public void setMinimumHitPercentage(int percentage) {
+        if (percentage < 1) {
+            percentage = 1;
+        } else if (percentage > 100) {
+            percentage = 100;
+        }
+        minimumHitPercentage = percentage;
+    }
+
     public int getMaxInBattle()
     {
         return maxInBattle;
@@ -1263,6 +1318,15 @@ public class Config
         return (int)(battleDecisionDurationNanos / 1000000000L);
     }
 
+    public void setDecisionDurationSeconds(long seconds) {
+        if (seconds < 5) {
+            seconds = 5;
+        } else if (seconds > 60) {
+            seconds = 60;
+        }
+        battleDecisionDurationNanos = seconds * 1000000000L;
+    }
+
     protected void addBattleIgnoringPlayer(int id)
     {
         battleIgnoringPlayers.add(id);
index db22576fcdd67919e83ef50f17dfe90e33ed442e..d00c352684a8a33b4ce2ee1a91a0a84ee5d375cd 100644 (file)
@@ -9,6 +9,7 @@ import com.mojang.brigadier.arguments.IntegerArgumentType;
 import com.mojang.brigadier.arguments.StringArgumentType;
 import com.mojang.brigadier.exceptions.CommandSyntaxException;
 import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
+import net.minecraft.ChatFormatting;
 import net.minecraft.commands.Commands;
 import net.minecraft.commands.arguments.EntityArgument;
 import net.minecraft.network.chat.ClickEvent;
@@ -789,7 +790,7 @@ public class TurnBasedMinecraftMod {
                         TextComponent subResponse = new TextComponent("leave_battle_cooldown is currently: ");
                         response.append(subResponse);
                         subResponse = new TextComponent(String.valueOf(TurnBasedMinecraftMod.proxy.getConfig().getLeaveBattleCooldownSeconds()));
-                        subResponse.setStyle(subResponse.getStyle().withColor(0xFF00FF00));
+                        subResponse.setStyle(subResponse.getStyle().withColor(ChatFormatting.GREEN));
                         response.append(subResponse);
                         c.getSource().sendSuccess(response, false);
                         return 1;
@@ -812,7 +813,7 @@ public class TurnBasedMinecraftMod {
                             } else {
                                 TextComponent response = new TextComponent("Successfully set leave_battle_cooldown to: ");
                                 TextComponent subResponse = new TextComponent(String.valueOf(cooldown));
-                                subResponse.setStyle(subResponse.getStyle().withColor(0xFF00FF00));
+                                subResponse.setStyle(subResponse.getStyle().withColor(ChatFormatting.GREEN));
                                 response.append(subResponse);
                                 c.getSource().sendSuccess(response, true);
                             }
@@ -824,7 +825,7 @@ public class TurnBasedMinecraftMod {
                         response.append(subResponse);
                         subResponse = new TextComponent(String.valueOf(
                             TurnBasedMinecraftMod.proxy.getConfig().getAggroStartBattleDistance()));
-                        subResponse.setStyle(subResponse.getStyle().withColor(0xFF00FF00));
+                        subResponse.setStyle(subResponse.getStyle().withColor(ChatFormatting.GREEN));
                         response.append(subResponse);
                         c.getSource().sendSuccess(response, false);
                         return 1;
@@ -847,7 +848,7 @@ public class TurnBasedMinecraftMod {
                             } else {
                                 TextComponent response = new TextComponent("Successfully set aggro_start_battle_max_distance to: ");
                                 TextComponent subResponse = new TextComponent(String.valueOf(distance));
-                                subResponse.setStyle(subResponse.getStyle().withColor(0xFF00FF00));
+                                subResponse.setStyle(subResponse.getStyle().withColor(ChatFormatting.GREEN));
                                 response.append(subResponse);
                                 c.getSource().sendSuccess(response, true);
                             }
@@ -859,7 +860,7 @@ public class TurnBasedMinecraftMod {
                         response.append(subResponse);
                         subResponse = new TextComponent(String.valueOf(
                             TurnBasedMinecraftMod.proxy.getConfig().isOldBattleBehaviorEnabled()));
-                        subResponse.setStyle(subResponse.getStyle().withColor(0xFF00FF00));
+                        subResponse.setStyle(subResponse.getStyle().withColor(ChatFormatting.GREEN));
                         response.append(subResponse);
                         c.getSource().sendSuccess(response, false);
                         return 1;
@@ -880,7 +881,7 @@ public class TurnBasedMinecraftMod {
                             } else {
                                 TextComponent response = new TextComponent("Successfully set old_battle_behavior to: ");
                                 TextComponent subResponse = new TextComponent(String.valueOf(enabled));
-                                subResponse.setStyle(subResponse.getStyle().withColor(0xFF00FF00));
+                                subResponse.setStyle(subResponse.getStyle().withColor(ChatFormatting.GREEN));
                                 response.append(subResponse);
                                 c.getSource().sendSuccess(response, true);
                             }
@@ -892,7 +893,7 @@ public class TurnBasedMinecraftMod {
                         response.append(subResponse);
                         subResponse = new TextComponent(String.valueOf(
                             !TurnBasedMinecraftMod.proxy.getConfig().getIfOnlyOPsCanDisableTurnBasedForSelf()));
-                        subResponse.setStyle(subResponse.getStyle().withColor(0xFF00FF00));
+                        subResponse.setStyle(subResponse.getStyle().withColor(ChatFormatting.GREEN));
                         response.append(subResponse);
                         c.getSource().sendSuccess(response, false);
                         return 1;
@@ -914,7 +915,7 @@ public class TurnBasedMinecraftMod {
                             } else {
                                 TextComponent response = new TextComponent("Successfully set anyone_can_disable_tbm_for_self to: ");
                                 TextComponent subResponse = new TextComponent(String.valueOf(enabled_for_all));
-                                subResponse.setStyle(subResponse.getStyle().withColor(0xFF00FF00));
+                                subResponse.setStyle(subResponse.getStyle().withColor(ChatFormatting.GREEN));
                                 response.append(subResponse);
                                 c.getSource().sendSuccess(response, true);
                             }
@@ -926,7 +927,7 @@ public class TurnBasedMinecraftMod {
                         response.append(subResponse);
                         subResponse = new TextComponent(String.valueOf(
                             TurnBasedMinecraftMod.proxy.getConfig().getMaxInBattle()));
-                        subResponse.setStyle(subResponse.getStyle().withColor(0xFF00FF00));
+                        subResponse.setStyle(subResponse.getStyle().withColor(ChatFormatting.GREEN));
                         response.append(subResponse);
                         c.getSource().sendSuccess(response, false);
                         return 1;
@@ -949,7 +950,7 @@ public class TurnBasedMinecraftMod {
                             } else {
                                 TextComponent response = new TextComponent("Successfully set max_in_battle to: ");
                                 TextComponent subResponse = new TextComponent(String.valueOf(max_amount));
-                                subResponse.setStyle(subResponse.getStyle().withColor(0xFF00FF00));
+                                subResponse.setStyle(subResponse.getStyle().withColor(ChatFormatting.GREEN));
                                 response.append(subResponse);
                                 c.getSource().sendSuccess(response, true);
                             }
@@ -961,7 +962,7 @@ public class TurnBasedMinecraftMod {
                         response.append(subResponse);
                         subResponse = new TextComponent(String.valueOf(
                             !TurnBasedMinecraftMod.proxy.getConfig().isFreezeCombatantsEnabled()));
-                        subResponse.setStyle(subResponse.getStyle().withColor(0xFF00FF00));
+                        subResponse.setStyle(subResponse.getStyle().withColor(ChatFormatting.GREEN));
                         response.append(subResponse);
                         c.getSource().sendSuccess(response, false);
                         return 1;
@@ -980,7 +981,7 @@ public class TurnBasedMinecraftMod {
                             } else {
                                 TextComponent response = new TextComponent("Successfully set freeze_battle_combatants to: ");
                                 TextComponent subResponse = new TextComponent(String.valueOf(enabled));
-                                subResponse.setStyle(subResponse.getStyle().withColor(0xFF00FF00));
+                                subResponse.setStyle(subResponse.getStyle().withColor(ChatFormatting.GREEN));
                                 response.append(subResponse);
                                 c.getSource().sendSuccess(response, true);
                             }
@@ -989,7 +990,7 @@ public class TurnBasedMinecraftMod {
                 .then(Commands.literal("ignore_battle_types").executes(c -> {
                         TextComponent response = new TextComponent("Use ");
                         TextComponent subResponse = new TextComponent("/tbm-server-edit ignore_battle_types add/remove <category> ");
-                        subResponse.setStyle(subResponse.getStyle().withColor(0xFFFFFF00));
+                        subResponse.setStyle(subResponse.getStyle().withColor(ChatFormatting.YELLOW));
                         response.append(subResponse);
 
                         subResponse = new TextComponent("ignore_battle_types is currently: [");
@@ -1002,7 +1003,7 @@ public class TurnBasedMinecraftMod {
                             }
                             subResponse = new TextComponent(category);
                             subResponse.setStyle(subResponse.getStyle()
-                                .withColor(0xFF00FF00)
+                                .withColor(ChatFormatting.GREEN)
                                 .withClickEvent(new ClickEvent(
                                     ClickEvent.Action.RUN_COMMAND,
                                     "/tbm-server-edit ignore_battle_types remove " + category))
@@ -1027,7 +1028,7 @@ public class TurnBasedMinecraftMod {
                                 TextComponent response = new TextComponent("Successfully appended category \"");
 
                                 TextComponent sub = new TextComponent(category);
-                                sub.setStyle(sub.getStyle().withColor(0xFF00FF00));
+                                sub.setStyle(sub.getStyle().withColor(ChatFormatting.GREEN));
                                 response.append(sub);
 
                                 sub = new TextComponent("\" to ignore_battle_types");
@@ -1052,7 +1053,7 @@ public class TurnBasedMinecraftMod {
                                 TextComponent response = new TextComponent("Successfully removed category \"");
 
                                 TextComponent sub = new TextComponent(category);
-                                sub.setStyle(sub.getStyle().withColor(0xFF00FF00));
+                                sub.setStyle(sub.getStyle().withColor(ChatFormatting.GREEN));
                                 response.append(sub);
 
                                 sub = new TextComponent("\" from ignore_battle_types");
@@ -1069,7 +1070,7 @@ public class TurnBasedMinecraftMod {
                 .then(Commands.literal("player_speed").executes(c -> {
                         TextComponent parent = new TextComponent("Use ");
                         TextComponent sub = new TextComponent("/tbm-server-edit player_speed <0-100>");
-                        sub.setStyle(sub.getStyle().withColor(0xFFFFFF00));
+                        sub.setStyle(sub.getStyle().withColor(ChatFormatting.YELLOW));
                         parent.append(sub);
 
                         c.getSource().sendSuccess(parent, false);
@@ -1090,7 +1091,7 @@ public class TurnBasedMinecraftMod {
                         } else {
                             TextComponent response = new TextComponent("Successfully set player_speed to: ");
                             TextComponent subResponse = new TextComponent(String.valueOf(speed));
-                            subResponse.setStyle(subResponse.getStyle().withColor(0xFF00FF00));
+                            subResponse.setStyle(subResponse.getStyle().withColor(ChatFormatting.GREEN));
                             response.append(subResponse);
                             c.getSource().sendSuccess(response, true);
                         }
@@ -1099,7 +1100,7 @@ public class TurnBasedMinecraftMod {
                 .then(Commands.literal("player_haste_speed").executes(c -> {
                     TextComponent parent = new TextComponent("Use ");
                     TextComponent sub = new TextComponent("/tbm-server-edit player_haste_speed <0-100>");
-                    sub.setStyle(sub.getStyle().withColor(0xFFFFFF00));
+                    sub.setStyle(sub.getStyle().withColor(ChatFormatting.YELLOW));
                     parent.append(sub);
 
                     c.getSource().sendSuccess(parent, false);
@@ -1120,7 +1121,7 @@ public class TurnBasedMinecraftMod {
                         } else {
                             TextComponent response = new TextComponent("Successfully set player_haste_speed to: ");
                             TextComponent subResponse = new TextComponent(String.valueOf(haste_speed));
-                            subResponse.setStyle(subResponse.getStyle().withColor(0xFF00FF00));
+                            subResponse.setStyle(subResponse.getStyle().withColor(ChatFormatting.GREEN));
                             response.append(subResponse);
                             c.getSource().sendSuccess(response, true);
                         }
@@ -1129,7 +1130,7 @@ public class TurnBasedMinecraftMod {
                 .then(Commands.literal("player_slow_speed").executes(c -> {
                     TextComponent parent = new TextComponent("Use ");
                     TextComponent sub = new TextComponent("/tbm-server-edit player_slow_speed <0-100>");
-                    sub.setStyle(sub.getStyle().withColor(0xFFFFFF00));
+                    sub.setStyle(sub.getStyle().withColor(ChatFormatting.YELLOW));
                     parent.append(sub);
 
                     c.getSource().sendSuccess(parent, false);
@@ -1150,7 +1151,217 @@ public class TurnBasedMinecraftMod {
                         } else {
                             TextComponent response = new TextComponent("Successfully set player_slow_speed to: ");
                             TextComponent subResponse = new TextComponent(String.valueOf(slow_speed));
-                            subResponse.setStyle(subResponse.getStyle().withColor(0xFF00FF00));
+                            subResponse.setStyle(subResponse.getStyle().withColor(ChatFormatting.GREEN));
+                            response.append(subResponse);
+                            c.getSource().sendSuccess(response, true);
+                        }
+                        return 1;
+                    })))
+                .then(Commands.literal("player_attack_probability").executes(c -> {
+                    TextComponent parent = new TextComponent("Use ");
+                    TextComponent sub = new TextComponent("/tbm-server-edit player_attack_probability <1-100>");
+                    sub.setStyle(sub.getStyle().withColor(ChatFormatting.YELLOW));
+                    parent.append(sub);
+
+                    c.getSource().sendSuccess(parent, false);
+                    return 1;
+                })
+                    .then(Commands.argument("probability", IntegerArgumentType.integer()).executes(c -> {
+                        int probability = IntegerArgumentType.getInteger(c, "probability");
+                        // setPlayerAttackProbability() in Config validates the value. Set it, then fetch it again.
+                        TurnBasedMinecraftMod.proxy.getConfig().setPlayerAttackProbability(probability);
+                        probability = TurnBasedMinecraftMod.proxy.getConfig().getPlayerAttackProbability();
+                        if (!TurnBasedMinecraftMod.proxy.getConfig().updateConfig("server_config.player_attack_probability", probability)) {
+                            TurnBasedMinecraftMod.logger.warn(
+                                "Failed to set \"server_config.player_attack_probability\" in config file!");
+                            c.getSource().sendFailure(new TextComponent(
+                                "Failed to set player_attack_probability to \""
+                                    + probability
+                                    + "\" in config file!"));
+                        } else {
+                            TextComponent response = new TextComponent("Successfully set player_attack_probability to: ");
+                            TextComponent subResponse = new TextComponent(String.valueOf(probability));
+                            subResponse.setStyle(subResponse.getStyle().withColor(ChatFormatting.GREEN));
+                            response.append(subResponse);
+                            c.getSource().sendSuccess(response, true);
+                        }
+                        return 1;
+                    })))
+                .then(Commands.literal("player_evasion").executes(c -> {
+                    TextComponent parent = new TextComponent("Use ");
+                    TextComponent sub = new TextComponent("/tbm-server-edit player_evasion <0-100>");
+                    sub.setStyle(sub.getStyle().withColor(ChatFormatting.YELLOW));
+                    parent.append(sub);
+
+                    c.getSource().sendSuccess(parent, false);
+                    return 1;
+                })
+                    .then(Commands.argument("evasion", IntegerArgumentType.integer()).executes(c -> {
+                        int evasion = IntegerArgumentType.getInteger(c, "evasion");
+                        // setPlayerEvasion() in Config validates the value. Set it, then fetch it again.
+                        TurnBasedMinecraftMod.proxy.getConfig().setPlayerEvasion(evasion);
+                        evasion = TurnBasedMinecraftMod.proxy.getConfig().getPlayerEvasion();
+                        if (!TurnBasedMinecraftMod.proxy.getConfig().updateConfig("server_config.player_evasion", evasion)) {
+                            TurnBasedMinecraftMod.logger.warn(
+                                "Failed to set \"server_config.player_evasion\" in config file!");
+                            c.getSource().sendFailure(new TextComponent(
+                                "Failed to set player_evasion to \""
+                                    + evasion
+                                    + "\" in config file!"));
+                        } else {
+                            TextComponent response = new TextComponent("Successfully set player_evasion to: ");
+                            TextComponent subResponse = new TextComponent(String.valueOf(evasion));
+                            subResponse.setStyle(subResponse.getStyle().withColor(ChatFormatting.GREEN));
+                            response.append(subResponse);
+                            c.getSource().sendSuccess(response, true);
+                        }
+                        return 1;
+                    })))
+                .then(Commands.literal("defense_duration").executes(c -> {
+                    TextComponent parent = new TextComponent("Use ");
+                    TextComponent sub = new TextComponent("/tbm-server-edit defense_duration <0-5>");
+                    sub.setStyle(sub.getStyle().withColor(ChatFormatting.YELLOW));
+                    parent.append(sub);
+
+                    c.getSource().sendSuccess(parent, false);
+                    return 1;
+                })
+                    .then(Commands.argument("defends", IntegerArgumentType.integer()).executes(c -> {
+                        int defends = IntegerArgumentType.getInteger(c, "defends");
+                        // setDefenseDuration() in Config validates the value. Set it, then fetch it again.
+                        TurnBasedMinecraftMod.proxy.getConfig().setDefenseDuration(defends);
+                        defends = TurnBasedMinecraftMod.proxy.getConfig().getDefenseDuration();
+                        if (!TurnBasedMinecraftMod.proxy.getConfig().updateConfig("server_config.defense_duration", defends)) {
+                            TurnBasedMinecraftMod.logger.warn(
+                                "Failed to set \"server_config.defense_duration\" in config file!");
+                            c.getSource().sendFailure(new TextComponent(
+                                "Failed to set defense_druation to \""
+                                    + defends
+                                    + "\" in config file!"));
+                        } else {
+                            TextComponent response = new TextComponent("Successfully set defense_duration to: ");
+                            TextComponent subResponse = new TextComponent(String.valueOf(defends));
+                            subResponse.setStyle(subResponse.getStyle().withColor(ChatFormatting.GREEN));
+                            response.append(subResponse);
+                            c.getSource().sendSuccess(response, true);
+                        }
+                        return 1;
+                    })))
+                .then(Commands.literal("flee_good_probability").executes(c -> {
+                    TextComponent parent = new TextComponent("Use ");
+                    TextComponent sub = new TextComponent("/tbm-server-edit flee_good_probability <1-100>");
+                    sub.setStyle(sub.getStyle().withColor(ChatFormatting.YELLOW));
+                    parent.append(sub);
+
+                    c.getSource().sendSuccess(parent, false);
+                    return 1;
+                })
+                    .then(Commands.argument("probability", IntegerArgumentType.integer()).executes(c -> {
+                        int probability = IntegerArgumentType.getInteger(c, "probability");
+                        // setFleeGoodProbability() in Config validates the value. Set it, then fetch it again.
+                        TurnBasedMinecraftMod.proxy.getConfig().setFleeGoodProbability(probability);
+                        probability = TurnBasedMinecraftMod.proxy.getConfig().getFleeGoodProbability();
+                        if (!TurnBasedMinecraftMod.proxy.getConfig().updateConfig("server_config.flee_good_probability", probability)) {
+                            TurnBasedMinecraftMod.logger.warn(
+                                "Failed to set \"server_config.flee_good_probability\" in config file!");
+                            c.getSource().sendFailure(new TextComponent(
+                                "Failed to set flee_good_probability to \""
+                                    + probability
+                                    + "\" in config file!"));
+                        } else {
+                            TextComponent response = new TextComponent("Successfully set flee_good_probability to: ");
+                            TextComponent subResponse = new TextComponent(String.valueOf(probability));
+                            subResponse.setStyle(subResponse.getStyle().withColor(ChatFormatting.GREEN));
+                            response.append(subResponse);
+                            c.getSource().sendSuccess(response, true);
+                        }
+                        return 1;
+                    })))
+                .then(Commands.literal("flee_bad_probability").executes(c -> {
+                        TextComponent parent = new TextComponent("Use ");
+                        TextComponent sub = new TextComponent("/tbm-server-edit flee_bad_probability <1-100>");
+                        sub.setStyle(sub.getStyle().withColor(ChatFormatting.YELLOW));
+                        parent.append(sub);
+
+                        c.getSource().sendSuccess(parent, false);
+                        return 1;
+                    })
+                    .then(Commands.argument("probability", IntegerArgumentType.integer()).executes(c -> {
+                        int probability = IntegerArgumentType.getInteger(c, "probability");
+                        // setFleeBadProbability() in Config validates the value. Set it, then fetch it again.
+                        TurnBasedMinecraftMod.proxy.getConfig().setFleeBadProbability(probability);
+                        probability = TurnBasedMinecraftMod.proxy.getConfig().getFleeBadProbability();
+                        if (!TurnBasedMinecraftMod.proxy.getConfig().updateConfig("server_config.flee_bad_probability", probability)) {
+                            TurnBasedMinecraftMod.logger.warn(
+                                "Failed to set \"server_config.flee_bad_probability\" in config file!");
+                            c.getSource().sendFailure(new TextComponent(
+                                "Failed to set flee_bad_probability to \""
+                                    + probability
+                                    + "\" in config file!"));
+                        } else {
+                            TextComponent response = new TextComponent("Successfully set flee_bad_probability to: ");
+                            TextComponent subResponse = new TextComponent(String.valueOf(probability));
+                            subResponse.setStyle(subResponse.getStyle().withColor(ChatFormatting.GREEN));
+                            response.append(subResponse);
+                            c.getSource().sendSuccess(response, true);
+                        }
+                        return 1;
+                    })))
+                .then(Commands.literal("minimum_hit_percentage").executes(c -> {
+                    TextComponent parent = new TextComponent("Use ");
+                    TextComponent sub = new TextComponent("/tbm-server-edit minimum_hit_percentage <1-100>");
+                    sub.setStyle(sub.getStyle().withColor(ChatFormatting.YELLOW));
+                    parent.append(sub);
+
+                    c.getSource().sendSuccess(parent, false);
+                    return 1;
+                })
+                    .then(Commands.argument("percentage", IntegerArgumentType.integer()).executes(c -> {
+                        int percentage = IntegerArgumentType.getInteger(c, "percentage");
+                        // setMinimumHitPercentage() in Config validates the value. Set it, then fetch it again.
+                        TurnBasedMinecraftMod.proxy.getConfig().setMinimumHitPercentage(percentage);
+                        percentage = TurnBasedMinecraftMod.proxy.getConfig().getMinimumHitPercentage();
+                        if (!TurnBasedMinecraftMod.proxy.getConfig().updateConfig("server_config.minimum_hit_percentage", percentage)) {
+                            TurnBasedMinecraftMod.logger.warn(
+                                "Failed to set \"server_config.minimum_hit_percentage\" in config file!");
+                            c.getSource().sendFailure(new TextComponent(
+                                "Failed to set minimum_hit_percentage to \""
+                                    + percentage
+                                    + "\" in config file!"));
+                        } else {
+                            TextComponent response = new TextComponent("Successfully set minimum_hit_percentage to: ");
+                            TextComponent subResponse = new TextComponent(String.valueOf(percentage));
+                            subResponse.setStyle(subResponse.getStyle().withColor(ChatFormatting.GREEN));
+                            response.append(subResponse);
+                            c.getSource().sendSuccess(response, true);
+                        }
+                        return 1;
+                    })))
+                .then(Commands.literal("battle_turn_time_seconds").executes(c -> {
+                    TextComponent parent = new TextComponent("Use ");
+                    TextComponent sub = new TextComponent("/tbm-server-edit battle_turn_time_seconds <5-60>");
+                    sub.setStyle(sub.getStyle().withColor(ChatFormatting.YELLOW));
+                    parent.append(sub);
+
+                    c.getSource().sendSuccess(parent, false);
+                    return 1;
+                })
+                    .then(Commands.argument("seconds", IntegerArgumentType.integer()).executes(c -> {
+                        int seconds = IntegerArgumentType.getInteger(c, "seconds");
+                        // setDecisionDurationSeconds() in Config validates the value. Set it, then fetch it again.
+                        TurnBasedMinecraftMod.proxy.getConfig().setDecisionDurationSeconds(seconds);
+                        seconds = TurnBasedMinecraftMod.proxy.getConfig().getDecisionDurationSeconds();
+                        if (!TurnBasedMinecraftMod.proxy.getConfig().updateConfig("server_config.battle_turn_time_seconds", seconds)) {
+                            TurnBasedMinecraftMod.logger.warn(
+                                "Failed to set \"server_config.battle_turn_time_seconds\" in config file!");
+                            c.getSource().sendFailure(new TextComponent(
+                                "Failed to set battle_turn_time_seconds to \""
+                                    + seconds
+                                    + "\" in config file!"));
+                        } else {
+                            TextComponent response = new TextComponent("Successfully set battle_turn_time_seconds to: ");
+                            TextComponent subResponse = new TextComponent(String.valueOf(seconds));
+                            subResponse.setStyle(subResponse.getStyle().withColor(ChatFormatting.GREEN));
                             response.append(subResponse);
                             c.getSource().sendSuccess(response, true);
                         }