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

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

?? g_monster.c

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

*/
#include "g_local.h"


//
// monster weapons
//

//FIXME mosnters should call these with a totally accurate direction
// and we can mess it up based on skill.  Spread should be for normal
// and we can tighten or loosen based on skill.  We could muck with
// the damages too, but I'm not sure that's such a good idea.
void monster_fire_bullet (edict_t *self, vec3_t start, vec3_t dir, int damage, int kick, int hspread, int vspread, int flashtype)
{
	fire_bullet (self, start, dir, damage, kick, hspread, vspread, MOD_UNKNOWN);

	gi.WriteByte (svc_muzzleflash2);
	gi.WriteShort (self - g_edicts);
	gi.WriteByte (flashtype);
	gi.multicast (start, MULTICAST_PVS);
}

void monster_fire_shotgun (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int kick, int hspread, int vspread, int count, int flashtype)
{
	fire_shotgun (self, start, aimdir, damage, kick, hspread, vspread, count, MOD_UNKNOWN);

	gi.WriteByte (svc_muzzleflash2);
	gi.WriteShort (self - g_edicts);
	gi.WriteByte (flashtype);
	gi.multicast (start, MULTICAST_PVS);
}

void monster_fire_blaster (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, int flashtype, int effect)
{
	fire_blaster (self, start, dir, damage, speed, effect, false);

	gi.WriteByte (svc_muzzleflash2);
	gi.WriteShort (self - g_edicts);
	gi.WriteByte (flashtype);
	gi.multicast (start, MULTICAST_PVS);
}	

void monster_fire_grenade (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed, int flashtype)
{
	fire_grenade (self, start, aimdir, damage, speed, 2.5, damage+40);

	gi.WriteByte (svc_muzzleflash2);
	gi.WriteShort (self - g_edicts);
	gi.WriteByte (flashtype);
	gi.multicast (start, MULTICAST_PVS);
}

void monster_fire_rocket (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, int flashtype)
{
	fire_rocket (self, start, dir, damage, speed, damage+20, damage);

	gi.WriteByte (svc_muzzleflash2);
	gi.WriteShort (self - g_edicts);
	gi.WriteByte (flashtype);
	gi.multicast (start, MULTICAST_PVS);
}	

void monster_fire_railgun (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int kick, int flashtype)
{
	fire_rail (self, start, aimdir, damage, kick);

	gi.WriteByte (svc_muzzleflash2);
	gi.WriteShort (self - g_edicts);
	gi.WriteByte (flashtype);
	gi.multicast (start, MULTICAST_PVS);
}

void monster_fire_bfg (edict_t *self, vec3_t start, vec3_t aimdir, int damage, int speed, int kick, float damage_radius, int flashtype)
{
	fire_bfg (self, start, aimdir, damage, speed, damage_radius);

	gi.WriteByte (svc_muzzleflash2);
	gi.WriteShort (self - g_edicts);
	gi.WriteByte (flashtype);
	gi.multicast (start, MULTICAST_PVS);
}



//
// Monster utility functions
//

static void M_FliesOff (edict_t *self)
{
	self->s.effects &= ~EF_FLIES;
	self->s.sound = 0;
}

static void M_FliesOn (edict_t *self)
{
	if (self->waterlevel)
		return;
	self->s.effects |= EF_FLIES;
	self->s.sound = gi.soundindex ("infantry/inflies1.wav");
	self->think = M_FliesOff;
	self->nextthink = level.time + 60;
}

