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]); } } }