Çözüldü Şeytan Kulesi Metin Ve Kilit Katı Döngü Sorunu

Bu konu çözüme ulaştırılmıştır. Çözüm için konuya yazılan tüm yorumları okumayı unutmayın. Eğer konudaki yorumlar sorununuzu çözmediyse yeni bir konu açabilirsiniz.
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.

melihalbayrak

Geliştirici
Geliştirici
Yardımsever Üye
Usta Üye
Mesaj
1.241
Çözümler
81
Beğeni
677
Puan
1.109
Ticaret Puanı
0
Kulede metin katında doğru metini kesip kilit taşı katına geldiğim andan itibaren sürekli bir döngüye girip kilit katında olduğum halde sürekli doğru metini kestin üst kata çıkacaksın diyor ışınlayıp duruyor sürekli döngüye giriyor böyle. Quest değiştirdim data dungeon dewiltover1 2 3 gibi giden txt leri değiştirdim ama çözemedim.
 
Çözüm
İllaki denemişsindir ve kontrol etmişsindir ama deviltower4_regen.txt içinde 8016 kodlu mobun adet sayısı 1 mi acaba?
Ve questleri değiştirirken, bir önceki queste dair bütün kalıntıları temizlemeyi atladıysan bir de komple temizleyip dene istersen.
Elbette denediğin her dosyanın sorunla olması imkansız ama eğer geride kalıntılar kalmışsa bu da sorunun devam etmesini sağlayabilir.
Kapatılabilir. Birde konuyu düzenlerseniz mesajlar flood gibi oldu :)
Soru şu koddan kaynaklıymış.

C++:
Genişlet Daralt Kopyala
#ifdef FIX_109
            if (npc >= MAIN_RACE_MAX_NUM)
                m_mapNPC[npc].OnKill(*pPC);
            m_mapNPC[QUEST_NO_NPC].OnKill(*pPC);
#else
            m_mapNPC[npc].OnKill(*pPC);
#endif

Açıklamasında başka bir fileste şöyle yazılmış ne demekse...
Bence hiç uğraşma direkt sağlam bir filesten çek komple. Map klasorunden questine kadar her şeyi değiştir.
 
Bu sorun quest ile ilgili değil. Ben de çözümünü çok aramıştım. Büyük ihtimal bu düzenleme sizde de var. Bu kodlar ekliyse kaldırın (eskiye çevirin).

Linkleri görebilmek için giriş yap veya kayıt ol.
Yok bende böyle bir işlem bakabilirsin.

Char Destroy Bloğu:
Genişlet Daralt Kopyala
void CHARACTER::Destroy()
{
    CloseMyShop();

    if (m_pkRegen)
    {
        if (m_pkDungeon)
        {
            if (m_pkDungeon->IsValidRegen(m_pkRegen, regen_id_))
            {
                --m_pkRegen->count;
            }
        }
        else
        {
            --m_pkRegen->count;
        }
        m_pkRegen = NULL;
    }

    if (m_pkDungeon)
    {
        SetDungeon(NULL);
    }

    HorseSummon(false);

    if (GetRider())
        GetRider()->ClearHorseInfo();

    if (GetDesc())
    {
        GetDesc()->BindCharacter(NULL);
    }

    if (m_pkExchange)
        m_pkExchange->Cancel();

    SetVictim(NULL);

    if (GetShop())
    {
        GetShop()->RemoveGuest(this);
        SetShop(NULL);
    }

    ClearStone();
    ClearSync();
    ClearTarget();

    if (NULL == m_pkMobData)
    {
        ClearItem();
    }

    LPPARTY party = m_pkParty;
    if (party)
    {
        if (party->GetLeaderPID() == GetVID() && !IsPC())
        {
            M2_DELETE(party);
        }
        else
        {
            party->Unlink(this);

            if (!IsPC())
                party->Quit(GetVID());
        }

        SetParty(NULL);
    }

    if (m_pkMobInst)
    {
        M2_DELETE(m_pkMobInst);
        m_pkMobInst = NULL;
    }

    m_pkMobData = NULL;

    if (m_pkSafebox)
    {
        M2_DELETE(m_pkSafebox);
        m_pkSafebox = NULL;
    }

    if (m_pkMall)
    {
        M2_DELETE(m_pkMall);
        m_pkMall = NULL;
    }

    for (TMapBuffOnAttrs::iterator it = m_map_buff_on_attrs.begin();  it != m_map_buff_on_attrs.end(); it++)
    {
        if (NULL != it->second)
        {
            M2_DELETE(it->second);
        }
    }

    m_map_buff_on_attrs.clear();

    m_set_pkChrSpawnedBy.clear();

    StopMuyeongEvent();
    event_cancel(&m_pkWarpNPCEvent);
    event_cancel(&m_pkRecoveryEvent);
    event_cancel(&m_pkDeadEvent);
    event_cancel(&m_pkSaveEvent);
    event_cancel(&m_pkTimedEvent);
    event_cancel(&m_pkStunEvent);
    event_cancel(&m_pkFishingEvent);
    event_cancel(&m_pkPoisonEvent);
    event_cancel(&m_pkFireEvent);
    event_cancel(&m_pkPartyRequestEvent);
    event_cancel(&m_pkWarpEvent);
    event_cancel(&m_pkCheckSpeedHackEvent);

#ifdef ENABLE_GIFT_SYSTEM
    event_cancel(&m_pkGiftRefresh);
    m_dwLastGiftPage = 0;
    m_mapGiftGrid.clear();
#endif

#ifdef ENABLE_OFFLINE_SHOP
    event_cancel(&m_pkRefreshShopEvent);
    bprivShop = 0;
    bprivShopOwner = 0;
    dw_ShopTime = 0;
    m_mapshops.clear();
#endif

    event_cancel(&m_pkMiningEvent);

    for (auto it = m_mapMobSkillEvent.begin(); it != m_mapMobSkillEvent.end(); ++it)
    {
        LPEVENT pkEvent = it->second;
        event_cancel(&pkEvent);
    }
    m_mapMobSkillEvent.clear();

    ClearAffect();

    event_cancel(&m_pkDestroyWhenIdleEvent);

    if (m_pSkillLevels)
    {
        M2_DELETE_ARRAY(m_pSkillLevels);
        m_pSkillLevels = NULL;
    }

    CEntity::Destroy();

    if (GetSectree())
        GetSectree()->RemoveEntity(this);

    if (m_bMonsterLog)
        CHARACTER_MANAGER::instance().UnregisterForMonsterLog(this);
}

