Some checks failed
.NET Core / build (push) Has been cancelled
Break all gates + hold both switches (defenses down) -> the Crown shield drops (C1 B2 16=0). The guild master then stands on the Crown (176,212) and holds for CrownHoldDuration (default 60s, client shows a 60s countdown via C1 B2 15) to capture; capture broadcasts C1 B2 18 + golden text and sets the occupier. Losing a switch or leaving the crown resets the hold (contestable until the siege timer ends). Sinior (223) is now informational guidance. +2 tests (14 total). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
53 lines
2.4 KiB
C#
53 lines
2.4 KiB
C#
// <copyright file="ICastleSiegeStatusViewPlugIn.cs" company="MUnique">
|
|
// Licensed under the MIT License. See LICENSE file in the project root for full license information.
|
|
// </copyright>
|
|
|
|
namespace MUnique.OpenMU.GameLogic.Views.CastleSiege;
|
|
|
|
/// <summary>
|
|
/// Interface of a view which drives the client's on-map Castle Siege countdown (Season 6 protocol
|
|
/// C1 B2 17 = battle start/stop flag, C1 B2 1E = remaining hour/minute).
|
|
/// </summary>
|
|
public interface ICastleSiegeStatusViewPlugIn : IViewPlugIn
|
|
{
|
|
/// <summary>
|
|
/// Sends the siege battle start/stop flag (C1 B2 17). The client only ticks its countdown while this is set.
|
|
/// </summary>
|
|
/// <param name="started">Whether the siege battle is running.</param>
|
|
ValueTask SetBattleStateAsync(bool started);
|
|
|
|
/// <summary>
|
|
/// Sends the remaining siege time as hour/minute (C1 B2 1E) to (re)seed the countdown.
|
|
/// </summary>
|
|
/// <param name="hour">The remaining hours.</param>
|
|
/// <param name="minute">The remaining minutes.</param>
|
|
ValueTask SetTimerAsync(byte hour, byte minute);
|
|
|
|
/// <summary>
|
|
/// Sends the castle owner guild's 32-byte logo (C1 B9 02) so the client paints it onto the castle flags.
|
|
/// </summary>
|
|
/// <param name="guildLogo">The owner guild's 32-byte logo/emblem.</param>
|
|
ValueTask SetCastleFlagAsync(ReadOnlyMemory<byte> guildLogo);
|
|
|
|
/// <summary>
|
|
/// Drops (down = true) or raises (down = false) the shield/barrier over the crown (C1 B2 16).
|
|
/// The crown is only clickable/capturable while the shield is down.
|
|
/// </summary>
|
|
/// <param name="down">Whether the shield should be down.</param>
|
|
ValueTask SetCrownShieldAsync(bool down);
|
|
|
|
/// <summary>
|
|
/// Sends the crown-hold registration state (C1 B2 15): state 0 = started/in-progress (starts the client's
|
|
/// 60-second countdown), 1 = success, 2 = failed/reset.
|
|
/// </summary>
|
|
/// <param name="state">The registration state (0 progress, 1 success, 2 fail).</param>
|
|
/// <param name="accessMilliseconds">Accumulated hold time in milliseconds (client shows 60000 - this).</param>
|
|
ValueTask SetCrownRegistAsync(byte state, uint accessMilliseconds);
|
|
|
|
/// <summary>
|
|
/// Broadcasts that a guild registered the official seal / took the crown (C1 B2 18, state 1).
|
|
/// </summary>
|
|
/// <param name="guildName">The capturing guild's name (max 8 bytes).</param>
|
|
ValueTask AnnounceSealCapturedAsync(string guildName);
|
|
}
|