# Dünya Patronu Etkinliği Geliştirme Notları ve Yapılacaklar Listesi
## I. Paket Tanımları ve Yapıları (`Source/srcServer/Source/game/src/packet.h`)
- [x] `PACKET_HEADER_CG` enumuna eklenecekler:
- [x] `HEADER_CG_WORLD_BOSS_REQUEST_UI_INFO = 237`
- [x] `HEADER_CG_WORLD_BOSS_CLAIM_REWARD = 238`
- [x] `PACKET_HEADER_GC` enumuna eklenecekler:
- [x] `HEADER_GC_WORLD_BOSS_UI_UPDATE = 220`
- [x] `HEADER_GC_WORLD_BOSS_RANKING_UPDATE = 227`
- [x] `HEADER_GC_WORLD_BOSS_REWARD_RESULT = 235`
- [x] Gerekli `#pragma pack(push, 1)` ve `#pragma pack(pop)` arasına eklenecek yapılar:
- [x] `TPacketGCWorldBossUIUpdate`
- [x] `TRankingEntryWB` (Bu, `TPacketGCWorldBossRankingUpdate` içinde kullanılacak)
- [x] `TPacketGCWorldBossRankingUpdate`
- [x] `TPacketGCWorldBossRewardResult`
- [x] `TPacketCGWorldBossRequestUIInfo`
- [x] `TPacketCGWorldBossClaimReward`
- [x] `packet.h` dosyasına `#include "stdafx.h"` ve `#include <cstdint>` eklendi, `<windows.h>` kaldırıldı, `../../common/tables.h` include yolu düzeltildi.
- [x] Çakışan paket numaraları giderildi.
- [x] **Not (Kaldırılan Paketler):**
- `HEADER_GC_WORLD_BOSS_ANNOUNCE` başlığı ve `TPacketGCWorldBossAnnounce` yapısı, standart duyuru mekanizmalarının (`BroadcastNotice` vb. aracılığıyla `CWorldBossManager::Announce`) kullanılması kararıyla kaldırılmıştır.
- `TPacketGCWorldBossAffectQuestInfo` yapısı ve ilgili olası başlık (örn: `HEADER_GC_WORLD_BOSS_AFFECT_QUEST_INFO`), gereksiz bulunarak `packet.h'den kaldırılmıştır. Görevle ilgili bilgiler standart yollarla veya diğer özel paketler aracılığıyla iletilecektir.
- [x] `EWorldBossRewardResultCodes` enum'u eklendi.
## II. Paket İşleyiciler (İstemciden Sunucuya) (`Source/srcServer/Source/game/src/input_main.cpp` ve `input.h`)
- [x] `CInputMain::Analyze` fonksiyonuna `HEADER_CG_WORLD_BOSS_REQUEST_UI_INFO` ve `HEADER_CG_WORLD_BOSS_CLAIM_REWARD` için `case`'ler eklendi.
- [x] `CInputMain` sınıf tanımına (`input.h`) `WorldBossRequestUIInfo(LPCHARACTER ch, const char* c_pData)` ve `WorldBossClaimReward(LPCHARACTER ch, const char* c_pData)` fonksiyon prototipleri eklendi.
- [x] Bu iki fonksiyonun tanımları `input_main.cpp`'ye eklendi ve içleri `CWorldBossManager::instance().HandleRequestUIInfo(ch);` ve `CWorldBossManager::instance().HandleClaimReward(ch, (TPacketCGWorldBossClaimReward*) c_pData);` çağrılarıyla güncellendi.
- [x] `input_main.cpp` dosyasının başına `#include "world_boss_manager.h"` eklendi.
## III. Paket İşleyiciler (DB'den Sunucuya) (`Source/srcServer/Source/game/src/input_db.cpp` ve `input.h`)
- [x] `CInputDB` sınıf tanımına (`input.h`) `void WorldBossClaimRewardResult(LPCHARACTER ch, const char* c_pData);` prototipi eklendi.
- [x] `input_db.cpp` dosyasının başına `#include "world_boss_manager.h"` eklendi.
- [x] `CInputDB::Analyze` fonksiyonuna `HEADER_DG_WORLD_BOSS_CLAIM_REWARD_RESULT` için `case` bloğu eklendi.
- [x] `input_db.cpp` dosyasına `void CInputDB::WorldBossClaimRewardResult(LPCHARACTER ch, const char* c_pData)` fonksiyonunun implementasyonu eklendi. Bu fonksiyon `CWorldBossManager::instance().HandlePacket_DB_ClaimRewardResult(pkPlayer, pInfo);` çağrısını yapıyor.
## IV. Game <-> DB İletişim Paketleri (`Source/srcServer/Source/common/tables.h`)
- [x] `GD_HEADERS` enumuna eklenecek: `HEADER_GD_WORLD_BOSS_CLAIM_REWARD_REQUEST = 185`
- [x] `DG_HEADERS` enumuna eklenecek: `HEADER_DG_WORLD_BOSS_CLAIM_REWARD_RESULT = 215`
- [x] Dosyanın sonuna eklenecek yapılar:
- [x] `TPacketGDWorldBossClaimRewardRequest` (içinde `player_id`, `boss_vnum`, `rank`)
- [x] `TPacketDGWorldBossClaimRewardResult` (içinde `player_id`, `result_code`. Item bilgisi buradan çıkarıldı, game server karar verecek.)
- [x] Çakışan numaralar düzeltildi.
## V. DB Sunucusu Paket İşleme (`Source/srcServer/Source/db/src/ClientManager.h` ve `ClientManager.cpp`)
- [x] `ClientManager.h`: `QUERY_WORLD_BOSS_CLAIM_REWARD_REQUEST` ve `RESULT_WORLD_BOSS_CLAIM_REWARD_REQUEST` fonksiyon prototipleri eklendi.
- **NOT:** `ClientManager.cpp` içerisinde bu fonksiyonlar `_REQUEST` eki olmadan (`QUERY_WORLD_BOSS_CLAIM_REWARD` ve `RESULT_WORLD_BOSS_CLAIM_REWARD`) tanımlanmış ve çağrılmıştır. Fonksiyonel olarak sorun yaratmasa da ileride tutarlılık için düzeltilebilir.
- [x] `ClientManager.cpp`: Başına `WorldBossClaimInfo` struct tanımı eklendi.
- [x] `ClientManager.cpp`: `CClientManager::ProcessPackets` içine `HEADER_GD_WORLD_BOSS_CLAIM_REWARD_REQUEST` için `case` bloğu eklendi ve `QUERY_WORLD_BOSS_CLAIM_REWARD` çağrısı yapıldı.
- [x] `ClientManager.cpp`: `QUERY_WORLD_BOSS_CLAIM_REWARD` fonksiyonu implemente edildi (`INSERT IGNORE` sorgusu, `QID_WORLD_BOSS_CLAIM_REWARD_REQUEST` kullanımı).
- [x] `ClientManager.cpp`: `CClientManager::AnalyzeQueryResult` içine `QID_WORLD_BOSS_CLAIM_REWARD_REQUEST` için `case` bloğu eklendi ve `RESULT_WORLD_BOSS_CLAIM_REWARD` çağrısı yapıldı.
- [x] `ClientManager.cpp`: `RESULT_WORLD_BOSS_CLAIM_REWARD` fonksiyonu implemente edildi (DB sorgu sonucu işleme, `TPacketDGWorldBossClaimRewardResult` hazırlama ve gönderme, `WorldBossClaimInfo` silme).
- [x] `QID.h`: `QID_WORLD_BOSS_CLAIM_REWARD_REQUEST` tanımı eklendi.
## VI. Veritabanı Tablosu (`player` şeması)
- [x] `world_boss_player_rewards` adında yeni bir tablo oluşturuldu.
- Sütunlar: `player_id (INT UNSIGNED, PK)`, `boss_vnum_claimed (INT UNSIGNED, PK)`, `claimed_rank (SMALLINT UNSIGNED)`, `claimed_at (DATETIME)`
- Birincil anahtar: `(player_id, boss_vnum_claimed)`
## VII. Etkinlik Yöneticisi Sınıfı (`Source/srcServer/Source/game/src/world_boss_manager.h` ve `world_boss_manager.cpp`)
- [x] `world_boss_manager.h` ve `world_boss_manager.cpp` dosyaları oluşturuldu.
- [x] `CWorldBossManager` sınıfı (singleton) tanımlandı.
- [x] `world_boss_manager.h'ye eklenecekler:
- [x] `EWorldBossEventState` enum (STATE_INACTIVE, STATE_WAITING_FOR_SPAWN, STATE_BOSS_ACTIVE, STATE_COOLDOWN).
- [x] `FWorldBossSpawnPoint` struct (map_index, x, y).
- [x] `FWorldBossInfo` struct (vnum, name, spawn_points list, max_hp).
- [x] `FWorldBossRankReward` struct (item_vnum, item_count).
- [x] Gerekli STL include'ları (`<vector>`, `<map>`, `<string>`, `<ctime>`, `<set>`).
- [x] Üye değişkenler (özetle):
- [x] Yapılandırma: `m_vecBossInfos`, `m_dwMinSpawnIntervalSeconds`, `m_dwMaxSpawnIntervalSeconds`, `m_dwBossActiveDurationSeconds`, `m_dwBossNoDamageDespawnSeconds`, `m_dwEventCooldownSeconds`, `m_mapRankRewards`, `m_dwMinDamageForQuest`, `m_dwQuestBuffVnum`, `m_dwQuestBuffDurationSeconds`.
- [x] Çalışma Zamanı: `m_currentState`, `m_tNextStateChangeTime`, `m_pkCurrentBoss`, `m_dwCurrentBossVnum`, `m_currentBossSpawnPoint`, `m_tBossSpawnTime`, `m_tLastDamageTime`, `m_dwLastKilledBossVnumForReward`, `m_tLastBossKillTime`.
- [x] Oyuncu Takibi/Sıralama: `m_mapPlayerTotalDamage`, `m_mapPlayerNames`, `m_mapPlayerGuildNames`, `m_mapPlayerEmpires`, `m_vecCachedRanking`, `m_wLastRankingPlayerCount`, `m_setPlayersRequestedRewardThisCycle`, `m_mapPlayerFightDuration`, `m_mapPlayerFirstHitTime`.
- [x] Fonksiyon prototipleri (özetle): `Initialize`, `Destroy`, `Update`, `HandleRequestUIInfo`, `HandleClaimReward`, `SpawnBossInternal`, `KillBoss`, `OnBossDamaged`, `HandleBossDespawn`, `Announce`, `LoadConfig`, `ScheduleNextSpawn`, `UpdateRankingCache`, `ResetEventStateForNewCycle`, `GetBossInfo`, `SendUIToPlayer`, `SendRankingToPlayer`, `SendRewardResultPacket`, `HandlePacket_DB_ClaimRewardResult`.
- [x] `world_boss_manager.cpp'ye eklenecekler:
- [x] Gerekli `#include` direktifleri eklendi.
- [x] Constructor: Üye değişkenlere varsayılan değerler atandı.
- [x] `Initialize()`: Yapılandırmayı yükler (`LoadConfig`), ilk boss belirme zamanını ayarlar (`ScheduleNextSpawn`). `bool` dönüş tipi.
- [x] `Destroy()`: (Henüz implemente edilmedi, gerekirse event temizliği yapılabilir)
- [x] `Update()`: Ana döngü, durumları kontrol eder, event'leri tetikler.
- [x] `LoadConfig()`: Ayarlar şimdilik C++ içinde sabit olarak tanımlanmıştır.
- [x] `ScheduleNextSpawn()`: Bir sonraki boss'un ne zaman ve hangisinin çıkacağını belirler.
- [x] `SpawnBossInternal()`: Seçilen boss'u haritada spawn eder, duyuru yapar, durumu ve zamanlayıcıları ayarlar.
- [x] `OnBossKilled(LPCHARACTER pkKiller, LPCHARACTER pkVictim)`: (Artık `KillBoss(LPCHARACTER pkKiller)` içinde ele alınıyor)
- [x] `OnBossDamaged(LPCHARACTER pkAttacker, LPCHARACTER pkVictim, int iDamage)`: Oyuncu boss'a hasar verdiğinde çağrılır. Hasar takibi yapar, `UpdateRankingCache()` çağırır, hasar veren oyuncuya `SendUIToPlayer()` ile UI güncellemesi gönderilir, ilk vuruşta duyuru yapar.
- [x] `HandleRequestUIInfo(LPCHARACTER ch)`: İstemciden gelen UI bilgi isteğini işler. `SendUIToPlayer(ch)` ve `SendRankingToPlayer(ch)` çağırır.
- [x] `HandleClaimReward(LPCHARACTER ch, TPacketCGWorldBossClaimReward* pPacket)`: İstemciden gelen ödül alma isteğini işler. Zaman, mükerrer istek, sıralama ve ödül tanımı kontrolleri yapar. Uygunsa DB'ye `TPacketGDWorldBossClaimRewardRequest` gönderir.
- [x] `HandlePacket_DB_ClaimRewardResult(LPCHARACTER pkPlayer, TPacketDGWorldBossClaimRewardResult* pInfo)`: DB'den gelen ödül sonucunu işler. Başarılıysa oyuncuya `AutoGiveItem` ile item verir ve `SendRewardResultPacket` ile sonucu bildirir.
- [x] `SendUIToPlayer(LPCHARACTER ch)`: Belirli bir oyuncuya `TPacketGCWorldBossUIUpdate` paketini gönderir.
- [x] `SendRankingToPlayer(LPCHARACTER ch)`: Belirli bir oyuncuya `TPacketGCWorldBossRankingUpdate` paketini gönderir.
- [x] `SendRewardResultPacket(LPCHARACTER ch, BYTE bResultCode, DWORD dwItemVnum = 0, BYTE bItemCount = 0)`: Oyuncuya `TPacketGCWorldBossRewardResult` paketini gönderir.
- [x] `Announce(const char* format, ...)`: Genel duyuru yapar. Standart `BroadcastNotice` ve `BroadcastBigNotice` kullanır.
- [x] `UpdateRankingCache()`: `m_mapPlayerTotalDamage` üzerinden sıralamayı hesaplar ve `m_vecCachedRanking`'e kaydeder.
- [x] `ResetEventStateForNewCycle()`: Mevcut boss ile ilgili oyuncu takip state'lerini temizler.
- [x] `GetBossInfo(DWORD dwBossVnum)`: Verilen vnum için boss yapılandırmasını döndürür.
- [x] `KillBoss(LPCHARACTER pkKiller)`: Boss öldüğünde çağrılır. Duyuru yapar. `m_dwLastKilledBossVnumForReward` ve `m_tLastBossKillTime`'ı ayarlar. `m_pkCurrentBoss` nulllanır. Durumu `STATE_COOLDOWN` yapar ve `m_tNextStateChangeTime` ile bir sonraki döngüyü planlar. `m_setPlayersRequestedRewardThisCycle`'ı temizler.
- [x] `HandleBossDespawn(bool bEscaped)`: Boss kaçtığında veya manuel kaldırıldığında çağrılır. Duyuru yapar (eğer kaçtıysa). Boss karakterini oyundan kaldırır. `m_pkCurrentBoss` nulllanır. Durumu `STATE_COOLDOWN` yapar ve `m_tNextStateChangeTime` ile bir sonraki döngüyü planlar.
- [x] Event fonksiyonları yerine `Update()` metodu ana döngüden çağrılıyor ve zaman bazlı durum geçişlerini yönetiyor.
## VIII. Global Entegrasyon (`main.cpp`, `battle.cpp` vb.)
- **`main.cpp` (veya eşdeğeri):**
- [x] Başına `#include "world_boss_manager.h"` eklendi.
- [x] `start()` fonksiyonu içine, diğer manager'lardan sonra `CWorldBossManager::instance().Initialize();` çağrısı eklendi.
- [x] `heartbeat()` fonksiyonu içine (veya ana oyun döngüsüne) `CWorldBossManager::instance().Update(pulse);` çağrısı eklendi.
- **`battle.cpp` (veya karakter hasar/ölüm mekaniklerinin işlendiği yer):**
- [x] Boss hasar aldığında `CWorldBossManager::instance().OnBossDamaged(ch, victim, damage);` çağrısının eklenmesi.
- [x] Boss öldüğünde `CWorldBossManager::instance().KillBoss(ch_who_killed_boss);` çağrısının eklenmesi.
## IX. Yapılandırma Dosyası (`worldboss.txt`) [ERTELENDİ/SABİT]
- **Not:** Ödüller ve boss ayarları şimdilik C++ (`CWorldBossManager::LoadConfig()`) içinde sabit olarak tanımlanmıştır. Harici dosyadan okuma ve `/reload_worldboss_config` gibi bir komutla yeniden yükleme özelliği **şimdilik ertelenmiştir**. Gelecekte eklenebilir.
- [ ] Örnek bir `worldboss.txt` dosyası formatı düşünülmüştü (yukarıdaki eski maddede görülebilir) ancak implementasyonu yapılmadı.
## X. İstemci Tarafı (`root/uiworldboss.py`, `root/uiworldbossranking.py`, `localeInfo.py` vb.)
- [x] `uiworldboss.py` ve `uiworldbossranking.py` arayüzleri hazırlandı.
- [x] `localeInfo.py`, `locale_game.txt`, `locale_interface.txt` güncellemeleri yapıldı.
- [x] `WORLD_BUSS_REWARD_BUTTON` -> `WORLD_BOSS_REWARD_BUTTON` düzeltmesi yapıldı.
- [x] Python 2 `print` ifadeleri Python 3 stiline (`print()`) dönüştürüldü.
- [ ] Arayüzlerin Sunucudan Gelen Paketleri İşlemesi:
- [ ] `uiworldboss.py`: `TPacketGCWorldBossUIUpdate` paketini alıp arayüzü güncelleyecek fonksiyonlar.
- [ ] `uiworldboss.py`: `TPacketGCWorldBossRewardResult` paketini alıp sonucu gösterecek fonksiyonlar.
- [ ] `uiworldbossranking.py`: `TPacketGCWorldBossRankingUpdate` paketini alıp sıralamayı güncelleyecek fonksiyonlar.
- [ ] İstemci tarafında `game.py` veya ilgili network modülünde yeni GC paketleri için işleyici yönlendirmeleri yapılacak.
- [ ] Sunucuya Paket Gönderimi:
- [ ] `uiworldboss.py`'den `HEADER_CG_WORLD_BOSS_REQUEST_UI_INFO` gönderme (pencere açıldığında veya periyodik olarak).
- [ ] `uiworldboss.py`'den `HEADER_CG_WORLD_BOSS_CLAIM_REWARD` gönderme ("Ödülü Al" butonu).
- [x] **Duyurular:** Standart sohbet (`CHAT_TYPE_NOTICE` vb.) üzerinden gelen duyurular zaten istemci tarafından işleniyor.
## XI. Görev Entegrasyonu (`quest`)
- [x] `locale_quest.txt` ve `locale_string.txt` dosyalarında ilgili metinler mevcut.
- [ ] Sunucu tarafı quest fonksiyonları (`world_boss_plugin.quest` veya benzeri):
- [ ] `world_boss.is_active()`: Etkinliğin aktif olup olmadığını kontrol eder.
- [ ] `world_boss.get_player_damage(player_id)`: Oyuncunun mevcut boss'a verdiği hasarı döndürür.
- [ ] `world_boss.can_claim_quest_reward(player_id)`: Oyuncunun görev ödülünü (buff) alıp alamayacağını kontrol eder (min hasar şartı vb.).
- [ ] `world_boss.set_quest_reward_claimed(player_id)`: Oyuncunun görev ödülünü aldığını işaretler.
- [ ] `world_boss.get_current_boss_vnum()`: Mevcut boss'un vnum'unu döndürür.
- [ ] Görev script'i (`.quest` dosyası):
- [ ] Dünya patronu görevinin mantığını içerecek (minimum hasar, buff verme, tekrarlanabilirlik kontrolü).
- [ ] `CWorldBossManager` ile etkileşim için Lua'ya açılan fonksiyonları kullanacak.
## XII. Test ve Dengeleme
- [ ] Tüm sistemin baştan sona test edilmesi.
- [ ] Boss zorlukları, spawn süreleri, ödül miktarları gibi parametrelerin dengelenmesi.
- [ ] Olası exploit ve bug'ların kontrol edilmesi.
---
Son Değişiklikler:
- `HEADER_GC_WORLD_BOSS_ANNOUNCE` ve `TPacketGCWorldBossAnnounce` kaldırıldı.
- `TPacketGCWorldBossAffectQuestInfo` yapısı kaldırıldı.
- `TPacketDGWorldBossClaimRewardResult` yapısından item bilgisi çıkarıldı (ödül kararı game server'da).
- `input_db.cpp` içine `HEADER_DG_WORLD_BOSS_CLAIM_REWARD_RESULT` işleyicisi eklendi.
- `CWorldBossManager` içindeki `HandleClaimReward`, `HandlePacket_DB_ClaimRewardResult` ve `SendRewardResultPacket` fonksiyonları güncellendi.
- Ödül ve boss yapılandırmasının şimdilik `CWorldBossManager::LoadConfig()` içinde sabit kalmasına karar verildi.
**`battle.cpp` / `char_battle.cpp` (Hasar ve Ölüm Mekanikleri):**
- [x] `battle.cpp`: Başına `#include "world_boss_manager.h"` eklendi.
- [x] `battle.cpp`: `battle_hit` fonksiyonu içine, boss'a hasar verildiğinde `CWorldBossManager::instance().OnBossDamaged(pkAttacker, pkVictim, iRetDam);` çağrısı (VID kontrolü ile) eklendi.
- [x] `world_boss_manager.h` ve `.cpp`: `GetCurrentBossVID()` yardımcı fonksiyonu eklendi.
- [x] `char_battle.cpp`: Başına `#include "world_boss_manager.h"` eklendi.
- [x] `char_battle.cpp`: `CHARACTER::Dead` fonksiyonu içine, ölen karakter boss ise `CWorldBossManager::instance().KillBoss(this);` çağrısı (VID kontrolü ile) eklendi.
## IX. Yapılandırma Dosyası (`worldboss.txt`) [ERTELENDİ/SABİT]
- **Not:** Ödüller ve boss ayarları şimdilik C++ (`CWorldBossManager::LoadConfig()`) içinde sabit olarak tanımlanmıştır. Harici dosyadan okuma ve `/reload_worldboss_config` gibi bir komutla yeniden yükleme özelliği **şimdilik ertelenmiştir**. Gelecekte eklenebilir.
- [ ] Örnek bir `worldboss.txt` dosyası formatı düşünülmüştü (yukarıdaki eski maddede görülebilir) ancak implementasyonu yapılmadı.