From 4a51da34cefd60b26e0bc154bf3f7976e4d191d7 Mon Sep 17 00:00:00 2001
From: Tim Angus <tim@ngus.net>
Date: Wed, 3 Sep 2003 00:18:51 +0000
Subject: * Added SURF_NOALIENBUILD and SURF_NOHUMANBUILD so that building can
 be   prevented via shader

---
 src/cgame/cg_servercmds.c | 10 ++++++++++
 src/game/bg_pmove.c       |  5 ++++-
 src/game/bg_public.h      | 37 ++++++++++++++++++++++---------------
 src/game/g_buildable.c    | 35 ++++++++++++++++++++++++++---------
 src/game/g_local.h        |  1 +
 src/game/surfaceflags.h   |  4 ++++
 6 files changed, 67 insertions(+), 25 deletions(-)

(limited to 'src')

diff --git a/src/cgame/cg_servercmds.c b/src/cgame/cg_servercmds.c
index f6cef10f..5ad80f98 100644
--- a/src/cgame/cg_servercmds.c
+++ b/src/cgame/cg_servercmds.c
@@ -565,6 +565,12 @@ void CG_Menu( int menu )
       trap_SendConsoleCommand( "menu tremulous_human_dialog\n" );
       break;
       
+    case MN_H_NORMAL:
+      trap_Cvar_Set( "ui_dialog", "Cannot build on this surface. The surface is too steep or unsuitable "
+                                  "to build on. Please choose another site for this structure." );
+      trap_SendConsoleCommand( "menu tremulous_alien_dialog\n" );
+      break;
+      
     case MN_H_REACTOR:
       trap_Cvar_Set( "ui_dialog", "There can only be one reactor. Destroy the existing one if you "
                                   "wish to move it." );
@@ -613,6 +619,10 @@ void CG_Menu( int menu )
       trap_SendConsoleCommand( "menu tremulous_human_dialog\n" );
       break;
       
+    
+    //===============================
+
+      
     case MN_A_NOROOM:
       trap_Cvar_Set( "ui_dialog", "There is no room to build here. Move until the structure turns "
                                   "translucent green indicating a valid build location." );
diff --git a/src/game/bg_pmove.c b/src/game/bg_pmove.c
index 74ab3be2..2fd4a81a 100644
--- a/src/game/bg_pmove.c
+++ b/src/game/bg_pmove.c
@@ -1255,7 +1255,10 @@ static void PM_CheckLadder( void )
   
   //test if class can use ladders
   if( !BG_ClassHasAbility( pm->ps->stats[ STAT_PCLASS ], SCA_CANUSELADDERS ) )
+  {
     pml.ladder = qfalse;
+    return;
+  }
   
   VectorCopy( pml.forward, forward );
   forward[ 2 ] = 0.0f;
@@ -2887,7 +2890,7 @@ void PM_UpdateViewAngles( playerState_t *ps, const usercmd_t *cmd )
   if( ps->pm_type == PM_INTERMISSION || ps->pm_type == PM_SPINTERMISSION )
     return;   // no view changes at all
 
-  if( ps->pm_type != PM_SPECTATOR && ps->stats[STAT_HEALTH] <= 0 )
+  if( ps->pm_type != PM_SPECTATOR && ps->stats[ STAT_HEALTH ] <= 0 )
     return;   // no view changes at all
 
   // circularly clamp the angles with deltas
diff --git a/src/game/bg_public.h b/src/game/bg_public.h
index 748c5ba1..469f58de 100644
--- a/src/game/bg_public.h
+++ b/src/game/bg_public.h
@@ -549,37 +549,44 @@ typedef enum
 {
   MN_TEAM,
   
+  //alien stuff
   MN_A_CLASS,
   MN_A_BUILD,
   MN_A_INFEST,
-  MN_A_NOROOM,
-  MN_A_NOCREEP,
-  MN_A_NOOVMND,
-  MN_A_OVERMIND,
-  MN_A_NOASSERT,
-  MN_A_SPWNWARN,
-  MN_A_NORMAL,
   MN_A_HOVEL_OCCUPIED,
   MN_A_HOVEL_BLOCKED,
-  MN_A_HOVEL_EXIT,
   MN_A_OBANK,
   MN_A_NOFUNDS,
   MN_A_NOEROOM,
   
+  //alien build denial menus
+  MN_A_SPWNWARN,
+  MN_A_OVERMIND,
+  MN_A_NOASSERT,
+  MN_A_NOCREEP,
+  MN_A_NOOVMND,
+  MN_A_NOROOM,
+  MN_A_NORMAL,
+  MN_A_HOVEL_EXIT,
+  
+  //human stuff
   MN_H_SPAWN,
   MN_H_BUILD,
   MN_H_ARMOURY,
   MN_H_BANK,
-  MN_H_NOROOM,
-  MN_H_NOPOWER,
-  MN_H_REACTOR,
-  MN_H_REPEATER,
-  MN_H_RPLWARN,
-  MN_H_RPTWARN,
   MN_H_NOSLOTS,
   MN_H_NOFUNDS,
+  MN_H_ITEMHELD,
+  
+  //human build
+  MN_H_REPEATER,
+  MN_H_NOPOWER,
   MN_H_NODCC,
-  MN_H_ITEMHELD  
+  MN_H_REACTOR,
+  MN_H_NOROOM,
+  MN_H_NORMAL,
+  MN_H_RPLWARN,
+  MN_H_RPTWARN
 } dynMenu_t;
 
 // animations
diff --git a/src/game/g_buildable.c b/src/game/g_buildable.c
index b1152e3e..fab860a2 100644
--- a/src/game/g_buildable.c
+++ b/src/game/g_buildable.c
@@ -2033,14 +2033,6 @@ itemBuildError_t G_itemFits( gentity_t *ent, buildable_t buildable, int distance
   {
     //alien criteria
 
-    //check there is creep near by for building on
-    
-    if( BG_FindCreepTestForBuildable( buildable ) )
-    {
-      if( !isCreep( entity_origin ) )
-        reason = IBE_NOCREEP;
-    }
-    
     if( buildable == BA_A_HOVEL )
     {
       vec3_t    builderMins, builderMaxs;
@@ -2053,6 +2045,17 @@ itemBuildError_t G_itemFits( gentity_t *ent, buildable_t buildable, int distance
         reason = IBE_HOVELEXIT;
     }
     
+    //check there is creep near by for building on
+    if( BG_FindCreepTestForBuildable( buildable ) )
+    {
+      if( !isCreep( entity_origin ) )
+        reason = IBE_NOCREEP;
+    }
+    
+    //check permission to build here
+    if( tr1.surfaceFlags & SURF_NOALIENBUILD )
+      reason = IBE_PERMISSION;
+
     //look for a hivemind
     for ( i = 1, tempent = g_entities + i; i < level.num_entities; i++, tempent++ )
     {
@@ -2124,6 +2127,10 @@ itemBuildError_t G_itemFits( gentity_t *ent, buildable_t buildable, int distance
         reason = IBE_RPTWARN;
     }
       
+    //check permission to build here
+    if( tr1.surfaceFlags & SURF_NOHUMANBUILD )
+      reason = IBE_PERMISSION;
+
     //can we only build one of these?
     if( BG_FindUniqueTestForBuildable( buildable ) )
     {
@@ -2387,7 +2394,17 @@ qboolean G_ValidateBuild( gentity_t *ent, buildable_t buildable )
       return qfalse;
 
     case IBE_NORMAL:
-      G_TriggerMenu( ent->client->ps.clientNum, MN_A_NORMAL );
+      if( ent->client->ps.stats[ STAT_PTEAM ] == PTE_HUMANS )
+        G_TriggerMenu( ent->client->ps.clientNum, MN_H_NORMAL );
+      else
+        G_TriggerMenu( ent->client->ps.clientNum, MN_A_NORMAL );
+      return qfalse;
+
+    case IBE_PERMISSION:
+      if( ent->client->ps.stats[ STAT_PTEAM ] == PTE_HUMANS )
+        G_TriggerMenu( ent->client->ps.clientNum, MN_H_NORMAL );
+      else
+        G_TriggerMenu( ent->client->ps.clientNum, MN_A_NORMAL );
       return qfalse;
 
     case IBE_REACTOR:
diff --git a/src/game/g_local.h b/src/game/g_local.h
index 7075ea16..3976740e 100644
--- a/src/game/g_local.h
+++ b/src/game/g_local.h
@@ -554,6 +554,7 @@ typedef enum
   
   IBE_NORMAL,
   IBE_NOROOM,
+  IBE_PERMISSION,
 
   IBE_MAXERRORS
 } itemBuildError_t;
diff --git a/src/game/surfaceflags.h b/src/game/surfaceflags.h
index 2a31631e..a6d68dfa 100644
--- a/src/game/surfaceflags.h
+++ b/src/game/surfaceflags.h
@@ -72,3 +72,7 @@
 #define SURF_NODLIGHT           0x20000 // don't dlight even if solid (solid lava, skies)
 #define SURF_DUST               0x40000 // leave a dust trail when walking on this surface
 
+//TA: custominfoparms below
+#define SURF_NOALIENBUILD       0x80000 // disallow alien building
+#define SURF_NOHUMANBUILD       0x100000 // disallow alien building
+
-- 
cgit