Neler yeni
XenForo Bannerlar
Modern AdBlock Uyarısı

Foruma hoş geldin, Ziyaretçi

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak tamamen ücretsizdir.

Kod Düello sırasında onaylı düello iptali

Fatih Bulut

Süper Üye
Katılım
6 Kas 2021
Mesajlar
4,115
Tepkime puanı
5,532
Puanları
113
Yaş
32
Konum
Türkiye
Dc
fatihbulut
1776679496954.png

cmd_general.cpp​
Kod:
#include "pvp.h"



#include "messenger_manager.h"
#include "guild.h"
#include "pvp.h"
#include <string>

// Yardımcı Fonksiyon (Paket Gonderimi)
void SendTPReq(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());
}

// --- DUELLO ?PTAL S?STEM? ---
ACMD(do_pvp_cancel_request)
{
    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    // E?er arguman bo?sa (VID gelmediyse)
    if (!*arg1)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Hata: Hedef VID alinmadi.");
        return;
    }

    // Gelen metni sayıya (VID) ceviriyoruz
    DWORD targetVID = 0;
    try {
        targetVID = std::stoul(arg1);
    } catch (...) {
        return;
    }

    // Dunyadaki tum oyuncular icinde bu VID'ye sahip ki?iyi bul (En sa?lam yontem)
    LPCHARACTER victim = CHARACTER_MANAGER::instance().Find(targetVID);

    if (!victim)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Hata: Rakip bulunamadi.");
        return;
    }

    // Guvenlik: Aktif duelloda mısın?
    if (!CPVPManager::instance().IsFighting(ch))
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Su an aktif bir duellonuz bulunmuyor.");
        return;
    }

    // Her ?ey tamamsa Said'e (victim) onay penceresini yolla
    victim->ChatPacket(CHAT_TYPE_COMMAND, "AskPvpCancel %u %s", static_cast<DWORD>(ch->GetVID()), ch->GetName());
    ch->ChatPacket(CHAT_TYPE_INFO, "%s adli rakibe iptal iste?i gonderildi.", victim->GetName());
}

ACMD(do_pvp_cancel_confirm)
{
    char arg1[256];
    one_argument(argument, arg1, sizeof(arg1));

    if (!*arg1)
        return;

    DWORD requesterVID = 0;
    try {
        requesterVID = std::stoul(arg1);
    } catch (...) {
        return;
    }

    LPCHARACTER requester = CHARACTER_MANAGER::instance().Find(requesterVID);

    if (requester)
    {
        // 1. ADIM: İki oyuncunun ID'lerini kullanarak düello nesnesini (CRC) oluşturup buluyoruz.
        // MartySama'da CRC hesaplaması constructor içinde yapıldığı için geçici bir nesne oluşturuyoruz.
        CPVP kPVP(ch->GetPlayerID(), requester->GetPlayerID());
        CPVP * pkPVP = CPVPManager::instance().Find(kPVP.GetCRC());

        if (pkPVP)
        {
            // 2. ADIM: GÖRSEL İPTAL
            // pkPVP->Packet(true) fonksiyonu senin pvp.cpp dosmanda tüm sunucuya
            // "PVP_MODE_NONE" paketini gönderir. Bu, kılıçların anında gitmesini sağlar.
            pkPVP->Packet(true);

            // 3. ADIM: TEKNİK İPTAL
            // Delete fonksiyonu düelloyu m_map_pkPVP ve m_map_pkPVPSetByID listelerinden siler
            // ve nesneyi bellekten (M2_DELETE) temizler.
            CPVPManager::instance().Delete(pkPVP);
        }

        // 4. ADIM: HASAR ENGELLEME
        // MartySama'da düello sırasında oyuncular birbirini QuestNPC olarak görür.
        // Bunu sıfırlamazsak birbirlerine vurmaya devam edebilirler.
        ch->SetQuestNPCID(0);
        requester->SetQuestNPCID(0);

        // Bilgilendirme
        ch->ChatPacket(CHAT_TYPE_INFO, "Duello basariyla iptal edildi.");
        requester->ChatPacket(CHAT_TYPE_INFO, "Rakibin istegi kabul etti, duello iptal edildi.");
    }
}

cmd.cpp

Kod:
ACMD(do_pvp_cancel_request);


ACMD(do_pvp_cancel_confirm);


    { "do_pvp_cancel_request",    do_pvp_cancel_request, 0, POS_FIGHTING, GM_PLAYER },
  
    { "do_pvp_cancel_confirm",    do_pvp_cancel_confirm, 0, POS_FIGHTING, GM_PLAYER },

game.py
Kod:
örnek
    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,
            "AskPvpCancel": self.AskPvpCancel,


