From df5c60737581d1c7400e5805e31557da0dd45716 Mon Sep 17 00:00:00 2001
From: MagicBot <MagicBot@magicbane.com>
Date: Sun, 10 Mar 2024 13:34:24 -0400
Subject: [PATCH] Refactor item_type

---
 src/engine/Enum.java                          | 129 ++++++------------
 src/engine/db/handlers/dbItemHandler.java     |   4 +-
 src/engine/devcmd/cmds/SimulateBootyCmd.java  |   4 +-
 src/engine/gameManager/CombatManager.java     |   8 +-
 src/engine/gameManager/LootManager.java       |   4 +-
 src/engine/gameManager/PowersManager.java     |   6 +-
 src/engine/net/client/ClientMessagePump.java  |  12 +-
 .../handlers/ActivateNPCMsgHandler.java       |   4 +-
 .../GuildCreationFinalizeHandler.java         |   9 +-
 .../handlers/ItemProductionMsgHandler.java    |  14 +-
 .../handlers/ObjectActionMsgHandler.java      |  33 ++---
 .../net/client/msg/BuyFromNPCWindowMsg.java   |   2 +-
 .../net/client/msg/UpdateInventoryMsg.java    |   2 +-
 src/engine/net/client/msg/UseCharterMsg.java  |   2 +-
 src/engine/objects/CharacterItemManager.java  |  43 +++---
 src/engine/objects/Item.java                  |   6 +-
 src/engine/objects/ItemBase.java              |  23 +---
 src/engine/objects/ItemFactory.java           |   4 +-
 src/engine/objects/Mob.java                   |   4 +-
 src/engine/objects/MobLoot.java               |   5 +-
 src/engine/objects/NPC.java                   |   4 +-
 src/engine/objects/PlayerCharacter.java       |  14 +-
 src/engine/objects/Warehouse.java             |   2 +-
 .../powers/poweractions/StealPowerAction.java |   2 +-
 24 files changed, 137 insertions(+), 203 deletions(-)

diff --git a/src/engine/Enum.java b/src/engine/Enum.java
index 3b6ebcc3..33280cf9 100644
--- a/src/engine/Enum.java
+++ b/src/engine/Enum.java
@@ -15,7 +15,7 @@ import engine.gameManager.ZoneManager;
 import engine.math.Vector2f;
 import engine.math.Vector3fImmutable;
 import engine.objects.AbstractCharacter;
-import engine.objects.ItemBase;
+import engine.objects.Item;
 import engine.objects.Shrine;
 import engine.objects.Zone;
 import engine.powers.EffectsBase;
@@ -560,94 +560,47 @@ public class Enum {
         }
     }
 
-
     // Enum for ItemBase flags
 
     public enum ItemType {
-        UNKNOWN(0),
-        WEAPON(1),
-        ARMOR(2),
-        BASE(3),
-        GOLD(4),
-        SCROLL(5),
-        BOOK(6),
-        WAND(7),
-        POTION(8),
-        KEY(9),
-        CHARTER(10),
-        GUILDTREE(11),
-        SOUNDSOURCE(12),
-        JEWELRY(13),
-        CONTAINER(14),
-        FOUNTAIN(15),
-        FOOD(16),
-        DRINKCONTAINER(17),
-        MAPMARKER(18),
-        DEED(19),
-        EMPLOYMENTCONTRACT(20),
-        PETTOTEM(21),
-        SLAVECOLLAR(22),
-        BLANKKEY(23),
-        WARRANT(24),
-        FURNITUREDEED(25),
-        TENT(26),
-        REAGENT(27),
-        DEVICE(28),
-        FORMULA(29),
-        BUCKET(30),
-        TREASURE(31),
-        RUNE(32),
-        OFFERING(33),
-        RESOURCE(34),
-        REALMCHARTER(35),
-        // old itembase support
-        DECORATION(0),
-        HAIR(3),
-        COMMANDROD(7),
-        TEARS(8),
-        GUILDCHARTER(10),
-        WINE(16),
-        ALEJUG(17),
-        CONTRACT(20),
-        PET(21),
-        FURNITURE(25),
-        BEDROLL(26),
-        FARMABLE(27),
-        WATERBUCKET(30),
-        GIFT(31);
-
-        private final static HashMap<Integer, ItemType> _typeLookup = new HashMap<>();
-        private final int _value;
-
-        ItemType(int value) {
-            this._value = value;
-        }
-
-        public static ItemType getByValue(int value) {
-
-            ItemType outType = ItemType.DECORATION;
-
-            if (_typeLookup.isEmpty()) {
-
-                for (ItemType itemType : ItemType.values()) {
-                    _typeLookup.put(itemType._value, itemType);
-                }
-            }
-
-            if (_typeLookup.containsKey(value))
-                outType = _typeLookup.get(value);
-
-            return outType;
-        }
-
-        /**
-         * @return the _value
-         */
-        public int getValue() {
-            return _value;
-        }
-
+        DECORATION,
+        WEAPON,
+        ARMOR,
+        BASE,
+        GOLD,
+        SCROLL,
+        BOOK,
+        WAND,
+        POTION,
+        KEY,
+        CHARTER,
+        GUILDTREE,
+        SOUNDSOURCE,
+        JEWELRY,
+        CONTAINER,
+        FOUNTAIN,
+        FOOD,
+        DRINKCONTAINER,
+        MAPMARKER,
+        DEED,
+        EMPLOYMENTCONTRACT,
+        PETTOTEM,
+        SLAVECOLLAR,
+        BLANKKEY,
+        WARRANT,
+        FURNITUREDEED,
+        TENT,
+        REAGENT,
+        DEVICE,
+        FORMULA,
+        BUCKET,
+        TREASURE,
+        RUNE,
+        OFFERING,
+        RESOURCE,
+        REALMCHARTER;
     }
