Skip to content

Commit

Permalink
Been a while, whoops.
Browse files Browse the repository at this point in the history
Refactor: Re-do structure... for the millionth time.
Feat: All LivingEntities are affected by Toxic Buildup
Feat: Toxic Buildup is tied to LivingEntity.tick
Feat: Toxic Resistance & Toxic Damage entity attributes
Fix: Suspicious Blocks weren't playing nice with BrushableBlockEntity
  • Loading branch information
kd8lvt committed Nov 3, 2024
1 parent 5b684d1 commit d0b2827
Show file tree
Hide file tree
Showing 83 changed files with 458 additions and 316 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.kd8lvt.exclusionzone;

import com.kd8lvt.exclusionzone.entity.render.CaroInvictusRenderer;
import com.kd8lvt.exclusionzone.entity.CaroInvictusEntity;
import com.kd8lvt.exclusionzone.content.entity.CaroInvictusEntity;
import com.kd8lvt.exclusionzone.registry.ModBlocks;
import com.kd8lvt.exclusionzone.registry.ModEntities;
import net.fabricmc.api.ClientModInitializer;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.kd8lvt.exclusionzone.entity.model;

import com.kd8lvt.exclusionzone.entity.CaroInvictusEntity;
import com.kd8lvt.exclusionzone.content.entity.CaroInvictusEntity;
import net.minecraft.client.model.ModelPart;
import net.minecraft.client.render.entity.EntityRendererFactory;
import net.minecraft.client.render.entity.model.EntityModelLayers;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import com.kd8lvt.exclusionzone.ExclusionZone;
import com.kd8lvt.exclusionzone.entity.model.CaroInvictusModel;
import com.kd8lvt.exclusionzone.entity.CaroInvictusEntity;
import com.kd8lvt.exclusionzone.content.entity.CaroInvictusEntity;
import net.minecraft.client.render.entity.EntityRendererFactory;
import net.minecraft.client.render.entity.MobEntityRenderer;
import net.minecraft.util.Identifier;
Expand Down
4 changes: 1 addition & 3 deletions src/main/java/com/kd8lvt/exclusionzone/ExclusionZone.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.kd8lvt.exclusionzone;

