587 Commits

Author SHA1 Message Date
Vortrex
17c3daddd7 Merge branch 'nightly' into ragemp 2022-12-11 02:03:42 -06:00
Vortrex
b228981e05 Reset paintball on last player leave + payout 2022-12-11 02:03:30 -06:00
Vortrex
ba624f13c3 New query assoc native 2022-12-11 02:03:13 -06:00
Vortrex
8350edac74 Use new query assoc stuff 2022-12-11 02:02:55 -06:00
Vortrex
4cf72b610e Paintball players array 2022-12-11 02:02:45 -06:00
Vortrex
833f8872e2 Add entrance fee to business labels 2022-12-11 02:02:34 -06:00
Vortrex
0b564d66e8 Rename main.js to core.js for client 2022-12-11 02:01:10 -06:00
Vortrex
45ea3bd1ce Merge branch 'nightly' into ragemp 2022-12-10 01:55:10 -06:00
Vortrex
700e928bcc Increment script version 2022-12-10 01:54:55 -06:00
Vortrex
5044f6466e Add vehicle seat constants to shared 2022-12-10 01:54:42 -06:00
Vortrex
db40be7577 Use falling snow only 2022-12-10 01:54:11 -06:00
Vortrex
268a3a5f60 Add new script cvars system 2022-12-10 01:54:01 -06:00
Vortrex
df05c18499 Rename client main to core to match server 2022-12-10 01:53:47 -06:00
Vortrex
5862349117 New util for is player owner of vehicle 2022-11-21 11:38:41 -06:00
Vortrex
0703ccb1a3 Use cloudy/foggy weather for snow in SA 2022-11-07 13:37:19 -06:00
Vortrex
f9d1e8c384 Remove old workaround for IV 2022-11-07 13:36:52 -06:00
Vortrex
cab6eace3a Vehicle engine util 2022-11-07 13:36:43 -06:00
Vortrex
e1c82789d7 Unfinished command 2022-11-07 13:36:29 -06:00
Vortrex
eae9e8266b Remove engine workaround 2022-11-07 13:36:22 -06:00
Vortrex
2aefa09340 Fixes for new IV sync 2022-11-07 13:35:49 -06:00
Vortrex
01ba414e9c Fix object model from params 2022-11-02 06:52:11 -05:00
Vortrex
fdf2d4a02f Enable server elements for IV (testing) 2022-11-02 06:52:01 -05:00
Vortrex
b1f9042b96 Fallback country ISO code if GeoIP fails 2022-11-02 06:51:47 -05:00
Vortrex
757df5db86 Don't force snow when starting/stopping 2022-11-02 06:51:34 -05:00
Vortrex
20d8b17099 Use older game char spawn mechanism for IV 2022-11-02 06:51:13 -05:00
Vortrex
39ec134b25 Handle reset keybinds prompt 2022-11-02 06:50:53 -05:00
Vortrex
79812375f1 Remove some extra IV workarounds 2022-11-02 06:50:33 -05:00
Vortrex
95abb20b5e Fallback country ISO code if GeoIP fails 2022-11-02 06:50:03 -05:00
Vortrex
44895aa2d0 Comment keybind combo (unfinished) 2022-11-02 06:49:46 -05:00
Vortrex
cf0c578699 Fix command help 2022-11-02 06:49:29 -05:00
Vortrex
d144ef954d Comment some unused stuff 2022-11-02 06:49:21 -05:00
Vortrex
c091cb249a JSDoc 2022-11-02 06:48:49 -05:00
Vortrex
d7eb7d3e3a Force snow if enabled 2022-11-02 06:48:40 -05:00
Vortrex
160090674a Fix wrong var name in local cash 2022-11-02 06:48:29 -05:00
Vortrex
0e32d8bed8 Add probability bool and weather data util 2022-10-29 10:08:50 -05:00
Vortrex
2e75230d38 Shorten floats in near veh + don't take money for admin cmds 2022-10-29 10:08:32 -05:00
Vortrex
0f49ebfa63 Force ground snow 2022-10-29 10:08:09 -05:00
Vortrex
7f1ab3a3e4 Fix property enter/exit 2022-10-29 10:08:02 -05:00
Vortrex
afed90a2eb Fix DM message + show sent message 2022-10-29 10:07:49 -05:00
Vortrex
3eda3acef7 Set player distance to infinite + fix veh save 2022-10-29 10:07:36 -05:00
Vortrex
c75ef6b89a Reduce default log level 2022-10-29 10:07:06 -05:00
Vortrex
a817db618b Custom weather array 2022-10-29 10:06:57 -05:00
Vortrex
455e87bd87 Set default current pickup to null 2022-10-29 10:05:56 -05:00
Vortrex
98fda983a5 Show reply action tip if not seen 2022-10-29 10:05:43 -05:00
Vortrex
1eac24669f Force ground snow 2022-10-29 10:05:28 -05:00
Vortrex
bc95fff5d3 Merge branch 'nightly' into ragemp 2022-10-25 22:57:40 -05:00
Vortrex
82ced29c71 More prompt stuff to new script 2022-10-25 22:42:24 -05:00
Vortrex
86906cbf6b Don't retrigger player spawn event 2022-10-25 22:42:09 -05:00
Vortrex
b0c91a9d4e Player GUI state util 2022-10-25 22:41:54 -05:00
Vortrex
c67b0a8dad Add server rule util 2022-10-25 22:41:31 -05:00
Vortrex
a9498f19ea Add prompt script 2022-10-25 22:41:24 -05:00
Vortrex
54663dac0d Combine time, weather & snow into one line 2022-10-25 22:41:15 -05:00
Vortrex
ee4d4e3621 Chance of snow by month 2022-10-25 22:40:44 -05:00
Vortrex
49dd7c0e21 Fix wrong cmd handler for item type capacity 2022-10-25 22:40:13 -05:00
Vortrex
775333f788 Use GeoIP database path 2022-10-25 22:39:34 -05:00
Vortrex
f0536caf4e Use item type's order value instead of input 2022-10-25 22:39:15 -05:00
Vortrex
e2d6973ba1 Add prompt script to meta.xml 2022-10-25 22:27:46 -05:00
Vortrex
6cf4f337e8 Fix spawning all ground items + take/put item owner 2022-10-25 22:27:35 -05:00
Vortrex
57b4099037 Add object index from model util 2022-10-19 23:58:52 -05:00
Vortrex
a691949286 Add some features to supported features table 2022-10-19 23:58:32 -05:00
Vortrex
f14c3e8610 Set long stream distance before teleporting veh 2022-10-19 23:58:01 -05:00
Vortrex
6e7a5780cc Add element stream distance getters 2022-10-19 23:57:47 -05:00
Vortrex
74b766ee58 Use proper string replaces 2022-10-19 23:57:21 -05:00
Vortrex
4185f3b17d Wrong locale string name 2022-10-19 23:57:04 -05:00
Vortrex
755b0a4867 Fixes for item type cmds + show values in inventories 2022-10-19 23:56:54 -05:00
Vortrex
4631e58eda Fix house labels not updating 2022-10-19 23:56:32 -05:00
Vortrex
16a91ef3b1 Fix wrong line in veh help 2022-10-19 23:56:04 -05:00
Vortrex
472136a7fb String change 2022-10-19 23:55:56 -05:00
Vortrex
ce6f6e71d1 Cleanup 2022-10-19 23:55:45 -05:00
Vortrex
2d25539036 Add item type drop model command 2022-10-19 23:55:38 -05:00
Vortrex
08721d1273 Show admin's title in admin chat 2022-10-19 23:55:26 -05:00
Vortrex
5360a46485 Fix wrong prompt const names 2022-10-19 23:54:58 -05:00
Vortrex
18f27dce8e Use game feature util for scale 2022-10-19 23:54:45 -05:00
Vortrex
345b8ba1e9 Fix colours not showing with timestamps enabled 2022-10-19 23:54:33 -05:00
Vortrex
8ee9aa2347 Disable unfinished GUI for now 2022-10-19 22:09:05 -05:00
Vortrex
1d00adb7e3 Use fallback if pickup data not available 2022-10-19 22:08:54 -05:00
Vortrex
5eb459b308 Fix house enter sometimes not working 2022-10-19 21:40:52 -05:00
Vortrex
2e2e44566d Revert item action bar 2022-10-18 17:43:19 -05:00
Vortrex
c725852b0b Revert "Use full game width for item action bar"
This reverts commit bb6a471396.
2022-10-18 17:41:06 -05:00
Vortrex
583e4c5252 Add GUI stuff to meta.xml 2022-10-17 15:53:54 -05:00
Vortrex
0aacfdd818 GUI fixes 2022-10-17 15:53:40 -05:00
Vortrex
0d57fb3186 Add RMP native 2022-10-17 00:36:48 -05:00
Vortrex
79893be66f Announce more things to discord 2022-10-16 17:11:54 -05:00
Vortrex
d9f4ec7c6f Fix biz/house price not being shown 2022-10-16 17:08:52 -05:00
Vortrex
9c8593e833 Add + use text file util 2022-10-15 17:11:35 -05:00
Vortrex
bf353c10aa Re-add index files for RAGEMP 2022-10-15 17:06:28 -05:00
Vortrex
5572e0bd93 Merge branch 'nightly' into ragemp 2022-10-15 17:00:36 -05:00
Vortrex
54703e2cd9 Add 2nd warehouse int type for GTA 3 2022-10-15 16:07:19 -05:00
Vortrex
a691c2a9d0 Fix wrong locale string name when using handcuffs 2022-10-14 15:19:03 -05:00
Vortrex
f0291cfe91 Use locale strings for some prompts 2022-10-14 15:18:37 -05:00
Vortrex
8df407c2c1 Send player chatbox states on spawn 2022-10-14 15:18:19 -05:00
Vortrex
9e6bcc0137 Add JSDoc for client account/subaccounts 2022-10-14 15:17:58 -05:00
Vortrex
660d1191f3 Fix a few job locale messages + fix del job loc cmd 2022-10-14 15:17:12 -05:00
Vortrex
89ed6d5023 Use radio station index + data func for veh info 2022-10-14 15:16:41 -05:00
Vortrex
b53542fbf6 Update property.js 2022-10-14 15:16:22 -05:00
Vortrex
427ecf7ea8 Fix player info showing wrong dates 2022-10-14 15:16:16 -05:00
Vortrex
0b7fb7bbbd Use disconnect name for client script verification fail 2022-10-14 15:16:06 -05:00
Vortrex
eaac0fd1a7 Fix for player ped anims 2022-10-14 15:15:51 -05:00
Vortrex
eeaf8aae8e Cleanup 2022-10-07 16:05:22 -05:00
Vortrex
0f4ce5a7fc Use locale string 2022-10-07 16:05:16 -05:00
Vortrex
c26bcb7076 Mark action tip seen when using walkie talkie 2022-10-07 16:05:09 -05:00
Vortrex
71d4bec436 Show more action tips 2022-10-07 16:04:49 -05:00
Vortrex
bb6a471396 Use full game width for item action bar 2022-10-07 16:04:36 -05:00
Vortrex
0ef0474b2e Add a few seats positions 2022-10-03 16:52:25 -05:00
Vortrex
91d21189dc Better checks for client data util 2022-10-03 16:52:13 -05:00
Vortrex
6dfb45ff8a Debug logging 2022-10-03 16:51:44 -05:00
Vortrex
d5841dc0e6 Clear stale client stuff on join (just in case) 2022-10-03 16:51:38 -05:00
Vortrex
2d3a9dbc4c Remove extra debug line 2022-10-03 16:51:19 -05:00
Vortrex
b4d9371db2 Debug logging 2022-10-03 16:50:59 -05:00
Vortrex
e072d8d2e4 Add duration and loop to some anim data 2022-10-03 14:17:04 -05:00
Vortrex
cad6d11a58 Use server engine state 2022-10-02 09:12:17 -05:00
Vortrex
8e9a92e1c2 Remove extra parked stuff 2022-10-02 09:12:00 -05:00
Vortrex
0d50c48305 Don't set sync flags in native 2022-10-02 09:11:52 -05:00
Vortrex
485d9023c1 Don't set sync flags + remove parked stuff 2022-10-02 09:11:40 -05:00
Vortrex
e1e912ae3c Don't set sync flags 2022-10-02 09:11:23 -05:00
Vortrex
34b84aeea0 Fix NPC saving and utils 2022-10-02 09:11:14 -05:00
Vortrex
36e2175075 Mark vehicle as server 2022-10-02 09:11:03 -05:00
Vortrex
84ad138763 Rename a few VC skins 2022-10-02 09:10:50 -05:00
Vortrex
ab4106e568 Shutdown server if required module fail 2022-09-29 11:16:29 -05:00
Vortrex
4948ba8f98 Add ped fall event for MafiaC + send jobs 2022-09-29 11:15:38 -05:00
Vortrex
94195d95d3 Fix house pickup for clientside 2022-09-29 11:15:16 -05:00
Vortrex
4f2c158192 Add locale from country ISO util 2022-09-29 11:15:02 -05:00
Vortrex
f3f2dd0e7d Check for scene when entering/exiting property 2022-09-29 11:14:51 -05:00
Vortrex
d34b10470c Add server shutdown native 2022-09-29 11:14:18 -05:00
Vortrex
a715cdcc9f Fix client house/business handling 2022-09-29 11:14:11 -05:00
Vortrex
e18b7c9b31 Fix NPCs 2022-09-29 11:13:53 -05:00
Vortrex
f0410ca5b8 Woops typo in locale string name 2022-09-29 11:13:37 -05:00
Vortrex
bc548cfae0 Update GeoIP database + move to folder 2022-09-29 11:13:18 -05:00
Vortrex
f9e7597c4c Tell player about available language for region 2022-09-29 11:12:54 -05:00
Vortrex
472e6c7177 Fix Mafia 1 map day/night cycle 2022-09-29 11:11:55 -05:00
Vortrex
8ba392e834 Debug logging + fix disconnect reason for query 2022-09-29 11:11:39 -05:00
Vortrex
d73246dd2b Add SalieriBar interior type 2022-09-29 11:11:23 -05:00
Vortrex
a59b4104f1 Wrong locale util name 2022-09-29 11:11:14 -05:00
Vortrex
4f6dac29cf Fix wrong util name being used in stopanim action tip 2022-09-29 11:10:22 -05:00
Vortrex
1e4cf380ff Fade camera net event 2022-09-29 11:09:55 -05:00
Vortrex
c1dedd3620 Add support for scene changing 2022-09-29 11:09:46 -05:00
Vortrex
3679d68896 Fix clientside houses 2022-09-29 11:09:29 -05:00
Vortrex
fd5efa45bd Add utils for GUI list 2022-09-29 11:09:21 -05:00
Vortrex
1ad22b48d4 Name clan manager buttons 2022-09-29 11:09:11 -05:00
Vortrex
01670a29fc Start working on business manager GUI 2022-09-29 11:08:57 -05:00
Vortrex
2d8895b8d7 Don't delay resource start/ready signals 2022-09-29 11:08:44 -05:00
Vortrex
7e7983b74a Add custom camera fade (unfinished) 2022-09-29 11:08:28 -05:00
Vortrex
cf5fb4d8f9 Fix clientside biz stuff 2022-09-29 11:08:15 -05:00
Vortrex
7ff030727a Fix nearvehs cmd, set indexes on addveh/tempveh 2022-09-24 06:18:06 -05:00
Vortrex
eb8debe48e Remove squirrel thread testing script file 2022-09-24 06:17:38 -05:00
Vortrex
132cb2254e Remove disconnect names from ragemp native 2022-09-24 06:17:24 -05:00
Vortrex
c7d8c3734b Align locale utils arg order 2022-09-24 06:17:11 -05:00
Vortrex
ad8f12b6e3 Mark action tip seen on job route start 2022-09-24 06:16:49 -05:00
Vortrex
67043af1a7 Fix disconnect event processing 2022-09-24 06:16:33 -05:00
Vortrex
460d9381d3 Use encode URI component for email 2022-09-24 06:16:21 -05:00
Vortrex
5d61b45ed6 Use locale strings for wealth/tax cmds 2022-09-24 06:16:09 -05:00
Vortrex
64a08ccd37 Use encode URI component for webhook 2022-09-24 06:14:45 -05:00
Vortrex
c9cf80e34c Remove testing try/catch on email 2022-09-24 06:14:30 -05:00
Vortrex
b24b5d726b Reset paintball & working states 2022-09-24 06:14:13 -05:00
Vortrex
0d9de6ec30 Add missing action tips in bitflag table 2022-09-24 06:13:45 -05:00
Vortrex
5b6c909b0b Fix parked vehicles being driveable 2022-09-24 06:13:23 -05:00
Vortrex
962334e1b7 Fix veh lights on GTA 2022-09-24 06:13:10 -05:00
Vortrex
8e2e5090c5 Add streaming volume for position util 2022-09-24 06:13:00 -05:00
Vortrex
fb038b955b Set veh send sync based on engine state 2022-09-24 06:12:49 -05:00
Vortrex
7349ab041d Setup cruise control stuff (unfinished) 2022-09-24 06:12:30 -05:00
Vortrex
5942cdf5f2 Update meta.xml 2022-09-24 06:11:45 -05:00
Vortrex
a2999a6c3f Remove unneeded JSDoc info 2022-09-22 05:24:17 -05:00
Vortrex
38cccf88a6 Add mouseCursor to supported features table 2022-09-22 05:23:57 -05:00
Vortrex
22f6ba32af Add map cycle for MafiaC, based on hour 2022-09-22 05:23:45 -05:00
Vortrex
962281f5f4 Don't check for SMTP module on start 2022-09-22 05:23:30 -05:00
Vortrex
338cfb7d38 Add staff note commands 2022-09-22 05:23:17 -05:00
Vortrex
056d35456c Use font based on game + map change warning netevent 2022-09-22 05:23:01 -05:00
Vortrex
604f9e7cd9 Cleanup 2022-09-22 05:22:42 -05:00
Vortrex
beb9f6cafe Add grouped locale string util for locale ID 2022-09-22 05:22:31 -05:00
Vortrex
51d5aba2a1 Woops wrong locale key name 2022-09-22 05:22:16 -05:00
Vortrex
b0652947cc Use more locale strings 2022-09-22 05:22:03 -05:00
Vortrex
e7655f1e70 Use disconnect name 2022-09-22 05:21:54 -05:00
Vortrex
a17923450a Add HTTP request support for email 2022-09-22 05:21:47 -05:00
Vortrex
5c5b255196 Use async/await for email 2022-09-22 05:21:37 -05:00
Vortrex
07af18c64e Use verbose log level for each add command handler 2022-09-22 05:21:23 -05:00
Vortrex
0542a3da5a Use disconnect name 2022-09-22 05:21:02 -05:00
Vortrex
eab0d96e5d Add new action tips flag names 2022-09-22 05:20:53 -05:00
Vortrex
4464b3f49a Use disconnect names 2022-09-22 05:20:45 -05:00
Vortrex
582fce8757 Use more locale strings 2022-09-22 05:20:22 -05:00
Vortrex
d80f04637c Init cursor script 2022-09-22 05:20:11 -05:00
Vortrex
40b63b3403 Add Mafia font for big/small game messages 2022-09-22 05:20:02 -05:00
Vortrex
47aa32d66f Add utils to remove all players from biz/house/vehs 2022-09-22 05:19:42 -05:00
Vortrex
ba900addc5 Add map change warning state 2022-09-22 05:19:27 -05:00
Vortrex
be476f5d9c Render logo on MafiaC 2022-09-22 05:19:13 -05:00
Vortrex
024051b9f8 Use primary text colour on buttons 2022-09-22 05:18:24 -05:00
Vortrex
a8a173e406 Don't disable locale chooser 2022-09-22 05:18:15 -05:00
Vortrex
853e5e6b3d New util to hide all background GUI (for dialog) 2022-09-22 05:18:01 -05:00
Vortrex
05ca5485f9 Wait 500ms before init 2022-09-22 05:17:41 -05:00
Vortrex
a7fed8751a Use info log level for script initialized message 2022-09-22 05:17:29 -05:00
Vortrex
8326561a58 Add script init functions 2022-09-22 05:17:05 -05:00
Vortrex
45c5372499 Custom cursor 2022-09-22 05:16:47 -05:00
Vortrex
1fd99729da Woops wrong game feature name 2022-09-20 03:31:53 -05:00
Vortrex
b7de1e054a Immediately call spawn event 2022-09-20 03:31:49 -05:00
Vortrex
67b57399f3 Wrong const name 2022-09-20 03:31:40 -05:00
Vortrex
61c6568641 Only check dimension when spawning 2022-09-20 03:31:18 -05:00
Vortrex
d0a544522f Woops wrong game feature name 2022-09-20 03:31:06 -05:00
Vortrex
b8d19d013a Add info log level CS 2022-09-20 03:30:58 -05:00
Vortrex
e72b54c3d4 Don't load locale config on locale chooser init 2022-09-20 03:30:39 -05:00
Vortrex
10b856541f Init locale chooser 2022-09-20 03:30:25 -05:00
Vortrex
0acdf692db Fix client resource start 2022-09-20 03:30:10 -05:00
Vortrex
b84fb4ee9a Update locale.json 2022-09-20 03:29:58 -05:00
Vortrex
9377ec1129 Update locale.json 2022-09-20 03:29:53 -05:00
Vortrex
26f3ad8cef Fix squirrel thread 2022-09-20 02:40:15 -05:00
Vortrex
b01baa7302 Fix money bug 2022-09-20 02:40:05 -05:00
Vortrex
926dc7bfcd Update locale.json 2022-09-20 02:39:57 -05:00
Vortrex
655a784d27 Use new AGRP prefix on console msg 2022-09-20 02:27:25 -05:00
Vortrex
6ed7cd9bc6 Formatting 2022-09-20 02:26:47 -05:00
Vortrex
b9c5e2b949 Fix label rendering for client house/biz 2022-09-20 02:26:34 -05:00
Vortrex
b81a3db9ff Fix client house/biz stuff 2022-09-20 02:26:12 -05:00
Vortrex
f3b7a29f10 Check if GUI ready before some stuff 2022-09-20 02:25:47 -05:00
Vortrex
dbc84950cb Send house/biz to client in Mafia 1 2022-09-20 02:25:27 -05:00
Vortrex
410f9f5a53 Check if in paintball when start/stop 2022-09-20 02:25:03 -05:00
Vortrex
5ce4bd15a3 Map loaded net event 2022-09-20 02:24:48 -05:00
Vortrex
a077699648 Enter/exit property overhaul 2022-09-20 02:24:22 -05:00
Vortrex
237f3fdc40 Add workaround for Mafia 1 on pos above/below utils 2022-09-20 02:23:33 -05:00
Vortrex
e27423e72b Start working on consolidating biz/house into single property 2022-09-20 02:23:17 -05:00
Vortrex
a93d07982c Add squirrel thread stuff 2022-09-20 02:22:48 -05:00
Vortrex
ee19f96442 Update meta.xml 2022-09-20 02:22:34 -05:00
Vortrex
1bce0b3e37 Add mafia font 2022-09-20 02:21:13 -05:00
Vortrex
2ce374c28f Remove extra game check 2022-09-15 05:10:50 -05:00
Vortrex
c0c6e50b9c Formatting 2022-09-15 05:10:38 -05:00
Vortrex
25bdc703c8 Fix uniform command output 2022-09-15 05:10:31 -05:00
Vortrex
2979f0fb97 Add numbers on some skin names 2022-09-09 04:43:27 -05:00
Vortrex
9255f38190 Add radio station data util 2022-09-09 04:43:16 -05:00
Vortrex
d4ffc12c9c Fix custom disconnect reason for script fail 2022-09-09 04:43:08 -05:00
Vortrex
879943767d Woops typo 2022-09-09 04:42:52 -05:00
Vortrex
51749606ec Day/night cycle for Mafia 2022-09-09 04:42:45 -05:00
Vortrex
614e291886 Save vehicle radio station 2022-09-09 04:42:16 -05:00
Vortrex
617c59e795 Save house radio station 2022-09-09 04:42:07 -05:00
Vortrex
19c65a11f7 Save biz radio station 2022-09-09 04:41:59 -05:00
Vortrex
c8678bfe8c Cruise control net event 2022-09-09 02:12:17 -05:00
Vortrex
3bd2cfbba2 Add debug lines for event 2022-09-09 02:12:04 -05:00
Vortrex
c6b6a4ad68 Add local money 2022-09-09 02:11:55 -05:00
Vortrex
55c257b0a8 Use dummy elements for games without pickups 2022-09-09 02:11:35 -05:00
Vortrex
5cb2e6d83d Add dummy element util 2022-09-09 02:11:17 -05:00
Vortrex
39c023d437 Add some mafia locations 2022-09-09 02:11:09 -05:00
Vortrex
7671f1ad7e Scene stuff 2022-09-06 06:59:53 -05:00
Vortrex
f42d757840 Update game data 2022-09-06 06:59:45 -05:00
Vortrex
806c16bc98 Add support for interior scene change 2022-09-06 06:59:35 -05:00
Vortrex
2bdc656d57 Set cruise control on current speed 2022-09-06 06:58:47 -05:00
Vortrex
cd6e9fe509 Process vehicle cruise control 2022-09-06 06:58:33 -05:00
Vortrex
56b4cf3658 Add local money 2022-09-06 06:58:18 -05:00
Vortrex
8e4b7d6b2f Disable cruise control on veh exit 2022-09-06 06:58:01 -05:00
Vortrex
670efb53d6 Optimize money sync 2022-09-06 06:57:46 -05:00
Vortrex
bbfcc56013 Reorder bindable keys array to fix mismatch 2022-09-04 15:53:29 -05:00
Vortrex
1304d50f71 Enable camera support on M1 + add locations 2022-09-04 15:53:02 -05:00
Vortrex
b5293447c3 Use radio station data func to get ID for veh save 2022-09-04 15:52:45 -05:00
Vortrex
e9bf890772 Manually call spawn event for IV and Mafia 1 2022-09-04 15:52:27 -05:00
Vortrex
ca30e94451 Use global config for currency string 2022-09-04 15:52:06 -05:00
Vortrex
6f3575790b Add alert player check on route stop 2022-09-04 15:51:49 -05:00
Vortrex
75f2fc90b3 Add more action tips 2022-09-04 15:51:18 -05:00
Vortrex
09316c3301 Don't announce job route stop on player quit 2022-09-04 15:51:03 -05:00
Vortrex
780b8aacdf Use global config for currency string 2022-09-04 15:50:40 -05:00
Vortrex
4de8da0561 Check for pickup support on biz create 2022-09-04 15:50:19 -05:00
Vortrex
b711f3ebe1 Fix newchar message 2022-09-04 15:50:02 -05:00
Vortrex
56b1825508 Init network events script 2022-09-04 15:49:52 -05:00
Vortrex
5039f5a4f3 Use player control func 2022-09-04 15:49:41 -05:00
Vortrex
1896dd956f Use key util for skin select 2022-09-04 15:49:23 -05:00
Vortrex
c94a40c2b1 Don't render logo on MafiaC 2022-09-04 15:49:08 -05:00
Vortrex
65bad453ea Currency string 2022-09-04 15:48:59 -05:00
Vortrex
798a1645ee Formatting 2022-09-04 15:48:23 -05:00
Vortrex
c09ea0073b Don't reset locale chooser options 2022-09-04 15:47:54 -05:00
Vortrex
36f47f7009 Don't init locale chooser (needs fixed) 2022-09-04 15:47:44 -05:00
Vortrex
7908c756f7 Add default currency string 2022-09-04 15:47:31 -05:00
Vortrex
1ebbcb2a86 Add client-side economy.js 2022-09-04 15:47:21 -05:00
Vortrex
f634acbcb8 Update locale stuff 2022-09-04 15:47:12 -05:00
Vortrex
34e5748df9 Add game areas array for GTA 3 2022-08-24 20:34:33 -05:00
Vortrex
78959dbef9 Move client init func to client.js 2022-08-23 14:28:51 -05:00
Vortrex
cdebb12226 Use new currency string 2022-08-23 14:28:38 -05:00
Vortrex
9e44f4d2fa Action tips (cont'd) 2022-08-22 14:26:48 -05:00
Vortrex
c4f8afecc0 Action tips 2022-08-22 14:18:01 -05:00
Vortrex
c0963c4e66 Formatting 2022-08-19 13:00:22 -05:00
Vortrex
54c07ccb65 Check if player is actually in biz before forcing exit 2022-08-16 11:49:12 -05:00
Vortrex
fe4dfdcf4e Check if player is actually in house before forcing out 2022-08-16 11:49:02 -05:00
Vortrex
526764185c Check if already entering/exiting property before trying 2022-08-16 11:48:39 -05:00
Vortrex
c63ec5f4f6 Restore vehicle engine state on enter 2022-08-16 11:27:37 -05:00
Vortrex
d9ab8d3b54 Add a few VC game locations 2022-08-16 11:24:37 -05:00
Vortrex
5e08ac8dd4 Remove time test script 2022-08-16 11:24:07 -05:00
Vortrex
c0dee692e0 Check for vehicle before setting transient + cleanup 2022-08-14 11:00:42 -05:00
Vortrex
744eca3b9d Add keybind combo name util 2022-08-14 10:50:12 -05:00
Vortrex
d6f24971ef Add a few command aliases 2022-08-12 12:00:17 -05:00
Vortrex
6e0bf2a8ee Add trigger consts 2022-08-10 14:18:02 -05:00
Vortrex
28111c4771 Don't spawn player, use existing one (IV) 2022-08-10 14:17:53 -05:00
Vortrex
d0748c9152 Some NPC cmds 2022-08-10 14:17:41 -05:00
Vortrex
7139f0e4bc Show name of house/biz when entering/exiting 2022-08-10 14:17:30 -05:00
Vortrex
c1c4820c45 Fix automatic bug report for missing locale string 2022-08-10 14:17:15 -05:00
Vortrex
c90932a602 Use locale string for walkie talkie channel 2022-08-10 14:17:00 -05:00
Vortrex
9cf0dc38c7 Start working on item recipe system 2022-08-10 14:16:47 -05:00
Vortrex
7a71c08c3d Check for server elements on spawn 2022-08-10 14:16:29 -05:00
Vortrex
beec73daed Comment 2022-08-10 14:15:31 -05:00
Vortrex
47c1c277af Woops don't use bool util for biz buy price save 2022-08-10 14:15:19 -05:00
Vortrex
32a2a02b52 Use skin util for skin select 2022-08-10 14:14:57 -05:00
Vortrex
efbcc8b1f9 Load and check model before setting skin (IV) 2022-08-10 14:14:47 -05:00
Vortrex
8320acb9ec Update IDEAS.md 2022-08-04 05:28:51 -05:00
Vortrex
2c67147239 Fix NaN values on new accounts 2022-08-04 05:28:47 -05:00
Vortrex
da722de87d Add dimension to feature table 2022-08-04 05:12:59 -05:00
Vortrex
3d55e70657 Feature checks 2022-08-04 05:12:48 -05:00
Vortrex
9b4ad628c8 Feature checks 2022-08-04 05:12:38 -05:00
Vortrex
e2ec0b85b6 Don't use special spawn func for Mafia 1 2022-08-04 05:12:27 -05:00
Vortrex
502b211840 Error checking 2022-08-04 05:11:46 -05:00
Vortrex
13c039d7a9 Change default client log level 2022-08-04 05:11:38 -05:00
Vortrex
3a87131185 Formatting 2022-08-01 11:36:40 -05:00
Vortrex
710f41f9da JSDoc for game config util 2022-08-01 11:36:34 -05:00
Vortrex
7ccbff0ae9 Typedef game data 2022-08-01 11:36:23 -05:00
Vortrex
7ae1b8bf48 Check for null element and needed methods/props 2022-08-01 11:36:09 -05:00
Vortrex
5be864f77c Fix player info cmd job and clan rank info 2022-08-01 11:35:44 -05:00
Vortrex
f301469072 Automated report for missing indexed locale strings 2022-08-01 11:35:32 -05:00
Vortrex
e6f5e31e98 Check command params, not temp command for keybind 2022-08-01 11:35:13 -05:00
Vortrex
98769435be Woops wrong arg + check if no job for blip update 2022-08-01 11:35:00 -05:00
Vortrex
4fac1cb350 Add remove players from house util 2022-08-01 11:34:44 -05:00
Vortrex
364e3ef3ab Display disconnect message last + fix radio playing after spawn 2022-08-01 11:34:30 -05:00
Vortrex
8b1fcc1cc1 Make player highest rank when setting as clan owner 2022-08-01 11:34:06 -05:00
Vortrex
48a5d6a543 Fix biz delete query 2022-08-01 11:33:39 -05:00
Vortrex
5e82edbf0d Use native util for veh engine 2022-08-01 11:33:30 -05:00
Vortrex
a96b7e6e2e Use locale string for "paused" status on player heads 2022-08-01 11:33:17 -05:00
Vortrex
d30116cac6 Make job blips bigger 2022-08-01 11:33:05 -05:00
Vortrex
4621048f0f Restore vehicle engine stuff (was removed for testing) 2022-08-01 11:32:55 -05:00
Vortrex
b27effbfcd Use new singular game feature names 2022-08-01 02:17:14 -05:00
Vortrex
b0602bb0ca Don't create server job markers (GTAC bug) 2022-08-01 02:16:57 -05:00
Vortrex
6981cfdc5b Rename 2022-08-01 02:16:09 -05:00
Vortrex
cb0a0f518e Don't log deaths for now (needs fixed) 2022-08-01 02:16:01 -05:00
Vortrex
6db5cad667 Job route fixes 2022-08-01 02:15:41 -05:00
Vortrex
703843549c Debug logging 2022-08-01 02:15:32 -05:00
Vortrex
2d3eb800b3 Use renamed game feature names 2022-08-01 02:15:20 -05:00
Vortrex
fd10ae6665 Use hide route location util 2022-08-01 02:14:25 -05:00
Vortrex
521b0a406c Don't handle server-side sphere for now 2022-08-01 02:14:12 -05:00
Vortrex
e94da0eb95 Use events from v-events 2022-08-01 02:13:44 -05:00
Vortrex
8e9f8eb7d8 Revert "Remove client-side job sphere"
This reverts commit 3a501f0b39.
2022-08-01 00:20:26 -05:00
Vortrex
348fb2e469 Use feature supported check util 2022-07-30 08:19:15 -05:00
Vortrex
49aa8c35fe Add spheres to game features array 2022-07-30 08:19:01 -05:00
Vortrex
dc633e7e83 Use radio station index 2022-07-30 08:18:49 -05:00
Vortrex
08b065a650 Create job route location markers 2022-07-30 08:18:41 -05:00
Vortrex
54cfcdcdc5 Check game features and null clients 2022-07-30 08:18:32 -05:00
Vortrex
425f405897 Remove some event-based net events 2022-07-30 08:18:18 -05:00
Vortrex
7569aff3d4 Use radio station index 2022-07-30 08:17:58 -05:00
Vortrex
d2452979f8 Allow console client in normal message 2022-07-30 08:17:41 -05:00
Vortrex
7ccc9d92cc Check for null client + some automatic bug reports 2022-07-30 08:17:27 -05:00
Vortrex
0b54145764 Add server job sphere, fix some route/loc cmds 2022-07-30 08:17:07 -05:00
Vortrex
ab4339c46b Use radio station index 2022-07-30 08:16:46 -05:00
Vortrex
215124a0bc Allow null client in bug/idea report func 2022-07-30 08:16:35 -05:00
Vortrex
f6614ff92b Add job sphere radius to global config 2022-07-30 08:16:19 -05:00
Vortrex
f69ca2ac59 Fix account data save bug 2022-07-30 08:16:07 -05:00
Vortrex
149e3f3fa5 Remove old event handling 2022-07-30 08:15:46 -05:00
Vortrex
ad5dd488b9 Debug logging 2022-07-30 08:15:38 -05:00
Vortrex
8de8a30d1f Lower default log level 2022-07-30 08:15:29 -05:00
Vortrex
a1e9ad0b42 Fix locale loading 2022-07-30 08:15:20 -05:00
Vortrex
0fd711dc0b Disable locale chooser for now (crashes) 2022-07-30 08:15:08 -05:00
Vortrex
3a501f0b39 Remove client-side job sphere 2022-07-30 08:14:49 -05:00
Vortrex
af699acd24 Use v-events resource 2022-07-30 08:14:39 -05:00
Vortrex
258af788c7 Update IDEAS.md 2022-07-30 08:14:09 -05:00
Vortrex
17481001b0 Check if job has any ranks before setting lowest on takejob 2022-07-28 03:20:51 -05:00
Vortrex
2c28b17047 Check if job has any ranks before resetting 2022-07-28 03:18:40 -05:00
Vortrex
2c6401e9ed Check if job has any ranks before checking level 2022-07-28 03:17:55 -05:00
Vortrex
bb4b821db7 Use locale strings 2022-07-27 00:47:18 -05:00
Vortrex
b7bc0ca8a8 Check job and rank when loading chars 2022-07-27 00:47:06 -05:00
Vortrex
a8843dba20 Fix item usage anims freezing player 2022-07-27 00:46:43 -05:00
Vortrex
945a44506b Fix player info cmd 2022-07-27 00:46:31 -05:00
Vortrex
784129e8e6 Fix wrong rank being used in clan chat text 2022-07-27 00:46:20 -05:00
Vortrex
1f381732b3 Fix unix timestamp util 2022-07-27 00:46:07 -05:00
Vortrex
277c4a2697 Change some startup log level to debug 2022-07-27 00:45:50 -05:00
Vortrex
73fbf6f655 Load job ranks + fix job uniform/equipment 2022-07-27 00:45:13 -05:00
Vortrex
da65e74ef1 Don't convert item anim names to int 2022-07-27 00:44:56 -05:00
Vortrex
900ec4ab39 Wrong game message util name 2022-07-27 00:44:37 -05:00
Vortrex
f5b388b045 Use some custom events from v-events 2022-07-27 00:44:23 -05:00
Vortrex
9cedecf40c Add clan discord webhook func 2022-07-27 00:44:07 -05:00
Vortrex
f4adc3c3e9 Manually remove and re-add help cmd handler 2022-07-27 00:43:13 -05:00
Vortrex
2efccb638f Clan MOTD + rank cmd fixes 2022-07-27 00:42:59 -05:00
Vortrex
225d78c60d Add discord echo for local chats 2022-07-27 00:42:43 -05:00
Vortrex
4d607d3c5d Some business fixes 2022-07-27 00:42:25 -05:00
Vortrex
4ede78bd7c Woops wrong db field name for acct register 2022-07-27 00:42:07 -05:00
Vortrex
468cd46750 Show/hide flag images separate from the main window 2022-07-27 00:41:45 -05:00
Vortrex
dfaf611a1e Use some custom events from v-events 2022-07-27 00:41:31 -05:00
Vortrex
f03502e380 Fix some gamedata object keys 2022-07-26 02:16:52 -05:00
Vortrex
5973553171 Woops existance is in netFlags 2022-07-26 02:16:29 -05:00
Vortrex
6970d40f42 Don't use item anims if in vehicle 2022-07-26 02:16:17 -05:00
Vortrex
13cf75262a Optional profanity filter 2022-07-26 02:16:05 -05:00
Vortrex
c486c00a02 Rename biz dealership handler name 2022-07-26 02:15:42 -05:00
Vortrex
3f0e8548d8 Add more lists to game features table 2022-07-26 01:02:04 -05:00
Vortrex
c28815b61c Add single particle effect net event 2022-07-26 01:01:52 -05:00
Vortrex
206f7e691e Add duration arg to used keybind handler 2022-07-26 01:01:42 -05:00
Vortrex
afdbbdbaa5 Don't set stuff on spawn that game doesn't support 2022-07-26 01:01:11 -05:00
Vortrex
2102d7a0d7 Hide player's own blip 2022-07-26 01:00:49 -05:00
Vortrex
d1bdc069fd Add player stream distance + fishing cast min/max strength to config 2022-07-26 01:00:25 -05:00
Vortrex
42bb527844 Rename biz dealership handler function 2022-07-26 00:57:10 -05:00
Vortrex
da6d12c8d7 Job rank class and some rank utils 2022-07-24 05:34:21 -05:00
Vortrex
07e65591d0 Fix badge item chat header 2022-07-23 17:42:51 -05:00
Vortrex
c3d0f826db Add job rank bitflags 2022-07-23 17:42:39 -05:00
Vortrex
e65cd0b4be Use 6 digit numbers for two factor code 2022-07-23 04:20:11 -05:00
Vortrex
ab697557ef Add particle effects array to game data 2022-07-23 04:19:27 -05:00
Vortrex
73757ebbc5 Update damage states util 2022-07-23 04:19:14 -05:00
Vortrex
6b73be287b Some fixes for paintball 2022-07-23 04:19:03 -05:00
Vortrex
26e5617ccb Fix player skin util (RageMP) 2022-07-23 04:18:48 -05:00
Vortrex
c73c8b6b9a Fix player skin util 2022-07-23 04:18:38 -05:00
Vortrex
ef3c8049ea Fix job route not finishing properly 2022-07-23 04:18:20 -05:00
Vortrex
2b5307077f Fix account help text 2022-07-23 04:18:06 -05:00
Vortrex
e6be16c30f Add fishing state consts 2022-07-23 04:17:57 -05:00
Vortrex
d30a3bcb29 Events + handle paintball stuff on death 2022-07-23 04:17:48 -05:00
Vortrex
2eb58fa8cf Casino data 2022-07-23 04:17:20 -05:00
Vortrex
8de1204ed7 Check for login timeout 2022-07-23 04:17:14 -05:00
Vortrex
b4b3996e00 Add A and D keys to cycle through skins 2022-07-23 04:17:05 -05:00
Vortrex
a04b442df6 Add casino script file 2022-07-23 04:16:44 -05:00
Vortrex
74062a7d36 Add cruise control command and net events 2022-07-23 04:16:19 -05:00
Vortrex
d04b5549a6 Formatting 2022-07-23 04:15:51 -05:00
Vortrex
59e704ee19 Formatting 2022-07-23 04:15:44 -05:00
Vortrex
7a89d8bcba Fix weapon damage handling 2022-07-23 04:15:36 -05:00
Vortrex
be237dc0aa Add casino script file 2022-07-23 04:15:15 -05:00
Vortrex
8785255366 Update IDEAS.md 2022-07-17 04:32:40 -05:00
Vortrex
a69aec9222 Show help text on how to select & create char 2022-07-17 04:25:45 -05:00
Vortrex
a3fe0f8708 Unlimited ammo for paintball + clear weps when leaving 2022-07-17 04:25:24 -05:00
Vortrex
9e3f5d4a8f Default server name 2022-07-17 04:25:03 -05:00
Vortrex
11685eacf6 Use new biz type stuff for paintball on enter/exit 2022-07-17 04:24:53 -05:00
Vortrex
6b914f8056 Woops wrong const name 2022-07-17 04:24:39 -05:00
Vortrex
9be2a7a95b Add fishing rod item use type 2022-07-17 04:24:28 -05:00
Vortrex
b1d8beb23b Fix fishing stuff (unfinished) 2022-07-17 04:24:18 -05:00
Vortrex
25e79b26d6 More cleanup on quit 2022-07-17 04:24:04 -05:00
Vortrex
140749e8c0 Set business to paintball cmd 2022-07-17 04:23:43 -05:00
Vortrex
25543b5f07 New chat stuff (emoji, timestamps, etc) 2022-07-17 04:23:32 -05:00
Vortrex
8ca7a8bdfd Update IDEAS.md 2022-07-17 04:22:41 -05:00
Vortrex
da7e0c35d1 Placeholder for keybind reset and copy prompts 2022-07-17 01:42:48 -05:00
Vortrex
99a21f9892 Use locale strings for keybind cmds messages 2022-07-17 01:42:30 -05:00
Vortrex
945d44d878 Move surrendered util to misc.js 2022-07-17 01:42:10 -05:00
Vortrex
a52590ea56 Add suicide command handler 2022-07-17 01:41:54 -05:00
Vortrex
713022da47 Add suicide cmd + add some aliases for others 2022-07-17 01:41:42 -05:00
Vortrex
8b66e7914d Add locale files and flag images to main meta.xml 2022-07-15 05:59:32 -05:00
Vortrex
e52c3a0e8d Add job route edit members for player data class 2022-07-15 05:59:16 -05:00
Vortrex
f83a602047 Add job route + loc cmds 2022-07-15 05:58:34 -05:00
Vortrex
34ec6e60f8 Prevent foreign key constraint errors 2022-07-15 05:58:22 -05:00
Vortrex
883cac8f47 Enable strict mode for server 2022-07-15 05:57:30 -05:00
Vortrex
e6be6d7241 Add locale data class 2022-07-15 05:57:18 -05:00
Vortrex
5c5e2d027e Use custom veh events 2022-07-15 05:57:08 -05:00
Vortrex
03febd8076 Add job route location types + utils 2022-07-15 05:57:00 -05:00
Vortrex
a37262b32f Remove old HTML test 2022-07-11 23:58:31 -05:00
Vortrex
805f843e05 Update TODO.md 2022-07-11 17:40:07 -05:00
Vortrex
087c03cae4 Fix invalid file path 2022-07-11 17:40:02 -05:00
Vortrex
a83a4f91af Add profanity filter words array 2022-07-11 17:39:55 -05:00
Vortrex
8e587b13ad Use locale strings for veh renting 2022-07-11 17:39:45 -05:00
Vortrex
cd87b90ac7 Use name from database 2022-07-11 17:39:36 -05:00
Vortrex
362f20a059 Port some natives to ragemp 2022-07-11 17:39:24 -05:00
Vortrex
315bd5f926 Add server name & pass utils 2022-07-11 17:39:14 -05:00
Vortrex
78f53f7af7 Add reset keybinds cmd 2022-07-11 17:38:59 -05:00
Vortrex
09bbca49db Add missing prompt consts 2022-07-11 17:38:47 -05:00
Vortrex
0625dcd5c1 Use name from database 2022-07-11 17:38:32 -05:00
Vortrex
1e5ea4fd87 Add new account settings cmds 2022-07-11 17:38:23 -05:00
Vortrex
74bc330596 Add new account settings bitflags 2022-07-11 17:38:12 -05:00
Vortrex
e67b3eeb23 Account settings util + new chat stuff 2022-07-11 17:38:02 -05:00
Vortrex
d5d7f8b98f Add chat states net events 2022-07-11 17:37:34 -05:00
Vortrex
2bb4e9a23b Rename chatbox.js to chat.js 2022-07-11 17:37:15 -05:00
Vortrex
1d61ec26db Fix invalid file paths 2022-07-11 17:37:00 -05:00
Vortrex
8d620882ce Update GUI script files 2022-07-08 14:36:00 -05:00
Vortrex
9285cf6fd3 Add GUI script file 2022-07-08 14:35:53 -05:00
Vortrex
8e24b35c29 Add object moving script file 2022-07-08 14:04:41 -05:00
Vortrex
2a0f2443d4 Add new GUI script files 2022-07-08 14:04:24 -05:00
Vortrex
9539eb20f8 Update header 2022-07-08 14:03:55 -05:00
Vortrex
35251372c5 Organize + some small fixes 2022-07-07 22:17:14 -05:00
Vortrex
179556b878 Add trigger stuff 2022-07-07 22:17:02 -05:00
Vortrex
eb582a666d Add login timeout (60 seconds) 2022-07-07 22:16:50 -05:00
Vortrex
2587ee6cdf Add job blip sprite to game config 2022-07-05 13:03:20 -05:00
Vortrex
340c96eab2 Check if time is supported before setting 2022-07-05 13:03:06 -05:00
Vortrex
17c342be54 Fix some outputs on player info cmd 2022-07-05 13:02:53 -05:00
Vortrex
0595f25f3f Fix job route location delay cmd output text 2022-07-05 13:02:40 -05:00
Vortrex
a9f82b4150 Add load svr cfg from game util 2022-07-05 13:02:20 -05:00
Vortrex
df949a35f7 Change prefix of consts 2022-07-02 23:38:31 -05:00
Vortrex
c5cef51655 Add JSDoc info 2022-07-02 23:32:08 -05:00
Vortrex
334a7637f6 Add JSDoc info 2022-07-02 23:32:01 -05:00
Vortrex
89bcbf9a8a Add JSDoc info and ATM cache array 2022-07-02 23:31:52 -05:00
Vortrex
0ec8608b2b Add ATM distance to global config 2022-07-02 23:31:40 -05:00
Vortrex
9c937b76fb Add JSDoc info 2022-07-02 23:31:22 -05:00
Vortrex
20502f5bca Add JSDoc info and cache ATM locations 2022-07-02 23:31:14 -05:00
Vortrex
e17f6f3c4e Add bank account owner consts 2022-07-02 23:30:51 -05:00
Vortrex
cb86419f2b Change netevent and const prefix 2022-06-30 18:29:17 -05:00
Vortrex
2f7f3a1b00 Change net event and const prefix 2022-06-30 18:29:00 -05:00
Vortrex
dd3f027c1e Add generic package item model slot for other games 2022-06-30 16:34:12 -05:00
Vortrex
beb7e2070c Use new item use type const naming 2022-06-30 16:33:55 -05:00
Vortrex
ff6768d64d Updates to chatbox timestamps display 2022-06-30 16:32:53 -05:00
Vortrex
72562688e7 Move get anim utils to shared 2022-06-30 16:32:28 -05:00
Vortrex
defee4c76e Align staff cmd funcs 2022-06-27 16:41:35 -05:00
Vortrex
66840a0de9 Woops need to cache from names table 2022-06-27 16:41:23 -05:00
Vortrex
ab7c73d7da Use new prefix for server cvars 2022-06-27 16:41:06 -05:00
Vortrex
b86d2c7bcb Use built-in veh enter/exit events 2022-06-27 16:40:54 -05:00
Vortrex
3fe5894499 Woops wrong net events arg order 2022-06-27 16:40:41 -05:00
Vortrex
ea018c7b65 Align some staff cmds 2022-06-27 16:40:25 -05:00
Vortrex
d71335ed5f Revert back to main colour in timestamp toggle cmd 2022-06-27 16:40:12 -05:00
Vortrex
5f687b7b01 Use squirrel for timestamp stuff (wtf GTAC) 2022-06-27 16:39:52 -05:00
Vortrex
91bfed4f8e Timestamp colour replace 2022-06-27 09:38:53 -05:00
Vortrex
725d7cff66 Radio station db to index util 2022-06-27 09:38:39 -05:00
Vortrex
3484602114 Fix JSDoc info for server data table + add radio stations 2022-06-27 09:38:27 -05:00
Vortrex
bfc434a38f Chatbox timestamps cmds 2022-06-27 09:37:56 -05:00
Vortrex
1d59183811 Check for valid clan ID 2022-06-27 09:37:47 -05:00
Vortrex
14148da429 Align biz radio station naming 2022-06-27 09:37:38 -05:00
Vortrex
a13dfa220d Cleanup 2022-06-27 09:36:04 -05:00
Vortrex
e017313b58 Add optional chatbox timestamps 2022-06-27 09:35:58 -05:00
Vortrex
acd03cc124 Remove veh extras for now (moving to separate table) 2022-06-26 23:12:10 -05:00
Vortrex
69dc299621 Cleanup 2022-06-26 23:11:46 -05:00
Vortrex
2b34fb708a Add payphone biz loc type 2022-06-26 14:53:41 -05:00
Vortrex
8cceaa7e6a Add business offices interior types to gamedata (VC) 2022-06-26 14:53:32 -05:00
Vortrex
2181550618 Clear weapon pickups on enter/exit (for SA) 2022-06-26 14:38:37 -05:00
Vortrex
763241d2ce Optimizations, disable some timers when server empty 2022-06-26 14:36:35 -05:00
Vortrex
0f6ab26ca9 Don't check for ammo item on non-ammo weapons 2022-06-26 14:36:11 -05:00
Vortrex
ad672a5912 Const naming 2022-06-26 13:32:25 -05:00
Vortrex
49e0c4afeb Cleanup 2022-06-26 13:32:18 -05:00
Vortrex
7883d3503a Const naming 2022-06-26 13:32:13 -05:00
Vortrex
43e41a1139 Const naming 2022-06-26 13:32:02 -05:00
Vortrex
ad1f7a3c7f Info in comment 2022-06-26 13:31:56 -05:00
Vortrex
d90dc8e7b8 Use new custom events for enter/exit veh 2022-06-26 13:31:41 -05:00
Vortrex
644a188929 Const naming 2022-06-26 13:31:22 -05:00
Vortrex
7c2249aa5d Re-add setfightstyle cmd for admin 2022-06-26 13:31:07 -05:00
Vortrex
ae1185856d Align const name format 2022-06-26 13:30:48 -05:00
Vortrex
732d268e04 Start working on banking script 2022-06-26 13:30:35 -05:00
Vortrex
931a0d5ab0 Cleanup 2022-06-26 13:30:27 -05:00
Vortrex
13267a7e32 Add native util 2022-06-22 08:30:51 -05:00
Vortrex
d7a66fb503 Move fishing collectables to fishing.js 2022-06-22 08:30:25 -05:00
Vortrex
5ba69fca4d Rename game msg util to small game msg (adding more soon) 2022-06-22 08:29:57 -05:00
Vortrex
98e936fc71 Add fishing funcs and data 2022-06-22 08:29:23 -05:00
Vortrex
71e13e2323 Add fishing distance to global config 2022-06-22 08:28:55 -05:00
Vortrex
51c01b9c94 Private message util + change tip emoji to 💡 2022-06-19 11:29:36 -05:00
Vortrex
6fa3eb9997 Debug logging 2022-06-19 11:29:13 -05:00
Vortrex
bd0a994225 Add PM to client data class 2022-06-19 11:29:02 -05:00
Vortrex
3ea19927a5 Command aliases and new handlers 2022-06-19 11:28:46 -05:00
Vortrex
16fd26dc9a More item type cmds 2022-06-19 11:28:34 -05:00
Vortrex
4c8630c174 Private message and quick reply cmds 2022-06-19 11:28:25 -05:00
Vortrex
e260d6176c Add ideas to file 2022-06-19 11:28:00 -05:00
Vortrex
7b77c99fb0 Add net event handlers in startup 2022-06-17 15:14:39 -05:00
Vortrex
f121b473aa Add debug logging 2022-06-17 15:14:17 -05:00
Vortrex
e7e2fb16d1 Fix veh in range header text to show distance 2022-06-17 13:10:01 -05:00
Vortrex
bbc41a5f3f Set pb values and add pb respawn handling util 2022-06-17 13:09:45 -05:00
Vortrex
cb029ff2e8 Formatting 2022-06-17 13:09:25 -05:00
Vortrex
a403530f11 Quit paintball when exiting business 2022-06-17 13:09:15 -05:00
Vortrex
6d826c48cc Add check for invalid item and type IDs 2022-06-17 13:08:50 -05:00
Vortrex
87ca42c48a Add check for invalid house ID 2022-06-17 13:08:39 -05:00
Vortrex
90face486b Handle respawn for paintball (don't use normal death respawn) 2022-06-17 13:08:30 -05:00
Vortrex
f1affc2f8f Add bizpaintball cmd 2022-06-17 13:08:12 -05:00
Vortrex
78005a7d17 Add paintball data to client data class 2022-06-17 13:07:45 -05:00
Vortrex
70a1520f56 Add check for invalid business ID 2022-06-17 13:07:26 -05:00
Vortrex
7373f1454e Add paintball script to meta.xml 2022-06-17 13:07:11 -05:00
Vortrex
35f9e1fe3d Add true/false string from bool util 2022-06-17 09:41:21 -05:00
Vortrex
66f351a16e Add some blip types and warehouse int to GTA3 2022-06-17 09:41:11 -05:00
Vortrex
fe42541dab Disable old ped on char create stuff (was never finished) 2022-06-17 09:40:50 -05:00
Vortrex
b7271029f7 Cache all paintball items on start 2022-06-17 09:40:26 -05:00
Vortrex
326286bdc5 Add paintball script 2022-06-17 09:40:14 -05:00
Vortrex
f9701e81a7 Rephrase logging to include correct name 2022-06-17 09:40:05 -05:00
Vortrex
282832b30a Start paintball when entering arena biz type 2022-06-17 09:39:46 -05:00
Vortrex
53eaddbfce Universal temp locker 2022-06-17 09:39:27 -05:00
Vortrex
731d0d6905 Fix wrong locale name for rules list 2022-06-17 09:39:07 -05:00
Vortrex
f0d5d6b361 Add descriptions for forensics consts types 2022-06-17 09:38:49 -05:00
Vortrex
d9c007c4bc Use new entered/exited veh events 2022-06-17 09:38:37 -05:00
Vortrex
519796fd60 Update to db query execute cmd 2022-06-17 09:38:25 -05:00
Vortrex
318a01eea1 Make temp locker universal and improve client data class 2022-06-17 09:38:11 -05:00
Vortrex
02e80a47ab Add paintball arena entrance type for biz 2022-06-17 09:37:48 -05:00
Vortrex
1e4bc2a19d Disable random tips until the locale replace is finished 2022-06-17 08:04:37 -05:00
Vortrex
4e0bce571f Cache all item's items 2022-06-17 08:04:22 -05:00
Vortrex
4392cea694 Add item cache + check item slot before put + use veh/item before biz 2022-06-17 08:04:12 -05:00
Vortrex
c8992ce2de Check if player int and vw are in main world before radio 2022-06-17 08:03:31 -05:00
Vortrex
a9e30d79e3 Add discord webhook types consts 2022-06-17 08:03:14 -05:00
Vortrex
3676e1ac85 Update server config class 2022-06-17 08:03:02 -05:00
Vortrex
a84acae095 Don't save acct chat hide (was removed) 2022-06-17 08:02:54 -05:00
Vortrex
ef19191cc9 Woops wrong name 2022-06-16 19:50:00 -05:00
Vortrex
234e50e035 Remove old unused script file 2022-06-16 19:49:53 -05:00
Vortrex
9653b7c7c5 Add client net events script file 2022-06-16 19:49:44 -05:00
Vortrex
a7e070fbe1 Add net events file to meta.xml 2022-06-16 19:49:25 -05:00
Vortrex
6b6d2ed7b8 Port item drop front distance from nightly 2022-06-16 13:21:50 -05:00
Vortrex
1380d749f4 Merge branch 'nightly' into organizing 2022-06-16 13:05:06 -05:00
Vortrex
facd9cf97f Save item type drop front distance 2022-06-16 13:04:42 -05:00
Vortrex
116865a2d9 Rename Garage int type and add Joey's 2022-06-15 14:02:34 -05:00
Vortrex
673942e945 Use player data to get locale ID 2022-06-14 17:35:18 -05:00
Vortrex
a239cd554e Send locale ID on change 2022-06-14 17:34:55 -05:00
Vortrex
e794976e50 Working on item containers (crate, box, veh trunk, etc) 2022-06-14 17:34:43 -05:00
Vortrex
7d5d660ad9 Remove unused var 2022-06-14 17:34:08 -05:00
Vortrex
eab4d6cfe8 Check game for restoring camera 2022-06-14 17:33:58 -05:00
Vortrex
a0c61c4f9c Add vehicle trunk distance to config 2022-06-14 17:33:45 -05:00
Vortrex
35f3d527c5 Add front distance to item dropping 2022-06-14 17:33:35 -05:00
Vortrex
e54cacd3d2 Delete player ped net event 2022-06-14 17:33:19 -05:00
Vortrex
7a90cbb867 Echo actions (/me, /do) to discord 2022-06-14 17:32:58 -05:00
Vortrex
dbde2ed35f Cleanup 2022-06-14 17:32:37 -05:00
Vortrex
7e7f729997 Add del local player ped util 2022-06-14 17:32:29 -05:00
Vortrex
8f02c5c3d8 Add del local player ped util 2022-06-14 17:32:24 -05:00
Vortrex
d6f767e321 Cleanup 2022-06-14 17:32:15 -05:00
Vortrex
e965e15ad2 Use more locale strings 2022-06-14 09:16:02 -05:00
Vortrex
87be1f3b42 Merge branch 'nightly' into ragemp 2022-05-31 08:35:59 -05:00
Vortrex
2f133a456b Fix business load 2022-05-26 17:36:12 -05:00
Vortrex
55758854fb Merge branch 'nightly' into ragemp 2022-05-26 17:36:03 -05:00
Vortrex
b2a30f225d Add some utils to RageMP natives script 2022-05-26 17:34:56 -05:00
Vortrex
21eaa4e97d Merge branch 'nightly' into ragemp 2022-05-20 16:51:43 -05:00
Vortrex
ae6a08c457 More RageMP prep 2022-05-20 16:51:01 -05:00
Vortrex
db4967b5d0 Merge branch 'nightly' into ragemp 2022-04-16 22:39:48 -05:00
Vortrex
674006abfd Merge branch 'nightly' into ragemp 2022-03-12 05:21:28 -06:00
Vortrex
c933c32ac3 Revert "Merge branch '1.4.0-prep' into ragemp"
This reverts commit 197256da4f, reversing
changes made to 6bc770d906.
2022-03-08 10:33:54 -06:00
Vortrex
197256da4f Merge branch '1.4.0-prep' into ragemp 2022-03-08 10:33:23 -06:00
222 changed files with 25677 additions and 5789 deletions

View File

@@ -14,7 +14,8 @@
### Interactive peds with each one having a background story, characteristics, certain people or groups they like/dislike. ### Interactive peds with each one having a background story, characteristics, certain people or groups they like/dislike.
* Procedurally generated? * Procedurally generated?
--- ---
* Nightclubs, bars, etc can employ "bouncer" peds that either prevent entry to certain people, or kick people out. ### Bouncers
* Nightclubs, bars, etc can employ "bouncer" peds that either prevent entry to certain people, or kick people out.
--- ---
### Background ambience. ### Background ambience.
* Anonymous city traffic and pedestrians * Anonymous city traffic and pedestrians
@@ -51,9 +52,9 @@
### Vehicle Towing ### Vehicle Towing
* Use a Yankee or something to store the vehicle "inside" (just make the car disappear) until better sync options are built. * Use a Yankee or something to store the vehicle "inside" (just make the car disappear) until better sync options are built.
* Universal command to tow/release a vehicle ( /tow ). * Universal command to tow/release a vehicle ( /tow ).
* Attach to nearest vehicle. * Try attach to nearest vehicle.
--- ---
### Item System ### Item System (FINISHED)
* Several item types, including armour, skins, weapons, drugs, materials, and more. * Several item types, including armour, skins, weapons, drugs, materials, and more.
* Items can be dropped and picked up. * Items can be dropped and picked up.
* Items can be stored in a vehicle trunk or dash compartment. * Items can be stored in a vehicle trunk or dash compartment.
@@ -68,21 +69,21 @@
* If all are full, have a waiting list. * If all are full, have a waiting list.
* Allow people to go in and lay on a bed to heal (or use a check-in system) * Allow people to go in and lay on a bed to heal (or use a check-in system)
--- ---
### Several NPC's ### Several NPC's (NEEDS SPAWNED)
* Paramedics/Doctors at hospitals, * Paramedics/Doctors at hospitals,
* LC/VC/LS/SF/LV police dept desk clerk and dispatcher. * LC/VC/LS/SF/LV police dept desk clerk and dispatcher.
* Jail guard * Jail guard
* Interactive. Go up and talk to them for responses etc * Interactive. Go up and talk to them for responses etc
--- ---
### Use permissions/flag system for everything. ### Use permissions/flag system for everything (FINISHED)
* Admin abilities * Admin abilities
* Moderation (muted/frozen/etc) * Moderation (muted/frozen/etc)
* LEO abilities * LEO abilities (skipped for now)
* Clan abilities * Clan abilities
* Account Settings * Account Settings
* etc * etc
--- ---
### Interiors ### Interiors (FINISHED)
* For games with interiors, properties inside of properties (possibly make it a sub-property, but using a "type" to define it. May not be necessary) AKA a business inside a business (illegal back room gambling, anyone?) * For games with interiors, properties inside of properties (possibly make it a sub-property, but using a "type" to define it. May not be necessary) AKA a business inside a business (illegal back room gambling, anyone?)
--- ---
### Stealable skins. ### Stealable skins.
@@ -174,8 +175,6 @@
* Concealable smaller weapon. * Concealable smaller weapon.
* Officers usually have a utility belt. Allow it to hold equipment as well. * Officers usually have a utility belt. Allow it to hold equipment as well.
--- ---
###
---
### Vehicle Trunks ### Vehicle Trunks
* Can hold tied up players/peds * Can hold tied up players/peds
* Can hold items * Can hold items
@@ -230,10 +229,10 @@
* Tweakers * Tweakers
* Bouncers * Bouncers
--- ---
### Accents ### Accents (FINISHED)
* Shown before message ... "[Japanese] John Smith says: hello" * Shown before message ... "[Japanese] John Smith says: hello"
* Pre-set accent choices * Pre-set accent choices
* Custom accent * Custom accent (skipped for now)
--- ---
### Speakerphone ### Speakerphone
* While on a phone call, using /speakerphone or something can allow others near the person on the phone to hear and be heard over the call. * While on a phone call, using /speakerphone or something can allow others near the person on the phone to hear and be heard over the call.
@@ -333,7 +332,8 @@
--- ---
### Pointing ### Pointing
* Key to point sort of like FiveM has. * Key to point sort of like FiveM has.
* Use a 3D primitive on the spot thats pointed to, if no anim available. * Use a 3D primitive on the spot thats pointed to.
* Use pointing (finger?) animation if available
--- ---
### Multi-command one-liners ### Multi-command one-liners
Obviously this would still be using slashes for commands still. The way this works is simple: Every command returns a value `{RETURN}`, and provides indexed numerical references to it's args that can be *piped* to another command `{1}`, `{2}`, etc. For example, the /tempveh command adds a vehicle and provides both a reference to the vehicle itself (`{RETURN}`) and a reference to it's only argument (`{1}`). Some commands already implement a final, optional command to override the default chosen entity to act on (for example, `/bizname Some Business 3` will set business ID 3's name instead of the closest business to the player. Only works for staff with the manageBusinesses permission or if the player using it owns or is in the clan that owns business ID 3 and has the ability to set it's name. So this: `/tempveh infernus | /vehrgb 0 0 0 0 {RETURN} | /vehrgb 1 {2} {3} {4} {RETURN}` Would spawn a temporary infernus and immediately set both colours as completely black RGB values. Obviously this would still be using slashes for commands still. The way this works is simple: Every command returns a value `{RETURN}`, and provides indexed numerical references to it's args that can be *piped* to another command `{1}`, `{2}`, etc. For example, the /tempveh command adds a vehicle and provides both a reference to the vehicle itself (`{RETURN}`) and a reference to it's only argument (`{1}`). Some commands already implement a final, optional command to override the default chosen entity to act on (for example, `/bizname Some Business 3` will set business ID 3's name instead of the closest business to the player. Only works for staff with the manageBusinesses permission or if the player using it owns or is in the clan that owns business ID 3 and has the ability to set it's name. So this: `/tempveh infernus | /vehrgb 0 0 0 0 {RETURN} | /vehrgb 1 {2} {3} {4} {RETURN}` Would spawn a temporary infernus and immediately set both colours as completely black RGB values.
@@ -350,20 +350,20 @@ Obviously this would still be using slashes for commands still. The way this wor
* Ice cream cone * Ice cream cone
* Cotton Candy * Cotton Candy
* Snow cone * Snow cone
* Misc * Misc
* Gas Can * Gas Can
--- ---
### Quick Reply ### Quick Reply (FINISHED)
* When somebody sends a private message, use /reply to quickly reply without having to find their ID to use the private message command * When somebody sends a private message, use /reply to quickly reply without having to find their ID to use the private message command
--- ---
### Item management commands ### Item management commands (ALMOST FINISHED)
* Item Types * Item Types
* Create * Create
* Set base price * Set base price
* Set model * Set model
* Set drop position offset * Set drop position offset
* Set drop rotation offset * Set drop rotation offset
* Set forward
--- ---
### Tutorial ### Tutorial
* Pick up item (grab bottle of beer off ground) * Pick up item (grab bottle of beer off ground)
@@ -378,4 +378,22 @@ Obviously this would still be using slashes for commands still. The way this wor
### Animation/emote, action, and message menu wheels ### Animation/emote, action, and message menu wheels
So with new Steam Deck being available now, and all the other attempts to use mobile devices that either emulate or stream the older GTA PC games, I figure we'd need a way for players to interact with each other using them. Roleplay is usually a very chat-oriented gamemode, but I can probably make things easier with simple controls. Also customizable messages, animations, and actions for each menu/wheel slot So with new Steam Deck being available now, and all the other attempts to use mobile devices that either emulate or stream the older GTA PC games, I figure we'd need a way for players to interact with each other using them. Roleplay is usually a very chat-oriented gamemode, but I can probably make things easier with simple controls. Also customizable messages, animations, and actions for each menu/wheel slot
The inventory system is already planned to use a hotbar/wheel but I don't have all the images for it yet The inventory system is already planned to use a hotbar/wheel but I don't have all the images for it yet
--- ---
### Fishing
* Fishing works near water or on a boat (I have a way to detect both)
* Use the bat swing anim for casting line, and the crouch anim for applying bait.
* Bait is used same as ammo item for a weapon. Hold the fishing rod, make sure bait is in inventory, and press use (default U) to apply bait.
* Use a "press and hold" key to cast a line to a custom distance. Show progress bar to indicate how far the line will be cast.
* Place a single-use particle effect on the water (distance to front of player) to show where the casted line hits.
* Use particle effects (water spray or splash effect) to display a fish being hooked.
* Slowly move the particle effect to the player to show it being reeled in as the player holds the reel key.
* Random selection of predefined catch items, both junk and fish.
* Player would be wise to bring a bucket or crate to keep the fish in, using existing /take and /put system like any other item.
**This will need extra stuff added to keybinds system for duration key holding**
---
### GPS indicator like the 3D Fallout games
An indicator at the bottom, showing compass direction and a dot or something in the direction of the GPS location. Like an object marker.
In-world indicator too, when player gets close and is in line of sight
---
### Item/Object pickup and move like the 3D Fallout games
Fallout 3 and New Vegas have a neat feature where you can "grab" an object and fling it around while the key is pressed. Could be implemented for items in GTACRP servers

View File

@@ -20,4 +20,7 @@
* Drug growing/manufacturing * Drug growing/manufacturing
--- ---
== Bug Fixes == Bug Fixes
* Check natives for if player is console (getPlayerPosition, etc) * Check natives for if player is console (getPlayerPosition, etc)
* Add command to copy account keybinds to other server(s)
* Add command to reset all account keybinds to default

145
config/client/locale.json Normal file
View File

@@ -0,0 +1,145 @@
[
{
"id": 0,
"englishName": "English",
"stringsFile": "english.json",
"isoCode": "en",
"flagImageFile": "uk.png",
"countries": ["gb", "us", "au", "bz", "ca", "ie", "jm", "nz", "za", "tt"],
"requiresUnicode": false,
"contributor": "Vortrex",
"enabled": true
},
{
"id": 1,
"englishName": "Russian",
"stringsFile": "russian.json",
"isoCode": "ru",
"flagImageFile": "ru.png",
"countries": ["ru", "ua"],
"requiresUnicode": false,
"contributor": "VNDTTS",
"enabled": true
},
{
"id": 2,
"englishName": "Polish",
"stringsFile": "polish.json",
"isoCode": "pl",
"flagImageFile": "pl.png",
"countries": ["pl"],
"requiresUnicode": false,
"contributor": "Suprise444",
"enabled": true
},
{
"id": 3,
"englishName": "Spanish",
"stringsFile": "spanish.json",
"isoCode": "es",
"flagImageFile": "es.png",
"countries": ["es", "ar", "bo", "cl", "co", "cr", "do", "ec", "sv", "gt", "hn", "mx", "ni", "pa", "py", "pe", "pr", "uy", "ve"],
"requiresUnicode": false,
"contributor": "PerikiyoXD",
"enabled": true
},
{
"id": 4,
"englishName": "Chinese",
"stringsFile": "chinese.json",
"isoCode": "zh",
"flagImageFile": "cn.png",
"countries": ["cn", "hk", "sg", "tw"],
"requiresUnicode": true,
"contributor": "Renzuko_Ctone",
"enabled": true
},
{
"id": 5,
"englishName": "Arabic",
"stringsFile": "arabic.json",
"isoCode": "ar",
"flagImageFile": "sa.png",
"countries": ["dz", "bh", "eg", "iq", "jo", "kw", "lb", "ly", "ma", "om", "qa", "sa", "sy", "tn", "ae", "ye"],
"requiresUnicode": true,
"contributor": "! KASIR",
"enabled": true
},
{
"id": 6,
"englishName": "Slovak",
"stringsFile": "slovak.json",
"isoCode": "sk",
"flagImageFile": "sk.png",
"countries": ["sk"],
"requiresUnicode": false,
"contributor": "UAKLAUS",
"enabled": false
},
{
"id": 7,
"englishName": "German",
"stringsFile": "german.json",
"isoCode": "de",
"flagImageFile": "de.png",
"countries": ["de", "at", "be", "ch", "li", "lu"],
"requiresUnicode": false,
"contributor": "Sladernimo",
"enabled": true
},
{
"id": 8,
"englishName": "French",
"stringsFile": "french.json",
"isoCode": "fr",
"flagImageFile": "fr.png",
"countries": ["fr", "cd", "bj", "bf", "cd", "cg", "ga", "gn", "ml", "mc", "ne", "sn"],
"requiresUnicode": false,
"contributor": "Cocam",
"enabled": false
},
{
"id": 9,
"englishName": "Japanese",
"stringsFile": "japanese.json",
"isoCode": "jp",
"flagImageFile": "jp.png",
"countries": ["jp"],
"requiresUnicode": true,
"contributor": "Cocam",
"enabled": false
},
{
"id": 10,
"englishName": "Finnish",
"stringsFile": "finnish.json",
"isoCode": "fi",
"flagImageFile": "fi.png",
"countries": ["fi"],
"requiresUnicode": false,
"contributor": "SIMBA_MEOW",
"enabled": true
},
{
"id": 11,
"englishName": "Lithuanian",
"stringsFile": "lithuanian.json",
"isoCode": "lt",
"flagImageFile": "lt.png",
"countries": ["lt"],
"requiresUnicode": false,
"contributor": "dovis",
"enabled": false
},
{
"id": 12,
"englishName": "Latvian",
"stringsFile": "latvian.json",
"isoCode": "lv",
"flagImageFile": "lv.png",
"countries": ["lv"],
"requiresUnicode": false,
"contributor": "YuOn",
"enabled": false
}
]

View File

@@ -4,6 +4,7 @@
"applyUpkeep": true, "applyUpkeep": true,
"grossIncomeMultiplier": 1.0, "grossIncomeMultiplier": 1.0,
"incomeTaxRate": 0.7, "incomeTaxRate": 0.7,
"currencyString": "${AMOUNT}",
"upKeepCosts": { "upKeepCosts": {
"upKeepPerVehicle": 250, "upKeepPerVehicle": 250,
"upKeepPerHouse": 350, "upKeepPerHouse": 350,

150
config/locale.json Normal file
View File

@@ -0,0 +1,150 @@
{
"apiEmail": "example@example.com",
"defaultLanguageId": 0,
"translateURL": "http://api.mymemory.translated.net/get?de={3}&q={0}&langpair={1}|{2}",
"locales": [
{
"id": 0,
"englishName": "English",
"stringsFile": "english.json",
"isoCode": "en",
"flagImageFile": "uk.png",
"countries": ["gb", "us", "au", "bz", "ca", "ie", "jm", "nz", "za", "tt"],
"requiresUnicode": false,
"contributor": "Vortrex",
"enabled": true
},
{
"id": 1,
"englishName": "Russian",
"stringsFile": "russian.json",
"isoCode": "ru",
"flagImageFile": "ru.png",
"countries": ["ru", "ua"],
"requiresUnicode": false,
"contributor": "VNDTTS",
"enabled": true
},
{
"id": 2,
"englishName": "Polish",
"stringsFile": "polish.json",
"isoCode": "pl",
"flagImageFile": "pl.png",
"countries": ["pl"],
"requiresUnicode": false,
"contributor": "Suprise444",
"enabled": true
},
{
"id": 3,
"englishName": "Spanish",
"stringsFile": "spanish.json",
"isoCode": "es",
"flagImageFile": "es.png",
"countries": ["es", "ar", "bo", "cl", "co", "cr", "do", "ec", "sv", "gt", "hn", "mx", "ni", "pa", "py", "pe", "pr", "uy", "ve"],
"requiresUnicode": false,
"contributor": "PerikiyoXD",
"enabled": true
},
{
"id": 4,
"englishName": "Chinese",
"stringsFile": "chinese.json",
"isoCode": "zh",
"flagImageFile": "cn.png",
"countries": ["cn", "hk", "sg", "tw"],
"requiresUnicode": true,
"contributor": "Renzuko_Ctone",
"enabled": true
},
{
"id": 5,
"englishName": "Arabic",
"stringsFile": "arabic.json",
"isoCode": "ar",
"flagImageFile": "sa.png",
"countries": ["dz", "bh", "eg", "iq", "jo", "kw", "lb", "ly", "ma", "om", "qa", "sa", "sy", "tn", "ae", "ye"],
"requiresUnicode": true,
"contributor": "! KASIR",
"enabled": true
},
{
"id": 6,
"englishName": "Slovak",
"stringsFile": "slovak.json",
"isoCode": "sk",
"flagImageFile": "sk.png",
"countries": ["sk"],
"requiresUnicode": false,
"contributor": "UAKLAUS",
"enabled": false
},
{
"id": 7,
"englishName": "German",
"stringsFile": "german.json",
"isoCode": "de",
"flagImageFile": "de.png",
"countries": ["de", "at", "be", "ch", "li", "lu"],
"requiresUnicode": false,
"contributor": "Sladernimo",
"enabled": true
},
{
"id": 8,
"englishName": "French",
"stringsFile": "french.json",
"isoCode": "fr",
"flagImageFile": "fr.png",
"countries": ["fr", "cd", "bj", "bf", "cd", "cg", "ga", "gn", "ml", "mc", "ne", "sn"],
"requiresUnicode": false,
"contributor": "Cocam",
"enabled": false
},
{
"id": 9,
"englishName": "Japanese",
"stringsFile": "japanese.json",
"isoCode": "jp",
"flagImageFile": "jp.png",
"countries": ["jp"],
"requiresUnicode": true,
"contributor": "Cocam",
"enabled": false
},
{
"id": 10,
"englishName": "Finnish",
"stringsFile": "finnish.json",
"isoCode": "fi",
"flagImageFile": "fi.png",
"countries": ["fi"],
"requiresUnicode": false,
"contributor": "SIMBA_MEOW",
"enabled": true
},
{
"id": 11,
"englishName": "Lithuanian",
"stringsFile": "lithuanian.json",
"isoCode": "lt",
"flagImageFile": "lt.png",
"countries": ["lt"],
"requiresUnicode": false,
"contributor": "dovis",
"enabled": false
},
{
"id": 12,
"englishName": "Latvian",
"stringsFile": "latvian.json",
"isoCode": "lv",
"flagImageFile": "lv.png",
"countries": ["lv"],
"requiresUnicode": false,
"contributor": "YuOn",
"enabled": false
}
]
}

Binary file not shown.

BIN
files/fonts/pricedown.ttf Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

BIN
files/images/cursor.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 476 B

BIN
files/images/flags/cn.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

BIN
files/images/flags/de.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

BIN
files/images/flags/es.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 289 KiB

BIN
files/images/flags/fi.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

BIN
files/images/flags/fr.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

BIN
files/images/flags/jp.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

BIN
files/images/flags/pl.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

BIN
files/images/flags/ru.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

BIN
files/images/flags/sa.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 269 KiB

BIN
files/images/flags/sk.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

BIN
files/images/flags/uk.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

BIN
files/images/gtac-logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

BIN
files/images/skins/none.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

558
locale/finnish.json Normal file
View File

@@ -0,0 +1,558 @@
{
"TranslationProvidedBy": "SIMBA_MEOW",
"LocaleEnglishName": "Finnish",
"LocaleNativeName": "Finnish",
"LocaleOffer": "Tämä Serveri on nyt käytettävissä suomen kielellä Käytä {1} jotta voit käyttää sitä",
"LocaleChanged1": "Sinun kieli on nyt vaihdettu suomeen. {1}",
"LocaleChanged2": "Tämä serveri nyt näyttää tekstit suomen kielellä. {1}",
"LocaleChangedNote": "Tämä ei vaihda tekstejä muilta pelaajilta.",
"AccentsListHeader": "Aksentit",
"HelpMainListHeader": "Ohje luokat",
"AccentNotFound": "Aksenttia ei löydetty",
"AccentSet": "Sinä vaihdoit sinun aksentin{1}",
"InvalidAnimation": "Tuo animaatio on väärä.",
"AnimationCommandTip": "Käytä {1} että näet listan toimivia animaatioita.",
"InvalidAnimationDistance": "etäisyyden pitää olla väliin 0 ja 3",
"AnimationStopCommandTip": "Käytä {1} lopettaaksesi animaation",
"CantBanClient": "Sinä et voi bannätä tätä pelaajaa",
"PlayerAccountBanned": "{1} Käyttäjä on nyt bannätty",
"ClanNotFound": "Claania ei löydetty",
"ClanNameTaken": "Claani tuolla nimellä on jo otettu",
"PlayerNotFound": "Pelaajaa ei löytynyt ",
"ClanCantRemoveRanks": "Sinä et voi poistaa tämän claanin rankkejä",
"ClanCantAddRanks": "sinä et voi lisätä claani ranksejä",
"ClanRankNotFound": "Claanin nimeä ei loytynyt",
"ClanCantChangeMemberTag": " Sinä et voi vaihtaa claanin jäsenen tagejä",
"ClanPlayerNotInSameClan": "Tuo pelaaja ei ole sinun claanissa.",
"ClanCantChangeRankLevel": "Sinä et voi vaihtaa claanin rankin leveleitä",
"ClanCantChangeRankTag": "Sinä et voi vaihtaa claanin rankin tägeja",
"NameNotRegistered": "Sinun käyttäjä ei ole Rekisteröitu! Käytä {1} että voit tehdä käyttäjän",
"AutomaticLoginIPToggle": "Automaatinen Kirjautuminen IP ltä on nyt päällä {1}",
"CouldNotRegisterAccount": "tässä oli ongelma luodettasi käyttäjää. Ole hyvä ja kysy adminilta.",
"RandomTipsToggle": "Randomi vinkit ovat nyt {1}",
"ActionTipsToggle": "toiminta vinkit ovat nyt {1}",
"AutoSpawnLastCharToggle": "Automaattinen spawni viimeksi käytettynä hahmo on {1}",
"AccountGUISettingToggle": "🖥️ GUI on nyt päällä {1}",
"On": "On",
"Off": "Off",
"Yes": "Kyllä",
"No": "Ei",
"True": "oikea",
"False": "väärin",
"Locked": "Lukittu",
"Unlocked": "Lukitsematon",
"PasswordNotGoodEnough": "Uusi salasana ei täytä vaatimuksia!",
"PasswordNeedsBase": "Salasanallasi pitää olla ainakin yksi {1}",
"PasswordNeedsCapitals": "{1} ISON alku kirjaimen",
"PasswordNeedsNumbers": "{1} Numerot",
"PasswordNeedsSymbols": "{1} Symboolit",
"PasswordsDontMatch": "Uusi salasana ja salasanan vahvistus eivät ole samat!",
"PasswordChanged": "Sinun salasanasi on vaihdettu!",
"AutoLoggedInIP": "Olet kirjautunut automaattisesti sisään IP osoitteella!",
"WelcomeBack": "Tervetuloa takaisin {1}, {2}! ole hyvä {3} jatkaaksesi.",
"WelcomeNewPlayer": "Tervetuloa {1}, {2}! ole hyvä {3} pelataaksesi.",
"InvalidPlayer": "Pelaajaa ei löytynyt!",
"InvalidBusiness": "Bisnestä ei löytynyt!",
"InvalidHouse": "Taloa ei löytynyt!",
"InvalidVehicle": "Ajoneuvoa ei löytynyt!",
"InvalidClan": "Claania ei löytynyt!",
"InvalidClanRank": "Claanin rankkiä ei löytynyt!",
"InvalidJob": "Työtä ei löytynyt!",
"InvalidItem": "kohdetta ei löytynyt!",
"InvalidItemType": "kohteen tyyppiä ei löytynyt!",
"InvalidRadioStation": "Radio kanavaa ei löytynyt!",
"InvalidGate": "porttia ei löytynyt!",
"EntersProperty": "avaa oven ja astuu sisään {1}",
"ExitsProperty": "avaa oven ja astuu pois {1}",
"EnterExitPropertyDoorLocked": "yrittää avata oven {1} ovi mutta epäonnistuu koska se on lukittu",
"PropertyNoInterior": "Tämä {1} ei sisällä sisätilaa, mutta voit silti käyttää komentoja ovikuvakkeessa.",
"NoBusinessWithItemType": "täällä ei ole kauppaa kyseisen tuotteen kanssa",
"HeaderKeyBinds": "avain sitoo",
"HeaderAccountHelp": "Käyttäjä apu",
"HeaderVehicleHelp": "ajoneuvo apu",
"HeaderVehicleDealershipHelp": "Ajoneuvo liikkeen apu",
"HeaderJobHelp": "työ apu",
"HeaderChatHelp": "Chatti apu",
"HeaderServerRules": "Serverin säännöt",
"HeaderWebsiteInfo": "Verkkosivusto",
"HeaderDiscordInfo": "Discord",
"HeaderAnimationsList": "Animaatioluettelo",
"HeaderPayAndSprayHelp": "maksa ja suihkuta apu",
"HeaderAmmunationHelp": "Ase kauppa apu",
"HeaderVehicleTuneupHelp": "ajoneuvon sävelmä apu",
"HeaderBindableKeysHelp": "sidottavat avaimet",
"HeaderSkinHelp": "Vaatteet/iho apu",
"HeaderBusinessHelp": "Kauppa/bisnes apu",
"HeaderClanHelp": "Claanin apu",
"HeaderPlayerVehiclesList": "pelaajan ajoneuvot ({1})",
"HeaderPlayerBusinessesList": "pelaajan bisnekset ({1})",
"HeaderClansList": "Claani Lista",
"HeaderAdminsList": "Admini Lista",
"HeaderBadgeInfo": "merkki Informaatio",
"HeaderAccentsList": "Aksentti Lista",
"HeaderPlayerInfo": "Pelaajan Informaatio ({1})",
"HeaderWealthandTaxHelp": "varallisuus and verot Informaatio",
"HeaderCommandInfo": "komennon Informaatio ({1})",
"HeaderRadioHelp": "Radio apu",
"HeaderRadioStationsList": "Radio asemat/kanavat",
"HeaderKeyBindsList": "avain sitomis Lista",
"RadioVolumeChanged": "{1} Sinä vaihdoit sinun radion ääniä to {2}%",
"VolumeLevelNotNumber": "Äänenvoimakkuuden on oltava numero",
"RadioStationLocationInvalid": "Sinun on oltava ajoneuvossa, talossa tai yrityksessä tai sinulla on oltava henkilökohtainen laite vaihtaaksesi radio asemaa!",
"ActionBusinessRadioStationChange": "vaihtaa bisnes radioasemaksi {1} ({2})",
"ActionHouseRadioStationChange": "muuttaa talon radioasemaksi {1} ({2})",
"ActionVehicleRadioStationChange": "vaihtaa ajoneuvon radioasemaksi {1} ({2})",
"ActionItemRadioStationChange": "vaihtaa {1}'s aseman {2} ({3})",
"RandomVehicleCommandsDisabled": "Tämä on satunnainen liikenneajoneuvo, eikä siihen voi käyttää komentoja.",
"HouseDoorLock": "Talo {1} {2}!",
"BusinessDoorLock": "Bisnes {1} {2}!",
"ServerGameModeRestarting": "Palvelinpelitila käynnistyy uudelleen!",
"HeaderSelfItemList": "Sinun inventoori",
"HeaderPlayerItemList": "Pelaajan inventoori ({1})",
"HeaderHouseItemList": "Talon inventoori",
"HeaderBusinessFloorItemList": "Bisnes Inventoori (myyntiin)",
"HeaderBusinessStorageItemList": "Bisnes Inventoori (tila)",
"HeaderItemItemList": "{1}'s Inventoori",
"ItemSlotNotNumber": "Tuotepaikan on oltava numero",
"ItemSlotMustBeBetween": "Tuotepaikan tulee olla välillä {1} ja {2}!",
"UseItemBugged": "Kohde, jota yrität käyttää, on viallinen. Virheraportti on lähetetty palvelimen kehittäjille.",
"PickupItemBugged": "Tuote, jota yrität ottaa, on viallinen. Virheraportti on lähetetty palvelimen kehittäjille.",
"DropItemBugged": "Kohde, jonka yrität pudottaa, on viallinen. Virheraportti on lähetetty palvelimen kehittäjille.",
"HandsBusy": "kätesi ovat vararru",
"CantUseItemInSkinChange": "Et voi käyttää kohdetta muokkaaessasi ulkonäköäsi",
"CantDropItemInSkinChange": "Et voi pudottaa esinettä, kun muokkaat ulkonäköäsi",
"CantPickupItemInSkinChange": "Et voi ottaa tuotetta, kun muokkaat ulkonäköäsi",
"CantSwitchItemInSkinChange": "Et voi vaihtaa kohdetta muokkaaessasi ulkonäköäsi",
"CantGiveItemInSkinChange": "Et voi antaa esinettä, kun muokkaat ulkonäköäsi",
"CantTakeItemInSkinChange": "Et voi ottaa esinettä mukauttaessasi ulkonäköäsi",
"ItemUnequippableNoAmmo": " {1} paikassa {2} ei ole ammuksia, eikä sitä voi varustaa!",
"NoSpaceSelfInventory": "Sinulla ei ole enää tilaa varastossasi",
"Business": "bisnes",
"House": "talo",
"Clan": "claani",
"Vehicle": "ajoneuvo",
"Item": "kohde",
"ItemType": "kohteen tyyppi",
"Gate": "portti",
"Door": "ovi",
"ClanRank": "claan ränkki",
"JobRank": "työ ränkki",
"RadioStation": "radio kanava",
"Months": [
"Tammikuu",
"Helmikuu",
"Maaliskuu",
"Huhtikuu",
"Toukokuu",
"Kesäkuu",
"Heinäkuu",
"Elokuu",
"Syyskuu",
"Lokakuu",
"Marraskuu",
"Joulukuu"
],
"WeekDays": [
"Sunnuntai",
"Maanantai",
"Tiistai",
"Keskiviikko",
"Torstai",
"Perjantai",
"Lauantai"
],
"CardinalDirections": [
"Pohjoinen",
"Koilinen",
"Itä",
"Kaakko",
"Etelä",
"Lounas",
"Länsi",
"Luonteinen"
],
"NewPlayerReadyToPlay": [
"Sinulle on annettu rahaa. Käyttää {1} löytää ostopaikkoja.",
"Jos tarvitset rahaa, työpaikat ovat keltaisia pisteitä tutkassa.",
"Autoa varten käy autoliikkeessä. Voit myös käyttää vuokra-ajoneuvoa spawnin lähellä tai matkustaa junalla",
"Muista lukea tämä{1} Ja käyttää {2} tiedoksi"
],
"YourCurrentVehicleDeleted": "ajoneuvo, jossa olit, poistettiin.",
"Distance": "Etäisyys",
"Meters": "Metrejä",
"Feet": "jalkaa",
"Kilometers": "Kilometrejä",
"Miles": "Maileja",
"MustBeVehicleDriver": "Sinun on oltava ajoneuvon kuljettaja!",
"PlayerJoined": "{1} on liittynyt peliin {2}!",
"PlayerLeftServer": "{1} poistui pelistä! ({2})",
"TakeItemFromHouse": "ottaa {1} talosta",
"TakeItemFromBusinessStorage": "ottaa {1} varastosta",
"TakeItemFromBusiness": "ottaaa {1} bisneksestä",
"TakeItemFromItem": "ottaa {1} {2}",
"TakeItemFromVehicleTrunk": "ottaa {1} tavaratilasta",
"TakeItemFromVehicleDash": "ottaa {1} hansikaslokerosta",
"JobEquipmentInventoryKeyBindTip": "Työvälineet ovat varastossasi. Paina {1} että näet sen",
"JobEquipmentInventoryCommandTip": "Työvälineet ovat varastossasi. Käytä {1} että näet sen.",
"AccountHelp": [
"ÄLÄ jaa salasanaasi kenenkään muun kanssa. {1} henkilökunta ei koskaan kysy sinulta salasanaasi",
"Käytä {1} vaihtaaksesi salasanasi ja {2} jos unohdit sen",
"Some settings you can use: {1}"
],
"VehicleHelp": [
"Henkilökohtaiset ajoneuvosi säästävät minne sinä tai joku muu jättää ne!",
"Vieraile jälleenmyyjissä ostamassa uusia ajoneuvoja (Käytä {1} saadaksesi lisää tietoa)",
"Some commands: {1}",
"Vieraile mekaanikkokorjaamolla korjaamassa, värjäämässä ja virittämässä autosi! {1} saadaaksesi tietoa"
],
"VehicleDealershipHelp": [
"Vieraile ajoneuvoliikkeessä ostamassa uusia ajoneuvoja. Käytä {1} löytääksesi yhden.",
"Jälleenmyyjällä mene auton sisään auto, jonka haluat ostaa, ja hinta näytetään sinulle",
"Jos haluat ostaa ajoneuvon, käytä {1}ja sinulle annetaan avaimet koeajeluun parkkipaikalla.",
"Aja pois jälleenmyyjältä uudella ajoneuvolla vahvistaaksesi oston."
],
"JobHelp": [
"Vieraile työpaikoilla saadaksesi työtä ja ansaitaksesi rahaa. Etsi kartalta keltaisia pisteitä",
"työpaikalla Käytä {1} saadaaksesi työpaikan. Käytä {2} lopettamaan työsi",
"Käytä {1} Aloittaaksesi työn. Sinä voit myös saada työn {2} ja {3}",
"useimmat työajoneuvot ovat lukittuja. Käytä {1} lähdellä yhtä astuaaksesi autoon.",
"Kun astut työajoneuvoon, sinulle näytetään tietoja työn suorittamisesta."
],
"ChatHelp": [
"There are two main types of chat: luonteen vastaisesti (OOC) ja luonteeltaan (IC)",
"Näiden kahden tyypin sekoittaminen ei ole oikea roolileikki. Katso {1} saadaaksesi lisää tietoa.",
"Some chat commands: {1}",
"Joillakin on saatavilla lyhyempiä nimiä ({1} puhua, {2} huutaa jne)"
],
"ServerRulesHelp": [
"Epärealistiset toimet (voimapelaaminen) eivät ole sallittuja. Et ole supermies.",
"Terroristin tai terrorismin roolileikkejä ei sallita.",
"Noudata aina moderaattorien ja järjestelmänvalvojien antamia ohjeita.",
"Älä sekoita keskusteluja (metapelaaminen). Et voi käyttää IC:ssä olevia tietoja, jotka vastaanotettiin OOC",
"Pidä englantia pääkeskusteluissa. Jos sinulla ei ole hyvää englantia, käytä {1}"
],
"AnimationHelp": [
"Animaatioiden avulla voit tehostaa roolipeliä visuaalisilla toimilla",
"Käytä nimeä {1} tai {2}, jos haluat käyttää animaatiota.",
"Näet luettelon animaatioista käyttämällä {1}"
],
"WeaponHelp": [
"Käy aseliikkeessä ostamaan aseita. Käytä {1} löytääksesi sellaisen.",
"Aseen ostaminen vaatii aseluvan.",
"Poliisilaitos hallinnoi aselupia. Hae siellä saadaksesi sellaisen.",
"Aseita voidaan ostaa myös laittomasti joiltakin yrityksiltä, asekauppiailta ja claaneista."
],
"SkinHelp": [
"Käytä vaatekaupassa {1} vaatteiden ostamiseen",
"Kun sinulla on vaate, varusta ja käytä sitä kuten mitä tahansa muuta esinettä näyttääksesi ihovalikoiman (katso {1} saadaksesi lisätietoja vaatteiden käytöstä)",
"Jotkin skinit on rajoitettu töihin, claaneihin tai muista syistä."
],
"KeyBindHelp": [
"Voit asettaa omat näppäinsidokset. Käytä {1} nähdäksesi sidotut avaimet.",
"Käytä {1} lisätäksesi uuden näppäimistön ja {2} poistaaksesi yhden.",
"Default keys are:{1} {1} ajoneuvon moottorille, {2} valoille ja {3} lukitsemiselle/lukituksen avaamiselle",
"Paina {1} nähdäksesi kohteesi ja {2} varustaaksesi kohteita tai {3} poistaaksesi kaikki.",
"Paina {1} käyttääksesi kohdetta, jota pidät, paina {2} pudottaaksesi sen tai paina {3} noutaaksesi esineen maasta."
],
"BusinessHelp": [
"Käytä {1} tuotteiden ostamiseen tai {2} nähdäksesi luettelon myytävistä missä tahansa yrityksessä",
"Yritykset näkyvät sinisillä nimillä sisäänkäynnin kuvakkeen yläpuolella.",
"Yrityksen omistajan komennot: {1}",
"Uusi myytävä auto ilmestyy, kun ajat pois myyjän luota."
],
"ClanHelp": [
"Pyydä järjestelmänvalvojaa luomaan Claani (Samanlainen kuin ryhmät/ryhmät/perheet)",
"Claanin omistajilla on täysi määräysvalta klaaniin, kun se on luotu",
"Clanin komennot: {1}",
"Lisää klaanikomentoja: {1}"
],
"RadioStationHelp": [
"Aseta asema ajoneuvollesi, talollesi tai yrityksellesi käyttämällä {1}-merkkiä",
"Käytä {2} nähdäksesi luettelon asemista",
"Voit muuttaa radion suoratoiston äänenvoimakkuutta käyttämällä {1}-arvoa 0-100 prosentteina"
],
"WealthAndTaxHelp": [
"Palkkapäivän verot ovat {1} prosenttia lasketusta omaisuudestasi.",
"Laskettu varallisuus on kokonaissumma, joka perustuu siihen, kuinka monta ajoneuvoa, taloa ja yritystä sinulla on.",
"Jokainen ajoneuvo on {1}, jokainen talo on {2} ja jokainen yritys on {3}",
"Käytä {1} nähdäksesi nykyisen varallisuutesi ja {2} nähdäksesi kuinka paljon maksat veroja jokaisena palkkapäivänä"
],
"MustBeInAVehicle": "Sinun täytyy olla ajoneuvossa!",
"MustBeInOrNearVehicle": "Sinun on oltava ajoneuvossa tai sen lähellä!",
"MustBeInVehicleFrontSeat": "Sinun tulee istua auton etupenkillä!",
"MustBeInVehicleDriverSeat": "Sinun täytyy olla kuljettaja!",
"DontHaveVehicleKey": "Sinulla ei ole avainta tähän ajoneuvoon!",
"NoGateAccess": "Sinulla ei ole pääsyä tälle portille!",
"GateBroken": "tämä portti on rikki!",
"GateHacked": "Portti ei vastaa!",
"RadioJammed": "Radiosta kuuluu vain staattista ääntä.",
"VehicleNotForSale": "Tämä ajoneuvo ei ole myynnissä!",
"VehicleNotForRent": "This vehicle is not for rent!",
"BusinessNotForSale": "Tämä yritys ei ole myytävänä!",
"BusinessNotForRent": "Tämä yritys ei ole vuokrattavissa!",
"HouseNotForSale": "Tämä talo ei ole myynnissä!",
"HouseNotForRent": "Tämä talo ei ole vuokrattavissa!",
"DealershipPurchaseTestDrive": "Aja ajoneuvo pois jälleenmyyjältä ostaaksesi se tai mene ulos peruuttaaksesi.",
"DealershipPurchaseExitedVehicle": "Peruutit ajoneuvon oston poistumalla ajoneuvosta!",
"VehiclePurchaseComplete": "Tämä ajoneuvo on nyt sinun! Se säästyy minne jätätkin sen.",
"VehiclePurchaseNotEnoughMoney": "Sinulla ei ole tarpeeksi rahaa ostaa tätä ajoneuvoa!",
"HousePurchaseNotEnoughMoney": "Sinulla ei ole tarpeeksi rahaa ostaa tätä taloa!",
"BusinessPurchaseNotEnoughMoney": "Sinulla ei ole tarpeeksi rahaa ostaa tätä yritystä",
"ADDED-21JAN2022": "DO NOT TRANSLATE. This string is just a comment to separate newly added translations.",
"HeaderPlayerHousesList": "Player Houses ({1})",
"HeaderPlayerStaffFlagsList": "Player Staff Flags ({1})",
"HeaderStaffFlagsList": "Staff Flags",
"NonRPName": "Non-RP name! Choose a new one:",
"InvalidStaffFlag": "Staff flag not found!",
"InvalidClanFlag": "Clan flag not found!",
"InvalidLocale": "Language not found!",
"HeaderJobUniformList": "Job Uniforms ({1})",
"HeaderJobEquipmentList": "Job Equipment ({1})",
"InvalidJobUniform": "Job uniform not found!",
"InvalidJobEquipment": "Job equipment not found!",
"HeaderVehiclesInRangeList": "Vehicles within {1}",
"NoVehiclesWithInRange": "There are no vehicles within {1}",
"AmountNotNumber": "The amount must be a number!",
"NeedToBeWorking": "You need to be working! Use {1} at a job location or near a job vehicle.",
"NeedToBeOnJobRoute": "You need to be doing a job route! Use {1} in a job vehicle",
"CurrentJobRouteDeleted": "The job route you were on has been deleted by an admin",
"CurrentJobRouteVehicleColoursChanged": "Your job route's vehicle colours were changed by an admin",
"NotYourJob": "This is not your job!",
"JobPoints": "You can get a job by going the yellow points on the map.",
"QuitJobToTakeAnother": "If you want this job, use {1} to quit your current job.",
"NotAJobVehicle": "This is not a job vehicle!",
"NotYourJobVehicle": "This is not your job's vehicle!",
"JobRouteDisabled": "The job route you were on has been disabled by an admin",
"HeaderPickupTypes": "Pickup Types",
"HeaderBlipTypes": "Map Icon Types",
"InvalidGPSLocation": "There are no locations with that name or type",
"HeaderBusinessList": "Businesses",
"VehicleForSale": "This {1} is buyable for {2}! Use {3} if you want to buy it",
"VehicleForRent": "This {1} is rentable for {2}! Use {3} if you want to rent it",
"ADDED-31JAN2022": "DO NOT TRANSLATE. This string is just a comment to separate newly added translations.",
"LoginFailedInvalidPassword": "Invalid password! {1} attempts remaining",
"LoginFailedNoPassword": "You must enter a password! ! {1} attempts remaining",
"RegistrationFailedNoPassword": "You must enter a password!",
"RegistrationFailedNoPasswordConfirm": "You must confirm the password!",
"RegistrationFailedNoEmail": "You must enter an email!",
"AccountNameAlreadyRegistered": "Your name is already registered!",
"AlreadyLoggedIn": "You are already logged in!",
"RegistrationFailedInvalidEmail": "That email is invalid!",
"RegistrationFailedPasswordMismatch": "The passwords don't match!",
"RegistrationFailedCreateError": "Your account couldn't be created!",
"RegistrationSuccess": "Your account has been created!",
"RegistrationEmailVerifyReminder": "Don't forget to verify your email! A verification code has been sent to you.",
"RegistrationCreateCharReminder": "To play on the server, you will need to make a character.",
"NoCharactersGUIMessage": "You have no characters. Would you like to make one?",
"NoCharactersGUIWindowTitle": "No characters",
"NoCharactersChatMessage": "You have no characters. Use {1} to make one.",
"NeedEmailFor2FA": "You need to add your email to your account to use two-factor authentication.",
"NeedEmailVerifiedFor2FA": "You need to verify your email to use two-factor authentication.",
"SetEmailHelpTip": "Use {1} to set your email.",
"VerifyEmailHelpTip": "Use {1} to verify your email.",
"ADDED-13FEB2022": "DO NOT TRANSLATE. This string is just a comment to separate newly added translations.",
"NearbyRadio": "Nearby radio",
"FromRadio": "From radio",
"ToRadio": "To radio",
"NeedToEnterPropertyCommand": "You need to enter the {1} first! Use {2} to enter and exit",
"NeedToEnterPropertyKeyPress": "You need to enter the {1} first! Press {2} to enter and exit",
"InventoryFullCantCarry": "You don't have any space to carry this (full inventory)!",
"NotEnoughCashNeedAmountMore": "You don't have enough money! You need {1} more!",
"AmountMustBeMoreThan": "The amount must be more than {1}!",
"WeaponBanned": "You are not allowed to buy or use weapons!",
"TimeNotNumber": "The time must be a number",
"HeaderDefaultBusinessItemTypes": "Business Item Templates",
"FixingStuck": "Fixing your position and virtual world ...",
"CantUseCommandYet": "You must wait before you can use this command again!",
"NotATester": "You are not a tester!",
"AccessDenied": "AccessDenied",
"InvalidSkin": "That skin is invalid!",
"HeaderInteriorTypes": "Interiors List",
"ViewInventoryKeyPressTip": "Press {1} to see your items",
"ViewInventoryCommandTip": "Use {1} to see your items",
"GUIAccountSettingToggle": "You have turned {1} GUI",
"ADDED-23MAR2022": "DO NOT TRANSLATE. This string is just a comment to separate newly added translations",
"CarCommandHelp": "You can buy a car by visiting a vehicle dealership. Use {1} for more information.",
"SkinCommandHelp": "You can change your skin by visiting a clothes store. Use {1} for more info.",
"BusinessVehiclesRespawned": "🚗 All business vehicles have been respawned by an admin!",
"JobVehiclesRespawned": "🚗 All job vehicles have been respawned by an admin!",
"PlayerVehiclesRespawned": "🚗 All player vehicles have been respawned by an admin!",
"ClanVehiclesRespawned": "🚗 All clan vehicles have been respawned by an admin!",
"PublicVehiclesRespawned": "🚗 All public have been respawned by an admin!",
"EmptyVehiclesRespawned": "🚗 All empty vehicles have been respawned by an admin!",
"AllVehiclesRespawned": "🚗 All vehicles have been respawned by an admin!",
"AllVehiclesReloaded": "🚗 All vehicles have been reloaded by an admin!",
"YourVehicleRespawned": "🚗 Your vehicle has been respawned!",
"PlayerIPBanned": "💀 {1} has been IP banned!",
"PlayerCharacterBanned": "💀 {1} has been character banned!",
"PlayerSubNetBanned": "💀 {1} has been subnet banned!",
"CantModifyBusiness": "You can't manage or modify this business!",
"CantModifyHouse": "You can't manage or modify this house!",
"ServerTimeSet": "⏰ {1} set the time to {2}",
"ServerWeatherSet": "☁️ {1} set the weather to {2}",
"ServerSnowSet": "❄️ {1} turned falling snow {2} and ground snow {3}",
"AllJobsReloaded": "💼 All server jobs have been reloaded by an admin",
"ServerLogoSet": "{1} turned the server logo image {2}",
"ServerGUISet": "🖥️ {1} turned GUI for this server {2}",
"ServerBusinessBlipsSet": "🏢 {1} turned all business blips {2}",
"ServerHouseBlipsSet": "🏘️ {1} turned all house blips {2}",
"ServerJobBlipsSet": "💼 {1} turned all job blips {2}",
"ServerBusinessPickupsSet": "🏢 {1} turned all business pickups {2}",
"ServerHousePickupsSet": "🏘️ {1} turned all house pickups {2}",
"ServerJobPickupsSet": "💼 {1} turned on all job pickups {2}",
"BusinessBuyItemsLabel": "Use {1} to purchase items",
"PropertyEnterCommandLabel": "Use {1} to enter",
"PropertyEnterKeyPressLabel": "Press {1} to enter",
"PropertyForSaleLabel": "For sale: ${1}",
"PropertyForRentLabel": "For rent: ${1} every payday",
"RemainingTaxPaidInMoney": "You covered the remaining taxes with ${1} in cash.",
"LostMoneyFromTaxes": "You lost money since your taxes are more than your paycheck!",
"NextPaycheckRepossessionWarning": "If you don't have enough cash to cover taxes on next paycheck, you will lose stuff!",
"NotEnoughMoneyForTax": "You don't have enough money to cover your taxes!",
"AssetsRepossessedForTax": "You lost {1} vehicles, {2} houses, and {3} businesses because you couldn't pay taxes!",
"Closed": "Closed",
"Open": "Open",
"VehicleDealershipLabel": "Enter a vehicle as driver to buy it",
"TakeJobLabel": "Use {1} to work here",
"StartWorkLabel": "Use {1} to start working",
"JobEquipAndUniformLabel": "Use {1} and {2} for job stuff, or {3} to stop working",
"NotYourJobLabel": "You already have a different job. Use {1} if you want this one",
"JobLabel": "{1} Job",
"PaydayBonusSet": "🤑 {1} set the payday bonus to ${2}",
"AllHousesReloaded": "🏘️ All houses have been reloaded by an admin",
"AllRadioStationsReloaded": "📻 All radio stations have been reloaded by an admin!",
"PlayerKicked": "🦶 {1} has been kicked from the server",
"AllBusinessesReloaded": "🏢 All businesses have been reloaded by an admin!",
"UnableToDoThat": "You aren't able to do that",
"SetVehicleClanConfirmMessage": "Are you sure you want to give this vehicle to your clan?",
"SetVehicleClanConfirmTitle": "Warning!",
"SetItemPriceBelowOrderPriceMessage": "Are you sure you want to set the item price below it's order price? You will lose ${1} every purchase!",
"SetItemPriceBelowOrderPriceTitle": "Warning!",
"MustOwnVehicle": "You don't own this vehicle!",
"RandomTips": [
"Look for yellow dots on your map for job locations",
"You can set custom key binds. Use {1} for details",
"Use {1} if you don't want to see tips and extra information",
"You can edit your keybinds using {1} and {2}",
"Press to see your inventory, and use number keys to select an item",
"Use {1} at a business to purchase items",
"Found a bug? Report it with {1}",
"Have an idea or suggestion for the server? Let the devs know using {1}",
"Want to buy a business? Use {1} at one for sale",
"Want to buy a house? Use {1} at one for sale",
"Want to buy a vehicle? Visit a dealership and enter one for info on how to buy it!",
"Switch to any of your characters with {1}",
"Use {1} to automatically login when connecting with the same IP",
"Use {1} to turn on/off the lights in your house or business",
"Use {1} to play an internet radio station in your car, house, or business",
"Want to make a clan? Use {1} for details",
"Legal weapons can be purchased at any ammunation"
],
"PromptResponseTip": "Use {1} to accept or {2} to decline",
"PlayerConnecting": "👋 {1} is connecting to the server ...",
"GetStartedJobVehicle": "Get in a {1} to get started.",
"VehicleTypes": {
"Car": "Car",
"Truck": "Truck",
"Van": "Van",
"Taxi": "Taxi",
"Bus": "Bus",
"PoliceCar": "Police Car",
"Ambulance": "Ambulance",
"FireTruck": "Fire Truck",
"Bike": "Bike",
"Motorbike": "Motorbike",
"Boat": "Boat",
"Helicopter": "Helicopter",
"Plane": "Plane",
"Train": "Train"
},
"AlreadyOnJobRoute": "You are already doing a job route!",
"GaveVehicleToClan": "You gave this {1} to your clan!",
"JobDisabled": "This job is disabled!",
"SetHouseClanConfirmMessage": "Are you sure you want to give this house to your clan?",
"SetHouseClanConfirmTitle": "Warning!",
"SetBusinessClanConfirmMessage": "Are you sure you want to give this business to your clan?",
"SetBusinessClanConfirmTitle": "Warning!",
"MustOwnHouse": "You don't own this house!",
"MustOwnBusiness": "You don't own this business!",
"GaveHouseToClan": "You gave this house to your clan!",
"GaveBusinessToClan": "You gave this business to your clan!",
"BuyBusinessConfirmMessage": "Are you sure you want to buy this business?",
"BuyBusinessConfirmTitle": "Attention!",
"BuyHouseConfirmMessage": "Are you sure you want to buy this house?",
"BuyHouseConfirmTitle": "Attention!",
"BuyBusinessLabel": "Use {1} to buy this business",
"BuyHouseLabel": "Use {1} to buy this house",
"RentHouseLabel": "Use {1} to rent this house",
"DisconnectReasons": [
"Lost Connection",
"Disconnected",
"Unsupported Client",
"Wrong Game",
"Incorrect Password",
"Unsupported Executable",
"Disconnected",
"Banned",
"Failed",
"Invalid Name",
"Crashed",
"Modified Game"
],
"AccountEmailAlreadyVerified": "You already set and verified your email!",
"EmailVerificationCodeSent": "A verification code and instructions have been sent to your email.",
"GUIPlayAsCharacterButton": "Play",
"GUINewCharacterButton": "New character",
"GUIPreviousCharacterButton": "Previous",
"GUINextCharacterButton": "Next",
"GUICharacterSelectWindowTitle": "Select a character",
"GUICharacterSelectMoneyLabel": "Money: ${1}",
"GUICharacterSelectClanLabel": "Clan: {1}",
"GUICharacterSelectLastPlayedLabel": "Last Played: {1} days, {2} hours, {3} minutes ago",
"GUILoginWindowLabelEnterPassword": "Please enter your password",
"GUILoginWindowSubmitButton": "Login",
"GUILoginWindowResetPasswordButton": "Reset password",
"GUILoginWindowPasswordPlaceholder": "Password",
"GUILoginWindowForgotPasswordLabel": "Forgot your password?",
"GUIRegisterWindowLabelCreateAccount": "Create an account",
"GUIRegisterWindowPasswordPlaceholder": "Password",
"GUIRegisterWindowConfirmPasswordPlaceholder": "Confirm password",
"GUIRegisterWindowEmailPlaceholder": "Email",
"GUIRegisterWindowSubmitButton": "Create account",
"GUINewCharacterMessageLabel": "Name your character",
"GUINewCharacterFirstNamePlaceholder": "First Name",
"GUINewCharacterLastNamePlaceholder": "Last Name",
"GUIChangePasswordWindowTitle": "Change Password",
"GUIChangePasswordPasswordLabel": "Enter a new password",
"GUIChangePasswordPasswordPlaceholder": "Password",
"GUIChangePasswordConfirmPasswordPlaceholder": "Confirm password",
"GUIChangePasswordSubmitButton": "Change Password",
"GUIResetPasswordWindowMessage": "Reset Password",
"GUIResetPasswordConfirmEmailLabel": "Please confirm your email",
"GUIResetPasswordEmailPlaceholder": "Email",
"GUIResetPasswordSubmitButton": "Reset Password",
"GUIResetPasswordLoginButton": "Login",
"GUIResetPasswordRememberMessage": "Remember your password?",
"HeaderJobList": "Jobs",
"HeaderBusinessInfo": "Business Info",
"HeaderHouseInfo": "House Info",
"HeaderClanInfo": "Clan Info",
"Locales": {
"English": "Englanti",
"Russian": "Venäjä",
"Spanish": "Espanja",
"German": "Saksa",
"Dutch": "Hollanti",
"Polish": "Puola",
"Chinese": "Chinese",
"French": "French",
"Japanese": "Japanese",
"Slovak": "Slovak",
"Arabic": "Arabic"
}
}

559
locale/french.json Normal file
View File

@@ -0,0 +1,559 @@
{
"TranslationProvidedBy": "Cocam",
"LocaleEnglishName": "French",
"LocaleNativeName": "Français",
"LocaleOffer": "Ce serveur est disponible en Français. Appuie sur {1} pour changer la langue.",
"LocaleChanged1": "La langue est maintenant paramétrée sur {1}",
"LocaleChanged2": "Le serveur va maintenant afficher les messages en {1}",
"LocaleChangedNote": "Cela ne change pas les messages des autres joueurs",
"AccentsListHeader": "Accents",
"HelpMainListHeader": "Aide Catégorie",
"AccentNotFound": "Accent non trouvé",
"AccentSet": "Vous avez paramétré votre accent sur {1}",
"InvalidAnimation": "L'animation n'existe pas",
"AnimationCommandTip": "Utilise la commande {1} pour voir la liste des animations valides",
"InvalidAnimationDistance": "La distance doit être entre 0 et 3",
"AnimationStopCommandTip": "Utilise la commande {1} pour arrêter l'animation",
"CantBanClient": "Vous ne pouvez pas bannir cette personne",
"PlayerAccountBanned": "le compte {1} a été banni",
"ClanNotFound": "Clan non trouvé",
"ClanNameTaken": "Un clan avec ce nom existe déjà",
"PlayerNotFound": "Joueur non trouvé",
"ClanCantRemoveRanks": "Vous ne pouvez pas retirer le rang du clan",
"ClanCantAddRanks": "Vous ne pouvez pas ajouter de rang au clan",
"ClanRankNotFound": "Le rang du clan est introuvable",
"ClanCantChangeMemberTag": "Vous ne pouvez pas modifier les tags des membres du clan",
"ClanPlayerNotInSameClan": "Ce joueur n'est pas dans votre clan",
"ClanCantChangeRankLevel": "Vous ne pouvez pas modifier le niveau du rang du clan",
"ClanCantChangeRankTag": "Vous ne pouvez pas modifier les tags du rang du clan",
"NameNotRegistered": "Votre nom n'est pas enregistré ! Utilise {1} pour créer un compte.",
"AutomaticLoginIPToggle": "La connexion automatique par IP est maintenant {1}",
"CouldNotRegisterAccount": "Un problème est survenue lors de la création de votre compte. Merci de bien vouloir contacter le staff.",
"RandomTipsToggle": "Les conseils aléatoires sont maintenant {1}",
"ActionTipsToggle": "Les conseils d'action sont maintenant {1}",
"AutoSpawnLastCharToggle": "Réapparition automatique du dernier personnage utilisé est {1}",
"AccountGUISettingToggle": "🖥️ la GUI est {1}",
"On": "On",
"Off": "Off",
"Yes": "Oui",
"No": "Non",
"True": "Vrai",
"False": "Faux",
"Locked": "Verrouillé",
"Unlocked": "Déverrouillé",
"PasswordNotGoodEnough": "Le nouveau mot de passe doit répondre aux exigences !",
"PasswordNeedsBase": "Le mot de passe doit au moins avoir : {1}",
"PasswordNeedsCapitals": "{1} Une majuscule",
"PasswordNeedsNumbers": "{1} Un nombre",
"PasswordNeedsSymbols": "{1} Un caractère spécial",
"PasswordsDontMatch": "Le mot de passe et la confirmation ne sont pas identiques !",
"PasswordChanged": "Your password has been changed!",
"AutoLoggedInIP": "You have been automatically logged in by IP!",
"WelcomeBack": "Welcome back to {1}, {2}! Please {3} to continue.",
"WelcomeNewPlayer": "Welcome to {1}, {2}! Please {3} to play.",
"InvalidPlayer": "Player not found!",
"InvalidBusiness": "Business not found!",
"InvalidHouse": "House not found!",
"InvalidVehicle": "Vehicle not found!",
"InvalidClan": "Clan not found!",
"InvalidClanRank": "Clan rank not found!",
"InvalidJob": "Job not found!",
"InvalidItem": "Item not found!",
"InvalidItemType": "Item type not found!",
"InvalidRadioStation": "Radio station not found!",
"InvalidGate": "Gate not found!",
"EntersProperty": "opens the door and enters the {1}",
"ExitsProperty": "opens the door and exits the {1}",
"EnterExitPropertyDoorLocked": "tries to open the {1} door but fails because it's locked",
"PropertyNoInterior": "This {1} does not have an interior, but you can still use commands at the door icon.",
"NoBusinessWithItemType": "There is no business with that item available",
"HeaderKeyBinds": "Key Binds",
"HeaderAccountHelp": "Account Help",
"HeaderVehicleHelp": "Vehicle Help",
"HeaderVehicleDealershipHelp": "Vehicle Dealership Help",
"HeaderJobHelp": "Job Help",
"HeaderChatHelp": "Chat Help",
"HeaderServerRules": "Server Rules",
"HeaderWebsiteInfo": "Website",
"HeaderDiscordInfo": "Discord",
"HeaderAnimationsList": "Animation List",
"HeaderPayAndSprayHelp": "Pay and Spray Help",
"HeaderAmmunationHelp": "Ammunation Help",
"HeaderVehicleTuneupHelp": "Vehicle Tune Help",
"HeaderBindableKeysHelp": "Bindable Keys",
"HeaderSkinHelp": "Clothes/Skin Help",
"HeaderBusinessHelp": "Business Help",
"HeaderClanHelp": "Clan Help",
"HeaderPlayerVehiclesList": "Player Vehicles ({1})",
"HeaderPlayerBusinessesList": "Player Businesses ({1})",
"HeaderClansList": "Clan List",
"HeaderAdminsList": "Admin List",
"HeaderBadgeInfo": "Badge Information",
"HeaderAccentsList": "Accent List",
"HeaderPlayerInfo": "Player Information ({1})",
"HeaderWealthandTaxHelp": "Wealth and Tax Information",
"HeaderCommandInfo": "Command Information ({1})",
"HeaderRadioHelp": "Radio Help",
"HeaderRadioStationsList": "Radio Stations",
"HeaderKeyBindsList": "Key Binds List",
"RadioVolumeChanged": "{1} You changed your streaming radio volume to {2}%",
"VolumeLevelNotNumber": "The volume level must be a number",
"RadioStationLocationInvalid": "You must be in a vehicle, house, or business or have a personal device to change the station!",
"ActionBusinessRadioStationChange": "changes the business radio station to {1} ({2})",
"ActionHouseRadioStationChange": "changes the house radio station to {1} ({2})",
"ActionVehicleRadioStationChange": "changes the vehicle radio station to {1} ({2})",
"ActionItemRadioStationChange": "changes the {1}'s station to {2} ({3})",
"RandomVehicleCommandsDisabled": "This is a random traffic vehicle and commands can't be used for it.",
"HouseDoorLock": "House {1} {2}!",
"BusinessDoorLock": "Business {1} {2}!",
"ServerGameModeRestarting": "The server game mode is restarting!",
"HeaderSelfItemList": "Your Inventory",
"HeaderPlayerItemList": "Player Inventory ({1})",
"HeaderHouseItemList": "House Inventory",
"HeaderBusinessFloorItemList": "Business Inventory (For Sale)",
"HeaderBusinessStorageItemList": "Business Inventory (Storage)",
"HeaderItemItemList": "{1}'s Inventory",
"ItemSlotNotNumber": "The item slot must be a number",
"ItemSlotMustBeBetween": "The item slot must be between {1} and {2}!",
"UseItemBugged": "The item you're trying to use is bugged. A bug report has been sent to the server developers.",
"PickupItemBugged": "The item you're trying to pickup is bugged. A bug report has been sent to the server developers.",
"DropItemBugged": "The item you're trying to drop is bugged. A bug report has been sent to the server developers.",
"HandsBusy": "Your hands are busy",
"CantUseItemInSkinChange": "You can't use an item while customizing your appearance",
"CantDropItemInSkinChange": "You can't drop an item while customizing your appearance",
"CantPickupItemInSkinChange": "You can't pickup an item while customizing your appearance",
"CantSwitchItemInSkinChange": "You can't switch an item while customizing your appearance",
"CantGiveItemInSkinChange": "You can't give an item while customizing your appearance",
"CantTakeItemInSkinChange": "You can't take an item while customizing your appearance",
"ItemUnequippableNoAmmo": "The {1} in slot {2} has no ammo, and can't be equipped!",
"NoSpaceSelfInventory": "You don't have any more space in your inventory",
"Business": "business",
"House": "house",
"Clan": "clan",
"Vehicle": "vehicle",
"Item": "item",
"ItemType": "item type",
"Gate": "gate",
"Door": "door",
"ClanRank": "clan rank",
"JobRank": "job rank",
"RadioStation": "radio station",
"Months": [
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
],
"WeekDays": [
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
],
"CardinalDirections": [
"North",
"Northeast",
"East",
"Southeast",
"South",
"Southwest",
"West",
"Northwest"
],
"NewPlayerReadyToPlay": [
"You have been given some cash. Use {1} to find places to buy items.",
"If you need money, jobs are the yellow dots on the radar.",
"For a car, visit the car dealership. You can also use a rental vehicle near spawn or take the train",
"Be sure to read the {1} and use {2} for info."
],
"YourCurrentVehicleDeleted": "The vehicle you were in was deleted.",
"Distance": "Distance",
"Meters": "Meters",
"Feet": "Feet",
"Kilometers": "Kilometers",
"Miles": "Miles",
"MustBeVehicleDriver": "You must be the driver of the vehicle!",
"PlayerJoined": "{1} has joined the game from {2}!",
"PlayerLeftServer": "{1} has left the game! ({2})",
"TakeItemFromHouse": "takes a {1} from the house",
"TakeItemFromBusinessStorage": "takes a {1} from the business storage",
"TakeItemFromBusiness": "takes a {1} from the business",
"TakeItemFromItem": "takes a {1} from the {2}",
"TakeItemFromVehicleTrunk": "takes a {1} from the trunk",
"TakeItemFromVehicleDash": "takes a {1} from the glove compartment",
"JobEquipmentInventoryKeyBindTip": "The job equipment is in your inventory. Press {1} to see them.",
"JobEquipmentInventoryCommandTip": "The job equipment is in your inventory. Use {1} to see them.",
"AccountHelp": [
"Do NOT share your password with anybody else. {1} staff will never ask you for your password",
"Use {1} to change your password, and {2} if you forgot it",
"Some settings you can use: {1}"
],
"VehicleHelp": [
"Your personal vehicles will save wherever you or somebody else leaves them!",
"Visit dealerships to buy new vehicles (Use {1} for more information)",
"Some commands: {1}",
"Visit a mechanic garage to repair, colour, and tune up your car! {1} for info"
],
"VehicleDealershipHelp": [
"Visit a vehicle dealer to buy new vehicles. Use {1} to find one.",
"At the dealer, enter a car you want to buy, and the price will be shown to you",
"If you want to buy the vehicle, use {1} and you will be given keys to test drive it around the parking lot.",
"Drive away from the dealership with the new vehicle to confirm the purchase."
],
"JobHelp": [
"Visit job locations to get a job and earn money. Look for yellow spots on the map",
"At a job location, use {1} to get the job. Use {2} to quit your job",
"Use {1} to begin working. You can also get a job {2} and {3}",
"Most job vehicles are locked. Use {1} near one to enter it.",
"When entering a job vehicle, information on how to do the job will be shown to you."
],
"ChatHelp": [
"There are two main types of chat: out-of-character (OOC) and in-character (IC)",
"Mixing these two types is not proper roleplay. See {1} for info.",
"Some chat commands: {1}",
"Some have shorter names available ({1} to talk, {2} to shout, etc)"
],
"ServerRulesHelp": [
"Unrealistic actions (powergaming) are not allowed. You aren't superman.",
"No terrorist or terrorism roleplay is allowed.",
"Always follow instructions given by moderators and admins.",
"Do not mix the chats (metagaming). You can't use info in IC that was received OOC",
"Keep English in main chats. If you aren't good at English, use {1}"
],
"AnimationHelp": [
"Animations allow you to enhance roleplay with visual actions",
"Use {1} or {2} with a name to use an animation.",
"To see a list of animations, use {1}"
],
"WeaponHelp": [
"Visit an gun store to buy weapons. Use {1} to find one.",
"Buying a weapon requires a weapon license.",
"Weapon licenses are managed by the police department. Apply there to get one.",
"Weapons can also be purchased illegally from some businesses, weapon dealers, and clans."
],
"SkinHelp": [
"At a clothing store, use {1} to purchase clothes",
"When you have a clothing item, equip and use it like any other item to show the skin selection (check {1} to learn how to use items)",
"Some skins are restricted to jobs, clans, or for other reasons."
],
"KeyBindHelp": [
"You can set your own key binds. Use {1} to see your binded keys.",
"Use {1} to add a new keybind and {2} to remove one.",
"Default keys are: {1} for vehicle engine, {2} for lights, and {3} for lock/unlock",
"Press {1} to see your items and {2} to equip an item or {3} to unequip all.",
"Press {1} to use the item you're holding, press {2} to drop it, or press {3} to pickup an item from the ground."
],
"BusinessHelp": [
"Use {1} to purchase items or {2} to see a list of what's for sale at any business",
"Businesses are shown with blue names above the icon at their entrance.",
"Business owner commands: {1}",
"A new car for sale will appear when you drive away from the dealer."
],
"ClanHelp": [
"Ask an administrator to create a clan (Similar to factions/groups/families)",
"Clan owners have full control over their clan once it's created",
"Clan commands: {1}",
"More clan commands: {1}"
],
"RadioStationHelp": [
"Use {1} to set the station for your vehicle, house, or business",
"Use {2} to see a list of stations",
"You can change your radio streaming volume using {1} with 0-100 as the percent"
],
"WealthAndTaxHelp": [
"Your taxes on payday are {1} percent of your calculated wealth.",
"Your calculated wealth is a total sum based on how many vehicles, houses, and businesses you have.",
"Each vehicle is {1}, each house is {2}, and each business is {3}",
"Use {1} to see your current wealth, and {2} to see how much you'll pay in tax each payday"
],
"MustBeInAVehicle": "You need to be in a vehicle!",
"MustBeInOrNearVehicle": "You need to be in or near a vehicle!",
"MustBeInVehicleFrontSeat": "You need to be in the vehicle front seats!",
"MustBeInVehicleDriverSeat": "You need to be the driver!",
"DontHaveVehicleKey": "You don't have a key for this vehicle!",
"NoGateAccess": "You don't have access to this gate!",
"GateBroken": "This gate is broken!",
"GateHacked": "The gate does not respond!",
"RadioJammed": "You hear only static from the radio.",
"VehicleNotForSale": "This vehicle is not for sale!",
"VehicleNotForRent": "This vehicle is not for rent!",
"BusinessNotForSale": "This business is not for sale!",
"BusinessNotForRent": "This business is not for rent!",
"HouseNotForSale": "This house is not for sale!",
"HouseNotForRent": "This house is not for rent!",
"DealershipPurchaseTestDrive": "Drive the vehicle away from the dealership to buy it, or get out to cancel.",
"DealershipPurchaseExitedVehicle": "You canceled the vehicle purchase by exiting the vehicle!",
"VehiclePurchaseComplete": "This vehicle is now yours! It will save wherever you leave it.",
"VehiclePurchaseNotEnoughMoney": "You don't have enough money to buy this vehicle!",
"HousePurchaseNotEnoughMoney": "You don't have enough money to buy this house!",
"BusinessPurchaseNotEnoughMoney": "You don't have enough money to buy this business!",
"ADDED-21JAN2022": "DO NOT TRANSLATE. This string is just a comment to separate newly added translations.",
"HeaderPlayerHousesList": "Player Houses ({1})",
"HeaderPlayerStaffFlagsList": "Player Staff Flags ({1})",
"HeaderStaffFlagsList": "Staff Flags",
"NonRPName": "Non-RP name! Choose a new one:",
"InvalidStaffFlag": "Staff flag not found!",
"InvalidClanFlag": "Clan flag not found!",
"InvalidLocale": "Language not found!",
"HeaderJobUniformList": "Job Uniforms ({1})",
"HeaderJobEquipmentList": "Job Equipment ({1})",
"InvalidJobUniform": "Job uniform not found!",
"InvalidJobEquipment": "Job equipment not found!",
"HeaderVehiclesInRangeList": "Vehicles within {1}",
"NoVehiclesWithInRange": "There are no vehicles within {1}",
"AmountNotNumber": "The amount must be a number!",
"NeedToBeWorking": "You need to be working! Use {1} at a job location or near a job vehicle.",
"NeedToBeOnJobRoute": "You need to be doing a job route! Use {1} in a job vehicle",
"CurrentJobRouteDeleted": "The job route you were on has been deleted by an admin",
"CurrentJobRouteVehicleColoursChanged": "Your job route's vehicle colours were changed by an admin",
"NotYourJob": "This is not your job!",
"JobPoints": "You can get a job by going the yellow points on the map.",
"QuitJobToTakeAnother": "If you want this job, use {1} to quit your current job.",
"NotAJobVehicle": "This is not a job vehicle!",
"NotYourJobVehicle": "This is not your job's vehicle!",
"JobRouteDisabled": "The job route you were on has been disabled by an admin",
"HeaderPickupTypes": "Pickup Types",
"HeaderBlipTypes": "Map Icon Types",
"InvalidGPSLocation": "There are no locations with that name or type",
"HeaderBusinessList": "Businesses",
"VehicleForSale": "This {1} is buyable for {2}! Use {3} if you want to buy it",
"VehicleForRent": "This {1} is rentable for {2}! Use {3} if you want to rent it",
"ADDED-31JAN2022": "DO NOT TRANSLATE. This string is just a comment to separate newly added translations.",
"LoginFailedInvalidPassword": "Invalid password! {1} attempts remaining",
"LoginFailedNoPassword": "You must enter a password! ! {1} attempts remaining",
"RegistrationFailedNoPassword": "You must enter a password!",
"RegistrationFailedNoPasswordConfirm": "You must confirm the password!",
"RegistrationFailedNoEmail": "You must enter an email!",
"AccountNameAlreadyRegistered": "Your name is already registered!",
"AlreadyLoggedIn": "You are already logged in!",
"RegistrationFailedInvalidEmail": "That email is invalid!",
"RegistrationFailedPasswordMismatch": "The passwords don't match!",
"RegistrationFailedCreateError": "Your account couldn't be created!",
"RegistrationSuccess": "Your account has been created!",
"RegistrationEmailVerifyReminder": "Don't forget to verify your email! A verification code has been sent to you.",
"RegistrationCreateCharReminder": "To play on the server, you will need to make a character.",
"NoCharactersGUIMessage": "You have no characters. Would you like to make one?",
"NoCharactersGUIWindowTitle": "No characters",
"NoCharactersChatMessage": "You have no characters. Use {1} to make one.",
"NeedEmailFor2FA": "You need to add your email to your account to use two-factor authentication.",
"NeedEmailVerifiedFor2FA": "You need to verify your email to use two-factor authentication.",
"SetEmailHelpTip": "Use {1} to set your email.",
"VerifyEmailHelpTip": "Use {1} to verify your email.",
"ADDED-13FEB2022": "DO NOT TRANSLATE. This string is just a comment to separate newly added translations.",
"NearbyRadio": "Nearby radio",
"FromRadio": "From radio",
"ToRadio": "To radio",
"NeedToEnterPropertyCommand": "You need to enter the {1} first! Use {2} to enter and exit",
"NeedToEnterPropertyKeyPress": "You need to enter the {1} first! Press {2} to enter and exit",
"InventoryFullCantCarry": "You don't have any space to carry this (full inventory)!",
"NotEnoughCashNeedAmountMore": "You don't have enough money! You need {1} more!",
"AmountMustBeMoreThan": "The amount must be more than {1}!",
"WeaponBanned": "You are not allowed to buy or use weapons!",
"TimeNotNumber": "The time must be a number",
"HeaderDefaultBusinessItemTypes": "Business Item Templates",
"FixingStuck": "Fixing your position and virtual world ...",
"CantUseCommandYet": "You must wait before you can use this command again!",
"NotATester": "You are not a tester!",
"AccessDenied": "AccessDenied",
"InvalidSkin": "That skin is invalid!",
"HeaderInteriorTypes": "Interiors List",
"ViewInventoryKeyPressTip": "Press {1} to see your items",
"ViewInventoryCommandTip": "Use {1} to see your items",
"GUIAccountSettingToggle": "You have turned {1} GUI",
"ADDED-23MAR2022": "DO NOT TRANSLATE. This string is just a comment to separate newly added translations",
"CarCommandHelp": "You can buy a car by visiting a vehicle dealership. Use {1} for more information.",
"SkinCommandHelp": "You can change your skin by visiting a clothes store. Use {1} for more info.",
"BusinessVehiclesRespawned": "🚗 All business vehicles have been respawned by an admin!",
"JobVehiclesRespawned": "🚗 All job vehicles have been respawned by an admin!",
"PlayerVehiclesRespawned": "🚗 All player vehicles have been respawned by an admin!",
"ClanVehiclesRespawned": "🚗 All clan vehicles have been respawned by an admin!",
"PublicVehiclesRespawned": "🚗 All public have been respawned by an admin!",
"EmptyVehiclesRespawned": "🚗 All empty vehicles have been respawned by an admin!",
"AllVehiclesRespawned": "🚗 All vehicles have been respawned by an admin!",
"AllVehiclesReloaded": "🚗 All vehicles have been reloaded by an admin!",
"YourVehicleRespawned": "🚗 Your vehicle has been respawned!",
"PlayerIPBanned": "💀 {1} has been IP banned!",
"PlayerCharacterBanned": "💀 {1} has been character banned!",
"PlayerSubNetBanned": "💀 {1} has been subnet banned!",
"CantModifyBusiness": "You can't manage or modify this business!",
"CantModifyHouse": "You can't manage or modify this house!",
"ServerTimeSet": "⏰ {1} set the time to {2}",
"ServerWeatherSet": "☁️ {1} set the weather to {2}",
"ServerSnowSet": "❄️ {1} turned falling snow {2} and ground snow {3}",
"AllJobsReloaded": "💼 All server jobs have been reloaded by an admin",
"ServerLogoSet": "{1} turned the server logo image {2}",
"ServerGUISet": "🖥️ {1} turned GUI for this server {2}",
"ServerBusinessBlipsSet": "🏢 {1} turned all business blips {2}",
"ServerHouseBlipsSet": "🏘️ {1} turned all house blips {2}",
"ServerJobBlipsSet": "💼 {1} turned all job blips {2}",
"ServerBusinessPickupsSet": "🏢 {1} turned all business pickups {2}",
"ServerHousePickupsSet": "🏘️ {1} turned all house pickups {2}",
"ServerJobPickupsSet": "💼 {1} turned on all job pickups {2}",
"BusinessBuyItemsLabel": "Use {1} to purchase items",
"PropertyEnterCommandLabel": "Use {1} to enter",
"PropertyEnterKeyPressLabel": "Press {1} to enter",
"PropertyForSaleLabel": "For sale: ${1}",
"PropertyForRentLabel": "For rent: ${1} every payday",
"RemainingTaxPaidInMoney": "You covered the remaining taxes with ${1} in cash.",
"LostMoneyFromTaxes": "You lost money since your taxes are more than your paycheck!",
"NextPaycheckRepossessionWarning": "If you don't have enough cash to cover taxes on next paycheck, you will lose stuff!",
"NotEnoughMoneyForTax": "You don't have enough money to cover your taxes!",
"AssetsRepossessedForTax": "You lost {1} vehicles, {2} houses, and {3} businesses because you couldn't pay taxes!",
"Closed": "Closed",
"Open": "Open",
"VehicleDealershipLabel": "Enter a vehicle as driver to buy it",
"TakeJobLabel": "Use {1} to work here",
"StartWorkLabel": "Use {1} to start working",
"JobEquipAndUniformLabel": "Use {1} and {2} for job stuff, or {3} to stop working",
"NotYourJobLabel": "You already have a different job. Use {1} if you want this one",
"JobLabel": "{1} Job",
"PaydayBonusSet": "🤑 {1} set the payday bonus to ${2}",
"AllHousesReloaded": "🏘️ All houses have been reloaded by an admin",
"AllRadioStationsReloaded": "📻 All radio stations have been reloaded by an admin!",
"PlayerKicked": "🦶 {1} has been kicked from the server",
"AllBusinessesReloaded": "🏢 All businesses have been reloaded by an admin!",
"UnableToDoThat": "You aren't able to do that",
"SetVehicleClanConfirmMessage": "Are you sure you want to give this vehicle to your clan?",
"SetVehicleClanConfirmTitle": "Warning!",
"SetItemPriceBelowOrderPriceMessage": "Are you sure you want to set the item price below it's order price? You will lose ${1} every purchase!",
"SetItemPriceBelowOrderPriceTitle": "Warning!",
"MustOwnVehicle": "You don't own this vehicle!",
"RandomTips": [
"Look for yellow dots on your map for job locations",
"You can set custom key binds. Use {1} for details",
"Use {1} if you don't want to see tips and extra information",
"You can edit your keybinds using {1} and {2}",
"Press to see your inventory, and use number keys to select an item",
"Use {1} at a business to purchase items",
"Found a bug? Report it with {1}",
"Have an idea or suggestion for the server? Let the devs know using {1}",
"Want to buy a business? Use {1} at one for sale",
"Want to buy a house? Use {1} at one for sale",
"Want to buy a vehicle? Visit a dealership and enter one for info on how to buy it!",
"Switch to any of your characters with {1}",
"Use {1} to automatically login when connecting with the same IP",
"Use {1} to turn on/off the lights in your house or business",
"Use {1} to play an internet radio station in your car, house, or business",
"Want to make a clan? Use {1} for details",
"Legal weapons can be purchased at any ammunation"
],
"PromptResponseTip": "Use {1} to accept or {2} to decline",
"PlayerConnecting": "👋 {1} is connecting to the server ...",
"GetStartedJobVehicle": "Get in a {1} to get started.",
"VehicleTypes": {
"Car": "Car",
"Truck": "Truck",
"Van": "Van",
"Taxi": "Taxi",
"Bus": "Bus",
"PoliceCar": "Police Car",
"Ambulance": "Ambulance",
"FireTruck": "Fire Truck",
"Bike": "Bike",
"Motorbike": "Motorbike",
"Boat": "Boat",
"Helicopter": "Helicopter",
"Plane": "Plane",
"Train": "Train"
},
"AlreadyOnJobRoute": "You are already doing a job route!",
"GaveVehicleToClan": "You gave this {1} to your clan!",
"JobDisabled": "This job is disabled!",
"SetHouseClanConfirmMessage": "Are you sure you want to give this house to your clan?",
"SetHouseClanConfirmTitle": "Warning!",
"SetBusinessClanConfirmMessage": "Are you sure you want to give this business to your clan?",
"SetBusinessClanConfirmTitle": "Warning!",
"MustOwnHouse": "You don't own this house!",
"MustOwnBusiness": "You don't own this business!",
"GaveHouseToClan": "You gave this house to your clan!",
"GaveBusinessToClan": "You gave this business to your clan!",
"BuyBusinessConfirmMessage": "Are you sure you want to buy this business?",
"BuyBusinessConfirmTitle": "Attention!",
"BuyHouseConfirmMessage": "Are you sure you want to buy this house?",
"BuyHouseConfirmTitle": "Attention!",
"BuyBusinessLabel": "Use {1} to buy this business",
"BuyHouseLabel": "Use {1} to buy this house",
"RentHouseLabel": "Use {1} to rent this house",
"DisconnectReasons": [
"Lost Connection",
"Disconnected",
"Unsupported Client",
"Wrong Game",
"Incorrect Password",
"Unsupported Executable",
"Disconnected",
"Banned",
"Failed",
"Invalid Name",
"Crashed",
"Modified Game"
],
"AccountEmailAlreadyVerified": "You already set and verified your email!",
"EmailVerificationCodeSent": "A verification code and instructions have been sent to your email.",
"GUIPlayAsCharacterButton": "Play",
"GUINewCharacterButton": "New character",
"GUIPreviousCharacterButton": "Previous",
"GUINextCharacterButton": "Next",
"GUICharacterSelectWindowTitle": "Select a character",
"GUICharacterSelectMoneyLabel": "Money: ${1}",
"GUICharacterSelectClanLabel": "Clan: {1}",
"GUICharacterSelectLastPlayedLabel": "Last Played: {1} days, {2} hours, {3} minutes ago",
"GUILoginWindowLabelEnterPassword": "Please enter your password",
"GUILoginWindowSubmitButton": "Login",
"GUILoginWindowResetPasswordButton": "Reset password",
"GUILoginWindowPasswordPlaceholder": "Password",
"GUILoginWindowForgotPasswordLabel": "Forgot your password?",
"GUIRegisterWindowLabelCreateAccount": "Create an account",
"GUIRegisterWindowPasswordPlaceholder": "Password",
"GUIRegisterWindowConfirmPasswordPlaceholder": "Confirm password",
"GUIRegisterWindowEmailPlaceholder": "Email",
"GUIRegisterWindowSubmitButton": "Create account",
"GUINewCharacterMessageLabel": "Name your character",
"GUINewCharacterFirstNamePlaceholder": "First Name",
"GUINewCharacterLastNamePlaceholder": "Last Name",
"GUINewCharacterSubmitButton": "Create Character",
"GUIChangePasswordWindowTitle": "Change Password",
"GUIChangePasswordPasswordLabel": "Enter a new password",
"GUIChangePasswordPasswordPlaceholder": "Password",
"GUIChangePasswordConfirmPasswordPlaceholder": "Confirm password",
"GUIChangePasswordSubmitButton": "Change Password",
"GUIResetPasswordWindowMessage": "Reset Password",
"GUIResetPasswordConfirmEmailLabel": "Please confirm your email",
"GUIResetPasswordEmailPlaceholder": "Email",
"GUIResetPasswordSubmitButton": "Reset Password",
"GUIResetPasswordLoginButton": "Login",
"GUIResetPasswordRememberMessage": "Remember your password?",
"HeaderJobList": "Jobs",
"HeaderBusinessInfo": "Business Info",
"HeaderHouseInfo": "House Info",
"HeaderClanInfo": "Clan Info",
"Locales": {
"English": "English",
"Russian": "Russian",
"Spanish": "Spanish",
"German": "German",
"Dutch": "Dutch",
"Polish": "Polish",
"Chinese": "Chinese",
"French": "French",
"Japanese": "Japanese",
"Slovak": "Slovak",
"Arabic": "Arabic"
}
}

558
locale/german.json Normal file
View File

@@ -0,0 +1,558 @@
{
"TranslationProvidedBy": "Sladernimo",
"LocaleEnglishName": "German",
"LocaleNativeName": "German",
"LocaleOffer": "This server is available in German. Use {1} to use it.",
"LocaleChanged1": "Your language is now set to {1}",
"LocaleChanged2": "The server will now display messages in {1}",
"LocaleChangedNote": "This does not change messages from other players",
"AccentsListHeader": "Accents",
"HelpMainListHeader": "Help Categories",
"AccentNotFound": "Accent not found",
"AccentSet": "You set your accent to {1}",
"InvalidAnimation": "That animation doesn't exist",
"AnimationCommandTip": "Use {1} to see a list of valid animations",
"InvalidAnimationDistance": "The distance must be between 0 and 3",
"AnimationStopCommandTip": "Use {1} to stop your animation",
"CantBanClient": "You cannot ban this person",
"PlayerAccountBanned": "{1} has been account banned",
"ClanNotFound": "Clan not found",
"ClanNameTaken": "A clan with that name already exists",
"PlayerNotFound": "Player not found",
"ClanCantRemoveRanks": "You can't remove clan ranks",
"ClanCantAddRanks": "You can't add clan ranks",
"ClanRankNotFound": "Clan rank not found",
"ClanCantChangeMemberTag": "You can not change clan member's tags",
"ClanPlayerNotInSameClan": "That player is not in your clan",
"ClanCantChangeRankLevel": "You can not change clan rank's level",
"ClanCantChangeRankTag": "You can not change clan rank's tags",
"NameNotRegistered": "Your name is not registered! Use {1} to make an account.",
"AutomaticLoginIPToggle": "Automatic login by IP is now {1}",
"CouldNotRegisterAccount": "There was a problem creating your account. Please contact an admin.",
"RandomTipsToggle": "Random tips are now {1}",
"ActionTipsToggle": "Action tips are now {1}",
"AutoSpawnLastCharToggle": "Automatic spawn as last used character is {1}",
"AccountGUISettingToggle": "🖥️ GUI is now {1}",
"On": "On",
"Off": "Off",
"Yes": "Yes",
"No": "No",
"True": "True",
"False": "False",
"Locked": "Locked",
"Unlocked": "Unlocked",
"PasswordNotGoodEnough": "The new password must meet the requirements!",
"PasswordNeedsBase": "Passwords must have at least {1}",
"PasswordNeedsCapitals": "{1} capital letters",
"PasswordNeedsNumbers": "{1} numbers",
"PasswordNeedsSymbols": "{1} symbols",
"PasswordsDontMatch": "The new password and confirm new password aren't the same!",
"PasswordChanged": "Your password has been changed!",
"AutoLoggedInIP": "You have been automatically logged in by IP!",
"WelcomeBack": "Welcome back to {1}, {2}! Please {3} to continue.",
"WelcomeNewPlayer": "Welcome to {1}, {2}! Please {3} to play.",
"InvalidPlayer": "Player not found!",
"InvalidBusiness": "Business not found!",
"InvalidHouse": "House not found!",
"InvalidVehicle": "Vehicle not found!",
"InvalidClan": "Clan not found!",
"InvalidClanRank": "Clan rank not found!",
"InvalidJob": "Job not found!",
"InvalidItem": "Item not found!",
"InvalidItemType": "Item type not found!",
"InvalidRadioStation": "Radio station not found!",
"InvalidGate": "Gate not found!",
"EntersProperty": "opens the door and enters the {1}",
"ExitsProperty": "opens the door and exits the {1}",
"EnterExitPropertyDoorLocked": "tries to open the {1} door but fails because it's locked",
"PropertyNoInterior": "This {1} does not have an interior, but you can still use commands at the door icon.",
"NoBusinessWithItemType": "There is no business with that item available",
"HeaderKeyBinds": "Key Binds",
"HeaderAccountHelp": "Account Help",
"HeaderVehicleHelp": "Vehicle Help",
"HeaderVehicleDealershipHelp": "Vehicle Dealership Help",
"HeaderJobHelp": "Job Help",
"HeaderChatHelp": "Chat Help",
"HeaderServerRules": "Server Rules",
"HeaderWebsiteInfo": "Website",
"HeaderDiscordInfo": "Discord",
"HeaderAnimationsList": "Animation List",
"HeaderPayAndSprayHelp": "Pay and Spray Help",
"HeaderAmmunationHelp": "Ammunation Help",
"HeaderVehicleTuneupHelp": "Vehicle Tune Help",
"HeaderBindableKeysHelp": "Bindable Keys",
"HeaderSkinHelp": "Clothes/Skin Help",
"HeaderBusinessHelp": "Business Help",
"HeaderClanHelp": "Clan Help",
"HeaderPlayerVehiclesList": "Player Vehicles ({1})",
"HeaderPlayerBusinessesList": "Player Businesses ({1})",
"HeaderClansList": "Clan List",
"HeaderAdminsList": "Admin List",
"HeaderBadgeInfo": "Badge Information",
"HeaderAccentsList": "Accent List",
"HeaderPlayerInfo": "Player Information ({1})",
"HeaderWealthandTaxHelp": "Wealth and Tax Information",
"HeaderCommandInfo": "Command Information ({1})",
"HeaderRadioHelp": "Radio Help",
"HeaderRadioStationsList": "Radio Stations",
"HeaderKeyBindsList": "Key Binds List",
"RadioVolumeChanged": "{1} You changed your streaming radio volume to {2}%",
"VolumeLevelNotNumber": "The volume level must be a number",
"RadioStationLocationInvalid": "You must be in a vehicle, house, or business or have a personal device to change the station!",
"ActionBusinessRadioStationChange": "changes the business radio station to {1} ({2})",
"ActionHouseRadioStationChange": "changes the house radio station to {1} ({2})",
"ActionVehicleRadioStationChange": "changes the vehicle radio station to {1} ({2})",
"ActionItemRadioStationChange": "changes the {1}'s station to {2} ({3})",
"RandomVehicleCommandsDisabled": "This is a random traffic vehicle and commands can't be used for it.",
"HouseDoorLock": "House {1} {2}!",
"BusinessDoorLock": "Business {1} {2}!",
"ServerGameModeRestarting": "The server game mode is restarting!",
"HeaderSelfItemList": "Your Inventory",
"HeaderPlayerItemList": "Player Inventory ({1})",
"HeaderHouseItemList": "House Inventory",
"HeaderBusinessFloorItemList": "Business Inventory (For Sale)",
"HeaderBusinessStorageItemList": "Business Inventory (Storage)",
"HeaderItemItemList": "{1}'s Inventory",
"ItemSlotNotNumber": "The item slot must be a number",
"ItemSlotMustBeBetween": "The item slot must be between {1} and {2}!",
"UseItemBugged": "The item you're trying to use is bugged. A bug report has been sent to the server developers.",
"PickupItemBugged": "The item you're trying to pickup is bugged. A bug report has been sent to the server developers.",
"DropItemBugged": "The item you're trying to drop is bugged. A bug report has been sent to the server developers.",
"HandsBusy": "Your hands are busy",
"CantUseItemInSkinChange": "You can't use an item while customizing your appearance",
"CantDropItemInSkinChange": "You can't drop an item while customizing your appearance",
"CantPickupItemInSkinChange": "You can't pickup an item while customizing your appearance",
"CantSwitchItemInSkinChange": "You can't switch an item while customizing your appearance",
"CantGiveItemInSkinChange": "You can't give an item while customizing your appearance",
"CantTakeItemInSkinChange": "You can't take an item while customizing your appearance",
"ItemUnequippableNoAmmo": "The {1} in slot {2} has no ammo, and can't be equipped!",
"NoSpaceSelfInventory": "You don't have any more space in your inventory",
"Business": "business",
"House": "house",
"Clan": "clan",
"Vehicle": "vehicle",
"Item": "item",
"ItemType": "item type",
"Gate": "gate",
"Door": "door",
"ClanRank": "clan rank",
"JobRank": "job rank",
"RadioStation": "radio station",
"Months": [
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
],
"WeekDays": [
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
],
"CardinalDirections": [
"North",
"Northeast",
"East",
"Southeast",
"South",
"Southwest",
"West",
"Northwest"
],
"NewPlayerReadyToPlay": [
"You have been given some cash. Use {1} to find places to buy items.",
"If you need money, jobs are the yellow dots on the radar.",
"For a car, visit the car dealership. You can also use a rental vehicle near spawn or take the train",
"Be sure to read the {1} and use {2} for info."
],
"YourCurrentVehicleDeleted": "The vehicle you were in was deleted.",
"Distance": "Distance",
"Meters": "Meters",
"Feet": "Feet",
"Kilometers": "Kilometers",
"Miles": "Miles",
"MustBeVehicleDriver": "You must be the driver of the vehicle!",
"PlayerJoined": "{1} has joined the game from {2}!",
"PlayerLeftServer": "{1} has left the game! ({2})",
"TakeItemFromHouse": "takes a {1} from the house",
"TakeItemFromBusinessStorage": "takes a {1} from the business storage",
"TakeItemFromBusiness": "takes a {1} from the business",
"TakeItemFromItem": "takes a {1} from the {2}",
"TakeItemFromVehicleTrunk": "takes a {1} from the trunk",
"TakeItemFromVehicleDash": "takes a {1} from the glove compartment",
"JobEquipmentInventoryKeyBindTip": "The job equipment is in your inventory. Press {1} to see them.",
"JobEquipmentInventoryCommandTip": "The job equipment is in your inventory. Use {1} to see them.",
"AccountHelp": [
"Do NOT share your password with anybody else. {1} staff will never ask you for your password",
"Use {1} to change your password, and {2} if you forgot it",
"Some settings you can use: {1}"
],
"VehicleHelp": [
"Your personal vehicles will save wherever you or somebody else leaves them!",
"Visit dealerships to buy new vehicles (Use {1} for more information)",
"Some commands: {1}",
"Visit a mechanic garage to repair, colour, and tune up your car! {1} for info"
],
"VehicleDealershipHelp": [
"Visit a vehicle dealer to buy new vehicles. Use {1} to find one.",
"At the dealer, enter a car you want to buy, and the price will be shown to you",
"If you want to buy the vehicle, use {1} and you will be given keys to test drive it around the parking lot.",
"Drive away from the dealership with the new vehicle to confirm the purchase."
],
"JobHelp": [
"Visit job locations to get a job and earn money. Look for yellow spots on the map",
"At a job location, use {1} to get the job. Use {2} to quit your job",
"Use {1} to begin working. You can also get a job {2} and {3}",
"Most job vehicles are locked. Use {1} near one to enter it.",
"When entering a job vehicle, information on how to do the job will be shown to you."
],
"ChatHelp": [
"There are two main types of chat: out-of-character (OOC) and in-character (IC)",
"Mixing these two types is not proper roleplay. See {1} for info.",
"Some chat commands: {1}",
"Some have shorter names available ({1} to talk, {2} to shout, etc)"
],
"ServerRulesHelp": [
"Unrealistic actions (powergaming) are not allowed. You aren't superman.",
"No terrorist or terrorism roleplay is allowed.",
"Always follow instructions given by moderators and admins.",
"Do not mix the chats (metagaming). You can't use info in IC that was received OOC",
"Keep English in main chats. If you aren't good at English, use {1}"
],
"AnimationHelp": [
"Animations allow you to enhance roleplay with visual actions",
"Use {1} or {2} with a name to use an animation.",
"To see a list of animations, use {1}"
],
"WeaponHelp": [
"Visit an gun store to buy weapons. Use {1} to find one.",
"Buying a weapon requires a weapon license.",
"Weapon licenses are managed by the police department. Apply there to get one.",
"Weapons can also be purchased illegally from some businesses, weapon dealers, and clans."
],
"SkinHelp": [
"At a clothing store, use {1} to purchase clothes",
"When you have a clothing item, equip and use it like any other item to show the skin selection (check {1} to learn how to use items)",
"Some skins are restricted to jobs, clans, or for other reasons."
],
"KeyBindHelp": [
"You can set your own key binds. Use {1} to see your binded keys.",
"Use {1} to add a new keybind and {2} to remove one.",
"Default keys are: {1} for vehicle engine, {2} for lights, and {3} for lock/unlock",
"Press {1} to see your items and {2} to equip an item or {3} to unequip all.",
"Press {1} to use the item you're holding, press {2} to drop it, or press {3} to pickup an item from the ground."
],
"BusinessHelp": [
"Use {1} to purchase items or {2} to see a list of what's for sale at any business",
"Businesses are shown with blue names above the icon at their entrance.",
"Business owner commands: {1}",
"A new car for sale will appear when you drive away from the dealer."
],
"ClanHelp": [
"Ask an administrator to create a clan (Similar to factions/groups/families)",
"Clan owners have full control over their clan once it's created",
"Clan commands: {1}",
"More clan commands: {1}"
],
"RadioStationHelp": [
"Use {1} to set the station for your vehicle, house, or business",
"Use {2} to see a list of stations",
"You can change your radio streaming volume using {1} with 0-100 as the percent"
],
"WealthAndTaxHelp": [
"Your taxes on payday are {1} percent of your calculated wealth.",
"Your calculated wealth is a total sum based on how many vehicles, houses, and businesses you have.",
"Each vehicle is {1}, each house is {2}, and each business is {3}",
"Use {1} to see your current wealth, and {2} to see how much you'll pay in tax each payday"
],
"MustBeInAVehicle": "You need to be in a vehicle!",
"MustBeInOrNearVehicle": "You need to be in or near a vehicle!",
"MustBeInVehicleFrontSeat": "You need to be in the vehicle front seats!",
"MustBeInVehicleDriverSeat": "You need to be the driver!",
"DontHaveVehicleKey": "You don't have a key for this vehicle!",
"NoGateAccess": "You don't have access to this gate!",
"GateBroken": "This gate is broken!",
"GateHacked": "The gate does not respond!",
"RadioJammed": "You hear only static from the radio.",
"VehicleNotForSale": "This vehicle is not for sale!",
"VehicleNotForRent": "This vehicle is not for rent!",
"BusinessNotForSale": "This business is not for sale!",
"BusinessNotForRent": "This business is not for rent!",
"HouseNotForSale": "This house is not for sale!",
"HouseNotForRent": "This house is not for rent!",
"DealershipPurchaseTestDrive": "Drive the vehicle away from the dealership to buy it, or get out to cancel.",
"DealershipPurchaseExitedVehicle": "You canceled the vehicle purchase by exiting the vehicle!",
"VehiclePurchaseComplete": "This vehicle is now yours! It will save wherever you leave it.",
"VehiclePurchaseNotEnoughMoney": "You don't have enough money to buy this vehicle!",
"HousePurchaseNotEnoughMoney": "You don't have enough money to buy this house!",
"BusinessPurchaseNotEnoughMoney": "You don't have enough money to buy this business!",
"ADDED-21JAN2022": "DO NOT TRANSLATE. This string is just a comment to separate newly added translations.",
"HeaderPlayerHousesList": "Player Houses ({1})",
"HeaderPlayerStaffFlagsList": "Player Staff Flags ({1})",
"HeaderStaffFlagsList": "Staff Flags",
"NonRPName": "Non-RP name! Choose a new one:",
"InvalidStaffFlag": "Staff flag not found!",
"InvalidClanFlag": "Clan flag not found!",
"InvalidLocale": "Language not found!",
"HeaderJobUniformList": "Job Uniforms ({1})",
"HeaderJobEquipmentList": "Job Equipment ({1})",
"InvalidJobUniform": "Job uniform not found!",
"InvalidJobEquipment": "Job equipment not found!",
"HeaderVehiclesInRangeList": "Vehicles within {1}",
"NoVehiclesWithInRange": "There are no vehicles within {1}",
"AmountNotNumber": "The amount must be a number!",
"NeedToBeWorking": "You need to be working! Use {1} at a job location or near a job vehicle.",
"NeedToBeOnJobRoute": "You need to be doing a job route! Use {1} in a job vehicle",
"CurrentJobRouteDeleted": "The job route you were on has been deleted by an admin",
"CurrentJobRouteVehicleColoursChanged": "Your job route's vehicle colours were changed by an admin",
"NotYourJob": "This is not your job!",
"JobPoints": "You can get a job by going the yellow points on the map.",
"QuitJobToTakeAnother": "If you want this job, use {1} to quit your current job.",
"NotAJobVehicle": "This is not a job vehicle!",
"NotYourJobVehicle": "This is not your job's vehicle!",
"JobRouteDisabled": "The job route you were on has been disabled by an admin",
"HeaderPickupTypes": "Pickup Types",
"HeaderBlipTypes": "Map Icon Types",
"InvalidGPSLocation": "There are no locations with that name or type",
"HeaderBusinessList": "Businesses",
"VehicleForSale": "This {1} is buyable for {2}! Use {3} if you want to buy it",
"VehicleForRent": "This {1} is rentable for {2}! Use {3} if you want to rent it",
"ADDED-31JAN2022": "DO NOT TRANSLATE. This string is just a comment to separate newly added translations.",
"LoginFailedInvalidPassword": "Invalid password! {1} attempts remaining",
"LoginFailedNoPassword": "You must enter a password! ! {1} attempts remaining",
"RegistrationFailedNoPassword": "You must enter a password!",
"RegistrationFailedNoPasswordConfirm": "You must confirm the password!",
"RegistrationFailedNoEmail": "You must enter an email!",
"AccountNameAlreadyRegistered": "Your name is already registered!",
"AlreadyLoggedIn": "You are already logged in!",
"RegistrationFailedInvalidEmail": "That email is invalid!",
"RegistrationFailedPasswordMismatch": "The passwords don't match!",
"RegistrationFailedCreateError": "Your account couldn't be created!",
"RegistrationSuccess": "Your account has been created!",
"RegistrationEmailVerifyReminder": "Don't forget to verify your email! A verification code has been sent to you.",
"RegistrationCreateCharReminder": "To play on the server, you will need to make a character.",
"NoCharactersGUIMessage": "You have no characters. Would you like to make one?",
"NoCharactersGUIWindowTitle": "No characters",
"NoCharactersChatMessage": "You have no characters. Use {1} to make one.",
"NeedEmailFor2FA": "You need to add your email to your account to use two-factor authentication.",
"NeedEmailVerifiedFor2FA": "You need to verify your email to use two-factor authentication.",
"SetEmailHelpTip": "Use {1} to set your email.",
"VerifyEmailHelpTip": "Use {1} to verify your email.",
"ADDED-13FEB2022": "DO NOT TRANSLATE. This string is just a comment to separate newly added translations.",
"NearbyRadio": "Nearby radio",
"FromRadio": "From radio",
"ToRadio": "To radio",
"NeedToEnterPropertyCommand": "You need to enter the {1} first! Use {2} to enter and exit",
"NeedToEnterPropertyKeyPress": "You need to enter the {1} first! Press {2} to enter and exit",
"InventoryFullCantCarry": "You don't have any space to carry this (full inventory)!",
"NotEnoughCashNeedAmountMore": "You don't have enough money! You need {1} more!",
"AmountMustBeMoreThan": "The amount must be more than {1}!",
"WeaponBanned": "You are not allowed to buy or use weapons!",
"TimeNotNumber": "The time must be a number",
"HeaderDefaultBusinessItemTypes": "Business Item Templates",
"FixingStuck": "Fixing your position and virtual world ...",
"CantUseCommandYet": "You must wait before you can use this command again!",
"NotATester": "You are not a tester!",
"AccessDenied": "AccessDenied",
"InvalidSkin": "That skin is invalid!",
"HeaderInteriorTypes": "Interiors List",
"ViewInventoryKeyPressTip": "Press {1} to see your items",
"ViewInventoryCommandTip": "Use {1} to see your items",
"GUIAccountSettingToggle": "You have turned {1} GUI",
"ADDED-23MAR2022": "DO NOT TRANSLATE. This string is just a comment to separate newly added translations",
"CarCommandHelp": "You can buy a car by visiting a vehicle dealership. Use {1} for more information.",
"SkinCommandHelp": "You can change your skin by visiting a clothes store. Use {1} for more info.",
"BusinessVehiclesRespawned": "🚗 All business vehicles have been respawned by an admin!",
"JobVehiclesRespawned": "🚗 All job vehicles have been respawned by an admin!",
"PlayerVehiclesRespawned": "🚗 All player vehicles have been respawned by an admin!",
"ClanVehiclesRespawned": "🚗 All clan vehicles have been respawned by an admin!",
"PublicVehiclesRespawned": "🚗 All public have been respawned by an admin!",
"EmptyVehiclesRespawned": "🚗 All empty vehicles have been respawned by an admin!",
"AllVehiclesRespawned": "🚗 All vehicles have been respawned by an admin!",
"AllVehiclesReloaded": "🚗 All vehicles have been reloaded by an admin!",
"YourVehicleRespawned": "🚗 Your vehicle has been respawned!",
"PlayerIPBanned": "💀 {1} has been IP banned!",
"PlayerCharacterBanned": "💀 {1} has been character banned!",
"PlayerSubNetBanned": "💀 {1} has been subnet banned!",
"CantModifyBusiness": "You can't manage or modify this business!",
"CantModifyHouse": "You can't manage or modify this house!",
"ServerTimeSet": "⏰ {1} set the time to {2}",
"ServerWeatherSet": "☁️ {1} set the weather to {2}",
"ServerSnowSet": "❄️ {1} turned falling snow {2} and ground snow {3}",
"AllJobsReloaded": "💼 All server jobs have been reloaded by an admin",
"ServerLogoSet": "{1} turned the server logo image {2}",
"ServerGUISet": "🖥️ {1} turned GUI for this server {2}",
"ServerBusinessBlipsSet": "🏢 {1} turned all business blips {2}",
"ServerHouseBlipsSet": "🏘️ {1} turned all house blips {2}",
"ServerJobBlipsSet": "💼 {1} turned all job blips {2}",
"ServerBusinessPickupsSet": "🏢 {1} turned all business pickups {2}",
"ServerHousePickupsSet": "🏘️ {1} turned all house pickups {2}",
"ServerJobPickupsSet": "💼 {1} turned on all job pickups {2}",
"BusinessBuyItemsLabel": "Use {1} to purchase items",
"PropertyEnterCommandLabel": "Use {1} to enter",
"PropertyEnterKeyPressLabel": "Press {1} to enter",
"PropertyForSaleLabel": "For sale: ${1}",
"PropertyForRentLabel": "For rent: ${1} every payday",
"RemainingTaxPaidInMoney": "You covered the remaining taxes with ${1} in cash.",
"LostMoneyFromTaxes": "You lost money since your taxes are more than your paycheck!",
"NextPaycheckRepossessionWarning": "If you don't have enough cash to cover taxes on next paycheck, you will lose stuff!",
"NotEnoughMoneyForTax": "You don't have enough money to cover your taxes!",
"AssetsRepossessedForTax": "You lost {1} vehicles, {2} houses, and {3} businesses because you couldn't pay taxes!",
"Closed": "Closed",
"Open": "Open",
"VehicleDealershipLabel": "Enter a vehicle as driver to buy it",
"TakeJobLabel": "Use {1} to work here",
"StartWorkLabel": "Use {1} to start working",
"JobEquipAndUniformLabel": "Use {1} and {2} for job stuff, or {3} to stop working",
"NotYourJobLabel": "You already have a different job. Use {1} if you want this one",
"JobLabel": "{1} Job",
"PaydayBonusSet": "🤑 {1} set the payday bonus to ${2}",
"AllHousesReloaded": "🏘️ All houses have been reloaded by an admin",
"AllRadioStationsReloaded": "📻 All radio stations have been reloaded by an admin!",
"PlayerKicked": "🦶 {1} has been kicked from the server",
"AllBusinessesReloaded": "🏢 All businesses have been reloaded by an admin!",
"UnableToDoThat": "You aren't able to do that",
"SetVehicleClanConfirmMessage": "Are you sure you want to give this vehicle to your clan?",
"SetVehicleClanConfirmTitle": "Warning!",
"SetItemPriceBelowOrderPriceMessage": "Are you sure you want to set the item price below it's order price? You will lose ${1} every purchase!",
"SetItemPriceBelowOrderPriceTitle": "Warning!",
"MustOwnVehicle": "You don't own this vehicle!",
"RandomTips": [
"Look for yellow dots on your map for job locations",
"You can set custom key binds. Use {1} for details",
"Use {1} if you don't want to see tips and extra information",
"You can edit your keybinds using {1} and {2}",
"Press to see your inventory, and use number keys to select an item",
"Use {1} at a business to purchase items",
"Found a bug? Report it with {1}",
"Have an idea or suggestion for the server? Let the devs know using {1}",
"Want to buy a business? Use {1} at one for sale",
"Want to buy a house? Use {1} at one for sale",
"Want to buy a vehicle? Visit a dealership and enter one for info on how to buy it!",
"Switch to any of your characters with {1}",
"Use {1} to automatically login when connecting with the same IP",
"Use {1} to turn on/off the lights in your house or business",
"Use {1} to play an internet radio station in your car, house, or business",
"Want to make a clan? Use {1} for details",
"Legal weapons can be purchased at any ammunation"
],
"PromptResponseTip": "Use {1} to accept or {2} to decline",
"PlayerConnecting": "👋 {1} is connecting to the server ...",
"GetStartedJobVehicle": "Get in a {1} to get started.",
"VehicleTypes": {
"Car": "Car",
"Truck": "Truck",
"Van": "Van",
"Taxi": "Taxi",
"Bus": "Bus",
"PoliceCar": "Police Car",
"Ambulance": "Ambulance",
"FireTruck": "Fire Truck",
"Bike": "Bike",
"Motorbike": "Motorbike",
"Boat": "Boat",
"Helicopter": "Helicopter",
"Plane": "Plane",
"Train": "Train"
},
"AlreadyOnJobRoute": "You are already doing a job route!",
"GaveVehicleToClan": "You gave this {1} to your clan!",
"JobDisabled": "This job is disabled!",
"SetHouseClanConfirmMessage": "Are you sure you want to give this house to your clan?",
"SetHouseClanConfirmTitle": "Warning!",
"SetBusinessClanConfirmMessage": "Are you sure you want to give this business to your clan?",
"SetBusinessClanConfirmTitle": "Warning!",
"MustOwnHouse": "You don't own this house!",
"MustOwnBusiness": "You don't own this business!",
"GaveHouseToClan": "You gave this house to your clan!",
"GaveBusinessToClan": "You gave this business to your clan!",
"BuyBusinessConfirmMessage": "Are you sure you want to buy this business?",
"BuyBusinessConfirmTitle": "Attention!",
"BuyHouseConfirmMessage": "Are you sure you want to buy this house?",
"BuyHouseConfirmTitle": "Attention!",
"BuyBusinessLabel": "Use {1} to buy this business",
"BuyHouseLabel": "Use {1} to buy this house",
"RentHouseLabel": "Use {1} to rent this house",
"DisconnectReasons": [
"Lost Connection",
"Disconnected",
"Unsupported Client",
"Wrong Game",
"Incorrect Password",
"Unsupported Executable",
"Disconnected",
"Banned",
"Failed",
"Invalid Name",
"Crashed",
"Modified Game"
],
"AccountEmailAlreadyVerified": "You already set and verified your email!",
"EmailVerificationCodeSent": "A verification code and instructions have been sent to your email.",
"GUIPlayAsCharacterButton": "Spielen",
"GUINewCharacterButton": "Neuer Charakter",
"GUIPreviousCharacterButton": "Zurück",
"GUINextCharacterButton": "Weiter",
"GUICharacterSelectWindowTitle": "Wähle einen Charakter",
"GUICharacterSelectMoneyLabel": "Geld: ${1}",
"GUICharacterSelectClanLabel": "Clan: {1}",
"GUICharacterSelectLastPlayedLabel": "Zuletzt gespielt vor: {1} Tagen, {2} Stunden, {3} Minuten",
"GUILoginWindowLabelEnterPassword": "Bitte Passwort eingeben",
"GUILoginWindowSubmitButton": "Login",
"GUILoginWindowResetPasswordButton": "Passwort zurücksetzen",
"GUILoginWindowPasswordPlaceholder": "Passwort",
"GUILoginWindowForgotPasswordLabel": "Passwort vergessen?",
"GUIRegisterWindowLabelCreateAccount": "Profil erstellen",
"GUIRegisterWindowPasswordPlaceholder": "Passwort",
"GUIRegisterWindowConfirmPasswordPlaceholder": "Passwort bestätigen",
"GUIRegisterWindowEmailPlaceholder": "Email",
"GUIRegisterWindowSubmitButton": "Profil erstellen",
"GUINewCharacterMessageLabel": "Charakter Name",
"GUINewCharacterFirstNamePlaceholder": "Vorname",
"GUINewCharacterLastNamePlaceholder": "Nachname",
"GUIChangePasswordWindowTitle": "Passwort ändern",
"GUIChangePasswordPasswordLabel": "Neues Passwort eingeben",
"GUIChangePasswordPasswordPlaceholder": "Passwort",
"GUIChangePasswordConfirmPasswordPlaceholder": "Passwort bestätigen",
"GUIChangePasswordSubmitButton": "Passwort ändern",
"GUIResetPasswordWindowMessage": "Passwort zurücksetzen",
"GUIResetPasswordConfirmEmailLabel": "Bitte bestätige deine Email",
"GUIResetPasswordEmailPlaceholder": "Email",
"GUIResetPasswordSubmitButton": "Passwort zurücksetzen",
"GUIResetPasswordLoginButton": "Login",
"GUIResetPasswordRememberMessage": "Passwort bekannt?",
"HeaderJobList": "Jobs",
"HeaderBusinessInfo": "Business Info",
"HeaderHouseInfo": "House Info",
"HeaderClanInfo": "Clan Info",
"Locales": {
"English": "English",
"Russian": "Russian",
"Spanish": "Spanish",
"German": "German",
"Dutch": "Dutch",
"Polish": "Polish",
"Chinese": "Chinese",
"French": "French",
"Japanese": "Japanese",
"Slovak": "Slovak",
"Arabic": "Arabic"
}
}

559
locale/japanese.json Normal file
View File

@@ -0,0 +1,559 @@
{
"TranslationProvidedBy": "Cocam",
"LocaleEnglishName": "Japanese",
"LocaleNativeName": "Japanese (Translate this to your native language)",
"LocaleOffer": "This server is available in Japanese. Use {1} to use it.",
"LocaleChanged1": "Your language is now set to {1}",
"LocaleChanged2": "The server will now display messages in {1}",
"LocaleChangedNote": "This does not change messages from other players",
"AccentsListHeader": "Accents",
"HelpMainListHeader": "Help Categories",
"AccentNotFound": "Accent not found",
"AccentSet": "You set your accent to {1}",
"InvalidAnimation": "That animation doesn't exist",
"AnimationCommandTip": "Use {1} to see a list of valid animations",
"InvalidAnimationDistance": "The distance must be between 0 and 3",
"AnimationStopCommandTip": "Use {1} to stop your animation",
"CantBanClient": "You cannot ban this person",
"PlayerAccountBanned": "{1} has been account banned",
"ClanNotFound": "Clan not found",
"ClanNameTaken": "A clan with that name already exists",
"PlayerNotFound": "Player not found",
"ClanCantRemoveRanks": "You can't remove clan ranks",
"ClanCantAddRanks": "You can't add clan ranks",
"ClanRankNotFound": "Clan rank not found",
"ClanCantChangeMemberTag": "You can not change clan member's tags",
"ClanPlayerNotInSameClan": "That player is not in your clan",
"ClanCantChangeRankLevel": "You can not change clan rank's level",
"ClanCantChangeRankTag": "You can not change clan rank's tags",
"NameNotRegistered": "Your name is not registered! Use {1} to make an account.",
"AutomaticLoginIPToggle": "Automatic login by IP is now {1}",
"CouldNotRegisterAccount": "There was a problem creating your account. Please contact an admin.",
"RandomTipsToggle": "Random tips are now {1}",
"ActionTipsToggle": "Action tips are now {1}",
"AutoSpawnLastCharToggle": "Automatic spawn as last used character is {1}",
"AccountGUISettingToggle": "🖥️ GUI is now {1}",
"On": "On",
"Off": "Off",
"Yes": "Yes",
"No": "No",
"True": "True",
"False": "False",
"Locked": "Locked",
"Unlocked": "Unlocked",
"PasswordNotGoodEnough": "The new password must meet the requirements!",
"PasswordNeedsBase": "Passwords must have at least {1}",
"PasswordNeedsCapitals": "{1} capital letters",
"PasswordNeedsNumbers": "{1} numbers",
"PasswordNeedsSymbols": "{1} symbols",
"PasswordsDontMatch": "The new password and confirm new password aren't the same!",
"PasswordChanged": "Your password has been changed!",
"AutoLoggedInIP": "You have been automatically logged in by IP!",
"WelcomeBack": "Welcome back to {1}, {2}! Please {3} to continue.",
"WelcomeNewPlayer": "Welcome to {1}, {2}! Please {3} to play.",
"InvalidPlayer": "Player not found!",
"InvalidBusiness": "Business not found!",
"InvalidHouse": "House not found!",
"InvalidVehicle": "Vehicle not found!",
"InvalidClan": "Clan not found!",
"InvalidClanRank": "Clan rank not found!",
"InvalidJob": "Job not found!",
"InvalidItem": "Item not found!",
"InvalidItemType": "Item type not found!",
"InvalidRadioStation": "Radio station not found!",
"InvalidGate": "Gate not found!",
"EntersProperty": "opens the door and enters the {1}",
"ExitsProperty": "opens the door and exits the {1}",
"EnterExitPropertyDoorLocked": "tries to open the {1} door but fails because it's locked",
"PropertyNoInterior": "This {1} does not have an interior, but you can still use commands at the door icon.",
"NoBusinessWithItemType": "There is no business with that item available",
"HeaderKeyBinds": "Key Binds",
"HeaderAccountHelp": "Account Help",
"HeaderVehicleHelp": "Vehicle Help",
"HeaderVehicleDealershipHelp": "Vehicle Dealership Help",
"HeaderJobHelp": "Job Help",
"HeaderChatHelp": "Chat Help",
"HeaderServerRules": "Server Rules",
"HeaderWebsiteInfo": "Website",
"HeaderDiscordInfo": "Discord",
"HeaderAnimationsList": "Animation List",
"HeaderPayAndSprayHelp": "Pay and Spray Help",
"HeaderAmmunationHelp": "Ammunation Help",
"HeaderVehicleTuneupHelp": "Vehicle Tune Help",
"HeaderBindableKeysHelp": "Bindable Keys",
"HeaderSkinHelp": "Clothes/Skin Help",
"HeaderBusinessHelp": "Business Help",
"HeaderClanHelp": "Clan Help",
"HeaderPlayerVehiclesList": "Player Vehicles ({1})",
"HeaderPlayerBusinessesList": "Player Businesses ({1})",
"HeaderClansList": "Clan List",
"HeaderAdminsList": "Admin List",
"HeaderBadgeInfo": "Badge Information",
"HeaderAccentsList": "Accent List",
"HeaderPlayerInfo": "Player Information ({1})",
"HeaderWealthandTaxHelp": "Wealth and Tax Information",
"HeaderCommandInfo": "Command Information ({1})",
"HeaderRadioHelp": "Radio Help",
"HeaderRadioStationsList": "Radio Stations",
"HeaderKeyBindsList": "Key Binds List",
"RadioVolumeChanged": "{1} You changed your streaming radio volume to {2}%",
"VolumeLevelNotNumber": "The volume level must be a number",
"RadioStationLocationInvalid": "You must be in a vehicle, house, or business or have a personal device to change the station!",
"ActionBusinessRadioStationChange": "changes the business radio station to {1} ({2})",
"ActionHouseRadioStationChange": "changes the house radio station to {1} ({2})",
"ActionVehicleRadioStationChange": "changes the vehicle radio station to {1} ({2})",
"ActionItemRadioStationChange": "changes the {1}'s station to {2} ({3})",
"RandomVehicleCommandsDisabled": "This is a random traffic vehicle and commands can't be used for it.",
"HouseDoorLock": "House {1} {2}!",
"BusinessDoorLock": "Business {1} {2}!",
"ServerGameModeRestarting": "The server game mode is restarting!",
"HeaderSelfItemList": "Your Inventory",
"HeaderPlayerItemList": "Player Inventory ({1})",
"HeaderHouseItemList": "House Inventory",
"HeaderBusinessFloorItemList": "Business Inventory (For Sale)",
"HeaderBusinessStorageItemList": "Business Inventory (Storage)",
"HeaderItemItemList": "{1}'s Inventory",
"ItemSlotNotNumber": "The item slot must be a number",
"ItemSlotMustBeBetween": "The item slot must be between {1} and {2}!",
"UseItemBugged": "The item you're trying to use is bugged. A bug report has been sent to the server developers.",
"PickupItemBugged": "The item you're trying to pickup is bugged. A bug report has been sent to the server developers.",
"DropItemBugged": "The item you're trying to drop is bugged. A bug report has been sent to the server developers.",
"HandsBusy": "Your hands are busy",
"CantUseItemInSkinChange": "You can't use an item while customizing your appearance",
"CantDropItemInSkinChange": "You can't drop an item while customizing your appearance",
"CantPickupItemInSkinChange": "You can't pickup an item while customizing your appearance",
"CantSwitchItemInSkinChange": "You can't switch an item while customizing your appearance",
"CantGiveItemInSkinChange": "You can't give an item while customizing your appearance",
"CantTakeItemInSkinChange": "You can't take an item while customizing your appearance",
"ItemUnequippableNoAmmo": "The {1} in slot {2} has no ammo, and can't be equipped!",
"NoSpaceSelfInventory": "You don't have any more space in your inventory",
"Business": "business",
"House": "house",
"Clan": "clan",
"Vehicle": "vehicle",
"Item": "item",
"ItemType": "item type",
"Gate": "gate",
"Door": "door",
"ClanRank": "clan rank",
"JobRank": "job rank",
"RadioStation": "radio station",
"Months": [
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
],
"WeekDays": [
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
],
"CardinalDirections": [
"North",
"Northeast",
"East",
"Southeast",
"South",
"Southwest",
"West",
"Northwest"
],
"NewPlayerReadyToPlay": [
"You have been given some cash. Use {1} to find places to buy items.",
"If you need money, jobs are the yellow dots on the radar.",
"For a car, visit the car dealership. You can also use a rental vehicle near spawn or take the train",
"Be sure to read the {1} and use {2} for info."
],
"YourCurrentVehicleDeleted": "The vehicle you were in was deleted.",
"Distance": "Distance",
"Meters": "Meters",
"Feet": "Feet",
"Kilometers": "Kilometers",
"Miles": "Miles",
"MustBeVehicleDriver": "You must be the driver of the vehicle!",
"PlayerJoined": "{1} has joined the game from {2}!",
"PlayerLeftServer": "{1} has left the game! ({2})",
"TakeItemFromHouse": "takes a {1} from the house",
"TakeItemFromBusinessStorage": "takes a {1} from the business storage",
"TakeItemFromBusiness": "takes a {1} from the business",
"TakeItemFromItem": "takes a {1} from the {2}",
"TakeItemFromVehicleTrunk": "takes a {1} from the trunk",
"TakeItemFromVehicleDash": "takes a {1} from the glove compartment",
"JobEquipmentInventoryKeyBindTip": "The job equipment is in your inventory. Press {1} to see them.",
"JobEquipmentInventoryCommandTip": "The job equipment is in your inventory. Use {1} to see them.",
"AccountHelp": [
"Do NOT share your password with anybody else. {1} staff will never ask you for your password",
"Use {1} to change your password, and {2} if you forgot it",
"Some settings you can use: {1}"
],
"VehicleHelp": [
"Your personal vehicles will save wherever you or somebody else leaves them!",
"Visit dealerships to buy new vehicles (Use {1} for more information)",
"Some commands: {1}",
"Visit a mechanic garage to repair, colour, and tune up your car! {1} for info"
],
"VehicleDealershipHelp": [
"Visit a vehicle dealer to buy new vehicles. Use {1} to find one.",
"At the dealer, enter a car you want to buy, and the price will be shown to you",
"If you want to buy the vehicle, use {1} and you will be given keys to test drive it around the parking lot.",
"Drive away from the dealership with the new vehicle to confirm the purchase."
],
"JobHelp": [
"Visit job locations to get a job and earn money. Look for yellow spots on the map",
"At a job location, use {1} to get the job. Use {2} to quit your job",
"Use {1} to begin working. You can also get a job {2} and {3}",
"Most job vehicles are locked. Use {1} near one to enter it.",
"When entering a job vehicle, information on how to do the job will be shown to you."
],
"ChatHelp": [
"There are two main types of chat: out-of-character (OOC) and in-character (IC)",
"Mixing these two types is not proper roleplay. See {1} for info.",
"Some chat commands: {1}",
"Some have shorter names available ({1} to talk, {2} to shout, etc)"
],
"ServerRulesHelp": [
"Unrealistic actions (powergaming) are not allowed. You aren't superman.",
"No terrorist or terrorism roleplay is allowed.",
"Always follow instructions given by moderators and admins.",
"Do not mix the chats (metagaming). You can't use info in IC that was received OOC",
"Keep English in main chats. If you aren't good at English, use {1}"
],
"AnimationHelp": [
"Animations allow you to enhance roleplay with visual actions",
"Use {1} or {2} with a name to use an animation.",
"To see a list of animations, use {1}"
],
"WeaponHelp": [
"Visit an gun store to buy weapons. Use {1} to find one.",
"Buying a weapon requires a weapon license.",
"Weapon licenses are managed by the police department. Apply there to get one.",
"Weapons can also be purchased illegally from some businesses, weapon dealers, and clans."
],
"SkinHelp": [
"At a clothing store, use {1} to purchase clothes",
"When you have a clothing item, equip and use it like any other item to show the skin selection (check {1} to learn how to use items)",
"Some skins are restricted to jobs, clans, or for other reasons."
],
"KeyBindHelp": [
"You can set your own key binds. Use {1} to see your binded keys.",
"Use {1} to add a new keybind and {2} to remove one.",
"Default keys are: {1} for vehicle engine, {2} for lights, and {3} for lock/unlock",
"Press {1} to see your items and {2} to equip an item or {3} to unequip all.",
"Press {1} to use the item you're holding, press {2} to drop it, or press {3} to pickup an item from the ground."
],
"BusinessHelp": [
"Use {1} to purchase items or {2} to see a list of what's for sale at any business",
"Businesses are shown with blue names above the icon at their entrance.",
"Business owner commands: {1}",
"A new car for sale will appear when you drive away from the dealer."
],
"ClanHelp": [
"Ask an administrator to create a clan (Similar to factions/groups/families)",
"Clan owners have full control over their clan once it's created",
"Clan commands: {1}",
"More clan commands: {1}"
],
"RadioStationHelp": [
"Use {1} to set the station for your vehicle, house, or business",
"Use {2} to see a list of stations",
"You can change your radio streaming volume using {1} with 0-100 as the percent"
],
"WealthAndTaxHelp": [
"Your taxes on payday are {1} percent of your calculated wealth.",
"Your calculated wealth is a total sum based on how many vehicles, houses, and businesses you have.",
"Each vehicle is {1}, each house is {2}, and each business is {3}",
"Use {1} to see your current wealth, and {2} to see how much you'll pay in tax each payday"
],
"MustBeInAVehicle": "You need to be in a vehicle!",
"MustBeInOrNearVehicle": "You need to be in or near a vehicle!",
"MustBeInVehicleFrontSeat": "You need to be in the vehicle front seats!",
"MustBeInVehicleDriverSeat": "You need to be the driver!",
"DontHaveVehicleKey": "You don't have a key for this vehicle!",
"NoGateAccess": "You don't have access to this gate!",
"GateBroken": "This gate is broken!",
"GateHacked": "The gate does not respond!",
"RadioJammed": "You hear only static from the radio.",
"VehicleNotForSale": "This vehicle is not for sale!",
"VehicleNotForRent": "This vehicle is not for rent!",
"BusinessNotForSale": "This business is not for sale!",
"BusinessNotForRent": "This business is not for rent!",
"HouseNotForSale": "This house is not for sale!",
"HouseNotForRent": "This house is not for rent!",
"DealershipPurchaseTestDrive": "Drive the vehicle away from the dealership to buy it, or get out to cancel.",
"DealershipPurchaseExitedVehicle": "You canceled the vehicle purchase by exiting the vehicle!",
"VehiclePurchaseComplete": "This vehicle is now yours! It will save wherever you leave it.",
"VehiclePurchaseNotEnoughMoney": "You don't have enough money to buy this vehicle!",
"HousePurchaseNotEnoughMoney": "You don't have enough money to buy this house!",
"BusinessPurchaseNotEnoughMoney": "You don't have enough money to buy this business!",
"ADDED-21JAN2022": "DO NOT TRANSLATE. This string is just a comment to separate newly added translations.",
"HeaderPlayerHousesList": "Player Houses ({1})",
"HeaderPlayerStaffFlagsList": "Player Staff Flags ({1})",
"HeaderStaffFlagsList": "Staff Flags",
"NonRPName": "Non-RP name! Choose a new one:",
"InvalidStaffFlag": "Staff flag not found!",
"InvalidClanFlag": "Clan flag not found!",
"InvalidLocale": "Language not found!",
"HeaderJobUniformList": "Job Uniforms ({1})",
"HeaderJobEquipmentList": "Job Equipment ({1})",
"InvalidJobUniform": "Job uniform not found!",
"InvalidJobEquipment": "Job equipment not found!",
"HeaderVehiclesInRangeList": "Vehicles within {1}",
"NoVehiclesWithInRange": "There are no vehicles within {1}",
"AmountNotNumber": "The amount must be a number!",
"NeedToBeWorking": "You need to be working! Use {1} at a job location or near a job vehicle.",
"NeedToBeOnJobRoute": "You need to be doing a job route! Use {1} in a job vehicle",
"CurrentJobRouteDeleted": "The job route you were on has been deleted by an admin",
"CurrentJobRouteVehicleColoursChanged": "Your job route's vehicle colours were changed by an admin",
"NotYourJob": "This is not your job!",
"JobPoints": "You can get a job by going the yellow points on the map.",
"QuitJobToTakeAnother": "If you want this job, use {1} to quit your current job.",
"NotAJobVehicle": "This is not a job vehicle!",
"NotYourJobVehicle": "This is not your job's vehicle!",
"JobRouteDisabled": "The job route you were on has been disabled by an admin",
"HeaderPickupTypes": "Pickup Types",
"HeaderBlipTypes": "Map Icon Types",
"InvalidGPSLocation": "There are no locations with that name or type",
"HeaderBusinessList": "Businesses",
"VehicleForSale": "This {1} is buyable for {2}! Use {3} if you want to buy it",
"VehicleForRent": "This {1} is rentable for {2}! Use {3} if you want to rent it",
"ADDED-31JAN2022": "DO NOT TRANSLATE. This string is just a comment to separate newly added translations.",
"LoginFailedInvalidPassword": "Invalid password! {1} attempts remaining",
"LoginFailedNoPassword": "You must enter a password! ! {1} attempts remaining",
"RegistrationFailedNoPassword": "You must enter a password!",
"RegistrationFailedNoPasswordConfirm": "You must confirm the password!",
"RegistrationFailedNoEmail": "You must enter an email!",
"AccountNameAlreadyRegistered": "Your name is already registered!",
"AlreadyLoggedIn": "You are already logged in!",
"RegistrationFailedInvalidEmail": "That email is invalid!",
"RegistrationFailedPasswordMismatch": "The passwords don't match!",
"RegistrationFailedCreateError": "Your account couldn't be created!",
"RegistrationSuccess": "Your account has been created!",
"RegistrationEmailVerifyReminder": "Don't forget to verify your email! A verification code has been sent to you.",
"RegistrationCreateCharReminder": "To play on the server, you will need to make a character.",
"NoCharactersGUIMessage": "You have no characters. Would you like to make one?",
"NoCharactersGUIWindowTitle": "No characters",
"NoCharactersChatMessage": "You have no characters. Use {1} to make one.",
"NeedEmailFor2FA": "You need to add your email to your account to use two-factor authentication.",
"NeedEmailVerifiedFor2FA": "You need to verify your email to use two-factor authentication.",
"SetEmailHelpTip": "Use {1} to set your email.",
"VerifyEmailHelpTip": "Use {1} to verify your email.",
"ADDED-13FEB2022": "DO NOT TRANSLATE. This string is just a comment to separate newly added translations.",
"NearbyRadio": "Nearby radio",
"FromRadio": "From radio",
"ToRadio": "To radio",
"NeedToEnterPropertyCommand": "You need to enter the {1} first! Use {2} to enter and exit",
"NeedToEnterPropertyKeyPress": "You need to enter the {1} first! Press {2} to enter and exit",
"InventoryFullCantCarry": "You don't have any space to carry this (full inventory)!",
"NotEnoughCashNeedAmountMore": "You don't have enough money! You need {1} more!",
"AmountMustBeMoreThan": "The amount must be more than {1}!",
"WeaponBanned": "You are not allowed to buy or use weapons!",
"TimeNotNumber": "The time must be a number",
"HeaderDefaultBusinessItemTypes": "Business Item Templates",
"FixingStuck": "Fixing your position and virtual world ...",
"CantUseCommandYet": "You must wait before you can use this command again!",
"NotATester": "You are not a tester!",
"AccessDenied": "AccessDenied",
"InvalidSkin": "That skin is invalid!",
"HeaderInteriorTypes": "Interiors List",
"ViewInventoryKeyPressTip": "Press {1} to see your items",
"ViewInventoryCommandTip": "Use {1} to see your items",
"GUIAccountSettingToggle": "You have turned {1} GUI",
"ADDED-23MAR2022": "DO NOT TRANSLATE. This string is just a comment to separate newly added translations",
"CarCommandHelp": "You can buy a car by visiting a vehicle dealership. Use {1} for more information.",
"SkinCommandHelp": "You can change your skin by visiting a clothes store. Use {1} for more info.",
"BusinessVehiclesRespawned": "🚗 All business vehicles have been respawned by an admin!",
"JobVehiclesRespawned": "🚗 All job vehicles have been respawned by an admin!",
"PlayerVehiclesRespawned": "🚗 All player vehicles have been respawned by an admin!",
"ClanVehiclesRespawned": "🚗 All clan vehicles have been respawned by an admin!",
"PublicVehiclesRespawned": "🚗 All public have been respawned by an admin!",
"EmptyVehiclesRespawned": "🚗 All empty vehicles have been respawned by an admin!",
"AllVehiclesRespawned": "🚗 All vehicles have been respawned by an admin!",
"AllVehiclesReloaded": "🚗 All vehicles have been reloaded by an admin!",
"YourVehicleRespawned": "🚗 Your vehicle has been respawned!",
"PlayerIPBanned": "💀 {1} has been IP banned!",
"PlayerCharacterBanned": "💀 {1} has been character banned!",
"PlayerSubNetBanned": "💀 {1} has been subnet banned!",
"CantModifyBusiness": "You can't manage or modify this business!",
"CantModifyHouse": "You can't manage or modify this house!",
"ServerTimeSet": "⏰ {1} set the time to {2}",
"ServerWeatherSet": "☁️ {1} set the weather to {2}",
"ServerSnowSet": "❄️ {1} turned falling snow {2} and ground snow {3}",
"AllJobsReloaded": "💼 All server jobs have been reloaded by an admin",
"ServerLogoSet": "{1} turned the server logo image {2}",
"ServerGUISet": "🖥️ {1} turned GUI for this server {2}",
"ServerBusinessBlipsSet": "🏢 {1} turned all business blips {2}",
"ServerHouseBlipsSet": "🏘️ {1} turned all house blips {2}",
"ServerJobBlipsSet": "💼 {1} turned all job blips {2}",
"ServerBusinessPickupsSet": "🏢 {1} turned all business pickups {2}",
"ServerHousePickupsSet": "🏘️ {1} turned all house pickups {2}",
"ServerJobPickupsSet": "💼 {1} turned on all job pickups {2}",
"BusinessBuyItemsLabel": "Use {1} to purchase items",
"PropertyEnterCommandLabel": "Use {1} to enter",
"PropertyEnterKeyPressLabel": "Press {1} to enter",
"PropertyForSaleLabel": "For sale: ${1}",
"PropertyForRentLabel": "For rent: ${1} every payday",
"RemainingTaxPaidInMoney": "You covered the remaining taxes with ${1} in cash.",
"LostMoneyFromTaxes": "You lost money since your taxes are more than your paycheck!",
"NextPaycheckRepossessionWarning": "If you don't have enough cash to cover taxes on next paycheck, you will lose stuff!",
"NotEnoughMoneyForTax": "You don't have enough money to cover your taxes!",
"AssetsRepossessedForTax": "You lost {1} vehicles, {2} houses, and {3} businesses because you couldn't pay taxes!",
"Closed": "Closed",
"Open": "Open",
"VehicleDealershipLabel": "Enter a vehicle as driver to buy it",
"TakeJobLabel": "Use {1} to work here",
"StartWorkLabel": "Use {1} to start working",
"JobEquipAndUniformLabel": "Use {1} and {2} for job stuff, or {3} to stop working",
"NotYourJobLabel": "You already have a different job. Use {1} if you want this one",
"JobLabel": "{1} Job",
"PaydayBonusSet": "🤑 {1} set the payday bonus to ${2}",
"AllHousesReloaded": "🏘️ All houses have been reloaded by an admin",
"AllRadioStationsReloaded": "📻 All radio stations have been reloaded by an admin!",
"PlayerKicked": "🦶 {1} has been kicked from the server",
"AllBusinessesReloaded": "🏢 All businesses have been reloaded by an admin!",
"UnableToDoThat": "You aren't able to do that",
"SetVehicleClanConfirmMessage": "Are you sure you want to give this vehicle to your clan?",
"SetVehicleClanConfirmTitle": "Warning!",
"SetItemPriceBelowOrderPriceMessage": "Are you sure you want to set the item price below it's order price? You will lose ${1} every purchase!",
"SetItemPriceBelowOrderPriceTitle": "Warning!",
"MustOwnVehicle": "You don't own this vehicle!",
"RandomTips": [
"Look for yellow dots on your map for job locations",
"You can set custom key binds. Use {1} for details",
"Use {1} if you don't want to see tips and extra information",
"You can edit your keybinds using {1} and {2}",
"Press to see your inventory, and use number keys to select an item",
"Use {1} at a business to purchase items",
"Found a bug? Report it with {1}",
"Have an idea or suggestion for the server? Let the devs know using {1}",
"Want to buy a business? Use {1} at one for sale",
"Want to buy a house? Use {1} at one for sale",
"Want to buy a vehicle? Visit a dealership and enter one for info on how to buy it!",
"Switch to any of your characters with {1}",
"Use {1} to automatically login when connecting with the same IP",
"Use {1} to turn on/off the lights in your house or business",
"Use {1} to play an internet radio station in your car, house, or business",
"Want to make a clan? Use {1} for details",
"Legal weapons can be purchased at any ammunation"
],
"PromptResponseTip": "Use {1} to accept or {2} to decline",
"PlayerConnecting": "👋 {1} is connecting to the server ...",
"GetStartedJobVehicle": "Get in a {1} to get started.",
"VehicleTypes": {
"Car": "Car",
"Truck": "Truck",
"Van": "Van",
"Taxi": "Taxi",
"Bus": "Bus",
"PoliceCar": "Police Car",
"Ambulance": "Ambulance",
"FireTruck": "Fire Truck",
"Bike": "Bike",
"Motorbike": "Motorbike",
"Boat": "Boat",
"Helicopter": "Helicopter",
"Plane": "Plane",
"Train": "Train"
},
"AlreadyOnJobRoute": "You are already doing a job route!",
"GaveVehicleToClan": "You gave this {1} to your clan!",
"JobDisabled": "This job is disabled!",
"SetHouseClanConfirmMessage": "Are you sure you want to give this house to your clan?",
"SetHouseClanConfirmTitle": "Warning!",
"SetBusinessClanConfirmMessage": "Are you sure you want to give this business to your clan?",
"SetBusinessClanConfirmTitle": "Warning!",
"MustOwnHouse": "You don't own this house!",
"MustOwnBusiness": "You don't own this business!",
"GaveHouseToClan": "You gave this house to your clan!",
"GaveBusinessToClan": "You gave this business to your clan!",
"BuyBusinessConfirmMessage": "Are you sure you want to buy this business?",
"BuyBusinessConfirmTitle": "Attention!",
"BuyHouseConfirmMessage": "Are you sure you want to buy this house?",
"BuyHouseConfirmTitle": "Attention!",
"BuyBusinessLabel": "Use {1} to buy this business",
"BuyHouseLabel": "Use {1} to buy this house",
"RentHouseLabel": "Use {1} to rent this house",
"DisconnectReasons": [
"Lost Connection",
"Disconnected",
"Unsupported Client",
"Wrong Game",
"Incorrect Password",
"Unsupported Executable",
"Disconnected",
"Banned",
"Failed",
"Invalid Name",
"Crashed",
"Modified Game"
],
"AccountEmailAlreadyVerified": "You already set and verified your email!",
"EmailVerificationCodeSent": "A verification code and instructions have been sent to your email.",
"GUIPlayAsCharacterButton": "Play",
"GUINewCharacterButton": "New character",
"GUIPreviousCharacterButton": "Previous",
"GUINextCharacterButton": "Next",
"GUICharacterSelectWindowTitle": "Select a character",
"GUICharacterSelectMoneyLabel": "Money: ${1}",
"GUICharacterSelectClanLabel": "Clan: {1}",
"GUICharacterSelectLastPlayedLabel": "Last Played: {1} days, {2} hours, {3} minutes ago",
"GUILoginWindowLabelEnterPassword": "Please enter your password",
"GUILoginWindowSubmitButton": "Login",
"GUILoginWindowResetPasswordButton": "Reset password",
"GUILoginWindowPasswordPlaceholder": "Password",
"GUILoginWindowForgotPasswordLabel": "Forgot your password?",
"GUIRegisterWindowLabelCreateAccount": "Create an account",
"GUIRegisterWindowPasswordPlaceholder": "Password",
"GUIRegisterWindowConfirmPasswordPlaceholder": "Confirm password",
"GUIRegisterWindowEmailPlaceholder": "Email",
"GUIRegisterWindowSubmitButton": "Create account",
"GUINewCharacterMessageLabel": "Name your character",
"GUINewCharacterFirstNamePlaceholder": "First Name",
"GUINewCharacterLastNamePlaceholder": "Last Name",
"GUINewCharacterSubmitButton": "Create Character",
"GUIChangePasswordWindowTitle": "Change Password",
"GUIChangePasswordPasswordLabel": "Enter a new password",
"GUIChangePasswordPasswordPlaceholder": "Password",
"GUIChangePasswordConfirmPasswordPlaceholder": "Confirm password",
"GUIChangePasswordSubmitButton": "Change Password",
"GUIResetPasswordWindowMessage": "Reset Password",
"GUIResetPasswordConfirmEmailLabel": "Please confirm your email",
"GUIResetPasswordEmailPlaceholder": "Email",
"GUIResetPasswordSubmitButton": "Reset Password",
"GUIResetPasswordLoginButton": "Login",
"GUIResetPasswordRememberMessage": "Remember your password?",
"HeaderJobList": "Jobs",
"HeaderBusinessInfo": "Business Info",
"HeaderHouseInfo": "House Info",
"HeaderClanInfo": "Clan Info",
"Locales": {
"English": "English",
"Russian": "Russian",
"Spanish": "Spanish",
"German": "German",
"Dutch": "Dutch",
"Polish": "Polish",
"Chinese": "Chinese",
"French": "French",
"Japanese": "Japanese",
"Slovak": "Slovak",
"Arabic": "Arabic"
}
}

145
meta.xml
View File

@@ -1,5 +1,5 @@
<meta> <meta>
<info author="Vortrex" version="1.0" description="Vortrex's Roleplay Resource" /> <info author="Vortrex" version="1.0" description="Asshat Gaming Roleplay - Main Script" />
<!-- Shared --> <!-- Shared -->
<script src="scripts/shared/const.js" type="server" language="javascript" /> <script src="scripts/shared/const.js" type="server" language="javascript" />
@@ -10,7 +10,7 @@
<script src="scripts/shared/gamedata.js" type="client" language="javascript" /> <script src="scripts/shared/gamedata.js" type="client" language="javascript" />
<!-- Multiplayer Mod (Wrapped Natives) --> <!-- Multiplayer Mod (Wrapped Natives) -->
<!-- The goal is to just swap only these out when I port the script to a new mod, like Oakwood --> <!-- The goal is to just swap only these out when I port the script to a new MP mod -->
<script src="scripts/server/native/connected.js" type="server" language="javascript" /> <script src="scripts/server/native/connected.js" type="server" language="javascript" />
<script src="scripts/client/native/connected.js" type="client" language="javascript" /> <script src="scripts/client/native/connected.js" type="client" language="javascript" />
@@ -22,8 +22,10 @@
<script src="scripts/server/ban.js" type="server" language="javascript" /> <script src="scripts/server/ban.js" type="server" language="javascript" />
<script src="scripts/server/bitflag.js" type="server" language="javascript" /> <script src="scripts/server/bitflag.js" type="server" language="javascript" />
<script src="scripts/server/business.js" type="server" language="javascript" /> <script src="scripts/server/business.js" type="server" language="javascript" />
<script src="scripts/server/casino.js" type="server" language="javascript" />
<script src="scripts/server/chat.js" type="server" language="javascript" /> <script src="scripts/server/chat.js" type="server" language="javascript" />
<script src="scripts/server/clan.js" type="server" language="javascript" /> <script src="scripts/server/clan.js" type="server" language="javascript" />
<script src="scripts/server/client.js" type="server" language="javascript" />
<script src="scripts/server/crime.js" type="server" language="javascript" /> <script src="scripts/server/crime.js" type="server" language="javascript" />
<script src="scripts/server/database.js" type="server" language="javascript" /> <script src="scripts/server/database.js" type="server" language="javascript" />
<script src="scripts/server/developer.js" type="server" language="javascript" /> <script src="scripts/server/developer.js" type="server" language="javascript" />
@@ -47,6 +49,8 @@
<script src="scripts/server/misc.js" type="server" language="javascript" /> <script src="scripts/server/misc.js" type="server" language="javascript" />
<script src="scripts/server/npc.js" type="server" language="javascript" /> <script src="scripts/server/npc.js" type="server" language="javascript" />
<script src="scripts/server/netevents.js" type="server" language="javascript" /> <script src="scripts/server/netevents.js" type="server" language="javascript" />
<script src="scripts/server/paintball.js" type="server" language="javascript" />
<script src="scripts/server/prompt.js" type="server" language="javascript" />
<script src="scripts/server/race.js" type="server" language="javascript" /> <script src="scripts/server/race.js" type="server" language="javascript" />
<script src="scripts/server/radio.js" type="server" language="javascript" /> <script src="scripts/server/radio.js" type="server" language="javascript" />
<script src="scripts/server/security.js" type="server" language="javascript" /> <script src="scripts/server/security.js" type="server" language="javascript" />
@@ -79,27 +83,158 @@
<script src="scripts/server/item/rope.js" type="server" language="javascript" /> <script src="scripts/server/item/rope.js" type="server" language="javascript" />
<script src="scripts/server/item/tazer.js" type="server" language="javascript" /> <script src="scripts/server/item/tazer.js" type="server" language="javascript" />
<!-- Extra Client Files -->
<file type="client" src="files/fonts/roboto-regular.ttf" />
<file type="client" src="files/fonts/pricedown.ttf" />
<file type="client" src="files/fonts/aurora-bold-condensed.ttf" />
<file type="client" src="files/images/skins/none.png" />
<!--<file type="client" src="files/images/server-logo.png" />-->
<file type="client" src="files/images/asshat-logo.png" />
<file type="client" src="files/images/cursor.png" />
<!-- GUI -->
<script src="scripts/client/gui/2fa.js" type="client" language="javascript" />
<script src="scripts/client/gui/bizmgr.js" type="client" language="javascript" />
<script src="scripts/client/gui/changepass.js" type="client" language="javascript" />
<script src="scripts/client/gui/charselect.js" type="client" language="javascript" />
<script src="scripts/client/gui/clanmgr.js" type="client" language="javascript" />
<script src="scripts/client/gui/error.js" type="client" language="javascript" />
<script src="scripts/client/gui/housemgr.js" type="client" language="javascript" />
<script src="scripts/client/gui/info.js" type="client" language="javascript" />
<script src="scripts/client/gui/inventory.js" type="client" language="javascript" />
<script src="scripts/client/gui/inventorybulk.js" type="client" language="javascript" />
<script src="scripts/client/gui/list.js" type="client" language="javascript" />
<script src="scripts/client/gui/login.js" type="client" language="javascript" />
<script src="scripts/client/gui/localechooser.js" type="client" language="javascript" />
<script src="scripts/client/gui/newchar.js" type="client" language="javascript" />
<script src="scripts/client/gui/register.js" type="client" language="javascript" />
<script src="scripts/client/gui/resetpass.js" type="client" language="javascript" />
<script src="scripts/client/gui/yesno.js" type="client" language="javascript" />
<script src="scripts/client/gui/games/blackjack.js" type="client" language="javascript" />
<script src="scripts/client/gui/games/betting.js" type="client" language="javascript" />
<script src="scripts/client/gui/games/5cardpoker.js" type="client" language="javascript" />
<!-- Client Scripts --> <!-- Client Scripts -->
<script src="scripts/client/afk.js" type="client" language="javascript" /> <script src="scripts/client/afk.js" type="client" language="javascript" />
<script src="scripts/client/animation.js" type="client" language="javascript" /> <script src="scripts/client/animation.js" type="client" language="javascript" />
<script src="scripts/client/business.js" type="client" language="javascript" /> <script src="scripts/client/business.js" type="client" language="javascript" />
<script src="scripts/client/chatbox.js" type="client" language="javascript" /> <script src="scripts/client/core.js" type="client" language="javascript" />
<script src="scripts/client/chat.js" type="client" language="javascript" />
<script src="scripts/client/cursor.js" type="client" language="javascript" />
<script src="scripts/client/economy.js" type="client" language="javascript" />
<script src="scripts/client/event.js" type="client" language="javascript" /> <script src="scripts/client/event.js" type="client" language="javascript" />
<script src="scripts/client/gui.js" type="client" language="javascript" />
<script src="scripts/client/gps.js" type="client" language="javascript" /> <script src="scripts/client/gps.js" type="client" language="javascript" />
<script src="scripts/client/house.js" type="client" language="javascript" /> <script src="scripts/client/house.js" type="client" language="javascript" />
<script src="scripts/client/item.js" type="client" language="javascript" /> <script src="scripts/client/item.js" type="client" language="javascript" />
<script src="scripts/client/job.js" type="client" language="javascript" /> <script src="scripts/client/job.js" type="client" language="javascript" />
<script src="scripts/client/keybind.js" type="client" language="javascript" /> <script src="scripts/client/keybind.js" type="client" language="javascript" />
<script src="scripts/client/label.js" type="client" language="javascript" />
<script src="scripts/client/locale.js" type="client" language="javascript" /> <script src="scripts/client/locale.js" type="client" language="javascript" />
<script src="scripts/client/main.js" type="client" language="javascript" /> <script src="scripts/client/logo.js" type="client" language="javascript" />
<script src="scripts/client/messaging.js" type="client" language="javascript" /> <script src="scripts/client/messaging.js" type="client" language="javascript" />
<script src="scripts/client/mousecam.js" type="client" language="javascript" />
<script src="scripts/client/nametag.js" type="client" language="javascript" />
<script src="scripts/client/npc.js" type="client" language="javascript" /> <script src="scripts/client/npc.js" type="client" language="javascript" />
<script src="scripts/client/radio.js" type="client" language="javascript" /> <script src="scripts/client/radio.js" type="client" language="javascript" />
<script src="scripts/client/netevents.js" type="client" language="javascript" /> <script src="scripts/client/scoreboard.js" type="client" language="javascript" />
<script src="scripts/client/skin-select.js" type="client" language="javascript" /> <script src="scripts/client/skin-select.js" type="client" language="javascript" />
<script src="scripts/client/sync.js" type="client" language="javascript" /> <script src="scripts/client/sync.js" type="client" language="javascript" />
<script src="scripts/client/utilities.js" type="client" language="javascript" /> <script src="scripts/client/utilities.js" type="client" language="javascript" />
<script src="scripts/client/vehicle.js" type="client" language="javascript" /> <script src="scripts/client/vehicle.js" type="client" language="javascript" />
<script src="scripts/client/netevents.js" type="client" language="javascript" />
<!-- Locale Files -->
<file type="client" src="config/client/locale.json" />
<file type="client" src="locale/english.json" />
<file type="client" src="locale/russian.json" />
<file type="client" src="locale/polish.json" />
<file type="client" src="locale/spanish.json" />
<file type="client" src="locale/french.json" />
<file type="client" src="locale/japanese.json" />
<file type="client" src="locale/german.json" />
<file type="client" src="locale/slovak.json" />
<file type="client" src="locale/finnish.json" />
<file type="client" src="locale/chinese.json" />
<file type="client" src="locale/arabic.json" />
<!-- International Flag Images -->
<file type="client" src="files/images/flags/uk.png" />
<file type="client" src="files/images/flags/de.png" />
<file type="client" src="files/images/flags/fr.png" />
<file type="client" src="files/images/flags/pl.png" />
<file type="client" src="files/images/flags/es.png" />
<file type="client" src="files/images/flags/jp.png" />
<file type="client" src="files/images/flags/sk.png" />
<file type="client" src="files/images/flags/sa.png" />
<file type="client" src="files/images/flags/cn.png" />
<file type="client" src="files/images/flags/fi.png" />
<file type="client" src="files/images/flags/ru.png" />
<!-- MexUI -->
<file type="client" src="third-party/mexui/Images/down-arrow.png" />
<script language="javascript" type="client" src="third-party/mexui/mexui.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Native.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Utility.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Entity/Transition.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Entity/StyleableEntity.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Entity/Component.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Component/Control.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Component/Entry.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Component/Event.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Component/Window.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Entity/ControlAxis.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Entity/ControlWithEntries.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Entry/DropDownItem.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Entry/GridColumn.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Entry/GridRow.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Entry/ListRow.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Entry/Tab.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Entry/TreeRow.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/Button.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/CheckBox.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/DropDown.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/Grid.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/Image.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/Line.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/List.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/ProgressBar.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/RadioButton.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/Rectangle.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/ScrollBar.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/Slider.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/TabPanel.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/Text.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/TextInput.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/Tree.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/Character.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/Characters.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/Day.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/Date.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/Digit.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/Digits.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/Hour.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/Integer.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/Letter.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/LetterDigit.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/Letters.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/LettersDigits.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/Minute.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/Month.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/Number.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/Password.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/PositiveInteger.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/PositiveNumber.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/RangedInteger.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/RangedNumber.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/Second.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/TextArea.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/Time.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/Week.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/WeekDay.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Control/Year.js" />
<script language="javascript" type="client" src="third-party/mexui/Core/Init.js" />
<!-- Startup --> <!-- Startup -->
<script src="scripts/server/startup.js" type="server" language="javascript" /> <script src="scripts/server/startup.js" type="server" language="javascript" />

View File

@@ -1,6 +1,7 @@
// =========================================================================== // ===========================================================================
// Vortrex's Roleplay Resource // Asshat Gaming Roleplay
// https://github.com/VortrexFTW/gtac_roleplay // https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// =========================================================================== // ===========================================================================
// FILE: afk.js // FILE: afk.js
// DESC: Provides AFK detection // DESC: Provides AFK detection
@@ -9,8 +10,8 @@
// Init AFK script // Init AFK script
function initAFKScript() { function initAFKScript() {
logToConsole(LOG_DEBUG, "[VRR.AFK]: Initializing AFK script ..."); logToConsole(LOG_DEBUG, "[AGRP.AFK]: Initializing AFK script ...");
logToConsole(LOG_DEBUG, "[VRR.AFK]: AFK script initialized!"); logToConsole(LOG_DEBUG, "[AGRP.AFK]: AFK script initialized!");
} }
// =========================================================================== // ===========================================================================

View File

@@ -1,54 +1,62 @@
// =========================================================================== // ===========================================================================
// Vortrex's Roleplay Resource // Asshat Gaming Roleplay
// https://github.com/VortrexFTW/gtac_roleplay // https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// =========================================================================== // ===========================================================================
// FILE: animation.js // FILE: animation.js
// DESC: Provides animation functions and usage // DESC: Provides animation functions and usage
// TYPE: Client (JavaScript) // TYPE: Client (JavaScript)
// =========================================================================== // ===========================================================================
function initAnimationScript() {
logToConsole(LOG_DEBUG, "[AGRP.Animation]: Initializing animation script ...");
logToConsole(LOG_DEBUG, "[AGRP.Animation]: Animation script initialized!");
}
// ===========================================================================
function makePedPlayAnimation(pedId, animationSlot, positionOffset) { function makePedPlayAnimation(pedId, animationSlot, positionOffset) {
let ped = getElementFromId(pedId); let ped = getElementFromId(pedId);
if(ped == null) { if (ped == null) {
return false; return false;
} }
let animationData = getAnimationData(animationSlot); let animationData = getAnimationData(animationSlot);
logToConsole(LOG_DEBUG, `[VRR.Animation] Playing animation ${animationData[0]} for ped ${pedId}`); logToConsole(LOG_DEBUG, `[AGRP.Animation] Playing animation ${animationData[0]} for ped ${pedId}`);
let freezePlayer = false; let freezePlayer = false;
switch(animationData.moveType) { switch (animationData.moveType) {
case VRR_ANIMMOVE_FORWARD: { case AGRP_ANIMMOVE_FORWARD: {
setElementCollisionsEnabled(ped, false); setElementCollisionsEnabled(ped, false);
if(ped.isSyncer) { if (ped.isSyncer) {
setElementPosition(ped, getPosInFrontOfPos(getElementPosition(pedId), fixAngle(getElementHeading(pedId)), positionOffset)); setElementPosition(ped, getPosInFrontOfPos(getElementPosition(pedId), fixAngle(getElementHeading(pedId)), positionOffset));
} }
freezePlayer = true; freezePlayer = true;
break; break;
} }
case VRR_ANIMMOVE_BACK: { case AGRP_ANIMMOVE_BACK: {
setElementCollisionsEnabled(pedId, false); setElementCollisionsEnabled(pedId, false);
if(ped.isSyncer) { if (ped.isSyncer) {
setElementPosition(pedId, getPosBehindPos(getElementPosition(pedId), fixAngle(getElementHeading(pedId)), positionOffset)); setElementPosition(pedId, getPosBehindPos(getElementPosition(pedId), fixAngle(getElementHeading(pedId)), positionOffset));
} }
freezePlayer = true; freezePlayer = true;
break; break;
} }
case VRR_ANIMMOVE_LEFT: { case AGRP_ANIMMOVE_LEFT: {
setElementCollisionsEnabled(pedId, false); setElementCollisionsEnabled(pedId, false);
if(ped.isSyncer) { if (ped.isSyncer) {
setElementPosition(pedId, getPosToLeftOfPos(getElementPosition(pedId), fixAngle(getElementHeading(pedId)), positionOffset)); setElementPosition(pedId, getPosToLeftOfPos(getElementPosition(pedId), fixAngle(getElementHeading(pedId)), positionOffset));
} }
freezePlayer = true; freezePlayer = true;
break; break;
} }
case VRR_ANIMMOVE_RIGHT: { case AGRP_ANIMMOVE_RIGHT: {
setElementCollisionsEnabled(pedId, false); setElementCollisionsEnabled(pedId, false);
if(ped.isSyncer) { if (ped.isSyncer) {
setElementPosition(pedId, getPosToRightOfPos(getElementPosition(pedId), fixAngle(getElementHeading(pedId)), positionOffset)); setElementPosition(pedId, getPosToRightOfPos(getElementPosition(pedId), fixAngle(getElementHeading(pedId)), positionOffset));
} }
freezePlayer = true; freezePlayer = true;
@@ -60,21 +68,21 @@ function makePedPlayAnimation(pedId, animationSlot, positionOffset) {
} }
} }
if(getGame() < VRR_GAME_GTA_IV) { if (getGame() < AGRP_GAME_GTA_IV) {
if(animationData.animType == VRR_ANIMTYPE_NORMAL || animationData.animType == VRR_ANIMTYPE_SURRENDER) { if (animationData.animType == AGRP_ANIMTYPE_NORMAL || animationData.animType == AGRP_ANIMTYPE_SURRENDER) {
if(getGame() == VRR_GAME_GTA_VC || getGame() == VRR_GAME_GTA_SA) { if (getGame() == AGRP_GAME_GTA_VC || getGame() == AGRP_GAME_GTA_SA) {
ped.clearAnimations(); ped.clearAnimations();
} else { } else {
ped.clearObjective(); ped.clearObjective();
} }
ped.addAnimation(animationData.groupId, animationData.animId); ped.addAnimation(animationData.groupId, animationData.animId);
if(ped == localPlayer && freezePlayer == true) { if (ped == localPlayer && freezePlayer == true) {
inAnimation = true; inAnimation = true;
setLocalPlayerControlState(false, false); setLocalPlayerControlState(false, false);
localPlayer.collisionsEnabled = false; localPlayer.collisionsEnabled = false;
} }
} else if(animationData.animType == VRR_ANIMTYPE_BLEND) { } else if (animationData.animType == AGRP_ANIMTYPE_BLEND) {
ped.position = ped.position; ped.position = ped.position;
ped.blendAnimation(animationData.groupId, animationData.animId, animationData.animSpeed); ped.blendAnimation(animationData.groupId, animationData.animId, animationData.animSpeed);
} }
@@ -89,17 +97,17 @@ function makePedPlayAnimation(pedId, animationSlot, positionOffset) {
function forcePedAnimation(pedId, animSlot) { function forcePedAnimation(pedId, animSlot) {
let ped = getElementFromId(pedId); let ped = getElementFromId(pedId);
if(ped == null) { if (ped == null) {
return false; return false;
} }
let animationData = getAnimationData(animSlot); let animationData = getAnimationData(animSlot);
if(getGame() < VRR_GAME_GTA_IV) { if (getGame() < AGRP_GAME_GTA_IV) {
ped.position = ped.position; ped.position = ped.position;
ped.addAnimation(animationData.groupId, animationData.animId); ped.addAnimation(animationData.groupId, animationData.animId);
if(ped == localPlayer) { if (ped == localPlayer) {
inAnimation = true; inAnimation = true;
setLocalPlayerControlState(false, false); setLocalPlayerControlState(false, false);
localPlayer.collisionsEnabled = false; localPlayer.collisionsEnabled = false;
@@ -115,34 +123,24 @@ function forcePedAnimation(pedId, animSlot) {
function makePedStopAnimation(pedId) { function makePedStopAnimation(pedId) {
let ped = getElementFromId(pedId); let ped = getElementFromId(pedId);
if(ped == null) { if (ped == null) {
return false; return false;
} }
if(getGame() != VRR_GAME_GTA_IV) { if (getGame() != AGRP_GAME_GTA_IV) {
if(getGame() == VRR_GAME_GTA_VC || getGame() == VRR_GAME_GTA_SA) { if (getGame() == AGRP_GAME_GTA_VC || getGame() == AGRP_GAME_GTA_SA) {
ped.clearAnimations(); ped.clearAnimations();
} else { } else {
ped.clearObjective(); ped.clearObjective();
} }
} }
if(ped == localPlayer) { if (ped == localPlayer) {
if(getGame() != VRR_GAME_GTA_IV) { if (getGame() != AGRP_GAME_GTA_IV) {
localPlayer.collisionsEnabled = true; localPlayer.collisionsEnabled = true;
} }
setLocalPlayerControlState(true, false); setLocalPlayerControlState(true, false);
} }
} }
// ===========================================================================
/**
* @param {number} animationSlot - The slot index of the animation
* @return {AnimationData} The animation's data (array)
*/
function getAnimationData(animationSlot, gameId = getGame()) {
return getGameConfig().animations[gameId][animationSlot];
}
// =========================================================================== // ===========================================================================

View File

@@ -1,6 +1,7 @@
// =========================================================================== // ===========================================================================
// Vortrex's Roleplay Resource // Asshat Gaming Roleplay
// https://github.com/VortrexFTW/gtac_roleplay // https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// =========================================================================== // ===========================================================================
// FILE: business.js // FILE: business.js
// DESC: Provides business functions and usage // DESC: Provides business functions and usage
@@ -16,32 +17,57 @@ class BusinessData {
this.blipModel = blipModel; this.blipModel = blipModel;
this.pickupModel = pickupModel; this.pickupModel = pickupModel;
this.hasInterior = hasInterior; this.hasInterior = hasInterior;
this.rentPrice = 0;
this.buyPrice = 0;
this.hasItems = hasItems; this.hasItems = hasItems;
this.blipId = -1; this.blipId = -1;
this.labelInfoType = 0; this.labelInfoType = 0;
this.locked = false;
this.entranceFee = 0;
} }
} }
// =========================================================================== // ===========================================================================
function receiveBusinessFromServer(businessId, name, entrancePosition, blipModel, pickupModel, hasInterior, hasItems) { function initBusinessScript() {
logToConsole(LOG_DEBUG, `[VRR.Business] Received business ${businessId} (${name}) from server`); logToConsole(LOG_DEBUG, "[AGRP.Business]: Initializing business script ...");
logToConsole(LOG_INFO, "[AGRP.Business]: Business script initialized!");
}
if(!areServerElementsSupported()) { // ===========================================================================
if(getBusinessData(businessId) != false) {
function receiveBusinessFromServer(businessId, name, entrancePosition, blipModel, pickupModel, buyPrice, rentPrice, hasInterior, locked, hasItems, entranceFee) {
logToConsole(LOG_DEBUG, `[AGRP.Business] Received business ${businessId} (${name}) from server`);
if (!areServerElementsSupported() || getGame() == AGRP_GAME_MAFIA_ONE || getGame() == AGRP_GAME_GTA_IV) {
if (getBusinessData(businessId) != false) {
let businessData = getBusinessData(businessId); let businessData = getBusinessData(businessId);
businessData.name = name; businessData.name = name;
businessData.entrancePosition = entrancePosition; businessData.entrancePosition = entrancePosition;
businessData.blipModel = blipModel; businessData.blipModel = blipModel;
businessData.pickupModel = pickupModel; businessData.pickupModel = pickupModel;
businessData.hasInterior = hasInterior; businessData.hasInterior = hasInterior;
businessData.buyPrice = buyPrice;
businessData.rentPrice = rentPrice;
businessData.hasItems = hasItems; businessData.hasItems = hasItems;
businessData.locked = locked;
businessData.entranceFee = entranceFee;
logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId} already exists. Checking blip ...`); if (hasInterior && !hasItems) {
if(blipModel == -1) { businessData.labelInfoType = AGRP_PROPLABEL_INFO_ENTER;
if(businessData.blipId != -1) { } else if (!hasInterior && hasItems) {
logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId}'s blip has been removed by the server`); businessData.labelInfoType = AGRP_PROPLABEL_INFO_BUY;
if(getGame() == VRR_GAME_GTA_IV) { } else {
if (businessData.buyPrice > 0) {
businessData.labelInfoType = AGRP_PROPLABEL_INFO_BUYBIZ;
}
}
logToConsole(LOG_DEBUG, `[AGRP.Business] Business ${businessId} already exists. Checking blip ...`);
if (blipModel == -1) {
if (businessData.blipId != -1) {
logToConsole(LOG_DEBUG, `[AGRP.Business] Business ${businessId}'s blip has been removed by the server`);
if (getGame() == AGRP_GAME_GTA_IV) {
natives.removeBlipAndClearIndex(getBusinessData(businessId).blipId); natives.removeBlipAndClearIndex(getBusinessData(businessId).blipId);
} else { } else {
destroyElement(getElementFromId(blipId)); destroyElement(getElementFromId(blipId));
@@ -50,37 +76,37 @@ function receiveBusinessFromServer(businessId, name, entrancePosition, blipModel
//businesses.splice(businessData.index, 1); //businesses.splice(businessData.index, 1);
//setAllBusinessDataIndexes(); //setAllBusinessDataIndexes();
} else { } else {
logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId}'s blip is unchanged`); logToConsole(LOG_DEBUG, `[AGRP.Business] Business ${businessId}'s blip is unchanged`);
} }
} else { } else {
if(businessData.blipId != -1) { if (businessData.blipId != -1) {
logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId}'s blip has been changed by the server`); logToConsole(LOG_DEBUG, `[AGRP.Business] Business ${businessId}'s blip has been changed by the server`);
if(getGame() == VRR_GAME_GTA_IV) { if (getGame() == AGRP_GAME_GTA_IV) {
natives.setBlipCoordinates(businessData.blipId, businessData.entrancePosition); natives.setBlipCoordinates(businessData.blipId, businessData.entrancePosition);
natives.changeBlipSprite(businessData.blipId, businessData.blipModel); natives.changeBlipSprite(businessData.blipId, businessData.blipModel);
natives.setBlipMarkerLongDistance(businessData.blipId, false); natives.setBlipMarkerLongDistance(businessData.blipId, false);
natives.setBlipAsShortRange(tempBusinessData.blipId, true); natives.setBlipAsShortRange(tempBusinessData.blipId, true);
natives.changeBlipNameFromAscii(businessData.blipId, `${businessData.name.substr(0, 24)}${(businessData.name.length > 24) ? " ...": ""}`); natives.changeBlipNameFromAscii(businessData.blipId, `${businessData.name.substr(0, 24)}${(businessData.name.length > 24) ? " ..." : ""}`);
} }
} else { } else {
let blipId = createGameBlip(tempBusinessData.blipModel, tempBusinessData.entrancePosition, tempBusinessData.name); let blipId = createGameBlip(tempBusinessData.blipModel, tempBusinessData.entrancePosition, tempBusinessData.name);
if(blipId != -1) { if (blipId != -1) {
tempBusinessData.blipId = blipId; tempBusinessData.blipId = blipId;
} }
logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId}'s blip has been added by the server (Model ${blipModel}, ID ${blipId})`); logToConsole(LOG_DEBUG, `[AGRP.Business] Business ${businessId}'s blip has been added by the server (Model ${blipModel}, ID ${blipId})`);
} }
} }
} else { } else {
logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId} doesn't exist. Adding ...`); logToConsole(LOG_DEBUG, `[AGRP.Business] Business ${businessId} doesn't exist. Adding ...`);
let tempBusinessData = new BusinessData(businessId, name, entrancePosition, blipModel, pickupModel, hasInterior, hasItems); let tempBusinessData = new BusinessData(businessId, name, entrancePosition, blipModel, pickupModel, hasInterior, hasItems);
if(blipModel != -1) { if (blipModel != -1) {
let blipId = createGameBlip(tempBusinessData.blipModel, tempBusinessData.entrancePosition, tempBusinessData.name); let blipId = createGameBlip(tempBusinessData.blipModel, tempBusinessData.entrancePosition, tempBusinessData.name);
if(blipId != -1) { if (blipId != -1) {
tempBusinessData.blipId = blipId; tempBusinessData.blipId = blipId;
} }
logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId}'s blip has been added by the server (Model ${blipModel}, ID ${blipId})`); logToConsole(LOG_DEBUG, `[AGRP.Business] Business ${businessId}'s blip has been added by the server (Model ${blipModel}, ID ${blipId})`);
} else { } else {
logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId} has no blip.`); logToConsole(LOG_DEBUG, `[AGRP.Business] Business ${businessId} has no blip.`);
} }
getServerData().businesses.push(tempBusinessData); getServerData().businesses.push(tempBusinessData);
setAllBusinessDataIndexes(); setAllBusinessDataIndexes();
@@ -100,8 +126,8 @@ function getBusinessData(businessId) {
let businesses = getServerData().businesses; let businesses = getServerData().businesses;
for(let i in businesses) { for (let i in businesses) {
if(businesses[i].businessId == businessId) { if (businesses[i].businessId == businessId) {
return businesses[i]; return businesses[i];
} }
} }
@@ -112,7 +138,7 @@ function getBusinessData(businessId) {
// =========================================================================== // ===========================================================================
function setAllBusinessDataIndexes() { function setAllBusinessDataIndexes() {
for(let i in getServerData().businesses) { for (let i in getServerData().businesses) {
getServerData().businesses[i].index = i; getServerData().businesses[i].index = i;
} }
} }

39
scripts/client/camera.js Normal file
View File

@@ -0,0 +1,39 @@
// ===========================================================================
// Asshat Gaming Roleplay
// https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// ===========================================================================
// FILE: camera.js
// DESC: Provides camera functions and usage
// TYPE: Client (JavaScript)
// ===========================================================================
let cameraFadeEnabled = false;
let cameraFadeIn = false;
let cameraFadeStart = 0;
let cameraFadeDuration = 0;
let cameraFadeColour = 0;
// ===========================================================================
function processCameraFadeRendering() {
if (cameraFadeEnabled) {
let finishTime = cameraFadeStart + cameraFadeDuration;
if (sdl.ticks >= finishTime) {
cameraFadeEnabled = false;
cameraFadeDuration = 0;
cameraFadeStart = 0;
} else {
let currentTick = sdl.ticks - cameraFadeStart;
let progressPercent = Math.ceil(currentTick * 100 / cameraFadeDuration);
let rgbaArray = rgbaArrayFromToColour(cameraFadeColour);
let alpha = (cameraFadeIn) ? Math.ceil(255 / progressPercent) : Math.ceil(progressPercent / 255);
cameraFadeColour = toColour(rgbaArray[0], rgbaArray[1], rgbaArray[2], alpha);
graphics.drawRectangle(null, toVector2(0, 0), toVector2(game.width, game.height), cameraFadeColour, cameraFadeColour, cameraFadeColour, cameraFadeColour);
}
}
}
// ===========================================================================

232
scripts/client/chat.js Normal file
View File

@@ -0,0 +1,232 @@
// ===========================================================================
// Asshat Gaming Roleplay
// https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// ===========================================================================
// FILE: chatbox.js
// DESC: Provides extra chatbox features
// TYPE: Client (JavaScript)
// ===========================================================================
// ===========================================================================
let chatTimeStampsEnabled = false;
let chatEmojiEnabled = false;
let chatBoxHistory = [];
let bottomMessageIndex = 0;
let maxChatBoxHistory = 500;
let scrollAmount = 1;
let maxChatBoxLines = 6;
let chatAutoHideDelay = 0;
let chatLastUse = 0;
let scrollUpKey = false;
let scrollDownKey = false;
// ===========================================================================
function initChatBoxScript() {
logToConsole(LOG_DEBUG, "[AGRP.Chat]: Initializing chat script ...");
scrollUpKey = getKeyIdFromParams("pageup");
scrollDownKey = getKeyIdFromParams("pagedown");
bindChatBoxKeys();
logToConsole(LOG_INFO, "[AGRP.Chat]: Chat script initialized!");
}
// ===========================================================================
function bindChatBoxKeys() {
bindKey(toInteger(scrollUpKey), KEYSTATE_DOWN, chatBoxScrollUp);
bindKey(toInteger(scrollDownKey), KEYSTATE_DOWN, chatBoxScrollDown);
}
// ===========================================================================
function unBindChatBoxKeys() {
unbindKey(toInteger(scrollUpKey));
unbindKey(toInteger(scrollDownKey));
}
// ===========================================================================
function receiveChatBoxMessageFromServer(messageString, colour, hour, minute, second) {
logToConsole(LOG_DEBUG, `[AGRP.Chat]: Received chatbox message from server: ${messageString}`);
// Just in case it's hidden by auto hide
//setChatWindowEnabled(true);
//let timeStamp = findResourceByName("agrp_time").exports.getCurrentUnixTimeStampSquirrel();
hour = fillLeadingZeros(hour, 2);
minute = fillLeadingZeros(minute, 2);
second = fillLeadingZeros(second, 2);
addToChatBoxHistory(messageString, colour, hour, minute, second);
//let unixTimeStampMS = new Date().getTime();
//let timeStampDate = new Date(unixTimeStampMS);
//let timeStampDate = new Date(timeStamp);
//let timeStampText = `${timeStampDate.getHours()}:${timeStampDate.getMinutes()}:${timeStampDate.getSeconds()}`;
let outputString = messageString;
if (chatTimeStampsEnabled == true) {
let colourRGBA = rgbaArrayFromToColour(colour);
let timeStampString = `{TIMESTAMPCOLOUR}[${hour}:${minute}:${second}][${rgbToHex(colourRGBA[0], colourRGBA[1], colourRGBA[2])}] `;
outputString = `${timeStampString}${messageString}`;
}
logToConsole(LOG_DEBUG, `[AGRP.Chat]: Changed colours in string: ${outputString}`);
outputString = replaceColoursInMessage(`${outputString}`);
if (chatEmojiEnabled == true) {
logToConsole(LOG_DEBUG, `[AGRP.Chat]: Enabled emoji in string: ${outputString}`);
outputString = replaceEmojiInMessage(outputString);
}
if (profanityFilterEnabled == true) {
logToConsole(LOG_DEBUG, `[AGRP.Chat]: Removed profanity in string: ${outputString}`);
outputString = replaceProfanityInMessage(outputString);
}
message(outputString, colour);
bottomMessageIndex = chatBoxHistory.length - 1;
chatLastUse = getCurrentUnixTimestamp();
}
// ===========================================================================
function setChatScrollLines(amount) {
scrollAmount = amount;
}
// ===========================================================================
function setChatTimeStampsState(state) {
chatTimeStampsEnabled = state;
updateChatBox();
}
// ===========================================================================
function setChatEmojiState(state) {
chatEmojiEnabled = state;
updateChatBox();
}
// ===========================================================================
function setChatAutoHideDelay(delay) {
chatAutoHideDelay = delay * 1000;
}
// ===========================================================================
function addToChatBoxHistory(messageString, colour, hour, minute, second) {
chatBoxHistory.push([messageString, colour, hour, minute, second]);
}
// ===========================================================================
function chatBoxScrollUp() {
if (bottomMessageIndex > maxChatBoxLines) {
bottomMessageIndex = bottomMessageIndex - scrollAmount;
updateChatBox();
}
}
// ===========================================================================
function chatBoxScrollDown() {
if (bottomMessageIndex < chatBoxHistory.length - 1) {
bottomMessageIndex = bottomMessageIndex + scrollAmount;
updateChatBox();
}
}
// ===========================================================================
function clearChatBox() {
for (let i = 0; i <= maxChatBoxLines; i++) {
message("", COLOUR_WHITE);
}
}
// ===========================================================================
function updateChatBox() {
clearChatBox();
for (let i = bottomMessageIndex - maxChatBoxLines; i <= bottomMessageIndex; i++) {
if (typeof chatBoxHistory[i] != "undefined") {
let outputString = chatBoxHistory[i][0];
if (chatTimeStampsEnabled == true) {
let timeStampText = `${chatBoxHistory[i][2]}:${chatBoxHistory[i][3]}:${chatBoxHistory[i][4]}`;
let colourRGBA = rgbaArrayFromToColour(chatBoxHistory[i][1]);
outputString = `{TIMESTAMPCOLOUR}[${timeStampText}][${rgbToHex(colourRGBA[0], colourRGBA[1], colourRGBA[2])}] ${chatBoxHistory[i][0]}`;
}
outputString = replaceColoursInMessage(outputString);
if (chatEmojiEnabled == true) {
outputString = replaceEmojiInMessage(outputString);
}
if (profanityFilterEnabled == true) {
outputString = replaceProfanityInMessage(outputString);
}
message(outputString, chatBoxHistory[i][1]);
} else {
message("", COLOUR_WHITE);
}
}
chatLastUse = getCurrentUnixTimestamp();
}
// ===========================================================================
function processMouseWheelForChatBox(mouseId, deltaCoordinates, flipped) {
// There isn't a way to detect whether chat input is active, but mouse cursor is forced shown when typing so ¯\_(ツ)_/¯
if (!gui.cursorEnabled) {
return false;
}
if (!flipped) {
if (deltaCoordinates.y > 0) {
chatBoxScrollUp();
} else {
chatBoxScrollDown();
}
} else {
if (deltaCoordinates.y > 0) {
chatBoxScrollDown();
} else {
chatBoxScrollUp();
}
}
}
// ===========================================================================
function checkChatAutoHide() {
return false;
// Make sure chat input isn't active
if (gui.cursorEnabled) {
return false;
}
// Don't process auto-hide if it's disabled
if (chatAutoHideDelay == 0) {
return false;
}
if (getCurrentUnixTimestamp() - chatLastUse >= chatAutoHideDelay) {
setChatWindowEnabled(false);
}
}
// ===========================================================================

View File

@@ -1,171 +0,0 @@
// ===========================================================================
// Vortrex's Roleplay Resource
// https://github.com/VortrexFTW/gtac_roleplay
// ===========================================================================
// FILE: chatbox.js
// DESC: Provides extra chatbox features
// TYPE: Client (JavaScript)
// ===========================================================================
// ===========================================================================
let chatBoxHistory = [];
let bottomMessageIndex = 0;
let maxChatBoxHistory = 500;
let scrollAmount = 1;
let maxChatBoxLines = 6;
let chatAutoHideDelay = 0;
let chatLastUse = 0;
let scrollUpKey = false;
let scrollDownKey = false;
// ===========================================================================
function initChatBoxScript() {
logToConsole(LOG_DEBUG, "[VRR.ChatBox]: Initializing chatbox script ...");
scrollUpKey = getKeyIdFromParams("pageup");
scrollDownKey = getKeyIdFromParams("pagedown");
bindChatBoxKeys();
logToConsole(LOG_DEBUG, "[VRR.ChatBox]: Chatbox script initialized!");
}
// ===========================================================================
function bindChatBoxKeys() {
bindKey(toInteger(scrollUpKey), KEYSTATE_DOWN, chatBoxScrollUp);
bindKey(toInteger(scrollDownKey), KEYSTATE_DOWN, chatBoxScrollDown);
}
// ===========================================================================
function unBindChatBoxKeys() {
unbindKey(toInteger(scrollUpKey));
unbindKey(toInteger(scrollDownKey));
}
// ===========================================================================
function receiveChatBoxMessageFromServer(messageString, colour) {
logToConsole(LOG_DEBUG, `[VRR.ChatBox]: Received chatbox message from server: ${messageString}`);
// Just in case it's hidden by auto hide
//setChatWindowEnabled(true);
let colouredString = replaceColoursInMessage(messageString);
logToConsole(LOG_DEBUG, `[VRR.ChatBox]: Changed colours in string: ${colouredString}`);
addToChatBoxHistory(colouredString, colour);
//if(bottomMessageIndex >= chatBoxHistory.length-1) {
message(colouredString, colour);
bottomMessageIndex = chatBoxHistory.length-1;
//}
chatLastUse = getCurrentUnixTimestamp();
}
// ===========================================================================
function setChatScrollLines(amount) {
scrollAmount = amount;
}
// ===========================================================================
function setChatAutoHideDelay(delay) {
chatAutoHideDelay = delay*1000;
}
// ===========================================================================
function addToChatBoxHistory(messageString, colour) {
chatBoxHistory.push([messageString, colour]);
}
// ===========================================================================
function chatBoxScrollUp() {
if(bottomMessageIndex > maxChatBoxLines) {
bottomMessageIndex = bottomMessageIndex-scrollAmount;
updateChatBox();
}
}
// ===========================================================================
function chatBoxScrollDown() {
if(bottomMessageIndex < chatBoxHistory.length-1) {
bottomMessageIndex = bottomMessageIndex+scrollAmount;
updateChatBox();
}
}
// ===========================================================================
function clearChatBox() {
for(let i = 0 ; i <= maxChatBoxLines ; i++) {
message("", COLOUR_WHITE);
}
}
// ===========================================================================
function updateChatBox() {
clearChatBox();
for(let i = bottomMessageIndex-maxChatBoxLines ; i <= bottomMessageIndex ; i++) {
if(typeof chatBoxHistory[i] != "undefined") {
message(chatBoxHistory[i][0], chatBoxHistory[i][1]);
} else {
message("", COLOUR_WHITE);
}
}
chatLastUse = getCurrentUnixTimestamp();
}
// ===========================================================================
function processMouseWheelForChatBox(mouseId, deltaCoordinates, flipped) {
// There isn't a way to detect whether chat input is active, but mouse cursor is forced shown when typing so ¯\_(ツ)_/¯
if(!gui.cursorEnabled) {
return false;
}
if(!flipped) {
if(deltaCoordinates.y > 0) {
chatBoxScrollUp();
} else {
chatBoxScrollDown();
}
} else {
if(deltaCoordinates.y > 0) {
chatBoxScrollDown();
} else {
chatBoxScrollUp();
}
}
}
// ===========================================================================
function checkChatAutoHide() {
return false;
// Make sure chat input isn't active
if(gui.cursorEnabled) {
return false;
}
// Don't process auto-hide if it's disabled
if(chatAutoHideDelay == 0) {
return false;
}
if(getCurrentUnixTimestamp()-chatLastUse >= chatAutoHideDelay) {
setChatWindowEnabled(false);
}
}
// ===========================================================================

View File

@@ -1,6 +1,7 @@
// =========================================================================== // ===========================================================================
// Vortrex's Roleplay Resource // Asshat Gaming Roleplay
// https://github.com/VortrexFTW/gtac_roleplay // https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// =========================================================================== // ===========================================================================
// FILE: content.js // FILE: content.js
// DESC: Provides connection to extra content resources // DESC: Provides connection to extra content resources
@@ -9,10 +10,10 @@
function getCustomImage(imageName) { function getCustomImage(imageName) {
let contentResource = findResourceByName(getGameConfig().extraContentResource[getGame()]); let contentResource = findResourceByName(getGameConfig().extraContentResource[getGame()]);
if(contentResource != null) { if (contentResource != null) {
if(contentResource.isStarted) { if (contentResource.isStarted) {
let image = contentResource.exports.getCustomImage(imageName); let image = contentResource.exports.getCustomImage(imageName);
if(image != null) { if (image != null) {
return image; return image;
} }
} }
@@ -24,10 +25,10 @@ function getCustomImage(imageName) {
function getCustomFont(fontName) { function getCustomFont(fontName) {
let contentResource = findResourceByName(getGameConfig().extraContentResource[getGame()]); let contentResource = findResourceByName(getGameConfig().extraContentResource[getGame()]);
if(contentResource != null) { if (contentResource != null) {
if(contentResource.isStarted) { if (contentResource.isStarted) {
let font = contentResource.exports.getCustomFont(fontName); let font = contentResource.exports.getCustomFont(fontName);
if(font != null) { if (font != null) {
return font; return font;
} }
} }
@@ -39,10 +40,10 @@ function getCustomFont(fontName) {
function getCustomAudio(audioName) { function getCustomAudio(audioName) {
let contentResource = findResourceByName(getGameConfig().extraContentResource[getGame()]); let contentResource = findResourceByName(getGameConfig().extraContentResource[getGame()]);
if(contentResource != null) { if (contentResource != null) {
if(contentResource.isStarted) { if (contentResource.isStarted) {
let audioFile = contentResource.exports.getCustomAudio(audioName); let audioFile = contentResource.exports.getCustomAudio(audioName);
if(audioFile != null) { if (audioFile != null) {
return audioFile; return audioFile;
} }
} }
@@ -54,8 +55,8 @@ function getCustomAudio(audioName) {
function playCustomAudio(audioName, volume = 0.5, loop = false) { function playCustomAudio(audioName, volume = 0.5, loop = false) {
let contentResource = findResourceByName(getGameConfig().extraContentResource[getGame()]); let contentResource = findResourceByName(getGameConfig().extraContentResource[getGame()]);
if(contentResource != null) { if (contentResource != null) {
if(contentResource.isStarted) { if (contentResource.isStarted) {
contentResource.exports.playCustomAudio(audioName, volume, loop); contentResource.exports.playCustomAudio(audioName, volume, loop);
} }
} }

View File

@@ -1,6 +1,7 @@
// =========================================================================== // ===========================================================================
// Vortrex's Roleplay Resource // Asshat Gaming Roleplay
// https://github.com/VortrexFTW/gtac_roleplay // https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// =========================================================================== // ===========================================================================
// FILE: main.js // FILE: main.js
// DESC: Main client script (will be reorganized into individual files later) // DESC: Main client script (will be reorganized into individual files later)
@@ -18,8 +19,8 @@ let isSpawned = false;
let garbageCollectorInterval = null; let garbageCollectorInterval = null;
let parkedVehiclePosition = false; //let parkedVehiclePosition = false;
let parkedVehicleHeading = false; //let parkedVehicleHeading = false;
let renderHUD = true; let renderHUD = true;
let renderLabels = true; let renderLabels = true;
@@ -30,7 +31,7 @@ let renderHotBar = true;
let renderItemActionDelay = true; let renderItemActionDelay = true;
let renderInteriorLights = true; let renderInteriorLights = true;
let logLevel = LOG_INFO | LOG_DEBUG | LOG_VERBOSE; let logLevel = LOG_INFO | LOG_DEBUG;
let weaponDamageEnabled = {}; let weaponDamageEnabled = {};
let weaponDamageEvent = {}; let weaponDamageEvent = {};
@@ -48,6 +49,9 @@ let streamingRadio = null;
let streamingRadioVolume = 50; let streamingRadioVolume = 50;
let streamingRadioElement = false; let streamingRadioElement = false;
let enterPropertyKey = null;
let disableGUIKey = getKeyIdFromParams("insert");
let inAnimation = false; let inAnimation = false;
let forcedAnimation = null; let forcedAnimation = null;
@@ -56,19 +60,39 @@ let calledDeathEvent = false;
let interiorLightsEnabled = true; let interiorLightsEnabled = true;
let interiorLightsColour = toColour(0, 0, 0, 150); let interiorLightsColour = toColour(0, 0, 0, 150);
let mouseCameraEnabled = false;
let mouseCursorEnabled = false;
let currentPickup = false; let currentPickup = false;
let vehiclePurchaseState = VRR_VEHBUYSTATE_NONE; let vehiclePurchaseState = AGRP_VEHBUYSTATE_NONE;
let vehiclePurchasing = null; let vehiclePurchasing = null;
let vehiclePurchasePosition = null; let vehiclePurchasePosition = null;
let forceWantedLevel = 0; let forceWantedLevel = 0;
let guiSubmitKey = false;
let guiLeftKey = false;
let guiRightKey = false;
let guiUpKey = false;
let guiDownKey = false;
// Pre-cache all allowed skins // Pre-cache all allowed skins
let allowedSkins = getAllowedSkins(getGame()); let allowedSkins = getAllowedSkins(getGame());
let profanityFilterEnabled = false;
let localLocaleId = 0; let localLocaleId = 0;
/**
* @typedef {Object} ServerData
* @property {Array.<HouseData>} houses
* @property {Array.<BusinessData>} businesses
* @property {Array.<VehicleData>} vehicles
* @property {Array} localeStrings
* @property {Array} localeOptions
* @property {Object} cvars
*/
let serverData = { let serverData = {
houses: [], houses: [],
businesses: [], businesses: [],
@@ -76,6 +100,17 @@ let serverData = {
localeOptions: [], localeOptions: [],
vehicles: [], vehicles: [],
jobs: [], jobs: [],
cvars: {},
}; };
let localPlayerMoney = 0;
let localPlayerMoneyInterval = null;
let currencyString = "${AMOUNT}";
let mapChangeWarning = false;
let cruiseControlEnabled = false;
let cruiseControlSpeed = 0.0;
// =========================================================================== // ===========================================================================

40
scripts/client/cursor.js Normal file
View File

@@ -0,0 +1,40 @@
// ===========================================================================
// Asshat Gaming Roleplay
// https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// ===========================================================================
// FILE: cursor.js
// DESC: Provides cursor functions and usage
// TYPE: Client (JavaScript)
// ===========================================================================
let cursorImage = null;
let cursorImagePath = "files/images/cursor.png";
let cursorSize = toVector2(16.0, 24.0);
// ===========================================================================
function initCursorScript() {
logToConsole(LOG_DEBUG, "[AGRP.Cursor]: Initializing cursor script ...");
let cursorStream = openFile(cursorImagePath);
if (cursorStream != null) {
cursorImage = graphics.loadPNG(cursorStream);
cursorStream.close();
}
logToConsole(LOG_INFO, "[AGRP.Cursor]: Cursor script initialized!");
}
// ===========================================================================
function processMouseCursorRendering() {
if (isGameFeatureSupported("mouseCursor")) {
return false;
}
if (gui.cursorEnabled) {
graphics.drawRectangle(cursorImage, gui.cursorPosition, cursorSize);
}
}
// ===========================================================================

13
scripts/client/economy.js Normal file
View File

@@ -0,0 +1,13 @@
// ===========================================================================
// Asshat Gaming Roleplay
// https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// ===========================================================================
// FILE: economy.js
// DESC: Provides economy functions
// TYPE: Client (JavaScript)
// ===========================================================================
// ===========================================================================

View File

@@ -1,6 +1,7 @@
// =========================================================================== // ===========================================================================
// Vortrex's Roleplay Resource // Asshat Gaming Roleplay
// https://github.com/VortrexFTW/gtac_roleplay // https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// =========================================================================== // ===========================================================================
// FILE: event.js // FILE: event.js
// DESC: Provides handlers for built in GTAC and Asshat-Gaming created events // DESC: Provides handlers for built in GTAC and Asshat-Gaming created events
@@ -8,77 +9,91 @@
// =========================================================================== // ===========================================================================
function initEventScript() { function initEventScript() {
logToConsole(LOG_DEBUG, "[VRR.Event]: Initializing event script ..."); logToConsole(LOG_DEBUG, "[AGRP.Event]: Initializing event script ...");
addCustomEvents();
addAllEventHandlers(); addAllEventHandlers();
logToConsole(LOG_DEBUG, "[VRR.Event]: Event script initialized!"); logToConsole(LOG_DEBUG, "[AGRP.Event]: Event script initialized!");
}
// ===========================================================================
function addCustomEvents() {
addEvent("OnLocalPlayerEnterSphere", 1);
addEvent("OnLocalPlayerExitSphere", 1);
addEvent("OnLocalPlayerEnteredVehicle", 1);
addEvent("OnLocalPlayerExitedVehicle", 1);
addEvent("OnLocalPlayerSwitchWeapon", 2);
} }
// =========================================================================== // ===========================================================================
function addAllEventHandlers() { function addAllEventHandlers() {
bindEventHandler("OnResourceStart", thisResource, onResourceStart); addEventHandler("OnResourceStart", onResourceStart);
bindEventHandler("OnResourceReady", thisResource, onResourceReady); addEventHandler("OnResourceReady", onResourceReady);
bindEventHandler("OnResourceStop", thisResource, onResourceStop); addEventHandler("OnResourceStop", onResourceStop);
addEventHandler("OnProcess", onProcess); addEventHandler("OnProcess", onProcess);
addEventHandler("OnKeyUp", onKeyUp); addEventHandler("OnKeyUp", onKeyUp);
addEventHandler("OnDrawnHUD", onDrawnHUD); addEventHandler("OnDrawnHUD", onDrawnHUD);
addEventHandler("OnPedWasted", onPedWasted); addEventHandler("OnPedWasted", onPedWasted);
addEventHandler("OnElementStreamIn", onElementStreamIn); addEventHandler("OnElementStreamIn", onElementStreamIn);
addEventHandler("OnPedChangeWeapon", onPedChangeWeapon);
addEventHandler("OnLocalPlayerEnteredVehicle", onLocalPlayerEnteredVehicle);
addEventHandler("OnLocalPlayerExitedVehicle", onLocalPlayerExitedVehicle);
addEventHandler("OnLocalPlayerEnterSphere", onLocalPlayerEnterSphere);
addEventHandler("OnLocalPlayerExitSphere", onLocalPlayerExitSphere);
addEventHandler("OnLocalPlayerSwitchWeapon", onLocalPlayerSwitchWeapon);
addEventHandler("OnPedInflictDamage", onPedInflictDamage); addEventHandler("OnPedInflictDamage", onPedInflictDamage);
addEventHandler("OnLostFocus", onLostFocus); addEventHandler("OnLostFocus", onLostFocus);
addEventHandler("OnFocus", onFocus); addEventHandler("OnFocus", onFocus);
addEventHandler("OnCameraProcess", onCameraProcess); addEventHandler("OnCameraProcess", onCameraProcess);
addEventHandler("OnMouseWheel", onMouseWheel); addEventHandler("OnMouseWheel", onMouseWheel);
addEventHandler("OnEntityProcess", onEntityProcess); addEventHandler("OnEntityProcess", onEntityProcess);
if (findResourceByName("v-events") != null) {
if (findResourceByName("v-events").isStarted) {
addEventHandler("OnPedEnteredVehicleEx", onPedEnteredVehicle);
addEventHandler("OnPedExitedVehicleEx", onPedExitedVehicle);
addEventHandler("OnPedEnteredSphereEx", onPedEnteredSphere);
addEventHandler("OnPedExitedSphereEx", onPedExitedSphere);
}
}
if (getGame() == AGRP_GAME_MAFIA_ONE) {
addEventHandler("OnMapLoaded", onMapLoaded);
}
} }
// =========================================================================== // ===========================================================================
function onResourceStart(event, resource) { function onResourceStart(event, resource) {
sendResourceStartedSignalToServer(); if (resource == findResourceByName("v-events")) {
//garbageCollectorInterval = setInterval(collectAllGarbage, 1000*60); // Remove and re-add events, in case v-events was loaded after agrp_main
removeEventHandler("OnPedEnteredVehicleEx");
removeEventHandler("OnPedExitedVehicleEx");
removeEventHandler("OnPedEnteredSphereEx");
removeEventHandler("OnPedExitedSphereEx");
addEventHandler("OnPedEnteredVehicleEx", onPedEnteredVehicle);
addEventHandler("OnPedExitedVehicleEx", onPedExitedVehicle);
addEventHandler("OnPedEnteredSphereEx", onPedEnteredSphere);
addEventHandler("OnPedExitedSphereEx", onPedExitedSphere);
}
if (resource == thisResource) {
logToConsole(LOG_DEBUG | LOG_WARN, `[AGRP.Event] onResourceStart called - Sending signal to server`);
garbageCollectorInterval = setInterval(collectAllGarbage, 1000 * 60);
localPlayerMoneyInterval = setInterval(updateLocalPlayerMoney, 1000 * 5);
sendResourceStartedSignalToServer();
}
} }
// =========================================================================== // ===========================================================================
function onResourceStop(event, resource) { function onResourceStop(event, resource) {
sendResourceStoppedSignalToServer(); if (resource == thisResource) {
logToConsole(LOG_DEBUG | LOG_WARN, `[AGRP.Event] onResourceStop called - Sending signal to server`);
sendResourceStoppedSignalToServer();
}
} }
// =========================================================================== // ===========================================================================
function onResourceReady(event, resource) { function onResourceReady(event, resource) {
sendResourceReadySignalToServer(); if (resource == thisResource) {
logToConsole(LOG_DEBUG | LOG_WARN, `[AGRP.Event] onResourceReady called - Sending signal to server`);
loadLocaleConfig();
sendResourceReadySignalToServer();
}
} }
// =========================================================================== // ===========================================================================
function onProcess(event, deltaTime) { function onProcess(event, deltaTime) {
logToConsole(LOG_VERBOSE, `[AGRP.Event] onProcess`);
if (localPlayer == null) { if (localPlayer == null) {
return false; return false;
} }
@@ -90,18 +105,15 @@ function onProcess(event, deltaTime) {
processSync(); processSync();
processLocalPlayerControlState(); processLocalPlayerControlState();
processLocalPlayerVehicleControlState(); processLocalPlayerVehicleControlState();
processLocalPlayerSphereEntryExitHandling();
processLocalPlayerVehicleEntryExitHandling();
processJobRouteSphere();
forceLocalPlayerEquippedWeaponItem(); forceLocalPlayerEquippedWeaponItem();
processWantedLevelReset(); processWantedLevelReset();
processGameSpecifics(); processGameSpecifics();
processNearbyPickups(); processNearbyPickups();
processVehiclePurchasing(); processVehiclePurchasing();
processVehicleBurning(); processVehicleBurning();
processVehicleCruiseControl();
//checkChatBoxAutoHide(); // Will be uncommented on 1.4.0 GTAC update //checkChatBoxAutoHide(); // Will be uncommented on 1.4.0 GTAC update
//processVehicleFires(); //processVehicleFires();
} }
// =========================================================================== // ===========================================================================
@@ -109,29 +121,38 @@ function onProcess(event, deltaTime) {
function onKeyUp(event, keyCode, scanCode, keyModifiers) { function onKeyUp(event, keyCode, scanCode, keyModifiers) {
processSkinSelectKeyPress(keyCode); processSkinSelectKeyPress(keyCode);
//processKeyDuringAnimation(); //processKeyDuringAnimation();
processGUIKeyPress(keyCode);
processToggleGUIKeyPress(keyCode);
} }
// =========================================================================== // ===========================================================================
function onDrawnHUD(event) { function onDrawnHUD(event) {
logToConsole(LOG_VERBOSE, `[AGRP.Event] HUD drawn`);
processMouseCursorRendering();
if (!renderHUD) { if (!renderHUD) {
return false; return false;
} }
if (localPlayer == null) { if (!localPlayer) {
return false; return false;
} }
processSmallGameMessageRendering(); processSmallGameMessageRendering();
processScoreBoardRendering();
processLabelRendering();
processLogoRendering();
processItemActionRendering(); processItemActionRendering();
processSkinSelectRendering(); processSkinSelectRendering();
processNameTagRendering();
processInteriorLightsRendering(); processInteriorLightsRendering();
} }
// =========================================================================== // ===========================================================================
function onPedWasted(event, wastedPed, killerPed, weapon, pedPiece) { function onPedWasted(event, wastedPed, killerPed, weapon, pedPiece) {
logToConsole(LOG_DEBUG, `[VRR.Event] Ped ${wastedPed.name} died`); logToConsole(LOG_DEBUG, `[AGRP.Event] Ped ${wastedPed.name} died`);
wastedPed.clearWeapons(); wastedPed.clearWeapons();
} }
@@ -143,47 +164,23 @@ function onElementStreamIn(event, element) {
// =========================================================================== // ===========================================================================
function onLocalPlayerExitedVehicle(event, vehicle, seat) { function onPedExitedVehicle(event, ped, vehicle, seat) {
logToConsole(LOG_DEBUG, `[VRR.Event] Local player exited vehicle`); //logToConsole(LOG_DEBUG, `[AGRP.Event] Local player exited vehicle`);
sendNetworkEventToServer("agrp.onPlayerExitVehicle", getVehicleForNetworkEvent(vehicle), seat); //sendNetworkEventToServer("agrp.onPlayerExitVehicle", getVehicleForNetworkEvent(vehicle), seat);
if (inVehicleSeat) { cruiseControlEnabled = false;
parkedVehiclePosition = false; cruiseControlSpeed = 0.0;
parkedVehicleHeading = false;
}
}
// =========================================================================== if (localPlayer != null) {
if (ped == localPlayer) {
function onLocalPlayerEnteredVehicle(event, vehicle, seat) { if (areServerElementsSupported()) {
logToConsole(LOG_DEBUG, `[VRR.Event] Local player entered vehicle`); if (inVehicleSeat == 0) {
//setVehicleEngine(vehicle.id, false);
sendNetworkEventToServer("agrp.onPlayerEnterVehicle", getVehicleForNetworkEvent(vehicle), seat); //if (!inVehicle.engine) {
// parkedVehiclePosition = false;
//if (areServerElementsSupported()) { // parkedVehicleHeading = false;
//if(inVehicleSeat == 0) { //}
//setVehicleEngine(vehicle, false); }
//if(!inVehicle.engine) {
// parkedVehiclePosition = inVehicle.position;
// parkedVehicleHeading = inVehicle.heading;
//}
//}
//}
}
// ===========================================================================
function onPedInflictDamage(event, damagedEntity, damagerEntity, weaponId, healthLoss, pedPiece) {
//let damagerEntityString = (!isNull(damagedEntity)) ? `${damagerEntity.name} (${damagerEntity.name}, ${damagerEntity.type} - ${typeof damagerEntity})` : `Unknown ped`;
//let damagedEntityString = (!isNull(damagedEntity)) ? `${damagedEntity.name} (${damagedEntity.name}, ${damagedEntity.type} - ${typeof damagedEntity})` : `Unknown ped`;
//logToConsole(LOG_DEBUG, `[VRR.Event] ${damagerEntityString} damaged ${damagedEntityString}'s '${pedPiece} with weapon ${weaponId}`);
if (!isNull(damagedEntity) && !isNull(damagerEntity)) {
if (damagedEntity.isType(ELEMENT_PLAYER)) {
if (damagedEntity == localPlayer) {
//if(!weaponDamageEnabled[damagerEntity.name]) {
preventDefaultEventAction(event);
sendNetworkEventToServer("agrp.weaponDamage", damagerEntity.name, weaponId, pedPiece, healthLoss);
//}
} }
} }
} }
@@ -191,8 +188,65 @@ function onPedInflictDamage(event, damagedEntity, damagerEntity, weaponId, healt
// =========================================================================== // ===========================================================================
function onLocalPlayerEnterSphere(event, sphere) { function onPedExitingVehicle(event, ped, vehicle, seat) {
logToConsole(LOG_DEBUG, `[VRR.Event] Local player entered sphere`); //logToConsole(LOG_DEBUG, `[AGRP.Event] Local player exited vehicle`);
//sendNetworkEventToServer("agrp.onPlayerExitVehicle", getVehicleForNetworkEvent(vehicle), seat);
if (localPlayer != null) {
if (ped == localPlayer) {
cruiseControlEnabled = false;
cruiseControlSpeed = 0.0;
}
}
}
// ===========================================================================
function onPedEnteredVehicle(event, ped, vehicle, seat) {
logToConsole(LOG_DEBUG, `[AGRP.Event] Ped entered vehicle`);
//sendNetworkEventToServer("agrp.onPlayerEnterVehicle", getVehicleForNetworkEvent(vehicle), seat);
cruiseControlEnabled = false;
cruiseControlSpeed = 0.0;
if (localPlayer != null) {
if (ped == localPlayer) {
if (areServerElementsSupported()) {
if (inVehicleSeat == 0) {
//parkedVehiclePosition = inVehicle.position;
//parkedVehicleHeading = inVehicle.heading;
if (doesEntityDataExist(vehicle, "agrp.server") == true) {
//setVehicleEngine(vehicle.id, false);
setVehicleEngine(vehicle.id, getEntityData(vehicle, "agrp.engine"));
//setLocalPlayerControlState(false, false);
}
}
}
}
}
}
// ===========================================================================
function onPedInflictDamage(event, damagedEntity, damagerEntity, weaponId, healthLoss, pedPiece) {
//let damagerEntityString = (!isNull(damagedEntity)) ? `${damagerEntity.name} (${damagerEntity.name}, ${damagerEntity.type} - ${typeof damagerEntity})` : `Unknown ped`;
//let damagedEntityString = (!isNull(damagedEntity)) ? `${damagedEntity.name} (${damagedEntity.name}, ${damagedEntity.type} - ${typeof damagedEntity})` : `Unknown ped`;
//logToConsole(LOG_DEBUG, `[AGRP.Event] ${damagerEntityString} damaged ${damagedEntityString}'s '${pedPiece} with weapon ${weaponId}`);
if (!isNull(damagedEntity) && !isNull(damagerEntity)) {
if (damagedEntity.isType(ELEMENT_PLAYER)) {
if (damagedEntity == localPlayer) {
if (!weaponDamageEnabled[damagerEntity.name]) {
preventDefaultEventAction(event);
}
sendNetworkEventToServer("agrp.weaponDamage", damagerEntity.name, weaponId, pedPiece, healthLoss);
}
}
}
}
// ===========================================================================
function onPedEnteredSphere(event, ped, sphere) {
if (sphere == jobRouteLocationSphere) { if (sphere == jobRouteLocationSphere) {
enteredJobRouteSphere(); enteredJobRouteSphere();
} }
@@ -200,8 +254,8 @@ function onLocalPlayerEnterSphere(event, sphere) {
// =========================================================================== // ===========================================================================
function onLocalPlayerExitSphere(event, sphere) { function onPedExitedSphere(event, ped, sphere) {
logToConsole(LOG_DEBUG, `[VRR.Event] Local player exited sphere`);
} }
// =========================================================================== // ===========================================================================
@@ -218,7 +272,7 @@ function onFocus(event) {
// =========================================================================== // ===========================================================================
function onLocalPlayerSwitchWeapon(oldWeapon, newWeapon) { function onPedChangeWeapon(event, ped, oldWeapon, newWeapon) {
} }
@@ -237,13 +291,13 @@ function onMouseWheel(event, mouseId, deltaCoordinates, flipped) {
// =========================================================================== // ===========================================================================
function onEntityProcess(event, entity) { function onEntityProcess(event, entity) {
if (!isSpawned) {
return false;
}
//if(entity.isType(ELEMENT_PED) && !entity.isType(ELEMENT_PLAYER)) { }
// processNPCMovement(entity);
//} // ===========================================================================
function onMapLoaded(mapName) {
sendNetworkEventToServer("agrp.mapLoaded", mapName);
} }
// =========================================================================== // ===========================================================================

View File

@@ -1,6 +1,7 @@
// =========================================================================== // ===========================================================================
// Vortrex's Roleplay Resource // Asshat Gaming Roleplay
// https://github.com/VortrexFTW/gtac_roleplay // https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// =========================================================================== // ===========================================================================
// FILE: gps.js // FILE: gps.js
// DESC: Provides GPS functions and usage // DESC: Provides GPS functions and usage
@@ -16,9 +17,9 @@ let gpsBlipBlinkTimer = null;
// =========================================================================== // ===========================================================================
function showGPSLocation(position, colour) { function showGPSLocation(position, colour) {
logToConsole(LOG_DEBUG, `[VRR.GPS] Showing gps location`); logToConsole(LOG_DEBUG, `[AGRP.GPS] Showing gps location`);
if(getMultiplayerMod() == VRR_MPMOD_GTAC) { if (getMultiplayerMod() == AGRP_MPMOD_GTAC) {
if(getGame() == VRR_GAME_GTA_SA) { if (getGame() == AGRP_GAME_GTA_SA) {
// Server-side spheres don't show in GTA SA for some reason. // Server-side spheres don't show in GTA SA for some reason.
gpsSphere = game.createPickup(1318, position, 1); gpsSphere = game.createPickup(1318, position, 1);
} else { } else {
@@ -26,7 +27,7 @@ function showGPSLocation(position, colour) {
gpsSphere.colour = colour; gpsSphere.colour = colour;
} }
if(gpsBlip != null) { if (gpsBlip != null) {
destroyElement(gpsBlip); destroyElement(gpsBlip);
} }
@@ -40,16 +41,16 @@ function showGPSLocation(position, colour) {
function blinkGPSBlip(times, position, colour) { function blinkGPSBlip(times, position, colour) {
gpsBlipBlinkTimes = times; gpsBlipBlinkTimes = times;
gpsBlipBlinkTimer = setInterval(function() { gpsBlipBlinkTimer = setInterval(function () {
if(gpsBlip != null) { if (gpsBlip != null) {
destroyElement(gpsBlip); destroyElement(gpsBlip);
gpsBlip = null; gpsBlip = null;
} else { } else {
gpsBlip = game.createBlip(position, 0, 2, colour); gpsBlip = game.createBlip(position, 0, 2, colour);
} }
if(gpsBlipBlinkAmount >= gpsBlipBlinkTimes) { if (gpsBlipBlinkAmount >= gpsBlipBlinkTimes) {
if(gpsBlip != null) { if (gpsBlip != null) {
destroyElement(gpsBlip); destroyElement(gpsBlip);
gpsBlip = null; gpsBlip = null;
} }

346
scripts/client/gui.js Normal file
View File

@@ -0,0 +1,346 @@
// ===========================================================================
// Asshat Gaming Roleplay
// https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// ===========================================================================
// FILE: gui.js
// DESC: Provides GUI functionality and styles (using MexUI)
// TYPE: Client (JavaScript)
// ===========================================================================
var app = {};
let mainFont = "Roboto"; // "Arial"
//let mainLogoPath = (typeof gta == "undefined") ? "files/images/mafiac-logo.png" : "files/images/gtac-logo.png";
let mainLogoPath = "files/images/asshat-logo.png";
let primaryColour = [200, 200, 200];
let secondaryColour = [16, 16, 16];
let primaryTextColour = [0, 0, 0];
let focusedColour = [200, 200, 200];
let invalidValueColour = [200, 200, 200];
let focusedColourOffset = 50;
let windowAlpha = 200;
let windowTitleAlpha = 180;
let buttonAlpha = 180;
let textInputAlpha = 180;
let guiReady = false;
// ===========================================================================
let characterData = [];
let currentCharacter = 0;
let inCharacterSelectScreen = false;
let creatingCharacter = false;
// ===========================================================================
function initGUIScript() {
logToConsole(LOG_DEBUG, "[AGRP.GUI]: Initializing GUI script ...");
logToConsole(LOG_DEBUG, "[AGRP.GUI]: GUI script initialized!");
}
// ===========================================================================
function initGUI() {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Initializing GUI ...`);
initLoginGUI();
initRegisterGUI();
initNewCharacterGUI();
initCharacterSelectGUI();
initInfoDialogGUI();
initErrorDialogGUI();
initYesNoDialogGUI();
initTwoFactorAuthenticationGUI();
initListGUI();
initResetPasswordGUI();
initChangePasswordGUI();
initLocaleChooserGUI();
//initInventoryGUI();
//initInventoryBulkGUI();
//initClanManagerGUI();
//initBusinessManagerGUI();
//initHouseManagerGUI();
//initFiveCardPokerGUI();
//initBettingGUI();
//initBlackJackGUI();
closeAllWindows();
guiReady = true;
logToConsole(LOG_DEBUG, `[AGRP.GUI] All GUI created successfully!`);
sendNetworkEventToServer("agrp.guiReady", true);
};
// ===========================================================================
function closeAllWindows() {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Closing all GUI windows`);
infoDialog.window.shown = false;
yesNoDialog.window.shown = false;
errorDialog.window.shown = false;
register.window.shown = false;
login.window.shown = false;
newCharacter.window.shown = false;
characterSelect.window.shown = false;
twoFactorAuth.window.shown = false;
listDialog.window.shown = false;
passwordReset.window.shown = false;
passwordChange.window.shown = false;
localeChooser.window.shown = false;
//houseManager.window.shown = false;
//businessManager.window.shown = false;
//clanManager.window.shown = false;
//inventoryGUI.window.shown = false;
//inventoryBulkGUI.window.shown = false;
//bettingGUI.window.shown = false;
//blackJackGUI.window.shown = false;
//fiveCardPokerGUI.window.shown = false;
mexui.setInput(false);
mexui.focusedControl = false;
guiSubmitKey = false;
guiLeftKey = false;
guiRightKey = false;
guiUpKey = false;
guiDownKey = false;
setChatWindowEnabled(true);
}
// ===========================================================================
function isAnyGUIActive() {
if (!guiReady) {
return false;
}
if (infoDialog.window.shown == true) {
return true;
}
if (yesNoDialog.window.shown == true) {
return true;
}
if (errorDialog.window.shown == true) {
return true;
}
if (register.window.shown == true) {
return true;
}
if (login.window.shown == true) {
return true;
}
if (newCharacter.window.shown == true) {
return true;
}
if (characterSelect.window.shown == true) {
return true;
}
if (twoFactorAuth.window.shown == true) {
return true;
}
if (listDialog.window.shown == true) {
return true;
}
if (passwordReset.window.shown == true) {
return true;
}
if (passwordChange.window.shown == true) {
return true;
}
if (localeChooser.window.shown == true) {
return true;
}
//if (clanManager.window.shown == true) {
// return true;
//}
//if (businessManager.window.shown == true) {
// return true;
//}
//if (houseManager.window.shown == true) {
// return true;
//}
//if (inventoryGUI.window.shown == true) {
// return true;
//}
//if (inventoryBulkGUI.window.shown == true) {
// return true;
//}
//if (bettingGUI.window.shown == true) {
// return true;
//}
//if (blackJackGUI.window.shown == true) {
// return true;
//}
//if (fiveCardPokerGUI.window.shown == true) {
// return true;
//}
return false;
}
// ===========================================================================
function setGUIColours(red1, green1, blue1, red2, green2, blue2, red3, green3, blue3) {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Received new GUI colours from server: ${red1}, ${green1}, ${blue1} / ${red2}, ${green2}, ${blue2} / ${red3}, ${green3}, ${blue3}`);
primaryColour = [red1, green1, blue1];
secondaryColour = [red2, green2, blue2];
primaryTextColour = [red3, green3, blue3];
focusedColour = [red1 + focusedColourOffset, green1 + focusedColourOffset, blue1 + focusedColourOffset];
initGUI();
}
// ===========================================================================
function hideAllGUI() {
closeAllWindows();
setChatWindowEnabled(true);
guiSubmitKey = false;
}
// ===========================================================================
function processGUIKeyPress(keyCode) {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Processing key press: ${keyCode}`);
if (!guiReady) {
return false;
}
if (!isAnyGUIActive()) {
logToConsole(LOG_DEBUG, `[AGRP.GUI] GUI is not active. Cancelling keypress processing.`);
return false;
}
if (keyCode == SDLK_RETURN || keyCode == SDLK_RETURN2) {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Key press is submit (${guiSubmitKey})`);
if (guiSubmitKey != false) {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Calling submit key function`);
guiSubmitKey.call();
}
} else if (keyCode == getKeyIdFromParams("left") || keyCode == getKeyIdFromParams("a")) {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Key press is left (${guiLeftKey})`);
if (guiLeftKey != false) {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Calling left key function`);
guiLeftKey.call();
}
} else if (keyCode == getKeyIdFromParams("right") || keyCode == getKeyIdFromParams("d")) {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Key press is right (${guiRightKey})`);
if (guiRightKey != false) {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Calling right key function`);
guiRightKey.call();
}
} else if (keyCode == getKeyIdFromParams("down") || keyCode == getKeyIdFromParams("s")) {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Key press is down (${guiDownKey})`);
if (guiDownKey != false) {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Calling down key function`);
guiDownKey.call();
}
} else if (keyCode == getKeyIdFromParams("up") || keyCode == getKeyIdFromParams("w")) {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Key press is up (${guiUpKey})`);
if (guiUpKey != false) {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Calling up key function`);
guiUpKey.call();
}
}
}
// ===========================================================================
function processToggleGUIKeyPress(keyCode) {
if (keyCode == disableGUIKey) {
sendNetworkEventToServer("agrp.toggleGUI");
}
}
// ===========================================================================
function resetGUIStrings() {
if (!guiReady) {
return false;
}
// Login GUI
login.messageLabel.text = getLocaleString("GUILoginWindowLabelEnterPassword");
login.passwordInput.placeholder = getLocaleString("GUILoginWindowPasswordPlaceholder");
login.loginButton.text = toUpperCase(getLocaleString("GUILoginWindowSubmitButton"));
login.forgotPasswordButton.text = toUpperCase(getLocaleString("GUILoginWindowResetPasswordButton"));
login.resetPasswordLabel.text = getLocaleString("GUILoginWindowForgotPasswordLabel");
// Register GUI
register.messageLabel.text = getLocaleString("GUIRegisterWindowLabelCreateAccount");
register.passwordInput.placeholder = getLocaleString("GUIRegisterWindowPasswordPlaceholder");
register.confirmPasswordInput.placeholder = getLocaleString("GUIRegisterWindowConfirmPasswordPlaceholder");
register.emailInput.placeholder = getLocaleString("GUIRegisterWindowEmailPlaceholder");
register.registerButton.text = toUpperCase(getLocaleString("GUIRegisterWindowSubmitButton"));
// Change Password GUI
passwordChange.window.title = toUpperCase(getLocaleString("GUIChangePasswordWindowTitle"));
passwordChange.messageLabel.text = getLocaleString("GUIChangePasswordPasswordLabel");
passwordChange.passwordInput.placeholder = getLocaleString("GUIChangePasswordPasswordPlaceholder");
passwordChange.confirmPasswordInput.placeholder = getLocaleString("GUIChangePasswordConfirmPasswordPlaceholder");
passwordChange.submitButton.text = toUpperCase(getLocaleString("GUIChangePasswordSubmitButton"));
// Reset Password GUI
passwordReset.messageLabel.text = toUpperCase(getLocaleString("GUIResetPasswordConfirmEmailLabel"));
passwordReset.emailInput.placeholder = getLocaleString("GUIResetPasswordEmailPlaceholder");
passwordReset.resetPasswordButton.text = toUpperCase(getLocaleString("GUIResetPasswordSubmitButton"));
passwordReset.backToLoginButton.text = toUpperCase(getLocaleString("GUIResetPasswordLoginButton"));
passwordReset.backToLoginLabel.text = getLocaleString("GUIResetPasswordRememberMessage");
// Character Selection GUI
characterSelect.window.title = toUpperCase(getLocaleString("GUICharacterSelectWindowTitle"));
characterSelect.cashText.text = getLocaleString("GUICharacterSelectMoneyLabel", "0");
characterSelect.clanText.text = getLocaleString("GUICharacterSelectClanLabel", "None");
characterSelect.lastPlayedText.text = getLocaleString("GUICharacterSelectLastPlayedLabel", "Never");
characterSelect.previousCharacterButton.text = toUpperCase(getLocaleString("GUIPreviousCharacterButton"));
characterSelect.nextCharacterButton.text = toUpperCase(getLocaleString("GUINextCharacterButton"));
characterSelect.selectCharacterButton.text = toUpperCase(getLocaleString("GUIPlayAsCharacterButton"));
characterSelect.newCharacterButton.text = toUpperCase(getLocaleString("GUINewCharacterButton"));
// Character Creation GUI
newCharacter.messageLabel.text = getLocaleString("GUINewCharacterMessageLabel");
newCharacter.firstNameInput.placeholder = getLocaleString("GUINewCharacterFirstNamePlaceholder");
newCharacter.lastNameInput.placeholder = getLocaleString("GUINewCharacterLastNamePlaceholder");
newCharacter.createCharacterButton.text = toUpperCase(getLocaleString("GUINewCharacterSubmitButton"));
}
// ===========================================================================
function dimAllGUIElementsInWindow(guiObject) {
for (let i in guiObject) {
if (i != "window") {
guiObject[i].shown = false;
}
}
}
// ===========================================================================

136
scripts/client/gui/2fa.js Normal file
View File

@@ -0,0 +1,136 @@
// ===========================================================================
// Asshat Gaming Roleplay
// https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// ===========================================================================
// FILE: 2fa.js
// DESC: Provides two factor authentication GUI
// TYPE: Client (JavaScript)
// ===========================================================================
let twoFactorAuth = {
window: null,
logoImage: null,
qrCode: null,
messageLabel: null,
codeLabel: null,
codeInput: null,
submitButton: null,
};
// ===========================================================================
function initTwoFactorAuthenticationGUI() {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Creating two factor auth GUI ...`);
twoFactorAuth.window = mexui.window(game.width / 2 - 150, game.height / 2 - 129, 300, 258, 'LOGIN', {
main: {
backgroundColour: toColour(secondaryColour[0], secondaryColour[1], secondaryColour[2], windowAlpha),
transitionTime: 500,
},
title: {
textSize: 0.0,
textColour: toColour(0, 0, 0, 0),
},
icon: {
textSize: 0.0,
textColour: toColour(0, 0, 0, 0),
},
focused: {
borderColour: toColour(0, 0, 0, 0),
},
});
twoFactorAuth.window.titleBarIconSize = toVector2(0, 0);
twoFactorAuth.window.titleBarHeight = 0;
twoFactorAuth.qrCode = twoFactorAuth.window.image(100, 20, 100, 100, mainLogoPath, {
focused: {
borderColour: toColour(0, 0, 0, 0),
},
});
twoFactorAuth.codeLabel = twoFactorAuth.window.text(20, 135, 260, 20, 'Please enter the code sent to your email!', {
main: {
textSize: 10.0,
textAlign: 0.5,
textColour: toColour(200, 200, 200, 255),
textFont: mainFont,
},
focused: {
borderColour: toColour(0, 0, 0, 0),
},
});
twoFactorAuth.codeInput = twoFactorAuth.window.textInput(20, 170, 260, 25, '', {
main: {
backgroundColour: toColour(0, 0, 0, 120),
borderColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], textInputAlpha),
textColour: toColour(200, 200, 200, 255),
textSize: 10.0,
textFont: mainFont,
},
caret: {
lineColour: toColour(255, 255, 255, 255),
},
placeholder: {
textColour: toColour(200, 200, 200, 150),
textSize: 10.0,
textFont: mainFont,
},
focused: {
borderColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], 255),
},
});
twoFactorAuth.codeInput.placeholder = "Code";
twoFactorAuth.submitButton = twoFactorAuth.window.button(20, 205, 260, 30, 'SUBMIT', {
main: {
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
textColour: toColour(0, 0, 0, 255),
textSize: 10.0,
textFont: mainFont,
textAlign: 0.5,
},
focused: {
borderColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
},
}, checkTwoFactorAuth);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Created two factor auth GUI`);
}
// ===========================================================================
function showTwoFactorAuthGUI() {
closeAllWindows();
logToConsole(LOG_DEBUG, `[AGRP.GUI] Showing two-factor authentication window`);
setChatWindowEnabled(false);
mexui.setInput(true);
twoFactorAuth.window.shown = true;
mexui.focusedControl = twoFactorAuth.codeInput;
guiSubmitKey = checkTwoFactorAuth;
}
// ===========================================================================
function twoFactorAuthFailed(errorMessage) {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Server reports two-factor authentication failed. Reason: ${errorMessage}`);
twoFactorAuth.messageLabel.text = errorMessage;
twoFactorAuth.messageLabel.styles.main.textColour = toColour(180, 32, 32, 255);
twoFactorAuth.codeInput.text = "";
}
// ===========================================================================
function twoFactorAuthSuccess() {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Server reports two-factor authentication was successful`);
closeAllWindows();
}
// ===========================================================================
function checkTwoFactorAuth() {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Checking two-factor authentication with server ...`);
sendNetworkEventToServer("agrp.2fa", twoFactorAuth.codeInput.lines[0]);
}
// ===========================================================================

View File

@@ -0,0 +1,85 @@
// ===========================================================================
// Asshat Gaming Roleplay
// https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// ===========================================================================
// FILE: bizmgr.js
// DESC: Provides business manager GUI
// TYPE: Client (JavaScript)
// ===========================================================================
/*
class BusinessManagerData {
constructor(businessIndex, name, locked, entranceFee, buyPrice, rentPrice, floorItems, storageItems) {
this.businessIndex = businessIndex;
this.name = name;
this.locked = locked;
this.entranceFee = entranceFee;
this.buyPrice = buyPrice;
this.rentPrice = rentPrice;
this.till = till;
this.ownerName = ownerName;
this.floorItems = floorItems;
this.storageItems = storageItems;
}
}
// ===========================================================================
let businessManager = {
window: null,
generalTabButton: null,
floorItemsTab: null,
storageItemsTab: null,
orderItemsTab: null,
data: null,
// General Tab
businessName: null,
businessOwnerName: null,
businessEntranceFee: null,
businessBuyPrice: null,
businessRentPrice: null,
};
// ===========================================================================
function initBusinessManagerGUI() {
}
// ===========================================================================
function showBusinessManagerGUI() {
}
// ===========================================================================
function hideBusinessManagerGUI() {
}
// ===========================================================================
function updateBusinessManagerGUIStrings() {
}
// ===========================================================================
function receiveBusinessManagerData(businessIndex, name, locked, entranceFee, buyPrice, rentPrice, floorItems, storageItems) {
let businessManagerData = new BusinessManagerData(businessIndex, name, locked, entranceFee, buyPrice, rentPrice, floorItems, storageItems);
businessManager.data = businessManagerData;
updateBusinessManagerGUIStrings();
}
// ===========================================================================
function saveBusinessData() {
sendNetworkEventToServer("agrp.businessManagerSave", businessManager.data.businessIndex);
}
*/
// ===========================================================================

View File

@@ -0,0 +1,158 @@
// ===========================================================================
// Asshat Gaming Roleplay
// https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// ===========================================================================
// FILE: changepass.js
// DESC: Provides change password GUI
// TYPE: Client (JavaScript)
// ===========================================================================
let passwordChange = {
window: null,
logoImage: null,
messageLabel: null,
passwordInput: null,
confirmPasswordInput: null,
submitButton: null,
};
// ===========================================================================
function initChangePasswordGUI() {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Creating password change GUI ...`);
passwordChange.window = mexui.window(game.width / 2 - 130, game.height / 2 - 125, 300, 250, 'Change Password', {
main: {
backgroundColour: toColour(secondaryColour[0], secondaryColour[1], secondaryColour[2], windowAlpha),
transitionTime: 500,
},
title: {
textSize: 0.0,
textColour: toColour(0, 0, 0, 0),
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], windowTitleAlpha),
},
icon: {
textSize: 0.0,
textColour: toColour(0, 0, 0, 0),
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], windowTitleAlpha),
}
});
passwordChange.window.titleBarIconSize = toVector2(0, 0);
passwordChange.window.titleBarHeight = 0;
passwordChange.window.titleBarShown = false;
passwordChange.window.image(100, 20, 75, 75, mainLogoPath, {
focused: {
borderColour: toColour(0, 0, 0, 0),
},
});
passwordChange.messageLabel = passwordChange.window.text(20, 95, 260, 20, 'Enter a new password', {
main: {
textSize: 10.0,
textAlign: 0.5,
textColour: toColour(200, 200, 200, 255),
textFont: mainFont,
},
focused: {
borderColour: toColour(0, 0, 0, 0),
},
});
passwordChange.passwordInput = passwordChange.window.textInput(20, 130, 260, 25, '', {
main: {
backgroundColour: toColour(0, 0, 0, 120),
textColour: toColour(200, 200, 200, 255),
textSize: 10.0,
textFont: mainFont,
},
caret: {
lineColour: toColour(255, 255, 255, 255),
},
placeholder: {
backgroundColour: toColour(0, 0, 0, 120),
textColour: toColour(200, 200, 200, 200),
textSize: 10.0,
textFont: mainFont,
}
});
passwordChange.passwordInput.masked = true;
passwordChange.passwordInput.placeholder = "Password";
passwordChange.confirmPasswordInput = passwordChange.window.textInput(20, 160, 260, 25, '', {
main: {
backgroundColour: toColour(0, 0, 0, 120),
textColour: toColour(200, 200, 200, 255),
textSize: 10.0,
textFont: mainFont,
},
caret: {
lineColour: toColour(255, 255, 255, 255),
},
placeholder: {
backgroundColour: toColour(0, 0, 0, 120),
textColour: toColour(200, 200, 200, 200),
textSize: 10.0,
textFont: mainFont,
}
});
passwordChange.confirmPasswordInput.masked = true;
passwordChange.confirmPasswordInput.placeholder = "Confirm password";
passwordChange.submitButton = passwordChange.window.button(20, 195, 260, 30, 'CHANGE PASSWORD', {
main: {
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
textColour: toColour(255, 255, 255, 255),
textSize: 12.0,
textFont: mainFont,
textAlign: 0.5,
},
focused: {
borderColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
},
}, checkChangePassword);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Created change password GUI`);
}
// ===========================================================================
function passwordChangeFailed(errorMessage) {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Server reports change password failed. Reason: ${errorMessage}`);
passwordChange.messageLabel.text = errorMessage;
passwordChange.messageLabel.styles.main.textColour = toColour(180, 32, 32, 255);
passwordChange.passwordInput.text = "";
passwordChange.confirmPasswordInput.text = "";
passwordChange.verificationCodeInput.text = "";
}
// ===========================================================================
function checkChangePassword() {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Checking password change with server ...`);
sendNetworkEventToServer("agrp.checkChangePassword", passwordChange.passwordInput.lines[0], passwordChange.confirmPasswordInput.lines[0]);
}
// ===========================================================================
function showChangePasswordGUI(errorMessage) {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Showing change password window`);
closeAllWindows();
setChatWindowEnabled(false);
mexui.setInput(true);
passwordChange.window.shown = true;
passwordChange.messageLabel = errorMessage;
mexui.focusedControl = passwordChange.passwordInput;
guiSubmitKey = checkChangePassword;
showLocaleChooserGUI(new Vec2(getScreenWidth() / 2 - (localeChooser.window.size.x / 2), passwordChange.window.position.y + passwordChange.window.size.y + 20));
}
// ===========================================================================
function passwordChangeSuccess() {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Server reports password change was successful`);
guiSubmitKey = false;
closeAllWindows();
}
// ===========================================================================

View File

@@ -0,0 +1,249 @@
// ===========================================================================
// Asshat Gaming Roleplay
// https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// ===========================================================================
// FILE: charselect.js
// DESC: Provides character select GUI
// TYPE: Client (JavaScript)
// ===========================================================================
let characterSelect = {
window: null,
skinImage: null,
nameText: null,
cashText: null,
clanText: null,
lastPlayedText: null,
previousCharacterButton: null,
nextCharacterButton: null,
selectCharacterButton: null,
newCharacterButton: null,
};
// ===========================================================================
function initCharacterSelectGUI() {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Creating character select GUI ...`);
characterSelect.window = mexui.window(game.width / 2 - 215, game.height / 2 - 83, 430, 190, 'SELECT CHARACTER', {
main: {
backgroundColour: toColour(secondaryColour[0], secondaryColour[1], secondaryColour[2], windowAlpha),
},
title: {
textSize: 12.0,
textFont: mainFont,
textColour: toColour(0, 0, 0, 255),
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], windowTitleAlpha),
},
icon: {
textSize: 10.0,
textFont: mainFont,
textColour: toColour(0, 0, 0, 255),
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], windowTitleAlpha),
}
});
characterSelect.window.titleBarIconSize = toVector2(0, 0);
characterSelect.window.titleBarIconShown = false;
characterSelect.window.titleBarHeight = 30;
characterSelect.nameText = characterSelect.window.text(5, 40, 200, 25, 'Lastname, Firstname', {
main: {
textSize: 14.0,
textAlign: 0.0,
textColour: toColour(255, 255, 255, 220),
textFont: mainFont,
},
focused: {
borderColour: toColour(0, 0, 0, 0),
}
});
characterSelect.cashText = characterSelect.window.text(5, 65, 200, 25, 'Cash: $0', {
main: {
textSize: 9.0,
textAlign: 0.0,
textColour: toColour(255, 255, 255, 220),
textFont: mainFont,
},
focused: {
borderColour: toColour(0, 0, 0, 0),
}
});
characterSelect.clanText = characterSelect.window.text(5, 80, 200, 25, 'Clan: None', {
main: {
textSize: 9.0,
textAlign: 0.0,
textColour: toColour(255, 255, 255, 220),
textFont: mainFont,
},
focused: {
borderColour: toColour(0, 0, 0, 0),
}
});
characterSelect.lastPlayedText = characterSelect.window.text(5, 95, 200, 25, 'Last Played: Never', {
main: {
textSize: 9.0,
textAlign: 0.0,
textColour: toColour(255, 255, 255, 220),
textFont: mainFont,
},
focused: {
borderColour: toColour(0, 0, 0, 0),
}
});
characterSelect.selectCharacterButton = characterSelect.window.button(85, 130, 260, 25, 'PLAY', {
main: {
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255),
textSize: 10.0,
textFont: mainFont,
textAlign: 0.5,
},
focused: {
borderColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
}
}, selectThisCharacter);
characterSelect.newCharacterButton = characterSelect.window.button(5, 160, 420, 25, 'NEW CHARACTER', {
main: {
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255),
textSize: 10.0,
textFont: mainFont,
textAlign: 0.5,
},
focused: {
borderColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
}
}, showNewCharacter);
characterSelect.previousCharacterButton = characterSelect.window.button(5, 130, 75, 25, 'PREV', {
main: {
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255),
textSize: 10.0,
textFont: mainFont,
textAlign: 0.5,
},
focused: {
borderColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
}
}, selectPreviousCharacter);
characterSelect.nextCharacterButton = characterSelect.window.button(350, 130, 75, 25, 'NEXT', {
main: {
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255),
textSize: 10.0,
textFont: mainFont,
textAlign: 0.5,
},
focused: {
borderColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
}
}, selectNextCharacter);
characterSelect.skinImage = characterSelect.window.image(310, 32, 100, 90, "files/images/skins/none.png", {
focused: {
borderColour: toColour(0, 0, 0, 0),
}
});
logToConsole(LOG_DEBUG, `[AGRP.GUI] Created character select GUI`);
}
// ===========================================================================
function showCharacterSelectGUI(firstName, lastName, cash, clan, lastPlayed, skinId) {
closeAllWindows();
logToConsole(LOG_DEBUG, `[AGRP.GUI] Showing character selection window`);
setChatWindowEnabled(false);
mexui.setInput(true);
characterSelect.nameText.text = `${firstName} ${lastName}`;
characterSelect.cashText.text = `Money: ${getCurrencyString(cash)}`;
characterSelect.clanText.text = `Clan: ${clan}`;
characterSelect.lastPlayedText.text = `Last Played: ${lastPlayed}`;
characterSelect.skinImage = characterSelect.window.image(310, 32, 100, 90, "files/images/skins/none.png");
characterSelect.window.shown = true;
guiSubmitKey = selectThisCharacter;
guiLeftKey = selectPreviousCharacter;
guiRightKey = selectNextCharacter;
showLocaleChooserGUI(new Vec2(getScreenWidth() / 2 - (localeChooser.window.size.x / 2), characterSelect.window.position.y + characterSelect.window.size.y + 20));
}
// ===========================================================================
function showNewCharacter() {
closeAllWindows();
logToConsole(LOG_DEBUG, `[AGRP.GUI] Showing new character dialog window`);
showNewCharacterGUI();
}
// ===========================================================================
function selectNextCharacter() {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Requesting next character info from server for character select window`);
sendNetworkEventToServer("agrp.nextCharacter");
}
// ===========================================================================
function selectPreviousCharacter() {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Requesting previous character info from server for character select window`);
sendNetworkEventToServer("agrp.previousCharacter");
}
// ===========================================================================
function selectThisCharacter() {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Tell server the current shown character was selected in character select window`);
sendNetworkEventToServer("agrp.selectCharacter");
}
// ===========================================================================
function switchCharacterSelectGUI(firstName, lastName, cash, clan, lastPlayed, skinId) {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Updating character info with data from server`);
setChatWindowEnabled(false);
characterSelect.window.shown = false;
characterSelect.nameText.text = `${firstName} ${lastName}`;
characterSelect.cashText.text = `Money: ${getCurrencyString(cash)}`;
characterSelect.clanText.text = `Clan: ${clan}`;
characterSelect.lastPlayedText.text = `Last Played: ${lastPlayed}`;
if (characterSelect.skinImage != null) {
characterSelect.skinImage.remove();
}
characterSelect.skinImage = (getGame() == AGRP_GAME_GTA_III) ? characterSelect.window.image(310, 32, 100, 90, `files/images/skins/gta3/${getSkinImage(skinId)}.png`) : characterSelect.window.image(310, 32, 100, 90, "files/images/skins/none.png");
characterSelect.window.shown = true;
guiSubmitKey = selectThisCharacter;
guiLeftKey = selectPreviousCharacter;
guiRightKey = selectNextCharacter;
}
// ===========================================================================
function characterSelectSuccess() {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Server reports character selection was successful`);
closeAllWindows();
}
// ===========================================================================
function getSkinImage(skinId, gameId = getGame()) {
if (skinId < 10) {
return `Skin_00${skinId}.png`;
} else if (skinId > 10 && skinId < 100) {
return `Skin_0${skinId}.png`;
} else if (skinId > 100) {
return `Skin_${skinId}.png`;
}
}
// ===========================================================================

View File

@@ -0,0 +1,25 @@
// ===========================================================================
// Asshat Gaming Roleplay
// https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// ===========================================================================
// FILE: clanmgr.js
// DESC: Provides clan manager GUI
// TYPE: Client (JavaScript)
// ===========================================================================
let clanManager = {
window: null,
generalTabButton: null,
ranksTabButton: null,
membersTabButton: null,
vehiclesTabButton: null,
businessesTabButton: null,
housesTabButton: null,
};
// ===========================================================================
function initClanManagerGUI() {
}

View File

@@ -0,0 +1,86 @@
// ===========================================================================
// Asshat Gaming Roleplay
// https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// ===========================================================================
// FILE: error.js
// DESC: Provides error box GUI
// TYPE: Client (JavaScript)
// ===========================================================================
let errorDialog = {
window: null,
messageLabel: null,
okayButton: null,
};
// ===========================================================================
function initErrorDialogGUI() {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Creating error GUI ...`);
errorDialog.window = mexui.window(getScreenWidth() / 2 - 200, getScreenHeight() / 2 - 70, 400, 140, 'ERROR', {
main: {
backgroundColour: toColour(secondaryColour[0], secondaryColour[1], secondaryColour[2], windowAlpha),
transitionTime: 500,
},
title: {
textSize: 11.0,
textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255),
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], windowTitleAlpha),
},
icon: {
textSize: 0.0,
textColour: toColour(0, 0, 0, 0),
backgroundColour: toColour(0, 0, 0, 0),
},
});
errorDialog.messageLabel = errorDialog.window.text(15, 50, 370, 20, 'Error Message', {
main: {
textSize: 10.0,
textAlign: 0.5,
textColour: toColour(255, 255, 255, 255),
textFont: mainFont,
},
focused: {
borderColour: toColour(0, 0, 0, 0),
},
});
errorDialog.okayButton = errorDialog.window.button(5, 105, 390, 30, 'OK', {
main: {
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255),
textSize: 10.0,
textFont: mainFont,
textAlign: 0.5,
},
focused: {
borderColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], 255),
},
}, closeErrorDialog);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Created error GUI ...`);
}
// ===========================================================================
function showErrorGUI(errorMessage, errorTitle, buttonText) {
closeAllWindows();
logToConsole(LOG_DEBUG, `[AGRP.GUI] Showing error window. Error: ${errorTitle} - ${errorMessage}`);
setChatWindowEnabled(false);
mexui.setInput(true);
errorDialog.messageLabel.text = errorMessage;
errorDialog.okayButton.text = buttonText;
errorDialog.window.title = errorTitle;
errorDialog.window.shown = true;
}
// ===========================================================================
function closeErrorDialog() {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Closing error dialog`);
errorDialog.window.shown = false;
mexui.setInput(false);
}
// ===========================================================================

View File

@@ -0,0 +1,40 @@
// ===========================================================================
// Asshat Gaming Roleplay
// https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// ===========================================================================
// FILE: 5cardpoker.js
// DESC: Provides 5-card poker games GUI
// TYPE: Client (JavaScript)
// ===========================================================================
let fiveCardPokerGUI = {
window: null,
}
function initFiveCardPokerGUI() {
// Render a five card poker game in MexUI
//logToConsole(LOG_DEBUG, `[AGRP.GUI] Creating five-card poker GUI ...`);
fiveCardPokerGUI.window = mexui.window(game.width / 2 - 200, game.height - 150, 400, 400, 'Five Card Poker', {
main: {
backgroundColour: toColour(secondaryColour[0], secondaryColour[1], secondaryColour[2], 0),
},
title: {
textSize: 11.0,
textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255),
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], windowTitleAlpha),
},
icon: {
textSize: 0.0,
textColour: toColour(0, 0, 0, 0),
backgroundColour: toColour(0, 0, 0, 0),
},
});
fiveCardPokerGUI.window.titleBarShown = false;
fiveCardPokerGUI.window.shown = false;
logToConsole(LOG_DEBUG, `[AGRP.GUI] Created five card poker GUI`);
}
// ===========================================================================

View File

@@ -0,0 +1,147 @@
// ===========================================================================
// Asshat Gaming Roleplay
// https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// ===========================================================================
// FILE: betting.js
// DESC: Provides betting GUI (used for multiple casino games)
// TYPE: Client (JavaScript)
// ===========================================================================
let bettingGUI = {
window: null,
amountLabel: null,
fiveThousandLabel: null,
fiveThousandPlusButton: null,
fiveThousandMinusButton: null,
oneThousandLabel: null,
oneThousandPlusButton: null,
oneThousandMinusButton: null,
fiveHundredPlusButton: null,
fiveHundredMinusButton: null,
oneHundredLabel: null,
oneHundredPlusButton: null,
oneHundredMinusButton: null,
fiftyLabel: null,
fiftyPlusButton: null,
fiftyMinusButton: null,
twentyLabel: null,
twentyPlusButton: null,
twentyMinusButton: null,
tenLabel: null,
tenPlusButton: null,
tenMinusButton: null,
fiveLabel: null,
fivePlusButton: null,
fiveMinusButton: null,
oneLabel: null,
onePlusButton: null,
oneMinusButton: null,
}
// ===========================================================================
function initBettingGUI() {
bettingGUI.window = mexui.window(getScreenWidth() / 2 - 125, getScreenHeight() / 2 - 250, 250, 500, 'BETTING', {
main: {
backgroundColour: toColour(secondaryColour[0], secondaryColour[1], secondaryColour[2], windowAlpha),
transitionTime: 500,
},
title: {
textSize: 0.0,
textColour: toColour(0, 0, 0, 0),
},
icon: {
textSize: 0.0,
textColour: toColour(0, 0, 0, 0),
},
focused: {
borderColour: toColour(0, 0, 0, 0),
},
});
bettingGUI.window.titleBarIconSize = toVector2(0, 0);
bettingGUI.window.titleBarHeight = 0;
bettingGUI.window.titleBarShown = false;
bettingGUI.amountLabel = bettingGUI.window.text(10, 20, 230, 20, 'Amount: 0', {
main: {
textSize: 20.0,
textAlign: 0.5,
textColour: toColour(200, 200, 200, 255),
textFont: mainFont,
},
focused: {
borderColour: toColour(0, 0, 0, 0),
},
});
bettingGUI.oneLabel = bettingGUI.window.text(10, 50, 230, 20, '1', {
main: {
textSize: 10.0,
textAlign: 0.5,
textColour: toColour(200, 200, 200, 255),
textFont: mainFont,
},
focused: {
borderColour: toColour(0, 0, 0, 0),
},
});
bettingGUI.fiveLabel = bettingGUI.window.text(10, 65, 230, 20, '1', {
main: {
textSize: 10.0,
textAlign: 0.5,
textColour: toColour(200, 200, 200, 255),
textFont: mainFont,
},
focused: {
borderColour: toColour(0, 0, 0, 0),
},
});
bettingGUI.tenLabel = bettingGUI.window.text(10, 80, 230, 20, '1', {
main: {
textSize: 10.0,
textAlign: 0.5,
textColour: toColour(200, 200, 200, 255),
textFont: mainFont,
},
focused: {
borderColour: toColour(0, 0, 0, 0),
},
});
bettingGUI.fiftyLabel = bettingGUI.window.text(10, 95, 230, 20, '1', {
main: {
textSize: 10.0,
textAlign: 0.5,
textColour: toColour(200, 200, 200, 255),
textFont: mainFont,
},
focused: {
borderColour: toColour(0, 0, 0, 0),
},
});
bettingGUI.hundredLabel = bettingGUI.window.text(10, 95, 230, 20, '1', {
main: {
textSize: 10.0,
textAlign: 0.5,
textColour: toColour(200, 200, 200, 255),
textFont: mainFont,
},
focused: {
borderColour: toColour(0, 0, 0, 0),
},
});
bettingGUI.window.shown = false;
}
// ===========================================================================
function showBettingGUI() {
}
// ===========================================================================

View File

@@ -0,0 +1,49 @@
// ===========================================================================
// Asshat Gaming Roleplay
// https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// ===========================================================================
// FILE: blackjack.js
// DESC: Provides blackjack game GUI
// TYPE: Client (JavaScript)
// ===========================================================================
let blackJackGUI = {
window: null,
dealerHand: [],
playerHand: [],
};
// ===========================================================================
let playerCards = [];
let dealerCards = [];
// ===========================================================================
function initBlackJackGUI() {
// Render a blackjack game in MexUI
logToConsole(LOG_DEBUG, `[AGRP.GUI] Creating blackjack GUI ...`);
blackJackGUI.window = mexui.window(game.width / 2 - 200, game.height - 150, 400, 400, 'Blackjack', {
main: {
backgroundColour: toColour(secondaryColour[0], secondaryColour[1], secondaryColour[2], 0),
},
title: {
textSize: 11.0,
textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255),
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], windowTitleAlpha),
},
icon: {
textSize: 0.0,
textColour: toColour(0, 0, 0, 0),
backgroundColour: toColour(0, 0, 0, 0),
},
});
blackJackGUI.window.titleBarShown = false;
blackJackGUI.window.shown = false;
logToConsole(LOG_DEBUG, `[AGRP.GUI] Created blackjack GUI`);
}
// ===========================================================================

View File

@@ -0,0 +1,9 @@
// ===========================================================================
// Asshat Gaming Roleplay
// https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// ===========================================================================
// FILE: housemgr.js
// DESC: Provides house manager GUI
// TYPE: Client (JavaScript)
// ===========================================================================

View File

@@ -0,0 +1,84 @@
// ===========================================================================
// Asshat Gaming Roleplay
// https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// ===========================================================================
// FILE: info.js
// DESC: Provides info dialog box GUI
// TYPE: Client (JavaScript)
// ===========================================================================
let infoDialog = {
window: null,
messageLabel: null,
okayButton: null,
};
// ===========================================================================
function initInfoDialogGUI() {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Creating info dialog GUI ...`);
infoDialog.window = mexui.window(getScreenWidth() / 2 - 200, getScreenHeight() / 2 - 70, 400, 140, 'Information', {
main: {
backgroundColour: toColour(secondaryColour[0], secondaryColour[1], secondaryColour[2], windowAlpha),
},
title: {
textSize: 11.0,
textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255),
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], windowTitleAlpha),
},
icon: {
textSize: 0.0,
textColour: toColour(0, 0, 0, 0),
backgroundColour: toColour(0, 0, 0, 0),
},
});
infoDialog.messageLabel = infoDialog.window.text(15, 50, 370, 20, 'Information Message', {
main: {
textSize: 10.0,
textAlign: 0.5,
textColour: toColour(255, 255, 255, 220),
textFont: mainFont,
},
focused: {
borderColour: toColour(0, 0, 0, 0),
},
});
infoDialog.okayButton = infoDialog.window.button(5, 105, 390, 30, 'OK', {
main: {
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255),
textSize: 10.0,
textFont: mainFont,
textAlign: 0.5,
},
focused: {
borderColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], 255),
},
}, closeInfoDialog);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Created info dialog GUI`);
}
// ===========================================================================
function closeInfoDialog() {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Closing info dialog`);
infoDialog.window.shown = false;
mexui.setInput(false);
}
// ===========================================================================
function showInfoGUI(infoMessage, infoTitle, buttonText) {
closeAllWindows();
logToConsole(LOG_DEBUG, `[AGRP.GUI] Showing info dialog window. Info: ${infoTitle} - ${infoMessage}`);
mexui.setInput(true);
infoDialog.messageLabel.text = infoMessage;
infoDialog.okayButton.text = buttonText;
infoDialog.window.title = infoTitle;
infoDialog.window.shown = true;
}
// ===========================================================================

View File

@@ -0,0 +1,45 @@
// ===========================================================================
// Asshat Gaming Roleplay
// https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// ===========================================================================
// FILE: inventory.js
// DESC: Provides inventory dialog box GUI
// TYPE: Client (JavaScript)
// ===========================================================================
let inventoryGUI = [
{
window: null,
},
{
window: null,
},
];
// ===========================================================================
function initInventoryGUI() {
}
// ===========================================================================
function closeAllInventoryGUI() {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Closing all inventory GUI`);
for (let i in inventoryGUI) {
inventoryGUI[i].window.shown = false;
}
mexui.setInput(false);
}
// ===========================================================================
function showInventoryGUI(inventoryIndex, items) {
closeAllWindows();
logToConsole(LOG_DEBUG, `[AGRP.GUI] Showing inventory window. Index: ${inventoryIndex}`);
inventoryGUI[inventoryIndex].window.shown = true;
mexui.setInput(true);
}
// ===========================================================================

View File

@@ -0,0 +1,45 @@
// ===========================================================================
// Asshat Gaming Roleplay
// https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// ===========================================================================
// FILE: inventorybulk.js
// DESC: Provides bulk inventory box GUI
// TYPE: Client (JavaScript)
// ===========================================================================
let inventoryBulkGUI = [
{
window: null,
},
{
window: null,
},
];
// ===========================================================================
function initInventoryBulkGUI() {
}
// ===========================================================================
function closeAllInventoryBulkGUI() {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Closing all bulk inventory GUI`);
for (let i in inventoryBulkGUI) {
inventoryBulkGUI[i].window.shown = false;
}
mexui.setInput(false);
}
// ===========================================================================
function showInventoryBulkGUI(inventoryIndex, items) {
closeAllWindows();
logToConsole(LOG_DEBUG, `[AGRP.GUI] Showing bulk inventory window. Index: ${inventoryIndex}`);
inventoryBulkGUI[inventoryIndex].window.shown = true;
mexui.setInput(true);
}
// ===========================================================================

147
scripts/client/gui/list.js Normal file
View File

@@ -0,0 +1,147 @@
// ===========================================================================
// Asshat Gaming Roleplay
// https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// ===========================================================================
// FILE: list.js
// DESC: Provides simple list GUI
// TYPE: Client (JavaScript)
// ===========================================================================
let listDialog = {
window: null,
messageLabel: null,
listGrid: null,
listRows: [],
};
// ===========================================================================
function initListGUI() {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Creating list dialog GUI ...`);
listDialog.window = mexui.window(game.width / 2 - 200, game.height / 2 - 70, 400, 500, 'List', {
main: {
backgroundColour: toColour(secondaryColour[0], secondaryColour[1], secondaryColour[2], windowAlpha),
},
title: {
textSize: 11.0,
textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255),
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], windowTitleAlpha),
},
icon: {
textSize: 11.0,
textColour: toColour(255, 255, 255, 255),
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], windowTitleAlpha),
hover: {
backgroundColour: toColour(205, 60, 60, windowTitleAlpha),
},
},
});
listDialog.messageLabel = infoDialog.window.text(5, 5, 390, 20, 'Select one', {
main: {
textSize: 10.0,
textAlign: 0.5,
textColour: toColour(255, 255, 255, 220),
textFont: mainFont,
},
focused: {
borderColour: toColour(0, 0, 0, 0),
},
});
listDialog.listGrid = listDialog.window.grid(5, 25, 390, 450, {
main: {
backgroundColour: toColour(secondaryColour[0], secondaryColour[1], secondaryColour[2], windowAlpha),
},
column: {
lineColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], windowTitleAlpha),
},
header: {
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], windowTitleAlpha - 50),
textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], windowTitleAlpha),
},
cell: {
backgroundColour: toColour(secondaryColour[0], secondaryColour[1], secondaryColour[2], windowAlpha),
textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], windowTitleAlpha),
},
row: {
lineColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], windowTitleAlpha),
hover: {
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], 120),
}
}
});
logToConsole(LOG_DEBUG, `[AGRP.GUI] Created list dialog GUI`);
}
// ===========================================================================
function showListGUI() {
closeAllWindows();
logToConsole(LOG_DEBUG, `[AGRP.GUI] Showing list window`);
setChatWindowEnabled(false);
mexui.setInput(true);
listDialog.window.shown = true;
guiSubmitKey = checkListDialogSelection;
guiUpKey = selectPreviousListItem;
guiDownKey = selectNextListItem;
}
// ===========================================================================
function checkListDialogSelection() {
if (!listDialog.listGrid.activeRow) {
return false;
}
sendNetworkEventToServer("agrp.list.select", listDialog.listGrid.activeRow.getEntryIndex());
}
// ===========================================================================
function selectPreviousListItem() {
if (!listDialog.listGrid.activeRow) {
return false;
}
let activeRowId = listDialog.listGrid.activeRow.getEntryIndex();
if (activeRowId <= 1) {
listDialog.listGrid.activeRow = 0;
} else {
listDialog.listGrid.activeRow = listDialog.listRows[activeRowId - 1];
}
//sendNetworkEventToServer("agrp.list.next", listDialog.listGrid.activeRow.getEntryIndex());
}
// ===========================================================================
function selectNextListItem() {
let activeRowId = listDialog.listGrid.activeRow.getEntryIndex();
if (activeRowId >= listDialog.listRows.length - 1) {
listDialog.listGrid.activeRow = 0;
} else {
listDialog.listGrid.activeRow = listDialog.listRows[activeRowId + 1];
}
//sendNetworkEventToServer("agrp.list.next", listDialog.listGrid.activeRow.getEntryIndex());
}
// ===========================================================================
function clearListGUI() {
listDialog.listGrid.removeAllEntries();
}
// ===========================================================================
function populateListGUI(listItems) {
for (let i in listItems) {
let row = listDialog.listGrid.row(listItems[i]);
listDialog.listRows.push(row);
}
}
// ===========================================================================

View File

@@ -0,0 +1,126 @@
// ===========================================================================
// Asshat Gaming Roleplay
// https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// ===========================================================================
// FILE: localechooser.js
// DESC: Provides locale chooser GUI
// TYPE: Client (JavaScript)
// ===========================================================================
let localeChooser = {
window: null,
flagImages: [],
activeRingImages: [],
};
let flagImageSize = toVector2(30, 30);
let flagImageGap = toVector2(5, 5);
// ===========================================================================
function initLocaleChooserGUI() {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Creating locale chooser GUI ...`);
localeChooser.window = mexui.window(game.width / 2 - 200, game.height - 150, 60, 60, 'Choose a language', {
main: {
backgroundColour: toColour(secondaryColour[0], secondaryColour[1], secondaryColour[2], 0),
},
title: {
textSize: 11.0,
textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255),
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], windowTitleAlpha),
},
icon: {
textSize: 0.0,
textColour: toColour(0, 0, 0, 0),
backgroundColour: toColour(0, 0, 0, 0),
},
});
localeChooser.window.titleBarShown = false;
localeChooser.window.shown = false;
logToConsole(LOG_DEBUG, `[AGRP.GUI] Created locale chooser GUI`);
}
// ===========================================================================
function closeLocaleChooserGUI() {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Closing locale chooser window`);
localeChooser.window.shown = false;
for (let i in localeChooser.flagImages) {
localeChooser.flagImages[i].shown = false;
}
mexui.setInput(false);
}
// ===========================================================================
function showLocaleChooserGUI(position = toVector2(0.0, 0.0)) {
if (position.x != 0.0 && position.y != 0.0) {
localeChooser.window.position = position;
} else {
localeChooser.window.position = toVector2((getScreenWidth() / 2) - (localeChooser.window.size.x / 2), getScreenHeight() - 100);
}
//closeAllWindows();
logToConsole(LOG_DEBUG, `[AGRP.GUI] Showing locale chooser window`);
mexui.setInput(true);
localeChooser.window.shown = true;
for (let i in localeChooser.flagImages) {
localeChooser.flagImages[i].shown = true;
}
}
// ===========================================================================
function toggleLocaleChooserGUI() {
if (localeChooser.window.shown == true) {
closeLocaleChooserGUI();
} else {
showLocaleChooserGUI();
}
}
// ===========================================================================
function localeChooserSetLocale(localeId) {
logToConsole(LOG_DEBUG | LOG_WARN, `[AGRP.GUI] Asking server to change locale to ${localeId}`);
sendLocaleSelectToServer(localeId);
}
// ===========================================================================
function resetLocaleChooserOptions() {
logToConsole(LOG_DEBUG | LOG_WARN, `[AGRP.GUI] Resetting locale chooser options`);
// let tempLocaleOptions = getServerData().localeOptions; // getAvailableLocaleOptions();
let tempLocaleOptions = getAvailableLocaleOptions();
localeChooser.window.size = toVector2((tempLocaleOptions.length * (flagImageSize.x + flagImageGap.x)) + flagImageGap.x, flagImageSize.y + flagImageGap.y * 2);
localeChooser.window.position = toVector2((getScreenWidth() / 2) - (localeChooser.window.size.x / 2), getScreenHeight() - 100);
for (let i in localeChooser.flagImages) {
localeChooser.flagImages[i].remove();
}
for (let i in tempLocaleOptions) {
let imagePath = `files/images/flags/${tempLocaleOptions[i].flagImageFile}`;
localeChooser.flagImages[i] = localeChooser.window.image((i * (flagImageSize.x + flagImageGap.x)) + flagImageGap.x, flagImageGap.y, flagImageSize.x, flagImageSize.y, imagePath, {
focused: {
borderColour: toColour(0, 0, 0, 0),
},
}, function () {
localeChooserSetLocale(tempLocaleOptions[i].id);
});
localeChooser.flagImages[i].shown = false;
logToConsole(LOG_DEBUG | LOG_WARN, `[AGRP.GUI] Created locale chooser option ${tempLocaleOptions[i].englishName} with image ${imagePath}`);
//localeChooser.activeRingImages.push(activeRingImage);
}
}
// ===========================================================================

199
scripts/client/gui/login.js Normal file
View File

@@ -0,0 +1,199 @@
// ===========================================================================
// Asshat Gaming Roleplay
// https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// ===========================================================================
// FILE: login.js
// DESC: Provides login GUI
// TYPE: Client (JavaScript)
// ===========================================================================
let login = {
window: null,
logoImage: null,
messageLabel: null,
passwordInput: null,
loginButton: null,
forgotPasswordButton: null,
resetPasswordLabel: null,
};
// ===========================================================================
let loginHTML =
`<html>
<head>
<title>Asshat Gaming Roleplay: Login</title>
<style type="text/css" rel="stylesheet">
.input-box
{
font-family: "Roboto";
font-size: 14px;
border-style: solid;
border-colour: #0066AA;
border-radius: 2px;
color: #0066AA;
};
</style>
</head>
<body>
</body>
</html>`;
// ===========================================================================
function initLoginGUI() {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Creating login GUI ...`);
login.window = mexui.window(getScreenWidth() / 2 - 150, getScreenHeight() / 2 - 135, 300, 275, 'LOGIN', {
main: {
backgroundColour: toColour(secondaryColour[0], secondaryColour[1], secondaryColour[2], windowAlpha),
transitionTime: 500,
},
title: {
textSize: 0.0,
textColour: toColour(0, 0, 0, 0),
},
icon: {
textSize: 0.0,
textColour: toColour(0, 0, 0, 0),
},
focused: {
borderColour: toColour(0, 0, 0, 0),
},
});
login.window.titleBarIconSize = toVector2(0, 0);
login.window.titleBarHeight = 0;
login.window.titleBarShown = false;
login.logoImage = login.window.image(100, 20, 100, 100, mainLogoPath, {
focused: {
borderColour: toColour(0, 0, 0, 0),
},
});
login.messageLabel = login.window.text(20, 135, 260, 20, 'Please enter your password!', {
main: {
textSize: 10.0,
textAlign: 0.5,
textColour: toColour(200, 200, 200, 255),
textFont: mainFont,
},
focused: {
borderColour: toColour(0, 0, 0, 0),
},
});
login.passwordInput = login.window.textInput(20, 170, 260, 25, '', {
main: {
backgroundColour: toColour(0, 0, 0, 120),
borderColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], textInputAlpha),
textColour: toColour(200, 200, 200, 255),
textSize: 10.0,
textFont: mainFont,
},
caret: {
lineColour: toColour(255, 255, 255, 255),
},
placeholder: {
textColour: toColour(200, 200, 200, 150),
textSize: 10.0,
textFont: mainFont,
},
focused: {
borderColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], 255),
},
});
login.passwordInput.masked = true;
login.passwordInput.placeholder = "Password";
login.loginButton = login.window.button(20, 205, 260, 30, 'LOGIN', {
main: {
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255),
textSize: 12.0,
textFont: mainFont,
textAlign: 0.5,
},
focused: {
borderColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
},
}, checkLogin);
login.forgotPasswordButton = login.window.button(180, 240, 100, 15, 'RESET PASS', {
main: {
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255),
textSize: 8.0,
textFont: mainFont,
textAlign: 0.5,
},
focused: {
borderColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
},
}, switchToPasswordResetGUI);
login.resetPasswordLabel = login.window.text(110, 240, 60, 15, 'Forgot your password?', {
main: {
textSize: 8.0,
textAlign: 1.0,
textColour: toColour(180, 180, 180, 255),
textFont: mainFont,
},
focused: {
borderColour: toColour(0, 0, 0, 0),
},
});
logToConsole(LOG_DEBUG, `[AGRP.GUI] Created login GUI`);
}
// ===========================================================================
function showLoginGUI() {
closeAllWindows();
logToConsole(LOG_DEBUG, `[AGRP.GUI] Showing login window`);
setChatWindowEnabled(false);
mexui.setInput(true);
login.window.shown = true;
mexui.focusedControl = login.passwordInput;
guiSubmitKey = checkLogin;
showLocaleChooserGUI(new Vec2(getScreenWidth() / 2 - (localeChooser.window.size.x / 2), login.window.position.y + login.window.size.y + 20));
//showSmallGameMessage(`If you don't have a mouse cursor, press ${toUpperCase(getKeyNameFromId(disableGUIKey))} to disable GUI`, COLOUR_WHITE, 7500);
}
// ===========================================================================
function checkLogin() {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Checking login with server ...`);
sendNetworkEventToServer("agrp.checkLogin", login.passwordInput.lines[0]);
}
// ===========================================================================
function loginFailed(errorMessage) {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Server reports login failed`);
login.messageLabel.text = errorMessage;
login.messageLabel.styles.main.textColour = toColour(180, 32, 32, 255);
login.passwordInput.text = "";
}
// ===========================================================================
function loginSuccess() {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Server reports login was successful`);
guiSubmitKey = false;
closeAllWindows();
}
// ===========================================================================
function switchToPasswordResetGUI() {
//closeAllWindows();
//logToConsole(LOG_DEBUG, `[AGRP.GUI] Showing password reset dialog window`);
//showResetPasswordGUI();
sendNetworkEventToServer("agrp.checkResetPassword", "");
return false;
}
// ===========================================================================

View File

@@ -0,0 +1,167 @@
// ===========================================================================
// Asshat Gaming Roleplay
// https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// ===========================================================================
// FILE: newchar.js
// DESC: Provides new character creation GUI
// TYPE: Client (JavaScript)
// ===========================================================================
let newCharacter = {
window: null,
messageLabel: null,
firstNameInput: null,
lastNameInput: null,
createCharacterButton: null,
mainLogoImage: null,
};
// ===========================================================================
function initNewCharacterGUI() {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Creating new character GUI ...`);
newCharacter.window = mexui.window(getScreenWidth() / 2 - 130, getScreenHeight() / 2 - 115, 300, 230, 'NEW CHARACTER', {
main: {
backgroundColour: toColour(secondaryColour[0], secondaryColour[1], secondaryColour[2], windowAlpha),
transitionTime: 500,
},
title: {
textSize: 12.0,
textFont: mainFont,
textColour: toColour(0, 0, 0, 0),
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], windowTitleAlpha),
},
icon: {
textSize: 0.0,
textColour: toColour(0, 0, 0, 0),
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], windowTitleAlpha),
}
});
newCharacter.window.titleBarIconSize = toVector2(0, 0);
newCharacter.window.titleBarIconShown = false;
newCharacter.window.titleBarShown = false;
newCharacter.window.titleBarHeight = 30;
newCharacter.mainLogoImage = newCharacter.window.image(80, 20, 80, 80, mainLogoPath, {
focused: {
borderColour: toColour(0, 0, 0, 0),
},
});
newCharacter.messageLabel = newCharacter.window.text(20, 100, 260, 20, 'Name your character', {
main: {
textSize: 10.0,
textAlign: 0.5,
textColour: toColour(200, 200, 200, 255),
textFont: mainFont,
},
focused: {
borderColour: toColour(0, 0, 0, 0),
},
});
newCharacter.firstNameInput = newCharacter.window.textInput(20, 125, 260, 25, '', {
main: {
backgroundColour: toColour(0, 0, 0, 120),
textColour: toColour(200, 200, 200, 255),
textSize: 10.0,
textFont: mainFont,
},
caret: {
lineColour: toColour(255, 255, 255, 255),
},
placeholder: {
backgroundColour: toColour(0, 0, 0, 120),
textColour: toColour(200, 200, 200, 200),
textSize: 10.0,
textFont: mainFont,
}
});
newCharacter.firstNameInput.placeholder = "First Name";
newCharacter.lastNameInput = newCharacter.window.textInput(20, 155, 260, 25, '', {
main: {
backgroundColour: toColour(0, 0, 0, 120),
textColour: toColour(200, 200, 200, 255),
textSize: 10.0,
textFont: mainFont,
},
caret: {
lineColour: toColour(255, 255, 255, 255),
},
placeholder: {
backgroundColour: toColour(0, 0, 0, 120),
textColour: toColour(150, 150, 150, 200),
textSize: 10.0,
textFont: mainFont,
}
});
newCharacter.lastNameInput.placeholder = "Last Name";
newCharacter.createCharacterButton = newCharacter.window.button(20, 185, 260, 25, 'CREATE CHARACTER', {
main: {
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
textColour: toColour(255, 255, 255, 255),
textSize: 10.0,
textFont: mainFont,
textAlign: 0.5,
},
focused: {
borderColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
},
}, checkNewCharacter);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Created new character GUI`);
}
// ===========================================================================
function newCharacterFailed(errorMessage) {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Server reports new character creation failed. Reason: ${errorMessage}`);
newCharacter.messageLabel.text = errorMessage;
newCharacter.messageLabel.styles.main.textColour = toColour(180, 32, 32, 255);
newCharacter.firstNameInput.text = "";
newCharacter.lastNameInput.text = "";
if (!newCharacter.window.shown) {
closeAllWindows();
setChatWindowEnabled(false);
mexui.setInput(true);
setHUDEnabled(false);
newCharacter.window.shown = true;
}
}
// ===========================================================================
function checkNewCharacter() {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Checking new character with server ...`);
if (newCharacter.firstNameInput.lines[0].length < 2) {
return false;
}
if (newCharacter.lastNameInput.lines[0].length < 2) {
return false;
}
sendNetworkEventToServer("agrp.checkNewCharacter",
newCharacter.firstNameInput.lines[0],
newCharacter.lastNameInput.lines[0],
);
}
// ===========================================================================
function showNewCharacterGUI() {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Showing new character window`);
closeAllWindows();
setChatWindowEnabled(false);
mexui.setInput(true);
newCharacter.window.shown = true;
mexui.focusedInput = newCharacter.firstNameInput;
guiSubmitKey = checkNewCharacter;
showLocaleChooserGUI(new Vec2(getScreenWidth() / 2 - (localeChooser.window.size.x / 2), newCharacter.window.position.y + newCharacter.window.size.y + 20));
}
// ===========================================================================

View File

@@ -0,0 +1,179 @@
// ===========================================================================
// Asshat Gaming Roleplay
// https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// ===========================================================================
// FILE: register.js
// DESC: Provides account registration GUI
// TYPE: Client (JavaScript)
// ===========================================================================
let register = {
window: null,
logoImage: null,
messageLabel: null,
passwordInput: null,
confirmPasswordInput: null,
emailInput: null,
registerButton: null,
};
// ===========================================================================
function initRegisterGUI() {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Creating register GUI ...`);
register.window = mexui.window(getScreenWidth() / 2 - 150, getScreenHeight() / 2 - 150, 300, 300, 'Register', {
main: {
backgroundColour: toColour(secondaryColour[0], secondaryColour[1], secondaryColour[2], windowAlpha),
transitionTime: 500,
},
title: {
textSize: 0.0,
textColour: toColour(0, 0, 0, 0),
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], windowTitleAlpha),
},
icon: {
textSize: 0.0,
textColour: toColour(0, 0, 0, 0),
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], windowTitleAlpha),
}
});
register.window.titleBarIconSize = toVector2(0, 0);
register.window.titleBarHeight = 0;
register.window.titleBarShown = false;
register.window.image(100, 20, 100, 100, mainLogoPath, {
focused: {
borderColour: toColour(0, 0, 0, 0),
},
});
register.messageLabel = register.window.text(20, 125, 260, 20, 'Create an account', {
main: {
textSize: 10.0,
textAlign: 0.5,
textColour: toColour(200, 200, 200, 255),
textFont: mainFont,
},
focused: {
borderColour: toColour(0, 0, 0, 0),
},
});
register.passwordInput = register.window.textInput(20, 150, 260, 25, '', {
main: {
backgroundColour: toColour(0, 0, 0, 120),
textColour: toColour(200, 200, 200, 255),
textSize: 10.0,
textFont: mainFont,
},
caret: {
lineColour: toColour(255, 255, 255, 255),
},
placeholder: {
backgroundColour: toColour(0, 0, 0, 120),
textColour: toColour(200, 200, 200, 200),
textSize: 10.0,
textFont: mainFont,
}
});
register.passwordInput.masked = true;
register.passwordInput.placeholder = "Password";
register.confirmPasswordInput = register.window.textInput(20, 180, 260, 25, '', {
main: {
backgroundColour: toColour(0, 0, 0, 120),
textColour: toColour(200, 200, 200, 255),
textSize: 10.0,
textFont: mainFont,
},
caret: {
lineColour: toColour(255, 255, 255, 255),
},
placeholder: {
backgroundColour: toColour(0, 0, 0, 120),
textColour: toColour(200, 200, 200, 200),
textSize: 10.0,
textFont: mainFont,
}
});
register.confirmPasswordInput.masked = true;
register.confirmPasswordInput.placeholder = "Confirm password";
register.emailInput = register.window.textInput(20, 210, 260, 25, '', {
main: {
backgroundColour: toColour(0, 0, 0, 120),
textColour: toColour(200, 200, 200, 255),
textSize: 10.0,
textFont: mainFont,
},
caret: {
lineColour: toColour(255, 255, 255, 255),
},
placeholder: {
backgroundColour: toColour(0, 0, 0, 120),
textColour: toColour(200, 200, 200, 200),
textSize: 10.0,
textFont: mainFont,
}
});
register.emailInput.placeholder = "Email";
register.registerButton = register.window.button(20, 245, 260, 30, 'CREATE ACCOUNT', {
main: {
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
textColour: toColour(255, 255, 255, 255),
textSize: 12.0,
textFont: mainFont,
textAlign: 0.5,
},
focused: {
borderColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
},
}, checkRegistration);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Created register GUI`);
}
// ===========================================================================
function registrationFailed(errorMessage) {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Server reports registration failed. Reason: ${errorMessage}`);
register.messageLabel.text = errorMessage;
register.messageLabel.styles.main.textColour = toColour(180, 32, 32, 255);
register.passwordInput.text = "";
register.confirmPasswordInput.text = "";
register.emailInput.text = "";
}
// ===========================================================================
function checkRegistration() {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Checking registration with server ...`);
sendNetworkEventToServer("agrp.checkRegistration", register.passwordInput.lines[0], register.confirmPasswordInput.lines[0], register.emailInput.lines[0]);
}
// ===========================================================================
function showRegistrationGUI() {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Showing registration window`);
closeAllWindows();
setChatWindowEnabled(false);
mexui.setInput(true);
register.window.shown = true;
mexui.focusedControl = register.passwordInput;
guiSubmitKey = checkRegistration;
showLocaleChooserGUI(new Vec2(getScreenWidth() / 2 - (localeChooser.window.size.x / 2), register.window.position.y + register.window.size.y + 20));
//showSmallGameMessage(`If you don't have a mouse cursor, press ${toUpperCase(getKeyNameFromId(disableGUIKey))} to disable GUI`, COLOUR_WHITE, 7500);
}
// ===========================================================================
function registrationSuccess() {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Server reports registration was successful`);
guiSubmitKey = false;
closeAllWindows();
}
// ===========================================================================

View File

@@ -0,0 +1,196 @@
// ===========================================================================
// Asshat Gaming Roleplay
// https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// ===========================================================================
// FILE: resetpass.js
// DESC: Provides password reset GUI
// TYPE: Client (JavaScript)
// ===========================================================================
let passwordReset = {
window: null,
logoImage: null,
messageLabel: null,
emailInput: null,
resetPasswordButton: null,
backToLoginButton: null,
backToLoginLabel: null,
};
// ===========================================================================
function initResetPasswordGUI() {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Creating password reset GUI ...`);
passwordReset.window = mexui.window(getScreenWidth() / 2 - 150, getScreenHeight() / 2 - 135, 300, 275, 'RESET PASSWORD', {
main: {
backgroundColour: toColour(secondaryColour[0], secondaryColour[1], secondaryColour[2], windowAlpha),
transitionTime: 500,
},
title: {
textSize: 0.0,
textColour: toColour(0, 0, 0, 0),
},
icon: {
textSize: 0.0,
textColour: toColour(0, 0, 0, 0),
},
focused: {
borderColour: toColour(0, 0, 0, 0),
},
});
passwordReset.window.titleBarIconSize = toVector2(0, 0);
passwordReset.window.titleBarHeight = 0;
passwordReset.window.titleBarShown = false;
passwordReset.logoImage = passwordReset.window.image(100, 20, 100, 100, mainLogoPath, {
focused: {
borderColour: toColour(0, 0, 0, 0),
},
});
passwordReset.messageLabel = passwordReset.window.text(20, 135, 260, 20, 'Please confirm your email', {
main: {
textSize: 10.0,
textAlign: 0.5,
textColour: toColour(200, 200, 200, 255),
textFont: mainFont,
},
focused: {
borderColour: toColour(0, 0, 0, 0),
},
});
passwordReset.emailInput = passwordReset.window.textInput(20, 170, 260, 25, '', {
main: {
backgroundColour: toColour(0, 0, 0, 120),
borderColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], textInputAlpha),
textColour: toColour(200, 200, 200, 255),
textSize: 10.0,
textFont: mainFont,
},
caret: {
lineColour: toColour(255, 255, 255, 255),
},
placeholder: {
textColour: toColour(200, 200, 200, 150),
textSize: 10.0,
textFont: mainFont,
},
focused: {
borderColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], 255),
},
});
passwordReset.emailInput.placeholder = "Email";
passwordReset.resetPasswordButton = passwordReset.window.button(20, 205, 260, 30, 'RESET PASSWORD', {
main: {
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255),
textSize: 12.0,
textFont: mainFont,
textAlign: 0.5,
},
focused: {
borderColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
},
}, checkResetPassword);
passwordReset.backToLoginButton = passwordReset.window.button(200, 240, 80, 15, 'LOGIN', {
main: {
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255),
textSize: 8.0,
textFont: mainFont,
textAlign: 0.5,
},
focused: {
borderColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
},
}, switchToLoginGUI);
passwordReset.backToLoginLabel = passwordReset.window.text(110, 240, 60, 15, 'Remember your password?', {
main: {
textSize: 8.0,
textAlign: 1.0,
textColour: toColour(200, 200, 200, 255),
textFont: mainFont,
},
focused: {
borderColour: toColour(0, 0, 0, 0),
},
});
logToConsole(LOG_DEBUG, `[AGRP.GUI] Created password reset GUI`);
}
// ===========================================================================
function showResetPasswordGUI() {
closeAllWindows();
logToConsole(LOG_DEBUG, `[AGRP.GUI] Showing password reset window`);
setChatWindowEnabled(false);
mexui.setInput(true);
passwordReset.window.shown = true;
mexui.focusedControl = passwordReset.emailInput;
guiSubmitKey = checkResetPassword;
showLocaleChooserGUI(new Vec2(getScreenWidth() / 2 - (localeChooser.window.size.x / 2), passwordReset.window.position.y + passwordReset.window.size.y + 20));
//showSmallGameMessage(`If you don't have a mouse cursor, press ${toUpperCase(getKeyNameFromId(disableGUIKey))} to disable GUI`, COLOUR_WHITE, 7500);
}
// ===========================================================================
function checkResetPassword() {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Checking password reset with server (${passwordReset.emailInput.lines[0]}) ...`);
sendNetworkEventToServer("agrp.checkResetPassword", passwordReset.emailInput.lines[0]);
}
// ===========================================================================
function resetPasswordFailed(errorMessage) {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Server reports password reset failed`);
passwordReset.messageLabel.text = errorMessage;
passwordReset.messageLabel.styles.main.textColour = toColour(180, 32, 32, 255);
passwordReset.emailInput.text = "";
}
// ===========================================================================
function resetPasswordCodeInputGUI() {
logToConsole(LOG_DEBUG | LOG_WARN, `[AGRP.GUI] Server reports password reset email confirmation was successful. Asking for code ...`);
closeAllWindows();
passwordReset.messageLabel.text = getLocaleString("GUIResetPasswordCodeInputLabel");
//passwordReset.messageLabel.styles.main.textColour = toColour(180, 32, 32, 255);
passwordReset.emailInput.lines[0] = "";
passwordReset.emailInput.placeholder = getLocaleString("GUIResetPasswordCodePlaceholder");
guiSubmitKey = checkResetPassword;
showResetPasswordGUI();
}
// ===========================================================================
function resetPasswordEmailInputGUI() {
logToConsole(LOG_DEBUG | LOG_WARN, `[AGRP.GUI] Server reports password reset request was approved. Asking for email ...`);
closeAllWindows();
passwordReset.messageLabel.text = getLocaleString("GUIResetPasswordConfirmEmailLabel");
//passwordReset.messageLabel.styles.main.textColour = toColour(180, 32, 32, 255);
passwordReset.emailInput.text = "";
passwordReset.emailInput.placeholder = getLocaleString("GUIResetPasswordEmailPlaceholder");
guiSubmitKey = checkResetPassword;
showResetPasswordGUI();
}
// ===========================================================================
function switchToLoginGUI() {
guiSubmitKey = false;
closeAllWindows();
showLoginGUI();
}
// ===========================================================================

116
scripts/client/gui/yesno.js Normal file
View File

@@ -0,0 +1,116 @@
// ===========================================================================
// Asshat Gaming Roleplay
// https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// ===========================================================================
// FILE: yesno.js
// DESC: Provides yes/no prompt dialog GUI
// TYPE: Client (JavaScript)
// ===========================================================================
let yesNoDialog = {
window: null,
messageLabel: null,
yesButton: null,
noButton: null,
};
// ===========================================================================
function initYesNoDialogGUI() {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Created prompt GUI ...`);
yesNoDialog.window = mexui.window(game.width / 2 - 200, game.height / 2 - 70, 400, 140, 'Question', {
main: {
backgroundColour: toColour(secondaryColour[0], secondaryColour[1], secondaryColour[2], windowAlpha),
transitionTime: 500,
},
title: {
textSize: 11.0,
textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255),
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], windowTitleAlpha),
},
icon: {
textSize: 0.0,
textColour: toColour(0, 0, 0, 0),
backgroundColour: toColour(0, 0, 0, 0),
},
});
yesNoDialog.messageLabel = yesNoDialog.window.text(15, 50, 370, 20, 'Would you like to answer this question?', {
main: {
textSize: 10.0,
textAlign: 0.5,
textColour: toColour(255, 255, 255, 255),
textFont: mainFont,
},
focused: {
borderColour: toColour(0, 0, 0, 0),
},
});
yesNoDialog.yesButton = yesNoDialog.window.button(5, 105, 193, 30, 'YES', {
main: {
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255),
textSize: 10.0,
textFont: mainFont,
textAlign: 0.5,
},
focused: {
borderColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], 255),
},
}, yesNoDialogAnswerYes);
yesNoDialog.noButton = yesNoDialog.window.button(203, 105, 192, 30, 'NO', {
main: {
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255),
textSize: 10.0,
textFont: mainFont,
textAlign: 0.5,
},
focused: {
borderColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], 255),
},
}, yesNoDialogAnswerNo);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Created prompt GUI`);
}
// ===========================================================================
function showYesNoPromptGUI(promptMessage, promptTitle, yesButtonText, noButtonText) {
closeAllWindows();
logToConsole(LOG_DEBUG, `[AGRP.GUI] Showing prompt window. Prompt: ${promptTitle} - ${promptMessage}`);
mexui.setInput(true);
yesNoDialog.messageLabel.text = "";
yesNoDialog.yesButton.text = "";
yesNoDialog.noButton.text = "";
yesNoDialog.window.title = "";
yesNoDialog.messageLabel.text = promptMessage;
yesNoDialog.yesButton.text = yesButtonText;
yesNoDialog.noButton.text = noButtonText;
yesNoDialog.window.title = promptTitle;
yesNoDialog.window.shown = true;
}
// ===========================================================================
function yesNoDialogAnswerNo() {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Responding with answer NO to server prompt`);
sendNetworkEventToServer("agrp.promptAnswerNo");
closeAllWindows();
}
// ===========================================================================
function yesNoDialogAnswerYes() {
logToConsole(LOG_DEBUG, `[AGRP.GUI] Responding with answer YES to server prompt`);
sendNetworkEventToServer("agrp.promptAnswerYes");
closeAllWindows();
}
// ===========================================================================

View File

@@ -1,6 +1,7 @@
// =========================================================================== // ===========================================================================
// Vortrex's Roleplay Resource // Asshat Gaming Roleplay
// https://github.com/VortrexFTW/gtac_roleplay // https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// =========================================================================== // ===========================================================================
// FILE: house.js // FILE: house.js
// DESC: Provides house functions and usage // DESC: Provides house functions and usage
@@ -16,66 +17,82 @@ class HouseData {
this.blipModel = blipModel; this.blipModel = blipModel;
this.pickupModel = pickupModel; this.pickupModel = pickupModel;
this.hasInterior = hasInterior; this.hasInterior = hasInterior;
this.rentPrice = 0;
this.buyPrice = 0;
this.blipId = -1; this.blipId = -1;
this.locked = false;
} }
} }
// =========================================================================== // ===========================================================================
function receiveHouseFromServer(houseId, description, entrancePosition, blipModel, pickupModel, hasInterior) { function receiveHouseFromServer(houseId, description, entrancePosition, blipModel, pickupModel, buyPrice, rentPrice, hasInterior, locked) {
logToConsole(LOG_DEBUG, `[VRR.House] Received house ${houseId} (${name}) from server`); logToConsole(LOG_DEBUG, `[AGRP.House] Received house ${houseId} (${name}) from server`);
if(!areServerElementsSupported()) { if (!areServerElementsSupported() || getGame() == AGRP_GAME_MAFIA_ONE || getGame() == AGRP_GAME_GTA_IV) {
if(getHouseData(houseId) != false) { if (getHouseData(houseId) != false) {
let houseData = getHouseData(houseId); let houseData = getHouseData(houseId);
houseData.description = description; houseData.description = description;
houseData.entrancePosition = entrancePosition; houseData.entrancePosition = entrancePosition;
houseData.blipModel = blipModel; houseData.blipModel = blipModel;
houseData.pickupModel = pickupModel; houseData.pickupModel = pickupModel;
houseData.hasInterior = hasInterior; houseData.hasInterior = hasInterior;
houseData.buyPrice = buyPrice;
houseData.rentPrice = rentPrice;
houseData.locked = locked;
logToConsole(LOG_DEBUG, `[VRR.House] House ${houseId} already exists. Checking blip ...`); if (houseData.buyPrice > 0) {
if(blipModel == -1) { houseData.labelInfoType = AGRP_PROPLABEL_INFO_BUYHOUSE;
if(houseData.blipId != -1) { } else {
logToConsole(LOG_DEBUG, `[VRR.House] House ${houseId}'s blip has been removed by the server`); if (houseData.rentPrice > 0) {
if(getGame() == VRR_GAME_GTA_IV) { houseData.labelInfoType = AGRP_PROPLABEL_INFO_RENTHOUSE;
} else {
houseData.labelInfoType = AGRP_PROPLABEL_INFO_ENTER;
}
}
logToConsole(LOG_DEBUG, `[AGRP.House] House ${houseId} already exists. Checking blip ...`);
if (blipModel == -1) {
if (houseData.blipId != -1) {
logToConsole(LOG_DEBUG, `[AGRP.House] House ${houseId}'s blip has been removed by the server`);
if (getGame() == AGRP_GAME_GTA_IV) {
natives.removeBlipAndClearIndex(getHouseData(houseId).blipId); natives.removeBlipAndClearIndex(getHouseData(houseId).blipId);
} else { } else {
destroyElement(getElementFromId(blipId)); destroyElement(getElementFromId(blipId));
} }
houseData.blipId = -1; houseData.blipId = -1;
} else { } else {
logToConsole(LOG_DEBUG, `[VRR.House] House ${houseId}'s blip is unchanged`); logToConsole(LOG_DEBUG, `[AGRP.House] House ${houseId}'s blip is unchanged`);
} }
} else { } else {
if(houseData.blipId != -1) { if (houseData.blipId != -1) {
logToConsole(LOG_DEBUG, `[VRR.House] House ${houseId}'s blip has been changed by the server`); logToConsole(LOG_DEBUG, `[AGRP.House] House ${houseId}'s blip has been changed by the server`);
if(getGame() == VRR_GAME_GTA_IV) { if (getGame() == AGRP_GAME_GTA_IV) {
natives.setBlipCoordinates(houseData.blipId, houseData.entrancePosition); natives.setBlipCoordinates(houseData.blipId, houseData.entrancePosition);
natives.changeBlipSprite(houseData.blipId, houseData.blipModel); natives.changeBlipSprite(houseData.blipId, houseData.blipModel);
natives.setBlipMarkerLongDistance(houseData.blipId, false); natives.setBlipMarkerLongDistance(houseData.blipId, false);
natives.setBlipAsShortRange(houseData.blipId, true); natives.setBlipAsShortRange(houseData.blipId, true);
natives.changeBlipNameFromAscii(houseData.blipId, `${houseData.name.substr(0, 24)}${(houseData.name.length > 24) ? " ...": ""}`); natives.changeBlipNameFromAscii(houseData.blipId, `${houseData.name.substr(0, 24)}${(houseData.name.length > 24) ? " ..." : ""}`);
} }
} else { } else {
let blipId = createGameBlip(houseData.blipModel, houseData.entrancePosition, houseData.name); let blipId = createGameBlip(houseData.blipModel, houseData.entrancePosition, houseData.name);
if(blipId != -1) { if (blipId != -1) {
houseData.blipId = blipId; houseData.blipId = blipId;
} }
logToConsole(LOG_DEBUG, `[VRR.House] House ${houseId}'s blip has been added by the server (Model ${blipModel}, ID ${blipId})`); logToConsole(LOG_DEBUG, `[AGRP.House] House ${houseId}'s blip has been added by the server (Model ${blipModel}, ID ${blipId})`);
} }
} }
} else { } else {
logToConsole(LOG_DEBUG, `[VRR.House] House ${houseId} doesn't exist. Adding ...`); logToConsole(LOG_DEBUG, `[AGRP.House] House ${houseId} doesn't exist. Adding ...`);
let tempHouseData = new HouseData(houseId, description, entrancePosition, blipModel, pickupModel, hasInterior); let tempHouseData = new HouseData(houseId, description, entrancePosition, blipModel, pickupModel, hasInterior);
if(blipModel != -1) { if (blipModel != -1) {
let blipId = createGameBlip(tempHouseData.blipModel, tempHouseData.entrancePosition, "House"); let blipId = createGameBlip(tempHouseData.blipModel, tempHouseData.entrancePosition, "House");
if(blipId != -1) { if (blipId != -1) {
tempHouseData.blipId = blipId; tempHouseData.blipId = blipId;
} }
logToConsole(LOG_DEBUG, `[VRR.House] House ${houseId}'s blip has been added by the server (Model ${blipModel}, ID ${blipId})`); logToConsole(LOG_DEBUG, `[AGRP.House] House ${houseId}'s blip has been added by the server (Model ${blipModel}, ID ${blipId})`);
} else { } else {
logToConsole(LOG_DEBUG, `[VRR.House] House ${houseId} has no blip.`); logToConsole(LOG_DEBUG, `[AGRP.House] House ${houseId} has no blip.`);
} }
getServerData().houses.push(tempHouseData); getServerData().houses.push(tempHouseData);
setAllHouseDataIndexes(); setAllHouseDataIndexes();
@@ -89,10 +106,10 @@ function receiveHouseFromServer(houseId, description, entrancePosition, blipMode
* @param {number} houseId - The ID of the house (initially provided by server) * @param {number} houseId - The ID of the house (initially provided by server)
* @return {HouseData} The house's data (class instance) * @return {HouseData} The house's data (class instance)
*/ */
function getHouseData(houseId) { function getHouseData(houseId) {
let houses = getServerData().houses; let houses = getServerData().houses;
for(let i in houses) { for (let i in houses) {
if(houses[i].houseId == houseId) { if (houses[i].houseId == houseId) {
return houses[i]; return houses[i];
} }
} }
@@ -103,7 +120,7 @@ function receiveHouseFromServer(houseId, description, entrancePosition, blipMode
// =========================================================================== // ===========================================================================
function setAllHouseDataIndexes() { function setAllHouseDataIndexes() {
for(let i in getServerData().houses) { for (let i in getServerData().houses) {
getServerData().houses[i].index = i; getServerData().houses[i].index = i;
} }
} }

34
scripts/client/index.js Normal file
View File

@@ -0,0 +1,34 @@
// For RAGEMP only
// Shared Scripts
require("shared/const.js");
require("shared/utilities.js");
require("shared/gamedata.js");
// Multiplayer Mod (Wrapped Natives)
require("native/ragemp.js");
// Client Scripts
require("gui.js");
require("main.js");
require("nametag.js");
require("sync.js");
require("scoreboard.js");
require("keybind.js");
require("chatbox.js");
require("label.js");
require("skin-select.js");
require("server.js");
require("job.js");
require("event.js");
require("item.js");
require("utilities.js");
require("messaging.js");
require("logo.js");
require("afk.js");
require("mousecam.js");
require("radio.js");
require("animation.js");
// Startup
require("startup.js");

View File

@@ -1,6 +1,7 @@
// =========================================================================== // ===========================================================================
// Vortrex's Roleplay Resource // Asshat Gaming Roleplay
// https://github.com/VortrexFTW/gtac_roleplay // https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// =========================================================================== // ===========================================================================
// FILE: item.js // FILE: item.js
// DESC: Provides item action and hotbar functions // DESC: Provides item action and hotbar functions
@@ -10,35 +11,35 @@
let itemActionDelayDuration = 0; let itemActionDelayDuration = 0;
let itemActionDelayStart = 0; let itemActionDelayStart = 0;
let itemActionDelayEnabled = false; let itemActionDelayEnabled = false;
let itemActionDelayPosition = toVector2(game.width/2-100, game.height-10); let itemActionDelayPosition = toVector2(game.width / 2 - 100, game.height - 10);
let itemActionDelaySize = toVector2(200, 5); let itemActionDelaySize = toVector2(200, 5);
// =========================================================================== // ===========================================================================
function initItemScript() { function initItemScript() {
logToConsole(LOG_DEBUG, "[VRR.Item]: Initializing item script ..."); logToConsole(LOG_DEBUG, "[AGRP.Item]: Initializing item script ...");
logToConsole(LOG_DEBUG, "[VRR.Item]: Item script initialized!"); logToConsole(LOG_DEBUG, "[AGRP.Item]: Item script initialized!");
} }
// =========================================================================== // ===========================================================================
function processItemActionRendering() { function processItemActionRendering() {
if(renderItemActionDelay) { if (renderItemActionDelay) {
if(itemActionDelayEnabled) { if (itemActionDelayEnabled) {
let finishTime = itemActionDelayStart+itemActionDelayDuration; let finishTime = itemActionDelayStart + itemActionDelayDuration;
if(sdl.ticks >= finishTime) { if (sdl.ticks >= finishTime) {
itemActionDelayEnabled = false; itemActionDelayEnabled = false;
itemActionDelayDuration = 0; itemActionDelayDuration = 0;
itemActionDelayStart = 0; itemActionDelayStart = 0;
tellServerItemActionDelayComplete(); tellServerItemActionDelayComplete();
} else { } else {
let currentTick = sdl.ticks-itemActionDelayStart; let currentTick = sdl.ticks - itemActionDelayStart;
let progressPercent = Math.ceil(currentTick*100/itemActionDelayDuration); let progressPercent = Math.ceil(currentTick * 100 / itemActionDelayDuration);
let width = Math.ceil(getPercentage(itemActionDelaySize.x, progressPercent)); let width = Math.ceil(getPercentage(itemActionDelaySize.x, progressPercent));
let backgroundColour = toColour(0, 0, 0, 255); let backgroundColour = toColour(0, 0, 0, 255);
graphics.drawRectangle(null, [itemActionDelayPosition.x-(itemActionDelaySize.x/2)-1, itemActionDelayPosition.y-(itemActionDelaySize.y/2)-1], [itemActionDelaySize.x+2, itemActionDelaySize.y+2], backgroundColour, backgroundColour, backgroundColour, backgroundColour); graphics.drawRectangle(null, [itemActionDelayPosition.x - (itemActionDelaySize.x / 2) - 1, itemActionDelayPosition.y - (itemActionDelaySize.y / 2) - 1], [itemActionDelaySize.x + 2, itemActionDelaySize.y + 2], backgroundColour, backgroundColour, backgroundColour, backgroundColour);
graphics.drawRectangle(null, [itemActionDelayPosition.x-(itemActionDelaySize.x/2), itemActionDelayPosition.y-(itemActionDelaySize.y/2)-2], [width, itemActionDelaySize.y], COLOUR_LIME, COLOUR_LIME, COLOUR_LIME, COLOUR_LIME); graphics.drawRectangle(null, [itemActionDelayPosition.x - (itemActionDelaySize.x / 2), itemActionDelayPosition.y - (itemActionDelaySize.y / 2) - 2], [width, itemActionDelaySize.y], COLOUR_LIME, COLOUR_LIME, COLOUR_LIME, COLOUR_LIME);
} }
} }
} }
@@ -47,7 +48,7 @@ function processItemActionRendering() {
// =========================================================================== // ===========================================================================
function updatePlayerHotBar(activeSlot, itemsArray) { function updatePlayerHotBar(activeSlot, itemsArray) {
logToConsole(LOG_DEBUG, `[VRR.Main] Updating hotbar`); logToConsole(LOG_DEBUG, `[AGRP.Main] Updating hotbar`);
} }
// =========================================================================== // ===========================================================================

View File

@@ -1,6 +1,7 @@
// =========================================================================== // ===========================================================================
// Vortrex's Roleplay Resource // Asshat Gaming Roleplay
// https://github.com/VortrexFTW/gtac_roleplay // https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// =========================================================================== // ===========================================================================
// FILE: job.js // FILE: job.js
// DESC: Provides job functions and usage // DESC: Provides job functions and usage
@@ -35,30 +36,31 @@ class JobData {
// =========================================================================== // ===========================================================================
function initJobScript() { function initJobScript() {
logToConsole(LOG_DEBUG, "[VRR.Job]: Initializing job script ..."); logToConsole(LOG_DEBUG, "[AGRP.Job]: Initializing job script ...");
logToConsole(LOG_DEBUG, "[VRR.Job]: Job script initialized!"); logToConsole(LOG_DEBUG, "[AGRP.Job]: Job script initialized!");
} }
// =========================================================================== // ===========================================================================
function setLocalPlayerJobType(tempJobType) { function setLocalPlayerJobType(tempJobType) {
logToConsole(LOG_DEBUG, `[VRR.Job] Set local player job type to ${tempJobType}`); logToConsole(LOG_DEBUG, `[AGRP.Job] Set local player job type to ${tempJobType}`);
localPlayerJobType = tempJobType; localPlayerJobType = tempJobType;
} }
// =========================================================================== // ===========================================================================
function setLocalPlayerWorkingState(tempWorking) { function setLocalPlayerWorkingState(tempWorking) {
logToConsole(LOG_DEBUG, `[VRR.Job] Setting working state to ${tempWorking}`); logToConsole(LOG_DEBUG, `[AGRP.Job] Setting working state to ${tempWorking}`);
localPlayerWorking = tempWorking; localPlayerWorking = tempWorking;
} }
// =========================================================================== // ===========================================================================
function showJobRouteLocation(position, colour) { function showJobRouteLocation(position, colour) {
logToConsole(LOG_DEBUG, `[VRR.Job] Showing job route location`); logToConsole(LOG_DEBUG, `[AGRP.Job] Showing job route location at ${position.x}, ${position.y}, ${position.z}`);
if(getMultiplayerMod() == VRR_MPMOD_GTAC) { hideJobRouteLocation();
if(getGame() == VRR_GAME_GTA_SA) { if (getMultiplayerMod() == AGRP_MPMOD_GTAC) {
if (getGame() == AGRP_GAME_GTA_SA) {
// Server-side spheres don't show in GTA SA for some reason. // Server-side spheres don't show in GTA SA for some reason.
jobRouteLocationSphere = game.createPickup(1318, position, 1); jobRouteLocationSphere = game.createPickup(1318, position, 1);
} else { } else {
@@ -66,7 +68,7 @@ function showJobRouteLocation(position, colour) {
jobRouteLocationSphere.colour = colour; jobRouteLocationSphere.colour = colour;
} }
if(jobRouteLocationBlip != null) { if (jobRouteLocationBlip != null) {
destroyElement(jobRouteLocationBlip); destroyElement(jobRouteLocationBlip);
} }
@@ -79,22 +81,8 @@ function showJobRouteLocation(position, colour) {
// =========================================================================== // ===========================================================================
function enteredJobRouteSphere() { function enteredJobRouteSphere() {
logToConsole(LOG_DEBUG, `[VRR.Job] Entered job route sphere`); logToConsole(LOG_DEBUG, `[AGRP.Job] Entered job route sphere`);
hideJobRouteLocation();
clearInterval(jobBlipBlinkTimer);
jobBlipBlinkAmount = 0;
jobBlipBlinkTimes = 0;
if(jobRouteLocationBlip != null) {
destroyElement(jobRouteLocationBlip);
jobRouteLocationBlip = null;
}
if(jobRouteLocationSphere != null) {
destroyElement(jobRouteLocationSphere);
jobRouteLocationSphere = null;
}
tellServerPlayerArrivedAtJobRouteLocation(); tellServerPlayerArrivedAtJobRouteLocation();
} }
@@ -102,23 +90,23 @@ function enteredJobRouteSphere() {
function blinkJobRouteLocationBlip(times, position, colour) { function blinkJobRouteLocationBlip(times, position, colour) {
jobBlipBlinkTimes = times; jobBlipBlinkTimes = times;
jobBlipBlinkTimer = setInterval(function() { jobBlipBlinkTimer = setInterval(function () {
if(jobRouteLocationBlip != null) { if (jobRouteLocationBlip != null) {
destroyElement(jobRouteLocationBlip); destroyElement(jobRouteLocationBlip);
jobRouteLocationBlip = null; jobRouteLocationBlip = null;
} else { } else {
jobRouteLocationBlip = game.createBlip(position, 0, 2, colour); jobRouteLocationBlip = game.createBlip(position, 0, 3, colour);
} }
if(jobBlipBlinkAmount >= jobBlipBlinkTimes) { if (jobBlipBlinkAmount >= jobBlipBlinkTimes) {
if(jobRouteLocationBlip != null) { if (jobRouteLocationBlip != null) {
destroyElement(jobRouteLocationBlip); destroyElement(jobRouteLocationBlip);
jobRouteLocationBlip = null; jobRouteLocationBlip = null;
} }
jobBlipBlinkAmount = 0; jobBlipBlinkAmount = 0;
jobBlipBlinkTimes = 0; jobBlipBlinkTimes = 0;
jobRouteLocationBlip = game.createBlip(position, 0, 2, colour); jobRouteLocationBlip = game.createBlip(position, 0, 3, colour);
clearInterval(jobBlipBlinkTimer); clearInterval(jobBlipBlinkTimer);
} }
}, jobBlipBlinkInterval); }, jobBlipBlinkInterval);
@@ -127,19 +115,33 @@ function blinkJobRouteLocationBlip(times, position, colour) {
// =========================================================================== // ===========================================================================
function hideJobRouteLocation() { function hideJobRouteLocation() {
destroyElement(jobRouteLocationSphere); logToConsole(LOG_DEBUG, `[AGRP.Job] Hiding job route location`);
destroyElement(jobRouteLocationBlip);
jobRouteLocationSphere = null; if (jobRouteLocationBlip != null) {
jobRouteLocationBlip = null; destroyElement(jobRouteLocationBlip);
jobRouteLocationBlip = null;
}
if (jobRouteLocationSphere != null) {
destroyElement(jobRouteLocationSphere);
jobRouteLocationSphere = null;
}
if (jobBlipBlinkTimer != null) {
clearInterval(jobBlipBlinkTimer);
}
jobBlipBlinkAmount = 0;
jobBlipBlinkTimes = 0;
} }
// =========================================================================== // ===========================================================================
function receiveJobFromServer(jobId, jobLocationId, name, position, blipModel, pickupModel) { function receiveJobFromServer(jobId, jobLocationId, name, position, blipModel, pickupModel) {
logToConsole(LOG_DEBUG, `[VRR.Job] Received job ${jobId} (${name}) from server`); logToConsole(LOG_DEBUG, `[AGRP.Job] Received job ${jobId} (${name}) from server`);
if(getGame() == VRR_GAME_GTA_IV) { if (!areServerElementsSupported() || getGame() == AGRP_GAME_MAFIA_ONE || getGame() == AGRP_GAME_GTA_IV) {
if(getJobData(jobId) != false) { if (getJobData(jobId) != false) {
let jobData = getJobData(jobId); let jobData = getJobData(jobId);
jobData.jobLocationId = jobLocationId; jobData.jobLocationId = jobLocationId;
jobData.name = name; jobData.name = name;
@@ -147,48 +149,48 @@ function receiveJobFromServer(jobId, jobLocationId, name, position, blipModel, p
jobData.blipModel = blipModel; jobData.blipModel = blipModel;
jobData.pickupModel = pickupModel; jobData.pickupModel = pickupModel;
logToConsole(LOG_DEBUG, `[VRR.Job] Job ${jobId} already exists. Checking blip ...`); logToConsole(LOG_DEBUG, `[AGRP.Job] Job ${jobId} already exists. Checking blip ...`);
if(blipModel == -1) { if (blipModel == -1) {
if(jobData.blipId != -1) { if (jobData.blipId != -1) {
logToConsole(LOG_DEBUG, `[VRR.Job] Job ${jobId}'s blip has been removed by the server`); logToConsole(LOG_DEBUG, `[AGRP.Job] Job ${jobId}'s blip has been removed by the server`);
if(getGame() == VRR_GAME_GTA_IV) { if (getGame() == AGRP_GAME_GTA_IV) {
natives.removeBlipAndClearIndex(getJobData(jobId).blipId); natives.removeBlipAndClearIndex(getJobData(jobId).blipId);
} else { } else {
destroyElement(getElementFromId(blipId)); destroyElement(getElementFromId(blipId));
} }
jobData.blipId = -1; jobData.blipId = -1;
} else { } else {
logToConsole(LOG_DEBUG, `[VRR.Job] Job ${jobId}'s blip is unchanged`); logToConsole(LOG_DEBUG, `[AGRP.Job] Job ${jobId}'s blip is unchanged`);
} }
} else { } else {
if(jobData.blipId != -1) { if (jobData.blipId != -1) {
logToConsole(LOG_DEBUG, `[VRR.Job] Job ${jobId}'s blip has been changed by the server`); logToConsole(LOG_DEBUG, `[AGRP.Job] Job ${jobId}'s blip has been changed by the server`);
if(getGame() == VRR_GAME_GTA_IV) { if (getGame() == AGRP_GAME_GTA_IV) {
natives.setBlipCoordinates(jobData.blipId, jobData.position); natives.setBlipCoordinates(jobData.blipId, jobData.position);
natives.changeBlipSprite(jobData.blipId, jobData.blipModel); natives.changeBlipSprite(jobData.blipId, jobData.blipModel);
natives.setBlipMarkerLongDistance(jobData.blipId, false); natives.setBlipMarkerLongDistance(jobData.blipId, false);
natives.setBlipAsShortRange(jobData.blipId, true); natives.setBlipAsShortRange(jobData.blipId, true);
natives.changeBlipNameFromAscii(jobData.blipId, `${jobData.name.substr(0, 24)}${(jobData.name.length > 24) ? " ...": ""}`); natives.changeBlipNameFromAscii(jobData.blipId, `${jobData.name.substr(0, 24)}${(jobData.name.length > 24) ? " ..." : ""}`);
} }
} else { } else {
let blipId = createGameBlip(jobData.blipModel, jobData.position, jobData.name); let blipId = createGameBlip(jobData.blipModel, jobData.position, jobData.name);
if(blipId != -1) { if (blipId != -1) {
jobData.blipId = blipId; jobData.blipId = blipId;
} }
logToConsole(LOG_DEBUG, `[VRR.Job] Job ${jobId}'s blip has been added by the server (Model ${blipModel}, ID ${blipId})`); logToConsole(LOG_DEBUG, `[AGRP.Job] Job ${jobId}'s blip has been added by the server (Model ${blipModel}, ID ${blipId})`);
} }
} }
} else { } else {
logToConsole(LOG_DEBUG, `[VRR.Job] Job ${jobId} doesn't exist. Adding ...`); logToConsole(LOG_DEBUG, `[AGRP.Job] Job ${jobId} doesn't exist. Adding ...`);
let tempJobData = new JobData(jobId, jobLocationId, name, position, blipModel, pickupModel); let tempJobData = new JobData(jobId, jobLocationId, name, position, blipModel, pickupModel);
if(blipModel != -1) { if (blipModel != -1) {
let blipId = createGameBlip(blipModel, tempJobData.position, tempJobData.name); let blipId = createGameBlip(blipModel, tempJobData.position, tempJobData.name);
if(blipId != -1) { if (blipId != -1) {
tempJobData.blipId = blipId; tempJobData.blipId = blipId;
} }
logToConsole(LOG_DEBUG, `[VRR.Job] Job ${jobId}'s blip has been added by the server (Model ${blipModel}, ID ${blipId})`); logToConsole(LOG_DEBUG, `[AGRP.Job] Job ${jobId}'s blip has been added by the server (Model ${blipModel}, ID ${blipId})`);
} else { } else {
logToConsole(LOG_DEBUG, `[VRR.Job] Job ${jobId} has no blip.`); logToConsole(LOG_DEBUG, `[AGRP.Job] Job ${jobId} has no blip.`);
} }
getServerData().jobs.push(tempJobData); getServerData().jobs.push(tempJobData);
setAllJobDataIndexes(); setAllJobDataIndexes();
@@ -202,9 +204,9 @@ function receiveJobFromServer(jobId, jobLocationId, name, position, blipModel, p
* @param {number} job - The ID of the job (initially provided by server) * @param {number} job - The ID of the job (initially provided by server)
* @return {JobData} The job's data (class instance) * @return {JobData} The job's data (class instance)
*/ */
function getJobData(jobId) { function getJobData(jobId) {
for(let i in getServerData().jobs) { for (let i in getServerData().jobs) {
if(getServerData().jobs[i].jobId == jobId) { if (getServerData().jobs[i].jobId == jobId) {
return getServerData().jobs[i]; return getServerData().jobs[i];
} }
} }
@@ -215,7 +217,7 @@ function receiveJobFromServer(jobId, jobLocationId, name, position, blipModel, p
// =========================================================================== // ===========================================================================
function setAllJobDataIndexes() { function setAllJobDataIndexes() {
for(let i in getServerData().jobs) { for (let i in getServerData().jobs) {
jobs[i].index = i; jobs[i].index = i;
} }
} }

View File

@@ -1,6 +1,7 @@
// =========================================================================== // ===========================================================================
// Vortrex's Roleplay Resource // Asshat Gaming Roleplay
// https://github.com/VortrexFTW/gtac_roleplay // https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// =========================================================================== // ===========================================================================
// FILE: keybind.js // FILE: keybind.js
// DESC: Provides keybind features // DESC: Provides keybind features
@@ -16,30 +17,30 @@ let keyBindLongHoldDuration = 1500;
// =========================================================================== // ===========================================================================
function initKeyBindScript() { function initKeyBindScript() {
logToConsole(LOG_DEBUG, "[VRR.KeyBind]: Initializing key bind script ..."); logToConsole(LOG_DEBUG, "[AGRP.KeyBind]: Initializing key bind script ...");
logToConsole(LOG_DEBUG, "[VRR.KeyBind]: Key bind script initialized!"); logToConsole(LOG_DEBUG, "[AGRP.KeyBind]: Key bind script initialized!");
} }
// =========================================================================== // ===========================================================================
function bindAccountKey(key, keyState) { function bindAccountKey(key, keyState) {
logToConsole(LOG_DEBUG, `[VRR.KeyBind]: Binded key ${toUpperCase(getKeyNameFromId(key))} (${key})`); logToConsole(LOG_DEBUG, `[AGRP.KeyBind]: Binded key ${toUpperCase(getKeyNameFromId(key))} (${key})`);
keyBinds.push(toInteger(key)); keyBinds.push(toInteger(key));
bindKey(toInteger(key), keyState, function(event) { bindKey(toInteger(key), keyState, function (event) {
if(isAnyGUIActive()) { if (isAnyGUIActive()) {
return false; return false;
} }
if(hasKeyBindDelayElapsed()) { if (hasKeyBindDelayElapsed()) {
if(canLocalPlayerUseKeyBinds()) { if (canLocalPlayerUseKeyBinds()) {
logToConsole(LOG_DEBUG, `[VRR.KeyBind]: Using keybind for key ${toUpperCase(getKeyNameFromId(key))} (${key})`); logToConsole(LOG_DEBUG, `[AGRP.KeyBind]: Using keybind for key ${toUpperCase(getKeyNameFromId(key))} (${key})`);
lastKeyBindUse = sdl.ticks; lastKeyBindUse = sdl.ticks;
tellServerPlayerUsedKeyBind(key); tellServerPlayerUsedKeyBind(key);
} else { } else {
logToConsole(LOG_DEBUG, `[VRR.KeyBind]: Failed to use keybind for key ${toUpperCase(getKeyNameFromId(key))} (${key}) - Not allowed to use keybinds!`); logToConsole(LOG_DEBUG, `[AGRP.KeyBind]: Failed to use keybind for key ${toUpperCase(getKeyNameFromId(key))} (${key}) - Not allowed to use keybinds!`);
} }
} else { } else {
logToConsole(LOG_DEBUG, `[VRR.KeyBind]: Failed to use keybind for key ${toUpperCase(getKeyNameFromId(key))} (${key}) - Not enough time has passed since last keybind use!`); logToConsole(LOG_DEBUG, `[AGRP.KeyBind]: Failed to use keybind for key ${toUpperCase(getKeyNameFromId(key))} (${key}) - Not enough time has passed since last keybind use!`);
} }
}); });
} }
@@ -47,7 +48,7 @@ function bindAccountKey(key, keyState) {
// =========================================================================== // ===========================================================================
function unBindAccountKey(key) { function unBindAccountKey(key) {
logToConsole(LOG_DEBUG, `[VRR.KeyBind]: Unbinded key ${toUpperCase(getKeyNameFromId(key))} (${key})`); logToConsole(LOG_DEBUG, `[AGRP.KeyBind]: Unbinded key ${toUpperCase(getKeyNameFromId(key))} (${key})`);
unbindKey(key); unbindKey(key);
keyBinds.splice(keyBinds.indexOf(key), 1); keyBinds.splice(keyBinds.indexOf(key), 1);
return true; return true;
@@ -56,7 +57,7 @@ function unBindAccountKey(key) {
// =========================================================================== // ===========================================================================
function hasKeyBindDelayElapsed() { function hasKeyBindDelayElapsed() {
if(sdl.ticks-lastKeyBindUse >= keyBindDelayTime) { if (sdl.ticks - lastKeyBindUse >= keyBindDelayTime) {
return true; return true;
} }
@@ -66,15 +67,15 @@ function hasKeyBindDelayElapsed() {
// =========================================================================== // ===========================================================================
function canLocalPlayerUseKeyBinds() { function canLocalPlayerUseKeyBinds() {
if(isAnyGUIActive()) { if (isAnyGUIActive()) {
return false; return false;
} }
if(!isSpawned) { if (!isSpawned) {
return false; return false;
} }
if(itemActionDelayEnabled) { if (itemActionDelayEnabled) {
return false; return false;
} }
@@ -84,7 +85,7 @@ function canLocalPlayerUseKeyBinds() {
// =========================================================================== // ===========================================================================
function clearKeyBinds() { function clearKeyBinds() {
for(let i in keyBinds) { for (let i in keyBinds) {
unbindKey(keyBinds[i]); unbindKey(keyBinds[i]);
} }
keyBinds = []; keyBinds = [];

417
scripts/client/label.js Normal file
View File

@@ -0,0 +1,417 @@
// ===========================================================================
// Asshat Gaming Roleplay
// https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// ===========================================================================
// FILE: labels.js
// DESC: Provides functionality for world labels (3D labels)
// TYPE: Client (JavaScript)
// ===========================================================================
let businessLabels = [];
let houseLabels = [];
let jobLabels = [];
let propertyLabelNameFont = null;
let propertyLabelLockedFont = null;
let propertyLabelHeight = (getGame() == AGRP_GAME_MAFIA_ONE) ? 2.0 : 1.0;
let propertyPickupRenderDistance = 75.0;
let propertyLabelRenderDistance = 5.0;
let propertyLabelLockedOffset = 16;
let propertyLabelNameOffset = 20;
let propertyLabelPriceOffset = 16;
let jobNameLabelFont = null;
let jobHelpLabelFont = null;
let unlockedColour = toColour(50, 205, 50, 255);
let lockedColour = toColour(205, 92, 92, 255);
let jobHelpColour = toColour(234, 198, 126, 255);
// ===========================================================================
function initLabelScript() {
logToConsole(LOG_DEBUG, "[AGRP.Label]: Initializing label script ...");
propertyLabelNameFont = initLabelPropertyNameFont();
propertyLabelLockedFont = initLabelPropertyLockedFont();
jobNameLabelFont = initLabelJobNameFont();
jobHelpLabelFont = initLabelJobHelpFont();
logToConsole(LOG_DEBUG, "[AGRP.Label]: Label script initialized!");
}
// ===========================================================================
function initLabelPropertyNameFont() {
return lucasFont.createDefaultFont(16.0, "Roboto", "Regular");
}
// ===========================================================================
function initLabelPropertyLockedFont() {
return lucasFont.createDefaultFont(12.0, "Roboto", "Light");
}
// ===========================================================================
function initLabelJobNameFont() {
return lucasFont.createDefaultFont(16.0, "Roboto", "Regular");
}
// ===========================================================================
function initLabelJobHelpFont() {
return lucasFont.createDefaultFont(10.0, "Roboto", "Light");
}
// ===========================================================================
function renderPropertyEntranceLabel(name, position, locked, isBusiness, price, rentPrice, labelInfoType, fee) {
if (localPlayer == null) {
return false;
}
if (propertyLabelNameFont == null) {
return false;
}
if (propertyLabelLockedFont == null) {
return false;
}
if (getGame() == AGRP_GAME_GTA_IV) {
if (!natives.doesViewportExist(natives.getGameViewportId())) {
logToConsole(LOG_INFO, "[AGRP.Label]: Game viewport does not exist!");
return false;
}
if (!natives.isViewportActive(natives.getGameViewportId())) {
logToConsole(LOG_INFO, "[AGRP.Label]: Game viewport is not active!");
return false;
}
}
position = getPosAbovePos(position, propertyLabelHeight);
let screenPosition = new Vec3(0.0, 0.0, 0.0);
if (getGame() == AGRP_GAME_GTA_IV) {
screenPosition = natives.getViewportPositionOfCoord(position, natives.getGameViewportId());
} else {
screenPosition = getScreenFromWorldPosition(position);
}
logToConsole(LOG_VERBOSE, `[AGRP.Label] World [${position.x}, ${position.y}, ${position.z}] to screen [${screenPosition.x}, ${screenPosition.y}, ${screenPosition.z}]`);
if (screenPosition.x < 0 || screenPosition.x > game.width) {
return false;
}
let text = "";
if (toInteger(price) > 0) {
text = getLocaleString("PropertyForSaleLabel", getCurrencyString(price));
let size = propertyLabelLockedFont.measure(text, game.width, 0.0, 0.0, propertyLabelLockedFont.size, true, true);
propertyLabelLockedFont.render(text, [screenPosition.x - size[0] / 2, screenPosition.y - size[1] / 2], game.width, 0.0, 0.0, propertyLabelLockedFont.size, toColour(200, 200, 200, 255), false, true, false, true);
screenPosition.y -= propertyLabelPriceOffset;
}
text = "";
if (toInteger(rentPrice) > 0) {
text = getLocaleString("PropertyForRentLabel", getCurrencyString(rentPrice));
let size = propertyLabelLockedFont.measure(text, game.width, 0.0, 0.0, propertyLabelLockedFont.size, true, true);
propertyLabelLockedFont.render(text, [screenPosition.x - size[0] / 2, screenPosition.y - size[1] / 2], game.width, 0.0, 0.0, propertyLabelLockedFont.size, toColour(200, 200, 200, 255), false, true, false, true);
screenPosition.y -= propertyLabelPriceOffset;
}
text = "";
if (toInteger(fee) > 0) {
text = getLocaleString("PropertyEntranceFeeLabel", getCurrencyString(fee));
let size = propertyLabelLockedFont.measure(text, game.width, 0.0, 0.0, propertyLabelLockedFont.size, true, true);
propertyLabelLockedFont.render(text, [screenPosition.x - size[0] / 2, screenPosition.y - size[1] / 2], game.width, 0.0, 0.0, propertyLabelLockedFont.size, toColour(200, 200, 200, 255), false, true, false, true);
screenPosition.y -= propertyLabelPriceOffset;
}
if (isBusiness) {
text = (locked) ? toUpperCase(getLocaleString("Closed")) : toUpperCase(getLocaleString("Open"));
} else {
text = (locked) ? toUpperCase(getLocaleString("Locked")) : toUpperCase(getLocaleString("Unlocked"));
}
if (!locked && labelInfoType != AGRP_PROPLABEL_INFO_NONE) {
let infoText = "";
switch (labelInfoType) {
case AGRP_PROPLABEL_INFO_ENTER: {
if (enterPropertyKey) {
infoText = getLocaleString("PropertyEnterKeyPressLabel", toUpperCase(getKeyNameFromId(enterPropertyKey)));
} else {
infoText = getLocaleString("PropertyEnterCommandLabel", "/enter");
}
break;
}
case AGRP_PROPLABEL_INFO_BUY: {
infoText = getLocaleString("BusinessBuyItemsLabel", "/buy");
break;
}
case AGRP_PROPLABEL_INFO_BUYBIZ: {
infoText = getLocaleString("BuyBusinessLabel", "/bizbuy");
break;
}
case AGRP_PROPLABEL_INFO_BUYHOUSE: {
infoText = getLocaleString("BuyHouseLabel", "/housebuy");
break;
}
case AGRP_PROPLABEL_INFO_RENTHOUSE: {
infoText = getLocaleString("RentHouseLabel", "/houserent");
break;
}
case AGRP_PROPLABEL_INFO_ENTERVEHICLE: {
infoText = getLocaleString("VehicleDealershipLabel");
break;
}
default: {
if (enterPropertyKey) {
infoText = getLocaleString("PropertyEnterKeyPressLabel", toUpperCase(getKeyNameFromId(enterPropertyKey)));
} else {
infoText = getLocaleString("PropertyEnterCommandLabel", "/enter");
}
break;
}
}
if (getDistance(localPlayer.position, position) <= propertyLabelRenderDistance - 2) {
let size = propertyLabelLockedFont.measure(infoText, game.width, 0.0, 0.0, propertyLabelLockedFont.size, true, true);
propertyLabelLockedFont.render(infoText, [screenPosition.x - size[0] / 2, screenPosition.y - size[1] / 2], game.width, 0.0, 0.0, propertyLabelLockedFont.size, toColour(234, 198, 126, 255), false, true, false, true);
screenPosition.y -= propertyLabelLockedOffset;
}
}
let size = propertyLabelLockedFont.measure(text, game.width, 0.0, 0.0, propertyLabelLockedFont.size, true, true);
propertyLabelLockedFont.render(text, [screenPosition.x - size[0] / 2, screenPosition.y - size[1] / 2], game.width, 0.0, 0.0, propertyLabelLockedFont.size, (locked) ? lockedColour : unlockedColour, false, true, false, true);
screenPosition.y -= propertyLabelNameOffset;
text = name || " ";
if (profanityFilterEnabled) {
text = replaceProfanityInMessage(text);
}
size = propertyLabelNameFont.measure(text, game.width, 0.0, 0.0, propertyLabelNameFont.size, true, true);
propertyLabelNameFont.render(text, [screenPosition.x - size[0] / 2, screenPosition.y - size[1] / 2], game.width, 0.0, 0.0, propertyLabelNameFont.size, (isBusiness) ? toColour(0, 153, 255, 255) : toColour(17, 204, 17, 255), false, true, false, true);
}
// -------------------------------------------------------------------------
function renderPropertyExitLabel(position) {
if (localPlayer == null) {
return false;
}
if (propertyLabelNameFont == null) {
return false;
}
if (propertyLabelLockedFont == null) {
return false;
}
if (getGame() == AGRP_GAME_GTA_IV) {
if (!natives.doesViewportExist(natives.getGameViewportId())) {
logToConsole(LOG_INFO, "[AGRP.Label]: Game viewport does not exist!");
return false;
}
if (!natives.isViewportActive(natives.getGameViewportId())) {
logToConsole(LOG_INFO, "[AGRP.Label]: Game viewport is not active!");
return false;
}
}
let tempPosition = position;
tempPosition.z = tempPosition.z + propertyLabelHeight;
let screenPosition = new Vec3(0.0, 0.0, 0.0);
if (getGame() == AGRP_GAME_GTA_IV) {
screenPosition = natives.getViewportPositionOfCoord(tempPosition, natives.getGameViewportId());
} else {
screenPosition = getScreenFromWorldPosition(tempPosition);
}
if (screenPosition.x < 0 || screenPosition.x > game.width) {
return false;
}
let text = "EXIT";
let size = propertyLabelNameFont.measure(text, game.width, 0.0, 0.0, propertyLabelNameFont.size, true, true);
propertyLabelNameFont.render(text, [screenPosition.x - size[0] / 2, screenPosition.y - size[1] / 2], game.width, 0.0, 0.0, propertyLabelNameFont.size, COLOUR_WHITE, false, true, false, true);
}
// -------------------------------------------------------------------------
function renderJobLabel(name, position, jobType) {
if (localPlayer == null) {
return false;
}
if (jobNameLabelFont == null) {
return false;
}
if (jobHelpLabelFont == null) {
return false;
}
if (getGame() == AGRP_GAME_GTA_IV) {
if (!natives.doesViewportExist(natives.getGameViewportId())) {
logToConsole(LOG_INFO, "[AGRP.Label]: Game viewport does not exist!");
return false;
}
if (!natives.isViewportActive(natives.getGameViewportId())) {
logToConsole(LOG_INFO, "[AGRP.Label]: Game viewport is not active!");
return false;
}
}
let tempPosition = position;
tempPosition.z = tempPosition.z + propertyLabelHeight;
let screenPosition = new Vec3(0.0, 0.0, 0.0);
if (getGame() == AGRP_GAME_GTA_IV) {
screenPosition = natives.getViewportPositionOfCoord(tempPosition, natives.getGameViewportId());
} else {
screenPosition = getScreenFromWorldPosition(tempPosition);
}
if (screenPosition.x < 0 || screenPosition.x > game.width) {
return false;
}
let text = "";
if (jobType == localPlayerJobType) {
if (localPlayerWorking) {
text = getLocaleString("JobEquipAndUniformLabel", "/equip", "/uniform", "/stopwork");
} else {
text = getLocaleString("StartWorkLabel", "/startwork");
}
} else {
if (localPlayerJobType == 0) {
text = getLocaleString("TakeJobLabel", "/takejob");
} else {
text = getLocaleString("NotYourJobLabel", "/quitjob");
}
}
let size = jobHelpLabelFont.measure(text, game.width, 0.0, 0.0, jobHelpLabelFont.size, true, true);
jobHelpLabelFont.render(text, [screenPosition.x - size[0] / 2, screenPosition.y - size[1] / 2], game.width, 0.0, 0.0, jobHelpLabelFont.size, COLOUR_YELLOW, false, true, false, true);
screenPosition.y -= 18;
text = getLocaleString("JobLabel", name);
size = jobNameLabelFont.measure(text, game.width, 0.0, 0.0, jobNameLabelFont.size, true, true);
jobNameLabelFont.render(text, [screenPosition.x - size[0] / 2, screenPosition.y - size[1] / 2], game.width, 0.0, 0.0, jobNameLabelFont.size, COLOUR_WHITE, false, true, false, true);
}
// -------------------------------------------------------------------------
function processLabelRendering() {
if (renderLabels) {
if (!areServerElementsSupported() || getGame() == AGRP_GAME_MAFIA_ONE) {
if (localPlayer != null) {
getServerData().businesses.forEach((business) => {
if (getDistance(localPlayer.position, business.entrancePosition) <= propertyPickupRenderDistance) {
if (getGame() == AGRP_GAME_GTA_IV || getGame() == AGRP_GAME_GTA_IV_EFLC) {
natives.drawColouredCylinder(getPosBelowPos(business.entrancePosition, 1.0), 0.0, 0.0, 0, 153, 255, 255);
}
if (getDistance(localPlayer.position, business.entrancePosition) <= propertyLabelRenderDistance) {
renderPropertyEntranceLabel(business.name, business.entrancePosition, business.locked, true, business.buyPrice, business.rentPrice, business.labelInfoType, business.entranceFee);
}
}
});
getServerData().houses.forEach((house) => {
if (getDistance(localPlayer.position, house.entrancePosition) <= propertyPickupRenderDistance) {
if (getGame() == AGRP_GAME_GTA_IV || getGame() == AGRP_GAME_GTA_IV_EFLC) {
natives.drawColouredCylinder(getPosBelowPos(house.entrancePosition, 1.0), 0.0, 0.0, 0, 200, 0, 255);
}
if (getDistance(localPlayer.position, house.entrancePosition) <= propertyLabelRenderDistance) {
renderPropertyEntranceLabel(house.description, house.entrancePosition, house.locked, true, house.buyPrice, house.rentPrice, house.labelInfoType);
}
}
});
getServerData().jobs.forEach((job) => {
if (getDistance(localPlayer.position, job.position) <= propertyPickupRenderDistance) {
if (getGame() == AGRP_GAME_GTA_IV || getGame() == AGRP_GAME_GTA_IV_EFLC) {
natives.drawColouredCylinder(getPosBelowPos(job.position, 1.0), 0.0, 0.0, 255, 255, 0, 255);
}
}
if (getDistance(localPlayer.position, job.position) <= 5.0) {
renderJobLabel(job.name, job.position, job.jobType);
}
});
}
}
if (areWorldLabelsSupported()) {
if (localPlayer != null) {
let pickups = getElementsByType(ELEMENT_PICKUP);
for (let i in pickups) {
if (pickups[i].getData("agrp.label.type") != null) {
if (getDistance(localPlayer.position, pickups[i].position) <= propertyLabelRenderDistance) {
if (!pickups[i].isOnScreen) {
let price = "0";
let rentPrice = "0";
let labelInfoType = AGRP_PROPLABEL_INFO_NONE;
if (pickups[i].getData("agrp.label.price") != null) {
price = pickups[i].getData("agrp.label.price");
}
if (pickups[i].getData("agrp.label.rentprice") != null) {
rentPrice = pickups[i].getData("agrp.label.rentprice");
}
if (pickups[i].getData("agrp.label.help") != null) {
labelInfoType = pickups[i].getData("agrp.label.help");
}
if (pickups[i].getData("agrp.label.fee") != null) {
fee = pickups[i].getData("agrp.label.fee");
}
switch (pickups[i].getData("agrp.label.type")) {
case AGRP_LABEL_BUSINESS: {
renderPropertyEntranceLabel(pickups[i].getData("agrp.label.name"), pickups[i].position, pickups[i].getData("agrp.label.locked"), true, price, rentPrice, labelInfoType, fee);
break;
}
case AGRP_LABEL_HOUSE: {
renderPropertyEntranceLabel(pickups[i].getData("agrp.label.name"), pickups[i].position, pickups[i].getData("agrp.label.locked"), false, price, rentPrice, labelInfoType);
break;
}
case AGRP_LABEL_JOB: {
renderJobLabel(pickups[i].getData("agrp.label.name"), pickups[i].position, pickups[i].getData("agrp.label.jobType"));
break;
}
case AGRP_LABEL_EXIT: {
renderPropertyExitLabel(pickups[i].position);
break;
}
}
}
}
}
}
}
}
}
}
// -------------------------------------------------------------------------

View File

@@ -1,6 +1,7 @@
// =========================================================================== // ===========================================================================
// Vortrex's Roleplay Resource // Asshat Gaming Roleplay
// https://github.com/VortrexFTW/gtac_roleplay // https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// =========================================================================== // ===========================================================================
// FILE: locale.js // FILE: locale.js
// DESC: Provides locale functions and usage // DESC: Provides locale functions and usage
@@ -8,34 +9,59 @@
// =========================================================================== // ===========================================================================
function getLocaleString(stringName, ...args) { function getLocaleString(stringName, ...args) {
return findResourceByName("agrp_locale").exports.getLocaleString(localLocaleId, stringName, args); if (typeof getServerData().localeStrings[localLocaleId][stringName] == undefined) {
} return "";
}
// =========================================================================== let tempString = getServerData().localeStrings[localLocaleId][stringName];
function getGroupedLocaleString(stringName, index, ...args) { if (tempString == "" || tempString == null || tempString == undefined) {
return findResourceByName("agrp_locale").exports.getGroupedLocaleString(localLocaleId, stringName, index, args); return "";
}
for (let i = 1; i <= args.length; i++) {
tempString = tempString.replace(`{${i}}`, args[i - 1]);
}
return tempString;
} }
// =========================================================================== // ===========================================================================
function getAvailableLocaleOptions() { function getAvailableLocaleOptions() {
return findResourceByName("agrp_locale").exports.getAvailableLocaleOptions(); return getServerData().localeOptions.filter(localeOption => localeOption.requiresUnicode == false);
} }
// =========================================================================== // ===========================================================================
function getLocales() { function loadLocaleConfig() {
return findResourceByName("agrp_locale").exports.getLocales(); let configFile = getContentsOfTextFile("config/client/locale.json");
getServerData().localeOptions = JSON.parse(configFile);
//resetLocaleChooserOptions();
loadAllLocaleStrings();
}
// ===========================================================================
function loadAllLocaleStrings() {
let localeOptions = getServerData().localeOptions;
for (let i in localeOptions) {
logToConsole(LOG_INFO, `[AGRP.Locale] Loading locale strings for ${localeOptions[i].englishName} (${i})`);
let localeStringFile = getContentsOfTextFile(`locale/${localeOptions[i].stringsFile}`);
let localeStringData = JSON.parse(localeStringFile);
let localeId = localeOptions[i].id;
getServerData().localeStrings[localeId] = localeStringData;
}
resetGUIStrings();
} }
// =========================================================================== // ===========================================================================
function setLocale(tempLocaleId) { function setLocale(tempLocaleId) {
let locales = getLocales(); logToConsole(LOG_DEBUG, `[AGRP.Locale] Setting locale to ${tempLocaleId} (${getServerData().localeOptions[tempLocaleId].englishName})`);
logToConsole(LOG_DEBUG, `[VRR.Locale] Setting locale to ${tempLocaleId} (${locales[tempLocaleId].englishName})`);
localLocaleId = tempLocaleId; localLocaleId = tempLocaleId;
resetGUIStrings(); resetGUIStrings();
} }
// ===========================================================================

61
scripts/client/logo.js Normal file
View File

@@ -0,0 +1,61 @@
// ===========================================================================
// Asshat Gaming Roleplay
// https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// ===========================================================================
// FILE: logo.js
// DESC: Provides logo rendering functions
// TYPE: Client (JavaScript)
// ===========================================================================
let logoImage = null;
let logoPos = toVector2(game.width - 132, game.height - 132);
let logoSize = toVector2(128, 128);
// ===========================================================================
function initLogoScript() {
logToConsole(LOG_DEBUG, "[AGRP.Logo]: Initializing logo script ...");
//logoImage = loadLogoImage();
logToConsole(LOG_DEBUG, "[AGRP.Logo]: Logo script initialized!");
}
// ===========================================================================
function loadLogoImage() {
//if (getGame() == AGRP_GAME_MAFIA_ONE) {
// return false;
//}
let logoStream = openFile(mainLogoPath);
let tempLogoImage = null;
if (logoStream != null) {
tempLogoImage = graphics.loadPNG(logoStream);
logoStream.close();
}
return tempLogoImage;
}
// ===========================================================================
function processLogoRendering() {
if (getGame() == AGRP_GAME_MAFIA_ONE) {
return false;
}
if (renderLogo) {
if (logoImage != null) {
graphics.drawRectangle(logoImage, logoPos, logoSize);
}
}
}
// ===========================================================================
function setServerLogoRenderState(state) {
logToConsole(LOG_DEBUG, `[AGRP.Main] Server logo ${(state) ? "enabled" : "disabled"}`);
renderLogo = state;
}
// ===========================================================================

View File

@@ -1,6 +1,7 @@
// =========================================================================== // ===========================================================================
// Vortrex's Roleplay Resource // Asshat Gaming Roleplay
// https://github.com/VortrexFTW/gtac_roleplay // https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// =========================================================================== // ===========================================================================
// FILE: messaging.js // FILE: messaging.js
// DESC: Provides messaging/textdraw functions and usage // DESC: Provides messaging/textdraw functions and usage
@@ -22,10 +23,10 @@ let smallGameMessageTimer = null;
// =========================================================================== // ===========================================================================
function initMessagingScript() { function initMessagingScript() {
logToConsole(LOG_DEBUG, "[VRR.Messaging]: Initializing messaging script ..."); logToConsole(LOG_DEBUG, "[AGRP.Messaging]: Initializing messaging script ...");
smallGameMessageFonts = loadSmallGameMessageFonts(); smallGameMessageFonts = loadSmallGameMessageFonts();
bigGameMessageFonts = loadSmallGameMessageFonts(); bigGameMessageFonts = loadSmallGameMessageFonts();
logToConsole(LOG_DEBUG, "[VRR.Messaging]: Messaging script initialized!"); logToConsole(LOG_DEBUG, "[AGRP.Messaging]: Messaging script initialized!");
} }
// =========================================================================== // ===========================================================================
@@ -33,11 +34,17 @@ function initMessagingScript() {
function loadSmallGameMessageFonts() { function loadSmallGameMessageFonts() {
let tempSmallGameMessageFonts = {}; let tempSmallGameMessageFonts = {};
let fontStream = openFile("files/fonts/pricedown.ttf"); let fontStream = openFile("files/fonts/pricedown.ttf");
if(fontStream != null) { if (fontStream != null) {
tempSmallGameMessageFonts["Pricedown"] = lucasFont.createFont(fontStream, 20.0); tempSmallGameMessageFonts["Pricedown"] = lucasFont.createFont(fontStream, 20.0);
fontStream.close(); fontStream.close();
} }
fontStream = openFile("files/fonts/aurora-bold-condensed.ttf");
if (fontStream != null) {
tempSmallGameMessageFonts["AuroraBdCnBT"] = lucasFont.createFont(fontStream, 20.0);
fontStream.close();
}
tempSmallGameMessageFonts["Roboto"] = lucasFont.createDefaultFont(20.0, "Roboto"); tempSmallGameMessageFonts["Roboto"] = lucasFont.createDefaultFont(20.0, "Roboto");
tempSmallGameMessageFonts["RobotoLight"] = lucasFont.createDefaultFont(20.0, "Roboto", "Light"); tempSmallGameMessageFonts["RobotoLight"] = lucasFont.createDefaultFont(20.0, "Roboto", "Light");
@@ -49,11 +56,17 @@ function loadSmallGameMessageFonts() {
function loadBigGameMessageFont() { function loadBigGameMessageFont() {
let tempBigGameMessageFonts = {}; let tempBigGameMessageFonts = {};
let fontStream = openFile("files/fonts/pricedown.ttf"); let fontStream = openFile("files/fonts/pricedown.ttf");
if(fontStream != null) { if (fontStream != null) {
tempBigGameMessageFonts["Pricedown"] = lucasFont.createFont(fontStream, 28.0); tempBigGameMessageFonts["Pricedown"] = lucasFont.createFont(fontStream, 28.0);
fontStream.close(); fontStream.close();
} }
fontStream = openFile("files/fonts/aurora-bold-condensed.ttf");
if (fontStream != null) {
tempBigGameMessageFonts["AuroraBdCnBT"] = lucasFont.createFont(fontStream, 20.0);
fontStream.close();
}
tempBigGameMessageFonts["Roboto"] = lucasFont.createDefaultFont(28.0, "Roboto"); tempBigGameMessageFonts["Roboto"] = lucasFont.createDefaultFont(28.0, "Roboto");
tempBigGameMessageFonts["RobotoLight"] = lucasFont.createDefaultFont(28.0, "Roboto", "Light"); tempBigGameMessageFonts["RobotoLight"] = lucasFont.createDefaultFont(28.0, "Roboto", "Light");
@@ -63,10 +76,12 @@ function loadBigGameMessageFont() {
// =========================================================================== // ===========================================================================
function processSmallGameMessageRendering() { function processSmallGameMessageRendering() {
if(renderSmallGameMessage) { logToConsole(LOG_VERBOSE, "[AGRP.Messaging]: Processing small game message rendering ...");
if(smallGameMessageText != "") { if (renderSmallGameMessage) {
if(smallGameMessageFonts[smallGameMessageFontName] != null) { if (smallGameMessageText != "") {
smallGameMessageFonts[smallGameMessageFontName].render(smallGameMessageText, [0, game.height-90], game.width, 0.5, 0.0, smallGameMessageFonts[smallGameMessageFontName].size, smallGameMessageColour, true, true, false, true); logToConsole(LOG_VERBOSE, `[AGRP.Messaging]: Rendering small game message: ${smallGameMessageText}`);
if (smallGameMessageFonts[smallGameMessageFontName] != null) {
smallGameMessageFonts[smallGameMessageFontName].render(smallGameMessageText, [0, game.height - 90], game.width, 0.5, 0.0, smallGameMessageFonts[smallGameMessageFontName].size, smallGameMessageColour, true, true, false, true);
} }
} }
} }
@@ -75,8 +90,8 @@ function processSmallGameMessageRendering() {
// =========================================================================== // ===========================================================================
function showSmallGameMessage(text, colour, duration, fontName) { function showSmallGameMessage(text, colour, duration, fontName) {
logToConsole(LOG_DEBUG, `[VRR.Messaging] Showing small game message '${text}' using font ${fontName} for ${duration}ms`); logToConsole(LOG_DEBUG, `[AGRP.Messaging] Showing small game message '${text}' using font ${fontName} for ${duration}ms`);
if(smallGameMessageText != "") { if (smallGameMessageText != "") {
clearTimeout(smallGameMessageTimer); clearTimeout(smallGameMessageTimer);
} }
@@ -84,7 +99,7 @@ function showSmallGameMessage(text, colour, duration, fontName) {
smallGameMessageColour = colour; smallGameMessageColour = colour;
smallGameMessageText = text; smallGameMessageText = text;
smallGameMessageTimer = setTimeout(function() { smallGameMessageTimer = setTimeout(function () {
smallGameMessageText = ""; smallGameMessageText = "";
smallGameMessageColour = COLOUR_WHITE; smallGameMessageColour = COLOUR_WHITE;
smallGameMessageTimer = null; smallGameMessageTimer = null;

579
scripts/client/mousecam.js Normal file
View File

@@ -0,0 +1,579 @@
// ===========================================================================
// Asshat-Gaming Roleplay
// https://github.com/VortrexFTW/gtac_asshat_rp
// Copyright (c) 2020 Asshat-Gaming (https://asshatgaming.com)
// ---------------------------------------------------------------------------
// FILE: mouse-camera.js
// DESC: Provides a freelook camera similar to SA for III and VC
// TYPE: Client (JavaScript)
// ===========================================================================
// CREDITS TO LUCASC190 FOR MAKING THE MOUSE CAMERA
// WALKING CODE ADDED BY VORTREX
function SetStandardControlsEnabled(bEnabled) {
if (typeof gta == "undefined") {
return false;
}
if (game.standardControls === undefined) {
logToConsole(LOG_WARN, "game.standardControls not implemented");
return;
}
game.standardControls = bEnabled;
}
function GetCurrentPlayerIndex() {
return 0;
}
function GetPlayerPed(uiIndex) {
if (uiIndex >= 1)
throw new Error("player index out of range");
return localPlayer;
}
function GetPedVehicle(pPed) {
return pPed.vehicle;
}
let ENTITYTYPE_BUILDING = 1;
let ENTITYTYPE_VEHICLE = 2;
let ENTITYTYPE_PED = 3;
let ENTITYTYPE_OBJECT = 4;
let ENTITYTYPE_DUMMY = 5;
function GetEntityType(Entity) {
if (Entity.isType(ELEMENT_BUILDING))
return ENTITYTYPE_BUILDING;
if (Entity.isType(ELEMENT_VEHICLE))
return ENTITYTYPE_VEHICLE;
if (Entity.isType(ELEMENT_PED))
return ENTITYTYPE_PED;
if (Entity.isType(ELEMENT_OBJECT))
return ENTITYTYPE_OBJECT;
//if (Entity.isType(ELEMENT_DUMMY))
// return ENTITYTYPE_DUMMY;
return undefined;
}
function GetPlaceableMatrix(pPlaceable) {
if (pPlaceable == GetCamera())
return game.cameraMatrix;
return pPlaceable.matrix;
}
function GetEntityModel(pEntity) {
return pEntity;
}
function GetModelBoundingSphere(usModel) {
return [usModel.boundingRadius, usModel.boundingCentre.x, usModel.boundingCentre.y, usModel.boundingCentre.z];
}
function GetMouseSpeed() {
if (gui.cursorEnabled)
return [0, 0];
let MouseSpeed = game.getMouseSpeed();
return [MouseSpeed.x, -MouseSpeed.y];
}
function GetMouseSensitivity() {
if (game.getMouseSensitivity === undefined) {
//logToConsole(LOG_ERROR, "game.getMouseSensitivity not implemented");
return [0.0025, 0.003];
}
let MouseSensitivity = game.getMouseSensitivity();
return [MouseSensitivity.x, MouseSensitivity.y];
}
let GetCamera;
{
const Camera = Symbol();
GetCamera = function () {
return Camera;
}
}
function AreEntityCollisionsEnabled(pEntity) {
return pEntity.collisionsEnabled;
}
function SetEntityCollisionsEnabled(pEntity, bCollisionsEnabled) {
pEntity.collisionsEnabled = bCollisionsEnabled;
}
function ProcessLineOfSight(vecStartX, vecStartY, vecStartZ, vecEndX, vecEndY, vecEndZ, bCheckBuildings, bCheckVehicles, bCheckPeds, bCheckObjects, bCheckDummies, bCheckSeeThroughStuff, bIgnoreSomeObjectsForCamera) {
if (game.processLineOfSight === undefined) {
logToConsole(LOG_WARN, "game.processLineOfSight not implemented");
return [null];
}
let Result = game.processLineOfSight([vecStartX, vecStartY, vecStartZ], [vecEndX, vecEndY, vecEndZ], bCheckBuildings, bCheckVehicles, bCheckPeds, bCheckObjects, bCheckDummies, bCheckSeeThroughStuff, bIgnoreSomeObjectsForCamera);
if (Result == null)
return [null];
return [Result.position.x, Result.position.y, Result.position.z, Result.normal.x, Result.normal.y, Result.normal.z, Result.entity];
}
function SetPlaceableMatrix(pPlaceable, mat) {
if (pPlaceable == GetCamera()) {
game.setCameraMatrix(mat);
return;
}
pPlaceable.matrix = mat;
}
const UpdateCamera = game.updateCamera;
let GetTickCount;
{
let FrameCount = 0;
setInterval(() => {
++FrameCount;
}, 0);
let GTAFrameCount = 0;
addEventHandler("OnProcess", (event, deltaTime) => {
++GTAFrameCount;
});
GetTickCount = function (bGTA, bFrames) {
if (bFrames)
return bGTA ? GTAFrameCount : FrameCount;
else
return bGTA ? game.tickCount : sdl.ticks;
}
}
function easingSinusoidalInOut(t, b, c, d)//TODO: Move this to MathUtil.js
{
return -c / 2 * (Math.cos((Math.PI) * t / d) - 1) + b;
}
//TODO: extract
function applyMultiplierTimeStep(m, t)//TODO: Move this to MathUtil.js
{
return Math.max(Math.min(1.0 - (1.0 - m) * (t), 1), 0);
}
//TODO: getOffset
//TODO: round
//TODO: getNumberBetween
//TODO: split
//TODO: isWhiteSpaceCharacter
//TODO: isControlCharacter
//TODO: alert
//TODO: confirm
const identityMatrix = new Matrix4x4();
if (identityMatrix.setIdentity === undefined) {
identityMatrix.m11 = 1;
identityMatrix.m12 = 0;
identityMatrix.m13 = 0;
identityMatrix.m14 = 0;
identityMatrix.m21 = 0;
identityMatrix.m22 = 1;
identityMatrix.m23 = 0;
identityMatrix.m24 = 0;
identityMatrix.m31 = 0;
identityMatrix.m32 = 0;
identityMatrix.m33 = 1;
identityMatrix.m34 = 0;
identityMatrix.m41 = 0;
identityMatrix.m42 = 0;
identityMatrix.m43 = 0;
identityMatrix.m44 = 1;
}
const cameraIdentityMatrix = new Matrix4x4();
cameraIdentityMatrix.m11 = -1;
cameraIdentityMatrix.m12 = 0;
cameraIdentityMatrix.m13 = 0;
cameraIdentityMatrix.m14 = 0;
cameraIdentityMatrix.m21 = 0;
cameraIdentityMatrix.m22 = 1;
cameraIdentityMatrix.m23 = 0;
cameraIdentityMatrix.m24 = 0;
cameraIdentityMatrix.m31 = 0;
cameraIdentityMatrix.m32 = 0;
cameraIdentityMatrix.m33 = 1;
cameraIdentityMatrix.m34 = 0;
cameraIdentityMatrix.m41 = 0;
cameraIdentityMatrix.m42 = 0;
cameraIdentityMatrix.m43 = 0;
cameraIdentityMatrix.m44 = 1;
function createMultipliedMatrix() {
let matrix = new Matrix4x4();
matrix.setMultiply.apply(matrix, arguments);
return matrix;
}
function createXRotationMatrix(x) {
let matrix = new Matrix4x4();
matrix.setRotateX(x);
return matrix;
}
function createYRotationMatrix(x) {
let matrix = new Matrix4x4();
matrix.setRotateY(x);
return matrix;
}
function createZRotationMatrix(z) {
let matrix = new Matrix4x4();
matrix.setRotateZ(z);
return matrix;
}
function createTranslationMatrix(x, y, z) {
let matrix = new Matrix4x4();
matrix.setTranslate([x, y, z]);
return matrix;
}
//TODO: createScaleMatrix
function getDotProduct(x, y, z, x2, y2, z2) {
return x * x2 + y * y2 + z * z2;
}
function getCrossProduct(x, y, z, x2, y2, z2) {
return [y * z2 - z * y2, z * x2 - x * z2, x * y2 - y * x2];
}
function getLength(x, y, z) {
return Math.sqrt(getDotProduct(x, y, z, x, y, z));
}
function normalise(x, y, z) {
let length = getLength(x, y, z);
if (length == 0)
throw new Error("an attempt was made to normalise a three dimensional vector with a length of zero");
return [x / length, y / length, z / length];
}
function createLookAtLHMatrix(eyeX, eyeY, eyeZ, atX, atY, atZ, upX, upY, upZ) {
let matrix = new Matrix4x4();
let [lookX, lookY, lookZ] = normalise(atX - eyeX, atY - eyeY, atZ - eyeZ);
let [rightX, rightY, rightZ] = normalise.apply(null, getCrossProduct(upX, upY, upZ, lookX, lookY, lookZ));
[upX, upY, upZ] = getCrossProduct(lookX, lookY, lookZ, rightX, rightY, rightZ);
matrix.m11 = rightX;
matrix.m12 = rightY;
matrix.m13 = rightZ;
matrix.m14 = 0;
matrix.m21 = lookX;
matrix.m22 = lookY;
matrix.m23 = lookZ;
matrix.m24 = 0;
matrix.m31 = upX;
matrix.m32 = upY;
matrix.m33 = upZ;
matrix.m34 = 0;
matrix.m41 = eyeX;
matrix.m42 = eyeY;
matrix.m43 = eyeZ;
matrix.m44 = 1;
matrix.m41 = eyeX;
matrix.m42 = eyeY;
matrix.m43 = eyeZ;
matrix.m44 = 1;
return matrix;
}
function getDifferenceBetweenAngles(current, target) {
let f = (((target - current) + Math.PI) / (Math.PI * 2));
return ((f - Math.floor(f)) * (Math.PI * 2)) - Math.PI;
}
let easeCamera = false;
let easeStartTicks;
let easeDuration;
let easeStartPosX, easeStartPosY, easeStartPosZ;
let easeStartLookX, easeStartLookY, easeStartLookZ;
let easeStartUpX, easeStartUpY, easeStartUpZ;
function getCameraPositionInfo(matrix) {
return [matrix.m41, matrix.m42, matrix.m43, matrix.m21, matrix.m22, matrix.m23, matrix.m31, matrix.m32, matrix.m33];
}
function startCameraEase() {
easeCamera = true;
easeStartTicks = GetTickCount(true, false);
easeDuration = 1000;
let matrix = GetPlaceableMatrix(GetCamera());
[easeStartPosX, easeStartPosY, easeStartPosZ, easeStartLookX, easeStartLookY, easeStartLookZ, easeStartUpX, easeStartUpY, easeStartUpZ] = getCameraPositionInfo(matrix);
}
function applyCameraEase(matrix) {
if (!easeCamera)
return matrix;
let ease = (GetTickCount(true, false) - easeStartTicks) / easeDuration;
if (ease < 1) {
ease = easingSinusoidalInOut(ease, 0, 1, 1);
let [newPosX, newPosY, newPosZ, newLookX, newLookY, newLookZ, newUpX, newUpY, newUpZ] = getCameraPositionInfo(matrix);
let easePosX = easeStartPosX + (newPosX - easeStartPosX) * ease;
let easePosY = easeStartPosY + (newPosY - easeStartPosY) * ease;
let easePosZ = easeStartPosZ + (newPosZ - easeStartPosZ) * ease;
let easeLookX = easeStartLookX + (newLookX - easeStartLookX) * ease;
let easeLookY = easeStartLookY + (newLookY - easeStartLookY) * ease;
let easeLookZ = easeStartLookZ + (newLookZ - easeStartLookZ) * ease;
let easeUpX = easeStartUpX + (newUpX - easeStartUpX) * ease;
let easeUpY = easeStartUpY + (newUpY - easeStartUpY) * ease;
let easeUpZ = easeStartUpZ + (newUpZ - easeStartUpZ) * ease;
return createLookAtLHMatrix(easePosX, easePosY, easePosZ, easePosX + easeLookX, easePosY + easeLookY, easePosZ + easeLookZ, easeUpX, easeUpY, easeUpZ);
}
return matrix;
}
function isCameraEasing() {
return easeCamera && GetTickCount(true, false) < (easeStartTicks + easeDuration);
}
let oldCameraTarget = null;
let OldPosition = null;//2019 Lucas was here!
let cameraRotZ;
let cameraRotY;
function getCameraTarget() {
let playerPed = GetPlayerPed(GetCurrentPlayerIndex());
let vehicle = GetPedVehicle(playerPed);
if (vehicle != null)
return vehicle;
if (playerPed != null) {
//if (playerPed.health <= 1)//Breaks because of fade//2019 Lucas was here!
// return null;
return playerPed;
}
return null;
}
function isRelativeToTarget(target) {
if (GetEntityType(target) == ENTITYTYPE_PED)
return false;
return false
}
function isClipped(target) {
if (GetEntityType(target) == ENTITYTYPE_PED)
return true;
return true;
}
//2019 Lucas was here!
function ShouldReturnToRestRotation(Target) {
if (GetEntityType(Target) == ENTITYTYPE_PED)
return false;
return true;
}
function getCameraRestRotation(target) {
let targetMatrix = GetPlaceableMatrix(target);
let rotZ;
if (isRelativeToTarget(target))
rotZ = 0;
else
rotZ = -Math.atan2(targetMatrix.m21, targetMatrix.m22);
let rotY = -0.2;
return [rotZ, rotY];
}
function resetCameraRotation() {
[cameraRotZ, cameraRotY] = getCameraRestRotation(getCameraTarget());
}
//2019 Lucas was here!
let DeltaTime = 0;
addEventHandler("OnProcess", (event, deltaTime) => {
DeltaTime = deltaTime;
if (!localPlayer) {
return false;
}
});
let IdleTime = 0;//2019 Lucas was here!
function processReturnToRestRotation() {
//resetCameraRotation();//2019 Lucas was here!
//2019 Lucas was here!
let Target = getCameraTarget();
if (!ShouldReturnToRestRotation(Target))
return;
IdleTime += DeltaTime;
if (IdleTime > 1.5) {
let Velocity = Target.velocity;
let Matrix = Target.matrix;
let Speed = getDotProduct(Velocity.x, Velocity.y, Velocity.z, Matrix.getElement(1 * 4 + 0), Matrix.getElement(1 * 4 + 1), Matrix.getElement(1 * 4 + 2));
let AbsSpeed = Math.abs(Speed);
let Multiplier = Math.min(AbsSpeed / 0.75, 1);
if (Multiplier != 0) {
let [TargetCameraRotZ2, TargetCameraRotY2] = getCameraRestRotation(Target);
if (Speed < 0)
TargetCameraRotZ2 += Math.PI;
let TimeStep = game.timeStep / 50 * 60;
cameraRotZ += getDifferenceBetweenAngles(cameraRotZ, TargetCameraRotZ2) * applyMultiplierTimeStep(1 / 20, TimeStep) * Multiplier;
cameraRotY += getDifferenceBetweenAngles(cameraRotY, TargetCameraRotY2) * applyMultiplierTimeStep(1 / 20, TimeStep) * Multiplier;
}
}
}
function cancelReturnToRestRotation() {
IdleTime = 0;//2019 Lucas was here!
}
let distance;
let zIncrease;
function getCameraOffsetInfo(target) {
if (GetEntityType(target) == ENTITYTYPE_PED) {
let distance = 4;
let zIncrease = 0.8;
let offsetX = 0;
let offsetY = 0;
let offsetZ = 0;
return [distance, zIncrease, offsetX, offsetY, offsetZ];
}
let model = GetEntityModel(target);
let [radius] = GetModelBoundingSphere(model);
let minDistance;
let maxDistance;
let minZIncrease;
let maxZIncrease;
let minRadius;
let maxRadius;
let offsetX;
let offsetY;
let offsetZ;
if (radius <= 3.0535011291504) {
minDistance = 4;
maxDistance = 8;
minZIncrease = 0.5;
maxZIncrease = 1;
minRadius = 2;
maxRadius = 3.0535011291504;
}
else {
minDistance = 8;
maxDistance = 16;
minZIncrease = 1;
maxZIncrease = 2;
minRadius = 3.05350112915042;
maxRadius = 6.3955960273743;
}
offsetX = 0;
offsetY = 0;
offsetZ = 0;
distance = minDistance + (radius - minRadius) / (maxRadius - minRadius) * (maxDistance - minDistance);
zIncrease = minZIncrease + (radius - minRadius) / (maxRadius - minRadius) * (maxZIncrease - minZIncrease);
return [distance, zIncrease, offsetX, offsetY, offsetZ];
}
function update() {
let target = getCameraTarget();
if (target != null) {
if (oldCameraTarget != target) {
//if (oldCameraTarget != null)//2019 Lucas was here!
let Position = target.position;
if (OldPosition == null || getLength(Position.x - OldPosition.x, Position.y - OldPosition.y, Position.z - OldPosition.z) < 10)
startCameraEase()
resetCameraRotation()
}
let [mouseSpeedX, mouseSpeedY] = GetMouseSpeed();
let [mouseSensitivityX, mouseSensitivityY] = GetMouseSensitivity();
mouseSpeedX = mouseSpeedX * mouseSensitivityX * 2;
mouseSpeedY = mouseSpeedY * mouseSensitivityY * 2;
if (mouseSpeedX == 0 && mouseSpeedY == 0) {
processReturnToRestRotation();
}
else {
cameraRotZ = cameraRotZ - mouseSpeedX;
cameraRotY = cameraRotY - mouseSpeedY;
cancelReturnToRestRotation();
}
cameraRotY = Math.max(cameraRotY, -Math.PI / 2 + 0.01);
if (GetEntityType(target) != ENTITYTYPE_PED)
cameraRotY = Math.min(cameraRotY, Math.PI / 8.5);//2019 Lucas was here!
else
cameraRotY = Math.min(cameraRotY, Math.PI / 4);
let camera = GetCamera();
let targetMatrix = GetPlaceableMatrix(target);
let [distance, zIncrease, offsetX, offsetY, offsetZ] = getCameraOffsetInfo(target);
let offsetTranslationMatrix = createTranslationMatrix(offsetX, offsetY, offsetZ);
targetMatrix = createMultipliedMatrix(offsetTranslationMatrix, targetMatrix);
let targetPosX, targetPosY, targetPosZ;
if (isRelativeToTarget(target))
[targetPosX, targetPosY, targetPosZ] = [0, 0, 0];
else
[targetPosX, targetPosY, targetPosZ] = [targetMatrix.m41, targetMatrix.m42, targetMatrix.m43];
let distanceTranslationMatrix = createTranslationMatrix(0, -distance, 0);
targetPosZ = targetPosZ + zIncrease;
let targetTranslationMatrix = createTranslationMatrix(targetPosX, targetPosY, targetPosZ);
let offsetRotationX = createXRotationMatrix(cameraRotY);
let offsetRotationZ = createZRotationMatrix(cameraRotZ);
let cameraMatrix = createMultipliedMatrix(cameraIdentityMatrix, distanceTranslationMatrix, offsetRotationX, offsetRotationZ, targetTranslationMatrix);
if (isRelativeToTarget(target)) {
cameraMatrix = createMultipliedMatrix(cameraMatrix, targetMatrix);
targetTranslationMatrix = createMultipliedMatrix(targetTranslationMatrix, targetMatrix);
}
if (isClipped(target)) {
let startX = targetTranslationMatrix.m41;
let startY = targetTranslationMatrix.m42;
let startZ = targetTranslationMatrix.m43;
let endX = cameraMatrix.m41;
let endY = cameraMatrix.m42;
let endZ = cameraMatrix.m43;
let checkBuildings = true;
let checkVehicles = true;
let checkPeds = true;
let checkObjects = true;
let checkDummies = false;
let checkSeeThroughStuff = false;
let ignoreSomeObjectsForCamera = true;
let collisionsEnabled = AreEntityCollisionsEnabled(target);
if (collisionsEnabled)
SetEntityCollisionsEnabled(target, false);
let [positionX, positionY, positionZ, normalX, normalY, normalZ, targetEntity] = ProcessLineOfSight(startX, startY, startZ, endX, endY, endZ, checkBuildings, checkVehicles, checkPeds, checkObjects, checkDummies, checkSeeThroughStuff, ignoreSomeObjectsForCamera);
if (collisionsEnabled)
SetEntityCollisionsEnabled(target, true);
if (positionX != null) {
//2019 Lucas was here!
let Distance = 0.3;
positionX += normalX * Distance;
positionY += normalY * Distance;
positionZ += normalZ * Distance;
cameraMatrix.m41 = positionX;
cameraMatrix.m42 = positionY;
cameraMatrix.m43 = positionZ;
}
}
if (isCameraEasing())
cameraMatrix = applyCameraEase(cameraMatrix);
SetPlaceableMatrix(camera, cameraMatrix);
UpdateCamera(camera);
}
oldCameraTarget = target;
OldPosition = (target != null) ? target.position : null;//2019 Lucas was here!
return target != null;
}
addEventHandler("OnCameraProcess", (event) => {
if (mouseCameraEnabled) {
update();
event.preventDefault();
}
});
function toggleMouseCamera() {
mouseCameraEnabled = !mouseCameraEnabled;
}

247
scripts/client/nametag.js Normal file
View File

@@ -0,0 +1,247 @@
// ===========================================================================
// Asshat Gaming Roleplay
// https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// ===========================================================================
// FILE: nametags.js
// DESC: Provides nametag rendering
// TYPE: Client (JavaScript)
// ===========================================================================
// Configuration
let nametagFont = null;
let afkStatusFont = null;
let pingFont = null;
let nametagDistance = 50.0;
let nametagWidth = 70;
let playerNames = {};
let playerColours = {};
let playerPaused = {};
let playerPing = {};
// ===========================================================================
function initNameTagScript() {
logToConsole(LOG_DEBUG, "[AGRP.NameTag]: Initializing nametag script ...");
nametagFont = loadNameTagFont();
afkStatusFont = loadPausedStatusFont();
logToConsole(LOG_DEBUG, "[AGRP.NameTag]: Nametag script initialized!");
}
// ===========================================================================
function loadNameTagFont() {
return lucasFont.createDefaultFont(12.0, "Roboto", "Light");
}
// ===========================================================================
function loadPausedStatusFont() {
return lucasFont.createDefaultFont(18.0, "Roboto", "Light");
}
// ===========================================================================
function updatePlayerNameTag(clientName, characterName, colour, paused, ping) {
if (profanityFilterEnabled) {
characterName = replaceProfanityInMessage(characterName);
}
playerNames[clientName] = characterName;
playerColours[clientName] = colour;
playerPaused[clientName] = paused;
playerPing[clientName] = ping;
if (getGame() == AGRP_GAME_GTA_IV) {
let client = getPlayerFromParams(clientName);
if (client != false) {
if (getPlayerPed(client) != null) {
getPlayerPed(client).setNametag(characterName, colour);
}
}
}
}
// ===========================================================================
function updatePlayerPing(clientName, ping) {
playerPing[clientName] = ping;
}
// ===========================================================================
function drawNametag(x, y, health, armour, text, ping, alpha, distance, colour, afk, skin) {
if (nametagFont == null) {
return false;
}
alpha *= 0.75;
let width = nametagWidth;
health = Math.max(0.0, Math.min(1.0, health));
armour = Math.max(0.0, Math.min(1.0, armour));
// Starts at bottom and works it's way up
// -------------------------------------------
// Health Bar
if (getMultiplayerMod() == AGRP_MPMOD_GTAC) {
if (getGame() == AGRP_GAME_GTA_III) {
// Mickey Hamfists is ridiculously tall. Raise the nametag for him a bit
if (skin == 109) {
y -= 20;
} else {
y -= 5;
}
} else {
y -= 5;
}
} else {
y -= 5;
}
if (health > 0.0) {
let hx = x - width / 2;
let hy = y - 10 / 2;
let colourB = toColour(0, 0, 0, Math.floor(255.0 * alpha)); // Background colour (black)
graphics.drawRectangle(null, [hx, hy], [width, 8], colourB, colourB, colourB, colourB);
let colour = toColour(Math.floor(255.0 - (health * 255.0)), Math.floor(health * 255.0), 0, Math.floor(255.0 * alpha)); // Health bar colour (varies, depending on health)
graphics.drawRectangle(null, [hx + 2, hy + 2], [(width - 4) * health, 10 - 6], colour, colour, colour, colour);
}
// Armour Bar
if (armour > 0.0) {
// Go up 10 pixels to draw the next part
y -= 10;
let hx = x - width / 2;
let hy = y - 10 / 2;
let colourB = toColour(255, 0, 0, 0); // Background colour (black)
graphics.drawRectangle(null, [hx, hy], [width, 8], colourB, colourB, colourB, colourB);
let colour = toColour(255, 255, 255, 255); // Armour bar colour (white)
graphics.drawRectangle(null, [hx + 2, hy + 2], [(width - 4) * armour, 10 - 6], colour, colour, colour, colour);
}
y -= 20;
// Nametag
if (nametagFont != null) {
let size = nametagFont.measure(text, game.width, 0.0, 0.0, nametagFont.size, false, false);
nametagFont.render(text, [x - size[0] / 2, y - size[1] / 2], game.width, 0.0, 0.0, nametagFont.size, colour, false, false, false, true);
}
// Go up another 10 pixels for the next part
y -= 20;
// AFK Status
if (afkStatusFont != null) {
if (afk) {
let size = afkStatusFont.measure(getLocaleString(client, "Paused"), game.width, 0.0, 0.0, afkStatusFont.size, false, false);
afkStatusFont.render(getLocaleString(client, "Paused"), [x - size[0] / 2, y - size[1] / 2], game.width, 0.0, 0.0, afkStatusFont.size, toColour(255, 0, 0, 255), false, false, false, true);
}
}
}
// ===========================================================================
function updateNametag(element) {
if (!areWorldLabelsSupported()) {
return false;
}
if (localPlayer != null) {
let playerPos = localPlayer.position;
let elementPos = element.position;
elementPos[2] += 0.9;
//if(typeof element.getComponentPosition()) {
let screenPos = getScreenFromWorldPosition(elementPos);
if (screenPos[2] >= 0.0) {
let health = element.health / 100.0;
if (health > 1.0) {
health = 1.0;
}
let armour = element.armour / 100.0;
if (armour > 1.0) {
armour = 1.0;
}
let distance = playerPos.distance(elementPos);
if (distance <= nametagDistance) {
if (typeof game.processLineOfSight != "undefined") {
let losCheck = game.processLineOfSight(playerPos, elementPos, true, false, false, true, true, false, true, true);
if (losCheck != null) {
return false;
}
}
if (element.type == ELEMENT_PLAYER) {
let name = element.name;
let colour = COLOUR_WHITE;
let paused = false;
let ping = -1;
if (element.isType(ELEMENT_PLAYER)) {
if (typeof playerNames[element.name] != "undefined") {
name = playerNames[element.name];
}
if (typeof playerPaused[element.name] != "undefined") {
paused = playerPaused[element.name];
}
if (typeof playerColours[element.name] != "undefined") {
colour = playerColours[element.name];
}
if (typeof playerPing[element.name] != "undefined") {
ping = playerPing[element.name];
}
}
drawNametag(screenPos[0], screenPos[1], health, armour, name, ping, 1.0 - distance / nametagDistance, distance, colour, paused, element.skin);
}
}
}
}
}
// ===========================================================================
function getClientFromPlayer(player) {
getClients().forEach(function (client) {
if (getPlayerPed(client) == player) {
return client;
}
});
}
// ===========================================================================
function processNameTagRendering(event) {
//if(getGame() >= GAME_GTA_IV) {
// return false;
//}
getElementsByType(ELEMENT_PED).forEach(function (ped) {
if (ped != localPlayer) {
updateNametag(ped);
}
});
}
// ===========================================================================
function createColour(alpha, red, green, blue) {
return alpha << 24 | red << 16 | green << 8 | blue;
}
// ===========================================================================
function setNameTagDistance(distance) {
nametagDistance = distance;
}
// ===========================================================================

View File

@@ -1,6 +1,7 @@
// =========================================================================== // ===========================================================================
// Vortrex's Roleplay Resource // Asshat Gaming Roleplay
// https://github.com/VortrexFTW/gtac_roleplay // https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// =========================================================================== // ===========================================================================
// FILE: connected.js // FILE: connected.js
// DESC: Provides wrapped natives for GTA Connected and Mafia Connected mods // DESC: Provides wrapped natives for GTA Connected and Mafia Connected mods
@@ -37,7 +38,7 @@ function getPlayerPosition() {
// =========================================================================== // ===========================================================================
function setPlayerPosition(position) { function setPlayerPosition(position) {
if (getGame() == VRR_GAME_GTA_IV) { if (getGame() == AGRP_GAME_GTA_IV) {
natives.setCharCoordinates(localPlayer, position); natives.setCharCoordinates(localPlayer, position);
} else { } else {
localPlayer.position = position; localPlayer.position = position;
@@ -72,7 +73,7 @@ function setElementPosition(elementId, position) {
// =========================================================================== // ===========================================================================
function deleteGameElement(elementId, position) { function deleteGameElement(elementId, position = toVector3(0.0, 0.0, 0.0)) {
if (!getElementFromId(elementId).isOwner) { if (!getElementFromId(elementId).isOwner) {
return false; return false;
} }
@@ -82,6 +83,12 @@ function deleteGameElement(elementId, position) {
// =========================================================================== // ===========================================================================
function deleteLocalGameElement(element) {
destroyGameElement(element);
}
// ===========================================================================
function createGameVehicle(modelIndex, position, heading) { function createGameVehicle(modelIndex, position, heading) {
return game.createVehicle(getGameConfig().vehicles[getGame()][modelIndex][0], position, heading); return game.createVehicle(getGameConfig().vehicles[getGame()][modelIndex][0], position, heading);
} }
@@ -181,7 +188,7 @@ function getVehiclesInRange(position, range) {
// =========================================================================== // ===========================================================================
function createGameBlip(blipModel, position, name = "") { function createGameBlip(blipModel, position, name = "") {
if (getGame() == VRR_GAME_GTA_IV) { if (getGame() == AGRP_GAME_GTA_IV) {
let blipId = natives.addBlipForCoord(position); let blipId = natives.addBlipForCoord(position);
if (blipId) { if (blipId) {
natives.changeBlipSprite(blipId, blipModel); natives.changeBlipSprite(blipId, blipModel);
@@ -206,6 +213,7 @@ function setEntityData(entity, dataName, dataValue, syncToClients = true) {
// =========================================================================== // ===========================================================================
function setVehicleEngine(vehicleId, state) { function setVehicleEngine(vehicleId, state) {
//getElementFromId(vehicleId).netFlags.sendSync = state;
getElementFromId(vehicleId).engine = state; getElementFromId(vehicleId).engine = state;
} }
@@ -260,7 +268,7 @@ function syncVehicleProperties(vehicle) {
vehicle.setSuspensionHeight(suspensionHeight); vehicle.setSuspensionHeight(suspensionHeight);
} }
if (getGame() == VRR_GAME_GTA_SA) { if (getGame() == AGRP_GAME_GTA_SA) {
let allUpgrades = getGameConfig().vehicleUpgrades[getGame()]; let allUpgrades = getGameConfig().vehicleUpgrades[getGame()];
for (let i in allUpgrades) { for (let i in allUpgrades) {
vehicle.removeUpgrade(i); vehicle.removeUpgrade(i);
@@ -276,12 +284,12 @@ function syncVehicleProperties(vehicle) {
} }
} }
if (getGame() == VRR_GAME_GTA_SA || getGame() == VRR_GAME_GTA_IV) { if (getGame() == AGRP_GAME_GTA_SA || getGame() == AGRP_GAME_GTA_IV) {
if (doesEntityDataExist(vehicle, "agrp.livery")) { if (doesEntityDataExist(vehicle, "agrp.livery")) {
let livery = getEntityData(vehicle, "agrp.livery"); let livery = getEntityData(vehicle, "agrp.livery");
if (getGame() == VRR_GAME_GTA_SA) { if (getGame() == AGRP_GAME_GTA_SA) {
vehicle.setPaintJob(livery); vehicle.setPaintJob(livery);
} else if (getGame() == VRR_GAME_GTA_IV) { } else if (getGame() == AGRP_GAME_GTA_IV) {
vehicle.livery = livery; vehicle.livery = livery;
} }
} }
@@ -309,7 +317,7 @@ function doesEntityDataExist(entity, dataName) {
// =========================================================================== // ===========================================================================
function syncCivilianProperties(civilian) { function syncCivilianProperties(civilian) {
if (getGame() == VRR_GAME_GTA_III) { if (getGame() == AGRP_GAME_GTA_III) {
if (doesEntityDataExist(civilian, "agrp.scale")) { if (doesEntityDataExist(civilian, "agrp.scale")) {
let scaleFactor = getEntityData(civilian, "agrp.scale"); let scaleFactor = getEntityData(civilian, "agrp.scale");
let tempMatrix = civilian.matrix; let tempMatrix = civilian.matrix;
@@ -321,21 +329,21 @@ function syncCivilianProperties(civilian) {
} }
} }
if (getGame() == VRR_GAME_GTA_SA) { if (getGame() == AGRP_GAME_GTA_SA) {
if (doesEntityDataExist(civilian, "agrp.fightStyle")) { if (doesEntityDataExist(civilian, "agrp.fightStyle")) {
let fightStyle = getEntityData(civilian, "agrp.fightStyle"); let fightStyle = getEntityData(civilian, "agrp.fightStyle");
civilian.setFightStyle(fightStyle[0], fightStyle[1]); civilian.setFightStyle(fightStyle[0], fightStyle[1]);
} }
} }
if (getGame() == VRR_GAME_GTA_III) { if (getGame() == AGRP_GAME_GTA_III) {
if (doesEntityDataExist(civilian, "agrp.walkStyle")) { if (doesEntityDataExist(civilian, "agrp.walkStyle")) {
let walkStyle = getEntityData(civilian, "agrp.walkStyle"); let walkStyle = getEntityData(civilian, "agrp.walkStyle");
civilian.walkStyle = walkStyle; civilian.walkStyle = walkStyle;
} }
} }
if (getGame() == VRR_GAME_GTA_IV) { if (getGame() == AGRP_GAME_GTA_IV) {
if (doesEntityDataExist(civilian, "agrp.bodyPropHair")) { if (doesEntityDataExist(civilian, "agrp.bodyPropHair")) {
let bodyPropHair = getEntityData(civilian, "agrp.bodyPropHair"); let bodyPropHair = getEntityData(civilian, "agrp.bodyPropHair");
civilian.changeBodyProp(0, bodyPropHair[0], bodyPropHair[1]); civilian.changeBodyProp(0, bodyPropHair[0], bodyPropHair[1]);
@@ -407,7 +415,7 @@ function preventDefaultEventAction(event) {
// =========================================================================== // ===========================================================================
function syncPlayerProperties(player) { function syncPlayerProperties(player) {
if (getGame() == VRR_GAME_GTA_III) { if (getGame() == AGRP_GAME_GTA_III) {
if (doesEntityDataExist(player, "agrp.scale")) { if (doesEntityDataExist(player, "agrp.scale")) {
let scaleFactor = getEntityData(player, "agrp.scale"); let scaleFactor = getEntityData(player, "agrp.scale");
let tempMatrix = player.matrix; let tempMatrix = player.matrix;
@@ -419,21 +427,21 @@ function syncPlayerProperties(player) {
} }
} }
if (getGame() == VRR_GAME_GTA_SA) { if (getGame() == AGRP_GAME_GTA_SA) {
if (doesEntityDataExist(player, "agrp.fightStyle")) { if (doesEntityDataExist(player, "agrp.fightStyle")) {
let fightStyle = getEntityData(player, "agrp.fightStyle"); let fightStyle = getEntityData(player, "agrp.fightStyle");
player.setFightStyle(fightStyle[0], fightStyle[1]); player.setFightStyle(fightStyle[0], fightStyle[1]);
} }
} }
//if(getGame() == VRR_GAME_GTA_SA) { //if(getGame() == AGRP_GAME_GTA_SA) {
// if(doesEntityDataExist(player, "agrp.walkStyle")) { // if(doesEntityDataExist(player, "agrp.walkStyle")) {
// let walkStyle = getEntityData(player, "agrp.walkStyle"); // let walkStyle = getEntityData(player, "agrp.walkStyle");
// player.walkStyle = walkStyle; // player.walkStyle = walkStyle;
// } // }
//} //}
if (getGame() == VRR_GAME_GTA_IV) { if (getGame() == AGRP_GAME_GTA_IV) {
if (doesEntityDataExist(player, "agrp.bodyPartHair")) { if (doesEntityDataExist(player, "agrp.bodyPartHair")) {
let bodyPartHead = getEntityData(player, "agrp.bodyPartHair"); let bodyPartHead = getEntityData(player, "agrp.bodyPartHair");
player.changeBodyPart(0, bodyPartHead[0], bodyPartHair[1]); player.changeBodyPart(0, bodyPartHead[0], bodyPartHair[1]);
@@ -455,7 +463,7 @@ function syncPlayerProperties(player) {
} }
} }
if (getGame() == VRR_GAME_GTA_IV) { if (getGame() == AGRP_GAME_GTA_IV) {
if (doesEntityDataExist(player, "agrp.bodyPropHair")) { if (doesEntityDataExist(player, "agrp.bodyPropHair")) {
let bodyPropHair = getEntityData(player, "agrp.bodyPropHair"); let bodyPropHair = getEntityData(player, "agrp.bodyPropHair");
player.changeBodyProp(0, bodyPropHair[0], bodyPropHair[1]); player.changeBodyProp(0, bodyPropHair[0], bodyPropHair[1]);
@@ -516,7 +524,7 @@ function syncPlayerProperties(player) {
// =========================================================================== // ===========================================================================
function syncObjectProperties(object) { function syncObjectProperties(object) {
if (getGame() == VRR_GAME_GTA_III || getGame() == VRR_GAME_GTA_VC) { if (getGame() == AGRP_GAME_GTA_III || getGame() == AGRP_GAME_GTA_VC) {
if (doesEntityDataExist(object, "agrp.scale")) { if (doesEntityDataExist(object, "agrp.scale")) {
let scaleFactor = getEntityData(object, "agrp.scale"); let scaleFactor = getEntityData(object, "agrp.scale");
let tempMatrix = object.matrix; let tempMatrix = object.matrix;
@@ -620,21 +628,21 @@ function getScreenHeight() {
function openAllGarages() { function openAllGarages() {
switch (getGame()) { switch (getGame()) {
case VRR_GAME_GTA_III: case AGRP_GAME_GTA_III:
for (let i = 0; i <= 26; i++) { for (let i = 0; i <= 26; i++) {
openGarage(i); openGarage(i);
game.NO_SPECIAL_CAMERA_FOR_THIS_GARAGE(i); game.NO_SPECIAL_CAMERA_FOR_THIS_GARAGE(i);
} }
break; break;
case VRR_GAME_GTA_VC: case AGRP_GAME_GTA_VC:
for (let i = 0; i <= 32; i++) { for (let i = 0; i <= 32; i++) {
openGarage(i); openGarage(i);
game.NO_SPECIAL_CAMERA_FOR_THIS_GARAGE(i); game.NO_SPECIAL_CAMERA_FOR_THIS_GARAGE(i);
} }
break; break;
case VRR_GAME_GTA_SA: case AGRP_GAME_GTA_SA:
for (let i = 0; i <= 44; i++) { for (let i = 0; i <= 44; i++) {
openGarage(i); openGarage(i);
} }
@@ -649,21 +657,21 @@ function openAllGarages() {
function closeAllGarages() { function closeAllGarages() {
switch (getGame()) { switch (getGame()) {
case VRR_GAME_GTA_III: case AGRP_GAME_GTA_III:
for (let i = 0; i <= 26; i++) { for (let i = 0; i <= 26; i++) {
closeGarage(i); closeGarage(i);
game.NO_SPECIAL_CAMERA_FOR_THIS_GARAGE(i); game.NO_SPECIAL_CAMERA_FOR_THIS_GARAGE(i);
} }
break; break;
case VRR_GAME_GTA_VC: case AGRP_GAME_GTA_VC:
for (let i = 0; i <= 32; i++) { for (let i = 0; i <= 32; i++) {
closeGarage(i); closeGarage(i);
game.NO_SPECIAL_CAMERA_FOR_THIS_GARAGE(i); game.NO_SPECIAL_CAMERA_FOR_THIS_GARAGE(i);
} }
break; break;
case VRR_GAME_GTA_SA: case AGRP_GAME_GTA_SA:
for (let i = 0; i <= 44; i++) { for (let i = 0; i <= 44; i++) {
closeGarage(i); closeGarage(i);
} }
@@ -683,7 +691,7 @@ function setPedInvincible(ped, state) {
// =========================================================================== // ===========================================================================
function setPedLookAt(ped, position) { function setPedLookAt(ped, position) {
if (getGame() == VRR_GAME_GTA_SA) { if (getGame() == AGRP_GAME_GTA_SA) {
ped.lookAt(position, 10000); ped.lookAt(position, 10000);
return true; return true;
} else { } else {
@@ -697,4 +705,10 @@ function setElementHeading(elementId, heading) {
getElementFromId(elementId).heading = heading; getElementFromId(elementId).heading = heading;
} }
// ===========================================================================
function deleteLocalPlayerPed() {
destroyElement(localPlayer);
}
// =========================================================================== // ===========================================================================

View File

@@ -1,6 +1,7 @@
// =========================================================================== // ===========================================================================
// Vortrex's Roleplay Resource // Asshat Gaming Roleplay
// https://github.com/VortrexFTW/gtac_roleplay // https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// =========================================================================== // ===========================================================================
// FILE: netevents.js // FILE: netevents.js
// DESC: Provides server communication and cross-endpoint network events // DESC: Provides server communication and cross-endpoint network events
@@ -8,20 +9,21 @@
// =========================================================================== // ===========================================================================
function initNetworkEventsScript() { function initNetworkEventsScript() {
logToConsole(LOG_DEBUG, "[VRR.Server]: Initializing server script ..."); logToConsole(LOG_DEBUG, "[AGRP.NetEvents]: Initializing server script ...");
addAllNetworkEventHandlers(); logToConsole(LOG_DEBUG, "[AGRP.NetEvents]: Server script initialized!");
logToConsole(LOG_DEBUG, "[VRR.Server]: Server script initialized!");
} }
// =========================================================================== // ===========================================================================
function addAllNetworkEventHandlers() { function addAllNetworkHandlers() {
logToConsole(LOG_DEBUG, "[VRR.Server]: Adding network handlers ..."); logToConsole(LOG_DEBUG, "[AGRP.Server]: Adding network handlers ...");
// Chat history // Chat Box
addNetworkEventHandler("m", receiveChatBoxMessageFromServer); // Not prefixed with VRR to make it as small as possible addNetworkEventHandler("m", receiveChatBoxMessageFromServer); // Not prefixed with VRR to make it as small as possible
addNetworkEventHandler("agrp.chatScrollLines", setChatScrollLines); addNetworkEventHandler("agrp.chatScrollLines", setChatScrollLines);
addNetworkEventHandler("agrp.chatAutoHideDelay", setChatAutoHideDelay); addNetworkEventHandler("agrp.chatAutoHideDelay", setChatAutoHideDelay);
addNetworkEventHandler("agrp.chatTimeStamps", setChatTimeStampsState);
addNetworkEventHandler("agrp.chatEmoji", setChatEmojiState);
// Messaging (like textdraws and stuff) // Messaging (like textdraws and stuff)
addNetworkEventHandler("agrp.smallGameMessage", showSmallGameMessage); addNetworkEventHandler("agrp.smallGameMessage", showSmallGameMessage);
@@ -46,7 +48,7 @@ function addAllNetworkEventHandlers() {
addNetworkEventHandler("agrp.heading", setLocalPlayerHeading); addNetworkEventHandler("agrp.heading", setLocalPlayerHeading);
addNetworkEventHandler("agrp.interior", setLocalPlayerInterior); addNetworkEventHandler("agrp.interior", setLocalPlayerInterior);
addNetworkEventHandler("agrp.spawned", onServerSpawnedLocalPlayer); addNetworkEventHandler("agrp.spawned", onServerSpawnedLocalPlayer);
addNetworkEventHandler("agrp.money", setLocalPlayerCash); addNetworkEventHandler("agrp.money", setLocalPlayerMoney);
addNetworkEventHandler("agrp.armour", setLocalPlayerArmour); addNetworkEventHandler("agrp.armour", setLocalPlayerArmour);
addNetworkEventHandler("agrp.localPlayerSkin", setLocalPlayerSkin); addNetworkEventHandler("agrp.localPlayerSkin", setLocalPlayerSkin);
addNetworkEventHandler("agrp.pedSpeak", makeLocalPlayerPedSpeak); addNetworkEventHandler("agrp.pedSpeak", makeLocalPlayerPedSpeak);
@@ -59,12 +61,15 @@ function addAllNetworkEventHandlers() {
addNetworkEventHandler("agrp.spawn", serverRequestedLocalPlayerSpawn); addNetworkEventHandler("agrp.spawn", serverRequestedLocalPlayerSpawn);
addNetworkEventHandler("agrp.clearPedState", clearLocalPedState); addNetworkEventHandler("agrp.clearPedState", clearLocalPedState);
addNetworkEventHandler("agrp.drunkEffect", setLocalPlayerDrunkEffect); addNetworkEventHandler("agrp.drunkEffect", setLocalPlayerDrunkEffect);
addNetworkEventHandler("agrp.deleteLocalPlayerPed", deleteLocalPlayerPed);
// Vehicle // Vehicle
addNetworkEventHandler("agrp.vehicle", receiveVehicleFromServer); addNetworkEventHandler("agrp.vehicle", receiveVehicleFromServer);
addNetworkEventHandler("agrp.veh.lights", setVehicleLights); addNetworkEventHandler("agrp.veh.lights", setVehicleLights);
addNetworkEventHandler("agrp.veh.engine", setVehicleEngine); addNetworkEventHandler("agrp.veh.engine", setVehicleEngine);
addNetworkEventHandler("agrp.veh.repair", repairVehicle); addNetworkEventHandler("agrp.veh.repair", repairVehicle);
addNetworkEventHandler("agrp.cruiseControl", toggleLocalVehicleCruiseControl);
addNetworkEventHandler("agrp.passenger", enterVehicleAsPassenger);
// Radio // Radio
addNetworkEventHandler("agrp.radioStream", playStreamingRadio); addNetworkEventHandler("agrp.radioStream", playStreamingRadio);
@@ -81,6 +86,35 @@ function addAllNetworkEventHandlers() {
addNetworkEventHandler("agrp.weaponDamageEnabled", setPlayerWeaponDamageEnabled); addNetworkEventHandler("agrp.weaponDamageEnabled", setPlayerWeaponDamageEnabled);
addNetworkEventHandler("agrp.weaponDamageEvent", setPlayerWeaponDamageEvent); addNetworkEventHandler("agrp.weaponDamageEvent", setPlayerWeaponDamageEvent);
// GUI
addNetworkEventHandler("agrp.showRegistration", showRegistrationGUI);
addNetworkEventHandler("agrp.showNewCharacter", showNewCharacterGUI);
addNetworkEventHandler("agrp.showLogin", showLoginGUI);
addNetworkEventHandler("agrp.2fa", showTwoFactorAuthGUI);
addNetworkEventHandler("agrp.showResetPasswordCodeInput", resetPasswordCodeInputGUI);
addNetworkEventHandler("agrp.showResetPasswordEmailInput", resetPasswordEmailInputGUI);
addNetworkEventHandler("agrp.showChangePassword", showChangePasswordGUI);
addNetworkEventHandler("agrp.showCharacterSelect", showCharacterSelectGUI);
addNetworkEventHandler("agrp.switchCharacterSelect", switchCharacterSelectGUI);
addNetworkEventHandler("agrp.showError", showErrorGUI);
addNetworkEventHandler("agrp.showInfo", showInfoGUI);
addNetworkEventHandler("agrp.showPrompt", showYesNoPromptGUI);
addNetworkEventHandler("agrp.loginSuccess", loginSuccess);
addNetworkEventHandler("agrp.characterSelectSuccess", characterSelectSuccess);
addNetworkEventHandler("agrp.loginFailed", loginFailed);
addNetworkEventHandler("agrp.registrationSuccess", registrationSuccess);
addNetworkEventHandler("agrp.registrationFailed", registrationFailed);
addNetworkEventHandler("agrp.newCharacterFailed", newCharacterFailed);
addNetworkEventHandler("agrp.changePassword", showChangePasswordGUI);
addNetworkEventHandler("agrp.showLocaleChooser", showLocaleChooserGUI);
addNetworkEventHandler("agrp.guiColour", setGUIColours);
addNetworkEventHandler("agrp.mapChangeWarning", setMapChangeWarningState);
// 2D Rendering
addNetworkEventHandler("agrp.set2DRendering", set2DRendering);
addNetworkEventHandler("agrp.logo", setServerLogoRenderState);
addNetworkEventHandler("agrp.showItemActionDelay", showItemActionDelay);
// Business // Business
addNetworkEventHandler("agrp.business", receiveBusinessFromServer); addNetworkEventHandler("agrp.business", receiveBusinessFromServer);
@@ -92,11 +126,22 @@ function addAllNetworkEventHandlers() {
// Locale // Locale
addNetworkEventHandler("agrp.locale", setLocale); addNetworkEventHandler("agrp.locale", setLocale);
addNetworkEventHandler("agrp.localeChooser", toggleLocaleChooserGUI);
// Animation
addNetworkEventHandler("agrp.anim", makePedPlayAnimation);
addNetworkEventHandler("agrp.stopAnim", makePedStopAnimation);
addNetworkEventHandler("agrp.forceAnim", forcePedAnimation);
// Nametags
addNetworkEventHandler("agrp.nametag", updatePlayerNameTag);
addNetworkEventHandler("agrp.nametagDistance", setNameTagDistance);
// Misc // Misc
addNetworkEventHandler("agrp.mouseCursor", toggleMouseCursor); addNetworkEventHandler("agrp.mouseCursor", toggleMouseCursor);
addNetworkEventHandler("agrp.mouseCamera", toggleMouseCamera);
addNetworkEventHandler("agrp.clearPeds", clearLocalPlayerOwnedPeds); addNetworkEventHandler("agrp.clearPeds", clearLocalPlayerOwnedPeds);
addNetworkEventHandler("agrp.passenger", enterVehicleAsPassenger); addNetworkEventHandler("agrp.clearPickups", clearLocalPlayerOwnedPickups);
addNetworkEventHandler("agrp.ambience", setCityAmbienceState); addNetworkEventHandler("agrp.ambience", setCityAmbienceState);
addNetworkEventHandler("agrp.runCode", runClientCode); addNetworkEventHandler("agrp.runCode", runClientCode);
addNetworkEventHandler("agrp.minuteDuration", setMinuteDuration); addNetworkEventHandler("agrp.minuteDuration", setMinuteDuration);
@@ -104,20 +149,20 @@ function addAllNetworkEventHandlers() {
addNetworkEventHandler("agrp.enterPropertyKey", setEnterPropertyKey); addNetworkEventHandler("agrp.enterPropertyKey", setEnterPropertyKey);
addNetworkEventHandler("agrp.skinSelect", toggleSkinSelect); addNetworkEventHandler("agrp.skinSelect", toggleSkinSelect);
addNetworkEventHandler("agrp.hotbar", updatePlayerHotBar); addNetworkEventHandler("agrp.hotbar", updatePlayerHotBar);
addNetworkEventHandler("agrp.showItemActionDelay", showItemActionDelay); addNetworkEventHandler("agrp.mouseCameraForce", setMouseCameraState);
addNetworkEventHandler("agrp.set2DRendering", set2DRendering);
addNetworkEventHandler("agrp.logLevel", setLogLevel); addNetworkEventHandler("agrp.logLevel", setLogLevel);
addNetworkEventHandler("agrp.anim", makePedPlayAnimation); addNetworkEventHandler("agrp.hideAllGUI", hideAllGUI);
addNetworkEventHandler("agrp.stopAnim", makePedStopAnimation); addNetworkEventHandler("agrp.ping", updatePlayerPing);
addNetworkEventHandler("agrp.forceAnim", forcePedAnimation);
addNetworkEventHandler("agrp.clientInfo", serverRequestedClientInfo); addNetworkEventHandler("agrp.clientInfo", serverRequestedClientInfo);
addNetworkEventHandler("agrp.interiorLights", updateInteriorLightsState); addNetworkEventHandler("agrp.interiorLights", updateInteriorLightsState);
addNetworkEventHandler("agrp.cutsceneInterior", setCutsceneInterior); addNetworkEventHandler("agrp.scene", changeScene);
addNetworkEventHandler("agrp.syncElement", forceSyncElementProperties); addNetworkEventHandler("agrp.syncElement", forceSyncElementProperties);
addNetworkEventHandler("agrp.elementPosition", setElementPosition); addNetworkEventHandler("agrp.elementPosition", setElementPosition);
addNetworkEventHandler("agrp.elementCollisions", setElementCollisionsEnabled); addNetworkEventHandler("agrp.elementCollisions", setElementCollisionsEnabled);
addNetworkEventHandler("agrp.vehBuyState", setVehiclePurchaseState); addNetworkEventHandler("agrp.vehBuyState", setVehiclePurchaseState);
addNetworkEventHandler("agrp.holdObject", makePedHoldObject); addNetworkEventHandler("agrp.holdObject", makePedHoldObject);
addNetworkEventHandler("agrp.profanityFilter", setProfanityFilterState);
addNetworkEventHandler("agrp.currencyString", receiveCurrencyStringFromServer);
} }
// =========================================================================== // ===========================================================================
@@ -143,10 +188,10 @@ function sendResourceStoppedSignalToServer() {
// =========================================================================== // ===========================================================================
function set2DRendering(hudState, labelState, smallGameMessageState, scoreboardState, hotBarState, itemActionDelayState) { function set2DRendering(hudState, labelState, smallGameMessageState, scoreboardState, hotBarState, itemActionDelayState) {
logToConsole(LOG_DEBUG, `[VRR.Main] Updating render states (HUD: ${hudState}, Labels: ${labelState}, Bottom Text: ${smallGameMessageState}, Scoreboard: ${scoreboardState}, HotBar: ${hotBarState}, Item Action Delay: ${itemActionDelayState})`); logToConsole(LOG_DEBUG, `[AGRP.Main] Updating render states (HUD: ${hudState}, Labels: ${labelState}, Bottom Text: ${smallGameMessageState}, Scoreboard: ${scoreboardState}, HotBar: ${hotBarState}, Item Action Delay: ${itemActionDelayState})`);
renderHUD = hudState; renderHUD = hudState;
if (getGame() == VRR_GAME_GTA_IV) { if (getGame() == AGRP_GAME_GTA_IV) {
natives.displayCash(hudState); natives.displayCash(hudState);
natives.displayAmmo(hudState); natives.displayAmmo(hudState);
natives.displayHud(hudState); natives.displayHud(hudState);
@@ -168,7 +213,7 @@ function set2DRendering(hudState, labelState, smallGameMessageState, scoreboardS
// =========================================================================== // ===========================================================================
function onServerSpawnedLocalPlayer(state) { function onServerSpawnedLocalPlayer(state) {
logToConsole(LOG_DEBUG, `[VRR.Main] Setting spawned state to ${state}`); logToConsole(LOG_DEBUG, `[AGRP.Main] Setting spawned state to ${state}`);
isSpawned = state; isSpawned = state;
setUpInitialGame(); setUpInitialGame();
if (state) { if (state) {
@@ -292,7 +337,7 @@ function setLogLevel(level) {
function setLocalPlayerInfiniteRun(state) { function setLocalPlayerInfiniteRun(state) {
if (localPlayer != null) { if (localPlayer != null) {
if (getGame() == VRR_GAME_GTA_III || getGame() == VRR_GAME_GTA_VC) { if (getGame() == AGRP_GAME_GTA_III || getGame() == AGRP_GAME_GTA_VC) {
game.SET_PLAYER_NEVER_GETS_TIRED(game.GET_PLAYER_ID(), boolToInt(state)); game.SET_PLAYER_NEVER_GETS_TIRED(game.GET_PLAYER_ID(), boolToInt(state));
} }
} }
@@ -301,9 +346,15 @@ function setLocalPlayerInfiniteRun(state) {
// =========================================================================== // ===========================================================================
function setLocalPlayerSkin(skinId) { function setLocalPlayerSkin(skinId) {
logToConsole(LOG_INFO, `[VRR.Server] Setting locale player skin to ${skinId}`); logToConsole(LOG_INFO, `[AGRP.Server] Setting locale player skin to ${skinId}`);
if (getGame() == VRR_GAME_GTA_IV) { if (getGame() == AGRP_GAME_GTA_IV) {
natives.changePlayerModel(natives.getPlayerId(), skinId); if (natives.isModelInCdimage(skinId)) {
natives.requestModel(skinId);
natives.loadAllObjectsNow();
if (natives.hasModelLoaded(skinId)) {
natives.changePlayerModel(natives.getPlayerId(), skinId);
}
}
} else { } else {
localPlayer.skin = skinId; localPlayer.skin = skinId;
} }
@@ -312,7 +363,7 @@ function setLocalPlayerSkin(skinId) {
// =========================================================================== // ===========================================================================
function makePedHoldObject(pedId, modelIndex) { function makePedHoldObject(pedId, modelIndex) {
if (getGame() == VRR_GAME_GTA_IV) { if (getGame() == AGRP_GAME_GTA_IV) {
natives.givePedAmbientObject(natives.getPedFromNetworkId(pedId), getGameConfig().objects[getGame()][modelIndex][1]) natives.givePedAmbientObject(natives.getPedFromNetworkId(pedId), getGameConfig().objects[getGame()][modelIndex][1])
} }
} }
@@ -320,13 +371,15 @@ function makePedHoldObject(pedId, modelIndex) {
// =========================================================================== // ===========================================================================
function sendLocalPlayerNetworkIdToServer() { function sendLocalPlayerNetworkIdToServer() {
sendNetworkEventToServer("agrp.playerPedId", natives.getNetworkIdFromPed(localPlayer)); if (getGame() == AGRP_GAME_GTA_IV || getGame() == AGRP_GAME_GTA_IV_EFLC) {
sendNetworkEventToServer("agrp.playerPedId", natives.getNetworkIdFromPed(localPlayer));
}
} }
// =========================================================================== // ===========================================================================
function setCutsceneInterior(cutsceneName) { function changeScene(sceneName) {
if (getGame() == VRR_GAME_GTA_IV) { if (getGame() == AGRP_GAME_GTA_IV) {
if (cutsceneName == "") { if (cutsceneName == "") {
natives.clearCutscene(); natives.clearCutscene();
} else { } else {
@@ -335,13 +388,15 @@ function setCutsceneInterior(cutsceneName) {
} }
natives.initCutscene(cutsceneName); natives.initCutscene(cutsceneName);
} }
} else if (getGame() == AGRP_GAME_MAFIA_ONE) {
game.changeMap(sceneName);
} }
} }
// =========================================================================== // ===========================================================================
function makeLocalPlayerPedSpeak(speechName) { function makeLocalPlayerPedSpeak(speechName) {
if (getGame() == VRR_GAME_GTA_IV) { if (getGame() == AGRP_GAME_GTA_IV) {
// if player is in vehicle, allow megaphone (if last arg is "1", it will cancel megaphone echo) // if player is in vehicle, allow megaphone (if last arg is "1", it will cancel megaphone echo)
// Only speeches with _MEGAPHONE will have the bullhorn effect // Only speeches with _MEGAPHONE will have the bullhorn effect
// Afaik it only works on police voices anyway // Afaik it only works on police voices anyway
@@ -350,7 +405,7 @@ function makeLocalPlayerPedSpeak(speechName) {
} else { } else {
natives.sayAmbientSpeech(localPlayer, speechName, true, false, 1); natives.sayAmbientSpeech(localPlayer, speechName, true, false, 1);
} }
} else if (getGame() == VRR_GAME_GTA_III || getGame() == VRR_GAME_GTA_VC) { } else if (getGame() == AGRP_GAME_GTA_III || getGame() == AGRP_GAME_GTA_VC) {
// Don't have a way to get the ped ref ID and can't use ped in arg // Don't have a way to get the ped ref ID and can't use ped in arg
//game.SET_CHAR_SAY(game.GET_PLAYER_ID(), int); //game.SET_CHAR_SAY(game.GET_PLAYER_ID(), int);
} }
@@ -359,7 +414,7 @@ function makeLocalPlayerPedSpeak(speechName) {
// =========================================================================== // ===========================================================================
function setLocalPlayerAsCopState(state) { function setLocalPlayerAsCopState(state) {
if (getGame() == VRR_GAME_GTA_IV) { if (getGame() == AGRP_GAME_GTA_IV) {
natives.setPlayerAsCop(natives.getPlayerId(), state); natives.setPlayerAsCop(natives.getPlayerId(), state);
natives.setPoliceIgnorePlayer(natives.getPlayerId(), state); natives.setPoliceIgnorePlayer(natives.getPlayerId(), state);
} }
@@ -368,7 +423,7 @@ function setLocalPlayerAsCopState(state) {
// =========================================================================== // ===========================================================================
function serverRequestedLocalPlayerSpawn(skinId, position) { function serverRequestedLocalPlayerSpawn(skinId, position) {
if (getGame() == VRR_GAME_GTA_IV) { if (getGame() == AGRP_GAME_GTA_IV) {
natives.createPlayer(skinId, position); natives.createPlayer(skinId, position);
//if(isCustomCameraSupported()) { //if(isCustomCameraSupported()) {
// game.restoreCamera(true); // game.restoreCamera(true);
@@ -382,4 +437,37 @@ function sendLocaleSelectToServer(localeId) {
sendNetworkEventToServer("agrp.localeSelect", localeId); sendNetworkEventToServer("agrp.localeSelect", localeId);
} }
// ===========================================================================
function clearLocalPlayerOwnedPickups() {
let pickups = getPickups().filter(pickup => pickup.isLocal == true);
for (let i in pickups) {
deleteLocalGameElement(pickups[i]);
}
}
// ===========================================================================
function receiveCurrencyStringFromServer(newCurrencyString) {
currencyString = newCurrencyString;
}
// ===========================================================================
function setMapChangeWarningState(state) {
mapChangeWarning = state;
}
// ===========================================================================
function updatePlayerPing(playerName, ping) {
playerPing[playerName] = ping;
}
// ===========================================================================
function receiveClientVariablesFromServer(clientVariablesString) {
serverData.cvars = JSON.parse(clientVariablesString);
}
// =========================================================================== // ===========================================================================

View File

@@ -1,6 +1,7 @@
// =========================================================================== // ===========================================================================
// Vortrex's Roleplay Resource // Asshat Gaming Roleplay
// https://github.com/VortrexFTW/gtac_roleplay // https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// =========================================================================== // ===========================================================================
// FILE: npc.js // FILE: npc.js
// DESC: Provides NPC functions and processing // DESC: Provides NPC functions and processing

39
scripts/client/object.js Normal file
View File

@@ -0,0 +1,39 @@
// ===========================================================================
// Asshat Gaming Roleplay
// https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// ===========================================================================
// FILE: object.js
// DESC: Provides object functions and processing
// TYPE: Client (JavaScript)
// ===========================================================================
let movingObject = null;
// ===========================================================================
function startMovingObject(object) {
}
// ===========================================================================
function stopMovingObject(object, save = true) {
if (save) {
sendNetworkEventToServer("agrp.objectSave", object.id, object.position, object.rotation);
}
}
// ===========================================================================
function isMovingObject() {
return movingObject != null;
}
// ===========================================================================
function getMovingObject() {
return movingObject;
}
// ===========================================================================

View File

@@ -1,6 +1,7 @@
// =========================================================================== // ===========================================================================
// Vortrex's Roleplay Resource // Asshat Gaming Roleplay
// https://github.com/VortrexFTW/gtac_roleplay // https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// =========================================================================== // ===========================================================================
// FILE: radio.js // FILE: radio.js
// DESC: Provides internet streaming radio functions and usage // DESC: Provides internet streaming radio functions and usage
@@ -8,21 +9,21 @@
// =========================================================================== // ===========================================================================
function playStreamingRadio(url, loop, volume, element = false) { function playStreamingRadio(url, loop, volume, element = false) {
if(streamingRadio != null) { if (streamingRadio != null) {
streamingRadio.stop(); streamingRadio.stop();
} }
streamingRadioVolume = volume; streamingRadioVolume = volume;
streamingRadio = audio.createSoundFromURL(url, loop); streamingRadio = audio.createSoundFromURL(url, loop);
streamingRadio.volume = volume/100; streamingRadio.volume = volume / 100;
streamingRadio.play(); streamingRadio.play();
} }
// =========================================================================== // ===========================================================================
function stopStreamingRadio() { function stopStreamingRadio() {
if(streamingRadio != null) { if (streamingRadio != null) {
streamingRadio.stop(); streamingRadio.stop();
} }
streamingRadio = null; streamingRadio = null;
@@ -31,16 +32,20 @@ function stopStreamingRadio() {
// =========================================================================== // ===========================================================================
function setStreamingRadioVolume(volume) { function setStreamingRadioVolume(volume) {
if(streamingRadio != null) { if (streamingRadio != null) {
streamingRadioVolume = volume; streamingRadioVolume = volume;
streamingRadio.volume = volume/100; streamingRadio.volume = volume / 100;
} }
} }
// =========================================================================== // ===========================================================================
function playAudioFile(audioName, loop, volume) { function playAudioFile(audioName, loop, volume) {
findResourceByName("connectedrp-extra").exports.playCustomAudio(audioName, volume/100, loop); findResourceByName("connectedrp-extra").exports.playCustomAudio(audioName, volume / 100, loop);
} }
// =========================================================================== // ===========================================================================
function getStreamingRadioVolumeForPosition(position1, position2) {
return false;
}

View File

@@ -0,0 +1,105 @@
// ===========================================================================
// Asshat Gaming Roleplay
// https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// ===========================================================================
// FILE: scoreboard.js
// DESC: Provides scoreboard features and rendering
// TYPE: Client (JavaScript)
// ===========================================================================
let scoreBoardTitleFont = null;
let scoreBoardListFont = null;
let pausedColour = COLOUR_RED;
let scoreboardKey = SDLK_TAB;
// ===========================================================================
function initScoreBoardScript() {
logToConsole(LOG_DEBUG, "[AGRP.ScoreBoard]: Initializing scoreboard script ...");
scoreBoardTitleFont = initScoreBoardTitleFont();
scoreBoardListFont = initScoreBoardListFont();
logToConsole(LOG_DEBUG, "[AGRP.ScoreBoard]: Scoreboard script initialized!");
}
// ===========================================================================
function initScoreBoardTitleFont() {
return lucasFont.createDefaultFont(22.0, "Roboto", "Regular");
}
// ===========================================================================
function initScoreBoardListFont() {
return lucasFont.createDefaultFont(12.0, "Roboto", "Light");
}
// ===========================================================================
function processScoreBoardRendering() {
if (isAnyGUIActive()) {
return false;
}
if (renderScoreBoard) {
if (isKeyDown(SDLK_TAB)) {
if (scoreBoardListFont != null && scoreBoardTitleFont != null) {
let scoreboardStart = (game.height / 2) - (Math.floor(getClients().length / 2) * 20);
let titleSize = scoreBoardTitleFont.measure("PLAYERS", game.width, 0.0, 1.0, 10, false, false);
scoreBoardTitleFont.render("PLAYERS", [game.width / 2, scoreboardStart - 50], 0, 0.5, 0.0, scoreBoardTitleFont.size, COLOUR_WHITE, false, false, false, true);
titleSize = scoreBoardTitleFont.measure("____________________________", game.width, 0.0, 1.0, 10, false, false);
scoreBoardTitleFont.render("____________________________", [game.width / 2, scoreboardStart - 35], 0, 0.5, 0.0, scoreBoardTitleFont.size, COLOUR_WHITE, false, false, false, true);
let clients = getClients();
for (let i in clients) {
if (!clients[i].console) {
let name = clients[i].name;
let colour = COLOUR_WHITE;
let paused = false;
let ping = "-1";
if (typeof playerNames[clients[i].name] != "undefined") {
name = playerNames[clients[i].name];
}
if (typeof playerPaused[clients[i].name] != "undefined") {
paused = playerPaused[clients[i].name];
}
if (typeof playerColours[clients[i].name] != "undefined") {
colour = playerColours[clients[i].name];
}
if (typeof playerPing[clients[i].name] != "undefined") {
ping = toString(playerPing[clients[i].name]);
}
// Player ID
let text = String(clients[i].index);
let size = scoreBoardListFont.measure(text, 75, 0.0, 1.0, 10, false, false);
scoreBoardListFont.render(text, [game.width / 2 - 100, scoreboardStart + (i * 20)], 0, 0.5, 0.0, scoreBoardListFont.size, COLOUR_WHITE, false, false, false, true);
// Player Name
text = name;
size = scoreBoardListFont.measure(text, 100, 0.0, 1.0, 10, false, false);
scoreBoardListFont.render(text, [game.width / 2, scoreboardStart + (i * 20)], 0, 0.5, 0.0, scoreBoardListFont.size, colour, false, false, false, true);
// Ping
text = ping;
size = scoreBoardListFont.measure(ping, 75, 0.0, 1.0, 10, false, false);
scoreBoardListFont.render(ping, [game.width / 2 + 100, scoreboardStart + (i * 20)], 0, 0.5, 0.0, scoreBoardListFont.size, COLOUR_WHITE, false, false, false, true);
// PAUSED Status (depends on resource "afk")
if (paused == true) {
size = scoreBoardListFont.measure("PAUSED", 100, 0.0, 1.0, 10, false, false);
scoreBoardListFont.render("PAUSED", [game.width / 2 + 200, scoreboardStart + (i * 20)], 0, 0.5, 0.0, scoreBoardListFont.size, pausedColour, false, false, false, true);
}
}
}
}
}
}
}

View File

@@ -1,6 +1,7 @@
// =========================================================================== // ===========================================================================
// Vortrex's Roleplay Resource // Asshat Gaming Roleplay
// https://github.com/VortrexFTW/gtac_roleplay // https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// =========================================================================== // ===========================================================================
// FILE: skin-select.js // FILE: skin-select.js
// DESC: Provides skin-selector functions and usage // DESC: Provides skin-selector functions and usage
@@ -10,7 +11,7 @@
let skinSelectMessageFontTop = null; let skinSelectMessageFontTop = null;
let skinSelectMessageFontBottom = null; let skinSelectMessageFontBottom = null;
let skinSelectMessageTextTop = "Skin Name"; let skinSelectMessageTextTop = "Skin Name";
let skinSelectMessageTextBottom = "Choose a skin using PAGEUP and PAGEDOWN keys. Use ENTER to finish or BACKSPACE to cancel."; let skinSelectMessageTextBottom = "Choose a skin using LEFT and RIGHT arrow keys. Use ENTER to finish or BACKSPACE to cancel.";
let skinSelectMessageColourTop = COLOUR_YELLOW; let skinSelectMessageColourTop = COLOUR_YELLOW;
let skinSelectMessageColourBottom = COLOUR_WHITE; let skinSelectMessageColourBottom = COLOUR_WHITE;
@@ -23,10 +24,10 @@ let skinSelectHeading = null;
// =========================================================================== // ===========================================================================
function initSkinSelectScript() { function initSkinSelectScript() {
logToConsole(LOG_DEBUG, "[VRR.SkinSelect]: Initializing skin selector script ..."); logToConsole(LOG_DEBUG, "[AGRP.SkinSelect]: Initializing skin selector script ...");
skinSelectMessageFontTop = loadSkinSelectMessageFontTop(); skinSelectMessageFontTop = loadSkinSelectMessageFontTop();
skinSelectMessageFontBottom = loadSkinSelectMessageFontBottom(); skinSelectMessageFontBottom = loadSkinSelectMessageFontBottom();
logToConsole(LOG_DEBUG, "[VRR.SkinSelect]: Skin selector script initialized!"); logToConsole(LOG_DEBUG, "[AGRP.SkinSelect]: Skin selector script initialized!");
} }
// =========================================================================== // ===========================================================================
@@ -45,7 +46,7 @@ function loadSkinSelectMessageFontBottom() {
function processSkinSelectKeyPress(keyCode) { function processSkinSelectKeyPress(keyCode) {
if (usingSkinSelector) { if (usingSkinSelector) {
if (keyCode == SDLK_PAGEUP) { if (keyCode == getKeyIdFromParams("left") || keyCode == getKeyIdFromParams("a")) {
if (skinSelectorIndex >= allowedSkins.length - 1) { if (skinSelectorIndex >= allowedSkins.length - 1) {
skinSelectorIndex = 1; skinSelectorIndex = 1;
} else { } else {
@@ -53,19 +54,8 @@ function processSkinSelectKeyPress(keyCode) {
} }
logToConsole(LOG_DEBUG, `Switching to skin ${allowedSkins[skinSelectorIndex][1]} (Index: ${skinSelectorIndex}, Skin: ${allowedSkins[skinSelectorIndex][0]})`); logToConsole(LOG_DEBUG, `Switching to skin ${allowedSkins[skinSelectorIndex][1]} (Index: ${skinSelectorIndex}, Skin: ${allowedSkins[skinSelectorIndex][0]})`);
skinSelectMessageTextTop = allowedSkins[skinSelectorIndex][1]; skinSelectMessageTextTop = allowedSkins[skinSelectorIndex][1];
if (getGame() == VRR_GAME_GTA_IV) { setLocalPlayerSkin(allowedSkins[skinSelectorIndex][0]);
let skinId = allowedSkins[skinSelectorIndex][0]; } else if (keyCode == getKeyIdFromParams("right") || keyCode == getKeyIdFromParams("d")) {
if (natives.isModelInCdimage(skinId)) {
natives.requestModel(skinId);
natives.loadAllObjectsNow();
if (natives.hasModelLoaded(skinId)) {
natives.changePlayerModel(natives.getPlayerId(), skinId);
}
}
} else {
localPlayer.skin = allowedSkins[skinSelectorIndex][0];
}
} else if (keyCode == SDLK_PAGEDOWN) {
if (skinSelectorIndex <= 0) { if (skinSelectorIndex <= 0) {
skinSelectorIndex = allowedSkins.length - 1; skinSelectorIndex = allowedSkins.length - 1;
} else { } else {
@@ -73,28 +63,20 @@ function processSkinSelectKeyPress(keyCode) {
} }
logToConsole(LOG_DEBUG, `Switching to skin ${allowedSkins[skinSelectorIndex][1]} (Index: ${skinSelectorIndex}, Skin: ${allowedSkins[skinSelectorIndex][0]})`); logToConsole(LOG_DEBUG, `Switching to skin ${allowedSkins[skinSelectorIndex][1]} (Index: ${skinSelectorIndex}, Skin: ${allowedSkins[skinSelectorIndex][0]})`);
skinSelectMessageTextTop = allowedSkins[skinSelectorIndex][1]; skinSelectMessageTextTop = allowedSkins[skinSelectorIndex][1];
if (getGame() == VRR_GAME_GTA_IV) { setLocalPlayerSkin(allowedSkins[skinSelectorIndex][0]);
let skinId = allowedSkins[skinSelectorIndex][0]; } else if (keyCode == getKeyIdFromParams("enter")) {
if (natives.isModelInCdimage(skinId)) {
natives.requestModel(skinId);
natives.loadAllObjectsNow();
if (natives.hasModelLoaded(skinId)) {
natives.changePlayerModel(natives.getPlayerId(), skinId);
}
}
} else {
localPlayer.skin = allowedSkins[skinSelectorIndex][0];
}
} else if (keyCode == SDLK_RETURN) {
sendNetworkEventToServer("agrp.skinSelected", skinSelectorIndex); sendNetworkEventToServer("agrp.skinSelected", skinSelectorIndex);
toggleSkinSelect(false); toggleSkinSelect(false);
return true; return true;
} else if (keyCode == SDLK_BACKSPACE) { } else if (keyCode == getKeyIdFromParams("backspace")) {
sendNetworkEventToServer("agrp.skinSelected", -1); sendNetworkEventToServer("agrp.skinSelected", -1);
toggleSkinSelect(false); toggleSkinSelect(false);
return true; return true;
} }
localPlayer.heading = skinSelectHeading;
if (getGame() <= AGRP_GAME_GTA_SA) {
localPlayer.heading = skinSelectHeading;
}
} }
} }
@@ -125,13 +107,21 @@ function toggleSkinSelect(state) {
skinSelectHeading = localPlayer.heading; skinSelectHeading = localPlayer.heading;
if (isCustomCameraSupported()) { if (isCustomCameraSupported()) {
let tempPosition = localPlayer.position; let cameraPosition = localPlayer.position;
tempPosition.z += 0.5; let playerPosition = localPlayer.position;
let frontCameraPosition = getPosInFrontOfPos(tempPosition, localPlayer.heading, 3); if (getGame() == AGRP_GAME_MAFIA_ONE) {
game.setCameraLookAt(frontCameraPosition, localPlayer.position, true); cameraPosition.y += 1.5;
playerPosition.y += 1.5;
distance = 3;
} else {
cameraPosition.z += 0.5;
distance = 3;
}
let frontCameraPosition = getPosInFrontOfPos(cameraPosition, localPlayer.heading, distance);
game.setCameraLookAt(frontCameraPosition, playerPosition, true);
} }
if (getGame() == VRR_GAME_GTA_IV) { if (getGame() == AGRP_GAME_GTA_IV) {
let skinId = allowedSkins[skinSelectorIndex][0]; let skinId = allowedSkins[skinSelectorIndex][0];
if (natives.isModelInCdimage(skinId)) { if (natives.isModelInCdimage(skinId)) {
natives.requestModel(skinId); natives.requestModel(skinId);

View File

@@ -1,6 +1,7 @@
// =========================================================================== // ===========================================================================
// Vortrex's Roleplay Resource // Asshat Gaming Roleplay
// https://github.com/VortrexFTW/gtac_roleplay // https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// =========================================================================== // ===========================================================================
// FILE: startup.js // FILE: startup.js
// DESC: Provides startup/shutdown procedures // DESC: Provides startup/shutdown procedures
@@ -8,19 +9,27 @@
// =========================================================================== // ===========================================================================
function initClientScripts() { function initClientScripts() {
initGUIScript();
initNameTagScript();
initScoreBoardScript();
initMessagingScript(); initMessagingScript();
initNetworkEventsScript(); initNetworkEventsScript();
initLogoScript();
initLabelScript();
initChatBoxScript(); initChatBoxScript();
initAFKScript(); initAFKScript();
initKeyBindScript(); initKeyBindScript();
initEventScript(); initEventScript();
initSkinSelectScript(); initSkinSelectScript();
initCursorScript();
addAllNetworkHandlers();
} }
// =========================================================================== // ===========================================================================
function setUpInitialGame() { function setUpInitialGame() {
if (getGame() == VRR_GAME_GTA_III) { if (getGame() == AGRP_GAME_GTA_III) {
logToConsole(LOG_DEBUG | LOG_WARN, "Setting up initial game stuff for GTA III ..."); logToConsole(LOG_DEBUG | LOG_WARN, "Setting up initial game stuff for GTA III ...");
// Turn off unlimited sprint // Turn off unlimited sprint
@@ -39,7 +48,7 @@ function setUpInitialGame() {
// Provided by mouse camera script (mousecam.js) // Provided by mouse camera script (mousecam.js)
SetStandardControlsEnabled(true); SetStandardControlsEnabled(true);
} else if (getGame() == VRR_GAME_GTA_VC) { } else if (getGame() == AGRP_GAME_GTA_VC) {
logToConsole(LOG_DEBUG | LOG_WARN, "Setting up initial game stuff for GTA Vice City ..."); logToConsole(LOG_DEBUG | LOG_WARN, "Setting up initial game stuff for GTA Vice City ...");
// Turn off unlimited sprint // Turn off unlimited sprint
@@ -82,7 +91,7 @@ function setUpInitialGame() {
// Provided by mouse camera script (mousecam.js) // Provided by mouse camera script (mousecam.js)
SetStandardControlsEnabled(true); SetStandardControlsEnabled(true);
} else if (getGame() == VRR_GAME_GTA_SA) { } else if (getGame() == AGRP_GAME_GTA_SA) {
logToConsole(LOG_DEBUG | LOG_WARN, "Setting up initial game stuff for GTA San Andreas ..."); logToConsole(LOG_DEBUG | LOG_WARN, "Setting up initial game stuff for GTA San Andreas ...");
// Turn weapon skills down a bit // Turn weapon skills down a bit
game.setGameStat(STAT_WEAPONTYPE_PISTOL_SKILL, 400); game.setGameStat(STAT_WEAPONTYPE_PISTOL_SKILL, 400);
@@ -119,7 +128,7 @@ function setUpInitialGame() {
// Disables taxi/vigilante/etc and other start mission triggers // Disables taxi/vigilante/etc and other start mission triggers
game.onMission = true; game.onMission = true;
} else if (getGame() == VRR_GAME_GTA_IV) { } else if (getGame() == AGRP_GAME_GTA_IV) {
natives.allowEmergencyServices(false); natives.allowEmergencyServices(false);
natives.setCreateRandomCops(true); natives.setCreateRandomCops(true);
natives.setMaxWantedLevel(0); natives.setMaxWantedLevel(0);
@@ -181,7 +190,7 @@ function setUpInitialGame() {
// Some last steps // Some last steps
//natives.loadAllObjectsNow(); //natives.loadAllObjectsNow();
} else if (getGame() == VRR_GAME_MAFIA_ONE) { } else if (getGame() == AGRP_GAME_MAFIA_ONE) {
game.mapEnabled = false; game.mapEnabled = false;
game.setTrafficEnabled(false); game.setTrafficEnabled(false);
} }

View File

@@ -1,6 +1,7 @@
// =========================================================================== // ===========================================================================
// Vortrex's Roleplay Resource // Asshat Gaming Roleplay
// https://github.com/VortrexFTW/gtac_roleplay // https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// =========================================================================== // ===========================================================================
// FILE: sync.js // FILE: sync.js
// DESC: Provides some elements and data sync // DESC: Provides some elements and data sync
@@ -39,39 +40,22 @@ function processSync(event, deltaTime) {
} }
if (streamingRadioElement) { if (streamingRadioElement) {
streamingRadio.position = getElementPosition(streamingRadioElement.id);
//streamingRadio.volume = getStreamingRadioVolumeForPosition(streamingRadio.position); //streamingRadio.volume = getStreamingRadioVolumeForPosition(streamingRadio.position);
} }
} }
// =========================================================================== // ===========================================================================
function setVehicleEngine(vehicleId, state) {
getElementFromId(vehicleId).engine = state;
}
// ===========================================================================
function setVehicleLights(vehicleId, state) { function setVehicleLights(vehicleId, state) {
if (getGame() != VRR_GAME_MAFIA_ONE) { //if (getGame() == AGRP_GAME_GTA_IV) {
if (!state) { // if (!state) {
getElementFromId(vehicleId).lightStatus = 2; // natives.forceCarLights(natives.getVehicleFromNetworkId(vehicleId, 0));
} else { // } else {
getElementFromId(vehicleId).lightStatus = 1; // natives.forceCarLights(natives.getVehicleFromNetworkId(vehicleId, 1));
} // }
} else if (getGame() == VRR_GAME_GTA_IV) { //} else {
if (!state) { getElementFromId(vehicleId).lights = state;
natives.forceCarLights(natives.getVehicleFromNetworkId(vehicleId, 0)); //}
} else {
natives.forceCarLights(natives.getVehicleFromNetworkId(vehicleId, 1));
}
} else {
if (!state) {
getElementFromId(vehicleId).lights = false;
} else {
getElementFromId(vehicleId).lights = true;
}
}
} }
// =========================================================================== // ===========================================================================
@@ -89,11 +73,12 @@ function syncVehicleProperties(vehicle) {
if (doesEntityDataExist(vehicle, "agrp.lights")) { if (doesEntityDataExist(vehicle, "agrp.lights")) {
let lightStatus = getEntityData(vehicle, "agrp.lights"); let lightStatus = getEntityData(vehicle, "agrp.lights");
if (!lightStatus) { vehicle.lights = lightStatus;
vehicle.lightStatus = 2; }
} else {
vehicle.lightStatus = 1; if (doesEntityDataExist(vehicle, "agrp.locked")) {
} let lockStatus = getEntityData(vehicle, "agrp.locked");
vehicle.locked = lockStatus;
} }
if (doesEntityDataExist(vehicle, "agrp.invincible")) { if (doesEntityDataExist(vehicle, "agrp.invincible")) {
@@ -127,7 +112,7 @@ function syncVehicleProperties(vehicle) {
vehicle.setSuspensionHeight(suspensionHeight); vehicle.setSuspensionHeight(suspensionHeight);
} }
if (getGame() == VRR_GAME_GTA_SA) { if (isGameFeatureSupported("vehicleUpgrades")) {
//let allUpgrades = getGameConfig().vehicleUpgrades[getGame()]; //let allUpgrades = getGameConfig().vehicleUpgrades[getGame()];
//for(let i in allUpgrades) { //for(let i in allUpgrades) {
// vehicle.removeUpgrade(i); // vehicle.removeUpgrade(i);
@@ -143,12 +128,12 @@ function syncVehicleProperties(vehicle) {
} }
} }
if (getGame() == VRR_GAME_GTA_SA || getGame() == VRR_GAME_GTA_IV) { if (getGame() == AGRP_GAME_GTA_SA || getGame() == AGRP_GAME_GTA_IV) {
if (doesEntityDataExist(vehicle, "agrp.livery")) { if (doesEntityDataExist(vehicle, "agrp.livery")) {
let livery = getEntityData(vehicle, "agrp.livery"); let livery = getEntityData(vehicle, "agrp.livery");
if (getGame() == VRR_GAME_GTA_SA) { if (getGame() == AGRP_GAME_GTA_SA) {
vehicle.setPaintJob(livery); vehicle.setPaintJob(livery);
} else if (getGame() == VRR_GAME_GTA_IV) { } else if (getGame() == AGRP_GAME_GTA_IV) {
vehicle.livery = livery; vehicle.livery = livery;
} }
} }
@@ -162,7 +147,7 @@ function syncCivilianProperties(civilian) {
return false; return false;
} }
if (getGame() == VRR_GAME_GTA_III) { if (isGameFeatureSupported("pedScale")) {
if (doesEntityDataExist(civilian, "agrp.scale")) { if (doesEntityDataExist(civilian, "agrp.scale")) {
let scaleFactor = getEntityData(civilian, "agrp.scale"); let scaleFactor = getEntityData(civilian, "agrp.scale");
let tempMatrix = civilian.matrix; let tempMatrix = civilian.matrix;
@@ -174,21 +159,21 @@ function syncCivilianProperties(civilian) {
} }
} }
if (getGame() == VRR_GAME_GTA_SA) { if (getGame() == AGRP_GAME_GTA_SA) {
if (doesEntityDataExist(civilian, "agrp.fightStyle")) { if (doesEntityDataExist(civilian, "agrp.fightStyle")) {
let fightStyle = getEntityData(civilian, "agrp.fightStyle"); let fightStyle = getEntityData(civilian, "agrp.fightStyle");
civilian.setFightStyle(fightStyle[0], fightStyle[1]); civilian.setFightStyle(fightStyle[0], fightStyle[1]);
} }
} }
if (getGame() == VRR_GAME_GTA_III) { if (getGame() == AGRP_GAME_GTA_SA) {
if (doesEntityDataExist(civilian, "agrp.walkStyle")) { if (doesEntityDataExist(civilian, "agrp.walkStyle")) {
let walkStyle = getEntityData(civilian, "agrp.walkStyle"); let walkStyle = getEntityData(civilian, "agrp.walkStyle");
civilian.walkStyle = walkStyle; civilian.walkStyle = walkStyle;
} }
} }
if (getGame() == VRR_GAME_GTA_IV) { if (getGame() == AGRP_GAME_GTA_IV) {
if (doesEntityDataExist(civilian, "agrp.bodyPropHair")) { if (doesEntityDataExist(civilian, "agrp.bodyPropHair")) {
let bodyPropHair = getEntityData(civilian, "agrp.bodyPropHair"); let bodyPropHair = getEntityData(civilian, "agrp.bodyPropHair");
civilian.changeBodyProp(0, bodyPropHair[0], bodyPropHair[1]); civilian.changeBodyProp(0, bodyPropHair[0], bodyPropHair[1]);
@@ -254,12 +239,32 @@ function syncCivilianProperties(civilian) {
// =========================================================================== // ===========================================================================
function syncObjectProperties(object) {
if (!areServerElementsSupported()) {
return false;
}
if (isGameFeatureSupported("objectScale")) {
if (doesEntityDataExist(object, "agrp.scale")) {
let scaleFactor = getEntityData(object, "agrp.scale");
let tempMatrix = object.matrix;
tempMatrix.setScale(toVector3(scaleFactor.x, scaleFactor.y, scaleFactor.z));
let tempPosition = object.position;
object.matrix = tempMatrix;
tempPosition.z += scaleFactor.z;
object.position = tempPosition;
}
}
}
// ===========================================================================
function syncPlayerProperties(player) { function syncPlayerProperties(player) {
if (!areServerElementsSupported()) { if (!areServerElementsSupported()) {
return false; return false;
} }
if (getGame() == VRR_GAME_GTA_III) { if (isGameFeatureSupported("pedScale")) {
if (doesEntityDataExist(player, "agrp.scale")) { if (doesEntityDataExist(player, "agrp.scale")) {
let scaleFactor = getEntityData(player, "agrp.scale"); let scaleFactor = getEntityData(player, "agrp.scale");
let tempMatrix = player.matrix; let tempMatrix = player.matrix;
@@ -271,21 +276,21 @@ function syncPlayerProperties(player) {
} }
} }
if (getGame() == VRR_GAME_GTA_SA) { if (getGame() == AGRP_GAME_GTA_SA) {
if (doesEntityDataExist(player, "agrp.fightStyle")) { if (doesEntityDataExist(player, "agrp.fightStyle")) {
let fightStyle = getEntityData(player, "agrp.fightStyle"); let fightStyle = getEntityData(player, "agrp.fightStyle");
player.setFightStyle(fightStyle[0], fightStyle[1]); player.setFightStyle(fightStyle[0], fightStyle[1]);
} }
} }
//if(getGame() == VRR_GAME_GTA_SA) { //if(getGame() == AGRP_GAME_GTA_SA) {
// if(doesEntityDataExist(player, "agrp.walkStyle")) { // if(doesEntityDataExist(player, "agrp.walkStyle")) {
// let walkStyle = getEntityData(player, "agrp.walkStyle"); // let walkStyle = getEntityData(player, "agrp.walkStyle");
// player.walkStyle = walkStyle; // player.walkStyle = walkStyle;
// } // }
//} //}
if (getGame() == VRR_GAME_GTA_IV) { if (getGame() == AGRP_GAME_GTA_IV) {
if (doesEntityDataExist(player, "agrp.bodyPartHair")) { if (doesEntityDataExist(player, "agrp.bodyPartHair")) {
let bodyPartHead = getEntityData(player, "agrp.bodyPartHair"); let bodyPartHead = getEntityData(player, "agrp.bodyPartHair");
player.changeBodyPart(0, bodyPartHead[0], bodyPartHair[1]); player.changeBodyPart(0, bodyPartHead[0], bodyPartHair[1]);
@@ -307,7 +312,7 @@ function syncPlayerProperties(player) {
} }
} }
if (getGame() == VRR_GAME_GTA_IV) { if (getGame() == AGRP_GAME_GTA_IV) {
if (doesEntityDataExist(player, "agrp.bodyPropHair")) { if (doesEntityDataExist(player, "agrp.bodyPropHair")) {
let bodyPropHair = getEntityData(player, "agrp.bodyPropHair"); let bodyPropHair = getEntityData(player, "agrp.bodyPropHair");
player.changeBodyProp(0, bodyPropHair[0], bodyPropHair[1]); player.changeBodyProp(0, bodyPropHair[0], bodyPropHair[1]);
@@ -372,13 +377,21 @@ function syncElementProperties(element) {
return false; return false;
} }
if (doesEntityDataExist(element, "agrp.interior")) { if (isGameFeatureSupported("interior")) {
if (typeof element.interior != "undefined") { if (doesEntityDataExist(element, "agrp.interior")) {
element.interior = getEntityData(element, "agrp.interior"); if (typeof element.interior != "undefined") {
element.interior = getEntityData(element, "agrp.interior");
}
} }
} }
if (getGame() == VRR_GAME_MAFIA_ONE) { if (isGameFeatureSupported("toggleCollision")) {
if (doesEntityDataExist(element, "agrp.collisions")) {
element.collisionsEnabled = getEntityData(element, "agrp.collisions");
}
}
if (getGame() == AGRP_GAME_MAFIA_ONE) {
switch (element.type) { switch (element.type) {
case ELEMENT_VEHICLE: case ELEMENT_VEHICLE:
syncVehicleProperties(element); syncVehicleProperties(element);
@@ -409,6 +422,10 @@ function syncElementProperties(element) {
syncPlayerProperties(element); syncPlayerProperties(element);
break; break;
case ELEMENT_OBJECT:
syncObjectProperties(element);
break;
default: default:
break; break;
} }
@@ -419,7 +436,7 @@ function syncElementProperties(element) {
// =========================================================================== // ===========================================================================
function receiveHouseFromServer(houseId, entrancePosition, blipModel, pickupModel, hasInterior) { function receiveHouseFromServer(houseId, entrancePosition, blipModel, pickupModel, hasInterior) {
if (getGame() == VRR_GAME_GTA_IV) { if (getGame() == AGRP_GAME_GTA_IV) {
} }
} }

View File

@@ -1,6 +1,7 @@
// =========================================================================== // ===========================================================================
// Vortrex's Roleplay Resource // Asshat Gaming Roleplay
// https://github.com/VortrexFTW/gtac_roleplay // https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// =========================================================================== // ===========================================================================
// FILE: utilities.js // FILE: utilities.js
// DESC: Provides util functions and arrays with data // DESC: Provides util functions and arrays with data
@@ -8,18 +9,19 @@
// =========================================================================== // ===========================================================================
function setLocalPlayerFrozenState(state) { function setLocalPlayerFrozenState(state) {
logToConsole(LOG_DEBUG, `[VRR.Utilities] Setting frozen state to ${state}`); logToConsole(LOG_DEBUG, `[AGRP.Utilities] Setting frozen state to ${state}`);
gui.showCursor(state, !state); gui.showCursor(state, !state);
} }
// =========================================================================== // ===========================================================================
function setLocalPlayerControlState(controlState, cursorState = false) { function setLocalPlayerControlState(controlState, cursorState = false) {
logToConsole(LOG_DEBUG, `[VRR.Utilities] Setting control state to ${controlState} (Cursor: ${cursorState})`); logToConsole(LOG_DEBUG, `[AGRP.Utilities] Setting control state to ${controlState} (Cursor: ${cursorState})`);
controlsEnabled = controlState; controlsEnabled = controlState;
if (getGame() == VRR_GAME_GTA_III || getGame() == VRR_GAME_GTA_VC) { game.setPlayerControl(controlState);
if (getGame() == AGRP_GAME_GTA_III || getGame() == AGRP_GAME_GTA_VC) {
game.SET_PLAYER_CONTROL(game.GET_PLAYER_ID(), boolToInt(controlState)); game.SET_PLAYER_CONTROL(game.GET_PLAYER_ID(), boolToInt(controlState));
} else if (getGame() != VRR_GAME_GTA_IV) { } else if (getGame() <= AGRP_GAME_GTA_IV) {
setElementCollisionsEnabled(localPlayer, controlState); setElementCollisionsEnabled(localPlayer, controlState);
setPedInvincible(localPlayer, true); setPedInvincible(localPlayer, true);
} }
@@ -27,14 +29,15 @@ function setLocalPlayerControlState(controlState, cursorState = false) {
// =========================================================================== // ===========================================================================
function fadeLocalCamera(state, time) { function fadeLocalCamera(state, duration, colour) {
if (isFadeCameraSupported()) { logToConsole(LOG_DEBUG, `[AGRP.Utilities] Fading camera ${(state) ? "in" : "out"} for ${time}ms`);
logToConsole(LOG_DEBUG, `[VRR.Utilities] Fading camera ${(state) ? "in" : "out"} for ${time} seconds`);
if (isFadeCameraSupported()) { cameraFadeDuration = duration;
game.fadeCamera(state, time); cameraFadeStart = sdl.ticks;
} cameraFadeEnabled = true;
} cameraFadeIn = state;
cameraFadeColour = colour;
cameraFadeAlpha = (state) ? 255 : 0;
} }
// =========================================================================== // ===========================================================================
@@ -46,24 +49,16 @@ function removeLocalPlayerFromVehicle() {
// =========================================================================== // ===========================================================================
function restoreLocalCamera() { function restoreLocalCamera() {
logToConsole(LOG_DEBUG, `[VRR.Utilities] Camera restored`); logToConsole(LOG_DEBUG, `[AGRP.Utilities] Camera restored`);
if (isCustomCameraSupported()) { if (isGameFeatureSupported("customCamera")) {
game.restoreCamera(true); game.restoreCamera(true);
} }
}; };
// =========================================================================== // ===========================================================================
function clearLocalPlayerOwnedPeds() {
logToConsole(LOG_DEBUG, `[VRR.Utilities] Clearing all self-owned peds ...`);
clearSelfOwnedPeds();
logToConsole(LOG_DEBUG, `[VRR.Utilities] All self-owned peds cleared`);
};
// ===========================================================================
function setLocalCameraLookAt(cameraPosition, cameraLookAt) { function setLocalCameraLookAt(cameraPosition, cameraLookAt) {
logToConsole(LOG_DEBUG, `[VRR.Utilities] Set camera to look at [${cameraLookAt.x}, ${cameraLookAt.y}, ${cameraLookAt.z}] from [${cameraPosition.x}, ${cameraPosition.y}, ${cameraPosition.z}]`); logToConsole(LOG_DEBUG, `[AGRP.Utilities] Set camera to look at [${cameraLookAt.x}, ${cameraLookAt.y}, ${cameraLookAt.z}] from [${cameraPosition.x}, ${cameraPosition.y}, ${cameraPosition.z}]`);
if (isCustomCameraSupported()) { if (isCustomCameraSupported()) {
game.setCameraLookAt(cameraPosition, cameraLookAt, true); game.setCameraLookAt(cameraPosition, cameraLookAt, true);
} }
@@ -71,13 +66,21 @@ function setLocalCameraLookAt(cameraPosition, cameraLookAt) {
// =========================================================================== // ===========================================================================
function clearLocalPlayerOwnedPeds() {
logToConsole(LOG_DEBUG, `[AGRP.Utilities] Clearing all self-owned peds ...`);
clearSelfOwnedPeds();
logToConsole(LOG_DEBUG, `[AGRP.Utilities] All self-owned peds cleared`);
};
// ===========================================================================
function setCityAmbienceState(state, clearElements = false) { function setCityAmbienceState(state, clearElements = false) {
logToConsole(LOG_DEBUG, `[VRR.Utilities] Ambient civilians and traffic ${(state) ? "enabled" : "disabled"}`); logToConsole(LOG_DEBUG, `[AGRP.Utilities] Ambient civilians and traffic ${(state) ? "enabled" : "disabled"}`);
game.setTrafficEnabled(state); game.setTrafficEnabled(state);
if (getMultiplayerMod() == VRR_MPMOD_GTAC) { if (getMultiplayerMod() == AGRP_MPMOD_GTAC) {
game.setGenerateCarsAroundCamera(state); game.setGenerateCarsAroundCamera(state);
if (getGame() != VRR_GAME_GTA_SA) { if (getGame() != AGRP_GAME_GTA_SA) {
game.setCiviliansEnabled(state); game.setCiviliansEnabled(state);
} }
@@ -112,34 +115,35 @@ function runClientCode(code, returnTo) {
function enterVehicleAsPassenger() { function enterVehicleAsPassenger() {
if (localPlayer.vehicle == null) { if (localPlayer.vehicle == null) {
let tempVehicle = getClosestVehicle(localPlayer.position); let tempVehicle = getClosestVehicle(localPlayer.position);
if (getGame() != VRR_GAME_GTA_IV) { if (getGame() != AGRP_GAME_GTA_IV) {
if (tempVehicle != null) { if (tempVehicle != null) {
localPlayer.enterVehicle(tempVehicle, false); localPlayer.enterVehicle(tempVehicle, false);
} }
} else {
// Disable for now. GTA IV has built-in passenger entry
//for(let i = 0 ; i <= natives.getMaximumNumberOfPassengers(tempVehicle); i++) {
// if(natives.isCarPassengerSeatFree(tempVehicle, i)) {
// natives.taskEnterCarAsPassenger(localPlayer, tempVehicle, i, 10000);
// }
//}
} }
// else {
// Disable for now. GTA IV has built-in passenger entry
//for(let i = 0 ; i <= natives.getMaximumNumberOfPassengers(tempVehicle); i++) {
// if(natives.isCarPassengerSeatFree(tempVehicle, i)) {
// natives.taskEnterCarAsPassenger(localPlayer, tempVehicle, i, 10000);
// }
//}
//}
} }
} }
// =========================================================================== // ===========================================================================
function giveLocalPlayerWeapon(weaponId, ammo, active) { function giveLocalPlayerWeapon(weaponId, ammo, active) {
logToConsole(LOG_DEBUG, `[VRR.Utilities] Giving weapon ${weaponId} with ${ammo} ammo`); logToConsole(LOG_DEBUG, `[AGRP.Utilities] Giving weapon ${weaponId} with ${ammo} ammo`);
forceWeapon = weaponId; forceWeapon = weaponId;
if (getGame() == VRR_GAME_MAFIA_ONE) { if (getGame() == AGRP_GAME_MAFIA_ONE) {
localPlayer.giveWeapon(weaponId, 0, ammo); localPlayer.giveWeapon(weaponId, 0, ammo);
forceWeaponAmmo = 0; forceWeaponAmmo = 0;
forceWeaponClipAmmo = ammo; forceWeaponClipAmmo = ammo;
} else { } else {
localPlayer.giveWeapon(weaponId, ammo, active); localPlayer.giveWeapon(weaponId, ammo, active);
if (getGame() < VRR_GAME_GTA_IV) { if (getGame() < AGRP_GAME_GTA_IV) {
forceWeaponAmmo = localPlayer.getWeaponAmmunition(getWeaponSlot(weaponId)); forceWeaponAmmo = localPlayer.getWeaponAmmunition(getWeaponSlot(weaponId));
forceWeaponClipAmmo = localPlayer.getWeaponClipAmmunition(getWeaponSlot(weaponId)); forceWeaponClipAmmo = localPlayer.getWeaponClipAmmunition(getWeaponSlot(weaponId));
} else { } else {
@@ -152,7 +156,7 @@ function giveLocalPlayerWeapon(weaponId, ammo, active) {
// =========================================================================== // ===========================================================================
function clearLocalPlayerWeapons(clearData) { function clearLocalPlayerWeapons(clearData) {
logToConsole(LOG_DEBUG, `[VRR.Utilities] Clearing weapons`); logToConsole(LOG_DEBUG, `[AGRP.Utilities] Clearing weapons`);
localPlayer.clearWeapons(); localPlayer.clearWeapons();
if (clearData == true) { if (clearData == true) {
forceWeapon = 0; forceWeapon = 0;
@@ -170,7 +174,7 @@ function getClosestVehicle(pos) {
// =========================================================================== // ===========================================================================
function setLocalPlayerPosition(position) { function setLocalPlayerPosition(position) {
logToConsole(LOG_DEBUG, `[VRR.Utilities] Setting position to ${position.x}, ${position.y}, ${position.z}`); logToConsole(LOG_DEBUG, `[AGRP.Utilities] Setting position to ${position.x}, ${position.y}, ${position.z}`);
if (typeof localPlayer.velocity != "undefined") { if (typeof localPlayer.velocity != "undefined") {
localPlayer.velocity = toVector3(0.0, 0.0, 0.0); localPlayer.velocity = toVector3(0.0, 0.0, 0.0);
} }
@@ -183,7 +187,7 @@ function setLocalPlayerPosition(position) {
// =========================================================================== // ===========================================================================
function setLocalPlayerHeading(heading) { function setLocalPlayerHeading(heading) {
logToConsole(LOG_DEBUG, `[VRR.Utilities] Setting heading to ${heading}`); logToConsole(LOG_DEBUG, `[AGRP.Utilities] Setting heading to ${heading}`);
if (typeof localPlayer.heading != "undefined") { if (typeof localPlayer.heading != "undefined") {
localPlayer.heading = heading; localPlayer.heading = heading;
} }
@@ -192,8 +196,8 @@ function setLocalPlayerHeading(heading) {
// =========================================================================== // ===========================================================================
function setLocalPlayerInterior(interior) { function setLocalPlayerInterior(interior) {
logToConsole(LOG_DEBUG, `[VRR.Utilities] Setting interior to ${interior}`); logToConsole(LOG_DEBUG, `[AGRP.Utilities] Setting interior to ${interior}`);
if (getMultiplayerMod() == VRR_MPMOD_GTAC) { if (getMultiplayerMod() == AGRP_MPMOD_GTAC) {
if (!isGTAIV()) { if (!isGTAIV()) {
localPlayer.interior = interior; localPlayer.interior = interior;
game.cameraInterior = interior; game.cameraInterior = interior;
@@ -220,13 +224,16 @@ function setLocalPlayerInterior(interior) {
// =========================================================================== // ===========================================================================
function setSnowState(falling, ground) { function setSnowState(falling, ground, forceGround) {
logToConsole(LOG_DEBUG, `[VRR.Utilities] Setting falling snow to ${falling} and ground snow to ${ground}`); logToConsole(LOG_DEBUG, `[AGRP.Utilities] Setting falling snow to ${falling} and ground snow to ${ground}`);
snowing = falling; snowing = falling;
if (ground) { //snow.force = ground;
forceSnowing(false); //if (forceGround == true) {
forceSnowing(ground); // forceSnowing(forceGround);
} // groundSnow.flush();
//} else {
// snow.enabled = ground;
//}
} }
// =========================================================================== // ===========================================================================
@@ -238,8 +245,8 @@ function setLocalPlayerHealth(health) {
// =========================================================================== // ===========================================================================
function playPedSpeech(pedName, speechId) { function playPedSpeech(pedName, speechId) {
logToConsole(LOG_DEBUG, `[VRR.Utilities] Making ${pedName}'s ped talk (${speechId})`); logToConsole(LOG_DEBUG, `[AGRP.Utilities] Making ${pedName}'s ped talk (${speechId})`);
if (getMultiplayerMod() == VRR_MPMOD_GTAC) { if (getMultiplayerMod() == AGRP_MPMOD_GTAC) {
game.SET_CHAR_SAY(int, int); game.SET_CHAR_SAY(int, int);
} }
} }
@@ -247,7 +254,7 @@ function playPedSpeech(pedName, speechId) {
// =========================================================================== // ===========================================================================
function clearLocalPedState() { function clearLocalPedState() {
logToConsole(LOG_DEBUG, `[VRR.Utilities] Clearing local ped state`); logToConsole(LOG_DEBUG, `[AGRP.Utilities] Clearing local ped state`);
localPlayer.clearObjective(); localPlayer.clearObjective();
} }
@@ -260,8 +267,8 @@ function getWeaponSlot(weaponId) {
// =========================================================================== // ===========================================================================
function setLocalPlayerDrunkEffect(amount, duration) { function setLocalPlayerDrunkEffect(amount, duration) {
if (getMultiplayerMod() == VRR_MPMOD_GTAC) { if (getMultiplayerMod() == AGRP_MPMOD_GTAC) {
logToConsole(LOG_DEBUG, `[VRR.Utilities] Drunk effect set to ${amount} for ${duration} ms`); logToConsole(LOG_DEBUG, `[AGRP.Utilities] Drunk effect set to ${amount} for ${duration} ms`);
drunkEffectAmount = 0; drunkEffectAmount = 0;
drunkEffectDurationTimer = setInterval(function () { drunkEffectDurationTimer = setInterval(function () {
drunkEffectAmount = drunkEffectAmount; drunkEffectAmount = drunkEffectAmount;
@@ -310,47 +317,42 @@ function clearSelfOwnedVehicles() {
// =========================================================================== // ===========================================================================
function setMouseCameraState(state) {
logToConsole(LOG_DEBUG, `[AGRP.Utilities] ${(state) ? "Enabled" : "Disabled"} mouse camera`);
mouseCameraEnabled = state;
SetStandardControlsEnabled(!mouseCameraEnabled);
}
// ===========================================================================
function toggleMouseCursor() { function toggleMouseCursor() {
logToConsole(LOG_DEBUG, `[VRR.Utilities] ${(!gui.cursorEnabled) ? "Enabled" : "Disabled"} mouse cursor`); logToConsole(LOG_DEBUG, `[AGRP.Utilities] ${(!gui.cursorEnabled) ? "Enabled" : "Disabled"} mouse cursor`);
gui.showCursor(!gui.cursorEnabled, gui.cursorEnabled); gui.showCursor(!gui.cursorEnabled, gui.cursorEnabled);
} }
// =========================================================================== // ===========================================================================
function toggleMouseCursor() { function toggleMouseCursor() {
logToConsole(LOG_DEBUG, `[VRR.Utilities] ${(!gui.cursorEnabled) ? "Enabled" : "Disabled"} mouse cursor`); logToConsole(LOG_DEBUG, `[AGRP.Utilities] ${(!gui.cursorEnabled) ? "Enabled" : "Disabled"} mouse cursor`);
setMouseCameraState(!mouseCameraEnabled); setMouseCameraState(!mouseCameraEnabled);
} }
// =========================================================================== // ===========================================================================
function setPlayerWeaponDamageEvent(clientName, eventType) { function setPlayerWeaponDamageEvent(clientName, eventType) {
logToConsole(LOG_DEBUG, `[VRR.Utilities] Set ${clientName} damage event type to ${eventType}`); logToConsole(LOG_DEBUG, `[AGRP.Utilities] Set ${clientName} damage event type to ${eventType}`);
weaponDamageEvent[clientName] = eventType; weaponDamageEvent[clientName] = eventType;
} }
// =========================================================================== // ===========================================================================
function setPlayerWeaponDamageEnabled(clientName, state) { function setPlayerWeaponDamageEnabled(clientName, state) {
logToConsole(LOG_DEBUG, `[VRR.Utilities] ${(state) ? "Enabled" : "Disabled"} damage from ${clientName}`); logToConsole(LOG_DEBUG, `[AGRP.Utilities] ${(state) ? "Enabled" : "Disabled"} damage from ${clientName}`);
weaponDamageEnabled[clientName] = state; weaponDamageEnabled[clientName] = state;
} }
// =========================================================================== // ===========================================================================
function setLocalPlayerCash(amount) {
logToConsole(LOG_DEBUG, `[VRR.Utilities] Setting local player money`);
if (typeof localPlayer.money != "undefined") {
localPlayer.money = toInteger(amount);
}
if (getGame() == VRR_GAME_GTA_IV) {
natives.setMultiplayerHudCash(amount);
}
}
// ===========================================================================
function destroyAutoCreatedPickups() { function destroyAutoCreatedPickups() {
if (typeof ELEMENT_PICKUP != "undefined") { if (typeof ELEMENT_PICKUP != "undefined") {
getElementsByType(ELEMENT_PICKUP).forEach(function (pickup) { getElementsByType(ELEMENT_PICKUP).forEach(function (pickup) {
@@ -397,21 +399,24 @@ function processWantedLevelReset() {
function processLocalPlayerVehicleControlState() { function processLocalPlayerVehicleControlState() {
if (areServerElementsSupported()) { if (areServerElementsSupported()) {
if (inVehicle && localPlayer.vehicle != null) { if (localPlayer.vehicle != null) {
if (doesEntityDataExist(localPlayer.vehicle, "agrp.engine")) { if (doesEntityDataExist(localPlayer.vehicle, "agrp.engine")) {
if (getEntityData(localPlayer.vehicle, "agrp.engine") == false) { if (getEntityData(localPlayer.vehicle, "agrp.engine") == false) {
localPlayer.vehicle.engine = false; localPlayer.vehicle.engine = false;
//localPlayer.vehicle.netFlags.sendSync = false;
if (!localPlayer.vehicle.engine) { if (!localPlayer.vehicle.engine) {
if (typeof localPlayer.vehicle.velocity != "undefined") { if (typeof localPlayer.vehicle.velocity != "undefined") {
localPlayer.vehicle.velocity = toVector3(0.0, 0.0, 0.0); localPlayer.vehicle.velocity = toVector3(0.0, 0.0, 0.0);
localPlayer.vehicle.turnVelocity = toVector3(0.0, 0.0, 0.0); localPlayer.vehicle.turnVelocity = toVector3(0.0, 0.0, 0.0);
} }
//if(parkedVehiclePosition) { //if (parkedVehiclePosition) {
// localPlayer.vehicle.position = parkedVehiclePosition; // localPlayer.vehicle.position = parkedVehiclePosition;
// localPlayer.vehicle.heading = parkedVehicleHeading; // localPlayer.vehicle.heading = parkedVehicleHeading;
//} //}
} }
} else {
//localPlayer.vehicle.netFlags.sendSync = true;
} }
} }
} }
@@ -420,52 +425,17 @@ function processLocalPlayerVehicleControlState() {
// =========================================================================== // ===========================================================================
function processLocalPlayerSphereEntryExitHandling() {
let position = getLocalPlayerPosition();
if (areMarkersSupported()) {
getElementsByType(ELEMENT_MARKER).forEach(function (sphere) {
if (getDistance(position, sphere.position) <= sphere.radius) {
if (!inSphere) {
inSphere = sphere;
triggerEvent("OnLocalPlayerEnterSphere", null, sphere);
}
} else {
if (inSphere) {
inSphere = false;
triggerEvent("OnLocalPlayerExitSphere", null, sphere);
}
}
});
}
}
// ===========================================================================
function processJobRouteSphere() {
if (getGame() == VRR_GAME_GTA_SA) {
let position = getLocalPlayerPosition();
if (jobRouteLocationSphere != null) {
if (getDistance(position, jobRouteLocationSphere.position) <= 2.0) {
enteredJobRouteSphere();
}
}
}
}
// ===========================================================================
function forceLocalPlayerEquippedWeaponItem() { function forceLocalPlayerEquippedWeaponItem() {
if (typeof localPlayer.weapon != "undefined") { if (typeof localPlayer.weapon != "undefined") {
if (forceWeapon != 0) { if (forceWeapon != 0) {
if (localPlayer.weapon != forceWeapon) { if (localPlayer.weapon != forceWeapon) {
localPlayer.weapon = forceWeapon; localPlayer.weapon = forceWeapon;
if (getGame() < VRR_GAME_GTA_IV) { if (getGame() < AGRP_GAME_GTA_IV) {
localPlayer.setWeaponClipAmmunition(getWeaponSlot(forceWeapon), forceWeaponClipAmmo); localPlayer.setWeaponClipAmmunition(getWeaponSlot(forceWeapon), forceWeaponClipAmmo);
localPlayer.setWeaponAmmunition(getWeaponSlot(forceWeapon), forceWeaponAmmo); localPlayer.setWeaponAmmunition(getWeaponSlot(forceWeapon), forceWeaponAmmo);
} }
} else { } else {
//if(getGame() < VRR_GAME_GTA_IV) { //if(getGame() < AGRP_GAME_GTA_IV) {
// forceWeaponClipAmmo = localPlayer.getWeaponClipAmmunition(getWeaponSlot(forceWeapon)); // forceWeaponClipAmmo = localPlayer.getWeaponClipAmmunition(getWeaponSlot(forceWeapon));
// forceWeaponAmmo = localPlayer.getWeaponAmmunition(getWeaponSlot(forceWeapon)); // forceWeaponAmmo = localPlayer.getWeaponAmmunition(getWeaponSlot(forceWeapon));
//} //}
@@ -491,26 +461,8 @@ function getLocalPlayerPosition() {
// =========================================================================== // ===========================================================================
function processLocalPlayerVehicleEntryExitHandling() {
if (localPlayer.vehicle) {
if (!inVehicle) {
inVehicle = localPlayer.vehicle;
inVehicleSeat = getLocalPlayerVehicleSeat();
triggerEvent("OnLocalPlayerEnteredVehicle", inVehicle, inVehicleSeat);
}
} else {
if (inVehicle) {
triggerEvent("OnLocalPlayerExitedVehicle", inVehicle, inVehicleSeat);
inVehicle = false;
inVehicleSeat = false;
}
}
}
// ===========================================================================
function getVehicleForNetworkEvent(vehicle) { function getVehicleForNetworkEvent(vehicle) {
if (getGame() == VRR_GAME_GTA_IV) { if (getGame() == AGRP_GAME_GTA_IV) {
return natives.getNetworkIdFromVehicle(vehicle); return natives.getNetworkIdFromVehicle(vehicle);
} }
return vehicle.id; return vehicle.id;
@@ -519,7 +471,7 @@ function getVehicleForNetworkEvent(vehicle) {
// =========================================================================== // ===========================================================================
function setMinuteDuration(minuteDuration) { function setMinuteDuration(minuteDuration) {
logToConsole(LOG_DEBUG, `[VRR.Utilities] Setting minute duration to ${minuteDuration}ms`); logToConsole(LOG_DEBUG, `[AGRP.Utilities] Setting minute duration to ${minuteDuration}ms`);
if (isTimeSupported()) { if (isTimeSupported()) {
game.time.minuteDuration = minuteDuration; game.time.minuteDuration = minuteDuration;
@@ -593,7 +545,7 @@ function processNearbyPickups() {
// =========================================================================== // ===========================================================================
function processGameSpecifics() { function processGameSpecifics() {
if (getGame() < VRR_GAME_GTA_IV) { if (getGame() < AGRP_GAME_GTA_IV) {
game.clearMessages(); game.clearMessages();
} }
@@ -606,4 +558,63 @@ function getServerData() {
return serverData; return serverData;
} }
// ===========================================================================
function setProfanityFilterState(state) {
profanityFilterEnabled = state;
updateChatBox();
}
// ===========================================================================
function processVehicleCruiseControl() {
if (localPlayer.vehicle == null) {
return false;
}
if (!localPlayer.vehicle.isSyncer) {
return false;
}
if (getLocalPlayerVehicleSeat() != 0) {
return false;
}
if (cruiseControlEnabled) {
setVehicleSpeed(cruiseControlSpeed);
}
}
// ===========================================================================
function getCurrencyString(amount) {
let tempString = currencyString;
tempString = tempString.replace("{AMOUNT}", toString(makeLargeNumberReadable(amount)));
return tempString;
}
// ===========================================================================
function updateLocalPlayerMoney() {
if (localPlayer == null) {
return false;
}
if (typeof localPlayer.money != "undefined") {
localPlayer.money = toInteger(localPlayerMoney);
}
if (getGame() == AGRP_GAME_GTA_IV) {
natives.setMultiplayerHudCash(localPlayerMoney);
}
}
// ===========================================================================
function setLocalPlayerMoney(amount) {
logToConsole(LOG_DEBUG, `[AGRP.Utilities] Setting local player money`);
localPlayerMoney = amount;
updateLocalPlayerMoney();
}
// =========================================================================== // ===========================================================================

View File

@@ -1,6 +1,7 @@
// =========================================================================== // ===========================================================================
// Vortrex's Roleplay Resource // Asshat Gaming Roleplay
// https://github.com/VortrexFTW/gtac_roleplay // https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// =========================================================================== // ===========================================================================
// FILE: vehicle.js // FILE: vehicle.js
// DESC: Provides vehicle functions and arrays with data // DESC: Provides vehicle functions and arrays with data
@@ -30,9 +31,9 @@ class VehicleData {
// =========================================================================== // ===========================================================================
function receiveVehicleFromServer(vehicleId, position, model, colour1, colour2, colour3 = 0, colour4 = 0, locked = false, lights = false, engine = false, licensePlate = "") { function receiveVehicleFromServer(vehicleId, position, model, colour1, colour2, colour3 = 0, colour4 = 0, locked = false, lights = false, engine = false, licensePlate = "") {
logToConsole(LOG_DEBUG, `[VRR.Vehicle] Received vehicle ${vehicleId} (${getVehicleNameFromModel(model, getGame())}) from server`); logToConsole(LOG_DEBUG, `[AGRP.Vehicle] Received vehicle ${vehicleId} (${getVehicleNameFromModel(model, getGame())}) from server`);
if (getGame() != VRR_GAME_GTA_IV) { if (getGame() != AGRP_GAME_GTA_IV) {
return false; return false;
} }
@@ -52,7 +53,7 @@ function receiveVehicleFromServer(vehicleId, position, model, colour1, colour2,
let vehicle = natives.getVehicleFromNetworkId(vehicleId.ivNetworkId); let vehicle = natives.getVehicleFromNetworkId(vehicleId.ivNetworkId);
} else { } else {
//logToConsole(LOG_DEBUG, `[VRR.Vehicle] Vehicle ${vehicleId} doesn't exist. Adding ...`); //logToConsole(LOG_DEBUG, `[AGRP.Vehicle] Vehicle ${vehicleId} doesn't exist. Adding ...`);
//let tempVehicleData = new VehicleData(vehicleId, name, position, blipModel, pickupModel); //let tempVehicleData = new VehicleData(vehicleId, name, position, blipModel, pickupModel);
//vehicles.push(tempVehicleData); //vehicles.push(tempVehicleData);
@@ -63,20 +64,20 @@ function receiveVehicleFromServer(vehicleId, position, model, colour1, colour2,
// =========================================================================== // ===========================================================================
function processVehiclePurchasing() { function processVehiclePurchasing() {
if (vehiclePurchaseState == VRR_VEHBUYSTATE_TESTDRIVE) { if (vehiclePurchaseState == AGRP_VEHBUYSTATE_TESTDRIVE) {
if (getLocalPlayerVehicle() == false) { if (getLocalPlayerVehicle() == false) {
vehiclePurchaseState = VRR_VEHBUYSTATE_EXITVEH; vehiclePurchaseState = AGRP_VEHBUYSTATE_EXITVEH;
sendNetworkEventToServer("agrp.vehBuyState", VRR_VEHBUYSTATE_EXITVEH); sendNetworkEventToServer("agrp.vehBuyState", AGRP_VEHBUYSTATE_EXITVEH);
return false; return false;
} else { } else {
if (vehiclePurchasing == getLocalPlayerVehicle()) { if (vehiclePurchasing == getLocalPlayerVehicle()) {
if (getDistance(getLocalPlayerVehicle().position, vehiclePurchasePosition) >= 25) { if (getDistance(getLocalPlayerVehicle().position, vehiclePurchasePosition) >= 25) {
vehiclePurchaseState = VRR_VEHBUYSTATE_FARENOUGH; vehiclePurchaseState = AGRP_VEHBUYSTATE_FARENOUGH;
sendNetworkEventToServer("agrp.vehBuyState", VRR_VEHBUYSTATE_FARENOUGH); sendNetworkEventToServer("agrp.vehBuyState", AGRP_VEHBUYSTATE_FARENOUGH);
} }
} else { } else {
vehiclePurchaseState = VRR_VEHBUYSTATE_WRONGVEH; vehiclePurchaseState = AGRP_VEHBUYSTATE_WRONGVEH;
sendNetworkEventToServer("agrp.vehBuyState", VRR_VEHBUYSTATE_WRONGVEH); sendNetworkEventToServer("agrp.vehBuyState", AGRP_VEHBUYSTATE_WRONGVEH);
} }
} }
} }
@@ -128,4 +129,39 @@ function setAllVehicleDataIndexes() {
} }
} }
// ===========================================================================
function toggleLocalVehicleCruiseControl() {
if (!localPlayer.vehicle.isSyncer) {
return false;
}
cruiseControlEnabled = !cruiseControlEnabled;
cruiseControlSpeed = getVehicleSpeed(vehicle);
}
// ===========================================================================
function getVehicleSpeed(vehicle) {
let matrix = vehicle.matrix;
let frontSpeed = true;
let vecMoveSpeed = vehicle.velocity;
let speed;
if (frontSpeed) {
speed = getDotProduct(vecMoveSpeed[0], vecMoveSpeed[1], vecMoveSpeed[2], matrix.getElement(1 * 4 + 0), matrix.getElement(1 * 4 + 1), matrix.getElement(1 * 4 + 2));
} else {
speed = getLength(vecMoveSpeed[0], vecMoveSpeed[1], vecMoveSpeed[2]);
}
if (getGame() == AGRP_GAME_GTA_IV || getGame() == AGRP_GAME_GTA_IV_EFLC) {
speed /= 40.0;
}
speed = speed * 90;
speed = Math.abs(speed);
return speed;
}
// =========================================================================== // ===========================================================================

View File

@@ -1,6 +1,7 @@
// =========================================================================== // ===========================================================================
// Vortrex's Roleplay Resource // Asshat Gaming Roleplay
// https://github.com/VortrexFTW/gtac_roleplay // https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// =========================================================================== // ===========================================================================
// FILE: accent.js // FILE: accent.js
// DESC: Provides accent functions and usage // DESC: Provides accent functions and usage
@@ -27,7 +28,7 @@ function doesPlayerHaveAccent(client) {
function getPlayerAccentInlineOutput(client) { function getPlayerAccentInlineOutput(client) {
let outputText = ""; let outputText = "";
if(doesPlayerHaveAccent(client)) { if (doesPlayerHaveAccent(client)) {
outputText = `[${getPlayerAccentText(client)}] `; outputText = `[${getPlayerAccentText(client)}] `;
} }
@@ -37,14 +38,14 @@ function getPlayerAccentInlineOutput(client) {
// =========================================================================== // ===========================================================================
function setAccentCommand(command, params, client) { function setAccentCommand(command, params, client) {
if(areParamsEmpty(params)) { if (areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command)); messagePlayerSyntax(client, getCommandSyntaxText(command));
return false; return false;
} }
let accentId = getAccentFromParams(params); let accentId = getAccentFromParams(params);
if(!accentId) { if (!accentId) {
messagePlayerError(client, getLocaleString(client, "AccentNotFound")); messagePlayerError(client, getLocaleString(client, "AccentNotFound"));
return false; return false;
} }
@@ -64,7 +65,7 @@ function listAccentsCommand(command, params, client) {
let chunkedList = splitArrayIntoChunks(accentList, 8); let chunkedList = splitArrayIntoChunks(accentList, 8);
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "AccentsListHeader"))); messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "AccentsListHeader")));
for(let i in chunkedList) { for (let i in chunkedList) {
messagePlayerInfo(client, chunkedList[i].join(", ")); messagePlayerInfo(client, chunkedList[i].join(", "));
} }
} }
@@ -72,14 +73,14 @@ function listAccentsCommand(command, params, client) {
// =========================================================================== // ===========================================================================
function getAccentFromParams(params) { function getAccentFromParams(params) {
if(isNaN(params)) { if (isNaN(params)) {
for(let i in getGlobalConfig().accents) { for (let i in getGlobalConfig().accents) {
if(toLowerCase(getGlobalConfig().accents[i]).indexOf(toLowerCase(params)) != -1) { if (toLowerCase(getGlobalConfig().accents[i]).indexOf(toLowerCase(params)) != -1) {
return i; return i;
} }
} }
} else { } else {
if(typeof getGlobalConfig().accents[params] != "undefined") { if (typeof getGlobalConfig().accents[params] != "undefined") {
return toInteger(params); return toInteger(params);
} }
} }
@@ -97,14 +98,14 @@ function reloadAccentConfigurationCommand(command, params, client) {
// =========================================================================== // ===========================================================================
function addAccentCommand(command, params, client) { function addAccentCommand(command, params, client) {
if(areParamsEmpty(params)) { if (areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command)); messagePlayerSyntax(client, getCommandSyntaxText(command));
return false; return false;
} }
let newAccentName = params; let newAccentName = params;
if(getAccentFromParams(newAccentName) != false) { if (getAccentFromParams(newAccentName) != false) {
messagePlayerError(client, `That accent already exists!`) messagePlayerError(client, `That accent already exists!`)
return false; return false;
} }
@@ -117,14 +118,14 @@ function addAccentCommand(command, params, client) {
// =========================================================================== // ===========================================================================
function removeAccentCommand(command, params, client) { function removeAccentCommand(command, params, client) {
if(areParamsEmpty(params)) { if (areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command)); messagePlayerSyntax(client, getCommandSyntaxText(command));
return false; return false;
} }
let newAccentName = params; let newAccentName = params;
if(!getAccentFromParams(newAccentName)) { if (!getAccentFromParams(newAccentName)) {
messagePlayerError(client, `That accent doesn't exist!`) messagePlayerError(client, `That accent doesn't exist!`)
return false; return false;
} }

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,7 @@
// =========================================================================== // ===========================================================================
// Vortrex's Roleplay Resource // Asshat Gaming Roleplay
// https://github.com/VortrexFTW/gtac_roleplay // https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// =========================================================================== // ===========================================================================
// FILE: animation.js // FILE: animation.js
// DESC: Provides animation functions and usage // DESC: Provides animation functions and usage
@@ -8,8 +9,8 @@
// =========================================================================== // ===========================================================================
function initAnimationScript() { function initAnimationScript() {
logToConsole(LOG_DEBUG, "[VRR.Animation]: Initializing animation script ..."); logToConsole(LOG_DEBUG, "[AGRP.Animation]: Initializing animation script ...");
logToConsole(LOG_DEBUG, "[VRR.Animation]: Animation script initialized!"); logToConsole(LOG_DEBUG, "[AGRP.Animation]: Animation script initialized!");
} }
// =========================================================================== // ===========================================================================
@@ -34,8 +35,8 @@ function playPlayerAnimationCommand(command, params, client) {
return false; return false;
} }
if (getAnimationData(animationSlot)[3] == VRR_ANIMTYPE_SURRENDER) { if (getAnimationData(animationSlot)[3] == AGRP_ANIMTYPE_SURRENDER) {
getPlayerData(client).pedState = VRR_PEDSTATE_HANDSUP; getPlayerData(client).pedState = AGRP_PEDSTATE_HANDSUP;
} }
if (isPlayerHandCuffed(client) || isPlayerTazed(client) || isPlayerInForcedAnimation(client)) { if (isPlayerHandCuffed(client) || isPlayerTazed(client) || isPlayerInForcedAnimation(client)) {
@@ -43,7 +44,9 @@ function playPlayerAnimationCommand(command, params, client) {
return false; return false;
} }
messagePlayerTip(client, getLocaleString(client, "AnimationStopCommandTip", "{ALTCOLOUR}/stopanim{MAINCOLOUR}")); if (hasPlayerSeenActionTip(client, "AnimationStop")) {
messagePlayerTip(client, getGroupedLocaleString(client, "ActionTips", "AnimationStop", "{ALTCOLOUR}/stopanim{MAINCOLOUR}"));
}
makePlayerPlayAnimation(client, animationSlot, animationPositionOffset); makePlayerPlayAnimation(client, animationSlot, animationPositionOffset);
} }
@@ -65,6 +68,8 @@ function stopPlayerAnimationCommand(command, params, client) {
getPlayerData(client).animationForced = false; getPlayerData(client).animationForced = false;
//setPlayerMouseCameraState(client, false); //setPlayerMouseCameraState(client, false);
markPlayerActionTipSeen(client, "AnimationStop");
} }
// =========================================================================== // ===========================================================================
@@ -83,16 +88,6 @@ function showAnimationListCommand(command, params, client) {
// =========================================================================== // ===========================================================================
/**
* @param {number} animationSlot - The slot index of the animation
* @return {Array} The animation's data (array)
*/
function getAnimationData(animationSlot, gameId = getGame()) {
return getGameConfig().animations[gameId][animationSlot];
}
// ===========================================================================
function isPlayerInForcedAnimation(client) { function isPlayerInForcedAnimation(client) {
return getPlayerData(client).animationForced; return getPlayerData(client).animationForced;
} }
@@ -107,9 +102,9 @@ function makePlayerPlayAnimation(client, animationSlot, offsetPosition = 1) {
getPlayerData(client).animationForced = false; getPlayerData(client).animationForced = false;
makePedPlayAnimation(getPlayerPed(client), animationSlot, offsetPosition); makePedPlayAnimation(getPlayerPed(client), animationSlot, offsetPosition);
setEntityData(getPlayerPed(client), "agrp.anim", animationSlot, true); //setEntityData(getPlayerPed(client), "agrp.anim", animationSlot, true);
//if(getAnimationData(animationSlot)[9] != VRR_ANIMMOVE_NONE) { //if(getAnimationData(animationSlot)[9] != AGRP_ANIMMOVE_NONE) {
// if(getGame() < VRR_GAME_GTA_SA) { // if(getGame() < AGRP_GAME_GTA_SA) {
// setPlayerMouseCameraState(client, true); // setPlayerMouseCameraState(client, true);
// } // }
//} //}
@@ -141,23 +136,4 @@ function makePlayerStopAnimation(client) {
getPlayerData(client).animationForced = false; getPlayerData(client).animationForced = false;
} }
// ===========================================================================
function getAnimationFromParams(params) {
let animations = getGameConfig().animations[getGame()];
if (isNaN(params)) {
for (let i in animations) {
if (toLowerCase(animations[i].name).indexOf(toLowerCase(params)) != -1) {
return i;
}
}
} else {
if (typeof getGameConfig().animations[getGame()][params] != "undefined") {
return toInteger(params);
}
}
return false;
}
// =========================================================================== // ===========================================================================

View File

@@ -1,6 +1,7 @@
// =========================================================================== // ===========================================================================
// Vortrex's Roleplay Resource // Asshat Gaming Roleplay
// https://github.com/VortrexFTW/gtac_roleplay // https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// =========================================================================== // ===========================================================================
// FILE: anticheat.js // FILE: anticheat.js
// DESC: Provides anticheat functions and usage // DESC: Provides anticheat functions and usage
@@ -8,17 +9,17 @@
// =========================================================================== // ===========================================================================
function initAntiCheatScript() { function initAntiCheatScript() {
logToConsole(LOG_DEBUG, "[VRR.AntiCheat]: Initializing anticheat script ..."); logToConsole(LOG_DEBUG, "[AGRP.AntiCheat]: Initializing anticheat script ...");
logToConsole(LOG_DEBUG, "[VRR.AntiCheat]: Anticheat script initialized!"); logToConsole(LOG_DEBUG, "[AGRP.AntiCheat]: Anticheat script initialized!");
} }
// =========================================================================== // ===========================================================================
function clearPlayerStateToEnterExitProperty(client) { function clearPlayerStateToEnterExitProperty(client) {
if(getPlayerData(client).pedState != VRR_PEDSTATE_READY) { if (getPlayerData(client).pedState != AGRP_PEDSTATE_READY) {
if(getPlayerData(client).pedState == VRR_PEDSTATE_ENTERINGVEHICLE) { if (getPlayerData(client).pedState == AGRP_PEDSTATE_ENTERINGVEHICLE) {
sendPlayerClearPedState(client); sendPlayerClearPedState(client);
getPlayerData(client).pedState = VRR_PEDSTATE_READY; getPlayerData(client).pedState = AGRP_PEDSTATE_READY;
} else { } else {
return false; return false;
} }
@@ -28,7 +29,7 @@ function clearPlayerStateToEnterExitProperty(client) {
// =========================================================================== // ===========================================================================
function isPlayerExemptFromAntiCheat(client) { function isPlayerExemptFromAntiCheat(client) {
if(hasBitFlag(getPlayerData(client).accountData.flags.moderation, getModerationFlagValue("ExemptFromAntiCheat"))) { if (hasBitFlag(getPlayerData(client).accountData.flags.moderation, getModerationFlagValue("ExemptFromAntiCheat"))) {
return true; return true;
} }
@@ -38,7 +39,7 @@ function isPlayerExemptFromAntiCheat(client) {
// =========================================================================== // ===========================================================================
function canPlayerUsePoliceJob(client) { function canPlayerUsePoliceJob(client) {
if(getPlayerData(client).accountData.flags.moderation & getServerBitFlags().moderationFlags.policeBanned) { if (getPlayerData(client).accountData.flags.moderation & getServerBitFlags().moderationFlags.policeBanned) {
return false; return false;
} }
@@ -48,7 +49,7 @@ function canPlayerUsePoliceJob(client) {
// =========================================================================== // ===========================================================================
function canClientUseFireJob(client) { function canClientUseFireJob(client) {
if(getPlayerData(client).accountData.flags.moderation & getServerBitFlags().moderationFlags.fireBanned) { if (getPlayerData(client).accountData.flags.moderation & getServerBitFlags().moderationFlags.fireBanned) {
return false; return false;
} }
@@ -58,7 +59,7 @@ function canClientUseFireJob(client) {
// =========================================================================== // ===========================================================================
function canClientUseAmmunations(client) { function canClientUseAmmunations(client) {
if(getPlayerData(client).accountData.flags.moderation & getServerBitFlags().moderationFlags.AmmuBanned) { if (getPlayerData(client).accountData.flags.moderation & getServerBitFlags().moderationFlags.AmmuBanned) {
return false; return false;
} }
@@ -68,7 +69,7 @@ function canClientUseAmmunations(client) {
// =========================================================================== // ===========================================================================
function canClientUseGuns(client) { function canClientUseGuns(client) {
if(getPlayerData(client).accountData.flags.moderation & getServerBitFlags().moderationFlags.GunBanned) { if (getPlayerData(client).accountData.flags.moderation & getServerBitFlags().moderationFlags.GunBanned) {
return false; return false;
} }

View File

@@ -1,6 +1,7 @@
// =========================================================================== // ===========================================================================
// Vortrex's Roleplay Resource // Asshat Gaming Roleplay
// https://github.com/VortrexFTW/gtac_roleplay // https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// =========================================================================== // ===========================================================================
// FILE: bans.js // FILE: bans.js
// DESC: Provides ban functions and usage // DESC: Provides ban functions and usage
@@ -8,18 +9,18 @@
// =========================================================================== // ===========================================================================
// Ban Types // Ban Types
const VRR_BANTYPE_NONE = 0; const AGRP_BANTYPE_NONE = 0;
const VRR_BANTYPE_ACCOUNT = 1; const AGRP_BANTYPE_ACCOUNT = 1;
const VRR_BANTYPE_SUBACCOUNT = 2; const AGRP_BANTYPE_SUBACCOUNT = 2;
const VRR_BANTYPE_IPADDRESS = 3; const AGRP_BANTYPE_IPADDRESS = 3;
const VRR_BANTYPE_SUBNET = 4; const AGRP_BANTYPE_SUBNET = 4;
// =========================================================================== // ===========================================================================
class BanData { class BanData {
constructor(dbAssoc = false) { constructor(dbAssoc = false) {
this.databaseId = 0; this.databaseId = 0;
this.type = VRR_BANTYPE_NONE; this.type = AGRP_BANTYPE_NONE;
this.detail = ""; this.detail = "";
this.ipAddress = ""; this.ipAddress = "";
this.name = ""; this.name = "";
@@ -38,8 +39,8 @@ class BanData {
// =========================================================================== // ===========================================================================
function initBanScript() { function initBanScript() {
logToConsole(LOG_INFO, "[VRR.Ban]: Initializing ban script ..."); logToConsole(LOG_INFO, "[AGRP.Ban]: Initializing ban script ...");
logToConsole(LOG_INFO, "[VRR.Ban]: Ban script initialized!"); logToConsole(LOG_INFO, "[AGRP.Ban]: Ban script initialized!");
} }
// =========================================================================== // ===========================================================================
@@ -65,12 +66,12 @@ function accountBanCommand(command, params, client) {
return false; return false;
} }
logToConsole(LOG_WARN, `[VRR.Ban]: ${getPlayerDisplayForConsole(targetClient)} (${getPlayerData(targetClient).accountData.name}) account was banned by ${getPlayerDisplayForConsole(client)}. Reason: ${reason}`); logToConsole(LOG_WARN, `[AGRP.Ban]: ${getPlayerDisplayForConsole(targetClient)} (${getPlayerData(targetClient).accountData.name}) account was banned by ${getPlayerDisplayForConsole(client)}. Reason: ${reason}`);
announceAdminAction(`PlayerAccountBanned`, `{ALTCOLOUR}${getPlayerName(targetClient)}{MAINCOLOUR}`); announceAdminAction(`PlayerAccountBanned`, `{ALTCOLOUR}${getPlayerName(targetClient)}{MAINCOLOUR}`);
banAccount(getPlayerData(targetClient).accountData.databaseId, getPlayerData(client).accountData.databaseId, reason); banAccount(getPlayerData(targetClient).accountData.databaseId, getPlayerData(client).accountData.databaseId, reason);
getPlayerData(targetClient).customDisconnectReason = `Banned - ${reason}`; getPlayerData(targetClient).customDisconnectReason = "Banned";
disconnectPlayer(targetClient); disconnectPlayer(targetClient);
} }
@@ -97,12 +98,12 @@ function subAccountBanCommand(command, params, client, fromDiscord) {
return false; return false;
} }
logToConsole(LOG_WARN, `[VRR.Ban]: ${getPlayerDisplayForConsole(targetClient)} (${getPlayerData(targetClient).accountData.name})'s subaccount was banned by ${getPlayerDisplayForConsole(client)}. Reason: ${reason}`); logToConsole(LOG_WARN, `[AGRP.Ban]: ${getPlayerDisplayForConsole(targetClient)} (${getPlayerData(targetClient).accountData.name})'s subaccount was banned by ${getPlayerDisplayForConsole(client)}. Reason: ${reason}`);
announceAdminAction(`PlayerCharacterBanned`, `{ALTCOLOUR}${getPlayerName(targetClient)}{MAINCOLOUR}`); announceAdminAction(`PlayerCharacterBanned`, `{ALTCOLOUR}${getPlayerName(targetClient)}{MAINCOLOUR}`);
banSubAccount(getPlayerData(targetClient).currentSubAccountData.databaseId, getPlayerData(client).accountData.databaseId, reason); banSubAccount(getPlayerData(targetClient).currentSubAccountData.databaseId, getPlayerData(client).accountData.databaseId, reason);
getPlayerData(targetClient).customDisconnectReason = `Banned - ${reason}`; getPlayerData(targetClient).customDisconnectReason = "Banned";
disconnectPlayer(targetClient); disconnectPlayer(targetClient);
} }
@@ -132,7 +133,7 @@ function ipBanCommand(command, params, client, fromDiscord) {
announceAdminAction(`PlayerIPBanned`, `{ALTCOLOUR}${getPlayerName(targetClient)}{MAINCOLOUR}`); announceAdminAction(`PlayerIPBanned`, `{ALTCOLOUR}${getPlayerName(targetClient)}{MAINCOLOUR}`);
banIPAddress(getPlayerIP(targetClient), getPlayerData(client).accountData.databaseId, reason); banIPAddress(getPlayerIP(targetClient), getPlayerData(client).accountData.databaseId, reason);
getPlayerData(targetClient).customDisconnectReason = `IP Banned - ${reason}`; getPlayerData(targetClient).customDisconnectReason = "Banned";
serverBanIP(getPlayerIP(targetClient)); serverBanIP(getPlayerIP(targetClient));
disconnectPlayer(targetClient); disconnectPlayer(targetClient);
} }
@@ -164,7 +165,7 @@ function subNetBanCommand(command, params, client, fromDiscord) {
announceAdminAction(`PlayerSubNetBanned`, `{ALTCOLOUR}${getPlayerName(client)}{MAINCOLOUR}`); announceAdminAction(`PlayerSubNetBanned`, `{ALTCOLOUR}${getPlayerName(client)}{MAINCOLOUR}`);
banSubNet(getPlayerIP(targetClient), getSubNet(getPlayerIP(targetClient), octetAmount), getPlayerData(client).accountData.databaseId, reason); banSubNet(getPlayerIP(targetClient), getSubNet(getPlayerIP(targetClient), octetAmount), getPlayerData(client).accountData.databaseId, reason);
getPlayerData(client).customDisconnectReason = `IP Subnet Banned - ${reason}`; getPlayerData(client).customDisconnectReason = "Banned";
serverBanIP(getPlayerIP(targetClient)); serverBanIP(getPlayerIP(targetClient));
} }
@@ -174,7 +175,7 @@ function banAccount(accountId, adminAccountId, reason) {
let dbConnection = connectToDatabase(); let dbConnection = connectToDatabase();
if (dbConnection) { if (dbConnection) {
let safeReason = dbConnection.escapetoString(reason); let safeReason = dbConnection.escapetoString(reason);
let dbQuery = queryDatabase(dbConnection, `INSERT INTO ban_main (ban_type, ban_detail, ban_who_banned, ban_reason) VALUES (${VRR_BANTYPE_ACCOUNT}, ${accountId}, ${adminAccountId}, '${safeReason}');`); let dbQuery = queryDatabase(dbConnection, `INSERT INTO ban_main (ban_type, ban_detail, ban_who_banned, ban_reason) VALUES (${AGRP_BANTYPE_ACCOUNT}, ${accountId}, ${adminAccountId}, '${safeReason}');`);
freeDatabaseQuery(dbQuery); freeDatabaseQuery(dbQuery);
dbConnection.close(); dbConnection.close();
return true; return true;
@@ -189,7 +190,7 @@ function banSubAccount(subAccountId, adminAccountId, reason) {
let dbConnection = connectToDatabase(); let dbConnection = connectToDatabase();
if (dbConnection) { if (dbConnection) {
let safeReason = dbConnection.escapetoString(reason); let safeReason = dbConnection.escapetoString(reason);
let dbQuery = queryDatabase(dbConnection, `INSERT INTO ban_main (ban_type, ban_detail, ban_who_banned, ban_reason) VALUES (${VRR_BANTYPE_SUBACCOUNT}, ${subAccountId}, ${adminAccountId}, '${safeReason}');`); let dbQuery = queryDatabase(dbConnection, `INSERT INTO ban_main (ban_type, ban_detail, ban_who_banned, ban_reason) VALUES (${AGRP_BANTYPE_SUBACCOUNT}, ${subAccountId}, ${adminAccountId}, '${safeReason}');`);
freeDatabaseQuery(dbQuery); freeDatabaseQuery(dbQuery);
dbConnection.close(); dbConnection.close();
return true; return true;
@@ -204,7 +205,7 @@ function banIPAddress(ipAddress, adminAccountId, reason) {
let dbConnection = connectToDatabase(); let dbConnection = connectToDatabase();
if (dbConnection) { if (dbConnection) {
let safeReason = dbConnection.escapetoString(reason); let safeReason = dbConnection.escapetoString(reason);
let dbQuery = queryDatabase(dbConnection, `INSERT INTO ban_main (ban_type, ban_detail, ban_who_banned, ban_reason) VALUES (${VRR_BANTYPE_IPADDRESS}, INET_ATON(${ipAddress}), ${adminAccountId}, '${safeReason}');`); let dbQuery = queryDatabase(dbConnection, `INSERT INTO ban_main (ban_type, ban_detail, ban_who_banned, ban_reason) VALUES (${AGRP_BANTYPE_IPADDRESS}, INET_ATON(${ipAddress}), ${adminAccountId}, '${safeReason}');`);
freeDatabaseQuery(dbQuery); freeDatabaseQuery(dbQuery);
dbConnection.close(); dbConnection.close();
return true; return true;
@@ -219,7 +220,7 @@ function banSubNet(ipAddressStart, ipAddressEnd, adminAccountId, reason) {
let dbConnection = connectToDatabase(); let dbConnection = connectToDatabase();
if (dbConnection) { if (dbConnection) {
let safeReason = dbConnection.escapetoString(reason); let safeReason = dbConnection.escapetoString(reason);
let dbQuery = queryDatabase(dbConnection, `INSERT INTO ban_main (ban_type, ban_ip_start, ban_ip_end, ban_who_banned, ban_reason) VALUES (${VRR_BANTYPE_SUBNET}, INET_ATON(${ipAddressStart}), INET_ATON(${ipAddressEnd}), ${adminAccountId}, '${safeReason}');`); let dbQuery = queryDatabase(dbConnection, `INSERT INTO ban_main (ban_type, ban_ip_start, ban_ip_end, ban_who_banned, ban_reason) VALUES (${AGRP_BANTYPE_SUBNET}, INET_ATON(${ipAddressStart}), INET_ATON(${ipAddressEnd}), ${adminAccountId}, '${safeReason}');`);
freeDatabaseQuery(dbQuery); freeDatabaseQuery(dbQuery);
dbConnection.close(); dbConnection.close();
return true; return true;
@@ -233,7 +234,7 @@ function banSubNet(ipAddressStart, ipAddressEnd, adminAccountId, reason) {
function unbanAccount(accountId, adminAccountId) { function unbanAccount(accountId, adminAccountId) {
let dbConnection = connectToDatabase(); let dbConnection = connectToDatabase();
if (dbConnection) { if (dbConnection) {
let dbQuery = queryDatabase(dbConnection, `UPDATE ban_main SET ban_who_removed=${adminAccountId}, ban_removed=1 WHERE ban_type=${VRR_BANTYPE_ACCOUNT} AND ban_detail=${accountId}`); let dbQuery = queryDatabase(dbConnection, `UPDATE ban_main SET ban_who_removed=${adminAccountId}, ban_removed=1 WHERE ban_type=${AGRP_BANTYPE_ACCOUNT} AND ban_detail=${accountId}`);
freeDatabaseQuery(dbQuery); freeDatabaseQuery(dbQuery);
dbConnection.close(); dbConnection.close();
return true; return true;
@@ -247,7 +248,7 @@ function unbanAccount(accountId, adminAccountId) {
function unbanSubAccount(subAccountId, adminAccountId) { function unbanSubAccount(subAccountId, adminAccountId) {
let dbConnection = connectToDatabase(); let dbConnection = connectToDatabase();
if (dbConnection) { if (dbConnection) {
let dbQuery = queryDatabase(dbConnection, `UPDATE ban_main SET ban_who_removed=${adminAccountId}, ban_removed=1 WHERE ban_type=${VRR_BANTYPE_SUBACCOUNT} AND ban_detail=${subAccountId}`); let dbQuery = queryDatabase(dbConnection, `UPDATE ban_main SET ban_who_removed=${adminAccountId}, ban_removed=1 WHERE ban_type=${AGRP_BANTYPE_SUBACCOUNT} AND ban_detail=${subAccountId}`);
freeDatabaseQuery(dbQuery); freeDatabaseQuery(dbQuery);
dbConnection.close(); dbConnection.close();
return true; return true;
@@ -261,7 +262,7 @@ function unbanSubAccount(subAccountId, adminAccountId) {
function unbanIPAddress(ipAddress, adminAccountId) { function unbanIPAddress(ipAddress, adminAccountId) {
let dbConnection = connectToDatabase(); let dbConnection = connectToDatabase();
if (dbConnection) { if (dbConnection) {
let dbQuery = queryDatabase(dbConnection, `UPDATE ban_main SET ban_who_removed=${adminAccountId}, ban_removed=1 WHERE ban_type=${VRR_BANTYPE_IPADDRESS} AND ban_detail=INET_ATON(${ipAddress})`); let dbQuery = queryDatabase(dbConnection, `UPDATE ban_main SET ban_who_removed=${adminAccountId}, ban_removed=1 WHERE ban_type=${AGRP_BANTYPE_IPADDRESS} AND ban_detail=INET_ATON(${ipAddress})`);
freeDatabaseQuery(dbQuery); freeDatabaseQuery(dbQuery);
dbConnection.close(); dbConnection.close();
return true; return true;
@@ -275,7 +276,7 @@ function unbanIPAddress(ipAddress, adminAccountId) {
function unbanSubNet(ipAddressStart, ipAddressEnd, adminAccountId) { function unbanSubNet(ipAddressStart, ipAddressEnd, adminAccountId) {
let dbConnection = connectToDatabase(); let dbConnection = connectToDatabase();
if (dbConnection) { if (dbConnection) {
let dbQuery = queryDatabase(dbConnection, `UPDATE ban_main SET ban_who_removed=${adminAccountId}, ban_removed=1 WHERE ban_type=${VRR_BANTYPE_SUBNET} AND ban_ip_start=INET_ATON(${ipAddressStart}) AND ban_ip_end=INET_ATON(${ipAddressEnd})`); let dbQuery = queryDatabase(dbConnection, `UPDATE ban_main SET ban_who_removed=${adminAccountId}, ban_removed=1 WHERE ban_type=${AGRP_BANTYPE_SUBNET} AND ban_ip_start=INET_ATON(${ipAddressStart}) AND ban_ip_end=INET_ATON(${ipAddressEnd})`);
freeDatabaseQuery(dbQuery); freeDatabaseQuery(dbQuery);
dbConnection.close(); dbConnection.close();
return true; return true;
@@ -287,7 +288,7 @@ function unbanSubNet(ipAddressStart, ipAddressEnd, adminAccountId) {
// =========================================================================== // ===========================================================================
function isAccountBanned(accountId) { function isAccountBanned(accountId) {
let bans = getServerData().bans.filter(ban => ban.type === VRR_BANTYPE_ACCOUNT && ban.detail === accountId); let bans = getServerData().bans.filter(ban => ban.type === AGRP_BANTYPE_ACCOUNT && ban.detail === accountId);
if (bans.length > 0) { if (bans.length > 0) {
return true; return true;
} }
@@ -298,7 +299,7 @@ function isAccountBanned(accountId) {
// =========================================================================== // ===========================================================================
function isSubAccountBanned(subAccountId) { function isSubAccountBanned(subAccountId) {
let bans = getServerData().bans.filter(ban => ban.type === VRR_BANTYPE_SUBACCOUNT && ban.detail === subAccountId); let bans = getServerData().bans.filter(ban => ban.type === AGRP_BANTYPE_SUBACCOUNT && ban.detail === subAccountId);
if (bans.length > 0) { if (bans.length > 0) {
return true; return true;
} }
@@ -309,7 +310,7 @@ function isSubAccountBanned(subAccountId) {
// =========================================================================== // ===========================================================================
function isIpAddressBanned(ipAddress) { function isIpAddressBanned(ipAddress) {
let bans = getServerData().bans.filter(ban => ban.type === VRR_BANTYPE_IPADDRESS && ban.detail === ipAddress); let bans = getServerData().bans.filter(ban => ban.type === AGRP_BANTYPE_IPADDRESS && ban.detail === ipAddress);
if (bans.length > 0) { if (bans.length > 0) {
return true; return true;
} }

80
scripts/server/bank.js Normal file
View File

@@ -0,0 +1,80 @@
// ===========================================================================
// Asshat Gaming Roleplay
// https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// ===========================================================================
// FILE: bank.js
// DESC: Provides banking functions and usage
// TYPE: Server (JavaScript)
// ===========================================================================
// House Owner Types
const AGRP_BANK_ACCT_OWNER_NONE = 0; // Not owned
const AGRP_BANK_ACCT_OWNER_PLAYER = 1; // Owner is a player (character/subaccount)
const AGRP_BANK_ACCT_OWNER_JOB = 2; // Owned by a job
const AGRP_BANK_ACCT_OWNER_CLAN = 3; // Owned by a clan
const AGRP_BANK_ACCT_OWNER_FACTION = 4; // Owned by a faction
const AGRP_BANK_ACCT_OWNER_BIZ = 4; // Owned by a faction
const AGRP_BANK_ACCT_OWNER_PUBLIC = 5; // Is a public bank account. Technically not owned. This probably won't be used.
// ===========================================================================
function isPlayerAtBank(client) {
if (isPositionAtATM(getPlayerPosition(client))) {
return true;
}
let businessId = getPlayerBusiness(client);
if (getBusinessData(client) != false) {
if (getBusinessData(businessId).type == AGRP_BIZ_TYPE_BANK) {
return true;
}
}
return false;
}
// ===========================================================================
function isPositionAtATM(position) {
let atmId = getClosestATM(position);
let atmData = getServerData().atmLocationCache[atmId];
if (getDistance(position, atmData[2]) <= getGlobalConfig().atmDistance) {
return true;
}
return false;
}
// ===========================================================================
function getClosestATM(position) {
let atmLocations = getServerData().atmLocationCache;
let closest = 0;
for (let i in atmLocations) {
if (getDistance(position, atmLocations[i]) < getDistance(position, atmLocations[closest])) {
closest = i;
}
}
return closest;
}
// ===========================================================================
function isPositionAtATM(position) {
let atmId = getClosestATM(position);
let atmData = getServerData().atmLocationCache[atmId];
if (getDistance(position, atmData[2]) <= getGlobalConfig().atmDistance) {
return true;
}
return false;
}
// ===========================================================================

View File

@@ -1,6 +1,7 @@
// =========================================================================== // ===========================================================================
// Vortrex's Roleplay Resource // Asshat Gaming Roleplay
// https://github.com/VortrexFTW/gtac_roleplay // https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// =========================================================================== // ===========================================================================
// FILE: bitflags.js // FILE: bitflags.js
// DESC: Provides bitwise operations, functions and usage // DESC: Provides bitwise operations, functions and usage
@@ -15,7 +16,7 @@ let serverBitFlags = {
accountSettingsFlags: {}, accountSettingsFlags: {},
subAccountSettingsFlags: {}, subAccountSettingsFlags: {},
accountFlags: {}, accountFlags: {},
seenHelpTipsFlags: {}, seenActionTipsFlags: {},
npcTriggerTypeFlags: {}, npcTriggerTypeFlags: {},
npcTriggerConditionTypesFlags: {}, npcTriggerConditionTypesFlags: {},
npcTriggerResponseTypeFlags: {}, npcTriggerResponseTypeFlags: {},
@@ -64,6 +65,7 @@ let serverBitFlagKeys = {
"DontSyncClientElements", "DontSyncClientElements",
"IsTester" "IsTester"
], ],
/*
factionFlagKeys: [ factionFlagKeys: [
"None", "None",
"Police", "Police",
@@ -72,6 +74,7 @@ let serverBitFlagKeys = {
"Government", "Government",
"Generic", "Generic",
], ],
*/
clanTypeFlagKeys: [ clanTypeFlagKeys: [
"None", "None",
"Illegal", "Illegal",
@@ -101,6 +104,24 @@ let serverBitFlagKeys = {
"ManageRanks", "ManageRanks",
"Owner", "Owner",
], ],
clanDiscordWebhookFlagKeys: [
"None",
"ClanName",
"ClanMOTD",
"ClanTag",
"ClanRankEdit",
"ClanRankSet",
"ClanVehicleEdit",
"ClanHouseEdit",
"ClanBusinessEdit",
"ClanNPCEdit",
"ClanMemberInvite",
"ClanMemberRemove",
"ClanMemberSuspend",
"ClanRankFlagSet",
"ClanTurfWar",
"ClanPointWar",
],
accountSettingsFlagKeys: [ accountSettingsFlagKeys: [
"None", "None",
"UseWhiteList", "UseWhiteList",
@@ -117,6 +138,12 @@ let serverBitFlagKeys = {
"NoKeyBinds", "NoKeyBinds",
"NoRandomTips", "NoRandomTips",
"NoActionTips", "NoActionTips",
"ChatBoxTimestamps",
"ProfanityFilter",
"ChatAutoHide",
"NoPlayerContent",
"ChatEmoji",
//"NoBlood",
], ],
// Not going to be used. Use trigger, condition, and response stuff in trigger.js // Not going to be used. Use trigger, condition, and response stuff in trigger.js
@@ -213,55 +240,87 @@ let serverBitFlagKeys = {
"EnterProperty", "EnterProperty",
"SearchArea", "SearchArea",
], ],
seenHelpTipsKeys: [ seenActionTipsKeys: [
"None", "None",
"VehicleEngineOffWhenEntering", "VehicleEngineOffWhenEntering",
"VehicleLockedAfterEntryAttempt", "VehicleLockedAfterEntryAttempt",
"ShowItemsAfterPurchase", "ShowItemsAfterPurchase",
"BuyCommandAfterEnterBusiness", "BuyCommandAfterEnterBusiness",
"UseItemKeyAfterEquipping",
"UseItemKeyAfterEquippingWalkieTalkie",
"RadioCommandAfterEnablingWalkieTalkie",
"ReplyToDirectMessage",
"UseItemKeyAmmoAfterEquippingWeapon",
"AnimationStop",
"JobEquipmentInventory",
"ViewInventory",
"VehicleRepairItemUsage",
"VehicleColourItemUsage",
"VehiclePartItemUsage",
"AmmoClipItemUsage",
"GenericItemUsage",
"EnterJobVehicleForRoute",
"JobLocations",
"JobRouteStart",
],
jobRankKeys: [
"None",
"PublicAccess",
"WhiteList",
"BlackList",
"SetRank",
"SetPay",
"ManageUniforms",
"ManageEquipment",
"ManageVehicles",
"ManageBusinesses",
"Leader",
], ],
}; };
// =========================================================================== // ===========================================================================
function initBitFlagScript() { function initBitFlagScript() {
logToConsole(LOG_INFO, "[VRR.BitFlag]: Initializing bit flag script ..."); logToConsole(LOG_DEBUG, "[AGRP.BitFlag]: Initializing bit flag script ...");
serverBitFlags.staffFlags = createBitFlagTable(serverBitFlagKeys.staffFlagKeys); serverBitFlags.staffFlags = createBitFlagTable(serverBitFlagKeys.staffFlagKeys);
serverBitFlags.moderationFlags = createBitFlagTable(serverBitFlagKeys.moderationFlagKeys); serverBitFlags.moderationFlags = createBitFlagTable(serverBitFlagKeys.moderationFlagKeys);
serverBitFlags.accountSettingsFlags = createBitFlagTable(serverBitFlagKeys.accountSettingsFlagKeys); serverBitFlags.accountSettingsFlags = createBitFlagTable(serverBitFlagKeys.accountSettingsFlagKeys);
//serverBitFlags.subAccountSettingsFlags = createBitFlagTable(getServerData().subAccountSettingsFlagKeys); //serverBitFlags.subAccountSettingsFlags = createBitFlagTable(getServerData().subAccountSettingsFlagKeys);
serverBitFlags.clanFlags = createBitFlagTable(serverBitFlagKeys.clanFlagKeys); serverBitFlags.clanFlags = createBitFlagTable(serverBitFlagKeys.clanFlagKeys);
serverBitFlags.clanTypeFlagKeys = createBitFlagTable(serverBitFlagKeys.clanTypeFlagKeys); serverBitFlags.clanTypeFlags = createBitFlagTable(serverBitFlagKeys.clanTypeFlagKeys);
serverBitFlags.factionFlags = createBitFlagTable(serverBitFlagKeys.factionFlagKeys); serverBitFlags.clanDiscordWebhookFlags = createBitFlagTable(serverBitFlagKeys.clanDiscordWebhookFlagKeys);
//serverBitFlags.factionFlags = createBitFlagTable(serverBitFlagKeys.factionFlagKeys);
serverBitFlags.npcTriggerTypes = createBitFlagTable(serverBitFlagKeys.npcTriggerTypeKeys); serverBitFlags.npcTriggerTypes = createBitFlagTable(serverBitFlagKeys.npcTriggerTypeKeys);
serverBitFlags.npcTriggerConditionTypes = createBitFlagTable(serverBitFlagKeys.npcTriggerConditionTypeKeys); serverBitFlags.npcTriggerConditionTypes = createBitFlagTable(serverBitFlagKeys.npcTriggerConditionTypeKeys);
serverBitFlags.npcTriggerResponseTypes = createBitFlagTable(serverBitFlagKeys.npcTriggerResponseTypeKeys); serverBitFlags.npcTriggerResponseTypes = createBitFlagTable(serverBitFlagKeys.npcTriggerResponseTypeKeys);
logToConsole(LOG_INFO, "[VRR.BitFlag]: Bit flag script initialized successfully!"); serverBitFlags.seenActionTips = createBitFlagTable(serverBitFlagKeys.seenActionTipsKeys);
serverBitFlags.jobRankFlags = createBitFlagTable(serverBitFlagKeys.jobRankKeys);
logToConsole(LOG_INFO, "[AGRP.BitFlag]: Bit flag script initialized successfully!");
return true; return true;
} }
// =========================================================================== // ===========================================================================
function doesPlayerHaveStaffPermission(client, requiredFlags) { function doesPlayerHaveStaffPermission(client, requiredFlags) {
if(isConsole(client)) { if (isConsole(client)) {
return true; return true;
} }
if(requiredFlags == getStaffFlagValue("None")) { if (requiredFlags == getStaffFlagValue("None")) {
return true; return true;
} }
let staffFlags = 0; let staffFlags = 0;
if(getPlayerData(client)) { if (getPlayerData(client)) {
staffFlags = getPlayerData(client).accountData.flags.admin; staffFlags = getPlayerData(client).accountData.flags.admin;
} }
// -1 is automatic override (having -1 for staff flags is basically god mode admin level) // -1 is automatic override (having -1 for staff flags is basically god mode admin level)
if(staffFlags == getStaffFlagValue("All")) { if (staffFlags == getStaffFlagValue("All")) {
return true; return true;
} }
if(hasBitFlag(staffFlags, requiredFlags)) { if (hasBitFlag(staffFlags, requiredFlags)) {
return true; return true;
} }
@@ -271,27 +330,57 @@ function doesPlayerHaveStaffPermission(client, requiredFlags) {
// =========================================================================== // ===========================================================================
function doesPlayerHaveClanPermission(client, requiredFlags) { function doesPlayerHaveClanPermission(client, requiredFlags) {
if(isConsole(client)) { if (isConsole(client)) {
return true; return true;
} }
if(requiredFlags == getClanFlagValue("None")) { if (requiredFlags == getClanFlagValue("None")) {
return true; return true;
} }
if(doesPlayerHaveStaffPermission(client, getStaffFlagValue("ManageClans"))) { if (doesPlayerHaveStaffPermission(client, getStaffFlagValue("ManageClans"))) {
return true; return true;
} }
let clanFlags = 0; let clanFlags = 0;
clanFlags = getPlayerCurrentSubAccount(client).clanFlags | getClanRankFlags(getPlayerCurrentSubAccount(client).clanRank); clanFlags = getPlayerCurrentSubAccount(client).clanFlags | getClanRankData(getPlayerClan(client), getPlayerClanRank(client)).flags;
// -1 is automatic override (having -1 for staff flags is basically god mode admin level) // -1 is automatic override (having -1 for staff flags is basically god mode admin level)
if(clanFlags == getClanFlagValue("All")) { if (clanFlags == getClanFlagValue("All")) {
return true; return true;
} }
if(hasBitFlag(clanFlags, requiredFlags)) { if (hasBitFlag(clanFlags, requiredFlags)) {
return true;
}
return false;
}
// ===========================================================================
function doesPlayerHaveJobPermission(client, requiredFlags) {
if (isConsole(client)) {
return true;
}
if (requiredFlags == getClanFlagValue("None")) {
return true;
}
if (doesPlayerHaveStaffPermission(client, getStaffFlagValue("ManageJobs"))) {
return true;
}
let jobFlags = 0;
jobFlags = getPlayerCurrentSubAccount(client).jobFlags | getJobRankData(getPlayerJob(client), getPlayerJobRank(client)).flags;
// -1 is automatic override (having -1 for staff flags is basically god mode admin level)
if (jobFlags == getJobFlagValue("All")) {
return true;
}
if (hasBitFlag(jobFlags, requiredFlags)) {
return true; return true;
} }
@@ -301,11 +390,11 @@ function doesPlayerHaveClanPermission(client, requiredFlags) {
// =========================================================================== // ===========================================================================
function getStaffFlagValue(flagName) { function getStaffFlagValue(flagName) {
if(flagName == "All") { if (flagName == "All") {
return -1; return -1;
} }
if(typeof serverBitFlags.staffFlags[flagName] == "undefined") { if (typeof serverBitFlags.staffFlags[flagName] == "undefined") {
return false; return false;
} }
@@ -315,11 +404,11 @@ function getStaffFlagValue(flagName) {
// =========================================================================== // ===========================================================================
function getClanFlagValue(flagName) { function getClanFlagValue(flagName) {
if(flagName == "All") { if (flagName == "All") {
return -1; return -1;
} }
if(typeof getServerBitFlags().clanFlags[flagName] == "undefined") { if (typeof getServerBitFlags().clanFlags[flagName] == "undefined") {
return false; return false;
} }
@@ -329,11 +418,11 @@ function getClanFlagValue(flagName) {
// =========================================================================== // ===========================================================================
function getAccountSettingsFlagValue(flagName) { function getAccountSettingsFlagValue(flagName) {
if(flagName == "All") { if (flagName == "All") {
return -1; return -1;
} }
if(typeof serverBitFlags.accountSettingsFlags[flagName] == "undefined") { if (typeof serverBitFlags.accountSettingsFlags[flagName] == "undefined") {
return false; return false;
} }
@@ -343,11 +432,11 @@ function getAccountSettingsFlagValue(flagName) {
// =========================================================================== // ===========================================================================
function getModerationFlagValue(flagName) { function getModerationFlagValue(flagName) {
if(flagName == "All") { if (flagName == "All") {
return -1; return -1;
} }
if(typeof serverBitFlags.moderationFlags[flagName] == "undefined") { if (typeof serverBitFlags.moderationFlags[flagName] == "undefined") {
return false; return false;
} }
@@ -356,8 +445,36 @@ function getModerationFlagValue(flagName) {
// =========================================================================== // ===========================================================================
function getClanDiscordWebhookValue(flagName) {
if (flagName == "All") {
return -1;
}
if (typeof serverBitFlags.clanDiscordWebhookFlags[flagName] == "undefined") {
return false;
}
return serverBitFlags.clanDiscordWebhookFlags[flagName];
}
// ===========================================================================
function getSeenActionTipsValue(flagName) {
if (flagName == "All") {
return -1;
}
if (typeof serverBitFlags.seenActionTips[flagName] == "undefined") {
return false;
}
return serverBitFlags.seenActionTips[flagName];
}
// ===========================================================================
function givePlayerStaffFlag(client, flagName) { function givePlayerStaffFlag(client, flagName) {
if(!getStaffFlagValue(flagName)) { if (!getStaffFlagValue(flagName)) {
return false; return false;
} }
@@ -369,7 +486,7 @@ function givePlayerStaffFlag(client, flagName) {
function takePlayerStaffFlag(client, flagName) { function takePlayerStaffFlag(client, flagName) {
let flagValue = getStaffFlagValue(flagName); let flagValue = getStaffFlagValue(flagName);
if(!flagValue) { if (!flagValue) {
return false; return false;
} }
@@ -380,7 +497,7 @@ function takePlayerStaffFlag(client, flagName) {
// =========================================================================== // ===========================================================================
function takePlayerStaffFlag(client, flagName) { function takePlayerStaffFlag(client, flagName) {
if(!getStaffFlagValue(flagName)) { if (!getStaffFlagValue(flagName)) {
return false; return false;
} }

File diff suppressed because it is too large Load Diff

175
scripts/server/casino.js Normal file
View File

@@ -0,0 +1,175 @@
// ===========================================================================
// Asshat Gaming Roleplay
// https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// ===========================================================================
// FILE: casino.js
// DESC: Provides casino games functions and commands
// TYPE: Server (JavaScript)
// ===========================================================================
const AGRP_CASINO_GAME_NONE = 0;
const AGRP_CASINO_GAME_BLACKJACK = 1;
const AGRP_CASINO_GAME_POKER = 2;
const AGRP_CASINO_GAME_BACCARAT = 3;
const AGRP_CASINO_GAME_ROULETTE = 4;
const AGRP_CASINO_GAME_CRAPS = 5;
const AGRP_CASINO_GAME_HOLDEM = 6;
// ===========================================================================
const AGRP_CASINO_DECK_SUIT_NONE = 1;
const AGRP_CASINO_DECK_SUIT_CLUBS = 1;
const AGRP_CASINO_DECK_SUIT_DIAMONDS = 2;
const AGRP_CASINO_DECK_SUIT_HEARTS = 3;
const AGRP_CASINO_DECK_SUIT_SPADES = 4;
// ===========================================================================
class DeckCard {
constructor(suit, value, imageName) {
this.suit = suit;
this.value = value;
this.imageName = imageName;
}
}
// ===========================================================================
let cardDeck = [
new DeckCard(AGRP_CASINO_DECK_SUIT_CLUBS, 1, "deckCardClubAce"),
new DeckCard(AGRP_CASINO_DECK_SUIT_CLUBS, 2, "deckCardClubTwo"),
new DeckCard(AGRP_CASINO_DECK_SUIT_CLUBS, 3, "deckCardClubThree"),
new DeckCard(AGRP_CASINO_DECK_SUIT_CLUBS, 4, "deckCardClubFour"),
new DeckCard(AGRP_CASINO_DECK_SUIT_CLUBS, 5, "deckCardClubFive"),
new DeckCard(AGRP_CASINO_DECK_SUIT_CLUBS, 6, "deckCardClubSix"),
new DeckCard(AGRP_CASINO_DECK_SUIT_CLUBS, 7, "deckCardClubSeven"),
new DeckCard(AGRP_CASINO_DECK_SUIT_CLUBS, 8, "deckCardClubEight"),
new DeckCard(AGRP_CASINO_DECK_SUIT_CLUBS, 9, "deckCardClubNine"),
new DeckCard(AGRP_CASINO_DECK_SUIT_CLUBS, 10, "deckCardClubTen"),
new DeckCard(AGRP_CASINO_DECK_SUIT_CLUBS, 11, "deckCardClubJack"),
new DeckCard(AGRP_CASINO_DECK_SUIT_CLUBS, 12, "deckCardClubQueen"),
new DeckCard(AGRP_CASINO_DECK_SUIT_CLUBS, 13, "deckCardClubKing"),
new DeckCard(AGRP_CASINO_DECK_SUIT_DIAMONDS, 1, "deckCardDiamondAce"),
new DeckCard(AGRP_CASINO_DECK_SUIT_DIAMONDS, 2, "deckCardDiamondTwo"),
new DeckCard(AGRP_CASINO_DECK_SUIT_DIAMONDS, 3, "deckCardDiamondThree"),
new DeckCard(AGRP_CASINO_DECK_SUIT_DIAMONDS, 4, "deckCardDiamondFour"),
new DeckCard(AGRP_CASINO_DECK_SUIT_DIAMONDS, 5, "deckCardDiamondFive"),
new DeckCard(AGRP_CASINO_DECK_SUIT_DIAMONDS, 6, "deckCardDiamondSix"),
new DeckCard(AGRP_CASINO_DECK_SUIT_DIAMONDS, 7, "deckCardDiamondSeven"),
new DeckCard(AGRP_CASINO_DECK_SUIT_DIAMONDS, 8, "deckCardDiamondEight"),
new DeckCard(AGRP_CASINO_DECK_SUIT_DIAMONDS, 9, "deckCardDiamondNine"),
new DeckCard(AGRP_CASINO_DECK_SUIT_DIAMONDS, 10, "deckCardDiamondTen"),
new DeckCard(AGRP_CASINO_DECK_SUIT_DIAMONDS, 11, "deckCardDiamondJack"),
new DeckCard(AGRP_CASINO_DECK_SUIT_DIAMONDS, 12, "deckCardDiamondQueen"),
new DeckCard(AGRP_CASINO_DECK_SUIT_DIAMONDS, 13, "deckCardDiamondKing"),
new DeckCard(AGRP_CASINO_DECK_SUIT_HEARTS, 1, "deckCardHeartAce"),
new DeckCard(AGRP_CASINO_DECK_SUIT_HEARTS, 2, "deckCardHeartTwo"),
new DeckCard(AGRP_CASINO_DECK_SUIT_HEARTS, 3, "deckCardHeartThree"),
new DeckCard(AGRP_CASINO_DECK_SUIT_HEARTS, 4, "deckCardHeartFour"),
new DeckCard(AGRP_CASINO_DECK_SUIT_HEARTS, 5, "deckCardHeartFive"),
new DeckCard(AGRP_CASINO_DECK_SUIT_HEARTS, 6, "deckCardHeartSix"),
new DeckCard(AGRP_CASINO_DECK_SUIT_HEARTS, 7, "deckCardHeartSeven"),
new DeckCard(AGRP_CASINO_DECK_SUIT_HEARTS, 8, "deckCardHeartEight"),
new DeckCard(AGRP_CASINO_DECK_SUIT_HEARTS, 9, "deckCardHeartNine"),
new DeckCard(AGRP_CASINO_DECK_SUIT_HEARTS, 10, "deckCardHeartTen"),
new DeckCard(AGRP_CASINO_DECK_SUIT_HEARTS, 11, "deckCardHeartJack"),
new DeckCard(AGRP_CASINO_DECK_SUIT_HEARTS, 12, "deckCardHeartQueen"),
new DeckCard(AGRP_CASINO_DECK_SUIT_HEARTS, 13, "deckCardHeartKing"),
];
// ===========================================================================
function createBlackJackDeck() {
let deck = [];
for (let i in cardDeck) {
deck.push(cardDeck[i]);
}
return deck;
}
// ===========================================================================
function shuffleBlackJackDeck(deck) {
// For 1000 turns, switch the values of two random cards
// This may need to be lowered for a more optimized shuffling algorithm (reduces server load)
for (var i = 0; i < 1000; i++) {
var location1 = Math.floor((Math.random() * deck.length));
var location2 = Math.floor((Math.random() * deck.length));
var tmp = deck[location1];
deck[location1] = deck[location2];
deck[location2] = tmp;
}
}
// ===========================================================================
function blackJackHitCommand(command, params, client) {
if (!isPlayerPlayingBlackJack(client)) {
return false;
}
if (isPlayersTurnInBlackJack(client)) {
return false;
}
let hand = getPlayerData(client).casinoCardHand;
hand.push(deck.pop());
let tempHandValue = getValueOfBlackJackHand(hand);
if (handValue > 21) {
playerBustBlackJack(client);
return false;
}
}
// ===========================================================================
function blackJackStandCommand(command, params, client) {
if (!isPlayerPlayingBlackJack(client)) {
return false;
}
if (isPlayersTurnInBlackJack(client)) {
return false;
}
return true;
}
// ===========================================================================
function dealPlayerBlackJackHand(deck, players) {
// Alternate handing cards to each player, 2 cards each
for (var i = 0; i < 2; i++) {
for (var x = 0; x < players.length; x++) {
var card = deck.pop();
getPlayerData(players[i]).casinoCardHand.push(card);
updateCasinoCardHand(players[i]);
}
}
}
// ===========================================================================
function calculateValueOfBlackJackHand(hand) {
let tempHandValue = 0;
for (let i in hand) {
if (hand[i].value == 1) {
if ((tempHandValue + 11) > 21) {
tempHandValue += 1;
} else {
tempHandValue += 11;
}
} else {
tempHandValue += hand[i].value;
}
}
}
// ===========================================================================

View File

@@ -1,6 +1,7 @@
// =========================================================================== // ===========================================================================
// Vortrex's Roleplay Resource // Asshat Gaming Roleplay
// https://github.com/VortrexFTW/gtac_roleplay // https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// =========================================================================== // ===========================================================================
// FILE: chat.js // FILE: chat.js
// DESC: Provides chat functions and usage // DESC: Provides chat functions and usage
@@ -8,31 +9,31 @@
// =========================================================================== // ===========================================================================
function initChatScript() { function initChatScript() {
logToConsole(LOG_INFO, "[VRR.Chat]: Initializing chat script ..."); logToConsole(LOG_INFO, "[AGRP.Chat]: Initializing chat script ...");
logToConsole(LOG_INFO, "[VRR.Chat]: Chat script initialized successfully!"); logToConsole(LOG_INFO, "[AGRP.Chat]: Chat script initialized successfully!");
return true; return true;
} }
// =========================================================================== // ===========================================================================
function processPlayerChat(client, messageText) { function processPlayerChat(client, messageText) {
if(!isConsole(client)) { if (!isConsole(client)) {
if(!getPlayerData(client)) { if (!getPlayerData(client)) {
messagePlayerError(client, getLocaleString(client, "MustBeLoggedInAndSpawnedToChat")); messagePlayerError(client, getLocaleString(client, "MustBeLoggedInAndSpawnedToChat"));
return false; return false;
} }
if(!isPlayerLoggedIn(client)) { if (!isPlayerLoggedIn(client)) {
messagePlayerError(client, getLocaleString(client, "MustBeLoggedInAndSpawnedToChat")); messagePlayerError(client, getLocaleString(client, "MustBeLoggedInAndSpawnedToChat"));
return false; return false;
} }
if(!isPlayerSpawned(client)) { if (!isPlayerSpawned(client)) {
messagePlayerError(client, getLocaleString(client, "MustBeLoggedInAndSpawnedToChat")); messagePlayerError(client, getLocaleString(client, "MustBeLoggedInAndSpawnedToChat"));
return false; return false;
} }
if(isPlayerMuted(client)) { if (isPlayerMuted(client)) {
messagePlayerError(client, getLocaleString(client, "MutedCantChat")); messagePlayerError(client, getLocaleString(client, "MutedCantChat"));
return false; return false;
} }
@@ -61,7 +62,7 @@ function processPlayerChat(client, messageText) {
// =========================================================================== // ===========================================================================
function meActionCommand(command, params, client) { function meActionCommand(command, params, client) {
if(areParamsEmpty(params)) { if (areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command)); messagePlayerSyntax(client, getCommandSyntaxText(command));
return false; return false;
} }
@@ -73,12 +74,12 @@ function meActionCommand(command, params, client) {
// =========================================================================== // ===========================================================================
function doActionCommand(command, params, client) { function doActionCommand(command, params, client) {
if(isPlayerMuted(client)) { if (isPlayerMuted(client)) {
messagePlayerError(client, getLocaleString(client, "MutedCantChat")); messagePlayerError(client, getLocaleString(client, "MutedCantChat"));
return false; return false;
} }
if(areParamsEmpty(params)) { if (areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command)); messagePlayerSyntax(client, getCommandSyntaxText(command));
return false; return false;
} }
@@ -90,12 +91,12 @@ function doActionCommand(command, params, client) {
// =========================================================================== // ===========================================================================
function shoutCommand(command, params, client) { function shoutCommand(command, params, client) {
if(isPlayerMuted(client)) { if (isPlayerMuted(client)) {
messagePlayerError(client, getLocaleString(client, "MutedCantChat")); messagePlayerError(client, getLocaleString(client, "MutedCantChat"));
return false; return false;
} }
if(areParamsEmpty(params)) { if (areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command)); messagePlayerSyntax(client, getCommandSyntaxText(command));
return false; return false;
} }
@@ -107,17 +108,17 @@ function shoutCommand(command, params, client) {
// =========================================================================== // ===========================================================================
function megaphoneChatCommand(command, params, client) { function megaphoneChatCommand(command, params, client) {
if(isPlayerMuted(client)) { if (isPlayerMuted(client)) {
messagePlayerError(client, getLocaleString(client, "MutedCantChat")); messagePlayerError(client, getLocaleString(client, "MutedCantChat"));
return false; return false;
} }
if(areParamsEmpty(params)) { if (areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command)); messagePlayerSyntax(client, getCommandSyntaxText(command));
return false; return false;
} }
if(!canPlayerUseMegaphone(client)) { if (!canPlayerUseMegaphone(client)) {
messagePlayerError(client, getLocaleString(client, "CantUseMegaphone")); messagePlayerError(client, getLocaleString(client, "CantUseMegaphone"));
return false; return false;
} }
@@ -129,12 +130,12 @@ function megaphoneChatCommand(command, params, client) {
// =========================================================================== // ===========================================================================
function talkCommand(command, params, client) { function talkCommand(command, params, client) {
if(isPlayerMuted(client)) { if (isPlayerMuted(client)) {
messagePlayerError(client, getLocaleString(client, "MutedCantChat")); messagePlayerError(client, getLocaleString(client, "MutedCantChat"));
return false; return false;
} }
if(areParamsEmpty(params)) { if (areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command)); messagePlayerSyntax(client, getCommandSyntaxText(command));
return false; return false;
} }
@@ -146,12 +147,12 @@ function talkCommand(command, params, client) {
// =========================================================================== // ===========================================================================
function whisperCommand(command, params, client) { function whisperCommand(command, params, client) {
if(isPlayerMuted(client)) { if (isPlayerMuted(client)) {
messagePlayerError(client, getLocaleString(client, "MutedCantChat")); messagePlayerError(client, getLocaleString(client, "MutedCantChat"));
return false; return false;
} }
if(areParamsEmpty(params)) { if (areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command)); messagePlayerSyntax(client, getCommandSyntaxText(command));
return false; return false;
} }
@@ -163,28 +164,35 @@ function whisperCommand(command, params, client) {
// =========================================================================== // ===========================================================================
function adminChatCommand(command, params, client) { function adminChatCommand(command, params, client) {
if(isPlayerMuted(client)) { if (isPlayerMuted(client)) {
messagePlayerError(client, getLocaleString(client, "MutedCantChat")); messagePlayerError(client, getLocaleString(client, "MutedCantChat"));
return false; return false;
} }
if(areParamsEmpty(params)) { if (areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command)); messagePlayerSyntax(client, getCommandSyntaxText(command));
return false; return false;
} }
messageAdmins(`{jobYellow}[Admin Chat] {ALTCOLOUR}${getPlayerName(client)}: ${params}`); let clients = getClients();
for (let i in clients) {
if (doesPlayerHaveStaffPermission(clients[i], getStaffFlagValue("BasicModeration"))) {
messagePlayerAdminChat(clients[i], client, params);
}
}
messageDiscordAdminChannel(`${getPlayerData(client).accountData.staffTitle} ${getPlayerData(client).accountData.name}: ${messageText}`);
} }
// =========================================================================== // ===========================================================================
function clanChatCommand(command, params, client) { function clanChatCommand(command, params, client) {
if(isPlayerMuted(client)) { if (isPlayerMuted(client)) {
messagePlayerError(client, getLocaleString(client, "MutedCantChat")); messagePlayerError(client, getLocaleString(client, "MutedCantChat"));
return false; return false;
} }
if(areParamsEmpty(params)) { if (areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command)); messagePlayerSyntax(client, getCommandSyntaxText(command));
return false; return false;
} }
@@ -194,24 +202,82 @@ function clanChatCommand(command, params, client) {
// =========================================================================== // ===========================================================================
function privateMessageCommand(command, params, client) {
if (isPlayerMuted(client)) {
messagePlayerError(client, getLocaleString(client, "MutedCantChat"));
return false;
}
if (areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command));
return false;
}
let splitParams = params.split(" ");
let targetClient = getPlayerFromParams(splitParams[0]);
let messageText = splitParams.slice(1).join(" ");
if (!targetClient) {
messagePlayerError(client, getLocaleString(client, "InvalidPlayer"));
return false;
}
getPlayerData(targetClient).privateMessageReplyTo = client;
messagePlayerPrivateMessage(targetClient, client, messageText);
if (!hasPlayerSeenActionTip(targetClient, "ReplyToDirectMessage")) {
messagePlayerTip(targetClient, getGroupedLocaleString(targetClient, "ActionTips", "ReplyToDirectMessage", "{ALTCOLOUR}/reply{MAINCOLOUR}"));
}
}
// ===========================================================================
function replyToLastPrivateMessageCommand(command, params, client) {
if (isPlayerMuted(client)) {
messagePlayerError(client, getLocaleString(client, "MutedCantChat"));
return false;
}
if (areParamsEmpty(params)) {
messagePlayerSyntax(client, getCommandSyntaxText(command));
return false;
}
if (getPlayerData(client).privateMessageReplyTo == null) {
messagePlayerError(client, getLocaleString(client, "NoPrivateMessageToReply"));
return false;
}
getPlayerData(targetClient).privateMessageReplyTo = client;
messagePlayerPrivateMessage(targetClient, client, messageText);
markPlayerActionTipSeen(client, "ReplyToDirectMessage");
}
// ===========================================================================
function talkToNearbyPlayers(client, messageText) { function talkToNearbyPlayers(client, messageText) {
let clients = getClients(); let clients = getClients();
for(let i in clients) { for (let i in clients) {
if(isPlayerSpawned(clients[i])) { if (isPlayerSpawned(clients[i])) {
if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().talkDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) { if (hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().talkDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) {
messagePlayerTalk(clients[i], client, messageText); messagePlayerTalk(clients[i], client, messageText);
} }
} }
} }
if (getGlobalConfig().discord.sendLocalChat) {
messageDiscordChatChannel(`🗣️ ${getPlayerAccentInlineOutput(talkingClient)}${getClientSubAccountName(talkingClient)} says: ${messageText}`);
}
} }
// =========================================================================== // ===========================================================================
function phoneOutgoingToNearbyPlayers(client, messageText) { function phoneOutgoingToNearbyPlayers(client, messageText) {
let clients = getClients(); let clients = getClients();
for(let i in clients) { for (let i in clients) {
if(isPlayerSpawned(clients[i])) { if (isPlayerSpawned(clients[i])) {
if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().talkDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) { if (hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().talkDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) {
messagePlayerNormal(`[#CCCCCC]${getCharacterFullName(client)} {ALTCOLOUR}(to phone): {MAINCOLOUR}${messageText}`); messagePlayerNormal(`[#CCCCCC]${getCharacterFullName(client)} {ALTCOLOUR}(to phone): {MAINCOLOUR}${messageText}`);
} }
} }
@@ -222,9 +288,9 @@ function phoneOutgoingToNearbyPlayers(client, messageText) {
function phoneIncomingToNearbyPlayers(client, messageText) { function phoneIncomingToNearbyPlayers(client, messageText) {
let clients = getClients(); let clients = getClients();
for(let i in clients) { for (let i in clients) {
if(isPlayerSpawned(clients[i])) { if (isPlayerSpawned(clients[i])) {
if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().phoneSpeakerDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) { if (hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().phoneSpeakerDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) {
messagePlayerNormal(`[#CCCCCC]${getCharacterFullName(client)} {ALTCOLOUR}(from phone): {MAINCOLOUR}${messageText}`); messagePlayerNormal(`[#CCCCCC]${getCharacterFullName(client)} {ALTCOLOUR}(from phone): {MAINCOLOUR}${messageText}`);
} }
} }
@@ -235,91 +301,115 @@ function phoneIncomingToNearbyPlayers(client, messageText) {
function whisperToNearbyPlayers(client, messageText) { function whisperToNearbyPlayers(client, messageText) {
let clients = getClients(); let clients = getClients();
for(let i in clients) { for (let i in clients) {
if(isPlayerSpawned(clients[i])) { if (isPlayerSpawned(clients[i])) {
if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().whisperDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) { if (hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().whisperDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) {
messagePlayerWhisper(clients[i], client, messageText); messagePlayerWhisper(clients[i], client, messageText);
} }
} }
} }
if (getGlobalConfig().discord.sendLocalChat) {
messageDiscordChatChannel(`🤫 ${getPlayerAccentInlineOutput(whisperingClient)}${getClientSubAccountName(whisperingClient)} whispers: ${messageText}`);
}
} }
// =========================================================================== // ===========================================================================
function shoutToNearbyPlayers(client, messageText) { function shoutToNearbyPlayers(client, messageText) {
let clients = getClients(); let clients = getClients();
for(let i in clients) { for (let i in clients) {
if(isPlayerSpawned(clients[i])) { if (isPlayerSpawned(clients[i])) {
if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().shoutDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) { if (hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().shoutDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) {
messagePlayerShout(clients[i], client, messageText); messagePlayerShout(clients[i], client, messageText);
} }
} }
} }
if (getGlobalConfig().discord.sendLocalChat) {
messageDiscordChatChannel(`🗣️ ${getPlayerAccentInlineOutput(shoutingClient)}${getClientSubAccountName(shoutingClient)} shouts: ${messageText}!`);
}
} }
// =========================================================================== // ===========================================================================
function megaPhoneToNearbyPlayers(client, messageText) { function megaPhoneToNearbyPlayers(client, messageText) {
let clients = getClients(); let clients = getClients();
for(let i in clients) { for (let i in clients) {
if(isPlayerSpawned(clients[i])) { if (isPlayerSpawned(clients[i])) {
if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().megaphoneDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) { if (hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().megaphoneDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) {
messagePlayerMegaPhone(clients[i], client, messageText); messagePlayerMegaPhone(clients[i], client, messageText);
} }
} }
} }
if (getGlobalConfig().discord.sendLocalChat) {
messageDiscordChatChannel(`📢 ${getPlayerAccentInlineOutput(shoutingClient)}${getClientSubAccountName(shoutingClient)} (megaphone): ${messageText}!`);
}
} }
// =========================================================================== // ===========================================================================
function doActionToNearbyPlayers(client, messageText) { function doActionToNearbyPlayers(client, messageText) {
let clients = getClients(); let clients = getClients();
for(let i in clients) { for (let i in clients) {
if(isPlayerSpawned(clients[i])) { if (isPlayerSpawned(clients[i])) {
if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().doActionDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) { if (hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().doActionDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) {
messagePlayerDoAction(clients[i], client, messageText); messagePlayerDoAction(clients[i], client, messageText);
} }
} }
} }
if (getGlobalConfig().discord.sendAction) {
messageDiscordChatChannel(`🙋 *${messageText} (${getCharacterFullName(client)})*`);
}
} }
// =========================================================================== // ===========================================================================
function meActionToNearbyPlayers(client, messageText) { function meActionToNearbyPlayers(client, messageText) {
let clients = getClients(); let clients = getClients();
for(let i in clients) { for (let i in clients) {
if(isPlayerSpawned(clients[i])) { if (isPlayerSpawned(clients[i])) {
if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().meActionDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) { if (hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || (getDistance(getPlayerPosition(client), getPlayerPosition(clients[i])) <= getGlobalConfig().meActionDistance && getPlayerDimension(client) == getPlayerDimension(clients[i]))) {
messagePlayerMeAction(clients[i], client, messageText); messagePlayerMeAction(clients[i], client, messageText);
} }
} }
} }
if (getGlobalConfig().discord.sendAction) {
messageDiscordChatChannel(`🙋 *${getCharacterFullName(client)} ${messageText}*`);
}
} }
// =========================================================================== // ===========================================================================
function clanChat(client, messageText) { function clanChat(client, messageText) {
let clients = getClients(); let clients = getClients();
for(let i in clients) { for (let i in clients) {
if(isPlayerSpawned(clients[i])) { if (isPlayerSpawned(clients[i])) {
if(hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || arePlayersInSameClan(client, clients[i])) { if (hasBitFlag(getPlayerData(clients[i]).accountData.flags.moderation, getModerationFlagValue("CanHearEverything")) || arePlayersInSameClan(client, clients[i])) {
messagePlayerClanChat(clients[i], client, messageText); messagePlayerClanChat(clients[i], client, messageText);
} }
} }
} }
//if (getGlobalConfig().discord.sendClan) {
// messageDiscordClanWebhook(getPlayerClan(client), getClanDiscordWebhookFlagValue("ClanChat"), fullString);
//}
} }
// =========================================================================== // ===========================================================================
function canPlayerUseMegaphone(client) { function canPlayerUseMegaphone(client) {
if(getPlayerFirstItemSlotByUseType(client, VRR_ITEM_USETYPE_MEGAPHONE) != -1) { if (getPlayerFirstItemSlotByUseType(client, AGRP_ITEM_USE_TYPE_MEGAPHONE) != -1) {
if(isPlayerActiveItemEnabled(client)) { if (isPlayerActiveItemEnabled(client)) {
return true; return true;
} }
} }
if(getPlayerVehicle(client)) { if (getPlayerVehicle(client)) {
if(doesVehicleHaveMegaphone(getPlayerVehicle(client))) { if (doesVehicleHaveMegaphone(getPlayerVehicle(client))) {
return true; return true;
} }
} }

File diff suppressed because it is too large Load Diff

300
scripts/server/client.js Normal file
View File

@@ -0,0 +1,300 @@
// ===========================================================================
// Asshat Gaming Roleplay
// https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// ===========================================================================
// FILE: client.js
// DESC: Provides client communication and cross-endpoint operations
// TYPE: Server (JavaScript)
// ===========================================================================
// Return-To types (for when a player is teleported)
const AGRP_RETURNTO_TYPE_NONE = 0; // "Return to" data is invalid
const AGRP_RETURNTO_TYPE_ADMINGET = 1; // "Return to" data is from admin teleporting
const AGRP_RETURNTO_TYPE_SKINSELECT = 2; // "Return to" data is from skin select
// ===========================================================================
/**
* @class Representing extra data for a client
* @property {AccountData} accountData
* @property {Array.<SubAccountData>} subAccounts
*/
class ClientData {
constructor(client, accountData, subAccounts) {
this.accountData = accountData;
this.subAccounts = subAccounts; // Characters
// General Info
this.client = client;
this.currentSubAccount = -1;
this.loggedIn = false;
this.index = -1;
this.connectTime = 0;
this.clientVersion = "0.0.0";
this.afk = false;
this.spawned = false;
this.sessionId = 0;
// Security
this.passwordResetState = AGRP_RESETPASS_STATE_NONE;
this.passwordResetCode = "";
this.twoFactorAuthenticationState = AGRP_2FA_STATE_NONE;
this.twoFactorAuthenticationCode = 0;
this.loginTimeout = null;
this.loginAttemptsRemaining = 3;
// Job Stuff
this.jobEquipmentCache = [];
this.jobUniform = 0;
this.jobRoute = -1;
this.jobRouteLocation = -1;
this.jobRouteVehicle = false;
this.returnToJobVehicleTick = 0;
this.returnToJobVehicleTimer = null;
this.rentingVehicle = false;
this.buyingVehicle = false;
this.lastVehicle = false;
this.switchingCharacter = false;
this.tutorialStep = -1;
this.tutorialItem = null;
this.tutorialVehicle = null;
// Items
this.tempLockerCache = new Array(9).fill(-1);
this.tempLockerType = AGRP_TEMP_LOCKER_TYPE_NONE;
this.hotBarItems = new Array(9).fill(-1);
this.activeHotBarSlot = -1;
this.toggleUseItem = false;
this.itemActionState = AGRP_ITEM_ACTION_NONE;
this.itemActionItem = -1;
this.paintBallItemCache = [];
// Ordering for business
this.businessOrderAmount = 0;
this.businessOrderBusiness = -1;
this.businessOrderItem = -1;
this.businessOrderValue = -1;
// For Non-Server Elements
this.syncPosition = null;
this.syncHeading = null;
this.syncVehicle = null;
this.syncVehicleSeat = null;
// Payday
this.payDayAmount = 0;
this.payDayTickStart = 0;
// Creating Character
//this.creatingCharacter = false;
//this.creatingCharacterSkin = -1;
// Radio
this.streamingRadioStation = -1;
this.streamingRadioElement = false;
// Return To (when being teleported)
this.returnToPosition = null;
this.returnToHeading = null;
this.returnToInterior = null;
this.returnToDimension = null;
this.returnToHouse = null;
this.returnToBusiness = null;
this.returnToType = AGRP_RETURNTO_TYPE_NONE;
// Animation
this.currentAnimation = -1;
this.currentAnimationPositionOffset = false;
this.currentAnimationPositionReturnTo = false;
this.animationStart = 0;
this.animationForced = false;
// Misc
this.changingCharacterName = false;
this.currentPickup = null;
this.usingSkinSelect = false;
this.keyBinds = [];
this.incomingDamageMultiplier = 1;
this.weaponDamageEvent = AGRP_WEAPON_DAMAGE_EVENT_NORMAL;
this.lastJobVehicle = null;
this.health = 100;
this.locale = 0;
this.enteringVehicle = null;
this.customDisconnectReason = "";
this.scene = "";
this.playerBlip = null;
this.alcoholLevel = 0;
this.pedState = AGRP_PEDSTATE_NONE;
this.promptType = AGRP_PROMPT_NONE;
this.privateMessageReplyTo = null;
this.enteringExitingProperty = null;
this.inProperty = null;
// Paintball
this.inPaintBall = false;
this.paintBallBusiness = -1;
this.paintBallDeaths = 0;
this.paintBallKills = 0;
// Job Route Editing
this.jobRouteEditNextLocationDelay = 0;
this.jobRouteEditNextLocationArriveMessage = "";
this.jobRouteEditNextLocationGotoMessage = "";
this.jobRouteEditNextLocationType = AGRP_JOB_ROUTE_LOCATION_TYPE_NONE;
// Casino Stuff
this.casinoChips = 0; // This might become an item with a useId of a business (for chips belonging to specific casinos)
this.casinoCardHand = [];
this.casinoPlayingGame = AGRP_CASINO_GAME_NONE;
}
};
// ===========================================================================
function initClientScript() {
logToConsole(LOG_DEBUG, "[AGRP.Client]: Initializing client script ...");
logToConsole(LOG_DEBUG, "[AGRP.Client]: Client script initialized!");
}
// ===========================================================================
function resetClientStuff(client) {
logToConsole(LOG_DEBUG, `[AGRP.Utilities] Resetting client data for ${getPlayerDisplayForConsole(client)}`);
if (!getPlayerData(client)) {
return false;
}
if (isPlayerOnJobRoute(client)) {
stopJobRoute(client, false, false);
}
if (isPlayerWorking(client)) {
stopWorking(client);
}
if (getPlayerData(client).rentingVehicle) {
stopRentingVehicle(client);
}
if (isPlayerInPaintBall(client)) {
stopPaintBall(client);
}
//if (isPlayerFishing(client)) {
// stopFishing(client);
//}
deleteJobItems(client);
deletePaintBallItems(client);
//deletePlayerTemporaryLockerItems(client);
//getPlayerData(client).lastVehicle = null;
}
// ===========================================================================
function kickAllClients() {
getClients().forEach((client) => {
getPlayerData(client).customDisconnectReason = "ServerRestarting";
disconnectPlayer(client);
})
}
// ===========================================================================
function initClient(client) {
logToConsole(LOG_DEBUG, `[AGRP.Account] Initializing client ${getPlayerDisplayForConsole(client)} ...`);
if (isConsole(client)) {
logToConsole(LOG_DEBUG | LOG_ERROR, `[AGRP.Account] Client initialization failed for ${getPlayerDisplayForConsole(client)}! (is console client)`);
return false;
}
if (playerInitialized[client.index] == true) {
logToConsole(LOG_DEBUG | LOG_ERROR, `[AGRP.Account] Client initialization failed for ${getPlayerDisplayForConsole(client)}! (already initialized)`);
return false;
}
playerInitialized[client.index] = true;
//setEntityData(client, "agrp.isInitialized", true, false);
logToConsole(LOG_DEBUG, `[AGRP.Account] Initializing GUI for ${getPlayerDisplayForConsole(client)} ...`);
sendPlayerCurrencyString(client);
sendPlayerGUIColours(client);
sendPlayerGUIInit(client);
updatePlayerSnowState(client, getServerConfig().groundSnow);
//logToConsole(LOG_DEBUG, `[AGRP.Account] Showing connect camera to ${getPlayerDisplayForConsole(client)} ...`);
//showConnectCameraToPlayer(client);
messageClient(`Please wait ...`, client, getColourByName("softGreen"));
logToConsole(LOG_DEBUG, `[AGRP.Account] Waiting for 2.5 seconds to prevent race attack ...`);
setTimeout(function () {
if (client != null) {
clearChatBox(client);
logToConsole(LOG_DEBUG, `[AGRP.Account] Loading account for ${getPlayerDisplayForConsole(client)}`);
let tempAccountData = loadAccountFromName(getPlayerName(client), true);
logToConsole(LOG_DEBUG, `[AGRP.Account] Loading subaccounts for ${getPlayerDisplayForConsole(client)}`);
let tempSubAccounts = loadSubAccountsFromAccount(tempAccountData.databaseId);
getServerData().clients[getPlayerId(client)] = new ClientData(client, tempAccountData, tempSubAccounts);
getServerData().clients[getPlayerId(client)].sessionId = saveConnectionToDatabase(client);
getServerData().clients[getPlayerId(client)].connectTime = getCurrentUnixTimestamp();
requestClientInfo(client);
if (tempAccountData != false) {
sendPlayerLocaleId(client, getPlayerData(client).accountData.locale);
if (isAccountAutoIPLoginEnabled(tempAccountData) && getPlayerData(client).accountData.ipAddress == getPlayerIP(client)) {
messagePlayerAlert(client, getLocaleString(client, "AutoLoggedInIP"));
loginSuccess(client);
playRadioStreamForPlayer(client, getServerIntroMusicURL(), true, getPlayerStreamingRadioVolume(client));
} else {
if (doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
logToConsole(LOG_DEBUG, `[AGRP.Account] ${getPlayerDisplayForConsole(client)} is being shown the login GUI.`);
showPlayerLoginGUI(client);
} else {
logToConsole(LOG_DEBUG, `[AGRP.Account] ${getPlayerDisplayForConsole(client)} is being shown the login message (GUI disabled).`);
messagePlayerNormal(client, getLocaleString(client, "WelcomeBack", getServerName(), getPlayerName(client), "/login"), getColourByName("softGreen"));
if (checkForGeoIPModule()) {
let iso = module.geoip.getCountryISO(getGlobalConfig().geoIPCountryDatabaseFilePath, getPlayerIP(client));
let localeId = getLocaleFromCountryISO(iso);
if (localeId != 0) {
if (getLocaleData(localeId).enabled) {
messagePlayerTip(client, getLanguageLocaleString(localeId, "LocaleOffer", `/lang ${getLocaleData(localeId).isoCode}`), getColourByName("white"), 10000, "Roboto");
}
}
}
}
startLoginTimeoutForPlayer(client);
playRadioStreamForPlayer(client, getServerIntroMusicURL(), true, getPlayerStreamingRadioVolume(client));
}
} else {
sendPlayerLocaleId(client, 0);
if (doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
logToConsole(LOG_DEBUG, `[AGRP.Account] ${getPlayerDisplayForConsole(client)} is being shown the register GUI.`);
showPlayerRegistrationGUI(client);
} else {
logToConsole(LOG_DEBUG, `[AGRP.Account] ${getPlayerDisplayForConsole(client)} is being shown the register message (GUI disabled).`);
messagePlayerNormal(client, getLocaleString(client, "WelcomeNewPlayer", getServerName(), getPlayerName(client), "/register"), getColourByName("softGreen"));
}
playRadioStreamForPlayer(client, getServerIntroMusicURL(), true, getPlayerStreamingRadioVolume(client));
}
getServerData().clients[getPlayerId(client)].keyBinds = loadAccountKeybindsFromDatabase(getServerData().clients[getPlayerId(client)].accountData.databaseId);
sendAccountKeyBindsToClient(client);
}
}, 2500);
}
// ===========================================================================

View File

@@ -1,6 +1,7 @@
// =========================================================================== // ===========================================================================
// Vortrex's Roleplay Resource // Asshat Gaming Roleplay
// https://github.com/VortrexFTW/gtac_roleplay // https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// =========================================================================== // ===========================================================================
// FILE: command.js // FILE: command.js
// DESC: Provides command data, functions and usage // DESC: Provides command data, functions and usage
@@ -43,8 +44,8 @@ let serverCommands = [];
// =========================================================================== // ===========================================================================
function initCommandScript() { function initCommandScript() {
logToConsole(LOG_INFO, "[VRR.Command]: Initializing commands script ..."); logToConsole(LOG_INFO, "[AGRP.Command]: Initializing commands script ...");
logToConsole(LOG_INFO, "[VRR.Command]: Initialized commands script!"); logToConsole(LOG_INFO, "[AGRP.Command]: Initialized commands script!");
} }
// =========================================================================== // ===========================================================================
@@ -69,8 +70,20 @@ function loadCommands() {
new CommandData("notips", toggleNoRandomTipsCommand, "", getStaffFlagValue("None"), true, false, "Turn on and off random tips"), new CommandData("notips", toggleNoRandomTipsCommand, "", getStaffFlagValue("None"), true, false, "Turn on and off random tips"),
new CommandData("loginalert", toggleAccountLoginAttemptNotificationsCommand, "", getStaffFlagValue("None"), true, false, "Turn on and off email notifications for attempts to login to your account"), new CommandData("loginalert", toggleAccountLoginAttemptNotificationsCommand, "", getStaffFlagValue("None"), true, false, "Turn on and off email notifications for attempts to login to your account"),
new CommandData("scrolllines", setAccountChatScrollLinesCommand, "<number of lines>", getStaffFlagValue("None"), true, false, "Sets how many chatbox lines to scroll at a time when using pageup/pagedown"), new CommandData("scrolllines", setAccountChatScrollLinesCommand, "<number of lines>", getStaffFlagValue("None"), true, false, "Sets how many chatbox lines to scroll at a time when using pageup/pagedown"),
new CommandData("chatscrolllines", setAccountChatScrollLinesCommand, "<number of lines>", getStaffFlagValue("None"), true, false, "Sets how many chatbox lines to scroll at a time when using pageup/pagedown"),
new CommandData("chatscroll", setAccountChatScrollLinesCommand, "<number of lines>", getStaffFlagValue("None"), true, false, "Sets how many chatbox lines to scroll at a time when using pageup/pagedown"),
new CommandData("chatautohide", setAccountChatAutoHideDelayCommand, "<time in seconds>", getStaffFlagValue("None"), true, false, "Sets how long to wait to hide the chatbox after last use (in seconds)"), new CommandData("chatautohide", setAccountChatAutoHideDelayCommand, "<time in seconds>", getStaffFlagValue("None"), true, false, "Sets how long to wait to hide the chatbox after last use (in seconds)"),
new CommandData("chattimestamp", toggleChatBoxTimeStampsCommand, "", getStaffFlagValue("None"), true, false, "Turns on/off timestamps in the chatbox"),
new CommandData("chattimestamps", toggleChatBoxTimeStampsCommand, "", getStaffFlagValue("None"), true, false, "Turns on/off timestamps in the chatbox"),
new CommandData("chattime", toggleChatBoxTimeStampsCommand, "", getStaffFlagValue("None"), true, false, "Turns on/off timestamps in the chatbox"),
new CommandData("chattimes", toggleChatBoxTimeStampsCommand, "", getStaffFlagValue("None"), true, false, "Turns on/off timestamps in the chatbox"),
new CommandData("chattimestamps", toggleChatBoxTimeStampsCommand, "", getStaffFlagValue("None"), true, false, "Turns on/off timestamps in the chatbox"),
new CommandData("chatfilter", toggleAccountProfanityFilterCommand, "", getStaffFlagValue("None"), true, false, "Turns on/off profanity filter"),
new CommandData("chatemoji", toggleAccountReplaceEmojiCommand, "", getStaffFlagValue("None"), true, false, "Turns on/off automatic emoji"),
new CommandData("emoji", toggleAccountReplaceEmojiCommand, "", getStaffFlagValue("None"), true, false, "Turns on/off automatic emoji"),
//new CommandData("resetkeybinds", resetKeyBindsCommand, "", getStaffFlagValue("None"), true, false, "Resets all your keybinds to default"),
//new CommandData("copykeybinds", copyKeyBindsToServerCommand, "<server id>", getStaffFlagValue("None"), true, false, "Copies all your current keybinds to another server"),
//new CommandData("noblood", toggleAccountHideBloodCommand, "", getStaffFlagValue("None"), true, false, "Turns on/off blood in-game"),
], ],
ammunation: [], ammunation: [],
animation: [ animation: [
@@ -127,14 +140,15 @@ function loadCommands() {
new CommandData("bizpickup", setBusinessPickupCommand, "<type name/model id>", getStaffFlagValue("ManageBusinesses"), true, true, "Sets the business pickup display"), new CommandData("bizpickup", setBusinessPickupCommand, "<type name/model id>", getStaffFlagValue("ManageBusinesses"), true, true, "Sets the business pickup display"),
new CommandData("bizinfo", getBusinessInfoCommand, "[business id]", getStaffFlagValue("None"), true, true, "Shows business information"), new CommandData("bizinfo", getBusinessInfoCommand, "[business id]", getStaffFlagValue("None"), true, true, "Shows business information"),
new CommandData("bizflooritems", getBusinessFloorItemsCommand, "[business id]", getStaffFlagValue("None"), true, true, "Shows all business floor items (for sale) to a player"), new CommandData("bizflooritems", getBusinessFloorItemsCommand, "[business id]", getStaffFlagValue("None"), true, true, "Shows all business floor items (for sale) to a player"),
new CommandData("bizflooritems", getBusinessStorageItemsCommand, "[business id]", getStaffFlagValue("None"), true, true, "Shows all business storage items (i.e. back room) to a player"), new CommandData("bizstorageitems", getBusinessStorageItemsCommand, "[business id]", getStaffFlagValue("None"), true, true, "Shows all business storage items (i.e. back room) to a player"),
new CommandData("bizentrance", moveBusinessEntranceCommand, "", getStaffFlagValue("ManageBusinesses"), true, true, "Moves the entrance (exterior point) of the business"), new CommandData("bizentrance", moveBusinessEntranceCommand, "", getStaffFlagValue("ManageBusinesses"), true, true, "Moves the entrance (exterior point) of the business"),
new CommandData("bizexit", moveBusinessExitCommand, "", getStaffFlagValue("ManageBusinesses"), true, true, "Moves the exit (interior point) of the business"), new CommandData("bizexit", moveBusinessExitCommand, "", getStaffFlagValue("ManageBusinesses"), true, true, "Moves the exit (interior point) of the business"),
new CommandData("bizinttype", setBusinessInteriorTypeCommand, "<interior template name/business id>", getStaffFlagValue("ManageBusinesses"), true, true, "Changes the business interior"), new CommandData("bizinttype", setBusinessInteriorTypeCommand, "<interior template name/business id>", getStaffFlagValue("ManageBusinesses"), true, true, "Changes the business interior"),
new CommandData("bizdefaultitems", giveDefaultItemsToBusinessCommand, "<item template>", getStaffFlagValue("ManageItems"), true, true, "Gives the business the default items based on template name"), new CommandData("bizdefaultitems", giveDefaultItemsToBusinessCommand, "<item template>", getStaffFlagValue("ManageItems"), true, true, "Gives the business the default items based on template name"),
new CommandData("bizdelflooritems", deleteBusinessFloorItemsCommand, "", getStaffFlagValue("ManageItems"), true, true, "Destroys all items on the business floor (for-sale items)"), new CommandData("bizdelflooritems", deleteBusinessFloorItemsCommand, "", getStaffFlagValue("ManageItems"), true, true, "Destroys all items on the business floor (for-sale items)"),
new CommandData("bizdelstorageitems", deleteBusinessStorageItemsCommand, "", getStaffFlagValue("ManageItems"), true, true, "Destroys all items in the business's storage"), new CommandData("bizdelstorageitems", deleteBusinessStorageItemsCommand, "", getStaffFlagValue("ManageItems"), true, true, "Destroys all items in the business's storage"),
new CommandData("bizdealership", setBusinessEntranceLabelToDealershipCommand, "", getStaffFlagValue("ManageBusinesses"), true, true, "Sets the business's door label to vehicle dealership"), new CommandData("bizdealership", setBusinessDealershipCommand, "", getStaffFlagValue("None"), true, true, "Sets the business's door label to vehicle dealership"),
//new CommandData("bizpaintball", setBusinessPaintBallCommand, "", getStaffFlagValue("None"), true, true, "Sets the business to a paintball arena"),
], ],
chat: [ chat: [
new CommandData("me", meActionCommand, "<message>", getStaffFlagValue("None"), true, false, "Shows a custom action message in chat"), new CommandData("me", meActionCommand, "<message>", getStaffFlagValue("None"), true, false, "Shows a custom action message in chat"),
@@ -149,10 +163,11 @@ function loadCommands() {
new CommandData("clanchat", clanChatCommand, "<message>", getStaffFlagValue("None"), true, false, "Sends an OOC chat message to members in your clan"), new CommandData("clanchat", clanChatCommand, "<message>", getStaffFlagValue("None"), true, false, "Sends an OOC chat message to members in your clan"),
new CommandData("clan", clanChatCommand, "<message>", getStaffFlagValue("None"), true, false, "Sends an OOC chat message to members in your clan"), new CommandData("clan", clanChatCommand, "<message>", getStaffFlagValue("None"), true, false, "Sends an OOC chat message to members in your clan"),
new CommandData("c", clanChatCommand, "<message>", getStaffFlagValue("None"), true, false, "Sends an OOC chat message to members in your clan"), new CommandData("c", clanChatCommand, "<message>", getStaffFlagValue("None"), true, false, "Sends an OOC chat message to members in your clan"),
new CommandData("adminchat", adminChatCommand, "<message>", getStaffFlagValue("BasicModeration"), true, true, "Sends an OOC chat message to other admins"),
new CommandData("a", adminChatCommand, "<message>", getStaffFlagValue("BasicModeration"), true, true, "Sends an OOC chat message to other admins"),
new CommandData("achat", adminChatCommand, "<message>", getStaffFlagValue("BasicModeration"), true, true, "Sends an OOC chat message to other admins"),
new CommandData("m", megaphoneChatCommand, "<message>", getStaffFlagValue("None"), true, true, "Shouts a message over a megaphone (portable bullhorn/loudspeaker)"), new CommandData("m", megaphoneChatCommand, "<message>", getStaffFlagValue("None"), true, true, "Shouts a message over a megaphone (portable bullhorn/loudspeaker)"),
new CommandData("pm", privateMessageCommand, "<player name/id> <message>", getStaffFlagValue("None"), true, true, "Sends a private message to a player"),
new CommandData("dm", privateMessageCommand, "<player name/id> <message>", getStaffFlagValue("None"), true, true, "Sends a private message to a player"),
new CommandData("msg", privateMessageCommand, "<player name/id> <message>", getStaffFlagValue("None"), true, true, "Sends a private message to a player"),
new CommandData("reply", replyToLastPrivateMessageCommand, "<message>", getStaffFlagValue("None"), true, true, "Replies to the last private message you received"),
], ],
clan: [ clan: [
new CommandData("clans", listClansCommand, "[search text]", getStaffFlagValue("None"), true, true, "List clans (search by partial name, if provided)"), new CommandData("clans", listClansCommand, "[search text]", getStaffFlagValue("None"), true, true, "List clans (search by partial name, if provided)"),
@@ -250,6 +265,8 @@ function loadCommands() {
email: [ email: [
new CommandData("testemail", testEmailCommand, "<email address>", getStaffFlagValue("Developer"), true, true), new CommandData("testemail", testEmailCommand, "<email address>", getStaffFlagValue("Developer"), true, true),
], ],
fishing: [],
forensics: [],
gate: [ gate: [
new CommandData("gate", triggerGateCommand, "", getStaffFlagValue("None"), true, true, "Opens/closes the nearest gate"), new CommandData("gate", triggerGateCommand, "", getStaffFlagValue("None"), true, true, "Opens/closes the nearest gate"),
new CommandData("opengate", triggerGateCommand, "", getStaffFlagValue("None"), true, true, "Opens/closes the nearest gate"), new CommandData("opengate", triggerGateCommand, "", getStaffFlagValue("None"), true, true, "Opens/closes the nearest gate"),
@@ -258,8 +275,8 @@ function loadCommands() {
new CommandData("bizgate", triggerGateCommand, "", getStaffFlagValue("None"), true, true, "Opens/closes the nearest gate"), new CommandData("bizgate", triggerGateCommand, "", getStaffFlagValue("None"), true, true, "Opens/closes the nearest gate"),
new CommandData("businessgate", triggerGateCommand, "", getStaffFlagValue("None"), true, true, "Opens/closes the nearest gate"), new CommandData("businessgate", triggerGateCommand, "", getStaffFlagValue("None"), true, true, "Opens/closes the nearest gate"),
new CommandData("door", triggerGateCommand, "", getStaffFlagValue("None"), true, true, "Opens/closes the nearest gate"), new CommandData("door", triggerGateCommand, "", getStaffFlagValue("None"), true, true, "Opens/closes the nearest gate"),
new CommandData("opengate", triggerGateCommand, "", getStaffFlagValue("None"), true, true, "Opens/closes the nearest gate"), //new CommandData("opengate", triggerGateCommand, "", getStaffFlagValue("None"), true, true, "Opens/closes the nearest gate"),
new CommandData("closegate", triggerGateCommand, "", getStaffFlagValue("None"), true, true, "Opens/closes the nearest gate"), //new CommandData("closegate", triggerGateCommand, "", getStaffFlagValue("None"), true, true, "Opens/closes the nearest gate"),
new CommandData("opendoor", triggerGateCommand, "", getStaffFlagValue("None"), true, true, "Opens/closes the nearest gate"), new CommandData("opendoor", triggerGateCommand, "", getStaffFlagValue("None"), true, true, "Opens/closes the nearest gate"),
new CommandData("closedoor", triggerGateCommand, "", getStaffFlagValue("None"), true, true, "Opens/closes the nearest gate"), new CommandData("closedoor", triggerGateCommand, "", getStaffFlagValue("None"), true, true, "Opens/closes the nearest gate"),
new CommandData("garagedoor", triggerGateCommand, "", getStaffFlagValue("None"), true, true, "Opens/closes the nearest gate"), new CommandData("garagedoor", triggerGateCommand, "", getStaffFlagValue("None"), true, true, "Opens/closes the nearest gate"),
@@ -302,6 +319,7 @@ function loadCommands() {
new CommandData("houseexit", moveHouseExitCommand, "", getStaffFlagValue("ManageHouses"), true, true, "Moves a house's exit (inside/interior location to exit the house)"), new CommandData("houseexit", moveHouseExitCommand, "", getStaffFlagValue("ManageHouses"), true, true, "Moves a house's exit (inside/interior location to exit the house)"),
new CommandData("houseinttype", setHouseInteriorTypeCommand, "<interior template name/business id>", getStaffFlagValue("ManageHouses"), true, true, "Sets a house's interior to a pre-defined type"), new CommandData("houseinttype", setHouseInteriorTypeCommand, "<interior template name/business id>", getStaffFlagValue("ManageHouses"), true, true, "Sets a house's interior to a pre-defined type"),
], ],
insurance: [],
item: [ item: [
new CommandData("i", playerSwitchHotBarSlotCommand, "<slot id>", getStaffFlagValue("None"), true, false, "Switches to the item in the specified slot of your inventory."), new CommandData("i", playerSwitchHotBarSlotCommand, "<slot id>", getStaffFlagValue("None"), true, false, "Switches to the item in the specified slot of your inventory."),
new CommandData("item", playerSwitchHotBarSlotCommand, "<slot id>", getStaffFlagValue("None"), true, false, "Switches to the item in the specified slot of your inventory."), new CommandData("item", playerSwitchHotBarSlotCommand, "<slot id>", getStaffFlagValue("None"), true, false, "Switches to the item in the specified slot of your inventory."),
@@ -334,9 +352,18 @@ function loadCommands() {
new CommandData("additemtype", createItemTypeCommand, "<name>", getStaffFlagValue("ManageItems"), true, false, "Adds a new item type"), new CommandData("additemtype", createItemTypeCommand, "<name>", getStaffFlagValue("ManageItems"), true, false, "Adds a new item type"),
new CommandData("itemtypeusetype", setItemTypeUseTypeCommand, "<item type> <use type>", getStaffFlagValue("ManageItems"), true, false, "Sets an item type's use-type (what kind of action is performed when using it)"), new CommandData("itemtypeusetype", setItemTypeUseTypeCommand, "<item type> <use type>", getStaffFlagValue("ManageItems"), true, false, "Sets an item type's use-type (what kind of action is performed when using it)"),
new CommandData("itemtypeuseval", setItemTypeUseValueCommand, "<item type> <use value>", getStaffFlagValue("ManageItems"), true, false, "Sets an item type's use-value (how much gets subtracted when using it)"), new CommandData("itemtypeuseval", setItemTypeUseValueCommand, "<item type> <use value>", getStaffFlagValue("ManageItems"), true, false, "Sets an item type's use-value (how much gets subtracted when using it)"),
new CommandData("itemtypeorderprice", setItemTypeOrderPriceCommand, "<item type> <price>", getStaffFlagValue("ManageItems"), true, false, "Sets an item type's order price (base price when ordering for a business"), new CommandData("itemtypeorderprice", setItemTypeOrderPriceCommand, "<item type> <order price>", getStaffFlagValue("ManageItems"), true, false, "Sets an item type's order price (base price when ordering for a business"),
new CommandData("itemtyperiskmult", setItemTypeRiskMultiplierCommand, "<item type> <risk multiplier>", getStaffFlagValue("ManageItems"), true, false, "Sets an item type's risk multiplayer (higher value for more dangerous or rare illegal items)"), new CommandData("itemtyperiskmult", setItemTypeRiskMultiplierCommand, "<item type> <risk multiplier>", getStaffFlagValue("ManageItems"), true, false, "Sets an item type's risk multiplayer (higher value for more dangerous or rare illegal items)"),
new CommandData("itemtypeenabled", toggleItemTypeEnabledCommand, "<item type>", getStaffFlagValue("ManageItems"), true, false, "Toggles an item type on or off (if off, any items with that type can't be interacted with)"), new CommandData("itemtypeenabled", toggleItemTypeEnabledCommand, "<item type>", getStaffFlagValue("ManageItems"), true, false, "Toggles an item type on or off (if off, any items with that type can't be interacted with)"),
new CommandData("itemtypedropmodel", setItemTypeDropModelCommand, "<item type> <object name/id>", getStaffFlagValue("ManageItems"), true, false, "Sets the drop model for the object of an item type when dropped"),
new CommandData("itemtypedroppos", setItemTypeDropPositionCommand, "<item type> [x] [y] [z]", getStaffFlagValue("ManageItems"), true, false, "Sets the offset position for the object of an item type when dropped"),
new CommandData("itemtypedroprot", setItemTypeDropRotationCommand, "<item type> [x] [y] [z]", getStaffFlagValue("ManageItems"), true, false, "Sets the rotation for the object of an item type when dropped"),
new CommandData("itemtypedropscale", setItemTypeDropScaleCommand, "<item type> [x] [y] [z]", getStaffFlagValue("ManageItems"), true, false, "Sets the scale for the object of an item type when dropped"),
new CommandData("itemtypedropfrontdistance", setItemTypeDropFrontDistanceCommand, "<item type> <distance>", getStaffFlagValue("ManageItems"), true, false, "Sets how far in front of a player an item type will be dropped"),
new CommandData("itemtypemaxval", setItemTypeMaxValueCommand, "<item type> <max value>", getStaffFlagValue("ManageItems"), true, false, "Sets the maximum value an item type can have"),
new CommandData("itemtypeorderval", setItemTypeOrderValueCommand, "<item type> <order value>", getStaffFlagValue("ManageItems"), true, false, "Sets the initial value of an item type when ordered by a business"),
new CommandData("itemtypesize", setItemTypeSizeCommand, "<item type> <order value>", getStaffFlagValue("ManageItems"), true, false, "Sets the item type's size"),
new CommandData("itemtypecapacity", setItemTypeCapacityCommand, "<item type> <order value>", getStaffFlagValue("ManageItems"), true, false, "Sets an item type's capacity (how much it can hold)"),
new CommandData("delplritem", deleteItemInPlayerInventoryCommand, "<player name/id> <item slot>", getStaffFlagValue("ManageItems"), true, false, "Removes an item by slot from a player's personal inventory"), new CommandData("delplritem", deleteItemInPlayerInventoryCommand, "<player name/id> <item slot>", getStaffFlagValue("ManageItems"), true, false, "Removes an item by slot from a player's personal inventory"),
new CommandData("delplritems", deleteAllItemsInPlayerInventoryCommand, "<player name/id>", getStaffFlagValue("ManageItems"), true, false, "Removes all items from a player's personal inventory"), new CommandData("delplritems", deleteAllItemsInPlayerInventoryCommand, "<player name/id>", getStaffFlagValue("ManageItems"), true, false, "Removes all items from a player's personal inventory"),
@@ -390,11 +417,14 @@ function loadCommands() {
new CommandData("jobroutepay", setJobRoutePayCommand, "<amount>", getStaffFlagValue("ManageJobs"), true, false), new CommandData("jobroutepay", setJobRoutePayCommand, "<amount>", getStaffFlagValue("ManageJobs"), true, false),
new CommandData("jobroutestartmsg", setJobRouteStartMessageCommand, "<new message>", getStaffFlagValue("ManageJobs"), true, false), new CommandData("jobroutestartmsg", setJobRouteStartMessageCommand, "<new message>", getStaffFlagValue("ManageJobs"), true, false),
new CommandData("jobroutefinishmsg", setJobRouteFinishMessageCommand, "<new message>", getStaffFlagValue("ManageJobs"), true, false), new CommandData("jobroutefinishmsg", setJobRouteFinishMessageCommand, "<new message>", getStaffFlagValue("ManageJobs"), true, false),
new CommandData("jobroutelocarrivemsg", setJobRouteLocationArriveMessageCommand, "<new message>", getStaffFlagValue("ManageJobs"), true, false), new CommandData("jobroutearrivemsg", setJobRouteDefaultLocationArriveMessageCommand, "<new message>", getStaffFlagValue("ManageJobs"), true, false),
new CommandData("jobroutelocnextmsg", setJobRouteLocationNextMessageCommand, "<new message>", getStaffFlagValue("ManageJobs"), true, false), new CommandData("jobroutenextmsg", setJobRouteDefaultLocationNextMessageCommand, "<new message>", getStaffFlagValue("ManageJobs"), true, false),
new CommandData("jobroutelocarrivemsg", setJobRouteNextLocationArriveMessageCommand, "<new message>", getStaffFlagValue("ManageJobs"), true, false),
new CommandData("jobroutelocnextmsg", setJobRouteNextLocationGotoMessageCommand, "<new message>", getStaffFlagValue("ManageJobs"), true, false),
new CommandData("jobrouteenabled", toggleJobRouteEnabledCommand, "", getStaffFlagValue("ManageJobs"), true, false), new CommandData("jobrouteenabled", toggleJobRouteEnabledCommand, "", getStaffFlagValue("ManageJobs"), true, false),
new CommandData("jobroutevehcolours", setJobRouteVehicleColoursCommand, "<colour 1> <colour 2>", getStaffFlagValue("ManageJobs"), true, false), new CommandData("jobroutevehcolours", setJobRouteVehicleColoursCommand, "<colour 1> <colour 2>", getStaffFlagValue("ManageJobs"), true, false),
new CommandData("jobroutedelays", setJobRouteAllLocationDelaysCommand, "<time in milliseconds>", getStaffFlagValue("ManageJobs"), true, false), new CommandData("jobroutedelays", setJobRouteAllLocationDelaysCommand, "<time in milliseconds>", getStaffFlagValue("ManageJobs"), true, false),
new CommandData("jobroutelocdelay", setJobRouteNextLocationDelayCommand, "<time in milliseconds>", getStaffFlagValue("ManageJobs"), true, false),
new CommandData("jobcolour", setJobColourCommand, "<job id/name> <red> <green> <blue>", getStaffFlagValue("ManageJobs"), true, false), new CommandData("jobcolour", setJobColourCommand, "<job id/name> <red> <green> <blue>", getStaffFlagValue("ManageJobs"), true, false),
new CommandData("jobblip", setJobBlipCommand, "<job id/name> <blip id/name>", getStaffFlagValue("ManageJobs"), true, false), new CommandData("jobblip", setJobBlipCommand, "<job id/name> <blip id/name>", getStaffFlagValue("ManageJobs"), true, false),
new CommandData("jobpickup", setJobPickupCommand, "<job id/name> <pickup id/name>", getStaffFlagValue("ManageJobs"), true, false), new CommandData("jobpickup", setJobPickupCommand, "<job id/name> <pickup id/name>", getStaffFlagValue("ManageJobs"), true, false),
@@ -432,6 +462,7 @@ function loadCommands() {
new CommandData("idea", submitIdeaCommand, "<message>", getStaffFlagValue("None"), true, true, "Sends an suggestion/idea to the developers"), new CommandData("idea", submitIdeaCommand, "<message>", getStaffFlagValue("None"), true, true, "Sends an suggestion/idea to the developers"),
new CommandData("bug", submitBugReportCommand, "<message>", getStaffFlagValue("None"), true, true, "Submits a bug report"), new CommandData("bug", submitBugReportCommand, "<message>", getStaffFlagValue("None"), true, true, "Submits a bug report"),
new CommandData("enter", enterExitPropertyCommand, "", getStaffFlagValue("None"), true, true, "Enters or exists a house/business"), new CommandData("enter", enterExitPropertyCommand, "", getStaffFlagValue("None"), true, true, "Enters or exists a house/business"),
new CommandData("exit", enterExitPropertyCommand, "", getStaffFlagValue("None"), true, true, "Enters or exists a house/business"),
new CommandData("cursor", toggleMouseCursorCommand, "", getStaffFlagValue("None"), true, false, "Toggles cursor visibility"), new CommandData("cursor", toggleMouseCursorCommand, "", getStaffFlagValue("None"), true, false, "Toggles cursor visibility"),
new CommandData("mousecam", toggleMouseCameraCommand, "", getStaffFlagValue("None"), true, false, "Toggles vehicle mouse camera for games that don't have it"), new CommandData("mousecam", toggleMouseCameraCommand, "", getStaffFlagValue("None"), true, false, "Toggles vehicle mouse camera for games that don't have it"),
new CommandData("yes", playerPromptAnswerYesCommand, "", getStaffFlagValue("None"), true, false, "Answers a prompt with YES"), new CommandData("yes", playerPromptAnswerYesCommand, "", getStaffFlagValue("None"), true, false, "Answers a prompt with YES"),
@@ -441,7 +472,13 @@ function loadCommands() {
new CommandData("gps", gpsCommand, "[item or place name]", getStaffFlagValue("None"), true, false, "Shows you locations for special places or where to buy items"), new CommandData("gps", gpsCommand, "[item or place name]", getStaffFlagValue("None"), true, false, "Shows you locations for special places or where to buy items"),
new CommandData("speak", playerPedSpeakCommand, "<speech name>", getStaffFlagValue("None"), true, false, "Makes your ped say something in their game voice (IV only)"), new CommandData("speak", playerPedSpeakCommand, "<speech name>", getStaffFlagValue("None"), true, false, "Makes your ped say something in their game voice (IV only)"),
new CommandData("lock", lockCommand, "", getStaffFlagValue("None"), true, false, "Locks and unlocks your vehicle, house, or business"), new CommandData("lock", lockCommand, "", getStaffFlagValue("None"), true, false, "Locks and unlocks your vehicle, house, or business"),
new CommandData("locks", lockCommand, "", getStaffFlagValue("None"), true, false, "Locks and unlocks your vehicle, house, or business"),
new CommandData("doorlock", lockCommand, "", getStaffFlagValue("None"), true, false, "Locks and unlocks your vehicle, house, or business"),
new CommandData("lockdoor", lockCommand, "", getStaffFlagValue("None"), true, false, "Locks and unlocks your vehicle, house, or business"),
new CommandData("lights", lightsCommand, "", getStaffFlagValue("None"), true, false, "Turns on and off the lights for your vehicle, house, or business"), new CommandData("lights", lightsCommand, "", getStaffFlagValue("None"), true, false, "Turns on and off the lights for your vehicle, house, or business"),
new CommandData("light", lightsCommand, "", getStaffFlagValue("None"), true, false, "Turns on and off the lights for your vehicle, house, or business"),
new CommandData("kill", suicideCommand, "", getStaffFlagValue("None"), true, false, "Kills yourself"),
new CommandData("suicide", suicideCommand, "", getStaffFlagValue("None"), true, false, "Kills yourself"),
], ],
npc: [ npc: [
new CommandData("addnpc", createNPCCommand, "<skin id/name>", getStaffFlagValue("ManageNPCs"), true, false, "Creates an NPC with the specified skin"), new CommandData("addnpc", createNPCCommand, "<skin id/name>", getStaffFlagValue("ManageNPCs"), true, false, "Creates an NPC with the specified skin"),
@@ -453,6 +490,7 @@ function loadCommands() {
//new CommandData("npcrespawnall", respawnAllNPCsCommand, "", getStaffFlagValue("ManageNPCs"), true, false, "Respawns all NPCs"), //new CommandData("npcrespawnall", respawnAllNPCsCommand, "", getStaffFlagValue("ManageNPCs"), true, false, "Respawns all NPCs"),
//new CommandData("npcrespawn", respawnNPCCommand, "", getStaffFlagValue("ManageNPCs"), true, false, "Respawns the nearest NPC"), //new CommandData("npcrespawn", respawnNPCCommand, "", getStaffFlagValue("ManageNPCs"), true, false, "Respawns the nearest NPC"),
], ],
paintball: [],
race: [ race: [
// Unfinished! // Unfinished!
//new CommandData("addrace", createRaceCommand, "<name>", getStaffFlagValue("ManageRaces"), true, false, "Creates a race"), //new CommandData("addrace", createRaceCommand, "<name>", getStaffFlagValue("ManageRaces"), true, false, "Creates a race"),
@@ -462,18 +500,25 @@ function loadCommands() {
//new CommandData("delracestart", deleteRaceStartPositionCommand, "", getStaffFlagValue("ManageRaces"), true, false, "Deletes the closest starting position for a race"), //new CommandData("delracestart", deleteRaceStartPositionCommand, "", getStaffFlagValue("ManageRaces"), true, false, "Deletes the closest starting position for a race"),
//new CommandData("delracecp", deleteRaceCheckPointCommand, "", getStaffFlagValue("ManageRaces"), true, false, "Deletes the closest race checkpoint"), //new CommandData("delracecp", deleteRaceCheckPointCommand, "", getStaffFlagValue("ManageRaces"), true, false, "Deletes the closest race checkpoint"),
//new CommandData("racename", setRaceNameCommand, "<name>", getStaffFlagValue("ManageRaces"), true, false, "Sets a race's name"), //new CommandData("racename", setRaceNameCommand, "<name>", getStaffFlagValue("ManageRaces"), true, false, "Sets a race's name"),
//new CommandData("racestart", startRaceCommand, "", getStaffFlagValue("None"), true, false, "Starts a race"),
//new CommandData("startrace", startRaceCommand, "", getStaffFlagValue("None"), true, false, "Starts a race"), //new CommandData("startrace", startRaceCommand, "", getStaffFlagValue("None"), true, false, "Starts a race"),
//new CommandData("racestop", stopRaceCommand, "", getStaffFlagValue("None"), true, false, "Stops racing (forfeits if in an active race)"),
//new CommandData("stoprace", stopRaceCommand, "", getStaffFlagValue("None"), true, false, "Stops racing (forfeits if in an active race)"), //new CommandData("stoprace", stopRaceCommand, "", getStaffFlagValue("None"), true, false, "Stops racing (forfeits if in an active race)"),
//new CommandData("stopAllRacesCommand", stopAllRacesCommand, "", getStaffFlagValue("ManageRaces"), true, false, "Stops a race"), //new CommandData("racestopall", stopAllRacesCommand, "", getStaffFlagValue("ManageRaces"), true, false, "Stops all active races"),
//new CommandData("stopallraces", stopAllRacesCommand, "", getStaffFlagValue("ManageRaces"), true, false, "Stops all active races"),
], ],
radio: [ radio: [
new CommandData("radiostation", playStreamingRadioCommand, "<radio station id>", getStaffFlagValue("None"), true, false, "Plays a radio station in your vehicle, house, or business (depending on which one you're in)"), new CommandData("radiostation", playStreamingRadioCommand, "<radio station id>", getStaffFlagValue("None"), true, false, "Plays a radio station in your vehicle, house, or business (depending on which one you're in)"),
new CommandData("radiostations", showRadioStationListCommand, "", getStaffFlagValue("None"), true, false, "Shows a list of all available radio stations"), new CommandData("radiostations", showRadioStationListCommand, "", getStaffFlagValue("None"), true, false, "Shows a list of all available radio stations"),
new CommandData("radiovolume", setStreamingRadioVolumeCommand, "<volume level>", getStaffFlagValue("None"), true, false, "Sets the radio streaming volume (for your game only)."), new CommandData("radiovolume", setStreamingRadioVolumeCommand, "<volume level 0-100>", getStaffFlagValue("None"), true, false, "Sets the radio streaming volume (for your game only)."),
new CommandData("radiovol", setStreamingRadioVolumeCommand, "<volume level 0-100>", getStaffFlagValue("None"), true, false, "Sets the radio streaming volume (for your game only)."),
new CommandData("radioreloadall", reloadAllRadioStationsCommand, "", getStaffFlagValue("ManageServer"), true, false, "Reloads all radio stations from database (use after making changes)"), new CommandData("radioreloadall", reloadAllRadioStationsCommand, "", getStaffFlagValue("ManageServer"), true, false, "Reloads all radio stations from database (use after making changes)"),
], ],
security: [], security: [],
staff: [ staff: [
new CommandData("adminchat", adminChatCommand, "<message>", getStaffFlagValue("BasicModeration"), true, true, "Sends an OOC chat message to other admins"),
new CommandData("a", adminChatCommand, "<message>", getStaffFlagValue("BasicModeration"), true, true, "Sends an OOC chat message to other admins"),
new CommandData("achat", adminChatCommand, "<message>", getStaffFlagValue("BasicModeration"), true, true, "Sends an OOC chat message to other admins"),
new CommandData("kick", kickClientCommand, "<player name/id> [reason]", getStaffFlagValue("BasicModeration"), true, true, "Kicks a player from the server"), new CommandData("kick", kickClientCommand, "<player name/id> [reason]", getStaffFlagValue("BasicModeration"), true, true, "Kicks a player from the server"),
new CommandData("mute", muteClientCommand, "<player name/id> [reason]", getStaffFlagValue("BasicModeration"), true, true, "Mutes a player, preventing them from using any chat."), new CommandData("mute", muteClientCommand, "<player name/id> [reason]", getStaffFlagValue("BasicModeration"), true, true, "Mutes a player, preventing them from using any chat."),
new CommandData("freeze", freezeClientCommand, "<player name/id> [reason]", getStaffFlagValue("BasicModeration"), true, true, "Freeze a player, preventing them from moving."), new CommandData("freeze", freezeClientCommand, "<player name/id> [reason]", getStaffFlagValue("BasicModeration"), true, true, "Freeze a player, preventing them from moving."),
@@ -503,18 +548,25 @@ function loadCommands() {
new CommandData("int", playerInteriorCommand, "<player name/id> [interior id]", getStaffFlagValue("BasicModeration"), true, true, "Gets or sets a player's game interior."), new CommandData("int", playerInteriorCommand, "<player name/id> [interior id]", getStaffFlagValue("BasicModeration"), true, true, "Gets or sets a player's game interior."),
new CommandData("vw", playerVirtualWorldCommand, "<player name/id> [virtual world id]", getStaffFlagValue("BasicModeration"), true, true, "Gets or sets a player's virtual world/dimension."), new CommandData("vw", playerVirtualWorldCommand, "<player name/id> [virtual world id]", getStaffFlagValue("BasicModeration"), true, true, "Gets or sets a player's virtual world/dimension."),
new CommandData("addplrstaffflag", addPlayerStaffFlagCommand, "<player name/id> <flag name>", getStaffFlagValue("ManageAdmins"), true, true, "Gives a player a staff flag by name (this server only)."), new CommandData("addplrstaffflag", addPlayerStaffFlagCommand, "<player name/id> <flag name>", getStaffFlagValue("ManageAdmins"), true, true, "Gives a player a staff flag by name (this server only)."),
new CommandData("addplayerstaffflag", addPlayerStaffFlagCommand, "<player name/id> <flag name>", getStaffFlagValue("ManageAdmins"), true, true, "Gives a player a staff flag by name (this server only)."),
new CommandData("addstaffflag", addPlayerStaffFlagCommand, "<player name/id> <flag name>", getStaffFlagValue("ManageAdmins"), true, true, "Gives a player a staff flag by name (this server only)."),
new CommandData("delplrstaffflag", removePlayerStaffFlagCommand, "<player name/id> <flag name>", getStaffFlagValue("ManageAdmins"), true, true, "Takes a player's staff flag by name (this server only)."), new CommandData("delplrstaffflag", removePlayerStaffFlagCommand, "<player name/id> <flag name>", getStaffFlagValue("ManageAdmins"), true, true, "Takes a player's staff flag by name (this server only)."),
new CommandData("plrstaffflags", getPlayerStaffFlagsCommand, "<player name/id>", getStaffFlagValue("ManageAdmins"), true, true, "Shows a list of all staff flags a player has (this server only)."), new CommandData("delstaffflag", removePlayerStaffFlagCommand, "<player name/id> <flag name>", getStaffFlagValue("ManageAdmins"), true, true, "Takes a player's staff flag by name (this server only)."),
new CommandData("clearstaffflags", removePlayerStaffFlagsCommand, "<player name/id>", getStaffFlagValue("ManageAdmins"), true, true, "Removes all staff flags for a player (this server only)."), new CommandData("getplrstaffflags", getPlayerStaffFlagsCommand, "<player name/id>", getStaffFlagValue("ManageAdmins"), true, true, "Shows a list of all staff flags a player has (this server only)."),
new CommandData("delplrstaffflags", removePlayerStaffFlagsCommand, "<player name/id>", getStaffFlagValue("ManageAdmins"), true, true, "Removes all staff flags for a player (this server only)."),
new CommandData("delstaffflags", removePlayerStaffFlagsCommand, "<player name/id>", getStaffFlagValue("ManageAdmins"), true, true, "Removes all staff flags for a player (this server only)."),
new CommandData("allstaffflags", getStaffFlagsCommand, "", getStaffFlagValue("ManageAdmins"), true, true, "Shows a list of all valid staff flag names."), new CommandData("allstaffflags", getStaffFlagsCommand, "", getStaffFlagValue("ManageAdmins"), true, true, "Shows a list of all valid staff flag names."),
new CommandData("staffflags", getStaffFlagsCommand, "", getStaffFlagValue("ManageAdmins"), true, true, "Shows a list of all valid staff flag names."),
new CommandData("plrstafftitle", setPlayerStaffTitleCommand, "", getStaffFlagValue("ManageAdmins"), true, true, "Sets a player's staff title."), new CommandData("plrstafftitle", setPlayerStaffTitleCommand, "", getStaffFlagValue("ManageAdmins"), true, true, "Sets a player's staff title."),
new CommandData("playerstafftitle", setPlayerStaffTitleCommand, "", getStaffFlagValue("ManageAdmins"), true, true, "Sets a player's staff title."),
new CommandData("stafftitle", setPlayerStaffTitleCommand, "", getStaffFlagValue("ManageAdmins"), true, true, "Sets a player's staff title."),
new CommandData("givemoney", givePlayerMoneyCommand, "<player name/id> <amount>", getStaffFlagValue("serverManager"), true, true), new CommandData("givemoney", givePlayerMoneyCommand, "<player name/id> <amount>", getStaffFlagValue("serverManager"), true, true),
new CommandData("nonrpname", forceCharacterNameChangeCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Forces a player to change their current character's name."), new CommandData("nonrpname", forceCharacterNameChangeCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Forces a player to change their current character's name."),
new CommandData("setname", setCharacterNameCommand, "<player name/id> <first name> <last name>", getStaffFlagValue("BasicModeration"), true, true, "Changes a character's name directly."), new CommandData("setname", forceCharacterNameCommand, "<player name/id> <first name> <last name>", getStaffFlagValue("BasicModeration"), true, true, "Changes a character's name directly."),
new CommandData("setskin", setPlayerSkinCommand, "<player name/id> <skin id/name>", getStaffFlagValue("BasicModeration"), true, true, "Changes a character's skin."), new CommandData("setskin", forcePlayerSkinCommand, "<player name/id> <skin id/name>", getStaffFlagValue("BasicModeration"), true, true, "Changes a character's skin."),
new CommandData("setaccent", setPlayerAccentCommand, "<player name/id> <accent name>", getStaffFlagValue("BasicModeration"), true, true, "Changes a character's accent."), new CommandData("setaccent", forcePlayerAccentCommand, "<player name/id> <accent name>", getStaffFlagValue("BasicModeration"), true, true, "Changes a character's accent."),
//new CommandData("setfightstyle", setPlayerFightStyleCommand, "<player name/id> <fight style name>", getStaffFlagValue("BasicModeration"), true, true, "Changes a character's fight style."), new CommandData("setfightstyle", forcePlayerFightStyleCommand, "<player name/id> <fight style name>", getStaffFlagValue("BasicModeration"), true, true, "Changes a character's fight style."),
new CommandData("setstars", setPlayerWantedLevelCommand, "<player name/id> <wanted level>", getStaffFlagValue("BasicModeration"), true, true, "Forces a player to have a wanted level"), new CommandData("setstars", forcePlayerWantedLevelCommand, "<player name/id> <wanted level>", getStaffFlagValue("BasicModeration"), true, true, "Forces a player to have a wanted level"),
new CommandData("plrinfo", getPlayerInfoCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Shows basic info about the specified player"), new CommandData("plrinfo", getPlayerInfoCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Shows basic info about the specified player"),
new CommandData("playerinfo", getPlayerInfoCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Shows basic info about the specified player"), new CommandData("playerinfo", getPlayerInfoCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Shows basic info about the specified player"),
new CommandData("getplrhouses", getHousesOwnedByPlayerCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Shows a list of all houses owned by the player"), new CommandData("getplrhouses", getHousesOwnedByPlayerCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Shows a list of all houses owned by the player"),
@@ -529,13 +581,21 @@ function loadCommands() {
new CommandData("getplayervehicles", getVehiclesOwnedByPlayerCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Shows a list of all vehicles owned by the player"), new CommandData("getplayervehicles", getVehiclesOwnedByPlayerCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Shows a list of all vehicles owned by the player"),
new CommandData("geoip", getPlayerGeoIPInformationCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Retrieves GeoIP information on a player (country & city)"), new CommandData("geoip", getPlayerGeoIPInformationCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Retrieves GeoIP information on a player (country & city)"),
new CommandData("ip", getPlayerIPInformationCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Retrieves IP information on a player"), new CommandData("ip", getPlayerIPInformationCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Retrieves IP information on a player"),
new CommandData("getgeoip", getPlayerGeoIPInformationCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Retrieves GeoIP information on a player (country & city)"),
new CommandData("getip", getPlayerIPInformationCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Retrieves IP information on a player"),
new CommandData("plrsync", toggleSyncForElementsSpawnedByPlayerCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Sets whether elements spawned by a player are synced (traffic, peds, etc)"), new CommandData("plrsync", toggleSyncForElementsSpawnedByPlayerCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Sets whether elements spawned by a player are synced (traffic, peds, etc)"),
new CommandData("health", setPlayerHealthCommand, "<player name/id> <health", getStaffFlagValue("BasicModeration"), true, true, "Sets a player's health"), new CommandData("health", forcePlayerHealthCommand, "<player name/id> <health", getStaffFlagValue("BasicModeration"), true, true, "Sets a player's health"),
new CommandData("armour", setPlayerArmourCommand, "<player name/id> <armour>", getStaffFlagValue("BasicModeration"), true, true, "Sets a player's armour"), new CommandData("armour", forcePlayerArmourCommand, "<player name/id> <armour>", getStaffFlagValue("BasicModeration"), true, true, "Sets a player's armour"),
new CommandData("sethealth", forcePlayerHealthCommand, "<player name/id> <health", getStaffFlagValue("BasicModeration"), true, true, "Sets a player's health"),
new CommandData("setarmour", forcePlayerArmourCommand, "<player name/id> <armour>", getStaffFlagValue("BasicModeration"), true, true, "Sets a player's armour"),
new CommandData("infiniterun", setPlayerInfiniteRunCommand, "<player name/id> <state>", getStaffFlagValue("BasicModeration"), true, true, "Toggles a player's infinite sprint"), new CommandData("infiniterun", setPlayerInfiniteRunCommand, "<player name/id> <state>", getStaffFlagValue("BasicModeration"), true, true, "Toggles a player's infinite sprint"),
new CommandData("atbiz", getPlayerCurrentBusinessCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Gets which business a player is at/in"), new CommandData("atbiz", getPlayerCurrentBusinessCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Gets which business a player is at/in"),
new CommandData("atbusiness", getPlayerCurrentBusinessCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Gets which business a player is at/in"), new CommandData("atbusiness", getPlayerCurrentBusinessCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Gets which business a player is at/in"),
new CommandData("athouse", getPlayerCurrentHouseCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Gets which house a player is at/in"), new CommandData("athouse", getPlayerCurrentHouseCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Gets which house a player is at/in"),
new CommandData("biz", getPlayerCurrentBusinessCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Gets which business a player is at/in"),
new CommandData("business", getPlayerCurrentBusinessCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Gets which business a player is at/in"),
new CommandData("house", getPlayerCurrentHouseCommand, "<player name/id>", getStaffFlagValue("BasicModeration"), true, true, "Gets which house a player is at/in"),
//new CommandData("clearchat", clearChatCommand, "", getStaffFlagValue("None"), true, true, "Clears the chat"),
], ],
startup: [], startup: [],
subAccount: [ subAccount: [
@@ -578,7 +638,7 @@ function loadCommands() {
new CommandData("vehowner", setVehicleOwnerCommand, "<player id/name>", getStaffFlagValue("ManageVehicles"), true, true), new CommandData("vehowner", setVehicleOwnerCommand, "<player id/name>", getStaffFlagValue("ManageVehicles"), true, true),
new CommandData("vehpublic", setVehiclePublicCommand, "", getStaffFlagValue("ManageVehicles"), true, true), new CommandData("vehpublic", setVehiclePublicCommand, "", getStaffFlagValue("ManageVehicles"), true, true),
new CommandData("vehclan", setVehicleClanCommand, "<clan id/name>", getStaffFlagValue(""), true, true), new CommandData("vehclan", setVehicleClanCommand, "<clan id/name>", getStaffFlagValue(""), true, true),
new CommandData("vehbiz", setVehicleToBusinessCommand, "", getStaffFlagValue(""), true, true), new CommandData("vehbiz", setVehicleBusinessCommand, "", getStaffFlagValue(""), true, true),
new CommandData("vehjob", setVehicleJobCommand, "[job id/name]", getStaffFlagValue("ManageVehicles"), true, true), new CommandData("vehjob", setVehicleJobCommand, "[job id/name]", getStaffFlagValue("ManageVehicles"), true, true),
new CommandData("vehdelowner", removeVehicleOwnerCommand, "", getStaffFlagValue("ManageVehicles"), true, true), new CommandData("vehdelowner", removeVehicleOwnerCommand, "", getStaffFlagValue("ManageVehicles"), true, true),
new CommandData("vehrank", setVehicleRankCommand, "<rank id/name>", getStaffFlagValue("None"), true, true), new CommandData("vehrank", setVehicleRankCommand, "<rank id/name>", getStaffFlagValue("None"), true, true),
@@ -634,7 +694,6 @@ function loadCommands() {
new CommandData("vehiclerepair", vehicleAdminRepairCommand, "", getStaffFlagValue("None"), true, true, "Repairs your vehicle"), new CommandData("vehiclerepair", vehicleAdminRepairCommand, "", getStaffFlagValue("None"), true, true, "Repairs your vehicle"),
new CommandData("repairveh", vehicleAdminRepairCommand, "", getStaffFlagValue("None"), true, true, "Repairs your vehicle"), new CommandData("repairveh", vehicleAdminRepairCommand, "", getStaffFlagValue("None"), true, true, "Repairs your vehicle"),
new CommandData("repairvehicle", vehicleAdminRepairCommand, "", getStaffFlagValue("None"), true, true, "Repairs your vehicle"), new CommandData("repairvehicle", vehicleAdminRepairCommand, "", getStaffFlagValue("None"), true, true, "Repairs your vehicle"),
new CommandData("passenger", enterVehicleAsPassengerCommand, "", getStaffFlagValue("None"), true, true, "Enters a vehicle as passenger"), new CommandData("passenger", enterVehicleAsPassengerCommand, "", getStaffFlagValue("None"), true, true, "Enters a vehicle as passenger"),
], ],
}; };
@@ -649,17 +708,23 @@ function addAllCommandHandlers() {
let commands = getCommands(); let commands = getCommands();
for (let i in commands) { for (let i in commands) {
for (let j in commands[i]) { for (let j in commands[i]) {
logToConsole(LOG_DEBUG, `[VRR.Command] Adding command handler for ${i} - ${commands[i][j].command}`); logToConsole(LOG_VERBOSE, `[AGRP.Command] Adding command handler for ${i} - ${commands[i][j].command}`);
addCommandHandler(commands[i][j].command, processPlayerCommand); addCommandHandler(commands[i][j].command, processPlayerCommand);
commandCount++; commandCount++;
} }
} }
logToConsole(LOG_INFO, `[VRR.Command] ${commandCount} command handlers added!`); removeCommandHandler("help");
addCommandHandler("help", helpCommand);
logToConsole(LOG_INFO, `[AGRP.Command] ${commandCount} command handlers added!`);
} }
// =========================================================================== // ===========================================================================
/**
* @return {CommandData} command
*/
function getCommand(command) { function getCommand(command) {
let commandGroups = getCommands() let commandGroups = getCommands()
for (let i in commandGroups) { for (let i in commandGroups) {
@@ -676,6 +741,9 @@ function getCommand(command) {
// =========================================================================== // ===========================================================================
/**
* @return {CommandData} command
*/
function getCommandData(command) { function getCommandData(command) {
return getCommand(command); return getCommand(command);
} }
@@ -727,12 +795,12 @@ function disableCommand(command, params, client) {
params = toLowerCase(params); params = toLowerCase(params);
if (!getCommand(params)) { if (!getCommand(params)) {
messagePlayerError(client, `The command {ALTCOLOUR}/${params} {MAINCOLOUR} does not exist!`); messagePlayerError(client, `The command {ALTCOLOUR}/${params}{MAINCOLOUR} does not exist!`);
return false; return false;
} }
getCommand(params).enabled = false; getCommand(params).enabled = false;
messagePlayerSuccess(client, `Command {ALTCOLOUR}/${params} {MAINCOLOUR}has been disabled!`); messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} disabled the {ALTCOLOUR}${params}{MAINCOLOUR} command!`, true);
return true; return true;
} }
@@ -747,12 +815,12 @@ function enableCommand(command, params, client) {
params = toLowerCase(params); params = toLowerCase(params);
if (!getCommand(params)) { if (!getCommand(params)) {
messagePlayerError(client, `The command {ALTCOLOUR}/${params} {MAINCOLOUR} does not exist!`); messagePlayerError(client, `The command {ALTCOLOUR}/${params}{MAINCOLOUR} does not exist!`);
return false; return false;
} }
getCommand(params).enabled = true; getCommand(params).enabled = true;
messagePlayerSuccess(client, `Command {ALTCOLOUR}/${params} {MAINCOLOUR}has been enabled!`); messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} enabled the {ALTCOLOUR}${params}{MAINCOLOUR} command!`, true);
return true; return true;
} }
@@ -767,7 +835,7 @@ function disableAllCommandsByType(command, params, client) {
params = toLowerCase(params); params = toLowerCase(params);
if (isNull(getServerData().commands[params])) { if (isNull(getServerData().commands[params])) {
messagePlayerError(client, `Command type {ALTCOLOUR}${params} {MAINCOLOUR}does not exist!`); messagePlayerError(client, `Command type {ALTCOLOUR}${params}{MAINCOLOUR} does not exist!`);
return false; return false;
} }
@@ -775,7 +843,7 @@ function disableAllCommandsByType(command, params, client) {
getServerData().commands[params][i].enabled = false; getServerData().commands[params][i].enabled = false;
} }
messagePlayerSuccess(client, `{clanOrange}All {ALTCOLOUR}${params} {MAINCOLOUR}commands have been disabled!`); messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} disabled all {ALTCOLOUR}${params}{MAINCOLOUR} commands!`, true);
return true; return true;
} }
@@ -790,7 +858,7 @@ function enableAllCommandsByType(command, params, client) {
params = toLowerCase(params); params = toLowerCase(params);
if (isNull(getServerData().commands[params])) { if (isNull(getServerData().commands[params])) {
messagePlayerError(client, `Command type {ALTCOLOUR}${params} {MAINCOLOUR}does not exist!`); messagePlayerError(client, `Command type {ALTCOLOUR}${params}{MAINCOLOUR} does not exist!`);
return false; return false;
} }
@@ -798,7 +866,7 @@ function enableAllCommandsByType(command, params, client) {
getServerData().commands[params][i].enabled = true; getServerData().commands[params][i].enabled = true;
} }
messagePlayerSuccess(client, `{clanOrange}All {ALTCOLOUR}${params} {MAINCOLOUR}commands have been enabled!`); messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} enabled all {ALTCOLOUR}${params}{MAINCOLOUR} commands!`, true);
return true; return true;
} }
@@ -823,7 +891,7 @@ function processPlayerCommand(command, params, client) {
} }
if (!doesCommandExist(toLowerCase(command))) { if (!doesCommandExist(toLowerCase(command))) {
logToConsole(LOG_WARN, `[VRR.Command] ${getPlayerDisplayForConsole(client)} attempted to use command, but failed (invalid command): /${command} ${paramsDisplay}`); logToConsole(LOG_WARN, `[AGRP.Command] ${getPlayerDisplayForConsole(client)} attempted to use command, but failed (invalid command): /${command} ${paramsDisplay}`);
let possibleCommand = getCommandFromParams(command); let possibleCommand = getCommandFromParams(command);
if (possibleCommand != false && doesPlayerHaveStaffPermission(client, getCommandRequiredPermissions(toLowerCase(possibleCommand.command)))) { if (possibleCommand != false && doesPlayerHaveStaffPermission(client, getCommandRequiredPermissions(toLowerCase(possibleCommand.command)))) {
@@ -835,7 +903,7 @@ function processPlayerCommand(command, params, client) {
} }
if (!commandData.enabled) { if (!commandData.enabled) {
logToConsole(LOG_WARN, `[VRR.Command] ${getPlayerDisplayForConsole(client)} attempted to use command, but failed (command is disabled): /${command} ${paramsDisplay}`); logToConsole(LOG_WARN, `[AGRP.Command] ${getPlayerDisplayForConsole(client)} attempted to use command, but failed (command is disabled): /${command} ${paramsDisplay}`);
messagePlayerError(client, `The command {ALTCOLOUR}/${command}{MAINCOLOUR} is disabled!`); messagePlayerError(client, `The command {ALTCOLOUR}/${command}{MAINCOLOUR} is disabled!`);
messagePlayerError(client, getLocaleString(client, "CommandDisabled", `{ALTCOLOUR}/${command}{MAINCOLOUR}`)); messagePlayerError(client, getLocaleString(client, "CommandDisabled", `{ALTCOLOUR}/${command}{MAINCOLOUR}`));
return false; return false;
@@ -843,7 +911,7 @@ function processPlayerCommand(command, params, client) {
if (doesCommandRequireLogin(toLowerCase(command))) { if (doesCommandRequireLogin(toLowerCase(command))) {
if (!isPlayerLoggedIn(client)) { if (!isPlayerLoggedIn(client)) {
logToConsole(LOG_WARN, `[VRR.Command] ${getPlayerDisplayForConsole(client)} attempted to use command, but failed (requires login first): /${command} ${paramsDisplay}`); logToConsole(LOG_WARN, `[AGRP.Command] ${getPlayerDisplayForConsole(client)} attempted to use command, but failed (requires login first): /${command} ${paramsDisplay}`);
messagePlayerError(client, getLocaleString(client, "CommandRequiresLogin", `{ALTCOLOUR}/${command}{MAINCOLOUR}`)); messagePlayerError(client, getLocaleString(client, "CommandRequiresLogin", `{ALTCOLOUR}/${command}{MAINCOLOUR}`));
return false; return false;
} }
@@ -851,7 +919,7 @@ function processPlayerCommand(command, params, client) {
if (isClientFromDiscord(client)) { if (isClientFromDiscord(client)) {
if (!isCommandAllowedOnDiscord(command)) { if (!isCommandAllowedOnDiscord(command)) {
logToConsole(LOG_WARN, `[VRR.Command] ${getPlayerDisplayForConsole(client)} attempted to use command from discord, but failed (not available on discord): /${command} ${paramsDisplay}`); logToConsole(LOG_WARN, `[AGRP.Command] ${getPlayerDisplayForConsole(client)} attempted to use command from discord, but failed (not available on discord): /${command} ${paramsDisplay}`);
messagePlayerError(client, `The {ALTCOLOUR}/${command}{MAINCOLOUR} command isn't available on discord!`); messagePlayerError(client, `The {ALTCOLOUR}/${command}{MAINCOLOUR} command isn't available on discord!`);
return false; return false;
} }
@@ -859,13 +927,13 @@ function processPlayerCommand(command, params, client) {
if (!isConsole(client)) { if (!isConsole(client)) {
if (!doesPlayerHaveStaffPermission(client, getCommandRequiredPermissions(toLowerCase(command)))) { if (!doesPlayerHaveStaffPermission(client, getCommandRequiredPermissions(toLowerCase(command)))) {
logToConsole(LOG_WARN, `[VRR.Command] ${getPlayerDisplayForConsole(client)} attempted to use command, but failed (no permission): /${command} ${paramsDisplay}`); logToConsole(LOG_WARN, `[AGRP.Command] ${getPlayerDisplayForConsole(client)} attempted to use command, but failed (no permission): /${command} ${paramsDisplay}`);
messagePlayerError(client, getLocaleString(client, "CommandNoPermissions", `{ALTCOLOUR}/${toLowerCase(command)}{MAINCOLOUR}`)); messagePlayerError(client, getLocaleString(client, "CommandNoPermissions", `{ALTCOLOUR}/${toLowerCase(command)}{MAINCOLOUR}`));
return false; return false;
} }
} }
logToConsole(LOG_DEBUG, `[VRR.Command] ${getPlayerDisplayForConsole(client)} used command: /${command} ${paramsDisplay}`); logToConsole(LOG_DEBUG, `[AGRP.Command] ${getPlayerDisplayForConsole(client)} used command: /${command} ${paramsDisplay}`);
commandData.handlerFunction(toLowerCase(command), params, client); commandData.handlerFunction(toLowerCase(command), params, client);
} }
@@ -970,10 +1038,10 @@ function cacheAllCommandsAliases() {
// =========================================================================== // ===========================================================================
function getCommandAliasesNames(command) { function getCommandAliasesNames(commandData) {
let commandAliases = []; let commandAliases = [];
for (let i in command.aliases) { for (let i in commandData.aliases) {
commandAliases.push(command.aliases[i].name); commandAliases.push(commandData.aliases[i].name);
} }
return commandAliases; return commandAliases;

View File

@@ -1,6 +1,7 @@
// =========================================================================== // ===========================================================================
// Vortrex's Roleplay Resource // Asshat Gaming Roleplay
// https://github.com/VortrexFTW/gtac_roleplay // https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// =========================================================================== // ===========================================================================
// FILE: config.js // FILE: config.js
// DESC: Provides server configuration // DESC: Provides server configuration
@@ -35,6 +36,8 @@ class ServerConfigData {
this.characterSelectInterior = 0; this.characterSelectInterior = 0;
this.characterSelectDimension = 0; this.characterSelectDimension = 0;
this.name = "";
this.password = "";
this.hour = 0; this.hour = 0;
this.minute = 0 this.minute = 0
this.minuteDuration = 1000; this.minuteDuration = 1000;
@@ -49,7 +52,8 @@ class ServerConfigData {
this.showLogo = true; this.showLogo = true;
this.inflationMultiplier = 1; this.inflationMultiplier = 1;
this.testerOnly = false; this.testerOnly = false;
this.settings = 0; this.devServer = false;
this.nameTagDistance = 50.0;
this.antiCheat = { this.antiCheat = {
enabled: false, enabled: false,
@@ -78,12 +82,9 @@ class ServerConfigData {
this.realTimeZone = 0; this.realTimeZone = 0;
this.discordConfig = { this.discordConfig = {
eventChannelWebHookURL: "",
chatChannelWebHookURL: "",
adminChannelWebHookURL: "",
sendEvents: true, sendEvents: true,
sendChat: true, sendChat: true,
sendAdminEvents: true, sendAdmin: true,
}; };
if (dbAssoc) { if (dbAssoc) {
@@ -94,34 +95,54 @@ class ServerConfigData {
money: dbAssoc["svr_newchar_money"], money: dbAssoc["svr_newchar_money"],
bank: dbAssoc["svr_newchar_bank"], bank: dbAssoc["svr_newchar_bank"],
skin: dbAssoc["svr_newchar_skin"], skin: dbAssoc["svr_newchar_skin"],
}, };
this.settings = toInteger(dbAssoc["svr_settings"]);
this.connectCameraPosition = toVector3(dbAssoc["svr_connectcam_pos_x"], dbAssoc["svr_connectcam_pos_y"], dbAssoc["svr_connectcam_pos_z"]); this.connectCameraPosition = toVector3(dbAssoc["svr_connectcam_pos_x"], dbAssoc["svr_connectcam_pos_y"], dbAssoc["svr_connectcam_pos_z"]);
this.connectCameraLookAt = toVector3(dbAssoc["svr_connectcam_lookat_x"], dbAssoc["svr_connectcam_lookat_y"], dbAssoc["svr_connectcam_lookat_z"]); this.connectCameraLookAt = toVector3(dbAssoc["svr_connectcam_lookat_x"], dbAssoc["svr_connectcam_lookat_y"], dbAssoc["svr_connectcam_lookat_z"]);
this.name = toInteger(dbAssoc["svr_name"]);
this.password = toInteger(dbAssoc["svr_password"]);
this.hour = toInteger(dbAssoc["svr_start_time_hour"]); this.hour = toInteger(dbAssoc["svr_start_time_hour"]);
this.minute = toInteger(dbAssoc["svr_start_time_min"]); this.minute = toInteger(dbAssoc["svr_start_time_min"]);
this.minuteDuration = toInteger(dbAssoc["svr_time_min_duration"]); this.minuteDuration = toInteger(dbAssoc["svr_time_min_duration"]);
this.weather = toInteger(dbAssoc["svr_start_weather"]); this.weather = toInteger(dbAssoc["svr_start_weather"]);
this.fallingSnow = intToBool(toInteger(dbAssoc["svr_snow_falling"]));
this.groundSnow = intToBool(toInteger(dbAssoc["svr_snow_ground"]));
this.useGUI = intToBool(toInteger(dbAssoc["svr_gui"]));
this.showLogo = intToBool(toInteger(dbAssoc["svr_logo"]));
this.createJobPickups = intToBool(toInteger(dbAssoc["svr_job_pickups"]));
this.createBusinessPickups = intToBool(toInteger(dbAssoc["svr_biz_pickups"]));
this.createHousePickups = intToBool(toInteger(dbAssoc["svr_house_pickups"]));
this.createJobBlips = intToBool(toInteger(dbAssoc["svr_job_blips"]));
this.createBusinessBlips = intToBool(toInteger(dbAssoc["svr_biz_blips"]));
this.createHouseBlips = intToBool(toInteger(dbAssoc["svr_house_blips"]));
this.createPlayerBlips = intToBool(toInteger(dbAssoc["svr_player_blips"]));
this.guiColourPrimary = [toInteger(dbAssoc["svr_gui_col1_r"]), toInteger(dbAssoc["svr_gui_col1_g"]), toInteger(dbAssoc["svr_gui_col1_b"])]; this.guiColourPrimary = [toInteger(dbAssoc["svr_gui_col1_r"]), toInteger(dbAssoc["svr_gui_col1_g"]), toInteger(dbAssoc["svr_gui_col1_b"])];
this.guiColourSecondary = [toInteger(dbAssoc["svr_gui_col2_r"]), toInteger(dbAssoc["svr_gui_col2_g"]), toInteger(dbAssoc["svr_gui_col2_b"])]; this.guiColourSecondary = [toInteger(dbAssoc["svr_gui_col2_r"]), toInteger(dbAssoc["svr_gui_col2_g"]), toInteger(dbAssoc["svr_gui_col2_b"])];
this.guiTextColourPrimary = [toInteger(dbAssoc["svr_gui_textcol1_r"]), toInteger(dbAssoc["svr_gui_textcol1_g"]), toInteger(dbAssoc["svr_gui_textcol1_b"])]; this.guiTextColourPrimary = [toInteger(dbAssoc["svr_gui_textcol1_r"]), toInteger(dbAssoc["svr_gui_textcol1_g"]), toInteger(dbAssoc["svr_gui_textcol1_b"])];
//this.guiTextColourSecondary = [toInteger(dbAssoc["svr_gui_textcol2_r"]), toInteger(dbAssoc["svr_gui_textcol2_g"]), toInteger(dbAssoc["svr_gui_textcol2_b"])]; //this.guiTextColourSecondary = [toInteger(dbAssoc["svr_gui_textcol2_r"]), toInteger(dbAssoc["svr_gui_textcol2_g"]), toInteger(dbAssoc["svr_gui_textcol2_b"])];
this.inflationMultiplier = toFloat(dbAssoc["svr_inflation_multiplier"]); this.inflationMultiplier = toFloat(dbAssoc["svr_inflation_multiplier"]);
this.nameTagDistance = toFloat(dbAssoc["svr_nametag_distance"]);
this.discordBotToken = intToBool(dbAssoc["svr_discord_bot_token"]); this.discordBotToken = intToBool(dbAssoc["svr_discord_bot_token"]);
this.introMusicURL = dbAssoc["svr_intro_music"]; this.introMusicURL = dbAssoc["svr_intro_music"];
this.realTimeZone = dbAssoc["svr_time_realtime_timezone"];
this.discordConfig = { this.useRealTime = intToBool(toInteger(dbAssoc["svr_real_time_enabled"]));
eventChannelWebHookURL: dbAssoc["svr_discord_event_webhook"], this.realTimeZone = dbAssoc["svr_real_time_timezone"];
chatChannelWebHookURL: dbAssoc["svr_discord_chat_webhook"],
adminChannelWebHookURL: dbAssoc["svr_discord_admin_webhook"], this.discord = {
sendEvents: true, sendEvents: intToBool(dbAssoc["svr_discord_send_events"]),
sendChat: true, sendChat: intToBool(dbAssoc["svr_discord_send_chat"]),
sendAdminEvents: true, sendAdmin: intToBool(dbAssoc["svr_discord_send_admin"]),
}; };
this.economy = {
inflationMultiplier: toFloat(dbAssoc["svr_inflation_multiplier"]),
incomeTaxRate: toFloat(dbAssoc["svr_income_tax_rate"]),
passiveIncome: toFloat(dbAssoc["svr_passive_income"]),
}
this.devServer = intToBool(toInteger(server.getCVar("agrp_devserver")));
this.testerOnly = intToBool(toInteger(server.getCVar("agrp_testeronly")));
} }
} }
}; };
@@ -173,22 +194,22 @@ let globalConfig = {
subAccountNameAllowedCharacters: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", subAccountNameAllowedCharacters: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
emailValidationRegex: /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/, emailValidationRegex: /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/,
itemActionDelayExtraTimeout: 1000, itemActionDelayExtraTimeout: 1000,
geoIPCountryDatabaseFilePath: "geoip-country.mmdb", geoIPCountryDatabaseFilePath: "modules/geoip/geoip-country.mmdb",
geoIPCityDatabaseFilePath: "geoip-city.mmdb", geoIPCityDatabaseFilePath: "modules/geoip/geoip-city.mmdb",
randomTipInterval: 600000, randomTipInterval: 600000,
weaponEquippableTypes: [ weaponEquippableTypes: [
VRR_ITEM_USETYPE_WEAPON, AGRP_ITEM_USE_TYPE_WEAPON,
VRR_ITEM_USETYPE_TAZER, AGRP_ITEM_USE_TYPE_TAZER,
VRR_ITEM_USETYPE_EXTINGUISHER, AGRP_ITEM_USE_TYPE_EXTINGUISHER,
VRR_ITEM_USETYPE_SPRAYPAINT, AGRP_ITEM_USE_TYPE_SPRAYPAINT,
VRR_ITEM_USETYPE_PEPPERSPRAY, AGRP_ITEM_USE_TYPE_PEPPERSPRAY,
], ],
onFootOnlyItems: [ onFootOnlyItems: [
VRR_ITEM_USETYPE_VEHREPAIR, AGRP_ITEM_USE_TYPE_VEHREPAIR,
VRR_ITEM_USETYPE_VEHCOLOUR, AGRP_ITEM_USE_TYPE_VEHCOLOUR,
VRR_ITEM_USETYPE_VEHUPGRADE_PART, AGRP_ITEM_USE_TYPE_VEHUPGRADE_PART,
VRR_ITEM_USETYPE_VEHLIVERY, AGRP_ITEM_USE_TYPE_VEHLIVERY,
VRR_ITEM_USETYPE_VEHTIRE, AGRP_ITEM_USE_TYPE_VEHTIRE,
], ],
vehicleInactiveRespawnDelay: 1800000, // 20 minutes vehicleInactiveRespawnDelay: 1800000, // 20 minutes
chatSectionHeaderLength: 96, chatSectionHeaderLength: 96,
@@ -206,6 +227,8 @@ let globalConfig = {
houseBlipStreamOutDistance: 120, houseBlipStreamOutDistance: 120,
jobBlipStreamInDistance: -1, jobBlipStreamInDistance: -1,
jobBlipStreamOutDistance: -1, jobBlipStreamOutDistance: -1,
playerStreamInDistance: -1,
playerStreamOutDistance: -1,
playerBlipStreamInDistance: -1, playerBlipStreamInDistance: -1,
playerBlipStreamOutDistance: -1, playerBlipStreamOutDistance: -1,
handcuffPlayerDistance: 3, handcuffPlayerDistance: 3,
@@ -216,85 +239,89 @@ let globalConfig = {
passwordRequiredSymbols: 0, passwordRequiredSymbols: 0,
minChatLines: 1, minChatLines: 1,
maxChatLines: 6, maxChatLines: 6,
vehicleTrunkDistance: 2.0,
fishingSpotDistance: 10.0,
atmDistance: 1.5,
loginTimeout: 60000,
fishingCastMaxStrength: 100,
fishingCastMinStrength: 30,
jobRouteLocationSphereRadius: 3,
monthlyChanceOfSnow: [90, 50, 10, 0, 0, 0, 0, 0, 0, 0, 50, 90],
}; };
// =========================================================================== // ===========================================================================
function initConfigScript() { function initConfigScript() {
logToConsole(LOG_INFO, "[VRR.Config]: Initializing config script ..."); logToConsole(LOG_INFO, "[AGRP.Config]: Initializing config script ...");
logToConsole(LOG_INFO, "[VRR.Config]: Config script initialized!"); logToConsole(LOG_INFO, "[AGRP.Config]: Config script initialized!");
} }
// =========================================================================== // ===========================================================================
function loadGlobalConfig() { function loadGlobalConfig() {
logToConsole(LOG_DEBUG, "[VRR.Config] Loading global configuration ..."); logToConsole(LOG_DEBUG, "[AGRP.Config] Loading global configuration ...");
try { try {
getGlobalConfig().database = loadDatabaseConfig(); getGlobalConfig().database = loadDatabaseConfig();
} catch (error) { } catch (error) {
logToConsole(LOG_ERROR, `[VRR.Config] Failed to load global configuration. Error: ${error}`); logToConsole(LOG_ERROR, `[AGRP.Config] Failed to load global configuration. Error: ${error}`);
thisResource.stop(); thisResource.stop();
} }
try { try {
getGlobalConfig().economy = loadEconomyConfig(); getGlobalConfig().economy = loadEconomyConfig();
} catch (error) { } catch (error) {
logToConsole(LOG_ERROR, `[VRR.Config] Failed to load economy configuration. Error: ${error}`); logToConsole(LOG_ERROR, `[AGRP.Config] Failed to load economy configuration. Error: ${error}`);
thisResource.stop(); thisResource.stop();
} }
try { try {
getGlobalConfig().locale = loadLocaleConfig(); getGlobalConfig().locale = loadLocaleConfig();
} catch (error) { } catch (error) {
logToConsole(LOG_ERROR, `[VRR.Config] Failed to load locale configuration. Error: ${error}`); logToConsole(LOG_ERROR, `[AGRP.Config] Failed to load locale configuration. Error: ${error}`);
thisResource.stop(); thisResource.stop();
} }
try { try {
getGlobalConfig().accents = loadAccentConfig(); getGlobalConfig().accents = loadAccentConfig();
} catch (error) { } catch (error) {
logToConsole(LOG_ERROR, `[VRR.Config] Failed to load accent configuration. Error: ${error}`); logToConsole(LOG_ERROR, `[AGRP.Config] Failed to load accent configuration. Error: ${error}`);
thisResource.stop(); thisResource.stop();
} }
try { try {
getGlobalConfig().discord = loadDiscordConfig(); getGlobalConfig().discord = loadDiscordConfig();
} catch (error) { } catch (error) {
logToConsole(LOG_ERROR, `[VRR.Config] Failed to load discord configuration. Error: ${error}`); logToConsole(LOG_ERROR, `[AGRP.Config] Failed to load discord configuration. Error: ${error}`);
thisResource.stop(); thisResource.stop();
} }
try { try {
getGlobalConfig().keyBind = loadKeyBindConfig(); getGlobalConfig().keyBind = loadKeyBindConfig();
} catch (error) { } catch (error) {
logToConsole(LOG_ERROR, `[VRR.Config] Failed to load keybind configuration. Error: ${error}`); logToConsole(LOG_ERROR, `[AGRP.Config] Failed to load keybind configuration. Error: ${error}`);
thisResource.stop(); thisResource.stop();
} }
try { try {
getGlobalConfig().email = loadEmailConfig(); getGlobalConfig().email = loadEmailConfig();
} catch (error) { } catch (error) {
logToConsole(LOG_ERROR, `[VRR.Config] Failed to load email configuration. Error: ${error}`); logToConsole(LOG_ERROR, `[AGRP.Config] Failed to load email configuration. Error: ${error}`);
thisResource.stop(); thisResource.stop();
} }
logToConsole(LOG_DEBUG, "[VRR.Config] Loaded global configuration successfully!"); logToConsole(LOG_DEBUG, "[AGRP.Config] Loaded global configuration successfully!");
} }
// =========================================================================== // ===========================================================================
function loadServerConfigFromGameAndPort(gameId, port) { async function loadServerConfigFromGameAndPort(gameId, port) {
let dbConnection = connectToDatabase(); let dbConnection = connectToDatabase();
if (dbConnection) { if (dbConnection) {
let dbQueryString = `SELECT * FROM svr_main WHERE svr_game = ${gameId} AND svr_port = ${port} LIMIT 1;`; let dbQueryString = `SELECT * FROM svr_main WHERE svr_game = ${gameId} AND svr_port = ${port} LIMIT 1;`;
let dbQuery = queryDatabase(dbConnection, dbQueryString); let dbAssoc = await fetchQueryAssoc(dbConnection, dbQueryString);
if (dbQuery) { if (dbAssoc.length > 0) {
if (dbQuery.numRows > 0) { let tempServerConfigData = new ServerConfigData(dbAssoc[0]);
let dbAssoc = fetchQueryAssoc(dbQuery); return tempServerConfigData;
let tempServerConfigData = new ServerConfigData(dbAssoc);
freeDatabaseQuery(dbQuery);
return tempServerConfigData;
}
} }
disconnectFromDatabase(dbConnection); disconnectFromDatabase(dbConnection);
} }
@@ -303,18 +330,15 @@ function loadServerConfigFromGameAndPort(gameId, port) {
// =========================================================================== // ===========================================================================
function loadServerConfigFromId(tempServerId) { async function loadServerConfigFromGame(gameId) {
let dbConnection = connectToDatabase(); let dbConnection = connectToDatabase();
if (dbConnection) { if (dbConnection) {
let dbQueryString = `SELECT * FROM svr_main WHERE svr_id = ${tempServerId} LIMIT 1;`; let dbQueryString = `SELECT * FROM svr_main WHERE svr_game = ${gameId} LIMIT 1;`;
let dbQuery = queryDatabase(dbConnection, dbQueryString); let dbAssocArray = await fetchQueryAssoc(dbConnection, dbQueryString);
if (dbQuery) { logToConsole(LOG_DEBUG | LOG_WARN, `${dbAssocArray[0]}`);
if (dbQuery.numRows > 0) { if (dbAssocArray.length > 0) {
let dbAssoc = fetchQueryAssoc(dbQuery); let tempServerConfigData = new ServerConfigData(dbAssocArray[0]);
let tempServerConfigData = new ServerConfigData(dbAssoc); return tempServerConfigData;
freeDatabaseQuery(dbQuery);
return tempServerConfigData;
}
} }
disconnectFromDatabase(dbConnection); disconnectFromDatabase(dbConnection);
} }
@@ -323,18 +347,36 @@ function loadServerConfigFromId(tempServerId) {
// =========================================================================== // ===========================================================================
async function loadServerConfigFromId(tempServerId) {
let dbConnection = connectToDatabase();
if (dbConnection) {
let dbQueryString = `SELECT * FROM svr_main WHERE svr_id = ${tempServerId} LIMIT 1;`;
let dbAssoc = await fetchQueryAssoc(dbConnection, dbQueryString);
if (dbAssoc.length > 0) {
let tempServerConfigData = new ServerConfigData(dbAssoc[0]);
return tempServerConfigData;
}
}
disconnectFromDatabase(dbConnection);
return false;
}
// ===========================================================================
function applyConfigToServer(tempServerConfig) { function applyConfigToServer(tempServerConfig) {
logToConsole(LOG_INFO, "[VRR.Config]: Applying server config ..."); logToConsole(LOG_INFO, "[AGRP.Config]: Applying server config ...");
logToConsole(LOG_DEBUG, "[VRR.Config]: Server config applied successfully!"); logToConsole(LOG_DEBUG, "[AGRP.Config]: Server config applied successfully!");
if (isTimeSupported()) { updateServerGameTime();
logToConsole(LOG_DEBUG, `[VRR.Config]: Setting time to to ${tempServerConfig.hour}:${tempServerConfig.minute} with minute duration of ${tempServerConfig.minuteDuration}`);
setGameTime(tempServerConfig.hour, tempServerConfig.minute, tempServerConfig.minuteDuration); //if (isTimeSupported()) {
} // logToConsole(LOG_DEBUG, `[AGRP.Config]: Setting time to to ${tempServerConfig.hour}:${tempServerConfig.minute} with minute duration of ${tempServerConfig.minuteDuration}`);
// setGameTime(tempServerConfig.hour, tempServerConfig.minute, tempServerConfig.minuteDuration);
//}
if (isWeatherSupported()) { if (isWeatherSupported()) {
logToConsole(LOG_DEBUG, `[VRR.Config]: Setting weather to ${tempServerConfig.weather}`); logToConsole(LOG_DEBUG, `[AGRP.Config]: Setting weather to ${tempServerConfig.weather}`);
game.forceWeather(tempServerConfig.weather); game.forceWeather(getWeatherData(tempServerConfig.weather).weatherId);
} }
updateServerRules(); updateServerRules();
@@ -343,7 +385,7 @@ function applyConfigToServer(tempServerConfig) {
// =========================================================================== // ===========================================================================
function saveServerConfigToDatabase() { function saveServerConfigToDatabase() {
logToConsole(LOG_DEBUG, `[VRR.Config]: Saving server ${getServerConfig().databaseId} configuration to database ...`); logToConsole(LOG_DEBUG, `[AGRP.Config]: Saving server ${getServerConfig().databaseId} configuration to database ...`);
if (getServerConfig().needsSaved) { if (getServerConfig().needsSaved) {
let dbConnection = connectToDatabase(); let dbConnection = connectToDatabase();
if (dbConnection) { if (dbConnection) {
@@ -407,7 +449,7 @@ function saveServerConfigToDatabase() {
} }
} }
logToConsole(LOG_DEBUG, `[VRR.Config]: Server ${getServerConfig().databaseId} configuration saved to database!`); logToConsole(LOG_DEBUG, `[AGRP.Config]: Server ${getServerConfig().databaseId} configuration saved to database!`);
} }
// =========================================================================== // ===========================================================================
@@ -530,19 +572,19 @@ function setWeatherCommand(command, params, client) {
return false; return false;
} }
let weatherId = getWeatherFromParams(getParam(params, " ", 1)); let weatherIndex = getWeatherFromParams(getParam(params, " ", 1));
if (!weatherId) { if (!getWeatherData(weatherIndex)) {
messagePlayerError(client, `That weather ID or name is invalid!`); messagePlayerError(client, `That weather ID or name is invalid!`);
return false; return false;
} }
game.forceWeather(toInteger(weatherId)); game.forceWeather(getWeatherData(weatherIndex).weatherId);
getServerConfig().weather = weatherId; getServerConfig().weather = weatherIndex;
getServerConfig().needsSaved = true; getServerConfig().needsSaved = true;
announceAdminAction("ServerWeatherSet", getPlayerName(client), getGameConfig().weatherNames[getGame()][toInteger(weatherId)]); announceAdminAction("ServerWeatherSet", getPlayerName(client), getWeatherData(weatherIndex).name);
updateServerRules(); updateServerRules();
return true; return true;
} }
@@ -881,7 +923,7 @@ function reloadEmailConfigurationCommand(command, params, client) {
*/ */
function reloadDatabaseConfigurationCommand(command, params, client) { function reloadDatabaseConfigurationCommand(command, params, client) {
if (getDatabaseConfig().usePersistentConnection && isDatabaseConnected(persistentDatabaseConnection)) { if (getDatabaseConfig().usePersistentConnection && isDatabaseConnected(persistentDatabaseConnection)) {
logToConsole(LOG_WARN, `[VRR.Database] Closing persistent database connection`); logToConsole(LOG_WARN, `[AGRP.Database] Closing persistent database connection`);
persistentDatabaseConnection.close(); persistentDatabaseConnection.close();
persistentDatabaseConnection = null; persistentDatabaseConnection = null;
} }
@@ -929,8 +971,8 @@ function getServerIntroMusicURL() {
// =========================================================================== // ===========================================================================
function loadLocaleConfig() { function loadLocaleConfig() {
logToConsole(LOG_DEBUG, "[VRR.Config] Loading locale configuration"); logToConsole(LOG_DEBUG, "[AGRP.Config] Loading locale configuration");
let localeConfig = JSON.parse(loadTextFile(`config/locale.json`)); let localeConfig = JSON.parse(getContentsOfTextFile(`config/locale.json`));
if (localeConfig != null) { if (localeConfig != null) {
return localeConfig; return localeConfig;
} }
@@ -939,8 +981,8 @@ function loadLocaleConfig() {
// =========================================================================== // ===========================================================================
function loadEconomyConfig() { function loadEconomyConfig() {
logToConsole(LOG_DEBUG, "[VRR.Config] Loading economy configuration"); logToConsole(LOG_DEBUG, "[AGRP.Config] Loading economy configuration");
let economyConfig = JSON.parse(loadTextFile(`config/economy.json`)); let economyConfig = JSON.parse(getContentsOfTextFile(`config/economy.json`));
if (economyConfig != null) { if (economyConfig != null) {
return economyConfig; return economyConfig;
} }
@@ -949,8 +991,8 @@ function loadEconomyConfig() {
// =========================================================================== // ===========================================================================
function loadAccentConfig() { function loadAccentConfig() {
logToConsole(LOG_DEBUG, "[VRR.Config] Loading accents configuration"); logToConsole(LOG_DEBUG, "[AGRP.Config] Loading accents configuration");
let accentConfig = JSON.parse(loadTextFile(`config/accents.json`)); let accentConfig = JSON.parse(getContentsOfTextFile(`config/accents.json`));
if (accentConfig != null) { if (accentConfig != null) {
return accentConfig; return accentConfig;
} }
@@ -959,8 +1001,8 @@ function loadAccentConfig() {
// =========================================================================== // ===========================================================================
function loadDiscordConfig() { function loadDiscordConfig() {
logToConsole(LOG_DEBUG, "[VRR.Config] Loading discord configuration"); logToConsole(LOG_DEBUG, "[AGRP.Config] Loading discord configuration");
let discordConfig = JSON.parse(loadTextFile(`config/discord.json`)); let discordConfig = JSON.parse(getContentsOfTextFile(`config/discord.json`));
if (discordConfig != null) { if (discordConfig != null) {
return discordConfig; return discordConfig;
} }
@@ -970,8 +1012,8 @@ function loadDiscordConfig() {
// =========================================================================== // ===========================================================================
function loadDatabaseConfig() { function loadDatabaseConfig() {
logToConsole(LOG_DEBUG, "[VRR.Config] Loading database configuration"); logToConsole(LOG_DEBUG, "[AGRP.Config] Loading database configuration");
let databaseConfig = JSON.parse(loadTextFile("config/database.json")); let databaseConfig = JSON.parse(getContentsOfTextFile("config/database.json"));
if (databaseConfig != null) { if (databaseConfig != null) {
return databaseConfig; return databaseConfig;
} }
@@ -981,8 +1023,8 @@ function loadDatabaseConfig() {
// =========================================================================== // ===========================================================================
function loadKeyBindConfig() { function loadKeyBindConfig() {
logToConsole(LOG_DEBUG, "[VRR.Config] Loading keybind configuration"); logToConsole(LOG_DEBUG, "[AGRP.Config] Loading keybind configuration");
let keyBindConfig = JSON.parse(loadTextFile("config/keybind.json")); let keyBindConfig = JSON.parse(getContentsOfTextFile("config/keybind.json"));
if (keyBindConfig != null) { if (keyBindConfig != null) {
return keyBindConfig; return keyBindConfig;
} }
@@ -992,8 +1034,8 @@ function loadKeyBindConfig() {
// =========================================================================== // ===========================================================================
function loadEmailConfig() { function loadEmailConfig() {
logToConsole(LOG_DEBUG, "[VRR.Config] Loading email configuration"); logToConsole(LOG_DEBUG, "[AGRP.Config] Loading email configuration");
let emailConfig = JSON.parse(loadTextFile("config/email.json")); let emailConfig = JSON.parse(getContentsOfTextFile("config/email.json"));
if (emailConfig != null) { if (emailConfig != null) {
return emailConfig; return emailConfig;
} }
@@ -1075,15 +1117,25 @@ function getDatabaseConfig() {
// =========================================================================== // ===========================================================================
function loadServerConfig() { function loadServerConfig() {
logToConsole(LOG_DEBUG, "[VRR.Config] Loading server configuration"); logToConsole(LOG_DEBUG, "[AGRP.Config] Loading server configuration");
try {
if (toInteger(server.getCVar("agrp_devserver")) == 1) {
serverConfig = loadServerConfigFromGame(getGame());
if (serverConfig == false) {
logToConsole(LOG_ERROR, `[AGRP.Config] Could not load server configuration for game ${getGame()}`);
server.shutdown();
}
} else {
serverConfig = loadServerConfigFromGameAndPort(getGame(), getServerPort()); serverConfig = loadServerConfigFromGameAndPort(getGame(), getServerPort());
} catch (error) {
logToConsole(LOG_ERROR, `[VRR.Config] Could not load server configuration for game ${getGame()} and port ${getServerPort}`); if (serverConfig == false) {
thisResource.stop(); logToConsole(LOG_ERROR, `[AGRP.Config] Could not load server configuration for game ${getGame()} and port ${getServerPort()}`);
server.shutdown();
}
} }
logToConsole(LOG_DEBUG | LOG_WARN, `Server ID: ${serverConfig.databaseId}`); //logToConsole(LOG_DEBUG | LOG_WARN, `Server ID: ${serverConfig.databaseId}`);
} }
// =========================================================================== // ===========================================================================

View File

@@ -1,20 +1,22 @@
// =========================================================================== // ===========================================================================
// Vortrex's Roleplay Resource // Asshat Gaming Roleplay
// https://github.com/VortrexFTW/gtac_roleplay // https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// =========================================================================== // ===========================================================================
// FILE: core.js // FILE: core.js
// DESC: Provides core data structures, function, and operations // DESC: Provides core data structures, function, and operations
// TYPE: Server (JavaScript) // TYPE: Server (JavaScript)
// =========================================================================== // ===========================================================================
let scriptVersion = "1.1"; let scriptVersion = "1.3";
let serverStartTime = 0; let serverStartTime = 0;
let logLevel = LOG_INFO|LOG_DEBUG|LOG_VERBOSE; // LOG_ERROR|LOG_WARN; let logLevel = LOG_INFO | LOG_ERROR | LOG_WARN;
let playerResourceReady = new Array(server.maxClients).fill(false); let playerResourceReady = new Array(server.maxClients).fill(false);
let playerResourceStarted = new Array(server.maxClients).fill(false); let playerResourceStarted = new Array(server.maxClients).fill(false);
let playerInitialized = new Array(server.maxClients).fill(false); let playerInitialized = new Array(server.maxClients).fill(false);
let playerGUI = new Array(server.maxClients).fill(false); let playerGUI = new Array(server.maxClients).fill(false);
let defaultNoAccountId = 479;
// =========================================================================== // ===========================================================================
@@ -28,15 +30,19 @@ let playerGUI = new Array(server.maxClients).fill(false);
* @property {Array.<ItemData>} items * @property {Array.<ItemData>} items
* @property {Array.<ItemTypeData>} itemTypes * @property {Array.<ItemTypeData>} itemTypes
* @property {Array.<ClanData>} clans * @property {Array.<ClanData>} clans
* @property {Array} localeStrings * @property {Array.<TriggerData>} triggers
* @property {Array.<NPCData>} npcs * @property {Array.<NPCData>} npcs
* @property {Array.<RaceData>} races * @property {Array.<RaceData>} races
* @property {Array.<JobData>} jobs * @property {Array.<JobData>} jobs
* @property {Array.<Gates>} gates * @property {Array.<GateData>} gates
* @property {Array.<RadioStationData>} radioStations
* @property {Array} locales
* @property {Array} localeStrings
* @property {Array} groundItemCache * @property {Array} groundItemCache
* @property {Array} groundPlantCache * @property {Array} groundPlantCache
* @property {Array} purchasingVehicleCache * @property {Array} purchasingVehicleCache
* @property {Array} rentingVehicleCache * @property {Array} rentingVehicleCache
* @property {Array} atmLocationCache
*/ */
let serverData = { let serverData = {
vehicles: [], vehicles: [],
@@ -47,26 +53,26 @@ let serverData = {
items: [], items: [],
itemTypes: [], itemTypes: [],
clans: [], clans: [],
localeStrings: {},
cachedTranslations: [], cachedTranslations: [],
cachedTranslationFrom: [], cachedTranslationFrom: [],
//triggers: [], triggers: [],
npcs: [], npcs: [],
races: [], races: [],
jobs: [], jobs: [],
gates: [], gates: [],
radioStations: [],
localeStrings: {},
groundItemCache: [], groundItemCache: [],
groundPlantCache: [], groundPlantCache: [],
purchasingVehicleCache: [], purchasingVehicleCache: [],
rentingVehicleCache: [], rentingVehicleCache: [],
atmLocationCache: [],
}; };
// =========================================================================== // ===========================================================================
/** /**
* * @return {ServerData} serverData
* @return {ServerData}
*
*/ */
function getServerData() { function getServerData() {
return serverData; return serverData;

Some files were not shown because too many files have changed in this diff Show More