From ea6291c0736dcc10e08821e78df3764185093944 Mon Sep 17 00:00:00 2001 From: Bitl Date: Wed, 11 Dec 2019 13:21:14 -0700 Subject: [PATCH] prepping for 1.0 --- NovetusLauncher/NovetusCMD/Program.cs | 53 +- NovetusLauncher/NovetusFuncs/ClientScript.cs | 4 +- NovetusLauncher/NovetusFuncs/GlobalVars.cs | 15 +- NovetusLauncher/NovetusLauncher/ServerInfo.cs | 75 +- clients/2011E/content/fonts/libraries.rbxm | 6185 -------------- .../2011M/content/fonts/Arial-18pt.fontdef | 101 + clients/2011M/content/fonts/Arial-18pt.png | Bin 0 -> 19028 bytes .../2011M/content/fonts/Arial-48pt.fontdef | 101 + clients/2011M/content/fonts/Arial-48pt.png | Bin 0 -> 62749 bytes .../content/fonts/ArialBold-18pt.fontdef | 101 + .../2011M/content/fonts/ArialBold-18pt.png | Bin 0 -> 19346 bytes .../content/fonts/ArialBold-48pt.fontdef | 101 + .../2011M/content/fonts/ArialBold-48pt.png | Bin 0 -> 64156 bytes .../fonts/CompositFullAtlasBaseTexture.mesh | Bin 0 -> 193 bytes .../CompositFullAtlasOverlayTexture.mesh | Bin 0 -> 193 bytes .../content/fonts/CompositLeftArmBase.mesh | Bin 0 -> 28921 bytes .../content/fonts/CompositLeftLegBase.mesh | Bin 0 -> 28921 bytes .../content/fonts/CompositPantsTemplate.mesh | Bin 0 -> 43201 bytes .../content/fonts/CompositRightArmBase.mesh | Bin 0 -> 28585 bytes .../content/fonts/CompositRightLegBase.mesh | Bin 0 -> 28585 bytes .../content/fonts/CompositShirtTemplate.mesh | Bin 0 -> 43201 bytes .../2011M/content/fonts/CompositTShirt.mesh | Bin 0 -> 193 bytes .../content/fonts/CompositTorsoBase.mesh | Bin 0 -> 28921 bytes .../2011M/content/fonts/Legacy-18pt.fontdef | 103 + clients/2011M/content/fonts/Legacy-18pt.png | Bin 0 -> 19379 bytes .../2011M/content/fonts/Legacy-64pt.fontdef | 101 + clients/2011M/content/fonts/Legacy-64pt.png | Bin 0 -> 88533 bytes clients/2011M/content/fonts/Rocket.rbxm | 102 + .../2011M/content/fonts/SlingshotPellet.rbxm | 82 + clients/2011M/content/fonts/character.rbxm | 527 ++ clients/2011M/content/fonts/comics.fnt | Bin 0 -> 15248 bytes clients/2011M/content/fonts/diogenes.fnt | 438 + .../2011M/content/fonts/humanoidAnimate.rbxm | 296 + .../content/fonts/humanoidAnimateLocal.rbxm | 318 + .../2011M/content/fonts/humanoidExtra.rbxm | 11 + .../2011M/content/fonts/humanoidHealth.rbxm | 191 + .../2011M/content/fonts/humanoidSound.rbxm | 76 + .../2011M/content/fonts/humanoidStatic.rbxm | 12 + clients/2011M/content/fonts/leftarm.mesh | Bin 0 -> 2065 bytes clients/2011M/content/fonts/leftleg.mesh | Bin 0 -> 2065 bytes clients/2011M/content/fonts/libraries.rbxm | 7208 +++++++++++++++++ clients/2011M/content/fonts/rightarm.mesh | Bin 0 -> 2065 bytes clients/2011M/content/fonts/rightleg.mesh | Bin 0 -> 2065 bytes clients/2011M/content/fonts/safechat.xml | 737 ++ clients/2011M/content/fonts/torso.mesh | Bin 0 -> 2065 bytes clients/2011M/content/music/bass.wav | Bin 0 -> 6380 bytes clients/2011M/content/music/ufofly.wav | Bin 0 -> 34442 bytes .../content/particles/explosion.particle | 192 + .../content/particles/explosionMat.material | 65 + clients/2011M/content/particles/fire.particle | 59 + .../2011M/content/particles/fireMat.material | 22 + .../content/particles/forceFieldBeam.particle | 55 + .../particles/forceFieldRadial.particle | 51 + clients/2011M/content/particles/glow.material | 18 + .../2011M/content/particles/smoke.particle | 57 + .../2011M/content/particles/smokeMat.material | 19 + .../2011M/content/particles/sparkles.particle | 49 + .../content/particles/sparklesMat.material | 23 + .../2011M/content/scripts/CSMPFunctions.lua | 626 ++ clients/2011M/content/sky/lensflare.jpg | Bin 0 -> 8437 bytes clients/2011M/content/sky/moon-alpha.jpg | Bin 0 -> 4920 bytes clients/2011M/content/sky/moon.jpg | Bin 0 -> 7394 bytes .../2011M/content/sky/null_plainsky512_bk.jpg | Bin 0 -> 49277 bytes .../2011M/content/sky/null_plainsky512_dn.jpg | Bin 0 -> 33668 bytes .../2011M/content/sky/null_plainsky512_ft.jpg | Bin 0 -> 47691 bytes .../2011M/content/sky/null_plainsky512_lf.jpg | Bin 0 -> 43657 bytes .../2011M/content/sky/null_plainsky512_rt.jpg | Bin 0 -> 50201 bytes .../2011M/content/sky/null_plainsky512_up.jpg | Bin 0 -> 35512 bytes clients/2011M/content/sky/skyspheremap.jpg | Bin 0 -> 10480 bytes clients/2011M/content/sky/sun-rays.jpg | Bin 0 -> 4579 bytes clients/2011M/content/sky/sun.jpg | Bin 0 -> 14773 bytes clients/2011M/content/sounds/Kerplunk.wav | Bin 0 -> 2019 bytes .../2011M/content/sounds/Kid saying Ouch.wav | Bin 0 -> 3301 bytes .../content/sounds/Rubber band sling shot.wav | Bin 0 -> 9297 bytes clients/2011M/content/sounds/Rubber band.wav | Bin 0 -> 6647 bytes clients/2011M/content/sounds/SWITCH3.wav | Bin 0 -> 4628 bytes clients/2011M/content/sounds/bass.wav | Bin 0 -> 6380 bytes .../content/sounds/bfsl-minifigfoots1.mp3 | Bin 0 -> 16512 bytes .../content/sounds/bfsl-minifigfoots2.mp3 | Bin 0 -> 41088 bytes clients/2011M/content/sounds/button.wav | Bin 0 -> 2446 bytes clients/2011M/content/sounds/clickfast.wav | Bin 0 -> 460 bytes clients/2011M/content/sounds/collide.wav | Bin 0 -> 11070 bytes .../content/sounds/electronicpingshort.wav | Bin 0 -> 3798 bytes clients/2011M/content/sounds/flashbulb.wav | Bin 0 -> 1140 bytes clients/2011M/content/sounds/grass.ogg | Bin 0 -> 4518 bytes clients/2011M/content/sounds/grass2.ogg | Bin 0 -> 4692 bytes clients/2011M/content/sounds/grass3.ogg | Bin 0 -> 4744 bytes clients/2011M/content/sounds/grassstone.ogg | Bin 0 -> 4834 bytes clients/2011M/content/sounds/grassstone2.ogg | Bin 0 -> 4665 bytes clients/2011M/content/sounds/grassstone3.ogg | Bin 0 -> 4930 bytes clients/2011M/content/sounds/hit.wav | Bin 0 -> 7092 bytes clients/2011M/content/sounds/ice.ogg | Bin 0 -> 3819 bytes clients/2011M/content/sounds/ice2.ogg | Bin 0 -> 4704 bytes clients/2011M/content/sounds/ice3.ogg | Bin 0 -> 4287 bytes clients/2011M/content/sounds/icegrass.ogg | Bin 0 -> 4753 bytes clients/2011M/content/sounds/icegrass2.ogg | Bin 0 -> 4813 bytes clients/2011M/content/sounds/icegrass3.ogg | Bin 0 -> 4842 bytes clients/2011M/content/sounds/icemetal.ogg | Bin 0 -> 4520 bytes clients/2011M/content/sounds/icemetal2.ogg | Bin 0 -> 4301 bytes clients/2011M/content/sounds/icemetal3.ogg | Bin 0 -> 4560 bytes clients/2011M/content/sounds/icestone.ogg | Bin 0 -> 4602 bytes clients/2011M/content/sounds/icestone2.ogg | Bin 0 -> 4551 bytes clients/2011M/content/sounds/icestone3.ogg | Bin 0 -> 4502 bytes clients/2011M/content/sounds/metal.ogg | Bin 0 -> 4458 bytes clients/2011M/content/sounds/metal2.ogg | Bin 0 -> 4297 bytes clients/2011M/content/sounds/metal3.ogg | Bin 0 -> 4522 bytes clients/2011M/content/sounds/metalgrass.ogg | Bin 0 -> 4593 bytes clients/2011M/content/sounds/metalgrass2.ogg | Bin 0 -> 4561 bytes clients/2011M/content/sounds/metalgrass3.ogg | Bin 0 -> 4682 bytes clients/2011M/content/sounds/metalstone.ogg | Bin 0 -> 4674 bytes clients/2011M/content/sounds/metalstone2.ogg | Bin 0 -> 4532 bytes clients/2011M/content/sounds/metalstone3.ogg | Bin 0 -> 4688 bytes clients/2011M/content/sounds/pageturn.wav | Bin 0 -> 25548 bytes clients/2011M/content/sounds/plasticgrass.ogg | Bin 0 -> 4638 bytes .../2011M/content/sounds/plasticgrass2.ogg | Bin 0 -> 4739 bytes .../2011M/content/sounds/plasticgrass3.ogg | Bin 0 -> 4758 bytes clients/2011M/content/sounds/plasticice.ogg | Bin 0 -> 4663 bytes clients/2011M/content/sounds/plasticice2.ogg | Bin 0 -> 4297 bytes clients/2011M/content/sounds/plasticice3.ogg | Bin 0 -> 4608 bytes clients/2011M/content/sounds/plasticmetal.ogg | Bin 0 -> 4444 bytes .../2011M/content/sounds/plasticmetal2.ogg | Bin 0 -> 4623 bytes .../2011M/content/sounds/plasticmetal3.ogg | Bin 0 -> 4468 bytes .../2011M/content/sounds/plasticplastic.ogg | Bin 0 -> 4309 bytes .../2011M/content/sounds/plasticplastic2.ogg | Bin 0 -> 4328 bytes .../2011M/content/sounds/plasticplastic3.ogg | Bin 0 -> 4553 bytes clients/2011M/content/sounds/plasticstone.ogg | Bin 0 -> 4477 bytes .../2011M/content/sounds/plasticstone2.ogg | Bin 0 -> 4659 bytes .../2011M/content/sounds/plasticstone3.ogg | Bin 0 -> 4753 bytes clients/2011M/content/sounds/snap.wav | Bin 0 -> 2892 bytes clients/2011M/content/sounds/splat.wav | Bin 0 -> 1886 bytes clients/2011M/content/sounds/stone.ogg | Bin 0 -> 4665 bytes clients/2011M/content/sounds/stone2.ogg | Bin 0 -> 4478 bytes clients/2011M/content/sounds/stone3.ogg | Bin 0 -> 4539 bytes clients/2011M/content/sounds/switch.wav | Bin 0 -> 13498 bytes clients/2011M/content/sounds/swoosh.wav | Bin 0 -> 1726 bytes clients/2011M/content/sounds/swordlunge.wav | Bin 0 -> 15532 bytes clients/2011M/content/sounds/swordslash.wav | Bin 0 -> 12442 bytes clients/2011M/content/sounds/unsheath.wav | Bin 0 -> 28844 bytes clients/2011M/content/sounds/uuhhh.wav | Bin 0 -> 14774 bytes clients/2011M/content/sounds/victory.wav | Bin 0 -> 26680 bytes clients/2011M/content/sounds/woodgrass.ogg | Bin 0 -> 4782 bytes clients/2011M/content/sounds/woodgrass2.ogg | Bin 0 -> 4793 bytes clients/2011M/content/sounds/woodgrass3.ogg | Bin 0 -> 4643 bytes clients/2011M/content/sounds/woodice.ogg | Bin 0 -> 4132 bytes clients/2011M/content/sounds/woodice2.ogg | Bin 0 -> 4721 bytes clients/2011M/content/sounds/woodice3.ogg | Bin 0 -> 4154 bytes clients/2011M/content/sounds/woodmetal.ogg | Bin 0 -> 4401 bytes clients/2011M/content/sounds/woodmetal2.ogg | Bin 0 -> 4569 bytes clients/2011M/content/sounds/woodmetal3.ogg | Bin 0 -> 4453 bytes clients/2011M/content/sounds/woodplastic.ogg | Bin 0 -> 4146 bytes clients/2011M/content/sounds/woodplastic2.ogg | Bin 0 -> 4247 bytes clients/2011M/content/sounds/woodplastic3.ogg | Bin 0 -> 4411 bytes clients/2011M/content/sounds/woodstone.ogg | Bin 0 -> 4504 bytes clients/2011M/content/sounds/woodstone2.ogg | Bin 0 -> 4478 bytes clients/2011M/content/sounds/woodstone3.ogg | Bin 0 -> 4305 bytes clients/2011M/content/sounds/woodwood.ogg | Bin 0 -> 4315 bytes clients/2011M/content/sounds/woodwood2.ogg | Bin 0 -> 4195 bytes clients/2011M/content/sounds/woodwood3.ogg | Bin 0 -> 4147 bytes .../content/textures/AluminumFallback.png | Bin 0 -> 401838 bytes .../2011M/content/textures/AnchorCursor.png | Bin 0 -> 1259 bytes .../2011M/content/textures/ArrowCursor.png | Bin 0 -> 2065 bytes .../content/textures/ArrowCursorDecalDrag.png | Bin 0 -> 3056 bytes .../2011M/content/textures/ArrowFarCursor.png | Bin 0 -> 2169 bytes clients/2011M/content/textures/Blank.png | Bin 0 -> 187 bytes .../2011M/content/textures/CameraTiltDown.png | Bin 0 -> 3802 bytes .../content/textures/CameraTiltDown_dn.png | Bin 0 -> 3763 bytes .../content/textures/CameraTiltDown_ds.png | Bin 0 -> 932 bytes .../content/textures/CameraTiltDown_ovr.png | Bin 0 -> 3763 bytes .../2011M/content/textures/CameraTiltUp.png | Bin 0 -> 1929 bytes .../content/textures/CameraTiltUp_dn.png | Bin 0 -> 1878 bytes .../content/textures/CameraTiltUp_ds.png | Bin 0 -> 938 bytes .../content/textures/CameraTiltUp_ovr.png | Bin 0 -> 1878 bytes .../2011M/content/textures/CameraZoomIn.png | Bin 0 -> 1942 bytes .../content/textures/CameraZoomIn_dn.png | Bin 0 -> 1891 bytes .../content/textures/CameraZoomIn_ds.png | Bin 0 -> 1008 bytes .../content/textures/CameraZoomIn_ovr.png | Bin 0 -> 1891 bytes .../2011M/content/textures/CameraZoomOut.png | Bin 0 -> 1865 bytes .../content/textures/CameraZoomOut_dn.png | Bin 0 -> 1837 bytes .../content/textures/CameraZoomOut_ds.png | Bin 0 -> 930 bytes .../content/textures/CameraZoomOut_ovr.png | Bin 0 -> 1837 bytes clients/2011M/content/textures/Chat.png | Bin 0 -> 1754 bytes clients/2011M/content/textures/Chat_dn.png | Bin 0 -> 1659 bytes clients/2011M/content/textures/Chat_ds.png | Bin 0 -> 899 bytes clients/2011M/content/textures/Chat_ovr.png | Bin 0 -> 1355 bytes clients/2011M/content/textures/Clone.png | Bin 0 -> 6269 bytes .../2011M/content/textures/CloneCursor.png | Bin 0 -> 3184 bytes .../content/textures/CloneDownCursor.png | Bin 0 -> 4755 bytes .../content/textures/CloneOverCursor.png | Bin 0 -> 3216 bytes .../content/textures/ConcreteFallback.png | Bin 0 -> 290417 bytes .../content/textures/Crinkled_Normal.dds | Bin 0 -> 262208 bytes .../2011M/content/textures/DPlate_Normal.dds | Bin 0 -> 16448 bytes .../content/textures/DiamondPlateFallback.png | Bin 0 -> 86693 bytes clients/2011M/content/textures/DragCursor.png | Bin 0 -> 2063 bytes .../2011M/content/textures/DropperCursor.png | Bin 0 -> 353 bytes clients/2011M/content/textures/Exit.png | Bin 0 -> 3119 bytes clients/2011M/content/textures/Exit_dn.png | Bin 0 -> 3081 bytes clients/2011M/content/textures/Exit_ovr.png | Bin 0 -> 3081 bytes clients/2011M/content/textures/FillCursor.png | Bin 0 -> 433 bytes .../content/textures/FirstPersonIndicator.png | Bin 0 -> 4587 bytes .../textures/FirstPersonIndicator_ds.png | Bin 0 -> 2851 bytes clients/2011M/content/textures/FlagCursor.png | Bin 0 -> 628 bytes clients/2011M/content/textures/FlatCursor.png | Bin 0 -> 595 bytes clients/2011M/content/textures/GameTool.png | Bin 0 -> 2771 bytes clients/2011M/content/textures/Grab.png | Bin 0 -> 3510 bytes clients/2011M/content/textures/GrabCursor.png | Bin 0 -> 2277 bytes .../content/textures/GrabRotateCursor.png | Bin 0 -> 2893 bytes .../2011M/content/textures/Grass_Normal.dds | Bin 0 -> 349312 bytes .../2011M/content/textures/Grass_Texture.jpg | Bin 0 -> 240819 bytes .../content/textures/Grass_Texture_gray.jpg | Bin 0 -> 170800 bytes clients/2011M/content/textures/GunCursor.png | Bin 0 -> 947 bytes .../2011M/content/textures/GunWaitCursor.png | Bin 0 -> 1935 bytes .../2011M/content/textures/HammerCursor.png | Bin 0 -> 2443 bytes .../content/textures/HammerDownCursor.png | Bin 0 -> 4001 bytes .../content/textures/HammerOverCursor.png | Bin 0 -> 2868 bytes clients/2011M/content/textures/Help.png | Bin 0 -> 2141 bytes clients/2011M/content/textures/Help_dn.png | Bin 0 -> 2053 bytes clients/2011M/content/textures/Help_ovr.png | Bin 0 -> 2053 bytes .../2011M/content/textures/HingeCursor.png | Bin 0 -> 627 bytes .../content/textures/HorizLines_normal.dds | Bin 0 -> 87536 bytes .../2011M/content/textures/IceFallback.png | Bin 0 -> 356599 bytes clients/2011M/content/textures/LockCursor.png | Bin 0 -> 788 bytes .../2011M/content/textures/MaterialCursor.png | Bin 0 -> 7456 bytes .../2011M/content/textures/MissingCursor.png | Bin 0 -> 1670 bytes .../2011M/content/textures/MotorCursor.png | Bin 0 -> 660 bytes .../content/textures/MouseLockedCursor.png | Bin 0 -> 2330 bytes .../content/textures/RecordIndicator.png | Bin 0 -> 1280 bytes .../2011M/content/textures/RecordToggle.png | Bin 0 -> 2687 bytes .../content/textures/RecordToggle_dn.png | Bin 0 -> 2659 bytes .../content/textures/RecordToggle_ds.png | Bin 0 -> 1334 bytes .../content/textures/RecordToggle_ovr.png | Bin 0 -> 2659 bytes .../content/textures/RecordToggle_sdn.png | Bin 0 -> 976 bytes .../content/textures/RecordToggle_sel.png | Bin 0 -> 976 bytes .../content/textures/RecordToggle_sovr.png | Bin 0 -> 976 bytes .../2011M/content/textures/ReportAbuse.PNG | Bin 0 -> 3218 bytes .../2011M/content/textures/ReportAbuse_dn.PNG | Bin 0 -> 3086 bytes .../2011M/content/textures/ReportAbuse_ds.PNG | Bin 0 -> 180 bytes .../content/textures/ReportAbuse_ovr.PNG | Bin 0 -> 3086 bytes .../2011M/content/textures/ReportInfected.png | Bin 0 -> 2464 bytes .../content/textures/ReportInfected_dn.png | Bin 0 -> 2464 bytes .../content/textures/ReportInfected_ds.png | Bin 0 -> 1185 bytes .../content/textures/ReportInfected_ovr.png | Bin 0 -> 2471 bytes .../2011M/content/textures/ResizeCursor.png | Bin 0 -> 552 bytes .../2011M/content/textures/RustGradient.png | Bin 0 -> 30790 bytes .../2011M/content/textures/Sand_Normal.dds | Bin 0 -> 262271 bytes clients/2011M/content/textures/Screenshot.png | Bin 0 -> 2762 bytes .../2011M/content/textures/Screenshot_dn.png | Bin 0 -> 2682 bytes .../2011M/content/textures/Screenshot_ds.png | Bin 0 -> 1320 bytes .../2011M/content/textures/Screenshot_ovr.png | Bin 0 -> 2682 bytes .../2011M/content/textures/SlateBorder.dds | Bin 0 -> 87508 bytes clients/2011M/content/textures/SlateTile.dds | Bin 0 -> 699178 bytes clients/2011M/content/textures/SlateTile.png | Bin 0 -> 525902 bytes .../2011M/content/textures/SlateTileMono.dds | Bin 0 -> 262272 bytes .../2011M/content/textures/SlateTileMono.png | Bin 0 -> 200344 bytes clients/2011M/content/textures/Smoke.png | Bin 0 -> 76837 bytes .../2011M/content/textures/SpawnCursor.png | Bin 0 -> 655 bytes .../2011M/content/textures/SpawnLocation.png | Bin 0 -> 2672 bytes clients/2011M/content/textures/Surfaces.png | Bin 0 -> 12781 bytes .../2011M/content/textures/SurfacesStrip.png | Bin 0 -> 6868 bytes .../2011M/content/textures/SurfacesTruss.png | Bin 0 -> 14733 bytes .../content/textures/ToggleFullScreen.png | Bin 0 -> 1851 bytes .../content/textures/ToggleFullScreen_dn.png | Bin 0 -> 1807 bytes .../content/textures/ToggleFullScreen_ds.png | Bin 0 -> 466 bytes .../content/textures/ToggleFullScreen_ovr.png | Bin 0 -> 1807 bytes .../2011M/content/textures/TogglePlayMode.png | Bin 0 -> 1771 bytes .../content/textures/TogglePlayMode_dn.png | Bin 0 -> 1676 bytes .../content/textures/TogglePlayMode_ds.png | Bin 0 -> 2806 bytes .../content/textures/TogglePlayMode_ovr.png | Bin 0 -> 1676 bytes .../2011M/content/textures/UnAnchorCursor.png | Bin 0 -> 1836 bytes .../2011M/content/textures/UnlockCursor.png | Bin 0 -> 798 bytes clients/2011M/content/textures/WeldCursor.png | Bin 0 -> 522 bytes .../2011M/content/textures/WoodFallback.png | Bin 0 -> 335476 bytes .../2011M/content/textures/advancedMove.png | Bin 0 -> 2784 bytes .../content/textures/advancedMoveResize.png | Bin 0 -> 3042 bytes .../content/textures/advancedMove_joint.png | Bin 0 -> 4534 bytes .../textures/advancedMove_keysOnly.png | Bin 0 -> 3824 bytes .../content/textures/advancedMove_noJoint.png | Bin 0 -> 4911 bytes .../textures/blackBkg_round_slice1.png | Bin 0 -> 255 bytes .../textures/blackBkg_round_slice2.png | Bin 0 -> 160 bytes .../textures/blackBkg_round_slice3.png | Bin 0 -> 256 bytes .../textures/blackBkg_round_slice4.png | Bin 0 -> 159 bytes .../textures/blackBkg_round_slice5.png | Bin 0 -> 923 bytes .../textures/blackBkg_round_slice6.png | Bin 0 -> 159 bytes .../textures/blackBkg_round_slice7.png | Bin 0 -> 251 bytes .../textures/blackBkg_round_slice8.png | Bin 0 -> 160 bytes .../textures/blackBkg_round_slice9.png | Bin 0 -> 249 bytes .../textures/blackBkg_square_slice1.png | Bin 0 -> 161 bytes .../textures/blackBkg_square_slice2.png | Bin 0 -> 160 bytes .../textures/blackBkg_square_slice3.png | Bin 0 -> 161 bytes .../textures/blackBkg_square_slice4.png | Bin 0 -> 159 bytes .../textures/blackBkg_square_slice5.png | Bin 0 -> 923 bytes .../textures/blackBkg_square_slice6.png | Bin 0 -> 159 bytes .../textures/blackBkg_square_slice7.png | Bin 0 -> 161 bytes .../textures/blackBkg_square_slice8.png | Bin 0 -> 160 bytes .../textures/blackBkg_square_slice9.png | Bin 0 -> 161 bytes .../chatBubble_botBlue_bkg_slice1.png | Bin 0 -> 1239 bytes .../chatBubble_botBlue_bkg_slice2.png | Bin 0 -> 271 bytes .../chatBubble_botBlue_bkg_slice3.png | Bin 0 -> 1282 bytes .../chatBubble_botBlue_bkg_slice4.png | Bin 0 -> 789 bytes .../chatBubble_botBlue_bkg_slice5.png | Bin 0 -> 921 bytes .../chatBubble_botBlue_bkg_slice6.png | Bin 0 -> 794 bytes .../chatBubble_botBlue_bkg_slice7.png | Bin 0 -> 1135 bytes .../chatBubble_botBlue_bkg_slice8.png | Bin 0 -> 268 bytes .../chatBubble_botBlue_bkg_slice9.png | Bin 0 -> 1186 bytes .../chatBubble_botBlue_notify_bkg.png | Bin 0 -> 4104 bytes .../textures/chatBubble_botBlue_tail.png | Bin 0 -> 6397 bytes .../textures/chatBubble_botBlue_tailRight.png | Bin 0 -> 4281 bytes .../chatBubble_botGreen_bkg_slice1.png | Bin 0 -> 1029 bytes .../chatBubble_botGreen_bkg_slice2.png | Bin 0 -> 259 bytes .../chatBubble_botGreen_bkg_slice3.png | Bin 0 -> 1067 bytes .../chatBubble_botGreen_bkg_slice4.png | Bin 0 -> 598 bytes .../chatBubble_botGreen_bkg_slice5.png | Bin 0 -> 921 bytes .../chatBubble_botGreen_bkg_slice6.png | Bin 0 -> 593 bytes .../chatBubble_botGreen_bkg_slice7.png | Bin 0 -> 1017 bytes .../chatBubble_botGreen_bkg_slice8.png | Bin 0 -> 263 bytes .../chatBubble_botGreen_bkg_slice9.png | Bin 0 -> 1059 bytes .../chatBubble_botGreen_notify_bkg.png | Bin 0 -> 3421 bytes .../textures/chatBubble_botGreen_tail.png | Bin 0 -> 4823 bytes .../chatBubble_botGreen_tailRight.png | Bin 0 -> 3581 bytes .../textures/chatBubble_botRed_bkg_slice1.png | Bin 0 -> 1293 bytes .../textures/chatBubble_botRed_bkg_slice2.png | Bin 0 -> 273 bytes .../textures/chatBubble_botRed_bkg_slice3.png | Bin 0 -> 1313 bytes .../textures/chatBubble_botRed_bkg_slice4.png | Bin 0 -> 879 bytes .../textures/chatBubble_botRed_bkg_slice5.png | Bin 0 -> 921 bytes .../textures/chatBubble_botRed_bkg_slice6.png | Bin 0 -> 859 bytes .../textures/chatBubble_botRed_bkg_slice7.png | Bin 0 -> 1024 bytes .../textures/chatBubble_botRed_bkg_slice8.png | Bin 0 -> 254 bytes .../textures/chatBubble_botRed_bkg_slice9.png | Bin 0 -> 1021 bytes .../textures/chatBubble_botRed_notify_bkg.png | Bin 0 -> 3220 bytes .../textures/chatBubble_botRed_tail.png | Bin 0 -> 3866 bytes .../textures/chatBubble_botRed_tailRight.png | Bin 0 -> 3628 bytes .../chatBubble_bot_notifyGray_dotDotDot.png | Bin 0 -> 2918 bytes .../textures/chatBubble_bot_notify_bang.png | Bin 0 -> 1105 bytes .../chatBubble_bot_notify_dotDotDot.png | Bin 0 -> 1033 bytes .../textures/chatBubble_bot_notify_money.png | Bin 0 -> 1500 bytes .../chatBubble_bot_notify_question.png | Bin 0 -> 1270 bytes .../textures/chatBubble_white_bkg_slice1.png | Bin 0 -> 1632 bytes .../textures/chatBubble_white_bkg_slice2.png | Bin 0 -> 259 bytes .../textures/chatBubble_white_bkg_slice3.png | Bin 0 -> 1631 bytes .../textures/chatBubble_white_bkg_slice4.png | Bin 0 -> 597 bytes .../textures/chatBubble_white_bkg_slice5.png | Bin 0 -> 934 bytes .../textures/chatBubble_white_bkg_slice6.png | Bin 0 -> 582 bytes .../textures/chatBubble_white_bkg_slice7.png | Bin 0 -> 1532 bytes .../textures/chatBubble_white_bkg_slice8.png | Bin 0 -> 254 bytes .../textures/chatBubble_white_bkg_slice9.png | Bin 0 -> 1531 bytes .../textures/chatBubble_white_notify_bkg.png | Bin 0 -> 4061 bytes .../textures/chatBubble_white_tail.png | Bin 0 -> 1579 bytes clients/2011M/content/textures/dirt.jpg | Bin 0 -> 173486 bytes clients/2011M/content/textures/explosion.png | Bin 0 -> 16172 bytes clients/2011M/content/textures/face.png | Bin 0 -> 2290 bytes clients/2011M/content/textures/fire_0.png | Bin 0 -> 20084 bytes clients/2011M/content/textures/glow.png | Bin 0 -> 58276 bytes clients/2011M/content/textures/lua.png | Bin 0 -> 64578 bytes .../content/textures/noiseL8_32x32x32.dds | Bin 0 -> 32896 bytes .../content/textures/nosurfacesAlpha.png | Bin 0 -> 729 bytes .../content/textures/nosurfacesTruss.png | Bin 0 -> 1964 bytes .../content/textures/nosurfacesTrussAlpha.png | Bin 0 -> 6039 bytes clients/2011M/content/textures/penv.dds | Bin 0 -> 262352 bytes .../2011M/content/textures/rust_combined.png | Bin 0 -> 184988 bytes clients/2011M/content/textures/script.png | Bin 0 -> 748 bytes clients/2011M/content/textures/spark.png | Bin 0 -> 4430 bytes clients/2011M/content/textures/sparkle.png | Bin 0 -> 4267 bytes .../2011M/content/textures/surfacesAlpha.png | Bin 0 -> 14878 bytes .../content/textures/surfacesTrussAlpha.png | Bin 0 -> 19987 bytes .../textures/ui/BottomRightControl.png | Bin 0 -> 1028 bytes .../content/textures/ui/BuildToolsFrame.png | Bin 0 -> 1490 bytes .../2011M/content/textures/ui/CloneButton.png | Bin 0 -> 1665 bytes .../content/textures/ui/CloneButton_dn.png | Bin 0 -> 1737 bytes .../2011M/content/textures/ui/CloseButton.png | Bin 0 -> 1567 bytes .../content/textures/ui/CloseButton_dn.png | Bin 0 -> 1506 bytes .../2011M/content/textures/ui/Concrete.png | Bin 0 -> 2120 bytes .../content/textures/ui/CorrodedMetal.png | Bin 0 -> 1955 bytes .../content/textures/ui/DeleteButton.png | Bin 0 -> 1556 bytes .../content/textures/ui/DeleteButton_dn.png | Bin 0 -> 1575 bytes .../content/textures/ui/DiamondPlate.png | Bin 0 -> 1943 bytes clients/2011M/content/textures/ui/Div.png | Bin 0 -> 166 bytes clients/2011M/content/textures/ui/Foil.png | Bin 0 -> 2083 bytes clients/2011M/content/textures/ui/Gear.png | Bin 0 -> 1238 bytes clients/2011M/content/textures/ui/Gear_dn.png | Bin 0 -> 1203 bytes clients/2011M/content/textures/ui/Glue.png | Bin 0 -> 2741 bytes clients/2011M/content/textures/ui/Grass.png | Bin 0 -> 1386 bytes .../content/textures/ui/GroupMoveButton.png | Bin 0 -> 1813 bytes .../textures/ui/GroupMoveButton_dn.png | Bin 0 -> 1849 bytes clients/2011M/content/textures/ui/Hinge.png | Bin 0 -> 867 bytes clients/2011M/content/textures/ui/Ice.png | Bin 0 -> 1919 bytes clients/2011M/content/textures/ui/Inlets.png | Bin 0 -> 2259 bytes .../content/textures/ui/InsertButton.png | Bin 0 -> 1638 bytes .../content/textures/ui/InsertButton_dn.png | Bin 0 -> 1670 bytes .../content/textures/ui/MaterialButton.png | Bin 0 -> 2042 bytes .../content/textures/ui/MaterialButton_dn.png | Bin 0 -> 2095 bytes .../content/textures/ui/MaterialMenu.png | Bin 0 -> 1487 bytes clients/2011M/content/textures/ui/Motor.png | Bin 0 -> 880 bytes .../2011M/content/textures/ui/PaintButton.png | Bin 0 -> 1574 bytes .../content/textures/ui/PaintButton_dn.png | Bin 0 -> 1613 bytes .../2011M/content/textures/ui/PaintMenu.png | Bin 0 -> 1694 bytes .../content/textures/ui/PartMoveButton.png | Bin 0 -> 1706 bytes .../content/textures/ui/PartMoveButton_dn.png | Bin 0 -> 1693 bytes clients/2011M/content/textures/ui/Plastic.png | Bin 0 -> 1173 bytes .../PlayerListFriendRequestReceivedIcon.png | Bin 0 -> 2450 bytes .../ui/PlayerListFriendRequestSentIcon.png | Bin 0 -> 2348 bytes .../textures/ui/PlayerlistFriendIcon.png | Bin 0 -> 2094 bytes .../content/textures/ui/PropertyButton.png | Bin 0 -> 1649 bytes .../content/textures/ui/PropertyButton_dn.png | Bin 0 -> 1687 bytes .../2011M/content/textures/ui/RecordStop.png | Bin 0 -> 1987 bytes .../2011M/content/textures/ui/ResetIcon.png | Bin 0 -> 2406 bytes .../2011M/content/textures/ui/ScaleButton.png | Bin 0 -> 1747 bytes .../content/textures/ui/ScaleButton_dn.png | Bin 0 -> 1792 bytes .../2011M/content/textures/ui/SearchIcon.png | Bin 0 -> 1299 bytes .../content/textures/ui/SettingsButton.png | Bin 0 -> 3486 bytes .../content/textures/ui/SettingsButton_dn.png | Bin 0 -> 3402 bytes .../content/textures/ui/SettingsButton_ds.png | Bin 0 -> 2591 bytes .../textures/ui/SettingsButton_ovr.png | Bin 0 -> 3402 bytes .../content/textures/ui/SettingsIcon.png | Bin 0 -> 8604 bytes clients/2011M/content/textures/ui/Slate.png | Bin 0 -> 1744 bytes clients/2011M/content/textures/ui/Slider.png | Bin 0 -> 1346 bytes .../2011M/content/textures/ui/Slider_dn.png | Bin 0 -> 1264 bytes .../2011M/content/textures/ui/Slider_sel.png | Bin 0 -> 1264 bytes clients/2011M/content/textures/ui/Smooth.png | Bin 0 -> 187 bytes .../content/textures/ui/StampToolButton.png | Bin 0 -> 1494 bytes .../textures/ui/StampToolButton_dn.png | Bin 0 -> 1799 bytes clients/2011M/content/textures/ui/Studs.png | Bin 0 -> 3321 bytes .../content/textures/ui/SurfaceButton.png | Bin 0 -> 1907 bytes .../content/textures/ui/SurfaceButton_dn.png | Bin 0 -> 1989 bytes .../2011M/content/textures/ui/SurfaceMenu.png | Bin 0 -> 1443 bytes .../2011M/content/textures/ui/TinyBcIcon.png | Bin 0 -> 3352 bytes .../2011M/content/textures/ui/TinyObcIcon.png | Bin 0 -> 3243 bytes .../2011M/content/textures/ui/TinyTbcIcon.png | Bin 0 -> 3346 bytes .../textures/ui/ToggleFullScreen_ds.png | Bin 0 -> 466 bytes .../2011M/content/textures/ui/ToolButton.png | Bin 0 -> 1701 bytes .../content/textures/ui/ToolButton_dn.png | Bin 0 -> 1701 bytes .../content/textures/ui/ToolButton_ds.png | Bin 0 -> 3200 bytes .../2011M/content/textures/ui/Universal.png | Bin 0 -> 3259 bytes clients/2011M/content/textures/ui/Weld.png | Bin 0 -> 3326 bytes clients/2011M/content/textures/ui/Wood.png | Bin 0 -> 975 bytes .../content/textures/ui/backpackButton.png | Bin 0 -> 3092 bytes .../textures/ui/backpackButton_ovr.png | Bin 0 -> 2934 bytes .../textures/ui/backpackButton_sel.png | Bin 0 -> 2934 bytes .../content/textures/ui/bottomLeftControl.png | Bin 0 -> 1312 bytes .../textures/ui/btn_greyTransp_slice1.png | Bin 0 -> 2886 bytes .../textures/ui/btn_greyTransp_slice2.png | Bin 0 -> 2808 bytes .../textures/ui/btn_greyTransp_slice3.png | Bin 0 -> 2903 bytes .../textures/ui/btn_greyTransp_slice4.png | Bin 0 -> 2812 bytes .../textures/ui/btn_greyTransp_slice5.png | Bin 0 -> 2792 bytes .../textures/ui/btn_greyTransp_slice6.png | Bin 0 -> 2811 bytes .../textures/ui/btn_greyTransp_slice7.png | Bin 0 -> 2885 bytes .../textures/ui/btn_greyTransp_slice8.png | Bin 0 -> 2810 bytes .../textures/ui/btn_greyTransp_slice9.png | Bin 0 -> 2885 bytes .../content/textures/ui/btn_grey_slice1.png | Bin 0 -> 1012 bytes .../content/textures/ui/btn_grey_slice2.png | Bin 0 -> 2809 bytes .../content/textures/ui/btn_grey_slice3.png | Bin 0 -> 2903 bytes .../content/textures/ui/btn_grey_slice4.png | Bin 0 -> 2812 bytes .../content/textures/ui/btn_grey_slice5.png | Bin 0 -> 2792 bytes .../content/textures/ui/btn_grey_slice6.png | Bin 0 -> 2810 bytes .../content/textures/ui/btn_grey_slice7.png | Bin 0 -> 2880 bytes .../content/textures/ui/btn_grey_slice8.png | Bin 0 -> 2810 bytes .../content/textures/ui/btn_grey_slice9.png | Bin 0 -> 2882 bytes .../textures/ui/btn_redGlow_slice1.png | Bin 0 -> 2901 bytes .../textures/ui/btn_redGlow_slice2.png | Bin 0 -> 2804 bytes .../textures/ui/btn_redGlow_slice3.png | Bin 0 -> 2910 bytes .../textures/ui/btn_redGlow_slice4.png | Bin 0 -> 2808 bytes .../textures/ui/btn_redGlow_slice5.png | Bin 0 -> 2792 bytes .../textures/ui/btn_redGlow_slice6.png | Bin 0 -> 2802 bytes .../textures/ui/btn_redGlow_slice7.png | Bin 0 -> 2903 bytes .../textures/ui/btn_redGlow_slice8.png | Bin 0 -> 2803 bytes .../textures/ui/btn_redGlow_slice9.png | Bin 0 -> 2901 bytes .../content/textures/ui/btn_red_slice1.png | Bin 0 -> 2867 bytes .../content/textures/ui/btn_red_slice2.png | Bin 0 -> 2804 bytes .../content/textures/ui/btn_red_slice3.png | Bin 0 -> 2870 bytes .../content/textures/ui/btn_red_slice4.png | Bin 0 -> 2805 bytes .../content/textures/ui/btn_red_slice5.png | Bin 0 -> 2792 bytes .../content/textures/ui/btn_red_slice6.png | Bin 0 -> 2804 bytes .../content/textures/ui/btn_red_slice7.png | Bin 0 -> 2870 bytes .../content/textures/ui/btn_red_slice8.png | Bin 0 -> 2803 bytes .../content/textures/ui/btn_red_slice9.png | Bin 0 -> 2873 bytes .../content/textures/ui/btn_white_slice1.png | Bin 0 -> 2879 bytes .../content/textures/ui/btn_white_slice2.png | Bin 0 -> 2806 bytes .../content/textures/ui/btn_white_slice3.png | Bin 0 -> 2874 bytes .../content/textures/ui/btn_white_slice4.png | Bin 0 -> 2805 bytes .../content/textures/ui/btn_white_slice5.png | Bin 0 -> 2792 bytes .../content/textures/ui/btn_white_slice6.png | Bin 0 -> 2804 bytes .../content/textures/ui/btn_white_slice7.png | Bin 0 -> 2873 bytes .../content/textures/ui/btn_white_slice8.png | Bin 0 -> 2803 bytes .../content/textures/ui/btn_white_slice9.png | Bin 0 -> 2872 bytes .../content/textures/ui/mouseLock_off.png | Bin 0 -> 3183 bytes .../content/textures/ui/mouseLock_off_ds.png | Bin 0 -> 1441 bytes .../content/textures/ui/mouseLock_off_ovr.png | Bin 0 -> 3043 bytes .../content/textures/ui/mouseLock_on.png | Bin 0 -> 3255 bytes .../content/textures/ui/mouseLock_on_ds.png | Bin 0 -> 1588 bytes .../content/textures/ui/mouseLock_on_ovr.png | Bin 0 -> 3164 bytes .../textures/ui/playerlist_big_hide.png | Bin 0 -> 2037 bytes .../textures/ui/playerlist_big_hide_dn.png | Bin 0 -> 1996 bytes .../textures/ui/playerlist_big_hide_ovr.png | Bin 0 -> 1996 bytes .../ui/playerlist_hidden_maximize.png | Bin 0 -> 4460 bytes .../ui/playerlist_hidden_maximize_dn.png | Bin 0 -> 3531 bytes .../ui/playerlist_hidden_maximize_ovr.png | Bin 0 -> 3531 bytes .../textures/ui/playerlist_hidden_small.png | Bin 0 -> 2178 bytes .../ui/playerlist_hidden_small_dn.png | Bin 0 -> 1897 bytes .../ui/playerlist_hidden_small_ovr.png | Bin 0 -> 1897 bytes .../textures/ui/playerlist_small_hide.png | Bin 0 -> 2123 bytes .../textures/ui/playerlist_small_hide_dn.png | Bin 0 -> 2067 bytes .../textures/ui/playerlist_small_hide_ovr.png | Bin 0 -> 2067 bytes .../textures/ui/playerlist_small_maximize.png | Bin 0 -> 1827 bytes .../ui/playerlist_small_maximize_dn.png | Bin 0 -> 1768 bytes .../ui/playerlist_small_maximize_ovr.png | Bin 0 -> 1768 bytes .../2011M/content/textures/ui/scrollbar.png | Bin 0 -> 941 bytes .../content/textures/ui/scrollbuttonDown.png | Bin 0 -> 1118 bytes .../textures/ui/scrollbuttonDown_dn.png | Bin 0 -> 1091 bytes .../textures/ui/scrollbuttonDown_ds.png | Bin 0 -> 1118 bytes .../textures/ui/scrollbuttonDown_ovr.png | Bin 0 -> 1091 bytes .../content/textures/ui/scrollbuttonUp.png | Bin 0 -> 1112 bytes .../content/textures/ui/scrollbuttonUp_dn.png | Bin 0 -> 1090 bytes .../content/textures/ui/scrollbuttonUp_ds.png | Bin 0 -> 1110 bytes .../textures/ui/scrollbuttonUp_ovr.png | Bin 0 -> 1090 bytes .../content/textures/vol_ice_cracked2.dds | Bin 0 -> 299721 bytes clients/2011M/content/textures/wrench.png | Bin 0 -> 610 bytes 514 files changed, 11937 insertions(+), 6237 deletions(-) create mode 100644 clients/2011M/content/fonts/Arial-18pt.fontdef create mode 100644 clients/2011M/content/fonts/Arial-18pt.png create mode 100644 clients/2011M/content/fonts/Arial-48pt.fontdef create mode 100644 clients/2011M/content/fonts/Arial-48pt.png create mode 100644 clients/2011M/content/fonts/ArialBold-18pt.fontdef create mode 100644 clients/2011M/content/fonts/ArialBold-18pt.png create mode 100644 clients/2011M/content/fonts/ArialBold-48pt.fontdef create mode 100644 clients/2011M/content/fonts/ArialBold-48pt.png create mode 100644 clients/2011M/content/fonts/CompositFullAtlasBaseTexture.mesh create mode 100644 clients/2011M/content/fonts/CompositFullAtlasOverlayTexture.mesh create mode 100644 clients/2011M/content/fonts/CompositLeftArmBase.mesh create mode 100644 clients/2011M/content/fonts/CompositLeftLegBase.mesh create mode 100644 clients/2011M/content/fonts/CompositPantsTemplate.mesh create mode 100644 clients/2011M/content/fonts/CompositRightArmBase.mesh create mode 100644 clients/2011M/content/fonts/CompositRightLegBase.mesh create mode 100644 clients/2011M/content/fonts/CompositShirtTemplate.mesh create mode 100644 clients/2011M/content/fonts/CompositTShirt.mesh create mode 100644 clients/2011M/content/fonts/CompositTorsoBase.mesh create mode 100644 clients/2011M/content/fonts/Legacy-18pt.fontdef create mode 100644 clients/2011M/content/fonts/Legacy-18pt.png create mode 100644 clients/2011M/content/fonts/Legacy-64pt.fontdef create mode 100644 clients/2011M/content/fonts/Legacy-64pt.png create mode 100644 clients/2011M/content/fonts/Rocket.rbxm create mode 100644 clients/2011M/content/fonts/SlingshotPellet.rbxm create mode 100644 clients/2011M/content/fonts/character.rbxm create mode 100644 clients/2011M/content/fonts/comics.fnt create mode 100644 clients/2011M/content/fonts/diogenes.fnt create mode 100644 clients/2011M/content/fonts/humanoidAnimate.rbxm create mode 100644 clients/2011M/content/fonts/humanoidAnimateLocal.rbxm create mode 100644 clients/2011M/content/fonts/humanoidExtra.rbxm create mode 100644 clients/2011M/content/fonts/humanoidHealth.rbxm create mode 100644 clients/2011M/content/fonts/humanoidSound.rbxm create mode 100644 clients/2011M/content/fonts/humanoidStatic.rbxm create mode 100644 clients/2011M/content/fonts/leftarm.mesh create mode 100644 clients/2011M/content/fonts/leftleg.mesh create mode 100644 clients/2011M/content/fonts/libraries.rbxm create mode 100644 clients/2011M/content/fonts/rightarm.mesh create mode 100644 clients/2011M/content/fonts/rightleg.mesh create mode 100644 clients/2011M/content/fonts/safechat.xml create mode 100644 clients/2011M/content/fonts/torso.mesh create mode 100644 clients/2011M/content/music/bass.wav create mode 100644 clients/2011M/content/music/ufofly.wav create mode 100644 clients/2011M/content/particles/explosion.particle create mode 100644 clients/2011M/content/particles/explosionMat.material create mode 100644 clients/2011M/content/particles/fire.particle create mode 100644 clients/2011M/content/particles/fireMat.material create mode 100644 clients/2011M/content/particles/forceFieldBeam.particle create mode 100644 clients/2011M/content/particles/forceFieldRadial.particle create mode 100644 clients/2011M/content/particles/glow.material create mode 100644 clients/2011M/content/particles/smoke.particle create mode 100644 clients/2011M/content/particles/smokeMat.material create mode 100644 clients/2011M/content/particles/sparkles.particle create mode 100644 clients/2011M/content/particles/sparklesMat.material create mode 100644 clients/2011M/content/scripts/CSMPFunctions.lua create mode 100644 clients/2011M/content/sky/lensflare.jpg create mode 100644 clients/2011M/content/sky/moon-alpha.jpg create mode 100644 clients/2011M/content/sky/moon.jpg create mode 100644 clients/2011M/content/sky/null_plainsky512_bk.jpg create mode 100644 clients/2011M/content/sky/null_plainsky512_dn.jpg create mode 100644 clients/2011M/content/sky/null_plainsky512_ft.jpg create mode 100644 clients/2011M/content/sky/null_plainsky512_lf.jpg create mode 100644 clients/2011M/content/sky/null_plainsky512_rt.jpg create mode 100644 clients/2011M/content/sky/null_plainsky512_up.jpg create mode 100644 clients/2011M/content/sky/skyspheremap.jpg create mode 100644 clients/2011M/content/sky/sun-rays.jpg create mode 100644 clients/2011M/content/sky/sun.jpg create mode 100644 clients/2011M/content/sounds/Kerplunk.wav create mode 100644 clients/2011M/content/sounds/Kid saying Ouch.wav create mode 100644 clients/2011M/content/sounds/Rubber band sling shot.wav create mode 100644 clients/2011M/content/sounds/Rubber band.wav create mode 100644 clients/2011M/content/sounds/SWITCH3.wav create mode 100644 clients/2011M/content/sounds/bass.wav create mode 100644 clients/2011M/content/sounds/bfsl-minifigfoots1.mp3 create mode 100644 clients/2011M/content/sounds/bfsl-minifigfoots2.mp3 create mode 100644 clients/2011M/content/sounds/button.wav create mode 100644 clients/2011M/content/sounds/clickfast.wav create mode 100644 clients/2011M/content/sounds/collide.wav create mode 100644 clients/2011M/content/sounds/electronicpingshort.wav create mode 100644 clients/2011M/content/sounds/flashbulb.wav create mode 100644 clients/2011M/content/sounds/grass.ogg create mode 100644 clients/2011M/content/sounds/grass2.ogg create mode 100644 clients/2011M/content/sounds/grass3.ogg create mode 100644 clients/2011M/content/sounds/grassstone.ogg create mode 100644 clients/2011M/content/sounds/grassstone2.ogg create mode 100644 clients/2011M/content/sounds/grassstone3.ogg create mode 100644 clients/2011M/content/sounds/hit.wav create mode 100644 clients/2011M/content/sounds/ice.ogg create mode 100644 clients/2011M/content/sounds/ice2.ogg create mode 100644 clients/2011M/content/sounds/ice3.ogg create mode 100644 clients/2011M/content/sounds/icegrass.ogg create mode 100644 clients/2011M/content/sounds/icegrass2.ogg create mode 100644 clients/2011M/content/sounds/icegrass3.ogg create mode 100644 clients/2011M/content/sounds/icemetal.ogg create mode 100644 clients/2011M/content/sounds/icemetal2.ogg create mode 100644 clients/2011M/content/sounds/icemetal3.ogg create mode 100644 clients/2011M/content/sounds/icestone.ogg create mode 100644 clients/2011M/content/sounds/icestone2.ogg create mode 100644 clients/2011M/content/sounds/icestone3.ogg create mode 100644 clients/2011M/content/sounds/metal.ogg create mode 100644 clients/2011M/content/sounds/metal2.ogg create mode 100644 clients/2011M/content/sounds/metal3.ogg create mode 100644 clients/2011M/content/sounds/metalgrass.ogg create mode 100644 clients/2011M/content/sounds/metalgrass2.ogg create mode 100644 clients/2011M/content/sounds/metalgrass3.ogg create mode 100644 clients/2011M/content/sounds/metalstone.ogg create mode 100644 clients/2011M/content/sounds/metalstone2.ogg create mode 100644 clients/2011M/content/sounds/metalstone3.ogg create mode 100644 clients/2011M/content/sounds/pageturn.wav create mode 100644 clients/2011M/content/sounds/plasticgrass.ogg create mode 100644 clients/2011M/content/sounds/plasticgrass2.ogg create mode 100644 clients/2011M/content/sounds/plasticgrass3.ogg create mode 100644 clients/2011M/content/sounds/plasticice.ogg create mode 100644 clients/2011M/content/sounds/plasticice2.ogg create mode 100644 clients/2011M/content/sounds/plasticice3.ogg create mode 100644 clients/2011M/content/sounds/plasticmetal.ogg create mode 100644 clients/2011M/content/sounds/plasticmetal2.ogg create mode 100644 clients/2011M/content/sounds/plasticmetal3.ogg create mode 100644 clients/2011M/content/sounds/plasticplastic.ogg create mode 100644 clients/2011M/content/sounds/plasticplastic2.ogg create mode 100644 clients/2011M/content/sounds/plasticplastic3.ogg create mode 100644 clients/2011M/content/sounds/plasticstone.ogg create mode 100644 clients/2011M/content/sounds/plasticstone2.ogg create mode 100644 clients/2011M/content/sounds/plasticstone3.ogg create mode 100644 clients/2011M/content/sounds/snap.wav create mode 100644 clients/2011M/content/sounds/splat.wav create mode 100644 clients/2011M/content/sounds/stone.ogg create mode 100644 clients/2011M/content/sounds/stone2.ogg create mode 100644 clients/2011M/content/sounds/stone3.ogg create mode 100644 clients/2011M/content/sounds/switch.wav create mode 100644 clients/2011M/content/sounds/swoosh.wav create mode 100644 clients/2011M/content/sounds/swordlunge.wav create mode 100644 clients/2011M/content/sounds/swordslash.wav create mode 100644 clients/2011M/content/sounds/unsheath.wav create mode 100644 clients/2011M/content/sounds/uuhhh.wav create mode 100644 clients/2011M/content/sounds/victory.wav create mode 100644 clients/2011M/content/sounds/woodgrass.ogg create mode 100644 clients/2011M/content/sounds/woodgrass2.ogg create mode 100644 clients/2011M/content/sounds/woodgrass3.ogg create mode 100644 clients/2011M/content/sounds/woodice.ogg create mode 100644 clients/2011M/content/sounds/woodice2.ogg create mode 100644 clients/2011M/content/sounds/woodice3.ogg create mode 100644 clients/2011M/content/sounds/woodmetal.ogg create mode 100644 clients/2011M/content/sounds/woodmetal2.ogg create mode 100644 clients/2011M/content/sounds/woodmetal3.ogg create mode 100644 clients/2011M/content/sounds/woodplastic.ogg create mode 100644 clients/2011M/content/sounds/woodplastic2.ogg create mode 100644 clients/2011M/content/sounds/woodplastic3.ogg create mode 100644 clients/2011M/content/sounds/woodstone.ogg create mode 100644 clients/2011M/content/sounds/woodstone2.ogg create mode 100644 clients/2011M/content/sounds/woodstone3.ogg create mode 100644 clients/2011M/content/sounds/woodwood.ogg create mode 100644 clients/2011M/content/sounds/woodwood2.ogg create mode 100644 clients/2011M/content/sounds/woodwood3.ogg create mode 100644 clients/2011M/content/textures/AluminumFallback.png create mode 100644 clients/2011M/content/textures/AnchorCursor.png create mode 100644 clients/2011M/content/textures/ArrowCursor.png create mode 100644 clients/2011M/content/textures/ArrowCursorDecalDrag.png create mode 100644 clients/2011M/content/textures/ArrowFarCursor.png create mode 100644 clients/2011M/content/textures/Blank.png create mode 100644 clients/2011M/content/textures/CameraTiltDown.png create mode 100644 clients/2011M/content/textures/CameraTiltDown_dn.png create mode 100644 clients/2011M/content/textures/CameraTiltDown_ds.png create mode 100644 clients/2011M/content/textures/CameraTiltDown_ovr.png create mode 100644 clients/2011M/content/textures/CameraTiltUp.png create mode 100644 clients/2011M/content/textures/CameraTiltUp_dn.png create mode 100644 clients/2011M/content/textures/CameraTiltUp_ds.png create mode 100644 clients/2011M/content/textures/CameraTiltUp_ovr.png create mode 100644 clients/2011M/content/textures/CameraZoomIn.png create mode 100644 clients/2011M/content/textures/CameraZoomIn_dn.png create mode 100644 clients/2011M/content/textures/CameraZoomIn_ds.png create mode 100644 clients/2011M/content/textures/CameraZoomIn_ovr.png create mode 100644 clients/2011M/content/textures/CameraZoomOut.png create mode 100644 clients/2011M/content/textures/CameraZoomOut_dn.png create mode 100644 clients/2011M/content/textures/CameraZoomOut_ds.png create mode 100644 clients/2011M/content/textures/CameraZoomOut_ovr.png create mode 100644 clients/2011M/content/textures/Chat.png create mode 100644 clients/2011M/content/textures/Chat_dn.png create mode 100644 clients/2011M/content/textures/Chat_ds.png create mode 100644 clients/2011M/content/textures/Chat_ovr.png create mode 100644 clients/2011M/content/textures/Clone.png create mode 100644 clients/2011M/content/textures/CloneCursor.png create mode 100644 clients/2011M/content/textures/CloneDownCursor.png create mode 100644 clients/2011M/content/textures/CloneOverCursor.png create mode 100644 clients/2011M/content/textures/ConcreteFallback.png create mode 100644 clients/2011M/content/textures/Crinkled_Normal.dds create mode 100644 clients/2011M/content/textures/DPlate_Normal.dds create mode 100644 clients/2011M/content/textures/DiamondPlateFallback.png create mode 100644 clients/2011M/content/textures/DragCursor.png create mode 100644 clients/2011M/content/textures/DropperCursor.png create mode 100644 clients/2011M/content/textures/Exit.png create mode 100644 clients/2011M/content/textures/Exit_dn.png create mode 100644 clients/2011M/content/textures/Exit_ovr.png create mode 100644 clients/2011M/content/textures/FillCursor.png create mode 100644 clients/2011M/content/textures/FirstPersonIndicator.png create mode 100644 clients/2011M/content/textures/FirstPersonIndicator_ds.png create mode 100644 clients/2011M/content/textures/FlagCursor.png create mode 100644 clients/2011M/content/textures/FlatCursor.png create mode 100644 clients/2011M/content/textures/GameTool.png create mode 100644 clients/2011M/content/textures/Grab.png create mode 100644 clients/2011M/content/textures/GrabCursor.png create mode 100644 clients/2011M/content/textures/GrabRotateCursor.png create mode 100644 clients/2011M/content/textures/Grass_Normal.dds create mode 100644 clients/2011M/content/textures/Grass_Texture.jpg create mode 100644 clients/2011M/content/textures/Grass_Texture_gray.jpg create mode 100644 clients/2011M/content/textures/GunCursor.png create mode 100644 clients/2011M/content/textures/GunWaitCursor.png create mode 100644 clients/2011M/content/textures/HammerCursor.png create mode 100644 clients/2011M/content/textures/HammerDownCursor.png create mode 100644 clients/2011M/content/textures/HammerOverCursor.png create mode 100644 clients/2011M/content/textures/Help.png create mode 100644 clients/2011M/content/textures/Help_dn.png create mode 100644 clients/2011M/content/textures/Help_ovr.png create mode 100644 clients/2011M/content/textures/HingeCursor.png create mode 100644 clients/2011M/content/textures/HorizLines_normal.dds create mode 100644 clients/2011M/content/textures/IceFallback.png create mode 100644 clients/2011M/content/textures/LockCursor.png create mode 100644 clients/2011M/content/textures/MaterialCursor.png create mode 100644 clients/2011M/content/textures/MissingCursor.png create mode 100644 clients/2011M/content/textures/MotorCursor.png create mode 100644 clients/2011M/content/textures/MouseLockedCursor.png create mode 100644 clients/2011M/content/textures/RecordIndicator.png create mode 100644 clients/2011M/content/textures/RecordToggle.png create mode 100644 clients/2011M/content/textures/RecordToggle_dn.png create mode 100644 clients/2011M/content/textures/RecordToggle_ds.png create mode 100644 clients/2011M/content/textures/RecordToggle_ovr.png create mode 100644 clients/2011M/content/textures/RecordToggle_sdn.png create mode 100644 clients/2011M/content/textures/RecordToggle_sel.png create mode 100644 clients/2011M/content/textures/RecordToggle_sovr.png create mode 100644 clients/2011M/content/textures/ReportAbuse.PNG create mode 100644 clients/2011M/content/textures/ReportAbuse_dn.PNG create mode 100644 clients/2011M/content/textures/ReportAbuse_ds.PNG create mode 100644 clients/2011M/content/textures/ReportAbuse_ovr.PNG create mode 100644 clients/2011M/content/textures/ReportInfected.png create mode 100644 clients/2011M/content/textures/ReportInfected_dn.png create mode 100644 clients/2011M/content/textures/ReportInfected_ds.png create mode 100644 clients/2011M/content/textures/ReportInfected_ovr.png create mode 100644 clients/2011M/content/textures/ResizeCursor.png create mode 100644 clients/2011M/content/textures/RustGradient.png create mode 100644 clients/2011M/content/textures/Sand_Normal.dds create mode 100644 clients/2011M/content/textures/Screenshot.png create mode 100644 clients/2011M/content/textures/Screenshot_dn.png create mode 100644 clients/2011M/content/textures/Screenshot_ds.png create mode 100644 clients/2011M/content/textures/Screenshot_ovr.png create mode 100644 clients/2011M/content/textures/SlateBorder.dds create mode 100644 clients/2011M/content/textures/SlateTile.dds create mode 100644 clients/2011M/content/textures/SlateTile.png create mode 100644 clients/2011M/content/textures/SlateTileMono.dds create mode 100644 clients/2011M/content/textures/SlateTileMono.png create mode 100644 clients/2011M/content/textures/Smoke.png create mode 100644 clients/2011M/content/textures/SpawnCursor.png create mode 100644 clients/2011M/content/textures/SpawnLocation.png create mode 100644 clients/2011M/content/textures/Surfaces.png create mode 100644 clients/2011M/content/textures/SurfacesStrip.png create mode 100644 clients/2011M/content/textures/SurfacesTruss.png create mode 100644 clients/2011M/content/textures/ToggleFullScreen.png create mode 100644 clients/2011M/content/textures/ToggleFullScreen_dn.png create mode 100644 clients/2011M/content/textures/ToggleFullScreen_ds.png create mode 100644 clients/2011M/content/textures/ToggleFullScreen_ovr.png create mode 100644 clients/2011M/content/textures/TogglePlayMode.png create mode 100644 clients/2011M/content/textures/TogglePlayMode_dn.png create mode 100644 clients/2011M/content/textures/TogglePlayMode_ds.png create mode 100644 clients/2011M/content/textures/TogglePlayMode_ovr.png create mode 100644 clients/2011M/content/textures/UnAnchorCursor.png create mode 100644 clients/2011M/content/textures/UnlockCursor.png create mode 100644 clients/2011M/content/textures/WeldCursor.png create mode 100644 clients/2011M/content/textures/WoodFallback.png create mode 100644 clients/2011M/content/textures/advancedMove.png create mode 100644 clients/2011M/content/textures/advancedMoveResize.png create mode 100644 clients/2011M/content/textures/advancedMove_joint.png create mode 100644 clients/2011M/content/textures/advancedMove_keysOnly.png create mode 100644 clients/2011M/content/textures/advancedMove_noJoint.png create mode 100644 clients/2011M/content/textures/blackBkg_round_slice1.png create mode 100644 clients/2011M/content/textures/blackBkg_round_slice2.png create mode 100644 clients/2011M/content/textures/blackBkg_round_slice3.png create mode 100644 clients/2011M/content/textures/blackBkg_round_slice4.png create mode 100644 clients/2011M/content/textures/blackBkg_round_slice5.png create mode 100644 clients/2011M/content/textures/blackBkg_round_slice6.png create mode 100644 clients/2011M/content/textures/blackBkg_round_slice7.png create mode 100644 clients/2011M/content/textures/blackBkg_round_slice8.png create mode 100644 clients/2011M/content/textures/blackBkg_round_slice9.png create mode 100644 clients/2011M/content/textures/blackBkg_square_slice1.png create mode 100644 clients/2011M/content/textures/blackBkg_square_slice2.png create mode 100644 clients/2011M/content/textures/blackBkg_square_slice3.png create mode 100644 clients/2011M/content/textures/blackBkg_square_slice4.png create mode 100644 clients/2011M/content/textures/blackBkg_square_slice5.png create mode 100644 clients/2011M/content/textures/blackBkg_square_slice6.png create mode 100644 clients/2011M/content/textures/blackBkg_square_slice7.png create mode 100644 clients/2011M/content/textures/blackBkg_square_slice8.png create mode 100644 clients/2011M/content/textures/blackBkg_square_slice9.png create mode 100644 clients/2011M/content/textures/chatBubble_botBlue_bkg_slice1.png create mode 100644 clients/2011M/content/textures/chatBubble_botBlue_bkg_slice2.png create mode 100644 clients/2011M/content/textures/chatBubble_botBlue_bkg_slice3.png create mode 100644 clients/2011M/content/textures/chatBubble_botBlue_bkg_slice4.png create mode 100644 clients/2011M/content/textures/chatBubble_botBlue_bkg_slice5.png create mode 100644 clients/2011M/content/textures/chatBubble_botBlue_bkg_slice6.png create mode 100644 clients/2011M/content/textures/chatBubble_botBlue_bkg_slice7.png create mode 100644 clients/2011M/content/textures/chatBubble_botBlue_bkg_slice8.png create mode 100644 clients/2011M/content/textures/chatBubble_botBlue_bkg_slice9.png create mode 100644 clients/2011M/content/textures/chatBubble_botBlue_notify_bkg.png create mode 100644 clients/2011M/content/textures/chatBubble_botBlue_tail.png create mode 100644 clients/2011M/content/textures/chatBubble_botBlue_tailRight.png create mode 100644 clients/2011M/content/textures/chatBubble_botGreen_bkg_slice1.png create mode 100644 clients/2011M/content/textures/chatBubble_botGreen_bkg_slice2.png create mode 100644 clients/2011M/content/textures/chatBubble_botGreen_bkg_slice3.png create mode 100644 clients/2011M/content/textures/chatBubble_botGreen_bkg_slice4.png create mode 100644 clients/2011M/content/textures/chatBubble_botGreen_bkg_slice5.png create mode 100644 clients/2011M/content/textures/chatBubble_botGreen_bkg_slice6.png create mode 100644 clients/2011M/content/textures/chatBubble_botGreen_bkg_slice7.png create mode 100644 clients/2011M/content/textures/chatBubble_botGreen_bkg_slice8.png create mode 100644 clients/2011M/content/textures/chatBubble_botGreen_bkg_slice9.png create mode 100644 clients/2011M/content/textures/chatBubble_botGreen_notify_bkg.png create mode 100644 clients/2011M/content/textures/chatBubble_botGreen_tail.png create mode 100644 clients/2011M/content/textures/chatBubble_botGreen_tailRight.png create mode 100644 clients/2011M/content/textures/chatBubble_botRed_bkg_slice1.png create mode 100644 clients/2011M/content/textures/chatBubble_botRed_bkg_slice2.png create mode 100644 clients/2011M/content/textures/chatBubble_botRed_bkg_slice3.png create mode 100644 clients/2011M/content/textures/chatBubble_botRed_bkg_slice4.png create mode 100644 clients/2011M/content/textures/chatBubble_botRed_bkg_slice5.png create mode 100644 clients/2011M/content/textures/chatBubble_botRed_bkg_slice6.png create mode 100644 clients/2011M/content/textures/chatBubble_botRed_bkg_slice7.png create mode 100644 clients/2011M/content/textures/chatBubble_botRed_bkg_slice8.png create mode 100644 clients/2011M/content/textures/chatBubble_botRed_bkg_slice9.png create mode 100644 clients/2011M/content/textures/chatBubble_botRed_notify_bkg.png create mode 100644 clients/2011M/content/textures/chatBubble_botRed_tail.png create mode 100644 clients/2011M/content/textures/chatBubble_botRed_tailRight.png create mode 100644 clients/2011M/content/textures/chatBubble_bot_notifyGray_dotDotDot.png create mode 100644 clients/2011M/content/textures/chatBubble_bot_notify_bang.png create mode 100644 clients/2011M/content/textures/chatBubble_bot_notify_dotDotDot.png create mode 100644 clients/2011M/content/textures/chatBubble_bot_notify_money.png create mode 100644 clients/2011M/content/textures/chatBubble_bot_notify_question.png create mode 100644 clients/2011M/content/textures/chatBubble_white_bkg_slice1.png create mode 100644 clients/2011M/content/textures/chatBubble_white_bkg_slice2.png create mode 100644 clients/2011M/content/textures/chatBubble_white_bkg_slice3.png create mode 100644 clients/2011M/content/textures/chatBubble_white_bkg_slice4.png create mode 100644 clients/2011M/content/textures/chatBubble_white_bkg_slice5.png create mode 100644 clients/2011M/content/textures/chatBubble_white_bkg_slice6.png create mode 100644 clients/2011M/content/textures/chatBubble_white_bkg_slice7.png create mode 100644 clients/2011M/content/textures/chatBubble_white_bkg_slice8.png create mode 100644 clients/2011M/content/textures/chatBubble_white_bkg_slice9.png create mode 100644 clients/2011M/content/textures/chatBubble_white_notify_bkg.png create mode 100644 clients/2011M/content/textures/chatBubble_white_tail.png create mode 100644 clients/2011M/content/textures/dirt.jpg create mode 100644 clients/2011M/content/textures/explosion.png create mode 100644 clients/2011M/content/textures/face.png create mode 100644 clients/2011M/content/textures/fire_0.png create mode 100644 clients/2011M/content/textures/glow.png create mode 100644 clients/2011M/content/textures/lua.png create mode 100644 clients/2011M/content/textures/noiseL8_32x32x32.dds create mode 100644 clients/2011M/content/textures/nosurfacesAlpha.png create mode 100644 clients/2011M/content/textures/nosurfacesTruss.png create mode 100644 clients/2011M/content/textures/nosurfacesTrussAlpha.png create mode 100644 clients/2011M/content/textures/penv.dds create mode 100644 clients/2011M/content/textures/rust_combined.png create mode 100644 clients/2011M/content/textures/script.png create mode 100644 clients/2011M/content/textures/spark.png create mode 100644 clients/2011M/content/textures/sparkle.png create mode 100644 clients/2011M/content/textures/surfacesAlpha.png create mode 100644 clients/2011M/content/textures/surfacesTrussAlpha.png create mode 100644 clients/2011M/content/textures/ui/BottomRightControl.png create mode 100644 clients/2011M/content/textures/ui/BuildToolsFrame.png create mode 100644 clients/2011M/content/textures/ui/CloneButton.png create mode 100644 clients/2011M/content/textures/ui/CloneButton_dn.png create mode 100644 clients/2011M/content/textures/ui/CloseButton.png create mode 100644 clients/2011M/content/textures/ui/CloseButton_dn.png create mode 100644 clients/2011M/content/textures/ui/Concrete.png create mode 100644 clients/2011M/content/textures/ui/CorrodedMetal.png create mode 100644 clients/2011M/content/textures/ui/DeleteButton.png create mode 100644 clients/2011M/content/textures/ui/DeleteButton_dn.png create mode 100644 clients/2011M/content/textures/ui/DiamondPlate.png create mode 100644 clients/2011M/content/textures/ui/Div.png create mode 100644 clients/2011M/content/textures/ui/Foil.png create mode 100644 clients/2011M/content/textures/ui/Gear.png create mode 100644 clients/2011M/content/textures/ui/Gear_dn.png create mode 100644 clients/2011M/content/textures/ui/Glue.png create mode 100644 clients/2011M/content/textures/ui/Grass.png create mode 100644 clients/2011M/content/textures/ui/GroupMoveButton.png create mode 100644 clients/2011M/content/textures/ui/GroupMoveButton_dn.png create mode 100644 clients/2011M/content/textures/ui/Hinge.png create mode 100644 clients/2011M/content/textures/ui/Ice.png create mode 100644 clients/2011M/content/textures/ui/Inlets.png create mode 100644 clients/2011M/content/textures/ui/InsertButton.png create mode 100644 clients/2011M/content/textures/ui/InsertButton_dn.png create mode 100644 clients/2011M/content/textures/ui/MaterialButton.png create mode 100644 clients/2011M/content/textures/ui/MaterialButton_dn.png create mode 100644 clients/2011M/content/textures/ui/MaterialMenu.png create mode 100644 clients/2011M/content/textures/ui/Motor.png create mode 100644 clients/2011M/content/textures/ui/PaintButton.png create mode 100644 clients/2011M/content/textures/ui/PaintButton_dn.png create mode 100644 clients/2011M/content/textures/ui/PaintMenu.png create mode 100644 clients/2011M/content/textures/ui/PartMoveButton.png create mode 100644 clients/2011M/content/textures/ui/PartMoveButton_dn.png create mode 100644 clients/2011M/content/textures/ui/Plastic.png create mode 100644 clients/2011M/content/textures/ui/PlayerListFriendRequestReceivedIcon.png create mode 100644 clients/2011M/content/textures/ui/PlayerListFriendRequestSentIcon.png create mode 100644 clients/2011M/content/textures/ui/PlayerlistFriendIcon.png create mode 100644 clients/2011M/content/textures/ui/PropertyButton.png create mode 100644 clients/2011M/content/textures/ui/PropertyButton_dn.png create mode 100644 clients/2011M/content/textures/ui/RecordStop.png create mode 100644 clients/2011M/content/textures/ui/ResetIcon.png create mode 100644 clients/2011M/content/textures/ui/ScaleButton.png create mode 100644 clients/2011M/content/textures/ui/ScaleButton_dn.png create mode 100644 clients/2011M/content/textures/ui/SearchIcon.png create mode 100644 clients/2011M/content/textures/ui/SettingsButton.png create mode 100644 clients/2011M/content/textures/ui/SettingsButton_dn.png create mode 100644 clients/2011M/content/textures/ui/SettingsButton_ds.png create mode 100644 clients/2011M/content/textures/ui/SettingsButton_ovr.png create mode 100644 clients/2011M/content/textures/ui/SettingsIcon.png create mode 100644 clients/2011M/content/textures/ui/Slate.png create mode 100644 clients/2011M/content/textures/ui/Slider.png create mode 100644 clients/2011M/content/textures/ui/Slider_dn.png create mode 100644 clients/2011M/content/textures/ui/Slider_sel.png create mode 100644 clients/2011M/content/textures/ui/Smooth.png create mode 100644 clients/2011M/content/textures/ui/StampToolButton.png create mode 100644 clients/2011M/content/textures/ui/StampToolButton_dn.png create mode 100644 clients/2011M/content/textures/ui/Studs.png create mode 100644 clients/2011M/content/textures/ui/SurfaceButton.png create mode 100644 clients/2011M/content/textures/ui/SurfaceButton_dn.png create mode 100644 clients/2011M/content/textures/ui/SurfaceMenu.png create mode 100644 clients/2011M/content/textures/ui/TinyBcIcon.png create mode 100644 clients/2011M/content/textures/ui/TinyObcIcon.png create mode 100644 clients/2011M/content/textures/ui/TinyTbcIcon.png create mode 100644 clients/2011M/content/textures/ui/ToggleFullScreen_ds.png create mode 100644 clients/2011M/content/textures/ui/ToolButton.png create mode 100644 clients/2011M/content/textures/ui/ToolButton_dn.png create mode 100644 clients/2011M/content/textures/ui/ToolButton_ds.png create mode 100644 clients/2011M/content/textures/ui/Universal.png create mode 100644 clients/2011M/content/textures/ui/Weld.png create mode 100644 clients/2011M/content/textures/ui/Wood.png create mode 100644 clients/2011M/content/textures/ui/backpackButton.png create mode 100644 clients/2011M/content/textures/ui/backpackButton_ovr.png create mode 100644 clients/2011M/content/textures/ui/backpackButton_sel.png create mode 100644 clients/2011M/content/textures/ui/bottomLeftControl.png create mode 100644 clients/2011M/content/textures/ui/btn_greyTransp_slice1.png create mode 100644 clients/2011M/content/textures/ui/btn_greyTransp_slice2.png create mode 100644 clients/2011M/content/textures/ui/btn_greyTransp_slice3.png create mode 100644 clients/2011M/content/textures/ui/btn_greyTransp_slice4.png create mode 100644 clients/2011M/content/textures/ui/btn_greyTransp_slice5.png create mode 100644 clients/2011M/content/textures/ui/btn_greyTransp_slice6.png create mode 100644 clients/2011M/content/textures/ui/btn_greyTransp_slice7.png create mode 100644 clients/2011M/content/textures/ui/btn_greyTransp_slice8.png create mode 100644 clients/2011M/content/textures/ui/btn_greyTransp_slice9.png create mode 100644 clients/2011M/content/textures/ui/btn_grey_slice1.png create mode 100644 clients/2011M/content/textures/ui/btn_grey_slice2.png create mode 100644 clients/2011M/content/textures/ui/btn_grey_slice3.png create mode 100644 clients/2011M/content/textures/ui/btn_grey_slice4.png create mode 100644 clients/2011M/content/textures/ui/btn_grey_slice5.png create mode 100644 clients/2011M/content/textures/ui/btn_grey_slice6.png create mode 100644 clients/2011M/content/textures/ui/btn_grey_slice7.png create mode 100644 clients/2011M/content/textures/ui/btn_grey_slice8.png create mode 100644 clients/2011M/content/textures/ui/btn_grey_slice9.png create mode 100644 clients/2011M/content/textures/ui/btn_redGlow_slice1.png create mode 100644 clients/2011M/content/textures/ui/btn_redGlow_slice2.png create mode 100644 clients/2011M/content/textures/ui/btn_redGlow_slice3.png create mode 100644 clients/2011M/content/textures/ui/btn_redGlow_slice4.png create mode 100644 clients/2011M/content/textures/ui/btn_redGlow_slice5.png create mode 100644 clients/2011M/content/textures/ui/btn_redGlow_slice6.png create mode 100644 clients/2011M/content/textures/ui/btn_redGlow_slice7.png create mode 100644 clients/2011M/content/textures/ui/btn_redGlow_slice8.png create mode 100644 clients/2011M/content/textures/ui/btn_redGlow_slice9.png create mode 100644 clients/2011M/content/textures/ui/btn_red_slice1.png create mode 100644 clients/2011M/content/textures/ui/btn_red_slice2.png create mode 100644 clients/2011M/content/textures/ui/btn_red_slice3.png create mode 100644 clients/2011M/content/textures/ui/btn_red_slice4.png create mode 100644 clients/2011M/content/textures/ui/btn_red_slice5.png create mode 100644 clients/2011M/content/textures/ui/btn_red_slice6.png create mode 100644 clients/2011M/content/textures/ui/btn_red_slice7.png create mode 100644 clients/2011M/content/textures/ui/btn_red_slice8.png create mode 100644 clients/2011M/content/textures/ui/btn_red_slice9.png create mode 100644 clients/2011M/content/textures/ui/btn_white_slice1.png create mode 100644 clients/2011M/content/textures/ui/btn_white_slice2.png create mode 100644 clients/2011M/content/textures/ui/btn_white_slice3.png create mode 100644 clients/2011M/content/textures/ui/btn_white_slice4.png create mode 100644 clients/2011M/content/textures/ui/btn_white_slice5.png create mode 100644 clients/2011M/content/textures/ui/btn_white_slice6.png create mode 100644 clients/2011M/content/textures/ui/btn_white_slice7.png create mode 100644 clients/2011M/content/textures/ui/btn_white_slice8.png create mode 100644 clients/2011M/content/textures/ui/btn_white_slice9.png create mode 100644 clients/2011M/content/textures/ui/mouseLock_off.png create mode 100644 clients/2011M/content/textures/ui/mouseLock_off_ds.png create mode 100644 clients/2011M/content/textures/ui/mouseLock_off_ovr.png create mode 100644 clients/2011M/content/textures/ui/mouseLock_on.png create mode 100644 clients/2011M/content/textures/ui/mouseLock_on_ds.png create mode 100644 clients/2011M/content/textures/ui/mouseLock_on_ovr.png create mode 100644 clients/2011M/content/textures/ui/playerlist_big_hide.png create mode 100644 clients/2011M/content/textures/ui/playerlist_big_hide_dn.png create mode 100644 clients/2011M/content/textures/ui/playerlist_big_hide_ovr.png create mode 100644 clients/2011M/content/textures/ui/playerlist_hidden_maximize.png create mode 100644 clients/2011M/content/textures/ui/playerlist_hidden_maximize_dn.png create mode 100644 clients/2011M/content/textures/ui/playerlist_hidden_maximize_ovr.png create mode 100644 clients/2011M/content/textures/ui/playerlist_hidden_small.png create mode 100644 clients/2011M/content/textures/ui/playerlist_hidden_small_dn.png create mode 100644 clients/2011M/content/textures/ui/playerlist_hidden_small_ovr.png create mode 100644 clients/2011M/content/textures/ui/playerlist_small_hide.png create mode 100644 clients/2011M/content/textures/ui/playerlist_small_hide_dn.png create mode 100644 clients/2011M/content/textures/ui/playerlist_small_hide_ovr.png create mode 100644 clients/2011M/content/textures/ui/playerlist_small_maximize.png create mode 100644 clients/2011M/content/textures/ui/playerlist_small_maximize_dn.png create mode 100644 clients/2011M/content/textures/ui/playerlist_small_maximize_ovr.png create mode 100644 clients/2011M/content/textures/ui/scrollbar.png create mode 100644 clients/2011M/content/textures/ui/scrollbuttonDown.png create mode 100644 clients/2011M/content/textures/ui/scrollbuttonDown_dn.png create mode 100644 clients/2011M/content/textures/ui/scrollbuttonDown_ds.png create mode 100644 clients/2011M/content/textures/ui/scrollbuttonDown_ovr.png create mode 100644 clients/2011M/content/textures/ui/scrollbuttonUp.png create mode 100644 clients/2011M/content/textures/ui/scrollbuttonUp_dn.png create mode 100644 clients/2011M/content/textures/ui/scrollbuttonUp_ds.png create mode 100644 clients/2011M/content/textures/ui/scrollbuttonUp_ovr.png create mode 100644 clients/2011M/content/textures/vol_ice_cracked2.dds create mode 100644 clients/2011M/content/textures/wrench.png diff --git a/NovetusLauncher/NovetusCMD/Program.cs b/NovetusLauncher/NovetusCMD/Program.cs index 1c42326..d0786ab 100644 --- a/NovetusLauncher/NovetusCMD/Program.cs +++ b/NovetusLauncher/NovetusCMD/Program.cs @@ -183,6 +183,7 @@ namespace NovetusCMD { bool StartInNo3D = false; bool OverrideINI = false; + bool RequestToOutputInfo = false; string[] lines = File.ReadAllLines(GlobalVars.ConfigDir + "\\info.txt"); //File is in System.IO string version = lines[0]; @@ -199,15 +200,19 @@ namespace NovetusCMD { ConsolePrint("Help: Command Line Arguments", 3); ConsolePrint("---------", 1); - ConsolePrint("-no3d | Launches server in NoGraphics mode", 3); - ConsolePrint("-overrideconfig | Override the launcher settings.", 3); + ConsolePrint("General", 3); + ConsolePrint("-no3d | Launches server in NoGraphics mode", 4); + ConsolePrint("-script | Loads an additional server script.", 4); + ConsolePrint("-outputinfo | Outputs all information about the running server to a text file.", 4); + ConsolePrint("-overrideconfig | Override the launcher settings.", 4); + ConsolePrint("---------", 1); + ConsolePrint("Custom server options", 3); ConsolePrint("-overrideconfig must be added in order for the below commands to function.", 5); ConsolePrint("-upnp | Turns on UPnP.", 4); ConsolePrint("-map | Sets the map.", 4); ConsolePrint("-client | Sets the client.", 4); ConsolePrint("-port | Sets the server port.", 4); ConsolePrint("-maxplayers | Sets the number of players.", 4); - ConsolePrint("-script | Loads an additional server script.", 4); ConsolePrint("---------", 1); } else @@ -260,6 +265,11 @@ namespace NovetusCMD } } + if (CommandLine["outputinfo"] != null) + { + RequestToOutputInfo = true; + } + if (CommandLine["script"] != null) { GlobalVars.AddonScriptPath = CommandLine["script"].Replace(@"\", @"\\"); @@ -286,6 +296,43 @@ namespace NovetusCMD InitUPnP(); StartWebServer(); + + if (RequestToOutputInfo) + { + string IP = SecurityFuncs.GetExternalIPAddress(); + string[] lines1 = { + SecurityFuncs.Base64Encode(IP), + SecurityFuncs.Base64Encode(GlobalVars.RobloxPort.ToString()), + SecurityFuncs.Base64Encode(GlobalVars.SelectedClient) + }; + string URI = "novetus://" + SecurityFuncs.Base64Encode(string.Join("|", lines1)); + string[] lines2 = { + SecurityFuncs.Base64Encode("localhost"), + SecurityFuncs.Base64Encode(GlobalVars.RobloxPort.ToString()), + SecurityFuncs.Base64Encode(GlobalVars.SelectedClient) + }; + string URI2 = "novetus://" + SecurityFuncs.Base64Encode(string.Join("|", lines2)); + + string text = GlobalVars.MultiLine( + "Client: " + GlobalVars.SelectedClient, + "IP: " + IP, + "Port: " + GlobalVars.RobloxPort.ToString(), + "Map: " + GlobalVars.Map, + "Players: " + GlobalVars.PlayerLimit, + "Version: Novetus " + GlobalVars.Version, + "Online URI Link:", + URI, + "Local URI Link:", + URI2, + GlobalVars.IsWebServerOn == true ? "Web Server URL:" : "", + GlobalVars.IsWebServerOn == true ? "http://" + IP + ":" + GlobalVars.WebServer.Port.ToString() : "", + GlobalVars.IsWebServerOn == true ? "Local Web Server URL:" : "", + GlobalVars.IsWebServerOn == true ? GlobalVars.LocalWebServerURI : "" + ); + + File.WriteAllText(GlobalVars.BasePath + "\\" + GlobalVars.ServerInfoFileName, GlobalVars.RemoveEmptyLines(text)); + ConsolePrint("Server Information sent to file " + GlobalVars.BasePath + "\\" + GlobalVars.ServerInfoFileName, 4); + } AppDomain.CurrentDomain.ProcessExit += new EventHandler(ProgramClose); diff --git a/NovetusLauncher/NovetusFuncs/ClientScript.cs b/NovetusLauncher/NovetusFuncs/ClientScript.cs index 860a4ce..f70e9ef 100644 --- a/NovetusLauncher/NovetusFuncs/ClientScript.cs +++ b/NovetusLauncher/NovetusFuncs/ClientScript.cs @@ -103,10 +103,10 @@ public class ClientScript if (File.Exists(GlobalVars.MapsDir + @"\\" + result + @"\\" + source)) { return result + @"\\" + source; } else { - return ""; + return source; } } catch (Exception) when (!Env.Debugging) { - return ""; + return source; } } diff --git a/NovetusLauncher/NovetusFuncs/GlobalVars.cs b/NovetusLauncher/NovetusFuncs/GlobalVars.cs index 2e10ae3..3d54629 100644 --- a/NovetusLauncher/NovetusFuncs/GlobalVars.cs +++ b/NovetusLauncher/NovetusFuncs/GlobalVars.cs @@ -6,10 +6,11 @@ * * To change this template use Tools | Options | Coding | Edit Standard Headers. */ - + using System; using System.IO; using System.Reflection; +using System.Text.RegularExpressions; public static class Env { @@ -215,9 +216,17 @@ public static class GlobalVars public static string WebServer_BodyColors = WebServer_CustomPlayerDir + "bodycolors.rbxm"; //itemmaker public static bool DisabledHelp = false; - - public static string MultiLine(params string[] args) + //cmd + public static string ServerInfoFileName = "serverinfo.txt"; + + + public static string MultiLine(params string[] args) { return string.Join(Environment.NewLine, args); } + + public static string RemoveEmptyLines(string lines) + { + return Regex.Replace(lines, @"^\s*$\n|\r", string.Empty, RegexOptions.Multiline).TrimEnd(); + } } \ No newline at end of file diff --git a/NovetusLauncher/NovetusLauncher/ServerInfo.cs b/NovetusLauncher/NovetusLauncher/ServerInfo.cs index 814dc6c..4e2f4c2 100644 --- a/NovetusLauncher/NovetusLauncher/ServerInfo.cs +++ b/NovetusLauncher/NovetusLauncher/ServerInfo.cs @@ -32,50 +32,37 @@ namespace NovetusLauncher void ServerInfoLoad(object sender, EventArgs e) { - textBox1.AppendText("Client: " + GlobalVars.SelectedClient); - textBox1.AppendText(Environment.NewLine); - string IP = SecurityFuncs.GetExternalIPAddress(); - textBox1.AppendText("IP: " + IP); - textBox1.AppendText(Environment.NewLine); - textBox1.AppendText("Port: " + GlobalVars.RobloxPort.ToString()); - textBox1.AppendText(Environment.NewLine); - textBox1.AppendText("Map: " + GlobalVars.Map); - textBox1.AppendText(Environment.NewLine); - textBox1.AppendText("Players: " + GlobalVars.PlayerLimit); - textBox1.AppendText(Environment.NewLine); - textBox1.AppendText("Version: Novetus " + GlobalVars.Version); - textBox1.AppendText(Environment.NewLine); - string[] lines = { - SecurityFuncs.Base64Encode(IP), - SecurityFuncs.Base64Encode(GlobalVars.RobloxPort.ToString()), - SecurityFuncs.Base64Encode(GlobalVars.SelectedClient) - }; - string URI = "novetus://" + SecurityFuncs.Base64Encode(string.Join("|",lines)); - textBox1.AppendText("Online URI Link:"); - textBox1.AppendText(Environment.NewLine); - textBox1.AppendText(URI); - textBox1.AppendText(Environment.NewLine); - string[] lines2 = { - SecurityFuncs.Base64Encode("localhost"), - SecurityFuncs.Base64Encode(GlobalVars.RobloxPort.ToString()), - SecurityFuncs.Base64Encode(GlobalVars.SelectedClient) - }; - string URI2 = "novetus://" + SecurityFuncs.Base64Encode(string.Join("|",lines2)); - textBox1.AppendText(Environment.NewLine); - textBox1.AppendText("Local URI Link:"); - textBox1.AppendText(Environment.NewLine); - textBox1.AppendText(URI2); - textBox1.AppendText(Environment.NewLine); - if (GlobalVars.IsWebServerOn == true) - { - textBox1.AppendText("Web Server URL:"); - textBox1.AppendText(Environment.NewLine); - textBox1.AppendText("http://" + IP + ":" + GlobalVars.WebServer.Port.ToString()); - textBox1.AppendText(Environment.NewLine); - textBox1.AppendText("Local Web Server URL:"); - textBox1.AppendText(Environment.NewLine); - textBox1.AppendText(GlobalVars.LocalWebServerURI); - } + string IP = SecurityFuncs.GetExternalIPAddress(); + string[] lines1 = { + SecurityFuncs.Base64Encode(IP), + SecurityFuncs.Base64Encode(GlobalVars.RobloxPort.ToString()), + SecurityFuncs.Base64Encode(GlobalVars.SelectedClient) + }; + string URI = "novetus://" + SecurityFuncs.Base64Encode(string.Join("|", lines1)); + string[] lines2 = { + SecurityFuncs.Base64Encode("localhost"), + SecurityFuncs.Base64Encode(GlobalVars.RobloxPort.ToString()), + SecurityFuncs.Base64Encode(GlobalVars.SelectedClient) + }; + string URI2 = "novetus://" + SecurityFuncs.Base64Encode(string.Join("|", lines2)); + string text = GlobalVars.MultiLine( + "Client: " + GlobalVars.SelectedClient, + "IP: " + IP, + "Port: " + GlobalVars.RobloxPort.ToString(), + "Map: " + GlobalVars.Map, + "Players: " + GlobalVars.PlayerLimit, + "Version: Novetus " + GlobalVars.Version, + "Online URI Link:", + URI, + "Local URI Link:", + URI2, + GlobalVars.IsWebServerOn == true ? "Web Server URL:" : "", + GlobalVars.IsWebServerOn == true ? "http://" + IP + ":" + GlobalVars.WebServer.Port.ToString() : "", + GlobalVars.IsWebServerOn == true ? "Local Web Server URL:" : "", + GlobalVars.IsWebServerOn == true ? GlobalVars.LocalWebServerURI : "" + ); + textBox1.AppendText(GlobalVars.RemoveEmptyLines(text)); + } } } diff --git a/clients/2011E/content/fonts/libraries.rbxm b/clients/2011E/content/fonts/libraries.rbxm index 71630fe..30ccf1c 100644 --- a/clients/2011E/content/fonts/libraries.rbxm +++ b/clients/2011E/content/fonts/libraries.rbxm @@ -7,7 +7,6 @@ Sorter print("Special thanks to Bitl, Carrot, iago, winsupermario1234, Khangaroo, drslicendice, coke, TheLivingBee, Raymonf, and a bunch of play - testers for help making 2011 fully stable and work. 8)") -script.Playerlist:clone().Parent = game.StarterGui script.Dialogs:clone().Parent = game.StarterGui script.Health:clone().Parent = game.StarterGui script.ReenableDialogScript:clone().Parent = game.Lighting @@ -1020,6189 +1019,5 @@ onLoad() - - - Playerlist - true - - - - false - - Init - --fixed by Carrot#0559 ---for non corescript use -local t = {} - -local function ScopedConnect(parentInstance, instance, event, signalFunc, syncFunc, removeFunc) - local eventConnection = nil - - --Connection on parentInstance is scoped by parentInstance (when destroyed, it goes away) - local tryConnect = function() - if game:IsAncestorOf(parentInstance) then - --Entering the world, make sure we are connected/synced - if not eventConnection then - eventConnection = instance[event]:connect(signalFunc) - if syncFunc then syncFunc() end - end - else - --Probably leaving the world, so disconnect for now - if eventConnection then - eventConnection:disconnect() - if removeFunc then removeFunc() end - end - end - end - - --Hook it up to ancestryChanged signal - local connection = parentInstance.AncestryChanged:connect(tryConnect) - - --Now connect us if we're already in the world - tryConnect() - - return connection -end - -local function getScreenGuiAncestor(instance) - local localInstance = instance - while localInstance and not localInstance:IsA("ScreenGui") do - localInstance = localInstance.Parent - end - return localInstance -end - -local function CreateButtons(frame, buttons, yPos, ySize) - local buttonNum = 1 - local buttonObjs = {} - for i, obj in ipairs(buttons) do - local button = Instance.new("TextButton") - button.Name = "Button" .. buttonNum - button.Font = Enum.Font.Arial - button.FontSize = Enum.FontSize.Size18 - button.AutoButtonColor = true - button.Modal = true - if obj["Style"] then - button.Style = obj.Style - else - button.Style = Enum.ButtonStyle.RobloxButton - end - if obj["ZIndex"] then - button.ZIndex = obj.ZIndex - end - button.Text = obj.Text - button.TextColor3 = Color3.new(1,1,1) - button.MouseButton1Click:connect(obj.Function) - button.Parent = frame - buttonObjs[buttonNum] = button - - buttonNum = buttonNum + 1 - end - local numButtons = buttonNum-1 - - if numButtons == 1 then - frame.Button1.Position = UDim2.new(0.35, 0, yPos.Scale, yPos.Offset) - frame.Button1.Size = UDim2.new(.4,0,ySize.Scale, ySize.Offset) - elseif numButtons == 2 then - frame.Button1.Position = UDim2.new(0.1, 0, yPos.Scale, yPos.Offset) - frame.Button1.Size = UDim2.new(.8/3,0, ySize.Scale, ySize.Offset) - - frame.Button2.Position = UDim2.new(0.55, 0, yPos.Scale, yPos.Offset) - frame.Button2.Size = UDim2.new(.35,0, ySize.Scale, ySize.Offset) - elseif numButtons >= 3 then - local spacing = .1 / numButtons - local buttonSize = .9 / numButtons - - buttonNum = 1 - while buttonNum <= numButtons do - buttonObjs[buttonNum].Position = UDim2.new(spacing*buttonNum + (buttonNum-1) * buttonSize, 0, yPos.Scale, yPos.Offset) - buttonObjs[buttonNum].Size = UDim2.new(buttonSize, 0, ySize.Scale, ySize.Offset) - buttonNum = buttonNum + 1 - end - end -end - -local function setSliderPos(newAbsPosX,slider,sliderPosition,bar,steps) - - local newStep = steps - 1 --otherwise we really get one more step than we want - local relativePosX = math.min(1, math.max(0, (newAbsPosX - bar.AbsolutePosition.X) / bar.AbsoluteSize.X )) - local wholeNum, remainder = math.modf(relativePosX * newStep) - if remainder > 0.5 then - wholeNum = wholeNum + 1 - end - relativePosX = wholeNum/newStep - - local result = math.ceil(relativePosX * newStep) - if sliderPosition.Value ~= (result + 1) then --only update if we moved a step - sliderPosition.Value = result + 1 - slider.Position = UDim2.new(relativePosX,-slider.AbsoluteSize.X/2,slider.Position.Y.Scale,slider.Position.Y.Offset) - end - -end - -local function cancelSlide(areaSoak) - areaSoak.Visible = false - if areaSoakMouseMoveCon then areaSoakMouseMoveCon:disconnect() end -end - -t.CreateStyledMessageDialog = function(title, message, style, buttons) - local frame = Instance.new("Frame") - frame.Size = UDim2.new(0.5, 0, 0, 165) - frame.Position = UDim2.new(0.25, 0, 0.5, -72.5) - frame.Name = "MessageDialog" - frame.Active = true - frame.Style = Enum.FrameStyle.RobloxRound - - local styleImage = Instance.new("ImageLabel") - styleImage.Name = "StyleImage" - styleImage.BackgroundTransparency = 1 - styleImage.Position = UDim2.new(0,5,0,15) - if style == "error" or style == "Error" then - styleImage.Size = UDim2.new(0, 71, 0, 71) - styleImage.Image = "http://www.roblox.com/asset/?id=42565285" - elseif style == "notify" or style == "Notify" then - styleImage.Size = UDim2.new(0, 71, 0, 71) - styleImage.Image = "http://www.roblox.com/asset/?id=42604978" - elseif style == "confirm" or style == "Confirm" then - styleImage.Size = UDim2.new(0, 74, 0, 76) - styleImage.Image = "http://www.roblox.com/asset/?id=42557901" - else - return t.CreateMessageDialog(title,message,buttons) - end - styleImage.Parent = frame - - local titleLabel = Instance.new("TextLabel") - titleLabel.Name = "Title" - titleLabel.Text = title - titleLabel.TextStrokeTransparency = 0 - titleLabel.BackgroundTransparency = 1 - titleLabel.TextColor3 = Color3.new(221/255,221/255,221/255) - titleLabel.Position = UDim2.new(0, 80, 0, 0) - titleLabel.Size = UDim2.new(1, -80, 0, 40) - titleLabel.Font = Enum.Font.ArialBold - titleLabel.FontSize = Enum.FontSize.Size36 - titleLabel.TextXAlignment = Enum.TextXAlignment.Center - titleLabel.TextYAlignment = Enum.TextYAlignment.Center - titleLabel.Parent = frame - - local messageLabel = Instance.new("TextLabel") - messageLabel.Name = "Message" - messageLabel.Text = message - messageLabel.TextStrokeTransparency = 0 - messageLabel.TextColor3 = Color3.new(221/255,221/255,221/255) - messageLabel.Position = UDim2.new(0.025, 80, 0, 45) - messageLabel.Size = UDim2.new(0.95, -80, 0, 55) - messageLabel.BackgroundTransparency = 1 - messageLabel.Font = Enum.Font.Arial - messageLabel.FontSize = Enum.FontSize.Size18 - messageLabel.TextWrap = true - messageLabel.TextXAlignment = Enum.TextXAlignment.Left - messageLabel.TextYAlignment = Enum.TextYAlignment.Top - messageLabel.Parent = frame - - CreateButtons(frame, buttons, UDim.new(0, 105), UDim.new(0, 40) ) - - return frame -end - -t.CreateMessageDialog = function(title, message, buttons) - local frame = Instance.new("Frame") - frame.Size = UDim2.new(0.5, 0, 0.5, 0) - frame.Position = UDim2.new(0.25, 0, 0.25, 0) - frame.Name = "MessageDialog" - frame.Active = true - frame.Style = Enum.FrameStyle.RobloxRound - - local titleLabel = Instance.new("TextLabel") - titleLabel.Name = "Title" - titleLabel.Text = title - titleLabel.BackgroundTransparency = 1 - titleLabel.TextColor3 = Color3.new(221/255,221/255,221/255) - titleLabel.Position = UDim2.new(0, 0, 0, 0) - titleLabel.Size = UDim2.new(1, 0, 0.15, 0) - titleLabel.Font = Enum.Font.ArialBold - titleLabel.FontSize = Enum.FontSize.Size36 - titleLabel.TextXAlignment = Enum.TextXAlignment.Center - titleLabel.TextYAlignment = Enum.TextYAlignment.Center - titleLabel.Parent = frame - - local messageLabel = Instance.new("TextLabel") - messageLabel.Name = "Message" - messageLabel.Text = message - messageLabel.TextColor3 = Color3.new(221/255,221/255,221/255) - messageLabel.Position = UDim2.new(0.025, 0, 0.175, 0) - messageLabel.Size = UDim2.new(0.95, 0, .55, 0) - messageLabel.BackgroundTransparency = 1 - messageLabel.Font = Enum.Font.Arial - messageLabel.FontSize = Enum.FontSize.Size18 - messageLabel.TextWrap = true - messageLabel.TextXAlignment = Enum.TextXAlignment.Left - messageLabel.TextYAlignment = Enum.TextYAlignment.Top - messageLabel.Parent = frame - - CreateButtons(frame, buttons, UDim.new(0.8,0), UDim.new(0.15, 0)) - - return frame -end - -t.CreateDropDownMenu = function(items, onSelect, forRoblox, whiteSkin, baseZ) - local baseZIndex = 0 - if (type(baseZ) == "number") then - baseZIndex = baseZ - end - local width = UDim.new(0, 100) - local height = UDim.new(0, 32) - - local xPos = 0.055 - local frame = Instance.new("Frame") - local textColor = Color3.new(1,1,1) - if (whiteSkin) then - textColor = Color3.new(0.5, 0.5, 0.5) - end - frame.Name = "DropDownMenu" - frame.BackgroundTransparency = 1 - frame.Size = UDim2.new(width, height) - - local dropDownMenu = Instance.new("TextButton") - dropDownMenu.Name = "DropDownMenuButton" - dropDownMenu.TextWrap = true - dropDownMenu.TextColor3 = textColor - dropDownMenu.Text = "Choose One" - dropDownMenu.Font = Enum.Font.ArialBold - dropDownMenu.FontSize = Enum.FontSize.Size18 - dropDownMenu.TextXAlignment = Enum.TextXAlignment.Left - dropDownMenu.TextYAlignment = Enum.TextYAlignment.Center - dropDownMenu.BackgroundTransparency = 1 - dropDownMenu.AutoButtonColor = true - if (whiteSkin) then - dropDownMenu.Style = Enum.ButtonStyle.RobloxRoundDropdownButton - else - dropDownMenu.Style = Enum.ButtonStyle.RobloxButton - end - dropDownMenu.Size = UDim2.new(1,0,1,0) - dropDownMenu.Parent = frame - dropDownMenu.ZIndex = 2 + baseZIndex - - local dropDownIcon = Instance.new("ImageLabel") - dropDownIcon.Name = "Icon" - dropDownIcon.Active = false - if (whiteSkin) then - dropDownIcon.Image = "rbxasset://textures/ui/dropdown_arrow.png" - dropDownIcon.Size = UDim2.new(0,16,0,12) - dropDownIcon.Position = UDim2.new(1,-17,0.5, -6) - else - dropDownIcon.Image = "http://www.roblox.com/asset/?id=45732894" - dropDownIcon.Size = UDim2.new(0,11,0,6) - dropDownIcon.Position = UDim2.new(1,-11,0.5, -2) - end - dropDownIcon.BackgroundTransparency = 1 - dropDownIcon.Parent = dropDownMenu - dropDownIcon.ZIndex = 2 + baseZIndex - - local itemCount = #items - local dropDownItemCount = #items - local useScrollButtons = false - if dropDownItemCount > 6 then - useScrollButtons = true - dropDownItemCount = 6 - end - - local droppedDownMenu = Instance.new("TextButton") - droppedDownMenu.Name = "List" - droppedDownMenu.Text = "" - droppedDownMenu.BackgroundTransparency = 1 - --droppedDownMenu.AutoButtonColor = true - if (whiteSkin) then - droppedDownMenu.Style = Enum.ButtonStyle.RobloxRoundDropdownButton - else - droppedDownMenu.Style = Enum.ButtonStyle.RobloxButton - end - droppedDownMenu.Visible = false - droppedDownMenu.Active = true --Blocks clicks - droppedDownMenu.Position = UDim2.new(0,0,0,0) - droppedDownMenu.Size = UDim2.new(1,0, (1 + dropDownItemCount)*.8, 0) - droppedDownMenu.Parent = frame - droppedDownMenu.ZIndex = 2 + baseZIndex - - local choiceButton = Instance.new("TextButton") - choiceButton.Name = "ChoiceButton" - choiceButton.BackgroundTransparency = 1 - choiceButton.BorderSizePixel = 0 - choiceButton.Text = "ReplaceMe" - choiceButton.TextColor3 = textColor - choiceButton.TextXAlignment = Enum.TextXAlignment.Left - choiceButton.TextYAlignment = Enum.TextYAlignment.Center - choiceButton.BackgroundColor3 = Color3.new(1, 1, 1) - choiceButton.Font = Enum.Font.Arial - choiceButton.FontSize = Enum.FontSize.Size18 - if useScrollButtons then - choiceButton.Size = UDim2.new(1,-13, .8/((dropDownItemCount + 1)*.8),0) - else - choiceButton.Size = UDim2.new(1, 0, .8/((dropDownItemCount + 1)*.8),0) - end - choiceButton.TextWrap = true - choiceButton.ZIndex = 2 + baseZIndex - - local areaSoak = Instance.new("TextButton") - areaSoak.Name = "AreaSoak" - areaSoak.Text = "" - areaSoak.BackgroundTransparency = 1 - areaSoak.Active = true - areaSoak.Size = UDim2.new(1,0,1,0) - areaSoak.Visible = false - areaSoak.ZIndex = 3 + baseZIndex - - local dropDownSelected = false - - local scrollUpButton - local scrollDownButton - local scrollMouseCount = 0 - - local setZIndex = function(baseZIndex) - droppedDownMenu.ZIndex = baseZIndex +1 - if scrollUpButton then - scrollUpButton.ZIndex = baseZIndex + 3 - end - if scrollDownButton then - scrollDownButton.ZIndex = baseZIndex + 3 - end - - local children = droppedDownMenu:GetChildren() - if children then - for i, child in ipairs(children) do - if child.Name == "ChoiceButton" then - child.ZIndex = baseZIndex + 2 - elseif child.Name == "ClickCaptureButton" then - child.ZIndex = baseZIndex - end - end - end - end - - local scrollBarPosition = 1 - local updateScroll = function() - if scrollUpButton then - scrollUpButton.Active = scrollBarPosition > 1 - end - if scrollDownButton then - scrollDownButton.Active = scrollBarPosition + dropDownItemCount <= itemCount - end - - local children = droppedDownMenu:GetChildren() - if not children then return end - - local childNum = 1 - for i, obj in ipairs(children) do - if obj.Name == "ChoiceButton" then - if childNum < scrollBarPosition or childNum >= scrollBarPosition + dropDownItemCount then - obj.Visible = false - else - obj.Position = UDim2.new(0,0,((childNum-scrollBarPosition+1)*.8)/((dropDownItemCount+1)*.8),0) - obj.Visible = true - end - obj.TextColor3 = textColor - obj.BackgroundTransparency = 1 - - childNum = childNum + 1 - end - end - end - local toggleVisibility = function() - dropDownSelected = not dropDownSelected - - areaSoak.Visible = not areaSoak.Visible - dropDownMenu.Visible = not dropDownSelected - droppedDownMenu.Visible = dropDownSelected - if dropDownSelected then - setZIndex(4 + baseZIndex) - else - setZIndex(2 + baseZIndex) - end - if useScrollButtons then - updateScroll() - end - end - droppedDownMenu.MouseButton1Click:connect(toggleVisibility) - - local updateSelection = function(text) - local foundItem = false - local children = droppedDownMenu:GetChildren() - local childNum = 1 - if children then - for i, obj in ipairs(children) do - if obj.Name == "ChoiceButton" then - if obj.Text == text then - obj.Font = Enum.Font.ArialBold - foundItem = true - scrollBarPosition = childNum - if (whiteSkin) then - obj.TextColor3 = Color3.new(90/255,142/255,233/255) - end - else - obj.Font = Enum.Font.Arial - if (whiteSkin) then - obj.TextColor3 = textColor - end - end - childNum = childNum + 1 - end - end - end - if not text then - dropDownMenu.Text = "Choose One" - scrollBarPosition = 1 - else - if not foundItem then - error("Invalid Selection Update -- " .. text) - end - - if scrollBarPosition + dropDownItemCount > itemCount + 1 then - scrollBarPosition = itemCount - dropDownItemCount + 1 - end - - dropDownMenu.Text = text - end - end - - local function scrollDown() - if scrollBarPosition + dropDownItemCount <= itemCount then - scrollBarPosition = scrollBarPosition + 1 - updateScroll() - return true - end - return false - end - local function scrollUp() - if scrollBarPosition > 1 then - scrollBarPosition = scrollBarPosition - 1 - updateScroll() - return true - end - return false - end - - if useScrollButtons then - --Make some scroll buttons - scrollUpButton = Instance.new("ImageButton") - scrollUpButton.Name = "ScrollUpButton" - scrollUpButton.BackgroundTransparency = 1 - scrollUpButton.Image = "rbxasset://textures/ui/scrollbuttonUp.png" - scrollUpButton.Size = UDim2.new(0,17,0,17) - scrollUpButton.Position = UDim2.new(1,-11,(1*.8)/((dropDownItemCount+1)*.8),0) - scrollUpButton.MouseButton1Click:connect( - function() - scrollMouseCount = scrollMouseCount + 1 - end) - scrollUpButton.MouseLeave:connect( - function() - scrollMouseCount = scrollMouseCount + 1 - end) - scrollUpButton.MouseButton1Down:connect( - function() - scrollMouseCount = scrollMouseCount + 1 - - scrollUp() - local val = scrollMouseCount - wait(0.5) - while val == scrollMouseCount do - if scrollUp() == false then - break - end - wait(0.1) - end - end) - - scrollUpButton.Parent = droppedDownMenu - - scrollDownButton = Instance.new("ImageButton") - scrollDownButton.Name = "ScrollDownButton" - scrollDownButton.BackgroundTransparency = 1 - scrollDownButton.Image = "rbxasset://textures/ui/scrollbuttonDown.png" - scrollDownButton.Size = UDim2.new(0,17,0,17) - scrollDownButton.Position = UDim2.new(1,-11,1,-11) - scrollDownButton.Parent = droppedDownMenu - scrollDownButton.MouseButton1Click:connect( - function() - scrollMouseCount = scrollMouseCount + 1 - end) - scrollDownButton.MouseLeave:connect( - function() - scrollMouseCount = scrollMouseCount + 1 - end) - scrollDownButton.MouseButton1Down:connect( - function() - scrollMouseCount = scrollMouseCount + 1 - - scrollDown() - local val = scrollMouseCount - wait(0.5) - while val == scrollMouseCount do - if scrollDown() == false then - break - end - wait(0.1) - end - end) - - local scrollbar = Instance.new("ImageLabel") - scrollbar.Name = "ScrollBar" - scrollbar.Image = "rbxasset://textures/ui/scrollbar.png" - scrollbar.BackgroundTransparency = 1 - scrollbar.Size = UDim2.new(0, 18, (dropDownItemCount*.8)/((dropDownItemCount+1)*.8), -(17) - 11 - 4) - scrollbar.Position = UDim2.new(1,-11,(1*.8)/((dropDownItemCount+1)*.8),17+2) - scrollbar.Parent = droppedDownMenu - end - - for i,item in ipairs(items) do - -- needed to maintain local scope for items in event listeners below - local button = choiceButton:clone() - if forRoblox then - button.RobloxLocked = true - end - button.Text = item - button.Parent = droppedDownMenu - if (whiteSkin) then - button.TextColor3 = textColor - end - - button.MouseButton1Click:connect(function() - --Remove Highlight - if (not whiteSkin) then - button.TextColor3 = Color3.new(1,1,1) - end - button.BackgroundTransparency = 1 - - updateSelection(item) - onSelect(item) - - toggleVisibility() - end) - button.MouseEnter:connect(function() - --Add Highlight - if (not whiteSkin) then - button.TextColor3 = Color3.new(0,0,0) - end - button.BackgroundTransparency = 0 - end) - - button.MouseLeave:connect(function() - --Remove Highlight - if (not whiteSkin) then - button.TextColor3 = Color3.new(1,1,1) - end - button.BackgroundTransparency = 1 - end) - end - - --This does the initial layout of the buttons - updateScroll() - - frame.AncestryChanged:connect(function(child,parent) - if parent == nil then - areaSoak.Parent = nil - else - areaSoak.Parent = getScreenGuiAncestor(frame) - end - end) - - dropDownMenu.MouseButton1Click:connect(toggleVisibility) - areaSoak.MouseButton1Click:connect(toggleVisibility) - return frame, updateSelection -end - -t.CreatePropertyDropDownMenu = function(instance, property, enum) - - local items = enum:GetEnumItems() - local names = {} - local nameToItem = {} - for i,obj in ipairs(items) do - names[i] = obj.Name - nameToItem[obj.Name] = obj - end - - local frame - local updateSelection - frame, updateSelection = t.CreateDropDownMenu(names, function(text) instance[property] = nameToItem[text] end) - - ScopedConnect(frame, instance, "Changed", - function(prop) - if prop == property then - updateSelection(instance[property].Name) - end - end, - function() - updateSelection(instance[property].Name) - end) - - return frame -end - -t.GetFontHeight = function(font, fontSize) - if font == nil or fontSize == nil then - error("Font and FontSize must be non-nil") - end - - if font == Enum.Font.Legacy then - if fontSize == Enum.FontSize.Size8 then - return 12 - elseif fontSize == Enum.FontSize.Size9 then - return 14 - elseif fontSize == Enum.FontSize.Size10 then - return 15 - elseif fontSize == Enum.FontSize.Size11 then - return 17 - elseif fontSize == Enum.FontSize.Size12 then - return 18 - elseif fontSize == Enum.FontSize.Size14 then - return 21 - elseif fontSize == Enum.FontSize.Size18 then - return 27 - elseif fontSize == Enum.FontSize.Size24 then - return 36 - elseif fontSize == Enum.FontSize.Size36 then - return 54 - elseif fontSize == Enum.FontSize.Size48 then - return 72 - else - error("Unknown FontSize") - end - elseif font == Enum.Font.Arial or font == Enum.Font.ArialBold then - if fontSize == Enum.FontSize.Size8 then - return 8 - elseif fontSize == Enum.FontSize.Size9 then - return 9 - elseif fontSize == Enum.FontSize.Size10 then - return 10 - elseif fontSize == Enum.FontSize.Size11 then - return 11 - elseif fontSize == Enum.FontSize.Size12 then - return 12 - elseif fontSize == Enum.FontSize.Size14 then - return 14 - elseif fontSize == Enum.FontSize.Size18 then - return 18 - elseif fontSize == Enum.FontSize.Size24 then - return 24 - elseif fontSize == Enum.FontSize.Size36 then - return 36 - elseif fontSize == Enum.FontSize.Size48 then - return 48 - else - error("Unknown FontSize") - end - else - error("Unknown Font " .. font) - end -end - -local function layoutGuiObjectsHelper(frame, guiObjects, settingsTable) - local totalPixels = frame.AbsoluteSize.Y - local pixelsRemaining = frame.AbsoluteSize.Y - for i, child in ipairs(guiObjects) do - if child:IsA("TextLabel") or child:IsA("TextButton") then - local isLabel = child:IsA("TextLabel") - if isLabel then - pixelsRemaining = pixelsRemaining - settingsTable["TextLabelPositionPadY"] - else - pixelsRemaining = pixelsRemaining - settingsTable["TextButtonPositionPadY"] - end - child.Position = UDim2.new(child.Position.X.Scale, child.Position.X.Offset, 0, totalPixels - pixelsRemaining) - child.Size = UDim2.new(child.Size.X.Scale, child.Size.X.Offset, 0, pixelsRemaining) - - if child.TextFits and child.TextBounds.Y < pixelsRemaining then - child.Visible = true - if isLabel then - child.Size = UDim2.new(child.Size.X.Scale, child.Size.X.Offset, 0, child.TextBounds.Y + settingsTable["TextLabelSizePadY"]) - else - child.Size = UDim2.new(child.Size.X.Scale, child.Size.X.Offset, 0, child.TextBounds.Y + settingsTable["TextButtonSizePadY"]) - end - - while not child.TextFits do - child.Size = UDim2.new(child.Size.X.Scale, child.Size.X.Offset, 0, child.AbsoluteSize.Y + 1) - end - pixelsRemaining = pixelsRemaining - child.AbsoluteSize.Y - - if isLabel then - pixelsRemaining = pixelsRemaining - settingsTable["TextLabelPositionPadY"] - else - pixelsRemaining = pixelsRemaining - settingsTable["TextButtonPositionPadY"] - end - else - child.Visible = false - pixelsRemaining = -1 - end - - else - --GuiObject - child.Position = UDim2.new(child.Position.X.Scale, child.Position.X.Offset, 0, totalPixels - pixelsRemaining) - pixelsRemaining = pixelsRemaining - child.AbsoluteSize.Y - child.Visible = (pixelsRemaining >= 0) - end - end -end - -t.LayoutGuiObjects = function(frame, guiObjects, settingsTable) - if not frame:IsA("GuiObject") then - error("Frame must be a GuiObject") - end - for i, child in ipairs(guiObjects) do - if not child:IsA("GuiObject") then - error("All elements that are layed out must be of type GuiObject") - end - end - - if not settingsTable then - settingsTable = {} - end - - if not settingsTable["TextLabelSizePadY"] then - settingsTable["TextLabelSizePadY"] = 0 - end - if not settingsTable["TextLabelPositionPadY"] then - settingsTable["TextLabelPositionPadY"] = 0 - end - if not settingsTable["TextButtonSizePadY"] then - settingsTable["TextButtonSizePadY"] = 12 - end - if not settingsTable["TextButtonPositionPadY"] then - settingsTable["TextButtonPositionPadY"] = 2 - end - - --Wrapper frame takes care of styled objects - local wrapperFrame = Instance.new("Frame") - wrapperFrame.Name = "WrapperFrame" - wrapperFrame.BackgroundTransparency = 1 - wrapperFrame.Size = UDim2.new(1,0,1,0) - wrapperFrame.Parent = frame - - for i, child in ipairs(guiObjects) do - child.Parent = wrapperFrame - end - - local recalculate = function() - wait() - layoutGuiObjectsHelper(wrapperFrame, guiObjects, settingsTable) - end - - frame.Changed:connect( - function(prop) - if prop == "AbsoluteSize" then - --Wait a heartbeat for it to sync in - recalculate(nil) - end - end) - frame.AncestryChanged:connect(recalculate) - - layoutGuiObjectsHelper(wrapperFrame, guiObjects, settingsTable) -end - - -t.CreateSlider = function(steps,width,position) - local sliderGui = Instance.new("Frame") - sliderGui.Size = UDim2.new(1,0,1,0) - sliderGui.BackgroundTransparency = 1 - sliderGui.Name = "SliderGui" - - local sliderSteps = Instance.new("IntValue") - sliderSteps.Name = "SliderSteps" - sliderSteps.Value = steps - sliderSteps.Parent = sliderGui - - local areaSoak = Instance.new("TextButton") - areaSoak.Name = "AreaSoak" - areaSoak.Text = "" - areaSoak.BackgroundTransparency = 1 - areaSoak.Active = false - areaSoak.Size = UDim2.new(1,0,1,0) - areaSoak.Visible = false - areaSoak.ZIndex = 4 - - sliderGui.AncestryChanged:connect(function(child,parent) - if parent == nil then - areaSoak.Parent = nil - else - areaSoak.Parent = getScreenGuiAncestor(sliderGui) - end - end) - - local sliderPosition = Instance.new("IntValue") - sliderPosition.Name = "SliderPosition" - sliderPosition.Value = 0 - sliderPosition.Parent = sliderGui - - local id = math.random(1,100) - - local bar = Instance.new("TextButton") - bar.Text = "" - bar.AutoButtonColor = false - bar.Name = "Bar" - bar.BackgroundColor3 = Color3.new(0,0,0) - if type(width) == "number" then - bar.Size = UDim2.new(0,width,0,5) - else - bar.Size = UDim2.new(0,200,0,5) - end - bar.BorderColor3 = Color3.new(95/255,95/255,95/255) - bar.ZIndex = 2 - bar.Parent = sliderGui - - if position["X"] and position["X"]["Scale"] and position["X"]["Offset"] and position["Y"] and position["Y"]["Scale"] and position["Y"]["Offset"] then - bar.Position = position - end - - local slider = Instance.new("ImageButton") - slider.Name = "Slider" - slider.BackgroundTransparency = 1 - slider.Image = "rbxasset://textures/ui/Slider.png" - slider.Position = UDim2.new(0,0,0.5,-10) - slider.Size = UDim2.new(0,20,0,20) - slider.ZIndex = 3 - slider.Parent = bar - - local areaSoakMouseMoveCon = nil - - areaSoak.MouseLeave:connect(function() - if areaSoak.Visible then - cancelSlide(areaSoak) - end - end) - areaSoak.MouseButton1Up:connect(function() - if areaSoak.Visible then - cancelSlide(areaSoak) - end - end) - - slider.MouseButton1Down:connect(function() - areaSoak.Visible = true - if areaSoakMouseMoveCon then areaSoakMouseMoveCon:disconnect() end - areaSoakMouseMoveCon = areaSoak.MouseMoved:connect(function(x,y) - setSliderPos(x,slider,sliderPosition,bar,steps) - end) - end) - - slider.MouseButton1Up:connect(function() cancelSlide(areaSoak) end) - - sliderPosition.Changed:connect(function(prop) - sliderPosition.Value = math.min(steps, math.max(1,sliderPosition.Value)) - local relativePosX = (sliderPosition.Value - 1) / (steps - 1) - slider.Position = UDim2.new(relativePosX,-slider.AbsoluteSize.X/2,slider.Position.Y.Scale,slider.Position.Y.Offset) - end) - - bar.MouseButton1Down:connect(function(x,y) - setSliderPos(x,slider,sliderPosition,bar,steps) - end) - - return sliderGui, sliderPosition, sliderSteps - -end - - - -t.CreateSliderNew = function(steps,width,position) - local sliderGui = Instance.new("Frame") - sliderGui.Size = UDim2.new(1,0,1,0) - sliderGui.BackgroundTransparency = 1 - sliderGui.Name = "SliderGui" - - local sliderSteps = Instance.new("IntValue") - sliderSteps.Name = "SliderSteps" - sliderSteps.Value = steps - sliderSteps.Parent = sliderGui - - local areaSoak = Instance.new("TextButton") - areaSoak.Name = "AreaSoak" - areaSoak.Text = "" - areaSoak.BackgroundTransparency = 1 - areaSoak.Active = false - areaSoak.Size = UDim2.new(1,0,1,0) - areaSoak.Visible = false - areaSoak.ZIndex = 6 - - sliderGui.AncestryChanged:connect(function(child,parent) - if parent == nil then - areaSoak.Parent = nil - else - areaSoak.Parent = getScreenGuiAncestor(sliderGui) - end - end) - - local sliderPosition = Instance.new("IntValue") - sliderPosition.Name = "SliderPosition" - sliderPosition.Value = 0 - sliderPosition.Parent = sliderGui - - local id = math.random(1,100) - - local sliderBarImgHeight = 7 - local sliderBarCapImgWidth = 4 - - local bar = Instance.new("ImageButton") - bar.BackgroundTransparency = 1 - bar.Image = "rbxasset://textures/ui/Slider-BKG-Center.png" - bar.Name = "Bar" - local displayWidth = 200 - if type(width) == "number" then - bar.Size = UDim2.new(0,width - (sliderBarCapImgWidth * 2),0,sliderBarImgHeight) - displayWidth = width - (sliderBarCapImgWidth * 2) - else - bar.Size = UDim2.new(0,200,0,sliderBarImgHeight) - end - bar.ZIndex = 3 - bar.Parent = sliderGui - if position["X"] and position["X"]["Scale"] and position["X"]["Offset"] and position["Y"] and position["Y"]["Scale"] and position["Y"]["Offset"] then - bar.Position = position - end - - local barLeft = bar:clone() - barLeft.Name = "BarLeft" - barLeft.Image = "rbxasset://textures/ui/Slider-BKG-Left-Cap.png" - barLeft.Size = UDim2.new(0, sliderBarCapImgWidth, 0, sliderBarImgHeight) - barLeft.Position = UDim2.new(position.X.Scale, position.X.Offset - sliderBarCapImgWidth, position.Y.Scale, position.Y.Offset) - barLeft.Parent = sliderGui - barLeft.ZIndex = 3 - - local barRight = barLeft:clone() - barRight.Name = "BarRight" - barRight.Image = "rbxasset://textures/ui/Slider-BKG-Right-Cap.png" - barRight.Position = UDim2.new(position.X.Scale, position.X.Offset + displayWidth, position.Y.Scale, position.Y.Offset) - barRight.Parent = sliderGui - - local fillLeft = barLeft:clone() - fillLeft.Name = "FillLeft" - fillLeft.Image = "rbxasset://textures/ui/Slider-Fill-Left-Cap.png" - fillLeft.Parent = sliderGui - fillLeft.ZIndex = 4 - - local fill = fillLeft:clone() - fill.Name = "Fill" - fill.Image = "rbxasset://textures/ui/Slider-Fill-Center.png" - fill.Parent = bar - fill.ZIndex = 4 - fill.Position = UDim2.new(0, 0, 0, 0) - fill.Size = UDim2.new(0.5, 0, 1, 0) - - --- bar.Visible = false - - local slider = Instance.new("ImageButton") - slider.Name = "Slider" - slider.BackgroundTransparency = 1 - slider.Image = "rbxasset://textures/ui/slider_new_tab.png" - slider.Position = UDim2.new(0,0,0.5,-14) - slider.Size = UDim2.new(0,28,0,28) - slider.ZIndex = 5 - slider.Parent = bar - - local areaSoakMouseMoveCon = nil - - areaSoak.MouseLeave:connect(function() - if areaSoak.Visible then - cancelSlide(areaSoak) - end - end) - areaSoak.MouseButton1Up:connect(function() - if areaSoak.Visible then - cancelSlide(areaSoak) - end - end) - - slider.MouseButton1Down:connect(function() - areaSoak.Visible = true - if areaSoakMouseMoveCon then areaSoakMouseMoveCon:disconnect() end - areaSoakMouseMoveCon = areaSoak.MouseMoved:connect(function(x,y) - setSliderPos(x,slider,sliderPosition,bar,steps) - end) - end) - - slider.MouseButton1Up:connect(function() cancelSlide(areaSoak) end) - - sliderPosition.Changed:connect(function(prop) - sliderPosition.Value = math.min(steps, math.max(1,sliderPosition.Value)) - local relativePosX = (sliderPosition.Value - 1) / (steps - 1) - slider.Position = UDim2.new(relativePosX,-slider.AbsoluteSize.X/2,slider.Position.Y.Scale,slider.Position.Y.Offset) - fill.Size = UDim2.new(relativePosX, 0, 1, 0) - end) - - bar.MouseButton1Down:connect(function(x,y) - setSliderPos(x,slider,sliderPosition,bar,steps) - end) - - return sliderGui, sliderPosition, sliderSteps - -end - - - - - -t.CreateTrueScrollingFrame = function() - local lowY = nil - local highY = nil - - local dragCon = nil - local upCon = nil - - local internalChange = false - - local descendantsChangeConMap = {} - - local scrollingFrame = Instance.new("Frame") - scrollingFrame.Name = "ScrollingFrame" - scrollingFrame.Active = true - scrollingFrame.Size = UDim2.new(1,0,1,0) - scrollingFrame.ClipsDescendants = true - - local controlFrame = Instance.new("Frame") - controlFrame.Name = "ControlFrame" - controlFrame.BackgroundTransparency = 1 - controlFrame.Size = UDim2.new(0,18,1,0) - controlFrame.Position = UDim2.new(1,-20,0,0) - controlFrame.Parent = scrollingFrame - - local scrollBottom = Instance.new("BoolValue") - scrollBottom.Value = false - scrollBottom.Name = "ScrollBottom" - scrollBottom.Parent = controlFrame - - local scrollUp = Instance.new("BoolValue") - scrollUp.Value = false - scrollUp.Name = "scrollUp" - scrollUp.Parent = controlFrame - - local scrollUpButton = Instance.new("TextButton") - scrollUpButton.Name = "ScrollUpButton" - scrollUpButton.Text = "" - scrollUpButton.AutoButtonColor = false - scrollUpButton.BackgroundColor3 = Color3.new(0,0,0) - scrollUpButton.BorderColor3 = Color3.new(1,1,1) - scrollUpButton.BackgroundTransparency = 0.5 - scrollUpButton.Size = UDim2.new(0,18,0,18) - scrollUpButton.ZIndex = 2 - scrollUpButton.Parent = controlFrame - for i = 1, 6 do - local triFrame = Instance.new("Frame") - triFrame.BorderColor3 = Color3.new(1,1,1) - triFrame.Name = "tri" .. tostring(i) - triFrame.ZIndex = 3 - triFrame.BackgroundTransparency = 0.5 - triFrame.Size = UDim2.new(0,12 - ((i -1) * 2),0,0) - triFrame.Position = UDim2.new(0,3 + (i -1),0.5,2 - (i -1)) - triFrame.Parent = scrollUpButton - end - scrollUpButton.MouseEnter:connect(function() - scrollUpButton.BackgroundTransparency = 0.1 - local upChildren = scrollUpButton:GetChildren() - for i = 1, #upChildren do - upChildren[i].BackgroundTransparency = 0.1 - end - end) - scrollUpButton.MouseLeave:connect(function() - scrollUpButton.BackgroundTransparency = 0.5 - local upChildren = scrollUpButton:GetChildren() - for i = 1, #upChildren do - upChildren[i].BackgroundTransparency = 0.5 - end - end) - - local scrollDownButton = scrollUpButton:clone() - scrollDownButton.Name = "ScrollDownButton" - scrollDownButton.Position = UDim2.new(0,0,1,-18) - local downChildren = scrollDownButton:GetChildren() - for i = 1, #downChildren do - downChildren[i].Position = UDim2.new(0,3 + (i -1),0.5,-2 + (i - 1)) - end - scrollDownButton.MouseEnter:connect(function() - scrollDownButton.BackgroundTransparency = 0.1 - local downChildren = scrollDownButton:GetChildren() - for i = 1, #downChildren do - downChildren[i].BackgroundTransparency = 0.1 - end - end) - scrollDownButton.MouseLeave:connect(function() - scrollDownButton.BackgroundTransparency = 0.5 - local downChildren = scrollDownButton:GetChildren() - for i = 1, #downChildren do - downChildren[i].BackgroundTransparency = 0.5 - end - end) - scrollDownButton.Parent = controlFrame - - local scrollTrack = Instance.new("Frame") - scrollTrack.Name = "ScrollTrack" - scrollTrack.BackgroundTransparency = 1 - scrollTrack.Size = UDim2.new(0,18,1,-38) - scrollTrack.Position = UDim2.new(0,0,0,19) - scrollTrack.Parent = controlFrame - - local scrollbar = Instance.new("TextButton") - scrollbar.BackgroundColor3 = Color3.new(0,0,0) - scrollbar.BorderColor3 = Color3.new(1,1,1) - scrollbar.BackgroundTransparency = 0.5 - scrollbar.AutoButtonColor = false - scrollbar.Text = "" - scrollbar.Active = true - scrollbar.Name = "ScrollBar" - scrollbar.ZIndex = 2 - scrollbar.BackgroundTransparency = 0.5 - scrollbar.Size = UDim2.new(0, 18, 0.1, 0) - scrollbar.Position = UDim2.new(0,0,0,0) - scrollbar.Parent = scrollTrack - - local scrollNub = Instance.new("Frame") - scrollNub.Name = "ScrollNub" - scrollNub.BorderColor3 = Color3.new(1,1,1) - scrollNub.Size = UDim2.new(0,10,0,0) - scrollNub.Position = UDim2.new(0.5,-5,0.5,0) - scrollNub.ZIndex = 2 - scrollNub.BackgroundTransparency = 0.5 - scrollNub.Parent = scrollbar - - local newNub = scrollNub:clone() - newNub.Position = UDim2.new(0.5,-5,0.5,-2) - newNub.Parent = scrollbar - - local lastNub = scrollNub:clone() - lastNub.Position = UDim2.new(0.5,-5,0.5,2) - lastNub.Parent = scrollbar - - scrollbar.MouseEnter:connect(function() - scrollbar.BackgroundTransparency = 0.1 - scrollNub.BackgroundTransparency = 0.1 - newNub.BackgroundTransparency = 0.1 - lastNub.BackgroundTransparency = 0.1 - end) - scrollbar.MouseLeave:connect(function() - scrollbar.BackgroundTransparency = 0.5 - scrollNub.BackgroundTransparency = 0.5 - newNub.BackgroundTransparency = 0.5 - lastNub.BackgroundTransparency = 0.5 - end) - - local mouseDrag = Instance.new("ImageButton") - mouseDrag.Active = false - mouseDrag.Size = UDim2.new(1.5, 0, 1.5, 0) - mouseDrag.AutoButtonColor = false - mouseDrag.BackgroundTransparency = 1 - mouseDrag.Name = "mouseDrag" - mouseDrag.Position = UDim2.new(-0.25, 0, -0.25, 0) - mouseDrag.ZIndex = 10 - - local function positionScrollBar(x,y,offset) - local oldPos = scrollbar.Position - - if y < scrollTrack.AbsolutePosition.y then - scrollbar.Position = UDim2.new(scrollbar.Position.X.Scale,scrollbar.Position.X.Offset,0,0) - return (oldPos ~= scrollbar.Position) - end - - local relativeSize = scrollbar.AbsoluteSize.Y/scrollTrack.AbsoluteSize.Y - - if y > (scrollTrack.AbsolutePosition.y + scrollTrack.AbsoluteSize.y) then - scrollbar.Position = UDim2.new(scrollbar.Position.X.Scale,scrollbar.Position.X.Offset,1 - relativeSize,0) - return (oldPos ~= scrollbar.Position) - end - local newScaleYPos = (y - scrollTrack.AbsolutePosition.y - offset)/scrollTrack.AbsoluteSize.y - if newScaleYPos + relativeSize > 1 then - newScaleYPos = 1 - relativeSize - scrollBottom.Value = true - scrollUp.Value = false - elseif newScaleYPos <= 0 then - newScaleYPos = 0 - scrollUp.Value = true - scrollBottom.Value = false - else - scrollUp.Value = false - scrollBottom.Value = false - end - scrollbar.Position = UDim2.new(scrollbar.Position.X.Scale,scrollbar.Position.X.Offset,newScaleYPos,0) - - return (oldPos ~= scrollbar.Position) - end - - local function drillDownSetHighLow(instance) - if not instance or not instance:IsA("GuiObject") then return end - if instance == controlFrame then return end - if instance:IsDescendantOf(controlFrame) then return end - if not instance.Visible then return end - - if lowY and lowY > instance.AbsolutePosition.Y then - lowY = instance.AbsolutePosition.Y - elseif not lowY then - lowY = instance.AbsolutePosition.Y - end - if highY and highY < (instance.AbsolutePosition.Y + instance.AbsoluteSize.Y) then - highY = instance.AbsolutePosition.Y + instance.AbsoluteSize.Y - elseif not highY then - highY = instance.AbsolutePosition.Y + instance.AbsoluteSize.Y - end - local children = instance:GetChildren() - for i = 1, #children do - drillDownSetHighLow(children[i]) - end - end - - local function resetHighLow() - local firstChildren = scrollingFrame:GetChildren() - - for i = 1, #firstChildren do - drillDownSetHighLow(firstChildren[i]) - end - end - - local function recalculate() - internalChange = true - - local percentFrame = 0 - if scrollbar.Position.Y.Scale > 0 then - if scrollbar.Visible then - percentFrame = scrollbar.Position.Y.Scale/((scrollTrack.AbsoluteSize.Y - scrollbar.AbsoluteSize.Y)/scrollTrack.AbsoluteSize.Y) - else - percentFrame = 0 - end - end - if percentFrame > 0.99 then percentFrame = 1 end - - local hiddenYAmount = (scrollingFrame.AbsoluteSize.Y - (highY - lowY)) * percentFrame - - local guiChildren = scrollingFrame:GetChildren() - for i = 1, #guiChildren do - if guiChildren[i] ~= controlFrame then - guiChildren[i].Position = UDim2.new(guiChildren[i].Position.X.Scale,guiChildren[i].Position.X.Offset, - 0, math.ceil(guiChildren[i].AbsolutePosition.Y) - math.ceil(lowY) + hiddenYAmount) - end - end - - lowY = nil - highY = nil - resetHighLow() - internalChange = false - end - - local function setSliderSizeAndPosition() - if not highY or not lowY then return end - - local totalYSpan = math.abs(highY - lowY) - if totalYSpan == 0 then - scrollbar.Visible = false - scrollDownButton.Visible = false - scrollUpButton.Visible = false - - if dragCon then dragCon:disconnect() dragCon = nil end - if upCon then upCon:disconnect() upCon = nil end - return - end - - local percentShown = scrollingFrame.AbsoluteSize.Y/totalYSpan - if percentShown >= 1 then - scrollbar.Visible = false - scrollDownButton.Visible = false - scrollUpButton.Visible = false - recalculate() - else - scrollbar.Visible = true - scrollDownButton.Visible = true - scrollUpButton.Visible = true - - scrollbar.Size = UDim2.new(scrollbar.Size.X.Scale,scrollbar.Size.X.Offset,percentShown,0) - end - - local percentPosition = (scrollingFrame.AbsolutePosition.Y - lowY)/totalYSpan - scrollbar.Position = UDim2.new(scrollbar.Position.X.Scale,scrollbar.Position.X.Offset,percentPosition,-scrollbar.AbsoluteSize.X/2) - - if scrollbar.AbsolutePosition.y < scrollTrack.AbsolutePosition.y then - scrollbar.Position = UDim2.new(scrollbar.Position.X.Scale,scrollbar.Position.X.Offset,0,0) - end - - if (scrollbar.AbsolutePosition.y + scrollbar.AbsoluteSize.Y) > (scrollTrack.AbsolutePosition.y + scrollTrack.AbsoluteSize.y) then - local relativeSize = scrollbar.AbsoluteSize.Y/scrollTrack.AbsoluteSize.Y - scrollbar.Position = UDim2.new(scrollbar.Position.X.Scale,scrollbar.Position.X.Offset,1 - relativeSize,0) - end - end - - local buttonScrollAmountPixels = 7 - local reentrancyGuardScrollUp = false - local function doScrollUp() - if reentrancyGuardScrollUp then return end - - reentrancyGuardScrollUp = true - if positionScrollBar(0,scrollbar.AbsolutePosition.Y - buttonScrollAmountPixels,0) then - recalculate() - end - reentrancyGuardScrollUp = false - end - - local reentrancyGuardScrollDown = false - local function doScrollDown() - if reentrancyGuardScrollDown then return end - - reentrancyGuardScrollDown = true - if positionScrollBar(0,scrollbar.AbsolutePosition.Y + buttonScrollAmountPixels,0) then - recalculate() - end - reentrancyGuardScrollDown = false - end - - local function scrollUp(mouseYPos) - if scrollUpButton.Active then - scrollStamp = tick() - local current = scrollStamp - local upCon - upCon = mouseDrag.MouseButton1Up:connect(function() - scrollStamp = tick() - mouseDrag.Parent = nil - upCon:disconnect() - end) - mouseDrag.Parent = getScreenGuiAncestor(scrollbar) - doScrollUp() - wait(0.2) - local t = tick() - local w = 0.1 - while scrollStamp == current do - doScrollUp() - if mouseYPos and mouseYPos > scrollbar.AbsolutePosition.y then - break - end - if not scrollUpButton.Active then break end - if tick()-t > 5 then - w = 0 - elseif tick()-t > 2 then - w = 0.06 - end - wait(w) - end - end - end - - local function scrollDown(mouseYPos) - if scrollDownButton.Active then - scrollStamp = tick() - local current = scrollStamp - local downCon - downCon = mouseDrag.MouseButton1Up:connect(function() - scrollStamp = tick() - mouseDrag.Parent = nil - downCon:disconnect() - end) - mouseDrag.Parent = getScreenGuiAncestor(scrollbar) - doScrollDown() - wait(0.2) - local t = tick() - local w = 0.1 - while scrollStamp == current do - doScrollDown() - if mouseYPos and mouseYPos < (scrollbar.AbsolutePosition.y + scrollbar.AbsoluteSize.x) then - break - end - if not scrollDownButton.Active then break end - if tick()-t > 5 then - w = 0 - elseif tick()-t > 2 then - w = 0.06 - end - wait(w) - end - end - end - - scrollbar.MouseButton1Down:connect(function(x,y) - if scrollbar.Active then - scrollStamp = tick() - local mouseOffset = y - scrollbar.AbsolutePosition.y - if dragCon then dragCon:disconnect() dragCon = nil end - if upCon then upCon:disconnect() upCon = nil end - local prevY = y - local reentrancyGuardMouseScroll = false - dragCon = mouseDrag.MouseMoved:connect(function(x,y) - if reentrancyGuardMouseScroll then return end - - reentrancyGuardMouseScroll = true - if positionScrollBar(x,y,mouseOffset) then - recalculate() - end - reentrancyGuardMouseScroll = false - - end) - upCon = mouseDrag.MouseButton1Up:connect(function() - scrollStamp = tick() - mouseDrag.Parent = nil - dragCon:disconnect(); dragCon = nil - upCon:disconnect(); drag = nil - end) - mouseDrag.Parent = getScreenGuiAncestor(scrollbar) - end - end) - - local scrollMouseCount = 0 - - scrollUpButton.MouseButton1Down:connect(function() - scrollUp() - end) - scrollUpButton.MouseButton1Up:connect(function() - scrollStamp = tick() - end) - - scrollDownButton.MouseButton1Up:connect(function() - scrollStamp = tick() - end) - scrollDownButton.MouseButton1Down:connect(function() - scrollDown() - end) - - scrollbar.MouseButton1Up:connect(function() - scrollStamp = tick() - end) - - local function heightCheck(instance) - if highY and (instance.AbsolutePosition.Y + instance.AbsoluteSize.Y) > highY then - highY = instance.AbsolutePosition.Y + instance.AbsoluteSize.Y - elseif not highY then - highY = instance.AbsolutePosition.Y + instance.AbsoluteSize.Y - end - setSliderSizeAndPosition() - end - - local function highLowRecheck() - local oldLowY = lowY - local oldHighY = highY - lowY = nil - highY = nil - resetHighLow() - - if (lowY ~= oldLowY) or (highY ~= oldHighY) then - setSliderSizeAndPosition() - end - end - - local function descendantChanged(this, prop) - if internalChange then return end - if not this.Visible then return end - - if prop == "Size" or prop == "Position" then - wait() - highLowRecheck() - end - end - - scrollingFrame.DescendantAdded:connect(function(instance) - if not instance:IsA("GuiObject") then return end - - if instance.Visible then - wait() -- wait a heartbeat for sizes to reconfig - highLowRecheck() - end - - descendantsChangeConMap[instance] = instance.Changed:connect(function(prop) descendantChanged(instance, prop) end) - end) - - scrollingFrame.DescendantRemoving:connect(function(instance) - if not instance:IsA("GuiObject") then return end - if descendantsChangeConMap[instance] then - descendantsChangeConMap[instance]:disconnect() - descendantsChangeConMap[instance] = nil - end - wait() -- wait a heartbeat for sizes to reconfig - highLowRecheck() - end) - - scrollingFrame.Changed:connect(function(prop) - if prop == "AbsoluteSize" then - if not highY or not lowY then return end - - highLowRecheck() - setSliderSizeAndPosition() - end - end) - - return scrollingFrame, controlFrame -end - -t.CreateScrollingFrame = function(orderList,scrollStyle) - local frame = Instance.new("Frame") - frame.Name = "ScrollingFrame" - frame.BackgroundTransparency = 1 - frame.Size = UDim2.new(1,0,1,0) - - local scrollUpButton = Instance.new("ImageButton") - scrollUpButton.Name = "ScrollUpButton" - scrollUpButton.BackgroundTransparency = 1 - scrollUpButton.Image = "rbxasset://textures/ui/scrollbuttonUp.png" - scrollUpButton.Size = UDim2.new(0,17,0,17) - - - local scrollDownButton = Instance.new("ImageButton") - scrollDownButton.Name = "ScrollDownButton" - scrollDownButton.BackgroundTransparency = 1 - scrollDownButton.Image = "rbxasset://textures/ui/scrollbuttonDown.png" - scrollDownButton.Size = UDim2.new(0,17,0,17) - - local scrollbar = Instance.new("ImageButton") - scrollbar.Name = "ScrollBar" - scrollbar.Image = "rbxasset://textures/ui/scrollbar.png" - scrollbar.BackgroundTransparency = 1 - scrollbar.Size = UDim2.new(0, 18, 0, 150) - - local scrollStamp = 0 - - local scrollDrag = Instance.new("ImageButton") - scrollDrag.Image = "http://www.roblox.com/asset/?id=61367186" - scrollDrag.Size = UDim2.new(1, 0, 0, 16) - scrollDrag.BackgroundTransparency = 1 - scrollDrag.Name = "ScrollDrag" - scrollDrag.Active = true - scrollDrag.Parent = scrollbar - - local mouseDrag = Instance.new("ImageButton") - mouseDrag.Active = false - mouseDrag.Size = UDim2.new(1.5, 0, 1.5, 0) - mouseDrag.AutoButtonColor = false - mouseDrag.BackgroundTransparency = 1 - mouseDrag.Name = "mouseDrag" - mouseDrag.Position = UDim2.new(-0.25, 0, -0.25, 0) - mouseDrag.ZIndex = 10 - - local style = "simple" - if scrollStyle and tostring(scrollStyle) then - style = scrollStyle - end - - local scrollPosition = 1 - local rowSize = 0 - local howManyDisplayed = 0 - - local layoutGridScrollBar = function() - howManyDisplayed = 0 - local guiObjects = {} - if orderList then - for i, child in ipairs(orderList) do - if child.Parent == frame then - table.insert(guiObjects, child) - end - end - else - local children = frame:GetChildren() - if children then - for i, child in ipairs(children) do - if child:IsA("GuiObject") then - table.insert(guiObjects, child) - end - end - end - end - if #guiObjects == 0 then - scrollUpButton.Active = false - scrollDownButton.Active = false - scrollDrag.Active = false - scrollPosition = 1 - return - end - - if scrollPosition > #guiObjects then - scrollPosition = #guiObjects - end - - if scrollPosition < 1 then scrollPosition = 1 end - - local totalPixelsY = frame.AbsoluteSize.Y - local pixelsRemainingY = frame.AbsoluteSize.Y - - local totalPixelsX = frame.AbsoluteSize.X - - local xCounter = 0 - local rowSizeCounter = 0 - local setRowSize = true - - local pixelsBelowScrollbar = 0 - local pos = #guiObjects - - local currentRowY = 0 - - pos = scrollPosition - --count up from current scroll position to fill out grid - while pos <= #guiObjects and pixelsBelowScrollbar < totalPixelsY do - xCounter = xCounter + guiObjects[pos].AbsoluteSize.X - --previous pos was the end of a row - if xCounter >= totalPixelsX then - pixelsBelowScrollbar = pixelsBelowScrollbar + currentRowY - currentRowY = 0 - xCounter = guiObjects[pos].AbsoluteSize.X - end - if guiObjects[pos].AbsoluteSize.Y > currentRowY then - currentRowY = guiObjects[pos].AbsoluteSize.Y - end - pos = pos + 1 - end - --Count wherever current row left off - pixelsBelowScrollbar = pixelsBelowScrollbar + currentRowY - currentRowY = 0 - - pos = scrollPosition - 1 - xCounter = 0 - - --objects with varying X,Y dimensions can rarely cause minor errors - --rechecking every new scrollPosition is necessary to avoid 100% of errors - - --count backwards from current scrollPosition to see if we can add more rows - while pixelsBelowScrollbar + currentRowY < totalPixelsY and pos >= 1 do - xCounter = xCounter + guiObjects[pos].AbsoluteSize.X - rowSizeCounter = rowSizeCounter + 1 - if xCounter >= totalPixelsX then - rowSize = rowSizeCounter - 1 - rowSizeCounter = 0 - xCounter = guiObjects[pos].AbsoluteSize.X - if pixelsBelowScrollbar + currentRowY <= totalPixelsY then - --It fits, so back up our scroll position - pixelsBelowScrollbar = pixelsBelowScrollbar + currentRowY - if scrollPosition <= rowSize then - scrollPosition = 1 - break - else - scrollPosition = scrollPosition - rowSize - end - currentRowY = 0 - else - break - end - end - - if guiObjects[pos].AbsoluteSize.Y > currentRowY then - currentRowY = guiObjects[pos].AbsoluteSize.Y - end - - pos = pos - 1 - end - - --Do check last time if pos = 0 - if (pos == 0) and (pixelsBelowScrollbar + currentRowY <= totalPixelsY) then - scrollPosition = 1 - end - - xCounter = 0 - --pos = scrollPosition - rowSizeCounter = 0 - setRowSize = true - local lastChildSize = 0 - - local xOffset,yOffset = 0 - if guiObjects[1] then - yOffset = math.ceil(math.floor(math.fmod(totalPixelsY,guiObjects[1].AbsoluteSize.X))/2) - xOffset = math.ceil(math.floor(math.fmod(totalPixelsX,guiObjects[1].AbsoluteSize.Y))/2) - end - - for i, child in ipairs(guiObjects) do - if i < scrollPosition then - --print("Hiding " .. child.Name) - child.Visible = false - else - if pixelsRemainingY < 0 then - --print("Out of Space " .. child.Name) - child.Visible = false - else - --print("Laying out " .. child.Name) - --GuiObject - if setRowSize then rowSizeCounter = rowSizeCounter + 1 end - if xCounter + child.AbsoluteSize.X >= totalPixelsX then - if setRowSize then - rowSize = rowSizeCounter - 1 - setRowSize = false - end - xCounter = 0 - pixelsRemainingY = pixelsRemainingY - child.AbsoluteSize.Y - end - child.Position = UDim2.new(child.Position.X.Scale,xCounter + xOffset, 0, totalPixelsY - pixelsRemainingY + yOffset) - xCounter = xCounter + child.AbsoluteSize.X - child.Visible = ((pixelsRemainingY - child.AbsoluteSize.Y) >= 0) - if child.Visible then - howManyDisplayed = howManyDisplayed + 1 - end - lastChildSize = child.AbsoluteSize - end - end - end - - scrollUpButton.Active = (scrollPosition > 1) - if lastChildSize == 0 then - scrollDownButton.Active = false - else - scrollDownButton.Active = ((pixelsRemainingY - lastChildSize.Y) < 0) - end - scrollDrag.Active = #guiObjects > howManyDisplayed - scrollDrag.Visible = scrollDrag.Active - end - - - - local layoutSimpleScrollBar = function() - local guiObjects = {} - howManyDisplayed = 0 - - if orderList then - for i, child in ipairs(orderList) do - if child.Parent == frame then - table.insert(guiObjects, child) - end - end - else - local children = frame:GetChildren() - if children then - for i, child in ipairs(children) do - if child:IsA("GuiObject") then - table.insert(guiObjects, child) - end - end - end - end - if #guiObjects == 0 then - scrollUpButton.Active = false - scrollDownButton.Active = false - scrollDrag.Active = false - scrollPosition = 1 - return - end - - if scrollPosition > #guiObjects then - scrollPosition = #guiObjects - end - - local totalPixels = frame.AbsoluteSize.Y - local pixelsRemaining = frame.AbsoluteSize.Y - - local pixelsBelowScrollbar = 0 - local pos = #guiObjects - while pixelsBelowScrollbar < totalPixels and pos >= 1 do - if pos >= scrollPosition then - pixelsBelowScrollbar = pixelsBelowScrollbar + guiObjects[pos].AbsoluteSize.Y - else - if pixelsBelowScrollbar + guiObjects[pos].AbsoluteSize.Y <= totalPixels then - --It fits, so back up our scroll position - pixelsBelowScrollbar = pixelsBelowScrollbar + guiObjects[pos].AbsoluteSize.Y - if scrollPosition <= 1 then - scrollPosition = 1 - break - else - --local ("Backing up ScrollPosition from -- " ..scrollPosition) - scrollPosition = scrollPosition - 1 - end - else - break - end - end - pos = pos - 1 - end - - pos = scrollPosition - for i, child in ipairs(guiObjects) do - if i < scrollPosition then - --print("Hiding " .. child.Name) - child.Visible = false - else - if pixelsRemaining < 0 then - --print("Out of Space " .. child.Name) - child.Visible = false - else - --print("Laying out " .. child.Name) - --GuiObject - child.Position = UDim2.new(child.Position.X.Scale, child.Position.X.Offset, 0, totalPixels - pixelsRemaining) - pixelsRemaining = pixelsRemaining - child.AbsoluteSize.Y - if (pixelsRemaining >= 0) then - child.Visible = true - howManyDisplayed = howManyDisplayed + 1 - else - child.Visible = false - end - end - end - end - scrollUpButton.Active = (scrollPosition > 1) - scrollDownButton.Active = (pixelsRemaining < 0) - scrollDrag.Active = #guiObjects > howManyDisplayed - scrollDrag.Visible = scrollDrag.Active - end - - - local moveDragger = function() - local guiObjects = 0 - local children = frame:GetChildren() - if children then - for i, child in ipairs(children) do - if child:IsA("GuiObject") then - guiObjects = guiObjects + 1 - end - end - end - - if not scrollDrag.Parent then return end - - local dragSizeY = scrollDrag.Parent.AbsoluteSize.y * (1/(guiObjects - howManyDisplayed + 1)) - if dragSizeY < 16 then dragSizeY = 16 end - scrollDrag.Size = UDim2.new(scrollDrag.Size.X.Scale,scrollDrag.Size.X.Offset,scrollDrag.Size.Y.Scale,dragSizeY) - - local relativeYPos = (scrollPosition - 1)/(guiObjects - (howManyDisplayed)) - if relativeYPos > 1 then relativeYPos = 1 - elseif relativeYPos < 0 then relativeYPos = 0 end - local absYPos = 0 - - if relativeYPos ~= 0 then - absYPos = (relativeYPos * scrollbar.AbsoluteSize.y) - (relativeYPos * scrollDrag.AbsoluteSize.y) - end - - scrollDrag.Position = UDim2.new(scrollDrag.Position.X.Scale,scrollDrag.Position.X.Offset,scrollDrag.Position.Y.Scale,absYPos) - end - - local reentrancyGuard = false - local recalculate = function() - if reentrancyGuard then - return - end - reentrancyGuard = true - wait() - local success, err = nil - if style == "grid" then - success, err = pcall(function() layoutGridScrollBar() end) - elseif style == "simple" then - success, err = pcall(function() layoutSimpleScrollBar() end) - end - if not success then print(err) end - moveDragger() - reentrancyGuard = false - end - - local doScrollUp = function() - scrollPosition = (scrollPosition) - rowSize - if scrollPosition < 1 then scrollPosition = 1 end - recalculate(nil) - end - - local doScrollDown = function() - scrollPosition = (scrollPosition) + rowSize - recalculate(nil) - end - - local scrollUp = function(mouseYPos) - if scrollUpButton.Active then - scrollStamp = tick() - local current = scrollStamp - local upCon - upCon = mouseDrag.MouseButton1Up:connect(function() - scrollStamp = tick() - mouseDrag.Parent = nil - upCon:disconnect() - end) - mouseDrag.Parent = getScreenGuiAncestor(scrollbar) - doScrollUp() - wait(0.2) - local t = tick() - local w = 0.1 - while scrollStamp == current do - doScrollUp() - if mouseYPos and mouseYPos > scrollDrag.AbsolutePosition.y then - break - end - if not scrollUpButton.Active then break end - if tick()-t > 5 then - w = 0 - elseif tick()-t > 2 then - w = 0.06 - end - wait(w) - end - end - end - - local scrollDown = function(mouseYPos) - if scrollDownButton.Active then - scrollStamp = tick() - local current = scrollStamp - local downCon - downCon = mouseDrag.MouseButton1Up:connect(function() - scrollStamp = tick() - mouseDrag.Parent = nil - downCon:disconnect() - end) - mouseDrag.Parent = getScreenGuiAncestor(scrollbar) - doScrollDown() - wait(0.2) - local t = tick() - local w = 0.1 - while scrollStamp == current do - doScrollDown() - if mouseYPos and mouseYPos < (scrollDrag.AbsolutePosition.y + scrollDrag.AbsoluteSize.x) then - break - end - if not scrollDownButton.Active then break end - if tick()-t > 5 then - w = 0 - elseif tick()-t > 2 then - w = 0.06 - end - wait(w) - end - end - end - - local y = 0 - scrollDrag.MouseButton1Down:connect(function(x,y) - if scrollDrag.Active then - scrollStamp = tick() - local mouseOffset = y - scrollDrag.AbsolutePosition.y - local dragCon - local upCon - dragCon = mouseDrag.MouseMoved:connect(function(x,y) - local barAbsPos = scrollbar.AbsolutePosition.y - local barAbsSize = scrollbar.AbsoluteSize.y - - local dragAbsSize = scrollDrag.AbsoluteSize.y - local barAbsOne = barAbsPos + barAbsSize - dragAbsSize - y = y - mouseOffset - y = y < barAbsPos and barAbsPos or y > barAbsOne and barAbsOne or y - y = y - barAbsPos - - local guiObjects = 0 - local children = frame:GetChildren() - if children then - for i, child in ipairs(children) do - if child:IsA("GuiObject") then - guiObjects = guiObjects + 1 - end - end - end - - local doublePercent = y/(barAbsSize-dragAbsSize) - local rowDiff = rowSize - local totalScrollCount = guiObjects - (howManyDisplayed - 1) - local newScrollPosition = math.floor((doublePercent * totalScrollCount) + 0.5) + rowDiff - if newScrollPosition < scrollPosition then - rowDiff = -rowDiff - end - - if newScrollPosition < 1 then - newScrollPosition = 1 - end - - scrollPosition = newScrollPosition - recalculate(nil) - end) - upCon = mouseDrag.MouseButton1Up:connect(function() - scrollStamp = tick() - mouseDrag.Parent = nil - dragCon:disconnect(); dragCon = nil - upCon:disconnect(); drag = nil - end) - mouseDrag.Parent = getScreenGuiAncestor(scrollbar) - end - end) - - local scrollMouseCount = 0 - - scrollUpButton.MouseButton1Down:connect( - function() - scrollUp() - end) - scrollUpButton.MouseButton1Up:connect(function() - scrollStamp = tick() - end) - - - scrollDownButton.MouseButton1Up:connect(function() - scrollStamp = tick() - end) - scrollDownButton.MouseButton1Down:connect( - function() - scrollDown() - end) - - scrollbar.MouseButton1Up:connect(function() - scrollStamp = tick() - end) - scrollbar.MouseButton1Down:connect( - function(x,y) - if y > (scrollDrag.AbsoluteSize.y + scrollDrag.AbsolutePosition.y) then - scrollDown(y) - elseif y < (scrollDrag.AbsolutePosition.y) then - scrollUp(y) - end - end) - - - frame.ChildAdded:connect(function() - recalculate(nil) - end) - - frame.ChildRemoved:connect(function() - recalculate(nil) - end) - - frame.Changed:connect( - function(prop) - if prop == "AbsoluteSize" then - --Wait a heartbeat for it to sync in - recalculate(nil) - end - end) - frame.AncestryChanged:connect(function() recalculate(nil) end) - - return frame, scrollUpButton, scrollDownButton, recalculate, scrollbar -end -local function binaryGrow(min, max, fits) - if min > max then - return min - end - local biggestLegal = min - - while min <= max do - local mid = min + math.floor((max - min) / 2) - if fits(mid) and (biggestLegal == nil or biggestLegal < mid) then - biggestLegal = mid - - --Try growing - min = mid + 1 - else - --Doesn't fit, shrink - max = mid - 1 - end - end - return biggestLegal -end - - -local function binaryShrink(min, max, fits) - if min > max then - return min - end - local smallestLegal = max - - while min <= max do - local mid = min + math.floor((max - min) / 2) - if fits(mid) and (smallestLegal == nil or smallestLegal > mid) then - smallestLegal = mid - - --It fits, shrink - max = mid - 1 - else - --Doesn't fit, grow - min = mid + 1 - end - end - return smallestLegal -end - - -local function getGuiOwner(instance) - while instance ~= nil do - if instance:IsA("ScreenGui") or instance:IsA("BillboardGui") then - return instance - end - instance = instance.Parent - end - return nil -end - -t.AutoTruncateTextObject = function(textLabel) - local text = textLabel.Text - - local fullLabel = textLabel:Clone() - fullLabel.Name = "Full" .. textLabel.Name - fullLabel.BorderSizePixel = 0 - fullLabel.BackgroundTransparency = 0 - fullLabel.Text = text - fullLabel.TextXAlignment = Enum.TextXAlignment.Center - fullLabel.Position = UDim2.new(0,-3,0,0) - fullLabel.Size = UDim2.new(0,100,1,0) - fullLabel.Visible = false - fullLabel.Parent = textLabel - - local shortText = nil - local mouseEnterConnection = nil - local mouseLeaveConnection= nil - - local checkForResize = function() - if getGuiOwner(textLabel) == nil then - return - end - textLabel.Text = text - if textLabel.TextFits then - --Tear down the rollover if it is active - if mouseEnterConnection then - mouseEnterConnection:disconnect() - mouseEnterConnection = nil - end - if mouseLeaveConnection then - mouseLeaveConnection:disconnect() - mouseLeaveConnection = nil - end - else - local len = string.len(text) - textLabel.Text = text .. "~" - - --Shrink the text - local textSize = binaryGrow(0, len, - function(pos) - if pos == 0 then - textLabel.Text = "~" - else - textLabel.Text = string.sub(text, 1, pos) .. "~" - end - return textLabel.TextFits - end) - shortText = string.sub(text, 1, textSize) .. "~" - textLabel.Text = shortText - - --Make sure the fullLabel fits - if not fullLabel.TextFits then - --Already too small, grow it really bit to start - fullLabel.Size = UDim2.new(0, 10000, 1, 0) - end - - --Okay, now try to binary shrink it back down - local fullLabelSize = binaryShrink(textLabel.AbsoluteSize.X,fullLabel.AbsoluteSize.X, - function(size) - fullLabel.Size = UDim2.new(0, size, 1, 0) - return fullLabel.TextFits - end) - fullLabel.Size = UDim2.new(0,fullLabelSize+6,1,0) - - --Now setup the rollover effects, if they are currently off - if mouseEnterConnection == nil then - mouseEnterConnection = textLabel.MouseEnter:connect( - function() - fullLabel.ZIndex = textLabel.ZIndex + 1 - fullLabel.Visible = true - --textLabel.Text = "" - end) - end - if mouseLeaveConnection == nil then - mouseLeaveConnection = textLabel.MouseLeave:connect( - function() - fullLabel.Visible = false - --textLabel.Text = shortText - end) - end - end - end - textLabel.AncestryChanged:connect(checkForResize) - textLabel.Changed:connect( - function(prop) - if prop == "AbsoluteSize" then - checkForResize() - end - end) - - checkForResize() - - local function changeText(newText) - text = newText - fullLabel.Text = text - checkForResize() - end - - return textLabel, changeText -end - -local function TransitionTutorialPages(fromPage, toPage, transitionFrame, currentPageValue) - if fromPage then - fromPage.Visible = false - if transitionFrame.Visible == false then - transitionFrame.Size = fromPage.Size - transitionFrame.Position = fromPage.Position - end - else - if transitionFrame.Visible == false then - transitionFrame.Size = UDim2.new(0.0,50,0.0,50) - transitionFrame.Position = UDim2.new(0.5,-25,0.5,-25) - end - end - transitionFrame.Visible = true - currentPageValue.Value = nil - - local newsize, newPosition - if toPage then - --Make it visible so it resizes - toPage.Visible = true - - newSize = toPage.Size - newPosition = toPage.Position - - toPage.Visible = false - else - newSize = UDim2.new(0.0,50,0.0,50) - newPosition = UDim2.new(0.5,-25,0.5,-25) - end - transitionFrame:TweenSizeAndPosition(newSize, newPosition, Enum.EasingDirection.InOut, Enum.EasingStyle.Quad, 0.3, true, - function(state) - if state == Enum.TweenStatus.Completed then - transitionFrame.Visible = false - if toPage then - toPage.Visible = true - currentPageValue.Value = toPage - end - end - end) -end - -t.CreateTutorial = function(name, tutorialKey, createButtons) - local frame = Instance.new("Frame") - frame.Name = "Tutorial-" .. name - frame.BackgroundTransparency = 1 - frame.Size = UDim2.new(0.6, 0, 0.6, 0) - frame.Position = UDim2.new(0.2, 0, 0.2, 0) - - local transitionFrame = Instance.new("Frame") - transitionFrame.Name = "TransitionFrame" - transitionFrame.Style = Enum.FrameStyle.RobloxRound - transitionFrame.Size = UDim2.new(0.6, 0, 0.6, 0) - transitionFrame.Position = UDim2.new(0.2, 0, 0.2, 0) - transitionFrame.Visible = false - transitionFrame.Parent = frame - - local currentPageValue = Instance.new("ObjectValue") - currentPageValue.Name = "CurrentTutorialPage" - currentPageValue.Value = nil - currentPageValue.Parent = frame - - local boolValue = Instance.new("BoolValue") - boolValue.Name = "Buttons" - boolValue.Value = createButtons - boolValue.Parent = frame - - local pages = Instance.new("Frame") - pages.Name = "Pages" - pages.BackgroundTransparency = 1 - pages.Size = UDim2.new(1,0,1,0) - pages.Parent = frame - - local function getVisiblePageAndHideOthers() - local visiblePage = nil - local children = pages:GetChildren() - if children then - for i,child in ipairs(children) do - if child.Visible then - if visiblePage then - child.Visible = false - else - visiblePage = child - end - end - end - end - return visiblePage - end - - local showTutorial = function(alwaysShow) - if alwaysShow or UserSettings().GameSettings:GetTutorialState(tutorialKey) == false then - print("Showing tutorial-",tutorialKey) - local currentTutorialPage = getVisiblePageAndHideOthers() - - local firstPage = pages:FindFirstChild("TutorialPage1") - if firstPage then - TransitionTutorialPages(currentTutorialPage, firstPage, transitionFrame, currentPageValue) - else - error("Could not find TutorialPage1") - end - end - end - - local dismissTutorial = function() - local currentTutorialPage = getVisiblePageAndHideOthers() - - if currentTutorialPage then - TransitionTutorialPages(currentTutorialPage, nil, transitionFrame, currentPageValue) - end - - UserSettings().GameSettings:SetTutorialState(tutorialKey, true) - end - - local gotoPage = function(pageNum) - local page = pages:FindFirstChild("TutorialPage" .. pageNum) - local currentTutorialPage = getVisiblePageAndHideOthers() - TransitionTutorialPages(currentTutorialPage, page, transitionFrame, currentPageValue) - end - - return frame, showTutorial, dismissTutorial, gotoPage -end - -local function CreateBasicTutorialPage(name, handleResize, skipTutorial, giveDoneButton) - local frame = Instance.new("Frame") - frame.Name = "TutorialPage" - frame.Style = Enum.FrameStyle.RobloxRound - frame.Size = UDim2.new(0.6, 0, 0.6, 0) - frame.Position = UDim2.new(0.2, 0, 0.2, 0) - frame.Visible = false - - local frameHeader = Instance.new("TextLabel") - frameHeader.Name = "Header" - frameHeader.Text = name - frameHeader.BackgroundTransparency = 1 - frameHeader.FontSize = Enum.FontSize.Size24 - frameHeader.Font = Enum.Font.ArialBold - frameHeader.TextColor3 = Color3.new(1,1,1) - frameHeader.TextXAlignment = Enum.TextXAlignment.Center - frameHeader.TextWrap = true - frameHeader.Size = UDim2.new(1,-55, 0, 22) - frameHeader.Position = UDim2.new(0,0,0,0) - frameHeader.Parent = frame - - local skipButton = Instance.new("ImageButton") - skipButton.Name = "SkipButton" - skipButton.AutoButtonColor = false - skipButton.BackgroundTransparency = 1 - skipButton.Image = "rbxasset://textures/ui/closeButton.png" - skipButton.MouseButton1Click:connect(function() - skipTutorial() - end) - skipButton.MouseEnter:connect(function() - skipButton.Image = "rbxasset://textures/ui/closeButton_dn.png" - end) - skipButton.MouseLeave:connect(function() - skipButton.Image = "rbxasset://textures/ui/closeButton.png" - end) - skipButton.Size = UDim2.new(0, 25, 0, 25) - skipButton.Position = UDim2.new(1, -25, 0, 0) - skipButton.Parent = frame - - - if giveDoneButton then - local doneButton = Instance.new("TextButton") - doneButton.Name = "DoneButton" - doneButton.Style = Enum.ButtonStyle.RobloxButtonDefault - doneButton.Text = "Done" - doneButton.TextColor3 = Color3.new(1,1,1) - doneButton.Font = Enum.Font.ArialBold - doneButton.FontSize = Enum.FontSize.Size18 - doneButton.Size = UDim2.new(0,100,0,50) - doneButton.Position = UDim2.new(0.5,-50,1,-50) - - if skipTutorial then - doneButton.MouseButton1Click:connect(function() skipTutorial() end) - end - - doneButton.Parent = frame - end - - local innerFrame = Instance.new("Frame") - innerFrame.Name = "ContentFrame" - innerFrame.BackgroundTransparency = 1 - innerFrame.Position = UDim2.new(0,0,0,25) - innerFrame.Parent = frame - - local nextButton = Instance.new("TextButton") - nextButton.Name = "NextButton" - nextButton.Text = "Next" - nextButton.TextColor3 = Color3.new(1,1,1) - nextButton.Font = Enum.Font.Arial - nextButton.FontSize = Enum.FontSize.Size18 - nextButton.Style = Enum.ButtonStyle.RobloxButtonDefault - nextButton.Size = UDim2.new(0,80, 0, 32) - nextButton.Position = UDim2.new(0.5, 5, 1, -32) - nextButton.Active = false - nextButton.Visible = false - nextButton.Parent = frame - - local prevButton = Instance.new("TextButton") - prevButton.Name = "PrevButton" - prevButton.Text = "Previous" - prevButton.TextColor3 = Color3.new(1,1,1) - prevButton.Font = Enum.Font.Arial - prevButton.FontSize = Enum.FontSize.Size18 - prevButton.Style = Enum.ButtonStyle.RobloxButton - prevButton.Size = UDim2.new(0,80, 0, 32) - prevButton.Position = UDim2.new(0.5, -85, 1, -32) - prevButton.Active = false - prevButton.Visible = false - prevButton.Parent = frame - - if giveDoneButton then - innerFrame.Size = UDim2.new(1,0,1,-75) - else - innerFrame.Size = UDim2.new(1,0,1,-22) - end - - local parentConnection = nil - - local function basicHandleResize() - if frame.Visible and frame.Parent then - local maxSize = math.min(frame.Parent.AbsoluteSize.X, frame.Parent.AbsoluteSize.Y) - handleResize(200,maxSize) - end - end - - frame.Changed:connect( - function(prop) - if prop == "Parent" then - if parentConnection ~= nil then - parentConnection:disconnect() - parentConnection = nil - end - if frame.Parent and frame.Parent:IsA("GuiObject") then - parentConnection = frame.Parent.Changed:connect( - function(parentProp) - if parentProp == "AbsoluteSize" then - wait() - basicHandleResize() - end - end) - basicHandleResize() - end - end - - if prop == "Visible" then - basicHandleResize() - end - end) - - return frame, innerFrame -end - -t.CreateTextTutorialPage = function(name, text, skipTutorialFunc) - local frame = nil - local contentFrame = nil - - local textLabel = Instance.new("TextLabel") - textLabel.BackgroundTransparency = 1 - textLabel.TextColor3 = Color3.new(1,1,1) - textLabel.Text = text - textLabel.TextWrap = true - textLabel.TextXAlignment = Enum.TextXAlignment.Left - textLabel.TextYAlignment = Enum.TextYAlignment.Center - textLabel.Font = Enum.Font.Arial - textLabel.FontSize = Enum.FontSize.Size14 - textLabel.Size = UDim2.new(1,0,1,0) - - local function handleResize(minSize, maxSize) - size = binaryShrink(minSize, maxSize, - function(size) - frame.Size = UDim2.new(0, size, 0, size) - return textLabel.TextFits - end) - frame.Size = UDim2.new(0, size, 0, size) - frame.Position = UDim2.new(0.5, -size/2, 0.5, -size/2) - end - - frame, contentFrame = CreateBasicTutorialPage(name, handleResize, skipTutorialFunc) - textLabel.Parent = contentFrame - - return frame -end - -t.CreateImageTutorialPage = function(name, imageAsset, x, y, skipTutorialFunc, giveDoneButton) - local frame = nil - local contentFrame = nil - - local imageLabel = Instance.new("ImageLabel") - imageLabel.BackgroundTransparency = 1 - imageLabel.Image = imageAsset - imageLabel.Size = UDim2.new(0,x,0,y) - imageLabel.Position = UDim2.new(0.5,-x/2,0.5,-y/2) - - local function handleResize(minSize, maxSize) - size = binaryShrink(minSize, maxSize, - function(size) - return size >= x and size >= y - end) - if size >= x and size >= y then - imageLabel.Size = UDim2.new(0,x, 0,y) - imageLabel.Position = UDim2.new(0.5,-x/2, 0.5, -y/2) - else - if x > y then - --X is limiter, so - imageLabel.Size = UDim2.new(1,0,y/x,0) - imageLabel.Position = UDim2.new(0,0, 0.5 - (y/x)/2, 0) - else - --Y is limiter - imageLabel.Size = UDim2.new(x/y,0,1, 0) - imageLabel.Position = UDim2.new(0.5-(x/y)/2, 0, 0, 0) - end - end - size = size + 50 - frame.Size = UDim2.new(0, size, 0, size) - frame.Position = UDim2.new(0.5, -size/2, 0.5, -size/2) - end - - frame, contentFrame = CreateBasicTutorialPage(name, handleResize, skipTutorialFunc, giveDoneButton) - imageLabel.Parent = contentFrame - - return frame -end - -t.AddTutorialPage = function(tutorial, tutorialPage) - local transitionFrame = tutorial.TransitionFrame - local currentPageValue = tutorial.CurrentTutorialPage - - if not tutorial.Buttons.Value then - tutorialPage.NextButton.Parent = nil - tutorialPage.PrevButton.Parent = nil - end - - local children = tutorial.Pages:GetChildren() - if children and #children > 0 then - tutorialPage.Name = "TutorialPage" .. (#children+1) - local previousPage = children[#children] - if not previousPage:IsA("GuiObject") then - error("All elements under Pages must be GuiObjects") - end - - if tutorial.Buttons.Value then - if previousPage.NextButton.Active then - error("NextButton already Active on previousPage, please only add pages with RbxGui.AddTutorialPage function") - end - previousPage.NextButton.MouseButton1Click:connect( - function() - TransitionTutorialPages(previousPage, tutorialPage, transitionFrame, currentPageValue) - end) - previousPage.NextButton.Active = true - previousPage.NextButton.Visible = true - - if tutorialPage.PrevButton.Active then - error("PrevButton already Active on tutorialPage, please only add pages with RbxGui.AddTutorialPage function") - end - tutorialPage.PrevButton.MouseButton1Click:connect( - function() - TransitionTutorialPages(tutorialPage, previousPage, transitionFrame, currentPageValue) - end) - tutorialPage.PrevButton.Active = true - tutorialPage.PrevButton.Visible = true - end - - tutorialPage.Parent = tutorial.Pages - else - --First child - tutorialPage.Name = "TutorialPage1" - tutorialPage.Parent = tutorial.Pages - end -end - -t.CreateSetPanel = function(userIdsForSets, objectSelected, dialogClosed, size, position, showAdminCategories, useAssetVersionId) - - if not userIdsForSets then - error("CreateSetPanel: userIdsForSets (first arg) is nil, should be a table of number ids") - end - if type(userIdsForSets) ~= "table" and type(userIdsForSets) ~= "userdata" then - error("CreateSetPanel: userIdsForSets (first arg) is of type " ..type(userIdsForSets) .. ", should be of type table or userdata") - end - if not objectSelected then - error("CreateSetPanel: objectSelected (second arg) is nil, should be a callback function!") - end - if type(objectSelected) ~= "function" then - error("CreateSetPanel: objectSelected (second arg) is of type " .. type(objectSelected) .. ", should be of type function!") - end - if dialogClosed and type(dialogClosed) ~= "function" then - error("CreateSetPanel: dialogClosed (third arg) is of type " .. type(dialogClosed) .. ", should be of type function!") - end - - if showAdminCategories == nil then -- by default, don't show beta sets - showAdminCategories = false - end - - local arrayPosition = 1 - local insertButtons = {} - local insertButtonCons = {} - local contents = nil - local setGui = nil - - -- used for water selections - local waterForceDirection = "NegX" - local waterForce = "None" - local waterGui, waterTypeChangedEvent = nil - - local Data = {} - Data.CurrentCategory = nil - Data.Category = {} - local SetCache = {} - - local userCategoryButtons = nil - - local buttonWidth = 64 - local buttonHeight = buttonWidth - - local SmallThumbnailUrl = nil - local LargeThumbnailUrl = nil - local BaseUrl = game:GetService("ContentProvider").BaseUrl:lower() - - if useAssetVersionId then - LargeThumbnailUrl = BaseUrl .. "Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=420&ht=420&assetversionid=" - SmallThumbnailUrl = BaseUrl .. "Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=75&ht=75&assetversionid=" - else - LargeThumbnailUrl = BaseUrl .. "Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=420&ht=420&aid=" - SmallThumbnailUrl = BaseUrl .. "Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=75&ht=75&aid=" - end - - local function drillDownSetZIndex(parent, index) - local children = parent:GetChildren() - for i = 1, #children do - if children[i]:IsA("GuiObject") then - children[i].ZIndex = index - end - drillDownSetZIndex(children[i], index) - end - end - - -- for terrain stamping - local currTerrainDropDownFrame = nil - local terrainShapes = {"Block","Vertical Ramp","Corner Wedge","Inverse Corner Wedge","Horizontal Ramp","Auto-Wedge"} - local terrainShapeMap = {} - for i = 1, #terrainShapes do - terrainShapeMap[terrainShapes[i]] = i - 1 - end - terrainShapeMap[terrainShapes[#terrainShapes]] = 6 - - local function createWaterGui() - local waterForceDirections = {"NegX","X","NegY","Y","NegZ","Z"} - local waterForces = {"None", "Small", "Medium", "Strong", "Max"} - - local waterFrame = Instance.new("Frame") - waterFrame.Name = "WaterFrame" - waterFrame.Style = Enum.FrameStyle.RobloxSquare - waterFrame.Size = UDim2.new(0,150,0,110) - waterFrame.Visible = false - - local waterForceLabel = Instance.new("TextLabel") - waterForceLabel.Name = "WaterForceLabel" - waterForceLabel.BackgroundTransparency = 1 - waterForceLabel.Size = UDim2.new(1,0,0,12) - waterForceLabel.Font = Enum.Font.ArialBold - waterForceLabel.FontSize = Enum.FontSize.Size12 - waterForceLabel.TextColor3 = Color3.new(1,1,1) - waterForceLabel.TextXAlignment = Enum.TextXAlignment.Left - waterForceLabel.Text = "Water Force" - waterForceLabel.Parent = waterFrame - - local waterForceDirLabel = waterForceLabel:Clone() - waterForceDirLabel.Name = "WaterForceDirectionLabel" - waterForceDirLabel.Text = "Water Force Direction" - waterForceDirLabel.Position = UDim2.new(0,0,0,50) - waterForceDirLabel.Parent = waterFrame - - local waterTypeChangedEvent = Instance.new("BindableEvent",waterFrame) - waterTypeChangedEvent.Name = "WaterTypeChangedEvent" - - local waterForceDirectionSelectedFunc = function(newForceDirection) - waterForceDirection = newForceDirection - waterTypeChangedEvent:Fire({waterForce, waterForceDirection}) - end - local waterForceSelectedFunc = function(newForce) - waterForce = newForce - waterTypeChangedEvent:Fire({waterForce, waterForceDirection}) - end - - local waterForceDirectionDropDown, forceWaterDirectionSelection = t.CreateDropDownMenu(waterForceDirections, waterForceDirectionSelectedFunc) - waterForceDirectionDropDown.Size = UDim2.new(1,0,0,25) - waterForceDirectionDropDown.Position = UDim2.new(0,0,1,3) - forceWaterDirectionSelection("NegX") - waterForceDirectionDropDown.Parent = waterForceDirLabel - - local waterForceDropDown, forceWaterForceSelection = t.CreateDropDownMenu(waterForces, waterForceSelectedFunc) - forceWaterForceSelection("None") - waterForceDropDown.Size = UDim2.new(1,0,0,25) - waterForceDropDown.Position = UDim2.new(0,0,1,3) - waterForceDropDown.Parent = waterForceLabel - - return waterFrame, waterTypeChangedEvent - end - - -- Helper Function that contructs gui elements - local function createSetGui() - - local setGui = Instance.new("ScreenGui") - setGui.Name = "SetGui" - - local setPanel = Instance.new("Frame") - setPanel.Name = "SetPanel" - setPanel.Active = true - setPanel.BackgroundTransparency = 1 - if position then - setPanel.Position = position - else - setPanel.Position = UDim2.new(0.2, 29, 0.1, 24) - end - if size then - setPanel.Size = size - else - setPanel.Size = UDim2.new(0.6, -58, 0.64, 0) - end - setPanel.Style = Enum.FrameStyle.RobloxRound - setPanel.ZIndex = 6 - setPanel.Parent = setGui - - -- Children of SetPanel - local itemPreview = Instance.new("Frame") - itemPreview.Name = "ItemPreview" - itemPreview.BackgroundTransparency = 1 - itemPreview.Position = UDim2.new(0.8,5,0.085,0) - itemPreview.Size = UDim2.new(0.21,0,0.9,0) - itemPreview.ZIndex = 6 - itemPreview.Parent = setPanel - - -- Children of ItemPreview - local textPanel = Instance.new("Frame") - textPanel.Name = "TextPanel" - textPanel.BackgroundTransparency = 1 - textPanel.Position = UDim2.new(0,0,0.45,0) - textPanel.Size = UDim2.new(1,0,0.55,0) - textPanel.ZIndex = 6 - textPanel.Parent = itemPreview - - -- Children of TextPanel - local rolloverText = Instance.new("TextLabel") - rolloverText.Name = "RolloverText" - rolloverText.BackgroundTransparency = 1 - rolloverText.Size = UDim2.new(1,0,0,48) - rolloverText.ZIndex = 6 - rolloverText.Font = Enum.Font.ArialBold - rolloverText.FontSize = Enum.FontSize.Size24 - rolloverText.Text = "" - rolloverText.TextColor3 = Color3.new(1,1,1) - rolloverText.TextWrap = true - rolloverText.TextXAlignment = Enum.TextXAlignment.Left - rolloverText.TextYAlignment = Enum.TextYAlignment.Top - rolloverText.Parent = textPanel - - local largePreview = Instance.new("ImageLabel") - largePreview.Name = "LargePreview" - largePreview.BackgroundTransparency = 1 - largePreview.Image = "" - largePreview.Size = UDim2.new(1,0,0,170) - largePreview.ZIndex = 6 - largePreview.Parent = itemPreview - - local sets = Instance.new("Frame") - sets.Name = "Sets" - sets.BackgroundTransparency = 1 - sets.Position = UDim2.new(0,0,0,5) - sets.Size = UDim2.new(0.23,0,1,-5) - sets.ZIndex = 6 - sets.Parent = setPanel - - -- Children of Sets - local line = Instance.new("Frame") - line.Name = "Line" - line.BackgroundColor3 = Color3.new(1,1,1) - line.BackgroundTransparency = 0.7 - line.BorderSizePixel = 0 - line.Position = UDim2.new(1,-3,0.06,0) - line.Size = UDim2.new(0,3,0.9,0) - line.ZIndex = 6 - line.Parent = sets - - local setsLists, controlFrame = t.CreateTrueScrollingFrame() - setsLists.Size = UDim2.new(1,-6,0.94,0) - setsLists.Position = UDim2.new(0,0,0.06,0) - setsLists.BackgroundTransparency = 1 - setsLists.Name = "SetsLists" - setsLists.ZIndex = 6 - setsLists.Parent = sets - drillDownSetZIndex(controlFrame, 7) - - local setsHeader = Instance.new("TextLabel") - setsHeader.Name = "SetsHeader" - setsHeader.BackgroundTransparency = 1 - setsHeader.Size = UDim2.new(0,47,0,24) - setsHeader.ZIndex = 6 - setsHeader.Font = Enum.Font.ArialBold - setsHeader.FontSize = Enum.FontSize.Size24 - setsHeader.Text = "Sets" - setsHeader.TextColor3 = Color3.new(1,1,1) - setsHeader.TextXAlignment = Enum.TextXAlignment.Left - setsHeader.TextYAlignment = Enum.TextYAlignment.Top - setsHeader.Parent = sets - - local cancelButton = Instance.new("TextButton") - cancelButton.Name = "CancelButton" - cancelButton.Position = UDim2.new(1,-32,0,-2) - cancelButton.Size = UDim2.new(0,34,0,34) - cancelButton.Style = Enum.ButtonStyle.RobloxButtonDefault - cancelButton.ZIndex = 6 - cancelButton.Text = "" - cancelButton.Modal = true - cancelButton.Parent = setPanel - - -- Children of Cancel Button - local cancelImage = Instance.new("ImageLabel") - cancelImage.Name = "CancelImage" - cancelImage.BackgroundTransparency = 1 - cancelImage.Image = "http://www.roblox.com/asset/?id=54135717" - cancelImage.Position = UDim2.new(0,-2,0,-2) - cancelImage.Size = UDim2.new(0,16,0,16) - cancelImage.ZIndex = 6 - cancelImage.Parent = cancelButton - - return setGui - end - - local function createSetButton(text) - local setButton = Instance.new("TextButton") - - if text then setButton.Text = text - else setButton.Text = "" end - - setButton.AutoButtonColor = false - setButton.BackgroundTransparency = 1 - setButton.BackgroundColor3 = Color3.new(1,1,1) - setButton.BorderSizePixel = 0 - setButton.Size = UDim2.new(1,-5,0,18) - setButton.ZIndex = 6 - setButton.Visible = false - setButton.Font = Enum.Font.Arial - setButton.FontSize = Enum.FontSize.Size18 - setButton.TextColor3 = Color3.new(1,1,1) - setButton.TextXAlignment = Enum.TextXAlignment.Left - - return setButton - end - - local function buildSetButton(name, setId, setImageId, i, count) - local button = createSetButton(name) - button.Text = name - button.Name = "SetButton" - button.Visible = true - - local setValue = Instance.new("IntValue") - setValue.Name = "SetId" - setValue.Value = setId - setValue.Parent = button - - local setName = Instance.new("StringValue") - setName.Name = "SetName" - setName.Value = name - setName.Parent = button - - return button - end - - local function processCategory(sets) - local setButtons = {} - local numSkipped = 0 - for i = 1, #sets do - if not showAdminCategories and sets[i].Name == "Beta" then - numSkipped = numSkipped + 1 - else - setButtons[i - numSkipped] = buildSetButton(sets[i].Name, sets[i].CategoryId, sets[i].ImageAssetId, i - numSkipped, #sets) - end - end - return setButtons - end - - local function handleResize() - wait() -- neccessary to insure heartbeat happened - - local itemPreview = setGui.SetPanel.ItemPreview - - itemPreview.LargePreview.Size = UDim2.new(1,0,0,itemPreview.AbsoluteSize.X) - itemPreview.LargePreview.Position = UDim2.new(0.5,-itemPreview.LargePreview.AbsoluteSize.X/2,0,0) - itemPreview.TextPanel.Position = UDim2.new(0,0,0,itemPreview.LargePreview.AbsoluteSize.Y) - itemPreview.TextPanel.Size = UDim2.new(1,0,0,itemPreview.AbsoluteSize.Y - itemPreview.LargePreview.AbsoluteSize.Y) - end - - local function makeInsertAssetButton() - local insertAssetButtonExample = Instance.new("Frame") - insertAssetButtonExample.Name = "InsertAssetButtonExample" - insertAssetButtonExample.Position = UDim2.new(0,128,0,64) - insertAssetButtonExample.Size = UDim2.new(0,64,0,64) - insertAssetButtonExample.BackgroundTransparency = 1 - insertAssetButtonExample.ZIndex = 6 - insertAssetButtonExample.Visible = false - - local assetId = Instance.new("IntValue") - assetId.Name = "AssetId" - assetId.Value = 0 - assetId.Parent = insertAssetButtonExample - - local assetName = Instance.new("StringValue") - assetName.Name = "AssetName" - assetName.Value = "" - assetName.Parent = insertAssetButtonExample - - local button = Instance.new("TextButton") - button.Name = "Button" - button.Text = "" - button.Style = Enum.ButtonStyle.RobloxButton - button.Position = UDim2.new(0.025,0,0.025,0) - button.Size = UDim2.new(0.95,0,0.95,0) - button.ZIndex = 6 - button.Parent = insertAssetButtonExample - - local buttonImage = Instance.new("ImageLabel") - buttonImage.Name = "ButtonImage" - buttonImage.Image = "" - buttonImage.Position = UDim2.new(0,-7,0,-7) - buttonImage.Size = UDim2.new(1,14,1,14) - buttonImage.BackgroundTransparency = 1 - buttonImage.ZIndex = 7 - buttonImage.Parent = button - - local configIcon = buttonImage:clone() - configIcon.Name = "ConfigIcon" - configIcon.Visible = false - configIcon.Position = UDim2.new(1,-23,1,-24) - configIcon.Size = UDim2.new(0,16,0,16) - configIcon.Image = "" - configIcon.ZIndex = 6 - configIcon.Parent = insertAssetButtonExample - - return insertAssetButtonExample - end - - local function showLargePreview(insertButton) - if insertButton:FindFirstChild("AssetId") then - delay(0,function() - game:GetService("ContentProvider"):Preload(LargeThumbnailUrl .. tostring(insertButton.AssetId.Value)) - setGui.SetPanel.ItemPreview.LargePreview.Image = LargeThumbnailUrl .. tostring(insertButton.AssetId.Value) - end) - end - if insertButton:FindFirstChild("AssetName") then - setGui.SetPanel.ItemPreview.TextPanel.RolloverText.Text = insertButton.AssetName.Value - end - end - - local function selectTerrainShape(shape) - if currTerrainDropDownFrame then - objectSelected(tostring(currTerrainDropDownFrame.AssetName.Value), tonumber(currTerrainDropDownFrame.AssetId.Value), shape) - end - end - - local function createTerrainTypeButton(name, parent) - local dropDownTextButton = Instance.new("TextButton") - dropDownTextButton.Name = name .. "Button" - dropDownTextButton.Font = Enum.Font.ArialBold - dropDownTextButton.FontSize = Enum.FontSize.Size14 - dropDownTextButton.BorderSizePixel = 0 - dropDownTextButton.TextColor3 = Color3.new(1,1,1) - dropDownTextButton.Text = name - dropDownTextButton.TextXAlignment = Enum.TextXAlignment.Left - dropDownTextButton.BackgroundTransparency = 1 - dropDownTextButton.ZIndex = parent.ZIndex + 1 - dropDownTextButton.Size = UDim2.new(0,parent.Size.X.Offset - 2,0,16) - dropDownTextButton.Position = UDim2.new(0,1,0,0) - - dropDownTextButton.MouseEnter:connect(function() - dropDownTextButton.BackgroundTransparency = 0 - dropDownTextButton.TextColor3 = Color3.new(0,0,0) - end) - - dropDownTextButton.MouseLeave:connect(function() - dropDownTextButton.BackgroundTransparency = 1 - dropDownTextButton.TextColor3 = Color3.new(1,1,1) - end) - - dropDownTextButton.MouseButton1Click:connect(function() - dropDownTextButton.BackgroundTransparency = 1 - dropDownTextButton.TextColor3 = Color3.new(1,1,1) - if dropDownTextButton.Parent and dropDownTextButton.Parent:IsA("GuiObject") then - dropDownTextButton.Parent.Visible = false - end - selectTerrainShape(terrainShapeMap[dropDownTextButton.Text]) - end) - - return dropDownTextButton - end - - local function createTerrainDropDownMenu(zIndex) - local dropDown = Instance.new("Frame") - dropDown.Name = "TerrainDropDown" - dropDown.BackgroundColor3 = Color3.new(0,0,0) - dropDown.BorderColor3 = Color3.new(1,0,0) - dropDown.Size = UDim2.new(0,200,0,0) - dropDown.Visible = false - dropDown.ZIndex = zIndex - dropDown.Parent = setGui - - for i = 1, #terrainShapes do - local shapeButton = createTerrainTypeButton(terrainShapes[i],dropDown) - shapeButton.Position = UDim2.new(0,1,0,(i - 1) * (shapeButton.Size.Y.Offset)) - shapeButton.Parent = dropDown - dropDown.Size = UDim2.new(0,200,0,dropDown.Size.Y.Offset + (shapeButton.Size.Y.Offset)) - end - - dropDown.MouseLeave:connect(function() - dropDown.Visible = false - end) - end - - - local function createDropDownMenuButton(parent) - local dropDownButton = Instance.new("ImageButton") - dropDownButton.Name = "DropDownButton" - dropDownButton.Image = "http://www.roblox.com/asset/?id=67581509" - dropDownButton.BackgroundTransparency = 1 - dropDownButton.Size = UDim2.new(0,16,0,16) - dropDownButton.Position = UDim2.new(1,-24,0,6) - dropDownButton.ZIndex = parent.ZIndex + 2 - dropDownButton.Parent = parent - - if not setGui:FindFirstChild("TerrainDropDown") then - createTerrainDropDownMenu(8) - end - - dropDownButton.MouseButton1Click:connect(function() - setGui.TerrainDropDown.Visible = true - setGui.TerrainDropDown.Position = UDim2.new(0,parent.AbsolutePosition.X,0,parent.AbsolutePosition.Y) - currTerrainDropDownFrame = parent - end) - end - - local function buildInsertButton() - local insertButton = makeInsertAssetButton() - insertButton.Name = "InsertAssetButton" - insertButton.Visible = true - - if Data.Category[Data.CurrentCategory].SetName == "High Scalability" then - createDropDownMenuButton(insertButton) - end - - local lastEnter = nil - local mouseEnterCon = insertButton.MouseEnter:connect(function() - lastEnter = insertButton - delay(0.1,function() - if lastEnter == insertButton then - showLargePreview(insertButton) - end - end) - end) - return insertButton, mouseEnterCon - end - - local function realignButtonGrid(columns) - local x = 0 - local y = 0 - for i = 1, #insertButtons do - insertButtons[i].Position = UDim2.new(0, buttonWidth * x, 0, buttonHeight * y) - x = x + 1 - if x >= columns then - x = 0 - y = y + 1 - end - end - end - - local function setInsertButtonImageBehavior(insertFrame, visible, name, assetId) - if visible then - insertFrame.AssetName.Value = name - insertFrame.AssetId.Value = assetId - local newImageUrl = SmallThumbnailUrl .. assetId - if newImageUrl ~= insertFrame.Button.ButtonImage.Image then - delay(0,function() - game:GetService("ContentProvider"):Preload(SmallThumbnailUrl .. assetId) - if insertFrame:findFirstChild("Button") then - insertFrame.Button.ButtonImage.Image = SmallThumbnailUrl .. assetId - end - end) - end - table.insert(insertButtonCons, - insertFrame.Button.MouseButton1Click:connect(function() - -- special case for water, show water selection gui - local isWaterSelected = (name == "Water") and (Data.Category[Data.CurrentCategory].SetName == "High Scalability") - waterGui.Visible = isWaterSelected - if isWaterSelected then - objectSelected(name, tonumber(assetId), nil) - else - objectSelected(name, tonumber(assetId)) - end - end) - ) - insertFrame.Visible = true - else - insertFrame.Visible = false - end - end - - local function loadSectionOfItems(setGui, rows, columns) - local pageSize = rows * columns - - if arrayPosition > #contents then return end - - local origArrayPos = arrayPosition - - local yCopy = 0 - for i = 1, pageSize + 1 do - if arrayPosition >= #contents + 1 then - break - end - - local buttonCon - insertButtons[arrayPosition], buttonCon = buildInsertButton() - table.insert(insertButtonCons,buttonCon) - insertButtons[arrayPosition].Parent = setGui.SetPanel.ItemsFrame - arrayPosition = arrayPosition + 1 - end - realignButtonGrid(columns) - - local indexCopy = origArrayPos - for index = origArrayPos, arrayPosition do - if insertButtons[index] then - if contents[index] then - - -- we don't want water to have a drop down button - if contents[index].Name == "Water" then - if Data.Category[Data.CurrentCategory].SetName == "High Scalability" then - insertButtons[index]:FindFirstChild("DropDownButton",true):Destroy() - end - end - - local assetId - if useAssetVersionId then - assetId = contents[index].AssetVersionId - else - assetId = contents[index].AssetId - end - setInsertButtonImageBehavior(insertButtons[index], true, contents[index].Name, assetId) - else - break - end - else - break - end - indexCopy = index - end - end - - local function setSetIndex() - Data.Category[Data.CurrentCategory].Index = 0 - - rows = 7 - columns = math.floor(setGui.SetPanel.ItemsFrame.AbsoluteSize.X/buttonWidth) - - contents = Data.Category[Data.CurrentCategory].Contents - if contents then - -- remove our buttons and their connections - for i = 1, #insertButtons do - insertButtons[i]:remove() - end - for i = 1, #insertButtonCons do - if insertButtonCons[i] then insertButtonCons[i]:disconnect() end - end - insertButtonCons = {} - insertButtons = {} - - arrayPosition = 1 - loadSectionOfItems(setGui, rows, columns) - end - end - - local function selectSet(button, setName, setId, setIndex) - if button and Data.Category[Data.CurrentCategory] ~= nil then - if button ~= Data.Category[Data.CurrentCategory].Button then - Data.Category[Data.CurrentCategory].Button = button - - if SetCache[setId] == nil then - SetCache[setId] = game:GetService("InsertService"):GetCollection(setId) - end - Data.Category[Data.CurrentCategory].Contents = SetCache[setId] - - Data.Category[Data.CurrentCategory].SetName = setName - Data.Category[Data.CurrentCategory].SetId = setId - end - setSetIndex() - end - end - - local function selectCategoryPage(buttons, page) - if buttons ~= Data.CurrentCategory then - if Data.CurrentCategory then - for key, button in pairs(Data.CurrentCategory) do - button.Visible = false - end - end - - Data.CurrentCategory = buttons - if Data.Category[Data.CurrentCategory] == nil then - Data.Category[Data.CurrentCategory] = {} - if #buttons > 0 then - selectSet(buttons[1], buttons[1].SetName.Value, buttons[1].SetId.Value, 0) - end - else - Data.Category[Data.CurrentCategory].Button = nil - selectSet(Data.Category[Data.CurrentCategory].ButtonFrame, Data.Category[Data.CurrentCategory].SetName, Data.Category[Data.CurrentCategory].SetId, Data.Category[Data.CurrentCategory].Index) - end - end - end - - local function selectCategory(category) - selectCategoryPage(category, 0) - end - - local function resetAllSetButtonSelection() - local setButtons = setGui.SetPanel.Sets.SetsLists:GetChildren() - for i = 1, #setButtons do - if setButtons[i]:IsA("TextButton") then - setButtons[i].Selected = false - setButtons[i].BackgroundTransparency = 1 - setButtons[i].TextColor3 = Color3.new(1,1,1) - setButtons[i].BackgroundColor3 = Color3.new(1,1,1) - end - end - end - - local function populateSetsFrame() - local currRow = 0 - for i = 1, #userCategoryButtons do - local button = userCategoryButtons[i] - button.Visible = true - button.Position = UDim2.new(0,5,0,currRow * button.Size.Y.Offset) - button.Parent = setGui.SetPanel.Sets.SetsLists - - if i == 1 then -- we will have this selected by default, so show it - button.Selected = true - button.BackgroundColor3 = Color3.new(0,204/255,0) - button.TextColor3 = Color3.new(0,0,0) - button.BackgroundTransparency = 0 - end - - button.MouseEnter:connect(function() - if not button.Selected then - button.BackgroundTransparency = 0 - button.TextColor3 = Color3.new(0,0,0) - end - end) - button.MouseLeave:connect(function() - if not button.Selected then - button.BackgroundTransparency = 1 - button.TextColor3 = Color3.new(1,1,1) - end - end) - button.MouseButton1Click:connect(function() - resetAllSetButtonSelection() - button.Selected = not button.Selected - button.BackgroundColor3 = Color3.new(0,204/255,0) - button.TextColor3 = Color3.new(0,0,0) - button.BackgroundTransparency = 0 - selectSet(button, button.Text, userCategoryButtons[i].SetId.Value, 0) - end) - - currRow = currRow + 1 - end - - local buttons = setGui.SetPanel.Sets.SetsLists:GetChildren() - - -- set first category as loaded for default - if buttons then - for i = 1, #buttons do - if buttons[i]:IsA("TextButton") then - selectSet(buttons[i], buttons[i].Text, userCategoryButtons[i].SetId.Value, 0) - selectCategory(userCategoryButtons) - break - end - end - end - end - - setGui = createSetGui() - waterGui, waterTypeChangedEvent = createWaterGui() - waterGui.Position = UDim2.new(0,55,0,0) - waterGui.Parent = setGui - setGui.Changed:connect(function(prop) -- this resizes the preview image to always be the right size - if prop == "AbsoluteSize" then - handleResize() - setSetIndex() - end - end) - - local scrollFrame, controlFrame = t.CreateTrueScrollingFrame() - scrollFrame.Size = UDim2.new(0.54,0,0.85,0) - scrollFrame.Position = UDim2.new(0.24,0,0.085,0) - scrollFrame.Name = "ItemsFrame" - scrollFrame.ZIndex = 6 - scrollFrame.Parent = setGui.SetPanel - scrollFrame.BackgroundTransparency = 1 - - drillDownSetZIndex(controlFrame,7) - - controlFrame.Parent = setGui.SetPanel - controlFrame.Position = UDim2.new(0.76, 5, 0, 0) - - local debounce = false - controlFrame.ScrollBottom.Changed:connect(function(prop) - if controlFrame.ScrollBottom.Value == true then - if debounce then return end - debounce = true - loadSectionOfItems(setGui, rows, columns) - debounce = false - end - end) - - local userData = {} - for id = 1, #userIdsForSets do - local newUserData = game:GetService("InsertService"):GetUserSets(userIdsForSets[id]) - if newUserData and #newUserData > 2 then - -- start at #3 to skip over My Decals and My Models for each account - for category = 3, #newUserData do - if newUserData[category].Name == "High Scalability" then -- we want high scalability parts to show first - table.insert(userData,1,newUserData[category]) - else - table.insert(userData, newUserData[category]) - end - end - end - - end - if userData then - userCategoryButtons = processCategory(userData) - end - - rows = math.floor(setGui.SetPanel.ItemsFrame.AbsoluteSize.Y/buttonHeight) - columns = math.floor(setGui.SetPanel.ItemsFrame.AbsoluteSize.X/buttonWidth) - - populateSetsFrame() - - insertPanelCloseCon = setGui.SetPanel.CancelButton.MouseButton1Click:connect(function() - setGui.SetPanel.Visible = false - if dialogClosed then dialogClosed() end - end) - - local setVisibilityFunction = function(visible) - if visible then - setGui.SetPanel.Visible = true - else - setGui.SetPanel.Visible = false - end - end - - local getVisibilityFunction = function() - if setGui then - if setGui:FindFirstChild("SetPanel") then - return setGui.SetPanel.Visible - end - end - - return false - end - - return setGui, setVisibilityFunction, getVisibilityFunction, waterTypeChangedEvent -end - -t.CreateTerrainMaterialSelector = function(size,position) - local terrainMaterialSelectionChanged = Instance.new("BindableEvent") - terrainMaterialSelectionChanged.Name = "TerrainMaterialSelectionChanged" - - local selectedButton = nil - - local frame = Instance.new("Frame") - frame.Name = "TerrainMaterialSelector" - if size then - frame.Size = size - else - frame.Size = UDim2.new(0, 245, 0, 230) - end - if position then - frame.Position = position - end - frame.BorderSizePixel = 0 - frame.BackgroundColor3 = Color3.new(0,0,0) - frame.Active = true - - terrainMaterialSelectionChanged.Parent = frame - - local waterEnabled = true -- todo: turn this on when water is ready - - local materialToImageMap = {} - local materialNames = {"Grass", "Sand", "Brick", "Granite", "Asphalt", "Iron", "Aluminum", "Gold", "Plank", "Log", "Gravel", "Cinder Block", "Stone Wall", "Concrete", "Plastic (red)", "Plastic (blue)"} - if waterEnabled then - table.insert(materialNames,"Water") - end - local currentMaterial = 1 - - function getEnumFromName(choice) - if choice == "Grass" then return 1 end - if choice == "Sand" then return 2 end - if choice == "Erase" then return 0 end - if choice == "Brick" then return 3 end - if choice == "Granite" then return 4 end - if choice == "Asphalt" then return 5 end - if choice == "Iron" then return 6 end - if choice == "Aluminum" then return 7 end - if choice == "Gold" then return 8 end - if choice == "Plank" then return 9 end - if choice == "Log" then return 10 end - if choice == "Gravel" then return 11 end - if choice == "Cinder Block" then return 12 end - if choice == "Stone Wall" then return 13 end - if choice == "Concrete" then return 14 end - if choice == "Plastic (red)" then return 15 end - if choice == "Plastic (blue)" then return 16 end - if choice == "Water" then return 17 end - end - - function getNameFromEnum(choice) - if choice == Enum.CellMaterial.Grass or choice == 1 then return "Grass"end - if choice == Enum.CellMaterial.Sand or choice == 2 then return "Sand" end - if choice == Enum.CellMaterial.Empty or choice == 0 then return "Erase" end - if choice == Enum.CellMaterial.Brick or choice == 3 then return "Brick" end - if choice == Enum.CellMaterial.Granite or choice == 4 then return "Granite" end - if choice == Enum.CellMaterial.Asphalt or choice == 5 then return "Asphalt" end - if choice == Enum.CellMaterial.Iron or choice == 6 then return "Iron" end - if choice == Enum.CellMaterial.Aluminum or choice == 7 then return "Aluminum" end - if choice == Enum.CellMaterial.Gold or choice == 8 then return "Gold" end - if choice == Enum.CellMaterial.WoodPlank or choice == 9 then return "Plank" end - if choice == Enum.CellMaterial.WoodLog or choice == 10 then return "Log" end - if choice == Enum.CellMaterial.Gravel or choice == 11 then return "Gravel" end - if choice == Enum.CellMaterial.CinderBlock or choice == 12 then return "Cinder Block" end - if choice == Enum.CellMaterial.MossyStone or choice == 13 then return "Stone Wall" end - if choice == Enum.CellMaterial.Cement or choice == 14 then return "Concrete" end - if choice == Enum.CellMaterial.RedPlastic or choice == 15 then return "Plastic (red)" end - if choice == Enum.CellMaterial.BluePlastic or choice == 16 then return "Plastic (blue)" end - - if waterEnabled then - if choice == Enum.CellMaterial.Water or choice == 17 then return "Water" end - end - end - - - local function updateMaterialChoice(choice) - currentMaterial = getEnumFromName(choice) - terrainMaterialSelectionChanged:Fire(currentMaterial) - end - - -- we so need a better way to do this - for i,v in pairs(materialNames) do - materialToImageMap[v] = {} - if v == "Grass" then materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=56563112" - elseif v == "Sand" then materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=62356652" - elseif v == "Brick" then materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=65961537" - elseif v == "Granite" then materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532153" - elseif v == "Asphalt" then materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532038" - elseif v == "Iron" then materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532093" - elseif v == "Aluminum" then materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67531995" - elseif v == "Gold" then materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532118" - elseif v == "Plastic (red)" then materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67531848" - elseif v == "Plastic (blue)" then materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67531924" - elseif v == "Plank" then materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532015" - elseif v == "Log" then materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532051" - elseif v == "Gravel" then materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532206" - elseif v == "Cinder Block" then materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532103" - elseif v == "Stone Wall" then materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67531804" - elseif v == "Concrete" then materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532059" - elseif v == "Water" then materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=81407474" - else materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=66887593" -- fill in the rest here!! - end - end - - local scrollFrame, scrollUp, scrollDown, recalculateScroll = t.CreateScrollingFrame(nil,"grid") - scrollFrame.Size = UDim2.new(0.85,0,1,0) - scrollFrame.Position = UDim2.new(0,0,0,0) - scrollFrame.Parent = frame - - scrollUp.Parent = frame - scrollUp.Visible = true - scrollUp.Position = UDim2.new(1,-19,0,0) - - scrollDown.Parent = frame - scrollDown.Visible = true - scrollDown.Position = UDim2.new(1,-19,1,-17) - - local function goToNewMaterial(buttonWrap, materialName) - updateMaterialChoice(materialName) - buttonWrap.BackgroundTransparency = 0 - selectedButton.BackgroundTransparency = 1 - selectedButton = buttonWrap - end - - local function createMaterialButton(name) - local buttonWrap = Instance.new("TextButton") - buttonWrap.Text = "" - buttonWrap.Size = UDim2.new(0,32,0,32) - buttonWrap.BackgroundColor3 = Color3.new(1,1,1) - buttonWrap.BorderSizePixel = 0 - buttonWrap.BackgroundTransparency = 1 - buttonWrap.AutoButtonColor = false - buttonWrap.Name = tostring(name) - - local imageButton = Instance.new("ImageButton") - imageButton.AutoButtonColor = false - imageButton.BackgroundTransparency = 1 - imageButton.Size = UDim2.new(0,30,0,30) - imageButton.Position = UDim2.new(0,1,0,1) - imageButton.Name = tostring(name) - imageButton.Parent = buttonWrap - imageButton.Image = materialToImageMap[name].Regular - - local enumType = Instance.new("NumberValue") - enumType.Name = "EnumType" - enumType.Parent = buttonWrap - enumType.Value = 0 - - imageButton.MouseEnter:connect(function() - buttonWrap.BackgroundTransparency = 0 - end) - imageButton.MouseLeave:connect(function() - if selectedButton ~= buttonWrap then - buttonWrap.BackgroundTransparency = 1 - end - end) - imageButton.MouseButton1Click:connect(function() - if selectedButton ~= buttonWrap then - goToNewMaterial(buttonWrap, tostring(name)) - end - end) - - return buttonWrap - end - - for i = 1, #materialNames do - local imageButton = createMaterialButton(materialNames[i]) - - if materialNames[i] == "Grass" then -- always start with grass as the default - selectedButton = imageButton - imageButton.BackgroundTransparency = 0 - end - - imageButton.Parent = scrollFrame - end - - local forceTerrainMaterialSelection = function(newMaterialType) - if not newMaterialType then return end - if currentMaterial == newMaterialType then return end - - local matName = getNameFromEnum(newMaterialType) - local buttons = scrollFrame:GetChildren() - for i = 1, #buttons do - if buttons[i].Name == "Plastic (blue)" and matName == "Plastic (blue)" then goToNewMaterial(buttons[i],matName) return end - if buttons[i].Name == "Plastic (red)" and matName == "Plastic (red)" then goToNewMaterial(buttons[i],matName) return end - if string.find(buttons[i].Name, matName) then - goToNewMaterial(buttons[i],matName) - return - end - end - end - - frame.Changed:connect(function ( prop ) - if prop == "AbsoluteSize" then - recalculateScroll() - end - end) - - recalculateScroll() - return frame, terrainMaterialSelectionChanged, forceTerrainMaterialSelection -end - -t.CreateLoadingFrame = function(name,size,position) - game:GetService("ContentProvider"):Preload("http://www.roblox.com/asset/?id=35238053") - - local loadingFrame = Instance.new("Frame") - loadingFrame.Name = "LoadingFrame" - loadingFrame.Style = Enum.FrameStyle.RobloxRound - - if size then loadingFrame.Size = size - else loadingFrame.Size = UDim2.new(0,300,0,160) end - if position then loadingFrame.Position = position - else loadingFrame.Position = UDim2.new(0.5, -150, 0.5,-80) end - - local loadingBar = Instance.new("Frame") - loadingBar.Name = "LoadingBar" - loadingBar.BackgroundColor3 = Color3.new(0,0,0) - loadingBar.BorderColor3 = Color3.new(79/255,79/255,79/255) - loadingBar.Position = UDim2.new(0,0,0,41) - loadingBar.Size = UDim2.new(1,0,0,30) - loadingBar.Parent = loadingFrame - - local loadingGreenBar = Instance.new("ImageLabel") - loadingGreenBar.Name = "LoadingGreenBar" - loadingGreenBar.Image = "http://www.roblox.com/asset/?id=35238053" - loadingGreenBar.Position = UDim2.new(0,0,0,0) - loadingGreenBar.Size = UDim2.new(0,0,1,0) - loadingGreenBar.Visible = false - loadingGreenBar.Parent = loadingBar - - local loadingPercent = Instance.new("TextLabel") - loadingPercent.Name = "LoadingPercent" - loadingPercent.BackgroundTransparency = 1 - loadingPercent.Position = UDim2.new(0,0,1,0) - loadingPercent.Size = UDim2.new(1,0,0,14) - loadingPercent.Font = Enum.Font.Arial - loadingPercent.Text = "0%" - loadingPercent.FontSize = Enum.FontSize.Size14 - loadingPercent.TextColor3 = Color3.new(1,1,1) - loadingPercent.Parent = loadingBar - - local cancelButton = Instance.new("TextButton") - cancelButton.Name = "CancelButton" - cancelButton.Position = UDim2.new(0.5,-60,1,-40) - cancelButton.Size = UDim2.new(0,120,0,40) - cancelButton.Font = Enum.Font.Arial - cancelButton.FontSize = Enum.FontSize.Size18 - cancelButton.TextColor3 = Color3.new(1,1,1) - cancelButton.Text = "Cancel" - cancelButton.Style = Enum.ButtonStyle.RobloxButton - cancelButton.Parent = loadingFrame - - local loadingName = Instance.new("TextLabel") - loadingName.Name = "loadingName" - loadingName.BackgroundTransparency = 1 - loadingName.Size = UDim2.new(1,0,0,18) - loadingName.Position = UDim2.new(0,0,0,2) - loadingName.Font = Enum.Font.Arial - loadingName.Text = name - loadingName.TextColor3 = Color3.new(1,1,1) - loadingName.TextStrokeTransparency = 1 - loadingName.FontSize = Enum.FontSize.Size18 - loadingName.Parent = loadingFrame - - local cancelButtonClicked = Instance.new("BindableEvent") - cancelButtonClicked.Name = "CancelButtonClicked" - cancelButtonClicked.Parent = cancelButton - cancelButton.MouseButton1Click:connect(function() - cancelButtonClicked:Fire() - end) - - local updateLoadingGuiPercent = function(percent, tweenAction, tweenLength) - if percent and type(percent) ~= "number" then - error("updateLoadingGuiPercent expects number as argument, got",type(percent),"instead") - end - - local newSize = nil - if percent < 0 then - newSize = UDim2.new(0,0,1,0) - elseif percent > 1 then - newSize = UDim2.new(1,0,1,0) - else - newSize = UDim2.new(percent,0,1,0) - end - - if tweenAction then - if not tweenLength then - error("updateLoadingGuiPercent is set to tween new percentage, but got no tween time length! Please pass this in as third argument") - end - - if (newSize.X.Scale > 0) then - loadingGreenBar.Visible = true - loadingGreenBar:TweenSize( newSize, - Enum.EasingDirection.Out, - Enum.EasingStyle.Quad, - tweenLength, - true) - else - loadingGreenBar:TweenSize( newSize, - Enum.EasingDirection.Out, - Enum.EasingStyle.Quad, - tweenLength, - true, - function() - if (newSize.X.Scale < 0) then - loadingGreenBar.Visible = false - end - end) - end - - else - loadingGreenBar.Size = newSize - loadingGreenBar.Visible = (newSize.X.Scale > 0) - end - end - - loadingGreenBar.Changed:connect(function(prop) - if prop == "Size" then - loadingPercent.Text = tostring( math.ceil(loadingGreenBar.Size.X.Scale * 100) ) .. "%" - end - end) - - return loadingFrame, updateLoadingGuiPercent, cancelButtonClicked -end - -t.CreatePluginFrame = function (name,size,position,scrollable,parent) - function createMenuButton(size,position,text,fontsize,name,parent) - local button = Instance.new("TextButton",parent) - button.AutoButtonColor = false - button.Name = name - button.BackgroundTransparency = 1 - button.Position = position - button.Size = size - button.Font = Enum.Font.ArialBold - button.FontSize = fontsize - button.Text = text - button.TextColor3 = Color3.new(1,1,1) - button.BorderSizePixel = 0 - button.BackgroundColor3 = Color3.new(20/255,20/255,20/255) - - button.MouseEnter:connect(function ( ) - if button.Selected then return end - button.BackgroundTransparency = 0 - end) - button.MouseLeave:connect(function ( ) - if button.Selected then return end - button.BackgroundTransparency = 1 - end) - - return button - - end - - local dragBar = Instance.new("Frame",parent) - dragBar.Name = tostring(name) .. "DragBar" - dragBar.BackgroundColor3 = Color3.new(39/255,39/255,39/255) - dragBar.BorderColor3 = Color3.new(0,0,0) - if size then - dragBar.Size = UDim2.new(size.X.Scale,size.X.Offset,0,20) + UDim2.new(0,20,0,0) - else - dragBar.Size = UDim2.new(0,183,0,20) - end - if position then - dragBar.Position = position - end - dragBar.Active = true - dragBar.Draggable = true - --dragBar.Visible = false - dragBar.MouseEnter:connect(function ( ) - dragBar.BackgroundColor3 = Color3.new(49/255,49/255,49/255) - end) - dragBar.MouseLeave:connect(function ( ) - dragBar.BackgroundColor3 = Color3.new(39/255,39/255,39/255) - end) - - -- plugin name label - local pluginNameLabel = Instance.new("TextLabel",dragBar) - pluginNameLabel.Name = "BarNameLabel" - pluginNameLabel.Text = " " .. tostring(name) - pluginNameLabel.TextColor3 = Color3.new(1,1,1) - pluginNameLabel.TextStrokeTransparency = 0 - pluginNameLabel.Size = UDim2.new(1,0,1,0) - pluginNameLabel.Font = Enum.Font.ArialBold - pluginNameLabel.FontSize = Enum.FontSize.Size18 - pluginNameLabel.TextXAlignment = Enum.TextXAlignment.Left - pluginNameLabel.BackgroundTransparency = 1 - - -- close button - local closeButton = createMenuButton(UDim2.new(0,15,0,17),UDim2.new(1,-16,0.5,-8),"X",Enum.FontSize.Size14,"CloseButton",dragBar) - local closeEvent = Instance.new("BindableEvent") - closeEvent.Name = "CloseEvent" - closeEvent.Parent = closeButton - closeButton.MouseButton1Click:connect(function () - closeEvent:Fire() - closeButton.BackgroundTransparency = 1 - end) - - -- help button - local helpButton = createMenuButton(UDim2.new(0,15,0,17),UDim2.new(1,-51,0.5,-8),"?",Enum.FontSize.Size14,"HelpButton",dragBar) - local helpFrame = Instance.new("Frame",dragBar) - helpFrame.Name = "HelpFrame" - helpFrame.BackgroundColor3 = Color3.new(0,0,0) - helpFrame.Size = UDim2.new(0,300,0,552) - helpFrame.Position = UDim2.new(1,5,0,0) - helpFrame.Active = true - helpFrame.BorderSizePixel = 0 - helpFrame.Visible = false - - helpButton.MouseButton1Click:connect(function( ) - helpFrame.Visible = not helpFrame.Visible - if helpFrame.Visible then - helpButton.Selected = true - helpButton.BackgroundTransparency = 0 - local screenGui = getScreenGuiAncestor(helpFrame) - if screenGui then - if helpFrame.AbsolutePosition.X + helpFrame.AbsoluteSize.X > screenGui.AbsoluteSize.X then --position on left hand side - helpFrame.Position = UDim2.new(0,-5 - helpFrame.AbsoluteSize.X,0,0) - else -- position on right hand side - helpFrame.Position = UDim2.new(1,5,0,0) - end - else - helpFrame.Position = UDim2.new(1,5,0,0) - end - else - helpButton.Selected = false - helpButton.BackgroundTransparency = 1 - end - end) - - local minimizeButton = createMenuButton(UDim2.new(0,16,0,17),UDim2.new(1,-34,0.5,-8),"-",Enum.FontSize.Size14,"MinimizeButton",dragBar) - minimizeButton.TextYAlignment = Enum.TextYAlignment.Top - - local minimizeFrame = Instance.new("Frame",dragBar) - minimizeFrame.Name = "MinimizeFrame" - minimizeFrame.BackgroundColor3 = Color3.new(73/255,73/255,73/255) - minimizeFrame.BorderColor3 = Color3.new(0,0,0) - minimizeFrame.Position = UDim2.new(0,0,1,0) - if size then - minimizeFrame.Size = UDim2.new(size.X.Scale,size.X.Offset,0,50) + UDim2.new(0,20,0,0) - else - minimizeFrame.Size = UDim2.new(0,183,0,50) - end - minimizeFrame.Visible = false - - local minimizeBigButton = Instance.new("TextButton",minimizeFrame) - minimizeBigButton.Position = UDim2.new(0.5,-50,0.5,-20) - minimizeBigButton.Name = "MinimizeButton" - minimizeBigButton.Size = UDim2.new(0,100,0,40) - minimizeBigButton.Style = Enum.ButtonStyle.RobloxButton - minimizeBigButton.Font = Enum.Font.ArialBold - minimizeBigButton.FontSize = Enum.FontSize.Size18 - minimizeBigButton.TextColor3 = Color3.new(1,1,1) - minimizeBigButton.Text = "Show" - - local separatingLine = Instance.new("Frame",dragBar) - separatingLine.Name = "SeparatingLine" - separatingLine.BackgroundColor3 = Color3.new(115/255,115/255,115/255) - separatingLine.BorderSizePixel = 0 - separatingLine.Position = UDim2.new(1,-18,0.5,-7) - separatingLine.Size = UDim2.new(0,1,0,14) - - local otherSeparatingLine = separatingLine:clone() - otherSeparatingLine.Position = UDim2.new(1,-35,0.5,-7) - otherSeparatingLine.Parent = dragBar - - local widgetContainer = Instance.new("Frame",dragBar) - widgetContainer.Name = "WidgetContainer" - widgetContainer.BackgroundTransparency = 1 - widgetContainer.Position = UDim2.new(0,0,1,0) - widgetContainer.BorderColor3 = Color3.new(0,0,0) - if not scrollable then - widgetContainer.BackgroundTransparency = 0 - widgetContainer.BackgroundColor3 = Color3.new(72/255,72/255,72/255) - end - - if size then - if scrollable then - widgetContainer.Size = size - else - widgetContainer.Size = UDim2.new(0,dragBar.AbsoluteSize.X,size.Y.Scale,size.Y.Offset) - end - else - if scrollable then - widgetContainer.Size = UDim2.new(0,163,0,400) - else - widgetContainer.Size = UDim2.new(0,dragBar.AbsoluteSize.X,0,400) - end - end - if position then - widgetContainer.Position = position + UDim2.new(0,0,0,20) - end - - local frame,control,verticalDragger = nil - if scrollable then - --frame for widgets - frame,control = t.CreateTrueScrollingFrame() - frame.Size = UDim2.new(1, 0, 1, 0) - frame.BackgroundColor3 = Color3.new(72/255,72/255,72/255) - frame.BorderColor3 = Color3.new(0,0,0) - frame.Active = true - frame.Parent = widgetContainer - control.Parent = dragBar - control.BackgroundColor3 = Color3.new(72/255,72/255,72/255) - control.BorderSizePixel = 0 - control.BackgroundTransparency = 0 - control.Position = UDim2.new(1,-21,1,1) - if size then - control.Size = UDim2.new(0,21,size.Y.Scale,size.Y.Offset) - else - control.Size = UDim2.new(0,21,0,400) - end - control:FindFirstChild("ScrollDownButton").Position = UDim2.new(0,0,1,-20) - - local fakeLine = Instance.new("Frame",control) - fakeLine.Name = "FakeLine" - fakeLine.BorderSizePixel = 0 - fakeLine.BackgroundColor3 = Color3.new(0,0,0) - fakeLine.Size = UDim2.new(0,1,1,1) - fakeLine.Position = UDim2.new(1,0,0,0) - - verticalDragger = Instance.new("TextButton",widgetContainer) - verticalDragger.ZIndex = 2 - verticalDragger.AutoButtonColor = false - verticalDragger.Name = "VerticalDragger" - verticalDragger.BackgroundColor3 = Color3.new(50/255,50/255,50/255) - verticalDragger.BorderColor3 = Color3.new(0,0,0) - verticalDragger.Size = UDim2.new(1,20,0,20) - verticalDragger.Position = UDim2.new(0,0,1,0) - verticalDragger.Active = true - verticalDragger.Text = "" - - local scrubFrame = Instance.new("Frame",verticalDragger) - scrubFrame.Name = "ScrubFrame" - scrubFrame.BackgroundColor3 = Color3.new(1,1,1) - scrubFrame.BorderSizePixel = 0 - scrubFrame.Position = UDim2.new(0.5,-5,0.5,0) - scrubFrame.Size = UDim2.new(0,10,0,1) - scrubFrame.ZIndex = 5 - local scrubTwo = scrubFrame:clone() - scrubTwo.Position = UDim2.new(0.5,-5,0.5,-2) - scrubTwo.Parent = verticalDragger - local scrubThree = scrubFrame:clone() - scrubThree.Position = UDim2.new(0.5,-5,0.5,2) - scrubThree.Parent = verticalDragger - - local areaSoak = Instance.new("TextButton",getScreenGuiAncestor(parent)) - areaSoak.Name = "AreaSoak" - areaSoak.Size = UDim2.new(1,0,1,0) - areaSoak.BackgroundTransparency = 1 - areaSoak.BorderSizePixel = 0 - areaSoak.Text = "" - areaSoak.ZIndex = 10 - areaSoak.Visible = false - areaSoak.Active = true - - local draggingVertical = false - local startYPos = nil - verticalDragger.MouseEnter:connect(function () - verticalDragger.BackgroundColor3 = Color3.new(60/255,60/255,60/255) - end) - verticalDragger.MouseLeave:connect(function () - verticalDragger.BackgroundColor3 = Color3.new(50/255,50/255,50/255) - end) - verticalDragger.MouseButton1Down:connect(function(x,y) - draggingVertical = true - areaSoak.Visible = true - startYPos = y - end) - areaSoak.MouseButton1Up:connect(function ( ) - draggingVertical = false - areaSoak.Visible = false - end) - areaSoak.MouseMoved:connect(function(x,y) - if not draggingVertical then return end - - local yDelta = y - startYPos - if not control.ScrollDownButton.Visible and yDelta > 0 then - return - end - - if (widgetContainer.Size.Y.Offset + yDelta) < 150 then - widgetContainer.Size = UDim2.new(widgetContainer.Size.X.Scale, widgetContainer.Size.X.Offset,widgetContainer.Size.Y.Scale,150) - control.Size = UDim2.new (0,21,0,150) - return - end - - startYPos = y - - if widgetContainer.Size.Y.Offset + yDelta >= 0 then - widgetContainer.Size = UDim2.new(widgetContainer.Size.X.Scale, widgetContainer.Size.X.Offset,widgetContainer.Size.Y.Scale,widgetContainer.Size.Y.Offset + yDelta) - control.Size = UDim2.new(0,21,0,control.Size.Y.Offset + yDelta ) - end - end) - end - - local function switchMinimize() - minimizeFrame.Visible = not minimizeFrame.Visible - if scrollable then - frame.Visible = not frame.Visible - verticalDragger.Visible = not verticalDragger.Visible - control.Visible = not control.Visible - else - widgetContainer.Visible = not widgetContainer.Visible - end - - if minimizeFrame.Visible then - minimizeButton.Text = "+" - else - minimizeButton.Text = "-" - end - end - - minimizeBigButton.MouseButton1Click:connect(function ( ) - switchMinimize() - end) - - minimizeButton.MouseButton1Click:connect(function( ) - switchMinimize() - end) - - if scrollable then - return dragBar, frame, helpFrame, closeEvent - else - return dragBar, widgetContainer, helpFrame, closeEvent - end -end - -t.Help = - function(funcNameOrFunc) - --input argument can be a string or a function. Should return a description (of arguments and expected side effects) - if funcNameOrFunc == "CreatePropertyDropDownMenu" or funcNameOrFunc == t.CreatePropertyDropDownMenu then - return "Function CreatePropertyDropDownMenu. " .. - "Arguments: (instance, propertyName, enumType). " .. - "Side effect: returns a container with a drop-down-box that is linked to the 'property' field of 'instance' which is of type 'enumType'" - end - if funcNameOrFunc == "CreateDropDownMenu" or funcNameOrFunc == t.CreateDropDownMenu then - return "Function CreateDropDownMenu. " .. - "Arguments: (items, onItemSelected). " .. - "Side effect: Returns 2 results, a container to the gui object and a 'updateSelection' function for external updating. The container is a drop-down-box created around a list of items" - end - if funcNameOrFunc == "CreateMessageDialog" or funcNameOrFunc == t.CreateMessageDialog then - return "Function CreateMessageDialog. " .. - "Arguments: (title, message, buttons). " .. - "Side effect: Returns a gui object of a message box with 'title' and 'message' as passed in. 'buttons' input is an array of Tables contains a 'Text' and 'Function' field for the text/callback of each button" - end - if funcNameOrFunc == "CreateStyledMessageDialog" or funcNameOrFunc == t.CreateStyledMessageDialog then - return "Function CreateStyledMessageDialog. " .. - "Arguments: (title, message, style, buttons). " .. - "Side effect: Returns a gui object of a message box with 'title' and 'message' as passed in. 'buttons' input is an array of Tables contains a 'Text' and 'Function' field for the text/callback of each button, 'style' is a string, either Error, Notify or Confirm" - end - if funcNameOrFunc == "GetFontHeight" or funcNameOrFunc == t.GetFontHeight then - return "Function GetFontHeight. " .. - "Arguments: (font, fontSize). " .. - "Side effect: returns the size in pixels of the given font + fontSize" - end - if funcNameOrFunc == "LayoutGuiObjects" or funcNameOrFunc == t.LayoutGuiObjects then - - end - if funcNameOrFunc == "CreateScrollingFrame" or funcNameOrFunc == t.CreateScrollingFrame then - return "Function CreateScrollingFrame. " .. - "Arguments: (orderList, style) " .. - "Side effect: returns 4 objects, (scrollFrame, scrollUpButton, scrollDownButton, recalculateFunction). 'scrollFrame' can be filled with GuiObjects. It will lay them out and allow scrollUpButton/scrollDownButton to interact with them. Orderlist is optional (and specifies the order to layout the children. Without orderlist, it uses the children order. style is also optional, and allows for a 'grid' styling if style is passed 'grid' as a string. recalculateFunction can be called when a relayout is needed (when orderList changes)" - end - if funcNameOrFunc == "CreateTrueScrollingFrame" or funcNameOrFunc == t.CreateTrueScrollingFrame then - return "Function CreateTrueScrollingFrame. " .. - "Arguments: (nil) " .. - "Side effect: returns 2 objects, (scrollFrame, controlFrame). 'scrollFrame' can be filled with GuiObjects, and they will be clipped if not inside the frame's bounds. controlFrame has children scrollup and scrolldown, as well as a slider. controlFrame can be parented to any guiobject and it will readjust itself to fit." - end - if funcNameOrFunc == "AutoTruncateTextObject" or funcNameOrFunc == t.AutoTruncateTextObject then - return "Function AutoTruncateTextObject. " .. - "Arguments: (textLabel) " .. - "Side effect: returns 2 objects, (textLabel, changeText). The 'textLabel' input is modified to automatically truncate text (with ellipsis), if it gets too small to fit. 'changeText' is a function that can be used to change the text, it takes 1 string as an argument" - end - if funcNameOrFunc == "CreateSlider" or funcNameOrFunc == t.CreateSlider then - return "Function CreateSlider. " .. - "Arguments: (steps, width, position) " .. - "Side effect: returns 2 objects, (sliderGui, sliderPosition). The 'steps' argument specifies how many different positions the slider can hold along the bar. 'width' specifies in pixels how wide the bar should be (modifiable afterwards if desired). 'position' argument should be a UDim2 for slider positioning. 'sliderPosition' is an IntValue whose current .Value specifies the specific step the slider is currently on." - end - if funcNameOrFunc == "CreateSliderNew" or funcNameOrFunc == t.CreateSliderNew then - return "Function CreateSliderNew. " .. - "Arguments: (steps, width, position) " .. - "Side effect: returns 2 objects, (sliderGui, sliderPosition). The 'steps' argument specifies how many different positions the slider can hold along the bar. 'width' specifies in pixels how wide the bar should be (modifiable afterwards if desired). 'position' argument should be a UDim2 for slider positioning. 'sliderPosition' is an IntValue whose current .Value specifies the specific step the slider is currently on." - end - if funcNameOrFunc == "CreateLoadingFrame" or funcNameOrFunc == t.CreateLoadingFrame then - return "Function CreateLoadingFrame. " .. - "Arguments: (name, size, position) " .. - "Side effect: Creates a gui that can be manipulated to show progress for a particular action. Name appears above the loading bar, and size and position are udim2 values (both size and position are optional arguments). Returns 3 arguments, the first being the gui created. The second being updateLoadingGuiPercent, which is a bindable function. This function takes one argument (two optionally), which should be a number between 0 and 1, representing the percentage the loading gui should be at. The second argument to this function is a boolean value that if set to true will tween the current percentage value to the new percentage value, therefore our third argument is how long this tween should take. Our third returned argument is a BindableEvent, that when fired means that someone clicked the cancel button on the dialog." - end - if funcNameOrFunc == "CreateTerrainMaterialSelector" or funcNameOrFunc == t.CreateTerrainMaterialSelector then - return "Function CreateTerrainMaterialSelector. " .. - "Arguments: (size, position) " .. - "Side effect: Size and position are UDim2 values that specifies the selector's size and position. Both size and position are optional arguments. This method returns 3 objects (terrainSelectorGui, terrainSelected, forceTerrainSelection). terrainSelectorGui is just the gui object that we generate with this function, parent it as you like. TerrainSelected is a BindableEvent that is fired whenever a new terrain type is selected in the gui. ForceTerrainSelection is a function that takes an argument of Enum.CellMaterial and will force the gui to show that material as currently selected." - end - end - - - -local RbxGui - -local localTesting = true - -local screen = script.Parent -local screenResizeCon = nil - -local friendWord = "Friend" -local friendWordLowercase = "friend" - -local elementNames = {} -local elementNameToElement = {} - -local privilegeOwner = 255 -local privilegeAdmin = 240 -local privilegeMember = 128 -local privilegeVisitor = 10 -local privilegeBanned = 0 - -local inContextMenu = false -local contextMenu3d = false - -local bigEasingStyle = Enum.EasingStyle.Back -local smallEasingStyle = Enum.EasingStyle.Quart - -local personalServerContextAdded = false -local personalServerPlace = false -local success = pcall(function() personalServerPlace = game.IsPersonalServer end) -if not success then - personalServerPlace = false -end - -local friendRequestBlacklist = {} -local otherPlayerBlacklist = {} - -local currentSortName = "" - -local function waitForChild(instance, name) - while not instance:FindFirstChild(name) do - instance.ChildAdded:wait() - end -end - -local function waitForProperty(instance, prop) - while not instance[prop] do - instance.Changed:wait() - end -end - -local function Color3I(r,g,b) - return Color3.new(r/255,g/255,b/255) -end - -function robloxLock(instance) -end - -function ArrayRemove(t, obj) - for i, obj2 in ipairs(t) do - if obj == obj2 then - table.remove(t, i) - return true - end - end - return false -end - -local function getPlayers() - local result = {} - local players = game:GetService("Players"):GetChildren() - if players then - for i, player in ipairs(players) do - if player:IsA("Player") then - table.insert(result, player) - end - end - end - return result -end - -local brickColorTable = {} -for i = 0, 63 do - brickColorTable[BrickColor.palette(i).Name] = BrickColor.palette(i).Color -end - -local function remapColor(i, j) - brickColorTable[BrickColor.palette(i).Name] = BrickColor.palette(j).Color -end - -remapColor(13, 12) -remapColor(14, 12) -remapColor(15, 12) -remapColor(61, 29) -remapColor(63, 62) -remapColor(56, 50) -remapColor(45, 53) -remapColor(51, 20) -remapColor(4, 20) -remapColor(59, 35) -remapColor(60, 29) - -local function getColor(brickColor) - if brickColorTable[brickColor.Name] then - return brickColorTable[brickColor.Name] - else - return brickColor.Color; - end -end - - - -local function getTeams() - local result = {} - local teams = game:GetService("Teams"):GetChildren() - for i, team in ipairs(teams) do - if team:IsA("Team") then - table.insert(result, team) - end - end - return result -end - -local supportFriends = false -local currentBoardType = "PlayerList" -local currentStatCount = 0 - -local createBoardsFunction = nil - - -local playerTable = {} -local teamTable = {} -local teamColorTable = {} - -local removePlayerFunction = nil -local recreatePlayerFunction = nil -local addPlayerFunction = function(player) - if recreatePlayerFunction then - recreatePlayerFunction(player) - end -end -local sortPlayerListsFunction = nil - -local minimizedState = nil -local bigWindowImposter = nil -local smallWindowPosition = UDim2.new(0, -20, 0,5) -local smallWindowSize = UDim2.new(1,0,1,0) -local bigWindowSize = UDim2.new(0.6,0,0.6,0) -local bigWindowPosition = UDim2.new(.2, 0, .2,0) - -local smallWindowHeaderYSize = 32 - -local debounceTeamsChanged = false - -local currentWindowState = "Small" -local previousWindowState = nil -local transitionWindowsFunction = nil - -local container = nil -local topRightTrayContainer = nil - -local playerContextMenu = nil -local contextMenuElements = {} -local updateContextMenuItems = nil - -local function addContextMenuLabel(getText1, getText2, isVisible) - local t = {} - t.Type = "Label" - t.GetText1 = getText1 - t.GetText2 = getText2 - t.IsVisible = isVisible - table.insert(contextMenuElements, t) -end -local function addContextMenuButton(text, isVisible, isActive, doIt) - local t = {} - t.Text = text - t.Type = "Button" - t.IsVisible = isVisible - t.IsActive = isActive - t.DoIt = doIt - table.insert(contextMenuElements, t) -end - -local function getFriendStatus(player) - if player == game.Players.LocalPlayer then - return Enum.FriendStatus.NotFriend - else - local success, result = pcall(function() return game.Players.LocalPlayer:GetFriendStatus(player) end) - if success then - return result - else - return Enum.FriendStatus.NotFriend - end - end -end - - -local function getPrivilegeType(player) - local rank = player.PersonalServerRank - if rank >= privilegeOwner then - return privilegeOwner - elseif rank < privilegeOwner and rank >= privilegeAdmin then - return privilegeAdmin - elseif rank < privilegeAdmin and rank >= privilegeMember then - return privilegeMember - elseif rank < privilegeMember and rank >= privilegeVisitor then - return privilegeVisitor - else - return privilegeBanned - end -end - ---Populate the ContextMenus -addContextMenuLabel( - --GetText1 - function(player) - return "Loading..." - end, - --GetText2 - nil, - --IsVisible - function(player) - return getFriendStatus(player) == Enum.FriendStatus.Unknown - end) - -addContextMenuButton("Send " .. friendWord .. " Request", - --IsVisible - function(player) - return (not otherPlayerBlacklist[player]) and (getFriendStatus(player) == Enum.FriendStatus.NotFriend) - end, - --IsActive - function(player) - return true - end, - --DoIt? - function(player) - otherPlayerBlacklist[player] = true - return game.Players.LocalPlayer:RequestFriendship(player) - end -) -addContextMenuButton("Un" .. friendWordLowercase, - --IsVisible - function(player) - return getFriendStatus(player) == Enum.FriendStatus.Friend - end, - --IsActive - function(player) - return true - end, - --DoIt - function(player) - return game.Players.LocalPlayer:RevokeFriendship(player) - end -) -addContextMenuButton("Accept " .. friendWord .. " Request", - --IsVisible - function(player) - return (not friendRequestBlacklist[player]) and (getFriendStatus(player) == Enum.FriendStatus.FriendRequestReceived) - end, - --IsActive - function(player) - return true - end, - --DoIt - function(player) - return game.Players.LocalPlayer:RequestFriendship(player) - end -) - -addContextMenuButton("Deny " .. friendWord .. " Request", - --IsVisible - function(player) - return getFriendStatus(player) == Enum.FriendStatus.FriendRequestReceived - end, - --IsActive - function(player) - return true - end, - --DoIt - function(player) - friendRequestBlacklist[player] = true - return game.Players.LocalPlayer:RevokeFriendship(player) - end -) - -addContextMenuButton("Cancel " .. friendWord .. " Request", - --IsVisible - function(player) - return false -- disable cancel request for now (can lead to griefing) - --return getFriendStatus(player) == Enum.FriendStatus.FriendRequestSent - end, - --IsActive - function(player) - return true - end, - --DoIt - function(player) - otherPlayerBlacklist[player] = false - return game.Players.LocalPlayer:RevokeFriendship(player) - end -) - -function addPersonalServerContext() - if personalServerContextAdded then return end - personalServerContextAdded = true - addContextMenuButton("Ban", - --IsVisible - function(player) - return ( getPrivilegeType(game.Players.LocalPlayer) >= privilegeAdmin and (getPrivilegeType(player) < privilegeAdmin) ) - end, - --IsActive - function(player) - return true - end, - --DoIt - function(player) - player.PersonalServerRank = privilegeBanned - return true - end - ) - addContextMenuButton("Promote to Visitor", - --IsVisible - function(player) - return ( getPrivilegeType(game.Players.LocalPlayer) >= privilegeAdmin ) and ( getPrivilegeType(player) == privilegeBanned ) - end, - --IsActive - function(player) - return true - end, - --DoIt - function(player) - game:GetService("PersonalServerService"):Promote(player) - return true - end - ) - addContextMenuButton("Promote to Member", - --IsVisible - function(player) - return ( getPrivilegeType(game.Players.LocalPlayer) >= privilegeAdmin ) and ( getPrivilegeType(player) == privilegeVisitor ) - end, - --IsActive - function(player) - return true - end, - --DoIt - function(player) - game:GetService("PersonalServerService"):Promote(player) - return true - end - ) - addContextMenuButton("Promote to Admin", - --IsVisible - function(player) - return ( getPrivilegeType(game.Players.LocalPlayer) == privilegeOwner ) and ( getPrivilegeType(player) == privilegeMember ) - end, - --IsActive - function(player) - return true - end, - --DoIt - function(player) - game:GetService("PersonalServerService"):Promote(player) - return true - end - ) - addContextMenuButton("Demote to Member", - --IsVisible - function(player) - return ( getPrivilegeType(game.Players.LocalPlayer) == privilegeOwner ) and ( getPrivilegeType(player) == privilegeAdmin ) - end, - --IsActive - function(player) - return true - end, - --DoIt - function(player) - game:GetService("PersonalServerService"):Demote(player) - return true - end - ) - addContextMenuButton("Demote to Visitor", - --IsVisible - function(player) - return ( getPrivilegeType(game.Players.LocalPlayer) >= privilegeAdmin ) and ( getPrivilegeType(player) == privilegeMember ) - end, - --IsActive - function(player) - return true - end, - --DoIt - function(player) - game:GetService("PersonalServerService"):Demote(player) - return true - end - ) -end - -local function setupBuildToolManagement() - local buildToolManagerAssetId = 64164692 - game:GetService("ScriptContext"):AddCoreScript(buildToolManagerAssetId,game.Players.LocalPlayer,"BuildToolManager") -end - - -local function getStatColumns(players) - for i, player in ipairs(players) do - local leaderstats = player:FindFirstChild("leaderstats") - if leaderstats then - local stats = {} - local children = leaderstats:GetChildren() - if children then - for i, stat in ipairs(children) do - if stat:IsA("IntValue") then - table.insert(stats, stat) - else - --TODO: This should check for IntValue only but current ScoreHud does not - table.insert(stats, stat) - end - end - end - return stats - end - end - return nil -end - -local function determineBoardType() - local players = getPlayers() - - local foundLeaderstats = false - local numStats = 0 - local foundTeam = false - - local stats = getStatColumns(players) - if stats then - foundLeaderstats = true - numStats = #stats - end - - for i, player in ipairs(players) do - if not foundTeam then - if not player.Neutral then - foundTeam = true - break - end - end - end - - if foundLeaderstats and foundTeam then - return "TeamScore", numStats - elseif foundLeaderstats then - return "PlayerScore", numStats - elseif foundTeam then - return "TeamList", numStats - else - return "PlayerList", numStats - end -end - -local function toggleBigWindow() - if container == nil then - return - end - - if currentWindowState == "Big" then - --Hide it - if previousWindowState == nil or previousWindowState == "Big" or previousWindowState == "None" then - transitionWindowsFunction("None") - else - transitionWindowsFunction("Small") - end - else - previousWindowState = currentWindowState - transitionWindowsFunction("Big") - end -end -local previousBigPlayerList = nil -local function rebuildBoard(owner, boardType, numStats) - if topRightTrayContainer == nil then - topRightTrayContainer = owner:FindFirstChild("PlayerListTopRightFrame") - if topRightTrayContainer == nil then - topRightTrayContainer = Instance.new("Frame") - topRightTrayContainer.Name = "PlayerListTopRightFrame" - topRightTrayContainer.BackgroundTransparency = 1 - topRightTrayContainer.Size = UDim2.new(0.2, 16, 0.42, 16) - topRightTrayContainer.Position = UDim2.new(0.8, 0, 0, 0) - topRightTrayContainer.Parent = container - end - end - if minimizedState == nil then - minimizedState = Instance.new("Frame") - minimizedState.Name = "MinimizedPlayerlist" - minimizedState.BackgroundTransparency = 1 - minimizedState.Position = UDim2.new(1, -166, 0,0) - minimizedState.Size = UDim2.new(0, 151, 0, 30) - - playerListButton = Instance.new("ImageButton") - playerListButton.Name = "GoSmallButton" - playerListButton.Image = "rbxasset://textures/ui/playerlist_hidden_small.png" - playerListButton.BackgroundTransparency = 1 - playerListButton.Size = UDim2.new(0.0, 35, 0, 30) - playerListButton.Position = UDim2.new(1, -35, 0, 0) - playerListButton.MouseButton1Click:connect( - function() - transitionWindowsFunction("Small") - end) - playerListButton.Parent = minimizedState - - minimizedState.Visible = false - robloxLock(minimizedState) - minimizedState.Parent = topRightTrayContainer - end - if bigWindowImposter == nil then - bigWindowImposter = owner:FindFirstChild("BigPlayerListWindowImposter") - if bigWindowImposter == nil then - bigWindowImposter = Instance.new("Frame") - bigWindowImposter.Name = "BigPlayerListWindowImposter" - bigWindowImposter.Visible = false - bigWindowImposter.BackgroundColor3 = Color3.new(0,0,0) - bigWindowImposter.BackgroundTransparency = 0.7 - bigWindowImposter.BorderSizePixel = 0 - bigWindowImposter.Size = UDim2.new(0.4, 7, 0.4, 7) - bigWindowImposter.Position = UDim2.new(0.3, 0, 0.3, 0) - robloxLock(bigWindowImposter) - bigWindowImposter.Parent = container - end - end - if container == nil or container ~= owner then - container = owner - - topRightTrayContainer.Parent = container - bigWindowImposter.Parent = container - end - - local smallVisible = true - local bigVisible = false - if container then - if topRightTrayContainer then - --Delete the old boards - if topRightTrayContainer:FindFirstChild("SmallPlayerlist") then - smallVisible = topRightTrayContainer.SmallPlayerlist.Visible - topRightTrayContainer.SmallPlayerlist.Parent = nil - end - end - if container:FindFirstChild("BigPlayerlist") then - bigVisible = container.BigPlayerlist.Visible or (previousBigPlayerList ~= nil) - container.BigPlayerlist.Parent = nil - if previousBigPlayerList ~= nil then - pcall(function() game.GuiService:RemoveCenterDialog(previousBigPlayerList) end) - previousBigPlayerList = nil - end - end - end - - local smallBoard, bigBoard = createBoardsFunction(boardType, numStats) - if smallBoard then - smallBoard.Visible = smallVisible - smallBoard.Parent = topRightTrayContainer - recalculateSmallPlayerListSize(smallBoard) - end - if bigBoard then - if bigVisible then - previousBigPlayerList = bigBoard - local centerDialogSupported, msg = pcall(function() game.GuiService:AddCenterDialog(previousBigPlayerList, Enum.CenterDialogType.PlayerInitiatedDialog, - function() - previousBigPlayerList.Visible = true - end, - function() - previousBigPlayerList.Visible = false - end) - end) - bigBoard.Visible = bigVisible - else - bigBoard.Visible = false - end - bigBoard.Parent = container - end - return container -end - -function recalculateSmallPlayerListSize(smallPlayerList) -end - - -local function showBigPlayerWindow() - if container:FindFirstChild("BigPlayerlist") then - if container.BigPlayerlist.Visible then - return - end - end - - bigWindowImposter.Visible = true - bigWindowImposter:TweenSizeAndPosition(bigWindowSize, bigWindowPosition, Enum.EasingDirection.Out, bigEasingStyle, 0.3, true, - function(state) - if state == Enum.TweenStatus.Completed then - bigWindowImposter.Visible = false - if container:FindFirstChild("BigPlayerlist") then - container.BigPlayerlist.Visible = true - end - end - end) -end - -local function hideBigPlayerWindow(completed) - if playerContextMenu then - playerContextMenu.Visible = false - end - - if container:FindFirstChild("BigPlayerlist") then - if container.BigPlayerlist.Visible == false and bigWindowImposter.Visible == false then - if completed then - completed() - end - --Already completely hidden - return - end - container.BigPlayerlist.Visible = false - end - - local completedFunction = completed - bigWindowImposter.Visible = true - bigWindowImposter:TweenSizeAndPosition(UDim2.new(0.4, 0, 0.4, 0), UDim2.new(0.3, 0, 0.3, 0), Enum.EasingDirection.In, Enum.EasingStyle.Quart, 0.15, true, - function(state) - if state == Enum.TweenStatus.Completed then - bigWindowImposter.Visible = false - if completedFunction then - completedFunction() - end - end - end) -end -local function hideSmallPlayerWindow(completed) - if playerContextMenu then - playerContextMenu.Visible = false - end - if topRightTrayContainer:FindFirstChild("SmallPlayerlist") then - local completedFunction = completed - if topRightTrayContainer.SmallPlayerlist.Visible then - topRightTrayContainer.SmallPlayerlist:TweenPosition(UDim2.new(1,0,smallWindowPosition.Y.Scale, smallWindowPosition.Y.Offset), Enum.EasingDirection.Out, smallEasingStyle, 0.3, true, - function(state) - if state == Enum.TweenStatus.Completed then - if topRightTrayContainer:FindFirstChild("SmallPlayerlist") then - topRightTrayContainer.SmallPlayerlist.Visible = false - end - if completedFunction then - completedFunction() - end - end - end) - return - end - end - if completed then - completed() - end -end - - -transitionWindowsFunction = function(desiredState) - if desiredState == "Big" then - minimizedState.Visible = false - hideSmallPlayerWindow() - - if previousBigPlayerList ~= nil then - if previousBigPlayerList ~= container:FindFirstChild("BigPlayerlist") then - pcall(function() game.GuiService:RemoveCenterDialog(previousBigPlayerList) end) - previousBigPlayerList = nil - previousBigPlayerList = container:FindFirstChild("BigPlayerlist") - end - else - previousBigPlayerList = container:FindFirstChild("BigPlayerlist") - end - - if previousBigPlayerList then - local firstShow = false - local centerDialogSupported, msg = pcall(function() game.GuiService:AddCenterDialog(previousBigPlayerList, Enum.CenterDialogType.PlayerInitiatedDialog, - function() - if not firstShow then - showBigPlayerWindow() - firstShow = true - else - previousBigPlayerList.Visible = true - end - end, - function() - if previousBigPlayerList then - previousBigPlayerList.Visible = false - end - end) - end) - if centerDialogSupported == false then - print("Exception", msg) - showBigPlayerWindow() - end - else - showBigPlayerWindow() - end - currentWindowState = "Big" - elseif desiredState == "Small" then - minimizedState.Visible = false - if previousBigPlayerList ~= nil then - pcall(function() game.GuiService:RemoveCenterDialog(previousBigPlayerList) end) - previousBigPlayerList = nil - end - - hideBigPlayerWindow() - if topRightTrayContainer:FindFirstChild("SmallPlayerlist") then - if not topRightTrayContainer.SmallPlayerlist.Visible or topRightTrayContainer.SmallPlayerlist.Position ~= smallWindowPosition then - topRightTrayContainer.SmallPlayerlist.Visible = true - topRightTrayContainer.SmallPlayerlist:TweenPosition(smallWindowPosition, Enum.EasingDirection.Out, smallEasingStyle, 0.3, true) - end - end - currentWindowState = "Small" - elseif desiredState == "None" then - if previousBigPlayerList ~= nil then - pcall(function() game.GuiService:RemoveCenterDialog(previousBigPlayerList) end) - previousBigPlayerList = nil - end - - local smallDone = false - local bigDone = false - hideSmallPlayerWindow( - function() - smallDone = true - if bigDone and smallDone then - minimizedState.Visible = true - end - end) - hideBigPlayerWindow( - function() - bigDone = true - if bigDone and smallDone then - minimizedState.Visible = true - end - end) - currentWindowState = "None" - end -end - -local function getStatValuesForPlayer(player) - local leaderstats = player:FindFirstChild("leaderstats") - if leaderstats then - local children = leaderstats:GetChildren() - if children then - local result = {} - --Just go based on position - for i, stat in ipairs(children) do - if stat:IsA("IntValue") then - table.insert(result, stat) - else - table.insert(result, 0) - end - end - - return result, leaderstats - end - end - return nil -end - ---ChildAdded on Player (if it's name is "leaderstats") - -if UserSettings and LoadLibrary then - - RbxGui,msg = t - - local function createTeamName(name, color) - local fontHeight = 20 - local frame = Instance.new("Frame") - frame.Name = "Team-" .. name - frame.BorderSizePixel = 0 - frame.BackgroundTransparency = 0.5 - frame.BackgroundColor3 = Color3.new(1,1,1) - frame.Size = UDim2.new(1, 0, 0, fontHeight) - frame.Position = UDim2.new(0,0,0,0) - - local label = Instance.new("TextLabel") - label.Name = "NameLabel" - label.Text = " " .. name - label.Font = Enum.Font.ArialBold - label.FontSize = Enum.FontSize.Size18 - label.Position = UDim2.new(0,0,0,0) - label.Size = UDim2.new(1,0,1,0) - label.TextColor3 = Color3.new(1,1,1) - label.BackgroundTransparency = 0.5 - label.BackgroundColor3 = getColor(color) - label.BorderSizePixel = 0 - label.TextXAlignment = Enum.TextXAlignment.Left - - local changeFunc = nil - label, changeFunc = RbxGui.AutoTruncateTextObject(label) - label.Parent = frame - - return frame, changeFunc - end - - local function getFriendStatusIcon(friendStatus) - if friendStatus == Enum.FriendStatus.Unknown or friendStatus == Enum.FriendStatus.NotFriend then - return nil - elseif friendStatus == Enum.FriendStatus.Friend then - return "rbxasset://textures/ui/PlayerlistFriendIcon.png" - elseif friendStatus == Enum.FriendStatus.FriendRequestSent then - return "rbxasset://textures/ui/PlayerlistFriendRequestSentIcon.png" - elseif friendStatus == Enum.FriendStatus.FriendRequestReceived then - return "rbxasset://textures/ui/PlayerlistFriendRequestReceivedIcon.png" - else - error("Unknown FriendStatus: " .. friendStatus) - end - end - - local function getMembershipTypeIcon(membershipType, playerName) - if membershipType == Enum.MembershipType.None then - return "rbxasset://../../../shareddata/charcustom/custom/icons/"..playerName..".png" - elseif membershipType == Enum.MembershipType.BuildersClub then - return "rbxasset://textures/ui/TinyBcIcon.png" - elseif membershipType == Enum.MembershipType.TurboBuildersClub then - return "rbxasset://textures/ui/TinyTbcIcon.png" - elseif membershipType == Enum.MembershipType.OutrageousBuildersClub then - return "rbxasset://textures/ui/TinyObcIcon.png" - else - error("Uknown membershipType" .. membershipType) - end - end - - - local function updatePlayerFriendStatus(nameObject, friendStatus) - local fontHeight = 20 - - local friendIconImage = getFriendStatusIcon(friendStatus) - nameObject.MembershipTypeLabel.FriendStatusLabel.Visible = (friendIconImage ~= nil) - - if friendIconImage ~= nil then - --Show friend icon - nameObject.MembershipTypeLabel.FriendStatusLabel.Image = friendIconImage - nameObject.NameLabel.Position =UDim2.new(0,2*fontHeight,0,1) - nameObject.NameLabel.Size = UDim2.new(1,-2*fontHeight,1,-2) - else - --Hide the friend icon - nameObject.NameLabel.Position = UDim2.new(0,fontHeight+1,0,1) - nameObject.NameLabel.Size = UDim2.new(1,-(fontHeight+1),1,-2) - end - end - local function updatePlayerName(nameObject, membershipStatus, teamColor) - local fontHeight = 20 - - local playerName = nameObject.NameLabel.Text - - nameObject.Size = UDim2.new(1,0,0,fontHeight) - nameObject.MembershipTypeLabel.Image = getMembershipTypeIcon(membershipStatus, playerName) - end - - - local function updatePlayerNameColor(player, teamColor) - local function updatePlayerNameColorHelper(nameObject) - if teamColor ~= nil then - nameObject.NameLabel.TextColor3 = getColor(teamColor) - nameObject.NameLabel.FullNameLabel.TextColor3 = getColor(teamColor) - else - nameObject.NameLabel.TextColor3 = Color3.new(1,1,1) - nameObject.NameLabel.FullNameLabel.TextColor3 = Color3.new(1,1,1) - end - end - - updatePlayerNameColorHelper(playerTable[player].NameObjectSmall) - updatePlayerNameColorHelper(playerTable[player].NameObjectBig) - end - - - local function createPlayerName(name, membershipStatus, teamColor, friendStatus) - local frame = Instance.new("Frame") - frame.Name = "Player_" .. name - frame.BackgroundColor3 = Color3.new(1,1,1) - frame.BackgroundTransparency = 0.5 - frame.BorderSizePixel = 0 - - local membershipStatusLabel = Instance.new("ImageLabel") - membershipStatusLabel.Name = "MembershipTypeLabel" - membershipStatusLabel.BackgroundTransparency = 1 - membershipStatusLabel.Size = UDim2.new(1,0,1,0) - membershipStatusLabel.Position = UDim2.new(0,0,0,0) - membershipStatusLabel.SizeConstraint = Enum.SizeConstraint.RelativeYY - membershipStatusLabel.Parent = frame - - local friendStatusLabel = Instance.new("ImageLabel") - friendStatusLabel.Name = "FriendStatusLabel" - friendStatusLabel.Visible = false - friendStatusLabel.BackgroundTransparency = 1 - friendStatusLabel.Size = UDim2.new(1,0,1,0) - friendStatusLabel.Position = UDim2.new(1,0,0,0) - friendStatusLabel.Parent = membershipStatusLabel - - local changeNameFunction - local nameLabel = Instance.new("TextLabel") - nameLabel.Name = "NameLabel" - nameLabel.Text = name - nameLabel.Font = Enum.Font.ArialBold - nameLabel.FontSize = Enum.FontSize.Size14 - nameLabel.TextColor3 = Color3.new(1,1,1) - nameLabel.BackgroundTransparency = 1 - nameLabel.BackgroundColor3 = Color3.new(0,0,0) - nameLabel.TextXAlignment = Enum.TextXAlignment.Left - nameLabel, changeNameFunction = RbxGui.AutoTruncateTextObject(nameLabel) - nameLabel.Parent = frame - - updatePlayerName(frame, membershipStatus, teamColor) - if supportFriends and not friendRequestBlacklist[game.Players:FindFirstChild(name)] then - updatePlayerFriendStatus(frame, friendStatus) - else - updatePlayerFriendStatus(frame, Enum.FriendStatus.NotFriend) - end - return frame, changeNameFunction - end - - local function createStatColumn(i, numColumns, isTeam, color3, isHeader, stat) - local textLabel = Instance.new("TextButton") - textLabel.Name = "Stat" .. i - textLabel.AutoButtonColor = false - textLabel.TextColor3 = Color3.new(1,1,1) - textLabel.TextXAlignment = Enum.TextXAlignment.Right - textLabel.TextYAlignment = Enum.TextYAlignment.Center - textLabel.FontSize = Enum.FontSize.Size14 - - if isHeader then - textLabel.FontSize = Enum.FontSize.Size18 - else - textLabel.FontSize = Enum.FontSize.Size14 - end - if isHeader or isTeam then - textLabel.Font = Enum.Font.ArialBold - else - textLabel.Font = Enum.Font.Arial - end - - if isTeam then - textLabel.BackgroundColor3 = color3 - textLabel.Text = 0 - else - textLabel.BackgroundColor3 = Color3.new(0,0,0) - textLabel.Text = "" - end - textLabel.BackgroundTransparency = 1 - if i == numColumns then - textLabel.Size = UDim2.new(1/numColumns, -6, 1, 0) - else - textLabel.Size = UDim2.new(1/numColumns, -4, 1, 0) - end - - textLabel.Position = UDim2.new((i-1) * (1/numColumns), 0, 0, 0) - - local truncLabel, changer = RbxGui.AutoTruncateTextObject(textLabel) - - if isHeader then - local mouseCon = {} - - mouseCon[1] = truncLabel.MouseEnter:connect(function() - truncLabel.BackgroundTransparency = 0.2 - end) - mouseCon[2] = truncLabel.MouseLeave:connect(function() - truncLabel.BackgroundTransparency = 1 - end) - - mouseCon[3] = truncLabel.MouseButton1Click:connect(function() - sortPlayerListsFunction(truncLabel:GetChildren()[1].Name, (currentSortName == truncLabel:GetChildren()[1].Name) ) - truncLabel.BackgroundTransparency = 1 - end) - - mouseCon[4] = truncLabel:GetChildren()[1].MouseButton1Click:connect(function() - sortPlayerListsFunction(textLabel.Name, (currentSortName == truncLabel.Name) ) - truncLabel.BackgroundTransparency = 1 - end) - - mouseCon[5] = nil - mouseCon[5] = truncLabel.AncestryChanged:connect(function(child,parent) - if parent == nil then - for i,connection in pairs(mouseCon) do - connection:disconnect() - end - end - end) - end - - return truncLabel, changer - end - - local function createStatHeaders(stats, numColumns, isBig) - local frame = Instance.new("Frame") - frame.Name = "Headers" - frame.BorderSizePixel = 0 - frame.BackgroundColor3 = Color3.new(0,0,0) - frame.BackgroundTransparency = 1 - - local nameSize - if isBig then - nameSize = 0.5 - elseif numColumns == 1 then - nameSize = 0.7 - elseif numColumns == 2 then - nameSize = 0.6 - else - nameSize = 0.45 - end - frame.Size = UDim2.new(1-nameSize, 0, 1,0) - if isBig then - frame.Position = UDim2.new(nameSize,-25, 0,0) - else - frame.Position = UDim2.new(nameSize,0, 0,0) - end - - local i = 1 - while i <= numColumns do - local headerColumn, changeText = createStatColumn(i, numColumns, false, nil, true,stats[i]) - changeText(stats[i].Name) - headerColumn.Parent = frame - i = i + 1 - end - return frame, textChangers - end - - local function createStatColumns(nameObject, numColumns, isTeam, isBig) - local frame = Instance.new("Frame") - frame.Name = nameObject.Name .. "_WithStats" - frame.BorderSizePixel = 0 - frame.BackgroundColor3 = nameObject.BackgroundColor3 - frame.BackgroundTransparency = nameObject.BackgroundTransparency - frame.Size = nameObject.Size - frame.Position = nameObject.Position - - nameObject.BackgroundTransparency = 1 - - if numColumns == 0 then - nameObject.Size = UDim2.new(1,0,1,0) - nameObject.Position = UDim2.new(0,0,0,0) - nameObject.Parent = frame - return frame - end - - local statFrame = Instance.new("Frame") - statFrame.Name = "Stats" - if isTeam then - statFrame.BorderSizePixel = 0 - statFrame.BackgroundColor3 = nameObject.NameLabel.BackgroundColor3 - statFrame.BackgroundTransparency = nameObject.NameLabel.BackgroundTransparency - else - statFrame.BackgroundTransparency = 1 - end - - local nameSize - if isBig then - nameSize = 0.5 - elseif numColumns == 1 then - nameSize = 0.7 - elseif numColumns == 2 then - nameSize = 0.6 - else - nameSize = 0.45 - end - nameObject.Size = UDim2.new(nameSize, 0, 1, 0) - nameObject.Position = UDim2.new(0, 0, 0, 0) - statFrame.Size = UDim2.new(1-nameSize,0, 1,0) - statFrame.Position = UDim2.new(nameSize,0, 0,0) - - nameObject.Parent = frame - statFrame.Parent = frame - - local textChangers = {} - local i = 1 - while i <= numColumns do - local statColumn, changeText = createStatColumn(i, numColumns, isTeam, statFrame.BackgroundColor3) - statColumn.Parent = statFrame - table.insert(textChangers, changeText) - - i = i + 1 - end - - return frame, statFrame, textChangers - end - - local function createAlternatingRows(objects) - for i, line in ipairs(objects) do - if i % 2 == 0 then - line.BackgroundTransparency = 1 - else - line.BackgroundTransparency = 0.95 - end - end - end - local removeFromTeam = nil - - local function clearTableEntry(obj, tableInfo) - if tableInfo.MainObjectSmall then - tableInfo.MainObjectSmall.Parent = nil - tableInfo.MainObjectSmall = nil - end - if tableInfo.MainObjectBig then - tableInfo.MainObjectBig.Parent = nil - tableInfo.MainObjectBig = nil - end - if tableInfo.Connections then - for i, connection in ipairs(tableInfo.Connections) do - connection:disconnect() - end - tableInfo.Connections = nil - end - if tableInfo.LeaderStatConnections then - for i, connection in ipairs(tableInfo.LeaderStatConnections) do - connection:disconnect() - end - tableInfo.LeaderStatConnections = nil - end - if tableInfo.CurrentTeam then - removeFromTeam(obj) - tableInfo.CurrentTeam = nil - end - if tableInfo.Players then - for i, player in ipairs(tableInfo.Players) do - playerTable[player].CurrentTeam = nil - end - tableInfo.Players = {} - end - if tableInfo.StatValues then - tableInfo.StatValues = nil - end - end - - local function resetPlayerTable() - for player, info in pairs(playerTable) do - clearTableEntry(player, info) - playerTable[player] = nil - end - playerTable = {} - end - - local function resetTeamTable() - for team, info in pairs(teamTable) do - clearTableEntry(team, info) - teamTable[team] = nil - end - teamTable = {} - teamColorTable = {} - end - - local function getBoardTypeInfo() - local isTeam = (currentBoardType == "TeamScore" or currentBoardType == "TeamList") - local isScore = (currentBoardType == "TeamScore" or currentBoardType == "PlayerScore") - return isTeam, isScore - end - - - local function recomputeTeamScore(team, column) - if not team or team == "Neutral" then - return - end - - local function recomputeScoreHelper(statChangers) - if statChangers and column <= #statChangers then - local sum = 0 - for i, p in ipairs(teamTable[team].Players) do - if playerTable[p].StatValues and column <= #playerTable[p].StatValues then - sum = sum + playerTable[p].StatValues[column].Value - end - end - statChangers[column](sum) - end - end - - recomputeScoreHelper(teamTable[team].StatChangersSmall) - recomputeScoreHelper(teamTable[team].StatChangersBig) - end - local function recomputeCompleteTeamScore(team) - local col = 1 - while col <= currentStatCount do - recomputeTeamScore(team, col) - col = col + 1 - end - end - removeFromTeam = function(player) - if playerTable[player].CurrentTeam ~= nil and teamTable[playerTable[player].CurrentTeam] ~= nil then - ArrayRemove(teamTable[playerTable[player].CurrentTeam].Players, player) - recomputeCompleteTeamScore(playerTable[player].CurrentTeam) - playerTable[player].CurrentTeam = nil - end - end - - local function assignToTeam(player) - local isTeam, isScore = getBoardTypeInfo() - - if isTeam then - local newTeam = nil - - if player.Neutral or teamColorTable[player.TeamColor.Name] == nil then - newTeam = "Neutral" - else - newTeam = teamColorTable[player.TeamColor.Name] - end - - if playerTable[player].CurrentTeam == newTeam then - return - end - - local oldTeam = playerTable[player].LastTeam - removeFromTeam(player) - - playerTable[player].CurrentTeam = newTeam - - if teamTable[oldTeam] and teamTable[oldTeam]["NameChangeFuncBig"] then - if #teamTable[oldTeam].Players < 1 then - teamTable[oldTeam]["NameChangeFuncBig"](" " .. oldTeam.Name) - else - teamTable[oldTeam]["NameChangeFuncBig"](" " .. oldTeam.Name .. " (" .. tostring(#teamTable[oldTeam].Players) ..")") - end - end - - if teamTable[newTeam] then - table.insert(teamTable[newTeam].Players, player) - if newTeam["Name"] then - if teamTable[newTeam]["NameChangeFuncBig"] then - if #teamTable[newTeam].Players < 1 then - teamTable[newTeam]["NameChangeFuncBig"](" " .. newTeam.Name) - else - teamTable[newTeam]["NameChangeFuncBig"](" " .. newTeam.Name .. " (" .. tostring(#teamTable[newTeam].Players) ..")") - end - end - end - end - - if newTeam == "Neutral" then - updatePlayerNameColor(player, nil) - else - updatePlayerNameColor(player, player.TeamColor) - end - - playerTable[player].LastTeam = newTeam - - recomputeCompleteTeamScore(newTeam) - - --Relayout - if sortPlayerListsFunction then - sortPlayerListsFunction() - end - end - end - - local function buildTeamObject(team, numStatColumns, suffix) - local isTeam, isScore = getBoardTypeInfo() - local teamObject, changeFunc = createTeamName(team.Name, team.TeamColor) - teamObject.NameLabel.Text = " " .. team.Name .. " (0)" - if not teamTable[team] then - teamTable[team] = {} - end - teamTable[team]["NameObject" .. suffix] = teamObject - teamTable[team]["NameChangeFunc" .. suffix] = changeFunc - if isScore then - local statObject - local textChangers - teamObject, statObject, textChangers = createStatColumns(teamObject, numStatColumns, true, suffix == "Big") - teamTable[team]["StatObject" .. suffix] = statObject - teamTable[team]["StatChangers" .. suffix] = textChangers - end - teamTable[team]["MainObject" .. suffix] = teamObject - changeFunc(" " .. team.Name) - if not teamTable[team].Players then - teamTable[team].Players = {} - else - if suffix ~= "Small" and #teamTable[team].Players > 0 then - changeFunc(" " .. team.Name .. " (" .. tostring(#teamTable[team].Players) ..")") - end - end - - return teamObject - end - - local currentContextMenuPlayer = nil - local function updatePlayerContextMenu(player,x,y) - currentContextMenuPlayer = player - local elementHeight = 18 - local function highlight(button) - button.TextColor3 = Color3.new(0,0,0) - button.BackgroundColor3 = Color3.new(0.8,0.8,0.8) - end - local function clearHighlight(button) - button.TextColor3 = Color3.new(1,1,1) - button.BackgroundColor3 = Color3.new(0,0,0) - end - if playerContextMenu == nil then - elementNames = {} - elementNameToElement = {} - - for i, contextElement in ipairs(contextMenuElements) do - table.insert(elementNames, contextElement.Text) - elementNameToElement[tostring(contextElement.Text)] = contextElement - end - - playerContextMenu = Instance.new("TextButton") - playerContextMenu.Name = "PlayerListContextMenu" - playerContextMenu.Style = Enum.ButtonStyle.RobloxButton - playerContextMenu.Text = "" - playerContextMenu.Visible = false - playerContextMenu.ZIndex = 4 - - playerContextMenu.MouseLeave:connect(function() - local menuChildren = playerContextMenu:GetChildren() - for i = 1, #menuChildren do - if menuChildren[i].Name == "ChoiceButton" then - menuChildren[i].TextColor3 = Color3.new(1,1,1) - menuChildren[i].BackgroundTransparency = 1 - end - end - playerContextMenu.Visible = false - inContextMenu = false - end) - - playerContextMenu.MouseEnter:connect(function() - inContextMenu = true - end) - - for i = 1, #elementNames do - local newElementButton = Instance.new("TextButton") - newElementButton.Name = "ChoiceButton" - newElementButton.Text = elementNames[i] - newElementButton.TextColor3 = Color3.new(1,1,1) - newElementButton.Font = Enum.Font.Arial - newElementButton.FontSize = Enum.FontSize.Size14 - newElementButton.BackgroundTransparency = 1 - newElementButton.TextWrap = true - newElementButton.Size = UDim2.new(1,0,0,elementHeight) - newElementButton.Position = UDim2.new(0,0,0,elementHeight * (i - 1)) - newElementButton.ZIndex = playerContextMenu.ZIndex + 1 - - newElementButton.MouseEnter:connect(function() - newElementButton.TextColor3 = Color3.new(0,0,0) - newElementButton.BackgroundTransparency = 0 - end) - - newElementButton.MouseLeave:connect(function() - newElementButton.TextColor3 = Color3.new(1,1,1) - newElementButton.BackgroundTransparency = 1 - end) - - newElementButton.MouseButton1Click:connect(function() - local element = elementNameToElement[newElementButton.Text] - pcall(function() element.DoIt(currentContextMenuPlayer) end) - playerContextMenu.Visible = false - newElementButton.TextColor3 = Color3.new(1,1,1) - newElementButton.BackgroundTransparency = 1 - end) - - newElementButton.Parent = playerContextMenu - end - - robloxLock(playerContextMenu) - playerContextMenu.Parent = script.Parent - - end - - local visibleElements = 0 - for i, contextElement in ipairs(contextMenuElements) do - local isVisible = false - - if contextElement.IsVisible then - local success, visible = pcall(function() return contextElement.IsVisible(currentContextMenuPlayer) end) - if success then - isVisible = visible - else - print("Error in IsVisible call: " .. visible) - end - end - - if isVisible then - local foundElement = false - for i = 1, #elementNames do - if elementNames[i] == contextElement.Text then - foundElement = true - break - end - end - if not foundElement then - table.insert(elementNames,contextElement.Text) - end - visibleElements = visibleElements + 1 - else - for i = 1, #elementNames do - if elementNames[i] == contextElement.Text then - table.remove(elementNames,i) - break - end - end - end - end - playerContextMenu.Size = UDim2.new(0, 150, 0, elementHeight + (elementHeight * visibleElements) ) - - if x and y then - x = x - (playerContextMenu.AbsoluteSize.X/2) - if x + playerContextMenu.AbsoluteSize.X >= script.Parent.AbsoluteSize.X then - x = script.Parent.AbsoluteSize.X - playerContextMenu.AbsoluteSize.X - end - playerContextMenu.Position = UDim2.new(0, x, 0, y - 3) - end - - local elementPos = 0 - local contextChildren = playerContextMenu:GetChildren() - for i = 1, #contextChildren do - if contextChildren[i]:IsA("GuiObject") and contextChildren[i].Name == "ChoiceButton" then - contextChildren[i].Visible = false - for j = 1, #elementNames do - if elementNames[j] == contextChildren[i].Text then - contextChildren[i].Visible = true - contextChildren[i].Position = UDim2.new(0,0,0,elementPos * elementHeight) - elementPos = elementPos + 1 - break - end - end - end - end - end - - local function playerContextMenuHasItems() - if playerContextMenu then - local children = playerContextMenu:GetChildren() - for i = 1, #children do - if children[i]:IsA("GuiObject") and children[i].Name == "ChoiceButton" and children[i].Visible then - return true - end - end - end - return false - end - - local function showPlayerMenu(player, x, y) - updatePlayerContextMenu(player,x,y) - if not playerContextMenuHasItems() then return end -- don't show if we have nothing to show - playerContextMenu.Visible = true - end - - local function buildPlayerObject(player, numStatColumns, suffix) - if not player then return nil end - - local isTeam, isScore = getBoardTypeInfo() - - local playerObject = nil - local changePlayerNameFunction = nil - local currentColor = nil - if isTeam and not player.Neutral then - currentColor = player.TeamColor.Color - else - currentColor = Color3.new(1,1,1) - end - playerObject, changePlayerNameFunction = createPlayerName(player.Name, player.MembershipType, currentColor, getFriendStatus(player)) - - if not playerTable[player] then - playerTable[player] = {} - end - if not playerTable[player].Connections then - playerTable[player].Connections = {} - end - if not playerTable[player].CurrentTeam then - playerTable[player].CurrentTeam = nil - end - if not playerTable[player].LastTeam then - playerTable[player].LastTeam = nil - end - playerTable[player]["NameObject" .. suffix] = playerObject - playerTable[player]["ChangeName" .. suffix] = changePlayerNameFunction - - if isScore then - local statObject = nil - local textChangers = nil - playerObject, statObject, textChangers = createStatColumns(playerObject, numStatColumns, false, suffix == "Big") - playerTable[player]["StatObject" .. suffix]= statObject - playerTable[player]["StatChangers" .. suffix] = textChangers - - local statValues, leaderstats = getStatValuesForPlayer(player) - if not statValues or #statValues < numStatColumns then - if not playerTable[player].LeaderStatConnections then - playerTable[player].LeaderStatConnections = {} - end - --Setup a listener to see when this data gets filled in - if not leaderstats then - --We don't even have a leaderstats child, wait for one - table.insert(playerTable[player].LeaderStatConnections, - player.ChildAdded:connect( - function(child) - if child.Name == "leaderstats" then - --Connections will be torn down - recreatePlayerFunction(player) - else - table.insert(playerTable[player].LeaderStatConnections, - child.Changed:connect( - function(prop) - if prop == "Name" and child.Name == "leaderstats" then - --Connections will be torn down - recreatePlayerFunction(player) - end - end)) - end - end)) - else - --We have a leaderstats, but not enough children, recreate if we get them - table.insert(playerTable[player].LeaderStatConnections, - leaderstats.ChildAdded:connect( - function(child) - --TODO only look for IntValue - recreatePlayerFunction(player) - end) - ) - table.insert(playerTable[player].LeaderStatConnections, - leaderstats.AncestryChanged:connect( - function(child) - --We got deleted, try again - recreatePlayerFunction(player) - end) - ) - end - end - if statValues then - if not playerTable[player].StatValues then - playerTable[player].StatValues = {} - end - local pos = 1 - while pos <= numStatColumns and pos <= #statValues do - local currentColumn = pos - local statValue = statValues[pos] - local statChanger = textChangers[pos] - - local updateStat = function(val) - statChanger(val) - if playerTable[player] ~= nil then recomputeTeamScore(playerTable[player].CurrentTeam, currentColumn) end - end - if pos > #playerTable[player].StatValues then - table.insert(playerTable[player].StatValues, statValue) - end - - if type(statValue) ~= "number" and statValue["Changed"] then - table.insert(playerTable[player].Connections, - statValue.Changed:connect(updateStat) - ) - end - - table.insert(playerTable[player].Connections, - statValue.AncestryChanged:connect( - function() - recreatePlayerFunction(player) - end) - ) - updateStat(statValue.Value) - pos = pos + 1 - end - end - end - - if supportFriends and player ~= game.Players.LocalPlayer and player.userId > 0 and game.Players.LocalPlayer.userId > 0 then - local button = Instance.new("TextButton") - button.Name = playerObject.Name .. "Button" - button.Text = "" - button.Active = false - button.Size = playerObject.Size - button.Position = playerObject.Position - button.BackgroundColor3 = playerObject.BackgroundColor3 - - local secondButton = Instance.new("TextButton") - secondButton.Name = playerObject.Name .. "RealButton" - secondButton.Text = "" - secondButton.BackgroundTransparency = 1 - secondButton.BackgroundColor3 = playerObject.BackgroundColor3 - local theNameLabel = playerObject:findFirstChild("NameLabel",true) - secondButton.Parent.BackgroundTransparency = 1 - secondButton.Parent.Visible = true - secondButton.ZIndex = 2 - secondButton.Size = UDim2.new(1,0,1,0) - - local previousTransparency = nil - table.insert(playerTable[player].Connections, - secondButton.MouseEnter:connect( - function(x,y) - if playerContextMenu and playerContextMenu.Visible then - return - end -- don't update if we currently see it - - updatePlayerContextMenu(player,x,y) - if not playerContextMenuHasItems() then return end -- don't show if we have nothing to show - - if previousTransparency == nil then - previousTransparency = secondButton.BackgroundTransparency - end - secondButton.Parent.BackgroundTransparency = 0 - end)) - table.insert(playerTable[player].Connections, - secondButton.MouseLeave:connect( - function() - if previousTransparency ~= nil then - previousTransparency = nil - end - delay(0.01,function() - if playerContextMenu and not inContextMenu then - playerContextMenu.Visible = false - end - end) - secondButton.Parent.BackgroundTransparency = 1 - end)) - - local mouseDownX, mouseDownY - table.insert(playerTable[player].Connections, - secondButton.MouseButton1Down:connect(function(x,y) - mouseDownX = x - mouseDownY = y - end)) - table.insert(playerTable[player].Connections, - secondButton.MouseButton1Click:connect(function() - showPlayerMenu(player, mouseDownX, secondButton.AbsolutePosition.Y + secondButton.AbsoluteSize.Y ) - end)) - playerObject.BackgroundTransparency = 1 - playerObject.Size = UDim2.new(1,0,1,0) - playerObject.Position = UDim2.new(0,0,0,0) - playerObject.Parent = button - - playerTable[player]["MainObject" .. suffix] = button - - playerObject = button - else - playerTable[player]["MainObject" .. suffix] = playerObject - - if player == game.Players.LocalPlayer and supportFriends then - table.insert(playerTable[player].Connections, - player.FriendStatusChanged:connect( - function(otherPlayer, friendStatus) - if friendRequestBlacklist[otherPlayer] then - updatePlayerFriendStatus(playerTable[otherPlayer]["NameObject" .. suffix], Enum.FriendStatus.NotFriend) - elseif playerTable[otherPlayer] then - updatePlayerFriendStatus(playerTable[otherPlayer]["NameObject" .. suffix], friendStatus) - end - end) - ) - end - end - table.insert(playerTable[player].Connections, - player.Changed:connect( - function(prop) - if prop == "MembershipType" then - updatePlayerName(playerTable[player]["NameObject" .. suffix], player.MembershipType, currentColor) - elseif prop == "Name" then - playerTable[player]["ChangeName" .. suffix](player.Name) - elseif prop == "Neutral" or prop == "TeamColor" then - assignToTeam(player) - end - end) - ) - return playerObject - end - - local function doSort(tableToSort, objectName, order, startPos, sortType, ascending) - local orderedPlayerTable = {} - getLocalPlayer = false - for i, player in ipairs(tableToSort) do - if playerTable[player] then - if playerTable[player][objectName] ~= nil then - if player ~= game.Players.LocalPlayer then - table.insert(orderedPlayerTable,playerTable[player][objectName]) - else - getLocalPlayer = true - end - end - end - end - - if sortType == nil then -- default back to alphabetical sort - table.sort(orderedPlayerTable,function(a,b) - return string.lower(a:FindFirstChild("FullNameLabel",true).Text) < string.lower(b:FindFirstChild("FullNameLabel",true).Text) - end) - else -- we are sorting by a value - table.sort(orderedPlayerTable,function(a,b) - if ascending then - currentSortName = "" - return tonumber(a:FindFirstChild(sortType,true).Text) > tonumber(b:FindFirstChild(sortType,true).Text) - else - currentSortName = sortType - return tonumber(a:FindFirstChild(sortType,true).Text) < tonumber(b:FindFirstChild(sortType,true).Text) - end - end) - end - if getLocalPlayer and playerTable[game.Players.LocalPlayer] and playerTable[game.Players.LocalPlayer][objectName] then - table.insert(orderedPlayerTable,1,playerTable[game.Players.LocalPlayer][objectName]) - end - for i = 1, #orderedPlayerTable do - order[orderedPlayerTable[i]] = startPos - startPos = startPos + 1 - end - - return startPos - end - - local function orderScrollList(scrollOrder, objectName, scrollFrame, sortType, ascending) - local pos = 0 - local order = {} - local isTeam, isScore = getBoardTypeInfo() - for i, obj in ipairs(scrollOrder) do - order[obj] = 0 - end - - if isTeam then - local teams = getTeams() - for i, team in ipairs(teams) do - if teamTable[team][objectName] then - order[teamTable[team][objectName]] = pos - pos = pos + 1 - end - pos = doSort(teamTable[team].Players, objectName, order, pos, sortType, ascending) - end - - if #teamTable["Neutral"].Players > 0 then - teamTable["Neutral"][objectName].Parent = scrollFrame - order[teamTable["Neutral"][objectName]] = pos - pos = pos + 1 - doSort(teamTable["Neutral"].Players, objectName, order, pos, sortType, ascending) - else - teamTable["Neutral"][objectName].Parent = nil - end - else - local players = getPlayers() - doSort(players, objectName, order, pos, sortType, ascending) - end - - table.sort(scrollOrder, - function(a,b) - return order[a] < order[b] - end) - end - - local function createPlayerListBasics(frame, isBig) - local headerFrame = Instance.new("Frame") - headerFrame.Name = "Header" - headerFrame.BackgroundTransparency = 1 - headerFrame.Size = UDim2.new(1,-13,0,26) - headerFrame.Position = UDim2.new(0,0,0,0) - headerFrame.Parent = frame - - local lowerPaneFrame = Instance.new("Frame") - lowerPaneFrame.Name = "ScrollingArea" - lowerPaneFrame.BackgroundTransparency = 1 - lowerPaneFrame.Size = UDim2.new(1,-3,1,-26) - if not isBig then lowerPaneFrame.Size = UDim2.new(1,-3,1,-30) end - lowerPaneFrame.Position = UDim2.new(0,0,0,26) - lowerPaneFrame.Parent = frame - - local scrollOrder = {} - local scrollFrame, scrollUp, scrollDown, recalculateScroll, scrollBar = RbxGui.CreateScrollingFrame(scrollOrder) - - scrollBar.Size = UDim2.new(0, 17, 1, -36) - if isBig then scrollBar.Size = UDim2.new(0, 17, 1, -61) end - scrollBar.Parent = lowerPaneFrame - - scrollFrame.Parent = lowerPaneFrame - scrollUp.Parent = lowerPaneFrame - scrollDown.Parent = lowerPaneFrame - - if isBig then - scrollFrame.Position = UDim2.new(0,0,0,0) - scrollUp.Position = UDim2.new(1,-41,0,5) - scrollDown.Position = UDim2.new(1,-41,1,-35) - scrollBar.Position = UDim2.new(1, -41, 0, 24) - - scrollFrame.Size = UDim2.new(1,-48,1,-16) - headerFrame.Size = UDim2.new(1,-20,0,26) - - else - scrollBar.Position = UDim2.new(1, -15, 0, 14) - scrollBar.Size = UDim2.new(0,17,1,-36) - scrollFrame.Position = UDim2.new(0,1,0,0) - scrollUp.Position = UDim2.new(1,-15,0,-5) - scrollDown.Position = UDim2.new(1,-15,1,-20) - - lowerPaneFrame.Position = UDim2.new(0,0,0,30) - - local toggleScrollBar = function(visible) - if visible then - scrollFrame.Size = UDim2.new(1,-16,1,0) - headerFrame.Size = UDim2.new(1,-16,0,smallWindowHeaderYSize) - else - scrollFrame.Size = UDim2.new(1,0,1,0) - headerFrame.Size = UDim2.new(1,0,0,smallWindowHeaderYSize) - end - scrollUp.Visible = visible - scrollDown.Visible = visible - scrollBar.Visible = visible - end - scrollUp.Changed:connect(function(prop) - if prop == "Active" then - toggleScrollBar(scrollUp.Active or scrollDown.Active) - end - end) - - scrollDown.Changed:connect(function(prop) - if prop == "Active" then - toggleScrollBar(scrollUp.Active or scrollDown.Active) - end - end) - - toggleScrollBar(scrollUp.Active or scrollDown.Active) - end - return headerFrame, scrollFrame, recalculateScroll, scrollOrder - end - - createBoardsFunction = function (boardType, numStatColumns) - local updatePlayerCount = function() - return #getPlayers() - end - - local smallFrame = Instance.new("Frame") - smallFrame.Name = "SmallPlayerlist" - smallFrame.Position = smallWindowPosition - smallFrame.Active = false - smallFrame.Size = smallWindowSize - smallFrame.BackgroundColor3 = Color3.new(0,0,0) - smallFrame.BackgroundTransparency = 0.7 - smallFrame.BorderSizePixel = 0 - - local bigFrame = Instance.new("Frame") - bigFrame.Name = "BigPlayerlist" - bigFrame.Size = bigWindowSize - bigFrame.Position = bigWindowPosition - bigFrame.BackgroundColor3 = Color3.new(0,0,0) - bigFrame.BackgroundTransparency = 0.7 - bigFrame.BorderSizePixel = 0 - bigFrame.Visible = false - - local bigFrameWrapper = Instance.new("Frame") - bigFrameWrapper.Name = "Expander" - bigFrameWrapper.Size = UDim2.new(1,21,1,16) - bigFrameWrapper.Position = UDim2.new(0, 0, 0,0) - bigFrameWrapper.BackgroundTransparency = 1 - bigFrameWrapper.Parent = bigFrame - - local smallHeaderFrame, scrollFrameSmall, recalculateScrollSmall, scrollOrderSmall = createPlayerListBasics(smallFrame, false) - local bigHeaderFrame, scrollFrameBig, recalculateScrollBig, scrollOrderBig = createPlayerListBasics(bigFrameWrapper, true) - - local playerListButton = Instance.new("ImageButton") - playerListButton.Name = "GoBigButton" - playerListButton.BackgroundTransparency = 1 - playerListButton.Image = "rbxasset://textures/ui/playerlist_small_maximize.png" - playerListButton.Size = UDim2.new(0.0, 35, 0, 29) - playerListButton.Position = UDim2.new(0, 0, 0, 0) - playerListButton.MouseButton1Click:connect( - function() - toggleBigWindow() - end) - playerListButton.Parent = smallHeaderFrame - - playerListButton = Instance.new("ImageButton") - playerListButton.Name = "CloseButton" - playerListButton.BackgroundTransparency = 1 - playerListButton.Image = "rbxasset://textures/ui/playerlist_small_hide.png" - playerListButton.Size = UDim2.new(0.0, 38, 0, 29) - playerListButton.Position = UDim2.new(0, 35, 0, 0) - playerListButton.MouseButton1Click:connect( - function() - transitionWindowsFunction("None") - end) - playerListButton.Parent = smallHeaderFrame - - playerListButton = Instance.new("ImageButton") - playerListButton.Name = "CloseButton" - playerListButton.Image = "rbxasset://textures/ui/playerlist_big_hide.png" - playerListButton.BackgroundTransparency = 1 - playerListButton.Size = UDim2.new(0.0, 29, 0, 29) - playerListButton.Position = UDim2.new(1, -30, 0.5, -13) - playerListButton.MouseButton1Click:connect( - function() - toggleBigWindow() - end) - playerListButton.Parent = bigHeaderFrame - - local placeName = Instance.new("TextButton") - placeName.Name = "PlaceName" - placeName.Text = " Players (" .. tostring(updatePlayerCount()) .. ")" - placeName.AutoButtonColor = false - placeName.FontSize = Enum.FontSize.Size24 - placeName.TextXAlignment = Enum.TextXAlignment.Left - placeName.Font = Enum.Font.ArialBold - placeName.BorderSizePixel = 0 - placeName.BackgroundColor3 = Color3.new(0,0,0) - placeName.BackgroundTransparency = 1 - placeName.TextColor3 = Color3.new(1,1,1) - placeName.Size = UDim2.new(0.4, 0, 1, 0) - placeName.Position = UDim2.new(0, 0, 0.0, 0) - placeName = RbxGui.AutoTruncateTextObject(placeName) - placeName.Parent = bigHeaderFrame - - placeName.MouseEnter:connect(function() - placeName.BackgroundTransparency = 0.2 - end) - - placeName.MouseLeave:connect(function() - placeName.BackgroundTransparency = 1 - end) - - placeName.MouseButton1Click:connect(function() - sortPlayerListsFunction() - end) - - currentBoardType = boardType - currentStatCount = numStatColumns - local isTeam, isScore = getBoardTypeInfo() - local players = getPlayers() - - if isScore then - local statColumns = getStatColumns(players) - numStatColumns = #statColumns - if numStatColumns > 3 then - numStatColumns = 3 - end - createStatHeaders(statColumns, numStatColumns, false).Parent = smallHeaderFrame - createStatHeaders(statColumns, currentStatCount, true).Parent = bigHeaderFrame - end - - --Clean up all old stuff - resetPlayerTable() - updatePlayerCount() - - for i, player in ipairs(players) do - local playerObject = buildPlayerObject(player, numStatColumns, "Small") - table.insert(scrollOrderSmall, playerObject) - playerObject.Parent = scrollFrameSmall - - playerObject = buildPlayerObject(player, currentStatCount, "Big") - table.insert(scrollOrderBig, playerObject) - playerObject.Parent = scrollFrameBig - end - - --Clean up old stuff - resetTeamTable() - - local teamStatObjects = {} - if isTeam then - local teams = getTeams() - local i = #teams - while i >= 1 do - --We go backwards so the "first" team color gets the team - local team = teams[i] - teamColorTable[team.TeamColor.Name] = team - i = i - 1 - end - - --Adding/Removing a Team causes a full invalidation of the board - for i, team in ipairs(teams) do - local teamObject = buildTeamObject(team, numStatColumns, "Small") - table.insert(scrollOrderSmall, teamObject) - teamObject.Parent = scrollFrameSmall - - teamObject = buildTeamObject(team, currentStatCount, "Big") - table.insert(scrollOrderBig, teamObject) - teamObject.Parent = scrollFrameBig - end - - teamTable["Neutral"] = {} - teamTable["Neutral"].Players = {} - - local neutralTeamObject = createTeamName("Neutral", BrickColor.palette(8)) - teamTable["Neutral"].NameObjectSmall = neutralTeamObject - teamTable["Neutral"].StatObjectSmall = nil - teamTable["Neutral"].MainObjectSmall = neutralTeamObject - table.insert(scrollOrderSmall, neutralTeamObject) - - neutralTeamObject = createTeamName("Neutral", BrickColor.palette(8)) - teamTable["Neutral"].NameObjectBig = neutralTeamObject - teamTable["Neutral"].StatObjectBig = nil - teamTable["Neutral"].MainObjectBig = neutralTeamObject - table.insert(scrollOrderBig, neutralTeamObject) - - local neutralPlayers = {} - for i, player in ipairs(players) do - assignToTeam(player) - end - end - - removePlayerFunction = function(player) - if playerTable[player] then - clearTableEntry(player, playerTable[player]) - - placeName.Text = " Players (" .. tostring(updatePlayerCount()) .. ")" - - ArrayRemove(scrollOrderSmall, playerTable[player].MainObjectSmall) - ArrayRemove(scrollOrderBig, playerTable[player].MainObjectBig) - - playerTable[player] = nil - recalculateSmallPlayerListSize(smallFrame) - end - end - recreatePlayerFunction = function(player) - placeName.Text = " Players (" .. tostring(updatePlayerCount()) .. ")" - - removePlayerFunction(player) - - local playerObject = buildPlayerObject(player, numStatColumns, "Small") - table.insert(scrollOrderSmall, playerObject) - robloxLock(playerObject) - playerObject.Parent = scrollFrameSmall - - playerObject = buildPlayerObject(player, currentStatCount, "Big") - table.insert(scrollOrderBig, playerObject) - robloxLock(playerObject) - playerObject.Parent = scrollFrameBig - - local isTeam, isScore = getBoardTypeInfo() - if isTeam then - assignToTeam(player) - end - - sortPlayerListsFunction() - recalculateSmallPlayerListSize(smallFrame) - end - - if screenResizeCon then screenResizeCon:disconnect() end - screenResizeCon = screen.Changed:connect( - function(prop) - if prop == "AbsoluteSize" then - wait() - recalculateSmallPlayerListSize(smallFrame) - end - end) - - sortPlayerListsFunction = function(sortType, ascending) - orderScrollList(scrollOrderSmall, "MainObjectSmall", scrollFrameSmall, sortType, ascending) - recalculateScrollSmall() - createAlternatingRows(scrollOrderSmall) - - orderScrollList(scrollOrderBig, "MainObjectBig", scrollFrameBig, sortType, ascending) - recalculateScrollBig() - createAlternatingRows(scrollOrderBig) - end - - sortPlayerListsFunction() - - robloxLock(smallFrame) - robloxLock(bigFrame) - return smallFrame, bigFrame - end - - --Teams changing invalidates the whole board - local function teamsChanged() - if debounceTeamsChanged then - return - end - - debounceTeamsChanged = true - wait() - rebuildBoard(script.Parent, determineBoardType()) - debounceTeamsChanged = false - end - - - local checkIfBoardChanged = function() - local newBoardType, numStats = determineBoardType() - if newBoardType ~= currentBoardType or numStats ~= currentStatCount then - rebuildBoard(script.Parent, newBoardType, numStats) - end - end - - local function buildPlayerList() - waitForChild(game, "Players") - waitForProperty(game.Players, "LocalPlayer") - - local teams = game:GetService("Teams") - if teams then - local teamConnections = {} - - teams.ChildAdded:connect( - function(child) - if child:IsA("Team") then - teamsChanged() - teamConnections[child] = child.Changed:connect( - function(prop) - if prop == "TeamColor" or prop == "Name" then - --Rebuild when things change - teamsChanged() - end - end) - end - end) - teams.ChildRemoved:connect( - function(child) - if child:IsA("Team") then - if teamConnections[child] then - teamConnections[child]:disconnect() - teamConnections[child] = nil - end - teamsChanged() - end - end) - end - - game.Players.ChildAdded:connect( - function(player) - if player:IsA("Player") then - addPlayerFunction(player) - end - end) - - game.Players.ChildRemoved:connect( - function(player) - if player:IsA("Player") then - if removePlayerFunction then - removePlayerFunction(player) - end - end - end) - - rebuildBoard(script.Parent, determineBoardType()) - - delay(0, - function() - while true do - wait(5) - checkIfBoardChanged() - end - end) - end - - buildPlayerList() -end - -if not personalServerPlace then -- one more backup check - local theBool = game.Workspace:FindFirstChild("PSVariable") - if theBool and theBool:IsA("BoolValue") then - personalServerPlace = true - end -end - -if personalServerPlace then - addPersonalServerContext() - setupBuildToolManagement() -else - local psVarCon = nil - psVarCon = game.Workspace.ChildAdded:connect(function(child) - if child:IsA("BoolValue") and child.Name == "PSVariable" then - psVarCon:disconnect() - personalServerPlace = true - addPersonalServerContext() - setupBuildToolManagement() - end - end) -end - true - - - \ No newline at end of file diff --git a/clients/2011M/content/fonts/Arial-18pt.fontdef b/clients/2011M/content/fonts/Arial-18pt.fontdef new file mode 100644 index 0000000..dad36a6 --- /dev/null +++ b/clients/2011M/content/fonts/Arial-18pt.fontdef @@ -0,0 +1,101 @@ +fonts/Arial-18pt +{ + type image + source fonts/Arial-18pt.png + + glyph u0032 0.1074219 0.3984375 0.1210938 0.453125 + glyph ! 0.1074219 0 0.1210938 0.0546875 + glyph " 0.2070313 0 0.2285156 0.0546875 + glyph # 0.3066406 0 0.3339844 0.0546875 + glyph $ 0.40625 0 0.4335938 0.0546875 + glyph % 0.5058594 0 0.5546875 0.0546875 + glyph & 0.6054688 0 0.6367188 0.0546875 + glyph ' 0.7050781 0 0.71875 0.0546875 + glyph ( 0.8046875 0 0.8183594 0.0546875 + glyph ) 0.9042969 0 0.9179688 0.0546875 + glyph * 0.0078125 0.09960938 0.02539063 0.1542969 + glyph + 0.1074219 0.09960938 0.1367188 0.1542969 + glyph , 0.2070313 0.09960938 0.2207031 0.1542969 + glyph - 0.3066406 0.09960938 0.3261719 0.1542969 + glyph . 0.40625 0.09960938 0.4199219 0.1542969 + glyph / 0.5058594 0.09960938 0.5234375 0.1542969 + glyph 0 0.6054688 0.09960938 0.6328125 0.1542969 + glyph 1 0.7050781 0.09960938 0.7324219 0.1542969 + glyph 2 0.8046875 0.09960938 0.8320313 0.1542969 + glyph 3 0.9042969 0.09960938 0.9316406 0.1542969 + glyph 4 0.0078125 0.1992188 0.03515625 0.2539063 + glyph 5 0.1074219 0.1992188 0.1347656 0.2539063 + glyph 6 0.2070313 0.1992188 0.234375 0.2539063 + glyph 7 0.3066406 0.1992188 0.3339844 0.2539063 + glyph 8 0.40625 0.1992188 0.4335938 0.2539063 + glyph 9 0.5058594 0.1992188 0.5332031 0.2539063 + glyph : 0.6054688 0.1992188 0.6191406 0.2539063 + glyph ; 0.7050781 0.1992188 0.71875 0.2539063 + glyph < 0.8046875 0.1992188 0.8339844 0.2539063 + glyph = 0.9042969 0.1992188 0.9335938 0.2539063 + glyph > 0.0078125 0.2988281 0.03710938 0.3535156 + glyph ? 0.1074219 0.2988281 0.1347656 0.3535156 + glyph @ 0.2070313 0.2988281 0.2460938 0.3535156 + glyph A 0.3066406 0.2988281 0.3378906 0.3535156 + glyph B 0.40625 0.2988281 0.4394531 0.3535156 + glyph C 0.5058594 0.2988281 0.5410156 0.3535156 + glyph D 0.6054688 0.2988281 0.640625 0.3535156 + glyph E 0.7050781 0.2988281 0.7363281 0.3535156 + glyph F 0.8046875 0.2988281 0.8339844 0.3535156 + glyph G 0.9042969 0.2988281 0.9414063 0.3535156 + glyph H 0.0078125 0.3984375 0.04296875 0.453125 + glyph I 0.1074219 0.3984375 0.1210938 0.453125 + glyph J 0.2070313 0.3984375 0.2324219 0.453125 + glyph K 0.3066406 0.3984375 0.3398438 0.453125 + glyph L 0.40625 0.3984375 0.4335938 0.453125 + glyph M 0.5058594 0.3984375 0.5488281 0.453125 + glyph N 0.6054688 0.3984375 0.640625 0.453125 + glyph O 0.7050781 0.3984375 0.7421875 0.453125 + glyph P 0.8046875 0.3984375 0.8359375 0.453125 + glyph Q 0.9042969 0.3984375 0.9414063 0.453125 + glyph R 0.0078125 0.4980469 0.04101563 0.5527344 + glyph S 0.1074219 0.4980469 0.1386719 0.5527344 + glyph T 0.2070313 0.4980469 0.2363281 0.5527344 + glyph U 0.3066406 0.4980469 0.3417969 0.5527344 + glyph V 0.40625 0.4980469 0.4375 0.5527344 + glyph W 0.5058594 0.4980469 0.5507813 0.5527344 + glyph X 0.6054688 0.4980469 0.6367188 0.5527344 + glyph Y 0.7050781 0.4980469 0.7363281 0.5527344 + glyph Z 0.8046875 0.4980469 0.8359375 0.5527344 + glyph [ 0.9042969 0.4980469 0.9179688 0.5527344 + glyph \ 0.0078125 0.5976563 0.02539063 0.6523438 + glyph ] 0.1074219 0.5976563 0.1210938 0.6523438 + glyph ^ 0.2070313 0.5976563 0.2363281 0.6523438 + glyph _ 0.3066406 0.5976563 0.3320313 0.6523438 + glyph ` 0.40625 0.5976563 0.4179688 0.6523438 + glyph a 0.5058594 0.5976563 0.5332031 0.6523438 + glyph b 0.6054688 0.5976563 0.6347656 0.6523438 + glyph c 0.7050781 0.5976563 0.7324219 0.6523438 + glyph d 0.8046875 0.5976563 0.8339844 0.6523438 + glyph e 0.9042969 0.5976563 0.9316406 0.6523438 + glyph f 0.0078125 0.6972656 0.0234375 0.7519531 + glyph g 0.1074219 0.6972656 0.1367188 0.7519531 + glyph h 0.2070313 0.6972656 0.234375 0.7519531 + glyph i 0.3066406 0.6972656 0.3183594 0.7519531 + glyph j 0.40625 0.6972656 0.4179688 0.7519531 + glyph k 0.5058594 0.6972656 0.53125 0.7519531 + glyph l 0.6054688 0.6972656 0.6171875 0.7519531 + glyph m 0.7050781 0.6972656 0.7480469 0.7519531 + glyph n 0.8046875 0.6972656 0.8320313 0.7519531 + glyph o 0.9042969 0.6972656 0.9335938 0.7519531 + glyph p 0.0078125 0.796875 0.03710938 0.8515625 + glyph q 0.1074219 0.796875 0.1367188 0.8515625 + glyph r 0.2070313 0.796875 0.2246094 0.8515625 + glyph s 0.3066406 0.796875 0.3320313 0.8515625 + glyph t 0.40625 0.796875 0.421875 0.8515625 + glyph u 0.5058594 0.796875 0.5332031 0.8515625 + glyph v 0.6054688 0.796875 0.6308594 0.8515625 + glyph w 0.7050781 0.796875 0.7421875 0.8515625 + glyph x 0.8046875 0.796875 0.8300781 0.8515625 + glyph y 0.9042969 0.796875 0.9296875 0.8515625 + glyph z 0.0078125 0.8964844 0.03125 0.9511719 + glyph { 0.1074219 0.8964844 0.125 0.9511719 + glyph | 0.2070313 0.8964844 0.21875 0.9511719 + glyph } 0.3066406 0.8964844 0.3242188 0.9511719 + glyph ~ 0.40625 0.8964844 0.4355469 0.9511719 +} diff --git a/clients/2011M/content/fonts/Arial-18pt.png b/clients/2011M/content/fonts/Arial-18pt.png new file mode 100644 index 0000000000000000000000000000000000000000..91d60ecc112fb82b488d931c337ce4dee6f07c04 GIT binary patch literal 19028 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 JJ%9b-{{zzSpvV9K literal 0 HcmV?d00001 diff --git a/clients/2011M/content/fonts/Arial-48pt.fontdef b/clients/2011M/content/fonts/Arial-48pt.fontdef new file mode 100644 index 0000000..3526206 --- /dev/null +++ b/clients/2011M/content/fonts/Arial-48pt.fontdef @@ -0,0 +1,101 @@ +fonts/Arial-48pt +{ + type image + source fonts/Arial-48pt.png + + glyph u0032 0.1103516 0.3984375 0.1269531 0.4716797 + glyph ! 0.1103516 0 0.1269531 0.07324219 + glyph " 0.2099609 0 0.2373047 0.07324219 + glyph # 0.3095703 0 0.3457031 0.07324219 + glyph $ 0.4091797 0 0.4453125 0.07324219 + glyph % 0.5087891 0 0.5732422 0.07324219 + glyph & 0.6083984 0 0.6494141 0.07324219 + glyph ' 0.7080078 0 0.7255859 0.07324219 + glyph ( 0.8076172 0 0.8242188 0.07324219 + glyph ) 0.9072266 0 0.9238281 0.07324219 + glyph * 0.01074219 0.09960938 0.03320313 0.1728516 + glyph + 0.1103516 0.09960938 0.1494141 0.1728516 + glyph , 0.2099609 0.09960938 0.2275391 0.1728516 + glyph - 0.3095703 0.09960938 0.3349609 0.1728516 + glyph . 0.4091797 0.09960938 0.4267578 0.1728516 + glyph / 0.5087891 0.09960938 0.5302734 0.1728516 + glyph 0 0.6083984 0.09960938 0.6445313 0.1728516 + glyph 1 0.7080078 0.09960938 0.7441406 0.1728516 + glyph 2 0.8076172 0.09960938 0.84375 0.1728516 + glyph 3 0.9072266 0.09960938 0.9433594 0.1728516 + glyph 4 0.01074219 0.1992188 0.046875 0.2724609 + glyph 5 0.1103516 0.1992188 0.1464844 0.2724609 + glyph 6 0.2099609 0.1992188 0.2460938 0.2724609 + glyph 7 0.3095703 0.1992188 0.3457031 0.2724609 + glyph 8 0.4091797 0.1992188 0.4453125 0.2724609 + glyph 9 0.5087891 0.1992188 0.5449219 0.2724609 + glyph : 0.6083984 0.1992188 0.6259766 0.2724609 + glyph ; 0.7080078 0.1992188 0.7255859 0.2724609 + glyph < 0.8076172 0.1992188 0.8466797 0.2724609 + glyph = 0.9072266 0.1992188 0.9462891 0.2724609 + glyph > 0.01074219 0.2988281 0.04980469 0.3720703 + glyph ? 0.1103516 0.2988281 0.1464844 0.3720703 + glyph @ 0.2099609 0.2988281 0.2617188 0.3720703 + glyph A 0.3095703 0.2988281 0.3515625 0.3720703 + glyph B 0.4091797 0.2988281 0.453125 0.3720703 + glyph C 0.5087891 0.2988281 0.5556641 0.3720703 + glyph D 0.6083984 0.2988281 0.6533203 0.3720703 + glyph E 0.7080078 0.2988281 0.7470703 0.3720703 + glyph F 0.8076172 0.2988281 0.8447266 0.3720703 + glyph G 0.9072266 0.2988281 0.9560547 0.3720703 + glyph H 0.01074219 0.3984375 0.05761719 0.4716797 + glyph I 0.1103516 0.3984375 0.1269531 0.4716797 + glyph J 0.2099609 0.3984375 0.2431641 0.4716797 + glyph K 0.3095703 0.3984375 0.3525391 0.4716797 + glyph L 0.4091797 0.3984375 0.4453125 0.4716797 + glyph M 0.5087891 0.3984375 0.5644531 0.4716797 + glyph N 0.6083984 0.3984375 0.6552734 0.4716797 + glyph O 0.7080078 0.3984375 0.7568359 0.4716797 + glyph P 0.8076172 0.3984375 0.8496094 0.4716797 + glyph Q 0.9072266 0.3984375 0.9560547 0.4716797 + glyph R 0.01074219 0.4980469 0.0546875 0.5712891 + glyph S 0.1103516 0.4980469 0.1523438 0.5712891 + glyph T 0.2099609 0.4980469 0.2470703 0.5712891 + glyph U 0.3095703 0.4980469 0.3564453 0.5712891 + glyph V 0.4091797 0.4980469 0.4482422 0.5712891 + glyph W 0.5087891 0.4980469 0.5683594 0.5712891 + glyph X 0.6083984 0.4980469 0.6474609 0.5712891 + glyph Y 0.7080078 0.4980469 0.75 0.5712891 + glyph Z 0.8076172 0.4980469 0.8466797 0.5712891 + glyph [ 0.9072266 0.4980469 0.9238281 0.5712891 + glyph \ 0.01074219 0.5976563 0.03222656 0.6708984 + glyph ] 0.1103516 0.5976563 0.1269531 0.6708984 + glyph ^ 0.2099609 0.5976563 0.2490234 0.6708984 + glyph _ 0.3095703 0.5976563 0.3417969 0.6708984 + glyph ` 0.4091797 0.5976563 0.4238281 0.6708984 + glyph a 0.5087891 0.5976563 0.5429688 0.6708984 + glyph b 0.6083984 0.5976563 0.6464844 0.6708984 + glyph c 0.7080078 0.5976563 0.7421875 0.6708984 + glyph d 0.8076172 0.5976563 0.8457031 0.6708984 + glyph e 0.9072266 0.5976563 0.9414063 0.6708984 + glyph f 0.01074219 0.6972656 0.03027344 0.7705078 + glyph g 0.1103516 0.6972656 0.1474609 0.7705078 + glyph h 0.2099609 0.6972656 0.2460938 0.7705078 + glyph i 0.3095703 0.6972656 0.3242188 0.7705078 + glyph j 0.4091797 0.6972656 0.4238281 0.7705078 + glyph k 0.5087891 0.6972656 0.5419922 0.7705078 + glyph l 0.6083984 0.6972656 0.6230469 0.7705078 + glyph m 0.7080078 0.6972656 0.7626953 0.7705078 + glyph n 0.8076172 0.6972656 0.84375 0.7705078 + glyph o 0.9072266 0.6972656 0.9443359 0.7705078 + glyph p 0.01074219 0.796875 0.04882813 0.8701172 + glyph q 0.1103516 0.796875 0.1484375 0.8701172 + glyph r 0.2099609 0.796875 0.2314453 0.8701172 + glyph s 0.3095703 0.796875 0.3417969 0.8701172 + glyph t 0.4091797 0.796875 0.4296875 0.8701172 + glyph u 0.5087891 0.796875 0.5449219 0.8701172 + glyph v 0.6083984 0.796875 0.640625 0.8701172 + glyph w 0.7080078 0.796875 0.7568359 0.8701172 + glyph x 0.8076172 0.796875 0.8408203 0.8701172 + glyph y 0.9072266 0.796875 0.9394531 0.8701172 + glyph z 0.01074219 0.8964844 0.04199219 0.9697266 + glyph { 0.1103516 0.8964844 0.1318359 0.9697266 + glyph | 0.2099609 0.8964844 0.2246094 0.9697266 + glyph } 0.3095703 0.8964844 0.3310547 0.9697266 + glyph ~ 0.4091797 0.8964844 0.4482422 0.9697266 +} diff --git a/clients/2011M/content/fonts/Arial-48pt.png b/clients/2011M/content/fonts/Arial-48pt.png new file mode 100644 index 0000000000000000000000000000000000000000..cf48aa16f2a3c75b7a8d27e74df700edcbc329fa GIT binary patch literal 62749 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 fL}*l$H~wcA7W|(O 0.0078125 0.2988281 0.03710938 0.3554688 + glyph ? 0.1074219 0.2988281 0.1367188 0.3554688 + glyph @ 0.2070313 0.2988281 0.2460938 0.3554688 + glyph A 0.3066406 0.2988281 0.3417969 0.3554688 + glyph B 0.40625 0.2988281 0.4414063 0.3554688 + glyph C 0.5058594 0.2988281 0.5429688 0.3554688 + glyph D 0.6054688 0.2988281 0.6425781 0.3554688 + glyph E 0.7050781 0.2988281 0.7382813 0.3554688 + glyph F 0.8046875 0.2988281 0.8359375 0.3554688 + glyph G 0.9042969 0.2988281 0.9433594 0.3554688 + glyph H 0.0078125 0.3984375 0.04492188 0.4550781 + glyph I 0.1074219 0.3984375 0.1230469 0.4550781 + glyph J 0.2070313 0.3984375 0.2363281 0.4550781 + glyph K 0.3066406 0.3984375 0.34375 0.4550781 + glyph L 0.40625 0.3984375 0.4375 0.4550781 + glyph M 0.5058594 0.3984375 0.5507813 0.4550781 + glyph N 0.6054688 0.3984375 0.6425781 0.4550781 + glyph O 0.7050781 0.3984375 0.7441406 0.4550781 + glyph P 0.8046875 0.3984375 0.8378906 0.4550781 + glyph Q 0.9042969 0.3984375 0.9433594 0.4550781 + glyph R 0.0078125 0.4980469 0.04296875 0.5546875 + glyph S 0.1074219 0.4980469 0.140625 0.5546875 + glyph T 0.2070313 0.4980469 0.2382813 0.5546875 + glyph U 0.3066406 0.4980469 0.34375 0.5546875 + glyph V 0.40625 0.4980469 0.4375 0.5546875 + glyph W 0.5058594 0.4980469 0.5527344 0.5546875 + glyph X 0.6054688 0.4980469 0.640625 0.5546875 + glyph Y 0.7050781 0.4980469 0.7382813 0.5546875 + glyph Z 0.8046875 0.4980469 0.8378906 0.5546875 + glyph [ 0.9042969 0.4980469 0.9238281 0.5546875 + glyph \ 0.0078125 0.5976563 0.02929688 0.6542969 + glyph ] 0.1074219 0.5976563 0.1269531 0.6542969 + glyph ^ 0.2070313 0.5976563 0.2363281 0.6542969 + glyph _ 0.3066406 0.5976563 0.3320313 0.6542969 + glyph ` 0.40625 0.5976563 0.421875 0.6542969 + glyph a 0.5058594 0.5976563 0.5351563 0.6542969 + glyph b 0.6054688 0.5976563 0.6367188 0.6542969 + glyph c 0.7050781 0.5976563 0.734375 0.6542969 + glyph d 0.8046875 0.5976563 0.8359375 0.6542969 + glyph e 0.9042969 0.5976563 0.9355469 0.6542969 + glyph f 0.0078125 0.6972656 0.02734375 0.7539063 + glyph g 0.1074219 0.6972656 0.1386719 0.7539063 + glyph h 0.2070313 0.6972656 0.2382813 0.7539063 + glyph i 0.3066406 0.6972656 0.3222656 0.7539063 + glyph j 0.40625 0.6972656 0.421875 0.7539063 + glyph k 0.5058594 0.6972656 0.5351563 0.7539063 + glyph l 0.6054688 0.6972656 0.6210938 0.7539063 + glyph m 0.7050781 0.6972656 0.75 0.7539063 + glyph n 0.8046875 0.6972656 0.8359375 0.7539063 + glyph o 0.9042969 0.6972656 0.9355469 0.7539063 + glyph p 0.0078125 0.796875 0.0390625 0.8535156 + glyph q 0.1074219 0.796875 0.1386719 0.8535156 + glyph r 0.2070313 0.796875 0.2285156 0.8535156 + glyph s 0.3066406 0.796875 0.3339844 0.8535156 + glyph t 0.40625 0.796875 0.4257813 0.8535156 + glyph u 0.5058594 0.796875 0.5371094 0.8535156 + glyph v 0.6054688 0.796875 0.6328125 0.8535156 + glyph w 0.7050781 0.796875 0.7460938 0.8535156 + glyph x 0.8046875 0.796875 0.8320313 0.8535156 + glyph y 0.9042969 0.796875 0.9316406 0.8535156 + glyph z 0.0078125 0.8964844 0.03515625 0.953125 + glyph { 0.1074219 0.8964844 0.1269531 0.953125 + glyph | 0.2070313 0.8964844 0.21875 0.953125 + glyph } 0.3066406 0.8964844 0.3261719 0.953125 + glyph ~ 0.40625 0.8964844 0.4355469 0.953125 +} diff --git a/clients/2011M/content/fonts/ArialBold-18pt.png b/clients/2011M/content/fonts/ArialBold-18pt.png new file mode 100644 index 0000000000000000000000000000000000000000..7d034df8c148271201227a36b20afae239f31336 GIT binary patch literal 19346 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 literal 0 HcmV?d00001 diff --git a/clients/2011M/content/fonts/ArialBold-48pt.fontdef b/clients/2011M/content/fonts/ArialBold-48pt.fontdef new file mode 100644 index 0000000..169f477 --- /dev/null +++ b/clients/2011M/content/fonts/ArialBold-48pt.fontdef @@ -0,0 +1,101 @@ +fonts/ArialBold-48pt +{ + type image + source fonts/ArialBold-48pt.png + + glyph u0032 0.1103516 0.3984375 0.1308594 0.4726563 + glyph ! 0.1103516 0 0.1298828 0.07421875 + glyph " 0.2099609 0 0.2421875 0.07421875 + glyph # 0.3095703 0 0.3505859 0.07421875 + glyph $ 0.4091797 0 0.4501953 0.07421875 + glyph % 0.5087891 0 0.5742188 0.07421875 + glyph & 0.6083984 0 0.6552734 0.07421875 + glyph ' 0.7080078 0 0.7275391 0.07421875 + glyph ( 0.8076172 0 0.8271484 0.07421875 + glyph ) 0.9072266 0 0.9267578 0.07421875 + glyph * 0.01074219 0.09960938 0.0390625 0.1738281 + glyph + 0.1103516 0.09960938 0.1494141 0.1738281 + glyph , 0.2099609 0.09960938 0.2304688 0.1738281 + glyph - 0.3095703 0.09960938 0.3359375 0.1738281 + glyph . 0.4091797 0.09960938 0.4296875 0.1738281 + glyph / 0.5087891 0.09960938 0.5351563 0.1738281 + glyph 0 0.6083984 0.09960938 0.6494141 0.1738281 + glyph 1 0.7080078 0.09960938 0.7490234 0.1738281 + glyph 2 0.8076172 0.09960938 0.8486328 0.1738281 + glyph 3 0.9072266 0.09960938 0.9482422 0.1738281 + glyph 4 0.01074219 0.1992188 0.05175781 0.2734375 + glyph 5 0.1103516 0.1992188 0.1513672 0.2734375 + glyph 6 0.2099609 0.1992188 0.2509766 0.2734375 + glyph 7 0.3095703 0.1992188 0.3505859 0.2734375 + glyph 8 0.4091797 0.1992188 0.4501953 0.2734375 + glyph 9 0.5087891 0.1992188 0.5498047 0.2734375 + glyph : 0.6083984 0.1992188 0.6289063 0.2734375 + glyph ; 0.7080078 0.1992188 0.7285156 0.2734375 + glyph < 0.8076172 0.1992188 0.8466797 0.2734375 + glyph = 0.9072266 0.1992188 0.9462891 0.2734375 + glyph > 0.01074219 0.2988281 0.04980469 0.3730469 + glyph ? 0.1103516 0.2988281 0.1474609 0.3730469 + glyph @ 0.2099609 0.2988281 0.2617188 0.3730469 + glyph A 0.3095703 0.2988281 0.3544922 0.3730469 + glyph B 0.4091797 0.2988281 0.4560547 0.3730469 + glyph C 0.5087891 0.2988281 0.5576172 0.3730469 + glyph D 0.6083984 0.2988281 0.6572266 0.3730469 + glyph E 0.7080078 0.2988281 0.7519531 0.3730469 + glyph F 0.8076172 0.2988281 0.8466797 0.3730469 + glyph G 0.9072266 0.2988281 0.9570313 0.3730469 + glyph H 0.01074219 0.3984375 0.05859375 0.4726563 + glyph I 0.1103516 0.3984375 0.1308594 0.4726563 + glyph J 0.2099609 0.3984375 0.2480469 0.4726563 + glyph K 0.3095703 0.3984375 0.3574219 0.4726563 + glyph L 0.4091797 0.3984375 0.4482422 0.4726563 + glyph M 0.5087891 0.3984375 0.5683594 0.4726563 + glyph N 0.6083984 0.3984375 0.65625 0.4726563 + glyph O 0.7080078 0.3984375 0.7578125 0.4726563 + glyph P 0.8076172 0.3984375 0.8515625 0.4726563 + glyph Q 0.9072266 0.3984375 0.9570313 0.4726563 + glyph R 0.01074219 0.4980469 0.05761719 0.5722656 + glyph S 0.1103516 0.4980469 0.1533203 0.5722656 + glyph T 0.2099609 0.4980469 0.2519531 0.5722656 + glyph U 0.3095703 0.4980469 0.3574219 0.5722656 + glyph V 0.4091797 0.4980469 0.4511719 0.5722656 + glyph W 0.5087891 0.4980469 0.5712891 0.5722656 + glyph X 0.6083984 0.4980469 0.6533203 0.5722656 + glyph Y 0.7080078 0.4980469 0.7509766 0.5722656 + glyph Z 0.8076172 0.4980469 0.8505859 0.5722656 + glyph [ 0.9072266 0.4980469 0.9306641 0.5722656 + glyph \ 0.01074219 0.5976563 0.03710938 0.671875 + glyph ] 0.1103516 0.5976563 0.1337891 0.671875 + glyph ^ 0.2099609 0.5976563 0.2490234 0.671875 + glyph _ 0.3095703 0.5976563 0.3417969 0.671875 + glyph ` 0.4091797 0.5976563 0.4287109 0.671875 + glyph a 0.5087891 0.5976563 0.546875 0.671875 + glyph b 0.6083984 0.5976563 0.6494141 0.671875 + glyph c 0.7080078 0.5976563 0.7460938 0.671875 + glyph d 0.8076172 0.5976563 0.8486328 0.671875 + glyph e 0.9072266 0.5976563 0.9462891 0.671875 + glyph f 0.01074219 0.6972656 0.03417969 0.7714844 + glyph g 0.1103516 0.6972656 0.1494141 0.7714844 + glyph h 0.2099609 0.6972656 0.2509766 0.7714844 + glyph i 0.3095703 0.6972656 0.3291016 0.7714844 + glyph j 0.4091797 0.6972656 0.4287109 0.7714844 + glyph k 0.5087891 0.6972656 0.546875 0.7714844 + glyph l 0.6083984 0.6972656 0.6279297 0.7714844 + glyph m 0.7080078 0.6972656 0.7675781 0.7714844 + glyph n 0.8076172 0.6972656 0.8486328 0.7714844 + glyph o 0.9072266 0.6972656 0.9462891 0.7714844 + glyph p 0.01074219 0.796875 0.05175781 0.8710938 + glyph q 0.1103516 0.796875 0.1513672 0.8710938 + glyph r 0.2099609 0.796875 0.2373047 0.8710938 + glyph s 0.3095703 0.796875 0.3457031 0.8710938 + glyph t 0.4091797 0.796875 0.4345703 0.8710938 + glyph u 0.5087891 0.796875 0.5498047 0.8710938 + glyph v 0.6083984 0.796875 0.6425781 0.8710938 + glyph w 0.7080078 0.796875 0.7617188 0.8710938 + glyph x 0.8076172 0.796875 0.8417969 0.8710938 + glyph y 0.9072266 0.796875 0.9414063 0.8710938 + glyph z 0.01074219 0.8964844 0.04492188 0.9707031 + glyph { 0.1103516 0.8964844 0.1337891 0.9707031 + glyph | 0.2099609 0.8964844 0.2246094 0.9707031 + glyph } 0.3095703 0.8964844 0.3330078 0.9707031 + glyph ~ 0.4091797 0.8964844 0.4482422 0.9707031 +} diff --git a/clients/2011M/content/fonts/ArialBold-48pt.png b/clients/2011M/content/fonts/ArialBold-48pt.png new file mode 100644 index 0000000000000000000000000000000000000000..63da42dd9bbf9a689bfa2615845b618a763cd8ad GIT binary patch literal 64156 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 WY7i!4SA&oTu^53E<~9(`48#CSb`wJY literal 0 HcmV?d00001 diff --git a/clients/2011M/content/fonts/CompositFullAtlasOverlayTexture.mesh b/clients/2011M/content/fonts/CompositFullAtlasOverlayTexture.mesh new file mode 100644 index 0000000000000000000000000000000000000000..eda1938ee1e7ead318251b6588e04784b80a636c GIT binary patch literal 193 zcmXR*Eh^5;&r>kcGce%dVNl^=VPIfj0%8#O&&p(Bes7->ga;xU>>+G8?SfqmNFJdE csK*7<9GE=BMC@wda$p7{kc7DnL^A_10R27}6951J literal 0 HcmV?d00001 diff --git a/clients/2011M/content/fonts/CompositLeftArmBase.mesh b/clients/2011M/content/fonts/CompositLeftArmBase.mesh new file mode 100644 index 0000000000000000000000000000000000000000..5bcc4ae6d87dc7ca22aed5707f415f0fbcaec6b8 GIT binary patch literal 28921 zcmeI4d6-ni)rXskAF7L^FF6e-`|{5b*gUN zJ2N$mA24R@kQ+xfZqu?=tGdOhrp42%r&4pOrBX%J>zD4XxxVwNdbgjGs`yvl@x9Mp z>F`GHnjQJ5SenM|Q|E*}|8`NCCKwXH-ML6IUvY8%zxQC0dpXIxCs{veLN#>PSe%A?+0J{CdpWMp?w*k3 zK236ep$W~Ydk^+am6h(U-o8udSuo^?YqI-lA89tHcLw*UIm2$tYWk-71vRW^R};#G z#^xeUNW=ZLt@YK}T>Z=Y$7-fL(<`g#C(ZsfI(XwEj@2-(kcPRintj#B_9w2-jLT~J zXk7IJ{XygA3e}l=$Ht*Q3(_0Cxj<7Hr(aOR^UKwQa-pfrm47bc=AAWW<1k;LTxe{6 zlFVt3@@}QO0&A7~)W$)xF|bzI$E=2VkJH#bQ|Gu`m74IHuR8Y7d{rHLlKO<=e3v=R z7v~DqFtk>=FDl0#u8*ss&T(<wuDq|1z*XYiI#-iqANzREyImGmTkq|w?!0fzYL z=+u2|#av`Hsg$R2`@`CJKSpD7Wi>ImtcLom3&e5P&nMD^*1WrZ82h5YeSya2LKEsU zxvYkDxHUc3TN~Uv^J~=3zT5QL+pu&?+Fu*9KYy>ofNBl1nlaL>3dG6P6e-R!FV{EQ zw^w|RPp+-$rJg1?PQ%ibfjGGu#x=={(|Oynik}rkxyn6_8)s~GTz;HfO;PFUqOM*X z_Nb%w9+|CAZ^c<%)XCGhamGpWY#@%SVNSQCH+pg0Ts;+Mb9%j}$&Et|{Wz{BS{r_S z$Yp=tf@V$81TPmFyM7pZdD@RtHP@P=QNcKmyiin8!*&6U8)sa$KZApDM)%w=8z<^> zzo5phXZk#>$k({Jh_kw=S1```&mUZoYjsgsP;+9BMit|l6VT-5YFIj;u3u+Y!}?iS z*B`s9VLc~_(>^dRH%^jVN!Bx(e7RWjTLb$Kdz4*=k!F@xXZ9AW;eIa<#Bs+J#hLEK z8MS>=PMn!(U*pG_=EbSCeSJloDA!a^Lmaoyi_&3@U8_-?DPEjYKVMxDC(=yzG%L2f zRiU9itJ1#49T%FF>3LopSCjNvur)p3i^H7S`;<7d0vb0L{aKV=;Kgw@#F?2V4)xiR zUg*W4KlWZG&Y*zC%|(A^reF5rxSAw!qW&!L;?N)aOd(F&w6Dp{#kiIR&_jiD+Egyg2m7y}xFpeT|!o{wzxG^y0W0`janC)Sum69Qxz#KLgXg#?3{4W~9IN z;<%b<-uE3R>d&`c9QQqnIIYvZCO216=~vbL?`4SNK2w$kG;W;e-KJBpKX(1l=dFSF zIyYCc_h9rhCyAzQdRE>z`87%3Tm0uK`@DVcjq2<_OTv3M{?K3mUMW3&eiyPChsJbnueuG_PWsbJFLUXIP8c1K8B{U zK4|>C1x;?9{reqF<$UG8Prpd5?eb~h+0A@i{CfZF_XWpSTP}_N?B>2mFB_iKe34q- zWp5yktJ#&!<*#SnjqUGBqFi%=Yu@JCrCh0uAIHrVjq3w14$m+9JD20K;|f1_Y_6Tz zTz(uk*N*JCzV&i37q7l{bGANBmFvrxz0T&^p z)eO$~W3Q@75~n2NkE?2&B)RgfXU3H;SF~>|_0}qTlwF6BW|^m9Z?PKomhKrpjytYs z-v~cbY#jEDl8mo$<3wv?h1Vaxzp!y4P59YlHRNiP32W?HjpD5Fa`C-`jT33sdK#W_ zRzt2-#@D#xqK2u=%U&E;ljKB#*5?jC#hy|W<}mONi?%E%ksv_r-|yb)QjW3w?rEMd5Xrq_eOhy z|BORp-vJ`cykIW-p2<4=KAsm*F8^7;_uY1Hi8SH;Iaf2;>oe~pl^WiA^Y3+=^6Yi= zXGP$5cC6>h`k?9O^#_fub9A5j_d6OpUrFxMxU;Fmu|FT%*O^KC^MtswyQ~dY6FQTO z#^#DUGszhSd(M+wp>vg0HKAPYS%@TOT;uBFp1X)UFY4w>(&v5E*`7~Ga>kWhq4TuV z*{xydtTh^&D{fqzlW{enIPMvkr020i^F=P(=OpK!lbkn>tFwDnByQf_vm(?d$=E}4 zL4EAFlGY~_=ex{lzBoz79(T^1`q*(LnXkAw++Q|MTz}kq5KX?nJxMa}N!Cx?S#;Kq z?Q@)lebs7`+{k8-9+XtWB_N-%) zbDo9s>i*w5unz56;=+0L{PhW)Tjrg_)-djG2hg}{HD8>#^Wp3Xm2nE^)vKPl<@r@P z7lrfcRqMmMja@(djl*$;E;Gsk=Gpt0`&aW!<`)eGmVjn0Z}^zKuhmG&HC;k^3bV14X4w8DAy30{5p8MQr=ljICJntW&DldR_? zxmfds^Xj?JZg;+-`uM-sE1Xxa{9CHRdG*}&!@IHlxq5VN+5i2HyT;J0OfTQ(zQK9O z!g=-FI=eND&Mk+3KWO*f==tuS(<_`;kM8Bdd3FDMX6_m*oL8^MB}&Y364RXDGnJ70zK z>h|xOI8VFKTdO>G3g^{Rsp!1l++cm|Gv)g_e;A!x_J8N%?i*-Q8UKu;tD!%I^Xj?x zd)4|B&a3Cvhv&Qd_aKGy>VAFfdw7y_u+h2PPTsyjo$a}%!g=-lXWH|fMd$o{K271g zdf~i!#ebciD(~n%3;10B&3a1z-Fm79j{ecEDbgY%YKhvSj;L#V+C`#R)D!iMPkTSH zzi43E*aJjEaiBQJw6O<^L&TxtFwsaHE{+gKilfBQqOmweG!e&&rs6npyl5txixb3& zqJ=m~oGe<3Q;bi$m1r&6h_<3coGMN;KJ9j*y*OQ*VSL(WinGMorj6|&_+#Hrg8!hN zHny|qB1*-%;yiJ_=qfG{7mAC-#o`jtO>`G!;!<&$xLjNzdWb7UPti;C7JWot$nq`1-ev`2~2VvHCo z#)+H6cyY6sAZ`)2ird8P;tp}AxJ#6ayN#VFdyl|QGHvX=;yz>VH*M@>@qn@9plxG4 zs5Y_q`iDfhz@H+B#n(S9xQ_pb;OmL=sNg#ORPmU2Ts&dyG}$M`Q{rhcUGNz`pYz!d z1fOGPh?&Mx7uvG~wR=X)HvSJ~=NSJ-vdPvS7}BBYtcA-^ng9{wuPt8vpmQOO5}U z>>rH(N7-e@|C1~=eqFF8sK=iLYlXVtFBjAe{|#a5_@>%V8UHO=I|nP&W`6MB7IvQg zqBb>NDOjV_d6l5{Sgz5g&VLnij73MAI?7_xA zMD|dzK`{@LZDjnzWsflak+Me_|7h99#y>{3iSdt>ZEF1EWRDljSu@$@#y>&!MB}%R zJ<0ed%eFNBDYC7M-&(ef@!QH$;}Tic1ob#oZPp5P!9Puwy5YAIwvO%9rpEZE3p)pA zsLj0KpDFA-ouxK4K3kSGN}W3hYLDd_ZR*@nPPYM z(b1;<7YgPCi;gyPz_p9S#o`jtO>{Rt?J{wxxJ+Cwt`I%MmBy#tQ}hzOMIYnS?klbm zSDQBW8gZ@YC;FQ<_BwIBxIqjM1H~XQSPT(E#V|2kj1VKmjbfA-EyjqkVw|{1j2AbH z3E~!UtGLbhv~L%8h&#nyqFmf9CK{jiJz|o$SKMcO+V_je;sMjfJ}4d%Q^dojjeSHs zDyE9Z#N*-#F-<%vo)S-s>EZ`shL|a4iD$%Y@k233{75`2ek|sSpNOA|pBbO_Jn@|P zxp?0AwC9T##4p4zjZb@l_?7szc+vQ@7m7t85-Y^p#{NZirNFK-ZR}sgYGeOq+SoPX@5YjYwvF|U z+Qj1P-xcJ+Un_{k*S{yYj=xUu^~8B!a2@{x@uB#K_@}Y!WjBbA#K&Tz;4^$a=d(`) zpJP82n~bF{v^NWCw?%9<{%5k=jQ_dpcH{4m-D&(UWOo_=OWEDV|4Q~>f;srN_}cjY zk^RQ_|CRmL`2UmLWBk3ceA9+sO}4tguOVs*<}59nF@7!C+QzRVTi5tSvc<-)CtKh6 z`^oNa{06er_yAef1oddBHfx2t;2$WTy5S$BwyopAYExtUL)5l&aH!hM5B_0l+j(lF zHZ?w6mNiP9k5HT1W4T6~Iv**Y+GEktrp`ynr}kKMw5c`Mj@D{FU zMMs-C;Mxh|MA1T=Bu*AB#VMkdXf4`^wxUFwDozvaM0;_%I76Ii>{+sB3v36|#) zj6KJ+v7JR1W643=#wt~tSbY7tf;{-=31ac}=L@dmcNKg+aV`*C$G=cqBrX=07~4&@ zyC@TvipvC_;qy74T`u?>dxhv>EOnuMrJ!~_MK9y`mhEHwzOq*t|7zK5jDM|cKjZh8 zz0Ua8%ibWEg8^co@dwEcHvSOVp~fF3JKXpqWJenRM%huuA1ymZFlS@MIOE?WJKp#= z%T6%s%vs67@PZR$KlP2PgQUL literal 0 HcmV?d00001 diff --git a/clients/2011M/content/fonts/CompositLeftLegBase.mesh b/clients/2011M/content/fonts/CompositLeftLegBase.mesh new file mode 100644 index 0000000000000000000000000000000000000000..f4712ce00d06d904a781d9d7e687704c0ffef0ea GIT binary patch literal 28921 zcmeI4d6ZPuwTG+0Dv@r*c^(ia1RTH#5V4g~P*HF~oN+)wfyNP>0TEGgMkNsy3`sPi zA(0p&XfP5-k{G98RBVkA6OryDYKTF7zpw8(U8icFO5MEWA8)N!uJx^bcHLj^bM8LF zy+!Z#(%~0gG_qk##~!=yxo7*j%#L+4+GH}bYBHI|HG}d`)-?8OoPFg%nb!X%9Qf8J zPxW2d{nP{bDA6o7nzNcd4>S$=MKy8FRd;rBanQv3@|yQGo`p3NOkYQJp4{3OnoHZ( z8_g447X_Mz{N-gdg}xf{PnYS-Ys%gG)Dx)d%70)4k zc}=;#`n|Yu&{sT%T}Mm`G!6NuBKMA_&==#e_eEb`Lw??!&?aBHe(DEZ)Y?~zCX+Fm za6FA`8uH7_XnbGqp()ds*N~rgBXLUCPi)PXuAkUiMN{Z2K4$s~HO<*MW^J%{=C*Cu zvM-)rGcMnhwRyh()3^E#ui2%3 z^+qI4v8Ey4oSkgq9K3Q#-xp6@E9h&2(S&h6Xt^&Nr&yyr*A6goIHR`xW}DW&mevxY`Ntx0Le2XvIsDMX3Hy3ZV_ubQG@9Z#zDnby>8sLu zW`9-ci#6XIIe$2#{5niDGfkd3TfByIY)T|fcwb4J879uyRV#|(%+6YkjWgZES$kDu zYn-I7+l+=d;g}a@;~KwKlQ`2%oP9ohwKYznnQAmkSH9e;AwO?sttPxLG;d@dGI2sp znrA^Wp1CFtbL#ggaURTCP1qOXS(u$?;)ELF%&riJ@ib-Un>dW8u$RZ>M@KYaUz{7W zvkOd|P{W$96o)gaDZ9wTVLbksLY!U^P1slR%v~If6FzgNRCwkl^ZtT~6ZVznxtxq= zsfokB@Z)K0$)VMReesN2n0>{>2{mcrB*&9L5u#Kcli%6ZXY;W@lHMIH88|REm>~XN`#y zzDFhVZZ*YyHRM;fvEOBg6FyU(jc7{a#NJnl(W)&BO`EL!304 z(b?%0U` zXbSVi`TU>v>58ugePwetPS_XswXDqdT;CTtTvg_KuJ7w(_0^$nycu)Y z*GDb$W%I**`5Y!1`~4k_Uq2a*XGqS*v3=R+J8^a&JG>=_#Oa;08XLzxyNT0j%aJW{ zk}=2km(LG1)O4u|Z$)efrX77q{M5E@w5xef7`J$=N)YYR2U3y_agz z#Oa;0_f;AvO<$GPGi$z5U&&rxY}P7glwXI5W{J^ows;Na*zq|VC%msDPW+h?#_652 z8XIS+84uqte4M1OSB!=@Uc;C>=HeQ^R+Bidn>c)T@Np8&GNa)c=QZ?|%UMl$Uz{zu z+yWCP)TDnF%r|kEQ@>9+qk846ChUvxbj-~&aY7AodRK^(Je%g4IE=^dW#Wv*-V-Hf?- zJn1xJa!V`5Nuzl%x1?g6${O;s*u=5#E%tee#=rL_d)YqY(D-+NMDtLzFaMs&`uR4V z7fE0CS-|&hf3_r=`1xF{nQF$&J4r#4?yUPX@_nattuBlF&JK;wPqKIH*@DLBInmht zj;1hQmG|k+nW6ay)@eMrv>t#se(#_ec53FJn8xR4<~LX7>mwT0MyRd1J|_ z&H9nP(1d+8XPeDjgmo8;c|rEWsHPC7Pkw$xLmfz{SsCdotV=0(U*TM!iNy(PX_&8a z8b6*ib6P*KOLX3;@$hlb#QLJf!)wT4IZa`{x|Qv#phxoR(^0ISkLS?rqxTAIsSDnR)lWQbJ7<1mooO8XJ5R#%PuX?0^+36#QGwRuMOkgV{w@GLSOOx zpee+O-&b*8mB;*_^6dLU)49ezFPIBIX6B+>L_?lKO}Y86{Gf@& z`ETbm&DuzF@61JP?}T%aX1>bB`S15&<-MF{-qWlfG_kn|*H}4C@jgwnm&>2Mg|!+# zf5Ls5W`C7Cd&51L)MGcA_i*mZKXc2~Y_nDins}`>8h>B>{xnttOkZ9@y>Yc(z4&hj z!n3zpuO6?B57$q%UcGqzRO{7~nt$p^D%JNUH5DI5&qH6wNDWo2euIC9EYw|8>(yib z9_8~>tydpv)>ycHSgX}~_2P3Z%uiBdW`FlrtylMd-$Y%m{T(##V`05$wO+k=jgcRJ z&VO6=he_SC{ryh3o~!lh@!#wD=S8(%-M*8A>nC|{S!tdre7CCBt7kGver(Mo`SE}E zSFKl%*RJ?I$a$Ei7CnuoQZ0IN_Rcixxpd8^`#Zb%@4E~2&pa#Rzc=^yo~)k*W;{GE zd_DHJ^}MLotFJbBW}g=3t6HyK`rWEpub%vU0ktdDdiCOWTK0~wOR3hYe`d}Wo+&;* z)S*@D)r;3pn4hGU&(_XW>(%}FLoMHYv&MK&sMf1zGD*GPoM?Wk_3D`nHMiAz_44OW zvVJC*^}{pH*D;dAYQ1`K4#`h={#5JLZGQavsn)Aks%fv*tCxQN;vLDapX7}C|5>k2 zU1hm?Y+tXACRRrsp5f){mU)lzc`jG~jHb|6wO+k+tx}8S>vounay7SwTG?v7dT9>B z`rb6P#Asr*yVRH!=Av4!UYcjlghGD0MQfzd6xM3xJXh=0ZM|{0o~!lh)q3^T|8;RD z`F|Jt`nqbpy8YXVutqvfy>XhlLoy*lTT z{x|Cx{qNQ@ZE^G;?X^T!x%V62j|mXUu+;Y6dO68_Qqlp zv8mY1`Ls6|TZk>iR$^>jR--BWaTmOg0vSUuDx7C*n2pdb9b1+n<~eFWF>_Z9p+arP5j$L}e6iQZy=XZy$= zAo>dafU92c89tx$*+HV-*@I>K2`qV`ofqWp5OJvU`^ye+{$a9*JO2pTfzCft_9*8M zk{#^)qh*f~%)znZIOiWPJH+`X$PRV>iLxg-|76)yoPVn9Y0f`gc9>w!&JbscVd5-t zw!j}Q&T;;^vLl>7QuaLOpD#Pg`J-jY@fgubkdFqzS|Km^V+Hxczd+Or{0l{2Q7VA0Vg=hq140gH|{dFR>$v7?wM*fZpNk{ISJ*JzXfYsJ~l zqN7dzCky5Ti;gyPz_shd6mh+nDsB)rikrkVakIEZ+$wGpw~IT(onpGUOWZB)adw96 zcLesku8qA{%yjlX*T&v29&naEX!}^R)Fu``KU>fb{)2*8{QUO>*YW2Fex5kr7hK2x zf%u_#NIdN9k7OSabH$_LF~Mi}e9mV-7JQDKCw}5Ad7=GNLGB(G^PT@Q*(aR;bJ+#X z|Ap+6&R;0I$oWsnKJENp$}Sen!877lVzGEuED`v>7SB2VdD$17|DxipMaUw8f+vTr*753grn+RP9BpM;;M57j2ee-^A!^8Aq?_gJpcCeJGbxyPcTO`bm% za*a0m|C@N#S#-3?|KA03f<;H0IpEqq#Ao7j@rC%O^J%XZ{}Nw{e~UHZEAh4S zX@4VlnWzzM1U~JyVl9z%ZEQ}gE!v57TpQb7)QUQ>u2@fW5bKK##D-!cv9Z`hY$`Sr zn~N>PmSQWhwb({%E4C9I#rC3;*unXNYVt_bI94?L! z1I3ZzC^5+Sv-dw!bz+LR-r1?LH;5a> zO=6nhGkiYhvzrB>mOXp{4o1@nMKN1MEJZK)vlzY**i^8Z`GoM5>|oBaPy%ySkU zZSwz$U{0{;Xfp>~`@MKoye3{3Z-_U=AH*{8miVK1Tf8IQ70bnYqEWmrJ`jI$_Cwh} z3+zX(ja?x=cJ?o>js2_m#98{F?PIM}n^^q(r-FX)R|#VA^G$;5_|1Z!C(hpl*YW=@ z{vkdSpF8`7>_5e7@h|bE;4^$a=d*tcKF6*RUpY%&Xn!rp-8UlBCh==z+X(!&VlC%q zWpmD7Teh9^*O6`S{94&M!5pkByPoqq$gc1F4P-ZT{zkGJJAV_|O`X4)?B>qjLUv2R zoNXn$wez=;-PZZr$#!)9_OhLvzk}?K&fiIPXXo!COO89svL?vKu4=PZ$P0cK`Q#11 ztJ*$~-P9(>_`9j?=U{iWnIHT;)b{hVr`qJWyDV#zy!H^}9?Lb_wymivi*=ak%qo zA0Y;cBgIk9r#(mv7Du}__84)jI8Gez+SnoD1Tj>cC{7Y5i&Mm@;xuu(7$(jTXNt4L z*_wvalRNOMvF0`!TGeuiVMVr;v#XexI|p)eA?s0cyXDy-1)Sx5Lb$; zTpN3}xJFD66I~lSNn9%?i|fP`alM!-ZV)$$o5VD6v$#dvDsB_Ei#x=fV!F6X+%4`A F{{wbQzaRhr literal 0 HcmV?d00001 diff --git a/clients/2011M/content/fonts/CompositPantsTemplate.mesh b/clients/2011M/content/fonts/CompositPantsTemplate.mesh new file mode 100644 index 0000000000000000000000000000000000000000..756ee03446183506643b081178378be97d1c4656 GIT binary patch literal 43201 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 z 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 bOmUOAS==IKiCe{O;&w4x+#&81cZq)k6`7@+ literal 0 HcmV?d00001 diff --git a/clients/2011M/content/fonts/CompositShirtTemplate.mesh b/clients/2011M/content/fonts/CompositShirtTemplate.mesh new file mode 100644 index 0000000000000000000000000000000000000000..75487e14fe6f66ac64dc469c275d0815baffc605 GIT binary patch literal 43201 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 literal 0 HcmV?d00001 diff --git a/clients/2011M/content/fonts/CompositTShirt.mesh b/clients/2011M/content/fonts/CompositTShirt.mesh new file mode 100644 index 0000000000000000000000000000000000000000..b39b8aceaf9dd24650b5393f6f806148c5ff617c GIT binary patch literal 193 zcmXR*Eh^5;&r>kcGce%dVNl^=VPIfj0^$=l{yS=ayYJkzZ@v?d3k41K5C(+40ah~~ oiyDwTM2+-sd1sw(xYR&QlK`v1Wf#nD1_nkT6XZ5#s1S$^0Jyj$0ssI2 literal 0 HcmV?d00001 diff --git a/clients/2011M/content/fonts/CompositTorsoBase.mesh b/clients/2011M/content/fonts/CompositTorsoBase.mesh new file mode 100644 index 0000000000000000000000000000000000000000..0388bdee221c0394966c2634630d427a0a155e2d GIT binary patch literal 28921 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 literal 0 HcmV?d00001 diff --git a/clients/2011M/content/fonts/Legacy-18pt.fontdef b/clients/2011M/content/fonts/Legacy-18pt.fontdef new file mode 100644 index 0000000..525fa41 --- /dev/null +++ b/clients/2011M/content/fonts/Legacy-18pt.fontdef @@ -0,0 +1,103 @@ +fonts/Legacy-18pt +{ + type image + source fonts/Legacy-18pt.png + + glyph u0032 0.1074219 0.3984375 0.1210938 0.4511719 + glyph ! 0.1074219 0 0.1210938 0.05273438 + glyph " 0.2070313 0 0.2246094 0.05273438 + glyph # 0.3066406 0 0.3339844 0.05273438 + glyph $ 0.40625 0 0.4335938 0.05273438 + glyph % 0.5058594 0 0.5488281 0.05273438 + glyph & 0.6054688 0 0.6386719 0.05273438 + glyph ' 0.7050781 0 0.7148438 0.05273438 + glyph ( 0.8046875 0 0.8222656 0.05273438 + glyph ) 0.9042969 0 0.921875 0.05273438 + glyph * 0.0078125 0.09960938 0.02734375 0.1523438 + glyph + 0.1074219 0.09960938 0.1367188 0.1523438 + glyph , 0.2070313 0.09960938 0.2207031 0.1523438 + glyph - 0.3066406 0.09960938 0.3242188 0.1523438 + glyph . 0.40625 0.09960938 0.4199219 0.1523438 + glyph / 0.5058594 0.09960938 0.5195313 0.1523438 + glyph 0 0.6054688 0.09960938 0.6328125 0.1523438 + glyph 1 0.7050781 0.09960938 0.7324219 0.1523438 + glyph 2 0.8046875 0.09960938 0.8320313 0.1523438 + glyph 3 0.9042969 0.09960938 0.9316406 0.1523438 + glyph 4 0.0078125 0.1992188 0.03515625 0.2519531 + glyph 5 0.1074219 0.1992188 0.1347656 0.2519531 + glyph 6 0.2070313 0.1992188 0.234375 0.2519531 + glyph 7 0.3066406 0.1992188 0.3339844 0.2519531 + glyph 8 0.40625 0.1992188 0.4335938 0.2519531 + glyph 9 0.5058594 0.1992188 0.5332031 0.2519531 + glyph : 0.6054688 0.1992188 0.6191406 0.2519531 + glyph ; 0.7050781 0.1992188 0.71875 0.2519531 + glyph < 0.8046875 0.1992188 0.8339844 0.2519531 + glyph = 0.9042969 0.1992188 0.9335938 0.2519531 + glyph > 0.0078125 0.2988281 0.03710938 0.3515625 + glyph ? 0.1074219 0.2988281 0.1347656 0.3515625 + glyph @ 0.2070313 0.2988281 0.2578125 0.3515625 + glyph A 0.3066406 0.2988281 0.3398438 0.3515625 + glyph B 0.40625 0.2988281 0.4394531 0.3515625 + glyph C 0.5058594 0.2988281 0.5410156 0.3515625 + glyph D 0.6054688 0.2988281 0.640625 0.3515625 + glyph E 0.7050781 0.2988281 0.7382813 0.3515625 + glyph F 0.8046875 0.2988281 0.8359375 0.3515625 + glyph G 0.9042969 0.2988281 0.9433594 0.3515625 + glyph H 0.0078125 0.3984375 0.04296875 0.4511719 + glyph I 0.1074219 0.3984375 0.1210938 0.4511719 + glyph J 0.2070313 0.3984375 0.2324219 0.4511719 + glyph K 0.3066406 0.3984375 0.3398438 0.4511719 + glyph L 0.40625 0.3984375 0.4335938 0.4511719 + glyph M 0.5058594 0.3984375 0.546875 0.4511719 + glyph N 0.6054688 0.3984375 0.640625 0.4511719 + glyph O 0.7050781 0.3984375 0.7441406 0.4511719 + glyph P 0.8046875 0.3984375 0.8378906 0.4511719 + glyph Q 0.9042969 0.3984375 0.9433594 0.4511719 + glyph R 0.0078125 0.4980469 0.04296875 0.5507813 + glyph S 0.1074219 0.4980469 0.140625 0.5507813 + glyph T 0.2070313 0.4980469 0.2382813 0.5507813 + glyph U 0.3066406 0.4980469 0.3417969 0.5507813 + glyph V 0.40625 0.4980469 0.4394531 0.5507813 + glyph W 0.5058594 0.4980469 0.5527344 0.5507813 + glyph X 0.6054688 0.4980469 0.6386719 0.5507813 + glyph Y 0.7050781 0.4980469 0.7382813 0.5507813 + glyph Z 0.8046875 0.4980469 0.8359375 0.5507813 + glyph [ 0.9042969 0.4980469 0.9179688 0.5507813 + glyph \ 0.0078125 0.5976563 0.02148438 0.6503906 + glyph ] 0.1074219 0.5976563 0.1210938 0.6503906 + glyph ^ 0.2070313 0.5976563 0.2304688 0.6503906 + glyph _ 0.3066406 0.5976563 0.3339844 0.6503906 + glyph ` 0.40625 0.5976563 0.4238281 0.6503906 + glyph a 0.5058594 0.5976563 0.5332031 0.6503906 + glyph b 0.6054688 0.5976563 0.6328125 0.6503906 + glyph c 0.7050781 0.5976563 0.7304688 0.6503906 + glyph d 0.8046875 0.5976563 0.8320313 0.6503906 + glyph e 0.9042969 0.5976563 0.9316406 0.6503906 + glyph f 0.0078125 0.6972656 0.02148438 0.75 + glyph g 0.1074219 0.6972656 0.1347656 0.75 + glyph h 0.2070313 0.6972656 0.234375 0.75 + glyph i 0.3066406 0.6972656 0.3183594 0.75 + glyph j 0.40625 0.6972656 0.4179688 0.75 + glyph k 0.5058594 0.6972656 0.53125 0.75 + glyph l 0.6054688 0.6972656 0.6171875 0.75 + glyph m 0.7050781 0.6972656 0.7460938 0.75 + glyph n 0.8046875 0.6972656 0.8320313 0.75 + glyph o 0.9042969 0.6972656 0.9316406 0.75 + glyph p 0.0078125 0.796875 0.03515625 0.8496094 + glyph q 0.1074219 0.796875 0.1347656 0.8496094 + glyph r 0.2070313 0.796875 0.2246094 0.8496094 + glyph s 0.3066406 0.796875 0.3320313 0.8496094 + glyph t 0.40625 0.796875 0.4199219 0.8496094 + glyph u 0.5058594 0.796875 0.5332031 0.8496094 + glyph v 0.6054688 0.796875 0.6308594 0.8496094 + glyph w 0.7050781 0.796875 0.7402344 0.8496094 + glyph x 0.8046875 0.796875 0.8300781 0.8496094 + glyph y 0.9042969 0.796875 0.9296875 0.8496094 + glyph z 0.0078125 0.8964844 0.03320313 0.9492188 + glyph { 0.1074219 0.8964844 0.125 0.9492188 + glyph | 0.2070313 0.8964844 0.2207031 0.9492188 + glyph } 0.3066406 0.8964844 0.3242188 0.9492188 + glyph ~ 0.40625 0.8964844 0.4355469 0.9492188 +} + 0.4296875 0.9511719 +} diff --git a/clients/2011M/content/fonts/Legacy-18pt.png b/clients/2011M/content/fonts/Legacy-18pt.png new file mode 100644 index 0000000000000000000000000000000000000000..c58b76f5ff921346f8cbe222ac8b15c2af3825e2 GIT binary patch literal 19379 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 0.01464844 0.2988281 0.06445313 0.3916016 + glyph ? 0.1142578 0.2988281 0.1611328 0.3916016 + glyph @ 0.2138672 0.2988281 0.2998047 0.3916016 + glyph A 0.3134766 0.2988281 0.3701172 0.3916016 + glyph B 0.4130859 0.2988281 0.4697266 0.3916016 + glyph C 0.5126953 0.2988281 0.5742188 0.3916016 + glyph D 0.6123047 0.2988281 0.6738281 0.3916016 + glyph E 0.7119141 0.2988281 0.7685547 0.3916016 + glyph F 0.8115234 0.2988281 0.8632813 0.3916016 + glyph G 0.9111328 0.2988281 0.9775391 0.3916016 + glyph H 0.01464844 0.3984375 0.07617188 0.4912109 + glyph I 0.1142578 0.3984375 0.1376953 0.4912109 + glyph J 0.2138672 0.3984375 0.2558594 0.4912109 + glyph K 0.3134766 0.3984375 0.3701172 0.4912109 + glyph L 0.4130859 0.3984375 0.4599609 0.4912109 + glyph M 0.5126953 0.3984375 0.5839844 0.4912109 + glyph N 0.6123047 0.3984375 0.6738281 0.4912109 + glyph O 0.7119141 0.3984375 0.7783203 0.4912109 + glyph P 0.8115234 0.3984375 0.8681641 0.4912109 + glyph Q 0.9111328 0.3984375 0.9775391 0.4912109 + glyph R 0.01464844 0.4980469 0.07617188 0.5908203 + glyph S 0.1142578 0.4980469 0.1708984 0.5908203 + glyph T 0.2138672 0.4980469 0.265625 0.5908203 + glyph U 0.3134766 0.4980469 0.375 0.5908203 + glyph V 0.4130859 0.4980469 0.4697266 0.5908203 + glyph W 0.5126953 0.4980469 0.5927734 0.5908203 + glyph X 0.6123047 0.4980469 0.6689453 0.5908203 + glyph Y 0.7119141 0.4980469 0.7685547 0.5908203 + glyph Z 0.8115234 0.4980469 0.8632813 0.5908203 + glyph [ 0.9111328 0.4980469 0.9345703 0.5908203 + glyph \ 0.01464844 0.5976563 0.03808594 0.6904297 + glyph ] 0.1142578 0.5976563 0.1376953 0.6904297 + glyph ^ 0.2138672 0.5976563 0.2539063 0.6904297 + glyph _ 0.3134766 0.5976563 0.3603516 0.6904297 + glyph ` 0.4130859 0.5976563 0.4414063 0.6904297 + glyph a 0.5126953 0.5976563 0.5595703 0.6904297 + glyph b 0.6123047 0.5976563 0.6591797 0.6904297 + glyph c 0.7119141 0.5976563 0.7539063 0.6904297 + glyph d 0.8115234 0.5976563 0.8583984 0.6904297 + glyph e 0.9111328 0.5976563 0.9580078 0.6904297 + glyph f 0.01464844 0.6972656 0.03808594 0.7900391 + glyph g 0.1142578 0.6972656 0.1611328 0.7900391 + glyph h 0.2138672 0.6972656 0.2607422 0.7900391 + glyph i 0.3134766 0.6972656 0.3320313 0.7900391 + glyph j 0.4130859 0.6972656 0.4316406 0.7900391 + glyph k 0.5126953 0.6972656 0.5546875 0.7900391 + glyph l 0.6123047 0.6972656 0.6308594 0.7900391 + glyph m 0.7119141 0.6972656 0.7832031 0.7900391 + glyph n 0.8115234 0.6972656 0.8583984 0.7900391 + glyph o 0.9111328 0.6972656 0.9580078 0.7900391 + glyph p 0.01464844 0.796875 0.06152344 0.8896484 + glyph q 0.1142578 0.796875 0.1611328 0.8896484 + glyph r 0.2138672 0.796875 0.2421875 0.8896484 + glyph s 0.3134766 0.796875 0.3554688 0.8896484 + glyph t 0.4130859 0.796875 0.4365234 0.8896484 + glyph u 0.5126953 0.796875 0.5595703 0.8896484 + glyph v 0.6123047 0.796875 0.6542969 0.8896484 + glyph w 0.7119141 0.796875 0.7734375 0.8896484 + glyph x 0.8115234 0.796875 0.8535156 0.8896484 + glyph y 0.9111328 0.796875 0.953125 0.8896484 + glyph z 0.01464844 0.8964844 0.05664063 0.9892578 + glyph { 0.1142578 0.8964844 0.1425781 0.9892578 + glyph | 0.2138672 0.8964844 0.2353516 0.9892578 + glyph } 0.3134766 0.8964844 0.3417969 0.9892578 + glyph ~ 0.4130859 0.8964844 0.4628906 0.9892578 +} diff --git a/clients/2011M/content/fonts/Legacy-64pt.png b/clients/2011M/content/fonts/Legacy-64pt.png new file mode 100644 index 0000000000000000000000000000000000000000..bb340e8796382e54feedc33d391f7236f5ff7f17 GIT binary patch literal 88533 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 literal 0 HcmV?d00001 diff --git a/clients/2011M/content/fonts/Rocket.rbxm b/clients/2011M/content/fonts/Rocket.rbxm new file mode 100644 index 0000000..72beea5 --- /dev/null +++ b/clients/2011M/content/fonts/Rocket.rbxm @@ -0,0 +1,102 @@ + + null + nil + + + false + -0.5 + 0.5 + 3 + 0 + -0.5 + 0.5 + 3 + 0 + 23 + + -0.5 + 0.5 + 0 + -1.1920929e-007 + 1.00000012 + 0 + 1.00000012 + -1.1920929e-007 + 0 + 0 + 0 + -1.00000024 + + true + true + 0 + true + true + 0.5 + 0 + 0.300000012 + -0.5 + 0.5 + 3 + 0 + -0.5 + 0.5 + 3 + 0 + false + Rocket + 0 + -0.5 + 0.5 + 3 + 0 + + 0 + 0 + 0 + + -0.5 + 0.5 + 3 + 0 + 0 + + 0 + 0 + 0 + + 1 + + 1 + 1 + 4 + + + + + true + Swoosh + 0 + false + rbxasset://sounds\Rocket whoosh 01.wav + 0.699999988 + + + + + false + Explosion + 0 + true + rbxasset://sounds\collide.wav + 1 + + + + + Script + r = game:service("RunService") shaft = script.Parent position = Vector3.new(0,0,0) function fly() direction = shaft.CFrame.lookVector position = position + direction error = position - shaft.Position shaft.Velocity = 7*error end function blow() swoosh:Stop() explosion = Instance.new("Explosion") explosion.Position = shaft.Position explosion.Parent = game.Workspace connection:disconnect() shaft:remove() end t, s = r.Stepped:wait() swoosh = script.Parent.Swoosh swoosh:Play() position = shaft.Position d = t + 10.0 - s connection = shaft.Touched:connect(blow) while t < d do fly() t = r.Stepped:wait() end script.Parent.Explosion.PlayOnRemove = false swoosh:Stop() shaft:remove() + + + + \ No newline at end of file diff --git a/clients/2011M/content/fonts/SlingshotPellet.rbxm b/clients/2011M/content/fonts/SlingshotPellet.rbxm new file mode 100644 index 0000000..d753b0a --- /dev/null +++ b/clients/2011M/content/fonts/SlingshotPellet.rbxm @@ -0,0 +1,82 @@ + + null + nil + + + false + -0.5 + 0.5 + 0 + 0 + -0.5 + 0.5 + 4 + 0 + 194 + + 0 + 6.4000001 + -8 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + true + true + 0 + true + true + 0.5 + 0 + 0.300000012 + -0.5 + 0.5 + 0 + 0 + -0.5 + 0.5 + 0 + 0 + false + Pellet + 0 + -0.5 + 0.5 + 0 + 0 + + 0 + 0 + 0 + + -0.5 + 0.5 + 3 + 0 + 0 + + 0 + 0 + 0 + + 0 + + 2 + 2 + 2 + + + + + Script + pellet = script.Parent damage = 8 function onTouched(hit) humanoid = hit.Parent:findFirstChild("Humanoid") if humanoid~=nil then humanoid.Health = humanoid.Health - damage connection:disconnect() else damage = damage / 2 if damage < 0.1 then connection:disconnect() end end end connection = pellet.Touched:connect(onTouched) r = game:service("RunService") t, s = r.Stepped:wait() d = t + 1.0 - s while t < d do t = r.Stepped:wait() end pellet.Parent = nil + + + + \ No newline at end of file diff --git a/clients/2011M/content/fonts/character.rbxm b/clients/2011M/content/fonts/character.rbxm new file mode 100644 index 0000000..7bf4b8a --- /dev/null +++ b/clients/2011M/content/fonts/character.rbxm @@ -0,0 +1,527 @@ + + null + nil + + + 7 + true + + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + + erik.cassel + RBX1 + true + + + + false + -0.5 + 0.5 + 0 + 0 + -0.5 + 0.5 + 4 + 0 + 24 + + 0 + 4.5 + 25.5 + -1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + -1 + + true + 0 + true + false + 0.5 + 0 + 0.300000012 + -0.5 + 0.5 + 0 + 0 + -0.5 + 0.5 + 0 + 0 + true + Head + 0 + -0.5 + 0.5 + 0 + 0 + + 0 + 0 + 0 + + -0.5 + 0.5 + 0 + 0 + 0 + + 0 + 0 + 0 + + true + 1 + + 2 + 1 + 1 + + + + + + 0 + Mesh + + 1.25 + 1.25 + 1.25 + + + + 1 + 1 + 1 + + true + + + + + 5 + face + 20 + 0 + rbxasset://textures/face.png + true + + + + + + false + -0.5 + 0.5 + 0 + 0 + -0.5 + 0.5 + 4 + 0 + 23 + + 0 + 3 + 25.5 + -1 + 0 + -0 + -0 + 1 + -0 + -0 + 0 + -1 + + true + 0 + true + false + 0.5 + 0 + 0.300000012 + -0.5 + 0.5 + 0 + 0 + 0 + 0 + 2 + 0 + true + Torso + 0 + 0 + 0 + 2 + 0 + + 0 + 0 + 0 + + -0.5 + 0.5 + 3 + 0 + 0 + + 0 + 0 + 0 + + true + 1 + + 2 + 2 + 1 + + + + + 5 + roblox + 20 + 0 + + + + true + + + + + + false + -0.5 + 0.5 + 0 + 0 + -0.5 + 0.5 + 4 + 0 + 24 + + 1.5 + 3 + 25.5 + -1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + -1 + + false + 0 + true + false + 0.5 + 0 + 0.300000012 + -0.5 + 0.5 + 0 + 0 + -0.5 + 0.5 + 0 + 0 + true + Left Arm + 0 + -0.5 + 0.5 + 0 + 0 + + 0 + 0 + 0 + + -0.5 + 0.5 + 3 + 0 + 0 + + 0 + 0 + 0 + + true + 1 + + 1 + 2 + 1 + + + + + + false + -0.5 + 0.5 + 0 + 0 + -0.5 + 0.5 + 4 + 0 + 24 + + -1.5 + 3 + 25.5 + -1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + -1 + + false + 0 + true + false + 0.5 + 0 + 0.300000012 + -0.5 + 0.5 + 0 + 0 + -0.5 + 0.5 + 0 + 0 + true + Right Arm + 0 + -0.5 + 0.5 + 0 + 0 + + 0 + 0 + 0 + + -0.5 + 0.5 + 3 + 0 + 0 + + 0 + 0 + 0 + + true + 1 + + 1 + 2 + 1 + + + + + + false + -0.5 + 0.5 + 0 + 0 + -0.5 + 0.5 + 0 + 0 + 119 + + 0.5 + 1 + 25.5 + -1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + -1 + + false + 0 + true + false + 0.5 + 0 + 0.300000012 + -0.5 + 0.5 + 0 + 0 + -0.5 + 0.5 + 0 + 0 + true + Left Leg + 0 + -0.5 + 0.5 + 0 + 0 + + 0 + 0 + 0 + + -0.5 + 0.5 + 3 + 0 + 0 + + 0 + 0 + 0 + + true + 1 + + 1 + 2 + 1 + + + + + + false + -0.5 + 0.5 + 0 + 0 + -0.5 + 0.5 + 0 + 0 + 119 + + -0.5 + 1 + 25.5 + -1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + -1 + + false + 0 + true + false + 0.5 + 0 + 0.300000012 + -0.5 + 0.5 + 0 + 0 + -0.5 + 0.5 + 0 + 0 + true + Right Leg + 0 + -0.5 + 0.5 + 0 + 0 + + 0 + 0 + 0 + + -0.5 + 0.5 + 3 + 0 + 0 + + 0 + 0 + 0 + + true + 1 + + 1 + 2 + 1 + + + + + + 100 + false + 100 + Humanoid + false + + 0 + 0 + 0 + + + 0 + 0 + 0 + + 0 + null + + 0 + 0 + 0 + + true + + + + \ No newline at end of file diff --git a/clients/2011M/content/fonts/comics.fnt b/clients/2011M/content/fonts/comics.fnt new file mode 100644 index 0000000000000000000000000000000000000000..6b71c7e9c6142a35b87a8104d14db3f545150934 GIT binary patch literal 15248 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 literal 0 HcmV?d00001 diff --git a/clients/2011M/content/fonts/diogenes.fnt b/clients/2011M/content/fonts/diogenes.fnt new file mode 100644 index 0000000..3e718e2 --- /dev/null +++ b/clients/2011M/content/fonts/diogenes.fnt @@ -0,0 +1,438 @@ + + +&& +f84<9 +a6=4; +a 6> +4qq +47:'!<:; +47:'!<:;<&! +4=:90 +4<1& +4;49 +4;499, +4; & +4&=:90 +4&=:90& +4&& +4&&0& +4&&=:90 +4&&=:90& +4&&><&&0' +4&&"<%0 +7 +7499& +7499&46 +7499&46> +74&!4'1 +74&!0'1 +704&!<4994;1 +79:6>94;1 +79:6>94;1{ & +79:" +79:"?:7 +79:"?:7& +7:;0=041 +7:;0' +7::7 +7::7<0& +7::7& +7'04&! +7'04&!& +7 99&= +7 !!3 6>0' +7 !!=4<' +7 !!=041 +7 !!=:90 +7 !!%<6>0' +6=<;> +6<24'0!!0 +6<'690?0'> +69 +6:6>'<10 +6:6>& +6:6>& 6> +6:6>& 6>01 +6:6>& 6>0' +6:6>& 6><;2 +6:6>& 6>& +6:> +6:;1:8 +6:;1:8& +6::!0' +6'4% +6'<%& +6 8 +6 880'u +6 88<;2 +6 8& +6 8&=:! +6 ;<9<;2 & +6 ;<99<;2 & +6 ;;<9<;2 & +6 ;! +6 ;!9<6> +6 ;!9<6>0' +6 ;!9<6><;2 +6 ;!& +6,70'3 6 +6,70'3 6> +6,70'3 6>01 +6,70'3 6>0' +6,70'3 6>0'& +6,70'3 6><;2 +18; +148 +1488 +1<6>& +1<>0 +1<91: +1<91:u +1<91:& +1<91:&u +1<%&=0 +0?46 94!0u +0?46 94!01u +0?46 94!0& +0?46 94!<;2 +0?46 94!<;2& +0?46 94!<:; +084<9 +3 +3 +3 +30' +3<;2 +3> +342 +3420! +3422 +34220! +3422<;2 +3422 +36><;2 +3094!<: +30994!<: +3<;20'74;2 +3<;20'3 6> +3<;20'3 6>01 +3<;20'3 6>0' +3<;20'3 6>0'& +3<;20'3 6><;2 +3<;20'3 6>& +3<&!3 6> +3<&!3 6>01 +3<&!3 6>0' +3<&!3 6>0'& +3<&!3 6><;2 +3<&!3 6><;2& +3<&!3 6>& +3:6><;2 +3: '6=4; +3  +3 6 +3 6 +3 6> +3 6>0 +3 6>01 +3 6>0; +3 6>0' +3 6>0'& +3 6><; +3 6><;2 +3 6><;2& +3 6>9:41 +3 6>80 +3 6>& +3 6>!4'1 +3 6>!4'101 +3 6>!:; +3 6>,: +3 > +3 >0' +3 ><; +3 ><;2 +3 >> +3 >& +3 '7 '20' +3,: +24;274;2 +24;274;201 +24;274;2& +24;274;2&u +24, +24,&0- +24/:;20'& +2:1148; +2:;41& +2::> +2&%:! +2 <;;0 +=4'16:'0&0- +=4'1:; +=099 +=:0 +=:8: +=::>0' +=:';<0&! +=:';, +=:!&0- +=!!%ozz"""{79:6>94;1{ & += 8% += &&, +?46>4&& +?46><;2:33 +?46>:33 +?46>x:33 +?4% +?0'> +?0'>x:33 +?0" +?<&8 +?<1&<;4&4;7:- +><>0 +><&&8, +><&&8,4&& +>>> +>:6> +>:;1 8 +>:;1 8& +>'4 ! +> 8 +> 80'u +> 880' +> 88<;2 +> 8& +> ;<9<;2 & +908:;%4'!, +90&7: +90/7<4; +90//: +9:&0' +9:#0' +9 &! +9 &!<;2 +84>0: ! +84&!0'7m +84&!0'74 +8:!=43 6>4 +8:!=43 6>4& +8:!=43 6>4/ +8:!=43 6>01 +8:!=43 6>0' +8:!=43 6>0'& +8:!=43 6><; +8:!=43 6><;2 +8:!=43 6><;2& +8:!=43 6>& +8:!=0'3 6> +8:!=0'3 6>01 +8:!=0'3 6>0' +8:!=0'3 6>0'& +8:!=0'3 6><; +8:!=0'3 6><;2 +8:!=0'3 6><;2& +8:!=0'3 6>& +8 33 +8,6:6> +;4/< +;4/<& +;0'1 +;<20'u +;<224 +;<224& +;<220' +;<220'& +;<$$4 +;<$$4& +; 10 +; 1<&8 +; 1<&! +:=&=< +:=&=< +:832 +:'24&<8 +:'24&<8& +:'24&8 +:'24&8& +%e'; +%06>0' +%01: +%01:704' +%0;<& +%=:;0&0- +%= > +%= >01 +%= ><;2 +%= >>01 +%= >><;2 +%= >& +%= >&u +%= $u +%<8% +%<&0&u +%<&<;u +%<&<;2u +%<&:3 +%<&& +%<&&01 +%<&&0' +%<&&0'u +%<&&0'&u +%<&&0&u +%<&&<;u +%<&&<;2u +%<&&:33 +%:'; +%:';: +%:';:2'4%=, +%:';:& +%'e; +%'<6> +%'<6>& +%':&! +% &<0&u +% &&<0& +% &&, +% &&,34'! +% &&,& +% &,u +% &,&u +$ 00' +'4<% +'4<%<;2 +'4%0 +'4%01 +'4%0' +'4%<;2 +'4%<&! +'01! 70 +'0!4'1 +'!7 +&6=9:;2 +&6'0" +&0- +&0-- +&0--- +&0--, +&0-, +&0-,!<08 +&0-,!<80 +&= +&=d! +&=0<&!0' +&=,%0 +&904/0 +&9 ! +&9 !&u +&80- +&8 ! +&;4!6= +&%0'8 +&% ;> +&% '8 +&!3 +&!'<% +&!'<%%0' +&!'<%%0'%:90 +&!'<%%0'& +& 6> +& 6>& +& > +&"4&!<>4 +!=:;2 +!<;, '9 +! +#422<;4 +#42<;4 +#02<;4 +#<7'4!:' +"4;> +"4;>0' +"0!746> +"=<&>0, +"=:'0 +"=:'0=: &0 +"!3 +"""{79:6>94;1{ & +-3<4= +-3<'0 +,: '6:6> diff --git a/clients/2011M/content/fonts/humanoidAnimate.rbxm b/clients/2011M/content/fonts/humanoidAnimate.rbxm new file mode 100644 index 0000000..7a59cb9 --- /dev/null +++ b/clients/2011M/content/fonts/humanoidAnimate.rbxm @@ -0,0 +1,296 @@ + + null + nil + + + false + + Animate + -- Now with exciting TeamColors HACK! + +function waitForChild(parent, childName) + local child = parent:findFirstChild(childName) + if child then return child end + while true do + child = parent.ChildAdded:wait() + if child.Name==childName then return child end + end +end + +-- TEAM COLORS + + +function onTeamChanged(player) + + wait(1) + + local char = player.Character + if char == nil then return end + + if player.Neutral then + -- Replacing the current BodyColor object will force a reset + local old = char:findFirstChild("Body Colors") + if not old then return end + old:clone().Parent = char + old.Parent = nil + else + local head = char:findFirstChild("Head") + local torso = char:findFirstChild("Torso") + local left_arm = char:findFirstChild("Left Arm") + local right_arm = char:findFirstChild("Right Arm") + local left_leg = char:findFirstChild("Left Leg") + local right_leg = char:findFirstChild("Right Leg") + + if head then head.BrickColor = BrickColor.new(24) end + if torso then torso.BrickColor = player.TeamColor end + if left_arm then left_arm.BrickColor = BrickColor.new(26) end + if right_arm then right_arm.BrickColor = BrickColor.new(26) end + if left_leg then left_leg.BrickColor = BrickColor.new(26) end + if right_leg then right_leg.BrickColor = BrickColor.new(26) end + end +end + +function onPlayerPropChanged(property, player) + if property == "Character" then + onTeamChanged(player) + end + if property== "TeamColor" or property == "Neutral" then + onTeamChanged(player) + end +end + + +local cPlayer = game.Players:GetPlayerFromCharacter(script.Parent) +cPlayer.Changed:connect(function(property) onPlayerPropChanged(property, cPlayer) end ) +onTeamChanged(cPlayer) + + +-- ANIMATION + +-- declarations + +local Figure = script.Parent +local Torso = waitForChild(Figure, "Torso") +local RightShoulder = waitForChild(Torso, "Right Shoulder") +local LeftShoulder = waitForChild(Torso, "Left Shoulder") +local RightHip = waitForChild(Torso, "Right Hip") +local LeftHip = waitForChild(Torso, "Left Hip") +local Neck = waitForChild(Torso, "Neck") +local Humanoid = waitForChild(Figure, "Humanoid") +local pose = "Standing" + +local toolAnim = "None" +local toolAnimTime = 0 + +-- functions + +function onRunning(speed) + if speed>0 then + pose = "Running" + else + pose = "Standing" + end +end + +function onDied() + pose = "Dead" +end + +function onJumping() + pose = "Jumping" +end + +function onClimbing() + pose = "Climbing" +end + +function onGettingUp() + pose = "GettingUp" +end + +function onFreeFall() + pose = "FreeFall" +end + +function onFallingDown() + pose = "FallingDown" +end + +function onSeated() + pose = "Seated" +end + +function onPlatformStanding() + pose = "PlatformStanding" +end + +function moveJump() + RightShoulder.MaxVelocity = 0.5 + LeftShoulder.MaxVelocity = 0.5 + RightShoulder:SetDesiredAngle(3.14) + LeftShoulder:SetDesiredAngle(-3.14) + RightHip:SetDesiredAngle(0) + LeftHip:SetDesiredAngle(0) +end + + +-- same as jump for now + +function moveFreeFall() + RightShoulder.MaxVelocity = 0.5 + LeftShoulder.MaxVelocity = 0.5 + RightShoulder:SetDesiredAngle(3.14) + LeftShoulder:SetDesiredAngle(-3.14) + RightHip:SetDesiredAngle(0) + LeftHip:SetDesiredAngle(0) +end + +function moveSit() + RightShoulder.MaxVelocity = 0.15 + LeftShoulder.MaxVelocity = 0.15 + RightShoulder:SetDesiredAngle(3.14 /2) + LeftShoulder:SetDesiredAngle(-3.14 /2) + RightHip:SetDesiredAngle(3.14 /2) + LeftHip:SetDesiredAngle(-3.14 /2) +end + +function getTool() + for _, kid in ipairs(Figure:GetChildren()) do + if kid.className == "Tool" then return kid end + end + return nil +end + +function getToolAnim(tool) + for _, c in ipairs(tool:GetChildren()) do + if c.Name == "toolanim" and c.className == "StringValue" then + return c + end + end + return nil +end + +function animateTool() + + if (toolAnim == "None") then + RightShoulder:SetDesiredAngle(1.57) + return + end + + if (toolAnim == "Slash") then + RightShoulder.MaxVelocity = 0.5 + RightShoulder:SetDesiredAngle(0) + return + end + + if (toolAnim == "Lunge") then + RightShoulder.MaxVelocity = 0.5 + LeftShoulder.MaxVelocity = 0.5 + RightHip.MaxVelocity = 0.5 + LeftHip.MaxVelocity = 0.5 + RightShoulder:SetDesiredAngle(1.57) + LeftShoulder:SetDesiredAngle(1.0) + RightHip:SetDesiredAngle(1.57) + LeftHip:SetDesiredAngle(1.0) + return + end +end + +function move(time) + local amplitude + local frequency + + if (pose == "Jumping") then + moveJump() + return + end + + if (pose == "FreeFall") then + moveFreeFall() + return + end + + if (pose == "Seated") then + moveSit() + return + end + + local climbFudge = 0 + + if (pose == "Running") then + RightShoulder.MaxVelocity = 0.15 + LeftShoulder.MaxVelocity = 0.15 + amplitude = 1 + frequency = 9 + elseif (pose == "Climbing") then + RightShoulder.MaxVelocity = 0.5 + LeftShoulder.MaxVelocity = 0.5 + amplitude = 1 + frequency = 9 + climbFudge = 3.14 + else + amplitude = 0.1 + frequency = 1 + end + + desiredAngle = amplitude * math.sin(time*frequency) + + RightShoulder:SetDesiredAngle(desiredAngle + climbFudge) + LeftShoulder:SetDesiredAngle(desiredAngle - climbFudge) + RightHip:SetDesiredAngle(-desiredAngle) + LeftHip:SetDesiredAngle(-desiredAngle) + + + local tool = getTool() + + if tool then + + animStringValueObject = getToolAnim(tool) + + if animStringValueObject then + toolAnim = animStringValueObject.Value + -- message recieved, delete StringValue + animStringValueObject.Parent = nil + toolAnimTime = time + .3 + end + + if time > toolAnimTime then + toolAnimTime = 0 + toolAnim = "None" + end + + animateTool() + + + else + toolAnim = "None" + toolAnimTime = 0 + end +end + + +-- connect events + +Humanoid.Died:connect(onDied) +Humanoid.Running:connect(onRunning) +Humanoid.Jumping:connect(onJumping) +Humanoid.Climbing:connect(onClimbing) +Humanoid.GettingUp:connect(onGettingUp) +Humanoid.FreeFalling:connect(onFreeFall) +Humanoid.FallingDown:connect(onFallingDown) +Humanoid.Seated:connect(onSeated) +Humanoid.PlatformStanding:connect(onPlatformStanding) + +-- main program + +local runService = game:service("RunService"); + +while Figure.Parent~=nil do + local _, time = wait(0.1) + move(time) +end + + true + + + \ No newline at end of file diff --git a/clients/2011M/content/fonts/humanoidAnimateLocal.rbxm b/clients/2011M/content/fonts/humanoidAnimateLocal.rbxm new file mode 100644 index 0000000..282e2ac --- /dev/null +++ b/clients/2011M/content/fonts/humanoidAnimateLocal.rbxm @@ -0,0 +1,318 @@ + + null + nil + + + false + + Animate + + +function waitForChild(parent, childName) + local child = parent:findFirstChild(childName) + if child then return child end + while true do + child = parent.ChildAdded:wait() + if child.Name==childName then return child end + end +end + +-- ANIMATION + +-- declarations + +local Figure = script.Parent +local Torso = waitForChild(Figure, "Torso") +local RightShoulder = waitForChild(Torso, "Right Shoulder") +local LeftShoulder = waitForChild(Torso, "Left Shoulder") +local RightHip = waitForChild(Torso, "Right Hip") +local LeftHip = waitForChild(Torso, "Left Hip") +local Neck = waitForChild(Torso, "Neck") +local Humanoid = waitForChild(Figure, "Humanoid") +local pose = "Standing" + +local toolAnim = "None" +local toolAnimTime = 0 + +-- functions + +function onRunning(speed) + if speed>0 then + pose = "Running" + else + pose = "Standing" + end +end + +function onDied() + pose = "Dead" +end + +function onJumping() + pose = "Jumping" +end + +function onClimbing() + pose = "Climbing" +end + +function onGettingUp() + pose = "GettingUp" +end + +function onFreeFall() + pose = "FreeFall" +end + +function onFallingDown() + pose = "FallingDown" +end + +function onSeated() + pose = "Seated" +end + +function onPlatformStanding() + pose = "PlatformStanding" +end + +function moveJump() + RightShoulder.MaxVelocity = 0.5 + LeftShoulder.MaxVelocity = 0.5 + RightShoulder:SetDesiredAngle(3.14) + LeftShoulder:SetDesiredAngle(-3.14) + RightHip:SetDesiredAngle(0) + LeftHip:SetDesiredAngle(0) +end + + +-- same as jump for now + +function moveFreeFall() + RightShoulder.MaxVelocity = 0.5 + LeftShoulder.MaxVelocity = 0.5 + RightShoulder:SetDesiredAngle(3.14) + LeftShoulder:SetDesiredAngle(-3.14) + RightHip:SetDesiredAngle(0) + LeftHip:SetDesiredAngle(0) +end + +function moveSit() + RightShoulder.MaxVelocity = 0.15 + LeftShoulder.MaxVelocity = 0.15 + RightShoulder:SetDesiredAngle(3.14 /2) + LeftShoulder:SetDesiredAngle(-3.14 /2) + RightHip:SetDesiredAngle(3.14 /2) + LeftHip:SetDesiredAngle(-3.14 /2) +end + +function getTool() + for _, kid in ipairs(Figure:GetChildren()) do + if kid.className == "Tool" then return kid end + end + return nil +end + +function getToolAnim(tool) + for _, c in ipairs(tool:GetChildren()) do + if c.Name == "toolanim" and c.className == "StringValue" then + return c + end + end + return nil +end + +function animateTool() + + if (toolAnim == "None") then + RightShoulder:SetDesiredAngle(1.57) + return + end + + if (toolAnim == "Slash") then + RightShoulder.MaxVelocity = 0.5 + RightShoulder:SetDesiredAngle(0) + return + end + + if (toolAnim == "Lunge") then + RightShoulder.MaxVelocity = 0.5 + LeftShoulder.MaxVelocity = 0.5 + RightHip.MaxVelocity = 0.5 + LeftHip.MaxVelocity = 0.5 + RightShoulder:SetDesiredAngle(1.57) + LeftShoulder:SetDesiredAngle(1.0) + RightHip:SetDesiredAngle(1.57) + LeftHip:SetDesiredAngle(1.0) + return + end +end + +function move(time) + local amplitude + local frequency + + if (pose == "Jumping") then + moveJump() + return + end + + if (pose == "FreeFall") then + moveFreeFall() + return + end + + if (pose == "Seated") then + moveSit() + return + end + + local climbFudge = 0 + + if (pose == "Running") then + RightShoulder.MaxVelocity = 0.15 + LeftShoulder.MaxVelocity = 0.15 + amplitude = 1 + frequency = 9 + elseif (pose == "Climbing") then + RightShoulder.MaxVelocity = 0.5 + LeftShoulder.MaxVelocity = 0.5 + amplitude = 1 + frequency = 9 + climbFudge = 3.14 + else + amplitude = 0.1 + frequency = 1 + end + + desiredAngle = amplitude * math.sin(time*frequency) + + RightShoulder:SetDesiredAngle(desiredAngle + climbFudge) + LeftShoulder:SetDesiredAngle(desiredAngle - climbFudge) + RightHip:SetDesiredAngle(-desiredAngle) + LeftHip:SetDesiredAngle(-desiredAngle) + + + local tool = getTool() + + if tool then + + animStringValueObject = getToolAnim(tool) + + if animStringValueObject then + toolAnim = animStringValueObject.Value + -- message recieved, delete StringValue + animStringValueObject.Parent = nil + toolAnimTime = time + .3 + end + + if time > toolAnimTime then + toolAnimTime = 0 + toolAnim = "None" + end + + animateTool() + + + else + toolAnim = "None" + toolAnimTime = 0 + end +end + + +-- connect events + +Humanoid.Died:connect(onDied) +Humanoid.Running:connect(onRunning) +Humanoid.Jumping:connect(onJumping) +Humanoid.Climbing:connect(onClimbing) +Humanoid.GettingUp:connect(onGettingUp) +Humanoid.FreeFalling:connect(onFreeFall) +Humanoid.FallingDown:connect(onFallingDown) +Humanoid.Seated:connect(onSeated) +Humanoid.PlatformStanding:connect(onPlatformStanding) + +-- main program + +local runService = game:service("RunService"); + +while Figure.Parent~=nil do + local _, time = wait(0.1) + move(time) +end + + true + + + + + false + + + + RobloxTeam + + -- Now with exciting TeamColors HACK! + + function waitForChild(parent, childName) + local child = parent:findFirstChild(childName) + if child then return child end + while true do + child = parent.ChildAdded:wait() + if child.Name==childName then return child end + end + end + + -- TEAM COLORS + + + function onTeamChanged(player) + + wait(1) + + local char = player.Character + if char == nil then return end + + if player.Neutral then + -- Replacing the current BodyColor object will force a reset + local old = char:findFirstChild("Body Colors") + if not old then return end + old:clone().Parent = char + old.Parent = nil + else + local head = char:findFirstChild("Head") + local torso = char:findFirstChild("Torso") + local left_arm = char:findFirstChild("Left Arm") + local right_arm = char:findFirstChild("Right Arm") + local left_leg = char:findFirstChild("Left Leg") + local right_leg = char:findFirstChild("Right Leg") + + if head then head.BrickColor = BrickColor.new(24) end + if torso then torso.BrickColor = player.TeamColor end + if left_arm then left_arm.BrickColor = BrickColor.new(26) end + if right_arm then right_arm.BrickColor = BrickColor.new(26) end + if left_leg then left_leg.BrickColor = BrickColor.new(26) end + if right_leg then right_leg.BrickColor = BrickColor.new(26) end + end + end + + function onPlayerPropChanged(property, player) + if property == "Character" then + onTeamChanged(player) + end + if property== "TeamColor" or property == "Neutral" then + onTeamChanged(player) + end + end + + + local cPlayer = game.Players:GetPlayerFromCharacter(script.Parent) + cPlayer.Changed:connect(function(property) onPlayerPropChanged(property, cPlayer) end ) + onTeamChanged(cPlayer) + + + true + + + \ No newline at end of file diff --git a/clients/2011M/content/fonts/humanoidExtra.rbxm b/clients/2011M/content/fonts/humanoidExtra.rbxm new file mode 100644 index 0000000..ea08e27 --- /dev/null +++ b/clients/2011M/content/fonts/humanoidExtra.rbxm @@ -0,0 +1,11 @@ + + null + nil + + + false + Script + while script.Parent.Head==nil do wait(0.05) end function newSound(id) local sound = Instance.new("Sound") sound.SoundId = id sound.Parent = script.Parent.Head return sound end sDied = newSound("rbxasset://sounds/uuhhh.wav") sFallingDown = newSound("rbxasset://sounds/splat.wav") sFreeFalling = newSound("rbxasset://sounds/swoosh.wav") sGettingUp = newSound("rbxasset://sounds/hit.wav") sJumping = newSound("rbxasset://sounds/button.wav") sRunning = newSound("rbxasset://sounds/bfsl-minifigfoots1.mp3") sRunning.Looped = true function onDied() sDied:play() end function onState(state, sound) if state then sound:play() else sound:pause() end end function onRunning(speed) if speed>0 then sRunning:play() else sRunning:pause() end end while script.Parent.Humanoid==nil do wait(0.05) end h = script.Parent.Humanoid h.Died:connect(onDied) h.Running:connect(onRunning) h.Jumping:connect(function(state) onState(state, sJumping) end) h.GettingUp:connect(function(state) onState(state, sGettingUp) end) h.FreeFalling:connect(function(state) onState(state, sFreeFalling) end) h.FallingDown:connect(function(state) onState(state, sFallingDown) end) -- regeneration while true do local s = wait(1) local health=h.Health if health>0 and health<h.MaxHealth then health = health + 0.01*s*h.MaxHealth if health*1.05 < h.MaxHealth then h.Health = health else h.Health = h.MaxHealth end end end + + + \ No newline at end of file diff --git a/clients/2011M/content/fonts/humanoidHealth.rbxm b/clients/2011M/content/fonts/humanoidHealth.rbxm new file mode 100644 index 0000000..12cdbbb --- /dev/null +++ b/clients/2011M/content/fonts/humanoidHealth.rbxm @@ -0,0 +1,191 @@ + + null + nil + + + false + + HealthScript v2.0 + local humanoid = script.Parent.Humanoid + +if (humanoid == nil) then + print("ERROR: no humanoid found in 'HealthScript v2.0'") +end + + +function CreateGUI() + local p = game.Players:GetPlayerFromCharacter(humanoid.Parent) + print("Health for Player: " .. p.Name) + script.HealthGUI.Parent = p.PlayerGui +end + +function UpdateGUI(health) + local pgui = game.Players:GetPlayerFromCharacter(humanoid.Parent).PlayerGui + local tray = pgui.HealthGUI.Tray + + tray.HealthBar.Size = UDim2.new(0.2, 0, 0.8 * (health / humanoid.MaxHealth), 0) + tray.HealthBar.Position = UDim2.new(0.4, 0, 0.8 * (1- (health / humanoid.MaxHealth)) , 0) + +end + + +function HealthChanged(health) + UpdateGUI(health) +end + + +CreateGUI() +humanoid.HealthChanged:connect(HealthChanged) +humanoid.Died:connect(function() HealthChanged(0) end) + true + + + + HealthGUI + true + + + + false + 4285215356 + 1 + 4279970357 + 1 + Tray + + 0.949999988 + 0 + 0.380000025 + 0 + + + 0.0450000018 + 0 + 0.340000004 + 0 + + 0 + true + 1 + true + + + + false + 4294967295 + 1 + 4279970357 + 1 + http://www.roblox.com/asset/?id=18441769 + ImageLabel + + 0 + 0 + 0.800000012 + 3 + + + 1 + 0 + 0.25 + 0 + + 1 + true + 1 + true + + + + + false + 4286892054 + 0 + 4278190080 + 0 + HealthBar + + 0.420000017 + 0 + 0 + 0 + + + 0.159999996 + 0 + 0.800000012 + 0 + + 0 + true + 2 + true + + + + + false + 4289733411 + 0 + 4278190080 + 0 + HealthBarBacking + + 0.419999987 + 0 + 0 + 0 + + + 0.159999996 + 0 + 0.800000012 + 0 + + 0 + true + 1 + true + + + + + + + + false + + Health + function waitForChild(parent, childName) + local child = parent:findFirstChild(childName) + if child then return child end + while true do + child = parent.ChildAdded:wait() + if child.Name==childName then return child end + end + end + + -- declarations + + local Figure = script.Parent + local Head = waitForChild(Figure, "Head") + local Humanoid = waitForChild(Figure, "Humanoid") + + -- regeneration + while true do + local s = wait(1) + local health = Humanoid.Health + if health > 0 and health < Humanoid.MaxHealth then + health = health + 0.01 * s * Humanoid.MaxHealth + if health * 1.05 < Humanoid.MaxHealth then + Humanoid.Health = health + else + Humanoid.Health = Humanoid.MaxHealth + end + end + end + + true + + + \ No newline at end of file diff --git a/clients/2011M/content/fonts/humanoidSound.rbxm b/clients/2011M/content/fonts/humanoidSound.rbxm new file mode 100644 index 0000000..0523e7b --- /dev/null +++ b/clients/2011M/content/fonts/humanoidSound.rbxm @@ -0,0 +1,76 @@ + + null + nil + + + false + + Sound + -- util + +function waitForChild(parent, childName) + local child = parent:findFirstChild(childName) + if child then return child end + while true do + child = parent.ChildAdded:wait() + if child.Name==childName then return child end + end +end + +function newSound(id) + local sound = Instance.new("Sound") + sound.SoundId = id + sound.archivable = false + sound.Parent = script.Parent.Head + return sound +end + +-- declarations + +local sDied = newSound("rbxasset://sounds/uuhhh.wav") +local sFallingDown = newSound("rbxasset://sounds/splat.wav") +local sFreeFalling = newSound("rbxasset://sounds/swoosh.wav") +local sGettingUp = newSound("rbxasset://sounds/hit.wav") +local sJumping = newSound("rbxasset://sounds/button.wav") +local sRunning = newSound("rbxasset://sounds/bfsl-minifigfoots1.mp3") +sRunning.Looped = true + +local Figure = script.Parent +local Head = waitForChild(Figure, "Head") +local Humanoid = waitForChild(Figure, "Humanoid") + +-- functions + +function onDied() + sDied:Play() +end + +function onState(state, sound) + if state then + sound:Play() + else + sound:Pause() + end +end + +function onRunning(speed) + if speed>0 then + sRunning:Play() + else + sRunning:Pause() + end +end + +-- connect up + +Humanoid.Died:connect(onDied) +Humanoid.Running:connect(onRunning) +Humanoid.Jumping:connect(function(state) onState(state, sJumping) end) +Humanoid.GettingUp:connect(function(state) onState(state, sGettingUp) end) +Humanoid.FreeFalling:connect(function(state) onState(state, sFreeFalling) end) +Humanoid.FallingDown:connect(function(state) onState(state, sFallingDown) end) + + true + + + \ No newline at end of file diff --git a/clients/2011M/content/fonts/humanoidStatic.rbxm b/clients/2011M/content/fonts/humanoidStatic.rbxm new file mode 100644 index 0000000..1c9fcb7 --- /dev/null +++ b/clients/2011M/content/fonts/humanoidStatic.rbxm @@ -0,0 +1,12 @@ + + null + nil + + + false + Static + local Figure = script.Parent local Torso = Figure:findFirstChild("Torso") Torso:makeJoints() + true + + + \ No newline at end of file diff --git a/clients/2011M/content/fonts/leftarm.mesh b/clients/2011M/content/fonts/leftarm.mesh new file mode 100644 index 0000000000000000000000000000000000000000..6e8bb63a0b687b436c97dc888a560749d294e107 GIT binary patch literal 2065 zcmai!OK;Oa6ooHsfY63Vd6#D?0a}Dm#TF4S*mZ?iS7L<(8zO}iz)ERa4iab-ZJX6o=9yA%|lR=Y5 zKMU&Ao}66OB6HuSexDWOIqD&E@USn{caP<070P?|BiUD%CuG(=S=6hU5xr(*GqWtp z+<3?wJf5|6@1d7x?(o!mk38BRE1u!!W`~^zXPBc^Dd*XUJmGt|ROffO8uEzS>%^X}%&|vxmgdaf zgNL0S6IKvf@M@*Zdg9}*;S;W5?g8kNuHn9Gm|6gR$~C;^8m1ROue*ln&2^YH5Kaqc zT*G7n=(Db2G6D2C*YJjLUbrA!bPZn;E(=$LtFGZq2l|?8___mq!!>+UxFy^cwp_z^ ygl*xjKvsYrx`xRL(DxkZ`>x>!4m6nnddD?PCV<{`py|hNm@Hi5UV5Nm{`&_*y{ex8 literal 0 HcmV?d00001 diff --git a/clients/2011M/content/fonts/leftleg.mesh b/clients/2011M/content/fonts/leftleg.mesh new file mode 100644 index 0000000000000000000000000000000000000000..aba3a292c8747756dab63c0f8302a35d716fe8db GIT binary patch literal 2065 zcmai!O>PrG5QQ5jz!1z&_zVApU?4#eir89s790S?I$IWOFan7clABwx@`wv?1g^j~ z63FI#)76u1r$@B(RL|qrRj;ah=F7WJpWjbEY`=JZaIi6Sqv12>+`jPk`>*-l;j|V7 zwtPMC)B0%nW5NS8yNA<8G}A0*Z&J;qPgA)?%roh$m1yS9`C2vGJ#aiMW*@s+`q_{t zXgt2!h3Cr6ZJ%rKv#P;!)Xxy!xI{6 zXPW?u@-rf^XfF5SDL5qj>SCYnfrrht>e29^CTMi$u)&M zE1GI`&V^c4I%oN4-}lVVz;Bf_SuHflxfk>B-Pm+r+kN!ReAH1B`f7V?m|?21?^vec zEK-d;7w>$ciQmH$d44a~q94U_o>bH4In|VANbgZYr>BGgM2ooAGUwJ6Pa7wmF-~L; zfS)x^tc(-M1>on56E}<#sRiKYjT5QOb0TXfTo5iAC*ldfFBvD|3BWHKCvFN?gsZ|e z?4<^r$bbI;lGUjw literal 0 HcmV?d00001 diff --git a/clients/2011M/content/fonts/libraries.rbxm b/clients/2011M/content/fonts/libraries.rbxm new file mode 100644 index 0000000..71630fe --- /dev/null +++ b/clients/2011M/content/fonts/libraries.rbxm @@ -0,0 +1,7208 @@ + + null + nil + + + false + + Sorter + print("Special thanks to Bitl, Carrot, iago, winsupermario1234, Khangaroo, drslicendice, coke, TheLivingBee, Raymonf, and a bunch of play - testers for help making 2011 fully stable and work. 8)") +script.Playerlist:clone().Parent = game.StarterGui +script.Dialogs:clone().Parent = game.StarterGui +script.Health:clone().Parent = game.StarterGui +script.ReenableDialogScript:clone().Parent = game.Lighting +script.TimeoutScript:clone().Parent = game.Lighting +script.ResetCommand:clone().Parent = game.Workspace +script:remove() + true + + + + true + + ReenableDialogScript + wait(5) +local dialog = script.Parent +if dialog:IsA("Dialog") then + dialog.InUse = false +end +script:Remove() + + true + + + + + true + + TimeoutScript + wait(5) +local dialog = script.Parent +if dialog:IsA("Dialog") then + dialog.InUse = false +end +script:Remove() + + true + + + + + false + + ResetCommand + function onChatted(msg, speaker) + + source = string.lower(speaker.Name) + msg = string.lower(msg) + -- Note: This one is NOT caps sensitive + + if msg == "!!!reset" then + speaker.Character.Humanoid.Health = 0 + end +end + +function onPlayerEntered(newPlayer) + newPlayer.Chatted:connect(function(msg) onChatted(msg, newPlayer) end) +end + +game.Players.ChildAdded:connect(onPlayerEntered) + true + + + + + Health + true + + + + false + 4285215356 + 1 + 4279970357 + 1 + tray + + 0.5 + -44 + 1 + -26 + + + 0 + 170 + 0 + 18 + + 2 + 0 + true + 1 + true + + + + false + 4294967295 + 1 + 4279970357 + 1 + rbxasset://../../../shareddata/textures/healthgui/bkg.png + bkg + + 0 + 0 + 0 + 0 + + + 1 + 0 + 1 + 0 + + 0 + true + 1 + true + + + + + false + 4294967295 + 1 + 4279970357 + 1 + rbxasset://../../../shareddata/textures/healthgui/BarRed.png + barRed + + 0.0189999994 + 0 + 0.100000001 + 0 + + + 0 + 0 + 0 + 0 + + 0 + true + 1 + true + + + + + false + 4294967295 + 1.00000012 + 4279970357 + 0 + bar2 + + 0.0189999994 + 0 + 0.100000001 + 0 + + + 0.192000002 + 0 + 0.829999983 + 0 + + 0 + 0 + true + 1 + true + + + + false + + Init + h = game.Players.LocalPlayer.Character.Humanoid +tray = script.Parent.Parent +base = tray.Parent +local lastHealth = 100 +local lastHealth2 = 100 +local maxWidth = 0.96 + +function UpdateGUI(health) + local width = (health / h.MaxHealth) * maxWidth + local height = 0.83 + local lastX = tray.bar.Position.X.Scale + local x = 0.019 + (maxWidth - width) + local y = 0.1 + + tray.bar.Position = UDim2.new(x,0,y, 0) + tray.bar.Size = UDim2.new(width, 0, height, 0) + -- If more than 1/4 health, bar = green. Else, bar = red. + if( (health / h.MaxHealth) > 0.25 ) then + tray.barRed.Size = UDim2.new(0, 0, 0, 0) + else + tray.barRed.Position = tray.bar.Position + tray.barRed.Size = tray.bar.Size + tray.bar.Size = UDim2.new(0, 0, 0, 0) + end + + if ( (lastHealth - health) > (h.MaxHealth / 10) ) then + lastHealth = health + + if h.Health ~= h.MaxHealth then + delay(0,function() + AnimateHurtOverlay() + end) + delay(0,function() + AnimateBars(x, y, lastX, height) + end) + end + else + lastHealth = health + end +end + +function AnimateBars(x, y, lastX, height) + local width = math.abs(x - lastX) + if( x > lastX ) then + x = lastX + end + tray.bar2.Position = UDim2.new(x,0, y, 0) + tray.bar2.Size = UDim2.new(width, 0, height, 0) + tray.bar2.BackgroundTransparency = 0 + local GBchannels = 1 + local j = 0.2 + + local i_total = 30 + for i=1,i_total do + -- Increment Values + if (GBchannels < 0.2) then + j = -j + end + GBchannels = GBchannels + j + if (i > (i_total - 10)) then + tray.bar2.BackgroundTransparency = tray.bar2.BackgroundTransparency + 0.1 + end + tray.bar2.BackgroundColor3 = Color3.new(1, GBchannels, GBchannels) + + wait(0.02) + end +end + +function AnimateHurtOverlay() + -- Start: + -- overlay.Position = UDim2.new(0, 0, 0, -22) + -- overlay.Size = UDim2.new(1, 0, 1.15, 30) + + -- Finish: + -- overlay.Position = UDim2.new(-2, 0, -2, -22) + -- overlay.Size = UDim2.new(4.5, 0, 4.65, 30) + + overlay = base.hurtOverlay + overlay.Visible = true + overlay.Position = UDim2.new(-2, 0, -2, -22) + overlay.Size = UDim2.new(4.5, 0, 4.65, 30) + -- Animate In, fast + local i_total = 2 + local wiggle_total = 0 + local wiggle_i = 0.02 + for i=1,i_total do + overlay.Position = UDim2.new( (-2 + (2 * (i/i_total)) + wiggle_total/2), 0, (-2 + (2 * (i/i_total)) + wiggle_total/2), -22 ) + overlay.Size = UDim2.new( (4.5 - (3.5 * (i/i_total)) + wiggle_total), 0, (4.65 - (3.5 * (i/i_total)) + wiggle_total), 30 ) + wait(0.01) + end + + i_total = 30 + + wait(0.03) + + -- Animate Out, slow + for i=1,i_total do + if( math.abs(wiggle_total) > (wiggle_i * 3) ) then + wiggle_i = -wiggle_i + end + wiggle_total = wiggle_total + wiggle_i + overlay.Position = UDim2.new( (0 - (2 * (i/i_total)) + wiggle_total/2), 0, (0 - (2 * (i/i_total)) + wiggle_total/2), -22 ) + overlay.Size = UDim2.new( (1 + (3.5 * (i/i_total)) + wiggle_total), 0, (1.15 + (3.5 * (i/i_total)) + wiggle_total), 30 ) + wait(0.01) + end + + -- Hide after we're done + overlay.Position = UDim2.new(10, 0, 0, 0) + overlay.Visible = false +end + +h.Changed:connect(function() + UpdateGUI(h.Health) + if ( (lastHealth2 - h.Health) > (h.MaxHealth / 10) ) then + lastHealth2 = h.Health + else + lastHealth2 = h.Health + end end) + true + + + + + + false + 4294967295 + 1 + 4279970357 + 1 + rbxasset://../../../shareddata/textures/healthgui/Bar.png + bar + + 0.0189999994 + 0 + 0.100000001 + 0 + + + 0.959999979 + 0 + 0.829999983 + 0 + + 0 + true + 1 + true + + + + + false + 4294967295 + 1 + 4279970357 + 0 + rbxasset://../../../shareddata/textures/healthgui/label.png + label + + 0.680000007 + 0 + 0.300000012 + 0 + + + 0.25 + 0 + 0.349999994 + 0 + + 0 + true + 1 + true + + + + + + false + 4290164919 + 1 + 4279970357 + 1 + rbxasset://../../../shareddata/textures/healthgui/HurtOverlay.png + hurtOverlay + + 2 + 0 + 0 + -22 + + + 1 + 0 + 1.1500001 + 30 + + 0 + false + 1 + true + + + + + + Dialogs + true + + + + false + 4288914085 + 1 + 4279970357 + 1 + ControlFrame + + 0 + 0 + 0 + 0 + + + 1 + 0 + 1 + 0 + + 0 + 0 + true + 1 + true + + + + false + 4288914085 + 1 + 4279970357 + 1 + BottomLeftControl + + 0 + 0 + 1 + -46 + + + 0 + 130 + 0 + 46 + + 0 + 0 + true + 1 + true + + + + + + false + + Init + --rbxsig%XeVmMtUuu+dXh8pEbcaTkr2m9RJZXY42LaACJ12YYcuPtOUxy4Azi8uMDGU8ZTh7cvZC9BlOWgqmZHKjESSdfOZl0/cgd2JKHPZ2UqiqA1slJa7R5GtCcGXlNPHW8KDYgJGRuwe8h5CSiMDOl6QLTSEegTOG7fzHk/n1AFcRN8I=% +--rbxassetid%39250920% +--fixed by Carrot#0559 + +function waitForProperty(instance, name) + while not instance[name] do + instance.Changed:wait() + end +end + +local beter = game.Lighting + +function waitForDialogChildrenMyLord(beter, name) + while not beter:FindFirstChild(name) do + beter.ChildAdded:wait() + end +end + +local bois = game.Players.LocalPlayer.PlayerGui + +function waitForFaker(bois, name) + while not bois:FindFirstChild(name) do + bois.ChildAdded:wait() + end +end + + +local mainFrame +local choices = {} +local lastChoice +local choiceMap = {} +local currentConversationDialog +local currentConversationPartner +local currentAbortDialogScript + +local tooFarAwayMessage = "You are too far away to chat!" +local tooFarAwaySize = 300 +local characterWanderedOffMessage = "Chat ended because you walked away" +local characterWanderedOffSize = 350 +local conversationTimedOut = "Chat ended because you didn't reply" +local conversationTimedOutSize = 350 + +local player +local screenGui +local chatNotificationGui +local messageDialog +local timeoutScript = game.Lighting.ReenableDialogScript +local reenableDialogScript = game.Lighting.TimeoutScript +local dialogMap = {} +local dialogConnections = {} + +local gui = nil +--waitForDialogChildrenMyLord(game,"CoreGui") +--waitForDialogChildrenMyLord(game.CoreGui,"RobloxGui") +--if game.CoreGui.RobloxGui:FindFirstChild("ControlFrame") then +-- gui = game.CoreGui.RobloxGui.ControlFrame +--else +-- gui = game.CoreGui.RobloxGui +--end + +function currentTone() + if currentConversationDialog then + return currentConversationDialog.Tone + else + return Enum.DialogTone.Neutral + end +end + + +function createChatNotificationGui() + chatNotificationGui = Instance.new("BillboardGui") + chatNotificationGui.Name = "ChatNotificationGui" + chatNotificationGui.ExtentsOffset = Vector3.new(0,1,0) + chatNotificationGui.Size = UDim2.new(4, 0, 5.42857122, 0) + chatNotificationGui.SizeOffset = Vector2.new(0,0) + chatNotificationGui.StudsOffset = Vector3.new(0.4, 4.3, 0) + chatNotificationGui.Enabled = true + chatNotificationGui.Active = true + + local image = Instance.new("ImageLabel") + image.Name = "Image" + image.Active = false + image.BackgroundTransparency = 1 + image.Position = UDim2.new(0,0,0,0) + image.Size = UDim2.new(1.0,0,1.0,0) + image.Image = "" + image.Parent = chatNotificationGui + + + local button = Instance.new("ImageButton") + button.Name = "Button" + button.AutoButtonColor = false + button.Position = UDim2.new(0.0879999995, 0, 0.0529999994, 0) + button.Size = UDim2.new(0.829999983, 0, 0.460000008, 0) + button.Image = "" + button.BackgroundTransparency = 1 + button.Parent = image +end + +function getChatColor(tone) + if tone == Enum.DialogTone.Neutral then + return Enum.ChatColor.Blue + elseif tone == Enum.DialogTone.Friendly then + return Enum.ChatColor.Green + elseif tone == Enum.DialogTone.Enemy then + return Enum.ChatColor.Red + end +end + +function styleChoices(tone) + for i, obj in pairs(choices) do + resetColor(obj, tone) + end + resetColor(lastChoice, tone) +end + +function styleMainFrame(tone) + if tone == Enum.DialogTone.Neutral then + mainFrame.Style = Enum.FrameStyle.ChatBlue + mainFrame.Tail.Image = "rbxasset://textures/chatBubble_botBlue_tailRight.png" + elseif tone == Enum.DialogTone.Friendly then + mainFrame.Style = Enum.FrameStyle.ChatGreen + mainFrame.Tail.Image = "rbxasset://textures/chatBubble_botGreen_tailRight.png" + elseif tone == Enum.DialogTone.Enemy then + mainFrame.Style = Enum.FrameStyle.ChatRed + mainFrame.Tail.Image = "rbxasset://textures/chatBubble_botRed_tailRight.png" + end + + styleChoices(tone) +end +function setChatNotificationTone(gui, purpose, tone) + if tone == Enum.DialogTone.Neutral then + gui.Image.Image = "rbxasset://textures/chatBubble_botBlue_notify_bkg.png" + elseif tone == Enum.DialogTone.Friendly then + gui.Image.Image = "rbxasset://textures/chatBubble_botGreen_notify_bkg.png" + elseif tone == Enum.DialogTone.Enemy then + gui.Image.Image = "rbxasset://textures/chatBubble_botRed_notify_bkg.png" + end + if purpose == Enum.DialogPurpose.Quest then + gui.Image.Button.Image = "rbxasset://textures/chatBubble_bot_notify_bang.png" + elseif purpose == Enum.DialogPurpose.Help then + gui.Image.Button.Image = "rbxasset://textures/chatBubble_bot_notify_question.png" + elseif purpose == Enum.DialogPurpose.Shop then + gui.Image.Button.Image = "rbxasset://textures/chatBubble_bot_notify_money.png" + end +end + +function createMessageDialog() + messageDialog = Instance.new("Frame"); + messageDialog.Name = "DialogScriptMessage" + messageDialog.Style = Enum.FrameStyle.RobloxRound + messageDialog.Visible = false + + local text = Instance.new("TextLabel") + text.Name = "Text" + text.Position = UDim2.new(0,0,0,-1) + text.Size = UDim2.new(1,0,1,0) + text.FontSize = Enum.FontSize.Size14 + text.BackgroundTransparency = 1 + text.TextColor3 = Color3.new(1,1,1) + text.Parent = messageDialog +end + +function showMessage(msg, size) + messageDialog.Text.Text = msg + messageDialog.Size = UDim2.new(0,size,0,40) + messageDialog.Position = UDim2.new(0.5, -size/2, 0.5, -40) + messageDialog.Visible = true + wait(2) + messageDialog.Visible = false +end + +function variableDelay(str) + local length = math.min(string.len(str), 100) + wait(0.75 + ((length/75) * 1.5)) +end + +function resetColor(frame, tone) + if tone == Enum.DialogTone.Neutral then + frame.BackgroundColor3 = Color3.new(0/255, 0/255, 179/255) + frame.Number.TextColor3 = Color3.new(45/255, 142/255, 245/255) + elseif tone == Enum.DialogTone.Friendly then + frame.BackgroundColor3 = Color3.new(0/255, 77/255, 0/255) + frame.Number.TextColor3 = Color3.new(0/255, 190/255, 0/255) + elseif tone == Enum.DialogTone.Enemy then + frame.BackgroundColor3 = Color3.new(140/255, 0/255, 0/255) + frame.Number.TextColor3 = Color3.new(255/255,88/255, 79/255) + end +end + +function highlightColor(frame, tone) + if tone == Enum.DialogTone.Neutral then + frame.BackgroundColor3 = Color3.new(2/255, 108/255, 255/255) + frame.Number.TextColor3 = Color3.new(1, 1, 1) + elseif tone == Enum.DialogTone.Friendly then + frame.BackgroundColor3 = Color3.new(0/255, 128/255, 0/255) + frame.Number.TextColor3 = Color3.new(1, 1, 1) + elseif tone == Enum.DialogTone.Enemy then + frame.BackgroundColor3 = Color3.new(204/255, 0/255, 0/255) + frame.Number.TextColor3 = Color3.new(1, 1, 1) + end +end + +function wanderDialog() + print("Wander") + mainFrame.Visible = false + endDialog() + showMessage(characterWanderedOffMessage, characterWanderedOffSize) +end + +function timeoutDialog() + print("Timeout") + mainFrame.Visible = false + endDialog() + showMessage(conversationTimedOut, conversationTimedOutSize) +end +function normalEndDialog() + print("Done") + endDialog() +end + +function endDialog() + if currentAbortDialogScript then + currentAbortDialogScript:Remove() + currentAbortDialogScript = nil + end + + local dialog = currentConversationDialog + currentConversationDialog = nil + if dialog and dialog.InUse then + local reenableScript = reenableDialogScript:Clone() + reenableScript.archivable = false + reenableScript.Disabled = false + reenableScript.Parent = dialog + end + + for dialog, gui in pairs(dialogMap) do + if dialog and gui then + gui.Enabled = not dialog.InUse + end + end + + currentConversationPartner = nil +end + +function sanitizeMessage(msg) + if string.len(msg) == 0 then + return "..." + else + return msg + end +end + +function selectChoice(choice) + renewKillswitch(currentConversationDialog) + + --First hide the Gui + mainFrame.Visible = false + if choice == lastChoice then + game.Chat:Chat(game.Players.LocalPlayer.Character, "Goodbye!", getChatColor(currentTone())) + + normalEndDialog() + else + local dialogChoice = choiceMap[choice] + + game.Chat:Chat(game.Players.LocalPlayer.Character, sanitizeMessage(dialogChoice.UserDialog), getChatColor(currentTone())) + wait(1) + --currentConversationDialog:SignalDialogChoiceSelected(player, dialogChoice) + game.Chat:Chat(currentConversationPartner, sanitizeMessage(dialogChoice.ResponseDialog), getChatColor(currentTone())) + + variableDelay(dialogChoice.ResponseDialog) + presentDialogChoices(currentConversationPartner, dialogChoice:GetChildren()) + end +end + +function newChoice(numberText) + local frame = Instance.new("TextButton") + frame.BackgroundColor3 = Color3.new(0/255, 0/255, 179/255) + frame.AutoButtonColor = false + frame.BorderSizePixel = 0 + frame.Text = "" + frame.MouseEnter:connect(function() highlightColor(frame, currentTone()) end) + frame.MouseLeave:connect(function() resetColor(frame, currentTone()) end) + frame.MouseButton1Click:connect(function() selectChoice(frame) end) + + local number = Instance.new("TextLabel") + number.Name = "Number" + number.TextColor3 = Color3.new(127/255, 212/255, 255/255) + number.Text = numberText + number.FontSize = Enum.FontSize.Size14 + number.BackgroundTransparency = 1 + number.Position = UDim2.new(0,4,0,2) + number.Size = UDim2.new(0,20,0,24) + number.TextXAlignment = Enum.TextXAlignment.Left + number.TextYAlignment = Enum.TextYAlignment.Top + number.Parent = frame + + local prompt = Instance.new("TextLabel") + prompt.Name = "UserPrompt" + prompt.BackgroundTransparency = 1 + prompt.TextColor3 = Color3.new(1,1,1) + prompt.FontSize = Enum.FontSize.Size14 + prompt.Position = UDim2.new(0,28, 0, 2) + prompt.Size = UDim2.new(1,-32, 1, -4) + prompt.TextXAlignment = Enum.TextXAlignment.Left + prompt.TextYAlignment = Enum.TextYAlignment.Top + prompt.TextWrap = true + prompt.Parent = frame + + return frame +end +function initialize(parent) + choices[1] = newChoice("1)") + choices[2] = newChoice("2)") + choices[3] = newChoice("3)") + choices[4] = newChoice("4)") + + lastChoice = newChoice("5)") + lastChoice.UserPrompt.Text = "Goodbye!" + lastChoice.Size = UDim2.new(1,0,0,28) + + mainFrame = Instance.new("Frame") + mainFrame.Name = "UserDialogArea" + mainFrame.Size = UDim2.new(0, 350, 0, 200) + mainFrame.Style = Enum.FrameStyle.ChatBlue + mainFrame.Visible = false + + local imageLabel = Instance.new("ImageLabel") + imageLabel.Name = "Tail" + imageLabel.Size = UDim2.new(0,62,0,53) + imageLabel.Position = UDim2.new(1,8,0.25) + imageLabel.Image = "rbxasset://textures/chatBubble_botBlue_tailRight.png" + imageLabel.BackgroundTransparency = 1 + imageLabel.Parent = mainFrame + + for n, obj in pairs(choices) do + obj.Parent = mainFrame + end + lastChoice.Parent = mainFrame + + mainFrame.Parent = parent +end + +function presentDialogChoices(talkingPart, dialogChoices) + if not currentConversationDialog then + return + end + + currentConversationPartner = talkingPart + local sortedDialogChoices = {} + for n, obj in pairs(dialogChoices) do + if obj:IsA("DialogChoice") then + table.insert(sortedDialogChoices, obj) + end + end + table.sort(sortedDialogChoices, function(a,b) return a.Name < b.Name end) + + if #sortedDialogChoices == 0 then + normalEndDialog() + return + end + + local pos = 1 + local yPosition = 0 + choiceMap = {} + for n, obj in pairs(choices) do + obj.Visible = false + end + + for n, obj in pairs(sortedDialogChoices) do + if pos <= #choices then + --3 lines is the maximum, set it to that temporarily + choices[pos].Size = UDim2.new(1, 0, 0, 24*3) + choices[pos].UserPrompt.Text = obj.UserDialog + local height = math.ceil(choices[pos].UserPrompt.TextBounds.Y/24)*24 + + choices[pos].Position = UDim2.new(0, 0, 0, yPosition) + choices[pos].Size = UDim2.new(1, 0, 0, height) + choices[pos].Visible = true + + choiceMap[choices[pos]] = obj + + yPosition = yPosition + height + pos = pos + 1 + end + end + + lastChoice.Position = UDim2.new(0,0,0,yPosition) + lastChoice.Number.Text = pos .. ")" + + mainFrame.Size = UDim2.new(0, 350, 0, yPosition+24+32) + mainFrame.Position = UDim2.new(0,20,0.0, -mainFrame.Size.Y.Offset-20) + styleMainFrame(currentTone()) + mainFrame.Visible = true +end + +function doDialog(dialog) + while not Instance.Lock(dialog, player) do + wait() + end + + if dialog.InUse then + Instance.Unlock(dialog) + return + else + dialog.InUse = true + Instance.Unlock(dialog) + end + + currentConversationDialog = dialog + game.Chat:Chat(dialog.Parent, dialog.InitialPrompt, getChatColor(dialog.Tone)) + variableDelay(dialog.InitialPrompt) + + presentDialogChoices(dialog.Parent, dialog:GetChildren()) +end + +function renewKillswitch(dialog) + if currentAbortDialogScript then + currentAbortDialogScript:Remove() + currentAbortDialogScript = nil + end + + currentAbortDialogScript = timeoutScript:Clone() + currentAbortDialogScript.archivable = false + currentAbortDialogScript.Disabled = false + currentAbortDialogScript.Parent = dialog +end + +function checkForLeaveArea() + while currentConversationDialog do + if currentConversationDialog.Parent and (player:DistanceFromCharacter(currentConversationDialog.Parent.Position) >= currentConversationDialog.ConversationDistance) then + wanderDialog() + end + wait(1) + end +end + +function startDialog(dialog) + if dialog.Parent and dialog.Parent:IsA("BasePart") then + if player:DistanceFromCharacter(dialog.Parent.Position) >= dialog.ConversationDistance then + showMessage(tooFarAwayMessage, tooFarAwaySize) + return + end + + for dialog, gui in pairs(dialogMap) do + if dialog and gui then + gui.Enabled = false + end + end + + renewKillswitch(dialog) + + delay(1, checkForLeaveArea) + doDialog(dialog) + end +end + +function removeDialog(dialog) + if dialogMap[dialog] then + dialogMap[dialog]:Remove() + dialogMap[dialog] = nil + end + if dialogConnections[dialog] then + dialogConnections[dialog]:disconnect() + dialogConnections[dialog] = nil + end +end + +function addDialog(dialog) + if dialog.Parent then + if dialog.Parent:IsA("BasePart") then + local chatGui = chatNotificationGui:clone() + chatGui.Enabled = not dialog.InUse + chatGui.Adornee = dialog.Parent + chatGui.Parent = game.Players.LocalPlayer.PlayerGui + chatGui.Image.Button.MouseButton1Click:connect(function() startDialog(dialog) end) + setChatNotificationTone(chatGui, dialog.Purpose, dialog.Tone) + + dialogMap[dialog] = chatGui + + dialogConnections[dialog] = dialog.Changed:connect(function(prop) + if prop == "Parent" and dialog.Parent then + --This handles the reparenting case, seperate from removal case + removeDialog(dialog) + addDialog(dialog) + elseif prop == "InUse" then + chatGui.Enabled = not currentConversationDialog and not dialog.InUse + if dialog == currentConversationDialog then + timeoutDialog() + end + elseif prop == "Tone" or prop == "Purpose" then + setChatNotificationTone(chatGui, dialog.Purpose, dialog.Tone) + end + end) + else -- still need to listen to parent changes even if current parent is not a BasePart + dialogConnections[dialog] = dialog.Changed:connect(function(prop) + if prop == "Parent" and dialog.Parent then + --This handles the reparenting case, seperate from removal case + removeDialog(dialog) + addDialog(dialog) + end + end) + end + end +end + + +--[[function fetchScripts() + local model = game:GetService("InsertService"):LoadAsset(39226062) + if type(model) == "string" then -- load failed, lets try again + wait(0.1) + model = game:GetService("InsertService"):LoadAsset(39226062) + end + if type(model) == "string" then -- not going to work, lets bail + return + end + + waitForDialogChildrenMyLord(model,"TimeoutScript") + timeoutScript = model.TimeoutScript + waitForDialogChildrenMyLord(model,"ReenableDialogScript") + reenableDialogScript = model.ReenableDialogScript +end +]]-- + +function onLoad() + waitForProperty(game.Players, "LocalPlayer") + player = game.Players.LocalPlayer + waitForProperty(player, "Character") + + --print("Fetching Scripts") + --fetchScripts() + + --print("Creating Guis") + createChatNotificationGui() + + waitForFaker(bois,"Dialogs") + --print("Creating MessageDialog") + createMessageDialog() + messageDialog.Parent = game.Players.LocalPlayer.PlayerGui.Dialogs + + + --print("Initializing Frame") + local frame = Instance.new("Frame") + frame.Name = "DialogFrame" + frame.Position = UDim2.new(0,0,0,0) + frame.Size = UDim2.new(0,0,0,0) + frame.BackgroundTransparency = 1 + frame.Parent = game.Players.LocalPlayer.PlayerGui.Dialogs.ControlFrame.BottomLeftControl + initialize(frame) + + --print("Adding Dialogs") + game.CollectionService.ItemAdded:connect(function(obj) if obj:IsA("Dialog") then addDialog(obj) end end) + game.CollectionService.ItemRemoved:connect(function(obj) if obj:IsA("Dialog") then removeDialog(obj) end end) + for i, obj in pairs(game.CollectionService:GetCollection("Dialog")) do + if obj:IsA("Dialog") then + addDialog(obj) + end + end +end + +onLoad() + true + + + + + + Playerlist + true + + + + false + + Init + --fixed by Carrot#0559 +--for non corescript use +local t = {} + +local function ScopedConnect(parentInstance, instance, event, signalFunc, syncFunc, removeFunc) + local eventConnection = nil + + --Connection on parentInstance is scoped by parentInstance (when destroyed, it goes away) + local tryConnect = function() + if game:IsAncestorOf(parentInstance) then + --Entering the world, make sure we are connected/synced + if not eventConnection then + eventConnection = instance[event]:connect(signalFunc) + if syncFunc then syncFunc() end + end + else + --Probably leaving the world, so disconnect for now + if eventConnection then + eventConnection:disconnect() + if removeFunc then removeFunc() end + end + end + end + + --Hook it up to ancestryChanged signal + local connection = parentInstance.AncestryChanged:connect(tryConnect) + + --Now connect us if we're already in the world + tryConnect() + + return connection +end + +local function getScreenGuiAncestor(instance) + local localInstance = instance + while localInstance and not localInstance:IsA("ScreenGui") do + localInstance = localInstance.Parent + end + return localInstance +end + +local function CreateButtons(frame, buttons, yPos, ySize) + local buttonNum = 1 + local buttonObjs = {} + for i, obj in ipairs(buttons) do + local button = Instance.new("TextButton") + button.Name = "Button" .. buttonNum + button.Font = Enum.Font.Arial + button.FontSize = Enum.FontSize.Size18 + button.AutoButtonColor = true + button.Modal = true + if obj["Style"] then + button.Style = obj.Style + else + button.Style = Enum.ButtonStyle.RobloxButton + end + if obj["ZIndex"] then + button.ZIndex = obj.ZIndex + end + button.Text = obj.Text + button.TextColor3 = Color3.new(1,1,1) + button.MouseButton1Click:connect(obj.Function) + button.Parent = frame + buttonObjs[buttonNum] = button + + buttonNum = buttonNum + 1 + end + local numButtons = buttonNum-1 + + if numButtons == 1 then + frame.Button1.Position = UDim2.new(0.35, 0, yPos.Scale, yPos.Offset) + frame.Button1.Size = UDim2.new(.4,0,ySize.Scale, ySize.Offset) + elseif numButtons == 2 then + frame.Button1.Position = UDim2.new(0.1, 0, yPos.Scale, yPos.Offset) + frame.Button1.Size = UDim2.new(.8/3,0, ySize.Scale, ySize.Offset) + + frame.Button2.Position = UDim2.new(0.55, 0, yPos.Scale, yPos.Offset) + frame.Button2.Size = UDim2.new(.35,0, ySize.Scale, ySize.Offset) + elseif numButtons >= 3 then + local spacing = .1 / numButtons + local buttonSize = .9 / numButtons + + buttonNum = 1 + while buttonNum <= numButtons do + buttonObjs[buttonNum].Position = UDim2.new(spacing*buttonNum + (buttonNum-1) * buttonSize, 0, yPos.Scale, yPos.Offset) + buttonObjs[buttonNum].Size = UDim2.new(buttonSize, 0, ySize.Scale, ySize.Offset) + buttonNum = buttonNum + 1 + end + end +end + +local function setSliderPos(newAbsPosX,slider,sliderPosition,bar,steps) + + local newStep = steps - 1 --otherwise we really get one more step than we want + local relativePosX = math.min(1, math.max(0, (newAbsPosX - bar.AbsolutePosition.X) / bar.AbsoluteSize.X )) + local wholeNum, remainder = math.modf(relativePosX * newStep) + if remainder > 0.5 then + wholeNum = wholeNum + 1 + end + relativePosX = wholeNum/newStep + + local result = math.ceil(relativePosX * newStep) + if sliderPosition.Value ~= (result + 1) then --only update if we moved a step + sliderPosition.Value = result + 1 + slider.Position = UDim2.new(relativePosX,-slider.AbsoluteSize.X/2,slider.Position.Y.Scale,slider.Position.Y.Offset) + end + +end + +local function cancelSlide(areaSoak) + areaSoak.Visible = false + if areaSoakMouseMoveCon then areaSoakMouseMoveCon:disconnect() end +end + +t.CreateStyledMessageDialog = function(title, message, style, buttons) + local frame = Instance.new("Frame") + frame.Size = UDim2.new(0.5, 0, 0, 165) + frame.Position = UDim2.new(0.25, 0, 0.5, -72.5) + frame.Name = "MessageDialog" + frame.Active = true + frame.Style = Enum.FrameStyle.RobloxRound + + local styleImage = Instance.new("ImageLabel") + styleImage.Name = "StyleImage" + styleImage.BackgroundTransparency = 1 + styleImage.Position = UDim2.new(0,5,0,15) + if style == "error" or style == "Error" then + styleImage.Size = UDim2.new(0, 71, 0, 71) + styleImage.Image = "http://www.roblox.com/asset/?id=42565285" + elseif style == "notify" or style == "Notify" then + styleImage.Size = UDim2.new(0, 71, 0, 71) + styleImage.Image = "http://www.roblox.com/asset/?id=42604978" + elseif style == "confirm" or style == "Confirm" then + styleImage.Size = UDim2.new(0, 74, 0, 76) + styleImage.Image = "http://www.roblox.com/asset/?id=42557901" + else + return t.CreateMessageDialog(title,message,buttons) + end + styleImage.Parent = frame + + local titleLabel = Instance.new("TextLabel") + titleLabel.Name = "Title" + titleLabel.Text = title + titleLabel.TextStrokeTransparency = 0 + titleLabel.BackgroundTransparency = 1 + titleLabel.TextColor3 = Color3.new(221/255,221/255,221/255) + titleLabel.Position = UDim2.new(0, 80, 0, 0) + titleLabel.Size = UDim2.new(1, -80, 0, 40) + titleLabel.Font = Enum.Font.ArialBold + titleLabel.FontSize = Enum.FontSize.Size36 + titleLabel.TextXAlignment = Enum.TextXAlignment.Center + titleLabel.TextYAlignment = Enum.TextYAlignment.Center + titleLabel.Parent = frame + + local messageLabel = Instance.new("TextLabel") + messageLabel.Name = "Message" + messageLabel.Text = message + messageLabel.TextStrokeTransparency = 0 + messageLabel.TextColor3 = Color3.new(221/255,221/255,221/255) + messageLabel.Position = UDim2.new(0.025, 80, 0, 45) + messageLabel.Size = UDim2.new(0.95, -80, 0, 55) + messageLabel.BackgroundTransparency = 1 + messageLabel.Font = Enum.Font.Arial + messageLabel.FontSize = Enum.FontSize.Size18 + messageLabel.TextWrap = true + messageLabel.TextXAlignment = Enum.TextXAlignment.Left + messageLabel.TextYAlignment = Enum.TextYAlignment.Top + messageLabel.Parent = frame + + CreateButtons(frame, buttons, UDim.new(0, 105), UDim.new(0, 40) ) + + return frame +end + +t.CreateMessageDialog = function(title, message, buttons) + local frame = Instance.new("Frame") + frame.Size = UDim2.new(0.5, 0, 0.5, 0) + frame.Position = UDim2.new(0.25, 0, 0.25, 0) + frame.Name = "MessageDialog" + frame.Active = true + frame.Style = Enum.FrameStyle.RobloxRound + + local titleLabel = Instance.new("TextLabel") + titleLabel.Name = "Title" + titleLabel.Text = title + titleLabel.BackgroundTransparency = 1 + titleLabel.TextColor3 = Color3.new(221/255,221/255,221/255) + titleLabel.Position = UDim2.new(0, 0, 0, 0) + titleLabel.Size = UDim2.new(1, 0, 0.15, 0) + titleLabel.Font = Enum.Font.ArialBold + titleLabel.FontSize = Enum.FontSize.Size36 + titleLabel.TextXAlignment = Enum.TextXAlignment.Center + titleLabel.TextYAlignment = Enum.TextYAlignment.Center + titleLabel.Parent = frame + + local messageLabel = Instance.new("TextLabel") + messageLabel.Name = "Message" + messageLabel.Text = message + messageLabel.TextColor3 = Color3.new(221/255,221/255,221/255) + messageLabel.Position = UDim2.new(0.025, 0, 0.175, 0) + messageLabel.Size = UDim2.new(0.95, 0, .55, 0) + messageLabel.BackgroundTransparency = 1 + messageLabel.Font = Enum.Font.Arial + messageLabel.FontSize = Enum.FontSize.Size18 + messageLabel.TextWrap = true + messageLabel.TextXAlignment = Enum.TextXAlignment.Left + messageLabel.TextYAlignment = Enum.TextYAlignment.Top + messageLabel.Parent = frame + + CreateButtons(frame, buttons, UDim.new(0.8,0), UDim.new(0.15, 0)) + + return frame +end + +t.CreateDropDownMenu = function(items, onSelect, forRoblox, whiteSkin, baseZ) + local baseZIndex = 0 + if (type(baseZ) == "number") then + baseZIndex = baseZ + end + local width = UDim.new(0, 100) + local height = UDim.new(0, 32) + + local xPos = 0.055 + local frame = Instance.new("Frame") + local textColor = Color3.new(1,1,1) + if (whiteSkin) then + textColor = Color3.new(0.5, 0.5, 0.5) + end + frame.Name = "DropDownMenu" + frame.BackgroundTransparency = 1 + frame.Size = UDim2.new(width, height) + + local dropDownMenu = Instance.new("TextButton") + dropDownMenu.Name = "DropDownMenuButton" + dropDownMenu.TextWrap = true + dropDownMenu.TextColor3 = textColor + dropDownMenu.Text = "Choose One" + dropDownMenu.Font = Enum.Font.ArialBold + dropDownMenu.FontSize = Enum.FontSize.Size18 + dropDownMenu.TextXAlignment = Enum.TextXAlignment.Left + dropDownMenu.TextYAlignment = Enum.TextYAlignment.Center + dropDownMenu.BackgroundTransparency = 1 + dropDownMenu.AutoButtonColor = true + if (whiteSkin) then + dropDownMenu.Style = Enum.ButtonStyle.RobloxRoundDropdownButton + else + dropDownMenu.Style = Enum.ButtonStyle.RobloxButton + end + dropDownMenu.Size = UDim2.new(1,0,1,0) + dropDownMenu.Parent = frame + dropDownMenu.ZIndex = 2 + baseZIndex + + local dropDownIcon = Instance.new("ImageLabel") + dropDownIcon.Name = "Icon" + dropDownIcon.Active = false + if (whiteSkin) then + dropDownIcon.Image = "rbxasset://textures/ui/dropdown_arrow.png" + dropDownIcon.Size = UDim2.new(0,16,0,12) + dropDownIcon.Position = UDim2.new(1,-17,0.5, -6) + else + dropDownIcon.Image = "http://www.roblox.com/asset/?id=45732894" + dropDownIcon.Size = UDim2.new(0,11,0,6) + dropDownIcon.Position = UDim2.new(1,-11,0.5, -2) + end + dropDownIcon.BackgroundTransparency = 1 + dropDownIcon.Parent = dropDownMenu + dropDownIcon.ZIndex = 2 + baseZIndex + + local itemCount = #items + local dropDownItemCount = #items + local useScrollButtons = false + if dropDownItemCount > 6 then + useScrollButtons = true + dropDownItemCount = 6 + end + + local droppedDownMenu = Instance.new("TextButton") + droppedDownMenu.Name = "List" + droppedDownMenu.Text = "" + droppedDownMenu.BackgroundTransparency = 1 + --droppedDownMenu.AutoButtonColor = true + if (whiteSkin) then + droppedDownMenu.Style = Enum.ButtonStyle.RobloxRoundDropdownButton + else + droppedDownMenu.Style = Enum.ButtonStyle.RobloxButton + end + droppedDownMenu.Visible = false + droppedDownMenu.Active = true --Blocks clicks + droppedDownMenu.Position = UDim2.new(0,0,0,0) + droppedDownMenu.Size = UDim2.new(1,0, (1 + dropDownItemCount)*.8, 0) + droppedDownMenu.Parent = frame + droppedDownMenu.ZIndex = 2 + baseZIndex + + local choiceButton = Instance.new("TextButton") + choiceButton.Name = "ChoiceButton" + choiceButton.BackgroundTransparency = 1 + choiceButton.BorderSizePixel = 0 + choiceButton.Text = "ReplaceMe" + choiceButton.TextColor3 = textColor + choiceButton.TextXAlignment = Enum.TextXAlignment.Left + choiceButton.TextYAlignment = Enum.TextYAlignment.Center + choiceButton.BackgroundColor3 = Color3.new(1, 1, 1) + choiceButton.Font = Enum.Font.Arial + choiceButton.FontSize = Enum.FontSize.Size18 + if useScrollButtons then + choiceButton.Size = UDim2.new(1,-13, .8/((dropDownItemCount + 1)*.8),0) + else + choiceButton.Size = UDim2.new(1, 0, .8/((dropDownItemCount + 1)*.8),0) + end + choiceButton.TextWrap = true + choiceButton.ZIndex = 2 + baseZIndex + + local areaSoak = Instance.new("TextButton") + areaSoak.Name = "AreaSoak" + areaSoak.Text = "" + areaSoak.BackgroundTransparency = 1 + areaSoak.Active = true + areaSoak.Size = UDim2.new(1,0,1,0) + areaSoak.Visible = false + areaSoak.ZIndex = 3 + baseZIndex + + local dropDownSelected = false + + local scrollUpButton + local scrollDownButton + local scrollMouseCount = 0 + + local setZIndex = function(baseZIndex) + droppedDownMenu.ZIndex = baseZIndex +1 + if scrollUpButton then + scrollUpButton.ZIndex = baseZIndex + 3 + end + if scrollDownButton then + scrollDownButton.ZIndex = baseZIndex + 3 + end + + local children = droppedDownMenu:GetChildren() + if children then + for i, child in ipairs(children) do + if child.Name == "ChoiceButton" then + child.ZIndex = baseZIndex + 2 + elseif child.Name == "ClickCaptureButton" then + child.ZIndex = baseZIndex + end + end + end + end + + local scrollBarPosition = 1 + local updateScroll = function() + if scrollUpButton then + scrollUpButton.Active = scrollBarPosition > 1 + end + if scrollDownButton then + scrollDownButton.Active = scrollBarPosition + dropDownItemCount <= itemCount + end + + local children = droppedDownMenu:GetChildren() + if not children then return end + + local childNum = 1 + for i, obj in ipairs(children) do + if obj.Name == "ChoiceButton" then + if childNum < scrollBarPosition or childNum >= scrollBarPosition + dropDownItemCount then + obj.Visible = false + else + obj.Position = UDim2.new(0,0,((childNum-scrollBarPosition+1)*.8)/((dropDownItemCount+1)*.8),0) + obj.Visible = true + end + obj.TextColor3 = textColor + obj.BackgroundTransparency = 1 + + childNum = childNum + 1 + end + end + end + local toggleVisibility = function() + dropDownSelected = not dropDownSelected + + areaSoak.Visible = not areaSoak.Visible + dropDownMenu.Visible = not dropDownSelected + droppedDownMenu.Visible = dropDownSelected + if dropDownSelected then + setZIndex(4 + baseZIndex) + else + setZIndex(2 + baseZIndex) + end + if useScrollButtons then + updateScroll() + end + end + droppedDownMenu.MouseButton1Click:connect(toggleVisibility) + + local updateSelection = function(text) + local foundItem = false + local children = droppedDownMenu:GetChildren() + local childNum = 1 + if children then + for i, obj in ipairs(children) do + if obj.Name == "ChoiceButton" then + if obj.Text == text then + obj.Font = Enum.Font.ArialBold + foundItem = true + scrollBarPosition = childNum + if (whiteSkin) then + obj.TextColor3 = Color3.new(90/255,142/255,233/255) + end + else + obj.Font = Enum.Font.Arial + if (whiteSkin) then + obj.TextColor3 = textColor + end + end + childNum = childNum + 1 + end + end + end + if not text then + dropDownMenu.Text = "Choose One" + scrollBarPosition = 1 + else + if not foundItem then + error("Invalid Selection Update -- " .. text) + end + + if scrollBarPosition + dropDownItemCount > itemCount + 1 then + scrollBarPosition = itemCount - dropDownItemCount + 1 + end + + dropDownMenu.Text = text + end + end + + local function scrollDown() + if scrollBarPosition + dropDownItemCount <= itemCount then + scrollBarPosition = scrollBarPosition + 1 + updateScroll() + return true + end + return false + end + local function scrollUp() + if scrollBarPosition > 1 then + scrollBarPosition = scrollBarPosition - 1 + updateScroll() + return true + end + return false + end + + if useScrollButtons then + --Make some scroll buttons + scrollUpButton = Instance.new("ImageButton") + scrollUpButton.Name = "ScrollUpButton" + scrollUpButton.BackgroundTransparency = 1 + scrollUpButton.Image = "rbxasset://textures/ui/scrollbuttonUp.png" + scrollUpButton.Size = UDim2.new(0,17,0,17) + scrollUpButton.Position = UDim2.new(1,-11,(1*.8)/((dropDownItemCount+1)*.8),0) + scrollUpButton.MouseButton1Click:connect( + function() + scrollMouseCount = scrollMouseCount + 1 + end) + scrollUpButton.MouseLeave:connect( + function() + scrollMouseCount = scrollMouseCount + 1 + end) + scrollUpButton.MouseButton1Down:connect( + function() + scrollMouseCount = scrollMouseCount + 1 + + scrollUp() + local val = scrollMouseCount + wait(0.5) + while val == scrollMouseCount do + if scrollUp() == false then + break + end + wait(0.1) + end + end) + + scrollUpButton.Parent = droppedDownMenu + + scrollDownButton = Instance.new("ImageButton") + scrollDownButton.Name = "ScrollDownButton" + scrollDownButton.BackgroundTransparency = 1 + scrollDownButton.Image = "rbxasset://textures/ui/scrollbuttonDown.png" + scrollDownButton.Size = UDim2.new(0,17,0,17) + scrollDownButton.Position = UDim2.new(1,-11,1,-11) + scrollDownButton.Parent = droppedDownMenu + scrollDownButton.MouseButton1Click:connect( + function() + scrollMouseCount = scrollMouseCount + 1 + end) + scrollDownButton.MouseLeave:connect( + function() + scrollMouseCount = scrollMouseCount + 1 + end) + scrollDownButton.MouseButton1Down:connect( + function() + scrollMouseCount = scrollMouseCount + 1 + + scrollDown() + local val = scrollMouseCount + wait(0.5) + while val == scrollMouseCount do + if scrollDown() == false then + break + end + wait(0.1) + end + end) + + local scrollbar = Instance.new("ImageLabel") + scrollbar.Name = "ScrollBar" + scrollbar.Image = "rbxasset://textures/ui/scrollbar.png" + scrollbar.BackgroundTransparency = 1 + scrollbar.Size = UDim2.new(0, 18, (dropDownItemCount*.8)/((dropDownItemCount+1)*.8), -(17) - 11 - 4) + scrollbar.Position = UDim2.new(1,-11,(1*.8)/((dropDownItemCount+1)*.8),17+2) + scrollbar.Parent = droppedDownMenu + end + + for i,item in ipairs(items) do + -- needed to maintain local scope for items in event listeners below + local button = choiceButton:clone() + if forRoblox then + button.RobloxLocked = true + end + button.Text = item + button.Parent = droppedDownMenu + if (whiteSkin) then + button.TextColor3 = textColor + end + + button.MouseButton1Click:connect(function() + --Remove Highlight + if (not whiteSkin) then + button.TextColor3 = Color3.new(1,1,1) + end + button.BackgroundTransparency = 1 + + updateSelection(item) + onSelect(item) + + toggleVisibility() + end) + button.MouseEnter:connect(function() + --Add Highlight + if (not whiteSkin) then + button.TextColor3 = Color3.new(0,0,0) + end + button.BackgroundTransparency = 0 + end) + + button.MouseLeave:connect(function() + --Remove Highlight + if (not whiteSkin) then + button.TextColor3 = Color3.new(1,1,1) + end + button.BackgroundTransparency = 1 + end) + end + + --This does the initial layout of the buttons + updateScroll() + + frame.AncestryChanged:connect(function(child,parent) + if parent == nil then + areaSoak.Parent = nil + else + areaSoak.Parent = getScreenGuiAncestor(frame) + end + end) + + dropDownMenu.MouseButton1Click:connect(toggleVisibility) + areaSoak.MouseButton1Click:connect(toggleVisibility) + return frame, updateSelection +end + +t.CreatePropertyDropDownMenu = function(instance, property, enum) + + local items = enum:GetEnumItems() + local names = {} + local nameToItem = {} + for i,obj in ipairs(items) do + names[i] = obj.Name + nameToItem[obj.Name] = obj + end + + local frame + local updateSelection + frame, updateSelection = t.CreateDropDownMenu(names, function(text) instance[property] = nameToItem[text] end) + + ScopedConnect(frame, instance, "Changed", + function(prop) + if prop == property then + updateSelection(instance[property].Name) + end + end, + function() + updateSelection(instance[property].Name) + end) + + return frame +end + +t.GetFontHeight = function(font, fontSize) + if font == nil or fontSize == nil then + error("Font and FontSize must be non-nil") + end + + if font == Enum.Font.Legacy then + if fontSize == Enum.FontSize.Size8 then + return 12 + elseif fontSize == Enum.FontSize.Size9 then + return 14 + elseif fontSize == Enum.FontSize.Size10 then + return 15 + elseif fontSize == Enum.FontSize.Size11 then + return 17 + elseif fontSize == Enum.FontSize.Size12 then + return 18 + elseif fontSize == Enum.FontSize.Size14 then + return 21 + elseif fontSize == Enum.FontSize.Size18 then + return 27 + elseif fontSize == Enum.FontSize.Size24 then + return 36 + elseif fontSize == Enum.FontSize.Size36 then + return 54 + elseif fontSize == Enum.FontSize.Size48 then + return 72 + else + error("Unknown FontSize") + end + elseif font == Enum.Font.Arial or font == Enum.Font.ArialBold then + if fontSize == Enum.FontSize.Size8 then + return 8 + elseif fontSize == Enum.FontSize.Size9 then + return 9 + elseif fontSize == Enum.FontSize.Size10 then + return 10 + elseif fontSize == Enum.FontSize.Size11 then + return 11 + elseif fontSize == Enum.FontSize.Size12 then + return 12 + elseif fontSize == Enum.FontSize.Size14 then + return 14 + elseif fontSize == Enum.FontSize.Size18 then + return 18 + elseif fontSize == Enum.FontSize.Size24 then + return 24 + elseif fontSize == Enum.FontSize.Size36 then + return 36 + elseif fontSize == Enum.FontSize.Size48 then + return 48 + else + error("Unknown FontSize") + end + else + error("Unknown Font " .. font) + end +end + +local function layoutGuiObjectsHelper(frame, guiObjects, settingsTable) + local totalPixels = frame.AbsoluteSize.Y + local pixelsRemaining = frame.AbsoluteSize.Y + for i, child in ipairs(guiObjects) do + if child:IsA("TextLabel") or child:IsA("TextButton") then + local isLabel = child:IsA("TextLabel") + if isLabel then + pixelsRemaining = pixelsRemaining - settingsTable["TextLabelPositionPadY"] + else + pixelsRemaining = pixelsRemaining - settingsTable["TextButtonPositionPadY"] + end + child.Position = UDim2.new(child.Position.X.Scale, child.Position.X.Offset, 0, totalPixels - pixelsRemaining) + child.Size = UDim2.new(child.Size.X.Scale, child.Size.X.Offset, 0, pixelsRemaining) + + if child.TextFits and child.TextBounds.Y < pixelsRemaining then + child.Visible = true + if isLabel then + child.Size = UDim2.new(child.Size.X.Scale, child.Size.X.Offset, 0, child.TextBounds.Y + settingsTable["TextLabelSizePadY"]) + else + child.Size = UDim2.new(child.Size.X.Scale, child.Size.X.Offset, 0, child.TextBounds.Y + settingsTable["TextButtonSizePadY"]) + end + + while not child.TextFits do + child.Size = UDim2.new(child.Size.X.Scale, child.Size.X.Offset, 0, child.AbsoluteSize.Y + 1) + end + pixelsRemaining = pixelsRemaining - child.AbsoluteSize.Y + + if isLabel then + pixelsRemaining = pixelsRemaining - settingsTable["TextLabelPositionPadY"] + else + pixelsRemaining = pixelsRemaining - settingsTable["TextButtonPositionPadY"] + end + else + child.Visible = false + pixelsRemaining = -1 + end + + else + --GuiObject + child.Position = UDim2.new(child.Position.X.Scale, child.Position.X.Offset, 0, totalPixels - pixelsRemaining) + pixelsRemaining = pixelsRemaining - child.AbsoluteSize.Y + child.Visible = (pixelsRemaining >= 0) + end + end +end + +t.LayoutGuiObjects = function(frame, guiObjects, settingsTable) + if not frame:IsA("GuiObject") then + error("Frame must be a GuiObject") + end + for i, child in ipairs(guiObjects) do + if not child:IsA("GuiObject") then + error("All elements that are layed out must be of type GuiObject") + end + end + + if not settingsTable then + settingsTable = {} + end + + if not settingsTable["TextLabelSizePadY"] then + settingsTable["TextLabelSizePadY"] = 0 + end + if not settingsTable["TextLabelPositionPadY"] then + settingsTable["TextLabelPositionPadY"] = 0 + end + if not settingsTable["TextButtonSizePadY"] then + settingsTable["TextButtonSizePadY"] = 12 + end + if not settingsTable["TextButtonPositionPadY"] then + settingsTable["TextButtonPositionPadY"] = 2 + end + + --Wrapper frame takes care of styled objects + local wrapperFrame = Instance.new("Frame") + wrapperFrame.Name = "WrapperFrame" + wrapperFrame.BackgroundTransparency = 1 + wrapperFrame.Size = UDim2.new(1,0,1,0) + wrapperFrame.Parent = frame + + for i, child in ipairs(guiObjects) do + child.Parent = wrapperFrame + end + + local recalculate = function() + wait() + layoutGuiObjectsHelper(wrapperFrame, guiObjects, settingsTable) + end + + frame.Changed:connect( + function(prop) + if prop == "AbsoluteSize" then + --Wait a heartbeat for it to sync in + recalculate(nil) + end + end) + frame.AncestryChanged:connect(recalculate) + + layoutGuiObjectsHelper(wrapperFrame, guiObjects, settingsTable) +end + + +t.CreateSlider = function(steps,width,position) + local sliderGui = Instance.new("Frame") + sliderGui.Size = UDim2.new(1,0,1,0) + sliderGui.BackgroundTransparency = 1 + sliderGui.Name = "SliderGui" + + local sliderSteps = Instance.new("IntValue") + sliderSteps.Name = "SliderSteps" + sliderSteps.Value = steps + sliderSteps.Parent = sliderGui + + local areaSoak = Instance.new("TextButton") + areaSoak.Name = "AreaSoak" + areaSoak.Text = "" + areaSoak.BackgroundTransparency = 1 + areaSoak.Active = false + areaSoak.Size = UDim2.new(1,0,1,0) + areaSoak.Visible = false + areaSoak.ZIndex = 4 + + sliderGui.AncestryChanged:connect(function(child,parent) + if parent == nil then + areaSoak.Parent = nil + else + areaSoak.Parent = getScreenGuiAncestor(sliderGui) + end + end) + + local sliderPosition = Instance.new("IntValue") + sliderPosition.Name = "SliderPosition" + sliderPosition.Value = 0 + sliderPosition.Parent = sliderGui + + local id = math.random(1,100) + + local bar = Instance.new("TextButton") + bar.Text = "" + bar.AutoButtonColor = false + bar.Name = "Bar" + bar.BackgroundColor3 = Color3.new(0,0,0) + if type(width) == "number" then + bar.Size = UDim2.new(0,width,0,5) + else + bar.Size = UDim2.new(0,200,0,5) + end + bar.BorderColor3 = Color3.new(95/255,95/255,95/255) + bar.ZIndex = 2 + bar.Parent = sliderGui + + if position["X"] and position["X"]["Scale"] and position["X"]["Offset"] and position["Y"] and position["Y"]["Scale"] and position["Y"]["Offset"] then + bar.Position = position + end + + local slider = Instance.new("ImageButton") + slider.Name = "Slider" + slider.BackgroundTransparency = 1 + slider.Image = "rbxasset://textures/ui/Slider.png" + slider.Position = UDim2.new(0,0,0.5,-10) + slider.Size = UDim2.new(0,20,0,20) + slider.ZIndex = 3 + slider.Parent = bar + + local areaSoakMouseMoveCon = nil + + areaSoak.MouseLeave:connect(function() + if areaSoak.Visible then + cancelSlide(areaSoak) + end + end) + areaSoak.MouseButton1Up:connect(function() + if areaSoak.Visible then + cancelSlide(areaSoak) + end + end) + + slider.MouseButton1Down:connect(function() + areaSoak.Visible = true + if areaSoakMouseMoveCon then areaSoakMouseMoveCon:disconnect() end + areaSoakMouseMoveCon = areaSoak.MouseMoved:connect(function(x,y) + setSliderPos(x,slider,sliderPosition,bar,steps) + end) + end) + + slider.MouseButton1Up:connect(function() cancelSlide(areaSoak) end) + + sliderPosition.Changed:connect(function(prop) + sliderPosition.Value = math.min(steps, math.max(1,sliderPosition.Value)) + local relativePosX = (sliderPosition.Value - 1) / (steps - 1) + slider.Position = UDim2.new(relativePosX,-slider.AbsoluteSize.X/2,slider.Position.Y.Scale,slider.Position.Y.Offset) + end) + + bar.MouseButton1Down:connect(function(x,y) + setSliderPos(x,slider,sliderPosition,bar,steps) + end) + + return sliderGui, sliderPosition, sliderSteps + +end + + + +t.CreateSliderNew = function(steps,width,position) + local sliderGui = Instance.new("Frame") + sliderGui.Size = UDim2.new(1,0,1,0) + sliderGui.BackgroundTransparency = 1 + sliderGui.Name = "SliderGui" + + local sliderSteps = Instance.new("IntValue") + sliderSteps.Name = "SliderSteps" + sliderSteps.Value = steps + sliderSteps.Parent = sliderGui + + local areaSoak = Instance.new("TextButton") + areaSoak.Name = "AreaSoak" + areaSoak.Text = "" + areaSoak.BackgroundTransparency = 1 + areaSoak.Active = false + areaSoak.Size = UDim2.new(1,0,1,0) + areaSoak.Visible = false + areaSoak.ZIndex = 6 + + sliderGui.AncestryChanged:connect(function(child,parent) + if parent == nil then + areaSoak.Parent = nil + else + areaSoak.Parent = getScreenGuiAncestor(sliderGui) + end + end) + + local sliderPosition = Instance.new("IntValue") + sliderPosition.Name = "SliderPosition" + sliderPosition.Value = 0 + sliderPosition.Parent = sliderGui + + local id = math.random(1,100) + + local sliderBarImgHeight = 7 + local sliderBarCapImgWidth = 4 + + local bar = Instance.new("ImageButton") + bar.BackgroundTransparency = 1 + bar.Image = "rbxasset://textures/ui/Slider-BKG-Center.png" + bar.Name = "Bar" + local displayWidth = 200 + if type(width) == "number" then + bar.Size = UDim2.new(0,width - (sliderBarCapImgWidth * 2),0,sliderBarImgHeight) + displayWidth = width - (sliderBarCapImgWidth * 2) + else + bar.Size = UDim2.new(0,200,0,sliderBarImgHeight) + end + bar.ZIndex = 3 + bar.Parent = sliderGui + if position["X"] and position["X"]["Scale"] and position["X"]["Offset"] and position["Y"] and position["Y"]["Scale"] and position["Y"]["Offset"] then + bar.Position = position + end + + local barLeft = bar:clone() + barLeft.Name = "BarLeft" + barLeft.Image = "rbxasset://textures/ui/Slider-BKG-Left-Cap.png" + barLeft.Size = UDim2.new(0, sliderBarCapImgWidth, 0, sliderBarImgHeight) + barLeft.Position = UDim2.new(position.X.Scale, position.X.Offset - sliderBarCapImgWidth, position.Y.Scale, position.Y.Offset) + barLeft.Parent = sliderGui + barLeft.ZIndex = 3 + + local barRight = barLeft:clone() + barRight.Name = "BarRight" + barRight.Image = "rbxasset://textures/ui/Slider-BKG-Right-Cap.png" + barRight.Position = UDim2.new(position.X.Scale, position.X.Offset + displayWidth, position.Y.Scale, position.Y.Offset) + barRight.Parent = sliderGui + + local fillLeft = barLeft:clone() + fillLeft.Name = "FillLeft" + fillLeft.Image = "rbxasset://textures/ui/Slider-Fill-Left-Cap.png" + fillLeft.Parent = sliderGui + fillLeft.ZIndex = 4 + + local fill = fillLeft:clone() + fill.Name = "Fill" + fill.Image = "rbxasset://textures/ui/Slider-Fill-Center.png" + fill.Parent = bar + fill.ZIndex = 4 + fill.Position = UDim2.new(0, 0, 0, 0) + fill.Size = UDim2.new(0.5, 0, 1, 0) + + +-- bar.Visible = false + + local slider = Instance.new("ImageButton") + slider.Name = "Slider" + slider.BackgroundTransparency = 1 + slider.Image = "rbxasset://textures/ui/slider_new_tab.png" + slider.Position = UDim2.new(0,0,0.5,-14) + slider.Size = UDim2.new(0,28,0,28) + slider.ZIndex = 5 + slider.Parent = bar + + local areaSoakMouseMoveCon = nil + + areaSoak.MouseLeave:connect(function() + if areaSoak.Visible then + cancelSlide(areaSoak) + end + end) + areaSoak.MouseButton1Up:connect(function() + if areaSoak.Visible then + cancelSlide(areaSoak) + end + end) + + slider.MouseButton1Down:connect(function() + areaSoak.Visible = true + if areaSoakMouseMoveCon then areaSoakMouseMoveCon:disconnect() end + areaSoakMouseMoveCon = areaSoak.MouseMoved:connect(function(x,y) + setSliderPos(x,slider,sliderPosition,bar,steps) + end) + end) + + slider.MouseButton1Up:connect(function() cancelSlide(areaSoak) end) + + sliderPosition.Changed:connect(function(prop) + sliderPosition.Value = math.min(steps, math.max(1,sliderPosition.Value)) + local relativePosX = (sliderPosition.Value - 1) / (steps - 1) + slider.Position = UDim2.new(relativePosX,-slider.AbsoluteSize.X/2,slider.Position.Y.Scale,slider.Position.Y.Offset) + fill.Size = UDim2.new(relativePosX, 0, 1, 0) + end) + + bar.MouseButton1Down:connect(function(x,y) + setSliderPos(x,slider,sliderPosition,bar,steps) + end) + + return sliderGui, sliderPosition, sliderSteps + +end + + + + + +t.CreateTrueScrollingFrame = function() + local lowY = nil + local highY = nil + + local dragCon = nil + local upCon = nil + + local internalChange = false + + local descendantsChangeConMap = {} + + local scrollingFrame = Instance.new("Frame") + scrollingFrame.Name = "ScrollingFrame" + scrollingFrame.Active = true + scrollingFrame.Size = UDim2.new(1,0,1,0) + scrollingFrame.ClipsDescendants = true + + local controlFrame = Instance.new("Frame") + controlFrame.Name = "ControlFrame" + controlFrame.BackgroundTransparency = 1 + controlFrame.Size = UDim2.new(0,18,1,0) + controlFrame.Position = UDim2.new(1,-20,0,0) + controlFrame.Parent = scrollingFrame + + local scrollBottom = Instance.new("BoolValue") + scrollBottom.Value = false + scrollBottom.Name = "ScrollBottom" + scrollBottom.Parent = controlFrame + + local scrollUp = Instance.new("BoolValue") + scrollUp.Value = false + scrollUp.Name = "scrollUp" + scrollUp.Parent = controlFrame + + local scrollUpButton = Instance.new("TextButton") + scrollUpButton.Name = "ScrollUpButton" + scrollUpButton.Text = "" + scrollUpButton.AutoButtonColor = false + scrollUpButton.BackgroundColor3 = Color3.new(0,0,0) + scrollUpButton.BorderColor3 = Color3.new(1,1,1) + scrollUpButton.BackgroundTransparency = 0.5 + scrollUpButton.Size = UDim2.new(0,18,0,18) + scrollUpButton.ZIndex = 2 + scrollUpButton.Parent = controlFrame + for i = 1, 6 do + local triFrame = Instance.new("Frame") + triFrame.BorderColor3 = Color3.new(1,1,1) + triFrame.Name = "tri" .. tostring(i) + triFrame.ZIndex = 3 + triFrame.BackgroundTransparency = 0.5 + triFrame.Size = UDim2.new(0,12 - ((i -1) * 2),0,0) + triFrame.Position = UDim2.new(0,3 + (i -1),0.5,2 - (i -1)) + triFrame.Parent = scrollUpButton + end + scrollUpButton.MouseEnter:connect(function() + scrollUpButton.BackgroundTransparency = 0.1 + local upChildren = scrollUpButton:GetChildren() + for i = 1, #upChildren do + upChildren[i].BackgroundTransparency = 0.1 + end + end) + scrollUpButton.MouseLeave:connect(function() + scrollUpButton.BackgroundTransparency = 0.5 + local upChildren = scrollUpButton:GetChildren() + for i = 1, #upChildren do + upChildren[i].BackgroundTransparency = 0.5 + end + end) + + local scrollDownButton = scrollUpButton:clone() + scrollDownButton.Name = "ScrollDownButton" + scrollDownButton.Position = UDim2.new(0,0,1,-18) + local downChildren = scrollDownButton:GetChildren() + for i = 1, #downChildren do + downChildren[i].Position = UDim2.new(0,3 + (i -1),0.5,-2 + (i - 1)) + end + scrollDownButton.MouseEnter:connect(function() + scrollDownButton.BackgroundTransparency = 0.1 + local downChildren = scrollDownButton:GetChildren() + for i = 1, #downChildren do + downChildren[i].BackgroundTransparency = 0.1 + end + end) + scrollDownButton.MouseLeave:connect(function() + scrollDownButton.BackgroundTransparency = 0.5 + local downChildren = scrollDownButton:GetChildren() + for i = 1, #downChildren do + downChildren[i].BackgroundTransparency = 0.5 + end + end) + scrollDownButton.Parent = controlFrame + + local scrollTrack = Instance.new("Frame") + scrollTrack.Name = "ScrollTrack" + scrollTrack.BackgroundTransparency = 1 + scrollTrack.Size = UDim2.new(0,18,1,-38) + scrollTrack.Position = UDim2.new(0,0,0,19) + scrollTrack.Parent = controlFrame + + local scrollbar = Instance.new("TextButton") + scrollbar.BackgroundColor3 = Color3.new(0,0,0) + scrollbar.BorderColor3 = Color3.new(1,1,1) + scrollbar.BackgroundTransparency = 0.5 + scrollbar.AutoButtonColor = false + scrollbar.Text = "" + scrollbar.Active = true + scrollbar.Name = "ScrollBar" + scrollbar.ZIndex = 2 + scrollbar.BackgroundTransparency = 0.5 + scrollbar.Size = UDim2.new(0, 18, 0.1, 0) + scrollbar.Position = UDim2.new(0,0,0,0) + scrollbar.Parent = scrollTrack + + local scrollNub = Instance.new("Frame") + scrollNub.Name = "ScrollNub" + scrollNub.BorderColor3 = Color3.new(1,1,1) + scrollNub.Size = UDim2.new(0,10,0,0) + scrollNub.Position = UDim2.new(0.5,-5,0.5,0) + scrollNub.ZIndex = 2 + scrollNub.BackgroundTransparency = 0.5 + scrollNub.Parent = scrollbar + + local newNub = scrollNub:clone() + newNub.Position = UDim2.new(0.5,-5,0.5,-2) + newNub.Parent = scrollbar + + local lastNub = scrollNub:clone() + lastNub.Position = UDim2.new(0.5,-5,0.5,2) + lastNub.Parent = scrollbar + + scrollbar.MouseEnter:connect(function() + scrollbar.BackgroundTransparency = 0.1 + scrollNub.BackgroundTransparency = 0.1 + newNub.BackgroundTransparency = 0.1 + lastNub.BackgroundTransparency = 0.1 + end) + scrollbar.MouseLeave:connect(function() + scrollbar.BackgroundTransparency = 0.5 + scrollNub.BackgroundTransparency = 0.5 + newNub.BackgroundTransparency = 0.5 + lastNub.BackgroundTransparency = 0.5 + end) + + local mouseDrag = Instance.new("ImageButton") + mouseDrag.Active = false + mouseDrag.Size = UDim2.new(1.5, 0, 1.5, 0) + mouseDrag.AutoButtonColor = false + mouseDrag.BackgroundTransparency = 1 + mouseDrag.Name = "mouseDrag" + mouseDrag.Position = UDim2.new(-0.25, 0, -0.25, 0) + mouseDrag.ZIndex = 10 + + local function positionScrollBar(x,y,offset) + local oldPos = scrollbar.Position + + if y < scrollTrack.AbsolutePosition.y then + scrollbar.Position = UDim2.new(scrollbar.Position.X.Scale,scrollbar.Position.X.Offset,0,0) + return (oldPos ~= scrollbar.Position) + end + + local relativeSize = scrollbar.AbsoluteSize.Y/scrollTrack.AbsoluteSize.Y + + if y > (scrollTrack.AbsolutePosition.y + scrollTrack.AbsoluteSize.y) then + scrollbar.Position = UDim2.new(scrollbar.Position.X.Scale,scrollbar.Position.X.Offset,1 - relativeSize,0) + return (oldPos ~= scrollbar.Position) + end + local newScaleYPos = (y - scrollTrack.AbsolutePosition.y - offset)/scrollTrack.AbsoluteSize.y + if newScaleYPos + relativeSize > 1 then + newScaleYPos = 1 - relativeSize + scrollBottom.Value = true + scrollUp.Value = false + elseif newScaleYPos <= 0 then + newScaleYPos = 0 + scrollUp.Value = true + scrollBottom.Value = false + else + scrollUp.Value = false + scrollBottom.Value = false + end + scrollbar.Position = UDim2.new(scrollbar.Position.X.Scale,scrollbar.Position.X.Offset,newScaleYPos,0) + + return (oldPos ~= scrollbar.Position) + end + + local function drillDownSetHighLow(instance) + if not instance or not instance:IsA("GuiObject") then return end + if instance == controlFrame then return end + if instance:IsDescendantOf(controlFrame) then return end + if not instance.Visible then return end + + if lowY and lowY > instance.AbsolutePosition.Y then + lowY = instance.AbsolutePosition.Y + elseif not lowY then + lowY = instance.AbsolutePosition.Y + end + if highY and highY < (instance.AbsolutePosition.Y + instance.AbsoluteSize.Y) then + highY = instance.AbsolutePosition.Y + instance.AbsoluteSize.Y + elseif not highY then + highY = instance.AbsolutePosition.Y + instance.AbsoluteSize.Y + end + local children = instance:GetChildren() + for i = 1, #children do + drillDownSetHighLow(children[i]) + end + end + + local function resetHighLow() + local firstChildren = scrollingFrame:GetChildren() + + for i = 1, #firstChildren do + drillDownSetHighLow(firstChildren[i]) + end + end + + local function recalculate() + internalChange = true + + local percentFrame = 0 + if scrollbar.Position.Y.Scale > 0 then + if scrollbar.Visible then + percentFrame = scrollbar.Position.Y.Scale/((scrollTrack.AbsoluteSize.Y - scrollbar.AbsoluteSize.Y)/scrollTrack.AbsoluteSize.Y) + else + percentFrame = 0 + end + end + if percentFrame > 0.99 then percentFrame = 1 end + + local hiddenYAmount = (scrollingFrame.AbsoluteSize.Y - (highY - lowY)) * percentFrame + + local guiChildren = scrollingFrame:GetChildren() + for i = 1, #guiChildren do + if guiChildren[i] ~= controlFrame then + guiChildren[i].Position = UDim2.new(guiChildren[i].Position.X.Scale,guiChildren[i].Position.X.Offset, + 0, math.ceil(guiChildren[i].AbsolutePosition.Y) - math.ceil(lowY) + hiddenYAmount) + end + end + + lowY = nil + highY = nil + resetHighLow() + internalChange = false + end + + local function setSliderSizeAndPosition() + if not highY or not lowY then return end + + local totalYSpan = math.abs(highY - lowY) + if totalYSpan == 0 then + scrollbar.Visible = false + scrollDownButton.Visible = false + scrollUpButton.Visible = false + + if dragCon then dragCon:disconnect() dragCon = nil end + if upCon then upCon:disconnect() upCon = nil end + return + end + + local percentShown = scrollingFrame.AbsoluteSize.Y/totalYSpan + if percentShown >= 1 then + scrollbar.Visible = false + scrollDownButton.Visible = false + scrollUpButton.Visible = false + recalculate() + else + scrollbar.Visible = true + scrollDownButton.Visible = true + scrollUpButton.Visible = true + + scrollbar.Size = UDim2.new(scrollbar.Size.X.Scale,scrollbar.Size.X.Offset,percentShown,0) + end + + local percentPosition = (scrollingFrame.AbsolutePosition.Y - lowY)/totalYSpan + scrollbar.Position = UDim2.new(scrollbar.Position.X.Scale,scrollbar.Position.X.Offset,percentPosition,-scrollbar.AbsoluteSize.X/2) + + if scrollbar.AbsolutePosition.y < scrollTrack.AbsolutePosition.y then + scrollbar.Position = UDim2.new(scrollbar.Position.X.Scale,scrollbar.Position.X.Offset,0,0) + end + + if (scrollbar.AbsolutePosition.y + scrollbar.AbsoluteSize.Y) > (scrollTrack.AbsolutePosition.y + scrollTrack.AbsoluteSize.y) then + local relativeSize = scrollbar.AbsoluteSize.Y/scrollTrack.AbsoluteSize.Y + scrollbar.Position = UDim2.new(scrollbar.Position.X.Scale,scrollbar.Position.X.Offset,1 - relativeSize,0) + end + end + + local buttonScrollAmountPixels = 7 + local reentrancyGuardScrollUp = false + local function doScrollUp() + if reentrancyGuardScrollUp then return end + + reentrancyGuardScrollUp = true + if positionScrollBar(0,scrollbar.AbsolutePosition.Y - buttonScrollAmountPixels,0) then + recalculate() + end + reentrancyGuardScrollUp = false + end + + local reentrancyGuardScrollDown = false + local function doScrollDown() + if reentrancyGuardScrollDown then return end + + reentrancyGuardScrollDown = true + if positionScrollBar(0,scrollbar.AbsolutePosition.Y + buttonScrollAmountPixels,0) then + recalculate() + end + reentrancyGuardScrollDown = false + end + + local function scrollUp(mouseYPos) + if scrollUpButton.Active then + scrollStamp = tick() + local current = scrollStamp + local upCon + upCon = mouseDrag.MouseButton1Up:connect(function() + scrollStamp = tick() + mouseDrag.Parent = nil + upCon:disconnect() + end) + mouseDrag.Parent = getScreenGuiAncestor(scrollbar) + doScrollUp() + wait(0.2) + local t = tick() + local w = 0.1 + while scrollStamp == current do + doScrollUp() + if mouseYPos and mouseYPos > scrollbar.AbsolutePosition.y then + break + end + if not scrollUpButton.Active then break end + if tick()-t > 5 then + w = 0 + elseif tick()-t > 2 then + w = 0.06 + end + wait(w) + end + end + end + + local function scrollDown(mouseYPos) + if scrollDownButton.Active then + scrollStamp = tick() + local current = scrollStamp + local downCon + downCon = mouseDrag.MouseButton1Up:connect(function() + scrollStamp = tick() + mouseDrag.Parent = nil + downCon:disconnect() + end) + mouseDrag.Parent = getScreenGuiAncestor(scrollbar) + doScrollDown() + wait(0.2) + local t = tick() + local w = 0.1 + while scrollStamp == current do + doScrollDown() + if mouseYPos and mouseYPos < (scrollbar.AbsolutePosition.y + scrollbar.AbsoluteSize.x) then + break + end + if not scrollDownButton.Active then break end + if tick()-t > 5 then + w = 0 + elseif tick()-t > 2 then + w = 0.06 + end + wait(w) + end + end + end + + scrollbar.MouseButton1Down:connect(function(x,y) + if scrollbar.Active then + scrollStamp = tick() + local mouseOffset = y - scrollbar.AbsolutePosition.y + if dragCon then dragCon:disconnect() dragCon = nil end + if upCon then upCon:disconnect() upCon = nil end + local prevY = y + local reentrancyGuardMouseScroll = false + dragCon = mouseDrag.MouseMoved:connect(function(x,y) + if reentrancyGuardMouseScroll then return end + + reentrancyGuardMouseScroll = true + if positionScrollBar(x,y,mouseOffset) then + recalculate() + end + reentrancyGuardMouseScroll = false + + end) + upCon = mouseDrag.MouseButton1Up:connect(function() + scrollStamp = tick() + mouseDrag.Parent = nil + dragCon:disconnect(); dragCon = nil + upCon:disconnect(); drag = nil + end) + mouseDrag.Parent = getScreenGuiAncestor(scrollbar) + end + end) + + local scrollMouseCount = 0 + + scrollUpButton.MouseButton1Down:connect(function() + scrollUp() + end) + scrollUpButton.MouseButton1Up:connect(function() + scrollStamp = tick() + end) + + scrollDownButton.MouseButton1Up:connect(function() + scrollStamp = tick() + end) + scrollDownButton.MouseButton1Down:connect(function() + scrollDown() + end) + + scrollbar.MouseButton1Up:connect(function() + scrollStamp = tick() + end) + + local function heightCheck(instance) + if highY and (instance.AbsolutePosition.Y + instance.AbsoluteSize.Y) > highY then + highY = instance.AbsolutePosition.Y + instance.AbsoluteSize.Y + elseif not highY then + highY = instance.AbsolutePosition.Y + instance.AbsoluteSize.Y + end + setSliderSizeAndPosition() + end + + local function highLowRecheck() + local oldLowY = lowY + local oldHighY = highY + lowY = nil + highY = nil + resetHighLow() + + if (lowY ~= oldLowY) or (highY ~= oldHighY) then + setSliderSizeAndPosition() + end + end + + local function descendantChanged(this, prop) + if internalChange then return end + if not this.Visible then return end + + if prop == "Size" or prop == "Position" then + wait() + highLowRecheck() + end + end + + scrollingFrame.DescendantAdded:connect(function(instance) + if not instance:IsA("GuiObject") then return end + + if instance.Visible then + wait() -- wait a heartbeat for sizes to reconfig + highLowRecheck() + end + + descendantsChangeConMap[instance] = instance.Changed:connect(function(prop) descendantChanged(instance, prop) end) + end) + + scrollingFrame.DescendantRemoving:connect(function(instance) + if not instance:IsA("GuiObject") then return end + if descendantsChangeConMap[instance] then + descendantsChangeConMap[instance]:disconnect() + descendantsChangeConMap[instance] = nil + end + wait() -- wait a heartbeat for sizes to reconfig + highLowRecheck() + end) + + scrollingFrame.Changed:connect(function(prop) + if prop == "AbsoluteSize" then + if not highY or not lowY then return end + + highLowRecheck() + setSliderSizeAndPosition() + end + end) + + return scrollingFrame, controlFrame +end + +t.CreateScrollingFrame = function(orderList,scrollStyle) + local frame = Instance.new("Frame") + frame.Name = "ScrollingFrame" + frame.BackgroundTransparency = 1 + frame.Size = UDim2.new(1,0,1,0) + + local scrollUpButton = Instance.new("ImageButton") + scrollUpButton.Name = "ScrollUpButton" + scrollUpButton.BackgroundTransparency = 1 + scrollUpButton.Image = "rbxasset://textures/ui/scrollbuttonUp.png" + scrollUpButton.Size = UDim2.new(0,17,0,17) + + + local scrollDownButton = Instance.new("ImageButton") + scrollDownButton.Name = "ScrollDownButton" + scrollDownButton.BackgroundTransparency = 1 + scrollDownButton.Image = "rbxasset://textures/ui/scrollbuttonDown.png" + scrollDownButton.Size = UDim2.new(0,17,0,17) + + local scrollbar = Instance.new("ImageButton") + scrollbar.Name = "ScrollBar" + scrollbar.Image = "rbxasset://textures/ui/scrollbar.png" + scrollbar.BackgroundTransparency = 1 + scrollbar.Size = UDim2.new(0, 18, 0, 150) + + local scrollStamp = 0 + + local scrollDrag = Instance.new("ImageButton") + scrollDrag.Image = "http://www.roblox.com/asset/?id=61367186" + scrollDrag.Size = UDim2.new(1, 0, 0, 16) + scrollDrag.BackgroundTransparency = 1 + scrollDrag.Name = "ScrollDrag" + scrollDrag.Active = true + scrollDrag.Parent = scrollbar + + local mouseDrag = Instance.new("ImageButton") + mouseDrag.Active = false + mouseDrag.Size = UDim2.new(1.5, 0, 1.5, 0) + mouseDrag.AutoButtonColor = false + mouseDrag.BackgroundTransparency = 1 + mouseDrag.Name = "mouseDrag" + mouseDrag.Position = UDim2.new(-0.25, 0, -0.25, 0) + mouseDrag.ZIndex = 10 + + local style = "simple" + if scrollStyle and tostring(scrollStyle) then + style = scrollStyle + end + + local scrollPosition = 1 + local rowSize = 0 + local howManyDisplayed = 0 + + local layoutGridScrollBar = function() + howManyDisplayed = 0 + local guiObjects = {} + if orderList then + for i, child in ipairs(orderList) do + if child.Parent == frame then + table.insert(guiObjects, child) + end + end + else + local children = frame:GetChildren() + if children then + for i, child in ipairs(children) do + if child:IsA("GuiObject") then + table.insert(guiObjects, child) + end + end + end + end + if #guiObjects == 0 then + scrollUpButton.Active = false + scrollDownButton.Active = false + scrollDrag.Active = false + scrollPosition = 1 + return + end + + if scrollPosition > #guiObjects then + scrollPosition = #guiObjects + end + + if scrollPosition < 1 then scrollPosition = 1 end + + local totalPixelsY = frame.AbsoluteSize.Y + local pixelsRemainingY = frame.AbsoluteSize.Y + + local totalPixelsX = frame.AbsoluteSize.X + + local xCounter = 0 + local rowSizeCounter = 0 + local setRowSize = true + + local pixelsBelowScrollbar = 0 + local pos = #guiObjects + + local currentRowY = 0 + + pos = scrollPosition + --count up from current scroll position to fill out grid + while pos <= #guiObjects and pixelsBelowScrollbar < totalPixelsY do + xCounter = xCounter + guiObjects[pos].AbsoluteSize.X + --previous pos was the end of a row + if xCounter >= totalPixelsX then + pixelsBelowScrollbar = pixelsBelowScrollbar + currentRowY + currentRowY = 0 + xCounter = guiObjects[pos].AbsoluteSize.X + end + if guiObjects[pos].AbsoluteSize.Y > currentRowY then + currentRowY = guiObjects[pos].AbsoluteSize.Y + end + pos = pos + 1 + end + --Count wherever current row left off + pixelsBelowScrollbar = pixelsBelowScrollbar + currentRowY + currentRowY = 0 + + pos = scrollPosition - 1 + xCounter = 0 + + --objects with varying X,Y dimensions can rarely cause minor errors + --rechecking every new scrollPosition is necessary to avoid 100% of errors + + --count backwards from current scrollPosition to see if we can add more rows + while pixelsBelowScrollbar + currentRowY < totalPixelsY and pos >= 1 do + xCounter = xCounter + guiObjects[pos].AbsoluteSize.X + rowSizeCounter = rowSizeCounter + 1 + if xCounter >= totalPixelsX then + rowSize = rowSizeCounter - 1 + rowSizeCounter = 0 + xCounter = guiObjects[pos].AbsoluteSize.X + if pixelsBelowScrollbar + currentRowY <= totalPixelsY then + --It fits, so back up our scroll position + pixelsBelowScrollbar = pixelsBelowScrollbar + currentRowY + if scrollPosition <= rowSize then + scrollPosition = 1 + break + else + scrollPosition = scrollPosition - rowSize + end + currentRowY = 0 + else + break + end + end + + if guiObjects[pos].AbsoluteSize.Y > currentRowY then + currentRowY = guiObjects[pos].AbsoluteSize.Y + end + + pos = pos - 1 + end + + --Do check last time if pos = 0 + if (pos == 0) and (pixelsBelowScrollbar + currentRowY <= totalPixelsY) then + scrollPosition = 1 + end + + xCounter = 0 + --pos = scrollPosition + rowSizeCounter = 0 + setRowSize = true + local lastChildSize = 0 + + local xOffset,yOffset = 0 + if guiObjects[1] then + yOffset = math.ceil(math.floor(math.fmod(totalPixelsY,guiObjects[1].AbsoluteSize.X))/2) + xOffset = math.ceil(math.floor(math.fmod(totalPixelsX,guiObjects[1].AbsoluteSize.Y))/2) + end + + for i, child in ipairs(guiObjects) do + if i < scrollPosition then + --print("Hiding " .. child.Name) + child.Visible = false + else + if pixelsRemainingY < 0 then + --print("Out of Space " .. child.Name) + child.Visible = false + else + --print("Laying out " .. child.Name) + --GuiObject + if setRowSize then rowSizeCounter = rowSizeCounter + 1 end + if xCounter + child.AbsoluteSize.X >= totalPixelsX then + if setRowSize then + rowSize = rowSizeCounter - 1 + setRowSize = false + end + xCounter = 0 + pixelsRemainingY = pixelsRemainingY - child.AbsoluteSize.Y + end + child.Position = UDim2.new(child.Position.X.Scale,xCounter + xOffset, 0, totalPixelsY - pixelsRemainingY + yOffset) + xCounter = xCounter + child.AbsoluteSize.X + child.Visible = ((pixelsRemainingY - child.AbsoluteSize.Y) >= 0) + if child.Visible then + howManyDisplayed = howManyDisplayed + 1 + end + lastChildSize = child.AbsoluteSize + end + end + end + + scrollUpButton.Active = (scrollPosition > 1) + if lastChildSize == 0 then + scrollDownButton.Active = false + else + scrollDownButton.Active = ((pixelsRemainingY - lastChildSize.Y) < 0) + end + scrollDrag.Active = #guiObjects > howManyDisplayed + scrollDrag.Visible = scrollDrag.Active + end + + + + local layoutSimpleScrollBar = function() + local guiObjects = {} + howManyDisplayed = 0 + + if orderList then + for i, child in ipairs(orderList) do + if child.Parent == frame then + table.insert(guiObjects, child) + end + end + else + local children = frame:GetChildren() + if children then + for i, child in ipairs(children) do + if child:IsA("GuiObject") then + table.insert(guiObjects, child) + end + end + end + end + if #guiObjects == 0 then + scrollUpButton.Active = false + scrollDownButton.Active = false + scrollDrag.Active = false + scrollPosition = 1 + return + end + + if scrollPosition > #guiObjects then + scrollPosition = #guiObjects + end + + local totalPixels = frame.AbsoluteSize.Y + local pixelsRemaining = frame.AbsoluteSize.Y + + local pixelsBelowScrollbar = 0 + local pos = #guiObjects + while pixelsBelowScrollbar < totalPixels and pos >= 1 do + if pos >= scrollPosition then + pixelsBelowScrollbar = pixelsBelowScrollbar + guiObjects[pos].AbsoluteSize.Y + else + if pixelsBelowScrollbar + guiObjects[pos].AbsoluteSize.Y <= totalPixels then + --It fits, so back up our scroll position + pixelsBelowScrollbar = pixelsBelowScrollbar + guiObjects[pos].AbsoluteSize.Y + if scrollPosition <= 1 then + scrollPosition = 1 + break + else + --local ("Backing up ScrollPosition from -- " ..scrollPosition) + scrollPosition = scrollPosition - 1 + end + else + break + end + end + pos = pos - 1 + end + + pos = scrollPosition + for i, child in ipairs(guiObjects) do + if i < scrollPosition then + --print("Hiding " .. child.Name) + child.Visible = false + else + if pixelsRemaining < 0 then + --print("Out of Space " .. child.Name) + child.Visible = false + else + --print("Laying out " .. child.Name) + --GuiObject + child.Position = UDim2.new(child.Position.X.Scale, child.Position.X.Offset, 0, totalPixels - pixelsRemaining) + pixelsRemaining = pixelsRemaining - child.AbsoluteSize.Y + if (pixelsRemaining >= 0) then + child.Visible = true + howManyDisplayed = howManyDisplayed + 1 + else + child.Visible = false + end + end + end + end + scrollUpButton.Active = (scrollPosition > 1) + scrollDownButton.Active = (pixelsRemaining < 0) + scrollDrag.Active = #guiObjects > howManyDisplayed + scrollDrag.Visible = scrollDrag.Active + end + + + local moveDragger = function() + local guiObjects = 0 + local children = frame:GetChildren() + if children then + for i, child in ipairs(children) do + if child:IsA("GuiObject") then + guiObjects = guiObjects + 1 + end + end + end + + if not scrollDrag.Parent then return end + + local dragSizeY = scrollDrag.Parent.AbsoluteSize.y * (1/(guiObjects - howManyDisplayed + 1)) + if dragSizeY < 16 then dragSizeY = 16 end + scrollDrag.Size = UDim2.new(scrollDrag.Size.X.Scale,scrollDrag.Size.X.Offset,scrollDrag.Size.Y.Scale,dragSizeY) + + local relativeYPos = (scrollPosition - 1)/(guiObjects - (howManyDisplayed)) + if relativeYPos > 1 then relativeYPos = 1 + elseif relativeYPos < 0 then relativeYPos = 0 end + local absYPos = 0 + + if relativeYPos ~= 0 then + absYPos = (relativeYPos * scrollbar.AbsoluteSize.y) - (relativeYPos * scrollDrag.AbsoluteSize.y) + end + + scrollDrag.Position = UDim2.new(scrollDrag.Position.X.Scale,scrollDrag.Position.X.Offset,scrollDrag.Position.Y.Scale,absYPos) + end + + local reentrancyGuard = false + local recalculate = function() + if reentrancyGuard then + return + end + reentrancyGuard = true + wait() + local success, err = nil + if style == "grid" then + success, err = pcall(function() layoutGridScrollBar() end) + elseif style == "simple" then + success, err = pcall(function() layoutSimpleScrollBar() end) + end + if not success then print(err) end + moveDragger() + reentrancyGuard = false + end + + local doScrollUp = function() + scrollPosition = (scrollPosition) - rowSize + if scrollPosition < 1 then scrollPosition = 1 end + recalculate(nil) + end + + local doScrollDown = function() + scrollPosition = (scrollPosition) + rowSize + recalculate(nil) + end + + local scrollUp = function(mouseYPos) + if scrollUpButton.Active then + scrollStamp = tick() + local current = scrollStamp + local upCon + upCon = mouseDrag.MouseButton1Up:connect(function() + scrollStamp = tick() + mouseDrag.Parent = nil + upCon:disconnect() + end) + mouseDrag.Parent = getScreenGuiAncestor(scrollbar) + doScrollUp() + wait(0.2) + local t = tick() + local w = 0.1 + while scrollStamp == current do + doScrollUp() + if mouseYPos and mouseYPos > scrollDrag.AbsolutePosition.y then + break + end + if not scrollUpButton.Active then break end + if tick()-t > 5 then + w = 0 + elseif tick()-t > 2 then + w = 0.06 + end + wait(w) + end + end + end + + local scrollDown = function(mouseYPos) + if scrollDownButton.Active then + scrollStamp = tick() + local current = scrollStamp + local downCon + downCon = mouseDrag.MouseButton1Up:connect(function() + scrollStamp = tick() + mouseDrag.Parent = nil + downCon:disconnect() + end) + mouseDrag.Parent = getScreenGuiAncestor(scrollbar) + doScrollDown() + wait(0.2) + local t = tick() + local w = 0.1 + while scrollStamp == current do + doScrollDown() + if mouseYPos and mouseYPos < (scrollDrag.AbsolutePosition.y + scrollDrag.AbsoluteSize.x) then + break + end + if not scrollDownButton.Active then break end + if tick()-t > 5 then + w = 0 + elseif tick()-t > 2 then + w = 0.06 + end + wait(w) + end + end + end + + local y = 0 + scrollDrag.MouseButton1Down:connect(function(x,y) + if scrollDrag.Active then + scrollStamp = tick() + local mouseOffset = y - scrollDrag.AbsolutePosition.y + local dragCon + local upCon + dragCon = mouseDrag.MouseMoved:connect(function(x,y) + local barAbsPos = scrollbar.AbsolutePosition.y + local barAbsSize = scrollbar.AbsoluteSize.y + + local dragAbsSize = scrollDrag.AbsoluteSize.y + local barAbsOne = barAbsPos + barAbsSize - dragAbsSize + y = y - mouseOffset + y = y < barAbsPos and barAbsPos or y > barAbsOne and barAbsOne or y + y = y - barAbsPos + + local guiObjects = 0 + local children = frame:GetChildren() + if children then + for i, child in ipairs(children) do + if child:IsA("GuiObject") then + guiObjects = guiObjects + 1 + end + end + end + + local doublePercent = y/(barAbsSize-dragAbsSize) + local rowDiff = rowSize + local totalScrollCount = guiObjects - (howManyDisplayed - 1) + local newScrollPosition = math.floor((doublePercent * totalScrollCount) + 0.5) + rowDiff + if newScrollPosition < scrollPosition then + rowDiff = -rowDiff + end + + if newScrollPosition < 1 then + newScrollPosition = 1 + end + + scrollPosition = newScrollPosition + recalculate(nil) + end) + upCon = mouseDrag.MouseButton1Up:connect(function() + scrollStamp = tick() + mouseDrag.Parent = nil + dragCon:disconnect(); dragCon = nil + upCon:disconnect(); drag = nil + end) + mouseDrag.Parent = getScreenGuiAncestor(scrollbar) + end + end) + + local scrollMouseCount = 0 + + scrollUpButton.MouseButton1Down:connect( + function() + scrollUp() + end) + scrollUpButton.MouseButton1Up:connect(function() + scrollStamp = tick() + end) + + + scrollDownButton.MouseButton1Up:connect(function() + scrollStamp = tick() + end) + scrollDownButton.MouseButton1Down:connect( + function() + scrollDown() + end) + + scrollbar.MouseButton1Up:connect(function() + scrollStamp = tick() + end) + scrollbar.MouseButton1Down:connect( + function(x,y) + if y > (scrollDrag.AbsoluteSize.y + scrollDrag.AbsolutePosition.y) then + scrollDown(y) + elseif y < (scrollDrag.AbsolutePosition.y) then + scrollUp(y) + end + end) + + + frame.ChildAdded:connect(function() + recalculate(nil) + end) + + frame.ChildRemoved:connect(function() + recalculate(nil) + end) + + frame.Changed:connect( + function(prop) + if prop == "AbsoluteSize" then + --Wait a heartbeat for it to sync in + recalculate(nil) + end + end) + frame.AncestryChanged:connect(function() recalculate(nil) end) + + return frame, scrollUpButton, scrollDownButton, recalculate, scrollbar +end +local function binaryGrow(min, max, fits) + if min > max then + return min + end + local biggestLegal = min + + while min <= max do + local mid = min + math.floor((max - min) / 2) + if fits(mid) and (biggestLegal == nil or biggestLegal < mid) then + biggestLegal = mid + + --Try growing + min = mid + 1 + else + --Doesn't fit, shrink + max = mid - 1 + end + end + return biggestLegal +end + + +local function binaryShrink(min, max, fits) + if min > max then + return min + end + local smallestLegal = max + + while min <= max do + local mid = min + math.floor((max - min) / 2) + if fits(mid) and (smallestLegal == nil or smallestLegal > mid) then + smallestLegal = mid + + --It fits, shrink + max = mid - 1 + else + --Doesn't fit, grow + min = mid + 1 + end + end + return smallestLegal +end + + +local function getGuiOwner(instance) + while instance ~= nil do + if instance:IsA("ScreenGui") or instance:IsA("BillboardGui") then + return instance + end + instance = instance.Parent + end + return nil +end + +t.AutoTruncateTextObject = function(textLabel) + local text = textLabel.Text + + local fullLabel = textLabel:Clone() + fullLabel.Name = "Full" .. textLabel.Name + fullLabel.BorderSizePixel = 0 + fullLabel.BackgroundTransparency = 0 + fullLabel.Text = text + fullLabel.TextXAlignment = Enum.TextXAlignment.Center + fullLabel.Position = UDim2.new(0,-3,0,0) + fullLabel.Size = UDim2.new(0,100,1,0) + fullLabel.Visible = false + fullLabel.Parent = textLabel + + local shortText = nil + local mouseEnterConnection = nil + local mouseLeaveConnection= nil + + local checkForResize = function() + if getGuiOwner(textLabel) == nil then + return + end + textLabel.Text = text + if textLabel.TextFits then + --Tear down the rollover if it is active + if mouseEnterConnection then + mouseEnterConnection:disconnect() + mouseEnterConnection = nil + end + if mouseLeaveConnection then + mouseLeaveConnection:disconnect() + mouseLeaveConnection = nil + end + else + local len = string.len(text) + textLabel.Text = text .. "~" + + --Shrink the text + local textSize = binaryGrow(0, len, + function(pos) + if pos == 0 then + textLabel.Text = "~" + else + textLabel.Text = string.sub(text, 1, pos) .. "~" + end + return textLabel.TextFits + end) + shortText = string.sub(text, 1, textSize) .. "~" + textLabel.Text = shortText + + --Make sure the fullLabel fits + if not fullLabel.TextFits then + --Already too small, grow it really bit to start + fullLabel.Size = UDim2.new(0, 10000, 1, 0) + end + + --Okay, now try to binary shrink it back down + local fullLabelSize = binaryShrink(textLabel.AbsoluteSize.X,fullLabel.AbsoluteSize.X, + function(size) + fullLabel.Size = UDim2.new(0, size, 1, 0) + return fullLabel.TextFits + end) + fullLabel.Size = UDim2.new(0,fullLabelSize+6,1,0) + + --Now setup the rollover effects, if they are currently off + if mouseEnterConnection == nil then + mouseEnterConnection = textLabel.MouseEnter:connect( + function() + fullLabel.ZIndex = textLabel.ZIndex + 1 + fullLabel.Visible = true + --textLabel.Text = "" + end) + end + if mouseLeaveConnection == nil then + mouseLeaveConnection = textLabel.MouseLeave:connect( + function() + fullLabel.Visible = false + --textLabel.Text = shortText + end) + end + end + end + textLabel.AncestryChanged:connect(checkForResize) + textLabel.Changed:connect( + function(prop) + if prop == "AbsoluteSize" then + checkForResize() + end + end) + + checkForResize() + + local function changeText(newText) + text = newText + fullLabel.Text = text + checkForResize() + end + + return textLabel, changeText +end + +local function TransitionTutorialPages(fromPage, toPage, transitionFrame, currentPageValue) + if fromPage then + fromPage.Visible = false + if transitionFrame.Visible == false then + transitionFrame.Size = fromPage.Size + transitionFrame.Position = fromPage.Position + end + else + if transitionFrame.Visible == false then + transitionFrame.Size = UDim2.new(0.0,50,0.0,50) + transitionFrame.Position = UDim2.new(0.5,-25,0.5,-25) + end + end + transitionFrame.Visible = true + currentPageValue.Value = nil + + local newsize, newPosition + if toPage then + --Make it visible so it resizes + toPage.Visible = true + + newSize = toPage.Size + newPosition = toPage.Position + + toPage.Visible = false + else + newSize = UDim2.new(0.0,50,0.0,50) + newPosition = UDim2.new(0.5,-25,0.5,-25) + end + transitionFrame:TweenSizeAndPosition(newSize, newPosition, Enum.EasingDirection.InOut, Enum.EasingStyle.Quad, 0.3, true, + function(state) + if state == Enum.TweenStatus.Completed then + transitionFrame.Visible = false + if toPage then + toPage.Visible = true + currentPageValue.Value = toPage + end + end + end) +end + +t.CreateTutorial = function(name, tutorialKey, createButtons) + local frame = Instance.new("Frame") + frame.Name = "Tutorial-" .. name + frame.BackgroundTransparency = 1 + frame.Size = UDim2.new(0.6, 0, 0.6, 0) + frame.Position = UDim2.new(0.2, 0, 0.2, 0) + + local transitionFrame = Instance.new("Frame") + transitionFrame.Name = "TransitionFrame" + transitionFrame.Style = Enum.FrameStyle.RobloxRound + transitionFrame.Size = UDim2.new(0.6, 0, 0.6, 0) + transitionFrame.Position = UDim2.new(0.2, 0, 0.2, 0) + transitionFrame.Visible = false + transitionFrame.Parent = frame + + local currentPageValue = Instance.new("ObjectValue") + currentPageValue.Name = "CurrentTutorialPage" + currentPageValue.Value = nil + currentPageValue.Parent = frame + + local boolValue = Instance.new("BoolValue") + boolValue.Name = "Buttons" + boolValue.Value = createButtons + boolValue.Parent = frame + + local pages = Instance.new("Frame") + pages.Name = "Pages" + pages.BackgroundTransparency = 1 + pages.Size = UDim2.new(1,0,1,0) + pages.Parent = frame + + local function getVisiblePageAndHideOthers() + local visiblePage = nil + local children = pages:GetChildren() + if children then + for i,child in ipairs(children) do + if child.Visible then + if visiblePage then + child.Visible = false + else + visiblePage = child + end + end + end + end + return visiblePage + end + + local showTutorial = function(alwaysShow) + if alwaysShow or UserSettings().GameSettings:GetTutorialState(tutorialKey) == false then + print("Showing tutorial-",tutorialKey) + local currentTutorialPage = getVisiblePageAndHideOthers() + + local firstPage = pages:FindFirstChild("TutorialPage1") + if firstPage then + TransitionTutorialPages(currentTutorialPage, firstPage, transitionFrame, currentPageValue) + else + error("Could not find TutorialPage1") + end + end + end + + local dismissTutorial = function() + local currentTutorialPage = getVisiblePageAndHideOthers() + + if currentTutorialPage then + TransitionTutorialPages(currentTutorialPage, nil, transitionFrame, currentPageValue) + end + + UserSettings().GameSettings:SetTutorialState(tutorialKey, true) + end + + local gotoPage = function(pageNum) + local page = pages:FindFirstChild("TutorialPage" .. pageNum) + local currentTutorialPage = getVisiblePageAndHideOthers() + TransitionTutorialPages(currentTutorialPage, page, transitionFrame, currentPageValue) + end + + return frame, showTutorial, dismissTutorial, gotoPage +end + +local function CreateBasicTutorialPage(name, handleResize, skipTutorial, giveDoneButton) + local frame = Instance.new("Frame") + frame.Name = "TutorialPage" + frame.Style = Enum.FrameStyle.RobloxRound + frame.Size = UDim2.new(0.6, 0, 0.6, 0) + frame.Position = UDim2.new(0.2, 0, 0.2, 0) + frame.Visible = false + + local frameHeader = Instance.new("TextLabel") + frameHeader.Name = "Header" + frameHeader.Text = name + frameHeader.BackgroundTransparency = 1 + frameHeader.FontSize = Enum.FontSize.Size24 + frameHeader.Font = Enum.Font.ArialBold + frameHeader.TextColor3 = Color3.new(1,1,1) + frameHeader.TextXAlignment = Enum.TextXAlignment.Center + frameHeader.TextWrap = true + frameHeader.Size = UDim2.new(1,-55, 0, 22) + frameHeader.Position = UDim2.new(0,0,0,0) + frameHeader.Parent = frame + + local skipButton = Instance.new("ImageButton") + skipButton.Name = "SkipButton" + skipButton.AutoButtonColor = false + skipButton.BackgroundTransparency = 1 + skipButton.Image = "rbxasset://textures/ui/closeButton.png" + skipButton.MouseButton1Click:connect(function() + skipTutorial() + end) + skipButton.MouseEnter:connect(function() + skipButton.Image = "rbxasset://textures/ui/closeButton_dn.png" + end) + skipButton.MouseLeave:connect(function() + skipButton.Image = "rbxasset://textures/ui/closeButton.png" + end) + skipButton.Size = UDim2.new(0, 25, 0, 25) + skipButton.Position = UDim2.new(1, -25, 0, 0) + skipButton.Parent = frame + + + if giveDoneButton then + local doneButton = Instance.new("TextButton") + doneButton.Name = "DoneButton" + doneButton.Style = Enum.ButtonStyle.RobloxButtonDefault + doneButton.Text = "Done" + doneButton.TextColor3 = Color3.new(1,1,1) + doneButton.Font = Enum.Font.ArialBold + doneButton.FontSize = Enum.FontSize.Size18 + doneButton.Size = UDim2.new(0,100,0,50) + doneButton.Position = UDim2.new(0.5,-50,1,-50) + + if skipTutorial then + doneButton.MouseButton1Click:connect(function() skipTutorial() end) + end + + doneButton.Parent = frame + end + + local innerFrame = Instance.new("Frame") + innerFrame.Name = "ContentFrame" + innerFrame.BackgroundTransparency = 1 + innerFrame.Position = UDim2.new(0,0,0,25) + innerFrame.Parent = frame + + local nextButton = Instance.new("TextButton") + nextButton.Name = "NextButton" + nextButton.Text = "Next" + nextButton.TextColor3 = Color3.new(1,1,1) + nextButton.Font = Enum.Font.Arial + nextButton.FontSize = Enum.FontSize.Size18 + nextButton.Style = Enum.ButtonStyle.RobloxButtonDefault + nextButton.Size = UDim2.new(0,80, 0, 32) + nextButton.Position = UDim2.new(0.5, 5, 1, -32) + nextButton.Active = false + nextButton.Visible = false + nextButton.Parent = frame + + local prevButton = Instance.new("TextButton") + prevButton.Name = "PrevButton" + prevButton.Text = "Previous" + prevButton.TextColor3 = Color3.new(1,1,1) + prevButton.Font = Enum.Font.Arial + prevButton.FontSize = Enum.FontSize.Size18 + prevButton.Style = Enum.ButtonStyle.RobloxButton + prevButton.Size = UDim2.new(0,80, 0, 32) + prevButton.Position = UDim2.new(0.5, -85, 1, -32) + prevButton.Active = false + prevButton.Visible = false + prevButton.Parent = frame + + if giveDoneButton then + innerFrame.Size = UDim2.new(1,0,1,-75) + else + innerFrame.Size = UDim2.new(1,0,1,-22) + end + + local parentConnection = nil + + local function basicHandleResize() + if frame.Visible and frame.Parent then + local maxSize = math.min(frame.Parent.AbsoluteSize.X, frame.Parent.AbsoluteSize.Y) + handleResize(200,maxSize) + end + end + + frame.Changed:connect( + function(prop) + if prop == "Parent" then + if parentConnection ~= nil then + parentConnection:disconnect() + parentConnection = nil + end + if frame.Parent and frame.Parent:IsA("GuiObject") then + parentConnection = frame.Parent.Changed:connect( + function(parentProp) + if parentProp == "AbsoluteSize" then + wait() + basicHandleResize() + end + end) + basicHandleResize() + end + end + + if prop == "Visible" then + basicHandleResize() + end + end) + + return frame, innerFrame +end + +t.CreateTextTutorialPage = function(name, text, skipTutorialFunc) + local frame = nil + local contentFrame = nil + + local textLabel = Instance.new("TextLabel") + textLabel.BackgroundTransparency = 1 + textLabel.TextColor3 = Color3.new(1,1,1) + textLabel.Text = text + textLabel.TextWrap = true + textLabel.TextXAlignment = Enum.TextXAlignment.Left + textLabel.TextYAlignment = Enum.TextYAlignment.Center + textLabel.Font = Enum.Font.Arial + textLabel.FontSize = Enum.FontSize.Size14 + textLabel.Size = UDim2.new(1,0,1,0) + + local function handleResize(minSize, maxSize) + size = binaryShrink(minSize, maxSize, + function(size) + frame.Size = UDim2.new(0, size, 0, size) + return textLabel.TextFits + end) + frame.Size = UDim2.new(0, size, 0, size) + frame.Position = UDim2.new(0.5, -size/2, 0.5, -size/2) + end + + frame, contentFrame = CreateBasicTutorialPage(name, handleResize, skipTutorialFunc) + textLabel.Parent = contentFrame + + return frame +end + +t.CreateImageTutorialPage = function(name, imageAsset, x, y, skipTutorialFunc, giveDoneButton) + local frame = nil + local contentFrame = nil + + local imageLabel = Instance.new("ImageLabel") + imageLabel.BackgroundTransparency = 1 + imageLabel.Image = imageAsset + imageLabel.Size = UDim2.new(0,x,0,y) + imageLabel.Position = UDim2.new(0.5,-x/2,0.5,-y/2) + + local function handleResize(minSize, maxSize) + size = binaryShrink(minSize, maxSize, + function(size) + return size >= x and size >= y + end) + if size >= x and size >= y then + imageLabel.Size = UDim2.new(0,x, 0,y) + imageLabel.Position = UDim2.new(0.5,-x/2, 0.5, -y/2) + else + if x > y then + --X is limiter, so + imageLabel.Size = UDim2.new(1,0,y/x,0) + imageLabel.Position = UDim2.new(0,0, 0.5 - (y/x)/2, 0) + else + --Y is limiter + imageLabel.Size = UDim2.new(x/y,0,1, 0) + imageLabel.Position = UDim2.new(0.5-(x/y)/2, 0, 0, 0) + end + end + size = size + 50 + frame.Size = UDim2.new(0, size, 0, size) + frame.Position = UDim2.new(0.5, -size/2, 0.5, -size/2) + end + + frame, contentFrame = CreateBasicTutorialPage(name, handleResize, skipTutorialFunc, giveDoneButton) + imageLabel.Parent = contentFrame + + return frame +end + +t.AddTutorialPage = function(tutorial, tutorialPage) + local transitionFrame = tutorial.TransitionFrame + local currentPageValue = tutorial.CurrentTutorialPage + + if not tutorial.Buttons.Value then + tutorialPage.NextButton.Parent = nil + tutorialPage.PrevButton.Parent = nil + end + + local children = tutorial.Pages:GetChildren() + if children and #children > 0 then + tutorialPage.Name = "TutorialPage" .. (#children+1) + local previousPage = children[#children] + if not previousPage:IsA("GuiObject") then + error("All elements under Pages must be GuiObjects") + end + + if tutorial.Buttons.Value then + if previousPage.NextButton.Active then + error("NextButton already Active on previousPage, please only add pages with RbxGui.AddTutorialPage function") + end + previousPage.NextButton.MouseButton1Click:connect( + function() + TransitionTutorialPages(previousPage, tutorialPage, transitionFrame, currentPageValue) + end) + previousPage.NextButton.Active = true + previousPage.NextButton.Visible = true + + if tutorialPage.PrevButton.Active then + error("PrevButton already Active on tutorialPage, please only add pages with RbxGui.AddTutorialPage function") + end + tutorialPage.PrevButton.MouseButton1Click:connect( + function() + TransitionTutorialPages(tutorialPage, previousPage, transitionFrame, currentPageValue) + end) + tutorialPage.PrevButton.Active = true + tutorialPage.PrevButton.Visible = true + end + + tutorialPage.Parent = tutorial.Pages + else + --First child + tutorialPage.Name = "TutorialPage1" + tutorialPage.Parent = tutorial.Pages + end +end + +t.CreateSetPanel = function(userIdsForSets, objectSelected, dialogClosed, size, position, showAdminCategories, useAssetVersionId) + + if not userIdsForSets then + error("CreateSetPanel: userIdsForSets (first arg) is nil, should be a table of number ids") + end + if type(userIdsForSets) ~= "table" and type(userIdsForSets) ~= "userdata" then + error("CreateSetPanel: userIdsForSets (first arg) is of type " ..type(userIdsForSets) .. ", should be of type table or userdata") + end + if not objectSelected then + error("CreateSetPanel: objectSelected (second arg) is nil, should be a callback function!") + end + if type(objectSelected) ~= "function" then + error("CreateSetPanel: objectSelected (second arg) is of type " .. type(objectSelected) .. ", should be of type function!") + end + if dialogClosed and type(dialogClosed) ~= "function" then + error("CreateSetPanel: dialogClosed (third arg) is of type " .. type(dialogClosed) .. ", should be of type function!") + end + + if showAdminCategories == nil then -- by default, don't show beta sets + showAdminCategories = false + end + + local arrayPosition = 1 + local insertButtons = {} + local insertButtonCons = {} + local contents = nil + local setGui = nil + + -- used for water selections + local waterForceDirection = "NegX" + local waterForce = "None" + local waterGui, waterTypeChangedEvent = nil + + local Data = {} + Data.CurrentCategory = nil + Data.Category = {} + local SetCache = {} + + local userCategoryButtons = nil + + local buttonWidth = 64 + local buttonHeight = buttonWidth + + local SmallThumbnailUrl = nil + local LargeThumbnailUrl = nil + local BaseUrl = game:GetService("ContentProvider").BaseUrl:lower() + + if useAssetVersionId then + LargeThumbnailUrl = BaseUrl .. "Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=420&ht=420&assetversionid=" + SmallThumbnailUrl = BaseUrl .. "Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=75&ht=75&assetversionid=" + else + LargeThumbnailUrl = BaseUrl .. "Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=420&ht=420&aid=" + SmallThumbnailUrl = BaseUrl .. "Game/Tools/ThumbnailAsset.ashx?fmt=png&wd=75&ht=75&aid=" + end + + local function drillDownSetZIndex(parent, index) + local children = parent:GetChildren() + for i = 1, #children do + if children[i]:IsA("GuiObject") then + children[i].ZIndex = index + end + drillDownSetZIndex(children[i], index) + end + end + + -- for terrain stamping + local currTerrainDropDownFrame = nil + local terrainShapes = {"Block","Vertical Ramp","Corner Wedge","Inverse Corner Wedge","Horizontal Ramp","Auto-Wedge"} + local terrainShapeMap = {} + for i = 1, #terrainShapes do + terrainShapeMap[terrainShapes[i]] = i - 1 + end + terrainShapeMap[terrainShapes[#terrainShapes]] = 6 + + local function createWaterGui() + local waterForceDirections = {"NegX","X","NegY","Y","NegZ","Z"} + local waterForces = {"None", "Small", "Medium", "Strong", "Max"} + + local waterFrame = Instance.new("Frame") + waterFrame.Name = "WaterFrame" + waterFrame.Style = Enum.FrameStyle.RobloxSquare + waterFrame.Size = UDim2.new(0,150,0,110) + waterFrame.Visible = false + + local waterForceLabel = Instance.new("TextLabel") + waterForceLabel.Name = "WaterForceLabel" + waterForceLabel.BackgroundTransparency = 1 + waterForceLabel.Size = UDim2.new(1,0,0,12) + waterForceLabel.Font = Enum.Font.ArialBold + waterForceLabel.FontSize = Enum.FontSize.Size12 + waterForceLabel.TextColor3 = Color3.new(1,1,1) + waterForceLabel.TextXAlignment = Enum.TextXAlignment.Left + waterForceLabel.Text = "Water Force" + waterForceLabel.Parent = waterFrame + + local waterForceDirLabel = waterForceLabel:Clone() + waterForceDirLabel.Name = "WaterForceDirectionLabel" + waterForceDirLabel.Text = "Water Force Direction" + waterForceDirLabel.Position = UDim2.new(0,0,0,50) + waterForceDirLabel.Parent = waterFrame + + local waterTypeChangedEvent = Instance.new("BindableEvent",waterFrame) + waterTypeChangedEvent.Name = "WaterTypeChangedEvent" + + local waterForceDirectionSelectedFunc = function(newForceDirection) + waterForceDirection = newForceDirection + waterTypeChangedEvent:Fire({waterForce, waterForceDirection}) + end + local waterForceSelectedFunc = function(newForce) + waterForce = newForce + waterTypeChangedEvent:Fire({waterForce, waterForceDirection}) + end + + local waterForceDirectionDropDown, forceWaterDirectionSelection = t.CreateDropDownMenu(waterForceDirections, waterForceDirectionSelectedFunc) + waterForceDirectionDropDown.Size = UDim2.new(1,0,0,25) + waterForceDirectionDropDown.Position = UDim2.new(0,0,1,3) + forceWaterDirectionSelection("NegX") + waterForceDirectionDropDown.Parent = waterForceDirLabel + + local waterForceDropDown, forceWaterForceSelection = t.CreateDropDownMenu(waterForces, waterForceSelectedFunc) + forceWaterForceSelection("None") + waterForceDropDown.Size = UDim2.new(1,0,0,25) + waterForceDropDown.Position = UDim2.new(0,0,1,3) + waterForceDropDown.Parent = waterForceLabel + + return waterFrame, waterTypeChangedEvent + end + + -- Helper Function that contructs gui elements + local function createSetGui() + + local setGui = Instance.new("ScreenGui") + setGui.Name = "SetGui" + + local setPanel = Instance.new("Frame") + setPanel.Name = "SetPanel" + setPanel.Active = true + setPanel.BackgroundTransparency = 1 + if position then + setPanel.Position = position + else + setPanel.Position = UDim2.new(0.2, 29, 0.1, 24) + end + if size then + setPanel.Size = size + else + setPanel.Size = UDim2.new(0.6, -58, 0.64, 0) + end + setPanel.Style = Enum.FrameStyle.RobloxRound + setPanel.ZIndex = 6 + setPanel.Parent = setGui + + -- Children of SetPanel + local itemPreview = Instance.new("Frame") + itemPreview.Name = "ItemPreview" + itemPreview.BackgroundTransparency = 1 + itemPreview.Position = UDim2.new(0.8,5,0.085,0) + itemPreview.Size = UDim2.new(0.21,0,0.9,0) + itemPreview.ZIndex = 6 + itemPreview.Parent = setPanel + + -- Children of ItemPreview + local textPanel = Instance.new("Frame") + textPanel.Name = "TextPanel" + textPanel.BackgroundTransparency = 1 + textPanel.Position = UDim2.new(0,0,0.45,0) + textPanel.Size = UDim2.new(1,0,0.55,0) + textPanel.ZIndex = 6 + textPanel.Parent = itemPreview + + -- Children of TextPanel + local rolloverText = Instance.new("TextLabel") + rolloverText.Name = "RolloverText" + rolloverText.BackgroundTransparency = 1 + rolloverText.Size = UDim2.new(1,0,0,48) + rolloverText.ZIndex = 6 + rolloverText.Font = Enum.Font.ArialBold + rolloverText.FontSize = Enum.FontSize.Size24 + rolloverText.Text = "" + rolloverText.TextColor3 = Color3.new(1,1,1) + rolloverText.TextWrap = true + rolloverText.TextXAlignment = Enum.TextXAlignment.Left + rolloverText.TextYAlignment = Enum.TextYAlignment.Top + rolloverText.Parent = textPanel + + local largePreview = Instance.new("ImageLabel") + largePreview.Name = "LargePreview" + largePreview.BackgroundTransparency = 1 + largePreview.Image = "" + largePreview.Size = UDim2.new(1,0,0,170) + largePreview.ZIndex = 6 + largePreview.Parent = itemPreview + + local sets = Instance.new("Frame") + sets.Name = "Sets" + sets.BackgroundTransparency = 1 + sets.Position = UDim2.new(0,0,0,5) + sets.Size = UDim2.new(0.23,0,1,-5) + sets.ZIndex = 6 + sets.Parent = setPanel + + -- Children of Sets + local line = Instance.new("Frame") + line.Name = "Line" + line.BackgroundColor3 = Color3.new(1,1,1) + line.BackgroundTransparency = 0.7 + line.BorderSizePixel = 0 + line.Position = UDim2.new(1,-3,0.06,0) + line.Size = UDim2.new(0,3,0.9,0) + line.ZIndex = 6 + line.Parent = sets + + local setsLists, controlFrame = t.CreateTrueScrollingFrame() + setsLists.Size = UDim2.new(1,-6,0.94,0) + setsLists.Position = UDim2.new(0,0,0.06,0) + setsLists.BackgroundTransparency = 1 + setsLists.Name = "SetsLists" + setsLists.ZIndex = 6 + setsLists.Parent = sets + drillDownSetZIndex(controlFrame, 7) + + local setsHeader = Instance.new("TextLabel") + setsHeader.Name = "SetsHeader" + setsHeader.BackgroundTransparency = 1 + setsHeader.Size = UDim2.new(0,47,0,24) + setsHeader.ZIndex = 6 + setsHeader.Font = Enum.Font.ArialBold + setsHeader.FontSize = Enum.FontSize.Size24 + setsHeader.Text = "Sets" + setsHeader.TextColor3 = Color3.new(1,1,1) + setsHeader.TextXAlignment = Enum.TextXAlignment.Left + setsHeader.TextYAlignment = Enum.TextYAlignment.Top + setsHeader.Parent = sets + + local cancelButton = Instance.new("TextButton") + cancelButton.Name = "CancelButton" + cancelButton.Position = UDim2.new(1,-32,0,-2) + cancelButton.Size = UDim2.new(0,34,0,34) + cancelButton.Style = Enum.ButtonStyle.RobloxButtonDefault + cancelButton.ZIndex = 6 + cancelButton.Text = "" + cancelButton.Modal = true + cancelButton.Parent = setPanel + + -- Children of Cancel Button + local cancelImage = Instance.new("ImageLabel") + cancelImage.Name = "CancelImage" + cancelImage.BackgroundTransparency = 1 + cancelImage.Image = "http://www.roblox.com/asset/?id=54135717" + cancelImage.Position = UDim2.new(0,-2,0,-2) + cancelImage.Size = UDim2.new(0,16,0,16) + cancelImage.ZIndex = 6 + cancelImage.Parent = cancelButton + + return setGui + end + + local function createSetButton(text) + local setButton = Instance.new("TextButton") + + if text then setButton.Text = text + else setButton.Text = "" end + + setButton.AutoButtonColor = false + setButton.BackgroundTransparency = 1 + setButton.BackgroundColor3 = Color3.new(1,1,1) + setButton.BorderSizePixel = 0 + setButton.Size = UDim2.new(1,-5,0,18) + setButton.ZIndex = 6 + setButton.Visible = false + setButton.Font = Enum.Font.Arial + setButton.FontSize = Enum.FontSize.Size18 + setButton.TextColor3 = Color3.new(1,1,1) + setButton.TextXAlignment = Enum.TextXAlignment.Left + + return setButton + end + + local function buildSetButton(name, setId, setImageId, i, count) + local button = createSetButton(name) + button.Text = name + button.Name = "SetButton" + button.Visible = true + + local setValue = Instance.new("IntValue") + setValue.Name = "SetId" + setValue.Value = setId + setValue.Parent = button + + local setName = Instance.new("StringValue") + setName.Name = "SetName" + setName.Value = name + setName.Parent = button + + return button + end + + local function processCategory(sets) + local setButtons = {} + local numSkipped = 0 + for i = 1, #sets do + if not showAdminCategories and sets[i].Name == "Beta" then + numSkipped = numSkipped + 1 + else + setButtons[i - numSkipped] = buildSetButton(sets[i].Name, sets[i].CategoryId, sets[i].ImageAssetId, i - numSkipped, #sets) + end + end + return setButtons + end + + local function handleResize() + wait() -- neccessary to insure heartbeat happened + + local itemPreview = setGui.SetPanel.ItemPreview + + itemPreview.LargePreview.Size = UDim2.new(1,0,0,itemPreview.AbsoluteSize.X) + itemPreview.LargePreview.Position = UDim2.new(0.5,-itemPreview.LargePreview.AbsoluteSize.X/2,0,0) + itemPreview.TextPanel.Position = UDim2.new(0,0,0,itemPreview.LargePreview.AbsoluteSize.Y) + itemPreview.TextPanel.Size = UDim2.new(1,0,0,itemPreview.AbsoluteSize.Y - itemPreview.LargePreview.AbsoluteSize.Y) + end + + local function makeInsertAssetButton() + local insertAssetButtonExample = Instance.new("Frame") + insertAssetButtonExample.Name = "InsertAssetButtonExample" + insertAssetButtonExample.Position = UDim2.new(0,128,0,64) + insertAssetButtonExample.Size = UDim2.new(0,64,0,64) + insertAssetButtonExample.BackgroundTransparency = 1 + insertAssetButtonExample.ZIndex = 6 + insertAssetButtonExample.Visible = false + + local assetId = Instance.new("IntValue") + assetId.Name = "AssetId" + assetId.Value = 0 + assetId.Parent = insertAssetButtonExample + + local assetName = Instance.new("StringValue") + assetName.Name = "AssetName" + assetName.Value = "" + assetName.Parent = insertAssetButtonExample + + local button = Instance.new("TextButton") + button.Name = "Button" + button.Text = "" + button.Style = Enum.ButtonStyle.RobloxButton + button.Position = UDim2.new(0.025,0,0.025,0) + button.Size = UDim2.new(0.95,0,0.95,0) + button.ZIndex = 6 + button.Parent = insertAssetButtonExample + + local buttonImage = Instance.new("ImageLabel") + buttonImage.Name = "ButtonImage" + buttonImage.Image = "" + buttonImage.Position = UDim2.new(0,-7,0,-7) + buttonImage.Size = UDim2.new(1,14,1,14) + buttonImage.BackgroundTransparency = 1 + buttonImage.ZIndex = 7 + buttonImage.Parent = button + + local configIcon = buttonImage:clone() + configIcon.Name = "ConfigIcon" + configIcon.Visible = false + configIcon.Position = UDim2.new(1,-23,1,-24) + configIcon.Size = UDim2.new(0,16,0,16) + configIcon.Image = "" + configIcon.ZIndex = 6 + configIcon.Parent = insertAssetButtonExample + + return insertAssetButtonExample + end + + local function showLargePreview(insertButton) + if insertButton:FindFirstChild("AssetId") then + delay(0,function() + game:GetService("ContentProvider"):Preload(LargeThumbnailUrl .. tostring(insertButton.AssetId.Value)) + setGui.SetPanel.ItemPreview.LargePreview.Image = LargeThumbnailUrl .. tostring(insertButton.AssetId.Value) + end) + end + if insertButton:FindFirstChild("AssetName") then + setGui.SetPanel.ItemPreview.TextPanel.RolloverText.Text = insertButton.AssetName.Value + end + end + + local function selectTerrainShape(shape) + if currTerrainDropDownFrame then + objectSelected(tostring(currTerrainDropDownFrame.AssetName.Value), tonumber(currTerrainDropDownFrame.AssetId.Value), shape) + end + end + + local function createTerrainTypeButton(name, parent) + local dropDownTextButton = Instance.new("TextButton") + dropDownTextButton.Name = name .. "Button" + dropDownTextButton.Font = Enum.Font.ArialBold + dropDownTextButton.FontSize = Enum.FontSize.Size14 + dropDownTextButton.BorderSizePixel = 0 + dropDownTextButton.TextColor3 = Color3.new(1,1,1) + dropDownTextButton.Text = name + dropDownTextButton.TextXAlignment = Enum.TextXAlignment.Left + dropDownTextButton.BackgroundTransparency = 1 + dropDownTextButton.ZIndex = parent.ZIndex + 1 + dropDownTextButton.Size = UDim2.new(0,parent.Size.X.Offset - 2,0,16) + dropDownTextButton.Position = UDim2.new(0,1,0,0) + + dropDownTextButton.MouseEnter:connect(function() + dropDownTextButton.BackgroundTransparency = 0 + dropDownTextButton.TextColor3 = Color3.new(0,0,0) + end) + + dropDownTextButton.MouseLeave:connect(function() + dropDownTextButton.BackgroundTransparency = 1 + dropDownTextButton.TextColor3 = Color3.new(1,1,1) + end) + + dropDownTextButton.MouseButton1Click:connect(function() + dropDownTextButton.BackgroundTransparency = 1 + dropDownTextButton.TextColor3 = Color3.new(1,1,1) + if dropDownTextButton.Parent and dropDownTextButton.Parent:IsA("GuiObject") then + dropDownTextButton.Parent.Visible = false + end + selectTerrainShape(terrainShapeMap[dropDownTextButton.Text]) + end) + + return dropDownTextButton + end + + local function createTerrainDropDownMenu(zIndex) + local dropDown = Instance.new("Frame") + dropDown.Name = "TerrainDropDown" + dropDown.BackgroundColor3 = Color3.new(0,0,0) + dropDown.BorderColor3 = Color3.new(1,0,0) + dropDown.Size = UDim2.new(0,200,0,0) + dropDown.Visible = false + dropDown.ZIndex = zIndex + dropDown.Parent = setGui + + for i = 1, #terrainShapes do + local shapeButton = createTerrainTypeButton(terrainShapes[i],dropDown) + shapeButton.Position = UDim2.new(0,1,0,(i - 1) * (shapeButton.Size.Y.Offset)) + shapeButton.Parent = dropDown + dropDown.Size = UDim2.new(0,200,0,dropDown.Size.Y.Offset + (shapeButton.Size.Y.Offset)) + end + + dropDown.MouseLeave:connect(function() + dropDown.Visible = false + end) + end + + + local function createDropDownMenuButton(parent) + local dropDownButton = Instance.new("ImageButton") + dropDownButton.Name = "DropDownButton" + dropDownButton.Image = "http://www.roblox.com/asset/?id=67581509" + dropDownButton.BackgroundTransparency = 1 + dropDownButton.Size = UDim2.new(0,16,0,16) + dropDownButton.Position = UDim2.new(1,-24,0,6) + dropDownButton.ZIndex = parent.ZIndex + 2 + dropDownButton.Parent = parent + + if not setGui:FindFirstChild("TerrainDropDown") then + createTerrainDropDownMenu(8) + end + + dropDownButton.MouseButton1Click:connect(function() + setGui.TerrainDropDown.Visible = true + setGui.TerrainDropDown.Position = UDim2.new(0,parent.AbsolutePosition.X,0,parent.AbsolutePosition.Y) + currTerrainDropDownFrame = parent + end) + end + + local function buildInsertButton() + local insertButton = makeInsertAssetButton() + insertButton.Name = "InsertAssetButton" + insertButton.Visible = true + + if Data.Category[Data.CurrentCategory].SetName == "High Scalability" then + createDropDownMenuButton(insertButton) + end + + local lastEnter = nil + local mouseEnterCon = insertButton.MouseEnter:connect(function() + lastEnter = insertButton + delay(0.1,function() + if lastEnter == insertButton then + showLargePreview(insertButton) + end + end) + end) + return insertButton, mouseEnterCon + end + + local function realignButtonGrid(columns) + local x = 0 + local y = 0 + for i = 1, #insertButtons do + insertButtons[i].Position = UDim2.new(0, buttonWidth * x, 0, buttonHeight * y) + x = x + 1 + if x >= columns then + x = 0 + y = y + 1 + end + end + end + + local function setInsertButtonImageBehavior(insertFrame, visible, name, assetId) + if visible then + insertFrame.AssetName.Value = name + insertFrame.AssetId.Value = assetId + local newImageUrl = SmallThumbnailUrl .. assetId + if newImageUrl ~= insertFrame.Button.ButtonImage.Image then + delay(0,function() + game:GetService("ContentProvider"):Preload(SmallThumbnailUrl .. assetId) + if insertFrame:findFirstChild("Button") then + insertFrame.Button.ButtonImage.Image = SmallThumbnailUrl .. assetId + end + end) + end + table.insert(insertButtonCons, + insertFrame.Button.MouseButton1Click:connect(function() + -- special case for water, show water selection gui + local isWaterSelected = (name == "Water") and (Data.Category[Data.CurrentCategory].SetName == "High Scalability") + waterGui.Visible = isWaterSelected + if isWaterSelected then + objectSelected(name, tonumber(assetId), nil) + else + objectSelected(name, tonumber(assetId)) + end + end) + ) + insertFrame.Visible = true + else + insertFrame.Visible = false + end + end + + local function loadSectionOfItems(setGui, rows, columns) + local pageSize = rows * columns + + if arrayPosition > #contents then return end + + local origArrayPos = arrayPosition + + local yCopy = 0 + for i = 1, pageSize + 1 do + if arrayPosition >= #contents + 1 then + break + end + + local buttonCon + insertButtons[arrayPosition], buttonCon = buildInsertButton() + table.insert(insertButtonCons,buttonCon) + insertButtons[arrayPosition].Parent = setGui.SetPanel.ItemsFrame + arrayPosition = arrayPosition + 1 + end + realignButtonGrid(columns) + + local indexCopy = origArrayPos + for index = origArrayPos, arrayPosition do + if insertButtons[index] then + if contents[index] then + + -- we don't want water to have a drop down button + if contents[index].Name == "Water" then + if Data.Category[Data.CurrentCategory].SetName == "High Scalability" then + insertButtons[index]:FindFirstChild("DropDownButton",true):Destroy() + end + end + + local assetId + if useAssetVersionId then + assetId = contents[index].AssetVersionId + else + assetId = contents[index].AssetId + end + setInsertButtonImageBehavior(insertButtons[index], true, contents[index].Name, assetId) + else + break + end + else + break + end + indexCopy = index + end + end + + local function setSetIndex() + Data.Category[Data.CurrentCategory].Index = 0 + + rows = 7 + columns = math.floor(setGui.SetPanel.ItemsFrame.AbsoluteSize.X/buttonWidth) + + contents = Data.Category[Data.CurrentCategory].Contents + if contents then + -- remove our buttons and their connections + for i = 1, #insertButtons do + insertButtons[i]:remove() + end + for i = 1, #insertButtonCons do + if insertButtonCons[i] then insertButtonCons[i]:disconnect() end + end + insertButtonCons = {} + insertButtons = {} + + arrayPosition = 1 + loadSectionOfItems(setGui, rows, columns) + end + end + + local function selectSet(button, setName, setId, setIndex) + if button and Data.Category[Data.CurrentCategory] ~= nil then + if button ~= Data.Category[Data.CurrentCategory].Button then + Data.Category[Data.CurrentCategory].Button = button + + if SetCache[setId] == nil then + SetCache[setId] = game:GetService("InsertService"):GetCollection(setId) + end + Data.Category[Data.CurrentCategory].Contents = SetCache[setId] + + Data.Category[Data.CurrentCategory].SetName = setName + Data.Category[Data.CurrentCategory].SetId = setId + end + setSetIndex() + end + end + + local function selectCategoryPage(buttons, page) + if buttons ~= Data.CurrentCategory then + if Data.CurrentCategory then + for key, button in pairs(Data.CurrentCategory) do + button.Visible = false + end + end + + Data.CurrentCategory = buttons + if Data.Category[Data.CurrentCategory] == nil then + Data.Category[Data.CurrentCategory] = {} + if #buttons > 0 then + selectSet(buttons[1], buttons[1].SetName.Value, buttons[1].SetId.Value, 0) + end + else + Data.Category[Data.CurrentCategory].Button = nil + selectSet(Data.Category[Data.CurrentCategory].ButtonFrame, Data.Category[Data.CurrentCategory].SetName, Data.Category[Data.CurrentCategory].SetId, Data.Category[Data.CurrentCategory].Index) + end + end + end + + local function selectCategory(category) + selectCategoryPage(category, 0) + end + + local function resetAllSetButtonSelection() + local setButtons = setGui.SetPanel.Sets.SetsLists:GetChildren() + for i = 1, #setButtons do + if setButtons[i]:IsA("TextButton") then + setButtons[i].Selected = false + setButtons[i].BackgroundTransparency = 1 + setButtons[i].TextColor3 = Color3.new(1,1,1) + setButtons[i].BackgroundColor3 = Color3.new(1,1,1) + end + end + end + + local function populateSetsFrame() + local currRow = 0 + for i = 1, #userCategoryButtons do + local button = userCategoryButtons[i] + button.Visible = true + button.Position = UDim2.new(0,5,0,currRow * button.Size.Y.Offset) + button.Parent = setGui.SetPanel.Sets.SetsLists + + if i == 1 then -- we will have this selected by default, so show it + button.Selected = true + button.BackgroundColor3 = Color3.new(0,204/255,0) + button.TextColor3 = Color3.new(0,0,0) + button.BackgroundTransparency = 0 + end + + button.MouseEnter:connect(function() + if not button.Selected then + button.BackgroundTransparency = 0 + button.TextColor3 = Color3.new(0,0,0) + end + end) + button.MouseLeave:connect(function() + if not button.Selected then + button.BackgroundTransparency = 1 + button.TextColor3 = Color3.new(1,1,1) + end + end) + button.MouseButton1Click:connect(function() + resetAllSetButtonSelection() + button.Selected = not button.Selected + button.BackgroundColor3 = Color3.new(0,204/255,0) + button.TextColor3 = Color3.new(0,0,0) + button.BackgroundTransparency = 0 + selectSet(button, button.Text, userCategoryButtons[i].SetId.Value, 0) + end) + + currRow = currRow + 1 + end + + local buttons = setGui.SetPanel.Sets.SetsLists:GetChildren() + + -- set first category as loaded for default + if buttons then + for i = 1, #buttons do + if buttons[i]:IsA("TextButton") then + selectSet(buttons[i], buttons[i].Text, userCategoryButtons[i].SetId.Value, 0) + selectCategory(userCategoryButtons) + break + end + end + end + end + + setGui = createSetGui() + waterGui, waterTypeChangedEvent = createWaterGui() + waterGui.Position = UDim2.new(0,55,0,0) + waterGui.Parent = setGui + setGui.Changed:connect(function(prop) -- this resizes the preview image to always be the right size + if prop == "AbsoluteSize" then + handleResize() + setSetIndex() + end + end) + + local scrollFrame, controlFrame = t.CreateTrueScrollingFrame() + scrollFrame.Size = UDim2.new(0.54,0,0.85,0) + scrollFrame.Position = UDim2.new(0.24,0,0.085,0) + scrollFrame.Name = "ItemsFrame" + scrollFrame.ZIndex = 6 + scrollFrame.Parent = setGui.SetPanel + scrollFrame.BackgroundTransparency = 1 + + drillDownSetZIndex(controlFrame,7) + + controlFrame.Parent = setGui.SetPanel + controlFrame.Position = UDim2.new(0.76, 5, 0, 0) + + local debounce = false + controlFrame.ScrollBottom.Changed:connect(function(prop) + if controlFrame.ScrollBottom.Value == true then + if debounce then return end + debounce = true + loadSectionOfItems(setGui, rows, columns) + debounce = false + end + end) + + local userData = {} + for id = 1, #userIdsForSets do + local newUserData = game:GetService("InsertService"):GetUserSets(userIdsForSets[id]) + if newUserData and #newUserData > 2 then + -- start at #3 to skip over My Decals and My Models for each account + for category = 3, #newUserData do + if newUserData[category].Name == "High Scalability" then -- we want high scalability parts to show first + table.insert(userData,1,newUserData[category]) + else + table.insert(userData, newUserData[category]) + end + end + end + + end + if userData then + userCategoryButtons = processCategory(userData) + end + + rows = math.floor(setGui.SetPanel.ItemsFrame.AbsoluteSize.Y/buttonHeight) + columns = math.floor(setGui.SetPanel.ItemsFrame.AbsoluteSize.X/buttonWidth) + + populateSetsFrame() + + insertPanelCloseCon = setGui.SetPanel.CancelButton.MouseButton1Click:connect(function() + setGui.SetPanel.Visible = false + if dialogClosed then dialogClosed() end + end) + + local setVisibilityFunction = function(visible) + if visible then + setGui.SetPanel.Visible = true + else + setGui.SetPanel.Visible = false + end + end + + local getVisibilityFunction = function() + if setGui then + if setGui:FindFirstChild("SetPanel") then + return setGui.SetPanel.Visible + end + end + + return false + end + + return setGui, setVisibilityFunction, getVisibilityFunction, waterTypeChangedEvent +end + +t.CreateTerrainMaterialSelector = function(size,position) + local terrainMaterialSelectionChanged = Instance.new("BindableEvent") + terrainMaterialSelectionChanged.Name = "TerrainMaterialSelectionChanged" + + local selectedButton = nil + + local frame = Instance.new("Frame") + frame.Name = "TerrainMaterialSelector" + if size then + frame.Size = size + else + frame.Size = UDim2.new(0, 245, 0, 230) + end + if position then + frame.Position = position + end + frame.BorderSizePixel = 0 + frame.BackgroundColor3 = Color3.new(0,0,0) + frame.Active = true + + terrainMaterialSelectionChanged.Parent = frame + + local waterEnabled = true -- todo: turn this on when water is ready + + local materialToImageMap = {} + local materialNames = {"Grass", "Sand", "Brick", "Granite", "Asphalt", "Iron", "Aluminum", "Gold", "Plank", "Log", "Gravel", "Cinder Block", "Stone Wall", "Concrete", "Plastic (red)", "Plastic (blue)"} + if waterEnabled then + table.insert(materialNames,"Water") + end + local currentMaterial = 1 + + function getEnumFromName(choice) + if choice == "Grass" then return 1 end + if choice == "Sand" then return 2 end + if choice == "Erase" then return 0 end + if choice == "Brick" then return 3 end + if choice == "Granite" then return 4 end + if choice == "Asphalt" then return 5 end + if choice == "Iron" then return 6 end + if choice == "Aluminum" then return 7 end + if choice == "Gold" then return 8 end + if choice == "Plank" then return 9 end + if choice == "Log" then return 10 end + if choice == "Gravel" then return 11 end + if choice == "Cinder Block" then return 12 end + if choice == "Stone Wall" then return 13 end + if choice == "Concrete" then return 14 end + if choice == "Plastic (red)" then return 15 end + if choice == "Plastic (blue)" then return 16 end + if choice == "Water" then return 17 end + end + + function getNameFromEnum(choice) + if choice == Enum.CellMaterial.Grass or choice == 1 then return "Grass"end + if choice == Enum.CellMaterial.Sand or choice == 2 then return "Sand" end + if choice == Enum.CellMaterial.Empty or choice == 0 then return "Erase" end + if choice == Enum.CellMaterial.Brick or choice == 3 then return "Brick" end + if choice == Enum.CellMaterial.Granite or choice == 4 then return "Granite" end + if choice == Enum.CellMaterial.Asphalt or choice == 5 then return "Asphalt" end + if choice == Enum.CellMaterial.Iron or choice == 6 then return "Iron" end + if choice == Enum.CellMaterial.Aluminum or choice == 7 then return "Aluminum" end + if choice == Enum.CellMaterial.Gold or choice == 8 then return "Gold" end + if choice == Enum.CellMaterial.WoodPlank or choice == 9 then return "Plank" end + if choice == Enum.CellMaterial.WoodLog or choice == 10 then return "Log" end + if choice == Enum.CellMaterial.Gravel or choice == 11 then return "Gravel" end + if choice == Enum.CellMaterial.CinderBlock or choice == 12 then return "Cinder Block" end + if choice == Enum.CellMaterial.MossyStone or choice == 13 then return "Stone Wall" end + if choice == Enum.CellMaterial.Cement or choice == 14 then return "Concrete" end + if choice == Enum.CellMaterial.RedPlastic or choice == 15 then return "Plastic (red)" end + if choice == Enum.CellMaterial.BluePlastic or choice == 16 then return "Plastic (blue)" end + + if waterEnabled then + if choice == Enum.CellMaterial.Water or choice == 17 then return "Water" end + end + end + + + local function updateMaterialChoice(choice) + currentMaterial = getEnumFromName(choice) + terrainMaterialSelectionChanged:Fire(currentMaterial) + end + + -- we so need a better way to do this + for i,v in pairs(materialNames) do + materialToImageMap[v] = {} + if v == "Grass" then materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=56563112" + elseif v == "Sand" then materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=62356652" + elseif v == "Brick" then materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=65961537" + elseif v == "Granite" then materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532153" + elseif v == "Asphalt" then materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532038" + elseif v == "Iron" then materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532093" + elseif v == "Aluminum" then materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67531995" + elseif v == "Gold" then materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532118" + elseif v == "Plastic (red)" then materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67531848" + elseif v == "Plastic (blue)" then materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67531924" + elseif v == "Plank" then materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532015" + elseif v == "Log" then materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532051" + elseif v == "Gravel" then materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532206" + elseif v == "Cinder Block" then materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532103" + elseif v == "Stone Wall" then materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67531804" + elseif v == "Concrete" then materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=67532059" + elseif v == "Water" then materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=81407474" + else materialToImageMap[v].Regular = "http://www.roblox.com/asset/?id=66887593" -- fill in the rest here!! + end + end + + local scrollFrame, scrollUp, scrollDown, recalculateScroll = t.CreateScrollingFrame(nil,"grid") + scrollFrame.Size = UDim2.new(0.85,0,1,0) + scrollFrame.Position = UDim2.new(0,0,0,0) + scrollFrame.Parent = frame + + scrollUp.Parent = frame + scrollUp.Visible = true + scrollUp.Position = UDim2.new(1,-19,0,0) + + scrollDown.Parent = frame + scrollDown.Visible = true + scrollDown.Position = UDim2.new(1,-19,1,-17) + + local function goToNewMaterial(buttonWrap, materialName) + updateMaterialChoice(materialName) + buttonWrap.BackgroundTransparency = 0 + selectedButton.BackgroundTransparency = 1 + selectedButton = buttonWrap + end + + local function createMaterialButton(name) + local buttonWrap = Instance.new("TextButton") + buttonWrap.Text = "" + buttonWrap.Size = UDim2.new(0,32,0,32) + buttonWrap.BackgroundColor3 = Color3.new(1,1,1) + buttonWrap.BorderSizePixel = 0 + buttonWrap.BackgroundTransparency = 1 + buttonWrap.AutoButtonColor = false + buttonWrap.Name = tostring(name) + + local imageButton = Instance.new("ImageButton") + imageButton.AutoButtonColor = false + imageButton.BackgroundTransparency = 1 + imageButton.Size = UDim2.new(0,30,0,30) + imageButton.Position = UDim2.new(0,1,0,1) + imageButton.Name = tostring(name) + imageButton.Parent = buttonWrap + imageButton.Image = materialToImageMap[name].Regular + + local enumType = Instance.new("NumberValue") + enumType.Name = "EnumType" + enumType.Parent = buttonWrap + enumType.Value = 0 + + imageButton.MouseEnter:connect(function() + buttonWrap.BackgroundTransparency = 0 + end) + imageButton.MouseLeave:connect(function() + if selectedButton ~= buttonWrap then + buttonWrap.BackgroundTransparency = 1 + end + end) + imageButton.MouseButton1Click:connect(function() + if selectedButton ~= buttonWrap then + goToNewMaterial(buttonWrap, tostring(name)) + end + end) + + return buttonWrap + end + + for i = 1, #materialNames do + local imageButton = createMaterialButton(materialNames[i]) + + if materialNames[i] == "Grass" then -- always start with grass as the default + selectedButton = imageButton + imageButton.BackgroundTransparency = 0 + end + + imageButton.Parent = scrollFrame + end + + local forceTerrainMaterialSelection = function(newMaterialType) + if not newMaterialType then return end + if currentMaterial == newMaterialType then return end + + local matName = getNameFromEnum(newMaterialType) + local buttons = scrollFrame:GetChildren() + for i = 1, #buttons do + if buttons[i].Name == "Plastic (blue)" and matName == "Plastic (blue)" then goToNewMaterial(buttons[i],matName) return end + if buttons[i].Name == "Plastic (red)" and matName == "Plastic (red)" then goToNewMaterial(buttons[i],matName) return end + if string.find(buttons[i].Name, matName) then + goToNewMaterial(buttons[i],matName) + return + end + end + end + + frame.Changed:connect(function ( prop ) + if prop == "AbsoluteSize" then + recalculateScroll() + end + end) + + recalculateScroll() + return frame, terrainMaterialSelectionChanged, forceTerrainMaterialSelection +end + +t.CreateLoadingFrame = function(name,size,position) + game:GetService("ContentProvider"):Preload("http://www.roblox.com/asset/?id=35238053") + + local loadingFrame = Instance.new("Frame") + loadingFrame.Name = "LoadingFrame" + loadingFrame.Style = Enum.FrameStyle.RobloxRound + + if size then loadingFrame.Size = size + else loadingFrame.Size = UDim2.new(0,300,0,160) end + if position then loadingFrame.Position = position + else loadingFrame.Position = UDim2.new(0.5, -150, 0.5,-80) end + + local loadingBar = Instance.new("Frame") + loadingBar.Name = "LoadingBar" + loadingBar.BackgroundColor3 = Color3.new(0,0,0) + loadingBar.BorderColor3 = Color3.new(79/255,79/255,79/255) + loadingBar.Position = UDim2.new(0,0,0,41) + loadingBar.Size = UDim2.new(1,0,0,30) + loadingBar.Parent = loadingFrame + + local loadingGreenBar = Instance.new("ImageLabel") + loadingGreenBar.Name = "LoadingGreenBar" + loadingGreenBar.Image = "http://www.roblox.com/asset/?id=35238053" + loadingGreenBar.Position = UDim2.new(0,0,0,0) + loadingGreenBar.Size = UDim2.new(0,0,1,0) + loadingGreenBar.Visible = false + loadingGreenBar.Parent = loadingBar + + local loadingPercent = Instance.new("TextLabel") + loadingPercent.Name = "LoadingPercent" + loadingPercent.BackgroundTransparency = 1 + loadingPercent.Position = UDim2.new(0,0,1,0) + loadingPercent.Size = UDim2.new(1,0,0,14) + loadingPercent.Font = Enum.Font.Arial + loadingPercent.Text = "0%" + loadingPercent.FontSize = Enum.FontSize.Size14 + loadingPercent.TextColor3 = Color3.new(1,1,1) + loadingPercent.Parent = loadingBar + + local cancelButton = Instance.new("TextButton") + cancelButton.Name = "CancelButton" + cancelButton.Position = UDim2.new(0.5,-60,1,-40) + cancelButton.Size = UDim2.new(0,120,0,40) + cancelButton.Font = Enum.Font.Arial + cancelButton.FontSize = Enum.FontSize.Size18 + cancelButton.TextColor3 = Color3.new(1,1,1) + cancelButton.Text = "Cancel" + cancelButton.Style = Enum.ButtonStyle.RobloxButton + cancelButton.Parent = loadingFrame + + local loadingName = Instance.new("TextLabel") + loadingName.Name = "loadingName" + loadingName.BackgroundTransparency = 1 + loadingName.Size = UDim2.new(1,0,0,18) + loadingName.Position = UDim2.new(0,0,0,2) + loadingName.Font = Enum.Font.Arial + loadingName.Text = name + loadingName.TextColor3 = Color3.new(1,1,1) + loadingName.TextStrokeTransparency = 1 + loadingName.FontSize = Enum.FontSize.Size18 + loadingName.Parent = loadingFrame + + local cancelButtonClicked = Instance.new("BindableEvent") + cancelButtonClicked.Name = "CancelButtonClicked" + cancelButtonClicked.Parent = cancelButton + cancelButton.MouseButton1Click:connect(function() + cancelButtonClicked:Fire() + end) + + local updateLoadingGuiPercent = function(percent, tweenAction, tweenLength) + if percent and type(percent) ~= "number" then + error("updateLoadingGuiPercent expects number as argument, got",type(percent),"instead") + end + + local newSize = nil + if percent < 0 then + newSize = UDim2.new(0,0,1,0) + elseif percent > 1 then + newSize = UDim2.new(1,0,1,0) + else + newSize = UDim2.new(percent,0,1,0) + end + + if tweenAction then + if not tweenLength then + error("updateLoadingGuiPercent is set to tween new percentage, but got no tween time length! Please pass this in as third argument") + end + + if (newSize.X.Scale > 0) then + loadingGreenBar.Visible = true + loadingGreenBar:TweenSize( newSize, + Enum.EasingDirection.Out, + Enum.EasingStyle.Quad, + tweenLength, + true) + else + loadingGreenBar:TweenSize( newSize, + Enum.EasingDirection.Out, + Enum.EasingStyle.Quad, + tweenLength, + true, + function() + if (newSize.X.Scale < 0) then + loadingGreenBar.Visible = false + end + end) + end + + else + loadingGreenBar.Size = newSize + loadingGreenBar.Visible = (newSize.X.Scale > 0) + end + end + + loadingGreenBar.Changed:connect(function(prop) + if prop == "Size" then + loadingPercent.Text = tostring( math.ceil(loadingGreenBar.Size.X.Scale * 100) ) .. "%" + end + end) + + return loadingFrame, updateLoadingGuiPercent, cancelButtonClicked +end + +t.CreatePluginFrame = function (name,size,position,scrollable,parent) + function createMenuButton(size,position,text,fontsize,name,parent) + local button = Instance.new("TextButton",parent) + button.AutoButtonColor = false + button.Name = name + button.BackgroundTransparency = 1 + button.Position = position + button.Size = size + button.Font = Enum.Font.ArialBold + button.FontSize = fontsize + button.Text = text + button.TextColor3 = Color3.new(1,1,1) + button.BorderSizePixel = 0 + button.BackgroundColor3 = Color3.new(20/255,20/255,20/255) + + button.MouseEnter:connect(function ( ) + if button.Selected then return end + button.BackgroundTransparency = 0 + end) + button.MouseLeave:connect(function ( ) + if button.Selected then return end + button.BackgroundTransparency = 1 + end) + + return button + + end + + local dragBar = Instance.new("Frame",parent) + dragBar.Name = tostring(name) .. "DragBar" + dragBar.BackgroundColor3 = Color3.new(39/255,39/255,39/255) + dragBar.BorderColor3 = Color3.new(0,0,0) + if size then + dragBar.Size = UDim2.new(size.X.Scale,size.X.Offset,0,20) + UDim2.new(0,20,0,0) + else + dragBar.Size = UDim2.new(0,183,0,20) + end + if position then + dragBar.Position = position + end + dragBar.Active = true + dragBar.Draggable = true + --dragBar.Visible = false + dragBar.MouseEnter:connect(function ( ) + dragBar.BackgroundColor3 = Color3.new(49/255,49/255,49/255) + end) + dragBar.MouseLeave:connect(function ( ) + dragBar.BackgroundColor3 = Color3.new(39/255,39/255,39/255) + end) + + -- plugin name label + local pluginNameLabel = Instance.new("TextLabel",dragBar) + pluginNameLabel.Name = "BarNameLabel" + pluginNameLabel.Text = " " .. tostring(name) + pluginNameLabel.TextColor3 = Color3.new(1,1,1) + pluginNameLabel.TextStrokeTransparency = 0 + pluginNameLabel.Size = UDim2.new(1,0,1,0) + pluginNameLabel.Font = Enum.Font.ArialBold + pluginNameLabel.FontSize = Enum.FontSize.Size18 + pluginNameLabel.TextXAlignment = Enum.TextXAlignment.Left + pluginNameLabel.BackgroundTransparency = 1 + + -- close button + local closeButton = createMenuButton(UDim2.new(0,15,0,17),UDim2.new(1,-16,0.5,-8),"X",Enum.FontSize.Size14,"CloseButton",dragBar) + local closeEvent = Instance.new("BindableEvent") + closeEvent.Name = "CloseEvent" + closeEvent.Parent = closeButton + closeButton.MouseButton1Click:connect(function () + closeEvent:Fire() + closeButton.BackgroundTransparency = 1 + end) + + -- help button + local helpButton = createMenuButton(UDim2.new(0,15,0,17),UDim2.new(1,-51,0.5,-8),"?",Enum.FontSize.Size14,"HelpButton",dragBar) + local helpFrame = Instance.new("Frame",dragBar) + helpFrame.Name = "HelpFrame" + helpFrame.BackgroundColor3 = Color3.new(0,0,0) + helpFrame.Size = UDim2.new(0,300,0,552) + helpFrame.Position = UDim2.new(1,5,0,0) + helpFrame.Active = true + helpFrame.BorderSizePixel = 0 + helpFrame.Visible = false + + helpButton.MouseButton1Click:connect(function( ) + helpFrame.Visible = not helpFrame.Visible + if helpFrame.Visible then + helpButton.Selected = true + helpButton.BackgroundTransparency = 0 + local screenGui = getScreenGuiAncestor(helpFrame) + if screenGui then + if helpFrame.AbsolutePosition.X + helpFrame.AbsoluteSize.X > screenGui.AbsoluteSize.X then --position on left hand side + helpFrame.Position = UDim2.new(0,-5 - helpFrame.AbsoluteSize.X,0,0) + else -- position on right hand side + helpFrame.Position = UDim2.new(1,5,0,0) + end + else + helpFrame.Position = UDim2.new(1,5,0,0) + end + else + helpButton.Selected = false + helpButton.BackgroundTransparency = 1 + end + end) + + local minimizeButton = createMenuButton(UDim2.new(0,16,0,17),UDim2.new(1,-34,0.5,-8),"-",Enum.FontSize.Size14,"MinimizeButton",dragBar) + minimizeButton.TextYAlignment = Enum.TextYAlignment.Top + + local minimizeFrame = Instance.new("Frame",dragBar) + minimizeFrame.Name = "MinimizeFrame" + minimizeFrame.BackgroundColor3 = Color3.new(73/255,73/255,73/255) + minimizeFrame.BorderColor3 = Color3.new(0,0,0) + minimizeFrame.Position = UDim2.new(0,0,1,0) + if size then + minimizeFrame.Size = UDim2.new(size.X.Scale,size.X.Offset,0,50) + UDim2.new(0,20,0,0) + else + minimizeFrame.Size = UDim2.new(0,183,0,50) + end + minimizeFrame.Visible = false + + local minimizeBigButton = Instance.new("TextButton",minimizeFrame) + minimizeBigButton.Position = UDim2.new(0.5,-50,0.5,-20) + minimizeBigButton.Name = "MinimizeButton" + minimizeBigButton.Size = UDim2.new(0,100,0,40) + minimizeBigButton.Style = Enum.ButtonStyle.RobloxButton + minimizeBigButton.Font = Enum.Font.ArialBold + minimizeBigButton.FontSize = Enum.FontSize.Size18 + minimizeBigButton.TextColor3 = Color3.new(1,1,1) + minimizeBigButton.Text = "Show" + + local separatingLine = Instance.new("Frame",dragBar) + separatingLine.Name = "SeparatingLine" + separatingLine.BackgroundColor3 = Color3.new(115/255,115/255,115/255) + separatingLine.BorderSizePixel = 0 + separatingLine.Position = UDim2.new(1,-18,0.5,-7) + separatingLine.Size = UDim2.new(0,1,0,14) + + local otherSeparatingLine = separatingLine:clone() + otherSeparatingLine.Position = UDim2.new(1,-35,0.5,-7) + otherSeparatingLine.Parent = dragBar + + local widgetContainer = Instance.new("Frame",dragBar) + widgetContainer.Name = "WidgetContainer" + widgetContainer.BackgroundTransparency = 1 + widgetContainer.Position = UDim2.new(0,0,1,0) + widgetContainer.BorderColor3 = Color3.new(0,0,0) + if not scrollable then + widgetContainer.BackgroundTransparency = 0 + widgetContainer.BackgroundColor3 = Color3.new(72/255,72/255,72/255) + end + + if size then + if scrollable then + widgetContainer.Size = size + else + widgetContainer.Size = UDim2.new(0,dragBar.AbsoluteSize.X,size.Y.Scale,size.Y.Offset) + end + else + if scrollable then + widgetContainer.Size = UDim2.new(0,163,0,400) + else + widgetContainer.Size = UDim2.new(0,dragBar.AbsoluteSize.X,0,400) + end + end + if position then + widgetContainer.Position = position + UDim2.new(0,0,0,20) + end + + local frame,control,verticalDragger = nil + if scrollable then + --frame for widgets + frame,control = t.CreateTrueScrollingFrame() + frame.Size = UDim2.new(1, 0, 1, 0) + frame.BackgroundColor3 = Color3.new(72/255,72/255,72/255) + frame.BorderColor3 = Color3.new(0,0,0) + frame.Active = true + frame.Parent = widgetContainer + control.Parent = dragBar + control.BackgroundColor3 = Color3.new(72/255,72/255,72/255) + control.BorderSizePixel = 0 + control.BackgroundTransparency = 0 + control.Position = UDim2.new(1,-21,1,1) + if size then + control.Size = UDim2.new(0,21,size.Y.Scale,size.Y.Offset) + else + control.Size = UDim2.new(0,21,0,400) + end + control:FindFirstChild("ScrollDownButton").Position = UDim2.new(0,0,1,-20) + + local fakeLine = Instance.new("Frame",control) + fakeLine.Name = "FakeLine" + fakeLine.BorderSizePixel = 0 + fakeLine.BackgroundColor3 = Color3.new(0,0,0) + fakeLine.Size = UDim2.new(0,1,1,1) + fakeLine.Position = UDim2.new(1,0,0,0) + + verticalDragger = Instance.new("TextButton",widgetContainer) + verticalDragger.ZIndex = 2 + verticalDragger.AutoButtonColor = false + verticalDragger.Name = "VerticalDragger" + verticalDragger.BackgroundColor3 = Color3.new(50/255,50/255,50/255) + verticalDragger.BorderColor3 = Color3.new(0,0,0) + verticalDragger.Size = UDim2.new(1,20,0,20) + verticalDragger.Position = UDim2.new(0,0,1,0) + verticalDragger.Active = true + verticalDragger.Text = "" + + local scrubFrame = Instance.new("Frame",verticalDragger) + scrubFrame.Name = "ScrubFrame" + scrubFrame.BackgroundColor3 = Color3.new(1,1,1) + scrubFrame.BorderSizePixel = 0 + scrubFrame.Position = UDim2.new(0.5,-5,0.5,0) + scrubFrame.Size = UDim2.new(0,10,0,1) + scrubFrame.ZIndex = 5 + local scrubTwo = scrubFrame:clone() + scrubTwo.Position = UDim2.new(0.5,-5,0.5,-2) + scrubTwo.Parent = verticalDragger + local scrubThree = scrubFrame:clone() + scrubThree.Position = UDim2.new(0.5,-5,0.5,2) + scrubThree.Parent = verticalDragger + + local areaSoak = Instance.new("TextButton",getScreenGuiAncestor(parent)) + areaSoak.Name = "AreaSoak" + areaSoak.Size = UDim2.new(1,0,1,0) + areaSoak.BackgroundTransparency = 1 + areaSoak.BorderSizePixel = 0 + areaSoak.Text = "" + areaSoak.ZIndex = 10 + areaSoak.Visible = false + areaSoak.Active = true + + local draggingVertical = false + local startYPos = nil + verticalDragger.MouseEnter:connect(function () + verticalDragger.BackgroundColor3 = Color3.new(60/255,60/255,60/255) + end) + verticalDragger.MouseLeave:connect(function () + verticalDragger.BackgroundColor3 = Color3.new(50/255,50/255,50/255) + end) + verticalDragger.MouseButton1Down:connect(function(x,y) + draggingVertical = true + areaSoak.Visible = true + startYPos = y + end) + areaSoak.MouseButton1Up:connect(function ( ) + draggingVertical = false + areaSoak.Visible = false + end) + areaSoak.MouseMoved:connect(function(x,y) + if not draggingVertical then return end + + local yDelta = y - startYPos + if not control.ScrollDownButton.Visible and yDelta > 0 then + return + end + + if (widgetContainer.Size.Y.Offset + yDelta) < 150 then + widgetContainer.Size = UDim2.new(widgetContainer.Size.X.Scale, widgetContainer.Size.X.Offset,widgetContainer.Size.Y.Scale,150) + control.Size = UDim2.new (0,21,0,150) + return + end + + startYPos = y + + if widgetContainer.Size.Y.Offset + yDelta >= 0 then + widgetContainer.Size = UDim2.new(widgetContainer.Size.X.Scale, widgetContainer.Size.X.Offset,widgetContainer.Size.Y.Scale,widgetContainer.Size.Y.Offset + yDelta) + control.Size = UDim2.new(0,21,0,control.Size.Y.Offset + yDelta ) + end + end) + end + + local function switchMinimize() + minimizeFrame.Visible = not minimizeFrame.Visible + if scrollable then + frame.Visible = not frame.Visible + verticalDragger.Visible = not verticalDragger.Visible + control.Visible = not control.Visible + else + widgetContainer.Visible = not widgetContainer.Visible + end + + if minimizeFrame.Visible then + minimizeButton.Text = "+" + else + minimizeButton.Text = "-" + end + end + + minimizeBigButton.MouseButton1Click:connect(function ( ) + switchMinimize() + end) + + minimizeButton.MouseButton1Click:connect(function( ) + switchMinimize() + end) + + if scrollable then + return dragBar, frame, helpFrame, closeEvent + else + return dragBar, widgetContainer, helpFrame, closeEvent + end +end + +t.Help = + function(funcNameOrFunc) + --input argument can be a string or a function. Should return a description (of arguments and expected side effects) + if funcNameOrFunc == "CreatePropertyDropDownMenu" or funcNameOrFunc == t.CreatePropertyDropDownMenu then + return "Function CreatePropertyDropDownMenu. " .. + "Arguments: (instance, propertyName, enumType). " .. + "Side effect: returns a container with a drop-down-box that is linked to the 'property' field of 'instance' which is of type 'enumType'" + end + if funcNameOrFunc == "CreateDropDownMenu" or funcNameOrFunc == t.CreateDropDownMenu then + return "Function CreateDropDownMenu. " .. + "Arguments: (items, onItemSelected). " .. + "Side effect: Returns 2 results, a container to the gui object and a 'updateSelection' function for external updating. The container is a drop-down-box created around a list of items" + end + if funcNameOrFunc == "CreateMessageDialog" or funcNameOrFunc == t.CreateMessageDialog then + return "Function CreateMessageDialog. " .. + "Arguments: (title, message, buttons). " .. + "Side effect: Returns a gui object of a message box with 'title' and 'message' as passed in. 'buttons' input is an array of Tables contains a 'Text' and 'Function' field for the text/callback of each button" + end + if funcNameOrFunc == "CreateStyledMessageDialog" or funcNameOrFunc == t.CreateStyledMessageDialog then + return "Function CreateStyledMessageDialog. " .. + "Arguments: (title, message, style, buttons). " .. + "Side effect: Returns a gui object of a message box with 'title' and 'message' as passed in. 'buttons' input is an array of Tables contains a 'Text' and 'Function' field for the text/callback of each button, 'style' is a string, either Error, Notify or Confirm" + end + if funcNameOrFunc == "GetFontHeight" or funcNameOrFunc == t.GetFontHeight then + return "Function GetFontHeight. " .. + "Arguments: (font, fontSize). " .. + "Side effect: returns the size in pixels of the given font + fontSize" + end + if funcNameOrFunc == "LayoutGuiObjects" or funcNameOrFunc == t.LayoutGuiObjects then + + end + if funcNameOrFunc == "CreateScrollingFrame" or funcNameOrFunc == t.CreateScrollingFrame then + return "Function CreateScrollingFrame. " .. + "Arguments: (orderList, style) " .. + "Side effect: returns 4 objects, (scrollFrame, scrollUpButton, scrollDownButton, recalculateFunction). 'scrollFrame' can be filled with GuiObjects. It will lay them out and allow scrollUpButton/scrollDownButton to interact with them. Orderlist is optional (and specifies the order to layout the children. Without orderlist, it uses the children order. style is also optional, and allows for a 'grid' styling if style is passed 'grid' as a string. recalculateFunction can be called when a relayout is needed (when orderList changes)" + end + if funcNameOrFunc == "CreateTrueScrollingFrame" or funcNameOrFunc == t.CreateTrueScrollingFrame then + return "Function CreateTrueScrollingFrame. " .. + "Arguments: (nil) " .. + "Side effect: returns 2 objects, (scrollFrame, controlFrame). 'scrollFrame' can be filled with GuiObjects, and they will be clipped if not inside the frame's bounds. controlFrame has children scrollup and scrolldown, as well as a slider. controlFrame can be parented to any guiobject and it will readjust itself to fit." + end + if funcNameOrFunc == "AutoTruncateTextObject" or funcNameOrFunc == t.AutoTruncateTextObject then + return "Function AutoTruncateTextObject. " .. + "Arguments: (textLabel) " .. + "Side effect: returns 2 objects, (textLabel, changeText). The 'textLabel' input is modified to automatically truncate text (with ellipsis), if it gets too small to fit. 'changeText' is a function that can be used to change the text, it takes 1 string as an argument" + end + if funcNameOrFunc == "CreateSlider" or funcNameOrFunc == t.CreateSlider then + return "Function CreateSlider. " .. + "Arguments: (steps, width, position) " .. + "Side effect: returns 2 objects, (sliderGui, sliderPosition). The 'steps' argument specifies how many different positions the slider can hold along the bar. 'width' specifies in pixels how wide the bar should be (modifiable afterwards if desired). 'position' argument should be a UDim2 for slider positioning. 'sliderPosition' is an IntValue whose current .Value specifies the specific step the slider is currently on." + end + if funcNameOrFunc == "CreateSliderNew" or funcNameOrFunc == t.CreateSliderNew then + return "Function CreateSliderNew. " .. + "Arguments: (steps, width, position) " .. + "Side effect: returns 2 objects, (sliderGui, sliderPosition). The 'steps' argument specifies how many different positions the slider can hold along the bar. 'width' specifies in pixels how wide the bar should be (modifiable afterwards if desired). 'position' argument should be a UDim2 for slider positioning. 'sliderPosition' is an IntValue whose current .Value specifies the specific step the slider is currently on." + end + if funcNameOrFunc == "CreateLoadingFrame" or funcNameOrFunc == t.CreateLoadingFrame then + return "Function CreateLoadingFrame. " .. + "Arguments: (name, size, position) " .. + "Side effect: Creates a gui that can be manipulated to show progress for a particular action. Name appears above the loading bar, and size and position are udim2 values (both size and position are optional arguments). Returns 3 arguments, the first being the gui created. The second being updateLoadingGuiPercent, which is a bindable function. This function takes one argument (two optionally), which should be a number between 0 and 1, representing the percentage the loading gui should be at. The second argument to this function is a boolean value that if set to true will tween the current percentage value to the new percentage value, therefore our third argument is how long this tween should take. Our third returned argument is a BindableEvent, that when fired means that someone clicked the cancel button on the dialog." + end + if funcNameOrFunc == "CreateTerrainMaterialSelector" or funcNameOrFunc == t.CreateTerrainMaterialSelector then + return "Function CreateTerrainMaterialSelector. " .. + "Arguments: (size, position) " .. + "Side effect: Size and position are UDim2 values that specifies the selector's size and position. Both size and position are optional arguments. This method returns 3 objects (terrainSelectorGui, terrainSelected, forceTerrainSelection). terrainSelectorGui is just the gui object that we generate with this function, parent it as you like. TerrainSelected is a BindableEvent that is fired whenever a new terrain type is selected in the gui. ForceTerrainSelection is a function that takes an argument of Enum.CellMaterial and will force the gui to show that material as currently selected." + end + end + + + +local RbxGui + +local localTesting = true + +local screen = script.Parent +local screenResizeCon = nil + +local friendWord = "Friend" +local friendWordLowercase = "friend" + +local elementNames = {} +local elementNameToElement = {} + +local privilegeOwner = 255 +local privilegeAdmin = 240 +local privilegeMember = 128 +local privilegeVisitor = 10 +local privilegeBanned = 0 + +local inContextMenu = false +local contextMenu3d = false + +local bigEasingStyle = Enum.EasingStyle.Back +local smallEasingStyle = Enum.EasingStyle.Quart + +local personalServerContextAdded = false +local personalServerPlace = false +local success = pcall(function() personalServerPlace = game.IsPersonalServer end) +if not success then + personalServerPlace = false +end + +local friendRequestBlacklist = {} +local otherPlayerBlacklist = {} + +local currentSortName = "" + +local function waitForChild(instance, name) + while not instance:FindFirstChild(name) do + instance.ChildAdded:wait() + end +end + +local function waitForProperty(instance, prop) + while not instance[prop] do + instance.Changed:wait() + end +end + +local function Color3I(r,g,b) + return Color3.new(r/255,g/255,b/255) +end + +function robloxLock(instance) +end + +function ArrayRemove(t, obj) + for i, obj2 in ipairs(t) do + if obj == obj2 then + table.remove(t, i) + return true + end + end + return false +end + +local function getPlayers() + local result = {} + local players = game:GetService("Players"):GetChildren() + if players then + for i, player in ipairs(players) do + if player:IsA("Player") then + table.insert(result, player) + end + end + end + return result +end + +local brickColorTable = {} +for i = 0, 63 do + brickColorTable[BrickColor.palette(i).Name] = BrickColor.palette(i).Color +end + +local function remapColor(i, j) + brickColorTable[BrickColor.palette(i).Name] = BrickColor.palette(j).Color +end + +remapColor(13, 12) +remapColor(14, 12) +remapColor(15, 12) +remapColor(61, 29) +remapColor(63, 62) +remapColor(56, 50) +remapColor(45, 53) +remapColor(51, 20) +remapColor(4, 20) +remapColor(59, 35) +remapColor(60, 29) + +local function getColor(brickColor) + if brickColorTable[brickColor.Name] then + return brickColorTable[brickColor.Name] + else + return brickColor.Color; + end +end + + + +local function getTeams() + local result = {} + local teams = game:GetService("Teams"):GetChildren() + for i, team in ipairs(teams) do + if team:IsA("Team") then + table.insert(result, team) + end + end + return result +end + +local supportFriends = false +local currentBoardType = "PlayerList" +local currentStatCount = 0 + +local createBoardsFunction = nil + + +local playerTable = {} +local teamTable = {} +local teamColorTable = {} + +local removePlayerFunction = nil +local recreatePlayerFunction = nil +local addPlayerFunction = function(player) + if recreatePlayerFunction then + recreatePlayerFunction(player) + end +end +local sortPlayerListsFunction = nil + +local minimizedState = nil +local bigWindowImposter = nil +local smallWindowPosition = UDim2.new(0, -20, 0,5) +local smallWindowSize = UDim2.new(1,0,1,0) +local bigWindowSize = UDim2.new(0.6,0,0.6,0) +local bigWindowPosition = UDim2.new(.2, 0, .2,0) + +local smallWindowHeaderYSize = 32 + +local debounceTeamsChanged = false + +local currentWindowState = "Small" +local previousWindowState = nil +local transitionWindowsFunction = nil + +local container = nil +local topRightTrayContainer = nil + +local playerContextMenu = nil +local contextMenuElements = {} +local updateContextMenuItems = nil + +local function addContextMenuLabel(getText1, getText2, isVisible) + local t = {} + t.Type = "Label" + t.GetText1 = getText1 + t.GetText2 = getText2 + t.IsVisible = isVisible + table.insert(contextMenuElements, t) +end +local function addContextMenuButton(text, isVisible, isActive, doIt) + local t = {} + t.Text = text + t.Type = "Button" + t.IsVisible = isVisible + t.IsActive = isActive + t.DoIt = doIt + table.insert(contextMenuElements, t) +end + +local function getFriendStatus(player) + if player == game.Players.LocalPlayer then + return Enum.FriendStatus.NotFriend + else + local success, result = pcall(function() return game.Players.LocalPlayer:GetFriendStatus(player) end) + if success then + return result + else + return Enum.FriendStatus.NotFriend + end + end +end + + +local function getPrivilegeType(player) + local rank = player.PersonalServerRank + if rank >= privilegeOwner then + return privilegeOwner + elseif rank < privilegeOwner and rank >= privilegeAdmin then + return privilegeAdmin + elseif rank < privilegeAdmin and rank >= privilegeMember then + return privilegeMember + elseif rank < privilegeMember and rank >= privilegeVisitor then + return privilegeVisitor + else + return privilegeBanned + end +end + +--Populate the ContextMenus +addContextMenuLabel( + --GetText1 + function(player) + return "Loading..." + end, + --GetText2 + nil, + --IsVisible + function(player) + return getFriendStatus(player) == Enum.FriendStatus.Unknown + end) + +addContextMenuButton("Send " .. friendWord .. " Request", + --IsVisible + function(player) + return (not otherPlayerBlacklist[player]) and (getFriendStatus(player) == Enum.FriendStatus.NotFriend) + end, + --IsActive + function(player) + return true + end, + --DoIt? + function(player) + otherPlayerBlacklist[player] = true + return game.Players.LocalPlayer:RequestFriendship(player) + end +) +addContextMenuButton("Un" .. friendWordLowercase, + --IsVisible + function(player) + return getFriendStatus(player) == Enum.FriendStatus.Friend + end, + --IsActive + function(player) + return true + end, + --DoIt + function(player) + return game.Players.LocalPlayer:RevokeFriendship(player) + end +) +addContextMenuButton("Accept " .. friendWord .. " Request", + --IsVisible + function(player) + return (not friendRequestBlacklist[player]) and (getFriendStatus(player) == Enum.FriendStatus.FriendRequestReceived) + end, + --IsActive + function(player) + return true + end, + --DoIt + function(player) + return game.Players.LocalPlayer:RequestFriendship(player) + end +) + +addContextMenuButton("Deny " .. friendWord .. " Request", + --IsVisible + function(player) + return getFriendStatus(player) == Enum.FriendStatus.FriendRequestReceived + end, + --IsActive + function(player) + return true + end, + --DoIt + function(player) + friendRequestBlacklist[player] = true + return game.Players.LocalPlayer:RevokeFriendship(player) + end +) + +addContextMenuButton("Cancel " .. friendWord .. " Request", + --IsVisible + function(player) + return false -- disable cancel request for now (can lead to griefing) + --return getFriendStatus(player) == Enum.FriendStatus.FriendRequestSent + end, + --IsActive + function(player) + return true + end, + --DoIt + function(player) + otherPlayerBlacklist[player] = false + return game.Players.LocalPlayer:RevokeFriendship(player) + end +) + +function addPersonalServerContext() + if personalServerContextAdded then return end + personalServerContextAdded = true + addContextMenuButton("Ban", + --IsVisible + function(player) + return ( getPrivilegeType(game.Players.LocalPlayer) >= privilegeAdmin and (getPrivilegeType(player) < privilegeAdmin) ) + end, + --IsActive + function(player) + return true + end, + --DoIt + function(player) + player.PersonalServerRank = privilegeBanned + return true + end + ) + addContextMenuButton("Promote to Visitor", + --IsVisible + function(player) + return ( getPrivilegeType(game.Players.LocalPlayer) >= privilegeAdmin ) and ( getPrivilegeType(player) == privilegeBanned ) + end, + --IsActive + function(player) + return true + end, + --DoIt + function(player) + game:GetService("PersonalServerService"):Promote(player) + return true + end + ) + addContextMenuButton("Promote to Member", + --IsVisible + function(player) + return ( getPrivilegeType(game.Players.LocalPlayer) >= privilegeAdmin ) and ( getPrivilegeType(player) == privilegeVisitor ) + end, + --IsActive + function(player) + return true + end, + --DoIt + function(player) + game:GetService("PersonalServerService"):Promote(player) + return true + end + ) + addContextMenuButton("Promote to Admin", + --IsVisible + function(player) + return ( getPrivilegeType(game.Players.LocalPlayer) == privilegeOwner ) and ( getPrivilegeType(player) == privilegeMember ) + end, + --IsActive + function(player) + return true + end, + --DoIt + function(player) + game:GetService("PersonalServerService"):Promote(player) + return true + end + ) + addContextMenuButton("Demote to Member", + --IsVisible + function(player) + return ( getPrivilegeType(game.Players.LocalPlayer) == privilegeOwner ) and ( getPrivilegeType(player) == privilegeAdmin ) + end, + --IsActive + function(player) + return true + end, + --DoIt + function(player) + game:GetService("PersonalServerService"):Demote(player) + return true + end + ) + addContextMenuButton("Demote to Visitor", + --IsVisible + function(player) + return ( getPrivilegeType(game.Players.LocalPlayer) >= privilegeAdmin ) and ( getPrivilegeType(player) == privilegeMember ) + end, + --IsActive + function(player) + return true + end, + --DoIt + function(player) + game:GetService("PersonalServerService"):Demote(player) + return true + end + ) +end + +local function setupBuildToolManagement() + local buildToolManagerAssetId = 64164692 + game:GetService("ScriptContext"):AddCoreScript(buildToolManagerAssetId,game.Players.LocalPlayer,"BuildToolManager") +end + + +local function getStatColumns(players) + for i, player in ipairs(players) do + local leaderstats = player:FindFirstChild("leaderstats") + if leaderstats then + local stats = {} + local children = leaderstats:GetChildren() + if children then + for i, stat in ipairs(children) do + if stat:IsA("IntValue") then + table.insert(stats, stat) + else + --TODO: This should check for IntValue only but current ScoreHud does not + table.insert(stats, stat) + end + end + end + return stats + end + end + return nil +end + +local function determineBoardType() + local players = getPlayers() + + local foundLeaderstats = false + local numStats = 0 + local foundTeam = false + + local stats = getStatColumns(players) + if stats then + foundLeaderstats = true + numStats = #stats + end + + for i, player in ipairs(players) do + if not foundTeam then + if not player.Neutral then + foundTeam = true + break + end + end + end + + if foundLeaderstats and foundTeam then + return "TeamScore", numStats + elseif foundLeaderstats then + return "PlayerScore", numStats + elseif foundTeam then + return "TeamList", numStats + else + return "PlayerList", numStats + end +end + +local function toggleBigWindow() + if container == nil then + return + end + + if currentWindowState == "Big" then + --Hide it + if previousWindowState == nil or previousWindowState == "Big" or previousWindowState == "None" then + transitionWindowsFunction("None") + else + transitionWindowsFunction("Small") + end + else + previousWindowState = currentWindowState + transitionWindowsFunction("Big") + end +end +local previousBigPlayerList = nil +local function rebuildBoard(owner, boardType, numStats) + if topRightTrayContainer == nil then + topRightTrayContainer = owner:FindFirstChild("PlayerListTopRightFrame") + if topRightTrayContainer == nil then + topRightTrayContainer = Instance.new("Frame") + topRightTrayContainer.Name = "PlayerListTopRightFrame" + topRightTrayContainer.BackgroundTransparency = 1 + topRightTrayContainer.Size = UDim2.new(0.2, 16, 0.42, 16) + topRightTrayContainer.Position = UDim2.new(0.8, 0, 0, 0) + topRightTrayContainer.Parent = container + end + end + if minimizedState == nil then + minimizedState = Instance.new("Frame") + minimizedState.Name = "MinimizedPlayerlist" + minimizedState.BackgroundTransparency = 1 + minimizedState.Position = UDim2.new(1, -166, 0,0) + minimizedState.Size = UDim2.new(0, 151, 0, 30) + + playerListButton = Instance.new("ImageButton") + playerListButton.Name = "GoSmallButton" + playerListButton.Image = "rbxasset://textures/ui/playerlist_hidden_small.png" + playerListButton.BackgroundTransparency = 1 + playerListButton.Size = UDim2.new(0.0, 35, 0, 30) + playerListButton.Position = UDim2.new(1, -35, 0, 0) + playerListButton.MouseButton1Click:connect( + function() + transitionWindowsFunction("Small") + end) + playerListButton.Parent = minimizedState + + minimizedState.Visible = false + robloxLock(minimizedState) + minimizedState.Parent = topRightTrayContainer + end + if bigWindowImposter == nil then + bigWindowImposter = owner:FindFirstChild("BigPlayerListWindowImposter") + if bigWindowImposter == nil then + bigWindowImposter = Instance.new("Frame") + bigWindowImposter.Name = "BigPlayerListWindowImposter" + bigWindowImposter.Visible = false + bigWindowImposter.BackgroundColor3 = Color3.new(0,0,0) + bigWindowImposter.BackgroundTransparency = 0.7 + bigWindowImposter.BorderSizePixel = 0 + bigWindowImposter.Size = UDim2.new(0.4, 7, 0.4, 7) + bigWindowImposter.Position = UDim2.new(0.3, 0, 0.3, 0) + robloxLock(bigWindowImposter) + bigWindowImposter.Parent = container + end + end + if container == nil or container ~= owner then + container = owner + + topRightTrayContainer.Parent = container + bigWindowImposter.Parent = container + end + + local smallVisible = true + local bigVisible = false + if container then + if topRightTrayContainer then + --Delete the old boards + if topRightTrayContainer:FindFirstChild("SmallPlayerlist") then + smallVisible = topRightTrayContainer.SmallPlayerlist.Visible + topRightTrayContainer.SmallPlayerlist.Parent = nil + end + end + if container:FindFirstChild("BigPlayerlist") then + bigVisible = container.BigPlayerlist.Visible or (previousBigPlayerList ~= nil) + container.BigPlayerlist.Parent = nil + if previousBigPlayerList ~= nil then + pcall(function() game.GuiService:RemoveCenterDialog(previousBigPlayerList) end) + previousBigPlayerList = nil + end + end + end + + local smallBoard, bigBoard = createBoardsFunction(boardType, numStats) + if smallBoard then + smallBoard.Visible = smallVisible + smallBoard.Parent = topRightTrayContainer + recalculateSmallPlayerListSize(smallBoard) + end + if bigBoard then + if bigVisible then + previousBigPlayerList = bigBoard + local centerDialogSupported, msg = pcall(function() game.GuiService:AddCenterDialog(previousBigPlayerList, Enum.CenterDialogType.PlayerInitiatedDialog, + function() + previousBigPlayerList.Visible = true + end, + function() + previousBigPlayerList.Visible = false + end) + end) + bigBoard.Visible = bigVisible + else + bigBoard.Visible = false + end + bigBoard.Parent = container + end + return container +end + +function recalculateSmallPlayerListSize(smallPlayerList) +end + + +local function showBigPlayerWindow() + if container:FindFirstChild("BigPlayerlist") then + if container.BigPlayerlist.Visible then + return + end + end + + bigWindowImposter.Visible = true + bigWindowImposter:TweenSizeAndPosition(bigWindowSize, bigWindowPosition, Enum.EasingDirection.Out, bigEasingStyle, 0.3, true, + function(state) + if state == Enum.TweenStatus.Completed then + bigWindowImposter.Visible = false + if container:FindFirstChild("BigPlayerlist") then + container.BigPlayerlist.Visible = true + end + end + end) +end + +local function hideBigPlayerWindow(completed) + if playerContextMenu then + playerContextMenu.Visible = false + end + + if container:FindFirstChild("BigPlayerlist") then + if container.BigPlayerlist.Visible == false and bigWindowImposter.Visible == false then + if completed then + completed() + end + --Already completely hidden + return + end + container.BigPlayerlist.Visible = false + end + + local completedFunction = completed + bigWindowImposter.Visible = true + bigWindowImposter:TweenSizeAndPosition(UDim2.new(0.4, 0, 0.4, 0), UDim2.new(0.3, 0, 0.3, 0), Enum.EasingDirection.In, Enum.EasingStyle.Quart, 0.15, true, + function(state) + if state == Enum.TweenStatus.Completed then + bigWindowImposter.Visible = false + if completedFunction then + completedFunction() + end + end + end) +end +local function hideSmallPlayerWindow(completed) + if playerContextMenu then + playerContextMenu.Visible = false + end + if topRightTrayContainer:FindFirstChild("SmallPlayerlist") then + local completedFunction = completed + if topRightTrayContainer.SmallPlayerlist.Visible then + topRightTrayContainer.SmallPlayerlist:TweenPosition(UDim2.new(1,0,smallWindowPosition.Y.Scale, smallWindowPosition.Y.Offset), Enum.EasingDirection.Out, smallEasingStyle, 0.3, true, + function(state) + if state == Enum.TweenStatus.Completed then + if topRightTrayContainer:FindFirstChild("SmallPlayerlist") then + topRightTrayContainer.SmallPlayerlist.Visible = false + end + if completedFunction then + completedFunction() + end + end + end) + return + end + end + if completed then + completed() + end +end + + +transitionWindowsFunction = function(desiredState) + if desiredState == "Big" then + minimizedState.Visible = false + hideSmallPlayerWindow() + + if previousBigPlayerList ~= nil then + if previousBigPlayerList ~= container:FindFirstChild("BigPlayerlist") then + pcall(function() game.GuiService:RemoveCenterDialog(previousBigPlayerList) end) + previousBigPlayerList = nil + previousBigPlayerList = container:FindFirstChild("BigPlayerlist") + end + else + previousBigPlayerList = container:FindFirstChild("BigPlayerlist") + end + + if previousBigPlayerList then + local firstShow = false + local centerDialogSupported, msg = pcall(function() game.GuiService:AddCenterDialog(previousBigPlayerList, Enum.CenterDialogType.PlayerInitiatedDialog, + function() + if not firstShow then + showBigPlayerWindow() + firstShow = true + else + previousBigPlayerList.Visible = true + end + end, + function() + if previousBigPlayerList then + previousBigPlayerList.Visible = false + end + end) + end) + if centerDialogSupported == false then + print("Exception", msg) + showBigPlayerWindow() + end + else + showBigPlayerWindow() + end + currentWindowState = "Big" + elseif desiredState == "Small" then + minimizedState.Visible = false + if previousBigPlayerList ~= nil then + pcall(function() game.GuiService:RemoveCenterDialog(previousBigPlayerList) end) + previousBigPlayerList = nil + end + + hideBigPlayerWindow() + if topRightTrayContainer:FindFirstChild("SmallPlayerlist") then + if not topRightTrayContainer.SmallPlayerlist.Visible or topRightTrayContainer.SmallPlayerlist.Position ~= smallWindowPosition then + topRightTrayContainer.SmallPlayerlist.Visible = true + topRightTrayContainer.SmallPlayerlist:TweenPosition(smallWindowPosition, Enum.EasingDirection.Out, smallEasingStyle, 0.3, true) + end + end + currentWindowState = "Small" + elseif desiredState == "None" then + if previousBigPlayerList ~= nil then + pcall(function() game.GuiService:RemoveCenterDialog(previousBigPlayerList) end) + previousBigPlayerList = nil + end + + local smallDone = false + local bigDone = false + hideSmallPlayerWindow( + function() + smallDone = true + if bigDone and smallDone then + minimizedState.Visible = true + end + end) + hideBigPlayerWindow( + function() + bigDone = true + if bigDone and smallDone then + minimizedState.Visible = true + end + end) + currentWindowState = "None" + end +end + +local function getStatValuesForPlayer(player) + local leaderstats = player:FindFirstChild("leaderstats") + if leaderstats then + local children = leaderstats:GetChildren() + if children then + local result = {} + --Just go based on position + for i, stat in ipairs(children) do + if stat:IsA("IntValue") then + table.insert(result, stat) + else + table.insert(result, 0) + end + end + + return result, leaderstats + end + end + return nil +end + +--ChildAdded on Player (if it's name is "leaderstats") + +if UserSettings and LoadLibrary then + + RbxGui,msg = t + + local function createTeamName(name, color) + local fontHeight = 20 + local frame = Instance.new("Frame") + frame.Name = "Team-" .. name + frame.BorderSizePixel = 0 + frame.BackgroundTransparency = 0.5 + frame.BackgroundColor3 = Color3.new(1,1,1) + frame.Size = UDim2.new(1, 0, 0, fontHeight) + frame.Position = UDim2.new(0,0,0,0) + + local label = Instance.new("TextLabel") + label.Name = "NameLabel" + label.Text = " " .. name + label.Font = Enum.Font.ArialBold + label.FontSize = Enum.FontSize.Size18 + label.Position = UDim2.new(0,0,0,0) + label.Size = UDim2.new(1,0,1,0) + label.TextColor3 = Color3.new(1,1,1) + label.BackgroundTransparency = 0.5 + label.BackgroundColor3 = getColor(color) + label.BorderSizePixel = 0 + label.TextXAlignment = Enum.TextXAlignment.Left + + local changeFunc = nil + label, changeFunc = RbxGui.AutoTruncateTextObject(label) + label.Parent = frame + + return frame, changeFunc + end + + local function getFriendStatusIcon(friendStatus) + if friendStatus == Enum.FriendStatus.Unknown or friendStatus == Enum.FriendStatus.NotFriend then + return nil + elseif friendStatus == Enum.FriendStatus.Friend then + return "rbxasset://textures/ui/PlayerlistFriendIcon.png" + elseif friendStatus == Enum.FriendStatus.FriendRequestSent then + return "rbxasset://textures/ui/PlayerlistFriendRequestSentIcon.png" + elseif friendStatus == Enum.FriendStatus.FriendRequestReceived then + return "rbxasset://textures/ui/PlayerlistFriendRequestReceivedIcon.png" + else + error("Unknown FriendStatus: " .. friendStatus) + end + end + + local function getMembershipTypeIcon(membershipType, playerName) + if membershipType == Enum.MembershipType.None then + return "rbxasset://../../../shareddata/charcustom/custom/icons/"..playerName..".png" + elseif membershipType == Enum.MembershipType.BuildersClub then + return "rbxasset://textures/ui/TinyBcIcon.png" + elseif membershipType == Enum.MembershipType.TurboBuildersClub then + return "rbxasset://textures/ui/TinyTbcIcon.png" + elseif membershipType == Enum.MembershipType.OutrageousBuildersClub then + return "rbxasset://textures/ui/TinyObcIcon.png" + else + error("Uknown membershipType" .. membershipType) + end + end + + + local function updatePlayerFriendStatus(nameObject, friendStatus) + local fontHeight = 20 + + local friendIconImage = getFriendStatusIcon(friendStatus) + nameObject.MembershipTypeLabel.FriendStatusLabel.Visible = (friendIconImage ~= nil) + + if friendIconImage ~= nil then + --Show friend icon + nameObject.MembershipTypeLabel.FriendStatusLabel.Image = friendIconImage + nameObject.NameLabel.Position =UDim2.new(0,2*fontHeight,0,1) + nameObject.NameLabel.Size = UDim2.new(1,-2*fontHeight,1,-2) + else + --Hide the friend icon + nameObject.NameLabel.Position = UDim2.new(0,fontHeight+1,0,1) + nameObject.NameLabel.Size = UDim2.new(1,-(fontHeight+1),1,-2) + end + end + local function updatePlayerName(nameObject, membershipStatus, teamColor) + local fontHeight = 20 + + local playerName = nameObject.NameLabel.Text + + nameObject.Size = UDim2.new(1,0,0,fontHeight) + nameObject.MembershipTypeLabel.Image = getMembershipTypeIcon(membershipStatus, playerName) + end + + + local function updatePlayerNameColor(player, teamColor) + local function updatePlayerNameColorHelper(nameObject) + if teamColor ~= nil then + nameObject.NameLabel.TextColor3 = getColor(teamColor) + nameObject.NameLabel.FullNameLabel.TextColor3 = getColor(teamColor) + else + nameObject.NameLabel.TextColor3 = Color3.new(1,1,1) + nameObject.NameLabel.FullNameLabel.TextColor3 = Color3.new(1,1,1) + end + end + + updatePlayerNameColorHelper(playerTable[player].NameObjectSmall) + updatePlayerNameColorHelper(playerTable[player].NameObjectBig) + end + + + local function createPlayerName(name, membershipStatus, teamColor, friendStatus) + local frame = Instance.new("Frame") + frame.Name = "Player_" .. name + frame.BackgroundColor3 = Color3.new(1,1,1) + frame.BackgroundTransparency = 0.5 + frame.BorderSizePixel = 0 + + local membershipStatusLabel = Instance.new("ImageLabel") + membershipStatusLabel.Name = "MembershipTypeLabel" + membershipStatusLabel.BackgroundTransparency = 1 + membershipStatusLabel.Size = UDim2.new(1,0,1,0) + membershipStatusLabel.Position = UDim2.new(0,0,0,0) + membershipStatusLabel.SizeConstraint = Enum.SizeConstraint.RelativeYY + membershipStatusLabel.Parent = frame + + local friendStatusLabel = Instance.new("ImageLabel") + friendStatusLabel.Name = "FriendStatusLabel" + friendStatusLabel.Visible = false + friendStatusLabel.BackgroundTransparency = 1 + friendStatusLabel.Size = UDim2.new(1,0,1,0) + friendStatusLabel.Position = UDim2.new(1,0,0,0) + friendStatusLabel.Parent = membershipStatusLabel + + local changeNameFunction + local nameLabel = Instance.new("TextLabel") + nameLabel.Name = "NameLabel" + nameLabel.Text = name + nameLabel.Font = Enum.Font.ArialBold + nameLabel.FontSize = Enum.FontSize.Size14 + nameLabel.TextColor3 = Color3.new(1,1,1) + nameLabel.BackgroundTransparency = 1 + nameLabel.BackgroundColor3 = Color3.new(0,0,0) + nameLabel.TextXAlignment = Enum.TextXAlignment.Left + nameLabel, changeNameFunction = RbxGui.AutoTruncateTextObject(nameLabel) + nameLabel.Parent = frame + + updatePlayerName(frame, membershipStatus, teamColor) + if supportFriends and not friendRequestBlacklist[game.Players:FindFirstChild(name)] then + updatePlayerFriendStatus(frame, friendStatus) + else + updatePlayerFriendStatus(frame, Enum.FriendStatus.NotFriend) + end + return frame, changeNameFunction + end + + local function createStatColumn(i, numColumns, isTeam, color3, isHeader, stat) + local textLabel = Instance.new("TextButton") + textLabel.Name = "Stat" .. i + textLabel.AutoButtonColor = false + textLabel.TextColor3 = Color3.new(1,1,1) + textLabel.TextXAlignment = Enum.TextXAlignment.Right + textLabel.TextYAlignment = Enum.TextYAlignment.Center + textLabel.FontSize = Enum.FontSize.Size14 + + if isHeader then + textLabel.FontSize = Enum.FontSize.Size18 + else + textLabel.FontSize = Enum.FontSize.Size14 + end + if isHeader or isTeam then + textLabel.Font = Enum.Font.ArialBold + else + textLabel.Font = Enum.Font.Arial + end + + if isTeam then + textLabel.BackgroundColor3 = color3 + textLabel.Text = 0 + else + textLabel.BackgroundColor3 = Color3.new(0,0,0) + textLabel.Text = "" + end + textLabel.BackgroundTransparency = 1 + if i == numColumns then + textLabel.Size = UDim2.new(1/numColumns, -6, 1, 0) + else + textLabel.Size = UDim2.new(1/numColumns, -4, 1, 0) + end + + textLabel.Position = UDim2.new((i-1) * (1/numColumns), 0, 0, 0) + + local truncLabel, changer = RbxGui.AutoTruncateTextObject(textLabel) + + if isHeader then + local mouseCon = {} + + mouseCon[1] = truncLabel.MouseEnter:connect(function() + truncLabel.BackgroundTransparency = 0.2 + end) + mouseCon[2] = truncLabel.MouseLeave:connect(function() + truncLabel.BackgroundTransparency = 1 + end) + + mouseCon[3] = truncLabel.MouseButton1Click:connect(function() + sortPlayerListsFunction(truncLabel:GetChildren()[1].Name, (currentSortName == truncLabel:GetChildren()[1].Name) ) + truncLabel.BackgroundTransparency = 1 + end) + + mouseCon[4] = truncLabel:GetChildren()[1].MouseButton1Click:connect(function() + sortPlayerListsFunction(textLabel.Name, (currentSortName == truncLabel.Name) ) + truncLabel.BackgroundTransparency = 1 + end) + + mouseCon[5] = nil + mouseCon[5] = truncLabel.AncestryChanged:connect(function(child,parent) + if parent == nil then + for i,connection in pairs(mouseCon) do + connection:disconnect() + end + end + end) + end + + return truncLabel, changer + end + + local function createStatHeaders(stats, numColumns, isBig) + local frame = Instance.new("Frame") + frame.Name = "Headers" + frame.BorderSizePixel = 0 + frame.BackgroundColor3 = Color3.new(0,0,0) + frame.BackgroundTransparency = 1 + + local nameSize + if isBig then + nameSize = 0.5 + elseif numColumns == 1 then + nameSize = 0.7 + elseif numColumns == 2 then + nameSize = 0.6 + else + nameSize = 0.45 + end + frame.Size = UDim2.new(1-nameSize, 0, 1,0) + if isBig then + frame.Position = UDim2.new(nameSize,-25, 0,0) + else + frame.Position = UDim2.new(nameSize,0, 0,0) + end + + local i = 1 + while i <= numColumns do + local headerColumn, changeText = createStatColumn(i, numColumns, false, nil, true,stats[i]) + changeText(stats[i].Name) + headerColumn.Parent = frame + i = i + 1 + end + return frame, textChangers + end + + local function createStatColumns(nameObject, numColumns, isTeam, isBig) + local frame = Instance.new("Frame") + frame.Name = nameObject.Name .. "_WithStats" + frame.BorderSizePixel = 0 + frame.BackgroundColor3 = nameObject.BackgroundColor3 + frame.BackgroundTransparency = nameObject.BackgroundTransparency + frame.Size = nameObject.Size + frame.Position = nameObject.Position + + nameObject.BackgroundTransparency = 1 + + if numColumns == 0 then + nameObject.Size = UDim2.new(1,0,1,0) + nameObject.Position = UDim2.new(0,0,0,0) + nameObject.Parent = frame + return frame + end + + local statFrame = Instance.new("Frame") + statFrame.Name = "Stats" + if isTeam then + statFrame.BorderSizePixel = 0 + statFrame.BackgroundColor3 = nameObject.NameLabel.BackgroundColor3 + statFrame.BackgroundTransparency = nameObject.NameLabel.BackgroundTransparency + else + statFrame.BackgroundTransparency = 1 + end + + local nameSize + if isBig then + nameSize = 0.5 + elseif numColumns == 1 then + nameSize = 0.7 + elseif numColumns == 2 then + nameSize = 0.6 + else + nameSize = 0.45 + end + nameObject.Size = UDim2.new(nameSize, 0, 1, 0) + nameObject.Position = UDim2.new(0, 0, 0, 0) + statFrame.Size = UDim2.new(1-nameSize,0, 1,0) + statFrame.Position = UDim2.new(nameSize,0, 0,0) + + nameObject.Parent = frame + statFrame.Parent = frame + + local textChangers = {} + local i = 1 + while i <= numColumns do + local statColumn, changeText = createStatColumn(i, numColumns, isTeam, statFrame.BackgroundColor3) + statColumn.Parent = statFrame + table.insert(textChangers, changeText) + + i = i + 1 + end + + return frame, statFrame, textChangers + end + + local function createAlternatingRows(objects) + for i, line in ipairs(objects) do + if i % 2 == 0 then + line.BackgroundTransparency = 1 + else + line.BackgroundTransparency = 0.95 + end + end + end + local removeFromTeam = nil + + local function clearTableEntry(obj, tableInfo) + if tableInfo.MainObjectSmall then + tableInfo.MainObjectSmall.Parent = nil + tableInfo.MainObjectSmall = nil + end + if tableInfo.MainObjectBig then + tableInfo.MainObjectBig.Parent = nil + tableInfo.MainObjectBig = nil + end + if tableInfo.Connections then + for i, connection in ipairs(tableInfo.Connections) do + connection:disconnect() + end + tableInfo.Connections = nil + end + if tableInfo.LeaderStatConnections then + for i, connection in ipairs(tableInfo.LeaderStatConnections) do + connection:disconnect() + end + tableInfo.LeaderStatConnections = nil + end + if tableInfo.CurrentTeam then + removeFromTeam(obj) + tableInfo.CurrentTeam = nil + end + if tableInfo.Players then + for i, player in ipairs(tableInfo.Players) do + playerTable[player].CurrentTeam = nil + end + tableInfo.Players = {} + end + if tableInfo.StatValues then + tableInfo.StatValues = nil + end + end + + local function resetPlayerTable() + for player, info in pairs(playerTable) do + clearTableEntry(player, info) + playerTable[player] = nil + end + playerTable = {} + end + + local function resetTeamTable() + for team, info in pairs(teamTable) do + clearTableEntry(team, info) + teamTable[team] = nil + end + teamTable = {} + teamColorTable = {} + end + + local function getBoardTypeInfo() + local isTeam = (currentBoardType == "TeamScore" or currentBoardType == "TeamList") + local isScore = (currentBoardType == "TeamScore" or currentBoardType == "PlayerScore") + return isTeam, isScore + end + + + local function recomputeTeamScore(team, column) + if not team or team == "Neutral" then + return + end + + local function recomputeScoreHelper(statChangers) + if statChangers and column <= #statChangers then + local sum = 0 + for i, p in ipairs(teamTable[team].Players) do + if playerTable[p].StatValues and column <= #playerTable[p].StatValues then + sum = sum + playerTable[p].StatValues[column].Value + end + end + statChangers[column](sum) + end + end + + recomputeScoreHelper(teamTable[team].StatChangersSmall) + recomputeScoreHelper(teamTable[team].StatChangersBig) + end + local function recomputeCompleteTeamScore(team) + local col = 1 + while col <= currentStatCount do + recomputeTeamScore(team, col) + col = col + 1 + end + end + removeFromTeam = function(player) + if playerTable[player].CurrentTeam ~= nil and teamTable[playerTable[player].CurrentTeam] ~= nil then + ArrayRemove(teamTable[playerTable[player].CurrentTeam].Players, player) + recomputeCompleteTeamScore(playerTable[player].CurrentTeam) + playerTable[player].CurrentTeam = nil + end + end + + local function assignToTeam(player) + local isTeam, isScore = getBoardTypeInfo() + + if isTeam then + local newTeam = nil + + if player.Neutral or teamColorTable[player.TeamColor.Name] == nil then + newTeam = "Neutral" + else + newTeam = teamColorTable[player.TeamColor.Name] + end + + if playerTable[player].CurrentTeam == newTeam then + return + end + + local oldTeam = playerTable[player].LastTeam + removeFromTeam(player) + + playerTable[player].CurrentTeam = newTeam + + if teamTable[oldTeam] and teamTable[oldTeam]["NameChangeFuncBig"] then + if #teamTable[oldTeam].Players < 1 then + teamTable[oldTeam]["NameChangeFuncBig"](" " .. oldTeam.Name) + else + teamTable[oldTeam]["NameChangeFuncBig"](" " .. oldTeam.Name .. " (" .. tostring(#teamTable[oldTeam].Players) ..")") + end + end + + if teamTable[newTeam] then + table.insert(teamTable[newTeam].Players, player) + if newTeam["Name"] then + if teamTable[newTeam]["NameChangeFuncBig"] then + if #teamTable[newTeam].Players < 1 then + teamTable[newTeam]["NameChangeFuncBig"](" " .. newTeam.Name) + else + teamTable[newTeam]["NameChangeFuncBig"](" " .. newTeam.Name .. " (" .. tostring(#teamTable[newTeam].Players) ..")") + end + end + end + end + + if newTeam == "Neutral" then + updatePlayerNameColor(player, nil) + else + updatePlayerNameColor(player, player.TeamColor) + end + + playerTable[player].LastTeam = newTeam + + recomputeCompleteTeamScore(newTeam) + + --Relayout + if sortPlayerListsFunction then + sortPlayerListsFunction() + end + end + end + + local function buildTeamObject(team, numStatColumns, suffix) + local isTeam, isScore = getBoardTypeInfo() + local teamObject, changeFunc = createTeamName(team.Name, team.TeamColor) + teamObject.NameLabel.Text = " " .. team.Name .. " (0)" + if not teamTable[team] then + teamTable[team] = {} + end + teamTable[team]["NameObject" .. suffix] = teamObject + teamTable[team]["NameChangeFunc" .. suffix] = changeFunc + if isScore then + local statObject + local textChangers + teamObject, statObject, textChangers = createStatColumns(teamObject, numStatColumns, true, suffix == "Big") + teamTable[team]["StatObject" .. suffix] = statObject + teamTable[team]["StatChangers" .. suffix] = textChangers + end + teamTable[team]["MainObject" .. suffix] = teamObject + changeFunc(" " .. team.Name) + if not teamTable[team].Players then + teamTable[team].Players = {} + else + if suffix ~= "Small" and #teamTable[team].Players > 0 then + changeFunc(" " .. team.Name .. " (" .. tostring(#teamTable[team].Players) ..")") + end + end + + return teamObject + end + + local currentContextMenuPlayer = nil + local function updatePlayerContextMenu(player,x,y) + currentContextMenuPlayer = player + local elementHeight = 18 + local function highlight(button) + button.TextColor3 = Color3.new(0,0,0) + button.BackgroundColor3 = Color3.new(0.8,0.8,0.8) + end + local function clearHighlight(button) + button.TextColor3 = Color3.new(1,1,1) + button.BackgroundColor3 = Color3.new(0,0,0) + end + if playerContextMenu == nil then + elementNames = {} + elementNameToElement = {} + + for i, contextElement in ipairs(contextMenuElements) do + table.insert(elementNames, contextElement.Text) + elementNameToElement[tostring(contextElement.Text)] = contextElement + end + + playerContextMenu = Instance.new("TextButton") + playerContextMenu.Name = "PlayerListContextMenu" + playerContextMenu.Style = Enum.ButtonStyle.RobloxButton + playerContextMenu.Text = "" + playerContextMenu.Visible = false + playerContextMenu.ZIndex = 4 + + playerContextMenu.MouseLeave:connect(function() + local menuChildren = playerContextMenu:GetChildren() + for i = 1, #menuChildren do + if menuChildren[i].Name == "ChoiceButton" then + menuChildren[i].TextColor3 = Color3.new(1,1,1) + menuChildren[i].BackgroundTransparency = 1 + end + end + playerContextMenu.Visible = false + inContextMenu = false + end) + + playerContextMenu.MouseEnter:connect(function() + inContextMenu = true + end) + + for i = 1, #elementNames do + local newElementButton = Instance.new("TextButton") + newElementButton.Name = "ChoiceButton" + newElementButton.Text = elementNames[i] + newElementButton.TextColor3 = Color3.new(1,1,1) + newElementButton.Font = Enum.Font.Arial + newElementButton.FontSize = Enum.FontSize.Size14 + newElementButton.BackgroundTransparency = 1 + newElementButton.TextWrap = true + newElementButton.Size = UDim2.new(1,0,0,elementHeight) + newElementButton.Position = UDim2.new(0,0,0,elementHeight * (i - 1)) + newElementButton.ZIndex = playerContextMenu.ZIndex + 1 + + newElementButton.MouseEnter:connect(function() + newElementButton.TextColor3 = Color3.new(0,0,0) + newElementButton.BackgroundTransparency = 0 + end) + + newElementButton.MouseLeave:connect(function() + newElementButton.TextColor3 = Color3.new(1,1,1) + newElementButton.BackgroundTransparency = 1 + end) + + newElementButton.MouseButton1Click:connect(function() + local element = elementNameToElement[newElementButton.Text] + pcall(function() element.DoIt(currentContextMenuPlayer) end) + playerContextMenu.Visible = false + newElementButton.TextColor3 = Color3.new(1,1,1) + newElementButton.BackgroundTransparency = 1 + end) + + newElementButton.Parent = playerContextMenu + end + + robloxLock(playerContextMenu) + playerContextMenu.Parent = script.Parent + + end + + local visibleElements = 0 + for i, contextElement in ipairs(contextMenuElements) do + local isVisible = false + + if contextElement.IsVisible then + local success, visible = pcall(function() return contextElement.IsVisible(currentContextMenuPlayer) end) + if success then + isVisible = visible + else + print("Error in IsVisible call: " .. visible) + end + end + + if isVisible then + local foundElement = false + for i = 1, #elementNames do + if elementNames[i] == contextElement.Text then + foundElement = true + break + end + end + if not foundElement then + table.insert(elementNames,contextElement.Text) + end + visibleElements = visibleElements + 1 + else + for i = 1, #elementNames do + if elementNames[i] == contextElement.Text then + table.remove(elementNames,i) + break + end + end + end + end + playerContextMenu.Size = UDim2.new(0, 150, 0, elementHeight + (elementHeight * visibleElements) ) + + if x and y then + x = x - (playerContextMenu.AbsoluteSize.X/2) + if x + playerContextMenu.AbsoluteSize.X >= script.Parent.AbsoluteSize.X then + x = script.Parent.AbsoluteSize.X - playerContextMenu.AbsoluteSize.X + end + playerContextMenu.Position = UDim2.new(0, x, 0, y - 3) + end + + local elementPos = 0 + local contextChildren = playerContextMenu:GetChildren() + for i = 1, #contextChildren do + if contextChildren[i]:IsA("GuiObject") and contextChildren[i].Name == "ChoiceButton" then + contextChildren[i].Visible = false + for j = 1, #elementNames do + if elementNames[j] == contextChildren[i].Text then + contextChildren[i].Visible = true + contextChildren[i].Position = UDim2.new(0,0,0,elementPos * elementHeight) + elementPos = elementPos + 1 + break + end + end + end + end + end + + local function playerContextMenuHasItems() + if playerContextMenu then + local children = playerContextMenu:GetChildren() + for i = 1, #children do + if children[i]:IsA("GuiObject") and children[i].Name == "ChoiceButton" and children[i].Visible then + return true + end + end + end + return false + end + + local function showPlayerMenu(player, x, y) + updatePlayerContextMenu(player,x,y) + if not playerContextMenuHasItems() then return end -- don't show if we have nothing to show + playerContextMenu.Visible = true + end + + local function buildPlayerObject(player, numStatColumns, suffix) + if not player then return nil end + + local isTeam, isScore = getBoardTypeInfo() + + local playerObject = nil + local changePlayerNameFunction = nil + local currentColor = nil + if isTeam and not player.Neutral then + currentColor = player.TeamColor.Color + else + currentColor = Color3.new(1,1,1) + end + playerObject, changePlayerNameFunction = createPlayerName(player.Name, player.MembershipType, currentColor, getFriendStatus(player)) + + if not playerTable[player] then + playerTable[player] = {} + end + if not playerTable[player].Connections then + playerTable[player].Connections = {} + end + if not playerTable[player].CurrentTeam then + playerTable[player].CurrentTeam = nil + end + if not playerTable[player].LastTeam then + playerTable[player].LastTeam = nil + end + playerTable[player]["NameObject" .. suffix] = playerObject + playerTable[player]["ChangeName" .. suffix] = changePlayerNameFunction + + if isScore then + local statObject = nil + local textChangers = nil + playerObject, statObject, textChangers = createStatColumns(playerObject, numStatColumns, false, suffix == "Big") + playerTable[player]["StatObject" .. suffix]= statObject + playerTable[player]["StatChangers" .. suffix] = textChangers + + local statValues, leaderstats = getStatValuesForPlayer(player) + if not statValues or #statValues < numStatColumns then + if not playerTable[player].LeaderStatConnections then + playerTable[player].LeaderStatConnections = {} + end + --Setup a listener to see when this data gets filled in + if not leaderstats then + --We don't even have a leaderstats child, wait for one + table.insert(playerTable[player].LeaderStatConnections, + player.ChildAdded:connect( + function(child) + if child.Name == "leaderstats" then + --Connections will be torn down + recreatePlayerFunction(player) + else + table.insert(playerTable[player].LeaderStatConnections, + child.Changed:connect( + function(prop) + if prop == "Name" and child.Name == "leaderstats" then + --Connections will be torn down + recreatePlayerFunction(player) + end + end)) + end + end)) + else + --We have a leaderstats, but not enough children, recreate if we get them + table.insert(playerTable[player].LeaderStatConnections, + leaderstats.ChildAdded:connect( + function(child) + --TODO only look for IntValue + recreatePlayerFunction(player) + end) + ) + table.insert(playerTable[player].LeaderStatConnections, + leaderstats.AncestryChanged:connect( + function(child) + --We got deleted, try again + recreatePlayerFunction(player) + end) + ) + end + end + if statValues then + if not playerTable[player].StatValues then + playerTable[player].StatValues = {} + end + local pos = 1 + while pos <= numStatColumns and pos <= #statValues do + local currentColumn = pos + local statValue = statValues[pos] + local statChanger = textChangers[pos] + + local updateStat = function(val) + statChanger(val) + if playerTable[player] ~= nil then recomputeTeamScore(playerTable[player].CurrentTeam, currentColumn) end + end + if pos > #playerTable[player].StatValues then + table.insert(playerTable[player].StatValues, statValue) + end + + if type(statValue) ~= "number" and statValue["Changed"] then + table.insert(playerTable[player].Connections, + statValue.Changed:connect(updateStat) + ) + end + + table.insert(playerTable[player].Connections, + statValue.AncestryChanged:connect( + function() + recreatePlayerFunction(player) + end) + ) + updateStat(statValue.Value) + pos = pos + 1 + end + end + end + + if supportFriends and player ~= game.Players.LocalPlayer and player.userId > 0 and game.Players.LocalPlayer.userId > 0 then + local button = Instance.new("TextButton") + button.Name = playerObject.Name .. "Button" + button.Text = "" + button.Active = false + button.Size = playerObject.Size + button.Position = playerObject.Position + button.BackgroundColor3 = playerObject.BackgroundColor3 + + local secondButton = Instance.new("TextButton") + secondButton.Name = playerObject.Name .. "RealButton" + secondButton.Text = "" + secondButton.BackgroundTransparency = 1 + secondButton.BackgroundColor3 = playerObject.BackgroundColor3 + local theNameLabel = playerObject:findFirstChild("NameLabel",true) + secondButton.Parent.BackgroundTransparency = 1 + secondButton.Parent.Visible = true + secondButton.ZIndex = 2 + secondButton.Size = UDim2.new(1,0,1,0) + + local previousTransparency = nil + table.insert(playerTable[player].Connections, + secondButton.MouseEnter:connect( + function(x,y) + if playerContextMenu and playerContextMenu.Visible then + return + end -- don't update if we currently see it + + updatePlayerContextMenu(player,x,y) + if not playerContextMenuHasItems() then return end -- don't show if we have nothing to show + + if previousTransparency == nil then + previousTransparency = secondButton.BackgroundTransparency + end + secondButton.Parent.BackgroundTransparency = 0 + end)) + table.insert(playerTable[player].Connections, + secondButton.MouseLeave:connect( + function() + if previousTransparency ~= nil then + previousTransparency = nil + end + delay(0.01,function() + if playerContextMenu and not inContextMenu then + playerContextMenu.Visible = false + end + end) + secondButton.Parent.BackgroundTransparency = 1 + end)) + + local mouseDownX, mouseDownY + table.insert(playerTable[player].Connections, + secondButton.MouseButton1Down:connect(function(x,y) + mouseDownX = x + mouseDownY = y + end)) + table.insert(playerTable[player].Connections, + secondButton.MouseButton1Click:connect(function() + showPlayerMenu(player, mouseDownX, secondButton.AbsolutePosition.Y + secondButton.AbsoluteSize.Y ) + end)) + playerObject.BackgroundTransparency = 1 + playerObject.Size = UDim2.new(1,0,1,0) + playerObject.Position = UDim2.new(0,0,0,0) + playerObject.Parent = button + + playerTable[player]["MainObject" .. suffix] = button + + playerObject = button + else + playerTable[player]["MainObject" .. suffix] = playerObject + + if player == game.Players.LocalPlayer and supportFriends then + table.insert(playerTable[player].Connections, + player.FriendStatusChanged:connect( + function(otherPlayer, friendStatus) + if friendRequestBlacklist[otherPlayer] then + updatePlayerFriendStatus(playerTable[otherPlayer]["NameObject" .. suffix], Enum.FriendStatus.NotFriend) + elseif playerTable[otherPlayer] then + updatePlayerFriendStatus(playerTable[otherPlayer]["NameObject" .. suffix], friendStatus) + end + end) + ) + end + end + table.insert(playerTable[player].Connections, + player.Changed:connect( + function(prop) + if prop == "MembershipType" then + updatePlayerName(playerTable[player]["NameObject" .. suffix], player.MembershipType, currentColor) + elseif prop == "Name" then + playerTable[player]["ChangeName" .. suffix](player.Name) + elseif prop == "Neutral" or prop == "TeamColor" then + assignToTeam(player) + end + end) + ) + return playerObject + end + + local function doSort(tableToSort, objectName, order, startPos, sortType, ascending) + local orderedPlayerTable = {} + getLocalPlayer = false + for i, player in ipairs(tableToSort) do + if playerTable[player] then + if playerTable[player][objectName] ~= nil then + if player ~= game.Players.LocalPlayer then + table.insert(orderedPlayerTable,playerTable[player][objectName]) + else + getLocalPlayer = true + end + end + end + end + + if sortType == nil then -- default back to alphabetical sort + table.sort(orderedPlayerTable,function(a,b) + return string.lower(a:FindFirstChild("FullNameLabel",true).Text) < string.lower(b:FindFirstChild("FullNameLabel",true).Text) + end) + else -- we are sorting by a value + table.sort(orderedPlayerTable,function(a,b) + if ascending then + currentSortName = "" + return tonumber(a:FindFirstChild(sortType,true).Text) > tonumber(b:FindFirstChild(sortType,true).Text) + else + currentSortName = sortType + return tonumber(a:FindFirstChild(sortType,true).Text) < tonumber(b:FindFirstChild(sortType,true).Text) + end + end) + end + if getLocalPlayer and playerTable[game.Players.LocalPlayer] and playerTable[game.Players.LocalPlayer][objectName] then + table.insert(orderedPlayerTable,1,playerTable[game.Players.LocalPlayer][objectName]) + end + for i = 1, #orderedPlayerTable do + order[orderedPlayerTable[i]] = startPos + startPos = startPos + 1 + end + + return startPos + end + + local function orderScrollList(scrollOrder, objectName, scrollFrame, sortType, ascending) + local pos = 0 + local order = {} + local isTeam, isScore = getBoardTypeInfo() + for i, obj in ipairs(scrollOrder) do + order[obj] = 0 + end + + if isTeam then + local teams = getTeams() + for i, team in ipairs(teams) do + if teamTable[team][objectName] then + order[teamTable[team][objectName]] = pos + pos = pos + 1 + end + pos = doSort(teamTable[team].Players, objectName, order, pos, sortType, ascending) + end + + if #teamTable["Neutral"].Players > 0 then + teamTable["Neutral"][objectName].Parent = scrollFrame + order[teamTable["Neutral"][objectName]] = pos + pos = pos + 1 + doSort(teamTable["Neutral"].Players, objectName, order, pos, sortType, ascending) + else + teamTable["Neutral"][objectName].Parent = nil + end + else + local players = getPlayers() + doSort(players, objectName, order, pos, sortType, ascending) + end + + table.sort(scrollOrder, + function(a,b) + return order[a] < order[b] + end) + end + + local function createPlayerListBasics(frame, isBig) + local headerFrame = Instance.new("Frame") + headerFrame.Name = "Header" + headerFrame.BackgroundTransparency = 1 + headerFrame.Size = UDim2.new(1,-13,0,26) + headerFrame.Position = UDim2.new(0,0,0,0) + headerFrame.Parent = frame + + local lowerPaneFrame = Instance.new("Frame") + lowerPaneFrame.Name = "ScrollingArea" + lowerPaneFrame.BackgroundTransparency = 1 + lowerPaneFrame.Size = UDim2.new(1,-3,1,-26) + if not isBig then lowerPaneFrame.Size = UDim2.new(1,-3,1,-30) end + lowerPaneFrame.Position = UDim2.new(0,0,0,26) + lowerPaneFrame.Parent = frame + + local scrollOrder = {} + local scrollFrame, scrollUp, scrollDown, recalculateScroll, scrollBar = RbxGui.CreateScrollingFrame(scrollOrder) + + scrollBar.Size = UDim2.new(0, 17, 1, -36) + if isBig then scrollBar.Size = UDim2.new(0, 17, 1, -61) end + scrollBar.Parent = lowerPaneFrame + + scrollFrame.Parent = lowerPaneFrame + scrollUp.Parent = lowerPaneFrame + scrollDown.Parent = lowerPaneFrame + + if isBig then + scrollFrame.Position = UDim2.new(0,0,0,0) + scrollUp.Position = UDim2.new(1,-41,0,5) + scrollDown.Position = UDim2.new(1,-41,1,-35) + scrollBar.Position = UDim2.new(1, -41, 0, 24) + + scrollFrame.Size = UDim2.new(1,-48,1,-16) + headerFrame.Size = UDim2.new(1,-20,0,26) + + else + scrollBar.Position = UDim2.new(1, -15, 0, 14) + scrollBar.Size = UDim2.new(0,17,1,-36) + scrollFrame.Position = UDim2.new(0,1,0,0) + scrollUp.Position = UDim2.new(1,-15,0,-5) + scrollDown.Position = UDim2.new(1,-15,1,-20) + + lowerPaneFrame.Position = UDim2.new(0,0,0,30) + + local toggleScrollBar = function(visible) + if visible then + scrollFrame.Size = UDim2.new(1,-16,1,0) + headerFrame.Size = UDim2.new(1,-16,0,smallWindowHeaderYSize) + else + scrollFrame.Size = UDim2.new(1,0,1,0) + headerFrame.Size = UDim2.new(1,0,0,smallWindowHeaderYSize) + end + scrollUp.Visible = visible + scrollDown.Visible = visible + scrollBar.Visible = visible + end + scrollUp.Changed:connect(function(prop) + if prop == "Active" then + toggleScrollBar(scrollUp.Active or scrollDown.Active) + end + end) + + scrollDown.Changed:connect(function(prop) + if prop == "Active" then + toggleScrollBar(scrollUp.Active or scrollDown.Active) + end + end) + + toggleScrollBar(scrollUp.Active or scrollDown.Active) + end + return headerFrame, scrollFrame, recalculateScroll, scrollOrder + end + + createBoardsFunction = function (boardType, numStatColumns) + local updatePlayerCount = function() + return #getPlayers() + end + + local smallFrame = Instance.new("Frame") + smallFrame.Name = "SmallPlayerlist" + smallFrame.Position = smallWindowPosition + smallFrame.Active = false + smallFrame.Size = smallWindowSize + smallFrame.BackgroundColor3 = Color3.new(0,0,0) + smallFrame.BackgroundTransparency = 0.7 + smallFrame.BorderSizePixel = 0 + + local bigFrame = Instance.new("Frame") + bigFrame.Name = "BigPlayerlist" + bigFrame.Size = bigWindowSize + bigFrame.Position = bigWindowPosition + bigFrame.BackgroundColor3 = Color3.new(0,0,0) + bigFrame.BackgroundTransparency = 0.7 + bigFrame.BorderSizePixel = 0 + bigFrame.Visible = false + + local bigFrameWrapper = Instance.new("Frame") + bigFrameWrapper.Name = "Expander" + bigFrameWrapper.Size = UDim2.new(1,21,1,16) + bigFrameWrapper.Position = UDim2.new(0, 0, 0,0) + bigFrameWrapper.BackgroundTransparency = 1 + bigFrameWrapper.Parent = bigFrame + + local smallHeaderFrame, scrollFrameSmall, recalculateScrollSmall, scrollOrderSmall = createPlayerListBasics(smallFrame, false) + local bigHeaderFrame, scrollFrameBig, recalculateScrollBig, scrollOrderBig = createPlayerListBasics(bigFrameWrapper, true) + + local playerListButton = Instance.new("ImageButton") + playerListButton.Name = "GoBigButton" + playerListButton.BackgroundTransparency = 1 + playerListButton.Image = "rbxasset://textures/ui/playerlist_small_maximize.png" + playerListButton.Size = UDim2.new(0.0, 35, 0, 29) + playerListButton.Position = UDim2.new(0, 0, 0, 0) + playerListButton.MouseButton1Click:connect( + function() + toggleBigWindow() + end) + playerListButton.Parent = smallHeaderFrame + + playerListButton = Instance.new("ImageButton") + playerListButton.Name = "CloseButton" + playerListButton.BackgroundTransparency = 1 + playerListButton.Image = "rbxasset://textures/ui/playerlist_small_hide.png" + playerListButton.Size = UDim2.new(0.0, 38, 0, 29) + playerListButton.Position = UDim2.new(0, 35, 0, 0) + playerListButton.MouseButton1Click:connect( + function() + transitionWindowsFunction("None") + end) + playerListButton.Parent = smallHeaderFrame + + playerListButton = Instance.new("ImageButton") + playerListButton.Name = "CloseButton" + playerListButton.Image = "rbxasset://textures/ui/playerlist_big_hide.png" + playerListButton.BackgroundTransparency = 1 + playerListButton.Size = UDim2.new(0.0, 29, 0, 29) + playerListButton.Position = UDim2.new(1, -30, 0.5, -13) + playerListButton.MouseButton1Click:connect( + function() + toggleBigWindow() + end) + playerListButton.Parent = bigHeaderFrame + + local placeName = Instance.new("TextButton") + placeName.Name = "PlaceName" + placeName.Text = " Players (" .. tostring(updatePlayerCount()) .. ")" + placeName.AutoButtonColor = false + placeName.FontSize = Enum.FontSize.Size24 + placeName.TextXAlignment = Enum.TextXAlignment.Left + placeName.Font = Enum.Font.ArialBold + placeName.BorderSizePixel = 0 + placeName.BackgroundColor3 = Color3.new(0,0,0) + placeName.BackgroundTransparency = 1 + placeName.TextColor3 = Color3.new(1,1,1) + placeName.Size = UDim2.new(0.4, 0, 1, 0) + placeName.Position = UDim2.new(0, 0, 0.0, 0) + placeName = RbxGui.AutoTruncateTextObject(placeName) + placeName.Parent = bigHeaderFrame + + placeName.MouseEnter:connect(function() + placeName.BackgroundTransparency = 0.2 + end) + + placeName.MouseLeave:connect(function() + placeName.BackgroundTransparency = 1 + end) + + placeName.MouseButton1Click:connect(function() + sortPlayerListsFunction() + end) + + currentBoardType = boardType + currentStatCount = numStatColumns + local isTeam, isScore = getBoardTypeInfo() + local players = getPlayers() + + if isScore then + local statColumns = getStatColumns(players) + numStatColumns = #statColumns + if numStatColumns > 3 then + numStatColumns = 3 + end + createStatHeaders(statColumns, numStatColumns, false).Parent = smallHeaderFrame + createStatHeaders(statColumns, currentStatCount, true).Parent = bigHeaderFrame + end + + --Clean up all old stuff + resetPlayerTable() + updatePlayerCount() + + for i, player in ipairs(players) do + local playerObject = buildPlayerObject(player, numStatColumns, "Small") + table.insert(scrollOrderSmall, playerObject) + playerObject.Parent = scrollFrameSmall + + playerObject = buildPlayerObject(player, currentStatCount, "Big") + table.insert(scrollOrderBig, playerObject) + playerObject.Parent = scrollFrameBig + end + + --Clean up old stuff + resetTeamTable() + + local teamStatObjects = {} + if isTeam then + local teams = getTeams() + local i = #teams + while i >= 1 do + --We go backwards so the "first" team color gets the team + local team = teams[i] + teamColorTable[team.TeamColor.Name] = team + i = i - 1 + end + + --Adding/Removing a Team causes a full invalidation of the board + for i, team in ipairs(teams) do + local teamObject = buildTeamObject(team, numStatColumns, "Small") + table.insert(scrollOrderSmall, teamObject) + teamObject.Parent = scrollFrameSmall + + teamObject = buildTeamObject(team, currentStatCount, "Big") + table.insert(scrollOrderBig, teamObject) + teamObject.Parent = scrollFrameBig + end + + teamTable["Neutral"] = {} + teamTable["Neutral"].Players = {} + + local neutralTeamObject = createTeamName("Neutral", BrickColor.palette(8)) + teamTable["Neutral"].NameObjectSmall = neutralTeamObject + teamTable["Neutral"].StatObjectSmall = nil + teamTable["Neutral"].MainObjectSmall = neutralTeamObject + table.insert(scrollOrderSmall, neutralTeamObject) + + neutralTeamObject = createTeamName("Neutral", BrickColor.palette(8)) + teamTable["Neutral"].NameObjectBig = neutralTeamObject + teamTable["Neutral"].StatObjectBig = nil + teamTable["Neutral"].MainObjectBig = neutralTeamObject + table.insert(scrollOrderBig, neutralTeamObject) + + local neutralPlayers = {} + for i, player in ipairs(players) do + assignToTeam(player) + end + end + + removePlayerFunction = function(player) + if playerTable[player] then + clearTableEntry(player, playerTable[player]) + + placeName.Text = " Players (" .. tostring(updatePlayerCount()) .. ")" + + ArrayRemove(scrollOrderSmall, playerTable[player].MainObjectSmall) + ArrayRemove(scrollOrderBig, playerTable[player].MainObjectBig) + + playerTable[player] = nil + recalculateSmallPlayerListSize(smallFrame) + end + end + recreatePlayerFunction = function(player) + placeName.Text = " Players (" .. tostring(updatePlayerCount()) .. ")" + + removePlayerFunction(player) + + local playerObject = buildPlayerObject(player, numStatColumns, "Small") + table.insert(scrollOrderSmall, playerObject) + robloxLock(playerObject) + playerObject.Parent = scrollFrameSmall + + playerObject = buildPlayerObject(player, currentStatCount, "Big") + table.insert(scrollOrderBig, playerObject) + robloxLock(playerObject) + playerObject.Parent = scrollFrameBig + + local isTeam, isScore = getBoardTypeInfo() + if isTeam then + assignToTeam(player) + end + + sortPlayerListsFunction() + recalculateSmallPlayerListSize(smallFrame) + end + + if screenResizeCon then screenResizeCon:disconnect() end + screenResizeCon = screen.Changed:connect( + function(prop) + if prop == "AbsoluteSize" then + wait() + recalculateSmallPlayerListSize(smallFrame) + end + end) + + sortPlayerListsFunction = function(sortType, ascending) + orderScrollList(scrollOrderSmall, "MainObjectSmall", scrollFrameSmall, sortType, ascending) + recalculateScrollSmall() + createAlternatingRows(scrollOrderSmall) + + orderScrollList(scrollOrderBig, "MainObjectBig", scrollFrameBig, sortType, ascending) + recalculateScrollBig() + createAlternatingRows(scrollOrderBig) + end + + sortPlayerListsFunction() + + robloxLock(smallFrame) + robloxLock(bigFrame) + return smallFrame, bigFrame + end + + --Teams changing invalidates the whole board + local function teamsChanged() + if debounceTeamsChanged then + return + end + + debounceTeamsChanged = true + wait() + rebuildBoard(script.Parent, determineBoardType()) + debounceTeamsChanged = false + end + + + local checkIfBoardChanged = function() + local newBoardType, numStats = determineBoardType() + if newBoardType ~= currentBoardType or numStats ~= currentStatCount then + rebuildBoard(script.Parent, newBoardType, numStats) + end + end + + local function buildPlayerList() + waitForChild(game, "Players") + waitForProperty(game.Players, "LocalPlayer") + + local teams = game:GetService("Teams") + if teams then + local teamConnections = {} + + teams.ChildAdded:connect( + function(child) + if child:IsA("Team") then + teamsChanged() + teamConnections[child] = child.Changed:connect( + function(prop) + if prop == "TeamColor" or prop == "Name" then + --Rebuild when things change + teamsChanged() + end + end) + end + end) + teams.ChildRemoved:connect( + function(child) + if child:IsA("Team") then + if teamConnections[child] then + teamConnections[child]:disconnect() + teamConnections[child] = nil + end + teamsChanged() + end + end) + end + + game.Players.ChildAdded:connect( + function(player) + if player:IsA("Player") then + addPlayerFunction(player) + end + end) + + game.Players.ChildRemoved:connect( + function(player) + if player:IsA("Player") then + if removePlayerFunction then + removePlayerFunction(player) + end + end + end) + + rebuildBoard(script.Parent, determineBoardType()) + + delay(0, + function() + while true do + wait(5) + checkIfBoardChanged() + end + end) + end + + buildPlayerList() +end + +if not personalServerPlace then -- one more backup check + local theBool = game.Workspace:FindFirstChild("PSVariable") + if theBool and theBool:IsA("BoolValue") then + personalServerPlace = true + end +end + +if personalServerPlace then + addPersonalServerContext() + setupBuildToolManagement() +else + local psVarCon = nil + psVarCon = game.Workspace.ChildAdded:connect(function(child) + if child:IsA("BoolValue") and child.Name == "PSVariable" then + psVarCon:disconnect() + personalServerPlace = true + addPersonalServerContext() + setupBuildToolManagement() + end + end) +end + true + + + + + \ No newline at end of file diff --git a/clients/2011M/content/fonts/rightarm.mesh b/clients/2011M/content/fonts/rightarm.mesh new file mode 100644 index 0000000000000000000000000000000000000000..14a52a466503cc832c2906e622d9d50ede6d95b3 GIT binary patch literal 2065 zcmZ{ky>Ami6vQ9I7!w>Ie21@uU_ycrisI;ZsO7TSo0a4R`olKGYm7B`OL`E;?WuMImcew7w4SS z;p}OhWIoI|EIhG}XXagyx%7VFUBo(xM|pBjOP$Pfa`d|B*sF9tjb3<8t3mW=f4Cc2 zo^Cm8^JKm7B)wvt%)=d9c<+roczQNwA1mImv2ulsJY(-RRlBu#X)6{i*Mu zdQWEanS1;@mU(7#o_pBm=PJ>fQn;&0ulPM|)R|VlVjgjOoz$}|bLvr@#+*5O^zatX z2xk#m@Jdi-9q~EWaMv}=9)LdY8t%D?LTuftSbNj literal 0 HcmV?d00001 diff --git a/clients/2011M/content/fonts/rightleg.mesh b/clients/2011M/content/fonts/rightleg.mesh new file mode 100644 index 0000000000000000000000000000000000000000..dab065d3956706ce77e8e338a69726451867743a GIT binary patch literal 2065 zcmZ{k&2AGx5QGPk7!w>I{1b2zf`J$z6mie)fj8isD+exE0*MonH*dws7B9jZAg-2$ zF!jxLuV?J_NTn)oYPxHBC;RQ=m#?2jpO4?YJv-a&g+cFi2;q(J;m5DZ@M2U-0$Wu% zAD@?h7Fz`m@SI+ZrjnVbQyr$BVv}b-eD^xVre29>5<*p~XWWA(L#Ha5UivwuPVK44 z6&IOL!tC6BPRX{&Hb~uW46OYcvTF&tAqIrit!#IQ57Xo=&JUT-@XYZwbKIg0sXHV-S z^I^tu;qf|_nRh|v%KF83;dK&^^5mYDIxC)`dc9BQ)6#3G%mepmf4m!6o=$bp=E-{D zNqTvm%)=d9dG9TG`eipv*vIlaHc_sak%!DM_1GQDJiJr)Xojj6|G(s6E$>E)N8a4C zl6mbO?uFmQ$_(*jz3?RS(cjkd%*Q+F4BeCE!ISiIk2ufV4gcaka@hB$xr6FGt>?4! z*mo@R)N@{X*k|Xe(CQfPYSPQUhii3ai=UoH++HX3Y|5N^RA+6@d^6p{M6L)|5nAw8 zR3U7OcTB?_(=dAg`kHCDYZ|5&Kwmcv@0y0`1<*H4!}R7k%<2hy!cEigEd% + null + nil + Use the Chat menu to talk to me. + I can only see menu chats. + + Hello + + Hi + Hi there! + Hi everyone + + + Howdy + Howdy partner! + + + Greetings + Greetings everyone + Greetings Robloxians! + Seasons greetings! + + + Welcome + Welcome to my place + Welcome to our base + Welcome to my barbeque + + Hey there! + + What's up? + How are you doing? + How's it going? + What's new? + + + Good day + Good morning + Good afternoon + Good evening + Good night + + + Silly + Waaaaaaaz up?! + Hullo! + Behold greatness, mortals! + Pardon me, is this Sparta? + THIS IS SPARTAAAA! + + + Happy Holidays! + Happy New Year! + Happy Valentine's Day! + Beware the Ides of March! + Happy St. Patrick's Day! + Happy Easter! + Happy Earth Day! + Happy 4th of July! + Happy Thanksgiving! + Happy Halloween! + Happy Hanukkah! + Merry Christmas! + Happy Halloween! + Happy Earth Day! + Happy May Day! + Happy Towel Day! + Happy ROBLOX Day! + Happy LOL Day! + + + + Goodbye + + Good Night + Sweet dreams + Go to sleep! + Lights out! + Bedtime + Going to bed now + + + Later + See ya later + Later gator! + See you tomorrow + + + Bye + Hasta la bye bye! + + I'll be right back + I have to go + + Farewell + Take care + Have a nice day + Goodluck! + Ta-ta for now! + + + Peace + Peace out! + Peace dudes! + Rest in pieces! + + + Silly + To the batcave! + Over and out! + Happy trails! + I've got to book it! + Tootles! + Smell you later! + GG! + My house is on fire! gtg. + + + + Friend + Wanna be friends? + + Follow me + Come to my place! + Come to my base! + Follow me, team! + Follow me + + + Your place is cool + Your place is fun + Your place is awesome + Your place looks good + This place is awesome! + + + Thank you + Thanks for playing + Thanks for visiting + Thanks for everything + No, thank you + Thanx + + + No problem + Don't worry + That's ok + np + + + You are ... + You are great! + You are good! + You are cool! + You are funny! + You are silly! + You are awesome! + You are doing something I don't like, please stop + + + I like ... + I like your name + I like your shirt + I like your place + I like your style + I like you + I like items + I like money + + + Sorry + My bad! + I'm sorry + Whoops! + Please forgive me. + I forgive you. + I didn't mean to do that. + Sorry, I'll stop now. + + + + Questions + + Who? + Who wants to be my friend? + Who wants to be on my team? + Who made this brilliant game? + LOLWHO? + + + What? + What is your favorite animal? + What is your favorite game? + What is your favorite movie? + What is your favorite TV show? + What is your favorite music? + What are your hobbies? + LOLWUT? + + + When? + When are you online? + When is the new version coming out? + When can we play again? + When will your place be done? + + + Where? + Where do you want to go? + Where are you going? + Where am I?! + Where did you go? + + + How? + How are you today? + How did you make this cool place? + LOLHOW? + + + Can I... + Can I have a tour? + Can I be on your team? + Can I be your friend? + Can I try something? + Can I have that please? + Can I have that back please? + Can I have borrow your hat? + Can I have borrow your gear? + + + + Answers + + You need help? + Check out the news section + Check out the help section + Read the wiki! + All the answers are in the wiki! + I will help you with this. + + + Some people ... + Me + Not me + You + All of us + Everyone but you + Builderman! + Telamon! + My team + My group + Mom + Dad + Sister + Brother + Cousin + Grandparent + Friend + + + Time ... + In the morning + In the afternoon + At night + Tomorrow + This week + This month + Sometime + Sometimes + Whenever you want + Never + After this + In 10 minutes + In a couple hours + In a couple days + + + Animals + + Cats + Lion + Tiger + Leopard + Cheetah + + + Dogs + Wolves + Beagle + Collie + Dalmatian + Poodle + Spaniel + Shepherd + Terrier + Retriever + + + Horses + Ponies + Stallions + Pwnyz + + + Reptiles + Dinosaurs + Lizards + Snakes + Turtles! + + Hamster + Monkey + Bears + + Fish + Goldfish + Sharks + Sea Bass + Halibut + Tropical Fish + + + Birds + Eagles + Penguins + Parakeets + Owls + Hawks + Pidgeons + + Elephants + + Mythical Beasts + Dragons + Unicorns + Sea Serpents + Sphinx + Cyclops + Minotaurs + Goblins + Honest Politicians + Ghosts + Scylla and Charybdis + + + + Games + + Roblox + BrickBattle + Community Building + Roblox Minigames + Contest Place + + Action + Puzzle + Strategy + Racing + RPG + Obstacle Course + Tycoon + + Board games + Chess + Checkers + Settlers of Catan + Tigris and Euphrates + El Grande + Stratego + Carcassonne + + + + Sports + Hockey + Soccer + Football + Baseball + Basketball + Volleyball + Tennis + Sports team practice + + Watersports + Surfing + Swimming + Water Polo + + + Winter sports + Skiing + Snowboarding + Sledding + Skating + + + Adventure + Rock climbing + Hiking + Fishing + Horseback riding + + + Wacky + Foosball + Calvinball + Croquet + Cricket + Dodgeball + Squash + Trampoline + + + + Movies/TV + Science Fiction + + Animated + Anime + + Comedy + Romantic + Action + Fantasy + + + Music + Country + Jazz + Rap + Hip-hop + Techno + Classical + Pop + Rock + + + Hobbies + + Computers + Building computers + Videogames + Coding + Hacking + + + The Internet + lol. teh internets! + Watching vids + + Dance + Gymnastics + + Martial Arts + Karate + Judo + Taikwon Do + Wushu + Street fighting + + Listening to music + + Music lessons + Playing in my band + Playing piano + Playing guitar + Playing violin + Playing drums + Playing a weird instrument + + Arts and crafts + + + Location + + USA + + West + Alaska + Arizona + California + Colorado + Hawaii + Idaho + Montana + Nevada + New Mexico + Oregon + Utah + Washington + Wyoming + + + Midwest + Illinois + Indiana + Iowa + Kansas + Michigan + Minnesota + Missouri + Nebraska + North Dakota + Ohio + South Dakota + Wisconsin + + + Northeast + Connecticut + Delaware + Maine + Maryland + Massachusetts + New Hampshire + New Jersey + New York + Pennsylvania + Rhode Island + Vermont + + + South + Alabama + Arkansas + Florida + Georgia + Kentucky + Louisiana + Mississippi + North Carolina + Oklahoma + South Carolina + Tennessee + Texas + Virginia + West Virginia + + + + Canada + Alberta + British Columbia + Manitoba + New Brunswick + Newfoundland + Northwest Territories + Nova Scotia + Nunavut + Ontario + Prince Edward Island + Quebec + Saskatchewan + Yukon + + Mexico + Central America + + Europe + + Great Britain + England + Scotland + Wales + Northern Ireland + + France + Germany + Spain + Italy + Poland + Switzerland + Greece + Romania + Netherlands + + + Asia + China + India + Japan + Korea + Russia + Vietnam + + + South America + Argentina + Brazil + + + Africa + Eygpt + Swaziland + + Australia + Middle East + Antarctica + New Zealand + + + Age + Rugrat + Kid + Tween + Teen + Twenties + Old + Ancient + Mesozoic + I don't want to say my age. Don't ask. + + + Mood + Good + Great! + Not bad + Sad + Hyper + Chill + Happy + Kind of mad + + Boy + Girl + I don't want to say boy or girl. Don't ask. + + + Game + Let's build + Let's battle + Nice one! + So far so good! + Lucky shot! + Oh man! + I challenge you to a fight! + Help me with this + Let's go to your game + Can you show me how do to that? + Backflip! + Frontflip! + Dance! + I'm on your side! + + Game Commands + regen + reset + go + fix + respawn + + + + Silly + Muahahahaha! + all your base are belong to me! + GET OFF MAH LAWN + TEH EPIK DUCK IS COMING!!! + ROFL + + 1337 + i r teh pwnz0r! + w00t! + z0mg h4x! + ub3rR0xXorzage! + + + + Yes + Absolutely! + Rock on! + Totally! + Juice! + Yay! + Yesh + + + No + Ummm. No. + ... + Stop! + Go away! + Don't do that + Stop breaking the rules + I don't want to + + + Ok + Well... ok + Sure + + + Uncertain + Maybe + I don't know + idk + I can't decide + Hmm... + + + + :-) + :-( + :D + :-O + lol + =D + D= + XD + ;D + ;) + O_O + =) + @_@ + >_< + T_T + ^_^ + <(0_0<) <(0_0)> (>0_0)> KIRBY DANCE + )'; + :3 + + + Ratings + Rate it! + I give it a 1 out of 10 + I give it a 2 out of 10 + I give it a 3 out of 10 + I give it a 4 out of 10 + I give it a 5 out of 10 + I give it a 6 out of 10 + I give it a 7 out of 10 + I give it a 8 out of 10 + I give it a 9 out of 10 + I give it a 10 out of 10! + + diff --git a/clients/2011M/content/fonts/torso.mesh b/clients/2011M/content/fonts/torso.mesh new file mode 100644 index 0000000000000000000000000000000000000000..43d58d126d5803db51af401c85cd912725964d1e GIT binary patch literal 2065 zcmZ{ky>8S%6om&8k|itz!f*HqNmxRH5Q=CaYXlu7by^A-)_RszM`Z{}Wm#%o(TI>+{zd(T{t{N=;vqmQFcn=hX4@2~XTp#Ri4_e`*NIGXMr zjtY@LFJJWB#_(SmpWy-WGV>gl%Lj?4=<+POBCM15MOUxHBYk}F{`>JThVfzTtlX;d z$or5vdc64KMdqG6vvnbJ(?e$S#Jql*^a{1!x<9YdebKMYW0}cIE$tQZk|@sSwch)% z_ogS#IeM5+*WRs{W^SENV_$eCaWeG`XXTG-K75Pl$!C~)bYD`Z_OLJWXdd=%y{Z|u zc&gsyV$O}s)X6-j<6pxi|0c|^s~4WL@xVOHa4yfP|JLTodf`cWS)I&7=AVDZFUc=? z%roKMW`t+k%?|XLoelBC@4$0r*y531xyO3(Jo#Q>uhilEq;=Gj)xl$RG_!tpD%5Ag z>LebilY3g~WS({Rt~uwqUU-r@Psxy+pRl)+@@tzX>xC!z?yYtBZ}i+GtmFLX|3|!b z`Dy%b)E<2DHuJ>)M(vTzb7w4`=gMRM!?`-Y%LU6*bk#{cU71r)+YH&edD!ha!FhyS z@Ip||Eec;y4KJyNSp(3^s^Ok$m|6gRQ8m1x8m1ROUs4Uzo98fBUvOD)MKw$&fL>J% zlL?@&s)nx#)&$oDH&nwn1-AsZ1$R`#>k9N;)$lz9`o3!TfnY=MP_U^Q-V$sJ9tp?_ r&;!*lSpoX70==Ueexg8=37~gX!(;;JJq4P6+{0wy8Eff*hI#iNlgon} literal 0 HcmV?d00001 diff --git a/clients/2011M/content/music/bass.wav b/clients/2011M/content/music/bass.wav new file mode 100644 index 0000000000000000000000000000000000000000..5f4b7913ba5c493f74c13fd17a7fc50ddfef659f GIT binary patch literal 6380 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%0DcSKvvNv0GFtY#7xV{qx)cxeS^WBOK=Vs$Uex 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 literal 0 HcmV?d00001 diff --git a/clients/2011M/content/particles/explosion.particle b/clients/2011M/content/particles/explosion.particle new file mode 100644 index 0000000..a7c5e1f --- /dev/null +++ b/clients/2011M/content/particles/explosion.particle @@ -0,0 +1,192 @@ +///////////////////////////////////////////////////////// +// The fast rising center plume of the explosion. +// Grows and rotates. +///////////////////////////////////////////////////////// +particle_system explosion/explosionPlume +{ + quota 40 + material explosion/explosionMatl + particle_width 6 + particle_height 6 + cull_each false + renderer billboard + billboard_type point + sorted false + local_space false + iteration_interval 0 + nonvisible_update_timeout 0 + billboard_type point + billboard_origin center + billboard_rotation_type vertex + common_up_vector 0 1 0 + point_rendering false + accurate_facing false + + emitter Ellipsoid + { + angle 16 + colour 1.0 0.4 0.2 1.0 + colour_range_start 1.0 0.4 0.2 1.0 + colour_range_end 0.7 0.2 0.1 0.6 + direction 0 1 0 + emission_rate 100 + position 0 6 0 + velocity 25 + velocity_min 25 + velocity_max 38 + time_to_live 1.5 + time_to_live_min 1.5 + time_to_live_max 1.5 + duration 0.2 + duration_min 0.2 + duration_max 0.2 + repeat_delay 10000 + repeat_delay_min 10000 + repeat_delay_max 10000 + width 3 + height 3 + depth 3 + } + + affector ColourFader + { + red -0.9 + green -0.5 + blue -0.3 + alpha -1.0 + } + affector Scaler + { + rate 13 + } + affector Rotator + { + rotation_speed_range_start 100 + rotation_speed_range_end 200 + rotation_range_start 100 + rotation_range_end 300 + } +} + + +///////////////////////////////////////////////////////// +//The slow moving base of the explosion. +///////////////////////////////////////////////////////// +particle_system explosion/explosionBase +{ + quota 40 + material explosion/explosionMatl + particle_width 20 + particle_height 20 + cull_each false + renderer billboard + billboard_type point + sorted false + local_space false + iteration_interval 0 + nonvisible_update_timeout 0 + billboard_type point + billboard_origin center + billboard_rotation_type vertex + common_up_vector 0 1 0 + point_rendering false + accurate_facing false + + emitter Ellipsoid + { + angle 100 + colour 1.0 0.4 0.2 1.0 + colour_range_start 1.0 0.4 0.2 1.0 + colour_range_end 0.7 0.2 0.1 0.6 + direction 0 1 0 + emission_rate 80 + position 0 0 0 + velocity 11 + velocity_min 11 + velocity_max 16 + time_to_live 1.5 + time_to_live_min 1.5 + time_to_live_max 1.5 + duration 0.2 + duration_min 0.2 + duration_max 0.2 + repeat_delay 10000 + repeat_delay_min 10000 + repeat_delay_max 10000 + width 15 + height 15 + depth 15 + } + + affector ColourFader + { + red -0.9 + green -0.5 + blue -0.3 + alpha -1.0 + } + affector Scaler + { + rate 5 + } +} + + +///////////////////////////////////////////////////////// +// The fast flying sparks of the explosion. +///////////////////////////////////////////////////////// +particle_system explosion/explosionSparks +{ + quota 120 + material explosion/explosparkMatl + particle_width 3 + particle_height 3 + cull_each false + renderer billboard + billboard_type point + sorted false + local_space false + iteration_interval 0 + nonvisible_update_timeout 0 + billboard_type point + billboard_origin center + billboard_rotation_type vertex + common_up_vector 0 1 0 + point_rendering false + accurate_facing false + + emitter Point + { + angle 120 + colour 1.0 0.6 0.4 1.0 + colour_range_start 1.0 0.6 0.4 1.0 + colour_range_end 1.0 0.6 0.4 1.0 + direction 0 1 0 + emission_rate 900 + position 0 0 0 + velocity 30 + velocity_min 30 + velocity_max 60 + time_to_live 1.2 + time_to_live_min 1.2 + time_to_live_max 1.2 + duration 0.2 + duration_min 0.1 + duration_max 0.1 + repeat_delay 10000 + repeat_delay_min 10000 + repeat_delay_max 10000 + } + + affector ColourFader + { + red -0.7 + green -0.6 + blue -0.4 + alpha -0.7 + } + affector Scaler + { + rate -3 + } +} diff --git a/clients/2011M/content/particles/explosionMat.material b/clients/2011M/content/particles/explosionMat.material new file mode 100644 index 0000000..8cce48d --- /dev/null +++ b/clients/2011M/content/particles/explosionMat.material @@ -0,0 +1,65 @@ + +///////////////////////////////////////////////////// +// Material used for bright explosion parts +///////////////////////////////////////////////////// +material explosion/explosionMatl +{ + technique + { + pass + { + lighting off + depth_write off + scene_blend add + + texture_unit + { + texture textures/explosion.png + } + } + } +} + +///////////////////////////////////////////////////// +// Bright sparks that fly out from explosions +///////////////////////////////////////////////////// +material explosion/explosparkMatl +{ + technique + { + pass + { + lighting off + depth_write off + scene_blend add + + texture_unit + { + texture textures/spark.png + } + } + } +} + + +/////////////////////////////////////////////////////////// +// Alpha blended smoke from explosions. +// Disabled because they overpower the bright explosion parts. +/////////////////////////////////////////////////////////// +material explosion/explosmokeMatl +{ + technique + { + pass + { + lighting off + depth_write off + scene_blend add + + texture_unit + { + texture textures/explosion.png + } + } + } +} \ No newline at end of file diff --git a/clients/2011M/content/particles/fire.particle b/clients/2011M/content/particles/fire.particle new file mode 100644 index 0000000..442fe8e --- /dev/null +++ b/clients/2011M/content/particles/fire.particle @@ -0,0 +1,59 @@ +///////////////////////////////////////////////////////// +// Fire +///////////////////////////////////////////////////////// + +// height and width modified by RbxParticleFactory for user input size +particle_system FireTemplate +{ + material fireMat1 + particle_width 5 + particle_height 5 + cull_each false + quota 40 + renderer billboard + billboard_type point + point_rendering false + accurate_facing false + sorted false + local_space false + iteration_interval 0 + nonvisible_update_timeout 0 + + // emission rate is modified by RbxParticleManager for throttling + // of particle systems + emitter Point + { + colour_range_start 240 240 240 + colour_range_end 240 240 240 + angle 18 + emission_rate 35 + time_to_live_min 1 + time_to_live_max 1 + direction 0 1 0 + velocity_min 2.33 + velocity_max 7.0 + } + affector Rotator + { + rotation_range_start 0 + rotation_range_end 365 + rotation_speed_range_start 0 + rotation_speed_range_end 100 + } + // modified in RbxParticleFactory for user input size + affector Scaler + { + rate -5.0 + } + // modified in RbxParticleFactory for user input colors + affector ColourInterpolator + { + time0 0 + colour0 240 240 240 1 + + time1 1 + colour1 240 240 240 1 + + } + +} diff --git a/clients/2011M/content/particles/fireMat.material b/clients/2011M/content/particles/fireMat.material new file mode 100644 index 0000000..f43bbd7 --- /dev/null +++ b/clients/2011M/content/particles/fireMat.material @@ -0,0 +1,22 @@ + +///////////////////////////////////////////////////// +// Material used for fire +///////////////////////////////////////////////////// +material fireMat1 +{ + technique + { + pass + { + lighting off + depth_write off + scene_blend add + + texture_unit + { + texture textures/fire_0.png + tex_address_mode clamp + } + } + } +} diff --git a/clients/2011M/content/particles/forceFieldBeam.particle b/clients/2011M/content/particles/forceFieldBeam.particle new file mode 100644 index 0000000..22914a9 --- /dev/null +++ b/clients/2011M/content/particles/forceFieldBeam.particle @@ -0,0 +1,55 @@ +///////////////////////////////////////////////////////// +// Beam +///////////////////////////////////////////////////////// +particle_system forceField/beam +{ + quota 40 + material PE/lensflare + particle_width 0.5 + particle_height 2 + cull_each false + billboard_type oriented_common + common_direction 0 1 0 + + emitter Ring + { + colour 1 1 1 0 + angle 0 + direction 0 1 0 + emission_rate 20 + position 0 -2 0 + velocity_min 2 + velocity_max 5 + time_to_live 2 + duration 0 + duration_min 0 + duration_max 0 + repeat_delay 0 + repeat_delay_min 0 + repeat_delay_max 0 + width 5 + height 5 + depth 1 + inner_width 0.8 + inner_height 0.8 + } + + //affector LinearForce +// { + // force_vector 0 -1 0 + // force_application add + //} + + affector ColourFader2 + { + red1 0 + green1 0 + blue1 0 + alpha1 1 + red2 0 + green2 0 + blue2 0 + alpha2 -1 + state_change 1 + } +} diff --git a/clients/2011M/content/particles/forceFieldRadial.particle b/clients/2011M/content/particles/forceFieldRadial.particle new file mode 100644 index 0000000..807f93d --- /dev/null +++ b/clients/2011M/content/particles/forceFieldRadial.particle @@ -0,0 +1,51 @@ +///////////////////////////////////////////////////////// +// Radial +///////////////////////////////////////////////////////// +particle_system forceField/radial +{ + material PE/lensflare + particle_width 5 + particle_height 5 + cull_each false + quota 6 + renderer billboard + billboard_type point + point_rendering false + accurate_facing false + sorted false + local_space false + iteration_interval 0 + nonvisible_update_timeout 0 + + // emission rate is modified by RbxParticleManager for throttling + // of particle systems + emitter Point + { + angle 18 + emission_rate 2 + time_to_live_min 2 + time_to_live_max 2 + direction 0 1 0 + velocity_min 0 + velocity_max 0.1 + } + affector Rotator + { + rotation_range_start 0 + rotation_range_end 365 + rotation_speed_range_start 4 + rotation_speed_range_end 100 + } + // modified in RbxParticleFactory for user input size + affector Scaler + { + rate 6.0 + } + affector ColourFader + { + red 0 + green 0 + blue 0 + alpha -0.5 + } +} diff --git a/clients/2011M/content/particles/glow.material b/clients/2011M/content/particles/glow.material new file mode 100644 index 0000000..a74629f --- /dev/null +++ b/clients/2011M/content/particles/glow.material @@ -0,0 +1,18 @@ +material PE/lensflare +{ + technique + { + pass + { + lighting off + depth_write off + scene_blend src_alpha one + + texture_unit + { + texture textures/glow.png + tex_address_mode clamp + } + } + } +} \ No newline at end of file diff --git a/clients/2011M/content/particles/smoke.particle b/clients/2011M/content/particles/smoke.particle new file mode 100644 index 0000000..79c6c16 --- /dev/null +++ b/clients/2011M/content/particles/smoke.particle @@ -0,0 +1,57 @@ +particle_system SmokeTemplate +{ + quota 70 + material PE/smoke + particle_width 1 + particle_height 1 + cull_each false + renderer billboard + billboard_type point + + emitter Box + { + angle 180 + colour 0.8 0.8 0.8 0.3 + colour_range_start 0.8 0.8 0.8 0.3 + colour_range_end 0.8 0.8 0.8 0.3 + direction 0 1 0 + emission_rate 6 + position 0 0 0 + velocity 0.1 + velocity_min 0 + velocity_max 0.1 + time_to_live 4 + time_to_live_min 4 + time_to_live_max 6 + duration 0 + duration_min 0 + duration_max 0 + repeat_delay 0 + repeat_delay_min 0 + repeat_delay_max 0 + width 1 + height 1 + depth 1 + } + + affector ColourFader + { + red -0.11 + green -0.11 + blue -0.11 + alpha -0.1 + } + + affector Scaler + { + rate 1.5 + } + + affector Rotator + { + rotation_speed_range_start 0 + rotation_speed_range_end 0 + rotation_range_start 0 + rotation_range_end 0 + } +} diff --git a/clients/2011M/content/particles/smokeMat.material b/clients/2011M/content/particles/smokeMat.material new file mode 100644 index 0000000..c658a05 --- /dev/null +++ b/clients/2011M/content/particles/smokeMat.material @@ -0,0 +1,19 @@ +material PE/smoke +{ + technique + { + pass + { + lighting off + depth_write off + scene_blend alpha_blend + + texture_unit + { + texture textures/smoke.png + colour_op_ex add_signed src_diffuse src_texture + tex_address_mode clamp + } + } + } +} diff --git a/clients/2011M/content/particles/sparkles.particle b/clients/2011M/content/particles/sparkles.particle new file mode 100644 index 0000000..60102d0 --- /dev/null +++ b/clients/2011M/content/particles/sparkles.particle @@ -0,0 +1,49 @@ +///////////////////////////////////////////////////////// +// Sparkles +///////////////////////////////////////////////////////// +particle_system SparklesTemplate +{ + quota 40 + material sparkle/sparkleMatl + particle_width 0.8 + particle_height 1 + cull_each false + renderer billboard + sorted false + local_space false + iteration_interval 0 + nonvisible_update_timeout 0 + billboard_type point + billboard_origin center + billboard_rotation_type vertex + common_up_vector 0 1 0 + point_rendering false + accurate_facing false + + emitter Point + { + angle 180 + direction 0 -1 0 + emission_rate 35 + position 0 0 0 + velocity_min 4 + velocity_max 8 + duration 0.0 + time_to_live 1.1 + //repeat_delay 2.0 + } + affector Rotator + { + rotation_speed_range_end 360 + rotation_range_start 0 + rotation_range_end 360 + } + affector ColourFader + { + red 0 + green 0 + blue 0 + alpha -1 + } +} + diff --git a/clients/2011M/content/particles/sparklesMat.material b/clients/2011M/content/particles/sparklesMat.material new file mode 100644 index 0000000..4e1ee98 --- /dev/null +++ b/clients/2011M/content/particles/sparklesMat.material @@ -0,0 +1,23 @@ + +///////////////////////////////////////////////////// +// Material used for sparkles +///////////////////////////////////////////////////// +material sparkle/sparkleMatl +{ + technique + { + pass + { + lighting off + depth_write off + scene_blend src_alpha one + + texture_unit + { + texture textures/sparkle.png + colour_op add + alpha_op_ex modulate src_diffuse src_texture + } + } + } +} \ No newline at end of file diff --git a/clients/2011M/content/scripts/CSMPFunctions.lua b/clients/2011M/content/scripts/CSMPFunctions.lua new file mode 100644 index 0000000..89ad090 --- /dev/null +++ b/clients/2011M/content/scripts/CSMPFunctions.lua @@ -0,0 +1,626 @@ +settings().Rendering.FrameRateManager = 2 +settings().Network.DataSendRate = 30 +settings().Network.PhysicsSendRate = 20 +settings().Network.ReceiveRate = 60 +settings().Network.NetworkOwnerRate = 30 + +game:GetService("CoreGui").DescendantAdded:connect(function(Child) + if (Child:IsA("BaseScript")) and (Child.Name~="SubMenuBuilder") and (Child.Name~="ToolTipper") and (Child.Name~="MainBotChatScript") then + Child:Remove() + end +end) + +pcall(function() game:GetService("ScriptContext").ScriptsDisabled = false end) + +--function made by rbxbanland +function newWaitForChild(newParent,name) + local returnable = nil + if newParent:FindFirstChild(name) then + returnable = newParent:FindFirstChild(name) + else + repeat wait() returnable = newParent:FindFirstChild(name) until returnable ~= nil + end + return returnable +end + +function KickPlayer(Player,reason) + local message = Instance.new("Message") + message.Text = "You were kicked. Reason: "..reason + message.Parent = Player + wait(2) + Player:remove() + print("Player '" .. Player.Name .. "' with ID '" .. Player.userId .. "' kicked. Reason: "..reason) +end + +function LoadCharacterNew(playerApp,newChar) + PlayerService = game:GetService("Players") + Player = PlayerService:GetPlayerFromCharacter(newChar) + + wait(0.65) + + local function kick() + KickPlayer(Player, "Modified Client") + end + + if (not Player:FindFirstChild("Appearance")) then + kick() + end + + if ((playerApp:GetChildren() == 0) or (playerApp:GetChildren() == nil)) then + kick() + end + + local path = "rbxasset://../../../shareddata/charcustom/" + + local charparts = {[1] = newWaitForChild(newChar,"Head"),[2] = newWaitForChild(newChar,"Torso"),[3] = newWaitForChild(newChar,"Left Arm"),[4] = newWaitForChild(newChar,"Right Arm"),[5] = newWaitForChild(newChar,"Left Leg"),[6] = newWaitForChild(newChar,"Right Leg")} + for _,newVal in pairs(playerApp:GetChildren()) do + local customtype = newVal.CustomizationType.Value + if (customtype == 1) then + pcall(function() + charparts[newVal.ColorIndex.Value].BrickColor = newVal.Value + end) + elseif (customtype == 2) then + pcall(function() + local newHat = game.Workspace:InsertContent(path.."hats/"..newVal.Value) + if newHat[1] then + if newHat[1].className == "Hat" then + newHat[1].Parent = newChar + else + newHat[1]:remove() + end + end + end) + elseif (customtype == 3) then + pcall(function() + local newTShirt = game.Workspace:InsertContent(path.."tshirts/"..newVal.Value) + if newTShirt[1] then + if newTShirt[1].className == "ShirtGraphic" then + newTShirt[1].Parent = newChar + else + newTShirt[1]:remove() + end + end + end) + elseif (customtype == 4) then + pcall(function() + local newShirt = game.Workspace:InsertContent(path.."shirts/"..newVal.Value) + if newShirt[1] then + if newShirt[1].className == "Shirt" then + newShirt[1].Parent = newChar + else + newShirt[1]:remove() + end + end + end) + elseif (customtype == 5) then + pcall(function() + local newPants = game.Workspace:InsertContent(path.."pants/"..newVal.Value) + if newPants[1] then + if newPants[1].className == "Pants" then + newPants[1].Parent = newChar + else + newPants[1]:remove() + end + end + end) + elseif (customtype == 6) then + pcall(function() + local newFace = game.Workspace:InsertContent(path.."faces/"..newVal.Value) + if newFace[1] then + if newFace[1].className == "Decal" then + newWaitForChild(charparts[1],"face"):remove() + newFace[1].Parent = charparts[1] + newFace[1].Face = "Front" + else + newFace[1]:remove() + end + end + end) + elseif (customtype == 7) then + pcall(function() + local newPart = game.Workspace:InsertContent(path.."heads/"..newVal.Value) + if newPart[1] then + if newPart[1].className == "SpecialMesh" or newPart[1].className == "CylinderMesh" or newPart[1].className == "BlockMesh" then + newWaitForChild(charparts[1],"Mesh"):remove() + newPart[1].Parent = charparts[1] + else + newPart[1]:remove() + end + end + end) + elseif (customtype == 8) then + pcall(function() + local newHat = game.Workspace:InsertContent(path.."hats/"..newVal.Value) + if newHat[1] then + if newHat[1].className == "Hat" then + newHat[1].Parent = newChar + else + newHat[1]:remove() + end + end + end) + + pcall(function() + local newItem = game.Workspace:InsertContent(path.."custom/"..newVal.Value) + if newItem[1] then + if newItem[1].className == "Decal" then + newWaitForChild(charparts[1],"face"):remove() + newItem[1].Parent = charparts[1] + newItem[1].Face = "Front" + elseif newPart[1].className == "SpecialMesh" or newPart[1].className == "CylinderMesh" or newPart[1].className == "BlockMesh" then + newWaitForChild(charparts[1],"Mesh"):remove() + newItem[1].Parent = charparts[1] + else + newItem[1].Parent = newChar + end + end + end) + end + end +end + +function InitalizeClientAppearance(Player,Hat1ID,Hat2ID,Hat3ID,HeadColorID,TorsoColorID,LeftArmColorID,RightArmColorID,LeftLegColorID,RightLegColorID,TShirtID,ShirtID,PantsID,FaceID,HeadID,ItemID) + local newCharApp = Instance.new("IntValue",Player) + newCharApp.Name = "Appearance" + --BODY COLORS + for i=1,6,1 do + local BodyColor = Instance.new("BrickColorValue",newCharApp) + if (i == 1) then + if (HeadColorID ~= nil) then + BodyColor.Value = BrickColor.new(HeadColorID) + else + BodyColor.Value = BrickColor.new(1) + end + BodyColor.Name = "Head Color" + elseif (i == 2) then + if (TorsoColorID ~= nil) then + BodyColor.Value = BrickColor.new(TorsoColorID) + else + BodyColor.Value = BrickColor.new(1) + end + BodyColor.Name = "Torso Color" + elseif (i == 3) then + if (LeftArmColorID ~= nil) then + BodyColor.Value = BrickColor.new(LeftArmColorID) + else + BodyColor.Value = BrickColor.new(1) + end + BodyColor.Name = "Left Arm Color" + elseif (i == 4) then + if (RightArmColorID ~= nil) then + BodyColor.Value = BrickColor.new(RightArmColorID) + else + BodyColor.Value = BrickColor.new(1) + end + BodyColor.Name = "Right Arm Color" + elseif (i == 5) then + if (LeftLegColorID ~= nil) then + BodyColor.Value = BrickColor.new(LeftLegColorID) + else + BodyColor.Value = BrickColor.new(1) + end + BodyColor.Name = "Left Leg Color" + elseif (i == 6) then + if (RightLegColorID ~= nil) then + BodyColor.Value = BrickColor.new(RightLegColorID) + else + BodyColor.Value = BrickColor.new(1) + end + BodyColor.Name = "Right Leg Color" + end + local indexValue = Instance.new("NumberValue") + indexValue.Name = "ColorIndex" + indexValue.Parent = BodyColor + indexValue.Value = i + local typeValue = Instance.new("NumberValue") + typeValue.Name = "CustomizationType" + typeValue.Parent = BodyColor + typeValue.Value = 1 + end + --HATS + for i=1,3,1 do + local newHat = Instance.new("StringValue",newCharApp) + if (i == 1) then + if (Hat1ID ~= nil) then + newHat.Value = Hat1ID + newHat.Name = "Hat 1 - "..Hat1ID + else + newHat.Value = "NoHat.rbxm" + newHat.Name = "Hat 1 - NoHat.rbxm" + end + elseif (i == 2) then + if (Hat2ID ~= nil) then + newHat.Value = Hat2ID + newHat.Name = "Hat 2 - "..Hat2ID + else + newHat.Value = "NoHat.rbxm" + newHat.Name = "Hat 2 - NoHat.rbxm" + end + elseif (i == 3) then + if (Hat3ID ~= nil) then + newHat.Value = Hat3ID + newHat.Name = "Hat 3 - "..Hat3ID + else + newHat.Value = "NoHat.rbxm" + newHat.Name = "Hat 3 - NoHat.rbxm" + end + end + local typeValue = Instance.new("NumberValue") + typeValue.Name = "CustomizationType" + typeValue.Parent = newHat + typeValue.Value = 2 + end + --T-SHIRT + local newTShirt = Instance.new("StringValue",newCharApp) + if (TShirtID ~= nil) then + newTShirt.Value = TShirtID + newTShirt.Name = "T-Shirt - "..TShirtID + else + newTShirt.Value = "NoTShirt.rbxm" + newTShirt.Name = "T-Shirt - NoTShirt.rbxm" + end + local typeValue = Instance.new("NumberValue") + typeValue.Name = "CustomizationType" + typeValue.Parent = newTShirt + typeValue.Value = 3 + --SHIRT + local newShirt = Instance.new("StringValue",newCharApp) + if (ShirtID ~= nil) then + newShirt.Value = ShirtID + newShirt.Name = "Shirt - "..ShirtID + else + newShirt.Value = "NoShirt.rbxm" + newShirt.Name = "Shirt - NoShirt.rbxm" + end + local typeValue = Instance.new("NumberValue") + typeValue.Name = "CustomizationType" + typeValue.Parent = newShirt + typeValue.Value = 4 + --PANTS + local newPants = Instance.new("StringValue",newCharApp) + if (PantsID ~= nil) then + newPants.Value = PantsID + newPants.Name = "Pants - "..PantsID + else + newPants.Value = "NoPants.rbxm" + newPants.Name = "Pants - NoPants.rbxm" + end + local typeValue = Instance.new("NumberValue") + typeValue.Name = "CustomizationType" + typeValue.Parent = newPants + typeValue.Value = 5 + --FACE + local newFace = Instance.new("StringValue",newCharApp) + if (FaceID ~= nil) then + newFace.Value = FaceID + newFace.Name = "Face - "..FaceID + else + newFace.Value = "DefaultFace.rbxm" + newFace.Name = "Face - DefaultFace.rbxm" + end + local typeValue = Instance.new("NumberValue") + typeValue.Name = "CustomizationType" + typeValue.Parent = newFace + typeValue.Value = 6 + --HEADS + local newHead = Instance.new("StringValue",newCharApp) + if (HeadID ~= nil) then + newHead.Value = HeadID + newHead.Name = "Head - "..HeadID + else + newHead.Value = "DefaultHead.rbxm" + newHead.Name = "Head - DefaultHead.rbxm" + end + local typeValue = Instance.new("NumberValue") + typeValue.Name = "CustomizationType" + typeValue.Parent = newHead + typeValue.Value = 7 + --EXTRA + local newItem = Instance.new("StringValue",newCharApp) + if (ItemID ~= nil) then + newItem.Value = ItemID + newItem.Name = "Extra - "..ItemID + else + newItem.Value = "NoExtra.rbxm" + newItem.Name = "Extra - NoExtra.rbxm" + end + local typeValue = Instance.new("NumberValue") + typeValue.Name = "CustomizationType" + typeValue.Parent = newItem + typeValue.Value = 8 +end + +function LoadSecurity(playerApp,Player,ServerSecurityLocation) + local function kick() + KickPlayer(Player, "Modified Client") + end + + if (not Player:FindFirstChild("Security")) then + kick() + end + + if (not playerApp:FindFirstChild("ClientEXEMD5") or not playerApp:FindFirstChild("LauncherMD5") or not playerApp:FindFirstChild("ClientScriptMD5")) then + kick() + end + + for _,newVal in pairs(playerApp:GetChildren()) do + if (newVal.Name == "ClientEXEMD5") then + if (newVal.Value ~= ServerSecurityLocation.Security.ClientEXEMD5.Value or newVal.Value == "") then + kick() + break + end + end + + if (newVal.Name == "LauncherMD5") then + if (newVal.Value ~= ServerSecurityLocation.Security.LauncherMD5.Value or newVal.Value == "") then + kick() + break + end + end + + if (newVal.Name == "ClientScriptMD5") then + if (newVal.Value ~= ServerSecurityLocation.Security.ClientScriptMD5.Value or newVal.Value == "") then + kick() + break + end + end + end +end + +function InitalizeSecurityValues(Location,ClientEXEMD5,LauncherMD5,ClientScriptMD5) + Location = Instance.new("IntValue", Location) + Location.Name = "Security" + + local clientValue = Instance.new("StringValue", Location) + clientValue.Value = ClientEXEMD5 or "" + clientValue.Name = "ClientEXEMD5" + + local launcherValue = Instance.new("StringValue", Location) + launcherValue.Value = LauncherMD5 or "" + launcherValue.Name = "LauncherMD5" + + local scriptValue = Instance.new("StringValue", Location) + scriptValue.Value = ClientScriptMD5 or "" + scriptValue.Name = "ClientScriptMD5" +end + +function InitalizeTripcode(Location,Tripcode) + local code = Instance.new("StringValue", Location) + code.Value = Tripcode or "" + code.Name = "Tripcode" +end + +function LoadTripcode(Player) + local function kick() + KickPlayer(Player, "Modified Client") + end + + if (not Player:FindFirstChild("Tripcode")) then + kick() + end + + for _,newVal in pairs(Player:GetChildren()) do + if (newVal.Name == "Tripcode") then + if (newVal.Value == "") then + kick() + break + end + end + end +end + +function InitalizeClientName(Location) + local newName = Instance.new("StringValue",Location) + newName.Value = "2011E" + newName.Name = "Name" +end + +rbxversion = version() +print("ROBLOX Client version '" .. rbxversion .. "' loaded.") + +function CSServer(Port,PlayerLimit,ClientEXEMD5,LauncherMD5,ClientScriptMD5) + assert((type(Port)~="number" or tonumber(Port)~=nil or Port==nil),"CSRun Error: Port must be nil or a number.") + local NetworkServer=game:GetService("NetworkServer") + local RunService = game:GetService("RunService") + local PlayerService = game:GetService("Players") + pcall(NetworkServer.Stop,NetworkServer) + NetworkServer:Start(Port) + PlayerService.MaxPlayers = PlayerLimit + PlayerService.PlayerAdded:connect(function(Player) + if (PlayerService.NumPlayers > PlayerService.MaxPlayers) then + KickPlayer(Player, "Too many players on server.") + else + print("Player '" .. Player.Name .. "' with ID '" .. Player.userId .. "' added") + Player:LoadCharacter() + end + + Player.CharacterAdded:connect(function(char) + LoadSecurity(newWaitForChild(Player,"Security"),Player,game.Lighting) + newWaitForChild(Player,"Tripcode") + LoadTripcode(Player) + pcall(function() print("Player '" .. Player.Name .. "-" .. Player.userId .. "' security check success. Tripcode: '" .. Player.Tripcode.Value .. "'") end) + if (char ~= nil) then + LoadCharacterNew(newWaitForChild(Player,"Appearance"),char) + end + end) + + Player.Changed:connect(function(Property) + if (Property=="Character") and (Player.Character~=nil) then + local Character=Player.Character + local Humanoid=Character:FindFirstChild("Humanoid") + if (Humanoid~=nil) then + Humanoid.Died:connect(function() delay(5,function() Player:LoadCharacter() LoadCharacterNew(newWaitForChild(Player,"Appearance"),Player.Character) end) end) + end + end + end) + + Player.Chatted:connect(function(msg) + print(Player.Name.."; "..msg) + end) + end) + PlayerService.PlayerRemoving:connect(function(Player) + print("Player '" .. Player.Name .. "' with ID '" .. Player.userId .. "' leaving") + end) + RunService:Run() + game.Workspace:InsertContent("rbxasset://Fonts//libraries.rbxm") + InitalizeSecurityValues(game.Lighting,ClientEXEMD5,LauncherMD5,ClientScriptMD5) + InitalizeClientName(game.Lighting) + pcall(function() game.Close:connect(function() NetworkServer:Stop() end) end) + NetworkServer.IncommingConnection:connect(IncommingConnection) +end + +function CSConnect(UserID,ServerIP,ServerPort,PlayerName,Hat1ID,Hat2ID,Hat3ID,HeadColorID,TorsoColorID,LeftArmColorID,RightArmColorID,LeftLegColorID,RightLegColorID,TShirtID,ShirtID,PantsID,FaceID,HeadID,IconType,ItemID,ClientEXEMD5,LauncherMD5,ClientScriptMD5,Tripcode,Ticket) + pcall(function() game:SetPlaceID(-1, false) end) + pcall(function() game:GetService("Players"):SetChatStyle(Enum.ChatStyle.ClassicAndBubble) end) + + pcall(function() + game:GetService("GuiService").Changed:connect(function() + pcall(function() game:GetService("GuiService").ShowLegacyPlayerList=true end) + pcall(function() game.CoreGui.RobloxGui.PlayerListScript:Remove() end) + pcall(function() game.CoreGui.RobloxGui.PlayerListTopRightFrame:Remove() end) + pcall(function() game.CoreGui.RobloxGui.BigPlayerListWindowImposter:Remove() end) + pcall(function() game.CoreGui.RobloxGui.BigPlayerlist:Remove() end) + end) + end) + game:GetService("RunService"):Run() + assert((ServerIP~=nil and ServerPort~=nil),"CSConnect Error: ServerIP and ServerPort must be defined.") + local function SetMessage(Message) game:SetMessage(Message) end + local Visit,NetworkClient,PlayerSuccess,Player,ConnectionFailedHook=game:GetService("Visit"),game:GetService("NetworkClient") + + local function GetClassCount(Class,Parent) + local Objects=Parent:GetChildren() + local Number=0 + for Index,Object in pairs(Objects) do + if (Object.className==Class) then + Number=Number+1 + end + Number=Number+GetClassCount(Class,Object) + end + return Number + end + + local function RequestCharacter(Replicator) + local Connection + Connection=Player.Changed:connect(function(Property) + if (Property=="Character") then + game:ClearMessage() + end + end) + SetMessage("Requesting character...") + Replicator:RequestCharacter() + SetMessage("Waiting for character...") + end + + local function Disconnection(Peer,LostConnection) + SetMessage("You have lost connection to the game") + end + + local function ConnectionAccepted(Peer,Replicator) + Replicator.Disconnection:connect(Disconnection) + local RequestingMarker=true + game:SetMessageBrickCount() + local Marker=Replicator:SendMarker() + Marker.Received:connect(function() + RequestingMarker=false + RequestCharacter(Replicator) + end) + while RequestingMarker do + Workspace:ZoomToExtents() + wait(0.5) + end + end + + local function ConnectionFailed(Peer, Code, why) + SetMessage("Failed to connect to the Game. (ID="..Code.." ["..why.."])") + end + + pcall(function() settings().Diagnostics:LegacyScriptMode() end) + pcall(function() game:SetRemoteBuildMode(true) end) + SetMessage("Connecting to server...") + NetworkClient.ConnectionAccepted:connect(ConnectionAccepted) + ConnectionFailedHook=NetworkClient.ConnectionFailed:connect(ConnectionFailed) + NetworkClient.ConnectionRejected:connect(function() + pcall(function() ConnectionFailedHook:disconnect() end) + SetMessage("Failed to connect to the Game. (Connection rejected)") + end) + + pcall(function() NetworkClient.Ticket=Ticket or "" end) -- 2008 client has no ticket :O + PlayerSuccess,Player=pcall(function() return NetworkClient:PlayerConnect(UserID,ServerIP,ServerPort) end) + + if (not PlayerSuccess) then + SetMessage("Failed to connect to the Game. (Invalid IP Address)") + NetworkClient:Disconnect() + end + + if (not PlayerSuccess) then + local Error,Message=pcall(function() + Player=game:GetService("Players"):CreateLocalPlayer(UserID) + NetworkClient:Connect(ServerIP,ServerPort) + end) + if (not Error) then + SetMessage("Failed to connect to the Game.") + end + end + + pcall(function() Player.Name=PlayerName or "" end) + pcall(function() Player:SetUnder13(false) end) + pcall(function() Player:SetAccountAge(365) end) + Player:SetSuperSafeChat(false) + Player.CharacterAppearance=0 + game.GuiRoot.ScoreHud:Remove() + if (IconType == "BC") then + Player:SetMembershipType(Enum.MembershipType.BuildersClub) + elseif (IconType == "TBC") then + Player:SetMembershipType(Enum.MembershipType.TurboBuildersClub) + elseif (IconType == "OBC") then + Player:SetMembershipType(Enum.MembershipType.OutrageousBuildersClub) + elseif (IconType == "NBC") then + Player:SetMembershipType(Enum.MembershipType.None) + end + + pcall(function() Visit:SetUploadUrl("") end) + game:GetService("Visit") + InitalizeClientAppearance(Player,Hat1ID,Hat2ID,Hat3ID,HeadColorID,TorsoColorID,LeftArmColorID,RightArmColorID,LeftLegColorID,RightLegColorID,TShirtID,ShirtID,PantsID,FaceID,HeadID,ItemID) + wait(0.65) + InitalizeSecurityValues(Player,ClientEXEMD5,LauncherMD5,ClientScriptMD5) + InitalizeTripcode(Player,Tripcode) +end + +function CSSolo(UserID,PlayerName,Hat1ID,Hat2ID,Hat3ID,HeadColorID,TorsoColorID,LeftArmColorID,RightArmColorID,LeftLegColorID,RightLegColorID,TShirtID,ShirtID,PantsID,FaceID,HeadID,IconType,ItemID) + local plr = game.Players:CreateLocalPlayer(UserID) + game:GetService("RunService"):run() + plr.Name = PlayerName + plr:LoadCharacter() + if (IconType == "BC") then + plr:SetMembershipType(Enum.MembershipType.BuildersClub) + elseif (IconType == "TBC") then + plr:SetMembershipType(Enum.MembershipType.TurboBuildersClub) + elseif (IconType == "OBC") then + plr:SetMembershipType(Enum.MembershipType.OutrageousBuildersClub) + elseif (IconType == "NBC") then + plr:SetMembershipType(Enum.MembershipType.None) + end + game.GuiRoot.ScoreHud:Remove() + plr.CharacterAppearance=0 + InitalizeClientAppearance(plr,Hat1ID,Hat2ID,Hat3ID,HeadColorID,TorsoColorID,LeftArmColorID,RightArmColorID,LeftLegColorID,RightLegColorID,TShirtID,ShirtID,PantsID,FaceID,HeadID,ItemID) + LoadCharacterNew(newWaitForChild(plr,"Appearance"),plr.Character,false) + game.Workspace:InsertContent("rbxasset://Fonts//libraries.rbxm") + newWaitForChild(game.StarterGui, "Dialogs") + newWaitForChild(game.StarterGui, "Health") + newWaitForChild(game.StarterGui, "Playerlist") + game.StarterGui.Dialogs:clone().Parent = plr.PlayerGui + game.StarterGui.Health:clone().Parent = plr.PlayerGui + game.StarterGui.Playerlist:clone().Parent = plr.PlayerGui + game:GetService("Visit") + while true do wait() + if (plr.Character.Humanoid.Health == 0) then + wait(5) + plr:LoadCharacter() + LoadCharacterNew(newWaitForChild(plr,"Appearance"),plr.Character,false) + end + end +end + +_G.CSServer=CSServer +_G.CSConnect=CSConnect +_G.CSSolo=CSSolo \ No newline at end of file diff --git a/clients/2011M/content/sky/lensflare.jpg b/clients/2011M/content/sky/lensflare.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c53f2ec51ad8edbc8300f2559867da313e60f295 GIT binary patch literal 8437 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 AC;$Ke literal 0 HcmV?d00001 diff --git a/clients/2011M/content/sky/moon-alpha.jpg b/clients/2011M/content/sky/moon-alpha.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5e193d5a84329b0339758119521897de175fc9fd GIT binary patch literal 4920 zcmcIn2{@GN+keIwGqy3dsFcZ}l8}&S8IqU?*(EZ@V34s4b#iQ}B#9J4DEpd7Iy!}t zrew)BBM!;FCVPg=_s(#(|Mma=-*?|aXE-_LU|&-2Xt8&)T)4`5E7z@Gpx zE*LO?F2I`NUo&;1P$_=+46#1l!O&OiKP!vmdg+z!~WN zhmSf(qxhGG6Y2X#Bnw}Hm!AvC_wSLsp|1a1f{#M8{6E+@Yk=a>_a{4(*rh_N$*ux$ zX|FR_@9}m)OEV)ZC4l7XyWz-Q!FAgf9&=AJaecHuq+G9_Z3ZB8gZaRDK!GkVpa=-S z6LmzcOu~rpGt_MS zajZVci{wk7LW_Nj;K$x<>{?))IRwOwNf)rzWG`pR1wX8XoBw$yF9O*U0F)Km2V!W2 z*bFlT;0`3Bw16alvHsoZ`3lfF&J-sSa1MnWVXSU&1qh%}C|;BRFRy?wKOeuaxR8K= zkhr9%sJN)8q_6;oHXiF={`C$M~K zlL1`9Ft{*`)dMvE$$A6BL0KYT9D)*N6CC<6;70HuQM`Qo&;kFa5eB&6e;6?U#tnmW zadRP%JSYTQKov3y!?|~es33Gs6GUZv!uIos-F{el>?c`qvsX^4YQC3Sbdhp#=HI@| z5dG9QWt4^QJbuT*S?_fw^?*dHWj|^5$(7nR|ADy^yY6OPEsuZGJ~*HKw60@l!OA7z zT0&06Tl(;#hQ77yg^0x5XEeshk}%-ng0ki2owsB==-p(4T!W#A(tir61^Ta2B- zE3=kwsB*0Vf7CH4QA!hfH^uD?=XbpZi5 zC#EpKf!VA$yqvsjLUTt+K@f35>2zkUrMi{f;>|?uM~?@#-ZyExuqqysg*V<`8qxOr zT2RJ)DG%RbZzb_o+L1RJV~0H8RW}xcBiD8Z7thb`9Y_2y?s*{WTK2$k+HX%u&*xRS z1f|c?($bp}TB7abb4mpsRa`4a2NhAC%HeQC7KjRY^hs?$lW7@E97e=E${i(sKDB7+ zhpTu~hO4V)c)CjmrS74r+?IL9@K{ip%!yL0WPwg6rnv0g)%QsYAtjFH6C>2gBKN3p zy+pG`4WGEJl~a_j1^nZ2FpNJkwlcVSP3dTnf5AD)##i;!O@jk!`=T@5(1pvnsw?vH z%gb`DL1bn)qpG-bMJaD^elgw4|ClY3GS`4;qAlTE$3iB8GlpBu;_$L}S%CEsYM1pT zW&HaId+V*){VZ_g?zftLUP0-TAMB-*EYJJL;EhMxP4YgSJL4yqAZlVr^WLlxlQl43 z)vUj&kh07Iebo(4OE=M};cY&)kzu+jGZWxI1!@cEX<8kr?p_`EF?vKOqi_CblF6x8 zjwF9IFK>*)_aAcfAmyMN%#&t#*|@thbop-kQ`YTFW#ah) zdV;N8jo(>@;3Hz!bQVK4cj!u@&ceueZB?=Vgm?1UNki@5L}P@#PqIzjwRuAR2zANrHs@e6;X6gy8#e-E?jyEvv#&5pHaVn>9!e>gw@;`QW!T19Dkqj;>NbBlzZI@ zAtDUH$$;wj^71l&Z#5*Z_rA)5`I!Z7R6SvVh%(&V1fw--xVrd_bg{i-v`*7I7HBTP zo3Pquv*$zFtFleZm?dq#?x6^Q{3$fLYdj)j_}7?m<@*u^A(81tPoL45&teS%Ka{CR z8FV>n&>u!K?O33e1-kR)7o0ig@^4LHcS(&|6?lna_@UXyaYbGE@udh4!{k;Q+M#92 zqVm18{-sLVv3`7v`egM$%mm_|z09o`ohYr_N|mqGa>_or9;!CkL-bf+`jXIc%=U9Q9m-HPf_O$)pn?qtvzCM|5?PWF?$zBt$+rTot) ze*=gG-0HLky==L8Jc5CKxL}tTlqr?sqlhIri3*lx&ZVp*s;+KJU#gov0-umJVAfvq z)3Wa^+!D}96D%QCcAs}0Wr23t+*8md{&UH*?eZ1`98$uAgYD`res54NeG~RzmHt(6 z>1A&{3nXN=GfRxe4&G`Q*A#e5BZJO45fcG7rb)=Gdn_?8mW`$yfxT+X0X0t)J{%TCrO$94-%2#FoF3!o;N) z#GTtmT)0&n<)QSpu`0!#Q1FaFOdh5i&zYZP1bX~_!P8Kq$lvS1;-}PhBMX(e39` z^vuh0#+C~;H;yB;S3Yr2$Br#lBws%WPGgCb^WFq1*@^5)rv8j2d$~~9uVG7wAshpM z5YPe65R7sHB!C5`5Qw4xD#U&qi49Fe{|65&H~^HuKK6v`=#59L!tPD_#hS$LM5!Ae9gPKqf3Wq@`U>(%F0clW)TwKsA`7c7E5IhiQfgsLb zx^;;SV7Op#IN}cj0tV;i;X>{M7;LDjnu?hCrUTI2FgT0{hD1SNh)pmqxUdK}*tbK4 z4KFa*(qq0q@jz(9%;|ERSVozut~oLDiL8Y~tZElJ({#rZBk0eL#r>ulfPAfhtt|q0xywgG0T9+iggQsr1VSS0TVYNS@0H{l zXdt(nb)T&t8-WAK*I81AZZ2#Q$(5R_SE}j=iSRJvri}WnHIN8u#0^ARG}#g=Hau)p zG3hoWB6Tc{usq*v;g2EtHLuJApz%6rzatQmN8WY=ATUxbwlP#P{Dcfq4DyD(lhOuo zs1Ov43&MtA9>$R&%=o9w#*AS0Rqolb zEG&Fld|RaWaO1eU59!&&Rs{L*LR0o?p~^t%=JdU#w8H`Dht4@>M4UJa2;z0k{aQrD zzWh$bRmJqaKok1ET-C#4wYVHj;&6C)7 zR?4JUf7wg_W&Sxit(?Pc9Y@*Xu3{af!#6bK1~d5b3mzHLuWQ|m9qg?*yg97%mofMV zY)?z*s=14PxX570;#TP((l3|FEF(U}Hggp?rBI0bt?RFr^IBQR-IO0)Gk+hmgz04+fct)Gi4CdvWJO zhLJJo#hX7-3`50;3zo#IRO~bOH7Iu_DlcbR^=N=W@63*}Z4+PCe(LId`aVbUpega3 zA@g(r{k~E;rGuyMprGkA@_Jj{-rX|?_l(w~uru7`EXiEH0Bn-Vsc`R#-lXRWL3i5* z?`{q%SC`nSILKvSTyQaQ;Q(*X8rC{WFt4*SGd>H@mleK5md6s`mg-9KUB4U(b|cd) zLrI5qdePNmzi8baAYDD;sjYbHB-&g&BXVaJ?Ok+6+D-*o&)qswI@{fsistpFY;I{s zE-jF_3KUDODg<24%ZRQKtbvtGq)l4nsZ|L4%w5MpdeiORP=QKG|bE02*sPfzQd$St5 z5;dw#wi#K_>io#C>(8B#(Kd?dF&+{=1|=yx1ZsSCDZakDuyI-|`0P(DZlw3hhaVR3 zZ*t0;rxc6iFn$eKIh`VdG+fMzr_&)qL{z$EllXRqs(y61UsU?`;%|i^CLU3pJA8MgURj3W z#iHGXZOrH|m#an+r4MZ`PTxj1=pHjamuM4IFO%i`=FuygeO5oEDoO7-(B#>W@I-ps z7Q9`wxE{^+Wrtp=(fk#&h@8vs#`pYAFVVPn@6#QPRiisbS7iEb{<1%3&3^5O>^H6V z0ynm3inU`dVglsuwVaqW?gMSV;JTzLq)g5h#mn+;zCdkF+nv}H1K%C&@gxy(yTC#H zs8Zw)1@+}y9SKP&gsnvj<7cUvH2*Inkxyow>aM3)4mpOVsY$p8H+Rq|&*kZ9P2pSf?X=4FSlvJW>zKd~`lfNK z7TyW(Wu`{=(o>CIkrb(TVgXRUjZO6bqtK0)*az^r9j~kR~Fc0@6W6r1v5n zM7q)h=|qZxfYiJI-h01$*ZZ&cUvI59Cv(o;Gqd;1ZaMQigfE0?fKEpfr3rw*AV8aV z0fbdreM5U!FIP`{S2wtXs5l_2hSGzqQlK%Ou1+{Ftg8z^B)Vf;07Sh0JddqNs97|x z!nK@Stt_43m$7#CURW19xT=et6Xv)L36VKZ>{!qI%TCqF3+sim`F9J*CZ(YV*2N31 z>11i=No+@c+`%z{PU0blS-N06G4Oxy1fU=`KPB+V zsJ70kyE?ggz_l%%Y`t7vFmPjx*Ky3p9<>26TU(;N6Y&l`X$1Ns$w+zjPss(M1_WFu z-v41Ebs`b@m*m9L??0YQJS<&2Z808y_vA*L_5YS2OT=FO4|FGMKnB&qVQnzSLnW@} z@hAYW$|(b+2rVFGVw9wy6CwtDOc3H900}7+Mn+CSNj%j5t^@&K$Ul^H z0Eh$x0h549VNfzs2$cj;Ne?06K7%AxHL_&jaSy!!WsJ`#R^vr5p_{BEBt7o-tHbyb zjDLLlY3(V+{ObL^^BRdJHkX<+y`;|$n9g7}O74Fc#LaGM@;}ZBD@|${n){Vq);c`D zWoGOB;7Lw-+sMMUjMf#qJK@Q>744rFcjy5ym>4a|NlY*(snkgb+{iN|#0cDZ7)URK z#xovA(1h;)A%U>^=5aSc-I&SRQ}QPt^f&<6d8y_BVi1{UZ7!Kgdtqk&8N&ZN0{(x6 zKo|q4ASXWQ0cBt#D*?qPfJpk9I&h)-VdPt(?0Ec*LpJ3N{UaS6EU)!9TbsBEzgyTl z?ALWxtL=u5V(u?|*{dJDO%iTH+n+)JLUw{JaY}+S(w~>5%R{N0sNbCXGJ?qc=(v}% z6}Ix#JtlCwHY8~7#g@c(;Pn^ePMr0iW2o;Y_08;{b7JQ^sf((99H|v0-&DGcD96!# zOFuYcJTF%Vdp%7(`qX>iE26?+??RrKO;hpXhCrC}BRYsz-=WA(pL^8eUr&iOt$bNDVxj$uZ+vxzd`qAA5&u!U|vTCbUNAH8QEKO-4moW{Cg{ zD=C?vyV{hfMlGDd<#D)Bg-;t3(VwNFpH8UI8SvJmzS7ZCshiItv-Xi_2^2Nm;Am`5 zP_<8(Mnw{Uj=WipfT%cp*^bz|xm9a1`k(Dpe^Ow^uhk@)v84{=v2e^dV= z(iy($Cd_a4@}kHQdd@)D%YpX8rIG0^!KGHt8W{=u@R#j73C4asw$D2JDGT2@i@3qm zyS)#&{5I3xHW-@^-aN_}G?&%*m_!{Yw>H)Lt0MSm9qsBT+kugF=F%s z%hT3=`?f2&&X)JMqxaO0D(5>v=M}GH|Ej(9u7sjO>wTQ|&x-y!$*UHP^cZr$j7`lYDZgPH)Wz4FJIXebQK#cg`gB{mZBqE%;N*gD=r2nz)2Shs7z88zl_ri6m6W1$fJOq_Kz&2+OhTFu@t;@qRdpY}%R8KuW+K-<-HaVVI zXkL0;srsh1_=kW1VPIp$cCF)0y(m|bpPrn)FH}P+hJ=eac^``>SOZ-YVc?*xud~H7 zHI#toQ<(r*l#Z7~!TGw6J5nt!0A5jRw?nvf%ZcXoS-DrB7&)z$ouQeH8@JsQpA=oT z6)J8`k6Zn^*B*RV=Tf-y`@hOU=j#W*?{Wxs8QaU&yayx@Jv&jhM7qB0n6x9%x%@aAly)5^EpR ze`a+3&?M-2(@pXG`kBQui`3^YKFSwp!7xY14wR0x?MMCqDeac8IS<+6w-8u3m&<(q z&@%#{w^D+$`AweIJKRm)nmc}OE3_vo_wp7p^%09BwPysa$L9KLYDd2jYxBm^7SVlh za)>YnGko+*WkT^v+SWL`>(y?59~|*85C%8WZ+ERPl{SE1M>VAO!MH@({6I?=Nmc zY;tuSp^FkGKjE6bHPx6?r$iXG_&-u-uNh>Pm2T7M4j3>VhQ;q`Ry(?}n@>P~nXWjE z=V61Q;ZN5uC^DIuntIXgfY|`c7&5jnezp`tH&Gut)SdRF2o$PQ%zI{ovga&I9~YyR z{DWi@VO;c>I-8{E(fc=nuYG77rO7}o-}4QvyJ2}6*Ro`065_UKqT5DxI=A4?ua{J~ zZLTG5pLw&uHl9!BX7TBNLX^biBk;ZT6rrWM$4Tnml3uOdt?=mVEp=f z;inItD`&P3xg^-tX*aG{?YjwEZoT~YI$_NwXl-g$B*6czErTGue5`Xz`}f)x!&c_` zdA1eNBKE{mdn$i4n&GK?wPW{8x#0)LkRP$VH;o-XKDpS=Duzf1=vu3u+Q@Peu5o)`*jYgN{Q_u+i|1~FPM{39=VIpI&-Z@?m|E*P z!#16`rlMW@r`xFm*vbW(I-A{k7cZLNV;>J+gOEu$^FBO;CakF>lS~VDWL| zplMcCxb?{-Rj(p$daA$T3TsS|!;z^ZGfb{;7Ew_fJ9p%8FLr6v0_SY0n8@E#e+E6M zE95B1w=Ju=*61tvD1B&kIL=w3>Zkk>p6_M)oj$3E{*p7wUM@O0b26HDbsy!1XepE( z%su`<33{SvS}wAOwh3q0?H$V<*5uM^5AwFY$7)RZ(rZ9=Z0f6jgJvsbb-5TSd-odi z`zPX+RdbEA#J8hpdyuo!O@pnP?+(+SlHm#=f?>^JWAj027U+kDBH!k zzHgT4%4jr~YN#O!@t6P*hEJ1_Ys-@c3fc1|65vInK-=rvX-ywClWY=<@o86r+iB$T zD<^}`4OeQ+&*Ets(hLR(0P=g~G6A?IPitcD4aLbQwLpi)Ax??E&gbqQb}veX!aKyZ zND#Tp91C*of&Qwlh;ofXd||Ju_Yb8O|4QnYt#1y7r%iGC+1mDnf(uYGds;WZmmGCy zoUaIN5L^U!C@0&$CZxH1#Gm5@h3)QMZVzyI=mgqS)~O}{a-K?_2UxEIZ-ukjLmtl& ze(ht;!O6QL1i*UW=8Z+Uwi~*!krz_tgGAoZ^}inTQbpfEG{%Yyell3cvtx zz!0z}mc5AVc~Uw~`x*WR3pgMRi2i{!CujmnrDJ$W3vPt7Ja$R!0e}G{L}$bwVGZE^ zgAR`6AP7JQ0Ym-{mw*$%03{(IAtiy5l0wO$M5ZKzLdhtpC@3f?D5&U8(ZQd`e?o=R zItT`XQBzT~(9yB{F9AdIF<=M*LLeYwhJ6YcT7V2<$RxyU_iuCz1;7w8B7FFp@T5pb z1Pa7KgGossrz!{uu>yqw40Le%GmPRPOk}(WW@7Ir={qSYDcOk~2n+$}PxE&MQcIo- z?xFE&jCAk}G_QDZ(>G}UPb-hR66%PAR~u*k(`CqMG7chQ5PG7^c@+SVq19A3j5zjB zE@1zps#c$mJxaTXmbmVypEi%OqWh%T+Fu!(@++`~056}g;FVs|ZAutn7$m@vatA+P zYCjlLBYin|+jy)@w6)%gdydkBdqs`uEBhRoBD9-QDyt}dgfad;M{+Ies2_m!NqcLvibU}Gx9UWb|#tGhY zn)K;6tUTzN0sY=*T&Sfu3_~hO4$0$ra2x;#&lX2kj){|LK&^P6N7?@%?m+AGhd!R{ znmnZf;ETu80XRbpiK|JRF)|RCi1C2Kkl>RF5&ZqDa*Y0f-H=SXcRrl8O%<{G6mJ9c zlD_ZV_)J<+rMURe=V011MRAV$b&ky{kNA-4gQC9QMeTJ!O&Z0oiJ_j$2Ho@$ifLp5 zY~E4qvYB<8Q*AvA1Ghz++f2#(nNET8QZ}@B`CSFD_Tu4bU zw!mtQR0Wo@INYyX;O}RX?QUJx4_P-VFxM%qcoyJ%@NAHQ;m5+yhedBm9Du9FoQaeK z;0e1aUo~X1I*Eaz#P!F1QvAjmiO#H7sE|yr!^70VD2cgxH=je=53Q`mCaobt5h;$* z%H2l@xjZw0XM01gD}`)z=X3khyb_n3&RsJ%UvZ6J*3e!>3;LgXi7c&53uk(GNp|IJ z7^CT(t9Q0S@^I!AiW$(Gf)4KAIuh`V!X-9yH{U8;pSiv%YgSvQ(3;9}ezoPCg;4g?sy$ecsrXlAoS0^c06&!n2!N9K8 z89VeMwp=P4NwO%kCi28MZudLF0%=#o^wAK-@__iRd)P93gT9>egEF~;M`xpj%g%N+ z#mM!24P)M478d5MzYg7nM=B}gElYBA_n$^HcfVa-UKWXuG561^6YNuR^vLmOyqY(~ z@6IeVYE7nr`iphnIlid-=62noPiCMW<|-XW$;)jn9;^2T%}TDfdzijo^B@~Rs)%Dn zzF5T9bTtnarq66Ln(UEoiVi<+`E9GH!MS*=q{>Bu?BIOE`&&+nHr?XZ7Oc-W`;ZG^ zg_Qo1qR)I=^87rG2tZDp0T*S(GI`&xTU;!6ibKANNk4dByBKr-{BpSI`tRHHrg`-P=9_?KaJUyb4PJX{kbMq$_-cPWfO0!(wg0m z4l@vr)-M^YY}&|u@obE-r{`c|-MFE*rZw1|i|k#)J5J;nXRJYw66ul~kK{p7qg8C) zQ9pvu@9lano_Y_5edhNhr8I!}7Cku^U?}n9$e&~Jw=xJsl{F$!qscyXi>@Qy=f$PEte}q=Q+DSUtvd|o;P-YxTLT{_ znD(D6i3ZC$t{xf?ol4{&N zP**_o$xOB0*<_m<>TyVpMeZ`GQ`oGLZO(*q|c@tk=7SZ?)3hG?+f><14T<|XdNyl`T09-T~S4zB3JVydO zFHHx(Vm&m4tDfnVBFZ!IaA+n=4!5-ow)7!piX*Yepcb$-&4$^J_O{Cw2t7Lq9)if%lftZxaFX)Z3s%O^ZgnESq~rV%vS&_+sI7NvvCZE-^RvR^x zYz#jHjVdet;;MDaMHBAOns}(}vRIi!y5LTwv2d0@`~D28IwrjOMM!-#nWA&cAU>L| z#i|l*5rGy<$E>H<#9{7#Db?b2k>VIPKsbDk6bae>`XYsC$F6IRQh=XIz|;^CrT?lb zbu&XyDstLEpxf^jlOiZ*tXQvY%nL5WrR&Kg|DF`Z^0@r!(DaVnTQn;gOca z{eith4=#Q+kbN!Ow z_vOl-s3<1%fc}U|W?Qt9i0Y*+(SQ{!Zt~6rCDj!wFqi)L*jq0={2U zQ*DiG0efb0$7!=zhccI0JDwo}*gf*k&B)W8W4Vf*aep%|mYow9Yn!?4-8;)Ez=D+P z?Rn~-zfjz|#XcYT&D{CGAj7c2H%MAWch0)zs@_BZ9u%ozGPIEoH}OJno#ugLF+5PH0s2 z=sY4P-aWDsHhFy>ZS<7VCu&lcO%UPl5kDo~XsqD(G$Al|WzFJcuw<{9a{))`!!1uD zqE}~oo3HzTiu6a>sw!)Ud|81TVxYIU`VwvYX9b3oyiv^x%s~2_d%YBg=L^WjRF_EC za0cIySx>cZU((Z3_lY!YbG)?>S(J2(ZKEB!Ib6dgj&{eyOpOY=>bixVHI~8=;(`UPvAgwO?zm5xTxJOkYwYpIEA@^Ay&aLF zVfA5VDXM%X+*pXLb*e2~e*Q#4T4*(cO@UN}3{74}CVBKKwf=d`wMey`mEErsg}G-x z&QmBN3)7K#B* zT~XO*lXt)^&H6F#UjOlD@50{VGv5>QlS6`_prcb}u_90A2 z8)QFqy|Q_B5-l6?tJFLX=^r~~wDygP?X#yNz5%IfrX<53_T~|8%RFKXY5;;&3K(dLi9NGy%}x_ElbLTl}7FeD7VS z$&t~{gKnQUbt~`Ly*f7=&B6V*sDdnw)@v@V$~b&AtSEWt7izpf;xD8=s(Kba>%R6X zu7muxvR>%>@uYk!y6d{;MqP_ZWb===OhmH~=6V~Lm$NP~@q9Hbmjd_Ax qJXRn?Iw1c)f0!2iH109X;^muyAQpY=n5BG@mS%m`jo5ZDi1s^9wo z;s4bSi0JSA0Cn<1UWhF8@4A^2_NpUmi>#5o=g#lCB-6;cTnFfP`*cj#9DwX>0F1jS zz&(;&a%TpJ1?XvLXlQBZX=&-1>ELwC?EC2H_px)bva++Xax&BJUOygtiGPI<20A(h zMg}HEMkY2!Mn*O=U}W1X!u&s}V5c2mrU8mTeL(~PC^H1c4B2@Cb{oFa4LJ--NeS7# zK!M2@3^Wu9N-Am^S~wkO4*$%A08rS^OeO$A0f9j&pp?{9G?XxUMKF^YMj^nWK&frz z$|@Kbg`{H3C~njd5@tttxG5@;qDOS8MKY~77q)Og${Zz4F`{}|7RPkof|RyIsK^3P ziz;`HfZ<|+WOcNDIZni$_*3di=3pce2HSDK9(e7 z@tC{+m5Jg(oe@5sx(J`CN;z#trmPE4427HpcG1n%F22=dKn^i@H7#o@I~nsh2p4%? z!$RbMB}$x?pHSoe(Sp+B8Aom_%B z=v%v}|6-D9E16_crq)SI%O080ufPc~n`>!jwA^u=x#@F~AXz8HC5t;BnvfX-_kt(5 z1x(Nx*N>qFTxFZOI{>tH z&V_NGmvqp3M9RL|SU0}}V;RSzVYw+zYN_akW5r*sh*#|9L!-X*-MGV(`iurpS310I zksIk1RcoBrldC*USiF|+qtaD+4|`GuXk}REJ0p4Vh@E?igX2uvU;)BI-@8OF%=DtY z<53EZySX{T#~dAfTJi}8QDIlYr}pL2Od7nn|=4jm#aYQ6F$B=RJk-WeTHt{!vN*a6Hn zB66>)i)6M`?+r3P;Xq|K){)-z2iF}mJ3P09P|s(=B-anl_@`xrg1 z=yufGvzcE_hI)ti^u96SF0Ebqn%VUAq`nnC`Syiw?XhR|8WN4o!|$o1q7SnleTG>Z zs;(M;jX+#lV<}$Du6g(U*zLE-2?x5lvoF@8>B1Rv*Q!*jA2Ig%dGTh|Xy)f*zNd`$ zKT>7vTWG6^$q(5;DBS;U#By4&`7BV{_hv(+yCX}Px$CYs@$vXmDZyIpLzI}mLMCkp zcWrLI{gS3EcV*e^gavE&wbVmKzGbWj(oHUMHZoMbzf*@EN`GBx@*;W3tvRZ5@p+gR zQE&-2k7~7Z66R|NjXZE}RR1#V#szvt?fA^YS#63hE(hBp!VfnIKS@F0M|46v<%OMyc{iFTqGYr%nn&EQIO~;&l{h}HI55Kb( zbrm4p-nY5~%yvYC$4^{;@%^!q-52g9ij0QLlp``}jHk|>0RH*}4jG={792)rdg-%C z`^dzFChU;9fylkj`|y`;IT;^d8+eQADE=Du!cYCcwrl@ zbuyxi5A*n89V35vozG!)wKU-!;MOASxn01r*vjdhvDfCU%i8|;8luZ4aTmEQW|uEG zJJ&whJp44j&PCnkLqy-ls%?Ej_mIc?^0Qut)-R_?z&3T$$J%o3I_6JxeLvS`_t}Bk zjuk$GTz{|~9T(R8sH2Utj}ZDg0r6e0XM15}b>Lt|>kcqps-;e(IG*s;#N2O$!3DM$ z7tVexi;7|TN?(TS4sci8`G~|vcg54`gahxz`V>n-; z?^7c*5l|}-f4xbGe`@5&ol^a2%+aw$yQ1&;#uH2ad7@U{MHrZ)YZ}sG>xg_DA@myS zg6WNqO?0!1e5J0pC!B7O>H&10@1fTv+=dUPFZWI$U)0W2KKF9!Qx6%B`M6f<$6B>z z(({Z@aocGo3$gohkNMRLWC!ChUn%k>W&7`54gHEg`cALkC;yurt$L;&-?Nh}tf=DC zV$&wxA#cA$s`b9QT70E1Itm{<5GdkRKnwV)2UeMXICUuM5<6mm`I^>eY1Hy*qf50r z8)^qu4Ojj zfXmlD$k$>zzUF7Q)_sp$d|PDIFr=x|W!0KO?QBcSFYwo&|p#S-mU%==GZBT*Ss~zO2*s>(PV9-q{+; zy;%&S>N~~t=~~sn#)j$VkH+SgsEPV4mn$6r0FGo)89lrC<0Mpsf8@1!rqUwUrBJWzaQ z&U(slw()_(gDPLSy52}&jQN{B>mUl0C;-n>VCo zU-R&l+v~GITuJH!) zjyt?waN6)Yi5OtCX7v5oV%ahu#Q(i?#q9>UH5o7U6G}$JZ6l5IjXZ0&M}#fH!#3$0 z_iL1nn>~7Y;LF6-nQzgdLWirZPC6ewq*y+!bcd6EJFRTupoeQw;@g7?ID{$M$#c=Y z#aQO?bGt;`ZLGcZLXXj&yM&P7~%X zmc{D|wOn|V7n%0xki>1g<;>;iqa``MD&O47W;j=8-IOl~p!bO!ddreoJ<$+86W=r!?=DJ#~IuuYTH*G+f;Ch^h&e#uylRaMC`0#;4TqTlE8OJ*};eaU8~Z z@9$D}B3jM%+j~|znm(DPK78WF{fr6TCr{J8*4sL~uUAa^6qw7@61fP9huKRl*%Jir zZ?BbHLK+TIPXu(U-#zh zedz6>Yx_@HZ3Q@vl8An5GWen(76C06JhHdtwU2RhMDAOKLhEnZc0R2l1tuDGuAf8l zww`aAzDB;K`B1vN1MEDyeI{SuhWZ3!<5EiHx47WEZ=^=dUGCmK+0nzRzF6ed6JqAM z(K9lB7jsVJf4AMJt4qD@p$88vc$CH}rK3AL89PaGh#8xBJoqw)i*x((wTuD8zAn;m zA+PBhX9J!CRkLA-zi1@g8@P9``HEKc?JlJqK+PKRAhaNBKw_&G7_;~^DEc(|*8M_} z7=e$sR!fci=bEb?6`r+t>>B&B=;LWZj|*lnZ~mo>pz`$Ntj##Ljr#1*y_yWt6y9%) zPtQlC-tc)=tDXJaHYoAtcvA?{c?U46`SNvyC(g^`V;8sD#lgmtp3}m|t09iYs^zz7 z+EkW(F@+}_ABKsvNnyqIOmC52ejo(Vf2sq_=IH&HQXiN8E>dClvhPyT=Wcw#!~ZH;Pf4m#Dl7 z=~W**>&$ZrxCr;8(Um*>Y?bzou^GfKOH%g9d|}{BYxcx)d>XHkp^->-B3%9pdvlWmsS;W~x+&N{P^54GH(j8Exnnu;Y%gv`?i(X$|8;@Ku) znO!c0HXrZ5 z);eC4c2y8Q-H_OrIF+P*NN(rh>YZL!FwV`#Fiee7U~4H~RLY1|;p; zQy!X1Nz2ObyB1I^iOjBMx>b=qnq5@BB4L$XE`rQ1H$Z1+4_Xffg$-EyM4d5ph`9F7F`YGl}@k>f-ByPRDAOvB#prfGK} z2q3$qz*ragg73zS$QX22g7;(;Y*)_11I!_U5R6cP7vu+}IKSX;3UZh30K%U<%DWVq zUzFWCx4|?31b|Vfe|y1RkhA}7*3SP;-mWfa$aMqczJl>FsMg;7LvQ>b71)id?dg%5 zoP-&IV6Q*qS8QvrK_q0y1 zzwcgpPYkrD*N^<&G*u9hfWrsb5Y2+X!jONoL%Ev=l3Bo;dN*OL_gmf6o+ST}fPavv z{7D2)f*;;5#1||>uWwDR-C~yprWssAg8dEget42=Fy0*`0GQ(e_#e#hJ!Ue6oMY_k zi2xt}ulo-RArUe9b{Md!AIc>w|DP1|AW!^1C{(V*V2rEhKWL0NJXj7N9&8+BgfTaB z^YDR4`%hf^Ph9&?T>DR4`%hf^Ph9&?T>DR4`%hf^Ph9&? zT>DR4`~QQu_HJB901V3j02aI<yhnT~5v~NY<6SKT{Ux?<*JX8X%`2D=!Be zJRBb2iu1t-Bi!&{3{q3@_07A22!gw&psljGym^2w-iu&#f`qp|aRh@q;e%6i7d(6j zaWGsx+&91%AMA<<_a*uTsfTL{?pCf2;$*U%AYzv#*hf=vch4lk&fF5A>rcWXlw^^z zNEw{GiXuW;QC3kIse)9JMu6KxQF8LCa*FaY{c4^ zb2seYMgCFs-`Tsv@v{)9Tyyh(U*PA+`TG9dL{PAPDA)&O-~65cf!45oqs-Jb^V>yJ9WZ3`yL z@Piw#2gbKG1gee! zD4?`;6;O)Wsz?0R`S_(#lBi zRz!j{upU);@CJER$!TRUAG{Tn6pMjJk3U&jefDoi8p_Ju!A=ph22RjKu zP%Wy8pwh??|x)si7t7KFQHLB%R5D1o_T2ucgWJ&Nis zjv_-fP)-o;@~A0;xGIuNR|N+Fgy2vqDX4*Uk|DXQ8j4(24MpZrLy>vZ)OLB)6n1fP zZECx z3aZkeEg(T&&_X~10c}SaG$YUoK!XA8KtoS^nf-x|A)Slx&a1Uj?hKi)&u_`n|+k$~9sz3Q&Gz3G4>yFI+S;14q4-%b7hcKYsB z8RmrtC*422;Xhp59$S#VM{t-c39s!5&eZ?f)yn;+Qv3Un|5o-(?f_SkEBF@2lY%q_ zJxKn(h&{LH<{N+r_WzOC^^yN+l|indzpDGUYWQzG;QuQ%{1_XYm#d#A9$e?h36gsu zM_v!?jjY_i4*G81Z)=C2?BIfgjQ+hAI`nhJ^5^+S1AjE|M+1K}@J9oGH1Pi;4g89x z;Qhd*MHm<>*;%Bw1HTiGS)wfrjLr0S13&aeW&}TfD7bme*Dshv{&2LjcR*0z2RET(=9({PUxA$sH#>f(Z_?huPd@|z#NZ=kR zh$YCc=nh6jKs*-2iDAJ3WIB1z5u2M28HbWL%(0O`0YRLTjC=0kE8F%;f z1GlF^$ubAH`?{0yZV*oh4Iyt^gPDPNd?*1Q2IAu&E=&yZC4e}2pCg+u-WA+RM?v1t zBpi&#d4ae*h|`lWXk8FL2<{1^_xufa`wb5U_m6?RfUbYQ@!cI&2yvVQ0{mz|A&l^0 zM0{|tj3pT2awWNg0Vv-9SHI%`u-9jDDS+iae7WzE_rQOd`5WJVg_6g1FaNF8?wCP1 zhJVq1mHb8XF9G*jf_q9~>Az@h`2cV|4gff(f6;`Cz!+jI0JJ>#tv?)Od-*LmM!@4_ z$qN1Z`fnNj=KRl*-`bNUxA%9{1EIIK0S`g8Y8<$sE`)>#B7XxTWd7BN|JMb76YDoQ zq|tZ}JP8j*S`ap%l@a_r!Qu9EC+tT12!8*F&HPrw|FYO`HIUIgy9N=~vhM)fFVA1MKA~Q_qdtS+JM1c0I)sqe9!Jd9L(Q^{{YZ5FbNGJ>~87=bkP_D zE`$`i$3j7VP=Y&=_W^7G7r+k)0pfrRfCN+l4L}Rf2TTA900YD#4xkqp0)Nv#0n7mNzzXmZ*aSWRU%+3FQ$rXa ztPn290f-1h3W9{7Acr9O5HkoGVh?eFctZRjA&>}24CE{%6H)*vhEziuA#IQj$N*#n z@))uJS%tiTe1^iH^iVb^A5;`72Sq`(p{7s_)EVjt4TPS6#zIq}dC(GQ9kd170Ud%) zK@Q=Ozrrn*3NnW~*?gldWEJvB8o7qt|% zCbb2%D|Ik+Jas;G9ra!6QR)@yZ5le712jk)0~!Y!KbmNoT$&o1J2ay-&uPBUGSQ0A zs?%D~y3-z~O`|QNy+Qkcc7^r}oEa_#*Mwu>-tZ`R9=rkG1D}PzrK6)0q*J4_q9f2n z(&f=zq3fqxp!-D6LN7_LOYcMEtq|olbLIn2bf>5P_u}#=(D)9#IlsKbg?Y4!dQh^by;z&F|1{*J*+Ei zRBU2w#%$hfXW8o6?z3&Ov#=|%+pveT7qZ`GpXY#ah;kTn5INE~nm8VDeBRHuUwc1( zf8zdz{iFLoa`JF$apF0XI4^TfaDL`OaOrdTaAj~^=X%0T!7a&c#T~|dk-LZc6%QMa z1`m!WiKmHYnit9|$&2Pa$y>@h%=?~?pU;plfG?k~i|-Xb2fr4-H-9$&9sbn=tOpJq zARNd(aQDC(f*qlaAR_V*-H1&AUI8P45P@QW`vPAC#RRc}(Snx+p9sN)P(mI;*+QK{ zo5BZ#&4nX`YlWvpXhl#WULxm2`b0j8iiz5ao)Nt+`a+CT%vkJ%SgqKsID`0M@j&qs z@o@<%36zA7#080ml2A!yNiWGl$p=zUDHSP#)CH*#X-Y6G=K8YrGt zY*pM+l2XDeT~wMq#Y{pHbrQvfvP31L`qe1abkt6( z-BSCcuA&~S-lYCoLq@|#qekP!L9v7QgJlPoGzB$XHH$Up4*12a zi&{cj?phUE&$T7Ay|wGKH+1B6NIK0rA9dArPwBSn!SoFElJxHDv*=^>3-q5F2pV`A z)EaCWDjS|OY&W7bGBwIDnl$D!#u--|Ze*)6&fCe^ow6IU=e8%nTe*f>-;ym!=h%yC?CQg(`WdgLtT z9PT`Dl=~?0=O$#a>r&(L)z!ka#Pz+KvD5=L2!c)^T%X8K1uvf0vD}pYefUxClkcH4gp@pH_VK!k` z!Rr-e?(o?eMGjI4@+ zNBKnEi&+rjm9sohscg{ZYo@jH*oL%oCYQS>{~}fG zat3mhaxa~Op9?uRpJ$fWnlGH6p8vJLt6-u~r||N5-t&p)KVERZFnUqzV#6iAOJ^^A zE+Q076&n_}l!%t(mQt05mOd-9DeEgol~-4ASDdZ*R_RwcUxlvfu2!wCuHmgotA*Bv z)UMV!)jh1&t8Z<$>yh z)`w~jZ;Tuqxiflrv|~(ftasdad}!jx#K9UQh&|+Ch_gYchm2)JHFsAe}0`uLtYE)okv4OK|w)DK}AVP zMN0+VbTm{{G<5WEI2{~L&$M^=%#X)j;$I;Ie8(}+GjK97asFSNM*{`FWMB~R0GD6q z(P)9^(SXZZ@Gv6sMHZNRQBcC5R1o0Dc{ETc?DyP%?%Rh#VC3^?sHkBefCfRJFlGvX z5Fp*&aydc+XZ&Y7iYf#-4pXjtVB9!L~6v6V2!x#6oI$5o@$*Sa=h!^_&M;sQ?0>-x6#VDf1>(O1XVio3iU z7ucq7-dAMQ7i|5V8?l4Uv-4QI(rT1#e1kY4o}wPt!fu6&!wf;`9e>Za?>tYYC4kxpE>6 znItA9e07_Q%unDWv2xHZf3dWmb<0vEtPb+Lc)vL42zbhdJZvidUXU~%R!VC&}XrAPHRREiaIW` z){4KFeWHvnw82^B)KKo6b-Hx?mS#un;14!yOA*l#ZsI}g=4wK)t5_~;LZo> zwYh@b+hgyn-811gy>pEAN;bOtdU!#R@40+OOSY8Ai5i1Xm_n!u%lTW#d_|gZ*BqvM zmX(s$LIgcMqkgtnCx7RrCYBmnF18w>@OjCa`V3o+9_Jx;J4bdeBZcy#O_ob0iN;bH z*pL&8acc&Y4*foH4nk~It;Iby{DrPIIoErzFi4cGlv{0Wl#RlA9LAlWQ>RM(wp1qk zO!m52I);Zy^5jYs4PBemSc4<`*Y1tI06wz15XK?fyV~4*PxOd7P zEX!^5P|JjA+nb4pDCkxvT~E5n?w42Vve;0Ks&%nucjDnTZ*7tCDgA=&t}^pwe-g!~ z$bV9`Bg0;cS)15CAVpeW3qLPjG>CHawUMCX&T7$%jRt=bKC+tO6qC)_R#XBTcbAYU zeH|I+G=4b&73aiEvl=~GsazK%BcZ#LncS~UtNEzFP2;QS4AM1ode|~rCFSLe^i5Yx zm8kAmgJGOXLbSuOFc&mW9}O9#lTXrbu(6j4L_m=e*p%89y>e{)V|IemJJe{yN|ckG zTP^2#$+CO8N!LUX3*~xU0qVAbI;DbzLM92eoa~lN1{5-`ahNH3bY&MiT1q$07M9dN z;bObL2lIHdW^}4%(*Fz%hP|WWlRH)}W7X*jm55xcH)dsv9&T7=CaE7J$LrvM=9y$u zD@;a>Nod@CEv_idaGn%q&~8sj_1Nq>F||LTOVPGZN<)#hOg4-|#!iS< zFqY6v}I5=^(m{r)lBtV41AV; ze>ux(I3cji^24T$TVI8}1aXpcBSo^!)LU@QO=3ns)XL25V8UgyqU%(zWi<6_3amMg zf9xUS#w3Z^MG+3docbCw|#Ubx-gif=ZxNwDC&tPVm#+`0w>_y-eYC+xX zl;mh+=CG6@i|RBN6n(pnl~m}m#o8H*&t)b1_A6FyHz%qZlxmmGL1?{0Z09(uwM~6^ zSX&%K?U+hhj?`~nXfp6xu*C$ktI@R>^&jxNxq_yTmQ>T=t&2D9vYao+GPD?EZeZK% zneRxBDD~JVp2zCXE?}v>-wgtAquOoahnoOxqcqqJc#G$A8>A1D|Dye z3KY36TUPMQ3}%+(9N1gvp~o$J?zYdl_{<3f-A0?$IA=5LE$n!YBU$SfJtWfCKwv}G5LSQQ`t-l)M#AN1l3BBIF3L9OKS4l4o*r}n#(<6qD*#>A!(rv8{9^3zF<%&vo@uS6x zoPoTO*>xu^n@ltVqcDQq_c2MjK)0t+GRctQ%Zj@Q(*-1D=I3$W44XDRA~w#SU`QP3RrSu=f48vVQ&Z1=7Cho2 zuK!uE+oFjHf3cXDnM`;d%#2rJ(Kaa2n=#+F)2p2%XeACP@6&_0w%tMvZRW1`!n z1fnwULeq<$3bf^%w9A@X{hl?0w!G)T-5M&`{n=zqCLu;<>!l@WyuJA(L1r!HNhy!H zs#0pWZ^gw@qM-Pq&I5_9Ask1W@y%S;`Pdm&r8lFli04K03vclVf{?mXd|EXjIt6AGk6<*j#9FuUmkt!UYsLC3#D~X z9L71av&N~Tv%w84+%n@H&9tAT#gVDItN=V1FnPF}Thy+iXk2(wB`+o}y==o&wFMu! z#L}DqBMMNup!?|9Fyf^_IRi}s5t)>;F3j$x28*Q){1k!J`H+Et#%2y>HBrhMvZDaq zL@?Qcr>jL{f|5#>8c(&+S1l7cr!TVWPq`-7dpmb;@AzR?fk3iwNf z;YF3#q-mGltwbA@QM5R? z%axgxC{!lu&<4+G-iJFn*qzT&XaV1~W|H7CW%32=zO~56&CrLmCQ2{Y&EO$l};&A?(r{^u8sJ%Z2MYTcVe$Qr<$?r$OG#w z=5&0kv6Pl!HeB*dE8g@*Hd9ckhx0a%Vnf=oR-6n?!XnnWkGV|>t=a9(u+5^^dTc*? zKVhV(%blYUN2|>3yTjvP?MRYxZoG!BVNq$%anJJRO%d@K=WoT9rN8UVu{2V5DJNd( z!92B;AFa9-xlktaULro{X^YZX>&z3&?fS*;xV9lT&g>iO`46M=IeV0ilh&*>jqX*j zEV$DOXIvo;Q+5mBkw$)npjVJwBLncgXAQpXus6VjIQZ7PeY-LJ^_bN8)$^`|Xyi=V z8DdeY=w`U(o7t<%#zR7IpX`TkOzt&@4p9*529D&b$ov?J7I~@g-Ac$c?mT>5Vm5J; za%~CP@JwEE0NPs2sZ&(m;^KW9=~9zO-P&2JEyRvV_3MMs+SpSWf*KrP5(XOs=*HShr zR}AnFew`n9WnFepk?>uwz_|NfBfE&2WruWmw%A@#X8qTB z%l7_M(H!Ks6>3hk@(?8c5V7s;_}YOhM@W9XDt_^tFkC1Ut7+b-nO3O z){S_XRDD%qO#v&G!c$=~TH%IAP4n(covK;;HdT|-`4)||QmQr^8Q@sPMg$28b5PPL zR&uXoP$o*ae>^DF715t8Q#XK~v!qnjSjHzR6sXV@q_&xr46_kWro1V+XDLUFGQD6f zFUgxr9T=ZJ#yrE;M%!H@x?ht~E4HK*aj}gh$G|EI^EA?}DoiROlYyCOvca>}_ z+uI6{)0JY@jfp$QGA!+E_S2O2oCLVC_~oR*89w@|(@hb2A-ZOkJ~63Qx+VbaxbiwW z=Z3OM52i4qGfqKBVva$wsGyWmBv9O7o4ts&LUL88W<8c&YgTJG&S*%GkZAN;W?J#C zZhm@Bvyq6R)xIbRC++5zGYQYiPkGBi>}c zmH3N8$BA^%>?b3kbWTGtn9M|_PtPy8_9#lK>FH`mi8w52XZW^NY*0Vm>hH6ZO~Rk? zP&i)sfLVGzW)ja_^Fl_=g_(t)}j zdub}LHKUO1G-HDmJF!eBvW$8`qV<_b59!Tu&?pE&(PNpe_I82a2JcgNc(C<83n?{O z1}~GUu3qUfdD!MUxetDMKcuBMN9QE=+=)|MsQc+U=~vQ9#RtOUc*UhIFpIjeZB;na zzw5MH7r!%xzv^Pxdq)TvxWeL{ErA|1aHBF5w%4l+VD9$M%Vg-_;#nV)5Xh`_f|pAR zoH5hJu(f>E9)jo#Bx97Fa*FNMtOLywO=>Wypmk@GIBU3#jRt^N4Rh@ zptv|jT)yGSTQUAq*ImWM`80)i>Wv1%b5q$zHW_pjBuwA?N=`o$^|X3BwE0XyL)pET z=J?Z6H<{;nlN@T*ZBih$buOD_@KC{pAKKm>jGxPnfAJT)gHcTO;p8PX`NfFc8DFiI zfEG;(x~)JH!HiB0)AG8Ly%s~vxnrid)W4!mxEW#f_dQ(CkZ|6z zhE^M~$8YOYOKb5Ly4N$PM@J~YuT=3dN)`)^wn^$2FT0v4RT(O2xUVMl7N#n-Ob_!= zicUuFbApc~U(CaL!sd8%x>z6GZnCM)&Ar4ac0HnoSkk}#n2@(p04@`2mRK^ja9*Yx z^?9~wy1Bh3*~YAWqF+3;R5;Z`4HDwJ_`U5a>MOgkQw(oCVZ}#Pp6Z>_DW1@2F{i2Wuxcbm(b_VWy>G91F~P-BlT?%pf1EZ$SsUxZ z5HHzegaHSo_$gn4Q@VtfCPevVE|t{rWThHkYwI`+*F8dJnS?3VOXntS8dVWeaPPwh z0s{dh<7Y`P)8I3N&GQr@_PWeg=_Z0S`Ax!QQiTT4Hh$sJ4&szAf!UWLA%cpQEwW(x zDt(1nM*k;ntjl{&2{;J_i$F+X|EiTUPk4Q9NvXT+TwIAmj8(qfN1xmQnW0F&;>tny_&{}$gPf}=>v3cGDT7h(L`DfY@$F6PE38jx&G65=u+s^H2ylWN2P|-T_UHZ zG&x1`4bvB1tbyIh1|v2J>89d}cb#q=6S&(UO3D>_9V%%px2W%6#mhOb!)I92%WWKZ z;bX~IqpAjWtAc5jwc7#F)y}h0TvL|#O_k^vPhloTdou^S{HQsGnmL0236n2Nu59Sq zfoTc2`oj;yc{*K~aubO!y_*dtR^?Qaw;TE1+{Bv;qr-UI&4mR8(G18oB+WJ^no@m5 zKiyDT|D05dIg*kGz5u$Sn7d}e0xYRiO9IA6MNy+I{u0e$;HS|3gT34s_Svm!;TC6_ z%E)HvhIa$_Rb$`A9wt5_w{+=Ckyx?qMzk?#rnTSB!!1mhK#mhUB^0l6ZN1A5& z;u+ZzrMkid`BH7AU0MtUXk%5+e}DA!Q;IZZ*-)hRY@GF@QYrbC2(RpmD(uv!>8sk~ zI}p}V`%@Aq#uP~1*V`+O7BE}s=FPNRPLcSc#!~xDyuX;Onvw=<29a>PZ|ck=Pf)LYf ztZdPVDYXy5*w2}pO-a@R=N9?i1mx43X=|Gk=!3l|6nMzx9VV^_N7n0Jqn?pnj~@bwhQ5y6bt@i|_z+pcAD4r2{a_G-~Z z`GoqS<<_UoLlm5u&9Aqs4_0S#K6KAK>ixng`iY_j|M}LjL6)<(jd|{PEOj~&R%o>U zf{)2=I()?(9KG%^DV^-FBCK#Q<%k2!O18(Lf=#uL{K{@!{B3ewY5jZ5z=>tEy;u*9 zDqYg`K6d|9NpMVe9x5(f;HmXVm7L_oo-i7E)1NmZAZe4jqCJZz^-dwB>bu>?x$z#9 zSIk6JCTn8qgE+$L`{VW8PYk<^UQ;t3;~2>k4V`Yf@-pvgyKXQEny}yM&O*~2=z~ND zwb2VCDv4%%hEYFf#k8Q%7%n==X20Z#XtL<%6!?7%qKnJ)WmVp{wak`0jHJooAgqieARV`RW|+ z;1chkC=$*$QdSF(vCni23$CGA$+z3Oc7#Crt~f78t*M7QplR@-Xl29Ehu}1FYi0GT z5D()es~L2F;8gml^eeININ2j?-k2;{vK*l`VkE{I;~gw=PwDZNDhrW6R<#PP*VAw16^!?F-(}jLv184dXEO=vGrc!4X$wCNQb5O6<)|zix=KaSn96JeRJH z9_pnNndp1#8%r2pvAfY}T_12k%`lm54x5F4weZ2WsUy<*0Q*rHm&ilX zH4Yv)BvRAU_r8^kqRU`IL7v|y`}SdXoBbwF7;OT_WJP8tHnF19@{JnY^xA0d+^5*I z^sEXK6CdNEB6&{7{uO^VVHYxmfOU;gXGD7p<51 ztqVs)jf-f+klfs4mG?OB+QkOhuYz;bHjwOg8|)sZuwlNqnTuwn$Z2QVJV(vP6luPt zJ5Xg^IRM>0`qQ2>++c7fbZ-rEErq-RI1ff1P70-Cts#97yd_=y;zA zI|cb#svyEKkG<2H0xr(x&5LCV?yb2)((X7y1O}3;Me{nFnAuz;Hi!FT9CKrwIqDRy zVjr~$391RkpjUIH)w0>Uc;E6M7Lyq9*R^{%Vq_CDymKhn#!48~GB{aABqAd-a&B59 zwJLcB$G4ZKKraOT9|tt0_KfKIu4e&_$W2tRh~;45wb9PJ;s(^7S=suj<4k?uoaW^f zIB1?&&PUtP&J~z5XP5r1j-S&a!TDtYx)sIRdu?#yveQBF#bdmz_y3~Q2zSQ|@Dn4E zda{?oY3Q84l1g)BVtBJ?l$;HsYG^ix32TTsUPXg%=nWCdrI~I#ua%}_Rot9?3P)_5 zKP-JS5#I~l_FrmvPH`nWIZCy$^?JI0UOqxM*d6Ys$-!16BtEOC<;@)+b)Ow_CjQu2 zIh{%I@{t+m;Ed4W81Z*55QC0N$4t&@>OP5F^stu1lg^9@W;)h~3sGXEL<)Fq_uQ>= zMyIglc4BJuJmvOZTiGTIktMk&(juxl@}xA)?{9C`UpDQ37-`|e&n4BJn)*hPNGgRE zT3`IYR2k@W-o?@c(#$DkpfuDg*q1C09$p#Hldt`0xqF2}6j8?gq-4f6PE+w=xJQ@y zAu-m2gtPsX8Lta1UzS}><&fEZY2QqhoYFY~U-E7%4z3h1dDj4uGG?3P6(`C{*7Mb6 zp33RxiX7I;CUP^3mj$yAiq$0er55OC6C4;)YQVqh@m?6&CLCZN=ed1HLuex= zv(z-!^R2pJDbi(C{AS+fq=(#zKB?fV4cb5lE(ymnn4MlYw?_43^&N z`28c!+O<|^hNI=y;~hDx(J^4$dXbxHg9#Ix_c6dO=AWsWrII#W^kA{th6XEw>#MmWNzFDSx@7|Dm78zlf)?(vn zRx_Gns((FfyQcE0EPi2}X(WqA+~Cbpb{z}$jMn3TiPYk{`Hf)p|3lVyhcy*6{nC32 zgdUIB?!_ZoT;kq)8vE+vrAR0tgeLQ_zxprEKXzVCDI^WA&@ z$)4SF_T-#1v$L}^znOi}iO(3DbsYU%(x84qn(TUi0ciHd^|)X@R%soX%rCOqCzX5u z#%_X@oYyUFpOMdEOqjp0d=W^2j}Zn7+Ym%%l6<@{Glx5;D7+n5O$aJ1=t@Ll57Ipd(3CkG5wZ9-U9@VDO39XDr5* zT#%{HPh#D5UdV%MdExFcgXSvKgtzA5gw>iyU3+NA50fXy(gvE;sO%6@l!Wvnv_XCb zkbwQ+9Gf{`xAFRZ-$Nrm`zw~af$-`qSz2ji`fABjd?X8ndksYHXruZ%!?j?wlU}(b z)fVrdpmPvjlnJDX^b#yd$r@wS4QSk1k@zWL08G|a<+$Hg@imh~0s}OV(74~qO2m2N zjbUo9CD*#qQU0({+FKk8XbqCe3?UN+O$Hq^`toS|tpD;<;4yftfOj|p<-`RxyO6DV zshMK)Iz_7Drkla3S-B;x9CoSZD$M-FPi9RFGlC-z5^*L-t+2y(ZQ%t%ymz$xI^>{* zQex+|CR?ySG))u>?~=i341tDB9k?ms??O({yQn2u6r*pv@G_Ov6h%>5E6)PZe-Nu5 zuIVLnww_JZQL=iJSs(52;%bJf4|<>>q1jc#@OZ#C_nNqUoLuYn^07v9mzQgT4!h`~ zSm|f9V6ZSt-9(;)I?!Us5z{tb;1BGM2g+D5dRGgd@I6-CsZWwg4qfJQp_I&wH4H78 zZfTy&nKq_;@|0M*bD>F&nw|C{QD(-mC}?wUOu@weu{f*tA}6mbCX#qMHOZPA^ygcX zM$jaDz*CMwSc+to=-rYj9?^m)Jyq6&9{;ImD0@A@_bJlHy0F(&T@2hrU}MY(cNthG z9F0eZgfoeEQJy!FeTh9xlVnwI$UpBpSwK^1N=cFPS6`aD;bm|3AG{#@(X(n2%#nAp z&z4H2(3UQkPhjW4#9tv*bPAWpSAAze`4CzxKjT+qd~oe!wQikKAcENvVRJVsmG?WE zdre!)YiNTaqnwC$v-Nk{m69Z6N{t2fmK|wWdYNXYy48&Fjho+%tJg!LrIL(z2BNII z?{n`Kz>$tU`{c2qYs5Rc3aL-xdVB~dzL+cfyfSvqAPuwp76LvvQeRXmnL3L}+sQS1 zDO6Sk<-~im3q%<&6teF)PQ0(_y0yzT_-LlWh6s0JO-jM<7Qp$lp%2v`YrlH$xTb^m zbpG8#rYc3a@%6MZ1xkU^YcS8L=JObci^nd>HZJ4Xf?tEqLPUhjYopieY{s$I(6IzI zV%>w`zT?|vL$zPh65DhkYf~OkGK17(?V<nMj`Dff)`Xs~2v3MKL8h+C(Bj}7S zhqODD<+h2~8#Ld-{zz@!^-e<2xY*ga12)R}?_xf1_FIE*yj&x2+#Vah2o-fdrb_Bk z?`!hTJgN9ROnw9>)q0@sG`!cqlj17CArieaRKs%8A1^O1bS2b5pSG%dlbV_7KI*^( z&ob?~j^ZJ9qUPUuoUAisrK0J!3ZfVKUc9%mhhO9KqipuY<9Xif!VFEtnxN-OMwETg zVT1)b9sGOLGNf9~d;KJ`To&tqH3o_&9|VO4QoKjAio*8ijumM9AL#(^ToZWaFmQSQ zO22t|QQPFuNlkM&+noKRcF_Pexr~yiS!1QO;ZgLaNqYUc*oSz#N?A~vc_KgTC0XG7 zA~BDZ)oDhuiA*x}AL#pc(^;o&9F> zl_Bh@_hTmI>@&=JwReSc{pd#(;?;c`!%yy^$)q}@9Xq|(m&NE@^goNaX0}RZqzp>t zppVLkg)TF{s`~d^fI$n$-HyH=ISmfsE~~VUEz2i6 zTbq~KB-1xLwAhmT#2a>Rl&9N>D}IExR@L^&jNX(-uURUdSRizX#eE|-hVF1)nXnH*oCiCYTS&BB zp$>(jAh)T4n9!DF6^~;glE|uUm5FLf_`aRt%(@#-kw$=HRvJYVLC-n!I;AT(q=DG8LNV3&LBn(YKA@qO-$%3mR@ z9Vp5Jju(1AxKhwYdJ3?_pqb<);=a9jH2)ele$E)1+#fG|!m@_xaraqCA0(l)cjOB0 zvFM`VDy3i3R%>R9N)n<>mPv5EbYbT^DX{mJnqlb=D!bN6clTIKya+&52^4Wgh}#N- zlG9f`q?4eoq9n>6cDQKA^Wcj{EI-z%-!MO_{P^(!%ZH3$jPP`AD#>xr*_2~;!EKp- zc)&Tn1-5|xnBzN*?VNuf!O@h6xjX5LPg0V5(jV(#NI7#0pE_e1m5WiZAATYQeS_f( zoLj7AQCLh{J({eEl~U74Ovs{3S5gc`?nOvcrAM&JnZ1uJ)R^kD_z+VxsNI2b!L7K} z4oXq`{t6a@FP_JUJ(+}RmvUR)JTmddxr@$EGub9%{L;zhNq$YqMUh8_JMkT8i+{*H z!HDsNN+KGWc9@i)ggvv>DwZDGdl-E|NkF4C&zexP3H6&+PD-oItg{J>QR4e}xsH^U z`KACc067>|QX^h2!Q>!`&3X6!@A8+fP0L62GaDw6(-+U;pza*Zp$#u=G$Y_;Lw4?OKG1z^}m+_DRfq?)dB+1Guc{o+O&>{>SBkYGy+`n!>=(&$N<+dZ%AX z%W<*y+7kBuSaL&vTd1umv(J3CFm;_5b$0l>q)r5K;MeL;_V3#v1nlxI-lB5GVW9rZnG(HLp zp$fxRIyllWhExZ21|_DitaToi_&eCvhf9K0t(YFGs-$Zmscxkf^2UX_Sl-PE&c8Q; z8d~v?RdU{t+dZNusL&0)YeE$n!z+h<#8+P{J7Gpi4h;AlmXNWihWxQ5csrw3z8Od_ zDpUP)EoxS2nSsRwo@A`N7KY`2CmbG_$~Z|XFKFkk2kKP6rW)dloD&8=k*jNGIHyXz zU^0#LSYpfVkP!3!X;U4*JK^6Wles4x#dol)*Plf$1xRUGNN{$Xq7GcSLoHxuyQ z2z^`0SoOiL2M=ia6s=>UO=jBH(;ZQH##f=bg1&rB>Ko?WK>8L_DZ_Dfp z2=Z0Qj7wxKZl4`BVcqX&vS@UXww91EdF@nUwZRR^sbg~OhV7Ve5SQuIGCd-6dA^v5Bx=W(;^E!>oq~19_q?r-Wx&&dZ_`4-{;8^aI8Wk-OM+SB z^#k&hlC7o8r!qIY!&VbmT6IaRki~P6?(8m4k_A1LO4CQ z>1h>`9qtz{^+HHX>}Qn{ASMZpidXyYz;3A=?{VatjR&-UZ~1zi>)I9T;5Q2vT1N4X z=0)rN9!j;U@D~V5tKaYF*|##)=H!Yy4&eF)N#r&?fE}+~7(dXq=klD4$|QS!RiOK3 z<=MJee4Y{XJtNCg+r3O}=B(p914Gp=$@laS_WN0k3u>FZP9NI}j=+T0?`$jh>IP~J z;Eh@ec}g0OSU!(l-xka|r+5C6r-j@I&e43YywDuJm9m6+B>2!A2xuG(ZB6>Wt$ks~ z`aM5b@Nx`c7!Sj1*GR%MRVxP3!evVk~qJ6(tZ&n@G(0dUV`}$*< za~_NDfkJLx5otyCR2R3mS}mvit0(g^=enJ=q7Oy7E6ypt){IG?eW`Hh>3vdD&TuPP zOH4I|cbfm=1@(jMVhznSrwlIMK_!rJZB~niO#g|Q#Gzc0_LZK0a8NY0sSDzc?bQE;fXi zG{)TdkPd<^wBDKDr&0tF5hXDP`3ZK70+QDnBz0{qPN()%{UX8A@uTPYMfWg{V|lhv zamS$dGDq@yk~NuL?gaY}z|mi)kS5(j4`i%kq|sbx?V4(i5b7VlaFvZFw>e39c_E$ zu88kjUDb6Eh}g1PuI+8BCS!#<<4X2U$7=2RboXj+$5?-DNIY#*X$@-X_=PJ(;# zFh(C|xDO2{vE@C6t|MX^3W}}(iv)f`Dl4&KbMGjUoS9met~!s(6w^LE+Z=nFF_fIG zMAq!^Yyqb(+qAyrfel#@Y})cALwvM+im!dTLk1O52%o_q18|P}7pYL5ltV=xx8Dz1 z?rR@rDoMPF=Sh1Bmp|&J8>==;rYh4xsd1*YxE{}G(z3LOjTkZj3X^jV30?vG`?P^EaBs! zRc{Ra(o47Ep9*q7-~S8-zHN5|;Zx?Dy<9WPh)3j` zlh$vaEy9LUOA|;5y02CgpNtG!RrhzFCPX6Q_MF=tVYqKkm);|9rFWXo$Cb+}KJqzs zFP71}H?2$9<})geX$8JPU3@m8C6*VPw#6pATxq+=$FkOBl@;-Og4pUR@s4*Yu-*v9 zj3~*B?#dqLs;QS?$xN{%r~P#qaeYs}O#{H8;ol?S z!00ad;|>`{^s4pR0pkgYGT8K+&z!ah+JaA#zLr(_JpspGJgN>zlA8ycv+Nq^K`vZ= zwEU)g=0~;8#k>if(~xV&V>m9pmq2faV$P?l-Otv;n1{i))WE%mml#+Fz+$#28UwWM zf0UTB9_l9`AOWQ2(6cd{O}Dd&-=T^PB6@4?@KX2e*TZ0GQpS_rgL>UmE7{pH@rE8% zy)s7mbDsRpoGD?`j0zs9n8iYzDqWg%HW?&=^;1Qa3G7Es@`zvR9%s;F20^eagTXs~ zuxx|zoT}$U;BZLRIdR+BtT3wjq2h(@tTL2-L6fb^ohY%-OoGl^d$-AM+~32zl5{>( zo)K*rMDZxyksqVAz$=Uotajm0=vGur?3J}(RSx02HqM*7$z+;E=>L`*A>B8I_wvKEY_IsRc#?ei zp)h~osR6rv!2AfZ$WJSSUT8BF~JBcV&JZZzwDQ9{BW9eI0MwL@iSXaK1{?j{0<>SSuLt{NNI z7UrU>Ioph6RoX6EMrGlYN=EkSEQRpA-11hd2U~1mprqGu2pw-y=+uks%r?Ytd55oW zcVnKK=h0r&!HEUgi(yATpG1=cxrKW=x_$oKW|Vqp>-086=54Hw-qU*?=6RlV;+v!H zbk_DN-I3Dlv3ykoBJzWoch3{wUfUoU(l=B4Mcf4w76wKHhh%Ph*OAbqPsCmFXrqeO zTvH+QV3yggte~}CJP9rjD)`2CK{RBk*fsWtoA#uKz1GOf)#d0%;YoUm9gd-QH8t@oWFaP~XJ~e0*pwB4VpX&ccYE7Ok48mfukz zrhFwl@8XlAk~qy>n`8T)$|GN+V(ds!<>jP8u8P?kBgy&n+JYy(GP3T@6#LSPx?MUZ zbOl_UmRL2z34X2qSec7;;$1XFvVS76Iph+VTUfy>jjiQ%+x5W2^r)$%)|uP5Zb`Wp zFf-YbIa~#XK88B_!3c+%wx$BlTe0Gov_Tp4XI)~GpG6{Ph!W`&J6a)p_&Jy%i+ow? z;#Sx8K5>6$A5`m^f~IW5F=l>?Pkw%{dA!T z;ATVlNCmj9KoBmqTw$ne2zz+wvV-GuRFbmTPh0uyQ7n_PZq46?Qw`(haKtz2zj*mH zitgWeX%ARlDUMZ7DF(#)5IhjKE+$8P-5Ur*4U0t>2Yqng8NUyVzDmZ@92u(?KX)N8?HS^i?tMFt;hH)tHo}S-Dd$EKJ;McbO93hj}K`xKP_p6`#_FYZF+y^s~ z!*Y3&_DE{+(7Mak=+ilSB?`_lZqY8ZDzQhjOrxp-A&-SoM_}(qEp2=r2K~F9>`%U6 zvsua1l98CYUc!C2LP4qv4-;PbE4-=H#sccLXd!zSeJ1bf-}!fp4e8>zx+%Po9$nV2 z5|wJ@BO62KGg?{3Mj5O7ODI^#QIR3#Q=EGHFIwh%CFvB)KQ#KlW$mSh?8Xg!7Ch$` z6Gq7EQYm6Pza;V}ddqlQlK8qlh`woQo&xUj27mb{m@iwj+GqJU@ z>-^Ih3!|mv#MxiQr1943{*H>TQe$|X^jFBJpD!Pd^sSo&vC($MYF3fU)s5k#WS$OV zE12XdqUj|?5e(EmOa)t(YlcB|(|PfnNK4Tam`JCncxlmT0;;ONq;y(vMm7k)F{ZvmnOFM~J{0SNL`cr&R4-aUu22k!{o< zr{sz67v?+D31bzWEQADgZ3$wbEIi%eXU(&Zl9KK3Fh)R4xR$PYT^ji%yxa zT~2pkecmy3U*GGlUqQBI`ASrVT2g`Tgbn*6;Cd5&Cf|;Tp(Yz3At@;Zw>z(b7f08O zaPY#~nP44@CgY<+d7X!CP5^f#+iwxyouD(10X68+v)G6RPGElGU56DGOAraM+<;*M zF|dCj)m`i1JLxpWpfnme#EYg^f#*Q;vjHt;UWoV4nrcSh)WOd|R;eB&WmG)5%?-MW zQI0V6E^&_s?HL5U)%l|_oOFl?owGa7*sM$SDUOY=BN0UPD6c!loIr;F$}57N=-h!< zp-l#HQShbQcMGFjEG5bOQla~0@op!jpj?0I1Gy}qIV*>d7o~}j~(Gud4FY2>)w%OxMX==>RhuS zOutU%aK!^j$-u?*^Do{Wc3X$VclpkA2EG$l^|(fOiSrTMNkI5 z37tkuT`jBkYLf%b5PEq}+9;<4F$xXWF1qgyJEyDKwe@pzH8BDA$-nw}A5UnEV`)r% z0`TXkNvWAGWRbZ;hs_CGy=g+i0yCRfUi4~0?yA9Z&DWf680gT3&2;bX+sdn-cle*s z>QpP^R7z*dUZuj84=3(Oho1x60b)T|j>%nztLKQ{*s)Qitcf0n!O#+r(5@4&^Zpj^ z@M{3{%~uja;$1(KfRFnybK2;=Q$rZRdCzcVfFaB#Ens0s#nQEWz$coEnA9(W0JhYj z+=m5JvNkgL!rfiBELfVR;S1uw0|9rXJ!0q*p`P&A$YQX$)F3QcKt>ke!;~X>;}bB!I;w^ zT+ha^&1{?|*8LQz1rsdS$uDvm7hi&u@i}?QQ9QRTfyBGsC~kS&(>6-99!Z>4q_wa< ztEQ#C&$Fjt|6|x?h^HRI6I6qA^j&c|!%TD}k^0?dagrOu)S^b60V6qo-rc9aPWx$g z&nzagB5h(xdYu}0-ea$+k3*Qd!Nk_$U~A=h_mwL)IzMg8<~u4*`SH&#ne=-R4s1?xLygC2 zciGdr*mT&PZBTKrrQ&d9!Ci;X;+#y%{waaR%0jz->!vPPy`uMOfoHAf>~ziP%9J}| z-V*>K5CZ19?Y^soK}ChzkhN|*141g50|Nz+xFQHwgGH8*h$5FG9QR-r6Q_vX(Neio zATAn8b|`afI0G=scFA&9Tdd81&7e5%|L|ZMS9G}X*8aPqKC)8@D`A#pst#2a?O7%x zKaRmYw%q2*{CT6?#4Cw;`K8~MI4oU|(orKe?JmPm?H`s8PW(f)fAOZ1&t;aR0T#S}iwcGc}KnVr5%ik?$ zlIITCn18QxzHO3xYQjm3t7i~gH(kENy>X&3G79_|rVON$vcXx1(&gFn?uT{=k5 z?Jm*f8$?E8R;;jCuTyMEQnn;6FVn{hxv5uU?Dn?k-!0M6OrieUQr78Ai9L5b@YARJ zvQvhAAcmP(H&{-QK|LmPFOtfygYC3$nOZ9Z;_h=2dk5qXtZ#YibGifNH;lB>_2h8y zOUm@%v5F8*ui-^b71^>^8T0F6EdllEJz}|H(!&W!fwb|;d}V0jQQO4YAQKQw9~R@( zA=51RV|UahF{Ji>jZYe~=vQjN7|&8LQv9Lz>|5^$`4V#qY0V~PxzuN#BP0CkK_YSE z-H#r&1Om^;-8a=mv{|&Jkb7k0%}Ei(enavbcKaUs5cEElj>RbN97 zn&o=_G-y$v@p(x&-H=TGvUod`B8nA*4GBE{VQ;jX&36*ll;@N^j<+!0E^^1JY)GFWpgZ#8nyWE;A);i3LVe6!!S# zQ;0G8s!U4&B8{!&Q3yY(KAtrd+Y`APPt{$2N%V)VMZJ&jlmnfplII+bq7qPDn(wG8 z$ScYXs(uAH`;}{pozq)+W~Qwb(rNHeFzKcGYvsSB>d^ivoBhz5a{cF=`<}A#9U8%N zzNGX6=zYOjXgmJq3V&Fx%A>9A8xNR!-dzjy-=`*yJgz4!UT7XIQHKo-l<q3*I_Vqfy`2UUgNqK97ha3I{YAmU@&d!4 zsK^vH9k7S^%FE5&XEEQ>kyJts6N)!k14#2cg+2OAe} zvqpy##N;UztVG9R#>7+0?L7&Ascp@s+WIjZYdN^ zjOpW5#cl?H|J#ONxbs^}5odv7-B+)1CpN@!yy*~t;~Y|gwaYVvOj6-VDD2s1SQZ*Rw;>;;lcq~EdMY0|_TmPI+&!e|+#V{Nq`llK1;lT>SWQ^C>RUK>KAl%zEwW_t{xv=T*kP zDD$d4))y{M?#RbST^BvQ}xQu!p3lI|h$G>}(XW>~5-lg~((P*mysY z5bAud*bgvOrF%GiH$7Ra@~AxKwS8w_(&8t(G%9dmrqm^U+X z48}q{OM?r}Cw&>E0ER`PxCc0%!Hvn$&*||6XN}!gF%N%?jOI=pDVpOXEKGmxbCr${ zbQc?$to!j^Yb=cz$1trk2stT!wng>>c(CcPpF{e}E?k;kUA6`4<{6H$a?wGK_NHoN zQk?KMKAXVk2LM!P0Q~$ShOXL|^8Ua)XFjP5E#QM0X2RoZh6| zl5=O_?iXWH@pHFjtX@sqK$?N#eDRJHvTj11ZiCL-*kN=D8;qlSH%`V`{bTA;98;^D z1>zq3A8V{Lvz#?{iT{rV9Iq$~b^U2QjfrEzU5R6mfG?ca@)rIn(TX6L^<1FuJ-P`1 zSxvf?C|pabPuUg@PEtbRQ$`9*Cv@@ppJ{BquoDzyCpzZ-=)884qqE^qB5fr%zd zWISZth-TF#g?MO)&3Z5#X0_R>A~D}v8MFY1&c&g~0_QuteoW*BG~>c`d(S6wtttQF z=^ah6gs`%@cd1(zjny5}*V>uBQ3+I&n{^N3a62Y{8h` zaqLvcivsksB?)F%qP0w$X-hRwRJUN}cBaaETpnLZZn(3PGKl$^pqnieAHw;bPVw_@ zuG5DV4bJTs__0E;37mldQO(NZ@{f5nOg9HM2RxYV+%4?-4k?|U`~z9WGm3^6R&QO; z**uKfMB_^kI{S8Nzjyt!6i4PVG36$C{!?@00wTAop4&t+f2;}!O!u>vNCb?{Z=Q(k z@tOAqE+9KWV71FH1qr9X<(A3RvJ0Jf_4~6j*Y3DXKSaIX4|5FBuZnqi6v|T-eOoGo zFAgm-cM3emfNw3LM}c54aX(n)vsGf-BWHtua&V zZHH3+M1Cmtz(`l%j_t44pgVa9(Cc}JpP@fH=`CpYcQ-Paboai+opnjdQa-~;zd7yW z_HR=4Y8etfpqS83UNPJq3Seyxa-Gkmt@fH&wiDIR`s`nbin8+pJNuV$q%-GLsqq@_)28WHv-tKQmxV1k0cx2d z=P_+{i`IUm2N%iF8VFd)|s$Vdr_yQVJ zdM>k;&-6X~Iy)p*V!EGaTs55R#~ypbp}b9YNjew#?{X=6B>6@gL-o5s0s4D@5~8?OBr>ecroAf% zI_jRU(stW>dXZLe=~#8=vw^bmpVQrq3mjD-;B&M6y--AGIdS{C>!y&F0ioGrE>g&_ z!0q5#7_>KUCRY^HgNL{}U*}dH5UrpzYpR~1{YdNyU;K$CjQ$QnK<<5q1|_G6M- zSB0fS|3Uej$++U)KmZ@in^dwP?)g_*#~vnNYn7=tTQ67qU_iL(R%4n7u7rsF+`OJ= zziO=tSdtfV_)m%BNjV&suKb_sTL(6)Q5>2h>EBiV&Qe$-alN{~xa;>A;SfnLx+tuF zyQhKwE?x;#7T)LY^PMxHg5}3e5S^itVD^^`W3=@0)&&e>oM3DS5zCqoL?q5yIlh>} z6`$yhmmSEw*M&<$kX0rpcWknkLu#%d-RKcVIZumb4UiEHifyB_`H7Ht^RP|XugCs3 z`<;u_aP;YsZ?eRDp*EuQ{RRK004 z4tbQ=eu0wGD%rG9%^TdGYd)hvcx?>A`J5iTS?Uu+FZev%Yw!iQ)u`3Cmw&_(E{knb z`PB`~gucC7Lq_Is^b4!;k0v%Ly^&>5($l{2-WrcQ z2CmIx=*GOOalR~n;7S6!kuceWHpbX1i4-{;e!kI!78!J#SU=XicQ);stQFgahk6Y`uIQ~I3Pj+0v6ZXh&FySVa86%5^X-|cc9D3# zDHJ9#ZcKh%9}fKwNs2jR2s#|od#nNw$sL~K_E(ZNp#=!1YT;80#t>YZDO{?H|27R8 zT5bOC*8YWY8`SKI@QI09WRd=jJ6x>9^xB2KliTHrtk%L%E;;bPNN7l|qe<+s{skFi zHzrjewl0gOh*8P4!@_ZWjH1ce^eb??vwFQK;*Cb4h(UxS?!z($ERIwE?7@9@Vm|{M zHQXA1;&MqrjYx#+CY<->Mfr<&1%GF!#Z`|QEhmk*LR!FoEaFFnnv9h|*2Pye|0UrL zB4*ptsI#M+dR&UWfE>{MclmVoC3kvO^1XCF7^w|m60CoSCob1yHzrzWM_lMR&#i@j zTGU*KAVU5X9{!iynRUU~afS4&DN1iEq94PPgJ&X7evI3Lbu5zW21Y_D_F_#vA_q!O zOsy5m&Zk}J6gtuHykd3~5TbXpzv0>(+b2dN@UjIkP7-*NW|4D;w3b z*Kt@s{7R^FJ7FWFmx<3IJDAkn*u!_*_D0C*Ya+Sx=aki=+G5VakYqv{g2cag)E|Yd zjnZ|#;pfLk7aM2YNsj4uEI=d2NqH3SG2{_U$OD?Ve}q^ITpJI-qT=#IP%Q%g_KazAIiHmoSXK8XwfC%`8ZXn0&Sh3Ajrh z#odRWqsuT^UP^m&&FM|)=3*EU3S3@r@+2po2Y)GJKU|Ax)b@PuGpLZg?N=ki>NPG}zTOk42-w0iqMVOqp* zn=HuF4U{%`2;YUvtM`3g5*>)dg)iJ;)7vJ4gtz-$c`x<4EMy{g$nIVAMfy~NT6_ww zb%ny;3TLZz*~{WbO|*PQSL{9(piRx7mYox0+ce{u%ehXiP`-}wlE?i0@Kq0?g$(sr z9zOWIBi@`8$|`OvYg>x+FrGXpvO8QRiic~cePGCW&*jBq0ecgO*N6ksPWt0B({Wkk zSvwHaaPMXr^ro-OuZNWuAO@v^I%`7lu5dGnb(?y0gDU5>Uv62xvu}}ArQxg;y%GV9 z1C>;kZ_co5U&8B}!YO-A*b^#J#}y4t(tB)nNqbq-2p>4wF~Kcdui7Iuh}uibukFh{ zK|1=B&4MVrv?;W5=W`LOlA^0Gu}64jsTDdomB4GCaATXBJSVoY3xq`#ZJN}B0+V>m z4NUDE?M(tGog1$F(Yh`Mj5k{VB*ZTr>J4B3=G-Z}?53_~v{t(g9DfiY-_3JR0t=8l zljgmcr_7HHk-c9fP<)oiD)=GuQ_)XitQwp^s-;ta@>@`g{>nUX$SB3}+y=M&dk^e< z&lsX?dICfAZrcQpHhoI&FBNj+tKKE3m)&T1qqhQc!S^?xKasDb=K03LC#Ggt`Hi@* zk-Ho3hkGuSPTeD9+1l9D82p@b6(=K*C6F&1!`7d=ETj!bJ=Xl-Gyv)WXfu6p8`f62 z`KiD$P9Gj7J6m$R@qeT42-jx$)G49QIULVdJ$9FsC9uIZi?bm<=0yQ4%P?EB2Lmpr z0}QbHA*cA*-3{9&Hdh`;K{gJ6dk*CU-dV%i!=Os|x|;7W?JA3!8Z~8b*UGt=aIux= zh6gNrv~me@TLGR(XC^Z*ras@XSNn*Py-!56pT!+T9=7`MPI841UiBERpr#u4;O|`SNW({UwOXHN3X2AG z;;FjTOMf2sEgT-m9Wf%t(a+3sOpKUDGHae~25>)!ASGO@k=(C3 z5sSekiaKx5x-KU)?%#VU_?q?Q^#I`a(jOG*zQrz&fB2mDB~{1cD+O}Ml(uQ@AK&)0 z9{ByVGiphb)V!@f9*0ZFdgO)t*YU!2!ufa72A`p)^ZKYl@aClB1RdWn^n1;W(&sr$1w zfIfxdF1YvmB%Yb8QCuA(7l>!BE!*BfpBj&sk564t2vx0~VTBjoQW6IeYHYw)eX~9$ zm{aTqh?dML#^Ai{V3hC1TYM@eF_8^b>zrA+4y>S;{#Gn78+?zF}w zUJ*9g-MEY)1s#s9fBp=0&^Et+^3m8>0>EB|&KWae7R1Ya-kolvsB35&dtE8>oz(#> zlIBF_E|BR=fn}L=;#Yaz^d8y}_2&+t5P&4K%WdtS6kW{Vza9wYm%|C^doh(BfV@a# z4!hy(!ro!>rmfY+xpnW(e`M-^`K@U$P~;^u4rhO&!&n2Aw`#HdKHT`Kf7b`gJ&LHH zS14cD2HT0pROV$e*=H{ewzG?CqsL2DArO{*{bVnywtHjImN-CkAF;*vcUsA<4P-GiECHblsNm!#$#0lyBO|!e=(B# zufodxjf^CK)pF0EvVtPH`hJlfYhHzckTd*CFTM+sIVQD$>S>b{$*QatEmqDVRP8z! zR0`{VS?~u#vCYaHCpysKLYCs5H(^L-z=siE56QWW$4TvZij$EFMyP$Mf`?Z${U>sZ z@eq!8W1?Mx?$7xGKHPB~GKgPVw6IZtWROT>pkG&Q zNjNAaz%$>|vL0P3i$1T;AAdwd{cEYY1&Pj?mjd`r)XK3ELW~+p=tLddh!aF{PWF9J!?-KHs_wL%)cd9c6f_br@L zE4QM1Hw!G&K!-~!T~+;nN)8b>s7(W|iE!Wq;}(h&OC_$q&O58->No;{h_57CB8K&f z*s8ABNk@qPOIdj#Ib3cX>mp)T41h1Nj$I84-_fCr>p>+!s=FOwd6^e$$qW7$lSz`? ze-~s8w0Wu`-?dE6oAa!jcm=6Ca0^x9g1hAybktSNum!#R>vYo%jOvlhFF~Wl-o|3v z=EB;h1}+ribRPcj>^j%)&nAhu4!Z15gtF<~)Y%MVYj~h;h7f@TS6p(N)hCn$Ec@g2 zg=B7cGg17&QxoGP5i3#2HX9G3{2&s60?JiwTLQ7^m%P6VhVFnsBHq(>UhW-Uh2(gd zNlX^#?NR|$j$5!G4%QLDCPehgWvryjPl%u|bDiKce z7K@c9GX?JWQD6b-);c~obj@XmeK~OfFCv|gU4QbVvhYT3bBqjF?}$q@Ac`Y1<9Mre zuUk`-@X=1weljk1@qZ})KMor&a4bR5WG*s9Y;-xzmlf3rt()YMroL;m{rR(?PQ2SY z|46C+=UzZ!Z)srU3PXwlp`VsiA&DzzROr6nBDGK#5pEL(Vo574KVq)t`m8JiOBVl! zNOxZ&Mw}s}-iD&V8<8kjRW0n=S%okSd}HOnlk4ejm?jmFCuDCdXlv`LzVv344j28f zD4Bj^)ho5UuGr3O0Ev5BU@v_(QAX9U)1|H#%NgMLz&-mJM_YT12Y<=orhn-`6-A;_ z$do{&6oZMF@~PXNXa+K5<~bzA1)ahfIIrvHh9ZCGu{xI95u_($ z9Y4rfYjByhHmwrOh-0HMMwjChQhF#p0w%FZRGdGo*AHg>@v8a^2am`nUmv0{YNB-n z)*~X@D0>Jb>>kkGOP`{r%rKQUtq2v{mFt0SvKo1J78^(9?0&4&G(@{*DCJMXH4`wyW=x z^FVRlqQ~(uWL(^;-pvAQ?uPk^1H!EkQ|$$%J;OJH|AY!PZtGda31-$R9-eYvA#9ID}mm*f5 zf}O+pxp=06tKL5$yPj;al3*p#@Ht^>w#Z@fsg&uzJ1POSdR;+hwQ+$;g9t8k8i+XQ zlIzqj*hK7O(dwDfCc6&&YRUpOv>= zKJSs=(Gi*Kj1b9LGm2-{ouAG&v;5o!>|Mo6!mcH+k=A(cGsqvZiA#E2&x66&?*n9s zM%SXN+LNsr;wTMlfbxR!YyCKNp#v2^XF!ERLF0zza>@F0H?IE1;1|J)Z-9PI&Z&1= zGZidG3)j8Tk>LtvXtWmNPkEYEPMP_%@fItYNrFngZttjC;~PH%#=D4N=IoX+PfCz_ zqK7DfIHO)b_!!#-Kw{mmOMa!0598ZyWXj%TFBz|_%li0J_Hi%oXs-kT5VvnY)4yr! z2~@E~B(na|quPfEf*8LhGpZ=hKBw~e3Botc&|tP8FNz@G|ElZS3S~++i7Yu!}9Z@FEZU-SkoI?(S>-Frq zhbb8tBXa#gq!o6McF!tv*Al)E12qD%gdR}>G1|l~5rJNX9(0%+6vu#~A&PAm)r6bN zp~&v>CheO$(V=%Zdzn4gKlT-g^hXPrNb=y?Q#E%Udh5m=a--;#MvjLjx_VSK{}t5| z<+{3~I%1yFrBQ_S3EX2{fs7qoE>yc+!kh}$K!eqBRIL^j8Vr$#POExk;gkteGZ2i)f>av zLUUhicp)}?xGxVM;a8qgiLh-9Y5oMOGLO8W5TM#sc7}>gmq=Es4@jf`t6s~BR^B$_ z2EDDkZ5C9esTgvnOPkB{!0=RE)4rX`ZmkVmQ)_|26Vo|m)8fky?C=Si@Fv%PpN~Ts z8cxLu6l^);lgK3B*0WYk4t$v$iu+;$I$BQ*Hu6t{N74=V#xY`De5PH&ZTBw!5GKDP zDTZ?Jy`Jt#E%>kPHT$Y)bL|Y0>~Vbjgt1I!fc$%de_c^6svE7ZX0UsXYvo(Hrwo~yQ!z2Q;1C00o1Fj^^wa~RJM^%Ppx|)N zoc*VI*|EMDk)i8B=MI?Z5<#bKCn`)Y+rLwPtF6oP8ws)G!LTy);C%mNsbTE-B}!tm zg+ePbpB|j~gzr$bPMdyz(?b-g?d3}v@8_u!7YZeFe>-+Bfkf;drk^f-HM}K_e-C6&Z^R6Q? zFTmjbhWG)2PEGA1@4g}qd7_T@rI-1m>{70#(_Hv%6C$cYpL*oj<<$!VA?kyBgOgFA zxRNVIrw(Oby165g$vnH}V*aBYmh63`VBZ$-O9eB^syy@@NqA^jkxeja9XS`hZN5HL z4vVKNp%#yDD`_TMgU70K9IBA{Rg{`oy}Yl(Jm(654(#7a_rybCM=J2i@80r?_#Ar| zgGS;GX7vwg%B^ak_VSx^b_%kE@HYoT!2gyla%B)FzOM2ML)5Rif2z%t;f5-_Z(doC z{Ym?V7i0X|3G(zTE#L(@8*~>N${#x6Pd7Pw1^k{Eq^FBC2{Lj-eV$|DbNfBUWXPcj z$X(*HzTEtwA#_CWIv$|-WK!WYE z#$>BElf@UFZPNQy?#ELhTCT>&OGn-o)cey7BU-A&?EnR_6a@(sQt0CT2QW~m)^BUM zBzbx{i+mT@{6`xKqZ(Q}ogyl~>^H7W?BcH3x!dkbdoyP}sr|dRh1TYa7Y{%891Sj# zqs~NSfPStd1S>YkZeESoy(;FV5piVHbm(l0$T+m~V3j6@@1l;?tz=YSHS)Eazb{a% z*MnK~o;_8Fa3#GB$y@A+zl-+EZ!|FpIq}O~Lo?6AjV5kA9yt`lEij9;!6YX#ki3zF zbuY^ko|Z%z1h^C~CQW8#;(T|kCuhOW1x^{(e$=#Lsc%17^CcAb`DE!WGX^(svO(l1 zBDUk$s{7u5F4601sKBcBM0lcTdkfx7c_*c^WSa`^Ci>-qozu;{e-V7%5`?k>|QJXoj744y{ zRbY$wwhQ*Yv9V;KW2S|{DT=U^GC9#J&6dXHL=i%nAxV!{kP-M+RaP9@GCH8XNRudf zMcF7X%}+;U+4k`AU+g-0vtD+4O6cihm>STNs59K3I(``*n&U89LNr5cdijj|B!2~` zBf-y%P{I>i6@PhWooVb~sZ?zmper|9>kSSTIYV8O%a4E9E+mGgB3Z?|?DdsplZv+l z79BJuA^nnH5pC-2-DC&nk{xxz8Xi{|BOP(V7>k`wmV#{2Jxgm@r1Dqs8zM~3Qn%fH zXBTr!&y5*aE?AN`6uc(JoI!dkb&ETZz3k737B5D6!AN$Fi<;dY?Y$~ag|>Ek5(KcC z%}##k6z|Mhectu?Bwcsfz@Jx^2xy&Qjp8PUer7FLk_rcAL*?uYfo2r98{#2W9hr>aV5c~)xwr-)&I+V=yPL`?^=Ki^0&xC z$^}PB$_eE{^~r-X(?z*wWn=Yq_z(Fd&;O(ZI}&3t5qX6}?V6bdl#0I&&@0*JBCL+h z7k(JZ$$FZ5b1iA?@GlznojTa;(d*9;OB&5R@j2nO4hp`N&pQYv#rwMce(NXDcv^ijL7@$Jl(IOuc@@tlTP?kM-QSG`blA1NMDMw zW82gCs}i<9ji|=uSXk%;E4o+^yv=LulOQJaZOVGvz{x+33rj_8fL7w=(JQM@~TrIeWlcoZW)!CNc zu<79@wT7p*AI?86iLTY)ZFG!nok1d4f`z~QKKylFsFUM7L)czAIzL?4+>0^vKTW52 zIEB2s*1TPyVME4VzWz23LE4uPdujO8RozU(JtBn{vE(y*xihYlb4hjzFP{c^B=pN~ z0Q-GBq0~iQV|Fc!gk^e#CX=ted2coH)@K?hK}d1h)IcwLL~f>_YZXh2$=$U$GS|X! z<>h3RrBHQo{Jh}my*6@2vmSV7Mvalj647lx_4B1{A+O(o#!yW;zD7x;;Oc#7fz354 zSjEbj@8J54%qJ_+-(S;GDKhO=i7*vDf@DDacP(8}hs%`lOZ5`Eu26YJ7M5*i062MO zg|FY7s3eM#AWLKea5`Xs<4!4yF8}U84V~7v$pG(s%b{!iwR@{S5EFq)M67$#Yj%JS zD=e`XzVT=ElruFt<9XrGaPGMNnScE-8thkU`m6Q2th8CTIt%2Uj@Z8L>@tr(F3Ih` zuqREuWl{-$+-thBtTv2y$f=*T8~jE&w!zFUBW6G1VRDq*=8-s}t#a$mtK;37I84LU zt=&%uc6ep%cFye_2c9FL>^0F+kS5}whS8zLj^+`t9YjmsYL3D7d6+Y2i=~2s$6=;0gJnGYI>*FrHk#J>Fou!)T?sFp7J*vNAa(L8G+Pb zn#wrG5HY?f?LS7{{vEa50m&-0(l}mMiJxoz%k}H$L z+LS<4E2e6#yF5PR$fbTSzp-94qr{WYX!ZD~4G(yQ{9%`E6w@`Iq6i6fq^z?uffOFY&jHNfR=ZAYpoSt-OfW|ME&V95I!#UmKsnOR77{!mIDw zHilJAzTnpj$bjE>G`dVH&RR#cpkD_xvc*-@=5^%v)~2etfu7i-y?j48WO~2ucoig1 zutNYxspSDAktWV^fq+nlLIj22Z#T5;T>nuK5-H>5l2#8QmjB-?k7|LYP?KkHm2q7 zw>Ku2y=Au^$ojHWb?hp^=rlb2IBeIZRz0t99m*AyvU1Cms}a)EPfiUP4K=Q80Io!sfwC~9(hRK+EIocX81Qd; zA{ha!mqQ_mOro^Cl|@!OIOGImUiZ7VpXpoktqiGHxBoqx|zY~X(KEh@a=uoiK}QJv=&hp{-6C!?%2>wV); zla{}?fy5z7WDJsjDOKZPk{+uOf({3+U4o93tVhxvn{ zq!fUe1S#<8cVJB@NE86D5OE(vwLCR#|JTu18?>@cSLU=ft&97W=k_m5qZ`%0rNQ`7 zzDr`BZwH#SX7n0bFpYc5T}Li{PC36oHPA=1E}k3{Skz_qC$Vn6`3-sK7KyjkxcgoC z9>^(3=r=0$3g9x~k|7|WiKN^?f+LQRY7KbR`&$mOH%bk%Z;4dA;y_wT0K5W8j)cPy Vgey)B5^kJ5=!WhAX1d7BossFAWAP05J*nI07?}Cgx*AS0TDG60Ra(F=|Tbs zE=_ERqS$tou2?8`WtCmq>h5yqB-ZzP%lCV~-@X6bJ$NQF&y+Ls%rj4$85buPry&`t zldBViLZcuT@CPl<;C4Btu{J}HyE{aJAV?GvLCHZvAcg{e5K0Nc^5YN`j8gs*k3{Kw zDuV`P3?UFgD&S2(QTTB@h!^f+L6}c<>%s302=_-O1g(_${A(K;8yu$Q84;Tln-~!r zr)EzxR`X%SgvO>OLKHID!jf!eNikOg5sHZ=*#tBJ300%M_N^NIxqUQLE%Y^x6a(juV$9NJ~ga6BOm;3G(uavJ(8~(~ltW zk0DA@TwGF0QbtNj1}`Ngg+~G@yr7Eg|E7V(en?gnss{K%X+UUMl#ncH@h%uPZt((Y zE$Af{#eYDDkw*v+3I;1IA}WRx2juX5CJI6eea@7DP#BaD8iU4)2#aEcB#c0&tPn5^f1Htg3QbIy+>&;91Kvb26@XW50(2d^8t2FD)0VQfyxEpP0;IR5CZnX^xL>aP7q zdoE2pekTi|(V({&exF2yu_pX3s2j>*Ko8~{i2JjjYL!D}%vV-yNGNgG_-yMbsS|rb*6d%SA^kh| zx5P-jqRnYL`{%?J-}cIdcv|?Gzum|*RTT+&R8xv(zcBnoT2k!~PNzg7_p#+>_u7Fe zt)WL@F{6K8!yL*O^)4{L8m5-6SOxu>yU_}-yisJg4scW0R+NVyH#~If8&-##iLhFVK@4nd}K7^#j=1mot$Nu|_;~X?>b6UP!jB76lv=}c zad%e8&N{AL9KJ~0*T`f$azY=8*uH`XA^dRBRQt3I`Z`FLH<#lGgX3ITeuD?Ka1SnStt|0)zcvNroh zi|ZOvxmxZM7tP}*90vjm*J77?vyX7tIX|RV#93bP7OzbbYYym6*{kJgtCTSot}1*g zE|1nVb-&M%xGq&kY5M0M@PS$x@=i_6Ba0&!5mGn^2OqF-D=Bw7M8R#)DzVki*LkDX zz4gkIzHKIZQ-wGC=uMocT3&MZ+~tUf)}N&?A{lGMj(et8DsQ;$yp4L|DY<8F<d|QJ%Y`^vGkPT*GaZ9w_^DX) z4~wH0N!l&|zYJ|k!U1i)1D4v7L20XIJ!!aS+j5mGoIk2(E)zAv21M}`a&tdAY&}UG z4nsd$B09f@nClv^_jH;$UZCV0-1#a!jkWBq#d7TSQ=~i76IPp+DKsc*pBZV=w5tp) zS4=*)x!?W=jY+ibZ>l$R8?NOR%U-JNT3$Ee^3Z{5PrvsRS|0!Svio>f-;vWoYN`Vg z@&nSR2UKhdojJyhzipaMI!wq_b*e1-(f6HkmSvhQEcX~KmLp25z1i42^>$U7lHX^5@bl!xR3_De) zE<(Yqb>U0ryJ}i*-jo;LBqQ8za_Zf0bTStW$tzvc&tQiQD^J&z_?eK`^ru|BPw2?o zSRmr7r1wY4KDo{XTbzZ?iez`PG@Dlbaea1b#qx8a8}8ATm>jPd7!?sdebzw^-IW$I zyk#Fo-SoinqLmo+WSh)i)e7x;JnGpqYwMlK87J+mlg?$;ZOz$3+uR;P_bn=m9-+Ip z*J`JUuA>#=@8DO+(H6%q5jn+fT}t^hg4U3BkX25iZtT$!t5m5inmhNp$862LcL^Rz z`mh{2X?vFvrrvo+VfD++M^1?($1azwN84r|wdY01IG~Tsoj*g>@GfleR=%V<*0;3B zc3_`#rek2%BYJ2(C3EIt)2eD$oja;_<+~i@MqUeb=Ik&%ti>yA+fLO!b@(Z>S<=L% z#DuYQgHVOKNwAV^jvCd*WuTEN<6Szi1btN9{8=M)N47e4apJNYy}Lw9%!^szSVK9n z)AqRQ2hE&!v+QLzSDvsN&O@~&&s6sxe%{<)U(P-tesG|9{`CAVA?Rs3Cu(YP)8mFjzF6+XJYQ?ZNt39}W zSz?`~*OQK_i#5oYt9jQ?*E?r3Q*GUPR^F+R*-zB2YQU)tl;D0?ykW4)y&QdSy=GbZ zS>Bntbp?TGNA5Ar%@9Lz{YA=Sox==$gG7o@M}8|^KKyda+bp@h zsiz@-6;1qDw)uuqNxZ@#Rw7S2 zMUFeAaP9sq6zX5u*u8YbW_SF(eyXw=!(|WFM1QXv`=)t|UEr^FMcP=+#Gn-?=|09X z*|t)Su2Zv(TI%C=dM@rniOT7u^|hHY^sF4Y%UV;}-r4(I)oAtm7jG@jODlX;1&s{I zkhz_!J4TzYhsf~5ZvrGwX#P{4KrurUT0}uZ@$0SN=Sh97vNjVEv?$4kA&TBIe#xcZ zr-gpwr^Wao2vGc5KxsuD9A5!MVrYI3-XKx%-Bp`6gPdp(0#y?{s85iZ1C?JO6h52@ z!p~(8jTQyze}(Ydd=JtP6bIDFfBFbLL9+j8*5dyqkB_5U}Z$d#)Knr^jAn&|B{HJj55ydwOBtHU>Ki-ae{ zCdYjT5{^w^g|lM9Vv^aQj)Wr(X?;B(2GWv2$w^@0#)KsVC543o07Tys7xt+zPEZ(u zAUUq=a5eDr|MvKWk`tooj=ps8sZYp7kpDfzJuy7&JBV;lbP_!%{5zObNEoOWmX_q2 z=t6gQ3yzJAMj90T4F0aLSVU|>x@|No{4=Jc1%r3_3u%<)=TM;O*K_h=G zA}J}(a@DGsM1vq?%fuigmc1%1C~lRZ0eKa)dTm-r=~)K;firm^GLVM#%1Y3%5jM9Va54SwU6 zAdY}nX{hmwBt=|+zc)Qk-%1{D1evZ;}piIIVk3B{CRtfvNcY|K}Y z%~lza^$pD}4Jnp}=4ziF4e-5$(9M?K4o;uG22$1S%9j zXkluqPcbm$_t)Ls(lsVADJUi+%+uNk-`LbKOv+uIc}-uE38F6#d_|flR$6XaamZ2w7~_8el+t zpf5s#(a8d!8JI3Id6gj&e#+nQAM(Fu!!ay?a>}QA9^gAEVGgYDutWrEVyZ_mF$1qT zcrEk*i_xQ)8G{$V%#HO-jL6_M1aSa2H`1e6nCcmk4fTu+&B1G-XF>t55e2|NJ7#3? zg0f~v+63f-*T~q2VrA+`HZwFPBV5PS$(HPBZ0_h}L@_aRAX5yDO&mbi5W2SXWTk~g z`#P||R3!3oVPg1Q)`owY#itq?V9kI!0P^@PeLqMeQ*%>eJ!7(kDVZOF?wc7>1R;eF z5rjqnZel1XW2}eNGUJC}s9+cX0zv>WHa8*jLoiGb2ZID5K#Q3XKpGN)@*uQ8LUT|O zgvhsy01A;1`HB%hEfRvdAmrBth&47e2DwNGdJ94U#Ec&|M?wqGPZ09USeSsg83lox zfk^-%m?~pK3(zJKB6Tgyk-8SP0Hzl?<;KaR9!!EepN0{Nl^zfCYldd3v8 zp{X92PCY;ZdZv12dggi-dH^+shI)n+JwqcsLt{NKy`YexnI5183MdOG1P}P?06MTDJCMyN4qz$`DRw5HT}KCVGTDJ*X5!%JNO7=rL_`jsi(9&|5&<*Y@=1u% z!s0*0qFHKu#%&oCB3KR~2-^z_)%XNv{j;V2AD6G7$<&B2u;{+$h7@B<6XVY;PEaf{ zc5_l{P(qk(I9RFwp4G1USG`UQO8F0cHv3O3=il@hIl1v)_xTedLn4A=!oz?@vr6M% zjv^#B266m-9Z6hJLJ&}7!V(g#H8v;2veg94J(wM*mK6Ib!RPeU;}}0s3hwaIG!QO85fLz$Q=c^-ivCj(k6%go_(1CKe4&EwE#f5)fB`?*^ut$WP$Z zf*3eH0nR4`g(Swg)0~j4bqKf-)DV9H694o7U*p?x!KV9&zKf@t+UJb_<*#f=Tmsk} zM|pzsMxnro2I4s&9-W#Lhrp4|W_)lI5=SE^CGZKLgCMSm#KQ$~WN#TCEQs46@lbXQ zIG2D%`WzR^4n^V@Kzw&fGICx)$PL7EQ&?fCAU+D>TG7dD7KkGUT=49$AaI5PgKT7L zC544VfH)b%B@*b~_8`6*90rgG|0W*%O*{!48~|k@``EZG{H=5~oe-iLFcZzyT*6YL z!;+HpJ%L9wC?OR1E7@^DF2v4WNrodzj^WJ45e`G zE9`5{udvu!aL5K6CK4+83JX2}K|MPmNb&Ypm{v7#Ip;u7_s`#qM**RiZ+xk&un+?T zpB)v4`lC6R|`o_ zND&mlAU{}e1Wg*kLrbA$kS3%94v$eFGsp_EfgB+!v>u{E8=#F)2-tmKLkZycRR)v= zJ9~%wJeZtO`~aYl(Hm`eMVesn}d> zIkpkog&o9>VIN}O3JVJ>2(J`26Lt~aARH;YRXAVxknl0#e&L(KbHZ;#L`0T~=!#g2 ztQQFqNfOBwIUv#^a#mzmV%lPs zV(Z01#kPp;6{{EP6Z={0q1Z>9EN&&v8b`-P;<9iRxHjA%?hfuZadB}CaSL%Tah7lOF`0o;O5+n(G34e)Xi9(5^68#dlBz}{Wlw2WcBgvFZk}Q;LmOL+cPx8H# zyp(~It5m4e4^juEx}}DtevuZF)|R%F-YA_eT`v8j^v}{SWW;1v$k@vS$!wQ7D04z) zLgtOEysV+@dRew?zARVvvg{K%5xEs|j&h-LIdXM!=jG<)h2%Bm?d3z{cgWYv56VBp z3*%SfUGb6lJbWwuC;Tgd9Ko2tAfyov5>6AQ6@(O4D7Y#_E9_M`t}w3fVTtMz+a+O3 z_AF^zGQ8xSqOzimVwfUF@tES6;)kVbOC6U+EiGQ!v-GYKMv0{4rIf04SZPq{g)&~* zN;yQCqkLTXwhCH>q~fizRi#eln#vp1Wvb4qajFMY&#S&zrm)OrS>&?PWoMQ>T`s?T z&2rZA(&cBDKT{*9*{VgWRj6H1d!??T?xLQoUZeh#`bUkG8n8yT#xae%nmA2!&CQyn zngg1zw3chRYh`Hhv~FvQX`5?DXz$m)r2THi$`w8NQ$0)-?_@K5RT`B5&euvdd(^{#h| z&q>26+==J(%Gtzut8>2#)@7YbvCD+3s%waAv+FCW8Fd@=!a9j{v~`v1X5C0`32uGv zXm_gnKKDBw+8!|;J?o+MuIu-$zw5cuGv4#0m#~+o*FmpG-iF>8-j`_dv`sWF?JeDo zzL!1)>%htI07IJL&uC`6^KtMg@tO8r<-5)I>IS6^tPQ_GO37`d3Jm~0q!HOCZ=<+VfY$?eZN0z1Z!uRA{Qqxp|*o!XsM zUGiO=ZdCV{?pHk#J=47#dT*Yfo*3w}>gzgbaPsIW^-~8=6Hf0vgFBORX7OzL**E=h z{V&dipPL)lG%$7E_x$JuuM0m7t{WV>=ydV?CEH79hpdNAUADY@;)?l|o~x!;yRVsC z>$+}oz3V5_pSpiG`?>dq#f`q3t8bneUORkl#9`#(sO#v}F^{pEWVAo0N;4|5(# zJ}Q5_{BiRW%9B%1ou1x!=J)L3^SI|9U*yiq&R6}S^GoMTo0r#K`M!F%kg%}$YyNLb ze>?ix`1QaW&o}qpvfqAu$9cc>ebevezhC;`^WpKw)IUW2sQ8okXWw7z{<^cs21mZX z-Y7(L0l|$zVGIU?#Ry}u!eYYU6&Dp278RGk;lyz`2^qol!B0Pe#6N~8Ambz@Bo$?3 z6#ox53emul5ki40cwcW6+JGB{K&=JWNs$NXF!ErqLTF(W^yx++8ZGo~?)L{a(I_G0 zMxn5X5D3tTD726)2Eu|Xg|=S8@}jgvEkekr+`S zAvXUuAaV)P7V8CiEF7OzOsVO3g+F(5M$?Yq9h|UWq-AWMtx!VKt_?XpAd)z2GV8Eo z34I^9Z>hL+g{h;`%Fra(?AN*<&+8CJ=6=g5t?&H4%TC|ihWz$2Z-oi zOZ1YJy?7Kwtvzw{Dt5($u1_15-s*%o85zuTQH0rs_Q4grJ@`TY`e5!ZG(%X?vzI)d zMJm4DpWJU}OZO|;o@UON*u%T8{mGALT{3!!NA7pp*Z9iLv6C*)z-xNB`YPW0Qs&bODD6O@-qbPiEq zban;zb-y=3*Y*sig@P*3xUC=Xis#?qY)D8jQED`6Zyuwmb@}2GUb(C zj!5daZ7Fk%^JaVKHg48>{eoPS=cIpyp#1VqsQCuJ#hZDL0a0+eI499vJM{zY;XwmF zMIe(;Xd%78eZ@(;Hg~qIjWmv+06`nTi9bBn4?xclI0yhGog~n+J)}2|Uf_nYw-dT8 z2__DHyRuZ4N}Q5ll3ou~V8)ZR$Yh==27LYFXZnpaKJTt)RibJQTQFENGYu%)q%-Pl(!MoW0@L4Y#KoBkAn^bgYl-LPE zgzIoGi_uw^uEN4?@BTAx_~e*%%EdAd*Bz3DlQwokF*<*&&(I>RS*a2!#n=Gucp|6* zt0jv$s2|)4hR=M&mM*_dA54jKV23@-5E z)CHcf6PFW`*n`XKJk@fAa7JV6)@gOU607WD9n}o!=w{;KLm5jWTqGl&UQZ?k$W@5eSM-Ye%cUjZps3sXl(zB^XNBJw1(I5E5>}bTg>F24d^enq2S9)dT!}cNW8by?y z%g}A!rAVvcUCQvIJFUbiW%|XdNBVV(iJ{~BDLd;*GNkBsw5X-s@3{#WtrZ=83(CVM zHiVw7P~`5rvZl&-=kD{(gMO?fAb((f3fFX9Gs{g)9k*FCWTKl|=JuoMB9yCRN6o)J zqO~*DAs!0sY&zw??P>0fT{?r$w&$0$l=&BQ;C9YwoOXQT?o7V%5ytkz#X*q`-F|bMahc#K9|Jh znd}0tezf1bXPeUq)jir?X{IXxqov|XPl^f{I@ayz#aPg>n$K(?yTF;Vy2V{ieuGys zlNAXjS&UQC+s^#K@miQ_I+{_yOR%d>Zng^Mj(ZmM=Tnc4-$}dKZLxvMV%d*qc*`$S zlW5gda#DRY+-%ep<*!4hb-$PEyzI1ap4uYXi1n=S5vA)DkIt81#qCByI0}7*=W$&$ zPS?|NYtuo-!G!hQrk%%KAY}>Dro?E!?)Plz#c@v6(?c`|1OZ^E%$10^!A9Xb!8Ci{ zH0SvOir{esh)IqY2pq6v5QG7m0bF*Fzkv9whVEXAj*OEls<;Y~Ooy_|{Gvjur%
2Ik8r93sYEbKD<&2UVvF_0o%{4;`wnh@7L)uX~)(f!N z(-E9PPBiR=r{Q}|B*~;l%zSwL$osh4_(Ra|GjOIp@#Rh*J)0^8UO7pLrVKwcgvHdf zX1bW&f27Yv{IEE|Q30p`O9HHuLPVMXzHrmLVX}cc3j{GB5JWWr)Zc<#ecXb zlv(D{%D&OmW>Z>MmnpnVQQymRAU&&CTca`6qW@ zH|f~W@^VaH?ZKo$`XML0-rQ-TKk2l_xyWNGa6i@OV1`1gDC*)^h>dRU*y4>nkHI=I zN7w~2I!4Dj2e4#-XhEGU)&dd>zdn{v=88C(%k@MJ}I6ay1)Ct=NE`e($PD z?#SaJqFbHa(U=1S$EmSFNtwOG}8+dPv8; z+Dlj5j3-H5sLJ-TGj#8u`$L{m?+L0B8r37wd#EAN)$C$Y9?mkb#t zz$XL8&90E^D;o^35hgYIq|Y8(ytxNi8-N^Oge5rRd#m6U?{U5!is+&ONfPfnLTCLswx)VIk&^bhhU25p%yVhR4JfHMr?lp-$lcGRGY&{>v~+ zXE&ZvmjN&1lw$t0AZ%FK==6AD&~wPylJ;~U=i=S8;@hX&@pTN(7UGR6+}<2G*O4ZA zJNp2>)|=MTjrHNo%{D*HF2nB=I`M(*4NLUTPbtB5Da}tgeYUpUq)wMpB88;-!Gn`Q z_7!KB3(avDyL9j4buT5JTd)5-yX1^+(b&q^Xcsv2$hICuBI)K&R)xKyberOop<$m7 zd2a9(+xvvr-R6YF;XQzf9^!PyGum~*Dk1WD1%eJlh)xoa#etB8zXu;M#uvN+97KFZ zeUYa=%08d|5uAM~y9h&NV%OYCCm+Za_SBtKdSTY@-EwJ9b$?S+9;WH(eKhYteRW_; zKTmt#Oq10NU^9DUmYp%j)ka=n1zg0^H%2?g)5nMHEZ@E?ChgsTD;}CJrq&$tiAx!T zYkF0q&gP;Cs-mgO^*B5Qf_N6Gqg`|F_DNp7L_DL!&>ucpd#Ho1d*x0O#U)Ypd^u@X z`CR+Q_Do()(FvT`y9-=BswX7nR2Fy2dh6SZB`vGY-9Gs4+(0*XKPuDu6xsXssU
5hv0N; zh>Oz9z!Ixc+iU;$Yl9M;TxrI9eT+I?-`J??th%$$&LrK}gSZQHi}WpTrV)|ZT(>oQIT+ri@x zgs#SIRlzqm9GVQWnLT1Sp<5IxzBq~?seHB#P)K

E@umfV=S3SiUyW!soO=Z3TGa z1AwqWPzdyrXVU^}h%b|q5kZt-LG$9&R-f1&_&!jbc+D*K$?%~BeACITB|b0yIBs0Z zEZhBQ?=Osc<$j=Gm#9~?X-IojnjNW-=CEG z04|8D*|5|VQX0v?-6`^@`CS4J$Dovabhm$)^E{+l27~aQnJ5vtv zy2Ysr(ZX|Wrd&>GYdri^CUGXqk4%VscX5nmAJATtlumRtjK7-B3)9?$* z9orDSo!nWya4xd)_PM7=f#U9DAKgMqG1rH^QQlGFX_1jRb+U@h_>i>59A3gE_{5)aXxOw9EBu}i%5!`-&_s)LZ9X5t z3cUX&B=T&gsuQX4inQ%ce^jgJApKz;`yy%o&oNW`x?S*kU3*T@?u+>>PV5e+KC6m{ zkK#|_TLrvEfDuH77b2nx_rm)HTq|HOZC}U(F@Xd^>Jxta6uBg^Tb7|z+CidhlgD)g z7YVN%SL%`~r>@a7l%|+*<9efsE^2>C%Tyd9@n}n2Zim zn~c0a?om$i#o^8i(8U{_e)G9wRNw9fa&}YV(pC?=f$uZx4*1?7AggmLZwy6<5*99_ zx!oVqV4*W;#*xJv2ofrhY5#^SzyP}tX~lOUfmMP;5oHc781@${7#KtX6`#lP19iI3 zMo7SN#WJ=c=*DhQ-yPEl+Ip4O38g}l5-r@sqvy_&l7`AW*t=HkciTg?kd4anGE{4g zBa!Wv3S)h5+^Cf7=n9Z@#hBBu{^zz+6* z8p5!hFxH_KeFA^-*iT4^)wLnZqcZ|+uk8bEUf7C&Pej1Xw0j6xunZw`W`;mdPIp9IDZ zKiUCAH=j!gWVS$!y0OHW@toJ&dbAf;bqXc{sVT?UUNQ^?O zas=$)i($u~d47=>Vu%6_s59v1u9hUV2hlu2xFDroglCwlNka{Y%=M0vC&hC}t7HsU5n-(VBZhX&68uT~xp=27u z3WR~3)eyNR#D}oKsnv-9yRM%PtOu?PWT3YPb>nowf(9x%vZU(-WDVw+h-hEqq&dJ7 z5wjNL0h0yc`&kA6z_(pb*oN40c;Z{^p{sW35(-Vl!4D+68{(L~x5yZo_%1J*q6eNM z-O6--g$7?kMKSsn6Jz{Rd?RB`vzpWaFyS|(aH7pa1V<;kF4ja)7Oi!)4hfm}ZOXu# zS434qT~NWDU{-LoQwjatj=d^k0k$KAsF}9+JdcyX+zb(BP*=pV$(n8ve64;3mhc>? zYArvR)%2JD9&HFeL3}F12k>2^Gd`*vj0$wyCyEfl`<@2~Rn)W^Z)W-4n^gkla zMAW>iE(H^u&-)kfVnbe)EWvW+pCz*=&M4DUN1=e+*XJUSi!VKGN9=fF*yYi}w$ssy zEe3Y#E}RlO%ggIkqzbO`R@Q~I2UHr54!ovR12We6ZkC_gn?Wznc4D_fgO}}EJs4K# zB{Tv@-z)qeGo?)GunCK z+balht%mD36L>wt%9*Z){3E$|ebD%(#j!7V;ETNPmpD)Y{J>x%00Tf2P67F!L?b-# z^U{8DU4^|V8ZKf{vC`D4mWEQMLkrihfr9laVLCn?Mfod~nmt)y?i5kBt51o3dGVkG zTjyLO!R|G>LZ4Zvrii+cGALRi?S|Xkng8qC3k_C3Ix;gX(9NfL=+XINqE959hUV7( z3Z?dQ7o6;6-vw&xlXey3EROFAr#@E@ zFgt<&Vvtbh()?bRRYtouz68~cWyl?#BrL(y^b8f1IvWW5W@G4zRaQ@t{=gvG`S2igY1YCgm}F;Zl2`3=R18gm)D_dLmC_{ z1F7nvLYh>rWE=&405xKL2aZnRx`nZkWlwi9Dkt!!x|~gm6S-AS144XppGFRdfB`r` zs|pVAx`r6Q7!VI9qCrL=45EKOA8UvTfNU+m4p~#(cYhM6GyPtLiJa{gXRNPnf`yMf zKI5Zxe5>5`zJlXeVrc}k^}a?^Q?T%1bFPU7VP&HuGr^KZpoMZrfVWmMx`vDOAZ)@% z=X5;JqA6PlUpl|g4;x|3B163!ALZ^K#Kl4P2@ZbO#xP0!@N(5Fl|oaRu8a++d%c9T zpe)_IHd0r;qGvU;B_fX7SE)_bcB}HdsY&qOw~euu{*{#K8^bWU{IBG`QH4mzX zH_A0Nmg0OgsqI~8jpqs8>8}TPv#TAY{jrRb9g!07#-*Y`{#Y;W*zYQN+A#<4 zJR&Bzd`OWHE_4R3r;dW#;GFB6fow!@)yCHt5J3qv z0z{$;h-Q=Ya?b?9GQ~3YK#q}`c$X6xf40u3)WJ|#K_gr<^Jx~1XGLKgZF4AX>^8iz z*S6=312=OR1iM}@jgn>GX+TWH(w zw(hVyv~<%SRixdHiOwt0JYf}*28 z79aoWeP9DC93wk&UkP?7wx$4RT^n5{R&SyS8Ui|NfLg`h%nX>bQ)afnAHkpO6J)2|=)Ic!+py z!2#8Rk0Zd35c`9lXxHZ3W+bq`16EX=u?esy+fz6aX$bB5$4_Q{7~v^<+Et}y0k z`MP%fxgt{KfF?$UOkzcPWdfC>wm@_)3!Wd|g`(<1E79CyYM>8g-VGL`&_}cg4i2`1 zOmeeHBk9xyyBopWm{W|pg@IOdx{7Dc3C!}GKVI$h&NfTM0C&bP*^Z`Bc6RBY-}GFH zbvljUpTEVsm#dEz1sYktV(}$3PtUD-yZLP&4491FgHDehW*NjmO@rb~p8?}VLkpLB zp+TDPetdl{HHF0gjdzF50y=^i6-$ zP@B&vPWn7>mmauH^_dkx(bHY7*(ws2V{PtdaJ;+>unt_=v(dQj^~)uIC^a7pc%p9^ zTfkMRv5VtQ1PYUK%l4{}hMlfOdQ8IIz!4%W&Y0U#`1&d5nD(Aotm`0r6S|LX9(qP1 z^Smhgde{r}&~-ln&m`s!MAi;)6#g?#*MT$Jin8al8CwOn)(3YrnwC9ejiCFEo{ff? zq~-ggvFfs_&`?AA;a=X>Ws?o=ee;~}|XFln|pXPE^zW0ZY&fLGSuSk7^b=j5cq9T#= zMMM}Ufw+jdI&Vzj7zRM3q8x*4v;AGyl5WUuH%N=nJxs7*#c- z&TgHC#lU~IJs`6yZE|l0X?O~KaxRiv-1K{JYX^QZm}`>{pAX))0DIapgPT%wD)UKw ziqy*B<|^3{z~~4U3|_Z6>h2_RT6Lu62pctzxxsa+iox6(yZJ0e`#@{_!XR9?DQ9aS z5e6P_|6Lg{En3XiCqw6l#j)IQm*=YdZ3N&d<^OfY5fQbu2U$IQd-c-_5-9M`l)eb2 zI4z}o+_C7fBA*QG20}};v-*gd_rVQU-Lo2hmn)qecf@OrK7dVns^~(+^k=uL9Hp;n zz^0w0KEOX5rgD&7O#Rihzty{rz$yYPIbHkJltY`)KZ0=p<~kY4P(eUdwi zH65gnMY>o8F)q*}=OTMot+?NY^(n;v636t@scJH$`xCn;+N6h0Shhyn``awqF#cSW zdtA*Fu9KDyydAZ=oNgKUGo%(78rr}4T_9{zTfqy0E{>(DD3lGx=`N0ciw3?)3T$(% z0od5)Z%O@6H1t}a55>b3pH!ACpMgJA0JX2}9`(7|;Pm?jF`wgS<5x^q&e|P~+o;4I zQFmS6`Dg>)$V6EKw(5$jme@ld9=qMSRId4&$c%`F_wI)DQ125?_ulj1n9?aiKtCJo ztUcr$MYon%s*u|CQwABQqByOy&;ZZ8e68qH4q=#-{4xueu5ZC08lAALkkx%b^k^%| zU$G=E>8|M@X@=GNw0K=Jrwcf!Y6e>INBupY1(!KCD-t?78c9toz*FzW!~IpbzAm7; zPW(Frn3o|ugU>s@ERIR<^kD8Dd4fg-!M!f*8JWkzgMM+OJONm4Hlg1yW~WER*$Umy=Aq4Nq$V9H$j^ za<(nmc#uI9zmFq0R2QC{rarl>*#=OtJ&kZie<-+=%0tZ;!@k!|&2g~36xdFv;Q4YN z-kEKsjL!002K|_`yr=JG%kH-8?x`7Q!%Pr1>J}rK%0FQlfKhzMGPLag|BwTs2mYac zw2gE+h+Qa74>&Hza>MFhXD>_u33_!MbtK5^bb=Q5W3PqNcBP%q;<4UiyH}sGc{+t_ zG#w8jMVJkhG)>M&%rs|@nfB~0@}h=%AG~$xV(!7h3f$51o6UO%3mv^gb7He-;uy^6 zn<)+0yqgNdm(C=i(Ng)_CQZLTpu)YJz;%wSosyojtuNiYJ38#+Z_IK_`^%ri!!1&TIJIEj4j;5Yi}@^l z1PnC_-8;iqVtj!h`pjp6RmiWJRxM$6E;6sD!@y=`G=>|PbZ?#G2a0J~`>o?I9Hq3l zx7ZIDQyFZp+Zmg=iqTRI+!eo!uhH(g->vRF7oE+_0%qa1)4j&8`kV6=R@lOm5(N$9 z?r!xa#|+Va*syS!mF!eBuJA`GU4JZ1adtDhb_dw>9rrBVcY(hB6qZ)eT%=d51LoS* zk#?V8<56AtAY0~VbFZEBEh2HOZi3Um6_Kkbc%E!dq-*UjoWnIY3@~#3yc^%(!yt%s zlUltdn)`W0hc`}g4XiKT!nYM1G0}grAxP2l_`w;wX~2aLl?K5aa?(m5p%GWnI$s&E;fshXgbkSkfwX%N zp6y;WqRDd8fBiDEM0X?DQGk~y9OkZGldn+b8@#&Ny`7XCE=n?;FD8w4tJF)Z0X|LZ zOt0Q!rwzN3WJsn&2Ss~XFRz&_y3`TpRW{DK%5?Wm@c^JDo^-)$ivT{YiY>_|j&4l` z`;givFznaUbaq**O&c0EE|gi)=tx@7LD!+{G?W90&RiYp1G(A@zX53``J*OqqF22YKKVYFw=B>ZY*}28d$TZ*<4;k#*^aL*hug4>LN9+@ z%gR}@H}lP3uEP z7;Oo&g$vw1PSQ{V<6t0lxDMA`rpOlGI%CgQgMh__m>Fnbbs_3B3-Q7rX2utFdXQQ3 zoWpaddHXW6fzsJcinL4%b*10CXNlT$RLy&IxYio~<~irso|^^2q{`c;W*24Leu+}rSiZf zPZ?hE3)n+deG~j=-vc&WZFev&7*^crf#KP8;=z_tofmL66E4jRHArf0eNeQkOoz`i$nIDR3uztz0KY@q4nro1+X`W0RcteGOcY%Lr|f&=5(Zg4x1!_;vd6sM}d zY$?)h*yBA{+i7g5fv%JDHFwMa3J72HH8v`q4Kk)VNotnX| zJ8a!xCZR^cwBNhJ&%Z3FSe>@1MS6YA?>K6JrWJK`Wt*#)LP=SiABz6#(#Yy8PiOz^ z#_`Q(BccCo-A!ihb<&qe0v3bmhO!5{X4|JRDy+5OP6V4=%FPm43%1$%@9leHD|U7*)P4bjhE zm5_JZ4A~kF%2BN#Qj(85^Z`Q zFp+T+#_u}-{DqKr>^QCgE!+A{zpERFE zTW4B2vW-_vIx=v6M5S*egX6zj{DmRBAy9=R{O2nYr-mVP3D@YU*~DnOMF?f=D765~ zDhDS&fvyeOo!sxufrT`9G3wauvS-w|%S^2))ZGqRp|DIIHE`r(NU>>DWs0={RkP;mRPp*JV`; z0lfRbaoK#%#`T#k&4RZutH|KRpV}tI+LmxxE+v|7ltmdrz3OhBDC|3;($=Q8>vI8n9>*|z-bbZx6$5b5o2 zI_O??@3-YLbv#Yjj3?gDTg{CUUDvcI}+xTsPLq z54)lsNW=`!)-^A1_3A3mENAE$hCdoO()={85NC>sZb2%A4%{_bPz*)8^uxN$Y^vrL*KHy}}NB7Wm}Etwq-qWwvP`?%Vv zJznSrntN>cn4fxb!j7K zNV_vfcYs~P64^^_wk0c;G+y}QxVCygs&c6JDG9NSmciu}^xy_Ixu(|8K9|&$`=0y$ z-a!=?7y615_|}1AixY^8PRX3m0wW9((eHrg38A`6U?)7l4Mu!Ym(V9{S5$DHF5yg5 zAB4D{3~ss_RVyl@Vb@r653NHnF1%i}X!SlS`q$jIKY-(AsRW zHig7_Z5!}cz5-V$KSBCDu6AzwwzosvYE7WiIA6)32a+nBWg6{nc^lvZc*T0zP2N&> z$)xK3%V~suAV`=_1V1;O$b+-3MN-(P-2<&JIen))fCk9->9%Ws_RzKPT~)}o1#?iU z8SH3r59j32h1?W)N~Sb>PS3LIoVGHqX@41~;N9%bw7@^MPJ=T>^DYoL6$1_=%5gH2 zRTHo@m%#A*N6$Eo5mbzgg`#0qjDu{CKc~^qrtE#+H1+tDek7S>aGR9U4=XGEY24qu zvjaa=T37r3G<7aOO`Yi*he$*tqQo2<1r!n5sH z6}tpTkO-C_K@@BW5H2SsAVL7OY`BDrwq4{R5wt?kt=9^!rP!|1{~Ox>%+5F{j?8$z z?>q1JKF{-e0Rqs2puCC2SbP-oE;Y3IjozA>_g6`zdpJu6!!71MxG?Taq+bv{whd zdy?pAvWcqi_-OA@YG#nIS-3GA-4%^GR>N{XM$RY&r%e$ewj%KrfL8a2J5)zPUtk#t zE91)*zu)UgUSMO?gVG0wkqliN0jOFLqt}<>8ov# zWmQ)nw`cc{lU?q9O`6ym-$=HO3fG{Qj|^2WVzphT^+hE3<)lX#wDU2U-+?3R z?|XRig{w1J69`;NL^0*LC@kf*h4mt`fl7G@Wet`pI`O2Ph#9?Zbt6brd}^9G8YbqD z_ZY<TGoEdFy9-9t0 z961}R+fiavC#7kH>-!a}g0SlXd97V&Ya!ZNNaH0d6ru?Ib`5CqrRZ!DE?6?uus@~w zk|tg90V#VZswvmy`HfGr@fc0z7wEeCG2~X+>0xwk;O z$+QmPkd)@n+-JWTl>0l_rB4x5y&L}h@f4xn%}3!4Hc9{fN-T1%H#8xO`AmRh-6$zK zc_wB3TLHG2{M9`|X@ad?L4Yqi=BUdTF_xqWUi)DR6?mF33iw8E+>8Z_tT zmV>h;q)p)^#^zlUUhN;}Pu_{o@N|hwt(s*QgHkkbmkG z(LVc+JFw2ai8$8-pvKREbY8eE+wbP5Rh#9ms8C42CmdBZf3aCs9}NO_I(e5{Qx>Tx z(4e*qYu>ey>A3s@0pnExJIlt!{DUvTI)lQ$!RyYgvMbxx;}j zqm$|rtV%Dp_vo3dkhKkQHaAlPcvqG`nCEWD-q|nj!612EM*{k7-}5nH*V=|tna|pK zLeH)+qmmon8{kD@?5dYtL~I8sNyI?(C)0Ywzok)?kxrCf21~^;A;JHI(1*Q&Qhl7V zfjr1?d~}rf3H;&1y5;N#Zaf~BwBAO%+Ag$t#-~@j%C?T;@{qK?B!&C?m?@Z!08yr_ z5&hAGK!2P98Rj1>-3!)T8n;azIySw9u5MqsqF&;q{HRSL`R27V{qmK)XBxoX5;U)| zkKKQC6?^CPjP;MI^XKYpv0KzE5Z?uo2O{;yaHdAQa&if(gYhp8KI@M2bFM*)=6E$x z1&y#3OmA=A&)xA2(t!k$w7oDlTj?gLjUk04U$P=@iO~3+FBFtdQf`@F?TuGBZl`Q< zI{S}&Cvn~KXrH(umH)O~^pat~A+glHrKR-O;e^#64^rwmZm%JvUvOHH&2?0L*V6HnzaBpx;x)bu_?|mc z4e_jUa#29O7h_fw7V3pEvhmKG8((-LEShH$vydeXxJ?Ro#D~o6-P$AX%JY9Qa-_=q*?;E4q*DE)Vso6a=x<%;?E+ z6;;s`dN&tI`7F2}ZCM+X-5!LwvY)VHSPftk#(O^b!7w?p&6&7kTcyLI>aS%UtykpB z99c+lrBzN#JCdx3>k-#y(ZZvA)mMafee#2jL55@u3 zn^D5I#KjKu0mKwvd2SKEk|G;5$I>jj{Ls<{o&2_z9$6d3F_47P#+_;Iy|Ll6Q$@}A z`M%vVtu98>YGo|wxvhN308vdFvLTcUIorJ2gFMu~vfuBRY`1f&w7~aMD0RLqq?_-x z^GP>GsV-;%xbj?)$Yowb=L7PL+YyT+tu5LC%+{#_d&F%$l5@zBDY$_WXlTr%;$f2s zcgDm_K;ego^ba5etfnI%_|HKrW@-;gNm$`Ic#15WqoGnLU(*YfPQz9jQMk6 zE)W~&m`;^FnU5qNwqmKt=N3ugcBs5;@W4O0;#x=OQ(XY-|ujuyhx_BL{RRt#~%C9^|gNGW5U^DdPu_bUe%P=7f+%HjMGnk+I zpt5a`Q8fgRz^E3T?B8uvNu%1rXc-@nI)goW)En1H)k-&PmtXpP&swe*(QIEcvf>=! zMilesJ)`DKTqa_4TM{Cskc2c-mzhM-x?#FP67YcqJ*t!gzD89D+-r*C(LNPc=rIF{ZKMc4oP#FD8%~9T%_H$ER8-WpN9FnqCKH_|&1O z0Q;M%7WgM5^z(;~c+WKLd1p7XK#~&tuR9|2d2-dykium?ek=-;{l!}bnFNXSX0VKD zyxh$A+!G01-HcA}O;(#$HxIoV)QNV;*(pw#TtuQu~XI|LU9U>Hwh*i(_qOOvn6 zyHn_(h_?OjRn9wikm|u3r8BMJfg7F|;Vq$2%$chiI<^7f?>5SRrjj3|aJqHsqWMEH z;aQ+Du4>Wo6TrVHYNTpU_`KT9r$1c0=1+#%bce$}|M41_2tqyI9~R;TrXv{}FW(fe z&#gaROb@=Ye+%nm8r0HsmUYyc8xC0Uq&p`&eUMUZ<}eBgQfs`d3+-Uuf)Rux_V-kx zupyT{)9ll=+1f=?c;=<-a0Z=2&Wx&^Z0Xoaz;isO4|Sdr;8FuVm+YJh#(0Mk?BK{B zN$O_|>Bh%X2s>Pg$t8Y_Gq0rWB0gJye`4;5UAMx5CwfT;;zcDJtAHJI!=@K>Dy`ln z#|;~&k`10JRS=e(urjtX)EI(7%c2rRXwW-7YAftYXzSgMP}ug-C9dD}r10Rd@uv45 z$dDy!$dt|bM%+k!o{gWbR~1*K-Ma0x@cjdkn)6neA)pxQ1ShDLmZ;eim4&!fTgVEe(0?eBJ^4MLqZdwgM9OI zeS~EeslnPpqoF6tbsC14{VxfHe!j~P+E7ox!dmFqW37dTkENXu!TT5?<_tqnH65Ic z&H&4y(Q~IcS23Nj3=*r{FpOZ4Mi^lS^W`2+LN+pQg?!^6UNJ4%Lji@h8#TGVO7N_xTgmVDH# zOeNAfsv@7~jF0p&=H40b!aHGThMx77!dQ$cZnB!97^^{!=uUeo4i{)B+o{UrojP1PK)@)|Q2t=Q z;Iglaas?od4}$Y1_8leF>GyG| z&E=19le#uxU$DUkDY&j`tdfYT66``h?~ZSKQGvhNwULhFV9J!ZU0Y3-%l*Lp^7@$Mc$o;tQu>5ASeG2r)# zZM-`@@ndNT&-_9LoJjVRopp%6Gg~AI8z%2?rVUoUfRBBrTbxl*HWlgCrznrzM)+zG zs?h3Got1Ge5>MosR80k2Aif@ntS8`%Z~}%jJO2adm^$=oSv^VZ2(UpCAAM4)e@bmTURy@ivirq*K{=z4poTs&zIaEDlK@%DB-gF z4*_6Nrr-QEDG#+@`80^;SL-x9-CFG<1GoI9@D;FQ9==L0MHAjdjI<`g#x^tstvvQE zryQR%AlHp${ZNOo=pM;f^Z#D$4pev(vVljrO)Ah4T7}U7kVR&KFp(d z{J$q;&f9W+Ag>J#eHnD6#n-*r@tZlG;!%E4O534Cmx~prTfA`VL;e=DJ--a`)>COy zuY#|(`Sbb|*}KT43wO6*b7r4>vaO`&y(mVrhJzI!?UNFBPk4FNZg!h&f|l=e?X2bDc=)W~kyjc2*7I3w&0ax8)SYv0B(nQRUD@TmnPn zG6oG%SbV6l(1c65s%gy2KzGSW0Z^mb z8f`xZccDH)LxgeGV=35;TyexN@F_aM$9j=tB0ddD1*adq83m^XDhJey;j^JoFl6a- z7kJ@M2TSA`qi_A=_is0NmK6(+yBxM@p4V)0R+`(E8O@!d+aiTA_I|FskvkT7BNfqY zAv=HjXpp=*c>k}DW0ZS}NKN_)22)W`K2jl&e;FT0$OFY^uUGF$n$4qZ`R>A&+y5+b zom4pIo*k)JGuhLiI+YCbBh30sX*KIQp6q+w!Wt5~EQ;hMrMK>H%!V{7CCRJmHxMjg zUmbKTQ%Wlq1&FtFp{F6k`&MnV&tk>td3L~_Q&G&v4?mMO*|@pat-|~Y!0CuLv!7$c zG77LTD65)rn9BKK5!VfLA$&Vgj{IbofzFlaxw)e4_g_i1^;t}uOW^~eV%MNaY6^8_T!fH#6iIXAhLhk7rb9=?wZhUZwASbY7#TGMa~~YqloXPy zy?1AR_w^w43m>yJ&tN$-2eytn%Dw;gjJyK&yy*#z7Q?n{JkUNnVM!jzf07eV+mIFT za1B{?@UiA|;rYaD?qZ?ci9oUTT+|{zXKXUpF$Nz9l7HD#lX&CjU%LCs`mE~2u?LS! z8-vW=8XJy!7JK*L@4M4Z49~E;j$Dv||7py~EYg*F0+(b|Ni3SENOPQ&`wwcN2~YP9SHBNrhtN$s>J*v2|TA z5V)#-=;?n}dEd|IjxW5{{FT3%i)EK@Y0Z=$di3IZiM1JTg)$>nbGV#@zwj{2{gSNy zRphlwvikm4U;BHgEox2)RG*%4GbASCdD^`f(vVk@@s;lvk8k6ah=zsv1^ny#90i=p zuEDv1g3xub=Py!9ZXRSY-nq`BJ0{0`_M2zRgM<%qNx;T>7DWGN$^o+#Qb9h{U3D>A z=6KYx%-1$EhSgTv&|h3lUB{c@7^LhpJ-bE_nNO;7`w)IEG2jIdEo0aeffqYO#RO7; z*sF#RLFZ#t9e6)Aw03%i)Lco6xQ!&qQ!roqIp?FU&PS8c7c2R$&}1sdVAZWKzzMmk zsM;n=!VT!qU@Fw8UM96m;Vy$alOKX=^C^3f1cAoXXmG7av!h6?py~Hfk2bA4#rD%T z7kCv@y>n745n7Zp{&!Brqd;cd2|;0OPff4Zt8_$2%psb&?4=j)2zJ!x*m#G@jKQ99 zEtxN8gEGrXetUkXjP;dl@5x8iJ}bNq)=RdQD|bKoR>pjlAf>$*{Y^5jVbv$w(to8F z;ad`7<+c+rMKfE^sIsP6!k3pikILy@)U4)t$KrKy@2z%=Ih_3}Y}C20wMsbYv3NHZ zjEW{Rf!F2`LZiMU0aWb8yv10LK_!!^K_7kLQ?BycYmI~_9-5$hm`xae1tbjOX)Z6- z9Bz|VTL!I6@x&Uc}P4+!m3NHTQJ2I!^ZTjUV$7J_vv&W>TKApQh_S0Q=2VuCpv@ZRw4varm#UxKN_9V51MTkRMviGL8 z9A!B>@C)clypIl$_lWS6VHjyLxJz z`=tI615bx-WN0BYo{a&!HbP|`tU>s;Mvxj@O5IwOgK(h_KfaEX1k@ELvW9?5_RTqe zYru4iM#*z&ge5^^i6nr&+Ys!E=bcIQCh=Vr(Pq)upg)nrN_IZFgU&geMMP^H<-G_` zXH9c>gF%H7KN1j^-sQ8f04n9U{MQ0)#TLZ?Aon}m#tL}pY1VFhqkH1E-3dO z5yl;QW^7$H^ONi3m6GpkiNRNme)OS)u~{G2$&ub9?*pvl$ZSO{~Uq z>-Aj}ngvbY62J-kS7JGxR{m8d8J}6`4oo1YaNb67x}nUa>$%HBD14`YSgBEEpN!{f z0=D>FAZ;X+W1NqG8$Tcdu^_`R-B9Y!I@KUWry^CNKkWo0fh!eg^w1PO+_sW$yAiuD zF>wnT5NdJ2M=ujazy{c1H(7TV74Q_=4hZd@$nGhGT@&XLT_(0hx65|_vNu=*htlfa9*wb?U$VeB*VC*oP4FO1Ht?aeo881O!!w d3dXc85q>=ZBmkdf&_^i!iAOl)CN*^L{{Rlmaz+3E literal 0 HcmV?d00001 diff --git a/clients/2011M/content/sky/null_plainsky512_ft.jpg b/clients/2011M/content/sky/null_plainsky512_ft.jpg new file mode 100644 index 0000000000000000000000000000000000000000..253cb31c0d3aec36eecd10c749b9de04d7829bd7 GIT binary patch literal 47691 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 IVCVb)2W(BDi~s-t literal 0 HcmV?d00001 diff --git a/clients/2011M/content/sky/null_plainsky512_lf.jpg b/clients/2011M/content/sky/null_plainsky512_lf.jpg new file mode 100644 index 0000000000000000000000000000000000000000..aa3626befa1bcd9eaccfb7a89278399cb2e0eaf9 GIT binary patch literal 43657 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 literal 0 HcmV?d00001 diff --git a/clients/2011M/content/sky/null_plainsky512_rt.jpg b/clients/2011M/content/sky/null_plainsky512_rt.jpg new file mode 100644 index 0000000000000000000000000000000000000000..45b5071cc51e037a361afc06fd1f550c42668f98 GIT binary patch literal 50201 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 TviFF?TFeT8f=*z5RH_OJ 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 AUjP6A literal 0 HcmV?d00001 diff --git a/clients/2011M/content/sky/sun-rays.jpg b/clients/2011M/content/sky/sun-rays.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a76a4d53992760cca1f4bd83767532f770f92b26 GIT binary patch literal 4579 zcmcIm2UL?u*PiqMF(iZ%v4swH5LhgT5V{RQRV)Mu5K00`KtU8-K~PkxG-Z`8P3cux ziZsPV=?J(eh@zqbqNwZUdz0Y0`PRv3VY|?MD0`S5o;)VYgJQ_?@L>pSkWf1=)LSm~L(kBM$K(aL{iU&5=x<)aio;~_ zD5gGi4=!XUCYV4#Fd-hKIG)P(3*rcT2z5jvp-hb+ZAtf|vlv_k<)4!PamZXmaG{q4 zIV#(S&7qjnecX9$7K38L;0Z7bJeq?|?(UGj57eWDMzAGLMrzt$94$x!0|%l0yN-^K zv*8Cv=xK4ulP!nN;<__9fA{1EW&J-A;w3c8|AS1p20&sDJxBnAN9PHW4+o;m!f_(L z8HXL5dYK(<4}~4b;Bb}{1uHMImPgz8 zFkMB~{t#1?HGvp_u%(6tTo3?QU<2R)ItYT^gkGTjpY(k#1>CTuCK&%WB#eMaw4hQc zb}Sy#Ul$gg=>r8Mh)948T2(=VSpkp$4N5F>{@P=+|7Y1+(gA`%>5fBb= zSS(fyixU&W5hcVWh%%BmoTLnyM3Nzq$V8lwmL8&)fA3+-BqWyMml5!If;1kFmlkw* zX^{!>e=`BU5fHIZ0DcIVB7hTN2qKI>1|-^FW|o~%HBPW~GilD^>B{xkJ!8z3hqv?wOw60AC1yudT)x{k z`5~vWwg35oy?fxTb&A@oTE24F5b-a6Z z;(cmjoRpc#Vwe_K@O<3d9&2kK>CmP6RNH49p#sfZLrRlBrM#T{@tPM?x0_Bds#;E0<#!3 zG+5R2bXyVS6CS6yMTtUo9os3Dj@xo}SZq~JA#Tp}=ygm&VNcyL>#q*O1$1ul$C*{n zNt?399&tvuyxvgZMYgRw5*TV(){yxk=}x#TJbK~Gt*Hg4;XbXj)rXYs8&Bjve3y}P zb2W=GY|jd52W#(h*KE%|h~Q{E4l$~Fa^<0x*~{X``(4twSn@S1DRjF*@g+cF!CM^0|IgA|+lYC8<0%{Gi!dIwf$usWMB0-}`+l zfdrU}I(!e_o)0WvF7!K$aCyabm3eh*ET)T)Zf>3fuVB>I`Ui&bAJ%HxXoI!Ao$C`m z&dz+{dXU2v+V#8d%l>Nj3bXMY>vFZ}>G8^KCzo}<9I$(E*-K8({#}1asomTB-%Xw= zY}Xra_5UVG>pGSH=$o2UThfk_Ih^vKo}anHmnpqGok>aW3lUdy!o$avw?#Xtr*xco zSmpI}>{iSK~3#_*sdpWaYp(_VCq_t%QPu?~hY0$c<)hyOne5`F*00 z4&5ydi>xop#VJad6G-l2(sGSqKChlUc!eLHws#I%KRiHF4bV`*V#UQfW4nfFrDy!} z6mH6U6=wIMtz%0JUsb6_>8Cf`G+B_qD7dWq)pN|g=fqmpj}#p=Lo53IkyX7<6ijiqKt<0fh)h zK;=gOUPLG~41t7Wun_N`0sx)zFgRLJcHq$eFQH%tBoT!sP&P|hDUhTwikh-SL2ZHx z0~)b3D-00f2n9_f#ZXF-u-RJLihi1elJVD4l7i|y0`m0TJ#-)53?nLN!lfuy&bveh zJPfL9L`dO}8$Yz55$5Kxn;JFGBUg6Zb+*)Tg zxRo~0z3Sm!&#vAAuPM%M>~b`~gh-tv$@0PdQ;}OT4UU?9o;j~O5Moky9bc1sx$s1; zMv!XZa`!y#xQScW8QsP`kuMMEdR4oguEqkN`PXGDNZRilxo^ALCtA~V(#7@Cc6NNF zU5O)oZUg|AI^nUs|M{_)J5RPF*5nri@{X5^87SNw82_c=+L2XL0MiioDb-7=PgcIn z>VtDjnca)zykj1z6F!4ytEp*@yH?kZJW*|^Eqt`VeOLQaR?a-FCociLXTIh&9`-uD zZ0eP{q0S~(x%Qj8?MnUI`#*O-eCm1~fPhx*izloG)feBzm3J4OHErGPq-Ivr2w=&k zE5R{CSL3*spU6<6eo!csUMvg_T{6HT&0+HEYL~pw!i>=J;D%kKqt|3xuf1^ksXTb^ zW@n#VGt(|f-0WA~=-tXRb9t4x-iAuQrlGlXO^Ht>sV5_J-D^FvCNJ%}=3<{wsbE&Y+*8#P z9#-^;6yfq@@9{gvJ;CO^v5w;LS5~GMdP$G=wGmPu?~@rRxOfOuUF3sp)8B@NBQ7=D z<)1IyuZ-hWuPN7=ES+dkwQ=tB_U~_@v_!UXc90!sLW0(l7umuvp?eh+rj^{YFFTzx z*yZjlNqbYvkmIwogtzmXgH4G3no%R`Q}t73&i$Et|65wxXv!HEpZVlpIz|%jHFdn^ zWDnlSf3)=uwXC1GjMjB{bfpm^vww9*_=9rG_`dx#v*r6^uqSzH?U&=r?6+x$cce_J zW7ND?lBRE~85_0xiN!jbzpL6ZL=0bP8+fSi!Ik89I`=H(Z6hmi1r-g&4?gC9yW$^Q zU#{X&f-AV(T+IeoKNS73Z9+dSL~~rtv5{LAtUX?J)ZKh@$npa-ZYh$1r&b8#65J8N zqP@1-4b9~V3*ckpm*@+kI-NgOIr!u+|YcR1LdUJaRY$v`vn0n<@{?YDYj$z?>Iv>RIGTVv6ZF&7; zVM%(b@q=E0@K0pk#(+!PEziar?cBQIV$P)j%PIM<%uL(QC!X4F{YFuo{KNERdHZpb z+3ImkQ@v~CvF_5}-$&oJajhE}shg9G(r?loOS+*uvVL~8S@lE`A7t`@(GVwEek^ZA zdZ~YdLQoYSr1b~aHnN(FW?z@2YINN_Xry1-_IXX~VuHe%L^kUF!EKtpH4kcz9=U7( z#?*_GUd)i(SwsD-;|(7xm|Le(`{vS5`lHkfrmbDI^px7W*QT6g+u2{x#g&24`dSY4 zkNov7GW{pMbfnGjf$AT2Pd@42zjQd@aEzw+CTqWz+cNs{(}B5qIhT73vL)9i=|`nS zv;{vH$1BK@MvhFRu1ZCWz5iA81;NnVkmS1}J4175YfNH0 zh&LR3bB_c>Vh7L`jCY@WKSdok&OfH({4pk3b_d2PaMxkSorPKchp10S`U7l2=t}9< zzjXVrQ0jo+Ir|vRt*$U;jIDXxLuY>^tjn$`(7O<%)iGCMIa3l-K!_+)ewuFcIjA%5 z0Gd+32P(J2V%>YmMk@-8E&B2bX2n*U1o*NqM9#(RJ3w&ptIsUIt3;T5DfcFnvdufn zPg2`EuPQ}0YK@AoGs4%fIo%AclF;mS(rUWS7{4#=$@5Wirb|aP_5wBj?EG3Pf&@-X@;eP=%47zIo literal 0 HcmV?d00001 diff --git a/clients/2011M/content/sky/sun.jpg b/clients/2011M/content/sky/sun.jpg new file mode 100644 index 0000000000000000000000000000000000000000..12b3829ebc27c4f1b2ec113e8f8e1f39bcdd687c GIT binary patch literal 14773 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 literal 0 HcmV?d00001 diff --git a/clients/2011M/content/sounds/Kerplunk.wav b/clients/2011M/content/sounds/Kerplunk.wav new file mode 100644 index 0000000000000000000000000000000000000000..7c5b2505f6949c026d174584dc2b313f80f3c366 GIT binary patch literal 2019 zcmZ8h*^(4R6m6dLQUAaP-~0e0j4%w15G6uXlo)1Wz}W!1>9xA6YtPE9_Ue6`VWx*+ z5E($gEgw|-YAu>eZ2PR?YjQXTcuLz0zPlQ zS1NuNN^h2K?&v$e!-i7Im`_A6D3?8!2&+}`CZTDwcs|SQ_{DFDarAOu?=Ke-tAFxA zIgrd@hi69)dH$=jmHzx7$rs+*Zf*VjcR$>-Ov^TXxBlIiU##zytF>~gwzgr-#pYVg z%T9k34byCPdhzXTTXgKv;o|Yjr^^RVA3gcw&wHU99G*R2P`^J-WP14Q*`w1(&(0p6 zO!Cn*kMe#pKAvzINHM!V&i7B}y?JhViO{{cTakC;I}H)~K|=ISd8@A7+Pb-W<;v}w zm%l1&+Z#LAukN$A_-x37J>rSnj@dY3b8uWSqA4-N)| zWWy*Not!;hhK5`|Tu!Ice%2c;4iArxkLI((dq?}zocr-~l0{)41nS2nXCjo0%YYNd zc04MhP*U44EXQcKwMMhkZ8tQ_b3Nbp2z7Lm$J}+g^*b%YXm>~;sp~k7=UFyS(m0Jg z!)8&E_3||0BFYDYEZ{QDvMdRMBu^y^Q#{4JK^}@Aib8yYFciM)inN!-0W}&en=;?$ zoH0rW!)+Yl-e@%q$FZ>-*RdP|&XN3IK(9i1V(9$Cb*VEVFex%eW46C9H1`1 zd_t%q2WXWwqdvhC`ayiPJjX^6V5G=mi+@Bbx(iM!Fz1wjy^un#z`;c#e?=UI9K{BG zcD|6DN~lOl@m5X1HBgj+LIfmSP!iON31D#QQlUcF#)^PY86bH|c$f!yF9}H3&{}#M zgJu(Ag)-|6Vyf47H!FK4$p#1W*>XA`3}Z=*PQ6`qST;Ido}4Tul4$j+rjsB^)4+GT zT4ne8`sT*^jY{3?ojiH*%TLFn$Z6MVjkZoCBsT2#hkeMfS*=txoA;*s2eVul)muB; z+dH=^nnj}iY=3$G`0gm>#Ah-aFXr>bI2Y7x)ob-?wcgNOnGHw7OjuguPNm+lSezFU z4$&&rbQJ)_goI$hgW1xFVx(=c>hH*CV={&+eW4^qg<^T04ll2qxG`xwerv#IH}59uTj z5fox{^{#2F$xZTJo~NOj2FxoDVu&lj*0YUHyVcSF?okHesdyM8k75Ml6w?W)0CG?= zfMi3c5SoFMO)LwBP#5~`Sn5sb7L3v~Eu54d3#S0eRU>7areP_47CNCm+_1oh$xv~Q zfL#boiBw`i+pAC(B4M1B$dtUGWb8x`MsbXZR?;n$Sg0GaEudHL14tfzO0(dpl7QHe zMUh7l>wFH>>?l6!9pWjoLjLMdP0hbfNJNoPVuytqh{DZ5Squ1LR20iqECf^8E4yM9 z*DDA$l`BeWY6^-9R%NLM^ZZO5C@z3d7=Tp;FOpJNt4QEmuz}61QABukSm2z~QOJdh silPXmiDZ2$lO literal 0 HcmV?d00001 diff --git a/clients/2011M/content/sounds/Kid saying Ouch.wav b/clients/2011M/content/sounds/Kid saying Ouch.wav new file mode 100644 index 0000000000000000000000000000000000000000..1a7f6da36edf2028681cf2894d5f619d310dad52 GIT binary patch literal 3301 zcmXX{SyLNV7A9}0nmo)@s^(=LlB!fqQkB>^i8J;XYzzk5*v1fSgM>kVSY&~O_NBXT z-|kko7KDTl5+Dp_F{?3)F(#}Aufa|x>-b^jAu})YGQVKnQuEy=trqG&_uO;7bH49f zs>{!x|K**$yxQWLvUa=o{om*1<-LW^+4u7F?^}6q=e0I_o44RI(AVzwH+0Z+YU6*Y zKUGwfO%7YSE!V=)iPfb=`}8kGpGXD9hl_U|r&}f$XzGFY)s5XDTr@r>~jrl41AxhT}v3 z?tigRT30>%AE6_0y*?JGa?panx;s1Gz~|ol*Kyf=?!0BN&*><(>_x*rW-hokRs)Ug ztrox6*->H3Nx5Y?pw2u`+MO-tdVewys4X3wr$e{HQ`4GkD{m0p!FX$hFFn0Bn{jem znJea|Dt~X(*JA7(pPAfCST`1~UTwbFAw{|_T!}xLoSC&o{}C}M~ z=X~#;t<+?&dHG~{J{=f*a3|=Re`>7@->8i!k?OzXhCN&N5(jrGt~J&-2aU1vQ>aK6BChesZecd3)oI+;XYLYO&uek3XIn z9?b2m1g+J@RTDf`rBsjm#Ijjun; zj*Z5>Cy!Pbu3R5nSo-_+{8EC}<)1bhPPa{`*Z#G9d!RpZt+e3Ni`RQrC$`pizg9J+ z5C2 zjuzMUt<7&fc`!eg?7VR5#K|+QgVQU!8;@ptg{F%Ir_NmRtVsv9j_eDcxO z=Dn2AT667krP1Vy4nN#pyPx6OYYnwu))=ko;L7&$+*pz~o6NPf#zud5cwv5aGU+#) z+L~?}j5aAbac^m5GVZZDY^^3kYe4B4np(JE+9{ z?!@AY@4kOJ6(x4#<-+49&Kf=a+uwfkYHL0#SgMPU=NDcu3Vky>FTZ)YHm=!f&z(A6 zfP)~|yRiH9j|ZzmLVI;-$(b|7m)eBX(vxq0c=0GlIw}i}fBf0`>$Xtl!Ph_i^M}1T z^;Y?jqsLBEHaOx#vzz;`UObvn&9!Hbd{IrBhMjG8=0QW}8nA_w;86a>Ik^gc@{qcHFXb zb#(Ktx)bS4I@ukT{4RT|xy5V?kZ>ZI?(gr5cSl2%^SGT3w}+#0IM&@0kA@Xl zB7(s494Fu+R8dt;Rg{n-i-ZpfR8*r{BpgyDk#NBvCrV1JI~LOv67YJQU0n_zC#vyO zI-N}?qBP*Nwp%Qn?tmCV`0ki0%aX`*K@R(+Er8;vEWxa5Aq5}>7L9`^lFOlx8dgI9BZ>$ih`@u&Vv%rI z0b~}F3vg&U+@cW;-pDLd^ctLq2*8SA#p4nQGaOp5fL4fvm3}*ek>ktWqu-Z0g_%n{NcrnV1bbf7mF0Lh%XBX0QzoLI!leJ!61soBlN~R8G7u;3Vv95dbx)| zWi}to1VxG{6i;AY=Sg?f`H(4*L^Kf>eAzl8Af1R;?86=g=fd`*V>98Oof$#`& z;sr7Eeu%s%6G0}NC_-J(5?ob$1wn!a1s;l`G7(j5!XlO#eAZ9OZg8k*kQytO60AX% zC$K`BI7b`cUphx868MAifvr9xQ67UaRIf=Oc)0yrQLNu?C; zA_);eqk^W0kiDefq(TjXs0ctNU}B+mol-(V44fbV6ib5&DG&KD5|J5ZI8y*dj}e|n zzex}yN^yX|1P4YMyBJ|86}O_d9P&qQrV|9xSw}w)#fF|ULNP{%Izrtb9i=lVfp$FN zdl-_HBeJQcNC~k4o4~-~i9@fL%)yL6c>DjAIg@^;m$4>19S zazhh=iD^X^6&2vY3;1MX2I}=e0S&4GC!GM~*0C}|u^Td`L}CAKASl#|HGo6!AWb5% q|3kZf*U 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 literal 0 HcmV?d00001 diff --git a/clients/2011M/content/sounds/Rubber band.wav b/clients/2011M/content/sounds/Rubber band.wav new file mode 100644 index 0000000000000000000000000000000000000000..22c52fb0f171d94ba21a871a74ec8c35cd48a8ce GIT binary patch literal 6647 zcmcIlNpDVO#3Qh)`pfnBrbC$Qu%aLygxP;mqso>lLibME(jXSnx0-@I}C`oF)mva*l|OZj=GdI2Rd6JwH7Uy&?1oSdH=9Yt*OK`tf_xmYdY zN1G}ZYnS(WZ_f{c^~Kwhe@x%bPQJfNM{IGN(DVFRAi~~eZ@f=#`FD3d?f2sSus4yL zFBh{9Ke`kD^H-rbIo$4rK7Dd=`TY6f@boZ{^N4w@@X21dpA2RLRet=tv-MkRzkKt# zw-)T>EY0)5XqvMmQM)_g-XQL6KHW;U^X+6S3O4@oi-T9*>YVyvsxIS)A(hA3#q?Yp zO^+snqWUfaC=QjE@Bu#9>n8ZW`&3)9f=&yOzuTx z5`{9ALNZ1fY)Veh57P?XYnBp{jo6ru@*?tSmQcbuWl5H(DB_c%=T}w04r7sz#{BV= z_9o?kj%magkW<0Td+vu-5s+~i@G_t!5i(5KNKJ_^(gf5PXhPRSRs|XIi8x3P2Xr3L zY7|d{5%{v=5wN5JIUy1i2BgS6HcLHK5t>k%2m+~S%0rO|$(aC63KbNkKT0OFU(5#N zhz2DeC27c08uLuX4CI(p94I8DMKUDQ)XOR&(wLMqR4`vIVaADsv4F#bOmjLSMG^GJ z^L;jpc^=0lk5V2pt`wpefFM0=bSb?kg-nSQ3g$eHU=s z_`G5s)C{Rm3}y#FXc}NpF9}u2JUM1wp2MW2FO*<_1VMn{*IU95hLEc;9%lppFzd&& zWJoI&F`=+F1fsN5Aj~6PrD2rk0c`g$I4t~7WgPYm|0AO&Sdbc8%S6a4Ib>rtfKxD( zV;PbpMHJwm08kf{3qs(V6VeQZqDYh#ETTyQ^8<*$v0&pk0NfpxrE#1lFikaz@{C0A zalyP$A8LUpg)u;qm@7_|1aQG(9mifJT)IpgIb0IXCCF2*QU$O~!f98^c7p$L!NgH= zhTDiPyc8)E2&V=1%P7LUQ42Rm*NfX5s}%I04XWEftRA!er-?-ELR}Qjp+a?CIxN6x zK|y>;VW;7=3+N0E031((f?z@z&x+0~6&_$rjYCk10|+`dSs{XFKqG;WBrr(aaG)z) z8onC1>Oi_77$IcS?dY=MglawAga%_SJ#mo3^9zFbgvv~6l+#%?8f(Sfwn50}7CR^) z!wZEiz%14Yb)mraWqV3Ig8I13a+K?RD|b3%+MLDOJ! z@uM2UCjh=LS`epcBwb!D2yZok)N!mb5mPu2kXpZ(I=^Kg6?YfUEWT)f0t;Xm)``); zA7WtCc-G;wLU8CPXfR8?02X%&&j;wiJWU$gh>?bvK4z{>l(5GH0C+(Jc;>G6796*| zPEbP(SPSC8gf}1ifiDkkwnpj}8bLe}c<9XGb>|P);b$|Oyx{5sfgdRlG|gxTo?yhl zh3(?0fjD?NUU!TEeIXDoO*8XBg3)kYIzgR4gYl+&H-a_LB5P$VTIDE;+iP46cVLsi++E`}z=kch>uHb{1X|-Pfsl$906K;y)U7zWM(Wo|7i<`Hzb1)3c8U$ejUY5bA)v^!cI)an!syL`4BU;Dm zk=6VbRAJ9UX z*UNE?a3^;wd6U1fjBK3}-Hu~D1M4~t*jcNUor+ntUI%)W)71o){_lE~Mi*IEeFfCy z?qsX?p|fU1EYc;grPq&^P#fuNprP3aTVfNm+tbE0i)g{sBDGw{Y{ZvJeh*Jex;58( zCq-M)01c-uMZ1=QkB+3p>Sb#;_{IWKOQD4}QNwJ7JMh-3N!}(oqya5^7&Yi_*;b*o zq)jVgSDmDjFuvuq_ZmWNrsK839V$AtiUtAS1Ztcy49?jtR)^nhtwDnYx{Z%1&@-vt zW47>Jc1>(abOmdwNq{(W)#HKGE@F#tjoXE#(wu-Px$7n%6fUbVK7>Nr-atJv8ngyXWNX2^4^vxKk5+em0p?RH7a%&Vw~u}Y0q1GPd8(0Od=|MvI~G9ls= literal 0 HcmV?d00001 diff --git a/clients/2011M/content/sounds/SWITCH3.wav b/clients/2011M/content/sounds/SWITCH3.wav new file mode 100644 index 0000000000000000000000000000000000000000..195138e013c413d77b7d683aa4f0160409eb29e3 GIT binary patch literal 4628 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 hfOF>AB_4!SFrJ{|86z;KTp` literal 0 HcmV?d00001 diff --git a/clients/2011M/content/sounds/bass.wav b/clients/2011M/content/sounds/bass.wav new file mode 100644 index 0000000000000000000000000000000000000000..5f4b7913ba5c493f74c13fd17a7fc50ddfef659f GIT binary patch literal 6380 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 V5s~uG_^*-W0>SN6etY$;{{iL7ISobfhSus~{px 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 literal 0 HcmV?d00001 diff --git a/clients/2011M/content/sounds/bfsl-minifigfoots2.mp3 b/clients/2011M/content/sounds/bfsl-minifigfoots2.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..113ad8fda380e87db01d39324f50991f4aaac18c GIT binary patch literal 41088 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%0AM@E0k08` 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 literal 0 HcmV?d00001 diff --git a/clients/2011M/content/sounds/button.wav b/clients/2011M/content/sounds/button.wav new file mode 100644 index 0000000000000000000000000000000000000000..494e475009b609c6c21f7bc588f7f811fe181175 GIT binary patch literal 2446 zcmX9=Syvic8udPP_gg>pYv-|FdswSGom{Um2Co`GMVy#a24$wIfU2SfY91)&8JPq@ zR3H*#qDiki{Ioup#bPbKI{Vvu*E!$XhwU|;PWscr!rq(Rcb;JM#h(`z7JdMqrN1sb ze}7o`S;3lczrB4_x_i-ey&A z>b||ipo3b&%^rPpn(isi<7BfCuw&J7%mJ4hjK`m8r$RolQ;PYSMvd^I`6}xR%SADG zO6O$A6HjZX4@ni+5G~5bw6r%-6$yS=}R%dWM8uTuD?MhZvcmfFpd@j4iVma8|J#aYPXQ4R7 z3Tm-_-s%pnZ?3OKqsw-!lvBAx6bham+boCsW|Mi}Vm|_VjZ=KOSZ%cWqnq2?@%U!Y zZPp4Yjzr;r=h$vN*xBCRG4CBZ+_cupLay&coG zX~(>8J2?v?30BFL8lB70?c{DYyPE*sMo|;Uc*N^;SawaDMuTC~vM}T$9pw}C=cEBzK5Q0;3)#k7@d+x8XX?vFOzzWu-(JCo$(P#pIA57WsnAMSo@{jb}+P!%PHMa}T${;tlvzPf2x zcN+Y@GX_=i`NpVre|7V8{d6}T4;tN+rogn%>#^?J-tTO!n%`~j?j3u)IKdRPZo79o zx|xnfx7|UbT1jVALEs1)j`$q5t@o?Ti_6O!CR;Er7uz>?_YWVZ<6ftd(|C?$c}YrZ znXDpFQU8%y|90`!%cYeqyN^)Iz46DV&!1;EgJwA+u?)?yf}&=!nUqAw{l|M7y2V$o z7Ij-zA1+mU<4<3{KHg7;?Mhl=Ns^>lK~AMJX@$c=u6?6!={3L_tzJy7TuvXpetY~h z8MKPvU~v>pP^^^7=5lF?j(QzC>u(odFRmC4&rq?{n|%KI?d!v2&@9MF41wV&M)7K< zP%dUA5lys6)Lq#UZIgQn`uM$ zZdJc~9HO+w)$Gf+Z(n9t?Shzyc-=0yHyo$MOsP^SriDbfFpeKYjUl-Kl6K@ORh`j+sNLDuZ}%4(V%u2yaanJTu-R%Iya7WHNu|`i{SLMpS9JzQRO>zb z^2a_g_8^ z3xs>~&Fi1mEx^WTGVWKEM9Aldz~OZJ-Kv6ntve=*m&o>Kj}NzX&Tn3My|}vTXDfrr zczB+sAfGpg3I*WfJjcSW!`(v{B36fBdzxzOXmfRC&Fsds=5RD@7X>U52t{eN)NC~h z0_r=mSe;=y3rt>j^K`(vxuG{Z!60`o`>mo(!oeVfv0ABCE2_zu-*w^+U}CX#Ip~z6 z_^HLTy>}EK)M~riENjVl7*La9uG**-WD53zA%#e#(!S`_GD+BN+1t0DMcGWXd0x$m zR1AU;oB@$o&Z{gI@tt`?D63Uk?emgMgxxla%@x9*$%-kSh(@4jf>U#)Vopw?VegqA zN{G2yt5wg7SiotsI6M(jF4Tau%HRkD#pcOeEM`DZgnixs41Cp^&1z;o{|@`{8BEFf zO0|@gnM4eUq7@1kH(xs>*zl zKx5H3PII!B0hz=S@klTjLNJPxQ(Ed7jbk8Mz%?aHe3HcCu{cg~65s-85=A1RFpQF{ zsH9X`U}*x!6BNUXvMkM&(0Cjp89_;DK$*s4P$UA!!SyJoQi=%Z5_p0DAty?bIPXQ# zxid+fug=LK2#(Fw6jhPt^*~#|cmhpqYQ}24V@2nY;jkn@!RbNl_qg zd7kH(Bt;SgK_yvE5Cu?!ZVbghf06_6X8?fHNrvS>pnr#x06yp9*(62a01n83-24Ia zojl2Yhl7focLVlkX$r7ElQZ00olOFHiU#Z)2gv8mbNF2Ac@=m|5Co6|Prz-$BxxEr zpPOOlUcj5oYX+>oUo-9e1N@I#Gw6(KZ;hLO0l(k;{e=#8yI+{Xv5@P RM*jz}x*Ur}!=Z(R{{sL(p*;Wq literal 0 HcmV?d00001 diff --git a/clients/2011M/content/sounds/clickfast.wav b/clients/2011M/content/sounds/clickfast.wav new file mode 100644 index 0000000000000000000000000000000000000000..08cbbf77ce5f0e152b2f8348403d5a81a02c3b52 GIT binary patch literal 460 zcmW-eJ8#oa0EKThBo-!+Sn!6#1PgPcsHQz`_n26Tg6kk^cZzb#$a7ecyIA(yIC+0YEOfwOpuK$|V3mBF@q^aNY#C z0CdgLwAgV)ZRcPxp5?f^j#d`1`8W5lc76KiTcxnEeR`vKtp5Ib zXYgER^7cZ=*V=pc?$n&m9N$=I{!9I{ee^E(G}C_b<(m}clNC2 zK=zP{T1dhGiU`swiAc{XxL8C{$eC>ikgyK!iar({7$V3#!aM=75SVnS2t5z60i{8k z`6%RwhLRA>WylGllws%xoOLOuk`lx)=AO?f#}urlH}Bt$A4q4^wRCDNdpX|8TZ(EL hhO*hP>$Xm|D>jn%F2*!fE$vnmRcl!Q{0D6Q#xwu` literal 0 HcmV?d00001 diff --git a/clients/2011M/content/sounds/collide.wav b/clients/2011M/content/sounds/collide.wav new file mode 100644 index 0000000000000000000000000000000000000000..ef4b9ecd529a28cfc0806e5786458b84f2be5030 GIT binary patch literal 11070 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 T&oAL^k9y8U>%;Bn)Uy5q$9fk( literal 0 HcmV?d00001 diff --git a/clients/2011M/content/sounds/grass.ogg b/clients/2011M/content/sounds/grass.ogg new file mode 100644 index 0000000000000000000000000000000000000000..ba4961448d413f01200e0c9751068275346d76db GIT binary patch literal 4518 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 N$`h1#vQx&4{s*c%8B_oO literal 0 HcmV?d00001 diff --git a/clients/2011M/content/sounds/grass3.ogg b/clients/2011M/content/sounds/grass3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..4e5942d194012865bdc74bfc7b4f5439ede63d75 GIT binary patch literal 4744 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 XM{9p7M1A_rP33Tkl2)1`xV--d!KQ2I literal 0 HcmV?d00001 diff --git a/clients/2011M/content/sounds/grassstone.ogg b/clients/2011M/content/sounds/grassstone.ogg new file mode 100644 index 0000000000000000000000000000000000000000..f05f1246bc23ba09041e9a893822089377c3cf47 GIT binary patch literal 4834 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 literal 0 HcmV?d00001 diff --git a/clients/2011M/content/sounds/grassstone3.ogg b/clients/2011M/content/sounds/grassstone3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..1dd8bdfe6403bf437e83ad0eb8a24d748cf56442 GIT binary patch literal 4930 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 literal 0 HcmV?d00001 diff --git a/clients/2011M/content/sounds/hit.wav b/clients/2011M/content/sounds/hit.wav new file mode 100644 index 0000000000000000000000000000000000000000..33d009905a0cedfd0ecc1b745db7858243a292fd GIT binary patch literal 7092 zcmYkBua9c!8OLW`W$QNS6(dGW(h(yN2n0>&h9(HokQRYBn~(-U6T}e+#1SMt;s^u+ zfj}S-2m}Iw7%^f5;)*M-Sh3=Y75yXn`8@BTx9{%WI|JvuKc46Ne81o4-M{_yr=O00 ze0ccBpa1@sfBq|f{Qbkj!w>xPhd({Ue?L6@?qU3M{`0?irkLl`>0~lx@W*5_8IQBk za4;AQN25^|gCB-Ne$B?ySw3GBMX^}S=lRU1r+l%ViPY&wP66 zm#ej7RaML7Vjl0MS7$j-#F#U$k21=Vhw^;J;OqE&$ydzkv}xoq{4(BJt*auR4Ez25 zFq_P)-Qlp?RONg;>~(wn(Il_7$J6P!Ul+6Sa4;Ot=Ebs@vvJm2&UufArcAZS$NhGz z-5reQ)n@A~tHmUnu#Fk#W#04kdOk4AWSTG6n{~;S2w&FkG+tht-BDg`cH7NrnNKEp zxmvAQ^|0M+xBJ8K$d1azbWCV_-ENol=GEFSPHb#f&BudItMU5${L<_WXVw1l{_%c2 zZi)#{_u25GToK(>xtKYF$sreI1KSB55TP9i8Gwoz+q3|c_`2!aL9YCmX@n)atICxRkzb=w_D9-!{K4FX(Wi4 zY<9=X`VzJ0x2kGu7Ko=856l1b_yfMUo=p3%0XfmRFw%cl!LVV(lw#`Wki90_A(F`s6`Uc1?NeQh*bfRrq-BVJC0 zoJn`6uLYD729CjAY|C%FsNcJmB_Xwafq@6b$cMmzA4&4uVdv6 zj9hTAENxQj5o{1ina$=*!VH3em!W$o5bmWurcmvGSc(aj4qXULTBVl*I6A_}AgF-w znORQq)Pi765lK;E97JaElVIs&5pneuqfBN)7$Oym(RENi_|PdfINaq<-61R zS29*pL6Ar~P|~qfu%TtCgi{>ZnK3fgAzuM8Q3r^>D_mqSYQyjOvSv&5G_k<?b(G{SQ0@tsv&KE#;}HBF ztllgUiuCdg`gi9vf*w^9?-IDQGm#j|p&gKvfk$FJIK&*85~9!JF_@E3IlxE|pdd*L z8eG%PUm}o0l^Bt!M7$9h667qCS1cTrbw_nhD5p*jv5v%$`d}6%fErqt#cV|B`^Jck z6kwp3jwBXq5lu#rkK1xO=(Ib7Ng+NKA~ox^o*y4yS_72VrB}stk}vTFIEg*`rr4zA zO_g*rK*8f*QD;dgUEc;&iB&Q<|LjAoZy)Wh@&WhhiCe@-EJRm*AvnMMMoqP zjqy+pWvis9Oc6q98QxOty{c z6*HvbODZ)9<~lq^n4qwd!C*^iB7Can_1^@mdyI^SJQ*?^)Z!lf;VwXJ)a&W->FL>e zLNkHS1bb-Y3YRVy z?oNo{?RKR**l3ESB|4GB=)vk4KyR5+oI|6<0Va4Dje_;dfE)#YZ@?m$d+I1$5TrH( zlgKFK0BB@tCqeA6G4M7^dgBu|GZ5R-^rH@5VpgPFQ!$ z5FHIC<4_VU#3q-pOOxq}_0SNbfy7h4isY$KwbDQ~OIbh?phztxPeUag_cT&G7S1ot z7YE3qDb>!f?`TognLBb7PBsizWhw`I*dO`hRWPuu?uQrDZBn15&wj`^jI+g-yV()+bO8{>g zwm_B0gl-S?zld9X8=;qA>w&@2F4Ca!4>N_jQVAOKILaX$EtP5|7*FG;w9h8k;wGN( z$4^g<9u*6qN+uD;rfd;nYxA3l99M7wQXmV_Nk{>g6B0#K>#ik|AgzR*q=$vZGIUoG zAclg#w$OO#4W@-fK#@ihYp<@uQW)mm#Wq0AG({W5T3-U7l zNacWJ>=c@m$&fOkla>=uGTw_mh49cZ#8#ZcP2d6;ssmqw4n7Im!gtq=ToVHWbWuC@ z=~itsi8ecpP*ry5yMsH05)XD(is#8B1)uQ=^qQV#C5#;)ZDEY`P5_D(O^o%(

4* zt%w&Vm55Y;1-oTuoYDc7hFv0f#C*Wz;Wj|AX1Zw z!({S_+q=4sZrW(Lmc)l}X8y z18Yfq4pC!Y$b({GpGUV;&NH24a^o6jwvIi#yb(T1HmQL@0GDE?02@LQmf_RrC;7Mn zX!L(koG=PFrt+xWn!WgW|xwV}tfHFg(qEFUWMHgmkO>mHpAa`taPhZ)eBo`C$!<3Vr zFa+8G`bACxplsY%T$L3ob|$ik5j&N}1W{5I*gcS;pUMX4rDvqRgpE}e#UFmzysE!R zJz0<7hNx*&CGsL@KpEvw@CMCpN!gH3Xb}Lb<=!v(qHaN4bBREbTRraIb}0HAsHB-d zz^PFH>(!1P`x<2(em$`ZmL2#L8*!7|2XET`n1M0vvJDt)jC@2+O*iemiA*x#PK_`StxZ(4Rmu?9Q$-Dn z99Ro$a%<{g^jH+InOQ8?dq@oPE6ErtQEGz@2-vMrG}jEEU! z<8pd(vqs|o?)|(Sm;7{mb=A{{b;o3(d;D0fQiICS`4FcxRk{1^fJMj zo8#LDwknJ$_;SGT1e*V>aL{CNLIEHW2vFoXcO*F|G@=S)2w5;>k}6siE3pZ+Y2d;m zTDkUHP8b;0EGG#JBdfD8znqC7gz;5zGeg7?z5%d^KE=N!Gxm=~q-UsIE>FwW0ENP=dU(~lI+-#O80@V3 z3!zC?1EsQPL7c)CXFv~#)0Fh$P~p$eMiLAbwb3+Og21ftEtRB5hjrnc*;LDa_laSv zLVviDOER2xq+>9)Ldlyw%FU_C4S9lBb>%7bV<5qYx+u#+P4F7j+gn7aAT=bxNU^5< zo+-CD5JmwP*$Ggvjy77utE!L%`%(%!p~PElB#nLTdB>~1^*;2C|KV^KE#T}uj9F$# zY6MEp%oiwE^Z?Cve>~@jSzJD1*`yMA&=OXAO@byK=f;MY`c8RY_75?D0K%FDQCULv zkc{XxViw#7{+ydn{Fz2D?2Yb?ECW=R;F^e_AZZ>sx(1!7DMVt`KZo}KNoTmX31aas zbATk0DzucxwF+LzXs6_1c~oZ+fhBhlR7xx;*1pBV1lxw_K&DbXr4dF$gS6mIH(VxD gh;OeOWKp;z8HgY|3z+xtxLfuPs{K?7D)WJw~5 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 literal 0 HcmV?d00001 diff --git a/clients/2011M/content/sounds/ice2.ogg b/clients/2011M/content/sounds/ice2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..ffbeedfd364e9985fefeea50b9beb3f2c1784c37 GIT binary patch literal 4704 zcmbtYeLU0M`~M8dL%EmMLZcBf4;8HkQfZ~`jfL3h2cX6s5>y zEACpXQb`XKOJZheR4T0~g(T_Wcc$<6{=V+Ne&5&YdtT?9&vnjqo%gxUbzSFS^NNi0 zg*2dlrPIrP68e_XaFiJ;H6dwBbh5e&W#RXe)4=@s6`{P;BmYk7ktoo@t%RaxIQ;lK zIcoj{F$KJU=)|Z+UP+Poxaci@Q_y%a-f77a;*#Y~&T1sow4cIQ(t1A>qys@&cs=8$ ztcQ6p1fd~_w0~oh_ZhBM;T{fp(;e@9d86JjZ}2-Q;mt=sVq(!Gou}z-*TKs-9Ty7Ndwmj!plmbf(sUhoJ0r+QwVe$ebxqHQwEy%fdrh>XmOgf@wa2Yd&I0 z7F&9BShkJWgX}eXnUAkK%!ZY<8Op*8>|g~Ivi%io=0Ee)((x$h z)B@+jQ#pSDAzvdq=bQ$#Rc(@IHiw_D%wOQlk0A5Q$wmE)lK$ut>zK0XQzF2FT54^e zQ#QHJZ4NIW^99jGDq)FDZiPrx7A+EqiYlW2pX?TO&lYmifZXnG$KCb8ff}qzcgn)| zAmGymZ_K76IOzq;)()^nV*Aq7{#UiRQ*2KkogJ$m_(=wx)kHVmK!jkuVCeaH9Y9#L6FXdlt1%srM1jOGrZK?E4> zHClh)Ty>ngnfCH{K?gY+pUronoDg)x9B@2MkMXEoj&`A#*B+uBsI7VIV^_<6qz9Ii z2+Dc1-b}_UXafpDH{k_&wEd2+@X2V$rc)7l#!W`q_noJiCSzzqTuSFU^2~_)&f2AW z3}|m~umOo|$_Cp{0|$zIHi#E3XuAfaP3|Ci$XwexT-!!B_`s`u=&;8}PuWr`Jm%>O zQ{`Ny&oZQYWP|J@Xs(vg;dVNrAi|0kTUm=dO+^@&SHnD(51Z9XXEOYe z?oZ5aNd_4M!}KX(Hms1dWNdb?FWkM1>CdMsY7qsG#pEG<3OYR1l(7*dkJ;;oFfO?( z#@H~Q^OTD`Eo3prkzT)?b~Y=NhxD#M7@v_KY^uK^Bizs(9;3slAa0p5HjBw-D!b^u zscK|jHo^eHJD3c`GMI<>@>$9hCc_WuRxlY|tahLV7wPi{TxRd`!$8mQ6s8(^9AAkYZPM{u!IxALtZF2p#kyCxtVS33}!775r8O- zQlGBK=^pc3>ryIp)Dr}{d=Ax@?Lb{hZIyZYjuK@=SO!yNTxvU!si0Gpb6}Vc z`|}Ywo6R6n{jso&2joGM$pD$JhH3+20Ti9;znm&(JGA*yTW3=hv)y5s3bUy&j|sT) z*{kIrL3~jaT-X;zy6M!Qt<@;d%2f{Z z1W;^5I!c!TWVvfQ9ag)Y&g>p>^&JDq-~gk72x7og#vEA2hhaG)qa)osM41XJc)o7w%UMRaag1wmRNdMp--#CA$a)z#{=%CeZ2>S&R;N+cR;sjiw7+bhMDqUzW> zk$thqRw=e0tg~0%s;;YM6^rZ!tL5XXcalP%;`k@wa)m6z^X&q~_KC(z0 zC#r}8!=&Q3k0lP$`XxmbvBlLf(u#o=$zWaGBB_{lP_4m0okUn9wwH?ENyTwWfGdub zO5WFr~d^+0~8MdEO-Iz}l@n2ck}VQ~3r8h|Uzn!6k9VhzX#g0dVBIck^s zv^cBqM2fQt2aW+9^YVP>>E_w_PAWV%pY{ruO{3|V11i=WP%%|tkj8XyCCnpQVW)#= zv4ZmSps++7u(^TE@sbC`0l>H3Lvh z>(mTDW&aeR5UhSO{@whS-2d2|1|4->3AtH4T6vq&!RU)hEH$@7W%WRi8{w5vfj7z4 zoQEda@FLJI3$4mK19b^ChPJOyu@93d4z+$XTPws6ygafEDbWIMC#4ymZAc=RXLEtF z+5C071gp$Ae- zx%q*>G+lu%3All}f|?FWESOTwrPE>^YWZr4 zA804wa)F3iPFUVa(-Uz0D0)HxU_A3D%);2k-` zZNrA-nFhb0XBp1M%)tVnzmvw)(^G4f-OnEN(^LI|9SCJTpSyz{pA?^&nj8#oiwufo z2GQ3o!lF0hE>oRk{4zGRD9OgC3$s9H|RZScpjb}-I#5j-M@BZ`1yGoMF~1%8|KWc{!!i7-)}LZoE$)I7V(3FnPXUX$hIz3#;l#MO!UrG zYY%FkJ6K}L-yJ%-Q7@&vz_OvN_3HHdk`ex$=S~_~V=-3*Z&$o$`Gr*|-ka${7U`8E zxZP{&uME5+o@lpTw`XG3VT zY06c__m+IBxoseP$z+Hv2w!{rEU0BNVq7z16ksCj=m<=hw>n%pKFritb8g#$5`DQ@Qor|*!&y_r_a2BNutQ`(2Y`wJg?rL7y;Ly>ohcjKI z>#yX3URu(>Oq_?yD~kGbR*&9rLTkftLC3{+L8+u z_J-s*i|jH?w%KqR#6y-SgAA9T#RbusNXMPc(FYttUgNwP$F2U_r+B_BVe(T?Z<;Et z7sWAQ+{r2ml z3Bqa4Lv9(DMz<)#bmqcZ=6E4}LT-RfzSa?9&CU!@UC}(i zeL#T;p5MQvhkienS{Gv0^(8FJ!5{W}e7sFmZ*n%6@#dUx_^1Y{y@J&#x+3YddPh$3 zTug~1MkXH_GAprnnYSygFU%X06GGrLUs2v9%3E9VIg}XlW#04IHttf+P|Wt#Em84W zh6&yi8O&V1m(`F50LGVKes3zvCaGdS3aZDswFD;uc!j(3fYg6Tjeu^0SF1+`AR=+FN@j z-bm5&c6s@>i(Un!%{n%)EumD~^R(ezy{vgF&V4&AeMg%4t0ytI_G5&|fXnNz66_0J zK+(c7a_1+VxUo6OombO%<{(TkorL?|_K($H2wyVBh@TN&dty@SebhjjLu3>>c*USg z?e*PVjs1-^48NOw&#rp+wtMe$U$-++i7xuZKuqRr-shhTVSQJcTbbg$}@3W3~#?PvJ^5H4} zNusf*2ItlCsN@q~Rt@;IqmAAQ!F*HZb)xuXm3yv6z(tEfZLH6p`3kh+VWYluU*?*~ zV;qB5myWV7A97>h#%wB=F8U-WKnAK#H`J7l`3XDo$2O#->x-IdPX{j)-iVrL+OO~9 z5SaF!;F=IVp>0^!UYW!pow_W4J}4n0yIZSl$G$vlFPyFgnXEk+n`zfS_JMjJIzDLR zrPI+Bf7vYKNcr9y@{&-7Hv|5fGMaF8uwhZsxGv3piuVMG<#HWbo(<`Hhpk zCIhQH9R-J_{Yh={s)^5^NzC`&&czXX$G&t~hg^#y>U}_g-}AY9FJ!tT-duZw=x&q8 z(Q!mM26c74T9J)uy|<*{`%El{eqdc$v7|!?L0GRvt5eS`4&5)GQDLmwvkQhJ zGl!Hij`Mm=lEUG7d0eH>kM2;;Vh@jc-H*mu?-$MY`gUx^g5tHW3o3l#lP#W&_>A#C zSp2o#*7kWu6|g>%h70~YE-(D@XZ*`itFtdtY^sY<+HsMIzB?JyQe1T0?XTU})$Ac@ zgbizVY0gc$mAI?4?Lj7^w%SCgd83p5Ea&X0{eIk8eSvnLAjQh+5e<{|3w^H@vCS_B z+LB{K@;$XFy-kKy!h#@=G@Y@Y;r_Qh*g*urSP@<%{PuAvhV-YwwWXVJS3jijPGz}i z;?aGum-&Cdm literal 0 HcmV?d00001 diff --git a/clients/2011M/content/sounds/ice3.ogg b/clients/2011M/content/sounds/ice3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..d634f1d55de21082f5e46bf0a23198c575cede0e GIT binary patch literal 4287 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 literal 0 HcmV?d00001 diff --git a/clients/2011M/content/sounds/icegrass3.ogg b/clients/2011M/content/sounds/icegrass3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..b53d5cb0163d3c136dd4793188c5f5e36f5f1643 GIT binary patch literal 4842 zcmbtXdpy)z*Z;ZX8i~OuGzuA)Lhh*;B*VDO%+Hv~gf!(g2%}OQ6*{RSF*AfN%D9Y7 zH5pD6oi6T<7);KP+lfL{IMvZPy?gXL=lMK;z3=Dq?$7@1S$nUwzI*Mp*1nA2ks}01 z8v0kcW&52_HtYfI49Qd8{nEL&fE9EEA{HI7Xr9e;D0g6~_@$H{t zCG#Cb5AcE_<0H2DB^*J;L>>%Wg+_UytSv2VEbXivB}h_hz6)z%+ybQ_1qezg-ylH)Z+0)>UQsIo9o!xB4kqi{}VJ%!B7a z(KWWy!_od7$nc9+E&pj0R@Z@opbS?zokJ4j%vDecUhDT|p`dih$~`Y5+Ar(2UpDmO z8+!K{_Ixx4)lb7VfZzc$V6h-oT#zb0#u%zk9ZF`93uxqH^!)`4l88b5@4C8lloWJh zi(}4e&D(;`lg`MxEe#!#xMa*EXTl+Giz7SSi(Teb^qPF_b>ubUsGIVuA|QgY5^JCv zCfO4vIa|EgoXDc-s%s|Mn;f?U;OVS`F&oIs0_9f_9~|@>b%u0VwAVQPR$8xAh?J>FR1-3z)Zk?sRWi3 z55BuJ5)`H^X;(xT7LM5tMwcH5L)oDRybUCikOGMzSbd&mBy;Q=x9OX*S zsN&!1!m1cAJqFl*(z@U?&j9%%3muh) zFm8ZJ4X~vReRLNtf$lCL5$+|@L^iN!nK;14kp^hJFheY$jV9B`KktHB^Z*8Zgh(Zm zXhVNchw4(j5HL(!6=uMq0lJXE7$Lwzwp0=uClb&^EIO4%8y6Ab)vl016SJrzfi!Zx zhiI7rvolATw9x`O^%HF*FsqkA4`I

}llBwEbGiBvERZx(B>Wgp)zuQiTjUl|dB` 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 E0FK>gQUCw| literal 0 HcmV?d00001 diff --git a/clients/2011M/content/sounds/icemetal.ogg b/clients/2011M/content/sounds/icemetal.ogg new file mode 100644 index 0000000000000000000000000000000000000000..41327cd4d0ab94ae0c3a826f4c4bd3437f95a8c0 GIT binary patch literal 4520 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 literal 0 HcmV?d00001 diff --git a/clients/2011M/content/sounds/icemetal2.ogg b/clients/2011M/content/sounds/icemetal2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..f88a4b2ae7c7a3ee531b155bfde781fc16e77425 GIT binary patch literal 4301 zcmbtWeLR%g_J3x)kGF}Tp-H1C@aU(G+7I%+y>BJ;Im}k4~aXp;9?wMv~J( zModvnMjhRxH;E8qOqwJWDxF@abgs@lzdhW0?&tjV`+YvY{n^ic*4}Ha?_PVYwO_XE z+!+F4p?{aN?z4oUT?ZdygGo);9T}Uf8Nw_Ko#nLfX8%&m7LDegMWcxUJ(4FBW90J3 zpT$jU7Gyr)g~ukwEZwquCpkVgGIR!-OeZgQb)~v`EcenNVRUANE&bMqVjz78$|U2g zS~DLNzz~FoAiu*KT7%Asv`-$$!3W$8I#e(j6!(Vw1B3sd+1ho^Rj=8n|x6z+j2N{C0*XdgA&>-i`fNJpW&n}A$WolL)aDwpQ1nI#E zJG#s+u-C48!Wq;p=I+5EG#G`|@(lIK4D}v#;A+M|D#|&DaP|ndo){pv5@cmB+~t05@^Ay3}!ss z27#Ei1Q7yGkUB2gb@qZaQhQdc4ihm4``~&12?7W^C@r5z-JeKXCV(pdVYj81%2fOx zD{!oMCSMMa6efjs_yf4Yo%m#YQ8WQi<3tgm=up{#yc1(~QMxA#8FNqN0jJR*Jjejz zLE`#{wqs?Y&8$~tMZNS`a(1yd<0naP+!434?6^R=2i}`uD?i3MB5!yS>?ALKi~~zb z1m7h*&X_X?^2b2jiVlV=~f&t zVZ9;2CVuq!DA;~j68N06LB421Nmxji-b)Qs_;mOBbWi#R!>fbYaNy@niWN-w%cc;R zsTA>o-I0L_f5m6eU9DilJ#0ipg;ihJ%3@}i66t|awHz5rML5@1!(w4DDja0=|JcRw;!F6deqK2i$pK#Y~kPQHg~-F*2-T!!un4im1iB!BB*Am8SZF z!o@j5B4p^KkT-=4hUWI5!U!=kxDw%fL$+F`hN&|6W;FN<8%_mz%Tu629?DbqvqMrf z$RQ}g0m6HD9F;pPMnZ~(>J%O)6d6$QIQ_yNV1@`84g*}?phrHilb^!VAWy-Z{tS*P zhu<%Z09H*g2fpMe#3+9%BdP@Dd9G1?$$%SkqQuBcRZc|sF5cYz-Dn0+jzoncYGUfp z%G`me<55asREco#^;>WLx18Z?882&|G(J)a`Fl}y&Ahe49{bN$OPhB!)qgrIdp9oI zWq9Y;>Gn^*)PFcHi~lZ-H@sOl-hO#{%}6pYA{^lmL$_My0)vpbxstf?_K$Cylm5|I zZ*+ATb$^7Fv{C4M5dgeX-%c>Rne?u;iwHrk&p|?N_p@@C$+RWV_7is9SDXV0E*)mH z9uN%z4VF_osqURCn9RvdAkmc;%n;Otxq{iL*c38JRZw9C%v6Y&Jyf2G%~V^!a4{TK zj3`l*LuH0p!U{2v2VEWq)M5=(H_!!8Y-X4TQ;E8ChcG+MnJRM{3^QSr35$7vt2AG& z{0#DosS?2Z@<0<4>9$uQ$JMm(^WwJm1kIoNnG(DvOs^ z#{;zv*}Er=E*;ITrPYGd^>H25Z`&Kko0^t($b?5V7QAh0tSyx}cgTM2kj1M3u1wI; z_@PM_-_hvuPUiHm8OXnHZ*;j(AE%ZjOvm$-Fu44*Ou!YkSd;~JF%}AjpiH-8Zn_o0 z?OtPKD#L4x1daiH+p0n@J=^TUx5VII}qQV(Q{ zJyd{$wkMK+&sAcO(I96)M1*RhCCD7Ght!t&%$bp`svh8OWS|j^@Y<|ld_{-b*f6IN zY}Dgy&2MflL+T8CI=#UjNDUJ6&lbk3n?6jpUcNgw_qL3EJ8b`OjW!l)F(*NpxcKn- z!&NcPmo#UouPy{_FJNt;NRF`>6bUhe;kFozv|u1|OZM`hn6^BK3=YD?F0Zk&@bPU4)-p3lUk~gOmOg_a5wRHH0M<+xX z{T#$mc<&|lRef9oN`sl>>vA;TkKrN@WjWd-X5i(KZN`X|i24{0$k}Fo6x(bOFgCk* zodHD@#A4XXAF(L*2l0Nf_En)Q0Y$`S=}M~17>wG6ewHIeZo&wZH1u8{W4@@6 z3tZFBb*Pi~d($Ni1>C?oc_^16Nht=i$@{r+brKQRK+@355P&H)TsBMKA}`iZ#at(e zNCZSQaU zYk|Kv)@FyY0_%X9V{JnppsHA0M~Z|6L65SuAm7Y6V#~;LR$(?-i*Qzp%fU^Khqjab zqOn<62iF1&q^EDdf_(W|6)6>leuv3CZH`ak@ZIA}c6nB;H=KQZ=tJq?9ckq2@1JaJ zVv3(*W=^oM1VDcl?99_sdydoWi00|3dBGl*Gz;e@Byl*Lt(!Lm2GBOF^Yithx-GW1 zvc}~V5k+Rs#?NcRX*wPe49e&D2b0b>hKl~U(&s##%%A?YO_KJ(NPebu)oA{*my_F6 zU%Jq5^YtXxCf_J8we0wE@v_raXzQK8@3zPOo*O-~YS*K;@G-Md=>)osvy|~n%F2rh zf^Nj@4xD0N(RG80j}se0e}Fz-6J(BDIL3ls*V{K;qg@x8U%WbjzDgcV40SgOxn6pV zNv)q~|D3euZ@2b$(-K(OD~n3#+*fsxYqQ4py+_k`><^UqTkcJm&T#wv+1Kf94fW5n zDo-AWe7xzM)5qqT4_AKAT|+-w+He@!kLU_wjCHJSR{LX~rb{0@tMl6b4E^x==%lA| zl|}AvMmM*Fl;L{r4BV@SRKpv@%87ewCHl2UmJOk z|M*{bC(?4x;ZL5qs=fMBOcj69$=)Q~hL~QdrMH5R^4dmU5bZ}D%PK$gei=ba%apZ~ z!5GoK!Yulhq<8S!J<*jt`($IA_6~NX)0CgOT&mk^BQ}Q@3f$8h=6IdG-1GVFpvUj` z)^C4SUvf9S&ZGf*?N_7t0HYl{)FAa)!JCS=-|IRANnrF1&9i{m`})_jOqmhu93 z$#Vt9I%2cU$z{;mwuSH0OLuShgt@%&_ahMev)PuzSB@@=c;j`cQtTJty`RcgXJ+L( z?uw%(%0;j88b34;xj$R~^rNfc*Zitem|s>fwIJ)Tap`Y5(Q*s_s+V0C+61|2ic5}n zNG8)3&y4fh6GSVI8MvQWy32G4L|Dj-aYze3Zyk&4LVf1Vi@pgcW$c<}VcgA<n*F){%!6P>{gqha_pm2)X1Xy_Ddf$;rbg&n#GOA zi_y~G#yU|HlVkn5mGY>wo`&X=O~P*Fn;a~O#)J=N?)o|bS<~-_(-M#Ph-psy&zG%R zKDZ#zsr1lAejCwhK^o5v9xB+NWa`k-b=R}j;Sz)v`7(NJ)^A)Lzmh()OB*t$)x3Zt zbBr}zRe2YnL~`NfBSw#puMCSxOO7xnlYZ!X-6pv*p1q&IMel1Ccn6;N>5?;b*=jii%rSPf9X7mbEzl;45F2dLERtg|h|zxzJ7IZbl_`UztGJM5u& z?k8A>JZ%_szvkwF9UiK^K5CO80c%RT^y!AI1CHAgHh$cm_I)J1P51H61r8VVR$0>) zc%66!6dBvkxLK61x&A3J-hL{YK{4rbin>39$JP`)%pGu7x9n?iWd|9SZNr>~tk*}( zcl#Ii$M`&MbtT=~@=AQ_jbabpQL$a2*2V)5`do8=wv_7)9xO2pdR`Jk%GI`}t^KG6 znR0`5%2$+&T~a)az7uy7>>n~enq$2`+PGpNbMuXmbwGsJHFUVJH@jvzblhpg)?n?s zqaT(0&rY5nO}q4r4WPwlV4)EfNs#IG&>av-`?$%*7T5Gh7S#Z+(VpuDnUXDZ4nmP; ZeVKe4QS~FJqss^+$xS*0 literal 0 HcmV?d00001 diff --git a/clients/2011M/content/sounds/icemetal3.ogg b/clients/2011M/content/sounds/icemetal3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..3e39ffe6ffb065a4e161f3e2a9aff459d489dfa4 GIT binary patch literal 4560 zcmbtWdpy)x|NkP_q;Y9NqefATOXLz3F_8=tX6B0-O-Qq@gD?syY0y=rnPJ7|He`x2 znb9g;RD{Z98q=5++I1;vi=@r&Z=W+f&pxmH>-T%Te&=<*=leP5^EvPHxt&WubTkoC zg#KNs9hQleCOwe~>lMuU>Te82~wiA{5%=Rhzgr>_>&80ot>T50)ZtJ>Q{gQ&SdZI^6_~}V# ze1pT}&+&oX`cY?XJO10KE!lyFAf~5^!2vmP-V&%BuXEWfG?XK^+~=ZR*F{v)5wSDVa1FP34{92x@0<90jk*K zT)0$=HklVGGV`x1LI>n788s_><5aZCnG@y9sqrlxC;vDe`{U-gD%B+s5Wy94ZJ-LX z({IcQH~Dh7v89vsKboDcAP+^zqw^rDGYAD*V3qokho3?q zrVj%3d@iDTnoOP#02}T5?c73G_~DoEy8i?LgdLOzpHRJ@Pyw^R6@V}a7_i5S{*M(n zmc5iOxhRoVkqIJKqbM4Yin#Q>9-yZ6S$dZW%5qO%oHU72xwsOy_J`BJY2FY5WPtt& z{hiN@C(BrS2)~wH8t{!pGdV7}a_&IfDcfpNoS(oE;es<3oF$wRG!F$?2sp1afJw>V zyNS?PMb?JA6d*(gntOq8(slx!im>gdh`M0Vq0fBgtZbC3N2o`oz4Y{574^(nr7~BG z@D>GYVSSAlVEZYez-P$>`LY5!s0gX}4%qvNTzdyxd*{4@V7DL=?DyGUWQT|6{fRJM z%%TQ4(4@0oqR*h~CL+Q8B$~t?mdumH9DInF)(zIrfBS`uc!5;0xGUPGwMKgCt_Q z9GS?Vk%90bDp}$HvuQ*QU6w{A2h*eyDtVCJ57c1M#zFv>I_y{o^o&fS%8?gf@?bVu zk{3Bh4+mN;;HC3ysL3MJM%xA;GyeKy97fD`tXd-p((OyP2RX~dhrOEWu zN4Don7tTeA=}{&0;i-2nkze!1ZfE~;bx7DJrblKlWLMYi7;`*YUCXc>@5<$l8-u-ak0g@j@ShY(_ysMqmxhmNIP%6mij{_m-ufo>h;I zcRz@Ro;NJ8e{S#a+zyYQ^9PA8UV|qxtnhaD=OTaNoV~~%7QuKC3*T=~m5}hVH89M9 zLpU@sgF&{(hah1Q8_0t$l?*CJ4%G|h0w@wb#1SuMSoIR|&vo$ExlcmEFwtOy7 z8>}m3P^A;yyz7~@<~_B%A$~oNZy^&l+-bZftBUJxjOFngc)SnYjSY)@OBw$vuQ9%r zXL*^2k?}33TPa(fnpK}8peQ%HwIK(1DK?!3a*58_NGWx zkS(Ur1q~=783lYUVS|hYIRhd>m+2!x=72pULl)wfM#3chz}+;dkP+^@N6z@d7<)>B z$wIJE&ynQ6wfQ)nCGhFuE>j>itY27Nlpt&UZLy>2@!I@$KB+zA=-Aa2iqHdH6qKWp z5Nb456JvQ(ewKQuKv2X5!Y*^}Spv?St53w)ZU!R{6d?2i=C;6?r>7w_I0%zpI8T

?%Vgu1=7L=_{v4xB>E5Omd~Mg+k8H5aeM#p?@h5 zi!o*+ux9Kigv%DwnwJ!H^JX2)R0X3Di?b306ELPU9q{sC>fmCzte3bhG*bs_Zp>r> zWtkjLb#qoA0cR@cBbb|>Kwx7{Yk~>!<}4CHgd5~gZo=2kK zj95h!;F>{-S%YBE#h2TBf#TO72&R~G(>P!?!5}5Bfy<((bDIZn@nA_gmqduS5^&@c zhho8Hv4DtNuD<3aL4(T*#%a`Z0i(Vdf%P+G2UB7J00C18)Bqxb6kH`6iL)?evnZJQ z8WzE?9{78AJu{f#*8rwr>YHBzs)j(pm~#mb)OTD7^2pIjlrct>h_ zczLC+(prts*3s2lg9Jc-7saKg=L&6$JTY7J_7DjK7Oj`TT6=z9p7t-o1k~;5j z+A@wb4opV28HJ3WDg2{}`|uMzKYfpjfJ-n*D&Fe1uXl*>@!|fg);W^?j@QitUJCOg zj{TK>e>|?5C&cL*?JXU0p;_R%67p4vVf_yWk}gk0C_(A$hGgBo??$ihu?a0_alB(I zZ(yP`OEX?)#eKU!!gg0k&URyOUadTNZ*kzYC|Of5COe zBTvlUbZvg|c;l>- zVqDc|Gk@KqwP8)JnxuUiuS6o2b^E+n{oi_UDL2+vrT@PyW^w3XplXk&MoeB=695h70thy;=3pNbQ&xF zHCVpC#2Q%>o3I)}25{Y4i3b`t3aY*xNjH3Ke;%JYZ@)pa_Mx#?{x*XQ!|7OeyOFlL z+il;M=C+&(e_Vd;d(ttxz)an@t)2Di$A0 zz3UyD>Ky7Uj}FvUokt>7bToRAUmLhW1+9wJ&wKA|t-f`BGQOOcRNk+sTXEaH#yIn* z^#bx4lXLgd1Bc%{ssDj(?6=#>k_^lW(k%4KRNgRVeg`=-7YrZVQxNv#O%yLm zc}{XuPW8}?>={jkgOQCe$iprF6@MVH6XEb&dM{>j9xCc-T&1~JfjUvu5w#5>r^YMFz; zbi9cgN*&QOv(&7Z^QiK;KUVCTqpf=C9P@p)W>>~e z^w~?CdQg_uhIruKCF4`k>)QkLA*ZfvmK zov3V+1Ql-&dhYICy1xcxAHeKRz9@A?R8>0s=!q*B^28MP?LMHGas9h}=ZusMy~BS< zu535PS`_*#M`+%1(fLOC0og-67I9TLxYOC8qMJ}sVWZNGLrtA+_u2wYG^=QAHuTCGJ9KT9$H6bQJ$tiskP;AH8YG^&0s4`mk zh%izUP3NC|R;gQ$mZ|_>gkQAL jLMa9+L$^117{~V6uWI#GGV=ep-q82HiDHftxCH+N#}>uc literal 0 HcmV?d00001 diff --git a/clients/2011M/content/sounds/icestone.ogg b/clients/2011M/content/sounds/icestone.ogg new file mode 100644 index 0000000000000000000000000000000000000000..dc08fb32a95a05eb601b44f87f0ee264c56c059d GIT binary patch literal 4602 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 QT!%3-eF?ZD|K_0o0g-+H{r~^~ literal 0 HcmV?d00001 diff --git a/clients/2011M/content/sounds/icestone2.ogg b/clients/2011M/content/sounds/icestone2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..9e4383f85f3eb4329dc6cadbaad1ad28f860b327 GIT binary patch literal 4551 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 literal 0 HcmV?d00001 diff --git a/clients/2011M/content/sounds/metal2.ogg b/clients/2011M/content/sounds/metal2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..1417bca67e498b0ad614ca0cce045ced961d42f0 GIT binary patch literal 4297 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 L$9aza4(NXXRa@=D literal 0 HcmV?d00001 diff --git a/clients/2011M/content/sounds/metalgrass2.ogg b/clients/2011M/content/sounds/metalgrass2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..70989b731caffc7bad2d9ced0c08848e94e7678b GIT binary patch literal 4561 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 literal 0 HcmV?d00001 diff --git a/clients/2011M/content/sounds/metalgrass3.ogg b/clients/2011M/content/sounds/metalgrass3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..b6a6dc9c7d58f2361b21a35348bd711dac44de04 GIT binary patch literal 4682 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 BJb?fJ literal 0 HcmV?d00001 diff --git a/clients/2011M/content/sounds/metalstone.ogg b/clients/2011M/content/sounds/metalstone.ogg new file mode 100644 index 0000000000000000000000000000000000000000..be60781a8ee49cd467bac1c380fdf5523529f63a GIT binary patch literal 4674 zcmbtWc|6ox|NjoMlaR)eMobw?Q3%PduF+U#<~tgiJ4r*9kz%ybwG6ox*D^CnD%;3R zQ3jJ#a!V@8Hpb8-;c6jiL-%U=oze5$=XL-3J+IeuUgvwhpL0H+^FE*LECG>`1V|40 zSGj2agW#>(n2In)B<(w}J1Rjogjh}b!D*%Z`126~vYCGu*-QlJ-8|*7L*4rO-^Et` z2gpjm+YuGNcU{1NNK|apZqgz&$``f4#>URZVS|$l39;mdu%4$E2>~fXP%27Qzdf}l z4~8Hu2=dI{+8%h3rEoeuQ)^pW;PJeVfzhu~hp=G}i$3YbXn87+9PPd}|LiErZqITE zQh?l%OEh;sw^i{}E<@f^2`a%Tdn$)Hsc;S$JF9rkqnKLjUOqeU_SU?yvIcnx1iWCQ zY{CREvPKod)y1E{R2A*+u)S}T@W}Q7Dns4*Rb`?723}=h?uLie75yPt>wCI{*z5Op z#MIcod>Rwjfeb%o+y0+MdC?9O1Tj4n_4mk-GZ#T+c=vypg@RILmT$|~eVA|bFyG8q zVCL6n*8RZ>)Bqj(Ac7CffTfKo($gu@gN&hTDMLvN@@X3RAU*UnBUr+q{If2ajzU1C zrcSwwwZIfpAjizQEC=n8x#YQd?wDhNsS_vMms9CmJV8D`5p{k|bh*-^2#BD9OdF`w z{KS}fuBk7F8&&+0ci#L&6`x-o#pm;jtD^p&>c01Z1>`OVx!>P!bU(-lw7@ErMGrrK zKulW$b+_dkb=H|Z?gKX3^={k}%)$-#!-oG30th=Ot?!Mx-x~#d0ImRpSwNp1PV`?^ z;8^xzzN8z8Gz-kM(p3v0wGy-nBXj{Zg=Fa#9xq8hk^j;xTrpn_yW-3V;4~jd3uFK? z1L^h1Ot&Mc+OtpBpUge zk7Sksb23L*w2{+v$~#wV~Un!?B7geoI_)?fbKW zH&cQ*wY$>`9q+H#&Ri12e&NTe-L9GHs9SKINT5)6(8x$qs9qLOh_)h&8$H$WZn9%-RcSecq6^DPwn>pH|>qE$;XZB$i7sA_BQUIS8*z_C+X)}-M0T(U#)(+CUOS3}h?6dd zVGbP3p@|s`vK=m14;Hb3Jm^x$pmJnT-C!<&BI1G_aAJmaHv#up2Pe_-fnglXz`<+^ z;EHv&h(Ce+!bw;#0j3QRaiI=45cc3kS}>bJPNGR2z(P22B25IsD66#KL9|S(k3cII zG0+o0F=(A1i6Ve3cIhR;vak~=LmylSvj7`T4ngmPO zvbjKQupBJWlQIn^n}xh$fmNqqx>FD< z1-OEkPT@?mAhuIz{YGH$QCq|rwZ+gHv&GFut7$HoBgD1VM?xjNz}>VVA%p7VFJsIx zMjsGivJh<49HQ*EA`8p60zO^XiUv}{$lQv8SZVXjLVI1?imW>V;+^1Qqtyy>P^*p+ zl&TuLW94Y&UaPCJv(#M?f_CNMw_>=b@K_8NNx<5!0VAyl2-V8m5V-fj2?zxa!uT$y zmn8}RZ2oy4{^w@=LFqtObwy2_J)D5%G%LN^LBb*D!#$z%*)N{kRPSA(og- zVhDC6s~`lpW+248rg6a8m)npR;#bp13c+v_IbgNMfsp7LE-OTZ+t7!N0ZYobM0|{O zBS%JYLM*u~77&ri@hbcAs$3QctIFd72CqTO(+|xig+u`WyhRyM1BeWSV9VHgSW7gU z6=K1wWa0gIz~4Xdm?XSk4VY%ZYv>15B|gLg!^J~TPntaBp1O>!xBH@guyLBHs{Wc% zaFc66yHK7Ha%pnrHhBn0Nm&ICxre2dC6=jqW}_$yWS98Sww$$bj%8kIKOP^-P%;D= zsk?i7CunFc)mo;lqq|%W0R3I$7N4F9%PfD4$ey0E7wr2LV|FVJX2%@dPYA~2uP#zqca(Gm3xL=;{5Qb9s~PmH%W&)`{aNwlKF%S!x;Z#QvkUhVqOKTqH7ns|eq zRx|kS-L8(Y@~-QZhrJWBX6LGp-OV`l`Hy`SP}VtQ1;c+2FFF>#)CQxNaSq7peCs^W--1 zW=z2wxpEKZC1*#Ke-Upvq9%N5lKaaastN_2+ufSaV{U82rI^J`xMzrtS$nXtr-H}6o9{6M89<^&#MB!%L ztKjLcov z==#TBIVFDbdd#M$$V?J|MK~O91`*e(I39vdcE_Nd&<(68}dB2~BeT;>_F=E|?O zhQCOk{!8OG4{Nkr)bkv+xi8~|S$eP5)I)D9({;iMa%SjgLYjwmW?traGyXb7cy-2k zb@%-DeTQRl-{2OiZou|ij{~cVjW00#BMZ+9M5rz=w{+IzE##S3#SxeS-ej5myXWOg z-}Zf>o^;7gJeC{9MXJo1sg zs~^3zjCg%R?e(tYlM5WT$fJLT2B-La2-q_oaj%6qT8B8K@x-M@`)YFoLP1M%sb$kO zQY*JAzYX1+eI}vYa=YVjef@We{}qHH_1UB&!iIO>cu&6)ww@hxo@y9#BIf$R&=3wL z@lv?+QSa`p4z?pdQ=9MwFMi7w>&0NYl*|t;w;ns7Vz8qmWAOEC393|akS=Z7x*utb zsUHm4B?oDe`{l=5_asIJGLG(TeMFj=o=X(Bd>Xn@r1NBU-x;jyWX_BC8WxI~)AMEh zDZ<26{GWn7eor?WKIiKavGOjSC%;FP#67 z_2h8Eq^Th_>)Y41uj;3FXSfAjJF(6sd%=1_C*j7>nN==>Gktd$zDoDoM!xZF%qs%= z$$QNA;YK=&f96cB_PqJ*zW)7+^{jhkz}5MaN8~iEx|^EHz6C~$R`_qTA9>nB?HHea zVLx%c=|V)bJ5jQ&vu12UbAIRB(-s1rlR-0k$IjSJw8F#<5q2(}6D916Wv{kNTGMbw z@cZ+ztfA&(^(DL`O>KU7O{-*%{sCTHoPFb+_2Fsqib2a?ErFho(lgU0>($Zi+lw7V zl9}(^oUOL|ssfkNTW%#RIO&evyDobF?Af#0WHNnbK76kw;`qxxh!@T(wl_CLZ(6Dy zuoJ%|u*l4~*qQU0cOGWwMRkAq`t4eBO{k=QT6cB8T^se<@J-a=Ti179IOlf3kg%)z zON7thxmPoCLZ=z|)-R9wj=?G?Pje%??sZ%kyQuaRJ6`hQW5HIm&()y15ucQ}36Jt|gGToPhqvedai_kp+En|fE&Vb>Gp%OL}wi{%OqG3PsYExeA@J#Tw1=4Xgv zp7^e(qV8qg+>}#aSfsYoI66B1?zRlu9%t(^O1Up=ZWnfh&`YF3r+A_5DjhRYzOFgt=`;;D1ovCtGk zow?`NX?SK@?ZR+rj2m&ys>H;=clV(@4)qMsSr-1xfJX8q=7?WRc#6mJCFOkHMMyDUG#n+9p8uiWch{8>>d5LjVTl*kY1K-pDU$p|XvUfnM72a$N-b@*MKuXS7gQ{1 znKqSZwWFQxMXN+anyTuC(rPWEt(ob2!}HAZnZMrm^Lg**{O<4Ed(QpdbI&<<2}w*O zK?vyIrO|DfX?9wlt7M^+wQWZnBSX=p^sn$`$qm}_pRW|682NWmj8p=xYezRk=s14; zySOMXgO~$Z1S37kDP%_?I+YO@z66cNq1QP(yE?nC^Hd-ysV*xUVg19EAPor0MQfSf z&3#-3Ll6>zu!lC?4Q*trR2(Qo2Hp-mST-A)Jb~VYk9|-%XOM!#YK-jd{dM8lUbJh1 zAq1&FekQ8AanD^eu^P1|cQnIJVl=QCv7VaT9Tr}i*adU}(rN73j`zPVSZJ)EszSgE z&Ki~l07g-1VR#0_VoXD2T$jr|R7Q`>eRRH#*LeMj&Fh-$Pn4{C&~$bn67P7&fRuXW zPDDzJ+t|~T&@Pksqb_&mb~yNxANr1s@K%huNkM;B-g1gselNoD6D~M zY>QvmmRRAqJVw=6^J&}S20p)z!RPa<8W{fz`6b=AgZvPX-@WaqdtoS0gH>rRdH6mA zVtOOgAn-V<`=a&3ey~Q@zV$v7Heq-GUiF_KfUtvd<0Go~BPwJDxB@WNA^old@&A#4 zV>wItasVaPEw@G<&?-+vW*|>&H2~bC3ESYr!IKAykB?c$s~y+I8~t%&dORI5Fp zOPoN#x>%e!3v53G3VaR)AYW9V?FdK>*Y6r6_U`TX?w#Ej2K$7O;h?!-@p=M0A54M? z5;iT&jV_znD4qjNA2Av3Bh#g>uymd*;SwkkdLPV^3+W?Sbn0avn8OTXF^9=CDupil zohB1y;|yS!yrj&6r4pu?#Tq8TGB+B9OOOibQVx^Gp^r+*@KRIEqRTn7;cz;&JwQ6o zg1LnwZ2CwAleRz~4ln9sF{3&3;qU0wPxL6GEQ&NcRxbdaC&O7FZ)su{lg6US2g#%? z1u}_6rvl}jG^*4M=Fmx8raY5I4X4YbH0mI;517HGk5Yh?Htb#k?2OH%DUcUn>R>ii zS{OUXj0RRM5M=X(Vh$^IAv?a3Mf32L&S%4-!gvn-rL-_QB8_I8)62@H3F+|>bh$~^ z$ah7ug=6s&W_%@cc>Jwb?5D!f%h@lRo`@bxn6bNA@}^ZkjJoHXZQysNb+mr07EDbF z(zI{ATkQIHrFHt8AoUM^s`mAk$*zlwzOOTA(Ghg2NqCe|5ip2uT*OPB?E3JwbNe+> zt4{m3t~t@Bd=b;(7XUCNzqw8O`u3^2k4zxQ`8i0)7_6!7Ql_niVvbw)UUCRBaO~C# z=mXI(2!MsI4_)0Jt|t&?gF&K83<)HbBVj$^p*WZ{>ne7I#V|q4CiJ<|q-28J5Qe!h zg-e&PSX5U6#RwL2fIeu_sDQW%s9rD@K#>U)cY=iF*h?Zj)F(*w17Mf{vj{MU2BZ>w zAITiZFM^Z}lVG}xOo(zPfUr}9bP9(?&7#ZQ!9)Z}CS44|s31CJ$VOq+EU?O30_+4( zEPD4WSqzXR-hE_P5q2_7Hsej22gu+6BY+H|!UU=zEat+ngf1r2WgNOZ3zl*eV}aRV zUKxufd(*`~zo!Ay-N1h$Xyyy-<)W6Wt>@%*$z81szMzHAf8W*GvM6wn3!3cDnTm0 zAr%bk7EC=6Id*qCS2d(mwA)=Ia{78@0eb^d-1k$(M^wW%M7)Wo#u*^Sq*O0alGVK~vwhOP%*9tC=M29G^}e}FE~!(uE8*udBV z?gmW^JCumG5k4kjZ1RynBh?JU=xebX8vf+eBG5`S4t`?X9R0bpQwHzb7y$y#QY1drO zCI&SFfB)EA5Katg0mJN?+XetvPmHv~@Q4ufI8Pb!%U#Jaifc5bSmar0nXah;H#riD zL1VWf@({MpWlE5`h9(j6i_NRetkuRILeo^J-sz*akF8DfsP)%getc*^`ydFV9&X}{c~czP;cu#Tv#GUM#M(NSBXf1;2m1VY&6z>U}+ zux^%STFDjliKY4Xa#@tYgW#>lqr2PB!3*;XJu~&xUYqHJm)q}^NTnZJx6O{&q%hwv z%;1{47~j0AfO@y140hc6OcNaP|Fds4GQ(PCbT#aH;kN60J}l;L)oKdDY-;?ps`m4( z;uTtL`@C$U@&|_due}=g+PM0Q@4}g!S0!kr;!|CFgZ1lJp9;|zm2EJNm#`u2u8Gr= zt!|5Bl6CW6@r~zqdeE$1cCOL)HY7xFIv!Q(_Br;>+(Q&gqw@j;-#@XZo>9ew?p!nt zE4S!4IKR5;&V~UwB_mV5mk{e{{j`pD-NqUD18Gds!kKAJY3iSgfF-P%ouxX($67z! z@`F(P_FR>{$wt4o$&&>usgA1>zh=YJvnZd>M7Q6sCqC-PNr)vp*f2NIVZkA0{Vt)e zSc`#$9rfl_L2b9Norfoaj|^7&n53oMxhBbSxZzzsdB$JsCrh!Z;SM9{mGiY=$SlV8`)bs! z*r7X*qHu8{PPqs46SH9NIkn6dzvPi~ySijD**W_oJ4*vQ`)F-GhGb4=pNxI}x3&5K3 zq8CRXcP6)Ea`3kXWQe|p?pkLk^7Yi7nH-j@%XZO%b%fP0(VpnAVz19SmKh@d)E%6| zAy%8`^gEU|e!JOBzq3$qFP>%EmNv*Z9bU7kCMhAw`|`GJw+EGsQnKHi3|ZMzu30MG%uOwpW~gZ<|$3Sv54HdrG6Kw2sbMQ4rpVmYx_HrJ%48!w#6F~w>W^%Kh_=Nco2sJd3h(SaqWuJ3k2eD~L> z@w{8HO$#HH+!Gc(Jul??Nn^78RGbInBF19&x67#N!t2fcHA&2iedZ6K|vTq*&XdefKm`uxI`7vfp!K7%hD zO0hV> zTr~Blr-Z`Uisx++9bdNcQ!j;%E_{3`AKh)?l(6~1)9X4;Ri6d)U7eZEjFqd~rXu{T zCh8BwnP@l-;)uTN_WUE!Mfl4#>|dXqf1ZD(e58K>GNNAf3V5Zu-}2m-V9t8h=v3l% zlT{6WM!$YnrccV~;TZ1AH*MT%{>5O_>YDB^-z%N0Q#Dr$RbOK=S-S4>}Wa zY}48C8y4!()fG5($B&7tJ13Ay=~H@jk3$g3W&~;7_D*cfQ;7)6%}Gf8k~RO!_%|&&RjlR=ZQ7V=?~0&aRgWyvA?LY2I=6!!}d|^lwEy-^Biq`zftZJNPKVa%%QNs z)F!)P^9(0f23I?um2HpDdT@AUVE!BF;u|MJGcR*3$jm?bkjd4Xfwv7@;J&lRdTu?^ zHP4}c!5H`Qlnd`<){MsdIDi^7O{?=F#hX&Tj7&%qgRzaFjf*I$WSK#7MHywfl zYYj;ZCQTA8vfM70Q9eN%Y2=Mmi%+jEu~TEKIEUNC@F|VMY7>o(M<`f)bDtDxC>WGGGXjg&_OX z1D$TS=t8+kDY8!OZs#*Tx&==oPoVv~^Oh7sWbMVqPxn7qd2t$Pc5D*_2|;$s!ZJr+ z8jIVD6)Sg$yBDCu?8W@8#B-uFt;OwEkjb(;rd~w7f3Tt{CQT5AfESF!w2}b~zmY&O z6|iZj(!8TR#$D>vN5&74XQiy)m1G|>DJ#iNH|f58bI2QQ*rDJNTHoOnQf@x=JjAU> zIpC6U=YJZpH9L?Hl)O(w%*R^gI5=!7(?v$y}ovGfPsqM_xb{W*}Uo-&K zRo>j)!x5&zyy`e!ZX7R`Hd-4u8bc%Gk_fSs!?`p(mqz?&T{9htfQq(SrLWbjt*9)4 zAc8`CZJ;9Ev`O9ctA3!i*irAqu8Y7GfY5dwG{bQI%L*LJSj(3rb&gDy zwrr9_R-i0ZHv6~&pk|fn3fboilF~A#v;#ykCDBS((}2?)Az6?C%4e1LKhl~ipdZ4% zF328qCL@z`tkJ(Q2ZJvd-^2yGR9nbeqqV9pVJ}oyJ#*Ku&Uq>UOo{+srL2TBVI$;# zfMh$7%nWR*@mnNS*0{4MAVZ~7Ir)*5um)8DTc#d8w9i>O;E|O`agq#nS{;_Lch;bR z?I)lPK7(YCFG5hH03_l(Xy(GP=^wP||LEWj+q&amm!*RoQw+R(&;!N{(~0ipq|rqO z&JyU_a&Yhfj>I*Cxy!iW91MP#Gyv0h)uizl5~0o(W>DN|lrbEUfG3T9B97L?IV-?0 zZcUg5bB8G$8g0x29yKT8b1>X$5|=?CGDs6#9K6=$&`3N6amwK&XK}Ih@Li*XO=&ohjcE~SNyZ@eni-KXVoZ|q9hJqtp zZPsUI-e-!zd^`veeRvbbgJy^^#q@CwdVDnFn86$v!=Yma%!phZhPMfZb6|W9X_!VM zm|^gWFoyx;L6=AXHHQz?59R_W90qTJ8KxQbdtmzHF9dnBhbob80ZP0Xr$hc zI1WG_wi&>|{IKJQql-2k%K#Z1U>J}=1Q%2 z13R?0#&C|U|ELMbzwfCr{JkQW#|~c&B@V;j@)MK+SJ*asBG|N5Lu@YK<3ef^oa5e7tq$=SpJ)>gaWJ6< zY}Cs*{!i%~nq>fdx_UqdNR26{-^>c-HO#Me{?V>k{8*c+6EeHtNl5FA@^e_!Vf`c&PvDH)o^`Ff@ z@5BGxjO&yn_ywMu; zEN|eN5pUh{>Je*aW>to_OL?`YH;NgZ16HdZ@eVF$(!Ir*RfFgduq2<0!-g1E=kTc< zZ+#}64n+8JWhFyc2`1eWEm6hVDMDFUFsi@@5`Q)r|9`UwB&$$!Cy2Iq|`QDRS#f2De0vD64^1jf-} zkG0WOoh_2-425n*DMaeZ7i=IZRPRTp*PaJ6-uIg`Xpe45^17zL^>Do-hGry7he{i>9&Cc?TiaryhZEZ0{(QSQ05-;BGA zbrbu?2mieO)K9NdSsu#2IHY@1MFUxnzdJ>3s=P=3`XHiyQB5>pH>NG%{!HgL6Vray z;Lynj>Qep9guGI-7@zZKfAZ;+rLXS-dwA2h&M&QoH%xa^ z{r1RlO1p#8ie^|A(bYNI@XpidmilSu-d@#rH-aYFmB-tNN~Xc(u~;eMkyl4|Kw;rR zC4!YQSGYD1{W#k9sV3QXaW3cX>M-tD%Ez|*k!~l`PO{{9Ben+(Pw+ynQhzpR+qgG%c*SjjNXL9;rsb)tqYQ^$CTGUkSuE&#j`o)8RoBZ6`W1{sKls+L( zvI;Qqx}dQG4J~y^=KXYSs0?U48Ib(KnCUF({PJQSGifAKfthxJA? zU40gM2SW~+rpj;(1@s9v-?v}QJrhNGhtJR2dhf-O-F)D!NtT?`;rhnNXD>Fd%4_U= zL)<4~HtOngs=4gI>v@;iA=FgKr$zi@K8L+8&w52r=P zz$Ww8oyyZ}XMG}g?>7lLS{d^i@6XP-3})*M4gOASa&+2qA0a`g8Fcm%bUhh3x9>n) z9y9-uO|!*_0yk>jVyh2wqV9u$03p03>dcnaq~OxsD=~?6kFq4-l%$X%=dDRiVskUm z21>2Y39fU;TXZAGa7tIp1!eF<9@@WH*PGtXryAY!*b!bk*=SamBfwNG$;E*tbzJ92}tv=9Eqx#;puS^oFz79gI$CHzFF#N`4bgdFUb zn5FFWLgk9BfF;~bcfrJcc~-mfBed}Tri!15joc$c_i69E%*&-&GwzCN^+}x)4ug=i zuTG=IVTI@S6{F)5cd9Fg#U$hzi9dd1D!C1k^Oti-`y6~w>hY7eTNI0qZQ7}mS!iCp z;=5F=w~(}8sgmY?NmHzXl-6Bn_@Qi9V}$FAsc zrB=D~ZDGyZBsnT$dNU3MZR6};$C>35S@fg(McLTBbvr1qlZYB5a#(m|x+UR_ijw8f z_%!9z*ZlP0ruw*MdKa&6dUhrGE4e1&cGx#Ob#nOFa_$CwcA1rG1H&z}S4ZegBM1Hd z$b)07f^iA=R+a7Pbe+k`*h)cv(~rFwgR5UZ>RpIzGH(x6n%QpKhqe6qEVTV4B;hXn zP8|C1p{CVtnQ+eFQOO1B_pjfZs|Ix6_9@I1_tnOR?LBY*ee(JAiSY1n@GRb4Sa8OH zx5vf)P~wxH&upYRq~2Ha9;9E2^!V2N)^4l9x_U+UA zzBgazzJ2izkdRuq24mk;t;8a)xqO9Ay!dpo|Hfe-kAyArS-;esjMKI0t!t>a zP^P9bLm{b~pPL+UNI7QlC`?WDQkYd<%`@ z6Zc!V!ig`Y>pt(2zn6Mi;6lmC0X3s@NU}nuxTa8aUejJ1d8qxGorR{N{S zJ7{hCO(+`&*@!}_PJ1UdKpSxkM6{j0wRNSqi5jHs_ZcP6RWMVxLwv}CRGpjKH$yi3 H>-hfw)GH%L literal 0 HcmV?d00001 diff --git a/clients/2011M/content/sounds/pageturn.wav b/clients/2011M/content/sounds/pageturn.wav new file mode 100644 index 0000000000000000000000000000000000000000..7070da531a528c072130e9697960915856bed7fd GIT binary patch literal 25548 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