Skip to content

Commit 6ad7ca6

Browse files
committed
better velocity calculation for kinetic damage
1 parent 44003b7 commit 6ad7ca6

File tree

5 files changed

+53
-8
lines changed

5 files changed

+53
-8
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package galena.oreganized.mixin;
2+
3+
import galena.oreganized.world.IMotionHolder;
4+
import net.minecraft.world.entity.Entity;
5+
import org.spongepowered.asm.mixin.Mixin;
6+
import org.spongepowered.asm.mixin.Unique;
7+
import org.spongepowered.asm.mixin.injection.At;
8+
import org.spongepowered.asm.mixin.injection.Inject;
9+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
10+
11+
@Mixin(Entity.class)
12+
public class EntityMixin implements IMotionHolder {
13+
14+
@Unique
15+
private double oreganized$Motion = 0.0;
16+
17+
@Inject(
18+
method = "setOldPosAndRot",
19+
at = @At("HEAD")
20+
)
21+
private void updateMotion(CallbackInfo ci) {
22+
var self = (Entity) (Object) this;
23+
var deltaX = self.getX() - self.xOld;
24+
var deltaZ = self.getZ() - self.zOld;
25+
oreganized$Motion = deltaX * deltaX + deltaZ * deltaZ;
26+
}
27+
28+
@Override
29+
public double oreganised$getMotion() {
30+
return oreganized$Motion;
31+
}
32+
}

src/main/java/galena/oreganized/network/packet/KineticHitPacket.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,11 @@
77

88
import java.util.function.Supplier;
99

10-
public record KineticHitPacket(int target) {
10+
public record KineticHitPacket(int target, double factor) {
1111

1212
public void write(FriendlyByteBuf buffer) {
1313
buffer.writeInt(target);
14+
buffer.writeDouble(factor);
1415
}
1516

1617
public void handle(Supplier<NetworkEvent.Context> contextSupplier) {
@@ -22,15 +23,16 @@ public void handle(Supplier<NetworkEvent.Context> contextSupplier) {
2223
var target = level.getEntity(target());
2324
if (target == null) return;
2425

25-
KineticDamage.spawnParticles(target);
26+
KineticDamage.spawnParticles(target, factor);
2627
});
2728

2829
context.setPacketHandled(true);
2930
}
3031

3132
public static KineticHitPacket from(FriendlyByteBuf buffer) {
3233
var target = buffer.readInt();
33-
return new KineticHitPacket(target);
34+
var factor = buffer.readDouble();
35+
return new KineticHitPacket(target, factor);
3436
}
3537

3638
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package galena.oreganized.world;
2+
3+
public interface IMotionHolder {
4+
5+
double oreganised$getMotion();
6+
7+
}

src/main/java/galena/oreganized/world/KineticDamage.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,12 @@ public static void apply(LivingEntity cause, Entity target) {
1919
var mods = stack.getAttributeModifiers(EquipmentSlot.MAINHAND).get(OAttributes.KINETIC_DAMAGE.get());
2020

2121
if (mods.isEmpty()) return;
22+
if (!(cause instanceof IMotionHolder motionHolder)) return;
2223

23-
var factor = Math.min(cause.getDeltaMovement().horizontalDistance() / 0.046F, 1F);
24+
var motion = Math.sqrt(motionHolder.oreganised$getMotion()) - 0.1;
25+
26+
var factor = Math.min(motion / 0.2, 1F);
27+
if (factor <= 0.0) return;
2428

2529
// ignores modifier operation, since only addition is used by oreganized this works, but may be adapted in the future
2630
var kineticDamage = factor * mods.stream().mapToDouble(AttributeModifier::getAmount).sum();
@@ -32,13 +36,13 @@ public static void apply(LivingEntity cause, Entity target) {
3236
target.hurt(source, (float) kineticDamage);
3337
OreganizedNetwork.CHANNEL.send(
3438
PacketDistributor.NEAR.with(PacketDistributor.TargetPoint.p(target.getX(), target.getY(), target.getZ(), 16.0, target.level().dimension())),
35-
new KineticHitPacket(target.getId())
39+
new KineticHitPacket(target.getId(), factor)
3640
);
3741
}
3842

39-
public static void spawnParticles(Entity target) {
43+
public static void spawnParticles(Entity target, double factor) {
4044
var level = target.level();
41-
var count = 3 + level.random.nextInt(2) + level.random.nextInt(2);
45+
var count = (int) (2 + Math.floor(6 * factor));
4246

4347
for (int i = 0; i < count; i++) {
4448
level.addParticle(

src/main/resources/oreganized.mixins.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"package": "galena.oreganized.mixin",
55
"compatibilityLevel": "JAVA_17",
66
"mixins": [
7-
"AbstractArrowMixin", "BlockMixin", "CrossbowMixin", "DispenserBlockMixin", "EnchantmentHelperMixin",
7+
"AbstractArrowMixin", "BlockMixin", "CrossbowMixin", "DispenserBlockMixin", "EnchantmentHelperMixin", "EntityMixin",
88
"FoodDataMixin", "IceBlockMixin", "MobEffectInstanceMixin", "PillagerMixin", "PlayerMixin"
99
],
1010
"client": [

0 commit comments

Comments
 (0)