X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Ft_items.qc;h=0e0209892d447fec334eecfe976d8a368cdd2f92;hb=bc84852344a61cf02dea8f6db1a1e3a2449b4253;hp=86d19beec4411c59bc8e6c7d061e779ab1ddf168;hpb=7a738be3163631386e6750d4d60a25529ab138ce;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/t_items.qc b/qcsrc/server/t_items.qc index 86d19beec..0e0209892 100644 --- a/qcsrc/server/t_items.qc +++ b/qcsrc/server/t_items.qc @@ -137,14 +137,14 @@ void ItemRead(float _IsNew) - 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)); + if(fexists(sprintf("%s%s.md3", _fn2, autocvar_cl_simpleitems_postfix))) + self.mdl = strzone(sprintf("%s%s.md3", _fn2, autocvar_cl_simpleitems_postfix)); + else if(fexists(sprintf("%s%s.dpm", _fn2, autocvar_cl_simpleitems_postfix))) + 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 { self.draw = ItemDraw; @@ -281,54 +281,12 @@ float have_pickup_item(void) if(autocvar_g_pickup_items == 0) return FALSE; if(g_weaponarena) - if(self.weapons || (self.items & IT_AMMO)) + if(self.weapons || (self.items & IT_AMMO)) // no item or ammo pickups in weaponarena return FALSE; } return TRUE; } -floatfield Item_CounterField(float it) -{ - switch(it) - { - case IT_SHELLS: return ammo_shells; - case IT_NAILS: return ammo_nails; - case IT_ROCKETS: return ammo_rockets; - case IT_CELLS: return ammo_cells; - case IT_FUEL: return ammo_fuel; - case IT_5HP: return health; - case IT_25HP: return health; - case IT_HEALTH: return health; - case IT_ARMOR_SHARD: return armorvalue; - case IT_ARMOR: return armorvalue; - // add more things here (health, armor) - default: error("requested item has no counter field"); - } -#ifdef GMQCC - // should never happen - return health; -#endif -} - -string Item_CounterFieldName(float it) -{ - switch(it) - { - case IT_SHELLS: return "shells"; - case IT_NAILS: return "nails"; - case IT_ROCKETS: return "rockets"; - case IT_CELLS: return "cells"; - case IT_FUEL: return "fuel"; - - // add more things here (health, armor) - default: error("requested item has no counter field name"); - } -#ifdef GMQCC - // should never happen - return string_null; -#endif -} - /* float Item_Customize() { @@ -547,25 +505,25 @@ void Item_ScheduleInitialRespawn(entity e) Item_ScheduleRespawnIn(e, game_starttime - time + ITEM_RESPAWNTIME_INITIAL(e)); } -float Item_GiveAmmoTo(entity item, entity player, .float ammofield, float ammomax, float mode) +float Item_GiveAmmoTo(entity item, entity player, .float ammotype, float ammomax, float mode) { - if (!item.ammofield) + if (!item.ammotype) return FALSE; if (item.spawnshieldtime) { - if ((player.ammofield < ammomax) || item.pickup_anyway) + if ((player.ammotype < ammomax) || item.pickup_anyway) { - player.ammofield = bound(player.ammofield, ammomax, player.ammofield + item.ammofield); + player.ammotype = bound(player.ammotype, ammomax, player.ammotype + item.ammotype); goto YEAH; } } else if(g_weapon_stay == 2) { - float mi = min(item.ammofield, ammomax); - if (player.ammofield < mi) + float mi = min(item.ammotype, ammomax); + if (player.ammotype < mi) { - player.ammofield = mi; + player.ammotype = mi; goto YEAH; } } @@ -615,6 +573,7 @@ float Item_GiveTo(entity item, entity player) pickedup |= Item_GiveAmmoTo(item, player, ammo_nails, g_pickup_nails_max, ITEM_MODE_NONE); pickedup |= Item_GiveAmmoTo(item, player, ammo_rockets, g_pickup_rockets_max, ITEM_MODE_NONE); pickedup |= Item_GiveAmmoTo(item, player, ammo_cells, g_pickup_cells_max, ITEM_MODE_NONE); + pickedup |= Item_GiveAmmoTo(item, player, ammo_plasma, g_pickup_plasma_max, ITEM_MODE_NONE); pickedup |= Item_GiveAmmoTo(item, player, health, item.max_health, ITEM_MODE_HEALTH); pickedup |= Item_GiveAmmoTo(item, player, armorvalue, item.max_armorvalue, ITEM_MODE_ARMOR); @@ -694,6 +653,8 @@ void Item_Touch (void) return; if (self.owner == other) return; + if (time < self.item_spawnshieldtime) + return; switch(MUTATOR_CALLHOOK(ItemTouch)) { @@ -823,7 +784,7 @@ float weapon_pickupevalfunc(entity player, entity item) // If I can pick it up if(!item.spawnshieldtime) c = 0; - else if(player.ammo_cells || player.ammo_shells || player.ammo_nails || player.ammo_rockets) + else if(player.ammo_cells || player.ammo_shells || player.ammo_plasma || player.ammo_nails || player.ammo_rockets) { // Skilled bots will grab more c = bound(0, skill / 10, 1) * 0.5; @@ -866,7 +827,7 @@ float weapon_pickupevalfunc(entity player, entity item) float commodity_pickupevalfunc(entity player, entity item) { float c, i; - float need_shells = FALSE, need_nails = FALSE, need_rockets = FALSE, need_cells = FALSE, need_fuel = FALSE; + float need_shells = FALSE, need_nails = FALSE, need_rockets = FALSE, need_cells = FALSE, need_plasma = FALSE, need_fuel = FALSE; entity wi; c = 0; @@ -886,6 +847,8 @@ float commodity_pickupevalfunc(entity player, entity item) need_rockets = TRUE; else if(wi.items & IT_CELLS) need_cells = TRUE; + else if(wi.items & IT_PLASMA) + need_plasma = TRUE; else if(wi.items & IT_FUEL) need_cells = TRUE; } @@ -909,6 +872,10 @@ float commodity_pickupevalfunc(entity player, entity item) if (item.ammo_cells) if (player.ammo_cells < g_pickup_cells_max) c = c + max(0, 1 - player.ammo_cells / g_pickup_cells_max); + if (need_plasma) + if (item.ammo_plasma) + if (player.ammo_plasma < g_pickup_plasma_max) + c = c + max(0, 1 - player.ammo_plasma / g_pickup_plasma_max); if (need_fuel) if (item.ammo_fuel) if (player.ammo_fuel < g_pickup_fuel_max) @@ -1015,9 +982,6 @@ void StartItem (string itemmodel, string pickupsound, float defaultrespawntime, return; } - if(self.angles != '0 0 0') - self.SendFlags |= ISF_ANGLES; - self.reset = Item_Reset; // it's a level item if(self.spawnflags & 1) @@ -1036,9 +1000,7 @@ void StartItem (string itemmodel, string pickupsound, float defaultrespawntime, setsize (self, '-16 -16 0', '16 16 48'); else setsize (self, '-16 -16 0', '16 16 32'); - - self.SendFlags |= ISF_SIZE; - + // note droptofloor returns FALSE if stuck/or would fall too far droptofloor(); waypoint_spawnforitem(self); @@ -1112,8 +1074,6 @@ void StartItem (string itemmodel, string pickupsound, float defaultrespawntime, } setsize (self, self.pos1, self.pos2); - self.SendFlags |= ISF_SIZE; - if(itemflags & FL_POWERUP) self.ItemStatus |= ITS_ANIMATE1; @@ -1144,6 +1104,10 @@ void StartItem (string itemmodel, string pickupsound, float defaultrespawntime, Item_Reset(); Net_LinkEntity(self, FALSE, 0, ItemSend); + + self.SendFlags |= ISF_SIZE; + if(self.angles) + self.SendFlags |= ISF_ANGLES; // call this hook after everything else has been done if(MUTATOR_CALLHOOK(Item_Spawn)) @@ -1188,6 +1152,15 @@ void spawnfunc_item_cells (void) { StartItem ("models/items/a_cells.md3", "misc/itempickup.wav", g_pickup_respawntime_ammo, g_pickup_respawntimejitter_ammo, "cells", IT_CELLS, 0, 0, commodity_pickupevalfunc, 2000); } +void spawnfunc_item_plasma() +{ + if(!self.ammo_plasma) + self.ammo_plasma = g_pickup_plasma; + if(!self.pickup_anyway) + self.pickup_anyway = g_pickup_ammo_anyway; + StartItem ("models/items/a_cells.md3", "misc/itempickup.wav", g_pickup_respawntime_ammo, g_pickup_respawntimejitter_ammo, "plasma", IT_PLASMA, 0, 0, commodity_pickupevalfunc, 2000); +} + void spawnfunc_item_shells (void) { if(!weaponswapping) if(autocvar_sv_q3acompat_machineshotgunswap) @@ -1430,6 +1403,7 @@ void spawnfunc_target_items (void) 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"); if(self.ammo_cells != 0) self.netname = sprintf("%s %s%d %s", self.netname, valueprefix, max(0, self.ammo_cells), "cells"); + if(self.ammo_plasma != 0) self.netname = sprintf("%s %s%d %s", self.netname, valueprefix, max(0, self.ammo_plasma), "plasma"); if(self.ammo_fuel != 0) self.netname = sprintf("%s %s%d %s", self.netname, valueprefix, max(0, self.ammo_fuel), "fuel"); if(self.health != 0) self.netname = sprintf("%s %s%d %s", self.netname, valueprefix, max(0, self.health), "health"); if(self.armorvalue != 0) self.netname = sprintf("%s %s%d %s", self.netname, valueprefix, max(0, self.health), "armor"); @@ -1628,6 +1602,7 @@ float GiveItems(entity e, float beginarg, float endarg) PREGIVE(e, superweapons_finished); PREGIVE(e, ammo_nails); PREGIVE(e, ammo_cells); + PREGIVE(e, ammo_plasma); PREGIVE(e, ammo_shells); PREGIVE(e, ammo_rockets); PREGIVE(e, ammo_fuel); @@ -1681,6 +1656,7 @@ float GiveItems(entity e, float beginarg, float endarg) } case "allammo": got += GiveValue(e, ammo_cells, op, val); + got += GiveValue(e, ammo_plasma, op, val); got += GiveValue(e, ammo_shells, op, val); got += GiveValue(e, ammo_nails, op, val); got += GiveValue(e, ammo_rockets, op, val); @@ -1713,6 +1689,9 @@ float GiveItems(entity e, float beginarg, float endarg) case "cells": got += GiveValue(e, ammo_cells, op, val); break; + case "plasma": + got += GiveValue(e, ammo_plasma, op, val); + break; case "shells": got += GiveValue(e, ammo_shells, op, val); break; @@ -1769,6 +1748,7 @@ float GiveItems(entity e, float beginarg, float endarg) POSTGIVE_VALUE(e, invincible_finished, 1, "misc/powerup_shield.wav", "misc/poweroff.wav"); POSTGIVE_VALUE(e, ammo_nails, 0, "misc/itempickup.wav", string_null); POSTGIVE_VALUE(e, ammo_cells, 0, "misc/itempickup.wav", string_null); + POSTGIVE_VALUE(e, ammo_plasma, 0, "misc/itempickup.wav", string_null); POSTGIVE_VALUE(e, ammo_shells, 0, "misc/itempickup.wav", string_null); POSTGIVE_VALUE(e, ammo_rockets, 0, "misc/itempickup.wav", string_null); POSTGIVE_VALUE_ROT(e, ammo_fuel, 1, pauserotfuel_finished, autocvar_g_balance_pause_fuel_rot, pauseregen_finished, autocvar_g_balance_pause_fuel_regen, "misc/itempickup.wav", string_null);