Commit Graph

103 Commits

Author SHA1 Message Date
sven-n
d22ec20a04 Merge pull request #825 from eduardosmaniotto/feature/configurable-npc-buffs
feature: configurable npc buffs
(cherry picked from commit 6a061fcad756e644dadf3721e84e3cce2a25bceb)
2026-07-23 11:37:22 +03:00
sven-n
ed32ebdfd3 Merge pull request #827 from Rhefew/feature/ip-connection-limit
feat(plugins): implement customizable maximum concurrent connections

(cherry picked from commit 0e30df9ae22a265c3486dea1eba259567631eb87)
2026-07-23 11:35:43 +03:00
sven-n
77df5d1145 Merge pull request #828 from Rhefew/feature/admin-account-search
feat(admin): add account & character search to accounts page

(cherry picked from commit 75a435d7d3ac424f32a271c5275eac102881a80a)
2026-07-23 11:35:43 +03:00
sven-n
e9aec9540f Merge pull request #830 from valentinoConti/fix/modals-crashing-app
Fix modals making app crash

(cherry picked from commit 55ac67312448f4d851c44a1c77734703c9b1d3dd)
2026-07-23 11:35:43 +03:00
Acentech Dev
a76647265c docs(packets): add TvT scoreboard packet documentation
Some checks failed
.NET Core / build (push) Has been cancelled
2026-07-23 10:54:13 +03:00
Acentech Dev
107513aeb0 feat(tvt): scoreboard shows up to 10 players (was 8) 2026-07-21 22:42:25 +03:00
Acentech Dev
49ffa5bd89 fix(tvt): count event kills, respawn on the game's own map, end-ceremony countdown
- Kills now credited from OnDeathAsync (the AfterKilledPlayerAsync/PK path is skipped when
  AllowPlayerKilling is true, so event kills never reached the scoreboard).
- Respawn after death now stays on the mini-game's OWN map instance (older-client path fetched the
  shared world map of the same number -> respawned player saw no statues/participants).
- On game end: announce the winner + run a 60s ceremony broadcast loop sending phase-3 HUD countdown
  and the final scoreboard until the Lorencia teleport.
2026-07-21 16:57:12 +03:00
Acentech Dev
538189ea7c feat(tvt): per-character scoreboard (kills, statues, statue damage)
Server: new 0xFD HeykelSavasiScoreboard packet + view plugin; HeykelSavasiContext tracks per-player
kills (Player.AfterKilledPlayerAsync hook), statues broken (OnDestructibleDied), and statue damage
(AttackableNpcBase.AttackByAsync hook); broadcast top-8 by damage (desc) every ~1s, omitting zero-damage
characters.
2026-07-21 16:34:15 +03:00
Acentech Dev
586590e06f feat(tvt): test-phase statue HP override, stationary guards, in-game rename
- Statue HP overridden to 100k at spawn (MaximumHealthOverride) for the test phase - no DB change.
- Guards made fully stationary by overriding their definition's IntelligenceTypeName to
  NullMonsterIntelligence at runtime (no wander, no chase); no DB change.
- Statue/guard in-game names rebranded to 'TvT Statue' / 'TvT Guard' (runtime designation override).
2026-07-21 16:19:07 +03:00
Acentech Dev
a2119b272e feat(tvt): 4 arena bosses at 3 statues, robust guard/boss spawn, reliable GM restart, English strings
- Bosses: 306/309/357/459 spawn once at (55,42)/(32,42)/(31,59)/(56,58) after 3 total statues broken.
- Guards/bosses spawn in a walkable BOX (retry) instead of a fixed point; several statue-guard
  offsets landed on non-walkable terrain and silently failed, leaving statues unbreakable.
- Guard-alive gate uses the ACTUAL spawned count so a statue can always reach 0 -> breakable.
- HeykelSavasiStartPlugIn.OnStartedAsync force-disposes a lingering finished context so GM /starths
  restarts the event immediately (no server restart).
