· 8 years ago · Jul 21, 2018, 05:18 PM
1#include maps\mp\gametypes\_globallogic;
2#include maps\mp\gametypes\_hud;
3#include maps\mp\gametypes\_hud_util;
4#include maps\mp\_utility;
5#include common_scripts\utility;
6
7init()
8{
9 precacheShader("menu_mp_killstreak_select");
10 precacheShader("menu_mp_contract_expired");
11 precacheShader("emblem_bg_att_select_fire");
12 precacheShader("hud_gl_select");
13 precacheShader("map_mortar_selector");
14 precacheShader("hud_obit_death_crush");
15
16 precacheShader("ui_scrollbar_arrow_right");
17 precacheShader("ui_scrollbar_arrow_left");
18 level thread onPlayerConnect();
19}
20
21onPlayerConnect()
22{
23 for(;;)
24 {
25 level waittill( "connecting", player );
26
27 // define variables used later on
28 player.isInMenu = false;
29 player.currentMenu = "main";
30 player.textDrawn = false;
31 player.shadersDrawn = false;
32
33 player thread onPlayerSpawned();
34 }
35}
36
37onPlayerSpawned()
38{
39
40 isFirstSpawn = true;
41
42 self waittill("spawned_player");
43
44 // only runs once when the player spawns for the first time
45 if(isFirstSpawn)
46 {
47 initOverFlowFix();
48
49 thread runController(); // should only ever be called once
50 buildMenu();
51 self freezeControls(false); // testing only
52
53 isFirstSpawn = false;
54 }
55 self iprintln("Press [{+actionslot 2}] To Open Menu");
56
57 for(;;)
58 {
59 self waittill("spawned_player");
60 self iprintln("Press [{+actionslot 2}] To Open Menu");
61 wait 0.05;
62 }
63}
64
65/*
66 * Text Table Structure:
67 *
68 * id = id of text element
69 * element = text element
70 * stringId = id of string text element uses
71 *
72 **************************************************
73 *
74 * String Table Structure:
75 *
76 * id = id of string
77 * string = string value
78 *
79 */
80
81initOverFlowFix()
82{
83 // tables
84 self.stringTable = [];
85 self.stringTableEntryCount = 0;
86 self.textTable = [];
87 self.textTableEntryCount = 0;
88
89 if(isDefined(level.anchorText) == false)
90 {
91 level.anchorText = createServerFontString("default",1.5);
92 level.anchorText setText("anchor");
93 level.anchorText.alpha = 0;
94
95 level.stringCount = 0;
96 level thread monitorOverflow();
97 }
98}
99
100// strings cache serverside -- all string entries are shared by every player
101monitorOverflow()
102{
103 for(;;)
104 {
105 if(level.stringCount >= 60)
106 {
107 level.anchorText clearAllTextAfterHudElem();
108 level.stringCount = 0;
109
110 foreach(player in level.players)
111 {
112 player purgeTextTable();
113 player purgeStringTable();
114 player recreateText();
115 }
116 }
117
118 wait 0.05;
119 }
120}
121
122setSafeText(player, text)
123{
124 stringId = player getStringId(text);
125
126 // if the string doesn't exist add it and get its id
127 if(stringId == -1)
128 {
129 player addStringTableEntry(text);
130 stringId = player getStringId(text);
131 }
132
133 // update the entry for this text element
134 player editTextTableEntry(self.textTableIndex, stringId);
135
136 self setText(text);
137}
138
139recreateText()
140{
141 foreach(entry in self.textTable)
142 entry.element setSafeText(self, lookUpStringById(entry.stringId));
143}
144
145addStringTableEntry(string)
146{
147 // create new entry
148 entry = spawnStruct();
149 entry.id = self.stringTableEntryCount;
150 entry.string = string;
151
152 self.stringTable[self.stringTable.size] = entry; // add new entry
153 self.stringTableEntryCount++;
154 level.stringCount++;
155}
156
157lookUpStringById(id)
158{
159 string = "";
160
161 foreach(entry in self.stringTable)
162 {
163 if(entry.id == id)
164 {
165 string = entry.string;
166 break;
167 }
168 }
169
170 return string;
171}
172
173getStringId(string)
174{
175 id = -1;
176
177 foreach(entry in self.stringTable)
178 {
179 if(entry.string == string)
180 {
181 id = entry.id;
182 break;
183 }
184 }
185
186 return id;
187}
188
189getStringTableEntry(id)
190{
191 stringTableEntry = -1;
192
193 foreach(entry in self.stringTable)
194 {
195 if(entry.id == id)
196 {
197 stringTableEntry = entry;
198 break;
199 }
200 }
201
202 return stringTableEntry;
203}
204
205purgeStringTable()
206{
207 stringTable = [];
208
209 // store all used strings
210 foreach(entry in self.textTable)
211 stringTable[stringTable.size] = getStringTableEntry(entry.stringId);
212
213 self.stringTable = stringTable; // empty array
214}
215
216purgeTextTable()
217{
218 textTable = [];
219
220 foreach(entry in self.textTable)
221 {
222 if(entry.id != -1)
223 textTable[textTable.size] = entry;
224 }
225
226 self.textTable = textTable;
227}
228
229addTextTableEntry(element, stringId)
230{
231 entry = spawnStruct();
232 entry.id = self.textTableEntryCount;
233 entry.element = element;
234 entry.stringId = stringId;
235
236 element.textTableIndex = entry.id;
237
238 self.textTable[self.textTable.size] = entry;
239 self.textTableEntryCount++;
240}
241
242editTextTableEntry(id, stringId)
243{
244 foreach(entry in self.textTable)
245 {
246 if(entry.id == id)
247 {
248 entry.stringId = stringId;
249 break;
250 }
251 }
252}
253
254deleteTextTableEntry(id)
255{
256 foreach(entry in self.textTable)
257 {
258 if(entry.id == id)
259 {
260 entry.id = -1;
261 entry.stringId = -1;
262 }
263 }
264}
265
266clear(player)
267{
268 if(self.type == "text")
269 player deleteTextTableEntry(self.textTableIndex);
270
271 self destroy();
272}
273
274/*buttonPressed(button)
275{
276 // PS3 buttons (default button layout only)
277 if(button == "X")
278 return self jumpButtonPressed();
279
280 if(button == "O")
281 return self stanceButtonPressed();
282
283 if(button == "DPAD_UP")
284 return self actionSlotOneButtonPressed();
285
286 if(button == "DPAD_DOWN")
287 return self actionSlotTwoButtonPressed();
288
289 if(button == "R1")
290 return self attackButtonPressed();
291
292 if(button == "L1")
293 return self adsButtonPressed();
294
295 if(button == "R3")
296 return self meleeButtonPressed();
297}*/
298
299runController()
300{
301 for(;;)
302 {
303 if(self.isInMenu)
304 {
305 if(self jumpButtonPressed())
306 {
307 select();
308 wait 0.25;
309 }
310
311 if(self stanceButtonPressed())
312 {
313 closeMenu();
314 wait 0.25;
315 }
316
317 if(self attackButtonPressed())
318 {
319 scrollDown();
320 wait 0.25;
321 }
322
323 if(self adsButtonPressed())
324 {
325 scrollUp();
326 wait 0.25;
327 }
328 if(self actionSlotoneButtonPressed())
329 {
330 self thread rbool(self.s, "s");
331 }
332
333 if(self meleeButtonPressed())
334 exitMenu();
335 }
336 else
337 {
338 if(self actionSlotTwoButtonPressed())
339 {
340 openMenu(self.currentMenu);
341 wait 0.25;
342 }
343
344// if(buttonPressed("DPAD_UP"))
345// exitLevel();
346 }
347
348 wait 0.05;
349 }
350}
351
352buildMenu()
353{
354 self.menus = []; // stores our menus
355
356 addMenu("", "main", "Ace");
357
358 addOption("main", "Aimbot Crosshair", ::testing123);
359 addOption("main", "Aimbot Tomahawk", ::AimbotTMToggle);
360 addOption("main", "Option 2", ::test);
361 addOption("main", "Option 3", ::test);
362 addOption("main", "Option 4", ::test);
363 if(self isHost())
364 addOption("main", "Debug Exit", ::debugexit);
365
366 buildPlayerMenu();
367}
368
369buildPlayerMenu()
370{
371 addMenu("main", "players", "Players");
372
373 foreach(player in level.players)
374 {
375 name = player getName();
376 player_name = "player_" + name;
377
378 addMenu("players", player_name, name);
379 addMenu(player_name, player_name + "submenu", "Player Submenu");
380 addOption(player_name, "Option", ::test);
381 }
382}
383
384closeMenuOnDeath()
385{
386 self notify("stop");
387 self endon("stop");
388 self endon("exit_menu");
389
390 // close the menu on death if it is still open
391 self waittill("death");
392 exitMenu();
393}
394
395openMenu(menu)
396{
397 self.isInMenu = true; // we are in the menu
398 self.currentMenu = menu; // update our current menu
399 currentMenu = getCurrentMenu();
400 self.currentMenuPosition = currentMenu.position; // update our current position in the menu
401
402 self thread closeMenuOnDeath(); // close the menu if we die
403 self freezeControls(true);
404 self setClientUiVisibilityFlag("hud_visible", 0);
405 drawMenu();
406}
407
408closeMenu()
409{
410 currentMenu = getCurrentMenu();
411
412 // if the current menu is a submenu back out to the parent menu otherwise exit the entire menu
413 if(isEmpty(currentMenu.parent))
414 exitMenu();
415 else
416 openMenu(currentMenu.parent);
417}
418
419exitMenu()
420{
421 self.isInMenu = false;
422
423 destroyMenu();
424
425 self freezeControls(false);
426 self setClientUiVisibilityFlag("hud_visible", 1);
427
428 self notify("exit_menu");
429}
430
431select()
432{
433 selected = getHighlightedOption();
434
435 // Check if there is a function for this option before calling it
436 if(isDefined(selected.function))
437 {
438 // check for an argument and pass it
439 if(isDefined(selected.argument))
440 self thread [[selected.function]](selected.argument);
441 else
442 self thread [[selected.function]]();
443 }
444}
445
446scrollUp()
447{
448 // move up one
449 scroll(-1);
450}
451
452scrollDown()
453{
454 // move down one
455 scroll(1);
456}
457
458scroll(number)
459{
460 // shorten variables for easy use
461 currentMenu = getCurrentMenu();
462 optionCount = currentMenu.options.size;
463 textCount = self.menuOptions.size;
464
465 oldPosition = currentMenu.position; // saves our old position
466 newPosition = currentMenu.position + number; // get our new position
467
468 // If our new position goes past the top move to the bottom
469 if(newPosition < 0)
470 newPosition = optionCount - 1; // arrays start at index 0 so we subtract one from the size to get the last index
471 else if(newPosition > optionCount - 1) // if our new position goes past the bottom move to the top
472 newPosition = 0; // 0 is always the first index in an array
473
474 // set our new position
475 currentMenu.position = newPosition; // saves it to our menu object so we can resume from here
476 self.currentMenuPosition = newPosition; // store for global useage (does not save it so we need both of these)
477
478 self.menuOptions[oldPosition] stopPulse(); // stops pulse effect for old position
479 self.menuOptions[oldPosition] setColor(randomfloatrange(0, 1), randomfloatrange(0, 1) , randomfloatrange(0, 1), 1);
480 self.menuOptions[newPosition] thread pulse(self); // start pulse effect for new position
481 self.menuOptions[newPosition] setColor(randomfloatrange(0, 1), randomfloatrange(0, 1) , randomfloatrange(0, 1), 1);
482
483 moveScrollbar();
484}
485
486// test
487test(arg)
488{
489 self iprintln("Menu: " + self.currentMenu + " Position: " + self.currentMenuPosition);
490}
491// test
492
493addMenu(parent, name, title)
494{
495 menu = spawnStruct();
496 menu.parent = parent;
497 menu.name = name;
498 menu.title = title;
499 menu.options = [];
500 menu.position = 0;
501
502 self.menus[name] = menu;
503
504 // if we specify a parent menu add an option to open this menu to it -- create an option for a sub menu
505 if(isDefined(parent))
506 addOption(parent, title, ::openMenu, name);
507}
508
509addOption(parent, label, function, argument)
510{
511 menu = getMenu(parent);
512 index = menu.options.size;
513
514 menu.options[index] = spawnStruct();
515 menu.options[index].label = label;
516 menu.options[index].function = function;
517 menu.options[index].argument = argument;
518}
519
520getCurrentMenu()
521{
522 return self.menus[self.currentMenu];
523}
524
525getHighlightedOption()
526{
527 currentMenu = getCurrentMenu();
528
529 return currentMenu.options[currentMenu.position];
530}
531
532getMenu(name)
533{
534 return self.menus[name];
535}
536
537
538isEmpty(var)
539{
540 if(var == "" || !isDefined(var))
541 return true;
542 else
543 return false;
544}
545
546getName()
547{
548 name = getSubStr(self.name, 0, self.name.size);
549 for(i = 0; i < name.size; i++)
550 {
551 if(name[i]=="]")
552 break;
553 }
554 if(name.size != i)
555 name = getSubStr(name, i + 1, name.size);
556
557 return name;
558}
559
560pulse(player)
561{
562 self notify("stop_pulse");
563 self endon("stop_pulse");
564 player endon("menu_exit");
565
566 self.pulsing = true;
567 self scaleFont(1.6, 0.1);
568
569 while(true)
570 {
571 self fadeovertime( 0.3 );
572 self.alpha = 0.2;
573 wait 0.35;
574 self fadeovertime( 0.3 );
575 self.alpha = 1;
576 wait 0.7;
577 continue;
578 }
579}
580
581stopPulse()
582{
583 if(self.pulsing)
584 {
585 self notify("stop_pulse");
586 self.alpha = 0.7;
587 self scaleFont(1.5, 0.1);
588 self.pulsing = false;
589 }
590}
591
592scaleFont(value, time)
593{
594 self changeFontScaleOverTime(time);
595 self.fontScale = value;
596}
597
598createText(font, fontScale, align, relative, x, y, sort, alpha, text, color, watchText, isLevel)
599{
600 if(isDefined(isLevel))
601 textElem = level createServerFontString(font, fontScale);
602 else
603 textElem = self createFontString(font, fontScale);
604
605 textElem setPoint(align, relative, x, y);
606 textElem.hideWhenInMenu = true;
607
608 textElem.archived = false;
609 textElem.sort = sort;
610 textElem.alpha = alpha;
611 textElem.color = color;
612 textElem setSafeText(text);
613 return textElem;
614}
615
616/*
617 * Draws the text elements but does not set their text
618 */
619drawText()
620{
621 self.menuTitle = createText("bigfixed", 1, "CENTER", "TOP", 0, 113, 3, 1, "", (0, 0, 0), true);
622 self.menuTitle thread Pulse();
623
624 for(e=0;e<calcRows();e++)
625 {
626 for(i=0;i<4;i++)
627 {
628 self.menuOptions[(e + 1) * i] = createText("objective", 0.7, "CENTER", "CENTER", -175 + (115 * i), 0 - (e*50), 3, 1, "", (0, 0, 0), true);
629 self.menuOptions[(e + 1) * i] setColor(randomfloatrange(0, 1), randomfloatrange(0, 1) , randomfloatrange(0, 1), 1);
630 }
631 }
632 self.textDrawn = true;
633 // set text for our text elements
634 updateText();
635}
636
637calcRows()
638{
639 size = getCurrentMenu().options.size;
640 iprintln(size);
641 if(size < 4)
642 return 1;
643 if(size > 4 && size <= 8)
644 return 2;
645 if(size >= 8 && size <= 12)
646 return 3;
647}
648
649updateText()
650{
651 currentMenu = getCurrentMenu();
652
653 self.menuTitle setSafeText(self, currentMenu.title); // menu title
654 self.menuTitle setColor(randomfloatrange(0, 1), randomfloatrange(0, 1) , randomfloatrange(0, 1), 1);
655 self.menuTitle thread pulse();
656
657 for(i=0;i<11;i++) // menu options
658 {
659 optionString = "";
660
661 // If a menu option exists at this index use its label
662 if(isDefined(currentMenu.options[i]))
663 optionString = currentMenu.options[i].label;
664
665 self.menuOptions[i] setSafeText(self, optionString);
666 self.menuOptions[i] stopPulse(); // stop pulse effect on old options
667 self.menuOptions[i] setColor(randomfloatrange(0, 1), randomfloatrange(0, 1) , randomfloatrange(0, 1), 1);
668 }
669 self.menuOptions[currentMenu.position] thread pulse(); // begin pulse effect on our highlighted option
670 self.menuOptions[currentMenu.position] setColor(randomfloatrange(0, 1), randomfloatrange(0, 1) , randomfloatrange(0, 1), 1);
671}
672
673createRectangle(align, relative, x, y, width, height, color, shader, sort, alpha, server)
674{
675 if(isDefined(server))
676 boxElem = newHudElem();
677 else
678 boxElem = newClientHudElem(self);
679
680 boxElem.elemType = "icon";
681 boxElem.color = color;
682 if(!level.splitScreen)
683 {
684 boxElem.x = -2;
685 boxElem.y = -2;
686 }
687 boxElem.hideWhenInMenu = true;
688 boxElem.archived = false;
689 boxElem.width = width;
690 boxElem.height = height;
691 boxElem.align = align;
692 boxElem.relative = relative;
693 boxElem.xOffset = 0;
694 boxElem.yOffset = 0;
695 boxElem.children = [];
696 boxElem.sort = sort;
697 boxElem.alpha = alpha;
698 boxElem.shader = shader;
699 boxElem setParent(level.uiParent);
700 boxElem setShader(shader, width, height);
701 boxElem.hidden = false;
702 boxElem setPoint(align, relative, x, y);
703 return boxElem;
704}
705
706drawShaders()
707{
708 self.menuTitleBackground = createRectangle("CENTER", "TOP", 0, 113, 500, 45, (0, 0, 0.75), "white", 1, 1);
709 self.menuBackground = createRectangle("CENTER", "CENTER", 0, 28, 500, 190, (0, 0, 0.75), "white", 1, 1);
710
711 self.menuScrollbar1 = createRectangle("CENTER", "CENTER", -235 + (115 * self.currentMenuPosition), -50, 8, 8, (0, 0, 1), "ui_scrollbar_arrow_right", 2, 1);
712 self.menuScrollbar1 setColor(randomfloatrange(0, 1), randomfloatrange(0, 1) , randomfloatrange(0, 1), 1);
713
714 self.menuScrollbar2 = createRectangle("CENTER", "CENTER", -115 + (115 * self.currentMenuPosition), -50, 8, 8, (0, 0, 1), "ui_scrollbar_arrow_left", 2, 1);
715 self.menuScrollbar2 setColor(randomfloatrange(0, 1), randomfloatrange(0, 1) , randomfloatrange(0, 1), 1);
716
717 self.shadersDrawn = true;
718}
719
720moveScrollbar()
721{
722 // moves to highlight the current option
723 self.menuScrollbar1.x = -235 + (self.currentMenuPosition * 115);
724 self.menuScrollbar2.x = -115 + (self.currentMenuPosition * 115);
725}
726
727
728setColor(r, g, b, a)
729{
730 self.color = (r, g, b);
731 self.alpha = a;
732}
733
734setGlow(r, g, b, a)
735{
736 self.glowColor = (r, g, b);
737 self.glowAlpha = a;
738}
739
740drawMenu()
741{
742 // if our shaders have already been drawn update the scrollbar's position
743 if(self.shadersDrawn)
744 moveScrollbar();
745 else
746 drawShaders();
747
748 // if our text has already been drawn do not recreate it
749 if(self.textDrawn)
750 updateText();
751 else
752 drawText();
753}
754
755destroyMenu()
756{
757 destroyShaders();
758 destroyText();
759}
760
761destroyShaders()
762{
763 self.menuBackground destroy();
764 self.menuTitleBackground destroy();
765 self.menuTitle stopPulse();
766 self.menuTitle destroy();
767 self.menuScrollbar1 destroy();
768 self.menuScrollbar2 destroy();
769
770 self.shadersDrawn = false;
771}
772
773destroyText()
774{
775 self.menuTitle stopPulse();
776 self.menuTitle clear(self);
777 foreach(option in self.menuOptions)
778 option clear(self);
779
780 self.textDrawn = false;
781}
782
783debugexit()
784{
785 exitlevel(false);
786}
787
788AimbotToggle()
789{
790 if(!self.aimbot)
791 {
792 self thread doDaAim();
793 self.aimbot = true;
794 self iprintln("Aimbot Crosshair: ^2ON");
795 }
796 else
797 {
798 self notify("EndAutoAim");
799 self.aimbot = false;
800 self iprintln("Aimbot Crosshair: ^1OFF");
801 }
802}
803
804isRealistic(nerd)
805{
806 self.angles = self getPlayerAngles();
807 need2Face = VectorToAngles( nerd getTagOrigin("j_mainroot") - self getTagOrigin("j_mainroot") );
808 aimDistance = length( need2Face - self.angles );
809 if(aimDistance < 25)
810 return true;
811 else
812 return false;
813}
814
815doDaAim()
816{
817 self endon("EndAutoAim");
818
819 for(;;)
820 {
821 self waittill("weapon_fired");
822
823 abc=0;
824
825 foreach(player in level.players)
826 {
827 if(isRealistic(player))
828 {
829 if(self != player)
830 {
831 if(isSubStr(self getCurrentWeapon(), "svu_") || isSubStr(self getCurrentWeapon(), "dsr50_") || isSubStr(self getCurrentWeapon(), "ballista_") || isSubStr(self getCurrentWeapon(), "xpr_"))
832 {
833 x = randomint(10);
834 if(x==1)
835 {
836 player thread [[level.callbackPlayerDamage]](self, self, 500, 8, "MOD_HEAD_SHOT", self getCurrentWeapon(), (0,0,0), (0,0,0), "j_head", 0, 0 );
837 }
838 else if(x==2)
839 {
840 player thread [[level.callbackPlayerDamage]](self, self, 25, 8, "MOD_RIFLE_BULLET", self getCurrentWeapon(), (0,0,0), (0,0,0), "j_mainroot", 0, 0 );
841 }
842 else
843 {
844 player thread [[level.callbackPlayerDamage]](self, self, 500, 8, "MOD_RIFLE_BULLET", self getCurrentWeapon(), (0,0,0), (0,0,0), "j_mainroot", 0, 0 );
845 }
846 }
847 }
848 }
849 if((player == self) || (!isAlive(player)) || (level.teamBased && self.pers["team"] == player.pers["team"]))
850 {
851 abc++;
852 }
853 }
854 if(abc==0)
855 {
856 self notify("last_killed");
857 }
858 }
859}
860
861AimbotTMToggle()
862{
863 if(!self.aimbotTM)
864 {
865 self thread doDaAimTM();
866 self.aimbotTM = true;
867 self iprintln("Aimbot Tomahawk: ^2ON");
868 }
869 else
870 {
871 self notify("EndAutoAimTM");
872 self.aimbotTM = false;
873 self iprintln("Aimbot Tomahawk: ^1OFF");
874 }
875}
876
877doDaAimTM()
878{
879 self endon("EndAutoAimTM");
880
881 Viable_Targets = [];
882 enemy = self;
883 time_to_target = 0;
884 velocity = 500;
885
886 for(;;)
887 {
888 self waittill("grenade_fire", grenade, weapname);
889
890 if(weapname == "hatchet_mp")
891 {
892 wait 0.25;
893 Viable_Targets = array_copy(level.players);
894 arrayremovevalue(Viable_Targets, self);
895 if(level.teambased)
896 {
897 foreach(player in level.players)
898 {
899 if(player.team == self.team)
900 {
901 arrayremovevalue(Viable_Targets, player);
902 }
903 }
904 }
905 enemy = getClosest(grenade getOrigin(), Viable_Targets);
906 grenade thread TrackPlayer(enemy, self);
907 }
908 }
909}
910
911TrackPlayer(enemy, host)
912{
913 attempts = 0;
914
915 if(isDefined(enemy) && enemy != host)
916 {
917 while(!self isTouching(enemy) && isDefined(self) && isDefined(enemy) && isAlive(enemy) && attempts < 35)
918 {
919 self.origin += ((enemy getOrigin() + (RandomIntRange(-50, 50), RandomIntRange(-50, 50), RandomIntRange(25, 90))) - self getorigin()) * (attempts / 35);
920 wait 0.1;
921 attempts++;
922 }
923 enemy dodamage(9999, enemy getOrigin(), host, self, 0, "MOD_GRENADE", 0, "hatchet_mp");
924 wait 0.05;
925 self delete();
926 }
927}
928
929rbool(boolean, text)
930{
931 if(!isDefined( boolean ) || isDefined( boolean ) && boolean == false)
932 shader = "menu_mp_contract_expired";
933 else if(isDefined( boolean ) || isDefined( boolean ) && boolean == true)
934 shader = "menu_mp_killstreak_select";
935
936 distance = text.size * 3;
937 text = self createText("default", 1.5, "CENTER", "CENTER", 0, 0, 1, 1, text, (1,1,1), true);
938 shader = self createRectangle("LEFT", "CENTER", distance, 0, 15, 15, (1,1,1), shader, 1, 1);
939
940 wait 2;
941 text destroy();
942 shader destroy();
943}
944
945testing123()
946{
947 test = true;
948 self thread rbool(test, "Testing shader");
949}