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

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

?? g_misc.c

?? 著名游戲quake2原代碼最新版本(vc6.0可以編譯的)
?? C
?? 第 1 頁 / 共 4 頁
字號:
/*
Copyright (C) 1997-2001 Id Software, Inc.

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  

See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

*/
// g_misc.c

#include "g_local.h"


/*QUAKED func_group (0 0 0) ?
Used to group brushes together just for editor convenience.
*/

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

void Use_Areaportal (edict_t *ent, edict_t *other, edict_t *activator)
{
	ent->count ^= 1;		// toggle state
//	gi.dprintf ("portalstate: %i = %i\n", ent->style, ent->count);
	gi.SetAreaPortalState (ent->style, ent->count);
}

/*QUAKED func_areaportal (0 0 0) ?

This is a non-visible object that divides the world into
areas that are seperated when this portal is not activated.
Usually enclosed in the middle of a door.
*/
void SP_func_areaportal (edict_t *ent)
{
	ent->use = Use_Areaportal;
	ent->count = 0;		// allways start closed;
}

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


/*
=================
Misc functions
=================
*/
void VelocityForDamage (int damage, vec3_t v)
{
	v[0] = 100.0 * crandom();
	v[1] = 100.0 * crandom();
	v[2] = 200.0 + 100.0 * random();

	if (damage < 50)
		VectorScale (v, 0.7, v);
	else 
		VectorScale (v, 1.2, v);
}

void ClipGibVelocity (edict_t *ent)
{
	if (ent->velocity[0] < -300)
		ent->velocity[0] = -300;
	else if (ent->velocity[0] > 300)
		ent->velocity[0] = 300;
	if (ent->velocity[1] < -300)
		ent->velocity[1] = -300;
	else if (ent->velocity[1] > 300)
		ent->velocity[1] = 300;
	if (ent->velocity[2] < 200)
		ent->velocity[2] = 200;	// always some upwards
	else if (ent->velocity[2] > 500)
		ent->velocity[2] = 500;
}


/*
=================
gibs
=================
*/
void gib_think (edict_t *self)
{
	self->s.frame++;
	self->nextthink = level.time + FRAMETIME;

	if (self->s.frame == 10)
	{
		self->think = G_FreeEdict;
		self->nextthink = level.time + 8 + random()*10;
	}
}

void gib_touch (edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf)
{
	vec3_t	normal_angles, right;

	if (!self->groundentity)
		return;

	self->touch = NULL;

	if (plane)
	{
		gi.sound (self, CHAN_VOICE, gi.soundindex ("misc/fhit3.wav"), 1, ATTN_NORM, 0);

		vectoangles (plane->normal, normal_angles);
		AngleVectors (normal_angles, NULL, right, NULL);
		vectoangles (right, self->s.angles);

		if (self->s.modelindex == sm_meat_index)
		{
			self->s.frame++;
			self->think = gib_think;
			self->nextthink = level.time + FRAMETIME;
		}
	}
}

void gib_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
{
	G_FreeEdict (self);
}

void ThrowGib (edict_t *self, char *gibname, int damage, int type)
{
	edict_t *gib;
	vec3_t	vd;
	vec3_t	origin;
	vec3_t	size;
	float	vscale;

	gib = G_Spawn();

	VectorScale (self->size, 0.5, size);
	VectorAdd (self->absmin, size, origin);
	gib->s.origin[0] = origin[0] + crandom() * size[0];
	gib->s.origin[1] = origin[1] + crandom() * size[1];
	gib->s.origin[2] = origin[2] + crandom() * size[2];

	gi.setmodel (gib, gibname);
	gib->solid = SOLID_NOT;
	gib->s.effects |= EF_GIB;
	gib->flags |= FL_NO_KNOCKBACK;
	gib->takedamage = DAMAGE_YES;
	gib->die = gib_die;

	if (type == GIB_ORGANIC)
	{
		gib->movetype = MOVETYPE_TOSS;
		gib->touch = gib_touch;
		vscale = 0.5;
	}
	else
	{
		gib->movetype = MOVETYPE_BOUNCE;
		vscale = 1.0;
	}

	VelocityForDamage (damage, vd);
	VectorMA (self->velocity, vscale, vd, gib->velocity);
	ClipGibVelocity (gib);
	gib->avelocity[0] = random()*600;
	gib->avelocity[1] = random()*600;
	gib->avelocity[2] = random()*600;

	gib->think = G_FreeEdict;
	gib->nextthink = level.time + 10 + random()*10;

	gi.linkentity (gib);
}

