baseline: OpenMU upstream b5a0961 (fresh source)

This commit is contained in:
Acentech Dev
2026-07-14 19:00:35 +03:00
parent 450402e47d
commit 36fc125d5c
11968 changed files with 748705 additions and 0 deletions

View File

@@ -0,0 +1,51 @@
// <copyright file="ChangeTradeButtonStatePlugIn.cs" company="MUnique">
// Licensed under the MIT License. See LICENSE file in the project root for full license information.
// </copyright>
namespace MUnique.OpenMU.GameServer.RemoteView.Trade;
using System.Runtime.InteropServices;
using MUnique.OpenMU.GameLogic.Views.Trade;
using MUnique.OpenMU.Network.Packets.ServerToClient;
using MUnique.OpenMU.PlugIns;
/// <summary>
/// The default implementation of the <see cref="IChangeTradeButtonStatePlugIn"/> which is forwarding everything to the game client with specific data packets.
/// </summary>
[PlugIn]
[Display(Name = nameof(PlugInResources.ChangeTradeButtonStatePlugIn_Name), Description = nameof(PlugInResources.ChangeTradeButtonStatePlugIn_Description), ResourceType = typeof(PlugInResources))]
[Guid("d33144a1-634a-4c7a-9add-2086c3b9b0ea")]
public class ChangeTradeButtonStatePlugIn : IChangeTradeButtonStatePlugIn
{
private readonly RemotePlayer _player;
/// <summary>
/// Initializes a new instance of the <see cref="ChangeTradeButtonStatePlugIn"/> class.
/// </summary>
/// <param name="player">The player.</param>
public ChangeTradeButtonStatePlugIn(RemotePlayer player) => this._player = player;
/// <inheritdoc/>
/// <remarks>
/// This message is sent when the trading partner presses or un-presses the trade accept button.
/// Examples:
/// C1 04 3C 00 Partner unpressed
/// C1 04 3C 01 Partner pressed
/// C1 04 3C 02 Button is red for x seconds.
/// </remarks>
public async ValueTask ChangeTradeButtonStateAsync(TradeButtonState state)
{
await this._player.Connection.SendTradeButtonStateChangedAsync(Convert(state)).ConfigureAwait(false);
}
private static TradeButtonStateChanged.TradeButtonState Convert(TradeButtonState state)
{
return state switch
{
TradeButtonState.Unchecked => TradeButtonStateChanged.TradeButtonState.Unchecked,
TradeButtonState.Checked => TradeButtonStateChanged.TradeButtonState.Checked,
TradeButtonState.Red => TradeButtonStateChanged.TradeButtonState.Red,
_ => throw new ArgumentException($"Unhandled enum value {state}."),
};
}
}

View File

@@ -0,0 +1,33 @@
// <copyright file="RequestedTradeMoneyHasBeenSetPlugIn.cs" company="MUnique">
// Licensed under the MIT License. See LICENSE file in the project root for full license information.
// </copyright>
namespace MUnique.OpenMU.GameServer.RemoteView.Trade;
using System.Runtime.InteropServices;
using MUnique.OpenMU.GameLogic.Views.Trade;
using MUnique.OpenMU.Network.Packets.ServerToClient;
using MUnique.OpenMU.PlugIns;
/// <summary>
/// The default implementation of the <see cref="IRequestedTradeMoneyHasBeenSetPlugIn"/> which is forwarding everything to the game client with specific data packets.
/// </summary>
[PlugIn]
[Display(Name = nameof(PlugInResources.RequestedTradeMoneyHasBeenSetPlugIn_Name), Description = nameof(PlugInResources.RequestedTradeMoneyHasBeenSetPlugIn_Description), ResourceType = typeof(PlugInResources))]
[Guid("d07bc23a-e4ec-462b-96d6-b2da739664d0")]
public class RequestedTradeMoneyHasBeenSetPlugIn : IRequestedTradeMoneyHasBeenSetPlugIn
{
private readonly RemotePlayer _player;
/// <summary>
/// Initializes a new instance of the <see cref="RequestedTradeMoneyHasBeenSetPlugIn"/> class.
/// </summary>
/// <param name="player">The player.</param>
public RequestedTradeMoneyHasBeenSetPlugIn(RemotePlayer player) => this._player = player;
/// <inheritdoc />
public ValueTask RequestedTradeMoneyHasBeenSetAsync()
{
return this._player.Connection.SendTradeMoneySetResponseAsync();
}
}

