This commit is contained in:
mstoppelli
2018-05-30 01:39:48 -04:00
parent 4ec6d1cbdd
commit e747e15fb2
30 changed files with 553 additions and 45 deletions

8
.idea/artifacts/wyvern_jar.xml generated Normal file
View File

@@ -0,0 +1,8 @@
<component name="ArtifactManager">
<artifact type="jar" name="wyvern:jar">
<output-path>$PROJECT_DIR$/classes/artifacts/wyvern_jar</output-path>
<root id="archive" name="WyvernMods_main.jar">
<element id="module-output" name="WyvernMods_main" />
</root>
</artifact>
</component>

View File

@@ -1,7 +1,7 @@
<component name="libraryTable">
<library name="Gradle: com.github.Sindusk:sindusklibrary:v1.0">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.github.Sindusk/sindusklibrary/v1.0/95e8659b53f48d87c063664020727bc52a298b3d/sindusklibrary-v1.0.jar!/" />
<root url="jar://$USER_HOME$/wurm_modding/mods/SinduskLibrary/SinduskLibrary.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />

View File

@@ -1,7 +1,7 @@
<component name="libraryTable">
<library name="Gradle: org.gotti.wurmunlimited:common:2613165">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.gotti.wurmunlimited/common/2613165/53b86d78248ca55a4fc0b41ee327366157671c3d/common-2613165.jar!/" />
<root url="jar://$USER_HOME$/wurm_modding/common.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />

View File

@@ -1,7 +1,7 @@
<component name="libraryTable">
<library name="Gradle: org.gotti.wurmunlimited:server:2613165">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.gotti.wurmunlimited/server/2613165/f4850f94c5db9b248cb4b0ea930ee997b0cbe903/server-2613165.jar!/" />
<root url="jar://$USER_HOME$/wurm_modding/server.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />

View File

@@ -1,11 +1,9 @@
<component name="libraryTable">
<library name="Gradle: org.gotti.wurmunlimited:server-modlauncher:0.33-beta1">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.gotti.wurmunlimited/server-modlauncher/0.33-beta1/98381bf8fb866aea2878faecf33f6d646fe965cb/server-modlauncher-0.33-beta1.jar!/" />
<root url="jar://$USER_HOME$/wurm_modding/modlauncher.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.gotti.wurmunlimited/server-modlauncher/0.33-beta1/5e86c45328c834e303d3369cc64efc10f0a11bb9/server-modlauncher-0.33-beta1-sources.jar!/" />
</SOURCES>
<SOURCES />
</library>
</component>

View File

@@ -1,11 +1,9 @@
<component name="libraryTable">
<library name="Gradle: org.javassist:javassist:3.20.0-GA">
<CLASSES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.javassist/javassist/3.20.0-GA/a9cbcdfb7e9f86fbc74d3afae65f2248bfbf82a0/javassist-3.20.0-GA.jar!/" />
<root url="jar://$USER_HOME$/wurm_modding/javassist.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.javassist/javassist/3.20.0-GA/d8fdc08a455bc0b28bc0bed1f0d032d935cee8e1/javassist-3.20.0-GA-sources.jar!/" />
</SOURCES>
<SOURCES />
</library>
</component>

11
.idea/libraries/KingdomOffices.xml generated Normal file
View File

@@ -0,0 +1,11 @@
<component name="libraryTable">
<library name="KingdomOffices">
<CLASSES>
<root url="jar://$USER_HOME$/wurm_modding/offices/kingdomoffices/classes/artifacts/kingdomoffices_jar/kingdomoffices.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
<root url="file://$USER_HOME$/wurm_modding/offices/kingdomoffices/src/main/java" />
</SOURCES>
</library>
</component>

View File

@@ -14,5 +14,7 @@
<orderEntry type="library" name="Gradle: org.gotti.wurmunlimited:common:2613165" level="project" />
<orderEntry type="library" name="Gradle: org.gotti.wurmunlimited:server:2613165" level="project" />
<orderEntry type="library" name="Gradle: org.javassist:javassist:3.20.0-GA" level="project" />
<orderEntry type="library" name="TreasureHunting" level="project" />
<orderEntry type="library" name="KingdomOffices" level="project" />
</component>
</module>

View File

@@ -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<ActionEntry> 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
}
}

View File

@@ -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<ActionEntry> getBehavioursFor(Creature performer, Item source, Item object)
{
return this.getBehavioursFor(performer, object);
}
// Menu without activated object
@Override
public List<ActionEntry> 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);
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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.");

View File

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

View File

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

View File

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

View File

@@ -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 {

View File

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

View File

@@ -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;
@@ -96,6 +98,10 @@ public class ItemMod {
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()");
try{
@@ -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 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(668);
//ReflectionUtil.setPrivateField(transmutationRod, ReflectionUtil.getField(transmutationRod.getClass(), "value"), 2000000);
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();

View File

@@ -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.");

View File

@@ -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,

View File

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

View File

@@ -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){

View File

@@ -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);
@@ -311,6 +332,20 @@ public class LootBounty {
// 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);

View File

@@ -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{

View File

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

View File

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