Skip to content

Commit

Permalink
feat: 3 kitsune traits
Browse files Browse the repository at this point in the history
feat: added the ability to add or remove multiple traits simultaneously
  • Loading branch information
ShchMax-sudo committed Jun 29, 2023
1 parent 6a10faa commit 4a14a38
Show file tree
Hide file tree
Showing 4 changed files with 166 additions and 10 deletions.
93 changes: 93 additions & 0 deletions src/main/java/net/sigmarik/abilitymod/AbilityMod.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,18 @@

import net.fabricmc.api.DedicatedServerModInitializer;
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
import net.minecraft.entity.EntityType;
import net.minecraft.item.Item;
import net.minecraft.item.Items;
import net.minecraft.util.math.random.Random;
import net.sigmarik.abilitymod.command.TraitCommand;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.HashSet;
import java.util.List;
import java.util.UUID;

public class AbilityMod implements DedicatedServerModInitializer {
public static final String MOD_ID = "abilitymod";
public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID);
Expand Down Expand Up @@ -40,6 +48,91 @@ public class AbilityMod implements DedicatedServerModInitializer {
public static final int ADDICTION_MID_TIMER = 180 * 20; // 3 minutes
public static final int ADDICTION_WARNING_TIMER = 20 * 20;

public static final HashSet<Item> IRON_ITEMS = new HashSet<>(List.of(
Items.ANVIL,
Items.AXOLOTL_BUCKET,
Items.BLAST_FURNACE,
Items.BUCKET,
Items.CAULDRON,
Items.CHAIN,
Items.CHAINMAIL_BOOTS,
Items.CHAINMAIL_CHESTPLATE,
Items.CHAINMAIL_HELMET,
Items.CHAINMAIL_LEGGINGS,
Items.CHEST_MINECART,
Items.CHIPPED_ANVIL,
Items.COMPASS,
Items.CROSSBOW,
Items.DAMAGED_ANVIL,
Items.DEEPSLATE_IRON_ORE,
Items.DETECTOR_RAIL,
Items.FLINT_AND_STEEL,
Items.FURNACE_MINECART,
Items.HEAVY_WEIGHTED_PRESSURE_PLATE,
Items.HOPPER,
Items.HOPPER_MINECART,
Items.IRON_AXE,
Items.IRON_BARS,
Items.IRON_BLOCK,
Items.IRON_BOOTS,
Items.IRON_CHESTPLATE,
Items.IRON_DOOR,
Items.IRON_HELMET,
Items.IRON_HOE,
Items.IRON_HORSE_ARMOR,
Items.IRON_INGOT,
Items.IRON_LEGGINGS,
Items.IRON_NUGGET,
Items.IRON_ORE,
Items.IRON_PICKAXE,
Items.IRON_SHOVEL,
Items.IRON_SWORD,
Items.IRON_TRAPDOOR,
Items.LANTERN,
Items.LAVA_BUCKET,
Items.MILK_BUCKET,
Items.MINECART,
Items.PISTON,
Items.POWDER_SNOW_BUCKET,
Items.RAIL,
Items.RAW_IRON,
Items.RAW_IRON_BLOCK,
Items.SHEARS,
Items.SHIELD,
Items.SMITHING_TABLE,
Items.SOUL_LANTERN,
Items.STICKY_PISTON,
Items.STONECUTTER,
Items.TNT_MINECART,
Items.TRAPPED_CHEST,
Items.TRIPWIRE_HOOK,
Items.WATER_BUCKET
));

public static final HashSet<EntityType> NEUTRAL_MOBS = new HashSet<>(List.of(
EntityType.BEE,
EntityType.CAVE_SPIDER,
EntityType.DOLPHIN,
EntityType.ENDERMAN,
EntityType.GOAT,
EntityType.IRON_GOLEM,
EntityType.LLAMA,
EntityType.PANDA,
EntityType.PIGLIN,
EntityType.POLAR_BEAR,
EntityType.SPIDER,
EntityType.WOLF,
EntityType.ZOMBIFIED_PIGLIN,
EntityType.TRADER_LLAMA
));

public static final double FAST_COEFFICIENT = 0.3;
public static final UUID FAST_MODIFIER_UUID = new UUID(Random.createLocal().nextLong(), Random.createLocal().nextLong());

public static final double STRONG_COEFFICIENT = 0.3;
public static final UUID STRONG_MODIFIER_UUID = new UUID(Random.createLocal().nextLong(), Random.createLocal().nextLong());


@Override
public void onInitializeServer() {
LOGGER.info("Initializing AbilityMod.");
Expand Down
66 changes: 57 additions & 9 deletions src/main/java/net/sigmarik/abilitymod/command/TraitCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,16 @@
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import net.minecraft.command.argument.EntityArgumentType;
import net.minecraft.command.suggestion.SuggestionProviders;
import net.minecraft.entity.attribute.EntityAttributeInstance;
import net.minecraft.entity.attribute.EntityAttributeModifier;
import net.minecraft.entity.attribute.EntityAttributes;
import net.minecraft.server.command.ServerCommandSource;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.text.Text;
import net.sigmarik.abilitymod.AbilityMod;
import net.sigmarik.abilitymod.util.ServerState;

import java.util.List;
import java.util.Set;

import static net.minecraft.server.command.CommandManager.*;
Expand All @@ -22,11 +26,12 @@ public static void register(CommandDispatcher<ServerCommandSource> dispatcher) {
literal("trait").requires(source -> source.hasPermissionLevel(2))
.then(literal("add")
.then(argument("players", EntityArgumentType.players())
.then(argument("trait", StringArgumentType.word()).suggests(SuggestionProviders.ALL_RECIPES)
.then(argument("trait", StringArgumentType.greedyString())
.suggests(SuggestionProviders.ALL_RECIPES)
.executes(TraitCommand::addTrait))))
.then(literal("remove")
.then(argument("players", EntityArgumentType.players())
.then(argument("trait", StringArgumentType.word())
.then(argument("trait", StringArgumentType.greedyString())
.executes(TraitCommand::removeTrait))))
.then(literal("list")
.then(argument("player", EntityArgumentType.player())
Expand All @@ -35,16 +40,32 @@ public static void register(CommandDispatcher<ServerCommandSource> dispatcher) {
}

private static int addTrait(CommandContext<ServerCommandSource> context) throws CommandSyntaxException {
String trait = StringArgumentType.getString(context, "trait");
String[] traits = StringArgumentType.getString(context, "trait").split(" ");
java.util.Collection<net.minecraft.server.network.ServerPlayerEntity> players =
EntityArgumentType.getPlayers(context, "players");

ServerState states = ServerState.getTraitStates(context.getSource().getServer());

for (ServerPlayerEntity player : players) {
AbilityMod.LOGGER.info("Adding trait " + trait + " to player " + player.getName().getString());

states.addTrait(player.getUuid(), trait);
for (String trait : traits) {
AbilityMod.LOGGER.info("Adding trait " + trait + " to player " + player.getName().getString());
states.addTrait(player.getUuid(), trait);

if (trait.equals(AbilityMod.TRAIT_FAST)) {
EntityAttributeInstance speed = player.getAttributes().getCustomInstance(EntityAttributes.GENERIC_MOVEMENT_SPEED);
EntityAttributeModifier speedModifier = new EntityAttributeModifier(AbilityMod.FAST_MODIFIER_UUID, "Fast", AbilityMod.FAST_COEFFICIENT, EntityAttributeModifier.Operation.MULTIPLY_BASE);
if (!speed.hasModifier(speedModifier)) {
speed.addPersistentModifier(speedModifier);
}
}
if (trait.equals(AbilityMod.TRAIT_STRONG)) {
EntityAttributeInstance strength = player.getAttributes().getCustomInstance(EntityAttributes.GENERIC_ATTACK_DAMAGE);
EntityAttributeModifier strengthModifier = new EntityAttributeModifier(AbilityMod.STRONG_MODIFIER_UUID, "Strong", AbilityMod.STRONG_COEFFICIENT, EntityAttributeModifier.Operation.MULTIPLY_BASE);
if (!strength.hasModifier(strengthModifier)) {
strength.addPersistentModifier(strengthModifier);
}
}
}
}

states.markDirty();
Expand All @@ -53,16 +74,43 @@ private static int addTrait(CommandContext<ServerCommandSource> context) throws
}

private static int removeTrait(CommandContext<ServerCommandSource> context) throws CommandSyntaxException {
String trait = StringArgumentType.getString(context, "trait");
String[] traits = StringArgumentType.getString(context, "trait").split(" ");
java.util.Collection<net.minecraft.server.network.ServerPlayerEntity> players =
EntityArgumentType.getPlayers(context, "players");

ServerState states = ServerState.getTraitStates(context.getSource().getServer());

boolean allTraits = false;
for (String trait : traits) {
allTraits |= trait.equals("*");
}

List<String> traitCollection = List.of(traits);

for (ServerPlayerEntity player : players) {
AbilityMod.LOGGER.info("Removing trait " + trait + " from player " + player.getName().getString());
if (allTraits) {
traitCollection = states.getTraitList(player.getUuid()).stream().toList();
}

states.removeTrait(player.getUuid(), trait);
for (String trait : traitCollection) {
AbilityMod.LOGGER.info("Removing trait " + trait + " from player " + player.getName().getString());
states.removeTrait(player.getUuid(), trait);

if (trait.equals(AbilityMod.TRAIT_FAST)) {
EntityAttributeInstance speed = player.getAttributes().getCustomInstance(EntityAttributes.GENERIC_MOVEMENT_SPEED);
EntityAttributeModifier speedModifier = new EntityAttributeModifier(AbilityMod.FAST_MODIFIER_UUID, "Fast", AbilityMod.FAST_COEFFICIENT, EntityAttributeModifier.Operation.MULTIPLY_BASE);
if (speed.hasModifier(speedModifier)) {
speed.removeModifier(AbilityMod.FAST_MODIFIER_UUID);
}
}
if (trait.equals(AbilityMod.TRAIT_STRONG)) {
EntityAttributeInstance strength = player.getAttributes().getCustomInstance(EntityAttributes.GENERIC_ATTACK_DAMAGE);
EntityAttributeModifier strengthModifier = new EntityAttributeModifier(AbilityMod.STRONG_MODIFIER_UUID, "Strong", AbilityMod.STRONG_COEFFICIENT, EntityAttributeModifier.Operation.MULTIPLY_BASE);
if (strength.hasModifier(strengthModifier)) {
strength.removeModifier(AbilityMod.STRONG_MODIFIER_UUID);
}
}
}
}

states.markDirty();
Expand Down
15 changes: 15 additions & 0 deletions src/main/java/net/sigmarik/abilitymod/mixin/PlayerEntityMixin.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ public abstract class PlayerEntityMixin extends LivingEntity {

@Shadow public abstract PlayerInventory getInventory();

@Shadow public abstract Iterable<ItemStack> getArmorItems();

protected PlayerEntityMixin(EntityType<? extends LivingEntity> entityType, World world) {
super(entityType, world);
}
Expand Down Expand Up @@ -106,12 +108,25 @@ private void tickLightBurn() {
}
}

private void tickIronBurn() {
if (ServerState.hasTrait((PlayerEntity)(Object)this, AbilityMod.TRAIT_HOT_IRON)) {
boolean doDamage = false;
for (int i = 0; i < 41; ++i) {
doDamage |= AbilityMod.IRON_ITEMS.contains(this.getInventory().getStack(i).getItem());
}
if (doDamage) {
this.damage(new DamageSources(world.getRegistryManager()).hotFloor(), 2);
}
}
}

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

@Inject(method = "eatFood", at = @At("RETURN"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ public static void tickAddictionTimer(PlayerEntity player) {
if (!state.data.containsKey(player.getUuid())) state.registerPlayer(player.getUuid());

if (state.data.get(player.getUuid()).addictionTimer > 0)
--state.data.get(player.getUuid()).addictionTimer;
--state.data.get(player.getUuid()).addictionTimer;
}

public static void setAddictionTimer(PlayerEntity player, int newAddictionTimer) {
Expand Down

0 comments on commit 4a14a38

Please sign in to comment.