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);