Skip to content

Commit d157e2a

Browse files
committed
Implement Staff enchantments and enchantment target.
1 parent 509922f commit d157e2a

24 files changed

+386
-48
lines changed

build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ dependencies {
4747

4848
// Fabric API. This is technically optional, but you probably want it anyway.
4949
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
50+
51+
modImplementation "com.github.Chocohead:Fabric-ASM:${project.fabric_asm_version}"
52+
include "com.github.Chocohead:Fabric-ASM:${project.fabric_asm_version}"
5053

5154
modImplementation "com.github.Provismet:combatplus-core:${project.combatplus_version}"
5255
}

gradle.properties

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,5 @@ modid=additional-armoury
1616

1717
#Fabric api
1818
fabric_version=0.91.0+1.20.1
19-
combatplus_version=0.2.0-mc1.20.1
19+
fabric_asm_version=v2.3
20+
combatplus_version=0.3.0-mc1.20.1

src/main/generated/assets/additional-armoury/lang/en_us.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
{
22
"enchantment.additional-armoury.boost": "Boosting",
3+
"enchantment.additional-armoury.eruption": "Eruption",
4+
"enchantment.additional-armoury.fireball": "Fireball",
5+
"enchantment.additional-armoury.jump": "Soaring",
36
"item.additional-armoury.diamond_dagger": "Diamond Dagger",
47
"item.additional-armoury.diamond_dagger.effect.awkward": "Diamond Dagger",
58
"item.additional-armoury.diamond_dagger.effect.fire_resistance": "Fire Resistance-Tipped Diamond Dagger",

src/main/java/com/provismet/AdditionalArmoury/AdditionalArmouryClient.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.provismet.AdditionalArmoury;
22

3+
import com.provismet.AdditionalArmoury.registries.AAParticleFactories;
34
import com.provismet.AdditionalArmoury.registries.ColourRegistry;
45

56
import net.fabricmc.api.ClientModInitializer;
@@ -8,5 +9,6 @@ public class AdditionalArmouryClient implements ClientModInitializer {
89
@Override
910
public void onInitializeClient () {
1011
ColourRegistry.register();
12+
AAParticleFactories.register();
1113
}
1214
}

src/main/java/com/provismet/AdditionalArmoury/AdditionalArmouryMain.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.provismet.AdditionalArmoury.registries.AAEnchantments;
77
import com.provismet.AdditionalArmoury.registries.AAItemGroups;
88
import com.provismet.AdditionalArmoury.registries.AAItems;
9+
import com.provismet.AdditionalArmoury.registries.AAParticleTypes;
910
import com.provismet.AdditionalArmoury.registries.AARecipeSerializers;
1011

1112
import net.fabricmc.api.ModInitializer;
@@ -25,5 +26,6 @@ public void onInitialize () {
2526
AAEnchantments.register();
2627
AAItemGroups.register();
2728
AARecipeSerializers.register();
29+
AAParticleTypes.register();
2830
}
2931
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.provismet.AdditionalArmoury.asm;
2+
3+
import com.chocohead.mm.api.ClassTinkerers;
4+
5+
import net.fabricmc.loader.api.FabricLoader;
6+
import net.fabricmc.loader.api.MappingResolver;
7+
8+
public class EarlyRiser implements Runnable {
9+
@Override
10+
public void run () {
11+
MappingResolver remapper = FabricLoader.getInstance().getMappingResolver();
12+
String enchantmentTarget = remapper.mapClassName("intermediary", "net.minecraft.class_1886");
13+
ClassTinkerers.enumBuilder(enchantmentTarget)
14+
.addEnumSubclass("ADDITIONALARMOURY$STAFF", "com.provismet.AdditionalArmoury.asm.StaffEnchantmentTarget")
15+
.build();
16+
}
17+
18+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.provismet.AdditionalArmoury.asm;
2+
3+
import org.spongepowered.asm.mixin.Mixin;
4+
import org.spongepowered.asm.mixin.Shadow;
5+
6+
import com.provismet.AdditionalArmoury.items.StaffItem;
7+
8+
import net.minecraft.enchantment.EnchantmentTarget;
9+
import net.minecraft.item.Item;
10+
11+
public class StaffEnchantmentTarget extends StaffEnchantmentTargetMixin {
12+
@Override
13+
public boolean isAcceptableItem (Item item) {
14+
return item instanceof StaffItem;
15+
}
16+
}
17+
18+
@Mixin(EnchantmentTarget.class)
19+
abstract class StaffEnchantmentTargetMixin {
20+
@Shadow
21+
abstract boolean isAcceptableItem (Item item);
22+
}

src/main/java/com/provismet/AdditionalArmoury/enchantments/staff/BoostEnchantment.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@ public BoostEnchantment () {
1010
}
1111

1212
@Override
13-
public void castSpell (ItemStack stack, LivingEntity user) {
13+
public boolean castSpell (ItemStack stack, LivingEntity user) {
1414
double dx = -MathHelper.sin(user.getHeadYaw() / MathHelper.DEGREES_PER_RADIAN);
1515
double dz = MathHelper.cos(user.getHeadYaw() / MathHelper.DEGREES_PER_RADIAN);
1616

17-
user.addVelocity(dx, 0.25, dz);
17+
user.addVelocity(dx, 0.35, dz);
18+
return true;
1819
}
19-
2020
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.provismet.AdditionalArmoury.enchantments.staff;
2+
3+
import java.util.List;
4+
5+
import com.provismet.AdditionalArmoury.AdditionalArmouryMain;
6+
7+
import net.minecraft.entity.Entity;
8+
import net.minecraft.entity.LivingEntity;
9+
import net.minecraft.item.ItemStack;
10+
11+
public class EruptionEnchantment extends StaffEnchantment {
12+
public EruptionEnchantment () {
13+
super(Rarity.UNCOMMON, 0x8E6345, 64, 40);
14+
}
15+
16+
@Override
17+
public boolean castSpell (ItemStack stack, LivingEntity user) {
18+
List<Entity> others = user.getWorld().getOtherEntities(user, user.getBoundingBox().expand(5, 0, 5));
19+
for (Entity otherEntity : others) {
20+
if (otherEntity instanceof LivingEntity) otherEntity.addVelocity(0, 1, 0);
21+
AdditionalArmouryMain.LOGGER.info("Found other entity.");
22+
}
23+
return true;
24+
}
25+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.provismet.AdditionalArmoury.enchantments.staff;
2+
3+
import net.minecraft.entity.LivingEntity;
4+
import net.minecraft.entity.projectile.SmallFireballEntity;
5+
import net.minecraft.item.ItemStack;
6+
import net.minecraft.server.world.ServerWorld;
7+
import net.minecraft.util.math.MathHelper;
8+
9+
public class FireballEnchantment extends StaffEnchantment {
10+
public FireballEnchantment () {
11+
super(Rarity.COMMON, 0xB71F26, 64, 30);
12+
}
13+
14+
@Override
15+
public boolean castSpell (ItemStack stack, LivingEntity user) {
16+
if (user.getWorld() instanceof ServerWorld serverWorld) {
17+
double dx = -MathHelper.sin(user.getHeadYaw() / MathHelper.DEGREES_PER_RADIAN);
18+
double dy = -MathHelper.sin(user.getPitch() / MathHelper.DEGREES_PER_RADIAN);
19+
double dz = MathHelper.cos(user.getHeadYaw() / MathHelper.DEGREES_PER_RADIAN);
20+
21+
SmallFireballEntity fireball = new SmallFireballEntity(serverWorld, user, dx, dy, dz);
22+
fireball.setPosition(fireball.getX(), user.getEyeY(), fireball.getZ());
23+
serverWorld.spawnEntity(fireball);
24+
}
25+
return true;
26+
}
27+
28+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.provismet.AdditionalArmoury.enchantments.staff;
2+
3+
import net.minecraft.entity.LivingEntity;
4+
import net.minecraft.entity.effect.StatusEffectInstance;
5+
import net.minecraft.entity.effect.StatusEffects;
6+
import net.minecraft.item.ItemStack;
7+
import net.minecraft.util.math.Vec3d;
8+
9+
public class JumpEnchantment extends StaffEnchantment {
10+
public JumpEnchantment () {
11+
super(Rarity.COMMON, 0x87868C, 64, 30);
12+
}
13+
14+
@Override
15+
public boolean castSpell (ItemStack stack, LivingEntity user) {
16+
user.addStatusEffect(new StatusEffectInstance(StatusEffects.SLOW_FALLING, 40));
17+
18+
Vec3d velocity = user.getVelocity();
19+
user.setVelocity(velocity.x, 1, velocity.z);
20+
return true;
21+
}
22+
23+
}

src/main/java/com/provismet/AdditionalArmoury/enchantments/staff/PushBackEnchantment.java

Lines changed: 0 additions & 18 deletions
This file was deleted.
Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
package com.provismet.AdditionalArmoury.enchantments.staff;
22

3-
import com.provismet.AdditionalArmoury.items.StaffItem;
3+
import com.provismet.AdditionalArmoury.registries.AAEnchantmentTargets;
44

55
import net.minecraft.enchantment.Enchantment;
6-
import net.minecraft.enchantment.EnchantmentTarget;
7-
import net.minecraft.enchantment.MendingEnchantment;
8-
import net.minecraft.enchantment.UnbreakingEnchantment;
96
import net.minecraft.entity.EquipmentSlot;
107
import net.minecraft.entity.LivingEntity;
118
import net.minecraft.item.ItemStack;
@@ -16,24 +13,26 @@ public abstract class StaffEnchantment extends Enchantment {
1613
public final int chargeTime;
1714

1815
protected StaffEnchantment (Rarity weight, int colour, int maxUses, int chargeTime) {
19-
super(weight, EnchantmentTarget.WEAPON, new EquipmentSlot[] {EquipmentSlot.MAINHAND});
16+
super(weight, AAEnchantmentTargets.STAFF, new EquipmentSlot[] {EquipmentSlot.MAINHAND});
2017
this.colour = colour;
2118
this.maxUses = maxUses;
2219
this.chargeTime = chargeTime;
2320
}
2421

2522
@Override
26-
protected boolean canAccept (Enchantment other) {
27-
return super.canAccept(other) &&
28-
!(other instanceof MendingEnchantment) &&
29-
!(other instanceof UnbreakingEnchantment) &&
30-
!(other instanceof StaffEnchantment);
23+
public int getMinPower (int level) {
24+
return 1;
25+
}
26+
27+
@Override
28+
public int getMaxPower (int level) {
29+
return 50;
3130
}
32-
31+
3332
@Override
34-
public boolean isAcceptableItem (ItemStack stack) {
35-
return stack.getItem() instanceof StaffItem;
33+
protected boolean canAccept (Enchantment other) {
34+
return super.canAccept(other) && !(other instanceof StaffEnchantment);
3635
}
3736

38-
public abstract void castSpell (ItemStack stack, LivingEntity user);
37+
public abstract boolean castSpell (ItemStack stack, LivingEntity user);
3938
}

src/main/java/com/provismet/AdditionalArmoury/items/StaffItem.java

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.jetbrains.annotations.Nullable;
88

99
import com.provismet.AdditionalArmoury.enchantments.staff.StaffEnchantment;
10+
import com.provismet.AdditionalArmoury.particles.effects.SpellChargeParticleEffect;
1011

1112
import net.minecraft.enchantment.Enchantment;
1213
import net.minecraft.enchantment.EnchantmentHelper;
@@ -20,6 +21,7 @@
2021
import net.minecraft.util.TypedActionResult;
2122
import net.minecraft.util.UseAction;
2223
import net.minecraft.util.math.ColorHelper;
24+
import net.minecraft.util.math.Vec3d;
2325
import net.minecraft.world.World;
2426

2527
public class StaffItem extends Item implements Vanishable {
@@ -79,6 +81,16 @@ public TypedActionResult<ItemStack> use (World world, PlayerEntity user, Hand ha
7981
}
8082
}
8183

84+
@Override
85+
public void usageTick (World world, LivingEntity user, ItemStack stack, int remainingUseTicks) {
86+
if (world.isClient()) {
87+
StaffEnchantment enchantment = StaffItem.getFirstStaffEnchantment(stack);
88+
89+
if (enchantment != null)
90+
world.addParticle(new SpellChargeParticleEffect(Vec3d.unpackRgb(enchantment.colour).toVector3f(), 0.1f), user.getX(), user.getY(), user.getZ(), 0, 0, 0);
91+
}
92+
}
93+
8294
@Override
8395
public UseAction getUseAction (ItemStack stack) {
8496
if (StaffItem.getFirstStaffEnchantment(stack) == null) return super.getUseAction(stack);
@@ -102,6 +114,11 @@ public int getEnchantability () {
102114
return 1;
103115
}
104116

117+
@Override
118+
public boolean isEnchantable (ItemStack stack) {
119+
return true;
120+
}
121+
105122
@Override
106123
public boolean isItemBarVisible (ItemStack stack) {
107124
return this.getMaxUseCount(stack) > 0;
@@ -127,23 +144,25 @@ public int getItemBarColor (ItemStack stack) {
127144
else progress = uses / maxUses;
128145

129146
return ColorHelper.Argb.lerp(progress, 0xFF3251FF, 0xFFB2BDFF);
130-
//return MathHelper.hsvToRgb(0.9059f, MathHelper.lerp(progress, 0.8f, 0.3f), 1f);
131147
}
132148

133149
@Override
134150
public ItemStack finishUsing (ItemStack stack, World world, LivingEntity user) {
135151
List<StaffEnchantment> enchantments = StaffItem.getStaffEnchantments(stack);
152+
boolean wasUsed = false;
136153

137154
if (enchantments.size() > 0) {
138-
enchantments.forEach(enchant -> {
139-
enchant.castSpell(stack, user);
140-
});
141-
142-
this.setMaxUseCount(stack, enchantments.get(0).maxUses);
143-
this.incrementUseCount(stack);
155+
for (StaffEnchantment enchant : enchantments) {
156+
if (enchant.castSpell(stack, user)) wasUsed = true;
157+
}
158+
159+
if (wasUsed && user instanceof PlayerEntity player && !player.isCreative()) {
160+
this.setMaxUseCount(stack, enchantments.get(0).maxUses);
161+
this.incrementUseCount(stack);
162+
}
144163
}
145164

146-
if (user instanceof PlayerEntity player) {
165+
if (wasUsed && user instanceof PlayerEntity player) {
147166
player.getItemCooldownManager().set(this, 10);
148167
}
149168
return stack;

0 commit comments

Comments
 (0)