Skip to content

Commit

Permalink
蟹钳实现:增加手长
Browse files Browse the repository at this point in the history
  • Loading branch information
ZhuRuoLing committed Apr 22, 2024
1 parent fab3db9 commit 4c0a781
Show file tree
Hide file tree
Showing 15 changed files with 286 additions and 3 deletions.
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;
}
}
5 changes: 3 additions & 2 deletions common/src/main/java/dev/dubhe/anvilcraft/init/ModItems.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import dev.dubhe.anvilcraft.data.recipe.crafting.ShapedTagRecipeBuilder;
import dev.dubhe.anvilcraft.item.AnvilHammerItem;
import dev.dubhe.anvilcraft.item.CapacitorItem;
import dev.dubhe.anvilcraft.item.CrabClawItem;
import dev.dubhe.anvilcraft.item.CursedItem;
import dev.dubhe.anvilcraft.item.GeodeItem;
import dev.dubhe.anvilcraft.item.MagnetItem;
Expand Down Expand Up @@ -558,8 +559,8 @@ public void appendHoverText(
.unlockedBy(AnvilCraftDatagen.hasItem(Items.IRON_INGOT), RegistrateRecipeProvider.has(Items.IRON_INGOT))
.save(provider))
.register();
public static final ItemEntry<Item> CRAB_CLAW = REGISTRATE
.item("crab_claw", Item::new)
public static final ItemEntry<CrabClawItem> CRAB_CLAW = REGISTRATE
.item("crab_claw", CrabClawItem::new)
.model((ctx, provider) -> {
})
.register();
Expand Down
73 changes: 73 additions & 0 deletions common/src/main/java/dev/dubhe/anvilcraft/item/CrabClawItem.java
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

View workflow job for this annotation

GitHub Actions / Checkstyle

[Checkstyle] common/src/main/java/dev/dubhe/anvilcraft/item/CrabClawItem.java#L37 <com.puppycrawl.tools.checkstyle.checks.javadoc.MissingJavadocMethodCheck>

Missing a Javadoc comment.
Raw output
/home/runner/work/AnvilCraftMod/AnvilCraftMod/common/src/main/java/dev/dubhe/anvilcraft/item/CrabClawItem.java:37:5: warning: Missing a Javadoc comment. (com.puppycrawl.tools.checkstyle.checks.javadoc.MissingJavadocMethodCheck)
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

View workflow job for this annotation

GitHub Actions / Checkstyle

[Checkstyle] common/src/main/java/dev/dubhe/anvilcraft/mixin/accessor/ItemInHandRendererAccessor.java#L10 <com.puppycrawl.tools.checkstyle.checks.javadoc.MissingJavadocTypeCheck>

Missing a Javadoc comment.
Raw output
/home/runner/work/AnvilCraftMod/AnvilCraftMod/common/src/main/java/dev/dubhe/anvilcraft/mixin/accessor/ItemInHandRendererAccessor.java:10:1: warning: Missing a Javadoc comment. (com.puppycrawl.tools.checkstyle.checks.javadoc.MissingJavadocTypeCheck)
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

View workflow job for this annotation

GitHub Actions / Checkstyle

[Checkstyle] common/src/main/java/dev/dubhe/anvilcraft/mixin/accessor/MinecraftAccessor.java#L7 <com.puppycrawl.tools.checkstyle.checks.javadoc.MissingJavadocTypeCheck>