+
     // Enum to derive effects for active spires from blueprintUUID
 
     public enum SpireType {
@@ -2493,16 +2446,16 @@ public class Enum {
             this.sexRequired = sexRequired;
         }
 
-        public static GuildCharterType getGuildTypeFromCharter(ItemBase itemBase) {
+        public static GuildCharterType getGuildTypeFromCharter(Item charter) {
 
             GuildCharterType charterType;
 
             // Must be a valid charter object
 
-            if (itemBase.getType().equals(ItemType.GUILDCHARTER) == false)
+            if (charter.template.item_type.equals(ItemType.CHARTER) == false)
                 return GuildCharterType.NONE;    //No guild Type
 
-            switch (itemBase.getUUID()) {
+            switch (charter.template.template_id) {
 
                 case 559:
                     charterType = GuildCharterType.CATHEDRAL;
diff --git a/src/engine/db/handlers/dbItemHandler.java b/src/engine/db/handlers/dbItemHandler.java
index d06fe9b2..a9900971 100644
--- a/src/engine/db/handlers/dbItemHandler.java
+++ b/src/engine/db/handlers/dbItemHandler.java
@@ -294,7 +294,7 @@ public class dbItemHandler extends dbHandlerBase {
 
         for (Item item : inventory) {
 
-            if (item.getItemBase().getType().equals(ItemType.GOLD))
+            if (item.template.item_type.equals(ItemType.GOLD))
                 continue;
 
             try (Connection connection = DbManager.getConnection();
@@ -438,7 +438,7 @@ public class dbItemHandler extends dbHandlerBase {
      */
     public boolean UPDATE_GOLD(final Item item, int newValue, int oldValue) {
 
-        if (!item.getItemBase().getType().equals(ItemType.GOLD))
+        if (!item.template.item_type.equals(ItemType.GOLD))
             return false;
 
         try (Connection connection = DbManager.getConnection();
diff --git a/src/engine/devcmd/cmds/SimulateBootyCmd.java b/src/engine/devcmd/cmds/SimulateBootyCmd.java
index 656f3a8f..24a78301 100644
--- a/src/engine/devcmd/cmds/SimulateBootyCmd.java
+++ b/src/engine/devcmd/cmds/SimulateBootyCmd.java
@@ -57,8 +57,8 @@ public class SimulateBootyCmd extends AbstractDevCmd {
             try {
                 mob.loadInventory();
                 for (Item lootItem : mob.getCharItemManager().getInventory()) {
-                    switch (lootItem.getItemBase().getType()) {
-                        case CONTRACT: //CONTRACT
+                    switch (lootItem.template.item_type) {
+                        case EMPLOYMENTCONTRACT: //CONTRACT
                             Contracts.add(lootItem);
                             break;
                         case OFFERING: //OFFERING
diff --git a/src/engine/gameManager/CombatManager.java b/src/engine/gameManager/CombatManager.java
index 12776431..9c8d607f 100644
--- a/src/engine/gameManager/CombatManager.java
+++ b/src/engine/gameManager/CombatManager.java
@@ -51,7 +51,7 @@ public enum CombatManager {
         // if you carry something in the offhand thats a weapon you get to swing it
 
         if (weaponOff != null)
-            if (weaponOff.getItemBase().getType().equals(ItemType.WEAPON))
+            if (weaponOff.template.item_type.equals(ItemType.WEAPON))
                 swingOffhand = true;
 
         // if you carry  nothing in either hand you get to swing your offhand
@@ -320,7 +320,7 @@ public enum CombatManager {
             else {
                 ItemBase ib = weapon.getItemBase();
 
-                if (ib == null || !ib.getType().equals(ItemType.WEAPON))
+                if (ib == null || !weapon.template.item_type.equals(ItemType.WEAPON))
                     isWeapon = false;
                 else
                     wb = ib;
@@ -338,7 +338,7 @@ public enum CombatManager {
                     if (weaponOff != null) {
                         ItemBase ib = weaponOff.getItemBase();
 
-                        if (ib == null || !ib.getType().equals(ItemType.WEAPON))
+                        if (ib == null || !weaponOff.template.item_type.equals(ItemType.WEAPON))
                             hasNoWeapon = true;
                         else
                             return 1; //no need to attack with this hand
@@ -904,7 +904,7 @@ public enum CombatManager {
         if (ib == null)
             return false;
 
-        if (ib.getType().equals(ItemType.WEAPON) == false)
+        if (item.template.item_type.equals(ItemType.WEAPON) == false)
             return false;
 
         return ib.getRange() > MBServerStatics.RANGED_WEAPON_RANGE;
diff --git a/src/engine/gameManager/LootManager.java b/src/engine/gameManager/LootManager.java
index c75c935d..216e859c 100644
--- a/src/engine/gameManager/LootManager.java
+++ b/src/engine/gameManager/LootManager.java
@@ -175,14 +175,12 @@ public enum LootManager {
         if (itemUUID == 0)
             return null;
 
-        if (ItemBase.getItemBase(itemUUID).getType().ordinal() == Enum.ItemType.RESOURCE.ordinal()) {
+        if (ItemTemplate.itemTemplates.get(itemUUID).item_type.equals(Enum.ItemType.RESOURCE)) {
             int amount = ThreadLocalRandom.current().nextInt(tableRow.minSpawn, tableRow.maxSpawn + 1);
             return new MobLoot(mob, ItemBase.getItemBase(itemUUID), amount, false);
         }
 
         outItem = new MobLoot(mob, ItemBase.getItemBase(itemUUID), false);
-        Enum.ItemType outType = outItem.getItemBase().getType();
-
 
         if(selectedRow.pModTable != 0){
             try {
diff --git a/src/engine/gameManager/PowersManager.java b/src/engine/gameManager/PowersManager.java
index d55d04b0..22e4acc2 100644
--- a/src/engine/gameManager/PowersManager.java
+++ b/src/engine/gameManager/PowersManager.java
@@ -2502,12 +2502,12 @@ public enum PowersManager {
             if (pb.targetItem())
                 return true;
                 // TODO add these checks later
-            else if (pb.targetArmor() && item.getItemBase().getType().equals(ItemType.ARMOR))
+            else if (pb.targetArmor() && item.template.item_type.equals(ItemType.ARMOR))
                 return true;
-            else if (pb.targetJewelry() && item.getItemBase().getType().equals(ItemType.JEWELRY))
+            else if (pb.targetJewelry() && item.template.item_type.equals(ItemType.JEWELRY))
                 return true;
             else
-                return pb.targetWeapon() && item.getItemBase().getType().equals(ItemType.WEAPON);
+                return pb.targetWeapon() && item.template.item_type.equals(ItemType.WEAPON);
         } // How did we get here? all valid targets have been covered
         else
             return false;
diff --git a/src/engine/net/client/ClientMessagePump.java b/src/engine/net/client/ClientMessagePump.java
index 98642c7b..32b6ca8f 100644
--- a/src/engine/net/client/ClientMessagePump.java
+++ b/src/engine/net/client/ClientMessagePump.java
@@ -219,7 +219,7 @@ public class ClientMessagePump implements NetMsgHandler {
             return;
 
         if (item.containerType == ItemContainerType.INVENTORY && itemManager.isBankOpen())
-            if (item.getItemBase().getType().equals(engine.Enum.ItemType.GOLD)) {
+            if (item.template.item_type.equals(engine.Enum.ItemType.GOLD)) {
                 if (!itemManager.moveGoldToBank(item, msg.getNumItems()))
                     return;
                 UpdateGoldMsg goldMes = new UpdateGoldMsg(player);
@@ -274,7 +274,7 @@ public class ClientMessagePump implements NetMsgHandler {
         if (item.containerType == ItemContainerType.BANK && itemManager.isBankOpen() == false)
             return;
 
-        if (item.getItemBase().getType().equals(engine.Enum.ItemType.GOLD)) {
+        if (item.template.item_type.equals(engine.Enum.ItemType.GOLD)) {
 
             if (!itemManager.moveGoldToInventory(item, msg.getNumItems()))
                 return;
@@ -738,7 +738,7 @@ public class ClientMessagePump implements NetMsgHandler {
                             return;
 
 
-                        if (item.getItemBase().getType().equals(engine.Enum.ItemType.GOLD)) {
+                        if (item.template.item_type.equals(engine.Enum.ItemType.GOLD)) {
                             // this is done to prevent the temporary goldItem item
                             // (from the mob) from appearing in player's inventory.
                             // It also updates the goldItem quantity display
@@ -769,7 +769,7 @@ public class ClientMessagePump implements NetMsgHandler {
                         //TODO send group loot message if player is grouped and visible
                         Group group = GroupManager.getGroup(player);
 
-                        if (group != null && group.getSplitGold() && (item.getItemBase().getType().equals(engine.Enum.ItemType.GOLD) == false)) {
+                        if (group != null && group.getSplitGold() && (item.template.item_type.equals(engine.Enum.ItemType.GOLD) == false)) {
                             String name = item.getName();
                             String text = player.getFirstName() + " has looted " + name + '.';
                             ChatManager.chatGroupInfoCanSee(player, text);
@@ -787,7 +787,7 @@ public class ClientMessagePump implements NetMsgHandler {
                     return;
                 }
 
-                if (item.getItemBase().getType().equals(engine.Enum.ItemType.GOLD)) {
+                if (item.template.item_type.equals(engine.Enum.ItemType.GOLD)) {
                     // this is done to prevent the temporary goldItem item
                     // (from the mob) from appearing in player's inventory.
                     // It also updates the goldItem quantity display
@@ -826,7 +826,7 @@ public class ClientMessagePump implements NetMsgHandler {
                 //TODO send group loot message if player is grouped and visible
                 Group group = GroupManager.getGroup(player);
 
-                if (group != null && group.getSplitGold() && (item.getItemBase().getType().equals(engine.Enum.ItemType.GOLD) == false)) {
+                if (group != null && group.getSplitGold() && (item.template.item_type.equals(engine.Enum.ItemType.GOLD) == false)) {
                     String name = item.getName();
                     String text = player.getFirstName() + " has looted " + name + '.';
                     ChatManager.chatGroupInfoCanSee(player, text);
diff --git a/src/engine/net/client/handlers/ActivateNPCMsgHandler.java b/src/engine/net/client/handlers/ActivateNPCMsgHandler.java
index 0d2897bf..a7ea75c6 100644
--- a/src/engine/net/client/handlers/ActivateNPCMsgHandler.java
+++ b/src/engine/net/client/handlers/ActivateNPCMsgHandler.java
@@ -48,9 +48,9 @@ public class ActivateNPCMsgHandler extends AbstractClientMsgHandler {
         // Filter hirelings by slot type
 
         for (Item hirelings : player.getInventory()) {
-            if (hirelings.getItemBase().getType().equals(ItemType.CONTRACT)) {
+            if (hirelings.template.item_type.equals(ItemType.EMPLOYMENTCONTRACT)) {
 
-                contract = DbManager.ContractQueries.GET_CONTRACT(hirelings.getItemBase().getUUID());
+                contract = DbManager.ContractQueries.GET_CONTRACT(hirelings.templsteID);
 
                 if (contract == null)
                     continue;
diff --git a/src/engine/net/client/handlers/GuildCreationFinalizeHandler.java b/src/engine/net/client/handlers/GuildCreationFinalizeHandler.java
index 46663378..147e0381 100644
--- a/src/engine/net/client/handlers/GuildCreationFinalizeHandler.java
+++ b/src/engine/net/client/handlers/GuildCreationFinalizeHandler.java
@@ -28,7 +28,6 @@ import engine.net.client.msg.guild.GuildCreationFinalizeMsg;
 import engine.net.client.msg.guild.GuildInfoMsg;
 import engine.objects.Guild;
 import engine.objects.Item;
-import engine.objects.ItemBase;
 import engine.objects.PlayerCharacter;
 import engine.util.StringUtils;
 
@@ -46,7 +45,7 @@ public class GuildCreationFinalizeHandler extends AbstractClientMsgHandler {
         Enum.GuildCharterType charterType;
         Guild newGuild;
         Guild playerGuild;
-        ItemBase itemBase;
+
         Item charter;
         Dispatch dispatch;
 
@@ -69,16 +68,14 @@ public class GuildCreationFinalizeHandler extends AbstractClientMsgHandler {
             return true;
         }
 
-        itemBase = charter.getItemBase();
-
         // Item must be a valid charterType (type 10 in db)
 
-        if (itemBase == null || (itemBase.getType().equals(ItemType.GUILDCHARTER) == false)) {
+        if (charter == null || (charter.template.item_type.equals(ItemType.CHARTER) == false)) {
             ErrorPopupMsg.sendErrorPopup(player, GuildManager.NO_CHARTER_FOUND);
             return true;
         }
 
-        charterType = Enum.GuildCharterType.getGuildTypeFromCharter(itemBase);
+        charterType = Enum.GuildCharterType.getGuildTypeFromCharter(charter);
 
         if (charterType == null) {
             ErrorPopupMsg.sendErrorPopup(player, GuildManager.NO_CHARTER_FOUND);
diff --git a/src/engine/net/client/handlers/ItemProductionMsgHandler.java b/src/engine/net/client/handlers/ItemProductionMsgHandler.java
index aca20b90..a1a0a40a 100644
--- a/src/engine/net/client/handlers/ItemProductionMsgHandler.java
+++ b/src/engine/net/client/handlers/ItemProductionMsgHandler.java
@@ -126,7 +126,7 @@ public class ItemProductionMsgHandler extends AbstractClientMsgHandler {
                 if (targetItem == null)
                     return;
 
-                if (targetItem.getItemBase().getType() == ItemType.GOLD)
+                if (targetItem.template.item_type.equals(ItemType.GOLD))
                     return;
 
                 if (!vendor.getCharItemManager().hasRoomInventory(targetItem.template.item_wt)) {
@@ -266,7 +266,7 @@ public class ItemProductionMsgHandler extends AbstractClientMsgHandler {
                     if (targetItem == null)
                         continue;
 
-                    if (targetItem.getItemBase().getType() == ItemType.GOLD)
+                    if (targetItem.template.item_type.equals(ItemType.GOLD))
                         return;
 
                     if (!vendor.getCharItemManager().doesCharOwnThisItem(targetItem.getObjectUUID()))
@@ -281,13 +281,13 @@ public class ItemProductionMsgHandler extends AbstractClientMsgHandler {
                         break;
                     }
 
-                    switch (targetItem.getItemBase().getType()) {
-                        case CONTRACT:
-                        case GUILDCHARTER:
+                    switch (targetItem.template.item_type) {
+                        case EMPLOYMENTCONTRACT:
+                        case CHARTER:
                         case DEED:
                         case REALMCHARTER:
                         case SCROLL:
-                        case TEARS:
+                        case POTION:
                             itemValue = 0;
                             continue;
                     }
@@ -402,7 +402,7 @@ public class ItemProductionMsgHandler extends AbstractClientMsgHandler {
                 return;
 
 
-            if (targetItem.getItemBase().getType() == ItemType.GOLD)
+            if (targetItem.template.item_type.equals(ItemType.GOLD))
                 return;
             if (vendor.getCharItemManager().inventoryContains(targetItem) == false)
                 return;
diff --git a/src/engine/net/client/handlers/ObjectActionMsgHandler.java b/src/engine/net/client/handlers/ObjectActionMsgHandler.java
index c70c4814..8470bec2 100644
--- a/src/engine/net/client/handlers/ObjectActionMsgHandler.java
+++ b/src/engine/net/client/handlers/ObjectActionMsgHandler.java
@@ -315,18 +315,13 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler {
 
             if (itemMan.doesCharOwnThisItem(item.getObjectUUID())) {
 
-                if (ib.isConsumable() || ib.getType() == ItemType.FARMABLE) {
+                if (ib.isConsumable() || item.template.item_type.equals(ItemType.REAGENT)) {
 
-                    int uuid = ib.getUUID();
-                    int type = ib.getType().getValue();
+                    int uuid = item.templsteID;
 
-                    switch (type) {
-                        case 27: //Mithril repair
-                            break;
-                        case 10: //charters
-                            //don't think they're handled here?
-                            break;
-                        case 19: //buildings
+                    switch (item.template.item_type) {
+
+                        case DEED: //buildings
                             //Call add building screen here, ib.getUseID() get's building ID
 
                             //if inside player city, center loc on tol. otherwise center on player.
@@ -352,10 +347,10 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler {
 
                             //itemMan.consume(item); //temporary fix for dupe.. TODO Make Item Unusable after This message is sent.
                             break;
-                        case 25: //furniture
+                        case FURNITUREDEED: //furniture
                             //Call add furniture screen here. ib.getUseID() get's furniture ID
                             break;
-                        case 33:
+                        case OFFERING:
                             long shrineCompID = comps.get(1);
                             Building shrineBuilding = BuildingManager.getBuilding((int) shrineCompID);
                             if (shrineBuilding == null) {
@@ -381,7 +376,7 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler {
                             }
                             break;
 
-                        case 35:
+                        case REALMCHARTER:
                             int charterType = 0;
                             switch (uuid) {
                                 case 910020:
@@ -398,7 +393,7 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler {
                                 itemMan.consume(item);
                             }
                             break;
-                        case 7: //rod of command
+                        case WAND: //rod of command
                             long compID = comps.get(1);
 
                             int objectType = AbstractWorldObject.extractTypeID(compID).ordinal();
@@ -422,7 +417,7 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler {
                             }
                             break;
                         //ANNIVERSERY GIFT
-                        case 31:
+                        case TREASURE:
                             // *** Disabled for now: Needs bootyset created
 
                             //if (ib.getUUID() == 971012) {
@@ -440,13 +435,13 @@ public class ObjectActionMsgHandler extends AbstractClientMsgHandler {
                             //    break;
                             //}
 
-                            LootManager.peddleFate(player,item);
+                            LootManager.peddleFate(player, item);
                             break;
 
-                        case 30: //water bucket
-                        case 8: //potions, tears of saedron
+                        case BUCKET: //water bucket
+                        case POTION: //potions, tears of saedron
 
-                        case 5: //runes, petition, warrant, scrolls
+                        case SCROLL: //runes, petition, warrant, scrolls
                             if (uuid > 3000 && uuid < 3050) { //Discipline Runes
                                 if (ApplyRuneMsg.applyRune(uuid, origin, player)) {
                                     itemMan.consume(item);
diff --git a/src/engine/net/client/msg/BuyFromNPCWindowMsg.java b/src/engine/net/client/msg/BuyFromNPCWindowMsg.java
index 673d22d8..d41619f1 100644
--- a/src/engine/net/client/msg/BuyFromNPCWindowMsg.java
+++ b/src/engine/net/client/msg/BuyFromNPCWindowMsg.java
@@ -162,7 +162,7 @@ public class BuyFromNPCWindowMsg extends ClientNetMsg {
             for (Item item : inventory) {
                 if (item.getOwnerID() != ownerID)
                     continue;
-                if (item.getItemBase().getType().equals(ItemType.GOLD)) {
+                if (item.template.item_type.equals(ItemType.GOLD)) {
                     if (item.getNumOfItems() == 0)
                         continue;
                 }
diff --git a/src/engine/net/client/msg/UpdateInventoryMsg.java b/src/engine/net/client/msg/UpdateInventoryMsg.java
index 5479f14d..da54bc71 100644
--- a/src/engine/net/client/msg/UpdateInventoryMsg.java
+++ b/src/engine/net/client/msg/UpdateInventoryMsg.java
@@ -54,7 +54,7 @@ public class UpdateInventoryMsg extends ClientNetMsg {
 
 
         for (Item item : list) {
-            if (item.getItemBase().getType().equals(ItemType.GOLD)) {
+            if (item.template.item_type.equals(ItemType.GOLD)) {
                 if (item.getNumOfItems() == 0)
                     continue;
             }
diff --git a/src/engine/net/client/msg/UseCharterMsg.java b/src/engine/net/client/msg/UseCharterMsg.java
index e31d2522..4f2cadac 100644
--- a/src/engine/net/client/msg/UseCharterMsg.java
+++ b/src/engine/net/client/msg/UseCharterMsg.java
@@ -63,7 +63,7 @@ public class UseCharterMsg extends ClientNetMsg {
 
         if (close) {
             for (Item i : player.getInventory()) {
-                if (i.getItemBase().getType().equals(ItemType.GUILDCHARTER)) {
+                if (i.template.item_type.equals(ItemType.CHARTER)) {
                     charterUUID = i.getObjectUUID();
                     break;
                 }
diff --git a/src/engine/objects/CharacterItemManager.java b/src/engine/objects/CharacterItemManager.java
index 9f2cde2d..3dae6fca 100644
--- a/src/engine/objects/CharacterItemManager.java
+++ b/src/engine/objects/CharacterItemManager.java
@@ -191,19 +191,19 @@ public class CharacterItemManager {
                     }
                     break;
                 case BANK:
-                    if (i.getItemBase().getType().equals(ItemType.GOLD))
+                    if (i.template.item_type.equals(ItemType.GOLD))
                         this.goldBank = i;
                     else if (this.bank.contains(i) == false)
                         this.bank.add(i);
                     break;
                 case INVENTORY:
-                    if (i.getItemBase().getType().equals(ItemType.GOLD))
+                    if (i.template.item_type.equals(ItemType.GOLD))
                         this.goldInventory = i;
                     else if (this.inventory.contains(i) == false)
                         this.inventory.add(i);
                     break;
                 case VAULT:
-                    if (i.getItemBase().getType().equals(ItemType.GOLD))
+                    if (i.template.item_type.equals(ItemType.GOLD))
                         this.goldVault = i;
                     else if (this.vault.contains(i) == false)
                         this.vault.add(i);
@@ -238,13 +238,13 @@ public class CharacterItemManager {
                         this.equipped.put(i.equipSlot, i);
                     break;
                 case BANK:
-                    if (i.getItemBase().getType().equals(ItemType.GOLD))
+                    if (i.template.item_type.equals(ItemType.GOLD))
                         this.goldBank = i;
                     else if (this.bank.contains(i) == false)
                         this.bank.add(i);
                     break;
                 case INVENTORY:
-                    if (i.getItemBase().getType().equals(ItemType.GOLD))
+                    if (i.template.item_type.equals(ItemType.GOLD))
                         this.goldInventory = i;
                     else if (this.inventory.contains(i) == false)
                         this.inventory.add(i);
@@ -915,7 +915,7 @@ public class CharacterItemManager {
         if (i == null)
             return false;
 
-        if (i.getItemBase().getType().equals(ItemType.GOLD)) {
+        if (i.template.item_type.equals(ItemType.GOLD)) {
             if (this.getGoldInventory() != null) {
                 if (i.getObjectUUID() == this.getGoldInventory().getObjectUUID())
                     this.goldInventory = null;
@@ -945,7 +945,7 @@ public class CharacterItemManager {
     }
 
     private synchronized boolean junk(Item i, boolean updateInventory) {
-        if (i.getItemBase().getType().equals(ItemType.GOLD)) {
+        if (i.template.item_type.equals(ItemType.GOLD)) {
             if (this.getGoldInventory().getObjectUUID() == i.getObjectUUID())
                 if (DbManager.ItemQueries.UPDATE_GOLD(i, 0)) {
                     this.getGoldInventory().setNumOfItems(0);
@@ -1000,8 +1000,7 @@ public class CharacterItemManager {
 
             if (equippedContains(item)) {
                 fromEquip = true;
-                ItemBase ib = item.getItemBase();
-                if (ib != null && ib.getType().equals(ItemType.GOLD))
+                if (item.template.item_type.equals(ItemType.GOLD))
                     this.absCharacter.cancelOnUnEquip();
             }
 
@@ -1211,7 +1210,7 @@ public class CharacterItemManager {
 
     // This removes ingame item from inventory for loot.
     private synchronized boolean removeItemFromInventory(Item i) {
-        if (i.getItemBase().getType().equals(ItemType.GOLD)) {
+        if (i.template.item_type.equals(ItemType.GOLD)) {
             if (i.getObjectUUID() != this.getGoldInventory().getObjectUUID())
                 return false;
             if (!DbManager.ItemQueries.UPDATE_GOLD(this.goldInventory, 0)) {
@@ -1234,7 +1233,7 @@ public class CharacterItemManager {
 
     // This adds item to inventory for loot. Validity checks already handled
     public synchronized boolean addItemToInventory(Item i) {
-        if (i.getItemBase().getType().equals(ItemType.GOLD))
+        if (i.template.item_type.equals(ItemType.GOLD))
             if (this.absCharacter.getObjectType() == GameObjectType.Mob) {
                 if (this.goldInventory == null)
                     loadGoldItems();
@@ -1261,7 +1260,7 @@ public class CharacterItemManager {
 
     //called for adding gold of a specified amount
     public synchronized boolean addItemToInventory(Item i, int amount) {
-        if (i.getItemBase().getType().equals(ItemType.GOLD))
+        if (i.template.item_type.equals(ItemType.GOLD))
             return DbManager.ItemQueries.UPDATE_GOLD(this.getGoldInventory(), this.goldInventory.getNumOfItems() + amount);
         return false;
     }
@@ -1623,9 +1622,9 @@ public class CharacterItemManager {
         synchronized (lockFirst) {
             synchronized (lockSecond) {
                 // make sure current player has item in inventory
-                if (lootItem.getItemBase().getType().equals(ItemType.GOLD) && lootItem.getObjectUUID() != this.getGoldInventory().getObjectUUID() && !(this.absCharacter.getObjectType().equals(GameObjectType.Mob)))
+                if (lootItem.template.item_type.equals(ItemType.GOLD) && lootItem.getObjectUUID() != this.getGoldInventory().getObjectUUID() && !(this.absCharacter.getObjectType().equals(GameObjectType.Mob)))
                     return null;
-                else if (!this.inventory.contains(lootItem) && !this.getEquippedList().contains(lootItem) && !lootItem.getItemBase().getType().equals(ItemType.GOLD))
+                else if (!this.inventory.contains(lootItem) && !this.getEquippedList().contains(lootItem) && !lootItem.template.item_type.equals(ItemType.GOLD))
                     return null;
 
                 // get weight of item
@@ -1636,10 +1635,10 @@ public class CharacterItemManager {
                 int weight = lootItem.template.item_wt;
 
                 // make sure lootingPlayer has room for item
-                if (!lootItem.getItemBase().getType().equals(ItemType.GOLD) && !looterItems.hasRoomInventory(weight))
+                if (!lootItem.template.item_type.equals(ItemType.GOLD) && !looterItems.hasRoomInventory(weight))
                     return null;
 
-                if (lootItem.getItemBase().getType().equals(ItemType.GOLD))
+                if (lootItem.template.item_type.equals(ItemType.GOLD))
                     if (amount != -1) { //from steal
                         int total = lootItem.getNumOfItems();
                         amount = (amount > total) ? total : amount;
@@ -1702,25 +1701,25 @@ public class CharacterItemManager {
      * Delegates
      */
     public synchronized boolean bankContains(Item i) {
-        if (i.getItemBase().getType().equals(ItemType.GOLD))
+        if (i.template.item_type.equals(ItemType.GOLD))
             return (this.getGoldBank() != null && this.goldBank.getObjectUUID() == i.getObjectUUID());
         return bank.contains(i);
     }
 
     public synchronized boolean inventoryContains(Item i) {
-        if (i.getItemBase().getType().equals(ItemType.GOLD))
+        if (i.template.item_type.equals(ItemType.GOLD))
             return (this.getGoldInventory() != null && this.goldInventory.getObjectUUID() == i.getObjectUUID());
         return inventory.contains(i);
     }
 
     public synchronized boolean forgeContains(Item i, NPC vendor) {
-        if (i.getItemBase().getType().equals(ItemType.GOLD))
+        if (i.template.item_type.equals(ItemType.GOLD))
             return (this.getGoldInventory() != null && this.goldInventory.getObjectUUID() == i.getObjectUUID());
         return vendor.getRolling().contains(i);
     }
 
     public synchronized boolean vaultContains(Item i) {
-        if (i.getItemBase().getType().equals(ItemType.GOLD))
+        if (i.template.item_type.equals(ItemType.GOLD))
             return (this.getGoldVault() != null && this.goldVault.getObjectUUID() == i.getObjectUUID());
         return this.account.getVault().contains(i);
     }
@@ -2004,13 +2003,13 @@ public class CharacterItemManager {
                     item.zeroItem();
                     item.containerType = Enum.ItemContainerType.INVENTORY;
 
-                    if (item.getItemBase().getType().equals(ItemType.GOLD))
+                    if (item.template.item_type.equals(ItemType.GOLD))
                         //only add gold item once
                         if (!corpse.hasGold())
                             corpse.setHasGold(true);
                     newInventory.add(item);
                 } else //item
-                    if (item.getItemBase().getType().equals(ItemType.GOLD)) {
+                    if (item.template.item_type.equals(ItemType.GOLD)) {
                         int amt = item.getNumOfItems();
                         item.setNumOfItems(0);
                         MobLoot ml = new MobLoot(this.absCharacter, amt);
diff --git a/src/engine/objects/Item.java b/src/engine/objects/Item.java
index 5458f521..24838310 100644
--- a/src/engine/objects/Item.java
+++ b/src/engine/objects/Item.java
@@ -280,7 +280,7 @@ public class Item extends AbstractWorldObject {
         writer.put((byte) 0);
 
 
-        if (item.getItemBase().getType().getValue() != 20) {
+        if (item.template.item_type.equals(ItemType.EMPLOYMENTCONTRACT) == false) {
             writer.putShort((short) 0);
             return;
         }
@@ -459,7 +459,7 @@ public class Item extends AbstractWorldObject {
         int serialized = 0;
         for (Item item : list) {
 
-            if (item.getItemBase().getType().equals(ItemType.GOLD))
+            if (item.template.item_type.equals(ItemType.GOLD))
                 if (item.numberOfItems == 0)
                     continue;
             try {
@@ -493,7 +493,7 @@ public class Item extends AbstractWorldObject {
         int serialized = 0;
         for (Item item : list) {
 
-            if (item.getItemBase().getType().equals(ItemType.GOLD))
+            if (item.template.item_type.equals(ItemType.GOLD))
                 if (item.numberOfItems == 0)
                     continue;
             try {
diff --git a/src/engine/objects/ItemBase.java b/src/engine/objects/ItemBase.java
index 36d9efed..e4776ceb 100644
--- a/src/engine/objects/ItemBase.java
+++ b/src/engine/objects/ItemBase.java
@@ -30,8 +30,6 @@ public class ItemBase {
     private static final ArrayList<ItemBase> _resourceList = new ArrayList<>();
     public final int uuid;
 
-//requirements/restrictions
-    private final ItemType type;
     private final int modTable;
     private final int useID;
     private int hashID;
@@ -61,8 +59,6 @@ public class ItemBase {
     public ItemBase(ResultSet rs) throws SQLException {
 
         this.uuid = rs.getInt("ID");
-
-        this.type = ItemType.valueOf(rs.getString("Type"));
         this.useID = rs.getInt("useID");
         this.useAmount = rs.getByte("useAmount");
         this.modTable = rs.getInt("modTable");
@@ -84,18 +80,17 @@ public class ItemBase {
 
         this.twoHanded = (rs.getInt("twoHanded") == 1);
 
-        switch (this.type) {
+        switch (ItemTemplate.itemTemplates.get(this.getUUID()).item_type) {
             case RUNE:
             case SCROLL:
-            case COMMANDROD:
+            case WAND:
             case POTION:
-            case TEARS:
-            case GUILDCHARTER:
+            case CHARTER:
             case DEED:
-            case CONTRACT:
-            case WATERBUCKET:
+            case EMPLOYMENTCONTRACT:
+            case BUCKET:
             case REALMCHARTER:
-            case GIFT:
+            case TREASURE:
                 this.isConsumable = true;
                 break;
             case OFFERING:
@@ -118,7 +113,7 @@ public class ItemBase {
 
         _itemBaseByUUID.put(itemBase.uuid, itemBase);
 
-        if (itemBase.type.equals(ItemType.RESOURCE))
+        if (ItemTemplate.itemTemplates.get(itemBase.uuid).item_type.equals(ItemType.RESOURCE))
             _resourceList.add(itemBase);
 
         ItemTemplate template = ItemTemplate.itemTemplates.get(itemBase.uuid);
@@ -225,10 +220,6 @@ public class ItemBase {
 
     }
 
-    public ItemType getType() {
-        return this.type;
-    }
-
     public int getUseID() {
         return this.useID;
     }
diff --git a/src/engine/objects/ItemFactory.java b/src/engine/objects/ItemFactory.java
index b23ae38e..ca048ea2 100644
--- a/src/engine/objects/ItemFactory.java
+++ b/src/engine/objects/ItemFactory.java
@@ -220,7 +220,7 @@ public class ItemFactory {
             int suffixCost = 0;
 
 
-            if (ib.getType() == ItemType.WEAPON && ib.getPercentRequired() == 110) {
+            if (template.item_type.equals(ItemType.WEAPON) && ib.getPercentRequired() == 110) {
                 switch (ib.getSkillRequired()) {
                     case "Bow":
                     case "Crossbow":
@@ -814,7 +814,7 @@ public class ItemFactory {
             int galvorAmount = 0;
             int wormwoodAmount = 0;
 
-            if (ib.getType() == ItemType.WEAPON && ib.getPercentRequired() == 110) {
+            if (template.item_type.equals(ItemType.WEAPON) && ib.getPercentRequired() == 110) {
                 switch (ib.getSkillRequired()) {
                     case "Bow":
                     case "Crossbow":
diff --git a/src/engine/objects/Mob.java b/src/engine/objects/Mob.java
index e60ce4e4..69a1c315 100644
--- a/src/engine/objects/Mob.java
+++ b/src/engine/objects/Mob.java
@@ -1295,7 +1295,7 @@ public class Mob extends AbstractIntelligenceAgent implements Delayed {
         if (ib == null)
             return 0;
 
-        if (!ib.getType().equals(ItemType.ARMOR))
+        if (!armor.template.item_type.equals(ItemType.ARMOR))
             return 0;
 
         if (ib.getSkillRequired().isEmpty())
@@ -1334,7 +1334,7 @@ public class Mob extends AbstractIntelligenceAgent implements Delayed {
 
             if (ib == null)
                 noWeapon = true;
-            else if (ib.getType().equals(ItemType.WEAPON) == false) {
+            else if (weapon.template.item_type.equals(ItemType.WEAPON) == false) {
                 defaultAtrAndDamage(mainHand);
                 return;
             } else
diff --git a/src/engine/objects/MobLoot.java b/src/engine/objects/MobLoot.java
index 0f84a863..4c158c12 100644
--- a/src/engine/objects/MobLoot.java
+++ b/src/engine/objects/MobLoot.java
@@ -69,7 +69,7 @@ public final class MobLoot extends Item {
         this.ownerID = mob.getObjectUUID();
         this.objectUUID = generateId();
 
-        if (quantity == 0 && ib.getType() == ItemType.RESOURCE)
+        if (quantity == 0 && ItemTemplate.itemTemplates.get(ib.getUUID()).item_type == ItemType.RESOURCE)
             quantity = 1;
 
         if (quantity > 0)
@@ -129,10 +129,9 @@ public final class MobLoot extends Item {
         if (isDeleted)
             return null;
 
-        if (this.getItemBase().getType().equals(ItemType.GOLD))
+        if (this.template.item_type.equals(ItemType.GOLD))
             return null;
 
-
         Item item = (Item) this;
 
         item.setOwner(looter);
diff --git a/src/engine/objects/NPC.java b/src/engine/objects/NPC.java
index b2786275..8373537f 100644
--- a/src/engine/objects/NPC.java
+++ b/src/engine/objects/NPC.java
@@ -1070,7 +1070,7 @@ public class NPC extends AbstractCharacter {
         ItemBase itemBase;
         for (Integer itemID : fullItemList) {
             itemBase = ItemBase.getItemBase(itemID);
-            boolean exclude = itemBase.getPercentRequired() == 0 && itemBase.getType() == ItemType.WEAPON;
+            boolean exclude = itemBase.getPercentRequired() == 0 && ItemTemplate.itemTemplates.get(itemID).item_type == ItemType.WEAPON;
             if (itemBase.getPercentRequired() <= maxSkill && !exclude)
                 filteredItemList.add(itemID);
         }
@@ -1095,7 +1095,7 @@ public class NPC extends AbstractCharacter {
         if (ib == null)
             return 0;
 
-        if (ib.getType() == ItemType.SCROLL)
+        if (ItemTemplate.itemTemplates.get(itemID).item_type == ItemType.SCROLL)
             return this.getRank() * 60 * 60 * 3;
 
         float time;
diff --git a/src/engine/objects/PlayerCharacter.java b/src/engine/objects/PlayerCharacter.java
index 38e6ff2b..7ded1e94 100644
--- a/src/engine/objects/PlayerCharacter.java
+++ b/src/engine/objects/PlayerCharacter.java
@@ -2840,11 +2840,11 @@ public class PlayerCharacter extends AbstractCharacter {
         ItemBase ib = item.getItemBase();
         if (ib != null) {
 
-            if ((ib.getType().equals(ItemType.WEAPON))
+            if ((item.template.item_type.equals(ItemType.WEAPON))
                     && (ib.getSkillRequired().equals(type) || ib.getMastery().equals(type)))
                 return true;
 
-            return (ib.getType().equals(ItemType.ARMOR))
+            return (item.template.item_type.equals(ItemType.ARMOR))
                     && (ib.getSkillRequired().equals(type));
         }
 
@@ -3865,7 +3865,7 @@ public class PlayerCharacter extends AbstractCharacter {
             ItemBase ib = weapon.getItemBase();
             if (ib == null)
                 noWeapon = true;
-            else if (!ib.getType().equals(ItemType.WEAPON)) {
+            else if (!weapon.template.item_type.equals(ItemType.WEAPON)) {
                 defaultAtrAndDamage(mainHand);
                 return;
             } else
@@ -3884,7 +3884,7 @@ public class PlayerCharacter extends AbstractCharacter {
         if (noWeapon) {
             if (mainHand) {
                 Item off = this.charItemManager.getEquipped().get(EquipSlotType.LHELD);
-                if (off != null && off.getItemBase() != null && off.getItemBase().getType().equals(ItemType.WEAPON))
+                if (off != null && off.getItemBase() != null && off.template.item_type.equals(ItemType.WEAPON))
                     this.rangeHandOne = 10 * (1 + (this.statStrBase / 600)); // Set
                     // to
                     // no
@@ -4026,7 +4026,7 @@ public class PlayerCharacter extends AbstractCharacter {
         //if duel wielding, cut damage by 30%
         if (otherHand != null) {
             ItemBase ibo = otherHand.getItemBase();
-            if (ibo != null && ibo.getType().equals(ItemType.WEAPON)) {
+            if (ibo != null && otherHand.template.equals(ItemType.WEAPON)) {
                 min *= 0.7f;
                 max *= 0.7f;
             }
@@ -4171,10 +4171,12 @@ public class PlayerCharacter extends AbstractCharacter {
         if (ib == null)
             return 0;
 
-        if (!ib.getType().equals(ItemType.ARMOR))
+        if (!armor.template.item_type.equals(ItemType.ARMOR))
             return 0;
+
         if (ib.getSkillRequired().isEmpty())
             return ib.getDefense();
+
         CharacterSkill armorSkill = this.skills.get(ib.getSkillRequired());
         if (armorSkill == null) {
             Logger.error("Player " + this.getObjectUUID()
diff --git a/src/engine/objects/Warehouse.java b/src/engine/objects/Warehouse.java
index 04b32ec6..59778be3 100644
--- a/src/engine/objects/Warehouse.java
+++ b/src/engine/objects/Warehouse.java
@@ -341,7 +341,7 @@ public class Warehouse extends AbstractWorldObject {
 
         Resource resourceType;
 
-        if (resource.getItemBase().getType().equals(Enum.ItemType.GOLD))
+        if (resource.template.item_type.equals(Enum.ItemType.GOLD))
             resourceType = Resource.GOLD;
         else
             resourceType = Resource.valueOf(ItemTemplate.itemTemplates.get(resource.getTemplsteID()).item_base_name.toUpperCase());
diff --git a/src/engine/powers/poweractions/StealPowerAction.java b/src/engine/powers/poweractions/StealPowerAction.java
index 545137d1..62426407 100644
--- a/src/engine/powers/poweractions/StealPowerAction.java
+++ b/src/engine/powers/poweractions/StealPowerAction.java
@@ -156,7 +156,7 @@ public class StealPowerAction extends AbstractPowerAction {
         if (myCIM == null || ownerCIM == null)
             return;
 
-        if (tar.getItemBase().getType().equals(ItemType.GOLD)) {
+        if (tar.template.item_type.equals(ItemType.GOLD)) {
             //stealing gold
             if (!myCIM.transferGoldToMyInventory((AbstractCharacter) owner, amount))
                 return;