Compare commits

..

6 commits

Author SHA1 Message Date
a9df1e3c4d Update Changelog.md
All checks were successful
Build TurnBasedMC and create Release / check-release-exists (push) Successful in 2s
Build TurnBasedMC and create Release / build-and-create-release (push) Successful in 53s
2024-11-01 14:12:26 +09:00
be78ddc1b6 Version Forge 1.26.4 (MC 1.21.1) 2024-11-01 14:07:07 +09:00
42c69e8983 Allow Players to have "attack effect" 2024-11-01 14:07:07 +09:00
2572190b07 2/2 Player-specific TBMM battle config
Add support for custom stats per-player by player username.
2024-11-01 14:07:07 +09:00
2d52e898f4 1/2 Player-specific TBMM battle config
Add support for custom stats per-player by player username.
2024-11-01 14:07:07 +09:00
b13695d096 Update to Forge 52.0.24 (MC 1.21.1) 2024-11-01 13:31:32 +09:00
10 changed files with 645 additions and 238 deletions

View file

@ -1,5 +1,23 @@
# Upcoming changes # Upcoming changes
# Version Forge-1.26.4
Add support for "per-player-stats" in Turn-Based-Battle.
Update to Forge 52.0.24 (MC 1.21.1).
# Version NeoForge-1.26.4-MC-1.21.1
Add support for "per-player-stats" in Turn-Based-Battle.
Update to Neoforge 21.1.73 (Minecraft 1.21.1).
# Version NeoForge-1.26.4
Add support for "per-player-stats" in Turn-Based-Battle.
Update to NeoForge 21.3.6-beta (MC 1.21.3).
# Version Forge-1.26.3 # Version Forge-1.26.3
Tweak to "Ping" packet to not create client-local Battle instance if it does Tweak to "Ping" packet to not create client-local Battle instance if it does

View file

@ -77,7 +77,7 @@ configured for them.)
Simply invoke `./gradlew build` in the mod directory and after some time the Simply invoke `./gradlew build` in the mod directory and after some time the
finished jar will be saved at finished jar will be saved at
`build/libs/TurnBasedMinecraft-Forge-1.26.3-all.jar` `build/libs/TurnBasedMinecraft-Forge-1.26.4-all.jar`
# Reproducibility # Reproducibility

View file

@ -13,7 +13,7 @@ minecraft_version=1.21.1
# as they do not follow standard versioning conventions. # as they do not follow standard versioning conventions.
minecraft_version_range=[1.21.1,1.22) minecraft_version_range=[1.21.1,1.22)
# The Forge version must agree with the Minecraft version to get a valid artifact # The Forge version must agree with the Minecraft version to get a valid artifact
forge_version=52.0.22 forge_version=52.0.24
# The Forge version range can use any version of Forge as bounds or match the loader version range # The Forge version range can use any version of Forge as bounds or match the loader version range
forge_version_range=[0,) forge_version_range=[0,)
# The loader version range can only use the major version of Forge/FML as bounds # The loader version range can only use the major version of Forge/FML as bounds
@ -48,7 +48,7 @@ mod_name=TurnBasedMinecraftMod
# The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. # The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default.
mod_license=MIT mod_license=MIT
# The mod version. See https://semver.org/ # The mod version. See https://semver.org/
mod_version=1.26.3 mod_version=1.26.4
# The group ID for the mod. It is only important when publishing as an artifact to a Maven repository. # The group ID for the mod. It is only important when publishing as an artifact to a Maven repository.
# This should match the base package used for the mod sources. # This should match the base package used for the mod sources.
# See https://maven.apache.org/guides/mini/guide-naming-conventions.html # See https://maven.apache.org/guides/mini/guide-naming-conventions.html

View file