void ThrowHead (edict_t *self, char *gibname, int damage, int type)
{
	vec3_t	vd;
	float	vscale;

	self->s.skinnum = 0;
	self->s.frame = 0;
	VectorClear (self->mins);
	VectorClear (self->maxs);

	self->s.modelindex2 = 0;
	gi.setmodel (self, gibname);
	self->solid = SOLID_NOT;
	self->s.effects |= EF_GIB;
	self->s.effects &= ~EF_FLIES;
	self->s.sound = 0;
	self->flags |= FL_NO_KNOCKBACK;
	self->svflags &= ~SVF_MONSTER;
	self->takedamage = DAMAGE_YES;
	self->die = gib_die;

	if (type == GIB_ORGANIC)
	{
		self->movetype = MOVETYPE_TOSS;
		self->touch = gib_touch;
		vscale = 0.5;
	}
	else
	{
		self->movetype = MOVETYPE_BOUNCE;
		vscale = 1.0;
	}

	VelocityForDamage (damage, vd);
	VectorMA (self->velocity, vscale, vd, self->velocity);
	ClipGibVelocity (self);

	self->avelocity[YAW] = crandom()*600;

	self->think = G_FreeEdict;
	self->nextthink = level.time + 10 + random()*10;

	gi.linkentity (self);
}


void ThrowClientHead (edict_t *self, int damage)
{
	vec3_t	vd;
	char	*gibname;

	if (rand()&1)
	{
		gibname = "models/objects/gibs/head2/tris.md2";
		self->s.skinnum = 1;		// second skin is player
	}
	else
	{
		gibname = "models/objects/gibs/skull/tris.md2";
		self->s.skinnum = 0;
	}

	self->s.origin[2] += 32;
	self->s.frame = 0;
	gi.setmodel (self, gibname);
	VectorSet (self->mins, -16, -16, 0);
	VectorSet (self->maxs, 16, 16, 16);

	self->takedamage = DAMAGE_NO;
	self->solid = SOLID_NOT;
	self->s.effects = EF_GIB;
	self->s.sound = 0;
	self->flags |= FL_NO_KNOCKBACK;

	self->movetype = MOVETYPE_BOUNCE;
	VelocityForDamage (damage, vd);
	VectorAdd (self->velocity, vd, self->velocity);

	if (self->client)	// bodies in the queue don't have a client anymore
	{
		self->client->anim_priority = ANIM_DEATH;
		self->client->anim_end = self->s.frame;
	}

	gi.linkentity (self);
}


/*
=================
debris
=================
*/
void debris_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
{
	G_FreeEdict (self);
}

void ThrowDebris (edict_t *self, char *modelname, float speed, vec3_t origin)
{
	edict_t	*chunk;
	vec3_t	v;

	chunk = G_Spawn();
	VectorCopy (origin, chunk->s.origin);
	gi.setmodel (chunk, modelname);
	v[0] = 100 * crandom();
	v[1] = 100 * crandom();
	v[2] = 100 + 100 * crandom();
	VectorMA (self->velocity, speed, v, chunk->velocity);
	chunk->movetype = MOVETYPE_BOUNCE;
	chunk->solid = SOLID_NOT;
	chunk->avelocity[0] = random()*600;
	chunk->avelocity[1] = random()*600;
	chunk->avelocity[2] = random()*600;
	chunk->think = G_FreeEdict;
	chunk->nextthink = level.time + 5 + random()*5;
	chunk->s.frame = 0;
	chunk->flags = 0;
	chunk->classname = "debris";
	chunk->takedamage = DAMAGE_YES;
	chunk->die = debris_die;
	gi.linkentity (chunk);
}


