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

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

?? p_weapon.c

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

#include "g_local.h"
#include "m_player.h"


static qboolean	is_quad;
static byte		is_silenced;


void weapon_grenade_fire (edict_t *ent, qboolean held);


static void P_ProjectSource (gclient_t *client, vec3_t point, vec3_t distance, vec3_t forward, vec3_t right, vec3_t result)
{
	vec3_t	_distance;

	VectorCopy (distance, _distance);
	if (client->pers.hand == LEFT_HANDED)
		_distance[1] *= -1;
	else if (client->pers.hand == CENTER_HANDED)
		_distance[1] = 0;
	G_ProjectSource (point, _distance, forward, right, result);
}


/*
===============
PlayerNoise

Each player can have two noise objects associated with it:
a personal noise (jumping, pain, weapon firing), and a weapon
target noise (bullet wall impacts)

Monsters that don't directly see the player can move
to a noise in hopes of seeing the player from there.
===============
*/
void PlayerNoise(edict_t *who, vec3_t where, int type)
{
	edict_t		*noise;

	if (type == PNOISE_WEAPON)
	{
		if (who->client->silencer_shots)
		{
			who->client->silencer_shots--;
			return;
		}
	}

	if (deathmatch->value)
		return;

	if (who->flags & FL_NOTARGET)
		return;


	if (!who->mynoise)
	{
		noise = G_Spawn();
		noise->classname = "player_noise";
		VectorSet (noise->mins, -8, -8, -8);
		VectorSet (noise->maxs, 8, 8, 8);
		noise->owner = who;
		noise->svflags = SVF_NOCLIENT;
		who->mynoise = noise;

		noise = G_Spawn();
		noise->classname = "player_noise";
		VectorSet (noise->mins, -8, -8, -8);
		VectorSet (noise->maxs, 8, 8, 8);
		noise->owner = who;
		noise->svflags = SVF_NOCLIENT;
		who->mynoise2 = noise;
	}

	if (type == PNOISE_SELF || type == PNOISE_WEAPON)
	{
		noise = who->mynoise;
		level.sound_entity = noise;
		level.sound_entity_framenum = level.framenum;
	}
	else // type == PNOISE_IMPACT
	{
		noise = who->mynoise2;
		level.sound2_entity = noise;
		level.sound2_entity_framenum = level.framenum;
	}

	VectorCopy (where, noise->s.origin);
	VectorSubtract (where, noise->maxs, noise->absmin);
	VectorAdd (where, noise->maxs, noise->absmax);
	noise->teleport_time = level.time;
	gi.linkentity (noise);
}


qboolean Pickup_Weapon (edict_t *ent, edict_t *other)
{
	int			index;
	gitem_t		*ammo;

	index = ITEM_INDEX(ent->item);

	if ( ( ((int)(dmflags->value) & DF_WEAPONS_STAY) || coop->value) 
		&& other->client->pers.inventory[index])
	{
		if (!(ent->spawnflags & (DROPPED_ITEM | DROPPED_PLAYER_ITEM) ) )
			return false;	// leave the weapon for others to pickup
	}

	other->client->pers.inventory[index]++;

	if (!(ent->spawnflags & DROPPED_ITEM) )
	{
		// give them some ammo with it
		ammo = FindItem (ent->item->ammo);
		if ( (int)dmflags->value & DF_INFINITE_AMMO )
			Add_Ammo (other, ammo, 1000);
		else
			Add_Ammo (other, ammo, ammo->quantity);

		if (! (ent->spawnflags & DROPPED_PLAYER_ITEM) )
		{
			if (deathmatch->value)
			{
				if ((int)(dmflags->value) & DF_WEAPONS_STAY)
					ent->flags |= FL_RESPAWN;
				else
					SetRespawn (ent, 30);
			}
			if (coop->value)
				ent->flags |= FL_RESPAWN;
		}
	}

	if (other->client->pers.weapon != ent->item && 
		(other->client->pers.inventory[index] == 1) &&
		( !deathmatch->value || other->client->pers.weapon == FindItem("blaster") ) )
		other->client->newweapon = ent->item;

	return true;
}


