public void HandleSwitchToMissileCombatMode(ActionChain combatModeChain) { HeldItem mEquipedMissile = Children.Find(s => s.EquipMask == EquipMask.MissileWeapon); if (mEquipedMissile?.Guid != null) { WorldObject missileWeapon = GetInventoryItem(new ObjectGuid(mEquipedMissile.Guid)); if (missileWeapon == null) { log.InfoFormat("Changing combat mode for {0} - could not locate wielded weapon {1}", Guid, mEquipedMissile.Guid); return; } var mEquipedAmmo = WieldedObjects.First(s => s.Value.CurrentWieldedLocation == EquipMask.MissileAmmo).Value; MotionStance ms; if (missileWeapon.DefaultCombatStyle != null) { ms = (MotionStance)missileWeapon.DefaultCombatStyle; } else { log.InfoFormat("Changing combat mode for {0} - wielded item {1} has not be assigned a default combat style", Guid, mEquipedMissile.Guid); return; } UniversalMotion mm = new UniversalMotion(ms); mm.MovementData.CurrentStyle = (ushort)ms; if (mEquipedAmmo == null) { CurrentLandblock.EnqueueBroadcast(Location, Landblock.MaxObjectRange, new GameMessageUpdatePosition(this)); SetMotionState(this, mm); } else { CurrentLandblock.EnqueueBroadcast(Location, Landblock.MaxObjectRange, new GameMessageUpdatePosition(this)); SetMotionState(this, mm); mm.MovementData.ForwardCommand = (uint)MotionCommand.Reload; SetMotionState(this, mm); CurrentLandblock.EnqueueBroadcast(Location, Landblock.MaxObjectRange, new GameMessageUpdatePosition(this)); // FIXME: (Og II)<this is a hack for now to be removed. Need to pull delay from dat file combatModeChain.AddDelaySeconds(0.25); // System.Threading.Thread.Sleep(250); // used for debugging mm.MovementData.ForwardCommand = (ushort)MotionCommand.Invalid; SetMotionState(this, mm); // FIXME: (Og II)<this is a hack for now to be removed. Need to pull delay from dat file combatModeChain.AddDelaySeconds(0.40); combatModeChain.AddAction(this, () => CurrentLandblock.EnqueueBroadcast(Location, Landblock.MaxObjectRange, new GameMessageParentEvent(this, mEquipedAmmo, 1, 1))); // CurrentLandblock.EnqueueBroadcast(Location, Landblock.MaxObjectRange, new GameMessageParentEvent(this, ammo, 1, 1)); // used for debugging } CurrentLandblock.EnqueueBroadcast(Location, Landblock.MaxObjectRange, new GameMessagePrivateUpdatePropertyInt(Sequences, PropertyInt.CombatMode, (uint)CombatMode.Missile)); } }
/// <summary> /// This method checks to make sure we have a casting device equipped and if so, it sets /// the motion state and sends the messages to switch us to spellcasting state. Og II /// </summary> public void HandleSwitchToMagicCombatMode() { HeldItem mEquipedWand = Children.Find(s => s.EquipMask == EquipMask.Held); if (mEquipedWand != null) { UniversalMotion mm = new UniversalMotion(MotionStance.Spellcasting); mm.MovementData.CurrentStyle = (uint)MotionStance.Spellcasting; SetMotionState(this, mm); CurrentLandblock.EnqueueBroadcast(Location, Landblock.MaxObjectRange, new GameMessagePrivateUpdatePropertyInt(Sequences, PropertyInt.CombatMode, (uint)CombatMode.Magic)); } else { log.InfoFormat("Changing combat mode for {0} - could not locate a wielded magic caster", Guid); } }
/// <summary> /// This method is called if we unwield missle ammo. It will check to see if I have arrows wielded /// send the message to "hide" the arrow. /// </summary> /// <param name="oldCombatMode"></param> public void HandleUnloadMissileAmmo(CombatMode oldCombatMode) { // Before I can switch to any non missile mode, do I have missile ammo I need to remove? WorldObject ammo = null; HeldItem mEquipedAmmo = Children.Find(s => s.EquipMask == EquipMask.MissileAmmo); if (mEquipedAmmo != null) { ammo = GetInventoryItem(new ObjectGuid(mEquipedAmmo.Guid)); } if (oldCombatMode == CombatMode.Missile) { if (ammo != null) { ammo.Location = null; CurrentLandblock.EnqueueBroadcast(Location, Landblock.MaxObjectRange, new GameMessagePickupEvent(ammo)); } } }
public void HandleSwitchToMeleeCombatMode(CombatMode olCombatMode) { bool shieldEquiped = false; bool weaponInShieldSlot = false; // Check to see if we were in missile combat and have an arrow hanging around we might need to remove. HandleUnloadMissileAmmo(olCombatMode); HeldItem mEquipedShieldSlot = Children.Find(s => s.EquipMask == EquipMask.Shield); if (mEquipedShieldSlot != null) { WorldObject itemInShieldSlot = GetInventoryItem(new ObjectGuid(mEquipedShieldSlot.Guid)); if (itemInShieldSlot != null) { if (itemInShieldSlot.ItemType == ItemType.Armor) { shieldEquiped = true; } else { weaponInShieldSlot = true; } } } HeldItem mEquipedMelee = Children.Find(s => s.EquipMask == EquipMask.MeleeWeapon); HeldItem mEquipedTwoHanded = Children.Find(s => s.EquipMask == EquipMask.TwoHanded); MotionStance ms = MotionStance.Invalid; // are we unarmed? If so, do we have a shield? if (mEquipedMelee == null && mEquipedTwoHanded == null && !weaponInShieldSlot) { if (!shieldEquiped) { ms = MotionStance.UaNoShieldAttack; } else { ms = MotionStance.MeleeShieldAttack; } } else if (weaponInShieldSlot) { ms = MotionStance.DualWieldAttack; } if (mEquipedTwoHanded != null) { WorldObject twoHandedWeapon = GetInventoryItem(new ObjectGuid(mEquipedTwoHanded.Guid)); if (twoHandedWeapon.DefaultCombatStyle != null) { ms = twoHandedWeapon.DefaultCombatStyle.Value; } } // Let's see if we are melee single handed / two handed with our without shield as appropriate. if (mEquipedMelee?.Guid != null && ms != MotionStance.DualWieldAttack) { WorldObject meleeWeapon = GetInventoryItem(new ObjectGuid(mEquipedMelee.Guid)); if (meleeWeapon == null) { log.InfoFormat("Changing combat mode for {0} - could not locate wielded weapon {1}", Guid, mEquipedMelee.Guid); return; } if (!shieldEquiped) { if (meleeWeapon.DefaultCombatStyle != null) { ms = meleeWeapon.DefaultCombatStyle.Value; } } else { switch (meleeWeapon.DefaultCombatStyle) { case MotionStance.MeleeNoShieldAttack: ms = MotionStance.MeleeShieldAttack; break; case MotionStance.ThrownWeaponAttack: ms = MotionStance.ThrownShieldCombat; break; case MotionStance.UaNoShieldAttack: ms = MotionStance.MeleeShieldAttack; break; default: log.InfoFormat( "Changing combat mode for {0} - unable to determine correct combat stance for weapon {1}", Guid, mEquipedMelee.Guid); return; } } } if (ms != MotionStance.Invalid) { UniversalMotion mm = new UniversalMotion(ms); mm.MovementData.CurrentStyle = (ushort)ms; SetMotionState(this, mm); CurrentLandblock.EnqueueBroadcast(Location, Landblock.MaxObjectRange, new GameMessagePrivateUpdatePropertyInt(Sequences, PropertyInt.CombatMode, (uint)CombatMode.Melee)); } else { log.InfoFormat("Changing combat mode for {0} - wielded item {1} has not be assigned a default combat style", Guid, mEquipedMelee?.Guid ?? mEquipedTwoHanded?.Guid); } }