void BecomeExplosion1 (edict_t *self)
{
//ZOID
	//flags are important
	if (strcmp(self->classname, "item_flag_team1") == 0) {
		CTFResetFlag(CTF_TEAM1); // this will free self!
		gi.bprintf(PRINT_HIGH, "The %s flag has returned!\n",
			CTFTeamName(CTF_TEAM1));
		return;
	}
	if (strcmp(self->classname, "item_flag_team2") == 0) {
		CTFResetFlag(CTF_TEAM2); // this will free self!
		gi.bprintf(PRINT_HIGH, "The %s flag has returned!\n",
			CTFTeamName(CTF_TEAM1));
		return;
	}
	// techs are important too
	if (self->item && (self->item->flags & IT_TECH)) {
		CTFRespawnTech(self); // this frees self!
		return;
	}
//ZOID

	gi.WriteByte (svc_temp_entity);
	gi.WriteByte (TE_EXPLOSION1);
	gi.WritePosition (self->s.origin);
	gi.multicast (self->s.origin, MULTICAST_PVS);

	G_FreeEdict (self);
}


void BecomeExplosion2 (edict_t *self)
{
	gi.WriteByte (svc_temp_entity);
	gi.WriteByte (TE_EXPLOSION2);
	gi.WritePosition (self->s.origin);
	gi.multicast (self->s.origin, MULTICAST_PVS);

	G_FreeEdict (self);
}


/*QUAKED path_corner (.5 .3 0) (-8 -8 -8) (8 8 8) TELEPORT
Target: next path corner
Pathtarget: gets used when an entity that has
	this path_corner targeted touches it
*/

void path_corner_touch (edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf)
{
	vec3_t		v;
	edict_t		*next;

	if (other->movetarget != self)
		return;
	
	if (other->enemy)
		return;

	if (self->pathtarget)
	{
		char *savetarget;

		savetarget = self->target;
		self->target = self->pathtarget;
		G_UseTargets (self, other);
		self->target = savetarget;
	}

	if (self->target)
		next = G_PickTarget(self->target);
	else
		next = NULL;

	if ((next) && (next->spawnflags & 1))
	{
		VectorCopy (next->s.origin, v);
		v[2] += next->mins[2];
		v[2] -= other->mins[2];
		VectorCopy (v, other->s.origin);
		next = G_PickTarget(next->target);
	}

	other->goalentity = other->movetarget = next;

	if (self->wait)
	{
		other->monsterinfo.pausetime = level.time + self->wait;
		other->monsterinfo.stand (other);
		return;
	}

	if (!other->movetarget)
	{
		other->monsterinfo.pausetime = level.time + 100000000;
		other->monsterinfo.stand (other);
	}
	else
	{
		VectorSubtract (other->goalentity->s.origin, other->s.origin, v);
		other->ideal_yaw = vectoyaw (v);
	}
}

void SP_path_corner (edict_t *self)
{
	if (!self->targetname)
	{
		gi.dprintf ("path_corner with no targetname at %s\n", vtos(self->s.origin));
		G_FreeEdict (self);
		return;
	}

	self->solid = SOLID_TRIGGER;
	self->touch = path_corner_touch;
	VectorSet (self->mins, -8, -8, -8);
	VectorSet (self->maxs, 8, 8, 8);
	self->svflags |= SVF_NOCLIENT;
	gi.linkentity (self);
}


