gemini pro yazdı
"Kullanim 1: /lonca_cagir hepsini");
grup toplu cagir baskanın yanına
"Kullanim 1: /gisnla hepsini");
bireysel
"Kullanim: /oyuncu_cagir <Karakter_Ismi>");
"Kullanim: /oyuncuya_git <Karakter_Ismi>");
"Kullanim: /arkadasa_git <Karakter_Ismi>");
"Kullanim: /arkadas_cagir <Karakter_Ismi>");
yapay zeka sadece arkdasda calissin ozelliği eklemiş ama test edince çalışmadı normal oyunculardada istek gönderiyor.
Kod:
Kod:
1. Grup Işınlama Komutları
Bu komutlar grup içindeki yardımlaşmayı sağlar.- Said'i Yanına Çağırmak İçin:/g_cagir Said(Said'in ekranında: "keke seni yanına çağırıyor. Gitmek istiyor musun?" penceresi açılır.)
- Said'in Yanına Gitmek İçin:/g_git Said(Said'in ekranında: "keke senin yanına gelmek istiyor. Onaylıyor musun?" penceresi açılır.)
- Grubu Said'in Yanında Toplamak (Sadece Lider):/g_toplan Said(Gruptaki herkesin ekranında: "Lider herkesin Said'in yanında toplanmasını istiyor. Gidilsin mi?" penceresi açılır.)
2. Arkadaş Işınlama Komutları
Bu komutlar yalnızca Said arkadaş listende ekliyse çalışır.- Arkadaşın Said'i Yanına Çağırmak:/arkadas_cagir Said(Eğer Said arkadaşın değilse: "Hata: Said senin arkadaş listende ekli değil!" uyarısı alırsın.)
- Arkadaşın Said'in Yanına Gitmek:/arkadasa_git Said(Said onay verirse otomatik olarak onun yanına ışınlanırsın.)
3. Lonca Işınlama Komutları
Bu komutlar lonca içi koordinasyon içindir.- Lonca Üyesi Said'i Yanına Çağırmak:/l_cagir Said(Said aynı loncadaysa ona çağrı isteği gönderir.)
- Lonca Üyesi Said'in Yanına Gitmek:/l_git Said(Said'in yanına gitmek için ondan izin istersin.)
- Loncayı Said'in Yanında Toplamak (Sadece Lonca Başkanı):/l_toplan Said(Loncada o an çevrimiçi olan tüm üyelere Said'in yanına gitme teklifi gider.)
"Kullanim 1: /lonca_cagir hepsini");
grup toplu cagir baskanın yanına
"Kullanim 1: /gisnla hepsini");
bireysel
"Kullanim: /oyuncu_cagir <Karakter_Ismi>");
"Kullanim: /oyuncuya_git <Karakter_Ismi>");
"Kullanim: /arkadasa_git <Karakter_Ismi>");
"Kullanim: /arkadas_cagir <Karakter_Ismi>");
yapay zeka sadece arkdasda calissin ozelliği eklemiş ama test edince çalışmadı normal oyunculardada istek gönderiyor.
Kod:
game.oy
def __ServerCommand_Build(self):
serverCommandList={
"ConsoleEnable" : self.__Console_Enable,
"DayMode" : self.__DayMode_Update,
"PRESERVE_DayMode" : self.__PRESERVE_DayMode_Update,
"CloseRestartWindow" : self.__RestartDialog_Close,
"OpenPrivateShop" : self.__PrivateShop_Open,
"PartyHealReady" : self.PartyHealReady,
"ShowMeSafeboxPassword" : self.AskSafeboxPassword,
"CloseSafebox" : self.CommandCloseSafebox,
"AskTP" : self.AskTeleportRequest,
"AskPartyTeleport" : self.AskPartyTeleport,
"AskPlayerTeleport" : self.AskPlayerTeleport,
"AskFriendTeleport" : self.AskFriendTeleport,
"AskGuildTeleport" : self.AskGuildTeleport,
"AskGotoPlayer" : self.AskGotoPlayer,
"AskGotoFriend" : self.AskGotoFriend,
bu en aşağı eklenicek
# -- GRUP ISINLANMA SISTEMI BASLANGIC --
def AskPartyTeleport(self, leaderVID):
import uiCommon
self.partyTeleportQuestionDialog = uiCommon.QuestionDialog()
self.partyTeleportQuestionDialog.SetText("Grup lideri seni yanina cagiriyor. Isinlanmak istiyor musun?")
# Evet'e basarsa VID ile birlikte AnswerPartyTeleport fonksiyonuna True yollar
self.partyTeleportQuestionDialog.SetAcceptEvent(lambda arg=leaderVID: self.AnswerPartyTeleport(arg, True))
# Hayir'a basarsa False yollar
self.partyTeleportQuestionDialog.SetCancelEvent(lambda arg=leaderVID: self.AnswerPartyTeleport(arg, False))
self.partyTeleportQuestionDialog.Open()
def AnswerPartyTeleport(self, leaderVID, isAccept):
# Eger EVET butonuna basildiysa sunucuya kabul komutunu yolla
if isAccept:
import net
net.SendChatPacket("/gisnla_accept " + str(leaderVID))
# Secim yapildiktan sonra pencereyi ekrandan kaldir ve bellekten sil
if self.partyTeleportQuestionDialog:
self.partyTeleportQuestionDialog.Close()
self.partyTeleportQuestionDialog = None
# -- GRUP ISINLANMA SISTEMI BITIS --
# -- OYUNCU VE ARKADAS ISINLANMA SISTEMI BASLANGIC --
def AskPlayerTeleport(self, callerVID, callerName):
import uiCommon
self.playerTeleportDialog = uiCommon.QuestionDialog()
self.playerTeleportDialog.SetText(callerName + " adli oyuncu seni yanina cagiriyor. Isinlanmak istiyor musun?")
self.playerTeleportDialog.SetAcceptEvent(lambda arg1=callerVID, arg2="oyuncu": self.AnswerTeleport(arg1, arg2, True))
self.playerTeleportDialog.SetCancelEvent(lambda arg1=callerVID, arg2="oyuncu": self.AnswerTeleport(arg1, arg2, False))
self.playerTeleportDialog.Open()
def AskFriendTeleport(self, callerVID, callerName):
import uiCommon
self.friendTeleportDialog = uiCommon.QuestionDialog()
self.friendTeleportDialog.SetText("Arkadasin " + callerName + " seni yanina cagiriyor. Isinlanmak istiyor musun?")
self.friendTeleportDialog.SetAcceptEvent(lambda arg1=callerVID, arg2="arkadas": self.AnswerTeleport(arg1, arg2, True))
self.friendTeleportDialog.SetCancelEvent(lambda arg1=callerVID, arg2="arkadas": self.AnswerTeleport(arg1, arg2, False))
self.friendTeleportDialog.Open()
def AnswerTeleport(self, callerVID, tpType, isAccept):
if isAccept:
import net
if tpType == "oyuncu":
net.SendChatPacket("/oyuncu_kabul " + str(callerVID))
elif tpType == "arkadas":
net.SendChatPacket("/arkadas_kabul " + str(callerVID))
# Secim yapildiktan sonra ilgili pencereyi ekrandan kaldir
if tpType == "oyuncu" and hasattr(self, 'playerTeleportDialog') and self.playerTeleportDialog:
self.playerTeleportDialog.Close()
self.playerTeleportDialog = None
if tpType == "arkadas" and hasattr(self, 'friendTeleportDialog') and self.friendTeleportDialog:
self.friendTeleportDialog.Close()
self.friendTeleportDialog = None
# -- OYUNCU VE ARKADAS ISINLANMA SISTEMI BITIS --
# -- YANINA GITME ISTEGI SISTEMI BASLANGIC --
def AskGotoPlayer(self, senderVID, senderName):
import uiCommon
self.gotoPlayerDialog = uiCommon.QuestionDialog()
self.gotoPlayerDialog.SetText(senderName + " adli oyuncu senin yanina isinlanmak istiyor. Kabul ediyor musun?")
self.gotoPlayerDialog.SetAcceptEvent(lambda arg1=senderVID, arg2="oyuncu": self.AnswerGoto(arg1, arg2, True))
self.gotoPlayerDialog.SetCancelEvent(lambda arg1=senderVID, arg2="oyuncu": self.AnswerGoto(arg1, arg2, False))
self.gotoPlayerDialog.Open()
def AskGotoFriend(self, senderVID, senderName):
import uiCommon
self.gotoFriendDialog = uiCommon.QuestionDialog()
self.gotoFriendDialog.SetText("Arkadasin " + senderName + " senin yanina isinlanmak istiyor. Kabul ediyor musun?")
self.gotoFriendDialog.SetAcceptEvent(lambda arg1=senderVID, arg2="arkadas": self.AnswerGoto(arg1, arg2, True))
self.gotoFriendDialog.SetCancelEvent(lambda arg1=senderVID, arg2="arkadas": self.AnswerGoto(arg1, arg2, False))
self.gotoFriendDialog.Open()
def AnswerGoto(self, senderVID, reqType, isAccept):
if isAccept:
import net
if reqType == "oyuncu":
net.SendChatPacket("/oyuncuya_git_kabul " + str(senderVID))
elif reqType == "arkadas":
net.SendChatPacket("/arkadasa_git_kabul " + str(senderVID))
if reqType == "oyuncu" and hasattr(self, 'gotoPlayerDialog') and self.gotoPlayerDialog:
self.gotoPlayerDialog.Close()
self.gotoPlayerDialog = None
if reqType == "arkadas" and hasattr(self, 'gotoFriendDialog') and self.gotoFriendDialog:
self.gotoFriendDialog.Close()
self.gotoFriendDialog = None
# -- YANINA GITME ISTEGI SISTEMI BITIS --
# -- LONCA ISINLANMA SISTEMI BASLANGIC --
def AskGuildTeleport(self, leaderVID, leaderName):
import uiCommon
self.guildTeleportDialog = uiCommon.QuestionDialog()
self.guildTeleportDialog.SetText("Lonca liderin " + leaderName + " seni yanina cagiriyor. Isinlanmak istiyor musun?")
self.guildTeleportDialog.SetAcceptEvent(lambda arg1=leaderVID: self.AnswerGuildTeleport(arg1, True))
self.guildTeleportDialog.SetCancelEvent(lambda arg1=leaderVID: self.AnswerGuildTeleport(arg1, False))
self.guildTeleportDialog.Open()
def AnswerGuildTeleport(self, vid, isAccept):
if isAccept:
import net
net.SendChatPacket("/lonca_kabul " + str(vid))
# Secim yapildiktan sonra pencereyi kapat
if hasattr(self, 'guildTeleportDialog') and self.guildTeleportDialog:
self.guildTeleportDialog.Close()
self.guildTeleportDialog = None
# -- LONCA ISINLANMA SISTEMI BITIS --
def AskTeleportRequest(self, mode, type, vid, name):
# mode 1: Grup, 2: Lonca
# type 1: Yanına gelmek istiyor, 2: Yanına çağırıyor, 3: Toplu ışınlanma hedefi
msgPrefix = "[Grup] " if int(mode) == 1 else "[Lonca] "
tpType = int(type)
text = ""
if tpType == 1:
text = msgPrefix + name + " senin yanina gelmek istiyor. Onayliyor musun?"
elif tpType == 2:
text = msgPrefix + name + " seni yanina cagiriyor. Gitmek istiyor musun?"
elif tpType == 3:
text = msgPrefix + "Lider herkesin " + name + " yaninda toplanmasini istiyor. Gidilsin mi?"
import uiCommon
self.tpDialog = uiCommon.QuestionDialog()
self.tpDialog.SetText(text)
self.tpDialog.SetAcceptEvent(lambda v=vid, t=tpType: self.OnConfirmTP(v, t, True))
self.tpDialog.SetCancelEvent(lambda v=vid, t=tpType: self.OnConfirmTP(v, t, False))
self.tpDialog.Open()
def OnConfirmTP(self, vid, tpType, isAccept):
if isAccept:
import net
net.SendChatPacket("/tp_onay %d %s" % (tpType, str(vid)))
if self.tpDialog:
self.tpDialog.Close()
self.tpDialog = None
Kod:
cmd.cpp
{ "gisnla", do_party_warp, 0, POS_DEAD, GM_PLAYER },
{ "gisnla_accept", do_party_warp_accept, 0, POS_DEAD, GM_PLAYER },
{ "lonca_cagir", do_guild_warp, 0, POS_DEAD, GM_PLAYER },
{ "lonca_kabul", do_guild_warp_accept, 0, POS_DEAD, GM_PLAYER },
{ "oyuncu_cagir", do_player_warp, 0, POS_DEAD, GM_PLAYER },
{ "oyuncu_kabul", do_player_warp_accept, 0, POS_DEAD, GM_PLAYER },
{ "arkadas_cagir", do_friend_warp, 0, POS_DEAD, GM_PLAYER },
{ "arkadas_kabul", do_friend_warp_accept, 0, POS_DEAD, GM_PLAYER },
{ "oyuncuya_git", do_goto_player, 0, POS_DEAD, GM_PLAYER },
{ "oyuncuya_git_kabul", do_goto_player_accept, 0, POS_DEAD, GM_PLAYER },
{ "arkadasa_git", do_goto_friend, 0, POS_DEAD, GM_PLAYER },
{ "arkadasa_git_kabul", do_goto_friend_accept, 0, POS_DEAD, GM_PLAYER },
{ "g_git", do_party_goto, 0, POS_DEAD, GM_PLAYER },
{ "g_cagir", do_party_call, 0, POS_DEAD, GM_PLAYER },
{ "g_toplan", do_party_mass_goto, 0, POS_DEAD, GM_PLAYER },
{ "l_git", do_guild_goto, 0, POS_DEAD, GM_PLAYER },
{ "l_cagir", do_guild_call, 0, POS_DEAD, GM_PLAYER },
{ "l_toplan", do_guild_mass_goto, 0, POS_DEAD, GM_PLAYER },
{ "tp_onay", do_teleport_confirm, 0, POS_DEAD, GM_PLAYER },
ACMD(do_party_warp);
ACMD(do_party_warp_accept); // Evet butonuna basıldığında çalışacak komut
ACMD(do_player_warp);
ACMD(do_player_warp_accept);
ACMD(do_friend_warp);
ACMD(do_friend_warp_accept);
ACMD(do_guild_warp);
ACMD(do_guild_warp_accept);
ACMD(do_goto_player);
ACMD(do_goto_player_accept);
ACMD(do_goto_friend);
ACMD(do_goto_friend_accept);
// Grup Komutları
ACMD(do_party_goto);
ACMD(do_party_call);
ACMD(do_party_mass_goto);
// Lonca Komutları
ACMD(do_guild_goto);
ACMD(do_guild_call);
ACMD(do_guild_mass_goto);
// Genel Onay Komutu
ACMD(do_teleport_confirm);
cmd_general.cpp
#include <string>
// 1. AŞAMA: Liderin İstek Gönderme Komutu (/gisnla)
ACMD(do_party_warp)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if (!ch->GetParty())
{
ch->ChatPacket(CHAT_TYPE_INFO, "Bu komutu kullanabilmek icin bir grupta olmalisin.");
return;
}
if (ch->GetParty()->GetLeaderPID() != ch->GetPlayerID())
{
ch->ChatPacket(CHAT_TYPE_INFO, "Sadece grup lideri uyeleri yanina cagirabilir.");
return;
}
if (!*arg1)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Kullanim 1: /gisnla hepsini");
ch->ChatPacket(CHAT_TYPE_INFO, "Kullanim 2: /gisnla <Karakter_Ismi>");
return;
}
if (strcmp(arg1, "hepsini") == 0)
{
int requestCount = 0;
const auto& memberMap = ch->GetParty()->GetMemberMap();
for (const auto& [pid, memberData] : memberMap)
{
if (pid == ch->GetPlayerID())
continue;
LPCHARACTER victim = CHARACTER_MANAGER::instance().FindByPID(pid);
if (victim)
{
// DİREKT IŞINLAMAK YERİNE PYTHON'A GİZLİ KOMUT GÖNDERİYORUZ
// Parametre olarak Liderin VID (Virtual ID) değerini yolluyoruz.
// victim->ChatPacket(CHAT_TYPE_COMMAND, "AskPartyTeleport %u", ch->GetVID());
victim->ChatPacket(CHAT_TYPE_COMMAND, "AskPartyTeleport %u", static_cast<DWORD>(ch->GetVID()));
requestCount++;
}
}
ch->ChatPacket(CHAT_TYPE_INFO, "Ayni kanalda bulunan %d grup uyesine isinlanma istegi gonderildi.", requestCount);
}
else
{
LPCHARACTER victim = CHARACTER_MANAGER::instance().FindPC(arg1);
if (!victim)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Hata: %s adinda bir oyuncu bulunamadi veya farkli bir kanalda.", arg1);
return;
}
if (victim->GetParty() != ch->GetParty())
{
ch->ChatPacket(CHAT_TYPE_INFO, "Hata: %s adli oyuncu senin grubunda degil.", arg1);
return;
}
// victim->ChatPacket(CHAT_TYPE_COMMAND, "AskPartyTeleport %u", ch->GetVID());
victim->ChatPacket(CHAT_TYPE_COMMAND, "AskPartyTeleport %u", static_cast<DWORD>(ch->GetVID()));
ch->ChatPacket(CHAT_TYPE_INFO, "%s adli uyeye isinlanma istegi gonderildi.", arg1);
}
}
// 2. AŞAMA: Oyuncu "Evet" Butonuna Basınca Çalışacak Komut (/gisnla_accept)
ACMD(do_party_warp_accept)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if (!*arg1) return;
DWORD leaderVID = 0;
try
{
// C++20 Güvenli string to unsigned long çevirisi
leaderVID = std::stoul(arg1);
}
catch (...)
{
return; // Hatalı paket geldiyse işlemi iptal et
}
LPCHARACTER leader = CHARACTER_MANAGER::instance().Find(leaderVID);
// Lider oyundan çıkmışsa veya harita değiştirmişse
if (!leader)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Grup lideri bulunamadi (Oyundan cikmis veya harita degistirmis olabilir).");
return;
}
// Güvenlik: İstek geldiğinde aynı grupta olduklarından ve çağıranın gerçekten lider olduğundan emin ol
if (!ch->GetParty() || ch->GetParty() != leader->GetParty())
return;
if (ch->GetParty()->GetLeaderPID() != leader->GetPlayerID())
return;
// Her şey güvenli, oyuncuyu liderin GÜNCEL koordinatına ışınla
ch->WarpSet(leader->GetX(), leader->GetY(), leader->GetMapIndex());
}
#include <string>
// --- NORMAL OYUNCU ÇAĞIRMA SİSTEMİ ---
ACMD(do_player_warp)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if (!*arg1)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Kullanim: /oyuncu_cagir <Karakter_Ismi>");
return;
}
LPCHARACTER victim = CHARACTER_MANAGER::instance().FindPC(arg1);
if (!victim)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Hata: %s adinda bir oyuncu bulunamadi veya farkli kanalda.", arg1);
return;
}
if (victim == ch)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Kendini yanina cagiramazsin.");
return;
}
// Hedefe gizli komut ile birlikte çagiranin ID'sini (VID) ve ismini gönderiyoruz
victim->ChatPacket(CHAT_TYPE_COMMAND, "AskPlayerTeleport %u %s", static_cast<DWORD>(ch->GetVID()), ch->GetName());
ch->ChatPacket(CHAT_TYPE_INFO, "%s adli oyuncuya isinlanma istegi gonderildi.", arg1);
}
ACMD(do_player_warp_accept)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if (!*arg1) return;
DWORD callerVID = 0;
try { callerVID = std::stoul(arg1); } catch (...) { return; }
LPCHARACTER caller = CHARACTER_MANAGER::instance().Find(callerVID);
if (!caller)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Cagiran oyuncu bulunamadi (Oyundan cikmis olabilir).");
return;
}
ch->WarpSet(caller->GetX(), caller->GetY(), caller->GetMapIndex());
}
// --- 1. ARKADAŞI YANINA ÇAĞIRMA ---
// --- 1. ARKADAŞI YANINA ÇAĞIRMA ---
ACMD(do_friend_warp)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if (!*arg1)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Kullanim: /arkadas_cagir <Karakter_Ismi>");
return;
}
LPCHARACTER victim = CHARACTER_MANAGER::instance().FindPC(arg1);
if (!victim)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Hata: %s adinda bir oyuncu bulunamadi veya farkli kanalda.", arg1);
return;
}
if (victim == ch) return;
// KESİN ARKADAŞLIK KONTROLÜ
// Karşıdaki kişi senin arkadaş listende ekli değilse işlemi durdur ve uyarı ver.
if (MessengerManager::instance().AuthToAdd(ch->GetName(), victim->GetName(), false))
{
ch->ChatPacket(CHAT_TYPE_INFO, "Hata: %s senin arkadas listende ekli degil! Sadece arkadaslarini cagirabilirsin.", arg1);
return;
}
victim->ChatPacket(CHAT_TYPE_COMMAND, "AskFriendTeleport %u %s", static_cast<DWORD>(ch->GetVID()), ch->GetName());
ch->ChatPacket(CHAT_TYPE_INFO, "%s adli arkadasina yanina cagirma istegi gonderildi.", arg1);
}
ACMD(do_friend_warp_accept)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if (!*arg1) return;
DWORD callerVID = 0;
try { callerVID = std::stoul(arg1); } catch (...) { return; }
LPCHARACTER caller = CHARACTER_MANAGER::instance().Find(callerVID);
if (!caller)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Istek gonderen arkadasin bulunamadi (Oyundan cikmis olabilir).");
return;
}
// Güvenlik teyidi: Işınlanmadan önce hala arkadaşlar mı?
if (MessengerManager::instance().AuthToAdd(caller->GetName(), ch->GetName(), false))
return;
ch->WarpSet(caller->GetX(), caller->GetY(), caller->GetMapIndex());
}
// --- 2. ARKADAŞIN YANINA GİTME ---
// --- 2. ARKADAŞIN YANINA GİTME ---
ACMD(do_goto_friend)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if (!*arg1)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Kullanim: /arkadasa_git <Karakter_Ismi>");
return;
}
LPCHARACTER target = CHARACTER_MANAGER::instance().FindPC(arg1);
if (!target)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Hata: %s adinda bir oyuncu bulunamadi veya farkli kanalda.", arg1);
return;
}
if (target == ch) return;
// KESİN ARKADAŞLIK KONTROLÜ
// Yanına gidilecek kişi senin arkadaş listende ekli değilse işlemi durdur ve uyarı ver.
if (MessengerManager::instance().AuthToAdd(ch->GetName(), target->GetName(), false))
{
ch->ChatPacket(CHAT_TYPE_INFO, "Hata: %s senin arkadas listende ekli degil! Sadece arkadaslarinin yanina gidebilirsin.", arg1);
return;
}
target->ChatPacket(CHAT_TYPE_COMMAND, "AskGotoFriend %u %s", static_cast<DWORD>(ch->GetVID()), ch->GetName());
ch->ChatPacket(CHAT_TYPE_INFO, "%s adli arkadasinin yanina gitme istegi gonderildi.", arg1);
}
ACMD(do_goto_friend_accept)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if (!*arg1) return;
DWORD senderVID = 0;
try { senderVID = std::stoul(arg1); } catch (...) { return; }
LPCHARACTER sender = CHARACTER_MANAGER::instance().Find(senderVID);
if (!sender)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Istek gonderen arkadasin bulunamadi (Oyundan cikmis olabilir).");
return;
}
if (MessengerManager::instance().AuthToAdd(sender->GetName(), ch->GetName(), false))
return;
sender->WarpSet(ch->GetX(), ch->GetY(), ch->GetMapIndex());
sender->ChatPacket(CHAT_TYPE_INFO, "%s istegini kabul etti, yanina isinlandin.", ch->GetName());
ch->ChatPacket(CHAT_TYPE_INFO, "Arkadasin %s yanina isinlandi.", sender->GetName());
}
#include <string>
// --- OYUNCUYA GİTME İSTEĞİ (YANINA GİTMEK İÇİN) ---
ACMD(do_goto_player)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if (!*arg1)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Kullanim: /oyuncuya_git <Karakter_Ismi>");
return;
}
LPCHARACTER target = CHARACTER_MANAGER::instance().FindPC(arg1);
if (!target)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Hata: %s adinda bir oyuncu bulunamadi veya farkli kanalda.", arg1);
return;
}
if (target == ch) return;
// Hedefe "Ben senin yanina gelmek istiyorum" istegi gonder
target->ChatPacket(CHAT_TYPE_COMMAND, "AskGotoPlayer %u %s", static_cast<DWORD>(ch->GetVID()), ch->GetName());
ch->ChatPacket(CHAT_TYPE_INFO, "%s adli oyuncuya yanina gitme istegi gonderildi.", arg1);
}
ACMD(do_goto_player_accept)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if (!*arg1) return;
DWORD senderVID = 0;
try { senderVID = std::stoul(arg1); } catch (...) { return; }
LPCHARACTER sender = CHARACTER_MANAGER::instance().Find(senderVID);
if (!sender)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Istek gonderen oyuncu bulunamadi (Oyundan cikmis olabilir).");
return;
}
// Gelen istegi kabul eden kisi (ch), istek atani (sender) kendi bulundugu koordinata cekiyor.
sender->WarpSet(ch->GetX(), ch->GetY(), ch->GetMapIndex());
sender->ChatPacket(CHAT_TYPE_INFO, "%s istegini kabul etti, yanina isinlandin.", ch->GetName());
ch->ChatPacket(CHAT_TYPE_INFO, "%s adli oyuncu yanina isinlandi.", sender->GetName());
}
// --- LONCA ÇAĞIRMA SİSTEMİ (SADECE LİDER) ---
ACMD(do_guild_warp)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if (!ch->GetGuild())
{
ch->ChatPacket(CHAT_TYPE_INFO, "Bunun icin bir loncada olmalisin.");
return;
}
// Sadece lonca lideri (Master) cagirabilir
if (ch->GetGuild()->GetMasterPID() != ch->GetPlayerID())
{
ch->ChatPacket(CHAT_TYPE_INFO, "Sadece lonca lideri uyeleri yanina cagirabilir.");
return;
}
if (!*arg1)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Kullanim 1: /lonca_cagir hepsini");
ch->ChatPacket(CHAT_TYPE_INFO, "Kullanim 2: /lonca_cagir <Karakter_Ismi>");
return;
}
if (strcmp(arg1, "hepsini") == 0)
{
int requestCount = 0;
// C++20: Range-based for loop ile o an oyunda/kanalda olan tüm clientleri tara
const auto& clientSet = DESC_MANAGER::instance().GetClientSet();
for (auto* d : clientSet)
{
LPCHARACTER victim = d->GetCharacter();
// Eger oyuncu oyundaysa, liderin kendisi degilse ve ayni loncadalarsa
if (victim && victim != ch && victim->GetGuild() == ch->GetGuild())
{
victim->ChatPacket(CHAT_TYPE_COMMAND, "AskGuildTeleport %u %s", static_cast<DWORD>(ch->GetVID()), ch->GetName());
requestCount++;
}
}
ch->ChatPacket(CHAT_TYPE_INFO, "Ayni kanalda bulunan %d lonca uyesine istek gonderildi.", requestCount);
}
else
{
LPCHARACTER victim = CHARACTER_MANAGER::instance().FindPC(arg1);
if (!victim)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Hata: %s adinda bir oyuncu bulunamadi veya farkli kanalda.", arg1);
return;
}
if (victim->GetGuild() != ch->GetGuild())
{
ch->ChatPacket(CHAT_TYPE_INFO, "Hata: %s senin loncanda degil.", arg1);
return;
}
victim->ChatPacket(CHAT_TYPE_COMMAND, "AskGuildTeleport %u %s", static_cast<DWORD>(ch->GetVID()), ch->GetName());
ch->ChatPacket(CHAT_TYPE_INFO, "%s adli lonca uyesine istek gonderildi.", arg1);
}
}
ACMD(do_guild_warp_accept)
{
char arg1[256];
one_argument(argument, arg1, sizeof(arg1));
if (!*arg1) return;
DWORD leaderVID = 0;
try { leaderVID = std::stoul(arg1); } catch (...) { return; }
LPCHARACTER leader = CHARACTER_MANAGER::instance().Find(leaderVID);
if (!leader)
{
ch->ChatPacket(CHAT_TYPE_INFO, "Lonca lideri bulunamadi (Oyundan cikmis olabilir).");
return;
}
// Guvenlik: Her ikisi de hala ayni loncada mi?
if (!ch->GetGuild() || ch->GetGuild() != leader->GetGuild())
return;
// Liderin yanina isinla
ch->WarpSet(leader->GetX(), leader->GetY(), leader->GetMapIndex());
}
// --- YARDIMCI FONKSİYON: Onay Penceresi Gönder ---
// mode: 1 (Party), 2 (Guild) | type: 1 (Yanına Git), 2 (Yanına Çağır), 3 (Toplu Git)
void SendTeleportRequest(LPCHARACTER ch, LPCHARACTER victim, int mode, int type) {
if (!ch || !victim) return;
victim->ChatPacket(CHAT_TYPE_COMMAND, "AskTP %d %d %u %s", mode, type, static_cast<DWORD>(ch->GetVID()), ch->GetName());
}
// --- GRUP KOMUTLARI ---
ACMD(do_party_goto) {
char arg1[256]; one_argument(argument, arg1, sizeof(arg1));
LPCHARACTER victim = CHARACTER_MANAGER::instance().FindPC(arg1);
if (!victim || victim->GetParty() != ch->GetParty()) return;
SendTeleportRequest(ch, victim, 1, 1); // Ben senin yanına geliyorum (Sen onayla)
}
ACMD(do_party_call) {
char arg1[256]; one_argument(argument, arg1, sizeof(arg1));
LPCHARACTER victim = CHARACTER_MANAGER::instance().FindPC(arg1);
if (!victim || victim->GetParty() != ch->GetParty()) return;
SendTeleportRequest(ch, victim, 1, 2); // Sen benim yanıma gel (Sen onayla)
}
ACMD(do_party_mass_goto) {
char arg1[256]; one_argument(argument, arg1, sizeof(arg1));
if (!ch->GetParty() || ch->GetParty()->GetLeaderPID() != ch->GetPlayerID()) return;
LPCHARACTER target = CHARACTER_MANAGER::instance().FindPC(arg1);
if (!target || target->GetParty() != ch->GetParty()) return;
const auto& memberMap = ch->GetParty()->GetMemberMap();
for (const auto& [pid, member] : memberMap) {
LPCHARACTER victim = CHARACTER_MANAGER::instance().FindByPID(pid);
if (victim && victim != target)
SendTeleportRequest(target, victim, 1, 3); // Herkes Target'a gitsin (Target'ın VID'si gidiyor)
}
}
// --- LONCA KOMUTLARI ---
ACMD(do_guild_goto) {
char arg1[256]; one_argument(argument, arg1, sizeof(arg1));
LPCHARACTER victim = CHARACTER_MANAGER::instance().FindPC(arg1);
if (!victim || victim->GetGuild() != ch->GetGuild()) return;
SendTeleportRequest(ch, victim, 2, 1);
}
ACMD(do_guild_call) {
char arg1[256]; one_argument(argument, arg1, sizeof(arg1));
LPCHARACTER victim = CHARACTER_MANAGER::instance().FindPC(arg1);
if (!victim || victim->GetGuild() != ch->GetGuild()) return;
SendTeleportRequest(ch, victim, 2, 2);
}
ACMD(do_guild_mass_goto) {
char arg1[256]; one_argument(argument, arg1, sizeof(arg1));
if (!ch->GetGuild() || ch->GetGuild()->GetMasterPID() != ch->GetPlayerID()) return;
LPCHARACTER target = CHARACTER_MANAGER::instance().FindPC(arg1);
if (!target || target->GetGuild() != ch->GetGuild()) return;
const auto& clientSet = DESC_MANAGER::instance().GetClientSet();
for (auto* d : clientSet) {
LPCHARACTER victim = d->GetCharacter();
if (victim && victim != target && victim->GetGuild() == ch->GetGuild())
SendTeleportRequest(target, victim, 2, 3);
}
}
// --- GENEL ONAY İŞLEYİCİ ---
ACMD(do_teleport_confirm) {
char arg1[256], arg2[256];
two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));
if (!*arg1 || !*arg2) return;
int type = std::stoi(arg1);
DWORD targetVID = std::stoul(arg2);
LPCHARACTER target = CHARACTER_MANAGER::instance().Find(targetVID);
if (!target) return;
if (type == 1) { // Giden kişi Onaylayana (ch) ışınlanır
target->WarpSet(ch->GetX(), ch->GetY(), ch->GetMapIndex());
} else if (type == 2 || type == 3) { // Onaylayan (ch) Hedefe ışınlanır
ch->WarpSet(target->GetX(), target->GetY(), target->GetMapIndex());
}
}


