diff --git a/src/main/java/mod/sin/actions/items/PermafrostTemperatureAction.java b/src/main/java/mod/sin/actions/items/PermafrostTemperatureAction.java deleted file mode 100644 index e979ad5..0000000 --- a/src/main/java/mod/sin/actions/items/PermafrostTemperatureAction.java +++ /dev/null @@ -1,4 +0,0 @@ -package mod.sin.actions.items; - -public class PermafrostTemperatureAction { -} diff --git a/src/main/java/mod/sin/actions/items/magicitems/BlazeTemperatureActionPerformer.java b/src/main/java/mod/sin/actions/items/magicitems/BlazeTemperatureActionPerformer.java new file mode 100644 index 0000000..2eeab1c --- /dev/null +++ b/src/main/java/mod/sin/actions/items/magicitems/BlazeTemperatureActionPerformer.java @@ -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; + } +} diff --git a/src/main/java/mod/sin/actions/items/magicitems/MagicItemMenuProvider.java b/src/main/java/mod/sin/actions/items/magicitems/MagicItemMenuProvider.java new file mode 100644 index 0000000..b974b0b --- /dev/null +++ b/src/main/java/mod/sin/actions/items/magicitems/MagicItemMenuProvider.java @@ -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 menu; + ActionEntry permaFrost, blaze; + + public MagicItemMenuProvider() { + permaFrost = new PermafrostTemperatureActionPerformer().actionEntry; + blaze = new BlazeTemperatureActionPerformer().actionEntry; + } + + @Override + public List 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(); + } +} diff --git a/src/main/java/mod/sin/actions/items/ItemBonusRechargeAction.java b/src/main/java/mod/sin/actions/items/magicitems/MagicItemRechargeAction.java similarity index 84% rename from src/main/java/mod/sin/actions/items/ItemBonusRechargeAction.java rename to src/main/java/mod/sin/actions/items/magicitems/MagicItemRechargeAction.java index 56f11ff..4e1d1ce 100644 --- a/src/main/java/mod/sin/actions/items/ItemBonusRechargeAction.java +++ b/src/main/java/mod/sin/actions/items/magicitems/MagicItemRechargeAction.java @@ -1,28 +1,29 @@ -package mod.sin.actions.items; +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.Soul; import mod.sin.wyvern.bonusoverhaul.Battery; import mod.sin.wyvern.bonusoverhaul.ItemBonusOverhaul; import mod.sin.wyvern.bonusoverhaul.ItemBonusWrapper; +import mod.sin.wyvern.bonusoverhaul.MagicItems; import org.gotti.wurmunlimited.modsupport.actions.*; import java.util.Collections; import java.util.List; import java.util.logging.Logger; -public class ItemBonusRechargeAction implements ModAction, BehaviourProvider, ActionPerformer { - private static Logger logger = Logger.getLogger(ItemBonusRechargeAction.class.getName()); +public class MagicItemRechargeAction implements ModAction, BehaviourProvider, ActionPerformer { + private static Logger logger = Logger.getLogger(MagicItemRechargeAction.class.getName()); private final short actionId; private final ActionEntry actionEntry; - public ItemBonusRechargeAction() { + public MagicItemRechargeAction() { actionId = (short)ModActions.getNextActionId(); actionEntry = new ActionEntryBuilder(actionId, "Recharge magic item", "recharging").build(); ModActions.registerAction(actionEntry); @@ -32,8 +33,7 @@ public class ItemBonusRechargeAction implements ModAction, BehaviourProvider, Ac @Override public List getBehavioursFor(Creature performer, Item source, Item object) { - ItemBonusWrapper wrapper = ItemBonusOverhaul.matchTemplateidToWrapper(object.getTemplateId()); - if(performer instanceof Player && object != null && wrapper != null && wrapper.isTimed() && ItemBonusOverhaul.isValidBattery(source)) { + if(performer instanceof Player && object != null && MagicItems.isRechargeable(object.getTemplateId()) && ItemBonusOverhaul.isValidBattery(source)) { return Collections.singletonList(actionEntry); } return null; @@ -51,7 +51,7 @@ public class ItemBonusRechargeAction implements ModAction, BehaviourProvider, Ac try { Battery sourceBattery = ItemBonusOverhaul.getBatteryObject(source.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."); return true; } diff --git a/src/main/java/mod/sin/actions/items/magicitems/PermafrostTemperatureActionPerformer.java b/src/main/java/mod/sin/actions/items/magicitems/PermafrostTemperatureActionPerformer.java new file mode 100644 index 0000000..896ee75 --- /dev/null +++ b/src/main/java/mod/sin/actions/items/magicitems/PermafrostTemperatureActionPerformer.java @@ -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; + } +} diff --git a/src/main/java/mod/sin/actions/items/magicitems/WaterToSnowActionPerformer.java b/src/main/java/mod/sin/actions/items/magicitems/WaterToSnowActionPerformer.java new file mode 100644 index 0000000..b1bd803 --- /dev/null +++ b/src/main/java/mod/sin/actions/items/magicitems/WaterToSnowActionPerformer.java @@ -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; + } +} diff --git a/src/main/java/mod/sin/armour/ArcaniteNecklace.java b/src/main/java/mod/sin/armour/ArcaniteNecklace.java index 3d8fe74..17118c3 100644 --- a/src/main/java/mod/sin/armour/ArcaniteNecklace.java +++ b/src/main/java/mod/sin/armour/ArcaniteNecklace.java @@ -49,8 +49,8 @@ public class ArcaniteNecklace implements ItemTypes, MiscConstants { logger.info("initCreationEntry()"); if(templateId > 0){ logger.info("Creating "+name+" creation entry, ID = "+templateId); - CreationEntryCreator.createSimpleEntry(SkillList.SMITHING_GOLDSMITHING, ItemList.anvilSmall, ItemList.seryllBar, - templateId, false, true, 0.0f, false, false, CreationCategories.JEWELRY); + //CreationEntryCreator.createSimpleEntry(SkillList.SMITHING_GOLDSMITHING, ItemList.anvilSmall, ItemList.seryllBar, + //templateId, false, true, 0.0f, false, false, CreationCategories.JEWELRY); //final AdvancedCreationEntry entry = CreationEntryCreator.createAdvancedEntry(SkillList.SMITHING_WEAPON_HEADS, // ItemList.ironBand, ItemList.shaft, templateId, false, false, 0f, true, false, CreationCategories.TOOLS); //entry.addRequirement(new CreationRequirement(1, ItemList.woodenHandleSword, 2, true)); diff --git a/src/main/java/mod/sin/armour/ArcaniteNecklaceFocus.java b/src/main/java/mod/sin/armour/ArcaniteNecklaceFocus.java index d23cc40..fcd7747 100644 --- a/src/main/java/mod/sin/armour/ArcaniteNecklaceFocus.java +++ b/src/main/java/mod/sin/armour/ArcaniteNecklaceFocus.java @@ -53,8 +53,8 @@ public class ArcaniteNecklaceFocus implements ItemTypes, MiscConstants { logger.info("Creating "+name+" creation entry, ID = "+templateId); //CreationEntryCreator.createSimpleEntry(SkillList.SMITHING_GOLDSMITHING, ArcaniteNecklace.templateId, ItemList.rubyStar, //templateId, true, true, 0.0f, false, false, CreationCategories.ARMOUR); - CreationEntryCreator.createAdvancedEntry(SkillList.SMITHING_GOLDSMITHING, ArcaniteNecklace.templateId, ItemList.rubyStar, - templateId, true, false, 0.0f, true, false, CreationCategories.JEWELRY); + //CreationEntryCreator.createAdvancedEntry(SkillList.SMITHING_GOLDSMITHING, ArcaniteNecklace.templateId, ItemList.rubyStar, + //templateId, true, false, 0.0f, true, false, CreationCategories.JEWELRY); //final AdvancedCreationEntry entry = CreationEntryCreator.createAdvancedEntry(SkillList.SMITHING_WEAPON_HEADS, // ItemList.ironBand, ItemList.shaft, templateId, false, false, 0f, true, false, CreationCategories.TOOLS); //entry.addRequirement(new CreationRequirement(1, ItemList.woodenHandleSword, 2, true)); diff --git a/src/main/java/mod/sin/creatures/Gremlin.java b/src/main/java/mod/sin/creatures/Gremlin.java index 9756a97..2266918 100644 --- a/src/main/java/mod/sin/creatures/Gremlin.java +++ b/src/main/java/mod/sin/creatures/Gremlin.java @@ -55,6 +55,7 @@ public class Gremlin implements ModCreature, CreatureTypes { builder.denName("gremlin hole"); builder.hasHands(true); builder.maxPercentOfCreatures(.06f); + builder.maxGroupAttackSize(100); templateId = builder.getTemplateId(); return builder; @@ -67,10 +68,9 @@ public class Gremlin implements ModCreature, CreatureTypes { } // enable encounters when ready for event - - /** new EncounterBuilder(Tiles.Tile.TILE_TREE.id) + new EncounterBuilder(Tiles.Tile.TILE_TREE.id) .addCreatures(templateId, 5) - .build(1);**/ + .build(5); } } diff --git a/src/main/java/mod/sin/items/CrystalPermaFrost.java b/src/main/java/mod/sin/items/CrystalPermaFrost.java index 8a08ba3..5718b2e 100644 --- a/src/main/java/mod/sin/items/CrystalPermaFrost.java +++ b/src/main/java/mod/sin/items/CrystalPermaFrost.java @@ -3,6 +3,7 @@ package mod.sin.items; import com.wurmonline.server.MiscConstants; import com.wurmonline.server.items.*; import com.wurmonline.server.skills.SkillList; +import mod.sin.wyvern.bonusoverhaul.MagicItems; import org.gotti.wurmunlimited.modsupport.ItemTemplateBuilder; import java.io.IOException; @@ -39,6 +40,7 @@ public class CrystalPermaFrost implements MiscConstants, ItemTypes { ItemTemplate template = itemBuilder.build(); templateId = template.getTemplateId(); + MagicItems.registerMagicItem(templateId, false); logger.info(name + " TemplateID: " + templateId); diff --git a/src/main/java/mod/sin/items/WandPermaFrost.java b/src/main/java/mod/sin/items/WandPermaFrost.java index c90a654..1d82484 100644 --- a/src/main/java/mod/sin/items/WandPermaFrost.java +++ b/src/main/java/mod/sin/items/WandPermaFrost.java @@ -3,11 +3,16 @@ package mod.sin.items; import com.wurmonline.server.MiscConstants; import com.wurmonline.server.items.*; 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.Schematics; import org.gotti.wurmunlimited.modsupport.ItemTemplateBuilder; import java.io.IOException; +import java.util.Arrays; import java.util.logging.Logger; public class WandPermaFrost implements MiscConstants { @@ -41,6 +46,7 @@ public class WandPermaFrost implements MiscConstants { ItemTemplate template = itemBuilder.build(); templateId = template.getTemplateId(); Schematics.schematics.add(new SchematicWrapper(templateId, 0, false, 0, 0)); + MagicItemWrapper wrapper = MagicItems.registerMagicItem(templateId, true); logger.info(name + " TemplateID: " + templateId); } diff --git a/src/main/java/mod/sin/wyvern/AchievementChanges.java b/src/main/java/mod/sin/wyvern/AchievementChanges.java index b4bc14a..d10414d 100644 --- a/src/main/java/mod/sin/wyvern/AchievementChanges.java +++ b/src/main/java/mod/sin/wyvern/AchievementChanges.java @@ -1,7 +1,12 @@ 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.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 java.lang.reflect.InvocationTargetException; @@ -14,6 +19,7 @@ public class AchievementChanges { private static Logger logger = Logger.getLogger(AchievementChanges.class.getName()); public static HashMap goodAchievements = new HashMap<>(); public static ArrayList blacklist = new ArrayList<>(); + public static AchievementTemplate gremlinSlayer; protected static int getNumber(String 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(){ try { + gremlinSlayer = addAchievement(4500, "A Gnoblin", "You slew a dastardly gremlin", "Slay a gremlin", false, 1, MiscConstants.A_TYPE_SILVER, false, false); ConcurrentHashMap templates = ReflectionUtil.getPrivateField(Achievement.class, ReflectionUtil.getField(Achievement.class, "templates")); generateBlacklist(); for(int i : templates.keySet()){ diff --git a/src/main/java/mod/sin/wyvern/Bounty.java b/src/main/java/mod/sin/wyvern/Bounty.java index bd7b25f..38f0a3b 100644 --- a/src/main/java/mod/sin/wyvern/Bounty.java +++ b/src/main/java/mod/sin/wyvern/Bounty.java @@ -108,6 +108,7 @@ public class Bounty { //+ "mod.sin.wyvern.bounty.MethodsBounty.checkBounty(player, this);" + PlayerBounty.class.getName()+".checkPlayerBounty(player, this);" + "$_ = $proceed($$);"; + Util.setReason("Inserting playerloot check"); Util.instrumentDeclared(thisClass, ctCreature, "modifyFightSkill", "checkCoinAward", replace); /*ctCreature.getDeclaredMethod("modifyFightSkill").instrument(new ExprEditor(){ public void edit(MethodCall m) throws CannotCompileException { @@ -122,6 +123,7 @@ public class Bounty { replace = "$_ = $proceed($$);" //+ "mod.sin.wyvern.bounty.MethodsBounty.checkLootTable(this, corpse);"; + LootBounty.class.getName()+".checkLootTable(this, corpse);"; + Util.setReason("Inserting bodyloot check"); Util.instrumentDeclared(thisClass, ctCreature, "die", "setRotation", replace); /*ctCreature.getDeclaredMethod("die").instrument(new ExprEditor(){ public void edit(MethodCall m) throws CannotCompileException { diff --git a/src/main/java/mod/sin/wyvern/ItemMod.java b/src/main/java/mod/sin/wyvern/ItemMod.java index 1ced4c1..f86acde 100644 --- a/src/main/java/mod/sin/wyvern/ItemMod.java +++ b/src/main/java/mod/sin/wyvern/ItemMod.java @@ -6,14 +6,12 @@ import java.lang.reflect.Method; import java.util.Collections; import java.util.LinkedList; import java.util.List; -import java.util.Map; import java.util.logging.Logger; import com.wurmonline.server.Servers; -import com.wurmonline.server.behaviours.Action; -import com.wurmonline.server.combat.ArmourTemplate; +import mod.sin.actions.items.magicitems.MagicItemMenuProvider; +import mod.sin.actions.items.magicitems.MagicItemRechargeAction; import mod.sin.items.schematicitems.SchematicItems; -import mod.sin.lib.Util; import mod.sin.items.caches.*; import org.gotti.wurmunlimited.modloader.ReflectionUtil; import org.gotti.wurmunlimited.modloader.classhooks.HookManager; @@ -219,8 +217,9 @@ public class ItemMod { ModActions.registerAction(new PipingKitAction()); ModActions.registerAction(new StableContractAction()); ModActions.registerAction(new WoodEssenceAction()); - ModActions.registerAction(new ItemBonusRechargeAction()); + ModActions.registerAction(new MagicItemRechargeAction()); ModActions.registerAction(new ReadSchematicAction()); + ModActions.registerBehaviourProvider(new MagicItemMenuProvider()); } public static void initCreationEntries(){ diff --git a/src/main/java/mod/sin/wyvern/MiscChanges.java b/src/main/java/mod/sin/wyvern/MiscChanges.java index 513abd8..13338da 100644 --- a/src/main/java/mod/sin/wyvern/MiscChanges.java +++ b/src/main/java/mod/sin/wyvern/MiscChanges.java @@ -33,6 +33,7 @@ import javassist.expr.FieldAccess; import javassist.expr.MethodCall; import mod.sin.items.ChaosCrystal; import mod.sin.items.EnchantersCrystal; +import mod.sin.items.EternalOrb; import mod.sin.items.SealedMap; import mod.sin.kingdomoffices.ItemCreator; import mod.sin.lib.Util; @@ -293,6 +294,7 @@ public class MiscChanges { logger.info("Adding enchant crystals to trader restock list"); toRestock.add(new TraderItem(ChaosCrystal.templateId, 99, true, 10, 31, 10)); logger.info("Adding chaos crystals to trader restock list"); + toRestock.add(new TraderItem(EternalOrb.templateId, 99, false, 0, 0, 3)); for (TraderItem tItem : toRestock) { diff --git a/src/main/java/mod/sin/wyvern/WyvernMods.java b/src/main/java/mod/sin/wyvern/WyvernMods.java index 26ef0d4..4ea8c1e 100644 --- a/src/main/java/mod/sin/wyvern/WyvernMods.java +++ b/src/main/java/mod/sin/wyvern/WyvernMods.java @@ -56,6 +56,7 @@ implements WurmServerMod, Configurable, PreInitable, Initable, ItemTemplatesCrea private static Logger logger = Logger.getLogger(WyvernMods.class.getName()); public static boolean espCounter = false; public static boolean enableDepots = false; + public static boolean xmas2018 = true; boolean bDebug = false; @@ -226,6 +227,7 @@ implements WurmServerMod, Configurable, PreInitable, Initable, ItemTemplatesCrea ModCreatures.addCreature(new IceCat()); ModCreatures.addCreature(new FireGiant()); ModCreatures.addCreature(new GuardianMagranon()); + ModCreatures.addCreature(new Gremlin()); // Bosses: logger.info("Registering Custom Boss creatures."); diff --git a/src/main/java/mod/sin/wyvern/bestiary/MethodsBestiary.java b/src/main/java/mod/sin/wyvern/bestiary/MethodsBestiary.java index 40b92c8..a646ea2 100644 --- a/src/main/java/mod/sin/wyvern/bestiary/MethodsBestiary.java +++ b/src/main/java/mod/sin/wyvern/bestiary/MethodsBestiary.java @@ -692,6 +692,9 @@ public class MethodsBestiary { }else if(templateId == FireGiant.templateId){ 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) { Random random = new Random(); byte r = (byte)random.nextInt(257); diff --git a/src/main/java/mod/sin/wyvern/bonusoverhaul/ItemBonusOverhaul.java b/src/main/java/mod/sin/wyvern/bonusoverhaul/ItemBonusOverhaul.java index 142d106..d3f7b6c 100644 --- a/src/main/java/mod/sin/wyvern/bonusoverhaul/ItemBonusOverhaul.java +++ b/src/main/java/mod/sin/wyvern/bonusoverhaul/ItemBonusOverhaul.java @@ -105,7 +105,7 @@ public class ItemBonusOverhaul { wrapper = matchTemplateidToWrapper(item.getTemplateId()); if(wrapper != null) { 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()) { break; } diff --git a/src/main/java/mod/sin/wyvern/bonusoverhaul/ItemBonusWrapper.java b/src/main/java/mod/sin/wyvern/bonusoverhaul/ItemBonusWrapper.java index 1724f1a..eee99d3 100644 --- a/src/main/java/mod/sin/wyvern/bonusoverhaul/ItemBonusWrapper.java +++ b/src/main/java/mod/sin/wyvern/bonusoverhaul/ItemBonusWrapper.java @@ -18,6 +18,9 @@ public class ItemBonusWrapper { this.stackable = stackable; this.value = value; this.timed = timed; + if(timed) { + MagicItems.registerMagicItem(templateid, true); + } this.skillRestricted = false; } diff --git a/src/main/java/mod/sin/wyvern/bonusoverhaul/MagicItemWrapper.java b/src/main/java/mod/sin/wyvern/bonusoverhaul/MagicItemWrapper.java new file mode 100644 index 0000000..2893cab --- /dev/null +++ b/src/main/java/mod/sin/wyvern/bonusoverhaul/MagicItemWrapper.java @@ -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; + } +} diff --git a/src/main/java/mod/sin/wyvern/bonusoverhaul/MagicItems.java b/src/main/java/mod/sin/wyvern/bonusoverhaul/MagicItems.java new file mode 100644 index 0000000..dbcb12d --- /dev/null +++ b/src/main/java/mod/sin/wyvern/bonusoverhaul/MagicItems.java @@ -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 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 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; + } +} diff --git a/src/main/java/mod/sin/wyvern/bounty/LootBounty.java b/src/main/java/mod/sin/wyvern/bounty/LootBounty.java index 68bee23..733edfd 100644 --- a/src/main/java/mod/sin/wyvern/bounty/LootBounty.java +++ b/src/main/java/mod/sin/wyvern/bounty/LootBounty.java @@ -12,6 +12,7 @@ import com.wurmonline.server.creatures.CreatureTemplate; import com.wurmonline.server.creatures.CreatureTemplateFactory; import com.wurmonline.server.creatures.Creatures; import com.wurmonline.server.items.*; +import com.wurmonline.server.players.Player; import com.wurmonline.server.villages.Village; import com.wurmonline.server.villages.Villages; import mod.piddagoras.duskombat.DamageEngine; @@ -21,11 +22,11 @@ import mod.sin.creatures.SpectralDrake; import mod.sin.items.AffinityOrb; import mod.sin.items.FriyanTablet; import mod.sin.items.HolidaySpirit; +import mod.sin.items.WandPermaFrost; import mod.sin.items.caches.*; -import mod.sin.wyvern.Bounty; -import mod.sin.wyvern.MiscChanges; -import mod.sin.wyvern.Arena; -import mod.sin.wyvern.Titans; +import mod.sin.wyvern.*; +import mod.sin.wyvern.schematics.SchematicWrapper; +import mod.sin.wyvern.schematics.Schematics; import mod.sin.wyvern.util.ItemUtil; import java.text.DecimalFormat; @@ -315,6 +316,7 @@ public class LootBounty { public static void checkLootTable(Creature mob, Item corpse){ if(mob.isReborn() || mob.isBred()){ + logger.info("Mob " + mob.getName() + " was reborn or bred."); return; } double cretStr = Bounty.getCreatureStrength(mob); @@ -390,7 +392,9 @@ public class LootBounty { 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) { try { Item holidaySpirit = ItemFactory.createItem(HolidaySpirit.templateId, 20+(60*random.nextFloat()), ""); @@ -399,8 +403,19 @@ public class LootBounty { 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()){ + logger.info("Mob " + mob.getName() + " was a unique."); // Spawn random addy/glimmer veins throughout the world blessWorldWithMoonVeins(mob); // Spawn 5-10 friyan tablets throughout the world. @@ -425,6 +440,9 @@ public class LootBounty { }*/ sendLootHelp = true; } + else { + logger.info("Mob " + mob.getName() + " was not a unique"); + } if(mob.getStatus().isChampion()){ // Champion mob loot handleChampionLoot(corpse); diff --git a/src/main/java/mod/sin/wyvern/bounty/PlayerBounty.java b/src/main/java/mod/sin/wyvern/bounty/PlayerBounty.java index 2040cc0..a01029e 100644 --- a/src/main/java/mod/sin/wyvern/bounty/PlayerBounty.java +++ b/src/main/java/mod/sin/wyvern/bounty/PlayerBounty.java @@ -8,20 +8,19 @@ import java.util.Random; import java.util.logging.Logger; import com.wurmonline.server.FailedException; +import com.wurmonline.server.Mailer; import com.wurmonline.server.Server; import com.wurmonline.server.Servers; import com.wurmonline.server.creatures.Creature; import com.wurmonline.server.economy.Economy; -import com.wurmonline.server.items.Item; -import com.wurmonline.server.items.ItemFactory; -import com.wurmonline.server.items.ItemTemplate; -import com.wurmonline.server.items.NoSuchTemplateException; +import com.wurmonline.server.items.*; 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.piddagoras.duskombat.DamageEngine; import mod.sin.armour.SpectralHide; +import mod.sin.creatures.Gremlin; import mod.sin.creatures.Reaper; import mod.sin.creatures.SpectralDrake; import mod.sin.items.AffinityOrb; @@ -241,6 +240,10 @@ public class PlayerBounty { return; } 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); } catch (IllegalArgumentException | ClassCastException e) { e.printStackTrace(); diff --git a/src/main/java/mod/sin/wyvern/mastercraft/Mastercraft.java b/src/main/java/mod/sin/wyvern/mastercraft/Mastercraft.java index dbedf1f..9113543 100644 --- a/src/main/java/mod/sin/wyvern/mastercraft/Mastercraft.java +++ b/src/main/java/mod/sin/wyvern/mastercraft/Mastercraft.java @@ -18,6 +18,7 @@ import java.util.logging.Logger; public class Mastercraft { private static Logger logger = Logger.getLogger(Mastercraft.class.getName()); + public static int GremlinSlayer = 704; public static double getNewDifficulty(Skill skill, double diff, Item item){ if(skill.affinity > 0){ 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("Holdstrong_Architect", 702, "Holdstrong Architect", "Holdstrong 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 ExtendTitleEnum.getSingletonInstance().addExtendEntry("Donator", 800, "Donator", "Donator", -1, "NORMAL"); diff --git a/src/main/java/mod/sin/wyvern/schematics/Schematics.java b/src/main/java/mod/sin/wyvern/schematics/Schematics.java index 5de4631..d4d556d 100644 --- a/src/main/java/mod/sin/wyvern/schematics/Schematics.java +++ b/src/main/java/mod/sin/wyvern/schematics/Schematics.java @@ -1,5 +1,6 @@ package mod.sin.wyvern.schematics; +import com.wurmonline.server.Items; import com.wurmonline.server.creatures.Creature; import com.wurmonline.server.items.CreationEntry; import com.wurmonline.server.items.Item; @@ -63,7 +64,8 @@ public class Schematics { public static boolean checkSchematic(Creature performer, int product) { if(requiresASchematic(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)); return false; }