Char Battle ilgili blok:
Genişlet Daralt Kopyala
void CHARACTER::Dead(LPCHARACTER pkKiller, bool bImmediateDead)
{
    if (IsDead())
        return;

#ifndef DISABLE_STOP_RIDING_WHEN_DIE
    {
        if (IsHorseRiding())
        {
            StopRiding();
        }
        else if (GetMountVnum())
        {
            RemoveAffect(AFFECT_MOUNT_BONUS);
            m_dwMountVnum = 0;
            UnEquipSpecialRideUniqueItem();

            UpdatePacket();
        }
    }
#endif

    if (!pkKiller && m_dwKillerPID)
        pkKiller = CHARACTER_MANAGER::instance().FindByPID(m_dwKillerPID);

    m_dwKillerPID = 0;

#ifdef ENABLE_SKILL_COOLTIME_UPDATE
    if (IsPC())
        ResetSkillCoolTimes();
#endif

    bool isAgreedPVP = false;
    bool isUnderGuildWar = false;
    bool isDuel = false;
    bool isForked = false;

    if (pkKiller && pkKiller->IsPC())
    {
        if (pkKiller->m_pkChrTarget == this)
            pkKiller->SetTarget(NULL);

        if (!IsPC() && pkKiller->GetDungeon())
            pkKiller->GetDungeon()->IncKillCount(pkKiller, this);

        isAgreedPVP = CPVPManager::instance().Dead(this, pkKiller->GetPlayerID());
        isDuel = CArenaManager::instance().OnDead(pkKiller, this);

        if (IsPC())
        {
            CGuild * g1 = GetGuild();
            CGuild * g2 = pkKiller->GetGuild();

            if (g1 && g2)
                if (g1->UnderWar(g2->GetID()))
                    isUnderGuildWar = true;

            pkKiller->SetQuestNPCID(GetVID());
            quest::CQuestManager::instance().Kill(pkKiller->GetPlayerID(), quest::QUEST_NO_NPC);
            CGuildManager::instance().Kill(pkKiller, this);
        }
    }

    if (pkKiller &&
            !isAgreedPVP &&
            !isUnderGuildWar &&
            IsPC() &&
            !isDuel &&
            !isForked &&
            !IS_CASTLE_MAP(GetMapIndex()))
    {
        if (GetGMLevel() == GM_PLAYER || test_server)
        {
            ItemDropPenalty(pkKiller);
        }
    }

    if (IS_CASTLE_MAP(GetMapIndex()))
    {
        if (CASTLE_FROG_VNUM == GetRaceNum())
            castle_frog_die(this, pkKiller);
        else if (castle_is_guard_vnum(GetRaceNum()))
            castle_guard_die(this, pkKiller);
        else if (castle_is_tower_vnum(GetRaceNum()))
            castle_tower_die(this, pkKiller);
    }

    SetPosition(POS_DEAD);
    ClearAffect(true);

    if (pkKiller && IsPC())
    {
        if (!pkKiller->IsPC())
        {
            if (!isForked)
            {
                sys_log(1, "DEAD: %s %p WITH PENALTY", GetName(), this);
                SET_BIT(m_pointsInstant.instant_flag, INSTANT_FLAG_DEATH_PENALTY);
                LogManager::instance().CharLog(this, pkKiller->GetRaceNum(), "DEAD_BY_NPC", pkKiller->GetName());
            }
        }
        else
        {
            sys_log(1, "DEAD_BY_PC: %s %p KILLER %s %p", GetName(), this, pkKiller->GetName(), get_pointer(pkKiller));
            REMOVE_BIT(m_pointsInstant.instant_flag, INSTANT_FLAG_DEATH_PENALTY);

            if (GetEmpire() != pkKiller->GetEmpire())
            {
                int iEP = MIN(GetPoint(POINT_EMPIRE_POINT), pkKiller->GetPoint(POINT_EMPIRE_POINT));

                PointChange(POINT_EMPIRE_POINT, -(iEP / 10));
                pkKiller->PointChange(POINT_EMPIRE_POINT, iEP / 5);

                if (GetPoint(POINT_EMPIRE_POINT) < 10)
                {
                }

                char buf[256];
                snprintf(buf, sizeof(buf),
                        "%d %d %d %s %d %d %d %s",
                        GetEmpire(), GetAlignment(), GetPKMode(), GetName(),
                        pkKiller->GetEmpire(), pkKiller->GetAlignment(), pkKiller->GetPKMode(), pkKiller->GetName());

                LogManager::instance().CharLog(this, pkKiller->GetPlayerID(), "DEAD_BY_PC", buf);
            }
            else
            {
                if (!isAgreedPVP && !isUnderGuildWar && !IsKillerMode() && GetAlignment() >= 0 && !isDuel && !isForked)
                {
                    int iNoPenaltyProb = 0;

                    if (pkKiller->GetAlignment() >= 0)    // 1/3 percent down
                        iNoPenaltyProb = 33;
                    else                // 4/5 percent down
                        iNoPenaltyProb = 20;

                    if (number(1, 100) < iNoPenaltyProb)
                        pkKiller->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("용신의 보호로 아이템이 떨어지지 않았습니다."));
                    else
                    {
                        if (pkKiller->GetParty())
                        {
                            FPartyAlignmentCompute f(-20000, pkKiller->GetX(), pkKiller->GetY());
                            pkKiller->GetParty()->ForEachOnlineMember(f);

                            if (f.m_iCount == 0)
                                pkKiller->UpdateAlignment(-20000);
                            else
                            {
                                sys_log(0, "ALIGNMENT PARTY count %d amount %d", f.m_iCount, f.m_iAmount);

                                f.m_iStep = 1;
                                pkKiller->GetParty()->ForEachOnlineMember(f);
                            }
                        }
                        else
                            pkKiller->UpdateAlignment(-20000);
                    }
                }

                char buf[256];
                snprintf(buf, sizeof(buf),
                        "%d %d %d %s %d %d %d %s",
                        GetEmpire(), GetAlignment(), GetPKMode(), GetName(),
                        pkKiller->GetEmpire(), pkKiller->GetAlignment(), pkKiller->GetPKMode(), pkKiller->GetName());

                LogManager::instance().CharLog(this, pkKiller->GetPlayerID(), "DEAD_BY_PC", buf);
            }
        }
    }
    else
    {
        sys_log(1, "DEAD: %s %p", GetName(), this);
        REMOVE_BIT(m_pointsInstant.instant_flag, INSTANT_FLAG_DEATH_PENALTY);
    }

    ClearSync();

    event_cancel(&m_pkStunEvent);

    if (IsPC())
    {
        m_dwLastDeadTime = get_dword_time();
        SetKillerMode(false);
        GetDesc()->SetPhase(PHASE_DEAD);
    }
    else
    {
        if (!IS_SET(m_pointsInstant.instant_flag, INSTANT_FLAG_NO_REWARD))
        {
            if (!(pkKiller && pkKiller->IsPC() && pkKiller->GetGuild() && pkKiller->GetGuild()->UnderAnyWar(GUILD_WAR_TYPE_FIELD)))
            {
#ifdef FIX_GETMOB
                if (m_pkMobData != NULL && GetMobTable().dwResurrectionVnum)
#else
                if (GetMobTable().dwResurrectionVnum)
#endif
                {
                    LPCHARACTER chResurrect = CHARACTER_MANAGER::instance().SpawnMob(GetMobTable().dwResurrectionVnum, GetMapIndex(), GetX(), GetY(), GetZ(), true, (int) GetRotation());
                    if (GetDungeon() && chResurrect)
                    {
                        chResurrect->SetDungeon(GetDungeon());
                    }

                    Reward(false);
                }
                else if (IsRevive() == true)
                {
                    Reward(false);
                }
                else
                {
                    Reward(true);
                }
            }
            else
            {
                if (pkKiller->m_dwUnderGuildWarInfoMessageTime < get_dword_time())
                {
                    pkKiller->m_dwUnderGuildWarInfoMessageTime = get_dword_time() + 60000;
                    pkKiller->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<길드> 길드전중에는 사냥에 따른 이익이 없습니다."));
                }
            }
        }
    }

    if (GetMobRank() >= MOB_RANK_BOSS && pkKiller && pkKiller->IsPC())
    {
        char buf[51];
        snprintf(buf, sizeof(buf), "%d %ld", g_bChannel, pkKiller->GetMapIndex());
        if (IsStone())
            LogManager::instance().CharLog(pkKiller, GetRaceNum(), "STONE_KILL", buf);
        else
            LogManager::instance().CharLog(pkKiller, GetRaceNum(), "BOSS_KILL", buf);
    }

    TPacketGCDead pack;
    pack.header    = HEADER_GC_DEAD;
    pack.vid    = m_vid;
    PacketAround(&pack, sizeof(pack));

    REMOVE_BIT(m_pointsInstant.instant_flag, INSTANT_FLAG_STUN);

    if (GetDesc() != NULL) {
        auto it = m_list_pkAffect.begin();

        while (it != m_list_pkAffect.end())
            SendAffectAddPacket(GetDesc(), *it++);
    }

    if (isDuel == false)
    {
        if (m_pkDeadEvent)
        {
            sys_log(1, "DEAD_EVENT_CANCEL: %s %p %p", GetName(), this, get_pointer(m_pkDeadEvent));
            event_cancel(&m_pkDeadEvent);
        }

        if (IsStone())
            ClearStone();

        if (GetDungeon())
        {
            GetDungeon()->DeadCharacter(this);
        }

        SCharDeadEventInfo* pEventInfo = AllocEventInfo<SCharDeadEventInfo>();

        if (IsPC())
        {
            pEventInfo->isPC = true;
            pEventInfo->dwID = this->GetPlayerID();

            m_pkDeadEvent = event_create(dead_event, pEventInfo, PASSES_PER_SEC(180));
        }
        else
        {
            pEventInfo->isPC = false;
            pEventInfo->dwID = this->GetVID();

            if (IsRevive() == false && HasReviverInParty() == true)
            {
                m_pkDeadEvent = event_create(dead_event, pEventInfo, bImmediateDead ? 1 : PASSES_PER_SEC(3));
            }
            else
            {
#ifdef FIX_202
                m_pkDeadEvent = event_create(dead_event, pEventInfo, bImmediateDead ? 1 : PASSES_PER_SEC(0));
#else
                m_pkDeadEvent = event_create(dead_event, pEventInfo, bImmediateDead ? 1 : PASSES_PER_SEC(10));
#endif
            }
        }

        sys_log(1, "DEAD_EVENT_CREATE: %s %p %p", GetName(), this, get_pointer(m_pkDeadEvent));
    }

    if (m_pkExchange != NULL)
    {
        m_pkExchange->Cancel();
    }

    if (IsCubeOpen() == true)
    {
        Cube_close(this);
    }
   
    CShopManager::instance().StopShopping(this);
    CloseMyShop();
    CloseSafebox();

    if (true == IsMonster() && 2493 == GetMobTable().dwVnum)
    {
        if (NULL != pkKiller && NULL != pkKiller->GetGuild())
        {
            CDragonLairManager::instance().OnDragonDead( this, pkKiller->GetGuild()->GetID() );
        }
        else
        {
            sys_err("DragonLair: Dragon killed by nobody");
        }
    }
}
 
