diff --git a/build.gradle b/build.gradle index c2f0e654..44f7224a 100644 --- a/build.gradle +++ b/build.gradle @@ -35,7 +35,7 @@ minecraft { copyIdeResources = true // generateRunFolders = true - // accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') + accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') runs { client { diff --git a/gradle.properties b/gradle.properties index 3c455364..b504b6ba 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,10 +7,10 @@ forgeVersion=43.3.5 # Parchment Version parchmentVersion=2022.11.27 # Mod Information see https://mcforge.readthedocs.io/en/1.18.x/gettingstarted/versioning/#examples -modVersion=2.1.4.0 +modVersion=2.1.4.6 modId=manascore # Mixin Extras -mixinExtrasVersion=0.3.2 +mixinExtrasVersion=0.2.0 # Photon: https://modrinth.com/mod/photon-editor/versions?l=forge&g=1.19.2 photonVersion=1.0.7.a # LDLib: https://modrinth.com/mod/ldlib/versions?l=forge&g=1.19.2 diff --git a/src/main/java/com/github/manasmods/manascore/ManasCore.java b/src/main/java/com/github/manasmods/manascore/ManasCore.java index 78c9fb14..7f666f04 100644 --- a/src/main/java/com/github/manasmods/manascore/ManasCore.java +++ b/src/main/java/com/github/manasmods/manascore/ManasCore.java @@ -5,14 +5,11 @@ package com.github.manasmods.manascore; import com.github.manasmods.manascore.attribute.ManasCoreAttributes; -import com.github.manasmods.manascore.config.ManasCoreConfig; import com.github.manasmods.manascore.network.ManasCoreNetwork; import com.github.manasmods.manascore.skill.SkillRegistry; import lombok.Getter; import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.config.ModConfig.Type; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import org.apache.logging.log4j.LogManager; @@ -27,7 +24,6 @@ public final class ManasCore { private static final Logger logger = LogManager.getLogger(); public ManasCore() { - ModLoadingContext.get().registerConfig(Type.COMMON, ManasCoreConfig.SPEC); IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); ManasCoreAttributes.register(modEventBus); SkillRegistry.register(modEventBus); diff --git a/src/main/java/com/github/manasmods/manascore/api/skills/ManasSkill.java b/src/main/java/com/github/manasmods/manascore/api/skills/ManasSkill.java index 41b2452e..3a1e5f0b 100644 --- a/src/main/java/com/github/manasmods/manascore/api/skills/ManasSkill.java +++ b/src/main/java/com/github/manasmods/manascore/api/skills/ManasSkill.java @@ -226,8 +226,9 @@ public void addHeldAttributeModifiers(ManasSkillInstance instance, LivingEntity * Removes the attribute modifiers of this skill from the {@link LivingEntity} holding the skill activation button. * * @param entity Affected {@link LivingEntity} owning this Skill. + * @param instance Affected {@link ManasSkillInstance} */ - public void removeHeldAttributeModifiers(LivingEntity entity) { + public void removeHeldAttributeModifiers(ManasSkillInstance instance, LivingEntity entity) { for(Map.Entry entry : this.onHeldAttributeModifiers.entrySet()) { AttributeInstance attributeinstance = entity.getAttributes().getInstance(entry.getKey()); if (attributeinstance != null) attributeinstance.removeModifier(entry.getValue()); diff --git a/src/main/java/com/github/manasmods/manascore/api/skills/ManasSkillInstance.java b/src/main/java/com/github/manasmods/manascore/api/skills/ManasSkillInstance.java index 3e15e690..1e6d3cc9 100644 --- a/src/main/java/com/github/manasmods/manascore/api/skills/ManasSkillInstance.java +++ b/src/main/java/com/github/manasmods/manascore/api/skills/ManasSkillInstance.java @@ -393,6 +393,15 @@ public void addHeldAttributeModifiers(LivingEntity entity) { this.getSkill().addHeldAttributeModifiers(this, entity); } + /** + * Removes the attribute modifiers of this instance from the {@link LivingEntity} holding the skill activation button. + * + * @param entity Affected {@link LivingEntity} owning this Skill. + */ + public void removeHeldAttributeModifiers(LivingEntity entity) { + this.getSkill().removeHeldAttributeModifiers(this, entity); + } + /** * Called when the {@link LivingEntity} owning this Skill toggles this {@link ManasSkill} type of this instance on. * diff --git a/src/main/java/com/github/manasmods/manascore/api/skills/SkillAPI.java b/src/main/java/com/github/manasmods/manascore/api/skills/SkillAPI.java index ad6ce4e2..756be672 100644 --- a/src/main/java/com/github/manasmods/manascore/api/skills/SkillAPI.java +++ b/src/main/java/com/github/manasmods/manascore/api/skills/SkillAPI.java @@ -51,8 +51,8 @@ public static SkillStorage getSkillsFrom(Entity entity) { * * @see InternalSkillPacketActions#sendSkillActivationPacket */ - public static void skillActivationPacket(int keyNumber) { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> InternalSkillPacketActions.sendSkillActivationPacket(keyNumber)); + public static void skillActivationPacket(ResourceLocation skill, int keyNumber) { + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> InternalSkillPacketActions.sendSkillActivationPacket(skill, keyNumber)); } /** @@ -61,8 +61,8 @@ public static void skillActivationPacket(int keyNumber) { * * @see InternalSkillPacketActions#sendSkillReleasePacket */ - public static void skillReleasePacket(int keyNumber, int heldTicks) { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> InternalSkillPacketActions.sendSkillReleasePacket(keyNumber, heldTicks)); + public static void skillReleasePacket(ResourceLocation skill, int keyNumber, int heldTicks) { + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> InternalSkillPacketActions.sendSkillReleasePacket(skill, keyNumber, heldTicks)); } /** @@ -71,7 +71,7 @@ public static void skillReleasePacket(int keyNumber, int heldTicks) { * * @see InternalSkillPacketActions#sendSkillTogglePacket */ - public static void skillTogglePacket() { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> InternalSkillPacketActions::sendSkillTogglePacket); + public static void skillTogglePacket(ResourceLocation skill) { + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> InternalSkillPacketActions.sendSkillTogglePacket(skill)); } } \ No newline at end of file diff --git a/src/main/java/com/github/manasmods/manascore/api/skills/TickingSkill.java b/src/main/java/com/github/manasmods/manascore/api/skills/TickingSkill.java index 1f21f1ee..686a9c13 100644 --- a/src/main/java/com/github/manasmods/manascore/api/skills/TickingSkill.java +++ b/src/main/java/com/github/manasmods/manascore/api/skills/TickingSkill.java @@ -3,31 +3,38 @@ import com.github.manasmods.manascore.api.skills.capability.SkillStorage; import lombok.Getter; import net.minecraft.world.entity.LivingEntity; +import org.jetbrains.annotations.Nullable; import java.util.Optional; +@Getter public class TickingSkill { private int duration = 0; - @Getter private final ManasSkill skill; public TickingSkill(ManasSkill skill) { this.skill = skill; } - public boolean tick(SkillStorage storage, LivingEntity entity) { - Optional optional = storage.getSkill(skill); - if (optional.isEmpty()) return false; + public @Nullable ManasSkillInstance getSkillInstance(SkillStorage storage, LivingEntity entity) { + Optional optional = storage.getSkill(this.getSkill()); + return optional.orElse(null); + } - ManasSkillInstance instance = optional.get(); + public boolean tick(SkillStorage storage, LivingEntity entity) { + ManasSkillInstance instance = this.getSkillInstance(storage, entity); + if (instance == null) return false; if (reachedMaxDuration(instance, entity)) return false; - if (!instance.canInteractSkill(entity)) return false; + if (!instance.canInteractSkill(entity)) { + instance.onRelease(entity, this.getDuration()); + return false; + } return instance.onHeld(entity, this.duration++); } public boolean reachedMaxDuration(ManasSkillInstance instance, LivingEntity entity) { int maxDuration = instance.getMaxHeldTime(entity); if (maxDuration == -1) return false; - return duration >= maxDuration; + return this.getDuration() >= maxDuration; } } diff --git a/src/main/java/com/github/manasmods/manascore/attribute/ManasCoreAttributeHandler.java b/src/main/java/com/github/manasmods/manascore/attribute/ManasCoreAttributeHandler.java index a2a34e14..a6df71ee 100644 --- a/src/main/java/com/github/manasmods/manascore/attribute/ManasCoreAttributeHandler.java +++ b/src/main/java/com/github/manasmods/manascore/attribute/ManasCoreAttributeHandler.java @@ -87,14 +87,15 @@ public static void applyEntityCrit(final LivingHurtEvent e) { @SubscribeEvent(priority = EventPriority.HIGH) public static void modifyCrit(final CriticalHitEvent e) { + float vanillaMultiplier = e.getDamageModifier() / e.getOldDamageModifier(); + float critMultiplier = (float) e.getEntity().getAttributeValue(ManasCoreAttributes.CRIT_MULTIPLIER.get()); if (e.isVanillaCritical()) { - e.setDamageModifier(e.getDamageModifier() * (float) e.getEntity().getAttributeValue(ManasCoreAttributes.CRIT_MULTIPLIER.get())); + e.setDamageModifier(vanillaMultiplier * critMultiplier); return; } double critChance = e.getEntity().getAttributeValue(ManasCoreAttributes.CRIT_CHANCE.get()) / 100; // convert to % - float critMultiplier = (float) e.getEntity().getAttributeValue(ManasCoreAttributes.CRIT_MULTIPLIER.get()); - CriticalChanceEvent event = new CriticalChanceEvent(e.getEntity(), e.getTarget(), e.getDamageModifier() * critMultiplier, critChance); + CriticalChanceEvent event = new CriticalChanceEvent(e.getEntity(), e.getTarget(), vanillaMultiplier * critMultiplier, critChance); if (MinecraftForge.EVENT_BUS.post(event)) return; RandomSource random = e.getEntity().getRandom(); diff --git a/src/main/java/com/github/manasmods/manascore/capability/skill/TestSkill.java b/src/main/java/com/github/manasmods/manascore/capability/skill/TestSkill.java index 035bc32a..21646dee 100644 --- a/src/main/java/com/github/manasmods/manascore/capability/skill/TestSkill.java +++ b/src/main/java/com/github/manasmods/manascore/capability/skill/TestSkill.java @@ -13,7 +13,7 @@ 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.ThrownTrident; +import net.minecraft.world.entity.projectile.AbstractArrow; import net.minecraft.world.item.Items; import net.minecraft.world.phys.BlockHitResult; import net.minecraftforge.common.MinecraftForge; @@ -35,6 +35,10 @@ public boolean canTick(ManasSkillInstance instance, LivingEntity entity) { return instance.isToggled(); } + public boolean canBeToggled(ManasSkillInstance instance, LivingEntity entity) { + return entity.isShiftKeyDown(); + } + public void onToggleOn(ManasSkillInstance instance, LivingEntity entity) { log.debug("Toggled On"); } @@ -104,7 +108,7 @@ public void onTakenDamage(ManasSkillInstance instance, LivingDamageEvent event) } public void onProjectileHit(ManasSkillInstance instance, LivingEntity living, ProjectileImpactEvent event) { - if (event.getProjectile() instanceof ThrownTrident) { + if (event.getProjectile() instanceof AbstractArrow) { log.debug("Dodged"); event.setCanceled(true); } diff --git a/src/main/java/com/github/manasmods/manascore/capability/skill/event/InternalSkillPacketActions.java b/src/main/java/com/github/manasmods/manascore/capability/skill/event/InternalSkillPacketActions.java index 1964d584..1d4f0287 100644 --- a/src/main/java/com/github/manasmods/manascore/capability/skill/event/InternalSkillPacketActions.java +++ b/src/main/java/com/github/manasmods/manascore/capability/skill/event/InternalSkillPacketActions.java @@ -1,8 +1,6 @@ package com.github.manasmods.manascore.capability.skill.event; import com.github.manasmods.manascore.api.skills.ManasSkill; -import com.github.manasmods.manascore.api.skills.ManasSkillInstance; -import com.github.manasmods.manascore.api.skills.SkillAPI; import com.github.manasmods.manascore.api.skills.event.SkillActivationEvent; import com.github.manasmods.manascore.api.skills.event.SkillReleaseEvent; import com.github.manasmods.manascore.api.skills.event.SkillToggleEvent; @@ -13,12 +11,8 @@ import net.minecraft.client.Minecraft; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Player; -import net.minecraftforge.common.MinecraftForge; import org.jetbrains.annotations.ApiStatus; -import java.util.ArrayList; -import java.util.List; - @ApiStatus.Internal @ApiStatus.AvailableSince("2.0.18.0") public final class InternalSkillPacketActions { @@ -26,59 +20,32 @@ public final class InternalSkillPacketActions { * This Method filters {@link ManasSkill} that meets the conditions of the {@link SkillActivationEvent} then send packet for them. * Only executes on client using the dist executor. */ - public static void sendSkillActivationPacket(int keyNumber) { + public static void sendSkillActivationPacket(ResourceLocation skill, int keyNumber) { var minecraft = Minecraft.getInstance(); Player player = minecraft.player; if (player == null) return; - List packetSkills = new ArrayList<>(); - - for (ManasSkillInstance skillInstance : SkillAPI.getSkillsFrom(player).getLearnedSkills()) { - SkillActivationEvent event = new SkillActivationEvent(skillInstance, player, keyNumber); - if (MinecraftForge.EVENT_BUS.post(event)) continue; - packetSkills.add(skillInstance.getSkillId()); - } - - if (packetSkills.isEmpty()) return; - ManasCoreNetwork.INSTANCE.sendToServer(new RequestSkillActivationPacket(packetSkills, keyNumber)); + ManasCoreNetwork.INSTANCE.sendToServer(new RequestSkillActivationPacket(skill, keyNumber)); } /** * This Method filters {@link ManasSkill} that meets the conditions of the {@link SkillReleaseEvent} then send packet for them. * Only executes on client using the dist executor. */ - public static void sendSkillReleasePacket(int keyNumber, int heldTicks) { + public static void sendSkillReleasePacket(ResourceLocation skill, int keyNumber, int heldTicks) { var minecraft = Minecraft.getInstance(); Player player = minecraft.player; if (player == null) return; - List packetSkills = new ArrayList<>(); - - for (ManasSkillInstance skillInstance : SkillAPI.getSkillsFrom(player).getLearnedSkills()) { - SkillReleaseEvent event = new SkillReleaseEvent(skillInstance, player, keyNumber, heldTicks); - if (MinecraftForge.EVENT_BUS.post(event)) continue; - packetSkills.add(skillInstance.getSkillId()); - } - - if (packetSkills.isEmpty()) return; - ManasCoreNetwork.INSTANCE.sendToServer(new RequestSkillReleasePacket(packetSkills, keyNumber, heldTicks)); + ManasCoreNetwork.INSTANCE.sendToServer(new RequestSkillReleasePacket(skill, keyNumber, heldTicks)); } /** * This Method filters {@link ManasSkill} that meets the conditions of the {@link SkillToggleEvent} then send packet for them. * Only executes on client using the dist executor. */ - public static void sendSkillTogglePacket() { + public static void sendSkillTogglePacket(ResourceLocation skill) { var minecraft = Minecraft.getInstance(); Player player = minecraft.player; if (player == null) return; - List packetSkills = new ArrayList<>(); - - for (ManasSkillInstance skillInstance : SkillAPI.getSkillsFrom(player).getLearnedSkills()) { - SkillToggleEvent event = new SkillToggleEvent(skillInstance, player, !skillInstance.isToggled()); - if (MinecraftForge.EVENT_BUS.post(event)) continue; - packetSkills.add(skillInstance.getSkillId()); - } - - if (packetSkills.isEmpty()) return; - ManasCoreNetwork.INSTANCE.sendToServer(new RequestSkillTogglePacket(packetSkills)); + ManasCoreNetwork.INSTANCE.sendToServer(new RequestSkillTogglePacket(skill)); } } diff --git a/src/main/java/com/github/manasmods/manascore/capability/skill/event/ServerEventListenerHandler.java b/src/main/java/com/github/manasmods/manascore/capability/skill/event/ServerEventListenerHandler.java index bf896017..1d130ce4 100644 --- a/src/main/java/com/github/manasmods/manascore/capability/skill/event/ServerEventListenerHandler.java +++ b/src/main/java/com/github/manasmods/manascore/capability/skill/event/ServerEventListenerHandler.java @@ -8,9 +8,11 @@ import com.github.manasmods.manascore.api.skills.event.SkillDamageEvent; import com.github.manasmods.manascore.api.skills.event.UnlockSkillEvent; import com.google.common.collect.Multimap; +import it.unimi.dsi.fastutil.ints.IntOpenHashSet; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.projectile.AbstractArrow; import net.minecraft.world.phys.EntityHitResult; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.ProjectileImpactEvent; @@ -149,6 +151,10 @@ public static void onProjectileHit(final ProjectileImpactEvent e) { if (!skillInstance.canInteractSkill(living)) continue; skillInstance.onProjectileHit(living, e); + if (e.isCanceled() && e.getProjectile() instanceof AbstractArrow arrow) { + if (arrow.piercingIgnoreEntityIds == null) arrow.piercingIgnoreEntityIds = new IntOpenHashSet(10); + arrow.piercingIgnoreEntityIds.add(living.getId()); + } } skillStorage.syncChanges(); } @@ -216,8 +222,25 @@ public static void onLogOut(final PlayerEvent.PlayerLoggedOutEvent e) { Player player = e.getEntity(); Multimap multimap = TickEventListenerHandler.tickingSkills; if (multimap.containsKey(player.getUUID())) { - for (TickingSkill tickingSkill : multimap.get(player.getUUID())) - tickingSkill.getSkill().removeHeldAttributeModifiers(player); + for (TickingSkill tickingSkill : multimap.get(player.getUUID())) { + ManasSkillInstance instance = tickingSkill.getSkillInstance(SkillAPI.getSkillsFrom(player), player); + if (instance == null) continue; + instance.removeHeldAttributeModifiers(player); + } + multimap.removeAll(player.getUUID()); + } + } + + @SubscribeEvent + public static void onChangingDimension(final PlayerEvent.PlayerChangedDimensionEvent e) { + Player player = e.getEntity(); + Multimap multimap = TickEventListenerHandler.tickingSkills; + if (multimap.containsKey(player.getUUID())) { + for (TickingSkill tickingSkill : multimap.get(player.getUUID())) { + ManasSkillInstance instance = tickingSkill.getSkillInstance(SkillAPI.getSkillsFrom(player), player); + if (instance == null) continue; + instance.removeHeldAttributeModifiers(player); + } multimap.removeAll(player.getUUID()); } } diff --git a/src/main/java/com/github/manasmods/manascore/client/keybinding/KeybindingRegistry.java b/src/main/java/com/github/manasmods/manascore/client/keybinding/KeybindingRegistry.java index c65d60e7..5071a97e 100644 --- a/src/main/java/com/github/manasmods/manascore/client/keybinding/KeybindingRegistry.java +++ b/src/main/java/com/github/manasmods/manascore/client/keybinding/KeybindingRegistry.java @@ -5,6 +5,7 @@ import com.github.manasmods.manascore.api.client.keybinding.ManasKeybinding; import com.github.manasmods.manascore.api.skills.SkillAPI; import lombok.extern.log4j.Log4j2; +import net.minecraft.resources.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.InputEvent; import net.minecraftforge.client.event.RegisterKeyMappingsEvent; @@ -32,10 +33,11 @@ public class KeybindingRegistry { keybindings.add(new ManasKeybinding("manascore.keybinding.test_press", category, () -> log.info("Pressed"))); keybindings.add(new ManasKeybinding("manascore.keybinding.skill", category, - () -> SkillAPI.skillActivationPacket(0), - duration -> SkillAPI.skillReleasePacket(0, (int) (duration / 50)) + () -> SkillAPI.skillActivationPacket(new ResourceLocation(ManasCore.MOD_ID, "example_test_skill"), 0), + duration -> SkillAPI.skillReleasePacket(new ResourceLocation(ManasCore.MOD_ID, "example_test_skill"),0, (int) (duration / 50)) )); - keybindings.add(new ManasKeybinding("manascore.keybinding.skill_toggle", category, SkillAPI::skillTogglePacket)); + keybindings.add(new ManasKeybinding("manascore.keybinding.skill_toggle", category, + () -> SkillAPI.skillTogglePacket(new ResourceLocation(ManasCore.MOD_ID, "example_test_skill")))); } } diff --git a/src/main/java/com/github/manasmods/manascore/config/ManasCoreConfig.java b/src/main/java/com/github/manasmods/manascore/config/ManasCoreConfig.java deleted file mode 100644 index af7f9b59..00000000 --- a/src/main/java/com/github/manasmods/manascore/config/ManasCoreConfig.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.github.manasmods.manascore.config; - -import lombok.Getter; -import net.minecraftforge.common.ForgeConfigSpec; -import net.minecraftforge.common.ForgeConfigSpec.IntValue; -import org.apache.commons.lang3.tuple.Pair; - -public class ManasCoreConfig { - public static final ManasCoreConfig INSTANCE; - public static final ForgeConfigSpec SPEC; - - static { - Pair pair = new ForgeConfigSpec.Builder().configure(ManasCoreConfig::new); - INSTANCE = pair.getKey(); - SPEC = pair.getValue(); - } - - @Getter - private final IntValue anvilExpLimit; - - private ManasCoreConfig(ForgeConfigSpec.Builder builder) { - builder.push("anvil"); - - this.anvilExpLimit = builder - .comment("Max EXP a survival player can spend in an anvil recipe", "-1 = unlimited") - .defineInRange("expLimit", 40, -1, 1_000_000); - - builder.pop(); - } -} diff --git a/src/main/java/com/github/manasmods/manascore/core/MixinAnvilMenu.java b/src/main/java/com/github/manasmods/manascore/core/MixinAnvilMenu.java deleted file mode 100644 index 2e00dd51..00000000 --- a/src/main/java/com/github/manasmods/manascore/core/MixinAnvilMenu.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.github.manasmods.manascore.core; - -import com.github.manasmods.manascore.config.ManasCoreConfig; -import net.minecraft.world.inventory.AnvilMenu; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.Constant; -import org.spongepowered.asm.mixin.injection.ModifyConstant; - -@Mixin(AnvilMenu.class) -public class MixinAnvilMenu { - @ModifyConstant(method = "createResult", constant = @Constant(intValue = 40, ordinal = 2)) - private int maxEnchantmentLevel(int original) { - int limit = ManasCoreConfig.INSTANCE.getAnvilExpLimit().get(); - if (limit == -1) return 1_000_000; - return limit; - } -} diff --git a/src/main/java/com/github/manasmods/manascore/core/MixinAnvilScreen.java b/src/main/java/com/github/manasmods/manascore/core/MixinAnvilScreen.java deleted file mode 100644 index a255e3b8..00000000 --- a/src/main/java/com/github/manasmods/manascore/core/MixinAnvilScreen.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.github.manasmods.manascore.core; - -import com.github.manasmods.manascore.config.ManasCoreConfig; -import net.minecraft.client.gui.screens.inventory.AnvilScreen; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.Constant; -import org.spongepowered.asm.mixin.injection.ModifyConstant; - -@Mixin(AnvilScreen.class) -public class MixinAnvilScreen { - @ModifyConstant(method = "renderLabels", constant = @Constant(intValue = 40)) - private int maxEnchantmentLevel(int original) { - int limit = ManasCoreConfig.INSTANCE.getAnvilExpLimit().get(); - if (limit == -1) return 1_000_000; - return limit; - } -} diff --git a/src/main/java/com/github/manasmods/manascore/network/toserver/RequestSkillActivationPacket.java b/src/main/java/com/github/manasmods/manascore/network/toserver/RequestSkillActivationPacket.java index 2f2a2245..68fd79bd 100644 --- a/src/main/java/com/github/manasmods/manascore/network/toserver/RequestSkillActivationPacket.java +++ b/src/main/java/com/github/manasmods/manascore/network/toserver/RequestSkillActivationPacket.java @@ -5,31 +5,32 @@ import com.github.manasmods.manascore.api.skills.SkillAPI; import com.github.manasmods.manascore.api.skills.TickingSkill; import com.github.manasmods.manascore.api.skills.capability.SkillStorage; +import com.github.manasmods.manascore.api.skills.event.SkillActivationEvent; import com.github.manasmods.manascore.capability.skill.event.TickEventListenerHandler; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; +import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.network.NetworkEvent; -import java.util.List; import java.util.Optional; import java.util.function.Supplier; public class RequestSkillActivationPacket { private final int keyNumber; - private final List skillList; + private final ResourceLocation skill; public RequestSkillActivationPacket(FriendlyByteBuf buf) { - this.skillList = buf.readList(FriendlyByteBuf::readResourceLocation); + this.skill = buf.readResourceLocation(); this.keyNumber = buf.readInt(); } - public RequestSkillActivationPacket(List skills, int keyNumber) { - this.skillList = skills; + public RequestSkillActivationPacket(ResourceLocation skill, int keyNumber) { + this.skill = skill; this.keyNumber = keyNumber; } public void toBytes(FriendlyByteBuf buf) { - buf.writeCollection(this.skillList, FriendlyByteBuf::writeResourceLocation); + buf.writeResourceLocation(this.skill); buf.writeInt(this.keyNumber); } @@ -38,22 +39,26 @@ public void handle(Supplier ctx) { ServerPlayer player = ctx.get().getSender(); if (player != null) { SkillStorage storage = SkillAPI.getSkillsFrom(player); - for (ResourceLocation id : this.skillList) { - ManasSkill manasSkill = SkillAPI.getSkillRegistry().getValue(id); - if (manasSkill == null) continue; + ManasSkill manasSkill = SkillAPI.getSkillRegistry().getValue(this.skill); + if (manasSkill != null) { Optional optional = storage.getSkill(manasSkill); - if (optional.isEmpty()) continue; - ManasSkillInstance instance = optional.get(); + if (optional.isPresent()) { + ManasSkillInstance instance = optional.get(); + SkillActivationEvent event = new SkillActivationEvent(instance, player, keyNumber); + if (!MinecraftForge.EVENT_BUS.post(event)) { - if (!instance.canInteractSkill(player)) continue; - if (instance.onCoolDown() && !instance.canIgnoreCoolDown(player)) continue; - - instance.onPressed(player); - instance.addHeldAttributeModifiers(player); - TickEventListenerHandler.tickingSkills.put(player.getUUID(), new TickingSkill(instance.getSkill())); + if (instance.canInteractSkill(player)) { + if (!instance.onCoolDown() || instance.canIgnoreCoolDown(player)) { + instance.onPressed(player); + instance.addHeldAttributeModifiers(player); + TickEventListenerHandler.tickingSkills.put(player.getUUID(), new TickingSkill(instance.getSkill())); + storage.syncChanges(); + } + } + } + } } - storage.syncChanges(); } }); ctx.get().setPacketHandled(true); diff --git a/src/main/java/com/github/manasmods/manascore/network/toserver/RequestSkillReleasePacket.java b/src/main/java/com/github/manasmods/manascore/network/toserver/RequestSkillReleasePacket.java index f6f3a4cd..da87d68d 100644 --- a/src/main/java/com/github/manasmods/manascore/network/toserver/RequestSkillReleasePacket.java +++ b/src/main/java/com/github/manasmods/manascore/network/toserver/RequestSkillReleasePacket.java @@ -5,14 +5,15 @@ import com.github.manasmods.manascore.api.skills.SkillAPI; import com.github.manasmods.manascore.api.skills.TickingSkill; import com.github.manasmods.manascore.api.skills.capability.SkillStorage; +import com.github.manasmods.manascore.api.skills.event.SkillReleaseEvent; import com.github.manasmods.manascore.capability.skill.event.TickEventListenerHandler; import com.google.common.collect.Multimap; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; +import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.network.NetworkEvent; -import java.util.List; import java.util.Optional; import java.util.UUID; import java.util.function.Supplier; @@ -20,21 +21,21 @@ public class RequestSkillReleasePacket { private final int heldTick; private final int keyNumber; - private final List skillList; + private final ResourceLocation skill; public RequestSkillReleasePacket(FriendlyByteBuf buf) { - this.skillList = buf.readList(FriendlyByteBuf::readResourceLocation); + this.skill = buf.readResourceLocation(); this.keyNumber = buf.readInt(); this.heldTick = buf.readInt(); } - public RequestSkillReleasePacket(List skills, int keyNumber, int ticks) { - this.skillList = skills; + public RequestSkillReleasePacket(ResourceLocation skill, int keyNumber, int ticks) { + this.skill = skill; this.keyNumber = keyNumber; this.heldTick = ticks; } public void toBytes(FriendlyByteBuf buf) { - buf.writeCollection(this.skillList, FriendlyByteBuf::writeResourceLocation); + buf.writeResourceLocation(this.skill); buf.writeInt(this.keyNumber); buf.writeInt(this.heldTick); } @@ -44,24 +45,29 @@ public void handle(Supplier ctx) { ServerPlayer player = ctx.get().getSender(); if (player != null) { SkillStorage storage = SkillAPI.getSkillsFrom(player); - for (ResourceLocation id : this.skillList) { - ManasSkill manasSkill = SkillAPI.getSkillRegistry().getValue(id); - if (manasSkill == null) continue; + ManasSkill manasSkill = SkillAPI.getSkillRegistry().getValue(this.skill); + if (manasSkill != null) { Optional optional = storage.getSkill(manasSkill); - if (optional.isEmpty()) continue; - ManasSkillInstance skillInstance = optional.get(); + if (optional.isPresent()) { + ManasSkillInstance skillInstance = optional.get(); + SkillReleaseEvent event = new SkillReleaseEvent(skillInstance, player, keyNumber, this.heldTick); + if (!MinecraftForge.EVENT_BUS.post(event)) { - if (!skillInstance.canInteractSkill(player)) continue; - if (skillInstance.onCoolDown() && !skillInstance.canIgnoreCoolDown(player)) continue; + if (skillInstance.canInteractSkill(player)) { + if (!skillInstance.onCoolDown() || skillInstance.canIgnoreCoolDown(player)) { + skillInstance.onRelease(player, this.heldTick); + } + } - skillInstance.onRelease(player, this.heldTick); - skillInstance.getSkill().removeHeldAttributeModifiers(player); - - Multimap multimap = TickEventListenerHandler.tickingSkills; - if (multimap.containsKey(player.getUUID())) multimap.get(player.getUUID()).removeIf(tickingSkill -> tickingSkill.getSkill() == skillInstance.getSkill()); + skillInstance.removeHeldAttributeModifiers(player); + Multimap multimap = TickEventListenerHandler.tickingSkills; + if (multimap.containsKey(player.getUUID())) + multimap.get(player.getUUID()).removeIf(tickingSkill -> tickingSkill.getSkill() == skillInstance.getSkill()); + storage.syncChanges(); + } + } } - storage.syncChanges(); } }); ctx.get().setPacketHandled(true); diff --git a/src/main/java/com/github/manasmods/manascore/network/toserver/RequestSkillTogglePacket.java b/src/main/java/com/github/manasmods/manascore/network/toserver/RequestSkillTogglePacket.java index cfa537ee..3a51377e 100644 --- a/src/main/java/com/github/manasmods/manascore/network/toserver/RequestSkillTogglePacket.java +++ b/src/main/java/com/github/manasmods/manascore/network/toserver/RequestSkillTogglePacket.java @@ -4,27 +4,28 @@ import com.github.manasmods.manascore.api.skills.ManasSkillInstance; import com.github.manasmods.manascore.api.skills.SkillAPI; import com.github.manasmods.manascore.api.skills.capability.SkillStorage; +import com.github.manasmods.manascore.api.skills.event.SkillToggleEvent; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; +import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.network.NetworkEvent; -import java.util.List; import java.util.Optional; import java.util.function.Supplier; public class RequestSkillTogglePacket { - private final List skillList; + private final ResourceLocation skill; public RequestSkillTogglePacket(FriendlyByteBuf buf) { - this.skillList = buf.readList(FriendlyByteBuf::readResourceLocation); + this.skill = buf.readResourceLocation(); } - public RequestSkillTogglePacket(List skills) { - this.skillList = skills; + public RequestSkillTogglePacket(ResourceLocation skill) { + this.skill = skill; } public void toBytes(FriendlyByteBuf buf) { - buf.writeCollection(this.skillList, FriendlyByteBuf::writeResourceLocation); + buf.writeResourceLocation(this.skill); } public void handle(Supplier ctx) { @@ -32,25 +33,27 @@ public void handle(Supplier ctx) { ServerPlayer player = ctx.get().getSender(); if (player != null) { SkillStorage storage = SkillAPI.getSkillsFrom(player); - for (ResourceLocation id : this.skillList) { - ManasSkill manasSkill = SkillAPI.getSkillRegistry().getValue(id); - if (manasSkill == null) continue; + ManasSkill manasSkill = SkillAPI.getSkillRegistry().getValue(this.skill); + if (manasSkill != null) { Optional optional = storage.getSkill(manasSkill); - if (optional.isEmpty()) continue; - - ManasSkillInstance skillInstance = optional.get(); - if (!skillInstance.canInteractSkill(player)) continue; - - if (skillInstance.isToggled()) { - skillInstance.setToggled(false); - skillInstance.onToggleOff(player); - } else { - skillInstance.setToggled(true); - skillInstance.onToggleOn(player); + if (optional.isPresent()) { + ManasSkillInstance instance = optional.get(); + SkillToggleEvent event = new SkillToggleEvent(instance, player, !instance.isToggled()); + if (!MinecraftForge.EVENT_BUS.post(event)) { + + if (instance.canInteractSkill(player) && instance.canBeToggled(player)) { + instance.setToggled(!instance.isToggled()); + if (instance.isToggled()) { + instance.onToggleOn(player); + } else { + instance.onToggleOff(player); + } + } + storage.syncChanges(); + } } } - storage.syncChanges(); } }); ctx.get().setPacketHandled(true); diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg new file mode 100644 index 00000000..a7d0c371 --- /dev/null +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -0,0 +1 @@ +public net.minecraft.world.entity.projectile.AbstractArrow f_36701_ # piercingIgnoreEntityIds \ No newline at end of file diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index da1611d1..fbeb9936 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -3,7 +3,7 @@ loaderVersion = "${forgeLoaderVersion}" license = "GPL-3" issueTrackerURL = "https://github.com/ManasMods/ManasCore/issues" #optional [[mods]] #mandatory -modId = "${modId}" #mandatory +modId = "manascore" #mandatory version = "${modVersion}" displayName = "ManasCore" #mandatory updateJSONURL="https://api.modrinth.com/updates/wRRSWpd1/forge_updates.json" #optional @@ -15,24 +15,18 @@ description = ''' Utility and Core Library for Manas Mods ''' #@formatter:off -[[dependencies.${modId}]] #optional +[[dependencies.manascore]] #optional modId="forge" #mandatory mandatory=true #mandatory versionRange="${forgeLoaderVersion}" #mandatory ordering="NONE" side="BOTH" # Here's another dependency -[[dependencies.${modId}]] +[[dependencies.manascore]] modId="minecraft" mandatory=true # This version range declares a minimum of the current minecraft version up to but not including the next major version versionRange="${minecraftVersionCheck}" ordering="NONE" side="BOTH" -[[dependencies.${modId}]] - modId="mixinextras" - mandatory=true - versionRange="[${mixinExtrasVersion},)" - ordering="NONE" - side="BOTH" ##@formatter:on \ No newline at end of file diff --git a/src/main/resources/manascore.mixins.json b/src/main/resources/manascore.mixins.json index 15495f9a..3ad3ed77 100644 --- a/src/main/resources/manascore.mixins.json +++ b/src/main/resources/manascore.mixins.json @@ -6,7 +6,6 @@ "refmap": "manascore.refmap.json", "mixins": [ "BlockLootAccessor", - "MixinAnvilMenu", "MixinLivingEntity", "MixinServerLevel", "RegistryBuilderAccessor", @@ -14,7 +13,6 @@ ], "client": [ "AbstractContainerScreenAccessor", - "MixinAnvilScreen", "MixinMinecraft" ], "injectors": {