From a75ee866f7280eadb6d7b92125f78d2cc33ad9f2 Mon Sep 17 00:00:00 2001 From: div0 Date: Fri, 23 Jan 2009 06:33:47 +0000 Subject: [PATCH] make random teleport dest work git-svn-id: svn://svn.icculus.org/nexuiz/trunk@5636 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/server/miscfunctions.qc | 4 ++ data/qcsrc/server/monsters/ai.qc | 2 +- data/qcsrc/server/monsters/defs.qc | 4 +- data/qcsrc/server/monsters/m_monsters.qc | 3 +- data/qcsrc/server/t_teleporters.qc | 67 ++++++++++++++++++++---- data/qcsrc/server/w_campingrifle.qc | 2 +- 6 files changed, 66 insertions(+), 16 deletions(-) diff --git a/data/qcsrc/server/miscfunctions.qc b/data/qcsrc/server/miscfunctions.qc index aa981e636..341f293cf 100644 --- a/data/qcsrc/server/miscfunctions.qc +++ b/data/qcsrc/server/miscfunctions.qc @@ -1415,6 +1415,10 @@ void precache() } } + precache_model("models/elaser.mdl"); + precache_model("models/laser.mdl"); + precache_model("models/ebomb.mdl"); + #if 0 // Disabled this code because it simply does not work (e.g. ignores bgmvolume, overlaps with "cd loop" controlled tracks). diff --git a/data/qcsrc/server/monsters/ai.qc b/data/qcsrc/server/monsters/ai.qc index 2a615f140..23330cdfc 100644 --- a/data/qcsrc/server/monsters/ai.qc +++ b/data/qcsrc/server/monsters/ai.qc @@ -188,10 +188,10 @@ void() monster_spawnwanderpath = void() monster_checkbossflag = { +#if 0 local float healthboost; local float r; -#if 0 // monsterbosses cvar or spawnflag 64 causes a monster to be a miniboss if ((self.spawnflags & 64) || (random() * 100 < cvar("monsterbosspercent"))) { diff --git a/data/qcsrc/server/monsters/defs.qc b/data/qcsrc/server/monsters/defs.qc index 777e114d3..3be0212af 100644 --- a/data/qcsrc/server/monsters/defs.qc +++ b/data/qcsrc/server/monsters/defs.qc @@ -6,8 +6,8 @@ .void() th_run; .float() th_missile; // LordHavoc: changed from void() to float(), returns true if attacking .void() th_melee; -.void(entity attacker, float damage, float damgtype, string dethtype) th_pain; -.void() th_die; +//.void(entity attacker, float damage, float damgtype, string dethtype) th_pain; // TODO Nexuiz uses event_damage +//.void() th_die; // TODO never called directly by Nexuiz .entity oldenemy; // mad at this player before taking damage entity newmis; // launch_spike sets this after spawning it diff --git a/data/qcsrc/server/monsters/m_monsters.qc b/data/qcsrc/server/monsters/m_monsters.qc index 67203f516..fa255699f 100644 --- a/data/qcsrc/server/monsters/m_monsters.qc +++ b/data/qcsrc/server/monsters/m_monsters.qc @@ -159,11 +159,12 @@ void() monsterinwall = // puts a spikey ball where the error is... e = spawn(); setorigin(e, self.origin); - setmodel (e, "progs/star.mdl"); + setmodel (e, "models/ebomb.mdl"); e.movetype = MOVETYPE_NONE; e.solid = SOLID_NOT; e.think = SUB_Null; e.nextthink = -1; + e.scale = 16; }; //============================================================================ diff --git a/data/qcsrc/server/t_teleporters.qc b/data/qcsrc/server/t_teleporters.qc index 62c0126a9..28affc842 100644 --- a/data/qcsrc/server/t_teleporters.qc +++ b/data/qcsrc/server/t_teleporters.qc @@ -105,7 +105,7 @@ void TeleportPlayer(entity teleporter, entity player, vector to, vector to_angle void Teleport_Touch (void) { - entity oldself; + entity oldself, e; if (other.health < 1) return; @@ -119,13 +119,35 @@ void Teleport_Touch (void) if(other.classname == "player") RemoveGrapplingHook(other); - TeleportPlayer(self, other, self.enemy.origin + '0 0 1' * (1 - other.mins_z - 24), self.enemy.mangle, v_forward * vlen(other.velocity), '0 0 0', '0 0 0'); + if(self.enemy) + { + e = self.enemy; + } + else + { + RandomSelection_Init(); + for(e = world; (e = find(e, targetname, self.target)); ) + { + if(e.cnt) + RandomSelection_Add(e, 0, e.cnt, 0); + else + RandomSelection_Add(e, 0, 1, 0); + } + e = RandomSelection_chosen_ent; + } + + if(!e) + { + sprint(other, "Teleport destination vanished. Sorry... please complain to the mapper.\n"); + } + + TeleportPlayer(self, other, e.origin + '0 0 1' * (1 - other.mins_z - 24), e.mangle, v_forward * vlen(other.velocity), '0 0 0', '0 0 0'); - if(self.enemy.target) + if(e.target) { oldself = self; activator = other; - self = self.enemy; + self = e; SUB_UseTargets(); self = oldself; } @@ -133,6 +155,8 @@ void Teleport_Touch (void) void spawnfunc_info_teleport_destination (void) { + self.classname = "info_teleport_destination"; + self.mangle = self.angles; self.angles = '0 0 0'; @@ -143,7 +167,7 @@ void spawnfunc_info_teleport_destination (void) { } else - objerror ("Teleport destination without a targetname"); + objerror ("^3Teleport destination without a targetname"); } void spawnfunc_misc_teleporter_dest (void) @@ -158,18 +182,39 @@ void spawnfunc_target_teleporter (void) void teleport_findtarget (void) { - // now enable touch - self.touch = Teleport_Touch; + entity e; + float n; + + n = 0; + for(e = world; (e = find(e, targetname, self.target)); ) + { + ++n; + if(e.movetype == MOVETYPE_NONE) + waypoint_spawnforteleporter(self, e.origin, 0); + if(e.classname != "info_teleport_destination") + print("^3MAPPER ERROR: teleporter does target an invalid teleport destination entity. Angles will not work.\n"); + } - self.enemy = find (world, targetname, self.target); - if (!self.enemy) + if(n == 0) { + // no dest! objerror ("Teleporter with nonexistant target"); return; } + else if(n == 1) + { + // exactly one dest - bots love that + self.enemy = find(e, targetname, self.target); + self.dest = self.enemy.origin; + } + else + { + // have to use random selection every single time + self.enemy = world; + } - self.dest = self.enemy.origin; - waypoint_spawnforteleporter(self, self.dest, 0); + // now enable touch + self.touch = Teleport_Touch; } void spawnfunc_trigger_teleport (void) diff --git a/data/qcsrc/server/w_campingrifle.qc b/data/qcsrc/server/w_campingrifle.qc index a14c5a0f5..a9dd26ddb 100644 --- a/data/qcsrc/server/w_campingrifle.qc +++ b/data/qcsrc/server/w_campingrifle.qc @@ -51,7 +51,7 @@ void W_CampingRifle_FireBullet(float pSpread, float pDamage, float pHeadshotAdde if not(self.items & IT_UNLIMITED_WEAPON_AMMO) self.ammo_nails -= pAmmo; - W_SetupShot (self, '32 8 -8', FALSE, 2, "weapons/campingrifle_fire.wav"); + W_SetupShot (self, '32 8 -4', FALSE, 2, "weapons/campingrifle_fire.wav"); pointparticles(particleeffectnum("shotgun_muzzleflash"), w_shotorg, w_shotdir * 2000, 1); if(self.BUTTON_ZOOM) // if zoomed, shoot from the eye -- 2.39.2