Emin değilim ancak bir şey dikkatimi çekti, metin taşları neden ikişer tane? Standartın dışına çıkılmış bir durum bence bu. Ve bir tür bug'a sebep oluyor olabilir.
Ayrıca questi paylaşabilir misin?
 
Emin değilim ancak bir şey dikkatimi çekti, metin taşları neden ikişer tane? Standartın dışına çıkılmış bir durum bence bu. Ve bir tür bug'a sebep oluyor olabilir.
Ayrıca questi paylaşabilir misin?
Evet onu belirtmeyi unutmuşum aklımdaydı yoksa. Metinler ikişerli spawn ediyor. Quest olarak maxmi 3.6 dan aldım başka bi filesten aldım sonra türkmmo altyapısındanda aldım yine aynı sorun.
 
Evet onu belirtmeyi unutmuşum aklımdaydı yoksa. Metinler ikişerli spawn ediyor. Quest olarak maxmi 3.6 dan aldım başka bi filesten aldım sonra türkmmo altyapısındanda aldım yine aynı sorun.
Bence sorunun sebebi bu olabilir. Yani metinlerin ikişerli olması.
Metinler ikişerli olduğu için doğru metin ile fake metin bir arada olmuş oluyor doğal olarak. Yani hem doğru metini bulmuş oluyorsun hemde fake metini kesmiş oluyorsun ve sırasıyla iki işlem yapıyor olabilir. Önce doğru metni kestiğin için seni üst kata atıyor, daha sonra beraberinde yanlış metni kestiğin için geriye atıyor olabilir. Metinleri tekli olarak spawnlayıp denedin mi hiç ? Ya da bunu sağlayabildin mi?
 