- Statue-break + join messages translated to English.
2026-07-21 15:40:45 +03:00
Acentech Dev
bd5cda12dd fix(minigame): GM ForceStart bypasses the previous-run TaskDuration guard
A forced start (e.g. /starths) was blocked for the whole TaskDuration after a
run even though the event had already ended, so re-starting needed a server
restart. ForceStart now skips the 'previous event still running' guard;
scheduled auto-starts still respect it.
2026-07-21 15:02:45 +03:00
Acentech Dev
0f9db37a92 feat(hs): all statues visible at fixed coords, guard-gated, any-order break with counter+killer message
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-21 14:54:43 +03:00
Acentech Dev
a76708c899 chore(hs): statue spawn coordinate message in English 2026-07-21 13:27:37 +03:00
Acentech Dev
ae68e15f77 feat(hs): announce statue spawn coordinates as yellow center message to event players 2026-07-21 13:25:02 +03:00
Acentech Dev
d41d46f24f chore(hs): rename event display name 'Heykel Savasi' -> 'TvT Event' (strings only)
Display strings/messages/designations changed everywhere (Name, entrance
messages, NPC designation, HUD title). Code identifiers/namespaces/commands
unchanged. DB rows updated separately.
2026-07-21 13:01:36 +03:00
Acentech Dev
7312b0e20d fix(minigame): announce entrance-opened for sub-minute registration windows
SendOpenedNotificationsAsync only looped per full minute, so a <1min entrance
(e.g. a 30s test window) sent no golden 'event opened' notification. Now sends
one up front when TotalMinutes==0. >=1min windows unchanged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-21 12:55:00 +03:00
Acentech Dev
e45ad4f8d7 feat(hs): spawn statues+guards at random walkable spots (hunt-the-statue)
Instead of a fixed lane, each statue (and its 4 guards) now spawns at a random
walkable coordinate anywhere on the map; breaking one reveals the next at a new
random spot, so players must search for it. Falls back to the fixed positions.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-21 12:35:17 +03:00
Acentech Dev
fcf2e80570 feat(hs): disable monster transform (EventFormSkin=0); team look via client cape override 2026-07-21 11:16:50 +03:00
Acentech Dev
1e8478fe70 feat(hs): raise statue HP, transform players in-battle, per-player team roster packet, drop wing-unequip
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-21 10:25:07 +03:00
Acentech Dev
7aae9dff0c feat(hs): disable wings in-event + periodic HUD-state packet/broadcast
- HeykelSavasiContext.IsItemAllowedToEquip disallows wings/capes during
  Playing only (so entry is never rejected for wearing wings); auto-unequips
  any equipped wing/cape into a free inventory slot in OnGameStartAsync.
- New S2C packet HeykelSavasiHudState (C1, code FB, length 11) carrying
  phase, team, counts, statue progress and remaining seconds, plus its view
  plugin/interface, broadcast once per second across registration/prep/
  battle and one-shot on join/statue-break/game-end.
2026-07-21 03:16:29 +03:00
Acentech Dev
5750ab6511 fix(hs): no PvP before battle + clean team assignment on leave
#1: block all player-vs-player damage while State != Playing (registration/
prep), keep same-team friendly-fire off during battle. Prevents pre-battle
kills (which also caused deaths to route to Lorencia instead of a base).
#3: remove a player from their team on OnObjectRemovedFromMapAsync (real
leave to another map), not on same-map death-respawn, so team counts stay
accurate and re-joining works.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-21 02:18:49 +03:00
Acentech Dev
a174c1a29f fix(hs): robust team-base gate selection by Y-position (not exact coords)
GetTeamSpawnGate matched gates by exact X1/Y1 anchors, which threw
'Sequence contains no matching element' when the DB gate coords drifted a
tile from the code anchors. Now selects the two spawn gates by Y-order
(red=top, blue=bottom) so it works regardless of exact coordinates.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-21 01:53:58 +03:00
Acentech Dev
583df657fb feat(hs): web-applicable update plugin for the Heykel Savasi event
AddHeykelSavasiEventUpdateSeason6 (version 100): adds map 92 + terrain,
statue/guard monsters, red/blue base gates, event NPC 560 in Lorencia, and
the mini-game definition to an EXISTING config via the admin Updates page
(no DB wipe). Reuses HeykelSavasiMap/HeykelSavasiInitializer; idempotent.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-21 01:22:51 +03:00
Acentech Dev
917831e198 feat(hs): import LoL map (server 92 / World93) + real base & statue coords
- Embed Terrain93.att (server map No 92 -> loads Terrain93); map Number 90->92.
- Real walkable coords from the LoL arena diamond (center lane x=42):
  Red base (42,10) top tip, Blue base (42,92) bottom tip; 7 statues per team along x=42.
