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

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

?? g_turret.c

?? 著名游戲quake2原代碼最新版本(vc6.0可以編譯的)
?? C
字號:
/*
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_turret.c

#include "g_local.h"


void AnglesNormalize(vec3_t vec)
{
	while(vec[0] > 360)
		vec[0] -= 360;
	while(vec[0] < 0)
		vec[0] += 360;
	while(vec[1] > 360)
		vec[1] -= 360;
	while(vec[1] < 0)
		vec[1] += 360;
}

float SnapToEights(float x)
{
	x *= 8.0;
	if (x > 0.0)
		x += 0.5;
	else
		x -= 0.5;
	return 0.125 * (int)x;
}


void turret_blocked(edict_t *self, edict_t *other)
{
	edict_t	*attacker;

	if (other->takedamage)
	{
		if (self->teammaster->owner)
			attacker = self->teammaster->owner;
		else
			attacker = self->teammaster;
		T_Damage (other, self, attacker, vec3_origin, other->s.origin, vec3_origin, self->teammaster->dmg, 10, 0, MOD_CRUSH);
	}
}

/*QUAKED turret_breach (0 0 0) ?
This portion of the turret can change both pitch and yaw.
The model  should be made with a flat pitch.
It (and the associated base) need to be oriented towards 0.
Use "angle" to set the starting angle.

"speed"		default 50
"dmg"		default 10
"angle"		point this forward
"target"	point this at an info_notnull at the muzzle tip
"minpitch"	min acceptable pitch angle : default -30
"maxpitch"	max acceptable pitch angle : default 30
"minyaw"	min acceptable yaw angle   : default 0
"maxyaw"	max acceptable yaw angle   : default 360
*/

void turret_breach_fire (edict_t *self)
{
	vec3_t	f, r, u;
	vec3_t	start;
	int		damage;
	int		speed;

	AngleVectors (self->s.angles, f, r, u);
	VectorMA (self->s.origin, self->move_origin[0], f, start);
	VectorMA (start, self->move_origin[1], r, start);
	VectorMA (start, self->move_origin[2], u, start);

	damage = 100 + random() * 50;
	speed = 550 + 50 * skill->value;
	fire_rocket (self->teammaster->owner, start, f, damage, speed, 150, damage);
	gi.positioned_sound (start, self, CHAN_WEAPON, gi.soundindex("weapons/rocklf1a.wav"), 1, ATTN_NORM, 0);
}

