Class UTArmor : Armor { int absorb; Property ArmorAbsorption : absorb; Default { +INVENTORY.AUTOACTIVATE; +INVENTORY.UNTOSSABLE; -INVENTORY.KEEPDEPLETED; +INVENTORY.ALWAYSPICKUP; } override void AbsorbDamage( int damage, Name damageType, out int newdamage ) { int saved; if ( (amount > 0) && !DamageTypeDefinition.IgnoreArmor(damageType) ) { saved = int(damage*absorb/100.); if ( amount <= saved ) saved = amount; newdamage -= saved; amount -= saved; damage = newdamage; } if ( damage > 0 ) newdamage = ApplyDamageFactors(GetClass(),damageType,damage,damage); } } Class UTArmorBonus : UTArmor { override void AbsorbDamage( int damage, Name damageType, out int newdamage ) { absorb = Clamp(amount*2,25,75); Super.AbsorbDamage(damage,damageType,newdamage); } Default { Tag "$T_ARMORBONUS"; +COUNTITEM; Inventory.Amount 1; Inventory.MaxAmount 50; Inventory.InterHubAmount 50; UTArmor.ArmorAbsorption 25; Inventory.PickupMessage "$I_ARMORBONUS"; Inventory.PickupSound "misc/ut_shard"; } States { Spawn: XANH A -1; Stop; } } Class UTThighPads : UTArmor { override bool HandlePickup( Inventory item ) { if ( item is 'UTThighPads' ) { let s = Owner.FindInventory("UTShieldBelt"); if ( s ) { // sum up current amounts let a = Owner.FindInventory("UTBodyArmor"); int samount = s.amount; if ( a ) samount += a.amount; if ( amount < item.amount ) amount = item.amount; amount = min(s.maxamount-samount,amount); item.bPickupGood = true; return true; } } return Super.HandlePickup(item); } Default { Tag "$T_THIGHPADS"; Inventory.Amount 50; Inventory.MaxAmount 50; Inventory.InterHubAmount 50; UTArmor.ArmorAbsorption 50; Inventory.PickupMessage "$I_THIGHPADS"; Inventory.PickupSound "misc/ut_armor"; } States { Spawn: THIG A -1; Stop; } } Class UTBodyArmor : UTArmor { override bool HandlePickup( Inventory item ) { if ( item is 'UTBodyArmor' ) { let s = Owner.FindInventory("UTShieldBelt"); if ( s ) { // sum up current amounts let p = Owner.FindInventory("UTThighPads"); int samount = s.amount; if ( p ) samount += p.amount; if ( amount < item.amount ) amount = item.amount; amount = min(s.maxamount-samount,amount); item.bPickupGood = true; return true; } } return Super.HandlePickup(item); } Default { Tag "$T_BODYARMOR"; Inventory.Amount 100; Inventory.MaxAmount 100; Inventory.InterHubAmount 100; UTArmor.ArmorAbsorption 75; Inventory.PickupMessage "$I_BODYARMOR"; Inventory.PickupSound "misc/ut_armor"; } States { Spawn: UARM A -1; Stop; } } Class UTShieldBelt : UTArmor { override void AbsorbDamage( int damage, Name damageType, out int newdamage ) { if ( (amount > 0) && !DamageTypeDefinition.IgnoreArmor(damageType) ) { Owner.A_PlaySound("belt/absorb",CHAN_7); UTMainHandler.DoFlash(Owner,Color(80,255,224,0),5); } int oldamt = amount; Super.AbsorbDamage(damage,damageType,newdamage); if ( (oldamt > 0) && (amount <= 0) ) PrintPickupMessage(true,StringTable.Localize("$D_SHIELDBELT")); } override bool HandlePickup( Inventory item ) { if ( (item is 'UTBodyArmor') || (item is 'UTThighPads') ) { // sum up current amounts let a = Owner.FindInventory("UTBodyArmor"); let p = Owner.FindInventory("UTThighPads"); int samount = amount; if ( a ) samount += a.amount; if ( p ) samount += p.amount; item.amount = min(item.amount,maxamount-samount); if ( item.amount <= 0 ) { item.amount = 1; amount -= 1; } } if ( item is 'UTShieldBelt' ) Use(true); return Super.HandlePickup(item); } override bool Use( bool pickup ) { // removes thigh pads and body armor like in UT Owner.TakeInventory("UTThighPads",50); Owner.TakeInventory("UTBodyArmor",150); return false; } Default { Tag "$T_SHIELDBELT"; +COUNTITEM; +INVENTORY.BIGPOWERUP; Inventory.Amount 150; Inventory.MaxAmount 150; Inventory.InterHubAmount 150; UTArmor.ArmorAbsorption 100; Inventory.PickupMessage "$I_SHIELDBELT"; Inventory.PickupSound "belt/pickup"; Inventory.RespawnTics 2100; } States { Spawn: BELT A -1; Stop; } }