diff --git a/build.gradle b/build.gradle index fe37c50..d55467e 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ apply plugin: 'java' group "mod.sin" -version "1.1" +version "1.2" repositories { mavenCentral() @@ -11,7 +11,7 @@ repositories { } dependencies { - compile 'org.gotti.wurmunlimited:server-modlauncher:0.37' + compile 'org.gotti.wurmunlimited:server-modlauncher:0.39-beta1' compile 'com.github.Sindusk:sindusklibrary:v1.7' compile 'com.github.Sindusk:DiscordRelay:v1.2' compile 'com.github.Sindusk:DUSKombat:v1.0' diff --git a/src/main/java/mod/sin/creatures/Reaper.java b/src/main/java/mod/sin/creatures/Reaper.java index a8e6b14..89d4ec1 100644 --- a/src/main/java/mod/sin/creatures/Reaper.java +++ b/src/main/java/mod/sin/creatures/Reaper.java @@ -2,6 +2,7 @@ package mod.sin.creatures; import com.wurmonline.server.bodys.BodyTemplate; import com.wurmonline.server.bodys.Wound; +import com.wurmonline.server.combat.ArmourTemplate; import com.wurmonline.server.combat.ArmourTypes; import com.wurmonline.server.items.Materials; import com.wurmonline.server.skills.SkillList; @@ -30,25 +31,25 @@ public class Reaper implements ModCreature, CreatureTypes { "The reaper, here to claim the souls of the living.", "model.creature.gmdark", types, BodyTemplate.TYPE_HUMAN, (short) 20, (byte) 0, (short) 350, (short) 100, (short) 60, "sound.death.dragon", "sound.death.dragon", "sound.combat.hit.dragon", "sound.combat.hit.dragon", - 0.10f, 35.0f, 45.0f, 22.0f, 40.0f, 0.0f, 1.0f, 500, + 0.09f, 37.0f, 48.0f, 25.0f, 45.0f, 0.0f, 1.0f, 500, new int[]{}, 20, 70, Materials.MATERIAL_MEAT_HUMANOID); - builder.skill(SkillList.BODY_STRENGTH, 60.0f); + builder.skill(SkillList.BODY_STRENGTH, 70.0f); builder.skill(SkillList.BODY_STAMINA, 70.0f); builder.skill(SkillList.BODY_CONTROL, 60.0f); builder.skill(SkillList.MIND_LOGICAL, 35.0f); builder.skill(SkillList.MIND_SPEED, 45.0f); builder.skill(SkillList.SOUL_STRENGTH, 80.0f); builder.skill(SkillList.SOUL_DEPTH, 80.0f); - builder.skill(SkillList.WEAPONLESS_FIGHTING, 80.0f); - builder.skill(SkillList.GROUP_FIGHTING, 80.0f); + builder.skill(SkillList.WEAPONLESS_FIGHTING, 85.0f); + builder.skill(SkillList.GROUP_FIGHTING, 85.0f); builder.boundsValues(-0.5f, -1.0f, 0.5f, 1.42f); builder.handDamString("slice"); builder.kickDamString("reap"); builder.maxAge(200); - builder.armourType(ArmourTypes.ARMOUR_SCALE_DRAGON); - builder.baseCombatRating(55.0f); + builder.armourType(ArmourTemplate.ARMOUR_TYPE_LEATHER_DRAGON); + builder.baseCombatRating(58.0f); builder.combatDamageType(Wound.TYPE_PIERCE); builder.maxGroupAttackSize(100); diff --git a/src/main/java/mod/sin/items/AffinityOrb.java b/src/main/java/mod/sin/items/AffinityOrb.java index 956fd5d..b9ed7d0 100644 --- a/src/main/java/mod/sin/items/AffinityOrb.java +++ b/src/main/java/mod/sin/items/AffinityOrb.java @@ -20,10 +20,9 @@ public class AffinityOrb implements ItemTypes, MiscConstants { itemBuilder.name(name, "affinity orbs", "A valuable orb that infuses the user with hidden knowledge."); itemBuilder.descriptions("brilliantly glowing", "strongly glowing", "faintly glowing", "barely glowing"); itemBuilder.itemTypes(new short[]{ - ItemTypes.ITEM_TYPE_MAGIC, + ItemTypes.ITEM_TYPE_NODROP, ItemTypes.ITEM_TYPE_FULLPRICE, - ItemTypes.ITEM_TYPE_NOSELLBACK, - ItemTypes.ITEM_TYPE_ALWAYS_BANKABLE + ItemTypes.ITEM_TYPE_NOSELLBACK }); itemBuilder.imageNumber((short) 919); itemBuilder.behaviourType((short) 1); diff --git a/src/main/java/mod/sin/items/EternalOrb.java b/src/main/java/mod/sin/items/EternalOrb.java index 6bbda77..261971e 100644 --- a/src/main/java/mod/sin/items/EternalOrb.java +++ b/src/main/java/mod/sin/items/EternalOrb.java @@ -33,7 +33,7 @@ public class EternalOrb implements ItemTypes, MiscConstants { itemBuilder.difficulty(5.0f); itemBuilder.weightGrams(500); itemBuilder.material(Materials.MATERIAL_CRYSTAL); - itemBuilder.value(200000); + itemBuilder.value(100000); itemBuilder.isTraded(true); ItemTemplate template = itemBuilder.build(); diff --git a/src/main/java/mod/sin/items/EternalReservoir.java b/src/main/java/mod/sin/items/EternalReservoir.java index c5936a9..4ae5108 100644 --- a/src/main/java/mod/sin/items/EternalReservoir.java +++ b/src/main/java/mod/sin/items/EternalReservoir.java @@ -29,6 +29,7 @@ public class EternalReservoir implements ItemTypes, MiscConstants { ItemTypes.ITEM_TYPE_NOTAKE, ItemTypes.ITEM_TYPE_DECORATION, ItemTypes.ITEM_TYPE_USE_GROUND_ONLY, + ItemTypes.ITEM_TYPE_HASDATA, ItemTypes.ITEM_TYPE_NEVER_SHOW_CREATION_WINDOW_OPTION, ItemTypes.ITEM_TYPE_NOT_MISSION }); diff --git a/src/main/java/mod/sin/weapons/BattleYoyo.java b/src/main/java/mod/sin/weapons/BattleYoyo.java index 4b9fab9..68e3d20 100644 --- a/src/main/java/mod/sin/weapons/BattleYoyo.java +++ b/src/main/java/mod/sin/weapons/BattleYoyo.java @@ -39,7 +39,7 @@ public class BattleYoyo implements ItemTypes, MiscConstants { itemBuilder.behaviourType((short) 35); itemBuilder.combatDamage(35); itemBuilder.decayTime(Long.MAX_VALUE); - itemBuilder.dimensions(5, 10, 80); + itemBuilder.dimensions(5, 10, 20); itemBuilder.primarySkill(SkillList.YOYO); itemBuilder.bodySpaces(MiscConstants.EMPTY_BYTE_PRIMITIVE_ARRAY); itemBuilder.modelName("model.toy.yoyo."); diff --git a/src/main/java/mod/sin/wyvern/Arena.java b/src/main/java/mod/sin/wyvern/Arena.java index d04f88c..b5cfdb8 100644 --- a/src/main/java/mod/sin/wyvern/Arena.java +++ b/src/main/java/mod/sin/wyvern/Arena.java @@ -84,6 +84,9 @@ public class Arena { } public static void sendHotaMessage(String message){ + if (SupplyDepots.host != null) { + MiscChanges.sendGlobalFreedomChat(SupplyDepots.host, message, 200, 200, 200); + } DiscordRelay.sendToDiscord("arena", message, true); } @@ -114,18 +117,9 @@ public class Arena { } statue.setAuxData((byte)winStreak); } - int r = winStreak * 50 & 255; - int g = 0; - int b = 0; - if (winStreak > 5 && winStreak < 16) { - r = 0; - } - if (winStreak > 5 && winStreak < 20) { - g = winStreak * 50 & 255; - } - if (winStreak > 5 && winStreak < 30) { - b = winStreak * 50 & 255; - } + int r = (winStreak + Server.rand.nextInt(5)) * 50 & 255; + int g = (winStreak + Server.rand.nextInt(5)) * 80 & 255; + int b = (winStreak + Server.rand.nextInt(5)) * 120 & 255; statue.setColor(WurmColor.createColor(r, g, b)); statue.getColor(); Zone z = Zones.getZone(statue.getTileX(), statue.getTileY(), true); @@ -180,16 +174,16 @@ public class Arena { statue.insertItem(token, true); i--; } - // Add 3-5 seryll lumps of medium ql - i = 3+Server.rand.nextInt(3); // 3-5 lumps + // Add 4-6 seryll lumps of medium ql + i = 4+Server.rand.nextInt(3); // 4-6 lumps while(i > 0){ Item seryll = ItemFactory.createItem(ItemList.seryllBar, 40f+(60f*Server.rand.nextFloat()), null); statue.insertItem(seryll, true); i--; } - // Add 2-4 silver - long iron = 20000; // 2 silver - iron += Server.rand.nextInt(20000); // add up to 2 more silver + // Add 3-6 silver + long iron = 30000; // 3 silver + iron += Server.rand.nextInt(30000); // add up to 3 more silver Item[] coins = Economy.getEconomy().getCoinsFor(iron); for(Item coin : coins){ statue.insertItem(coin, true); @@ -481,12 +475,6 @@ public class Arena { String desc3 = Descriptor.ofMethod(CtClass.voidType, params3); replace = "$_ = com.wurmonline.server.Servers.localServer.PVPSERVER && !lVehicle.isLocked();"; Util.instrumentDescribed(thisClass, ctCreature, "setVehicle", desc3, "isThisAChaosServer", replace); - - // - Allow managing animals on Arena - // - CtClass ctManageMenu = classPool.get("com.wurmonline.server.behaviours.ManageMenu"); - replace = "$_ = false;"; - Util.instrumentDeclared(thisClass, ctManageMenu, "getBehavioursFor", "isThisAPvpServer", replace); - Util.instrumentDeclared(thisClass, ctManageMenu, "action", "isThisAPvpServer", replace); // - Multiply mine door bash damage by 3 on Arena - // CtClass ctTerraforming = classPool.get("com.wurmonline.server.behaviours.Terraforming"); diff --git a/src/main/java/mod/sin/wyvern/Crystals.java b/src/main/java/mod/sin/wyvern/Crystals.java index 3dba1c3..4539895 100644 --- a/src/main/java/mod/sin/wyvern/Crystals.java +++ b/src/main/java/mod/sin/wyvern/Crystals.java @@ -7,6 +7,7 @@ import com.wurmonline.server.items.ItemSpellEffects; import com.wurmonline.server.items.NotOwnedException; import com.wurmonline.server.skills.NoSuchSkillException; import com.wurmonline.server.skills.SkillList; +import com.wurmonline.server.spells.SpellEffect; import com.wurmonline.shared.constants.Enchants; import mod.sin.items.ChaosCrystal; import mod.sin.items.EnchantersCrystal; @@ -63,7 +64,18 @@ public class Crystals { e.printStackTrace(); } if(target.getSpellEffects() != null){ - diff += target.getSpellEffects().getEffects().length*10; + for (SpellEffect eff : target.getSpellEffects().getEffects()){ + // Double power-based penalty for BotD + if (eff.type == Enchants.BUFF_BLESSINGDARK){ + diff += eff.getPower() * 0.1f; + } + if (eff.type != Enchants.BUFF_BLOODTHIRST) { + diff += eff.getPower() * 0.1f; + }else{ + // Bloodthirst penalty (1 per 1000 power) + diff += eff.getPower() * 0.001f; + } + } } return diff; } diff --git a/src/main/java/mod/sin/wyvern/EconomicChanges.java b/src/main/java/mod/sin/wyvern/EconomicChanges.java index 832df19..eae1670 100644 --- a/src/main/java/mod/sin/wyvern/EconomicChanges.java +++ b/src/main/java/mod/sin/wyvern/EconomicChanges.java @@ -92,6 +92,15 @@ public class EconomicChanges { replace = "$_ = "+EconomicChanges.class.getName()+".getNewVillageTiles(vill.getNumTiles());"; Util.instrumentDeclared(thisClass, ctGuardPlan, "getMonthlyCost", "getNumTiles", replace); + Util.setReason("Disable upkeep on arena for now until a fix can be found."); + replace = "if(com.wurmonline.server.Servers.localServer.PVPSERVER){" + + " $_ = false;" + + "}else{" + + " $_ = $proceed($$);" + + "}"; + //replace = "$_ = false;"; + Util.instrumentDeclared(thisClass, ctGuardPlan, "getMonthlyCost", "isUpkeep", replace); + /*Util.setReason("Allow players to get a full deed refund."); replace = "{ return "+EconomicChanges.class.getName()+".getNewDisbandMoney(this, this.getVillage()); }"; Util.setBodyDeclared(thisClass, ctGuardPlan, "getDisbandMoneyLeft", replace);*/ @@ -114,8 +123,8 @@ public class EconomicChanges { replace = "$1 = "+EconomicChanges.class.getName()+".getNewShopDiff($0, $1, $0.shopDiff);"; Util.insertBeforeDeclared(thisClass, ctTrade, "addShopDiff", replace); - } catch ( NotFoundException | IllegalArgumentException | ClassCastException e) { - throw new HookException(e); - } + } catch ( NotFoundException | IllegalArgumentException | ClassCastException e) { + throw new HookException(e); + } } } diff --git a/src/main/java/mod/sin/wyvern/ItemMod.java b/src/main/java/mod/sin/wyvern/ItemMod.java index ce40779..5a5a245 100644 --- a/src/main/java/mod/sin/wyvern/ItemMod.java +++ b/src/main/java/mod/sin/wyvern/ItemMod.java @@ -6,10 +6,10 @@ 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.combat.ArmourTemplate; import mod.sin.items.caches.*; import org.gotti.wurmunlimited.modloader.ReflectionUtil; import org.gotti.wurmunlimited.modloader.classhooks.HookManager; @@ -17,7 +17,6 @@ import org.gotti.wurmunlimited.modloader.classhooks.InvocationHandlerFactory; import org.gotti.wurmunlimited.modsupport.actions.ModActions; import com.wurmonline.server.behaviours.ActionEntry; -import com.wurmonline.server.combat.Armour; import com.wurmonline.server.combat.Weapon; import com.wurmonline.server.creatures.Creature; import com.wurmonline.server.items.Item; @@ -116,7 +115,6 @@ public class ItemMod { CORPSE_DECORATION.createTemplate(); DEPTH_DRILL.createTemplate(); DISINTEGRATION_ROD.createTemplate(); - //ELECTRUM_LUMP.createTemplate(); ENCHANT_ORB.createTemplate(); ETERNAL_ORB.createTemplate(); EVISCERATOR.createTemplate(); @@ -200,7 +198,6 @@ public class ItemMod { //COIN_DECORATION.initCreationEntry(); //CORPSE_DECORATION.initCreationEntry(); DEPTH_DRILL.initCreationEntry(); - //ELECTRUM_LUMP.initCreationEntry(); EVISCERATOR.initCreationEntry(); KNUCKLES.initCreationEntry(); MASS_STORAGE_UNIT.initCreationEntry(); @@ -227,47 +224,28 @@ public class ItemMod { GLIMMERSCALE_HOSE.initCreationEntry(); GLIMMERSCALE_SLEEVE.initCreationEntry(); GLIMMERSCALE_VEST.initCreationEntry();*/ - - // Allow sickle heads from steel & moon metals: - // [3/28/18] Disabled: Implemented in WU 1.6. - /*CreationEntryCreator.createSimpleEntry(SkillList.SMITHING_WEAPON_BLADES, ItemList.anvilLarge, ItemList.steelBar, - ItemList.sickleBlade, false, true, 0.0f, false, false, CreationCategories.BLADES); - CreationEntryCreator.createSimpleEntry(SkillList.SMITHING_WEAPON_BLADES, ItemList.anvilLarge, ItemList.adamantineBar, - ItemList.sickleBlade, false, true, 0.0f, false, false, CreationCategories.BLADES); - CreationEntryCreator.createSimpleEntry(SkillList.SMITHING_WEAPON_BLADES, ItemList.anvilLarge, ItemList.glimmerSteelBar, - ItemList.sickleBlade, false, true, 0.0f, false, false, CreationCategories.BLADES); - CreationEntryCreator.createSimpleEntry(SkillList.SMITHING_WEAPON_BLADES, ItemList.anvilLarge, ItemList.seryllBar, - ItemList.sickleBlade, false, true, 0.0f, false, false, CreationCategories.BLADES); - // Allow steel staff to be created from moon metals: - CreationEntryCreator.createSimpleEntry(SkillList.SMITHING_WEAPON_BLADES, ItemList.anvilLarge, ItemList.adamantineBar, - ItemList.staffSteel, false, true, 0.0f, false, false, CreationCategories.BLADES); - CreationEntryCreator.createSimpleEntry(SkillList.SMITHING_WEAPON_BLADES, ItemList.anvilLarge, ItemList.glimmerSteelBar, - ItemList.staffSteel, false, true, 0.0f, false, false, CreationCategories.BLADES); - CreationEntryCreator.createSimpleEntry(SkillList.SMITHING_WEAPON_BLADES, ItemList.anvilLarge, ItemList.seryllBar, - ItemList.staffSteel, false, true, 0.0f, false, false, CreationCategories.BLADES);*/ } public static void createCustomArmours(){ try { logger.info("Beginning custom armour creation."); - Map armours = ReflectionUtil.getPrivateField(null, ReflectionUtil.getField(Armour.class, "armours")); - armours.put(SpectralBoot.templateId, new Armour(SpectralBoot.templateId, 0.002f, 0.3f)); - armours.put(SpectralCap.templateId, new Armour(SpectralCap.templateId, 0.003f, 0.3f)); - armours.put(SpectralGlove.templateId, new Armour(SpectralGlove.templateId, 0.002f, 0.3f)); - armours.put(SpectralHose.templateId, new Armour(SpectralHose.templateId, 0.0075f, 0.3f)); - armours.put(SpectralJacket.templateId, new Armour(SpectralJacket.templateId, 0.01f, 0.3f)); - armours.put(SpectralSleeve.templateId, new Armour(SpectralSleeve.templateId, 0.004f, 0.3f)); + new ArmourTemplate(SpectralBoot.templateId, ArmourTemplate.ARMOUR_TYPE_LEATHER_DRAGON, 0.002f); + new ArmourTemplate(SpectralCap.templateId, ArmourTemplate.ARMOUR_TYPE_LEATHER_DRAGON, 0.003f); + new ArmourTemplate(SpectralGlove.templateId, ArmourTemplate.ARMOUR_TYPE_LEATHER_DRAGON, 0.002f); + new ArmourTemplate(SpectralHose.templateId, ArmourTemplate.ARMOUR_TYPE_LEATHER_DRAGON, 0.0075f); + new ArmourTemplate(SpectralJacket.templateId, ArmourTemplate.ARMOUR_TYPE_LEATHER_DRAGON, 0.01f); + new ArmourTemplate(SpectralSleeve.templateId, ArmourTemplate.ARMOUR_TYPE_LEATHER_DRAGON, 0.004f); - armours.put(GlimmerscaleBoot.templateId, new Armour(GlimmerscaleBoot.templateId, 0.002f, 0.15f)); - armours.put(GlimmerscaleGlove.templateId, new Armour(GlimmerscaleGlove.templateId, 0.001f, 0.15f)); - armours.put(GlimmerscaleHelmet.templateId, new Armour(GlimmerscaleHelmet.templateId, 0.008f, 0.15f)); - armours.put(GlimmerscaleHose.templateId, new Armour(GlimmerscaleHose.templateId, 0.05f, 0.15f)); - armours.put(GlimmerscaleSleeve.templateId, new Armour(GlimmerscaleSleeve.templateId, 0.008f, 0.15f)); - armours.put(GlimmerscaleVest.templateId, new Armour(GlimmerscaleVest.templateId, 0.05f, 0.15f)); + new ArmourTemplate(GlimmerscaleBoot.templateId, ArmourTemplate.ARMOUR_TYPE_SCALE_DRAGON, 0.002f); + new ArmourTemplate(GlimmerscaleGlove.templateId, ArmourTemplate.ARMOUR_TYPE_SCALE_DRAGON, 0.001f); + new ArmourTemplate(GlimmerscaleHelmet.templateId, ArmourTemplate.ARMOUR_TYPE_SCALE_DRAGON, 0.008f); + new ArmourTemplate(GlimmerscaleHose.templateId, ArmourTemplate.ARMOUR_TYPE_SCALE_DRAGON, 0.05f); + new ArmourTemplate(GlimmerscaleSleeve.templateId, ArmourTemplate.ARMOUR_TYPE_SCALE_DRAGON, 0.008f); + new ArmourTemplate(GlimmerscaleVest.templateId, ArmourTemplate.ARMOUR_TYPE_SCALE_DRAGON, 0.05f); //ReflectionUtil.setPrivateField(null, ReflectionUtil.getField(Armour.class, "armours"), armours); - } catch (IllegalArgumentException | IllegalAccessException | ClassCastException | NoSuchFieldException e) { + } catch (IllegalArgumentException | ClassCastException e) { e.printStackTrace(); } } @@ -277,7 +255,7 @@ public class ItemMod { logger.info("Beginning custom weapon creation."); new Weapon(BattleYoyo.templateId, 6.85f, 3.85f, 0.008f, 2, 2, 0.0f, 0d); new Weapon(Club.templateId, 8.1f, 4.5f, 0.002f, 3, 3, 0.4f, 0.5d); - new Weapon(Knuckles.templateId, 3.6f, 2.2f, 0.002f, 1, 1, 0.2f, 0.5d); + new Weapon(Knuckles.templateId, 3.7f, 2.2f, 0.002f, 1, 1, 0.2f, 0.5d); new Weapon(Warhammer.templateId, 9.40f, 5.6f, 0.008f, 4, 3, 1f, 0d); //new Weapon(ItemList.stoneChisel, 50f, 1f, 0.5f, 8, 1, 3f, -5f); // Titan weaponry @@ -360,6 +338,10 @@ public class ItemMod { ReflectionUtil.setPrivateField(creatureCage, ReflectionUtil.getField(creatureCage.getClass(), "value"), 100000); ReflectionUtil.setPrivateField(creatureCage, ReflectionUtil.getField(creatureCage.getClass(), "fullprice"), true); + // Resurrection Stones to 2 silver instead of 5 silver. + ItemTemplate resurrectionStone = ItemTemplateFactory.getInstance().getTemplate(ItemList.resurrectionStone); + ReflectionUtil.setPrivateField(resurrectionStone, ReflectionUtil.getField(resurrectionStone.getClass(), "value"), 20000); + // 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); diff --git a/src/main/java/mod/sin/wyvern/MiscChanges.java b/src/main/java/mod/sin/wyvern/MiscChanges.java index 798b0c1..51e830d 100644 --- a/src/main/java/mod/sin/wyvern/MiscChanges.java +++ b/src/main/java/mod/sin/wyvern/MiscChanges.java @@ -11,6 +11,7 @@ import com.wurmonline.server.items.SimpleCreationEntry; import com.wurmonline.server.players.Player; import com.wurmonline.server.players.PlayerInfo; import com.wurmonline.server.players.PlayerInfoFactory; +import com.wurmonline.server.players.Titles; import com.wurmonline.server.skills.Skill; import com.wurmonline.server.skills.SkillList; import com.wurmonline.server.villages.Village; @@ -33,10 +34,7 @@ import org.nyxcode.wurm.discordrelay.DiscordRelay; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; +import java.util.*; import java.util.logging.Logger; public class MiscChanges { @@ -99,7 +97,9 @@ public class MiscChanges { } catch (NoSuchCreatureException ignored) {} } - Players.getInstance().broadCastDeathInfo(player, attackerString.toString()); + if(!attackerString.toString().isEmpty()) { + Players.getInstance().broadCastDeathInfo(player, attackerString.toString()); + } } public static void broadCastDeaths(Creature player, String slayers){ @@ -295,6 +295,20 @@ public class MiscChanges { } return 0; } + + public static Titles.Title[] cleanTitles(Titles.Title[] titles){ + ArrayList arrTitles = new ArrayList<>(); + for(Titles.Title title : titles){ + logger.info("Checking title "+title); + if(title != null){ + logger.info("Title "+title.getName()+" is valid."); + arrTitles.add(title); + }else{ + logger.info("Title invalid. Discarding."); + } + } + return arrTitles.toArray(new Titles.Title[0]); + } public static void preInit(){ try{ @@ -311,7 +325,7 @@ public class MiscChanges { "Website/Maps: https://www.sarcasuals.com/", "Server Discord: https://discord.gg/r8QNXAC", "Server Data: https://docs.google.com/spreadsheets/d/1yjqTHoxUan4LIldI3jgrXZgXj1M2ENQ4MXniPUz0rE4", - "Server Wiki/Documentation: https://docs.google.com/document/d/1GeaygilS-Z-d1TuGB7awOe9sJNV4o5BTZw_a2ATJy98"}; + "Server Wiki/Documentation: https://docs.google.com/document/d/1cbPi7-vZnjaiYrENhaefzjK_Wz7_F1CcPYJtC6uCi98/edit?usp=sharing"}; StringBuilder str = new StringBuilder("{" + " com.wurmonline.server.Message mess;"); for (String anInfoTabLine : infoTabLine) { @@ -659,13 +673,13 @@ public class MiscChanges { "$_ = $proceed($$);"; Util.instrumentDeclared(thisClass, ctPlayerInfo, "calculateSleep", "setSleep", replace); - Util.setReason("Fix intrateleport block bug."); + /*Util.setReason("Fix intrateleport block bug."); replace = "if($6.contains(\"blocked\")){" + " logger.info(\"Detected a blocked movement, resetting position back to old.\");" + " $1 = $0.getMovementScheme().xOld;" + " $2 = $0.getMovementScheme().yOld;" + "}"; - Util.insertBeforeDeclared(thisClass, ctCreature, "intraTeleport", replace); + Util.insertBeforeDeclared(thisClass, ctCreature, "intraTeleport", replace);*/ Util.setReason("Allow royal smith to improve smithing items faster."); replace = "if("+MiscChanges.class.getName()+".royalSmithImprove($1, improve)){" + @@ -855,6 +869,17 @@ public class MiscChanges { "}"; Util.insertBeforeDescribed(thisClass, ctItemBehaviour, "action", desc14, replace); + /*Util.setReason("Fix title NPE from sorting."); + CtClass ctTitleCompoundQuestion = classPool.get("com.wurmonline.server.questions.TitleCompoundQuestion"); + replace = "titles = "+MiscChanges.class.getName()+".cleanTitles(titles);" + + "int i = 0;" + + "while(i < titles.length){" + + " logger.info(\"Title: \"+titles[i]);" + + " i++;" + + "}" + + "$_ = $proceed($$);"; + Util.instrumentDeclared(thisClass, ctTitleCompoundQuestion, "sendQuestion", "sort", replace);*/ + } catch (CannotCompileException | NotFoundException | IllegalArgumentException | ClassCastException e) { throw new HookException(e); } diff --git a/src/main/java/mod/sin/wyvern/PlayerTitles.java b/src/main/java/mod/sin/wyvern/PlayerTitles.java index 8c4d056..8e2167f 100644 --- a/src/main/java/mod/sin/wyvern/PlayerTitles.java +++ b/src/main/java/mod/sin/wyvern/PlayerTitles.java @@ -30,6 +30,7 @@ public class PlayerTitles { return ""; } public static void awardCustomTitles(Player p){ + /* Disabled until a fix for title implementations is done. String name = p.getName(); if(donatorTitles.contains(name)){ Titles.Title donator = Titles.Title.getTitle(800); @@ -38,7 +39,7 @@ public class PlayerTitles { if(customTitles.containsKey(name)){ Titles.Title customTitle = Titles.Title.getTitle(customTitles.get(name)); p.addTitle(customTitle); - } + }*/ } public static void preInit(){ // Donations diff --git a/src/main/java/mod/sin/wyvern/SupplyDepots.java b/src/main/java/mod/sin/wyvern/SupplyDepots.java index 5bff79a..48b113f 100644 --- a/src/main/java/mod/sin/wyvern/SupplyDepots.java +++ b/src/main/java/mod/sin/wyvern/SupplyDepots.java @@ -223,7 +223,7 @@ public class SupplyDepots { } public static void giveCacheReward(Creature performer){ Item inv = performer.getInventory(); - Item enchantOrb = ItemUtil.createEnchantOrb(40f+(Math.min(Server.rand.nextFloat()*40f, Server.rand.nextFloat()*40f))); + Item enchantOrb = ItemUtil.createEnchantOrb(60f+(Math.min(Server.rand.nextFloat()*60f, Server.rand.nextFloat()*60f))); if(enchantOrb != null) { inv.insertItem(enchantOrb); } @@ -232,16 +232,16 @@ public class SupplyDepots { int[] cacheIds = { ArmourCache.templateId, ArtifactCache.templateId, - CrystalCache.templateId, CrystalCache.templateId, + CrystalCache.templateId, CrystalCache.templateId, CrystalCache.templateId, DragonCache.templateId, DragonCache.templateId, GemCache.templateId, MoonCache.templateId, MoonCache.templateId, RiftCache.templateId, TreasureMapCache.templateId }; - int i = 2+Server.rand.nextInt(2); // 2-3 caches. + int i = 3+Server.rand.nextInt(2); // 2-3 caches. while(i > 0){ - Item cache = ItemFactory.createItem(cacheIds[Server.rand.nextInt(cacheIds.length)], 20f+(60f*Server.rand.nextFloat()), ""); + Item cache = ItemFactory.createItem(cacheIds[Server.rand.nextInt(cacheIds.length)], 40f+(50f*Server.rand.nextFloat()), ""); inv.insertItem(cache, true); i--; } diff --git a/src/main/java/mod/sin/wyvern/WyvernMods.java b/src/main/java/mod/sin/wyvern/WyvernMods.java index 2517b7f..318020b 100644 --- a/src/main/java/mod/sin/wyvern/WyvernMods.java +++ b/src/main/java/mod/sin/wyvern/WyvernMods.java @@ -144,7 +144,7 @@ implements WurmServerMod, Configurable, PreInitable, Initable, ItemTemplatesCrea Bloodlust.preInit(); AntiCheat.preInit(); Mastercraft.preInit(); - Mastercraft.addNewTitles(); + //Mastercraft.addNewTitles(); SupplyDepots.preInit(); KeyEvent.preInit(); //GemAugmentation.preInit(); diff --git a/src/main/java/mod/sin/wyvern/bestiary/MethodsBestiary.java b/src/main/java/mod/sin/wyvern/bestiary/MethodsBestiary.java index a9c7896..854f88d 100644 --- a/src/main/java/mod/sin/wyvern/bestiary/MethodsBestiary.java +++ b/src/main/java/mod/sin/wyvern/bestiary/MethodsBestiary.java @@ -524,6 +524,19 @@ public class MethodsBestiary { e.printStackTrace(); } } + + private static void setSkill(int templateId, int skillId, float value){ + try{ + CreatureTemplate template = CreatureTemplateFactory.getInstance().getTemplate(templateId); + if(template != null){ + Skills skills = ReflectionUtil.getPrivateField(template, ReflectionUtil.getField(template.getClass(), "skills")); + skills.learnTemp(skillId, value); + ReflectionUtil.setPrivateField(template, ReflectionUtil.getField(template.getClass(), "skills"), skills); + } + } catch (NoSuchCreatureTemplateException | IllegalArgumentException | IllegalAccessException | ClassCastException | NoSuchFieldException e) { + e.printStackTrace(); + } + } private static void setWorgFields(int templateId) { try { @@ -594,18 +607,18 @@ public class MethodsBestiary { setUniqueTypes(CreatureTemplate.CYCLOPS_CID); // Dragon natural armour increases: - setNaturalArmour(CreatureTemplate.DRAGON_BLUE_CID, 0.035f); - setNaturalArmour(CreatureTemplate.DRAGON_WHITE_CID, 0.035f); - setNaturalArmour(CreatureTemplate.DRAGON_BLACK_CID, 0.045f); - setNaturalArmour(CreatureTemplate.DRAGON_WHITE_CID, 0.035f); + setNaturalArmour(CreatureTemplate.DRAGON_BLUE_CID, 0.025f); + setNaturalArmour(CreatureTemplate.DRAGON_WHITE_CID, 0.025f); + setNaturalArmour(CreatureTemplate.DRAGON_BLACK_CID, 0.035f); + setNaturalArmour(CreatureTemplate.DRAGON_WHITE_CID, 0.025f); // Drake natural armour increases: - setNaturalArmour(CreatureTemplate.DRAKE_RED_CID, 0.065f); - setNaturalArmour(CreatureTemplate.DRAKE_BLUE_CID, 0.065f); - setNaturalArmour(CreatureTemplate.DRAKE_WHITE_CID, 0.075f); - setNaturalArmour(CreatureTemplate.DRAKE_GREEN_CID, 0.065f); - setNaturalArmour(CreatureTemplate.DRAKE_BLACK_CID, 0.055f); + setNaturalArmour(CreatureTemplate.DRAKE_RED_CID, 0.055f); + setNaturalArmour(CreatureTemplate.DRAKE_BLUE_CID, 0.055f); + setNaturalArmour(CreatureTemplate.DRAKE_WHITE_CID, 0.065f); + setNaturalArmour(CreatureTemplate.DRAKE_GREEN_CID, 0.055f); + setNaturalArmour(CreatureTemplate.DRAKE_BLACK_CID, 0.045f); // Goblin leader natural armour increase: - setNaturalArmour(CreatureTemplate.GOBLIN_LEADER_CID, 0.055f); + setNaturalArmour(CreatureTemplate.GOBLIN_LEADER_CID, 0.045f); // Worg armour reduction on Arena if(Servers.localServer.PVPSERVER) { @@ -630,6 +643,9 @@ public class MethodsBestiary { // Set worg fields setWorgFields(CreatureTemplate.WORG_CID); + + // Set skills for certain creatures + setSkill(CreatureTemplate.CYCLOPS_CID, SkillList.GROUP_FIGHTING, 80.0f); } protected static void sendParticleEffect(Communicator comm, long creatureId, Creature creature, String particle, float duration){ diff --git a/src/main/java/mod/sin/wyvern/bounty/PlayerBounty.java b/src/main/java/mod/sin/wyvern/bounty/PlayerBounty.java index 5a97db2..ba3fd0d 100644 --- a/src/main/java/mod/sin/wyvern/bounty/PlayerBounty.java +++ b/src/main/java/mod/sin/wyvern/bounty/PlayerBounty.java @@ -1,12 +1,5 @@ package mod.sin.wyvern.bounty; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; -import java.util.Random; -import java.util.logging.Logger; - import com.wurmonline.server.FailedException; import com.wurmonline.server.Server; import com.wurmonline.server.Servers; @@ -17,9 +10,6 @@ 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.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.Reaper; @@ -27,9 +17,19 @@ 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.wyvern.*; +import mod.sin.wyvern.Bounty; +import mod.sin.wyvern.MiscChanges; +import mod.sin.wyvern.RareSpawns; +import mod.sin.wyvern.Titans; import mod.sin.wyvern.util.ItemUtil; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import java.util.Random; +import java.util.logging.Logger; + public class PlayerBounty { public static final Logger logger = Logger.getLogger(PlayerBounty.class.getName()); protected static final Random random = new Random(); @@ -109,7 +109,7 @@ public class PlayerBounty { fightStrength = "legendary"; } player.getCommunicator().sendSafeServerMessage("The spirit recognizes you as a "+fightStrength+" warrior, and rewards you accordingly."); - player.addTitle(Title.getTitle(701)); + //player.addTitle(Title.getTitle(701)); }catch (NoSuchTemplateException | FailedException e) { e.printStackTrace(); } @@ -148,7 +148,7 @@ public class PlayerBounty { player.getInventory().insertItem(riftCache, true); } if(Titans.isTitan(mob)){ - player.addTitle(Title.getTitle(700)); + //player.addTitle(Title.getTitle(700)); Item affinityOrb = ItemFactory.createItem(AffinityOrb.templateId, 99f, mob.getName()); player.getInventory().insertItem(affinityOrb, true); Item titanCache = ItemFactory.createItem(TitanCache.templateId, 99f, mob.getName()); diff --git a/src/main/java/mod/sin/wyvern/mastercraft/Mastercraft.java b/src/main/java/mod/sin/wyvern/mastercraft/Mastercraft.java index af11de8..74bce1c 100644 --- a/src/main/java/mod/sin/wyvern/mastercraft/Mastercraft.java +++ b/src/main/java/mod/sin/wyvern/mastercraft/Mastercraft.java @@ -72,9 +72,9 @@ public class Mastercraft { try { ExtendTitleEnum.builder("com.wurmonline.server.players.Titles$Title"); // GM/Developer Titles - ExtendTitleEnum.getSingletonInstance().addExtendEntry("Game_Master", 500, "Game Master", "Game Master", -1, "NORMAL"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("Developer", 501, "Developer", "Developer", -1, "NORMAL"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("Pet_Me", 502, "Pet Me", "Pet Me", -1, "NORMAL"); + ExtendTitleEnum.getSingletonInstance().addExtendEntry("Game_Master", 2500, "Game Master", "Game Master", -1, "NORMAL"); + ExtendTitleEnum.getSingletonInstance().addExtendEntry("Developer", 2501, "Developer", "Developer", -1, "NORMAL"); + ExtendTitleEnum.getSingletonInstance().addExtendEntry("Pet_Me", 2502, "Pet Me", "Pet Me", -1, "NORMAL"); // Troll Titles ExtendTitleEnum.getSingletonInstance().addExtendEntry("Macro_King", 550, "Macro King", "Macro King", -1, "NORMAL"); @@ -114,70 +114,6 @@ public class Mastercraft { ExtendTitleEnum.getSingletonInstance().addExtendEntry("Piratemax_Slave", 810, "Slave", "Slave", -1, "NORMAL"); ExtendTitleEnum.getSingletonInstance().addExtendEntry("Eltacolad_TrueTaco", 811, "The One True Taco", "The One True Taco", -1, "NORMAL"); - // Characteristic Titles - ExtendTitleEnum.getSingletonInstance().addExtendEntry("MindLogic_Normal", 1000, "Logical", "Logical", 100, "NORMAL"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("MindLogic_Minor", 1001, "Intelligent", "Intelligent", 100, "MINOR"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("MindLogic_Master", 1002, "Brilliant", "Brilliant", 100, "MASTER"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("MindLogic_Legendary", 1003, "Mentalist", "Mentalist", 100, "LEGENDARY"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("MindSpeed_Normal", 1004, "Keen", "Keen", 101, "NORMAL"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("MindSpeed_Minor", 1005, "Thinker", "Thinker", 101, "MINOR"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("MindSpeed_Master", 1006, "Clever", "Clever", 101, "MASTER"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("MindSpeed_Legendary", 1007, "Mind Over Matter", "Mind Over Matter", 101, "LEGENDARY"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("BodyStrength_Normal", 1008, "Strong", "Strong", 102, "NORMAL"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("BodyStrength_Minor", 1009, "Fortified", "Fortified", 102, "MINOR"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("BodyStrength_Master", 1010, "Unyielding", "Unyielding", 102, "MASTER"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("BodyStrength_Legendary", 1011, "Force of Nature", "Force of Nature", 102, "LEGENDARY"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("BodyStamina_Normal", 1012, "Enduring", "Enduring", 103, "NORMAL"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("BodyStamina_Minor", 1013, "Resilient", "Resilient", 103, "MINOR"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("BodyStamina_Master", 1014, "Vigorous", "Vigorous", 103, "MASTER"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("BodyStamina_Legendary", 1015, "Unstoppable", "Unstoppable", 103, "LEGENDARY"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("BodyControl_Normal", 1016, "Nimble", "Nimble", 104, "NORMAL"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("BodyControl_Minor", 1017, "Deft", "Deft", 104, "MINOR"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("BodyControl_Master", 1018, "Skillful", "Skillful", 104, "MASTER"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("BodyControl_Legendary", 1019, "Manipulator", "Manipulator", 104, "LEGENDARY"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("SoulStrength_Normal", 1020, "Spirited", "Spirited", 105, "NORMAL"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("SoulStrength_Minor", 1021, "Diviner", "Diviner", 105, "MINOR"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("SoulStrength_Master", 1022, "Anima", "Anima", 105, "MASTER"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("SoulStrength_Legendary", 1023, "Prophet", "Prophet", 105, "LEGENDARY"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("SoulDepth_Normal", 1024, "Sensible", "Sensible", 106, "NORMAL"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("SoulDepth_Minor", 1025, "Medium", "Medium", 106, "MINOR"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("SoulDepth_Master", 1026, "Spiritual", "Spiritual", 106, "MASTER"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("SoulDepth_Legendary", 1027, "Planewalker", "Planewalker", 106, "LEGENDARY"); - - // Skill Titles (Full) - ExtendTitleEnum.getSingletonInstance().addExtendEntry("Staff_Normal", 1100, "Acolyte", "Acolyte", 10090, "NORMAL"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("Staff_Minor", 1101, "Disciple", "Disciple", 10090, "MINOR"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("Staff_Master", 1102, "Monk", "Monk", 10090, "MASTER"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("Staff_Legendary", 1103, "Sensei", "Sensei", 10090, "LEGENDARY"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("Scythe_Normal", 1104, "Mower", "Mower", 10047, "NORMAL"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("Scythe_Minor", 1105, "Harvester", "Harvester", 10047, "MINOR"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("Scythe_Master", 1106, "Scythian", "Scythian", 10047, "MASTER"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("Scythe_Legendary", 1107, "Reaper", "Reaper", 10047, "LEGENDARY"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("Defensive_Normal", 1108, "Resistant", "Resistant", 10054, "NORMAL"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("Defensive_Minor", 1109, "Guardian", "Guardian", 10054, "MINOR"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("Defensive_Master", 1110, "Bulwark", "Bulwark", 10054, "MASTER"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("Defensive_Legendary", 1111, "Unbreakable", "Unbreakable", 10054, "LEGENDARY"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("Aggressive_Normal", 1112, "Angry", "Angry", 10053, "NORMAL"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("Aggressive_Minor", 1113, "Violent", "Violent", 10053, "MINOR"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("Aggressive_Master", 1114, "Battleborn", "Battleborn", 10053, "MASTER"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("Aggressive_Legendary", 1115, "Warmonger", "Warmonger", 10053, "LEGENDARY"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("Normal_Normal", 1116, "Infantry", "Infantry", 10055, "NORMAL"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("Normal_Minor", 1117, "Marauder", "Marauder", 10055, "MINOR"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("Normal_Master", 1118, "Gladiator", "Gladiator", 10055, "MASTER"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("Normal_Legendary", 1119, "Templar", "Templar", 10055, "LEGENDARY"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("Weaponless_Normal", 1120, "Scrapper", "Scrapper", 10052, "NORMAL"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("Weaponless_Minor", 1121, "Brawler", "Brawler", 10052, "MINOR"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("Weaponless_Master", 1122, "Boxer", "Boxer", 10052, "MASTER"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("Weaponless_Legendary", 1123, "Martial Artist", "Martial Artist", 10052, "LEGENDARY"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("BladesSmithing_Normal", 1124, "Bladesmith", "Bladesmith", SkillList.SMITHING_WEAPON_BLADES, "NORMAL"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("BladesSmithing_Minor", 1125, "Renowned Bladesmith", "Renowned Bladesmith", SkillList.SMITHING_WEAPON_BLADES, "MINOR"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("BladesSmithing_Master", 1126, "Master Bladesmith", "Master Bladesmith", SkillList.SMITHING_WEAPON_BLADES, "MASTER"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("BladesSmithing_Legendary", 1127, "Legendary Bladesmith", "Legendary Bladesmith", SkillList.SMITHING_WEAPON_BLADES, "LEGENDARY"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("HeadSmithing_Normal", 1128, "Headsmither", "Headsmither", SkillList.SMITHING_WEAPON_HEADS, "NORMAL"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("HeadSmithing_Minor", 1129, "Renowned Headsmither", "Renowned Headsmither", SkillList.SMITHING_WEAPON_HEADS, "MINOR"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("HeadSmithing_Master", 1130, "Master Headsmither", "Master Headsmither", SkillList.SMITHING_WEAPON_HEADS, "MASTER"); - ExtendTitleEnum.getSingletonInstance().addExtendEntry("HeadSmithing_Legendary", 1131, "Legendary Headsmither", "Legendary Headsmither", SkillList.SMITHING_WEAPON_HEADS, "LEGENDARY"); - // Skill Titles (100) ExtendTitleEnum.getSingletonInstance().addExtendEntry("Archery_Legendary", 1500, "Legendary Marksman", "Legendary Marksman", 1030, "LEGENDARY"); ExtendTitleEnum.getSingletonInstance().addExtendEntry("Body_Legendary", 1501, "Hercules", "Hercules", 1, "LEGENDARY");