Jump to content

Kills are counted twice


Go to solution Solved by Jancsi7,

Recommended Posts

  • Premium

Hey,

if I kill a character (npc.is_pc()) the  kill are counted twice.

I can't fix it... :S Maybe anyone of you can help me :)

 

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; // ¹Ýµå½Ã ÃʱâÈ­ ÇؾßÇÔ DO NOT DELETE THIS LINE UNLESS YOU ARE 1000000% SURE
 
        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);
                }
        }
 
        //CHECK_FORKEDROAD_WAR
        if (IsPC())
        {
                if (CThreeWayWar::instance().IsThreeWayWarMapIndex(GetMapIndex()))
                        isForked = true;
        }
        //END_CHECK_FORKEDROAD_WAR
 
        if (pkKiller &&
                        !isAgreedPVP &&
                        !isUnderGuildWar &&
                        IsPC() &&
                        !isDuel &&
                        !isForked &&
                        !IS_CASTLE_MAP(GetMapIndex()))
        {
                if (GetGMLevel() == GM_PLAYER || test_server)
                {
                        ItemDropPenalty(pkKiller);
                }
        }
 
        // CASTLE_SIEGE
        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);
        }
        // CASTLE_SIEGE
 
        if (true == isForked)
        {
                CThreeWayWar::instance().onDead( 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)
                                {
                                        // TODO : ÀÔ±¸·Î ³¯¸®´Â Äڵ带 ³Ö¾î¾ß ÇÑ´Ù.
                                }
 
                                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 (g_iUseLocale)
                                        {
                                                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 (g_iUseLocale && 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);
                                }
                                else if (IsRevive() == true)
                                {
                                        Reward(false);
                                }
                                else
                                {
                                        Reward(true); // 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);
 
        // Ç÷¹À̾î ij¸¯ÅÍÀ̸é
        if (GetDesc() != NULL) {
                //
                // Ŭ¶óÀ̾ðÆ®¿¡ ¿¡ÆåÆ® ÆÐŶÀ» ´Ù½Ã º¸³½´Ù.
                //
                itertype(m_list_pkAffect) it = m_list_pkAffect.begin();
 
                while (it != m_list_pkAffect.end())
                        SendAffectAddPacket(GetDesc(), *it++);
        }
 
        //
        // Dead À̺¥Æ® »ý¼º,
        //
        // Dead À̺¥Æ®¿¡¼­´Â ¸ó½ºÅÍÀÇ °æ¿ì ¸îÃÊ ÈÄ¿¡ Destroy µÇµµ·Ï ÇØÁÖ¸ç,
        // PCÀÇ °æ¿ì 3ºÐ ÀÖ´Ù°¡ ¸¶À»¿¡¼­ ³ª¿Àµµ·Ï ÇØ ÁØ´Ù. 3ºÐ ³»¿¡´Â À¯Àú·ÎºÎÅÍ
        // ¸¶À»¿¡¼­ ½ÃÀÛÇÒ °ÇÁö, ¿©±â¼­ ½ÃÀÛÇÒ °ÇÁö °áÁ¤À» ¹Þ´Â´Ù.
        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
                        {
                                m_pkDeadEvent = event_create(dead_event, pEventInfo, bImmediateDead ? 1 : PASSES_PER_SEC(10));
                        }
                }
 
                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");
                }
        }
}
Link to comment
Share on other sites

  • Bronze

One is in character::dead and one in Character::reward

 

quest::CQuestManager::instance().Kill(pkAttacker->GetPlayerID(), GetRaceNum());

and

quest::CQuestManager::instance().Kill(pkKiller->GetPlayerID(), quest::QUEST_NO_NPC);

 

So if you have a kill event without mob vnum specified it's executed twice

  • Love 1
Link to comment
Share on other sites

  • Solution

Hey!

 

In questmanager.cpp you need to edit this line:

m_mapNPC[npc].OnKill(*pPC);

to this:

if(npc > 0)
{
	m_mapNPC[npc].OnKill(*pPC);
}

All the quest functions will work, but when you use 'when kill begin', it will good just for pc. It won't work with mobs. 

Examples:

when 101.kill begin  -> for mob

when kill with npc.get_race() == 101 begin -> for mob
when kill begin -> for pc

when kill with npc.is_pc() begin -> for pc

 

They all counts once per kill.

 

Kind regards

  • Love 12

Why so serious?

Link to comment
Share on other sites

  • Premium

Hey!

 

In questmanager.cpp you need to edit this line:

m_mapNPC[npc].OnKill(*pPC);

to this:

if(npc > 0)
{
	m_mapNPC[npc].OnKill(*pPC);
}

All the quest functions will work, but when you use 'when kill begin', it will good just for pc. It won't work with mobs. 

Examples:

when 101.kill begin  -> for mob

when kill with npc.get_race() == 101 begin -> for mob

when kill begin -> for pc

when kill with npc.is_pc() begin -> for pc

 

They all counts once per kill.

 

Kind regards

Wow!! Thank you, it works *_*

Link to comment
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now

Announcements



×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.