/*
===============
ChangeWeapon

The old weapon has been dropped all the way, so make the new one
current
===============
*/
void ChangeWeapon (edict_t *ent)
{
	int i;

	if (ent->client->grenade_time)
	{
		ent->client->grenade_time = level.time;
		ent->client->weapon_sound = 0;
		weapon_grenade_fire (ent, false);
		ent->client->grenade_time = 0;
	}

	ent->client->pers.lastweapon = ent->client->pers.weapon;
	ent->client->pers.weapon = ent->client->newweapon;
	ent->client->newweapon = NULL;
	ent->client->machinegun_shots = 0;

	// set visible model
	if (ent->s.modelindex == 255) {
		if (ent->client->pers.weapon)
			i = ((ent->client->pers.weapon->weapmodel & 0xff) << 8);
		else
			i = 0;
		ent->s.skinnum = (ent - g_edicts - 1) | i;
	}

	if (ent->client->pers.weapon && ent->client->pers.weapon->ammo)
		ent->client->ammo_index = ITEM_INDEX(FindItem(ent->client->pers.weapon->ammo));
	else
		ent->client->ammo_index = 0;

	if (!ent->client->pers.weapon)
	{	// dead
		ent->client->ps.gunindex = 0;
		return;
	}

	ent->client->weaponstate = WEAPON_ACTIVATING;
	ent->client->ps.gunframe = 0;
	ent->client->ps.gunindex = gi.modelindex(ent->client->pers.weapon->view_model);

	ent->client->anim_priority = ANIM_PAIN;
	if(ent->client->ps.pmove.pm_flags & PMF_DUCKED)
	{
			ent->s.frame = FRAME_crpain1;
			ent->client->anim_end = FRAME_crpain4;
	}
	else
	{
			ent->s.frame = FRAME_pain301;
			ent->client->anim_end = FRAME_pain304;
			
	}
}

/*
=================
NoAmmoWeaponChange
=================
*/
void NoAmmoWeaponChange (edict_t *ent)
{
	if ( ent->client->pers.inventory[ITEM_INDEX(FindItem("slugs"))]
		&&  ent->client->pers.inventory[ITEM_INDEX(FindItem("railgun"))] )
	{
		ent->client->newweapon = FindItem ("railgun");
		return;
	}
	if ( ent->client->pers.inventory[ITEM_INDEX(FindItem("cells"))]
		&&  ent->client->pers.inventory[ITEM_INDEX(FindItem("hyperblaster"))] )
	{
		ent->client->newweapon = FindItem ("hyperblaster");
		return;
	}
	if ( ent->client->pers.inventory[ITEM_INDEX(FindItem("bullets"))]
		&&  ent->client->pers.inventory[ITEM_INDEX(FindItem("chaingun"))] )
	{
		ent->client->newweapon = FindItem ("chaingun");
		return;
	}
	if ( ent->client->pers.inventory[ITEM_INDEX(FindItem("bullets"))]
		&&  ent->client->pers.inventory[ITEM_INDEX(FindItem("machinegun"))] )
	{
		ent->client->newweapon = FindItem ("machinegun");
		return;
	}
	if ( ent->client->pers.inventory[ITEM_INDEX(FindItem("shells"))] > 1
		&&  ent->client->pers.inventory[ITEM_INDEX(FindItem("super shotgun"))] )
	{
		ent->client->newweapon = FindItem ("super shotgun");
		return;
	}
	if ( ent->client->pers.inventory[ITEM_INDEX(FindItem("shells"))]
		&&  ent->client->pers.inventory[ITEM_INDEX(FindItem("shotgun"))] )
	{
		ent->client->newweapon = FindItem ("shotgun");
		return;
	}
	ent->client->newweapon = FindItem ("blaster");
}

/*
=================
Think_Weapon

Called by ClientBeginServerFrame and ClientThink
=================
*/
void Think_Weapon (edict_t *ent)
{
	// if just died, put the weapon away
	if (ent->health < 1)
	{
		ent->client->newweapon = NULL;
		ChangeWeapon (ent);
	}

	// call active weapon think routine
	if (ent->client->pers.weapon && ent->client->pers.weapon->weaponthink)
	{
		is_quad = (ent->client->quad_framenum > level.framenum);
		if (ent->client->silencer_shots)
			is_silenced = MZ_SILENCED;
		else
			is_silenced = 0;
		ent->client->pers.weapon->weaponthink (ent);
	}
}


