Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 52 additions & 0 deletions Source/ACE.Server.Tests/StackableMergeMessageTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
using System.Collections.Generic;

using ACE.Entity;
using ACE.Entity.Models;
using ACE.Server.WorldObjects;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace ACE.Server.Tests
{
[TestClass]
public class StackableMergeMessageTests
{
[TestMethod]
public void DoesNotEnqueueCreateObjectForDestroyedForeignSourceStack()
{
var sourceStack = CreateStack(5);
sourceStack.Destroy(false);
Assert.IsTrue(sourceStack.IsDestroyed);
Assert.AreEqual(5, sourceStack.StackSize ?? -1);
var sentObjects = new List<WorldObject>();

StackableMergeMessageHelper.EnqueueCreateObjectForRemainingSourceStack(
sourceStack,
sourceIsPlayerOwned: false,
sentObjects.Add);

Assert.AreEqual(0, sentObjects.Count);
}

[TestMethod]
public void EnqueuesCreateObjectForRemainingForeignSourceStack()
{
var sourceStack = CreateStack(3);
var sentObjects = new List<WorldObject>();

StackableMergeMessageHelper.EnqueueCreateObjectForRemainingSourceStack(
sourceStack,
sourceIsPlayerOwned: false,
sentObjects.Add);

Assert.AreEqual(1, sentObjects.Count);
Assert.AreSame(sourceStack, sentObjects[0]);
}

private static Stackable CreateStack(int stackSize)
{
var stack = new Stackable(new Weenie(), new ObjectGuid(1));
stack.StackSize = stackSize;
return stack;
}
}
}
4 changes: 4 additions & 0 deletions Source/ACE.Server/ACE.Server.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,10 @@
<PackageReference Include="MySqlConnector" Version="2.6.2" />
</ItemGroup>

<ItemGroup>
<InternalsVisibleTo Include="ACE.Server.Tests" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\ACE.Adapter\ACE.Adapter.csproj" />
<ProjectReference Include="..\ACE.Common\ACE.Common.csproj" />
Expand Down
6 changes: 4 additions & 2 deletions Source/ACE.Server/WorldObjects/Player_Inventory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3051,8 +3051,10 @@ public void HandleActionStackableMerge(uint mergeFromGuid, uint mergeToGuid, int
if (DoHandleActionStackableMerge(sourceStack, targetStack, amount))
{
// If the client used the R key to merge a partial stack from the landscape, it also tries to add the "ghosted" item of the picked up stack to the inventory as well.
if (sourceStackRootOwner != this && sourceStack.StackSize > 0)
Session.Network.EnqueueSend(new GameMessageCreateObject(sourceStack));
StackableMergeMessageHelper.EnqueueCreateObjectForRemainingSourceStack(
sourceStack,
sourceStackRootOwner == this,
stack => Session.Network.EnqueueSend(new GameMessageCreateObject(stack)));

Session.Network.EnqueueSend(new GameMessagePrivateUpdatePropertyInt(this, PropertyInt.EncumbranceVal, EncumbranceVal ?? 0));

Expand Down
17 changes: 17 additions & 0 deletions Source/ACE.Server/WorldObjects/StackableMergeMessageHelper.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using System;

namespace ACE.Server.WorldObjects
{
internal static class StackableMergeMessageHelper
{
internal static void EnqueueCreateObjectForRemainingSourceStack(
WorldObject sourceStack,
bool sourceIsPlayerOwned,
Action<WorldObject> enqueueCreateObject)
{
// A full merge destroys the source but leaves its pre-merge StackSize intact.
if (!sourceIsPlayerOwned && !sourceStack.IsDestroyed && sourceStack.StackSize > 0)
enqueueCreateObject(sourceStack);
}
}
}