From 47f63c6b2e5222e1221a26ceb1cfff1f6b164cbd Mon Sep 17 00:00:00 2001 From: Minh Date: Tue, 2 Jan 2024 01:04:54 +0700 Subject: [PATCH 1/9] Fabric's Projectile Events + TestSkill --- .gitignore | 1 + .../manascore/api/skill/ManasSkill.java | 8 +- .../api/skill/ManasSkillInstance.java | 4 +- .../api/world/entity/EntityEvents.java | 2 +- .../manascore/skill/SkillRegistry.java | 2 +- .../manascore/skill/SkillStorage.java | 6 +- .../testmod/client/KeybindingTest.java | 6 + .../testmod/registry/RegisterTest.java | 4 + .../manasmods/testmod/registry/TestSkill.java | 117 ++++++++++++++++++ .../testmod/storage/StorageTest.java | 10 ++ .../fabric/core/MixinAbstractArrow.java | 4 +- .../core/MixinAbstractHurtingProjectile.java | 23 ++++ .../fabric/core/MixinFireRocketEntity.java | 23 ++++ .../fabric/core/MixinFishingHook.java | 23 ++++ .../manascore/fabric/core/MixinLlamaSpit.java | 23 ++++ .../fabric/core/MixinShulkerBullet.java | 23 ++++ .../fabric/core/MixinThrowableProjectile.java | 23 ++++ .../src/main/resources/manascore.mixins.json | 8 +- .../forge/ForgeCommonEventInvoker.java | 4 +- 19 files changed, 300 insertions(+), 14 deletions(-) create mode 100644 commonTest/src/main/java/com/github/manasmods/testmod/registry/TestSkill.java create mode 100644 fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinAbstractHurtingProjectile.java create mode 100644 fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinFireRocketEntity.java create mode 100644 fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinFishingHook.java create mode 100644 fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinLlamaSpit.java create mode 100644 fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinShulkerBullet.java create mode 100644 fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinThrowableProjectile.java diff --git a/.gitignore b/.gitignore index e06c873e..e38f825f 100644 --- a/.gitignore +++ b/.gitignore @@ -113,6 +113,7 @@ gradle-app.setting # Common working directory run/ +runServer/ # Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) !gradle-wrapper.jar diff --git a/common/src/main/java/com/github/manasmods/manascore/api/skill/ManasSkill.java b/common/src/main/java/com/github/manasmods/manascore/api/skill/ManasSkill.java index b88ac866..220ba5c4 100644 --- a/common/src/main/java/com/github/manasmods/manascore/api/skill/ManasSkill.java +++ b/common/src/main/java/com/github/manasmods/manascore/api/skill/ManasSkill.java @@ -153,7 +153,7 @@ public boolean isMastered(ManasSkillInstance instance, LivingEntity entity) { public void addMasteryPoint(ManasSkillInstance instance, LivingEntity entity) { if (isMastered(instance, entity)) return; instance.setMastery(instance.getMastery() + 1); - if (isMastered(instance, entity)) onSkillMastered(instance, entity); + if (isMastered(instance, entity)) instance.onSkillMastered(entity); } /** @@ -251,9 +251,9 @@ public void onRightClickBlock(ManasSkillInstance instance, Player player, Intera /** * Called when the {@link LivingEntity} owning this Skill starts to be targeted by a mob. * - * @see ManasSkillInstance#onBeingTargeted(Changeable) + * @see ManasSkillInstance#onBeingTargeted(LivingEntity, Changeable) */ - public boolean onBeingTargeted(ManasSkillInstance instance, Changeable target) { + public boolean onBeingTargeted(ManasSkillInstance instance, LivingEntity owner, Changeable target) { return true; } @@ -280,7 +280,7 @@ public boolean onDamageEntity(ManasSkillInstance instance, LivingEntity owner, D * * @see ManasSkillInstance#onTouchEntity(LivingEntity, DamageSource, Changeable) */ - public boolean onTouchEntity(ManasSkillInstance instance, LivingEntity entity, DamageSource source, Changeable amount) { + public boolean onTouchEntity(ManasSkillInstance instance, LivingEntity owner, DamageSource source, Changeable amount) { return true; } diff --git a/common/src/main/java/com/github/manasmods/manascore/api/skill/ManasSkillInstance.java b/common/src/main/java/com/github/manasmods/manascore/api/skill/ManasSkillInstance.java index c81c562e..12f2c439 100644 --- a/common/src/main/java/com/github/manasmods/manascore/api/skill/ManasSkillInstance.java +++ b/common/src/main/java/com/github/manasmods/manascore/api/skill/ManasSkillInstance.java @@ -450,8 +450,8 @@ public void onRightClickBlock(Player player, InteractionHand hand, BlockPos pos, * * @return false will stop the mob from targeting the owner. */ - public boolean onBeingTargeted(Changeable target) { - return this.getSkill().onBeingTargeted(this, target); + public boolean onBeingTargeted(LivingEntity owner, Changeable target) { + return this.getSkill().onBeingTargeted(this, owner, target); } /** diff --git a/common/src/main/java/com/github/manasmods/manascore/api/world/entity/EntityEvents.java b/common/src/main/java/com/github/manasmods/manascore/api/world/entity/EntityEvents.java index 8189d980..0200266d 100644 --- a/common/src/main/java/com/github/manasmods/manascore/api/world/entity/EntityEvents.java +++ b/common/src/main/java/com/github/manasmods/manascore/api/world/entity/EntityEvents.java @@ -50,7 +50,7 @@ interface ProjectileHitEvent { } enum ProjectileHitResult { - DEFUALT, // Hit, damage + possibly continue + DEFAULT, // Hit, damage + possibly continue HIT, // Hit + damage HIT_NO_DAMAGE, // Hit PASS // Pass through diff --git a/common/src/main/java/com/github/manasmods/manascore/skill/SkillRegistry.java b/common/src/main/java/com/github/manasmods/manascore/skill/SkillRegistry.java index f538ff9a..bc3f7f6b 100644 --- a/common/src/main/java/com/github/manasmods/manascore/skill/SkillRegistry.java +++ b/common/src/main/java/com/github/manasmods/manascore/skill/SkillRegistry.java @@ -40,7 +40,7 @@ public static void init() { for (ManasSkillInstance instance : SkillAPI.getSkillsFrom(changeableTarget.get()).getLearnedSkills()) { if (!instance.canInteractSkill(entity)) continue; - if (!instance.onBeingTargeted(changeableTarget)) return EventResult.interruptFalse(); + if (!instance.onBeingTargeted(entity, changeableTarget)) return EventResult.interruptFalse(); } return EventResult.pass(); diff --git a/common/src/main/java/com/github/manasmods/manascore/skill/SkillStorage.java b/common/src/main/java/com/github/manasmods/manascore/skill/SkillStorage.java index 0664633e..d89b23bb 100644 --- a/common/src/main/java/com/github/manasmods/manascore/skill/SkillStorage.java +++ b/common/src/main/java/com/github/manasmods/manascore/skill/SkillStorage.java @@ -45,7 +45,10 @@ public static void init() { EntityEvents.LIVING_POST_TICK.register(entity -> { Level level = entity.level(); if (level.isClientSide()) return; + SkillStorage storage = SkillAPI.getSkillsFrom(entity); + if (storage == null) return; + handleSkillTick(entity, level, storage); if (entity instanceof Player player) handleSkillHeldTick(player, level, storage); storage.markDirty(); @@ -54,6 +57,7 @@ public static void init() { private static void handleSkillTick(LivingEntity entity, Level level, SkillStorage storage) { MinecraftServer server = level.getServer(); + if (server == null) return; boolean shouldPassiveConsume = server.getTickCount() % INSTANCE_UPDATE == 0; if (!shouldPassiveConsume) return; @@ -65,7 +69,7 @@ private static void handleSkillTick(LivingEntity entity, Level level, SkillStora // Update temporary skill timer if (!instance.isTemporarySkill()) continue; instance.decreaseRemoveTime(1); - if (!instance.shouldRemove()) continue; + if (instance.shouldRemove()) continue; storage.forgetSkill(instance); } } diff --git a/commonTest/src/main/java/com/github/manasmods/testmod/client/KeybindingTest.java b/commonTest/src/main/java/com/github/manasmods/testmod/client/KeybindingTest.java index 92817766..5c47243b 100644 --- a/commonTest/src/main/java/com/github/manasmods/testmod/client/KeybindingTest.java +++ b/commonTest/src/main/java/com/github/manasmods/testmod/client/KeybindingTest.java @@ -4,6 +4,7 @@ import com.github.manasmods.manascore.api.client.keybinding.KeybindingCategory; import com.github.manasmods.manascore.api.client.keybinding.KeybindingEvents; import com.github.manasmods.manascore.api.client.keybinding.ManasKeybinding; +import com.github.manasmods.manascore.api.skill.SkillAPI; public class KeybindingTest { public static void init() { @@ -17,6 +18,11 @@ public static void init() { registry.create(new ManasKeybinding("manascore.keybinding.test_press", category, () -> ManasCore.Logger.info("Pressed"))); + registry.create(new ManasKeybinding("manascore.keybinding.skill", category, + () -> SkillAPI.skillActivationPacket(0), + duration -> SkillAPI.skillReleasePacket(0, (int) (duration / 50)) + )); + registry.create(new ManasKeybinding("manascore.keybinding.skill_toggle", category, SkillAPI::skillTogglePacket)); }); } } diff --git a/commonTest/src/main/java/com/github/manasmods/testmod/registry/RegisterTest.java b/commonTest/src/main/java/com/github/manasmods/testmod/registry/RegisterTest.java index aef904ac..463913b7 100644 --- a/commonTest/src/main/java/com/github/manasmods/testmod/registry/RegisterTest.java +++ b/commonTest/src/main/java/com/github/manasmods/testmod/registry/RegisterTest.java @@ -1,9 +1,12 @@ package com.github.manasmods.testmod.registry; import com.github.manasmods.manascore.ManasCore; +import com.github.manasmods.manascore.api.skill.ManasSkill; +import com.github.manasmods.manascore.skill.SkillRegistry; import com.mojang.serialization.MapCodec; import dev.architectury.registry.registries.RegistrySupplier; import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.ai.attributes.RangedAttribute; import net.minecraft.world.entity.npc.Villager; @@ -43,6 +46,7 @@ public class RegisterTest { private static final RegistrySupplier> TEST_BLOCK_ENTITY = REGISTER.blockEntity("test_block_entity", TestBlockEntity::new) .withValidBlocks(TEST_BLOCK) .end(); + public static final RegistrySupplier TEST_SKILL = SkillRegistry.SKILLS.register(new ResourceLocation(ManasCore.MOD_ID, "test_skill"), TestSkill::new); public static void init() { ManasCore.Logger.info("Registered test content!"); diff --git a/commonTest/src/main/java/com/github/manasmods/testmod/registry/TestSkill.java b/commonTest/src/main/java/com/github/manasmods/testmod/registry/TestSkill.java new file mode 100644 index 00000000..91efbd58 --- /dev/null +++ b/commonTest/src/main/java/com/github/manasmods/testmod/registry/TestSkill.java @@ -0,0 +1,117 @@ +package com.github.manasmods.testmod.registry; + +import com.github.manasmods.manascore.ManasCore; +import com.github.manasmods.manascore.api.skill.ManasSkill; +import com.github.manasmods.manascore.api.skill.ManasSkillInstance; +import com.github.manasmods.manascore.api.world.entity.EntityEvents; +import com.github.manasmods.manascore.utils.Changeable; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.monster.Creeper; +import net.minecraft.world.entity.monster.Spider; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.projectile.Projectile; +import net.minecraft.world.entity.projectile.ThrownTrident; +import net.minecraft.world.phys.EntityHitResult; + +public class TestSkill extends ManasSkill { + public TestSkill() { + super(); + ManasCore.Logger.info("Created skill!"); + } + + public boolean canTick(ManasSkillInstance instance, LivingEntity entity) { + return instance.isToggled(); + } + public void onToggleOn(ManasSkillInstance instance, LivingEntity entity) { + ManasCore.Logger.debug("Toggled On"); + } + + public void onToggleOff(ManasSkillInstance instance, LivingEntity entity) { + ManasCore.Logger.debug("Toggled Off"); + } + + public void onPressed(ManasSkillInstance instance, LivingEntity entity) { + ManasCore.Logger.debug("I'm pressed"); + } + + public boolean onHeld(ManasSkillInstance instance, LivingEntity living, int heldTicks) { + ManasCore.Logger.debug("Held for {} ticks", heldTicks); + return true; + } + + public void onRelease(ManasSkillInstance instance, LivingEntity entity, int heldTicks) { + ManasCore.Logger.debug("I'm released after {} ticks", heldTicks); + } + + public void onTick(ManasSkillInstance instance, LivingEntity living) { + if (living instanceof Player player && player.isSecondaryUseActive()) + ManasCore.Logger.debug("You're sneaky"); + } + + public void onScroll(ManasSkillInstance instance, LivingEntity living, double delta) { + ManasCore.Logger.debug("Scroll delta: {}", delta); + } + + public void onLearnSkill(ManasSkillInstance instance, LivingEntity living) { + ManasCore.Logger.debug("Learnt test skill"); + } + + public void onRightClickBlock(ManasSkillInstance instance, Player player, InteractionHand hand, BlockPos pos, Direction face) { + ManasCore.Logger.debug("Block: {}", player.level().getBlockState(pos).getBlock().getName()); + } + + public boolean onBeingTargeted(ManasSkillInstance instance, LivingEntity owner, Changeable target) { + if (target.get() instanceof Spider) ManasCore.Logger.debug("Targeted by {}", target.get().getName()); + return true; + } + + public boolean onBeingDamaged(ManasSkillInstance instance, LivingEntity entity, DamageSource source, float amount) { + if (source.equals(entity.level().damageSources().cactus())) { + ManasCore.Logger.debug("No cactus touchy"); + return false; + } + return true; + } + + public boolean onDamageEntity(ManasSkillInstance instance, LivingEntity owner, DamageSource source, Changeable amount) { + if (owner instanceof Creeper creeper) { + creeper.kill(); + ManasCore.Logger.debug("No creeper"); + } + return true; + } + + public boolean onTouchEntity(ManasSkillInstance instance, LivingEntity owner, DamageSource source, Changeable amount) { + instance.setMastery(instance.getMastery() + 1); + ManasCore.Logger.debug("My mastery is {}", instance.getMastery()); + return true; + } + + public boolean onTakenDamage(ManasSkillInstance instance, LivingEntity owner, DamageSource source, Changeable amount) { + amount.set(amount.get() / 2F); + owner.heal(amount.get()); + ManasCore.Logger.debug("Healed {} by {} health", owner.getName().getString(), amount); + return true; + } + + public void onProjectileHit(ManasSkillInstance instance, LivingEntity living, EntityHitResult hitResult, Projectile projectile, Changeable result) { + if (projectile instanceof ThrownTrident) { + ManasCore.Logger.debug("Dodged"); + result.set(EntityEvents.ProjectileHitResult.PASS); + } + } + + public boolean onDeath(ManasSkillInstance instance, LivingEntity owner, DamageSource source) { + ManasCore.Logger.debug("Welcome to the phantom realm"); + return true; + } + + public void onRespawn(ManasSkillInstance instance, ServerPlayer owner, boolean conqueredEnd) { + ManasCore.Logger.debug("Welcome to the living realm"); + } +} diff --git a/commonTest/src/main/java/com/github/manasmods/testmod/storage/StorageTest.java b/commonTest/src/main/java/com/github/manasmods/testmod/storage/StorageTest.java index 8da331ce..0d7b3d63 100644 --- a/commonTest/src/main/java/com/github/manasmods/testmod/storage/StorageTest.java +++ b/commonTest/src/main/java/com/github/manasmods/testmod/storage/StorageTest.java @@ -1,11 +1,15 @@ package com.github.manasmods.testmod.storage; import com.github.manasmods.manascore.ManasCore; +import com.github.manasmods.manascore.api.skill.ManasSkillInstance; +import com.github.manasmods.manascore.api.skill.SkillAPI; import com.github.manasmods.manascore.api.storage.Storage; import com.github.manasmods.manascore.api.storage.StorageEvents; import com.github.manasmods.manascore.api.storage.StorageHolder; +import com.github.manasmods.manascore.skill.SkillStorage; import com.github.manasmods.manascore.storage.StorageManager.StorageKey; import com.github.manasmods.testmod.TestMod; +import com.github.manasmods.testmod.registry.RegisterTest; import dev.architectury.event.EventResult; import dev.architectury.event.events.common.ChatEvent; import dev.architectury.event.events.common.EntityEvent; @@ -44,6 +48,12 @@ public static void init() { serverPlayer.level().manasCore$getStorageOptional(WORLD_KEY).ifPresent(TestStorage::increaseDropCount); } + //Test giving Skills + SkillStorage storage = SkillAPI.getSkillsFrom(player); + if (storage.learnSkill(new ManasSkillInstance(RegisterTest.TEST_SKILL.get()))) { + ManasCore.Logger.info("Added Tested Skill!"); + } + return EventResult.pass(); }); EntityEvent.LIVING_DEATH.register((entity, source) -> { diff --git a/fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinAbstractArrow.java b/fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinAbstractArrow.java index 1ca93548..916b8076 100644 --- a/fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinAbstractArrow.java +++ b/fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinAbstractArrow.java @@ -39,12 +39,12 @@ public MixinAbstractArrow(EntityType entityType, Level lev @WrapOperation(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/projectile/AbstractArrow;onHit(Lnet/minecraft/world/phys/HitResult;)V")) void onHit(AbstractArrow instance, HitResult result, Operation original, @Local LocalRef entityHitResult) { - Changeable resultChangeable = Changeable.of(ProjectileHitResult.DEFUALT); + Changeable resultChangeable = Changeable.of(ProjectileHitResult.DEFAULT); EntityEvents.PROJECTILE_HIT.invoker().hit(result, instance, resultChangeable); this.onHitEventResult = resultChangeable.get(); switch (this.onHitEventResult) { - case DEFUALT -> { + case DEFAULT -> { original.call(instance, result); this.onHitEventResult = null; } diff --git a/fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinAbstractHurtingProjectile.java b/fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinAbstractHurtingProjectile.java new file mode 100644 index 00000000..35a9ce15 --- /dev/null +++ b/fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinAbstractHurtingProjectile.java @@ -0,0 +1,23 @@ +package com.github.manasmods.manascore.fabric.core; + +import com.github.manasmods.manascore.api.world.entity.EntityEvents; +import com.github.manasmods.manascore.api.world.entity.EntityEvents.ProjectileHitResult; +import com.github.manasmods.manascore.utils.Changeable; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import net.minecraft.world.entity.projectile.AbstractHurtingProjectile; +import net.minecraft.world.phys.HitResult; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(AbstractHurtingProjectile.class) +public abstract class MixinAbstractHurtingProjectile { + @WrapOperation(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/projectile/AbstractHurtingProjectile;onHit(Lnet/minecraft/world/phys/HitResult;)V")) + void onHit(AbstractHurtingProjectile instance, HitResult result, Operation original) { + Changeable resultChangeable = Changeable.of(ProjectileHitResult.DEFAULT); + EntityEvents.PROJECTILE_HIT.invoker().hit(result, instance, resultChangeable); + + if (!resultChangeable.get().equals(ProjectileHitResult.DEFAULT)) return; + original.call(instance, result); + } +} diff --git a/fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinFireRocketEntity.java b/fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinFireRocketEntity.java new file mode 100644 index 00000000..9c1513a9 --- /dev/null +++ b/fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinFireRocketEntity.java @@ -0,0 +1,23 @@ +package com.github.manasmods.manascore.fabric.core; + +import com.github.manasmods.manascore.api.world.entity.EntityEvents; +import com.github.manasmods.manascore.api.world.entity.EntityEvents.ProjectileHitResult; +import com.github.manasmods.manascore.utils.Changeable; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import net.minecraft.world.entity.projectile.FireworkRocketEntity; +import net.minecraft.world.phys.HitResult; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(FireworkRocketEntity.class) +public abstract class MixinFireRocketEntity { + @WrapOperation(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/projectile/FireworkRocketEntity;onHit(Lnet/minecraft/world/phys/HitResult;)V")) + void onHit(FireworkRocketEntity instance, HitResult result, Operation original) { + Changeable resultChangeable = Changeable.of(ProjectileHitResult.DEFAULT); + EntityEvents.PROJECTILE_HIT.invoker().hit(result, instance, resultChangeable); + + if (!resultChangeable.get().equals(ProjectileHitResult.DEFAULT)) return; + original.call(instance, result); + } +} diff --git a/fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinFishingHook.java b/fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinFishingHook.java new file mode 100644 index 00000000..676f1b3d --- /dev/null +++ b/fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinFishingHook.java @@ -0,0 +1,23 @@ +package com.github.manasmods.manascore.fabric.core; + +import com.github.manasmods.manascore.api.world.entity.EntityEvents; +import com.github.manasmods.manascore.api.world.entity.EntityEvents.ProjectileHitResult; +import com.github.manasmods.manascore.utils.Changeable; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import net.minecraft.world.entity.projectile.FishingHook; +import net.minecraft.world.phys.HitResult; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(FishingHook.class) +public abstract class MixinFishingHook { + @WrapOperation(method = "checkCollision", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/projectile/FishingHook;onHit(Lnet/minecraft/world/phys/HitResult;)V")) + void onHit(FishingHook instance, HitResult result, Operation original) { + Changeable resultChangeable = Changeable.of(ProjectileHitResult.DEFAULT); + EntityEvents.PROJECTILE_HIT.invoker().hit(result, instance, resultChangeable); + + if (!resultChangeable.get().equals(ProjectileHitResult.DEFAULT)) return; + original.call(instance, result); + } +} diff --git a/fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinLlamaSpit.java b/fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinLlamaSpit.java new file mode 100644 index 00000000..21212734 --- /dev/null +++ b/fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinLlamaSpit.java @@ -0,0 +1,23 @@ +package com.github.manasmods.manascore.fabric.core; + +import com.github.manasmods.manascore.api.world.entity.EntityEvents; +import com.github.manasmods.manascore.api.world.entity.EntityEvents.ProjectileHitResult; +import com.github.manasmods.manascore.utils.Changeable; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import net.minecraft.world.entity.projectile.LlamaSpit; +import net.minecraft.world.phys.HitResult; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(LlamaSpit.class) +public abstract class MixinLlamaSpit { + @WrapOperation(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/projectile/LlamaSpit;onHit(Lnet/minecraft/world/phys/HitResult;)V")) + void onHit(LlamaSpit instance, HitResult result, Operation original) { + Changeable resultChangeable = Changeable.of(ProjectileHitResult.DEFAULT); + EntityEvents.PROJECTILE_HIT.invoker().hit(result, instance, resultChangeable); + + if (!resultChangeable.get().equals(ProjectileHitResult.DEFAULT)) return; + original.call(instance, result); + } +} diff --git a/fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinShulkerBullet.java b/fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinShulkerBullet.java new file mode 100644 index 00000000..09fe6313 --- /dev/null +++ b/fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinShulkerBullet.java @@ -0,0 +1,23 @@ +package com.github.manasmods.manascore.fabric.core; + +import com.github.manasmods.manascore.api.world.entity.EntityEvents; +import com.github.manasmods.manascore.api.world.entity.EntityEvents.ProjectileHitResult; +import com.github.manasmods.manascore.utils.Changeable; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import net.minecraft.world.entity.projectile.ShulkerBullet; +import net.minecraft.world.phys.HitResult; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(ShulkerBullet.class) +public abstract class MixinShulkerBullet { + @WrapOperation(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/projectile/ShulkerBullet;onHit(Lnet/minecraft/world/phys/HitResult;)V")) + void onHit(ShulkerBullet instance, HitResult result, Operation original) { + Changeable resultChangeable = Changeable.of(ProjectileHitResult.DEFAULT); + EntityEvents.PROJECTILE_HIT.invoker().hit(result, instance, resultChangeable); + + if (!resultChangeable.get().equals(ProjectileHitResult.DEFAULT)) return; + original.call(instance, result); + } +} diff --git a/fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinThrowableProjectile.java b/fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinThrowableProjectile.java new file mode 100644 index 00000000..8f3917c2 --- /dev/null +++ b/fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinThrowableProjectile.java @@ -0,0 +1,23 @@ +package com.github.manasmods.manascore.fabric.core; + +import com.github.manasmods.manascore.api.world.entity.EntityEvents; +import com.github.manasmods.manascore.api.world.entity.EntityEvents.ProjectileHitResult; +import com.github.manasmods.manascore.utils.Changeable; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import net.minecraft.world.entity.projectile.ThrowableProjectile; +import net.minecraft.world.phys.HitResult; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(ThrowableProjectile.class) +public abstract class MixinThrowableProjectile{ + @WrapOperation(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/projectile/ThrowableProjectile;onHit(Lnet/minecraft/world/phys/HitResult;)V")) + void onHit(ThrowableProjectile instance, HitResult result, Operation original) { + Changeable resultChangeable = Changeable.of(ProjectileHitResult.DEFAULT); + EntityEvents.PROJECTILE_HIT.invoker().hit(result, instance, resultChangeable); + + if (!resultChangeable.get().equals(ProjectileHitResult.DEFAULT)) return; + original.call(instance, result); + } +} diff --git a/fabric/src/main/resources/manascore.mixins.json b/fabric/src/main/resources/manascore.mixins.json index 1d98ce0d..fe1f2cc1 100644 --- a/fabric/src/main/resources/manascore.mixins.json +++ b/fabric/src/main/resources/manascore.mixins.json @@ -5,9 +5,15 @@ "compatibilityLevel": "JAVA_17", "mixins": [ "MixinAbstractArrow", + "MixinAbstractHurtingProjectile", + "MixinFireRocketEntity", + "MixinFishingHook", "MixinLivingEntity", + "MixinLlamaSpit", "MixinMob", - "MixinStartAttacking" + "MixinShulkerBullet", + "MixinStartAttacking", + "MixinThrowableProjectile" ], "client": [ ], diff --git a/forge/src/main/java/com/github/manasmods/manascore/forge/ForgeCommonEventInvoker.java b/forge/src/main/java/com/github/manasmods/manascore/forge/ForgeCommonEventInvoker.java index 40e0bb77..4dc7d52e 100644 --- a/forge/src/main/java/com/github/manasmods/manascore/forge/ForgeCommonEventInvoker.java +++ b/forge/src/main/java/com/github/manasmods/manascore/forge/ForgeCommonEventInvoker.java @@ -48,7 +48,7 @@ static void onProjectileHit(final ProjectileImpactEvent e) { Changeable result; switch (e.getImpactResult()) { - default -> result = Changeable.of(ProjectileHitResult.DEFUALT); + default -> result = Changeable.of(ProjectileHitResult.DEFAULT); case STOP_AT_CURRENT -> result = Changeable.of(ProjectileHitResult.HIT); case STOP_AT_CURRENT_NO_DAMAGE -> result = Changeable.of(ProjectileHitResult.HIT_NO_DAMAGE); case SKIP_ENTITY -> result = Changeable.of(ProjectileHitResult.PASS); @@ -57,7 +57,7 @@ static void onProjectileHit(final ProjectileImpactEvent e) { EntityEvents.PROJECTILE_HIT.invoker().hit(e.getRayTraceResult(), e.getProjectile(), result); switch (result.get()) { - case DEFUALT -> e.setImpactResult(ProjectileImpactEvent.ImpactResult.DEFAULT); + case DEFAULT -> e.setImpactResult(ProjectileImpactEvent.ImpactResult.DEFAULT); case HIT -> e.setImpactResult(ProjectileImpactEvent.ImpactResult.STOP_AT_CURRENT); case HIT_NO_DAMAGE -> e.setImpactResult(ProjectileImpactEvent.ImpactResult.STOP_AT_CURRENT_NO_DAMAGE); case PASS -> e.setImpactResult(ProjectileImpactEvent.ImpactResult.SKIP_ENTITY); From 96ce5bd26f578bb88c1bee009c19d09c5c15e36e Mon Sep 17 00:00:00 2001 From: Minh Date: Tue, 2 Jan 2024 19:41:52 +0700 Subject: [PATCH 2/9] Only OnTakenDamage broken. --- .../manascore/api/skill/ManasSkill.java | 14 ++--- .../api/skill/ManasSkillInstance.java | 24 ++++----- .../toserver/RequestSkillReleasePacket.java | 2 +- .../manascore/skill/SkillRegistry.java | 27 ++++++---- .../manascore/skill/SkillStorage.java | 4 +- .../manasmods/testmod/registry/TestSkill.java | 53 +++++++++++-------- .../testmod/storage/StorageTest.java | 11 ++-- .../forge/ForgeCommonEventInvoker.java | 2 +- 8 files changed, 76 insertions(+), 61 deletions(-) diff --git a/common/src/main/java/com/github/manasmods/manascore/api/skill/ManasSkill.java b/common/src/main/java/com/github/manasmods/manascore/api/skill/ManasSkill.java index aa585c2b..9789b41d 100644 --- a/common/src/main/java/com/github/manasmods/manascore/api/skill/ManasSkill.java +++ b/common/src/main/java/com/github/manasmods/manascore/api/skill/ManasSkill.java @@ -219,7 +219,7 @@ public boolean onHeld(ManasSkillInstance instance, LivingEntity living, int held * @param instance Affected {@link ManasSkillInstance} * @param entity Affected {@link LivingEntity} owning this Skill. */ - public void onRelease(ManasSkillInstance instance, LivingEntity entity, int keyNumber, int heldTicks) { + public void onRelease(ManasSkillInstance instance, LivingEntity entity, int heldTicks) { // Override this method to add your own logic } @@ -266,9 +266,9 @@ public void onRightClickBlock(ManasSkillInstance instance, Player player, Intera /** * Called when the {@link LivingEntity} owning this Skill starts to be targeted by a mob. * - * @see ManasSkillInstance#onBeingTargeted(LivingEntity, Changeable) + * @see ManasSkillInstance#onBeingTargeted(Changeable, LivingEntity) */ - public boolean onBeingTargeted(ManasSkillInstance instance, LivingEntity owner, Changeable target) { + public boolean onBeingTargeted(ManasSkillInstance instance, Changeable target, LivingEntity owner) { // Override this method to add your own logic return true; } @@ -286,9 +286,9 @@ public boolean onBeingDamaged(ManasSkillInstance instance, LivingEntity entity, /** * Called when the {@link LivingEntity} owning this Skill damage another {@link LivingEntity}. * - * @see ManasSkillInstance#onDamageEntity(LivingEntity, DamageSource, Changeable) + * @see ManasSkillInstance#onDamageEntity(LivingEntity, LivingEntity, DamageSource, Changeable) */ - public boolean onDamageEntity(ManasSkillInstance instance, LivingEntity owner, DamageSource source, Changeable amount) { + public boolean onDamageEntity(ManasSkillInstance instance, LivingEntity owner, LivingEntity target, DamageSource source, Changeable amount) { // Override this method to add your own logic return true; } @@ -296,9 +296,9 @@ public boolean onDamageEntity(ManasSkillInstance instance, LivingEntity owner, D /** * Called when the {@link LivingEntity} owning this Skill damage another {@link LivingEntity}, * - * @see ManasSkillInstance#onTouchEntity(LivingEntity, DamageSource, Changeable) + * @see ManasSkillInstance#onTouchEntity(LivingEntity, LivingEntity, DamageSource, Changeable) */ - public boolean onTouchEntity(ManasSkillInstance instance, LivingEntity entity, DamageSource source, Changeable amount) { + public boolean onTouchEntity(ManasSkillInstance instance, LivingEntity owner, LivingEntity target, DamageSource source, Changeable amount) { // Override this method to add your own logic return true; } diff --git a/common/src/main/java/com/github/manasmods/manascore/api/skill/ManasSkillInstance.java b/common/src/main/java/com/github/manasmods/manascore/api/skill/ManasSkillInstance.java index fbb0aa64..d2a3c528 100644 --- a/common/src/main/java/com/github/manasmods/manascore/api/skill/ManasSkillInstance.java +++ b/common/src/main/java/com/github/manasmods/manascore/api/skill/ManasSkillInstance.java @@ -408,8 +408,8 @@ public boolean onHeld(LivingEntity entity, int heldTicks) { * @param entity Affected {@link LivingEntity} owning this instance. * @param heldTicks - the number of ticks the skill activation button is held down. */ - public void onRelease(LivingEntity entity, int keyNumber, int heldTicks) { - this.getSkill().onRelease(this, entity, keyNumber, heldTicks); + public void onRelease(LivingEntity entity, int heldTicks) { + this.getSkill().onRelease(this, entity, heldTicks); } /** @@ -454,8 +454,8 @@ public void onRightClickBlock(Player player, InteractionHand hand, BlockPos pos, * * @return false will stop the mob from targeting the owner. */ - public boolean onBeingTargeted(LivingEntity owner, Changeable target) { - return this.getSkill().onBeingTargeted(this, owner, target); + public boolean onBeingTargeted(Changeable owner, LivingEntity mob) { + return this.getSkill().onBeingTargeted(this, owner, mob); } /** @@ -470,27 +470,27 @@ public boolean onBeingDamaged(LivingEntity entity, DamageSource source, float am } /** - * Called when the {@link LivingEntity} owning this instance gets hurt. + * Called when the {@link LivingEntity} owning this instance starts attacking another {@link LivingEntity}. *

* Gets executed after {@link ManasSkillInstance#onBeingDamaged}
* Gets executed before {@link ManasSkillInstance#onTouchEntity} * - * @return false will prevent the owner from taking damage. + * @return false will prevent the owner from dealing damage */ - public boolean onDamageEntity(LivingEntity owner, DamageSource source, Changeable amount) { - return this.getSkill().onDamageEntity(this, owner, source, amount); + public boolean onDamageEntity(LivingEntity owner, LivingEntity target, DamageSource source, Changeable amount) { + return this.getSkill().onDamageEntity(this, owner, target, source, amount); } /** - * Called when the {@link LivingEntity} owning this instance gets hurt (after effects like Barriers are consumed the damage amount). + * Called when the {@link LivingEntity} owning this instance hurts another {@link LivingEntity} (after effects like Barriers are consumed the damage amount). *

* Gets executed after {@link ManasSkillInstance#onDamageEntity} * Gets executed before {@link ManasSkillInstance#onTakenDamage} * - * @return false will prevent the owner from taking damage. + * @return false will prevent the owner from dealing damage. */ - public boolean onTouchEntity(LivingEntity owner, DamageSource source, Changeable amount) { - return this.getSkill().onTouchEntity(this, owner, source, amount); + public boolean onTouchEntity(LivingEntity owner, LivingEntity target, DamageSource source, Changeable amount) { + return this.getSkill().onTouchEntity(this, owner, target, source, amount); } /** diff --git a/common/src/main/java/com/github/manasmods/manascore/network/toserver/RequestSkillReleasePacket.java b/common/src/main/java/com/github/manasmods/manascore/network/toserver/RequestSkillReleasePacket.java index 76a53a41..8c7098c9 100644 --- a/common/src/main/java/com/github/manasmods/manascore/network/toserver/RequestSkillReleasePacket.java +++ b/common/src/main/java/com/github/manasmods/manascore/network/toserver/RequestSkillReleasePacket.java @@ -40,7 +40,7 @@ public void handle(Supplier contextSupplier) { context.queue(() -> { Player player = context.getPlayer(); if (player == null) return; - StorageManager.getStorage(player, SkillStorage.getKey()).handleSkillRelease(skillList, keyNumber, heldTick); + StorageManager.getStorage(player, SkillStorage.getKey()).handleSkillRelease(skillList, heldTick); }); } } diff --git a/common/src/main/java/com/github/manasmods/manascore/skill/SkillRegistry.java b/common/src/main/java/com/github/manasmods/manascore/skill/SkillRegistry.java index ef0145f8..cadb5224 100644 --- a/common/src/main/java/com/github/manasmods/manascore/skill/SkillRegistry.java +++ b/common/src/main/java/com/github/manasmods/manascore/skill/SkillRegistry.java @@ -38,9 +38,10 @@ public static void init() { EntityEvents.LIVING_CHANGE_TARGET.register((entity, changeableTarget) -> { if (!changeableTarget.isPresent()) return EventResult.pass(); - for (ManasSkillInstance instance : SkillAPI.getSkillsFrom(changeableTarget.get()).getLearnedSkills()) { - if (!instance.canInteractSkill(entity)) continue; - if (!instance.onBeingTargeted(entity, changeableTarget)) return EventResult.interruptFalse(); + LivingEntity owner = changeableTarget.get(); + for (ManasSkillInstance instance : SkillAPI.getSkillsFrom(owner).getLearnedSkills()) { + if (!instance.canInteractSkill(owner)) continue; + if (!instance.onBeingTargeted(changeableTarget, entity)) return EventResult.interruptFalse(); } return EventResult.pass(); @@ -55,19 +56,23 @@ public static void init() { return EventResult.pass(); }); - SkillEvents.SKILL_DAMAGE_PRE_CALCULATION.register((storage, entity, source, amount) -> { - for (ManasSkillInstance instance : storage.getLearnedSkills()) { - if (!instance.canInteractSkill(entity)) continue; - if (!instance.onDamageEntity(entity, source, amount)) return EventResult.interruptFalse(); + SkillEvents.SKILL_DAMAGE_PRE_CALCULATION.register((storage, target, source, amount) -> { + if (!(source.getEntity() instanceof LivingEntity owner)) return EventResult.pass(); + + for (ManasSkillInstance instance : SkillAPI.getSkillsFrom(owner).getLearnedSkills()) { + if (!instance.canInteractSkill(owner)) continue; + if (!instance.onDamageEntity(owner, target, source, amount)) return EventResult.interruptFalse(); } return EventResult.pass(); }); - SkillEvents.SKILL_DAMAGE_POST_CALCULATION.register((storage, entity, source, amount) -> { - for (ManasSkillInstance instance : storage.getLearnedSkills()) { - if (!instance.canInteractSkill(entity)) continue; - if (!instance.onTouchEntity(entity, source, amount)) return EventResult.interruptFalse(); + SkillEvents.SKILL_DAMAGE_POST_CALCULATION.register((storage, target, source, amount) -> { + if (!(source.getEntity() instanceof LivingEntity owner)) return EventResult.pass(); + + for (ManasSkillInstance instance : SkillAPI.getSkillsFrom(owner).getLearnedSkills()) { + if (!instance.canInteractSkill(owner)) continue; + if (!instance.onTouchEntity(owner, target, source, amount)) return EventResult.interruptFalse(); } return EventResult.pass(); diff --git a/common/src/main/java/com/github/manasmods/manascore/skill/SkillStorage.java b/common/src/main/java/com/github/manasmods/manascore/skill/SkillStorage.java index 8218fdd5..4cd818c4 100644 --- a/common/src/main/java/com/github/manasmods/manascore/skill/SkillStorage.java +++ b/common/src/main/java/com/github/manasmods/manascore/skill/SkillStorage.java @@ -165,12 +165,12 @@ public void forEachSkill(BiConsumer skillInsta markDirty(); } - public void handleSkillRelease(List skillList, int keyNumber, int heldTick) { + public void handleSkillRelease(List skillList, int heldTick) { for (final ResourceLocation skillId : skillList) { getSkill(skillId).ifPresent(skill -> { if (!skill.canInteractSkill(getOwner())) return; if (skill.onCoolDown() && !skill.canIgnoreCoolDown(getOwner())) return; - skill.onRelease(getOwner(), keyNumber, heldTick); + skill.onRelease(getOwner(), heldTick); if (skill.isDirty()) markDirty(); UUID ownerID = getOwner().getUUID(); diff --git a/commonTest/src/main/java/com/github/manasmods/testmod/registry/TestSkill.java b/commonTest/src/main/java/com/github/manasmods/testmod/registry/TestSkill.java index 91efbd58..685b8402 100644 --- a/commonTest/src/main/java/com/github/manasmods/testmod/registry/TestSkill.java +++ b/commonTest/src/main/java/com/github/manasmods/testmod/registry/TestSkill.java @@ -11,8 +11,10 @@ import net.minecraft.world.InteractionHand; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.animal.IronGolem; import net.minecraft.world.entity.monster.Creeper; import net.minecraft.world.entity.monster.Spider; +import net.minecraft.world.entity.npc.Villager; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.Projectile; import net.minecraft.world.entity.projectile.ThrownTrident; @@ -27,91 +29,96 @@ public TestSkill() { public boolean canTick(ManasSkillInstance instance, LivingEntity entity) { return instance.isToggled(); } + public void onToggleOn(ManasSkillInstance instance, LivingEntity entity) { - ManasCore.Logger.debug("Toggled On"); + ManasCore.Logger.info("Toggled On"); } public void onToggleOff(ManasSkillInstance instance, LivingEntity entity) { - ManasCore.Logger.debug("Toggled Off"); + ManasCore.Logger.info("Toggled Off"); } public void onPressed(ManasSkillInstance instance, LivingEntity entity) { - ManasCore.Logger.debug("I'm pressed"); + ManasCore.Logger.info("I'm pressed"); } public boolean onHeld(ManasSkillInstance instance, LivingEntity living, int heldTicks) { - ManasCore.Logger.debug("Held for {} ticks", heldTicks); + ManasCore.Logger.info("Held for {} ticks", heldTicks); return true; } public void onRelease(ManasSkillInstance instance, LivingEntity entity, int heldTicks) { - ManasCore.Logger.debug("I'm released after {} ticks", heldTicks); + ManasCore.Logger.info("I'm released after {} ticks", heldTicks); } public void onTick(ManasSkillInstance instance, LivingEntity living) { if (living instanceof Player player && player.isSecondaryUseActive()) - ManasCore.Logger.debug("You're sneaky"); + ManasCore.Logger.info("You're sneaky"); } public void onScroll(ManasSkillInstance instance, LivingEntity living, double delta) { - ManasCore.Logger.debug("Scroll delta: {}", delta); + ManasCore.Logger.info("Scroll delta: {}", delta); } public void onLearnSkill(ManasSkillInstance instance, LivingEntity living) { - ManasCore.Logger.debug("Learnt test skill"); + ManasCore.Logger.info("Learnt test skill"); } public void onRightClickBlock(ManasSkillInstance instance, Player player, InteractionHand hand, BlockPos pos, Direction face) { - ManasCore.Logger.debug("Block: {}", player.level().getBlockState(pos).getBlock().getName()); + ManasCore.Logger.info("Block: {}", player.level().getBlockState(pos).getBlock().getName()); } - public boolean onBeingTargeted(ManasSkillInstance instance, LivingEntity owner, Changeable target) { - if (target.get() instanceof Spider) ManasCore.Logger.debug("Targeted by {}", target.get().getName()); + public boolean onBeingTargeted(ManasSkillInstance instance, Changeable target, LivingEntity mob) { + if (mob instanceof Spider) ManasCore.Logger.info("Targeted by {}", mob.getName()); return true; } public boolean onBeingDamaged(ManasSkillInstance instance, LivingEntity entity, DamageSource source, float amount) { if (source.equals(entity.level().damageSources().cactus())) { - ManasCore.Logger.debug("No cactus touchy"); + ManasCore.Logger.info("No cactus touchy"); return false; } return true; } - public boolean onDamageEntity(ManasSkillInstance instance, LivingEntity owner, DamageSource source, Changeable amount) { - if (owner instanceof Creeper creeper) { + public boolean onDamageEntity(ManasSkillInstance instance, LivingEntity owner, LivingEntity target, DamageSource source, Changeable amount) { + if (target instanceof Creeper creeper) { creeper.kill(); - ManasCore.Logger.debug("No creeper"); + ManasCore.Logger.info("No creeper"); + } else if (target instanceof IronGolem) { + amount.set(amount.get() * 100F); + ManasCore.Logger.info("Dealt {} damage.", amount.get()); } return true; } - public boolean onTouchEntity(ManasSkillInstance instance, LivingEntity owner, DamageSource source, Changeable amount) { - instance.setMastery(instance.getMastery() + 1); - ManasCore.Logger.debug("My mastery is {}", instance.getMastery()); + public boolean onTouchEntity(ManasSkillInstance instance, LivingEntity owner, LivingEntity target, DamageSource source, Changeable amount) { + if (owner.isShiftKeyDown() && target instanceof Villager) { + instance.setMastery(instance.getMastery() + 1); + ManasCore.Logger.info("My mastery is {}", instance.getMastery()); + } return true; } public boolean onTakenDamage(ManasSkillInstance instance, LivingEntity owner, DamageSource source, Changeable amount) { - amount.set(amount.get() / 2F); owner.heal(amount.get()); - ManasCore.Logger.debug("Healed {} by {} health", owner.getName().getString(), amount); + ManasCore.Logger.info("Healed {} by {} health", owner.getName(), amount); return true; } public void onProjectileHit(ManasSkillInstance instance, LivingEntity living, EntityHitResult hitResult, Projectile projectile, Changeable result) { if (projectile instanceof ThrownTrident) { - ManasCore.Logger.debug("Dodged"); + ManasCore.Logger.info("Dodged"); result.set(EntityEvents.ProjectileHitResult.PASS); } } public boolean onDeath(ManasSkillInstance instance, LivingEntity owner, DamageSource source) { - ManasCore.Logger.debug("Welcome to the phantom realm"); + ManasCore.Logger.info("Welcome to the phantom realm"); return true; } public void onRespawn(ManasSkillInstance instance, ServerPlayer owner, boolean conqueredEnd) { - ManasCore.Logger.debug("Welcome to the living realm"); + ManasCore.Logger.info("Welcome to the living realm"); } } diff --git a/commonTest/src/main/java/com/github/manasmods/testmod/storage/StorageTest.java b/commonTest/src/main/java/com/github/manasmods/testmod/storage/StorageTest.java index 0d7b3d63..aceefb57 100644 --- a/commonTest/src/main/java/com/github/manasmods/testmod/storage/StorageTest.java +++ b/commonTest/src/main/java/com/github/manasmods/testmod/storage/StorageTest.java @@ -3,10 +3,10 @@ import com.github.manasmods.manascore.ManasCore; import com.github.manasmods.manascore.api.skill.ManasSkillInstance; import com.github.manasmods.manascore.api.skill.SkillAPI; +import com.github.manasmods.manascore.api.skill.Skills; import com.github.manasmods.manascore.api.storage.Storage; import com.github.manasmods.manascore.api.storage.StorageEvents; import com.github.manasmods.manascore.api.storage.StorageHolder; -import com.github.manasmods.manascore.skill.SkillStorage; import com.github.manasmods.manascore.storage.StorageManager.StorageKey; import com.github.manasmods.testmod.TestMod; import com.github.manasmods.testmod.registry.RegisterTest; @@ -18,6 +18,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Items; import net.minecraft.world.level.Level; import net.minecraft.world.level.chunk.LevelChunk; @@ -49,9 +50,11 @@ public static void init() { } //Test giving Skills - SkillStorage storage = SkillAPI.getSkillsFrom(player); - if (storage.learnSkill(new ManasSkillInstance(RegisterTest.TEST_SKILL.get()))) { - ManasCore.Logger.info("Added Tested Skill!"); + if (entity.getItem().is(Items.DIAMOND)) { + Skills storage = SkillAPI.getSkillsFrom(player); + if (storage.learnSkill(new ManasSkillInstance(RegisterTest.TEST_SKILL.get()))) { + ManasCore.Logger.info("Added Tested Skill!"); + } } return EventResult.pass(); diff --git a/forge/src/main/java/com/github/manasmods/manascore/forge/ForgeCommonEventInvoker.java b/forge/src/main/java/com/github/manasmods/manascore/forge/ForgeCommonEventInvoker.java index 08340693..bf2d682d 100644 --- a/forge/src/main/java/com/github/manasmods/manascore/forge/ForgeCommonEventInvoker.java +++ b/forge/src/main/java/com/github/manasmods/manascore/forge/ForgeCommonEventInvoker.java @@ -54,7 +54,7 @@ static void onProjectileHit(final ProjectileImpactEvent e) { case STOP_AT_CURRENT -> result = Changeable.of(ProjectileHitResult.HIT); case STOP_AT_CURRENT_NO_DAMAGE -> result = Changeable.of(ProjectileHitResult.HIT_NO_DAMAGE); case SKIP_ENTITY -> result = Changeable.of(ProjectileHitResult.PASS); - default -> result = Changeable.of(ProjectileHitResult.DEFUALT); + default -> result = Changeable.of(ProjectileHitResult.DEFAULT); } EntityEvents.PROJECTILE_HIT.invoker().hit(e.getRayTraceResult(), e.getProjectile(), result); From f6a7d63cbf80b73617989afb2e2468d85196d225 Mon Sep 17 00:00:00 2001 From: Minh Date: Wed, 3 Jan 2024 01:33:52 +0700 Subject: [PATCH 3/9] Fabric working + Neo's Common Event Invoker --- .../manascore/api/skill/ManasSkill.java | 4 +- .../api/skill/ManasSkillInstance.java | 8 +-- .../manasmods/manascore/api/skill/Skills.java | 4 ++ .../RequestSkillActivationPacket.java | 2 +- .../toserver/RequestSkillReleasePacket.java | 2 +- .../manascore/skill/SkillStorage.java | 17 +++--- .../testmod/registry/RegisterTest.java | 5 +- .../manasmods/testmod/registry/TestSkill.java | 4 +- .../testmod/storage/StorageTest.java | 3 +- .../fabric/core/MixinFireRocketEntity.java | 35 ++++++++++-- .../fabric/core/MixinLocalPlayer.java | 35 ++++++++++++ .../manascore/fabric/core/MixinPlayer.java | 36 +++++++++++++ .../src/main/resources/manascore.mixins.json | 2 + .../neoforge/NeoForgeCommonEventInvoker.java | 54 +++++++++++++++++++ 14 files changed, 186 insertions(+), 25 deletions(-) create mode 100644 fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinLocalPlayer.java create mode 100644 fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinPlayer.java create mode 100644 neoforge/src/main/java/com/github/manasmods/manascore/neoforge/NeoForgeCommonEventInvoker.java diff --git a/common/src/main/java/com/github/manasmods/manascore/api/skill/ManasSkill.java b/common/src/main/java/com/github/manasmods/manascore/api/skill/ManasSkill.java index 9789b41d..8b959fc6 100644 --- a/common/src/main/java/com/github/manasmods/manascore/api/skill/ManasSkill.java +++ b/common/src/main/java/com/github/manasmods/manascore/api/skill/ManasSkill.java @@ -197,7 +197,7 @@ public void onTick(ManasSkillInstance instance, LivingEntity living) { * @param instance Affected {@link ManasSkillInstance} * @param entity Affected {@link LivingEntity} owning this Skill. */ - public void onPressed(ManasSkillInstance instance, LivingEntity entity) { + public void onPressed(ManasSkillInstance instance, LivingEntity entity, int keyNumber) { // Override this method to add your own logic } @@ -219,7 +219,7 @@ public boolean onHeld(ManasSkillInstance instance, LivingEntity living, int held * @param instance Affected {@link ManasSkillInstance} * @param entity Affected {@link LivingEntity} owning this Skill. */ - public void onRelease(ManasSkillInstance instance, LivingEntity entity, int heldTicks) { + public void onRelease(ManasSkillInstance instance, LivingEntity entity, int heldTicks, int keyNumber) { // Override this method to add your own logic } diff --git a/common/src/main/java/com/github/manasmods/manascore/api/skill/ManasSkillInstance.java b/common/src/main/java/com/github/manasmods/manascore/api/skill/ManasSkillInstance.java index d2a3c528..4e5b4bb4 100644 --- a/common/src/main/java/com/github/manasmods/manascore/api/skill/ManasSkillInstance.java +++ b/common/src/main/java/com/github/manasmods/manascore/api/skill/ManasSkillInstance.java @@ -388,8 +388,8 @@ public void onTick(LivingEntity living) { * * @param entity Affected {@link LivingEntity} owning this instance. */ - public void onPressed(LivingEntity entity) { - this.getSkill().onPressed(this, entity); + public void onPressed(LivingEntity entity, int keyNumber) { + this.getSkill().onPressed(this, entity, keyNumber); } /** @@ -408,8 +408,8 @@ public boolean onHeld(LivingEntity entity, int heldTicks) { * @param entity Affected {@link LivingEntity} owning this instance. * @param heldTicks - the number of ticks the skill activation button is held down. */ - public void onRelease(LivingEntity entity, int heldTicks) { - this.getSkill().onRelease(this, entity, heldTicks); + public void onRelease(LivingEntity entity, int heldTicks, int keyNumber) { + this.getSkill().onRelease(this, entity, heldTicks, keyNumber); } /** diff --git a/common/src/main/java/com/github/manasmods/manascore/api/skill/Skills.java b/common/src/main/java/com/github/manasmods/manascore/api/skill/Skills.java index 47cae5f6..85e7780c 100644 --- a/common/src/main/java/com/github/manasmods/manascore/api/skill/Skills.java +++ b/common/src/main/java/com/github/manasmods/manascore/api/skill/Skills.java @@ -15,6 +15,8 @@ public interface Skills { void updateSkill(ManasSkillInstance updatedInstance, boolean sync); + boolean learnSkill(ManasSkill skill); + boolean learnSkill(ManasSkillInstance instance); Optional getSkill(@NonNull ResourceLocation skillId); @@ -23,6 +25,8 @@ default Optional getSkill(@NonNull ManasSkill skill) { return getSkill(skill.getRegistryName()); } + void forgetSkill(ManasSkill skill); + void forgetSkill(ManasSkillInstance instance); void forEachSkill(BiConsumer skillInstanceConsumer); diff --git a/common/src/main/java/com/github/manasmods/manascore/network/toserver/RequestSkillActivationPacket.java b/common/src/main/java/com/github/manasmods/manascore/network/toserver/RequestSkillActivationPacket.java index 6176b93a..437d85b5 100644 --- a/common/src/main/java/com/github/manasmods/manascore/network/toserver/RequestSkillActivationPacket.java +++ b/common/src/main/java/com/github/manasmods/manascore/network/toserver/RequestSkillActivationPacket.java @@ -43,7 +43,7 @@ public void handle(Supplier contextSupplier) { storage.getSkill(skillId).ifPresent(skill -> { if(!skill.canInteractSkill(player)) return; if (skill.onCoolDown() && !skill.canIgnoreCoolDown(player)) return; - skill.onPressed(player); + skill.onPressed(player, keyNumber); storage.markDirty(); SkillStorage.tickingSkills.put(player.getUUID(), new TickingSkill(skill.getSkill())); diff --git a/common/src/main/java/com/github/manasmods/manascore/network/toserver/RequestSkillReleasePacket.java b/common/src/main/java/com/github/manasmods/manascore/network/toserver/RequestSkillReleasePacket.java index 8c7098c9..95853511 100644 --- a/common/src/main/java/com/github/manasmods/manascore/network/toserver/RequestSkillReleasePacket.java +++ b/common/src/main/java/com/github/manasmods/manascore/network/toserver/RequestSkillReleasePacket.java @@ -40,7 +40,7 @@ public void handle(Supplier contextSupplier) { context.queue(() -> { Player player = context.getPlayer(); if (player == null) return; - StorageManager.getStorage(player, SkillStorage.getKey()).handleSkillRelease(skillList, heldTick); + StorageManager.getStorage(player, SkillStorage.getKey()).handleSkillRelease(skillList, heldTick, keyNumber); }); } } diff --git a/common/src/main/java/com/github/manasmods/manascore/skill/SkillStorage.java b/common/src/main/java/com/github/manasmods/manascore/skill/SkillStorage.java index 4cd818c4..5752eca8 100644 --- a/common/src/main/java/com/github/manasmods/manascore/skill/SkillStorage.java +++ b/common/src/main/java/com/github/manasmods/manascore/skill/SkillStorage.java @@ -1,10 +1,7 @@ package com.github.manasmods.manascore.skill; import com.github.manasmods.manascore.ManasCore; -import com.github.manasmods.manascore.api.skill.ManasSkillInstance; -import com.github.manasmods.manascore.api.skill.SkillAPI; -import com.github.manasmods.manascore.api.skill.SkillEvents; -import com.github.manasmods.manascore.api.skill.Skills; +import com.github.manasmods.manascore.api.skill.*; import com.github.manasmods.manascore.api.storage.Storage; import com.github.manasmods.manascore.api.storage.StorageEvents; import com.github.manasmods.manascore.api.world.entity.EntityEvents; @@ -128,6 +125,10 @@ public void updateSkill(@NonNull ManasSkillInstance updatedInstance, boolean syn if (sync) markDirty(); } + public boolean learnSkill(@NonNull ManasSkill skill) { + return learnSkill(new ManasSkillInstance(skill)); + } + public boolean learnSkill(@NonNull ManasSkillInstance instance) { if (this.skillInstances.containsKey(instance.getSkillId())) { log.debug("Tried to register a deduplicate of {}.", instance.getSkillId()); @@ -148,6 +149,10 @@ public Optional getSkill(@NonNull ResourceLocation skillId) return Optional.ofNullable(this.skillInstances.get(skillId)); } + public void forgetSkill(ManasSkill skill) { + getSkill(skill).ifPresent(this::forgetSkill); + } + public void forgetSkill(ManasSkillInstance instance) { if (!this.skillInstances.containsKey(instance.getSkillId())) return; @@ -165,12 +170,12 @@ public void forEachSkill(BiConsumer skillInsta markDirty(); } - public void handleSkillRelease(List skillList, int heldTick) { + public void handleSkillRelease(List skillList, int heldTick, int keyNumber) { for (final ResourceLocation skillId : skillList) { getSkill(skillId).ifPresent(skill -> { if (!skill.canInteractSkill(getOwner())) return; if (skill.onCoolDown() && !skill.canIgnoreCoolDown(getOwner())) return; - skill.onRelease(getOwner(), heldTick); + skill.onRelease(getOwner(), heldTick, keyNumber); if (skill.isDirty()) markDirty(); UUID ownerID = getOwner().getUUID(); diff --git a/commonTest/src/main/java/com/github/manasmods/testmod/registry/RegisterTest.java b/commonTest/src/main/java/com/github/manasmods/testmod/registry/RegisterTest.java index 463913b7..ef41ec84 100644 --- a/commonTest/src/main/java/com/github/manasmods/testmod/registry/RegisterTest.java +++ b/commonTest/src/main/java/com/github/manasmods/testmod/registry/RegisterTest.java @@ -1,12 +1,9 @@ package com.github.manasmods.testmod.registry; import com.github.manasmods.manascore.ManasCore; -import com.github.manasmods.manascore.api.skill.ManasSkill; -import com.github.manasmods.manascore.skill.SkillRegistry; import com.mojang.serialization.MapCodec; import dev.architectury.registry.registries.RegistrySupplier; import net.minecraft.core.BlockPos; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.ai.attributes.RangedAttribute; import net.minecraft.world.entity.npc.Villager; @@ -46,7 +43,7 @@ public class RegisterTest { private static final RegistrySupplier> TEST_BLOCK_ENTITY = REGISTER.blockEntity("test_block_entity", TestBlockEntity::new) .withValidBlocks(TEST_BLOCK) .end(); - public static final RegistrySupplier TEST_SKILL = SkillRegistry.SKILLS.register(new ResourceLocation(ManasCore.MOD_ID, "test_skill"), TestSkill::new); + public static final RegistrySupplier TEST_SKILL = REGISTER.skill("test_skill", TestSkill::new).end(); public static void init() { ManasCore.Logger.info("Registered test content!"); diff --git a/commonTest/src/main/java/com/github/manasmods/testmod/registry/TestSkill.java b/commonTest/src/main/java/com/github/manasmods/testmod/registry/TestSkill.java index 685b8402..d1416b72 100644 --- a/commonTest/src/main/java/com/github/manasmods/testmod/registry/TestSkill.java +++ b/commonTest/src/main/java/com/github/manasmods/testmod/registry/TestSkill.java @@ -38,7 +38,7 @@ public void onToggleOff(ManasSkillInstance instance, LivingEntity entity) { ManasCore.Logger.info("Toggled Off"); } - public void onPressed(ManasSkillInstance instance, LivingEntity entity) { + public void onPressed(ManasSkillInstance instance, LivingEntity entity, int keyNumber) { ManasCore.Logger.info("I'm pressed"); } @@ -47,7 +47,7 @@ public boolean onHeld(ManasSkillInstance instance, LivingEntity living, int held return true; } - public void onRelease(ManasSkillInstance instance, LivingEntity entity, int heldTicks) { + public void onRelease(ManasSkillInstance instance, LivingEntity entity, int heldTicks, int keyNumber) { ManasCore.Logger.info("I'm released after {} ticks", heldTicks); } diff --git a/commonTest/src/main/java/com/github/manasmods/testmod/storage/StorageTest.java b/commonTest/src/main/java/com/github/manasmods/testmod/storage/StorageTest.java index aceefb57..a03fb1a5 100644 --- a/commonTest/src/main/java/com/github/manasmods/testmod/storage/StorageTest.java +++ b/commonTest/src/main/java/com/github/manasmods/testmod/storage/StorageTest.java @@ -1,7 +1,6 @@ package com.github.manasmods.testmod.storage; import com.github.manasmods.manascore.ManasCore; -import com.github.manasmods.manascore.api.skill.ManasSkillInstance; import com.github.manasmods.manascore.api.skill.SkillAPI; import com.github.manasmods.manascore.api.skill.Skills; import com.github.manasmods.manascore.api.storage.Storage; @@ -52,7 +51,7 @@ public static void init() { //Test giving Skills if (entity.getItem().is(Items.DIAMOND)) { Skills storage = SkillAPI.getSkillsFrom(player); - if (storage.learnSkill(new ManasSkillInstance(RegisterTest.TEST_SKILL.get()))) { + if (storage.learnSkill(RegisterTest.TEST_SKILL.get())) { ManasCore.Logger.info("Added Tested Skill!"); } } diff --git a/fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinFireRocketEntity.java b/fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinFireRocketEntity.java index 9c1513a9..068bf6e5 100644 --- a/fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinFireRocketEntity.java +++ b/fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinFireRocketEntity.java @@ -5,19 +5,48 @@ import com.github.manasmods.manascore.utils.Changeable; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.projectile.FireworkRocketEntity; +import net.minecraft.world.entity.projectile.Projectile; +import net.minecraft.world.level.Level; import net.minecraft.world.phys.HitResult; +import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; @Mixin(FireworkRocketEntity.class) -public abstract class MixinFireRocketEntity { +public abstract class MixinFireRocketEntity extends Projectile { + public MixinFireRocketEntity(EntityType entityType, Level level) { + super(entityType, level); + } + @Unique + @Nullable + private ProjectileHitResult onHitEventResult = null; @WrapOperation(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/projectile/FireworkRocketEntity;onHit(Lnet/minecraft/world/phys/HitResult;)V")) void onHit(FireworkRocketEntity instance, HitResult result, Operation original) { Changeable resultChangeable = Changeable.of(ProjectileHitResult.DEFAULT); EntityEvents.PROJECTILE_HIT.invoker().hit(result, instance, resultChangeable); + this.onHitEventResult = resultChangeable.get(); + + switch (this.onHitEventResult) { + case DEFAULT, HIT -> { + original.call(instance, result); + this.onHitEventResult = null; + } + case HIT_NO_DAMAGE -> this.discard(); + case PASS -> { + if (result.getType() != HitResult.Type.ENTITY) { + original.call(instance, result); + this.onHitEventResult = null; + } + } + } + } - if (!resultChangeable.get().equals(ProjectileHitResult.DEFAULT)) return; - original.call(instance, result); + @WrapOperation(method = "tick", at = @At(value = "FIELD", target = "Lnet/minecraft/world/entity/projectile/FireworkRocketEntity;hasImpulse:Z")) + void onImpulseSet(FireworkRocketEntity instance, boolean value, Operation original) { + if (this.onHitEventResult == null) original.call(instance, value); + this.onHitEventResult = null; } } diff --git a/fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinLocalPlayer.java b/fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinLocalPlayer.java new file mode 100644 index 00000000..996fd436 --- /dev/null +++ b/fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinLocalPlayer.java @@ -0,0 +1,35 @@ +package com.github.manasmods.manascore.fabric.core; + +import com.github.manasmods.manascore.api.world.entity.EntityEvents; +import com.github.manasmods.manascore.utils.Changeable; +import com.llamalad7.mixinextras.sugar.Local; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.LivingEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyVariable; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(LocalPlayer.class) +public class MixinLocalPlayer { + @ModifyVariable(method = "actuallyHurt", at = @At(value = "HEAD"), argsOnly = true) + float modifyDamage(float amount, @Local DamageSource damageSource) { + Changeable changeable = Changeable.of(amount); + if (EntityEvents.LIVING_HURT.invoker().hurt((LivingEntity) (Object) this, damageSource, changeable).isFalse()) return 0.0F; + return changeable.get(); + } + + @Inject(method = "actuallyHurt", at = @At(value = "HEAD"), cancellable = true) + void cancelActuallyHurt(DamageSource damageSource, float damageAmount, CallbackInfo ci) { + if (damageAmount <= 0F) ci.cancel(); + } + + @ModifyVariable(method = "actuallyHurt", at = @At(value = "LOAD"), argsOnly = true) + float modifyTotalDamage(float amount, @Local DamageSource damageSource) { + Changeable changeable = Changeable.of(amount); + if (EntityEvents.LIVING_DAMAGE.invoker().damage((LivingEntity) (Object) this, damageSource, changeable).isFalse()) return 0.0F; + return changeable.get(); + } +} diff --git a/fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinPlayer.java b/fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinPlayer.java new file mode 100644 index 00000000..d5bd8dce --- /dev/null +++ b/fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinPlayer.java @@ -0,0 +1,36 @@ +package com.github.manasmods.manascore.fabric.core; + +import com.github.manasmods.manascore.api.world.entity.EntityEvents; +import com.github.manasmods.manascore.utils.Changeable; +import com.llamalad7.mixinextras.sugar.Local; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.At.Shift; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyVariable; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(Player.class) +public class MixinPlayer { + @ModifyVariable(method = "actuallyHurt", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Player;getDamageAfterMagicAbsorb(Lnet/minecraft/world/damagesource/DamageSource;F)F", shift = Shift.BEFORE), argsOnly = true) + float modifyDamage(float amount, @Local DamageSource damageSource) { + Changeable changeable = Changeable.of(amount); + if (EntityEvents.LIVING_HURT.invoker().hurt((LivingEntity) (Object) this, damageSource, changeable).isFalse()) return 0.0F; + return changeable.get(); + } + + @Inject(method = "actuallyHurt", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Player;getDamageAfterMagicAbsorb(Lnet/minecraft/world/damagesource/DamageSource;F)F", shift = Shift.BEFORE), cancellable = true) + void cancelActuallyHurt(DamageSource damageSource, float damageAmount, CallbackInfo ci) { + if (damageAmount <= 0F) ci.cancel(); + } + + @ModifyVariable(method = "actuallyHurt", at = @At(value = "LOAD", ordinal = 6), argsOnly = true) + float modifyTotalDamage(float amount, @Local DamageSource damageSource) { + Changeable changeable = Changeable.of(amount); + if (EntityEvents.LIVING_DAMAGE.invoker().damage((LivingEntity) (Object) this, damageSource, changeable).isFalse()) return 0.0F; + return changeable.get(); + } +} diff --git a/fabric/src/main/resources/manascore.mixins.json b/fabric/src/main/resources/manascore.mixins.json index fe1f2cc1..75022081 100644 --- a/fabric/src/main/resources/manascore.mixins.json +++ b/fabric/src/main/resources/manascore.mixins.json @@ -11,11 +11,13 @@ "MixinLivingEntity", "MixinLlamaSpit", "MixinMob", + "MixinPlayer", "MixinShulkerBullet", "MixinStartAttacking", "MixinThrowableProjectile" ], "client": [ + "MixinLocalPlayer" ], "injectors": { "defaultRequire": 1 diff --git a/neoforge/src/main/java/com/github/manasmods/manascore/neoforge/NeoForgeCommonEventInvoker.java b/neoforge/src/main/java/com/github/manasmods/manascore/neoforge/NeoForgeCommonEventInvoker.java new file mode 100644 index 00000000..906beddf --- /dev/null +++ b/neoforge/src/main/java/com/github/manasmods/manascore/neoforge/NeoForgeCommonEventInvoker.java @@ -0,0 +1,54 @@ +package com.github.manasmods.manascore.neoforge; + +import com.github.manasmods.manascore.api.world.entity.EntityEvents; +import com.github.manasmods.manascore.utils.Changeable; +import net.minecraft.world.entity.LivingEntity; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.event.entity.ProjectileImpactEvent; +import net.neoforged.neoforge.event.entity.living.LivingChangeTargetEvent; +import net.neoforged.neoforge.event.entity.living.LivingDamageEvent; +import net.neoforged.neoforge.event.entity.living.LivingHurtEvent; + +@Mod.EventBusSubscriber +public class NeoForgeCommonEventInvoker { + private NeoForgeCommonEventInvoker() { + } + + @SubscribeEvent + static void onLivingChangeTarget(final LivingChangeTargetEvent e) { + Changeable changeableTarget = Changeable.of(e.getNewTarget()); + if (EntityEvents.LIVING_CHANGE_TARGET.invoker().changeTarget(e.getEntity(), changeableTarget).isFalse()) { + e.setCanceled(true); + } else { + e.setNewTarget(changeableTarget.get()); + } + } + + @SubscribeEvent + static void onLivingHurt(final LivingHurtEvent e) { + Changeable amount = Changeable.of(e.getAmount()); + if (EntityEvents.LIVING_HURT.invoker().hurt(e.getEntity(), e.getSource(), amount).isFalse()) { + e.setCanceled(true); + } else { + e.setAmount(amount.get()); + } + } + + @SubscribeEvent + static void onLivingDamage(final LivingDamageEvent e) { + Changeable amount = Changeable.of(e.getAmount()); + if (EntityEvents.LIVING_DAMAGE.invoker().damage(e.getEntity(), e.getSource(), amount).isFalse()) { + e.setCanceled(true); + } else { + e.setAmount(amount.get()); + } + } + + @SubscribeEvent + static void onProjectileHit(final ProjectileImpactEvent e) { + Changeable result = Changeable.of(EntityEvents.ProjectileHitResult.DEFAULT); + EntityEvents.PROJECTILE_HIT.invoker().hit(e.getRayTraceResult(), e.getProjectile(), result); + if (result.get().equals(EntityEvents.ProjectileHitResult.PASS)) e.setCanceled(true); + } +} From 8b268684cf52e13c7a457dff77c518e3777908af Mon Sep 17 00:00:00 2001 From: Minh Date: Wed, 3 Jan 2024 20:13:10 +0700 Subject: [PATCH 4/9] Professor says so. --- .../manasmods/manascore/api/skill/Skills.java | 8 +++-- .../manascore/skill/SkillStorage.java | 8 ----- .../fabric/core/MixinLocalPlayer.java | 35 ------------------- .../manascore/fabric/core/MixinPlayer.java | 4 +-- .../src/main/resources/manascore.mixins.json | 3 -- 5 files changed, 8 insertions(+), 50 deletions(-) delete mode 100644 fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinLocalPlayer.java diff --git a/common/src/main/java/com/github/manasmods/manascore/api/skill/Skills.java b/common/src/main/java/com/github/manasmods/manascore/api/skill/Skills.java index 85e7780c..7762c2c1 100644 --- a/common/src/main/java/com/github/manasmods/manascore/api/skill/Skills.java +++ b/common/src/main/java/com/github/manasmods/manascore/api/skill/Skills.java @@ -15,7 +15,9 @@ public interface Skills { void updateSkill(ManasSkillInstance updatedInstance, boolean sync); - boolean learnSkill(ManasSkill skill); + default boolean learnSkill(@NonNull ManasSkill skill) { + return learnSkill(new ManasSkillInstance(skill)); + } boolean learnSkill(ManasSkillInstance instance); @@ -25,7 +27,9 @@ default Optional getSkill(@NonNull ManasSkill skill) { return getSkill(skill.getRegistryName()); } - void forgetSkill(ManasSkill skill); + default void forgetSkill(ManasSkill skill) { + getSkill(skill).ifPresent(this::forgetSkill); + } void forgetSkill(ManasSkillInstance instance); diff --git a/common/src/main/java/com/github/manasmods/manascore/skill/SkillStorage.java b/common/src/main/java/com/github/manasmods/manascore/skill/SkillStorage.java index 5752eca8..25c3ac05 100644 --- a/common/src/main/java/com/github/manasmods/manascore/skill/SkillStorage.java +++ b/common/src/main/java/com/github/manasmods/manascore/skill/SkillStorage.java @@ -125,10 +125,6 @@ public void updateSkill(@NonNull ManasSkillInstance updatedInstance, boolean syn if (sync) markDirty(); } - public boolean learnSkill(@NonNull ManasSkill skill) { - return learnSkill(new ManasSkillInstance(skill)); - } - public boolean learnSkill(@NonNull ManasSkillInstance instance) { if (this.skillInstances.containsKey(instance.getSkillId())) { log.debug("Tried to register a deduplicate of {}.", instance.getSkillId()); @@ -149,10 +145,6 @@ public Optional getSkill(@NonNull ResourceLocation skillId) return Optional.ofNullable(this.skillInstances.get(skillId)); } - public void forgetSkill(ManasSkill skill) { - getSkill(skill).ifPresent(this::forgetSkill); - } - public void forgetSkill(ManasSkillInstance instance) { if (!this.skillInstances.containsKey(instance.getSkillId())) return; diff --git a/fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinLocalPlayer.java b/fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinLocalPlayer.java deleted file mode 100644 index 996fd436..00000000 --- a/fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinLocalPlayer.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.github.manasmods.manascore.fabric.core; - -import com.github.manasmods.manascore.api.world.entity.EntityEvents; -import com.github.manasmods.manascore.utils.Changeable; -import com.llamalad7.mixinextras.sugar.Local; -import net.minecraft.client.player.LocalPlayer; -import net.minecraft.world.damagesource.DamageSource; -import net.minecraft.world.entity.LivingEntity; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.ModifyVariable; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(LocalPlayer.class) -public class MixinLocalPlayer { - @ModifyVariable(method = "actuallyHurt", at = @At(value = "HEAD"), argsOnly = true) - float modifyDamage(float amount, @Local DamageSource damageSource) { - Changeable changeable = Changeable.of(amount); - if (EntityEvents.LIVING_HURT.invoker().hurt((LivingEntity) (Object) this, damageSource, changeable).isFalse()) return 0.0F; - return changeable.get(); - } - - @Inject(method = "actuallyHurt", at = @At(value = "HEAD"), cancellable = true) - void cancelActuallyHurt(DamageSource damageSource, float damageAmount, CallbackInfo ci) { - if (damageAmount <= 0F) ci.cancel(); - } - - @ModifyVariable(method = "actuallyHurt", at = @At(value = "LOAD"), argsOnly = true) - float modifyTotalDamage(float amount, @Local DamageSource damageSource) { - Changeable changeable = Changeable.of(amount); - if (EntityEvents.LIVING_DAMAGE.invoker().damage((LivingEntity) (Object) this, damageSource, changeable).isFalse()) return 0.0F; - return changeable.get(); - } -} diff --git a/fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinPlayer.java b/fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinPlayer.java index d5bd8dce..d02da0a3 100644 --- a/fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinPlayer.java +++ b/fabric/src/main/java/com/github/manasmods/manascore/fabric/core/MixinPlayer.java @@ -15,14 +15,14 @@ @Mixin(Player.class) public class MixinPlayer { - @ModifyVariable(method = "actuallyHurt", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Player;getDamageAfterMagicAbsorb(Lnet/minecraft/world/damagesource/DamageSource;F)F", shift = Shift.BEFORE), argsOnly = true) + @ModifyVariable(method = "actuallyHurt", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Player;getDamageAfterArmorAbsorb(Lnet/minecraft/world/damagesource/DamageSource;F)F", shift = Shift.BEFORE), argsOnly = true) float modifyDamage(float amount, @Local DamageSource damageSource) { Changeable changeable = Changeable.of(amount); if (EntityEvents.LIVING_HURT.invoker().hurt((LivingEntity) (Object) this, damageSource, changeable).isFalse()) return 0.0F; return changeable.get(); } - @Inject(method = "actuallyHurt", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Player;getDamageAfterMagicAbsorb(Lnet/minecraft/world/damagesource/DamageSource;F)F", shift = Shift.BEFORE), cancellable = true) + @Inject(method = "actuallyHurt", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Player;getDamageAfterArmorAbsorb(Lnet/minecraft/world/damagesource/DamageSource;F)F", shift = Shift.BEFORE), cancellable = true) void cancelActuallyHurt(DamageSource damageSource, float damageAmount, CallbackInfo ci) { if (damageAmount <= 0F) ci.cancel(); } diff --git a/fabric/src/main/resources/manascore.mixins.json b/fabric/src/main/resources/manascore.mixins.json index 75022081..55161857 100644 --- a/fabric/src/main/resources/manascore.mixins.json +++ b/fabric/src/main/resources/manascore.mixins.json @@ -16,9 +16,6 @@ "MixinStartAttacking", "MixinThrowableProjectile" ], - "client": [ - "MixinLocalPlayer" - ], "injectors": { "defaultRequire": 1 } From 36325020b9915b55b9894c2d422e562805376af4 Mon Sep 17 00:00:00 2001 From: Christian Raoulis Date: Wed, 3 Jan 2024 14:19:31 +0100 Subject: [PATCH 5/9] add Skills#forgetSkill utility overloads --- .../manasmods/manascore/api/skill/Skills.java | 13 +++++++++---- .../manasmods/manascore/skill/SkillStorage.java | 11 ++++++++--- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/common/src/main/java/com/github/manasmods/manascore/api/skill/Skills.java b/common/src/main/java/com/github/manasmods/manascore/api/skill/Skills.java index 7762c2c1..6ce1d2e3 100644 --- a/common/src/main/java/com/github/manasmods/manascore/api/skill/Skills.java +++ b/common/src/main/java/com/github/manasmods/manascore/api/skill/Skills.java @@ -3,6 +3,7 @@ import com.github.manasmods.manascore.skill.SkillStorage; import lombok.NonNull; import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.NotNull; import java.util.Collection; import java.util.Optional; @@ -21,17 +22,21 @@ default boolean learnSkill(@NonNull ManasSkill skill) { boolean learnSkill(ManasSkillInstance instance); - Optional getSkill(@NonNull ResourceLocation skillId); + Optional getSkill(@NotNull ResourceLocation skillId); default Optional getSkill(@NonNull ManasSkill skill) { return getSkill(skill.getRegistryName()); } - default void forgetSkill(ManasSkill skill) { - getSkill(skill).ifPresent(this::forgetSkill); + void forgetSkill(@NotNull ResourceLocation skillId); + + default void forgetSkill(@NonNull ManasSkill skill) { + forgetSkill(skill.getRegistryName()); } - void forgetSkill(ManasSkillInstance instance); + default void forgetSkill(@NonNull ManasSkillInstance instance) { + forgetSkill(instance.getSkill()); + } void forEachSkill(BiConsumer skillInstanceConsumer); } diff --git a/common/src/main/java/com/github/manasmods/manascore/skill/SkillStorage.java b/common/src/main/java/com/github/manasmods/manascore/skill/SkillStorage.java index 25c3ac05..5324626a 100644 --- a/common/src/main/java/com/github/manasmods/manascore/skill/SkillStorage.java +++ b/common/src/main/java/com/github/manasmods/manascore/skill/SkillStorage.java @@ -1,7 +1,10 @@ package com.github.manasmods.manascore.skill; import com.github.manasmods.manascore.ManasCore; -import com.github.manasmods.manascore.api.skill.*; +import com.github.manasmods.manascore.api.skill.ManasSkillInstance; +import com.github.manasmods.manascore.api.skill.SkillAPI; +import com.github.manasmods.manascore.api.skill.SkillEvents; +import com.github.manasmods.manascore.api.skill.Skills; import com.github.manasmods.manascore.api.storage.Storage; import com.github.manasmods.manascore.api.storage.StorageEvents; import com.github.manasmods.manascore.api.world.entity.EntityEvents; @@ -20,6 +23,7 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.Collection; @@ -145,8 +149,9 @@ public Optional getSkill(@NonNull ResourceLocation skillId) return Optional.ofNullable(this.skillInstances.get(skillId)); } - public void forgetSkill(ManasSkillInstance instance) { - if (!this.skillInstances.containsKey(instance.getSkillId())) return; + public void forgetSkill(@NotNull ResourceLocation skillId) { + if (!this.skillInstances.containsKey(skillId)) return; + ManasSkillInstance instance = this.skillInstances.get(skillId); EventResult result = SkillEvents.REMOVE_SKILL.invoker().removeSkill(instance, getOwner()); if (result.isFalse()) return; From 0f4f0924fbcfa99da72ca3a7e7dd63146d47b0ea Mon Sep 17 00:00:00 2001 From: Christian Raoulis Date: Wed, 3 Jan 2024 14:20:53 +0100 Subject: [PATCH 6/9] add Skills#learnSkill utility overloads --- .../com/github/manasmods/manascore/api/skill/Skills.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/com/github/manasmods/manascore/api/skill/Skills.java b/common/src/main/java/com/github/manasmods/manascore/api/skill/Skills.java index 6ce1d2e3..b1e7b6ef 100644 --- a/common/src/main/java/com/github/manasmods/manascore/api/skill/Skills.java +++ b/common/src/main/java/com/github/manasmods/manascore/api/skill/Skills.java @@ -16,6 +16,10 @@ public interface Skills { void updateSkill(ManasSkillInstance updatedInstance, boolean sync); + default boolean learnSkill(@NotNull ResourceLocation skillId) { + return learnSkill(SkillAPI.getSkillRegistry().get(skillId).createDefaultInstance()); + } + default boolean learnSkill(@NonNull ManasSkill skill) { return learnSkill(new ManasSkillInstance(skill)); } @@ -35,7 +39,7 @@ default void forgetSkill(@NonNull ManasSkill skill) { } default void forgetSkill(@NonNull ManasSkillInstance instance) { - forgetSkill(instance.getSkill()); + forgetSkill(instance.getSkillId()); } void forEachSkill(BiConsumer skillInstanceConsumer); From e3b9ae91f37953525a7f7ba3871e6a13d93b0ed5 Mon Sep 17 00:00:00 2001 From: Christian Raoulis Date: Wed, 3 Jan 2024 14:21:37 +0100 Subject: [PATCH 7/9] fix Skills#learnSkill not using the correct instance creation --- .../java/com/github/manasmods/manascore/api/skill/Skills.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/com/github/manasmods/manascore/api/skill/Skills.java b/common/src/main/java/com/github/manasmods/manascore/api/skill/Skills.java index b1e7b6ef..06dc8fbf 100644 --- a/common/src/main/java/com/github/manasmods/manascore/api/skill/Skills.java +++ b/common/src/main/java/com/github/manasmods/manascore/api/skill/Skills.java @@ -21,7 +21,7 @@ default boolean learnSkill(@NotNull ResourceLocation skillId) { } default boolean learnSkill(@NonNull ManasSkill skill) { - return learnSkill(new ManasSkillInstance(skill)); + return learnSkill(skill.createDefaultInstance()); } boolean learnSkill(ManasSkillInstance instance); From c85c3a908a6b64322e69b5d1527ac9cbcec64c71 Mon Sep 17 00:00:00 2001 From: Christian Raoulis Date: Wed, 3 Jan 2024 14:22:48 +0100 Subject: [PATCH 8/9] make constructor of ManasSkillInstance protected --- .../manasmods/manascore/api/skill/ManasSkillInstance.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/com/github/manasmods/manascore/api/skill/ManasSkillInstance.java b/common/src/main/java/com/github/manasmods/manascore/api/skill/ManasSkillInstance.java index 4e5b4bb4..66d3071f 100644 --- a/common/src/main/java/com/github/manasmods/manascore/api/skill/ManasSkillInstance.java +++ b/common/src/main/java/com/github/manasmods/manascore/api/skill/ManasSkillInstance.java @@ -32,7 +32,7 @@ public class ManasSkillInstance { private boolean dirty = false; protected final RegistrySupplier skillRegistryObject; - public ManasSkillInstance(ManasSkill skill) { + protected ManasSkillInstance(ManasSkill skill) { this.skillRegistryObject = SkillAPI.getSkillRegistry().delegate(SkillAPI.getSkillRegistry().getId(skill)); } From 6f37f150e5c3e7748d7dc28aa1993f34a4044616 Mon Sep 17 00:00:00 2001 From: Christian Raoulis Date: Wed, 3 Jan 2024 14:25:24 +0100 Subject: [PATCH 9/9] make ManasSkillInstance.fromNBT explicit showing a possible NPE --- .../manasmods/manascore/api/skill/ManasSkillInstance.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/com/github/manasmods/manascore/api/skill/ManasSkillInstance.java b/common/src/main/java/com/github/manasmods/manascore/api/skill/ManasSkillInstance.java index 66d3071f..8738705e 100644 --- a/common/src/main/java/com/github/manasmods/manascore/api/skill/ManasSkillInstance.java +++ b/common/src/main/java/com/github/manasmods/manascore/api/skill/ManasSkillInstance.java @@ -106,7 +106,7 @@ public void deserialize(CompoundTag tag) { *

* The {@link CompoundTag} has to be created though {@link ManasSkillInstance#toNBT()} */ - public static ManasSkillInstance fromNBT(CompoundTag tag) { + public static ManasSkillInstance fromNBT(CompoundTag tag) throws NullPointerException { ResourceLocation skillLocation = ResourceLocation.tryParse(tag.getString("skill")); ManasSkillInstance instance = Objects.requireNonNull(SkillAPI.getSkillRegistry().get(skillLocation)).createDefaultInstance(); instance.deserialize(tag);