- Client World93 + Object93 deployed to PC client separately.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-21 01:18:54 +03:00
Acentech Dev
790d944757 docs(hs): generated packet docs for HeykelSavasi FA packets
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-21 00:58:44 +03:00
Acentech Dev
e6e93450b7 fix(hs): make statues immune to friendly (same-team) damage
A player could destroy their own team's Heykel Savasi statue: the win-condition
attribution (OnDestructibleDied) trusts geometry alone (attacker = Opponent of
defender), and the old friendly-fire guard only covered Player targets, not
Destructible statues. Block same-team damage at the NPC damage intake instead
so only the enemy team can ever land a hit on a statue.
2026-07-21 00:57:15 +03:00
Acentech Dev
e0fafe7e03 feat(hs): /starths force-start command + /hsteam GM test-join command 2026-07-21 00:44:00 +03:00
Acentech Dev
b674e5a2cb feat(hs): periodic scheduled start plugin + config + state
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-21 00:38:57 +03:00
Acentech Dev
5f03a011db feat(hs): grant fixed Zen to winning team at game end 2026-07-21 00:34:08 +03:00
Acentech Dev
83cb9b9fe4 feat(hs): team-base respawn + reapply earned buffs on respawn
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-21 00:25:44 +03:00
Acentech Dev
89aef08bed feat(hs): block friendly-fire within the same team 2026-07-21 00:19:43 +03:00
Acentech Dev
ceacc11446 feat(hs): apply mapped class buffs to team on statue break 2026-07-21 00:15:52 +03:00
Acentech Dev
712773c332 feat(hs): sequential statue spawn + guard mobs + win detection
Adds HeykelSavasiContext runtime logic for Task 4.2: per-team statue
break progress/winner tracking (extracted into a pure, testable
StatueProgressState), OnDestructibleDied wiring against the base
MiniGameContext's existing Destructible->Died auto-subscription, and
SpawnStatueAsync which spawns the next statue (561) + 4 guards (580)
via the map initializer using placeholder line-of-statues coordinates.
OnGameStartAsync now spawns each team's first statue after the warp.
2026-07-21 00:07:00 +03:00
Acentech Dev
32e05e2bc1 feat(hs): define statue (destructible) + guard monster definitions 2026-07-20 23:52:34 +03:00
Acentech Dev
372929a8d1 fix(hs): roll back team reservation if TryEnterAsync throws 2026-07-20 23:48:36 +03:00
Acentech Dev
cd55e726f1 feat(hs): team-select handler + join action with atomic balance reserve and base warp 2026-07-20 23:42:07 +03:00
Acentech Dev
7e954b610f feat(hs): NPC talk plugin opens team panel when registration is open 2026-07-20 23:33:55 +03:00
Acentech Dev
2efe1ef84d feat(hs): view plugin to open team-select panel 2026-07-20 23:28:04 +03:00
Acentech Dev
f5e1f46444 feat(hs): add open-team-panel (S2C) and team-select (C2S) packets 2026-07-20 23:22:33 +03:00
Acentech Dev
cc0b7abb44 feat(hs): add event NPC 560 and place it in Lorencia
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-20 23:15:52 +03:00
Acentech Dev
5bc5f461e5 feat(hs): warp teams to base on start + cancel if a team is empty
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-20 23:09:39 +03:00
Acentech Dev
8295c30b71 feat(hs): wire HeykelSavasiContext in GetMiniGameAsync + team gate resolver 2026-07-20 23:04:21 +03:00
Acentech Dev
968eb0c155 feat(hs): HeykelSavasiContext team tracking + balance rule
Adds the HeykelSavasiTeam enum (None/Red/Blue) and the HeykelSavasiContext
skeleton (subclass of MiniGameContext) with team registration
(AssignTeam/GetTeam/PlayersOf/TeamCount) and a join-balance rule
(|Red-Blue| <= 2 after the prospective join), exposed as a pure static
IsJoinAllowed for fast unit testing without constructing the full context.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-20 22:59:15 +03:00
Acentech Dev
5d0f475472 feat(hs): add HeykelSavasi MiniGameDefinition initializer 2026-07-20 22:44:38 +03:00
Acentech Dev
b90013c4bb feat(hs): add MiniGameType.HeykelSavasi 2026-07-20 22:41:00 +03:00
Acentech Dev
732196f623 feat(hs): add red/blue base exit gates on Heykel Savasi map 2026-07-20 22:38:20 +03:00
Acentech Dev
5a354fb419 feat(hs): add Heykel Savasi event map skeleton (map 90)
Adds HeykelSavasiMap (BaseMapInitializer, Number=90/World91) as an empty
terrain-only skeleton and registers it in GameMapsInitializer. Statue/guard
monster definitions and spawns are added by later Heykel Savasi tasks.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-20 22:31:46 +03:00
Acentech Dev
3d5d40b753 Add Warrior Wings & Cape (12/242-247)
Some checks failed
.NET Core / build (push) Has been cancelled
Six high-tier imported wings, one per class line: Wizard (242, Soul Master),
Magic (243, Duel Master), Elf (244, High Elf), Summoner (245, Dimension Master),
Warrior Cape (246, Lord Emperor + Fist Master) and Knight (247, Blade Master).
Each: base defense + defense-per-level, 3rd Wing Options, damage increase and
fast flight. Applied via update v99 (AddWarriorWingsUpdateSeason6), reusing the
shared "3rd Wing Options" option set to avoid Guid collisions.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 23:27:22 +03:00
Acentech Dev
1cadaa08ab fix(items): reuse shared 3rd Wing Options + level tables for Poison wings (avoid Guid collision) 2026-07-19 18:36:38 +03:00
Acentech Dev
3e8cd8fdae feat(items): Poison Wing/Cape as high-tier wings (defense + options + level bonuses)
Switch from the basic CreateWing overload to the full one: base
defense 65/60, defense-per-level, wing options (HP recover / phys
damage / defense), damage increase, fast flight. Level req 100.
2026-07-19 18:14:46 +03:00