X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Ft_items.qc;h=3c944619bfa693a259e86fe808de93a15ec342ae;hb=785232fc90ed7bd7038c79f65534a7e79efd7f45;hp=37af9ee8618077742338ccdbdd6fa4b8becd1e8c;hpb=704e0c494980a0c8489d4d8c8b34f98ba0d1b17c;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/t_items.qc b/qcsrc/server/t_items.qc index 37af9ee86..3c944619b 100644 --- a/qcsrc/server/t_items.qc +++ b/qcsrc/server/t_items.qc @@ -174,12 +174,12 @@ void ItemRead(float _IsNew) self.mdl = strzone(sprintf("%s%s.dpm", _fn2, autocvar_cl_simpleitems_postfix)); else if(fexists(sprintf("%s%s.iqm", _fn2, autocvar_cl_simpleitems_postfix))) self.mdl = strzone(sprintf("%s%s.iqm", _fn2, autocvar_cl_simpleitems_postfix)); - else if(fexists(sprintf("%s%s.obj", _fn2, autocvar_cl_simpleitems_postfix))) - self.mdl = strzone(sprintf("%s%s.obj", _fn2, autocvar_cl_simpleitems_postfix)); + else if(fexists(sprintf("%s%s.mdl", _fn2, autocvar_cl_simpleitems_postfix))) + self.mdl = strzone(sprintf("%s%s.mdl", _fn2, autocvar_cl_simpleitems_postfix)); else { self.draw = ItemDraw; - dprint("Simple item requested for ", _fn, " but no model exsist for it\n"); + dprint("Simple item requested for ", _fn, " but no model exists for it\n"); } } @@ -384,7 +384,7 @@ void Item_Show (entity e, float mode) e.ItemStatus &= ~ITS_AVAILABLE; } - if (e.items & IT_STRENGTH || e.items & IT_INVINCIBLE) + if (e.items & ITEM_Strength.m_itemid || e.items & ITEM_Shield.m_itemid) e.ItemStatus |= ITS_POWERUP; if (autocvar_g_nodepthtestitems) @@ -412,193 +412,24 @@ void Item_Think() } } -float it_armor_large_time; -float it_health_mega_time; -float it_invisible_time; -float it_speed_time; -float it_extralife_time; -float it_strength_time; -float it_shield_time; -float it_fuelregen_time; -float it_jetpack_time; -float it_superweapons_time; - -void Item_ItemsTime_Init() -{ - it_armor_large_time = -1; - it_health_mega_time = -1; - it_invisible_time = -1; - it_speed_time = -1; - it_extralife_time = -1; - it_strength_time = -1; - it_shield_time = -1; - it_fuelregen_time = -1; - it_jetpack_time = -1; - it_superweapons_time = -1; -} -void Item_ItemsTime_ResetTimes() -{ - it_armor_large_time = (it_armor_large_time == -1) ? -1 : 0; - it_health_mega_time = (it_health_mega_time == -1) ? -1 : 0; - it_invisible_time = (it_invisible_time == -1) ? -1 : 0; - it_speed_time = (it_speed_time == -1) ? -1 : 0; - it_extralife_time = (it_extralife_time == -1) ? -1 : 0; - it_strength_time = (it_strength_time == -1) ? -1 : 0; - it_shield_time = (it_shield_time == -1) ? -1 : 0; - it_fuelregen_time = (it_fuelregen_time == -1) ? -1 : 0; - it_jetpack_time = (it_jetpack_time == -1) ? -1 : 0; - it_superweapons_time= (it_superweapons_time== -1) ? -1 : 0; -} -void Item_ItemsTime_ResetTimesForPlayer(entity e) -{ - e.item_armor_large_time = (it_armor_large_time == -1) ? -1 : 0; - e.item_health_mega_time = (it_health_mega_time == -1) ? -1 : 0; - e.item_invisible_time = (it_invisible_time == -1) ? -1 : 0; - e.item_speed_time = (it_speed_time == -1) ? -1 : 0; - e.item_extralife_time = (it_extralife_time == -1) ? -1 : 0; - e.item_strength_time = (it_strength_time == -1) ? -1 : 0; - e.item_shield_time = (it_shield_time == -1) ? -1 : 0; - e.item_fuelregen_time = (it_fuelregen_time == -1) ? -1 : 0; - e.item_jetpack_time = (it_jetpack_time == -1) ? -1 : 0; - e.item_superweapons_time= (it_superweapons_time== -1) ? -1 : 0; -} -void Item_ItemsTime_SetTimesForPlayer(entity e) -{ - e.item_armor_large_time = it_armor_large_time; - e.item_health_mega_time = it_health_mega_time; - e.item_invisible_time = it_invisible_time; - e.item_speed_time = it_speed_time; - e.item_extralife_time = it_extralife_time; - e.item_strength_time = it_strength_time; - e.item_shield_time = it_shield_time; - e.item_fuelregen_time = it_fuelregen_time; - e.item_jetpack_time = it_jetpack_time; - e.item_superweapons_time = it_superweapons_time; -} - -void Item_ItemsTime_SetTime(entity e, float t) -{ - if(!autocvar_sv_itemstime) - return; - - if(g_instagib) - { - switch(e.items) - { - case IT_STRENGTH://"item-invis" - it_invisible_time = t; - break; - case IT_NAILS://"item-extralife" - it_extralife_time = t; - break; - case IT_INVINCIBLE://"item-speed" - it_speed_time = t; - break; - } - } - else - { - switch(e.items) - { - case IT_HEALTH: - // if(e.classname == "item_health_mega") // IT_HEALTH unequivocally identifies it - it_health_mega_time = t; - break; - case IT_ARMOR: - if(e.classname == "item_armor_large") // IT_ARMOR doesn't unequivocally identifies it - it_armor_large_time = t; - break; - case IT_STRENGTH://"item-strength" - it_strength_time = t; - break; - case IT_INVINCIBLE://"item-shield" - it_shield_time = t; - break; - default: - if(e.weapons & WEPSET_SUPERWEAPONS) - it_superweapons_time = t; - } - } - switch(e.items) - { - case IT_FUEL_REGEN://"item-fuelregen" - it_fuelregen_time = t; - break; - case IT_JETPACK://"item-jetpack" - it_jetpack_time = t; - break; - } -} -void Item_ItemsTime_SetTimesForAllPlayers() -{ - entity e; - if(warmup_stage) - { - FOR_EACH_REALCLIENT(e) - Item_ItemsTime_SetTimesForPlayer(e); - } - else - { - FOR_EACH_REALCLIENT(e) - { - if(!IS_PLAYER(e)) - Item_ItemsTime_SetTimesForPlayer(e); - } - } -} - -float Item_ItemsTime_UpdateTime(entity e, float t) -{ - entity head; - bool isavailable = (t == 0); - if(e.weapons & WEPSET_SUPERWEAPONS) - { - for(head = world; (head = nextent(head)); ) - { - if(clienttype(head) != CLIENTTYPE_NOTACLIENT || !(head.weapons & WEPSET_SUPERWEAPONS) || head.classname == "weapon_info") - continue; - if(e == head) - continue; - - if(head.scheduledrespawntime <= time) - isavailable = true; - else if(t == 0 || head.scheduledrespawntime < t) - t = head.scheduledrespawntime; - } - } - else - { - for(head = world; (head = nextent(head)); ) - { - if(head.itemdef != e.itemdef) - continue; - if(e == head) - continue; - - if(head.scheduledrespawntime <= time) - isavailable = true; - else if(t == 0 || head.scheduledrespawntime < t) - t = head.scheduledrespawntime; - } - } - if(isavailable) - t = -t; // let know the client there's another available item - return t; -} +bool Item_ItemsTime_Allow(entity e); +float Item_ItemsTime_UpdateTime(entity e, float t); +void Item_ItemsTime_SetTime(entity e, float t); +void Item_ItemsTime_SetTimesForAllPlayers(); void Item_Respawn (void) { Item_Show(self, 1); // this is ugly... - if(self.items == IT_STRENGTH) + if(self.items == ITEM_Strength.m_itemid) sound (self, CH_TRIGGER, "misc/strength_respawn.wav", VOL_BASE, ATTEN_NORM); // play respawn sound - else if(self.items == IT_INVINCIBLE) + else if(self.items == ITEM_Shield.m_itemid) sound (self, CH_TRIGGER, "misc/shield_respawn.wav", VOL_BASE, ATTEN_NORM); // play respawn sound else sound (self, CH_TRIGGER, "misc/itemrespawn.wav", VOL_BASE, ATTEN_NORM); // play respawn sound setorigin (self, self.origin); - if(self.flags & FL_POWERUP || self.classname == "item_armor_large" || self.items == IT_HEALTH || (self.weapons & WEPSET_SUPERWEAPONS)) + if (Item_ItemsTime_Allow(self)) { float t = Item_ItemsTime_UpdateTime(self, 0); Item_ItemsTime_SetTime(self, t); @@ -608,8 +439,8 @@ void Item_Respawn (void) self.think = Item_Think; self.nextthink = time; - //pointparticles(particleeffectnum("item_respawn"), self.origin + self.mins_z * '0 0 1' + '0 0 48', '0 0 0', 1); - pointparticles(particleeffectnum("item_respawn"), self.origin + 0.5 * (self.mins + self.maxs), '0 0 0', 1); + //Send_Effect("item_respawn", self.origin + self.mins_z * '0 0 1' + '0 0 48', '0 0 0', 1); + Send_Effect("item_respawn", CENTER_OR_VIEWOFS(self), '0 0 0', 1); } void Item_RespawnCountdown (void) @@ -626,24 +457,13 @@ void Item_RespawnCountdown (void) self.count += 1; if(self.count == 1) { - string name; + string name = string_null; vector rgb = '1 0 1'; - name = string_null; - switch(self.items) - { - case IT_FUEL_REGEN: name = "item-fuelregen"; rgb = '1 0.5 0'; break; - case IT_JETPACK: name = "item-jetpack"; rgb = '0.5 0.5 0.5'; break; - case IT_STRENGTH: name = "item-strength"; rgb = '0 0 1'; break; - case IT_INVINCIBLE: name = "item-shield"; rgb = '1 0 1'; break; - case IT_HEALTH: - //if (self.classname == "item_health_mega") - {name = "item_health_mega"; rgb = '1 0 0';} - break; - case IT_ARMOR: - if (self.classname == "item_armor_large") - {name = "item_armor_large"; rgb = '0 1 0';} - break; - } + entity e = self.itemdef; + if (e) { + name = e.m_waypoint; + rgb = e.m_color; + } MUTATOR_CALLHOOK(Item_RespawnCountdown, name, rgb); name = item_name; rgb = item_color; @@ -709,7 +529,7 @@ void Item_RespawnThink() void Item_ScheduleRespawnIn(entity e, float t) { - if((e.flags & FL_POWERUP) || (e.weapons & WEPSET_SUPERWEAPONS) || e.classname == "item_armor_large" || e.items == IT_HEALTH) + if (Item_ItemsTime_Allow(e)) { e.think = Item_RespawnCountdown; e.nextthink = time + max(0, t - ITEM_RESPAWN_TICKS); @@ -931,7 +751,7 @@ void Item_Touch (void) other.last_pickup = time; - pointparticles(particleeffectnum("item_pickup"), self.origin, '0 0 0', 1); + Send_Effect("item_pickup", CENTER_OR_VIEWOFS(self), '0 0 0', 1); sound (other, CH_TRIGGER, self.item_pickupsound, VOL_BASE, ATTEN_NORM); if (self.classname == "droppedweapon") @@ -1010,6 +830,7 @@ void Item_FindTeam() // TODO: perhaps nice special effect? void RemoveItem(void) { + Send_Effect("item_pickup", CENTER_OR_VIEWOFS(self), '0 0 0', 1); remove(self); } @@ -1083,17 +904,17 @@ float commodity_pickupevalfunc(entity player, entity item) if (!(player.weapons & WepSet_FromWeapon(i))) continue; - if(wi.items & IT_SHELLS) + if(wi.items & ITEM_Shells.m_itemid) need_shells = true; - else if(wi.items & IT_NAILS) + else if(wi.items & ITEM_Bullets.m_itemid) need_nails = true; - else if(wi.items & IT_ROCKETS) + else if(wi.items & ITEM_Rockets.m_itemid) need_rockets = true; - else if(wi.items & IT_CELLS) + else if(wi.items & ITEM_Cells.m_itemid) need_cells = true; - else if(wi.items & IT_PLASMA) + else if(wi.items & ITEM_Plasma.m_itemid) need_plasma = true; - else if(wi.items & IT_FUEL) + else if(wi.items & ITEM_JetpackFuel.m_itemid) need_fuel = true; } @@ -1286,9 +1107,9 @@ void StartItem (string itemmodel, string pickupsound, float defaultrespawntime, precache_sound (self.item_pickupsound); precache_sound ("misc/itemrespawncountdown.wav"); - if(itemid == IT_STRENGTH) + if(itemid == ITEM_Strength.m_itemid) precache_sound ("misc/strength_respawn.wav"); - else if(itemid == IT_INVINCIBLE) + else if(itemid == ITEM_Shield.m_itemid) precache_sound ("misc/shield_respawn.wav"); else precache_sound ("misc/itemrespawn.wav"); @@ -1364,10 +1185,17 @@ void StartItem (string itemmodel, string pickupsound, float defaultrespawntime, } } +string Item_Model(string item_mdl) +{ + string output = strcat("models/items/", item_mdl); + MUTATOR_CALLHOOK(ItemModel, item_mdl, output); + return strzone(item_model_output); +} + void StartItemA (entity a) { self.itemdef = a; - StartItem(a.m_model, a.m_sound, a.m_respawntime(), a.m_respawntimejitter(), a.m_name, a.m_itemid, 0, a.m_itemflags, a.m_pickupevalfunc, a.m_botvalue); + StartItem(Item_Model(a.m_model), a.m_sound, a.m_respawntime(), a.m_respawntimejitter(), a.m_name, a.m_itemid, 0, a.m_itemflags, a.m_pickupevalfunc, a.m_botvalue); } void spawnfunc_item_rockets (void) { @@ -1458,7 +1286,7 @@ void spawnfunc_item_armor_big (void) { self.max_armorvalue = g_pickup_armorbig_max; if(!self.pickup_anyway) self.pickup_anyway = g_pickup_armorbig_anyway; - StartItemA (ITEM_ArmorBig); + StartItemA (ITEM_ArmorLarge); } void spawnfunc_item_armor_large (void) { @@ -1468,7 +1296,7 @@ void spawnfunc_item_armor_large (void) { self.max_armorvalue = g_pickup_armorlarge_max; if(!self.pickup_anyway) self.pickup_anyway = g_pickup_armorlarge_anyway; - StartItemA (ITEM_ArmorLarge); + StartItemA (ITEM_ArmorMega); } void spawnfunc_item_health_small (void) { @@ -1577,7 +1405,7 @@ void spawnfunc_target_items (void) precache_sound("misc/armor25.wav"); precache_sound("misc/powerup.wav"); precache_sound("misc/poweroff.wav"); - precache_sound("weapons/weaponpickup.wav"); + precache_sound(W_Sound("weaponpickup")); n = tokenize_console(self.netname); if(argv(0) == "give") @@ -1591,11 +1419,11 @@ void spawnfunc_target_items (void) if (argv(i) == "unlimited_ammo") self.items |= IT_UNLIMITED_AMMO; else if(argv(i) == "unlimited_weapon_ammo") self.items |= IT_UNLIMITED_WEAPON_AMMO; else if(argv(i) == "unlimited_superweapons") self.items |= IT_UNLIMITED_SUPERWEAPONS; - else if(argv(i) == "strength") self.items |= IT_STRENGTH; - else if(argv(i) == "invincible") self.items |= IT_INVINCIBLE; + else if(argv(i) == "strength") self.items |= ITEM_Strength.m_itemid; + else if(argv(i) == "invincible") self.items |= ITEM_Shield.m_itemid; else if(argv(i) == "superweapons") self.items |= IT_SUPERWEAPON; - else if(argv(i) == "jetpack") self.items |= IT_JETPACK; - else if(argv(i) == "fuel_regen") self.items |= IT_FUEL_REGEN; + else if(argv(i) == "jetpack") self.items |= ITEM_Jetpack.m_itemid; + else if(argv(i) == "fuel_regen") self.items |= ITEM_JetpackRegen.m_itemid; else { for(j = WEP_FIRST; j <= WEP_LAST; ++j) @@ -1645,11 +1473,11 @@ void spawnfunc_target_items (void) self.netname = ""; self.netname = sprintf("%s %s%d %s", self.netname, itemprefix, !!(self.items & IT_UNLIMITED_WEAPON_AMMO), "unlimited_weapon_ammo"); self.netname = sprintf("%s %s%d %s", self.netname, itemprefix, !!(self.items & IT_UNLIMITED_SUPERWEAPONS), "unlimited_superweapons"); - self.netname = sprintf("%s %s%d %s", self.netname, valueprefix, self.strength_finished * !!(self.items & IT_STRENGTH), "strength"); - self.netname = sprintf("%s %s%d %s", self.netname, valueprefix, self.invincible_finished * !!(self.items & IT_INVINCIBLE), "invincible"); + self.netname = sprintf("%s %s%d %s", self.netname, valueprefix, self.strength_finished * !!(self.items & ITEM_Strength.m_itemid), "strength"); + self.netname = sprintf("%s %s%d %s", self.netname, valueprefix, self.invincible_finished * !!(self.items & ITEM_Shield.m_itemid), "invincible"); self.netname = sprintf("%s %s%d %s", self.netname, valueprefix, self.superweapons_finished * !!(self.items & IT_SUPERWEAPON), "superweapons"); - self.netname = sprintf("%s %s%d %s", self.netname, itemprefix, !!(self.items & IT_JETPACK), "jetpack"); - self.netname = sprintf("%s %s%d %s", self.netname, itemprefix, !!(self.items & IT_FUEL_REGEN), "fuel_regen"); + self.netname = sprintf("%s %s%d %s", self.netname, itemprefix, !!(self.items & ITEM_Jetpack.m_itemid), "jetpack"); + self.netname = sprintf("%s %s%d %s", self.netname, itemprefix, !!(self.items & ITEM_JetpackRegen.m_itemid), "fuel_regen"); if(self.ammo_shells != 0) self.netname = sprintf("%s %s%d %s", self.netname, valueprefix, max(0, self.ammo_shells), "shells"); if(self.ammo_nails != 0) self.netname = sprintf("%s %s%d %s", self.netname, valueprefix, max(0, self.ammo_nails), "nails"); if(self.ammo_rockets != 0) self.netname = sprintf("%s %s%d %s", self.netname, valueprefix, max(0, self.ammo_rockets), "rockets"); @@ -1694,7 +1522,7 @@ void spawnfunc_item_fuel(void) void spawnfunc_item_fuel_regen(void) { - if(start_items & IT_FUEL_REGEN) + if(start_items & ITEM_JetpackRegen.m_itemid) { spawnfunc_item_fuel(); return; @@ -1706,7 +1534,7 @@ void spawnfunc_item_jetpack(void) { if(!self.ammo_fuel) self.ammo_fuel = g_pickup_fuel_jetpack; - if(start_items & IT_JETPACK) + if(start_items & ITEM_Jetpack.m_itemid) { spawnfunc_item_fuel(); return; @@ -1886,13 +1714,13 @@ float GiveItems(entity e, float beginarg, float endarg) op = OP_MINUS; continue; case "ALL": - got += GiveBit(e, items, IT_FUEL_REGEN, op, val); + got += GiveBit(e, items, ITEM_JetpackRegen.m_itemid, op, val); got += GiveValue(e, strength_finished, op, val); got += GiveValue(e, invincible_finished, op, val); got += GiveValue(e, superweapons_finished, op, val); got += GiveBit(e, items, IT_UNLIMITED_AMMO, op, val); case "all": - got += GiveBit(e, items, IT_JETPACK, op, val); + got += GiveBit(e, items, ITEM_Jetpack.m_itemid, op, val); got += GiveValue(e, health, op, val); got += GiveValue(e, armorvalue, op, val); case "allweapons": @@ -1921,10 +1749,10 @@ float GiveItems(entity e, float beginarg, float endarg) got += GiveBit(e, items, IT_UNLIMITED_SUPERWEAPONS, op, val); break; case "jetpack": - got += GiveBit(e, items, IT_JETPACK, op, val); + got += GiveBit(e, items, ITEM_Jetpack.m_itemid, op, val); break; case "fuel_regen": - got += GiveBit(e, items, IT_FUEL_REGEN, op, val); + got += GiveBit(e, items, ITEM_JetpackRegen.m_itemid, op, val); break; case "strength": got += GiveValue(e, strength_finished, op, val); @@ -1978,16 +1806,16 @@ float GiveItems(entity e, float beginarg, float endarg) op = OP_SET; } - POSTGIVE_BIT(e, items, IT_FUEL_REGEN, "misc/itempickup.wav", string_null); + POSTGIVE_BIT(e, items, ITEM_JetpackRegen.m_itemid, "misc/itempickup.wav", string_null); POSTGIVE_BIT(e, items, IT_UNLIMITED_SUPERWEAPONS, "misc/powerup.wav", "misc/poweroff.wav"); POSTGIVE_BIT(e, items, IT_UNLIMITED_WEAPON_AMMO, "misc/powerup.wav", "misc/poweroff.wav"); - POSTGIVE_BIT(e, items, IT_JETPACK, "misc/itempickup.wav", string_null); + POSTGIVE_BIT(e, items, ITEM_Jetpack.m_itemid, "misc/itempickup.wav", string_null); for(j = WEP_FIRST; j <= WEP_LAST; ++j) { wi = get_weaponinfo(j); if(wi.weapon) { - POSTGIVE_WEAPON(e, j, "weapons/weaponpickup.wav", string_null); + POSTGIVE_WEAPON(e, j, W_Sound("weaponpickup"), string_null); if (!(save_weapons & WepSet_FromWeapon(j))) if(e.weapons & WepSet_FromWeapon(j)) WEP_ACTION(wi.weapon, WR_INIT);