Skip to content

Commit 8635849

Browse files
committed
Move the set_item_pointer_location action to an item modifier
1 parent ca2f8f2 commit 8635849

12 files changed

Lines changed: 110 additions & 98 deletions

File tree

src/main/generated/data/minecraft/item/compass.json

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,28 +12,20 @@
1212
"type": "minecraft:sequence",
1313
"handler": "minecraft:passing",
1414
"entries": [
15-
{
16-
"action": {
17-
"type": "minecraft:modify_item",
18-
"item_modifier": {
19-
"count": 1.0,
20-
"function": "minecraft:split"
21-
}
22-
}
23-
},
24-
{
25-
"action": {
26-
"type": "minecraft:set_item_pointer_location",
27-
"position": "interacted",
28-
"stack": "result"
29-
}
30-
},
3115
{
3216
"action": {
3317
"type": "minecraft:modify_item",
3418
"item_modifier": {
3519
"function": "minecraft:sequence",
3620
"functions": [
21+
{
22+
"count": 1.0,
23+
"function": "minecraft:split"
24+
},
25+
{
26+
"function": "minecraft:set_item_pointer_location",
27+
"position": "interacted"
28+
},
3729
{
3830
"function": "minecraft:set_name",
3931
"name": {
@@ -48,8 +40,7 @@
4840
"function": "minecraft:set_components"
4941
}
5042
]
51-
},
52-
"stack": "result"
43+
}
5344
}
5445
},
5546
{

src/main/java/net/errorcraft/itematic/access/item/ItemStackAccess.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@
55
import net.errorcraft.itematic.item.event.ItemEvent;
66
import net.errorcraft.itematic.world.action.context.ActionContext;
77
import net.minecraft.component.MergedComponentMap;
8+
import net.minecraft.entity.LivingEntity;
89
import net.minecraft.entity.player.PlayerEntity;
910
import net.minecraft.item.Item;
1011
import net.minecraft.item.ItemStack;
1112
import net.minecraft.registry.RegistryKey;
1213
import net.minecraft.registry.entry.RegistryEntry;
1314
import net.minecraft.util.Hand;
1415
import net.minecraft.world.World;
16+
import org.jetbrains.annotations.Nullable;
1517

1618
import java.util.Optional;
1719

@@ -24,6 +26,9 @@ public interface ItemStackAccess {
2426
default int itematic$tryDecrement(int amount) {
2527
return 0;
2628
}
29+
default ItemStack itematic$copyOrSplit(@Nullable LivingEntity holder, int amount) {
30+
return ItemStack.EMPTY;
31+
}
2732
default ItemStack itematic$copyWithItem(RegistryEntry<Item> item) {
2833
return ItemStack.EMPTY;
2934
}

src/main/java/net/errorcraft/itematic/item/ItemUtil.java

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import net.errorcraft.itematic.item.shooter.method.methods.DirectShooterMethod;
2020
import net.errorcraft.itematic.item.smithing.template.SmithingTemplates;
2121
import net.errorcraft.itematic.loot.condition.LocationCheckLootConditionUtil;
22+
import net.errorcraft.itematic.loot.function.SetItemPointerLocationItemModifier;
2223
import net.errorcraft.itematic.loot.function.SplitItemModifier;
2324
import net.errorcraft.itematic.loot.predicate.SideCheckPredicate;
2425
import net.errorcraft.itematic.mixin.item.BrushItemAccessor;
@@ -10991,14 +10992,8 @@ private void bootstrapMiscellaneous() {
1099110992
PassingSequenceHandler.builder()
1099210993
.add(ModifyItemAction.of(
1099310994
ItemStackTarget.TOOL,
10994-
SplitItemModifier.builder(1)
10995-
))
10996-
.add(SetItemPointerLocationAction.of(
10997-
ItemStackTarget.RESULT,
10998-
PositionTarget.INTERACTED_POSITION
10999-
))
11000-
.add(ModifyItemAction.of(
11001-
ItemStackTarget.RESULT,
10995+
SplitItemModifier.builder(1),
10996+
SetItemPointerLocationItemModifier.builder(PositionTarget.INTERACTED_POSITION),
1100210997
SetNameLootFunction.builder(
1100310998
Text.translatable(Util.createTranslationKey("item", Identifier.ofVanilla("lodestone_compass"))),
1100410999
SetNameLootFunction.Target.ITEM_NAME

src/main/java/net/errorcraft/itematic/loot/function/ItematicItemModifierTypes.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ public class ItematicItemModifierTypes {
77
public static final LootFunctionType<DyeItemModifier> DYE = LootFunctionTypesAccessor.register("dye", DyeItemModifier.CODEC);
88
public static final LootFunctionType<SetRandomPotionItemModifier> SET_RANDOM_POTION = LootFunctionTypesAccessor.register("set_random_potion", SetRandomPotionItemModifier.CODEC);
99
public static final LootFunctionType<SplitItemModifier> SPLIT = LootFunctionTypesAccessor.register("split", SplitItemModifier.CODEC);
10+
public static final LootFunctionType<SetItemPointerLocationItemModifier> SET_ITEM_POINTER_LOCATION = LootFunctionTypesAccessor.register("set_item_pointer_location", SetItemPointerLocationItemModifier.CODEC);
1011

1112
private ItematicItemModifierTypes() {}
1213

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package net.errorcraft.itematic.loot.function;
2+
3+
import com.mojang.serialization.MapCodec;
4+
import com.mojang.serialization.codecs.RecordCodecBuilder;
5+
import net.errorcraft.itematic.world.action.context.PositionTarget;
6+
import net.minecraft.component.DataComponentTypes;
7+
import net.minecraft.component.type.LodestoneTrackerComponent;
8+
import net.minecraft.item.ItemStack;
9+
import net.minecraft.loot.condition.LootCondition;
10+
import net.minecraft.loot.context.LootContext;
11+
import net.minecraft.loot.function.ConditionalLootFunction;
12+
import net.minecraft.loot.function.LootFunctionType;
13+
import net.minecraft.util.math.BlockPos;
14+
import net.minecraft.util.math.GlobalPos;
15+
import net.minecraft.util.math.Vec3d;
16+
17+
import java.util.List;
18+
import java.util.Optional;
19+
20+
public class SetItemPointerLocationItemModifier extends ConditionalLootFunction {
21+
public static final MapCodec<SetItemPointerLocationItemModifier> CODEC = RecordCodecBuilder.mapCodec(instance -> addConditionsField(instance).and(
22+
PositionTarget.CODEC.fieldOf("position").forGetter(split -> split.position)
23+
).apply(instance, SetItemPointerLocationItemModifier::new));
24+
25+
private final PositionTarget position;
26+
27+
public SetItemPointerLocationItemModifier(PositionTarget position) {
28+
this(List.of(), position);
29+
}
30+
31+
public SetItemPointerLocationItemModifier(List<LootCondition> conditions, PositionTarget position) {
32+
super(conditions);
33+
this.position = position;
34+
}
35+
36+
public static Builder<?> builder(PositionTarget position) {
37+
return builder(conditions -> new SetItemPointerLocationItemModifier(conditions, position));
38+
}
39+
40+
@Override
41+
public LootFunctionType<SetItemPointerLocationItemModifier> getType() {
42+
return ItematicItemModifierTypes.SET_ITEM_POINTER_LOCATION;
43+
}
44+
45+
@Override
46+
protected ItemStack process(ItemStack stack, LootContext context) {
47+
Vec3d pos = context.get(this.position.parameter());
48+
if (pos == null) {
49+
return stack;
50+
}
51+
52+
stack.set(
53+
DataComponentTypes.LODESTONE_TRACKER,
54+
new LodestoneTrackerComponent(
55+
Optional.of(GlobalPos.create(
56+
context.getWorld().getRegistryKey(),
57+
BlockPos.ofFloored(pos)
58+
)),
59+
true
60+
)
61+
);
62+
return stack;
63+
}
64+
}

src/main/java/net/errorcraft/itematic/loot/function/SplitItemModifier.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22

33
import com.mojang.serialization.MapCodec;
44
import com.mojang.serialization.codecs.RecordCodecBuilder;
5+
import net.minecraft.entity.LivingEntity;
56
import net.minecraft.item.ItemStack;
67
import net.minecraft.loot.condition.LootCondition;
78
import net.minecraft.loot.context.LootContext;
9+
import net.minecraft.loot.context.LootContextParameters;
810
import net.minecraft.loot.function.ConditionalLootFunction;
911
import net.minecraft.loot.function.LootFunctionType;
1012
import net.minecraft.loot.provider.number.ConstantLootNumberProvider;
@@ -30,7 +32,7 @@ public SplitItemModifier(List<LootCondition> conditions, LootNumberProvider coun
3032
}
3133

3234
public static Builder<?> builder(int count) {
33-
return builder(conditions -> new SplitItemModifier(ConstantLootNumberProvider.create(count)));
35+
return builder(conditions -> new SplitItemModifier(conditions, ConstantLootNumberProvider.create(count)));
3436
}
3537

3638
@Override
@@ -40,6 +42,7 @@ public LootFunctionType<SplitItemModifier> getType() {
4042

4143
@Override
4244
protected ItemStack process(ItemStack stack, LootContext context) {
43-
return stack.split(this.count.nextInt(context));
45+
LivingEntity holder = context.get(LootContextParameters.THIS_ENTITY) instanceof LivingEntity target ? target : null;
46+
return stack.itematic$copyOrSplit(holder, this.count.nextInt(context));
4447
}
4548
}

src/main/java/net/errorcraft/itematic/mixin/item/ItemStackExtender.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,9 @@ public abstract class ItemStackExtender implements ComponentHolder, ItemStackAcc
8888
@Shadow
8989
public abstract boolean isEmpty();
9090

91+
@Shadow
92+
public abstract ItemStack split(int amount);
93+
9194
@Shadow
9295
public abstract void damage(int amount, ServerWorld world, @Nullable ServerPlayerEntity player, Consumer<Item> breakCallback);
9396

@@ -103,6 +106,9 @@ public abstract class ItemStackExtender implements ComponentHolder, ItemStackAcc
103106
@Shadow
104107
public abstract int getMaxCount();
105108

109+
@Shadow
110+
public abstract ItemStack copyWithCount(int count);
111+
106112
@Shadow
107113
public abstract int getCount();
108114

@@ -707,6 +713,15 @@ public boolean canBeEnchantedWith(RegistryEntry<Enchantment> enchantment, Enchan
707713
return actualAmount;
708714
}
709715

716+
@Override
717+
public ItemStack itematic$copyOrSplit(@Nullable LivingEntity holder, int amount) {
718+
if (holder != null && holder.isInCreativeMode()) {
719+
return this.copyWithCount(amount);
720+
}
721+
722+
return this.split(amount);
723+
}
724+
710725
@Override
711726
public ItemStack itematic$copyWithItem(RegistryEntry<Item> item) {
712727
return this.itematic$copyComponentsToNewStack(item, this.count);

src/main/java/net/errorcraft/itematic/world/action/ActionTypeKeys.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ public class ActionTypeKeys {
2020
public static final RegistryKey<ActionType<?>> MODIFY_SIGN = of("modify_sign");
2121
public static final RegistryKey<ActionType<?>> WAX_BLOCK = of("wax_block");
2222
public static final RegistryKey<ActionType<?>> DECREMENT_ITEM = of("decrement_item");
23-
public static final RegistryKey<ActionType<?>> SET_ITEM_POINTER_LOCATION = of("set_item_pointer_location");
2423
public static final RegistryKey<ActionType<?>> LIGHT_END_PORTAL = of("light_end_portal");
2524
public static final RegistryKey<ActionType<?>> PLAY_SOUND = of("play_sound");
2625
public static final RegistryKey<ActionType<?>> DISPLAY_PARTICLE = of("display_particle");

src/main/java/net/errorcraft/itematic/world/action/ActionTypes.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ public class ActionTypes {
2121
public static final ActionType<ModifySignAction> MODIFY_SIGN = register(ActionTypeKeys.MODIFY_SIGN, new ActionType<>(ModifySignAction.CODEC));
2222
public static final ActionType<WaxBlockAction> WAX_BLOCK = register(ActionTypeKeys.WAX_BLOCK, new ActionType<>(WaxBlockAction.CODEC));
2323
public static final ActionType<DecrementItemAction> DECREMENT_ITEM = register(ActionTypeKeys.DECREMENT_ITEM, new ActionType<>(DecrementItemAction.CODEC));
24-
public static final ActionType<SetItemPointerLocationAction> SET_ITEM_POINTER_LOCATION = register(ActionTypeKeys.SET_ITEM_POINTER_LOCATION, new ActionType<>(SetItemPointerLocationAction.CODEC));
2524
public static final ActionType<LightEndPortalAction> LIGHT_END_PORTAL = register(ActionTypeKeys.LIGHT_END_PORTAL, new ActionType<>(LightEndPortalAction.CODEC));
2625
public static final ActionType<PlaySoundAction> PLAY_SOUND = register(ActionTypeKeys.PLAY_SOUND, new ActionType<>(PlaySoundAction.CODEC));
2726
public static final ActionType<DisplayParticleAction> DISPLAY_PARTICLE = register(ActionTypeKeys.DISPLAY_PARTICLE, new ActionType<>(DisplayParticleAction.CODEC));

src/main/java/net/errorcraft/itematic/world/action/actions/ModifyItemAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public ActionType<ModifyItemAction> type() {
4242

4343
@Override
4444
public boolean execute(ActionContext context) {
45-
ItemStack stack = this.stack.get(context);
45+
ItemStack stack = context.get(this.stack.parameter());
4646
if (ItemStackUtil.isNullOrEmpty(stack)) {
4747
return false;
4848
}

0 commit comments

Comments
 (0)