Missing a Javadoc comment.
Raw output
/home/runner/work/AnvilCraftMod/AnvilCraftMod/common/src/main/java/dev/dubhe/anvilcraft/mixin/accessor/MinecraftAccessor.java:7:1: warning: Missing a Javadoc comment. (com.puppycrawl.tools.checkstyle.checks.javadoc.MissingJavadocTypeCheck)
public interface MinecraftAccessor {
@Accessor("pausePartialTick")
float getPausePartialTick();
}
5 changes: 4 additions & 1 deletion common/src/main/resources/anvilcraft-common.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,16 @@
"DispenseItemEmptyBucketBehaviorMixin",
"DispenseItemWaterBottleBehaviorMixin",
"ItemEntityMixin",
"LivingEntityMixin",
"LootContextParamSetsAccessor",
"SolidBucketItemMixin",
"accessor.BaseSpawnerAccessor",
"accessor.FallingBlockEntityAccessor"
],
"client": [
"LevelRendererMixin"
"LevelRendererMixin",
"accessor.ItemInHandRendererAccessor",
"accessor.MinecraftAccessor"
],
"injectors": {
"defaultRequire": 1
Expand Down
8 changes: 8 additions & 0 deletions fabric/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,10 @@ repositories {
maven { url = "https://jitpack.io/" } // Mixin Extras, Fabric ASM
maven { url = "https://raw.githubusercontent.com/Fuzss/modresources/main/maven/" }
maven { url = "https://maven.saps.dev/minecraft" } // saps.dev Maven (KubeJS and Rhino)
maven { // Reach Entity Attributes
url = "https://maven.jamieswhiteshirt.com/libs-release"
content { includeGroup("com.jamieswhiteshirt") }
}
}

dependencies {
Expand Down Expand Up @@ -125,6 +129,10 @@ dependencies {
// cloth config api
modImplementation(fabric.clothConfig)
include(fabric.clothConfig)

//reach-entity-attributes
modImplementation(fabric.reachEntityAttributes)
include(fabric.reachEntityAttributes)
}


Expand Down
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

View workflow job for this annotation

GitHub Actions / Checkstyle

[Checkstyle] fabric/src/main/java/dev/dubhe/anvilcraft/api/entity/attribute/fabric/EntityReachAttributeImpl.java#L13 <com.puppycrawl.tools.checkstyle.checks.javadoc.MissingJavadocMethodCheck>

Missing a Javadoc comment.
Raw output
/home/runner/work/AnvilCraftMod/AnvilCraftMod/fabric/src/main/java/dev/dubhe/anvilcraft/api/entity/attribute/fabric/EntityReachAttributeImpl.java:13:5: warning: Missing a Javadoc comment. (com.puppycrawl.tools.checkstyle.checks.javadoc.MissingJavadocMethodCheck)
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

View workflow job for this annotation

GitHub Actions / Checkstyle

[Checkstyle] fabric/src/main/java/dev/dubhe/anvilcraft/api/entity/fabric/CustomDataPersistentState.java#L25 <com.puppycrawl.tools.checkstyle.checks.javadoc.MissingJavadocMethodCheck>

Missing a Javadoc comment.
Raw output
/home/runner/work/AnvilCraftMod/AnvilCraftMod/fabric/src/main/java/dev/dubhe/anvilcraft/api/entity/fabric/CustomDataPersistentState.java:25:5: warning: Missing a Javadoc comment. (com.puppycrawl.tools.checkstyle.checks.javadoc.MissingJavadocMethodCheck)
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

View workflow job for this annotation

GitHub Actions / Checkstyle

[Checkstyle] fabric/src/main/java/dev/dubhe/anvilcraft/api/entity/fabric/CustomDataPersistentState.java#L36 <com.puppycrawl.tools.checkstyle.checks.javadoc.MissingJavadocMethodCheck>

Missing a Javadoc comment.
Raw output
/home/runner/work/AnvilCraftMod/AnvilCraftMod/fabric/src/main/java/dev/dubhe/anvilcraft/api/entity/fabric/CustomDataPersistentState.java:36:5: warning: Missing a Javadoc comment. (com.puppycrawl.tools.checkstyle.checks.javadoc.MissingJavadocMethodCheck)
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();
}
}
5 changes: 5 additions & 0 deletions settings.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ dependencyResolutionManagement {
def modMenuVersion = "7.1.0"
def jadeFabricVersion = "11.8.0"
def registrateFabricVersion = "1.4.5-MC1.20.1"
def reachEntityAttributesVersion = "2.4.0"


// Forge
def forgeVersion = "47.2.0"
Expand Down Expand Up @@ -96,6 +98,9 @@ dependencyResolutionManagement {

def clothConfig = version("clothConfig", clothConfigVersion)
library("clothConfig", "me.shedaniel.cloth", "cloth-config-fabric").versionRef(clothConfig)

def reachEntityAttributes = version("reach-entity-attributes", reachEntityAttributesVersion)
library("reachEntityAttributes", "com.jamieswhiteshirt", "reach-entity-attributes").versionRef(reachEntityAttributes)
}

forge {
Expand Down

0 comments on commit 4c0a781

Please sign in to comment.