void M_FlyCheck (edict_t *self)
{
	if (self->waterlevel)
		return;

	if (random() > 0.5)
		return;

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

void AttackFinished (edict_t *self, float time)
{
	self->monsterinfo.attack_finished = level.time + time;
}


void M_CheckGround (edict_t *ent)
{
	vec3_t		point;
	trace_t		trace;

	if (ent->flags & (FL_SWIM|FL_FLY))
		return;

	if (ent->velocity[2] > 100)
	{
		ent->groundentity = NULL;
		return;
	}

// if the hull point one-quarter unit down is solid the entity is on ground
	point[0] = ent->s.origin[0];
	point[1] = ent->s.origin[1];
	point[2] = ent->s.origin[2] - 0.25;

	trace = gi.trace (ent->s.origin, ent->mins, ent->maxs, point, ent, MASK_MONSTERSOLID);

	// check steepness
	if ( trace.plane.normal[2] < 0.7 && !trace.startsolid)
	{
		ent->groundentity = NULL;
		return;
	}

//	ent->groundentity = trace.ent;
//	ent->groundentity_linkcount = trace.ent->linkcount;
//	if (!trace.startsolid && !trace.allsolid)
//		VectorCopy (trace.endpos, ent->s.origin);
	if (!trace.startsolid && !trace.allsolid)
	{
		VectorCopy (trace.endpos, ent->s.origin);
		ent->groundentity = trace.ent;
		ent->groundentity_linkcount = trace.ent->linkcount;
		ent->velocity[2] = 0;
	}
}


void M_CatagorizePosition (edict_t *ent)
{
	vec3_t		point;
	int			cont;

//
// get waterlevel
//
	point[0] = ent->s.origin[0];
	point[1] = ent->s.origin[1];
	point[2] = ent->s.origin[2] + ent->mins[2] + 1;	
	cont = gi.pointcontents (point);

	if (!(cont & MASK_WATER))
	{
		ent->waterlevel = 0;
		ent->watertype = 0;
		return;
	}

	ent->watertype = cont;
	ent->waterlevel = 1;
	point[2] += 26;
	cont = gi.pointcontents (point);
	if (!(cont & MASK_WATER))
		return;

	ent->waterlevel = 2;
	point[2] += 22;
	cont = gi.pointcontents (point);
	if (cont & MASK_WATER)
		ent->waterlevel = 3;
}


void M_WorldEffects (edict_t *ent)
{
	int		dmg;

	if (ent->health > 0)
	{
		if (!(ent->flags & FL_SWIM))
		{
			if (ent->waterlevel < 3)
			{
				ent->air_finished = level.time + 12;
			}
			else if (ent->air_finished < level.time)
			{	// drown!
				if (ent->pain_debounce_time < level.time)
				{
					dmg = 2 + 2 * floor(level.time - ent->air_finished);
					if (dmg > 15)
						dmg = 15;
					T_Damage (ent, world, world, vec3_origin, ent->s.origin, vec3_origin, dmg, 0, DAMAGE_NO_ARMOR, MOD_WATER);
					ent->pain_debounce_time = level.time + 1;
				}
			}
		}
		else
		{
			if (ent->waterlevel > 0)
			{
				ent->air_finished = level.time + 9;
			}
			else if (ent->air_finished < level.time)
			{	// suffocate!
				if (ent->pain_debounce_time < level.time)
				{
					dmg = 2 + 2 * floor(level.time - ent->air_finished);
					if (dmg > 15)
						dmg = 15;
					T_Damage (ent, world, world, vec3_origin, ent->s.origin, vec3_origin, dmg, 0, DAMAGE_NO_ARMOR, MOD_WATER);
					ent->pain_debounce_time = level.time + 1;
				}
			}
		}
	}
	
	if (ent->waterlevel == 0)
	{
		if (ent->flags & FL_INWATER)
		{	
			gi.sound (ent, CHAN_BODY, gi.soundindex("player/watr_out.wav"), 1, ATTN_NORM, 0);
			ent->flags &= ~FL_INWATER;
		}
		return;
	}

	if ((ent->watertype & CONTENTS_LAVA) && !(ent->flags & FL_IMMUNE_LAVA))
	{
		if (ent->damage_debounce_time < level.time)
		{
			ent->damage_debounce_time = level.time + 0.2;
			T_Damage (ent, world, world, vec3_origin, ent->s.origin, vec3_origin, 10*ent->waterlevel, 0, 0, MOD_LAVA);
		}
	}
	if ((ent->watertype & CONTENTS_SLIME) && !(ent->flags & FL_IMMUNE_SLIME))
	{
		if (ent->damage_debounce_time < level.time)
		{
			ent->damage_debounce_time = level.time + 1;
			T_Damage (ent, world, world, vec3_origin, ent->s.origin, vec3_origin, 4*ent->waterlevel, 0, 0, MOD_SLIME);
		}
	}
	
	if ( !(ent->flags & FL_INWATER) )
	{	
		if (!(ent->svflags & SVF_DEADMONSTER))
		{
			if (ent->watertype & CONTENTS_LAVA)
				if (random() <= 0.5)
					gi.sound (ent, CHAN_BODY, gi.soundindex("player/lava1.wav"), 1, ATTN_NORM, 0);
				else
					gi.sound (ent, CHAN_BODY, gi.soundindex("player/lava2.wav"), 1, ATTN_NORM, 0);
			else if (ent->watertype & CONTENTS_SLIME)
				gi.sound (ent, CHAN_BODY, gi.soundindex("player/watr_in.wav"), 1, ATTN_NORM, 0);
			else if (ent->watertype & CONTENTS_WATER)
				gi.sound (ent, CHAN_BODY, gi.soundindex("player/watr_in.wav"), 1, ATTN_NORM, 0);
		}

		ent->flags |= FL_INWATER;
		ent->damage_debounce_time = 0;
	}
}


void M_droptofloor (edict_t *ent)
{
	vec3_t		end;
	trace_t		trace;

	ent->s.origin[2] += 1;
	VectorCopy (ent->s.origin, end);
	end[2] -= 256;
	
	trace = gi.trace (ent->s.origin, ent->mins, ent->maxs, end, ent, MASK_MONSTERSOLID);

	if (trace.fraction == 1 || trace.allsolid)
		return;

	VectorCopy (trace.endpos, ent->s.origin);

	gi.linkentity (ent);
	M_CheckGround (ent);
	M_CatagorizePosition (ent);
}


void M_SetEffects (edict_t *ent)
{
	ent->s.effects &= ~(EF_COLOR_SHELL|EF_POWERSCREEN);
	ent->s.renderfx &= ~(RF_SHELL_RED|RF_SHELL_GREEN|RF_SHELL_BLUE);

	if (ent->monsterinfo.aiflags & AI_RESURRECTING)
	{
		ent->s.effects |= EF_COLOR_SHELL;
		ent->s.renderfx |= RF_SHELL_RED;
	}

	if (ent->health <= 0)
		return;

	if (ent->powerarmor_time > level.time)
	{
		if (ent->monsterinfo.power_armor_type == POWER_ARMOR_SCREEN)
		{
			ent->s.effects |= EF_POWERSCREEN;
		}
		else if (ent->monsterinfo.power_armor_type == POWER_ARMOR_SHIELD)
		{
			ent->s.effects |= EF_COLOR_SHELL;
			ent->s.renderfx |= RF_SHELL_GREEN;
		}
	}
}


void M_MoveFrame (edict_t *self)
{
	mmove_t	*move;
	int		index;

	move = self->monsterinfo.currentmove;
	self->nextthink = level.time + FRAMETIME;

	if ((self->monsterinfo.nextframe) && (self->monsterinfo.nextframe >= move->firstframe) && (self->monsterinfo.nextframe <= move->lastframe))
	{
		self->s.frame = self->monsterinfo.nextframe;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
麻豆91在线播放免费| 欧美日韩情趣电影| 欧洲精品在线观看| 精品国产一区二区亚洲人成毛片| 国产精品久久久久一区二区三区| 美女视频一区二区三区| 色综合久久久久网| 久久综合久久99| 日韩黄色免费网站| 色老综合老女人久久久| 欧美激情一区二区在线| 久久精品国产**网站演员| 欧美日韩国产天堂| 亚洲男人的天堂一区二区| 成人网男人的天堂| 久久亚洲一区二区三区四区| 日韩av一级电影| 欧美午夜一区二区三区免费大片| 亚洲国产高清在线| 国产老妇另类xxxxx| 日韩女同互慰一区二区| 天堂一区二区在线| 欧美日韩国产a| 一区二区三区在线观看动漫| av电影在线观看一区| 国产日韩欧美高清在线| 国产美女视频91| 2021中文字幕一区亚洲| 精品在线播放免费| 精品免费99久久| 久久成人麻豆午夜电影| 欧美经典三级视频一区二区三区| 久久国内精品视频| 日韩精品一区二区三区在线播放| 青青草国产成人av片免费| 在线播放91灌醉迷j高跟美女| 亚洲一区视频在线观看视频| 日本韩国一区二区| 亚洲午夜电影网| 欧美一级夜夜爽| 日韩电影在线看| 日韩免费一区二区| 国产在线精品不卡| 国产精品无码永久免费888| 99久久777色| 一区二区三区国产精华| 欧美日本免费一区二区三区| 强制捆绑调教一区二区| 欧美精品一区二区三区蜜臀| 成人av网站在线观看| 亚洲美女屁股眼交3| 欧美日本视频在线| 国精品**一区二区三区在线蜜桃| 国产欧美日韩三级| 在线视频中文字幕一区二区| 水野朝阳av一区二区三区| 欧美tickle裸体挠脚心vk| 高清在线不卡av| 亚洲人精品午夜| 日韩一区二区在线免费观看| 国产宾馆实践打屁股91| 亚洲精品日日夜夜| 日韩精品一区二区三区在线播放 | 色婷婷综合中文久久一本| 亚洲综合偷拍欧美一区色| 欧美精品国产精品| 成人小视频在线观看| 亚洲韩国精品一区| 久久综合久色欧美综合狠狠| 色婷婷亚洲综合| 狠狠色丁香婷婷综合| 亚洲乱码国产乱码精品精98午夜| 欧美蜜桃一区二区三区| 国产成人在线色| 亚洲风情在线资源站| 国产欧美一区二区精品性色超碰| 91国产免费观看| 国产精品66部| 日韩主播视频在线| 一区二区中文字幕在线| 日韩女同互慰一区二区| 色婷婷综合中文久久一本| 国产在线精品不卡| 日韩精品电影一区亚洲| 国产精品情趣视频| 精品国产乱码久久久久久蜜臀| 在线观看一区二区精品视频| 国产成人小视频| 久久国产尿小便嘘嘘尿| 一区二区三区日韩欧美精品| 精品国产区一区| 欧美片网站yy| 色老汉一区二区三区| 成人av免费在线| 精品一区二区免费在线观看| 亚洲成人第一页| 亚洲黄色录像片| 国产精品美女久久久久久久久| 精品久久久久久久久久久久久久久久久 | 欧美日韩久久一区二区| 成人午夜av电影| 精品一区二区三区在线视频| 亚洲国产精品精华液网站| 亚洲欧洲成人自拍| 欧美韩国日本不卡| 久久九九影视网| 26uuu久久天堂性欧美| 日韩午夜电影在线观看| 欧美一区二区三区小说| 91麻豆精品国产无毒不卡在线观看 | 中文字幕一区二区在线观看| 中文字幕欧美国产| 国产精品天干天干在线综合| 久久久久久久久一| 久久久久久久久99精品| 久久精品视频免费| 国产视频一区二区在线| 欧美国产精品中文字幕| 国产日韩欧美综合在线| 欧美国产乱子伦 | 午夜不卡av在线| 亚洲成人自拍网| 秋霞国产午夜精品免费视频| 日韩激情视频网站| 国内精品国产成人国产三级粉色| 精品一区二区日韩| 福利一区福利二区| 99久久婷婷国产综合精品电影 | 欧美一级搡bbbb搡bbbb| 欧美一区二区视频免费观看| 日韩一本二本av| 欧美本精品男人aⅴ天堂| 久久婷婷国产综合精品青草| 国产精品天美传媒沈樵| 亚洲精品乱码久久久久久| 亚洲电影你懂得| 国产在线一区观看| 不卡av在线网| 欧美色精品在线视频| 日韩精品一区二区三区视频播放 | 欧美电影免费观看完整版| 久久综合av免费| 亚洲免费在线播放| 三级不卡在线观看| 国产福利一区在线| 欧美色国产精品| 久久影院午夜论| 亚洲久草在线视频| 丝袜美腿亚洲综合| 成人av一区二区三区| 欧美日韩综合在线| 久久久久国产精品厨房| 一区二区在线观看视频在线观看| 日本最新不卡在线| 成人免费视频caoporn| 欧美精品日韩一本| 国产欧美一区二区在线| 亚洲综合视频网| 国产一区二区美女| 欧美日韩一区在线| 国产日韩欧美综合一区| 午夜精品视频在线观看| 成人性色生活片免费看爆迷你毛片| 欧美视频一区二区三区在线观看| 久久久久成人黄色影片| 午夜精品影院在线观看| av成人老司机| 久久蜜桃一区二区| 午夜视黄欧洲亚洲| 91麻豆6部合集magnet| 2023国产一二三区日本精品2022| 亚洲国产毛片aaaaa无费看| 国产91精品一区二区麻豆网站| 欧美一级生活片| 亚洲国产va精品久久久不卡综合| 国产福利一区在线| 精品国产乱码久久| 蜜桃视频在线观看一区| 欧美日韩在线观看一区二区| 中文av字幕一区| 国产精品综合在线视频| 欧美一级片在线观看| 一区二区三区国产豹纹内裤在线| 国产超碰在线一区| 久久久不卡网国产精品一区| 久久成人免费电影| 日韩一卡二卡三卡国产欧美| 亚洲成av人片在www色猫咪| 色悠悠亚洲一区二区| 亚洲国产精品精华液2区45| 激情欧美一区二区三区在线观看| 欧美一区二区三区在| 免费成人结看片| 在线播放欧美女士性生活| 婷婷久久综合九色国产成人| 欧美在线视频全部完| 午夜视频一区二区| 欧美精品一卡两卡| 免费一级片91| 日韩精品一区二区三区蜜臀|