YARDIM Istırap Source de R vurunca GameServer Patlaması

byfantastiq

KY Kıdemli Üye
Katılım
3 Şub 2024
Mesajlar
176
Tepkime puanı
10
Puanları
18
Merhabalar, ISTIRAP Source de botlarla pk atarken (GM) Değil iken player karakter ile skill vuruyor iken bir problem olmuyor.Ancak R ile vurunca belirli bir süre sonra oyundan atıyor. GameServer Çöküyor.

bug.jpg
Yukarıdaki Hatayı Veriyor.
bug1.jpg
Burada da ayrıntısı görünüyor.
Bu konuda bana yardımcı olabilecek var mı acaba ? Şimdiden Teşekkürler.
 
Çözüm
Merhaba,

bu şekilde çözebilirsinzi.

C++:
void CUser::Attack(Packet & pkt)
{
    if (!isInGame())
        return;

    int16 sid = -1, tid = -1, damage, delaytime, distance;
    uint8 bType, bResult = 0, unknown;
    Unit * pTarget = nullptr;

    pkt >> bType >> bResult >> tid >> delaytime >> distance >> unknown;

    if (m_bResHpType == USER_SITDOWN || isIncapacitated() || isInEnemySafetyArea())
        return;

    if (isInSpecialEventZone()
        && !g_pMain->pSpecialEvent.opened
        && !g_pMain->pCindWar.isON())
        return;

    if (!g_pMain->pSpecialEvent.opened
        && g_pMain->isCindirellaZone(GetZoneID())
        && g_pMain->pCindWar.isON()
        && !g_pMain->pCindWar.isStarted())
        return...

byfantastiq

KY Kıdemli Üye
Katılım
3 Şub 2024
Mesajlar
176
Tepkime puanı
10
Puanları
18
sadece mantığını da öğretseniz bana yeter ben öğrenmeye açığım arkadaşlar lütfen.
 

Aakinci

Süper Moderatör
Premium Üye
KY Saygın Üye
KY YardımSever
KY Kod Editörü
Katılım
5 Tem 2021
Mesajlar
514
Çözümler
82
Tepkime puanı
246
Puanları
73
Yaş
32
Hocam crash ekraninda size bilgi vermiş zaten. Orada attack fonksiyonunun yani r işlevini yerine getiren fonksiyonun hangi satırını işaret ediyor ise orayı kontrol edin
 

byfantastiq

KY Kıdemli Üye
Katılım
3 Şub 2024
Mesajlar
176
Tepkime puanı
10
Puanları
18
hata logunu ekte ekledim biri bana fikir verebilirse çok memnun olurum sorunum çözülmedi malesef.
 

Ekli dosyalar

  • GameServer_error_report_240206-232100.zip
    1.5 MB · Görüntüleme: 7

CMDK

Admin
Premium Üye
KY Saygın Üye
KY Uzman Üye
KY Kıdemli Üye
KY YardımSever
Bağımlı Üye
Coder
KY Paylaşım Editörü
Katılım
3 Mar 2021
Mesajlar
486
Çözümler
76
Tepkime puanı
1,434
Puanları
153
Kapatın o kısımı öyle deneyin
 

byfantastiq

KY Kıdemli Üye
Katılım
3 Şub 2024
Mesajlar
176
Tepkime puanı
10
Puanları
18
Show me this code CUser::GetDamage but i dont know why u didnt debug it.
kontrol ettim. kontrollerim esnasında

short CBot::GetDamage(Unit* pTarget, _MAGIC_TABLE pSkill /*= nullptr*/, bool bPreviewOnly /*= false*/)

bu paketin tüm kodlarının kapatıldığını fark ettim bu etkiler mi acaba? doğrulama yapabilecek biri var mı ?
 

YNG

Moderatör
KY YardımSever
Coder
Katılım
21 Ağu 2022
Mesajlar
112
Çözümler
7
Tepkime puanı
109
Puanları
53
Yaş
35
Merhaba,

bu şekilde çözebilirsinzi.

C++:
void CUser::Attack(Packet & pkt)
{
    if (!isInGame())
        return;

    int16 sid = -1, tid = -1, damage, delaytime, distance;
    uint8 bType, bResult = 0, unknown;
    Unit * pTarget = nullptr;

    pkt >> bType >> bResult >> tid >> delaytime >> distance >> unknown;

    if (m_bResHpType == USER_SITDOWN || isIncapacitated() || isInEnemySafetyArea())
        return;

    if (isInSpecialEventZone()
        && !g_pMain->pSpecialEvent.opened
        && !g_pMain->pCindWar.isON())
        return;

    if (!g_pMain->pSpecialEvent.opened
        && g_pMain->isCindirellaZone(GetZoneID())
        && g_pMain->pCindWar.isON()
        && !g_pMain->pCindWar.isStarted())
        return;

    RemoveStealth();

    // If you're holding a weapon, do a client-based (ugh, do not trust!) delay check.
    _ITEM_TABLE pRightTable = GetItemPrototype(RIGHTHAND), pLeftTable = GetItemPrototype(LEFTHAND);

    bool nocheck = false;
    if ((isGM() || isGMUser()) && (!pRightTable.isnull() && pRightTable.GetNum() == 389158000) || (!pLeftTable.isnull() && pLeftTable.GetNum() == 389158000)) nocheck = true;

    if ((!pRightTable.isnull() && pRightTable.isBow()) || (!pLeftTable.isnull() && pLeftTable.isBow())) return;

    if (!nocheck && m_lastrattacktime > UNIXTIME2) return;
    m_lastrattacktime = UNIXTIME2 + PLAYER_R_HIT_REQUEST_INTERVAL;

    uint32 m_range = 0;
    if (!pRightTable.isnull() && !isMage())
    {
        if (pRightTable.isTimingDelay())
        {
            if (delaytime < (pRightTable.m_sDelay + 9) || distance > pRightTable.m_sRange)
                return;
        }
        else if (pRightTable.isWirinomUniqDelay() || pRightTable.isWirinomRebDelay() || pRightTable.isGargesSwordDelay())
        {
            if (delaytime < (pRightTable.m_sDelay - 4) || distance > pRightTable.m_sRange)
                return;
        }
        else
        {
            if (delaytime < pRightTable.m_sDelay || distance > pRightTable.m_sRange)
                return;
        }
        m_range = pRightTable.m_sRange;
    }
    // Empty handed.
    else if (delaytime < 100 && !nocheck)
        return;

    pTarget = g_pMain->GetUnitPtr(tid, GetZoneID());
    if (!pTarget)
        return;

    if (GetZoneID() == ZONE_JURAID_MOUNTAIN
        && pTarget->isNPC()
        && !CheckDevaAttack(pTarget->isNPC(), pTarget->isNPC() ? TO_NPC(pTarget)->GetProtoID() : 0))
        return;

    if (pTarget->isNPC())
    {
        uint8 type = TO_NPC(pTarget)->GetType();
        if (type == NPC_GUARD_TOWER1 || type == NPC_GUARD_TOWER2 || type == NPC_SOCCER_BAAL)
            return;

        if (GetZoneID() == ZONE_DELOS)
        {
            if (!TO_NPC(pTarget)->isMonster()
                && type != NPC_DESTROYED_ARTIFACT
                && type != NPC_OBJECT_FLAG
                && type != NPC_GATE)
                return;

            if (type == NPC_DESTROYED_ARTIFACT
                && (!g_pMain->isCswActive() || !g_pMain->isCswWarActive() || !isInClan()
                    || g_pMain->pSiegeWar.sMasterKnights == GetClanID()))
                return;
        }

        uint8 m_sByGroup = TO_NPC(pTarget)->GetByGroup();
        if (m_sByGroup == 3)
            return;
    }

    if (!isAttackable(pTarget))
        return;

    if (!isInAttackRange(pTarget))
        return;

    if (!CanAttack(pTarget))
        return;

    bResult = ATTACK_FAIL;

    if (isInTempleEventZone() && (!isSameEventRoom(pTarget) || !g_pMain->pTempleEvent.isAttackable))
        return;

    if (isInTempleQuestEventZone() && (!isSameEventRoom(pTarget) && m_ismsevent))
        return;

    if (pTarget->isPlayer() && pTarget->hasBuff(BUFF_TYPE_FREEZE))
        return;

    /*if (m_range && pTarget)
    {
        float mesafe = GetDistanceSqrt(pTarget);
        if (mesafe + 2.0f > (float)m_range)
            return;
    }*/

    damage = GetDamage(pTarget);

    // Can't use R attacks in the Snow War.
    if (GetZoneID() == ZONE_SNOW_BATTLE && g_pMain->m_byBattleOpen == SNOW_BATTLE)
        damage = 0;
    else if (GetZoneID() == ZONE_CHAOS_DUNGEON && g_pMain->pTempleEvent.isAttackable)
        damage = 500 / 10;

    if (GetZoneID() == ZONE_DUNGEON_DEFENCE)
    {
        _DUNGEON_DEFENCE_ROOM_INFO* pRoomBilgi = g_pMain->m_DungeonDefenceRoomListArray.GetData(GetEventRoom());
        if (pRoomBilgi != nullptr) {
            if (pRoomBilgi->m_DefenceisStarted == true)
                damage = 500 / 10;
        }
    }

    if (isInTempleEventZone() && !virt_eventattack_check())
        return;

    if (isInTempleEventZone() && (!isSameEventRoom(pTarget) || !g_pMain->pTempleEvent.isAttackable))
        return;

    if (pTarget->isNPC())
    {
        if (TO_NPC(pTarget)->GetType() == NPC_PRISON)
        {
            if (GetMana() < ((int32)m_MaxMp * 5 / 100))
                return;

            _ITEM_DATA* pItem;
            _ITEM_TABLE pTable = GetItemPrototype(RIGHTHAND, pItem);
            if (pItem == nullptr || pTable.isnull()
                || pItem->sDuration <= 0 // are we supposed to wear the pickaxe on use? Need to verify.
                || !pTable.isPunishmentStick())
                damage = 0;
            else
            {
                damage = 1;
                MSpChange(-((int32)m_MaxMp * 5 / 100));
            }
        }
        else if (TO_NPC(pTarget)->GetType() == NPC_FOSIL)
        {
            _ITEM_DATA* pItem;
            _ITEM_TABLE pTable = GetItemPrototype(RIGHTHAND, pItem);
            if (pItem == nullptr || pTable.isnull()
                || pItem->sDuration <= 0 // are we supposed to wear the pickaxe on use? Need to verify.
                || !pTable.isPickaxe())
                damage = 0;
            else
                damage = 1;
        }
        else if (TO_NPC(pTarget)->m_OrgNation == 3) // R Atack Kapatıldı 27.09.2020
        {
            damage = 0;
        }
        else if (TO_NPC(pTarget)->GetType() == NPC_OBJECT_FLAG && TO_NPC(pTarget)->GetProtoID() == 511)
            damage = 1;
        else if (TO_NPC(pTarget)->GetType() == NPC_REFUGEE)
        {
            if (TO_NPC(pTarget)->isMonster())
            {
                if (TO_NPC(pTarget)->GetProtoID() == 3202 || TO_NPC(pTarget)->GetProtoID() == 3203
                    || TO_NPC(pTarget)->GetProtoID() == 3252 || TO_NPC(pTarget)->GetProtoID() == 3253)
                    damage = 20;
                else
                    damage = 10;
            }
            else
                damage = 10;
        }
        else if (TO_NPC(pTarget)->GetType() == NPC_TREE /*|| TO_NPC(pTarget)->GetType() == NPC_SANTA*/)
            damage = 20;
        else if (TO_NPC(pTarget)->GetNation() == (uint8)Nation::NONE && TO_NPC(pTarget)->GetType() == NPC_PARTNER_TYPE)
            damage = 0;
        else if (VaccuniAttack())
            damage = 30000;
        else if (TO_NPC(pTarget)->GetType() == NPC_BORDER_MONUMENT)
            damage = 10;
    }   

    if (damage > 0)
    {
        pTarget->HpChange(-damage, this);
        if (pTarget->isDead())
            bResult = ATTACK_TARGET_DEAD;
        else
            bResult = ATTACK_SUCCESS;

        // Every attack takes a little of your weapon's durability.
        ItemWoreOut(ATTACK, damage);

        // Every hit takes a little of the defender's armour durability.
        if (pTarget->isPlayer())
            TO_USER(pTarget)->ItemWoreOut(DEFENCE, damage);
    }
    
    Packet result(WIZ_ATTACK, bType);
    result << bResult << GetSocketID() << tid << unknown;
    SendToRegion(&result, nullptr, GetEventRoom());
}
 
Çözüm

YNG

Moderatör
KY YardımSever
Coder
Katılım
21 Ağu 2022
Mesajlar
112
Çözümler
7
Tepkime puanı
109
Puanları
53
Yaş
35
kontrol ettim. kontrollerim esnasında

short CBot::GetDamage(Unit* pTarget, _MAGIC_TABLE pSkill /*= nullptr*/, bool bPreviewOnly /*= false*/)

bu paketin tüm kodlarının kapatıldığını fark ettim bu etkiler mi acaba? doğrulama yapabilecek biri var mı ?
Bot Sistemi üzerinde patlamamış attack void npc kısmında getType degerinde patlamıs atack yapılan yonksiyon NPC kontrol olmadıgından dolayı GetType Patlamış
 

byfantastiq

KY Kıdemli Üye
Katılım
3 Şub 2024
Mesajlar
176
Tepkime puanı
10
Puanları
18
Bot Sistemi üzerinde patlamamış attack void npc kısmında getType degerinde patlamıs atack yapılan yonksiyon NPC kontrol olmadıgından dolayı GetType Patlamış
paylaşım için teşekkürler patron bende isplayer olarak o paket çalışıyor şu an. build alırken Release ve x64 olarak build edince sorun çözüldü.
 

byfantastiq

KY Kıdemli Üye
Katılım
3 Şub 2024
Mesajlar
176
Tepkime puanı
10
Puanları
18
if (!pTarget->isPlayer())
{
if (TO_NPC(pTarget)->GetType() == NPC_PRISON)
{
if (GetMana() < ((int32)m_MaxMp * 5 / 100))
return;

_ITEM_DATA* pItem;
_ITEM_TABLE pTable = GetItemPrototype(RIGHTHAND, pItem);
if (pItem == nullptr || pTable.isnull()
|| pItem->sDuration <= 0 // are we supposed to wear the pickaxe on use? Need to verify.
|| !pTable.isPunishmentStick())
damage = 0;
else
{
damage = 1;
MSpChange(-((int32)m_MaxMp * 5 / 100));
}
}
else if (TO_NPC(pTarget)->GetType() == NPC_FOSIL)
{
_ITEM_DATA* pItem;
_ITEM_TABLE pTable = GetItemPrototype(RIGHTHAND, pItem);
if (pItem == nullptr || pTable.isnull()
|| pItem->sDuration <= 0 // are we supposed to wear the pickaxe on use? Need to verify.
|| !pTable.isPickaxe())
damage = 0;
else
damage = 1;
}
else if (TO_NPC(pTarget)->m_OrgNation == 3) // R Atack Kapatýldý 27.09.2020
{
damage = 0;
}
else if (TO_NPC(pTarget)->GetType() == NPC_OBJECT_FLAG && TO_NPC(pTarget)->GetProtoID() == 511)
damage = 1;
else if (TO_NPC(pTarget)->GetType() == NPC_REFUGEE)
{
if (TO_NPC(pTarget)->isMonster())
{
if (TO_NPC(pTarget)->GetProtoID() == 3202 || TO_NPC(pTarget)->GetProtoID() == 3203
|| TO_NPC(pTarget)->GetProtoID() == 3252 || TO_NPC(pTarget)->GetProtoID() == 3253)
damage = 20;
else
damage = 10;
}
else
damage = 10;
}
else if (TO_NPC(pTarget)->GetType() == NPC_TREE /*|| TO_NPC(pTarget)->GetType() == NPC_SANTA*/)
damage = 20;
else if (TO_NPC(pTarget)->GetNation() == (uint8)Nation::NONE && TO_NPC(pTarget)->GetType() == NPC_PARTNER_TYPE)
damage = 0;
else if (VaccuniAttack())
damage = 30000;
else if (TO_NPC(pTarget)->GetType() == NPC_BORDER_MONUMENT)
damage = 10;
}

bu kod hatalı mı yani ? senin attığını mı güncellemeliyiz? şu an bende bu kod ile çalışıyor
 

YNG

Moderatör
KY YardımSever
Coder
Katılım
21 Ağu 2022
Mesajlar
112
Çözümler
7
Tepkime puanı
109
Puanları
53
Yaş
35
if (!pTarget->isPlayer())
hatalı sen bot vurdugunda patlar
 
Reklam