Bence sorunun sebebi bu olabilir. Yani metinlerin ikişerli olması.
Metinler ikişerli olduğu için doğru metin ile fake metin bir arada olmuş oluyor doğal olarak. Yani hem doğru metini bulmuş oluyorsun hemde fake metini kesmiş oluyorsun ve sırasıyla iki işlem yapıyor olabilir. Önce doğru metni kestiğin için seni üst kata atıyor, daha sonra beraberinde yanlış metni kestiğin için geriye atıyor olabilir. Metinleri tekli olarak spawnlayıp denedin mi hiç ? Ya da bunu sağlayabildin mi?
Metinlerin spawnlanması quest içinden ayarlanmıyor mu? Quest spawnlıyorsa zaten 3 farklı quest denedim üçüde sorunlu olamaz. Map klasörünü ve şu data dungeon içindeki 9 adet txt var deviltower adlı onlarıda değiştirdim türkmmo altyapısı ile ama bie çözüme ulaşamadım her denememde o metinler hep ikişerli gözüküyor.
 
Verdiğim kod dungeon monster count fixi idi. İstersen o kodları ekleyip dene. İkişerli metin sorunu çözülür belki. Sorun quest veya data dosyalarıyla ilgili değil game taraflı bence.
 
Tam neyin çözümü o fix açıklar mısın?

Dungeonda mobları doğru sayamaması veya yanlış sayması sanırım. Tüm slotlar kesilmesine rağmen üst kata atmıyor bunun çözümüydü. Konuyu şuan bulamıyorum ama hatırladığım bu. Sorun burada metinlerin çift olması zaten. Metinler tek olduğu zaman sorun kalkacak.

Linkleri görebilmek için giriş yap veya kayıt ol.
 
Metinlerin spawnlanması quest içinden ayarlanmıyor mu? Quest spawnlıyorsa zaten 3 farklı quest denedim üçüde sorunlu olamaz. Map klasörünü ve şu data dungeon içindeki 9 adet txt var deviltower adlı onlarıda değiştirdim türkmmo altyapısı ile ama bie çözüme ulaşamadım her denememde o metinler hep ikişerli gözüküyor.
İllaki denemişsindir ve kontrol etmişsindir ama deviltower4_regen.txt içinde 8016 kodlu mobun adet sayısı 1 mi acaba?
Ve questleri değiştirirken, bir önceki queste dair bütün kalıntıları temizlemeyi atladıysan bir de komple temizleyip dene istersen.
Elbette denediğin her dosyanın sorunla olması imkansız ama eğer geride kalıntılar kalmışsa bu da sorunun devam etmesini sağlayabilir.
 
İllaki denemişsindir ve kontrol etmişsindir ama deviltower4_regen.txt içinde 8016 kodlu mobun adet sayısı 1 mi acaba?
Ve questleri değiştirirken, bir önceki queste dair bütün kalıntıları temizlemeyi atladıysan bir de komple temizleyip dene istersen.
Elbette denediğin her dosyanın sorunla olması imkansız ama eğer geride kalıntılar kalmışsa bu da sorunun devam etmesini sağlayabilir.
Make.sh çekince object temizlenip questleri okuyor diye biliyorum yanlışım yoksa make.sh yazarak tüm questleri okuttum her seferinde kalıntı olacağını sanmam.
 
İllaki denemişsindir ve kontrol etmişsindir ama deviltower4_regen.txt içinde 8016 kodlu mobun adet sayısı 1 mi acaba?
Ve questleri değiştirirken, bir önceki queste dair bütün kalıntıları temizlemeyi atladıysan bir de komple temizleyip dene istersen.
Elbette denediğin her dosyanın sorunla olması imkansız ama eğer geride kalıntılar kalmışsa bu da sorunun devam etmesini sağlayabilir.
Devil4 txt içindeki satır.

