Skip to content
Draft
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
6 changes: 6 additions & 0 deletions src/DataModel/Configuration/GameServerDefinition.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,12 @@ public partial class GameServerDefinition
/// </summary>
public float ExperienceRate { get; set; }

/// <summary>
/// Gets or sets the Zen/money multiplier for the specific server.
/// This is applied in addition to the character/global MoneyAmountRate.
/// </summary>
public float MoneyRate { get; set; } = 1.0f;

/// <summary>
/// Gets or sets a value indicating whether PVP is enabled on this server.
/// </summary>
Expand Down
3 changes: 3 additions & 0 deletions src/GameLogic/GameContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,9 @@ public GameContext(GameConfiguration configuration, IPersistenceContextProvider
/// <inheritdoc />
public virtual float ExperienceRate => this.Configuration.ExperienceRate;

/// <inheritdoc />
public virtual float MoneyRate => 1.0f;

/// <inheritdoc />
public virtual float MasterExperienceRate => this.Configuration.MasterExperienceRate;

Expand Down
5 changes: 5 additions & 0 deletions src/GameLogic/IGameContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@ public interface IGameContext
/// </summary>
float ExperienceRate { get; }

/// <summary>
/// Gets the effective Zen/money multiplier of this game server.
/// </summary>
float MoneyRate { get; }

/// <summary>
/// Gets the global master experience rate.
/// </summary>
Expand Down
5 changes: 4 additions & 1 deletion src/GameLogic/MoneyDistribution.cs
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,10 @@ public static bool TryPay(Player player, uint amount)

// The rate is applied in double precision: a float multiplication would round money amounts
// above the ~16.7M the float mantissa can represent exactly, before the cast to long.
var scaled = (long)(amount * (double)(player.Attributes?[Stats.MoneyAmountRate] ?? 1.0f));
var scaled = (long)(
amount
* (double)(player.Attributes?[Stats.MoneyAmountRate] ?? 1.0f)
* (double)(player.GameContext?.MoneyRate ?? 1.0f));
if (scaled <= 0)
{
return false;
Expand Down
3 changes: 3 additions & 0 deletions src/GameServer/GameServerContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,9 @@ public GameServerContext(
/// <inheritdoc />
public override float ExperienceRate => base.ExperienceRate * this._gameServerDefinition.ExperienceRate;

/// <inheritdoc />
public override float MoneyRate => base.MoneyRate * this._gameServerDefinition.MoneyRate;

/// <inheritdoc />
public override float MasterExperienceRate => base.MasterExperienceRate * this._gameServerDefinition.ExperienceRate;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
// <copyright file="20260811103000_AddGameServerMoneyRate.cs" company="MUnique">
// Licensed under the MIT License. See LICENSE file in the project root for full license information.
// </copyright>

#nullable disable

namespace MUnique.OpenMU.Persistence.EntityFramework.Migrations
{
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;

/// <summary>
/// Adds a per-game-server Zen multiplier for MU Nueva Era.
/// </summary>
[DbContext(typeof(EntityDataContext))]
[Migration("20260811103000_AddGameServerMoneyRate")]
public partial class AddGameServerMoneyRate : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<float>(
name: "MoneyRate",
schema: "config",
table: "GameServerDefinition",
type: "real",
nullable: false,
defaultValue: 1f);
}

/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "MoneyRate",
schema: "config",
table: "GameServerDefinition");
}
}
}
6 changes: 6 additions & 0 deletions src/Web/AdminPanel/Components/Layout/ConfigNavMenu.razor
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,16 @@
<NavLink class="dropdown-item" href="@($"edit-config/{typeof(GameConfiguration).FullName}/{this.GameConfigurationId}/hide-collections")" @onclick="() => NavigationHistory.Clear()">@Resources.General</NavLink>
<NavLink class="dropdown-item" href="@($"edit-config-grid/{typeof(MonsterDefinition).FullName}/")" @onclick="() => NavigationHistory.Clear()">@Resources.Monsters</NavLink>
<NavLink class="dropdown-item" href="@($"merchants/")" @onclick="() => NavigationHistory.Clear()">@Resources.MerchantStores</NavLink>
<NavLink class="dropdown-item" href="merchant-cockpit" @onclick="() => NavigationHistory.Clear()">
<span class="oi oi-cart" aria-hidden="true"></span> Merchant Cockpit
</NavLink>
<NavLink class="dropdown-item" href="@($"edit-config-grid/{typeof(CharacterClass).FullName}/")" @onclick="() => NavigationHistory.Clear()">@Resources.CharacterClasses</NavLink>
<NavLink class="dropdown-item" href="@($"edit-config-grid/{typeof(Skill).FullName}/")" @onclick="() => NavigationHistory.Clear()">@Resources.Skills</NavLink>
<NavLink class="dropdown-item" href="@($"edit-config-grid/{typeof(ItemDefinition).FullName}/")" @onclick="() => NavigationHistory.Clear()">@Resources.Items</NavLink>
<NavLink class="dropdown-item" href="@($"edit-config-grid/{typeof(DropItemGroup).FullName}/")" @onclick="() => NavigationHistory.Clear()">@Resources.DropItemGroups</NavLink>
<NavLink class="dropdown-item" href="batch-operations" @onclick="() => NavigationHistory.Clear()">
<span class="oi oi-cog" aria-hidden="true"></span> Operaciones por lote
</NavLink>
<NavLink class="dropdown-item" href="@($"edit-config-grid/{typeof(GameMapDefinition).FullName}/")" @onclick="() => NavigationHistory.Clear()">@Resources.GameMaps</NavLink>
<NavLink class="dropdown-item" href="@($"edit-config-grid/{typeof(MiniGameDefinition).FullName}/")" @onclick="() => NavigationHistory.Clear()">@Resources.MiniGames</NavLink>
<NavLink class="dropdown-item" href="@($"edit-config-grid/{typeof(WarpInfo).FullName}/")" @onclick="() => NavigationHistory.Clear()">@Resources.WarpList</NavLink>
Expand Down
Loading