-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
- Loading branch information
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
package dev.dubhe.anvilcraft.api.entity; | ||
|
||
import dev.architectury.injectables.annotations.ExpectPlatform; | ||
import net.minecraft.nbt.CompoundTag; | ||
import net.minecraft.world.entity.LivingEntity; | ||
|
||
public class EntityHelper { | ||
@ExpectPlatform | ||
public static CompoundTag getCustomData(LivingEntity entity) { | ||
return null; | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
package dev.dubhe.anvilcraft.api.entity.attribute; | ||
|
||
import com.google.common.collect.Multimap; | ||
import dev.architectury.injectables.annotations.ExpectPlatform; | ||
import net.minecraft.world.entity.ai.attributes.Attribute; | ||
import net.minecraft.world.entity.ai.attributes.AttributeModifier; | ||
|
||
import java.util.function.Supplier; | ||
|
||
public class EntityReachAttribute { | ||
|
||
@ExpectPlatform | ||
public static Supplier<Multimap<Attribute, AttributeModifier>> getRangeModifierSupplier( | ||
AttributeModifier modifier | ||
) { | ||
return null; | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
package dev.dubhe.anvilcraft.item; | ||
|
||
import com.google.common.collect.Multimap; | ||
import dev.dubhe.anvilcraft.api.entity.EntityHelper; | ||
import dev.dubhe.anvilcraft.api.entity.attribute.EntityReachAttribute; | ||
import dev.dubhe.anvilcraft.init.ModItems; | ||
import net.minecraft.nbt.CompoundTag; | ||
import net.minecraft.world.entity.LivingEntity; | ||
import net.minecraft.world.entity.ai.attributes.Attribute; | ||
import net.minecraft.world.entity.ai.attributes.AttributeModifier; | ||
import net.minecraft.world.entity.player.Player; | ||
import net.minecraft.world.item.Item; | ||
|
||
import java.util.UUID; | ||
import java.util.function.Supplier; | ||
|
||
public class CrabClawItem extends Item { | ||
|
||
public static final AttributeModifier rangeAttributeModifier = | ||
new AttributeModifier( | ||
UUID.fromString("ea7bed72-603d-4990-87b6-24abe91ea523"), | ||
"RangeModifier", | ||
3, | ||
AttributeModifier.Operation.ADDITION | ||
); | ||
|
||
public static final String CRAB_CLAW_MARKER = "crabClaw"; | ||
public static final String DUAL_CRAB_CLAW_MARKER = "dualCrabClaw"; | ||
|
||
private static final Supplier<Multimap<Attribute, AttributeModifier>> rangeModifier | ||
= EntityReachAttribute.getRangeModifierSupplier(rangeAttributeModifier); | ||
|
||
public CrabClawItem(Properties properties) { | ||
super(properties); | ||
} | ||
|
||
public static void holdingCrabClawIncreasesRange(LivingEntity entity) { | ||
Check warning on line 37 in common/src/main/java/dev/dubhe/anvilcraft/item/CrabClawItem.java
|
||
if (!(entity instanceof Player player)) return; | ||
if (entity.level().isClientSide) return; | ||
CompoundTag customData = EntityHelper.getCustomData(entity); | ||
boolean inOffHand = ModItems.CRAB_CLAW.isIn(player.getOffhandItem()); | ||
boolean inMainHand = ModItems.CRAB_CLAW.isIn(player.getMainHandItem()); | ||
boolean holdingDualCrabClaw = inOffHand && inMainHand; | ||
boolean holdingCrabClaw = inOffHand || inMainHand; | ||
boolean wasHoldingCrabClaw = customData.contains(CRAB_CLAW_MARKER); | ||
boolean wasHoldingDualCrabClaw = customData.contains(DUAL_CRAB_CLAW_MARKER); | ||
if (!holdingCrabClaw) { | ||
player.getAttributes() | ||
.removeAttributeModifiers(rangeModifier.get()); | ||
if (wasHoldingCrabClaw) { | ||
customData.remove(CRAB_CLAW_MARKER); | ||
} | ||
} else { | ||
player.getAttributes() | ||
.addTransientAttributeModifiers(rangeModifier.get()); | ||
if (!wasHoldingDualCrabClaw) { | ||
customData.putBoolean(CRAB_CLAW_MARKER, true); | ||
} | ||
} | ||
|
||
if (!holdingDualCrabClaw) { | ||
if (wasHoldingDualCrabClaw) { | ||
customData.remove(DUAL_CRAB_CLAW_MARKER); | ||
} | ||
} else { | ||
if (!wasHoldingDualCrabClaw) { | ||
customData.putBoolean(DUAL_CRAB_CLAW_MARKER, true); | ||
} | ||
} | ||
|
||
} | ||
|
||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
package dev.dubhe.anvilcraft.mixin; | ||
|
||
import dev.dubhe.anvilcraft.item.CrabClawItem; | ||
import net.minecraft.world.entity.LivingEntity; | ||
import org.spongepowered.asm.mixin.Mixin; | ||
import org.spongepowered.asm.mixin.injection.At; | ||
import org.spongepowered.asm.mixin.injection.Inject; | ||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; | ||
|
||
@Mixin(LivingEntity.class) | ||
public class LivingEntityMixin { | ||
@Inject(method = "tick", at = @At("HEAD")) | ||
void onLivingEntityTick(CallbackInfo ci) { | ||
CrabClawItem.holdingCrabClawIncreasesRange((LivingEntity) (Object) this); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
package dev.dubhe.anvilcraft.mixin.accessor; | ||
|
||
import net.minecraft.client.renderer.ItemInHandRenderer; | ||
import net.minecraft.world.item.Item; | ||
import net.minecraft.world.item.ItemStack; | ||
import org.spongepowered.asm.mixin.Mixin; | ||
import org.spongepowered.asm.mixin.gen.Accessor; | ||
|
||
|
||
@Mixin(ItemInHandRenderer.class) | ||
Check warning on line 10 in common/src/main/java/dev/dubhe/anvilcraft/mixin/accessor/ItemInHandRendererAccessor.java
|
||
public interface ItemInHandRendererAccessor { | ||
@Accessor | ||
ItemStack getMainHandItem(); | ||
|
||
@Accessor | ||
ItemStack getOffHandItem(); | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
package dev.dubhe.anvilcraft.mixin.accessor; | ||
|
||
import net.minecraft.client.Minecraft; | ||
import org.spongepowered.asm.mixin.Mixin; | ||
import org.spongepowered.asm.mixin.gen.Accessor; | ||
|
||
@Mixin(Minecraft.class) | ||
Check warning on line 7 in common/src/main/java/dev/dubhe/anvilcraft/mixin/accessor/MinecraftAccessor.java
|
||
public interface MinecraftAccessor { | ||
@Accessor("pausePartialTick") | ||
float getPausePartialTick(); | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
package dev.dubhe.anvilcraft.api.entity.attribute.fabric; | ||
|
||
import com.google.common.base.Suppliers; | ||
import com.google.common.collect.ImmutableMultimap; | ||
import com.google.common.collect.Multimap; | ||
import com.jamieswhiteshirt.reachentityattributes.ReachEntityAttributes; | ||
import net.minecraft.world.entity.ai.attributes.Attribute; | ||
import net.minecraft.world.entity.ai.attributes.AttributeModifier; | ||
|
||
import java.util.function.Supplier; | ||
|
||
public class EntityReachAttributeImpl { | ||
public static Supplier<Multimap<Attribute, AttributeModifier>> getRangeModifierSupplier( | ||
Check warning on line 13 in fabric/src/main/java/dev/dubhe/anvilcraft/api/entity/attribute/fabric/EntityReachAttributeImpl.java
|
||
AttributeModifier modifier | ||
) { | ||
return Suppliers.memoize(() -> | ||
ImmutableMultimap.of( | ||
ReachEntityAttributes.REACH, modifier, | ||
ReachEntityAttributes.ATTACK_RANGE, modifier | ||
) | ||
); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
package dev.dubhe.anvilcraft.api.entity.fabric; | ||
|
||
import net.minecraft.nbt.CompoundTag; | ||
import net.minecraft.server.MinecraftServer; | ||
import net.minecraft.world.entity.LivingEntity; | ||
import net.minecraft.world.level.Level; | ||
import net.minecraft.world.level.saveddata.SavedData; | ||
|
||
import java.util.Map; | ||
import java.util.UUID; | ||
import java.util.concurrent.ConcurrentHashMap; | ||
|
||
public class CustomDataPersistentState extends SavedData { | ||
private static final String PLAYER_DATA_TAG = "AnvilCraftData"; | ||
private final Map<UUID, CompoundTag> playerCustomData = new ConcurrentHashMap<>(); | ||
|
||
static CompoundTag getPlayerCustomData(LivingEntity player) { | ||
CustomDataPersistentState state = getServerState(player.level().getServer()); | ||
return state.playerCustomData.computeIfAbsent( | ||
player.getUUID(), | ||
it -> new CompoundTag() | ||
); | ||
} | ||
|
||
public static CustomDataPersistentState getServerState(MinecraftServer server) { | ||
Check warning on line 25 in fabric/src/main/java/dev/dubhe/anvilcraft/api/entity/fabric/CustomDataPersistentState.java
|
||
var dataStorage = server.getLevel(Level.OVERWORLD).getDataStorage(); | ||
var state = dataStorage.computeIfAbsent( | ||
CustomDataPersistentState::createFromCompoundTag, | ||
CustomDataPersistentState::new, | ||
"anvilcraft" | ||
); | ||
state.setDirty(); | ||
return state; | ||
} | ||
|
||
public static CustomDataPersistentState createFromCompoundTag(CompoundTag tag) { | ||
Check warning on line 36 in fabric/src/main/java/dev/dubhe/anvilcraft/api/entity/fabric/CustomDataPersistentState.java
|
||
CustomDataPersistentState state = new CustomDataPersistentState(); | ||
CompoundTag playersTag = tag.getCompound(PLAYER_DATA_TAG); | ||
playersTag.getAllKeys().forEach(it -> { | ||
CompoundTag compoundTag = playersTag.getCompound(it); | ||
UUID uuid = UUID.fromString(it); | ||
state.playerCustomData.put(uuid, compoundTag); | ||
}); | ||
return state; | ||
} | ||
|
||
@Override | ||
public CompoundTag save(CompoundTag compoundTag) { | ||
CompoundTag dataTag = new CompoundTag(); | ||
this.playerCustomData.forEach((uuid, tag) -> { | ||
dataTag.put(uuid.toString(), tag); | ||
}); | ||
compoundTag.put(PLAYER_DATA_TAG, dataTag); | ||
return compoundTag; | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
package dev.dubhe.anvilcraft.api.entity.fabric; | ||
|
||
import net.minecraft.nbt.CompoundTag; | ||
import net.minecraft.world.entity.LivingEntity; | ||
|
||
public class EntityHelperImpl { | ||
|
||
public static CompoundTag getCustomData(LivingEntity entity) { | ||
return CustomDataPersistentState.getPlayerCustomData(entity); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
package dev.dubhe.anvilcraft.api.entity.attribute.forge; | ||
|
||
import com.google.common.base.Suppliers; | ||
import com.google.common.collect.ImmutableMultimap; | ||
import com.google.common.collect.Multimap; | ||
import net.minecraft.world.entity.ai.attributes.Attribute; | ||
import net.minecraft.world.entity.ai.attributes.AttributeModifier; | ||
import net.minecraftforge.common.ForgeMod; | ||
|
||
import java.util.function.Supplier; | ||
|
||
public class EntityReachAttributeImpl { | ||
public static Supplier<Multimap<Attribute, AttributeModifier>> getRangeModifierSupplier( | ||
AttributeModifier modifier | ||
) { | ||
return Suppliers.memoize(() -> ImmutableMultimap.of(ForgeMod.BLOCK_REACH.get(), modifier)); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
package dev.dubhe.anvilcraft.api.entity.forge; | ||
|
||
import net.minecraft.nbt.CompoundTag; | ||
import net.minecraft.world.entity.LivingEntity; | ||
|
||
public class EntityHelperImpl { | ||
|
||
public static CompoundTag getCustomData(LivingEntity entity) { | ||
return entity.getPersistentData(); | ||
} | ||
} |