/*QUAKED point_combat (0.5 0.3 0) (-8 -8 -8) (8 8 8) Hold
Makes this the target of a monster and it will head here
when first activated before going after the activator.  If
hold is selected, it will stay here.
*/
void point_combat_touch (edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf)
{
	edict_t	*activator;

	if (other->movetarget != self)
		return;

	if (self->target)
	{
		other->target = self->target;
		other->goalentity = other->movetarget = G_PickTarget(other->target);
		if (!other->goalentity)
		{
			gi.dprintf("%s at %s target %s does not exist\n", self->classname, vtos(self->s.origin), self->target);
			other->movetarget = self;
		}
		self->target = NULL;
	}
	else if ((self->spawnflags & 1) && !(other->flags & (FL_SWIM|FL_FLY)))
	{
		other->monsterinfo.pausetime = level.time + 100000000;
		other->monsterinfo.aiflags |= AI_STAND_GROUND;
		other->monsterinfo.stand (other);
	}

	if (other->movetarget == self)
	{
		other->target = NULL;
		other->movetarget = NULL;
		other->goalentity = other->enemy;
		other->monsterinfo.aiflags &= ~AI_COMBAT_POINT;
	}

	if (self->pathtarget)
	{
		char *savetarget;

		savetarget = self->target;
		self->target = self->pathtarget;
		if (other->enemy && other->enemy->client)
			activator = other->enemy;
		else if (other->oldenemy && other->oldenemy->client)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
首页国产欧美久久| 欧美色视频在线观看| 欧美一区二区三区成人| 最新国产成人在线观看| 毛片不卡一区二区| 8x福利精品第一导航| 国产精品久久午夜| a4yy欧美一区二区三区| 亚洲h精品动漫在线观看| 精品在线视频一区| 成人精品电影在线观看| 在线观看区一区二| 精品88久久久久88久久久| 亚洲图片欧美色图| 国产成人日日夜夜| 中文字幕精品—区二区四季| 国产毛片精品视频| 国产精品麻豆99久久久久久| av福利精品导航| 亚洲成人精品在线观看| 91精品久久久久久久99蜜桃 | 中文子幕无线码一区tr| 日本午夜一本久久久综合| 日韩视频免费观看高清完整版在线观看 | 91久久免费观看| 成人欧美一区二区三区1314| 成人精品gif动图一区| 国产精品久久久久久久久搜平片| 奇米精品一区二区三区在线观看一 | 国产成人在线观看免费网站| 国产日韩精品一区二区三区| 成人禁用看黄a在线| 亚洲免费观看高清完整版在线| 91麻豆自制传媒国产之光| 亚洲欧洲国产日韩| 欧美精品一二三| 国产成都精品91一区二区三| 精品国产一区二区在线观看| 国产91在线观看| 亚洲精品videosex极品| 欧美tk丨vk视频| 国产成人精品一区二| 视频在线观看91| 中文字幕精品一区二区三区精品| 成人国产精品免费观看视频| 日韩成人免费电影| 亚洲三级理论片| 久久综合999| 日本韩国一区二区| 国产老肥熟一区二区三区| 亚洲一卡二卡三卡四卡无卡久久| 色88888久久久久久影院按摩| 国内精品免费在线观看| 亚洲欧美一区二区久久| 久久久久久亚洲综合影院红桃| 91久久精品午夜一区二区| jlzzjlzz亚洲女人18| 国内欧美视频一区二区| 日韩福利电影在线观看| 欧美国产视频在线| 欧美日韩一级片网站| 欧美性色综合网| 91福利视频久久久久| 成人黄色国产精品网站大全在线免费观看| 亚洲蜜臀av乱码久久精品| 欧美人xxxx| 欧洲精品一区二区三区在线观看| 高清shemale亚洲人妖| 日韩中文字幕不卡| 日韩三级中文字幕| 91精品国模一区二区三区| 欧美高清视频在线高清观看mv色露露十八| 国产精品一区二区久久不卡| 丁香天五香天堂综合| 久久综合资源网| 久久91精品久久久久久秒播| 91精品福利在线| 亚洲综合在线免费观看| 91原创在线视频| 亚洲欧洲日韩综合一区二区| 国产伦精品一区二区三区免费迷| 日韩写真欧美这视频| 五月天中文字幕一区二区| 成人免费观看av| 国产精品初高中害羞小美女文| 国产精品一区二区无线| 久久这里只有精品6| 国产一区二区在线电影| 久久综合五月天婷婷伊人| 激情深爱一区二区| 国产欧美日韩精品a在线观看| 经典三级视频一区| 亚洲国产精品v| 成人91在线观看| 日韩高清在线观看| 国产丝袜在线精品| av在线播放成人| 亚洲成人免费在线| 欧美大胆一级视频| 夫妻av一区二区| 亚洲午夜视频在线| 欧美mv日韩mv亚洲| 国产最新精品免费| 亚洲午夜久久久久| 欧美性猛片aaaaaaa做受| 精品国产乱码久久久久久浪潮| 国产一区欧美日韩| 亚洲日本欧美天堂| 日韩精品一区二区在线| 丁香激情综合国产| 石原莉奈一区二区三区在线观看| 欧美不卡一二三| 91成人在线精品| 国产成人免费在线| 日韩综合一区二区| 日韩欧美一区二区免费| 久久久99精品久久| 国产麻豆精品久久一二三| 一区二区不卡在线播放| 久久中文字幕电影| 日韩精品专区在线| 91精品久久久久久久久99蜜臂| 91麻豆国产在线观看| 丁香桃色午夜亚洲一区二区三区| 日本不卡一二三| 日韩中文字幕1| 亚洲gay无套男同| 欧美激情综合在线| 亚洲日本乱码在线观看| 专区另类欧美日韩| 国产精品久久久久久久久动漫| 久久久精品人体av艺术| 久久精品综合网| 欧美高清在线一区| 1024成人网色www| 成人免费在线观看入口| 69堂精品视频| 精品一区二区三区的国产在线播放| 久久综合狠狠综合| 56国语精品自产拍在线观看| 国产在线精品国自产拍免费| 一区二区日韩av| 欧美精品在线观看播放| 欧美影院一区二区三区| 色老综合老女人久久久| 欧美又粗又大又爽| 欧美性xxxxxxxx| 国产婷婷色一区二区三区| 国产精品美女www爽爽爽| 亚洲精品视频一区二区| 精品一区二区在线播放| 亚洲综合男人的天堂| 国产精品国产a| 亚洲一区视频在线| 国产福利一区二区| 在线观看免费成人| 欧美成人精精品一区二区频| 日韩一区二区免费高清| 国产亚洲一区二区在线观看| 亚洲色图欧洲色图婷婷| 五月婷婷激情综合| 国产精品1区2区3区在线观看| 不卡的电视剧免费网站有什么| 欧美视频一区二区三区四区| 一本大道综合伊人精品热热 | 无码av中文一区二区三区桃花岛| 久久超碰97中文字幕| 色综合天天综合狠狠| 日韩丝袜美女视频| 国产精品高潮久久久久无| 亚洲午夜三级在线| 国产精品亚洲一区二区三区妖精 | 日本va欧美va瓶| 91香蕉视频mp4| 欧美一区二区三区精品| 久久久不卡影院| 青草国产精品久久久久久| 91久久奴性调教| wwwwww.欧美系列| 午夜a成v人精品| 欧美三级中文字| 亚洲成人1区2区| 欧美在线观看一区二区| 国产精品全国免费观看高清 | 老司机精品视频导航| 久久亚洲二区三区| 成人中文字幕电影| 国产精品国产自产拍高清av王其| 成人影视亚洲图片在线| 国产精品女同一区二区三区| 欧美最新大片在线看 | 久久久高清一区二区三区| 成人黄色软件下载| 亚州成人在线电影| 精品国产露脸精彩对白| 国产精品1024| 亚洲成人午夜电影| 国产精品久久久久影院亚瑟| 91免费视频网址| 美女视频黄免费的久久|