import com.kd8lvt.exclusionzone.handler.ModEventHandlers;
import com.kd8lvt.exclusionzone.player.ToxicBuildupTracker;
import com.kd8lvt.exclusionzone.event.ModEventHandlers;
import com.kd8lvt.exclusionzone.registry.ModItems;
import com.kd8lvt.exclusionzone.registry.ModRegistries;
import net.fabricmc.api.ModInitializer;
Expand All @@ -14,7 +13,6 @@
public class ExclusionZone implements ModInitializer {
public static final Logger LOGGER = LoggerFactory.getLogger("exclusionzone");
public static MinecraftServer Server = null;
public static final ToxicBuildupTracker toxTracker = new ToxicBuildupTracker();

@Override
public void onInitialize() {
Expand Down
186 changes: 186 additions & 0 deletions src/main/java/com/kd8lvt/exclusionzone/api/ToxicBuildupTracker.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,186 @@
package com.kd8lvt.exclusionzone.api;

import com.kd8lvt.exclusionzone.content.entity.CaroInvictusEntity;
import com.kd8lvt.exclusionzone.registry.ModAttributes;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.effect.StatusEffectInstance;
import net.minecraft.entity.effect.StatusEffects;
import net.minecraft.item.ItemStack;
import net.minecraft.network.packet.s2c.play.OverlayMessageS2CPacket;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.text.MutableText;
import net.minecraft.text.Style;
import net.minecraft.text.Text;
import net.minecraft.util.Formatting;
import net.minecraft.util.math.Box;
import net.minecraft.util.math.Direction;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Objects;
import java.util.UUID;

import static com.kd8lvt.exclusionzone.registry.ModAttributes.TOXIN_RESISTANCE;

@SuppressWarnings("unused")
public class ToxicBuildupTracker {
private static final HashMap<UUID,Float> buildupTracker = new HashMap<>();

@SuppressWarnings("unused")
public static void tickFor(LivingEntity entity) {
Float buildup = buildupTracker.getOrDefault(entity.getUuid(),0f);
if (buildup > 2000) setBuildup(entity,2000f);
if (buildup < 0) setBuildup(entity,0f);

boolean increaseTox = false;
if (Objects.equals(entity.getWorld().getBiome(entity.getBlockPos()).getIdAsString(), "exclusionzone:exclusion_zone")) {
for (ItemStack stack : entity.getAllArmorItems()) {
if (stack.isEmpty()) {
increaseTox = true;
break;
}
}
}

if (!entity.getWorld().getEntitiesByClass(CaroInvictusEntity.class, new Box(entity.getBlockPos().offset(Direction.DOWN,8).offset(Direction.SOUTH,8).offset(Direction.EAST,8).toCenterPos(),entity.getBlockPos().offset(Direction.UP,8).offset(Direction.NORTH,8).offset(Direction.WEST,8).toCenterPos()), caroInvictusEntity -> caroInvictusEntity.hasDied).isEmpty()) increaseTox = true;

if (increaseTox) incrementBuildup(entity);
else decrementBuildupUnresisted(entity,1f);

applyEffects(entity);
trySendActionbar(entity, buildup);
}

private static void trySendActionbar(LivingEntity entity, Float buildup) {
if (!(entity instanceof ServerPlayerEntity player)) return;
if (Math.floor(buildup) <= 0f) return;
buildup = (float) Math.floor(buildup);
ArrayList<Text> txt = new ArrayList<>(Text.of("⚠ ").getWithStyle(Style.EMPTY.withColor(Formatting.YELLOW)));
txt.addAll(Text.of("█".repeat((int) Math.max(Math.min(buildup/200,2000),0))).getWithStyle(Style.EMPTY.withColor(0x00A776)));
txt.addAll(Text.of("░".repeat((int) Math.max(Math.min((2000-(buildup)+200)/200,2000),0))).getWithStyle(Style.EMPTY.withColor(0x00A776)));
txt.addAll(Text.of(" ⚠").getWithStyle(Style.EMPTY.withColor(Formatting.YELLOW)));
MutableText concatTxt = Text.of("").copy(); //Because casting is hard apparently??? What was I cooking 4.5 months ago?
txt.forEach(concatTxt::append);
OverlayMessageS2CPacket titlePacket = new OverlayMessageS2CPacket(concatTxt);
player.networkHandler.sendPacket(titlePacket);
}

private static void applyEffects(LivingEntity entity) {
Float buildup = buildupTracker.get(entity.getUuid());
if (buildup > 200) entity.addStatusEffect(new StatusEffectInstance(StatusEffects.WEAKNESS,20,0,true,false,false));
if (buildup > 400) entity.addStatusEffect(new StatusEffectInstance(StatusEffects.SLOWNESS,20,0,true,false,false));
if (buildup > 600) entity.addStatusEffect(new StatusEffectInstance(StatusEffects.HUNGER,20,0,true,false,false));
if (buildup > 800) entity.addStatusEffect(new StatusEffectInstance(StatusEffects.MINING_FATIGUE,20,0,true,false,false));
if (buildup > 1000) entity.addStatusEffect(new StatusEffectInstance(StatusEffects.WEAKNESS,20,1,true,false,false));
if (buildup > 1200) entity.addStatusEffect(new StatusEffectInstance(StatusEffects.DARKNESS,200,0,true,false,false));
if (buildup > 1400) entity.addStatusEffect(new StatusEffectInstance(StatusEffects.NAUSEA,20,0,true,false,false));
if (buildup > 1600) entity.addStatusEffect(new StatusEffectInstance(StatusEffects.POISON,20,0,true,false,false));
if (buildup > 1800) entity.addStatusEffect(new StatusEffectInstance(StatusEffects.POISON,20,5,true,false,false));
//Intentionally > instead of >= to prevent a weird issue with wither only damaging after a few ticks
if (buildup > 2000) entity.addStatusEffect(new StatusEffectInstance(StatusEffects.WITHER,200,0,true,false,false));
}

/**
* Returns delta (applied toxic buildup) multiplied by the complement of the entity's toxin resistance.<br />
* In other words, toxin resistance should be a 0-1 value that represents a percentage reduction in received toxin damage<br />
* For example, an entity with a toxin resistance of 0 will take 100% (100-0=100) toxin damage<br />
* Another entity with a toxin resistance of 0.75 will take 25% (100-75=25) toxin damage<br />
* That said, *negative* resistance values also apply, making you take *more* toxin damage.<br />
* Technically, that also means you can recover damage instead of taking it with resistance values > 1<br />
* But, that could be an interesting mechanic so I'm calling it a feature not a bug.<br />
* @param entity The entity to apply the resistance of
* @param delta The amount of toxic buildup to apply resistance to
* @return delta, after resistance has been applied
*/
public static Float applyResistance(LivingEntity entity,Float delta) {
return (float) (delta * (1-entity.getAttributes().getValue(TOXIN_RESISTANCE)));
}

/**
* Removes an entity from the tracker.<br />
* Only worth doing if the entity isn't going to be around next tick, and you aren't using {@link net.minecraft.entity.Entity#discard()}
* @param entity The entity to remove
* @return Their toxic buildup prior to being removed
*/
public static Float remove(LivingEntity entity) {
return buildupTracker.remove(entity.getUuid());
}

/**
* Gets the toxic buildup for {@code entity}.
* @param entity the entity to get the toxic buildup of
* @return {@code entity}'s toxic buildup
*/
public static Float get(LivingEntity entity) {
return buildupTracker.get(entity.getUuid());
}

/**
* Sets the toxic buildup of {@code entity}.<br />
* {@code entity} does not need to be in the tracker already.
* @param entity The entity to set the toxic buildup of
* @param amt The amount to set {@code entity}'s toxic buildup to.
*/
public static void setBuildup(LivingEntity entity, Float amt) {
buildupTracker.merge(entity.getUuid(),amt,(_a,_b)->amt);
}

/**
* Increments {@code entity}'s toxic buildup by one.<br />
* Affected by {@link ModAttributes#TOXIN_RESISTANCE}
* @param entity The entity to increment toxic buildup for.
*/
public static void incrementBuildup(LivingEntity entity) {
incrementBuildup(entity,1f);
}

/**
* Increments {@code entity}'s toxic buildup by {@code delta}<br />
* Affected by {@link ModAttributes#TOXIN_RESISTANCE}
* @param entity the entity to increment toxic buildup for
* @param delta the amount to increment by
*/
public static void incrementBuildup(LivingEntity entity, Float delta) {
incrementBuildupUnresisted(entity,applyResistance(entity,delta));
}

/**
* Increments {@code entity}'s toxic buildup by {@code delta}<br />
* <b>NOT</b> affected by {@link ModAttributes#TOXIN_RESISTANCE}
* @param entity the entity to increment toxic buildup for
* @param delta the amount to increment by
*/
public static void incrementBuildupUnresisted(LivingEntity entity, Float delta) {
buildupTracker.merge(entity.getUuid(), delta, Float::sum);
}
/**
* Decrements {@code entity}'s toxic buildup by one.<br />
* Affected by {@link ModAttributes#TOXIN_RESISTANCE}
* @param entity The entity to decrement toxic buildup for.
*/
public static void decrementBuildup(LivingEntity entity) {
decrementBuildup(entity,1f);
}

/**
* Decrements {@code entity}'s toxic buildup by {@code delta}<br />
* Affected by {@link ModAttributes#TOXIN_RESISTANCE}
* @param entity the entity to decrement toxic buildup for
* @param delta the amount to decrement by
*/
public static void decrementBuildup(LivingEntity entity, Float delta) {
decrementBuildupUnresisted(entity, applyResistance(entity,delta));
}


/**
* Decrements {@code entity}'s toxic buildup by {@code delta}<br />
* <b>NOT</b> affected by {@link ModAttributes#TOXIN_RESISTANCE}
* @param entity the entity to decrement toxic buildup for
* @param delta the amount to decrement by
*/
public static void decrementBuildupUnresisted(LivingEntity entity, Float delta) {
buildupTracker.merge(entity.getUuid(), -delta, Float::sum); // negating input args instead of subtracting, because why not
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.kd8lvt.exclusionzone.content.attribute;

import net.minecraft.entity.attribute.EntityAttribute;

//Credit:
//Shamelessly ripped from https://github.com/pufmat/attributesmod/blob/1.21/Common/src/main/java/net/puffish/attributesmod/attribute/DynamicEntityAttribute.java
public class DynamicEntityAttribute extends EntityAttribute {
public DynamicEntityAttribute(String translationKey) {
super(translationKey, 0d);
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package com.kd8lvt.exclusionzone.block;
package com.kd8lvt.exclusionzone.content.block;

import com.kd8lvt.exclusionzone.ExclusionZone;
import com.kd8lvt.exclusionzone.block.bases.DispenserCloneBase;
import com.kd8lvt.exclusionzone.block.bases.entity.DispenserCloneBaseBE;
import com.kd8lvt.exclusionzone.block.entity.BlockBreakerBE;
import com.kd8lvt.exclusionzone.block.util.ExclusionZoneFakePlayer;
import com.kd8lvt.exclusionzone.content.block.bases.DispenserCloneBase;
import com.kd8lvt.exclusionzone.content.block.bases.entity.DispenserCloneBaseBE;
import com.kd8lvt.exclusionzone.content.entity.BlockBreakerBE;
import com.kd8lvt.exclusionzone.content.block.util.ExclusionZoneFakePlayer;
import com.kd8lvt.exclusionzone.registry.ModBlockEntities;
import com.mojang.serialization.MapCodec;
import net.minecraft.block.Block;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.kd8lvt.exclusionzone.block;
package com.kd8lvt.exclusionzone.content.block;

import com.kd8lvt.exclusionzone.block.bases.DispenserCloneBase;
import com.kd8lvt.exclusionzone.block.bases.entity.DispenserCloneBaseBE;
import com.kd8lvt.exclusionzone.block.entity.BlockPlacerBE;
import com.kd8lvt.exclusionzone.block.util.ExclusionZoneFakePlayer;
import com.kd8lvt.exclusionzone.content.block.bases.DispenserCloneBase;
import com.kd8lvt.exclusionzone.content.block.bases.entity.DispenserCloneBaseBE;
import com.kd8lvt.exclusionzone.content.entity.BlockPlacerBE;
import com.kd8lvt.exclusionzone.content.block.util.ExclusionZoneFakePlayer;
import com.kd8lvt.exclusionzone.registry.ModBlockEntities;
import net.minecraft.block.entity.BlockEntityType;
import net.minecraft.item.ItemStack;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.kd8lvt.exclusionzone.block;
package com.kd8lvt.exclusionzone.content.block;

import com.kd8lvt.exclusionzone.ExclusionZone;
import com.kd8lvt.exclusionzone.registry.ModBlocks;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.kd8lvt.exclusionzone.block;
package com.kd8lvt.exclusionzone.content.block;

import com.kd8lvt.exclusionzone.block.entity.ExclusionZoneBiomeMakerBE;
import com.kd8lvt.exclusionzone.content.entity.ExclusionZoneBiomeMakerBE;
import net.minecraft.block.Block;
import net.minecraft.block.BlockEntityProvider;
import net.minecraft.block.BlockState;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.kd8lvt.exclusionzone.block;
package com.kd8lvt.exclusionzone.content.block;

import com.kd8lvt.exclusionzone.block.entity.FluidPipeBE;
import com.kd8lvt.exclusionzone.content.entity.FluidPipeBE;
import com.kd8lvt.exclusionzone.registry.ModBlockEntities;
import com.mojang.serialization.MapCodec;
import net.minecraft.block.Block;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.kd8lvt.exclusionzone.block;
package com.kd8lvt.exclusionzone.content.block;

import com.kd8lvt.exclusionzone.block.bases.EZBlockEntityBlock;
import com.kd8lvt.exclusionzone.block.entity.GradientGlassBE;
import com.kd8lvt.exclusionzone.content.block.bases.EZBlockEntityBlock;
import com.kd8lvt.exclusionzone.content.entity.GradientGlassBE;
import com.kd8lvt.exclusionzone.registry.ModBlockEntities;
import com.mojang.serialization.MapCodec;
import net.minecraft.block.BlockState;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.kd8lvt.exclusionzone.block;
package com.kd8lvt.exclusionzone.content.block;

import com.kd8lvt.exclusionzone.block.entity.MufflerBE;
import com.kd8lvt.exclusionzone.content.entity.MufflerBE;
import net.minecraft.block.Block;
import net.minecraft.block.BlockEntityProvider;
import net.minecraft.block.BlockState;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.kd8lvt.exclusionzone.block;
package com.kd8lvt.exclusionzone.content.block;

import com.kd8lvt.exclusionzone.block.entity.RiftBE;
import com.kd8lvt.exclusionzone.content.entity.RiftBE;
import net.minecraft.block.Block;
import net.minecraft.block.BlockEntityProvider;
import net.minecraft.block.BlockState;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.kd8lvt.exclusionzone.block.bases;
package com.kd8lvt.exclusionzone.content.block.bases;

import com.kd8lvt.exclusionzone.block.bases.entity.DispenserCloneBaseBE;
import com.kd8lvt.exclusionzone.content.block.bases.entity.DispenserCloneBaseBE;
import com.mojang.serialization.MapCodec;
import net.minecraft.block.*;
import net.minecraft.block.dispenser.DispenserBehavior;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.kd8lvt.exclusionzone.block.bases;
package com.kd8lvt.exclusionzone.content.block.bases;

import com.kd8lvt.exclusionzone.block.bases.entity.EZBlockEntityEntity;
import com.kd8lvt.exclusionzone.content.block.bases.entity.EZBlockEntityEntity;
import com.mojang.serialization.MapCodec;
import net.minecraft.block.BlockState;
import net.minecraft.block.BlockWithEntity;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.kd8lvt.exclusionzone.block.bases.entity;
package com.kd8lvt.exclusionzone.content.block.bases.entity;

import net.minecraft.block.BlockState;
import net.minecraft.block.entity.BlockEntityType;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.kd8lvt.exclusionzone.block.bases.entity;
package com.kd8lvt.exclusionzone.content.block.bases.entity;

import net.minecraft.block.BlockState;
import net.minecraft.block.entity.BlockEntity;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.kd8lvt.exclusionzone.block.util;
package com.kd8lvt.exclusionzone.content.block.util;

import com.mojang.authlib.GameProfile;
import net.fabricmc.fabric.api.entity.FakePlayer;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.kd8lvt.exclusionzone.block.util;
package com.kd8lvt.exclusionzone.content.block.util;

import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.random.Random;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.kd8lvt.exclusionzone.block.util;
package com.kd8lvt.exclusionzone.content.block.util;

import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.random.Random;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.kd8lvt.exclusionzone.block.util.transaction;
package com.kd8lvt.exclusionzone.content.block.util.transaction;

import net.fabricmc.fabric.api.transfer.v1.transaction.TransactionContext;
import net.fabricmc.fabric.api.transfer.v1.transaction.base.SnapshotParticipant;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.kd8lvt.exclusionzone.block.entity;
package com.kd8lvt.exclusionzone.content.entity;

import com.kd8lvt.exclusionzone.block.bases.entity.DispenserCloneBaseBE;
import com.kd8lvt.exclusionzone.block.util.ExclusionZoneFakePlayer;
import com.kd8lvt.exclusionzone.content.block.bases.entity.DispenserCloneBaseBE;
import com.kd8lvt.exclusionzone.content.block.util.ExclusionZoneFakePlayer;
import com.kd8lvt.exclusionzone.registry.ModBlockEntities;
import net.fabricmc.fabric.api.event.player.PlayerBlockBreakEvents;
import net.minecraft.block.BlockState;
Expand Down
Loading

0 comments on commit d0b2827

Please sign in to comment.