Jump to content

Pet system update problem


Recommended Posts

  • Premium

I have a strange crash. I've been using the pet-level system ever since it came out so it's an old system, and never had problems until now.

#0  CNewPetActor::Unsummon (this=0x611ce1c0) at item.h:44
        pSummonItem = <value optimized out>
#1  0x08294658 in CNewPetActor::Update (this=0x611ce1c0, deltaTime=0)
    at New_PetSystem.cpp:783
No locals.
#2  0x08291451 in CNewPetSystem::Update (this=0x5daef5c0, deltaTime=0)
    at New_PetSystem.cpp:1051
        petActor = (CNewPetActor *) 0x611ce1c0
        bResult = true
        currentTime = 436200661
        v_garbageActor = {<std::_Vector_base<CNewPetActor*,std::allocator<CNewPe                                                                                                                                                             tActor*> >> = {
    _M_impl = {<std::allocator<CNewPetActor*>> = {<__gnu_cxx::new_allocator<CNew                                                                                                                                                             PetActor*>> = {<No data fields>}, <No data fields>}, _M_start = 0x0,
      _M_finish = 0x0, _M_end_of_storage = 0x0}}, <No data fields>}
#3  0x08291529 in newpetsystem_update_event (event=@0xffffa2ec,
    processing_time=6) at New_PetSystem.cpp:41
        pPetSystem = <value optimized out>
        __FUNCTION__ = "newpetsystem_update_event"
#4  0x08149bb1 in event_process (pulse=10924285) at event.cpp:140
        pElem = <value optimized out>
        the_event = {px = 0x5f798ac0}
        processing_time = 6
bool CNewPetSystem::Update(DWORD deltaTime)
{
	bool bResult = true;

	DWORD currentTime = get_dword_time();
	
	if (m_dwUpdatePeriod > currentTime - m_dwLastUpdateTime)
		return true;
	
	std::vector <CNewPetActor*> v_garbageActor;

	for (TNewPetActorMap::iterator iter = m_petActorMap.begin(); iter != m_petActorMap.end(); ++iter)
	{
		CNewPetActor* petActor = iter->second;

		if (0 != petActor && petActor->IsSummoned())
		{
			LPCHARACTER pPet = petActor->GetCharacter();
			
			if (NULL == CHARACTER_MANAGER::instance().Find(pPet->GetVID()))
			{
				v_garbageActor.push_back(petActor);
			}
			else
			{
				bResult = bResult && petActor->Update(deltaTime);
			}
		}
	}
	for (std::vector<CNewPetActor*>::iterator it = v_garbageActor.begin(); it != v_garbageActor.end(); it++)
		DeletePet(*it);

	m_dwLastUpdateTime = currentTime;

	return bResult;
}

 

Link to comment
Share on other sites

  • Replies 5
  • Created
  • Last Reply

Top Posters In This Topic

Popular Days

Top Posters In This Topic

  • Active+ Member
bool CNewPetSystem::Update(DWORD deltaTime)
{
	bool bResult = true;

	DWORD currentTime = get_dword_time();
	
	if (m_dwUpdatePeriod > currentTime - m_dwLastUpdateTime)
		return true;
	
	std::vector <CNewPetActor*> v_garbageActor;

	for (TNewPetActorMap::iterator iter = m_petActorMap.begin(); iter != m_petActorMap.end(); ++iter)
	{
		CNewPetActor* petActor = iter->second;

		if (0 != petActor && petActor->IsSummoned())
		{
			LPCHARACTER pPet = petActor->GetCharacter();
          
			if(pPet)
     			{
				if (NULL == CHARACTER_MANAGER::instance().Find(pPet->GetVID()))
				{
					v_garbageActor.push_back(petActor);
				}
				else
				{
					bResult = bResult && petActor->Update(deltaTime);
				}
      			}
		}
	}
	for (std::vector<CNewPetActor*>::iterator it = v_garbageActor.begin(); it != v_garbageActor.end(); it++)
		DeletePet(*it);

	m_dwLastUpdateTime = currentTime;

	return bResult;
}

I don't think that is "bt full" but try like above.

Link to comment
Share on other sites

  • Premium
