Holiday mostly finished, added eternal orb to traders on restock. Disabled arcanite crafting for now.

This commit is contained in:
mstoppelli
2018-12-16 04:59:25 -05:00
parent 968f46cd39
commit 403124eb38
25 changed files with 387 additions and 35 deletions

View File

@@ -1,4 +0,0 @@
package mod.sin.actions.items;
public class PermafrostTemperatureAction {
}

View File

@@ -0,0 +1,86 @@
package mod.sin.actions.items.magicitems;
import com.wurmonline.server.Items;
import com.wurmonline.server.behaviours.Action;
import com.wurmonline.server.behaviours.ActionEntry;
import com.wurmonline.server.creatures.Creature;
import com.wurmonline.server.items.Item;
import com.wurmonline.server.items.TempStates;
import com.wurmonline.server.players.Player;
import mod.sin.items.CrystalPermaFrost;
import mod.sin.items.WandPermaFrost;
import org.gotti.wurmunlimited.modsupport.actions.ActionPerformer;
import org.gotti.wurmunlimited.modsupport.actions.ModActions;
import java.lang.reflect.Method;
import java.util.logging.Logger;
public class BlazeTemperatureActionPerformer implements ActionPerformer {
private static Logger logger = Logger.getLogger(BlazeTemperatureActionPerformer.class.getName());
private final short actionId;
public final ActionEntry actionEntry;
public BlazeTemperatureActionPerformer() {
actionId = (short) ModActions.getNextActionId();
actionEntry = ActionEntry.createEntry(
actionId,
"Heat up",
"heating",
new int[0]
);
ModActions.registerAction(actionEntry);
ModActions.registerActionPerformer(this);
}
@Override
public boolean action(Action act, Creature performer, Item source, Item target, short action, float counter)
{
try{
if(performer instanceof Player){
if(source.getTemplateId() == CrystalPermaFrost.templateId) {
if(source.getQualityLevel() < 30) {
performer.getCommunicator().sendNormalServerMessage("The weakened crystal uses up the last of its power and shatters!");
Items.destroyItem(source.getWurmId());
}
else {
source.setQualityLevel(source.getQualityLevel() - 10);
performer.getCommunicator().sendNormalServerMessage("The crystal buzzes with power, working its magic. It feels weaker afterwards.");
}
}
if(source.getTemplateId() == WandPermaFrost.templateId) {
if(source.getAuxData() <= 0) {
performer.getCommunicator().sendNormalServerMessage("The wand isn't powerful enough to raise the temperature of the " + target.getName() + ".");
return true;
}
else {
source.setAuxData((byte)(source.getAuxData() - (byte)1));
performer.getCommunicator().sendNormalServerMessage("The wand glows with power, draining some charge.");
}
}
short oldTemp = target.getTemperature();
target.setTemperature((short) Short.MAX_VALUE);
Method tempChange = TempStates.class.getDeclaredMethod("checkForChange", Item.class, Item.class, short.class, short.class, float.class);
tempChange.setAccessible(true);
if(target.getParent() != null) {
tempChange.invoke(null, target.getParent(), target, oldTemp, target.getTemperature(), 1);
}
performer.getCommunicator().sendNormalServerMessage("You heat up the " + target.getName() + ", heating it until it's glowing.");
return true;
}else{
logger.info("Somehow a non-player used permafrost");
}
return false;
}catch(Exception e){
e.printStackTrace();
return true;
}
}
@Override
public short getActionId() {
return actionId;
}
}

View File

@@ -0,0 +1,46 @@
package mod.sin.actions.items.magicitems;
import com.wurmonline.server.behaviours.ActionEntry;
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 mod.sin.items.CrystalPermaFrost;
import mod.sin.items.WandPermaFrost;
import mod.sin.wyvern.bonusoverhaul.MagicItemWrapper;
import mod.sin.wyvern.bonusoverhaul.MagicItems;
import org.gotti.wurmunlimited.modsupport.actions.BehaviourProvider;
import java.util.ArrayList;
import java.util.List;
public class MagicItemMenuProvider implements BehaviourProvider {
private List<ActionEntry> menu;
ActionEntry permaFrost, blaze;
public MagicItemMenuProvider() {
permaFrost = new PermafrostTemperatureActionPerformer().actionEntry;
blaze = new BlazeTemperatureActionPerformer().actionEntry;
}
@Override
public List<ActionEntry> getBehavioursFor(Creature performer, Item source, Item object) {
menu = new ArrayList<>();
if (canUse(performer, object) && source.getTemplateId() == CrystalPermaFrost.templateId || source.getTemplateId() == WandPermaFrost.templateId) {
menu.add(permaFrost);
}
if(canUse(performer, object) && performer.getPower() >= 5 && source.getTemplateId() == ItemList.wandDeity) {
menu.add(blaze);
}
if (performer instanceof Player && object != null && !menu.isEmpty()) {
menu.add(0, new ActionEntry((short) (-1 * menu.size()), "magic items", ""));
return menu;
}
return null;
}
public static boolean canUse(Creature performer, Item object) {
return performer.isPlayer() && object != null &&
!object.isInventory() && !object.isInventoryGroup() && !object.isTopParentPile() && !object.isBodyPart();
}
}

View File

