📄 playerweapon.java
字号:
/* * 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. * */// Created on 16.11.2003 by RST.// $Id: PlayerWeapon.java,v 1.2 2005/11/20 22:18:33 salomo Exp $package jake2.game;import jake2.Defines;import jake2.Globals;import jake2.game.monsters.M_Player;import jake2.qcommon.Com;import jake2.util.Lib;import jake2.util.Math3D;public class PlayerWeapon { public static EntThinkAdapter Weapon_Grenade = new EntThinkAdapter() { public String getID() { return "Weapon_Grenade"; } public boolean think(edict_t ent) { if ((ent.client.newweapon != null) && (ent.client.weaponstate == Defines.WEAPON_READY)) { ChangeWeapon(ent); return true; } if (ent.client.weaponstate == Defines.WEAPON_ACTIVATING) { ent.client.weaponstate = Defines.WEAPON_READY; ent.client.ps.gunframe = 16; return true; } if (ent.client.weaponstate == Defines.WEAPON_READY) { if (((ent.client.latched_buttons | ent.client.buttons) & Defines.BUTTON_ATTACK) != 0) { ent.client.latched_buttons &= ~Defines.BUTTON_ATTACK; if (0 != ent.client.pers.inventory[ent.client.ammo_index]) { ent.client.ps.gunframe = 1; ent.client.weaponstate = Defines.WEAPON_FIRING; ent.client.grenade_time = 0; } else { if (GameBase.level.time >= ent.pain_debounce_time) { GameBase.gi.sound(ent, Defines.CHAN_VOICE, GameBase.gi .soundindex("weapons/noammo.wav"), 1, Defines.ATTN_NORM, 0); ent.pain_debounce_time = GameBase.level.time + 1; } NoAmmoWeaponChange(ent); } return true; } if ((ent.client.ps.gunframe == 29) || (ent.client.ps.gunframe == 34) || (ent.client.ps.gunframe == 39) || (ent.client.ps.gunframe == 48)) { if ((Lib.rand() & 15) != 0) return true; } if (++ent.client.ps.gunframe > 48) ent.client.ps.gunframe = 16; return true; } if (ent.client.weaponstate == Defines.WEAPON_FIRING) { if (ent.client.ps.gunframe == 5) GameBase.gi.sound(ent, Defines.CHAN_WEAPON, GameBase.gi .soundindex("weapons/hgrena1b.wav"), 1, Defines.ATTN_NORM, 0); if (ent.client.ps.gunframe == 11) { if (0 == ent.client.grenade_time) { ent.client.grenade_time = GameBase.level.time + Defines.GRENADE_TIMER + 0.2f; ent.client.weapon_sound = GameBase.gi .soundindex("weapons/hgrenc1b.wav"); } // they waited too long, detonate it in their hand if (!ent.client.grenade_blew_up && GameBase.level.time >= ent.client.grenade_time) { ent.client.weapon_sound = 0; weapon_grenade_fire(ent, true); ent.client.grenade_blew_up = true; } if ((ent.client.buttons & Defines.BUTTON_ATTACK) != 0) return true; if (ent.client.grenade_blew_up) { if (GameBase.level.time >= ent.client.grenade_time) { ent.client.ps.gunframe = 15; ent.client.grenade_blew_up = false; } else { return true; } } } if (ent.client.ps.gunframe == 12) { ent.client.weapon_sound = 0; weapon_grenade_fire(ent, false); } if ((ent.client.ps.gunframe == 15) && (GameBase.level.time < ent.client.grenade_time)) return true; ent.client.ps.gunframe++; if (ent.client.ps.gunframe == 16) { ent.client.grenade_time = 0; ent.client.weaponstate = Defines.WEAPON_READY; } } return true; } }; /* * ====================================================================== * * GRENADE LAUNCHER * * ====================================================================== */ public static EntThinkAdapter weapon_grenadelauncher_fire = new EntThinkAdapter() { public String getID() { return "weapon_grenadelauncher_fire"; } public boolean think(edict_t ent) { float[] offset = { 0, 0, 0 }; float[] forward = { 0, 0, 0 }, right = { 0, 0, 0 }; float[] start = { 0, 0, 0 }; int damage = 120; float radius; radius = damage + 40; if (is_quad) damage *= 4; Math3D.VectorSet(offset, 8, 8, ent.viewheight - 8); Math3D.AngleVectors(ent.client.v_angle, forward, right, null); P_ProjectSource(ent.client, ent.s.origin, offset, forward, right, start); Math3D.VectorScale(forward, -2, ent.client.kick_origin); ent.client.kick_angles[0] = -1; GameWeapon.fire_grenade(ent, start, forward, damage, 600, 2.5f, radius); GameBase.gi.WriteByte(Defines.svc_muzzleflash); GameBase.gi.WriteShort(ent.index); GameBase.gi.WriteByte(Defines.MZ_GRENADE | is_silenced); GameBase.gi.multicast(ent.s.origin, Defines.MULTICAST_PVS); ent.client.ps.gunframe++; PlayerWeapon.PlayerNoise(ent, start, Defines.PNOISE_WEAPON); if (0 == ((int) GameBase.dmflags.value & Defines.DF_INFINITE_AMMO)) ent.client.pers.inventory[ent.client.ammo_index]--; return true; } }; public static EntThinkAdapter Weapon_GrenadeLauncher = new EntThinkAdapter() { public String getID() { return "Weapon_GrenadeLauncher"; } public boolean think(edict_t ent) { int pause_frames[] = { 34, 51, 59, 0 }; int fire_frames[] = { 6, 0 }; Weapon_Generic(ent, 5, 16, 59, 64, pause_frames, fire_frames, weapon_grenadelauncher_fire); return true; } }; /* * ====================================================================== * * ROCKET * * ====================================================================== */ public static EntThinkAdapter Weapon_RocketLauncher_Fire = new EntThinkAdapter() { public String getID() { return "Weapon_RocketLauncher_Fire"; } public boolean think(edict_t ent) { float[] offset = { 0, 0, 0 }, start = { 0, 0, 0 }; float[] forward = { 0, 0, 0 }, right = { 0, 0, 0 }; int damage; float damage_radius; int radius_damage; damage = 100 + (int) (Lib.random() * 20.0); radius_damage = 120; damage_radius = 120; if (is_quad) { damage *= 4; radius_damage *= 4; } Math3D.AngleVectors(ent.client.v_angle, forward, right, null); Math3D.VectorScale(forward, -2, ent.client.kick_origin); ent.client.kick_angles[0] = -1; Math3D.VectorSet(offset, 8, 8, ent.viewheight - 8); P_ProjectSource(ent.client, ent.s.origin, offset, forward, right, start); GameWeapon.fire_rocket(ent, start, forward, damage, 650, damage_radius, radius_damage); // send muzzle flash GameBase.gi.WriteByte(Defines.svc_muzzleflash); GameBase.gi.WriteShort(ent.index); GameBase.gi.WriteByte(Defines.MZ_ROCKET | is_silenced); GameBase.gi.multicast(ent.s.origin, Defines.MULTICAST_PVS); ent.client.ps.gunframe++; PlayerWeapon.PlayerNoise(ent, start, Defines.PNOISE_WEAPON); if (0 == ((int) GameBase.dmflags.value & Defines.DF_INFINITE_AMMO)) ent.client.pers.inventory[ent.client.ammo_index]--; return true; } }; public static EntThinkAdapter Weapon_RocketLauncher = new EntThinkAdapter() { public String getID() { return "Weapon_RocketLauncher"; } public boolean think(edict_t ent) { int pause_frames[] = { 25, 33, 42, 50, 0 }; int fire_frames[] = { 5, 0 }; Weapon_Generic(ent, 4, 12, 50, 54, pause_frames, fire_frames, Weapon_RocketLauncher_Fire); return true; } }; public static EntThinkAdapter Weapon_Blaster_Fire = new EntThinkAdapter() { public String getID() { return "Weapon_Blaster_Fire"; } public boolean think(edict_t ent) { int damage; if (GameBase.deathmatch.value != 0) damage = 15; else damage = 10; Blaster_Fire(ent, Globals.vec3_origin, damage, false, Defines.EF_BLASTER); ent.client.ps.gunframe++; return true; } }; public static EntThinkAdapter Weapon_Blaster = new EntThinkAdapter() { public String getID() { return "Weapon_Blaster"; } public boolean think(edict_t ent) { int pause_frames[] = { 19, 32, 0 }; int fire_frames[] = { 5, 0 }; Weapon_Generic(ent, 4, 8, 52, 55, pause_frames, fire_frames, Weapon_Blaster_Fire); return true; } }; public static EntThinkAdapter Weapon_HyperBlaster_Fire = new EntThinkAdapter() { public String getID() { return "Weapon_HyperBlaster_Fire"; } public boolean think(edict_t ent) { float rotation; float[] offset = { 0, 0, 0 }; int effect; int damage; ent.client.weapon_sound = GameBase.gi .soundindex("weapons/hyprbl1a.wav"); if (0 == (ent.client.buttons & Defines.BUTTON_ATTACK)) { ent.client.ps.gunframe++; } else { if (0 == ent.client.pers.inventory[ent.client.ammo_index]) { if (GameBase.level.time >= ent.pain_debounce_time) { GameBase.gi.sound(ent, Defines.CHAN_VOICE, GameBase.gi .soundindex("weapons/noammo.wav"), 1, Defines.ATTN_NORM, 0); ent.pain_debounce_time = GameBase.level.time + 1; } NoAmmoWeaponChange(ent); } else { rotation = (float) ((ent.client.ps.gunframe - 5) * 2 * Math.PI / 6); offset[0] = (float) (-4 * Math.sin(rotation)); offset[1] = 0f; offset[2] = (float) (4 * Math.cos(rotation)); if ((ent.client.ps.gunframe == 6) || (ent.client.ps.gunframe == 9)) effect = Defines.EF_HYPERBLASTER; else effect = 0; if (GameBase.deathmatch.value != 0) damage = 15; else damage = 20; Blaster_Fire(ent, offset, damage, true, effect); if (0 == ((int) GameBase.dmflags.value & Defines.DF_INFINITE_AMMO)) ent.client.pers.inventory[ent.client.ammo_index]--; ent.client.anim_priority = Defines.ANIM_ATTACK; if ((ent.client.ps.pmove.pm_flags & pmove_t.PMF_DUCKED) != 0) { ent.s.frame = M_Player.FRAME_crattak1 - 1; ent.client.anim_end = M_Player.FRAME_crattak9; } else { ent.s.frame = M_Player.FRAME_attack1 - 1; ent.client.anim_end = M_Player.FRAME_attack8; } } ent.client.ps.gunframe++; if (ent.client.ps.gunframe == 12 && 0 != ent.client.pers.inventory[ent.client.ammo_index]) ent.client.ps.gunframe = 6; } if (ent.client.ps.gunframe == 12) { GameBase.gi.sound(ent, Defines.CHAN_AUTO, GameBase.gi .soundindex("weapons/hyprbd1a.wav"), 1, Defines.ATTN_NORM, 0); ent.client.weapon_sound = 0; } return true; } }; public static EntThinkAdapter Weapon_HyperBlaster = new EntThinkAdapter() { public String getID() { return "Weapon_HyperBlaster"; } public boolean think(edict_t ent) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -