Hikayeler

Reklam vermek için turkmmo@gmail.com

Animasyon hilesi fix

versiyon1 update
bazı eksik aniasmyonlar vardı düzeltildi

Kod:
#include <string>
#include <string_view>
#include <array>

// ====================================================================
// NİHAİ SIFIR TOLERANS (ULTIMATE STRICT HARDCODED) SİSTEMİ - C++20
// Tüm playersettingmodule.py verileri C++ çekirdeğine kilitlenmiştir.
// ====================================================================
CGraphicThing* CRaceData::RegisterMotionData(WORD wMotionMode, WORD wMotionIndex, const char * c_szFileName, BYTE byPercentage)
{
    std::string incomingPath(c_szFileName);
    size_t lastSlash = incomingPath.find_last_of("/\\");
    std::string folderPath = (lastSlash != std::string::npos) ? incomingPath.substr(0, lastSlash + 1) : "";
    std::string incomingName = (lastSlash != std::string::npos) ? incomingPath.substr(lastSlash + 1) : incomingPath;

    // ====================================================================
    // 1. NPC VE CANAVAR BYPASS (OYUNUN ÇÖKMESİNİ ENGELLER)
    // ====================================================================
    bool isPlayerCharacter = (folderPath.find("/pc/") != std::string::npos ||
                              folderPath.find("/pc2/") != std::string::npos ||
                              folderPath.find("/pc3/") != std::string::npos);

    if (!isPlayerCharacter)
    {
        // Yaratıklar, NPC'ler ve Petler için hile kontrolü yapmadan direkt yükle
        CRaceMotionData* pRaceMotionData = CRaceMotionData::New();
        if (pRaceMotionData->LoadMotionData(c_szFileName)) {
            pRaceMotionData->SetName(wMotionIndex);
            return NEW_RegisterMotion(pRaceMotionData, wMotionMode, wMotionIndex, pRaceMotionData->GetMotionFileName(), byPercentage);
        }
        CRaceMotionData::Delete(pRaceMotionData);
        return NULL;
    }

    // ====================================================================
    // 2. OYUNCU KARAKTERİ TESPİTİ
    // ====================================================================
    bool isWarrior  = (folderPath.find("warrior") != std::string::npos);
    bool isAssassin = (folderPath.find("assassin") != std::string::npos);
    bool isSura     = (folderPath.find("sura") != std::string::npos);
    bool isShaman   = (folderPath.find("shaman") != std::string::npos);
    bool isWolfman  = (folderPath.find("wolfman") != std::string::npos);

    std::string expectedName = "";

    // ====================================================================
    // 3. LONCA VE AT Becerileri (Özel ID'ler)
    // ====================================================================
    if (wMotionIndex >= CRaceMotionData::NAME_SKILL + 101 && wMotionIndex <= CRaceMotionData::NAME_SKILL + 106)
    {
        switch (wMotionIndex - CRaceMotionData::NAME_SKILL) {
            case 101: expectedName = "guild_yongsinuipi.msa"; break;
            case 102: expectedName = "guild_yongsinuichukbok.msa"; break;
            case 103: expectedName = "guild_seonghwigap.msa"; break;
            case 104: expectedName = "guild_gasokhwa.msa"; break;
            case 105: expectedName = "guild_yongsinuibunno.msa"; break;
            case 106: expectedName = "guild_jumunsul.msa"; break;
        }
    }
    else if (wMotionIndex >= CRaceMotionData::NAME_SKILL + 121 && wMotionIndex <= CRaceMotionData::NAME_SKILL + 123)
    {
        switch (wMotionIndex - CRaceMotionData::NAME_SKILL) {
            case 121: expectedName = "skill_wildattack.msa"; break;
            case 122: expectedName = "skill_charge.msa"; break;
            case 123: expectedName = "skill_splash.msa"; break;
        }
    }
    // ====================================================================
    // 4. KARAKTER YETENEKLERİ (MATEMATİKSEL İNŞA)
    // ====================================================================
    else if (wMotionIndex >= CRaceMotionData::NAME_SKILL && wMotionIndex < CRaceMotionData::NAME_SKILL + 100)
    {
        constexpr DWORD SKILL_GRADEGAP = 25;
        DWORD skillOffset = wMotionIndex - CRaceMotionData::NAME_SKILL;
        DWORD grade = skillOffset / SKILL_GRADEGAP; // 0=Normal, 1=M, 2=G, 3=P
        DWORD baseSkill = skillOffset % SKILL_GRADEGAP;

        std::string_view baseName = "";

        constexpr std::array<std::string_view, 22> wSkills = {"", "samyeon", "palbang", "jeongwi", "geomgyeong", "tanhwan", "gihyeol", "", "", "", "", "", "", "", "", "", "gigongcham", "gyeoksan", "daejin", "cheongeun", "geompung", "noegeom"};
        constexpr std::array<std::string_view, 22> aSkills = {"", "amseung", "gungsin", "charyun", "eunhyeong", "sangong", "seomjeon", "", "", "", "", "", "", "", "", "", "yeonsa", "gwangyeok", "hwajo", "gyeonggong", "dokgigung", "seomgwang"};
        constexpr std::array<std::string_view, 22> suSkills = {"", "swaeryeong", "yonggwon", "gwigeom", "gongpo", "jumagap", "pabeop", "", "", "", "", "", "", "", "", "", "maryeong", "hwayeom", "muyeong", "heuksin", "tusok", "mahwan"};
        constexpr std::array<std::string_view, 22> shSkills = {"", "bipabu", "yongpa", "paeryong", "hosin_target", "boho_target", "gicheon_target", "", "", "", "", "", "", "", "", "", "noejeon", "byeorak", "pokroe", "jeongeop_target", "kwaesok_target", "jeungryeok_target"};
        constexpr std::array<std::string_view, 7> wfSkills = {"", "split_slash", "wind_death", "reef_attack", "wreckage", "red_possession", "blue_possession"};

        if (isWarrior && baseSkill < wSkills.size()) baseName = wSkills[baseSkill];
        else if (isAssassin && baseSkill < aSkills.size()) baseName = aSkills[baseSkill];
        else if (isSura && baseSkill < suSkills.size()) baseName = suSkills[baseSkill];
        else if (isShaman && baseSkill < shSkills.size()) baseName = shSkills[baseSkill];
        else if (isWolfman && baseSkill < wfSkills.size()) baseName = wfSkills[baseSkill];

        if (!baseName.empty()) {
            expectedName = std::string(baseName);
            if (grade > 0) expectedName += "_" + std::to_string(grade + (isWolfman ? 0 : 1)); // Wolfman takıları 1'den başlar
            expectedName += ".msa";
        }
    }
    // ====================================================================
    // 5. GENEL HAREKETLER VE ANİMASYONLAR
    // ====================================================================
    else
    {
        switch (wMotionIndex)
        {
            // Orijinal Varyasyon İzinleri (Hilecilerin False-Positive almasını önler)
            case CRaceMotionData::NAME_WAIT:
                if (isWolfman) expectedName = (incomingName == "wait1.msa" || incomingName == "wait2.msa") ? incomingName : "wait.msa";
                else expectedName = (incomingName == "wait_1.msa" || incomingName == "wait_2.msa") ? incomingName : "wait.msa";
                break;
            
            case CRaceMotionData::NAME_DAMAGE:
                if (isWolfman) expectedName = (incomingName == "front_damage1.msa") ? "front_damage1.msa" : "front_damage.msa";
                else expectedName = (incomingName == "damage_1.msa") ? "damage_1.msa" : "damage.msa";
                break;
            
            case CRaceMotionData::NAME_DAMAGE_BACK:
                if (isWolfman) expectedName = (incomingName == "back_damage1.msa") ? "back_damage1.msa" : "back_damage.msa";
                else expectedName = (incomingName == "damage_3.msa") ? "damage_3.msa" : "damage_2.msa";
                break;
            
            case CRaceMotionData::NAME_COMBO_ATTACK_1:
                if (isWarrior) expectedName = (incomingName == "attack_1.msa") ? "attack_1.msa" : "attack.msa";
                else if (isWolfman) expectedName = (incomingName == "attack2.msa") ? "attack2.msa" : "attack1.msa";
                else if (isShaman || isSura || isAssassin) expectedName = (incomingName == "attack_1.msa") ? "attack_1.msa" : "attack.msa"; // Eğer düz vuruşsa attack.msa, silahlıysa combo_01 olur
                if (folderPath.find("general") == std::string::npos && !isWolfman) expectedName = "combo_01.msa"; // Silah takılıysa combo dosyası
                break;

            // Sabit Hareketler
            case CRaceMotionData::NAME_WALK: expectedName = "walk.msa"; break;
            case CRaceMotionData::NAME_RUN: expectedName = "run.msa"; break;
            case CRaceMotionData::NAME_CHANGE_WEAPON: expectedName = "change_weapon.msa"; break;
            case CRaceMotionData::NAME_DEAD: expectedName = "dead.msa"; break;
            case CRaceMotionData::NAME_DEAD_BACK: expectedName = "dead_back.msa"; break;
            case CRaceMotionData::NAME_DIG: expectedName = "dig.msa"; break;
            case CRaceMotionData::NAME_SPAWN: expectedName = "spawn.msa"; break;
            case CRaceMotionData::NAME_STOP: expectedName = "stop.msa"; break;

            // Yere Düşme / Uçma (Wolfman Uyumlu)
            case CRaceMotionData::NAME_DAMAGE_FLYING:
                expectedName = isWolfman ? "front_damage_flying.msa" : "damage_flying.msa"; break;
            case CRaceMotionData::NAME_STAND_UP:
                expectedName = isWolfman ? "front_falling_standup.msa" : "falling_stand.msa"; break;
            case CRaceMotionData::NAME_DAMAGE_FLYING_BACK:
                expectedName = "back_damage_flying.msa"; break;
            case CRaceMotionData::NAME_STAND_UP_BACK:
                expectedName = isWolfman ? "back_falling_standup.msa" : "back_falling_stand.msa"; break;

            // Kombolar
            case CRaceMotionData::NAME_COMBO_ATTACK_2: expectedName = "combo_02.msa"; break;
            case CRaceMotionData::NAME_COMBO_ATTACK_3: expectedName = "combo_03.msa"; break;
            case CRaceMotionData::NAME_COMBO_ATTACK_4: expectedName = "combo_04.msa"; break;
            case CRaceMotionData::NAME_COMBO_ATTACK_5: expectedName = "combo_05.msa"; break;
            case CRaceMotionData::NAME_COMBO_ATTACK_6: expectedName = "combo_06.msa"; break;
            case CRaceMotionData::NAME_COMBO_ATTACK_7: expectedName = "combo_07.msa"; break;
            case CRaceMotionData::NAME_COMBO_ATTACK_8: expectedName = "combo_08.msa"; break;

            // Intro
            case CRaceMotionData::NAME_INTRO_WAIT: expectedName = "wait.msa"; break;
            case CRaceMotionData::NAME_INTRO_SELECTED: expectedName = "selected.msa"; break;
            case CRaceMotionData::NAME_INTRO_NOT_SELECTED: expectedName = "not_selected.msa"; break;

            // Balık Tutma
            case CRaceMotionData::NAME_FISHING_THROW: expectedName = "throw.msa"; break;
            case CRaceMotionData::NAME_FISHING_WAIT: expectedName = "fishing_wait.msa"; break;
            case CRaceMotionData::NAME_FISHING_STOP: expectedName = "fishing_cancel.msa"; break;
            case CRaceMotionData::NAME_FISHING_REACT: expectedName = "fishing_react.msa"; break;
            case CRaceMotionData::NAME_FISHING_CATCH: expectedName = "fishing_catch.msa"; break;
            case CRaceMotionData::NAME_FISHING_FAIL: expectedName = "fishing_fail.msa"; break;

            // Duygular (Emotions)
            case CRaceMotionData::NAME_CLAP: expectedName = "clap.msa"; break;
            case CRaceMotionData::NAME_CONGRATULATION: expectedName = "congratulation.msa"; break;
            case CRaceMotionData::NAME_FORGIVE: expectedName = "forgive.msa"; break;
            case CRaceMotionData::NAME_ANGRY: expectedName = "angry.msa"; break;
            case CRaceMotionData::NAME_ATTRACTIVE: expectedName = "attractive.msa"; break;
            case CRaceMotionData::NAME_SAD: expectedName = "sad.msa"; break;
            case CRaceMotionData::NAME_SHY: expectedName = "shy.msa"; break;
            case CRaceMotionData::NAME_CHEERUP: expectedName = "cheerup.msa"; break;
            case CRaceMotionData::NAME_BANTER: expectedName = "banter.msa"; break;
            case CRaceMotionData::NAME_JOY: expectedName = "joy.msa"; break;
            case CRaceMotionData::NAME_CHEERS_1: expectedName = "cheers_1.msa"; break;
            case CRaceMotionData::NAME_CHEERS_2: expectedName = "cheers_2.msa"; break;
            case CRaceMotionData::NAME_DANCE_1: expectedName = "dance_1.msa"; break;
            case CRaceMotionData::NAME_DANCE_2: expectedName = "dance_2.msa"; break;
            case CRaceMotionData::NAME_DANCE_3: expectedName = "dance_3.msa"; break;
            case CRaceMotionData::NAME_DANCE_4: expectedName = "dance_4.msa"; break;
            case CRaceMotionData::NAME_DANCE_5: expectedName = "dance_5.msa"; break;
            case CRaceMotionData::NAME_DANCE_6: expectedName = "dance_6.msa"; break;

            // Etkileşimler (Öpücük, Tokat)
            case CRaceMotionData::NAME_KISS_WITH_WARRIOR: expectedName = "kiss_with_warrior.msa"; break;
            case CRaceMotionData::NAME_KISS_WITH_ASSASSIN: expectedName = "kiss_with_assassin.msa"; break;
            case CRaceMotionData::NAME_KISS_WITH_SURA: expectedName = "kiss_with_sura.msa"; break;
            case CRaceMotionData::NAME_KISS_WITH_SHAMAN: expectedName = "kiss_with_shaman.msa"; break;
            case CRaceMotionData::NAME_FRENCH_KISS_WITH_WARRIOR: expectedName = "french_kiss_with_warrior.msa"; break;
            case CRaceMotionData::NAME_FRENCH_KISS_WITH_ASSASSIN: expectedName = "french_kiss_with_assassin.msa"; break;
            case CRaceMotionData::NAME_FRENCH_KISS_WITH_SURA: expectedName = "french_kiss_with_sura.msa"; break;
            case CRaceMotionData::NAME_FRENCH_KISS_WITH_SHAMAN: expectedName = "french_kiss_with_shaman.msa"; break;
            case CRaceMotionData::NAME_SLAP_HIT_WITH_WARRIOR: expectedName = "slap_hit_with_warrior.msa"; break;
            case CRaceMotionData::NAME_SLAP_HIT_WITH_ASSASSIN: expectedName = "slap_hit_with_assassin.msa"; break;
            case CRaceMotionData::NAME_SLAP_HIT_WITH_SURA: expectedName = "slap_hit_with_sura.msa"; break;
            case CRaceMotionData::NAME_SLAP_HIT_WITH_SHAMAN: expectedName = "slap_hit_with_shaman.msa"; break;
            case CRaceMotionData::NAME_SLAP_HURT_WITH_WARRIOR: expectedName = "slap_hurt_with_warrior.msa"; break;
            case CRaceMotionData::NAME_SLAP_HURT_WITH_ASSASSIN: expectedName = "slap_hurt_with_assassin.msa"; break;
            case CRaceMotionData::NAME_SLAP_HURT_WITH_SURA: expectedName = "slap_hurt_with_sura.msa"; break;
            case CRaceMotionData::NAME_SLAP_HURT_WITH_SHAMAN: expectedName = "slap_hurt_with_shaman.msa"; break;

#ifdef ENABLE_WOLFMAN_CHARACTER
            case CRaceMotionData::NAME_KISS_WITH_WOLFMAN: expectedName = "kiss_with_wolfman.msa"; break;
            case CRaceMotionData::NAME_FRENCH_KISS_WITH_WOLFMAN: expectedName = "french_kiss_with_wolfman.msa"; break;
            case CRaceMotionData::NAME_SLAP_HIT_WITH_WOLFMAN: expectedName = "slap_hit_with_wolfman.msa"; break;
            case CRaceMotionData::NAME_SLAP_HURT_WITH_WOLFMAN: expectedName = "slap_hurt_with_wolfman.msa"; break;
#endif
        }
    }

    // ====================================================================
    // 6. SONUÇ: ZORLA YÜKLEME (FORCE LOAD)
    // ====================================================================
    std::string targetPath = incomingPath;

    // Eğer motorumuz oyuncu için sabit bir dosya adı ürettiyse (Boş değilse):
    if (!expectedName.empty())
    {
        targetPath = folderPath + expectedName;
        
        // Log Kirliliğini Önleme: Sadece gelen isim sabitimizden farklıysa (yani hileliyse) hata basar.
        if (incomingName != expectedName) {
            TraceError("CRaceData::RegisterMotionData - HILE ENGELLENDI: %s -> C++ tarafindan %s dayatildi.", incomingName.c_str(), expectedName.c_str());
        }
    }

    CRaceMotionData * pRaceMotionData = CRaceMotionData::New();
    
    // C++ motorunun kendi dayattığı %100 Orijinal dosyayı yükle
    if (!pRaceMotionData->LoadMotionData(targetPath.c_str()))
    {
        CRaceMotionData::Delete(pRaceMotionData);
        return NULL;
    }

    pRaceMotionData->SetName(wMotionIndex);
    return NEW_RegisterMotion(pRaceMotionData, wMotionMode, wMotionIndex, pRaceMotionData->GetMotionFileName(), byPercentage);
}
 
at bi tane beğenirsem yapayım :)
Gemini_Generated_Image_vkuezyvkuezyvkue.png


Gemini_Generated_Image_iyiqlkiyiqlkiyiq.png
 

Şu an konuyu görüntüleyenler (Toplam : 1, Üye: 0, Misafir: 1)

Geri
Üst