From 8d0e7429fe68895c419731cb51815f4e1a083ea6 Mon Sep 17 00:00:00 2001 From: mstoppelli Date: Mon, 10 Dec 2018 18:49:37 -0500 Subject: [PATCH] Schematics, gremlins, holiday items added. Untested --- src/main/java/mod/sin/creatures/Gremlin.java | 75 +++++++++++++++++++ .../java/mod/sin/items/CrystalPermaFrost.java | 58 ++++++++++++++ .../java/mod/sin/items/HolidaySpirit.java | 44 +++++++++++ .../java/mod/sin/items/WandPermaFrost.java | 54 +++++++++++++ .../java/mod/sin/wyvern/DatabaseHelper.java | 8 ++ src/main/java/mod/sin/wyvern/ItemMod.java | 8 ++ src/main/java/mod/sin/wyvern/WyvernMods.java | 2 + .../bonusoverhaul/ItemBonusOverhaul.java | 5 +- .../mod/sin/wyvern/bounty/LootBounty.java | 12 +++ .../mod/sin/wyvern/schematics/Schematics.java | 73 ++++++++++++++++++ 10 files changed, 338 insertions(+), 1 deletion(-) create mode 100644 src/main/java/mod/sin/creatures/Gremlin.java create mode 100644 src/main/java/mod/sin/items/CrystalPermaFrost.java create mode 100644 src/main/java/mod/sin/items/HolidaySpirit.java create mode 100644 src/main/java/mod/sin/items/WandPermaFrost.java create mode 100644 src/main/java/mod/sin/wyvern/schematics/Schematics.java diff --git a/src/main/java/mod/sin/creatures/Gremlin.java b/src/main/java/mod/sin/creatures/Gremlin.java new file mode 100644 index 0000000..3b5ee46 --- /dev/null +++ b/src/main/java/mod/sin/creatures/Gremlin.java @@ -0,0 +1,75 @@ +package mod.sin.creatures; + +import com.wurmonline.mesh.Tiles; +import com.wurmonline.server.bodys.BodyTemplate; +import com.wurmonline.server.bodys.Wound; +import com.wurmonline.server.creatures.CreatureTemplate; +import com.wurmonline.server.creatures.CreatureTemplateFactory; +import com.wurmonline.server.creatures.Creatures; +import com.wurmonline.server.creatures.NoSuchCreatureTemplateException; +import com.wurmonline.server.items.ItemList; +import com.wurmonline.server.skills.SkillList; +import com.wurmonline.shared.constants.CreatureTypes; +import org.gotti.wurmunlimited.modsupport.CreatureTemplateBuilder; +import org.gotti.wurmunlimited.modsupport.creatures.EncounterBuilder; +import org.gotti.wurmunlimited.modsupport.creatures.ModCreature; + +import java.util.Date; + +public class Gremlin implements ModCreature, CreatureTypes { + public static int templateId; + @Override + public CreatureTemplateBuilder createCreateTemplateBuilder() { + int[] types = new int[] { + CreatureTypes.C_TYPE_MOVE_LOCAL, + CreatureTypes.C_TYPE_AGG_HUMAN, + CreatureTypes.C_TYPE_HUNTING, + CreatureTypes.C_TYPE_MONSTER, + CreatureTypes.C_TYPE_CARNIVORE + }; + + CreatureTemplateBuilder builder = new CreatureTemplateBuilder("mod.creature.gremlin", "gremlin", + "Small creature that enjoys ruining christmas.", "model.creature.humanoid.goblin.standard", + types, + BodyTemplate.TYPE_HUMAN, (short)5, (byte)0, (short)130, + (short)30, (short)20, "sound.death.goblin", "sound.death.goblin", + "sound.combat.hit.goblin", "sound.combat.hit.goblin", + 0.7f, 3.0f, 5.0f, 0.0f, + 0.0f, 0.0f, 0.7f, 1500, new int[] {ItemList.heart}, 10, 94); + + builder.skill(SkillList.BODY_STRENGTH, 20.0f); + builder.skill(SkillList.BODY_STAMINA, 15.0f); + builder.skill(SkillList.BODY_CONTROL, 20.0f); + builder.skill(SkillList.MIND_LOGICAL, 10.0f); + builder.skill(SkillList.MIND_SPEED, 12.0f); + builder.skill(SkillList.SOUL_STRENGTH, 15.0f); + builder.skill(SkillList.SOUL_DEPTH, 26.0f); + builder.skill(SkillList.WEAPONLESS_FIGHTING, 7.0f); + builder.skill(SkillList.GROUP_FIGHTING, 40.0f); + + builder.handDamString("claws"); + builder.alignment(-40.0f); + builder.maxAge(100); + builder.baseCombatRating(7.0f); + builder.combatDamageType(Wound.TYPE_PIERCE); + builder.denName("gremlin hole"); + builder.hasHands(true); + builder.maxPercentOfCreatures(.06f); + + templateId = builder.getTemplateId(); + return builder; + } + + @Override + public void addEncounters() { + + if (templateId == 0 ) { + return; + } + + new EncounterBuilder(Tiles.Tile.TILE_TREE.id) + .addCreatures(templateId, 5) + .build(1); + + } +} diff --git a/src/main/java/mod/sin/items/CrystalPermaFrost.java b/src/main/java/mod/sin/items/CrystalPermaFrost.java new file mode 100644 index 0000000..39e6d75 --- /dev/null +++ b/src/main/java/mod/sin/items/CrystalPermaFrost.java @@ -0,0 +1,58 @@ +package mod.sin.items; + +import com.wurmonline.server.MiscConstants; +import com.wurmonline.server.items.*; +import com.wurmonline.server.skills.SkillList; +import org.gotti.wurmunlimited.modsupport.ItemTemplateBuilder; + +import java.io.IOException; +import java.util.logging.Logger; + +public class CrystalPermaFrost implements MiscConstants, ItemTypes { + public static Logger logger = Logger.getLogger(CrystalPermaFrost.class.getName()); + public static int templateId; + String name = "crystal of permafrost"; + + public void createTemplate() throws IOException { + ItemTemplateBuilder itemBuilder = new ItemTemplateBuilder("mod.item.crystal.permafrost"); + itemBuilder.name(name, "crystals of permafrost", "It's freezing to the touch, like it's absorbing all the heat."); + itemBuilder.descriptions("brilliantly glowing", "strongly glowing", "faintly glowing", "barely glowing"); + itemBuilder.itemTypes(new short[]{ + ItemTypes.ITEM_TYPE_MAGIC, + ItemTypes.ITEM_TYPE_FULLPRICE, + ItemTypes.ITEM_TYPE_NOSELLBACK, + ItemTypes.ITEM_TYPE_ALWAYS_BANKABLE + }); + itemBuilder.imageNumber((short) 859); + itemBuilder.behaviourType((short) 1); + itemBuilder.combatDamage(0); + itemBuilder.decayTime(Long.MAX_VALUE); + itemBuilder.dimensions(1, 1, 1); + itemBuilder.primarySkill((int) NOID); + itemBuilder.bodySpaces(EMPTY_BYTE_PRIMITIVE_ARRAY); + itemBuilder.modelName("model.valrei."); + itemBuilder.difficulty(5.0f); + itemBuilder.weightGrams(2000); + itemBuilder.material(Materials.MATERIAL_CRYSTAL); + itemBuilder.value(0); + + ItemTemplate template = itemBuilder.build(); + templateId = template.getTemplateId(); + logger.info(name + " TemplateID: " + templateId); + + + } + + public void initCreationEntry() { + logger.info("initCreationEntry()"); + if(templateId > 0){ + logger.info("Creating "+name+" creation entry, ID = "+templateId); + AdvancedCreationEntry ce = CreationEntryCreator.createAdvancedEntry(SkillList.GROUP_ALCHEMY, HolidaySpirit.templateId, HolidaySpirit.templateId, + CrystalPermaFrost.templateId, false, false, 0f, true, false, + CreationCategories.ALCHEMY); + ce.addRequirement(new CreationRequirement(1, HolidaySpirit.templateId, 18, true)); + }else{ + logger.info(name+" does not have a template ID on creation entry."); + } + } +} diff --git a/src/main/java/mod/sin/items/HolidaySpirit.java b/src/main/java/mod/sin/items/HolidaySpirit.java new file mode 100644 index 0000000..0ff32c4 --- /dev/null +++ b/src/main/java/mod/sin/items/HolidaySpirit.java @@ -0,0 +1,44 @@ +package mod.sin.items; + +import com.wurmonline.server.MiscConstants; +import com.wurmonline.server.items.ItemTemplate; +import com.wurmonline.server.items.ItemTypes; +import com.wurmonline.server.items.Materials; +import org.gotti.wurmunlimited.modsupport.ItemTemplateBuilder; + +import java.io.IOException; +import java.util.logging.Logger; + +public class HolidaySpirit implements ItemTypes, MiscConstants { + public static Logger logger = Logger.getLogger(HolidaySpirit.class.getName()); + public static int templateId; + + public void createTemplate() throws IOException { + String name = "holiday spirit"; + ItemTemplateBuilder itemBuilder = new ItemTemplateBuilder("mod.item.holiday.spirit"); + itemBuilder.name(name, "holiday spirit", "Stolen christmas joy."); + itemBuilder.descriptions("brilliantly glowing", "strongly glowing", "faintly glowing", "barely glowing"); + itemBuilder.itemTypes(new short[]{ + ItemTypes.ITEM_TYPE_MAGIC, + ItemTypes.ITEM_TYPE_FULLPRICE, + ItemTypes.ITEM_TYPE_NOSELLBACK, + ItemTypes.ITEM_TYPE_ALWAYS_BANKABLE + }); + itemBuilder.imageNumber((short) 859); + itemBuilder.behaviourType((short) 1); + itemBuilder.combatDamage(0); + itemBuilder.decayTime(Long.MAX_VALUE); + itemBuilder.dimensions(1, 1, 1); + itemBuilder.primarySkill((int) NOID); + itemBuilder.bodySpaces(EMPTY_BYTE_PRIMITIVE_ARRAY); + itemBuilder.modelName("model.valrei."); + itemBuilder.difficulty(5.0f); + itemBuilder.weightGrams(100); + itemBuilder.material(Materials.MATERIAL_CRYSTAL); + itemBuilder.value(0); + + ItemTemplate template = itemBuilder.build(); + templateId = template.getTemplateId(); + 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 new file mode 100644 index 0000000..651ab7a --- /dev/null +++ b/src/main/java/mod/sin/items/WandPermaFrost.java @@ -0,0 +1,54 @@ +package mod.sin.items; + +import com.wurmonline.server.MiscConstants; +import com.wurmonline.server.items.*; +import com.wurmonline.server.skills.SkillList; +import org.gotti.wurmunlimited.modsupport.ItemTemplateBuilder; + +import java.io.IOException; +import java.util.logging.Logger; + +public class WandPermaFrost implements MiscConstants { + public static Logger logger = Logger.getLogger(WandPermaFrost.class.getName()); + public static int templateId; + String name = "wand of permafrost"; + + public void createTemplate() throws IOException { + ItemTemplateBuilder itemBuilder = new ItemTemplateBuilder("mod.item.wand.permafrost"); + itemBuilder.name(name, "wands of permafrost", "A powerful wand containing a permafrost crystal."); + itemBuilder.descriptions("brilliantly glowing", "strongly glowing", "faintly glowing", "barely glowing"); + itemBuilder.itemTypes(new short[]{ + ItemTypes.ITEM_TYPE_MAGIC, + ItemTypes.ITEM_TYPE_FULLPRICE, + ItemTypes.ITEM_TYPE_NOSELLBACK, + ItemTypes.ITEM_TYPE_ALWAYS_BANKABLE + }); + itemBuilder.imageNumber((short) 859); + itemBuilder.behaviourType((short) 1); + itemBuilder.combatDamage(0); + itemBuilder.decayTime(Long.MAX_VALUE); + itemBuilder.dimensions(1, 1, 1); + itemBuilder.primarySkill((int) NOID); + itemBuilder.bodySpaces(EMPTY_BYTE_PRIMITIVE_ARRAY); + itemBuilder.modelName("model.valrei."); + itemBuilder.difficulty(5.0f); + itemBuilder.weightGrams(3000); + itemBuilder.material(Materials.MATERIAL_CRYSTAL); + itemBuilder.value(0); + + ItemTemplate template = itemBuilder.build(); + templateId = template.getTemplateId(); + logger.info(name + " TemplateID: " + templateId); + } + + public void initCreationEntry() { + logger.info("initCreationEntry()"); + if(templateId > 0){ + logger.info("Creating "+name+" creation entry, ID = "+templateId); + CreationEntryCreator.createSimpleEntry(SkillList.SMITHING_GOLDSMITHING, CrystalPermaFrost.templateId, ItemList.shaft, templateId, + true,true, 0, false, false, CreationCategories.JEWELRY); + }else{ + logger.info(name+" does not have a template ID on creation entry."); + } + } +} diff --git a/src/main/java/mod/sin/wyvern/DatabaseHelper.java b/src/main/java/mod/sin/wyvern/DatabaseHelper.java index 13ee335..b78bf85 100644 --- a/src/main/java/mod/sin/wyvern/DatabaseHelper.java +++ b/src/main/java/mod/sin/wyvern/DatabaseHelper.java @@ -92,6 +92,14 @@ public class DatabaseHelper { ps.execute(); ps.close(); } + tableName = "SchematicMap"; + if (!ModSupportDb.hasTable(con, tableName)) { + logger.info(tableName+" table not found in ModSupport. Creating table now."); + sql = "CREATE TABLE "+tableName+" (name VARCHAR(30) NOT NULL DEFAULT 'Unknown', templateid INT NOT NULL DEFAULT 0)"; + PreparedStatement ps = con.prepareStatement(sql); + ps.execute(); + ps.close(); + } tableName = "PlayerStats"; if (!ModSupportDb.hasTable(con, tableName)) { logger.info(tableName+" table not found in ModSupport. Creating table now."); diff --git a/src/main/java/mod/sin/wyvern/ItemMod.java b/src/main/java/mod/sin/wyvern/ItemMod.java index b012685..a5dd3a0 100644 --- a/src/main/java/mod/sin/wyvern/ItemMod.java +++ b/src/main/java/mod/sin/wyvern/ItemMod.java @@ -108,6 +108,9 @@ public class ItemMod { public static WoodEssence WOOD_ESSENCE = new WoodEssence(); public static ArcaniteNecklace ARCANITE_NECKLACE = new ArcaniteNecklace(); public static ArcaniteNecklaceFocus ARCANITE_NECKLACE_FOCUS = new ArcaniteNecklaceFocus(); + public static HolidaySpirit HOLIDAY_SPIRIT = new HolidaySpirit(); + public static WandPermaFrost WAND_PERMA_FROST = new WandPermaFrost(); + public static CrystalPermaFrost CRYSTAL_PERMA_FROST = new CrystalPermaFrost(); public static void createItems(){ logger.info("createItems()"); @@ -147,6 +150,9 @@ public class ItemMod { WOOD_ESSENCE.createTemplate(); ARCANITE_NECKLACE.createTemplate(); ARCANITE_NECKLACE_FOCUS.createTemplate(); + HOLIDAY_SPIRIT.createTemplate(); + CRYSTAL_PERMA_FROST.createTemplate(); + WAND_PERMA_FROST.createTemplate(); // Arena Fragments @@ -234,6 +240,8 @@ public class ItemMod { WOOD_ESSENCE.initCreationEntry(); ARCANITE_NECKLACE.initCreationEntry(); ARCANITE_NECKLACE_FOCUS.initCreationEntry(); + CRYSTAL_PERMA_FROST.initCreationEntry(); + WAND_PERMA_FROST.initCreationEntry(); // Spectral set diff --git a/src/main/java/mod/sin/wyvern/WyvernMods.java b/src/main/java/mod/sin/wyvern/WyvernMods.java index ff5d443..8756997 100644 --- a/src/main/java/mod/sin/wyvern/WyvernMods.java +++ b/src/main/java/mod/sin/wyvern/WyvernMods.java @@ -26,6 +26,7 @@ import mod.sin.items.*; import mod.sin.kingdomoffices.ItemCreator; import mod.sin.lib.Util; import mod.sin.wyvern.bonusoverhaul.ItemBonusOverhaul; +import mod.sin.wyvern.schematics.Schematics; import org.gotti.wurmunlimited.modloader.ReflectionUtil; import org.gotti.wurmunlimited.modloader.classhooks.HookException; import org.gotti.wurmunlimited.modloader.classhooks.HookManager; @@ -158,6 +159,7 @@ implements WurmServerMod, Configurable, PreInitable, Initable, ItemTemplatesCrea KeyEvent.preInit(); //GemAugmentation.preInit(); ItemBonusOverhaul.preInit(); + Schematics.preInit(); Class thisClass = WyvernMods.class; ClassPool classPool = HookManager.getInstance().getClassPool(); diff --git a/src/main/java/mod/sin/wyvern/bonusoverhaul/ItemBonusOverhaul.java b/src/main/java/mod/sin/wyvern/bonusoverhaul/ItemBonusOverhaul.java index 4914dd6..142d106 100644 --- a/src/main/java/mod/sin/wyvern/bonusoverhaul/ItemBonusOverhaul.java +++ b/src/main/java/mod/sin/wyvern/bonusoverhaul/ItemBonusOverhaul.java @@ -40,7 +40,10 @@ public class ItemBonusOverhaul { batteries = new Battery[] { new Battery(Soul.templateId, 30), - new Battery(ItemList.rubyStar, 10) + new Battery(ItemList.rubyStar, 10), + new Battery(ItemList.diamondStar, 10), + new Battery(ItemList.emeraldStar, 10), + new Battery(ItemList.sapphireStar, 10) }; for(ItemBonusWrapper wrapper: itemBonuses) { diff --git a/src/main/java/mod/sin/wyvern/bounty/LootBounty.java b/src/main/java/mod/sin/wyvern/bounty/LootBounty.java index bb34405..68bee23 100644 --- a/src/main/java/mod/sin/wyvern/bounty/LootBounty.java +++ b/src/main/java/mod/sin/wyvern/bounty/LootBounty.java @@ -15,10 +15,12 @@ import com.wurmonline.server.items.*; import com.wurmonline.server.villages.Village; import com.wurmonline.server.villages.Villages; import mod.piddagoras.duskombat.DamageEngine; +import mod.sin.creatures.Gremlin; import mod.sin.creatures.Reaper; import mod.sin.creatures.SpectralDrake; import mod.sin.items.AffinityOrb; import mod.sin.items.FriyanTablet; +import mod.sin.items.HolidaySpirit; import mod.sin.items.caches.*; import mod.sin.wyvern.Bounty; import mod.sin.wyvern.MiscChanges; @@ -388,6 +390,16 @@ public class LootBounty { e.printStackTrace(); } } + if(mob.getTemplateId() == Gremlin.templateId) { + if(random.nextInt(100) < 20) { + try { + Item holidaySpirit = ItemFactory.createItem(HolidaySpirit.templateId, 20+(60*random.nextFloat()), ""); + corpse.insertItem(holidaySpirit); + } catch (FailedException | NoSuchTemplateException e) { + e.printStackTrace(); + } + } + } if(mob.isUnique()){ // Spawn random addy/glimmer veins throughout the world blessWorldWithMoonVeins(mob); diff --git a/src/main/java/mod/sin/wyvern/schematics/Schematics.java b/src/main/java/mod/sin/wyvern/schematics/Schematics.java new file mode 100644 index 0000000..0e4a186 --- /dev/null +++ b/src/main/java/mod/sin/wyvern/schematics/Schematics.java @@ -0,0 +1,73 @@ +package mod.sin.wyvern.schematics; + +import com.wurmonline.server.creatures.Creature; +import com.wurmonline.server.items.CreationEntry; +import javassist.ClassPool; +import javassist.CtClass; +import javassist.NotFoundException; +import mod.sin.items.WandPermaFrost; +import mod.sin.lib.Util; +import org.gotti.wurmunlimited.modloader.classhooks.HookManager; +import org.gotti.wurmunlimited.modsupport.ModSupportDb; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; + +public class Schematics { + private static ArrayList schematics = new ArrayList<>(); + + public static void preInit() { + initSchematicList(); + + try { + Util.setReason("Overriding difficulty check to check for creationentry requirements"); + ClassPool classPool = HookManager.getInstance().getClassPool(); + final Class thisClass = Schematics.class; + String replace; + + CtClass ctCreationEntry = classPool.get("com.wurmonline.server.items.CreationEntry"); + replace = "boolean hasSchematic = " + Schematics.class.getName() + "checkSchematic($3, $0);" + + "if(!hasSchematic) {" + + "return 0.0f" + + "}"; + Util.insertBeforeDeclared(thisClass, ctCreationEntry, "getDifficultyFor", replace); + } catch (NotFoundException e) { + e.printStackTrace(); + } + } + + private static void initSchematicList() { + // Add items to schematic list here. These items will require the player to have read a schematic before + schematics.add(WandPermaFrost.templateId); + } + + /** + * Checks if a creationentry requires a schematic to be learned first. If it requires one that isnt learned, return false. Else, return true. + * @param performer performer of the craft + * @param ce creation entry being tested + * @return schematic needed + */ + public static boolean checkSchematic(Creature performer, CreationEntry ce) { + int product = ce.getObjectCreated(); + if(schematics.contains(product)) { + try { + Connection dbcon = ModSupportDb.getModSupportDb(); + PreparedStatement ps = dbcon.prepareStatement("SELECT * FROM SchematicMap"); + ResultSet rs = ps.executeQuery(); + while (rs.next()) { + if (rs.getString("name").equals(performer.getName()) && rs.getInt("templateid") == product) { + return true; + } + } + } catch (SQLException e) { + throw new RuntimeException(e); + } + return false; + } + return true; + } + +}