Kod:
Genişlet Daralt Kopyala
ma    372    631    0    0    0    0    0s    100    1    8016

Quest:
Genişlet Daralt Kopyala
quest deviltower_zone begin
    state start begin
        when login begin
            if pc.get_map_index() == 66 then
                if pc.get_x() < 2048+88 or pc.get_y() < 6656+577 or pc.get_x() > 2048+236 or pc.get_y() > 6656+737 then
                    pc.warp(590500, 110500)
                end
                pc.set_warp_location(65, 5905, 1105)
            elseif pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 then
                pc.set_warp_location(65, 5905, 1105)
                deviltower_zone.register_player(pc.get_vid())
            end
        end
       


        when logout begin
            if pc.count_item(30300) >= 1 then
                pc.remove_item(30300, pc.count_item(30300))
            end
            if pc.count_item(30302) >= 1 then
                pc.remove_item(30302, pc.count_item(30302))
            end              
            if pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 then
                deviltower_zone.unregister_player(pc.get_vid())      
            end
        end
        when deviltower_man.chat."Şeytan Kulesi " begin
            if pc.get_level() < 30 then
                say_title("Şeytan Kulesi Bekçisi:")
                say("Seviyen giriş için yeterli değil.")
                return
            else
                say_title("Şeytan Kulesi Bekçisi:")
                say("Şeytan kulesine girmek istiyor musun?")
                say("2. Kattan devam etmek isterseniz 25M yang gerekmektedir.")
                say_reward("Oyundan istemediğiniz halde çıkarsanız")
                say_reward("Kaldığınız yerden devam edebilirsiniz!")
                local s = select("Gir.", "2.Kat'a Giriş Yap.", "İstemiyorum.")
                if s == 1 then
                    pc.warp(216500,727000)
                elseif s == 2 then
                    if pc.get_money() < 25000000 then
                        say("Hay Aksi!")
                        say("Envanterine 25M yang olmadan seni içeri alamam.")
                        say("25M yang yaptığında tekrar uğra.")
                    else
                        pc.change_money(-25000000)
                        d.new_jump(66, special.devil_tower[1][1] * 100, special.devil_tower[1][2] * 100)
                        d.regen_file("data/dungeon/deviltower2_regen.txt")
                        d.set_warp_at_eliminate(4, d.get_map_index(), special.devil_tower[2][1], special.devil_tower[2][2], "data/dungeon/deviltower3_regen.txt")
                    end
                elseif s == 3 then
                    return
                end
            end
        end

        function GrupKontrol()
            local pids = {party.get_member_pids()}
            for i = 1, table.getn(pids), 1 do
                q.begin_other_pc_block(pids[i])
                if party.is_party() then
                    if party.is_leader() then
                        timer("devil_stone1_2", 2)
                    end
                end
                q.end_other_pc_block()
            end
        end
       
       
        function CatacombIzın()
            local pids = {party.get_member_pids()}
            for i = 1, table.getn(pids), 1 do
                q.begin_other_pc_block(pids[i])
                pc.setf("deviltower_zone","9_done",1)
                q.end_other_pc_block()
            end
        end
   

        when 8015.kill with pc.get_map_index() == 66 begin
            if party.is_party() then
                deviltower_zone.GrupKontrol()
            else
                timer("devil_stone1_1", 2)
            end
        end
        when devil_stone1_1.timer begin
            d.join_coords(66,special.devil_tower[1][1],special.devil_tower[1][2])
            d.regen_file("data/dungeon/deviltower2_regen.txt")
            d.setf("party_leader_pid",pc.get_player_id())
            d.set_warp_at_eliminate(4, d.get_map_index(), special.devil_tower[2][1], special.devil_tower[2][2], "data/dungeon/deviltower3_regen.txt")
        end
        when devil_stone1_2.timer begin
            d.join_coords(66,special.devil_tower[1][1],special.devil_tower[1][2])
            d.regen_file("data/dungeon/deviltower2_regen.txt")
            d.setf("party_leader_pid",party.get_leader_pid())
            party.setf("deviltower_mapindex",d.get_map_index())
            d.set_warp_at_eliminate(4, d.get_map_index(), special.devil_tower[2][1], special.devil_tower[2][2], "data/dungeon/deviltower3_regen.txt")
        end
        when kill with npc.get_race() == 1091 begin
            d.set_warp_at_eliminate(4, d.get_map_index(), special.devil_tower[3][1], special.devil_tower[3][2], "data/dungeon/deviltower4_regen.txt")
            d.check_eliminated()
        end
        function get_4floor_stone_pos()
            local positions =
            {
                {368, 629}, {419, 630}, {428, 653}, {422, 679},
                {395, 689}, {369, 679}, {361, 658},
            }
            for i = 1, 6 do
                local j = number(i, 7)
                if i != j then
                    local t = positions[i];
                    positions[i] = positions[j];
                    positions[j] = t;
                end
            end
            return positions
        end
        when kill with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 and npc.get_race() == 8016 begin
            d.setf("level", 4)
            local positions = deviltower_zone.get_4floor_stone_pos()
            for i = 1, 6 do
                d.set_unique("fake" .. i , d.spawn_mob(8017, positions[i][1], positions[i][2]))
            end
            local vid = d.spawn_mob(8017, positions[7][1], positions[7][2])
            d.set_unique("real", vid)
            server_loop_timer('devil_stone4_update', 10, pc.get_map_index())
            server_timer('devil_stone4_fail1', 5*60, pc.get_map_index())

            d.notice("4. Kat Seçenek Kapısındasın.");
            d.notice("Gözlerini ve kulaklarını aldatacak bir çok sahte");
            d.notice("Metin Taşı mevcut. 15 dakika içerisinde");
            d.notice("gerçek Metin Taşı'nı bul ve yok et!");
            d.notice("Kapıdan geçmenin tek yolu budur.");
        end

        when devil_stone4_fail1.server_timer begin
            if d.select(get_server_timer_arg()) then
                d.notice("10 dakika kaldı ")
                server_timer('devil_stone4_fail2', 5*60, get_server_timer_arg())
            end
        end

        when devil_stone4_fail2.server_timer begin
            if d.select(get_server_timer_arg()) then
                d.notice("5 dakika kaldı ")
                server_timer('devil_stone4_fail', 5*60, get_server_timer_arg())
            end
        end

        when devil_stone4_fail.server_timer begin
            if d.select(get_server_timer_arg()) and d.getf("level") == 4 then
                d.notice("Zaman doldu! ")
                d.exit_all()
            end
        end

        when devil_stone4_update.server_timer begin
            if d.select(get_server_timer_arg()) then
                if not d.is_unique_dead("real") then
                    for i = 1, 6 do
                        if d.getf("fakedead" .. i) == 0 then
                            if d.unique_get_hp_perc("fake" .. i) < 50 then
                                d.purge_unique("fake" .. i)
                                d.setf("fakedead" .. i, 1)
                                d.notice("Sahte Metin taşları yok oldu...");
                            end
                        end
                    end
                else
                    server_timer("devil_stone4_end", 5, get_server_timer_arg())
                   
                    d.notice("Mükemmel bir duyma yeteneğine ve iyi bir");
                    d.notice("içgüdüye sahip olduğunu kanıtlayarak");
                    d.notice("gerçek Metin Taşı'nı yok ettin!");
                    d.notice("Şimdi 5.kata gireceksin.")
                    d.purge()
                end
            else
                server_timer('devil_stone4_stop_timer', 1, get_server_timer_arg())
            end
        end

        when devil_stone4_stop_timer.server_timer begin
            clear_server_timer('devil_stone4_update', get_server_timer_arg())
        end

        when devil_stone4_end.server_timer begin
            if d.select(get_server_timer_arg()) then
                clear_server_timer('devil_stone4_update', get_server_timer_arg())
                clear_server_timer('devil_stone4_fail1', get_server_timer_arg())
                clear_server_timer('devil_stone4_fail2', get_server_timer_arg())
                clear_server_timer('devil_stone4_fail', get_server_timer_arg())

                d.setf("level", 5)
                d.setf("stone_count", 5)
               
                d.jump_all(special.devil_tower[4][1], special.devil_tower[4][2])
                d.notice("5.Kattaki Mühürlü Kapı'dasın. Bir sonraki kata ")
                d.notice("çıkmak için beş Eski Mühür'ü açman gerek. Bu alan ")
                d.notice("sana saldırmak için bekleyen canavarlarla dolu.")
                d.notice("Bazılarının üzerinde anahtar var. Yeteri kadar ")
                d.notice("Kilit Açma Taşı elde eder ve tüm mühürleri ")
                d.notice("açarsan 6. kata çıkabilirsin. Ama bil ki sadece ")
                d.notice("20 dakikan var!")

               
                server_timer('devil_stone5_fail1', 5*60, get_server_timer_arg())
                clear_server_timer('devil_stone4_update', get_server_timer_arg())

                d.set_regen_file("data/dungeon/deviltower5_regen.txt")

                d.spawn_mob(20073, 421, 452)
                d.spawn_mob(20073, 380, 460)
                d.spawn_mob(20073, 428, 414)
                d.spawn_mob(20073, 398, 392)
                d.spawn_mob(20073, 359, 426)
            end
        end
        when devil_stone5_fail1.server_timer begin
            if d.select(get_server_timer_arg()) then
                d.notice("15 dakika kaldı ")
                server_timer('devil_stone5_fail2', 5*60, get_server_timer_arg())
            end
        end

        when devil_stone5_fail2.server_timer begin
            if d.select(get_server_timer_arg()) then
                d.notice("10 dakika kaldı ")
                server_timer('devil_stone5_fail3', 5*60, get_server_timer_arg())
            end
        end

        when devil_stone5_fail3.server_timer begin
            if d.select(get_server_timer_arg()) then
                d.notice("5 dakika kaldı ")
                server_timer('devil_stone5_fail', 5*60, get_server_timer_arg())
            end
        end

        when devil_stone5_fail.server_timer begin
            if d.select(get_server_timer_arg()) and d.getf("level") == 5 then
                d.notice("Zaman doldu!")
                d.exit_all()
            end
        end

        when kill with pc.in_dungeon() and d.getf("level") == 5 and npc.get_race() == 1062 begin
            local KILL_COUNT_FOR_DROP_KEY = 7
            local n =d.getf("count") + 1
            d.setf("count", n)
            if n == KILL_COUNT_FOR_DROP_KEY then
                game.drop_item(50084, 1)
                d.setf("count", 0)
            end
        end

        when kill with npc.get_race() == 8013 and d.getf("level") == 5 begin
            game.drop_item(50084, 1)
        end

        when devil_stone5.take with item.vnum == 50084 begin
            npc.purge()
            pc.remove_item(50084,1)
            d.setf("stone_count", d.getf("stone_count") - 1)
            if d.getf("stone_count") <= 0 then
                d.clear_regen()
                d.kill_all()
                d.notice("Mührü açtın. 6. Kata çıkıyorsunuz!")

                clear_server_timer('devil_stone5_fail1', get_server_timer_arg())
                clear_server_timer('devil_stone5_fail2', get_server_timer_arg())
                clear_server_timer('devil_stone5_fail3', get_server_timer_arg())
                clear_server_timer('devil_stone5_fail', get_server_timer_arg())
       
                d.setf("level", 6)
                d.jump_all(special.devil_tower[5][1], special.devil_tower[5][2])
                d.regen_file("data/dungeon/deviltower6_regen.txt")
       
                d.notice("Şeytan Krala ulaşmak için tüm ")
                d.notice("şeytanları öldür!")

            else
                d.notice("Mührü açtın! "..d.getf("stone_count").." kaldı.")
            end
        end

        when kill with npc.get_race() == 1092 begin
            d.kill_all()
            d.check_eliminated()
            local reward_alchemist = {20074, 20075, 20076}
            d.spawn_mob(reward_alchemist[number(1,3)], 425, 216);
            d.setqf("can_refine", 1)
        end

 
        when 20074.chat."Üst katlar" or 20075.chat."Üst katlar" or 20076.chat."Üst katlar" with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 begin
            if d.getf("check1") == 1 then
                say("")
                say("Cok kisa bir sure once buradaydin?")
                return
            end
        if not npc.lock() then
                say("")
                say("Şu anda başka biriyle konuşuyorum!")
                say("Biraz bekle ya da sonra tekrar gel!")
                return
            end
            say_title(mob_name(npc.get_race()))
            say("Kulenin 7. katına girmek mi istiyorsun?")
            say("Bu katla mücadele etmek muhteşem beceriler ve")
            say("büyük bir yazgı gerektirir.")
            say("Sadece 35. seviyeye ulaştıysan")
            say("seni oraya ışınlayabilirim.")
            wait()
            if pc.level >=35 then
                say_title(mob_name(npc.get_race()))
                say("Üst kata çıkmak için")
                say("yeterli deneyime ve güce sahipsin.")
                say("Girebilirsin!")
                say("")
                local gec = select("Git!","Vazgeç ","Kuleyi terket!")
                if gec == 1 then
                    --local plusone = d.getf("check1") +1
                    d.setf("check1", 1)
                    timer("devil_jump_7",6)
                    npc.unlock()
                    npc.purge()
                    return
                elseif gec == 2 then
                        npc.unlock()
                    return
                elseif gec == 3 then
                    npc.unlock()
                    pc.warp(590500, 110500)
                end
            else
                say_title(mob_name(npc.get_race()))
                say("Üzgünüm sadece")
                say("35. seviyeye ulaşanları bir")
                say("üst kata alabilirim.")
                say("")
                npc.unlock()
                wait()
                pc.warp(590500, 110500)
                return
            end
        end

       when devil_jump_7.timer begin
            d.clear_regen()

            d.spawn_mob(8018, 639, 658)
            d.spawn_mob(8018, 611, 637)
            d.spawn_mob(8018, 596, 674)
            d.spawn_mob(8018, 629, 670)

            d.setf("level", 7)

            d.jump_all(2048+590, 6656+638)
        end
   
        when kill with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 and npc.get_race() == 8018 begin
            local cont = d.getf("7_stone_kill") + 1
            d.setf("7_stone_kill", cont)

            if cont >= 4 then
                d.setf("7_stone_kill", 0)
                d.set_regen_file("data/dungeon/deviltower7_regen.txt")
            end
        end

        when kill with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 and npc.get_race() == 8019 begin
            local qf = d.getf("7_stone2_kill")+1
            if qf <= 200 then
                d.setf("7_stone2_kill", qf)
                game.drop_item(30300, 1)
                d.notice("Katil metnini "..(200-qf).." kere daha kesebilirsiniz;")
                d.notice("Eğer daha fazla keserseniz, kattan dışarı atılacaksınız!")
            else
                d.notice("Metin sınırını aştınız. Dışarı gönderiliyorsunuz.")
                d.exit_all()
            end
        end

        when 30300.use with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 begin
            pc.remove_item("30300", 1)

            local pct = number(1,8)

            if pct == 1 then
                game.drop_item(30302, 1)
                d.clear_regen()
            else
                game.drop_item(30301, 1)
               
            end
        end

        when 30302.use with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 begin

            if d.getf( "level" ) != 7 then
                pc.remove_item( "30302", 1)
                return
            end
            if d.getf( "harita" ) != 0 then
                pc.remove_item( "30302", 1)
                return
            end
           
            say("Bu haritayla bir sonraki kata çıkabilirim!")
            pc.remove_item("30302", 1)
            d.setf("harita",1)
            timer("devil_jump_8", 6)
            d.clear_regen()
        end
                       

    when devil_jump_8.timer begin
        d.setf("level", 8)
        local plusone = d.getf("check") +1
        d.setf("check", plusone)
        d.jump_all(2048+590, 6656+403)
        d.set_regen_file("data/dungeon/deviltower8_regen.txt")
        d.spawn_mob(20366, 640, 460)
        local _count = pc.count_item(30302)
        pc.remove_item(30302,_count)
        if d.getf("check") != 1 then
        d.notice("Bug kullanimi tespit edildi, disari gönderiliyorsun!")
        d.clear_regen()
        d.exit_all()
        end      
    end

    when kill with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 and npc.get_race() == 1040 begin
        if d.getf("level") < 9 then
            local pct1 = number(1, 10)
            if pct1 == 1 then
                game.drop_item(30304, 1)
            else
                game.drop_item(30303, 1)
            end
        end
    end

    when 20366.take with item.vnum == 30304 begin
        if d.getf("anahtar") == 1 then return end
        npc.purge()
        pc.remove_item(30304,1)
        d.setf("anahtar",1)
        timer("devil_jump_9", 8)
    end

    ---------------------------------------------
    -- 9Ãş ÁøÀÔºÎÅÍ ¿Ï·á±îÁö
    ---------------------------------------------
    when devil_jump_9.timer begin
        d.setf("level", 9)
        d.jump_all(2048+590, 6656+155)
        d.regen_file("data/dungeon/deviltower9_regen.txt")
    end

    when kill with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 and npc.get_race() == 1093 begin
        d.kill_all()
        pc.setf("deviltower_zone","9_done",1)
        if party.is_party() then
            deviltower_zone.CatacombIzın()
        end
        notice_all("|cff00ff00"..pc.get_name().." grubu, Lusifer'ı öldürdü!")
        d.setf("azrail_dead", 1)
        timer("devil_end_jump", 30)
        d.kill_all()
        d.clear_regen()
    end

   
            when devil_gdk_jump.timer begin
        d.spawn_mob(1094, 609, 179);
            d.notice("Elit Seytan Kral canlandi.")
            end
   
        when 1094.kill with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 begin
        d.notice("Kral yok edildi.Mavi Olum intikam icin geliyor..")
                timer("devil_bt_jump", 15)
        end
       
        when devil_bt_jump.timer begin
        d.spawn_mob(1095, 609, 179);
            d.notice("Mavi Olum canlandi.")
            d.setqf("can_refine", 1)
        end  
   
    when 1095.kill with pc.in_dungeon() and pc.get_map_index() >= 660000 and pc.get_map_index() < 670000 begin
        d.kill_all()
         d.spawn_mob(20074, 609, 179);
        d.spawn_mob(20075, 609, 172);
        d.spawn_mob(20076, 609, 185);
        d.setqf("can_refine", 1)
        notice_all("".. pc.get_name() .." Grubu Mavi Olumu maglup etti.")
        d.notice("10 dakika icinde isinlanacaksin.")
       
                server_timer("devil_end_jump", 120, d.get_map_index())
        end  
   
    when devil_end_jump.timer begin
        d.clear_regen()
        d.exit_all()
    end
    function register_player(vid)
        local player_count = d.getf("player_count")
        player_count = player_count + 1
        d.setf("player_count", tonumber(player_count))
        d.setf(string.format("player%d", player_count), tonumber(vid))
    end  
    function unregister_player(vid)
        local player_count = d.getf("player_count")
        local found = false
        for i = 1, player_count, 1 do
            if found == true then
                d.setf(string.format("player%d", tonumber(i)), d.getf(string.format("player%d", i+1)))
            end
            p = d.getf("player"..tostring(i))
            if p == vid then
                i = i -1
                found = true
            end
        end  
        if found == true then
            d.setf("player_count", tonumber(player_count - 1))
        end
    end  
    function get_players()
        local players = {}
        local player_count = d.getf("player_count")
        for i = 1, player_count, 1 do
            players[i] = d.getf("player"..tostring(i))
        end
        return players
    end
    function give_dc_access(pindex)
        local self_checked = false
        local self = pc.select(d.getf("player"..tostring(pindex)))
        --pc.setqf("dcenter", 1)
        pc.setf("deviltower_zone", "dcenter", 1)
        pc.select(self)
    end
