public static void unreadyWeapon(this NPCProto proto)
        {
            if (proto.IsMonster())
            {
                return;
            }
            if (proto.WeaponMode == 0)
            {
                return;
            }

            if (proto.WeaponMode == (int)FightMode.Fist)//Fist
            {
                proto.WeaponMode = 0;
            }
            else if (proto.WeaponMode == (int)FightMode.Meele)//Sword
            {
                proto.WeaponMode = 0;
                Item i = proto.getSlotItem((int)SlotFlag.SLOT_RIGHTHAND);
                if ((i.ItemInstance.Flags & (Flags.ITEM_2HD_SWD | Flags.ITEM_2HD_AXE)) > 0)
                {
                    proto.setSlotItem((int)SlotFlag.SLOT_RIGHTHAND, null);
                    proto.setSlotItem((int)SlotFlag.SLOT_LONGSWORD, i);
                }
                else
                {
                    proto.setSlotItem((int)SlotFlag.SLOT_RIGHTHAND, null);
                    proto.setSlotItem((int)SlotFlag.SLOT_SWORD, i);
                }
            }
            else if (proto.WeaponMode == (int)FightMode.Far)
            {
                proto.WeaponMode = 0;
                Item i = proto.getSlotItem((int)SlotFlag.SLOT_LEFTHAND);
                if ((i.ItemInstance.Flags & Flags.ITEM_BOW) > 0)
                {
                    proto.setSlotItem((int)SlotFlag.SLOT_LEFTHAND, null);
                    proto.setSlotItem((int)SlotFlag.SLOT_BOW, i);
                }
                else
                {
                    proto.setSlotItem((int)SlotFlag.SLOT_LEFTHAND, null);
                    proto.setSlotItem((int)SlotFlag.SLOT_CROSSBOW, i);
                }
            }
        }
        public static void readyBestWeapon(this NPCProto proto, NPCProto enemy)
        {
            if (proto.IsMonster())//Monsters are always in FIST-Mode.
            {
                return;
            }
            if (proto.WeaponMode != 0)
            {
                return;
            }

            //Draw Range-Weapon when Equiped and Distance is over 12 Meters
            if (proto.EquippedRangeWeapon != null && enemy.Position.getDistance(proto.Position) > 1200)
            {
                proto.setWeaponMode((int)FightMode.Far);
                if ((proto.EquippedRangeWeapon.ItemInstance.Flags & Flags.ITEM_BOW) > 0)
                {
                    proto.setSlotItem((int)SlotFlag.SLOT_BOW, null);
                    proto.setSlotItem((int)SlotFlag.SLOT_LEFTHAND, proto.EquippedRangeWeapon);
                }
                else
                {
                    proto.setSlotItem((int)SlotFlag.SLOT_CROSSBOW, null);
                    proto.setSlotItem((int)SlotFlag.SLOT_LEFTHAND, proto.EquippedRangeWeapon);
                }
            }
            else if (proto.EquippedWeapon != null)
            {
                proto.setWeaponMode((int)FightMode.Meele);
                if ((proto.EquippedWeapon.ItemInstance.Flags & (Flags.ITEM_2HD_SWD | Flags.ITEM_2HD_AXE)) > 0)
                {
                    proto.setSlotItem((int)SlotFlag.SLOT_LONGSWORD, null);
                    proto.setSlotItem((int)SlotFlag.SLOT_RIGHTHAND, proto.EquippedWeapon);
                }
                else
                {
                    proto.setSlotItem((int)SlotFlag.SLOT_SWORD, null);
                    proto.setSlotItem((int)SlotFlag.SLOT_RIGHTHAND, proto.EquippedWeapon);
                }
            }
            else
            {
                proto.setWeaponMode((int)FightMode.Fist);
            }
        }
        public void Read(BitStream stream, Packet packet, Client client)
        {
            int playerID = 0, cF = 0;

            stream.Read(out playerID);
            stream.Read(out cF);

            NPCProto proto = (NPCProto)sWorld.VobDict[playerID];

            NPCChangedFlags changeFlags = (NPCChangedFlags)cF;

            zERROR.GetZErr(Process.ThisProcess()).Report(2, 'G', "Getted ChangeFlags: " + changeFlags, 0, "Client.cs", 0);
            //Equipment:
            if (changeFlags.HasFlag(NPCChangedFlags.EQUIP_ARMOR))
            {
                Item armor   = null;
                int  armorID = 0;
                stream.Read(out armorID);
                if (armorID > 0)
                {
                    armor = (Item)sWorld.VobDict[armorID];
                    Item oldArmor = proto.Armor;

                    proto.Armor = armor;
                    proto.setArmor(armor);
                }
                else
                {
                    proto.setArmor(null);
                }
            }

            if (changeFlags.HasFlag(NPCChangedFlags.EQUIP_NW))
            {
                Item weapon   = null;
                int  weaponID = 0;
                stream.Read(out weaponID);
                if (weaponID > 0)
                {
                    weapon = (Item)sWorld.VobDict[weaponID];
                    Item oldWeapon = proto.Weapon;

                    proto.Weapon = weapon;
                    proto.setWeapon(weapon);
                }
                else
                {
                    proto.setWeapon(null);
                }
            }

            if (changeFlags.HasFlag(NPCChangedFlags.EQUIP_RW))
            {
                Item weapon   = null;
                int  weaponID = 0;
                stream.Read(out weaponID);
                if (weaponID > 0)
                {
                    weapon = (Item)sWorld.VobDict[weaponID];
                    Item oldWeapon = proto.RangeWeapon;

                    proto.RangeWeapon = weapon;
                    proto.setRangeWeapon(weapon);
                }
                else
                {
                    proto.setRangeWeapon(null);
                }
            }

            if (changeFlags.HasFlag(NPCChangedFlags.WeaponMode))
            {
                int weaponMode = 0;
                stream.Read(out weaponMode);

                proto.setWeaponMode(weaponMode);
            }

            for (int i = 0; i < 9; i++)
            {
                if (changeFlags.HasFlag((NPCChangedFlags)((int)NPCChangedFlags.SLOT1 << i)))
                {
                    int slotItemID = 0;
                    stream.Read(out slotItemID);

                    if (slotItemID > 0)
                    {
                        Item slotItem    = (Item)sWorld.VobDict[slotItemID];
                        Item oldSlotItem = proto.Slots[i];

                        proto.Slots[i] = slotItem;
                    }
                    else
                    {
                        proto.Slots[i] = null;
                    }
                    proto.setSlotItem(i, proto.Slots[i]);
                }
            }



            if (changeFlags.HasFlag(NPCChangedFlags.VOBFOCUS))
            {
                int vobID = 0;
                stream.Read(out vobID);

                if (vobID == 0)
                {
                    proto.FocusVob = null;
                }
                else
                {
                    proto.FocusVob = sWorld.VobDict[vobID];
                }
            }

            if (changeFlags.HasFlag(NPCChangedFlags.ENEMYFOCUS))
            {
                int vobID = 0;
                stream.Read(out vobID);

                if (vobID == 0)
                {
                    proto.Enemy = null;
                }
                else
                {
                    proto.Enemy = (NPCProto)sWorld.VobDict[vobID];
                }
            }

            if (changeFlags.HasFlag(NPCChangedFlags.MOBINTERACT))
            {
                int vobID = 0;
                stream.Read(out vobID);

                if (vobID == 0)
                {
                    proto.MobInter = null;
                }
                else
                {
                    proto.MobInter = (MobInter)sWorld.VobDict[vobID];
                }
            }

            if (changeFlags.HasFlag(NPCChangedFlags.ISDEAD))
            {
                bool isdead = false;
                stream.Read(out isdead);
                proto.IsDead = isdead;
            }

            if (changeFlags.HasFlag(NPCChangedFlags.ISUNCONSCIOUS))
            {
                bool isuncon = false;
                stream.Read(out isuncon);
                proto.IsUnconcious = isuncon;
            }

            if (changeFlags.HasFlag(NPCChangedFlags.ISSWIMMING))
            {
                bool isswimming = false;
                stream.Read(out isswimming);
                proto.IsSwimming = isswimming;
            }

            if (changeFlags.HasFlag(NPCChangedFlags.PORTALROOM))
            {
                String portalRoom = "";
                stream.Read(out portalRoom);
                proto.PortalRoom = portalRoom;
            }

            if (changeFlags.HasFlag(NPCChangedFlags.ACTIVE_SPELL))
            {
                int vobID = 0;
                stream.Read(out vobID);

                if (vobID == 0)
                {
                    proto.setActiveSpell(null);
                }
                else
                {
                    proto.setActiveSpell((Item)sWorld.VobDict[vobID]);
                }
            }
        }