View File

@@ -0,0 +1,33 @@
// <copyright file="SetTradeMoneyPlugIn.cs" company="MUnique">
// Licensed under the MIT License. See LICENSE file in the project root for full license information.
// </copyright>
namespace MUnique.OpenMU.GameServer.RemoteView.Trade;
using System.Runtime.InteropServices;
using MUnique.OpenMU.GameLogic.Views.Trade;
using MUnique.OpenMU.Network.Packets.ServerToClient;
using MUnique.OpenMU.PlugIns;
/// <summary>
/// The default implementation of the <see cref="ISetTradeMoneyPlugIn"/> which is forwarding everything to the game client with specific data packets.
/// </summary>
[PlugIn]
[Display(Name = nameof(PlugInResources.SetTradeMoneyPlugIn_Name), Description = nameof(PlugInResources.SetTradeMoneyPlugIn_Description), ResourceType = typeof(PlugInResources))]
[Guid("ca421b33-4ac2-4496-a8a3-11b740cded8c")]
public class SetTradeMoneyPlugIn : ISetTradeMoneyPlugIn
{
private readonly RemotePlayer _player;
/// <summary>
/// Initializes a new instance of the <see cref="SetTradeMoneyPlugIn"/> class.
/// </summary>
/// <param name="player">The player.</param>
public SetTradeMoneyPlugIn(RemotePlayer player) => this._player = player;
/// <inheritdoc/>
public ValueTask SetTradeMoneyAsync(uint moneyAmount)
{
return this._player.Connection.SendTradeMoneyUpdateAsync(moneyAmount);
}
}

View File

@@ -0,0 +1,37 @@
// <copyright file="ShowTradeRequestAnswerPlugIn.cs" company="MUnique">
// Licensed under the MIT License. See LICENSE file in the project root for full license information.
// </copyright>
namespace MUnique.OpenMU.GameServer.RemoteView.Trade;
using System.Runtime.InteropServices;
using MUnique.OpenMU.GameLogic.Views.Trade;
using MUnique.OpenMU.Network.Packets.ServerToClient;
using MUnique.OpenMU.PlugIns;
/// <summary>
/// The default implementation of the <see cref="IShowTradeRequestAnswerPlugIn"/> which is forwarding everything to the game client with specific data packets.
/// </summary>
[PlugIn]
[Display(Name = nameof(PlugInResources.ShowTradeRequestAnswerPlugIn_Name), Description = nameof(PlugInResources.ShowTradeRequestAnswerPlugIn_Description), ResourceType = typeof(PlugInResources))]
[Guid("243cbc67-7af3-48e2-9a56-d6e49c86b816")]
public class ShowTradeRequestAnswerPlugIn : IShowTradeRequestAnswerPlugIn
{
private readonly RemotePlayer _player;
/// <summary>
/// Initializes a new instance of the <see cref="ShowTradeRequestAnswerPlugIn"/> class.
/// </summary>
/// <param name="player">The player.</param>
public ShowTradeRequestAnswerPlugIn(RemotePlayer player) => this._player = player;
/// <inheritdoc/>
public async ValueTask ShowTradeRequestAnswerAsync(bool tradeAccepted)
{
await this._player.Connection.SendTradeRequestAnswerAsync(
tradeAccepted,
this._player.TradingPartner?.Name ?? string.Empty,
(ushort)(tradeAccepted ? this._player.TradingPartner?.Level ?? 0 : 0),
tradeAccepted ? this._player.TradingPartner?.GuildStatus?.GuildId ?? 0 : 0).ConfigureAwait(false);
}
}

View File