void turret_breach_think (edict_t *self)
{
	edict_t	*ent;
	vec3_t	current_angles;
	vec3_t	delta;

	VectorCopy (self->s.angles, current_angles);
	AnglesNormalize(current_angles);

	AnglesNormalize(self->move_angles);
	if (self->move_angles[PITCH] > 180)
		self->move_angles[PITCH] -= 360;

	// clamp angles to mins & maxs
	if (self->move_angles[PITCH] > self->pos1[PITCH])
		self->move_angles[PITCH] = self->pos1[PITCH];
	else if (self->move_angles[PITCH] < self->pos2[PITCH])
		self->move_angles[PITCH] = self->pos2[PITCH];

	if ((self->move_angles[YAW] < self->pos1[YAW]) || (self->move_angles[YAW] > self->pos2[YAW]))
	{
		float	dmin, dmax;

		dmin = fabs(self->pos1[YAW] - self->move_angles[YAW]);
		if (dmin < -180)
			dmin += 360;
		else if (dmin > 180)
			dmin -= 360;
		dmax = fabs(self->pos2[YAW] - self->move_angles[YAW]);
		if (dmax < -180)
			dmax += 360;
		else if (dmax > 180)
			dmax -= 360;
		if (fabs(dmin) < fabs(dmax))
			self->move_angles[YAW] = self->pos1[YAW];
		else
			self->move_angles[YAW] = self->pos2[YAW];
	}

	VectorSubtract (self->move_angles, current_angles, delta);
	if (delta[0] < -180)
		delta[0] += 360;
	else if (delta[0] > 180)
		delta[0] -= 360;
	if (delta[1] < -180)
		delta[1] += 360;
	else if (delta[1] > 180)
		delta[1] -= 360;
	delta[2] = 0;

	if (delta[0] > self->speed * FRAMETIME)
		delta[0] = self->speed * FRAMETIME;
	if (delta[0] < -1 * self->speed * FRAMETIME)
		delta[0] = -1 * self->speed * FRAMETIME;
	if (delta[1] > self->speed * FRAMETIME)
		delta[1] = self->speed * FRAMETIME;
	if (delta[1] < -1 * self->speed * FRAMETIME)
		delta[1] = -1 * self->speed * FRAMETIME;

	VectorScale (delta, 1.0/FRAMETIME, self->avelocity);

	self->nextthink = level.time + FRAMETIME;

	for (ent = self->teammaster; ent; ent = ent->teamchain)
		ent->avelocity[1] = self->avelocity[1];

	// if we have adriver, adjust his velocities
	if (self->owner)
	{
		float	angle;
		float	target_z;
		float	diff;
		vec3_t	target;
		vec3_t	dir;

		// angular is easy, just copy ours
		self->owner->avelocity[0] = self->avelocity[0];
		self->owner->avelocity[1] = self->avelocity[1];

		// x & y
		angle = self->s.angles[1] + self->owner->move_origin[1];
		angle *= (M_PI*2 / 360);
		target[0] = SnapToEights(self->s.origin[0] + cos(angle) * self->owner->move_origin[0]);
		target[1] = SnapToEights(self->s.origin[1] + sin(angle) * self->owner->move_origin[0]);
		target[2] = self->owner->s.origin[2];

		VectorSubtract (target, self->owner->s.origin, dir);
		self->owner->velocity[0] = dir[0] * 1.0 / FRAMETIME;
		self->owner->velocity[1] = dir[1] * 1.0 / FRAMETIME;

		// z
		angle = self->s.angles[PITCH] * (M_PI*2 / 360);
		target_z = SnapToEights(self->s.origin[2] + self->owner->move_origin[0] * tan(angle) + self->owner->move_origin[2]);

		diff = target_z - self->owner->s.origin[2];
		self->owner->velocity[2] = diff * 1.0 / FRAMETIME;

		if (self->spawnflags & 65536)
		{
			turret_breach_fire (self);
			self->spawnflags &= ~65536;
		}
	}
}

void turret_breach_finish_init (edict_t *self)
{
	// get and save info for muzzle location
	if (!self->target)
	{
		gi.dprintf("%s at %s needs a target\n", self->classname, vtos(self->s.origin));
	}
	else
	{
		self->target_ent = G_PickTarget (self->target);
		VectorSubtract (self->target_ent->s.origin, self->s.origin, self->move_origin);
		G_FreeEdict(self->target_ent);
	}

	self->teammaster->dmg = self->dmg;
	self->think = turret_breach_think;
	self->think (self);
}

void SP_turret_breach (edict_t *self)
{
	self->solid = SOLID_BSP;
	self->movetype = MOVETYPE_PUSH;
	gi.setmodel (self, self->model);

	if (!self->speed)
		self->speed = 50;
	if (!self->dmg)
		self->dmg = 10;

	if (!st.minpitch)
		st.minpitch = -30;
	if (!st.maxpitch)
		st.maxpitch = 30;
	if (!st.maxyaw)
		st.maxyaw = 360;

	self->pos1[PITCH] = -1 * st.minpitch;
	self->pos1[YAW]   = st.minyaw;
	self->pos2[PITCH] = -1 * st.maxpitch;
	self->pos2[YAW]   = st.maxyaw;

	self->ideal_yaw = self->s.angles[YAW];
	self->move_angles[YAW] = self->ideal_yaw;

	self->blocked = turret_blocked;

	self->think = turret_breach_finish_init;
	self->nextthink = level.time + FRAMETIME;
	gi.linkentity (self);
}


/*QUAKED turret_base (0 0 0) ?
This portion of the turret changes yaw only.
MUST be teamed with a turret_breach.
*/

