亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? g_phys.c

?? 著名游戲quake2原代碼最新版本(vc6.0可以編譯的)
?? C
?? 第 1 頁 / 共 2 頁
字號:
			// move this entity
			pushed_p->ent = check;
			VectorCopy (check->s.origin, pushed_p->origin);
			VectorCopy (check->s.angles, pushed_p->angles);
			pushed_p++;

			// try moving the contacted entity 
			VectorAdd (check->s.origin, move, check->s.origin);
			if (check->client)
			{	// FIXME: doesn't rotate monsters?
				check->client->ps.pmove.delta_angles[YAW] += amove[YAW];
			}

			// figure movement due to the pusher's amove
			VectorSubtract (check->s.origin, pusher->s.origin, org);
			org2[0] = DotProduct (org, forward);
			org2[1] = -DotProduct (org, right);
			org2[2] = DotProduct (org, up);
			VectorSubtract (org2, org, move2);
			VectorAdd (check->s.origin, move2, check->s.origin);

			// may have pushed them off an edge
			if (check->groundentity != pusher)
				check->groundentity = NULL;

			block = SV_TestEntityPosition (check);
			if (!block)
			{	// pushed ok
				gi.linkentity (check);
				// impact?
				continue;
			}

			// if it is ok to leave in the old position, do it
			// this is only relevent for riding entities, not pushed
			// FIXME: this doesn't acount for rotation
			VectorSubtract (check->s.origin, move, check->s.origin);
			block = SV_TestEntityPosition (check);
			if (!block)
			{
				pushed_p--;
				continue;
			}
		}
		
		// save off the obstacle so we can call the block function
		obstacle = check;

		// move back any entities we already moved
		// go backwards, so if the same entity was pushed
		// twice, it goes back to the original position
		for (p=pushed_p-1 ; p>=pushed ; p--)
		{
			VectorCopy (p->origin, p->ent->s.origin);
			VectorCopy (p->angles, p->ent->s.angles);
			if (p->ent->client)
			{
				p->ent->client->ps.pmove.delta_angles[YAW] = p->deltayaw;
			}
			gi.linkentity (p->ent);
		}
		return false;
	}

//FIXME: is there a better way to handle this?
	// see if anything we moved has touched a trigger
	for (p=pushed_p-1 ; p>=pushed ; p--)
		G_TouchTriggers (p->ent);

	return true;
}

/*
================
SV_Physics_Pusher

Bmodel objects don't interact with each other, but
push all box objects
================
*/
void SV_Physics_Pusher (edict_t *ent)
{
	vec3_t		move, amove;
	edict_t		*part, *mv;

	// if not a team captain, so movement will be handled elsewhere
	if ( ent->flags & FL_TEAMSLAVE)
		return;

	// make sure all team slaves can move before commiting
	// any moves or calling any think functions
	// if the move is blocked, all moved objects will be backed out
//retry:
	pushed_p = pushed;
	for (part = ent ; part ; part=part->teamchain)
	{
		if (part->velocity[0] || part->velocity[1] || part->velocity[2] ||
			part->avelocity[0] || part->avelocity[1] || part->avelocity[2]
			)
		{	// object is moving
			VectorScale (part->velocity, FRAMETIME, move);
			VectorScale (part->avelocity, FRAMETIME, amove);

			if (!SV_Push (part, move, amove))
				break;	// move was blocked
		}
	}
	if (pushed_p > &pushed[MAX_EDICTS])
		gi.error (ERR_FATAL, "pushed_p > &pushed[MAX_EDICTS], memory corrupted");

	if (part)
	{
		// the move failed, bump all nextthink times and back out moves
		for (mv = ent ; mv ; mv=mv->teamchain)
		{
			if (mv->nextthink > 0)
				mv->nextthink += FRAMETIME;
		}

		// if the pusher has a "blocked" function, call it
		// otherwise, just stay in place until the obstacle is gone
		if (part->blocked)
			part->blocked (part, obstacle);
#if 0
		// if the pushed entity went away and the pusher is still there
		if (!obstacle->inuse && part->inuse)
			goto retry;
#endif
	}
	else
	{
		// the move succeeded, so call all think functions
		for (part = ent ; part ; part=part->teamchain)
		{
			SV_RunThink (part);
		}
	}
}