/*
================
Use_Weapon

Make the weapon ready if there is ammo
================
*/
void Use_Weapon (edict_t *ent, gitem_t *item)
{
	int			ammo_index;
	gitem_t		*ammo_item;

	// see if we're already using it
	if (item == ent->client->pers.weapon)
		return;

	if (item->ammo && !g_select_empty->value && !(item->flags & IT_AMMO))
	{
		ammo_item = FindItem(item->ammo);
		ammo_index = ITEM_INDEX(ammo_item);

		if (!ent->client->pers.inventory[ammo_index])
		{
			gi.cprintf (ent, PRINT_HIGH, "No %s for %s.\n", ammo_item->pickup_name, item->pickup_name);
			return;
		}

		if (ent->client->pers.inventory[ammo_index] < item->quantity)
		{
			gi.cprintf (ent, PRINT_HIGH, "Not enough %s for %s.\n", ammo_item->pickup_name, item->pickup_name);
			return;
		}
	}

	// change to this weapon when down
	ent->client->newweapon = item;
}



/*
================
Drop_Weapon
================
*/
void Drop_Weapon (edict_t *ent, gitem_t *item)
{
	int		index;

	if ((int)(dmflags->value) & DF_WEAPONS_STAY)
		return;

	index = ITEM_INDEX(item);
	// see if we're already using it
	if ( ((item == ent->client->pers.weapon) || (item == ent->client->newweapon))&& (ent->client->pers.inventory[index] == 1) )
	{
		gi.cprintf (ent, PRINT_HIGH, "Can't drop current weapon\n");
		return;
	}

	Drop_Item (ent, item);
	ent->client->pers.inventory[index]--;
}


/*
================
Weapon_Generic

A generic function to handle the basics of weapon thinking
================
*/
#define FRAME_FIRE_FIRST		(FRAME_ACTIVATE_LAST + 1)
#define FRAME_IDLE_FIRST		(FRAME_FIRE_LAST + 1)
#define FRAME_DEACTIVATE_FIRST	(FRAME_IDLE_LAST + 1)