void SP_turret_base (edict_t *self)
{
	self->solid = SOLID_BSP;
	self->movetype = MOVETYPE_PUSH;
	gi.setmodel (self, self->model);
	self->blocked = turret_blocked;
	gi.linkentity (self);
}


/*QUAKED turret_driver (1 .5 0) (-16 -16 -24) (16 16 32)
Must NOT be on the team with the rest of the turret parts.
Instead it must target the turret_breach.
*/

void infantry_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage);
void infantry_stand (edict_t *self);
void monster_use (edict_t *self, edict_t *other, edict_t *activator);

void turret_driver_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
{
	edict_t	*ent;

	// level the gun
	self->target_ent->move_angles[0] = 0;

	// remove the driver from the end of them team chain
	for (ent = self->target_ent->teammaster; ent->teamchain != self; ent = ent->teamchain)
		;
	ent->teamchain = NULL;
	self->teammaster = NULL;
	self->flags &= ~FL_TEAMSLAVE;

	self->target_ent->owner = NULL;
	self->target_ent->teammaster->owner = NULL;

	infantry_die (self, inflictor, attacker, damage);
}

qboolean FindTarget (edict_t *self);

void turret_driver_think (edict_t *self)
{
	vec3_t	target;
	vec3_t	dir;
	float	reaction_time;

	self->nextthink = level.time + FRAMETIME;

	if (self->enemy && (!self->enemy->inuse || self->enemy->health <= 0))
		self->enemy = NULL;

	if (!self->enemy)
	{
		if (!FindTarget (self))
			return;
		self->monsterinfo.trail_time = level.time;
		self->monsterinfo.aiflags &= ~AI_LOST_SIGHT;
	}
	else
	{
		if (visible (self, self->enemy))
		{
			if (self->monsterinfo.aiflags & AI_LOST_SIGHT)
			{
				self->monsterinfo.trail_time = level.time;
				self->monsterinfo.aiflags &= ~AI_LOST_SIGHT;
			}
		}
		else
		{
			self->monsterinfo.aiflags |= AI_LOST_SIGHT;
			return;
		}
	}

	// let the turret know where we want it to aim
	VectorCopy (self->enemy->s.origin, target);
	target[2] += self->enemy->viewheight;
	VectorSubtract (target, self->target_ent->s.origin, dir);
	vectoangles (dir, self->target_ent->move_angles);

	// decide if we should shoot
	if (level.time < self->monsterinfo.attack_finished)
		return;

	reaction_time = (3 - skill->value) * 1.0;
	if ((level.time - self->monsterinfo.trail_time) < reaction_time)
		return;

	self->monsterinfo.attack_finished = level.time + reaction_time + 1.0;
	//FIXME how do we really want to pass this along?
	self->target_ent->spawnflags |= 65536;
}

void turret_driver_link (edict_t *self)
{
	vec3_t	vec;
	edict_t	*ent;

	self->think = turret_driver_think;
	self->nextthink = level.time + FRAMETIME;

	self->target_ent = G_PickTarget (self->target);
	self->target_ent->owner = self;
	self->target_ent->teammaster->owner = self;
	VectorCopy (self->target_ent->s.angles, self->s.angles);

	vec[0] = self->target_ent->s.origin[0] - self->s.origin[0];
	vec[1] = self->target_ent->s.origin[1] - self->s.origin[1];
	vec[2] = 0;
	self->move_origin[0] = VectorLength(vec);

	VectorSubtract (self->s.origin, self->target_ent->s.origin, vec);
	vectoangles (vec, vec);
	AnglesNormalize(vec);
	self->move_origin[1] = vec[1];

	self->move_origin[2] = self->s.origin[2] - self->target_ent->s.origin[2];

	// add the driver to the end of them team chain
	for (ent = self->target_ent->teammaster; ent->teamchain; ent = ent->teamchain)
		;
	ent->teamchain = self;
	self->teammaster = self->target_ent->teammaster;
	self->flags |= FL_TEAMSLAVE;
}

