From c28fb7fb1bc340ed4944c9b2e89de8f06edbf6d4 Mon Sep 17 00:00:00 2001 From: deyoyk Date: Sun, 11 Jan 2026 01:31:27 +0530 Subject: [PATCH] fixing: hunger and gold dropping --- .../events/ActionGoldDrop.java | 14 +----- .../events/ActionGoldInventoryMove.java | 47 +++++++++++++++++++ .../events/ActionPlayerTick.java | 47 +++++++++++++++++++ .../type/murdermysterygame/game/Game.java | 7 +++ .../murdermysterygame/gold/GoldManager.java | 38 ++++++++++----- 5 files changed, 127 insertions(+), 26 deletions(-) create mode 100644 type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/events/ActionGoldInventoryMove.java create mode 100644 type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/events/ActionPlayerTick.java diff --git a/type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/events/ActionGoldDrop.java b/type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/events/ActionGoldDrop.java index 1f7af3998..9345a075b 100644 --- a/type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/events/ActionGoldDrop.java +++ b/type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/events/ActionGoldDrop.java @@ -1,6 +1,5 @@ package net.swofty.type.murdermysterygame.events; -import net.minestom.server.entity.ItemEntity; import net.minestom.server.event.item.ItemDropEvent; import net.minestom.server.item.Material; import net.swofty.type.murdermysterygame.TypeMurderMysteryGameLoader; @@ -11,8 +10,6 @@ import net.swofty.type.generic.event.HypixelEvent; import net.swofty.type.generic.event.HypixelEventClass; -import java.time.Duration; - public class ActionGoldDrop implements HypixelEventClass { @HypixelEvent(node = EventNodes.PLAYER, requireDataLoaded = false) @@ -29,17 +26,8 @@ public void run(ItemDropEvent event) { Material material = event.getItemStack().material(); - // Allow gold dropping - create shared ItemEntity that anyone can pick up if (material == Material.GOLD_INGOT) { - ItemEntity itemEntity = new ItemEntity(event.getItemStack()); - itemEntity.setInstance( - player.getInstance(), - player.getPosition().add(0, player.getEyeHeight(), 0) - ); - itemEntity.setVelocity( - player.getPosition().add(0, 0.3, 0).direction().mul(6) - ); - itemEntity.setPickupDelay(Duration.ofMillis(500)); + event.setCancelled(true); return; } diff --git a/type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/events/ActionGoldInventoryMove.java b/type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/events/ActionGoldInventoryMove.java new file mode 100644 index 000000000..ec76002a0 --- /dev/null +++ b/type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/events/ActionGoldInventoryMove.java @@ -0,0 +1,47 @@ +package net.swofty.type.murdermysterygame.events; + +import net.minestom.server.event.inventory.InventoryItemChangeEvent; +import net.minestom.server.item.ItemStack; +import net.minestom.server.item.Material; +import net.swofty.type.murdermysterygame.TypeMurderMysteryGameLoader; +import net.swofty.type.murdermysterygame.game.Game; +import net.swofty.type.murdermysterygame.game.GameStatus; +import net.swofty.type.murdermysterygame.user.MurderMysteryPlayer; +import net.swofty.type.generic.event.EventNodes; +import net.swofty.type.generic.event.HypixelEvent; +import net.swofty.type.generic.event.HypixelEventClass; + +public class ActionGoldInventoryMove implements HypixelEventClass { + + @HypixelEvent(node = EventNodes.PLAYER, requireDataLoaded = false) + public void run(InventoryItemChangeEvent event) { + if (event.getInventory().getViewers().isEmpty()) return; + MurderMysteryPlayer player = (MurderMysteryPlayer) event.getInventory().getViewers().stream().findFirst().orElse(null); + if (player == null) return; + + Game game = TypeMurderMysteryGameLoader.getPlayerGame(player); + if (game == null) return; + if (game.getGameStatus() != GameStatus.IN_PROGRESS) return; + + int totalGold = 0; + for (int i = 0; i < 36; i++) { + ItemStack stack = player.getInventory().getItemStack(i); + if (stack.material() == Material.GOLD_INGOT) { + totalGold += stack.amount(); + if (i != 8) { + player.getInventory().setItemStack(i, ItemStack.AIR); + } + } + } + + if (totalGold > 0) { + player.getInventory().setItemStack(8, ItemStack.of(Material.GOLD_INGOT, totalGold)); + } else { + ItemStack slot8Item = player.getInventory().getItemStack(8); + if (slot8Item.material() == Material.GOLD_INGOT) { + player.getInventory().setItemStack(8, ItemStack.AIR); + } + } + } +} + diff --git a/type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/events/ActionPlayerTick.java b/type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/events/ActionPlayerTick.java new file mode 100644 index 000000000..57d5c69c0 --- /dev/null +++ b/type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/events/ActionPlayerTick.java @@ -0,0 +1,47 @@ +package net.swofty.type.murdermysterygame.events; + +import net.minestom.server.event.player.PlayerTickEvent; +import net.minestom.server.item.ItemStack; +import net.minestom.server.item.Material; +import net.swofty.type.murdermysterygame.TypeMurderMysteryGameLoader; +import net.swofty.type.murdermysterygame.game.Game; +import net.swofty.type.murdermysterygame.game.GameStatus; +import net.swofty.type.murdermysterygame.user.MurderMysteryPlayer; +import net.swofty.type.generic.event.EventNodes; +import net.swofty.type.generic.event.HypixelEvent; +import net.swofty.type.generic.event.HypixelEventClass; + +public class ActionPlayerTick implements HypixelEventClass { + + @HypixelEvent(node = EventNodes.PLAYER, requireDataLoaded = false) + public void run(PlayerTickEvent event) { + if (!(event.getPlayer() instanceof MurderMysteryPlayer player)) return; + + Game game = TypeMurderMysteryGameLoader.getPlayerGame(player); + if (game == null) return; + + if (game.getGameStatus() == GameStatus.IN_PROGRESS || game.getGameStatus() == GameStatus.ENDING) { + if (player.getFood() < 20) { + player.setFood(20); + player.setFoodSaturation(20.0f); + } + + ItemStack slot8Item = player.getInventory().getItemStack(8); + if (slot8Item.material() != Material.GOLD_INGOT) { + int totalGold = 0; + for (int i = 0; i < 36; i++) { + ItemStack stack = player.getInventory().getItemStack(i); + if (stack.material() == Material.GOLD_INGOT) { + totalGold += stack.amount(); + if (i != 8) { + player.getInventory().setItemStack(i, ItemStack.AIR); + } + } + } + if (totalGold > 0) { + player.getInventory().setItemStack(8, ItemStack.of(Material.GOLD_INGOT, totalGold)); + } + } + } + } +} diff --git a/type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/game/Game.java b/type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/game/Game.java index addf2afc9..ed10fdb12 100644 --- a/type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/game/Game.java +++ b/type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/game/Game.java @@ -333,6 +333,8 @@ private void setupPlayerForWaiting(MurderMysteryPlayer player) { player.setGameMode(GameMode.ADVENTURE); player.setEliminated(false); player.resetGold(); + player.setFood(20); + player.setFoodSaturation(20.0f); } private Pos getWaitingPosition() { @@ -351,6 +353,9 @@ private void setupPlayerForGame(MurderMysteryPlayer player, GameRole role) { Pos spawnPos = getRandomSpawnPosition(); player.teleport(spawnPos); + player.setFood(20); + player.setFoodSaturation(20.0f); + if (role == GameRole.DETECTIVE) { weaponManager.giveDetectiveBow(player); } @@ -374,6 +379,8 @@ private void setupPlayerForSpectator(MurderMysteryPlayer player) { player.setAllowFlying(true); player.setFlying(true); + player.setFood(20); + player.setFoodSaturation(20.0f); } private void setupHiddenNametags() { diff --git a/type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/gold/GoldManager.java b/type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/gold/GoldManager.java index 2b03aec1c..5e41e1908 100644 --- a/type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/gold/GoldManager.java +++ b/type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/gold/GoldManager.java @@ -72,7 +72,7 @@ public void startSpawning() { player.sendPacket(new CollectItemPacket(goldEntity.getEntityId(), player.getEntityId(), 1)); - player.getInventory().addItemStack(ItemStack.of(Material.GOLD_INGOT, 1)); + addGoldToSlot(player, 1); player.sendMessage(Component.text("+1 Gold", NamedTextColor.GOLD)); @@ -119,7 +119,7 @@ public boolean collectGold(MurderMysteryPlayer player, Entity goldEntity) { spawnedGold.remove(goldEntity); goldEntity.remove(); - player.getInventory().addItemStack(ItemStack.of(Material.GOLD_INGOT, 1)); + addGoldToSlot(player, 1); trackGoldAchievements(player, 1); @@ -160,21 +160,22 @@ public List getSpawnedGold() { } public int countGoldInInventory(MurderMysteryPlayer player) { - return Arrays.stream(player.getInventory().getItemStacks()) - .filter(stack -> stack.material() == Material.GOLD_INGOT) - .mapToInt(ItemStack::amount) - .sum(); + ItemStack slot8Item = player.getInventory().getItemStack(8); + if (slot8Item.material() == Material.GOLD_INGOT) { + return slot8Item.amount(); + } + return 0; } public void removeGoldFromInventory(MurderMysteryPlayer player, int amount) { PlayerInventory inventory = player.getInventory(); - int remaining = amount; - for (int i = 0; i < inventory.getSize() && remaining > 0; i++) { - ItemStack stack = inventory.getItemStack(i); - if (stack.material() == Material.GOLD_INGOT) { - int remove = Math.min(stack.amount(), remaining); - inventory.setItemStack(i, stack.amount() > remove ? stack.withAmount(stack.amount() - remove) : ItemStack.AIR); - remaining -= remove; + ItemStack slot8Item = inventory.getItemStack(8); + if (slot8Item.material() == Material.GOLD_INGOT) { + int remove = Math.min(slot8Item.amount(), amount); + if (slot8Item.amount() > remove) { + inventory.setItemStack(8, slot8Item.withAmount(slot8Item.amount() - remove)); + } else { + inventory.setItemStack(8, ItemStack.AIR); } } } @@ -186,4 +187,15 @@ public void checkPlayerGoldForBow(MurderMysteryPlayer player) { game.getWeaponManager().giveInnocentBow(player); } } + + private void addGoldToSlot(MurderMysteryPlayer player, int amount) { + PlayerInventory inventory = player.getInventory(); + ItemStack slot8Item = inventory.getItemStack(8); + + if (slot8Item.material() == Material.GOLD_INGOT) { + inventory.setItemStack(8, slot8Item.withAmount(slot8Item.amount() + amount)); + } else { + inventory.setItemStack(8, ItemStack.of(Material.GOLD_INGOT, amount)); + } + } }