İlan
06 Haz 2026 21 çevrimiçi üye Duyurular
Ana Sayfa C++ / C# / Python
Ana Sayfa Forum C++ / C# / Python yanına çağır yanına git toplu lonca üyelerini çağı...
İlan Yan banner placeholder

yanına çağır yanına git toplu lonca üyelerini çağır grup üyelerini çağır....

Derman_ 30.04.2026 05:18 1.4K görüntüleme 4 cevap
Son Mesaj
Derman_
Üye
Üye
Katılım19 Şub 2026
Konular12
Mesajlar87
Elmas Konular0
Başarım0
ZirveCoin 0
Ticaret Puanı
+0 -0
30.04.2026 05:18 #1
gemini pro yazdı

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.)
lonca baskanının yanına
"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());
    }
}
VDSHOSTİNG
Üye
Üye
Katılım23 Şub 2026
Konular5
Mesajlar58
Elmas Konular0
Başarım0
ZirveCoin 0
Ticaret Puanı
+0 -0
02.05.2026 07:30 #2
Paylaşım için teşekkürler.
SyLvesTR94
Üye
Üye
Katılım14 Oca 2026
Konular8
Mesajlar66
Elmas Konular0
Başarım0
ZirveCoin 0
Ticaret Puanı
+0 -0
03.05.2026 06:18 #3
paylaşım için teşekkürler.
SparkMedya
Üye
Üye
Katılım29 Mar 2026
Konular4
Mesajlar59
Elmas Konular0
Başarım0
ZirveCoin 0
Ticaret Puanı
+0 -0
05.05.2026 01:26 #4
gecen sene lider yüzüğü yapmıstım aynı mantıkta calısıyor 4 belirli alana tüm lonca üyelerini düzenli bir şekilde sıralı cekebiliryordun testlerde hiçbir sorun yoktu 20 30 kişi bi lonca kullandığında ch çökmüştü
Derman_
Üye
Üye
Katılım19 Şub 2026
Konular12
Mesajlar87
Elmas Konular0
Başarım0
ZirveCoin 0
Ticaret Puanı
+0 -0
05.05.2026 10:10 #5
gecen sene lider yüzüğü yapmıstım aynı mantıkta calısıyor 4 belirli alana tüm lonca üyelerini düzenli bir şekilde sıralı cekebiliryordun testlerde hiçbir sorun yoktu 20 30 kişi bi lonca kullandığında ch çökmüştü
Aynı haritada kullanma ve

bunu yaparsan sanırım sorun çözülür.

ışınlanma yaparken CPU 0 sa 3 cıkıyor belki kişi başıdır
Bu konuyu görüntüleyenler
1 misafir
Cevap yazmak için giriş yapın.
Benzer Konular
6 cevap
2K görüntüleme
9 cevap
1.9K görüntüleme
4 cevap
1.9K görüntüleme
8 cevap
1.9K görüntüleme
İlan Yan banner placeholder