end
end
 
Dungeonda mobları doğru sayamaması veya yanlış sayması sanırım. Tüm slotlar kesilmesine rağmen üst kata atmıyor bunun çözümüydü. Konuyu şuan bulamıyorum ama hatırladığım bu. Sorun burada metinlerin çift olması zaten. Metinler tek olduğu zaman sorun kalkacak.

Linkleri görebilmek için giriş yap veya kayıt ol.
Sorun yapılan fixlerden birinden kaynaklı dediğin gibi yaptığım işlemleri kapattım service.h dan sorun yok şimdi aç kapat ile deniyorum şimdi. Büyük ihtimal gözden kaçan bir yer oldu ondan kaynaklı bu sorun birazdan çözerim. :)
 
İllaki denemişsindir ve kontrol etmişsindir ama deviltower4_regen.txt içinde 8016 kodlu mobun adet sayısı 1 mi acaba?
Ve questleri değiştirirken, bir önceki queste dair bütün kalıntıları temizlemeyi atladıysan bir de komple temizleyip dene istersen.
Elbette denediğin her dosyanın sorunla olması imkansız ama eğer geride kalıntılar kalmışsa bu da sorunun devam etmesini sağlayabilir.
Kapatılabilir. Birde konuyu düzenlerseniz mesajlar flood gibi oldu :)
Soru şu koddan kaynaklıymış.

