Пример #1
0
static bool ANCHOR_AttemptValidCylinderPos(Cylinder & cyl, Entity * io,
	                                         CollisionFlags flags) {
	
	float anything = ANCHOR_CheckAnythingInCylinder(cyl, flags);

	if ((flags & CFLAG_LEVITATE) && (anything == 0.f)) return true;

	if (anything >= 0.f) // Falling Cylinder but valid pos !
	{
		if (flags & CFLAG_RETURN_HEIGHT)
			cyl.origin.y += anything;

		return true;
	}

	Cylinder tmp;

	if(!(flags & CFLAG_ANCHOR_GENERATION)) {

		tmp = cyl;

		while(anything < 0.f) {
			tmp.origin.y += anything;
			anything = ANCHOR_CheckAnythingInCylinder(tmp, flags);
		}

		anything = tmp.origin.y - cyl.origin.y;
	}

	if(MOVING_CYLINDER) {
		if(flags & CFLAG_NPC) {
			float tolerate;

			if(io
			   && (io->ioflags & IO_NPC)
			   && (io->_npcdata->pathfind.listnb > 0)
			   && (io->_npcdata->pathfind.listpos < io->_npcdata->pathfind.listnb)
			) {
				tolerate = -80;
			} else {
				tolerate = -45;
			}

			if(anything < tolerate)
				return false;
		}

		if(io && !(flags & CFLAG_JUST_TEST)) {
			if((flags & CFLAG_PLAYER) && anything < 0.f) {
				if(player.jumpphase != NotJumping) {
					io->_npcdata->climb_count = MAX_ALLOWED_PER_SECOND;
					return false;
				}

				float dist = std::max(glm::length(vector2D), 1.f);
				float pente;
				pente = glm::abs(anything) / dist * ( 1.0f / 2 ); 
				io->_npcdata->climb_count += pente;

				if(io->_npcdata->climb_count > MAX_ALLOWED_PER_SECOND) {
					io->_npcdata->climb_count = MAX_ALLOWED_PER_SECOND;
					return false;
				}

				if(anything < -55) {
					io->_npcdata->climb_count = MAX_ALLOWED_PER_SECOND;
					return false;
				}
			}
		}
	} else if(anything < -45) {
		return false;
	}

	if((flags & CFLAG_SPECIAL) && anything < -40) {
		if(flags & CFLAG_RETURN_HEIGHT)
			cyl.origin.y += anything;

		return false;
	}

	tmp = cyl;
	tmp.origin.y += anything;
	anything = ANCHOR_CheckAnythingInCylinder(tmp, flags);

	if(anything < 0.f) {
		if(flags & CFLAG_RETURN_HEIGHT) {
			while(anything < 0.f) {
				tmp.origin.y += anything;
				anything = ANCHOR_CheckAnythingInCylinder(tmp, flags);
			}

			cyl.origin.y = tmp.origin.y;
		}

		return false;
	}

	cyl.origin.y = tmp.origin.y;
	return true;
}
Пример #2
0
BOOL ANCHOR_AttemptValidCylinderPos(EERIE_CYLINDER * cyl, INTERACTIVE_OBJ * io, long flags)
{
	float anything = ANCHOR_CheckAnythingInCylinder(cyl, io, flags);

	if ((flags & CFLAG_LEVITATE) && (anything == 0.f)) return TRUE;

	if (anything >= 0.f) // Falling Cylinder but valid pos !
	{
		if (flags & CFLAG_RETURN_HEIGHT)
			cyl->origin.y += anything;

		return TRUE;
	}

	EERIE_CYLINDER tmp;

	if (!(flags & CFLAG_ANCHOR_GENERATION))
	{

		memcpy(&tmp, cyl, sizeof(EERIE_CYLINDER));

		while (anything < 0.f)
		{
			tmp.origin.y += anything;
			anything = ANCHOR_CheckAnythingInCylinder(&tmp, io, flags);
		}

		anything = tmp.origin.y - cyl->origin.y;
	}

	if (MOVING_CYLINDER)
	{
		if (flags & CFLAG_NPC)
		{
			float tolerate;

			if ((io) && (io->ioflags & IO_NPC) && (io->_npcdata->pathfind.listnb > 0) && (io->_npcdata->pathfind.listpos < io->_npcdata->pathfind.listnb))
			{
				tolerate = -80;
			}
			else
				tolerate = -45;

			if (anything < tolerate) return FALSE;
		}

		if (io && (!(flags & CFLAG_JUST_TEST)))
		{
			if ((flags & CFLAG_PLAYER) && (anything < 0.f))
			{
				if (player.jumpphase)
				{
					io->_npcdata->climb_count = MAX_ALLOWED_PER_SECOND;
					return FALSE;
				}

				float dist;
				dist = __max(TRUEVector_Magnitude(&vector2D), 1.f);
				float pente;
				pente = EEfabs(anything) / dist * DIV2; 
				io->_npcdata->climb_count += pente;

				if (io->_npcdata->climb_count > MAX_ALLOWED_PER_SECOND)
				{
					io->_npcdata->climb_count = MAX_ALLOWED_PER_SECOND;
					return FALSE;
				}

				if (anything < -55) 
				{
					io->_npcdata->climb_count = MAX_ALLOWED_PER_SECOND;
					return FALSE;
				}
			}
		}
	}
	else if (anything < -45) return FALSE;

	if ((flags & CFLAG_SPECIAL) && (anything < -40))
	{
		if (flags & CFLAG_RETURN_HEIGHT)
			cyl->origin.y += anything;

		return FALSE;
	}

	memcpy(&tmp, cyl, sizeof(EERIE_CYLINDER));
	tmp.origin.y += anything;
	anything = ANCHOR_CheckAnythingInCylinder(&tmp, io, flags); 

	if (anything < 0.f)
	{
		if (flags & CFLAG_RETURN_HEIGHT)
		{
			while (anything < 0.f)
			{
				tmp.origin.y += anything;
				anything = ANCHOR_CheckAnythingInCylinder(&tmp, io, flags);
			}

			cyl->origin.y = tmp.origin.y; 
		}

		return FALSE;
	}

	cyl->origin.y = tmp.origin.y;
	return TRUE;
}