X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Ft_items.qc;h=88b4c7a032e7a85b9cc873850a4c6693be5b409f;hb=c2bcf0db4a1d1460ef667f26c51efedfccfa6ba0;hp=f9bb3ff10b64d173d028a32345c7c63a682e7b40;hpb=d60791cbf24eec83d6aad5758e9676873620621d;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/t_items.qc b/qcsrc/server/t_items.qc index f9bb3ff10..88b4c7a03 100644 --- a/qcsrc/server/t_items.qc +++ b/qcsrc/server/t_items.qc @@ -48,7 +48,7 @@ void ItemDrawSimple() void ItemRead(float _IsNew) { - float sf = ReadByte(); + int sf = ReadByte(); if(sf & ISF_LOCATION) { @@ -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() { @@ -476,7 +434,7 @@ void Item_RespawnCountdown (void) entity wi = get_weaponinfo(self.weapon); if(wi) { - name = wi.model2; + name = wi.wpmodel; rgb = '1 0 0'; } } @@ -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); @@ -629,7 +588,10 @@ float Item_GiveTo(entity item, entity player) pickedup = TRUE; for(i = WEP_FIRST; i <= WEP_LAST; ++i) if(it & WepSet_FromWeapon(i)) + { + W_DropEvent(WR_PICKUP, player, i, item); W_GiveWeapon(player, i); + } } } @@ -637,7 +599,7 @@ float Item_GiveTo(entity item, entity player) { pickedup = TRUE; player.items |= it; - sprint (player, strcat("You got the ^2", item.netname, "\n")); + Send_Notification(NOTIF_ONE, player, MSG_INFO, INFO_ITEM_WEAPON_GOT, item.netname); } if (item.strength_finished) @@ -688,12 +650,16 @@ void Item_Touch (void) if (!IS_PLAYER(other)) return; + if (other.frozen) + return; if (other.deadflag) return; if (self.solid != SOLID_TRIGGER) return; if (self.owner == other) return; + if (time < self.item_spawnshieldtime) + return; switch(MUTATOR_CALLHOOK(ItemTouch)) { @@ -823,7 +789,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 +832,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,8 +852,10 @@ 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; + need_fuel = TRUE; } // TODO: figure out if the player even has the weapon this ammo is for? @@ -909,6 +877,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) @@ -1185,6 +1157,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) @@ -1409,10 +1390,7 @@ void spawnfunc_target_items (void) else { error("invalid spawnflags"); -#ifdef GMQCC - itemprefix = string_null; - valueprefix = string_null; -#endif + itemprefix = valueprefix = string_null; } self.netname = ""; @@ -1427,6 +1405,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"); @@ -1476,8 +1455,6 @@ void spawnfunc_item_fuel_regen(void) void spawnfunc_item_jetpack(void) { - if(g_grappling_hook) - return; // sorry, but these two can't coexist (same button); spawn fuel instead if(!self.ammo_fuel) self.ammo_fuel = g_pickup_fuel_jetpack; if(start_items & IT_JETPACK) @@ -1625,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); @@ -1678,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); @@ -1710,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; @@ -1766,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);