//==================================================================

/*
=============
SV_Physics_None

Non moving objects can only think
=============
*/
void SV_Physics_None (edict_t *ent)
{
// regular thinking
	SV_RunThink (ent);
}

/*
=============
SV_Physics_Noclip

A moving object that doesn't obey physics
=============
*/
void SV_Physics_Noclip (edict_t *ent)
{
// regular thinking
	if (!SV_RunThink (ent))
		return;
	
	VectorMA (ent->s.angles, FRAMETIME, ent->avelocity, ent->s.angles);
	VectorMA (ent->s.origin, FRAMETIME, ent->velocity, ent->s.origin);

	gi.linkentity (ent);
}

/*
==============================================================================

TOSS / BOUNCE

==============================================================================
*/

/*
=============
SV_Physics_Toss

Toss, bounce, and fly movement.  When onground, do nothing.
=============
*/
void SV_Physics_Toss (edict_t *ent)
{
	trace_t		trace;
	vec3_t		move;
	float		backoff;
	edict_t		*slave;
	qboolean	wasinwater;
	qboolean	isinwater;
	vec3_t		old_origin;

// regular thinking
	SV_RunThink (ent);

	// if not a team captain, so movement will be handled elsewhere
	if ( ent->flags & FL_TEAMSLAVE)
		return;

	if (ent->velocity[2] > 0)
		ent->groundentity = NULL;

// check for the groundentity going away
	if (ent->groundentity)
		if (!ent->groundentity->inuse)
			ent->groundentity = NULL;

// if onground, return without moving
	if ( ent->groundentity )
		return;

	VectorCopy (ent->s.origin, old_origin);

	SV_CheckVelocity (ent);

// add gravity
	if (ent->movetype != MOVETYPE_FLY
	&& ent->movetype != MOVETYPE_FLYMISSILE)
		SV_AddGravity (ent);

// move angles
	VectorMA (ent->s.angles, FRAMETIME, ent->avelocity, ent->s.angles);

// move origin
	VectorScale (ent->velocity, FRAMETIME, move);
	trace = SV_PushEntity (ent, move);
	if (!ent->inuse)
		return;

	if (trace.fraction < 1)
	{
		if (ent->movetype == MOVETYPE_BOUNCE)
			backoff = 1.5;
		else
			backoff = 1;

		ClipVelocity (ent->velocity, trace.plane.normal, ent->velocity, backoff);

	// stop if on ground
		if (trace.plane.normal[2] > 0.7)
		{		
			if (ent->velocity[2] < 60 || ent->movetype != MOVETYPE_BOUNCE )
			{
				ent->groundentity = trace.ent;
				ent->groundentity_linkcount = trace.ent->linkcount;
				VectorCopy (vec3_origin, ent->velocity);
				VectorCopy (vec3_origin, ent->avelocity);
			}
		}

//		if (ent->touch)
//			ent->touch (ent, trace.ent, &trace.plane, trace.surface);
	}
	
// check for water transition
	wasinwater = (ent->watertype & MASK_WATER);
	ent->watertype = gi.pointcontents (ent->s.origin);
	isinwater = ent->watertype & MASK_WATER;

	if (isinwater)
		ent->waterlevel = 1;
	else
		ent->waterlevel = 0;

	if (!wasinwater && isinwater)
		gi.positioned_sound (old_origin, g_edicts, CHAN_AUTO, gi.soundindex("misc/h2ohit1.wav"), 1, 1, 0);
	else if (wasinwater && !isinwater)
		gi.positioned_sound (ent->s.origin, g_edicts, CHAN_AUTO, gi.soundindex("misc/h2ohit1.wav"), 1, 1, 0);

// move teamslaves
	for (slave = ent->teamchain; slave; slave = slave->teamchain)
	{
		VectorCopy (ent->s.origin, slave->s.origin);
		gi.linkentity (slave);
	}
}

