X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Ft_items.qc;h=fa6d0f6f313510dd1bc6a8e1a6e921a425d7e1b0;hb=bf853505a82f19839d47bcefe27900dbb52e0134;hp=7d16e6c69ee6234a4bb8e5366b8018f5948c480a;hpb=48170a5b271aebd6ec9c5914ae0909c27429ce44;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/t_items.qc b/qcsrc/common/t_items.qc index 7d16e6c69..fa6d0f6f3 100644 --- a/qcsrc/common/t_items.qc +++ b/qcsrc/common/t_items.qc @@ -533,7 +533,7 @@ void Item_Respawn (entity this) void Item_RespawnCountdown (entity this) { - if(this.count >= ITEM_RESPAWN_TICKS) + if(this.item_respawncounter >= ITEM_RESPAWN_TICKS) { if(this.waypointsprite_attached) WaypointSprite_Kill(this.waypointsprite_attached); @@ -542,8 +542,8 @@ void Item_RespawnCountdown (entity this) else { this.nextthink = time + 1; - this.count += 1; - if(this.count == 1) + this.item_respawncounter += 1; + if(this.item_respawncounter == 1) { do { { @@ -584,7 +584,7 @@ void Item_RespawnCountdown (entity this) }); WaypointSprite_Ping(this.waypointsprite_attached); - //WaypointSprite_UpdateHealth(this.waypointsprite_attached, this.count); + //WaypointSprite_UpdateHealth(this.waypointsprite_attached, this.item_respawncounter); } } } @@ -607,7 +607,7 @@ void Item_ScheduleRespawnIn(entity e, float t) setthink(e, Item_RespawnCountdown); e.nextthink = time + max(0, t - ITEM_RESPAWN_TICKS); e.scheduledrespawntime = e.nextthink + ITEM_RESPAWN_TICKS; - e.count = 0; + e.item_respawncounter = 0; if(Item_ItemsTime_Allow(e.itemdef) || (e.weapons & WEPSET_SUPERWEAPONS)) { t = Item_ItemsTime_UpdateTime(e, e.scheduledrespawntime); @@ -842,8 +842,6 @@ float Item_GiveTo(entity item, entity player) player.superweapons_finished = max(player.superweapons_finished, time) + item.superweapons_finished; } -LABEL(skip) - // always eat teamed entities if(item.team) pickedup = true; @@ -905,11 +903,7 @@ void Item_Touch(entity this, entity toucher) toucher = M_ARGV(1, entity); - // TODO: Proper way to handle expiring and not expiring loot. - // Expiring loot will have strength "ticking" will it's dropped. - // Not expiring will not tick. - // OTOH, do we really need expiring loot? - if (this.classname == "droppedweapon") + if (Item_IsExpiring(this)) { this.strength_finished = max(0, this.strength_finished - time); this.invincible_finished = max(0, this.invincible_finished - time); @@ -918,7 +912,7 @@ void Item_Touch(entity this, entity toucher) bool gave = ITEM_HANDLE(Pickup, this.itemdef, this, toucher); if (!gave) { - if (Item_IsLoot(this)) + if (Item_IsExpiring(this)) { // undo what we did above this.strength_finished += time; @@ -934,7 +928,7 @@ LABEL(pickup) Send_Effect(EFFECT_ITEM_PICKUP, CENTER_OR_VIEWOFS(this), '0 0 0', 1); _sound (toucher, (this.itemdef.instanceOfPowerup ? CH_TRIGGER_SINGLE : CH_TRIGGER), (this.item_pickupsound ? this.item_pickupsound : Sound_fixpath(this.item_pickupsound_ent)), VOL_BASE, ATTEN_NORM); - + MUTATOR_CALLHOOK(ItemTouched, this, toucher); if (wasfreed(this)) { @@ -1232,11 +1226,7 @@ void _StartItem(entity this, entity def, float defaultrespawntime, float default this.takedamage = DAMAGE_YES; this.event_damage = Item_Damage; - // TODO: Proper way to handle expiring and not expiring loot. - // Expiring loot will have strength "ticking" will it's dropped. - // Not expiring will not tick. - // OTOH, do we really need expiring loot? - if (this.strength_finished || this.invincible_finished || this.superweapons_finished) + if (Item_IsExpiring(this)) { // if item is worthless after a timer, have it expire then this.nextthink = max(this.strength_finished, this.invincible_finished, this.superweapons_finished); @@ -1351,7 +1341,7 @@ void _StartItem(entity this, entity def, float defaultrespawntime, float default if(def.instanceOfWeaponPickup) { - if (this.classname != "droppedweapon") // if dropped, colormap is already set up nicely + if (!Item_IsLoot(this)) // if dropped, colormap is already set up nicely this.colormap = 1024; // color shirt=0 pants=0 grey else this.gravity = 1; @@ -1387,6 +1377,13 @@ void _StartItem(entity this, entity def, float defaultrespawntime, float default void StartItem(entity this, GameItem def) { + def = def.m_spawnfunc_hookreplace(def, this); + if (def.spawnflags & ITEM_FLAG_MUTATORBLOCKED) + { + delete(this); + return; + } + this.classname = def.m_canonical_spawnfunc; _StartItem( this, this.itemdef = def, @@ -1443,114 +1440,9 @@ void setItemGroupCount() } } -spawnfunc(item_rockets) -{ - StartItem(this, ITEM_Rockets); -} - -spawnfunc(item_bullets) -{ - if(!weaponswapping && autocvar_sv_q3acompat_machineshotgunswap && - (this.classname != "droppedweapon")) - { - weaponswapping = true; - spawnfunc_item_shells(this); - weaponswapping = false; - return; - } - - StartItem(this, ITEM_Bullets); -} - -spawnfunc(item_cells) -{ - StartItem(this, ITEM_Cells); -} - -spawnfunc(item_plasma) -{ - StartItem(this, ITEM_Plasma); -} - -spawnfunc(item_shells) -{ - if(!weaponswapping && autocvar_sv_q3acompat_machineshotgunswap && - (this.classname != "droppedweapon")) - { - weaponswapping = true; - spawnfunc_item_bullets(this); - weaponswapping = false; - return; - } - - StartItem(this, ITEM_Shells); -} - -spawnfunc(item_armor_small) -{ - StartItem(this, ITEM_ArmorSmall); -} - -spawnfunc(item_armor_medium) -{ - StartItem(this, ITEM_ArmorMedium); -} - -spawnfunc(item_armor_big) -{ - StartItem(this, ITEM_ArmorBig); -} - -spawnfunc(item_armor_mega) -{ - StartItem(this, ITEM_ArmorMega); -} - -spawnfunc(item_health_small) -{ - StartItem(this, ITEM_HealthSmall); -} - -spawnfunc(item_health_medium) -{ - StartItem(this, ITEM_HealthMedium); -} - -spawnfunc(item_health_big) -{ - StartItem(this, ITEM_HealthBig); -} - -spawnfunc(item_health_mega) -{ - StartItem(this, ITEM_HealthMega); -} - -// support old misnamed entities -spawnfunc(item_armor1) { spawnfunc_item_armor_small(this); } // FIXME: in Quake this is green armor, in Xonotic maps it is an armor shard -spawnfunc(item_armor25) { spawnfunc_item_armor_mega(this); } -spawnfunc(item_armor_large) { spawnfunc_item_armor_mega(this); } -spawnfunc(item_health1) { spawnfunc_item_health_small(this); } -spawnfunc(item_health25) { spawnfunc_item_health_medium(this); } -spawnfunc(item_health_large) { spawnfunc_item_health_big(this); } -spawnfunc(item_health100) { spawnfunc_item_health_mega(this); } - -spawnfunc(item_strength) -{ - StartItem(this, ITEM_Strength); -} - -spawnfunc(item_invincible) -{ - StartItem(this, ITEM_Shield); -} - -// compatibility: -spawnfunc(item_quad) { this.classname = "item_strength";spawnfunc_item_strength(this);} - void target_items_use(entity this, entity actor, entity trigger) { - if(actor.classname == "droppedweapon") + if(Item_IsLoot(actor)) { EXACTTRIGGER_TOUCH(this, trigger); delete(actor); @@ -1565,7 +1457,7 @@ void target_items_use(entity this, entity actor, entity trigger) EXACTTRIGGER_TOUCH(this, trigger); } - IL_EACH(g_items, it.enemy == actor && it.classname == "droppedweapon", + IL_EACH(g_items, it.enemy == actor && Item_IsLoot(it), { delete(it); }); @@ -1687,31 +1579,6 @@ spawnfunc(target_items) } } -spawnfunc(item_fuel) -{ - StartItem(this, ITEM_JetpackFuel); -} - -spawnfunc(item_fuel_regen) -{ - if(start_items & ITEM_JetpackRegen.m_itemid) - { - spawnfunc_item_fuel(this); - return; - } - StartItem(this, ITEM_JetpackRegen); -} - -spawnfunc(item_jetpack) -{ - if(start_items & ITEM_Jetpack.m_itemid) - { - spawnfunc_item_fuel(this); - return; - } - StartItem(this, ITEM_Jetpack); -} - float GiveWeapon(entity e, float wpn, float op, float val) { WepSet v0, v1;