void Weapon_Generic (edict_t *ent, int FRAME_ACTIVATE_LAST, int FRAME_FIRE_LAST, int FRAME_IDLE_LAST, int FRAME_DEACTIVATE_LAST, int *pause_frames, int *fire_frames, void (*fire)(edict_t *ent))
{
	int		n;

	if(ent->deadflag || ent->s.modelindex != 255) // VWep animations screw up corpses
	{
		return;
	}

	if (ent->client->weaponstate == WEAPON_DROPPING)
	{
		if (ent->client->ps.gunframe == FRAME_DEACTIVATE_LAST)
		{
			ChangeWeapon (ent);
			return;
		}
		else if ((FRAME_DEACTIVATE_LAST - ent->client->ps.gunframe) == 4)
		{
			ent->client->anim_priority = ANIM_REVERSE;
			if(ent->client->ps.pmove.pm_flags & PMF_DUCKED)
			{
				ent->s.frame = FRAME_crpain4+1;
				ent->client->anim_end = FRAME_crpain1;
			}
			else
			{
				ent->s.frame = FRAME_pain304+1;
				ent->client->anim_end = FRAME_pain301;
				
			}
		}

		ent->client->ps.gunframe++;
		return;
	}

	if (ent->client->weaponstate == WEAPON_ACTIVATING)
	{
		if (ent->client->ps.gunframe == FRAME_ACTIVATE_LAST)
		{
			ent->client->weaponstate = WEAPON_READY;
			ent->client->ps.gunframe = FRAME_IDLE_FIRST;
			return;
		}

		ent->client->ps.gunframe++;
		return;
	}

	if ((ent->client->newweapon) && (ent->client->weaponstate != WEAPON_FIRING))
	{
		ent->client->weaponstate = WEAPON_DROPPING;
		ent->client->ps.gunframe = FRAME_DEACTIVATE_FIRST;

		if ((FRAME_DEACTIVATE_LAST - FRAME_DEACTIVATE_FIRST) < 4)
		{
			ent->client->anim_priority = ANIM_REVERSE;
			if(ent->client->ps.pmove.pm_flags & PMF_DUCKED)
			{
				ent->s.frame = FRAME_crpain4+1;
				ent->client->anim_end = FRAME_crpain1;
			}
			else
			{
				ent->s.frame = FRAME_pain304+1;
				ent->client->anim_end = FRAME_pain301;
				
			}
		}
		return;
	}

	if (ent->client->weaponstate == WEAPON_READY)
	{
		if ( ((ent->client->latched_buttons|ent->client->buttons) & BUTTON_ATTACK) )
		{
			ent->client->latched_buttons &= ~BUTTON_ATTACK;
			if ((!ent->client->ammo_index) || 
				( ent->client->pers.inventory[ent->client->ammo_index] >= ent->client->pers.weapon->quantity))
			{
				ent->client->ps.gunframe = FRAME_FIRE_FIRST;
				ent->client->weaponstate = WEAPON_FIRING;

				// start the animation
				ent->client->anim_priority = ANIM_ATTACK;
				if (ent->client->ps.pmove.pm_flags & PMF_DUCKED)
				{
					ent->s.frame = FRAME_crattak1-1;
					ent->client->anim_end = FRAME_crattak9;
				}
				else
				{
					ent->s.frame = FRAME_attack1-1;
					ent->client->anim_end = FRAME_attack8;
				}
			}
			else
			{
				if (level.time >= ent->pain_debounce_time)
				{

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩高清一区二区三区| 99re在线精品| 午夜精品福利视频网站| 亚洲图片另类小说| 亚洲女同女同女同女同女同69| 久久综合九色综合97_久久久| 欧美一区二区三区视频免费播放| 欧美色图片你懂的| 欧美挠脚心视频网站| 3751色影院一区二区三区| 在线成人午夜影院| 日韩欧美国产不卡| 日本一区二区久久| 一区二区三区中文免费| 图片区小说区区亚洲影院| 奇米影视7777精品一区二区| 精品在线观看视频| 99视频超级精品| 欧美日韩一区二区在线观看| 日韩欧美卡一卡二| 欧美国产成人在线| 午夜av电影一区| 国产一区二区三区免费观看| 99久久国产综合精品麻豆| 欧美综合天天夜夜久久| 精品少妇一区二区三区在线视频| 欧美激情在线一区二区三区| 一区二区三区加勒比av| 精品一区二区在线看| 91尤物视频在线观看| 日韩一二在线观看| 亚洲天堂久久久久久久| 久久91精品国产91久久小草| 成人av免费在线播放| 日韩亚洲欧美综合| 亚洲伦理在线精品| 国产伦精品一区二区三区视频青涩| 97精品久久久久中文字幕| 欧美一区二区三区系列电影| 成人欧美一区二区三区| 麻豆免费看一区二区三区| 99re成人精品视频| 精品人在线二区三区| 亚洲成人先锋电影| 成人的网站免费观看| 欧美大片在线观看| 亚洲一区二区在线视频| 丁香亚洲综合激情啪啪综合| 91精品免费在线观看| 亚洲人成网站在线| 国产·精品毛片| 日韩免费一区二区| 午夜视频在线观看一区二区三区| 99久久国产综合精品女不卡| 精品av久久707| 麻豆国产欧美日韩综合精品二区| 欧美视频一区二区在线观看| 国产精品免费网站在线观看| 国产在线精品免费| 日韩精品综合一本久道在线视频| 亚洲午夜在线电影| 色呦呦国产精品| 日韩一区在线免费观看| 成a人片亚洲日本久久| 国产视频视频一区| 国产精品白丝av| 精品福利二区三区| 激情成人综合网| 亚洲精品一区在线观看| 久久国产生活片100| 日韩免费视频一区| 九一九一国产精品| 久久久国产一区二区三区四区小说 | 精品剧情在线观看| 久久99最新地址| 欧美精品一区二区三区四区| 日日摸夜夜添夜夜添亚洲女人| 欧美日韩三级在线| 蜜桃视频一区二区三区| 欧美二区乱c少妇| 久久国产尿小便嘘嘘尿| 久久免费看少妇高潮| 国产精品影视天天线| 欧美国产一区二区| 99国产欧美久久久精品| 亚洲欧美日韩国产综合在线| 一本色道a无线码一区v| 亚洲成人免费在线观看| 日韩欧美自拍偷拍| 国产成人在线视频网址| 亚洲欧美日韩在线| 精品视频1区2区3区| 蜜臀av性久久久久蜜臀aⅴ| 久久综合色播五月| 91网站在线播放| 免费视频最近日韩| 国产精品视频九色porn| 91在线精品一区二区| 三级亚洲高清视频| 久久免费精品国产久精品久久久久| 丁香另类激情小说| 午夜久久久久久久久| 26uuu色噜噜精品一区| 91丨porny丨首页| 日韩电影一二三区| 亚洲国产精品黑人久久久| 欧美三级视频在线观看| 国产综合久久久久久久久久久久| 中文字幕一区二区三区不卡在线| 6080午夜不卡| www.亚洲激情.com| 久久99国产精品麻豆| 亚洲男人天堂av网| 久久婷婷国产综合国色天香| 日本高清不卡一区| 国产99一区视频免费| 亚洲成a人v欧美综合天堂下载 | caoporn国产一区二区| 亚洲综合精品自拍| 久久久精品国产99久久精品芒果 | 免费日本视频一区| 亚洲摸摸操操av| 国产丝袜欧美中文另类| 欧美精品一卡两卡| 色综合久久综合网97色综合 | 一级精品视频在线观看宜春院 | 国产一区不卡精品| 三级久久三级久久久| 国产欧美日韩不卡| 欧美精品一区二区不卡 | 久久国产尿小便嘘嘘尿| 亚洲午夜精品在线| 亚洲啪啪综合av一区二区三区| 精品入口麻豆88视频| 日韩一区二区精品在线观看| 在线观看视频欧美| 色哟哟在线观看一区二区三区| 国产精品69久久久久水密桃| 久久精品国产免费| 久久国产精品99久久久久久老狼| 午夜久久久影院| 三级亚洲高清视频| 日韩成人av影视| 首页国产欧美日韩丝袜| 无吗不卡中文字幕| 婷婷成人综合网| 亚洲.国产.中文慕字在线| 亚洲综合色视频| 亚洲 欧美综合在线网络| 亚洲国产综合色| 日韩高清一级片| 午夜视频在线观看一区二区三区| 亚洲第一二三四区| 日韩中文字幕不卡| 久久超碰97人人做人人爱| 久久精品国产99国产精品| 激情都市一区二区| 国产成人av一区二区| eeuss鲁一区二区三区| 一本大道av伊人久久综合| 欧美日韩三级视频| 91精品国产乱码| 久久久激情视频| 亚洲天堂免费在线观看视频| 一区二区三区日韩精品视频| 亚洲一本大道在线| 蜜臀av在线播放一区二区三区| 国产一区二区美女诱惑| 国产成人精品影院| 欧美伊人久久久久久久久影院| 69久久夜色精品国产69蝌蚪网 | 成人开心网精品视频| 97se亚洲国产综合自在线观| 色婷婷激情综合| 欧美一区二区三区色| 国产欧美日韩久久| 亚洲一二三四区| 韩国一区二区在线观看| 99在线精品观看| 日韩视频123| 专区另类欧美日韩| 美女一区二区久久| 一本到三区不卡视频| 欧美成人a在线| 亚洲激情欧美激情| 国产麻豆精品theporn| 欧美亚洲国产一区二区三区 | 欧美亚洲国产bt| 国产午夜亚洲精品不卡| 亚欧色一区w666天堂| 成人黄色在线视频| 欧美一卡2卡3卡4卡| 国产精品不卡视频| 久久www免费人成看片高清| 一本到不卡精品视频在线观看| 日韩欧美国产一区在线观看| 亚洲欧美偷拍三级| 粉嫩13p一区二区三区| 欧美一级欧美一级在线播放| 亚洲欧洲国产日本综合|