From 9624b9a141c3e282b882e5a56216c29d07359403 Mon Sep 17 00:00:00 2001 From: rbasamoyai Date: Mon, 4 Jul 2022 20:50:58 -0400 Subject: [PATCH] Fixed some resource station issues and added livestock pen screen --- TODO | 4 - build.gradle | 2 +- src/generated/resources/.cache/cache | 3 +- .../models/item/animal_feed.json | 6 ++ .../industrialwarfare/recipes/part_screw.json | 4 +- .../client/events/ClientEvents.java | 3 +- .../resourcestation/LivestockPenScreen.java | 56 ++++++++++ .../ResourceStationScreen.java | 12 +-- .../blockentities/FarmingPlotBlockEntity.java | 30 +++--- .../LivestockPenBlockEntity.java | 96 ++++++++++++++---- .../blockentities/QuarryBlockEntity.java | 15 ++- .../ResourceStationBlockEntity.java | 10 +- .../blockentities/TreeFarmBlockEntity.java | 6 +- .../common/blocks/LivestockPenBlock.java | 47 +++++++++ .../common/blocks/ResourceStationBlock.java | 7 +- .../resourcestation/LivestockPenData.java | 35 +++++++ .../LivestockPenMenu.java | 32 +++++- .../resourcestation/ResourceStationData.java | 14 ++- .../resourcestation/ResourceStationMenu.java | 7 +- .../entityai/SupplyRequestPredicate.java | 2 +- .../entityai/tasks/MobInteractionTask.java | 2 +- .../core/datagen/ItemModelGeneration.java | 2 + .../industrialwarfare/core/init/MenuInit.java | 2 +- .../core/itemgroup/IWItemGroups.java | 3 +- .../core/network/IWNetwork.java | 1 + .../messages/ResourceStationMessages.java | 29 +++++- .../assets/industrialwarfare/lang/en_us.json | 4 + .../textures/item/animal_feed.png | Bin 0 -> 300 bytes 28 files changed, 348 insertions(+), 86 deletions(-) create mode 100644 src/generated/resources/assets/industrialwarfare/models/item/animal_feed.json create mode 100644 src/main/java/rbasamoyai/industrialwarfare/client/screen/resourcestation/LivestockPenScreen.java create mode 100644 src/main/java/rbasamoyai/industrialwarfare/common/containers/resourcestation/LivestockPenData.java rename src/main/java/rbasamoyai/industrialwarfare/common/containers/{ => resourcestation}/LivestockPenMenu.java (59%) create mode 100644 src/main/resources/assets/industrialwarfare/textures/item/animal_feed.png diff --git a/TODO b/TODO index 9df3b11..789eb7b 100644 --- a/TODO +++ b/TODO @@ -1,15 +1,11 @@ Current TODO: -- IT'S PORTIN' TIME! - - Fix stuff - - Bounds rendering for configurable blocks - Formulate an economy - Resource gathering - Mob resource gathering - Rancher - - Rancher screen - Resource refining - Metal smelting - Sawyer diff --git a/build.gradle b/build.gradle index acaf46a..9ed6d78 100644 --- a/build.gradle +++ b/build.gradle @@ -85,7 +85,7 @@ repositories { } dependencies { - minecraft 'net.minecraftforge:forge:1.18.2-40.1.51' + minecraft 'net.minecraftforge:forge:1.18.2-40.1.54' implementation fg.deobf('software.bernie.geckolib:geckolib-forge-1.18:3.0.27') // GeckoLib } diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index ec5027c..c499337 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -9,6 +9,7 @@ d44ae39a75d1489fdf49d3f887b07fa0cdcfe8d7 assets/industrialwarfare/blockstates/ta 8e7ad0313e5c674015ca2568766c6f67fe069851 assets/industrialwarfare/blockstates/worker_support.json 6ab1ed2bc23776af0b0017150f94797ff3293979 assets/industrialwarfare/models/item/american_kepi.json e0d699915b0a28d76628348c15b9a3b5ce0f319d assets/industrialwarfare/models/item/ammo_generic.json +18d6c5035bbd266c53dfee826ae74498c1b7f2a9 assets/industrialwarfare/models/item/animal_feed.json 19366433724d7ca5d9d24f251e79788e18bf5e6e assets/industrialwarfare/models/item/assembler_workstation.json 607f520ae1764b99ca448e6a07a1edfc7fecc8a8 assets/industrialwarfare/models/item/body_part.json 28fe6078f1bc9d6016e081c9618583f8fb12a795 assets/industrialwarfare/models/item/cartridge_case.json @@ -61,7 +62,7 @@ dd0e34b4f66bd8b20a0432a377b04d5e66cda336 data/industrialwarfare/loot_tables/bloc b70984139a51fbc8ea23564f57ad005b919b02fa data/industrialwarfare/loot_tables/blocks/tree_farm.json 072e6ae419a77caa4f5ef8781df2bbb2bace6b9a data/industrialwarfare/loot_tables/blocks/worker_support.json c7ddee0b522855299a1682c5ee2b5df455947a9a data/industrialwarfare/recipes/part_iron_wire.json -01d60ec8f745ad354c78ba84aa0ae777ba5d6754 data/industrialwarfare/recipes/part_screw.json +994aa17082e4014b41457bf3f3e828fd77ff5ab5 data/industrialwarfare/recipes/part_screw.json ad3e5145a88c2e7d2f35f1211b242e61ec730084 data/industrialwarfare/tags/blocks/can_plant_forestry.json 56196ce18ce9abf13cad6aa4ba17142a6cdbf360 data/industrialwarfare/tags/blocks/can_plant_fungus.json 83902db0bf4c0678a1637285fb34d1108bc60363 data/industrialwarfare/tags/blocks/can_plant_sapling.json diff --git a/src/generated/resources/assets/industrialwarfare/models/item/animal_feed.json b/src/generated/resources/assets/industrialwarfare/models/item/animal_feed.json new file mode 100644 index 0000000..9951f9b --- /dev/null +++ b/src/generated/resources/assets/industrialwarfare/models/item/animal_feed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "industrialwarfare:item/animal_feed" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/industrialwarfare/recipes/part_screw.json b/src/generated/resources/data/industrialwarfare/recipes/part_screw.json index b9a6fdd..8241e08 100644 --- a/src/generated/resources/data/industrialwarfare/recipes/part_screw.json +++ b/src/generated/resources/data/industrialwarfare/recipes/part_screw.json @@ -2,10 +2,10 @@ "type": "industrialwarfare:normal_workstation_recipe", "input": [ { - "item": "industrialwarfare:part_iron_wire" + "item": "minecraft:iron_nugget" }, { - "item": "minecraft:iron_nugget" + "item": "industrialwarfare:part_iron_wire" } ], "output": { diff --git a/src/main/java/rbasamoyai/industrialwarfare/client/events/ClientEvents.java b/src/main/java/rbasamoyai/industrialwarfare/client/events/ClientEvents.java index 20be280..a76f9a2 100644 --- a/src/main/java/rbasamoyai/industrialwarfare/client/events/ClientEvents.java +++ b/src/main/java/rbasamoyai/industrialwarfare/client/events/ClientEvents.java @@ -31,6 +31,7 @@ import rbasamoyai.industrialwarfare.client.screen.diplomacy.DiplomacyScreen; import rbasamoyai.industrialwarfare.client.screen.editlabel.EditLabelScreen; import rbasamoyai.industrialwarfare.client.screen.npc.NPCBaseScreen; +import rbasamoyai.industrialwarfare.client.screen.resourcestation.LivestockPenScreen; import rbasamoyai.industrialwarfare.client.screen.resourcestation.ResourceStationScreen; import rbasamoyai.industrialwarfare.client.screen.schedule.EditScheduleScreen; import rbasamoyai.industrialwarfare.client.screen.taskscroll.TaskScrollScreen; @@ -61,7 +62,7 @@ public static void onClientSetup(FMLClientSetupEvent event) { MenuScreens.register(MenuInit.TASK_SCROLL.get(), TaskScrollScreen::new); MenuScreens.register(MenuInit.TASK_SCROLL_SHELF.get(), TaskScrollShelfScreen::new); MenuScreens.register(MenuInit.WHISTLE.get(), WhistleScreen::new); - MenuScreens.register(MenuInit.LIVESTOCK_PEN.get(), null); + MenuScreens.register(MenuInit.LIVESTOCK_PEN.get(), LivestockPenScreen::new); ForgeRegistries.ITEMS.forEach(i -> { if (i instanceof FirearmItem) { diff --git a/src/main/java/rbasamoyai/industrialwarfare/client/screen/resourcestation/LivestockPenScreen.java b/src/main/java/rbasamoyai/industrialwarfare/client/screen/resourcestation/LivestockPenScreen.java new file mode 100644 index 0000000..f4460ea --- /dev/null +++ b/src/main/java/rbasamoyai/industrialwarfare/client/screen/resourcestation/LivestockPenScreen.java @@ -0,0 +1,56 @@ +package rbasamoyai.industrialwarfare.client.screen.resourcestation; + +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.world.entity.player.Inventory; +import net.minecraftforge.client.gui.widget.ForgeSlider; +import rbasamoyai.industrialwarfare.IndustrialWarfare; +import rbasamoyai.industrialwarfare.client.screen.widgets.WidgetUtils; +import rbasamoyai.industrialwarfare.common.containers.resourcestation.LivestockPenMenu; +import rbasamoyai.industrialwarfare.core.network.IWNetwork; +import rbasamoyai.industrialwarfare.core.network.messages.ResourceStationMessages.SSyncLivestockCount; + +public class LivestockPenScreen extends ResourceStationScreen { + + private static final int TOP_MENU_START_X = 7; + private static final int TOP_MENU_START_Y = 17; + + private ForgeSlider countSlider; + + public LivestockPenScreen(LivestockPenMenu menu, Inventory playerInv, Component title) { + super(menu, playerInv, title); + } + + @Override + protected void init() { + super.init(); + this.countSlider = this.addRenderableWidget(new ForgeSlider( + this.leftPos + TOP_MENU_START_X + 62, + this.topPos + TOP_MENU_START_Y + 30, + 100, 20, + new TranslatableComponent("gui." + IndustrialWarfare.MOD_ID + ".livestock_pen.minimum_livestock"), + TextComponent.EMPTY, + 2, 16, + this.menu.getMinimumLivestock(), + true)); + WidgetUtils.setActiveAndVisible(this.countSlider, this.menu.getSelected() == 0); + } + + @Override + public void containerTick() { + super.containerTick(); + + int tab = this.menu.getSelected(); + WidgetUtils.setActiveAndVisible(this.countSlider, tab == 0); + if (tab == 0) { + int count = this.countSlider.getValueInt(); + boolean flag = this.menu.getMinimumLivestock() != count; + if (flag) { + this.menu.setMinimumLivestock(count); + IWNetwork.CHANNEL.sendToServer(new SSyncLivestockCount(count)); + } + } + } + +} diff --git a/src/main/java/rbasamoyai/industrialwarfare/client/screen/resourcestation/ResourceStationScreen.java b/src/main/java/rbasamoyai/industrialwarfare/client/screen/resourcestation/ResourceStationScreen.java index c59c8c4..f1fa395 100644 --- a/src/main/java/rbasamoyai/industrialwarfare/client/screen/resourcestation/ResourceStationScreen.java +++ b/src/main/java/rbasamoyai/industrialwarfare/client/screen/resourcestation/ResourceStationScreen.java @@ -29,7 +29,7 @@ import rbasamoyai.industrialwarfare.core.network.messages.ResourceStationMessages.SSelectTab; import rbasamoyai.industrialwarfare.core.network.messages.ResourceStationMessages.SSetRunning; -public class ResourceStationScreen extends AbstractContainerScreen { +public class ResourceStationScreen extends AbstractContainerScreen { private static final ResourceLocation RESOURCE_GATHERING_GUI = new ResourceLocation(IndustrialWarfare.MOD_ID, "textures/gui/workstations/resource_station.png"); private static final ResourceLocation TABS_LOCATION = new ResourceLocation("textures/gui/container/creative_inventory/tabs.png"); @@ -85,7 +85,7 @@ public class ResourceStationScreen extends AbstractContainerScreen this.setRunning(b, false))); - this.startButton = this.addRenderableWidget(new Button(this.leftPos + TOP_MENU_START_X + 65, this.topPos + TOP_MENU_START_Y + 1, 80, 20, START_TEXT, b -> this.setRunning(b, true))); + this.stopButton = this.addRenderableWidget(new Button(this.leftPos + TOP_MENU_START_X + 72, this.topPos + TOP_MENU_START_Y + 1, 80, 20, STOP_TEXT, b -> this.setRunning(b, false))); + this.startButton = this.addRenderableWidget(new Button(this.leftPos + TOP_MENU_START_X + 72, this.topPos + TOP_MENU_START_Y + 1, 80, 20, START_TEXT, b -> this.setRunning(b, true))); boolean running = this.menu.isRunning(); WidgetUtils.setActiveAndVisible(this.startButton, !running); WidgetUtils.setActiveAndVisible(this.stopButton, running); @@ -176,7 +176,7 @@ private void renderTabButton(PoseStack stack, int x, int y, ItemStack icon, int this.itemRenderer.blitOffset = 0.0f; } - private void renderScrollList(PoseStack stack, List list, Function func) { + private void renderScrollList(PoseStack stack, List list, Function func) { blit(stack, this.leftPos + TOP_MENU_START_X, this.topPos + TOP_MENU_START_Y, TOP_MENU_REQUESTS_TEX_X, TOP_MENU_REQUESTS_TEX_Y, TOP_MENU_REQUESTS_WIDTH, TOP_MENU_REQUESTS_HEIGHT, TEX_WIDTH, TEX_HEIGHT); int base = this.getBaseIndex(list); @@ -234,7 +234,7 @@ protected void renderTooltip(PoseStack stack, int mouseX, int mouseY) { } } - private void renderListTooltip(PoseStack stack, int mouseX, int mouseY, List list, Function func) { + private void renderListTooltip(PoseStack stack, int mouseX, int mouseY, List list, Function func) { int d0 = mouseX - this.leftPos; int d1 = mouseY - this.topPos; diff --git a/src/main/java/rbasamoyai/industrialwarfare/common/blockentities/FarmingPlotBlockEntity.java b/src/main/java/rbasamoyai/industrialwarfare/common/blockentities/FarmingPlotBlockEntity.java index 2b8a5a0..5f15cb0 100644 --- a/src/main/java/rbasamoyai/industrialwarfare/common/blockentities/FarmingPlotBlockEntity.java +++ b/src/main/java/rbasamoyai/industrialwarfare/common/blockentities/FarmingPlotBlockEntity.java @@ -122,12 +122,10 @@ public BlockInteraction getInteraction(LivingEntity entity) { return null; } - for (Map.Entry entry : this.currentTasks.entrySet()) { - if (entry.getValue() == entity) { - this.posCache.remove(entry.getKey()); - this.currentTasks.remove(entry.getKey()); - break; - } + BlockPos workingPos = this.currentTasks.inverse().get(entity); + if (workingPos != null) { + this.posCache.remove(workingPos); + this.currentTasks.remove(workingPos); } if (this.posCache.isEmpty() && this.searchCooldown <= 0) { @@ -207,11 +205,14 @@ private boolean canHarvest(BlockPos pos) { } private void plantSeeds(Level level, BlockPos pos, LivingEntity entity) { - ItemStack stack = entity.getOffhandItem(); - Item item = stack.getItem(); - if (stack.is(Tags.Items.SEEDS) && item instanceof BlockItem) { - level.setBlockAndUpdate(pos, ((BlockItem) item).getBlock().defaultBlockState()); - stack.shrink(1); + for (InteractionHand hand : InteractionHand.values()) { + ItemStack stack = entity.getItemInHand(hand); + Item item = stack.getItem(); + if (stack.is(Tags.Items.SEEDS) && item instanceof BlockItem) { + level.setBlockAndUpdate(pos, ((BlockItem) item).getBlock().defaultBlockState()); + stack.shrink(1); + return; + } } } @@ -289,10 +290,11 @@ public AABB getBoxForRenderingCurrentBounds(ItemStack stack) { @Override public BlockPos startingCorner() { return this.startingCorner; } @Override public BlockPos endingCorner() { return this.endingCorner; } - protected void purgeEntries() { - for (Map.Entry entry : this.currentTasks.entrySet()) { + private void purgeEntries() { + for (Iterator> iter = this.currentTasks.entrySet().iterator(); iter.hasNext(); ) { + Map.Entry entry = iter.next(); if (entry.getValue().isDeadOrDying()) { - this.currentTasks.remove(entry.getKey()); + iter.remove(); } } } diff --git a/src/main/java/rbasamoyai/industrialwarfare/common/blockentities/LivestockPenBlockEntity.java b/src/main/java/rbasamoyai/industrialwarfare/common/blockentities/LivestockPenBlockEntity.java index e0c4ddf..4347512 100644 --- a/src/main/java/rbasamoyai/industrialwarfare/common/blockentities/LivestockPenBlockEntity.java +++ b/src/main/java/rbasamoyai/industrialwarfare/common/blockentities/LivestockPenBlockEntity.java @@ -2,17 +2,18 @@ import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Set; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.Containers; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; @@ -25,6 +26,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.gameevent.GameEvent; import net.minecraft.world.level.pathfinder.PathComputationType; import net.minecraft.world.phys.AABB; import net.minecraftforge.common.IForgeShearable; @@ -55,13 +57,19 @@ public LivestockPenBlockEntity(BlockEntityType entry : this.currentTasks.entrySet()) { - if (entry.getValue() == entity) { - this.mobCache.remove(entry.getKey()); - this.currentTasks.remove(entry.getKey()); - break; - } + Mob workingMob = this.currentTasks.inverse().get(entity); + if (workingMob != null) { + this.mobCache.remove(workingMob); + this.currentTasks.remove(workingMob); } if (this.mobCache.isEmpty() && this.searchCooldown <= 0) { @@ -108,21 +114,41 @@ private void generateCache() { List unculledAnimals = new ArrayList<>(); for (Animal animal : animals) { - if (animalCount.computeIfAbsent(animal.getType(), e -> 1) >= this.minimumLivestock && canCull) { + int count = animalCount.compute(animal.getType(), (t, c) -> c == null ? 1 : c + 1); + if (animal.isBaby()) continue; + if (canCull && count > this.minimumLivestock) { this.mobCache.put(animal, MobInteraction.killMob(animal, SupplyRequestPredicate.ANY)); } else { - animalCount.compute(animal.getType(), (e, c) -> c + 1); unculledAnimals.add(animal); } } + Map, Integer> breedableAnimals = new HashMap<>(); + for (Animal animal : unculledAnimals) { + breedableAnimals.compute(animal.getType(), (t, c) -> { + int base = c == null ? 0 : c; + return this.canFeedAnimal(animal) ? base + 1 : base; + }); + } + + Set> breedableTypes = new HashSet<>(); + for (EntityType type : animalCount.keySet()) { + if (animalCount.get(type) <= this.minimumLivestock && breedableAnimals.compute(type, (t, c) -> c == null ? 0 : c) >= 2) { + breedableTypes.add(type); + } + } + for (Animal animal : unculledAnimals) { - if (animalCount.get(animal.getType()) <= this.minimumLivestock) { + EntityType type = animal.getType(); + if (breedableTypes.contains(type) && this.canFeedAnimal(animal)) { this.mobCache.put(animal, MobInteraction.useItemOnMob( animal, SupplyRequestPredicate.forItem(ItemInit.ANIMAL_FEED.get(), IntBound.atLeast(1)), this::feedMob, this::canFeedMob)); + if (breedableAnimals.compute(type, (t, c) -> c == null || c <= 0 ? 0 : c - 1) <= 0) { + breedableTypes.remove(type); + } } else { MobInteraction interaction = this.getInteractionForAnimal(animal); if (interaction != null) this.mobCache.put(animal, interaction); @@ -130,7 +156,7 @@ private void generateCache() { } if (canCull) { - this.timeToNextCull = 6000L; + this.timeToNextCull = 3000L; } } @@ -162,15 +188,12 @@ private boolean hasSupply(SupplyRequestPredicate predicate) { private void shearAnimal(Mob target, LivingEntity actor) { ItemStack stack = actor.getMainHandItem(); if (stack.is(Items.SHEARS) && target instanceof IForgeShearable) { + actor.swing(InteractionHand.MAIN_HAND); int fortune = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.BLOCK_FORTUNE, stack); List drops = ((IForgeShearable) target).onSheared(null, stack, target.level, target.blockPosition(), fortune); - double x = target.getX(); - double y = target.getY(); - double z = target.getZ(); - drops.forEach(s -> { - Containers.dropItemStack(target.level, x, y, z, s); + actor.spawnAtLocation(s, 1.0f); }); stack.hurtAndBreak(1, actor, e -> { @@ -186,7 +209,9 @@ private boolean canShearAnimal(Mob target, LivingEntity actor) { private void milkCow(Mob target, LivingEntity actor) { ItemStack stack = actor.getMainHandItem(); if (target.getType() == EntityType.COW && stack.is(Items.BUCKET)) { - actor.setItemInHand(InteractionHand.MAIN_HAND, new ItemStack(Items.MILK_BUCKET)); + actor.swing(InteractionHand.MAIN_HAND); + stack.shrink(1); + actor.spawnAtLocation(new ItemStack(Items.MILK_BUCKET), 1.0f); } } @@ -197,7 +222,9 @@ private boolean canMilkCow(Mob target, LivingEntity actor) { private void milkMooshroom(Mob target, LivingEntity actor) { ItemStack stack = actor.getMainHandItem(); if (target.getType() == EntityType.MOOSHROOM && stack.is(Items.BOWL)) { - actor.setItemInHand(InteractionHand.MAIN_HAND, new ItemStack(Items.MUSHROOM_STEW)); + actor.swing(InteractionHand.MAIN_HAND); + stack.shrink(1); + actor.spawnAtLocation(new ItemStack(Items.MILK_BUCKET), 1.0f); } } @@ -206,14 +233,20 @@ private boolean canMilkMooshroom(Mob target, LivingEntity actor) { } private void feedMob(Mob target, LivingEntity actor) { - if (target instanceof Animal && actor.getMainHandItem().is(ItemInit.ANIMAL_FEED.get())) { + if (actor.getMainHandItem().is(ItemInit.ANIMAL_FEED.get())) { + actor.swing(InteractionHand.MAIN_HAND); ((Animal) target).setInLove(null); + target.gameEvent(GameEvent.MOB_INTERACT, target.eyeBlockPosition()); actor.getMainHandItem().shrink(1); } } private boolean canFeedMob(Mob target, LivingEntity actor) { - return target instanceof Animal && !((Animal) target).isInLove(); + return target instanceof Animal && this.canFeedAnimal((Animal) target); + } + + private boolean canFeedAnimal(Animal animal) { + return animal.getAge() == 0 && animal.canFallInLove(); } @Override @@ -227,15 +260,34 @@ protected void findItemsToPickUp() { })); } + public void setMinimumLivestock(int minimumLivestock) { this.minimumLivestock = Math.max(minimumLivestock, 2); } + public int getMinimumLivestock() { return this.minimumLivestock; } + + private void purgeEntries() { + for (Iterator> iter = this.currentTasks.entrySet().iterator(); iter.hasNext(); ) { + Map.Entry e = iter.next(); + if (!e.getKey().isAlive() || !e.getValue().isAlive()) { + iter.remove(); + this.mobCache.remove(e.getKey()); + } + } + } + public static void serverTicker(Level level, BlockPos pos, BlockState state, LivestockPenBlockEntity pen) { ++pen.clockTicks; if (pen.clockTicks >= 20) { pen.clockTicks = 0; + + pen.purgeEntries(); } if (pen.timeToNextCull > 0) { --pen.timeToNextCull; } + + if (pen.searchCooldown > 0) { + --pen.searchCooldown; + } } } diff --git a/src/main/java/rbasamoyai/industrialwarfare/common/blockentities/QuarryBlockEntity.java b/src/main/java/rbasamoyai/industrialwarfare/common/blockentities/QuarryBlockEntity.java index 797ecc3..bb5aee1 100644 --- a/src/main/java/rbasamoyai/industrialwarfare/common/blockentities/QuarryBlockEntity.java +++ b/src/main/java/rbasamoyai/industrialwarfare/common/blockentities/QuarryBlockEntity.java @@ -76,9 +76,10 @@ public void setRunning(boolean running) { } protected void purgeEntries() { - for (Map.Entry entry : this.currentTasks.entrySet()) { + for (Iterator> iter = this.currentTasks.entrySet().iterator(); iter.hasNext(); ) { + Map.Entry entry = iter.next(); if (entry.getValue().isDeadOrDying()) { - this.currentTasks.remove(entry.getKey()); + iter.remove(); } } } @@ -96,12 +97,10 @@ public BlockInteraction getInteraction(LivingEntity entity) { return null; } - for (Map.Entry entry : this.currentTasks.entrySet()) { - if (entry.getValue() == entity) { - this.posCache.remove(entry.getKey()); - this.currentTasks.remove(entry.getKey()); - break; - } + BlockPos workingPos = this.currentTasks.inverse().get(entity); + if (workingPos != null) { + this.posCache.remove(workingPos); + this.currentTasks.remove(workingPos); } if (this.posCache.isEmpty()) { diff --git a/src/main/java/rbasamoyai/industrialwarfare/common/blockentities/ResourceStationBlockEntity.java b/src/main/java/rbasamoyai/industrialwarfare/common/blockentities/ResourceStationBlockEntity.java index 7900d84..dd86178 100644 --- a/src/main/java/rbasamoyai/industrialwarfare/common/blockentities/ResourceStationBlockEntity.java +++ b/src/main/java/rbasamoyai/industrialwarfare/common/blockentities/ResourceStationBlockEntity.java @@ -20,8 +20,10 @@ import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.ClientGamePacketListener; import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; @@ -31,6 +33,7 @@ import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.network.PacketDistributor; +import rbasamoyai.industrialwarfare.common.containers.resourcestation.ResourceStationMenu; import rbasamoyai.industrialwarfare.common.entityai.SupplyRequestPredicate; import rbasamoyai.industrialwarfare.core.network.IWNetwork; import rbasamoyai.industrialwarfare.core.network.messages.ResourceStationMessages.CSyncExtraStock; @@ -185,7 +188,12 @@ public List getRequests() { } public void updateContainerRequests() { - IWNetwork.CHANNEL.send(PacketDistributor.TRACKING_CHUNK.with(() -> this.level.getChunkAt(this.worldPosition)), new CSyncRequests(this.getRequests())); + if (this.level.isClientSide) return; + for (Player player : this.level.players()) { + if (!(player instanceof ServerPlayer)) continue; + if (!(player.containerMenu instanceof ResourceStationMenu) || !((ResourceStationMenu) player.containerMenu).isSameBlockEntity(this)) continue; + IWNetwork.CHANNEL.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new CSyncRequests(this.getRequests())); + } } public void setOrAddExtraStock(SupplyRequestPredicate predicate, int index) { diff --git a/src/main/java/rbasamoyai/industrialwarfare/common/blockentities/TreeFarmBlockEntity.java b/src/main/java/rbasamoyai/industrialwarfare/common/blockentities/TreeFarmBlockEntity.java index 40d28f7..1876a25 100644 --- a/src/main/java/rbasamoyai/industrialwarfare/common/blockentities/TreeFarmBlockEntity.java +++ b/src/main/java/rbasamoyai/industrialwarfare/common/blockentities/TreeFarmBlockEntity.java @@ -1,6 +1,7 @@ package rbasamoyai.industrialwarfare.common.blockentities; import java.util.HashMap; +import java.util.Iterator; import java.util.LinkedList; import java.util.Map; import java.util.Queue; @@ -137,9 +138,10 @@ public void setRunning(boolean running) { } protected void purgeEntries() { - for (LivingEntity worker : this.treeWorkers.keySet()) { + for (Iterator iter = this.treeWorkers.keySet().iterator(); iter.hasNext(); ) { + LivingEntity worker = iter.next(); if (worker.isDeadOrDying()) { - this.treeWorkers.remove(worker); + iter.remove(); } } } diff --git a/src/main/java/rbasamoyai/industrialwarfare/common/blocks/LivestockPenBlock.java b/src/main/java/rbasamoyai/industrialwarfare/common/blocks/LivestockPenBlock.java index e535a73..daeb584 100644 --- a/src/main/java/rbasamoyai/industrialwarfare/common/blocks/LivestockPenBlock.java +++ b/src/main/java/rbasamoyai/industrialwarfare/common/blocks/LivestockPenBlock.java @@ -1,6 +1,19 @@ package rbasamoyai.industrialwarfare.common.blocks; +import java.util.List; + import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.SimpleMenuProvider; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.MenuConstructor; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; @@ -14,7 +27,11 @@ import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraftforge.network.NetworkHooks; import rbasamoyai.industrialwarfare.common.blockentities.LivestockPenBlockEntity; +import rbasamoyai.industrialwarfare.common.containers.resourcestation.LivestockPenMenu; +import rbasamoyai.industrialwarfare.common.entityai.SupplyRequestPredicate; import rbasamoyai.industrialwarfare.core.init.BlockEntityTypeInit; public class LivestockPenBlock extends ResourceStationBlock { @@ -51,5 +68,35 @@ public BlockState getStateForPlacement(BlockPlaceContext context) { public BlockEntityTicker getTicker(Level pLevel, BlockState pState, BlockEntityType pBlockEntityType) { return pLevel.isClientSide ? null : createTickerHelper(pBlockEntityType, BlockEntityTypeInit.LIVESTOCK_PEN.get(), LivestockPenBlockEntity::serverTicker); } + + @Override + public InteractionResult use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult result) { + if (level.isClientSide) return InteractionResult.SUCCESS; + if (!(player instanceof ServerPlayer)) return InteractionResult.SUCCESS; + + BlockEntity be = level.getBlockEntity(pos); + if (!(be instanceof LivestockPenBlockEntity)) return InteractionResult.FAIL; + LivestockPenBlockEntity pen = (LivestockPenBlockEntity) be; + + ResourceLocation beReg = this.getRegistryName(); + MenuConstructor constructor = LivestockPenMenu.getServerContainerProvider(pen, pos); + Component title = new TranslatableComponent("tile." + beReg.getNamespace() + "." + beReg.getPath()); + MenuProvider provider = new SimpleMenuProvider(constructor, title); + NetworkHooks.openGui((ServerPlayer) player, provider, buf -> { + buf.writeBlockPos(pos); + buf.writeItem(new ItemStack(this.asItem())); + buf.writeBoolean(pen.isRunning()); + buf.writeVarInt(pen.getMinimumLivestock()); + + List requests = pen.getRequests(); + buf.writeVarInt(requests.size()); + requests.forEach(p -> p.toNetwork(buf)); + + List extraStock = pen.getExtraStock(); + buf.writeVarInt(extraStock.size()); + extraStock.forEach(p -> p.toNetwork(buf)); + }); + return InteractionResult.CONSUME; + } } diff --git a/src/main/java/rbasamoyai/industrialwarfare/common/blocks/ResourceStationBlock.java b/src/main/java/rbasamoyai/industrialwarfare/common/blocks/ResourceStationBlock.java index 27e92b4..e0ec8af 100644 --- a/src/main/java/rbasamoyai/industrialwarfare/common/blocks/ResourceStationBlock.java +++ b/src/main/java/rbasamoyai/industrialwarfare/common/blocks/ResourceStationBlock.java @@ -54,15 +54,14 @@ public InteractionResult use(BlockState state, Level level, BlockPos pos, Player if (!(player instanceof ServerPlayer)) return InteractionResult.SUCCESS; BlockEntity te = level.getBlockEntity(pos); - if (te == null) return InteractionResult.FAIL; if (!(te instanceof ResourceStationBlockEntity)) return InteractionResult.FAIL; ResourceStationBlockEntity resourceStation = (ResourceStationBlockEntity) te; ResourceLocation beReg = this.getRegistryName(); - MenuConstructor containerProvider = ResourceStationMenu.getServerContainerProvider(resourceStation, pos); + MenuConstructor constructor = ResourceStationMenu.getServerContainerProvider(resourceStation, pos); Component title = new TranslatableComponent("tile." + beReg.getNamespace() + "." + beReg.getPath()); - MenuProvider namedContainerProvider = new SimpleMenuProvider(containerProvider, title); - NetworkHooks.openGui((ServerPlayer) player, namedContainerProvider, buf -> { + MenuProvider provider = new SimpleMenuProvider(constructor, title); + NetworkHooks.openGui((ServerPlayer) player, provider, buf -> { buf.writeBlockPos(pos); buf.writeItem(new ItemStack(this.asItem())); buf.writeBoolean(resourceStation.isRunning()); diff --git a/src/main/java/rbasamoyai/industrialwarfare/common/containers/resourcestation/LivestockPenData.java b/src/main/java/rbasamoyai/industrialwarfare/common/containers/resourcestation/LivestockPenData.java new file mode 100644 index 0000000..3c6ae82 --- /dev/null +++ b/src/main/java/rbasamoyai/industrialwarfare/common/containers/resourcestation/LivestockPenData.java @@ -0,0 +1,35 @@ +package rbasamoyai.industrialwarfare.common.containers.resourcestation; + +import rbasamoyai.industrialwarfare.common.blockentities.LivestockPenBlockEntity; + +public class LivestockPenData extends ResourceStationData { + + private final LivestockPenBlockEntity pen; + + public LivestockPenData(LivestockPenBlockEntity be) { + super(be); + this.pen = be; + } + + @Override + public int get(int index) { + return switch (index) { + case 2 -> this.pen.getMinimumLivestock(); + default -> super.get(index); + }; + } + + @Override + public void set(int index, int value) { + switch (index) { + case 2 -> this.pen.setMinimumLivestock(value); + default -> super.set(index, value); + } + } + + @Override + public int getCount() { + return 3; + } + +} diff --git a/src/main/java/rbasamoyai/industrialwarfare/common/containers/LivestockPenMenu.java b/src/main/java/rbasamoyai/industrialwarfare/common/containers/resourcestation/LivestockPenMenu.java similarity index 59% rename from src/main/java/rbasamoyai/industrialwarfare/common/containers/LivestockPenMenu.java rename to src/main/java/rbasamoyai/industrialwarfare/common/containers/resourcestation/LivestockPenMenu.java index 441b6db..00e66c1 100644 --- a/src/main/java/rbasamoyai/industrialwarfare/common/containers/LivestockPenMenu.java +++ b/src/main/java/rbasamoyai/industrialwarfare/common/containers/resourcestation/LivestockPenMenu.java @@ -1,6 +1,10 @@ -package rbasamoyai.industrialwarfare.common.containers; +package rbasamoyai.industrialwarfare.common.containers.resourcestation; +import java.util.ArrayList; +import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.IntStream; import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; @@ -13,23 +17,40 @@ import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.ItemStackHandler; import rbasamoyai.industrialwarfare.common.blockentities.LivestockPenBlockEntity; -import rbasamoyai.industrialwarfare.common.containers.resourcestation.ResourceStationMenu; +import rbasamoyai.industrialwarfare.common.entityai.SupplyRequestPredicate; import rbasamoyai.industrialwarfare.core.init.MenuInit; public class LivestockPenMenu extends ResourceStationMenu { public static LivestockPenMenu getClientContainer(int windowId, Inventory playerInv, FriendlyByteBuf buf) { - return new LivestockPenMenu(MenuInit.LIVESTOCK_PEN.get(), windowId, + LivestockPenMenu ct = new LivestockPenMenu(MenuInit.LIVESTOCK_PEN.get(), windowId, playerInv, buf.readBlockPos(), new ItemStackHandler(27), new ItemStackHandler(27), new SimpleContainerData(3), Optional.empty(), buf.readItem()); + + ct.setRunning(buf.readBoolean()); + ct.setMinimumLivestock(buf.readVarInt()); + + List predicates = + IntStream.range(0, buf.readVarInt()).boxed() + .map(i -> SupplyRequestPredicate.fromNetwork(buf)) + .collect(Collectors.toCollection(ArrayList::new)); + ct.setRequests(predicates); + + List extraSupplies = + IntStream.range(0, buf.readVarInt()).boxed() + .map(i -> SupplyRequestPredicate.fromNetwork(buf)) + .collect(Collectors.toCollection(ArrayList::new)); + ct.setExtraStock(extraSupplies); + + return ct; } public static MenuConstructor getServerContainerProvider(LivestockPenBlockEntity be, BlockPos activationPos) { return (windowId, playerInv, player) -> new LivestockPenMenu( MenuInit.LIVESTOCK_PEN.get(), windowId, playerInv, activationPos, be.getBuffer(), be.getSupplies(), - new SimpleContainerData(3), Optional.of(be), ItemStack.EMPTY); + new LivestockPenData(be), Optional.of(be), ItemStack.EMPTY); } protected LivestockPenMenu(MenuType type, int windowId, Inventory playerInv, BlockPos activationPos, @@ -38,6 +59,7 @@ protected LivestockPenMenu(MenuType type, int window super(type, windowId, playerInv, activationPos, bufferHandler, suppliesHandler, data, optionalTE, icon); } - + public void setMinimumLivestock(int count) { this.setData(2, count); } + public int getMinimumLivestock() { return this.data.get(2); } } diff --git a/src/main/java/rbasamoyai/industrialwarfare/common/containers/resourcestation/ResourceStationData.java b/src/main/java/rbasamoyai/industrialwarfare/common/containers/resourcestation/ResourceStationData.java index 7889fa8..31a0c6d 100644 --- a/src/main/java/rbasamoyai/industrialwarfare/common/containers/resourcestation/ResourceStationData.java +++ b/src/main/java/rbasamoyai/industrialwarfare/common/containers/resourcestation/ResourceStationData.java @@ -13,19 +13,17 @@ public ResourceStationData(ResourceStationBlockEntity te) { @Override public int get(int index) { - switch (index) { - case 0: return this.te.isRunning() ? 1 : 0; - case 1: return this.te.isFinished() ? 1 : 0; - default: return 0; - } + return switch (index) { + case 0 -> this.te.isRunning() ? 1 : 0; + case 1 -> this.te.isFinished() ? 1 : 0; + default -> 0; + }; } @Override public void set(int index, int value) { switch (index) { - case 0: - this.te.setRunning(value != 0); - break; + case 0 -> this.te.setRunning(value != 0); } } diff --git a/src/main/java/rbasamoyai/industrialwarfare/common/containers/resourcestation/ResourceStationMenu.java b/src/main/java/rbasamoyai/industrialwarfare/common/containers/resourcestation/ResourceStationMenu.java index cd3c6af..bda7857 100644 --- a/src/main/java/rbasamoyai/industrialwarfare/common/containers/resourcestation/ResourceStationMenu.java +++ b/src/main/java/rbasamoyai/industrialwarfare/common/containers/resourcestation/ResourceStationMenu.java @@ -19,6 +19,7 @@ import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.ItemStackHandler; import rbasamoyai.industrialwarfare.common.blockentities.ResourceStationBlockEntity; @@ -58,7 +59,7 @@ public class ResourceStationMenu extends AbstractContainerMenu { private final ItemStack icon; private final List requests = new ArrayList<>(); private final List extraStock = new ArrayList<>(); - private final ContainerData data; + protected final ContainerData data; private boolean changed = false; @@ -230,5 +231,9 @@ public boolean stillValid(Player player) { } public ItemStack getIcon() { return this.icon; } + + public boolean isSameBlockEntity(BlockEntity blockEntity) { + return this.optionalTE.map(blockEntity::equals).orElse(false); + } } diff --git a/src/main/java/rbasamoyai/industrialwarfare/common/entityai/SupplyRequestPredicate.java b/src/main/java/rbasamoyai/industrialwarfare/common/entityai/SupplyRequestPredicate.java index b241235..183e009 100644 --- a/src/main/java/rbasamoyai/industrialwarfare/common/entityai/SupplyRequestPredicate.java +++ b/src/main/java/rbasamoyai/industrialwarfare/common/entityai/SupplyRequestPredicate.java @@ -174,7 +174,7 @@ public static SupplyRequestPredicate fromNetwork(FriendlyByteBuf buf) { public static SupplyRequestPredicate fromNBT(CompoundTag nbt) { TagKey tag = nbt.contains("tag") ? ForgeRegistries.ITEMS.tags().createTagKey(new ResourceLocation(nbt.getString("tag"))) : null; - Item item = nbt.contains("item") ? ForgeRegistries.ITEMS.getValue(new ResourceLocation(nbt.getString("count"))) : null; + Item item = nbt.contains("item") ? ForgeRegistries.ITEMS.getValue(new ResourceLocation(nbt.getString("item"))) : null; IntBound count = IntBound.readBound(nbt.getCompound("count")); ToolAction action = nbt.contains("toolAction") ? ToolAction.get(nbt.getString("toolAction")) : null; Tier tier = nbt.contains("toolTier") ? TierSortingRegistry.byName(new ResourceLocation(nbt.getString("toolTier"))) : null; diff --git a/src/main/java/rbasamoyai/industrialwarfare/common/entityai/tasks/MobInteractionTask.java b/src/main/java/rbasamoyai/industrialwarfare/common/entityai/tasks/MobInteractionTask.java index ce07fde..e583fda 100644 --- a/src/main/java/rbasamoyai/industrialwarfare/common/entityai/tasks/MobInteractionTask.java +++ b/src/main/java/rbasamoyai/industrialwarfare/common/entityai/tasks/MobInteractionTask.java @@ -21,7 +21,7 @@ public MobInteractionTask() { super(ImmutableMap.of( MemoryModuleType.LOOK_TARGET, MemoryStatus.REGISTERED, MemoryModuleType.WALK_TARGET, MemoryStatus.REGISTERED, - MemoryModuleTypeInit.MOB_INTERACTION.get(), MemoryStatus.VALUE_PRESENT)); + MemoryModuleTypeInit.MOB_INTERACTION.get(), MemoryStatus.VALUE_PRESENT), 1200); } @Override diff --git a/src/main/java/rbasamoyai/industrialwarfare/core/datagen/ItemModelGeneration.java b/src/main/java/rbasamoyai/industrialwarfare/core/datagen/ItemModelGeneration.java index 8e64dd6..ae62398 100644 --- a/src/main/java/rbasamoyai/industrialwarfare/core/datagen/ItemModelGeneration.java +++ b/src/main/java/rbasamoyai/industrialwarfare/core/datagen/ItemModelGeneration.java @@ -119,6 +119,8 @@ protected void registerModels() { simpleBuilder("surveyors_kit"); + simpleBuilder("animal_feed"); + LOGGER.debug("Finished generating item models for rbasamoyai's Industrial Warfare mod"); } diff --git a/src/main/java/rbasamoyai/industrialwarfare/core/init/MenuInit.java b/src/main/java/rbasamoyai/industrialwarfare/core/init/MenuInit.java index e2345ff..fdb2a46 100644 --- a/src/main/java/rbasamoyai/industrialwarfare/core/init/MenuInit.java +++ b/src/main/java/rbasamoyai/industrialwarfare/core/init/MenuInit.java @@ -8,12 +8,12 @@ import rbasamoyai.industrialwarfare.IndustrialWarfare; import rbasamoyai.industrialwarfare.common.containers.DiplomacyMenu; import rbasamoyai.industrialwarfare.common.containers.EditLabelMenu; -import rbasamoyai.industrialwarfare.common.containers.LivestockPenMenu; import rbasamoyai.industrialwarfare.common.containers.TaskScrollMenu; import rbasamoyai.industrialwarfare.common.containers.WhistleMenu; import rbasamoyai.industrialwarfare.common.containers.attachmentitems.AttachmentsRifleMenu; import rbasamoyai.industrialwarfare.common.containers.matchcoil.MatchCoilMenu; import rbasamoyai.industrialwarfare.common.containers.npcs.NPCMenu; +import rbasamoyai.industrialwarfare.common.containers.resourcestation.LivestockPenMenu; import rbasamoyai.industrialwarfare.common.containers.resourcestation.ResourceStationMenu; import rbasamoyai.industrialwarfare.common.containers.schedule.EditScheduleMenu; import rbasamoyai.industrialwarfare.common.containers.taskscrollshelf.TaskScrollShelfMenu; diff --git a/src/main/java/rbasamoyai/industrialwarfare/core/itemgroup/IWItemGroups.java b/src/main/java/rbasamoyai/industrialwarfare/core/itemgroup/IWItemGroups.java index a698538..7b61012 100644 --- a/src/main/java/rbasamoyai/industrialwarfare/core/itemgroup/IWItemGroups.java +++ b/src/main/java/rbasamoyai/industrialwarfare/core/itemgroup/IWItemGroups.java @@ -85,7 +85,8 @@ public void fillItemList(NonNullList items) { getItemStack(ItemInit.MATCH_CORD), getItemStack(ItemInit.INFINITE_MATCH_CORD), getItemStack(ItemInit.MATCH_COIL), - getItemStack(ItemInit.SURVEYORS_KIT) + getItemStack(ItemInit.SURVEYORS_KIT), + getItemStack(ItemInit.ANIMAL_FEED) )); } diff --git a/src/main/java/rbasamoyai/industrialwarfare/core/network/IWNetwork.java b/src/main/java/rbasamoyai/industrialwarfare/core/network/IWNetwork.java index b45fa50..2e487d2 100644 --- a/src/main/java/rbasamoyai/industrialwarfare/core/network/IWNetwork.java +++ b/src/main/java/rbasamoyai/industrialwarfare/core/network/IWNetwork.java @@ -59,6 +59,7 @@ public static void init() { CHANNEL.registerMessage(id++, ResourceStationMessages.SSetExtraStock.class, ResourceStationMessages.SSetExtraStock::encode, ResourceStationMessages.SSetExtraStock::decode, ResourceStationMessages.SSetExtraStock::handle); CHANNEL.registerMessage(id++, ResourceStationMessages.CSyncExtraStock.class, ResourceStationMessages.CSyncExtraStock::encode, ResourceStationMessages.CSyncExtraStock::decode, ResourceStationMessages.CSyncExtraStock::handle); CHANNEL.registerMessage(id++, ResourceStationMessages.SRemoveExtraStock.class, ResourceStationMessages.SRemoveExtraStock::encode, ResourceStationMessages.SRemoveExtraStock::decode, ResourceStationMessages.SRemoveExtraStock::handle); + CHANNEL.registerMessage(id++, ResourceStationMessages.SSyncLivestockCount.class, ResourceStationMessages.SSyncLivestockCount::encode, ResourceStationMessages.SSyncLivestockCount::new, ResourceStationMessages.SSyncLivestockCount::handle); } @SubscribeEvent diff --git a/src/main/java/rbasamoyai/industrialwarfare/core/network/messages/ResourceStationMessages.java b/src/main/java/rbasamoyai/industrialwarfare/core/network/messages/ResourceStationMessages.java index c2ab96c..65c2924 100644 --- a/src/main/java/rbasamoyai/industrialwarfare/core/network/messages/ResourceStationMessages.java +++ b/src/main/java/rbasamoyai/industrialwarfare/core/network/messages/ResourceStationMessages.java @@ -11,6 +11,7 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.network.NetworkEvent; +import rbasamoyai.industrialwarfare.common.containers.resourcestation.LivestockPenMenu; import rbasamoyai.industrialwarfare.common.containers.resourcestation.ResourceStationMenu; import rbasamoyai.industrialwarfare.common.entityai.SupplyRequestPredicate; import rbasamoyai.industrialwarfare.core.network.handlers.ResourceStationCHandlers; @@ -20,8 +21,6 @@ public class ResourceStationMessages { public static class SSelectTab { private int selectedTab; - public SSelectTab() {} - public SSelectTab(int selectedTab) { this.selectedTab = selectedTab; } @@ -201,4 +200,30 @@ public static void handle(CSyncExtraStock msg, Supplier su } } + public static class SSyncLivestockCount { + private final int count; + + public SSyncLivestockCount(int count) { + this.count = count; + } + + public SSyncLivestockCount(FriendlyByteBuf buf) { + this.count = buf.readVarInt(); + } + + public void encode(FriendlyByteBuf buf) { + buf.writeVarInt(this.count); + } + + public void handle(Supplier sup) { + NetworkEvent.Context ctx = sup.get(); + ctx.enqueueWork(() -> { + AbstractContainerMenu ct = ctx.getSender().containerMenu; + if (!(ct instanceof LivestockPenMenu)) return; + ((LivestockPenMenu) ct).setMinimumLivestock(this.count); + }); + ctx.setPacketHandled(true); + } + } + } \ No newline at end of file diff --git a/src/main/resources/assets/industrialwarfare/lang/en_us.json b/src/main/resources/assets/industrialwarfare/lang/en_us.json index 1ba9e0c..9554429 100644 --- a/src/main/resources/assets/industrialwarfare/lang/en_us.json +++ b/src/main/resources/assets/industrialwarfare/lang/en_us.json @@ -61,6 +61,7 @@ "item.industrialwarfare.task_scroll": "Task Scroll", "item.industrialwarfare.label": "Label", "item.industrialwarfare.schedule": "Schedule", + "item.industrialwarfare.animal_feed": "Animal Feed", "item.industrialwarfare.job_site_pointer": "Job Site Pointer", "item.industrialwarfare.debug_owner": "Debug Owner", @@ -429,6 +430,8 @@ "gui.industrialwarfare.resource_station.extra_stock": "Extra Stock", "gui.industrialwarfare.resource_station.remove_extra_stock": "Right click to remove", + "gui.industrialwarfare.livestock_pen.minimum_livestock": "Minimum mobs: ", + "command.industrialwarfare.move_to": "Move to", "command.industrialwarfare.take_from": "Take from", "command.industrialwarfare.deposit_at": "Deposit at", @@ -466,6 +469,7 @@ "profession.industrialwarfare.quarrier": "Quarrier", "profession.industrialwarfare.logger": "Logger", "profession.industrialwarfare.farmer": "Farmer", + "profession.industrialwarfare.rancher": "Rancher", "subtitle.industrialwarfare.item.rifle.fired": "Rifle fired", "subtitle.industrialwarfare.item.revolver.fired": "Revolver fired" diff --git a/src/main/resources/assets/industrialwarfare/textures/item/animal_feed.png b/src/main/resources/assets/industrialwarfare/textures/item/animal_feed.png new file mode 100644 index 0000000000000000000000000000000000000000..b21d9abb78ba3cd49994d9c693ef27057d0fd818 GIT binary patch literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}x0G|-oXg&T%Vq)%+Y@X5g7`vj%;HR9)@`8vyd z&ukCeKGFQf32&gjmuEylmI{^x`33(+0}QHbXC?t9ISV`@iy0XB4ude`@%$AjK*3Z` z7sn8d;NCOdVhsvB%nsU3tWFRAEjOLoI=^=s>&ra{jN(2^>&<_8?X$+Fw%m2<9zB6a zRNo4ltg?FIq{#Aco#phPY$XO?*Q|$`4d!Pq)b?EFxW;I(sq@)zopr0I_9mPyhe` literal 0 HcmV?d00001