/// <summary> /// Updates the ammo count or destroys the ammo after launching the projectile. /// </summary> /// <param name="ammo">The missile ammo object</param> public void UpdateAmmoAfterLaunch(WorldObject ammo) { var player = this as Player; if (ammo.StackSize == 1) { TryDequipObject(ammo.Guid); player?.Session.Network.EnqueueSend(new GameMessageDeleteObject(ammo)); CurrentLandblock.EnqueueActionBroadcast(Location, Landblock.MaxObjectRange, p => p.StopTrackingObject(ammo, true)); } else { ammo.StackSize--; player?.Session.Network.EnqueueSend(new GameMessageSetStackSize(ammo)); CurrentLandblock.EnqueueBroadcast(Location, new GameMessagePickupEvent(ammo)); } }
/// <summary> /// This will remove the Wielder and CurrentWieldedLocation properties on the item and will remove it from the EquippedObjects dictionary.<para /> /// It does not add it to inventory as you could be unwielding to the ground or a chest. Og II<para /> /// It will also decrease the EncumbranceVal and Value. /// </summary> public bool TryDequipObject(ObjectGuid objectGuid, out WorldObject worldObject) { if (EquippedObjects.Remove(objectGuid, out worldObject)) { worldObject.RemoveProperty(PropertyInt.CurrentWieldedLocation); worldObject.RemoveProperty(PropertyInstanceId.Wielder); EncumbranceVal -= worldObject.EncumbranceVal; Value -= worldObject.Value; if (CurrentLandblock != null) { CurrentLandblock.EnqueueActionBroadcast(Location, Landblock.MaxObjectRange, (Player p) => p.TrackObject(this)); } return(true); } return(false); }
/// <summary> /// This will set the CurrentWieldedLocation property to wieldedLocation and the Wielder property to this guid and will add it to the EquippedObjects dictionary.<para /> /// It will also increase the EncumbranceVal and Value. /// </summary> public bool TryEquipObject(WorldObject worldObject, int wieldedLocation) { if (!WieldedLocationIsAvailable(wieldedLocation)) { return(false); } worldObject.CurrentWieldedLocation = (EquipMask)wieldedLocation; worldObject.WielderId = Biota.Id; EquippedObjects[worldObject.Guid] = worldObject; EncumbranceVal += worldObject.EncumbranceVal; Value += worldObject.Value; if (CurrentLandblock != null) { CurrentLandblock.EnqueueActionBroadcast(Location, Landblock.MaxObjectRange, (Player p) => p.TrackObject(this)); } return(true); }
public void HandleSwitchToMissileCombatMode(ActionChain combatModeChain) { // TODO and FIXME: GetInventoryItem doesn't work for this so this function is effectively broke HeldItem mEquipedMissile = Children.Find(s => s.EquipMask == EquipMask.MissileWeapon); if (mEquipedMissile?.Guid != null) { WorldObject missileWeapon = GetWieldedItem(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 = GetEquippedAmmo(); MotionStance ms; CombatStyle cs; if (missileWeapon.DefaultCombatStyle != null) { cs = missileWeapon.DefaultCombatStyle.Value; } else { log.InfoFormat("Changing combat mode for {0} - wielded item {1} has not be assigned a default combat style", Guid, mEquipedMissile.Guid); return; } switch (cs) { case CombatStyle.Bow: ms = MotionStance.BowAttack; break; case CombatStyle.Crossbow: ms = MotionStance.CrossBowAttack; break; default: ms = MotionStance.Invalid; break; } UniversalMotion mm = new UniversalMotion(ms); mm.MovementData.CurrentStyle = (ushort)ms; CurrentLandblock.EnqueueBroadcast(Location, Landblock.MaxObjectRange, new GameMessageUpdatePosition(this)); SetMotionState(this, mm); if (mEquipedAmmo != null) { 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); 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); // add to player tracking var wielder = CurrentLandblock.GetObject(new ObjectGuid(mEquipedAmmo.WielderId.Value)); combatModeChain.AddAction(this, () => CurrentLandblock.EnqueueActionBroadcast(Location, Landblock.MaxObjectRange, (Player p) => p.TrackObject(wielder))); combatModeChain.AddAction(this, () => CurrentLandblock.EnqueueBroadcast(Location, Landblock.MaxObjectRange, new GameMessageParentEvent(this, mEquipedAmmo, 1, 1))); } var player = this as Player; if (player != null) { player.Session.Network.EnqueueSend(new GameMessagePrivateUpdatePropertyInt(this, PropertyInt.CombatMode, (int)CombatMode.Missile)); } } }