📄 gamebase.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 30.11.2003 by RST.// $Id: GameBase.java,v 1.13 2006/01/21 21:53:31 salomo Exp $/** Father of all GameObjects. */package jake2.game;import java.util.StringTokenizer;import jake2.*;import jake2.client.*;import jake2.qcommon.Com;import jake2.server.*;import jake2.util.*;public class GameBase { public static cplane_t dummyplane = new cplane_t(); public static game_locals_t game = new game_locals_t(); public static level_locals_t level = new level_locals_t(); public static game_import_t gi = new game_import_t(); public static spawn_temp_t st = new spawn_temp_t(); public static int sm_meat_index; public static int snd_fry; public static int meansOfDeath; public static int num_edicts; public static edict_t g_edicts[] = new edict_t[Defines.MAX_EDICTS]; static { for (int n = 0; n < Defines.MAX_EDICTS; n++) g_edicts[n] = new edict_t(n); } public static cvar_t deathmatch = new cvar_t(); public static cvar_t coop = new cvar_t(); public static cvar_t dmflags = new cvar_t(); public static cvar_t skill; // = new cvar_t(); public static cvar_t fraglimit = new cvar_t(); public static cvar_t timelimit = new cvar_t(); public static cvar_t password = new cvar_t(); public static cvar_t spectator_password = new cvar_t(); public static cvar_t needpass = new cvar_t(); public static cvar_t maxclients = new cvar_t(); public static cvar_t maxspectators = new cvar_t(); public static cvar_t maxentities = new cvar_t(); public static cvar_t g_select_empty = new cvar_t(); public static cvar_t filterban = new cvar_t(); public static cvar_t sv_maxvelocity = new cvar_t(); public static cvar_t sv_gravity = new cvar_t(); public static cvar_t sv_rollspeed = new cvar_t(); public static cvar_t sv_rollangle = new cvar_t(); public static cvar_t gun_x = new cvar_t(); public static cvar_t gun_y = new cvar_t(); public static cvar_t gun_z = new cvar_t(); public static cvar_t run_pitch = new cvar_t(); public static cvar_t run_roll = new cvar_t(); public static cvar_t bob_up = new cvar_t(); public static cvar_t bob_pitch = new cvar_t(); public static cvar_t bob_roll = new cvar_t(); public static cvar_t sv_cheats = new cvar_t(); public static cvar_t flood_msgs = new cvar_t(); public static cvar_t flood_persecond = new cvar_t(); public static cvar_t flood_waitdelay = new cvar_t(); public static cvar_t sv_maplist = new cvar_t(); public final static float STOP_EPSILON = 0.1f; /** * Slide off of the impacting object returns the blocked flags (1 = floor, 2 = * step / wall). */ public static int ClipVelocity(float[] in, float[] normal, float[] out, float overbounce) { float backoff; float change; int i, blocked; blocked = 0; if (normal[2] > 0) blocked |= 1; // floor if (normal[2] == 0.0f) blocked |= 2; // step backoff = Math3D.DotProduct(in, normal) * overbounce; for (i = 0; i < 3; i++) { change = normal[i] * backoff; out[i] = in[i] - change; if (out[i] > -STOP_EPSILON && out[i] < STOP_EPSILON) out[i] = 0; } return blocked; } /** * Searches all active entities for the next one that holds the matching * string at fieldofs (use the FOFS() macro) in the structure. * * Searches beginning at the edict after from, or the beginning if null null * will be returned if the end of the list is reached. * */ public static EdictIterator G_Find(EdictIterator from, EdictFindFilter eff, String s) { if (from == null) from = new EdictIterator(0); else from.i++; for (; from.i < num_edicts; from.i++) { from.o = g_edicts[from.i]; if (from.o.classname == null) { Com.Printf("edict with classname = null" + from.o.index); } if (!from.o.inuse) continue; if (eff.matches(from.o, s)) return from; } return null; } // comfort version (rst) public static edict_t G_FindEdict(EdictIterator from, EdictFindFilter eff, String s) { EdictIterator ei = G_Find(from, eff, s); if (ei == null) return null; else return ei.o; } /** * Returns entities that have origins within a spherical area. */ public static EdictIterator findradius(EdictIterator from, float[] org, float rad) { float[] eorg = { 0, 0, 0 }; int j; if (from == null) from = new EdictIterator(0); else from.i++; for (; from.i < num_edicts; from.i++) { from.o = g_edicts[from.i]; if (!from.o.inuse) continue; if (from.o.solid == Defines.SOLID_NOT) continue; for (j = 0; j < 3; j++) eorg[j] = org[j] - (from.o.s.origin[j] + (from.o.mins[j] + from.o.maxs[j]) * 0.5f); if (Math3D.VectorLength(eorg) > rad) continue; return from; } return null; } /** * Searches all active entities for the next one that holds the matching * string at fieldofs (use the FOFS() macro) in the structure. * * Searches beginning at the edict after from, or the beginning if null null * will be returned if the end of the list is reached. */ public static int MAXCHOICES = 8; public static edict_t G_PickTarget(String targetname) { int num_choices = 0; edict_t choice[] = new edict_t[MAXCHOICES]; if (targetname == null) { gi.dprintf("G_PickTarget called with null targetname\n"); return null; } EdictIterator es = null; while ((es = G_Find(es, findByTarget, targetname)) != null) { choice[num_choices++] = es.o; if (num_choices == MAXCHOICES) break; } if (num_choices == 0) { gi.dprintf("G_PickTarget: target " + targetname + " not found\n"); return null; } return choice[Lib.rand() % num_choices]; } public static float[] VEC_UP = { 0, -1, 0 }; public static float[] MOVEDIR_UP = { 0, 0, 1 }; public static float[] VEC_DOWN = { 0, -2, 0 }; public static float[] MOVEDIR_DOWN = { 0, 0, -1 }; public static void G_SetMovedir(float[] angles, float[] movedir) { if (Math3D.VectorEquals(angles, VEC_UP)) { Math3D.VectorCopy(MOVEDIR_UP, movedir); } else if (Math3D.VectorEquals(angles, VEC_DOWN)) { Math3D.VectorCopy(MOVEDIR_DOWN, movedir); } else { Math3D.AngleVectors(angles, movedir, null, null); } Math3D.VectorClear(angles); } public static String G_CopyString(String in) { return new String(in); } /** * G_TouchTriggers */ static edict_t touch[] = new edict_t[Defines.MAX_EDICTS]; public static void G_TouchTriggers(edict_t ent) { int i, num; edict_t hit; // dead things don't activate triggers! if ((ent.client != null || (ent.svflags & Defines.SVF_MONSTER) != 0) && (ent.health <= 0)) return; num = gi.BoxEdicts(ent.absmin, ent.absmax, touch, Defines.MAX_EDICTS, Defines.AREA_TRIGGERS); // be careful, it is possible to have an entity in this // list removed before we get to it (killtriggered) for (i = 0; i < num; i++) { hit = touch[i]; if (!hit.inuse) continue; if (hit.touch == null) continue; hit.touch.touch(hit, ent, dummyplane, null); } } public static pushed_t pushed[] = new pushed_t[Defines.MAX_EDICTS]; static { for (int n = 0; n < Defines.MAX_EDICTS; n++) pushed[n] = new pushed_t(); } public static int pushed_p;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -