diff --git a/src/main/java/com/minecolonies/api/colony/ICitizenData.java b/src/main/java/com/minecolonies/api/colony/ICitizenData.java index daa12a4f17f..90bc80a2530 100644 --- a/src/main/java/com/minecolonies/api/colony/ICitizenData.java +++ b/src/main/java/com/minecolonies/api/colony/ICitizenData.java @@ -4,10 +4,7 @@ import com.minecolonies.api.colony.jobs.IJob; import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; import com.minecolonies.api.entity.citizen.VisibleCitizenStatus; -import com.minecolonies.api.entity.citizen.citizenhandlers.ICitizenFoodHandler; -import com.minecolonies.api.entity.citizen.citizenhandlers.ICitizenHappinessHandler; -import com.minecolonies.api.entity.citizen.citizenhandlers.ICitizenMournHandler; -import com.minecolonies.api.entity.citizen.citizenhandlers.ICitizenSkillHandler; +import com.minecolonies.api.entity.citizen.citizenhandlers.*; import com.minecolonies.api.quests.IQuestGiver; import com.minecolonies.api.quests.IQuestParticipant; import com.minecolonies.api.util.Tuple; @@ -18,7 +15,10 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.*; +import java.util.List; +import java.util.Optional; +import java.util.Random; +import java.util.UUID; public interface ICitizenData extends ICivilianData, IQuestGiver, IQuestParticipant { @@ -151,6 +151,8 @@ public interface ICitizenData extends ICivilianData, IQuestGiver, IQuestParticip */ ICitizenSkillHandler getCitizenSkillHandler(); + ICitizenDiseaseHandler getCitizenDiseaseHandler(); + /** * Schedule restart and cleanup. * diff --git a/src/main/java/com/minecolonies/api/colony/ICivilianData.java b/src/main/java/com/minecolonies/api/colony/ICivilianData.java index ee2198113fb..cb3d055e881 100644 --- a/src/main/java/com/minecolonies/api/colony/ICivilianData.java +++ b/src/main/java/com/minecolonies/api/colony/ICivilianData.java @@ -159,7 +159,7 @@ public interface ICivilianData extends ICitizen, INBTSerializable /** * Tick the data to update values. */ - void update(); + void update(final int tickRate); /** * Trigger a possible interaction. diff --git a/src/main/java/com/minecolonies/api/colony/managers/interfaces/ICitizenManager.java b/src/main/java/com/minecolonies/api/colony/managers/interfaces/ICitizenManager.java index 810bcc5f4c2..f91502da6dc 100644 --- a/src/main/java/com/minecolonies/api/colony/managers/interfaces/ICitizenManager.java +++ b/src/main/java/com/minecolonies/api/colony/managers/interfaces/ICitizenManager.java @@ -130,7 +130,7 @@ default ICitizenData spawnOrCreateCitizen(final ICitizenData data, @NotNull fina /** * Tick the citizen data of all active citizens. */ - boolean tickCitizenData(); + boolean tickCitizenData(int tickRate); /** * Call this to set all the citizens in the colony to mourn or not. diff --git a/src/main/java/com/minecolonies/api/entity/citizen/AbstractEntityCitizen.java b/src/main/java/com/minecolonies/api/entity/citizen/AbstractEntityCitizen.java index f1a8fd4338a..1fa971fdb0b 100755 --- a/src/main/java/com/minecolonies/api/entity/citizen/AbstractEntityCitizen.java +++ b/src/main/java/com/minecolonies/api/entity/citizen/AbstractEntityCitizen.java @@ -25,7 +25,6 @@ import com.minecolonies.core.entity.pathfinding.navigation.AbstractAdvancedPathNavigate; import com.minecolonies.core.entity.pathfinding.navigation.PathingStuckHandler; import com.mojang.datafixers.util.Pair; -import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; @@ -51,7 +50,6 @@ import net.minecraft.world.phys.Vec3; import net.minecraftforge.items.IItemHandler; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.util.List; @@ -658,15 +656,6 @@ public boolean checkCanDropLoot() */ public abstract ICitizenSleepHandler getCitizenSleepHandler(); - /** - * The Handler to check if the citizen is sick. - * - * @return the instance of the handler. - */ - public abstract ICitizenDiseaseHandler getCitizenDiseaseHandler(); - - public abstract void setCitizenDiseaseHandler(ICitizenDiseaseHandler citizenDiseaseHandler); - public abstract float getRotationYaw(); public abstract float getRotationPitch(); diff --git a/src/main/java/com/minecolonies/api/entity/citizen/citizenhandlers/ICitizenDiseaseHandler.java b/src/main/java/com/minecolonies/api/entity/citizen/citizenhandlers/ICitizenDiseaseHandler.java index 56209ad2a4f..20a2815e97f 100755 --- a/src/main/java/com/minecolonies/api/entity/citizen/citizenhandlers/ICitizenDiseaseHandler.java +++ b/src/main/java/com/minecolonies/api/entity/citizen/citizenhandlers/ICitizenDiseaseHandler.java @@ -1,8 +1,7 @@ package com.minecolonies.api.entity.citizen.citizenhandlers; -import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; +import com.minecolonies.api.colony.ICitizenData; import net.minecraft.nbt.CompoundTag; -import org.jetbrains.annotations.NotNull; /** * Citizen disease handler interface. @@ -12,7 +11,7 @@ public interface ICitizenDiseaseHandler /** * To tick the handler. */ - void tick(); + void update(final int tickRate); /** * Check if the citizen is sick and must be healed.. @@ -50,7 +49,7 @@ public interface ICitizenDiseaseHandler /** * Called when two citizens collide. */ - void onCollission(@NotNull final AbstractEntityCitizen citizen); + void onCollission(final ICitizenData citizen); /** * True when the citizen needs to go to a hospital because its hurt diff --git a/src/main/java/com/minecolonies/api/util/SoundUtils.java b/src/main/java/com/minecolonies/api/util/SoundUtils.java index 86acc67415a..ea45feae048 100755 --- a/src/main/java/com/minecolonies/api/util/SoundUtils.java +++ b/src/main/java/com/minecolonies/api/util/SoundUtils.java @@ -145,7 +145,7 @@ else if (v <= 0.3) { playSoundAtCitizenWith(worldIn, pos, EventType.GENERAL, citizen); } - else if (v <= 0.4 && citizen.getEntity().isPresent() && citizen.getEntity().get().getCitizenDiseaseHandler().isSick()) + else if (v <= 0.4 && citizen.getEntity().isPresent() && citizen.getCitizenDiseaseHandler().isSick()) { playSoundAtCitizenWith(worldIn, pos, EventType.SICKNESS, citizen); } diff --git a/src/main/java/com/minecolonies/apiimp/initializer/InteractionValidatorInitializer.java b/src/main/java/com/minecolonies/apiimp/initializer/InteractionValidatorInitializer.java index 92549896a41..7900d7f2072 100755 --- a/src/main/java/com/minecolonies/apiimp/initializer/InteractionValidatorInitializer.java +++ b/src/main/java/com/minecolonies/apiimp/initializer/InteractionValidatorInitializer.java @@ -68,10 +68,10 @@ public static void init() && citizen.getColony().getBuildingManager().getBestBuilding(citizen.getEntity().get(), BuildingCook.class) == null && InventoryUtils.findFirstSlotInItemHandlerNotEmptyWith(citizen.getInventory(), ISFOOD) == -1); InteractionValidatorRegistry.registerStandardPredicate(Component.translatable(NO_HOSPITAL), - citizen -> citizen.getColony() != null && citizen.getEntity().isPresent() && citizen.getEntity().get().getCitizenDiseaseHandler().isSick() + citizen -> citizen.getColony() != null && citizen.getEntity().isPresent() && citizen.getCitizenDiseaseHandler().isSick() && citizen.getColony().getBuildingManager().getBestBuilding(citizen.getEntity().get(), BuildingHospital.class) == null); InteractionValidatorRegistry.registerStandardPredicate(Component.translatable(WAITING_FOR_CURE), - citizen -> citizen.getColony() != null && citizen.getEntity().isPresent() && !citizen.getEntity().get().getCitizenDiseaseHandler().getDisease().isEmpty()); + citizen -> citizen.getColony() != null && citizen.getEntity().isPresent() && !citizen.getCitizenDiseaseHandler().getDisease().isEmpty()); InteractionValidatorRegistry.registerPosBasedPredicate(Component.translatable(COM_MINECOLONIES_COREMOD_JOB_DELIVERYMAN_CHESTFULL), (citizen, pos) -> @@ -158,7 +158,7 @@ public static void init() }); InteractionValidatorRegistry.registerStandardPredicate(Component.translatable(PATIENT_FULL_INVENTORY), - citizen -> citizen.getEntity().isPresent() && citizen.getEntity().get().getCitizenDiseaseHandler().isSick() + citizen -> citizen.getEntity().isPresent() && citizen.getCitizenDiseaseHandler().isSick() && InventoryUtils.isItemHandlerFull(citizen.getEntity().get().getInventoryCitizen())); InteractionValidatorRegistry.registerStandardPredicate(Component.translatable(PUPIL_NO_CARPET), diff --git a/src/main/java/com/minecolonies/apiimp/initializer/ModHappinessFactorTypeInitializer.java b/src/main/java/com/minecolonies/apiimp/initializer/ModHappinessFactorTypeInitializer.java index 01b7f07acca..33caf17730c 100755 --- a/src/main/java/com/minecolonies/apiimp/initializer/ModHappinessFactorTypeInitializer.java +++ b/src/main/java/com/minecolonies/apiimp/initializer/ModHappinessFactorTypeInitializer.java @@ -43,7 +43,8 @@ private ModHappinessFactorTypeInitializer() HappinessRegistry.housingFunction = DEFERRED_REGISTER_HAPPINESS_FUNCTION.register(HOUSING_FUNCTION.getPath(), () -> new HappinessFunctionEntry(data -> data.getHomeBuilding() == null ? 0.0 : data.getHomeBuilding().getBuildingLevel() / 3.0)); HappinessRegistry.unemploymentFunction = DEFERRED_REGISTER_HAPPINESS_FUNCTION.register(UNEMPLOYMENT_FUNCTION.getPath(), () -> new HappinessFunctionEntry(data -> data.isChild() ? 1.0 : (data.getWorkBuilding() == null ? 0.5 : data.getWorkBuilding().getBuildingLevel() > 3 ? 2.0 : 1.0))); - HappinessRegistry.healthFunction = DEFERRED_REGISTER_HAPPINESS_FUNCTION.register(HEALTH_FUNCTION.getPath(), () -> new HappinessFunctionEntry(data -> data.getEntity().isPresent() ? (data.getEntity().get().getCitizenDiseaseHandler().isSick() ? 0.5 : 1.0) : 1.0)); + HappinessRegistry.healthFunction = DEFERRED_REGISTER_HAPPINESS_FUNCTION.register(HEALTH_FUNCTION.getPath(), + () -> new HappinessFunctionEntry(data -> data.getEntity().isPresent() ? (data.getCitizenDiseaseHandler().isSick() ? 0.5 : 1.0) : 1.0)); HappinessRegistry.idleatjobFunction = DEFERRED_REGISTER_HAPPINESS_FUNCTION.register(IDLEATJOB_FUNCTION.getPath(), () -> new HappinessFunctionEntry(data -> data.isIdleAtJob() ? 0.5 : 1.0)); HappinessRegistry.sleptTonightFunction = DEFERRED_REGISTER_HAPPINESS_FUNCTION.register(SLEPTTONIGHT_FUNCTION.getPath(), () -> new HappinessFunctionEntry(data -> data.getJob() instanceof AbstractJobGuard ? 1 : 0.5)); diff --git a/src/main/java/com/minecolonies/core/colony/CitizenData.java b/src/main/java/com/minecolonies/core/colony/CitizenData.java index 8dd9919a677..6b41abd58f5 100755 --- a/src/main/java/com/minecolonies/core/colony/CitizenData.java +++ b/src/main/java/com/minecolonies/core/colony/CitizenData.java @@ -18,6 +18,7 @@ import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; import com.minecolonies.api.entity.citizen.Skill; import com.minecolonies.api.entity.citizen.VisibleCitizenStatus; +import com.minecolonies.api.entity.citizen.citizenhandlers.ICitizenDiseaseHandler; import com.minecolonies.api.entity.citizen.citizenhandlers.ICitizenFoodHandler; import com.minecolonies.api.entity.citizen.citizenhandlers.ICitizenSkillHandler; import com.minecolonies.api.inventory.InventoryCitizen; @@ -34,10 +35,7 @@ import com.minecolonies.core.colony.interactionhandling.ServerCitizenInteraction; import com.minecolonies.core.colony.interactionhandling.StandardInteraction; import com.minecolonies.core.entity.citizen.EntityCitizen; -import com.minecolonies.core.entity.citizen.citizenhandlers.CitizenFoodHandler; -import com.minecolonies.core.entity.citizen.citizenhandlers.CitizenHappinessHandler; -import com.minecolonies.core.entity.citizen.citizenhandlers.CitizenMournHandler; -import com.minecolonies.core.entity.citizen.citizenhandlers.CitizenSkillHandler; +import com.minecolonies.core.entity.citizen.citizenhandlers.*; import com.minecolonies.core.network.messages.client.colony.ColonyViewCitizenViewMessage; import com.minecolonies.core.util.AttributeModifierUtils; import net.minecraft.core.BlockPos; @@ -224,6 +222,11 @@ public class CitizenData implements ICitizenData */ private final ICitizenFoodHandler citizenFoodHandler; + /** + * Disease handler + */ + private final CitizenDiseaseHandler citizenDiseaseHandler; + /** * The citizen chat options on the server side. */ @@ -349,6 +352,7 @@ public CitizenData(final int id, final IColony colony) this.citizenMournHandler = new CitizenMournHandler(this); this.citizenSkillHandler = new CitizenSkillHandler(); this.citizenFoodHandler = new CitizenFoodHandler(this); + citizenDiseaseHandler = new CitizenDiseaseHandler(this); } @Override @@ -1174,6 +1178,12 @@ public ICitizenFoodHandler getCitizenFoodHandler() return citizenFoodHandler; } + @Override + public ICitizenDiseaseHandler getCitizenDiseaseHandler() + { + return citizenDiseaseHandler; + } + @Override public void scheduleRestart(final ServerPlayer player) { @@ -1257,6 +1267,7 @@ public CompoundTag serializeNBT() citizenHappinessHandler.write(nbtTagCompound, true); citizenMournHandler.write(nbtTagCompound); citizenFoodHandler.write(nbtTagCompound); + citizenDiseaseHandler.write(nbtTagCompound); inventory.write(nbtTagCompound); nbtTagCompound.putInt(TAG_HELD_ITEM_SLOT, inventory.getHeldItemSlot(InteractionHand.MAIN_HAND)); @@ -1422,6 +1433,7 @@ public void deserializeNBT(final CompoundTag nbtTagCompound) this.citizenHappinessHandler.read(nbtTagCompound, true); this.citizenMournHandler.read(nbtTagCompound); this.citizenFoodHandler.read(nbtTagCompound); + citizenDiseaseHandler.read(nbtTagCompound); if (nbtTagCompound.contains(TAG_LEVEL_MAP) && !nbtTagCompound.contains(TAG_NEW_SKILLS)) { @@ -1541,7 +1553,7 @@ public void setInteractedRecently(final UUID player) } @Override - public void update() + public void update(final int tickRate) { if (!getEntity().isPresent() || !getEntity().get().isAlive()) { @@ -1597,6 +1609,8 @@ public void update() } } } + + citizenDiseaseHandler.update(tickRate); } @Override diff --git a/src/main/java/com/minecolonies/core/colony/Colony.java b/src/main/java/com/minecolonies/core/colony/Colony.java index b73baca9a75..1400e409339 100644 --- a/src/main/java/com/minecolonies/core/colony/Colony.java +++ b/src/main/java/com/minecolonies/core/colony/Colony.java @@ -45,7 +45,6 @@ import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.nbt.*; -import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerChunkCache; @@ -373,7 +372,10 @@ protected Colony(final int id, @Nullable final Level world) colonyStateMachine.addTransition(new TickingTransition<>(INACTIVE, () -> true, this::updateState, UPDATE_STATE_INTERVAL)); colonyStateMachine.addTransition(new TickingTransition<>(UNLOADED, () -> true, this::updateState, UPDATE_STATE_INTERVAL)); colonyStateMachine.addTransition(new TickingTransition<>(ACTIVE, () -> true, this::updateState, UPDATE_STATE_INTERVAL)); - colonyStateMachine.addTransition(new TickingTransition<>(ACTIVE, citizenManager::tickCitizenData, () -> ACTIVE, TICKS_SECOND * 3)); + colonyStateMachine.addTransition(new TickingTransition<>(ACTIVE, () -> { + citizenManager.tickCitizenData(TICKS_SECOND * 3); + return false; + }, () -> ACTIVE, TICKS_SECOND * 3)); colonyStateMachine.addTransition(new TickingTransition<>(ACTIVE, this::updateSubscribers, () -> ACTIVE, UPDATE_SUBSCRIBERS_INTERVAL)); colonyStateMachine.addTransition(new TickingTransition<>(ACTIVE, this::tickRequests, () -> ACTIVE, UPDATE_RS_INTERVAL)); diff --git a/src/main/java/com/minecolonies/core/colony/buildings/AbstractBuilding.java b/src/main/java/com/minecolonies/core/colony/buildings/AbstractBuilding.java index d0433533c16..f8f0345de2d 100755 --- a/src/main/java/com/minecolonies/core/colony/buildings/AbstractBuilding.java +++ b/src/main/java/com/minecolonies/core/colony/buildings/AbstractBuilding.java @@ -331,7 +331,7 @@ public void onPlayerEnterNearby(final Player player) @Override public void onPlacement() { - if (getBuildingLevel() == 0) + if (getBuildingLevel() == 0 && !hasParent()) { ChunkDataHelper.claimBuildingChunks(colony, true, getPosition(), getClaimRadius(getBuildingLevel()), getCorners()); } @@ -961,7 +961,10 @@ && getPosition() != null public void onUpgradeComplete(final int newLevel) { cachedRotation = -1; - ChunkDataHelper.claimBuildingChunks(colony, true, this.getID(), this.getClaimRadius(newLevel), getCorners()); + if (!hasParent()) + { + ChunkDataHelper.claimBuildingChunks(colony, true, this.getID(), this.getClaimRadius(newLevel), getCorners()); + } recheckGuardBuildingNear = true; ConstructionTapeHelper.removeConstructionTape(getCorners(), colony.getWorld()); diff --git a/src/main/java/com/minecolonies/core/colony/buildings/workerbuildings/BuildingBarracksTower.java b/src/main/java/com/minecolonies/core/colony/buildings/workerbuildings/BuildingBarracksTower.java index 23849cad160..af0b595ce06 100755 --- a/src/main/java/com/minecolonies/core/colony/buildings/workerbuildings/BuildingBarracksTower.java +++ b/src/main/java/com/minecolonies/core/colony/buildings/workerbuildings/BuildingBarracksTower.java @@ -7,7 +7,6 @@ import com.minecolonies.api.util.MessageUtils; import com.minecolonies.core.colony.buildings.AbstractBuildingGuards; import com.minecolonies.core.util.AdvancementUtils; -import com.minecolonies.core.util.ChunkDataHelper; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; @@ -105,7 +104,6 @@ public void onUpgradeComplete(final int newLevel) { return; } - ChunkDataHelper.claimBuildingChunks(colony, true, barracks, barrack.getClaimRadius(newLevel), barrack.getCorners()); if (newLevel == barrack.getMaxBuildingLevel()) { diff --git a/src/main/java/com/minecolonies/core/colony/buildings/workerbuildings/BuildingHospital.java b/src/main/java/com/minecolonies/core/colony/buildings/workerbuildings/BuildingHospital.java index 96056c78ee6..5996fd631eb 100755 --- a/src/main/java/com/minecolonies/core/colony/buildings/workerbuildings/BuildingHospital.java +++ b/src/main/java/com/minecolonies/core/colony/buildings/workerbuildings/BuildingHospital.java @@ -20,10 +20,12 @@ import net.minecraft.world.level.block.BedBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BedPart; - import org.jetbrains.annotations.NotNull; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.function.Predicate; import static com.minecolonies.api.util.constant.NbtTagConstants.*; @@ -209,9 +211,9 @@ private boolean doesAnyPatientRequireStack(final ItemStack stack) for (final Patient patient : patients.values()) { final ICitizenData data = colony.getCitizenManager().getCivilian(patient.getId()); - if (data != null && data.getEntity().isPresent() && data.getEntity().get().getCitizenDiseaseHandler().isSick()) + if (data != null && data.getEntity().isPresent() && data.getCitizenDiseaseHandler().isSick()) { - final String diseaseName = data.getEntity().get().getCitizenDiseaseHandler().getDisease(); + final String diseaseName = data.getCitizenDiseaseHandler().getDisease(); if (!diseaseName.isEmpty()) { final Disease disease = IColonyManager.getInstance().getCompatibilityManager().getDisease(diseaseName); diff --git a/src/main/java/com/minecolonies/core/colony/managers/CitizenManager.java b/src/main/java/com/minecolonies/core/colony/managers/CitizenManager.java index 034851a156c..0ac81368971 100755 --- a/src/main/java/com/minecolonies/core/colony/managers/CitizenManager.java +++ b/src/main/java/com/minecolonies/core/colony/managers/CitizenManager.java @@ -567,11 +567,11 @@ public void checkCitizensForHappiness() } @Override - public boolean tickCitizenData() + public boolean tickCitizenData(final int tickRate) { for (ICitizenData iCitizenData : this.getCitizens()) { - iCitizenData.update(); + iCitizenData.update(tickRate); } return false; } diff --git a/src/main/java/com/minecolonies/core/colony/managers/RegisteredStructureManager.java b/src/main/java/com/minecolonies/core/colony/managers/RegisteredStructureManager.java index 0c620811f37..2fcda075993 100644 --- a/src/main/java/com/minecolonies/core/colony/managers/RegisteredStructureManager.java +++ b/src/main/java/com/minecolonies/core/colony/managers/RegisteredStructureManager.java @@ -675,7 +675,7 @@ public BlockPos getBestBuilding(final BlockPos citizen, final Class 0) + if (clazz.isInstance(building) && building.getBuildingLevel() > 0 && WorldUtil.isBlockLoaded(colony.getWorld(), building.getPosition())) { final double localDistance = building.getPosition().distSqr(citizen); if (localDistance < distance) @@ -724,7 +724,7 @@ public boolean hasGuardBuildingNear(final IBuilding building) for (final IBuilding colonyBuilding : getBuildings().values()) { - if (colonyBuilding instanceof IGuardBuilding || colonyBuilding instanceof BuildingBarracks) + if (colonyBuilding.getBuildingLevel() > 0 && (colonyBuilding instanceof IGuardBuilding || colonyBuilding instanceof BuildingBarracks)) { final BoundingBox guardedRegion = BlockPosUtil.getChunkAlignedBB(colonyBuilding.getPosition(), colonyBuilding.getClaimRadius(colonyBuilding.getBuildingLevel())); if (guardedRegion.isInside(building.getPosition())) diff --git a/src/main/java/com/minecolonies/core/entity/ai/minimal/EntityAISickTask.java b/src/main/java/com/minecolonies/core/entity/ai/minimal/EntityAISickTask.java index 5331c365dc6..581ea8ff195 100755 --- a/src/main/java/com/minecolonies/core/entity/ai/minimal/EntityAISickTask.java +++ b/src/main/java/com/minecolonies/core/entity/ai/minimal/EntityAISickTask.java @@ -140,8 +140,8 @@ public EntityAISickTask(final EntityCitizen citizen) private boolean isSick() { - if (citizen.getCitizenDiseaseHandler().isSick() - || citizen.getCitizenDiseaseHandler().isHurt()) + if (citizen.getCitizenData().getCitizenDiseaseHandler().isSick() + || citizen.getCitizenData().getCitizenDiseaseHandler().isHurt()) { reset(); return true; @@ -200,7 +200,7 @@ private DiseaseState findEmptyBed() && state.getValue(BedBlock.PART).equals(BedPart.HEAD) && world.isEmptyBlock(pos.above())) { - citizen.getCitizenDiseaseHandler().setSleepsAtHospital(true); + citizen.getCitizenData().getCitizenDiseaseHandler().setSleepsAtHospital(true); usedBed = pos; ((BuildingHospital) hospital).registerPatient(usedBed, citizen.getCivilianID()); return FIND_EMPTY_BED; @@ -245,7 +245,7 @@ private IState applyCure() return CHECK_FOR_CURE; } - final List list = IColonyManager.getInstance().getCompatibilityManager().getDisease(citizen.getCitizenDiseaseHandler().getDisease()).getCure(); + final List list = IColonyManager.getInstance().getCompatibilityManager().getDisease(citizen.getCitizenData().getCitizenDiseaseHandler().getDisease()).getCure(); if (!list.isEmpty()) { citizen.setItemInHand(InteractionHand.MAIN_HAND, list.get(citizen.getRandom().nextInt(list.size()))); @@ -275,7 +275,7 @@ private IState applyCure() */ private void cure() { - final Disease disease = IColonyManager.getInstance().getCompatibilityManager().getDisease(citizen.getCitizenDiseaseHandler().getDisease()); + final Disease disease = IColonyManager.getInstance().getCompatibilityManager().getDisease(citizen.getCitizenData().getCitizenDiseaseHandler().getDisease()); if (disease != null) { for (final ItemStack cure : disease.getCure()) @@ -298,7 +298,7 @@ private void cure() citizen.getCitizenData().setBedPos(BlockPos.ZERO); } citizen.setItemInHand(InteractionHand.MAIN_HAND, ItemStack.EMPTY); - citizen.getCitizenDiseaseHandler().cure(); + citizen.getCitizenData().getCitizenDiseaseHandler().cure(); citizen.setHealth(citizen.getMaxHealth()); reset(); } @@ -369,7 +369,7 @@ else if (state == CitizenAIState.IDLE) private IState goToHut() { final IBuilding buildingWorker = citizenData.getWorkBuilding(); - citizen.getCitizenDiseaseHandler().setSleepsAtHospital(false); + citizen.getCitizenData().getCitizenDiseaseHandler().setSleepsAtHospital(false); if (buildingWorker == null) { @@ -390,7 +390,7 @@ private IState goToHut() */ private IState goToHospital() { - citizen.getCitizenDiseaseHandler().setSleepsAtHospital(false); + citizen.getCitizenData().getCitizenDiseaseHandler().setSleepsAtHospital(false); if (placeToPath == null) { return SEARCH_HOSPITAL; @@ -415,7 +415,7 @@ private IState searchHospital() if (placeToPath == null) { - final String id = citizen.getCitizenDiseaseHandler().getDisease(); + final String id = citizen.getCitizenData().getCitizenDiseaseHandler().getDisease(); if (id.isEmpty()) { return CitizenAIState.IDLE; @@ -426,9 +426,9 @@ private IState searchHospital() ChatPriority.BLOCKING)); return WANDER; } - else if (!citizen.getCitizenDiseaseHandler().getDisease().isEmpty()) + else if (!citizen.getCitizenData().getCitizenDiseaseHandler().getDisease().isEmpty()) { - final Disease disease = IColonyManager.getInstance().getCompatibilityManager().getDisease(citizen.getCitizenDiseaseHandler().getDisease()); + final Disease disease = IColonyManager.getInstance().getCompatibilityManager().getDisease(citizen.getCitizenData().getCitizenDiseaseHandler().getDisease()); citizenData.triggerInteraction(new StandardInteraction(Component.translatable(WAITING_FOR_CURE, disease.getName(), disease.getCureString()), Component.translatable(WAITING_FOR_CURE), ChatPriority.BLOCKING)); @@ -444,7 +444,7 @@ else if (!citizen.getCitizenDiseaseHandler().getDisease().isEmpty()) */ private IState checkForCure() { - final String id = citizen.getCitizenDiseaseHandler().getDisease(); + final String id = citizen.getCitizenData().getCitizenDiseaseHandler().getDisease(); if (id.isEmpty()) { if (citizen.getHealth() > SEEK_DOCTOR_HEALTH) @@ -460,7 +460,7 @@ private IState checkForCure() final int slot = InventoryUtils.findFirstSlotInProviderNotEmptyWith(citizen, stack -> ItemStack.isSameItem(cure, stack)); if (slot == -1) { - if (citizen.getCitizenDiseaseHandler().isSick()) + if (citizen.getCitizenData().getCitizenDiseaseHandler().isSick()) { return GO_TO_HUT; } @@ -482,7 +482,7 @@ private void reset() citizen.stopUsingItem(); citizen.setItemInHand(InteractionHand.MAIN_HAND, ItemStack.EMPTY); placeToPath = null; - citizen.getCitizenDiseaseHandler().setSleepsAtHospital(false); + citizen.getCitizenData().getCitizenDiseaseHandler().setSleepsAtHospital(false); } // TODO: Citizen AI should set status icons diff --git a/src/main/java/com/minecolonies/core/entity/ai/workers/CitizenAI.java b/src/main/java/com/minecolonies/core/entity/ai/workers/CitizenAI.java index 78bdacc45fd..c1b5b0850e0 100644 --- a/src/main/java/com/minecolonies/core/entity/ai/workers/CitizenAI.java +++ b/src/main/java/com/minecolonies/core/entity/ai/workers/CitizenAI.java @@ -137,7 +137,7 @@ private IState calculateNextState() } // Sick - if (citizen.getCitizenDiseaseHandler().isSick() && guardJob.canAIBeInterrupted()) + if (citizen.getCitizenData().getCitizenDiseaseHandler().isSick() && guardJob.canAIBeInterrupted()) { citizen.getCitizenData().setVisibleStatus(VisibleCitizenStatus.SICK); return CitizenAIState.SICK; @@ -147,7 +147,7 @@ private IState calculateNextState() } // Sick at hospital - if (citizen.getCitizenDiseaseHandler().isSick() && citizen.getCitizenDiseaseHandler().sleepsAtHospital()) + if (citizen.getCitizenData().getCitizenDiseaseHandler().isSick() && citizen.getCitizenData().getCitizenDiseaseHandler().sleepsAtHospital()) { citizen.getCitizenData().setVisibleStatus(VisibleCitizenStatus.SICK); return CitizenAIState.SICK; @@ -181,7 +181,7 @@ private IState calculateNextState() { if (citizen.getCitizenSleepHandler().isAsleep()) { - if (citizen.getCitizenDiseaseHandler().isSick()) + if (citizen.getCitizenData().getCitizenDiseaseHandler().isSick()) { final BlockPos bedPos = citizen.getCitizenSleepHandler().getBedLocation(); if (bedPos == null || bedPos.distSqr(citizen.blockPosition()) > 5) @@ -197,7 +197,7 @@ private IState calculateNextState() } // Sick - if (citizen.getCitizenDiseaseHandler().isSick() || citizen.getCitizenDiseaseHandler().isHurt()) + if (citizen.getCitizenData().getCitizenDiseaseHandler().isSick() || citizen.getCitizenData().getCitizenDiseaseHandler().isHurt()) { citizen.getCitizenData().setVisibleStatus(VisibleCitizenStatus.SICK); return CitizenAIState.SICK; @@ -279,7 +279,7 @@ public boolean shouldEat() return false; } - if (citizen.getCitizenDiseaseHandler().isSick() && citizen.getCitizenSleepHandler().isAsleep()) + if (citizen.getCitizenData().getCitizenDiseaseHandler().isSick() && citizen.getCitizenSleepHandler().isAsleep()) { return false; } diff --git a/src/main/java/com/minecolonies/core/entity/ai/workers/service/EntityAIWorkHealer.java b/src/main/java/com/minecolonies/core/entity/ai/workers/service/EntityAIWorkHealer.java index 86185e36c26..50ed8f1f2e0 100755 --- a/src/main/java/com/minecolonies/core/entity/ai/workers/service/EntityAIWorkHealer.java +++ b/src/main/java/com/minecolonies/core/entity/ai/workers/service/EntityAIWorkHealer.java @@ -20,10 +20,10 @@ import com.minecolonies.core.entity.citizen.EntityCitizen; import com.minecolonies.core.network.messages.client.CircleParticleEffectMessage; import com.minecolonies.core.network.messages.client.StreamParticleEffectMessage; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import net.minecraftforge.common.capabilities.ForgeCapabilities; import net.minecraftforge.items.IItemHandler; import org.jetbrains.annotations.NotNull; @@ -110,7 +110,7 @@ private IAIState decide() for (final AbstractEntityCitizen citizen : WorldUtil.getEntitiesWithinBuilding(world, AbstractEntityCitizen.class, building, - cit -> cit.getCitizenDiseaseHandler().isSick())) + cit -> cit.getCitizenData().getCitizenDiseaseHandler().isSick())) { hospital.checkOrCreatePatientFile(citizen.getCivilianID()); } @@ -118,13 +118,13 @@ private IAIState decide() for (final Patient patient : hospital.getPatients()) { final ICitizenData data = hospital.getColony().getCitizenManager().getCivilian(patient.getId()); - if (data == null || !data.getEntity().isPresent() || (data.getEntity().isPresent() && !data.getEntity().get().getCitizenDiseaseHandler().isSick())) + if (data == null || !data.getEntity().isPresent() || (data.getEntity().isPresent() && !data.getEntity().get().getCitizenData().getCitizenDiseaseHandler().isSick())) { hospital.removePatientFile(patient); continue; } final EntityCitizen citizen = (EntityCitizen) data.getEntity().get(); - final String diseaseName = citizen.getCitizenDiseaseHandler().getDisease(); + final String diseaseName = citizen.getCitizenData().getCitizenDiseaseHandler().getDisease(); @Nullable final Disease disease = diseaseName.isEmpty() ? null : IColonyManager.getInstance().getCompatibilityManager().getDisease(diseaseName); if (patient.getState() == Patient.PatientState.NEW) @@ -247,7 +247,7 @@ private IAIState requestCure() } final ICitizenData data = building.getColony().getCitizenManager().getCivilian(currentPatient.getId()); - if (data == null || !data.getEntity().isPresent() || !data.getEntity().get().getCitizenDiseaseHandler().isSick()) + if (data == null || !data.getEntity().isPresent() || !data.getEntity().get().getCitizenData().getCitizenDiseaseHandler().isSick()) { currentPatient = null; return DECIDE; @@ -259,7 +259,7 @@ private IAIState requestCure() return REQUEST_CURE; } - final String diseaseName = citizen.getCitizenDiseaseHandler().getDisease(); + final String diseaseName = citizen.getCitizenData().getCitizenDiseaseHandler().getDisease(); if (diseaseName.isEmpty()) { currentPatient.setState(Patient.PatientState.REQUESTED); @@ -317,7 +317,7 @@ private IAIState cure() } final ICitizenData data = building.getColony().getCitizenManager().getCivilian(currentPatient.getId()); - if (data == null || !data.getEntity().isPresent() || !data.getEntity().get().getCitizenDiseaseHandler().isSick()) + if (data == null || !data.getEntity().isPresent() || !data.getEntity().get().getCitizenData().getCitizenDiseaseHandler().isSick()) { currentPatient = null; return DECIDE; @@ -329,7 +329,7 @@ private IAIState cure() return CURE; } - final String diseaseName = citizen.getCitizenDiseaseHandler().getDisease(); + final String diseaseName = citizen.getCitizenData().getCitizenDiseaseHandler().getDisease(); final Disease disease = IColonyManager.getInstance().getCompatibilityManager().getDisease(diseaseName); if (diseaseName.isEmpty()) { @@ -396,7 +396,7 @@ private IAIState freeCure() } final ICitizenData data = building.getColony().getCitizenManager().getCivilian(currentPatient.getId()); - if (data == null || !data.getEntity().isPresent() || !data.getEntity().get().getCitizenDiseaseHandler().isSick()) + if (data == null || !data.getEntity().isPresent() || !data.getEntity().get().getCitizenData().getCitizenDiseaseHandler().isSick()) { currentPatient = null; return DECIDE; @@ -431,7 +431,7 @@ private IAIState freeCure() progressTicks = 0; worker.getCitizenExperienceHandler().addExperience(BASE_XP_GAIN); - citizen.getCitizenDiseaseHandler().cure(); + citizen.getCitizenData().getCitizenDiseaseHandler().cure(); currentPatient.setState(Patient.PatientState.TREATED); currentPatient = null; return DECIDE; diff --git a/src/main/java/com/minecolonies/core/entity/citizen/EntityCitizen.java b/src/main/java/com/minecolonies/core/entity/citizen/EntityCitizen.java index 11de28a8eb8..dd744f09782 100755 --- a/src/main/java/com/minecolonies/core/entity/citizen/EntityCitizen.java +++ b/src/main/java/com/minecolonies/core/entity/citizen/EntityCitizen.java @@ -75,8 +75,6 @@ import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; import net.minecraft.tags.DamageTypeTags; -import net.minecraft.tags.FluidTags; -import net.minecraft.util.Mth; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.CombatRules; @@ -86,10 +84,8 @@ import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.*; -import net.minecraft.world.entity.ai.attributes.AttributeInstance; import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.ai.attributes.Attributes; -import net.minecraft.world.entity.animal.FlyingAnimal; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; @@ -98,10 +94,8 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.ShieldItem; -import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.Level; -import net.minecraft.world.level.material.FluidState; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.Shapes; @@ -197,11 +191,6 @@ public class EntityCitizen extends AbstractEntityCitizen implements IThreatTable */ private ICitizenSleepHandler citizenSleepHandler; - /** - * The citizen sleep handler. - */ - private ICitizenDiseaseHandler citizenDiseaseHandler; - /** * Our custom combat tracker. */ @@ -280,7 +269,6 @@ public EntityCitizen(final EntityType type, final Level this.citizenColonyHandler = new CitizenColonyHandler(this); this.citizenJobHandler = new CitizenJobHandler(this); this.citizenSleepHandler = new CitizenSleepHandler(this); - this.citizenDiseaseHandler = new CitizenDiseaseHandler(this); this.combatTracker = new CitizenCombatTracker(this); this.moveControl = new MovementHandler(this); @@ -421,7 +409,7 @@ public InteractionResult checkAndHandleImportantInteractions(final Player player if (!level.isClientSide && getCitizenData() != null) { - citizenData.update(); + citizenData.update(TICKS_SECOND * 3); citizenData.setInteractedRecently(player.getUUID()); final ColonyViewCitizenViewMessage message = new ColonyViewCitizenViewMessage((Colony) getCitizenData().getColony(), getCitizenData()); Network.getNetwork().sendToPlayer(message, (ServerPlayer) player); @@ -476,10 +464,12 @@ private InteractionResult directPlayerInteraction(final Player player, final Int .withPriority(MessagePriority.DANGER) .sendTo(player); } - return null; + return InteractionResult.PASS; } - if (usedStack.getItem() == Items.GOLDEN_APPLE && getCitizenDiseaseHandler().isSick()) + final boolean isSick = (getCitizenData() != null && getCitizenData().getCitizenDiseaseHandler().isSick()) || (citizenDataView != null + && citizenDataView.getVisibleStatus() == VisibleCitizenStatus.SICK); + if (usedStack.getItem() == Items.GOLDEN_APPLE && isSick) { usedStack.shrink(1); player.setItemInHand(hand, usedStack); @@ -488,7 +478,7 @@ private InteractionResult directPlayerInteraction(final Player player, final Int { if (getRandom().nextInt(3) == 0) { - getCitizenDiseaseHandler().cure(); + getCitizenData().getCitizenDiseaseHandler().cure(); playSound(SoundEvents.PLAYER_LEVELUP, 1.0f, (float) SoundUtils.getRandomPitch(getRandom())); Network.getNetwork().sendToTrackingEntity(new VanillaParticleMessage(getX(), getY(), getZ(), ParticleTypes.HAPPY_VILLAGER), this); } @@ -505,7 +495,7 @@ private InteractionResult directPlayerInteraction(final Player player, final Int if (!level.isClientSide()) { - getCitizenDiseaseHandler().setDisease(IColonyManager.getInstance().getCompatibilityManager().getRandomDisease()); + getCitizenData().getCitizenDiseaseHandler().setDisease(IColonyManager.getInstance().getCompatibilityManager().getRandomDisease()); playSound(SoundEvents.VILLAGER_HURT, 1.0f, (float) SoundUtils.getRandomPitch(getRandom())); getCitizenData().markDirty(20); @@ -514,11 +504,11 @@ private InteractionResult directPlayerInteraction(final Player player, final Int .sendTo(player); } - interactionCooldown = 20 * 60 * 5; + interactionCooldown = 20 * 20; return InteractionResult.CONSUME; } - if (getCitizenDiseaseHandler().isSick()) + if (isSick) { return null; } @@ -701,7 +691,6 @@ public void addAdditionalSaveData(final CompoundTag compound) { compound.putInt(TAG_CITIZEN, citizenData.getId()); } - citizenDiseaseHandler.write(compound); } @Override @@ -717,7 +706,6 @@ public void readAdditionalSaveData(final CompoundTag compound) citizenId = compound.getInt(TAG_CITIZEN); } } - citizenDiseaseHandler.read(compound); setPose(Pose.STANDING); } @@ -776,7 +764,6 @@ private boolean onServerUpdateHandlers() citizenExperienceHandler.gatherXp(); citizenItemHandler.pickupItems(); citizenData.setLastPosition(blockPosition()); - citizenDiseaseHandler.tick(); onLivingSoundUpdate(); final ChunkPos currentChunk = chunkPosition(); @@ -912,7 +899,7 @@ private void decreaseWalkingSaturation() */ private void checkHeal() { - if (getHealth() < (citizenDiseaseHandler.isSick() ? getMaxHealth() / 3 : getMaxHealth()) && getLastHurtByMob() == null) + if (getCitizenData() != null && getHealth() < (getCitizenData().getCitizenDiseaseHandler().isSick() ? getMaxHealth() / 3 : getMaxHealth()) && getLastHurtByMob() == null) { final double limitDecrease = getCitizenColonyHandler().getColonyOrRegister().getResearchManager().getResearchEffects().getEffectStrength(SATLIMIT); @@ -1253,23 +1240,6 @@ public ICitizenSleepHandler getCitizenSleepHandler() return citizenSleepHandler; } - /** - * The Handler to check if a citizen is sick. - * - * @return the instance of the handler. - */ - @Override - public ICitizenDiseaseHandler getCitizenDiseaseHandler() - { - return citizenDiseaseHandler; - } - - @Override - public void setCitizenDiseaseHandler(final ICitizenDiseaseHandler citizenDiseaseHandler) - { - this.citizenDiseaseHandler = citizenDiseaseHandler; - } - /** * Sets the visible status if there is none * @@ -1598,9 +1568,9 @@ protected void doPush(final Entity entity) super.doPush(entity); } - if (!level.isClientSide && entity instanceof AbstractEntityCitizen) + if (!level.isClientSide && getCitizenData() != null && entity instanceof AbstractEntityCitizen otherCitizen && otherCitizen.getCitizenData() != null) { - getCitizenDiseaseHandler().onCollission((AbstractEntityCitizen) entity); + getCitizenData().getCitizenDiseaseHandler().onCollission(otherCitizen.getCitizenData()); } } diff --git a/src/main/java/com/minecolonies/core/entity/citizen/citizenhandlers/CitizenDiseaseHandler.java b/src/main/java/com/minecolonies/core/entity/citizen/citizenhandlers/CitizenDiseaseHandler.java index 69c54003512..f94bef8184b 100755 --- a/src/main/java/com/minecolonies/core/entity/citizen/citizenhandlers/CitizenDiseaseHandler.java +++ b/src/main/java/com/minecolonies/core/entity/citizen/citizenhandlers/CitizenDiseaseHandler.java @@ -1,10 +1,10 @@ package com.minecolonies.core.entity.citizen.citizenhandlers; import com.minecolonies.api.IMinecoloniesAPI; +import com.minecolonies.api.colony.ICitizenData; import com.minecolonies.api.colony.IColony; import com.minecolonies.api.colony.IColonyManager; import com.minecolonies.api.colony.buildings.IBuilding; -import com.minecolonies.api.entity.citizen.AbstractEntityCitizen; import com.minecolonies.api.entity.citizen.citizenhandlers.ICitizenDiseaseHandler; import com.minecolonies.core.MineColonies; import com.minecolonies.core.colony.buildings.workerbuildings.BuildingCook; @@ -12,7 +12,6 @@ import com.minecolonies.core.colony.jobs.JobHealer; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; -import org.jetbrains.annotations.NotNull; import static com.minecolonies.api.research.util.ResearchConstants.MASKS; import static com.minecolonies.api.research.util.ResearchConstants.VACCINES; @@ -33,12 +32,12 @@ public class CitizenDiseaseHandler implements ICitizenDiseaseHandler /** * Base likelihood of a citizen getting a disease. */ - private static final int DISEASE_FACTOR = 100000; + private static final int DISEASE_FACTOR = 100000 / 3; /** - * Number of seconds after recovering a citizen is immune against any illness. 90 Minutes currently. + * Number of ticks after recovering a citizen is immune against any illness. 90 Minutes currently. */ - private static final int IMMUNITY_TIME = 60 * 90; + private static final int IMMUNITY_TIME = 20 * 60 * 90; /** * Additional immunity time through vaccines. @@ -48,7 +47,7 @@ public class CitizenDiseaseHandler implements ICitizenDiseaseHandler /** * The citizen assigned to this manager. */ - private final AbstractEntityCitizen citizen; + private final ICitizenData citizenData; /** * The disease the citizen has, empty if none. @@ -78,24 +77,24 @@ public class CitizenDiseaseHandler implements ICitizenDiseaseHandler * * @param citizen the citizen owning the handler. */ - public CitizenDiseaseHandler(final AbstractEntityCitizen citizen) + public CitizenDiseaseHandler(final ICitizenData citizen) { - this.citizen = citizen; + this.citizenData = citizen; } /** - * Called in the citizen every few ticks to check for illness. + * Called in the citizen every few ticks to check for illness. Called every 60 ticks */ @Override - public void tick() + public void update(final int tickRate) { if (canBecomeSick()) { - final double citizenModifier = citizen.getCitizenData().getDiseaseModifier(); + final double citizenModifier = citizenData.getDiseaseModifier(); final int configModifier = MineColonies.getConfig().getServer().diseaseModifier.get(); if (!IColonyManager.getInstance().getCompatibilityManager().getDiseases().isEmpty() && - citizen.getRandom().nextInt(configModifier * DISEASE_FACTOR) < citizenModifier * 10) + citizenData.getRandom().nextInt(configModifier * DISEASE_FACTOR) < citizenModifier * 10) { this.disease = IColonyManager.getInstance().getCompatibilityManager().getRandomDisease(); } @@ -103,7 +102,7 @@ public void tick() if (immunityTicks > 0) { - immunityTicks--; + immunityTicks -= tickRate; } } @@ -120,22 +119,21 @@ public void setDisease(final String disease) private boolean canBecomeSick() { return !isSick() - && citizen.getCitizenColonyHandler().getColonyOrRegister() != null - && citizen.getCitizenColonyHandler().getColonyOrRegister().isActive() - && !(citizen.getCitizenJobHandler().getColonyJob() instanceof JobHealer) + && citizenData.getEntity().isPresent() + && citizenData.getColony().isActive() + && !(citizenData.getJob() instanceof JobHealer) && immunityTicks <= 0 - && citizen.getCitizenColonyHandler().getColonyOrRegister().getCitizenManager().getCurrentCitizenCount() > initialCitizenCount; + && citizenData.getColony().getCitizenManager().getCurrentCitizenCount() > initialCitizenCount; } @Override - public void onCollission(@NotNull final AbstractEntityCitizen citizen) + public void onCollission(final ICitizenData citizen) { if (citizen.getCitizenDiseaseHandler().isSick() && canBecomeSick() && citizen.getRandom().nextInt(ONE_HUNDRED_PERCENT) < 1) { - if (citizen.getCitizenColonyHandler().getColonyOrRegister() != null - && (citizen.getCitizenColonyHandler().getColonyOrRegister().getResearchManager().getResearchEffects().getEffectStrength(MASKS) <= 0 || citizen.getRandom().nextBoolean())) + if (citizen.getColony().getResearchManager().getResearchEffects().getEffectStrength(MASKS) <= 0 || citizen.getRandom().nextBoolean()) { this.disease = citizen.getCitizenDiseaseHandler().getDisease(); } @@ -145,7 +143,8 @@ && canBecomeSick() @Override public boolean isHurt() { - return !(citizen.getCitizenJobHandler() instanceof AbstractJobGuard) && citizen.getHealth() < SEEK_DOCTOR_HEALTH && citizen.getCitizenData().getSaturation() > LOW_SATURATION; + return citizenData.getEntity().isPresent() && !(citizenData.getJob() instanceof AbstractJobGuard) && citizenData.getEntity().get().getHealth() < SEEK_DOCTOR_HEALTH + && citizenData.getSaturation() > LOW_SATURATION; } @Override @@ -157,19 +156,25 @@ public boolean isSick() @Override public void write(final CompoundTag compound) { - compound.putString(TAG_DISEASE, disease); - compound.putInt(TAG_IMMUNITY, immunityTicks); + CompoundTag diseaseTag = new CompoundTag(); + diseaseTag.putString(TAG_DISEASE, disease); + diseaseTag.putInt(TAG_IMMUNITY, immunityTicks); + compound.put(TAG_DISEASE, diseaseTag); } @Override public void read(final CompoundTag compound) { - // cure diseases that have been removed from the configuration file. - if (IColonyManager.getInstance().getCompatibilityManager().getDisease(compound.getString(TAG_DISEASE)) != null) + if (compound.contains(TAG_DISEASE)) { - this.disease = compound.getString(TAG_DISEASE); + CompoundTag diseaseTag = compound.getCompound(TAG_DISEASE); + // cure diseases that have been removed from the configuration file. + if (IColonyManager.getInstance().getCompatibilityManager().getDisease(diseaseTag.getString(TAG_DISEASE)) != null) + { + this.disease = diseaseTag.getString(TAG_DISEASE); + } + this.immunityTicks = diseaseTag.getInt(TAG_IMMUNITY); } - this.immunityTicks = compound.getInt(TAG_IMMUNITY); } @Override @@ -183,18 +188,18 @@ public void cure() { this.disease = ""; sleepsAtHospital = false; - if (citizen.getCitizenSleepHandler().isAsleep()) + if (citizenData.isAsleep() && citizenData.getEntity().isPresent()) { - citizen.stopSleeping(); - final BlockPos hospitalPos = citizen.getCitizenColonyHandler().getColonyOrRegister().getBuildingManager().getBestBuilding(citizen, BuildingCook.class); - final IColony colony = citizen.getCitizenColonyHandler().getColonyOrRegister(); + citizenData.getEntity().get().stopSleeping(); + final BlockPos hospitalPos = citizenData.getColony().getBuildingManager().getBestBuilding(citizenData.getEntity().get(), BuildingCook.class); + final IColony colony = citizenData.getColony(); final IBuilding hospital = colony.getBuildingManager().getBuilding(hospitalPos); if (hospital != null) { hospital.onWakeUp(); } - if (citizen.getCitizenColonyHandler().getColonyOrRegister() != null && citizen.getCitizenColonyHandler().getColonyOrRegister().getResearchManager().getResearchEffects().getEffectStrength(VACCINES) > 0) + if (citizenData.getColony().getResearchManager().getResearchEffects().getEffectStrength(VACCINES) > 0) { immunityTicks = IMMUNITY_TIME * VACCINE_MODIFIER; } @@ -209,8 +214,8 @@ public void cure() immunityTicks = IMMUNITY_TIME / 2; } - citizen.getCitizenColonyHandler().getColonyOrRegister().getStatisticsManager().increment(CITIZENS_HEALED, citizen.getCitizenColonyHandler().getColonyOrRegister().getDay()); - citizen.markDirty(0); + citizenData.getColony().getStatisticsManager().increment(CITIZENS_HEALED, citizenData.getColony().getDay()); + citizenData.markDirty(0); } @Override diff --git a/src/main/java/com/minecolonies/core/entity/citizen/citizenhandlers/CitizenHappinessHandler.java b/src/main/java/com/minecolonies/core/entity/citizen/citizenhandlers/CitizenHappinessHandler.java index 47c1af59080..bdf45d5352f 100755 --- a/src/main/java/com/minecolonies/core/entity/citizen/citizenhandlers/CitizenHappinessHandler.java +++ b/src/main/java/com/minecolonies/core/entity/citizen/citizenhandlers/CitizenHappinessHandler.java @@ -231,7 +231,7 @@ public static double getSocialModifier(final IColony colony) homelessness++; } - if (citizen.getEntity().isPresent() && citizen.getEntity().get().getCitizenDiseaseHandler().isSick()) + if (citizen.getEntity().isPresent() && citizen.getCitizenDiseaseHandler().isSick()) { sickPeople++; } diff --git a/src/main/java/com/minecolonies/core/entity/visitor/VisitorCitizen.java b/src/main/java/com/minecolonies/core/entity/visitor/VisitorCitizen.java index eb59eca7778..6005cb8d9c6 100644 --- a/src/main/java/com/minecolonies/core/entity/visitor/VisitorCitizen.java +++ b/src/main/java/com/minecolonies/core/entity/visitor/VisitorCitizen.java @@ -119,7 +119,6 @@ public class VisitorCitizen extends AbstractEntityCitizen * The location used for requests */ private ILocation location = null; - private ICitizenDiseaseHandler citizenDiseaseHandler; /** * Constructor for a new citizen typed entity. @@ -138,7 +137,6 @@ public VisitorCitizen(final EntityType type, final Leve this.citizenJobHandler = new CitizenJobHandler(this); this.citizenSleepHandler = new CitizenSleepHandler(this); this.citizenExperienceHandler = new CitizenExperienceHandler(this); - this.citizenDiseaseHandler = new CitizenDiseaseHandler(this); this.moveControl = new MovementHandler(this); this.setPersistenceRequired(); @@ -390,18 +388,6 @@ public ICitizenSleepHandler getCitizenSleepHandler() return citizenSleepHandler; } - @Override - public ICitizenDiseaseHandler getCitizenDiseaseHandler() - { - return citizenDiseaseHandler; - } - - @Override - public void setCitizenDiseaseHandler(final ICitizenDiseaseHandler citizenDiseaseHandler) - { - this.citizenDiseaseHandler = citizenDiseaseHandler; - } - @Override public float getRotationYaw() { @@ -600,8 +586,6 @@ public void addAdditionalSaveData(final CompoundTag compound) { compound.putInt(TAG_CITIZEN, citizenData.getId()); } - - citizenDiseaseHandler.write(compound); } @Override @@ -617,8 +601,6 @@ public void readAdditionalSaveData(final CompoundTag compound) citizenId = compound.getInt(TAG_CITIZEN); } } - - citizenDiseaseHandler.read(compound); } @Override diff --git a/src/main/java/com/minecolonies/core/items/ItemScrollGuardHelp.java b/src/main/java/com/minecolonies/core/items/ItemScrollGuardHelp.java index c913da5147e..15e2465d1dd 100644 --- a/src/main/java/com/minecolonies/core/items/ItemScrollGuardHelp.java +++ b/src/main/java/com/minecolonies/core/items/ItemScrollGuardHelp.java @@ -5,7 +5,6 @@ import com.minecolonies.api.colony.buildings.IBuilding; import com.minecolonies.api.entity.ai.statemachine.AIOneTimeEventTarget; import com.minecolonies.api.entity.ai.statemachine.states.AIWorkerState; -import com.minecolonies.core.tileentities.TileEntityColonyBuilding; import com.minecolonies.api.util.BlockPosUtil; import com.minecolonies.api.util.MessageUtils; import com.minecolonies.api.util.SoundUtils; @@ -16,21 +15,25 @@ import com.minecolonies.core.colony.jobs.AbstractJobGuard; import com.minecolonies.core.entity.ai.workers.guard.AbstractEntityAIGuard; import com.minecolonies.core.network.messages.client.VanillaParticleMessage; -import net.minecraft.world.item.TooltipFlag; +import com.minecolonies.core.tileentities.TileEntityColonyBuilding; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.Style; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.animal.horse.Llama; -import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.context.UseOnContext; -import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.InteractionResult; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.core.BlockPos; - import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; @@ -40,11 +43,6 @@ import static com.minecolonies.api.util.constant.Constants.TICKS_SECOND; import static com.minecolonies.api.util.constant.translation.ToolTranslationConstants.TOOL_GUARD_SCROLL_NO_GUARD_BUILDING; -import net.minecraft.ChatFormatting; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.network.chat.Style; - /** * Magic scroll which summons guards to the users aid, with a limited duration. Only works within the same world as the colony. */ @@ -101,7 +99,7 @@ protected ItemStack onItemUseSuccess( if (citizenData.getEntity().isPresent()) { - if (citizenData.getEntity().get().getCitizenDiseaseHandler().isSick()) + if (citizenData.getCitizenDiseaseHandler().isSick()) { continue; } diff --git a/src/main/resources/data/minecolonies/tags/blocks/tier6blocks.json b/src/main/resources/data/minecolonies/tags/blocks/tier6blocks.json index b4d42d3944b..4d8de4a78fb 100644 --- a/src/main/resources/data/minecolonies/tags/blocks/tier6blocks.json +++ b/src/main/resources/data/minecolonies/tags/blocks/tier6blocks.json @@ -3,6 +3,7 @@ "minecraft:wither_rose", "minecraft:dragon_head", "minecraft:beacon", - "minecraft:conduit" + "minecraft:conduit", + "minecraft:torchflower" ] } \ No newline at end of file