X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Ft_items.qc;h=bc8638dd2f123fa2830fc90ca1b2bdbb054d280d;hp=e90055b27873b210ea33d4bdfc9731541a4e5224;hb=138e8a13857ec32c09da2335049b82d576736b47;hpb=2e8d8e34f5654af82145fc687faaf9c1ce54fe34 diff --git a/qcsrc/server/t_items.qc b/qcsrc/server/t_items.qc index e90055b27..bc8638dd2 100644 --- a/qcsrc/server/t_items.qc +++ b/qcsrc/server/t_items.qc @@ -10,63 +10,72 @@ #define ITS_POWERUP 64 #define ISF_COLORMAP 16 #define ISF_DROP 32 +#define ISF_ANGLES 64 .float ItemStatus; #ifdef CSQC -var float autocvar_cl_ghost_items = 1; +var float autocvar_cl_animate_items = 1; +var float autocvar_cl_ghost_items = 0.45; 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; - +var float autocvar_cl_fullbright_items = 0; +var vector autocvar_cl_weapon_stay_color = '2 0.5 0.5'; +var float autocvar_cl_weapon_stay_alpha = 0.75; +var float autocvar_cl_simple_items = 0; +var string autocvr_cl_simpleitems_postfix = "_simple"; .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); + if(self.move_flags & FL_ONGROUND) + { // For some reason move_avelocity gets set to '0 0 0' here ... + self.oldorigin = self.origin; + self.gravity = 0; + + if(autocvar_cl_animate_items) + { // ... so reset it if animations are requested. + if(self.ItemStatus & ITS_ANIMATE1) + self.move_avelocity = '0 180 0'; + + if(self.ItemStatus & ITS_ANIMATE2) + self.move_avelocity = '0 -90 0'; + } + } + } + else if (autocvar_cl_animate_items) + { + if(self.ItemStatus & ITS_ANIMATE1) + { + self.angles += self.move_avelocity * frametime; + setorigin(self, '0 0 10' + self.oldorigin + '0 0 8' * sin(time * 2)); + } + + if(self.ItemStatus & ITS_ANIMATE2) + { + self.angles += self.move_avelocity * frametime; + setorigin(self, '0 0 8' + self.oldorigin + '0 0 4' * sin(time * 3)); + } + } } 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; + + if(self.move_flags & FL_ONGROUND) + self.gravity = 0; + } } void ItemRead(float _IsNew) { - if(!csqcitems_started) - csqcitems_start(); - float sf = ReadByte(); if(sf & ISF_LOCATION) @@ -78,6 +87,14 @@ void ItemRead(float _IsNew) self.oldorigin = self.origin; } + if(sf & ISF_ANGLES) + { + self.angles_x = ReadCoord(); + self.angles_y = ReadCoord(); + self.angles_z = ReadCoord(); + self.move_angles = self.angles; + } + if(sf & ISF_STATUS) // need to read/write status frist so model can handle simple, fb etc. { self.ItemStatus = ReadByte(); @@ -89,7 +106,7 @@ void ItemRead(float _IsNew) } else { - if (cl_ghost_items_alpha) + if (autocvar_cl_ghost_items_color) { self.alpha = autocvar_cl_ghost_items; self.colormod = self.glowmod = autocvar_cl_ghost_items_color; @@ -104,8 +121,8 @@ void ItemRead(float _IsNew) if(self.ItemStatus & ITS_STAYWEP) { - self.colormod = self.glowmod = autocvar_cl_staywep_color; - self.alpha = autocvar_cl_staywep_alpha; + self.colormod = self.glowmod = autocvar_cl_weapon_stay_color; + self.alpha = autocvar_cl_weapon_stay_alpha; } @@ -130,19 +147,21 @@ void ItemRead(float _IsNew) self.mdl = ""; string _fn = ReadString(); - if(cl_simple_items && (self.ItemStatus & ITS_ALLOWSI)) + if(autocvar_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")); + + + if(fexists(sprintf("%s%s.md3", _fn2, autocvr_cl_simpleitems_postfix))) + self.mdl = strzone(sprintf("%s%s.md3", _fn2, autocvr_cl_simpleitems_postfix)); + else if(fexists(sprintf("%s%s.dpm", _fn2, autocvr_cl_simpleitems_postfix))) + self.mdl = strzone(sprintf("%s%s.dpm", _fn2, autocvr_cl_simpleitems_postfix)); + else if(fexists(sprintf("%s%s.iqm", _fn2, autocvr_cl_simpleitems_postfix))) + self.mdl = strzone(sprintf("%s%s.iqm", _fn2, autocvr_cl_simpleitems_postfix)); + else if(fexists(sprintf("%s%s.obj", _fn2, autocvr_cl_simpleitems_postfix))) + self.mdl = strzone(sprintf("%s%s.obj", _fn2, autocvr_cl_simpleitems_postfix)); else { self.draw = ItemDraw; @@ -167,6 +186,7 @@ void ItemRead(float _IsNew) if(sf & ISF_DROP) { self.gravity = 1; + self.move_angles = '0 0 0'; self.move_movetype = MOVETYPE_TOSS; self.move_velocity_x = ReadCoord(); self.move_velocity_y = ReadCoord(); @@ -181,8 +201,18 @@ void ItemRead(float _IsNew) } else self.move_time = max(self.move_time, time); - } + } + + if(autocvar_cl_animate_items) + { + if(self.ItemStatus & ITS_ANIMATE1) + self.move_avelocity = '0 180 0'; + + if(self.ItemStatus & ITS_ANIMATE2) + self.move_avelocity = '0 -90 0'; + } } + #endif #ifdef SVQC @@ -197,7 +227,6 @@ float ItemSend(entity to, float sf) WriteByte(MSG_ENTITY, ENT_CLIENT_ITEM); WriteByte(MSG_ENTITY, sf); - //WriteByte(MSG_ENTITY, self.cnt); if(sf & ISF_LOCATION) { @@ -205,6 +234,13 @@ float ItemSend(entity to, float sf) WriteCoord(MSG_ENTITY, self.origin_y); WriteCoord(MSG_ENTITY, self.origin_z); } + + if(sf & ISF_ANGLES) + { + WriteCoord(MSG_ENTITY, self.angles_x); + WriteCoord(MSG_ENTITY, self.angles_y); + WriteCoord(MSG_ENTITY, self.angles_z); + } if(sf & ISF_STATUS) WriteByte(MSG_ENTITY, self.ItemStatus); @@ -841,7 +877,7 @@ float Item_GiveTo(entity item, entity player) pickedup = TRUE; // sound not available // AnnounceTo(player, "speed"); - player.invincible_finished = max(player.invincible_finished, time) + autocvar_g_balance_powerup_strength_time; + player.invincible_finished = max(player.invincible_finished, time) + autocvar_g_balance_powerup_invincible_time; } } else @@ -921,7 +957,7 @@ float Item_GiveTo(entity item, entity player) void Item_Touch (void) { entity e, head; - + // remove the item if it's currnetly in a NODROP brush or hits a NOIMPACT surface (such as sky) if(self.classname == "droppedweapon") { @@ -940,6 +976,8 @@ void Item_Touch (void) return; if (self.owner == other) return; + if(MUTATOR_CALLHOOK(ItemTouch)) + return; if (self.classname == "droppedweapon") { @@ -1253,6 +1291,9 @@ void StartItem (string itemmodel, string pickupsound, float defaultrespawntime, remove (self); return; } + + if(self.angles != '0 0 0') + self.SendFlags |= ISF_ANGLES; self.reset = Item_Reset; // it's a level item