Ir para conteúdo
  • 0
Entre para seguir isso  
egyptPOWER

Programação Problema com Walkthrough

Pergunta

egyptPOWER    0
egyptPOWER

Engine: OTX 2.X.S.5 (FORGOTEN_PATH_7_X)

Server em questão: 

RealOTX-7.72

Estou com o seguinte problema:

Os personagens não conseguem passar uns por dentro dos outros ( e não devem de fato), porém quando um vem de encontro ao outro andando, eles conseguem ocupar o mesmo SQM.

 

Dei uma fuçada nas sources mas me parece normal essa parte:
 

player.cpp

Spoiler

bool Player::canWalkthrough(const Creature* creature) const
{
	if(creature == this || hasFlag(PlayerFlag_CanPassThroughAllCreatures) || creature->isWalkable() ||
		(creature->getMaster() && creature->getMaster() != this && canWalkthrough(creature->getMaster())))
		return true;

	const Player* player = creature->getPlayer();
	if(!player)
		return false;

	if(((g_game.getWorldType() == WORLDTYPE_OPTIONAL &&
		!player->isProtected()) || player->getTile()->hasFlag(TILESTATE_PROTECTIONZONE) || player->isProtected()) && player->getTile()->ground
		&& Item::items[player->getTile()->ground->getID()].walkStack && (!player->hasCustomFlag(PlayerCustomFlag_GamemasterPrivileges)
		|| player->getAccess() <= getAccess()))
		return true;

	return (player->isGhost() && getGhostAccess() < player->getGhostAccess())
		|| (isGhost() && getGhostAccess() > player->getGhostAccess());
}

Depot* Player::getDepot(uint32_t depotId, bool autoCreateDepot)
{
	DepotMap::iterator it = depots.find(depotId);
	if(it != depots.end())
		return it->second.first;

	//create a new depot?
	if(autoCreateDepot)
	{
		Item* locker = Item::CreateItem(ITEM_LOCKER);
		if(Container* container = locker->getContainer())
		{
			if(Depot* depot = container->getDepot())
			{
				container->__internalAddThing(Item::CreateItem(ITEM_DEPOT));
				addDepot(depot, depotId);
				return depot;
			}
		}

		g_game.freeThing(locker);
		std::clog << "Failure: Creating a new depot with id: " << depotId << ", for player: " << getName() << std::endl;
	}

	return NULL;
}

 

 

 

Alguém sabe dizer oque pode estar acontecendo? Pode ser que seja no otclient também, não sei dizer sinceramente...

 

Obrigado desde já!

Compartilhar este post


Link para o post
Compartilhar em outros sites

3 respostass a esta questão

Recommended Posts

  • 0
TheRatazana    8
TheRatazana

Isso parece acontecer porque em dado momento ambos estão indo para a mesma destinação, e consequentemente irão checar o mesmo Tile, pode ser que eles ambos validem o tile e só depois se movam pra ele, ficando juntos no mesmo tile. Se for esse o caso essa função Player::canWalktrough não deve estar sendo chamada, já que nenhum deles estaria vendo o outro no dado Tile, então eu te recomendo a por um std::cout no começo dessa função, só pra você investigar se ela está sendo mesmo chamada, porque pelo que parece quando um Tile já está ocupado não existe problema, mas sim quando os dois se aproximam na mesma direção, sem que nenhuma esteja no Tile, mas ambos o queiram ocupar

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • 0
GryLLo    19
GryLLo

Opa bro, belezinha?


Eu encontrei algumas funções em .cpp que falam sobre Walkthrough, mas no seu caso, acredito que mexer nelas não resolva..

Realmente é como você disse e os personagens não conseguem passar pelos outros normalmente? É bem estranho ela funcionar e o programa falhar só pela colisão, minha primeira impressão, achei que fosse algo relacionado a lag, mas acho que não.

Bom, se você conseguir fazer uma demonstração com um mini-clipe, seria bem interessante.

 

É nóissssssssssss

Editado por GryLLo

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • 0
egyptPOWER    0
egyptPOWER

@GryLLo Irei providenciar um clip assim que possível e atualizo o tópico. De fato é bem estranho isso.

Editado por egyptPOWER

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante
Este tópico está impedido de receber novos posts.
Entre para seguir isso  

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×