en asagi ekle

    def AskPvpCancel(self, vid, name):
        import uiCommon
        self.pvpCancelDialog = uiCommon.QuestionDialog()
        self.pvpCancelDialog.SetText(name + " duelloyu iptal etmek istiyor. Kabul ediyor musun?")
        self.pvpCancelDialog.SetAcceptEvent(lambda v=vid: self.OnAnswerPvpCancel(v, True))
        self.pvpCancelDialog.SetCancelEvent(lambda v=vid: self.OnAnswerPvpCancel(v, False))
        self.pvpCancelDialog.Open()

    def OnAnswerPvpCancel(self, vid, isAccept):
        if isAccept:
            import net
            # Onay komutun da cmd.cpp'deki isminle aynı olmalı:
            net.SendChatPacket("/do_pvp_cancel_confirm %d" % int(vid))
      
        if self.pvpCancelDialog:
            self.pvpCancelDialog.Close()
            self.pvpCancelDialog = None
uitarget.py
Kod:
örneğin
class TargetBoard(ui.ThinBoard):

    BUTTON_NAME_LIST = (
        localeInfo.TARGET_BUTTON_WHISPER,
        localeInfo.TARGET_BUTTON_EXCHANGE,
        localeInfo.TARGET_BUTTON_FIGHT,
        localeInfo.TARGET_BUTTON_ACCEPT_FIGHT,
        localeInfo.TARGET_BUTTON_AVENGE,
        localeInfo.TARGET_BUTTON_FRIEND,
        localeInfo.TARGET_BUTTON_INVITE_PARTY,
        localeInfo.TARGET_BUTTON_LEAVE_PARTY,
        localeInfo.TARGET_BUTTON_EXCLUDE,
        localeInfo.TARGET_BUTTON_INVITE_GUILD,
        localeInfo.TARGET_BUTTON_DISMOUNT,
        localeInfo.TARGET_BUTTON_EXIT_OBSERVER,
        localeInfo.TARGET_BUTTON_VIEW_EQUIPMENT,
        localeInfo.TARGET_BUTTON_REQUEST_ENTER_PARTY,
        localeInfo.TARGET_BUTTON_BUILDING_DESTROY,
        localeInfo.TARGET_BUTTON_EMOTION_ALLOW,
        "DUEL_CANCEL",
        "VOTE_BLOCK_CHAT",
    )


örnek

        self.buttonDict[localeInfo.TARGET_BUTTON_INVITE_GUILD].SAFE_SetEvent(self.__OnGuildAddMember)
        self.buttonDict[localeInfo.TARGET_BUTTON_DISMOUNT].SAFE_SetEvent(self.__OnDismount)
        self.buttonDict[localeInfo.TARGET_BUTTON_EXIT_OBSERVER].SAFE_SetEvent(self.__OnExitObserver)
        self.buttonDict[localeInfo.TARGET_BUTTON_VIEW_EQUIPMENT].SAFE_SetEvent(self.__OnViewEquipment)
        self.buttonDict[localeInfo.TARGET_BUTTON_REQUEST_ENTER_PARTY].SAFE_SetEvent(self.__OnRequestParty)
        self.buttonDict[localeInfo.TARGET_BUTTON_BUILDING_DESTROY].SAFE_SetEvent(self.__OnDestroyBuilding)
        self.buttonDict[localeInfo.TARGET_BUTTON_EMOTION_ALLOW].SAFE_SetEvent(self.__OnEmotionAllow)
        self.buttonDict["DUEL_CANCEL"].SetEvent(ui.__mem_func__(self.OnDuelCancel))
        self.buttonDict["VOTE_BLOCK_CHAT"].SetEvent(ui.__mem_func__(self.__OnVoteBlockChat))


