3 mesaje
  • Mesaje: 17
  • Reacții: 23
  • Mesaje utile: 3
  • Server: None
  • Regat: Jinno
  • [ID Discord]
  • Contact:

    Medalii

    *Problemă/Întrebare: Buna . Implementat pana la capat . Fara erori sysser db etc. singura problema este ca nu culege itemele din ceva motiv .
    Am golit inventarul etc. dar nu am idee dece nu vrea .
    *Resursă folosită (sistem/funcție/modificare): pet-pickup-t4362.html

    *Syserr: 0

    *Fișier(e) cu problema (link pastebin / code): 0

    *Poze / Video: 0

    🔥 Hai pe Discord! - Chat activ și support direct

    Te așteptăm și pe serverul de Discord - aici ne-am strâns toată comunitatea de Metin2 din România.

    Alătură-te acum!
    1300+ de membri activi!
    Robot Discord
    Roboțelu'
    Anunț
    Robot Robot
  • Mesaje: 122
  • Reacții: 0
  • Mesaje utile: 0
  • Status: Sunt doar un Bot :)
  • Regat: Shinsoo
  • Contact:

    Medalii

    Avatar utilizator
    Robot
    Robot

    Mesaj de Uriel »

    Salut, Angelic!

    Îți recomand câteva link-uri utile care te pot ajuta să rezolvi problema mai rapid:

    - Alte probleme rezolvate
    - Fixuri Metin2
    - Tutoriale
    - Cum resetez parola MySQL
    - Compilare sursă Metin2
    - Lista FreeBSD pentru compilare


    Și dacă vrei ajutor direct, te așteptăm pe serverul nostru de Discord — chat activ, suport live și o comunitate faină gata să te ajute! Pentru a intra pe serverul de Discord: Click aici
  • Mesaje: 101
  • Reacții: 1436
  • Mesaje utile: 0
  • Status: https://discord.gg/wDKzjDvVkj
  • Server: Althaia
  • Regat: Chunjo
  • [ID Discord]
  • Contact:

    Medalii

    Lasa ne un video. Ce behaviour are pet-ul? chiar daca nu aduna, se duce macar catre iteme? poate nu face call-ul cum trebuie catre faza de ridicat iteme. sau poate sunt probleme pe partea de isi da seama daca sunt iteme pe jos sau nu.

    in char item, inlocuieste cu varianta asta, si vezi ce loguri ai syser si syslog:
    Code:
    #ifdef __PET_PICKUP
    bool CHARACTER::PickupItemByPet(DWORD dwVID)
    {
    	sys_log(0, "PET_PICKUP: Called by PID(%u), dwVID(%u)", GetPlayerID(), dwVID);
    
    	LPITEM item = ITEM_MANAGER::instance().FindByVID(dwVID);
    	if (IsObserverMode())
    	{
    		sys_err("PET_PICKUP: PID(%u) failed - ObserverMode active", GetPlayerID());
    		return false;
    	}
    	if (!item || !item->GetSectree())
    	{
    		sys_err("PET_PICKUP: PID(%u) failed - Item not found or no sectree (VID:%u)", GetPlayerID(), dwVID);
    		return false;
    	}
    
    	if (item->IsOwnership(this))
    	{
    		sys_log(0, "PET_PICKUP: PID(%u) has ownership of item (VID:%u, VNUM:%u, NAME:%s)", 
    			GetPlayerID(), dwVID, item->GetVnum(), item->GetName());
    
    		if (item->GetType() == ITEM_ELK)
    		{
    			sys_log(0, "PET_PICKUP: PID(%u) picked up Yang (%u)", GetPlayerID(), item->GetCount());
    			GiveGold(item->GetCount());
    			item->RemoveFromGround();
    			M2_DESTROY_ITEM(item);
    			Save();
    		}
    		else
    		{
    			if (item->IsStackable() && !IS_SET(item->GetAntiFlag(), ITEM_ANTIFLAG_STACK))
    			{
    				sys_log(0, "PET_PICKUP: PID(%u) trying to stack item VNUM:%u", GetPlayerID(), item->GetVnum());
    				BYTE bCount = item->GetCount();
    
    				for (int i = 0; i < INVENTORY_MAX_NUM; ++i)
    				{
    					LPITEM item2 = GetInventoryItem(i);
    					if (!item2)
    						continue;
    
    					if (item2->GetVnum() == item->GetVnum())
    					{
    						int j;
    						for (j = 0; j < ITEM_SOCKET_MAX_NUM; ++j)
    							if (item2->GetSocket(j) != item->GetSocket(j))
    								break;
    
    						if (j != ITEM_SOCKET_MAX_NUM)
    							continue;
    
    						BYTE bCount2 = MIN(200 - item2->GetCount(), bCount);
    						bCount -= bCount2;
    
    						item2->SetCount(item2->GetCount() + bCount2);
    
    						sys_log(0, "PET_PICKUP: PID(%u) stacked %u items into slot %d (now %u)", 
    							GetPlayerID(), bCount2, i, item2->GetCount());
    
    						if (bCount == 0)
    						{
    							ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ss %s"), item2->GetName());
    							sys_log(0, "PET_PICKUP: PID(%u) destroyed item after stacking (VID:%u, VNUM:%u)", 
    								GetPlayerID(), dwVID, item->GetVnum());
    							M2_DESTROY_ITEM(item);
    							if (item2->GetType() == ITEM_QUEST)
    								quest::CQuestManager::instance().PickupItem(GetPlayerID(), item2);
    							return true;
    						}
    					}
    				}
    
    				item->SetCount(bCount);
    			}
    
    			int iEmptyCell;
    			if (item->IsDragonSoul())
    			{
    				if ((iEmptyCell = GetEmptyDragonSoulInventory(item)) == -1)
    				{
    					sys_err("PET_PICKUP: PID(%u) failed - No empty DS inventory (ItemVNUM:%u, ItemID:%u)", 
    						GetPlayerID(), item->GetVnum(), item->GetID());
    					ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ss2"));
    					return false;
    				}
    			}
    			else
    			{
    				if ((iEmptyCell = GetEmptyInventory(item->GetSize())) == -1)
    				{
    					sys_err("PET_PICKUP: PID(%u) failed - No empty inventory (ItemVNUM:%u, ItemID:%u)", 
    						GetPlayerID(), item->GetVnum(), item->GetID());
    					ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ss3"));
    					return false;
    				}
    			}
    
    			item->RemoveFromGround();
    
    			if (item->IsDragonSoul())
    				item->AddToCharacter(this, TItemPos(DRAGON_SOUL_INVENTORY, iEmptyCell));
    			else
    				item->AddToCharacter(this, TItemPos(INVENTORY, iEmptyCell));
    
    			sys_log(0, "PET_PICKUP: PID(%u) added item to inventory (VNUM:%u, NAME:%s, COUNT:%u)", 
    				GetPlayerID(), item->GetVnum(), item->GetName(), item->GetCount());
    
    			char szHint[32 + 1];
    			snprintf(szHint, sizeof(szHint), "%s %u %u", item->GetName(), item->GetCount(), item->GetOriginalVnum());
    			LogManager::instance().ItemLog(this, item, "GET", szHint);
    			ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ss4 %s"), item->GetName());
    
    			if (item->GetType() == ITEM_QUEST)
    				quest::CQuestManager::instance().PickupItem(GetPlayerID(), item);
    		}
    		return true;
    	}
    
    	sys_err("PET_PICKUP: PID(%u) failed - No ownership of item (VID:%u, VNUM:%u)", GetPlayerID(), dwVID, item->GetVnum());
    	return false;
    }
    #endif
    

    Same mai jos in Petsystem.cpp:

    Code:
    #ifdef __PET_PICKUP
    struct PetPickUpItemStruct
    {
    	CPetActor * pet;
    	int range;
    	PetPickUpItemStruct(CPetActor * p, int r)
    	{
    		pet = p;
    		range = r;
    	}
    
    	void operator()(LPENTITY pEnt)
    	{
    		if (!pet->GetOwner() || !pet->GetCharacter())
    		{
    			sys_err("PET_PICKUP: Invalid pet state (Owner or Character missing)");
    			return;
    		}
    		if (pet->IsPickup())
    		{
    			sys_log(0, "PET_PICKUP: Pet already busy picking up an item");
    			return;
    		}
    		if (pEnt->IsType(ENTITY_ITEM) == true)
    		{
    			LPITEM item = (LPITEM)pEnt;
    			LPCHARACTER player = pet->GetOwner();
    
    			if (!item->GetSectree())
    			{
    				sys_err("PET_PICKUP: Item has no sectree (VID:%u VNUM:%u)", item->GetVID(), item->GetVnum());
    				return;
    			}
    			if (!item->IsOwnership(player))
    			{
    				sys_log(0, "PET_PICKUP: Player PID(%u) has no ownership of item VID:%u VNUM:%u", player->GetPlayerID(), item->GetVID(), item->GetVnum());
    				return;
    			}
    
    			int iDist = DISTANCE_APPROX(item->GetX() - player->GetX(), player->GetY() - player->GetY());
    
    			if (iDist > range)
    			{
    				sys_log(0, "PET_PICKUP: Item too far (Dist:%d, Range:%d, PID:%u, ItemVID:%u)", iDist, range, player->GetPlayerID(), item->GetVID());
    				return;
    			}
    
    			sys_log(0, "PET_PICKUP: Pet started picking up item (VID:%u, VNUM:%u, OwnerPID:%u)", item->GetVID(), item->GetVnum(), player->GetPlayerID());
    			pet->SetPickup(true);
    			pet->SetPickupItem(item);
    		}
    	}
    };
    
    void CPetActor::PickUpItems(int range)
    {
    	if (IsPickup())
    	{
    		sys_log(0, "PET_PICKUP: Pet already in pickup state, skipping search");
    		return;
    	}
    
    	long map = m_pkChar->GetMapIndex();
    	PIXEL_POSITION m = m_pkChar->GetXYZ();
    	LPSECTREE tree = SECTREE_MANAGER::instance().Get(map, m.x, m.y);
    
    	if (!tree)
    	{
    		sys_err("PET_PICKUP: Cannot find sectree at (%d, %d), MapIndex:%ld", m.x, m.y, map);
    		return;
    	}
    
    	sys_log(0, "PET_PICKUP: Searching items around (%d,%d) Map:%ld Range:%d", m.x, m.y, map, range);
    	PetPickUpItemStruct f(this, range);
    	tree->ForEachAround(f);
    }
    
    void CPetActor::BringItem()
    {
    	if (!IsPickup())
    	{
    		sys_log(0, "PET_PICKUP: BringItem called but no item is set for pickup");
    		return;
    	}
    
    	LPITEM item = GetPickupItem();
    	if (!m_pkOwner || !m_pkChar || !item || !item->GetSectree())
    	{
    		sys_err("PET_PICKUP: BringItem failed - invalid state (Owner:%p Char:%p Item:%p Sectree:%p)", m_pkOwner, m_pkChar, item, item ? item->GetSectree() : NULL);
    		return;
    	}
    
    	float fMinDistance = 20.0;
    	float fPetX = m_pkChar->GetX();
    	float fPetY = m_pkChar->GetY();
    
    	float itemX = item->GetX();
    	float itemY = item->GetY();
    
    	float fDist = DISTANCE_SQRT(itemX - fPetX, itemY - fPetY);
    
    	sys_log(0, "PET_PICKUP: BringItem - Dist:%.2f, Pet(%.0f,%.0f), Item(%.0f,%.0f), PID:%u ItemVID:%u", 
    		fDist, fPetX, fPetY, itemX, itemY, m_pkOwner->GetPlayerID(), item->GetVID());
    
    	if (fDist <= 250.0)
    	{
    		sys_log(0, "PET_PICKUP: Item within range, sending pickup request (ItemVID:%u, VNUM:%u)", item->GetVID(), item->GetVnum());
    		SetPickup(false);
    		m_pkOwner->PickupItemByPet(item->GetVID());
    		SetPickupItem(NULL);
    		m_pkChar->SendMovePacket(FUNC_WAIT, 0, 0, 0, 0, 0);
    		return;
    	}
    
    	m_pkChar->SetRotationToXY(itemX, itemY);
    	float fx, fy;
    
    	float fDistToGo = fDist - fMinDistance;
    	GetDeltaByDegree(m_pkChar->GetRotation(), fDistToGo, &fx, &fy);
    
    	if (!m_pkChar->Goto((int)(fPetX + fx + 0.5f), (int)(fPetY + fy + 0.5f)))
    	{
    		sys_err("PET_PICKUP: Pet failed to move towards item (VID:%u, VNUM:%u)", item->GetVID(), item->GetVnum());
    		return;
    	}
    
    	sys_log(0, "PET_PICKUP: Pet moving towards item (ItemVID:%u, Target:(%.0f,%.0f))", item->GetVID(), itemX, itemY);
    	m_pkChar->SendMovePacket(FUNC_WAIT, 0, 0, 0, 0, 0);
    }
    #endif
    
    Kolen's Assets - NPCs, Gr2 Objects, Characters Animations, Free stuff
    Discord: https://discord.gg/wDKzjDvVkj
    In Progress: ~ Althaia Project ~
    See full signature

    🔥 Hai pe Discord! - Chat activ și support direct

    Te așteptăm și pe serverul de Discord - aici ne-am strâns toată comunitatea de Metin2 din România.

    Alătură-te acum!
    1300+ de membri activi!
    Robot Discord
    Roboțelu'
    Anunț
    Închis

    Înapoi la “Arhivă probleme”

    Informații

    Utilizatori ce navighează pe acest forum: Niciun utilizator înregistrat și 1 vizitator

    Discord ID copiat: