Jump to content

Veneno dado por monstros crasha o servidor


Karbust

Recommended Posts

Boas,

Recentemente encontramos um bug, que acontece todas as vezes que recebemos veneno de um monstro (tenha ele saído de uma metin ou não) (demos conta deste bug na Metin da Sombra - 8009 (monstros do deserto e do v2), o veneno dado por monstros crasha o servidor)

Por vezes quando nos teleportamos para outro mapa (mapas noutro núcleo) o servidor também crasha (se o veneno tiver sido dado por um jogador e não por um monstro) (isto só acontece às vezes)...

O debug do game.core:

root@sv1:/usr/home/game/share/bin # lldb game -c game.core
(lldb) target create "game" --core "game.core"
Core file '/usr/home/game/share/bin/game.core' (i386) was loaded.
(lldb) bt all
* thread #1, name = 'game', stop reason = signal SIGSEGV
  * frame #0: game`CHARACTER::Damage(this=0x469f7640, pAttacker=0x00000000, dam=1010, type=DAMAGE_TYPE_POISON) at char_battle.cpp:2121
    frame #1: game`long poison_event(event=LPEVENT @ 0x00000008, processing_time=0) at char_resist.cpp:68
    frame #2: 0x08490850 game`nBATTLE_ARENA_MAP + 16
  thread #2, name = 'game', stop reason = signal SIGSEGV
    frame #0: 0x2889c8e9 libc.so.7`__umtx_op + 5
    frame #1: 0x28888bac libc.so.7`sem_clockwait_np + 236
    frame #2: 0x28888c70 libc.so.7`sem_wait + 32
    frame #3: 0x0848e4e8 game`CSemaphore::Wait(void) + 24
  thread #3, name = 'game', stop reason = signal SIGSEGV
    frame #0: 0x2889c8e9 libc.so.7`__umtx_op + 5
    frame #1: 0x28888bac libc.so.7`sem_clockwait_np + 236
    frame #2: 0x28888c70 libc.so.7`sem_wait + 32
    frame #3: 0x0848e4e8 game`CSemaphore::Wait(void) + 24
  thread #4, name = 'game', stop reason = signal SIGSEGV
    frame #0: 0x2889c8e9 libc.so.7`__umtx_op + 5
    frame #1: 0x28888bac libc.so.7`sem_clockwait_np + 236
    frame #2: 0x28888c70 libc.so.7`sem_wait + 32
    frame #3: 0x0848e4e8 game`CSemaphore::Wait(void) + 24
(lldb)

Linhas do char_battle.cpp:

	if (type != DAMAGE_TYPE_NORMAL && type != DAMAGE_TYPE_NORMAL_RANGE)
	{
		if (IsAffectFlag(AFF_TERROR)) //ESTA É A LINHA 2121
		{
			int pct = GetSkillPower(SKILL_TERROR) / 400;

			if (number(1, 100) <= pct)
				return false;
		}
	}

Linhas do char_resist.cpp:

EVENTFUNC(poison_event)
{
    TPoisonEventInfo * info = dynamic_cast<TPoisonEventInfo *>( event->info );
    
    if ( info == NULL )
    {
        sys_err( "poison_event> <Factor> Null pointer" );
        return 0;
    }

    LPCHARACTER ch = info->ch;

    if (ch == NULL) { // <Factor>
        return 0;
    }
    LPCHARACTER pkAttacker = CHARACTER_MANAGER::instance().FindByPID(info->attacker_pid);

    int dam = ch->GetMaxHP() * GetPoisonDamageRate(ch) / 1000;
    if (test_server) ch->ChatPacket(CHAT_TYPE_NOTICE, "Poison Damage %d", dam);

    if (ch->Damage(pkAttacker, dam, DAMAGE_TYPE_POISON)) //ESTA É A LINHA 68
    {
        ch->m_pkPoisonEvent = NULL;
        return 0;
    }

    --info->count;

    if (info->count)
        return PASSES_PER_SEC(3);
    else
    {
        ch->m_pkPoisonEvent = NULL;
        return 0;
    }
}

Alguém me consegue ajudar?

Obrigado a todos

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...