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:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
|
//oraco aug.2006
//flak simulator script by Julian
main(){
precacheShader("white"); //needed for drawing crosshair
level.targetcolor = (1,1,1); //crosshair color, red=reload, green=fire, dot=target collision
level.angles = (0,0,0); //the angles where player is looking at; horizontal and verticle
level.lastangles = (0,0,0); //last angle in the cycle
level.barrelangles = (0,0,0); //angles where the gun barrel is aimming at, direction it shoots
level.gunpoint = (0,0,0); //the tip of the gun point, where we play light and smoke fx when shot
level.nohit = 1; //no hit is 1 if there is no target collision if shot
level.flak_inuse = 0; //only one person can use flak at a time, inuse =0 or 1
level.reloaddelay = 3;
//off or on by cvar "/seta chelm_flak 1" (1=on, 0=off, undefined=off, default=on)
if(isdefined(getcvar("chelm_flak")) && getcvar("chelm_flak") == "0")
wait 0.1;
else{
if(!isdefined(getcvar("chelm_flakdelay")))
level.reloaddelay = 12;
else{
if(getcvar("chelm_flakdelay") == "0")
level.reloaddelay = 3;
else if(getcvar("chelm_flakdelay") == "1")
level.reloaddelay = 6;
else if(getcvar("chelm_flakdelay") == "2")
level.reloaddelay = 9;
else if(getcvar("chelm_flakdelay") == "3")
level.reloaddelay = 12;
else if(getcvar("chelm_flakdelay") == "4")
level.reloaddelay = 15;
else if(getcvar("chelm_flakdelay") == "5")
level.reloaddelay = 18;
else if(getcvar("chelm_flakdelay") == "6")
level.reloaddelay = 21;
else if(getcvar("chelm_flakdelay") == "7")
level.reloaddelay = 24;
else if(getcvar("chelm_flakdelay") == "8")
level.reloaddelay = 27;
else
level.reloaddelay = 3;
}
wait 5; //I need this cuz i need the gametypes to finish initializing
thread flak_operator();
thread flak_aim();
thread flak_shoot();
//thread debugflak();
}
}
//==============================Custom Flak88 starts=======================
// allowing only one player to use the flak at a time by pressing F
// moves the player in position and transfers control
flak_operator(){
playerlink = getent("playerlink", "targetname");
outlink = getent("outlink", "targetname");
level.flak_trig = getent("flak_trig", "targetname");
while(1){
players = getentarray("player", "classname");
for(i=0; i<players.size; i++){
player = players[i];
if(isdefined(player) && player istouching(level.flak_trig) && player useButtonPressed() && (level.flak_inuse == 0))
{
while(player useButtonPressed())
wait 0.01;
while(player istouching (level.flak_trig)){
//draw crosshair the dumb way ===========
if (isdefined (player.ch))
player.ch destroy();
player.ch = newClientHudElem(player);
player.ch.x = 316;
player.ch.y = 238;
player.ch.alpha = 0.5;
player.ch.color = level.targetcolor;
player.ch setshader("white", 2, 4);
if (isdefined (player.ch1))
player.ch1 destroy();
player.ch1 = newClientHudElem(player);
player.ch1.x = 322;
player.ch1.y = 238;
player.ch1.alpha = 0.5;
player.ch1.color = level.targetcolor;
player.ch1 setshader("white", 2, 4);
if (isdefined (player.ch2))
player.ch2 destroy();
player.ch2 = newClientHudElem(player);
player.ch2.x = 318;
player.ch2.y = 240;
player.ch2.alpha = 0.5;
player.ch2.color = level.targetcolor;
player.ch2 setshader("white", 4, 2);
if(level.nohit==0){
if (isdefined (player.cd))
player.cd destroy();
player.cd = newClientHudElem(player);
player.cd.x = 318;
player.cd.y = 243;
player.cd.alpha = 0.5;
player.cd.color = (1,1,1);
player.cd setshader("white", 4, 1);
}
else{
if (isdefined (player.cd))
player.cd destroy();
}
//end draw crosshair===================
level.flak_inuse = 1;
player.origin = playerlink.origin;
player linkto(playerlink);
//disable weapons
player disableWeapon();
level.angles = (0-player.angles[0], 180+player.angles[1], 0-player.angles[2]);
level.flak_operator = player;
if(player useButtonPressed()){
while(player useButtonPressed())
wait 0.01;
player unlink();
player enableWeapon();
wait 0.1;
player.origin = outlink.origin;
player linkto(outlink);
wait 0.1;
player unlink();
level.flak_operator = undefined;
break;
}
if(!isdefined(level.flak_operator) || !isdefined(player) || !isAlive(level.flak_operator) || !isAlive(player)){
level.flak_operator = undefined;
break;
}
wait 0.01;
//wait 0.5;
}
level.flak_inuse = 0;
//clear crosshair===========
if (isdefined (player.ch))
player.ch destroy();
if (isdefined (player.ch1))
player.ch1 destroy();
if (isdefined (player.ch2))
player.ch2 destroy();
if (isdefined (player.cd))
player.cd destroy();
//end clear crosshair=======
}
}
wait 0.01;
}
}
//IW - extracted from _utility
vectorScale (vec, scale)
{
vec = (vec[0] * scale, vec[1] * scale, vec[2] * scale);
return vec;
}
//shooting mechanism
flak_shoot(){
timer = level.reloaddelay + 18;
while(1){
if(isdefined(level.flak_operator) && (level.flak_operator attackButtonPressed()) && (timer>(level.reloaddelay+17))){
temp_angles = level.angles;
level.angles += (5,0,5);
level.flak_operator playSound("flak_fire");
playfx(level.flak_light, level.gunpoint);
playfx(level._effect["thin_light_smoke_M"], level.gunpoint);
//shake em
earthquake(0.3, 0.3, level.flak_operator.origin, 100);
wait 0.1;
if(level.nohit == 0 && isdefined(level.hit)){
playfx(level._effect["bombexplosion"], level.hit.origin);
level.hit playSound("building_explosion1");
radiusDamage(vectorScale(level.hit.origin, 0.98), 180, 400, 25);
//scoring system
players = getentarray("player", "classname");
for(i=0; i<players.size; i++){
player = players[i];
away = distance(player.origin, level.hit.origin);
if(away<180){
if(player.health<=0){
level.flak_operator.score++;
iprintln(level.flak_operator.name + "^7 killed "+ player.name + "^7 with ^2Flak88\n");
}
}
}
}
level.angles = temp_angles;
timer = 0;
level.hit = undefined;
}
if((timer==level.reloaddelay+5) && isdefined(level.flak_operator))
level.flak_operator playSound("flak_reloading");
if(timer<(level.reloaddelay+18)){
level.targetcolor = (1,0,0);
timer++;
}
else
level.targetcolor = (0,1,0);
wait 0.2;
}
}
//flak's aim, movement, shooting mechanism
flak_aim(){
//get&spawn ents
pointhit = spawn("script_model", (0,0,0));
flak_chase = getent("flak_chase", "targetname");
flak_gun = getent("flak_gun", "targetname");
flak_barrel = getent("flak_barrel", "targetname");
played = 0;
//main loop
while(1){
//flak's movement======================================
rotate0 = level.angles[0];
rotate1 = level.angles[1];
rotate2 = level.angles[2];
if(level.angles[0]<-6)
rotate0 = -6;
if(level.angles[0]>30)
rotate0 = 30;
if(level.angles[1]<350 && level.angles[1]>270)
rotate1 = 350;
if(level.angles[1]>100 && level.angles[1]<300)
rotate1 = 100;
if(!(level.lastangles == (rotate0, rotate1, rotate2)))
{
flak_chase rotateto((0, rotate1, 0), 0.65);
flak_gun rotateto((rotate0, rotate1, 0), 0.65);
flak_barrel rotateto((rotate0, rotate1, 0), 0.65);
played = 0;
}
else{
if(played == 0){
flak_chase playSound("flak_stop");
played = 1;
}
}
level.lastangles = (rotate0, rotate1, rotate2);
//flak's movement vector calculation===================
origin = anglestoforward(flak_barrel.angles);
origin = (0,0,0)-origin;
shortorigin = vectorScale(origin, 350);
farorigin = vectorScale(origin, 10000);
level.gunpoint = vectorScale(origin, 230);
//flak's target aim position calculation ===============
coll_detect = bulletTrace(shortorigin, farorigin, false, undefined);
//if there is collision then there is a target to play explosion
if(!(coll_detect["fraction"] == 1)){
level.nohit = 0;
pointhit.origin = coll_detect["position"];
//pointhit.origin = vectorScale(pointhit.origin, 0.1);
//level.hit.origin is the position of the target
level.hit = pointhit;
}
else{
level.nohit=1;
}
//else there is no place to play explosion, shooting into sky
wait 0.2; //<-- loop's only wait command, !!important value!!
}
}
//==============================Custom Flak88 ends======================= |