]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'master' into mirceakitsune/physical_entities
authorMircea Kitsune <sonichedgehog_hyperblast00@yahoo.com>
Wed, 11 Jul 2012 19:24:05 +0000 (22:24 +0300)
committerMircea Kitsune <sonichedgehog_hyperblast00@yahoo.com>
Wed, 11 Jul 2012 19:24:05 +0000 (22:24 +0300)
Conflicts:
qcsrc/server/t_items.qc

1  2 
defaultXonotic.cfg
qcsrc/server/autocvars.qh
qcsrc/server/cl_weapons.qc
qcsrc/server/miscfunctions.qc
qcsrc/server/t_items.qc

diff --combined defaultXonotic.cfg
index 15b420d9dfe29f3c124906b201d29ced8eab9e1f,a8d6bcb9488c2d534a1ba5ed779f60bd0d1a3eb7..f6cc81004b9044d170115085dca7b783d11cf1d2
@@@ -812,6 -812,7 +812,7 @@@ set g_throughfloor_max_steps_other 10 "
  
  // effects
  r_glsl_vertextextureblend_usebothalphas 1 // allows to abuse texture blending as detail texture
+ mod_q3shader_force_terrain_alphaflag 1 // supposedly now required for r_glsl_vertextextureblend_usebothalphas to work
  r_glsl_postprocess 0 // but note, hud_postprocessing enables this
  r_picmipsprites 0 // Xonotic uses sprites that should never be picmipped (team mate, typing, waypoints)
  r_picmipworld 1
@@@ -1404,10 -1405,6 +1405,10 @@@ alias sethostname "set menu_use_default
  
  set sv_foginterval 1 "force enable fog in regular intervals"
  
 +set g_physical_items 0 "1 uses ODE physics for dropped weapons, 2 for all items, requires physics_ode to be enabled"
 +set g_physical_items_damageforcescale 3 "how affected physical weapons are by damage"
 +set g_physical_items_reset 1 "return map items to their original lotation after being picked up"
 +
  // Audio track names (for old-style "cd loop NUMBER" usage)
  set _cdtrack_first "1"
  alias _cdtrack_0 "g_cdtracks_remaplist \"$g_cdtracks_remaplist $1\""
@@@ -1649,6 -1646,9 +1650,9 @@@ seta cl_casings_maxcount 100 "maximum a
  seta cl_gibs_maxcount 100 "maximum amount of gibs (must be at least 1)"
  seta cl_vehicle_spiderbot_cross_alpha 0.6
  seta cl_vehicle_spiderbot_cross_size 1
+ seta cl_vehicles_hudscale 0.5 
+ seta cl_vehicles_hudalpha 0.75
+ seta cl_vehicles_hud_tactical 1
  
  //cl_gunalign calculator
  seta menu_cl_gunalign 3 "Gun alignment; 1 = center (if allowed by g_shootfromclient) or right, 2 = center (if allowed by g_shootfromclient) or left, 3 = right only, 4 = left only"
@@@ -1671,9 -1671,6 +1675,6 @@@ set g_triggerimpulse_directional_multip
  set g_triggerimpulse_radial_multiplier 1 "trigger_impulse radial field multiplier"
  set the_goggles "they do nothing" "but the googles, they do"
  
- set g_ghost_items 1 "enable ghosted items (when between 0 and 1, overrides the alpha value)"
- set g_ghost_items_color "-1 -1 -1" "color of ghosted items, 0 0 0 leaves the color unchanged"
  set sv_weaponstats_file "" "when set to a file name, per-weapon stats get written to that file"
  
  seta cl_noantilag 0 "turn this on if you believe antilag is bad"
@@@ -1960,3 -1957,11 +1961,11 @@@ alias menu_sync "menu_cmd sync
  
  set sv_join_notices ""
  set sv_join_notices_time 15