void CNewPetActor::Unsummon()
{
	if (true == this->IsSummoned())
	{
		std::auto_ptr<SQLMsg> pmsg2(DBManager::instance().DirectQuery("UPDATE new_petsystem SET level = %d, evolution=%d, exp=%d, expi=%d, bonus0=%d, bonus1=%d, bonus2=%d, skill0=%d, skill0lv= %d, skill1=%d, skill1lv= %d, skill2=%d, skill2lv= %d, duration=%d, tduration=%d WHERE id = %lu ", this->GetLevel(), this->m_dwevolution, this->GetExp(), this->GetExpI(), this->m_dwbonuspet[0][1], this->m_dwbonuspet[1][1], this->m_dwbonuspet[2][1], this->m_dwskillslot[0], this->m_dwskill[0], this->m_dwskillslot[1], this->m_dwskill[1], this->m_dwskillslot[2], this->m_dwskill[2], this->m_dwduration, this->m_dwtduration, ITEM_MANAGER::instance().FindByVID(this->GetSummonItemVID())->GetID()));
		this->ClearBuff();

		LPITEM pSummonItem = ITEM_MANAGER::instance().FindByVID(this->GetSummonItemVID());
		
		if (pSummonItem != NULL)
		{
			for (int b = 0; b < 3; b++)
			{
				pSummonItem->SetForceAttribute(b, 1, m_dwbonuspet[b][1]);
			}
			
			pSummonItem->SetForceAttribute(3, 1, m_dwduration);
			pSummonItem->SetForceAttribute(4, 1, m_dwtduration);
			pSummonItem->SetSocket(1,m_dwlevel);
			pSummonItem->SetSocket(0, false);
			pSummonItem->Lock(false);
		}
		
		this->SetSummonItem(NULL);
		
        if (NULL != m_pkOwner)
            m_pkOwner->ComputePoints();

		if (NULL != m_pkChar)
			M2_DESTROY_CHARACTER(m_pkChar);

		m_pkChar = 0;
		m_dwVID = 0;
		m_dwlevel = 1;
		m_dwlevelstep = 0;
		m_dwExpFromMob = 0;
		m_dwExpFromItem = 0;
		m_dwexp = 0;
		m_dwexpitem = 0;
		m_dwTimePet = 0;
		m_dwImmTime = 0;
		m_dwslotimm = 0;

		for (int s = 0; s < 9; ++s) 
		{
			m_dwpetslotitem[s] = -1;
		}
		
		ClearBuff();
		m_pkOwner->ChatPacket(CHAT_TYPE_COMMAND, "PetUnsummon");
	}
}

 

Link to comment
Share on other sites

  • Active+ Member

Well, In DirectQuery:

screenshot_64.png

Spoiler

void CNewPetActor::Unsummon()
{
	if (true == this->IsSummoned())
	{
		LPITEM pSummonItem = ITEM_MANAGER::instance().FindByVID(this->GetSummonItemVID());
		
		if (pSummonItem != NULL)
		{
			std::auto_ptr<SQLMsg> pmsg2(DBManager::instance().DirectQuery("UPDATE new_petsystem SET level = %d, evolution=%d, exp=%d, expi=%d, bonus0=%d, bonus1=%d, bonus2=%d, skill0=%d, skill0lv= %d, skill1=%d, skill1lv= %d, skill2=%d, skill2lv= %d, duration=%d, tduration=%d WHERE id = %lu ", this->GetLevel(), this->m_dwevolution, this->GetExp(), this->GetExpI(), this->m_dwbonuspet[0][1], this->m_dwbonuspet[1][1], this->m_dwbonuspet[2][1], this->m_dwskillslot[0], this->m_dwskill[0], this->m_dwskillslot[1], this->m_dwskill[1], this->m_dwskillslot[2], this->m_dwskill[2], this->m_dwduration, this->m_dwtduration, pSummonItem->GetID()));
			this->ClearBuff();

			for (int b = 0; b < 3; b++)
			{
				pSummonItem->SetForceAttribute(b, 1, m_dwbonuspet[b][1]);
			}
			
			pSummonItem->SetForceAttribute(3, 1, m_dwduration);
			pSummonItem->SetForceAttribute(4, 1, m_dwtduration);
			pSummonItem->SetSocket(1,m_dwlevel);
			pSummonItem->SetSocket(0, false);
			pSummonItem->Lock(false);
		}
		
		this->SetSummonItem(NULL);
		
        if (NULL != m_pkOwner)
            m_pkOwner->ComputePoints();

		if (NULL != m_pkChar)
			M2_DESTROY_CHARACTER(m_pkChar);

		m_pkChar = 0;
		m_dwVID = 0;
		m_dwlevel = 1;
		m_dwlevelstep = 0;
		m_dwExpFromMob = 0;
		m_dwExpFromItem = 0;
		m_dwexp = 0;
		m_dwexpitem = 0;
		m_dwTimePet = 0;
		m_dwImmTime = 0;
		m_dwslotimm = 0;

		for (int s = 0; s < 9; ++s) 
		{
			m_dwpetslotitem[s] = -1;
		}
		
		ClearBuff();
		m_pkOwner->ChatPacket(CHAT_TYPE_COMMAND, "PetUnsummon");
	}
}

 

 

Edited by Metin2 Dev
Core X - External 2 Internal
  • Love 2
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.