Untitled
unknown
plain_text
a year ago
166 kB
1
Indexable
Never
local COLOR = 1 local COLOR1 = 2 local COLOR2 = 3 local COMBOBOX = 4 local TOGGLE = 5 local KEYBIND = 6 local DROPBOX = 7 local COLORPICKER = 8 local DOUBLE_COLORPICKERS = 9 local SLIDER = 10 local BUTTON = 11 local LIST = 12 local IMAGE = 13 local TEXTBOX = 14 if not ZMonth then ZMonth = { username = "Developer" } end local menu getgenv().v2 = true local MenuName = isfile("zeromonth/menuname.txt") and readfile("zeromonth/menuname.txt") or nil local loadstart = tick() local e = 2.718281828459045 local placeholderImage = "iVBORw0KGgoAAAANSUhEUgAAAJYAAACWCAYAAAA8AXHiAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAJOgAACToAYJjBRwAADAPSURBVHhe7Z0HeFRV+sZDCyEJCQRICJA6k4plddddXf/KLrgurg1EXcXdZV0bVlCqDRQVAQstNKVJ0QVcAelIDz0UaSGBQChJII10Orz/9ztzJ5kk00lC2vs833NTZs69c85vvvOdc8/5rgvqVa9KUD1Y9aoU1YNVr0pRPVj1qhTVg1WvSlE9WPWqFNWDZUaFubk4sf8g9q5egw2zv8eKid/g5y9GY9HIr7FkzASsmjwVWxcsxMFNsUhPPqG9q16mqrNgpRxJwtKxEzFhQD+8fV8nPOzqiXtdXPBMx2gM/HMnjHm6B/7bsxfWvPk24t4fggOEKjFmMo5OnoKjM2ZiPy1u5iys/m425nw5FuMHD8Lc0ePx/Vdj8MOnIzC93yDsWb5KO1vdU50Ba93MOfj6tVfRw8sP0QToWdpnLk0wr4k3dvkG4Pzv7wVuuwvwaosrnn4436w1Cpq1Qp57a+TymOvmg5ymLXHOlcb35DRqjtwGHshzcaM1Rl7zNii6615cffFVXKV3w4qVSN2zGz9O+w7zYyZh8aRv8MPQYSjKy9euqHar1oKVknAEE/v2RTf3VriTEA12aYiFbq2Q7BcMhEYDQZG4FBCOwvZ65LXTI9svBFn+ocji72LZ9liHsBJjGVm+wchq2R5ZhDPL1RvZLk2Rw/MW/t+fceWjT4E9e7Bl7TosmDgF80d9ja3z/6ddbe1TrQIrKzUVY3u/hD8QpB60mU1a4GRbghQSjStB4cgPDMO5gDBkdtAjM0AsDFkClTloKsI06LJ8g5Dl3RaZDT0JmwsK/tgJ1whXXkoK5o2biAXsPncvX6l9itqhWgHWopgYPNTAHX9lo81hV5VPcBASicLA8BKQpIEFpDJmgEtnHozKMCNonr7I4vXmEvDrY8cjMy0NcyQ+o2e7dvWq9slqrmosWNevX8eInj0Rxcb5xMWVXVwQEByBAvFEbMAMwmQOJHNW5XAZTTxaW3bBjOky+TkK7+sCbNyIJf9biFlDPsHp+MPap615qnFgFZ7LwcAuD+IO8U5uLRkrRTBWki6HMLXXKaDEQ8nPcjQHkjkTuLL9bwJcRhNP1oaerJEXchp6ADETsWfHTswcNhzxGzZpn77mqMaAdfXSZfTv1Bl3Eajl7EakqytgzJROD5XBhjF0d6WtxsFlNHpP6SolHrv23hAc3r8fUwa8h1P7D2q1Uf1VI8D6rNuTuI2VvFgDSuKS9A46BZUCS0Big5QFS8wpuG5Gt2jWeE3e/ioWwyfDsW1jLL7+9wu4cvGiVjPVV9UarFXTp6kYanITbwVUXmAJUBkmVhlw3ZSYy5JJN9m8LT1YQ2DpUsybMRsz3x6g1VL1VLUE60J+Ph7z9MHzhKooKBzntS6vLFCmVrs9V4llNvZCQbsQXE5Oxif/7IWk7XFarVUvVTuwZg8dio4EKtanA71URAk0dlhdgSvbP1SNIvHG21i/ZRNGP/Mvrfaqj6oVWE/4+OFlqTDp9gQUdnvmALJmFQ6XTAlUR7ike/Rui9wmzXHt1Em81+0JZJ86rdXkzVe1ACtx53YVSy1r0RYIjUC6xFIaIObgsWWVBpfRyjbyzbR2/DzyZRw+AtPHjMfqWbO0Wr25uulgxbz4sroFk0WYCmhnBSrjUQPEHDy2zCZcclTQ8NguFBltg5DpF4hs30DktglAXusOKPBph0K/IBS2D0Eh4ZL7ioX+wSjk//Nb+COvZTvk+HDU5tMeWa06GGbU24ZUPXzivZr64PKdf8C+LZsx7C+PaLV783RTwXpJF6kCdEMspcOZDqE4y6PyWJUEl3grgUgBRHAuEaprt98DdHoYebQDd3TC6oi78EPI7YgJvxXjwm/HpPDfYcpt92Lq7f+Habf8EdPCf4u5tNW3/R8O3PNXFHR9Cuj6JC7d8wAKI+9APsE759UWma0InF9wlYEmYOe4NMaF48fRt+tDWi3fHN00sLq4NsOXjbwIVTjOBBiAEjMLl5N8Qlc6YQnizCJF7oSFAHc1xUJBGhmSDTe89dj2B/+jBGv9MaEIUOwbuFiHD9+DJe067SmQlpCYiKWz/sRcz/6DIsHD8XCp3phwe33Ialzd+DRZ3H+zvuQR7iyvH2R1YYesQogU4H9gX3o0/kBnM/LM1xsFavKwbpYUKhuxyz28sfVYEKlgWRqFQGXCvw5LM9r3R6IvgM5dz+AWcFReM27HQY+0g2zR41CekaGdlUVr8TkZPz01VisfHMQfv79A8h7/J+49Cd6RX6OrOaEjF2sOSgqxNg1qrhrzDi898TfcfrAIe2qqk5VClZ+RqZaZLeTLrswKByprIA0QnDWxGNZg8ueLjG9fSiH40G4yuP5uztjakAEerq2wEcv/geJe/dpV1L12hobi9UffoLl9/0NF3o8j6I/dMY5bz8Vm1WKF5O4y8UD6P0Gvnh7IBI2btaupGpUZWDlpp1FJKE6JF4kUEeo9IQqDKm0NAWT855LdXcEKadtgPJOcZF3oZdLE7zZ9a/YF1u1FWqPNv+yBuv7DEJ8lydxhfFZjnSVHAhUBmBZbj7Ak89iwmcjcHDdOu0KKl9VAlZ+RpaC6gg/aA7hSCVEacpK4DqjYHLcc0mXl9s2EOh4J5YFd0QXnmd037e1M1dvZV+7grWfjMKuLj1w9bHncE4A44CiogHLcm8DPNYDEz75HAmbquaLVulgXSwoUt3fIX96lEB2f5qHMoDlPFziubLp/RB2K1YFdcQfeY7pn36qnbVm6TJtw9cx2P/Xp3H5b08jq0VbQ6BvBhJnTcH1VE+MeLMfTh+s/Jir0sGSQH0HY6q8YqiMdgNw8f/XaIlRd6ITy//ixZe0s9VsFdE2fjQcpx/5B4rueQCZHq0q1HupbvHVNzHob91xIb/AcNJKUqWC1dnVTY3+Cjj6MwTqZa08XCk0w/SDebhyO4TgetRv8KZLMzyrj1ArSWubzuTmIPZfr+LS31/GOZkqac0A3wwozlhWAwb0Y8fjtc5dtLNVjioNrJd0UWqe6jKhSgkkMDTH4BKYSuASqEBvtSkgUq3N2rZsqXam2qtdi5ci+fF/c3TbBRmyEcMMKA6bcSri0EG83rmzdqaKV6WAFfPSy/g3L/56SBROM7hOITCpDsJl6BYNYGUIVAS1j0tTPBPAuKoOKTU7E5u/mojzX3ylFv2ZhcVR0+DKPxSPoZ0e1M5UsapwsI7s3I67edFXQjriZIdwnCIgKU7CJZ4rl79nBUeqJcmzPvxQO0vdkKwUHf0GR7izZiHTpZF5SG7Acl1csWvrZvzyw/faGStOFQ6WrFJIC4wgFAJVOE6qY3m40szCJVAZABP4LrCcbX4hqsyUGrxjxRkJVF+/3geYPZtQNVBexhwcN2Jyb/Ha7+/Fl+8MRt6Zs9qZK0YVClYPH18s8m6HLAJhAKoErtOEyl64Utn1XQsOw1wPX7Xy4eole+7c1R4pT/V6X3oqgcqlUqAymqyKwKiv8NajFbsiosLAmj1kqFqkdyU4il1gWDFUjsKVwt8REoYxDPy7enprpdcdXb5wAWPefEeDqnI8VSlj+bJZI3//fox67EntKm5cFQKWrFG/hRdXFBpt8FQqtipvtuBK6aAHGE+NbOiFHm38tNLrjgSqsW/102KqKoDKaO30KGjWEgsWL8Kpvfu1q7kxVQhYj3u2xLrWATgTFI4TgQTIAlhiluCSe4fXCNWYxt54oo5CNa5P/6qHSjNJZIK3B6LvI49qV3RjumGwVk6fpqYWLoZE4wS9zkmCZQuuEzRTuASs8yHhmMOYqqunl1Zy3ZFANb7vAA2qyo2pLJrWJWbu3ImpAwdrV+a8bhgs6QIzgiMIk14BI2DZA5fRc8k8Vw7B2tgmUAXqdU2Xzp9HzDsDge9ujqcyNUnjdEnXEcN7v6VdnfO6oZYc3u1JjHdtgcygCCTTWyU7CJe8VmbYJdiXKYW6NvoTqCb0G1SxUMm9xRtIzSS5IxC7Ee8+eGNLm50GS3Ip/IYwnNdFI4mxVTIBEq9lDi5LwbzYeXahUk5KfIJWct3QpaLzmNj/XQ2qiun+strqkK+PVGvtzf3fXstzaYIfZs5E5nHn86s6DdaAP3XBvOZ+SGU3eJxgHXMQLvFS1wjVc6zUOUOGaqXWDV0qKsKkge9VMFShuKKLwjx3d1zrPRhZ7j5mX2ePZbFdMXos3u3WQ7tix+UUWJJKSOKhi/poHGN8JGCVhyvMIlwSX2UHRmC2py96BYdppdYNXSRUkwd9QKi+Q7pLQ2SyXm50aYxAdTk0Ej81aYwzPMeUzg8Df+luWPZs5vU2jaDnsn1/otc6te+A4cIdlFNgDeryIH4k1adNoCoPl07FXSrOKgPXaYKVGhChttLXJSmoBn9YDFUW66PUhlhzjWzDjFAtJFRJ53LVec5dvYLlv+uMQtazs8lN5IY3Rn6B97o/pcp0VA63rKx/+i2BKNJH4WiQHkkc2TkGl6ELfJhlxK1crpVa+3WxsBBT3hsCzCwNVbnd1mYa2ZIZoVpkApVRP8+chdwnnkeWLBY08157LNelEeZMmODUfUSHwRrZ81lMd2uF08HhBCtM2bEO9sOVzhHkfO+2eCnyVq3E2i/Z8vbtBx9pUDUoB1UJXGxQO+Eqhsq1CY5ll4bKqNH3Pgh0edTpZc5ZHr7AnO/xIUf/jsphsG6lp8nRRSKJnieJUIk5AldRSFSd6gIVVB9+TKhmmvVUZU3BZSOroBGqxVagEqXl5mDNXZ2RK6NEZ7pEvqeQg4CR/R3PxeVQCy+OicEQl6ZI0xm8VSm4+LMluE4QrmTCdS44Ep+4eGBi79e0Emu3LhQUYOqQYcAM+6AymjXPZS9URo3u9SLQvZdhe5mZ8mxaE28UzP8Rk/oP1Eq0Tw6B9UiDZtjbLgRJHMkl0AQmI1iW4BKw5CgjwTTGZLKsuC5IQTX0UwXVWX7mDDMAWTKVUdAMXAaoIvCznVAZNS3styhkec4E8tKN4tEe+OCZ57TS7JPdrZyVkoaurKD8sCgkEpAjjsDFv2XzW/aeiyvmjRiplVh7daEgH9M+/oxQzVBQGbPaSEIScyCZs7JwGT3Vz00dg0o0acBgXO/+L+e8lpp6aIBFY8Ygec9erUTbshusca+8jG+btsSJkHAkEigByxpcSSZwJdPSGLTfXge8lSwhmjZsuAZVg5JUSZo5A1expxKoyoz+7NWEkNtRRFCc8lrNJYj/L4Y4EMTb3dLyZCyBJpHQCFimcMnPpnAVx18aXOnBERjZwBPTBg7SSqudupCXjxmffF7OU5U1h+Bqp8clDpaWNnUtN6XgiL5+mXHto885NWkqOb8uRd6Oob1f10qzLbvASkk8giekovSRiA/WI8FBuAr10bV+JKig+nSEguoMP2s6P7+lpG9i9sAlUF1knS9lTJV07sbSEclDVKbrbke+jxP3Edkd5nHQtmz0GBzetMVQoA3Z1dqT+/bFRNcWOM5uMJ4AiR22E65TtPkebTC0W3ettNqn84Rq5vBRbDkDVBmsA2OyEmfhUp6KUC1TUDnvqUw14qlngD8/4lQKJdUdzpyNYc+yDDtkF1g93H2wq12wAuewZvbAdTRQj3y6cXkS19EdO7XSapcksdmsz7/QoGpQDFVx0hIn4DJ6qoqESrR17Trs/v1fkOPd1iw81kxGh9cf7oYPuz2tlWZddoH1e4KRHR6NeI4GjWDZgku6wWPiuVixEp/VRp3PzcXskV8SqumlPFVZcwQuI1TLZUqhAqEyaljYbbgUEq0W9ZkDyKKxOyxwaYwxQ4bCnqQGNlt8/cw56Mdv4qnQcBwgKAomE7MGVwoD98nsQie8XvsmRIsI1ZxRX9uEymj2wGWEakUlQSX67PkXgAefcOo2T25THxwaOx4Lh9ND25BNsMa+/iq+a+aDI4yvDhGWg7RycBG4snDJXFcOK0mC/tO1bBGfgurL0cA0+6AymjW4MuhBLjBsWFnB3V9ZHdq7F6uj70a+E3Naklce4ybig7/bjrNsgvV3Lz9s9w9S3aCAZQ2uBLpyU7hSg8Pxu1rWDRbl5KoHihugKh9T2TLJ61UWrgx/HS6ERmClmlKo/GS0HwRG4CLP6+iclpqFf+QJvP+Q7YGYzVaXSc2MsCjsD9bhoANwJYeE4X9evhjWw/lViNVNhYTqh9HjcN3O7s+SmXquYqjcbmyeyhEN7c4A/L6HDKnCy8Bjy867NMPQ99/VSrIsq2ClHknCM6zAFH049hOq/UF2wEVLIGApjMk+dHHFknExWmk1W0XncvDDmPG4PnUa0lgnZ/kZnc0/L6ZyqWpQrXJrWmVQib4bNQrJv++CnDYBZuGxaBLAN/bCj/3fxZEd1h8OZRWsZWPZnxKO46Fh9Fh6HKDZBRf/f47xwkNsgMK8fK20mitZij1v3ARcmzpVQSWTnypdpUDiJFzp7IbO6yOwmlAdq4Luz1SZWVmYwZFhoROTpTnubZA4YhTmvm89849VsCYN6Idv3FqoLu4Au0IBy1640kIiVJrImq7Cc+cwf/xEBVUqP88ZAUozZ+ESqIp0EfhFQVV1nspU/RgvXeZ1OBxnebXF9bEx+PiVl7WSzMtqy/e//09Y3ao9QQrDrwTJXrgkcN/YpgNeruGrRAWqBTGTCdW3CioByZhd0Fm4jFCtaVb1nspUA267G7jjXnUf0BxAliyTo0kMfA/97/2zVpJ5WQWru0crNW3wK4PUvTRTuFTXaAYuASuJgfssdx/E9HlTK6nmqYBQ/ThxSjmojGDJ0VG4iqFSMdXNg0o09LXeuPbHvzh8e0dyauGBv2HAX6zneLAK1n3i+jki3MuK+5Vey164ToaE4zMXd/z4+QitpJqlguxs/DjpG1xloH7apQHBKUmwawqXI57L1FPdbKhE0z4ahvhb7kGugyND6TovE8Z+ct/RiqyC9TjBSmZl7JGuUEFlHi7TbvEgX3Oa73mN7927eq1WUs1RQRahmjwVV7/9llA1RFpgOCR15dmAELNwydEWXNUNKtHWZSuwJCAKBfRA5gCyaBwZnqfT+Ki/9Yc0WATr/IWLKpFaEofDewiMNbhMYy7xWGf0UWrGPTtNtk/WHAlUP30zjVB9Q6gk5WVJot1UJ+EyQrW2GkElSjt9GhP8g1Hk6K0dglXUyAuj+/VFfmaWVlp5WQTr9NFjeJeVG894aa+ARdtrAtceHmVuyxxcGQRLEvvXJEn399O303BFeaoGhMqYbLcELoPnKkkRbgsuI1TrbnKgbknvt/LHZYKVZQ4gS8YvTKGrD777z0s4ttfyUmWLrX9o6w58zgo+EKLHbkJjDi7xXKZwGbvFrLDoGrUMWXmqqTPoqaaW6v7S6KGchqu9DoUClTuhyq5+UIle8vDBVXaFDoFFK2jmg4WvvI49K1ZrJZWXxdbfvmQ5xjVyxT7CtJvgWILL4LlMvBZfm8oKrSn3CAuysrBo6kx6KlOoDKkrDUCVThFuD1wCVYE+Auurqacy6p8uzQAntuHnN2uFVa+/jQ1zftBKKi+Lrb9hwU/4poEb9mkea5cDcB0LDcP9NQCsAsYIi2Z8h8vs/k4SqlTZ9MEYogQsJ+BqF6Kg2lDNoRL1dGkOhEQ5DpZbK2wY8C5WMR61JIutv2bWD5jRxAO7Q8KLoZLjHitwydSDgJXIuOyBag6WBJ6S3+DyN9/iBLt8WYmhcqEKNBbhkq7RFC6BqQQuBZUuHBuk+6vmUImeaegF6G91GKw8grXpvSFYNmaCVlJ5WQHre8xo7IE9IRHYSYiM3aFNuBj0Ho8yPDewukqgWvrdbFwkVMfpqVIYE0nKyuJEuwKNnXAZn/ljhGpjDYFK9KSLJxB2G8FybDWpeKyNAz/A8rFOgLVh/k+Y3tgduwlMHL/NdsMllf6bO6vtcmQF1ey5CqpjhOpUYAQkKW8K4XAWrjQ2TH4Ng0rUzcUVCI12IsZqjV/6DMDqb6ZrJZWXxdbfyuD9mwZNCRGhYiXaC9de6RLuuEutk69ukmdSL5vzPS5O+YZQNVJQFWcYJCCOwWWIuVLbsWvQRSLW3Y1Q3Zwbys7qEWmj4EiHwSrwaIOfe72ITd/P00oqL4utf2DrdsQ0bIRdDGh3EJod7C5swiVg8bUnWemdGzTRSqoeEqhWzP0vLpmBqjRcutJwlQNLTHveT7tg5IVGYJN7sxoHlehRAYtfDjXd4ABchR6tMbvHs9i3xvKdFYtgnTyShFE88W4G4jsIzY4gPXYSmhK4Qi16rhOMN3q0aKmVdPOloOK367yCytD9lYXKAJYc7YMrld1fXmg4Yj1qJlSif3DQgg56w1Z+gcYeuPj6IrfWGNfzaZzcf1ArqbwsglV44QKGCFi6MGwnOObhKu+5dtOOtg3C64GByDh5Sivt5imPUK3873xcIFRJhOpkkPYAqQ6loTIHV+knZ5hCxe6Pnkq6v+M1FKqM1DT0dWmMqxpY9sIlr7nMGGvI44+i0MpntwiW6C2CtZfxw9ZQvRW4TD0XPRYt3rcDht9xO3YvXamVdHOUl5GBVfN+pKeagqPs/hRUgZIITgPIFlz0WmWf+SNQ5YYypqKnqqlQiXat/AXDmzRXmyoUVHbCJf+/5t4aL3ax/nRWq2C9QLAO6gWscItwxSm4TD1XGPb7B+L7e/+MuUM/1kqqeuWlZ2D1gv8VQ3UiRI9kgUagchKu06xUgWpzDe7+jPr+s88xu7kfCgiWcbNsMVz88liCSza6QheN7u15tCKrYL3q5Y+ksHBsYZy1jXBtM4FruxW4fmVQu+WxJ/Bl71e0kqpWAtWaH39C0eQpSGT3d1weyUJvY0hZ6Rhc6pk/EnOxImWf5BaPmjf6M6ev33oDG1oFIk+CdxOwiuFqT7AEsLJgtQkCejyDh92sP/PIKlhv3Hs/UsIYS7BBthIu8VymcMlI0Rxccf4ByHj5FfRs20ErqeqkoPrfQhTRUxmhUlkFBSRWmDNwneS395x4bdX91Zx5Kmv6d3i0+nznynisUnCZ8VrnfINw9sGH8frd92glmZdVsL7o9w72dQhELLuRrfRQ4rUMcIUqj7XdAly7AkNxLPoWPMtGrUoJVGt/WozCyZORoEFlTP6mEu2awqWBZQuuE+1Ywez+ttXwmKqsVMpO/S1qb6M5sMQUXGUS7eb7hWDjb+7GmLf7aCWZl1WwFnw1Hiu8WxGmMGymx9piAtd2wiXzWwLXdg2unYRrl4JLj/2eLTHs6SdxjqOPqlDe2XSsXfQzCghVPIfRxwiL6VMzzMJFcErBVQYsgSqbo7/aBlVBbi66C1iBEQZ4rJj835jFWQL3C77BGN8+GEvIhjVZBet4QiImNWiEbQIV4ZJYqzRcOnosA1w72Fcb4YojWHtb+WHpv1/AfAaJlS0F1eKlKJg0GYcJVRKvwZgi3CxcAg0rzBpcBk9FqDxrF1SiJWNj8LmLGy7x89oCS0zBxW5RwALteUKZknBUK828rIIl6s9CtgtU4rXMwlXiueTWjxGunb7tkfHxMPS5/z6tpMqRQLXuZ0JFT3VQg8o08ZstuCRNeNln/pxozwpl97ddoMqpHTGVqT56sgdWe/oycC8PkSVTABIuBNmXp9/mK95q2R5HwsOxISTUClz0XGXh4vHYb36LV+7ppJVU8colVOuXLCNUkxRUkhHniEBFkGzBpR6FJ3CxGzd9WlkyocrURWBHLQrUy0oe43dBYJHUSVZirLJ2jnbCNxA9vGw/WtkmWB/3fgXHORLcwKB8E4/m4ZLpiNJwxYVEIK6JF74bPAiJsVu10ipOuenp2ECo8gjVASNUPLfKdOMIXOz6jHAdN4WqFnoqkaSUelI8Dgc2GQRLzF648ll/C9188PXrr2qlWZZNsJZOm4XlzVtiU1AENnJ0aA2uUp6LDbWjVTucmTgFQ56quMfui8RTbVy2ArmTJmE/R38JhErSggtYjsJl7BaPd2Al68Kxo3kzJNdSTyWKeeM1zGjSEgX88stOIpXxxg645CFSV1hXg/klXjdzrlaaZdnuLKnPSPgmwrOJ8cvGEPs91/Z2wUju1AVv//VvWkk3rtyzZ7Fp+UpCNRH7+CEPEyqVPknMSbiSWGkZukjEMaaqzVCJ7mZbysI+yR8vMBnNFlzyP4RE40474iuRXa96x9sfCeERWE+INrEhNjJgtwoX4RO4drDRt7m4Yum4sdi1cKlWmvMSqGJXrkaOCVTGJCQOwcVvqylUZ/Xstpu713qoEnfEGbpB9j5GkEzNGlwqvvILRjd3H60067ILrOFvvIljDN4FrA3iuRyAa2ubdiiMmYhBXR/WSnNOAtXmlb8oqPYSqoMmUNmCS2AqC5ck3ZUc9ALVrlre/Rk1pFt3LPZorW7jWExZSbjKQiUjwkIObGY2boFJfftqpVmXXWAdjU/EnEaNsF66QoKzgY1qhCvWFC424pZgk5iLMCrP5e6N8UM+Bq5d00p0TALVllVrkD1pgoLqEM8vO65lS38psORIgOyBK5GVeJbdX12BShQl3iok0rBT2wJYYmXhkr/J+2R3e0qi9fkro+wCSzSQQfIuvQEqgWujCVybrcHFmGurZyucW7wEwx97XCvNfuWcOYutv6xD9sSJ2MUPtp8DiEMEw5iAxGG4aEdYUWn6SOypQ1DJ42a+buCB86wbtUvbAbiyafn8mzwH3F7Z/cqPX3gBp3R6rGYXp7yWDbjkpnVxtxgUjAMRt2Dky7aHqabKOXMG29YKVBMUVAdYpspwE6hTQFmFi5VhDi7xVGns/hRUtXRKwZxuYf0VcKSeKUBpZi9c0g3ObeqDsTaSrZnKbrBOnTyNOQ0b4Bc2zhp6obJwbSgDl9y0NoUr1s0duRs2Yuw/e2klWpdAtWPdBmRNmIjt9Jb7WVbJbmv74Cr7zJ/DrMgUQrVXRn91CKr/jhih8sHKdEG6TKuUgctW/nnZ1PpXgpnlwH1f+30b1b+ZDw6FR2ING3ltObgksLcM17agUPzasSPG9x2slWZZ0v3tWL8RmRMmYAeh+pWxncoTEWy6ld8xuOJZgakCFUd/J+oQVCLxVnL7xtRb2QuXrHE/7heErg3dtdLsk0NgTRs9FvHt22M1G2odwXEUro1unriyZxdGPP6EVmJ55aadxc4NmxRU2wjVXpZr3LMocJXKbkM7aAdch1g5p8Mi8Ktn3YNqQu/X8LmLBy6x/lSm5jJQGc0cXDKBeolAfkJvtyjG8uZUc3IILNFw0r9RT6gIiyW4JObaYg4u/n+LpxfWrlqFM2ZGF9L9xW3ajPQJMYSqgYLKuPPHEbhUjKXZQVbYKXqqfTJPVcegEqmRoNy+MYHIkpmDS+a8VBkOyuF3DHnyGaSFh2EVwbENFwP5MnBtbtUWGV9/hS97Pq+VaJBAtSt2C9JjYrCFH2QXX1t2z6KA5QhcpaGq+WnBHdWLkbdikaxrZ9CuAnU7zAiXeKtCequ5bi0x8rmeWon2y2Gw8i9fwVQ2/C8cHa7RESxH4eL/1/L92SdPYOFno1SZCqrNhIrdX6xLI7WXsWRzhv1wmcZc+1lBJ/WRCqoTdRCquJXLDTudZd6qTMBuyxSEErQHR6qVEHY97quMHPdx1LudH8SZyAisptdao9MruNYSnHX8vRguBtyb2MBm4SIAu2+5DbGr1uDotu34dUcczrD728SYSlZFWN0QawdcAtUJeqr9dRQqkXRfchvGUsBuzQSsXHq55Z6+GNjlQa1Ex+QUWKkZmfiBF76KDbmWXqsELh4Jj024+LdNzX2QOmY0fj0QT6gmYAOhknuLxvXzlvYsytEYb5mDa29AqILqQB2Gqhfr5QfPNijisWyiXXtMPBxCo3AX27gwJ0cr1TE5BZbo3U5dcDY6EqtCbMAVRLj493JwEaJ1Lo1xYuRIrG/QSEFVdltZ+d3W1uH6NUCH4/pwQuVR50Z/Rs0ZMhT/kO4rNMKQt4uexxG4xFvl8T2LCWb/P3XRSnVcToN1rugCvuMH+IUgCVil4dLZCRePvu2xTRfB2Mu+PYuW4NrNyhOoDnq542QdhSo1PkHlfr3GL6kxF6rKhyrQ2AlXOmGUCVHZxXP10mWtZMflNFiiD/7WHRmR4Vipea0SuBig2wMXf99KYAQw4xLn4j2L/JD2wrWLlZZEOA961V1PdfXiJUQShjR2Y5mEQ/KhOgqXeKsLrM9JTbzxWfcbW5x5Q2CJRvDDbAsLx5pynqs8XHLrxyxc9FCGWz+GzRnGPYvG9fPm4BKwxOL4GoHqUB32VCLJR7a5dQDyOXgxZBl0Dq5CguXMvFVZ3XAJMyZNQXJbXyxlYxvBKgvXeofhoudiRQhc1jzXLlbe0TCBygMnc+suVF09vTHXozUus56KMzc7CJcK2IMj1NauVdMtJ621VzeOJtW3jR9OdYxW0w/m4JKb1hvKwSXzXqXhKlkoWNpzme5Z3EWoBK4drLRExlTxdRyqJ1j3Yxq1wDVCURYqe+EyBuyxPgF4zLNi8ppVCFipWTn4nqSv09FDmYBlGy6Z9zLAJcF86VWoBriKN2eYwGWE6rC3J07V4e6vO6Ea2VBSakciRVIssY7MpQgvC5e5Z/7IZGg02/BCfoFW+o2pQsASfTVgMC++PZYGle4SbcFl2JyhswKXyc4fVsBWVsphfSQSvD3qNFRdPb0wprEXgQhXqZaMSeEk5ZIjcKkuMCQCrxAqmaqoKFUYWKI+7Tvg7C3RpUaJxXCxmzTGXObhMlkoaAYu6Ra3CFT0igJVXQ3UZfQngfpcD1/V/aUQFkOi3RK4JOmu2YcbaF2lKVwSrC/39kd3H9ubUB1RhYKVfx0Yxw+9KyKy1PyWAkuOGlzmPZfsWbTkucIQGxKCQ/RUiXXYU6UeOqymFGJbB+IC68yQvtI0i7MBLsn2bM/TyjJpWQRLyqxoVXiJ6zZvxg7PpsUz8pbgEs8lYNnjuTazG4yPjMZRf1/UrAfVVZykm5JJy9OEJjeQUBV7JyNckntewCqBy+C5LMMFXaTyfkd27tDOUnGqeFSpT557HplBHbAkKNQGXIab1gou/m5tQ6zAlX9bNPbffz+cu3tVc9WLn/05AnAlNJLdl8RRhEZ5K1OzH640ggXWt0wtxLxk/zp2R1QpYIn6RnREflQEg3lbcJl4LoFLPFdomT2LrFjZ+bOOrvtYGCvLqxnily7TzlR7JUtfJLPLHE8/XGeAbd/DDQQuw8MNSsNl8FLira6zPr9q5IUXdVHamSpelQaWqH/Lljh7azSWl5k8dRYuuf0TSw8mt4AK/dtgd6f7kXn5ina22qWXIm/Fw4QqLSAC2fJYFkJ0mmA4+uQMU7gEqgv0/j97+aGzazPtTJWjSgXrPE3yPhzr2NH8SLEYLjmah8vcnkUZKa4L1CEpnBXn7orNb7+DC4ZT1nhN7P2q8lLzm7ell4omTOGGNJbqKN2gvXCV91x5fP3ONoGGxXuVrEo/w6lzuZjED5LQMcohuAyrUM3DpdbP8zWbxYMFhyJLp8N+j2ZY9VnNfGq+aN6IESo4/9TFA+eDo5BBL3WSwJimrlSZBgmI/XAZPJeMEHMY8B/yD1WToBcLCrWzVp4qH10q4XQqZvIDHYy2MMel498IjcBVfs+ijW1l/D2WcZzMc+XrQ7DR1RX/7TcIRdq5q7tkh7IA9Z6LK84GRSAnOFIlgLOUxdlg9sOVSrBy6N2PtNeraQV5/EtVqErAEh08fgqz+cHioy15LoHL4LnWOQGXJCGJZUXv5N8LwvRYzXNNe+ppbIrdpl1B9VHi9p34qFt31eWNdGmOdHphAeoUgRKPpFJWCkAW4FIpwvk6W3DJPJd0f4f8gxVUsrWuqlRlYInEc8lGjKRbOloI6AmXAou/OwHXdsK1na/bzAqXG9fpYXT/3t4Y1cwdn7/SG4cPJmhXUvU6FZ+ACa+/pp7j2IM2z7MNCnXRSOdoTxLqSi7UZA0qo1mDS8zao/BSO+hRyFBih2+wAjg/I0u7kqpRlYIlOpmdg6/4QdNuibYwFWEdLsNNa0tw6QmX3nBvkbaNFb6NlR3P9+bSiy1s2gRv89wDuvfA/NHjkJdXeWviC/PysGRcDIb16KEevC6ZWia7tsBxaXAO808Hl2QUlOMJSVkZVDqLs7Nwyf3Cq/SAi738cQfPWxUxVVlVOVgiuX/+kY8P8qMj8LMFuAxdojW4GMjbgEtMUlbuZMNtZ4XvlliDr8/Q67DCq5V6ulk3Wq+IWzC6z1uYx+B/7+q1yDpj//x+dtoZ7F21BguGj0BMnzfxcsStqjEfokm+hIXNfZHG8+fqIg0w8TokL5cx8ZsRLslL7wxchhGjwGToFgUs2QjxZSMvdHF1066y6nVTwDLq/ahbURASgBUEwXQFanm4TLaV2QGXWj9fDFfJQkHZnLGLDRdH20OT/Yen9ZHqAU6rfPwwpYkXBhMImeWWh6ULILJTpZP2uzznWp7OLx5I1pbL3yUR/2u04S7umOXmg1jfDkgPZRDOctN4Lcd5TZKX6ygBlzRKxXm6zMClHstiBi57HssicMmM+/WQSDWj/iJBvpm6qWCJRvV8AYe93LE1LKJcUG+Ey6E9i6ZwBWvr58vAVWr9PP8nto9/P8jXHOFrkkPpXdgwGWFRSNGz0VlmAl97hA1+gtCk6aOQRcukSe7SVF0E4QxHEl8nqSklCUkCy0xU5Rl+L5dRsALhkmmJrEBeF01yWFXWbRpHdNPBEq3btAmLWCGnOkaV6xpLw1WyIkLBxb87D5f5PYuylWwvvYuYPJXfNMONMnanahs/yztAO0STFJXGfBHqyPeZpk8ywnXUDFzmsjgb4AqzCZfBU4XjSkgUFnu3U3NUR3Zu12r15qpagCXKuHoNXwYEoiA0AKsIhuky5xK4eDSFi43gCFyObiszJiOxlj7pAM00CYktuMp7LvMpwm3BJV7qLH+WydSXCFSPCl5PdaOqNmAZNeWdd7GzkQsSoyKxhJWqZuatwCWz80a4BCoFF383biszBPQl28qcgcvSVn5bcCUw7rEHrqMcxVmFS01FmIBFu0Qvtc4n0HCTemjFrfysKFU7sERJGdmY7B+A/KD2WEegJLi3BddG/n2Tqefi77LcRuCSe4s3ApcCzAxc1tInGeGy23Mx3rIIFwE1zHOFIzsoAllBkfg3gXrcs2WFrVGvaFVLsIyaP34CfmEFZkSFYxnhKp2EpPyeRYGrVLcoUBEiQ5dYsvNHxVxqGsIIl2Hnj224BCpTuHQq1rIKF99nzCpoBEtMcqOWhcvSkzMErjPipThQGO/aUnmpldOna7VUPVWtwRLJqoUZTz6D+MYNkRQepvYvrhKoOAoTuBzfs+jYhlibnovdtV1wifHnUnDxb9Y8lxxl7uuSPhoLPP3UqoTh3Sr28TGVpWoPllEn84vwY9eHkOzWBIkEbBkbVxLtSrdobVuZEa7SmzMs7Vm0F64ynssGXOpnvs8cXDIlYc5zpfJzXNR3xE/N/dQUQv9OnW8ol0JVq8aAZVRCWjqWPPIYjjZuhORwPVaxcZYHGZ6aYQkuFdSXg0u2lZX2XKYbYq3BJV7rV763IuBSXST/JhOox3lMpyfOCY3EdLdW+C2BGtTlQadTCd1M1TiwjDp98TJW9PoPdjZsgGxdMAHSYQUbVu4zigczxFyO7Vk0B1ecKVz8vyW41EjRDFxGsMzBlcjXHuXxBK8rXx+Ffe1CMMTFVWU5Htmzp1OZ9KqLaixYRl2i/TJ6HNaEhCKjpReS9YSJjSxJ4daz8TfIcppQk4WCpeCS6YjScEm8ZRUumrNwqYlU/k+6vxM8R7bcTuJ7prr5qDzqDzd0x+KYGMMHq+Gq8WCZ6sDxE9j4Rh+sb9kC59r44LgulCNABvts7LU8ytP4N9MELpnnMgsXuySbcPG11uAydosClRzFU8ltoRSeLyc8GnHtgjHRtYVa8fBH2rhXXkZWStU8lL2qVKvAMtXu/YcQO2AgNnXsiMMcUZ4L7oAjISHYRc+2gY2/ng2+MVBnCOwFNA0umYowhUugMlqpmEvg0qwYLgGKr0ugyc3nNF0EssOisdM/GLPcfdDPpYG6qd3DvRUm9+2LlMQj2tXWPtVasEwlz6Bf991cbOvTFxtvvRWb2biZfq2RGRzI+CYY8ewuxTPt4FFyQ8hW/q0cmclSm60B9GQB9HyBNB7jCOMe/l9m5PfTDvH/R4IiVNx0kh5pZ9sAzGjmg/cZK/2d55Flx3/38sOY117F+plzDBdUB1QnwDKnOHq0NTGTsaH/QKx59HGsiorCksauWEcQ4tya4XALbxxv3Qopbf1wpn07pHVoh1Pt/ZHg54u4lj5Y08wD3zdogi/5+rdoMhPe07MN+tzXCZP6v4NlYycg9UiSdra6pzoLljWlFRRif3wiYjdswYqflmDR3AX437TZ+GnaHCz9YQHWLFqKuNhtSDpyFPnnL2rvqpep6sGqV6WoHqx6VYrqwapXpagerHpViurBqlelqB6selWCgP8H0vxXZO18UWEAAAAASUVORK5CYII=" local PingStat = game:service("Stats").PerformanceStats.Ping local function GetLatency() return PingStat:GetValue() / 1000 end placeholderImage = syn.crypt.base64.decode(placeholderImage) local function map(N, OldMin, OldMax, Min, Max) return (N - OldMin) / (OldMax - OldMin) * (Max - Min) + Min end local function reverse_table(tbl) local new_tbl = {} for i = 1, #tbl do new_tbl[#tbl + 1 - i] = tbl[i] end return new_tbl end local NotifLogs = {} local CreateNotification do local notes = {} local function DrawingObject(t, col) local d = Drawing.new(t) d.Visible = true d.Transparency = 1 d.Color = col return d end local function Rectangle(sizex, sizey, fill, col) local s = DrawingObject("Square", col) s.Filled = fill s.Thickness = 1 s.Position = Vector2.new() s.Size = Vector2.new(sizex, sizey) return s end local function Text(text) local s = DrawingObject("Text", Color3.new(1, 1, 1)) s.Text = text s.Size = 13 s.Center = false s.Outline = true s.Position = Vector2.new() s.Font = 2 return s end CreateNotification = function(t, customcolor) table.insert(NotifLogs, string.format("[%s]: %s", os.date("%X"), t)) local gap = 25 local width = 18 local alpha = 255 local time = 0 local estep = 0 local eestep = 0.02 local insety = 0 local Note = { enabled = true, targetPos = Vector2.new(50, 33), size = Vector2.new(200, width), drawings = { outline = Rectangle(202, width + 2, false, Color3.new(0, 0, 0)), fade = Rectangle(202, width + 2, false, Color3.new(0, 0, 0)), }, Remove = function(self, d) if d.Position.x < d.Size.x then for k, drawing in pairs(self.drawings) do drawing:Remove() drawing = false end self.enabled = false end end, Update = function(self, num, listLength, dt) local pos = self.targetPos local indexOffset = (listLength - num) * gap if insety < indexOffset then insety -= (insety - indexOffset) * 0.2 else insety = indexOffset end local size = self.size local tpos = Vector2.new(pos.x - size.x / time - map(alpha, 0, 255, size.x, 0), pos.y + insety) self.pos = tpos local locRect = { x = math.ceil(tpos.x), y = math.ceil(tpos.y), w = math.floor(size.x - map(255 - alpha, 0, 255, 0, 70)), h = size.y, } local fade = math.min(time * 12, alpha) fade = fade > 255 and 255 or fade < 0 and 0 or fade if self.enabled then local linenum = 1 for i, drawing in pairs(self.drawings) do drawing.Transparency = fade / 255 if type(i) == "number" then drawing.Position = Vector2.new(locRect.x + 1, locRect.y + i) drawing.Size = Vector2.new(locRect.w - 2, 1) elseif i == "text" then drawing.Position = tpos + Vector2.new(6, 2) elseif i == "outline" then drawing.Position = Vector2.new(locRect.x, locRect.y) drawing.Size = Vector2.new(locRect.w, locRect.h) elseif i == "fade" then drawing.Position = Vector2.new(locRect.x - 1, locRect.y - 1) drawing.Size = Vector2.new(locRect.w + 2, locRect.h + 2) local t = (200 - fade) / 255 / 3 drawing.Transparency = t < 0.4 and 0.4 or t elseif i:find("line") then drawing.Position = Vector2.new(locRect.x + linenum, locRect.y + 1) if menu then local mencol = customcolor or ( menu:GetVal("Settings", "Cheat Settings", "Menu Accent") and Color3.fromRGB(unpack(menu:GetVal("Settings", "Cheat Settings", "Menu Accent", COLOR))) or Color3.fromRGB(127, 72, 163) ) local color = linenum == 1 and mencol or Color3.fromRGB(mencol.R * 255 - 40, mencol.G * 255 - 40, mencol.B * 255 - 40) if drawing.Color ~= color then drawing.Color = color end end linenum += 1 end end time += estep * dt * 128 estep += eestep * dt * 64 end end, Fade = function(self, num, len, dt) if self.pos.x > self.targetPos.x - 0.2 * len or self.fading then if not self.fading then estep = 0 end self.fading = true alpha -= estep / 4 * len * dt * 50 eestep += 0.01 * dt * 100 end if alpha <= 0 then self:Remove(self.drawings[1]) end end, } for i = 1, Note.size.y - 2 do local c = 0.28 - i / 80 Note.drawings[i] = Rectangle(200, 1, true, Color3.new(c, c, c)) end local color = (menu and menu.GetVal) and customcolor or menu:GetVal("Settings", "Cheat Settings", "Menu Accent") and Color3.fromRGB(unpack(menu:GetVal("Settings", "Cheat Settings", "Menu Accent", COLOR))) or Color3.fromRGB(127, 72, 163) Note.drawings.text = Text(t) if Note.drawings.text.TextBounds.x + 7 > Note.size.x then Note.size = Vector2.new(Note.drawings.text.TextBounds.x + 7, Note.size.y) end Note.drawings.line = Rectangle(1, Note.size.y - 2, true, color) Note.drawings.line1 = Rectangle(1, Note.size.y - 2, true, color) notes[#notes + 1] = Note end renderStepped = game.RunService.RenderStepped:Connect(function(dt) Camera = workspace.CurrentCamera local smallest = math.huge for k = 1, #notes do local v = notes[k] if v and v.enabled then smallest = k < smallest and k or smallest else table.remove(notes, k) end end local length = #notes for k = 1, #notes do local note = notes[k] note:Update(k, length, dt) if k <= math.ceil(length / 10) or note.fading then note:Fade(k, length, dt) end end end) end -- section local menuWidth, menuHeight = 500, 600 menu = { w = menuWidth, h = menuHeight, x = 0, y = 0, columns = { width = math.floor((menuWidth - 40) / 2), left = 17, right = math.floor((menuWidth - 20) / 2) + 13, }, activetab = 1, open = true, fadestart = 0, fading = false, mousedown = false, postable = {}, options = {}, clrs = { norm = {}, dark = {}, togz = {}, }, mc = { 127, 72, 163 }, watermark = {}, connections = {}, list = {}, unloaded = false, copied_clr = nil, game = "uni", tabnames = {}, friends = {}, priority = {}, muted = {}, spectating = false, stat_menu = false, load_time = 0, log_multi = nil, mgrouptabz = {}, backspaceheld = false, backspacetime = -1, backspaceflags = 0, selectall = false, modkeys = { alt = { direction = nil, }, shift = { direction = nil, }, }, modkeydown = function(self, key, direction) local keydata = self.modkeys[key] return keydata.direction and keydata.direction == direction or false end, keybinds = {}, values = {} } local function round(num, numDecimalPlaces) local mult = 10 ^ (numDecimalPlaces or 0) return math.floor(num * mult + 0.5) / mult end local function average(t) local sum = 0 for _, v in pairs(t) do sum = sum + v end return sum / #t end local function clamp(a, lowerNum, higher) if a > higher then return higher elseif a < lowerNum then return lowerNum else return a end end local function CreateThread(func, ...) local thread = coroutine.create(func) coroutine.resume(thread, ...) return thread end local function MultiThreadList(obj, ...) local n = #obj if n > 0 then for i = 1, n do local t = obj[i] if type(t) == "table" then local d = #t assert(d ~= 0, "table inserted was not an array or was empty") assert(d < 3, ("invalid number of arguments (%d)"):format(d)) local thetype = type(t[1]) assert( thetype == "function", ("invalid argument #1: expected 'function', got '%s'"):format(tostring(thetype)) ) CreateThread(t[1], unpack(t[2])) else CreateThread(t, ...) end end else for i, v in pairs(obj) do CreateThread(v, ...) end end end local DeepRestoreTableFunctions, DeepCleanupTable DeepRestoreTableFunctions = function(tbl) for k, v in next, tbl do if type(v) == "function" and is_synapse_function(v) then for k1, v1 in next, getupvalues(v) do if type(v1) == "function" and islclosure(v1) and not is_synapse_function(v1) then tbl[k] = v1 end end end if type(v) == "table" then DeepRestoreTableFunctions(v) end end end DeepCleanupTable = function(tbl) local numTable = #tbl local isTableArray = numTable > 0 if isTableArray then for i = 1, numTable do local entry = tbl[i] local entryType = type(entry) if entryType == "table" then DeepCleanupTable(tbl) end tbl[i] = nil entry = nil entryType = nil end else for k, v in next, tbl do if type(v) == "table" then DeepCleanupTable(tbl) end end tbl[k] = nil end numTable = nil isTableArray = nil end local event = {} local allevent = {} function event.new(eventname, eventtable, requirename) if eventname then assert( allevent[eventname] == nil, ("the event '%s' already exists in the event table"):format(eventname) ) end local newevent = eventtable or {} local funcs = {} local disconnectlist = {} function newevent:fire(...) allevent[eventname].fire(...) end function newevent:connect(func) funcs[#funcs + 1] = func local disconnected = false local function disconnect() if not disconnected then disconnected = true disconnectlist[func] = true end end return disconnect end local function fire(...) local n = #funcs local j = 0 for i = 1, n do local func = funcs[i] if disconnectlist[func] then disconnectlist[func] = nil else j = j + 1 funcs[j] = func end end for i = j + 1, n do funcs[i] = nil end for i = 1, j do CreateThread(function(...) pcall(funcs[i], ...) end, ...) end end if eventname then allevent[eventname] = { event = newevent, fire = fire, } end return newevent, fire end local function FireEvent(eventname, ...) if allevent[eventname] then return allevent[eventname].fire(...) else end end local function GetEvent(eventname) return allevent[eventname] end local ZMonth_IMAGES = {} MultiThreadList({ function() ZMonth_IMAGES[1] = game:HttpGet("https://i.imgur.com/9NMuFcQ.png") end, function() ZMonth_IMAGES[2] = game:HttpGet("https://i.imgur.com/jG3NjxN.png") end, function() ZMonth_IMAGES[3] = game:HttpGet("https://i.imgur.com/2Ty4u2O.png") end, function() ZMonth_IMAGES[4] = game:HttpGet("https://i.imgur.com/kNGuTlj.png") end, function() ZMonth_IMAGES[5] = game:HttpGet("https://i.imgur.com/OZUR3EY.png") end, function() ZMonth_IMAGES[6] = game:HttpGet("https://i.imgur.com/3HGuyVa.png") end, }) local loaded = {} do local function Loopy_Image_Checky() for i = 1, 6 do local v = ZMonth_IMAGES[i] if v == nil then return true elseif not loaded[i] then loaded[i] = true end end return false end while Loopy_Image_Checky() do wait(0) end end if game.PlaceId == 301549746 then menu.game = "CB Configs" end loadstart = tick() local NETWORK = game:service("NetworkClient") local NETWORK_SETTINGS = settings().Network NETWORK:SetOutgoingKBPSLimit(0) setfpscap(getgenv().maxfps or 144) if game.PlaceId == 301549746 then menu.game = 'cb' end if not isfolder("zeromonth") then makefolder("zeromonth") end if not isfolder("zeromonth/" .. menu.game) then makefolder("zeromonth/" .. menu.game) end local configs = {} local function GetConfigs() local result = {} local directory = "zeromonth\\" .. menu.game for k, v in pairs(listfiles(directory)) do local clipped = v:sub(#directory + 2) if clipped:sub(#clipped - 2) == ".zm" then clipped = clipped:sub(0, #clipped - 3) result[k] = clipped configs[k] = v end end if #result <= 0 then writefile("zeromonth/" .. menu.game .. "/Default.zm", "") end return result end local Players = game:GetService("Players") local LIGHTING = game:GetService("Lighting") local stats = game:GetService("Stats") local LOCAL_PLAYER = Players.LocalPlayer local LOCAL_MOUSE = LOCAL_PLAYER:GetMouse() local TEAMS = game:GetService("Teams") local INPUT_SERVICE = game:GetService("UserInputService") local TELEPORT_SERVICE = game:GetService("TeleportService") local GAME_SETTINGS = UserSettings():GetService("UserGameSettings") local CACHED_VEC3 = Vector3.new() local Camera = workspace.CurrentCamera local SCREEN_SIZE = Camera.ViewportSize local ButtonPressed = event.new("zm_buttonpressed") local TogglePressed = event.new("zm_togglepressed") local MouseMoved = event.new("zm_mousemoved") local GRAVITY = Vector3.new(0, -192.6, 0) menu.x = math.floor((SCREEN_SIZE.x / 2) - (menu.w / 2)) menu.y = math.floor((SCREEN_SIZE.y / 2) - (menu.h / 2)) local Lerp = function(delta, from, to) if (delta > 1) then return to end if (delta < 0) then return from end return from + (to - from) * delta end local ColorRange = function(value, ranges) if value <= ranges[1].start then return ranges[1].color end if value >= ranges[#ranges].start then return ranges[#ranges].color end local selected = #ranges for i = 1, #ranges - 1 do if value < ranges[i + 1].start then selected = i break end end local minColor = ranges[selected] local maxColor = ranges[selected + 1] local lerpValue = (value - minColor.start) / (maxColor.start - minColor.start) return Color3.new( Lerp(lerpValue, minColor.color.r, maxColor.color.r), Lerp(lerpValue, minColor.color.g, maxColor.color.g), Lerp(lerpValue, minColor.color.b, maxColor.color.b) ) end local bVector2 = {} do function bVector2:getRotate(Vec, Rads) local vec = Vec.Unit local sin = math.sin(Rads) local cos = math.cos(Rads) local x = (cos * vec.x) - (sin * vec.y) local y = (sin * vec.x) + (cos * vec.y) return Vector2.new(x, y).Unit * Vec.Magnitude end end local bColor = {} do function bColor:Mult(col, mult) return Color3.new(col.R * mult, col.G * mult, col.B * mult) end function bColor:Add(col, num) return Color3.new(col.R + num, col.G + num, col.B + num) end end local function string_cut(s1, num) return num == 0 and s1 or string.sub(s1, 1, num) end local textBoxLetters = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", } local keyNames = { One = "1", Two = "2", Three = "3", Four = "4", Five = "5", Six = "6", Seven = "7", Eight = "8", Nine = "9", Zero = "0", LeftBracket = "[", RightBracket = "]", Semicolon = ";", BackSlash = "\\", Slash = "/", Minus = "-", Equals = "=", Return = "Enter", Backquote = "`", CapsLock = "Caps", LeftShift = "LShift", RightShift = "RShift", LeftControl = "LCtrl", RightControl = "RCtrl", LeftAlt = "LAlt", RightAlt = "RAlt", Backspace = "Back", Plus = "+", Multiplaye = "x", PageUp = "PgUp", PageDown = "PgDown", Delete = "Del", Insert = "Ins", NumLock = "NumL", Comma = ",", Period = ".", } local colemak = { E = "F", R = "P", T = "G", Y = "J", U = "L", I = "U", O = "Y", P = ";", S = "R", D = "S", F = "T", G = "D", J = "N", K = "E", L = "I", [";"] = "O", N = "K", } local keymodifiernames = { ["`"] = "~", ["1"] = "!", ["2"] = "@", ["3"] = "#", ["4"] = "$", ["5"] = "%", ["6"] = "^", ["7"] = "&", ["8"] = "*", ["9"] = "(", ["0"] = ")", ["-"] = "_", ["="] = "+", ["["] = "{", ["]"] = "}", ["\\"] = "|", [";"] = ":", ["'"] = '"', [","] = "<", ["."] = ".", ["/"] = "?", } local function KeyEnumToName(key) if key == nil then return "None" end local _key = tostring(key) .. "." local _key = _key:gsub("%.", ",") local keyname = nil local looptime = 0 for w in _key:gmatch("(.-),") do looptime = looptime + 1 if looptime == 3 then keyname = w end end if string.match(keyname, "Keypad") then keyname = string.gsub(keyname, "Keypad", "") end if keyname == "Unknown" or key.Value == 27 then return "None" end if keyNames[keyname] then keyname = keyNames[keyname] end if Nate then return colemak[keyname] or keyname else return keyname end end local invalidfilekeys = { ["\\"] = true, ["/"] = true, [":"] = true, ["*"] = true, ["?"] = true, ['"'] = true, ["<"] = true, [">"] = true, ["|"] = true, } local function KeyModifierToName(key, filename) if keymodifiernames[key] ~= nil then if filename then if invalidfilekeys[keymodifiernames[key]] then return "" else return keymodifiernames[key] end else return keymodifiernames[key] end else return "" end end local allrender = {} local RGB = Color3.fromRGB local Draw = {} do function Draw:UnRender() for k, v in pairs(allrender) do for k1, v1 in pairs(v) do if v1 and type(v1) ~= "number" and v1.__OBJECT_EXISTS then v1:Remove() else end end end end function Draw:OutlinedRect(visible, pos_x, pos_y, width, height, clr, tablename) local temptable = Drawing.new("Square") temptable.Visible = visible temptable.Position = Vector2.new(pos_x, pos_y) temptable.Size = Vector2.new(width, height) temptable.Color = RGB(clr[1], clr[2], clr[3]) temptable.Filled = false temptable.Thickness = 0 temptable.Transparency = clr[4] / 255 table.insert(tablename, temptable) if not table.find(allrender, tablename) then table.insert(allrender, tablename) end end function Draw:FilledRect(visible, pos_x, pos_y, width, height, clr, tablename) local temptable = Drawing.new("Square") temptable.Visible = visible temptable.Position = Vector2.new(pos_x, pos_y) temptable.Size = Vector2.new(width, height) temptable.Color = RGB(clr[1], clr[2], clr[3]) temptable.Filled = true temptable.Thickness = 0 temptable.Transparency = clr[4] / 255 table.insert(tablename, temptable) if not table.find(allrender, tablename) then table.insert(allrender, tablename) end end function Draw:Line(visible, thickness, start_x, start_y, end_x, end_y, clr, tablename) temptable = Drawing.new("Line") temptable.Visible = visible temptable.Thickness = thickness temptable.From = Vector2.new(start_x, start_y) temptable.To = Vector2.new(end_x, end_y) temptable.Color = RGB(clr[1], clr[2], clr[3]) temptable.Transparency = clr[4] / 255 table.insert(tablename, temptable) if not table.find(allrender, tablename) then table.insert(allrender, tablename) end end function Draw:Image(visible, imagedata, pos_x, pos_y, width, height, transparency, tablename) local temptable = Drawing.new("Image") temptable.Visible = visible temptable.Position = Vector2.new(pos_x, pos_y) temptable.Size = Vector2.new(width, height) temptable.Transparency = transparency temptable.Data = imagedata or placeholderImage table.insert(tablename, temptable) if not table.find(allrender, tablename) then table.insert(allrender, tablename) end end function Draw:Text(text, font, visible, pos_x, pos_y, size, centered, clr, tablename) local temptable = Drawing.new("Text") temptable.Text = text temptable.Visible = visible temptable.Position = Vector2.new(pos_x, pos_y) temptable.Size = size temptable.Center = centered temptable.Color = RGB(clr[1], clr[2], clr[3]) temptable.Transparency = clr[4] / 255 temptable.Outline = false temptable.Font = font table.insert(tablename, temptable) if not table.find(allrender, tablename) then table.insert(allrender, tablename) end end function Draw:OutlinedText(text, font, visible, pos_x, pos_y, size, centered, clr, clr2, tablename) local temptable = Drawing.new("Text") temptable.Text = text temptable.Visible = visible temptable.Position = Vector2.new(pos_x, pos_y) temptable.Size = size temptable.Center = centered temptable.Color = RGB(clr[1], clr[2], clr[3]) temptable.Transparency = clr[4] / 255 temptable.Outline = true temptable.OutlineColor = RGB(clr2[1], clr2[2], clr2[3]) temptable.Font = font if not table.find(allrender, tablename) then table.insert(allrender, tablename) end if tablename then table.insert(tablename, temptable) end return temptable end function Draw:Triangle(visible, filled, pa, pb, pc, clr, tablename) clr = clr or { 255, 255, 255, 1 } local temptable = Drawing.new("Triangle") temptable.Visible = visible temptable.Transparency = clr[4] or 1 temptable.Color = RGB(clr[1], clr[2], clr[3]) temptable.Thickness = 4.1 if pa and pb and pc then temptable.PointA = Vector2.new(pa[1], pa[2]) temptable.PointB = Vector2.new(pb[1], pb[2]) temptable.PointC = Vector2.new(pc[1], pc[2]) end temptable.Filled = filled table.insert(tablename, temptable) if tablename and not table.find(allrender, tablename) then table.insert(allrender, tablename) end end function Draw:Circle(visible, pos_x, pos_y, size, thickness, sides, clr, tablename) local temptable = Drawing.new("Circle") temptable.Position = Vector2.new(pos_x, pos_y) temptable.Visible = visible temptable.Radius = size temptable.Thickness = thickness temptable.NumSides = sides temptable.Transparency = clr[4] temptable.Filled = false temptable.Color = RGB(clr[1], clr[2], clr[3]) table.insert(tablename, temptable) if not table.find(allrender, tablename) then table.insert(allrender, tablename) end end function Draw:FilledCircle(visible, pos_x, pos_y, size, thickness, sides, clr, tablename) local temptable = Drawing.new("Circle") temptable.Position = Vector2.new(pos_x, pos_y) temptable.Visible = visible temptable.Radius = size temptable.Thickness = thickness temptable.NumSides = sides temptable.Transparency = clr[4] temptable.Filled = true temptable.Color = RGB(clr[1], clr[2], clr[3]) table.insert(tablename, temptable) if not table.find(allrender, tablename) then table.insert(allrender, tablename) end end function Draw:MenuOutlinedRect(visible, pos_x, pos_y, width, height, clr, tablename) Draw:OutlinedRect(visible, pos_x + menu.x, pos_y + menu.y, width, height, clr, tablename) table.insert(menu.postable, { tablename[#tablename], pos_x, pos_y }) if menu.log_multi ~= nil then table.insert(menu.mgrouptabz[menu.log_multi[1]][menu.log_multi[2]], tablename[#tablename]) end end function Draw:MenuFilledRect(visible, pos_x, pos_y, width, height, clr, tablename) Draw:FilledRect(visible, pos_x + menu.x, pos_y + menu.y, width, height, clr, tablename) table.insert(menu.postable, { tablename[#tablename], pos_x, pos_y }) if menu.log_multi ~= nil then table.insert(menu.mgrouptabz[menu.log_multi[1]][menu.log_multi[2]], tablename[#tablename]) end end function Draw:MenuImage(visible, imagedata, pos_x, pos_y, width, height, transparency, tablename) Draw:Image(visible, imagedata, pos_x + menu.x, pos_y + menu.y, width, height, transparency, tablename) table.insert(menu.postable, { tablename[#tablename], pos_x, pos_y }) if menu.log_multi ~= nil then table.insert(menu.mgrouptabz[menu.log_multi[1]][menu.log_multi[2]], tablename[#tablename]) end end function Draw:MenuBigText(text, visible, centered, pos_x, pos_y, tablename) local text = Draw:OutlinedText( text, 2, visible, pos_x + menu.x, pos_y + menu.y, 13, centered, { 255, 255, 255, 255 }, { 0, 0, 0 }, tablename ) table.insert(menu.postable, { tablename[#tablename], pos_x, pos_y }) if menu.log_multi ~= nil then table.insert(menu.mgrouptabz[menu.log_multi[1]][menu.log_multi[2]], tablename[#tablename]) end return text end function Draw:CoolBox(name, x, y, width, height, tab) Draw:MenuOutlinedRect(true, x, y, width, height, { 0, 0, 0, 255 }, tab) Draw:MenuOutlinedRect(true, x + 1, y + 1, width - 2, height - 2, { 20, 20, 20, 255 }, tab) Draw:MenuOutlinedRect(true, x + 2, y + 2, width - 3, 1, { 127, 72, 163, 255 }, tab) table.insert(menu.clrs.norm, tab[#tab]) Draw:MenuOutlinedRect(true, x + 2, y + 3, width - 3, 1, { 87, 32, 123, 255 }, tab) table.insert(menu.clrs.dark, tab[#tab]) Draw:MenuOutlinedRect(true, x + 2, y + 4, width - 3, 1, { 20, 20, 20, 255 }, tab) for i = 0, 7 do Draw:MenuFilledRect(true, x + 2, y + 5 + (i * 2), width - 4, 2, { 45, 45, 45, 255 }, tab) tab[#tab].Color = ColorRange( i, { [1] = { start = 0, color = RGB(45, 45, 45) }, [2] = { start = 7, color = RGB(35, 35, 35) } } ) end Draw:MenuBigText(name, true, false, x + 6, y + 5, tab) end function Draw:CoolMultiBox(names, x, y, width, height, tab) Draw:MenuOutlinedRect(true, x, y, width, height, { 0, 0, 0, 255 }, tab) Draw:MenuOutlinedRect(true, x + 1, y + 1, width - 2, height - 2, { 20, 20, 20, 255 }, tab) Draw:MenuOutlinedRect(true, x + 2, y + 2, width - 3, 1, { 127, 72, 163, 255 }, tab) table.insert(menu.clrs.norm, tab[#tab]) Draw:MenuOutlinedRect(true, x + 2, y + 3, width - 3, 1, { 87, 32, 123, 255 }, tab) table.insert(menu.clrs.dark, tab[#tab]) Draw:MenuOutlinedRect(true, x + 2, y + 4, width - 3, 1, { 20, 20, 20, 255 }, tab) Draw:MenuFilledRect(true, x + 2, y + 5, width - 4, 18, { 30, 30, 30, 255 }, tab) Draw:MenuFilledRect(true, x + 2, y + 21, width - 4, 2, { 20, 20, 20, 255 }, tab) local selected = {} for i = 0, 8 do Draw:MenuFilledRect(true, x + 2, y + 5 + (i * 2), width - 159, 2, { 45, 45, 45, 255 }, tab) tab[#tab].Color = ColorRange( i, { [1] = { start = 0, color = RGB(50, 50, 50) }, [2] = { start = 8, color = RGB(35, 35, 35) } } ) table.insert(selected, { postable = #menu.postable, drawn = tab[#tab] }) end local length = 2 local selected_pos = {} local click_pos = {} local nametext = {} for i, v in ipairs(names) do Draw:MenuBigText(v, true, false, x + 4 + length, y + 5, tab) if i == 1 then tab[#tab].Color = RGB(255, 255, 255) else tab[#tab].Color = RGB(170, 170, 170) end table.insert(nametext, tab[#tab]) Draw:MenuFilledRect(true, x + length + tab[#tab].TextBounds.X + 8, y + 5, 2, 16, { 20, 20, 20, 255 }, tab) table.insert(selected_pos, { pos = x + length, length = tab[#tab - 1].TextBounds.X + 8 }) table.insert(click_pos, { x = x + length, y = y + 5, width = tab[#tab - 1].TextBounds.X + 8, height = 18, name = v, num = i, }) length += tab[#tab - 1].TextBounds.X + 10 end local settab = 1 for k, v in pairs(selected) do menu.postable[v.postable][2] = selected_pos[settab].pos v.drawn.Size = Vector2.new(selected_pos[settab].length, 2) end return { bar = selected, barpos = selected_pos, click_pos = click_pos, nametext = nametext } end function Draw:Toggle(name, value, unsafe, x, y, tab) Draw:MenuOutlinedRect(true, x, y, 12, 12, { 30, 30, 30, 255 }, tab) Draw:MenuOutlinedRect(true, x + 1, y + 1, 10, 10, { 0, 0, 0, 255 }, tab) local temptable = {} for i = 0, 3 do Draw:MenuFilledRect(true, x + 2, y + 2 + (i * 2), 8, 2, { 0, 0, 0, 255 }, tab) table.insert(temptable, tab[#tab]) if value then tab[#tab].Color = ColorRange(i, { [1] = { start = 0, color = RGB(menu.mc[1], menu.mc[2], menu.mc[3]) }, [2] = { start = 3, color = RGB(menu.mc[1] - 40, menu.mc[2] - 40, menu.mc[3] - 40) }, }) else tab[#tab].Color = ColorRange(i, { [1] = { start = 0, color = RGB(50, 50, 50) }, [2] = { start = 3, color = RGB(30, 30, 30) }, }) end end Draw:MenuBigText(name, true, false, x + 16, y - 1, tab) if unsafe == true then tab[#tab].Color = RGB(245, 239, 120) end table.insert(temptable, tab[#tab]) return temptable end function Draw:Keybind(key, x, y, tab) local temptable = {} Draw:MenuFilledRect(true, x, y, 44, 16, { 25, 25, 25, 255 }, tab) Draw:MenuBigText(KeyEnumToName(key), true, true, x + 22, y + 1, tab) table.insert(temptable, tab[#tab]) Draw:MenuOutlinedRect(true, x, y, 44, 16, { 30, 30, 30, 255 }, tab) table.insert(temptable, tab[#tab]) Draw:MenuOutlinedRect(true, x + 1, y + 1, 42, 14, { 0, 0, 0, 255 }, tab) return temptable end function Draw:ColorPicker(color, x, y, tab) local temptable = {} Draw:MenuOutlinedRect(true, x, y, 28, 14, { 30, 30, 30, 255 }, tab) Draw:MenuOutlinedRect(true, x + 1, y + 1, 26, 12, { 0, 0, 0, 255 }, tab) Draw:MenuFilledRect(true, x + 2, y + 2, 24, 10, { color[1], color[2], color[3], 255 }, tab) table.insert(temptable, tab[#tab]) Draw:MenuOutlinedRect(true, x + 2, y + 2, 24, 10, { color[1] - 40, color[2] - 40, color[3] - 40, 255 }, tab) table.insert(temptable, tab[#tab]) Draw:MenuOutlinedRect(true, x + 3, y + 3, 22, 8, { color[1] - 40, color[2] - 40, color[3] - 40, 255 }, tab) table.insert(temptable, tab[#tab]) return temptable end function Draw:Slider(name, stradd, value, minvalue, maxvalue, customvals, rounded, x, y, length, tab) Draw:MenuBigText(name, true, false, x, y - 3, tab) for i = 0, 3 do Draw:MenuFilledRect(true, x + 2, y + 14 + (i * 2), length - 4, 2, { 0, 0, 0, 255 }, tab) tab[#tab].Color = ColorRange( i, { [1] = { start = 0, color = RGB(50, 50, 50) }, [2] = { start = 3, color = RGB(30, 30, 30) } } ) end local temptable = {} for i = 0, 3 do Draw:MenuFilledRect( true, x + 2, y + 14 + (i * 2), (length - 4) * ((value - minvalue) / (maxvalue - minvalue)), 2, { 0, 0, 0, 255 }, tab ) table.insert(temptable, tab[#tab]) tab[#tab].Color = ColorRange(i, { [1] = { start = 0, color = RGB(menu.mc[1], menu.mc[2], menu.mc[3]) }, [2] = { start = 3, color = RGB(menu.mc[1] - 40, menu.mc[2] - 40, menu.mc[3] - 40) }, }) end Draw:MenuOutlinedRect(true, x, y + 12, length, 12, { 30, 30, 30, 255 }, tab) Draw:MenuOutlinedRect(true, x + 1, y + 13, length - 2, 10, { 0, 0, 0, 255 }, tab) local textstr = "" if stradd == nil then stradd = "" end local decplaces = rounded and string.rep("0", math.log(1 / rounded) / math.log(10)) or 1 if rounded and value == math.floor(value * decplaces) then textstr = tostring(value) .. "." .. decplaces .. stradd else textstr = tostring(value) .. stradd end Draw:MenuBigText(customvals[value] or textstr, true, true, x + (length * 0.5), y + 11, tab) table.insert(temptable, tab[#tab]) table.insert(temptable, stradd) return temptable end function Draw:Dropbox(name, value, values, x, y, length, tab) local temptable = {} Draw:MenuBigText(name, true, false, x, y - 3, tab) for i = 0, 7 do Draw:MenuFilledRect(true, x + 2, y + 14 + (i * 2), length - 4, 2, { 0, 0, 0, 255 }, tab) tab[#tab].Color = ColorRange( i, { [1] = { start = 0, color = RGB(50, 50, 50) }, [2] = { start = 7, color = RGB(35, 35, 35) } } ) end Draw:MenuOutlinedRect(true, x, y + 12, length, 22, { 30, 30, 30, 255 }, tab) Draw:MenuOutlinedRect(true, x + 1, y + 13, length - 2, 20, { 0, 0, 0, 255 }, tab) Draw:MenuBigText(tostring(values[value]), true, false, x + 6, y + 16, tab) table.insert(temptable, tab[#tab]) Draw:MenuBigText("-", true, false, x - 17 + length, y + 16, tab) table.insert(temptable, tab[#tab]) return temptable end function Draw:Combobox(name, values, x, y, length, tab) local temptable = {} Draw:MenuBigText(name, true, false, x, y - 3, tab) for i = 0, 7 do Draw:MenuFilledRect(true, x + 2, y + 14 + (i * 2), length - 4, 2, { 0, 0, 0, 255 }, tab) tab[#tab].Color = ColorRange( i, { [1] = { start = 0, color = RGB(50, 50, 50) }, [2] = { start = 7, color = RGB(35, 35, 35) } } ) end Draw:MenuOutlinedRect(true, x, y + 12, length, 22, { 30, 30, 30, 255 }, tab) Draw:MenuOutlinedRect(true, x + 1, y + 13, length - 2, 20, { 0, 0, 0, 255 }, tab) local textthing = "" for k, v in pairs(values) do if v[2] then if textthing == "" then textthing = v[1] else textthing ..= ", " .. v[1] end end end textthing = string_cut(textthing, 25) textthing = textthing ~= "" and textthing or "None" Draw:MenuBigText(textthing, true, false, x + 6, y + 16, tab) table.insert(temptable, tab[#tab]) Draw:MenuBigText("...", true, false, x - 27 + length, y + 16, tab) table.insert(temptable, tab[#tab]) return temptable end function Draw:Button(name, x, y, length, tab) local temptable = {} for i = 0, 8 do Draw:MenuFilledRect(true, x + 2, y + 2 + (i * 2), length - 4, 2, { 0, 0, 0, 255 }, tab) tab[#tab].Color = ColorRange( i, { [1] = { start = 0, color = RGB(50, 50, 50) }, [2] = { start = 8, color = RGB(35, 35, 35) } } ) table.insert(temptable, tab[#tab]) end Draw:MenuOutlinedRect(true, x, y, length, 22, { 30, 30, 30, 255 }, tab) Draw:MenuOutlinedRect(true, x + 1, y + 1, length - 2, 20, { 0, 0, 0, 255 }, tab) temptable.text = Draw:MenuBigText(name, true, true, x + math.floor(length * 0.5), y + 4, tab) return temptable end function Draw:List(name, x, y, length, maxamount, columns, tab) local temptable = { uparrow = {}, downarrow = {}, liststuff = { rows = {}, words = {} } } for i, v in ipairs(name) do Draw:MenuBigText( v, true, false, (math.floor(length / columns) * i) - math.floor(length / columns) + 30, y - 3, tab ) end Draw:MenuOutlinedRect(true, x, y + 12, length, 22 * maxamount + 4, { 30, 30, 30, 255 }, tab) Draw:MenuOutlinedRect(true, x + 1, y + 13, length - 2, 22 * maxamount + 2, { 0, 0, 0, 255 }, tab) Draw:MenuFilledRect(true, x + length - 7, y + 16, 1, 1, { menu.mc[1], menu.mc[2], menu.mc[3], 255 }, tab) table.insert(temptable.uparrow, tab[#tab]) table.insert(menu.clrs.norm, tab[#tab]) Draw:MenuFilledRect(true, x + length - 8, y + 17, 3, 1, { menu.mc[1], menu.mc[2], menu.mc[3], 255 }, tab) table.insert(temptable.uparrow, tab[#tab]) table.insert(menu.clrs.norm, tab[#tab]) Draw:MenuFilledRect(true, x + length - 9, y + 18, 5, 1, { menu.mc[1], menu.mc[2], menu.mc[3], 255 }, tab) table.insert(temptable.uparrow, tab[#tab]) table.insert(menu.clrs.norm, tab[#tab]) Draw:MenuFilledRect( true, x + length - 7, y + 16 + (22 * maxamount + 4) - 9, 1, 1, { menu.mc[1], menu.mc[2], menu.mc[3], 255 }, tab ) table.insert(temptable.downarrow, tab[#tab]) table.insert(menu.clrs.norm, tab[#tab]) Draw:MenuFilledRect( true, x + length - 8, y + 16 + (22 * maxamount + 4) - 10, 3, 1, { menu.mc[1], menu.mc[2], menu.mc[3], 255 }, tab ) table.insert(temptable.downarrow, tab[#tab]) table.insert(menu.clrs.norm, tab[#tab]) Draw:MenuFilledRect( true, x + length - 9, y + 16 + (22 * maxamount + 4) - 11, 5, 1, { menu.mc[1], menu.mc[2], menu.mc[3], 255 }, tab ) table.insert(temptable.downarrow, tab[#tab]) table.insert(menu.clrs.norm, tab[#tab]) for i = 1, maxamount do temptable.liststuff.rows[i] = {} if i ~= maxamount then Draw:MenuOutlinedRect(true, x + 4, (y + 13) + (22 * i), length - 8, 2, { 20, 20, 20, 255 }, tab) table.insert(temptable.liststuff.rows[i], tab[#tab]) end if columns ~= nil then for i1 = 1, columns - 1 do Draw:MenuOutlinedRect( true, x + math.floor(length / columns) * i1, (y + 13) + (22 * i) - 18, 2, 16, { 20, 20, 20, 255 }, tab ) table.insert(temptable.liststuff.rows[i], tab[#tab]) end end temptable.liststuff.words[i] = {} if columns ~= nil then for i1 = 1, columns do Draw:MenuBigText( "", true, false, (x + math.floor(length / columns) * i1) - math.floor(length / columns) + 5, (y + 13) + (22 * i) - 16, tab ) table.insert(temptable.liststuff.words[i], tab[#tab]) end else Draw:MenuBigText("", true, false, x + 5, (y + 13) + (22 * i) - 16, tab) table.insert(temptable.liststuff.words[i], tab[#tab]) end end return temptable end function Draw:ImageWithText(size, image, text, x, y, tab) local temptable = {} Draw:MenuOutlinedRect(true, x, y, size + 4, size + 4, { 30, 30, 30, 255 }, tab) Draw:MenuOutlinedRect(true, x + 1, y + 1, size + 2, size + 2, { 0, 0, 0, 255 }, tab) Draw:MenuFilledRect(true, x + 2, y + 2, size, size, { 40, 40, 40, 255 }, tab) Draw:MenuBigText(text, true, false, x + size + 8, y, tab) table.insert(temptable, tab[#tab]) Draw:MenuImage(true, ZMonth_IMAGES[5], x + 2, y + 2, size, size, 1, tab) table.insert(temptable, tab[#tab]) return temptable end function Draw:TextBox(name, text, x, y, length, tab) for i = 0, 8 do Draw:MenuFilledRect(true, x + 2, y + 2 + (i * 2), length - 4, 2, { 0, 0, 0, 255 }, tab) tab[#tab].Color = ColorRange( i, { [1] = { start = 0, color = RGB(50, 50, 50) }, [2] = { start = 8, color = RGB(35, 35, 35) } } ) end Draw:MenuOutlinedRect(true, x, y, length, 22, { 30, 30, 30, 255 }, tab) Draw:MenuOutlinedRect(true, x + 1, y + 1, length - 2, 20, { 0, 0, 0, 255 }, tab) Draw:MenuBigText(text, true, false, x + 6, y + 4, tab) return tab[#tab] end end local networkin = { incoming = {}, outgoing = {}, } for i = 1, 21 do networkin.incoming[i] = 20 networkin.outgoing[i] = 2 end local lasttick = tick() local infopos = 400 local graphs = { incoming = { pos = { x = 35, y = infopos, }, sides = {}, graph = {}, }, outgoing = { pos = { x = 35, y = infopos + 97, }, sides = {}, graph = {}, }, other = {}, } Draw:OutlinedText( "incoming kbps: 20", 2, false, graphs.incoming.pos.x - 1, graphs.incoming.pos.y - 15, 13, false, { 255, 255, 255, 255 }, { 10, 10, 10 }, graphs.incoming.sides ) Draw:OutlinedText( "80", 2, false, graphs.incoming.pos.x - 21, graphs.incoming.pos.y - 7, 13, false, { 255, 255, 255, 255 }, { 10, 10, 10 }, graphs.incoming.sides ) Draw:FilledRect( false, graphs.incoming.pos.x - 1, graphs.incoming.pos.y - 1, 222, 82, { 10, 10, 10, 50 }, graphs.incoming.sides ) Draw:Line( false, 3, graphs.incoming.pos.x, graphs.incoming.pos.y - 1, graphs.incoming.pos.x, graphs.incoming.pos.y + 82, { 20, 20, 20, 225 }, graphs.incoming.sides ) Draw:Line( false, 3, graphs.incoming.pos.x, graphs.incoming.pos.y + 80, graphs.incoming.pos.x + 221, graphs.incoming.pos.y + 80, { 20, 20, 20, 225 }, graphs.incoming.sides ) Draw:Line( false, 3, graphs.incoming.pos.x, graphs.incoming.pos.y, graphs.incoming.pos.x - 6, graphs.incoming.pos.y, { 20, 20, 20, 225 }, graphs.incoming.sides ) Draw:Line( false, 1, graphs.incoming.pos.x, graphs.incoming.pos.y, graphs.incoming.pos.x, graphs.incoming.pos.y + 80, { 255, 255, 255, 225 }, graphs.incoming.sides ) Draw:Line( false, 1, graphs.incoming.pos.x, graphs.incoming.pos.y + 80, graphs.incoming.pos.x + 220, graphs.incoming.pos.y + 80, { 255, 255, 255, 225 }, graphs.incoming.sides ) Draw:Line( false, 1, graphs.incoming.pos.x, graphs.incoming.pos.y, graphs.incoming.pos.x - 5, graphs.incoming.pos.y, { 255, 255, 255, 225 }, graphs.incoming.sides ) for i = 1, 20 do Draw:Line(false, 1, 10, 10, 10, 10, { 255, 255, 255, 225 }, graphs.incoming.graph) end Draw:Line(false, 1, 10, 10, 10, 10, { 68, 255, 0, 255 }, graphs.incoming.graph) Draw:OutlinedText("avg: 20", 2, false, 20, 20, 13, false, { 68, 255, 0, 255 }, { 10, 10, 10 }, graphs.incoming.graph) Draw:OutlinedText( "outgoing kbps: 5", 2, false, graphs.outgoing.pos.x - 1, graphs.outgoing.pos.y - 15, 13, false, { 255, 255, 255, 255 }, { 10, 10, 10 }, graphs.outgoing.sides ) Draw:OutlinedText( "10", 2, false, graphs.outgoing.pos.x - 21, graphs.outgoing.pos.y - 7, 13, false, { 255, 255, 255, 255 }, { 10, 10, 10 }, graphs.outgoing.sides ) Draw:FilledRect( false, graphs.outgoing.pos.x - 1, graphs.outgoing.pos.y - 1, 222, 82, { 10, 10, 10, 50 }, graphs.outgoing.sides ) Draw:Line( false, 3, graphs.outgoing.pos.x, graphs.outgoing.pos.y - 1, graphs.outgoing.pos.x, graphs.outgoing.pos.y + 82, { 20, 20, 20, 225 }, graphs.outgoing.sides ) Draw:Line( false, 3, graphs.outgoing.pos.x, graphs.outgoing.pos.y + 80, graphs.outgoing.pos.x + 221, graphs.outgoing.pos.y + 80, { 20, 20, 20, 225 }, graphs.outgoing.sides ) Draw:Line( false, 3, graphs.outgoing.pos.x, graphs.outgoing.pos.y, graphs.outgoing.pos.x - 6, graphs.outgoing.pos.y, { 20, 20, 20, 225 }, graphs.outgoing.sides ) Draw:Line( false, 1, graphs.outgoing.pos.x, graphs.outgoing.pos.y, graphs.outgoing.pos.x, graphs.outgoing.pos.y + 80, { 255, 255, 255, 225 }, graphs.outgoing.sides ) Draw:Line( false, 1, graphs.outgoing.pos.x, graphs.outgoing.pos.y + 80, graphs.outgoing.pos.x + 220, graphs.outgoing.pos.y + 80, { 255, 255, 255, 225 }, graphs.outgoing.sides ) Draw:Line( false, 1, graphs.outgoing.pos.x, graphs.outgoing.pos.y, graphs.outgoing.pos.x - 5, graphs.outgoing.pos.y, { 255, 255, 255, 225 }, graphs.outgoing.sides ) for i = 1, 20 do Draw:Line(false, 1, 10, 10, 10, 10, { 255, 255, 255, 225 }, graphs.outgoing.graph) end Draw:Line(false, 1, 10, 10, 10, 10, { 68, 255, 0, 255 }, graphs.outgoing.graph) Draw:OutlinedText("avg: 20", 2, false, 20, 20, 13, false, { 68, 255, 0, 255 }, { 10, 10, 10 }, graphs.outgoing.graph) Draw:OutlinedText( "loading...", 2, false, 35, infopos + 180, 13, false, { 255, 255, 255, 255 }, { 10, 10, 10 }, graphs.other ) Draw:OutlinedText( "[DEBUG LOGS]", 2, false, 35, infopos - 200, 13, false, { 255, 255, 255, 255 }, { 10, 10, 10 }, graphs.other ) local loadingthing = Draw:OutlinedText( "Loading...", 2, true, math.floor(SCREEN_SIZE.x / 16), math.floor(SCREEN_SIZE.y / 16), 13, true, { 255, 50, 200, 255 }, { 0, 0, 0 } ) function menu.Initialize(menutable) local zmmenu = {} do Draw:MenuOutlinedRect(true, 0, 0, menu.w, menu.h, { 0, 0, 0, 255 }, zmmenu) Draw:MenuOutlinedRect(true, 1, 1, menu.w - 2, menu.h - 2, { 20, 20, 20, 255 }, zmmenu) Draw:MenuOutlinedRect(true, 2, 2, menu.w - 3, 1, { 127, 72, 163, 255 }, zmmenu) table.insert(menu.clrs.norm, zmmenu[#zmmenu]) Draw:MenuOutlinedRect(true, 2, 3, menu.w - 3, 1, { 87, 32, 123, 255 }, zmmenu) table.insert(menu.clrs.dark, zmmenu[#zmmenu]) Draw:MenuOutlinedRect(true, 2, 4, menu.w - 3, 1, { 20, 20, 20, 255 }, zmmenu) for i = 0, 19 do Draw:MenuFilledRect(true, 2, 5 + i, menu.w - 4, 1, { 20, 20, 20, 255 }, zmmenu) zmmenu[6 + i].Color = ColorRange( i, { [1] = { start = 0, color = RGB(50, 50, 50) }, [2] = { start = 20, color = RGB(35, 35, 35) } } ) end Draw:MenuFilledRect(true, 2, 25, menu.w - 4, menu.h - 27, { 35, 35, 35, 255 }, zmmenu) Draw:MenuBigText(MenuName or "ZeroMonth", true, false, 6, 6, zmmenu) Draw:MenuOutlinedRect(true, 8, 22, menu.w - 16, menu.h - 30, { 0, 0, 0, 255 }, zmmenu) Draw:MenuOutlinedRect(true, 9, 23, menu.w - 18, menu.h - 32, { 20, 20, 20, 255 }, zmmenu) Draw:MenuOutlinedRect(true, 10, 24, menu.w - 19, 1, { 127, 72, 163, 255 }, zmmenu) table.insert(menu.clrs.norm, zmmenu[#zmmenu]) Draw:MenuOutlinedRect(true, 10, 25, menu.w - 19, 1, { 87, 32, 123, 255 }, zmmenu) table.insert(menu.clrs.dark, zmmenu[#zmmenu]) Draw:MenuOutlinedRect(true, 10, 26, menu.w - 19, 1, { 20, 20, 20, 255 }, zmmenu) for i = 0, 14 do Draw:MenuFilledRect(true, 10, 27 + (i * 2), menu.w - 20, 2, { 45, 45, 45, 255 }, zmmenu) zmmenu[#zmmenu].Color = ColorRange( i, { [1] = { start = 0, color = RGB(50, 50, 50) }, [2] = { start = 15, color = RGB(35, 35, 35) } } ) end Draw:MenuFilledRect(true, 10, 57, menu.w - 20, menu.h - 67, { 35, 35, 35, 255 }, zmmenu) end local tabz = {} for i = 1, #menutable do tabz[i] = {} end local tabs = {} menu.multigroups = {} for k, v in pairs(menutable) do Draw:MenuFilledRect( true, 10 + ((k - 1) * ((menu.w - 20) / #menutable)), 27, ((menu.w - 20) / #menutable), 32, { 30, 30, 30, 255 }, zmmenu ) Draw:MenuOutlinedRect( true, 10 + ((k - 1) * ((menu.w - 20) / #menutable)), 27, ((menu.w - 20) / #menutable), 32, { 20, 20, 20, 255 }, zmmenu ) Draw:MenuBigText( v.name, true, true, math.floor(10 + ((k - 1) * ((menu.w - 20) / #menutable)) + (((menu.w - 20) / #menutable) * 0.5)), 35, zmmenu ) table.insert(tabs, { zmmenu[#zmmenu - 2], zmmenu[#zmmenu - 1], zmmenu[#zmmenu] }) table.insert(menu.tabnames, v.name) menu.options[v.name] = {} menu.multigroups[v.name] = {} menu.mgrouptabz[v.name] = {} local y_offies = { left = 66, right = 66 } if v.content ~= nil then for k1, v1 in pairs(v.content) do if v1.autopos ~= nil then v1.width = menu.columns.width if v1.autopos == "left" then v1.x = menu.columns.left v1.y = y_offies.left elseif v1.autopos == "right" then v1.x = menu.columns.right v1.y = y_offies.right end end local groups = {} if type(v1.name) == "table" then groups = v1.name else table.insert(groups, v1.name) end local y_pos = 24 for g_ind, g_name in ipairs(groups) do menu.options[v.name][g_name] = {} if type(v1.name) == "table" then menu.mgrouptabz[v.name][g_name] = {} menu.log_multi = { v.name, g_name } end local content = nil if type(v1.name) == "table" then y_pos = 28 content = v1[g_ind].content else y_pos = 24 content = v1.content end if content ~= nil then for k2, v2 in pairs(content) do if v2.type == TOGGLE then menu.options[v.name][g_name][v2.name] = {} local unsafe = false if v2.unsafe then unsafe = true end menu.options[v.name][g_name][v2.name][4] = Draw:Toggle(v2.name, v2.value, unsafe, v1.x + 8, v1.y + y_pos, tabz[k]) menu.options[v.name][g_name][v2.name][1] = v2.value menu.options[v.name][g_name][v2.name][7] = v2.value menu.options[v.name][g_name][v2.name][2] = v2.type menu.options[v.name][g_name][v2.name][3] = { v1.x + 7, v1.y + y_pos - 1 } menu.options[v.name][g_name][v2.name][6] = unsafe menu.options[v.name][g_name][v2.name].tooltip = v2.tooltip or nil if v2.extra ~= nil then if v2.extra.type == KEYBIND then menu.options[v.name][g_name][v2.name][5] = {} menu.options[v.name][g_name][v2.name][5][4] = Draw:Keybind( v2.extra.key, v1.x + v1.width - 52, y_pos + v1.y - 2, tabz[k] ) menu.options[v.name][g_name][v2.name][5][1] = v2.extra.key menu.options[v.name][g_name][v2.name][5][2] = v2.extra.type menu.options[v.name][g_name][v2.name][5][3] = { v1.x + v1.width - 52, y_pos + v1.y - 2 } menu.options[v.name][g_name][v2.name][5][5] = false menu.options[v.name][g_name][v2.name][5].toggletype = v2.extra.toggletype == nil and 1 or v2.extra.toggletype menu.options[v.name][g_name][v2.name][5].relvalue = false local event = event.new(("%s %s %s"):format(v.name, g_name, v2.name)) event:connect(function(newval) if menu:GetVal("Visuals", "Keybinds" ,"Log Keybinds") then CreateNotification(("%s %s %s has been set to %s"):format(v.name, g_name, v2.name, newval and "true" or "false")) end end) menu.options[v.name][g_name][v2.name][5].event = event menu.options[v.name][g_name][v2.name][5].bind = table.insert(menu.keybinds, { menu.options[v.name][g_name][v2.name], tostring(v2.name), tostring(g_name), tostring(v.name), }) elseif v2.extra.type == COLORPICKER then menu.options[v.name][g_name][v2.name][5] = {} menu.options[v.name][g_name][v2.name][5][4] = Draw:ColorPicker( v2.extra.color, v1.x + v1.width - 38, y_pos + v1.y - 1, tabz[k] ) menu.options[v.name][g_name][v2.name][5][1] = v2.extra.color menu.options[v.name][g_name][v2.name][5][2] = v2.extra.type menu.options[v.name][g_name][v2.name][5][3] = { v1.x + v1.width - 38, y_pos + v1.y - 1 } menu.options[v.name][g_name][v2.name][5][5] = false menu.options[v.name][g_name][v2.name][5][6] = v2.extra.name elseif v2.extra.type == DOUBLE_COLORPICKER then menu.options[v.name][g_name][v2.name][5] = {} menu.options[v.name][g_name][v2.name][5][1] = {} menu.options[v.name][g_name][v2.name][5][1][1] = {} menu.options[v.name][g_name][v2.name][5][1][2] = {} menu.options[v.name][g_name][v2.name][5][2] = v2.extra.type for i = 1, 2 do menu.options[v.name][g_name][v2.name][5][1][i][4] = Draw:ColorPicker( v2.extra.color[i], v1.x + v1.width - 38 - ((i - 1) * 34), y_pos + v1.y - 1, tabz[k] ) menu.options[v.name][g_name][v2.name][5][1][i][1] = v2.extra.color[i] menu.options[v.name][g_name][v2.name][5][1][i][3] = { v1.x + v1.width - 38 - ((i - 1) * 34), y_pos + v1.y - 1 } menu.options[v.name][g_name][v2.name][5][1][i][5] = false menu.options[v.name][g_name][v2.name][5][1][i][6] = v2.extra.name[i] end end end y_pos += 18 elseif v2.type == SLIDER then menu.options[v.name][g_name][v2.name] = {} menu.options[v.name][g_name][v2.name][4] = Draw:Slider( v2.name, v2.stradd, v2.value, v2.minvalue, v2.maxvalue, v2.custom or {}, v2.decimal, v1.x + 8, v1.y + y_pos, v1.width - 16, tabz[k] ) menu.options[v.name][g_name][v2.name][1] = v2.value menu.options[v.name][g_name][v2.name][2] = v2.type menu.options[v.name][g_name][v2.name][3] = { v1.x + 7, v1.y + y_pos - 1, v1.width - 16 } menu.options[v.name][g_name][v2.name][5] = false menu.options[v.name][g_name][v2.name][6] = { v2.minvalue, v2.maxvalue } menu.options[v.name][g_name][v2.name][7] = { v1.x + 7 + v1.width - 38, v1.y + y_pos - 1 } menu.options[v.name][g_name][v2.name].decimal = v2.decimal == nil and nil or v2.decimal menu.options[v.name][g_name][v2.name].stepsize = v2.stepsize menu.options[v.name][g_name][v2.name].shift_stepsize = v2.shift_stepsize menu.options[v.name][g_name][v2.name].custom = v2.custom or {} y_pos += 30 elseif v2.type == DROPBOX then menu.options[v.name][g_name][v2.name] = {} menu.options[v.name][g_name][v2.name][1] = v2.value menu.options[v.name][g_name][v2.name][2] = v2.type menu.options[v.name][g_name][v2.name][5] = false menu.options[v.name][g_name][v2.name][6] = v2.values if v2.x == nil then menu.options[v.name][g_name][v2.name][3] = { v1.x + 7, v1.y + y_pos - 1, v1.width - 16 } menu.options[v.name][g_name][v2.name][4] = Draw:Dropbox( v2.name, v2.value, v2.values, v1.x + 8, v1.y + y_pos, v1.width - 16, tabz[k] ) y_pos += 40 else menu.options[v.name][g_name][v2.name][3] = { v2.x + 7, v2.y - 1, v2.w } menu.options[v.name][g_name][v2.name][4] = Draw:Dropbox(v2.name, v2.value, v2.values, v2.x + 8, v2.y, v2.w, tabz[k]) end elseif v2.type == COMBOBOX then menu.options[v.name][g_name][v2.name] = {} menu.options[v.name][g_name][v2.name][4] = Draw:Combobox( v2.name, v2.values, v1.x + 8, v1.y + y_pos, v1.width - 16, tabz[k] ) menu.options[v.name][g_name][v2.name][1] = v2.values menu.options[v.name][g_name][v2.name][2] = v2.type menu.options[v.name][g_name][v2.name][3] = { v1.x + 7, v1.y + y_pos - 1, v1.width - 16 } menu.options[v.name][g_name][v2.name][5] = false y_pos += 40 elseif v2.type == BUTTON then menu.options[v.name][g_name][v2.name] = {} menu.options[v.name][g_name][v2.name][1] = false menu.options[v.name][g_name][v2.name][2] = v2.type menu.options[v.name][g_name][v2.name].name = v2.name menu.options[v.name][g_name][v2.name].groupbox = g_name menu.options[v.name][g_name][v2.name].tab = v.name menu.options[v.name][g_name][v2.name].doubleclick = v2.doubleclick if v2.x == nil then menu.options[v.name][g_name][v2.name][3] = { v1.x + 7, v1.y + y_pos - 1, v1.width - 16 } menu.options[v.name][g_name][v2.name][4] = Draw:Button(v2.name, v1.x + 8, v1.y + y_pos, v1.width - 16, tabz[k]) y_pos += 28 else menu.options[v.name][g_name][v2.name][3] = { v2.x + 7, v2.y - 1, v2.w } menu.options[v.name][g_name][v2.name][4] = Draw:Button(v2.name, v2.x + 8, v2.y, v2.w, tabz[k]) end elseif v2.type == TEXTBOX then menu.options[v.name][g_name][v2.name] = {} menu.options[v.name][g_name][v2.name][4] = Draw:TextBox(v2.name, v2.text, v1.x + 8, v1.y + y_pos, v1.width - 16, tabz[k]) menu.options[v.name][g_name][v2.name][1] = v2.text menu.options[v.name][g_name][v2.name][2] = v2.type menu.options[v.name][g_name][v2.name][3] = { v1.x + 7, v1.y + y_pos - 1, v1.width - 16 } menu.options[v.name][g_name][v2.name][5] = false menu.options[v.name][g_name][v2.name][6] = v2.file and true or false y_pos += 28 elseif v2.type == "list" then menu.options[v.name][g_name][v2.name] = {} menu.options[v.name][g_name][v2.name][4] = Draw:List( v2.multiname, v1.x + 8, v1.y + y_pos, v1.width - 16, v2.size, v2.columns, tabz[k] ) menu.options[v.name][g_name][v2.name][1] = nil menu.options[v.name][g_name][v2.name][2] = v2.type menu.options[v.name][g_name][v2.name][3] = 1 menu.options[v.name][g_name][v2.name][5] = {} menu.options[v.name][g_name][v2.name][6] = v2.size menu.options[v.name][g_name][v2.name][7] = v2.columns menu.options[v.name][g_name][v2.name][8] = { v1.x + 8, v1.y + y_pos, v1.width - 16 } y_pos += 22 + (22 * v2.size) elseif v2.type == IMAGE then menu.options[v.name][g_name][v2.name] = {} menu.options[v.name][g_name][v2.name][1] = Draw:ImageWithText(v2.size, nil, v2.text, v1.x + 8, v1.y + y_pos, tabz[k]) menu.options[v.name][g_name][v2.name][2] = v2.type end end end menu.log_multi = nil end y_pos += 2 if type(v1.name) ~= "table" then if v1.autopos == nil then Draw:CoolBox(v1.name, v1.x, v1.y, v1.width, v1.height, tabz[k]) else if v1.autofill then y_pos = (menu.h - 17) - v1.y elseif v1.size ~= nil then y_pos = v1.size end Draw:CoolBox(v1.name, v1.x, v1.y, v1.width, y_pos, tabz[k]) y_offies[v1.autopos] += y_pos + 6 end else if v1.autofill then y_pos = (menu.h - 17) - v1.y y_offies[v1.autopos] += y_pos + 6 elseif v1.size ~= nil then y_pos = v1.size y_offies[v1.autopos] += y_pos + 6 end local drawn if v1.autopos == nil then drawn = Draw:CoolMultiBox(v1.name, v1.x, v1.y, v1.width, v1.height, tabz[k]) else drawn = Draw:CoolMultiBox(v1.name, v1.x, v1.y, v1.width, y_pos, tabz[k]) end local group_vals = {} for _i, _v in ipairs(v1.name) do if _i == 1 then group_vals[_v] = true else group_vals[_v] = false end end table.insert(menu.multigroups[v.name], { vals = group_vals, drawn = drawn }) end end end end menu.list.addval = function(list, option) table.insert(list[5], option) end menu.list.removeval = function(list, optionnum) if list[1] == optionnum then list[1] = nil end table.remove(list[5], optionnum) end menu.list.removeall = function(list) list[5] = {} for k, v in pairs(list[4].liststuff) do for i, v1 in ipairs(v) do for i1, v2 in ipairs(v1) do v2.Visible = false end end end end menu.list.setval = function(list, value) list[1] = value end Draw:MenuOutlinedRect(true, 10, 59, menu.w - 20, menu.h - 69, { 20, 20, 20, 255 }, zmmenu) Draw:MenuOutlinedRect(true, 11, 58, ((menu.w - 20) / #menutable) - 2, 2, { 35, 35, 35, 255 }, zmmenu) local barguy = { zmmenu[#zmmenu], menu.postable[#menu.postable] } local function setActiveTab(slot) barguy[1].Position = Vector2.new( (menu.x + 11 + ((((menu.w - 20) / #menutable) - 2) * (slot - 1))) + ((slot - 1) * 2), menu.y + 58 ) barguy[2][2] = (11 + ((((menu.w - 20) / #menutable) - 2) * (slot - 1))) + ((slot - 1) * 2) barguy[2][3] = 58 for k, v in pairs(tabs) do if k == slot then v[1].Visible = false v[3].Color = RGB(255, 255, 255) else v[3].Color = RGB(170, 170, 170) v[1].Visible = true end end for k, v in pairs(tabz) do if k == slot then for k1, v1 in pairs(v) do v1.Visible = true end else for k1, v1 in pairs(v) do v1.Visible = false end end end for k, v in pairs(menu.multigroups) do if menu.tabnames[menu.activetab] == k then for k1, v1 in pairs(v) do for k2, v2 in pairs(v1.vals) do for k3, v3 in pairs(menu.mgrouptabz[k][k2]) do v3.Visible = v2 end end end end end end setActiveTab(menu.activetab) local plusminus = {} Draw:OutlinedText("_", 1, false, 10, 10, 14, false, { 225, 225, 225, 255 }, { 20, 20, 20 }, plusminus) Draw:OutlinedText("+", 1, false, 10, 10, 14, false, { 225, 225, 225, 255 }, { 20, 20, 20 }, plusminus) function menu:SetPlusMinus(value, x, y) for i, v in ipairs(plusminus) do if value == 0 then v.Visible = false else v.Visible = true end end if value ~= 0 then plusminus[1].Position = Vector2.new(x + 3 + menu.x, y - 5 + menu.y) plusminus[2].Position = Vector2.new(x + 13 + menu.x, y - 1 + menu.y) if value == 1 then for i, v in ipairs(plusminus) do v.Color = RGB(225, 225, 225) v.OutlineColor = RGB(20, 20, 20) end else for i, v in ipairs(plusminus) do if i + 1 == value then v.Color = RGB(menu.mc[1], menu.mc[2], menu.mc[3]) else v.Color = RGB(255, 255, 255) end v.OutlineColor = RGB(0, 0, 0) end end end end menu:SetPlusMinus(0, 20, 20) local dropboxthingy = {} local dropboxtexty = {} Draw:OutlinedRect(false, 20, 20, 100, 22, { 20, 20, 20, 255 }, dropboxthingy) Draw:OutlinedRect(false, 21, 21, 98, 20, { 0, 0, 0, 255 }, dropboxthingy) Draw:FilledRect(false, 22, 22, 96, 18, { 45, 45, 45, 255 }, dropboxthingy) for i = 1, 30 do Draw:OutlinedText("", 2, false, 20, 20, 13, false, { 255, 255, 255, 255 }, { 0, 0, 0 }, dropboxtexty) end function menu:SetDropBox(visible, x, y, length, value, values) for k, v in pairs(dropboxthingy) do v.Visible = visible end local size = Vector2.new(length, 21 * (#values + 1) + 3) local pos = Vector2.new(x, y) dropboxthingy[1].Position = pos dropboxthingy[2].Position = Vector2.new(x + 1, y + 1) dropboxthingy[3].Position = Vector2.new(x + 2, y + 22) dropboxthingy[1].Size = size dropboxthingy[2].Size = Vector2.new(length - 2, (21 * (#values + 1)) + 1) dropboxthingy[3].Size = Vector2.new(length - 4, (21 * #values) + 1 - 1) if visible then for i = 1, #values do dropboxtexty[i].Position = Vector2.new(x + 6, y + 26 + ((i - 1) * 21)) dropboxtexty[i].Visible = true dropboxtexty[i].Text = values[i] if i == value then dropboxtexty[i].Color = RGB(menu.mc[1], menu.mc[2], menu.mc[3]) else dropboxtexty[i].Color = RGB(255, 255, 255) end end else for k, v in pairs(dropboxtexty) do v.Visible = false end end return pos end local function set_comboboxthingy(visible, x, y, length, values) for k, v in pairs(dropboxthingy) do v.Visible = visible end local size = Vector2.new(length, 22 * (#values + 1) + 2) if y + size.y > SCREEN_SIZE.y then y = SCREEN_SIZE.y - size.y end if x + size.x > SCREEN_SIZE.x then x = SCREEN_SIZE.x - size.x end if y < 0 then y = 0 end if x < 0 then x = 0 end local pos = Vector2.new(x,y) dropboxthingy[1].Position = pos dropboxthingy[2].Position = Vector2.new(x + 1, y + 1) dropboxthingy[3].Position = Vector2.new(x + 2, y + 22) dropboxthingy[1].Size = size dropboxthingy[2].Size = Vector2.new(length - 2, (22 * (#values + 1))) dropboxthingy[3].Size = Vector2.new(length - 4, (22 * #values)) if visible then for i = 1, #values do dropboxtexty[i].Position = Vector2.new(x + 6, y + 26 + ((i - 1) * 22)) dropboxtexty[i].Visible = true dropboxtexty[i].Text = values[i][1] if values[i][2] then dropboxtexty[i].Color = RGB(menu.mc[1], menu.mc[2], menu.mc[3]) else dropboxtexty[i].Color = RGB(255, 255, 255) end end else for k, v in pairs(dropboxtexty) do v.Visible = false end end return pos end menu:SetDropBox(false, 400, 200, 160, 1, { "HI q", "HI q", "HI q" }) local modeselect = {} Draw:OutlinedRect(false, 20, 20, 100, 22, { 20, 20, 20, 255 }, modeselect) Draw:OutlinedRect(false, 21, 21, 98, 20, { 0, 0, 0, 255 }, modeselect) Draw:FilledRect(false, 22, 22, 96, 18, { 45, 45, 45, 255 }, modeselect) local modeselecttext = { "Hold", "Toggle", "Hold Off", "Always" } for i = 1, 4 do Draw:OutlinedText( modeselecttext[i], 2, false, 20, 20, 13, false, { 255, 255, 255, 255 }, { 0, 0, 0 }, modeselect ) end function menu:SetKeybindSelect(visible, x, y, value) for k, v in pairs(modeselect) do v.Visible = visible end if visible then modeselect[1].Position = Vector2.new(x, y) modeselect[2].Position = Vector2.new(x + 1, y + 1) modeselect[3].Position = Vector2.new(x + 2, y + 2) modeselect[1].Size = Vector2.new(70, 22 * 4 - 1) modeselect[2].Size = Vector2.new(70 - 2, 22 * 4 - 3) modeselect[3].Size = Vector2.new(70 - 4, 22 * 4 - 5) for i = 1, 4 do modeselect[i + 3].Position = Vector2.new(x + 6, y + 4 + ((i - 1) * 21)) if value == i then modeselect[i + 3].Color = RGB(menu.mc[1], menu.mc[2], menu.mc[3]) else modeselect[i + 3].Color = RGB(255, 255, 255) end end end end menu:SetKeybindSelect(false, 200, 400, 1) local cp = { x = 400, y = 40, w = 280, h = 211, alpha = false, dragging_m = false, dragging_r = false, dragging_b = false, hsv = { h = 0, s = 0, v = 0, a = 0, }, postable = {}, drawings = {}, } local function ColorpickerOutline(visible, pos_x, pos_y, width, height, clr, tablename) Draw:OutlinedRect(visible, pos_x + cp.x, pos_y + cp.y, width, height, clr, tablename) table.insert(cp.postable, { tablename[#tablename], pos_x, pos_y }) end local function ColorpickerRect(visible, pos_x, pos_y, width, height, clr, tablename) Draw:FilledRect(visible, pos_x + cp.x, pos_y + cp.y, width, height, clr, tablename) table.insert(cp.postable, { tablename[#tablename], pos_x, pos_y }) end local function ColorpickerImage(visible, imagedata, pos_x, pos_y, width, height, transparency, tablename) Draw:Image(visible, imagedata, pos_x, pos_y, width, height, transparency, tablename) table.insert(cp.postable, { tablename[#tablename], pos_x, pos_y }) end local function ColorpickerText(text, visible, centered, pos_x, pos_y, tablename) Draw:OutlinedText( text, 2, visible, pos_x + cp.x, pos_y + cp.y, 13, centered, { 255, 255, 255, 255 }, { 0, 0, 0 }, tablename ) table.insert(cp.postable, { tablename[#tablename], pos_x, pos_y }) end ColorpickerRect(false, 1, 1, cp.w, cp.h, { 35, 35, 35, 255 }, cp.drawings) ColorpickerOutline(false, 1, 1, cp.w, cp.h, { 0, 0, 0, 255 }, cp.drawings) ColorpickerOutline(false, 2, 2, cp.w - 2, cp.h - 2, { 20, 20, 20, 255 }, cp.drawings) ColorpickerOutline(false, 3, 3, cp.w - 3, 1, { 127, 72, 163, 255 }, cp.drawings) table.insert(menu.clrs.norm, cp.drawings[#cp.drawings]) ColorpickerOutline(false, 3, 4, cp.w - 3, 1, { 87, 32, 123, 255 }, cp.drawings) table.insert(menu.clrs.dark, cp.drawings[#cp.drawings]) ColorpickerOutline(false, 3, 5, cp.w - 3, 1, { 20, 20, 20, 255 }, cp.drawings) ColorpickerText("color picker :D", false, false, 7, 6, cp.drawings) ColorpickerText("x", false, false, 268, 4, cp.drawings) ColorpickerOutline(false, 10, 23, 160, 160, { 30, 30, 30, 255 }, cp.drawings) ColorpickerOutline(false, 11, 24, 158, 158, { 0, 0, 0, 255 }, cp.drawings) ColorpickerRect(false, 12, 25, 156, 156, { 0, 0, 0, 255 }, cp.drawings) local maincolor = cp.drawings[#cp.drawings] ColorpickerImage(false, ZMonth_IMAGES[1], 12, 25, 156, 156, 1, cp.drawings) local alphabar = {} ColorpickerOutline(false, 10, 189, 160, 14, { 30, 30, 30, 255 }, cp.drawings) table.insert(alphabar, cp.drawings[#cp.drawings]) ColorpickerOutline(false, 11, 190, 158, 12, { 0, 0, 0, 255 }, cp.drawings) table.insert(alphabar, cp.drawings[#cp.drawings]) ColorpickerImage(false, ZMonth_IMAGES[2], 12, 191, 159, 10, 1, cp.drawings) table.insert(alphabar, cp.drawings[#cp.drawings]) ColorpickerOutline(false, 176, 23, 14, 160, { 30, 30, 30, 255 }, cp.drawings) ColorpickerOutline(false, 177, 24, 12, 158, { 0, 0, 0, 255 }, cp.drawings) ColorpickerImage(false, ZMonth_IMAGES[3], 178, 25, 10, 156, 1, cp.drawings) ColorpickerText("New Color", false, false, 198, 23, cp.drawings) ColorpickerOutline(false, 197, 37, 75, 40, { 30, 30, 30, 255 }, cp.drawings) ColorpickerOutline(false, 198, 38, 73, 38, { 0, 0, 0, 255 }, cp.drawings) ColorpickerImage(false, ZMonth_IMAGES[4], 199, 39, 71, 36, 1, cp.drawings) ColorpickerRect(false, 199, 39, 71, 36, { 255, 0, 0, 255 }, cp.drawings) local newcolor = cp.drawings[#cp.drawings] ColorpickerText("copy", false, true, 198 + 36, 41, cp.drawings) ColorpickerText("paste", false, true, 198 + 37, 56, cp.drawings) local newcopy = { cp.drawings[#cp.drawings - 1], cp.drawings[#cp.drawings] } ColorpickerText("Old Color", false, false, 198, 77, cp.drawings) ColorpickerOutline(false, 197, 91, 75, 40, { 30, 30, 30, 255 }, cp.drawings) ColorpickerOutline(false, 198, 92, 73, 38, { 0, 0, 0, 255 }, cp.drawings) ColorpickerImage(false, ZMonth_IMAGES[4], 199, 93, 71, 36, 1, cp.drawings) ColorpickerRect(false, 199, 93, 71, 36, { 255, 0, 0, 255 }, cp.drawings) local oldcolor = cp.drawings[#cp.drawings] ColorpickerText("copy", false, true, 198 + 36, 103, cp.drawings) local oldcopy = { cp.drawings[#cp.drawings] } ColorpickerText("[ Apply ]", false, true, 235, cp.h - 23, cp.drawings) local applytext = cp.drawings[#cp.drawings] local function set_newcolor(r, g, b, a) newcolor.Color = RGB(r, g, b) if a ~= nil then newcolor.Transparency = a / 255 else newcolor.Transparency = 1 end end local function set_oldcolor(r, g, b, a) oldcolor.Color = RGB(r, g, b) cp.oldcolor = oldcolor.Color cp.oldcoloralpha = a if a ~= nil then oldcolor.Transparency = a / 255 else oldcolor.Transparency = 1 end end local dragbar_r = {} Draw:OutlinedRect(true, 30, 30, 16, 5, { 0, 0, 0, 255 }, cp.drawings) table.insert(dragbar_r, cp.drawings[#cp.drawings]) Draw:OutlinedRect(true, 31, 31, 14, 3, { 255, 255, 255, 255 }, cp.drawings) table.insert(dragbar_r, cp.drawings[#cp.drawings]) local dragbar_b = {} Draw:OutlinedRect(true, 30, 30, 5, 16, { 0, 0, 0, 255 }, cp.drawings) table.insert(dragbar_b, cp.drawings[#cp.drawings]) table.insert(alphabar, cp.drawings[#cp.drawings]) Draw:OutlinedRect(true, 31, 31, 3, 14, { 255, 255, 255, 255 }, cp.drawings) table.insert(dragbar_b, cp.drawings[#cp.drawings]) table.insert(alphabar, cp.drawings[#cp.drawings]) local dragbar_m = {} Draw:OutlinedRect(true, 30, 30, 5, 5, { 0, 0, 0, 255 }, cp.drawings) table.insert(dragbar_m, cp.drawings[#cp.drawings]) Draw:OutlinedRect(true, 31, 31, 3, 3, { 255, 255, 255, 255 }, cp.drawings) table.insert(dragbar_m, cp.drawings[#cp.drawings]) function menu:SetDragBarR(x, y) dragbar_r[1].Position = Vector2.new(x, y) dragbar_r[2].Position = Vector2.new(x + 1, y + 1) end function menu:SetDragBarB(x, y) dragbar_b[1].Position = Vector2.new(x, y) dragbar_b[2].Position = Vector2.new(x + 1, y + 1) end function menu:SetDragBarM(x, y) dragbar_m[1].Position = Vector2.new(x, y) dragbar_m[2].Position = Vector2.new(x + 1, y + 1) end function menu:SetColorPicker(visible, color, value, alpha, text, x, y) for k, v in pairs(cp.drawings) do v.Visible = visible end cp.oldalpha = alpha if visible then cp.x = clamp(x, 0, SCREEN_SIZE.x - cp.w) cp.y = clamp(y, 0, SCREEN_SIZE.y - cp.h) for k, v in pairs(cp.postable) do v[1].Position = Vector2.new(cp.x + v[2], cp.y + v[3]) end local tempclr = RGB(color[1], color[2], color[3]) local h, s, v = tempclr:ToHSV() cp.hsv.h = h cp.hsv.s = s cp.hsv.v = v menu:SetDragBarR(cp.x + 175, cp.y + 23 + math.floor((1 - h) * 156)) menu:SetDragBarM(cp.x + 9 + math.floor(s * 156), cp.y + 23 + math.floor((1 - v) * 156)) if not alpha then set_newcolor(color[1], color[2], color[3]) set_oldcolor(color[1], color[2], color[3]) cp.alpha = false for k, v in pairs(alphabar) do v.Visible = false end cp.h = 191 for i = 1, 2 do cp.drawings[i].Size = Vector2.new(cp.w, cp.h) end cp.drawings[3].Size = Vector2.new(cp.w - 2, cp.h - 2) else cp.hsv.a = color[4] cp.alpha = true set_newcolor(color[1], color[2], color[3], color[4]) set_oldcolor(color[1], color[2], color[3], color[4]) cp.h = 211 for i = 1, 2 do cp.drawings[i].Size = Vector2.new(cp.w, cp.h) end cp.drawings[3].Size = Vector2.new(cp.w - 2, cp.h - 2) menu:SetDragBarB(cp.x + 12 + math.floor(156 * (color[4] / 255)), cp.y + 188) end applytext.Position = Vector2.new(235 + cp.x, cp.y + cp.h - 23) maincolor.Color = Color3.fromHSV(h, 1, 1) cp.drawings[7].Text = text end end menu:SetColorPicker(false, { 255, 0, 0 }, nil, false, "", 0, 0) local tooltip = { x = 0, y = 0, time = 0, active = false, text = "This does this and that i guess\npooping 24/7", drawings = {}, postable = {}, } local function ttOutline(visible, pos_x, pos_y, width, height, clr, tablename) Draw:OutlinedRect(visible, pos_x + tooltip.x, pos_y + tooltip.y, width, height, clr, tablename) table.insert(tooltip.postable, { tablename[#tablename], pos_x, pos_y }) end local function ttRect(visible, pos_x, pos_y, width, height, clr, tablename) Draw:FilledRect(visible, pos_x + tooltip.x, pos_y + tooltip.y, width, height, clr, tablename) table.insert(tooltip.postable, { tablename[#tablename], pos_x, pos_y }) end local function ttText(text, visible, centered, pos_x, pos_y, tablename) Draw:OutlinedText( text, 2, visible, pos_x + tooltip.x, pos_y + tooltip.y, 13, centered, { 255, 255, 255, 255 }, { 0, 0, 0 }, tablename ) table.insert(tooltip.postable, { tablename[#tablename], pos_x, pos_y }) end ttRect( false, tooltip.x + 1, tooltip.y + 1, 1, 28, { menu.mc[1], menu.mc[2], menu.mc[3], 255 }, tooltip.drawings ) ttRect( false, tooltip.x + 2, tooltip.y + 1, 1, 28, { menu.mc[1] - 40, menu.mc[2] - 40, menu.mc[3] - 40, 255 }, tooltip.drawings ) ttOutline(false, tooltip.x, tooltip.y, 4, 30, { 20, 20, 20, 255 }, tooltip.drawings) ttRect(false, tooltip.x + 4, tooltip.y, 100, 30, { 40, 40, 40, 255 }, tooltip.drawings) ttOutline(false, tooltip.x - 1, tooltip.y - 1, 102, 32, { 0, 0, 0, 255 }, tooltip.drawings) ttOutline(false, tooltip.x + 3, tooltip.y, 102, 30, { 20, 20, 20, 255 }, tooltip.drawings) ttText(tooltip.text, false, false, tooltip.x + 7, tooltip.y + 1, tooltip.drawings) local zmmouse = {} function menu:SetToolTip(x, y, text, visible, dt) dt = dt or 0 x = x or tooltip.x y = y or tooltip.y tooltip.x = x tooltip.y = y if tooltip.time < 1 and visible then if tooltip.time < -1 then tooltip.time = -1 end tooltip.time += dt else tooltip.time -= dt if tooltip.time < -1 then tooltip.time = -1 end end if not visible and tooltip.time < 0 then tooltip.time = -1 end if tooltip.time > 1 then tooltip.time = 1 end for k, v in ipairs(tooltip.drawings) do v.Visible = tooltip.time > 0 end tooltip.active = visible if text then tooltip.drawings[7].Text = text end for k, v in pairs(tooltip.postable) do v[1].Position = Vector2.new(x + v[2], y + v[3]) v[1].Transparency = math.min((0.3 + tooltip.time) ^ 3 - 1, menu.fade_amount or 1) end tooltip.drawings[1].Color = RGB(menu.mc[1], menu.mc[2], menu.mc[3]) tooltip.drawings[2].Color = RGB(menu.mc[1] - 40, menu.mc[2] - 40, menu.mc[3] - 40) local tb = tooltip.drawings[7].TextBounds tooltip.drawings[1].Size = Vector2.new(1, tb.Y + 3) tooltip.drawings[2].Size = Vector2.new(1, tb.Y + 3) tooltip.drawings[3].Size = Vector2.new(4, tb.Y + 5) tooltip.drawings[4].Size = Vector2.new(tb.X + 6, tb.Y + 5) tooltip.drawings[5].Size = Vector2.new(tb.X + 12, tb.Y + 7) tooltip.drawings[6].Size = Vector2.new(tb.X + 7, tb.Y + 5) if zmmouse[#zmmouse] then zmmouse[#zmmouse].Visible = visible zmmouse[#zmmouse].Transparency = 1 - tooltip.time end end menu:SetToolTip(500, 500, "", false) local mousie = { x = 100, y = 240, } Draw:Triangle( true, true, { mousie.x, mousie.y }, { mousie.x, mousie.y + 15 }, { mousie.x + 10, mousie.y + 10 }, { 127, 72, 163, 255 }, zmmouse ) table.insert(menu.clrs.norm, zmmouse[#zmmouse]) Draw:Triangle( true, false, { mousie.x, mousie.y }, { mousie.x, mousie.y + 15 }, { mousie.x + 10, mousie.y + 10 }, { 0, 0, 0, 255 }, zmmouse ) Draw:OutlinedText("", 2, false, 0, 0, 13, false, { 255, 255, 255, 255 }, { 15, 15, 15 }, zmmouse) Draw:OutlinedText("?", 2, false, 0, 0, 13, false, { 255, 255, 255, 255 }, { 15, 15, 15 }, zmmouse) local lastMousePos = Vector2.new() function menu:SetMousePosition(x, y) FireEvent("zm_mousemoved", lastMousePos ~= Vector2.new(x, y)) for k = 1, #zmmouse do local v = zmmouse[k] if k ~= #zmmouse and k ~= #zmmouse - 1 then v.PointA = Vector2.new(x, y + 36) v.PointB = Vector2.new(x, y + 36 + 15) v.PointC = Vector2.new(x + 10, y + 46) else v.Position = Vector2.new(x + 10, y + 46) end end lastMousePos = Vector2.new(x, y) end function menu:SetColor(r, g, b) menu.watermark.rect[1].Color = RGB(r - 40, g - 40, b - 40) menu.watermark.rect[2].Color = RGB(r, g, b) for k, v in pairs(menu.clrs.norm) do v.Color = RGB(r, g, b) end for k, v in pairs(menu.clrs.dark) do v.Color = RGB(r - 40, g - 40, b - 40) end local menucolor = { r, g, b } for k, v in pairs(menu.options) do for k1, v1 in pairs(v) do for k2, v2 in pairs(v1) do if v2[2] == TOGGLE then if not v2[1] then for i = 0, 3 do v2[4][i + 1].Color = ColorRange(i, { [1] = { start = 0, color = RGB(50, 50, 50) }, [2] = { start = 3, color = RGB(30, 30, 30) }, }) end else for i = 0, 3 do v2[4][i + 1].Color = ColorRange(i, { [1] = { start = 0, color = RGB(menucolor[1], menucolor[2], menucolor[3]) }, [2] = { start = 3, color = RGB(menucolor[1] - 40, menucolor[2] - 40, menucolor[3] - 40), }, }) end end elseif v2[2] == SLIDER then for i = 0, 3 do v2[4][i + 1].Color = ColorRange(i, { [1] = { start = 0, color = RGB(menucolor[1], menucolor[2], menucolor[3]) }, [2] = { start = 3, color = RGB(menucolor[1] - 40, menucolor[2] - 40, menucolor[3] - 40), }, }) end end end end end end local function UpdateConfigs() local configthing = menu.options["Settings"]["Configuration"]["Configs"] configthing[6] = GetConfigs() if configthing[1] > #configthing[6] then configthing[1] = #configthing[6] end configthing[4][1].Text = configthing[6][configthing[1]] end menu.keybind_open = nil menu.dropbox_open = nil menu.colorPickerOpen = false menu.textboxopen = nil local shooties = {} local isPlayerScoped = false function menu:InputBeganMenu(key) if key.KeyCode == Enum.KeyCode.Delete and not loadingthing.Visible then cp.dragging_m = false cp.dragging_r = false cp.dragging_b = false UpdateConfigs() if menu.open and not menu.fading then for k = 1, #menu.options do local v = menu.options[k] for k1, v1 in pairs(v) do for k2, v2 in pairs(v1) do if v2[2] == SLIDER and v2[5] then v2[5] = false elseif v2[2] == DROPBOX and v2[5] then v2[5] = false elseif v2[2] == COMBOBOX and v2[5] then v2[5] = false elseif v2[2] == TOGGLE then if v2[5] ~= nil then if v2[5][2] == KEYBIND and v2[5][5] then v2[5][4][2].Color = RGB(30, 30, 30) v2[5][5] = false elseif v2[5][2] == COLORPICKER and v2[5][5] then v2[5][5] = false end end elseif v2[2] == BUTTON then if v2[1] then for i = 0, 8 do v2[4][i + 1].Color = ColorRange(i, { [1] = { start = 0, color = RGB(50, 50, 50) }, [2] = { start = 8, color = RGB(35, 35, 35) }, }) end v2[1] = false end end end end end menu.keybind_open = nil menu:SetKeybindSelect(false, 20, 20, 1) menu.dropbox_open = nil menu:SetDropBox(false, 400, 200, 160, 1, { "HI q", "HI q", "HI q" }) menu.colorPickerOpen = nil menu:SetToolTip(nil, nil, nil, false) menu:SetColorPicker(false, { 255, 0, 0 }, nil, false, "hahaha", 400, 200) end if not menu.fading then menu.fading = true menu.fadestart = tick() end end if menu == nil then return end if menu.textboxopen then if key.KeyCode == Enum.KeyCode.Delete or key.KeyCode == Enum.KeyCode.Return then for k, v in pairs(menu.options) do for k1, v1 in pairs(v) do for k2, v2 in pairs(v1) do if v2[2] == TEXTBOX then if v2[5] then v2[5] = false v2[4].Color = RGB(255, 255, 255) menu.textboxopen = false v2[4].Text = v2[1] end end end end end end end if menu.open and not menu.fading then for k, v in pairs(menu.options) do for k1, v1 in pairs(v) do for k2, v2 in pairs(v1) do if v2[2] == TOGGLE then if v2[5] ~= nil then if v2[5][2] == KEYBIND and v2[5][5] and key.KeyCode.Value ~= 0 then v2[5][4][2].Color = RGB(30, 30, 30) v2[5][4][1].Text = KeyEnumToName(key.KeyCode) if KeyEnumToName(key.KeyCode) == "None" then v2[5][1] = nil else v2[5][1] = key.KeyCode end v2[5][5] = false end end elseif v2[2] == TEXTBOX then if v2[5] then if not INPUT_SERVICE:IsKeyDown(Enum.KeyCode.LeftControl) then if string.len(v2[1]) <= 28 then if table.find(textBoxLetters, KeyEnumToName(key.KeyCode)) then if INPUT_SERVICE:IsKeyDown(Enum.KeyCode.LeftShift) then v2[1] ..= string.upper(KeyEnumToName(key.KeyCode)) else v2[1] ..= string.lower(KeyEnumToName(key.KeyCode)) end elseif KeyEnumToName(key.KeyCode) == "Space" then v2[1] ..= " " elseif keymodifiernames[KeyEnumToName(key.KeyCode)] ~= nil then if INPUT_SERVICE:IsKeyDown(Enum.KeyCode.LeftShift) then v2[1] ..= KeyModifierToName(KeyEnumToName(key.KeyCode), v2[6]) else v2[1] ..= KeyEnumToName(key.KeyCode) end elseif KeyEnumToName(key.KeyCode) == "Back" and v2[1] ~= "" then v2[1] = string.sub(v2[1], 0, #v2[1] - 1) end end v2[4].Text = v2[1] .. "|" end end end end end end end end function menu:InputBeganKeybinds(key) if INPUT_SERVICE:GetFocusedTextBox() or menu.textboxopen then return end for i = 1, #self.keybinds do local value = self.keybinds[i][1] if key.KeyCode == value[5][1] then value[5].lastvalue = value[5].relvalue if value[5].toggletype == 2 then value[5].relvalue = not value[5].relvalue elseif value[5].toggletype == 1 then value[5].relvalue = true elseif value[5].toggletype == 3 then value[5].relvalue = false end elseif value[5].toggletype == 4 then value[5].relvalue = true end if value[5].lastvalue ~= value[5].relvalue then value[5].event:fire(value[5].relvalue) end end end function menu:InputEndedKeybinds(key) for i = 1, #self.keybinds do local value = self.keybinds[i][1] value[5].lastvalue = value[5].relvalue if key.KeyCode == value[5][1] then if value[5].toggletype == 1 then value[5].relvalue = false elseif value[5].toggletype == 3 then value[5].relvalue = true end end if value[5].lastvalue ~= value[5].relvalue then value[5].event:fire(value[5].relvalue) end end end function menu:SetMenuPos(x, y) for k, v in pairs(menu.postable) do if v[1].Visible then v[1].Position = Vector2.new(x + v[2], y + v[3]) end end end function menu:MouseInArea(x, y, width, height) return LOCAL_MOUSE.x > x and LOCAL_MOUSE.x < x + width and LOCAL_MOUSE.y > 36 + y and LOCAL_MOUSE.y < 36 + y + height end function menu:MouseInMenu(x, y, width, height) return LOCAL_MOUSE.x > menu.x + x and LOCAL_MOUSE.x < menu.x + x + width and LOCAL_MOUSE.y > menu.y - 36 + y and LOCAL_MOUSE.y < menu.y - 36 + y + height end function menu:MouseInColorPicker(x, y, width, height) return LOCAL_MOUSE.x > cp.x + x and LOCAL_MOUSE.x < cp.x + x + width and LOCAL_MOUSE.y > cp.y - 36 + y and LOCAL_MOUSE.y < cp.y - 36 + y + height end local keyz = {} for k, v in pairs(Enum.KeyCode:GetEnumItems()) do keyz[v.Value] = v end function menu:GetVal(tab, groupbox, name, ...) local args = { ... } local option = menu.options[tab][groupbox][name] if not option then print(tab, groupbox, name) end if args[1] == nil then if option[2] == TOGGLE then local lastval = option[7] option[7] = option[1] return option[1], lastval elseif option[2] ~= COMBOBOX then return option[1] else local temptable = {} for k = 1, #option[1] do local v = option[1][k] table.insert(temptable, v[2]) end return temptable end else if args[1] == KEYBIND or args[1] == COLOR then if args[2] then return RGB(option[5][1][1], option[5][1][2], option[5][1][3]) else return option[5][1] end elseif args[1] == COLOR1 then if args[2] then return RGB(option[5][1][1][1][1], option[5][1][1][1][2], option[5][1][1][1][3]) else return option[5][1][1][1] end elseif args[1] == COLOR2 then if args[2] then return RGB(option[5][1][2][1][1], option[5][1][2][1][2], option[5][1][2][1][3]) else return option[5][1][2][1] end end end end function menu:GetKey(tab, groupbox, name) local option = self.options[tab][groupbox][name][5] local return1, return2, return3 if self:GetVal(tab, groupbox, name) then if option.toggletype ~= 0 then if option.lastvalue == nil then option.lastvalue = option.relvalue end return1, return2, return3 = option.relvalue, option.lastvalue, option.event option.lastvalue = option.relvalue end end return return1, return2, return3 end function menu:SetKey(tab, groupbox, name, val) val = val or false local option = menu.options[tab][groupbox][name][5] if option.toggletype ~= 0 then option.lastvalue = option.relvalue option.relvalue = val if option.lastvalue ~= option.relvalue then option.event:fire(option.relvalue) end end end local menuElementTypes = { [TOGGLE] = "toggle", [SLIDER] = "slider", [DROPBOX] = "dropbox", [TEXTBOX] = "textbox" } local doubleclickDelay = 1 local buttonsInQue = {} local function SaveCurSettings() local figgy = "ZeroMonth\nmade with <3 by phantom4k and f1zyshka\n\n" for k, v in next, menuElementTypes do figgy ..= v .. "s {\n" for k1, v1 in pairs(menu.options) do for k2, v2 in pairs(v1) do for k3, v3 in pairs(v2) do if v3[2] == k and k3 ~= "Configs" and k3 ~= "Player Status" and k3 ~= "ConfigName" then figgy ..= k1 .. "|" .. k2 .. "|" .. k3 .. "|" .. tostring(v3[1]) .. "\n" end end end end figgy = figgy .. "}\n" end figgy = figgy .. "comboboxes {\n" for k, v in pairs(menu.options) do for k1, v1 in pairs(v) do for k2, v2 in pairs(v1) do if v2[2] == COMBOBOX then local boolz = "" for k3, v3 in pairs(v2[1]) do boolz = boolz .. tostring(v3[2]) .. ", " end figgy = figgy .. k .. "|" .. k1 .. "|" .. k2 .. "|" .. boolz .. "\n" end end end end figgy = figgy .. "}\n" figgy = figgy .. "keybinds {\n" for k, v in pairs(menu.options) do for k1, v1 in pairs(v) do for k2, v2 in pairs(v1) do if v2[2] == TOGGLE then if v2[5] ~= nil then if v2[5][2] == KEYBIND then local toggletype = "|" .. tostring(v2[5].toggletype) if v2[5][1] == nil then figgy = figgy .. k .. "|" .. k1 .. "|" .. k2 .. "|nil" .. "|" .. tostring(v2[5].toggletype) .. "\n" else figgy = figgy .. k .. "|" .. k1 .. "|" .. k2 .. "|" .. tostring(v2[5][1].Value) .. "|" .. tostring(v2[5].toggletype) .. "\n" end end end end end end end figgy = figgy .. "}\n" figgy = figgy .. "colorpickers {\n" for k, v in pairs(menu.options) do for k1, v1 in pairs(v) do for k2, v2 in pairs(v1) do if v2[2] == TOGGLE then if v2[5] ~= nil then if v2[5][2] == COLORPICKER then local clrz = "" for k3, v3 in pairs(v2[5][1]) do clrz = clrz .. tostring(v3) .. ", " end figgy = figgy .. k .. "|" .. k1 .. "|" .. k2 .. "|" .. clrz .. "\n" end end end end end end figgy = figgy .. "}\n" figgy = figgy .. "double colorpickers {\n" for k, v in pairs(menu.options) do for k1, v1 in pairs(v) do for k2, v2 in pairs(v1) do if v2[2] == TOGGLE then if v2[5] ~= nil then if v2[5][2] == DOUBLE_COLORPICKER then local clrz1 = "" for k3, v3 in pairs(v2[5][1][1][1]) do clrz1 = clrz1 .. tostring(v3) .. ", " end local clrz2 = "" for k3, v3 in pairs(v2[5][1][2][1]) do clrz2 = clrz2 .. tostring(v3) .. ", " end figgy = figgy .. k .. "|" .. k1 .. "|" .. k2 .. "|" .. clrz1 .. "|" .. clrz2 .. "\n" end end end end end end figgy = figgy .. "}\n" return figgy end local function LoadConfig(loadedcfg) local lines = {} for s in loadedcfg:gmatch("[^\r\n]+") do table.insert(lines, s) end if lines[1] == "ZeroMonth" then local start = nil for i, v in next, lines do if v == "toggles {" then start = i break end end local end_ = nil for i, v in next, lines do if i > start and v == "}" then end_ = i break end end for i = 1, end_ - start - 1 do local tt = string.split(lines[i + start], "|") if menu.options[tt[1]] ~= nil and menu.options[tt[1]][tt[2]] ~= nil and menu.options[tt[1]][tt[2]][tt[3]] ~= nil then if tt[4] == "true" then menu.options[tt[1]][tt[2]][tt[3]][1] = true else menu.options[tt[1]][tt[2]][tt[3]][1] = false end end end local start = nil for i, v in next, lines do if v == "sliders {" then start = i break end end local end_ = nil for i, v in next, lines do if i > start and v == "}" then end_ = i break end end for i = 1, end_ - start - 1 do local tt = string.split(lines[i + start], "|") if menu.options[tt[1]] ~= nil and menu.options[tt[1]][tt[2]] ~= nil and menu.options[tt[1]][tt[2]][tt[3]] ~= nil then menu.options[tt[1]][tt[2]][tt[3]][1] = tonumber(tt[4]) end end local start = nil for i, v in next, lines do if v == "dropboxs {" then start = i break end end local end_ = nil for i, v in next, lines do if i > start and v == "}" then end_ = i break end end for i = 1, end_ - start - 1 do local tt = string.split(lines[i + start], "|") if menu.options[tt[1]] ~= nil and menu.options[tt[1]][tt[2]] ~= nil and menu.options[tt[1]][tt[2]][tt[3]] ~= nil then local num = tonumber(tt[4]) if num > #menu.options[tt[1]][tt[2]][tt[3]][6] then num = #menu.options[tt[1]][tt[2]][tt[3]][6] elseif num < 0 then num = 1 end menu.options[tt[1]][tt[2]][tt[3]][1] = num end end local start = nil for i, v in next, lines do if v == "textboxs {" then start = i break end end if start ~= nil then local end_ = nil for i, v in next, lines do if i > start and v == "}" then end_ = i break end end for i = 1, end_ - start - 1 do local tt = string.split(lines[i + start], "|") if menu.options[tt[1]] ~= nil and menu.options[tt[1]][tt[2]] ~= nil and menu.options[tt[1]][tt[2]][tt[3]] ~= nil then menu.options[tt[1]][tt[2]][tt[3]][1] = tostring(tt[4]) end end end local start = nil for i, v in next, lines do if v == "comboboxes {" then start = i break end end local end_ = nil for i, v in next, lines do if i > start and v == "}" then end_ = i break end end for i = 1, end_ - start - 1 do local tt = string.split(lines[i + start], "|") if menu.options[tt[1]] ~= nil and menu.options[tt[1]][tt[2]] ~= nil and menu.options[tt[1]][tt[2]][tt[3]] ~= nil then local subs = string.split(tt[4], ",") for i, v in ipairs(subs) do local opt = string.gsub(v, " ", "") if opt == "true" then menu.options[tt[1]][tt[2]][tt[3]][1][i][2] = true else menu.options[tt[1]][tt[2]][tt[3]][1][i][2] = false end if i == #subs - 1 then break end end end end local start = nil for i, v in next, lines do if v == "keybinds {" then start = i break end end local end_ = nil for i, v in next, lines do if i > start and v == "}" then end_ = i break end end for i = 1, end_ - start - 1 do local tt = string.split(lines[i + start], "|") if menu.options[tt[1]] ~= nil and menu.options[tt[1]][tt[2]] ~= nil and menu.options[tt[1]][tt[2]][tt[3]] ~= nil and menu.options[tt[1]][tt[2]][tt[3]][5] ~= nil then if tt[5] ~= nil then local toggletype = clamp(tonumber(tt[5]), 1, 4) if menu.options[tt[1]][tt[2]][tt[3]][5].toggletype ~= 0 then menu.options[tt[1]][tt[2]][tt[3]][5].toggletype = toggletype end end if tt[4] == "nil" then menu.options[tt[1]][tt[2]][tt[3]][5][1] = nil else menu.options[tt[1]][tt[2]][tt[3]][5][1] = keyz[tonumber(tt[4])] end end end local start = nil for i, v in next, lines do if v == "colorpickers {" then start = i break end end local end_ = nil for i, v in next, lines do if i > start and v == "}" then end_ = i break end end for i = 1, end_ - start - 1 do local tt = string.split(lines[i + start], "|") if menu.options[tt[1]] ~= nil and menu.options[tt[1]][tt[2]] ~= nil and menu.options[tt[1]][tt[2]][tt[3]] ~= nil then local subs = string.split(tt[4], ",") if type(menu.options[tt[1]][tt[2]][tt[3]][5][1][1]) == "table" then continue end for i, v in ipairs(subs) do if menu.options[tt[1]][tt[2]][tt[3]][5][1][i] == nil then break end local opt = string.gsub(v, " ", "") menu.options[tt[1]][tt[2]][tt[3]][5][1][i] = tonumber(opt) if i == #subs - 1 then break end end end end local start = nil for i, v in next, lines do if v == "double colorpickers {" then start = i break end end local end_ = nil for i, v in next, lines do if i > start and v == "}" then end_ = i break end end for i = 1, end_ - start - 1 do local tt = string.split(lines[i + start], "|") if menu.options[tt[1]] ~= nil and menu.options[tt[1]][tt[2]] ~= nil and menu.options[tt[1]][tt[2]][tt[3]] ~= nil then local subs = { string.split(tt[4], ","), string.split(tt[5], ",") } for i, v in ipairs(subs) do if type(menu.options[tt[1]][tt[2]][tt[3]][5][1][i]) == "number" then break end for i1, v1 in ipairs(v) do if menu.options[tt[1]][tt[2]][tt[3]][5][1][i][1][i1] == nil then break end local opt = string.gsub(v1, " ", "") menu.options[tt[1]][tt[2]][tt[3]][5][1][i][1][i1] = tonumber(opt) if i1 == #v - 1 then break end end end end end for k, v in pairs(menu.options) do for k1, v1 in pairs(v) do for k2, v2 in pairs(v1) do if v2[2] == TOGGLE then if not v2[1] then for i = 0, 3 do v2[4][i + 1].Color = ColorRange(i, { [1] = { start = 0, color = RGB(50, 50, 50) }, [2] = { start = 3, color = RGB(30, 30, 30) }, }) end else for i = 0, 3 do v2[4][i + 1].Color = ColorRange(i, { [1] = { start = 0, color = RGB(menu.mc[1], menu.mc[2], menu.mc[3]) }, [2] = { start = 3, color = RGB(menu.mc[1] - 40, menu.mc[2] - 40, menu.mc[3] - 40), }, }) end end if v2[5] ~= nil then if v2[5][2] == KEYBIND then v2[5][4][2].Color = RGB(30, 30, 30) v2[5][4][1].Text = KeyEnumToName(v2[5][1]) elseif v2[5][2] == COLORPICKER then v2[5][4][1].Color = RGB(v2[5][1][1], v2[5][1][2], v2[5][1][3]) for i = 2, 3 do v2[5][4][i].Color = RGB(v2[5][1][1] - 40, v2[5][1][2] - 40, v2[5][1][3] - 40) end elseif v2[5][2] == DOUBLE_COLORPICKER then if type(v2[5][1][1]) == "table" then for i, v3 in ipairs(v2[5][1]) do v3[4][1].Color = RGB(v3[1][1], v3[1][2], v3[1][3]) for i1 = 2, 3 do v3[4][i1].Color = RGB(v3[1][1] - 40, v3[1][2] - 40, v3[1][3] - 40) end end end end end elseif v2[2] == SLIDER then if v2[1] < v2[6][1] then v2[1] = v2[6][1] elseif v2[1] > v2[6][2] then v2[1] = v2[6][2] end local decplaces = v2.decimal and string.rep("0", math.log(1 / v2.decimal) / math.log(10)) if decplaces and math.abs(v2[1]) < v2.decimal then v2[1] = 0 end v2[4][5].Text = v2.custom[v2[1]] or (v2[1] == math.floor(v2[1]) and v2.decimal) and tostring(v2[1]) .. "." .. decplaces .. v2[4][6] or tostring(v2[1]) .. v2[4][6] for i = 1, 4 do v2[4][i].Size = Vector2.new((v2[3][3] - 4) * ((v2[1] - v2[6][1]) / (v2[6][2] - v2[6][1])), 2) end elseif v2[2] == DROPBOX then if v2[6][v2[1]] == nil then v2[1] = 1 end v2[4][1].Text = v2[6][v2[1]] elseif v2[2] == COMBOBOX then local textthing = "" for k3, v3 in pairs(v2[1]) do if v3[2] then if textthing == "" then textthing = v3[1] else textthing = textthing .. ", " .. v3[1] end end end textthing = textthing ~= "" and textthing or "None" textthing = string_cut(textthing, 25) v2[4][1].Text = textthing elseif v2[2] == TEXTBOX then v2[4].Text = v2[1] end end end end end end function menu.saveconfig() local figgy = SaveCurSettings() writefile( "zeromonth/" .. menu.game .. "/" .. menu.options["Settings"]["Configuration"]["ConfigName"][1] .. ".zm", figgy ) CreateNotification('Saved "' .. menu.options["Settings"]["Configuration"]["ConfigName"][1] .. '.zm"!') UpdateConfigs() end function menu.loadconfig() local configname = "zeromonth/" .. menu.game .. "/" .. menu.options["Settings"]["Configuration"]["ConfigName"][1] .. ".zm" if not isfile(configname) then CreateNotification( '"' .. menu.options["Settings"]["Configuration"]["ConfigName"][1] .. '.zm" is not a valid config.' ) return end local curcfg = SaveCurSettings() local loadedcfg = readfile(configname) if pcall(LoadConfig, loadedcfg) then CreateNotification('Loaded "' .. menu.options["Settings"]["Configuration"]["ConfigName"][1] .. '.zm"!') else LoadConfig(curcfg) CreateNotification( 'There was an issue loading "' .. menu.options["Settings"]["Configuration"]["ConfigName"][1] .. '.zm"' ) end end local function buttonpressed(bp) if bp.doubleclick then if buttonsInQue[bp] and tick() - buttonsInQue[bp] < doubleclickDelay then buttonsInQue[bp] = 0 else for button, time in next, buttonsInQue do buttonsInQue[button] = 0 end buttonsInQue[bp] = tick() return end end FireEvent("zm_buttonpressed", bp.tab, bp.groupbox, bp.name) if bp == menu.options["Settings"]["Cheat Settings"]["Unload Cheat"] then menu.fading = true wait() menu:unload() elseif bp == menu.options["Settings"]["Cheat Settings"]["Set Clipboard Game ID"] then setclipboard(game.JobId) CreateNotification("Set Clipboard Game ID! (".. tostring(game.JobId)..")") elseif bp == menu.options["Settings"]["Configuration"]["Save Config"] then menu.saveconfig() elseif bp == menu.options["Settings"]["Configuration"]["Delete Config"] then delfile( "zeromonth/" .. menu.game .. "/" .. menu.options["Settings"]["Configuration"]["ConfigName"][1] .. ".zm" ) CreateNotification('Deleted "' .. menu.options["Settings"]["Configuration"]["ConfigName"][1] .. '.zm"!') UpdateConfigs() elseif bp == menu.options["Settings"]["Configuration"]["Load Config"] then menu.loadconfig() end end local function MouseButton2Event() if menu.colorPickerOpen or menu.dropbox_open then return end for k, v in pairs(menu.options) do if menu.tabnames[menu.activetab] == k then for k1, v1 in pairs(v) do local pass = true for k3, v3 in pairs(menu.multigroups) do if k == k3 then for k4, v4 in pairs(v3) do for k5, v5 in pairs(v4.vals) do if k1 == k5 then pass = v5 end end end end end if pass then for k2, v2 in pairs(v1) do if v2[2] == TOGGLE then if v2[5] ~= nil then if v2[5][2] == KEYBIND then if menu:MouseInMenu(v2[5][3][1], v2[5][3][2], 44, 16) then if menu.keybind_open ~= v2 and v2[5].toggletype ~= 0 then menu.keybind_open = v2 menu:SetKeybindSelect( true, v2[5][3][1] + menu.x, v2[5][3][2] + 16 + menu.y, v2[5].toggletype ) else menu.keybind_open = nil menu:SetKeybindSelect(false, 20, 20, 1) end end end end end end end end end end end local function menucolor() if menu.open then if menu:GetVal("Settings", "Cheat Settings", "Menu Accent") then local clr = menu:GetVal("Settings", "Cheat Settings", "Menu Accent", COLOR, true) menu.mc = { clr.R * 255, clr.G * 255, clr.B * 255 } else menu.mc = { 127, 72, 163 } end menu:SetColor(menu.mc[1], menu.mc[2], menu.mc[3]) local wme = menu:GetVal("Settings", "Cheat Settings", "Watermark") for k, v in pairs(menu.watermark.rect) do v.Visible = wme end menu.watermark.text[1].Visible = wme end end local function MouseButton1Event() menu.dropbox_open = nil menu.textboxopen = false menu:SetKeybindSelect(false, 20, 20, 1) if menu.keybind_open then local key = menu.keybind_open local foundkey = false for i = 1, 4 do if menu:MouseInMenu(key[5][3][1], key[5][3][2] + 16 + ((i - 1) * 21), 70, 21) then foundkey = true menu.keybind_open[5].toggletype = i menu.keybind_open[5].relvalue = false end end menu.keybind_open = nil if foundkey then return end end for k, v in pairs(menu.options) do for k1, v1 in pairs(v) do for k2, v2 in pairs(v1) do if v2[2] == DROPBOX and v2[5] then if not menu:MouseInMenu(v2[3][1], v2[3][2], v2[3][3], 24 * (#v2[6] + 1) + 3) then menu:SetDropBox(false, 400, 200, 160, 1, { "HI q", "HI q", "HI q" }) v2[5] = false else menu.dropbox_open = v2 end end if v2[2] == COMBOBOX and v2[5] then if not menu:MouseInMenu(v2[3][1], v2[3][2], v2[3][3], 24 * (#v2[1] + 1) + 3) then menu:SetDropBox(false, 400, 200, 160, 1, { "HI q", "HI q", "HI q" }) v2[5] = false else menu.dropbox_open = v2 end end if v2[2] == TOGGLE then if v2[5] ~= nil then if v2[5][2] == KEYBIND then if v2[5][5] == true then v2[5][4][2].Color = RGB(30, 30, 30) v2[5][5] = false end elseif v2[5][2] == COLORPICKER then if v2[5][5] == true then if not menu:MouseInColorPicker(0, 0, cp.w, cp.h) then if menu.colorPickerOpen then local tempclr = cp.oldcolor menu.colorPickerOpen[4][1].Color = tempclr for i = 2, 3 do menu.colorPickerOpen[4][i].Color = RGB( math.floor(tempclr.R * 255) - 40, math.floor(tempclr.G * 255) - 40, math.floor(tempclr.B * 255) - 40 ) end if cp.alpha then menu.colorPickerOpen[1] = { math.floor(tempclr.R * 255), math.floor(tempclr.G * 255), math.floor(tempclr.B * 255), cp.oldcoloralpha, } else menu.colorPickerOpen[1] = { math.floor(tempclr.R * 255), math.floor(tempclr.G * 255), math.floor(tempclr.B * 255), } end end menu:SetColorPicker(false, { 255, 0, 0 }, nil, false, "hahaha", 400, 200) v2[5][5] = false menu.colorPickerOpen = nil end end elseif v2[5][2] == DOUBLE_COLORPICKER then for k3, v3 in pairs(v2[5][1]) do if v3[5] == true then if not menu:MouseInColorPicker(0, 0, cp.w, cp.h) then if menu.colorPickerOpen then local tempclr = cp.oldcolor menu.colorPickerOpen[4][1].Color = tempclr for i = 2, 3 do menu.colorPickerOpen[4][i].Color = RGB( math.floor(tempclr.R * 255) - 40, math.floor(tempclr.G * 255) - 40, math.floor(tempclr.B * 255) - 40 ) end if cp.alpha then menu.colorPickerOpen[1] = { math.floor(tempclr.R * 255), math.floor(tempclr.G * 255), math.floor(tempclr.B * 255), cp.oldcoloralpha, } else menu.colorPickerOpen[1] = { math.floor(tempclr.R * 255), math.floor(tempclr.G * 255), math.floor(tempclr.B * 255), } end end menu:SetColorPicker(false, { 255, 0, 0 }, nil, false, "hahaha", 400, 200) v3[5] = false menu.colorPickerOpen = nil end end end end end end if v2[2] == TEXTBOX and v2[5] then v2[4].Color = RGB(255, 255, 255) v2[5] = false v2[4].Text = v2[1] end end end end for i = 1, #menutable do if menu:MouseInMenu( 10 + ((i - 1) * math.floor((menu.w - 20) / #menutable)), 27, math.floor((menu.w - 20) / #menutable), 32 ) then menu.activetab = i setActiveTab(menu.activetab) menu:SetMenuPos(menu.x, menu.y) menu:SetToolTip(nil, nil, nil, false) end end if menu.colorPickerOpen then if menu:MouseInColorPicker(197, cp.h - 25, 75, 20) then local tempclr = Color3.fromHSV(cp.hsv.h, cp.hsv.s, cp.hsv.v) menu.colorPickerOpen[4][1].Color = tempclr for i = 2, 3 do menu.colorPickerOpen[4][i].Color = RGB( math.floor(tempclr.R * 255) - 40, math.floor(tempclr.G * 255) - 40, math.floor(tempclr.B * 255) - 40 ) end if cp.alpha then menu.colorPickerOpen[1] = { math.floor(tempclr.R * 255), math.floor(tempclr.G * 255), math.floor(tempclr.B * 255), cp.hsv.a, } else menu.colorPickerOpen[1] = { math.floor(tempclr.R * 255), math.floor(tempclr.G * 255), math.floor(tempclr.B * 255), } end menu.colorPickerOpen = nil menu:SetColorPicker(false, { 255, 0, 0 }, nil, false, "hahaha", 400, 200) end if menu:MouseInColorPicker(264, 2, 14, 14) then local tempclr = cp.oldcolor menu.colorPickerOpen[4][1].Color = tempclr for i = 2, 3 do menu.colorPickerOpen[4][i].Color = RGB( math.floor(tempclr.R * 255) - 40, math.floor(tempclr.G * 255) - 40, math.floor(tempclr.B * 255) - 40 ) end if cp.alpha then menu.colorPickerOpen[1] = { math.floor(tempclr.R * 255), math.floor(tempclr.G * 255), math.floor(tempclr.B * 255), cp.oldcoloralpha, } else menu.colorPickerOpen[1] = { math.floor(tempclr.R * 255), math.floor(tempclr.G * 255), math.floor(tempclr.B * 255), } end menu.colorPickerOpen = nil menu:SetColorPicker(false, { 255, 0, 0 }, nil, false, "hahaha", 400, 200) end if menu:MouseInColorPicker(10, 23, 160, 160) then cp.dragging_m = true elseif menu:MouseInColorPicker(176, 23, 14, 160) then cp.dragging_r = true elseif menu:MouseInColorPicker(10, 189, 160, 14) and cp.alpha then cp.dragging_b = true end if menu:MouseInColorPicker(197, 37, 75, 20) then menu.copied_clr = newcolor.Color elseif menu:MouseInColorPicker(197, 57, 75, 20) then if menu.copied_clr ~= nil then local cpa = false local clrtable = { menu.copied_clr.R * 255, menu.copied_clr.G * 255, menu.copied_clr.B * 255 } if menu.colorPickerOpen[1][4] ~= nil then cpa = true table.insert(clrtable, menu.colorPickerOpen[1][4]) end menu:SetColorPicker(true, clrtable, menu.colorPickerOpen, cpa, menu.colorPickerOpen[6], cp.x, cp.y) cp.oldclr = menu.colorPickerOpen[4][1].Color local oldclr = cp.oldclr if menu.colorPickerOpen[1][4] ~= nil then set_oldcolor(oldclr.R * 255, oldclr.G * 255, oldclr.B * 255, menu.colorPickerOpen[1][4]) else set_oldcolor(oldclr.R * 255, oldclr.G * 255, oldclr.B * 255) end end end if menu:MouseInColorPicker(197, 91, 75, 40) then menu.copied_clr = oldcolor.Color end else for k, v in pairs(menu.multigroups) do if menu.tabnames[menu.activetab] == k then for k1, v1 in pairs(v) do local c_pos = v1.drawn.click_pos local selected_pos = v1.drawn.barpos for k2, v2 in pairs(v1.drawn.click_pos) do if menu:MouseInMenu(v2.x, v2.y, v2.width, v2.height) then for _k, _v in pairs(v1.vals) do if _k == v2.name then v1.vals[_k] = true else v1.vals[_k] = false end end local settab = v2.num for _k, _v in pairs(v1.drawn.bar) do menu.postable[_v.postable][2] = selected_pos[settab].pos _v.drawn.Size = Vector2.new(selected_pos[settab].length, 2) end for i, v in pairs(v1.drawn.nametext) do if i == v2.num then v.Color = RGB(255, 255, 255) else v.Color = RGB(170, 170, 170) end end menu:setMenuVisible(true) setActiveTab(menu.activetab) menu:SetMenuPos(menu.x, menu.y) end end end end end local newdropbox_open for k, v in pairs(menu.options) do if menu.tabnames[menu.activetab] == k then for k1, v1 in pairs(v) do local pass = true for k3, v3 in pairs(menu.multigroups) do if k == k3 then for k4, v4 in pairs(v3) do for k5, v5 in pairs(v4.vals) do if k1 == k5 then pass = v5 end end end end end if pass then for k2, v2 in pairs(v1) do if v2[2] == TOGGLE and not menu.dropbox_open then if menu:MouseInMenu(v2[3][1], v2[3][2], 30 + v2[4][5].TextBounds.x, 16) then if v2[6] then if menu:GetVal( "Settings", "Cheat Settings", "Allow Unsafe Features" ) and v2[1] == false then v2[1] = true else v2[1] = false end else v2[1] = not v2[1] end if not v2[1] then for i = 0, 3 do v2[4][i + 1].Color = ColorRange(i, { [1] = { start = 0, color = RGB(50, 50, 50) }, [2] = { start = 3, color = RGB(30, 30, 30) }, }) end else for i = 0, 3 do v2[4][i + 1].Color = ColorRange(i, { [1] = { start = 0, color = RGB(menu.mc[1], menu.mc[2], menu.mc[3]), }, [2] = { start = 3, color = RGB( menu.mc[1] - 40, menu.mc[2] - 40, menu.mc[3] - 40 ), }, }) end end FireEvent("zm_togglepressed", k1, k2, v2) end if v2[5] ~= nil then if v2[5][2] == KEYBIND then if menu:MouseInMenu(v2[5][3][1], v2[5][3][2], 44, 16) then v2[5][4][2].Color = RGB(menu.mc[1], menu.mc[2], menu.mc[3]) v2[5][5] = true end elseif v2[5][2] == COLORPICKER then if menu:MouseInMenu(v2[5][3][1], v2[5][3][2], 28, 14) then v2[5][5] = true menu.colorPickerOpen = v2[5] menu.colorPickerOpen = v2[5] if v2[5][1][4] ~= nil then menu:SetColorPicker( true, v2[5][1], v2[5], true, v2[5][6], LOCAL_MOUSE.x, LOCAL_MOUSE.y + 36 ) else menu:SetColorPicker( true, v2[5][1], v2[5], false, v2[5][6], LOCAL_MOUSE.x, LOCAL_MOUSE.y + 36 ) end end elseif v2[5][2] == DOUBLE_COLORPICKER then for k3, v3 in pairs(v2[5][1]) do if menu:MouseInMenu(v3[3][1], v3[3][2], 28, 14) then v3[5] = true menu.colorPickerOpen = v3 menu.colorPickerOpen = v3 if v3[1][4] ~= nil then menu:SetColorPicker( true, v3[1], v3, true, v3[6], LOCAL_MOUSE.x, LOCAL_MOUSE.y + 36 ) else menu:SetColorPicker( true, v3[1], v3, false, v3[6], LOCAL_MOUSE.x, LOCAL_MOUSE.y + 36 ) end end end end end elseif v2[2] == SLIDER and not menu.dropbox_open then if menu:MouseInMenu(v2[7][1], v2[7][2], 22, 13) then local stepval = 1 if v2.stepsize then stepval = v2.stepsize end if menu:modkeydown("shift", "left") then stepval = v2.shift_stepsize or 0.1 end if menu:MouseInMenu(v2[7][1], v2[7][2], 11, 13) then v2[1] -= stepval elseif menu:MouseInMenu(v2[7][1] + 11, v2[7][2], 11, 13) then v2[1] += stepval end if v2[1] < v2[6][1] then v2[1] = v2[6][1] elseif v2[1] > v2[6][2] then v2[1] = v2[6][2] end local decplaces = v2.decimal and string.rep("0", math.log(1 / v2.decimal) / math.log(10)) if decplaces and math.abs(v2[1]) < v2.decimal then v2[1] = 0 end v2[4][5].Text = v2.custom[v2[1]] or (v2[1] == math.floor(v2[1]) and v2.decimal) and tostring(v2[1]) .. "." .. decplaces .. v2[4][6] or tostring(v2[1]) .. v2[4][6] for i = 1, 4 do v2[4][i].Size = Vector2.new( (v2[3][3] - 4) * ((v2[1] - v2[6][1]) / (v2[6][2] - v2[6][1])), 2 ) end elseif menu:MouseInMenu(v2[3][1], v2[3][2], v2[3][3], 28) then v2[5] = true end elseif v2[2] == DROPBOX then if menu.dropbox_open then if v2 ~= menu.dropbox_open then continue end end if menu:MouseInMenu(v2[3][1], v2[3][2], v2[3][3], 36) then if not v2[5] then v2[5] = menu:SetDropBox( true, v2[3][1] + menu.x + 1, v2[3][2] + menu.y + 13, v2[3][3], v2[1], v2[6] ) newdropbox_open = v2 else menu:SetDropBox(false, 400, 200, 160, 1, { "HI q", "HI q", "HI q" }) v2[5] = false newdropbox_open = nil end elseif menu:MouseInMenu(v2[3][1], v2[3][2], v2[3][3], 24 * (#v2[6] + 1) + 3) and v2[5] then for i = 1, #v2[6] do if menu:MouseInMenu( v2[3][1], v2[3][2] + 36 + ((i - 1) * 21), v2[3][3], 21 ) then v2[4][1].Text = v2[6][i] v2[1] = i menu:SetDropBox(false, 400, 200, 160, 1, { "HI q", "HI q", "HI q" }) v2[5] = false newdropbox_open = nil end end if v2 == menu.options["Settings"]["Configuration"]["Configs"] then local textbox = menu.options["Settings"]["Configuration"]["ConfigName"] local relconfigs = GetConfigs() textbox[1] = relconfigs[menu.options["Settings"]["Configuration"]["Configs"][1]] textbox[4].Text = textbox[1] end end elseif v2[2] == COMBOBOX then if menu.dropbox_open then if v2 ~= menu.dropbox_open then continue end end if menu:MouseInMenu(v2[3][1], v2[3][2], v2[3][3], 36) then if not v2[5] then v2[5] = set_comboboxthingy( true, v2[3][1] + menu.x + 1, v2[3][2] + menu.y + 13, v2[3][3], v2[1], v2[6] ) newdropbox_open = v2 else menu:SetDropBox(false, 400, 200, 160, 1, { "HI q", "HI q", "HI q" }) v2[5] = false newdropbox_open = nil end elseif menu:MouseInMenu(v2[3][1], v2[3][2], v2[3][3], 24 * (#v2[1] + 1) + 3) and v2[5] then for i = 1, #v2[1] do if menu:MouseInMenu( v2[3][1], v2[3][2] + 36 + ((i - 1) * 22), v2[3][3], 23 ) then v2[1][i][2] = not v2[1][i][2] local textthing = "" for k, v in pairs(v2[1]) do if v[2] then if textthing == "" then textthing = v[1] else textthing = textthing .. ", " .. v[1] end end end textthing = textthing ~= "" and textthing or "None" textthing = string_cut(textthing, 25) v2[4][1].Text = textthing set_comboboxthingy( true, v2[3][1] + menu.x + 1, v2[3][2] + menu.y + 13, v2[3][3], v2[1], v2[6] ) end end end elseif v2[2] == BUTTON and not menu.dropbox_open then if menu:MouseInMenu(v2[3][1], v2[3][2], v2[3][3], 22) then if not v2[1] then buttonpressed(v2) if k2 == "Unload Cheat" then return end for i = 0, 8 do v2[4][i + 1].Color = ColorRange(i, { [1] = { start = 0, color = RGB(35, 35, 35) }, [2] = { start = 8, color = RGB(50, 50, 50) }, }) end v2[1] = true end end elseif v2[2] == TEXTBOX and not menu.dropbox_open then if menu:MouseInMenu(v2[3][1], v2[3][2], v2[3][3], 22) then if not v2[5] then menu.textboxopen = v2 v2[4].Color = RGB(menu.mc[1], menu.mc[2], menu.mc[3]) v2[5] = true end end elseif v2[2] == "list" then if #v2[5] > v2[6] then for i = 1, v2[6] do if menu:MouseInMenu(v2[8][1], v2[8][2] + (i * 22) - 5, v2[8][3], 22) then if v2[1] == tostring(v2[5][i + v2[3] - 1][1][1]) then v2[1] = nil else v2[1] = tostring(v2[5][i + v2[3] - 1][1][1]) end end end else for i = 1, #v2[5] do if menu:MouseInMenu(v2[8][1], v2[8][2] + (i * 22) - 5, v2[8][3], 22) then if v2[1] == tostring(v2[5][i + v2[3] - 1][1][1]) then v2[1] = nil else v2[1] = tostring(v2[5][i + v2[3] - 1][1][1]) end end end end end end end end end end menu.dropbox_open = newdropbox_open end for k, v in pairs(menu.options) do for k1, v1 in pairs(v) do for k2, v2 in pairs(v1) do if v2[2] == TOGGLE then if v2[6] then if not menu:GetVal("Settings", "Cheat Settings", "Allow Unsafe Features") then v2[1] = false for i = 0, 3 do v2[4][i + 1].Color = ColorRange(i, { [1] = { start = 0, color = RGB(50, 50, 50) }, [2] = { start = 3, color = RGB(30, 30, 30) }, }) end end end end end end end menucolor() end local function mousebutton1upfunc() cp.dragging_m = false cp.dragging_r = false cp.dragging_b = false for k, v in pairs(menu.options) do if menu.tabnames[menu.activetab] == k then for k1, v1 in pairs(v) do for k2, v2 in pairs(v1) do if v2[2] == SLIDER and v2[5] then v2[5] = false end if v2[2] == BUTTON and v2[1] then for i = 0, 8 do v2[4][i + 1].Color = ColorRange(i, { [1] = { start = 0, color = RGB(50, 50, 50) }, [2] = { start = 8, color = RGB(35, 35, 35) }, }) end v2[1] = false end end end end end end local clickspot_x, clickspot_y, original_menu_x, original_menu_y = 0, 0, 0, 0 menu.connections.mwf = LOCAL_MOUSE.WheelForward:Connect(function() if menu.open then for k, v in pairs(menu.options) do if menu.tabnames[menu.activetab] == k then for k1, v1 in pairs(v) do for k2, v2 in pairs(v1) do if v2[2] == "list" then if v2[3] > 1 then v2[3] -= 1 end end end end end end end end) menu.connections.mwb = LOCAL_MOUSE.WheelBackward:Connect(function() if menu.open then for k, v in pairs(menu.options) do if menu.tabnames[menu.activetab] == k then for k1, v1 in pairs(v) do for k2, v2 in pairs(v1) do if v2[2] == "list" then if v2[5][v2[3] + v2[6]] ~= nil then v2[3] += 1 end end end end end end end end) function menu:setMenuAlpha(transparency) for k, v in pairs(zmmouse) do v.Transparency = transparency end for k, v in pairs(zmmenu) do v.Transparency = transparency end for k, v in pairs(tabz[menu.activetab]) do v.Transparency = transparency end end function menu:setMenuVisible(visible) for k, v in pairs(zmmouse) do v.Visible = visible end for k, v in pairs(zmmenu) do v.Visible = visible end for k, v in pairs(tabz[menu.activetab]) do v.Visible = visible end if visible then for k, v in pairs(menu.multigroups) do if menu.tabnames[menu.activetab] == k then for k1, v1 in pairs(v) do for k2, v2 in pairs(v1.vals) do for k3, v3 in pairs(menu.mgrouptabz[k][k2]) do v3.Visible = v2 end end end end end end end menu:setMenuAlpha(0) menu:setMenuVisible(false) menu.lastActive = true menu.open = false menu.windowactive = true menu.connections.mousemoved = MouseMoved:connect(function(b) menu.windowactive = iswindowactive() or b end) local function renderSteppedMenu(fdt) if cp.dragging_m or cp.dragging_r or cp.dragging_b then menucolor() end menu.dt = fdt if menu.unloaded then return end SCREEN_SIZE = Camera.ViewportSize if zmmouse[#zmmouse-1] then if menu.inmenu and not menu.inmiddlemenu and not menu.intabs then zmmouse[#zmmouse-1].Visible = true zmmouse[#zmmouse-1].Transparency = 1 else zmmouse[#zmmouse-1].Visible = false end end menu.lastActive = menu.windowactive for button, time in next, buttonsInQue do if time and tick() - time < doubleclickDelay then button[4].text.Color = RGB(menu.mc[1], menu.mc[2], menu.mc[3]) button[4].text.Text = "Confirm?" else button[4].text.Color = Color3.new(1, 1, 1) button[4].text.Text = button.name end end if menu.open then if menu.backspaceheld then local dt = tick() - menu.backspacetime if dt > 0.4 then menu.backspaceflags += 1 if menu.backspaceflags % 5 == 0 then local textbox = menu.textboxopen textbox[1] = string.sub(textbox[1], 0, #textbox[1] - 1) textbox[4].Text = textbox[1] .. "|" end end end end if menu.fading then if menu.open then menu.timesincefade = tick() - menu.fadestart menu.fade_amount = 1 - (menu.timesincefade * 10) menu:SetPlusMinus(0, 20, 20) menu:setMenuAlpha(menu.fade_amount) if menu.fade_amount <= 0 then menu.open = false menu.fading = false menu:setMenuAlpha(0) menu:setMenuVisible(false) else menu:setMenuAlpha(menu.fade_amount) end else menu:setMenuVisible(true) setActiveTab(menu.activetab) menu.timesincefade = tick() - menu.fadestart menu.fade_amount = (menu.timesincefade * 10) menu.fadeamount = menu.fade_amount menu:setMenuAlpha(menu.fade_amount) if menu.fade_amount >= 1 then menu.open = true menu.fading = false menu:setMenuAlpha(1) else menu:setMenuAlpha(menu.fade_amount) end end end if menu.game == "uni" then if menu.open then INPUT_SERVICE.MouseBehavior = Enum.MouseBehavior.Default else if INPUT_SERVICE.MouseBehavior ~= menu.mousebehavior then INPUT_SERVICE.MouseBehavior = menu.mousebehavior end end end menu:SetMousePosition(LOCAL_MOUSE.x, LOCAL_MOUSE.y) local settooltip = true if menu.open or menu.fading then menu:SetPlusMinus(0, 20, 20) for k, v in pairs(menu.options) do if menu.tabnames[menu.activetab] == k then for k1, v1 in pairs(v) do local pass = true for k3, v3 in pairs(menu.multigroups) do if k == k3 then for k4, v4 in pairs(v3) do for k5, v5 in pairs(v4.vals) do if k1 == k5 then pass = v5 end end end end end if pass then for k2, v2 in pairs(v1) do if v2[2] == TOGGLE then if not menu.dropbox_open and not menu.colorPickerOpen then if menu.open and menu:MouseInMenu(v2[3][1], v2[3][2], 30 + v2[4][5].TextBounds.x, 16) then if v2.tooltip and settooltip then menu:SetToolTip( menu.x + v2[3][1], menu.y + v2[3][2] + 18, v2.tooltip, true, fdt ) settooltip = false end end end elseif v2[2] == SLIDER then if v2[5] then local new_val = (v2[6][2] - v2[6][1]) * ( ( LOCAL_MOUSE.x - menu.x - v2[3][1] ) / v2[3][3] ) v2[1] = ( not v2.decimal and math.floor(new_val) or math.floor(new_val / v2.decimal) * v2.decimal ) + v2[6][1] if v2[1] < v2[6][1] then v2[1] = v2[6][1] elseif v2[1] > v2[6][2] then v2[1] = v2[6][2] end local decplaces = v2.decimal and string.rep("0", math.log(1 / v2.decimal) / math.log(10)) if decplaces and math.abs(v2[1]) < v2.decimal then v2[1] = 0 end v2[4][5].Text = v2.custom[v2[1]] or (v2[1] == math.floor(v2[1]) and v2.decimal) and tostring(v2[1]) .. "." .. decplaces .. v2[4][6] or tostring(v2[1]) .. v2[4][6] for i = 1, 4 do v2[4][i].Size = Vector2.new( (v2[3][3] - 4) * ((v2[1] - v2[6][1]) / (v2[6][2] - v2[6][1])), 2 ) end menu:SetPlusMinus(1, v2[7][1], v2[7][2]) else if not menu.dropbox_open then if menu:MouseInMenu(v2[3][1], v2[3][2], v2[3][3], 28) then if menu:MouseInMenu(v2[7][1], v2[7][2], 22, 13) then if menu:MouseInMenu(v2[7][1], v2[7][2], 11, 13) then menu:SetPlusMinus(2, v2[7][1], v2[7][2]) elseif menu:MouseInMenu(v2[7][1] + 11, v2[7][2], 11, 13) then menu:SetPlusMinus(3, v2[7][1], v2[7][2]) end else menu:SetPlusMinus(1, v2[7][1], v2[7][2]) end end end end elseif v2[2] == "list" then for k3, v3 in pairs(v2[4].liststuff) do for i, v4 in ipairs(v3) do for i1, v5 in ipairs(v4) do v5.Visible = false end end end for i = 1, v2[6] do if v2[5][i + v2[3] - 1] ~= nil then for i1 = 1, v2[7] do v2[4].liststuff.words[i][i1].Text = v2[5][i + v2[3] - 1][i1][1] v2[4].liststuff.words[i][i1].Visible = true if v2[5][i + v2[3] - 1][i1][1] == v2[1] and i1 == 1 then if menu.options["Settings"]["Cheat Settings"]["Menu Accent"][1] then local clr = menu.options["Settings"]["Cheat Settings"]["Menu Accent"][5][1] v2[4].liststuff.words[i][i1].Color = RGB(clr[1], clr[2], clr[3]) else v2[4].liststuff.words[i][i1].Color = RGB(menu.mc[1], menu.mc[2], menu.mc[3]) end else v2[4].liststuff.words[i][i1].Color = v2[5][i + v2[3] - 1][i1][2] end end for k3, v3 in pairs(v2[4].liststuff.rows[i]) do v3.Visible = true end elseif v2[3] > 1 then v2[3] -= 1 end end if v2[3] == 1 then for k3, v3 in pairs(v2[4].uparrow) do if v3.Visible then v3.Visible = false end end else for k3, v3 in pairs(v2[4].uparrow) do if not v3.Visible then v3.Visible = true menu:SetMenuPos(menu.x, menu.y) end end end if v2[5][v2[3] + v2[6]] == nil then for k3, v3 in pairs(v2[4].downarrow) do if v3.Visible then v3.Visible = false end end else for k3, v3 in pairs(v2[4].downarrow) do if not v3.Visible then v3.Visible = true menu:SetMenuPos(menu.x, menu.y) end end end end end end end end end menu.inmenu = LOCAL_MOUSE.x > menu.x and LOCAL_MOUSE.x < menu.x + menu.w and LOCAL_MOUSE.y > menu.y - 32 and LOCAL_MOUSE.y < menu.y + menu.h - 34 menu.intabs = LOCAL_MOUSE.x > menu.x + 9 and LOCAL_MOUSE.x < menu.x + menu.w - 9 and LOCAL_MOUSE.y > menu.y - 9 and LOCAL_MOUSE.y < menu.y + 24 menu.inmiddlemenu = LOCAL_MOUSE.x > menu.x + 18 and LOCAL_MOUSE.x < menu.x + menu.w - 18 and LOCAL_MOUSE.y > menu.y + 33 and LOCAL_MOUSE.y < menu.y + menu.h - 56 if ( ( menu.inmenu and not menu.intabs and not menu.inmiddlemenu ) or menu.dragging ) and not menu.dontdrag then if menu.mousedown and not menu.colorPickerOpen and not dropbox_open then if not menu.dragging then clickspot_x = LOCAL_MOUSE.x clickspot_y = LOCAL_MOUSE.y - 36 original_menu_X = menu.x original_menu_y = menu.y menu.dragging = true end menu.x = (original_menu_X - clickspot_x) + LOCAL_MOUSE.x menu.y = (original_menu_y - clickspot_y) + LOCAL_MOUSE.y - 36 if menu.y < 0 then menu.y = 0 end if menu.x < -menu.w / 4 * 3 then menu.x = -menu.w / 4 * 3 end if menu.x + menu.w / 4 > SCREEN_SIZE.x then menu.x = SCREEN_SIZE.x - menu.w / 4 end if menu.y > SCREEN_SIZE.y - 20 then menu.y = SCREEN_SIZE.y - 20 end menu:SetMenuPos(menu.x, menu.y) else menu.dragging = false end elseif menu.mousedown then menu.dontdrag = true elseif not menu.mousedown then menu.dontdrag = false end if menu.colorPickerOpen then if cp.dragging_m then menu:SetDragBarM( clamp(LOCAL_MOUSE.x, cp.x + 12, cp.x + 167) - 2, clamp(LOCAL_MOUSE.y + 36, cp.y + 25, cp.y + 180) - 2 ) cp.hsv.s = (clamp(LOCAL_MOUSE.x, cp.x + 12, cp.x + 167) - cp.x - 12) / 155 cp.hsv.v = 1 - ((clamp(LOCAL_MOUSE.y + 36, cp.y + 23, cp.y + 178) - cp.y - 23) / 155) newcolor.Color = Color3.fromHSV(cp.hsv.h, cp.hsv.s, cp.hsv.v) local tempclr = Color3.fromHSV(cp.hsv.h, cp.hsv.s, cp.hsv.v) menu.colorPickerOpen[4][1].Color = tempclr for i = 2, 3 do menu.colorPickerOpen[4][i].Color = RGB( math.floor(tempclr.R * 255) - 40, math.floor(tempclr.G * 255) - 40, math.floor(tempclr.B * 255) - 40 ) end if cp.alpha then menu.colorPickerOpen[1] = { math.floor(tempclr.R * 255), math.floor(tempclr.G * 255), math.floor(tempclr.B * 255), cp.hsv.a, } else menu.colorPickerOpen[1] = { math.floor(tempclr.R * 255), math.floor(tempclr.G * 255), math.floor(tempclr.B * 255), } end elseif cp.dragging_r then menu:SetDragBarR(cp.x + 175, clamp(LOCAL_MOUSE.y + 36, cp.y + 23, cp.y + 178)) maincolor.Color = Color3.fromHSV( 1 - ((clamp(LOCAL_MOUSE.y + 36, cp.y + 23, cp.y + 178) - cp.y - 23) / 155), 1, 1 ) cp.hsv.h = 1 - ((clamp(LOCAL_MOUSE.y + 36, cp.y + 23, cp.y + 178) - cp.y - 23) / 155) newcolor.Color = Color3.fromHSV(cp.hsv.h, cp.hsv.s, cp.hsv.v) local tempclr = Color3.fromHSV(cp.hsv.h, cp.hsv.s, cp.hsv.v) menu.colorPickerOpen[4][1].Color = tempclr for i = 2, 3 do menu.colorPickerOpen[4][i].Color = RGB( math.floor(tempclr.R * 255) - 40, math.floor(tempclr.G * 255) - 40, math.floor(tempclr.B * 255) - 40 ) end if cp.alpha then menu.colorPickerOpen[1] = { math.floor(tempclr.R * 255), math.floor(tempclr.G * 255), math.floor(tempclr.B * 255), cp.hsv.a, } else menu.colorPickerOpen[1] = { math.floor(tempclr.R * 255), math.floor(tempclr.G * 255), math.floor(tempclr.B * 255), } end elseif cp.dragging_b then local tempclr = Color3.fromHSV(cp.hsv.h, cp.hsv.s, cp.hsv.v) menu.colorPickerOpen[4][1].Color = tempclr for i = 2, 3 do menu.colorPickerOpen[4][i].Color = RGB( math.floor(tempclr.R * 255) - 40, math.floor(tempclr.G * 255) - 40, math.floor(tempclr.B * 255) - 40 ) end if cp.alpha then menu.colorPickerOpen[1] = { math.floor(tempclr.R * 255), math.floor(tempclr.G * 255), math.floor(tempclr.B * 255), cp.hsv.a, } else menu.colorPickerOpen[1] = { math.floor(tempclr.R * 255), math.floor(tempclr.G * 255), math.floor(tempclr.B * 255), } end menu:SetDragBarB(clamp(LOCAL_MOUSE.x, cp.x + 10, cp.x + 168), cp.y + 188) newcolor.Transparency = (clamp(LOCAL_MOUSE.x, cp.x + 10, cp.x + 168) - cp.x - 10) / 158 cp.hsv.a = math.floor(((clamp(LOCAL_MOUSE.x, cp.x + 10, cp.x + 168) - cp.x - 10) / 158) * 255) else local setvisnew = menu:MouseInColorPicker(197, 37, 75, 40) for i, v in ipairs(newcopy) do v.Visible = setvisnew end local setvisold = menu:MouseInColorPicker(197, 91, 75, 40) for i, v in ipairs(oldcopy) do v.Visible = setvisold end end end else menu.dragging = false end if settooltip then menu:SetToolTip(nil, nil, nil, false, fdt) end end menu.connections.inputstart = INPUT_SERVICE.InputBegan:Connect(function(input) if menu then if input.UserInputType == Enum.UserInputType.MouseButton1 then menu.mousedown = true if menu.open and not menu.fading then MouseButton1Event() end elseif input.UserInputType == Enum.UserInputType.MouseButton2 then if menu.open and not menu.fading then MouseButton2Event() end end if input.UserInputType == Enum.UserInputType.Keyboard then if input.KeyCode.Name:match("Shift") then local kcn = input.KeyCode.Name local direction = kcn:split("Shift")[1] menu.modkeys.shift.direction = direction:lower() end if input.KeyCode.Name:match("Alt") then local kcn = input.KeyCode.Name local direction = kcn:split("Alt")[1] menu.modkeys.alt.direction = direction:lower() end end if not menu then return end menu:InputBeganMenu(input) menu:InputBeganKeybinds(input) if menu.open then if menu.tabnames[menu.activetab] == "Settings" then local menutext = menu:GetVal("Settings", "Cheat Settings", "Custom Menu Name") and menu:GetVal("Settings", "Cheat Settings", "MenuName") or "ZeroMonth" zmmenu[27].Text = menutext menu.watermark.text[1].Text = menutext.. menu.watermark.textString for i, v in ipairs(menu.watermark.rect) do local len = #menu.watermark.text[1].Text * 7 + 10 if i == #menu.watermark.rect then len += 2 end v.Size = Vector2.new(len, v.Size.y) end end end if input.KeyCode == Enum.KeyCode.F2 then menu.stat_menu = not menu.stat_menu for k, v in pairs(graphs) do if k ~= "other" then for k1, v1 in pairs(v) do if k1 ~= "pos" then for k2, v2 in pairs(v1) do v2.Visible = menu.stat_menu end end end end end for k, v in pairs(graphs.other) do v.Visible = menu.stat_menu end end end end) menu.connections.inputended = INPUT_SERVICE.InputEnded:Connect(function(input) menu:InputEndedKeybinds(input) if input.UserInputType == Enum.UserInputType.MouseButton1 then menu.mousedown = false if menu.open and not menu.fading then mousebutton1upfunc() end end if input.UserInputType == Enum.UserInputType.Keyboard then if input.KeyCode.Name:match("Shift") then menu.modkeys.shift.direction = nil end if input.KeyCode.Name:match("Alt") then menu.modkeys.alt.direction = nil end end end) menu.connections.renderstepped = game.RunService.RenderStepped:Connect(renderSteppedMenu) function menu:unload() getgenv().v2 = nil self.unloaded = true for k, conn in next, self.connections do if not getrawmetatable(conn) then conn() else conn:Disconnect() end self.connections[k] = nil end game:service("ContextActionService"):UnbindAction("ZM Keycheck") if self.game == "cb" then game:service("ContextActionService"):UnbindAction("ZM CB check") elseif self.game == "uni" then game:service("ContextActionService"):UnbindAction("ZM UNI check") end local mt = getrawmetatable(game) setreadonly(mt, false) local oldmt = menu.oldmt if oldmt then for k, v in next, mt do if oldmt[k] then mt[k] = oldmt[k] end end else end setreadonly(mt, true) if menu.game == "cb" or menu.pfunload then menu:pfunload() end Draw:UnRender() CreateNotification = nil allrender = nil menu = nil Draw = nil self.unloaded = true end end local avgfps = 100 local StatMenuRendered = event.new("StatMenuRendered") menu.connections.heartbeatmenu = game.RunService.Heartbeat:Connect(function() if menu.open then if menu.y < 0 then menu.y = 0 menu:SetMenuPos(menu.x, 0) end if menu.x < -menu.w / 4 * 3 then menu.x = -menu.w / 4 * 3 menu:SetMenuPos(-menu.w / 4 * 3, menu.y) end if menu.x + menu.w / 4 > SCREEN_SIZE.x then menu.x = SCREEN_SIZE.x - menu.w / 4 menu:SetMenuPos(SCREEN_SIZE.x - menu.w / 4, menu.y) end if menu.y > SCREEN_SIZE.y - 20 then menu.y = SCREEN_SIZE.y - 20 menu:SetMenuPos(menu.x, SCREEN_SIZE.y - 20) end end if menu.stat_menu == false then return end local fps = 1 / (menu.dt or 1) avgfps = (fps + avgfps * 49) / 50 local CurrentFPS = math.floor(avgfps) if tick() > lasttick + 0.25 then table.remove(networkin.incoming, 1) table.insert(networkin.incoming, stats.DataReceiveKbps) table.remove(networkin.outgoing, 1) table.insert(networkin.outgoing, stats.DataSendKbps) local biggestnum = 80 for i = 1, 21 do if math.ceil(networkin.incoming[i]) > biggestnum - 10 then biggestnum = (math.ceil(networkin.incoming[i] / 10) + 1) * 10 end end local numstr = tostring(biggestnum) graphs.incoming.sides[2].Text = numstr graphs.incoming.sides[2].Position = Vector2.new(graphs.incoming.pos.x - ((#numstr + 1) * 7), graphs.incoming.pos.y - 7) for i = 1, 20 do local line = graphs.incoming.graph[i] line.From = Vector2.new( ((i - 1) * 11) + graphs.incoming.pos.x, graphs.incoming.pos.y + 80 - math.floor(networkin.incoming[i] / biggestnum * 80) ) line.To = Vector2.new( (i * 11) + graphs.incoming.pos.x, graphs.incoming.pos.y + 80 - math.floor(networkin.incoming[i + 1] / biggestnum * 80) ) end local avgbar_h = average(networkin.incoming) local avg_color = menu:GetVal("Settings", "Cheat Settings", "Menu Accent") and RGB(unpack(menu.mc)) or RGB(59, 214, 28) graphs.incoming.graph[21].From = Vector2.new( graphs.incoming.pos.x + 1, graphs.incoming.pos.y + 80 - math.floor(avgbar_h / biggestnum * 80) ) graphs.incoming.graph[21].To = Vector2.new( graphs.incoming.pos.x + 220, graphs.incoming.pos.y + 80 - math.floor(avgbar_h / biggestnum * 80) ) graphs.incoming.graph[21].Color = avg_color graphs.incoming.graph[21].Thickness = 2 graphs.incoming.graph[22].Position = Vector2.new( graphs.incoming.pos.x + 222, graphs.incoming.pos.y + 80 - math.floor(avgbar_h / biggestnum * 80) - 8 ) graphs.incoming.graph[22].Text = "avg: " .. tostring(round(avgbar_h, 2)) graphs.incoming.graph[22].Color = avg_color graphs.incoming.sides[1].Text = "incoming kbps: " .. tostring(round(networkin.incoming[21], 2)) local biggestnum = 10 for i = 1, 21 do if math.ceil(networkin.outgoing[i]) > biggestnum - 5 then biggestnum = (math.ceil(networkin.outgoing[i] / 5) + 1) * 5 end end local numstr = tostring(biggestnum) graphs.outgoing.sides[2].Text = numstr graphs.outgoing.sides[2].Position = Vector2.new(graphs.outgoing.pos.x - ((#numstr + 1) * 7), graphs.outgoing.pos.y - 7) for i = 1, 20 do local line = graphs.outgoing.graph[i] line.From = Vector2.new( ((i - 1) * 11) + graphs.outgoing.pos.x, graphs.outgoing.pos.y + 80 - math.floor(networkin.outgoing[i] / biggestnum * 80) ) line.To = Vector2.new( (i * 11) + graphs.outgoing.pos.x, graphs.outgoing.pos.y + 80 - math.floor(networkin.outgoing[i + 1] / biggestnum * 80) ) end local avgbar_h = average(networkin.outgoing) graphs.outgoing.graph[21].From = Vector2.new( graphs.outgoing.pos.x + 1, graphs.outgoing.pos.y + 80 - math.floor(avgbar_h / biggestnum * 80) ) graphs.outgoing.graph[21].To = Vector2.new( graphs.outgoing.pos.x + 220, graphs.outgoing.pos.y + 80 - math.floor(avgbar_h / biggestnum * 80) ) graphs.outgoing.graph[21].Color = avg_color graphs.outgoing.graph[21].Thickness = 2 graphs.outgoing.graph[22].Position = Vector2.new( graphs.outgoing.pos.x + 222, graphs.outgoing.pos.y + 80 - math.floor(avgbar_h / biggestnum * 80) - 8 ) graphs.outgoing.graph[22].Text = "avg: " .. tostring(round(avgbar_h, 2)) graphs.outgoing.graph[22].Color = avg_color graphs.outgoing.sides[1].Text = "outgoing kbps: " .. tostring(round(networkin.outgoing[21], 2)) local drawnobjects = 0 for k, v in pairs(allrender) do drawnobjects += #v end graphs.other[1].Text = string.format( "initiation time: %d ms\ndrawn objects: %d\ntick: %d\nfps: %d\nlatency: %d", menu.load_time, drawnobjects, tick(), CurrentFPS, math.ceil(GetLatency() * 1000) ) lasttick = tick() StatMenuRendered:fire(graphs.other[1]) local logsstr = "[DEBUG LOGS]\n" for i, v in ipairs(reverse_table(NotifLogs)) do logsstr = logsstr.. v.. "\n" if i >= 13 then break end end graphs.other[2].Text = logsstr end end) local function keycheck(actionName, inputState, inputObject) if actionName == "ZM Keycheck" then if menu.open then if menu.textboxopen then if inputObject.KeyCode == Enum.KeyCode.Backspace then if menu.selectall then menu.textboxopen[1] = "" menu.textboxopen[4].Text = "|" menu.textboxopen[4].Color = RGB(unpack(menu.mc)) menu.selectall = false end local on = inputState == Enum.UserInputState.Begin menu.backspaceheld = on menu.backspacetime = on and tick() or -1 if not on then menu.backspaceflags = 0 end end if inputObject.KeyCode ~= Enum.KeyCode.A and (not inputObject.KeyCode.Name:match("^Left") and not inputObject.KeyCode.Name:match("^Right")) and inputObject.KeyCode ~= Enum.KeyCode.Delete then if menu.selectall then menu.textboxopen[4].Color = RGB(unpack(menu.mc)) menu.selectall = false end end if inputObject.KeyCode == Enum.KeyCode.A then if inputState == Enum.UserInputState.Begin and INPUT_SERVICE:IsKeyDown(Enum.KeyCode.LeftControl) then menu.selectall = true local textbox = menu.textboxopen textbox[4].Color = RGB(menu.mc[3], menu.mc[2], menu.mc[1]) end end return Enum.ContextActionResult.Sink end end return Enum.ContextActionResult.Pass end end game:service("ContextActionService"):BindAction("ZM Keycheck", keycheck, false, Enum.UserInputType.Keyboard)