diff --git a/src/gs-entbase/server/basemonster.cpp b/src/gs-entbase/server/basemonster.cpp index 56e84081..ccc43ed8 100644 --- a/src/gs-entbase/server/basemonster.cpp +++ b/src/gs-entbase/server/basemonster.cpp @@ -156,7 +156,7 @@ void CBaseMonster::FreeState(void) /* trigger when required */ if (m_strRouteEnded) { - CBaseTrigger trigger; + CBaseTrigger trigger = 0; trigger = (CBaseTrigger)find(trigger, CBaseTrigger::m_strTargetName, m_strRouteEnded); if (!trigger) { print(sprintf("^1CBaseMonster::FreeState^7: %s doesn't exist. Won't trigger\n", m_strRouteEnded)); diff --git a/src/gs-entbase/server/monster_generic.cpp b/src/gs-entbase/server/monster_generic.cpp index 96eb40d0..df595e8d 100644 --- a/src/gs-entbase/server/monster_generic.cpp +++ b/src/gs-entbase/server/monster_generic.cpp @@ -14,7 +14,7 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/*QUAKED monster_generic (1 0 0) (-8 -8 -8) (8 8 8) +/*QUAKED monster_generic (1 0 0) (-8 -8 -8) (8 8 8) x x MGF_NONSOLID "targetname" Name "angles" Sets the pitch, yaw and roll angles of the model. "model" Model file that will be displayed by the entity. @@ -22,9 +22,12 @@ Decorative, does nothing yet. */ +#define MGF_NONSOLID 4 + class monster_generic:CBaseNPC { void() monster_generic; + virtual void() Respawn; }; @@ -32,15 +35,25 @@ void monster_generic::Respawn(void) { CBaseNPC::Respawn(); - takedamage = DAMAGE_NO; - iBleeds = FALSE; - solid = SOLID_NOT; + + if (spawnflags & MGF_NONSOLID) { + takedamage = DAMAGE_NO; + iBleeds = FALSE; + solid = SOLID_NOT; + } } void monster_generic::monster_generic(void) { - base_mins = VEC_HULL_MIN; - base_maxs = VEC_HULL_MAX; + /* hackhackhackhackack */ + if (model == "models/player.mdl" || model == "models/holo.mdl") { + base_mins = VEC_HULL_MIN; + base_maxs = VEC_HULL_MAX; + } else { + base_mins = [-16,-16,0]; + base_maxs = [16,16,72]; + } + CBaseNPC::CBaseNPC(); } diff --git a/src/gs-entbase/server/trigger_changelevel.cpp b/src/gs-entbase/server/trigger_changelevel.cpp index 768fed1c..a07a5606 100644 --- a/src/gs-entbase/server/trigger_changelevel.cpp +++ b/src/gs-entbase/server/trigger_changelevel.cpp @@ -33,6 +33,11 @@ It'll have to be triggered by another entity. vector g_landmarkpos; +class info_landmark:CBaseTrigger +{ + +}; + enumflags { LC_NOINTERMISSION, @@ -68,12 +73,18 @@ int trigger_changelevel::IsInside(entity ePlayer, entity eVolume) void trigger_changelevel::Change(void) { if (m_strLandmark) { - entity landmark = find(world, CBaseTrigger::m_strTargetName, m_strLandmark); - g_landmarkpos = m_activator.origin - landmark.origin; -#ifdef GS_DEVELOPER - print( sprintf( "%s::Change: Change to `%s` using landmark '%s'\n", - this.classname, m_strMap, m_strLandmark ) ); -#endif + info_landmark landmark; + + /* a trigger_transition may share the same targetname, thus we do this */ + for (entity e = world; (e = find(e, ::classname, "info_landmark"));) { + info_landmark lm = (info_landmark)e; + /* found it */ + if (lm.m_strTargetName == m_strLandmark) { + print(sprintf("^2trigger_changelevel::Change^7: Found landmark for %s\n", m_strLandmark)); + landmark = lm; + g_landmarkpos = m_activator.origin - landmark.origin; + } + } changelevel(m_strMap, m_strLandmark); } else { #ifdef GS_DEVELOPER @@ -90,14 +101,9 @@ void trigger_changelevel::Trigger(void) return; } - /*eVolume = find(world, ::targetname, m_strLandmark); - if (eVolume && eVolume.classname == "CTriggerVolume") { - if (IsInside(other, eVolume) == FALSE) { - return; - } - }*/ + /* eActivator == player who triggered the damn thing */ + m_activator = eActivator; - m_activator = other; if (m_flChangeDelay) { #ifdef GS_DEVELOPER print( sprintf( "%s::Trigger: Delayed change to `%s` in %d sec/s\n", @@ -144,19 +150,23 @@ void trigger_changelevel::trigger_changelevel(void) vector Landmark_GetSpot(void) { - entity landmark = find(world, CBaseTrigger::m_strTargetName, startspot); + info_landmark landmark; - if (!landmark) { - print(sprintf("^1ERROR^7: Landmark_GetSpot: Cannot find startspot '%s'!\n",startspot)); - /* return something useful? */ - landmark = find(world, ::classname, "info_player_start"); - return landmark.origin; + /* a trigger_transition may share the same targetname, thus we do this */ + for (entity e = world; (e = find(e, ::classname, "info_landmark"));) { + info_landmark lm = (info_landmark)e; + /* found it */ + if (lm.m_strTargetName == startspot) { + print(sprintf("^2Landmark_GetSpot^7: Found landmark for %s\n", startspot)); + landmark = lm; + return landmark.origin + g_landmarkpos; + } } - return landmark.origin + g_landmarkpos; + /* return something useful at least */ + if (!landmark) { + entity ips = find(world, ::classname, "info_player_start"); + print(sprintf("^1ERROR^7: Landmark_GetSpot: Cannot find startspot '%s'!\n",startspot)); + return ips.origin; + } } - -class info_landmark:CBaseTrigger -{ - -}; diff --git a/src/server/valve/monster_barnacle.cpp b/src/server/valve/monster_barnacle.cpp index a5432a87..d7bb44f9 100644 --- a/src/server/valve/monster_barnacle.cpp +++ b/src/server/valve/monster_barnacle.cpp @@ -47,7 +47,6 @@ string bcl_snddie[] = { class monster_barnacle:CBaseMonster { - void() monster_barnacle; virtual void(int) Death; diff --git a/src/server/valve/monster_gargantua.cpp b/src/server/valve/monster_gargantua.cpp index 778977a6..146b7fca 100644 --- a/src/server/valve/monster_gargantua.cpp +++ b/src/server/valve/monster_gargantua.cpp @@ -92,7 +92,6 @@ string garg_sndpain[] = { "garg/gar_pain3.wav" }; - class monster_gargantua:CBaseMonster { float m_flIdleTime; @@ -189,7 +188,7 @@ void monster_gargantua::monster_gargantua(void) for (int i = 0; i < garg_sndstep.length; i++) { precache_sound(garg_sndstep[i]); } - + netname = "Gargantua"; model = "models/garg.mdl"; base_health = Skill_GetValue("gargantua_health");