From 64e0c3e00c14c95b385dee1b54f043554011f556 Mon Sep 17 00:00:00 2001 From: Provismet <17149901+Provismet@users.noreply.github.com> Date: Sun, 17 Dec 2023 02:19:50 +0000 Subject: [PATCH] Initial commit. --- build.gradle | 12 ----- gradle.properties | 12 ++--- jitpack.yml | 2 + .../java/com/example/ExampleModClient.java | 10 ---- .../mixin/client/ExampleClientMixin.java | 15 ------ src/client/resources/modid.client.mixins.json | 11 ----- src/main/java/com/example/ExampleMod.java | 22 --------- .../java/com/example/mixin/ExampleMixin.java | 15 ------ .../com/provismet/CombatPlusCore/CPCMain.java | 17 +++++++ .../api/CombatPlusEntrypoint.java | 5 ++ .../enchantments/ExtraEnchantmentTarget.java | 33 +++++++++++++ .../enchantments/OffHandEnchantment.java | 33 +++++++++++++ .../interfaces/CPCEnchantment.java | 28 +++++++++++ .../utility/CPCEnchantmentHelper.java | 45 ++++++++++++++++++ .../assets/{modid => combat-plus}/icon.png | Bin src/main/resources/fabric.mod.json | 36 +++++++------- 16 files changed, 186 insertions(+), 110 deletions(-) create mode 100644 jitpack.yml delete mode 100644 src/client/java/com/example/ExampleModClient.java delete mode 100644 src/client/java/com/example/mixin/client/ExampleClientMixin.java delete mode 100644 src/client/resources/modid.client.mixins.json delete mode 100644 src/main/java/com/example/ExampleMod.java delete mode 100644 src/main/java/com/example/mixin/ExampleMixin.java create mode 100644 src/main/java/com/provismet/CombatPlusCore/CPCMain.java create mode 100644 src/main/java/com/provismet/CombatPlusCore/api/CombatPlusEntrypoint.java create mode 100644 src/main/java/com/provismet/CombatPlusCore/enchantments/ExtraEnchantmentTarget.java create mode 100644 src/main/java/com/provismet/CombatPlusCore/enchantments/OffHandEnchantment.java create mode 100644 src/main/java/com/provismet/CombatPlusCore/interfaces/CPCEnchantment.java create mode 100644 src/main/java/com/provismet/CombatPlusCore/utility/CPCEnchantmentHelper.java rename src/main/resources/assets/{modid => combat-plus}/icon.png (100%) diff --git a/build.gradle b/build.gradle index 910521d..28ac94e 100644 --- a/build.gradle +++ b/build.gradle @@ -18,18 +18,6 @@ repositories { // for more information about repositories. } -loom { - splitEnvironmentSourceSets() - - mods { - "modid" { - sourceSet sourceSets.main - sourceSet sourceSets.client - } - } - -} - dependencies { // To change the versions see the gradle.properties file minecraft "com.mojang:minecraft:${project.minecraft_version}" diff --git a/gradle.properties b/gradle.properties index aa21e94..9b59e42 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,14 +4,14 @@ org.gradle.parallel=true # Fabric Properties # check these on https://fabricmc.net/develop -minecraft_version=1.20.4 -yarn_mappings=1.20.4+build.1 -loader_version=0.15.0 +minecraft_version=1.20.1 +yarn_mappings=1.20.1+build.10 +loader_version=0.15.2 # Mod Properties mod_version=1.0.0 -maven_group=com.example -archives_base_name=modid +maven_group=com.provismet +archives_base_name=combatplus-core # Dependencies -fabric_version=0.91.1+1.20.4 \ No newline at end of file +fabric_version=0.91.0+1.20.1 \ No newline at end of file diff --git a/jitpack.yml b/jitpack.yml new file mode 100644 index 0000000..efde7bf --- /dev/null +++ b/jitpack.yml @@ -0,0 +1,2 @@ +jdk: + - openjdk17 diff --git a/src/client/java/com/example/ExampleModClient.java b/src/client/java/com/example/ExampleModClient.java deleted file mode 100644 index e2b0436..0000000 --- a/src/client/java/com/example/ExampleModClient.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.example; - -import net.fabricmc.api.ClientModInitializer; - -public class ExampleModClient implements ClientModInitializer { - @Override - public void onInitializeClient() { - // This entrypoint is suitable for setting up client-specific logic, such as rendering. - } -} \ No newline at end of file diff --git a/src/client/java/com/example/mixin/client/ExampleClientMixin.java b/src/client/java/com/example/mixin/client/ExampleClientMixin.java deleted file mode 100644 index 061b0ef..0000000 --- a/src/client/java/com/example/mixin/client/ExampleClientMixin.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.example.mixin.client; - -import net.minecraft.client.MinecraftClient; -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.callback.CallbackInfo; - -@Mixin(MinecraftClient.class) -public class ExampleClientMixin { - @Inject(at = @At("HEAD"), method = "run") - private void run(CallbackInfo info) { - // This code is injected into the start of MinecraftClient.run()V - } -} \ No newline at end of file diff --git a/src/client/resources/modid.client.mixins.json b/src/client/resources/modid.client.mixins.json deleted file mode 100644 index 21b0fc1..0000000 --- a/src/client/resources/modid.client.mixins.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "required": true, - "package": "com.example.mixin.client", - "compatibilityLevel": "JAVA_17", - "client": [ - "ExampleClientMixin" - ], - "injectors": { - "defaultRequire": 1 - } -} \ No newline at end of file diff --git a/src/main/java/com/example/ExampleMod.java b/src/main/java/com/example/ExampleMod.java deleted file mode 100644 index f97cce9..0000000 --- a/src/main/java/com/example/ExampleMod.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.example; - -import net.fabricmc.api.ModInitializer; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ExampleMod implements ModInitializer { - // This logger is used to write text to the console and the log file. - // It is considered best practice to use your mod id as the logger's name. - // That way, it's clear which mod wrote info, warnings, and errors. - public static final Logger LOGGER = LoggerFactory.getLogger("modid"); - - @Override - public void onInitialize() { - // This code runs as soon as Minecraft is in a mod-load-ready state. - // However, some things (like resources) may still be uninitialized. - // Proceed with mild caution. - - LOGGER.info("Hello Fabric world!"); - } -} \ No newline at end of file diff --git a/src/main/java/com/example/mixin/ExampleMixin.java b/src/main/java/com/example/mixin/ExampleMixin.java deleted file mode 100644 index 3c4212c..0000000 --- a/src/main/java/com/example/mixin/ExampleMixin.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.example.mixin; - -import net.minecraft.server.MinecraftServer; -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.callback.CallbackInfo; - -@Mixin(MinecraftServer.class) -public class ExampleMixin { - @Inject(at = @At("HEAD"), method = "loadWorld") - private void init(CallbackInfo info) { - // This code is injected into the start of MinecraftServer.loadWorld()V - } -} \ No newline at end of file diff --git a/src/main/java/com/provismet/CombatPlusCore/CPCMain.java b/src/main/java/com/provismet/CombatPlusCore/CPCMain.java new file mode 100644 index 0000000..2fc813d --- /dev/null +++ b/src/main/java/com/provismet/CombatPlusCore/CPCMain.java @@ -0,0 +1,17 @@ +package com.provismet.CombatPlusCore; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import net.fabricmc.api.ModInitializer; + +public class CPCMain implements ModInitializer { + public static final String MODID = "combatplus-core"; + public static final Logger LOGGER = LoggerFactory.getLogger("Combat+ Core"); + + @Override + public void onInitialize () { + + } + +} \ No newline at end of file diff --git a/src/main/java/com/provismet/CombatPlusCore/api/CombatPlusEntrypoint.java b/src/main/java/com/provismet/CombatPlusCore/api/CombatPlusEntrypoint.java new file mode 100644 index 0000000..3ffe6a9 --- /dev/null +++ b/src/main/java/com/provismet/CombatPlusCore/api/CombatPlusEntrypoint.java @@ -0,0 +1,5 @@ +package com.provismet.CombatPlusCore.api; + +public interface CombatPlusEntrypoint { + public void onInitialize (); +} diff --git a/src/main/java/com/provismet/CombatPlusCore/enchantments/ExtraEnchantmentTarget.java b/src/main/java/com/provismet/CombatPlusCore/enchantments/ExtraEnchantmentTarget.java new file mode 100644 index 0000000..e9b344c --- /dev/null +++ b/src/main/java/com/provismet/CombatPlusCore/enchantments/ExtraEnchantmentTarget.java @@ -0,0 +1,33 @@ +package com.provismet.CombatPlusCore.enchantments; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.item.Item; +import net.minecraft.item.SwordItem; + +public class ExtraEnchantmentTarget { + private List> targets; + + public static ExtraEnchantmentTarget DualWeapons; + + public ExtraEnchantmentTarget () { + this.targets = new ArrayList<>(); + } + + public boolean add (Class itemClass) { + return this.targets.add(itemClass); + } + + public boolean accepts (Item item) { + for (Class itemClass : this.targets) { + if (itemClass.isInstance(item)) return true; + } + return false; + } + + public static void init () { + DualWeapons = new ExtraEnchantmentTarget(); + DualWeapons.add(SwordItem.class); + } +} diff --git a/src/main/java/com/provismet/CombatPlusCore/enchantments/OffHandEnchantment.java b/src/main/java/com/provismet/CombatPlusCore/enchantments/OffHandEnchantment.java new file mode 100644 index 0000000..8cd22f4 --- /dev/null +++ b/src/main/java/com/provismet/CombatPlusCore/enchantments/OffHandEnchantment.java @@ -0,0 +1,33 @@ +package com.provismet.CombatPlusCore.enchantments; + +import com.provismet.CombatPlusCore.interfaces.CPCEnchantment; + +import net.minecraft.enchantment.DamageEnchantment; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.enchantment.EnchantmentTarget; +import net.minecraft.enchantment.FireAspectEnchantment; +import net.minecraft.enchantment.LuckEnchantment; +import net.minecraft.enchantment.SweepingEnchantment; +import net.minecraft.entity.EquipmentSlot; +import net.minecraft.item.ItemStack; + +public abstract class OffHandEnchantment extends Enchantment implements CPCEnchantment { + + protected OffHandEnchantment (Rarity weight, EnchantmentTarget target, EquipmentSlot[] slotTypes) { + super(weight, target, new EquipmentSlot[] {EquipmentSlot.OFFHAND}); + } + + @Override + public boolean canAccept (Enchantment other) { + return super.canAccept(other) && + !(other instanceof DamageEnchantment) && + !(other instanceof FireAspectEnchantment) && + !(other instanceof SweepingEnchantment) && + !(other instanceof LuckEnchantment); + } + + @Override + public boolean isAcceptableItem (ItemStack itemStack) { + return ExtraEnchantmentTarget.DualWeapons.accepts(itemStack.getItem()); + } +} diff --git a/src/main/java/com/provismet/CombatPlusCore/interfaces/CPCEnchantment.java b/src/main/java/com/provismet/CombatPlusCore/interfaces/CPCEnchantment.java new file mode 100644 index 0000000..7920c92 --- /dev/null +++ b/src/main/java/com/provismet/CombatPlusCore/interfaces/CPCEnchantment.java @@ -0,0 +1,28 @@ +package com.provismet.CombatPlusCore.interfaces; + +import org.jetbrains.annotations.Nullable; + +import net.minecraft.entity.EquipmentSlot; +import net.minecraft.entity.LivingEntity; + +public interface CPCEnchantment { + public default float getAttackDamage (int level, LivingEntity user, LivingEntity target) { + return 0f; + } + + public default boolean shouldApplyDamage (int level, EquipmentSlot slot, LivingEntity user, @Nullable LivingEntity target) { + return false; + } + + public default boolean shouldApplyEffects (int level, EquipmentSlot slot, LivingEntity user, @Nullable LivingEntity target) { + return false; + } + + public default void postChargeHit (int level, LivingEntity user, LivingEntity target) { + + } + + public default void postCriticalHit (int level, LivingEntity user, LivingEntity target) { + + } +} diff --git a/src/main/java/com/provismet/CombatPlusCore/utility/CPCEnchantmentHelper.java b/src/main/java/com/provismet/CombatPlusCore/utility/CPCEnchantmentHelper.java new file mode 100644 index 0000000..e70ec66 --- /dev/null +++ b/src/main/java/com/provismet/CombatPlusCore/utility/CPCEnchantmentHelper.java @@ -0,0 +1,45 @@ +package com.provismet.CombatPlusCore.utility; + +import org.apache.commons.lang3.mutable.MutableFloat; + +import com.provismet.CombatPlusCore.interfaces.CPCEnchantment; + +import net.minecraft.enchantment.Enchantment; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.EquipmentSlot; +import net.minecraft.entity.LivingEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.NbtList; +import net.minecraft.registry.Registries; + +public class CPCEnchantmentHelper { + public static float getAttackDamage (LivingEntity user, LivingEntity target) { + MutableFloat totalDamage = new MutableFloat(); + + for (EquipmentSlot slot : EquipmentSlot.values()) { + ItemStack itemStack = user.getEquippedStack(slot); + + CPCEnchantmentHelper.forEach((enchantment, level) -> { + if (enchantment instanceof CPCEnchantment cpcEnchant && cpcEnchant.shouldApplyDamage(level, slot, user, target)) totalDamage.add(cpcEnchant.getAttackDamage(level, user, target)); + else totalDamage.add(enchantment.getAttackDamage(level, target.getGroup())); + }, itemStack); + } + return totalDamage.floatValue(); + } + + public static void forEach (Consumer consumer, ItemStack itemStack) { + if (itemStack.isEmpty()) return; + + NbtList nbtList = itemStack.getEnchantments(); + for (int i = 0; i < nbtList.size(); ++i) { + NbtCompound nbtCompound = nbtList.getCompound(i); + Registries.ENCHANTMENT.getOrEmpty(EnchantmentHelper.getIdFromNbt(nbtCompound)).ifPresent(enchantment -> consumer.accept(enchantment, EnchantmentHelper.getLevelFromNbt(nbtCompound))); + } + } + + @FunctionalInterface + private static interface Consumer { + public void accept (Enchantment enchantment, int level); + } +} diff --git a/src/main/resources/assets/modid/icon.png b/src/main/resources/assets/combat-plus/icon.png similarity index 100% rename from src/main/resources/assets/modid/icon.png rename to src/main/resources/assets/combat-plus/icon.png diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index dc5a234..654c58a 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -1,41 +1,39 @@ { "schemaVersion": 1, - "id": "modid", + "id": "combat-plus", "version": "${version}", - "name": "Example mod", - "description": "This is an example description! Tell everyone what your mod is about!", + "name": "Combat+ Core", + "description": "Core library mod for the Combat+ series.", "authors": [ - "Me!" + "Provismet" ], "contact": { "homepage": "https://fabricmc.net/", "sources": "https://github.com/FabricMC/fabric-example-mod" }, - "license": "CC0-1.0", - "icon": "assets/modid/icon.png", + "license": "MIT", + "icon": "assets/combat-plus/icon.png", "environment": "*", "entrypoints": { "main": [ - "com.example.ExampleMod" - ], - "client": [ - "com.example.ExampleModClient" + "com.provismet.CombatPlusCore.CPCMain" ] }, "mixins": [ - "modid.mixins.json", - { - "config": "modid.client.mixins.json", - "environment": "client" - } ], "depends": { - "fabricloader": ">=0.15.0", - "minecraft": "~1.20.4", + "fabricloader": ">=0.14.0", + "minecraft": "~1.20", "java": ">=17", "fabric-api": "*" }, "suggests": { - "another-mod": "*" - } + "extra-damage-enchantments": "*", + "dual-swords": "*" + }, + "custom": { + "modmenu": { + "badges": ["library"] + } + } } \ No newline at end of file