diff --git a/.idea/compiler.xml b/.idea/compiler.xml index a8d902c..1208fda 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -3,6 +3,8 @@ + + diff --git a/.idea/libraries/Gradle__com_github_Sindusk_sindusklibrary_v1_0.xml b/.idea/libraries/Gradle__com_github_Sindusk_sindusklibrary_v1_0.xml deleted file mode 100644 index d678854..0000000 --- a/.idea/libraries/Gradle__com_github_Sindusk_sindusklibrary_v1_0.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_gotti_wurmunlimited_common_2613165.xml b/.idea/libraries/Gradle__org_gotti_wurmunlimited_common_2613165.xml deleted file mode 100644 index 02cdd92..0000000 --- a/.idea/libraries/Gradle__org_gotti_wurmunlimited_common_2613165.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_gotti_wurmunlimited_server_2613165.xml b/.idea/libraries/Gradle__org_gotti_wurmunlimited_server_2613165.xml deleted file mode 100644 index 09e5f1f..0000000 --- a/.idea/libraries/Gradle__org_gotti_wurmunlimited_server_2613165.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_gotti_wurmunlimited_server_modlauncher_0_33_beta1.xml b/.idea/libraries/Gradle__org_gotti_wurmunlimited_server_modlauncher_0_33_beta1.xml deleted file mode 100644 index 6f76bba..0000000 --- a/.idea/libraries/Gradle__org_gotti_wurmunlimited_server_modlauncher_0_33_beta1.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_javassist_javassist_3_20_0_GA.xml b/.idea/libraries/Gradle__org_javassist_javassist_3_20_0_GA.xml index f60e353..fdd8716 100644 --- a/.idea/libraries/Gradle__org_javassist_javassist_3_20_0_GA.xml +++ b/.idea/libraries/Gradle__org_javassist_javassist_3_20_0_GA.xml @@ -1,9 +1,11 @@ - + - + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml index ad87626..4c616f8 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -3,8 +3,11 @@ - - + + + + + \ No newline at end of file diff --git a/.idea/modules/WyvernMods_main.iml b/.idea/modules/WyvernMods_main.iml index f141708..d8c7a29 100644 --- a/.idea/modules/WyvernMods_main.iml +++ b/.idea/modules/WyvernMods_main.iml @@ -1,5 +1,5 @@ - + diff --git a/.idea/modules/WyvernMods_test.iml b/.idea/modules/WyvernMods_test.iml index c2109e4..56bf69c 100644 --- a/.idea/modules/WyvernMods_test.iml +++ b/.idea/modules/WyvernMods_test.iml @@ -1,5 +1,5 @@ - + diff --git a/WyvernMods.iml b/WyvernMods.iml index 8d9127d..4fa2cdc 100644 --- a/WyvernMods.iml +++ b/WyvernMods.iml @@ -1,5 +1,5 @@ - + diff --git a/src/main/java/mod/sin/actions/AddSubGroupAction.java b/src/main/java/mod/sin/actions/AddSubGroupAction.java index 37fafe4..d48dd42 100644 --- a/src/main/java/mod/sin/actions/AddSubGroupAction.java +++ b/src/main/java/mod/sin/actions/AddSubGroupAction.java @@ -28,7 +28,6 @@ public class AddSubGroupAction implements ModAction { public AddSubGroupAction() { logger.log(Level.WARNING, "AddSubGroupAction()"); - actionId = (short) ModActions.getNextActionId(); actionEntry = ActionEntry.createEntry( actionId, diff --git a/src/main/java/mod/sin/actions/items/WoodEssenceAction.java b/src/main/java/mod/sin/actions/items/WoodEssenceAction.java index 8f2c197..9b61be0 100644 --- a/src/main/java/mod/sin/actions/items/WoodEssenceAction.java +++ b/src/main/java/mod/sin/actions/items/WoodEssenceAction.java @@ -37,7 +37,7 @@ public class WoodEssenceAction implements ModAction, BehaviourProvider, ActionPe actionId, "Imbue", "imbuing", - new int[] { 6 } + new int[0] //new int[] { 6 /* ACTION_TYPE_NOMOVE */ } // 6 /* ACTION_TYPE_NOMOVE */, 48 /* ACTION_TYPE_ENEMY_ALWAYS */, 36 /* ACTION_TYPE_ALWAYS_USE_ACTIVE_ITEM */ ); ModActions.registerAction(actionEntry); @@ -75,11 +75,12 @@ public class WoodEssenceAction implements ModAction, BehaviourProvider, ActionPe act.setTimeLeft(time); performer.sendActionControl("Infusing", true, act.getTimeLeft()); } - else if(counter * 10 > performer.getCurrentAction().getTimeLeft()) { + else if(counter * 10.0f > performer.getCurrentAction().getTimeLeft()) { performer.getCommunicator().sendNormalServerMessage("You finish imbuing " + target.getName() + " with the properties of another tree. It's damaged in the process."); target.setMaterial(source.getMaterial()); + target.sendUpdate(); Items.destroyItem(source.getWurmId()); - source.setDamage(20f); + target.setDamage(20f); return true; } return false; @@ -93,6 +94,6 @@ public class WoodEssenceAction implements ModAction, BehaviourProvider, ActionPe @Override public short getActionId() { - return 0; + return actionId; } } diff --git a/src/main/java/mod/sin/items/WoodEssence.java b/src/main/java/mod/sin/items/WoodEssence.java index f18b26f..a5c43a9 100644 --- a/src/main/java/mod/sin/items/WoodEssence.java +++ b/src/main/java/mod/sin/items/WoodEssence.java @@ -21,7 +21,8 @@ public class WoodEssence implements ItemTypes, MiscConstants { ItemTypes.ITEM_TYPE_FULLPRICE, ItemTypes.ITEM_TYPE_NOSELLBACK, ItemTypes.ITEM_TYPE_ALWAYS_BANKABLE, - ItemTypes.ITEM_TYPE_WOOD + ItemTypes.ITEM_TYPE_WOOD, + ItemTypes.ITEM_TYPE_NAMED }); itemBuilder.imageNumber((short) 859); itemBuilder.behaviourType((short) 1); @@ -31,8 +32,8 @@ public class WoodEssence implements ItemTypes, MiscConstants { itemBuilder.primarySkill((int) NOID); itemBuilder.bodySpaces(MiscConstants.EMPTY_BYTE_PRIMITIVE_ARRAY); itemBuilder.modelName("model.valrei."); - itemBuilder.difficulty(300.0f); - itemBuilder.weightGrams(4500); + itemBuilder.difficulty(80.0f); + itemBuilder.weightGrams(1); itemBuilder.material(Materials.MATERIAL_WOOD_BIRCH); itemBuilder.value(1); itemBuilder.isTraded(true); @@ -45,7 +46,9 @@ public class WoodEssence implements ItemTypes, MiscConstants { public void initCreationEntry() { logger.info("initCreationEntry()"); if(templateId > 0) { - CreationEntryCreator.createSimpleEntry(SkillList.ALCHEMY_NATURAL, ItemList.sourceSalt, ItemList.log, templateId, true, true, 0.0f, true, false, CreationCategories.RESOURCES); + CreationEntryCreator.createAdvancedEntry(SkillList.ALCHEMY_NATURAL, ItemList.sourceSalt, ItemList.log, templateId, true, + true, 0.0f, true, false, CreationCategories.RESOURCES); + //CreationEntryCreator.createSimpleEntry(SkillList.ALCHEMY_NATURAL, ItemList.sourceSalt, ItemList.log, templateId, true, true, 0.0f, false, false, CreationCategories.RESOURCES); } else{ logger.info("woodEssence does not have a template ID on creation entry."); diff --git a/src/main/java/mod/sin/wyvern/bonusoverhaul/ItemBonusOverhaul.java b/src/main/java/mod/sin/wyvern/bonusoverhaul/ItemBonusOverhaul.java index 5533db3..3a9c721 100644 --- a/src/main/java/mod/sin/wyvern/bonusoverhaul/ItemBonusOverhaul.java +++ b/src/main/java/mod/sin/wyvern/bonusoverhaul/ItemBonusOverhaul.java @@ -1,17 +1,24 @@ package mod.sin.wyvern.bonusoverhaul; +import com.wurmonline.server.creatures.Creature; import com.wurmonline.server.creatures.SpellEffectsEnum; import com.wurmonline.server.items.*; +import com.wurmonline.server.players.ItemBonus; +import com.wurmonline.server.skills.NoSuchSkillException; +import com.wurmonline.server.skills.Skill; import javassist.ClassPool; import javassist.CtClass; import javassist.NotFoundException; +import javassist.bytecode.Descriptor; import mod.sin.armour.GlimmerscaleVest; import mod.sin.lib.Util; import mod.sin.wyvern.MiscChanges; +import org.gotti.wurmunlimited.modloader.ReflectionUtil; import org.gotti.wurmunlimited.modloader.classhooks.HookException; import org.gotti.wurmunlimited.modloader.classhooks.HookManager; import org.gotti.wurmunlimited.modloader.interfaces.PreInitable; +import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; @@ -19,6 +26,7 @@ import java.util.logging.Logger; public class ItemBonusOverhaul { private static List itemBonuses = new ArrayList<>(); private static Logger logger = Logger.getLogger(ItemBonusOverhaul.class.getName()); + private static final float SKILLGAIN_BONUS_SCALE = .01f; /** * Called to add all itemBonusWrapper objects to the itemBonuses list to be called upon later. @@ -75,6 +83,40 @@ public class ItemBonusOverhaul { return null; } + public static float getNewSkillBonus(Creature creature, int skillid) { + try { + ItemBonusWrapper wrapper; + CtClass[] params1 = { + CtClass.longType, + CtClass.intType + }; + String desc = Descriptor.ofMethod(CtClass.floatType, params1); + float bonus = ReflectionUtil.callPrivateMethod(ItemBonus.class, ReflectionUtil.getMethod(ItemBonus.class, "getBonus"), creature.getWurmId(), SpellEffectsEnum.ITEM_RING_SKILLGAIN.getTypeId()); + for(Item item:creature.getBody().getContainersAndWornItems()) { + wrapper = matchTemplateidToWrapper(item.getTemplateId()); + if(wrapper != null) { + if(!checkItemBonusForSkill(wrapper, skillid) && wrapper.getEffect() == SpellEffectsEnum.ITEM_RING_SKILLGAIN) { + bonus -= wrapper.getValue() * item.getCurrentQualityLevel() * .01f; + } + } + } + return bonus; + } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { + e.printStackTrace(); + return 0.0f; + } + } + + public static boolean checkItemBonusForSkill(ItemBonusWrapper wrapper, int skillid) { + if(wrapper.getEffect() != SpellEffectsEnum.ITEM_RING_SKILLGAIN) { + return false; + } + if(wrapper.isSkillRestricted() && wrapper.getRestrictedSkill() == skillid) { + return true; + } + return !wrapper.isSkillRestricted(); + } + public static void preInit() { try { ClassPool classPool = HookManager.getInstance().getClassPool(); @@ -95,6 +137,10 @@ public class ItemBonusOverhaul { replace = "{ return " + ItemBonusOverhaul.class.getName() + ".getNewTimed($1); }"; Util.setBodyDeclared(thisClass, itemBonus, "isTimed", replace); + Util.setReason("Overwrite default check for bonus skillgain"); + replace = "{ return " + ItemBonusOverhaul.class.getName() + ".getNewSkillBonus($1, $2); }"; + Util.setBodyDeclared(thisClass, itemBonus, "getSkillGainBonus", replace); + Util.setReason("Overwrite default item spell effect lookup with one checking the custom list."); replace = "{ return " + ItemBonusOverhaul.class.getName() + ".getNewEffectForTemplateId($1, $2); }"; Util.setBodyDeclared(thisClass, ctSpellEffectsEnum, "getEnumForItemTemplateId", replace); diff --git a/src/main/java/mod/sin/wyvern/bonusoverhaul/ItemBonusWrapper.java b/src/main/java/mod/sin/wyvern/bonusoverhaul/ItemBonusWrapper.java index 3626d63..1724f1a 100644 --- a/src/main/java/mod/sin/wyvern/bonusoverhaul/ItemBonusWrapper.java +++ b/src/main/java/mod/sin/wyvern/bonusoverhaul/ItemBonusWrapper.java @@ -1,6 +1,7 @@ package mod.sin.wyvern.bonusoverhaul; import com.wurmonline.server.creatures.SpellEffectsEnum; +import com.wurmonline.server.skills.Skill; public class ItemBonusWrapper { private int templateid; @@ -8,6 +9,8 @@ public class ItemBonusWrapper { private boolean stackable; private float value; private boolean timed; + private boolean skillRestricted; + private int restrictedSkill; public ItemBonusWrapper(int templateid, SpellEffectsEnum effect, boolean stackable, float value, boolean timed) { this.templateid = templateid; @@ -15,6 +18,17 @@ public class ItemBonusWrapper { this.stackable = stackable; this.value = value; this.timed = timed; + this.skillRestricted = false; + } + + public ItemBonusWrapper(int templateid, SpellEffectsEnum effect, boolean stackable, float value, boolean timed, boolean skillRestricted, int restrictedSkill) { + this.templateid = templateid; + this.effect = effect; + this.stackable = stackable; + this.value = value; + this.timed = timed; + this.skillRestricted = skillRestricted; + this.restrictedSkill = restrictedSkill; } public int getTemplateid() { @@ -56,4 +70,20 @@ public class ItemBonusWrapper { public void setTimed(boolean timed) { this.timed = timed; } + + public boolean isSkillRestricted() { + return skillRestricted; + } + + public void setSkillRestricted(boolean skillRestricted) { + this.skillRestricted = skillRestricted; + } + + public int getRestrictedSkill() { + return restrictedSkill; + } + + public void setRestrictedSkill(int restrictedSkill) { + this.restrictedSkill = restrictedSkill; + } } diff --git a/src/main/java/mod/sin/wyvern/bounty/PlayerBounty.java b/src/main/java/mod/sin/wyvern/bounty/PlayerBounty.java index d285866..dfc9554 100644 --- a/src/main/java/mod/sin/wyvern/bounty/PlayerBounty.java +++ b/src/main/java/mod/sin/wyvern/bounty/PlayerBounty.java @@ -119,8 +119,8 @@ public class PlayerBounty { try { double fightskill = player.getFightingSkill().getKnowledge(); int quality = random.nextInt((int)fightskill); - Item crystal = ItemFactory.createItem(TreasureBox.templateId, quality, (random.nextInt((int)fightskill) < 20 ? (byte)0:(byte)1), ""); - player.getInventory().insertItem(crystal); + Item treasure = ItemFactory.createItem(TreasureBox.templateId, quality, ""); + player.getInventory().insertItem(treasure); player.getCommunicator().sendNormalServerMessage("You find something in your inventory!"); } catch (FailedException | NoSuchTemplateException e) { e.printStackTrace();