@ -482,22 +482,27 @@ public class ClientProxy extends CommonProxy {
MutableComponent text = Component.literal("Edit what value? "); MutableComponent text = Component.literal("Edit what value? ");
text.setStyle(text.getStyle().withColor(TextColor.fromRgb(0xFFFFFFFF)).withBold(false)); text.setStyle(text.getStyle().withColor(TextColor.fromRgb(0xFFFFFFFF)).withBold(false));
MutableComponent option = Component.literal("IgB"); MutableComponent option;
// HoverEvent.Action.SHOW_TEXT is probably SHOW_TEXT MutableComponent value;
option.setStyle(option.getStyle().withColor(TextColor.fromRgb(0xFFFFFF00)).withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tbm-edit edit ignoreBattle"))
.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.literal("IgnoreBattle"))));
MutableComponent value = Component.literal("(" + pkt.getEntityInfo().ignoreBattle + ") ");
value.setStyle(value.getStyle().withColor(TextColor.fromRgb(0xFFFFFFFF)));
option.getSiblings().add(value);
text.getSiblings().add(option);
option = Component.literal("AP"); if (pkt.getEntityInfo().playerName.isEmpty()) {
option.setStyle(option.getStyle().withColor(TextColor.fromRgb(0xFFFFFF00)).withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tbm-edit edit attackPower")) option = Component.literal("IgB");
.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.literal("AttackPower")))); // HoverEvent.Action.SHOW_TEXT is probably SHOW_TEXT
value = Component.literal("(" + pkt.getEntityInfo().attackPower + ") "); option.setStyle(option.getStyle().withColor(TextColor.fromRgb(0xFFFFFF00)).withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tbm-edit edit ignoreBattle"))
value.setStyle(value.getStyle().withColor(TextColor.fromRgb(0xFFFFFFFF))); .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.literal("IgnoreBattle"))));
option.getSiblings().add(value); value = Component.literal("(" + pkt.getEntityInfo().ignoreBattle + ") ");
text.getSiblings().add(option); value.setStyle(value.getStyle().withColor(TextColor.fromRgb(0xFFFFFFFF)));
option.getSiblings().add(value);
text.getSiblings().add(option);
option = Component.literal("AP");
option.setStyle(option.getStyle().withColor(TextColor.fromRgb(0xFFFFFF00)).withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tbm-edit edit attackPower"))
.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.literal("AttackPower"))));
value = Component.literal("(" + pkt.getEntityInfo().attackPower + ") ");
value.setStyle(value.getStyle().withColor(TextColor.fromRgb(0xFFFFFFFF)));
option.getSiblings().add(value);
text.getSiblings().add(option);
}
option = Component.literal("APr"); option = Component.literal("APr");
option.setStyle(option.getStyle().withColor(TextColor.fromRgb(0xFFFFFF00)).withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tbm-edit edit attackProbability")) option.setStyle(option.getStyle().withColor(TextColor.fromRgb(0xFFFFFF00)).withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tbm-edit edit attackProbability"))
@ -507,13 +512,15 @@ public class ClientProxy extends CommonProxy {
option.getSiblings().add(value); option.getSiblings().add(value);
text.getSiblings().add(option); text.getSiblings().add(option);
option = Component.literal("AV"); if (pkt.getEntityInfo().playerName.isEmpty()) {
option.setStyle(option.getStyle().withColor(TextColor.fromRgb(0xFFFFFF00)).withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tbm-edit edit attackVariance")) option = Component.literal("AV");
.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.literal("AttackVariance")))); option.setStyle(option.getStyle().withColor(TextColor.fromRgb(0xFFFFFF00)).withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tbm-edit edit attackVariance"))
value = Component.literal("(" + pkt.getEntityInfo().attackVariance + ") "); .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.literal("AttackVariance"))));
value.setStyle(value.getStyle().withColor(TextColor.fromRgb(0xFFFFFFFF))); value = Component.literal("(" + pkt.getEntityInfo().attackVariance + ") ");
option.getSiblings().add(value); value.setStyle(value.getStyle().withColor(TextColor.fromRgb(0xFFFFFFFF)));
text.getSiblings().add(option); option.getSiblings().add(value);
text.getSiblings().add(option);
}
option = Component.literal("AE"); option = Component.literal("AE");
option.setStyle(option.getStyle().withColor(TextColor.fromRgb(0xFFFFFF00)).withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tbm-edit edit attackEffect")) option.setStyle(option.getStyle().withColor(TextColor.fromRgb(0xFFFFFF00)).withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tbm-edit edit attackEffect"))
@ -531,21 +538,23 @@ public class ClientProxy extends CommonProxy {
option.getSiblings().add(value); option.getSiblings().add(value);
text.getSiblings().add(option); text.getSiblings().add(option);
option = Component.literal("DD"); if (pkt.getEntityInfo().playerName.isEmpty()) {
option.setStyle(option.getStyle().withColor(TextColor.fromRgb(0xFFFFFF00)).withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tbm-edit edit defenseDamage")) option = Component.literal("DD");
.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.literal("DefenseDamage")))); option.setStyle(option.getStyle().withColor(TextColor.fromRgb(0xFFFFFF00)).withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tbm-edit edit defenseDamage"))
value = Component.literal("(" + pkt.getEntityInfo().defenseDamage + ") "); .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.literal("DefenseDamage"))));
value.setStyle(value.getStyle().withColor(TextColor.fromRgb(0xFFFFFFFF))); value = Component.literal("(" + pkt.getEntityInfo().defenseDamage + ") ");
option.getSiblings().add(value); value.setStyle(value.getStyle().withColor(TextColor.fromRgb(0xFFFFFFFF)));
text.getSiblings().add(option); option.getSiblings().add(value);
text.getSiblings().add(option);
option = Component.literal("DDPr"); option = Component.literal("DDPr");
option.setStyle(option.getStyle().withColor(TextColor.fromRgb(0xFFFFFF00)).withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tbm-edit edit defenseDamageProbability")) option.setStyle(option.getStyle().withColor(TextColor.fromRgb(0xFFFFFF00)).withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tbm-edit edit defenseDamageProbability"))
.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.literal("DefenseDamageProbability")))); .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.literal("DefenseDamageProbability"))));
value = Component.literal("(" + pkt.getEntityInfo().defenseDamageProbability + "%) "); value = Component.literal("(" + pkt.getEntityInfo().defenseDamageProbability + "%) ");
value.setStyle(value.getStyle().withColor(TextColor.fromRgb(0xFFFFFFFF))); value.setStyle(value.getStyle().withColor(TextColor.fromRgb(0xFFFFFFFF)));
option.getSiblings().add(value); option.getSiblings().add(value);
text.getSiblings().add(option); text.getSiblings().add(option);
}
option = Component.literal("E"); option = Component.literal("E");
option.setStyle(option.getStyle().withColor(TextColor.fromRgb(0xFFFFFF00)).withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tbm-edit edit evasion")) option.setStyle(option.getStyle().withColor(TextColor.fromRgb(0xFFFFFF00)).withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tbm-edit edit evasion"))
@ -563,37 +572,55 @@ public class ClientProxy extends CommonProxy {
option.getSiblings().add(value); option.getSiblings().add(value);
text.getSiblings().add(option); text.getSiblings().add(option);
option = Component.literal("C"); option = Component.literal("HS");
option.setStyle(option.getStyle().withColor(TextColor.fromRgb(0xFFFFFF00)).withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tbm-edit edit category")) option.setStyle(option.getStyle().withColor(TextColor.fromRgb(0xFFFFFF00)).withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tbm-edit edit hasteSpeed"))
.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.literal("Category")))); .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.literal("HasteSpeed"))));
value = Component.literal("(" + pkt.getEntityInfo().category + ") "); value = Component.literal("(" + pkt.getEntityInfo().hasteSpeed + ") ");
value.setStyle(value.getStyle().withColor(TextColor.fromRgb(0xFFFFFFFF))); value.setStyle(value.getStyle().withColor(TextColor.fromRgb(0xFFFFFFFF)));
option.getSiblings().add(value); option.getSiblings().add(value);
text.getSiblings().add(option); text.getSiblings().add(option);
option = Component.literal("DecA"); option = Component.literal("SS");
option.setStyle(option.getStyle().withColor(TextColor.fromRgb(0xFFFFFF00)).withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tbm-edit edit decisionAttack")) option.setStyle(option.getStyle().withColor(TextColor.fromRgb(0xFFFFFF00)).withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tbm-edit edit slowSpeed"))
.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.literal("DecisionAttack")))); .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.literal("SlowSpeed"))));
value = Component.literal("(" + pkt.getEntityInfo().decisionAttack + "%) "); value = Component.literal("(" + pkt.getEntityInfo().slowSpeed + ") ");
value.setStyle(value.getStyle().withColor(TextColor.fromRgb(0xFFFFFFFF))); value.setStyle(value.getStyle().withColor(TextColor.fromRgb(0xFFFFFFFF)));
option.getSiblings().add(value); option.getSiblings().add(value);
text.getSiblings().add(option); text.getSiblings().add(option);
option = Component.literal("DecD"); if (pkt.getEntityInfo().playerName.isEmpty()) {
option.setStyle(option.getStyle().withColor(TextColor.fromRgb(0xFFFFFF00)).withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tbm-edit edit decisionDefend")) option = Component.literal("C");
.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.literal("DecisionDefend")))); option.setStyle(option.getStyle().withColor(TextColor.fromRgb(0xFFFFFF00)).withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tbm-edit edit category"))
value = Component.literal("(" + pkt.getEntityInfo().decisionDefend + "%) "); .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.literal("Category"))));
value.setStyle(value.getStyle().withColor(TextColor.fromRgb(0xFFFFFFFF))); value = Component.literal("(" + pkt.getEntityInfo().category + ") ");
option.getSiblings().add(value); value.setStyle(value.getStyle().withColor(TextColor.fromRgb(0xFFFFFFFF)));
text.getSiblings().add(option); option.getSiblings().add(value);
text.getSiblings().add(option);
option = Component.literal("DecF"); option = Component.literal("DecA");
option.setStyle(option.getStyle().withColor(TextColor.fromRgb(0xFFFFFF00)).withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tbm-edit edit decisionFlee")) option.setStyle(option.getStyle().withColor(TextColor.fromRgb(0xFFFFFF00)).withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tbm-edit edit decisionAttack"))
.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.literal("DecisionFlee")))); .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.literal("DecisionAttack"))));
value = Component.literal("(" + pkt.getEntityInfo().decisionFlee + "%) "); value = Component.literal("(" + pkt.getEntityInfo().decisionAttack + "%) ");
value.setStyle(value.getStyle().withColor(TextColor.fromRgb(0xFFFFFFFF))); value.setStyle(value.getStyle().withColor(TextColor.fromRgb(0xFFFFFFFF)));
option.getSiblings().add(value); option.getSiblings().add(value);
text.getSiblings().add(option); text.getSiblings().add(option);
option = Component.literal("DecD");
option.setStyle(option.getStyle().withColor(TextColor.fromRgb(0xFFFFFF00)).withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tbm-edit edit decisionDefend"))
.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.literal("DecisionDefend"))));
value = Component.literal("(" + pkt.getEntityInfo().decisionDefend + "%) ");
value.setStyle(value.getStyle().withColor(TextColor.fromRgb(0xFFFFFFFF)));
option.getSiblings().add(value);
text.getSiblings().add(option);
option = Component.literal("DecF");
option.setStyle(option.getStyle().withColor(TextColor.fromRgb(0xFFFFFF00)).withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tbm-edit edit decisionFlee"))
.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.literal("DecisionFlee"))));
value = Component.literal("(" + pkt.getEntityInfo().decisionFlee + "%) ");
value.setStyle(value.getStyle().withColor(TextColor.fromRgb(0xFFFFFFFF)));
option.getSiblings().add(value);
text.getSiblings().add(option);
}
option = Component.literal("Finished Editing"); option = Component.literal("Finished Editing");
option.setStyle(option.getStyle().withColor(TextColor.fromRgb(0xFF00FF00)).withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tbm-edit finish"))); option.setStyle(option.getStyle().withColor(TextColor.fromRgb(0xFF00FF00)).withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tbm-edit finish")));
@ -1303,6 +1330,44 @@ public class ClientProxy extends CommonProxy {
TurnBasedMinecraftMod.proxy.displayComponent(parentComponent); TurnBasedMinecraftMod.proxy.displayComponent(parentComponent);
break; break;
} }
case EDIT_HASTE_SPEED: {
MutableComponent text = Component.literal("haste speed: ");
text.setStyle(text.getStyle().withColor(TextColor.fromRgb(0xFFFFFFFF)).withBold(false));
for (int i = 0; i <= 100; i += 10) {
MutableComponent option = Component.literal(Integer.toString(i));
option.setStyle(option.getStyle().withColor(TextColor.fromRgb(0xFFFFFF00)).withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tbm-edit edit hasteSpeed " + Integer.toString(i))));
text.getSiblings().add(option);
if (i < 100) {
text.getSiblings().add(Component.literal(", "));
}
}
text.getSiblings().add(Component.literal(" (or use command \"/tbm-edit edit hasteSpeed <integer>\")"));
parentComponent.getSiblings().add(text);
TurnBasedMinecraftMod.proxy.displayComponent(parentComponent);
break;
}
case EDIT_SLOW_SPEED: {
MutableComponent text = Component.literal("slow speed: ");
text.setStyle(text.getStyle().withColor(TextColor.fromRgb(0xFFFFFFFF)).withBold(false));
for (int i = 0; i <= 100; i += 10) {
MutableComponent option = Component.literal(Integer.toString(i));
option.setStyle(option.getStyle().withColor(TextColor.fromRgb(0xFFFFFF00)).withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tbm-edit edit slowSpeed " + Integer.toString(i))));
text.getSiblings().add(option);
if (i < 100) {
text.getSiblings().add(Component.literal(", "));
}
}
text.getSiblings().add(Component.literal(" (or use command \"/tbm-edit edit slowSpeed <integer>\")"));
parentComponent.getSiblings().add(text);
TurnBasedMinecraftMod.proxy.displayComponent(parentComponent);
break;
}
case EDIT_CATEGORY: { case EDIT_CATEGORY: {
MutableComponent text = Component.literal("category: "); MutableComponent text = Component.literal("category: ");
text.setStyle(text.getStyle().withColor(TextColor.fromRgb(0xFFFFFFFF)).withBold(false)); text.setStyle(text.getStyle().withColor(TextColor.fromRgb(0xFFFFFFFF)).withBold(false));
@ -1473,6 +1538,10 @@ public class ClientProxy extends CommonProxy {
TurnBasedMinecraftMod.proxy.displayComponent(parentComponent); TurnBasedMinecraftMod.proxy.displayComponent(parentComponent);
break; break;
} }
case PICK_PLAYER: {
TurnBasedMinecraftMod.proxy.displayString("Use \"/tbm-edit player <player_name>\"");
break;
}
default: default:
break; break;
} }

View file

@ -134,6 +134,9 @@ public class Battle {
} catch (NullPointerException exception) { } catch (NullPointerException exception) {
entityInfo = null; entityInfo = null;
} }
if (entityInfo == null) {
entityInfo = TurnBasedMinecraftMod.proxy.getConfig().getPlayerInfo(e.getName().getString());
}
if (entityInfo == null) { if (entityInfo == null) {
entityInfo = TurnBasedMinecraftMod.proxy.getConfig().getMatchingEntityInfo(e); entityInfo = TurnBasedMinecraftMod.proxy.getConfig().getMatchingEntityInfo(e);
} }
@ -166,6 +169,9 @@ public class Battle {
} catch (NullPointerException exception) { } catch (NullPointerException exception) {
entityInfo = null; entityInfo = null;
} }
if (entityInfo == null) {
entityInfo = TurnBasedMinecraftMod.proxy.getConfig().getPlayerInfo(e.getName().getString());
}
if (entityInfo == null) { if (entityInfo == null) {
entityInfo = TurnBasedMinecraftMod.proxy.getConfig().getMatchingEntityInfo(e); entityInfo = TurnBasedMinecraftMod.proxy.getConfig().getMatchingEntityInfo(e);
} }
@ -268,6 +274,9 @@ public class Battle {
} catch (NullPointerException exception) { } catch (NullPointerException exception) {
entityInfo = null; entityInfo = null;
} }
if (entityInfo == null) {
entityInfo = TurnBasedMinecraftMod.proxy.getConfig().getPlayerInfo(e.getName().getString());
}
if (entityInfo == null) { if (entityInfo == null) {
entityInfo = TurnBasedMinecraftMod.proxy.getConfig().getMatchingEntityInfo(e); entityInfo = TurnBasedMinecraftMod.proxy.getConfig().getMatchingEntityInfo(e);
} }
@ -316,6 +325,9 @@ public class Battle {
} catch (NullPointerException exception) { } catch (NullPointerException exception) {
entityInfo = null; entityInfo = null;
} }
if (entityInfo == null) {
entityInfo = TurnBasedMinecraftMod.proxy.getConfig().getPlayerInfo(e.getName().getString());
}
if (entityInfo == null) { if (entityInfo == null) {
entityInfo = TurnBasedMinecraftMod.proxy.getConfig().getMatchingEntityInfo(e); entityInfo = TurnBasedMinecraftMod.proxy.getConfig().getMatchingEntityInfo(e);
} }
@ -781,7 +793,7 @@ public class Battle {
case ATTACK: case ATTACK:
debugLog += " attack"; debugLog += " attack";
Combatant target = null; Combatant target = null;
if (next.entity instanceof Player) { if (next.entity instanceof Player player) {
debugLog += " as player"; debugLog += " as player";
target = sideA.get(next.targetEntityID); target = sideA.get(next.targetEntityID);
if (target == null) { if (target == null) {
@ -790,10 +802,10 @@ public class Battle {
if (target == null || !target.entity.isAlive() || target == next) { if (target == null || !target.entity.isAlive() || target == next) {
continue; continue;
} }
ItemStack heldItemStack = ((Player) next.entity).getMainHandItem(); ItemStack heldItemStack = player.getMainHandItem();
if (heldItemStack.getItem() instanceof BowItem) { if (heldItemStack.getItem() instanceof BowItem) {
debugLog += " with bow"; debugLog += " with bow";
if (Utility.doesPlayerHaveArrows((Player) next.entity)) { if (Utility.doesPlayerHaveArrows(player)) {
final Entity nextEntity = next.entity; final Entity nextEntity = next.entity;
final Entity targetEntity = target.entity; final Entity targetEntity = target.entity;
final float yawDirection = Utility.yawDirection(next.entity.getX(), next.entity.getZ(), target.entity.getX(), target.entity.getZ()); final float yawDirection = Utility.yawDirection(next.entity.getX(), next.entity.getZ(), target.entity.getX(), target.entity.getZ());
@ -815,8 +827,8 @@ public class Battle {
continue; continue;
} else if (heldItemStack.getItem() instanceof CrossbowItem) { } else if (heldItemStack.getItem() instanceof CrossbowItem) {
debugLog += " with crossbow"; debugLog += " with crossbow";
if (Utility.doesPlayerHaveArrows((Player)next.entity)) {
// Similar to attack with bow. // Similar to attack with bow.
if (Utility.doesPlayerHaveArrows(player)) {
final Entity nextEntity = next.entity; final Entity nextEntity = next.entity;
final Entity targetEntity = target.entity; final Entity targetEntity = target.entity;
final float yawDirection = Utility.yawDirection(next.entity.getX(), next.entity.getZ(), target.entity.getX(), target.entity.getZ()); final float yawDirection = Utility.yawDirection(next.entity.getX(), next.entity.getZ(), target.entity.getX(), target.entity.getZ());
@ -829,7 +841,7 @@ public class Battle {
((ServerPlayer) nextEntity).connection.teleport(nextEntity.getX(), nextEntity.getY(), nextEntity.getZ(), yawDirection, pitchDirection); ((ServerPlayer) nextEntity).connection.teleport(nextEntity.getX(), nextEntity.getY(), nextEntity.getZ(), yawDirection, pitchDirection);
CrossbowItem itemCrossbow = (CrossbowItem) heldItemStack.getItem(); CrossbowItem itemCrossbow = (CrossbowItem) heldItemStack.getItem();
TurnBasedMinecraftMod.proxy.getAttackerViaBowSet().add(new AttackerViaBow(nextEntity, getId())); TurnBasedMinecraftMod.proxy.getAttackerViaBowSet().add(new AttackerViaBow(nextEntity, getId()));
itemCrossbow.releaseUsing(((Player) nextEntity).getMainHandItem(), nextEntity.level(), (LivingEntity) nextEntity, -100); itemCrossbow.releaseUsing(player.getMainHandItem(), nextEntity.level(), (LivingEntity) nextEntity, -100);
itemCrossbow.use(nextEntity.level(), (Player)nextEntity, InteractionHand.MAIN_HAND); itemCrossbow.use(nextEntity.level(), (Player)nextEntity, InteractionHand.MAIN_HAND);
sendMessageToAllPlayers(PacketBattleMessage.MessageType.FIRED_ARROW, nextEntity.getId(), targetEntity.getId(), 0); sendMessageToAllPlayers(PacketBattleMessage.MessageType.FIRED_ARROW, nextEntity.getId(), targetEntity.getId(), 0);
} else { } else {
@ -838,9 +850,18 @@ public class Battle {
continue; continue;
} }
debugLog += " without bow"; debugLog += " without bow";
int hitChance = TurnBasedMinecraftMod.proxy.getConfig().getPlayerAttackProbability(); int hitChance;
if (next.entityInfo != null && !next.entityInfo.playerName.isEmpty()) {
hitChance = next.entityInfo.attackProbability;
} else {
hitChance = TurnBasedMinecraftMod.proxy.getConfig().getPlayerAttackProbability();
}
if (target.entity instanceof Player) { if (target.entity instanceof Player) {
hitChance = hitChance * (100 - TurnBasedMinecraftMod.proxy.getConfig().getPlayerEvasion()) / 100; if (target.entityInfo != null && !target.entityInfo.playerName.isEmpty()) {
hitChance = hitChance * (100 - target.entityInfo.evasion) / 100;
} else {
hitChance = hitChance * (100 - TurnBasedMinecraftMod.proxy.getConfig().getPlayerEvasion()) / 100;
}
} else { } else {
hitChance = hitChance * (100 - target.entityInfo.evasion) / 100; hitChance = hitChance * (100 - target.entityInfo.evasion) / 100;
} }
@ -877,6 +898,13 @@ public class Battle {
((Player) nextEntity).attack(targetEntity); ((Player) nextEntity).attack(targetEntity);
TurnBasedMinecraftMod.proxy.setAttackingEntity(null); TurnBasedMinecraftMod.proxy.setAttackingEntity(null);
sendMessageToAllPlayers(PacketBattleMessage.MessageType.ATTACK, nextEntity.getId(), targetEntity.getId(), TurnBasedMinecraftMod.proxy.getAttackingDamage()); sendMessageToAllPlayers(PacketBattleMessage.MessageType.ATTACK, nextEntity.getId(), targetEntity.getId(), TurnBasedMinecraftMod.proxy.getAttackingDamage());
// Attack effect
if (next.entityInfo != null && next.entityInfo.attackEffect != EntityInfo.Effect.UNKNOWN && next.entityInfo.attackEffectProbability > 0) {
if (random.nextInt(100) < next.entityInfo.attackEffectProbability) {
next.entityInfo.attackEffect.applyEffectToEntity((LivingEntity)targetEntity);
sendMessageToAllPlayers(PacketBattleMessage.MessageType.WAS_AFFECTED, nextEntity.getId(), targetEntity.getId(), 0, next.entityInfo.attackEffect.getAffectedString());
}
}
if (defenseDamageTriggered) { if (defenseDamageTriggered) {
// defense damage // defense damage
DamageSource defenseDamageSource = targetEntity.damageSources().mobAttack((LivingEntity) targetEntity); DamageSource defenseDamageSource = targetEntity.damageSources().mobAttack((LivingEntity) targetEntity);
@ -1021,48 +1049,111 @@ public class Battle {
int fastestEnemySpeed = 0; int fastestEnemySpeed = 0;
if (next.isSideA) { if (next.isSideA) {
for (Combatant c : sideB.values()) { for (Combatant c : sideB.values()) {
if (c.entity instanceof Player) { if (c.entity instanceof Player player) {
int playerSpeed = TurnBasedMinecraftMod.proxy.getConfig().getPlayerSpeed(); int playerSpeed;
if (((Player) c.entity).hasEffect(MobEffects.MOVEMENT_SPEED)) { if (c.entityInfo != null && !c.entityInfo.playerName.isEmpty()) {
playerSpeed = TurnBasedMinecraftMod.proxy.getConfig().getPlayerHasteSpeed(); playerSpeed = c.entityInfo.speed;
} else if (((Player) c.entity).hasEffect(MobEffects.MOVEMENT_SLOWDOWN)) { } else {
playerSpeed = TurnBasedMinecraftMod.proxy.getConfig().getPlayerSlowSpeed(); playerSpeed = TurnBasedMinecraftMod.proxy.getConfig().getPlayerSpeed();
}
if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) {
if (c.entityInfo != null && !c.entityInfo.playerName.isEmpty()) {
playerSpeed = c.entityInfo.hasteSpeed;
} else {
playerSpeed = TurnBasedMinecraftMod.proxy.getConfig().getPlayerHasteSpeed();
}
} else if (player.hasEffect(MobEffects.MOVEMENT_SLOWDOWN)) {
if (c.entityInfo != null && !c.entityInfo.playerName.isEmpty()) {
playerSpeed = c.entityInfo.slowSpeed;
} else {
playerSpeed = TurnBasedMinecraftMod.proxy.getConfig().getPlayerSlowSpeed();
}
} }
if (playerSpeed > fastestEnemySpeed) { if (playerSpeed > fastestEnemySpeed) {
fastestEnemySpeed = TurnBasedMinecraftMod.proxy.getConfig().getPlayerSpeed(); fastestEnemySpeed = TurnBasedMinecraftMod.proxy.getConfig().getPlayerSpeed();
} }
} else { } else {
if (c.entityInfo.speed > fastestEnemySpeed) { if (c.entity instanceof LivingEntity livingEntity) {
if (livingEntity.hasEffect(MobEffects.MOVEMENT_SPEED)) {
if (c.entityInfo.hasteSpeed > fastestEnemySpeed) {
fastestEnemySpeed = c.entityInfo.hasteSpeed;
}
} else if (livingEntity.hasEffect(MobEffects.MOVEMENT_SLOWDOWN)) {
if (c.entityInfo.slowSpeed > fastestEnemySpeed) {
fastestEnemySpeed = c.entityInfo.slowSpeed;
}
} else if (c.entityInfo.speed > fastestEnemySpeed) {
fastestEnemySpeed = c.entityInfo.speed;
}
} else if (c.entityInfo.speed > fastestEnemySpeed) {
fastestEnemySpeed = c.entityInfo.speed; fastestEnemySpeed = c.entityInfo.speed;
} }
} }
} }
} else { } else {
for (Combatant c : sideA.values()) { for (Combatant c : sideA.values()) {
if (c.entity instanceof Player) { if (c.entity instanceof Player player) {
int playerSpeed = TurnBasedMinecraftMod.proxy.getConfig().getPlayerSpeed(); int playerSpeed;
if (((Player) c.entity).hasEffect(MobEffects.MOVEMENT_SPEED)) { if (c.entityInfo != null && !c.entityInfo.playerName.isEmpty()) {
playerSpeed = TurnBasedMinecraftMod.proxy.getConfig().getPlayerHasteSpeed(); playerSpeed = c.entityInfo.speed;
} else if (((Player) c.entity).hasEffect(MobEffects.MOVEMENT_SLOWDOWN)) { } else {
playerSpeed = TurnBasedMinecraftMod.proxy.getConfig().getPlayerSlowSpeed(); playerSpeed = TurnBasedMinecraftMod.proxy.getConfig().getPlayerSpeed();
}
if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) {
if (c.entityInfo != null && !c.entityInfo.playerName.isEmpty()) {
playerSpeed = c.entityInfo.hasteSpeed;
} else {
playerSpeed = TurnBasedMinecraftMod.proxy.getConfig().getPlayerHasteSpeed();
}
} else if (player.hasEffect(MobEffects.MOVEMENT_SLOWDOWN)) {
if (c.entityInfo != null && !c.entityInfo.playerName.isEmpty()) {
playerSpeed = c.entityInfo.slowSpeed;
} else {
playerSpeed = TurnBasedMinecraftMod.proxy.getConfig().getPlayerSlowSpeed();
}
} }
if (playerSpeed > fastestEnemySpeed) { if (playerSpeed > fastestEnemySpeed) {
fastestEnemySpeed = TurnBasedMinecraftMod.proxy.getConfig().getPlayerSpeed(); fastestEnemySpeed = TurnBasedMinecraftMod.proxy.getConfig().getPlayerSpeed();
} }
} else { } else {
if (c.entityInfo.speed > fastestEnemySpeed) { if (c.entity instanceof LivingEntity livingEntity) {
if (livingEntity.hasEffect(MobEffects.MOVEMENT_SPEED)) {
if (c.entityInfo.hasteSpeed > fastestEnemySpeed) {
fastestEnemySpeed = c.entityInfo.hasteSpeed;
}
} else if (livingEntity.hasEffect(MobEffects.MOVEMENT_SLOWDOWN)) {
if (c.entityInfo.slowSpeed > fastestEnemySpeed) {
fastestEnemySpeed = c.entityInfo.slowSpeed;
}
} else if (c.entityInfo.speed > fastestEnemySpeed) {
fastestEnemySpeed = c.entityInfo.speed;
}
} else if (c.entityInfo.speed > fastestEnemySpeed) {
fastestEnemySpeed = c.entityInfo.speed; fastestEnemySpeed = c.entityInfo.speed;
} }
} }
} }
} }
int fleeProbability = 0; int fleeProbability = 0;
if (next.entity instanceof Player) { if (next.entity instanceof Player player) {
int playerSpeed = TurnBasedMinecraftMod.proxy.getConfig().getPlayerSpeed(); int playerSpeed;
if (((Player) next.entity).hasEffect(MobEffects.MOVEMENT_SPEED)) { if (next.entityInfo != null && !next.entityInfo.playerName.isEmpty()) {
playerSpeed = TurnBasedMinecraftMod.proxy.getConfig().getPlayerHasteSpeed(); playerSpeed = next.entityInfo.speed;
} else if (((Player) next.entity).hasEffect(MobEffects.MOVEMENT_SLOWDOWN)) { } else {
playerSpeed = TurnBasedMinecraftMod.proxy.getConfig().getPlayerSlowSpeed(); playerSpeed = TurnBasedMinecraftMod.proxy.getConfig().getPlayerSpeed();
}
if (player.hasEffect(MobEffects.MOVEMENT_SPEED)) {
if (next.entityInfo != null && !next.entityInfo.playerName.isEmpty()) {
playerSpeed = next.entityInfo.hasteSpeed;
} else {
playerSpeed = TurnBasedMinecraftMod.proxy.getConfig().getPlayerHasteSpeed();
}
} else if (player.hasEffect(MobEffects.MOVEMENT_SLOWDOWN)) {
if (next.entityInfo != null && !next.entityInfo.playerName.isEmpty()) {
playerSpeed = next.entityInfo.slowSpeed;
} else {
playerSpeed = TurnBasedMinecraftMod.proxy.getConfig().getPlayerSlowSpeed();
}
} }
if (fastestEnemySpeed >= playerSpeed) { if (fastestEnemySpeed >= playerSpeed) {
fleeProbability = TurnBasedMinecraftMod.proxy.getConfig().getFleeBadProbability(); fleeProbability = TurnBasedMinecraftMod.proxy.getConfig().getFleeBadProbability();

View file

@ -25,6 +25,7 @@ public class Config
private boolean battleDecisionDurationForever = false; private boolean battleDecisionDurationForever = false;
private Map<String, EntityInfo> entityInfoMap; private Map<String, EntityInfo> entityInfoMap;
private Map<String, EntityInfo> customEntityInfoMap; private Map<String, EntityInfo> customEntityInfoMap;
private Map<String, EntityInfo> customPlayerInfoMap;
private Set<String> ignoreBattleTypes; private Set<String> ignoreBattleTypes;
private Logger logger; private Logger logger;
private int playerSpeed = 50; private int playerSpeed = 50;
@ -58,6 +59,7 @@ public class Config
{ {
entityInfoMap = new HashMap<String, EntityInfo>(); entityInfoMap = new HashMap<String, EntityInfo>();
customEntityInfoMap = new HashMap<String, EntityInfo>(); customEntityInfoMap = new HashMap<String, EntityInfo>();
customPlayerInfoMap = new HashMap<String, EntityInfo>();
ignoreBattleTypes = new HashSet<String>(); ignoreBattleTypes = new HashSet<String>();
this.logger = logger; this.logger = logger;
battleIgnoringPlayers = new HashSet<Integer>(); battleIgnoringPlayers = new HashSet<Integer>();
@ -518,23 +520,33 @@ public class Config
logger.error("Entity with invalid custom_name (must be a string), skipping..."); logger.error("Entity with invalid custom_name (must be a string), skipping...");
continue; continue;
} }
} else if (nestedConf.contains("player_name")) {
try {
eInfo.playerName = nestedConf.get("player_name");
name = eInfo.playerName;
} catch (ClassCastException e) {
logger.error("Entity with invalid player_name (must be a string), skipping...");
continue;
}
} else { } else {
logger.error("Entity must have \"name\" or \"custom_name\" entry"); logger.error("Entity must have \"name\" or \"custom_name\" or \"player_name\" entry");
continue; continue;
} }
try { if (eInfo.playerName.isEmpty()) {
eInfo.attackPower = nestedConf.getInt("attack_power"); try {
if(eInfo.attackPower < 0) { eInfo.attackPower = nestedConf.getInt("attack_power");
logClampedValueEntity("attack_power", name, Integer.toString(eInfo.attackPower), "0"); if (eInfo.attackPower < 0) {
eInfo.attackPower = 0; logClampedValueEntity("attack_power", name, Integer.toString(eInfo.attackPower), "0");
eInfo.attackPower = 0;
}
} catch (ClassCastException e) {
logEntityInvalidValue("attack_power", name, "3");
eInfo.attackPower = 3;
} catch (NullPointerException e) {
logEntityMissingRequiredValue("attack_power", name, "3");
eInfo.attackPower = 3;
} }
} catch (ClassCastException e) {
logEntityInvalidValue("attack_power", name, "3");
eInfo.attackPower = 3;
} catch (NullPointerException e) {
logEntityMissingRequiredValue("attack_power", name, "3");
eInfo.attackPower = 3;
} }
try { try {
@ -582,49 +594,51 @@ public class Config
logEntityMissingOptionalValue("attack_effect", name, "unknown"); logEntityMissingOptionalValue("attack_effect", name, "unknown");
} }
try { if (eInfo.playerName.isEmpty()) {
eInfo.attackVariance = nestedConf.getInt("attack_variance"); try {
if(eInfo.attackVariance < 0) { eInfo.attackVariance = nestedConf.getInt("attack_variance");
logClampedValueEntity("attack_variance", name, Integer.toString(eInfo.attackVariance), "0"); if (eInfo.attackVariance < 0) {
eInfo.attackVariance = 0; logClampedValueEntity("attack_variance", name, Integer.toString(eInfo.attackVariance), "0");
} eInfo.attackVariance = 0;
} catch (ClassCastException e) {
eInfo.attackVariance = 0;
logEntityInvalidValue("attack_variance", name, "0");
} catch (NullPointerException e) {
eInfo.attackVariance = 0;
logEntityMissingOptionalValue("attack_variance", name, "0");
}
try {
eInfo.defenseDamage = nestedConf.getInt("defense_damage");
if(eInfo.defenseDamage < 0) {
logClampedValueEntity("defense_damage", name, Integer.toString(eInfo.defenseDamage), "0");
eInfo.defenseDamage = 0;
} else if(eInfo.defenseDamage != 0) {
try {
eInfo.defenseDamageProbability = nestedConf.getInt("defense_damage_probability");
if(eInfo.defenseDamageProbability < 1) {
logClampedValueEntity("defense_damage_probability", name, Integer.toString(eInfo.defenseDamageProbability), "1");
eInfo.defenseDamageProbability = 1;
} else if(eInfo.defenseDamageProbability > 100) {
logClampedValueEntity("defense_damage_probability", name, Integer.toString(eInfo.defenseDamageProbability), "100");
eInfo.defenseDamageProbability = 100;
}
} catch (ClassCastException e) {
eInfo.defenseDamage = 0;
logger.warn("Entity \"" + name + "\" has specified defense_damage but defense_damage_probability is invalid, disabling defense_damage");
} catch (NullPointerException e) {
eInfo.defenseDamage = 0;
logger.warn("Entity \"" + name + "\" has specified defense_damage but defense_damage_probability is missing, disabling defense_damage");
} }
} catch (ClassCastException e) {
eInfo.attackVariance = 0;
logEntityInvalidValue("attack_variance", name, "0");
} catch (NullPointerException e) {
eInfo.attackVariance = 0;
logEntityMissingOptionalValue("attack_variance", name, "0");
}
try {
eInfo.defenseDamage = nestedConf.getInt("defense_damage");
if (eInfo.defenseDamage < 0) {
logClampedValueEntity("defense_damage", name, Integer.toString(eInfo.defenseDamage), "0");
eInfo.defenseDamage = 0;
} else if (eInfo.defenseDamage != 0) {
try {
eInfo.defenseDamageProbability = nestedConf.getInt("defense_damage_probability");
if (eInfo.defenseDamageProbability < 1) {
logClampedValueEntity("defense_damage_probability", name, Integer.toString(eInfo.defenseDamageProbability), "1");
eInfo.defenseDamageProbability = 1;
} else if (eInfo.defenseDamageProbability > 100) {
logClampedValueEntity("defense_damage_probability", name, Integer.toString(eInfo.defenseDamageProbability), "100");
eInfo.defenseDamageProbability = 100;
}
} catch (ClassCastException e) {
eInfo.defenseDamage = 0;
logger.warn("Entity \"" + name + "\" has specified defense_damage but defense_damage_probability is invalid, disabling defense_damage");
} catch (NullPointerException e) {
eInfo.defenseDamage = 0;
logger.warn("Entity \"" + name + "\" has specified defense_damage but defense_damage_probability is missing, disabling defense_damage");
}
}
} catch (ClassCastException e) {
eInfo.defenseDamage = 0;
logEntityInvalidValue("defense_damage", name, "0");
} catch (NullPointerException e) {
eInfo.defenseDamage = 0;
logEntityMissingOptionalValue("defense_damage", name, "0");
} }
} catch (ClassCastException e) {
eInfo.defenseDamage = 0;
logEntityInvalidValue("defense_damage", name, "0");
} catch (NullPointerException e) {
eInfo.defenseDamage = 0;
logEntityMissingOptionalValue("defense_damage", name, "0");
} }
try { try {
@ -655,82 +669,106 @@ public class Config
} }
try { try {
eInfo.ignoreBattle = nestedConf.get("ignore_battle"); eInfo.hasteSpeed = nestedConf.getInt("haste_speed");
} catch (ClassCastException e) { } catch (ClassCastException e) {
logEntityInvalidValue("ignore_battle", name, "false"); logEntityInvalidValue("haste_speed", name, "80");
eInfo.ignoreBattle = false; eInfo.hasteSpeed = 80;
} catch (NullPointerException e) { } catch (NullPointerException e) {
logEntityMissingRequiredValue("ignore_battle", name, "false"); logEntityMissingOptionalValue("haste_speed", name, "80");
eInfo.ignoreBattle = false; eInfo.hasteSpeed = 80;
} }
try { try {
eInfo.category = nestedConf.get("category"); eInfo.slowSpeed = nestedConf.getInt("slow_speed");
} catch (ClassCastException e) { } catch (ClassCastException e) {
logEntityInvalidValue("category", name, "unknown"); logEntityInvalidValue("slow_speed", name, "20");
eInfo.category = "unknown"; eInfo.slowSpeed = 20;
} catch (NullPointerException e) { } catch (NullPointerException e) {
logEntityMissingRequiredValue("category", name, "unknown"); logEntityMissingOptionalValue("slow_speed", name, "20");
eInfo.category = "unknown"; eInfo.slowSpeed = 20;
} }
try { if (eInfo.playerName.isEmpty()) {
eInfo.decisionAttack = nestedConf.getInt("decision_attack_probability"); try {
if(eInfo.decisionAttack < 0) { eInfo.ignoreBattle = nestedConf.get("ignore_battle");
logClampedValueEntity("decision_attack_probability", name, Integer.toString(eInfo.decisionAttack), "0"); } catch (ClassCastException e) {
eInfo.decisionAttack = 0; logEntityInvalidValue("ignore_battle", name, "false");
} else if(eInfo.decisionAttack > 100) { eInfo.ignoreBattle = false;
logClampedValueEntity("decision_attack_probability", name, Integer.toString(eInfo.decisionAttack), "100"); } catch (NullPointerException e) {
eInfo.decisionAttack = 100; logEntityMissingRequiredValue("ignore_battle", name, "false");
eInfo.ignoreBattle = false;
} }
} catch (ClassCastException e) {
logEntityInvalidValue("decision_attack_probability", name, "70");
eInfo.decisionAttack = 70;
} catch (NullPointerException e) {
logEntityMissingRequiredValue("decision_attack_probability", name, "70");
eInfo.decisionAttack = 70;
}
try { try {
eInfo.decisionDefend = nestedConf.getInt("decision_defend_probability"); eInfo.category = nestedConf.get("category");
if(eInfo.decisionDefend < 0) { } catch (ClassCastException e) {
logClampedValueEntity("decision_defend_probability", name, Integer.toString(eInfo.decisionDefend), "0"); logEntityInvalidValue("category", name, "unknown");
eInfo.decisionDefend = 0; eInfo.category = "unknown";
} else if(eInfo.decisionDefend > 100) { } catch (NullPointerException e) {
logClampedValueEntity("decision_defend_probability", name, Integer.toString(eInfo.decisionDefend), "100"); logEntityMissingRequiredValue("category", name, "unknown");
eInfo.decisionDefend = 100; eInfo.category = "unknown";
} }
} catch (ClassCastException e) {
logEntityInvalidValue("decision_defend_probability", name, "20");
eInfo.decisionDefend = 20;
} catch (NullPointerException e) {
logEntityMissingRequiredValue("decision_defend_probability", name, "20");
eInfo.decisionDefend = 20;
}
try { try {
eInfo.decisionFlee = nestedConf.getInt("decision_flee_probability"); eInfo.decisionAttack = nestedConf.getInt("decision_attack_probability");
if(eInfo.decisionFlee < 0) { if (eInfo.decisionAttack < 0) {
logClampedValueEntity("decision_flee_probability", name, Integer.toString(eInfo.decisionFlee), "0"); logClampedValueEntity("decision_attack_probability", name, Integer.toString(eInfo.decisionAttack), "0");
eInfo.decisionFlee = 0; eInfo.decisionAttack = 0;
} else if(eInfo.decisionFlee > 100) { } else if (eInfo.decisionAttack > 100) {
logClampedValueEntity("decision_flee_probability", name, Integer.toString(eInfo.decisionFlee), "100"); logClampedValueEntity("decision_attack_probability", name, Integer.toString(eInfo.decisionAttack), "100");
eInfo.decisionFlee = 100; eInfo.decisionAttack = 100;
}
} catch (ClassCastException e) {
logEntityInvalidValue("decision_attack_probability", name, "70");
eInfo.decisionAttack = 70;
} catch (NullPointerException e) {
logEntityMissingRequiredValue("decision_attack_probability", name, "70");
eInfo.decisionAttack = 70;
}
try {
eInfo.decisionDefend = nestedConf.getInt("decision_defend_probability");
if (eInfo.decisionDefend < 0) {
logClampedValueEntity("decision_defend_probability", name, Integer.toString(eInfo.decisionDefend), "0");
eInfo.decisionDefend = 0;
} else if (eInfo.decisionDefend > 100) {
logClampedValueEntity("decision_defend_probability", name, Integer.toString(eInfo.decisionDefend), "100");
eInfo.decisionDefend = 100;
}
} catch (ClassCastException e) {
logEntityInvalidValue("decision_defend_probability", name, "20");
eInfo.decisionDefend = 20;
} catch (NullPointerException e) {
logEntityMissingRequiredValue("decision_defend_probability", name, "20");
eInfo.decisionDefend = 20;
}
try {
eInfo.decisionFlee = nestedConf.getInt("decision_flee_probability");
if (eInfo.decisionFlee < 0) {
logClampedValueEntity("decision_flee_probability", name, Integer.toString(eInfo.decisionFlee), "0");
eInfo.decisionFlee = 0;
} else if (eInfo.decisionFlee > 100) {
logClampedValueEntity("decision_flee_probability", name, Integer.toString(eInfo.decisionFlee), "100");
eInfo.decisionFlee = 100;
}
} catch (ClassCastException e) {
logEntityInvalidValue("decision_flee_probability", name, "10");
eInfo.decisionFlee = 10;
} catch (NullPointerException e) {
logEntityMissingRequiredValue("decision_flee_probability", name, "10");
eInfo.decisionFlee = 10;
} }
} catch (ClassCastException e) {
logEntityInvalidValue("decision_flee_probability", name, "10");
eInfo.decisionFlee = 10;
} catch (NullPointerException e) {
logEntityMissingRequiredValue("decision_flee_probability", name, "10");
eInfo.decisionFlee = 10;
} }
if(eInfo.classType != null) { if(eInfo.classType != null) {
entityInfoMap.put(eInfo.classType.getName(), eInfo); entityInfoMap.put(eInfo.classType.getName(), eInfo);
} else if(!eInfo.customName.isEmpty()) { } else if(!eInfo.customName.isEmpty()) {
customEntityInfoMap.put(eInfo.customName, eInfo); customEntityInfoMap.put(eInfo.customName, eInfo);
} else if (!eInfo.playerName.isEmpty()) {
customPlayerInfoMap.put(eInfo.playerName, eInfo);
} else { } else {
logger.error("Cannot add entity to internal config, no \"name\" or \"custom_name\""); logger.error("Cannot add entity to internal config, no \"name\" or \"custom_name\" or \"player_name\"");
} }
} }
} }
@ -796,6 +834,8 @@ public class Config
newConf.set("defense_damage_probability", eInfo.defenseDamageProbability); newConf.set("defense_damage_probability", eInfo.defenseDamageProbability);
newConf.set("evasion", eInfo.evasion); newConf.set("evasion", eInfo.evasion);
newConf.set("speed", eInfo.speed); newConf.set("speed", eInfo.speed);
newConf.set("haste_speed", eInfo.hasteSpeed);
newConf.set("slow_speed", eInfo.slowSpeed);
newConf.set("ignore_battle", eInfo.ignoreBattle); newConf.set("ignore_battle", eInfo.ignoreBattle);
newConf.set("category", eInfo.category); newConf.set("category", eInfo.category);
newConf.set("decision_attack_probability", eInfo.decisionAttack); newConf.set("decision_attack_probability", eInfo.decisionAttack);
@ -825,9 +865,11 @@ public class Config
boolean saved = false; boolean saved = false;
try { try {
if (eInfo.classType != null || !eInfo.customName.isEmpty()) { if (eInfo.classType != null || !eInfo.customName.isEmpty() || !eInfo.playerName.isEmpty()) {
for (com.electronwill.nightconfig.core.Config entity : entities) { for (com.electronwill.nightconfig.core.Config entity : entities) {
String entityName = entity.get("name"); String entityName = entity.get("name");
String customName = entity.get("custom_name");
String playerName = entity.get("player_name");
if ((eInfo.classType != null && entityName != null && entityName.equals(eInfo.classType.getName()))) { if ((eInfo.classType != null && entityName != null && entityName.equals(eInfo.classType.getName()))) {
entity.set("attack_power", eInfo.attackPower); entity.set("attack_power", eInfo.attackPower);
entity.set("attack_probability", eInfo.attackProbability); entity.set("attack_probability", eInfo.attackProbability);
@ -838,6 +880,8 @@ public class Config
entity.set("defense_damage_probability", eInfo.defenseDamageProbability); entity.set("defense_damage_probability", eInfo.defenseDamageProbability);
entity.set("evasion", eInfo.evasion); entity.set("evasion", eInfo.evasion);
entity.set("speed", eInfo.speed); entity.set("speed", eInfo.speed);
entity.set("haste_speed", eInfo.hasteSpeed);
entity.set("slow_speed", eInfo.slowSpeed);
entity.set("ignore_battle", eInfo.ignoreBattle); entity.set("ignore_battle", eInfo.ignoreBattle);
entity.set("category", eInfo.category); entity.set("category", eInfo.category);
entity.set("decision_attack_probability", eInfo.decisionAttack); entity.set("decision_attack_probability", eInfo.decisionAttack);
@ -845,26 +889,35 @@ public class Config
entity.set("decision_flee_probability", eInfo.decisionFlee); entity.set("decision_flee_probability", eInfo.decisionFlee);
saved = true; saved = true;
break; break;
} else { } else if (!eInfo.customName.isEmpty() && customName != null && customName.equals(eInfo.customName)) {
String customName = entity.get("custom_name"); entity.set("attack_power", eInfo.attackPower);
if(!eInfo.customName.isEmpty() && customName != null && customName.equals(eInfo.customName)) { entity.set("attack_probability", eInfo.attackProbability);
entity.set("attack_power", eInfo.attackPower); entity.set("attack_variance", eInfo.attackVariance);
entity.set("attack_probability", eInfo.attackProbability); entity.set("attack_effect", eInfo.attackEffect.toString());
entity.set("attack_variance", eInfo.attackVariance); entity.set("attack_effect_probability", eInfo.attackEffectProbability);
entity.set("attack_effect", eInfo.attackEffect.toString()); entity.set("defense_damage", eInfo.defenseDamage);
entity.set("attack_effect_probability", eInfo.attackEffectProbability); entity.set("defense_damage_probability", eInfo.defenseDamageProbability);
entity.set("defense_damage", eInfo.defenseDamage); entity.set("evasion", eInfo.evasion);
entity.set("defense_damage_probability", eInfo.defenseDamageProbability); entity.set("speed", eInfo.speed);
entity.set("evasion", eInfo.evasion); entity.set("haste_speed", eInfo.hasteSpeed);
entity.set("speed", eInfo.speed); entity.set("slow_speed", eInfo.slowSpeed);
entity.set("ignore_battle", eInfo.ignoreBattle); entity.set("ignore_battle", eInfo.ignoreBattle);
entity.set("category", eInfo.category); entity.set("category", eInfo.category);
entity.set("decision_attack_probability", eInfo.decisionAttack); entity.set("decision_attack_probability", eInfo.decisionAttack);
entity.set("decision_defend_probability", eInfo.decisionDefend); entity.set("decision_defend_probability", eInfo.decisionDefend);
entity.set("decision_flee_probability", eInfo.decisionFlee); entity.set("decision_flee_probability", eInfo.decisionFlee);
saved = true; saved = true;
break; break;
} } else if (!eInfo.playerName.isEmpty() && playerName != null && playerName.equals(eInfo.playerName)) {
entity.set("attack_probability", eInfo.attackProbability);
entity.set("attack_effect", eInfo.attackEffect.toString());
entity.set("attack_effect_probability", eInfo.attackEffectProbability);
entity.set("evasion", eInfo.evasion);
entity.set("speed", eInfo.speed);
entity.set("haste_speed", eInfo.hasteSpeed);
entity.set("slow_speed", eInfo.slowSpeed);
saved = true;
break;
} }
} }
if(!saved) { if(!saved) {
@ -873,25 +926,38 @@ public class Config
newEntry.set("name", eInfo.classType.getName()); newEntry.set("name", eInfo.classType.getName());
} else if(!eInfo.customName.isEmpty()) { } else if(!eInfo.customName.isEmpty()) {
newEntry.set("custom_name", eInfo.customName); newEntry.set("custom_name", eInfo.customName);
} else if (!eInfo.playerName.isEmpty()) {
newEntry.set("player_name", eInfo.playerName);
} else { } else {
logger.error("Failed to save new entity entry into config, no name or custom_name"); logger.error("Failed to save new entity entry into config, no name or custom_name");
conf.close(); conf.close();
return false; return false;
} }
newEntry.set("attack_power", eInfo.attackPower);
if (eInfo.playerName.isEmpty()) {
newEntry.set("attack_power", eInfo.attackPower);
}
newEntry.set("attack_probability", eInfo.attackProbability); newEntry.set("attack_probability", eInfo.attackProbability);
newEntry.set("attack_variance", eInfo.attackVariance); if (eInfo.playerName.isEmpty()) {
newEntry.set("attack_variance", eInfo.attackVariance);
}
newEntry.set("attack_effect", eInfo.attackEffect.toString()); newEntry.set("attack_effect", eInfo.attackEffect.toString());
newEntry.set("attack_effect_probability", eInfo.attackEffectProbability); newEntry.set("attack_effect_probability", eInfo.attackEffectProbability);
newEntry.set("defense_damage", eInfo.defenseDamage); if (eInfo.playerName.isEmpty()) {
newEntry.set("defense_damage_probability", eInfo.defenseDamageProbability); newEntry.set("defense_damage", eInfo.defenseDamage);
newEntry.set("defense_damage_probability", eInfo.defenseDamageProbability);
}
newEntry.set("evasion", eInfo.evasion); newEntry.set("evasion", eInfo.evasion);
newEntry.set("speed", eInfo.speed); newEntry.set("speed", eInfo.speed);
newEntry.set("ignore_battle", eInfo.ignoreBattle); newEntry.set("haste_speed", eInfo.hasteSpeed);
newEntry.set("category", eInfo.category); newEntry.set("slow_speed", eInfo.slowSpeed);
newEntry.set("decision_attack_probability", eInfo.decisionAttack); if (eInfo.playerName.isEmpty()) {
newEntry.set("decision_defend_probability", eInfo.decisionDefend); newEntry.set("ignore_battle", eInfo.ignoreBattle);
newEntry.set("decision_flee_probability", eInfo.decisionFlee); newEntry.set("category", eInfo.category);
newEntry.set("decision_attack_probability", eInfo.decisionAttack);
newEntry.set("decision_defend_probability", eInfo.decisionDefend);
newEntry.set("decision_flee_probability", eInfo.decisionFlee);
}
entities.add(newEntry); entities.add(newEntry);
saved = true; saved = true;
} }
@ -916,8 +982,10 @@ public class Config
if(eInfo.classType != null) { if(eInfo.classType != null) {
entityInfoMap.put(eInfo.classType.getName(), eInfo); entityInfoMap.put(eInfo.classType.getName(), eInfo);
} else if(!eInfo.customName.isEmpty()){ } else if(!eInfo.customName.isEmpty()) {
customEntityInfoMap.put(eInfo.customName, eInfo); customEntityInfoMap.put(eInfo.customName, eInfo);
} else if (!eInfo.playerName.isEmpty()) {
customPlayerInfoMap.put(eInfo.playerName, eInfo);
} else { } else {
logger.warn("Failed to update entity info in memory"); logger.warn("Failed to update entity info in memory");
} }
@ -1097,6 +1165,22 @@ public class Config
return eInfo; return eInfo;
} }
/**
* Returns a clone of an EntityInfo (to prevent editing it).
* @param playerName
* @return a clone of the stored custom EntityInfo or null if invalid String
*/
public EntityInfo getPlayerInfo(String playerName) {
if (playerName == null) {
return null;
}
EntityInfo eInfo = customPlayerInfoMap.get(playerName);
if (eInfo != null) {
eInfo = eInfo.clone();
}
return eInfo;
}
protected EntityInfo getCustomEntityInfoReference(String customName) protected EntityInfo getCustomEntityInfoReference(String customName)
{ {
if(customName == null) { if(customName == null) {
@ -1105,6 +1189,13 @@ public class Config
return customEntityInfoMap.get(customName); return customEntityInfoMap.get(customName);
} }
protected EntityInfo getPlayerInfoReference(String playerName) {
if (playerName == null) {
return null;
}
return customPlayerInfoMap.get(playerName);
}
private int getConfigFileVersion(File configFile) private int getConfigFileVersion(File configFile)
{ {
int version = 0; int version = 0;

View file

@ -8,6 +8,7 @@ public class EditingInfo
public EntityInfo entityInfo; public EntityInfo entityInfo;
public boolean isPendingEntitySelection; public boolean isPendingEntitySelection;
public boolean isEditingCustomName; public boolean isEditingCustomName;
public boolean isEditingPlayer;
public EditingInfo() public EditingInfo()
{ {
@ -15,6 +16,7 @@ public class EditingInfo
entityInfo = null; entityInfo = null;
isPendingEntitySelection = true; isPendingEntitySelection = true;
isEditingCustomName = false; isEditingCustomName = false;
isEditingPlayer = false;
} }
public EditingInfo(Player player) public EditingInfo(Player player)
@ -23,5 +25,6 @@ public class EditingInfo
entityInfo = null; entityInfo = null;
isPendingEntitySelection = true; isPendingEntitySelection = true;
isEditingCustomName = false; isEditingCustomName = false;
isEditingPlayer = false;
} }
} }

View file

@ -17,12 +17,15 @@ public class EntityInfo
public int defenseDamageProbability; public int defenseDamageProbability;
public int evasion; public int evasion;
public int speed; public int speed;
public int hasteSpeed;
public int slowSpeed;
public String category; public String category;
public int decisionAttack; public int decisionAttack;
public int decisionDefend; public int decisionDefend;
public int decisionFlee; public int decisionFlee;
public String customName; public String customName;
public String playerName;
public enum Effect public enum Effect
{ {
SPEED, SPEED,
@ -366,11 +369,39 @@ public class EntityInfo
defenseDamageProbability = 0; defenseDamageProbability = 0;
evasion = 15; evasion = 15;
speed = 50; speed = 50;
hasteSpeed = 80;
slowSpeed = 20;
category = "unknown"; category = "unknown";
decisionAttack = 70; decisionAttack = 70;
decisionDefend = 20; decisionDefend = 20;
decisionFlee = 10; decisionFlee = 10;
customName = new String(); customName = "";
playerName = "";
}
public EntityInfo(Class classType, boolean ignoreBattle, int attackPower, int attackProbability, int attackVariance,
Effect attackEffect, int attackEffectProbability, int defenseDamage, int defenseDamageProbability,
int evasion, int speed, int hasteSpeed, int slowSpeed, String category, int decisionAttack, int decisionDefend, int decisionFlee,
String customName, String playerName) {
this.classType = classType;
this.ignoreBattle = ignoreBattle;
this.attackPower = attackPower;
this.attackProbability = attackProbability;
this.attackVariance = attackVariance;
this.attackEffect = attackEffect;
this.attackEffectProbability = attackEffectProbability;
this.defenseDamage = defenseDamage;
this.defenseDamageProbability = defenseDamageProbability;
this.evasion = evasion;
this.speed = speed;
this.hasteSpeed = hasteSpeed;
this.slowSpeed = slowSpeed;
this.category = category;
this.decisionAttack = decisionAttack;
this.decisionDefend = decisionDefend;
this.decisionFlee = decisionFlee;
this.customName = customName;
this.playerName = playerName;
} }
public EntityInfo clone() public EntityInfo clone()
@ -387,11 +418,14 @@ public class EntityInfo
newEntityInfo.defenseDamageProbability = defenseDamageProbability; newEntityInfo.defenseDamageProbability = defenseDamageProbability;
newEntityInfo.evasion = evasion; newEntityInfo.evasion = evasion;
newEntityInfo.speed = speed; newEntityInfo.speed = speed;
newEntityInfo.hasteSpeed = hasteSpeed;
newEntityInfo.slowSpeed = slowSpeed;
newEntityInfo.category = category; newEntityInfo.category = category;
newEntityInfo.decisionAttack = decisionAttack; newEntityInfo.decisionAttack = decisionAttack;
newEntityInfo.decisionDefend = decisionDefend; newEntityInfo.decisionDefend = decisionDefend;
newEntityInfo.decisionFlee = decisionFlee; newEntityInfo.decisionFlee = decisionFlee;
newEntityInfo.customName = new String(customName); newEntityInfo.customName = customName;
newEntityInfo.playerName = playerName;
return newEntityInfo; return newEntityInfo;
} }
} }

View file

@ -39,7 +39,7 @@ import org.apache.logging.log4j.Logger;
public class TurnBasedMinecraftMod { public class TurnBasedMinecraftMod {
public static final String MODID = "com_burnedkirby_turnbasedminecraft"; public static final String MODID = "com_burnedkirby_turnbasedminecraft";
public static final String NAME = "Turn Based Minecraft Mod"; public static final String NAME = "Turn Based Minecraft Mod";
public static final String VERSION = "1.26.3"; public static final String VERSION = "1.26.4";
public static final String CONFIG_FILENAME = "TBM_Config.toml"; public static final String CONFIG_FILENAME = "TBM_Config.toml";
public static final String DEFAULT_CONFIG_FILENAME = "TBM_Config_DEFAULT.toml"; public static final String DEFAULT_CONFIG_FILENAME = "TBM_Config_DEFAULT.toml";
public static final String CONFIG_DIRECTORY = "config/TurnBasedMinecraft/"; public static final String CONFIG_DIRECTORY = "config/TurnBasedMinecraft/";
@ -292,6 +292,30 @@ public class TurnBasedMinecraftMod {
} }
return 1; return 1;
})) }))
.then(Commands.literal("player")
.executes(c -> {
ServerPlayer player = c.getSource().getPlayerOrException();
getHandler().send(new PacketEditingMessage(PacketEditingMessage.Type.PICK_PLAYER), PacketDistributor.PLAYER.with(player));
return 1;
})
.then(Commands.argument("playerName", StringArgumentType.greedyString()).executes(c -> {
String name = StringArgumentType.getString(c, "playerName");
ServerPlayer player = c.getSource().getPlayerOrException();
getHandler().send(new PacketGeneralMessage("Editing player \"" + name + "\""), PacketDistributor.PLAYER.with(player));
TurnBasedMinecraftMod.logger.info("Begin editing player \"" + name + "\"");
proxy.setEditingPlayer(player);
EditingInfo editInfo = proxy.getEditingInfo(player.getId());
editInfo.isEditingPlayer = true;
editInfo.entityInfo = TurnBasedMinecraftMod.proxy.getConfig().getPlayerInfo(name);
if (editInfo.entityInfo == null) {
editInfo.entityInfo = new EntityInfo();
}
editInfo.entityInfo.playerName = name;
editInfo.isPendingEntitySelection = false;
getHandler().send(new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editInfo.entityInfo), PacketDistributor.PLAYER.with(player));
return 1;
}))
)
.then(Commands.literal("edit") .then(Commands.literal("edit")
.executes(c -> { .executes(c -> {
ServerPlayer player = c.getSource().getPlayerOrException(); ServerPlayer player = c.getSource().getPlayerOrException();
@ -615,11 +639,45 @@ public class TurnBasedMinecraftMod {
})) }))
) )
.then(Commands.literal("speed") .then(Commands.literal("speed")
.executes(c -> {
ServerPlayer player = c.getSource().getPlayerOrException();
EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId());
if (editingInfo != null && !editingInfo.isPendingEntitySelection) {
getHandler().send(new PacketEditingMessage(PacketEditingMessage.Type.EDIT_SPEED), PacketDistributor.PLAYER.with(player));
} else if (editingInfo != null) {
getHandler().send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY), PacketDistributor.PLAYER.with(player));
} else {
Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\").");
throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage);
}
return 1;
})
.then(Commands.argument("speed", IntegerArgumentType.integer())
.executes(c -> {
ServerPlayer player = c.getSource().getPlayerOrException();
EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId());
int speed = IntegerArgumentType.getInteger(c, "speed");
if (speed < 0) {
speed = 0;
}
if (editingInfo != null && !editingInfo.isPendingEntitySelection) {
editingInfo.entityInfo.speed = speed;
getHandler().send(new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo), PacketDistributor.PLAYER.with(player));
} else if (editingInfo != null) {
getHandler().send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY), PacketDistributor.PLAYER.with(player));
} else {
Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\").");
throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage);
}
return 1;
}))
)
.then(Commands.literal("hasteSpeed")
.executes(c -> { .executes(c -> {
ServerPlayer player = c.getSource().getPlayerOrException(); ServerPlayer player = c.getSource().getPlayerOrException();
EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId()); EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId());
if (editingInfo != null && !editingInfo.isPendingEntitySelection) { if (editingInfo != null && !editingInfo.isPendingEntitySelection) {
getHandler().send(new PacketEditingMessage(PacketEditingMessage.Type.EDIT_SPEED), PacketDistributor.PLAYER.with(player)); getHandler().send(new PacketEditingMessage(PacketEditingMessage.Type.EDIT_HASTE_SPEED), PacketDistributor.PLAYER.with(player));
} else if (editingInfo != null) { } else if (editingInfo != null) {
getHandler().send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY), PacketDistributor.PLAYER.with(player)); getHandler().send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY), PacketDistributor.PLAYER.with(player));
} else { } else {
@ -628,16 +686,16 @@ public class TurnBasedMinecraftMod {
} }
return 1; return 1;
}) })
.then(Commands.argument("speed", IntegerArgumentType.integer()) .then(Commands.argument("hasteSpeed", IntegerArgumentType.integer())
.executes(c -> { .executes(c -> {
ServerPlayer player = c.getSource().getPlayerOrException(); ServerPlayer player = c.getSource().getPlayerOrException();
EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId()); EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId());
int speed = IntegerArgumentType.getInteger(c, "speed"); int hasteSpeed = IntegerArgumentType.getInteger(c, "hasteSpeed");
if (speed < 0) { if (hasteSpeed < 0) {
speed = 0; hasteSpeed = 0;
} }
if (editingInfo != null && !editingInfo.isPendingEntitySelection) { if (editingInfo != null && !editingInfo.isPendingEntitySelection) {
editingInfo.entityInfo.speed = speed; editingInfo.entityInfo.hasteSpeed = hasteSpeed;
getHandler().send(new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo), PacketDistributor.PLAYER.with(player)); getHandler().send(new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo), PacketDistributor.PLAYER.with(player));
} else if (editingInfo != null) { } else if (editingInfo != null) {
getHandler().send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY), PacketDistributor.PLAYER.with(player)); getHandler().send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY), PacketDistributor.PLAYER.with(player));
@ -648,6 +706,40 @@ public class TurnBasedMinecraftMod {
return 1; return 1;
})) }))
) )
.then(Commands.literal("slowSpeed")
.executes(c -> {
ServerPlayer player = c.getSource().getPlayerOrException();
EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId());
if (editingInfo != null && !editingInfo.isPendingEntitySelection) {
getHandler().send(new PacketEditingMessage(PacketEditingMessage.Type.EDIT_SLOW_SPEED), PacketDistributor.PLAYER.with(player));
} else if (editingInfo != null) {
getHandler().send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY), PacketDistributor.PLAYER.with(player));
} else {
Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\").");
throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage);
}
return 1;
})
.then(Commands.argument("slowSpeed", IntegerArgumentType.integer())
.executes(c -> {
ServerPlayer player = c.getSource().getPlayerOrException();
EditingInfo editingInfo = TurnBasedMinecraftMod.proxy.getEditingInfo(player.getId());
int slowSpeed = IntegerArgumentType.getInteger(c, "slowSpeed");
if (slowSpeed < 0) {
slowSpeed = 0;
}
if (editingInfo != null && !editingInfo.isPendingEntitySelection) {
editingInfo.entityInfo.slowSpeed = slowSpeed;
getHandler().send(new PacketEditingMessage(PacketEditingMessage.Type.PICK_EDIT, editingInfo.entityInfo), PacketDistributor.PLAYER.with(player));
} else if (editingInfo != null) {
getHandler().send(new PacketEditingMessage(PacketEditingMessage.Type.ATTACK_ENTITY), PacketDistributor.PLAYER.with(player));
} else {
Message exceptionMessage = new LiteralMessage("Cannot edit entity without starting editing (use \"/tbm-edit\").");
throw new CommandSyntaxException(new SimpleCommandExceptionType(exceptionMessage), exceptionMessage);
}
return 1;
}))
)
.then(Commands.literal("category") .then(Commands.literal("category")
.executes(c -> { .executes(c -> {
ServerPlayer player = c.getSource().getPlayerOrException(); ServerPlayer player = c.getSource().getPlayerOrException();

View file

@ -28,11 +28,14 @@ public class PacketEditingMessage
EDIT_DEFENSE_DAMAGE_PROBABILITY(9), EDIT_DEFENSE_DAMAGE_PROBABILITY(9),
EDIT_EVASION(10), EDIT_EVASION(10),
EDIT_SPEED(11), EDIT_SPEED(11),
EDIT_HASTE_SPEED(18),
EDIT_SLOW_SPEED(19),
EDIT_CATEGORY(12), EDIT_CATEGORY(12),
EDIT_DECISION_ATTACK(13), EDIT_DECISION_ATTACK(13),
EDIT_DECISION_DEFEND(14), EDIT_DECISION_DEFEND(14),
EDIT_DECISION_FLEE(15), EDIT_DECISION_FLEE(15),
SERVER_EDIT(16); SERVER_EDIT(16),
PICK_PLAYER(17);
Type(int value) Type(int value)
{ {
@ -110,11 +113,14 @@ public class PacketEditingMessage
buf.writeInt(pkt.entityInfo.defenseDamageProbability); buf.writeInt(pkt.entityInfo.defenseDamageProbability);
buf.writeInt(pkt.entityInfo.evasion); buf.writeInt(pkt.entityInfo.evasion);
buf.writeInt(pkt.entityInfo.speed); buf.writeInt(pkt.entityInfo.speed);
buf.writeInt(pkt.entityInfo.hasteSpeed);
buf.writeInt(pkt.entityInfo.slowSpeed);
buf.writeUtf(pkt.entityInfo.category); buf.writeUtf(pkt.entityInfo.category);
buf.writeInt(pkt.entityInfo.decisionAttack); buf.writeInt(pkt.entityInfo.decisionAttack);
buf.writeInt(pkt.entityInfo.decisionDefend); buf.writeInt(pkt.entityInfo.decisionDefend);
buf.writeInt(pkt.entityInfo.decisionFlee); buf.writeInt(pkt.entityInfo.decisionFlee);
buf.writeUtf(pkt.entityInfo.customName); buf.writeUtf(pkt.entityInfo.customName);
buf.writeUtf(pkt.entityInfo.playerName);
} }
} }
@ -138,11 +144,14 @@ public class PacketEditingMessage
einfo.defenseDamageProbability = buf.readInt(); einfo.defenseDamageProbability = buf.readInt();
einfo.evasion = buf.readInt(); einfo.evasion = buf.readInt();
einfo.speed = buf.readInt(); einfo.speed = buf.readInt();
einfo.hasteSpeed = buf.readInt();
einfo.slowSpeed = buf.readInt();
einfo.category = buf.readUtf(); einfo.category = buf.readUtf();
einfo.decisionAttack = buf.readInt(); einfo.decisionAttack = buf.readInt();
einfo.decisionDefend = buf.readInt(); einfo.decisionDefend = buf.readInt();
einfo.decisionFlee = buf.readInt(); einfo.decisionFlee = buf.readInt();
einfo.customName = buf.readUtf(); einfo.customName = buf.readUtf();
einfo.playerName = buf.readUtf();
return new PacketEditingMessage(type, einfo); return new PacketEditingMessage(type, einfo);
} }
} }