C++:
Genişlet Daralt Kopyala
#ifdef FIX_109
            if (npc >= MAIN_RACE_MAX_NUM)
                m_mapNPC[npc].OnKill(*pPC);
            m_mapNPC[QUEST_NO_NPC].OnKill(*pPC);
#else
            m_mapNPC[npc].OnKill(*pPC);
#endif

Açıklamasında başka bir fileste şöyle yazılmış ne demekse çeviriden bir şey anlamadım.

questmanager.cpp; if you kill a player (war m), `when kill begin` will be triggered twice


Kod bloğu:
Genişlet Daralt Kopyala
    void CQuestManager::Kill(unsigned int pc, unsigned int npc)
    {
        PC * pPC;

        sys_log(0, "CQuestManager::Kill QUEST_KILL_EVENT (pc=%d, npc=%d)", pc, npc);

        if ((pPC = GetPC(pc)))
        {
            if (!CheckQuestLoaded(pPC))
                return;

#ifdef FIX_109
            if (npc >= MAIN_RACE_MAX_NUM)
                m_mapNPC[npc].OnKill(*pPC);
            m_mapNPC[QUEST_NO_NPC].OnKill(*pPC);
#else
            m_mapNPC[npc].OnKill(*pPC);
#endif

            LPCHARACTER ch = GetCurrentCharacterPtr();
            LPPARTY pParty = ch->GetParty();
            LPCHARACTER leader = pParty ? pParty->GetLeaderCharacter() : ch;

            if (leader)
            {
                m_pCurrentPartyMember = ch;

                if (m_mapNPC[npc].OnPartyKill(*GetPC(leader->GetPlayerID())))
                    return;

                pPC = GetPC(pc);
            }

            if (m_mapNPC[QUEST_NO_NPC].OnKill(*pPC))
                return;

            if (leader)
            {
                m_pCurrentPartyMember = ch;
                m_mapNPC[QUEST_NO_NPC].OnPartyKill(*GetPC(leader->GetPlayerID()));
            }
        }
        else
            sys_err("QUEST: no such pc id : %d", pc);
    }
 
Çözüm
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.
Üst