void SP_turret_driver (edict_t *self)
{
	if (deathmatch->value)
	{
		G_FreeEdict (self);
		return;
	}

	self->movetype = MOVETYPE_PUSH;
	self->solid = SOLID_BBOX;
	self->s.modelindex = gi.modelindex("models/monsters/infantry/tris.md2");
	VectorSet (self->mins, -16, -16, -24);
	VectorSet (self->maxs, 16, 16, 32);

	self->health = 100;
	self->gib_health = 0;
	self->mass = 200;
	self->viewheight = 24;

	self->die = turret_driver_die;
	self->monsterinfo.stand = infantry_stand;

	self->flags |= FL_NO_KNOCKBACK;

	level.total_monsters++;

	self->svflags |= SVF_MONSTER;
	self->s.renderfx |= RF_FRAMELERP;
	self->takedamage = DAMAGE_AIM;
	self->use = monster_use;
	self->clipmask = MASK_MONSTERSOLID;
	VectorCopy (self->s.origin, self->s.old_origin);
	self->monsterinfo.aiflags |= AI_STAND_GROUND|AI_DUCKED;

	if (st.item)
	{
		self->item = FindItemByClassname (st.item);
		if (!self->item)
			gi.dprintf("%s at %s has bad item: %s\n", self->classname, vtos(self->s.origin), st.item);
	}

	self->think = turret_driver_link;
	self->nextthink = level.time + FRAMETIME;

	gi.linkentity (self);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91麻豆蜜桃一区二区三区| 欧美亚洲国产一区二区三区va| 国产suv一区二区三区88区| 91麻豆免费在线观看| 91精品国产91久久久久久最新毛片| 久久久综合视频| 亚洲成人福利片| 99久久精品费精品国产一区二区| 日韩欧美亚洲国产精品字幕久久久| 亚洲男同1069视频| 国产精品综合一区二区三区| 欧美三级资源在线| 国产精品久久国产精麻豆99网站| 日韩精品欧美精品| 在线观看日韩精品| 亚洲欧洲色图综合| 国产精品亚洲专一区二区三区| 欧美美女激情18p| 亚洲免费伊人电影| av资源网一区| 中文字幕制服丝袜一区二区三区 | 天天综合天天做天天综合| 成人自拍视频在线观看| 久久综合资源网| 美女视频一区在线观看| 欧美日韩久久一区二区| 亚洲国产视频一区二区| 91豆麻精品91久久久久久| 国产精品久久久久影院| 成人福利视频在线看| 精品国产自在久精品国产| 日韩成人午夜精品| 欧美一级免费观看| 日韩激情一区二区| 欧美美女直播网站| 爽好多水快深点欧美视频| 在线观看区一区二| 亚洲一区二区综合| 欧美性生交片4| 亚洲午夜成aⅴ人片| 欧美日韩一区 二区 三区 久久精品| 亚洲九九爱视频| 日本久久一区二区| 亚洲成人动漫一区| 日韩欧美国产一二三区| 麻豆传媒一区二区三区| 日韩欧美一二三四区| 九九九久久久精品| 国产日韩欧美一区二区三区乱码| 国产精品99久久久| 日韩毛片精品高清免费| 在线观看一区二区视频| 亚洲丰满少妇videoshd| 欧美日韩黄视频| 久久机这里只有精品| 久久婷婷色综合| 成人免费视频一区| 亚洲一区二区三区在线看| 欧美精品日韩一区| 国产精品 日产精品 欧美精品| 国产女人水真多18毛片18精品视频| 成人av中文字幕| 亚洲永久免费av| 精品福利二区三区| 不卡电影一区二区三区| 亚洲最大成人网4388xx| 91精品国产综合久久蜜臀 | 日韩精品中文字幕在线不卡尤物 | 一二三四社区欧美黄| 7777精品伊人久久久大香线蕉经典版下载 | 精品国产一区二区三区四区四| 久久精品国产网站| 亚洲色图色小说| 日韩一级成人av| 91免费看视频| 九九**精品视频免费播放| 亚洲色图都市小说| 精品日韩一区二区三区| 97精品超碰一区二区三区| 三级一区在线视频先锋| 国产精品嫩草影院av蜜臀| 91精品免费观看| www.欧美亚洲| 国产在线一区二区| 视频一区中文字幕国产| 亚洲国产成人在线| 日韩欧美一级精品久久| 欧美在线|欧美| k8久久久一区二区三区 | 7777女厕盗摄久久久| 岛国精品一区二区| 美女高潮久久久| 一区二区三区四区av| 欧美国产一区二区| 日韩色在线观看| 欧美私人免费视频| 97精品视频在线观看自产线路二| 国内外精品视频| 日韩av一二三| 亚洲国产精品久久久久秋霞影院 | 一区在线中文字幕| 国产三级欧美三级日产三级99| 欧美一区二区三区男人的天堂| 欧美日韩国产综合一区二区三区| 成人一区二区三区视频| 国产精品1024久久| 国产一区视频在线看| 日韩国产在线一| 日本aⅴ免费视频一区二区三区| 亚洲二区视频在线| 香蕉av福利精品导航| 亚洲一区二区三区在线看| 又紧又大又爽精品一区二区| 国产精品国产馆在线真实露脸| 日本一区二区三区高清不卡| 26uuu亚洲| 国产偷国产偷亚洲高清人白洁| 精品人伦一区二区色婷婷| 日韩欧美123| 精品国产髙清在线看国产毛片| 宅男在线国产精品| 日韩视频一区二区三区| 精品国产青草久久久久福利| 日韩欧美一区二区免费| 欧美变态tickling挠脚心| 精品日韩欧美一区二区| www国产成人| 国产精品欧美久久久久一区二区| 国产精品欧美经典| 亚洲精品视频在线观看免费| 亚洲一区在线观看视频| 视频在线观看一区二区三区| 日本免费在线视频不卡一不卡二| 蜜臀精品久久久久久蜜臀| 国产精品一区三区| 99精品视频一区二区三区| 日本韩国欧美一区| 在线综合+亚洲+欧美中文字幕| 欧美成人一级视频| 中文字幕在线观看一区| 亚洲国产日韩a在线播放| 免费成人av在线| 国产成人午夜精品5599| 色婷婷精品久久二区二区蜜臀av | 亚洲一区二区在线观看视频| 午夜成人在线视频| 国产精品一级黄| 色狠狠一区二区三区香蕉| 精品视频1区2区3区| 精品日韩99亚洲| 亚洲精品日韩综合观看成人91| 亚洲自拍偷拍麻豆| 久久99精品久久久久久国产越南 | 日本视频一区二区三区| 国产精品18久久久久久久久| 色婷婷精品大在线视频| 精品久久久久久久久久久久久久久久久| 久久精品一区四区| 久久不见久久见免费视频7| www.日韩在线| 精品精品欲导航| 亚洲激情自拍视频| 国产寡妇亲子伦一区二区| 欧洲国产伦久久久久久久| 国产午夜精品在线观看| 三级在线观看一区二区| aaa亚洲精品| 26uuu国产日韩综合| 午夜不卡av在线| 色综合色狠狠天天综合色| 日韩免费看网站| 一区二区三区中文在线| 丰满少妇久久久久久久| 日韩免费观看高清完整版 | 国产精品亲子伦对白| 日韩国产欧美一区二区三区| 91麻豆国产福利在线观看| 欧美xxxx老人做受| 日韩精品一二三| 欧美色中文字幕| 亚洲天天做日日做天天谢日日欢 | 欧美精品一区二区三区在线| 亚洲午夜在线视频| av网站免费线看精品| 久久久久青草大香线综合精品| 五月综合激情网| 在线免费观看不卡av| 亚洲欧洲国产专区| 国产精品影视在线观看| 精品免费视频一区二区| 美女国产一区二区三区| 日韩欧美在线影院| 日韩av在线发布| 欧美一区三区四区| 免费一级欧美片在线观看| 欧美日韩在线一区二区| 亚洲一区免费视频| 欧美性受xxxx| 三级亚洲高清视频| 日韩一区二区三区电影|