X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Ft_items.qc;h=957e421e34279a437c2ce5ee32893d82f26a44be;hp=13850fcad055312f452f0af2e755b74d19b3ef3b;hb=6da43def85c45064172b55faaa8cd811f22ae179;hpb=900a3c09e97e21b6db27f930b20edd97f85d340a diff --git a/qcsrc/server/t_items.qc b/qcsrc/server/t_items.qc index 13850fcad0..957e421e34 100644 --- a/qcsrc/server/t_items.qc +++ b/qcsrc/server/t_items.qc @@ -271,19 +271,12 @@ float ItemSend(entity to, float sf) float have_pickup_item(void) { - // minstagib: only allow filtered items - if(g_minstagib) - if(self.classname != "minstagib") - return FALSE; - if(self.flags & FL_POWERUP) { if(autocvar_g_powerups > 0) return TRUE; if(autocvar_g_powerups == 0) return FALSE; - if(g_lms) - return FALSE; if(g_ca) return FALSE; if(g_arena) @@ -295,8 +288,6 @@ float have_pickup_item(void) return TRUE; if(autocvar_g_pickup_items == 0) return FALSE; - if(g_lms) - return FALSE; if(g_ca) return FALSE; if(g_weaponarena) @@ -330,6 +321,10 @@ floatfield Item_CounterField(float it) // 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) @@ -345,6 +340,10 @@ string Item_CounterFieldName(float it) // 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 max_armorvalue; @@ -436,9 +435,10 @@ void Item_Show (entity e, float mode) void Item_Respawn (void) { Item_Show(self, 1); - if(!g_minstagib && self.items == IT_STRENGTH) + // this is ugly... + if(self.items == IT_STRENGTH) sound (self, CH_TRIGGER, "misc/strength_respawn.wav", VOL_BASE, ATTN_NORM); // play respawn sound - else if(!g_minstagib && self.items == IT_INVINCIBLE) + else if(self.items == IT_INVINCIBLE) sound (self, CH_TRIGGER, "misc/shield_respawn.wav", VOL_BASE, ATTN_NORM); // play respawn sound else sound (self, CH_TRIGGER, "misc/itemrespawn.wav", VOL_BASE, ATTN_NORM); // play respawn sound @@ -465,28 +465,18 @@ void Item_RespawnCountdown (void) string name; vector rgb = '1 0 1'; name = string_null; - if(g_minstagib) - { - switch(self.items) - { - case IT_STRENGTH: name = "item-invis"; rgb = '0 0 1'; break; - case IT_NAILS: name = "item-extralife"; rgb = '1 0 0'; break; - case IT_INVINCIBLE: name = "item-speed"; rgb = '1 0 1'; break; - } - } - else - { - switch(self.items) - { - case IT_STRENGTH: name = "item-strength"; rgb = '0 0 1'; break; - case IT_INVINCIBLE: name = "item-shield"; rgb = '1 0 1'; break; - } - } 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_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; } + item_name = name; + item_color = rgb; + MUTATOR_CALLHOOK(Item_RespawnCountdown); + name = item_name; + rgb = item_color; if(self.flags & FL_WEAPON) { entity wi = get_weaponinfo(self.weapon); @@ -496,17 +486,17 @@ void Item_RespawnCountdown (void) rgb = '1 0 0'; } } - if(!name) - { - print("Unknown powerup-marked item is wanting to respawn\n"); - localcmd(sprintf("prvm_edict server %d\n", num_for_edict(self))); - } if(name) { WaypointSprite_Spawn(name, 0, 0, self, '0 0 64', world, 0, self, waypointsprite_attached, TRUE, RADARICON_POWERUP, rgb); if(self.waypointsprite_attached) WaypointSprite_UpdateBuildFinished(self.waypointsprite_attached, time + ITEM_RESPAWN_TICKS); } + else + { + print("Unknown powerup-marked item is wanting to respawn\n"); + localcmd(sprintf("prvm_edict server %d\n", num_for_edict(self))); + } } sound (self, CH_TRIGGER, "misc/itemrespawncountdown.wav", VOL_BASE, ATTN_NORM); // play respawn sound if(self.waypointsprite_attached) @@ -606,130 +596,69 @@ float Item_GiveTo(entity item, entity player) // if nothing happens to player, just return without taking the item pickedup = FALSE; _switchweapon = FALSE; + // in case the player has autoswitch enabled do the following: + // if the player is using their best weapon before items are given, they + // probably want to switch to an even better weapon after items are given + if (player.autoswitch) + if (player.switchweapon == w_getbestweapon(player)) + _switchweapon = TRUE; - if (g_minstagib) - { - float prevcells = player.ammo_cells; - - pickedup |= Item_GiveAmmoTo(item, player, ammo_fuel, g_pickup_fuel_max, ITEM_MODE_FUEL); - pickedup |= Item_GiveAmmoTo(item, player, ammo_cells, 999, ITEM_MODE_NONE); - - if(player.ammo_cells > prevcells) - { - _switchweapon = TRUE; + if not(WEPSET_CONTAINS_EW(player, player.switchweapon)) + _switchweapon = TRUE; - // play some cool sounds ;) - if (clienttype(player) == CLIENTTYPE_REAL) - { - if(player.health <= 5) - AnnounceTo(player, "lastsecond"); - else if(player.health < 50) - AnnounceTo(player, "narrowly"); - } - // sound not available - // else if(item.items == IT_CELLS) - // AnnounceTo(player, "ammo"); + pickedup |= Item_GiveAmmoTo(item, player, ammo_fuel, g_pickup_fuel_max, ITEM_MODE_FUEL); + pickedup |= Item_GiveAmmoTo(item, player, ammo_shells, g_pickup_shells_max, ITEM_MODE_NONE); + 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, health, item.max_health, ITEM_MODE_HEALTH); + pickedup |= Item_GiveAmmoTo(item, player, armorvalue, item.max_armorvalue, ITEM_MODE_ARMOR); - if (WEPSET_CONTAINS_EW(item, WEP_MINSTANEX)) - W_GiveWeapon (player, WEP_MINSTANEX, item.netname); - player.health = 100; - } - - if((it = (item.items - (item.items & player.items)) & IT_PICKUPMASK)) - { - pickedup = TRUE; - player.items |= it; - sprint (player, strcat("You got the ^2", item.netname, "\n")); - } + if (item.flags & FL_WEAPON) + { + WEPSET_DECLARE_A(it); + WEPSET_COPY_AE(it, item); + WEPSET_ANDNOT_AE(it, player); - // extralife powerup - if (item.max_health) + if (!WEPSET_EMPTY_A(it) || (item.spawnshieldtime && item.pickup_anyway)) { pickedup = TRUE; - // sound not available - // AnnounceTo(player, "_lives"); - player.armorvalue = bound(player.armorvalue, 999, player.armorvalue + autocvar_g_minstagib_extralives); - sprint(player, "^3You picked up some extra lives\n"); + for(i = WEP_FIRST; i <= WEP_LAST; ++i) + if(WEPSET_CONTAINS_AW(it, i)) + W_GiveWeapon(player, i); } + } - // invis powerup - if (item.strength_finished) - { - pickedup = TRUE; - // sound not available - // AnnounceTo(player, "invisible"); - player.strength_finished = max(player.strength_finished, time) + autocvar_g_balance_powerup_strength_time; - } + if((it = (item.items - (item.items & player.items)) & IT_PICKUPMASK)) + { + pickedup = TRUE; + player.items |= it; + sprint (player, strcat("You got the ^2", item.netname, "\n")); + } - // speed powerup - if (item.invincible_finished) - { - pickedup = TRUE; - // sound not available - // AnnounceTo(player, "speed"); - player.invincible_finished = max(player.invincible_finished, time) + autocvar_g_balance_powerup_strength_time; - } + if (item.strength_finished) + { + pickedup = TRUE; + player.strength_finished = max(player.strength_finished, time) + item.strength_finished; } - else + if (item.invincible_finished) { - // in case the player has autoswitch enabled do the following: - // if the player is using their best weapon before items are given, they - // probably want to switch to an even better weapon after items are given - if (player.autoswitch) - if (player.switchweapon == w_getbestweapon(player)) - _switchweapon = TRUE; - - if not(WEPSET_CONTAINS_EW(player, player.switchweapon)) - _switchweapon = TRUE; - - pickedup |= Item_GiveAmmoTo(item, player, ammo_fuel, g_pickup_fuel_max, ITEM_MODE_FUEL); - pickedup |= Item_GiveAmmoTo(item, player, ammo_shells, g_pickup_shells_max, ITEM_MODE_NONE); - 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, health, item.max_health, ITEM_MODE_HEALTH); - pickedup |= Item_GiveAmmoTo(item, player, armorvalue, item.max_armorvalue, ITEM_MODE_ARMOR); - - if (item.flags & FL_WEAPON) - { - WEPSET_DECLARE_A(it); - WEPSET_COPY_AE(it, item); - WEPSET_ANDNOT_AE(it, player); - - if (!WEPSET_EMPTY_A(it) || (item.spawnshieldtime && self.pickup_anyway)) - { - pickedup = TRUE; - for(i = WEP_FIRST; i <= WEP_LAST; ++i) - if(WEPSET_CONTAINS_AW(it, i)) - W_GiveWeapon (player, i, item.netname); - } - } - - if((it = (item.items - (item.items & player.items)) & IT_PICKUPMASK)) - { - pickedup = TRUE; - player.items |= it; - sprint (player, strcat("You got the ^2", item.netname, "\n")); - } - - if (item.strength_finished) - { - pickedup = TRUE; - player.strength_finished = max(player.strength_finished, time) + item.strength_finished; - } - if (item.invincible_finished) - { - pickedup = TRUE; - player.invincible_finished = max(player.invincible_finished, time) + item.invincible_finished; - } - if (item.superweapons_finished) - { - pickedup = TRUE; - player.superweapons_finished = max(player.superweapons_finished, time) + item.superweapons_finished; - } + pickedup = TRUE; + player.invincible_finished = max(player.invincible_finished, time) + item.invincible_finished; + } + if (item.superweapons_finished) + { + pickedup = TRUE; + player.superweapons_finished = max(player.superweapons_finished, time) + item.superweapons_finished; + } + if (item.max_health) + { + pickedup = TRUE; + // extra life powerup handled by mutators } :skip + // always eat teamed entities if(item.team) pickedup = TRUE; @@ -747,7 +676,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") { @@ -766,6 +695,8 @@ void Item_Touch (void) return; if (self.owner == other) return; + if(MUTATOR_CALLHOOK(ItemTouch)) + return; if (self.classname == "droppedweapon") { @@ -824,7 +755,7 @@ void Item_Reset() if(self.classname != "droppedweapon") { - self.think = SUB_Null; + self.think = func_null; self.nextthink = 0; if(self.waypointsprite_attached) @@ -1142,9 +1073,9 @@ void StartItem (string itemmodel, string pickupsound, float defaultrespawntime, precache_sound (self.item_pickupsound); precache_sound ("misc/itemrespawncountdown.wav"); - if(!g_minstagib && itemid == IT_STRENGTH) + if(itemid == IT_STRENGTH) precache_sound ("misc/strength_respawn.wav"); - else if(!g_minstagib && itemid == IT_INVINCIBLE) + else if(itemid == IT_INVINCIBLE) precache_sound ("misc/shield_respawn.wav"); else precache_sound ("misc/itemrespawn.wav"); @@ -1204,69 +1135,14 @@ void StartItem (string itemmodel, string pickupsound, float defaultrespawntime, Item_Reset(); Net_LinkEntity(self, FALSE, 0, ItemSend); -} -/* replace items in minstagib - * IT_STRENGTH = invisibility - * IT_NAILS = extra lives - * IT_INVINCIBLE = speed - */ -void minstagib_items (float itemid) // will be deleted soon. -{ - float rnd; - self.classname = "minstagib"; // ...? - - // replace rocket launchers and nex guns with ammo cells - if (itemid == IT_CELLS) + // call this hook after everything else has been done + if(MUTATOR_CALLHOOK(Item_Spawn)) { - self.ammo_cells = autocvar_g_minstagib_ammo_drop; - StartItem ("models/items/a_cells.md3", - "misc/itempickup.wav", 45, 0, - "MinstaNex Ammo", IT_CELLS, 0, 0, generic_pickupevalfunc, 100); + startitem_failed = TRUE; + remove(self); return; } - - // randomize - rnd = random() * 3; - if (rnd <= 1) - itemid = IT_STRENGTH; - else if (rnd <= 2) - itemid = IT_NAILS; - else - itemid = IT_INVINCIBLE; - - // replace with invis - if (itemid == IT_STRENGTH) - { - if(!self.strength_finished) - self.strength_finished = autocvar_g_balance_powerup_strength_time; - StartItem ("models/items/g_strength.md3", - "misc/powerup.wav", g_pickup_respawntime_powerup, g_pickup_respawntimejitter_powerup, - "Invisibility", IT_STRENGTH, 0, FL_POWERUP, generic_pickupevalfunc, BOT_PICKUP_RATING_MID); - } - // replace with extra lives - if (itemid == IT_NAILS) - { - self.max_health = 1; - StartItem ("models/items/g_h100.md3", - "misc/megahealth.wav", g_pickup_respawntime_powerup, g_pickup_respawntimejitter_powerup, - "Extralife", IT_NAILS, 0, FL_POWERUP, generic_pickupevalfunc, BOT_PICKUP_RATING_HIGH); - } - // replace with speed - if (itemid == IT_INVINCIBLE) - { - if(!self.invincible_finished) - self.invincible_finished = autocvar_g_balance_powerup_invincible_time; - StartItem ("models/items/g_invincible.md3", - "misc/powerup_shield.wav", g_pickup_respawntime_powerup, g_pickup_respawntimejitter_powerup, - "Speed", IT_INVINCIBLE, 0, FL_POWERUP, generic_pickupevalfunc, BOT_PICKUP_RATING_MID); - } -} - -float minst_no_auto_cells; -void minst_remove_item (void) { - if(minst_no_auto_cells) - remove(self); } float weaponswapping; @@ -1407,11 +1283,6 @@ void weapon_defaultspawnfunc(float wpn) if(self.team) f |= FL_NO_WEAPON_STAY; - // stupid minstagib hack, don't ask - if(g_minstagib) - if(self.ammo_cells) - self.ammo_cells = autocvar_g_minstagib_ammo_drop; - StartItem(e.model, "weapons/weaponpickup.wav", self.respawntime, self.respawntimejitter, e.message, 0, e.weapon, f, weapon_pickupevalfunc, e.bot_pickupbasevalue); if (self.modelindex) // don't precache if self was removed weapon_action(e.weapon, WR_PRECACHE); @@ -1440,37 +1311,16 @@ void spawnfunc_weapon_shotgun (void) { void spawnfunc_weapon_nex (void) { - if (g_minstagib) - { - minstagib_items(IT_CELLS); - self.think = minst_remove_item; - self.nextthink = time; - return; - } weapon_defaultspawnfunc(WEP_NEX); } void spawnfunc_weapon_minstanex (void) { - if (g_minstagib) - { - minstagib_items(IT_CELLS); - self.think = minst_remove_item; - self.nextthink = time; - return; - } weapon_defaultspawnfunc(WEP_MINSTANEX); } void spawnfunc_weapon_rocketlauncher (void) { - if (g_minstagib) - { - minstagib_items(IT_CELLS); // replace rocketlauncher with cells - self.think = minst_remove_item; - self.nextthink = time; - return; - } weapon_defaultspawnfunc(WEP_ROCKET_LAUNCHER); } @@ -1598,9 +1448,6 @@ void spawnfunc_item_health_large (void) { } void spawnfunc_item_health_mega (void) { - if(g_minstagib) { - minstagib_items(IT_NAILS); - } else { if(!self.max_health) self.max_health = g_pickup_healthmega_max; if(!self.health) @@ -1608,7 +1455,6 @@ void spawnfunc_item_health_mega (void) { if(!self.pickup_anyway) self.pickup_anyway = g_pickup_healthmega_anyway; StartItem ("models/items/g_h100.md3", "misc/megahealth.wav", g_pickup_respawntime_long, g_pickup_respawntimejitter_long, "100 Health", IT_HEALTH, 0, 0, commodity_pickupevalfunc, BOT_PICKUP_RATING_HIGH); - } } // support old misnamed entities @@ -1619,34 +1465,16 @@ void spawnfunc_item_health25() { spawnfunc_item_health_medium(); } void spawnfunc_item_health100() { spawnfunc_item_health_mega(); } void spawnfunc_item_strength (void) { - if(g_minstagib) { - minstagib_items(IT_STRENGTH); - } else { precache_sound("weapons/strength_fire.wav"); if(!self.strength_finished) self.strength_finished = autocvar_g_balance_powerup_strength_time; StartItem ("models/items/g_strength.md3", "misc/powerup.wav", g_pickup_respawntime_powerup, g_pickup_respawntimejitter_powerup, "Strength Powerup", IT_STRENGTH, 0, FL_POWERUP, generic_pickupevalfunc, 100000); - } } void spawnfunc_item_invincible (void) { - if(g_minstagib) { - minstagib_items(IT_INVINCIBLE); - } else { if(!self.invincible_finished) self.invincible_finished = autocvar_g_balance_powerup_invincible_time; StartItem ("models/items/g_invincible.md3", "misc/powerup_shield.wav", g_pickup_respawntime_powerup, g_pickup_respawntimejitter_powerup, "Shield", IT_INVINCIBLE, 0, FL_POWERUP, generic_pickupevalfunc, 100000); - } -} - -void spawnfunc_item_minst_cells (void) { - if (g_minstagib) - { - minst_no_auto_cells = TRUE; - minstagib_items(IT_CELLS); - } - else - remove(self); } // compatibility: @@ -1754,7 +1582,13 @@ void spawnfunc_target_items (void) valueprefix = "max "; } else + { error("invalid spawnflags"); +#ifdef GMQCC + itemprefix = string_null; + valueprefix = string_null; +#endif + } self.netname = ""; self.netname = sprintf("%s %s%d %s", self.netname, itemprefix, !!(self.items & IT_UNLIMITED_WEAPON_AMMO), "unlimited_weapon_ammo"); @@ -2132,12 +1966,6 @@ float GiveItems(entity e, float beginarg, float endarg) if(WEPSET_CONTAINS_ANY_EA(self, WEPBIT_SUPERWEAPONS)) e.superweapons_finished = autocvar_g_balance_superweapons_time; - if (g_minstagib) - { - e.health = bound(0, e.health, 100); - e.armorvalue = bound(0, e.armorvalue, 999); - } - if(e.strength_finished <= 0) e.strength_finished = 0; else