+ set cl_ghost_items 0.45 "enable ghosted items (when between 0 and 1, overrides the alpha value)"
+ set cl_ghost_items_color "-1 -1 -1" "color of ghosted items, 0 0 0 leaves the color unchanged"
+ set sv_simple_items 1 "allow or forbid client use of simple items"
+ set cl_simple_items 0 "enable simple items (if server allows)"
+ set cl_fullbright_items 0 "enable fullbright items (if server allows, controled by g_fullbrightitems)"
+ set cl_weapon_stay_color "2 0.5 0.5" "Color of picked up weapons when g_weapon_stay > 0"
+ set cl_weapon_stay_alpha 0.75 "Alpha of picked up weapons when g_weapon_stay > 0"
index 1e6f6e835436e089247903d9a68c7941ca173e52,c75a4387339f58f429cecf8b6d31acb2292652d6..cf01234284536a0d3e4a4a34de7e49050387f7c2
@@@ -809,7 -809,6 +809,6 @@@ float autocvar_g_freezetag_warmup
  float autocvar_g_full_getstatus_responses;
  float autocvar_g_fullbrightitems;
  float autocvar_g_fullbrightplayers;
- string autocvar_g_ghost_items_color;
  #define autocvar_g_grappling_hook cvar("g_grappling_hook")
  float autocvar_g_grappling_hook_tarzan;
  float autocvar_g_hitplots;
@@@ -928,6 -927,7 +927,7 @@@ float autocvar_g_playerclip_collisions
  string autocvar_g_playerstats_uri;
  float autocvar_g_powerups;
  float autocvar_g_projectiles_damage;
+ float autocvar_g_projectiles_keep_owner;
  float autocvar_g_projectiles_newton_style;
  float autocvar_g_projectiles_newton_style_2_maxfactor;
  float autocvar_g_projectiles_newton_style_2_minfactor;
@@@ -1223,6 -1223,3 +1223,6 @@@ float autocvar_g_sandbox_object_materia
  float autocvar_g_sandbox_object_material_velocity_factor;
  float autocvar_g_max_info_autoscreenshot;
  float autocvar_physics_ode;
 +float autocvar_g_physical_items;
 +float autocvar_g_physical_items_damageforcescale;
 +float autocvar_g_physical_items_reset;
index 10ae0f44e2875351400b59275d4f66865067dd6f,236c0923fdc330834469234bc9eb2285a1f6bb26..4df59a09afde775e7e73cca9fb0be6e248ad1205
@@@ -298,7 -298,6 +298,7 @@@ string W_ThrowNewWeapon(entity own, flo
                wep.savenextthink = wep.nextthink;
                wep.nextthink = min(wep.nextthink, time + 0.5);
                wep.pickup_anyway = TRUE; // these are ALWAYS pickable
 +
                return s;
        }
  }
