Skip to content

Commit 6283719

Browse files
committed
Add: Persona Weapon framework, and Persona Monosword.
Haven't tried datapack functionality yet, but it should work.
1 parent 88cd5dd commit 6283719

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+723
-213
lines changed

src/main/java/com/kd8lvt/exclusionzone/ExclusionZone.java

+18-4
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
package com.kd8lvt.exclusionzone;
22

3+
import com.kd8lvt.exclusionzone.init.Items.PersonaWeapons.PersonaWeaponTraits;
34
import com.kd8lvt.exclusionzone.init.ModBlocks;
45
import com.kd8lvt.exclusionzone.init.ModItems;
56
import com.kd8lvt.exclusionzone.init.ModPotions;
67
import com.kd8lvt.exclusionzone.init.ModSounds;
78
import net.fabricmc.api.ModInitializer;
89
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
10+
import net.fabricmc.fabric.api.resource.ResourceManagerHelper;
11+
import net.fabricmc.fabric.api.resource.SimpleSynchronousResourceReloadListener;
912
import net.minecraft.item.ItemGroup;
10-
import net.minecraft.registry.Registries;
11-
import net.minecraft.registry.Registry;
13+
import net.minecraft.resource.ResourceManager;
14+
import net.minecraft.resource.ResourceType;
1215
import net.minecraft.server.MinecraftServer;
13-
import net.minecraft.server.command.ScheduleCommand;
14-
import net.minecraft.text.Text;
1516
import net.minecraft.util.Identifier;
1617
import org.slf4j.Logger;
1718
import org.slf4j.LoggerFactory;
@@ -30,6 +31,7 @@ public class ExclusionZone implements ModInitializer {
3031
public static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
3132
public static MinecraftServer Server = null;
3233
public static ItemGroup ITEM_GROUP;
34+
public static final boolean muttering_debug = false;
3335

3436
@Override
3537
public void onInitialize() {
@@ -45,6 +47,18 @@ public void onInitialize() {
4547
ModItems.register();
4648
LOGGER.info("[ExclusionZone] Registering Potions...");
4749
ModPotions.register();
50+
51+
ResourceManagerHelper.get(ResourceType.SERVER_DATA).registerReloadListener(new SimpleSynchronousResourceReloadListener() {
52+
@Override
53+
public Identifier getFabricId() {
54+
return id("persona_weapon_traits");
55+
}
56+
57+
@Override
58+
public void reload(ResourceManager manager) {
59+
PersonaWeaponTraits.reload(manager);
60+
}
61+
});
4862
}
4963

5064
public static void runCommand(String cmd) {
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,30 @@
11
package com.kd8lvt.exclusionzone.init.Items;
22

3+
import net.minecraft.client.item.TooltipType;
34
import net.minecraft.item.Item;
5+
import net.minecraft.item.ItemStack;
6+
import net.minecraft.text.Style;
7+
import net.minecraft.text.Text;
8+
import net.minecraft.text.TextColor;
9+
10+
import java.util.ArrayList;
11+
import java.util.List;
412

513
public class Artifact extends Item {
14+
public List<Text> tt = new ArrayList<>();
615
public Artifact() {
716
super(new Settings());
17+
this.tt.addAll(Text.of("Research Notes:").getWithStyle(Style.EMPTY.withColor(TextColor.parse("gray").getOrThrow())));
18+
}
19+
20+
public Artifact(Item.Settings settings) {
21+
super(settings);
22+
this.tt.addAll(Text.of("Research Notes:").getWithStyle(Style.EMPTY.withColor(TextColor.parse("gray").getOrThrow())));
23+
}
24+
25+
@Override
26+
public void appendTooltip(ItemStack stack, TooltipContext context, List<Text> tooltip, TooltipType type) {
27+
tooltip.addAll(this.tt);
28+
super.appendTooltip(stack, context, tooltip, type);
829
}
930
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.kd8lvt.exclusionzone.init.Items;
2+
3+
import net.minecraft.block.Block;
4+
import net.minecraft.client.item.TooltipType;
5+
import net.minecraft.item.AliasedBlockItem;
6+
import net.minecraft.item.ItemStack;
7+
import net.minecraft.text.Text;
8+
9+
import java.util.ArrayList;
10+
import java.util.List;
11+
12+
public class BlockItemArtifact extends AliasedBlockItem {
13+
public List<Text> tt = new ArrayList<>();
14+
public BlockItemArtifact(Block block) {
15+
super(block,new Settings());
16+
}
17+
18+
@Override
19+
public void appendTooltip(ItemStack stack, TooltipContext context, List<Text> tooltip, TooltipType type) {
20+
tooltip.addAll(this.tt);
21+
super.appendTooltip(stack, context, tooltip, type);
22+
}
23+
}

src/main/java/com/kd8lvt/exclusionzone/init/Items/Dolls/BoyDoll.java

+6
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,15 @@
22

33
import com.kd8lvt.exclusionzone.init.Items.Doll;
44
import com.kd8lvt.exclusionzone.init.ModSounds;
5+
import net.minecraft.text.Style;
6+
import net.minecraft.text.Text;
7+
import net.minecraft.text.TextColor;
58

69
public class BoyDoll extends Doll {
710
public BoyDoll() {
811
super(ModSounds.DOLL_SQUEAK_EVENT,ModSounds.DOLL_CHICKEN_EVENT,0.2, "rubber chicken");
12+
this.tt.addAll(Text.of("Research Notes").getWithStyle(Style.EMPTY.withColor(TextColor.parse("gray").getOrThrow())));
13+
this.tt.addAll(Text.of("A discarded children's toy.").getWithStyle(Style.EMPTY.withColor(TextColor.parse("gray").getOrThrow())));
14+
this.tt.addAll(Text.of("Judging from the colors, this one appears to be a boy.").getWithStyle(Style.EMPTY.withColor(TextColor.parse("gray").getOrThrow())));
915
}
1016
}

src/main/java/com/kd8lvt/exclusionzone/init/Items/Dolls/GirlDoll.java

+7
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,16 @@
22

33
import com.kd8lvt.exclusionzone.init.Items.Doll;
44
import com.kd8lvt.exclusionzone.init.ModSounds;
5+
import net.minecraft.text.Style;
6+
import net.minecraft.text.Text;
7+
import net.minecraft.text.TextColor;
58

69
public class GirlDoll extends Doll {
710
public GirlDoll() {
811
super(ModSounds.DOLL_SQUEAK_EVENT,ModSounds.DOLL_CHICKEN_EVENT,0.2);
12+
this.tt.addAll(Text.of("Research Notes").getWithStyle(Style.EMPTY.withColor(TextColor.parse("gray").getOrThrow())));
13+
this.tt.addAll(Text.of("A discarded children's toy.").getWithStyle(Style.EMPTY.withColor(TextColor.parse("gray").getOrThrow())));
14+
this.tt.addAll(Text.of("Judging from the colors, this one appears to be a girl.").getWithStyle(Style.EMPTY.withColor(TextColor.parse("gray").getOrThrow())));
15+
916
}
1017
}

src/main/java/com/kd8lvt/exclusionzone/init/Items/Dolls/VillagerDoll.java

+7
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,16 @@
22

33
import com.kd8lvt.exclusionzone.init.Items.Doll;
44
import com.kd8lvt.exclusionzone.init.ModSounds;
5+
import net.minecraft.text.Style;
6+
import net.minecraft.text.Text;
7+
import net.minecraft.text.TextColor;
58

69
public class VillagerDoll extends Doll {
710
public VillagerDoll() {
811
super(ModSounds.DOLL_SQUEAK_EVENT,ModSounds.DOLL_CHICKEN_EVENT,0.2);
12+
this.tt.addAll(Text.of("Research Notes").getWithStyle(Style.EMPTY.withColor(TextColor.parse("gray").getOrThrow())));
13+
this.tt.addAll(Text.of("A discarded children's toy.").getWithStyle(Style.EMPTY.withColor(TextColor.parse("gray").getOrThrow())));
14+
this.tt.addAll(Text.of("This one has a suspiciously villager-like nose!.").getWithStyle(Style.EMPTY.withColor(TextColor.parse("gray").getOrThrow())));
15+
916
}
1017
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.kd8lvt.exclusionzone.init.Items.PersonaWeapons;
2+
3+
import net.minecraft.block.Block;
4+
import net.minecraft.item.Items;
5+
import net.minecraft.item.ToolMaterial;
6+
import net.minecraft.recipe.Ingredient;
7+
import net.minecraft.registry.tag.TagKey;
8+
9+
public class PersonaMonosword extends PersonaWeapon {
10+
public PersonaMonosword() {
11+
super(new PersonaMonoswordMaterial(), new Settings());
12+
}
13+
}
14+
15+
class PersonaMonoswordMaterial implements ToolMaterial {
16+
17+
@Override
18+
public int getDurability() {
19+
return 8192;
20+
}
21+
22+
@Override
23+
public float getMiningSpeedMultiplier() {
24+
return 0;
25+
}
26+
27+
@Override
28+
public float getAttackDamage() {
29+
return 8;
30+
}
31+
32+
@Override
33+
public TagKey<Block> getInverseTag() {
34+
return null;
35+
}
36+
37+
@Override
38+
public int getEnchantability() {
39+
return -1;
40+
}
41+
42+
@Override
43+
public Ingredient getRepairIngredient() {
44+
return Ingredient.ofItems(Items.REDSTONE);
45+
}
46+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
package com.kd8lvt.exclusionzone.init.Items.PersonaWeapons;
2+
3+
import com.kd8lvt.exclusionzone.ExclusionZone;
4+
import com.kd8lvt.exclusionzone.init.Items.PersonaWeapons.Traits.PTrait;
5+
import com.kd8lvt.exclusionzone.init.ModItems;
6+
import net.minecraft.block.BlockState;
7+
import net.minecraft.client.item.TooltipType;
8+
import net.minecraft.component.ComponentMap;
9+
import net.minecraft.component.DataComponentTypes;
10+
import net.minecraft.entity.Entity;
11+
import net.minecraft.entity.ItemEntity;
12+
import net.minecraft.entity.LivingEntity;
13+
import net.minecraft.entity.player.PlayerEntity;
14+
import net.minecraft.item.ItemStack;
15+
import net.minecraft.item.ItemUsageContext;
16+
import net.minecraft.item.SwordItem;
17+
import net.minecraft.item.ToolMaterial;
18+
import net.minecraft.text.Text;
19+
import net.minecraft.util.ActionResult;
20+
import net.minecraft.util.Hand;
21+
import net.minecraft.util.Identifier;
22+
import net.minecraft.util.math.BlockPos;
23+
import net.minecraft.util.math.Direction;
24+
import net.minecraft.util.math.random.Random;
25+
import net.minecraft.world.World;
26+
import org.jetbrains.annotations.Nullable;
27+
28+
import java.util.ArrayList;
29+
import java.util.List;
30+
import java.util.Objects;
31+
import java.util.function.Consumer;
32+
33+
public class PersonaWeapon extends SwordItem {
34+
boolean isHeld = false;
35+
@Nullable
36+
Integer prevDamage = this.getComponents().get(DataComponentTypes.DAMAGE);
37+
public PersonaWeapon(ToolMaterial toolMaterial, Settings settings) {
38+
super(toolMaterial, settings);
39+
}
40+
41+
public void generateTraits(ItemStack stack) {
42+
ComponentMap comps = stack.getComponents();
43+
Random random = Random.create();
44+
int traitsToGen = random.nextBetween(1,3);
45+
List<Identifier> comp = comps.get(ModItems.DATA_COMPONENT_PWEAPON_TRAITS);
46+
if (comp == null) comp = new ArrayList<>();
47+
for (int i=0;i<traitsToGen;i++) {
48+
comp.add(PersonaWeaponTraits.TRAITS.keySet().toArray(new Identifier[]{})[random.nextBetween(0,PersonaWeaponTraits.TRAITS.size()-1)]);
49+
}
50+
List<Identifier> finalComp = comp;
51+
stack.apply(ModItems.DATA_COMPONENT_PWEAPON_TRAITS,comp, edit-> finalComp);
52+
}
53+
54+
public static void applyTraits(ItemStack stack, Consumer<PTrait> consumer) {
55+
List<Identifier> traits = stack.getComponents().get(ModItems.DATA_COMPONENT_PWEAPON_TRAITS);
56+
if (traits == null) return;
57+
for (Identifier traitId : traits) {
58+
consumer.accept(PersonaWeaponTraits.TRAITS.get(traitId));
59+
}
60+
}
61+
62+
@Override
63+
public boolean postHit(ItemStack stack, LivingEntity target, LivingEntity attacker) {
64+
boolean shouldDamageItem = super.postHit(stack, target, attacker);
65+
applyTraits(stack, trait->{
66+
trait.onHit(stack,target,attacker);
67+
if (trait.functions.containsKey(PersonaWeaponFunctionEvents.OnHitAttacker)) {
68+
ExclusionZone.runCommand("execute as "+attacker.getUuid()+" at @s run function "+trait.functions.get(PersonaWeaponFunctionEvents.OnHitAttacker).toString());
69+
}
70+
if (trait.functions.containsKey(PersonaWeaponFunctionEvents.OnHitVictim)) {
71+
ExclusionZone.runCommand("execute as " + target.getUuid() + " at @s run function " + trait.functions.get(PersonaWeaponFunctionEvents.OnHitVictim).toString());
72+
}
73+
if (trait.functions.containsKey(PersonaWeaponFunctionEvents.OnEntityKilled) && target.getHealth() <= 0) {
74+
ExclusionZone.runCommand("execute as " + target.getUuid() + " at @s run function " + trait.functions.get(PersonaWeaponFunctionEvents.OnEntityKilled).toString());
75+
}
76+
if (trait.functions.containsKey(PersonaWeaponFunctionEvents.OnDurabilityLost) && shouldDamageItem) {
77+
ExclusionZone.runCommand("execute as " + attacker.getUuid() + " at @s run function " + trait.functions.get(PersonaWeaponFunctionEvents.OnDurabilityLost).toString());
78+
}
79+
});
80+
return shouldDamageItem;
81+
}
82+
83+
@Override
84+
public ActionResult useOnBlock(ItemUsageContext context) {
85+
ActionResult ar = super.useOnBlock(context);
86+
applyTraits(context.getStack(), trait->{
87+
trait.onUseOnBlock(context);
88+
if (trait.functions.containsKey(PersonaWeaponFunctionEvents.OnUseOnBlock)) {
89+
ExclusionZone.runCommand("execute positioned "+context.getBlockPos().getX()+" "+context.getBlockPos().getY()+" "+context.getBlockPos().getZ()+" as "+ Objects.requireNonNull(context.getPlayer()).getUuidAsString()+" run function "+trait.functions.get(PersonaWeaponFunctionEvents.OnUseOnBlock).toString());
90+
}
91+
});
92+
return ar;
93+
}
94+
95+
@Override
96+
public ActionResult useOnEntity(ItemStack stack, PlayerEntity user, LivingEntity entity, Hand hand) {
97+
ActionResult ar = super.useOnEntity(stack, user, entity, hand);
98+
applyTraits(stack, trait->{
99+
trait.onUseOnEntity(stack,user,entity,hand);
100+
if (trait.functions.containsKey(PersonaWeaponFunctionEvents.OnUseOnEntity)) {
101+
ExclusionZone.runCommand("execute as "+entity.getUuidAsString()+" at @s run function "+trait.functions.get(PersonaWeaponFunctionEvents.OnUseOnEntity).toString());
102+
}
103+
});
104+
return ar;
105+
}
106+
107+
@Override
108+
public void inventoryTick(ItemStack stack, World world, Entity entity, int slot, boolean selected) {
109+
super.inventoryTick(stack, world, entity, slot, selected);
110+
if (stack.getComponents().get(ModItems.DATA_COMPONENT_PWEAPON_TRAITS) == null) generateTraits(stack);
111+
applyTraits(stack, trait->{
112+
if (trait.functions.containsKey(PersonaWeaponFunctionEvents.OnInventoryTick)) {
113+
ExclusionZone.runCommand("execute as "+entity.getUuidAsString()+" at @s run function "+trait.functions.get(PersonaWeaponFunctionEvents.OnInventoryTick).toString());
114+
}
115+
116+
if (!this.isHeld && selected) trait.onHeld(stack,world,entity,slot);
117+
if (this.isHeld && !selected) trait.onUnHeld(stack,world,entity,slot);
118+
119+
if (trait.functions.containsKey(PersonaWeaponFunctionEvents.OnHeld)) {
120+
if (!this.isHeld && selected) {
121+
ExclusionZone.runCommand("execute as " + entity.getUuidAsString() + " at @s run function " + trait.functions.get(PersonaWeaponFunctionEvents.OnHeld).toString());
122+
this.isHeld = true;
123+
}
124+
}
125+
126+
if (trait.functions.containsKey(PersonaWeaponFunctionEvents.OnUnHeld)) {
127+
if (this.isHeld && !selected) {
128+
ExclusionZone.runCommand("execute as " + entity.getUuidAsString() + " at @s run function " + trait.functions.get(PersonaWeaponFunctionEvents.OnUnHeld).toString());
129+
this.isHeld = false;
130+
}
131+
}
132+
133+
if (trait.functions.containsKey(PersonaWeaponFunctionEvents.OnDurabilityLost) && !Objects.equals(this.prevDamage, this.getComponents().get(DataComponentTypes.DAMAGE))) {
134+
ExclusionZone.runCommand("execute as " + entity.getUuidAsString() + " at @s run function " + trait.functions.get(PersonaWeaponFunctionEvents.OnDurabilityLost).toString());
135+
}
136+
137+
trait.inventoryTick(stack,world,entity,slot,selected);
138+
139+
if (!Objects.equals(this.prevDamage, this.getComponents().get(DataComponentTypes.DAMAGE))) trait.onDurabilityLost(stack,world,entity,slot,selected);
140+
141+
});
142+
}
143+
144+
@Override
145+
public void appendTooltip(ItemStack stack, TooltipContext context, List<Text> tooltip, TooltipType type) {
146+
applyTraits(stack,trait->{
147+
if (!trait.tt.isEmpty()) {
148+
tooltip.addAll(trait.tt);
149+
}
150+
});
151+
super.appendTooltip(stack, context, tooltip, type);
152+
}
153+
154+
@Override
155+
public void onItemEntityDestroyed(ItemEntity entity) { //No despawning/dying for you!
156+
ItemEntity newEntity = entity.copy();
157+
newEntity.age = -(Integer.MAX_VALUE-1);
158+
newEntity.setNeverDespawn();
159+
entity.getEntityWorld().spawnEntity(newEntity);
160+
if (entity.getPos().y <= entity.getEntityWorld().getDimension().minY()) {
161+
float distFell = entity.fallDistance;
162+
World world = entity.getEntityWorld();
163+
BlockPos pos = entity.getBlockPos().offset(Direction.UP, (int) distFell);
164+
for (int x=-2;x<2;x++) {
165+
for (int y=2;y>-2;y--) {
166+
for (int z=-2;z<2;z++) {
167+
BlockPos tmpPos = pos.add(x,y,z);
168+
BlockState state = world.getBlockState(tmpPos);
169+
if (!state.getCollisionShape(world,tmpPos).isEmpty()) {
170+
newEntity.teleport(tmpPos.getX(), tmpPos.getY(), tmpPos.getZ());
171+
break;
172+
}
173+
}
174+
}
175+
}
176+
}
177+
super.onItemEntityDestroyed(entity);
178+
}
179+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.kd8lvt.exclusionzone.init.Items.PersonaWeapons;
2+
3+
public enum PersonaWeaponFunctionEvents {
4+
OnUnHeld,
5+
OnHeld,
6+
OnHitAttacker,
7+
OnHitVictim,
8+
OnUseOnBlock,
9+
OnUseOnEntity,
10+
OnDurabilityLost,
11+
OnEntityKilled,
12+
OnInventoryTick
13+
}

0 commit comments

Comments
 (0)