Skip to content

Commit

Permalink
feat: dirt sickness trait
Browse files Browse the repository at this point in the history
feat: increase boat_magnet trait effective radius
  • Loading branch information
Sigmarik committed Jun 28, 2023
1 parent 9b7aa48 commit eb52c77
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 11 deletions.
19 changes: 15 additions & 4 deletions src/main/java/net/sigmarik/abilitymod/AbilityMod.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,14 @@

import net.fabricmc.api.DedicatedServerModInitializer;
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
import net.minecraft.world.dimension.DimensionOptionsRegistryHolder;
import net.minecraft.block.Block;
import net.minecraft.block.Blocks;
import net.sigmarik.abilitymod.command.TraitCommand;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Set;

public class AbilityMod implements DedicatedServerModInitializer {
public static final String MOD_ID = "abilitymod";
public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID);
Expand All @@ -21,22 +24,30 @@ public class AbilityMod implements DedicatedServerModInitializer {
public static final String TRAIT_INVERT_EFFECTS = "invert_effects";

public static final String TRAIT_BOAT_MAGNET = "boat_magnet";
public static final String TRAIT_CLEAN_COSTUME = "clean_costume";
public static final String TRAIT_DIRT_SICKNESS = "dirt_sickness";
public static final String TRAIT_ADDICTION = "addiction";

public static final String TRAIT_FAST = "fast";
public static final String TRAIT_STRONG = "strong";
public static final String TRAIT_HATED = "hated";
public static final String TRAIT_HOT_IRON = "hot_iron";

public static final int BOAT_ATTRACTION_DISTANCE = 4;
public static final int BOAT_ATTRACTION_DISTANCE = 8;

public static final double BOAT_ATTRACTION_FACTOR = 0.1;
public static final double BOAT_ATTRACTION_FACTOR = 0.05;

public static final int ADDICTION_START_TIMER = 1800 * 20; // 30 minutes
public static final int ADDICTION_MID_TIMER = 180 * 20; // 3 minutes
public static final int ADDICTION_WARNING_TIMER = 20 * 20;

public static final Set<Block> DIRTY_BLOCKS = Set.of(
Blocks.DIRT, Blocks.DIRT_PATH, Blocks.MUD,
Blocks.MUDDY_MANGROVE_ROOTS, Blocks.FARMLAND, Blocks.MANGROVE_LEAVES,
Blocks.MOSS_BLOCK, Blocks.MOSS_CARPET, Blocks.NETHER_WART_BLOCK, Blocks.ICE,
Blocks.PODZOL, Blocks.CHORUS_FLOWER, Blocks.ROOTED_DIRT, Blocks.SCULK,
Blocks.WARPED_NYLIUM, Blocks.WET_SPONGE, Blocks.ZOMBIE_HEAD, Blocks.ZOMBIE_WALL_HEAD,
Blocks.COAL_BLOCK, Blocks.COAL_ORE, Blocks.DEEPSLATE_COAL_ORE);

@Override
public void onInitializeServer() {
LOGGER.info("Initializing AbilityMod.");
Expand Down
29 changes: 22 additions & 7 deletions src/main/java/net/sigmarik/abilitymod/mixin/PlayerEntityMixin.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,12 @@
import net.minecraft.entity.vehicle.BoatEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.potion.PotionUtil;
import net.minecraft.potion.Potions;
import net.minecraft.util.TypeFilter;
import net.minecraft.util.math.Box;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import net.minecraft.world.biome.BiomeKeys;
import net.sigmarik.abilitymod.AbilityMod;
import net.sigmarik.abilitymod.util.ServerState;
import org.joml.Vector3f;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
Expand Down Expand Up @@ -65,25 +62,43 @@ private void tickBoatMagnet() {
AbilityMod.BOAT_ATTRACTION_DISTANCE,
AbilityMod.BOAT_ATTRACTION_DISTANCE,
AbilityMod.BOAT_ATTRACTION_DISTANCE);
Box ignoranceBox = Box.of(getPos(), 4, 4, 4);

final Predicate<Entity> boatPredicate = boatEntity -> true;

for (Entity entity : getEntityWorld().getEntitiesByClass(BoatEntity.class, attractionBox, boatPredicate)) {
if (entity.hasPassenger(this)) continue;
if (entity.hasVehicle()) continue;
if (entity.getBoundingBox().intersects(getVehicle().getBoundingBox())) continue;
if (entity.getBoundingBox().intersects(ignoranceBox)) continue;

entity.addVelocity(getPos().subtract(entity.getPos()).add(getVelocity())
.multiply(1.0, 0.0, 1.0).multiply(AbilityMod.BOAT_ATTRACTION_FACTOR));
Vec3d delta = getPos().subtract(entity.getPos());
Vec3d direction = delta.normalize();
double multiplier = delta.lengthSquared() * AbilityMod.BOAT_ATTRACTION_FACTOR;

entity.addVelocity(direction.multiply(1.0, 0.0, 1.0).multiply(multiplier));
}
}
}

private void tickDirtSickness() {
if (ServerState.hasTrait((PlayerEntity)(Object)this, AbilityMod.TRAIT_DIRT_SICKNESS) &&
!hasVehicle() && fallDistance == 0.0) {
if (isTouchingWater() &&
(getWorld().getBiome(getBlockPos()).matchesKey(BiomeKeys.SWAMP) ||
getWorld().getBiome(getBlockPos()).matchesKey(BiomeKeys.MANGROVE_SWAMP) ||
getWorld().getBiome(getBlockPos()).matchesKey(BiomeKeys.LUSH_CAVES)))
addStatusEffect(new StatusEffectInstance(StatusEffects.POISON, 5 * 20));
if (AbilityMod.DIRTY_BLOCKS.contains(getSteppingBlockState().getBlock()))
addStatusEffect(new StatusEffectInstance(StatusEffects.POISON, 5 * 20));
}
}

@Inject(method = "tick", at = @At("HEAD"))
private void traitedTick(CallbackInfo ci) {
tickFearOfWater();
tickAddiction();
tickBoatMagnet();
tickDirtSickness();
}

@Inject(method = "eatFood", at = @At("RETURN"))
Expand Down

0 comments on commit eb52c77

Please sign in to comment.