-
Notifications
You must be signed in to change notification settings - Fork 754
/
ToolActionWalkerTransformModule.java
123 lines (108 loc) · 5.78 KB
/
ToolActionWalkerTransformModule.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
package slimeknights.tconstruct.library.modifiers.modules.armor;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import net.minecraft.core.BlockPos;
import net.minecraft.core.BlockPos.MutableBlockPos;
import net.minecraft.core.Direction;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.sounds.SoundSource;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.material.Material;
import net.minecraftforge.common.ToolAction;
import slimeknights.mantle.data.loadable.Loadables;
import slimeknights.mantle.data.loadable.record.RecordLoadable;
import slimeknights.tconstruct.library.json.LevelingValue;
import slimeknights.tconstruct.library.modifiers.ModifierEntry;
import slimeknights.tconstruct.library.modifiers.ModifierHooks;
import slimeknights.tconstruct.library.modifiers.hook.behavior.ToolActionModifierHook;
import slimeknights.tconstruct.library.modifiers.modules.ModifierModule;
import slimeknights.tconstruct.library.modifiers.modules.util.ModifierCondition;
import slimeknights.tconstruct.library.modifiers.modules.util.ModifierCondition.ConditionalModule;
import slimeknights.tconstruct.library.modifiers.modules.util.ModuleBuilder;
import slimeknights.tconstruct.library.module.HookProvider;
import slimeknights.tconstruct.library.module.ModuleHook;
import slimeknights.tconstruct.library.tools.helper.ToolDamageUtil;
import slimeknights.tconstruct.library.tools.nbt.IToolStackView;
import slimeknights.tconstruct.library.utils.MutableUseOnContext;
import slimeknights.tconstruct.library.utils.Util;
import slimeknights.tconstruct.tools.TinkerModifiers;
import java.util.List;
/**
* Boot module that transforms walked on blocks using a tool action
* @param action Transforming action
* @param sound Sound to play when transforming
* @param radius Radius to cover
* @param condition Standard module condition
*/
public record ToolActionWalkerTransformModule(ToolAction action, SoundEvent sound, LevelingValue radius, ModifierCondition<IToolStackView> condition) implements ModifierModule, ArmorWalkRadiusModule<MutableUseOnContext>, ToolActionModifierHook, ConditionalModule<IToolStackView> {
private static final List<ModuleHook<?>> DEFAULT_HOOKS = HookProvider.<ToolActionWalkerTransformModule>defaultHooks(ModifierHooks.BOOT_WALK, ModifierHooks.TOOL_ACTION);
public static final RecordLoadable<ToolActionWalkerTransformModule> LOADER = RecordLoadable.create(
Loadables.TOOL_ACTION.requiredField("tool_action", ToolActionWalkerTransformModule::action),
Loadables.SOUND_EVENT.requiredField("sound", ToolActionWalkerTransformModule::sound),
LevelingValue.LOADABLE.requiredField("radius", ToolActionWalkerTransformModule::radius),
ModifierCondition.TOOL_FIELD,
ToolActionWalkerTransformModule::new);
@Override
public List<ModuleHook<?>> getDefaultHooks() {
return DEFAULT_HOOKS;
}
@Override
public float getRadius(IToolStackView tool, ModifierEntry modifier) {
return radius.compute(modifier.getLevel() + tool.getModifierLevel(TinkerModifiers.expanded.getId()));
}
@Override
public boolean canPerformAction(IToolStackView tool, ModifierEntry modifier, ToolAction toolAction) {
return condition.matches(tool, modifier) && toolAction == this.action;
}
@Override
public void onWalk(IToolStackView tool, ModifierEntry modifier, LivingEntity living, BlockPos prevPos, BlockPos newPos) {
if (condition.matches(tool, modifier)) {
ArmorWalkRadiusModule.super.onWalk(tool, modifier, living, prevPos, newPos);
}
}
@Override
public MutableUseOnContext getContext(IToolStackView tool, ModifierEntry modifier, LivingEntity living, BlockPos prevPos, BlockPos newPos) {
return new MutableUseOnContext(living.getLevel(), living instanceof Player p ? p : null, InteractionHand.MAIN_HAND, living.getItemBySlot(EquipmentSlot.FEET), Util.createTraceResult(newPos, Direction.UP, false));
}
@Override
public void walkOn(IToolStackView tool, ModifierEntry entry, LivingEntity living, Level world, BlockPos target, MutableBlockPos mutable, MutableUseOnContext context) {
Material material = world.getBlockState(target).getMaterial();
if (material.isReplaceable() || material == Material.PLANT) {
mutable.set(target.getX(), target.getY() - 1, target.getZ());
context.setOffsetPos(mutable);
// transform the block
BlockState original = world.getBlockState(mutable);
BlockState transformed = original.getToolModifiedState(context, action, false);
if (transformed != null) {
world.setBlock(mutable, transformed, Block.UPDATE_ALL_IMMEDIATE);
world.destroyBlock(target, true);
world.playSound(null, mutable, sound, SoundSource.BLOCKS, 1.0F, 1.0F);
ToolDamageUtil.damageAnimated(tool, 1, living, EquipmentSlot.FEET);
}
}
}
@Override
public RecordLoadable<ToolActionWalkerTransformModule> getLoader() {
return LOADER;
}
/* Builder */
/** Creates a builder instance */
public static Builder builder(ToolAction action, SoundEvent sound) {
return new Builder(action, sound);
}
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public static class Builder extends ModuleBuilder.Stack<Builder> implements LevelingValue.Builder<ToolActionWalkerTransformModule> {
private final ToolAction action;
private final SoundEvent sound;
@Override
public ToolActionWalkerTransformModule amount(float flat, float eachLevel) {
return new ToolActionWalkerTransformModule(action, sound, new LevelingValue(flat, eachLevel), condition);
}
}
}