From a113c2d258c9814fa736cb514e6c6aa5f4f02e6a Mon Sep 17 00:00:00 2001 From: Niels Peretzke Date: Sun, 18 Aug 2019 00:34:04 +0200 Subject: [PATCH] initial commit --- .gitignore.txt | 3 + announce.exe | Bin 0 -> 40960 bytes filterscripts/a51_base.amx | Bin 0 -> 6306 bytes filterscripts/a51_base.pwn | 422 +++++ filterscripts/adminspec.amx | Bin 0 -> 2732 bytes filterscripts/adminspec.pwn | 121 ++ filterscripts/attachments.amx | Bin 0 -> 12381 bytes filterscripts/attachments.pwn | 383 ++++ filterscripts/base.amx | Bin 0 -> 3102 bytes filterscripts/base.pwn | 151 ++ filterscripts/baseaf.amx | Bin 0 -> 70142 bytes filterscripts/baseaf.pwn | 234 +++ filterscripts/cargoship.amx | Bin 0 -> 3165 bytes filterscripts/cargoship.pwn | 216 +++ filterscripts/dillimore_gas.amx | Bin 0 -> 2384 bytes filterscripts/dillimore_gas.pwn | 161 ++ filterscripts/ferriswheel.amx | Bin 0 -> 1235 bytes filterscripts/ferriswheel.pwn | 135 ++ filterscripts/flymode.amx | Bin 0 -> 8236 bytes filterscripts/flymode.pwn | 265 +++ filterscripts/fsdebug.amx | Bin 0 -> 76471 bytes filterscripts/fsdebug.pwn | 2108 +++++++++++++++++++++ filterscripts/gl_actions.amx | Bin 0 -> 8582 bytes filterscripts/gl_actions.pwn | 371 ++++ filterscripts/gl_chat.amx | Bin 0 -> 6610 bytes filterscripts/gl_chat.pwn | 293 +++ filterscripts/gl_chatbubble.amx | Bin 0 -> 1239 bytes filterscripts/gl_chatbubble.pwn | 63 + filterscripts/gl_mapicon.amx | Bin 0 -> 2046 bytes filterscripts/gl_mapicon.pwn | 70 + filterscripts/gl_npcs.amx | Bin 0 -> 2912 bytes filterscripts/gl_npcs.pwn | 161 ++ filterscripts/gl_property.amx | Bin 0 -> 103450 bytes filterscripts/gl_property.pwn | 835 ++++++++ filterscripts/gl_realtime.amx | Bin 0 -> 1964 bytes filterscripts/gl_realtime.pwn | 162 ++ filterscripts/http_test.amx | Bin 0 -> 622 bytes filterscripts/http_test.pwn | 39 + filterscripts/iradio.amx | Bin 0 -> 915 bytes filterscripts/iradio.pwn | 59 + filterscripts/kylies_barn.amx | Bin 0 -> 1795 bytes filterscripts/kylies_barn.pwn | 138 ++ filterscripts/ls_apartments1.amx | Bin 0 -> 9106 bytes filterscripts/ls_apartments1.pwn | 770 ++++++++ filterscripts/ls_beachside.amx | Bin 0 -> 8502 bytes filterscripts/ls_beachside.pwn | 743 ++++++++ filterscripts/ls_elevator.amx | Bin 0 -> 6214 bytes filterscripts/ls_elevator.pwn | 509 +++++ filterscripts/ls_mall.amx | Bin 0 -> 7852 bytes filterscripts/ls_mall.pwn | 220 +++ filterscripts/ls_prisonwalls.amx | Bin 0 -> 6210 bytes filterscripts/ls_prisonwalls.pwn | 404 ++++ filterscripts/ls_wellsfargo.amx | Bin 0 -> 1961 bytes filterscripts/ls_wellsfargo.pwn | 139 ++ filterscripts/maxips.amx | Bin 0 -> 780 bytes filterscripts/maxips.pwn | 52 + filterscripts/menutest.amx | Bin 0 -> 829 bytes filterscripts/menutest.pwn | 53 + filterscripts/modular_houses.amx | Bin 0 -> 11945 bytes filterscripts/modular_houses.pwn | 363 ++++ filterscripts/modular_island.amx | Bin 0 -> 4913 bytes filterscripts/modular_island.pwn | 194 ++ filterscripts/netstats.amx | Bin 0 -> 1041 bytes filterscripts/netstats.pwn | 70 + filterscripts/npc_record.amx | Bin 0 -> 1499 bytes filterscripts/npc_record.pwn | 75 + filterscripts/ospawner.amx | Bin 0 -> 59875 bytes filterscripts/ospawner.pwn | 416 ++++ filterscripts/pirateship.amx | Bin 0 -> 2615 bytes filterscripts/pirateship.pwn | 177 ++ filterscripts/pnetstats.amx | Bin 0 -> 1168 bytes filterscripts/pnetstats.pwn | 78 + filterscripts/pnetstats2.amx | Bin 0 -> 1735 bytes filterscripts/pnetstats2.pwn | 99 + filterscripts/safe_animated.amx | Bin 0 -> 2692 bytes filterscripts/safe_animated.pwn | 212 +++ filterscripts/samp_anims.amx | Bin 0 -> 1048 bytes filterscripts/samp_anims.pwn | 65 + filterscripts/sf_building1.amx | Bin 0 -> 2612 bytes filterscripts/sf_building1.pwn | 176 ++ filterscripts/sf_zombotech.amx | Bin 0 -> 7463 bytes filterscripts/sf_zombotech.pwn | 664 +++++++ filterscripts/skinchanger.amx | Bin 0 -> 59238 bytes filterscripts/skinchanger.pwn | 366 ++++ filterscripts/stunt_island.amx | Bin 0 -> 32981 bytes filterscripts/stunt_island.pwn | 1092 +++++++++++ filterscripts/test_cmds.amx | Bin 0 -> 35825 bytes filterscripts/test_cmds.pwn | 1952 +++++++++++++++++++ filterscripts/vspawner.amx | Bin 0 -> 32570 bytes filterscripts/vspawner.pwn | 387 ++++ gamemodes/bare.amx | Bin 0 -> 1455 bytes gamemodes/bare.pwn | 90 + gamemodes/barron.amx | Bin 0 -> 4119 bytes gamemodes/barron.pwn | 264 +++ gamemodes/grandlarc.amx | Bin 0 -> 15907 bytes gamemodes/grandlarc.pwn | 529 ++++++ gamemodes/rivershell.amx | Bin 0 -> 12708 bytes gamemodes/rivershell.pwn | 630 ++++++ gamemodes/timertest.amx | Bin 0 -> 791 bytes gamemodes/timertest.pwn | 36 + include/gl_common.inc | 241 +++ include/gl_messages.inc | 166 ++ include/gl_spawns.inc | 138 ++ include/vehicleutil.inc | 76 + npcmodes/at400_ls.amx | Bin 0 -> 481 bytes npcmodes/at400_ls.pwn | 58 + npcmodes/at400_lv.amx | Bin 0 -> 481 bytes npcmodes/at400_lv.pwn | 58 + npcmodes/at400_sf.amx | Bin 0 -> 481 bytes npcmodes/at400_sf.pwn | 58 + npcmodes/mat_test.amx | Bin 0 -> 312 bytes npcmodes/mat_test.pwn | 41 + npcmodes/npcidle.amx | Bin 0 -> 165 bytes npcmodes/npcidle.pwn | 15 + npcmodes/npctest.amx | Bin 0 -> 2756 bytes npcmodes/npctest.pwn | 166 ++ npcmodes/onfoot_test.amx | Bin 0 -> 308 bytes npcmodes/onfoot_test.pwn | 38 + npcmodes/recordings/animtest1.rec | Bin 0 -> 92168 bytes npcmodes/recordings/animtest2.rec | Bin 0 -> 34208 bytes npcmodes/recordings/at400_ls_to_lv_x1.rec | Bin 0 -> 168647 bytes npcmodes/recordings/at400_lv_to_sf_x1.rec | Bin 0 -> 175079 bytes npcmodes/recordings/at400_sf_to_ls_x1.rec | Bin 0 -> 192030 bytes npcmodes/recordings/shotrun.rec | Bin 0 -> 68480 bytes npcmodes/recordings/train_ls_to_sf1.rec | Bin 0 -> 111161 bytes npcmodes/recordings/train_lv_to_ls1.rec | Bin 0 -> 171729 bytes npcmodes/recordings/train_sf_to_lv1.rec | Bin 0 -> 102384 bytes npcmodes/taxi_ls_test.amx | Bin 0 -> 1146 bytes npcmodes/taxi_ls_test.pwn | 127 ++ npcmodes/train_ls.amx | Bin 0 -> 478 bytes npcmodes/train_ls.pwn | 58 + npcmodes/train_lv.amx | Bin 0 -> 478 bytes npcmodes/train_lv.pwn | 61 + npcmodes/train_sf.amx | Bin 0 -> 478 bytes npcmodes/train_sf.pwn | 58 + pawno/include/a_actor.inc | 34 + pawno/include/a_http.inc | 24 + pawno/include/a_npc.inc | 190 ++ pawno/include/a_objects.inc | 74 + pawno/include/a_players.inc | 273 +++ pawno/include/a_samp.inc | 426 +++++ pawno/include/a_sampdb.inc | 30 + pawno/include/a_vehicles.inc | 88 + pawno/include/core.inc | 34 + pawno/include/datagram.inc | 18 + pawno/include/file.inc | 44 + pawno/include/float.inc | 184 ++ pawno/include/string.inc | 30 + pawno/include/time.inc | 14 + pawno/libpawnc.dll | Bin 0 -> 281600 bytes pawno/new.pwn | 232 +++ pawno/pawn.ico | Bin 0 -> 8478 bytes pawno/pawnc.dll | Bin 0 -> 163840 bytes pawno/pawncc.exe | Bin 0 -> 15360 bytes pawno/pawno.exe | Bin 0 -> 304128 bytes pawno/settings.ini | 17 + samp-license.txt | 92 + samp-npc.exe | Bin 0 -> 282624 bytes samp-server.exe | Bin 0 -> 950272 bytes scriptfiles/properties/banks.txt | 3 + scriptfiles/properties/businesses.txt | 108 ++ scriptfiles/properties/houses.txt | 141 ++ scriptfiles/properties/interiors.txt | 146 ++ scriptfiles/properties/police.txt | 3 + scriptfiles/vehicles/bone.txt | 168 ++ scriptfiles/vehicles/flint.txt | 61 + scriptfiles/vehicles/ls_airport.txt | 37 + scriptfiles/vehicles/ls_gen_inner.txt | 98 + scriptfiles/vehicles/ls_gen_outer.txt | 389 ++++ scriptfiles/vehicles/ls_law.txt | 24 + scriptfiles/vehicles/lv_airport.txt | 39 + scriptfiles/vehicles/lv_gen.txt | 255 +++ scriptfiles/vehicles/lv_law.txt | 15 + scriptfiles/vehicles/pilots.txt | 3 + scriptfiles/vehicles/red_county.txt | 96 + scriptfiles/vehicles/sf_airport.txt | 35 + scriptfiles/vehicles/sf_gen.txt | 353 ++++ scriptfiles/vehicles/sf_law.txt | 38 + scriptfiles/vehicles/sf_train.txt | 2 + scriptfiles/vehicles/tierra.txt | 96 + scriptfiles/vehicles/trains.txt | 3 + scriptfiles/vehicles/trains_platform.txt | 3 + scriptfiles/vehicles/whetstone.txt | 71 + server-readme.txt | 79 + server.cfg | 19 + 185 files changed, 22663 insertions(+) create mode 100644 .gitignore.txt create mode 100644 announce.exe create mode 100644 filterscripts/a51_base.amx create mode 100644 filterscripts/a51_base.pwn create mode 100644 filterscripts/adminspec.amx create mode 100644 filterscripts/adminspec.pwn create mode 100644 filterscripts/attachments.amx create mode 100644 filterscripts/attachments.pwn create mode 100644 filterscripts/base.amx create mode 100644 filterscripts/base.pwn create mode 100644 filterscripts/baseaf.amx create mode 100644 filterscripts/baseaf.pwn create mode 100644 filterscripts/cargoship.amx create mode 100644 filterscripts/cargoship.pwn create mode 100644 filterscripts/dillimore_gas.amx create mode 100644 filterscripts/dillimore_gas.pwn create mode 100644 filterscripts/ferriswheel.amx create mode 100644 filterscripts/ferriswheel.pwn create mode 100644 filterscripts/flymode.amx create mode 100644 filterscripts/flymode.pwn create mode 100644 filterscripts/fsdebug.amx create mode 100644 filterscripts/fsdebug.pwn create mode 100644 filterscripts/gl_actions.amx create mode 100644 filterscripts/gl_actions.pwn create mode 100644 filterscripts/gl_chat.amx create mode 100644 filterscripts/gl_chat.pwn create mode 100644 filterscripts/gl_chatbubble.amx create mode 100644 filterscripts/gl_chatbubble.pwn create mode 100644 filterscripts/gl_mapicon.amx create mode 100644 filterscripts/gl_mapicon.pwn create mode 100644 filterscripts/gl_npcs.amx create mode 100644 filterscripts/gl_npcs.pwn create mode 100644 filterscripts/gl_property.amx create mode 100644 filterscripts/gl_property.pwn create mode 100644 filterscripts/gl_realtime.amx create mode 100644 filterscripts/gl_realtime.pwn create mode 100644 filterscripts/http_test.amx create mode 100644 filterscripts/http_test.pwn create mode 100644 filterscripts/iradio.amx create mode 100644 filterscripts/iradio.pwn create mode 100644 filterscripts/kylies_barn.amx create mode 100644 filterscripts/kylies_barn.pwn create mode 100644 filterscripts/ls_apartments1.amx create mode 100644 filterscripts/ls_apartments1.pwn create mode 100644 filterscripts/ls_beachside.amx create mode 100644 filterscripts/ls_beachside.pwn create mode 100644 filterscripts/ls_elevator.amx create mode 100644 filterscripts/ls_elevator.pwn create mode 100644 filterscripts/ls_mall.amx create mode 100644 filterscripts/ls_mall.pwn create mode 100644 filterscripts/ls_prisonwalls.amx create mode 100644 filterscripts/ls_prisonwalls.pwn create mode 100644 filterscripts/ls_wellsfargo.amx create mode 100644 filterscripts/ls_wellsfargo.pwn create mode 100644 filterscripts/maxips.amx create mode 100644 filterscripts/maxips.pwn create mode 100644 filterscripts/menutest.amx create mode 100644 filterscripts/menutest.pwn create mode 100644 filterscripts/modular_houses.amx create mode 100644 filterscripts/modular_houses.pwn create mode 100644 filterscripts/modular_island.amx create mode 100644 filterscripts/modular_island.pwn create mode 100644 filterscripts/netstats.amx create mode 100644 filterscripts/netstats.pwn create mode 100644 filterscripts/npc_record.amx create mode 100644 filterscripts/npc_record.pwn create mode 100644 filterscripts/ospawner.amx create mode 100644 filterscripts/ospawner.pwn create mode 100644 filterscripts/pirateship.amx create mode 100644 filterscripts/pirateship.pwn create mode 100644 filterscripts/pnetstats.amx create mode 100644 filterscripts/pnetstats.pwn create mode 100644 filterscripts/pnetstats2.amx create mode 100644 filterscripts/pnetstats2.pwn create mode 100644 filterscripts/safe_animated.amx create mode 100644 filterscripts/safe_animated.pwn create mode 100644 filterscripts/samp_anims.amx create mode 100644 filterscripts/samp_anims.pwn create mode 100644 filterscripts/sf_building1.amx create mode 100644 filterscripts/sf_building1.pwn create mode 100644 filterscripts/sf_zombotech.amx create mode 100644 filterscripts/sf_zombotech.pwn create mode 100644 filterscripts/skinchanger.amx create mode 100644 filterscripts/skinchanger.pwn create mode 100644 filterscripts/stunt_island.amx create mode 100644 filterscripts/stunt_island.pwn create mode 100644 filterscripts/test_cmds.amx create mode 100644 filterscripts/test_cmds.pwn create mode 100644 filterscripts/vspawner.amx create mode 100644 filterscripts/vspawner.pwn create mode 100644 gamemodes/bare.amx create mode 100644 gamemodes/bare.pwn create mode 100644 gamemodes/barron.amx create mode 100644 gamemodes/barron.pwn create mode 100644 gamemodes/grandlarc.amx create mode 100644 gamemodes/grandlarc.pwn create mode 100644 gamemodes/rivershell.amx create mode 100644 gamemodes/rivershell.pwn create mode 100644 gamemodes/timertest.amx create mode 100644 gamemodes/timertest.pwn create mode 100644 include/gl_common.inc create mode 100644 include/gl_messages.inc create mode 100644 include/gl_spawns.inc create mode 100644 include/vehicleutil.inc create mode 100644 npcmodes/at400_ls.amx create mode 100644 npcmodes/at400_ls.pwn create mode 100644 npcmodes/at400_lv.amx create mode 100644 npcmodes/at400_lv.pwn create mode 100644 npcmodes/at400_sf.amx create mode 100644 npcmodes/at400_sf.pwn create mode 100644 npcmodes/mat_test.amx create mode 100644 npcmodes/mat_test.pwn create mode 100644 npcmodes/npcidle.amx create mode 100644 npcmodes/npcidle.pwn create mode 100644 npcmodes/npctest.amx create mode 100644 npcmodes/npctest.pwn create mode 100644 npcmodes/onfoot_test.amx create mode 100644 npcmodes/onfoot_test.pwn create mode 100644 npcmodes/recordings/animtest1.rec create mode 100644 npcmodes/recordings/animtest2.rec create mode 100644 npcmodes/recordings/at400_ls_to_lv_x1.rec create mode 100644 npcmodes/recordings/at400_lv_to_sf_x1.rec create mode 100644 npcmodes/recordings/at400_sf_to_ls_x1.rec create mode 100644 npcmodes/recordings/shotrun.rec create mode 100644 npcmodes/recordings/train_ls_to_sf1.rec create mode 100644 npcmodes/recordings/train_lv_to_ls1.rec create mode 100644 npcmodes/recordings/train_sf_to_lv1.rec create mode 100644 npcmodes/taxi_ls_test.amx create mode 100644 npcmodes/taxi_ls_test.pwn create mode 100644 npcmodes/train_ls.amx create mode 100644 npcmodes/train_ls.pwn create mode 100644 npcmodes/train_lv.amx create mode 100644 npcmodes/train_lv.pwn create mode 100644 npcmodes/train_sf.amx create mode 100644 npcmodes/train_sf.pwn create mode 100644 pawno/include/a_actor.inc create mode 100644 pawno/include/a_http.inc create mode 100644 pawno/include/a_npc.inc create mode 100644 pawno/include/a_objects.inc create mode 100644 pawno/include/a_players.inc create mode 100644 pawno/include/a_samp.inc create mode 100644 pawno/include/a_sampdb.inc create mode 100644 pawno/include/a_vehicles.inc create mode 100644 pawno/include/core.inc create mode 100644 pawno/include/datagram.inc create mode 100644 pawno/include/file.inc create mode 100644 pawno/include/float.inc create mode 100644 pawno/include/string.inc create mode 100644 pawno/include/time.inc create mode 100644 pawno/libpawnc.dll create mode 100644 pawno/new.pwn create mode 100644 pawno/pawn.ico create mode 100644 pawno/pawnc.dll create mode 100644 pawno/pawncc.exe create mode 100644 pawno/pawno.exe create mode 100644 pawno/settings.ini create mode 100644 samp-license.txt create mode 100644 samp-npc.exe create mode 100644 samp-server.exe create mode 100644 scriptfiles/properties/banks.txt create mode 100644 scriptfiles/properties/businesses.txt create mode 100644 scriptfiles/properties/houses.txt create mode 100644 scriptfiles/properties/interiors.txt create mode 100644 scriptfiles/properties/police.txt create mode 100644 scriptfiles/vehicles/bone.txt create mode 100644 scriptfiles/vehicles/flint.txt create mode 100644 scriptfiles/vehicles/ls_airport.txt create mode 100644 scriptfiles/vehicles/ls_gen_inner.txt create mode 100644 scriptfiles/vehicles/ls_gen_outer.txt create mode 100644 scriptfiles/vehicles/ls_law.txt create mode 100644 scriptfiles/vehicles/lv_airport.txt create mode 100644 scriptfiles/vehicles/lv_gen.txt create mode 100644 scriptfiles/vehicles/lv_law.txt create mode 100644 scriptfiles/vehicles/pilots.txt create mode 100644 scriptfiles/vehicles/red_county.txt create mode 100644 scriptfiles/vehicles/sf_airport.txt create mode 100644 scriptfiles/vehicles/sf_gen.txt create mode 100644 scriptfiles/vehicles/sf_law.txt create mode 100644 scriptfiles/vehicles/sf_train.txt create mode 100644 scriptfiles/vehicles/tierra.txt create mode 100644 scriptfiles/vehicles/trains.txt create mode 100644 scriptfiles/vehicles/trains_platform.txt create mode 100644 scriptfiles/vehicles/whetstone.txt create mode 100644 server-readme.txt create mode 100644 server.cfg diff --git a/.gitignore.txt b/.gitignore.txt new file mode 100644 index 0000000..3e87dc4 --- /dev/null +++ b/.gitignore.txt @@ -0,0 +1,3 @@ +*.exe +samp-license.txt +server-readme.txt \ No newline at end of file diff --git a/announce.exe b/announce.exe new file mode 100644 index 0000000000000000000000000000000000000000..22db845e0f9e624be6a41d1f5aa37b1e3ebe16b2 GIT binary patch literal 40960 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 literal 0 HcmV?d00001 diff --git a/filterscripts/a51_base.amx b/filterscripts/a51_base.amx new file mode 100644 index 0000000000000000000000000000000000000000..327d6dd35750eeb68c340b00fde1b08e4a37078c GIT binary patch literal 6306 zcmd5^jn*bv5>}O#ha2A{-kj@T zyIrEB)ps+mT}85WjFRTjDQj0*V{N)pN)e1l5gxY>jr&s4P!d!$Vc#iHsCpiXWq-$ENE{HW8VPfpX-wTR?@d5U6RxREdE(9 zsUqpeC4ErRhb8TkG$QF?NsmbSjHGjtUXk>=q`#K*_maLT>5`;t5fA>UlGGzah!^s^Zkz@g@-4LwKgOBQc$vv^ddKdy-(a@+K55|Uu zLPoe(AK^+Fo?$>RJAX(Y?Ma4`dT=mg4Ct&qktYVQ45!`b<`SL#U9pIfWR@8J?TH;S z!Yq-D_YDoR9zAKTv>Pxw5{uiMu2_QgM`NL+&1wtvMT~*%#z0i(%wT9pkB3_H!H5yI zP}okexczOhxa17S`S!uM4x=rnS$`}(1Xzm~Xyx*|LkIO}*7lCBAnVqL5S*4nk!Tou z+Ia1WM?%p^SVFbxa3nS=XJW5@)~ZMKq@D}hqZ{F1G@={HJ$fP$Lg0AhrB)(@K(tw& zCSmOWLke{^EOL@yF_Ec+lwgcT*cP)=WdY5sBxAf{+ARkSDmGDCs)A` zOqb?@K!rNpteUNsP9@i=b~L~lYxfC1m#h+!6Akt_B@itBlf5?oSe-pS&g?N$#e~~Y zbd;L>*$)%&;l@9Asj1mBuXt4Yqoyh}R;|^oqa^Hn>cA?{rYC+RWQOzgIQC zKAb@_d00+}>c{J0 z+27w9D~2OtRGvKoXKv>D(PB7mZcl1{o{D>yn*7!|SdqSVwi$Kvo#S3$1Pgugl;hL0 zC)$8BM=ij)aaAdX<9$C{X8(L2FkZU86By}VGGOc|w8dABEpw9}s+LOdBQf|#w^4Cqh3k7`Ii{W_|B{s-8g z7^wQ(m+UB>$~p2ZFptwk#?A4Hn^r4a7)HCfneByVymE54=Az!FGhVd8Gd{Gzg+T-* zHTR})Y*{aO_aUz4qp@`w4_+xb)9hGD?mzXsw_I?l^j@$mIn#WsnB3G~esmXNbn15@ zSn}LympZkfs90eWqIbSv%LV3Lnv*wM?HJ>Y-cLy$Qx7hTv$#y;^d8Z9r$sZcy6tJZ z5Bg1SM&%rC967aAW}Vp#`AuI&>_ucpPA#!HyQllj+KkwFTnut*iOt*X5_jEsKhH70 z?Czv(X+XMZq+*;#@3>c#0(T*eTPB|?fFQNkvDsO(QGLFZUtk~7+?&S(=W9hIOr=uj zujf8jn+i%ZhoLUGvL2}~jM(FI_DNFD+wR~N5S}sirgBhf}r}hewSxjycb?}=Q?e_OBQ`wdg7g# z*Kq6RUYygfEqZys$qlOCa$4YjlUGhQX{*QQ7jqsyg6bC~=K3^sP>kY~q(Ra_4TW}6 z2veQW4h#}}n9mpg@a&&YQmCns(NQ{x=O|!~(sn556jGWR75~;x)hpB@kn|0#iYW?> zZ(jW;qo))DKSU9VQW(Dm4JgzJQyzr@eXu>DP@7n_+(>{K$9$NQ5)t)ZU;C=3sG^(k`&`64)dt-L7aOS#UQ~WD2{?c16JHw zq5l83wbt>%@3J!}bAw<8s8vCnbo?1hD#R=AASTh}iTZ$N^|l|6FwEu+Dvs2RVtgw{ zWHlJ2T4i3nD`-UJn^nBWegMFgj_ae7(YMqyp%4u+t4oM zg;H*>SLn0okNkv(g!`F7S#5=GW}EnR!7t1>jcN+2E=GqG8bbd>Au9AZHi+;+KNrfz zhWE~#n^d+IzKllH59KJnqd7gPA1HCIvgJ1KnA7)i_C(jTZ}U + +// For PlaySoundForPlayersInRange() +#include "../include/gl_common.inc" + + +// ----------------------------------------------------------------------------- +// Defines +// ------- + +// Used for messages sent to the player +#define COLOR_MESSAGE_YELLOW 0xFFDD00AA + +// Used for the northern and eastern A51 (69) gates status flags +#define GATES_CLOSED 0 +#define GATES_CLOSING 1 +#define GATES_OPEN 2 +#define GATES_OPENING 3 + + +// ----------------------------------------------------------------------------- +// Constants +// --------- + +// Gate names for the 3D text labels +static GateNames[2][] = +{ + "Northern Gate", + "Eastern Gate" +}; + +// ----------------------------------------------------------------------------- +// Variables +// --------- + +// Stores the created object numbers of the replacement Area 51 (69) land object, +// buildings and fence so they can be destroyed when the filterscript is unloaded +new A51LandObject; // Land object +new A51Buildings[7]; // Building object +new A51Fence; // Fence +new A51NorthernGate; // Northern Gate +new A51EasternGate; // Eastern Gate + +// Stores a reference to the 3D text labels used on each set of gates so they +// can be destroyed when the filterscript is unloaded +new Text3D:LabelGates[2]; + +// Stores the current status of the northern gate +new NorthernGateStatus = GATES_CLOSED; + +// Stores the current status of the eastern gate +new EasternGateStatus = GATES_CLOSED; + + +// ----------------------------------------------------------------------------- +// Callbacks +// --------- + +public OnPlayerCommandText(playerid, cmdtext[]) +{ + // Check command text + if (strcmp("/a51", cmdtext, true, 4) == 0) + { + // Set the interior (outside) + SetPlayerInterior(playerid, 0); + + // Set player position and facing angle (outside the northern gate) + SetPlayerPos(playerid, 135.20, 1948.51, 19.74); + SetPlayerFacingAngle(playerid, 180); + + // Fix camera position after teleporting + SetCameraBehindPlayer(playerid); + + // Send a gametext message to the player + GameTextForPlayer(playerid, "~b~~h~Area 51 (69) Base!", 3000, 3); + + // Exit here + return 1; + } + + // Exit here (return 0 as the command was not handled in this filterscript) + return 0; +} + +public OnFilterScriptInit() +{ + // Display information in the Server Console + print("\n"); + print(" |---------------------------------------------------"); + print(" |--- Area 51 (69) Building Objects Filterscript"); + print(" |-- Script v1.01"); + print(" |-- 28th March 2015"); + print(" |---------------------------------------------------"); + + // Create the A51 Land object + A51LandObject = CreateObject(11692, 199.344, 1943.79, 18.2031, 0, 0, 0); + + // Display information in the Server Console + print(" |-- Area 51 (69) Land object created"); + + // Create the A51 Fence object + A51Fence = CreateObject(19312, 191.141, 1870.04, 21.4766, 0, 0, 0); + + // Display information in the Server Console + print(" |-- Area 51 (69) Fence object created"); + + // Create the A51 Building objects + A51Buildings[0] = CreateObject(19905, 206.798950, 1931.643432, 16.450595, 0, 0, 0); + A51Buildings[1] = CreateObject(19905, 188.208908, 1835.033569, 16.450595, 0, 0, 0); + A51Buildings[2] = CreateObject(19905, 230.378875, 1835.033569, 16.450595, 0, 0, 0); + A51Buildings[3] = CreateObject(19907, 142.013977, 1902.538085, 17.633581, 0, 0, 270.0); + A51Buildings[4] = CreateObject(19907, 146.854003, 1846.008056, 16.533580, 0, 0, 0); + A51Buildings[5] = CreateObject(19909, 137.900390, 1875.024291, 16.836734, 0, 0, 270.0); + A51Buildings[6] = CreateObject(19909, 118.170387, 1875.184326, 16.846735, 0, 0, 0); + + + // Display information in the Server Console + print(" |-- Area 51 (69) Building objects created"); + + // Create the Northern gate object + A51NorthernGate = CreateObject(19313, 134.545074, 1941.527709, 21.691408, 0, 0, 180.0); + + // Create the Eastern gate object + A51EasternGate = CreateObject(19313, 286.008666, 1822.744628, 20.010623, 0, 0, 90.0); + + // Display information in the Server Console + print(" |-- Area 51 (69) Gate objects created"); + + // Create variable + new string[192]; + + // Create 3D Text Label at the prisons eastern gates + format(string, sizeof(string), "{CCCCCC}[%s]\n{CCCCCC}Press '{FFFFFF}~k~~CONVERSATION_YES~{CCCCCC}' to open or close the gate", GateNames[0]); + LabelGates[0] = Create3DTextLabel(string, 0xCCCCCCAA, 135.09, 1942.37, 19.82, 10.5, 0, 0); + + // Create 3D Text Label at the prisons eastern gates + format(string, sizeof(string), "{CCCCCC}[%s]\n{CCCCCC}Press '{FFFFFF}~k~~CONVERSATION_YES~{CCCCCC}' to open or close the gate", GateNames[1]); + LabelGates[1] = Create3DTextLabel(string, 0xCCCCCCAA, 287.12, 1821.51, 18.14, 10.5, 0, 0); + + // Display information in the Server Console + print(" |-- Area 51 (69) Gates 3D Text Labels created"); + print(" |---------------------------------------------------"); + + // Loop + for (new i = 0; i < MAX_PLAYERS; i++) + { + // Check if the player is connected and not a NPC + if (IsPlayerConnected(i) && !IsPlayerNPC(i)) + { + // Remove default GTASA Area 51 (69) land and buildings for the player + // (so any player currently ingame does not have to rejoin for them to + // be removed when this filterscript is loaded) + RemoveBuildingForPlayer(i, 16203, 199.344, 1943.79, 18.2031, 250.0); // Land + RemoveBuildingForPlayer(i, 16590, 199.344, 1943.79, 18.2031, 250.0); // Land LOD + RemoveBuildingForPlayer(i, 16323, 199.336, 1943.88, 18.2031, 250.0); // Buildings + RemoveBuildingForPlayer(i, 16619, 199.336, 1943.88, 18.2031, 250.0); // Buildings LOD + RemoveBuildingForPlayer(i, 1697, 228.797, 1835.34, 23.2344, 250.0); // Solar Panels (they poke through the roof inside) + RemoveBuildingForPlayer(i, 16094, 191.141, 1870.04, 21.4766, 250.0); // Outer Fence + } + } + + // Exit here + return 1; +} + +public OnFilterScriptExit() +{ + // Check for valid object + if (IsValidObject(A51LandObject)) + { + // Destroy the A51 land object + DestroyObject(A51LandObject); + + // Display information in the Server Console + print(" |---------------------------------------------------"); + print(" |-- Area 51 (69) Land object destroyed"); + } + + // Check for valid object + if (IsValidObject(A51Fence)) + { + // Destroy the A51 fence object + DestroyObject(A51Fence); + + // Display information in the Server Console + print(" |-- Area 51 (69) Fence object destroyed"); + } + + // Check for valid object + if (IsValidObject(A51NorthernGate)) + { + // Destroy the A51 northern gate object + DestroyObject(A51NorthernGate); + + // Display information in the Server Console + print(" |-- Area 51 (69) Northern Gate object destroyed"); + } + + // Check for valid object + if (IsValidObject(A51EasternGate)) + { + // Destroy the A51 eastern gate object + DestroyObject(A51EasternGate); + + // Display information in the Server Console + print(" |-- Area 51 (69) Eastern Gate object destroyed"); + } + + // Loop + for (new i = 0; i < sizeof(A51Buildings); i++) + { + // Check for valid object + if (IsValidObject(A51Buildings[i])) + { + // Destroy the A51 building object + DestroyObject(A51Buildings[i]); + + // Display information in the Server Console + printf(" |-- Area 51 (69) Building object %d destroyed", i + 1); + } + } + + // Destroy 3D Text Labels on the northern and eastern gates + Delete3DTextLabel(LabelGates[0]); + Delete3DTextLabel(LabelGates[1]); + + // Display information in the Server Console + print(" |-- Deleted the 3D Text Labels on the Area 51 (69) Gates"); + + // Display information in the Server Console + print(" |---------------------------------------------------"); + print(" |-- Area 51 (69) Base Objects Filterscript Unloaded"); + print(" |---------------------------------------------------"); + + // Exit here + return 1; +} + +public OnPlayerConnect(playerid) +{ + // Remove default GTASA Area 51 (69) land and buildings for the player + RemoveBuildingForPlayer(playerid, 16203, 199.344, 1943.79, 18.2031, 250.0); // Land + RemoveBuildingForPlayer(playerid, 16590, 199.344, 1943.79, 18.2031, 250.0); // Land LOD + RemoveBuildingForPlayer(playerid, 16323, 199.336, 1943.88, 18.2031, 250.0); // Buildings + RemoveBuildingForPlayer(playerid, 16619, 199.336, 1943.88, 18.2031, 250.0); // Buildings LOD + RemoveBuildingForPlayer(playerid, 1697, 228.797, 1835.34, 23.2344, 250.0); // Solar Panels (they poke through the roof inside) + RemoveBuildingForPlayer(playerid, 16094, 191.141, 1870.04, 21.4766, 250.0); // Outer Fence + + // Exit here (return 1 so this callback is handled in other scripts too) + return 1; +} + +public OnObjectMoved(objectid) +{ + // Check if the object that moved was the northern gate + if (objectid == A51NorthernGate) + { + // Check if the northern gate was closing + if (NorthernGateStatus == GATES_CLOSING) + { + // Set status flag for northern gates + NorthernGateStatus = GATES_CLOSED; + } + else + { + // Set status flag for northern gates + NorthernGateStatus = GATES_OPEN; + } + } + // Check if the object that moved was the eastern gate + else if (objectid == A51EasternGate) + { + // Check if the eastern gate was closing + if (EasternGateStatus == GATES_CLOSING) + { + // Set status flag for eastern gate + EasternGateStatus = GATES_CLOSED; + } + else + { + // Set status flag for eastern gate + EasternGateStatus = GATES_OPEN; + } + } + + // Exit here + return 1; +} + +public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) +{ + // Check if the player pressed the conversation yes key (normally the Y key) + if (newkeys & KEY_YES) + { + // Check if the player is near the eastern A51 gate + if (IsPlayerInRangeOfPoint(playerid, 10.0, 287.12, 1821.51, 18.14)) + { + // Debug + //printf("-->Player ID %d within 10m of the Eastern A51 Gate", playerid); + + // Check if the eastern gate is currently opening (ie moving) + if (EasternGateStatus == GATES_OPENING) + { + // Send chat text message and exit here + SendClientMessage(playerid, COLOR_MESSAGE_YELLOW, "* Sorry, you must wait for the eastern gate to fully open first."); + return 1; + } + // Check if the eastern gate is currently closing (ie moving) + else if (EasternGateStatus == GATES_CLOSING) + { + // Send chat text message and exit here + SendClientMessage(playerid, COLOR_MESSAGE_YELLOW, "* Sorry, you must wait for the eastern gate to fully close first."); + return 1; + } + + // Play gate opening sound + PlaySoundForPlayersInRange(1035, 50.0, 287.12, 1821.51, 18.14); + + // Check if the eastern gate is currently closed + if (EasternGateStatus == GATES_CLOSED) + { + // Send a gametext message to the player + GameTextForPlayer(playerid, "~b~~h~Eastern Gate Opening!", 3000, 3); + + // Animate the eastern gate opening + MoveObject(A51EasternGate, 286.008666, 1833.744628, 20.010623, 1.1, 0, 0, 90); + + // Set status flag for eastern gate + EasternGateStatus = GATES_OPENING; + } + else + { + // Send a gametext message to the player + GameTextForPlayer(playerid, "~b~~h~Eastern Gate Closing!", 3000, 3); + + // Animate the eastern gates closing + MoveObject(A51EasternGate, 286.008666, 1822.744628, 20.010623, 1.1, 0, 0, 90); + + // Set status flag for eastern gate + EasternGateStatus = GATES_CLOSING; + } + } + // Check if the player is near the northern A51 gate + else if (IsPlayerInRangeOfPoint(playerid, 10.0, 135.09, 1942.37, 19.82)) + { + // Debug + //printf("-->Player ID %d within 10m of the Northern A51 Gate", playerid); + + // Check if the northern gate is currently opening (ie moving) + if (NorthernGateStatus == GATES_OPENING) + { + // Send chat text message and exit here + SendClientMessage(playerid, COLOR_MESSAGE_YELLOW, "* Sorry, you must wait for the northern gate to fully open first."); + return 1; + } + // Check if the northern gates is currently closing (ie moving) + else if (NorthernGateStatus == GATES_CLOSING) + { + // Send chat text message and exit here + SendClientMessage(playerid, COLOR_MESSAGE_YELLOW, "* Sorry, you must wait for the northern gate to fully close first."); + return 1; + } + + // Play gate opening sound + PlaySoundForPlayersInRange(1035, 50.0, 135.09, 1942.37, 19.82); + + // Check if the northern gate is currently closed + if (NorthernGateStatus == GATES_CLOSED) + { + // Send a gametext message to the player + GameTextForPlayer(playerid, "~b~~h~Northern Gate Opening!", 3000, 3); + + // Animate the northern gates opening + MoveObject(A51NorthernGate, 121.545074, 1941.527709, 21.691408, 1.3, 0, 0, 180); + + // Set status flag for northern gates + NorthernGateStatus = GATES_OPENING; + } + else + { + // Send a gametext message to the player + GameTextForPlayer(playerid, "~b~~h~Northern Gate Closing!", 3000, 3); + + // Animate the northern gates closing + MoveObject(A51NorthernGate, 134.545074, 1941.527709, 21.691408, 1.3, 0, 0, 180); + + // Set status flag for northern gates + NorthernGateStatus = GATES_CLOSING; + } + } + } + + // Exit here (return 1 so this callback is handled in other scripts too) + return 1; +} + diff --git a/filterscripts/adminspec.amx b/filterscripts/adminspec.amx new file mode 100644 index 0000000000000000000000000000000000000000..5e8a1fff66eb79b1a36708bdb3e0aba5855e81e6 GIT binary patch literal 2732 zcmeHHL2nyX5FTe8vRiMEs~RDc2v(8NHpw;wMS;)*xC*q51ga$mR0mqIvbV{K&Dydb zt)p1VECx9sP!THU6u9=lf#1NXm) z(cQ`kS9p}`nZ5YKkaNXNKa@O$%`)7=;&R}7p?J%yR^4ub>ux}+rS3T4W_+3sIW$i_v@10SElSQ^}bHeq9obB~R9X?Rm~W z**?uTINRrGO!j$RZA^l^#+S@foM}vgvtfbrBxEoqYo)uW5DO zYE++@(#)l%W!}sxoBbG$QE5|l-@FW#Bw}^m)*Lf3IIJ&xl5yhQgw6p$0es!qMQWSm z2LT;<<4Co-_$h48JG43xQwAf^J{5Kf8DL(aaISb_|=4M3<7lXvvX621900OeY*Y-Sz4Ux2Bm= z@QEp{Rmc5F#nnb42D?|+p$^}?Kd8ek%)x)w;VXGL-=_Xu2Mo2=s-ZN_+=_QP8*a1K zZ8IU;!~`8SRQp>)BS$s#U23qQuc5h312Xpc5{>rGFkxrnp-^Xxy5l7Oe~+JI1&$T? ze=G0;SGmj{7w{dh%UgJ_5WmeiKF1gMjkDH~9u~hl7{ERk`3fDyb=G3R8( +#include +#include + +#include "../include/gl_common.inc" + +#define COLOR_GREY 0xAFAFAFAA +#define COLOR_GREEN 0x33AA33AA +#define COLOR_RED 0xAA3333AA +#define COLOR_YELLOW 0xFFFF00AA +#define COLOR_WHITE 0xFFFFFFFF + +//------------------------------------------------------------------------------------------------------ + +#define ADMIN_SPEC_TYPE_NONE 0 +#define ADMIN_SPEC_TYPE_PLAYER 1 +#define ADMIN_SPEC_TYPE_VEHICLE 2 + +new gSpectateID[MAX_PLAYERS]; +new gSpectateType[MAX_PLAYERS]; + +//------------------------------------------------------------------------------------------------------ + +public OnFilterScriptInit() +{ +} + +//------------------------------------------------------------------------------------------------------ + +public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid) +{ + // IF ANYONE IS SPECTATING THIS PLAYER, WE'LL ALSO HAVE + // TO CHANGE THEIR INTERIOR ID TO MATCH + new x = 0; + while(x!=MAX_PLAYERS) { + if( IsPlayerConnected(x) && GetPlayerState(x) == PLAYER_STATE_SPECTATING && + gSpectateID[x] == playerid && gSpectateType[x] == ADMIN_SPEC_TYPE_PLAYER ) + { + SetPlayerInterior(x,newinteriorid); + } + x++; + } +} + +//------------------------------------------------------------------------------------------------------ + +public OnPlayerCommandText(playerid, cmdtext[]) +{ + new cmd[256]; + new specplayerid, specvehicleid, idx; + + // WE ONLY DEAL WITH COMMANDS FROM ADMINS IN THIS FILTERSCRIPT + if(!IsPlayerAdmin(playerid)) return 0; + + cmd = strtok(cmdtext, idx); + + // SPECTATE A PLAYER + if(strcmp(cmd, "/specplayer", true) == 0) { + new tmp[256]; + tmp = strtok(cmdtext, idx); + + if(!strlen(tmp)) { + SendClientMessage(playerid, COLOR_WHITE, "USAGE: /specplayer [playerid]"); + return 1; + } + specplayerid = strval(tmp); + + if(!IsPlayerConnected(specplayerid)) { + SendClientMessage(playerid, COLOR_RED, "specplayer: that player isn't active."); + return 1; + } + + TogglePlayerSpectating(playerid, 1); + PlayerSpectatePlayer(playerid, specplayerid); + SetPlayerInterior(playerid,GetPlayerInterior(specplayerid)); + gSpectateID[playerid] = specplayerid; + gSpectateType[playerid] = ADMIN_SPEC_TYPE_PLAYER; + + return 1; + } + + // SPECTATE A VEHICLE + if(strcmp(cmd, "/specvehicle", true) == 0) { + new tmp[256]; + tmp = strtok(cmdtext, idx); + + if(!strlen(tmp)) { + SendClientMessage(playerid, COLOR_WHITE, "USAGE: /specvehicle [vehicleid]"); + return 1; + } + specvehicleid = strval(tmp); + + if(specvehicleid < MAX_VEHICLES) { + TogglePlayerSpectating(playerid, 1); + PlayerSpectateVehicle(playerid, specvehicleid); + gSpectateID[playerid] = specvehicleid; + gSpectateType[playerid] = ADMIN_SPEC_TYPE_VEHICLE; + } + return 1; + } + + // STOP SPECTATING + if(strcmp(cmd, "/specoff", true) == 0) { + TogglePlayerSpectating(playerid, 0); + gSpectateID[playerid] = INVALID_PLAYER_ID; + gSpectateType[playerid] = ADMIN_SPEC_TYPE_NONE; + return 1; + } + + return 0; +} + +//------------------------------------------------------------------------------------------------------ + + diff --git a/filterscripts/attachments.amx b/filterscripts/attachments.amx new file mode 100644 index 0000000000000000000000000000000000000000..7ec3cf0a4a0a8cea2cb2387a57d241425a9a29d0 GIT binary patch literal 12381 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 YLM_#CKph^G@uJ6v#{vcAYra_j1FC8-i~s-t literal 0 HcmV?d00001 diff --git a/filterscripts/attachments.pwn b/filterscripts/attachments.pwn new file mode 100644 index 0000000..cfc85e4 --- /dev/null +++ b/filterscripts/attachments.pwn @@ -0,0 +1,383 @@ +//------------------------------------------------- +// +// This is an example of using the EditAttachedObject functions +// to allow the player to customize their character. +// +// h02 2012 +// +// SA-MP 0.3e and above +// +//------------------------------------------------- + +#include + +#define DIALOG_ATTACH_INDEX 13500 +#define DIALOG_ATTACH_INDEX_SELECTION DIALOG_ATTACH_INDEX+1 +#define DIALOG_ATTACH_EDITREPLACE DIALOG_ATTACH_INDEX+2 +#define DIALOG_ATTACH_MODEL_SELECTION DIALOG_ATTACH_INDEX+3 +#define DIALOG_ATTACH_BONE_SELECTION DIALOG_ATTACH_INDEX+4 + +enum AttachmentEnum +{ + attachmodel, + attachname[24] +} + +new AttachmentObjects[][AttachmentEnum] = { +{18632, "FishingRod"}, +{18633, "GTASAWrench1"}, +{18634, "GTASACrowbar1"}, +{18635, "GTASAHammer1"}, +{18636, "PoliceCap1"}, +{18637, "PoliceShield1"}, +{18638, "HardHat1"}, +{18639, "BlackHat1"}, +{18640, "Hair1"}, +{18975, "Hair2"}, +{19136, "Hair4"}, +{19274, "Hair5"}, +{18641, "Flashlight1"}, +{18642, "Taser1"}, +{18643, "LaserPointer1"}, +{19080, "LaserPointer2"}, +{19081, "LaserPointer3"}, +{19082, "LaserPointer4"}, +{19083, "LaserPointer5"}, +{19084, "LaserPointer6"}, +{18644, "Screwdriver1"}, +{18645, "MotorcycleHelmet1"}, +{18865, "MobilePhone1"}, +{18866, "MobilePhone2"}, +{18867, "MobilePhone3"}, +{18868, "MobilePhone4"}, +{18869, "MobilePhone5"}, +{18870, "MobilePhone6"}, +{18871, "MobilePhone7"}, +{18872, "MobilePhone8"}, +{18873, "MobilePhone9"}, +{18874, "MobilePhone10"}, +{18875, "Pager1"}, +{18890, "Rake1"}, +{18891, "Bandana1"}, +{18892, "Bandana2"}, +{18893, "Bandana3"}, +{18894, "Bandana4"}, +{18895, "Bandana5"}, +{18896, "Bandana6"}, +{18897, "Bandana7"}, +{18898, "Bandana8"}, +{18899, "Bandana9"}, +{18900, "Bandana10"}, +{18901, "Bandana11"}, +{18902, "Bandana12"}, +{18903, "Bandana13"}, +{18904, "Bandana14"}, +{18905, "Bandana15"}, +{18906, "Bandana16"}, +{18907, "Bandana17"}, +{18908, "Bandana18"}, +{18909, "Bandana19"}, +{18910, "Bandana20"}, +{18911, "Mask1"}, +{18912, "Mask2"}, +{18913, "Mask3"}, +{18914, "Mask4"}, +{18915, "Mask5"}, +{18916, "Mask6"}, +{18917, "Mask7"}, +{18918, "Mask8"}, +{18919, "Mask9"}, +{18920, "Mask10"}, +{18921, "Beret1"}, +{18922, "Beret2"}, +{18923, "Beret3"}, +{18924, "Beret4"}, +{18925, "Beret5"}, +{18926, "Hat1"}, +{18927, "Hat2"}, +{18928, "Hat3"}, +{18929, "Hat4"}, +{18930, "Hat5"}, +{18931, "Hat6"}, +{18932, "Hat7"}, +{18933, "Hat8"}, +{18934, "Hat9"}, +{18935, "Hat10"}, +{18936, "Helmet1"}, +{18937, "Helmet2"}, +{18938, "Helmet3"}, +{18939, "CapBack1"}, +{18940, "CapBack2"}, +{18941, "CapBack3"}, +{18942, "CapBack4"}, +{18943, "CapBack5"}, +{18944, "HatBoater1"}, +{18945, "HatBoater2"}, +{18946, "HatBoater3"}, +{18947, "HatBowler1"}, +{18948, "HatBowler2"}, +{18949, "HatBowler3"}, +{18950, "HatBowler4"}, +{18951, "HatBowler5"}, +{18952, "BoxingHelmet1"}, +{18953, "CapKnit1"}, +{18954, "CapKnit2"}, +{18955, "CapOverEye1"}, +{18956, "CapOverEye2"}, +{18957, "CapOverEye3"}, +{18958, "CapOverEye4"}, +{18959, "CapOverEye5"}, +{18960, "CapRimUp1"}, +{18961, "CapTrucker1"}, +{18962, "CowboyHat2"}, +{18963, "CJElvisHead"}, +{18964, "SkullyCap1"}, +{18965, "SkullyCap2"}, +{18966, "SkullyCap3"}, +{18967, "HatMan1"}, +{18968, "HatMan2"}, +{18969, "HatMan3"}, +{18970, "HatTiger1"}, +{18971, "HatCool1"}, +{18972, "HatCool2"}, +{18973, "HatCool3"}, +{18974, "MaskZorro1"}, +{18976, "MotorcycleHelmet2"}, +{18977, "MotorcycleHelmet3"}, +{18978, "MotorcycleHelmet4"}, +{18979, "MotorcycleHelmet5"}, +{19006, "GlassesType1"}, +{19007, "GlassesType2"}, +{19008, "GlassesType3"}, +{19009, "GlassesType4"}, +{19010, "GlassesType5"}, +{19011, "GlassesType6"}, +{19012, "GlassesType7"}, +{19013, "GlassesType8"}, +{19014, "GlassesType9"}, +{19015, "GlassesType10"}, +{19016, "GlassesType11"}, +{19017, "GlassesType12"}, +{19018, "GlassesType13"}, +{19019, "GlassesType14"}, +{19020, "GlassesType15"}, +{19021, "GlassesType16"}, +{19022, "GlassesType17"}, +{19023, "GlassesType18"}, +{19024, "GlassesType19"}, +{19025, "GlassesType20"}, +{19026, "GlassesType21"}, +{19027, "GlassesType22"}, +{19028, "GlassesType23"}, +{19029, "GlassesType24"}, +{19030, "GlassesType25"}, +{19031, "GlassesType26"}, +{19032, "GlassesType27"}, +{19033, "GlassesType28"}, +{19034, "GlassesType29"}, +{19035, "GlassesType30"}, +{19036, "HockeyMask1"}, +{19037, "HockeyMask2"}, +{19038, "HockeyMask3"}, +{19039, "WatchType1"}, +{19040, "WatchType2"}, +{19041, "WatchType3"}, +{19042, "WatchType4"}, +{19043, "WatchType5"}, +{19044, "WatchType6"}, +{19045, "WatchType7"}, +{19046, "WatchType8"}, +{19047, "WatchType9"}, +{19048, "WatchType10"}, +{19049, "WatchType11"}, +{19050, "WatchType12"}, +{19051, "WatchType13"}, +{19052, "WatchType14"}, +{19053, "WatchType15"}, +{19085, "EyePatch1"}, +{19086, "ChainsawDildo1"}, +{19090, "PomPomBlue"}, +{19091, "PomPomRed"}, +{19092, "PomPomGreen"}, +{19093, "HardHat2"}, +{19094, "BurgerShotHat1"}, +{19095, "CowboyHat1"}, +{19096, "CowboyHat3"}, +{19097, "CowboyHat4"}, +{19098, "CowboyHat5"}, +{19099, "PoliceCap2"}, +{19100, "PoliceCap3"}, +{19101, "ArmyHelmet1"}, +{19102, "ArmyHelmet2"}, +{19103, "ArmyHelmet3"}, +{19104, "ArmyHelmet4"}, +{19105, "ArmyHelmet5"}, +{19106, "ArmyHelmet6"}, +{19107, "ArmyHelmet7"}, +{19108, "ArmyHelmet8"}, +{19109, "ArmyHelmet9"}, +{19110, "ArmyHelmet10"}, +{19111, "ArmyHelmet11"}, +{19112, "ArmyHelmet12"}, +{19113, "SillyHelmet1"}, +{19114, "SillyHelmet2"}, +{19115, "SillyHelmet3"}, +{19116, "PlainHelmet1"}, +{19117, "PlainHelmet2"}, +{19118, "PlainHelmet3"}, +{19119, "PlainHelmet4"}, +{19120, "PlainHelmet5"}, +{19137, "CluckinBellHat1"}, +{19138, "PoliceGlasses1"}, +{19139, "PoliceGlasses2"}, +{19140, "PoliceGlasses3"}, +{19141, "SWATHelmet1"}, +{19142, "SWATArmour1"}, +{19160, "HardHat3"}, +{19161, "PoliceHat1"}, +{19162, "PoliceHat2"}, +{19163, "GimpMask1"}, +{19317, "bassguitar01"}, +{19318, "flyingv01"}, +{19319, "warlock01"}, +{19330, "fire_hat01"}, +{19331, "fire_hat02"}, +{19346, "hotdog01"}, +{19347, "badge01"}, +{19348, "cane01"}, +{19349, "monocle01"}, +{19350, "moustache01"}, +{19351, "moustache02"}, +{19352, "tophat01"}, +{19487, "tophat02"}, +{19488, "HatBowler6"}, +{19513, "whitephone"}, +{19578, "Banana"}, +{19418, "HandCuff"} +}; + +new AttachmentBones[][24] = { +{"Spine"}, +{"Head"}, +{"Left upper arm"}, +{"Right upper arm"}, +{"Left hand"}, +{"Right hand"}, +{"Left thigh"}, +{"Right thigh"}, +{"Left foot"}, +{"Right foot"}, +{"Right calf"}, +{"Left calf"}, +{"Left forearm"}, +{"Right forearm"}, +{"Left clavicle"}, +{"Right clavicle"}, +{"Neck"}, +{"Jaw"} +}; + +public OnPlayerCommandText(playerid, cmdtext[]) +{ + if(!strcmp(cmdtext, "/attachments", true)) + { + new string[128]; + for(new x;xJXI z7WSa9M}<8u>`7q;f){XSJY(_WC^LnY2 zyrT1{YsoAdEV%%Np{Gne&EC>Y=jfeePG@8JVlHVi=Y)R`=dT)R2YhTJ`^|JNW3aa~ zsR?#AX|PffCHu2^Bo3RPafN}n&I&fwlDMHV>$F1JRGX~&X_9Hu{wXVDg@R%K6!lul z9=RnL?l=;Xl{1#ou+#PraGQQ=zZYC}NQBZ>Fo1 z(CCBM_Fc`!U0`%I8wZ2g9x#|SJymX^$&Id_Fm$z6rt4K!@2ch(jnFjp*8IS!Nx+#` zz+|nw(Fsj&-^$#Hr(;DgYh~U`m1$Lp_o6bck57}VP?OJY?lI?tuj@5%(rjazlm znMw&YOq0)P%_r~5$XneZ&kC&C{IOp&a&lq3!IuMP7RG6`YoXBO>;4R@q|znz&)f5d zv5_)O?$N@$W9{A$%4<_@q92R8jFWvUs9I%pwl@_{x5}bVxKe?YdfD#V0|2)MwgOK8 zs%<&OM;zc3yT9N>W@6jL?pcoc<=5}@BIqy%73aAi`#dMhPaZ}b_Vxj1fuI-)m2OF+d~R%?^pJWHZ(7%4AEf>gJEPuY zUNYOs?9t|{9-f)?W;#p4b=-L+w$N*~&w+9@w5QpyICveY_ZwR$EYsY$D+X3Ss5Ofj z+xzOt7joB{-FRpc+|Xpxev9^+oVQ!M$JC&!*S{m{S zwKN2wmPR1d_vl^ySn`hhnS}abh-VhOng2nkTmLN7kC=fi-Y2^h>eJl_C3}Qg*j6YS z<#XB_jnY|4Qi*hh`e|69Eal;+NvCw@UUr-clwSL!*E61qRdJJ_=@!wc``=$d*(0S(y??IlfDwG0* zfuB5?3cpnVhzlz622o%P4NZW0iY7Ku6{l`v^dWL|pp}qs(8YS5vIFI46#p*pf(nfz z_ZlDSWx(iUC~jRi=ynY7dCDndA`(%YUXdqIv6Ioeu%finU&AaM=+f4}onD@TOOp4Z vxMRVD6riUeU4{%KT!v?C8i#$h!!Vrte>)008+`uvQ8WPaQEae$mO=at(JY_j literal 0 HcmV?d00001 diff --git a/filterscripts/base.pwn b/filterscripts/base.pwn new file mode 100644 index 0000000..1230ed1 --- /dev/null +++ b/filterscripts/base.pwn @@ -0,0 +1,151 @@ +// +// Base FS +// Contains /pm /kick /ban commands. +// + +#include +#include "../include/gl_common.inc" + +#define ADMINFS_MESSAGE_COLOR 0xFF444499 +#define PM_INCOMING_COLOR 0xFFFF22AA +#define PM_OUTGOING_COLOR 0xFFCC2299 + +//------------------------------------------------ + +public OnFilterScriptInit() +{ + print("\n--Base FS loaded.\n"); + return 1; +} + +//------------------------------------------------ + +public OnPlayerCommandText(playerid, cmdtext[]) +{ + new cmd[256]; + new tmp[256]; + new Message[256]; + new gMessage[256]; + new pName[MAX_PLAYER_NAME+1]; + new iName[MAX_PLAYER_NAME+1]; + new idx; + + cmd = strtok(cmdtext, idx); + + // PM Command + if(strcmp("/pm", cmd, true) == 0) + { + tmp = strtok(cmdtext,idx); + + if(!strlen(tmp) || strlen(tmp) > 5) { + SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"Usage: /pm (id) (message)"); + return 1; + } + + new id = strval(tmp); + gMessage = strrest(cmdtext,idx); + + if(!strlen(gMessage)) { + SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"Usage: /pm (id) (message)"); + return 1; + } + + if(!IsPlayerConnected(id)) { + SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"/pm : Bad player ID"); + return 1; + } + + if(playerid != id) { + GetPlayerName(id,iName,sizeof(iName)); + GetPlayerName(playerid,pName,sizeof(pName)); + format(Message,sizeof(Message),">> %s(%d): %s",iName,id,gMessage); + SendClientMessage(playerid,PM_OUTGOING_COLOR,Message); + format(Message,sizeof(Message),"** %s(%d): %s",pName,playerid,gMessage); + SendClientMessage(id,PM_INCOMING_COLOR,Message); + PlayerPlaySound(id,1085,0.0,0.0,0.0); + + printf("PM: %s",Message); + + } + else { + SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"You cannot PM yourself"); + } + return 1; + } + + //Kick Command + if(strcmp("/kick", cmd, true) == 0) + { + if(IsPlayerAdmin(playerid)) { + tmp = strtok(cmdtext,idx); + if(!strlen(tmp) || strlen(tmp) > 5) { + return SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"Usage: /kick (id) [reason]"); + } + + new id = strval(tmp); + + if(!IsPlayerConnected(id)) { + SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"/kick : Bad player ID"); + return 1; + } + + gMessage = strrest(cmdtext,idx); + + GetPlayerName(id,iName,sizeof(iName)); + SendClientMessage(id,ADMINFS_MESSAGE_COLOR,"-- You have been kicked from the server."); + + if(strlen(gMessage) > 0) { + format(Message,sizeof(Message),"Reason: %s",gMessage); + SendClientMessage(id,ADMINFS_MESSAGE_COLOR,Message); + } + + format(Message,sizeof(Message),">> %s(%d) has been kicked.",iName,id); + SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,Message); + + Kick(id); + return 1; + } else { + SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"/kick : You are not an admin"); + return 1; + } + } + + //Ban Command + if(strcmp("/ban", cmd, true) == 0) + { + if(IsPlayerAdmin(playerid)) { + tmp = strtok(cmdtext,idx); + if(!strlen(tmp) || strlen(tmp) > 5) { + return SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"Usage: /ban (id) [reason]"); + } + + new id = strval(tmp); + + if(!IsPlayerConnected(id)) { + SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"/ban : Bad player ID"); + return 1; + } + + gMessage = strrest(cmdtext,idx); + + GetPlayerName(id,iName,sizeof(iName)); + SendClientMessage(id,ADMINFS_MESSAGE_COLOR,"-- You have been banned from the server."); + + if(strlen(gMessage) > 0) { + format(Message,sizeof(Message),"Reason: %s",gMessage); + SendClientMessage(id,ADMINFS_MESSAGE_COLOR,Message); + } + + format(Message,sizeof(Message),">> %s(%d) has been banned.",iName,id); + SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,Message); + + Ban(id); + return 1; + } else { + SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"/ban : You are not an admin"); + return 1; + } + } + + return 0; +} diff --git a/filterscripts/baseaf.amx b/filterscripts/baseaf.amx new file mode 100644 index 0000000000000000000000000000000000000000..9e5337d46b60655564c1dc8f797c394192aea341 GIT binary patch literal 70142 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 literal 0 HcmV?d00001 diff --git a/filterscripts/baseaf.pwn b/filterscripts/baseaf.pwn new file mode 100644 index 0000000..97f9091 --- /dev/null +++ b/filterscripts/baseaf.pwn @@ -0,0 +1,234 @@ +// +// Base FS for Sanandreas Multiplayer 0.3 +// Contains /pm /kick /ban commands - it also features +// a basic anti flood system, and admin chatting for rcon admins +// using # + +#include +#include "../include/gl_common.inc" + +#define ADMINFS_MESSAGE_COLOR 0xFF444499 +#define PM_INCOMING_COLOR 0xFFFF22AA +#define PM_OUTGOING_COLOR 0xFFCC2299 + +static iPlayerChatTime[MAX_PLAYERS]; +static szPlayerChatMsg[MAX_PLAYERS][128]; + +//------------------------------------------------ + +stock IsPlayerFlooding(playerid) +{ + if(GetTickCount() - iPlayerChatTime[playerid] < 2000) + return 1; + + return 0; +} + +//------------------------------------------------ + +public OnFilterScriptInit() +{ + print("\n--Base FS loaded.\n"); + return 1; +} + +//------------------------------------------------ + +public OnPlayerText(playerid, text[]) +{ + // Is the player flooding? + if(IsPlayerFlooding(playerid) && !IsPlayerAdmin(playerid)) + { + SendClientMessage(playerid, 0xFF0000FF, "* You can only send a message once every two seconds."); + return 0; + } + + // Now we handle the admin chat, will be #. + if( (text[0] == '#' || text[0] == '@') && strlen(text) > 1) + { + new str[128]; + new szPlayerName[MAX_PLAYER_NAME]; + GetPlayerName(playerid, szPlayerName, MAX_PLAYER_NAME); + + if(IsPlayerAdmin(playerid)) + { + format(str, 128, "Admin %s: %s", szPlayerName, text[1]); + + for(new iPlayerID; iPlayerID < MAX_PLAYERS; iPlayerID++) + { + if(!IsPlayerConnected(iPlayerID)) continue; + if(!IsPlayerAdmin(iPlayerID)) continue; + SendClientMessage(iPlayerID, PM_INCOMING_COLOR, str); + } + } + + return 0; + } + + // Okay, now it's time for anti repeating. + if(!IsPlayerAdmin(playerid)) + { + if(strlen(text) == strlen(szPlayerChatMsg[playerid]) && !strcmp(szPlayerChatMsg[playerid], text, false)) + { + SendClientMessage(playerid, 0xFF0000FF, "* Please do not repeat yourself."); + format(szPlayerChatMsg[playerid], 128, "%s", text); + return 0; + } + } + + format(szPlayerChatMsg[playerid], 128, "%s", text); + iPlayerChatTime[playerid] = GetTickCount(); + return 1; +} + +//------------------------------------------------ + +public OnPlayerDisconnect(playerid, reason) +{ + #pragma unused reason + + iPlayerChatTime[playerid] = 0; + szPlayerChatMsg[playerid] = ""; + return 1; +} + +//------------------------------------------------ + +public OnPlayerCommandText(playerid, cmdtext[]) +{ + if(IsPlayerFlooding(playerid) && !IsPlayerAdmin(playerid)) + { + SendClientMessage(playerid, 0xFF0000FF, "* You can only use commands once every two seconds."); + return 1; + } + + iPlayerChatTime[playerid] = GetTickCount(); + + new cmd[256]; + new tmp[256]; + new Message[256]; + new gMessage[256]; + new pName[MAX_PLAYER_NAME+1]; + new iName[MAX_PLAYER_NAME+1]; + new idx; + + cmd = strtok(cmdtext, idx); + + // PM Command + if(strcmp("/pm", cmd, true) == 0) + { + tmp = strtok(cmdtext,idx); + + if(!strlen(tmp) || strlen(tmp) > 5) { + SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"Usage: /pm (id) (message)"); + return 1; + } + + new id = strval(tmp); + gMessage = strrest(cmdtext,idx); + + if(!strlen(gMessage)) { + SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"Usage: /pm (id) (message)"); + return 1; + } + + if(!IsPlayerConnected(id)) { + SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"/pm : Bad player ID"); + } + + if(playerid != id) { + GetPlayerName(id,iName,sizeof(iName)); + GetPlayerName(playerid,pName,sizeof(pName)); + format(Message,sizeof(Message),">> %s(%d): %s",iName,id,gMessage); + SendClientMessage(playerid,PM_OUTGOING_COLOR,Message); + format(Message,sizeof(Message),"** %s(%d): %s",pName,playerid,gMessage); + SendClientMessage(id,PM_INCOMING_COLOR,Message); + PlayerPlaySound(id,1085,0.0,0.0,0.0); + + printf("PM: %s",Message); + + } + else { + SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"You cannot PM yourself"); + } + return 1; + } + + //Kick Command + if(strcmp("/kick", cmd, true) == 0) + { + if(IsPlayerAdmin(playerid)) { + tmp = strtok(cmdtext,idx); + if(!strlen(tmp) || strlen(tmp) > 5) { + return SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"Usage: /kick (id) [reason]"); + } + + new id = strval(tmp); + + if(!IsPlayerConnected(id)) { + SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"/kick : Bad player ID"); + return 1; + } + + gMessage = strrest(cmdtext,idx); + + GetPlayerName(id,iName,sizeof(iName)); + SendClientMessage(id,ADMINFS_MESSAGE_COLOR,"-- You have been kicked from the server."); + + if(strlen(gMessage) > 0) { + format(Message,sizeof(Message),"Reason: %s",gMessage); + SendClientMessage(id,ADMINFS_MESSAGE_COLOR,Message); + } + + format(Message,sizeof(Message),">> %s(%d) has been kicked.",iName,id); + SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,Message); + + Kick(id); + return 1; + } else { + SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"/kick : You are not an admin"); + return 1; + } + } + + //Ban Command + if(strcmp("/ban", cmd, true) == 0) + { + if(IsPlayerAdmin(playerid)) { + tmp = strtok(cmdtext,idx); + if(!strlen(tmp) || strlen(tmp) > 5) { + return SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"Usage: /ban (id) [reason]"); + } + + new id = strval(tmp); + + if(!IsPlayerConnected(id)) { + SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"/ban : Bad player ID"); + return 1; + } + + gMessage = strrest(cmdtext,idx); + + GetPlayerName(id,iName,sizeof(iName)); + SendClientMessage(id,ADMINFS_MESSAGE_COLOR,"-- You have been banned from the server."); + + if(strlen(gMessage) > 0) { + format(Message,sizeof(Message),"Reason: %s",gMessage); + SendClientMessage(id,ADMINFS_MESSAGE_COLOR,Message); + } + + format(Message,sizeof(Message),">> %s(%d) has been banned.",iName,id); + SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,Message); + + Ban(id); + return 1; + } else { + SendClientMessage(playerid,ADMINFS_MESSAGE_COLOR,"/ban : You are not an admin"); + return 1; + } + } + + return 0; +} + +//----------------------------------------------- diff --git a/filterscripts/cargoship.amx b/filterscripts/cargoship.amx new file mode 100644 index 0000000000000000000000000000000000000000..b2121bab446d09cc721b7878a6b239a72fb6b2db GIT binary patch literal 3165 zcmd5;eQXow8GlWjVuz!+t*eC*3Aa0RadR!{Op5Y?<8#pR6(FRs4M`bm5rPf`{Q?>yXf?J$LH$_Que94jTh@qf%bwSFUXq2W zmHJQ5y8GSxJiq7jeeQgZafG~k&1SO_8>t&di0C9_%Va$Lgbd-~C4|)Bc?nOO#W)>^ zQ9B{GBkn3BWE!GaM2Hvh@FYTJBc3fFGM6h|iBWmCToChr)^!tErELqRP*jL(2b% z=E^zI{3TCF^~$_RlN3ZkbvV!>#i}BWjR84WD>W;mMhV22IwUWv4K+$J5?5kjNhWjS zd9Ey@1GLUd=E@5K@-k`u(&|V^R)|4k*P6&mIY^d7<>0?{s1#N~^{^kU zWZ2JxS_wLDhWXqb;L}Rbr{+SR)T`Pj4wa%)rh}F{%BJvnqp}~2iq~2)hI%*nk%RVD zC#-~O5f+tWRRZy}VQwHN3zD3sfG>qX+(}lbMYL5sS?4Zs7rUKq2g;m~7$+8^3=?`X zhzX_2k!$EVLth{kd)mCB75vQk1htm8q#V#vTsGxyJNyC`I_>;eq2p#k&dv)I0Ej@> zu&WIcR*}1jwe4os*0Dl6Uz&0XE=UxLxIwwv>8?vaFrSgR8TUp?#yw{8Uyc#XkQ*`B zJ*Eo1E12(FM1E4r$=b?x7F$|0b2G2nxm0mM65B8ZYhp2l5kHP&D*I&Kv}ZdhSPTX? zBd0T)hrz)Q3vKo?ej4k?cXAC^NIo@;&qKl{mga`Rvu*|}LQwn5 zg;Y}DAYm6BxSV9(iDC*Qu)!_QYPXZFq< zB>1Ys%c|A6yz%`rNcel9dYW4JRnqMcZ1>ylDPymrdxx+BA%*|ezrx{PV^s?WiQs_5 z1kw4xK71wNesPwW9YG|mDHr|;1YgEDm7F=1tF6qO>Rb2xQlOcEFNmOL&VF8iB=j*+ zWFuq|4N^YFTHnYRofyNM>RZ`V=jq^QW_tFm-w~Ro$9*(~O@iJS^xXx$Q8>2*`W}P6 zN1*Rf=zARc7DI1SX}K4CFbAq(5!68gMD^?yYFg_ZrzWDa&wPfn^?yDY*Ry}!mtUUV z)1qhlpRc27?V68n*vGW}=TO^r!AI9`1EOa?Im^f=d~{>`Kmjh#<1%#ymz$aGCvOv6 z9wKz(dKRevA};A`sNKYDFAcbixT_Ds3!39r8Y@*8fNe)q$iWcv+F z_Q1NQJv9Ay)rfWNs9Qg9Vxya8+S~B!45NR*B-cB`G;?+6zMSMVM(_U3CZ1-Wc{=B3 z+bf?|>D^ynO3>`l_5kB--@SIK-qZPh70q_Pv4CjT-|Gx(pZ=+B65a9QhaSD>ct?O{ z{`T2YQ!|*ov4ZaW{q}i!&&i_;X!^?01kr|&{uDE$yNZu{IQ63?R~a# zjOM^=r`)vbrEQqOu+473n)knsdyqc%et4v&{W`|kpL%NrO~3R};V8}7GYj=>?~AB8 z)aM+fInFfeF}L&!=NFICe0kNWXU=_$d-T!2M`?B+!5(LRi#^U9`^%`T_iXMAn;*H@ z`Y{L8fC2%C;dLHFpb0`C!!oEvYy=5nQa~6UqLHh=fT=}&N>X9G| iptz8X@?i@Jf-W=-Vax`mmeJQLG94`yyo=^NkpBScND#9C literal 0 HcmV?d00001 diff --git a/filterscripts/cargoship.pwn b/filterscripts/cargoship.pwn new file mode 100644 index 0000000..da84eef --- /dev/null +++ b/filterscripts/cargoship.pwn @@ -0,0 +1,216 @@ +// +// Used for testing interpolated rotations with MoveObject +// Also used to test AttachObjectToObject +// A cargo ship goes around and visits some route points +// +// SA-MP 0.3d and above +// +// - Kye 2011 +// + +#include +#include "../include/gl_common.inc" // for PlaySoundForPlayersInRange() + +#define NUM_SHIP_ROUTE_POINTS 25 +#define SHIP_HULL_ID 9585 // massive cargo ship's hull. This is used as the main object +#define SHIP_MOVE_SPEED 10.0 +#define SHIP_DRAW_DISTANCE 300.0 + +#define NUM_SHIP_ATTACHMENTS 10 + +new Float:gShipHullOrigin[3] = +{ -2409.8438, 1544.9453, 7.0000 }; // so we can convert world space to model space for attachment positions + +new gShipAttachmentModelIds[NUM_SHIP_ATTACHMENTS] = { +9586, // Ship main platform +9761, // Ship rails +9584, // Bridge exterior +9698, // Bridge interior +9821, // Bridge interior doors +9818, // Bridge radio desk +9819, // Captain's desk +9822, // Captain's seat +9820, // Bridge ducts and lights +9590 // Cargo bay area +}; + +new Float:gShipAttachmentPos[NUM_SHIP_ATTACHMENTS][3] = { +// these are world space positions used on the original cargo ship in the game +// they will be converted to model space before attaching +{-2412.1250, 1544.9453, 17.0469}, +{-2411.3906, 1544.9453, 27.0781}, +{-2485.0781, 1544.9453, 26.1953}, +{-2473.5859, 1543.7734, 29.0781}, +{-2474.3594, 1547.2422, 24.7500}, +{-2470.2656, 1544.9609, 33.8672}, +{-2470.4531, 1551.1172, 33.1406}, +{-2470.9375, 1550.7500, 32.9063}, +{-2474.6250, 1545.0859, 33.0625}, +{-2403.5078, 1544.9453, 8.7188} +}; + +// Pirate ship route points (position/rotation) +new Float:gShipRoutePoints[NUM_SHIP_ROUTE_POINTS][6] = { +{-1982.57, 2052.56, 0.00, 0.00, 0.00, 144.84}, +{-2178.63, 2103.67, 0.00, 0.00, 0.00, 189.24}, +{-2366.64, 2020.28, 0.00, 0.00, 0.00, 215.22}, +{-2539.06, 1892.52, 0.00, 0.00, 0.00, 215.22}, +{-2722.79, 1787.85, 0.00, 0.00, 0.00, 205.62}, +{-2918.51, 1729.60, 0.00, 0.00, 0.00, 190.50}, +{-3124.70, 1758.03, 0.00, 0.00, 0.00, 156.36}, +{-3316.51, 1850.08, 0.00, 0.00, 0.00, 153.36}, +{-3541.12, 1977.99, 0.00, 0.00, 0.00, 145.74}, +{-3772.54, 2140.70, 0.00, 0.00, 0.00, 144.96}, +{-4078.78, 2272.93, 0.00, 0.00, 0.00, 167.52}, +{-4382.22, 2222.52, 0.00, 0.36, 0.06, 206.70}, +{-4578.11, 2013.70, 0.00, 0.36, 0.54, 244.80}, +{-4603.54, 1718.89, 0.00, 1.92, -0.36, 283.26}, +{-4463.49, 1504.50, 0.00, 0.92, -0.36, 316.32}, +{-4228.00, 1380.52, 0.00, 0.92, -0.36, 342.54}, +{-3950.14, 1346.96, 0.00, 0.02, -0.06, 359.64}, +{-3646.69, 1344.57, 0.00, 0.02, -0.06, 359.64}, +{-3350.01, 1410.39, 0.00, 0.02, -0.06, 384.48}, +{-2854.63, 1651.56, 0.00, 0.02, -0.06, 378.54}, +{-2590.84, 1667.61, 0.00, 0.02, -0.06, 356.28}, +{-2345.84, 1633.19, 0.00, 0.02, -0.06, 350.28}, +{-2106.14, 1639.23, 0.00, 0.02, -0.06, 378.36}, +{-1943.63, 1743.98, 0.00, 0.02, -0.06, 411.42}, +{-1891.39, 1907.57, 0.00, 0.02, -0.06, 457.14} +}; + + +new gShipCurrentPoint = 1; // current route point the ship is at. We start at route 1 + +// SA-MP objects +new gMainShipObjectId; +new gShipsAttachments[NUM_SHIP_ROUTE_POINTS]; + +forward StartMovingTimer(); + +//------------------------------------------------- + +public StartMovingTimer() +{ + MoveObject(gMainShipObjectId,gShipRoutePoints[gShipCurrentPoint][0], + gShipRoutePoints[gShipCurrentPoint][1], + gShipRoutePoints[gShipCurrentPoint][2], + SHIP_MOVE_SPEED / 2.0, // slower for the first route + gShipRoutePoints[gShipCurrentPoint][3], + gShipRoutePoints[gShipCurrentPoint][4], + gShipRoutePoints[gShipCurrentPoint][5]); +} + +//------------------------------------------------- + +public OnFilterScriptInit() +{ + gMainShipObjectId = CreateObject(SHIP_HULL_ID, gShipRoutePoints[0][0], gShipRoutePoints[0][1], gShipRoutePoints[0][2], + gShipRoutePoints[0][3], gShipRoutePoints[0][4], gShipRoutePoints[0][5], SHIP_DRAW_DISTANCE); + + new x=0; + while(x != NUM_SHIP_ATTACHMENTS) { + gShipsAttachments[x] = CreateObject(gShipAttachmentModelIds[x], 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, SHIP_DRAW_DISTANCE); + AttachObjectToObject(gShipsAttachments[x], gMainShipObjectId, + gShipAttachmentPos[x][0] - gShipHullOrigin[0], + gShipAttachmentPos[x][1] - gShipHullOrigin[1], + gShipAttachmentPos[x][2] - gShipHullOrigin[2], + 0.0, 0.0, 0.0); + x++; + } + + SetTimer("StartMovingTimer",30*1000,0); // pause at route 0 for 30 seconds + + return 1; +} + +//------------------------------------------------- + +public OnFilterScriptExit() +{ + DestroyObject(gMainShipObjectId); + new x=0; + while(x != NUM_SHIP_ATTACHMENTS) { + DestroyObject(gShipsAttachments[x]); + x++; + } + return 1; +} + +//------------------------------------------------- + +public OnObjectMoved(objectid) +{ + if(objectid != gMainShipObjectId) return 0; + + if(gShipCurrentPoint > 0 && !(gShipCurrentPoint % 5)) { + // play some seagulls audio every 5 points + PlaySoundForPlayersInRange(6200, 200.0, gShipRoutePoints[gShipCurrentPoint][0], + gShipRoutePoints[gShipCurrentPoint][1], + gShipRoutePoints[gShipCurrentPoint][2]); + } + + gShipCurrentPoint++; + + if(gShipCurrentPoint == NUM_SHIP_ROUTE_POINTS) { + gShipCurrentPoint = 0; + + MoveObject(gMainShipObjectId,gShipRoutePoints[gShipCurrentPoint][0], + gShipRoutePoints[gShipCurrentPoint][1], + gShipRoutePoints[gShipCurrentPoint][2], + SHIP_MOVE_SPEED / 2.0, // slower for the last route + gShipRoutePoints[gShipCurrentPoint][3], + gShipRoutePoints[gShipCurrentPoint][4], + gShipRoutePoints[gShipCurrentPoint][5]); + return 1; + } + + if(gShipCurrentPoint == 1) { + // Before heading to the first route we should wait a bit + SetTimer("StartMovingTimer",30*1000,0); // pause at route 0 for 30 seconds + return 1; + } + + /* + new tempdebug[256+1]; + format(tempdebug,256,"The ship is at route: %d", gShipCurrentPoint); + SendClientMessageToAll(0xFFFFFFFF,tempdebug);*/ + + MoveObject(gMainShipObjectId,gShipRoutePoints[gShipCurrentPoint][0], + gShipRoutePoints[gShipCurrentPoint][1], + gShipRoutePoints[gShipCurrentPoint][2], + SHIP_MOVE_SPEED, + gShipRoutePoints[gShipCurrentPoint][3], + gShipRoutePoints[gShipCurrentPoint][4], + gShipRoutePoints[gShipCurrentPoint][5]); + + return 1; +} + +//------------------------------------------------- + +public OnPlayerCommandText(playerid, cmdtext[]) +{ + new cmd[256]; + new idx; + cmd = strtok(cmdtext, idx); + + if(strcmp(cmd, "/boardship", true) == 0) { + if(gShipCurrentPoint != 1) { + SendClientMessage(playerid, 0xFFFF0000, "The ship can't be boarded right now"); + return 1; + } + SetPlayerPos(playerid,-1937.7816,2017.7969,16.6640); + return 1; + } + + if(strcmp(cmd, "/stopship", true) == 0) { + StopObject(gMainShipObjectId); + return 1; + } + + return 0; +} + +//------------------------------------------------- + + diff --git a/filterscripts/dillimore_gas.amx b/filterscripts/dillimore_gas.amx new file mode 100644 index 0000000000000000000000000000000000000000..4fcc134bcbe2da8bdc1d9d23246689ca4cd14fee GIT binary patch literal 2384 zcmd5*U1%It6h7N*>?GM@C=rW9oWjbqFpY_6N*)wyvu+#wX)vj@pwP+AZ8BkYW|_Gy z3A>iFaf@l2R;ohLyeRl2h!5gZsrcB3KKUxB4*`8_5k!2^@6O!p#F$F9_|RGIe&?Qh z&Ue0Z?#xsV(a-k{BTojsu#4#PUhJR1Iz{vso^c{Njdcg>o?d?d*Sm@S1U7O+d$0`H zCa|`f=rB+{C5^9Wd|Ts!#+t@U8rL*_sqt%#-)a0_i|6~AKFN`wJR2b7aKXhc~DmxV~n0qOh^M!IwI8_lj$HcrBxG4)AhfCEfhmrQw zA}^3M5eY|%ld}t|_GJ7IEy8VkUZ0wvH$*kOAda2)d>6$sqRIG8$M;;#Q4;7NT++MP zK`-T0tVF>%swESMDNIVn`jChhX{gy_<*nSoe#@}>xlZ=Lk>whEbg*CxdzAAB{0Lj>=#2XMH&&&qSX%QlK>N?xVFgtOZ=5YT1a9JdD3l*d#` zUv9YB!)Jz7?Pk9U+?@nA6Qh$s)B;GPbo^t6%)&qlIs7bfJY$ ze#lwPwW4Km-LQ*~6NJ2Hc0|SmvRgO171_7%fb7`~vOLIEHmSdIViWP`$_!c$8eNUT zyONJyeHEi>sPi7%7`r@^+P${HGuZXzMlYY{GheyIf7g?!Lt_U#-YxijXZOwwM;H2q9h9lin)S+k83P7 z6Ld^xPLnT;3=NO8&qfjLn*18HM~Ip?pC29>+tARd`Znv%wF_Rv(3EmDxX8rcEHA)O zVQD6^MKV^w?nAJ99CXOuY0HNmnOV6QT8wTZjBp9||39w>Re0E$;mzFP_w>Mb+~iZZ PVjnF#_*}E5JD2n~0Y}7z literal 0 HcmV?d00001 diff --git a/filterscripts/dillimore_gas.pwn b/filterscripts/dillimore_gas.pwn new file mode 100644 index 0000000..434a4f0 --- /dev/null +++ b/filterscripts/dillimore_gas.pwn @@ -0,0 +1,161 @@ +// ----------------------------------------------------------------------------- +// Example Filterscript for the Dillimore Gas Station Objects +// ---------------------------------------------------------- +// By Matite in March 2015 +// +// +// This script creates the edited Dillimore Gas Station Building objects and +// removes the existing GTASA building objects. +// +// Warning... +// This script uses a total of: +// * 2 objects = 1 for the replacement building exterior object and 1 for the +// the replacement building interior object +// * Enables the /dgs command to teleport the player to the Dillimore Gas Station +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// Includes +// -------- + +// SA-MP include +#include + + +// ----------------------------------------------------------------------------- +// Defines +// ------- + +// Used for messages sent to the player +#define COLOR_MESSAGE_YELLOW 0xFFDD00AA + + +// ----------------------------------------------------------------------------- +// Variables +// --------- + +// Stores the created object numbers of the replacement building objects so +// they can be destroyed when the filterscript is unloaded +new DillimoreGasObject1; // Building exterior object +new DillimoreGasObject2; // Building interior object + + +// ----------------------------------------------------------------------------- +// Callbacks +// --------- + +public OnPlayerCommandText(playerid, cmdtext[]) +{ + // Check command text + if (strcmp("/dgs", cmdtext, true, 4) == 0) + { + // Set the interior + SetPlayerInterior(playerid, 0); + + // Set player position and facing angle + SetPlayerPos(playerid, 658.37, -573.90, 16.8); + SetPlayerFacingAngle(playerid, 280); + + // Fix camera position after teleporting + SetCameraBehindPlayer(playerid); + + // Send a gametext message to the player + GameTextForPlayer(playerid, "~b~~h~Dillimore Gas Station!", 3000, 3); + + // Exit here + return 1; + } + + // Exit here (return 0 as the command was not handled in this filterscript) + return 0; +} + +public OnFilterScriptInit() +{ + // Display information in the Server Console + print("\n"); + print(" |---------------------------------------------------"); + print(" |--- Dillimore Gas Station Filterscript"); + print(" |-- Script v1.01"); + print(" |-- 3rd March 2015"); + print(" |---------------------------------------------------"); + + // Create the Dillimore Gas Station exterior object + DillimoreGasObject1 = CreateObject(19876, 666.711, -565.133, 17.3359, 0, 0, 0); + + // Display information in the Server Console + print(" |-- Dillimore Gas Station exterior object created"); + + // Create the Dillimore Gas Station interior object + DillimoreGasObject2 = CreateObject(19877, 666.492, -571.18, 17.3125, 0, 0, 0); + + // Display information in the Server Console + print(" |-- Dillimore Gas Station interior object created"); + print(" |---------------------------------------------------"); + + // Loop + for (new i = 0; i < MAX_PLAYERS; i++) + { + // Check if the player is connected and not a NPC + if (IsPlayerConnected(i) && !IsPlayerNPC(i)) + { + // Remove default GTASA Dillimore Gas Station Building exterior, interior + // and LOD map objects for the player + // (so any player currently ingame does not have to rejoin for them + // to be removed when this filterscript is loaded) + RemoveBuildingForPlayer(i, 12853, 666.711, -565.133, 17.3359, 250.0); // Building exterior + RemoveBuildingForPlayer(i, 12854, 666.492, -571.18, 17.3125, 250.0); // Building interior + RemoveBuildingForPlayer(i, 13245, 666.711, -565.133, 17.3359, 250.0); // LOD + } + } + + // Exit here + return 1; +} + +public OnFilterScriptExit() +{ + // Check for valid object + if (IsValidObject(DillimoreGasObject1)) + { + // Destroy the Dillimore Gas Station exterior object + DestroyObject(DillimoreGasObject1); + + // Display information in the Server Console + print(" |---------------------------------------------------"); + print(" |-- Dillimore Gas Station exterior object destroyed"); + } + + // Check for valid object + if (IsValidObject(DillimoreGasObject2)) + { + // Destroy the Dillimore Gas Station interior object + DestroyObject(DillimoreGasObject2); + + // Display information in the Server Console + print(" |-- Dillimore Gas Station interior object destroyed"); + } + + // Display information in the Server Console + print(" |---------------------------------------------------"); + print(" |-- Dillimore Gas Station Filterscript Unloaded"); + print(" |---------------------------------------------------"); + + // Exit here + return 1; +} + +public OnPlayerConnect(playerid) +{ + // Remove default GTASA Dillimore Gas Station Building exterior, interior + // and LOD map objects for the player + RemoveBuildingForPlayer(playerid, 12853, 666.711, -565.133, 17.3359, 250.0); // Building exterior + RemoveBuildingForPlayer(playerid, 12854, 666.492, -571.18, 17.3125, 250.0); // Building interior + RemoveBuildingForPlayer(playerid, 13245, 666.711, -565.133, 17.3359, 250.0); // LOD + + // Exit here (return 1 so this callback is handled in other scripts too) + return 1; +} + diff --git a/filterscripts/ferriswheel.amx b/filterscripts/ferriswheel.amx new file mode 100644 index 0000000000000000000000000000000000000000..479720abd1b39c1a42cba78400c4474e4d784701 GIT binary patch literal 1235 zcma)+O=uHA6vtnhZP~30sVJx@D0O91x@byU8W6Q&Ef%bmw9poVBqpngrb*Z=wIxAk zn(Y_aYC%K<6;#lh9=wS{kJ5{R2L(TQdc00wZ*;+*628EQv0z&vVQ6~H^xKn=hW+au#QDjT)9 zW@7`_ZCq8ZEnK^}hPXz!>RiupHMpMVdJz@NZ=Xcn4n674WXjZy-k6chnukY{=0B#c zv}5Wybykm=-I-xM4xx-0HTC|4uBYI1DibwhLs@qbjmLrcxZZHc(9w}^4w_~(mT)(H z8E)*=&A#N2Za{~gGmXqBH|L^A>||)@HH~EY3}BTyWK+>m-N-@4DJI7~@UF-R?50vf zU4yKOBoCTgPX>3AL;#I`8dj~@IRfm7N0WUtOr>?!%@+i!XjoBpsbZ7Z*h-I5iJV~1 zJT%fuO=lNr9uv{o1qln;5B5sVuvcdWjrkXIB0;;E7iooU@lR zZ&6f*!u@I9gNh-)I$##W2>yukYZzLJp=9>!4h!gRv&ZXTqgV_^w$~ScCK3SotF%k|8FE Q;?zk$R;%ML1^+Ss0eCQPG5`Po literal 0 HcmV?d00001 diff --git a/filterscripts/ferriswheel.pwn b/filterscripts/ferriswheel.pwn new file mode 100644 index 0000000..d0e95d9 --- /dev/null +++ b/filterscripts/ferriswheel.pwn @@ -0,0 +1,135 @@ +// +// Used for testing interpolated rotations with MoveObject +// Also used to test AttachObjectToObject +// The other ferris wheel (that actually spins!) +// Located on the opposite peer at LS +// +// SA-MP 0.3d and above +// +// - Kye 2011 +// + +#include +#include "../include/gl_common.inc" // for PlaySoundForPlayersInRange() + +#define NUM_FERRIS_CAGES 10 +#define FERRIS_WHEEL_ID 18877 +#define FERRIS_CAGE_ID 18879 +#define FERRIS_BASE_ID 18878 +#define FERRIS_DRAW_DISTANCE 300.0 +#define FERRIS_WHEEL_SPEED 0.01 + +#define FERRIS_WHEEL_Z_ANGLE -90.0 // This is the heading the entire ferris wheel is at (beware of gimbal lock) + +new Float:gFerrisOrigin[3] = {832.8393, -2046.1990, 27.0900}; + +// Cage offsets for attaching to the main wheel +new Float:gFerrisCageOffsets[NUM_FERRIS_CAGES][3] = { +{0.0699, 0.0600, -11.7500}, +{-6.9100, -0.0899, -9.5000}, +{11.1600, 0.0000, -3.6300}, +{-11.1600, -0.0399, 3.6499}, +{-6.9100, -0.0899, 9.4799}, +{0.0699, 0.0600, 11.7500}, +{6.9599, 0.0100, -9.5000}, +{-11.1600, -0.0399, -3.6300}, +{11.1600, 0.0000, 3.6499}, +{7.0399, -0.0200, 9.3600} +}; + +// SA-MP objects +new gFerrisWheel; +new gFerrisBase; +new gFerrisCages[NUM_FERRIS_CAGES]; + +forward RotateWheel(); + +//------------------------------------------------- + +new Float:gCurrentTargetYAngle = 0.0; // Angle of the Y axis of the wheel to rotate to. +new gWheelTransAlternate = 0; // Since MoveObject requires some translation target to intepolate + // rotation, the world pos target is alternated by a small amount. + +UpdateWheelTarget() +{ + gCurrentTargetYAngle += 36.0; // There are 10 carts, so 360 / 10 + if(gCurrentTargetYAngle >= 360.0) { + gCurrentTargetYAngle = 0.0; + } + if(gWheelTransAlternate) gWheelTransAlternate = 0; + else gWheelTransAlternate = 1; +} + +//------------------------------------------------- + +public RotateWheel() +{ + UpdateWheelTarget(); + + new Float:fModifyWheelZPos = 0.0; + if(gWheelTransAlternate) fModifyWheelZPos = 0.05; + + MoveObject( gFerrisWheel, gFerrisOrigin[0], gFerrisOrigin[1], gFerrisOrigin[2]+fModifyWheelZPos, + FERRIS_WHEEL_SPEED, 0.0, gCurrentTargetYAngle, FERRIS_WHEEL_Z_ANGLE ); +} + +//------------------------------------------------- + +public OnFilterScriptInit() +{ + gFerrisWheel = CreateObject( FERRIS_WHEEL_ID, gFerrisOrigin[0], gFerrisOrigin[1], gFerrisOrigin[2], + 0.0, 0.0, FERRIS_WHEEL_Z_ANGLE, FERRIS_DRAW_DISTANCE ); + + gFerrisBase = CreateObject( FERRIS_BASE_ID, gFerrisOrigin[0], gFerrisOrigin[1], gFerrisOrigin[2], + 0.0, 0.0, FERRIS_WHEEL_Z_ANGLE, FERRIS_DRAW_DISTANCE ); + + new x=0; + while(x != NUM_FERRIS_CAGES) { + gFerrisCages[x] = CreateObject( FERRIS_CAGE_ID, gFerrisOrigin[0], gFerrisOrigin[1], gFerrisOrigin[2], + 0.0, 0.0, FERRIS_WHEEL_Z_ANGLE, FERRIS_DRAW_DISTANCE ); + + AttachObjectToObject( gFerrisCages[x], gFerrisWheel, + gFerrisCageOffsets[x][0], + gFerrisCageOffsets[x][1], + gFerrisCageOffsets[x][2], + 0.0, 0.0, FERRIS_WHEEL_Z_ANGLE, 0 ); + + x++; + } + + SetTimer("RotateWheel",3*1000,0); + + return 1; +} + +//------------------------------------------------- + +public OnFilterScriptExit() +{ + new x=0; + + DestroyObject(gFerrisWheel); + DestroyObject(gFerrisBase); + + x=0; + while(x != NUM_FERRIS_CAGES) { + DestroyObject(gFerrisCages[x]); + x++; + } + + return 1; +} + +//------------------------------------------------- + +public OnObjectMoved(objectid) +{ + if(objectid != gFerrisWheel) return 0; + + SetTimer("RotateWheel",3*1000,0); + return 1; +} + +//------------------------------------------------- + + diff --git a/filterscripts/flymode.amx b/filterscripts/flymode.amx new file mode 100644 index 0000000000000000000000000000000000000000..e8579c8e84d84fa2c0893234703046777d949873 GIT binary patch literal 8236 zcmeHLS!~?K8J_j7?Ab1p(5;FPXn+##7E8g4mZ_kC4~D_QiOZr$L%?cG6?x#sT8C<7 zEg@}M8WP%XlQxMFBatOpzGTamFWK@T+wvj#zGTbyeczXSrD%b?2JLW{R-~0|s6ik4 zuq$vr@}K|w=I0Eds7T1Ie^DABl$;tt$Unyr@^y?|O9=Tl`zeGFgI&Z&h~!-|!_S!L z7Yy5(&07q|v8#k#GyQ~=F?4^9hkx<#QxCuJaK4AF9&Yxq+r!Hqe(m8m9*$%&-QTMo ziXM*j@C^^&_AusQg@-8*n><|U;TjJ&df4gVUWNfe)Eo`@wgYZHJl&3`@6%p?6Q5q?J{6Zu`QwDdhZRXODVeY{5#M?L53Y09E|WoQTD&r*C(;J} zMH4F%70Gv*ZlW?1HC9@hxtaE1Ie9zrr}zMe>GY~Te4o4-FOMhVZc=1ItYS*M{H;<} zaB<>;56V4@NjCEuOO{o9z?4}XiRlA8^`+(}HK8)jiXSll%VaV(#hQ@LyErjmYEp)c zU$cs_d5~G1sFywR1nI_k#$-KUrCBkGk)?g_=q?8UR%^y-KWTcriBA>E%^{)|M1m6%= zE|2OF(R>saeM(q`_{J;TALWWZDQ1OmnL<9Xz55+vx*nE$$)KXr<<~N+2yy>X!Bk!{ zmFJ}LYM2`qC=ksbR5J}0%_xo#ROdwl;Qo_!GG@J3)L<4R=MUyCbIf*}W z=^KmPq=GM5m`ua&7zn5GtV}PBa(n5eWO{~;?o2W>Lx<=xAvh-F3x|Ko=#<75&0ztv znnVZ(xsQ7<{{0nK2i3tS=aL?+$yN(;e`{O}lF|BJlp9^zzuS#e-g~J$Gu`%9mMIN} zBf{$o7;BN4OCN&t9}7wgjDq(H%q){kJB3jliZWueCiBDITjM4g@KQ(7Cx{{&TE%Oc9f4=q0_c;nePhrCGsZQ&e>M{l6#c8 zryr_cj#78G&B$LF;)v}#fB8X^13rO<{yZ5y#K93@yKLsqJ&oCCU8=E^#b9xc!Dz5&)7j!|Wwt)sY9x(9qui)9nvKpJevULp zony?g=hC_2TxG64*P2J>3G?K6+B|cfGoPO?%~$6e^X&z6fw(|fpf9kRNR!YcH)%~~ zle3UtC@oYM8Vl`3bdk77S)?zrnn|RhJq|?PYYCxJ+55FSC}D<-&4#xwhO~?yTTfNGsG8#tM5ST`8_q zR_ZIQR?;f8%B@!&BIqUiL(t35hvEFW{?P9yquD4qo$Od79yg}PwZg4j8 z8>NlvMq{JBiEa`%DVy|7RtM=2I^+(m!|ZT2^P8p3>SklJy@hTOwVCCiXbk%VV#Ey(;z^ z*lS}S#Xb@H6ztQn&%%C!{Q~yO*so!~iTw@^@HimhfQkbK4%j$IaZtoT1qXE;w9rk^ zEudRQw}x&L-3|`%I3(eaibDnt**HvbSj1rkhjkpb&_mE8phrfJh8`0=4vz3RBH@UN zBLaYDff9VaZD zBseMHq>PgqPMSFB;1rKj5>BZ&W#E*J(-fygoK|pJ$7u^^2+jyNBjb#QGbYYBILqU# zgtIEn8aQj?9K|^i=M1nz-uV z8jouduBo_Y;F^u=6xT&uS8!d&bqhBLZV0#`XMkn<{P^xM|}S#VrxH z6x`Br%ffAf+X8OOxUJ!~iQ5kD@VF!4j*2@5?%23XaaY7$1$TAawQ!H%o`8EY?rFGZ z;+}*1Jnl=luj0Oe`!*g>JP`3f!2=x+Ec6oe3h0&5tD)CKuY-p?9!hwq;-P_uHXczt z67fjEBOQ+{JSKQ7;IWLy8XlW??BEHHCla2hcw*p*ji(e(MLbpTRL4^bUlDvIWd0eG z8*>cg7|1b@V<5*sj)5ElIR + +// Players Move Speed +#define MOVE_SPEED 100.0 +#define ACCEL_RATE 0.03 + +// Players Mode +#define CAMERA_MODE_NONE 0 +#define CAMERA_MODE_FLY 1 + +// Key state definitions +#define MOVE_FORWARD 1 +#define MOVE_BACK 2 +#define MOVE_LEFT 3 +#define MOVE_RIGHT 4 +#define MOVE_FORWARD_LEFT 5 +#define MOVE_FORWARD_RIGHT 6 +#define MOVE_BACK_LEFT 7 +#define MOVE_BACK_RIGHT 8 + +// Enumeration for storing data about the player +enum noclipenum +{ + cameramode, + flyobject, + mode, + lrold, + udold, + lastmove, + Float:accelmul +} +new noclipdata[MAX_PLAYERS][noclipenum]; + +//-------------------------------------------------- + +public OnFilterScriptExit() +{ + // If any players are still in edit mode, boot them out before the filterscript unloads + for(new x; x 100)) + { + // If the last move was > 100ms ago, process moving the object the players camera is attached to + MoveCamera(playerid); + } + + // Is the players current key state different than their last keystate? + if(noclipdata[playerid][udold] != ud || noclipdata[playerid][lrold] != lr) + { + if((noclipdata[playerid][udold] != 0 || noclipdata[playerid][lrold] != 0) && ud == 0 && lr == 0) + { // All keys have been released, stop the object the camera is attached to and reset the acceleration multiplier + StopPlayerObject(playerid, noclipdata[playerid][flyobject]); + noclipdata[playerid][mode] = 0; + noclipdata[playerid][accelmul] = 0.0; + } + else + { // Indicates a new key has been pressed + + // Get the direction the player wants to move as indicated by the keys + noclipdata[playerid][mode] = GetMoveDirectionFromKeys(ud, lr); + + // Process moving the object the players camera is attached to + MoveCamera(playerid); + } + } + noclipdata[playerid][udold] = ud; noclipdata[playerid][lrold] = lr; // Store current keys pressed for comparison next update + return 0; + } + return 1; +} + +//-------------------------------------------------- + +stock GetMoveDirectionFromKeys(ud, lr) +{ + new direction = 0; + + if(lr < 0) + { + if(ud < 0) direction = MOVE_FORWARD_LEFT; // Up & Left key pressed + else if(ud > 0) direction = MOVE_BACK_LEFT; // Back & Left key pressed + else direction = MOVE_LEFT; // Left key pressed + } + else if(lr > 0) // Right pressed + { + if(ud < 0) direction = MOVE_FORWARD_RIGHT; // Up & Right key pressed + else if(ud > 0) direction = MOVE_BACK_RIGHT; // Back & Right key pressed + else direction = MOVE_RIGHT; // Right key pressed + } + else if(ud < 0) direction = MOVE_FORWARD; // Up key pressed + else if(ud > 0) direction = MOVE_BACK; // Down key pressed + + return direction; +} + +//-------------------------------------------------- + +stock MoveCamera(playerid) +{ + new Float:FV[3], Float:CP[3]; + GetPlayerCameraPos(playerid, CP[0], CP[1], CP[2]); // Cameras position in space + GetPlayerCameraFrontVector(playerid, FV[0], FV[1], FV[2]); // Where the camera is looking at + + // Increases the acceleration multiplier the longer the key is held + if(noclipdata[playerid][accelmul] <= 1) noclipdata[playerid][accelmul] += ACCEL_RATE; + + // Determine the speed to move the camera based on the acceleration multiplier + new Float:speed = MOVE_SPEED * noclipdata[playerid][accelmul]; + + // Calculate the cameras next position based on their current position and the direction their camera is facing + new Float:X, Float:Y, Float:Z; + GetNextCameraPosition(noclipdata[playerid][mode], CP, FV, X, Y, Z); + MovePlayerObject(playerid, noclipdata[playerid][flyobject], X, Y, Z, speed); + + // Store the last time the camera was moved as now + noclipdata[playerid][lastmove] = GetTickCount(); + return 1; +} + +//-------------------------------------------------- + +stock GetNextCameraPosition(move_mode, Float:CP[3], Float:FV[3], &Float:X, &Float:Y, &Float:Z) +{ + // Calculate the cameras next position based on their current position and the direction their camera is facing + #define OFFSET_X (FV[0]*6000.0) + #define OFFSET_Y (FV[1]*6000.0) + #define OFFSET_Z (FV[2]*6000.0) + switch(move_mode) + { + case MOVE_FORWARD: + { + X = CP[0]+OFFSET_X; + Y = CP[1]+OFFSET_Y; + Z = CP[2]+OFFSET_Z; + } + case MOVE_BACK: + { + X = CP[0]-OFFSET_X; + Y = CP[1]-OFFSET_Y; + Z = CP[2]-OFFSET_Z; + } + case MOVE_LEFT: + { + X = CP[0]-OFFSET_Y; + Y = CP[1]+OFFSET_X; + Z = CP[2]; + } + case MOVE_RIGHT: + { + X = CP[0]+OFFSET_Y; + Y = CP[1]-OFFSET_X; + Z = CP[2]; + } + case MOVE_BACK_LEFT: + { + X = CP[0]+(-OFFSET_X - OFFSET_Y); + Y = CP[1]+(-OFFSET_Y + OFFSET_X); + Z = CP[2]-OFFSET_Z; + } + case MOVE_BACK_RIGHT: + { + X = CP[0]+(-OFFSET_X + OFFSET_Y); + Y = CP[1]+(-OFFSET_Y - OFFSET_X); + Z = CP[2]-OFFSET_Z; + } + case MOVE_FORWARD_LEFT: + { + X = CP[0]+(OFFSET_X - OFFSET_Y); + Y = CP[1]+(OFFSET_Y + OFFSET_X); + Z = CP[2]+OFFSET_Z; + } + case MOVE_FORWARD_RIGHT: + { + X = CP[0]+(OFFSET_X + OFFSET_Y); + Y = CP[1]+(OFFSET_Y - OFFSET_X); + Z = CP[2]+OFFSET_Z; + } + } +} +//-------------------------------------------------- + +stock CancelFlyMode(playerid) +{ + DeletePVar(playerid, "FlyMode"); + CancelEdit(playerid); + TogglePlayerSpectating(playerid, false); + + DestroyPlayerObject(playerid, noclipdata[playerid][flyobject]); + noclipdata[playerid][cameramode] = CAMERA_MODE_NONE; + return 1; +} + +//-------------------------------------------------- + +stock FlyMode(playerid) +{ + // Create an invisible object for the players camera to be attached to + new Float:X, Float:Y, Float:Z; + GetPlayerPos(playerid, X, Y, Z); + noclipdata[playerid][flyobject] = CreatePlayerObject(playerid, 19300, X, Y, Z, 0.0, 0.0, 0.0); + + // Place the player in spectating mode so objects will be streamed based on camera location + TogglePlayerSpectating(playerid, true); + // Attach the players camera to the created object + AttachCameraToPlayerObject(playerid, noclipdata[playerid][flyobject]); + + SetPVarInt(playerid, "FlyMode", 1); + noclipdata[playerid][cameramode] = CAMERA_MODE_FLY; + return 1; +} + +//-------------------------------------------------- diff --git a/filterscripts/fsdebug.amx b/filterscripts/fsdebug.amx new file mode 100644 index 0000000000000000000000000000000000000000..349ae3d31f9d7320ec83ce138d04974c80b656fa GIT binary patch literal 76471 zcmeFa378z!btqh*AugGAUioG6yZk)wr9wLYG^W8tG(-C3P2$1~xSb4k1&vMHnY_Pc zTF`oKr2eG_ig>=~b7q7zTF}1DzVEws35I@rBAA=Tj!p8?%D6Hs?+PfdxiA=QCZHCWGU~DBx&b)NizO%jASevBb}!|K1q@m z&_Cl!Ndo6z1s!8`k~Eu+zNaN=IUTcpB}pxGES@Au>*#3Am!xOt7@+od=(u{GBps$> z#lw^k3;%LGahnk^lU)bNoB!XgbHAImiF$9Pf6H_d3Uzb1ZX? zi=AVob8K*q?apz)Ij(b#Pddj}oZ~L%_=$5o>KwDOY&!pobIf&)hI9O>bNr=qyw^Ee z&avD%E^v-b&T+swZgGxpImcbj@t|`&?;O8*l}*QgbBpn>aak`^0I}CfqYox_e4=;$-QbiLuax z*hD_YCf&=eQ}3M+lkR?C>LhCY;l!AO*_<*h>FO6ZPrfHIQHoBTG?`%UicFa{QKEq& zgz)ajlnF69=j;0?M5G^0``LuZq>#-fMq!^h`0R^2rVtkHHz5>q5Zw1mB01);K=7M; zq%;*xnewZfV~o@WWRT)1_Yi3b-o>U)i9{y+l88+}-8SK_Nt5rfXK>5Zi8OnMIKo~` zJeYc`#RL6t>V*3z#UA9-I|(Q}ajH0F)-sgzL!yc$b=#Dw_Gprg%wgEjct4s<8Zl|g zRHD-71rzTcni@-$xR#g!OMhZ$=zgMOf*B4k?H)fSvWCWXhWk+=_fHn( zr28En(cGd_CQJV?DH0Kr9~y|z-Zp7+=odrS{$b*SLI$=0{D5?Ba>$u`;Y5=6ln3LJ zcP@t*J0x`?Bt`1eXu?AL_udz=PwpZ?627|$zcg(Esqby99n$z1Dcn60+1NyK-!#vt zu%l_x{kHl~lcor3oaVqwU`aRN*fB0w1pr7eUZ<XP!@KTtbi|8kZHPXxN%n<@IpClc8%%dF(&(x_HQO zvtu|GCZ7zBIT>`#H^G=sa&|q`?4oOUaQ;uebIn-z@mQF2MgDvifJ34{R7}VM^snUF zlR?&!uX(dYyUEuyg3KdaJ@ciII~50asm$-ZN72YhG zE&QBK!Fz^9LH|84oo0_?zi~!#Uk~PA;#H?hN#62}<$D9)y$cjg+=@Q!GAZdVNv5POhon@RI`B8V@;6UgWL>ANYvAX90Y-mi zuA1aIu39GE*P1j1d@7lZ*ANVGjsC|gYDu4SEBe`wB-`+~THy)@jr8rSQd!CHSB|Om zN!7tCYI3fu36NEgd}Wqz#cF@SdR=3$xqAA;iJt#?l%8oOuh5Y5H-FWT+39Fa zOI#X0xW=Z1Ov6M)K*BF^M{ft|$oCoF;7D@O>D z5e>H&xRVj3w%LfX;n&$-HA&kO8okz^tkLiUxsuUUnlzIQ_;33Ibmqzeqd#!<732C# z;OF_Ug^Wqq>SM7q^BzTIW+nvx|Ch>)+ob)glk1v3=PUIzje@gHrF6UmYA?#H(i)^I z$sR`&%P8ay8M5ejY2?mID8p!8U=(uaHGGv97=_$4+`TeulP2|BSF8$Lxh`+aBkV)} zt=e$K+R$j>1b)t0OG?T_X;j=l<-?OjoDtT#+=({0^EdEdmXieLR;-Jr%?Q$jNQq+` zrDJhS-?`@Mt2o^m!M8N7Z)6h%FyZ+AG;Qcn+!qySF4N6UXB8YlHwA{&sZf9wD02ESIlZjmTdO3pHX7EG?(iVZ$mFQA`JvT{jO-}b5uWoPrevL~Cd zmo&60p(PD1Xik?p3!3!nnbTseB-S(eu*1(;>jop84-hLBu@c@$OHk_OtXAM1UMi%D z%3dlYt&E%nOJdz2Fg-#ml_X3%DfvyoBvu?rXejR=nsCy@lh<)WZsXheu#2d>pi_Dz z`%;`zl0(WO#t*ZS6w*a{oywOq`ajG&dt|AiOmLh2QdWu@i(@by@djIUMLCEW;n z46%tN{SJ!0FU-Vm(neEsK_C&&%S^F{BXU&O9~e{Wy8iogq(vs|57H_VKFwoPo6XTs zUAQp(EfUebLV#$I|& zUq;zwa%Vg0=Uyp#55@Fhz0(F}S4w!;?sd$0TWOLx)1KsLuD4T zCrKEit6ce8IH!_cO~32=bi%55PGePM@Z5@LQUaK>-Ilbyd73s@ZTTh1&i1{@H*C33 zON78E8M3nLW7uN!nw;XA|PDm`B7t3aii~I2}tP9yO<~@ zp!Pj~Ns)VKcRQ}(WXV^4g(a7z$ZLcpv$4`_6K)`G$&P4+-KVu&>J%NORB3dG6ed-N z$h)NK5YyyJ=p-r2kTwnJ5N%Iayx?Iy`g7K!e@!(b{fryPw?(dY0i8@$xD^@)487-0vyB_kyoX*@>zT0;b)@ox)MT#WOTxHjNpH9dv zW37kWGS*T^CcNR%@LtQ|k#zGKvASFt_ojBzM4l(N;uU|~#}Jb)K2yRf5$e*#xl3Y9 z6QRkic(r7-33yABS;G$|oUQu55L@-wT*&=j*VFYEj|xO=5=pbY#ZM97o2TvA$Ez(7 zuAE(Xv5Rp@)OY03=;h~Z{To7M`>JbChi&G&g=3&lM~;aClgMfQQfw9T110igL>WDg z{J-tzk+#drt#~6ZE*NriSMi3h;6ys-uW}A>I!2+yj_152Oa#Mkk}X}*VimhI96Jts zC`wRh9Sv#p5|Q?hbBrU6jE0nk{Ijdz&eLHnONdOw>|B;uh=~d1V_yMlK%AAQL%dk_ zFfWl^5H^pIGkPpZw4<~069s~7aK@a^mtor8eINL3Rh9M&#l@f7zG&o4)Mm!U<>B{`SPr1L4xg)j~I7V;XT?J3TM8p$HQ+PmzumuloM{=fDv zTTFHYPm*^39=*#}atm>!7wui_fH2IxY$N5q827T>GYoEs>B0>S3Fd+h<~`5lIhd!3 zgTDs{^K238_O4NLhq!IrSbnG^{z?EZ9r1bEpo)7OUOIAAjz4Y0=d<{6V^}!c{mIpUSxv z`-<3-#rh$);?tZVP-z^#rqB+_3B@wbKD^AF}0U|`R38@d} z9^a)$@HgRmp(H}yD@rDWLEkH4(DzImlnHr{W|5D(vbcR0$%M`+PqR59M013;^oNON zca$4gH18J@AzncUd|~C&HDh_-&)9dHHk9DVZXaJbq7k6GeGIz0zy@VPcGE2KaW}n% zMdvXlAA%!+aW(M-=g|f5%O^k-4^-zjX2YrPuGm) zV_I6>gnK>QO{3TMNLlwPeBpL<79I34%Lj9AJ^`I6fTt^u6 zK$r(S5Me?N5;^1WAk88l57O2lox7QkgA}2YIC4}NNfIHp88Jr=1&I)s&5=DuK3y}G zL&7Ex3r5PeXbu-AbA&+;7c=PL026YU$f0wZMLr&Jar+U42{}Tc+a^RP>ro-!Btnik z9^xiET114{f`?<2;2sq=c~scsu>g;qZ4+|L;0s4t1?Vw@2Rv5Dgd8Js=$vMekH;+0 zUdn_Vr&UWbAwuht2sz<+h@0>;9}!YubL3b-K3y}G&xB2$C`=;cgm)Mr1bV{DpeJ-D zKlBFNIBhDQxm|4v*~+a$4wFoRGZ)dOC{-JS{UJr->Xor&&;YfoM0Fkkf%UAy={= zIVLm4Btp&!S-FUiGqi;7FxojOd8)Y1d<3||uY*c{8n2>Ws z&Nw_rv&hGD9&SJ9WkSx;`Xxz6jtRC75mJW2L$GH(A0|R<7f&nDe7a^V=h-I9AjV_c z%31~`d=dAo1WGLgS_VNIln5yUnngY#=XO+ykTRq!%_ih3!4VHd$646k`jHl$HDWBFEtfgO>Xlw7kd$WkSkn7WrkPCwg zYsNB%ZL(~xJBg6F0!N%93_91vpmP-)lnI$jv!M1u(e7tL=2DiQq^!riDTK@yN<+$8 zHZO|^F$5v-u98pJjAb6%WZ8U$yE)1_&*F=?XBD8904=panUMK3i~O?rI=9cyV?yTB z$|jj3f&ob!StL9Jb7Vo32yqMCSwIHW^BO-FY=j? zLlPNPj(@nRtTKvu5 zwFgCeh>55wb%?OnHHpUn^ni!fXy4_h=tB>(>=&RCPfwf|oQ5{i?fZ%6GW6uDToDVd z#8anhuKo=*IAaZeYbE}=RLU#cyqx1_QHgHXs@KvdMZ^r++PTh~?X1U~{XhGI7TU|V z?|XSO)Y*27*>5V1iNPe4^2?f78&^uixo_o{HL$U+l$eBZWsRHxtd!hiaSTlPt~eJi zWF;->DEScE)Um`)k$CD&D`RIX+kWazcm@B&TL?U2`FR?$C2S9QQ&}^Mp2oZSTQpuX zM-ykfSju=OE@wQ;8LyqQOz~a_&GP#Evex4GwLQ^Rmc6*2cCMda?AXK|d%EJ4lQA?r zGq{V_LH6i3m36Sm*{`TveLc;&gPqdQ(5cftd6`3(x~_nK%r6_Dl@BQZDe(2Iz`0kj z={PSLI-};YG*68fh6Op|#Tff@t1knLgFm;T=OnycmtRJokkGqXLx06i5Pi;cnm#Q# z9ZdSrigxU;qUS91gg@z9tD#1QrhnXv7Rje`;yUK$XB{4al{S8&JihqkiqC0s^y!g( zFSp_>eMBTSO}y&3vH?*VYPm(Gp73Z9X6EXG);;~&it4wtH zw(yY7bHIdkZX7m&o66P=C;sZP>qu|cjijD+H;JAh>er8?KK5NgkxKn}B`)vFpx)8= zM?<4)d}7}GbpE`NIv6S4NR=PW=O;AgqBJGpjrpb0SrB5U`RDxbF6GTbinIra+i};t zjhuE01b@0iZ@>e39_@)&Nm2o_FRRxjzl1FwF^r(@lF`IJnMs|+<-J>-(Cp{Q zO^qP#!u%ZVJBADMbF^NU%!q%R{EWxd*WGFON$>YxhJNN;R* zIhvwfn4P2b`U7ESsSD}TdrE)yaF9y%A+F2PH1)E2{lPF4HVcMwaJoc>j;3oDX6R_W z{xBGt!a`b<&|>spY$)&_pk-JhY8@!0i@3`@NJ&F{VR4Z1DtZFwDEq-;apg!#U~_V! z&jZ79B9X<cKg$EWSW%KsCB!?-VKTMhV;pBY&Fy-@y zDW5+)l+UM3j`#9LG^PE%Vgyv0PmDAJZAgomEznOCRN2bvT+^!1*ve zDWyl$^fWSQ1(CdfAh=mG#M{62Q`cEDd?{-n?*dv@oFFv0vt}ke6-{1OedW%9H_Lmu zi;MDdjSMicuRyDd>38LqoeC#6+M5mI%Dy0Z4uQrO4Yb-6MI@4Nq`Y5DcXDUVvcDCf zggE{pNV-qLFlC`d!}|S3aFQLQ<<(e2T4yi_wkQvG~gAKeTSliTyj! z4LbsqFY?3{c;r4%@=NQgmV9A zLYaQg_si=j%Ng12nyX1*v=yH2Ub0Z?(@NBFc;m|J#0nu^xaAK+C<*s`p6CV zI-l4h9?3e#fA!NEVC2n<^k0Kgy3Wp^t>|a-TF}_G#Y;|ub0^4zvQtlbBk((Pa$(lZ5yRJ*f6h5L0{*G{Udi%(rn9L zRNb=F4b;nd2$SMP-$>_0)A)*%r&@8h_GToFn7=cmKoK%gC<_?rnMH_g29C-7eX)w32Tf9!|*NNK3X zYWWA0r@-XGF@>%_2BZ9gC=KXx|FM5eAw2kvZ(rvt{~%18M^|_Y^l|08V_u?%N@@A* zZ^n3|s&weB8L>xYzav904T!BMnFu8@F!~mDD0O21Om#uhEAos+;D*ALQEY ze??Uf?T;(RCC-TJf2!cvuVs&b&P%`yht7_FbP@lQj=p)}>I{TL$ttDUeiEg*eoeXV zJ7Zni_vwn>Un>8E-b>3b-$&k(==z!hzxq?Y{BZ`tpYg+B#qIkiO-6 zvt7UW>+(YdtY2_vxk6QC35Co8zWO(Dl!t|G@OLpfVLVD(paeYWPi`td9OV@{$`8ec2%t}ih=BN)L_^~rC7Q>Sim?v~<+8_S9i)l=#ov}6 zm#)^bT=4g<=|3b2=xWvizuRtt2dCdgl5?*9+;zoYz|GgOp%4^t`#8VJT7H~p7B9om z`zLm(_{{$q4rDlx;XsB184g?;2V7Z~2A_e>aNs`}2g;Sq-wX#b9LR7W!+{J3E}a9v z$^6N1Aj5%CIZ!E8W>w0Su1cjcyHc&psnjanm7Yp(rCym=>8mWLG%5=#{gp+PW@T|@ zpt7VgSQ)AeS4JwMm9a{zvb0L7%Bqs9TvbX{c9mL{Q>9h8t2|ZSD!nSN%2!oTWmFYb z`KyYm%&Ow5KvhXquqsp)u8LGet727FRcW}s_-r&_CaS9_|x)p~Va zwXeFM+Ndt9_E#5Go7KhDf$Ea#V0EZETpg*7R>!KX>e3piCaXrSan&d_*)?iSPK{RM zuJP1(YxJ7D8edI8jZsrr8uz0yQNy!J1G_xF%8)t%=oGHKnyuZC0&Z>#9|1 zvuoAboLa5cUF)g!*6Ou+wZ7VdTBEkG)?ZsxYt|Om25L)cgSDaBaBZYES{tjiYD?>+ zx~w|6&Q+(>W!I^7Idxi{yUtVRt<&rB>U?ztbw*uboxiTA&a5l03)Gd=1?xg};krm& zv@TX>)s@yu^;z|Dy{lfS&#qVNbLzEvcfF_HTd&vW)%)rT>W%usdVhUUy;)yeAE+;> z57vk3!}XE+Xnm~SsxNJj8nPPX23Ld9klmm*Fr*XV03 zXfzrN8~u$%jb>wUW1z95G1wSt3^zs^qm8jftFg36YRYPon_NvwQ+AWul+&a&xtlyq z-X^^%ugTX`&}1|fHu;;1n#`u+ra)6kQ?M!26mE(%MVn$xR#R!S)ST5UH@ljZ=Imy* zIj31`b~k&Pz0G=aUbC;cpxJ0HZ1y)7HJi=F&4K2U=3sNEIoup+jyA`dt>)4esU@pL zZgI6JE!izxuou+`sM)M~aCw+32ET7#{j z)^Ka2HQE|$wOUKtq_(U!xy{w4v}L!cZ8>dPo4d`^=55p4^4ffD1#L!KVVl3LsLgCE zZVR-Pv<2HjZQ-^^TeL0KX0?^JOYK?ha=WWtY0qv~+jH8rc6Ym{-P^9W=e7IV3)+qL z!ghaqQM=h*+#YBzX%DuC+QaRU_Go*o-D)rGkUFwDI`>AI-{MjPOG!DOX|w%lDk}8 zN>_H5+LhC#b-BAdUEVIeE3eDfRnTR06?XZ%in`3M;;ukfNmsBd)D`ZEbVa*jT~=3V zx73~0EqA-RmG10rwL7O<>vng0y1m_ccV4%zyP(_XF6{Pq7j>K6#odAKlI~!4s5{&p z>5g{Cx~=Zg9;qj*NA7X;C_ULdYEMp&*5mH+^mu#pp1dAkPeG5-Q`qD0De5tMihBY* zB|X8OP*1og(i828^;kWny;5&huiWeEReG~~)!v+5t=HY_>Gk&Ny?MR9-hy7Ex3JgW zThwdz7WW2vOL~L7q26$Bq&M0d>$Q4I`=q|CKDp1;r}Sm_seL(pTA#bm)93Be`||pH zeFc3+UtyoWuc*)LEA9*QmGlMsLVe-BNME!s)@SvV_DlU){c^vnU+K^8SNn7NwSITM zr{CMJ_viKd`V0Dv{=$BLe^I~LU)&$)FX<2Vhx)_)k^X3Ztl#P{9gqgH2IK+PfHIIh zpbq2=Xanv6&wzJ8AIKZ<4HOI*1BCA_LKZ*nl-qIw%ch z4a$SAL1i#|P#w$})CS#yo+p}T24%>@hdl;U|f~PcissNq}z*8}JT7jp%@U$PE4#6`LJd*>@_~4mhcqU4p zJ;Adcc(xFp4Z^df@SF zcr^mA$?%#RUNhje5_rvm*R$bu9bPYj*Te8e7QCUs8wK!20N#kfn+m+?rP@*OW(eMr z;H?~Z%Li{2!&_0<;es6=*ii^Og0Q0$-d5r5Jb2rLwyyu7aLa7hCNxZM}s{DuqOa}V(^gy zA9>*;KYSE|k0tmx2R`<}$Hnk*6!yAcuLt%P!rmb4Erm~1_#_WLG2xR4?2}=i8}=En zuLSm4K!qyz>#)BF_J`rqEcjG|PYdAF0DKyQ0}34Q!T~=V2mzImJeUIqeQ>ZC4o2aS z3l4eUP$3)&!l6<)tis_uIBWtHc|0P+5jPw$;7AGmU=ke7hNC(hErO$AIF<#+G&oiO zRD$tX42~;s+zZG3a6AN`N$^;oN&Pj4^V-`6G1pp3ZJX+c^-Uj!sih< zDZ@!OoHXEM37oXxR5nog!c#?XDhyv_!512QQ2<{A;ENc1slb&JE`bI9CGaEI6MH^bXhgA~+vL z$U@K%3J?MaF+>H?i|9uTVVQ(wIaubyvSKWYVz~>;Jy>3dQKeyj-LED2}j;4B}` zD#lq+obAHd9-Li>vx7Lh6z8ZoClBYCI46R0Wt{8AxdzTH!MPSboQ)6b_;3+E9L9NB zI8VcQ1voE&^I|w(!TDaC@5lKeTp;0s99-Z-`o;GJQC#T4g&tg3hzoECMF2ThXF3H9vIxZ=~C1G5eg-bPDT7XLfxHN{#6r|rLS?0%OAzUuu z@*G_5!{x=eJc=t^xWa=g3UNgcSCnFZ60hZ#I_)|m14V!?RnU4VtWKTWTaA49R_xkV26dB+1ROLXAyRW zu`7#z%b}|Py8_r1!)^t;z1Z!??hy7!*pq`jKI|#Ro+$RZu-AjVg-Aby+*^u$D)!}J zpNV}D?3c0Mjr|5v>8E}R2eNTM$AKao2;*QD4r(}9fP(=XjNwWJS9)=!A6JHOmBc?_ zK$VYH72~QXu6E&S53Vl6)j?ccifdF{lZR_eToXa6qO{hHYYkjmf@>{YmyPRmTvvqa z!braquwKLU1-L$d>tnbSVlRDBbwmuogZCSWY!)*n)Er8o%xLv{RUfk}-?V;aO&XYlt;XsB184hGPkl{dv z0~rovIFR8$h65Q6WH^xFK!yVu4rDlx;XsB184hGPkl{dv0~rqdo8iEyZ;@wiWH^xF zz;7}yGi6?8%Dl{!d6_BmGE?Sdrp(JsnU|R|FEjm{S-NBh$#5XUfeZ&S9LR7W!+{J3 zG91WoAj5$S2QnPUa3I5h3CUa9@Q*cvwQlXH z*$ndA3SBiQ+{~L6!m6;@Dx>`iNaGB zJT1Y~vM4{J!qXZ&?SZFtc-jX~8=@MG2~P*$=^#8EhNq+Ov?Yqu$ncB;T>2G4ll z8C}$>G2j_LJY&K$0eB_|&xE;j%`+A}E5WleJgdO7Dm<%+N;Wz?>w{+vc-9Zkn(%Bu z6t)S&vsCKFg6AZ7PKM_cQRha3=REM74$t}EIRl>ai?TNXcrFOfh2gmCXxUQpl#6<*Nb1&=71^MIB!B!HWjG=!X|gQC}wrFH*&w zD7!i*h?EyrjWP9(YNImwfP&A*%0~@KOL?3c^cacqs}mS)v$^3@8m;dKpO_lOcf zK6u@L*ZuIi39kp>^&nRadOZrSTkwViZ^-b50&l3IfRG2?(BTaqykWo_et5$a^@M`( z22~h}!W$O6DZ!hvC@-YKn;N|7fj4z{(+6)FqS}xNZwBDaAiNodH>2>TC5jKp@RkB^ zsqmHtZ+YM?UDP5n;4MGAWx`tlcq<5Rg}F4*TNdn)V22Dl6xgA{4oy@l(qV@Wb{Me3 z4?9fQ5fFuo!mxu%8CmeQ1aHgmwj$~nY4ElO-qzu5AG~eA+kR2jC;)E<;q5TI9fh|o zct;Xdjud!Dg?BV~#{=)^@QzOuJ@UglCcG1XcY^Rv7~YAB8b}iClwqd=J5|`J!A_4T ziR6Qw2JH01P7`(pU}umkB<+mCP7B_Z;9VKsRp4C}xL}e8-qqn7w?M0lWOL%Y z`{8{P-VcaEO<{OH3h!I6TY}v(>{dkGCJlCbV7CsteX!er-F{KVDFC~JusaO9qp;h8 z4@KQ9eqAk2Ltm10U(|kq*rNdqy>@{Go zANHECHvoI7FjW}#Mq#f7pGfeD44){XPL&3qc;FKqKJmdP27KZdWvc@4Nf15>!zWSr z#Daa2sA8qSJ{9(9u+IbgblB$;MXmg>&xCye*cXI-Vb~WHHLfJsFT;KX_N%a8gZ&;+ z^2!JM4cPC8{U+=W!2Tdtz}g>${T6&G!KX5Os=%kJD2U~OPj&dz2cH`7sUJQyMSZLw zd`cCwqVTB&2P8Nki*i{i9MIr^2M*|Pzy}8mQ9a9q0|7V?gactX5QPJlD5fRDK?M$~ za8QGT9yq9r+FAx2^us|D4hG<05Dtd9)Yd@@4oPrGhC>P*QsIy$DsSm<$OnfEIOK;z zCL9WgLR?`uM5VbbI4r?o84fF=E|&&}J#biu!#+4{z+t~A(-nZjK{yNmMCQ z;G_yCH8|;klRBLAiK1nGIBCMk0GtfM$uOLZiW+7ToRZ;`0;g0srNJqWC~4+{QwE&! z!zmL^1>jVWE1aE*!YK>Bkl+g$zEI!`RTMn)z!y4v;e#&>_`(lgn4Mo&`b8PG0GtiN*)W`q!dVN>Nuny70_RjX zr@=W7oYUc)56)4MHb0y*;amXD1>sy6&P7GdHVMwla9)A)DxBBgyhoI9^TBxo&imoK z3FiZFK1dba;CvL$TL=<@jG!Q>qQIL6K}YZ*7zlo(U+(03Z$SjA02f8D5G6!elz&qZ zHAD}hj_5-)L^U`QF@P9E3?oJnEm0g!#xe!VR4mi5%!6gRs1;{mnIFqcEDK;+5X-_` zI;38%|AT@iKWG@S0i z={ipL;dBG1`$gHg08S6$^e|43;&clil0+3c1s_uJAq^k$;6pk-WG4+Zd{ zAU+hvhoYiJorE)FoT13OjFdi3*t5$is8vPOTk$x&eCv}2WRP`HlBgA{5Z?RSpl3C#93i3l{d@6*%Ho{ zakhf9Rh+Gf%6U4@_Tg*;XZvxsiL(QukX{&PQ)xX5=SVn5#yN_ptEb@{56;nXjt}P; zIL9x_>;-U65a)z(P88=@I9C!?_Y|C~;#>{qdT_3ebA6%+pC9L%I5&WEgE%*gbEBdr zpM(#~_^^TxtN5^n4|_z3J|8}8;KP1=*u;ke_;8Rb_B|ZMhb^2Z;XE1VDL79R1^hfX zPse#aoM+%XKh85nJ-;B%qY8gfoM+*D3FphAyq}8mHJtCk`8v+`;e10>`!jKV0OtpB zei-LRalR#r|H-&O!38QV&~SkV7wDoEpn(hgxWL2(0bCHo1z|1?xWK}N5-yZ+p@Iul zT&RgkfjTbq;X(r!`f;I&3j?BXU>FxtDM1StNw`SHMT)2+sNo_HF4A$44;LA@$S=wY z25?aj7lm`L#T(0196_;zc+=I(?QTx!q<$hdl;_?74590DLmqJ`_;R*>?$hbnm6)LXKL}f%B zSNL#+fh+vD!o(E;Q7AEtE2wm$g_ROk%2=t0x``TAdazQ*N*`7lSm_sK6a!cp#L6&M zMzPYuDoIpTRIp0LDh;bVSfyi?PZU}7W0i?j0jvsQRT!(HqUNH6)iPEqSgm5UhSeTX zg3*W723GsA+QjMrRtLEvV|5g(Ev%8SM#dTiYgAF7(StQQ*7&f-z#2c+n4(@|5NoJ{ zV-#yFtd+1<7UdgNtktmAgS9%=`mojz)f`Q%4Pb2$Yr|L@#ac@gca*VC!8#S|G_3Pr zoi1uU8d&GYIuq*xSQo^)FqeL;v#?&mdKv2#tXHvK6O|x!toLEPf%Sf@H?cl|To^Kp z^;9a-!UhQ&WNc7Gok$HEJlLRPgAW@FZ19V+kpXN7VnY}kqS#A_|ln|;`9V6z{aO;MjRh|N^7GK$R>wn*3_i*l7JwrJSm z!4@4`eAr@$>Xjz81h6HDEn#elVvB{XRLoMwRs~yCY}K&UgRQ!#ZE0YuA6rdq4Pa{! zTf<1DE?X^Zldw(3HU-;MY}2rfDqrf@=EF7v+x*yOVp{;)s1Rlt+o&|Ah3yiy%h;}9 zJJrS1u-$|0I=1_;-N1G~wo{qR0JaCQJ&f&9Y`3sO5>+!5>`<{o!wwI2=-A;CMKt}` zVPZ!BJA&8|#*V0{sVQNnjGYR0s@SPvr$?07^kJugoqp^zu`__3L9V#j8O2TuyCm$A zu}i@&RTSX#V3&?vKI}5E%a2{AsK*(^E~?NO#V!lGCG3_(c}^9(HSG3aw~pOD>^4NT zP7}KW*d4^~Fm^|=+rl0y-YH{`f;}qsXxQVy9$nP(G_c2yJtp=9uqTK;VJ_|2V_~m^ zy)yPH*sEf%CMtdE*z3by1AG10YhrIe6#fijFO>qduusB18T%Ab2UNp85BBNU=fge& z`~0FTXaM_y*cZmWDE3*{FNrFl3ihkmuVKFj`*rO1iK3x?>^HGLfc-)24`Y8+)DV?$ zK*j+D2UHx;aKIxz3K_3np zIOxYgQ`8>~;viKdjpCq%DuBC#Fb%O8O4>B zC{`-tDg{@mxJtuS9$cl1+NB1r^5ZHKR|RlY5Lbn{l<6u9S4+5B#?=b0R&li^Dx2!K z+J~zRT3H9lNp;2OUugBrj!L0l8Y zHBnq+;aW*lMOAREifc7o>%p};uJz$sDw68QwI;3&;MyRr4ddFVsF^C^IvLj~xK71& z8m{w*5~@C2XW%+Nt}}660M`Y%qUyRRuCs8xgzIHoui$!B6j=4(dL7sMaJ_-+{kYx~ z^;Uzpo+_|LalM5bB-|j2@~bLt&~SqXH|V&*hZ_u0jn%{r0o)M84Po36#SNAy&MMqZM7k?;{2A5riT6(7+=C089E@%=}5 zc95B4h65Q6WH^xFK!yVu4rDlx;XsB184hGPkl{dv0~rovIFR8$h65Q6WH^xFK!yYV z+8oF(fGE1L7{Z)x|YtZBd=SzOcb)ENJpI=e6jq-ZoFWyF=^D=~BD1dz4;R zpWL4XKc$IHATpV%kmiBgXin20cI`;+!Vd^+0^OXZ!9P&1`-s?IiP=v}1N=jnLig_0 z;1)XE2frK%B3j_bG~PYLs+dOejtPeTDlM!Sa}wMQ6Vu+d8;M4ya3XPY0*xEdL_;iH z4;n5^G~Q3Zk#zSRgeJkzOn4smjXpFH#}c2w%)9`yTWH7$G{?zA;{%X z=4wz#9U>5dDe1sze#Acw?j+2UhysHD8J+x6h$=>uPaWP1Zf7|Y#C>q@MfM^_-AmL8 zZeH9lq(l)K`T-hhDx^^kha_StGwee0l;DSiVj{DZs2&{>iV29-_#XQI0wdnevZQ~^ znfr%xCh1B`I!|}{yWXdXGZ`^0FFzf6(Ut^5Rym#|#;#{F*&N9)#X3nvCJL>e%4T#c zvEUwtPKTT9jda2mC|ewxK#aiegUKVo={{*G4LXI)j!gN&;DX|Nh2;rjzA)Z!B49n8`B#8ku0@DF)^J(B*R7Pvic=px;jP@ud1d%9ck zHZecq6Y*;*JgC7PG=sZG;WM#nGTn}nT&7+aQX)K4h!ejeP-0sV@qov;izGvR<6|d| z;HPGCHP_P!6X~xVnaBZr6&7KWcJSfIM2siNrW=8VB1y21V#l0TFC1!wdc+)3g@BH3wb4KY*b!Ohok_xFptMFBn%#vrhXBEsUnH8IzH9LE@KD&6f zHAkIOFsEovY_4l=-rUgK(udWDeGivBY|T^Wx##)j1?E}vbLRWz7tIeX$XcK-C|FRu zAhJ+i=w4W`FtjLZQT8I=qT)r-#qwfpalzu^#o;B=5@Sip5^Jfl)Vs83X>^&g%)89L zEVNu&t}OR0Hul57%VTPtupv zsaB+C2ED;(h|$l`dmD|$0R0SoHvJ5Jpefp%)vPraGzVJb z7H^BcCDbanx?2ldgRP})YFj~Dpe@oaw`<}@=p!9j9XTCE9pO&7GpDma{0P0&mD82i zRooS&AEEbkoAe{}Qcq5g-cw9JLNE7fy#>92KDn=ueu6&SFZa8}PtaQf%7AyEXdpBw z4Y~&P!J@&)N@=CK(nCK%?^>m=GUzAhqpR~)TWbo$56>5@HP=Sgxz@SYh1Yx62RBF? z+`_~sQ#7M2i)0%SmOoW;va9<^8%Qts@;-LD0%D3pomjs)p0alkXA-FdH`wuU5<^PD zE3k*Mp{b#eI^1hJA}MY%bf58%(~-#U*-2ek!~~{^odV%u7;;Ihq3jSuYC{7PX|}@i z(3}KL<6M|?B+5{LDCLA{GCatA?i1dT43F)RaZO-cH`7SJ6!#b>#WSAWL`uYX3hbMx znR_$N$pp#%?p}$ke40HCzE5y8R56`eFiE29hqFG;fY=8JFT)(1LcQ;zTa>Qf&VHD) z7skqNnMVBq+@^`i#1n5}>JqtF+sg|^n1T)W5^8aID~)hBp_s~q+l=C*orT8njEtJ` zGKIDmqG4n+M*?{-Qf^S6X6~#NcIQ6VvhO=GDfHDggN7N#AGJ{Q?(o8Sea?W zC5d=EMf4{AveWz}{UwTRIf~pZ4tNLA%KAW~-T}904zZjO5|=oL*e+5C(k4etlf}Vv za@6Byk~Z^%Nfui7{}Ngrhx&0~VsS+2f1VTt8YXuVMfrcBre9J6X@{+MBv<<+KC{2# z2AiAHXas>yh>O!dX5Jlin8-Zg3+~I}B-XQXM+kk41|Tmi!O!VpGOcN0SJTso~5D@2959Y!&&1TBaxG#fpc)izV3D4mc`1|W`(sdq-bF6#lE>UxBZZYbOV&5i5efcL zaGoY?s{o6L!yxmX8hP=+HW6mZICrpDdZc1J2rm<8c-9H-$6O$$`~vQ{eq27ylFf?J z)c7slX~iA&fz7=JEeDdLiNZ7kgv| z6c2HTD87ww{zyx0<@n9n2#LsEMR5N70HGmYCBfe_ z`9veRkhs0^u*58zH!L0}yJC_fOgnX$z_jq>Step9fE^y+C5NC9FH&Z}UdWSP_zHGO_XGK2aUr<%Bn3e+R}F-1&=oY*io|(gq5(y-9>*H2b&+^-~|fn zop4Hic#zN$GS-hfhTkel(pdVhJ&!>K}=%3xF^XV5(v4cT{A~9aZ$GXMNnOwG?uyNK_EVHj+7X*)F_D#@?ZjSK3aKz( zg|0GrynADBk_h%PYR60PMiJv1joPfR-bK-PEadm{xMMmPL$jX#n@T#n+D$)?|AF zRu5tVoB0G%aXVQee@oex-Gv24K0U6n9PY{G+IA361I95!o%mr(j$_e-gpKDSgmEkN zV@b8Z=#1pSu}Mr=2#`^bsEg>pa}}BKFz+wM zpq-2&n!X8z*K*E~6ddBW#}jQAxLrgRndbH#G;G3$b3Sz!HSna_GH-x8Z-AR`fZ`i? z{YiizU93oS}8piHz5*z%8{DajlVc1115aItxS+x|wu!Ub3fGo(CJ-LUJ-mC;E z(U21l*d8#CCOo=HL3>GUHp5e&RMAYO-lK4|d)`*KDGvnJ2GHbPKz9&X?v>|1J z*GQ>T9y#3Tx^xSr>bKM1nQ%m2}oSUjw)Q@J4~{v$$( zt2O{fsR*CmBmN@}uuuN^qH3i=rU0tX<4zvQ-BW-6Itf8lEuViKM;>UvWL1{*+DW27;n(L+N|p)BX}d*E|0-F!=Is zoPXc=I>!?>F&<_jNhOK*9s=?b^xY%=yZ%P6#{VeG)UW*?8Vw<~8Ej9&YCe_wUd#Qa z(GcJLF1xSzHVx5#p&2vF?U>3o%b5@f@CJc{eW@Kl<2+!W<{%-V&!<611C-V=+}{ET5}lIiD|z$^c)R^ixpmcq?KJJ+B*`mA$1n0+3DONoFT{K zACaDNCd=NLB;?S`7X-`-%t|hz)9`+`Qa@oRA_OO4m@>pO2TPJuVSx3AP^*kHC`%{Toh2yu6-E&IM@(;sz})e@9N;Z)ahe2oH&rl9w?Ybj7;_ z?7RP#$>3e0q}*qOEPqE*(!OGq&Ucc+j;EJxenc`PMvP=ZiWR58j*Nb{3{NDSRM|-( zlX}}c7@=EEdd$n$q0F1zkOu1}2@&~+xu^;+z zjv!PfWxP>hyJI?ubzwY(7brMOrtn3iCRFP8i6$j`x)k)oQBJ+IuIo*yi;X zr)<2PG3CPCz3d^#6($Ywbxr$jxHksteq9=k zn2Vb%4>+DOo1c=s7t+9Y!jGLnFEAu65G0x)`wn{Pg^pq)gU;yPJ<^PL`>+5`cj(1R zTG>l*51%KXoHRpS@Eh{=tWJbLIDUv@C^5K6|82I0GH;H`qp>{&>@1$Eg!%yU- zX%c5)alC!ayFe8F?fpr|AvjxXmy~fA6US(C>U!d1(&FJF_k&1>IgSkzf!NIXAK&ORc{2^M=bPWqIr3u&6taXvLeNFxB6RwCijNE-Y&fge0Q zNSv6eiOKz+-mRy#i6Dw^i5hR>!MmPn{R~1ZJqRM|H|SAsA{BZl?Qb>#Yq9Bi)YE$R z;0I9LkI)NR!~{~K<>!D}v7HDSP9hQ?+kStDb~V}CAT)lO`g3RFo`Z-wQ>W94@yEulTLlR)!z>yTjM8sG{yRweH zBijrEe`uBPaf#nIJ;6&uZm-|%A&yOS_VrV=1)B*lCf%yiC21)Ea0c{*z<9U=NJo+2 ze5DS>;qNG92MMy=v?B*`pwFq#a?=W=LM4WQH5C@5vMmvI2NNNUeAF80xab@^bs>}% zF9bHi0Qy1i8)wxPv?U#Ol^I!6%0lq!C@VT{=rBKdG8Ej+i1s!llTaiR(s%N97+@<2 z8F^T;Qil@!`Na>9-rUZYCgdn4<^*NpO72_NIQ33oQ-wzSZfNJUqjf0zlri)vd0mnu zku49Z5z(quKCf5Lu6veKt)ze%XwL?({RswxP-$fB1oo@31|bsy!z3 zlIR~%auYG29!}4mfoch+dp#R_=h356C1Fg`4Z-pb_g-YJFp(;8phoDv9eu_U1@KM} H3=Dn&$!kuP literal 0 HcmV?d00001 diff --git a/filterscripts/fsdebug.pwn b/filterscripts/fsdebug.pwn new file mode 100644 index 0000000..b74780c --- /dev/null +++ b/filterscripts/fsdebug.pwn @@ -0,0 +1,2108 @@ +/* SA:MP PAWN Debug - + * Debugging filterscript used + * for creation of gamemode. + * + * Simon Campbell + * 10/03/2007, 6:31pm + * + * 17/11/2011 + * Updated to 0.5d which supports SA:MP 0.3d +*/ + +//============================================================================== + +#include + +#undef KEY_UP +#undef KEY_DOWN +#undef KEY_LEFT +#undef KEY_RIGHT + +#define KEY_UP 65408 +#define KEY_DOWN 128 +#define KEY_LEFT 65408 +#define KEY_RIGHT 128 + +#define DEBUG_VERSION "0.5d" + +#define SKIN_SELECT true +#define VEHI_SELECT true +#define WORL_SELECT true +#define CAME_SELECT true +#define OBJE_SELECT true + +#define MISCEL_CMDS true +#define ADMINS_ONLY false + +#define SKIN_SEL_STAT 1 +#define VEHI_SEL_STAT 2 +#define WORL_SEL_STAT 3 +#define CAME_SEL_STAT 4 +#define OBJE_SEL_STAT 5 + +#define COLOR_RED 0xFF4040FF +#define COLOR_GREEN 0x40FF40FF +#define COLOR_BLUE 0x4040FFFF + +#define COLOR_CYAN 0x40FFFFFF +#define COLOR_PINK 0xFF40FFFF +#define COLOR_YELLOW 0xFFFF40FF + +#define COLOR_WHITE 0xFFFFFFFF +#define COLOR_BLACK 0x000000FF +#define COLOR_NONE 0x00000000 + +#define MIN_SKIN_ID 0 +#define MAX_SKIN_ID 299 + +#define MIN_VEHI_ID 400 +#define MAX_VEHI_ID 611 + +#define MIN_TIME_ID 0 +#define MAX_TIME_ID 23 + +#define MIN_WEAT_ID 0 +#define MAX_WEAT_ID 45 + +#define MIN_OBJE_ID 615 +#define MAX_OBJE_ID 13563 + +#define DEFAULT_GRA 0.008 + +#define VEHI_DIS 5.0 +#define OBJE_DIS 10.0 + +#define CMODE_A 0 +#define CMODE_B 1 + +#define O_MODE_SELECTOR 0 +#define O_MODE_MOVER 1 +#define O_MODE_ROTATOR 2 + +#define PI 3.14159265 + +#define CAMERA_TIME 40 + +#define dcmd(%1,%2,%3) if ((strcmp((%3)[1], #%1, true, (%2)) == 0) && ((((%3)[(%2) + 1] == 0) && (dcmd_%1(playerid, "")))||(((%3)[(%2) + 1] == 32) && (dcmd_%1(playerid, (%3)[(%2) + 2]))))) return 1 + +//============================================================================== + +new gPlayerStatus[MAX_PLAYERS]; // Player Status +new gPlayerTimers[MAX_PLAYERS]; // Player TimerID's for keypresses +new gWorldStatus[3] = {12, 4}; // Time, Weather + +new curPlayerSkin[MAX_PLAYERS] = {MIN_SKIN_ID, ...}; // Current Player Skin ID +new curPlayerVehM[MAX_PLAYERS] = {MIN_VEHI_ID, ...}; // Current Player Vehicle ID +new curPlayerVehI[MAX_PLAYERS] = {-1, ...}; + +enum E_OBJECT +{ + OBJ_MOD, + OBJ_MDL, + Float:OBJ_X, + Float:OBJ_Y, + Float:OBJ_Z, + Float:OBJ_RX, + Float:OBJ_RY, + Float:OBJ_RZ +} + +enum E_OBJ_RATE +{ + Float:OBJ_RATE_ROT, + Float:OBJ_RATE_MOVE +} + +new pObjectRate[ MAX_PLAYERS ][ E_OBJ_RATE ]; +new curPlayerObjM[ MAX_PLAYERS ][ E_OBJECT ]; +new curPlayerObjI[ MAX_PLAYERS ] = {-1, ...}; + +enum P_CAMERA_D { + CMODE, + Float:RATE, + Float:CPOS_X, + Float:CPOS_Y, + Float:CPOS_Z, + Float:CLOO_X, + Float:CLOO_Y, + Float:CLOO_Z +}; + +new curPlayerCamD[MAX_PLAYERS][P_CAMERA_D]; + +enum CURVEHICLE { + bool:spawn, + vmodel, + vInt +}; + +new curServerVehP[MAX_VEHICLES][CURVEHICLE]; + +new aSelNames[5][] = { // Menu selection names + {"SkinSelect"}, + {"VehicleSelect"}, + {"WeatherSelect"}, + {"CameraSelect"}, + {"ObjectSelect"} +}; + +new aWeaponNames[][32] = { + {"Unarmed (Fist)"}, // 0 + {"Brass Knuckles"}, // 1 + {"Golf Club"}, // 2 + {"Night Stick"}, // 3 + {"Knife"}, // 4 + {"Baseball Bat"}, // 5 + {"Shovel"}, // 6 + {"Pool Cue"}, // 7 + {"Katana"}, // 8 + {"Chainsaw"}, // 9 + {"Purple Dildo"}, // 10 + {"Big White Vibrator"}, // 11 + {"Medium White Vibrator"}, // 12 + {"Small White Vibrator"}, // 13 + {"Flowers"}, // 14 + {"Cane"}, // 15 + {"Grenade"}, // 16 + {"Teargas"}, // 17 + {"Molotov"}, // 18 + {" "}, // 19 + {" "}, // 20 + {" "}, // 21 + {"Colt 45"}, // 22 + {"Colt 45 (Silenced)"}, // 23 + {"Desert Eagle"}, // 24 + {"Normal Shotgun"}, // 25 + {"Sawnoff Shotgun"}, // 26 + {"Combat Shotgun"}, // 27 + {"Micro Uzi (Mac 10)"}, // 28 + {"MP5"}, // 29 + {"AK47"}, // 30 + {"M4"}, // 31 + {"Tec9"}, // 32 + {"Country Rifle"}, // 33 + {"Sniper Rifle"}, // 34 + {"Rocket Launcher"}, // 35 + {"Heat-Seeking Rocket Launcher"}, // 36 + {"Flamethrower"}, // 37 + {"Minigun"}, // 38 + {"Satchel Charge"}, // 39 + {"Detonator"}, // 40 + {"Spray Can"}, // 41 + {"Fire Extinguisher"}, // 42 + {"Camera"}, // 43 + {"Night Vision Goggles"}, // 44 + {"Infrared Vision Goggles"}, // 45 + {"Parachute"}, // 46 + {"Fake Pistol"} // 47 +}; + + +new aVehicleNames[212][] = { // Vehicle Names - Betamaster + {"Landstalker"}, + {"Bravura"}, + {"Buffalo"}, + {"Linerunner"}, + {"Perrenial"}, + {"Sentinel"}, + {"Dumper"}, + {"Firetruck"}, + {"Trashmaster"}, + {"Stretch"}, + {"Manana"}, + {"Infernus"}, + {"Voodoo"}, + {"Pony"}, + {"Mule"}, + {"Cheetah"}, + {"Ambulance"}, + {"Leviathan"}, + {"Moonbeam"}, + {"Esperanto"}, + {"Taxi"}, + {"Washington"}, + {"Bobcat"}, + {"Mr Whoopee"}, + {"BF Injection"}, + {"Hunter"}, + {"Premier"}, + {"Enforcer"}, + {"Securicar"}, + {"Banshee"}, + {"Predator"}, + {"Bus"}, + {"Rhino"}, + {"Barracks"}, + {"Hotknife"}, + {"Trailer 1"}, //artict1 + {"Previon"}, + {"Coach"}, + {"Cabbie"}, + {"Stallion"}, + {"Rumpo"}, + {"RC Bandit"}, + {"Romero"}, + {"Packer"}, + {"Monster"}, + {"Admiral"}, + {"Squalo"}, + {"Seasparrow"}, + {"Pizzaboy"}, + {"Tram"}, + {"Trailer 2"}, //artict2 + {"Turismo"}, + {"Speeder"}, + {"Reefer"}, + {"Tropic"}, + {"Flatbed"}, + {"Yankee"}, + {"Caddy"}, + {"Solair"}, + {"Berkley's RC Van"}, + {"Skimmer"}, + {"PCJ-600"}, + {"Faggio"}, + {"Freeway"}, + {"RC Baron"}, + {"RC Raider"}, + {"Glendale"}, + {"Oceanic"}, + {"Sanchez"}, + {"Sparrow"}, + {"Patriot"}, + {"Quad"}, + {"Coastguard"}, + {"Dinghy"}, + {"Hermes"}, + {"Sabre"}, + {"Rustler"}, + {"ZR-350"}, + {"Walton"}, + {"Regina"}, + {"Comet"}, + {"BMX"}, + {"Burrito"}, + {"Camper"}, + {"Marquis"}, + {"Baggage"}, + {"Dozer"}, + {"Maverick"}, + {"News Chopper"}, + {"Rancher"}, + {"FBI Rancher"}, + {"Virgo"}, + {"Greenwood"}, + {"Jetmax"}, + {"Hotring"}, + {"Sandking"}, + {"Blista Compact"}, + {"Police Maverick"}, + {"Boxville"}, + {"Benson"}, + {"Mesa"}, + {"RC Goblin"}, + {"Hotring Racer A"}, //hotrina + {"Hotring Racer B"}, //hotrinb + {"Bloodring Banger"}, + {"Rancher"}, + {"Super GT"}, + {"Elegant"}, + {"Journey"}, + {"Bike"}, + {"Mountain Bike"}, + {"Beagle"}, + {"Cropdust"}, + {"Stunt"}, + {"Tanker"}, //petro + {"Roadtrain"}, + {"Nebula"}, + {"Majestic"}, + {"Buccaneer"}, + {"Shamal"}, + {"Hydra"}, + {"FCR-900"}, + {"NRG-500"}, + {"HPV1000"}, + {"Cement Truck"}, + {"Tow Truck"}, + {"Fortune"}, + {"Cadrona"}, + {"FBI Truck"}, + {"Willard"}, + {"Forklift"}, + {"Tractor"}, + {"Combine"}, + {"Feltzer"}, + {"Remington"}, + {"Slamvan"}, + {"Blade"}, + {"Freight"}, + {"Streak"}, + {"Vortex"}, + {"Vincent"}, + {"Bullet"}, + {"Clover"}, + {"Sadler"}, + {"Firetruck LA"}, //firela + {"Hustler"}, + {"Intruder"}, + {"Primo"}, + {"Cargobob"}, + {"Tampa"}, + {"Sunrise"}, + {"Merit"}, + {"Utility"}, + {"Nevada"}, + {"Yosemite"}, + {"Windsor"}, + {"Monster A"}, //monstera + {"Monster B"}, //monsterb + {"Uranus"}, + {"Jester"}, + {"Sultan"}, + {"Stratum"}, + {"Elegy"}, + {"Raindance"}, + {"RC Tiger"}, + {"Flash"}, + {"Tahoma"}, + {"Savanna"}, + {"Bandito"}, + {"Freight Flat"}, //freiflat + {"Streak Carriage"}, //streakc + {"Kart"}, + {"Mower"}, + {"Duneride"}, + {"Sweeper"}, + {"Broadway"}, + {"Tornado"}, + {"AT-400"}, + {"DFT-30"}, + {"Huntley"}, + {"Stafford"}, + {"BF-400"}, + {"Newsvan"}, + {"Tug"}, + {"Trailer 3"}, //petrotr + {"Emperor"}, + {"Wayfarer"}, + {"Euros"}, + {"Hotdog"}, + {"Club"}, + {"Freight Carriage"}, //freibox + {"Trailer 3"}, //artict3 + {"Andromada"}, + {"Dodo"}, + {"RC Cam"}, + {"Launch"}, + {"Police Car (LSPD)"}, + {"Police Car (SFPD)"}, + {"Police Car (LVPD)"}, + {"Police Ranger"}, + {"Picador"}, + {"S.W.A.T. Van"}, + {"Alpha"}, + {"Phoenix"}, + {"Glendale"}, + {"Sadler"}, + {"Luggage Trailer A"}, //bagboxa + {"Luggage Trailer B"}, //bagboxb + {"Stair Trailer"}, //tugstair + {"Boxville"}, + {"Farm Plow"}, //farmtr1 + {"Utility Trailer"} //utiltr1 +}; + +//============================================================================== + +forward SkinSelect(playerid); +forward VehicleSelect(playerid); +forward WorldSelect(playerid); +forward CameraSelect(playerid); +forward ObjectSelect( playerid ); + +//============================================================================== + +dcmd_debug(playerid, params[]) { + if(strcmp(params, "help", true, 4) == 0) { + SendClientMessage(playerid, COLOR_BLUE, "[DEBUG]: Debug Mode 0.2 - HELP"); + SendClientMessage(playerid, COLOR_CYAN, "[DEBUG]: Debug Mode 0.2 is a filterscript which allows scripters"); + SendClientMessage(playerid, COLOR_CYAN, "[DEBUG]: or people who wish to explore SA:MP 0.2\'s features to have access"); + SendClientMessage(playerid, COLOR_CYAN, "[DEBUG]: to many commands and \"menu\'s\"."); + SendClientMessage(playerid, COLOR_YELLOW, "[DEBUG]: This filterscript was designed for SA:MP version 0.2"); + SendClientMessage(playerid, COLOR_PINK, "[DEBUG]: For the command list type \"/debug commands\""); + + return true; + } + if(strcmp(params, "commands", true, 8) == 0) { + SendClientMessage(playerid, COLOR_BLUE, "[DEBUG]: Debug Mode 0.2 - COMMANDS"); + SendClientMessage(playerid, COLOR_CYAN, "[WORLD]: /w, /weather, /t, /time, /wsel, /g, /gravity"); + SendClientMessage(playerid, COLOR_CYAN, "[VEHICLES]: /v, /vehicle, /vsel"); + SendClientMessage(playerid, COLOR_CYAN, "[PLAYER]: /s, /skin, /ssel, /weapon, /w2"); + SendClientMessage(playerid, COLOR_CYAN, "[PLAYER]: /goto, /warpto, /bring, /setloc"); + SendClientMessage(playerid, COLOR_CYAN, "[CAMERA]: /camera, /csel"); + + return true; + } + + if(strcmp(params, "dump", true, 4) == 0) { + SendClientMessage(playerid, COLOR_GREEN, "[SUCCESS]: All current server data dumped to a file."); + new File:F_DUMP = fopen("DEBUG-DUMP.txt", io_append); + if(F_DUMP) { + new h, m, s, Y, M, D, cString[256]; + + getdate(Y, M, D); + gettime(h, m, s); + + format(cString, 256, "// %d-%d-%d @ %d:%d:%d\r\n", D, M, Y, h, m, s); + fwrite(F_DUMP, cString); + + for(new i = 0; i < MAX_VEHICLES; i++) { + if(curServerVehP[i][spawn] == true) { + new Float:vx, Float:vy, Float:vz, Float:va; + GetVehiclePos(i, vx, vy, vz); + GetVehicleZAngle(i, va); + format(cString, 256, "CreateVehicle(%d, %f, %f, %f, %f, -1, -1, 5000); // Interior(%d), %s\r\n", curServerVehP[i][vmodel], vx, vy, vz, va, curServerVehP[i][vInt], aVehicleNames[curServerVehP[i][vmodel] - MIN_VEHI_ID]); + fwrite(F_DUMP, cString); + } + } + print("** Dumped current server information."); + fclose(F_DUMP); + } + else { + print("** Failed to create the file \"DEBUG-DUMP.txt\".\n"); + } + return true; + } + return false; +} + +#if CAME_SELECT == true + +dcmd_object(playerid, params[]) +{ + new cString[ 128 ], idx; + cString = strtok( params, idx ); + + if ( !strlen( cString ) || !strlen( params[ idx + 1 ] ) ) + { + SendClientMessage( playerid, COLOR_WHITE, "[USAGE]: /object [RRATE/MRATE/CAMERA] [RATE/ID]"); + + return 1; + } + + if ( strcmp( cString, "rrate", true ) == 0 ) + { + pObjectRate[ playerid ][ OBJ_RATE_ROT ] = floatstr( params[ idx + 1 ] ); + + format( cString, 128, "[SUCCESS]: Object rotation rate changed to %f.", pObjectRate[ playerid ][ OBJ_RATE_ROT ] ); + SendClientMessage( playerid, COLOR_GREEN, cString ); + + return 1; + } + + if ( strcmp( cString, "mrate", true ) == 0 ) + { + pObjectRate[ playerid ][ OBJ_RATE_MOVE ] = floatstr( params[ idx + 1 ] ); + + format( cString, 128, "[SUCCESS]: Object movement rate changed to %f.", pObjectRate[ playerid ][ OBJ_RATE_MOVE ] ); + SendClientMessage( playerid, COLOR_GREEN, cString ); + + return 1; + } + + if ( strcmp( cString, "mode", true ) == 0 ) + { + new fuck = strval( params[ idx + 1 ] ); + + if ( fuck >= O_MODE_SELECTOR || fuck <= O_MODE_ROTATOR ) + { + curPlayerObjM[ playerid ][ OBJ_MOD ] = fuck; + + switch ( fuck ) + { + case O_MODE_SELECTOR: SendClientMessage( playerid, COLOR_GREEN, "[SUCCESS]: Object mode changed to Object Selection." ); + case O_MODE_MOVER: SendClientMessage( playerid, COLOR_GREEN, "[SUCCESS]: Object mode changed to Object Mover." ); + case O_MODE_ROTATOR: SendClientMessage( playerid, COLOR_GREEN, "[SUCCESS]: Object mode changed to Object Rotator." ); + } + + return 1; + } + else + { + SendClientMessage( playerid, COLOR_RED, "[ERROR]: Invalid modeid." ); + + return 1; + } + } + + if ( strcmp( cString, "focus", true ) == 0 ) + { + new objectid = strval( params[ idx + 1 ] ); + + if ( !IsValidObject( objectid ) ) + { + SendClientMessage( playerid, COLOR_RED, "[ERROR]: Enter a valid objectid." ); + + return 1; + } + + else + { + curPlayerObjI[ playerid ] = objectid; + + GetObjectPos( objectid, curPlayerObjM[ playerid ][ OBJ_X ], curPlayerObjM[ playerid ][ OBJ_Y ], curPlayerObjM[ playerid ][ OBJ_Z ] ); + GetObjectRot( objectid, curPlayerObjM[ playerid ][ OBJ_RX ], curPlayerObjM[ playerid ][ OBJ_RY ], curPlayerObjM[ playerid ][ OBJ_RZ ] ); + + curPlayerCamD[playerid][CPOS_X] = curPlayerObjM[ playerid ][ OBJ_X ] + 5.0; + curPlayerCamD[playerid][CPOS_Y] = curPlayerObjM[ playerid ][ OBJ_Y ] - 20.0; + curPlayerCamD[playerid][CPOS_Z] = curPlayerObjM[ playerid ][ OBJ_Z ] + 30.0; + + curPlayerCamD[playerid][CLOO_X] = curPlayerObjM[ playerid ][ OBJ_X ]; + curPlayerCamD[playerid][CLOO_Y] = curPlayerObjM[ playerid ][ OBJ_Y ]; + curPlayerCamD[playerid][CLOO_Z] = curPlayerObjM[ playerid ][ OBJ_Z ]; + + if ( gPlayerStatus[ playerid ] == OBJE_SEL_STAT ) + { + SetPlayerCameraPos( playerid, curPlayerCamD[playerid][CPOS_X], curPlayerCamD[playerid][CPOS_Y], curPlayerCamD[playerid][CPOS_Z] ); + SetPlayerCameraLookAt( playerid, curPlayerObjM[ playerid ][ OBJ_X ], curPlayerObjM[ playerid ][ OBJ_Y ], curPlayerObjM[ playerid ][ OBJ_Z ] ); + } + + return 1; + } + } + + if ( strcmp( cString, "camera", true ) == 0 ) + { + new cameraid = strval( params[ idx + 1 ] ); + + if ( cameraid >= 0 && cameraid < 4 ) + { + switch ( cameraid ) + { + case 0: + { + curPlayerCamD[playerid][CPOS_X] = curPlayerObjM[ playerid ][ OBJ_X ] + 7.0; + curPlayerCamD[playerid][CPOS_Y] = curPlayerObjM[ playerid ][ OBJ_Y ] - 20.0; + curPlayerCamD[playerid][CPOS_Z] = curPlayerObjM[ playerid ][ OBJ_Z ] + 30.0; + } + + case 1: + { + curPlayerCamD[playerid][CPOS_X] = curPlayerObjM[ playerid ][ OBJ_X ] + 7.0; + curPlayerCamD[playerid][CPOS_Y] = curPlayerObjM[ playerid ][ OBJ_Y ] + 15.0; + curPlayerCamD[playerid][CPOS_Z] = curPlayerObjM[ playerid ][ OBJ_X ] + 15.0; + } + + case 2: + { + curPlayerCamD[playerid][CPOS_X] = curPlayerObjM[ playerid ][ OBJ_X ] - 20.0; + curPlayerCamD[playerid][CPOS_Y] = curPlayerObjM[ playerid ][ OBJ_Y ] + 20.0; + curPlayerCamD[playerid][CPOS_Z] = curPlayerObjM[ playerid ][ OBJ_X ] + 20.0; + } + + case 3: + { + curPlayerCamD[playerid][CPOS_X] = curPlayerObjM[ playerid ][ OBJ_X ] - 10.0; + curPlayerCamD[playerid][CPOS_Y] = curPlayerObjM[ playerid ][ OBJ_Y ] + 25.0; + curPlayerCamD[playerid][CPOS_Z] = curPlayerObjM[ playerid ][ OBJ_X ] + 15.0; + } + } + + SetPlayerCameraPos( playerid, curPlayerCamD[playerid][CPOS_X], curPlayerCamD[playerid][CPOS_Y], curPlayerCamD[playerid][CPOS_Z] ); + SetPlayerCameraLookAt( playerid, curPlayerObjM[ playerid ][ OBJ_X ], curPlayerObjM[ playerid ][ OBJ_Y ], curPlayerObjM[ playerid ][ OBJ_Z ] ); + + return 1; + } + else + { + SendClientMessage( playerid, COLOR_RED, "[ERROR]: Invalid object camera id."); + + return 1; + } + } + return 0; +} + +dcmd_osel(playerid, params[]) +{ + #pragma unused params + + new cString[ 128 ]; + + if ( gPlayerStatus[ playerid ] != 0 ) + { + format( cString, 128, "[ERROR]: You are already using \"%s\".", aSelNames[ gPlayerStatus[ playerid ] - 1 ] ); + SendClientMessage(playerid, COLOR_RED, cString); + + return 1; + } + + new Float:a; + + gPlayerStatus[playerid] = OBJE_SEL_STAT; + + GetPlayerPos(playerid, curPlayerCamD[playerid][CPOS_X], curPlayerCamD[playerid][CPOS_Y], curPlayerCamD[playerid][CPOS_Z]); + curPlayerCamD[playerid][CPOS_Z] += 5.0; + SetPlayerCameraPos(playerid, curPlayerCamD[playerid][CPOS_X], curPlayerCamD[playerid][CPOS_Y], curPlayerCamD[playerid][CPOS_Z]); + + GetXYInFrontOfPlayer(playerid, curPlayerCamD[playerid][CLOO_X], curPlayerCamD[playerid][CLOO_Y], OBJE_DIS); + + curPlayerCamD[playerid][CLOO_Z] = curPlayerCamD[playerid][CPOS_Z] - 5.0; + + SetPlayerCameraLookAt(playerid, curPlayerCamD[playerid][CLOO_X], curPlayerCamD[playerid][CLOO_Y], curPlayerCamD[playerid][CLOO_Z]); + + TogglePlayerControllable(playerid, 0); + + GetPlayerFacingAngle(playerid, a); + + curPlayerObjM[ playerid ][ OBJ_X ] = curPlayerCamD[playerid][CLOO_X]; + curPlayerObjM[ playerid ][ OBJ_Y ] = curPlayerCamD[playerid][CLOO_Y]; + curPlayerObjM[ playerid ][ OBJ_Z ] = curPlayerCamD[playerid][CLOO_Z]; + curPlayerObjM[ playerid ][ OBJ_RX ] = 0.0; + curPlayerObjM[ playerid ][ OBJ_RY ] = 0.0; + curPlayerObjM[ playerid ][ OBJ_RZ ] = 0.0; + + curPlayerObjI[ playerid ] = CreateObject( curPlayerObjM[ playerid ][ OBJ_MDL ], curPlayerObjM[ playerid ][ OBJ_X ], + curPlayerObjM[ playerid ][ OBJ_Y ], curPlayerObjM[ playerid ][ OBJ_Z ], + curPlayerObjM[ playerid ][ OBJ_RX ], curPlayerObjM[ playerid ][ OBJ_RY ], curPlayerObjM[ playerid ][ OBJ_RZ ] + ); + + gPlayerTimers[ playerid ] = SetTimerEx("ObjectSelect", 200, 1, "i", playerid); + + return 1; +} + +dcmd_camera(playerid, params[]) { + new idx; new cString[128]; + + cString = strtok(params, idx); + + if (!strlen(cString)) { + SendClientMessage(playerid, COLOR_RED, "[USAGE]: /camera [RATE/MODE] [RATE/MODEID]"); + + return true; + } + + if (strcmp(cString, "rate", true, 4) == 0) { + curPlayerCamD[playerid][RATE] = floatstr(params[idx+1]); + + return true; + } + + if (strcmp(cString, "mode", true, 4) == 0) { + curPlayerCamD[playerid][CMODE] = strval(params[idx+1]); + + return true; + } + + return true; +} + +dcmd_csel(playerid, params[]) { + #pragma unused params + + new cString[128]; + + if (gPlayerStatus[playerid] != 0) { + format(cString, 128, "[ERROR]: You are already using \"%s\".", aSelNames[gPlayerStatus[playerid] - 1]); + SendClientMessage(playerid, COLOR_RED, cString); + + return true; + } + + gPlayerStatus[playerid] = CAME_SEL_STAT; + + TogglePlayerControllable(playerid, 0); + + GetPlayerPos(playerid, curPlayerCamD[playerid][CPOS_X], curPlayerCamD[playerid][CPOS_Y], curPlayerCamD[playerid][CPOS_Z]); + GetXYInFrontOfPlayer(playerid, curPlayerCamD[playerid][CLOO_X], curPlayerCamD[playerid][CLOO_Y], 5.0); + + curPlayerCamD[playerid][CLOO_Z] = curPlayerCamD[playerid][CPOS_Z]; + + gPlayerTimers[playerid] = SetTimerEx("CameraSelect", 200, 1, "i", playerid); + + return true; +} + +#endif + +#if WORL_SELECT == true +dcmd_g(playerid, params[]) { + new cString[128]; + + if (!strlen(params[0])) + { + SendClientMessage(playerid, COLOR_RED, "[USAGE]: /g GRAVITY or /gravity GRAVITY"); + return true; + } + + new Float:grav = floatstr(params[0]); + + SetGravity(grav); + + format(cString, 128, "[SUCCESS]: World gravity changed to %f", grav); + SendClientMessage(playerid, COLOR_GREEN, cString); + + return true; +} + +dcmd_gravity(playerid, params[]) + return dcmd_g(playerid, params); + +dcmd_w(playerid, params[]) { + new idx, iString[128]; + iString = strtok(params, idx); + + if (!strlen(iString)) { + SendClientMessage(playerid, COLOR_RED, "[USAGE]: /w WEATHERID or /weather WEATHERID"); + return true; + } + + idx = strval(iString); + + if (idx < MIN_WEAT_ID || idx > MAX_WEAT_ID) { + SendClientMessage(playerid, COLOR_RED, "[ERROR]: Invalid WEATHERID"); + return true; + } + + gWorldStatus[1] = idx; + + SetWeather(idx); + + format(iString, 128, "[SUCCESS]: Weather has changed to WEATHERID %d", idx); + SendClientMessage(playerid, COLOR_GREEN, iString); + + return true; +} + +dcmd_weather(playerid, params[]) + return dcmd_w(playerid, params); + +dcmd_t(playerid, params[]) { + new idx, iString[128]; + iString = strtok(params, idx); + + if (!strlen(iString)) { + SendClientMessage(playerid, COLOR_RED, "[USAGE]: /t HOUR or /time HOUR"); + return true; + } + + idx = strval(iString); + + if (idx < MIN_TIME_ID || idx > MAX_TIME_ID) { + SendClientMessage(playerid, COLOR_RED, "[ERROR]: Invalid HOUR"); + return true; + } + + gWorldStatus[0] = idx; + + SetWorldTime(idx); + + format(iString, 128, "[SUCCESS]: Time has changed to HOUR %d", idx); + SendClientMessage(playerid, COLOR_GREEN, iString); + + return true; +} + +dcmd_time(playerid, params[]) + return dcmd_t(playerid, params); + +dcmd_wsel(playerid, params[]) { + #pragma unused params + + new cString[128]; + + if (gPlayerStatus[playerid] != 0) { + format(cString, 128, "[ERROR]: You are already using \"%s\".", aSelNames[gPlayerStatus[playerid] - 1]); + SendClientMessage(playerid, COLOR_RED, cString); + return true; + } + + new Float:x, Float:y, Float:z; + + gPlayerStatus[playerid] = WORL_SEL_STAT; + + GetPlayerPos(playerid, x, y, z); + SetPlayerCameraPos(playerid, x, y, z + 40.0); + + GetXYInFrontOfPlayer(playerid, x, y, 100.0); + + SetPlayerCameraLookAt(playerid, x, y, z + 5.0); + + TogglePlayerControllable(playerid, 0); + + gPlayerTimers[playerid] = SetTimerEx("WorldSelect", 200, 1, "i", playerid); + + GameTextForPlayer(playerid, "WorldSelect", 1500, 3); + + return true; +} +#endif + +#if VEHI_SELECT == true + +dcmd_v(playerid, params[]) +{ + new + idx, + iString[ 128 ]; + + if ( gPlayerStatus[ playerid ] != 0 ) + { + format ( iString, 128, "[ERROR]: You are already using \"%s\".", aSelNames[ gPlayerStatus[ playerid ] - 1 ] ); + SendClientMessage ( playerid, COLOR_RED, iString ); + + return true; + } + + if ( params[ 0 ] == '\0' ) // Same effect as a !strlen check. + return SendClientMessage( playerid, COLOR_RED, "[USAGE]: /v MODELID/NAME or /vehicle MODELID/NAME" ); + + //*************** + // Fix by Mike! * + //*************** + + idx = GetVehicleModelIDFromName( params ); + + if( idx == -1 ) + { + idx = strval(iString); + + if ( idx < MIN_VEHI_ID || idx > MAX_VEHI_ID ) + return SendClientMessage(playerid, COLOR_RED, "[ERROR]: Invalid MODELID/NAME"); + } + + new + Float:x, + Float:y, + Float:z, + Float:a; + + GetPlayerPos(playerid, x, y, z); + GetXYInFrontOfPlayer(playerid, x, y, VEHI_DIS); + GetPlayerFacingAngle(playerid, a); + + curPlayerVehM[playerid] = idx; + + curPlayerVehI[playerid] = CreateVehicle(idx, x, y, z + 2.0, a + 90.0, -1, -1, 5000); + LinkVehicleToInterior(curPlayerVehI[playerid], GetPlayerInterior(playerid)); + + curServerVehP[curPlayerVehI[playerid]][spawn] = true; + curServerVehP[curPlayerVehI[playerid]][vmodel] = idx; + curServerVehP[curPlayerVehI[playerid]][vInt] = GetPlayerInterior(playerid); + + format(iString, 128, "[SUCCESS]: Spawned a \"%s\" (MODELID: %d, VEHICLEID: %d)", aVehicleNames[idx - MIN_VEHI_ID], idx, curPlayerVehI[playerid]); + + SendClientMessage(playerid, COLOR_GREEN, iString); + + return true; +} + +dcmd_vehicle(playerid, params[]) + return dcmd_v(playerid, params); + +dcmd_vsel(playerid, params[]) +{ + // /vsel allows players to select a vehicle using playerkeys. + #pragma unused params + + new cString[128]; + + if (gPlayerStatus[playerid] != 0) { + format(cString, 128, "[ERROR]: You are already using \"%s\".", aSelNames[gPlayerStatus[playerid] - 1]); + SendClientMessage(playerid, COLOR_RED, cString); + return true; + } + + new Float:x, Float:y, Float:z, Float:a; + + gPlayerStatus[playerid] = VEHI_SEL_STAT; + + GetPlayerPos(playerid, x, y, z); + SetPlayerCameraPos(playerid, x, y, z + 3.0); + + GetXYInFrontOfPlayer(playerid, x, y, VEHI_DIS); + SetPlayerCameraLookAt(playerid, x, y, z); + + TogglePlayerControllable(playerid, 0); + + GetPlayerFacingAngle(playerid, a); + + curPlayerVehI[playerid] = CreateVehicle(curPlayerVehM[playerid], x, y, z + 2.0, a + 90.0, -1, -1, 5000); + printf( "vsel vehicle start id = %d", curPlayerVehI[playerid] ); + + LinkVehicleToInterior(curPlayerVehI[playerid], GetPlayerInterior(playerid)); + + curServerVehP[curPlayerVehI[playerid]][spawn] = true; + curServerVehP[curPlayerVehI[playerid]][vmodel] = curPlayerVehM[playerid]; + curServerVehP[curPlayerVehI[playerid]][vInt] = GetPlayerInterior(playerid); + + gPlayerTimers[playerid] = SetTimerEx("VehicleSelect", 200, 1, "i", playerid); + + return true; +} + +#endif + +#if SKIN_SELECT == true + +dcmd_ssel(playerid, params[]) +{ + // /ssel allows players to select a skin using playerkeys. + #pragma unused params + + new cString[128]; + + if (gPlayerStatus[playerid] != 0) { + format(cString, 128, "[ERROR]: You are already using \"%s\".", aSelNames[gPlayerStatus[playerid] - 1]); + SendClientMessage(playerid, COLOR_RED, cString); + return true; + } + + new Float:x, Float:y, Float:z; + + gPlayerStatus[playerid] = SKIN_SEL_STAT; + + GetPlayerPos(playerid, x, y, z); + SetPlayerCameraLookAt(playerid, x, y, z); + + GetXYInFrontOfPlayer(playerid, x, y, 3.5); + SetPlayerCameraPos(playerid, x, y, z); + + TogglePlayerControllable(playerid, 0); + + gPlayerTimers[playerid] = SetTimerEx("SkinSelect", 200, 1, "i", playerid); + + return true; +} + +dcmd_s(playerid, params[]) +{ + // /s SKINID allows players to directly select a skin using it's ID. + new idx, iString[128]; + iString = strtok(params, idx); + + if (!strlen(iString)) { + SendClientMessage(playerid, COLOR_RED, "[USAGE]: /s SKINID"); + return true; + } + + idx = strval(iString); + + if (IsInvalidSkin(idx) || idx < MIN_SKIN_ID || idx > MAX_SKIN_ID) { + SendClientMessage(playerid, COLOR_RED, "[ERROR]: Invalid SKINID"); + return true; + } + + SetPlayerSkin(playerid, idx); + curPlayerSkin[playerid] = idx; + format(iString, 128, "[SUCCESS]: Changed skin to SKINID %d", idx); + + SendClientMessage(playerid, COLOR_GREEN, iString); + + return true; +} + +dcmd_skin(playerid, params[]) +{ + dcmd_s(playerid, params); + + return true; +} + +#endif + +#if MISCEL_CMDS == true +dcmd_goto(playerid, params[]) +{ + new idx, iString[128]; + iString = strtok(params, idx); + + if (!strlen(iString)) { + SendClientMessage(playerid, COLOR_RED, "[USAGE]: /goto PLAYERID (X_OFFSET Y_OFFSET Z_OFFSET)"); + return true; + } + + new ID = strval(iString); + + if (!IsPlayerConnected(ID)) { + SendClientMessage(playerid, COLOR_RED, "[ERROR]: Not connected PLAYERID."); + return true; + } + + new Float:X, Float:Y, Float:Z; + new Interior = GetPlayerInterior(ID); + + GetPlayerPos(ID, X, Y, Z); + + iString = strtok(params, idx); + + if (!strlen(iString)) { + GetXYInFrontOfPlayer(ID, X, Y, 1.5); + SetPlayerInterior(playerid, Interior); + SetPlayerPos(playerid, X, Y, Z); + + GetPlayerName(ID, iString, 128); + format(iString, 128, "[SUCCESS]: You have warped to %s (ID: %d).", iString, ID); + SendClientMessage(playerid, COLOR_GREEN, iString); + + return true; + } + + X += floatstr(iString); + iString = strtok(params, idx); + + if (!strlen(iString)) { + goto fwarpto; + } + + Y += floatstr(iString); + iString = strtok(params, idx); + + if (!strlen(iString)) { + goto fwarpto; + } + + Z += floatstr(iString); + + fwarpto: + + new pVID = GetPlayerVehicleID( playerid ); + + if ( pVID ) + { + SetVehiclePos( pVID, X, Y, Z ); + LinkVehicleToInterior( pVID, Interior ); + } + else + { + SetPlayerPos( playerid, X, Y, Z); + } + + SetPlayerInterior( playerid, Interior); + + GetPlayerName(ID, iString, 128); + format(iString, 128, "[SUCCESS]: You have warped to %s (ID: %d).", iString, ID); + SendClientMessage(playerid, COLOR_GREEN, iString); + + return true; +} + +dcmd_warpto(playerid, params[]) +{ + dcmd_goto(playerid, params); + + return true; +} + +dcmd_setloc(playerid, params[]) +{ + new idx, iString[128]; + iString = strtok(params, idx); + + if (!strlen(iString)) { + SendClientMessage(playerid, COLOR_RED, "[USAGE]: /setloc X Y Z INTERIOR"); + return true; + } + + new Float:X, Float:Y, Float:Z; + new Interior; + + X = floatstr(iString); + Y = floatstr(strtok(params,idx)); + Z = floatstr(strtok(params,idx)); + Interior = strval(strtok(params,idx)); + + new pVID = GetPlayerVehicleID( playerid ); + + if ( pVID ) + { + SetVehiclePos( pVID, X, Y, Z ); + LinkVehicleToInterior( pVID, Interior ); + } + else + { + SetPlayerPos( playerid, X, Y, Z ); + } + + SetPlayerInterior(playerid, Interior); + + return true; + + +} + +dcmd_bring(playerid, params[]) +{ + new idx, iString[128]; + iString = strtok(params, idx); + + if (!strlen(iString)) { + SendClientMessage(playerid, COLOR_RED, "[USAGE]: /bring PLAYERID (X_OFFSET Y_OFFSET Z_OFFSET)"); + return true; + } + + new ID = strval(iString); + + if (!IsPlayerConnected(ID)) { + SendClientMessage(playerid, COLOR_RED, "[ERROR]: Not connected PLAYERID."); + return true; + } + + new Float:X, Float:Y, Float:Z; + new Interior = GetPlayerInterior(playerid); + + GetPlayerPos(playerid, X, Y, Z); + + iString = strtok(params, idx); + + if (!strlen(iString)) { + GetXYInFrontOfPlayer(playerid, X, Y, 1.5); + SetPlayerInterior(ID, Interior); + SetPlayerPos(ID, X, Y, Z); + + GetPlayerName(ID, iString, 128); + format(iString, 128, "[SUCCESS]: You have brought %s (ID: %d) to you.", iString, ID); + SendClientMessage(playerid, COLOR_GREEN, iString); + + return true; + } + + X += floatstr(iString); + iString = strtok(params, idx); + + if (!strlen(iString)) { + goto fbring; + } + + Y += floatstr(iString); + iString = strtok(params, idx); + + if (!strlen(iString)) { + goto fbring; + } + + Z += floatstr(iString); + + fbring: + + new pVID = GetPlayerVehicleID( ID ); + + if ( pVID ) + { + SetVehiclePos( pVID, X, Y, Z ); + LinkVehicleToInterior( pVID, Interior ); + } + else + { + SetPlayerPos( ID, X, Y, Z ); + } + + SetPlayerInterior(ID, Interior); + + GetPlayerName(ID, iString, 128); + format(iString, 128, "[SUCCESS]: You have brought %s (ID: %d) to you.", iString, ID); + SendClientMessage(playerid, COLOR_GREEN, iString); + + return true; +} + +dcmd_weapon(playerid, params[]) +{ + dcmd_w2(playerid, params); + + return true; +} + +dcmd_w2(playerid, params[]) +{ + new idx, iString[128]; + iString = strtok(params, idx); + + if (!strlen(iString)) { + SendClientMessage(playerid, COLOR_RED, "[USAGE]: /w2 WEAPONID/NAME (AMMO) or /weapon WEAPONID/NAME (AMMO)"); + return true; + } + + new weaponid = GetWeaponModelIDFromName(iString); + + if (weaponid == -1) { + weaponid = strval(iString); + if (weaponid < 0 || weaponid > 47) { + SendClientMessage(playerid, COLOR_RED, "[ERROR]: Invalid WEAPONID/NAME"); + return true; + } + } + + if (!strlen(params[idx+1])) { + GivePlayerWeapon(playerid, weaponid, 500); + + format(iString, 128, "[SUCCESS]: You were given weapon %s (ID: %d) with 500 ammo.", aWeaponNames[weaponid], weaponid); + SendClientMessage(playerid, COLOR_GREEN, iString); + + return true; + } + + idx = strval(params[idx+1]); + + GivePlayerWeapon(playerid, weaponid, idx); + + format(iString, 128, "[SUCCESS]: You were given weapon %s (ID: %d) with %d ammo.", aWeaponNames[weaponid], weaponid, idx); + SendClientMessage(playerid, COLOR_GREEN, iString); + + return true; +} +#endif + +public OnFilterScriptInit() +{ + print("\n *********************\n * SA:MP DEBUG 0.2 *"); + print(" * By Simon Campbell *\n *********************"); + printf(" * Version: %s *\n *********************", DEBUG_VERSION); + print(" * -- LOADED *\n *********************\n"); + + for ( new i = 0; i < MAX_PLAYERS; i++ ) + { + curPlayerObjM[ i ][ OBJ_MDL ] = MIN_OBJE_ID; + pObjectRate[ i ][ OBJ_RATE_ROT ] = 1.0; + pObjectRate[ i ][ OBJ_RATE_MOVE ] = 1.0; + } + +} + +public OnFilterScriptExit() +{ + print("\n *********************\n * SA:MP DEBUG 0.2 *"); + print(" * -- SHUTDOWN *\n *********************\n"); +} + +public OnPlayerCommandText(playerid, cmdtext[]) +{ + #if ADMINS_ONLY == true + if(IsPlayerAdmin(playerid)) { + #endif + + #if SKIN_SELECT == true + dcmd(s, 1, cmdtext); + dcmd(ssel, 4, cmdtext); + dcmd(skin, 4, cmdtext); + #endif + + #if VEHI_SELECT == true + dcmd(v, 1, cmdtext); + dcmd(vsel, 4, cmdtext); + dcmd(vehicle, 7, cmdtext); + #endif + + #if WORL_SELECT == true + dcmd(w, 1, cmdtext); + dcmd(t, 1, cmdtext); + dcmd(g, 1, cmdtext); + dcmd(wsel, 4, cmdtext); + dcmd(time, 4, cmdtext); + dcmd(weather, 7, cmdtext); + dcmd(gravity, 7, cmdtext); + #endif + + #if MISCEL_CMDS == true + dcmd(w2, 2, cmdtext); + dcmd(goto, 4, cmdtext); + dcmd(bring, 5, cmdtext); + dcmd(warpto, 6, cmdtext); + dcmd(weapon, 6, cmdtext); + dcmd(setloc, 6, cmdtext); + #endif + + #if CAME_SELECT == true + dcmd(csel, 4, cmdtext); + dcmd(camera, 6, cmdtext); + #endif + + dcmd(osel, 4, cmdtext); + dcmd(object, 6, cmdtext); + dcmd(debug, 5, cmdtext); + + #if ADMINS_ONLY == true + } + #endif + + return 0; +} + +public OnPlayerDisconnect(playerid,reason) +{ + KillTimer(gPlayerTimers[playerid]); + + gPlayerStatus[playerid] = 0; + gPlayerTimers[playerid] = 0; + + curPlayerSkin[playerid] = MIN_SKIN_ID; // Current Player Skin ID + curPlayerVehM[playerid] = MIN_VEHI_ID; // Current Player Vehicle ID + curPlayerVehI[playerid] = -1; + + return 0; +} + +public OnPlayerConnect(playerid) +{ + curPlayerCamD[playerid][CMODE] = CMODE_A; + curPlayerCamD[playerid][RATE] = 2.0; + + return 0; +} + +public OnPlayerClickMap(playerid, Float:fX, Float:fY, Float:fZ) { + #if ADMINS_ONLY == true + if (IsPlayerAdmin(playerid)) { + #endif + SetPlayerPosFindZ(playerid, fX, fY, fZ); + #if ADMINS_ONLY == true + } + #endif +} + + +//============================================================================== + +#if WORL_SELECT == true +public WorldSelect(playerid) +{ // Created by Simon + /* + // Make sure the player is not in world selection before continuing + if (gPlayerStatus[playerid] != WORL_SEL_STAT) { + KillTimer(skinTimerID[playerid]); + return; + } + */ + + new keys, updown, leftright; + + GetPlayerKeys(playerid, keys, updown, leftright); + + new cString[128]; + + // Right key increases World Time + if (leftright == KEY_RIGHT) { + if(gWorldStatus[0] == MAX_TIME_ID) { + gWorldStatus[0] = MIN_TIME_ID; + } + else { + gWorldStatus[0]++; + } + format(cString, 128, "World Time: %d~n~Weather ID: %d", gWorldStatus[0], gWorldStatus[1]); + GameTextForPlayer(playerid, cString, 1500, 3); + SetWorldTime(gWorldStatus[0]); + } + + // Left key decreases World Time + if (leftright == KEY_LEFT) { + if(gWorldStatus[0] == MIN_TIME_ID) { + gWorldStatus[0] = MAX_TIME_ID; + } + else { + gWorldStatus[0]--; + } + format(cString, 128, "World Time: %d~n~Weather ID: %d", gWorldStatus[0], gWorldStatus[1]); + GameTextForPlayer(playerid, cString, 1500, 3); + SetWorldTime(gWorldStatus[0]); + } + + // Up key increases Weather ID + if(updown == KEY_UP) { + if(gWorldStatus[1] == MAX_WEAT_ID) { + gWorldStatus[1] = MIN_WEAT_ID; + } + else { + gWorldStatus[1]++; + } + format(cString, 128, "World Time: %d~n~Weather ID: %d", gWorldStatus[0], gWorldStatus[1]); + GameTextForPlayer(playerid, cString, 1500, 3); + SetWeather(gWorldStatus[1]); + } + + // Down key decreases Weather ID + if(updown == KEY_DOWN) { + if(gWorldStatus[1] == MIN_WEAT_ID) { + gWorldStatus[1] = MAX_WEAT_ID; + } + else { + gWorldStatus[1]--; + } + format(cString, 128, "World Time: %d~n~Weather ID: %d", gWorldStatus[0], gWorldStatus[1]); + GameTextForPlayer(playerid, cString, 1500, 3); + SetWeather(gWorldStatus[1]); + } + + // Action key exits WorldSelection + if(keys & KEY_ACTION) { + SetCameraBehindPlayer(playerid); + TogglePlayerControllable(playerid, 1); + + format(cString, 128, "[SUCCESS]: Time changed to %d hours and weather changed to WEATHERID %d", gWorldStatus[0], gWorldStatus[1]); + SendClientMessage(playerid, COLOR_GREEN, cString); + + new File:F_WORLD = fopen("TIME-WEATHER.txt", io_append); + + if(F_WORLD) { + new h, m, s, Y, M, D; + + getdate(Y, M, D); + gettime(h, m, s); + + format(cString, 128, "// %d-%d-%d @ %d:%d:%d\r\nSetWeather(%d);\r\nSetWorldTime(%d);\r\n", D, M, Y, h, m, s); + + fwrite(F_WORLD, cString); + fclose(F_WORLD); + printf("\n%s\n",cString); + } + else { + print("Failed to create the file \"TIME-WEATHER.txt\".\n"); + } + + gPlayerStatus[playerid] = 0; + KillTimer(gPlayerTimers[playerid]); + + return; + } +} + +#endif + +#if SKIN_SELECT == true +public SkinSelect(playerid) +{ // Created by Simon + /* + // Make sure the player is not in skin selection before continuing + if (gPlayerStatus[playerid] != SKIN_SEL_STAT) { + KillTimer(skinTimerID[playerid]); + return; + } + */ + + new keys, updown, leftright; + + GetPlayerKeys(playerid, keys, updown, leftright); + + new cString[128]; + + // Right key increases Skin ID + if (leftright == KEY_RIGHT) { + if(curPlayerSkin[playerid] == MAX_SKIN_ID) { + curPlayerSkin[playerid] = MIN_SKIN_ID; + } + else { + curPlayerSkin[playerid]++; + } + while(IsInvalidSkin(curPlayerSkin[playerid])) { + curPlayerSkin[playerid]++; + } + + format(cString, 128, "Skin ID: %d", curPlayerSkin[playerid]); + GameTextForPlayer(playerid, cString, 1500, 3); + SetPlayerSkin(playerid, curPlayerSkin[playerid]); + } + + // Left key decreases Skin ID + if(leftright == KEY_LEFT) { + if(curPlayerSkin[playerid] == MIN_SKIN_ID) { + curPlayerSkin[playerid] = MAX_SKIN_ID; + } + else { + curPlayerSkin[playerid]--; + } + while(IsInvalidSkin(curPlayerSkin[playerid])) { + curPlayerSkin[playerid]--; + } + + format(cString, 128, "Skin ID: %d", curPlayerSkin[playerid]); + GameTextForPlayer(playerid, cString, 1500, 3); + SetPlayerSkin(playerid, curPlayerSkin[playerid]); + } + + // Action key exits skin selection + if(keys & KEY_ACTION) + { + SetCameraBehindPlayer(playerid); + TogglePlayerControllable(playerid, 1); + + format(cString, 128, "[SUCCESS]: You have changed to SKINID %d", curPlayerSkin[playerid]); + SendClientMessage(playerid, COLOR_GREEN, cString); + + gPlayerStatus[playerid] = 0; + KillTimer(gPlayerTimers[playerid]); + } +} +#endif + +#if CAME_SELECT == true +public CameraSelect(playerid) +{ + // CMODE_A 0 Up/Down = IncreaseZ/DecreaseZ; Left/Right = IncreaseX/DecreaseX; Num4/Num6 = IncreaseY/DecreaseY + // CMODE_B 1 Up/Down = Rotate Up/Down; Left/Right = Rotate Left/Right; Num4/Num6 = Move Left/Right + + new keys, updown, leftright; + + GetPlayerKeys(playerid, keys, updown, leftright); + + printf("Player (%d) keys = %d, updown = %d, leftright = %d", playerid, keys, updown, leftright); + + if (curPlayerCamD[playerid][CMODE] == CMODE_A) + { + if (leftright == KEY_RIGHT) { + curPlayerCamD[playerid][CPOS_X] += curPlayerCamD[playerid][RATE]; + curPlayerCamD[playerid][CLOO_X] += curPlayerCamD[playerid][RATE]; + + SetPlayerPos(playerid, curPlayerCamD[playerid][CPOS_X], curPlayerCamD[playerid][CPOS_Y], curPlayerCamD[playerid][CPOS_Z]); + + SetPlayerCameraPos(playerid, curPlayerCamD[playerid][CPOS_X], curPlayerCamD[playerid][CPOS_Y], curPlayerCamD[playerid][CPOS_Z]); + SetPlayerCameraLookAt(playerid, curPlayerCamD[playerid][CLOO_X], curPlayerCamD[playerid][CLOO_Y], curPlayerCamD[playerid][CLOO_Z]); + } + + if (leftright == KEY_LEFT) { + curPlayerCamD[playerid][CPOS_X] -= curPlayerCamD[playerid][RATE]; + curPlayerCamD[playerid][CLOO_X] -= curPlayerCamD[playerid][RATE]; + + SetPlayerPos(playerid, curPlayerCamD[playerid][CPOS_X], curPlayerCamD[playerid][CPOS_Y], curPlayerCamD[playerid][CPOS_Z]); + + SetPlayerCameraPos(playerid, curPlayerCamD[playerid][CPOS_X], curPlayerCamD[playerid][CPOS_Y], curPlayerCamD[playerid][CPOS_Z]); + SetPlayerCameraLookAt(playerid, curPlayerCamD[playerid][CLOO_X], curPlayerCamD[playerid][CLOO_Y], curPlayerCamD[playerid][CLOO_Z]); + } + + if (updown == KEY_UP) { + curPlayerCamD[playerid][CPOS_Z] += curPlayerCamD[playerid][RATE]; + curPlayerCamD[playerid][CLOO_Z] += curPlayerCamD[playerid][RATE]; + + SetPlayerPos(playerid, curPlayerCamD[playerid][CPOS_X], curPlayerCamD[playerid][CPOS_Y], curPlayerCamD[playerid][CPOS_Z]); + + SetPlayerCameraPos(playerid, curPlayerCamD[playerid][CPOS_X], curPlayerCamD[playerid][CPOS_Y], curPlayerCamD[playerid][CPOS_Z]); + SetPlayerCameraLookAt(playerid, curPlayerCamD[playerid][CLOO_X], curPlayerCamD[playerid][CLOO_Y], curPlayerCamD[playerid][CLOO_Z]); + } + + if (updown == KEY_DOWN) { + curPlayerCamD[playerid][CPOS_Z] -= curPlayerCamD[playerid][RATE]; + curPlayerCamD[playerid][CLOO_Z] -= curPlayerCamD[playerid][RATE]; + + SetPlayerPos(playerid, curPlayerCamD[playerid][CPOS_X], curPlayerCamD[playerid][CPOS_Y], curPlayerCamD[playerid][CPOS_Z]); + + SetPlayerCameraPos(playerid, curPlayerCamD[playerid][CPOS_X], curPlayerCamD[playerid][CPOS_Y], curPlayerCamD[playerid][CPOS_Z]); + SetPlayerCameraLookAt(playerid, curPlayerCamD[playerid][CLOO_X], curPlayerCamD[playerid][CLOO_Y], curPlayerCamD[playerid][CLOO_Z]); + } + + if (keys & KEY_ANALOG_RIGHT) { + curPlayerCamD[playerid][CPOS_Y] += curPlayerCamD[playerid][RATE]; + curPlayerCamD[playerid][CLOO_Y] += curPlayerCamD[playerid][RATE]; + + SetPlayerPos(playerid, curPlayerCamD[playerid][CPOS_X], curPlayerCamD[playerid][CPOS_Y], curPlayerCamD[playerid][CPOS_Z]); + + SetPlayerCameraPos(playerid, curPlayerCamD[playerid][CPOS_X], curPlayerCamD[playerid][CPOS_Y], curPlayerCamD[playerid][CPOS_Z]); + SetPlayerCameraLookAt(playerid, curPlayerCamD[playerid][CLOO_X], curPlayerCamD[playerid][CLOO_Y], curPlayerCamD[playerid][CLOO_Z]); + } + + + if (keys & KEY_ANALOG_LEFT) { + curPlayerCamD[playerid][CPOS_Y] -= curPlayerCamD[playerid][RATE]; + curPlayerCamD[playerid][CLOO_Y] -= curPlayerCamD[playerid][RATE]; + + SetPlayerPos(playerid, curPlayerCamD[playerid][CPOS_X], curPlayerCamD[playerid][CPOS_Y], curPlayerCamD[playerid][CPOS_Z]); + + SetPlayerCameraPos(playerid, curPlayerCamD[playerid][CPOS_X], curPlayerCamD[playerid][CPOS_Y], curPlayerCamD[playerid][CPOS_Z]); + SetPlayerCameraLookAt(playerid, curPlayerCamD[playerid][CLOO_X], curPlayerCamD[playerid][CLOO_Y], curPlayerCamD[playerid][CLOO_Z]); + } + } + + + if(curPlayerCamD[playerid][CMODE] == CMODE_B) + { + if (leftright == KEY_RIGHT) { + // Rotate Y + + } + + if (leftright == KEY_LEFT) { + // Rotate Y - + } + + if (updown == KEY_UP) { + // Rotate X + + } + + if (updown == KEY_DOWN) { + // Rotate X - + } + + if (keys & KEY_ANALOG_RIGHT) { + // Rotate Z + + } + + if (keys & KEY_ANALOG_LEFT) { + // Rotate Z - + } + } + + if (keys & KEY_ACTION) + { + SetCameraBehindPlayer(playerid); + + new + File:F_CAMERA = fopen("CAMERA.txt", io_append); + + if( F_CAMERA ) + { + new + cString[512], h, m, s, Y, M, D; + + getdate(Y, M, D); + gettime(h, m, s); + + format(cString, sizeof( cString ), "// %d-%d-%d @ %d:%d:%d\r\nSetPlayerCameraPos(playerid, %f, %f, %f);\r\nSetPlayerCameraLookAt(playerid, %f, %f, %f);\r\n", D, M, Y, h, m, s,curPlayerCamD[playerid][CPOS_X],curPlayerCamD[playerid][CPOS_Y],curPlayerCamD[playerid][CPOS_Z],curPlayerCamD[playerid][CLOO_X],curPlayerCamD[playerid][CLOO_Y],curPlayerCamD[playerid][CLOO_Z]); + + fwrite(F_CAMERA, cString); + fclose(F_CAMERA); + + printf("\n%s\n",cString); + + SendClientMessage( playerid, COLOR_GREEN, "Current camera data saved to 'CAMERA.txt'" ); + } + else + print("Failed to create the file \"CAMERA.txt\".\n"); + + TogglePlayerControllable(playerid, 1); + + KillTimer(gPlayerTimers[playerid]); + + gPlayerStatus[playerid] = 0; + } +} + +#endif + +#if VEHI_SELECT == true +public VehicleSelect(playerid) +{ + /* + // Make sure the player is not in skin selection before continuing + if (gPlayerStatus[playerid] != VEHI_SEL_STAT) { + KillTimer(skinTimerID[playerid]); + return; + } + */ + + new keys, updown, leftright; + + GetPlayerKeys(playerid, keys, updown, leftright); + + new cString[128]; + + // Right key increases Vehicle MODELID + if (leftright == KEY_RIGHT) { + if(curPlayerVehM[playerid] == MAX_VEHI_ID) { + curPlayerVehM[playerid] = MIN_VEHI_ID; + } + else { + curPlayerVehM[playerid]++; + } + + format(cString, 128, "Model ID: %d~n~Vehicle Name: %s", curPlayerVehM, aVehicleNames[curPlayerVehM[playerid] - MIN_VEHI_ID]); + GameTextForPlayer(playerid, cString, 1500, 3); + + new Float:x, Float:y, Float:z, Float:a; + + GetPlayerPos(playerid, x, y, z); + GetXYInFrontOfPlayer(playerid, x, y, VEHI_DIS); + GetPlayerFacingAngle(playerid, a); + + DestroyVehicle(curPlayerVehI[playerid]); + curServerVehP[curPlayerVehI[playerid]][spawn] = false; + + curPlayerVehI[playerid] = CreateVehicle(curPlayerVehM[playerid], x, y, z + 2.0, a + 90.0, -1, -1, 5000); + printf( "vsel vehicle select id = %d", curPlayerVehI[playerid] ); + + LinkVehicleToInterior(curPlayerVehI[playerid], GetPlayerInterior(playerid)); + + curServerVehP[curPlayerVehI[playerid]][spawn] = true; + curServerVehP[curPlayerVehI[playerid]][vmodel] = curPlayerVehM[playerid]; + curServerVehP[curPlayerVehI[playerid]][vInt] = GetPlayerInterior(playerid); + } + + // Left key decreases Vehicle MODELID + if(leftright == KEY_LEFT) { + if(curPlayerVehM[playerid] == MIN_VEHI_ID) { + curPlayerVehM[playerid] = MAX_VEHI_ID; + } + else { + curPlayerVehM[playerid]--; + } + + format(cString, 128, "Model ID: %d~n~Vehicle Name: %s", curPlayerVehM, aVehicleNames[curPlayerVehM[playerid] - MIN_VEHI_ID]); + GameTextForPlayer(playerid, cString, 1500, 3); + + new Float:x, Float:y, Float:z, Float:a; + + GetPlayerPos(playerid, x, y, z); + GetXYInFrontOfPlayer(playerid, x, y, VEHI_DIS); + GetPlayerFacingAngle(playerid, a); + + DestroyVehicle(curPlayerVehI[playerid]); + curServerVehP[curPlayerVehI[playerid]][spawn] = false; + + curPlayerVehI[playerid] = CreateVehicle(curPlayerVehM[playerid], x, y, z + 2.0, a + 90.0, -1, -1, 5000); + printf( "vsel vehicle select id = %d", curPlayerVehI[playerid] ); + + LinkVehicleToInterior(curPlayerVehI[playerid], GetPlayerInterior(playerid)); + + curServerVehP[curPlayerVehI[playerid]][spawn] = true; + curServerVehP[curPlayerVehI[playerid]][vmodel] = curPlayerVehM[playerid]; + curServerVehP[curPlayerVehI[playerid]][vInt] = GetPlayerInterior(playerid); + } + + // Action key exits vehicle selection + if(keys & KEY_ACTION) + { + SetCameraBehindPlayer(playerid); + TogglePlayerControllable(playerid, 1); + + format(cString, 128, "[SUCCESS]: Spawned a \"%s\" (MODELID: %d, VEHICLEID: %d)", aVehicleNames[curPlayerVehM[playerid] - MIN_VEHI_ID], curPlayerVehM[playerid], curPlayerVehI[playerid]); + SendClientMessage(playerid, COLOR_GREEN, cString); + + gPlayerStatus[playerid] = 0; + KillTimer(gPlayerTimers[playerid]); + } +} +#endif + +#if OBJE_SELECT == true +public ObjectSelect( playerid ) +{ + new keys, updown, leftright; + + GetPlayerKeys( playerid, keys, updown, leftright ); + + new cString[ 128 ]; + + switch ( curPlayerObjM[ playerid ][ OBJ_MOD ] ) + { + case O_MODE_SELECTOR: + { + if ( updown == KEY_UP) + { + curPlayerObjM[ playerid ][ OBJ_MDL ] += 10; + + if ( curPlayerObjM[ playerid ][ OBJ_MDL ] >= MAX_OBJE_ID ) + { + curPlayerObjM[ playerid ][ OBJ_MDL ] = MIN_OBJE_ID; + } + + while ( !IsValidModel( curPlayerObjM[ playerid ][ OBJ_MDL ] ) ) + { + curPlayerObjM[ playerid ][ OBJ_MDL ]++; + } + + DestroyObject( curPlayerObjI[ playerid ] ); + curPlayerObjI[ playerid ] = CreateObject( curPlayerObjM[ playerid ][ OBJ_MDL ], curPlayerObjM[ playerid ][ OBJ_X ], + curPlayerObjM[ playerid ][ OBJ_Y ], curPlayerObjM[ playerid ][ OBJ_Z ], + curPlayerObjM[ playerid ][ OBJ_RX ], curPlayerObjM[ playerid ][ OBJ_RY ], curPlayerObjM[ playerid ][ OBJ_RZ ] + ); + + format( cString, 128, "Model ID: %d", curPlayerObjM[ playerid ][ OBJ_MDL ] ); + GameTextForPlayer(playerid, cString, 1500, 3); + } + + if ( updown == KEY_DOWN) + { + curPlayerObjM[ playerid ][ OBJ_MDL ] -= 10; + + if ( curPlayerObjM[ playerid ][ OBJ_MDL ] <= MIN_OBJE_ID ) + { + curPlayerObjM[ playerid ][ OBJ_MDL ] = MAX_OBJE_ID; + } + + while ( !IsValidModel( curPlayerObjM[ playerid ][ OBJ_MDL ] ) ) + { + curPlayerObjM[ playerid ][ OBJ_MDL ]--; + } + + DestroyObject( curPlayerObjI[ playerid ] ); + curPlayerObjI[ playerid ] = CreateObject( curPlayerObjM[ playerid ][ OBJ_MDL ], curPlayerObjM[ playerid ][ OBJ_X ], + curPlayerObjM[ playerid ][ OBJ_Y ], curPlayerObjM[ playerid ][ OBJ_Z ], + curPlayerObjM[ playerid ][ OBJ_RX ], curPlayerObjM[ playerid ][ OBJ_RY ], curPlayerObjM[ playerid ][ OBJ_RZ ] + ); + + format( cString, 128, "Model ID: %d", curPlayerObjM[ playerid ][ OBJ_MDL ] ); + GameTextForPlayer(playerid, cString, 1500, 3); + } + + if ( leftright == KEY_LEFT) + { + curPlayerObjM[ playerid ][ OBJ_MDL ]--; + + if ( curPlayerObjM[ playerid ][ OBJ_MDL ] <= MIN_OBJE_ID ) + { + curPlayerObjM[ playerid ][ OBJ_MDL ] = MAX_OBJE_ID; + } + + while ( !IsValidModel( curPlayerObjM[ playerid ][ OBJ_MDL ] ) ) + { + curPlayerObjM[ playerid ][ OBJ_MDL ]--; + } + + DestroyObject( curPlayerObjI[ playerid ] ); + curPlayerObjI[ playerid ] = CreateObject( curPlayerObjM[ playerid ][ OBJ_MDL ], curPlayerObjM[ playerid ][ OBJ_X ], + curPlayerObjM[ playerid ][ OBJ_Y ], curPlayerObjM[ playerid ][ OBJ_Z ], + curPlayerObjM[ playerid ][ OBJ_RX ], curPlayerObjM[ playerid ][ OBJ_RY ], curPlayerObjM[ playerid ][ OBJ_RZ ] + ); + + format( cString, 128, "Model ID: %d", curPlayerObjM[ playerid ][ OBJ_MDL ] ); + GameTextForPlayer(playerid, cString, 1500, 3); + } + + if ( leftright == KEY_RIGHT) + { + curPlayerObjM[ playerid ][ OBJ_MDL ]++; + + if ( curPlayerObjM[ playerid ][ OBJ_MDL ] >= MAX_OBJE_ID ) + { + curPlayerObjM[ playerid ][ OBJ_MDL ] = MIN_OBJE_ID; + } + + while ( !IsValidModel( curPlayerObjM[ playerid ][ OBJ_MDL ] ) ) + { + curPlayerObjM[ playerid ][ OBJ_MDL ]++; + } + + DestroyObject( curPlayerObjI[ playerid ] ); + curPlayerObjI[ playerid ] = CreateObject( curPlayerObjM[ playerid ][ OBJ_MDL ], curPlayerObjM[ playerid ][ OBJ_X ], + curPlayerObjM[ playerid ][ OBJ_Y ], curPlayerObjM[ playerid ][ OBJ_Z ], + curPlayerObjM[ playerid ][ OBJ_RX ], curPlayerObjM[ playerid ][ OBJ_RY ], curPlayerObjM[ playerid ][ OBJ_RZ ] + ); + + format( cString, 128, "Model ID: %d", curPlayerObjM[ playerid ][ OBJ_MDL ] ); + GameTextForPlayer(playerid, cString, 1500, 3); + } + } + + case O_MODE_MOVER: + { + if ( updown == KEY_UP) + { + curPlayerObjM[ playerid ][ OBJ_Z ] += pObjectRate[ playerid ][ OBJ_RATE_MOVE ]; + curPlayerCamD[ playerid ][ CPOS_Z ] += pObjectRate[ playerid ][ OBJ_RATE_MOVE ]; + curPlayerCamD[ playerid ][ CLOO_Z ] += pObjectRate[ playerid ][ OBJ_RATE_MOVE ]; + } + + if ( updown == KEY_DOWN) + { + curPlayerObjM[ playerid ][ OBJ_Z ] -= pObjectRate[ playerid ][ OBJ_RATE_MOVE ]; + curPlayerCamD[ playerid ][ CPOS_Z ] -= pObjectRate[ playerid ][ OBJ_RATE_MOVE ]; + curPlayerCamD[ playerid ][ CLOO_Z ] -= pObjectRate[ playerid ][ OBJ_RATE_MOVE ]; + } + + if ( leftright == KEY_LEFT) + { + curPlayerObjM[ playerid ][ OBJ_Y ] -= pObjectRate[ playerid ][ OBJ_RATE_MOVE ]; + curPlayerCamD[ playerid ][ CPOS_Y ] -= pObjectRate[ playerid ][ OBJ_RATE_MOVE ]; + curPlayerCamD[ playerid ][ CLOO_Y ] -= pObjectRate[ playerid ][ OBJ_RATE_MOVE ]; + } + + if ( leftright == KEY_RIGHT) + { + curPlayerObjM[ playerid ][ OBJ_Y ] += pObjectRate[ playerid ][ OBJ_RATE_MOVE ]; + curPlayerCamD[ playerid ][ CPOS_Y ] += pObjectRate[ playerid ][ OBJ_RATE_MOVE ]; + curPlayerCamD[ playerid ][ CLOO_Y ] += pObjectRate[ playerid ][ OBJ_RATE_MOVE ]; + } + + if ( keys & KEY_ANALOG_LEFT ) + { + curPlayerObjM[ playerid ][ OBJ_Y ] -= pObjectRate[ playerid ][ OBJ_RATE_MOVE ]; + curPlayerCamD[ playerid ][ CPOS_Y ] -= pObjectRate[ playerid ][ OBJ_RATE_MOVE ]; + curPlayerCamD[ playerid ][ CLOO_Y ] -= pObjectRate[ playerid ][ OBJ_RATE_MOVE ]; + } + + if ( keys & KEY_ANALOG_LEFT ) + { + curPlayerObjM[ playerid ][ OBJ_X ] += pObjectRate[ playerid ][ OBJ_RATE_MOVE ]; + curPlayerCamD[ playerid ][ CPOS_X ] += pObjectRate[ playerid ][ OBJ_RATE_MOVE ]; + curPlayerCamD[ playerid ][ CLOO_X ] += pObjectRate[ playerid ][ OBJ_RATE_MOVE ]; + } + + SetPlayerPos( playerid, curPlayerCamD[playerid][CPOS_X], curPlayerCamD[playerid][CPOS_Y], curPlayerCamD[playerid][CPOS_Z] ); + SetObjectPos( curPlayerObjI[ playerid ], curPlayerObjM[ playerid ][ OBJ_X ], curPlayerObjM[ playerid ][ OBJ_Y ], curPlayerObjM[ playerid ][ OBJ_Z ] ); + SetPlayerCameraPos(playerid, curPlayerCamD[playerid][CPOS_X], curPlayerCamD[playerid][CPOS_Y], curPlayerCamD[playerid][CPOS_Z]); + SetPlayerCameraLookAt(playerid, curPlayerCamD[playerid][CLOO_X], curPlayerCamD[playerid][CLOO_Y], curPlayerCamD[playerid][CLOO_Z]); + } + + case O_MODE_ROTATOR: + { + if ( updown == KEY_UP) + { + curPlayerObjM[ playerid ][ OBJ_RZ ] += pObjectRate[ playerid ][ OBJ_RATE_ROT ]; + } + + if ( updown == KEY_DOWN) + { + curPlayerObjM[ playerid ][ OBJ_RZ ] -= pObjectRate[ playerid ][ OBJ_RATE_ROT ]; + + } + + if ( leftright == KEY_LEFT) + { + curPlayerObjM[ playerid ][ OBJ_RY ] -= pObjectRate[ playerid ][ OBJ_RATE_ROT ]; + } + + if ( leftright == KEY_RIGHT) + { + curPlayerObjM[ playerid ][ OBJ_RY ] += pObjectRate[ playerid ][ OBJ_RATE_ROT ]; + } + + if ( keys & KEY_ANALOG_LEFT ) + { + curPlayerObjM[ playerid ][ OBJ_RY ] -= pObjectRate[ playerid ][ OBJ_RATE_ROT ]; + } + + if ( keys & KEY_ANALOG_LEFT ) + { + curPlayerObjM[ playerid ][ OBJ_RX ] += pObjectRate[ playerid ][ OBJ_RATE_ROT ]; + } + + SetObjectRot( curPlayerObjI[ playerid ], curPlayerObjM[ playerid ][ OBJ_RX ], curPlayerObjM[ playerid ][ OBJ_RY ], curPlayerObjM[ playerid ][ OBJ_RZ ] ); + } + } + + if ( keys & KEY_ACTION ) + { + gPlayerStatus[ playerid ] = 0; + TogglePlayerControllable( playerid, 1 ); + SetCameraBehindPlayer( playerid ); + KillTimer( gPlayerTimers[playerid] ); + } + +} +#endif + +IsInvalidSkin(skinid) +{ // Created by Simon + // Checks whether the skinid parsed is crashable or not. + + #define MAX_BAD_SKINS 14 + + new badSkins[MAX_BAD_SKINS] = { + 3, 4, 5, 6, 8, 42, 65, 74, 86, + 119, 149, 208, 273, 289 + }; + + for (new i = 0; i < MAX_BAD_SKINS; i++) { + if (skinid == badSkins[i]) return true; + } + + return false; +} + +GetXYInFrontOfPlayer(playerid, &Float:x, &Float:y, Float:distance) +{ // Created by Y_Less + + new Float:a; + + GetPlayerPos(playerid, x, y, a); + GetPlayerFacingAngle(playerid, a); + + if (GetPlayerVehicleID(playerid)) { + GetVehicleZAngle(GetPlayerVehicleID(playerid), a); + } + + x += (distance * floatsin(-a, degrees)); + y += (distance * floatcos(-a, degrees)); +} + +strtok(const string[], &index) +{ // Created by Compuphase + + new length = strlen(string); + while ((index < length) && (string[index] <= ' ')) + { + index++; + } + + new offset = index; + new result[20]; + while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1))) + { + result[index - offset] = string[index]; + index++; + } + result[index - offset] = EOS; + return result; +} + +GetVehicleModelIDFromName(vname[]) +{ + for(new i = 0; i < 211; i++) + { + if ( strfind(aVehicleNames[i], vname, true) != -1 ) + return i + MIN_VEHI_ID; + } + return -1; +} + +GetWeaponModelIDFromName(wname[]) +{ + for(new i = 0; i < 48; i++) { + if (i == 19 || i == 20 || i == 21) continue; + if (strfind(aWeaponNames[i], wname, true) != -1) { + return i; + } + } + return -1; +} + +IsValidModel(modelid) +{ + // Created by Y_Less. + + static modeldat[] = + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -128, + -515899393, -134217729, -1, -1, 33554431, -1, -1, -1, -14337, -1, -33, + 127, 0, 0, 0, 0, 0, -8388608, -1, -1, -1, -16385, -1, -1, -1, -1, -1, + -1, -1, -33, -1, -771751937, -1, -9, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 33554431, -25, -1, -1, -1, -1, -1, -1, + -1073676289, -2147483648, 34079999, 2113536, -4825600, -5, -1, -3145729, + -1, -16777217, -63, -1, -1, -1, -1, -201326593, -1, -1, -1, -1, -1, + -257, -1, 1073741823, -133122, -1, -1, -65, -1, -1, -1, -1, -1, -1, + -2146435073, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1073741823, -64, -1, + -1, -1, -1, -2635777, 134086663, 0, -64, -1, -1, -1, -1, -1, -1, -1, + -536870927, -131069, -1, -1, -1, -1, -1, -1, -1, -1, -16384, -1, + -33554433, -1, -1, -1, -1, -1, -1610612737, 524285, -128, -1, + 2080309247, -1, -1, -1114113, -1, -1, -1, 66977343, -524288, -1, -1, -1, + -1, -2031617, -1, 114687, -256, -1, -4097, -1, -4097, -1, -1, + 1010827263, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -32768, -1, -1, -1, -1, -1, + 2147483647, -33554434, -1, -1, -49153, -1148191169, 2147483647, + -100781080, -262145, -57, 134217727, -8388608, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1048577, -1, -449, -1017, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1835009, -2049, -1, -1, -1, -1, -1, -1, + -8193, -1, -536870913, -1, -1, -1, -1, -1, -87041, -1, -1, -1, -1, -1, + -1, -209860, -1023, -8388609, -2096897, -1, -1048577, -1, -1, -1, -1, + -1, -1, -897, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1610612737, + -3073, -28673, -1, -1, -1, -1537, -1, -1, -13, -1, -1, -1, -1, -1985, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1056964609, -1, -1, -1, + -1, -1, -1, -1, -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -236716037, -1, -1, -1, -1, -1, -1, -1, -536870913, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -2097153, -2109441, -1, 201326591, -4194304, -1, -1, + -241, -1, -1, -1, -1, -1, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -32768, -1, -1, -1, -2, -671096835, -1, -8388609, -66323585, -13, + -1793, -32257, -247809, -1, -1, -513, 16252911, 0, 0, 0, -131072, + 33554383, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 8356095, 0, 0, 0, 0, 0, + 0, -256, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -268435449, -1, -1, -2049, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 92274627, -65536, -2097153, -268435457, 591191935, 1, 0, -16777216, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 127 + }; + if ((modelid >= 0) && ((modelid / 32) < sizeof (modeldat)) && (modeldat[modelid / 32] & (1 << (modelid % 32)))) + { + return 1; + } + return 0; +} diff --git a/filterscripts/gl_actions.amx b/filterscripts/gl_actions.amx new file mode 100644 index 0000000000000000000000000000000000000000..15e7a992cae3a3875bee6f4cf34de2ee7cdecd26 GIT binary patch literal 8582 zcmeHLYiv{J8U9QRaT?Q_k*Oe}&FiwA1k6YZ=}<*WLN0&^#EnBsIwt1CC$WcbvK`_m z8N6;nK_%6ys?yZ0qpa%GX;-b?)J>g2%UD%$zu#}$k7~b)ru~2)L+p9K^PS`4*om~C zlj0-${VwnOeDD1`$;)38;?BQZE~jvb)-oY{%Y+DT$M-EE9^$iFV2rQFA;fC+Z32Cx zLWp&so=PFMg8DFz@cuj@hCxT?3b7CLDCP%2`SWWUl`J=&MJ=Kzk#e(rrx1P1H#p8Nke%`7FGhs_&lRg~C1T%U| zI2a$$t>r*6I20G@Oe(6!MRPJ49d3?CV!=!#5f_Z!nhFjD!ik~wM9MhXTHO!{>BXxp zDV(ZXOk30Xx*;h52IDltfaXjl*caAAoxR^@Z&~Ysq}~?^Mw|Pj z?HkjjxC7Bd1}23>mmW*((o3<3_2xm+-J&I`2UC_$)2!gGU{s`o(6T+62ttEQDiR+M zh_x<~GP-HCBPc7rm8D>!Dy}`S5fY9j#5+3Tjs7Q_bgjd;r6c0c`F?& zb2Ze{nA^?_*r1(X_AFgVtqf4^S&#*NSWi8VKCGo7^5=2Js`EI{j#UFZOP%h8)HGHN z%rP%8$5-bn=0B_jDDTnm!evWpOrd3u7o7J}brI_m)B_&KJF94r{65-N539=DP7giT zxHp4A6+K7Y7~;IWS)BK>Cs$GFsLxeU53_2b&R17kS5xP$tFBvAS5@bMLuzTn;qw^` z^kSKthW8CDd7{#Rqh{dGRn$&4LE1$lbA0Zp(o#`P*q-rmBB4!g*Ct!1oM~fXfy3@; zwOS0@4y=;K<2#abp%2?>}6XUUUBkxjcvT$HcsZp^s&o6skKjR;`DLYw)2V8KB=}(R@o;Z`y^|d z9LZ~GnV>?6EP!ECY_~B