@@@ -319,7 -318,9 +319,9 @@@ float W_IsWeaponThrowable(float w
                return 0;
        if (g_nexball && w == WEP_GRENADE_LAUNCHER)
                return 0;
+     if(w == 0)
+         return 0;
+       
        wa = W_AmmoItemCode(w);
        if(WEPSET_CONTAINS_AW(start_weapons, w))
        {
index 95f2cb533b49c758d2fe378ee79ddd5745ee862d,25b42821ed3621735722e23194374d4922396458..5cd0194354e43409cf6639e02aaf02fa3dfe0d86
@@@ -772,7 -772,6 +772,6 @@@ float warmup_start_ammo_fuel
  float warmup_start_health;
  float warmup_start_armorvalue;
  float g_weapon_stay;
- float g_ghost_items;
  
  entity get_weaponinfo(float w);
  
@@@ -1109,8 -1108,6 +1108,8 @@@ void readlevelcvars(void
                MUTATOR_ADD(mutator_dodging);
        if(cvar("g_spawn_near_teammate"))
                MUTATOR_ADD(mutator_spawn_near_teammate);
 +      if(cvar("g_physical_items"))
 +              MUTATOR_ADD(mutator_physical_items);
        if(!g_minstagib)
        {
                if(cvar("g_invincible_projectiles"))
      if(!g_weapon_stay)
          g_weapon_stay = cvar("g_weapon_stay");
  
-       g_ghost_items = cvar("g_ghost_items");
-       if(g_ghost_items >= 1)
-               g_ghost_items = 0.25; // default alpha value
        if not(inWarmupStage && !g_ca)
                game_starttime = cvar("g_start_delay");
  
diff --combined qcsrc/server/t_items.qc
index a08333e768e9f9767e91cf9e70361729613c74d3,2e7b9bfbaf11bdf64403edfe663838d465cd2b2b..500d8f60ccf2ce818bf048237c446e4b6771e983
+ #define ISF_LOCATION 2
+ #define ISF_MODEL    4
+ #define ISF_STATUS   8
+     #define ITS_STAYWEP   1
+     #define ITS_ANIMATE1  2
+     #define ITS_ANIMATE2  4
+     #define ITS_AVAILABLE 8
+     #define ITS_ALLOWFB   16
+     #define ITS_ALLOWSI   32
+     #define ITS_POWERUP   64
+ #define ISF_COLORMAP 16
+ #define ISF_DROP 32
+ .float ItemStatus;
+ #ifdef CSQC
+ var float  autocvar_cl_ghost_items = 1;
+ var vector autocvar_cl_ghost_items_color = '-1 -1 -1';
+ float  autocvar_cl_fullbright_items;
+ vector autocvar_cl_staywep_color;
+ float  autocvar_cl_staywep_alpha;
+ float  autocvar_cl_simple_items;
+ float  cl_simple_items;
+ float  cl_ghost_items_alpha;
+ .float  spawntime;
+ .float  gravity;
+ .vector colormod;
+ void ItemDraw()
+ {    
+     if(self.ItemStatus & ITS_ANIMATE1)
+     {
+         self.angles += '0 180 0' * frametime;
+         setorigin(self, '0 0 10' + self.oldorigin + '0 0 8' * sin(time * 2));        
+     }    
+     
+     if(self.ItemStatus & ITS_ANIMATE2)
+     {
+         self.angles += '0 -90 0' * frametime;
+         setorigin(self, '0 0 8' + self.oldorigin + '0 0 4' * sin(time * 3));        
+     }
+     
+     if(self.gravity)
+         Movetype_Physics_MatchServer(autocvar_cl_projectiles_sloppy);
+ }
+ void ItemDrawSimple()
+ {
+     if(self.gravity)
+         Movetype_Physics_MatchServer(autocvar_cl_projectiles_sloppy);    
+ }
+ float csqcitems_started; // remove this after a release or two
+ void csqcitems_start()
+ {
+     if(autocvar_cl_ghost_items == 1)
+         cl_ghost_items_alpha = 0.55;
+     else
+         cl_ghost_items_alpha = bound(0, autocvar_cl_ghost_items, 1);
+     
+     csqcitems_started = TRUE;
+ }
+ void ItemRead(float _IsNew)
+ {
+     if(!csqcitems_started)
+         csqcitems_start();
+     
+     float sf = ReadByte();
+     if(sf & ISF_LOCATION)
+     {
+         self.origin_x = ReadCoord();
+         self.origin_y = ReadCoord();
+         self.origin_z = ReadCoord();
+         setorigin(self, self.origin);
+         self.oldorigin = self.origin;
+     }
+     
+     if(sf & ISF_STATUS) // need to read/write status frist so model can handle simple, fb etc.
+     {
+         self.ItemStatus = ReadByte();    
+         
+         if(self.ItemStatus & ITS_AVAILABLE)
+         {
+             self.alpha = 1;
+             self.colormod = self.glowmod = '1 1 1';
+         }
+         else
+         {
+             if (cl_ghost_items_alpha)
+             {
+                 self.alpha = autocvar_cl_ghost_items;
+                 self.colormod = self.glowmod = autocvar_cl_ghost_items_color;
+             }
+             else
+                 self.alpha = -1;
+         }    
+         
+         if(autocvar_cl_fullbright_items)
+             if(self.ItemStatus & ITS_ALLOWFB)
+                 self.effects |= EF_FULLBRIGHT;
+             
+         if(self.ItemStatus & ITS_STAYWEP)
+         {
+             self.colormod = self.glowmod = autocvar_cl_staywep_color;
+             self.alpha = autocvar_cl_staywep_alpha;
+             
+         }
+         
+         if(self.ItemStatus & ITS_POWERUP)
+         {
+             if(self.ItemStatus & ITS_AVAILABLE)
+                 self.effects |= (EF_ADDITIVE | EF_FULLBRIGHT);
+             else
+                  self.effects &~= (EF_ADDITIVE | EF_FULLBRIGHT);
+         }
+     }
+     
+     if(sf & ISF_MODEL)
+     {
+         self.drawmask  = MASK_NORMAL;
+         self.movetype  = MOVETYPE_NOCLIP;
+         self.draw       = ItemDraw;
+         
+         if(self.mdl)
+             strunzone(self.mdl);
+         
+         self.mdl = "";
+         string _fn = ReadString();
+         
+         if(cl_simple_items && (self.ItemStatus & ITS_ALLOWSI))
+         {
+             string _fn2 = substring(_fn, 0 , strlen(_fn) -4);
+             self.draw = ItemDrawSimple;
+                     
+             if(fexists(strcat(_fn2, "_simple.md3")))
+                 self.mdl = strzone(strcat(_fn2, "_simple.md3"));
+             else if(fexists(strcat(_fn2, "_simple.dpm")))
+                 self.mdl = strzone(strcat(_fn2, "_simple.dpm"));
+             else if(fexists(strcat(_fn2, "_simple.iqm")))
+                 self.mdl = strzone(strcat(_fn2, "_simple.iqm"));
+             else if(fexists(strcat(_fn2, "_simple.obj")))
+                 self.mdl = strzone(strcat(_fn2, "_simple.obj"));
+             else
+             {
+                 self.draw = ItemDraw;
+                 dprint("Simple item requested for ", _fn, " but no model exsist for it\n");
+             }
+         }
+         
+         if(self.draw != ItemDrawSimple)        
+             self.mdl = strzone(_fn);                
+         
+         
+         if(self.mdl == "")
+             dprint("^1WARNING!^7 self.mdl is unset for item ", self.classname, " tell tZork aboute this!\n");
+         
+         precache_model(self.mdl);
+         setmodel(self, self.mdl);
+     }
+     
+     if(sf & ISF_COLORMAP)
+         self.colormap = ReadShort();
+     
+     if(sf & ISF_DROP)
+     {
+         self.gravity = 1;
+         self.move_movetype = MOVETYPE_TOSS;
+         self.move_velocity_x = ReadCoord();
+         self.move_velocity_y = ReadCoord();
+         self.move_velocity_z = ReadCoord();
+         self.velocity = self.move_velocity;
+         self.move_origin = self.oldorigin;
+         
+         if(!self.move_time)
+         {
+             self.move_time = time;
+             self.spawntime = time;
+         }
+         else
+             self.move_time = max(self.move_time, time);
+     }    
+ }
+ #endif
+ #ifdef SVQC
+ float autocvar_sv_simple_items;
+ float ItemSend(entity to, float sf)
+ {
+     if(self.gravity)
+         sf |= ISF_DROP;
+     else
+         sf &~= ISF_DROP;
+       
+       WriteByte(MSG_ENTITY, ENT_CLIENT_ITEM); 
+       WriteByte(MSG_ENTITY, sf);
+         
+       //WriteByte(MSG_ENTITY, self.cnt);
+     if(sf & ISF_LOCATION)
+     {
+         WriteCoord(MSG_ENTITY, self.origin_x);
+         WriteCoord(MSG_ENTITY, self.origin_y);
+         WriteCoord(MSG_ENTITY, self.origin_z);
+     }
+     if(sf & ISF_STATUS)
+         WriteByte(MSG_ENTITY, self.ItemStatus);
+     if(sf & ISF_MODEL)
+     {
+         
+         if(self.mdl == "")
+             dprint("^1WARNING!^7 self.mdl is unset for item ", self.classname, "exspect a crash just aboute now\n");
+         
+         WriteString(MSG_ENTITY, self.mdl);
+     }
+         
+         
+     if(sf & ISF_COLORMAP)
+         WriteShort(MSG_ENTITY, self.colormap);
+     if(sf & ISF_DROP)
+     {
+         WriteCoord(MSG_ENTITY, self.velocity_x);
+         WriteCoord(MSG_ENTITY, self.velocity_y);
+         WriteCoord(MSG_ENTITY, self.velocity_z);
+     }
+         
+     return TRUE;
+ }
  float have_pickup_item(void)
  {
        // minstagib: only allow filtered items
@@@ -78,7 -313,7 +313,7 @@@ string Item_CounterFieldName(float it
  
  .float max_armorvalue;
  .float pickup_anyway;
+ /*
  float Item_Customize()
  {
        if(self.spawnshieldtime)
                        return FALSE;
        }
  }
+ */
  
  void Item_Show (entity e, float mode)
- {
+ {    
        e.effects &~= EF_ADDITIVE | EF_STARDUST | EF_FULLBRIGHT | EF_NODEPTHTEST;
+       e.ItemStatus &~= ITS_STAYWEP;
        if (mode > 0)
        {
                // make the item look normal, and be touchable
                e.model = e.mdl;
                e.solid = SOLID_TRIGGER;
-               e.colormod = '0 0 0';
-               self.glowmod = self.colormod;
-               e.alpha = 0;
-               e.customizeentityforclient = func_null;
                e.spawnshieldtime = 1;
+               e.ItemStatus |= ITS_AVAILABLE;
        }
        else if (mode < 0)
        {
                // hide the item completely
                e.model = string_null;
                e.solid = SOLID_NOT;
-               e.colormod = '0 0 0';
-               self.glowmod = self.colormod;
-               e.alpha = 0;
-               e.customizeentityforclient = func_null;
                e.spawnshieldtime = 1;
+               e.ItemStatus &~= ITS_AVAILABLE;
        }
        else if((e.flags & FL_WEAPON) && !(e.flags & FL_NO_WEAPON_STAY) && g_weapon_stay)
        {
                // make the item translucent and not touchable
                e.model = e.mdl;
                e.solid = SOLID_TRIGGER; // can STILL be picked up!
-               e.colormod = '0 0 0';
-               self.glowmod = self.colormod;
                e.effects |= EF_STARDUST;
-               e.customizeentityforclient = Item_Customize;
                e.spawnshieldtime = 0; // field indicates whether picking it up may give you anything other than the weapon
-       }
-       else if(g_ghost_items)
-       {
-               // make the item translucent and not touchable
-               e.model = e.mdl;
-               e.solid = SOLID_NOT;
-               e.colormod = stov(autocvar_g_ghost_items_color);
-               e.glowmod = e.colormod;
-               e.alpha = g_ghost_items;
-               e.customizeentityforclient = func_null;
-               e.spawnshieldtime = 1;
+               e.ItemStatus |= (ITS_AVAILABLE | ITS_STAYWEP);
        }
        else
        {
-               // hide the item completely
-               e.model = string_null;
+               //setmodel(e, "null");
                e.solid = SOLID_NOT;
                e.colormod = '0 0 0';
                e.glowmod = e.colormod;
-               e.alpha = 0;
-               e.customizeentityforclient = func_null;
                e.spawnshieldtime = 1;
+               e.ItemStatus &~= ITS_AVAILABLE;
        }
-       if (e.items & (IT_STRENGTH | IT_INVINCIBLE))
-               e.effects |= EF_ADDITIVE | EF_FULLBRIGHT;
+       
+       if (e.items & IT_STRENGTH || e.items & IT_INVINCIBLE)
+           e.ItemStatus |= ITS_POWERUP;                
+       
        if (autocvar_g_nodepthtestitems)
                e.effects |= EF_NODEPTHTEST;
-       if (autocvar_g_fullbrightitems)
-               e.effects |= EF_FULLBRIGHT;
+               
+     
+     if (autocvar_g_fullbrightitems)
+               e.ItemStatus |= ITS_ALLOWFB;
+       
+       if (autocvar_sv_simple_items)
+         e.ItemStatus |= ITS_ALLOWSI;
  
        // relink entity (because solid may have changed)
        setorigin(e, e.origin);
+     e.SendFlags |= ISF_STATUS;
  }
  
  void Item_Respawn (void)
@@@ -555,6 -773,7 +773,7 @@@ void Item_Touch (void
                                }
                        }
                        e = RandomSelection_chosen_ent;
                }
                else
                        e = self;
@@@ -745,8 -964,16 +964,16 @@@ void StartItem (string itemmodel, strin
  
        if(self.model == "")
                self.model = itemmodel;
+       
+       if(self.model == "")
+     {
+         error(strcat("^1Tried to spawn ", itemname, " with no model!\n"));
+         return;
+     }
+         
        if(self.item_pickupsound == "")
                self.item_pickupsound = pickupsound;
+       
        if(!self.respawntime) // both need to be set
        {
                self.respawntime = defaultrespawntime;
  
        if(weaponid)
                WEPSET_COPY_EW(self, weaponid);
+       
        self.flags = FL_ITEM | itemflags;
  
        if(MUTATOR_CALLHOOK(FilterItem)) // error means we do not want the item
                        entity otheritem;
                        for(otheritem = findradius(self.origin, 3); otheritem; otheritem = otheritem.chain)
                        {
+                           // why not flags & fl_item?
                                if(otheritem.is_item)
                                {
                                        dprint("XXX Found duplicated item: ", itemname, vtos(self.origin));
        self.mdl = self.model;
        self.netname = itemname;
        self.touch = Item_Touch;
-       setmodel (self, self.mdl); // precision set below
-       self.effects |= EF_LOWPRECISION;
+       setmodel(self, "null"); // precision set below
+       //self.effects |= EF_LOWPRECISION; 
+       
        if((itemflags & FL_POWERUP) || self.health || self.armorvalue)
-               setsize (self, '-16 -16 0', '16 16 48');
+     {
+         self.pos1 = '-16 -16 0';
+         self.pos2 = '16 16 48';
+     }
        else
-               setsize (self, '-16 -16 0', '16 16 32');
+     {
+         self.pos1 = '-16 -16 0';
+         self.pos2 = '16 16 32';
+     }
+     setsize (self, self.pos1, self.pos2);
+     
+     if(itemflags & FL_POWERUP) 
+         self.ItemStatus |= ITS_ANIMATE1;
+       
+       if(self.armorvalue || self.health)
+         self.ItemStatus |= ITS_ANIMATE2;
+       
        if(itemflags & FL_WEAPON)
-               self.modelflags |= MF_ROTATE;
-       if (self.classname != "droppedweapon") // if dropped, colormap is already set up nicely
-       if (itemflags & FL_WEAPON)
        {
-               // neutral team color for pickup weapons
-               self.colormap = 1024; // color shirt=0 pants=0 grey
+               if (self.classname != "droppedweapon") // if dropped, colormap is already set up nicely
+             self.colormap = 1024; // color shirt=0 pants=0 grey
+         else
+             self.gravity = 1;
+             
+               self.ItemStatus |= ITS_ANIMATE1;
+               self.ItemStatus |= ISF_COLORMAP;
        }
  
        self.state = 0;
-       if(self.team)
+       if(self.team) // broken, no idea why.
        {
                if(!self.cnt)
                        self.cnt = 1; // item probability weight
-               self.effects = self.effects | EF_NODRAW; // marker for item team search
+                       
+               self.effects |= EF_NODRAW; // marker for item team search
                InitializeEntity(self, Item_FindTeam, INITPRIO_FINDTARGET);
        }
        else
                Item_Reset();
+         
+     Net_LinkEntity(self, FALSE, 0, ItemSend);
 +
 +      // call this hook after everything else has been done
 +      if(MUTATOR_CALLHOOK(Item_Spawn))
 +      {
 +              startitem_failed = TRUE;
 +              remove(self);
 +              return;
 +      }
  }
  
  /* replace items in minstagib
   * IT_NAILS    = extra lives
   * IT_INVINCIBLE = speed
   */
- void minstagib_items (float itemid)
+ void minstagib_items (float itemid) // will be deleted soon.
  {
        float rnd;
-       self.classname = "minstagib";
+       self.classname = "minstagib"; // ...?
  
        // replace rocket launchers and nex guns with ammo cells
        if (itemid == IT_CELLS)
@@@ -1363,7 -1603,7 +1611,7 @@@ void spawnfunc_item_invincible (void) 
  void spawnfunc_item_minst_cells (void) {
        if (g_minstagib)
        {
-               minst_no_auto_cells = 1;
+               minst_no_auto_cells = TRUE;
                minstagib_items(IT_CELLS);
        }
        else
@@@ -1879,3 -2119,4 +2127,4 @@@ float GiveItems(entity e, float beginar
  
        return got;
  }
+ #endif