/*
===============================================================================

STEPPING MOVEMENT

===============================================================================
*/

/*
=============
SV_Physics_Step

Monsters freefall when they don't have a ground entity, otherwise
all movement is done with discrete steps.

This is also used for objects that have become still on the ground, but
will fall if the floor is pulled out from under them.
FIXME: is this true?
=============
*/

//FIXME: hacked in for E3 demo
#define	sv_stopspeed		100
#define sv_friction			6
#define sv_waterfriction	1

void SV_AddRotationalFriction (edict_t *ent)
{
	int		n;
	float	adjustment;

	VectorMA (ent->s.angles, FRAMETIME, ent->avelocity, ent->s.angles);
	adjustment = FRAMETIME * sv_stopspeed * sv_friction;
	for (n = 0; n < 3; n++)
	{
		if (ent->avelocity[n] > 0)
		{
			ent->avelocity[n] -= adjustment;
			if (ent->avelocity[n] < 0)
				ent->avelocity[n] = 0;
		}
		else
		{
			ent->avelocity[n] += adjustment;
			if (ent->avelocity[n] > 0)
				ent->avelocity[n] = 0;
		}
	}
}

void SV_Physics_Step (edict_t *ent)
{
	qboolean	wasonground;
	qboolean	hitsound = false;
	float		*vel;
	float		speed, newspeed, control;
	float		friction;
	edict_t		*groundentity;
	int			mask;

	// airborn monsters should always check for ground
	if (!ent->groundentity)
		M_CheckGround (ent);

	groundentity = ent->groundentity;

	SV_CheckVelocity (ent);

	if (groundentity)
		wasonground = true;
	else
		wasonground = false;
		
	if (ent->avelocity[0] || ent->avelocity[1] || ent->avelocity[2])
		SV_AddRotationalFriction (ent);

	// add gravity except:
	//   flying monsters
	//   swimming monsters who are in the water
	if (! wasonground)
		if (!(ent->flags & FL_FLY))
			if (!((ent->flags & FL_SWIM) && (ent->waterlevel > 2)))
			{
				if (ent->velocity[2] < sv_gravity->value*-0.1)
					hitsound = true;
				if (ent->waterlevel == 0)
					SV_AddGravity (ent);
			}

	// friction for flying monsters that have been given vertical velocity
	if ((ent->flags & FL_FLY) && (ent->velocity[2] != 0))
	{
		speed = fabs(ent->velocity[2]);
		control = speed < sv_stopspeed ? sv_stopspeed : speed;
		friction = sv_friction/3;
		newspeed = speed - (FRAMETIME * control * friction);
		if (newspeed < 0)
			newspeed = 0;
		newspeed /= speed;
		ent->velocity[2] *= newspeed;
	}

	// friction for flying monsters that have been given vertical velocity
	if ((ent->flags & FL_SWIM) && (ent->velocity[2] != 0))
	{
		speed = fabs(ent->velocity[2]);
		control = speed < sv_stopspeed ? sv_stopspeed : speed;
		newspeed = speed - (FRAMETIME * control * sv_waterfriction * ent->waterlevel);
		if (newspeed < 0)
			newspeed = 0;
		newspeed /= speed;
		ent->velocity[2] *= newspeed;
	}

	if (ent->velocity[2] || ent->velocity[1] || ent->velocity[0])
	{
		// apply friction
		// let dead monsters who aren't completely onground slide
		if ((wasonground) || (ent->flags & (FL_SWIM|FL_FLY)))
			if (!(ent->health <= 0.0 && !M_CheckBottom(ent)))
			{
				vel = ent->velocity;
				speed = sqrt(vel[0]*vel[0] +vel[1]*vel[1]);
				if (speed)
				{
					friction = sv_friction;

					control = speed < sv_stopspeed ? sv_stopspeed : speed;
					newspeed = speed - FRAMETIME*control*friction;

					if (newspeed < 0)
						newspeed = 0;
					newspeed /= speed;

					vel[0] *= newspeed;
					vel[1] *= newspeed;
				}
			}

		if (ent->svflags & SVF_MONSTER)
			mask = MASK_MONSTERSOLID;
		else
			mask = MASK_SOLID;
		SV_FlyMove (ent, FRAMETIME, mask);

		gi.linkentity (ent);
		G_TouchTriggers (ent);
		if (!ent->inuse)
			return;

		if (ent->groundentity)
			if (!wasonground)
				if (hitsound)
					gi.sound (ent, 0, gi.soundindex("world/land.wav"), 1, 1, 0);
	}

// regular thinking
	SV_RunThink (ent);
}

