1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
|
/***************************************************************************
Panzerfaust Addon for the UN Vehicle Mod by Serthy
The Panzerfaust Weapon now causes damage to the vehicles!
change the damage, radius and the speed the way you want
Defaults:
speed 40 = 800 units per second
livetime 10 seconds
Have Fun!
Problems?
xfire: serthy
***************************************************************************/
init()
{
precacheModel( "xmodel/weapon_temp_panzershreck_rocket" );
level._effect["spitfire_bomb_explosion_dirt"] = loadFx( "fx/explosions/spitfire_bomb_dirt.efx" );
thread trackRockets();
level.bazooka["mindamage"] = getDvar( "scr_bazooka_mindmg" , 70 );
level.bazooka["maxdamage"] = getDvar( "scr_bazooka_maxdmg" , 300 );
level.bazooka["damageradius"] = getDvar( "scr_bazooka_dmgradius" , 300 );
level.bazooka["livetime"] = getDvar( "scr_bazooka_livetime" , 10 );
level.bazooka["speed"] = getDvar( "scr_bazooka_mindmg" , 40 );
}
trackRockets()
{
for( ; ; )
{
rockets = getentarray( "rocket" , "classname" );
if( isDefined( rockets ) )
{
for( i = 0; i < rockets.size; i++ )
{
if( !isDefined( rockets[i].monitored ) )
rockets[i] thread monitorRocket();
}
}
wait 0.05;
}
}
monitorRocket()
{
self.monitored = true;
players = getentarray( "player" , "classname" );
for( i = 0; i < players.size; i++ )
{
player = players[i];
if( !isAlive( player ) || player.sessionstate != "playing" || player.pers["team"] == "spectator" )
continue;
if( player getCurrentWeapon() != "panzerschreck_mp" )
continue;
dist = distanceSquared( self.origin, player.origin );
if( isDefined( self.owner ) || dist > 150 * 150 )
continue;
self.owner = player;
break;
}
if( !isDefined( self.owner ) )
return;
rocket = self _spawnRocket();
rocket _Panzerfaust();
}
_spawnRocket()
{
rocket = spawn( "script_model" , self.origin );
rocket setModel( "xmodel/weapon_temp_panzershreck_rocket" );
rocket.angles = self.angles;
rocket.targetname = "rocket";
rocket.team = self.owner.pers["team"];
rocket.owner = self.owner;
rocket.origin = self.origin + _vectorScale( anglestoforward( self.angles ) , 30 );
if( isDefined( self ) )
self delete();
return rocket;
}
_Panzerfaust()
{
distance = 0;
time = 0.05;
speed = level.bazooka["speed"];
for( ; ; )
{
wait( time );
distance += time;
if( distance > level.bazooka["livetime"] )
{
self delete();
break;
}
self moveto( self.origin + _vectorscale( anglestoforward( self.angles ) , speed ) , time );
forward = bullettrace( self.origin , self.origin + _vectorScale( anglesToForward( self.angles ) , speed ) , true , undefined );
if( forward["fraction"] != 1 && distance > 1 )
{
self playSound( "grenade_explosion" );
playFx( level._effect["spitfire_bomb_explosion_dirt"] , forward["position"] , forward["normal"] );
self _scripted_RadiusDamage( self.owner , ( 0 , 0 , 0 ) , "panzerschreck_mp" , level.bazooka["damageradius"] , level.bazooka["maxdamage"] , level.bazooka["mindamage"] , true );
self delete();
break;
}
}
}
_vectorScale( vec , scale )
{
vector = ( vec[0] * scale , vec[1] * scale , vec[2] * scale );
return vector;
}
_scripted_RadiusDamage( eAttacker , vOffset , sWeapon , iRange , iMaxDamage , iMinDamage , objectDamage )
{
if( !isDefined( self ) )
return;
if( !isdefined( vOffset ) ) vOffset = ( 0 , 0 , 0 );
if( !isdefined( objectDamage ) ) objectDamage = false;
sMeansOfDeath = "MOD_EXPLOSIVE";
iDFlags = 1;
vDir = ( 0 , 0 , 1 );
players = getentarray( "player" , "classname" );
for( i = 0 ; i < players.size ; i++ )
{
player = players[i];
if( player.pers["team"] == "spectator" )
continue;
if( player.sessionstate != "playing" || !isAlive( player ) )
continue;
distance = Distance( ( self.origin + vOffset ) , player.origin );
if( distance >= iRange )
continue;
if( player != self )
{
percent = ( iRange - distance ) / iRange;
iDamage = ( iMinDamage + ( ( iMaxDamage - iMinDamage ) * percent ) );
iDamage = int( iDamage );
}
else
{
iDamage = int( iMaxDamage );
}
player [[level.callbackPlayerDamage]]( self , eAttacker , iDamage , iDFlags , sMeansOfDeath , sWeapon , self.origin , vDir , "none" , 0 );
}
if( isDefined( objectDamage ) && objectDamage )
{
objects = getentarray();
for( i = 0 ; i < objects.size ; i++ )
{
object = objects[i];
if( isPlayer( object ) )
continue;
if( !isDefined( object.vehicleType ) ) // here only for UN Vehicle mod!
continue;
distance = Distance( ( self.origin + vOffset ) , object.origin );
if( distance > iRange )
continue;
percent = ( iRange - distance ) / iRange;
iDamage = ( iMinDamage + ( ( iMaxDamage - iMinDamage ) * percent ) );
iDamage = int( iDamage );
object thread _finishObjectDamage( eAttacker , iDamage , true );
}
}
}
_finishObjectDamage( attacker , damage , damagefeedback )
{
if( !isDefined( self ) )
return;
if( isDefined( self.damage ) )
{
self.damage += int( damage ); // here also only specified for UN Vehicle mod!
}
if( isDefined( attacker ) && isDefined( damagefeedback ) )
attacker thread maps\mp\gametypes\_damagefeedback::updateDamageFeedback();
}
getDvar( var , defVal )
{
if( getCvar( var ) == "" )
return defVal;
else return getCvarInt( var );
} |