diff --git a/.idea/artifacts/wyvern_jar.xml b/.idea/artifacts/wyvern_jar.xml new file mode 100644 index 0000000..08b7194 --- /dev/null +++ b/.idea/artifacts/wyvern_jar.xml @@ -0,0 +1,8 @@ + + + $PROJECT_DIR$/classes/artifacts/wyvern_jar + + + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_github_Sindusk_sindusklibrary_v1_0.xml b/.idea/libraries/Gradle__com_github_Sindusk_sindusklibrary_v1_0.xml index d8a69ce..d678854 100644 --- a/.idea/libraries/Gradle__com_github_Sindusk_sindusklibrary_v1_0.xml +++ b/.idea/libraries/Gradle__com_github_Sindusk_sindusklibrary_v1_0.xml @@ -1,7 +1,7 @@ - + diff --git a/.idea/libraries/Gradle__org_gotti_wurmunlimited_common_2613165.xml b/.idea/libraries/Gradle__org_gotti_wurmunlimited_common_2613165.xml index 828f123..02cdd92 100644 --- a/.idea/libraries/Gradle__org_gotti_wurmunlimited_common_2613165.xml +++ b/.idea/libraries/Gradle__org_gotti_wurmunlimited_common_2613165.xml @@ -1,7 +1,7 @@ - + diff --git a/.idea/libraries/Gradle__org_gotti_wurmunlimited_server_2613165.xml b/.idea/libraries/Gradle__org_gotti_wurmunlimited_server_2613165.xml index 5cf5c19..09e5f1f 100644 --- a/.idea/libraries/Gradle__org_gotti_wurmunlimited_server_2613165.xml +++ b/.idea/libraries/Gradle__org_gotti_wurmunlimited_server_2613165.xml @@ -1,7 +1,7 @@ - + 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 index 019d815..6f76bba 100644 --- 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 @@ -1,11 +1,9 @@ - + - - - + \ 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 fdd8716..f60e353 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,11 +1,9 @@ - + - - - + \ No newline at end of file diff --git a/.idea/libraries/KingdomOffices.xml b/.idea/libraries/KingdomOffices.xml new file mode 100644 index 0000000..5f891cf --- /dev/null +++ b/.idea/libraries/KingdomOffices.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/WyvernMods_main.iml b/.idea/modules/WyvernMods_main.iml index 63a6697..f141708 100644 --- a/.idea/modules/WyvernMods_main.iml +++ b/.idea/modules/WyvernMods_main.iml @@ -14,5 +14,7 @@ + + \ No newline at end of file diff --git a/src/main/java/mod/sin/actions/items/PipingKitAction.java b/src/main/java/mod/sin/actions/items/PipingKitAction.java new file mode 100644 index 0000000..e88335d --- /dev/null +++ b/src/main/java/mod/sin/actions/items/PipingKitAction.java @@ -0,0 +1,121 @@ +package mod.sin.actions.items; + +import com.wurmonline.server.Items; +import com.wurmonline.server.behaviours.Action; +import com.wurmonline.server.behaviours.ActionEntry; +import com.wurmonline.server.behaviours.Actions; +import com.wurmonline.server.behaviours.NoSuchActionException; +import com.wurmonline.server.creatures.Creature; +import com.wurmonline.server.items.Item; +import com.wurmonline.server.items.ItemList; +import com.wurmonline.server.players.Player; +import com.wurmonline.server.skills.NoSuchSkillException; +import com.wurmonline.server.skills.Skill; +import com.wurmonline.server.skills.SkillList; +import mod.sin.items.PipingKit; +import org.gotti.wurmunlimited.modloader.ReflectionUtil; +import org.gotti.wurmunlimited.modsupport.actions.ActionPerformer; +import org.gotti.wurmunlimited.modsupport.actions.BehaviourProvider; +import org.gotti.wurmunlimited.modsupport.actions.ModAction; +import org.gotti.wurmunlimited.modsupport.actions.ModActions; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class PipingKitAction implements ModAction { + private static Logger logger = Logger.getLogger(EnchantOrbAction.class.getName()); + + private final short actionId; + private final ActionEntry actionEntry; + + public PipingKitAction() { + logger.log(Level.WARNING, "PipingKitAction()"); + + actionId = (short) ModActions.getNextActionId(); + actionEntry = ActionEntry.createEntry( + actionId, + "Pipe well", + "piping", + 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); + } + + + @Override + public BehaviourProvider getBehaviourProvider() + { + //int[] fillables = new int[] {ItemList.stoneWell, ItemList.stoneFountain, ItemList.stoneFountain2}; + return new BehaviourProvider() { + // Menu with activated object + @Override + public List getBehavioursFor(Creature performer, Item source, Item object) + { + if(performer instanceof Player && source != null && object != null && source.getTemplateId() == PipingKit.templateId && source != object && object.canBeAutoFilled()) { + return Arrays.asList(actionEntry); + } + return null; + } + }; + } + + public ActionPerformer getActionPerformer() + { + return new ActionPerformer() { + + @Override + public short getActionId() { + return actionId; + } + + // With activated object + @Override + public boolean action(Action act, Creature performer, Item source, Item target, short action, float counter) + { + try { + if (performer instanceof Player) { + Player player = (Player) performer; + if (source.getTemplate().getTemplateId() != PipingKit.templateId) { + player.getCommunicator().sendNormalServerMessage("You must use a Piping Kit to pipe wells."); + return true; + } + if (source.getWurmId() == target.getWurmId()) { + player.getCommunicator().sendNormalServerMessage("You cannot pipe the kit with itself!"); + return true; + } + if (target.isAutoFilled()) { + player.getCommunicator().sendNormalServerMessage("That object is already autofilled!"); + return true; + } + if(counter == 1.0f) { + player.getCommunicator().sendNormalServerMessage("You begin to pipe the " + target.getName()); + Skill combineSkill = performer.getSkills().getSkill(SkillList.MIND_LOGICAL); + int time = Actions.getStandardActionTime(performer, combineSkill, source, 0d); + act.setTimeLeft(time); + performer.sendActionControl("Piping", true, act.getTimeLeft()); + } + else if (counter * 10.0f > performer.getCurrentAction().getTimeLeft()) { + performer.getCommunicator().sendNormalServerMessage("You finish attatching the pipes. The " + target.getName() + " will now be autofilled with water!"); + target.setIsAutoFilled(true); + Items.destroyItem(source.getWurmId()); + return true; + } + } else { + logger.info("Somehow a non-player activated a piping kit..."); + } + return false; + } catch (NoSuchSkillException | NoSuchActionException e) { + e.printStackTrace(); + return true; + } + } + + + }; // ActionPerformer + } +} diff --git a/src/main/java/mod/sin/actions/items/StableContractAction.java b/src/main/java/mod/sin/actions/items/StableContractAction.java new file mode 100644 index 0000000..a02d85f --- /dev/null +++ b/src/main/java/mod/sin/actions/items/StableContractAction.java @@ -0,0 +1,113 @@ +package mod.sin.actions.items; + +import com.wurmonline.server.Items; +import com.wurmonline.server.behaviours.Action; +import com.wurmonline.server.behaviours.ActionEntry; +import com.wurmonline.server.behaviours.NoSuchActionException; +import com.wurmonline.server.creatures.Creature; +import com.wurmonline.server.creatures.CreatureTemplateFactory; +import com.wurmonline.server.creatures.Creatures; +import com.wurmonline.server.items.Item; +import com.wurmonline.server.players.Player; +import com.wurmonline.server.villages.Village; +import mod.sin.items.StableContract; +import mod.sin.wyvern.bestiary.MethodsBestiary; +import org.gotti.wurmunlimited.modsupport.actions.*; + +import java.util.Collections; +import java.util.List; +import java.util.Random; +import java.util.logging.Logger; + +public class StableContractAction implements ModAction, BehaviourProvider, ActionPerformer { + private static Logger logger = Logger.getLogger(StableContractAction.class.getName()); + + private final short actionId; + private final ActionEntry actionEntry; + + public StableContractAction() { + // Get the action id + actionId = (short) ModActions.getNextActionId(); + // Create the action entry + actionEntry = new ActionEntryBuilder(actionId, "Summon stablemaster", + "summoning").build(); + // Register the action entry + ModActions.registerAction(actionEntry); + } + + // Menu with activated object + @Override + public List getBehavioursFor(Creature performer, Item source, Item object) + { + return this.getBehavioursFor(performer, object); + } + + // Menu without activated object + @Override + public List getBehavioursFor(Creature performer, Item object) + { + if(performer instanceof Player && object != null && object.getTemplateId() == StableContract.templateId) { + return Collections.singletonList(actionEntry); + } + + return null; + } + + @Override + public short getActionId() { + return actionId; + } + + // without item + @Override + public boolean action(Action act, Creature performer, Item target, short action, float counter) { + try { + if(target.getTemplate().getTemplateId() != StableContract.templateId) { + performer.getCommunicator().sendNormalServerMessage("You cannot summon the stable master right now!"); + return true; + } + if(counter == 1.0f) { + performer.getCommunicator().sendNormalServerMessage("You begin reading the contract..."); + final int time = 5; + performer.getCurrentAction().setTimeLeft(time); + performer.sendActionControl("Reading contract", true, time); + } + else { + int time = 0; + time = performer.getCurrentAction().getTimeLeft(); + + if(counter * 10.0f > time) { + int stablemasterID = CreatureTemplateFactory.getInstance().getTemplate("Stable master").getTemplateId(); + float x = performer.getPosX(); + float y = performer.getPosY(); + byte gender = (byte)new Random().nextInt(2); + String name = "Stable master " + (gender == 0 ? MethodsBestiary.generateGuardMaleName() : MethodsBestiary.generateGuardFemaleName()); + + + Creature stablemaster = Creature.doNew(stablemasterID, x, y, 180.0f, performer.getLayer(), name, gender, performer.getKingdomId()); + Items.destroyItem(target.getWurmId()); + performer.getCommunicator().sendNormalServerMessage("A stable master appears from the air!"); + Village village = performer.getCurrentVillage(); + if(village != null) { + village.addCitizen(stablemaster, village.getRoleForStatus((byte) 3)); + } + return true; + } + } + return false; + } + catch (Exception e) { + performer.getCommunicator().sendNormalServerMessage("Something went wrong!"); + e.printStackTrace(); + return true; + } + } + + // with + @Override + public boolean action(Action act, Creature performer, Item source, Item target, short action, float counter) + { + return this.action(act, performer, target, action, counter); + } + +} diff --git a/src/main/java/mod/sin/creatures/Charger.java b/src/main/java/mod/sin/creatures/Charger.java index a48bed1..c5dadb5 100644 --- a/src/main/java/mod/sin/creatures/Charger.java +++ b/src/main/java/mod/sin/creatures/Charger.java @@ -89,11 +89,11 @@ public class Charger implements ModCreature, CreatureTypes { vehicle.setSeatFightMod(0, 0.8f, 1.1f); vehicle.setSeatOffset(0, 0.0f, 0.0f, 0.0f); vehicle.setCreature(true); - vehicle.setSkillNeeded(Servers.localServer.PVPSERVER ? 25.0f : 37.0f); + vehicle.setSkillNeeded(Servers.localServer.PVPSERVER ? 25.0f : 41.0f); vehicle.setName(creature.getName()); vehicle.setMaxHeightDiff(0.06f); vehicle.setMaxDepth(-1.7f); - vehicle.setMaxSpeed(Servers.localServer.PVPSERVER ? 32.0f : 34.0f); + vehicle.setMaxSpeed(Servers.localServer.PVPSERVER ? 32.0f : 35.0f); vehicle.setCommandType((byte) 3); vehicle.setCanHaveEquipment(true); } diff --git a/src/main/java/mod/sin/items/AffinityOrb.java b/src/main/java/mod/sin/items/AffinityOrb.java index 35c57ff..5996884 100644 --- a/src/main/java/mod/sin/items/AffinityOrb.java +++ b/src/main/java/mod/sin/items/AffinityOrb.java @@ -37,7 +37,7 @@ public class AffinityOrb implements ItemTypes, MiscConstants { itemBuilder.weightGrams(500); itemBuilder.material(Materials.MATERIAL_CRYSTAL); itemBuilder.value(1000000); - itemBuilder.isTraded(true); + itemBuilder.isTraded(false); ItemTemplate template = itemBuilder.build(); templateId = template.getTemplateId(); diff --git a/src/main/java/mod/sin/items/BookOfConversion.java b/src/main/java/mod/sin/items/BookOfConversion.java index 2df3533..a7d80ab 100644 --- a/src/main/java/mod/sin/items/BookOfConversion.java +++ b/src/main/java/mod/sin/items/BookOfConversion.java @@ -35,7 +35,7 @@ public class BookOfConversion implements ItemTypes, MiscConstants { itemBuilder.weightGrams(500); itemBuilder.material(Materials.MATERIAL_PAPER); itemBuilder.value(50000); - itemBuilder.isTraded(true); + itemBuilder.isTraded(false); ItemTemplate template = itemBuilder.build(); templateId = template.getTemplateId(); diff --git a/src/main/java/mod/sin/items/ChaosCrystal.java b/src/main/java/mod/sin/items/ChaosCrystal.java index 920103c..50053bf 100644 --- a/src/main/java/mod/sin/items/ChaosCrystal.java +++ b/src/main/java/mod/sin/items/ChaosCrystal.java @@ -42,8 +42,8 @@ public class ChaosCrystal implements ItemTypes, MiscConstants { itemBuilder.difficulty(5.0f); itemBuilder.weightGrams(250); itemBuilder.material(Materials.MATERIAL_CRYSTAL); - itemBuilder.value(5000); - itemBuilder.isTraded(true); + itemBuilder.value(500000); + itemBuilder.isTraded(false); ItemTemplate template = itemBuilder.build(); templateId = template.getTemplateId(); diff --git a/src/main/java/mod/sin/items/EnchantersCrystal.java b/src/main/java/mod/sin/items/EnchantersCrystal.java index 4967cb5..86e98d8 100644 --- a/src/main/java/mod/sin/items/EnchantersCrystal.java +++ b/src/main/java/mod/sin/items/EnchantersCrystal.java @@ -42,8 +42,8 @@ public class EnchantersCrystal implements ItemTypes, MiscConstants { itemBuilder.difficulty(5.0f); itemBuilder.weightGrams(250); itemBuilder.material(Materials.MATERIAL_CRYSTAL); - itemBuilder.value(5000); - itemBuilder.isTraded(true); + itemBuilder.value(500000); + itemBuilder.isTraded(false); ItemTemplate template = itemBuilder.build(); templateId = template.getTemplateId(); diff --git a/src/main/java/mod/sin/items/HugeCrate.java b/src/main/java/mod/sin/items/HugeCrate.java index a8fa8e4..0fe878c 100644 --- a/src/main/java/mod/sin/items/HugeCrate.java +++ b/src/main/java/mod/sin/items/HugeCrate.java @@ -40,6 +40,7 @@ public class HugeCrate implements ItemTypes, MiscConstants { itemBuilder.combatDamage(0); itemBuilder.decayTime(9072000); itemBuilder.dimensions(140, 140, 140); + itemBuilder.maxItemCount(500); itemBuilder.primarySkill((int) NOID); itemBuilder.bodySpaces(EMPTY_BYTE_PRIMITIVE_ARRAY); itemBuilder.modelName("model.container.crate.large."); diff --git a/src/main/java/mod/sin/items/PipingKit.java b/src/main/java/mod/sin/items/PipingKit.java new file mode 100644 index 0000000..19b46a9 --- /dev/null +++ b/src/main/java/mod/sin/items/PipingKit.java @@ -0,0 +1,44 @@ +package mod.sin.items; + +import com.wurmonline.server.MiscConstants; +import com.wurmonline.server.items.ItemTemplate; +import com.wurmonline.server.items.ItemTypes; +import com.wurmonline.server.items.Materials; +import org.gotti.wurmunlimited.modsupport.ItemTemplateBuilder; + +import java.io.IOException; +import java.util.logging.Logger; + +public class PipingKit implements ItemTypes, MiscConstants { + public static Logger logger = Logger.getLogger(PipingKit.class.getName()); + public static int templateId; + + public void createTemplate() throws IOException { + String name = "piping kit"; + ItemTemplateBuilder itemBuilder = new ItemTemplateBuilder("mod.item.piping.kit"); + itemBuilder.name(name, "piping kit", "A tool kit for directing pipes into a source of water."); + itemBuilder.descriptions("excellent", "good", "ok", "poor"); + itemBuilder.itemTypes(new short[]{ // {108, 146, 44, 21, 147, 113} - War Arrow + ItemTypes.ITEM_TYPE_FULLPRICE, + ItemTypes.ITEM_TYPE_NOSELLBACK, + ItemTypes.ITEM_TYPE_ALWAYS_BANKABLE + }); + itemBuilder.imageNumber((short) 760); + itemBuilder.behaviourType((short) 1); + itemBuilder.combatDamage(0); + itemBuilder.decayTime(Long.MAX_VALUE); + itemBuilder.dimensions(15, 15, 50); + itemBuilder.primarySkill((int) NOID); + itemBuilder.bodySpaces(MiscConstants.EMPTY_BYTE_PRIMITIVE_ARRAY); + itemBuilder.modelName("model.container.quiver."); + itemBuilder.difficulty(300.0f); + itemBuilder.weightGrams(4500); + itemBuilder.material(Materials.MATERIAL_STEEL); + itemBuilder.value(50000); + itemBuilder.isTraded(false); + + ItemTemplate template = itemBuilder.build(); + templateId = template.getTemplateId(); + logger.info(name+" TemplateID: "+templateId); + } +} diff --git a/src/main/java/mod/sin/items/SealedMap.java b/src/main/java/mod/sin/items/SealedMap.java index ed94556..5617aee 100644 --- a/src/main/java/mod/sin/items/SealedMap.java +++ b/src/main/java/mod/sin/items/SealedMap.java @@ -36,7 +36,7 @@ public class SealedMap implements ItemTypes, MiscConstants { itemBuilder.weightGrams(500); itemBuilder.material(Materials.MATERIAL_MAGIC); itemBuilder.value(2000000); - itemBuilder.isTraded(true); + itemBuilder.isTraded(false); ItemTemplate template = itemBuilder.build(); templateId = template.getTemplateId(); diff --git a/src/main/java/mod/sin/items/StableContract.java b/src/main/java/mod/sin/items/StableContract.java new file mode 100644 index 0000000..aaeb940 --- /dev/null +++ b/src/main/java/mod/sin/items/StableContract.java @@ -0,0 +1,44 @@ +package mod.sin.items; + +import com.wurmonline.server.MiscConstants; +import com.wurmonline.server.items.ItemTemplate; +import com.wurmonline.server.items.ItemTypes; +import com.wurmonline.server.items.Materials; +import org.gotti.wurmunlimited.modsupport.ItemTemplateBuilder; + +import java.io.IOException; +import java.util.logging.Logger; + +public class StableContract implements ItemTypes, MiscConstants { + public static Logger logger = Logger.getLogger(PipingKit.class.getName()); + public static int templateId; + + public void createTemplate() throws IOException { + String name = "stable master contract"; + ItemTemplateBuilder itemBuilder = new ItemTemplateBuilder("mod.item.stable.master.contract"); + itemBuilder.name(name, "stable master contract", "A contract for hiring a stable master."); + itemBuilder.descriptions("excellent", "good", "ok", "poor"); + itemBuilder.itemTypes(new short[]{ // {108, 146, 44, 21, 147, 113} - War Arrow + ItemTypes.ITEM_TYPE_FULLPRICE, + ItemTypes.ITEM_TYPE_NOSELLBACK, + ItemTypes.ITEM_TYPE_ALWAYS_BANKABLE + }); + itemBuilder.imageNumber((short) 324); + itemBuilder.behaviourType((short) 1); + itemBuilder.combatDamage(0); + itemBuilder.decayTime(Long.MAX_VALUE); + itemBuilder.dimensions(1, 10, 10); + itemBuilder.primarySkill((int) NOID); + itemBuilder.bodySpaces(MiscConstants.EMPTY_BYTE_PRIMITIVE_ARRAY); + itemBuilder.modelName("model.writ.trader."); + itemBuilder.difficulty(300.0f); + itemBuilder.weightGrams(0); + itemBuilder.material(Materials.MATERIAL_PAPER); + itemBuilder.value(100000); + itemBuilder.isTraded(false); + + ItemTemplate template = itemBuilder.build(); + templateId = template.getTemplateId(); + logger.info(name+" TemplateID: "+templateId); + } +} diff --git a/src/main/java/mod/sin/wyvern/Arena.java b/src/main/java/mod/sin/wyvern/Arena.java index be78a66..40bea65 100644 --- a/src/main/java/mod/sin/wyvern/Arena.java +++ b/src/main/java/mod/sin/wyvern/Arena.java @@ -23,7 +23,6 @@ import mod.sin.items.caches.*; import mod.sin.lib.Util; import org.gotti.wurmunlimited.modloader.classhooks.HookException; import org.gotti.wurmunlimited.modloader.classhooks.HookManager; -import org.nyxcode.wurm.discordrelay.DiscordRelay; import java.util.logging.Logger; @@ -82,9 +81,6 @@ public class Arena { nsq.sendQuestion(); } - public static void sendHotaMessage(String message){ - DiscordRelay.sendToDiscord("arena", message, true); - } public static void createNewHotaPrize(Village v, int winStreak){ try { diff --git a/src/main/java/mod/sin/wyvern/EconomicChanges.java b/src/main/java/mod/sin/wyvern/EconomicChanges.java index 8befbb9..d52116e 100644 --- a/src/main/java/mod/sin/wyvern/EconomicChanges.java +++ b/src/main/java/mod/sin/wyvern/EconomicChanges.java @@ -1,6 +1,7 @@ package mod.sin.wyvern; import com.wurmonline.server.items.Item; +import com.wurmonline.server.items.ItemTemplateFactory; import com.wurmonline.server.villages.GuardPlan; import com.wurmonline.server.villages.Village; import com.wurmonline.server.villages.Villages; diff --git a/src/main/java/mod/sin/wyvern/ItemMod.java b/src/main/java/mod/sin/wyvern/ItemMod.java index 034f2f7..13d8389 100644 --- a/src/main/java/mod/sin/wyvern/ItemMod.java +++ b/src/main/java/mod/sin/wyvern/ItemMod.java @@ -10,6 +10,8 @@ import java.util.Map; import java.util.logging.Logger; import com.wurmonline.server.Servers; +import com.wurmonline.server.behaviours.Action; +import mod.sin.lib.Util; import org.gotti.wurmunlimited.modloader.ReflectionUtil; import org.gotti.wurmunlimited.modloader.classhooks.HookManager; import org.gotti.wurmunlimited.modloader.classhooks.InvocationHandlerFactory; @@ -95,6 +97,10 @@ public class ItemMod { public static GlimmerscaleHose GLIMMERSCALE_HOSE = new GlimmerscaleHose(); public static GlimmerscaleSleeve GLIMMERSCALE_SLEEVE = new GlimmerscaleSleeve(); public static GlimmerscaleVest GLIMMERSCALE_VEST = new GlimmerscaleVest(); + + //Ocnoc + public static PipingKit PIPING_KIT = new PipingKit(); + public static StableContract STABLE_CONTRACT = new StableContract(); public static void createItems(){ logger.info("createItems()"); @@ -126,6 +132,9 @@ public class ItemMod { TREASURE_BOX.createTemplate(); WARHAMMER.createTemplate(); WARHAMMER_HEAD.createTemplate(); + PIPING_KIT.createTemplate(); + STABLE_CONTRACT.createTemplate(); + // Arena Fragments KEY_FRAGMENT.createTemplate(); @@ -178,6 +187,8 @@ public class ItemMod { ModActions.registerAction(new SealedMapAction()); ModActions.registerAction(new SupplyDepotAction()); ModActions.registerAction(new TreasureBoxAction()); + ModActions.registerAction(new PipingKitAction()); + ModActions.registerAction(new StableContractAction()); } public static void initCreationEntries(){ @@ -198,6 +209,7 @@ public class ItemMod { //STATUETTE_CYBERHUSKY.initCreationEntry(); WARHAMMER.initCreationEntry(); WARHAMMER_HEAD.initCreationEntry(); + //HUGE_CRATE.initCreationEntry(); // Spectral set /*SPECTRAL_BOOT.initCreationEntry(); @@ -326,9 +338,21 @@ public class ItemMod { ItemTemplate goldMirror = ItemTemplateFactory.getInstance().getTemplate(ItemList.goldenMirror); ReflectionUtil.setPrivateField(goldMirror, ReflectionUtil.getField(goldMirror.getClass(), "value"), 1000000); - // Set transmutation rod to 2 gold instead of 50 silver. - //ItemTemplate transmutationRod = ItemTemplateFactory.getInstance().getTemplate(668); - //ReflectionUtil.setPrivateField(transmutationRod, ReflectionUtil.getField(transmutationRod.getClass(), "value"), 2000000); + // Set sculpting wand to be 25 silver + ItemTemplate sculptingWand = ItemTemplateFactory.getInstance().getTemplate(ItemList.wandSculpting); + ReflectionUtil.setPrivateField(sculptingWand, ReflectionUtil.getField(sculptingWand.getClass(), "value"), 250000); + ReflectionUtil.setPrivateField(sculptingWand, ReflectionUtil.getField(sculptingWand.getClass(), "nodrop"), false); + + // Set mysteryEgg to be 5 silver + int mysteryEggID = ItemTemplateFactory.getInstance().getTemplate("mystery egg").getTemplateId(); + ItemTemplate mysteryEgg = ItemTemplateFactory.getInstance().getTemplate(mysteryEggID); + ReflectionUtil.setPrivateField(mysteryEgg, ReflectionUtil.getField(mysteryEgg.getClass(), "value"), 50000); + ReflectionUtil.setPrivateField(mysteryEgg, ReflectionUtil.getField(mysteryEgg.getClass(), "fullprice"), true); + + //Set transmutation rod to 2 gold instead of 50 silver. + ItemTemplate transmutationRod = ItemTemplateFactory.getInstance().getTemplate(ItemList.rodTransmutation); + ReflectionUtil.setPrivateField(transmutationRod, ReflectionUtil.getField(transmutationRod.getClass(), "value"), 2000000); + // " return this.isTransportable || (this.getTemplateId() >= 510 && this.getTemplateId() <= 513) || this.getTemplateId() == 722 || this.getTemplateId() == 670;" // Make mailboxes loadable (PvE Only) @@ -380,6 +404,7 @@ public class ItemMod { ReflectionUtil.setPrivateField(marbleKeystone, ReflectionUtil.getField(marbleKeystone.getClass(), "decoration"), true); ItemTemplate skull = ItemTemplateFactory.getInstance().getTemplate(ItemList.skull); ReflectionUtil.setPrivateField(skull, ReflectionUtil.getField(skull.getClass(), "decoration"), true); + // Still need to override the method for getting spaceLeft createCustomWeapons(); createCustomArmours(); diff --git a/src/main/java/mod/sin/wyvern/MiscChanges.java b/src/main/java/mod/sin/wyvern/MiscChanges.java index 3f6b244..f5b0d0a 100644 --- a/src/main/java/mod/sin/wyvern/MiscChanges.java +++ b/src/main/java/mod/sin/wyvern/MiscChanges.java @@ -25,7 +25,6 @@ import mod.sin.lib.Util; import org.gotti.wurmunlimited.modloader.classhooks.HookException; import org.gotti.wurmunlimited.modloader.classhooks.HookManager; import org.gotti.wurmunlimited.modsupport.ModSupportDb; -import org.nyxcode.wurm.discordrelay.DiscordRelay; import java.sql.Connection; import java.sql.PreparedStatement; @@ -46,7 +45,6 @@ public class MiscChanges { } public static void sendServerTabMessage(String channel, final String message, final int red, final int green, final int blue){ - DiscordRelay.sendToDiscord(channel, message, true); // WARNING: Never change this from a new Runnable. Lambdas are a lie and will break everything. Runnable r = new Runnable() { public void run() { @@ -84,7 +82,6 @@ public class MiscChanges { sendGlobalFreedomChat(player, slayMessage+slayers, 200, 25, 25); addPlayerStatsDeath(player.getName()); addPlayerStatsKill(slayers); - DiscordRelay.sendToDiscord("deaths", player.getName()+" "+slayMessage+slayers, true); } public static void addPlayerStat(String playerName, String stat){ @@ -314,8 +311,8 @@ public class MiscChanges { // - Enable creature custom colors - (Used for creating custom color creatures eg. Lilith) - // CtClass ctCreature = classPool.get("com.wurmonline.server.creatures.Creature"); - replace = "{ return true; }"; - Util.setBodyDeclared(thisClass, ctCreature, "hasCustomColor", replace); +/** replace = "{ return true; }"; + Util.setBodyDeclared(thisClass, ctCreature, "hasCustomColor", replace);**/ // - Increase the amount of checks for new unique spawns by 5x - // CtClass ctServer = classPool.get("com.wurmonline.server.Server"); @@ -626,10 +623,16 @@ public class MiscChanges { "}"; Util.instrumentDeclared(thisClass, ctAffinitiesTimed, "add", "getExpires", replace); + Util.setReason("Make weaponsmithing oils actually help with weaponsmithing"); + replace = "if($1 == 1016){" + + "return $0.getSpellEffectPower((byte)77);" + + "}"; + Util.insertBeforeDeclared(thisClass, ctItem, "getSkillSpellImprovement", replace); + Util.setReason("Make bed QL affect sleep bonus timer."); CtClass ctPlayerInfo = classPool.get("com.wurmonline.server.players.PlayerInfo"); - replace = "secs = "+MiscChanges.class.getName()+".getBedBonus(secs, this.bed);" + - "$_ = $proceed($$);"; + replace = "long secs2 = "+MiscChanges.class.getName()+".getBedBonus(secs, this.bed);" + + "$_ = $proceed((int)(this.sleep + secs2));"; Util.instrumentDeclared(thisClass, ctPlayerInfo, "calculateSleep", "setSleep", replace); Util.setReason("Fix intrateleport block bug."); diff --git a/src/main/java/mod/sin/wyvern/QualityOfLife.java b/src/main/java/mod/sin/wyvern/QualityOfLife.java index d0e1c3d..9271bd3 100644 --- a/src/main/java/mod/sin/wyvern/QualityOfLife.java +++ b/src/main/java/mod/sin/wyvern/QualityOfLife.java @@ -1,17 +1,19 @@ package mod.sin.wyvern; +import com.wurmonline.server.FailedException; import com.wurmonline.server.Items; import com.wurmonline.server.NoSuchItemException; import com.wurmonline.server.NoSuchPlayerException; import com.wurmonline.server.creatures.Creature; import com.wurmonline.server.creatures.NoSuchCreatureException; -import com.wurmonline.server.items.Item; -import com.wurmonline.server.items.ItemList; +import com.wurmonline.server.items.*; +import com.wurmonline.server.skills.Skill; import com.wurmonline.server.zones.NoSuchZoneException; import javassist.ClassPool; import javassist.CtClass; import javassist.NotFoundException; import javassist.bytecode.Descriptor; +import mod.sin.items.HugeCrate; import mod.sin.lib.Util; import org.gotti.wurmunlimited.modloader.classhooks.HookException; import org.gotti.wurmunlimited.modloader.classhooks.HookManager; @@ -53,6 +55,7 @@ public class QualityOfLife { return false; } } + public static Item getVehicleSafe(Creature pilot) { try { if (pilot.getVehicle() != -10) @@ -126,6 +129,7 @@ public class QualityOfLife { QualityOfLife.class.getName()+".vehicleHook(performer, $0);"; Util.instrumentDescribed(thisClass, ctTileRockBehaviour, "action", desc2, "setDataXY", replace);*/ + Util.setReason("Allow players to surface mine directly into vehicles."); CtClass ctTileRockBehaviour = classPool.get("com.wurmonline.server.behaviours.TileRockBehaviour"); replace = "$_ = $proceed($$);" + @@ -148,6 +152,18 @@ public class QualityOfLife { replace = "$_ = false;"; Util.instrumentDeclared(thisClass, ctMethodsCreatures, "tame", "isPriest", replace); + Util.setReason("Allow dirt to add up to 100 dirt to a container."); + CtClass ctDirt = classPool.get("com.wurmonline.server.spells.Dirt"); + replace = "$1 = 100;" + + "$_ = $proceed($$);"; + Util.instrumentDeclared(thisClass, ctDirt, "doEffect", "min", replace); + + Util.setReason("Rescale Wild Growth to work up to an 8x8 area"); + CtClass ctWildGrowth = classPool.get("com.wurmonline.server.spells.WildGrowth"); + replace = "$2 = (power / 10.0); $_ = $proceed($$);"; + Util.instrumentDeclared(thisClass, ctWildGrowth, "doEffect", "max", replace); + + Util.setReason("Send gems, source crystals, flint, etc. into vehicle."); CtClass[] params2 = { CtClass.intType, diff --git a/src/main/java/mod/sin/wyvern/WyvernMods.java b/src/main/java/mod/sin/wyvern/WyvernMods.java index 23a9c80..c1749ad 100644 --- a/src/main/java/mod/sin/wyvern/WyvernMods.java +++ b/src/main/java/mod/sin/wyvern/WyvernMods.java @@ -3,6 +3,8 @@ package mod.sin.wyvern; import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; import java.nio.ByteBuffer; import java.nio.file.Paths; import java.sql.Connection; @@ -16,13 +18,18 @@ import java.util.logging.Logger; import java.util.logging.SimpleFormatter; import com.wurmonline.server.Items; +import com.wurmonline.server.Server; import com.wurmonline.server.creatures.Communicator; import com.wurmonline.server.creatures.Creature; import com.wurmonline.server.items.*; +import javassist.bytecode.Descriptor; +import mod.sin.items.*; +import mod.sin.kingdomoffices.ItemCreator; import mod.sin.lib.Util; 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.classhooks.InvocationHandlerFactory; import org.gotti.wurmunlimited.modloader.interfaces.*; import org.gotti.wurmunlimited.modsupport.ModSupportDb; import org.gotti.wurmunlimited.modsupport.actions.ModActions; @@ -259,6 +266,65 @@ implements WurmServerMod, Configurable, PreInitable, Initable, ItemTemplatesCrea } catch (NoSuchTemplateException | IllegalArgumentException | IllegalAccessException | ClassCastException | NoSuchFieldException e) { e.printStackTrace(); } + try { + logger.info("Attempting Shop Hook..."); + logger.info("Creating Hook Descriptor..."); + String descriptor = Descriptor.ofMethod(CtClass.voidType, new CtClass[] { + HookManager.getInstance().getClassPool().get("com.wurmonline.server.creatures.Creature") + }); + logger.info("Hooking createShop..."); + HookManager.getInstance().registerHook("com.wurmonline.server.economy.Shop", "createShop", descriptor, new InvocationHandlerFactory() + { + @Override + public InvocationHandler createInvocationHandler() { + return new InvocationHandler() { + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + Object result = method.invoke(proxy, args); + Item inventory = ((Creature)args[0]).getInventory(); + for(int x = 0; x < 3; ++x) { + // this is our item... + Item item; + // Book of conversion + item = Creature.createItem(BookOfConversion.templateId, 50.0f); + inventory.insertItem(item); + // Common mystery egg + int mysteryEggID = ItemTemplateFactory.getInstance().getTemplate("mystery egg").getTemplateId(); + item = Creature.createItem(mysteryEggID, 100); + inventory.insertItem(item); + // Affinity orb + item = Creature.createItem(AffinityOrb.templateId, 50 + Server.rand.nextInt(50)); + inventory.insertItem(item); + // Chaos crystal + item = Creature.createItem(ChaosCrystal.templateId, 5); + inventory.insertItem(item); + // Enchanter's Crystal + item = Creature.createItem(EnchantersCrystal.templateId, 1 + Server.rand.nextInt(99)); + inventory.insertItem(item); + // Sealed map + item = Creature.createItem(SealedMap.templateId, 1 + Server.rand.nextInt(99)); + inventory.insertItem(item); + // Sculpting wand + item = Creature.createItem(ItemList.wandSculpting, 50); + inventory.insertItem(item); + // Piping kit + item = Creature.createItem(PipingKit.templateId, 50); + inventory.insertItem(item); + // Stable master contract + item = Creature.createItem(StableContract.templateId, 50); + inventory.insertItem(item); + // Kingdom token + item = Creature.createItem(ItemCreator.KINGDOM_TOKEN.getTemplateId(), 50); + inventory.insertItem(item); + } + return result; + } + }; + } + }); + } catch ( IllegalArgumentException | ClassCastException | NotFoundException e) { + e.printStackTrace(); + } } @Override @@ -341,8 +407,8 @@ implements WurmServerMod, Configurable, PreInitable, Initable, ItemTemplatesCrea logger.info("Registering Arena actions."); ModActions.registerAction(new SorceryCombineAction()); //ModActions.registerAction(new VillageTeleportAction()); // [3/28/18] Disabled - Highway Portals added instead. - ModActions.registerAction(new ArenaTeleportAction()); - ModActions.registerAction(new ArenaEscapeAction()); + //ModActions.registerAction(new ArenaTeleportAction()); + //ModActions.registerAction(new ArenaEscapeAction()); logger.info("Registering Dev actions."); ModActions.registerAction(new MissionAddAction()); ModActions.registerAction(new MissionRemoveAction()); diff --git a/src/main/java/mod/sin/wyvern/bestiary/MethodsBestiary.java b/src/main/java/mod/sin/wyvern/bestiary/MethodsBestiary.java index 84f1aad..1df366c 100644 --- a/src/main/java/mod/sin/wyvern/bestiary/MethodsBestiary.java +++ b/src/main/java/mod/sin/wyvern/bestiary/MethodsBestiary.java @@ -113,6 +113,22 @@ public class MethodsBestiary { return (byte)127; } + public static String generateGuardMaleName() { + final int rand = Server.rand.nextInt(50); + final String[] firstPart = { "Carl", "John", "Bil", "Strong", "Dare", "Grave", "Hard", "Marde", "Verde", "Vold", "Tolk", "Roe", "Bee", "Har", "Rol", "Ma", "Lo", "Claw", "Drag", "Hug", "Te", "Two", "Fu", "Ji", "La", "Ze", "Jal", "Milk", "War", "Wild", "Hang", "Just", "Fan", "Cloclo", "Buy", "Bought", "Sard", "Smart", "Slo", "Shield", "Dark", "Hung", "Sed", "Sold", "Swing", "Gar", "Dig", "Bur", "Angel", "Sorrow" }; + final int rand2 = Server.rand.nextInt(50); + final String[] secondPart = { "ho", "john", "fish", "tree", "ooy", "olli", "tack", "rank", "sy", "moy", "dangly", "tok", "rich", "do", "mark", "stuf", "sin", "nyt", "wer", "mor", "emort", "vaar", "salm", "holm", "wyr", "zah", "ty", "fast", "der", "mar", "star", "bark", "oo", "flifil", "innow", "shoo", "husk", "eric", "ic", "o", "moon", "little", "ien", "strong", "arm", "hope", "slem", "tro", "rot", "heart" }; + return firstPart[rand] + secondPart[rand2]; + } + + public static String generateGuardFemaleName() { + final int rand = Server.rand.nextInt(50); + final String[] firstPart = { "Too", "Sand", "Tree", "Whisper", "Lore", "Yan", "Van", "Vard", "Nard", "Oli", "Ala", "Krady", "Whe", "Har", "Zizi", "Zaza", "Lyn", "Claw", "Mali", "High", "Bright", "Star", "Nord", "Jala", "Yna", "Ze", "Jal", "Milk", "War", "Wild", "Fine", "Sweet", "Witty", "Cloclo", "Lory", "Tran", "Vide", "Lax", "Quick", "Shield", "Dark", "Light", "Cry", "Sold", "Juna", "Tear", "Cheek", "Ani", "Angel", "Sorro" }; + final int rand2 = Server.rand.nextInt(50); + final String[] secondPart = { "peno", "hag", "maiden", "woman", "loy", "oa", "dei", "sai", "nai", "nae", "ane", "aei", "peno", "doa", "ela", "hofaire", "sina", "nyta", "wera", "more", "emorta", "vaara", "salma", "holmi", "wyre", "zahe", "tya", "faste", "dere", "mara", "stare", "barkia", "ooa", "fila", "innowyn", "shoein", "huskyn", "erica", "ica", "oa", "moonie", "littly", "ieny", "strongie", "ermy", "hope", "steam", "high", "wind", "heart" }; + return firstPart[rand] + secondPart[rand2]; + } + protected static boolean isUsuallyHitched(int templateId){ if(templateId == Charger.templateId){ return true; @@ -485,7 +501,9 @@ public class MethodsBestiary { public static byte newCreatureType(int templateid, byte ctype) throws Exception{ CreatureTemplate template = CreatureTemplateFactory.getInstance().getTemplate(templateid); - if(ctype == 0 && (template.isAggHuman() || template.getBaseCombatRating() > 10) && !template.isUnique() && !Titans.isTitan(templateid)){ + // Disallow this from occuring to minipets, it crashes + int minipetid = CreatureTemplateFactory.getInstance().getTemplate("Mini Pet").getTemplateId(); + if(ctype == 0 && (template.isAggHuman() || template.getBaseCombatRating() > 10) && !template.isUnique() && !Titans.isTitan(templateid) && !(templateid == minipetid)) { if(Server.rand.nextInt(5) == 0){ ctype = (byte) (Server.rand.nextInt(11)+1); if(Server.rand.nextInt(50) == 0){ diff --git a/src/main/java/mod/sin/wyvern/bounty/LootBounty.java b/src/main/java/mod/sin/wyvern/bounty/LootBounty.java index 20b8ec7..9e51cf6 100644 --- a/src/main/java/mod/sin/wyvern/bounty/LootBounty.java +++ b/src/main/java/mod/sin/wyvern/bounty/LootBounty.java @@ -21,9 +21,14 @@ import com.wurmonline.server.villages.Villages; import mod.sin.armour.SpectralHide; import mod.sin.creatures.Reaper; import mod.sin.creatures.SpectralDrake; +import mod.sin.items.AffinityOrb; import mod.sin.items.ChaosCrystal; import mod.sin.items.EnchantersCrystal; import mod.sin.items.FriyanTablet; +import mod.sin.items.caches.GemCache; +import mod.sin.items.caches.RiftCache; +import mod.sin.items.caches.ToolCache; +import mod.sin.items.caches.TreasureMapCache; import mod.sin.wyvern.Bounty; import mod.sin.wyvern.MiscChanges; import mod.sin.wyvern.Arena; @@ -219,6 +224,21 @@ public class LootBounty { if(random.nextInt(100) < 75){ corpse.insertItem(ItemFactory.createItem((random.nextBoolean() ? ItemList.adamantineBar : ItemList.glimmerSteelBar), 30+(30*random.nextFloat()), "")); } + if(random.nextInt(100) < 25) { + Item item = ItemFactory.createItem(ItemUtil.getMysteryEggID(), 50, ""); + item.setRarity((byte)1); + corpse.insertItem(item); + } + if(random.nextInt(100) < 5) { + int[] caches = { + TreasureMapCache.templateId, + GemCache.templateId, + RiftCache.templateId + }; + int cacheSelected = random.nextInt(3); + Item item = ItemFactory.createItem(caches[cacheSelected], 20 + random.nextInt(40), ""); + corpse.insertItem(item); + } if(random.nextInt(100) < 5){ //int[] maskTemplates = {973, 974, 975, 976, 977, 978, 1099}; int[] maskTemplates = { @@ -270,7 +290,8 @@ public class LootBounty { if(templateId == Reaper.templateId || templateId == SpectralDrake.templateId){ Server.getInstance().broadCastAlert("The "+mob.getName()+" has been slain. A new creature shall enter the realm shortly."); sendLootHelp = true; - }else if(Titans.isTitan(mob)){ + } + else if(Titans.isTitan(mob)){ Server.getInstance().broadCastAlert("The Titan "+mob.getName()+" has been defeated!"); MiscChanges.sendGlobalFreedomChat(mob, "The Titan "+mob.getName()+" has been defeated!", 255, 105, 180); MiscChanges.sendServerTabMessage("titan", "The Titan "+mob.getName()+" has been defeated!", 255, 105, 180); @@ -310,7 +331,21 @@ public class LootBounty { blessWorldWithMoonVeins(mob); // Spawn 5-10 friyan tablets throughout the world. spawnFriyanTablets(); - + + try { + // guaranteed rare egg, 15% chance it's fantastic + Item item = ItemFactory.createItem(ItemUtil.getMysteryEggID(), 50, ""); + item.setRarity((byte)1); + if(random.nextInt( 100) < 15) { + item.setRarity((byte)3); + } + corpse.insertItem(item); + + //free affinity orb + item = ItemFactory.createItem(AffinityOrb.templateId, 50, ""); + } catch (FailedException | NoSuchTemplateException e) { + e.printStackTrace(); + } // Spawn Spectral Drake /*if (mob.isDragon()) { // Spawn the spectral drake and add extra hide/scale handleDragonLoot(mob, corpse); diff --git a/src/main/java/mod/sin/wyvern/bounty/PlayerBounty.java b/src/main/java/mod/sin/wyvern/bounty/PlayerBounty.java index bf108b0..727dc6b 100644 --- a/src/main/java/mod/sin/wyvern/bounty/PlayerBounty.java +++ b/src/main/java/mod/sin/wyvern/bounty/PlayerBounty.java @@ -18,14 +18,13 @@ import com.wurmonline.server.items.ItemTemplate; import com.wurmonline.server.items.NoSuchTemplateException; import com.wurmonline.server.players.Player; import com.wurmonline.server.players.Titles.Title; -import com.wurmonline.server.skills.NoSuchSkillException; -import com.wurmonline.server.skills.SkillList; import mod.sin.armour.SpectralHide; import mod.sin.creatures.Reaper; import mod.sin.creatures.SpectralDrake; import mod.sin.items.AffinityOrb; import mod.sin.items.caches.RiftCache; import mod.sin.items.caches.TitanCache; +import mod.sin.kingdomoffices.ItemCreator; import mod.sin.wyvern.*; import mod.sin.wyvern.util.ItemUtil; @@ -141,6 +140,7 @@ public class PlayerBounty { }*/ if(mob.isUnique()){ MiscChanges.addPlayerStat(player.getName(), "UNIQUES"); + rewardPowerfulLoot(player, mob); } if(RareSpawns.isRareCreature(mob)){ Item riftCache = ItemFactory.createItem(RiftCache.templateId, 50f+(30f*Server.rand.nextFloat()), mob.getName()); @@ -199,6 +199,9 @@ public class PlayerBounty { strBuilder += " for slaying the " + mob.getName() + "."; player.getCommunicator().sendSafeServerMessage(strBuilder); long playerSteamId = steamIdMap.get(player.getName()); + Item creatureToken = ItemFactory.createItem(ItemCreator.CREATURE_TOKEN.getTemplateId(), 50, (byte)0, ""); + inventory.insertItem(creatureToken); + player.getCommunicator().sendSafeServerMessage("You also receive a " + creatureToken.getName() + "!"); if(playersRewarded.containsKey(mobWurmId)){ playersRewarded.get(mobWurmId).add(playerSteamId); }else{ diff --git a/src/main/java/mod/sin/wyvern/mastercraft/Mastercraft.java b/src/main/java/mod/sin/wyvern/mastercraft/Mastercraft.java index f456d1f..60b59b2 100644 --- a/src/main/java/mod/sin/wyvern/mastercraft/Mastercraft.java +++ b/src/main/java/mod/sin/wyvern/mastercraft/Mastercraft.java @@ -23,7 +23,7 @@ public class Mastercraft { diff -= skill.affinity; } if(skill.getKnowledge() > 99.0d){ - diff -= 2d-((100d-skill.getKnowledge())*2d); + diff -= 4d-((100d-skill.getKnowledge())*4d); } if(skill.getKnowledge() > 90.0d){ diff -= 2d-((100d-skill.getKnowledge())*0.2d); @@ -33,7 +33,7 @@ public class Mastercraft { diff -= item.getRarity(); } if(item.getCurrentQualityLevel() > 99.0f){ - diff -= 1d-((100d-item.getCurrentQualityLevel())*1d); + diff -= 3d-((100d-item.getCurrentQualityLevel())*3d); } if(item.getCurrentQualityLevel() > 90.0f){ diff -= 1d-((100d-item.getCurrentQualityLevel())*0.1d); diff --git a/src/main/java/mod/sin/wyvern/util/ItemUtil.java b/src/main/java/mod/sin/wyvern/util/ItemUtil.java index 5abd0ea..3c865cd 100644 --- a/src/main/java/mod/sin/wyvern/util/ItemUtil.java +++ b/src/main/java/mod/sin/wyvern/util/ItemUtil.java @@ -119,6 +119,11 @@ public class ItemUtil { } item.setDescription(item.getDescription()+eff.getName().substring(0,1)+Math.round(power)); } + + public static int getMysteryEggID() { + return ItemTemplateFactory.getInstance().getTemplate("mystery egg").getTemplateId(); + } + public static Item createRandomSorcery(byte charges){ try { Item sorcery = ItemFactory.createItem(sorceryIds[Server.rand.nextInt(sorceryIds.length)], 90+(10*Server.rand.nextFloat()), null);