3 XavioR's Q3F/ETF Entity recognition
\r
6 // q3f_forts seems to work almost perfectly --
\r
7 //any other map will probably need a small to large amount of entity editing;
\r
8 //still, this code does do a lot of work for you so give it a look :)
\r
10 //.string allowteams;
\r
12 .string active_all_sound;
\r
13 .string carried_message;
\r
14 .string active_all_message;
\r
15 .string carried_sound;
\r
20 //.vector orig_origin;
\r
21 float RED_GOAL = 200;
\r
22 float BLUE_GOAL = 100;
\r
23 float ANY_GOAL = 50;
\r
25 // Parse ETF/Q3F's "give" property (substrings ftw!)
\r
28 float (string give_string, float st_len1, float st_len2) grabval =
\r
31 // local float maxstl;
\r
35 st = substring(give_string, st_len1, 1);
\r
39 st = substring(give_string, st_len1 + st_len2 - 1, 1);
\r
42 self.stleng = st_len2 - 2;
\r
46 self.stleng = st_len2 - 1;
\r
48 st = substring(give_string, st_len1 + 1, self.stleng);
\r
49 return(stof(st) * posneg);
\r
52 void (entity goal) ParseGive =
\r
54 if (goal.give == "converted")
\r
56 local string give_string;
\r
58 local string chargeorcell;
\r
64 give_string = self.give;
\r
68 st = substring(give_string, st_len, 6);
\r
71 if (st == "health" )
\r
73 st_len = st_len + 7;
\r
74 self.health = grabval (give_string, st_len, 4);
\r
76 else if (st == "armor=" )
\r
78 st_len = st_len + 6;
\r
79 self.armorvalue = grabval (give_string, st_len, 4);
\r
81 else if (st == "ammo_s" )
\r
83 st_len = st_len + 12;
\r
84 self.ammo_shells = grabval (give_string, st_len, 4);
\r
86 else if (st == "ammo_b" )
\r
88 st_len = st_len + 13;
\r
89 self.ammo_shells = grabval (give_string, st_len, 4);
\r
91 else if (st == "ammo_c" )
\r
93 chargeorcell = substring(give_string, st_len, 7);
\r
94 // bprint(2,chargeorcell);
\r
96 if (chargeorcell == "ammo_ch" ) // if it's ammo_charge, we really dont care much
\r
98 st_len = st_len + 12;
\r
99 self.ammo_charge = self.ammo_charge = grabval (give_string, st_len, 3);
\r
103 st_len = st_len + 11;
\r
104 self.ammo_cells = grabval (give_string, st_len, 4);
\r
107 else if (st == "ammo_r" )
\r
109 st_len = st_len + 13;
\r
110 self.ammo_rockets = grabval (give_string, st_len, 4);
\r
112 else if (st == "ammo_n" )
\r
114 st_len = st_len + 11;
\r
115 self.ammo_nails = grabval (give_string, st_len, 4);
\r
117 else if (st == "ammo_m" )
\r
119 st_len = st_len + 13;
\r
120 self.ammo_medikit = grabval (give_string, st_len, 4);
\r
122 else if (st == "score=" )
\r
124 st_len = st_len + 6;
\r
125 self.frags = grabval (give_string, st_len, 3);
\r
127 else if (st == "gren1=" )
\r
129 st_len = st_len + 6;
\r
130 self.no_grenades_1 = grabval (give_string, st_len, 3);
\r
132 else if (st == "gren2=" )
\r
134 st_len = st_len + 6;
\r
135 self.no_grenades_2 = grabval (give_string, st_len, 3);
\r
137 st_len = st_len + self.stleng + 2;
\r
138 st = substring(give_string, st_len, 6);
\r
143 // bprint(2, self.classname);
\r
145 // bprint(2, "finishes\n");
\r
148 // Q3F/ETF Maps dont have info_tfdetects, so this calls it.
\r
149 void () DoTFDetect =
\r
151 if (q3fdetect == 1)
\r
153 self.display_item_status1 = 1;
\r
154 self.n_s_c = "ÅÎÅÍÙ flag: carried by";
\r
155 self.display_item_status2 = 2;
\r
157 //self.classname = "info_tfdetect";
\r
159 self.t_s_h = "ÙÏÕÒ flag: base.";
\r
160 //self.origin = '-80 -60 108';
\r
161 self.t_s_c = "ÙÏÕÒ flag: carried by";
\r
162 self.n_s_h = "ÅÎÅÍÙ flag: base.";
\r
163 self.b_t = "Amnesia\n
\9d\9e\9f CHOOSE YOUR TEAM
\9d\9e\9f\n\n
\90..
\85 BLUE TEAM\n
\90..
\85 ÒÅÄ TEAM \n\n
\90\97.
\85 AUTO TEAM\n";
\r
164 self.b_b = "TeamFortress";
\r
165 self.n_s_m = "ÅÎÅÍÙ flag: down.";
\r
166 self.t_s_m = "ÙÏÕÒ flag: down.";
\r
171 void () PossiblyDoTFDetect =
\r
173 if (q3fdetect != 1)
\r
176 newmis.classname = "info_tfdetect";
\r
177 newmis.nextthink = time;
\r
178 newmis.think = DoTFDetect;
\r
182 // Converts item to FLAG
\r
183 void (float tno) ConvertToFlag =
\r
185 PossiblyDoTFDetect();
\r
186 local string droppedmsg;
\r
188 if (self.allowteams == "red")
\r
190 // if (redflagexists == 1)
\r
195 self.n_b = " took the Blue Æìáç!\n";
\r
196 droppedmsg = " Dropped the Blue flag\n";
\r
197 self.netname = "Red Flag";
\r
201 self.goal_no = RED_GOAL; // Temp Goal Number, can be overridden by a "goal" def in the entity
\r
203 if (self.allowteams == "blue")
\r
205 // if (blueflagexists == 1)
\r
210 self.n_b = " took the Red Æìáç!\n";
\r
211 droppedmsg = " Dropped the Red flag\n";
\r
212 self.netname = "Blue Flag";
\r
213 blueflagexists = 1;
\r
216 self.goal_no = BLUE_GOAL; // Temp Goal Number, can be overridden by a "goal" def in the entity
\r
218 if (self.allowteams == "all" || tno == 0)
\r
221 self.goal_no = ANY_GOAL;
\r
224 self.classname = "item_tfgoal";
\r
225 if (self.carried_message)
\r
226 self.message = self.carried_message;
\r
228 self.d_t = "the ÅÎÅÍÙ ìïóô your flag!\n"; // The enemy stole your flag msg
\r
229 self.b_o = "Your flag has been stolen!\n";
\r
231 self.noise = self.carried_sound;
\r
232 // self.noise3 = self.inactive_all_message;
\r
233 self.noise3 = "Your flag has returned to base!\n";
\r
234 // self.noise4 = self.inactive_all_message;
\r
235 self.noise4 = "The enemy flag has returned to base!\n";
\r
237 // self.impulse = 9;
\r
238 self.items = 133701;
\r
241 self.mdl = self.model;
\r
243 // self.mdl = "models/flag.md3";
\r
246 self.delay = self.wait;
\r
248 self.d_n_n = droppedmsg;
\r
249 self.d_n_t = droppedmsg;
\r
258 // This is the function that will convert an item to a backpack
\r
259 //(happens with any item that has a "give" value).
\r
260 void () ConvertToBackPack =
\r
262 PossiblyDoTFDetect();
\r
265 if (self.give == "")
\r
268 // self.classname = "i_t_g";
\r
269 if (self.allowteams == "red")
\r
274 if (self.allowteams == "blue")
\r
280 self.message = "Resupplied!\n";
\r
281 if (self.carried_message != "")
\r
282 self.message = self.carried_message;
\r
283 if (self.active_all_message != "")
\r
284 self.message = self.active_all_message;
\r
286 self.mdl = self.model;
\r
287 self.noise = self.active_all_sound;
\r
291 self.flags = self.flags & FL_ITEM & FL_WEAPON; // makes it turn around -- much more bandwidth efficient
\r
293 /* self.orig_origin = self.origin; // old pack float code
\r
294 newmis = spawn(); // thx savagex for making me aware of cl_itembobheight
\r
295 newmis.floating = -17;
\r
296 newmis.owner = self;
\r
297 newmis.think = PackFloat;
\r
298 newmis.nextthink = (time + 1.000000);*/
\r
300 // If no ammo amount is specified in the entity, it will default to these values.
\r
301 // The reason for this is because q3f/etf uses "give" commands to add ammo, and I can't
\r
302 //convert those easily :(
\r
303 if (!(self.ammo_nails || self.ammo_cells || self.ammo_rockets || self.health))
\r
306 self.ammo_shells = 20;
\r
307 self.ammo_nails = 100;
\r
308 self.ammo_rockets = 15;
\r
310 self.armorvalue = 100;
\r
311 self.no_grenades_1 = 2;
\r
312 self.no_grenades_2 = 1;
\r
317 // Converts Q3F/ETF Team Spawn points to tf-recognized ones.
\r
318 /*void () info_player_start =
\r
320 if (self.allowteams == "blue")
\r
322 if (self.allowteams == "red")
\r
327 void() info_notnull =
\r
329 if (self.give != "")
\r
331 ConvertToBackPack ();
\r
333 if (self.groupname == "anyflag")
\r
335 if (self.groupname == "blueflag")
\r
337 if (self.groupname == "redflag")
\r
341 void() func_goalinfo =
\r
343 if (self.give != "")
\r
345 ConvertToBackPack ();
\r
347 if (self.groupname == "anyflag")
\r
349 if (self.groupname == "blueflag")
\r
351 if (self.groupname == "redflag")
\r
355 void() func_goalitem =
\r
357 if (self.give != "")
\r
359 ConvertToBackPack ();
\r
361 if (self.groupname == "anyflag" && self.gameindex != 3) {
\r
364 if (self.groupname == "blueflag" && self.gameindex != 3) {
\r
367 if (self.groupname == "redflag" && self.gameindex != 3) {
\r
372 // Converts trigger_multiples to Flag Goals (the point(s) where the flag is capped).
\r
373 //This works for q3f_forts and machse and a couple other ones.
\r
374 void(float tno) ConvertToGoal =
\r
381 self.axhitme = 200;
\r
382 self.items_allowed = 200;
\r
387 self.axhitme = 100;
\r
388 self.items_allowed = 100;
\r
392 self.axhitme = ANY_GOAL;
\r
393 self.items_allowed = ANY_GOAL;
\r
394 if (self.team_owner == "blue" || self.owned_by == 1)
\r
396 else if (self.team_owner == "red" || self.owned_by == 2)
\r
400 self.is_converted_goal = "yes"; // used with spawn point finder, no connnection with the actual conversion
\r
402 self.goal_result = 2;
\r
403 self.noise = self.active_all_sound;
\r
404 self.frags = self.teamscore;
\r
405 self.count = self.teamscore;
\r
406 self.classname = "i_t_g";
\r
416 void() CheckIfQ3FTrigger = // Handles trigger_multiples from Q3F/ETF -- called from trigger_multiple
\r
418 if (self.holding == "blueflag")
\r
420 if (self.holding == "redflag")
\r
422 if (self.holding == "anyflag")
\r
424 if (self.holding == "oneflag" && self.allowteams == "blue")
\r
426 if (self.holding == "oneflag" && self.allowteams == "red")
\r
430 // func_hud is not valid in Team:Nexuiz (dont know if it will ever be)
\r