@@ -1,28 +1,29 @@
package mod.sin.actions.items; package mod.sin.actions.items.magicitems;
import com.wurmonline.server.Items; import com.wurmonline.server.Items;
import com.wurmonline.server.behaviours.Action; import com.wurmonline.server.behaviours.Action;
import com.wurmonline.server.behaviours.ActionEntry; import com.wurmonline.server.behaviours.ActionEntry;
import com.wurmonline.server.creatures.Creature; import com.wurmonline.server.creatures.Creature;
import com.wurmonline.server.items.Item; import com.wurmonline.server.items.Item;
import com.wurmonline.server.items.TempStates;
import com.wurmonline.server.players.Player; import com.wurmonline.server.players.Player;
import mod.sin.items.Soul;
import mod.sin.wyvern.bonusoverhaul.Battery; import mod.sin.wyvern.bonusoverhaul.Battery;
import mod.sin.wyvern.bonusoverhaul.ItemBonusOverhaul; import mod.sin.wyvern.bonusoverhaul.ItemBonusOverhaul;
import mod.sin.wyvern.bonusoverhaul.ItemBonusWrapper; import mod.sin.wyvern.bonusoverhaul.ItemBonusWrapper;
import mod.sin.wyvern.bonusoverhaul.MagicItems;
import org.gotti.wurmunlimited.modsupport.actions.*; import org.gotti.wurmunlimited.modsupport.actions.*;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.logging.Logger; import java.util.logging.Logger;
public class ItemBonusRechargeAction implements ModAction, BehaviourProvider, ActionPerformer { public class MagicItemRechargeAction implements ModAction, BehaviourProvider, ActionPerformer {
private static Logger logger = Logger.getLogger(ItemBonusRechargeAction.class.getName()); private static Logger logger = Logger.getLogger(MagicItemRechargeAction.class.getName());
private final short actionId; private final short actionId;
private final ActionEntry actionEntry; private final ActionEntry actionEntry;
public ItemBonusRechargeAction() { public MagicItemRechargeAction() {
actionId = (short)ModActions.getNextActionId(); actionId = (short)ModActions.getNextActionId();
actionEntry = new ActionEntryBuilder(actionId, "Recharge magic item", "recharging").build(); actionEntry = new ActionEntryBuilder(actionId, "Recharge magic item", "recharging").build();
ModActions.registerAction(actionEntry); ModActions.registerAction(actionEntry);
@@ -32,8 +33,7 @@ public class ItemBonusRechargeAction implements ModAction, BehaviourProvider, Ac
@Override @Override
public List<ActionEntry> getBehavioursFor(Creature performer, Item source, Item object) public List<ActionEntry> getBehavioursFor(Creature performer, Item source, Item object)
{ {
ItemBonusWrapper wrapper = ItemBonusOverhaul.matchTemplateidToWrapper(object.getTemplateId()); if(performer instanceof Player && object != null && MagicItems.isRechargeable(object.getTemplateId()) && ItemBonusOverhaul.isValidBattery(source)) {
if(performer instanceof Player && object != null && wrapper != null && wrapper.isTimed() && ItemBonusOverhaul.isValidBattery(source)) {
return Collections.singletonList(actionEntry); return Collections.singletonList(actionEntry);
} }
return null; return null;
@@ -51,7 +51,7 @@ public class ItemBonusRechargeAction implements ModAction, BehaviourProvider, Ac
try { try {
Battery sourceBattery = ItemBonusOverhaul.getBatteryObject(source.getTemplateId()); Battery sourceBattery = ItemBonusOverhaul.getBatteryObject(source.getTemplateId());
ItemBonusWrapper wrapper = ItemBonusOverhaul.matchTemplateidToWrapper(target.getTemplateId()); ItemBonusWrapper wrapper = ItemBonusOverhaul.matchTemplateidToWrapper(target.getTemplateId());
if (wrapper == null || !wrapper.isTimed() || sourceBattery == null) { if (!MagicItems.isRechargeable(target.getTemplateId()) || sourceBattery == null) {
performer.getCommunicator().sendNormalServerMessage("This cannot be charged."); performer.getCommunicator().sendNormalServerMessage("This cannot be charged.");
return true; return true;
} }

View File

@@ -0,0 +1,86 @@
package mod.sin.actions.items.magicitems;
import com.wurmonline.server.Items;
import com.wurmonline.server.Server;
import com.wurmonline.server.behaviours.Action;
import com.wurmonline.server.behaviours.ActionEntry;
import com.wurmonline.server.creatures.Creature;
import com.wurmonline.server.items.Item;
import com.wurmonline.server.players.Player;
import mod.sin.items.CrystalPermaFrost;
import mod.sin.items.EternalReservoir;
import mod.sin.items.WandPermaFrost;
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.util.Arrays;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
public class PermafrostTemperatureActionPerformer implements ActionPerformer {
private static Logger logger = Logger.getLogger(PermafrostTemperatureActionPerformer.class.getName());
private final short actionId;
public final ActionEntry actionEntry;
public PermafrostTemperatureActionPerformer() {
actionId = (short) ModActions.getNextActionId();
actionEntry = ActionEntry.createEntry(
actionId,
"Permafrost freeze",
"freezing",
new int[0]
);
ModActions.registerAction(actionEntry);
ModActions.registerActionPerformer(this);
}
@Override
public boolean action(Action act, Creature performer, Item source, Item target, short action, float counter)
{
try{
if(performer instanceof Player){
if(source.getTemplateId() == CrystalPermaFrost.templateId) {
if(source.getQualityLevel() < 30) {
performer.getCommunicator().sendNormalServerMessage("The weakened crystal uses up the last of its power and shatters!");
Items.destroyItem(source.getWurmId());
}
else {
source.setQualityLevel(source.getQualityLevel() - 10);
performer.getCommunicator().sendNormalServerMessage("The crystal buzzes with power, working its magic. It feels weaker afterwards.");
}
}
if(source.getTemplateId() == WandPermaFrost.templateId) {
if(source.getAuxData() <= 0) {
performer.getCommunicator().sendNormalServerMessage("The wand isn't powerful enough to lower the temperature of the " + target.getName() + ".");
return true;
}
else {
source.setAuxData((byte)(source.getAuxData() - (byte)1));
performer.getCommunicator().sendNormalServerMessage("The wand glows with power, draining some charge.");
}
}
target.setTemperature((short)0);
performer.getCommunicator().sendNormalServerMessage("You freeze the " + target.getName() + ", dropping its temperature to zero.");
Server.getInstance().broadCastAction(performer.getName() + " freezes the " + target.getName() + " with magic.", performer, 5);
return true;
}else{
logger.info("Somehow a non-player used permafrost");
}
return false;
}catch(Exception e){
e.printStackTrace();
return true;
}
}
@Override
public short getActionId() {
return actionId;
}
}

View File

@@ -0,0 +1,10 @@
package mod.sin.actions.items.magicitems;
import org.gotti.wurmunlimited.modsupport.actions.ActionPerformer;
public class WaterToSnowActionPerformer implements ActionPerformer {
@Override
public short getActionId() {
return 0;
}
}

View File

@@ -49,8 +49,8 @@ public class ArcaniteNecklace implements ItemTypes, MiscConstants {
logger.info("initCreationEntry()"); logger.info("initCreationEntry()");
if(templateId > 0){ if(templateId > 0){
logger.info("Creating "+name+" creation entry, ID = "+templateId); logger.info("Creating "+name+" creation entry, ID = "+templateId);
CreationEntryCreator.createSimpleEntry(SkillList.SMITHING_GOLDSMITHING, ItemList.anvilSmall, ItemList.seryllBar, //CreationEntryCreator.createSimpleEntry(SkillList.SMITHING_GOLDSMITHING, ItemList.anvilSmall, ItemList.seryllBar,
templateId, false, true, 0.0f, false, false, CreationCategories.JEWELRY); //templateId, false, true, 0.0f, false, false, CreationCategories.JEWELRY);
//final AdvancedCreationEntry entry = CreationEntryCreator.createAdvancedEntry(SkillList.SMITHING_WEAPON_HEADS, //final AdvancedCreationEntry entry = CreationEntryCreator.createAdvancedEntry(SkillList.SMITHING_WEAPON_HEADS,
// ItemList.ironBand, ItemList.shaft, templateId, false, false, 0f, true, false, CreationCategories.TOOLS); // ItemList.ironBand, ItemList.shaft, templateId, false, false, 0f, true, false, CreationCategories.TOOLS);
//entry.addRequirement(new CreationRequirement(1, ItemList.woodenHandleSword, 2, true)); //entry.addRequirement(new CreationRequirement(1, ItemList.woodenHandleSword, 2, true));

View File

@@ -53,8 +53,8 @@ public class ArcaniteNecklaceFocus implements ItemTypes, MiscConstants {
logger.info("Creating "+name+" creation entry, ID = "+templateId); logger.info("Creating "+name+" creation entry, ID = "+templateId);
//CreationEntryCreator.createSimpleEntry(SkillList.SMITHING_GOLDSMITHING, ArcaniteNecklace.templateId, ItemList.rubyStar, //CreationEntryCreator.createSimpleEntry(SkillList.SMITHING_GOLDSMITHING, ArcaniteNecklace.templateId, ItemList.rubyStar,
//templateId, true, true, 0.0f, false, false, CreationCategories.ARMOUR); //templateId, true, true, 0.0f, false, false, CreationCategories.ARMOUR);
CreationEntryCreator.createAdvancedEntry(SkillList.SMITHING_GOLDSMITHING, ArcaniteNecklace.templateId, ItemList.rubyStar, //CreationEntryCreator.createAdvancedEntry(SkillList.SMITHING_GOLDSMITHING, ArcaniteNecklace.templateId, ItemList.rubyStar,
templateId, true, false, 0.0f, true, false, CreationCategories.JEWELRY); //templateId, true, false, 0.0f, true, false, CreationCategories.JEWELRY);
//final AdvancedCreationEntry entry = CreationEntryCreator.createAdvancedEntry(SkillList.SMITHING_WEAPON_HEADS, //final AdvancedCreationEntry entry = CreationEntryCreator.createAdvancedEntry(SkillList.SMITHING_WEAPON_HEADS,
// ItemList.ironBand, ItemList.shaft, templateId, false, false, 0f, true, false, CreationCategories.TOOLS); // ItemList.ironBand, ItemList.shaft, templateId, false, false, 0f, true, false, CreationCategories.TOOLS);
//entry.addRequirement(new CreationRequirement(1, ItemList.woodenHandleSword, 2, true)); //entry.addRequirement(new CreationRequirement(1, ItemList.woodenHandleSword, 2, true));

View File

@@ -55,6 +55,7 @@ public class Gremlin implements ModCreature, CreatureTypes {
builder.denName("gremlin hole"); builder.denName("gremlin hole");
builder.hasHands(true); builder.hasHands(true);
builder.maxPercentOfCreatures(.06f); builder.maxPercentOfCreatures(.06f);
builder.maxGroupAttackSize(100);
templateId = builder.getTemplateId(); templateId = builder.getTemplateId();
return builder; return builder;
@@ -67,10 +68,9 @@ public class Gremlin implements ModCreature, CreatureTypes {
} }
// enable encounters when ready for event // enable encounters when ready for event
new EncounterBuilder(Tiles.Tile.TILE_TREE.id)
/** new EncounterBuilder(Tiles.Tile.TILE_TREE.id)
.addCreatures(templateId, 5) .addCreatures(templateId, 5)
.build(1);**/ .build(5);
} }
} }

View File

@@ -3,6 +3,7 @@ package mod.sin.items;
import com.wurmonline.server.MiscConstants; import com.wurmonline.server.MiscConstants;
import com.wurmonline.server.items.*; import com.wurmonline.server.items.*;
import com.wurmonline.server.skills.SkillList; import com.wurmonline.server.skills.SkillList;
import mod.sin.wyvern.bonusoverhaul.MagicItems;
import org.gotti.wurmunlimited.modsupport.ItemTemplateBuilder; import org.gotti.wurmunlimited.modsupport.ItemTemplateBuilder;
import java.io.IOException; import java.io.IOException;
@@ -39,6 +40,7 @@ public class CrystalPermaFrost implements MiscConstants, ItemTypes {
ItemTemplate template = itemBuilder.build(); ItemTemplate template = itemBuilder.build();
templateId = template.getTemplateId(); templateId = template.getTemplateId();
MagicItems.registerMagicItem(templateId, false);
logger.info(name + " TemplateID: " + templateId); logger.info(name + " TemplateID: " + templateId);

View File

@@ -3,11 +3,16 @@ package mod.sin.items;
import com.wurmonline.server.MiscConstants; import com.wurmonline.server.MiscConstants;
import com.wurmonline.server.items.*; import com.wurmonline.server.items.*;
import com.wurmonline.server.skills.SkillList; import com.wurmonline.server.skills.SkillList;
import mod.sin.actions.items.magicitems.PermafrostTemperatureActionPerformer;
import mod.sin.wyvern.bonusoverhaul.ItemBonusOverhaul;
import mod.sin.wyvern.bonusoverhaul.MagicItemWrapper;
import mod.sin.wyvern.bonusoverhaul.MagicItems;
import mod.sin.wyvern.schematics.SchematicWrapper; import mod.sin.wyvern.schematics.SchematicWrapper;
import mod.sin.wyvern.schematics.Schematics; import mod.sin.wyvern.schematics.Schematics;
import org.gotti.wurmunlimited.modsupport.ItemTemplateBuilder; import org.gotti.wurmunlimited.modsupport.ItemTemplateBuilder;
import java.io.IOException; import java.io.IOException;
import java.util.Arrays;
import java.util.logging.Logger; import java.util.logging.Logger;
public class WandPermaFrost implements MiscConstants { public class WandPermaFrost implements MiscConstants {
@@ -41,6 +46,7 @@ public class WandPermaFrost implements MiscConstants {
ItemTemplate template = itemBuilder.build(); ItemTemplate template = itemBuilder.build();
templateId = template.getTemplateId(); templateId = template.getTemplateId();
Schematics.schematics.add(new SchematicWrapper(templateId, 0, false, 0, 0)); Schematics.schematics.add(new SchematicWrapper(templateId, 0, false, 0, 0));
MagicItemWrapper wrapper = MagicItems.registerMagicItem(templateId, true);
logger.info(name + " TemplateID: " + templateId); logger.info(name + " TemplateID: " + templateId);
} }

View File

@@ -1,7 +1,12 @@
package mod.sin.wyvern; package mod.sin.wyvern;
import com.wurmonline.server.MiscConstants;
import com.wurmonline.server.creatures.Creature;
import com.wurmonline.server.players.Achievement; import com.wurmonline.server.players.Achievement;
import com.wurmonline.server.players.AchievementTemplate; import com.wurmonline.server.players.AchievementTemplate;
import com.wurmonline.server.players.Achievements;
import com.wurmonline.server.players.Titles;
import mod.sin.wyvern.mastercraft.Mastercraft;
import org.gotti.wurmunlimited.modloader.ReflectionUtil; import org.gotti.wurmunlimited.modloader.ReflectionUtil;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
@@ -14,6 +19,7 @@ public class AchievementChanges {
private static Logger logger = Logger.getLogger(AchievementChanges.class.getName()); private static Logger logger = Logger.getLogger(AchievementChanges.class.getName());
public static HashMap<Integer, AchievementTemplate> goodAchievements = new HashMap<>(); public static HashMap<Integer, AchievementTemplate> goodAchievements = new HashMap<>();
public static ArrayList<Integer> blacklist = new ArrayList<>(); public static ArrayList<Integer> blacklist = new ArrayList<>();
public static AchievementTemplate gremlinSlayer;
protected static int getNumber(String name){ protected static int getNumber(String name){
AchievementTemplate temp = Achievement.getTemplate(name); AchievementTemplate temp = Achievement.getTemplate(name);
@@ -304,8 +310,31 @@ public class AchievementChanges {
} }
} }
public static Titles.Title getAwardedTitle(Achievement a) {
int count = a.getCounter();
if(a.getTemplate() == gremlinSlayer) {
if(count >= 100) {
return Titles.Title.getTitle(Mastercraft.GremlinSlayer);
}
}
return null;
}
public static void triggerAchievement(Creature player, AchievementTemplate tpl) {
Achievements.triggerAchievement(player.getWurmId(), tpl.getNumber());
Achievements achievments = Achievements.getAchievementObject(player.getWurmId());
Achievement achievment = achievments.getAchievement(tpl.getNumber());
if (achievment != null) {
Titles.Title title = getAwardedTitle(achievment);
if (title != null) {
player.addTitle(title);
}
}
}
public static void onServerStarted(){ public static void onServerStarted(){
try { try {
gremlinSlayer = addAchievement(4500, "A Gnoblin", "You slew a dastardly gremlin", "Slay a gremlin", false, 1, MiscConstants.A_TYPE_SILVER, false, false);
ConcurrentHashMap<Integer, AchievementTemplate> templates = ReflectionUtil.getPrivateField(Achievement.class, ReflectionUtil.getField(Achievement.class, "templates")); ConcurrentHashMap<Integer, AchievementTemplate> templates = ReflectionUtil.getPrivateField(Achievement.class, ReflectionUtil.getField(Achievement.class, "templates"));
generateBlacklist(); generateBlacklist();
for(int i : templates.keySet()){ for(int i : templates.keySet()){

View File

@@ -108,6 +108,7 @@ public class Bounty {
//+ "mod.sin.wyvern.bounty.MethodsBounty.checkBounty(player, this);" //+ "mod.sin.wyvern.bounty.MethodsBounty.checkBounty(player, this);"
+ PlayerBounty.class.getName()+".checkPlayerBounty(player, this);" + PlayerBounty.class.getName()+".checkPlayerBounty(player, this);"
+ "$_ = $proceed($$);"; + "$_ = $proceed($$);";
Util.setReason("Inserting playerloot check");
Util.instrumentDeclared(thisClass, ctCreature, "modifyFightSkill", "checkCoinAward", replace); Util.instrumentDeclared(thisClass, ctCreature, "modifyFightSkill", "checkCoinAward", replace);
/*ctCreature.getDeclaredMethod("modifyFightSkill").instrument(new ExprEditor(){ /*ctCreature.getDeclaredMethod("modifyFightSkill").instrument(new ExprEditor(){
public void edit(MethodCall m) throws CannotCompileException { public void edit(MethodCall m) throws CannotCompileException {
@@ -122,6 +123,7 @@ public class Bounty {
replace = "$_ = $proceed($$);" replace = "$_ = $proceed($$);"
//+ "mod.sin.wyvern.bounty.MethodsBounty.checkLootTable(this, corpse);"; //+ "mod.sin.wyvern.bounty.MethodsBounty.checkLootTable(this, corpse);";
+ LootBounty.class.getName()+".checkLootTable(this, corpse);"; + LootBounty.class.getName()+".checkLootTable(this, corpse);";
Util.setReason("Inserting bodyloot check");
Util.instrumentDeclared(thisClass, ctCreature, "die", "setRotation", replace); Util.instrumentDeclared(thisClass, ctCreature, "die", "setRotation", replace);
/*ctCreature.getDeclaredMethod("die").instrument(new ExprEditor(){ /*ctCreature.getDeclaredMethod("die").instrument(new ExprEditor(){
public void edit(MethodCall m) throws CannotCompileException { public void edit(MethodCall m) throws CannotCompileException {

View File

@@ -6,14 +6,12 @@ import java.lang.reflect.Method;
import java.util.Collections; import java.util.Collections;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.logging.Logger; import java.util.logging.Logger;
import com.wurmonline.server.Servers; import com.wurmonline.server.Servers;
import com.wurmonline.server.behaviours.Action; import mod.sin.actions.items.magicitems.MagicItemMenuProvider;
import com.wurmonline.server.combat.ArmourTemplate; import mod.sin.actions.items.magicitems.MagicItemRechargeAction;
import mod.sin.items.schematicitems.SchematicItems; import mod.sin.items.schematicitems.SchematicItems;
import mod.sin.lib.Util;
import mod.sin.items.caches.*; import mod.sin.items.caches.*;
import org.gotti.wurmunlimited.modloader.ReflectionUtil; import org.gotti.wurmunlimited.modloader.ReflectionUtil;
import org.gotti.wurmunlimited.modloader.classhooks.HookManager; import org.gotti.wurmunlimited.modloader.classhooks.HookManager;
@@ -219,8 +217,9 @@ public class ItemMod {
ModActions.registerAction(new PipingKitAction()); ModActions.registerAction(new PipingKitAction());
ModActions.registerAction(new StableContractAction()); ModActions.registerAction(new StableContractAction());
ModActions.registerAction(new WoodEssenceAction()); ModActions.registerAction(new WoodEssenceAction());
ModActions.registerAction(new ItemBonusRechargeAction()); ModActions.registerAction(new MagicItemRechargeAction());
ModActions.registerAction(new ReadSchematicAction()); ModActions.registerAction(new ReadSchematicAction());
ModActions.registerBehaviourProvider(new MagicItemMenuProvider());
} }
public static void initCreationEntries(){ public static void initCreationEntries(){

View File

@@ -33,6 +33,7 @@ import javassist.expr.FieldAccess;
import javassist.expr.MethodCall; import javassist.expr.MethodCall;
import mod.sin.items.ChaosCrystal; import mod.sin.items.ChaosCrystal;
import mod.sin.items.EnchantersCrystal; import mod.sin.items.EnchantersCrystal;
import mod.sin.items.EternalOrb;
import mod.sin.items.SealedMap; import mod.sin.items.SealedMap;
import mod.sin.kingdomoffices.ItemCreator; import mod.sin.kingdomoffices.ItemCreator;
import mod.sin.lib.Util; import mod.sin.lib.Util;
@@ -293,6 +294,7 @@ public class MiscChanges {
logger.info("Adding enchant crystals to trader restock list"); logger.info("Adding enchant crystals to trader restock list");
toRestock.add(new TraderItem(ChaosCrystal.templateId, 99, true, 10, 31, 10)); toRestock.add(new TraderItem(ChaosCrystal.templateId, 99, true, 10, 31, 10));
logger.info("Adding chaos crystals to trader restock list"); logger.info("Adding chaos crystals to trader restock list");
toRestock.add(new TraderItem(EternalOrb.templateId, 99, false, 0, 0, 3));
for (TraderItem tItem : toRestock) { for (TraderItem tItem : toRestock) {

View File

@@ -56,6 +56,7 @@ implements WurmServerMod, Configurable, PreInitable, Initable, ItemTemplatesCrea
private static Logger logger = Logger.getLogger(WyvernMods.class.getName()); private static Logger logger = Logger.getLogger(WyvernMods.class.getName());
public static boolean espCounter = false; public static boolean espCounter = false;
public static boolean enableDepots = false; public static boolean enableDepots = false;
public static boolean xmas2018 = true;
boolean bDebug = false; boolean bDebug = false;
@@ -226,6 +227,7 @@ implements WurmServerMod, Configurable, PreInitable, Initable, ItemTemplatesCrea
ModCreatures.addCreature(new IceCat()); ModCreatures.addCreature(new IceCat());
ModCreatures.addCreature(new FireGiant()); ModCreatures.addCreature(new FireGiant());
ModCreatures.addCreature(new GuardianMagranon()); ModCreatures.addCreature(new GuardianMagranon());
ModCreatures.addCreature(new Gremlin());
// Bosses: // Bosses:
logger.info("Registering Custom Boss creatures."); logger.info("Registering Custom Boss creatures.");

View File

@@ -692,6 +692,9 @@ public class MethodsBestiary {
}else if(templateId == FireGiant.templateId){ }else if(templateId == FireGiant.templateId){
sendAddEffect(comm, creatureId, (byte) 1); sendAddEffect(comm, creatureId, (byte) 1);
} }
else if(templateId == Gremlin.templateId) {
sendRepaintEffect(comm, creatureId, (byte)0, (byte)200, (byte)0, (byte)255);
}
else if(templateId == CreatureTemplateFactory.UNICORN_CID) { else if(templateId == CreatureTemplateFactory.UNICORN_CID) {
Random random = new Random(); Random random = new Random();
byte r = (byte)random.nextInt(257); byte r = (byte)random.nextInt(257);

View File

@@ -105,7 +105,7 @@ public class ItemBonusOverhaul {
wrapper = matchTemplateidToWrapper(item.getTemplateId()); wrapper = matchTemplateidToWrapper(item.getTemplateId());
if(wrapper != null) { if(wrapper != null) {
if(wrapper.getEffect() == SpellEffectsEnum.ITEM_RING_SKILLGAIN && (!wrapper.isSkillRestricted() || wrapper.getRestrictedSkill() == skillid)) { if(wrapper.getEffect() == SpellEffectsEnum.ITEM_RING_SKILLGAIN && (!wrapper.isSkillRestricted() || wrapper.getRestrictedSkill() == skillid)) {
bonus += wrapper.getValue() * item.getCurrentQualityLevel() * .01f; bonus += wrapper.getValue() * item.getCurrentQualityLevel() * SKILLGAIN_BONUS_SCALE;
if(!wrapper.isStackable()) { if(!wrapper.isStackable()) {
break; break;
} }

View File

@@ -18,6 +18,9 @@ public class ItemBonusWrapper {
this.stackable = stackable; this.stackable = stackable;
this.value = value; this.value = value;
this.timed = timed; this.timed = timed;
if(timed) {
MagicItems.registerMagicItem(templateid, true);
}
this.skillRestricted = false; this.skillRestricted = false;
} }

View File

@@ -0,0 +1,16 @@
package mod.sin.wyvern.bonusoverhaul;
import com.wurmonline.server.behaviours.ActionEntry;
import java.util.ArrayList;
import java.util.List;
public class MagicItemWrapper {
public int itemId;
public boolean rechargeable;
public MagicItemWrapper(int itemId, boolean rechargeable) {
this.itemId = itemId;
this.rechargeable = rechargeable;
}
}

View File

@@ -0,0 +1,39 @@
package mod.sin.wyvern.bonusoverhaul;
import com.wurmonline.server.behaviours.ActionEntry;
import java.util.ArrayList;
import java.util.List;
public class MagicItems {
private static List<MagicItemWrapper> wrappers = new ArrayList<>();
public static MagicItemWrapper registerMagicItem(int itemId, boolean rechargeable) {
MagicItemWrapper wrapper = new MagicItemWrapper(itemId, rechargeable);
wrappers.add(wrapper);
return wrapper;
}
public static List<MagicItemWrapper> getMagicItems() {
return wrappers;
}
public static boolean isMagicItem(int itemId) {
for(MagicItemWrapper wrapper : wrappers) {
if(wrapper.itemId == itemId) {
return true;
}
}
return false;
}
public static boolean isRechargeable(int itemId) {
for(MagicItemWrapper wrapper : wrappers) {
if(wrapper.itemId == itemId && wrapper.rechargeable) {
return true;
}
}
return false;
}
}

View File

@@ -12,6 +12,7 @@ import com.wurmonline.server.creatures.CreatureTemplate;
import com.wurmonline.server.creatures.CreatureTemplateFactory; import com.wurmonline.server.creatures.CreatureTemplateFactory;
import com.wurmonline.server.creatures.Creatures; import com.wurmonline.server.creatures.Creatures;
import com.wurmonline.server.items.*; import com.wurmonline.server.items.*;
import com.wurmonline.server.players.Player;
import com.wurmonline.server.villages.Village; import com.wurmonline.server.villages.Village;
import com.wurmonline.server.villages.Villages; import com.wurmonline.server.villages.Villages;
import mod.piddagoras.duskombat.DamageEngine; import mod.piddagoras.duskombat.DamageEngine;
@@ -21,11 +22,11 @@ import mod.sin.creatures.SpectralDrake;
import mod.sin.items.AffinityOrb; import mod.sin.items.AffinityOrb;
import mod.sin.items.FriyanTablet; import mod.sin.items.FriyanTablet;
import mod.sin.items.HolidaySpirit; import mod.sin.items.HolidaySpirit;
import mod.sin.items.WandPermaFrost;
import mod.sin.items.caches.*; import mod.sin.items.caches.*;
import mod.sin.wyvern.Bounty; import mod.sin.wyvern.*;
import mod.sin.wyvern.MiscChanges; import mod.sin.wyvern.schematics.SchematicWrapper;
import mod.sin.wyvern.Arena; import mod.sin.wyvern.schematics.Schematics;
import mod.sin.wyvern.Titans;
import mod.sin.wyvern.util.ItemUtil; import mod.sin.wyvern.util.ItemUtil;
import java.text.DecimalFormat; import java.text.DecimalFormat;
@@ -315,6 +316,7 @@ public class LootBounty {
public static void checkLootTable(Creature mob, Item corpse){ public static void checkLootTable(Creature mob, Item corpse){
if(mob.isReborn() || mob.isBred()){ if(mob.isReborn() || mob.isBred()){
logger.info("Mob " + mob.getName() + " was reborn or bred.");
return; return;
} }
double cretStr = Bounty.getCreatureStrength(mob); double cretStr = Bounty.getCreatureStrength(mob);
@@ -390,7 +392,9 @@ public class LootBounty {
e.printStackTrace(); e.printStackTrace();
} }
} }
if(mob.getTemplateId() == Gremlin.templateId) { // Holiday event
if(mob.getTemplate().getTemplateId() == Gremlin.templateId && WyvernMods.xmas2018) {
logger.info("Gremlin died");
if(random.nextInt(100) < 20) { if(random.nextInt(100) < 20) {
try { try {
Item holidaySpirit = ItemFactory.createItem(HolidaySpirit.templateId, 20+(60*random.nextFloat()), ""); Item holidaySpirit = ItemFactory.createItem(HolidaySpirit.templateId, 20+(60*random.nextFloat()), "");
@@ -399,8 +403,19 @@ public class LootBounty {
e.printStackTrace(); e.printStackTrace();
} }
} }
if(random.nextInt(100) < 1) {
try {
SchematicWrapper wrapper = Schematics.getSchematicFor(WandPermaFrost.templateId);
Item wandSchematic = ItemFactory.createItem(wrapper != null ? wrapper.schematicTemplateId : ItemList.charcoal, 50f, (byte)1, "Santa Claus");
corpse.insertItem(wandSchematic);
} catch (FailedException | NoSuchTemplateException | NullPointerException e) {
e.printStackTrace();
logger.info("ERROR: Schematic roll successful but failed to create.");
}
}
} }
if(mob.isUnique()){ if(mob.isUnique()){
logger.info("Mob " + mob.getName() + " was a unique.");
// Spawn random addy/glimmer veins throughout the world // Spawn random addy/glimmer veins throughout the world
blessWorldWithMoonVeins(mob); blessWorldWithMoonVeins(mob);
// Spawn 5-10 friyan tablets throughout the world. // Spawn 5-10 friyan tablets throughout the world.
@@ -425,6 +440,9 @@ public class LootBounty {
}*/ }*/
sendLootHelp = true; sendLootHelp = true;
} }
else {
logger.info("Mob " + mob.getName() + " was not a unique");
}
if(mob.getStatus().isChampion()){ if(mob.getStatus().isChampion()){
// Champion mob loot // Champion mob loot
handleChampionLoot(corpse); handleChampionLoot(corpse);

View File

@@ -8,20 +8,19 @@ import java.util.Random;
import java.util.logging.Logger; import java.util.logging.Logger;
import com.wurmonline.server.FailedException; import com.wurmonline.server.FailedException;
import com.wurmonline.server.Mailer;
import com.wurmonline.server.Server; import com.wurmonline.server.Server;
import com.wurmonline.server.Servers; import com.wurmonline.server.Servers;
import com.wurmonline.server.creatures.Creature; import com.wurmonline.server.creatures.Creature;
import com.wurmonline.server.economy.Economy; import com.wurmonline.server.economy.Economy;
import com.wurmonline.server.items.Item; import com.wurmonline.server.items.*;
import com.wurmonline.server.items.ItemFactory;
import com.wurmonline.server.items.ItemTemplate;
import com.wurmonline.server.items.NoSuchTemplateException;
import com.wurmonline.server.players.Player; import com.wurmonline.server.players.Player;
import com.wurmonline.server.players.Titles.Title; import com.wurmonline.server.players.Titles.Title;
import com.wurmonline.server.skills.NoSuchSkillException; import com.wurmonline.server.skills.NoSuchSkillException;
import com.wurmonline.server.skills.SkillList; import com.wurmonline.server.skills.SkillList;
import mod.piddagoras.duskombat.DamageEngine; import mod.piddagoras.duskombat.DamageEngine;
import mod.sin.armour.SpectralHide; import mod.sin.armour.SpectralHide;
import mod.sin.creatures.Gremlin;
import mod.sin.creatures.Reaper; import mod.sin.creatures.Reaper;
import mod.sin.creatures.SpectralDrake; import mod.sin.creatures.SpectralDrake;
import mod.sin.items.AffinityOrb; import mod.sin.items.AffinityOrb;
@@ -241,6 +240,10 @@ public class PlayerBounty {
return; return;
} }
logger.info(player.getName()+" killed "+creature.getName()); logger.info(player.getName()+" killed "+creature.getName());
if(creature.getTemplate().getTemplateId() == Gremlin.templateId && WyvernMods.xmas2018) {
AchievementChanges.triggerAchievement(player, AchievementChanges.gremlinSlayer);
logger.info("Ticking gremlinslayer achievement for " + player.getName());
}
checkPlayerReward(player, creature); checkPlayerReward(player, creature);
} catch (IllegalArgumentException | ClassCastException e) { } catch (IllegalArgumentException | ClassCastException e) {
e.printStackTrace(); e.printStackTrace();

View File

@@ -18,6 +18,7 @@ import java.util.logging.Logger;
public class Mastercraft { public class Mastercraft {
private static Logger logger = Logger.getLogger(Mastercraft.class.getName()); private static Logger logger = Logger.getLogger(Mastercraft.class.getName());
public static int GremlinSlayer = 704;
public static double getNewDifficulty(Skill skill, double diff, Item item){ public static double getNewDifficulty(Skill skill, double diff, Item item){
if(skill.affinity > 0){ if(skill.affinity > 0){
diff -= skill.affinity; diff -= skill.affinity;
@@ -99,6 +100,7 @@ public class Mastercraft {
ExtendTitleEnum.getSingletonInstance().addExtendEntry("Spectral_Slayer", 701, "Spectral Warrior", "Spectral Warrior", -1, "NORMAL"); ExtendTitleEnum.getSingletonInstance().addExtendEntry("Spectral_Slayer", 701, "Spectral Warrior", "Spectral Warrior", -1, "NORMAL");
ExtendTitleEnum.getSingletonInstance().addExtendEntry("Holdstrong_Architect", 702, "Holdstrong Architect", "Holdstrong Architect", -1, "NORMAL"); ExtendTitleEnum.getSingletonInstance().addExtendEntry("Holdstrong_Architect", 702, "Holdstrong Architect", "Holdstrong Architect", -1, "NORMAL");
ExtendTitleEnum.getSingletonInstance().addExtendEntry("Stronghold_Architect", 703, "Stronghold Architect", "Stronghold Architect", -1, "NORMAL"); ExtendTitleEnum.getSingletonInstance().addExtendEntry("Stronghold_Architect", 703, "Stronghold Architect", "Stronghold Architect", -1, "NORMAL");
ExtendTitleEnum.getSingletonInstance().addExtendEntry("Gremlin_Slayer", GremlinSlayer, "Gremlin Slayer", "Gremlin Slayer", -1, "NORMAL");
// Donation titles // Donation titles
ExtendTitleEnum.getSingletonInstance().addExtendEntry("Donator", 800, "Donator", "Donator", -1, "NORMAL"); ExtendTitleEnum.getSingletonInstance().addExtendEntry("Donator", 800, "Donator", "Donator", -1, "NORMAL");

View File

@@ -1,5 +1,6 @@
package mod.sin.wyvern.schematics; package mod.sin.wyvern.schematics;
import com.wurmonline.server.Items;
import com.wurmonline.server.creatures.Creature; import com.wurmonline.server.creatures.Creature;
import com.wurmonline.server.items.CreationEntry; import com.wurmonline.server.items.CreationEntry;
import com.wurmonline.server.items.Item; import com.wurmonline.server.items.Item;
@@ -63,7 +64,8 @@ public class Schematics {
public static boolean checkSchematic(Creature performer, int product) { public static boolean checkSchematic(Creature performer, int product) {
if(requiresASchematic(product)) { if(requiresASchematic(product)) {
if(!playerKnowsSchematic(performer, product)) { if(!playerKnowsSchematic(performer, product)) {
performer.getCommunicator().sendNormalServerMessage("You don't know how to make that. Try finding a schematic for the item."); performer.getCommunicator().sendNormalServerMessage("You don't know how to make " + ItemTemplateFactory.getInstance().getTemplateName(product) +
". Try finding a schematic for the item.");
logger.info("Player " + performer.getName() + " does not have schematic for " + ItemTemplateFactory.getInstance().getTemplateName(product)); logger.info("Player " + performer.getName() + " does not have schematic for " + ItemTemplateFactory.getInstance().getTemplateName(product));
return false; return false;
} }