@@ -0,0 +1,34 @@
// <copyright file="ShowTradeRequestPlugIn.cs" company="MUnique">
// Licensed under the MIT License. See LICENSE file in the project root for full license information.
// </copyright>
namespace MUnique.OpenMU.GameServer.RemoteView.Trade;
using System.Runtime.InteropServices;
using MUnique.OpenMU.GameLogic;
using MUnique.OpenMU.GameLogic.Views.Trade;
using MUnique.OpenMU.Network.Packets.ServerToClient;
using MUnique.OpenMU.PlugIns;
/// <summary>
/// The default implementation of the <see cref="IShowTradeRequestPlugIn"/> which is forwarding everything to the game client with specific data packets.
/// </summary>
[PlugIn]
[Display(Name = nameof(PlugInResources.ShowTradeRequestPlugIn_Name), Description = nameof(PlugInResources.ShowTradeRequestPlugIn_Description), ResourceType = typeof(PlugInResources))]
[Guid("2e6e8c0e-8220-46e3-931a-630d596178ca")]
public class ShowTradeRequestPlugIn : IShowTradeRequestPlugIn
{
private readonly RemotePlayer _player;
/// <summary>
/// Initializes a new instance of the <see cref="ShowTradeRequestPlugIn"/> class.
/// </summary>
/// <param name="player">The player.</param>
public ShowTradeRequestPlugIn(RemotePlayer player) => this._player = player;
/// <inheritdoc/>
public async ValueTask ShowTradeRequestAsync(ITrader requester)
{
await this._player.Connection.SendTradeRequestAsync(requester.Name).ConfigureAwait(false);
}
}

View File

@@ -0,0 +1,54 @@
// <copyright file="TradeFinishedPlugIn.cs" company="MUnique">
// Licensed under the MIT License. See LICENSE file in the project root for full license information.
// </copyright>
namespace MUnique.OpenMU.GameServer.RemoteView.Trade;
using System.Runtime.InteropServices;
using MUnique.OpenMU.GameLogic;
using MUnique.OpenMU.GameLogic.Views.Inventory;
using MUnique.OpenMU.GameLogic.Views.Trade;
using MUnique.OpenMU.Network.Packets.ServerToClient;
using MUnique.OpenMU.PlugIns;
/// <summary>
/// The default implementation of the <see cref="ITradeFinishedPlugIn"/> which is forwarding everything to the game client with specific data packets.
/// </summary>
[PlugIn]
[Display(Name = nameof(PlugInResources.TradeFinishedPlugIn_Name), Description = nameof(PlugInResources.TradeFinishedPlugIn_Description), ResourceType = typeof(PlugInResources))]
[Guid("ec11fe95-31c6-4a2e-942d-4d10a84830c1")]
public class TradeFinishedPlugIn : ITradeFinishedPlugIn
{
private readonly RemotePlayer _player;
/// <summary>
/// Initializes a new instance of the <see cref="TradeFinishedPlugIn"/> class.
/// </summary>
/// <param name="player">The player.</param>
public TradeFinishedPlugIn(RemotePlayer player) => this._player = player;
/// <inheritdoc />
public async ValueTask TradeFinishedAsync(TradeResult tradeResult)
{
await this._player.Connection.SendTradeFinishedAsync(Convert(tradeResult)).ConfigureAwait(false);
if (tradeResult != TradeResult.TimedOut)
{
await this._player.InvokeViewPlugInAsync<IUpdateInventoryListPlugIn>(p => p.UpdateInventoryListAsync()).ConfigureAwait(false);
await this._player.InvokeViewPlugInAsync<IUpdateMoneyPlugIn>(p => p.UpdateMoneyAsync()).ConfigureAwait(false);
}
}
private static TradeFinished.TradeResult Convert(TradeResult tradeResult)
{
return tradeResult switch
{
TradeResult.Cancelled => Network.Packets.ServerToClient.TradeFinished.TradeResult.Cancelled,
TradeResult.Success => Network.Packets.ServerToClient.TradeFinished.TradeResult.Success,
TradeResult.FailedByFullInventory => Network.Packets.ServerToClient.TradeFinished.TradeResult.FailedByFullInventory,
TradeResult.TimedOut => Network.Packets.ServerToClient.TradeFinished.TradeResult.TimedOut,
TradeResult.FailedByItemsNotAllowedToTrade => Network.Packets.ServerToClient.TradeFinished.TradeResult.FailedByItemsNotAllowedToTrade,
_ => throw new ArgumentException($"TradeResult {tradeResult} not mapped to a byte value."),
};
}
}