örnek

    def RefreshButton(self):

        self.HideAllButton()

        if chr.INSTANCE_TYPE_BUILDING == chr.GetInstanceType(self.vid):
            return

        # PVP başladığında normalde butonlar gizlenir (return edilir).
        # "Duello Iptal" butonunun görünmesi için bu bloğu düzenliyoruz.
        if player.IsPVPInstance(self.vid):
            # PVP_INFO_SIZE_BUG_FIX
            self.SetSize(200 + 7*self.nameLength, 40)
            self.UpdatePosition()
          
            # PVP halindeyken sadece İptal butonunu göster
            self.__ShowButton("DUEL_CANCEL")
            self.__ArrangeButtonPosition()
            return # Diğer normal butonların (Ticaret, Grup vb.) yüklenmesini engeller

        if player.IsObserverMode():
            return

        self.ShowDefaultButton()

        if guild.MainPlayerHasAuthority(guild.AUTH_ADD_MEMBER):
            if not guild.IsMemberByName(self.nameString):
                if 0 == chr.GetGuildID(self.vid):
                    self.__ShowButton(localeInfo.TARGET_BUTTON_INVITE_GUILD)

        if not messenger.IsFriendByName(self.nameString):
            self.__ShowButton(localeInfo.TARGET_BUTTON_FRIEND)

        if player.IsPartyMember(self.vid):
            self.__HideButton(localeInfo.TARGET_BUTTON_FIGHT)
            if player.IsPartyLeader(self.vid):
                self.__ShowButton(localeInfo.TARGET_BUTTON_LEAVE_PARTY)
            elif player.IsPartyLeader(player.GetMainCharacterIndex()):
                self.__ShowButton(localeInfo.TARGET_BUTTON_EXCLUDE)
        else:
            if player.IsPartyMember(player.GetMainCharacterIndex()):
                if player.IsPartyLeader(player.GetMainCharacterIndex()):
                    self.__ShowButton(localeInfo.TARGET_BUTTON_INVITE_PARTY)
            else:
                if chr.IsPartyMember(self.vid):
                    self.__ShowButton(localeInfo.TARGET_BUTTON_REQUEST_ENTER_PARTY)
                else:
                    self.__ShowButton(localeInfo.TARGET_BUTTON_INVITE_PARTY)

            if player.IsRevengeInstance(self.vid):
                self.__HideButton(localeInfo.TARGET_BUTTON_FIGHT)
                self.__ShowButton(localeInfo.TARGET_BUTTON_AVENGE)
            elif player.IsChallengeInstance(self.vid):
                self.__HideButton(localeInfo.TARGET_BUTTON_FIGHT)
                self.__ShowButton(localeInfo.TARGET_BUTTON_ACCEPT_FIGHT)
            elif player.IsCantFightInstance(self.vid):
                self.__HideButton(localeInfo.TARGET_BUTTON_FIGHT)

            if not player.IsSameEmpire(self.vid):
                self.__HideButton(localeInfo.TARGET_BUTTON_INVITE_PARTY)
                self.__HideButton(localeInfo.TARGET_BUTTON_FRIEND)
                self.__HideButton(localeInfo.TARGET_BUTTON_FIGHT)

        distance = player.GetCharacterDistance(self.vid)
        if distance > self.EXCHANGE_LIMIT_RANGE:
            self.__HideButton(localeInfo.TARGET_BUTTON_EXCHANGE)

        self.__ArrangeButtonPosition()



en asagi
    def OnUpdate(self):
        if self.isShowButton:
            distance = player.GetCharacterDistance(self.vid)
            if distance < 0:
                return

            # Düello İptal Butonu Kontrolü
            # player.IsPVPInstance(self.vid) aktif bir düello olup olmadığını kontrol eder
            if player.IsPVPInstance(self.vid):
                if not self.buttonDict["DUEL_CANCEL"].IsShow():
                    self.RefreshButton() # Buton listesini yeniden yapılandır
            else:
                if self.buttonDict["DUEL_CANCEL"].IsShow():
                    self.RefreshButton() # Düello bittiyse butonu listeden çıkar ve hizala

            # Mesafe Kontrolü (Ticaret vb. butonlar için)
            exchangeButton = self.buttonDict[localeInfo.TARGET_BUTTON_EXCHANGE]
            if exchangeButton.IsShow():
                if distance > self.EXCHANGE_LIMIT_RANGE:
                    self.RefreshButton()
            else:
                if distance < self.EXCHANGE_LIMIT_RANGE:
                    self.RefreshButton()
                  
    def OnDuelCancel(self):
        import net
        if self.vid == 0: # Eğer hedef seçili değilse işlem yapma
            return
          
        # HATA BURADAYDI: Komutun yanına boşluk bırakıp VID değerini eklemelisin
        # Eğer cmd.cpp'de "duello_iptal" yaptıysan onu yaz:
        # net.SendChatPacket("/duello_iptal %d" % int(self.vid))
      
        # Eğer cmd.cpp'de ismi "/do_pvp_cancel_request" yaptıysan (ki genelde yapılmaz):
        net.SendChatPacket("/do_pvp_cancel_request %d" % int(self.vid))

Gizli içerik
Bu içeriği görmek için cevap yazmalısınız.
 

Benzer konular

Forumdan daha fazla yararlanmak için giriş yapın yada üye olun!

Forumdan daha fazla yararlanmak için giriş yapın veya kayıt olun!

Kayıt ol

Forumda bir hesap oluşturmak tamamen ücretsizdir.

Şimdi kayıt ol
Giriş yap

Eğer bir hesabınız var ise lütfen giriş yapın

Giriş yap

Tema düzenleyici

Tema özelletirmeleri

Grafik arka planlar

Granit arka planlar