Yardım Mobların drobu hasarı en çok vurana göre vermesi

  • Konuyu açan Konuyu açan brave
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 0
  • Gösterim Gösterim 126
Konu sahibi bu konuda soru soruyor. Sorusu ile ilgili bilgisi olanların yanıtlamasını bekliyor.

brave

MT Üye
MT Üye
Mesaj
204
Çözümler
7
Beğeni
49
Puan
479
Ticaret Puanı
0
Mevcut dead fonksiyonum bu şekilde:
Bir boss veya metin kesildi diyelim 1 kere vurmuş hasarı çok az olana bile drop atıyor hatta bazen boss sandığını o kişiye attığı bile oluyor. Bunu nasıl hasara göre yapabilirim? Tüm droplar 1. hasar vurana gitmemeli sadece dengeli olmalı hasar bazında.



char_battle.cpp:
Genişlet Daralt Kopyala
void CHARACTER::Dead(LPCHARACTER pkKiller, bool bImmediateDead)
{
    if (IsDead())
        return;

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

            UpdatePacket();
        }
    }

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

    m_dwKillerPID = 0;

    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);
        }
    }

#ifdef ENABLE_QUEST_DIE_EVENT
    if (IsPC())
    {
        if (pkKiller)
            SetQuestNPCID(pkKiller->GetVID());
        // quest::CQuestManager::instance().Die(GetPlayerID(), quest::QUEST_NO_NPC);
        quest::CQuestManager::instance().Die(GetPlayerID(), (pkKiller)?pkKiller->GetRaceNum():quest::QUEST_NO_NPC);
    }
#endif

    //CHECK_FORKEDROAD_WAR
    if (IsPC())
    {
        if (CThreeWayWar::instance().IsThreeWayWarMapIndex(GetMapIndex()))
            isForked = true;
    }
    //END_CHECK_FORKEDROAD_WAR

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

    if (true == isForked)
    {
        CThreeWayWar::instance().onDead( this, pkKiller );
    }

    SetPosition(POS_DEAD);

    if (pkKiller && IsPC() && !pkKiller->IsPC())
    {
        ClearAffect(true, true);
    }
    else
    {
        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();

    //sys_log(1, "stun cancel %s[%d]", GetName(), (DWORD)GetVID());
    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)))
            {
                if (GetMobTable().dwResurrectionVnum)
                {
                    // DUNGEON_MONSTER_REBIRTH_BUG_FIX
                    LPCHARACTER chResurrect = CHARACTER_MANAGER::instance().SpawnMob(GetMobTable().dwResurrectionVnum, GetMapIndex(), GetX(), GetY(), GetZ(), true, (int) GetRotation());
                    if (GetDungeon() && chResurrect)
                    {
                        chResurrect->SetDungeon(GetDungeon());
                    }
                    // END_OF_DUNGEON_MONSTER_REBIRTH_BUG_FIX

                    Reward(false
                        #ifdef ENABLE_KILL_EVENT_FIX
                        , pkKiller
                        #endif
                    );
                }
                else if (IsRevive())
                {
                    Reward(false
                        #ifdef ENABLE_KILL_EVENT_FIX
                        , pkKiller
                        #endif
                    );
                }
                else
                {
                    Reward(true
                        #ifdef ENABLE_KILL_EVENT_FIX
                        , pkKiller
                        #endif
                    ); // Drops gold, item, etc..
                }
            }
            else
            {
                if (pkKiller->m_dwUnderGuildWarInfoMessageTime < get_dword_time())
                {
                    pkKiller->m_dwUnderGuildWarInfoMessageTime = get_dword_time() + 60000;
                    pkKiller->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("<±æµå> ±æµåÀüÁß¿¡´Â »ç³É¿¡ µû¸¥ ÀÌÀÍÀÌ ¾ø½À´Ï´Ù."));
                }
            }
        }
    }

    // BOSS_KILL_LOG
    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);
    }
    // END_OF_BOSS_KILL_LOG

    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) {
        itertype(m_list_pkAffect) 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(0));
            }
            else
            {
                m_pkDeadEvent = event_create(dead_event, pEventInfo, bImmediateDead ? 1 : PASSES_PER_SEC(0));
            }
        }

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

    if (m_pkExchange)
        m_pkExchange->Cancel();

    if (IsCubeOpen())
        Cube_close(this);
#ifdef ENABLE_ACCE_COSTUME_SYSTEM
    if (IsPC())
        CloseAcce();
#endif

    CShopManager::instance().StopShopping(this);
    CloseMyShop();
    CloseSafebox();

    if (IsMonster() && 2493 == GetMobTable().dwVnum)
    {
        if (pkKiller && pkKiller->GetGuild())
            CDragonLairManager::instance().OnDragonDead(this, pkKiller->GetGuild()->GetID());
        else
            sys_err("DragonLair: Dragon killed by nobody");
    }

}
 
Geri
Üst