View File

@@ -0,0 +1,56 @@
// <copyright file="TradeItemAppearPlugIn.cs" company="MUnique">
// Licensed under the MIT License. See LICENSE file in the project root for full license information.
// </copyright>
namespace MUnique.OpenMU.GameServer.RemoteView.Trade;
using System.Runtime.InteropServices;
using MUnique.OpenMU.DataModel.Entities;
using MUnique.OpenMU.GameLogic.Views.Trade;
using MUnique.OpenMU.Network;
using MUnique.OpenMU.Network.Packets.ServerToClient;
using MUnique.OpenMU.PlugIns;
/// <summary>
/// The default implementation of the <see cref="ITradeItemAppearPlugIn"/> which is forwarding everything to the game client with specific data packets.
/// </summary>
[PlugIn]
[Display(Name = nameof(PlugInResources.TradeItemAppearPlugIn_Name), Description = nameof(PlugInResources.TradeItemAppearPlugIn_Description), ResourceType = typeof(PlugInResources))]
[Guid("560d18e7-7d36-47bf-9298-8017454fa7bf")]
public class TradeItemAppearPlugIn : ITradeItemAppearPlugIn
{
private readonly RemotePlayer _player;
/// <summary>
/// Initializes a new instance of the <see cref="TradeItemAppearPlugIn"/> class.
/// </summary>
/// <param name="player">The player.</param>
public TradeItemAppearPlugIn(RemotePlayer player) => this._player = player;
/// <inheritdoc/>
public async ValueTask TradeItemAppearAsync(byte toSlot, Item item)
{
var connection = this._player.Connection;
if (connection is null)
{
return;
}
int Write()
{
var itemSerializer = this._player.ItemSerializer;
var size = TradeItemAddedRef.GetRequiredSize(itemSerializer.NeededSpace);
var span = connection.Output.GetSpan(size)[..size];
var packet = new TradeItemAddedRef(span)
{
ToSlot = toSlot,
};
var itemSize = itemSerializer.SerializeItem(packet.ItemData, item);
var actualSize = TradeItemAddedRef.GetRequiredSize(itemSize);
span.Slice(0, actualSize).SetPacketSize();
return actualSize;
}
await connection.SendAsync(Write).ConfigureAwait(false);
}
}

View File

@@ -0,0 +1,34 @@
// <copyright file="TradeItemDisappearPlugIn.cs" company="MUnique">
// Licensed under the MIT License. See LICENSE file in the project root for full license information.
// </copyright>
namespace MUnique.OpenMU.GameServer.RemoteView.Trade;
using System.Runtime.InteropServices;
using MUnique.OpenMU.DataModel.Entities;
using MUnique.OpenMU.GameLogic.Views.Trade;
using MUnique.OpenMU.Network.Packets.ServerToClient;
using MUnique.OpenMU.PlugIns;
/// <summary>
/// The default implementation of the <see cref="ITradeItemDisappearPlugIn"/> which is forwarding everything to the game client with specific data packets.
/// </summary>
[PlugIn]
[Display(Name = nameof(PlugInResources.TradeItemDisappearPlugIn_Name), Description = nameof(PlugInResources.TradeItemDisappearPlugIn_Description), ResourceType = typeof(PlugInResources))]
[Guid("5ac9569b-3c5a-468e-bf48-1e67f81281c5")]
public class TradeItemDisappearPlugIn : ITradeItemDisappearPlugIn
{
private readonly RemotePlayer _player;
/// <summary>
/// Initializes a new instance of the <see cref="TradeItemDisappearPlugIn"/> class.
/// </summary>
/// <param name="player">The player.</param>
public TradeItemDisappearPlugIn(RemotePlayer player) => this._player = player;
/// <inheritdoc/>
public ValueTask TradeItemDisappearAsync(byte slot, Item item)
{
return this._player.Connection.SendTradeItemRemovedAsync(slot);
}
}