亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
久久久www成人免费毛片麻豆| 欧美日韩免费一区二区三区视频 | 国产盗摄视频一区二区三区| 婷婷一区二区三区| 亚洲午夜激情网站| 午夜成人在线视频| 午夜影视日本亚洲欧洲精品| 婷婷综合久久一区二区三区| 日本伊人色综合网| 国内外成人在线视频| 国产一区二区免费看| 国产老肥熟一区二区三区| 国产精品资源站在线| 成人国产精品免费观看| 色域天天综合网| 欧美日韩精品专区| 日韩欧美中文字幕精品| 在线成人小视频| 日韩精品一区二区三区在线播放 | 国产精品超碰97尤物18| 亚洲色图.com| 五月婷婷另类国产| 美女一区二区三区| 成人av资源在线观看| 欧美色图12p| 久久亚洲精品国产精品紫薇| 国产精品免费久久久久| 一区二区三区四区在线免费观看| 国产精品久久久久久久久免费丝袜| 亚洲免费在线播放| 精品一区二区国语对白| 99re成人在线| 精品国产乱码久久久久久免费| 欧美激情一区二区在线| 亚洲mv在线观看| 成人午夜电影网站| 欧美精品九九99久久| 国产精品全国免费观看高清| 国产精品美女久久久久久| 午夜欧美在线一二页| 丁香激情综合国产| 制服丝袜亚洲播放| 亚洲欧美日韩国产一区二区三区 | 久久亚洲精华国产精华液| 亚洲精品国产一区二区三区四区在线| 亚洲国产精品一区二区久久 | 国产精品18久久久久久久久久久久 | av一区二区三区四区| 欧美一级理论片| 一区二区免费在线播放| 国产成人自拍网| 欧美一区二区播放| 亚洲在线视频一区| 成人爽a毛片一区二区免费| 欧美一区二区三区爱爱| 亚洲午夜精品17c| 色综合视频在线观看| 久久久久久久av麻豆果冻| 日日夜夜精品视频免费| 91美女片黄在线| 国产精品国产精品国产专区不片| 久久av中文字幕片| 日韩欧美一区二区视频| 亚洲国产日韩精品| 欧洲精品一区二区三区在线观看| 国产精品麻豆一区二区| 国产精品伊人色| 久久午夜电影网| 美女脱光内衣内裤视频久久网站| 欧美日本乱大交xxxxx| 一区二区三区91| 欧美三级资源在线| 亚洲成人一二三| 欧美剧在线免费观看网站| 香港成人在线视频| 日韩一级成人av| 日本人妖一区二区| 欧美成人精品福利| 国产一区中文字幕| 久久久久久9999| 成人免费毛片aaaaa**| 国产精品网曝门| 91欧美一区二区| 亚洲国产乱码最新视频 | 精品久久国产老人久久综合| 蜜桃精品在线观看| www国产成人| 成人午夜免费电影| 亚洲永久免费av| 91麻豆精品国产91久久久| 久久er99热精品一区二区| 精品粉嫩aⅴ一区二区三区四区| 狠狠色狠狠色综合| 日本一区二区三区电影| 色综合欧美在线视频区| 亚洲高清中文字幕| 欧美成人精精品一区二区频| 国产成+人+日韩+欧美+亚洲| 亚洲欧洲精品一区二区精品久久久 | 99久久精品国产网站| 亚洲一区视频在线观看视频| 欧美一区二区免费| 国产成人无遮挡在线视频| 亚洲欧美日韩国产手机在线| 91精品国产aⅴ一区二区| 日本aⅴ亚洲精品中文乱码| 欧美电视剧免费全集观看| 成人午夜av在线| 日韩在线一二三区| 国产精品网曝门| 日韩精品一区二区三区视频 | 91精品1区2区| 七七婷婷婷婷精品国产| 亚洲国产成人私人影院tom| 欧美性色欧美a在线播放| 狠狠色综合日日| 午夜欧美在线一二页| 国产欧美精品国产国产专区| 欧美人动与zoxxxx乱| 国产91精品久久久久久久网曝门| 亚洲综合免费观看高清完整版在线| 日韩欧美国产综合一区 | 亚洲伦理在线免费看| 日韩欧美另类在线| 欧美在线一区二区| 大胆欧美人体老妇| 麻豆成人av在线| 亚洲一区二区三区中文字幕| 亚洲国产精品99久久久久久久久 | 国产调教视频一区| 这里是久久伊人| 不卡av在线网| 国产在线精品不卡| 蜜桃传媒麻豆第一区在线观看| 亚洲综合另类小说| 亚洲欧美日韩一区二区| 亚洲国产高清aⅴ视频| 精品毛片乱码1区2区3区| 欧美久久一区二区| 欧美日韩一区三区| 色婷婷av一区二区三区大白胸| 成人性视频网站| 国产精品伊人色| 国产一区999| 国产在线播精品第三| 久久精品72免费观看| 日韩成人精品在线观看| 午夜精品久久久久久久久| 亚洲综合成人在线| 亚洲五月六月丁香激情| 亚洲男人都懂的| 亚洲综合视频网| 亚洲国产日韩av| 日韩精品一卡二卡三卡四卡无卡| 午夜日韩在线观看| 日韩电影一二三区| 天使萌一区二区三区免费观看| 午夜婷婷国产麻豆精品| 午夜电影久久久| 激情小说欧美图片| 国产精品一级黄| 91免费精品国自产拍在线不卡| 91在线国产观看| 欧美日韩不卡一区| 日韩一级高清毛片| 久久久久久久久蜜桃| 国产精品毛片大码女人| 一区二区三区在线视频观看58| 亚洲一区二区三区四区在线| 午夜成人免费视频| 国产精品18久久久久久久久| 波多野结衣的一区二区三区| 一本大道久久a久久综合| 欧美丰满少妇xxxbbb| 久久综合色鬼综合色| 亚洲欧洲三级电影| 日韩国产欧美在线播放| 国产精品一区三区| 91在线无精精品入口| 欧美亚洲动漫精品| 日韩欧美一二区| 国产婷婷一区二区| 18涩涩午夜精品.www| 石原莉奈一区二区三区在线观看| 国产一区免费电影| 色偷偷久久人人79超碰人人澡 | 老汉av免费一区二区三区| 国产精品亚洲一区二区三区在线 | 亚洲成av人片在www色猫咪| 免费观看日韩电影| 99视频有精品| 日韩一区二区免费视频| 亚洲日穴在线视频| 精品一区二区三区久久| 色88888久久久久久影院野外| 91精品国产综合久久久蜜臀图片 | 久久成人麻豆午夜电影| 91网站在线播放| 国产调教视频一区| 久久激五月天综合精品|