//============================================================================
/*
================
G_RunEntity

================
*/
void G_RunEntity (edict_t *ent)
{
	if (ent->prethink)
		ent->prethink (ent);

	switch ( (int)ent->movetype)
	{
	case MOVETYPE_PUSH:
	case MOVETYPE_STOP:
		SV_Physics_Pusher (ent);
		break;
	case MOVETYPE_NONE:
		SV_Physics_None (ent);
		break;
	case MOVETYPE_NOCLIP:
		SV_Physics_Noclip (ent);
		break;
	case MOVETYPE_STEP:
		SV_Physics_Step (ent);
		break;
	case MOVETYPE_TOSS:
	case MOVETYPE_BOUNCE:
	case MOVETYPE_FLY:
	case MOVETYPE_FLYMISSILE:
		SV_Physics_Toss (ent);
		break;
	default:
		gi.error ("SV_Physics: bad movetype %i", (int)ent->movetype);			
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩激情一区| 亚洲伦理在线免费看| 波多野结衣中文字幕一区| 亚洲福利电影网| 亚洲国产精品久久久久秋霞影院 | 国产麻豆日韩欧美久久| 美女爽到高潮91| 美国十次了思思久久精品导航| 夫妻av一区二区| 99精品一区二区三区| 91小视频在线免费看| 欧美性大战久久| 日韩精品一区在线观看| 久久久影视传媒| 日韩理论电影院| 亚洲午夜精品一区二区三区他趣| 国产一区二区三区av电影| 91麻豆精品国产91久久久资源速度 | 色综合 综合色| 欧美日韩高清一区二区| 中文字幕一区不卡| 午夜欧美在线一二页| 国内欧美视频一区二区 | 五月婷婷色综合| 日本精品一级二级| 精品少妇一区二区三区在线播放 | 51精品视频一区二区三区| 综合久久国产九一剧情麻豆| 国产一区二区按摩在线观看| 欧美一区二区大片| 国产精品妹子av| 香蕉av福利精品导航| 国内成人精品2018免费看| 91精品国产品国语在线不卡| 亚洲成人免费在线观看| 欧美婷婷六月丁香综合色| 亚洲另类中文字| 日本丰满少妇一区二区三区| √…a在线天堂一区| 91网页版在线| 亚洲欧美电影院| 国产一区二区三区在线观看免费| 精品国产一区二区三区久久影院| 一个色妞综合视频在线观看| 黑人巨大精品欧美黑白配亚洲| 91精品国产手机| 美女性感视频久久| 久久久不卡影院| av电影在线观看一区| 亚洲精品在线免费观看视频| 国产一区二区三区黄视频 | 欧美日韩亚洲国产综合| 国产精品视频一区二区三区不卡| 大陆成人av片| 久久久久久久国产精品影院| 国产成人精品免费| 日韩精品一区二区三区视频播放| 久久成人18免费观看| 欧美精品丝袜久久久中文字幕| 亚洲视频免费看| 欧美无人高清视频在线观看| 日韩国产高清影视| 欧美午夜精品久久久久久孕妇| 午夜影院在线观看欧美| 日韩亚洲欧美在线| 欧美网站一区二区| 欧美一区二区久久久| 性久久久久久久久久久久| 欧美在线视频日韩| 欧美国产精品v| 精品一区二区在线播放| 欧美高清视频不卡网| 蜜桃视频免费观看一区| 国产精品女人毛片| 欧美性感一区二区三区| 国产老妇另类xxxxx| 欧美成人福利视频| 成人精品免费网站| 日本不卡的三区四区五区| 欧美日韩国产乱码电影| 国产一区视频在线看| 亚洲精品欧美综合四区| 久久综合色婷婷| 国产一区二区三区在线观看精品 | 欧美伦理视频网站| 成人18视频在线播放| 免费在线观看精品| 亚洲自拍欧美精品| 欧美日韩三级视频| 成人av综合一区| 精彩视频一区二区| 亚洲五月六月丁香激情| 中文字幕一区二区三区在线播放| 777亚洲妇女| 91久久一区二区| caoporen国产精品视频| 国内精品在线播放| 麻豆精品蜜桃视频网站| 日韩精品色哟哟| 国产日产欧美一区| 91蝌蚪国产九色| 国产成人精品综合在线观看| 蜜臀av在线播放一区二区三区| 亚洲精品免费视频| 国产精品嫩草久久久久| 久久久久国产精品厨房| 2023国产精华国产精品| 91精品视频网| 欧美三级电影在线看| 91亚洲精品一区二区乱码| 国产黄人亚洲片| 韩国欧美国产1区| 久久精品99国产精品日本| 午夜精品久久久久久久99水蜜桃 | 欧美国产欧美亚州国产日韩mv天天看完整| 欧美日韩国产综合视频在线观看| 一本一道久久a久久精品| www.综合网.com| 不卡影院免费观看| 波多野结衣在线一区| 波多野洁衣一区| 成人妖精视频yjsp地址| 成人综合在线网站| 成人免费不卡视频| 99久久精品国产观看| 91女人视频在线观看| 99视频超级精品| 91浏览器在线视频| 欧美性一二三区| 欧美日韩你懂的| 欧美一区二区三区系列电影| 337p亚洲精品色噜噜| 日韩免费在线观看| 欧美va亚洲va国产综合| 久久久亚洲国产美女国产盗摄| 国产日韩亚洲欧美综合| 国产精品久久久久影院老司| 欧美一级高清大全免费观看| 欧美一级理论片| 久久日韩精品一区二区五区| 国产日韩欧美精品综合| 日韩理论片在线| 亚洲mv大片欧洲mv大片精品| 秋霞影院一区二区| 国产乱妇无码大片在线观看| 播五月开心婷婷综合| 欧美日韩视频在线观看一区二区三区| 在线播放亚洲一区| 久久久不卡影院| 一区二区三区**美女毛片| 美腿丝袜在线亚洲一区| 国产丶欧美丶日本不卡视频| 一本到高清视频免费精品| 欧美区一区二区三区| 久久精品一二三| 欧美精品一区二区三区高清aⅴ | www.欧美日韩| 欧美亚洲愉拍一区二区| 日韩欧美在线观看一区二区三区| 久久精品视频在线免费观看| 亚洲啪啪综合av一区二区三区| 天天色综合成人网| 成人在线一区二区三区| 欧美日韩和欧美的一区二区| 国产亚洲精品精华液| 亚洲第一av色| 国产大片一区二区| 欧美自拍偷拍一区| 久久久久久久久一| 手机精品视频在线观看| 成人免费av在线| 日韩午夜精品电影| 有坂深雪av一区二区精品| 精品制服美女久久| 欧美性xxxxxx少妇| 国产蜜臀av在线一区二区三区| 亚洲第一福利视频在线| 大桥未久av一区二区三区中文| 欧美精品久久99| 亚洲男人的天堂一区二区| 国产精品一区在线| 91精品欧美综合在线观看最新| 国产精品私人影院| 国内久久婷婷综合| 欧美一区二区福利在线| 亚洲成人动漫在线观看| av动漫一区二区| 欧美国产精品久久| 国产精品影视在线| 欧美一区二区成人| 亚洲午夜精品在线| 欧美性大战久久久| 一区二区三区丝袜| 91小视频在线免费看| 国产精品美女久久久久av爽李琼| 精品无人码麻豆乱码1区2区| 欧美日韩一区二区在线观看| 亚洲激情男女视频| 色综合久久久网| 亚洲人妖av一区二区|