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

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? p_weapon.c

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


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)

static void Weapon_Generic2 (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 || instantweap->value)
		{
			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;
		if (instantweap->value) {
			ChangeWeapon(ent);
			return;
		} else
			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)
				{
					gi.sound(ent, CHAN_VOICE, gi.soundindex("weapons/noammo.wav"), 1, ATTN_NORM, 0);
					ent->pain_debounce_time = level.time + 1;
				}
				NoAmmoWeaponChange (ent);
			}
		}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91精品国产综合久久福利| 91在线视频观看| 最新国产成人在线观看| 51精品秘密在线观看| 99久久婷婷国产| 国内精品自线一区二区三区视频| 亚洲精品欧美专区| 国产精品久久久久久久久搜平片 | 久久久久88色偷偷免费| 欧美伊人久久久久久午夜久久久久| 国产一区二区视频在线| 香蕉成人伊视频在线观看| 亚洲欧美日韩精品久久久久| 国产日韩v精品一区二区| 日韩一区二区麻豆国产| 欧美精品tushy高清| 欧美伦理电影网| 欧美区视频在线观看| 欧美日韩电影在线| 欧美三级电影网站| 91精品国产91热久久久做人人| 91美女精品福利| 亚洲一区在线看| 中文字幕日本不卡| 亚洲免费av在线| 国产亚洲精品福利| 久久综合色之久久综合| 欧美mv日韩mv| 色婷婷精品久久二区二区蜜臂av | 国产精品福利av| 成人高清视频免费观看| 国产精品久久久久久久久晋中 | 国产精品久久久久一区| zzijzzij亚洲日本少妇熟睡| 国产91色综合久久免费分享| 亚洲自拍与偷拍| www国产成人| 久久久久久亚洲综合影院红桃| 欧美日韩成人在线| 久久只精品国产| 一区二区三区欧美日| 国产精品高潮呻吟| 亚洲精品欧美激情| 一区二区三区日韩精品| 日本欧美一区二区| 久久激情综合网| 色综合天天性综合| 日韩精品在线一区二区| 亚洲女性喷水在线观看一区| 日韩精品五月天| 国内久久婷婷综合| 欧美亚洲禁片免费| 中文字幕成人av| 精彩视频一区二区| 欧美精品丝袜中出| 亚洲女同ⅹxx女同tv| 国产成a人亚洲| 精品成人一区二区三区| 亚洲国产另类精品专区| 99久久精品免费看国产| 精品免费视频.| 六月丁香婷婷色狠狠久久| 欧美精品日韩精品| 亚洲精品国产无套在线观| 高清不卡一二三区| 欧美一a一片一级一片| 国产精品人人做人人爽人人添| 成人亚洲一区二区一| 亚洲视频狠狠干| 欧美日韩成人一区二区| 国产成人精品一区二区三区四区| 国产欧美日韩不卡| 欧美日韩视频在线一区二区| 日韩专区中文字幕一区二区| 成人禁用看黄a在线| 精品国产三级a在线观看| 久久疯狂做爰流白浆xx| 久久婷婷久久一区二区三区| 黄网站免费久久| 国产精品少妇自拍| 91小视频免费看| 亚洲大片精品永久免费| 欧美日韩精品一区二区| 蜜臀久久99精品久久久久宅男| 91精品国模一区二区三区| 久久国产日韩欧美精品| 中文字幕精品一区二区精品绿巨人| 成人av影院在线| 亚洲3atv精品一区二区三区| 日韩网站在线看片你懂的| 国产成人综合亚洲网站| 亚洲乱码一区二区三区在线观看| 欧美人xxxx| 成人av电影在线| 久久精品国产99国产| 亚洲欧美日韩在线| 欧美一级欧美三级在线观看| kk眼镜猥琐国模调教系列一区二区| 一区二区三区不卡视频| 国产欧美日韩激情| 日韩欧美久久一区| 色狠狠色噜噜噜综合网| 黄色资源网久久资源365| 亚洲自拍偷拍av| 中文字幕在线观看不卡| 日韩欧美国产麻豆| 欧美午夜电影一区| 91在线视频观看| 国产成人精品亚洲日本在线桃色| 亚洲大片在线观看| 亚洲资源中文字幕| 亚洲蜜臀av乱码久久精品蜜桃| 久久在线免费观看| 日韩欧美高清一区| 欧美一二三四区在线| 91亚洲大成网污www| 99久久综合国产精品| 国产乱码一区二区三区| 国产综合久久久久久久久久久久| 亚洲va欧美va人人爽午夜| 亚洲视频免费在线观看| 亚洲视频一二三| 亚洲摸摸操操av| 亚洲图片欧美视频| 亚洲午夜久久久久久久久久久 | 成人综合在线观看| 国产+成+人+亚洲欧洲自线| 懂色av中文字幕一区二区三区| 国产一区二区三区四| 国产成人在线免费观看| 成人高清视频免费观看| 91视频www| 69av一区二区三区| 日韩一级精品视频在线观看| 精品国内二区三区| 久久久久国产成人精品亚洲午夜 | 17c精品麻豆一区二区免费| 亚洲免费在线观看| 久久精品国产99久久6| 成人听书哪个软件好| 欧美体内she精高潮| 久久综合九色综合97_久久久| 国产精品久久久久天堂| 亚洲国产精品一区二区www在线| 日韩av中文在线观看| 成人国产在线观看| 91麻豆精品国产综合久久久久久 | 91精品国产乱| 中文字幕一区二区三区视频| 日韩经典一区二区| eeuss鲁片一区二区三区 | 欧美国产国产综合| 婷婷激情综合网| 粉嫩高潮美女一区二区三区| 欧美日韩一区中文字幕| 国产精品美女久久久久高潮| 美女性感视频久久| 欧洲另类一二三四区| 国产精品毛片a∨一区二区三区| 男女男精品视频网| 欧美三级视频在线观看| 1000部国产精品成人观看| 国产精品一区二区三区乱码| 欧美精品高清视频| 亚洲第一会所有码转帖| jlzzjlzz亚洲日本少妇| 日本一区二区视频在线观看| 精品一区二区三区香蕉蜜桃 | 欧美日韩在线直播| 亚洲精品一卡二卡| 色综合久久综合| 亚洲精品日韩综合观看成人91| 国产成人免费9x9x人网站视频| 久久色.com| 国产成人综合在线播放| 中文字幕av一区 二区| 成人精品国产福利| 亚洲另类春色校园小说| 色香色香欲天天天影视综合网| 亚洲裸体xxx| 欧美亚洲国产一卡| 日本不卡123| 日韩欧美三级在线| 国产91精品久久久久久久网曝门| 久久精品日韩一区二区三区| 国产精品18久久久久久久久| 国产精品免费视频网站| 94-欧美-setu| 日韩在线一二三区| 久久精品亚洲精品国产欧美kt∨ | 丁香亚洲综合激情啪啪综合| 中文字幕精品一区二区三区精品| 99国产欧美另类久久久精品| 亚洲另类在线制服丝袜| 日韩美女视频一区二区在线观看| 国产乱码精品1区2区3区| 亚洲欧洲成人自拍| 欧美久久免费观看| 成人91在线观看| 久久精品国产亚洲高清剧情介绍|