/// <summary> /// This method handles the second part of the merge if we have not merged ALL of the fromWo into the toWo - split out for code reuse. It calculates /// the updated values for stack size, value and burden, creates the needed client messages /// and sends them. This must be called from within an action chain. Og II /// </summary> /// <param name="session">Session is used for sequence and target</param> /// <param name="fromWo">World object of the item are we merging from</param> /// <param name="amount">How many are we merging fromWo into the toWo</param> public void UpdateFromStack(Session session, WorldObject fromWo, int amount) { // ok, there are some left, we need up update the stack size, value and burden of the fromWo // unless we have a data issue, these are valid asserts Og II Debug.Assert(fromWo.Value != null, "fromWo.Value != null"); Debug.Assert(fromWo.StackSize != null, "fromWo.StackSize != null"); Debug.Assert(fromWo.Burden != null, "fromWo.Burden != null"); int newFromValue = (int)(fromWo.Value + ((fromWo.Value / fromWo.StackSize) * -amount)); uint newFromBurden = (uint)(fromWo.Burden + ((fromWo.Burden / fromWo.StackSize) * -amount)); int oldFromStackSize = (int)fromWo.StackSize; fromWo.StackSize -= (ushort)amount; fromWo.Value = newFromValue; fromWo.Burden = (ushort)newFromBurden; // Build the needed messages to the client. GameMessagePrivateUpdatePropertyInt msgUpdateValue = new GameMessagePrivateUpdatePropertyInt(fromWo.Sequences, PropertyInt.Value, newFromValue); Debug.Assert(fromWo.StackSize != null, "fromWo.StackSize != null"); GameMessageSetStackSize msgAdjustNewStackSize = new GameMessageSetStackSize(fromWo.Sequences, fromWo.Guid, (int)fromWo.StackSize, oldFromStackSize); CurrentLandblock.EnqueueBroadcast(Location, MaxObjectTrackingRange, msgUpdateValue, msgAdjustNewStackSize); }
/// <summary> /// This method handles the first part of the merge - split out for code reuse. It calculates /// the updated values for stack size, value and burden, creates the needed client messages /// and sends them. This must be called from within an action chain. Og II /// </summary> /// <param name="session">Session is used for sequence and target</param> /// <param name="fromWo">World object of the item are we merging from</param> /// <param name="toWo">World object of the item we are merging into</param> /// <param name="amount">How many are we merging fromWo into the toWo</param> public void UpdateToStack(Session session, WorldObject fromWo, WorldObject toWo, int amount) { // unless we have a data issue, these are valid asserts Og II Debug.Assert(toWo.Value != null, "toWo.Value != null"); Debug.Assert(fromWo.Value != null, "fromWo.Value != null"); Debug.Assert(toWo.StackSize != null, "toWo.StackSize != null"); Debug.Assert(fromWo.StackSize != null, "fromWo.StackSize != null"); Debug.Assert(toWo.Burden != null, "toWo.Burden != null"); Debug.Assert(fromWo.Burden != null, "fromWo.Burden != null"); int newValue = (int)(toWo.Value + ((fromWo.Value / fromWo.StackSize) * amount)); uint newBurden = (uint)(toWo.Burden + ((fromWo.Burden / fromWo.StackSize) * amount)); int oldStackSize = (int)toWo.StackSize; toWo.StackSize += (ushort)amount; toWo.Value = newValue; toWo.Burden = (ushort)newBurden; // Build the needed messages to the client. GameMessagePrivateUpdatePropertyInt msgUpdateValue = new GameMessagePrivateUpdatePropertyInt(toWo.Sequences, PropertyInt.Value, newValue); GameMessagePutObjectInContainer msgPutObjectInContainer = new GameMessagePutObjectInContainer(session, Guid, toWo, toWo.PlacementPosition ?? 0); Debug.Assert(toWo.StackSize != null, "toWo.StackSize != null"); GameMessageSetStackSize msgAdjustNewStackSize = new GameMessageSetStackSize(toWo.Sequences, toWo.Guid, (int)toWo.StackSize, oldStackSize); CurrentLandblock.EnqueueBroadcast(Location, MaxObjectTrackingRange, msgUpdateValue, msgPutObjectInContainer, msgAdjustNewStackSize); }