From 68eea7a434c752630442a7795ce49c6734e1d95c Mon Sep 17 00:00:00 2001 From: SamB440 Date: Sat, 25 Mar 2023 13:04:45 +0000 Subject: [PATCH] Fix server-related crashes/bugs --- .../citybuilder/CityBuilderTierOneGui.java | 1 + .../IncomingInstanceSyncPacketHandler.java | 7 ++++++- .../outgoing/OutgoingBuildKingdomPacket.java | 2 +- .../OutgoingForemanCollectPacketHandler.java | 2 +- .../OutgoingToggleSellGuiPacketHandler.java | 2 ++ .../entity/guild/CityBuilderEntity.java | 14 ++++++++++++-- .../common/entity/guild/GuildGuardEntity.java | 13 +++++++------ .../common/world/ConquestInstance.java | 19 ++++++++++++++----- .../incoming/IncomingBuildKingdomPacket.java | 6 +++--- ...ncomingCityBuilderActionPacketHandler.java | 6 ++++-- 10 files changed, 51 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/convallyria/taleofkingdoms/client/gui/entity/citybuilder/CityBuilderTierOneGui.java b/src/main/java/com/convallyria/taleofkingdoms/client/gui/entity/citybuilder/CityBuilderTierOneGui.java index e244960a..7f205aaf 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/client/gui/entity/citybuilder/CityBuilderTierOneGui.java +++ b/src/main/java/com/convallyria/taleofkingdoms/client/gui/entity/citybuilder/CityBuilderTierOneGui.java @@ -174,6 +174,7 @@ protected void build(FlowLayout rootComponent) { } entity.build(player, build, kingdom); + MinecraftClient.getInstance().currentScreen.close(); }).active(canAffordBuild) .tooltip(List.of( Text.literal(pluralText).append(build.getDisplayName()).append(Text.literal(" costs:")), diff --git a/src/main/java/com/convallyria/taleofkingdoms/client/packet/incoming/IncomingInstanceSyncPacketHandler.java b/src/main/java/com/convallyria/taleofkingdoms/client/packet/incoming/IncomingInstanceSyncPacketHandler.java index 89f43d64..dfe3454e 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/client/packet/incoming/IncomingInstanceSyncPacketHandler.java +++ b/src/main/java/com/convallyria/taleofkingdoms/client/packet/incoming/IncomingInstanceSyncPacketHandler.java @@ -25,7 +25,12 @@ public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedDa final PlayerEntity player = context.player(); player.sendMessage(Text.literal("Received sync, " + instance)); final TaleOfKingdomsAPI api = TaleOfKingdoms.getAPI(); - api.getConquestInstanceStorage().addConquest(player.getUuidAsString(), instance, true); + final ConquestInstance existing = api.getConquestInstanceStorage().getConquestInstance(player.getUuidAsString()).orElse(null); + if (existing != null) { + existing.uploadData(instance); + } else { + api.getConquestInstanceStorage().addConquest(player.getUuidAsString(), instance, true); + } }); } diff --git a/src/main/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingBuildKingdomPacket.java b/src/main/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingBuildKingdomPacket.java index 6dd5231b..09fe5e43 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingBuildKingdomPacket.java +++ b/src/main/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingBuildKingdomPacket.java @@ -12,7 +12,7 @@ public final class OutgoingBuildKingdomPacket extends ClientPacketHandler { public OutgoingBuildKingdomPacket() { - super(Packets.FIX_GUILD); + super(Packets.BUILD_KINGDOM); } @Override diff --git a/src/main/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingForemanCollectPacketHandler.java b/src/main/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingForemanCollectPacketHandler.java index 182093a8..390fb050 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingForemanCollectPacketHandler.java +++ b/src/main/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingForemanCollectPacketHandler.java @@ -12,7 +12,7 @@ public final class OutgoingForemanCollectPacketHandler extends ClientPacketHandler { public OutgoingForemanCollectPacketHandler() { - super(Packets.FOREMAN_BUY_WORKER); + super(Packets.FOREMAN_COLLECT); } @Override diff --git a/src/main/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingToggleSellGuiPacketHandler.java b/src/main/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingToggleSellGuiPacketHandler.java index 15275c01..53e48c8b 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingToggleSellGuiPacketHandler.java +++ b/src/main/java/com/convallyria/taleofkingdoms/client/packet/outgoing/OutgoingToggleSellGuiPacketHandler.java @@ -3,6 +3,7 @@ import com.convallyria.taleofkingdoms.client.packet.ClientPacketHandler; import com.convallyria.taleofkingdoms.common.packet.Packets; import com.convallyria.taleofkingdoms.common.packet.context.PacketContext; +import com.convallyria.taleofkingdoms.common.shop.ShopParser; import io.netty.buffer.Unpooled; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.network.PacketByteBuf; @@ -24,6 +25,7 @@ public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedDa public void handleOutgoingPacket(@NotNull PlayerEntity player, @Nullable Object... data) { PacketByteBuf passedData = new PacketByteBuf(Unpooled.buffer()); passedData.writeBoolean((Boolean) data[0]); + passedData.writeEnumConstant((ShopParser.GUI) data[1]); sendPacket(player, passedData); } } diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/CityBuilderEntity.java b/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/CityBuilderEntity.java index 2fbe2726..d3c13d5b 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/CityBuilderEntity.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/CityBuilderEntity.java @@ -40,6 +40,8 @@ import net.minecraft.world.World; import org.jetbrains.annotations.Nullable; +import java.util.concurrent.CompletableFuture; + public class CityBuilderEntity extends TOKEntity implements InventoryOwner { private static final TrackedData MOVING_TO_LOCATION; @@ -116,11 +118,17 @@ protected ActionResult interactMob(PlayerEntity player, Hand hand) { } public void give64wood(PlayerEntity player) { + System.out.println("64 wood"); final int playerWoodCount = InventoryUtils.count(player.getInventory(), ItemTags.LOGS); TaleOfKingdoms.getAPI().executeOnServerEnvironment((server) -> { + System.out.println("server"); final ItemStack stack = InventoryUtils.getStack(player.getInventory(), ItemTags.LOGS, 64); final ServerPlayerEntity serverPlayer = server.getPlayerManager().getPlayer(player.getUuid()); final CityBuilderEntity serverCityBuilder = (CityBuilderEntity) serverPlayer.getWorld().getEntityById(this.getId()); + System.out.println("playerwoodcount: " + playerWoodCount); + System.out.println("wood: " + getWood()); + System.out.println("stack: " + stack); + System.out.println("can insert? " + serverCityBuilder.getInventory().canInsert(stack)); if (stack != null && playerWoodCount >= 64 && getWood() <= (320 - 64) && serverCityBuilder.getInventory().canInsert(stack)) { int slot = serverPlayer.getInventory().getSlotWithStack(stack); serverPlayer.getInventory().removeStack(slot); @@ -164,18 +172,20 @@ public void fixKingdom(PlayerEntity player, PlayerKingdom kingdom) { }); } - public void build(PlayerEntity player, BuildCosts build, PlayerKingdom kingdom) { + public CompletableFuture build(PlayerEntity player, BuildCosts build, PlayerKingdom kingdom) { + CompletableFuture future = new CompletableFuture<>(); TaleOfKingdoms.getAPI().executeOnServerEnvironment(server -> { final ServerPlayerEntity serverPlayer = server.getPlayerManager().getPlayer(player.getUuid()); final CityBuilderEntity serverCityBuilder = (CityBuilderEntity) serverPlayer.getWorld().getEntityById(this.getId()); - MinecraftClient.getInstance().currentScreen.close(); kingdom.addBuilt(build.getKingdomPOI()); TaleOfKingdoms.LOGGER.info("Placing " + build + "..."); TaleOfKingdoms.getAPI().getSchematicHandler().pasteSchematic(build.getSchematic(), serverPlayer, kingdom.getPOIPos(build.getKingdomPOI()), build.getSchematicRotation()); serverCityBuilder.getInventory().removeItem(Items.OAK_LOG, build.getWood()); serverCityBuilder.getInventory().removeItem(Items.COBBLESTONE, build.getStone()); + future.complete(null); }); + return future; } public void followPlayer() { diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/GuildGuardEntity.java b/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/GuildGuardEntity.java index 3503b681..0c06edf6 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/GuildGuardEntity.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/entity/guild/GuildGuardEntity.java @@ -59,25 +59,26 @@ public static DefaultAttributeContainer.Builder createMobAttributes() { @Override protected ActionResult interactMob(final PlayerEntity player, final Hand hand) { if (hand == Hand.OFF_HAND) return ActionResult.FAIL; + final boolean client = player.world.isClient(); final TaleOfKingdomsAPI api = TaleOfKingdoms.getAPI(); api.getConquestInstanceStorage().mostRecentInstance().ifPresent(instance -> { if (instance.hasAttacked(player.getUuid())) { if (player.getMainHandStack().getItem() == Items.WOODEN_SWORD) { this.setStackInHand(Hand.MAIN_HAND, player.getMainHandStack()); - if (player.world.isClient()) Translations.GUILDMEMBER_START_FIGHT.send(player); + if (!client) Translations.GUILDMEMBER_START_FIGHT.send(player); final int[] countdown = {3}; api.getScheduler().repeatN(server -> { - boolean send = FabricLoader.getInstance().getEnvironmentType() != EnvType.CLIENT || player.world.isClient(); + boolean send = FabricLoader.getInstance().getEnvironmentType() != EnvType.CLIENT || !client; if (send) player.sendMessage(Text.literal("" + countdown[0]), false); countdown[0] = countdown[0] - 1; }, 3, 0, 20); api.getScheduler().queue(server -> { final ImprovedFollowTargetGoal goal = new ImprovedFollowTargetGoal<>(this, EntityType.PLAYER, true); this.targetSelector.add(0, goal); - if (player.world.isClient()) Translations.GUILDMEMBER_BEGIN.send(player); + if (!client) Translations.GUILDMEMBER_BEGIN.send(player); api.getScheduler().queue(server2 -> { this.targetSelector.remove(goal); - if (player.world.isClient()) Translations.GUILDMEMBER_GOOD_FIGHTER.send(player); + if (!client) Translations.GUILDMEMBER_GOOD_FIGHTER.send(player); final GuildPlayer guildPlayer = instance.getPlayer(player); guildPlayer.setWorthiness(guildPlayer.getWorthiness() + 2); this.setStackInHand(Hand.MAIN_HAND, new ItemStack(Items.IRON_SWORD)); @@ -86,9 +87,9 @@ protected ActionResult interactMob(final PlayerEntity player, final Hand hand) { player.getInventory().removeOne(player.getMainHandStack()); return; } - if (player.world.isClient()) Translations.GUILDMEMBER_FIGHTER.send(player); + if (!client) Translations.GUILDMEMBER_FIGHTER.send(player); } else { - if (player.world.isClient()) Translations.GUILDMEMBER_START.send(player); + if (!client) Translations.GUILDMEMBER_START.send(player); } }); return ActionResult.PASS; diff --git a/src/main/java/com/convallyria/taleofkingdoms/common/world/ConquestInstance.java b/src/main/java/com/convallyria/taleofkingdoms/common/world/ConquestInstance.java index ad9266bd..daae8777 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/common/world/ConquestInstance.java +++ b/src/main/java/com/convallyria/taleofkingdoms/common/world/ConquestInstance.java @@ -64,15 +64,24 @@ public class ConquestInstance { Codec.unboundedMap(Uuids.CODEC, GuildPlayer.CODEC).fieldOf("guild_players").forGetter(ConquestInstance::getGuildPlayers) ).apply(instance, (name, hasLoaded, start, end, origin, underAttack, attackLocations, attackers, guildPlayers) -> { ConquestInstance conquestInstance = new ConquestInstance(name, start, end, origin); - conquestInstance.setLoaded(hasLoaded); - conquestInstance.setUnderAttack(underAttack); - conquestInstance.getReficuleAttackLocations().addAll(attackLocations); - conquestInstance.getReficuleAttackers().addAll(attackers); - conquestInstance.getGuildPlayers().putAll(guildPlayers); + conquestInstance.uploadData(start, end, hasLoaded, underAttack, attackLocations, attackers, guildPlayers); return conquestInstance; } )); + public void uploadData(ConquestInstance newData) { + this.uploadData(newData.start, newData.end, newData.hasLoaded, newData.underAttack, newData.reficuleAttackLocations, newData.reficuleAttackers, newData.guildPlayers); + } + + public void uploadData(BlockPos start, BlockPos end, boolean hasLoaded, boolean underAttack, List attackLocations, List attackers, Map guildPlayers) { + this.setStart(start); + this.setEnd(end); + this.setLoaded(hasLoaded); + this.setUnderAttack(underAttack); + this.getReficuleAttackLocations().addAll(attackLocations); + this.getReficuleAttackers().addAll(attackers); + this.getGuildPlayers().putAll(guildPlayers); + } private final String name; @Deprecated(forRemoval = true) diff --git a/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingBuildKingdomPacket.java b/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingBuildKingdomPacket.java index 1bc63198..463e46c2 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingBuildKingdomPacket.java +++ b/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingBuildKingdomPacket.java @@ -30,11 +30,10 @@ public IncomingBuildKingdomPacket() { @Override public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedData) { ServerPlayerEntity player = (ServerPlayerEntity) context.player(); - + final int entityId = attachedData.readInt(); context.taskQueue().execute(() -> { final TaleOfKingdomsAPI api = TaleOfKingdoms.getAPI(); api.getConquestInstanceStorage().mostRecentInstance().ifPresent(instance -> { - final int entityId = attachedData.readInt(); final Entity entity = player.world.getEntityById(entityId); if (!(entity instanceof CityBuilderEntity cityBuilderEntity) || player.distanceTo(cityBuilderEntity) > 5) { reject(player, "Invalid entity ID / Distance"); @@ -76,8 +75,9 @@ public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedDa cityBuilderEntity.refreshPositionAfterTeleport(player.getX(), player.getY(), player.getZ()); // Now move to the well location cityBuilderEntity.setTarget(playerKingdom.getPOIPos(KingdomPOI.CITY_BUILDER_WELL_POI)); + + ServerConquestInstance.sync(player, instance); }); - ServerConquestInstance.sync(player, instance); }); }); } diff --git a/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingCityBuilderActionPacketHandler.java b/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingCityBuilderActionPacketHandler.java index 432f755a..5d39d1ca 100644 --- a/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingCityBuilderActionPacketHandler.java +++ b/src/main/java/com/convallyria/taleofkingdoms/server/packet/incoming/IncomingCityBuilderActionPacketHandler.java @@ -9,6 +9,7 @@ import com.convallyria.taleofkingdoms.common.packet.context.PacketContext; import com.convallyria.taleofkingdoms.common.world.guild.GuildPlayer; import com.convallyria.taleofkingdoms.server.packet.ServerPacketHandler; +import com.convallyria.taleofkingdoms.server.world.ServerConquestInstance; import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.network.PacketByteBuf; @@ -19,7 +20,7 @@ public final class IncomingCityBuilderActionPacketHandler extends ServerPacketHandler { public IncomingCityBuilderActionPacketHandler() { - super(Packets.FOREMAN_COLLECT); + super(Packets.CITYBUILDER_ACTION); } @Override @@ -58,6 +59,7 @@ public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedDa return; } + System.out.println("action: " + action); switch (action) { case GIVE_64_WOOD -> cityBuilderEntity.give64wood(player); case GIVE_64_STONE -> cityBuilderEntity.give64stone(player); @@ -68,7 +70,7 @@ public void handleIncomingPacket(PacketContext context, PacketByteBuf attachedDa return; } - cityBuilderEntity.build(player, buildCosts, kingdom); + cityBuilderEntity.build(player, buildCosts, kingdom).thenAccept((v) -> ServerConquestInstance.sync(player, instance)); } } }));