291 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
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
111 changed files with 10202 additions and 3162 deletions

View File

@@ -7,7 +7,8 @@
"flagImageFile": "uk.png",
"countries": ["gb", "us", "au", "bz", "ca", "ie", "jm", "nz", "za", "tt"],
"requiresUnicode": false,
"contributor": "Vortrex"
"contributor": "Vortrex",
"enabled": true
},
{
"id": 1,
@@ -17,7 +18,8 @@
"flagImageFile": "ru.png",
"countries": ["ru", "ua"],
"requiresUnicode": false,
"contributor": "VNDTTS"
"contributor": "VNDTTS",
"enabled": true
},
{
"id": 2,
@@ -27,7 +29,8 @@
"flagImageFile": "pl.png",
"countries": ["pl"],
"requiresUnicode": false,
"contributor": "Suprise444"
"contributor": "Suprise444",
"enabled": true
},
{
"id": 3,
@@ -37,7 +40,8 @@
"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"
"contributor": "PerikiyoXD",
"enabled": true
},
{
"id": 4,
@@ -47,7 +51,8 @@
"flagImageFile": "cn.png",
"countries": ["cn", "hk", "sg", "tw"],
"requiresUnicode": true,
"contributor": "Renzuko_Ctone"
"contributor": "Renzuko_Ctone",
"enabled": true
},
{
"id": 5,
@@ -57,7 +62,8 @@
"flagImageFile": "sa.png",
"countries": ["dz", "bh", "eg", "iq", "jo", "kw", "lb", "ly", "ma", "om", "qa", "sa", "sy", "tn", "ae", "ye"],
"requiresUnicode": true,
"contributor": "! KASIR"
"contributor": "! KASIR",
"enabled": true
},
{
"id": 6,
@@ -67,7 +73,8 @@
"flagImageFile": "sk.png",
"countries": ["sk"],
"requiresUnicode": false,
"contributor": "UAKLAUS"
"contributor": "UAKLAUS",
"enabled": false
},
{
"id": 7,
@@ -77,7 +84,8 @@
"flagImageFile": "de.png",
"countries": ["de", "at", "be", "ch", "li", "lu"],
"requiresUnicode": false,
"contributor": "Sladernimo"
"contributor": "Sladernimo",
"enabled": true
},
{
"id": 8,
@@ -87,7 +95,8 @@
"flagImageFile": "fr.png",
"countries": ["fr", "cd", "bj", "bf", "cd", "cg", "ga", "gn", "ml", "mc", "ne", "sn"],
"requiresUnicode": false,
"contributor": "Cocam"
"contributor": "Cocam",
"enabled": false
},
{
"id": 9,
@@ -97,7 +106,8 @@
"flagImageFile": "jp.png",
"countries": ["jp"],
"requiresUnicode": true,
"contributor": "Cocam"
"contributor": "Cocam",
"enabled": false
},
{
"id": 10,
@@ -107,6 +117,29 @@
"flagImageFile": "fi.png",
"countries": ["fi"],
"requiresUnicode": false,
"contributor": "SIMBA_MEOW"
"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,
"grossIncomeMultiplier": 1.0,
"incomeTaxRate": 0.7,
"currencyString": "${AMOUNT}",
"upKeepCosts": {
"upKeepPerVehicle": 250,
"upKeepPerHouse": 350,

View File

@@ -11,7 +11,8 @@
"flagImageFile": "uk.png",
"countries": ["gb", "us", "au", "bz", "ca", "ie", "jm", "nz", "za", "tt"],
"requiresUnicode": false,
"contributor": "Vortrex"
"contributor": "Vortrex",
"enabled": true
},
{
"id": 1,
@@ -21,7 +22,8 @@
"flagImageFile": "ru.png",
"countries": ["ru", "ua"],
"requiresUnicode": false,
"contributor": "VNDTTS"
"contributor": "VNDTTS",
"enabled": true
},
{
"id": 2,
@@ -31,7 +33,8 @@
"flagImageFile": "pl.png",
"countries": ["pl"],
"requiresUnicode": false,
"contributor": "Suprise444"
"contributor": "Suprise444",
"enabled": true
},
{
"id": 3,
@@ -41,7 +44,8 @@
"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"
"contributor": "PerikiyoXD",
"enabled": true
},
{
"id": 4,
@@ -51,7 +55,8 @@
"flagImageFile": "cn.png",
"countries": ["cn", "hk", "sg", "tw"],
"requiresUnicode": true,
"contributor": "Renzuko_Ctone"
"contributor": "Renzuko_Ctone",
"enabled": true
},
{
"id": 5,
@@ -61,7 +66,8 @@
"flagImageFile": "sa.png",
"countries": ["dz", "bh", "eg", "iq", "jo", "kw", "lb", "ly", "ma", "om", "qa", "sa", "sy", "tn", "ae", "ye"],
"requiresUnicode": true,
"contributor": "! KASIR"
"contributor": "! KASIR",
"enabled": true
},
{
"id": 6,
@@ -71,7 +77,8 @@
"flagImageFile": "sk.png",
"countries": ["sk"],
"requiresUnicode": false,
"contributor": "UAKLAUS"
"contributor": "UAKLAUS",
"enabled": false
},
{
"id": 7,
@@ -81,7 +88,8 @@
"flagImageFile": "de.png",
"countries": ["de", "at", "be", "ch", "li", "lu"],
"requiresUnicode": false,
"contributor": "Sladernimo"
"contributor": "Sladernimo",
"enabled": true
},
{
"id": 8,
@@ -91,7 +99,8 @@
"flagImageFile": "fr.png",
"countries": ["fr", "cd", "bj", "bf", "cd", "cg", "ga", "gn", "ml", "mc", "ne", "sn"],
"requiresUnicode": false,
"contributor": "Cocam"
"contributor": "Cocam",
"enabled": false
},
{
"id": 9,
@@ -101,7 +110,8 @@
"flagImageFile": "jp.png",
"countries": ["jp"],
"requiresUnicode": true,
"contributor": "Cocam"
"contributor": "Cocam",
"enabled": false
},
{
"id": 10,
@@ -111,7 +121,30 @@
"flagImageFile": "fi.png",
"countries": ["fi"],
"requiresUnicode": false,
"contributor": "SIMBA_MEOW"
"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/images/cursor.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 476 B

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"
}
}

View File

@@ -1,5 +1,5 @@
<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 -->
<script src="scripts/shared/const.js" type="server" language="javascript" />
@@ -10,7 +10,7 @@
<script src="scripts/shared/gamedata.js" type="client" language="javascript" />
<!-- 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/client/native/connected.js" type="client" language="javascript" />
@@ -50,6 +50,7 @@
<script src="scripts/server/npc.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/radio.js" type="server" language="javascript" />
<script src="scripts/server/security.js" type="server" language="javascript" />
@@ -85,9 +86,11 @@
<!-- 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" />
@@ -98,19 +101,28 @@
<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/login.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/localechooser.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 -->
<script src="scripts/client/afk.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/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/gui.js" type="client" language="javascript" />
<script src="scripts/client/gps.js" type="client" language="javascript" />
@@ -121,19 +133,17 @@
<script src="scripts/client/label.js" type="client" language="javascript" />
<script src="scripts/client/locale.js" type="client" language="javascript" />
<script src="scripts/client/logo.js" type="client" language="javascript" />
<script src="scripts/client/main.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/radio.js" type="client" language="javascript" />
<script src="scripts/client/scoreboard.js" type="client" language="javascript" />
<script src="scripts/client/netevents.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/time.nut" type="client" language="squirrel" />
<script src="scripts/client/utilities.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" />

View File

@@ -10,8 +10,8 @@
// Init AFK script
function initAFKScript() {
logToConsole(LOG_DEBUG, "[VRR.AFK]: Initializing AFK script ...");
logToConsole(LOG_DEBUG, "[VRR.AFK]: AFK script initialized!");
logToConsole(LOG_DEBUG, "[AGRP.AFK]: Initializing AFK script ...");
logToConsole(LOG_DEBUG, "[AGRP.AFK]: AFK script initialized!");
}
// ===========================================================================

View File

@@ -8,6 +8,13 @@
// 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) {
let ped = getElementFromId(pedId);
@@ -16,7 +23,7 @@ function makePedPlayAnimation(pedId, animationSlot, positionOffset) {
}
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;
switch (animationData.moveType) {

View File

@@ -17,18 +17,29 @@ class BusinessData {
this.blipModel = blipModel;
this.pickupModel = pickupModel;
this.hasInterior = hasInterior;
this.rentPrice = 0;
this.buyPrice = 0;
this.hasItems = hasItems;
this.blipId = -1;
this.labelInfoType = 0;
this.locked = false;
this.entranceFee = 0;
}
}
// ===========================================================================
function receiveBusinessFromServer(businessId, name, entrancePosition, blipModel, pickupModel, hasInterior, hasItems) {
logToConsole(LOG_DEBUG, `[VRR.Business] Received business ${businessId} (${name}) from server`);
function initBusinessScript() {
logToConsole(LOG_DEBUG, "[AGRP.Business]: Initializing business script ...");
logToConsole(LOG_INFO, "[AGRP.Business]: Business script initialized!");
}
if (!areServerElementsSupported()) {
// ===========================================================================
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);
businessData.name = name;
@@ -36,12 +47,26 @@ function receiveBusinessFromServer(businessId, name, entrancePosition, blipModel
businessData.blipModel = blipModel;
businessData.pickupModel = pickupModel;
businessData.hasInterior = hasInterior;
businessData.buyPrice = buyPrice;
businessData.rentPrice = rentPrice;
businessData.hasItems = hasItems;
businessData.locked = locked;
businessData.entranceFee = entranceFee;
logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId} already exists. Checking blip ...`);
if (hasInterior && !hasItems) {
businessData.labelInfoType = AGRP_PROPLABEL_INFO_ENTER;
} else if (!hasInterior && hasItems) {
businessData.labelInfoType = AGRP_PROPLABEL_INFO_BUY;
} 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, `[VRR.Business] Business ${businessId}'s blip has been removed by the server`);
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);
} else {
@@ -51,11 +76,11 @@ function receiveBusinessFromServer(businessId, name, entrancePosition, blipModel
//businesses.splice(businessData.index, 1);
//setAllBusinessDataIndexes();
} else {
logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId}'s blip is unchanged`);
logToConsole(LOG_DEBUG, `[AGRP.Business] Business ${businessId}'s blip is unchanged`);
}
} else {
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() == AGRP_GAME_GTA_IV) {
natives.setBlipCoordinates(businessData.blipId, businessData.entrancePosition);
natives.changeBlipSprite(businessData.blipId, businessData.blipModel);
@@ -68,20 +93,20 @@ function receiveBusinessFromServer(businessId, name, entrancePosition, blipModel
if (blipId != -1) {
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 {
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);
if (blipModel != -1) {
let blipId = createGameBlip(tempBusinessData.blipModel, tempBusinessData.entrancePosition, tempBusinessData.name);
if (blipId != -1) {
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 {
logToConsole(LOG_DEBUG, `[VRR.Business] Business ${businessId} has no blip.`);
logToConsole(LOG_DEBUG, `[AGRP.Business] Business ${businessId} has no blip.`);
}
getServerData().businesses.push(tempBusinessData);
setAllBusinessDataIndexes();

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);
}
}
}
// ===========================================================================

View File

@@ -29,11 +29,11 @@ let scrollDownKey = false;
// ===========================================================================
function initChatBoxScript() {
logToConsole(LOG_DEBUG, "[VRR.Chat]: Initializing chat script ...");
logToConsole(LOG_DEBUG, "[AGRP.Chat]: Initializing chat script ...");
scrollUpKey = getKeyIdFromParams("pageup");
scrollDownKey = getKeyIdFromParams("pagedown");
bindChatBoxKeys();
logToConsole(LOG_DEBUG, "[VRR.Chat]: Chat script initialized!");
logToConsole(LOG_INFO, "[AGRP.Chat]: Chat script initialized!");
}
// ===========================================================================
@@ -53,7 +53,7 @@ function unBindChatBoxKeys() {
// ===========================================================================
function receiveChatBoxMessageFromServer(messageString, colour, hour, minute, second) {
logToConsole(LOG_DEBUG, `[VRR.Chat]: Received chatbox message from server: ${messageString}`);
logToConsole(LOG_DEBUG, `[AGRP.Chat]: Received chatbox message from server: ${messageString}`);
// Just in case it's hidden by auto hide
//setChatWindowEnabled(true);
@@ -73,21 +73,21 @@ function receiveChatBoxMessageFromServer(messageString, colour, hour, minute, se
let outputString = messageString;
if (chatTimeStampsEnabled == true) {
//timeStampString = `{TIMESTAMPCOLOUR}[${findResourceByName("agrp_time").exports.getTimeStampOutput(timeStamp)}]{MAINCOLOUR}`;
let timeStampString = `{TIMESTAMPCOLOUR}[${hour}:${minute}:${second}] `;
let colourRGBA = rgbaArrayFromToColour(colour);
let timeStampString = `{TIMESTAMPCOLOUR}[${hour}:${minute}:${second}][${rgbToHex(colourRGBA[0], colourRGBA[1], colourRGBA[2])}] `;
outputString = `${timeStampString}${messageString}`;
}
logToConsole(LOG_DEBUG, `[VRR.Chat]: Changed colours in string: ${outputString}`);
logToConsole(LOG_DEBUG, `[AGRP.Chat]: Changed colours in string: ${outputString}`);
outputString = replaceColoursInMessage(`${outputString}`);
if (chatEmojiEnabled == true) {
logToConsole(LOG_DEBUG, `[VRR.Chat]: Enabled emoji in string: ${outputString}`);
logToConsole(LOG_DEBUG, `[AGRP.Chat]: Enabled emoji in string: ${outputString}`);
outputString = replaceEmojiInMessage(outputString);
}
if (profanityFilterEnabled == true) {
logToConsole(LOG_DEBUG, `[VRR.Chat]: Removed profanity in string: ${outputString}`);
logToConsole(LOG_DEBUG, `[AGRP.Chat]: Removed profanity in string: ${outputString}`);
outputString = replaceProfanityInMessage(outputString);
}
@@ -163,12 +163,9 @@ function updateChatBox() {
if (typeof chatBoxHistory[i] != "undefined") {
let outputString = chatBoxHistory[i][0];
if (chatTimeStampsEnabled == true) {
//let timeStampDate = new Date(chatBoxHistory[i][2]);
//let timeStampText = `${timeStampDate.getHours()}:${timeStampDate.getMinutes()}:${timeStampDate.getSeconds()}`;
//let timeStampText = findResourceByName("agrp_time").exports.getTimeStampOutput(chatBoxHistory[i][2]);
let timeStampText = `${chatBoxHistory[i][2]}:${chatBoxHistory[i][3]}:${chatBoxHistory[i][4]}`;
outputString = `{TIMESTAMPCOLOUR}[${timeStampText}]{MAINCOLOUR} ${chatBoxHistory[i][0]}`;
let colourRGBA = rgbaArrayFromToColour(chatBoxHistory[i][1]);
outputString = `{TIMESTAMPCOLOUR}[${timeStampText}][${rgbToHex(colourRGBA[0], colourRGBA[1], colourRGBA[2])}] ${chatBoxHistory[i][0]}`;
}
outputString = replaceColoursInMessage(outputString);

View File

@@ -19,8 +19,8 @@ let isSpawned = false;
let garbageCollectorInterval = null;
let parkedVehiclePosition = false;
let parkedVehicleHeading = false;
//let parkedVehiclePosition = false;
//let parkedVehicleHeading = false;
let renderHUD = true;
let renderLabels = true;
@@ -31,7 +31,7 @@ let renderHotBar = true;
let renderItemActionDelay = true;
let renderInteriorLights = true;
let logLevel = LOG_DEBUG;
let logLevel = LOG_INFO | LOG_DEBUG;
let weaponDamageEnabled = {};
let weaponDamageEvent = {};
@@ -61,6 +61,7 @@ let interiorLightsEnabled = true;
let interiorLightsColour = toColour(0, 0, 0, 150);
let mouseCameraEnabled = false;
let mouseCursorEnabled = false;
let currentPickup = false;
@@ -83,6 +84,15 @@ let profanityFilterEnabled = false;
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 = {
houses: [],
businesses: [],
@@ -90,6 +100,17 @@ let serverData = {
localeOptions: [],
vehicles: [],
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);
}
}
// ===========================================================================

View File

@@ -3,7 +3,11 @@
// https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// ===========================================================================
// FILE: 5cardpoker.js
// DESC: Provides 5-card poker games GUI
// FILE: economy.js
// DESC: Provides economy functions
// TYPE: Client (JavaScript)
// ===========================================================================
// ===========================================================================

View File

@@ -9,9 +9,9 @@
// ===========================================================================
function initEventScript() {
logToConsole(LOG_DEBUG, "[VRR.Event]: Initializing event script ...");
logToConsole(LOG_DEBUG, "[AGRP.Event]: Initializing event script ...");
addAllEventHandlers();
logToConsole(LOG_DEBUG, "[VRR.Event]: Event script initialized!");
logToConsole(LOG_DEBUG, "[AGRP.Event]: Event script initialized!");
}
// ===========================================================================
@@ -41,15 +41,15 @@ function addAllEventHandlers() {
addEventHandler("OnPedExitedSphereEx", onPedExitedSphere);
}
}
if (getGame() == AGRP_GAME_MAFIA_ONE) {
addEventHandler("OnMapLoaded", onMapLoaded);
}
}
// ===========================================================================
function onResourceStart(event, resource) {
if (resource == thisResource) {
sendResourceStartedSignalToServer();
}
if (resource == findResourceByName("v-events")) {
// Remove and re-add events, in case v-events was loaded after agrp_main
removeEventHandler("OnPedEnteredVehicleEx");
@@ -62,13 +62,20 @@ function onResourceStart(event, resource) {
addEventHandler("OnPedEnteredSphereEx", onPedEnteredSphere);
addEventHandler("OnPedExitedSphereEx", onPedExitedSphere);
}
//garbageCollectorInterval = setInterval(collectAllGarbage, 1000*60);
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) {
if (resource == thisResource) {
logToConsole(LOG_DEBUG | LOG_WARN, `[AGRP.Event] onResourceStop called - Sending signal to server`);
sendResourceStoppedSignalToServer();
}
}
@@ -77,6 +84,8 @@ function onResourceStop(event, resource) {
function onResourceReady(event, resource) {
if (resource == thisResource) {
logToConsole(LOG_DEBUG | LOG_WARN, `[AGRP.Event] onResourceReady called - Sending signal to server`);
loadLocaleConfig();
sendResourceReadySignalToServer();
}
}
@@ -84,6 +93,7 @@ function onResourceReady(event, resource) {
// ===========================================================================
function onProcess(event, deltaTime) {
logToConsole(LOG_VERBOSE, `[AGRP.Event] onProcess`);
if (localPlayer == null) {
return false;
}
@@ -101,9 +111,9 @@ function onProcess(event, deltaTime) {
processNearbyPickups();
processVehiclePurchasing();
processVehicleBurning();
processVehicleCruiseControl();
//checkChatBoxAutoHide(); // Will be uncommented on 1.4.0 GTAC update
//processVehicleFires();
}
// ===========================================================================
@@ -118,6 +128,9 @@ function onKeyUp(event, keyCode, scanCode, keyModifiers) {
// ===========================================================================
function onDrawnHUD(event) {
logToConsole(LOG_VERBOSE, `[AGRP.Event] HUD drawn`);
processMouseCursorRendering();
if (!renderHUD) {
return false;
}
@@ -139,7 +152,7 @@ function onDrawnHUD(event) {
// ===========================================================================
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();
}
@@ -152,27 +165,62 @@ function onElementStreamIn(event, element) {
// ===========================================================================
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);
if (inVehicleSeat) {
parkedVehiclePosition = false;
parkedVehicleHeading = false;
cruiseControlEnabled = false;
cruiseControlSpeed = 0.0;
if (localPlayer != null) {
if (ped == localPlayer) {
if (areServerElementsSupported()) {
if (inVehicleSeat == 0) {
//setVehicleEngine(vehicle.id, false);
//if (!inVehicle.engine) {
// parkedVehiclePosition = false;
// parkedVehicleHeading = false;
//}
}
}
}
}
}
// ===========================================================================
function onPedExitingVehicle(event, ped, vehicle, seat) {
//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, `[VRR.Event] Local player entered vehicle`);
logToConsole(LOG_DEBUG, `[AGRP.Event] Ped entered vehicle`);
//sendNetworkEventToServer("agrp.onPlayerEnterVehicle", getVehicleForNetworkEvent(vehicle), seat);
if (areServerElementsSupported()) {
if (inVehicleSeat == 0) {
setVehicleEngine(vehicle.id, false);
if (!inVehicle.engine) {
parkedVehiclePosition = inVehicle.position;
parkedVehicleHeading = inVehicle.heading;
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);
}
}
}
}
}
@@ -183,7 +231,7 @@ function onPedEnteredVehicle(event, ped, vehicle, seat) {
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}`);
//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) {
@@ -246,4 +294,10 @@ function onEntityProcess(event, entity) {
}
// ===========================================================================
function onMapLoaded(mapName) {
sendNetworkEventToServer("agrp.mapLoaded", mapName);
}
// ===========================================================================

View File

@@ -17,7 +17,7 @@ let gpsBlipBlinkTimer = null;
// ===========================================================================
function showGPSLocation(position, colour) {
logToConsole(LOG_DEBUG, `[VRR.GPS] Showing gps location`);
logToConsole(LOG_DEBUG, `[AGRP.GPS] Showing gps location`);
if (getMultiplayerMod() == AGRP_MPMOD_GTAC) {
if (getGame() == AGRP_GAME_GTA_SA) {
// Server-side spheres don't show in GTA SA for some reason.

View File

@@ -41,14 +41,14 @@ let creatingCharacter = false;
// ===========================================================================
function initGUIScript() {
logToConsole(LOG_DEBUG, "[VRR.GUI]: Initializing GUI script ...");
logToConsole(LOG_DEBUG, "[VRR.GUI]: GUI script initialized!");
logToConsole(LOG_DEBUG, "[AGRP.GUI]: Initializing GUI script ...");
logToConsole(LOG_DEBUG, "[AGRP.GUI]: GUI script initialized!");
}
// ===========================================================================
function initGUI() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Initializing GUI ...`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Initializing GUI ...`);
initLoginGUI();
initRegisterGUI();
@@ -62,13 +62,19 @@ function initGUI() {
initResetPasswordGUI();
initChangePasswordGUI();
initLocaleChooserGUI();
//initInventoryGUI();
//initInventoryBulkGUI();
//initClanManagerGUI();
//initBusinessManagerGUI();
//initHouseManagerGUI();
//initFiveCardPokerGUI();
//initBettingGUI();
//initBlackJackGUI();
closeAllWindows();
guiReady = true;
logToConsole(LOG_DEBUG, `[VRR.GUI] All GUI created successfully!`);
loadLocaleConfig();
logToConsole(LOG_DEBUG, `[AGRP.GUI] All GUI created successfully!`);
sendNetworkEventToServer("agrp.guiReady", true);
};
@@ -76,7 +82,7 @@ function initGUI() {
// ===========================================================================
function closeAllWindows() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Closing all GUI windows`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Closing all GUI windows`);
infoDialog.window.shown = false;
yesNoDialog.window.shown = false;
errorDialog.window.shown = false;
@@ -89,6 +95,14 @@ function closeAllWindows() {
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;
@@ -157,13 +171,45 @@ function isAnyGUIActive() {
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, `[VRR.GUI] Received new GUI colours from server: ${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];
@@ -183,41 +229,45 @@ function hideAllGUI() {
// ===========================================================================
function processGUIKeyPress(keyCode) {
logToConsole(LOG_DEBUG, `[VRR.GUI] Processing key press: ${keyCode}`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Processing key press: ${keyCode}`);
if (!guiReady) {
return false;
}
if (!isAnyGUIActive()) {
logToConsole(LOG_DEBUG, `[VRR.GUI] GUI is not active. Cancelling keypress processing.`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] GUI is not active. Cancelling keypress processing.`);
return false;
}
if (keyCode == SDLK_RETURN || keyCode == SDLK_RETURN2) {
logToConsole(LOG_DEBUG, `[VRR.GUI] Key press is submit (${guiSubmitKey})`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Key press is submit (${guiSubmitKey})`);
if (guiSubmitKey != false) {
logToConsole(LOG_DEBUG, `[VRR.GUI] Calling submit key function`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Calling submit key function`);
guiSubmitKey.call();
}
} else if (keyCode == getKeyIdFromParams("left") || keyCode == getKeyIdFromParams("a")) {
logToConsole(LOG_DEBUG, `[VRR.GUI] Key press is left (${guiLeftKey})`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Key press is left (${guiLeftKey})`);
if (guiLeftKey != false) {
logToConsole(LOG_DEBUG, `[VRR.GUI] Calling left key function`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Calling left key function`);
guiLeftKey.call();
}
} else if (keyCode == getKeyIdFromParams("right") || keyCode == getKeyIdFromParams("d")) {
logToConsole(LOG_DEBUG, `[VRR.GUI] Key press is right (${guiRightKey})`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Key press is right (${guiRightKey})`);
if (guiRightKey != false) {
logToConsole(LOG_DEBUG, `[VRR.GUI] Calling right key function`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Calling right key function`);
guiRightKey.call();
}
} else if (keyCode == getKeyIdFromParams("down") || keyCode == getKeyIdFromParams("s")) {
logToConsole(LOG_DEBUG, `[VRR.GUI] Key press is down (${guiDownKey})`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Key press is down (${guiDownKey})`);
if (guiDownKey != false) {
logToConsole(LOG_DEBUG, `[VRR.GUI] Calling down key function`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Calling down key function`);
guiDownKey.call();
}
} else if (keyCode == getKeyIdFromParams("up") || keyCode == getKeyIdFromParams("w")) {
logToConsole(LOG_DEBUG, `[VRR.GUI] Key press is up (${guiUpKey})`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Key press is up (${guiUpKey})`);
if (guiUpKey != false) {
logToConsole(LOG_DEBUG, `[VRR.GUI] Calling up key function`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Calling up key function`);
guiUpKey.call();
}
}
@@ -234,6 +284,10 @@ function processToggleGUIKeyPress(keyCode) {
// ===========================================================================
function resetGUIStrings() {
if (!guiReady) {
return false;
}
// Login GUI
login.messageLabel.text = getLocaleString("GUILoginWindowLabelEnterPassword");
login.passwordInput.placeholder = getLocaleString("GUILoginWindowPasswordPlaceholder");
@@ -277,4 +331,16 @@ function resetGUIStrings() {
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;
}
}
}
// ===========================================================================

View File

@@ -21,7 +21,7 @@ let twoFactorAuth = {
// ===========================================================================
function initTwoFactorAuthenticationGUI() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Creating two factor auth GUI ...`);
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),
@@ -95,14 +95,14 @@ function initTwoFactorAuthenticationGUI() {
},
}, checkTwoFactorAuth);
logToConsole(LOG_DEBUG, `[VRR.GUI] Created two factor auth GUI`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Created two factor auth GUI`);
}
// ===========================================================================
function showTwoFactorAuthGUI() {
closeAllWindows();
logToConsole(LOG_DEBUG, `[VRR.GUI] Showing two-factor authentication window`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Showing two-factor authentication window`);
setChatWindowEnabled(false);
mexui.setInput(true);
twoFactorAuth.window.shown = true;
@@ -113,7 +113,7 @@ function showTwoFactorAuthGUI() {
// ===========================================================================
function twoFactorAuthFailed(errorMessage) {
logToConsole(LOG_DEBUG, `[VRR.GUI] Server reports two-factor authentication failed. Reason: ${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 = "";
@@ -122,14 +122,14 @@ function twoFactorAuthFailed(errorMessage) {
// ===========================================================================
function twoFactorAuthSuccess() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Server reports two-factor authentication was successful`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Server reports two-factor authentication was successful`);
closeAllWindows();
}
// ===========================================================================
function checkTwoFactorAuth() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Checking two-factor authentication with server ...`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Checking two-factor authentication with server ...`);
sendNetworkEventToServer("agrp.2fa", twoFactorAuth.codeInput.lines[0]);
}

View File

@@ -6,4 +6,80 @@
// 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

@@ -20,7 +20,7 @@ let passwordChange = {
// ===========================================================================
function initChangePasswordGUI() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Creating password change GUI ...`);
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),
@@ -111,13 +111,13 @@ function initChangePasswordGUI() {
borderColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
},
}, checkChangePassword);
logToConsole(LOG_DEBUG, `[VRR.GUI] Created change password GUI`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Created change password GUI`);
}
// ===========================================================================
function passwordChangeFailed(errorMessage) {
logToConsole(LOG_DEBUG, `[VRR.GUI] Server reports change password failed. Reason: ${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 = "";
@@ -128,14 +128,14 @@ function passwordChangeFailed(errorMessage) {
// ===========================================================================
function checkChangePassword() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Checking password change with server ...`);
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, `[VRR.GUI] Showing change password window`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Showing change password window`);
closeAllWindows();
setChatWindowEnabled(false);
mexui.setInput(true);
@@ -150,7 +150,7 @@ function showChangePasswordGUI(errorMessage) {
// ===========================================================================
function passwordChangeSuccess() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Server reports password change was successful`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Server reports password change was successful`);
guiSubmitKey = false;
closeAllWindows();
}

View File

@@ -24,7 +24,7 @@ let characterSelect = {
// ===========================================================================
function initCharacterSelectGUI() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Creating character select GUI ...`);
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),
@@ -151,18 +151,18 @@ function initCharacterSelectGUI() {
borderColour: toColour(0, 0, 0, 0),
}
});
logToConsole(LOG_DEBUG, `[VRR.GUI] Created character select GUI`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Created character select GUI`);
}
// ===========================================================================
function showCharacterSelectGUI(firstName, lastName, cash, clan, lastPlayed, skinId) {
closeAllWindows();
logToConsole(LOG_DEBUG, `[VRR.GUI] Showing character selection window`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Showing character selection window`);
setChatWindowEnabled(false);
mexui.setInput(true);
characterSelect.nameText.text = `${firstName} ${lastName}`;
characterSelect.cashText.text = `Money: $${cash}`;
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");
@@ -179,39 +179,39 @@ function showCharacterSelectGUI(firstName, lastName, cash, clan, lastPlayed, ski
function showNewCharacter() {
closeAllWindows();
logToConsole(LOG_DEBUG, `[VRR.GUI] Showing new character dialog window`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Showing new character dialog window`);
showNewCharacterGUI();
}
// ===========================================================================
function selectNextCharacter() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Requesting next character info from server for character select window`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Requesting next character info from server for character select window`);
sendNetworkEventToServer("agrp.nextCharacter");
}
// ===========================================================================
function selectPreviousCharacter() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Requesting previous character info from server for character select window`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Requesting previous character info from server for character select window`);
sendNetworkEventToServer("agrp.previousCharacter");
}
// ===========================================================================
function selectThisCharacter() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Tell server the current shown character was selected in character select window`);
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, `[VRR.GUI] Updating character info with data from server`);
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: $${cash}`;
characterSelect.cashText.text = `Money: ${getCurrencyString(cash)}`;
characterSelect.clanText.text = `Clan: ${clan}`;
characterSelect.lastPlayedText.text = `Last Played: ${lastPlayed}`;
@@ -230,7 +230,7 @@ function switchCharacterSelectGUI(firstName, lastName, cash, clan, lastPlayed, s
// ===========================================================================
function characterSelectSuccess() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Server reports character selection was successful`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Server reports character selection was successful`);
closeAllWindows();
}

View File

@@ -10,12 +10,16 @@
let clanManager = {
window: null,
generalTab: null,
ranksTab: null,
membersTab: null,
vehiclesTab: null,
businessesTab: null,
housesTab: null,
generalTabButton: null,
ranksTabButton: null,
membersTabButton: null,
vehiclesTabButton: null,
businessesTabButton: null,
housesTabButton: null,
};
// ===========================================================================
// ===========================================================================
function initClanManagerGUI() {
}

View File

@@ -17,7 +17,7 @@ let errorDialog = {
// ===========================================================================
function initErrorDialogGUI() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Creating error GUI ...`);
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),
@@ -59,14 +59,14 @@ function initErrorDialogGUI() {
borderColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], 255),
},
}, closeErrorDialog);
logToConsole(LOG_DEBUG, `[VRR.GUI] Created error GUI ...`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Created error GUI ...`);
}
// ===========================================================================
function showErrorGUI(errorMessage, errorTitle, buttonText) {
closeAllWindows();
logToConsole(LOG_DEBUG, `[VRR.GUI] Showing error window. Error: ${errorTitle} - ${errorMessage}`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Showing error window. Error: ${errorTitle} - ${errorMessage}`);
setChatWindowEnabled(false);
mexui.setInput(true);
errorDialog.messageLabel.text = errorMessage;
@@ -78,7 +78,7 @@ function showErrorGUI(errorMessage, errorTitle, buttonText) {
// ===========================================================================
function closeErrorDialog() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Closing error dialog`);
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

@@ -23,7 +23,7 @@ let dealerCards = [];
function initBlackJackGUI() {
// Render a blackjack game in MexUI
//logToConsole(LOG_DEBUG, `[VRR.GUI] Creating blackjack GUI ...`);
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),
@@ -43,7 +43,7 @@ function initBlackJackGUI() {
blackJackGUI.window.shown = false;
//logToConsole(LOG_DEBUG, `[VRR.GUI] Created blackjack GUI`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Created blackjack GUI`);
}
// ===========================================================================

View File

@@ -17,7 +17,7 @@ let infoDialog = {
// ===========================================================================
function initInfoDialogGUI() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Creating info dialog GUI ...`);
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),
@@ -58,13 +58,13 @@ function initInfoDialogGUI() {
borderColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], 255),
},
}, closeInfoDialog);
logToConsole(LOG_DEBUG, `[VRR.GUI] Created info dialog GUI`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Created info dialog GUI`);
}
// ===========================================================================
function closeInfoDialog() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Closing info dialog`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Closing info dialog`);
infoDialog.window.shown = false;
mexui.setInput(false);
}
@@ -73,7 +73,7 @@ function closeInfoDialog() {
function showInfoGUI(infoMessage, infoTitle, buttonText) {
closeAllWindows();
logToConsole(LOG_DEBUG, `[VRR.GUI] Showing info dialog window. Info: ${infoTitle} - ${infoMessage}`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Showing info dialog window. Info: ${infoTitle} - ${infoMessage}`);
mexui.setInput(true);
infoDialog.messageLabel.text = infoMessage;
infoDialog.okayButton.text = buttonText;

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);
}
// ===========================================================================

View File

@@ -12,12 +12,14 @@ let listDialog = {
window: null,
messageLabel: null,
listGrid: null,
listRows: [],
};
// ===========================================================================
function initListGUI() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Creating list dialog GUI ...`);
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),
@@ -71,14 +73,14 @@ function initListGUI() {
}
}
});
logToConsole(LOG_DEBUG, `[VRR.GUI] Created list dialog GUI`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Created list dialog GUI`);
}
// ===========================================================================
function showListGUI() {
closeAllWindows();
logToConsole(LOG_DEBUG, `[VRR.GUI] Showing login window`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Showing list window`);
setChatWindowEnabled(false);
mexui.setInput(true);
listDialog.window.shown = true;
@@ -90,19 +92,56 @@ function showListGUI() {
// ===========================================================================
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

@@ -20,7 +20,7 @@ let flagImageGap = toVector2(5, 5);
// ===========================================================================
function initLocaleChooserGUI() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Creating locale chooser GUI ...`);
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),
@@ -40,15 +40,13 @@ function initLocaleChooserGUI() {
localeChooser.window.shown = false;
loadLocaleConfig();
logToConsole(LOG_DEBUG, `[VRR.GUI] Created locale chooser GUI`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Created locale chooser GUI`);
}
// ===========================================================================
function closeLocaleChooserGUI() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Closing locale chooser window`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Closing locale chooser window`);
localeChooser.window.shown = false;
for (let i in localeChooser.flagImages) {
localeChooser.flagImages[i].shown = false;
@@ -59,9 +57,6 @@ function closeLocaleChooserGUI() {
// ===========================================================================
function showLocaleChooserGUI(position = toVector2(0.0, 0.0)) {
// Disabled for now until image loading crash can be fixed
return false;
if (position.x != 0.0 && position.y != 0.0) {
localeChooser.window.position = position;
} else {
@@ -69,7 +64,7 @@ function showLocaleChooserGUI(position = toVector2(0.0, 0.0)) {
}
//closeAllWindows();
logToConsole(LOG_DEBUG, `[VRR.GUI] Showing locale chooser window`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Showing locale chooser window`);
mexui.setInput(true);
localeChooser.window.shown = true;
@@ -81,7 +76,7 @@ function showLocaleChooserGUI(position = toVector2(0.0, 0.0)) {
// ===========================================================================
function toggleLocaleChooserGUI() {
if (localeChooser.window.shown) {
if (localeChooser.window.shown == true) {
closeLocaleChooserGUI();
} else {
showLocaleChooserGUI();
@@ -91,14 +86,14 @@ function toggleLocaleChooserGUI() {
// ===========================================================================
function localeChooserSetLocale(localeId) {
logToConsole(LOG_DEBUG | LOG_WARN, `[VRR.GUI] Asking server to change locale to ${localeId}`);
logToConsole(LOG_DEBUG | LOG_WARN, `[AGRP.GUI] Asking server to change locale to ${localeId}`);
sendLocaleSelectToServer(localeId);
}
// ===========================================================================
function resetLocaleChooserOptions() {
logToConsole(LOG_DEBUG | LOG_WARN, `[VRR.GUI] Resetting locale chooser options`);
logToConsole(LOG_DEBUG | LOG_WARN, `[AGRP.GUI] Resetting locale chooser options`);
// let tempLocaleOptions = getServerData().localeOptions; // getAvailableLocaleOptions();
let tempLocaleOptions = getAvailableLocaleOptions();
@@ -122,7 +117,7 @@ function resetLocaleChooserOptions() {
localeChooser.flagImages[i].shown = false;
logToConsole(LOG_DEBUG | LOG_WARN, `[VRR.GUI] Created locale chooser option ${tempLocaleOptions[i].englishName} with image ${imagePath}`);
logToConsole(LOG_DEBUG | LOG_WARN, `[AGRP.GUI] Created locale chooser option ${tempLocaleOptions[i].englishName} with image ${imagePath}`);
//localeChooser.activeRingImages.push(activeRingImage);
}

View File

@@ -43,7 +43,7 @@ let loginHTML =
// ===========================================================================
function initLoginGUI() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Creating login GUI ...`);
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),
@@ -109,7 +109,7 @@ function initLoginGUI() {
login.loginButton = login.window.button(20, 205, 260, 30, 'LOGIN', {
main: {
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
textColour: toColour(0, 0, 0, 255),
textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255),
textSize: 12.0,
textFont: mainFont,
textAlign: 0.5,
@@ -122,7 +122,7 @@ function initLoginGUI() {
login.forgotPasswordButton = login.window.button(180, 240, 100, 15, 'RESET PASS', {
main: {
backgroundColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
textColour: toColour(0, 0, 0, 255),
textColour: toColour(primaryTextColour[0], primaryTextColour[1], primaryTextColour[2], 255),
textSize: 8.0,
textFont: mainFont,
textAlign: 0.5,
@@ -144,14 +144,14 @@ function initLoginGUI() {
},
});
logToConsole(LOG_DEBUG, `[VRR.GUI] Created login GUI`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Created login GUI`);
}
// ===========================================================================
function showLoginGUI() {
closeAllWindows();
logToConsole(LOG_DEBUG, `[VRR.GUI] Showing login window`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Showing login window`);
setChatWindowEnabled(false);
mexui.setInput(true);
login.window.shown = true;
@@ -165,14 +165,14 @@ function showLoginGUI() {
// ===========================================================================
function checkLogin() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Checking login with server ...`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Checking login with server ...`);
sendNetworkEventToServer("agrp.checkLogin", login.passwordInput.lines[0]);
}
// ===========================================================================
function loginFailed(errorMessage) {
logToConsole(LOG_DEBUG, `[VRR.GUI] Server reports login failed`);
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 = "";
@@ -181,7 +181,7 @@ function loginFailed(errorMessage) {
// ===========================================================================
function loginSuccess() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Server reports login was successful`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Server reports login was successful`);
guiSubmitKey = false;
closeAllWindows();
}
@@ -190,7 +190,7 @@ function loginSuccess() {
function switchToPasswordResetGUI() {
//closeAllWindows();
//logToConsole(LOG_DEBUG, `[VRR.GUI] Showing password reset dialog window`);
//logToConsole(LOG_DEBUG, `[AGRP.GUI] Showing password reset dialog window`);
//showResetPasswordGUI();
sendNetworkEventToServer("agrp.checkResetPassword", "");
return false;

View File

@@ -20,7 +20,7 @@ let newCharacter = {
// ===========================================================================
function initNewCharacterGUI() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Creating new character GUI ...`);
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),
@@ -111,13 +111,13 @@ function initNewCharacterGUI() {
borderColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
},
}, checkNewCharacter);
logToConsole(LOG_DEBUG, `[VRR.GUI] Created new character GUI`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Created new character GUI`);
}
// ===========================================================================
function newCharacterFailed(errorMessage) {
logToConsole(LOG_DEBUG, `[VRR.GUI] Server reports new character creation failed. Reason: ${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 = "";
@@ -135,7 +135,7 @@ function newCharacterFailed(errorMessage) {
// ===========================================================================
function checkNewCharacter() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Checking new character with server ...`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Checking new character with server ...`);
if (newCharacter.firstNameInput.lines[0].length < 2) {
return false;
}
@@ -153,7 +153,7 @@ function checkNewCharacter() {
// ===========================================================================
function showNewCharacterGUI() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Showing new character window`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Showing new character window`);
closeAllWindows();
setChatWindowEnabled(false);
mexui.setInput(true);

View File

@@ -21,7 +21,7 @@ let register = {
// ===========================================================================
function initRegisterGUI() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Creating register GUI ...`);
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),
@@ -131,13 +131,13 @@ function initRegisterGUI() {
borderColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], buttonAlpha),
},
}, checkRegistration);
logToConsole(LOG_DEBUG, `[VRR.GUI] Created register GUI`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Created register GUI`);
}
// ===========================================================================
function registrationFailed(errorMessage) {
logToConsole(LOG_DEBUG, `[VRR.GUI] Server reports registration failed. Reason: ${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 = "";
@@ -148,14 +148,14 @@ function registrationFailed(errorMessage) {
// ===========================================================================
function checkRegistration() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Checking registration with server ...`);
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, `[VRR.GUI] Showing registration window`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Showing registration window`);
closeAllWindows();
setChatWindowEnabled(false);
mexui.setInput(true);
@@ -171,7 +171,7 @@ function showRegistrationGUI() {
// ===========================================================================
function registrationSuccess() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Server reports registration was successful`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Server reports registration was successful`);
guiSubmitKey = false;
closeAllWindows();
}

View File

@@ -21,7 +21,7 @@ let passwordReset = {
// ===========================================================================
function initResetPasswordGUI() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Creating password reset GUI ...`);
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),
@@ -121,14 +121,14 @@ function initResetPasswordGUI() {
},
});
logToConsole(LOG_DEBUG, `[VRR.GUI] Created password reset GUI`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Created password reset GUI`);
}
// ===========================================================================
function showResetPasswordGUI() {
closeAllWindows();
logToConsole(LOG_DEBUG, `[VRR.GUI] Showing password reset window`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Showing password reset window`);
setChatWindowEnabled(false);
mexui.setInput(true);
passwordReset.window.shown = true;
@@ -142,14 +142,14 @@ function showResetPasswordGUI() {
// ===========================================================================
function checkResetPassword() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Checking password reset with server (${passwordReset.emailInput.lines[0]}) ...`);
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, `[VRR.GUI] Server reports password reset failed`);
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 = "";
@@ -158,7 +158,7 @@ function resetPasswordFailed(errorMessage) {
// ===========================================================================
function resetPasswordCodeInputGUI() {
logToConsole(LOG_DEBUG | LOG_WARN, `[VRR.GUI] Server reports password reset email confirmation was successful. Asking for code ...`);
logToConsole(LOG_DEBUG | LOG_WARN, `[AGRP.GUI] Server reports password reset email confirmation was successful. Asking for code ...`);
closeAllWindows();
passwordReset.messageLabel.text = getLocaleString("GUIResetPasswordCodeInputLabel");
@@ -173,7 +173,7 @@ function resetPasswordCodeInputGUI() {
// ===========================================================================
function resetPasswordEmailInputGUI() {
logToConsole(LOG_DEBUG | LOG_WARN, `[VRR.GUI] Server reports password reset request was approved. Asking for email ...`);
logToConsole(LOG_DEBUG | LOG_WARN, `[AGRP.GUI] Server reports password reset request was approved. Asking for email ...`);
closeAllWindows();
passwordReset.messageLabel.text = getLocaleString("GUIResetPasswordConfirmEmailLabel");

View File

@@ -19,7 +19,7 @@ let yesNoDialog = {
// ===========================================================================
function initYesNoDialogGUI() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Created prompt GUI ...`);
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),
@@ -74,14 +74,14 @@ function initYesNoDialogGUI() {
borderColour: toColour(primaryColour[0], primaryColour[1], primaryColour[2], 255),
},
}, yesNoDialogAnswerNo);
logToConsole(LOG_DEBUG, `[VRR.GUI] Created prompt GUI`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Created prompt GUI`);
}
// ===========================================================================
function showYesNoPromptGUI(promptMessage, promptTitle, yesButtonText, noButtonText) {
closeAllWindows();
logToConsole(LOG_DEBUG, `[VRR.GUI] Showing prompt window. Prompt: ${promptTitle} - ${promptMessage}`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Showing prompt window. Prompt: ${promptTitle} - ${promptMessage}`);
mexui.setInput(true);
yesNoDialog.messageLabel.text = "";
@@ -100,7 +100,7 @@ function showYesNoPromptGUI(promptMessage, promptTitle, yesButtonText, noButtonT
// ===========================================================================
function yesNoDialogAnswerNo() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Responding with answer NO to server prompt`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Responding with answer NO to server prompt`);
sendNetworkEventToServer("agrp.promptAnswerNo");
closeAllWindows();
}
@@ -108,7 +108,7 @@ function yesNoDialogAnswerNo() {
// ===========================================================================
function yesNoDialogAnswerYes() {
logToConsole(LOG_DEBUG, `[VRR.GUI] Responding with answer YES to server prompt`);
logToConsole(LOG_DEBUG, `[AGRP.GUI] Responding with answer YES to server prompt`);
sendNetworkEventToServer("agrp.promptAnswerYes");
closeAllWindows();
}

View File

@@ -17,16 +17,19 @@ class HouseData {
this.blipModel = blipModel;
this.pickupModel = pickupModel;
this.hasInterior = hasInterior;
this.rentPrice = 0;
this.buyPrice = 0;
this.blipId = -1;
this.locked = false;
}
}
// ===========================================================================
function receiveHouseFromServer(houseId, description, entrancePosition, blipModel, pickupModel, hasInterior) {
logToConsole(LOG_DEBUG, `[VRR.House] Received house ${houseId} (${name}) from server`);
function receiveHouseFromServer(houseId, description, entrancePosition, blipModel, pickupModel, buyPrice, rentPrice, hasInterior, locked) {
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) {
let houseData = getHouseData(houseId);
houseData.description = description;
@@ -34,11 +37,24 @@ function receiveHouseFromServer(houseId, description, entrancePosition, blipMode
houseData.blipModel = blipModel;
houseData.pickupModel = pickupModel;
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) {
houseData.labelInfoType = AGRP_PROPLABEL_INFO_BUYHOUSE;
} else {
if (houseData.rentPrice > 0) {
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, `[VRR.House] House ${houseId}'s blip has been removed by the server`);
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);
} else {
@@ -46,11 +62,11 @@ function receiveHouseFromServer(houseId, description, entrancePosition, blipMode
}
houseData.blipId = -1;
} else {
logToConsole(LOG_DEBUG, `[VRR.House] House ${houseId}'s blip is unchanged`);
logToConsole(LOG_DEBUG, `[AGRP.House] House ${houseId}'s blip is unchanged`);
}
} else {
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() == AGRP_GAME_GTA_IV) {
natives.setBlipCoordinates(houseData.blipId, houseData.entrancePosition);
natives.changeBlipSprite(houseData.blipId, houseData.blipModel);
@@ -63,20 +79,20 @@ function receiveHouseFromServer(houseId, description, entrancePosition, blipMode
if (blipId != -1) {
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 {
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);
if (blipModel != -1) {
let blipId = createGameBlip(tempHouseData.blipModel, tempHouseData.entrancePosition, "House");
if (blipId != -1) {
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 {
logToConsole(LOG_DEBUG, `[VRR.House] House ${houseId} has no blip.`);
logToConsole(LOG_DEBUG, `[AGRP.House] House ${houseId} has no blip.`);
}
getServerData().houses.push(tempHouseData);
setAllHouseDataIndexes();

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

@@ -17,8 +17,8 @@ let itemActionDelaySize = toVector2(200, 5);
// ===========================================================================
function initItemScript() {
logToConsole(LOG_DEBUG, "[VRR.Item]: Initializing item script ...");
logToConsole(LOG_DEBUG, "[VRR.Item]: Item script initialized!");
logToConsole(LOG_DEBUG, "[AGRP.Item]: Initializing item script ...");
logToConsole(LOG_DEBUG, "[AGRP.Item]: Item script initialized!");
}
// ===========================================================================
@@ -48,7 +48,7 @@ function processItemActionRendering() {
// ===========================================================================
function updatePlayerHotBar(activeSlot, itemsArray) {
logToConsole(LOG_DEBUG, `[VRR.Main] Updating hotbar`);
logToConsole(LOG_DEBUG, `[AGRP.Main] Updating hotbar`);
}
// ===========================================================================

View File

@@ -36,28 +36,28 @@ class JobData {
// ===========================================================================
function initJobScript() {
logToConsole(LOG_DEBUG, "[VRR.Job]: Initializing job script ...");
logToConsole(LOG_DEBUG, "[VRR.Job]: Job script initialized!");
logToConsole(LOG_DEBUG, "[AGRP.Job]: Initializing job script ...");
logToConsole(LOG_DEBUG, "[AGRP.Job]: Job script initialized!");
}
// ===========================================================================
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;
}
// ===========================================================================
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;
}
// ===========================================================================
function showJobRouteLocation(position, colour) {
logToConsole(LOG_DEBUG, `[VRR.Job] Showing job route location at ${position.x}, ${position.y}, ${position.z}`);
logToConsole(LOG_DEBUG, `[AGRP.Job] Showing job route location at ${position.x}, ${position.y}, ${position.z}`);
hideJobRouteLocation();
if (getMultiplayerMod() == AGRP_MPMOD_GTAC) {
if (getGame() == AGRP_GAME_GTA_SA) {
@@ -81,7 +81,7 @@ function showJobRouteLocation(position, colour) {
// ===========================================================================
function enteredJobRouteSphere() {
logToConsole(LOG_DEBUG, `[VRR.Job] Entered job route sphere`);
logToConsole(LOG_DEBUG, `[AGRP.Job] Entered job route sphere`);
hideJobRouteLocation();
tellServerPlayerArrivedAtJobRouteLocation();
}
@@ -115,7 +115,7 @@ function blinkJobRouteLocationBlip(times, position, colour) {
// ===========================================================================
function hideJobRouteLocation() {
logToConsole(LOG_DEBUG, `[VRR.Job] Hiding job route location`);
logToConsole(LOG_DEBUG, `[AGRP.Job] Hiding job route location`);
if (jobRouteLocationBlip != null) {
destroyElement(jobRouteLocationBlip);
@@ -138,9 +138,9 @@ function hideJobRouteLocation() {
// ===========================================================================
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() == AGRP_GAME_GTA_IV) {
if (!areServerElementsSupported() || getGame() == AGRP_GAME_MAFIA_ONE || getGame() == AGRP_GAME_GTA_IV) {
if (getJobData(jobId) != false) {
let jobData = getJobData(jobId);
jobData.jobLocationId = jobLocationId;
@@ -149,10 +149,10 @@ function receiveJobFromServer(jobId, jobLocationId, name, position, blipModel, p
jobData.blipModel = blipModel;
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 (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() == AGRP_GAME_GTA_IV) {
natives.removeBlipAndClearIndex(getJobData(jobId).blipId);
} else {
@@ -160,11 +160,11 @@ function receiveJobFromServer(jobId, jobLocationId, name, position, blipModel, p
}
jobData.blipId = -1;
} else {
logToConsole(LOG_DEBUG, `[VRR.Job] Job ${jobId}'s blip is unchanged`);
logToConsole(LOG_DEBUG, `[AGRP.Job] Job ${jobId}'s blip is unchanged`);
}
} else {
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() == AGRP_GAME_GTA_IV) {
natives.setBlipCoordinates(jobData.blipId, jobData.position);
natives.changeBlipSprite(jobData.blipId, jobData.blipModel);
@@ -177,20 +177,20 @@ function receiveJobFromServer(jobId, jobLocationId, name, position, blipModel, p
if (blipId != -1) {
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 {
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);
if (blipModel != -1) {
let blipId = createGameBlip(blipModel, tempJobData.position, tempJobData.name);
if (blipId != -1) {
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 {
logToConsole(LOG_DEBUG, `[VRR.Job] Job ${jobId} has no blip.`);
logToConsole(LOG_DEBUG, `[AGRP.Job] Job ${jobId} has no blip.`);
}
getServerData().jobs.push(tempJobData);
setAllJobDataIndexes();

View File

@@ -17,14 +17,14 @@ let keyBindLongHoldDuration = 1500;
// ===========================================================================
function initKeyBindScript() {
logToConsole(LOG_DEBUG, "[VRR.KeyBind]: Initializing key bind script ...");
logToConsole(LOG_DEBUG, "[VRR.KeyBind]: Key bind script initialized!");
logToConsole(LOG_DEBUG, "[AGRP.KeyBind]: Initializing key bind script ...");
logToConsole(LOG_DEBUG, "[AGRP.KeyBind]: Key bind script initialized!");
}
// ===========================================================================
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));
bindKey(toInteger(key), keyState, function (event) {
if (isAnyGUIActive()) {
@@ -33,14 +33,14 @@ function bindAccountKey(key, keyState) {
if (hasKeyBindDelayElapsed()) {
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;
tellServerPlayerUsedKeyBind(key);
} 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 {
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!`);
}
});
}
@@ -48,7 +48,7 @@ function bindAccountKey(key, keyState) {
// ===========================================================================
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);
keyBinds.splice(keyBinds.indexOf(key), 1);
return true;

View File

@@ -14,7 +14,12 @@ let jobLabels = [];
let propertyLabelNameFont = null;
let propertyLabelLockedFont = null;
let propertyLabelHeight = 1.0;
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;
@@ -23,21 +28,15 @@ let unlockedColour = toColour(50, 205, 50, 255);
let lockedColour = toColour(205, 92, 92, 255);
let jobHelpColour = toColour(234, 198, 126, 255);
let renderLabelDistance = 7.5;
let propertyLabelLockedOffset = 16;
let propertyLabelNameOffset = 18;
let propertyLabelPriceOffset = 16;
// ===========================================================================
function initLabelScript() {
logToConsole(LOG_DEBUG, "[VRR.Label]: Initializing label script ...");
logToConsole(LOG_DEBUG, "[AGRP.Label]: Initializing label script ...");
propertyLabelNameFont = initLabelPropertyNameFont();
propertyLabelLockedFont = initLabelPropertyLockedFont();
jobNameLabelFont = initLabelJobNameFont();
jobHelpLabelFont = initLabelJobHelpFont();
logToConsole(LOG_DEBUG, "[VRR.Label]: Label script initialized!");
logToConsole(LOG_DEBUG, "[AGRP.Label]: Label script initialized!");
}
// ===========================================================================
@@ -66,7 +65,7 @@ function initLabelJobHelpFont() {
// ===========================================================================
function renderPropertyEntranceLabel(name, position, locked, isBusiness, price, rentPrice, labelInfoType) {
function renderPropertyEntranceLabel(name, position, locked, isBusiness, price, rentPrice, labelInfoType, fee) {
if (localPlayer == null) {
return false;
}
@@ -81,32 +80,33 @@ function renderPropertyEntranceLabel(name, position, locked, isBusiness, price,
if (getGame() == AGRP_GAME_GTA_IV) {
if (!natives.doesViewportExist(natives.getGameViewportId())) {
logToConsole(LOG_INFO, "[VRR.Label]: Game viewport does not exist!");
logToConsole(LOG_INFO, "[AGRP.Label]: Game viewport does not exist!");
return false;
}
if (!natives.isViewportActive(natives.getGameViewportId())) {
logToConsole(LOG_INFO, "[VRR.Label]: Game viewport is not active!");
logToConsole(LOG_INFO, "[AGRP.Label]: Game viewport is not active!");
return false;
}
}
let tempPosition = position;
tempPosition.z = tempPosition.z + propertyLabelHeight;
position = getPosAbovePos(position, propertyLabelHeight);
let screenPosition = new Vec3(0.0, 0.0, 0.0);
if (getGame() == AGRP_GAME_GTA_IV) {
screenPosition = natives.getViewportPositionOfCoord(tempPosition, natives.getGameViewportId());
screenPosition = natives.getViewportPositionOfCoord(position, natives.getGameViewportId());
} else {
screenPosition = getScreenFromWorldPosition(tempPosition);
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 (price > "0") {
text = getLocaleString("PropertyForSaleLabel", price);
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);
@@ -114,8 +114,17 @@ function renderPropertyEntranceLabel(name, position, locked, isBusiness, price,
}
text = "";
if (rentPrice != "0") {
text = getLocaleString("PropertyForRentLabel", rentPrice);
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);
@@ -174,7 +183,7 @@ function renderPropertyEntranceLabel(name, position, locked, isBusiness, price,
break;
}
}
if (getDistance(localPlayer.position, position) <= renderLabelDistance - 2) {
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;
@@ -212,12 +221,12 @@ function renderPropertyExitLabel(position) {
if (getGame() == AGRP_GAME_GTA_IV) {
if (!natives.doesViewportExist(natives.getGameViewportId())) {
logToConsole(LOG_INFO, "[VRR.Label]: Game viewport does not exist!");
logToConsole(LOG_INFO, "[AGRP.Label]: Game viewport does not exist!");
return false;
}
if (!natives.isViewportActive(natives.getGameViewportId())) {
logToConsole(LOG_INFO, "[VRR.Label]: Game viewport is not active!");
logToConsole(LOG_INFO, "[AGRP.Label]: Game viewport is not active!");
return false;
}
}
@@ -257,12 +266,12 @@ function renderJobLabel(name, position, jobType) {
if (getGame() == AGRP_GAME_GTA_IV) {
if (!natives.doesViewportExist(natives.getGameViewportId())) {
logToConsole(LOG_INFO, "[VRR.Label]: Game viewport does not exist!");
logToConsole(LOG_INFO, "[AGRP.Label]: Game viewport does not exist!");
return false;
}
if (!natives.isViewportActive(natives.getGameViewportId())) {
logToConsole(LOG_INFO, "[VRR.Label]: Game viewport is not active!");
logToConsole(LOG_INFO, "[AGRP.Label]: Game viewport is not active!");
return false;
}
}
@@ -309,26 +318,41 @@ function renderJobLabel(name, position, jobType) {
function processLabelRendering() {
if (renderLabels) {
if (!areServerElementsSupported()) {
if (!areServerElementsSupported() || getGame() == AGRP_GAME_MAFIA_ONE) {
if (localPlayer != null) {
getServerData().businesses.forEach((business) => {
if (getDistance(localPlayer.position, business.entrancePosition) <= 75.0) {
natives.drawColouredCylinder(getPosBelowPos(business.entrancePosition, 1.0), 0.0, 0.0, 0, 153, 255, 255);
//renderPropertyEntranceLabel(business.name, business.entrancePosition, business.locked, true, makeLargeNumberReadable(business.price), makeLargeNumberReadable(business.rentPrice), business.labelInfoType);
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) <= 75.0) {
natives.drawColouredCylinder(getPosBelowPos(house.entrancePosition, 1.0), 0.0, 0.0, 0, 200, 0, 255);
//renderPropertyEntranceLabel("House", house.entrancePosition, house.locked, true, makeLargeNumberReadable(house.price), makeLargeNumberReadable(house.rentPrice), 0);
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) <= 75.0) {
natives.drawColouredCylinder(getPosBelowPos(job.position, 1.0), 0.0, 0.0, 255, 255, 0, 255);
//renderJobLabel(job.name, job.position, job.jobType);
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);
}
});
}
@@ -339,26 +363,30 @@ function processLabelRendering() {
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) <= renderLabelDistance) {
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 = makeLargeNumberReadable(pickups[i].getData("agrp.label.price"));
price = pickups[i].getData("agrp.label.price");
}
if (pickups[i].getData("agrp.label.rentprice") != null) {
rentPrice = makeLargeNumberReadable(pickups[i].getData("agrp.label.rentprice"));
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);
renderPropertyEntranceLabel(pickups[i].getData("agrp.label.name"), pickups[i].position, pickups[i].getData("agrp.label.locked"), true, price, rentPrice, labelInfoType, fee);
break;
}

View File

@@ -35,10 +35,10 @@ function getAvailableLocaleOptions() {
// ===========================================================================
function loadLocaleConfig() {
let configFile = loadTextFile("config/client/locale.json");
let configFile = getContentsOfTextFile("config/client/locale.json");
getServerData().localeOptions = JSON.parse(configFile);
resetLocaleChooserOptions();
//resetLocaleChooserOptions();
loadAllLocaleStrings();
}
@@ -47,11 +47,12 @@ function loadLocaleConfig() {
function loadAllLocaleStrings() {
let localeOptions = getServerData().localeOptions;
for (let i in localeOptions) {
logToConsole(LOG_INFO, `[VRR.Locale] Loading locale strings for ${localeOptions[i].englishName} (${i})`);
let localeFile = loadTextFile(`locale/${localeOptions[i].stringsFile}`);
let localeData = JSON.parse(localeFile);
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);
getServerData().localeStrings[i] = localeData;
let localeId = localeOptions[i].id;
getServerData().localeStrings[localeId] = localeStringData;
}
resetGUIStrings();
@@ -60,7 +61,7 @@ function loadAllLocaleStrings() {
// ===========================================================================
function setLocale(tempLocaleId) {
logToConsole(LOG_DEBUG, `[VRR.Locale] Setting locale to ${tempLocaleId} (${getServerData().localeOptions[tempLocaleId].englishName})`);
logToConsole(LOG_DEBUG, `[AGRP.Locale] Setting locale to ${tempLocaleId} (${getServerData().localeOptions[tempLocaleId].englishName})`);
localLocaleId = tempLocaleId;
resetGUIStrings();
}

View File

@@ -15,14 +15,18 @@ let logoSize = toVector2(128, 128);
// ===========================================================================
function initLogoScript() {
logToConsole(LOG_DEBUG, "[VRR.Logo]: Initializing logo script ...");
logToConsole(LOG_DEBUG, "[AGRP.Logo]: Initializing logo script ...");
//logoImage = loadLogoImage();
logToConsole(LOG_DEBUG, "[VRR.Logo]: Logo script initialized!");
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) {
@@ -36,6 +40,10 @@ function loadLogoImage() {
// ===========================================================================
function processLogoRendering() {
if (getGame() == AGRP_GAME_MAFIA_ONE) {
return false;
}
if (renderLogo) {
if (logoImage != null) {
graphics.drawRectangle(logoImage, logoPos, logoSize);
@@ -46,7 +54,7 @@ function processLogoRendering() {
// ===========================================================================
function setServerLogoRenderState(state) {
logToConsole(LOG_DEBUG, `[VRR.Main] Server logo ${(state) ? "enabled" : "disabled"}`);
logToConsole(LOG_DEBUG, `[AGRP.Main] Server logo ${(state) ? "enabled" : "disabled"}`);
renderLogo = state;
}

View File

@@ -23,10 +23,10 @@ let smallGameMessageTimer = null;
// ===========================================================================
function initMessagingScript() {
logToConsole(LOG_DEBUG, "[VRR.Messaging]: Initializing messaging script ...");
logToConsole(LOG_DEBUG, "[AGRP.Messaging]: Initializing messaging script ...");
smallGameMessageFonts = loadSmallGameMessageFonts();
bigGameMessageFonts = loadSmallGameMessageFonts();
logToConsole(LOG_DEBUG, "[VRR.Messaging]: Messaging script initialized!");
logToConsole(LOG_DEBUG, "[AGRP.Messaging]: Messaging script initialized!");
}
// ===========================================================================
@@ -39,6 +39,12 @@ function loadSmallGameMessageFonts() {
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["RobotoLight"] = lucasFont.createDefaultFont(20.0, "Roboto", "Light");
@@ -55,6 +61,12 @@ function loadBigGameMessageFont() {
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["RobotoLight"] = lucasFont.createDefaultFont(28.0, "Roboto", "Light");
@@ -64,10 +76,10 @@ function loadBigGameMessageFont() {
// ===========================================================================
function processSmallGameMessageRendering() {
logToConsole(LOG_VERBOSE, "[VRR.Messaging]: Processing small game message rendering ...");
logToConsole(LOG_VERBOSE, "[AGRP.Messaging]: Processing small game message rendering ...");
if (renderSmallGameMessage) {
if (smallGameMessageText != "") {
logToConsole(LOG_VERBOSE, `[VRR.Messaging]: Rendering small game message: ${smallGameMessageText}`);
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);
}
@@ -78,7 +90,7 @@ function processSmallGameMessageRendering() {
// ===========================================================================
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 != "") {
clearTimeout(smallGameMessageTimer);
}

View File

@@ -12,34 +12,29 @@
// CREDITS TO LUCASC190 FOR MAKING THE MOUSE CAMERA
// WALKING CODE ADDED BY VORTREX
function SetStandardControlsEnabled(bEnabled)
{
if(typeof gta == "undefined") {
function SetStandardControlsEnabled(bEnabled) {
if (typeof gta == "undefined") {
return false;
}
if (game.standardControls === undefined)
{
if (game.standardControls === undefined) {
logToConsole(LOG_WARN, "game.standardControls not implemented");
return;
}
game.standardControls = bEnabled;
}
function GetCurrentPlayerIndex()
{
function GetCurrentPlayerIndex() {
return 0;
}
function GetPlayerPed(uiIndex)
{
function GetPlayerPed(uiIndex) {
if (uiIndex >= 1)
throw new Error("player index out of range");
return localPlayer;
}
function GetPedVehicle(pPed)
{
function GetPedVehicle(pPed) {
return pPed.vehicle;
}
@@ -49,8 +44,7 @@ let ENTITYTYPE_PED = 3;
let ENTITYTYPE_OBJECT = 4;
let ENTITYTYPE_DUMMY = 5;
function GetEntityType(Entity)
{
function GetEntityType(Entity) {
if (Entity.isType(ELEMENT_BUILDING))
return ENTITYTYPE_BUILDING;
if (Entity.isType(ELEMENT_VEHICLE))
@@ -64,79 +58,66 @@ function GetEntityType(Entity)
return undefined;
}
function GetPlaceableMatrix(pPlaceable)
{
function GetPlaceableMatrix(pPlaceable) {
if (pPlaceable == GetCamera())
return game.cameraMatrix;
return pPlaceable.matrix;
}
function GetEntityModel(pEntity)
{
function GetEntityModel(pEntity) {
return pEntity;
}
function GetModelBoundingSphere(usModel)
{
function GetModelBoundingSphere(usModel) {
return [usModel.boundingRadius, usModel.boundingCentre.x, usModel.boundingCentre.y, usModel.boundingCentre.z];
}
function GetMouseSpeed()
{
function GetMouseSpeed() {
if (gui.cursorEnabled)
return [0,0];
return [0, 0];
let MouseSpeed = game.getMouseSpeed();
return [MouseSpeed.x,-MouseSpeed.y];
return [MouseSpeed.x, -MouseSpeed.y];
}
function GetMouseSensitivity()
{
if (game.getMouseSensitivity === undefined)
{
function GetMouseSensitivity() {
if (game.getMouseSensitivity === undefined) {
//logToConsole(LOG_ERROR, "game.getMouseSensitivity not implemented");
return [0.0025,0.003];
return [0.0025, 0.003];
}
let MouseSensitivity = game.getMouseSensitivity();
return [MouseSensitivity.x,MouseSensitivity.y];
return [MouseSensitivity.x, MouseSensitivity.y];
}
let GetCamera;
{
const Camera = Symbol();
GetCamera = function()
{
GetCamera = function () {
return Camera;
}
}
function AreEntityCollisionsEnabled(pEntity)
{
function AreEntityCollisionsEnabled(pEntity) {
return pEntity.collisionsEnabled;
}
function SetEntityCollisionsEnabled(pEntity, bCollisionsEnabled)
{
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)
{
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];
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())
{
function SetPlaceableMatrix(pPlaceable, mat) {
if (pPlaceable == GetCamera()) {
game.setCameraMatrix(mat);
return;
}
@@ -149,20 +130,17 @@ let GetTickCount;
{
let FrameCount = 0;
setInterval(() =>
{
setInterval(() => {
++FrameCount;
}, 0);
let GTAFrameCount = 0;
addEventHandler("OnProcess", (event, deltaTime) =>
{
addEventHandler("OnProcess", (event, deltaTime) => {
++GTAFrameCount;
});
GetTickCount = function(bGTA, bFrames)
{
GetTickCount = function (bGTA, bFrames) {
if (bFrames)
return bGTA ? GTAFrameCount : FrameCount;
else
@@ -170,16 +148,16 @@ let GetTickCount;
}
}
function easingSinusoidalInOut(t,b,c,d)//TODO: Move this to MathUtil.js
function easingSinusoidalInOut(t, b, c, d)//TODO: Move this to MathUtil.js
{
return -c/2 * (Math.cos((Math.PI)*t/d) - 1) + b;
return -c / 2 * (Math.cos((Math.PI) * t / d) - 1) + b;
}
//TODO: extract
function applyMultiplierTimeStep(m,t)//TODO: Move this to MathUtil.js
function applyMultiplierTimeStep(m, t)//TODO: Move this to MathUtil.js
{
return Math.max(Math.min(1.0-(1.0-m)*(t),1),0);
return Math.max(Math.min(1.0 - (1.0 - m) * (t), 1), 0);
}
//TODO: getOffset
@@ -192,8 +170,7 @@ function applyMultiplierTimeStep(m,t)//TODO: Move this to MathUtil.js
//TODO: confirm
const identityMatrix = new Matrix4x4();
if (identityMatrix.setIdentity === undefined)
{
if (identityMatrix.setIdentity === undefined) {
identityMatrix.m11 = 1;
identityMatrix.m12 = 0;
identityMatrix.m13 = 0;
@@ -230,72 +207,62 @@ cameraIdentityMatrix.m42 = 0;
cameraIdentityMatrix.m43 = 0;
cameraIdentityMatrix.m44 = 1;
function createMultipliedMatrix()
{
function createMultipliedMatrix() {
let matrix = new Matrix4x4();
matrix.setMultiply.apply(matrix, arguments);
return matrix;
}
function createXRotationMatrix(x)
{
function createXRotationMatrix(x) {
let matrix = new Matrix4x4();
matrix.setRotateX(x);
return matrix;
}
function createYRotationMatrix(x)
{
function createYRotationMatrix(x) {
let matrix = new Matrix4x4();
matrix.setRotateY(x);
return matrix;
}
function createZRotationMatrix(z)
{
function createZRotationMatrix(z) {
let matrix = new Matrix4x4();
matrix.setRotateZ(z);
return matrix;
}
function createTranslationMatrix(x,y,z)
{
function createTranslationMatrix(x, y, z) {
let matrix = new Matrix4x4();
matrix.setTranslate([x,y,z]);
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 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 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 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);
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];
return [x / length, y / length, z / length];
}
function createLookAtLHMatrix(eyeX, eyeY, eyeZ, atX, atY, atZ, upX,upY,upZ)
{
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);
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;
@@ -323,10 +290,9 @@ function createLookAtLHMatrix(eyeX, eyeY, eyeZ, atX, atY, atZ, upX,upY,upZ)
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;
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;
@@ -336,46 +302,41 @@ let easeStartPosX, easeStartPosY, easeStartPosZ;
let easeStartLookX, easeStartLookY, easeStartLookZ;
let easeStartUpX, easeStartUpY, easeStartUpZ;
function getCameraPositionInfo(matrix)
{
function getCameraPositionInfo(matrix) {
return [matrix.m41, matrix.m42, matrix.m43, matrix.m21, matrix.m22, matrix.m23, matrix.m31, matrix.m32, matrix.m33];
}
function startCameraEase()
{
function startCameraEase() {
easeCamera = true;
easeStartTicks = GetTickCount(true,false);
easeStartTicks = GetTickCount(true, false);
easeDuration = 1000;
let matrix = GetPlaceableMatrix(GetCamera());
[easeStartPosX, easeStartPosY, easeStartPosZ, easeStartLookX, easeStartLookY, easeStartLookZ, easeStartUpX, easeStartUpY, easeStartUpZ] = getCameraPositionInfo(matrix);
}
function applyCameraEase(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 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);
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);
function isCameraEasing() {
return easeCamera && GetTickCount(true, false) < (easeStartTicks + easeDuration);
}
let oldCameraTarget = null;
@@ -383,14 +344,12 @@ let OldPosition = null;//2019 Lucas was here!
let cameraRotZ;
let cameraRotY;
function getCameraTarget()
{
function getCameraTarget() {
let playerPed = GetPlayerPed(GetCurrentPlayerIndex());
let vehicle = GetPedVehicle(playerPed);
if (vehicle != null)
return vehicle;
if (playerPed != null)
{
if (playerPed != null) {
//if (playerPed.health <= 1)//Breaks because of fade//2019 Lucas was here!
// return null;
return playerPed;
@@ -398,59 +357,52 @@ function getCameraTarget()
return null;
}
function isRelativeToTarget(target)
{
function isRelativeToTarget(target) {
if (GetEntityType(target) == ENTITYTYPE_PED)
return false;
return false
}
function isClipped(target)
{
function isClipped(target) {
if (GetEntityType(target) == ENTITYTYPE_PED)
return true;
return true;
}
//2019 Lucas was here!
function ShouldReturnToRestRotation(Target)
{
function ShouldReturnToRestRotation(Target) {
if (GetEntityType(Target) == ENTITYTYPE_PED)
return false;
return true;
}
function getCameraRestRotation(target)
{
function getCameraRestRotation(target) {
let targetMatrix = GetPlaceableMatrix(target);
let rotZ;
if (isRelativeToTarget(target))
rotZ = 0;
else
rotZ = -Math.atan2(targetMatrix.m21,targetMatrix.m22);
rotZ = -Math.atan2(targetMatrix.m21, targetMatrix.m22);
let rotY = -0.2;
return [rotZ, rotY];
}
function resetCameraRotation()
{
function resetCameraRotation() {
[cameraRotZ, cameraRotY] = getCameraRestRotation(getCameraTarget());
}
//2019 Lucas was here!
let DeltaTime = 0;
addEventHandler("OnProcess", (event, deltaTime) =>
{
addEventHandler("OnProcess", (event, deltaTime) => {
DeltaTime = deltaTime;
if(!localPlayer) {
if (!localPlayer) {
return false;
}
});
let IdleTime = 0;//2019 Lucas was here!
function processReturnToRestRotation()
{
function processReturnToRestRotation() {
//resetCameraRotation();//2019 Lucas was here!
//2019 Lucas was here!
@@ -458,37 +410,32 @@ function processReturnToRestRotation()
if (!ShouldReturnToRestRotation(Target))
return;
IdleTime += DeltaTime;
if (IdleTime > 1.5)
{
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 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 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;
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()
{
function cancelReturnToRestRotation() {
IdleTime = 0;//2019 Lucas was here!
}
let distance;
let zIncrease;
function getCameraOffsetInfo(target)
{
if (GetEntityType(target) == ENTITYTYPE_PED)
{
function getCameraOffsetInfo(target) {
if (GetEntityType(target) == ENTITYTYPE_PED) {
let distance = 4;
let zIncrease = 0.8;
let offsetX = 0;
@@ -507,8 +454,7 @@ function getCameraOffsetInfo(target)
let offsetX;
let offsetY;
let offsetZ;
if (radius <= 3.0535011291504)
{
if (radius <= 3.0535011291504) {
minDistance = 4;
maxDistance = 8;
minZIncrease = 0.5;
@@ -516,8 +462,7 @@ function getCameraOffsetInfo(target)
minRadius = 2;
maxRadius = 3.0535011291504;
}
else
{
else {
minDistance = 8;
maxDistance = 16;
minZIncrease = 1;
@@ -528,66 +473,59 @@ function getCameraOffsetInfo(target)
offsetX = 0;
offsetY = 0;
offsetZ = 0;
distance = minDistance+(radius-minRadius)/(maxRadius-minRadius)*(maxDistance-minDistance);
zIncrease = minZIncrease+(radius-minRadius)/(maxRadius-minRadius)*(maxZIncrease-minZIncrease);
distance = minDistance + (radius - minRadius) / (maxRadius - minRadius) * (maxDistance - minDistance);
zIncrease = minZIncrease + (radius - minRadius) / (maxRadius - minRadius) * (maxZIncrease - minZIncrease);
return [distance, zIncrease, offsetX, offsetY, offsetZ];
}
function update()
{
function update() {
let target = getCameraTarget();
if (target != null)
{
if (oldCameraTarget != target)
{
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)
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)
{
mouseSpeedX = mouseSpeedX * mouseSensitivityX * 2;
mouseSpeedY = mouseSpeedY * mouseSensitivityY * 2;
if (mouseSpeedX == 0 && mouseSpeedY == 0) {
processReturnToRestRotation();
}
else
{
cameraRotZ = cameraRotZ-mouseSpeedX;
cameraRotY = cameraRotY-mouseSpeedY;
else {
cameraRotZ = cameraRotZ - mouseSpeedX;
cameraRotY = cameraRotY - mouseSpeedY;
cancelReturnToRestRotation();
}
cameraRotY = Math.max(cameraRotY,-Math.PI/2+0.01);
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!
cameraRotY = Math.min(cameraRotY, Math.PI / 8.5);//2019 Lucas was here!
else
cameraRotY = Math.min(cameraRotY,Math.PI/4);
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);
targetMatrix = createMultipliedMatrix(offsetTranslationMatrix, targetMatrix);
let targetPosX, targetPosY, targetPosZ;
if (isRelativeToTarget(target))
[targetPosX, targetPosY, targetPosZ] = [0,0,0];
[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;
[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);
let cameraMatrix = createMultipliedMatrix(cameraIdentityMatrix, distanceTranslationMatrix, offsetRotationX, offsetRotationZ, targetTranslationMatrix);
if (isRelativeToTarget(target)) {
cameraMatrix = createMultipliedMatrix(cameraMatrix, targetMatrix);
targetTranslationMatrix = createMultipliedMatrix(targetTranslationMatrix, targetMatrix);
}
if (isClipped(target))
{
if (isClipped(target)) {
let startX = targetTranslationMatrix.m41;
let startY = targetTranslationMatrix.m42;
let startZ = targetTranslationMatrix.m43;
@@ -603,17 +541,16 @@ function update()
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);
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)
{
SetEntityCollisionsEnabled(target, true);
if (positionX != null) {
//2019 Lucas was here!
let Distance = 0.3;
positionX += normalX*Distance;
positionY += normalY*Distance;
positionZ += normalZ*Distance;
positionX += normalX * Distance;
positionY += normalY * Distance;
positionZ += normalZ * Distance;
cameraMatrix.m41 = positionX;
cameraMatrix.m42 = positionY;
@@ -622,7 +559,7 @@ function update()
}
if (isCameraEasing())
cameraMatrix = applyCameraEase(cameraMatrix);
SetPlaceableMatrix(camera,cameraMatrix);
SetPlaceableMatrix(camera, cameraMatrix);
UpdateCamera(camera);
}
oldCameraTarget = target;
@@ -630,9 +567,8 @@ function update()
return target != null;
}
addEventHandler("OnCameraProcess", (event) =>
{
if(mouseCameraEnabled) {
addEventHandler("OnCameraProcess", (event) => {
if (mouseCameraEnabled) {
update();
event.preventDefault();
}

View File

@@ -23,10 +23,10 @@ let playerPing = {};
// ===========================================================================
function initNameTagScript() {
logToConsole(LOG_DEBUG, "[VRR.NameTag]: Initializing nametag script ...");
logToConsole(LOG_DEBUG, "[AGRP.NameTag]: Initializing nametag script ...");
nametagFont = loadNameTagFont();
afkStatusFont = loadPausedStatusFont();
logToConsole(LOG_DEBUG, "[VRR.NameTag]: Nametag script initialized!");
logToConsole(LOG_DEBUG, "[AGRP.NameTag]: Nametag script initialized!");
}
// ===========================================================================

View File

@@ -90,18 +90,7 @@ function deleteLocalGameElement(element) {
// ===========================================================================
function createGameVehicle(modelIndex, position, heading) {
if (getGame() != AGRP_GAME_GTA_IV) {
return game.createVehicle(getGameConfig().vehicles[getGame()][modelIndex][0], position, heading);
} else {
let modelId = getGameConfig().vehicles[getGame()][modelIndex][0];
if (natives.isModelInCdimage(modelId)) {
natives.requestModel(modelId);
natives.loadAllObjectsNow();
return natives.createCar(modelId, position, true);
}
}
return null;
return game.createVehicle(getGameConfig().vehicles[getGame()][modelIndex][0], position, heading);
}
// ===========================================================================
@@ -224,6 +213,7 @@ function setEntityData(entity, dataName, dataValue, syncToClients = true) {
// ===========================================================================
function setVehicleEngine(vehicleId, state) {
//getElementFromId(vehicleId).netFlags.sendSync = state;
getElementFromId(vehicleId).engine = state;
}

View File

@@ -8,16 +8,15 @@
// TYPE: Client (JavaScript)
// ===========================================================================
function initServerScript() {
logToConsole(LOG_DEBUG, "[VRR.Server]: Initializing server script ...");
addAllNetworkHandlers();
logToConsole(LOG_DEBUG, "[VRR.Server]: Server script initialized!");
function initNetworkEventsScript() {
logToConsole(LOG_DEBUG, "[AGRP.NetEvents]: Initializing server script ...");
logToConsole(LOG_DEBUG, "[AGRP.NetEvents]: Server script initialized!");
}
// ===========================================================================
function addAllNetworkHandlers() {
logToConsole(LOG_DEBUG, "[VRR.Server]: Adding network handlers ...");
logToConsole(LOG_DEBUG, "[AGRP.Server]: Adding network handlers ...");
// Chat Box
addNetworkEventHandler("m", receiveChatBoxMessageFromServer); // Not prefixed with VRR to make it as small as possible
@@ -49,7 +48,7 @@ function addAllNetworkHandlers() {
addNetworkEventHandler("agrp.heading", setLocalPlayerHeading);
addNetworkEventHandler("agrp.interior", setLocalPlayerInterior);
addNetworkEventHandler("agrp.spawned", onServerSpawnedLocalPlayer);
addNetworkEventHandler("agrp.money", setLocalPlayerCash);
addNetworkEventHandler("agrp.money", setLocalPlayerMoney);
addNetworkEventHandler("agrp.armour", setLocalPlayerArmour);
addNetworkEventHandler("agrp.localPlayerSkin", setLocalPlayerSkin);
addNetworkEventHandler("agrp.pedSpeak", makeLocalPlayerPedSpeak);
@@ -69,7 +68,8 @@ function addAllNetworkHandlers() {
addNetworkEventHandler("agrp.veh.lights", setVehicleLights);
addNetworkEventHandler("agrp.veh.engine", setVehicleEngine);
addNetworkEventHandler("agrp.veh.repair", repairVehicle);
addNetworkEventHandler("agrp.cruiseControl", toggleVehicleCruiseControl);
addNetworkEventHandler("agrp.cruiseControl", toggleLocalVehicleCruiseControl);
addNetworkEventHandler("agrp.passenger", enterVehicleAsPassenger);
// Radio
addNetworkEventHandler("agrp.radioStream", playStreamingRadio);
@@ -108,6 +108,12 @@ function addAllNetworkHandlers() {
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
addNetworkEventHandler("agrp.business", receiveBusinessFromServer);
@@ -122,13 +128,20 @@ function addAllNetworkHandlers() {
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
addNetworkEventHandler("agrp.mouseCursor", toggleMouseCursor);
addNetworkEventHandler("agrp.mouseCamera", toggleMouseCamera);
addNetworkEventHandler("agrp.clearPeds", clearLocalPlayerOwnedPeds);
addNetworkEventHandler("agrp.clearPickups", clearLocalPlayerOwnedPickups);
addNetworkEventHandler("agrp.passenger", enterVehicleAsPassenger);
addNetworkEventHandler("agrp.logo", setServerLogoRenderState);
addNetworkEventHandler("agrp.ambience", setCityAmbienceState);
addNetworkEventHandler("agrp.runCode", runClientCode);
addNetworkEventHandler("agrp.minuteDuration", setMinuteDuration);
@@ -136,26 +149,20 @@ function addAllNetworkHandlers() {
addNetworkEventHandler("agrp.enterPropertyKey", setEnterPropertyKey);
addNetworkEventHandler("agrp.skinSelect", toggleSkinSelect);
addNetworkEventHandler("agrp.hotbar", updatePlayerHotBar);
addNetworkEventHandler("agrp.showItemActionDelay", showItemActionDelay);
addNetworkEventHandler("agrp.set2DRendering", set2DRendering);
addNetworkEventHandler("agrp.mouseCameraForce", setMouseCameraState);
addNetworkEventHandler("agrp.logLevel", setLogLevel);
addNetworkEventHandler("agrp.hideAllGUI", hideAllGUI);
addNetworkEventHandler("agrp.nametag", updatePlayerNameTag);
addNetworkEventHandler("agrp.nametagDistance", setNameTagDistance);
addNetworkEventHandler("agrp.ping", updatePlayerPing);
addNetworkEventHandler("agrp.anim", makePedPlayAnimation);
addNetworkEventHandler("agrp.stopAnim", makePedStopAnimation);
addNetworkEventHandler("agrp.forceAnim", forcePedAnimation);
addNetworkEventHandler("agrp.clientInfo", serverRequestedClientInfo);
addNetworkEventHandler("agrp.interiorLights", updateInteriorLightsState);
addNetworkEventHandler("agrp.cutsceneInterior", setCutsceneInterior);
addNetworkEventHandler("agrp.scene", changeScene);
addNetworkEventHandler("agrp.syncElement", forceSyncElementProperties);
addNetworkEventHandler("agrp.elementPosition", setElementPosition);
addNetworkEventHandler("agrp.elementCollisions", setElementCollisionsEnabled);
addNetworkEventHandler("agrp.vehBuyState", setVehiclePurchaseState);
addNetworkEventHandler("agrp.holdObject", makePedHoldObject);
addNetworkEventHandler("agrp.profanityFilter", setProfanityFilterState);
addNetworkEventHandler("agrp.currencyString", receiveCurrencyStringFromServer);
}
// ===========================================================================
@@ -181,7 +188,7 @@ function sendResourceStoppedSignalToServer() {
// ===========================================================================
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;
if (getGame() == AGRP_GAME_GTA_IV) {
@@ -206,7 +213,7 @@ function set2DRendering(hudState, labelState, smallGameMessageState, scoreboardS
// ===========================================================================
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;
setUpInitialGame();
if (state) {
@@ -339,7 +346,7 @@ function setLocalPlayerInfiniteRun(state) {
// ===========================================================================
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() == AGRP_GAME_GTA_IV) {
if (natives.isModelInCdimage(skinId)) {
natives.requestModel(skinId);
@@ -364,12 +371,14 @@ function makePedHoldObject(pedId, modelIndex) {
// ===========================================================================
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() == AGRP_GAME_GTA_IV) {
if (cutsceneName == "") {
natives.clearCutscene();
@@ -379,6 +388,8 @@ function setCutsceneInterior(cutsceneName) {
}
natives.initCutscene(cutsceneName);
}
} else if (getGame() == AGRP_GAME_MAFIA_ONE) {
game.changeMap(sceneName);
}
}
@@ -435,4 +446,28 @@ function clearLocalPlayerOwnedPickups() {
}
}
// ===========================================================================
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

@@ -44,4 +44,8 @@ function playAudioFile(audioName, loop, volume) {
findResourceByName("connectedrp-extra").exports.playCustomAudio(audioName, volume / 100, loop);
}
// ===========================================================================
// ===========================================================================
function getStreamingRadioVolumeForPosition(position1, position2) {
return false;
}

View File

@@ -18,10 +18,10 @@ let scoreboardKey = SDLK_TAB;
// ===========================================================================
function initScoreBoardScript() {
logToConsole(LOG_DEBUG, "[VRR.ScoreBoard]: Initializing scoreboard script ...");
logToConsole(LOG_DEBUG, "[AGRP.ScoreBoard]: Initializing scoreboard script ...");
scoreBoardTitleFont = initScoreBoardTitleFont();
scoreBoardListFont = initScoreBoardListFont();
logToConsole(LOG_DEBUG, "[VRR.ScoreBoard]: Scoreboard script initialized!");
logToConsole(LOG_DEBUG, "[AGRP.ScoreBoard]: Scoreboard script initialized!");
}
// ===========================================================================

View File

@@ -11,7 +11,7 @@
let skinSelectMessageFontTop = null;
let skinSelectMessageFontBottom = null;
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 skinSelectMessageColourBottom = COLOUR_WHITE;
@@ -24,10 +24,10 @@ let skinSelectHeading = null;
// ===========================================================================
function initSkinSelectScript() {
logToConsole(LOG_DEBUG, "[VRR.SkinSelect]: Initializing skin selector script ...");
logToConsole(LOG_DEBUG, "[AGRP.SkinSelect]: Initializing skin selector script ...");
skinSelectMessageFontTop = loadSkinSelectMessageFontTop();
skinSelectMessageFontBottom = loadSkinSelectMessageFontBottom();
logToConsole(LOG_DEBUG, "[VRR.SkinSelect]: Skin selector script initialized!");
logToConsole(LOG_DEBUG, "[AGRP.SkinSelect]: Skin selector script initialized!");
}
// ===========================================================================
@@ -46,7 +46,7 @@ function loadSkinSelectMessageFontBottom() {
function processSkinSelectKeyPress(keyCode) {
if (usingSkinSelector) {
if (keyCode == SDLK_LEFT || keyCode == SDLK_A) {
if (keyCode == getKeyIdFromParams("left") || keyCode == getKeyIdFromParams("a")) {
if (skinSelectorIndex >= allowedSkins.length - 1) {
skinSelectorIndex = 1;
} else {
@@ -55,7 +55,7 @@ function processSkinSelectKeyPress(keyCode) {
logToConsole(LOG_DEBUG, `Switching to skin ${allowedSkins[skinSelectorIndex][1]} (Index: ${skinSelectorIndex}, Skin: ${allowedSkins[skinSelectorIndex][0]})`);
skinSelectMessageTextTop = allowedSkins[skinSelectorIndex][1];
setLocalPlayerSkin(allowedSkins[skinSelectorIndex][0]);
} else if (keyCode == SDLK_RIGHT || keyCode == SDLK_D) {
} else if (keyCode == getKeyIdFromParams("right") || keyCode == getKeyIdFromParams("d")) {
if (skinSelectorIndex <= 0) {
skinSelectorIndex = allowedSkins.length - 1;
} else {
@@ -64,16 +64,19 @@ function processSkinSelectKeyPress(keyCode) {
logToConsole(LOG_DEBUG, `Switching to skin ${allowedSkins[skinSelectorIndex][1]} (Index: ${skinSelectorIndex}, Skin: ${allowedSkins[skinSelectorIndex][0]})`);
skinSelectMessageTextTop = allowedSkins[skinSelectorIndex][1];
setLocalPlayerSkin(allowedSkins[skinSelectorIndex][0]);
} else if (keyCode == SDLK_RETURN) {
} else if (keyCode == getKeyIdFromParams("enter")) {
sendNetworkEventToServer("agrp.skinSelected", skinSelectorIndex);
toggleSkinSelect(false);
return true;
} else if (keyCode == SDLK_BACKSPACE) {
} else if (keyCode == getKeyIdFromParams("backspace")) {
sendNetworkEventToServer("agrp.skinSelected", -1);
toggleSkinSelect(false);
return true;
}
localPlayer.heading = skinSelectHeading;
if (getGame() <= AGRP_GAME_GTA_SA) {
localPlayer.heading = skinSelectHeading;
}
}
}
@@ -104,10 +107,18 @@ function toggleSkinSelect(state) {
skinSelectHeading = localPlayer.heading;
if (isCustomCameraSupported()) {
let tempPosition = localPlayer.position;
tempPosition.z += 0.5;
let frontCameraPosition = getPosInFrontOfPos(tempPosition, localPlayer.heading, 3);
game.setCameraLookAt(frontCameraPosition, localPlayer.position, true);
let cameraPosition = localPlayer.position;
let playerPosition = localPlayer.position;
if (getGame() == AGRP_GAME_MAFIA_ONE) {
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() == AGRP_GAME_GTA_IV) {

View File

@@ -13,7 +13,7 @@ function initClientScripts() {
initNameTagScript();
initScoreBoardScript();
initMessagingScript();
initServerScript();
initNetworkEventsScript();
initLogoScript();
initLabelScript();
initChatBoxScript();
@@ -21,6 +21,9 @@ function initClientScripts() {
initKeyBindScript();
initEventScript();
initSkinSelectScript();
initCursorScript();
addAllNetworkHandlers();
}
// ===========================================================================

View File

@@ -40,7 +40,6 @@ function processSync(event, deltaTime) {
}
if (streamingRadioElement) {
streamingRadio.position = getElementPosition(streamingRadioElement.id);
//streamingRadio.volume = getStreamingRadioVolumeForPosition(streamingRadio.position);
}
}
@@ -48,25 +47,15 @@ function processSync(event, deltaTime) {
// ===========================================================================
function setVehicleLights(vehicleId, state) {
if (getGame() != AGRP_GAME_MAFIA_ONE) {
if (!state) {
getElementFromId(vehicleId).lightStatus = 2;
} else {
getElementFromId(vehicleId).lightStatus = 1;
}
} else if (getGame() == AGRP_GAME_GTA_IV) {
if (!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;
}
}
//if (getGame() == AGRP_GAME_GTA_IV) {
// if (!state) {
// natives.forceCarLights(natives.getVehicleFromNetworkId(vehicleId, 0));
// } else {
// natives.forceCarLights(natives.getVehicleFromNetworkId(vehicleId, 1));
// }
//} else {
getElementFromId(vehicleId).lights = state;
//}
}
// ===========================================================================
@@ -84,11 +73,12 @@ function syncVehicleProperties(vehicle) {
if (doesEntityDataExist(vehicle, "agrp.lights")) {
let lightStatus = getEntityData(vehicle, "agrp.lights");
if (!lightStatus) {
vehicle.lightStatus = 2;
} else {
vehicle.lightStatus = 1;
}
vehicle.lights = lightStatus;
}
if (doesEntityDataExist(vehicle, "agrp.locked")) {
let lockStatus = getEntityData(vehicle, "agrp.locked");
vehicle.locked = lockStatus;
}
if (doesEntityDataExist(vehicle, "agrp.invincible")) {
@@ -122,7 +112,7 @@ function syncVehicleProperties(vehicle) {
vehicle.setSuspensionHeight(suspensionHeight);
}
if (getGame() == AGRP_GAME_GTA_SA) {
if (isGameFeatureSupported("vehicleUpgrades")) {
//let allUpgrades = getGameConfig().vehicleUpgrades[getGame()];
//for(let i in allUpgrades) {
// vehicle.removeUpgrade(i);
@@ -157,7 +147,7 @@ function syncCivilianProperties(civilian) {
return false;
}
if (getGame() == AGRP_GAME_GTA_III) {
if (isGameFeatureSupported("pedScale")) {
if (doesEntityDataExist(civilian, "agrp.scale")) {
let scaleFactor = getEntityData(civilian, "agrp.scale");
let tempMatrix = civilian.matrix;
@@ -176,7 +166,7 @@ function syncCivilianProperties(civilian) {
}
}
if (getGame() == AGRP_GAME_GTA_III) {
if (getGame() == AGRP_GAME_GTA_SA) {
if (doesEntityDataExist(civilian, "agrp.walkStyle")) {
let walkStyle = getEntityData(civilian, "agrp.walkStyle");
civilian.walkStyle = walkStyle;
@@ -249,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) {
if (!areServerElementsSupported()) {
return false;
}
if (getGame() == AGRP_GAME_GTA_III) {
if (isGameFeatureSupported("pedScale")) {
if (doesEntityDataExist(player, "agrp.scale")) {
let scaleFactor = getEntityData(player, "agrp.scale");
let tempMatrix = player.matrix;
@@ -367,9 +377,17 @@ function syncElementProperties(element) {
return false;
}
if (doesEntityDataExist(element, "agrp.interior")) {
if (typeof element.interior != "undefined") {
element.interior = getEntityData(element, "agrp.interior");
if (isGameFeatureSupported("interior")) {
if (doesEntityDataExist(element, "agrp.interior")) {
if (typeof element.interior != "undefined") {
element.interior = getEntityData(element, "agrp.interior");
}
}
}
if (isGameFeatureSupported("toggleCollision")) {
if (doesEntityDataExist(element, "agrp.collisions")) {
element.collisionsEnabled = getEntityData(element, "agrp.collisions");
}
}
@@ -404,6 +422,10 @@ function syncElementProperties(element) {
syncPlayerProperties(element);
break;
case ELEMENT_OBJECT:
syncObjectProperties(element);
break;
default:
break;
}

View File

@@ -1,8 +0,0 @@
function getCurrentUnixTimeStampSquirrel() {
return time();
}
function getTimeStampOutput(timeStamp) {
local dateObj = date(timeStamp);
return dateObj.hour + ":" + dateObj.minute + ":" + dateObj.second;
}

View File

@@ -9,18 +9,19 @@
// ===========================================================================
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);
}
// ===========================================================================
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;
game.setPlayerControl(controlState);
if (getGame() == AGRP_GAME_GTA_III || getGame() == AGRP_GAME_GTA_VC) {
game.SET_PLAYER_CONTROL(game.GET_PLAYER_ID(), boolToInt(controlState));
} else if (getGame() != AGRP_GAME_GTA_IV) {
} else if (getGame() <= AGRP_GAME_GTA_IV) {
setElementCollisionsEnabled(localPlayer, controlState);
setPedInvincible(localPlayer, true);
}
@@ -28,14 +29,15 @@ function setLocalPlayerControlState(controlState, cursorState = false) {
// ===========================================================================
function fadeLocalCamera(state, time) {
if (isFadeCameraSupported()) {
logToConsole(LOG_DEBUG, `[VRR.Utilities] Fading camera ${(state) ? "in" : "out"} for ${time} seconds`);
function fadeLocalCamera(state, duration, colour) {
logToConsole(LOG_DEBUG, `[AGRP.Utilities] Fading camera ${(state) ? "in" : "out"} for ${time}ms`);
if (isFadeCameraSupported()) {
game.fadeCamera(state, time);
}
}
cameraFadeDuration = duration;
cameraFadeStart = sdl.ticks;
cameraFadeEnabled = true;
cameraFadeIn = state;
cameraFadeColour = colour;
cameraFadeAlpha = (state) ? 255 : 0;
}
// ===========================================================================
@@ -47,7 +49,7 @@ function removeLocalPlayerFromVehicle() {
// ===========================================================================
function restoreLocalCamera() {
logToConsole(LOG_DEBUG, `[VRR.Utilities] Camera restored`);
logToConsole(LOG_DEBUG, `[AGRP.Utilities] Camera restored`);
if (isGameFeatureSupported("customCamera")) {
game.restoreCamera(true);
}
@@ -55,16 +57,8 @@ function restoreLocalCamera() {
// ===========================================================================
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) {
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()) {
game.setCameraLookAt(cameraPosition, cameraLookAt, true);
}
@@ -72,8 +66,16 @@ 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) {
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);
if (getMultiplayerMod() == AGRP_MPMOD_GTAC) {
@@ -133,7 +135,7 @@ function enterVehicleAsPassenger() {
// ===========================================================================
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;
if (getGame() == AGRP_GAME_MAFIA_ONE) {
localPlayer.giveWeapon(weaponId, 0, ammo);
@@ -154,7 +156,7 @@ function giveLocalPlayerWeapon(weaponId, ammo, active) {
// ===========================================================================
function clearLocalPlayerWeapons(clearData) {
logToConsole(LOG_DEBUG, `[VRR.Utilities] Clearing weapons`);
logToConsole(LOG_DEBUG, `[AGRP.Utilities] Clearing weapons`);
localPlayer.clearWeapons();
if (clearData == true) {
forceWeapon = 0;
@@ -172,7 +174,7 @@ function getClosestVehicle(pos) {
// ===========================================================================
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") {
localPlayer.velocity = toVector3(0.0, 0.0, 0.0);
}
@@ -185,7 +187,7 @@ function setLocalPlayerPosition(position) {
// ===========================================================================
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") {
localPlayer.heading = heading;
}
@@ -194,7 +196,7 @@ function setLocalPlayerHeading(heading) {
// ===========================================================================
function setLocalPlayerInterior(interior) {
logToConsole(LOG_DEBUG, `[VRR.Utilities] Setting interior to ${interior}`);
logToConsole(LOG_DEBUG, `[AGRP.Utilities] Setting interior to ${interior}`);
if (getMultiplayerMod() == AGRP_MPMOD_GTAC) {
if (!isGTAIV()) {
localPlayer.interior = interior;
@@ -222,13 +224,16 @@ function setLocalPlayerInterior(interior) {
// ===========================================================================
function setSnowState(falling, ground) {
logToConsole(LOG_DEBUG, `[VRR.Utilities] Setting falling snow to ${falling} and ground snow to ${ground}`);
function setSnowState(falling, ground, forceGround) {
logToConsole(LOG_DEBUG, `[AGRP.Utilities] Setting falling snow to ${falling} and ground snow to ${ground}`);
snowing = falling;
if (ground) {
forceSnowing(false);
forceSnowing(ground);
}
//snow.force = ground;
//if (forceGround == true) {
// forceSnowing(forceGround);
// groundSnow.flush();
//} else {
// snow.enabled = ground;
//}
}
// ===========================================================================
@@ -240,7 +245,7 @@ function setLocalPlayerHealth(health) {
// ===========================================================================
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() == AGRP_MPMOD_GTAC) {
game.SET_CHAR_SAY(int, int);
}
@@ -249,7 +254,7 @@ function playPedSpeech(pedName, speechId) {
// ===========================================================================
function clearLocalPedState() {
logToConsole(LOG_DEBUG, `[VRR.Utilities] Clearing local ped state`);
logToConsole(LOG_DEBUG, `[AGRP.Utilities] Clearing local ped state`);
localPlayer.clearObjective();
}
@@ -263,7 +268,7 @@ function getWeaponSlot(weaponId) {
function setLocalPlayerDrunkEffect(amount, duration) {
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;
drunkEffectDurationTimer = setInterval(function () {
drunkEffectAmount = drunkEffectAmount;
@@ -313,7 +318,7 @@ function clearSelfOwnedVehicles() {
// ===========================================================================
function setMouseCameraState(state) {
logToConsole(LOG_DEBUG, `[VRR.Utilities] ${(state) ? "Enabled" : "Disabled"} mouse camera`);
logToConsole(LOG_DEBUG, `[AGRP.Utilities] ${(state) ? "Enabled" : "Disabled"} mouse camera`);
mouseCameraEnabled = state;
SetStandardControlsEnabled(!mouseCameraEnabled);
}
@@ -321,50 +326,33 @@ function setMouseCameraState(state) {
// ===========================================================================
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);
}
// ===========================================================================
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);
}
// ===========================================================================
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;
}
// ===========================================================================
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;
}
// ===========================================================================
function setLocalPlayerCash(amount) {
logToConsole(LOG_DEBUG, `[VRR.Utilities] Setting local player money`);
if (localPlayer == null) {
return false;
}
if (typeof localPlayer.money != "undefined") {
localPlayer.money = toInteger(amount);
}
if (getGame() == AGRP_GAME_GTA_IV) {
natives.setMultiplayerHudCash(amount);
}
}
// ===========================================================================
function destroyAutoCreatedPickups() {
if (typeof ELEMENT_PICKUP != "undefined") {
getElementsByType(ELEMENT_PICKUP).forEach(function (pickup) {
@@ -411,21 +399,24 @@ function processWantedLevelReset() {
function processLocalPlayerVehicleControlState() {
if (areServerElementsSupported()) {
if (inVehicle && localPlayer.vehicle != null) {
if (localPlayer.vehicle != null) {
if (doesEntityDataExist(localPlayer.vehicle, "agrp.engine")) {
if (getEntityData(localPlayer.vehicle, "agrp.engine") == false) {
localPlayer.vehicle.engine = false;
//localPlayer.vehicle.netFlags.sendSync = false;
if (!localPlayer.vehicle.engine) {
if (typeof localPlayer.vehicle.velocity != "undefined") {
localPlayer.vehicle.velocity = 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.heading = parkedVehicleHeading;
//}
}
} else {
//localPlayer.vehicle.netFlags.sendSync = true;
}
}
}
@@ -480,7 +471,7 @@ function getVehicleForNetworkEvent(vehicle) {
// ===========================================================================
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()) {
game.time.minuteDuration = minuteDuration;
@@ -574,4 +565,56 @@ function setProfanityFilterState(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

@@ -30,8 +30,8 @@ class VehicleData {
// ===========================================================================
function receiveVehicleFromServer(vehicleId, networkId, 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`);
function receiveVehicleFromServer(vehicleId, position, model, colour1, colour2, colour3 = 0, colour4 = 0, locked = false, lights = false, engine = false, licensePlate = "") {
logToConsole(LOG_DEBUG, `[AGRP.Vehicle] Received vehicle ${vehicleId} (${getVehicleNameFromModel(model, getGame())}) from server`);
if (getGame() != AGRP_GAME_GTA_IV) {
return false;
@@ -50,18 +50,10 @@ function receiveVehicleFromServer(vehicleId, networkId, position, model, colour1
vehicleData.lights = lights;
vehicleData.locked = locked;
vehicleData.licensePlate = "";
vehicleData.networkId = networkId;
if (natives.getVehicleFromNetworkId(vehicleId.ivNetworkId) != null) {
vehicleData.vehicle = natives.getVehicleFromNetworkId(vehicleId.ivNetworkId);
} else {
let vehicle = createGameVehicle(model, position, heading, colour1, colour2, colour3, colour4);
vehicleData.vehicle = vehicle;
sendNetworkEventToServer("agrp.vehicleCreated", vehicleId, natives.getNetworkIdFromVehicle(vehicle));
}
let vehicle = natives.getVehicleFromNetworkId(vehicleId.ivNetworkId);
} 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);
//vehicles.push(tempVehicleData);
@@ -139,14 +131,13 @@ function setAllVehicleDataIndexes() {
// ===========================================================================
function toggleVehicleCruiseControl(vehicle) {
if (!vehicle.isSyncer) {
function toggleLocalVehicleCruiseControl() {
if (!localPlayer.vehicle.isSyncer) {
return false;
}
cruiseControl = !cruiseControl;
cruiseControlEnabled = !cruiseControlEnabled;
cruiseControlSpeed = getVehicleSpeed(vehicle);
}
// ===========================================================================

View File

@@ -58,6 +58,7 @@ class AccountData {
this.ircAccount = "";
this.discordAccount = 0;
this.settings = 0;
this.seenActionTips = 0;
this.emailAddress = "";
this.ipAddress = 0;
@@ -87,6 +88,7 @@ class AccountData {
this.ircAccount = toInteger(dbAssoc["acct_irc"]);
this.discordAccount = toInteger(dbAssoc["acct_discord"]);
this.settings = toInteger(dbAssoc["acct_svr_settings"]);
this.seenActionTips = toInteger(dbAssoc["acct_svr_seen_action_tips"]);
this.emailAddress = toString(dbAssoc["acct_email"]);
this.ipAddress = toString(dbAssoc["acct_ip"]);
@@ -193,8 +195,8 @@ class AccountStaffNoteData {
// ===========================================================================
function initAccountScript() {
logToConsole(LOG_DEBUG, "[VRR.Account]: Initializing account script ...");
logToConsole(LOG_DEBUG, "[VRR.Account]: Account script initialized!");
logToConsole(LOG_DEBUG, "[AGRP.Account]: Initializing account script ...");
logToConsole(LOG_DEBUG, "[AGRP.Account]: Account script initialized!");
}
// ===========================================================================
@@ -283,31 +285,31 @@ function toggleAccountGUICommand(command, params, client) {
if (doesPlayerHaveGUIEnabled(client)) {
getPlayerData(client).accountData.settings = addBitFlag(getPlayerData(client).accountData.settings, flagValue);
messagePlayerNormal(client, getLocaleString(client, "GUIAccountSettingToggle", `{softRed}${toUpperCase(getLocaleString(client, "Off"))}{MAINCOLOUR}`));
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} has toggled GUI for their account OFF.`);
logToConsole(LOG_DEBUG, `[AGRP.Account] ${getPlayerDisplayForConsole(client)} has toggled GUI for their account OFF.`);
} else {
getPlayerData(client).accountData.settings = removeBitFlag(getPlayerData(client).accountData.settings, flagValue);
messagePlayerNormal(client, getLocaleString(client, "GUIAccountSettingToggle", `{softGreen}${toUpperCase(getLocaleString(client, "On"))}{MAINCOLOUR}`));
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} has toggled GUI for their account ON.`);
logToConsole(LOG_DEBUG, `[AGRP.Account] ${getPlayerDisplayForConsole(client)} has toggled GUI for their account ON.`);
}
if (!isPlayerLoggedIn(client)) {
if (getPlayerData().accountData.databaseId != 0) {
if (doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
showPlayerLoginGUI(client);
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the login GUI`);
logToConsole(LOG_DEBUG, `[AGRP.Account] ${getPlayerDisplayForConsole(client)} is being shown the login GUI`);
} else {
hideAllPlayerGUI(client);
messagePlayerNormal(client, getLocaleString(client, "WelcomeBack", getServerName(), getPlayerName(client), "{ALTCOLOUR}/login{MAINCOLOUR}"));
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the login message (GUI disabled)`);
logToConsole(LOG_DEBUG, `[AGRP.Account] ${getPlayerDisplayForConsole(client)} is being shown the login message (GUI disabled)`);
}
} else {
if (doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
showPlayerRegistrationGUI(client);
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the register GUI`);
logToConsole(LOG_DEBUG, `[AGRP.Account] ${getPlayerDisplayForConsole(client)} is being shown the register GUI`);
} else {
hideAllPlayerGUI(client);
messagePlayerNormal(client, getLocaleString(client, "WelcomeNewPlayer", getServerName(), getPlayerName(client), "{ALTCOLOUR}/register{MAINCOLOUR}"));
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the register message (GUI disabled)`);
logToConsole(LOG_DEBUG, `[AGRP.Account] ${getPlayerDisplayForConsole(client)} is being shown the register message (GUI disabled)`);
}
}
}
@@ -322,11 +324,11 @@ function toggleAccountLoginAttemptNotificationsCommand(command, params, client)
if (doesPlayerHaveLoginAlertsEnabled(client)) {
getPlayerData(client).accountData.settings = removeBitFlag(getPlayerData(client).accountData.settings, flagValue);
messagePlayerNormal(client, `⚙️ You turned ${getBoolRedGreenInlineColour(false)}OFF{MAINCOLOUR} notification by email when somebody tries to login to your account`);
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} has toggled the login attempt email notifications OFF for their account`);
logToConsole(LOG_DEBUG, `[AGRP.Account] ${getPlayerDisplayForConsole(client)} has toggled the login attempt email notifications OFF for their account`);
} else {
getPlayerData(client).accountData.settings = addBitFlag(getPlayerData(client).accountData.settings, flagValue);
messagePlayerNormal(client, `⚙️ You turned ${getBoolRedGreenInlineColour(true)}ON{MAINCOLOUR} notification by email when somebody tries to login to your account`);
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} has toggled the login attempt email notifications OFF for their account`);
logToConsole(LOG_DEBUG, `[AGRP.Account] ${getPlayerDisplayForConsole(client)} has toggled the login attempt email notifications OFF for their account`);
}
return true;
@@ -340,14 +342,14 @@ function toggleAccountServerLogoCommand(command, params, client) {
if (!doesPlayerHaveLogoEnabled(client)) {
getPlayerData(client).accountData.settings = removeBitFlag(getPlayerData(client).accountData.settings, flagValue);
messagePlayerSuccess(client, getLocaleString(client, "AccountServerLogoSet", `${getBoolRedGreenInlineColour(true)}${getLocaleString(client, "On")}{MAINCOLOUR}`));
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} has toggled the server logo ON for their account`);
logToConsole(LOG_DEBUG, `[AGRP.Account] ${getPlayerDisplayForConsole(client)} has toggled the server logo ON for their account`);
if (getServerConfig().showLogo) {
updatePlayerShowLogoState(client, true);
}
} else {
getPlayerData(client).accountData.settings = addBitFlag(getPlayerData(client).accountData.settings, flagValue);
messagePlayerSuccess(client, getLocaleString(client, "AccountServerLogoSet", `${getBoolRedGreenInlineColour(false)}${getLocaleString(client, "Off")}{MAINCOLOUR}`));
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} has toggled the server logo OFF for their account`);
logToConsole(LOG_DEBUG, `[AGRP.Account] ${getPlayerDisplayForConsole(client)} has toggled the server logo OFF for their account`);
updatePlayerShowLogoState(client, false);
}
@@ -376,11 +378,11 @@ function toggleAccountTwoFactorAuthCommand(command, params, client) {
if (!doesPlayerHaveTwoFactorAuthEnabled(client)) {
getPlayerData(client).accountData.settings = addBitFlag(getPlayerData(client).accountData.settings, flagValue);
messagePlayerSuccess(client, getLocaleString(client, "TwoFactorAuthSet", `${getBoolRedGreenInlineColour(true)}${getLocaleString(client, "On")}{MAINCOLOUR}`));
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} has toggled two-factor authentication ON for their account`);
logToConsole(LOG_DEBUG, `[AGRP.Account] ${getPlayerDisplayForConsole(client)} has toggled two-factor authentication ON for their account`);
} else {
getPlayerData(client).accountData.settings = removeBitFlag(getPlayerData(client).accountData.settings, flagValue);
messagePlayerSuccess(client, getLocaleString(client, "TwoFactorAuthSet", `${getBoolRedGreenInlineColour(false)}${toUpperCase(getLocaleString(client, "Off"))}{MAINCOLOUR}`));
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} has toggled two-factor authentication OFF for their account`);
logToConsole(LOG_DEBUG, `[AGRP.Account] ${getPlayerDisplayForConsole(client)} has toggled two-factor authentication OFF for their account`);
}
return true;
}
@@ -495,7 +497,7 @@ function changeAccountPasswordCommand(command, params, client) {
}
getPlayerData(client).accountData.password = hashAccountPassword(getPlayerData(client).accountData.name, params);
messagePlayerSuccess(client, `Your password has been changed!`);
messagePlayerSuccess(client, getLocaleString(client, "PasswordChanged"));
}
// ===========================================================================
@@ -591,7 +593,7 @@ function verifyAccountEmailCommand(command, params, client) {
let verificationCode = getParam(params, " ", 1);
if (isAccountEmailVerified(getPlayerData(client).accountData)) {
messagePlayerError(client, `You already verified your email!`);
messagePlayerError(client, getLocaleString(client, "AccountEmailAlreadyVerified"));
return false;
}
@@ -644,7 +646,7 @@ function resetAccountPasswordCommand(command, params, client) {
// ===========================================================================
function setAccountDiscordCommand(command, params, client) {
messagePlayerError(client, `This command is not yet finished and will be available soon!`);
messagePlayerError(client, getLocaleString(client, "CommandDisabled"));
return false;
if (areParamsEmpty(params)) {
@@ -830,7 +832,7 @@ function saltAccountInfo(name, password) {
// ===========================================================================
function loginSuccess(client) {
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} successfully logged in.`);
logToConsole(LOG_DEBUG, `[AGRP.Account] ${getPlayerDisplayForConsole(client)} successfully logged in.`);
getPlayerData(client).loggedIn = true;
if (getPlayerData(client).loginTimeout != null) {
@@ -841,23 +843,23 @@ function loginSuccess(client) {
updateConnectionLogOnAuth(client, getPlayerData(client).accountData.databaseId);
if (doesPlayerHaveStaffPermission(client, "Developer") || doesPlayerHaveStaffPermission(client, "ManageServer")) {
logToConsole(LOG_WARN, `[VRR.Account] ${getPlayerDisplayForConsole(client)} has needed permissions and is being given administrator access`);
logToConsole(LOG_WARN, `[AGRP.Account] ${getPlayerDisplayForConsole(client)} has needed permissions and is being given administrator access`);
setPlayerNativeAdminState(client, true);
}
if (doesServerHaveTesterOnlyEnabled()) {
if (!hasBitFlag(getPlayerData(client).accountData.flags.moderation, getModerationFlagValue("IsTester"))) {
setTimeout(function () {
getPlayerData(client).customDisconnectReason = "Kicked - Not a tester";
getPlayerData(client).customDisconnectReason = "NotATester";
disconnectPlayer(client);
}, 3500);
if (doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the error GUI (not a tester).`);
logToConsole(LOG_DEBUG, `[AGRP.Account] ${getPlayerDisplayForConsole(client)} is being shown the error GUI (not a tester).`);
showPlayerErrorGUI(client, getLocaleString(client, "NotATester"), getLocaleString(client, "AccessDenied"));
return false;
} else {
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the "not a tester" error message (GUI disabled).`);
logToConsole(LOG_DEBUG, `[AGRP.Account] ${getPlayerDisplayForConsole(client)} is being shown the "not a tester" error message (GUI disabled).`);
messagePlayerError(client, getLocaleString(client, "NotATester"));
return false;
}
@@ -868,10 +870,10 @@ function loginSuccess(client) {
if (doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
showPlayerPrompt(client, getLocaleString(client, "NoCharactersGUIMessage"), getLocaleString(client, "NoCharactersGUIWindowTitle"), getLocaleString(client, "Yes"), getLocaleString(client, "No"));
getPlayerData(client).promptType = AGRP_PROMPT_CREATEFIRSTCHAR;
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the no characters prompt GUI`);
logToConsole(LOG_DEBUG, `[AGRP.Account] ${getPlayerDisplayForConsole(client)} is being shown the no characters prompt GUI`);
} else {
messagePlayerAlert(client, getLocaleString(client, "NoCharactersChatMessage", `{ALTCOLOUR}/newchar{MAINCOLOUR}`));
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the no characters message (GUI disabled)`);
logToConsole(LOG_DEBUG, `[AGRP.Account] ${getPlayerDisplayForConsole(client)} is being shown the no characters message (GUI disabled)`);
}
} else {
showCharacterSelectToClient(client);
@@ -921,6 +923,7 @@ function saveAccountToDatabase(accountData) {
let data2 = [
["acct_svr_settings", (accountData.settings != NaN) ? toInteger(accountData.settings) : 0],
["acct_svr_seen_action_tips", (accountData.seenActionTips != NaN) ? toInteger(accountData.seenActionTips) : 0],
["acct_svr_staff_title", toString(safeStaffTitle)],
["acct_svr_staff_flags", (accountData.flags.admin != NaN) ? toInteger(accountData.flags.admin) : 0],
["acct_svr_mod_flags", (accountData.flags.moderation != NaN) ? toInteger(accountData.flags.moderation) : 0],
@@ -1064,41 +1067,41 @@ function createAccount(name, password, email = "") {
function checkLogin(client, password) {
getPlayerData(client).loginAttemptsRemaining = getPlayerData(client).loginAttemptsRemaining - 1;
if (getPlayerData(client).loginAttemptsRemaining <= 0) {
getPlayerData(client).customDisconnectReason = "Kicked - Failed to login";
getPlayerData(client).customDisconnectReason = "FailedToLogin";
disconnectPlayer(client);
}
if (isPlayerLoggedIn(client)) {
logToConsole(LOG_WARN, `[VRR.Account] ${getPlayerDisplayForConsole(client)} attempted to login but is already logged in`);
logToConsole(LOG_WARN, `[AGRP.Account] ${getPlayerDisplayForConsole(client)} attempted to login but is already logged in`);
if (doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
showPlayerLoginSuccessGUI(client);
} else {
messagePlayerError(client, "You are already logged in!");
messagePlayerError(client, getLocaleString(client, "AlreadyLoggedIn"));
}
return false;
}
if (!isPlayerRegistered(client)) {
logToConsole(LOG_WARN, `[VRR.Account] ${getPlayerDisplayForConsole(client)} attempted to login but is not registered`);
logToConsole(LOG_WARN, `[AGRP.Account] ${getPlayerDisplayForConsole(client)} attempted to login but is not registered`);
if (doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
showPlayerRegistrationGUI(client);
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the register GUI`);
logToConsole(LOG_DEBUG, `[AGRP.Account] ${getPlayerDisplayForConsole(client)} is being shown the register GUI`);
} else {
messagePlayerError(client, "Your name is not registered! Use /register to make an account.");
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the register message (GUI disabled)`);
logToConsole(LOG_DEBUG, `[AGRP.Account] ${getPlayerDisplayForConsole(client)} is being shown the register message (GUI disabled)`);
}
return false;
}
if (areParamsEmpty(password)) {
logToConsole(LOG_WARN, `[VRR.Account] ${getPlayerDisplayForConsole(client)} attempted to login but failed (empty password). ${getPlayerData(client).loginAttemptsRemaining} login attempts remaining`);
logToConsole(LOG_WARN, `[AGRP.Account] ${getPlayerDisplayForConsole(client)} attempted to login but failed (empty password). ${getPlayerData(client).loginAttemptsRemaining} login attempts remaining`);
if (doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
showPlayerLoginFailedGUI(client, `Invalid password! ${getPlayerData(client).loginAttemptsRemaining} tries remaining.`);
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the login GUI with ${getPlayerData(client).loginAttemptsRemaining} login attempts remaining alert.`);
showPlayerLoginFailedGUI(client, getLocaleString(client, "LoginFailedInvalidPassword", getPlayerData(client).loginAttemptsRemaining));
logToConsole(LOG_DEBUG, `[AGRP.Account] ${getPlayerDisplayForConsole(client)} is being shown the login GUI with ${getPlayerData(client).loginAttemptsRemaining} login attempts remaining alert.`);
} else {
messagePlayerError(client, `You must enter a password! ${getPlayerData(client).loginAttemptsRemaining} tries remaining.`);
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the login message (GUI disabled) with ${getPlayerData(client).loginAttemptsRemaining} login attempts remaining alert.`);
messagePlayerError(client, getLocaleString(client, "LoginFailedNoPassword", getPlayerData(client).loginAttemptsRemaining));
logToConsole(LOG_DEBUG, `[AGRP.Account] ${getPlayerDisplayForConsole(client)} is being shown the login message (GUI disabled) with ${getPlayerData(client).loginAttemptsRemaining} login attempts remaining alert.`);
}
// Disabling email login alerts for now. It hangs the server for a couple seconds. Need a way to thread it.
@@ -1109,13 +1112,13 @@ function checkLogin(client, password) {
}
if (!isAccountPasswordCorrect(getPlayerData(client).accountData, hashAccountPassword(getPlayerName(client), password))) {
logToConsole(LOG_WARN, `[VRR.Account] ${getPlayerDisplayForConsole(client)} attempted to login but failed (wrong password). ${getPlayerData(client).loginAttemptsRemaining} login attempts remaining`);
logToConsole(LOG_WARN, `[AGRP.Account] ${getPlayerDisplayForConsole(client)} attempted to login but failed (wrong password). ${getPlayerData(client).loginAttemptsRemaining} login attempts remaining`);
if (doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
showPlayerLoginFailedGUI(client, `Invalid password! ${getPlayerData(client).loginAttemptsRemaining} tries remaining.`);
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the login GUI with ${getPlayerData(client).loginAttemptsRemaining} login attempts remaining alert.`);
showPlayerLoginFailedGUI(client, getLocaleString(client, "LoginFailedInvalidPassword", getPlayerData(client).loginAttemptsRemaining));
logToConsole(LOG_DEBUG, `[AGRP.Account] ${getPlayerDisplayForConsole(client)} is being shown the login GUI with ${getPlayerData(client).loginAttemptsRemaining} login attempts remaining alert.`);
} else {
messagePlayerError(client, `Invalid password! ${getPlayerData(client).loginAttemptsRemaining} tries remaining.`);
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the login message (GUI disabled) with ${getPlayerData(client).loginAttemptsRemaining} login attempts remaining alert.`);
messagePlayerError(client, getLocaleString(client, "LoginFailedInvalidPassword", getPlayerData(client).loginAttemptsRemaining));
logToConsole(LOG_DEBUG, `[AGRP.Account] ${getPlayerDisplayForConsole(client)} is being shown the login message (GUI disabled) with ${getPlayerData(client).loginAttemptsRemaining} login attempts remaining alert.`);
}
// Disabling email login alerts for now. It hangs the server for a couple seconds. Need a way to thread it.
@@ -1148,7 +1151,7 @@ function checkLogin(client, password) {
// ===========================================================================
function checkRegistration(client, password, confirmPassword = "", emailAddress = "") {
logToConsole(LOG_DEBUG, `[VRR.Account]: Checking registration for ${getPlayerName(client)}`);
logToConsole(LOG_DEBUG, `[AGRP.Account]: Checking registration for ${getPlayerName(client)}`);
if (isPlayerRegistered(client)) {
if (doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
@@ -1175,7 +1178,7 @@ function checkRegistration(client, password, confirmPassword = "", emailAddress
showPlayerRegistrationFailedGUI(client, getLocaleString(client, "RegistrationFailedNoPassword"));
logToConsole(LOG_WARN, `${getPlayerDisplayForConsole(client)} failed to create an account (password is blank)`);
} else {
messagePlayerError(client, "The password cannot be blank!");
messagePlayerError(client, getLocaleString(client, "RegistrationFailedNoPassword"));
logToConsole(LOG_WARN, `${getPlayerDisplayForConsole(client)} failed to create an account (password is blank)`);
}
return false;
@@ -1211,7 +1214,20 @@ function checkRegistration(client, password, confirmPassword = "", emailAddress
showPlayerRegistrationFailedGUI(client, getLocaleString(client, "RegistrationFailedNoPasswordWeak"));
logToConsole(LOG_WARN, `${getPlayerDisplayForConsole(client)} failed to create an account (password doesn't meet requirements)`);
} else {
messagePlayerError(client, "Password doesn't meet requirements!");
messagePlayerError(client, getLocaleString(client, "PasswordNotGoodEnough"));
let passwordRequirements = []
if (getGlobalConfig().passwordRequiredCapitals > 0) {
passwordRequirements.push(getLocaleString(client, "PasswordNeedsCapitals", getGlobalConfig().passwordRequiredCapitals))
}
if (getGlobalConfig().passwordRequiredNumbers > 0) {
passwordRequirements.push(getLocaleString(client, "PasswordNeedsNumbers", getGlobalConfig().passwordRequiredNumbers))
}
if (getGlobalConfig().passwordRequiredSymbols > 0) {
passwordRequirements.push(getLocaleString(client, "PasswordNeedsSymbols", getGlobalConfig().passwordRequiredSymbols))
}
messagePlayerInfo(client, getLocaleString(client, "PasswordNeedsBase", passwordRequirements.join(", ")));
}
return false;
}
@@ -1231,7 +1247,7 @@ function checkRegistration(client, password, confirmPassword = "", emailAddress
messagePlayerAlert(client, getLocaleString(client, "RegistrationFailedCreateError"));
}
messagePlayerAlert(client, `${getServerName()} staff have been notified of the problem and will fix it shortly.`);
messagePlayerAlert(client, getLocaleString(client, "DevelopersNotified"));
return false;
}
@@ -1251,16 +1267,16 @@ function checkRegistration(client, password, confirmPassword = "", emailAddress
if (doesServerHaveTesterOnlyEnabled() && !isPlayerATester(client)) {
setTimeout(function () {
getPlayerData(client).customDisconnectReason = "Kicked - Not a tester";
getPlayerData(client).customDisconnectReason = "NotATester";
disconnectPlayer(client);
}, 5000);
if (doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the error GUI (not a tester).`);
logToConsole(LOG_DEBUG, `[AGRP.Account] ${getPlayerDisplayForConsole(client)} is being shown the error GUI (not a tester).`);
showPlayerErrorGUI(client, getLocaleString(client, "NotATester"), getLocaleString(client, "AccessDenied"));
return false;
} else {
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the "not a tester" error message (GUI disabled).`);
logToConsole(LOG_DEBUG, `[AGRP.Account] ${getPlayerDisplayForConsole(client)} is being shown the "not a tester" error message (GUI disabled).`);
messagePlayerError(client, getLocaleString(client, "NotATester"));
return false;
}
@@ -1272,7 +1288,7 @@ function checkRegistration(client, password, confirmPassword = "", emailAddress
showPlayerPrompt(client, getLocaleString(client, "NoCharactersGUIMessage"), getLocaleString(client, "NoCharactersGUIWindowTitle"), getLocaleString(client, "Yes"), getLocaleString(client, "No"));
getPlayerData(client).promptType = AGRP_PROMPT_CREATEFIRSTCHAR;
} else {
messagePlayerAlert(client, getLocaleString(client, "NoCharactersChatMessage"), `{ALTCOLOUR}/newchar{MAINCOLOUR}`);
messagePlayerAlert(client, getLocaleString(client, "NoCharactersChatMessage", `{ALTCOLOUR}/newchar{MAINCOLOUR}`));
}
}
};
@@ -1313,7 +1329,7 @@ function checkAccountResetPasswordRequest(client, inputText) {
logToConsole(LOG_INFO | LOG_WARN, `${getPlayerDisplayForConsole(client)} failed to reset their password (verification code not correct, ${getPlayerData(client).passwordResetAttemptsRemaining} attempts remaining)`);
if (getPlayerData(client).passwordResetAttemptsRemaining <= 0) {
logToConsole(LOG_INFO | LOG_WARN, `${getPlayerDisplayForConsole(client)} failed to reset their password (verification code not correct, no more attempts remaining, kicking ...)`);
getPlayerData(client).customDisconnectReason = "Kicked - Failed to login";
getPlayerData(client).customDisconnectReason = "FailedToLogin";
disconnectPlayer(client);
return false;
}
@@ -1352,9 +1368,9 @@ function checkAccountChangePassword(client, newPassword, confirmNewPassword) {
if (!doesPasswordMeetRequirements(newPassword)) {
let passwordRequirementsString = `${needsCapitals}, ${needsNumbers}, ${needsSymbols}`;
let needsCapitals = getLocaleString(client, "PasswordNeedsCapitals", "1");
let needsNumbers = getLocaleString(client, "PasswordNeedsNumbers", "1");
let needsSymbols = getLocaleString(client, "PasswordNeedsSymbols", "1");
let needsCapitals = getLocaleString(client, "PasswordNeedsCapitals", getGlobalConfig().passwordRequiredCapitals);
let needsNumbers = getLocaleString(client, "PasswordNeedsNumbers", getGlobalConfig().passwordRequiredNumbers);
let needsSymbols = getLocaleString(client, "PasswordNeedsSymbols", getGlobalConfig().passwordRequiredSymbols);
messagePlayerError(client, getLocaleString(client, "AccountPasswordNeedsImproved"));
messagePlayerInfo(client, getLocaleString(client, "PasswordNeedsBase", passwordRequirementsString));
@@ -1391,11 +1407,11 @@ function isValidEmailAddress(emailAddress) {
// ===========================================================================
function saveAllPlayersToDatabase() {
logToConsole(LOG_DEBUG, "[VRR.Account]: Saving all clients to database ...");
logToConsole(LOG_DEBUG, "[AGRP.Account]: Saving all clients to database ...");
getClients().forEach(function (client) {
savePlayerToDatabase(client);
});
logToConsole(LOG_DEBUG, "[VRR.Account]: All clients saved to database successfully!");
logToConsole(LOG_DEBUG, "[AGRP.Account]: All clients saved to database successfully!");
}
// ===========================================================================
@@ -1409,7 +1425,7 @@ function savePlayerToDatabase(client) {
return false;
}
logToConsole(LOG_DEBUG, `[VRR.Account]: Saving client ${getPlayerName(client)} to database ...`);
logToConsole(LOG_DEBUG, `[AGRP.Account]: Saving client ${getPlayerName(client)} to database ...`);
saveAccountToDatabase(getPlayerData(client).accountData);
if (getPlayerData(client).currentSubAccount != -1) {
@@ -1431,100 +1447,12 @@ function savePlayerToDatabase(client) {
saveSubAccountToDatabase(getPlayerCurrentSubAccount(client));
}
logToConsole(LOG_DEBUG, `[VRR.Account]: Saved client ${getPlayerDisplayForConsole(client)} to database successfully!`);
logToConsole(LOG_DEBUG, `[AGRP.Account]: Saved client ${getPlayerDisplayForConsole(client)} to database successfully!`);
return true;
}
// ===========================================================================
function initClient(client) {
logToConsole(LOG_DEBUG, `[VRR.Account] Initializing client ${getPlayerDisplayForConsole(client)} ...`);
if (isConsole(client)) {
logToConsole(LOG_DEBUG | LOG_ERROR, `[VRR.Account] Client initialization failed for ${getPlayerDisplayForConsole(client)}! (is console client)`);
return false;
}
logToConsole(LOG_DEBUG, `[VRR.Account] Initializing client ${getPlayerDisplayForConsole(client)} ...`);
if (playerInitialized[client.index] == true) {
logToConsole(LOG_DEBUG | LOG_ERROR, `[VRR.Account] Client initialization failed for ${getPlayerDisplayForConsole(client)}! (already initialized)`);
return false;
}
playerInitialized[client.index] = true;
//setEntityData(client, "agrp.isInitialized", true, false);
logToConsole(LOG_DEBUG, `[VRR.Account] Initializing GUI for ${getPlayerDisplayForConsole(client)} ...`);
sendPlayerGUIColours(client);
sendPlayerGUIInit(client);
updatePlayerSnowState(client);
//logToConsole(LOG_DEBUG, `[VRR.Account] Showing connect camera to ${getPlayerDisplayForConsole(client)} ...`);
//showConnectCameraToPlayer(client);
messageClient(`Please wait ...`, client, getColourByName("softGreen"));
logToConsole(LOG_DEBUG, `[VRR.Account] Waiting for 2.5 seconds to prevent race attack ...`);
setTimeout(function () {
if (client != null) {
clearChatBox(client);
logToConsole(LOG_DEBUG, `[VRR.Account] Loading account for ${getPlayerDisplayForConsole(client)}`);
let tempAccountData = loadAccountFromName(getPlayerName(client), true);
logToConsole(LOG_DEBUG, `[VRR.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, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the login GUI.`);
showPlayerLoginGUI(client);
} else {
logToConsole(LOG_DEBUG, `[VRR.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(getPlayerIP(client));
// let localeId = getLocaleFromCountryISO(iso);
//}
//showSmallGameMessage(client, getLocaleString(client, "LocaleOffer", `/lang ${getLocaleData(localeId)[2]}`), getColourByName("white"), 10000, "Roboto");
}
startLoginTimeoutForPlayer(client);
playRadioStreamForPlayer(client, getServerIntroMusicURL(), true, getPlayerStreamingRadioVolume(client));
}
} else {
sendPlayerLocaleId(client, 0);
if (doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client)) {
logToConsole(LOG_DEBUG, `[VRR.Account] ${getPlayerDisplayForConsole(client)} is being shown the register GUI.`);
showPlayerRegistrationGUI(client);
} else {
logToConsole(LOG_DEBUG, `[VRR.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);
}
// ===========================================================================
function saveConnectionToDatabase(client) {
let dbConnection = connectToDatabase();
if (dbConnection) {
@@ -1548,7 +1476,7 @@ function createDefaultAccountServerData(accountDatabaseId) {
// ===========================================================================
function loadAccountKeybindsFromDatabase(accountDatabaseID) {
logToConsole(LOG_DEBUG, `[VRR.Account]: Loading account keybinds for account ${accountDatabaseID} from database ...`);
logToConsole(LOG_DEBUG, `[AGRP.Account]: Loading account keybinds for account ${accountDatabaseID} from database ...`);
let tempAccountKeybinds = [];
let dbConnection = connectToDatabase();
@@ -1572,7 +1500,7 @@ function loadAccountKeybindsFromDatabase(accountDatabaseID) {
while (dbAssoc = fetchQueryAssoc(dbQuery)) {
let tempAccountKeyBindData = new KeyBindData(dbAssoc);
tempAccountKeybinds.push(tempAccountKeyBindData);
logToConsole(LOG_DEBUG, `[VRR.Account]: Account keybind '${tempAccountKeyBindData.databaseId}' (Key ${tempAccountKeyBindData.key} '${toUpperCase(getKeyNameFromId(tempAccountKeyBindData.key))}') loaded from database successfully!`);
logToConsole(LOG_DEBUG, `[AGRP.Account]: Account keybind '${tempAccountKeyBindData.databaseId}' (Key ${tempAccountKeyBindData.key} '${toUpperCase(getKeyNameFromId(tempAccountKeyBindData.key))}') loaded from database successfully!`);
}
}
freeDatabaseQuery(dbQuery);
@@ -1581,14 +1509,14 @@ function loadAccountKeybindsFromDatabase(accountDatabaseID) {
}
}
logToConsole(LOG_DEBUG, `[VRR.Account]: ${tempAccountKeybinds.length} account keybinds for account ${accountDatabaseID} loaded from database successfully!`);
logToConsole(LOG_DEBUG, `[AGRP.Account]: ${tempAccountKeybinds.length} account keybinds for account ${accountDatabaseID} loaded from database successfully!`);
return tempAccountKeybinds;
}
// ===========================================================================
function loadAccountStaffNotesFromDatabase(accountDatabaseID) {
logToConsole(LOG_DEBUG, `[VRR.Account]: Loading account staff notes for account ${accountDatabaseID} from database ...`);
logToConsole(LOG_DEBUG, `[AGRP.Account]: Loading account staff notes for account ${accountDatabaseID} from database ...`);
let tempAccountStaffNotes = [];
let dbConnection = connectToDatabase();
@@ -1602,7 +1530,7 @@ function loadAccountStaffNotesFromDatabase(accountDatabaseID) {
while (dbAssoc = fetchQueryAssoc(dbQuery)) {
let tempAccountStaffNoteData = new AccountStaffNoteData(dbAssoc);
tempAccountStaffNotes.push(tempAccountStaffNoteData);
logToConsole(LOG_DEBUG, `[VRR.Account]: Account staff note '${tempAccountStaffNoteData.databaseId}' loaded from database successfully!`);
logToConsole(LOG_DEBUG, `[AGRP.Account]: Account staff note '${tempAccountStaffNoteData.databaseId}' loaded from database successfully!`);
}
}
freeDatabaseQuery(dbQuery);
@@ -1610,14 +1538,14 @@ function loadAccountStaffNotesFromDatabase(accountDatabaseID) {
disconnectFromDatabase(dbConnection);
}
logToConsole(LOG_DEBUG, `[VRR.Account]: ${tempAccountStaffNotes.length} account staff notes for account ${accountDatabaseID} loaded from database successfully!`);
logToConsole(LOG_DEBUG, `[AGRP.Account]: ${tempAccountStaffNotes.length} account staff notes for account ${accountDatabaseID} loaded from database successfully!`);
return tempAccountStaffNotes;
}
// ===========================================================================
function loadAccountContactsFromDatabase(accountDatabaseID) {
logToConsole(LOG_DEBUG, `[VRR.Account]: Loading account contacts for account ${accountDatabaseID} from database ...`);
logToConsole(LOG_DEBUG, `[AGRP.Account]: Loading account contacts for account ${accountDatabaseID} from database ...`);
let tempAccountContacts = [];
let dbConnection = connectToDatabase();
@@ -1631,7 +1559,7 @@ function loadAccountContactsFromDatabase(accountDatabaseID) {
while (dbAssoc = fetchQueryAssoc(dbQuery)) {
let tempAccountContactData = new AccountContactData(dbAssoc);
tempAccountContacts.push(tempAccountContactData);
logToConsole(LOG_DEBUG, `[VRR.Account]: Account contact '${tempAccountContactData.databaseId}' loaded from database successfully!`);
logToConsole(LOG_DEBUG, `[AGRP.Account]: Account contact '${tempAccountContactData.databaseId}' loaded from database successfully!`);
}
}
freeDatabaseQuery(dbQuery);
@@ -1639,14 +1567,14 @@ function loadAccountContactsFromDatabase(accountDatabaseID) {
disconnectFromDatabase(dbConnection);
}
logToConsole(LOG_DEBUG, `[VRR.Account]: ${tempAccountContacts.length} account contacts for account ${accountDatabaseID} loaded from database successfully!`);
logToConsole(LOG_DEBUG, `[AGRP.Account]: ${tempAccountContacts.length} account contacts for account ${accountDatabaseID} loaded from database successfully!`);
return tempAccountContacts;
}
// ===========================================================================
function loadAccountMessagesFromDatabase(accountDatabaseID) {
logToConsole(LOG_DEBUG, `[VRR.Account]: Loading account messages for account ${accountDatabaseID} from database ...`);
logToConsole(LOG_DEBUG, `[AGRP.Account]: Loading account messages for account ${accountDatabaseID} from database ...`);
let tempAccountMessages = [];
let dbConnection = connectToDatabase();
@@ -1660,7 +1588,7 @@ function loadAccountMessagesFromDatabase(accountDatabaseID) {
while (dbAssoc = fetchQueryAssoc(dbQuery)) {
let tempAccountMessageData = new AccountContactData(dbAssoc);
tempAccountMessages.push(tempAccountMessageData);
logToConsole(LOG_DEBUG, `[VRR.Account]: Account contact '${tempAccountMessageData.databaseId}' loaded from database successfully!`);
logToConsole(LOG_DEBUG, `[AGRP.Account]: Account contact '${tempAccountMessageData.databaseId}' loaded from database successfully!`);
}
}
freeDatabaseQuery(dbQuery);
@@ -1668,7 +1596,7 @@ function loadAccountMessagesFromDatabase(accountDatabaseID) {
disconnectFromDatabase(dbConnection);
}
logToConsole(LOG_DEBUG, `[VRR.Account]: ${tempAccountMessages.length} account messages for account ${accountDatabaseID} loaded from database successfully!`);
logToConsole(LOG_DEBUG, `[AGRP.Account]: ${tempAccountMessages.length} account messages for account ${accountDatabaseID} loaded from database successfully!`);
return tempAccountMessages;
}
@@ -1747,34 +1675,34 @@ function generateEmailVerificationCode() {
// ===========================================================================
function sendEmailVerificationEmail(client, emailVerificationCode) {
async function sendEmailVerificationEmail(client, emailVerificationCode) {
let emailBodyText = getEmailConfig().bodyContent.confirmEmail;
emailBodyText = emailBodyText.replace("{VERIFICATIONCODE}", emailVerificationCode);
emailBodyText = emailBodyText.replace("{SERVERNAME}", getServerName());
sendEmail(getPlayerData(client).accountData.emailAddress, getPlayerData(client).accountData.name, `Confirm email on ${getServerName()}`, emailBodyText);
await sendEmail(getPlayerData(client).accountData.emailAddress, getPlayerData(client).accountData.name, `Confirm email on ${getServerName()}`, emailBodyText);
}
// ===========================================================================
function sendPasswordResetEmail(client, verificationCode) {
async function sendPasswordResetEmail(client, verificationCode) {
let emailBodyText = getEmailConfig().bodyContent.confirmPasswordReset;
emailBodyText = emailBodyText.replace("{VERIFICATIONCODE}", verificationCode);
emailBodyText = emailBodyText.replace("{SERVERNAME}", getServerName());
sendEmail(getPlayerData(client).accountData.emailAddress, getPlayerData(client).accountData.name, `Reset your password on ${getServerName()}`, emailBodyText);
await sendEmail(getPlayerData(client).accountData.emailAddress, getPlayerData(client).accountData.name, `Reset your password on ${getServerName()}`, emailBodyText);
}
// ===========================================================================
function verifyAccountEmail(accountData, verificationCode) {
async function verifyAccountEmail(accountData, verificationCode) {
let emailVerificationCode = generateRandomString(10);
let emailBodyText = getEmailConfig().bodyContent.confirmEmail;
emailBodyText = emailBodyText.replace("{VERIFICATIONCODE}", emailVerificationCode);
emailBodyText = emailBodyText.replace("{SERVERNAME}", getServerName());
sendEmail(getPlayerData(client).accountData.emailAddress, getPlayerData(client).accountData.name, `Confirm email on ${getServerName()}`, emailBodyText);
await sendEmail(getPlayerData(client).accountData.emailAddress, getPlayerData(client).accountData.name, `Confirm email on ${getServerName()}`, emailBodyText);
getPlayerData(client).accountData.emailAddress = emailAddress;
getPlayerData(client).accountData.emailVerificationCode = module.hashing.sha512(emailVerificationCode);
@@ -1782,7 +1710,7 @@ function verifyAccountEmail(accountData, verificationCode) {
// ===========================================================================
function sendAccountLoginFailedNotification(emailAddress, name, ip, game = getGame()) {
async function sendAccountLoginFailedNotification(emailAddress, name, ip, game = getGame()) {
let countryName = module.geoip.getCountryName(getGlobalConfig().geoIPCountryDatabaseFilePath, ip);
let subDivisionName = module.geoip.getSubdivisionName(getGlobalConfig().geoIPCityDatabaseFilePath, ip);
let cityName = module.geoip.getCityName(getGlobalConfig().geoIPCityDatabaseFilePath, ip);
@@ -1794,13 +1722,13 @@ function sendAccountLoginFailedNotification(emailAddress, name, ip, game = getGa
emailBodyText = emailBodyText.replace("{SERVERNAME}", getServerName());
emailBodyText = emailBodyText.replace("{TIMESTAMP}", new Date().toLocaleString('en-US'));
sendEmail(emailAddress, name, `Login failed on ${getServerName()}`, emailBodyText);
await sendEmail(emailAddress, name, `Login failed on ${getServerName()}`, emailBodyText);
return true;
}
// ===========================================================================
function sendAccountLoginSuccessNotification(emailAddress, name, ip, game = getGame()) {
async function sendAccountLoginSuccessNotification(emailAddress, name, ip, game = getGame()) {
let countryName = module.geoip.getCountryName(getGlobalConfig().geoIPCountryDatabaseFilePath, ip);
let subDivisionName = module.geoip.getSubdivisionName(getGlobalConfig().geoIPCityDatabaseFilePath, ip);
let cityName = module.geoip.getCityName(getGlobalConfig().geoIPCityDatabaseFilePath, ip);
@@ -1812,7 +1740,7 @@ function sendAccountLoginSuccessNotification(emailAddress, name, ip, game = getG
emailBodyText = emailBodyText.replace("{SERVERNAME}", getServerName());
emailBodyText = emailBodyText.replace("{TIMESTAMP}", new Date().toLocaleString('en-US'));
sendEmail(emailAddress, name, `Login successful on ${getServerName()}`, emailBodyText);
await sendEmail(emailAddress, name, `Login successful on ${getServerName()}`, emailBodyText);
return true;
}
@@ -1845,7 +1773,7 @@ function checkPlayerTwoFactorAuthentication(client, authCode) {
}
}
getPlayerData(client).customDisconnectReason = "Kicked - Failed to login";
getPlayerData(client).customDisconnectReason = "FailedToLogin";
disconnectPlayer(client);
return false;
}
@@ -1858,13 +1786,13 @@ function isPlayerATester(client) {
// ===========================================================================
function sendAccountTwoFactorAuthCode(emailAddress, name, twoFactorAuthCode) {
async function sendAccountTwoFactorAuthCode(emailAddress, name, twoFactorAuthCode) {
let emailBodyText = getEmailConfig().bodyContent.twoFactorAuthentication;
emailBodyText = emailBodyText.replace("{2FACODE}", twoFactorAuthCode);
emailBodyText = emailBodyText.replace("{GAMENAME}", getGameName(getGame()));
emailBodyText = emailBodyText.replace("{SERVERNAME}", getServerName());
sendEmail(emailAddress, name, `Login code for ${getServerName()}`, emailBodyText);
await sendEmail(emailAddress, name, `Login code for ${getServerName()}`, emailBodyText);
return true;
}
@@ -1873,7 +1801,7 @@ function sendAccountTwoFactorAuthCode(emailAddress, name, twoFactorAuthCode) {
function startLoginTimeoutForPlayer(client) {
getPlayerData(client).loginTimeout = setTimeout(function () {
if (isPlayerLoggedIn(client) == false) {
getPlayerData(client).customDisconnectReason = "Kicked - Login timeout";
getPlayerData(client).customDisconnectReason = "FailedToLogin";
disconnectPlayer(client);
}
}, getGlobalConfig().loginTimeout);

View File

@@ -9,8 +9,8 @@
// ===========================================================================
function initAnimationScript() {
logToConsole(LOG_DEBUG, "[VRR.Animation]: Initializing animation script ...");
logToConsole(LOG_DEBUG, "[VRR.Animation]: Animation script initialized!");
logToConsole(LOG_DEBUG, "[AGRP.Animation]: Initializing animation script ...");
logToConsole(LOG_DEBUG, "[AGRP.Animation]: Animation script initialized!");
}
// ===========================================================================
@@ -44,7 +44,9 @@ function playPlayerAnimationCommand(command, params, client) {
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);
}
@@ -66,6 +68,8 @@ function stopPlayerAnimationCommand(command, params, client) {
getPlayerData(client).animationForced = false;
//setPlayerMouseCameraState(client, false);
markPlayerActionTipSeen(client, "AnimationStop");
}
// ===========================================================================
@@ -98,7 +102,7 @@ function makePlayerPlayAnimation(client, animationSlot, offsetPosition = 1) {
getPlayerData(client).animationForced = false;
makePedPlayAnimation(getPlayerPed(client), animationSlot, offsetPosition);
setEntityData(getPlayerPed(client), "agrp.anim", animationSlot, true);
//setEntityData(getPlayerPed(client), "agrp.anim", animationSlot, true);
//if(getAnimationData(animationSlot)[9] != AGRP_ANIMMOVE_NONE) {
// if(getGame() < AGRP_GAME_GTA_SA) {
// setPlayerMouseCameraState(client, true);

View File

@@ -9,8 +9,8 @@
// ===========================================================================
function initAntiCheatScript() {
logToConsole(LOG_DEBUG, "[VRR.AntiCheat]: Initializing anticheat script ...");
logToConsole(LOG_DEBUG, "[VRR.AntiCheat]: Anticheat script initialized!");
logToConsole(LOG_DEBUG, "[AGRP.AntiCheat]: Initializing anticheat script ...");
logToConsole(LOG_DEBUG, "[AGRP.AntiCheat]: Anticheat script initialized!");
}
// ===========================================================================

View File

@@ -39,8 +39,8 @@ class BanData {
// ===========================================================================
function initBanScript() {
logToConsole(LOG_INFO, "[VRR.Ban]: Initializing ban script ...");
logToConsole(LOG_INFO, "[VRR.Ban]: Ban script initialized!");
logToConsole(LOG_INFO, "[AGRP.Ban]: Initializing ban script ...");
logToConsole(LOG_INFO, "[AGRP.Ban]: Ban script initialized!");
}
// ===========================================================================
@@ -66,12 +66,12 @@ function accountBanCommand(command, params, client) {
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}`);
banAccount(getPlayerData(targetClient).accountData.databaseId, getPlayerData(client).accountData.databaseId, reason);
getPlayerData(targetClient).customDisconnectReason = `Banned - ${reason}`;
getPlayerData(targetClient).customDisconnectReason = "Banned";
disconnectPlayer(targetClient);
}
@@ -98,12 +98,12 @@ function subAccountBanCommand(command, params, client, fromDiscord) {
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}`);
banSubAccount(getPlayerData(targetClient).currentSubAccountData.databaseId, getPlayerData(client).accountData.databaseId, reason);
getPlayerData(targetClient).customDisconnectReason = `Banned - ${reason}`;
getPlayerData(targetClient).customDisconnectReason = "Banned";
disconnectPlayer(targetClient);
}
@@ -133,7 +133,7 @@ function ipBanCommand(command, params, client, fromDiscord) {
announceAdminAction(`PlayerIPBanned`, `{ALTCOLOUR}${getPlayerName(targetClient)}{MAINCOLOUR}`);
banIPAddress(getPlayerIP(targetClient), getPlayerData(client).accountData.databaseId, reason);
getPlayerData(targetClient).customDisconnectReason = `IP Banned - ${reason}`;
getPlayerData(targetClient).customDisconnectReason = "Banned";
serverBanIP(getPlayerIP(targetClient));
disconnectPlayer(targetClient);
}
@@ -165,7 +165,7 @@ function subNetBanCommand(command, params, client, fromDiscord) {
announceAdminAction(`PlayerSubNetBanned`, `{ALTCOLOUR}${getPlayerName(client)}{MAINCOLOUR}`);
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));
}

View File

@@ -16,7 +16,7 @@ let serverBitFlags = {
accountSettingsFlags: {},
subAccountSettingsFlags: {},
accountFlags: {},
seenHelpTipsFlags: {},
seenActionTipsFlags: {},
npcTriggerTypeFlags: {},
npcTriggerConditionTypesFlags: {},
npcTriggerResponseTypeFlags: {},
@@ -240,12 +240,28 @@ let serverBitFlagKeys = {
"EnterProperty",
"SearchArea",
],
seenHelpTipsKeys: [
seenActionTipsKeys: [
"None",
"VehicleEngineOffWhenEntering",
"VehicleLockedAfterEntryAttempt",
"ShowItemsAfterPurchase",
"BuyCommandAfterEnterBusiness",
"UseItemKeyAfterEquipping",
"UseItemKeyAfterEquippingWalkieTalkie",
"RadioCommandAfterEnablingWalkieTalkie",
"ReplyToDirectMessage",
"UseItemKeyAmmoAfterEquippingWeapon",
"AnimationStop",
"JobEquipmentInventory",
"ViewInventory",
"VehicleRepairItemUsage",
"VehicleColourItemUsage",
"VehiclePartItemUsage",
"AmmoClipItemUsage",
"GenericItemUsage",
"EnterJobVehicleForRoute",
"JobLocations",
"JobRouteStart",
],
jobRankKeys: [
"None",
@@ -265,7 +281,7 @@ let serverBitFlagKeys = {
// ===========================================================================
function initBitFlagScript() {
logToConsole(LOG_DEBUG, "[VRR.BitFlag]: Initializing bit flag script ...");
logToConsole(LOG_DEBUG, "[AGRP.BitFlag]: Initializing bit flag script ...");
serverBitFlags.staffFlags = createBitFlagTable(serverBitFlagKeys.staffFlagKeys);
serverBitFlags.moderationFlags = createBitFlagTable(serverBitFlagKeys.moderationFlagKeys);
serverBitFlags.accountSettingsFlags = createBitFlagTable(serverBitFlagKeys.accountSettingsFlagKeys);
@@ -277,9 +293,9 @@ function initBitFlagScript() {
serverBitFlags.npcTriggerTypes = createBitFlagTable(serverBitFlagKeys.npcTriggerTypeKeys);
serverBitFlags.npcTriggerConditionTypes = createBitFlagTable(serverBitFlagKeys.npcTriggerConditionTypeKeys);
serverBitFlags.npcTriggerResponseTypes = createBitFlagTable(serverBitFlagKeys.npcTriggerResponseTypeKeys);
serverBitFlags.seenHelpTips = createBitFlagTable(serverBitFlagKeys.seenHelpTipsKeys);
serverBitFlags.seenActionTips = createBitFlagTable(serverBitFlagKeys.seenActionTipsKeys);
serverBitFlags.jobRankFlags = createBitFlagTable(serverBitFlagKeys.jobRankKeys);
logToConsole(LOG_INFO, "[VRR.BitFlag]: Bit flag script initialized successfully!");
logToConsole(LOG_INFO, "[AGRP.BitFlag]: Bit flag script initialized successfully!");
return true;
}
@@ -443,6 +459,20 @@ function getClanDiscordWebhookValue(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) {
if (!getStaffFlagValue(flagName)) {
return false;

View File

@@ -59,6 +59,7 @@ class BusinessData {
this.needsSaved = false;
this.interiorLights = true;
this.type = AGRP_BIZ_TYPE_NONE;
this.propertyType = AGRP_PROPERTY_TYPE_BUSINESS;
this.floorItemCache = [];
this.storageItemCache = [];
@@ -73,6 +74,7 @@ class BusinessData {
this.entranceBlipModel = -1;
this.entrancePickup = null;
this.entranceBlip = null;
this.entranceScene = "";
this.exitPosition = false;
this.exitRotation = 0.0;
@@ -82,6 +84,7 @@ class BusinessData {
this.exitBlipModel = -1;
this.exitPickup = null;
this.exitBlip = null;
this.exitScene = "";
this.entranceFee = 0;
this.till = 0;
@@ -89,6 +92,8 @@ class BusinessData {
this.streamingRadioStation = 0;
//this.streamingRadioStationIndex = -1;
this.paintBallPlayers = [];
this.labelHelpType = AGRP_PROPLABEL_INFO_NONE;
if (dbAssoc) {
@@ -108,6 +113,7 @@ class BusinessData {
this.entranceDimension = toInteger(dbAssoc["biz_entrance_vw"]);
this.entrancePickupModel = toInteger(dbAssoc["biz_entrance_pickup"]);
this.entranceBlipModel = toInteger(dbAssoc["biz_entrance_blip"]);
this.entranceScene = toString(dbAssoc["biz_entrance_scene"]);
this.exitPosition = toVector3(dbAssoc["biz_exit_pos_x"], dbAssoc["biz_exit_pos_y"], dbAssoc["biz_exit_pos_z"]);
this.exitRotation = toInteger(dbAssoc["biz_exit_rot_z"]);
@@ -115,6 +121,7 @@ class BusinessData {
this.exitDimension = toInteger(dbAssoc["biz_exit_vw"]);
this.exitPickupModel = toInteger(dbAssoc["biz_exit_pickup"]);
this.exitBlipModel = toInteger(dbAssoc["biz_exit_blip"]);
this.exitScene = toString(dbAssoc["biz_exit_scene"]);
this.entranceFee = toInteger(dbAssoc["biz_entrance_fee"]);
this.till = toInteger(dbAssoc["biz_till"]);
@@ -182,8 +189,8 @@ class BusinessGameScriptData {
// ===========================================================================
function initBusinessScript() {
logToConsole(LOG_INFO, "[VRR.Business]: Initializing business script ...");
logToConsole(LOG_INFO, "[VRR.Business]: Business script initialized successfully!");
logToConsole(LOG_INFO, "[AGRP.Business]: Initializing business script ...");
logToConsole(LOG_INFO, "[AGRP.Business]: Business script initialized successfully!");
return true;
}
@@ -197,7 +204,7 @@ function loadBusinessFromId(businessId) {
if (dbQuery) {
let dbAssoc = fetchQueryAssoc(dbQuery);
freeDatabaseQuery(dbQuery);
return new BusinessData(dbAssoc);
return new BusinessData(dbAssoc[0]);
}
disconnectFromDatabase(dbConnection);
}
@@ -207,39 +214,33 @@ function loadBusinessFromId(businessId) {
// ===========================================================================
function loadBusinessesFromDatabase() {
logToConsole(LOG_INFO, "[VRR.Business]: Loading businesses from database ...");
async function loadBusinessesFromDatabase() {
logToConsole(LOG_INFO, "[AGRP.Business]: Loading businesses from database ...");
let tempBusinesses = [];
let dbConnection = connectToDatabase();
let dbQuery = null;
let dbAssoc;
let dbAssoc = [];
if (dbConnection) {
dbQuery = queryDatabase(dbConnection, `SELECT * FROM biz_main WHERE biz_deleted = 0 AND biz_server = ${getServerId()}`);
if (dbQuery) {
if (dbQuery.numRows > 0) {
while (dbAssoc = fetchQueryAssoc(dbQuery)) {
let tempBusinessData = new BusinessData(dbAssoc);
tempBusinessData.locations = loadBusinessLocationsFromDatabase(tempBusinessData.databaseId);
//tempBusinessData.gameScripts = loadBusinessGameScriptsFromDatabase(tempBusinessData.databaseId);
tempBusinesses.push(tempBusinessData);
logToConsole(LOG_VERBOSE, `[VRR.Business]: Business '${tempBusinessData.name}' (ID ${tempBusinessData.databaseId}) loaded from database successfully!`);
}
}
freeDatabaseQuery(dbQuery);
dbAssoc = await fetchQueryAssoc(dbConnection, `SELECT * FROM biz_main WHERE biz_server = ${getServerId()}`);
for (let i in dbAssoc) {
let tempBusinessData = new BusinessData(dbAssoc[i]);
tempBusinessData.locations = loadBusinessLocationsFromDatabase(tempBusinessData.databaseId);
//tempBusinessData.gameScripts = loadBusinessGameScriptsFromDatabase(tempBusinessData.databaseId);
tempBusinesses.push(tempBusinessData);
logToConsole(LOG_VERBOSE, `[VRR.Business]: Business '${tempBusinessData.name}' (ID ${tempBusinessData.databaseId}) loaded from database successfully!`);
}
disconnectFromDatabase(dbConnection);
}
logToConsole(LOG_INFO, `[VRR.Business]: ${tempBusinesses.length} businesses loaded from database successfully!`);
logToConsole(LOG_INFO, `[AGRP.Business]: ${tempBusinesses.length} businesses loaded from database successfully!`);
return tempBusinesses;
}
// ===========================================================================
function loadBusinessLocationsFromDatabase(businessId) {
logToConsole(LOG_VERBOSE, `[VRR.Business]: Loading business locations for business ${businessId} from database ...`);
async function loadBusinessLocationsFromDatabase(businessId) {
logToConsole(LOG_VERBOSE, `[AGRP.Business]: Loading business locations for business ${businessId} from database ...`);
let tempBusinessLocations = [];
let dbConnection = connectToDatabase();
@@ -249,21 +250,16 @@ function loadBusinessLocationsFromDatabase(businessId) {
if (dbConnection) {
dbQueryString = `SELECT * FROM biz_loc WHERE biz_loc_biz = ${businessId}`;
dbQuery = queryDatabase(dbConnection, dbQueryString);
if (dbQuery) {
if (dbQuery.numRows > 0) {
while (dbAssoc = fetchQueryAssoc(dbQuery)) {
let tempBusinessLocationData = new BusinessLocationData(dbAssoc);
tempBusinessLocations.push(tempBusinessLocationData);
logToConsole(LOG_VERBOSE, `[VRR.Business]: Location '${tempBusinessLocationData.name}' loaded from database successfully!`);
}
}
freeDatabaseQuery(dbQuery);
dbAssoc = await fetchQueryAssoc(dbConnection, dbQueryString);
for (let i in dbAssoc) {
let tempBusinessLocationData = new BusinessLocationData(dbAssoc[i]);
tempBusinessLocations.push(tempBusinessLocationData);
logToConsole(LOG_VERBOSE, `[AGRP.Business]: Location '${tempBusinessLocationData.name}' loaded from database successfully!`);
}
disconnectFromDatabase(dbConnection);
}
logToConsole(LOG_VERBOSE, `[VRR.Business]: ${tempBusinessLocations.length} location for business ${businessId} loaded from database successfully!`);
logToConsole(LOG_VERBOSE, `[AGRP.Business]: ${tempBusinessLocations.length} location for business ${businessId} loaded from database successfully!`);
return tempBusinessLocations;
}
@@ -271,7 +267,7 @@ function loadBusinessLocationsFromDatabase(businessId) {
/*
function loadBusinessGameScriptsFromDatabase(businessId) {
logToConsole(LOG_VERBOSE, `[VRR.Business]: Loading business game scripts for business ${businessId} from database ...`);
logToConsole(LOG_VERBOSE, `[AGRP.Business]: Loading business game scripts for business ${businessId} from database ...`);
let tempBusinessGameScripts = [];
let dbConnection = connectToDatabase();
@@ -287,7 +283,7 @@ function loadBusinessGameScriptsFromDatabase(businessId) {
while(dbAssoc = fetchQueryAssoc(dbQuery)) {
let tempBusinessGameScriptData = new BusinessGameScriptData(dbAssoc);
tempBusinessGameScripts.push(tempBusinessGameScriptData);
logToConsole(LOG_VERBOSE, `[VRR.Business]: Game script '${tempBusinessGameScriptData.name}' loaded from database successfully!`);
logToConsole(LOG_VERBOSE, `[AGRP.Business]: Game script '${tempBusinessGameScriptData.name}' loaded from database successfully!`);
}
}
freeDatabaseQuery(dbQuery);
@@ -295,7 +291,7 @@ function loadBusinessGameScriptsFromDatabase(businessId) {
disconnectFromDatabase(dbConnection);
}
logToConsole(LOG_VERBOSE, `[VRR.Business]: ${tempBusinessGameScripts.length} game scripts for business ${businessId} loaded from database successfully!`);
logToConsole(LOG_VERBOSE, `[AGRP.Business]: ${tempBusinessGameScripts.length} game scripts for business ${businessId} loaded from database successfully!`);
return tempBusinessGameScripts;
}
*/
@@ -312,9 +308,17 @@ function loadBusinessGameScriptsFromDatabase(businessId) {
*
*/
function createBusinessCommand(command, params, client) {
createBusiness(params, getPlayerPosition(client), toVector3(0.0, 0.0, 0.0), getGameConfig().pickupModels[getGame()].Business, -1, getPlayerInterior(client), getPlayerDimension(client), getPlayerData(client).interiorCutscene);
createBusiness(
params,
getPlayerPosition(client),
toVector3(0.0, 0.0, 0.0),
(isGameFeatureSupported("pickup")) ? getGameConfig().pickupModels[getGame()].Business : -1,
-1,
getPlayerInterior(client),
getPlayerDimension(client),
getPlayerData(client).interiorScene);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} created business: {businessBlue}${params}`);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} created business: {businessBlue}${params}`, true);
}
// ===========================================================================
@@ -349,12 +353,12 @@ function createBusinessLocationCommand(command, params, client) {
let tempBusinessLocationData = createBusinessLocation(locationType, businessId);
getServerData().businesses[businessId].push(tempBusinessLocationData);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} created location {businessBlue}${params}{MAINCOLOUR} for business {businessBlue}${tempBusinessData.name}`);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} created location {businessBlue}${params}{MAINCOLOUR} for business {businessBlue}${tempBusinessData.name}`, true);
}
// ===========================================================================
function createBusiness(name, entrancePosition, exitPosition, entrancePickupModel = -1, entranceBlipModel = -1, entranceInterior = 0, entranceDimension = 0, entranceCutscene = -1) {
function createBusiness(name, entrancePosition, exitPosition, entrancePickupModel = -1, entranceBlipModel = -1, entranceInterior = 0, entranceDimension = 0, entranceScene = -1) {
let tempBusinessData = new BusinessData(false);
tempBusinessData.name = name;
@@ -364,7 +368,7 @@ function createBusiness(name, entrancePosition, exitPosition, entrancePickupMode
tempBusinessData.entranceBlipModel = entranceBlipModel;
tempBusinessData.entranceInterior = entranceInterior;
tempBusinessData.entranceDimension = entranceDimension;
tempBusinessData.entranceCutscene = entranceCutscene;
tempBusinessData.entranceScene = entranceScene;
tempBusinessData.exitPosition = exitPosition;
tempBusinessData.exitRotation = 0.0;
@@ -372,7 +376,7 @@ function createBusiness(name, entrancePosition, exitPosition, entrancePickupMode
tempBusinessData.exitBlipModel = -1;
tempBusinessData.exitInterior = 0;
tempBusinessData.exitDimension = 0;
tempBusinessData.exitCutscene = -1;
tempBusinessData.exitScene = -1;
tempBusinessData.needsSaved = true;
let businessId = getServerData().businesses.push(tempBusinessData);
@@ -409,7 +413,7 @@ function deleteBusinessCommand(command, params, client) {
}
deleteBusiness(businessId, getPlayerData(client).accountData.databaseId);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} deleted business {businessBlue}${getBusinessData(businessId).name}`);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} deleted business {businessBlue}${getBusinessData(businessId).name}`, true);
}
// ===========================================================================
@@ -459,7 +463,7 @@ function setBusinessNameCommand(command, params, client) {
getBusinessData(businessId).name = newBusinessName;
setEntityData(getBusinessData(businessId).entrancePickup, "agrp.label.name", getBusinessData(businessId).name, true);
getBusinessData(businessId).needsSaved = true;
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} renamed business {businessBlue}${oldBusinessName}{MAINCOLOUR} to {businessBlue}${newBusinessName}`);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} renamed business {businessBlue}${oldBusinessName}{MAINCOLOUR} to {businessBlue}${newBusinessName}`, true);
}
// ===========================================================================
@@ -543,7 +547,7 @@ function setBusinessJobCommand(command, params, client) {
getBusinessData(businessId).ownerId = getJobData(jobId).databaseId;
getBusinessData(businessId).needsSaved = true;
messagePlayerSuccess(client, `{MAINCOLOUR}You set the owner of business {businessBlue}${getBusinessData(businessId).name} {MAINCOLOUR}to the {jobYellow}${getJobData(jobId).name}`);
messagePlayerSuccess(client, `{MAINCOLOUR}You set the owner of business {businessBlue}${getBusinessData(businessId).name}{MAINCOLOUR} to the {jobYellow}${getJobData(jobId).name}`);
}
// ===========================================================================
@@ -582,8 +586,9 @@ function setBusinessClanCommand(command, params, client) {
return false;
}
// Use confirm prompt
showPlayerPrompt(client, getLocaleString(client, "SetBusinessClanConfirmMessage"), getLocaleString(client, "SetBusinessClanConfirmTitle"), getLocaleString(client, "Yes"), getLocaleString(client, "No"));
getPlayerData(client).promptType = AGRP_PROMPT_BIZGIVETOCLAN;
getPlayerData(client).promptType = AGRP_PROMPT_GIVEBIZTOCLAN;
//getBusinessData(businessId).ownerType = AGRP_BIZ_OWNER_CLAN;
//getBusinessData(businessId).ownerId = getClanData(clanId).databaseId;
@@ -847,7 +852,8 @@ function setBusinessEntranceFeeCommand(command, params, client) {
getBusinessData(businessId).entranceFee = entranceFee;
getBusinessData(businessId).needsSaved = true;
messagePlayerSuccess(client, `{MAINCOLOUR}You set business {businessBlue}${getBusinessData(businessId).name}{MAINCOLOUR} entrance fee to [#AAAAAAA]$${entranceFee}`);
updateBusinessPickupLabelData(businessId);
messagePlayerSuccess(client, `{MAINCOLOUR}You set business {businessBlue}${getBusinessData(businessId).name}{MAINCOLOUR} entrance fee to {ALTCOLOUR}${getCurrencyString(entranceFee)}`);
}
// ===========================================================================
@@ -940,14 +946,14 @@ function getBusinessInfoCommand(command, params, client) {
[`ID`, `${businessData.index}/${businessData.databaseId}`],
[`Owner`, `${ownerName} (${getBusinessOwnerTypeText(businessData.ownerType)})`],
[`Locked`, `${getLockedUnlockedFromBool(businessData.locked)}`],
[`BuyPrice`, `$${businessData.buyPrice}`],
[`BuyPrice`, `${getCurrencyString(businessData.buyPrice)}`],
//[`RentPrice`, `${businessData.rentPrice}`],
[`HasInterior`, `${getYesNoFromBool(businessData.hasInterior)}`],
[`CustomInterior`, `${getYesNoFromBool(businessData.customInterior)}`],
[`HasBuyableItems`, `${getYesNoFromBool(doesBusinessHaveAnyItemsToBuy(businessId))}`],
[`EntranceFee`, `$${businessData.entranceFee}`],
[`EntranceFee`, `${getCurrencyString(businessData.entranceFee)}`],
[`InteriorLights`, `${getOnOffFromBool(businessData.interiorLights)}`],
[`Balance`, `$${businessData.till}`],
[`Balance`, `${getCurrencyString(businessData.till)}`],
[`RadioStation`, `${businessData.streamingRadioStation}`],
[`LabelHelpType`, `${businessData.labelHelpType}`],
];
@@ -1012,6 +1018,11 @@ function getBusinessStorageItemsCommand(command, params, client) {
return false;
}
if (!canPlayerManageBusiness(client, businessId)) {
messagePlayerError(client, getLocaleString(client, "CantModifyBusiness"));
return false;
}
showBusinessStorageInventoryToPlayer(client, businessId);
}
@@ -1057,7 +1068,7 @@ function setBusinessPickupCommand(command, params, client) {
getBusinessData(businessId).needsSaved = true;
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} set business {businessBlue}${getBusinessData(businessId).name}{MAINCOLOUR} pickup display to {ALTCOLOUR}${typeParam}!`);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} set business {businessBlue}${getBusinessData(businessId).name}{MAINCOLOUR} pickup to {ALTCOLOUR}${typeParam}!`, true);
}
// ===========================================================================
@@ -1091,10 +1102,11 @@ function setBusinessInteriorTypeCommand(command, params, client) {
getBusinessData(businessId).exitDimension = 0;
getBusinessData(businessId).exitInterior = -1;
getBusinessData(businessId).hasInterior = false;
getBusinessData(businessId).interiorCutscene = "";
getBusinessData(businessId).entranceScene = "";
getBusinessData(businessId).exitScene = "";
getBusinessData(businessId).exitPickupModel = -1;
getBusinessData(businessId).customInterior = false;
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} removed business {businessBlue}${getBusinessData(businessId).name}{MAINCOLOUR} interior`);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} removed business {businessBlue}${getBusinessData(businessId).name}{MAINCOLOUR} interior`, true);
return false;
}
@@ -1113,10 +1125,17 @@ function setBusinessInteriorTypeCommand(command, params, client) {
getBusinessData(businessId).exitPosition = getGameConfig().interiors[getGame()][typeParam][0];
getBusinessData(businessId).exitInterior = getGameConfig().interiors[getGame()][typeParam][1];
getBusinessData(businessId).exitDimension = getBusinessData(businessId).databaseId + getGlobalConfig().businessDimensionStart;
getBusinessData(businessId).exitPickupModel = getGameConfig().pickupModels[getGame()].Exit;
getBusinessData(businessId).exitPickupModel = (isGameFeatureSupported("pickup")) ? getGameConfig().pickupModels[getGame()].Exit : -1;
getBusinessData(businessId).hasInterior = true;
getBusinessData(businessId).customInterior = getGameConfig().interiors[getGame()][typeParam][2];
getBusinessData(businessId).interiorCutscene = getGameConfig().interiors[getGame()][typeParam][3];
if (isGameFeatureSupported("interiorScene")) {
if (isMainWorldScene(getPlayerData(client).scene)) {
getBusinessData(businessId).exitScene = getGameConfig().mainWorldScene[getGame()];
} else {
getBusinessData(businessId).exitScene = getGameConfig().interiors[getGame()][typeParam][3];
}
}
}
//deleteBusinessExitPickup(businessId);
@@ -1128,7 +1147,7 @@ function setBusinessInteriorTypeCommand(command, params, client) {
getBusinessData(businessId).needsSaved = true;
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} set business {businessBlue}${getBusinessData(businessId).name}{MAINCOLOUR} interior type to {ALTCOLOUR}${typeParam}`);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} set business {businessBlue}${getBusinessData(businessId).name}{MAINCOLOUR} interior type to {ALTCOLOUR}${typeParam}`, true);
}
// ===========================================================================
@@ -1175,7 +1194,7 @@ function addBusinessPropertyTemplateEntities(command, params, client) {
getBusinessData(businessId).exitPickupModel = getGameConfig().pickupModels[getGame()].Exit;
getBusinessData(businessId).hasInterior = true;
getBusinessData(businessId).customInterior = getGameConfig().interiors[getGame()][typeParam][2];
getBusinessData(businessId).interiorCutscene = getGameConfig().interiors[getGame()][typeParam][3];
getBusinessData(businessId).interiorScene = getGameConfig().interiors[getGame()][typeParam][3];
}
//deleteBusinessExitPickup(businessId);
@@ -1187,7 +1206,7 @@ function addBusinessPropertyTemplateEntities(command, params, client) {
getBusinessData(businessId).needsSaved = true;
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} set business {businessBlue}${getBusinessData(businessId).name}{MAINCOLOUR} interior type to {ALTCOLOUR}${typeParam}`);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} set business {businessBlue}${getBusinessData(businessId).name}{MAINCOLOUR} property template to {ALTCOLOUR}${typeParam}`, true);
}
// ===========================================================================
@@ -1232,7 +1251,7 @@ function setBusinessBlipCommand(command, params, client) {
resetBusinessBlips(businessId);
getBusinessData(businessId).needsSaved = true;
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} set business {businessBlue}${getBusinessData(businessId).name}{MAINCOLOUR} blip display to {ALTCOLOUR}${typeParam}`);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} set business {businessBlue}${getBusinessData(businessId).name}{MAINCOLOUR} blip to {ALTCOLOUR}${typeParam}`, true);
}
// ===========================================================================
@@ -1283,7 +1302,7 @@ function giveDefaultItemsToBusinessCommand(command, params, client) {
cacheBusinessItems(businessId);
updateBusinessPickupLabelData(businessId);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} gave business {businessBlue}${getBusinessData(businessId).name}{MAINCOLOUR} the default items for ${toLowerCase(typeParam)}`);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} gave business {businessBlue}${getBusinessData(businessId).name}{MAINCOLOUR} the default items for ${typeParam}`, true);
}
// ===========================================================================
@@ -1308,7 +1327,7 @@ function setBusinessDealershipCommand(command, params, client) {
getBusinessData(businessId).labelHelpType == AGRP_PROPLABEL_INFO_ENTERVEHICLE;
getBusinessData(businessId).type = AGRP_BIZ_TYPE_DEALERSHIP;
updateBusinessPickupLabelData(businessId);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} set the business type of {businessBlue}${getBusinessData(businessId).name}{MAINCOLOUR} to dealership`);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} set the type of business {businessBlue}${getBusinessData(businessId).name}{MAINCOLOUR} to dealership`, true);
}
// ===========================================================================
@@ -1337,7 +1356,7 @@ function deleteBusinessFloorItemsCommand(command, params, client) {
cacheBusinessItems(businessId);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} deleted all on-sale items for business {businessBlue}${getBusinessData(businessId).name}`);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} deleted all on-sale items for business {businessBlue}${getBusinessData(businessId).name}`, true);
}
// ===========================================================================
@@ -1366,7 +1385,7 @@ function deleteBusinessStorageItemsCommand(command, params, client) {
cacheBusinessItems(businessId);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} deleted all stored items for business {businessBlue}${getBusinessData(businessId).name}`);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} deleted all storage items for business {businessBlue}${getBusinessData(businessId).name}`, true);
}
// ===========================================================================
@@ -1409,7 +1428,7 @@ function withdrawFromBusinessCommand(command, params, client) {
updatePlayerCash(client);
getBusinessData(businessId).needsSaved = true;
messagePlayerSuccess(client, `You withdrew $${amount} from business {businessBlue}${getBusinessData(businessId).name} till`);
messagePlayerSuccess(client, `You withdrew ${getCurrencyString(amount)} from business {businessBlue}${getBusinessData(businessId).name} till`);
}
// ===========================================================================
@@ -1451,7 +1470,7 @@ function setBusinessBuyPriceCommand(command, params, client) {
setEntityData(getBusinessData(businessId).entrancePickup, "agrp.label.price", getBusinessData(businessId).buyPrice, true);
getBusinessData(businessId).needsSaved = true;
messagePlayerSuccess(client, `{MAINCOLOUR}You set business {businessBlue}${getBusinessData(businessId).name}'s {MAINCOLOUR}for-sale price to {ALTCOLOUR}$${makeLargeNumberReadable(amount)}`);
messagePlayerSuccess(client, `{MAINCOLOUR}You set business {businessBlue}${getBusinessData(businessId).name}'s{MAINCOLOUR} for-sale price to {ALTCOLOUR}${getCurrencyString(amount)}`);
}
// ===========================================================================
@@ -1486,7 +1505,7 @@ function depositIntoBusinessCommand(command, params, client) {
//}
if (getPlayerCurrentSubAccount(client).cash < amount) {
messagePlayerError(client, `You don't have that much money! You only have $${getPlayerCurrentSubAccount(client).cash}`);
messagePlayerError(client, `You don't have that much money! You only have ${getCurrencyString(getPlayerCurrentSubAccount(client).cash)}`);
return false;
}
@@ -1495,7 +1514,7 @@ function depositIntoBusinessCommand(command, params, client) {
updatePlayerCash(client);
getBusinessData(businessId).needsSaved = true;
messagePlayerSuccess(client, `You deposited $${amount} into business {businessBlue}${getBusinessData(businessId).name} {MAINCOLOUR}till`);
messagePlayerSuccess(client, `You deposited ${getCurrencyString(amount)} into business {businessBlue}${getBusinessData(businessId).name}{MAINCOLOUR} till`);
}
// ===========================================================================
@@ -1524,17 +1543,17 @@ function orderItemForBusinessCommand(command, params, client) {
let itemType = getItemTypeFromParams(splitParams.slice(0, -2).join(" "));
if (!getItemTypeData(itemType)) {
messagePlayerError(client, `Invalid item type name or ID!`);
messagePlayerInfo(client, `Use {ALTCOLOUR}/itemtypes {MAINCOLOUR}for a list of items`);
messagePlayerError(client, getLocaleString(client, "InvalidItemType"));
messagePlayerInfo(client, `Use {ALTCOLOUR}/itemtypes{MAINCOLOUR} for a list of items`);
return false;
}
let pricePerItem = getOrderPriceForItemType(itemType);
let amount = toInteger(splitParams.slice(-2, -1)) || 1;
let value = toInteger(splitParams.slice(-1)) || getItemTypeData(itemType).capacity;
let value = getItemTypeData(itemType).orderValue;
let businessId = getPlayerBusiness(client);
logToConsole(LOG_DEBUG, `[VRR.Business] ${getPlayerDisplayForConsole(client)} is ordering ${amount} ${splitParams.slice(0, -2).join(" ")} (${value})`);
logToConsole(LOG_DEBUG, `[AGRP.Business] ${getPlayerDisplayForConsole(client)} is ordering ${amount} ${splitParams.slice(0, -2).join(" ")}`);
if (!getBusinessData(businessId)) {
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
@@ -1552,11 +1571,10 @@ function orderItemForBusinessCommand(command, params, client) {
getPlayerData(client).businessOrderAmount = amount;
getPlayerData(client).businessOrderBusiness = businessId;
getPlayerData(client).businessOrderItem = itemType;
getPlayerData(client).businessOrderValue = value;
getPlayerData(client).businessOrderCost = orderTotalCost;
getBusinessData(businessId).needsSaved = true;
showPlayerPrompt(client, `Ordering ${amount} ${getPluralForm(getItemTypeData(itemType).name)} (${getItemValueDisplay(itemType, value)}) at $${makeLargeNumberReadable(pricePerItem)} each will cost a total of $${makeLargeNumberReadable(orderTotalCost)}`, "Business Order Cost");
showPlayerPrompt(client, `Ordering ${amount} ${getPluralForm(getItemTypeData(itemType).name)} will cost a total of ${getCurrencyString(orderTotalCost)}`, "Business Order Cost");
getPlayerData(client).promptType = AGRP_PROMPT_BIZORDER;
}
@@ -1574,13 +1592,13 @@ function orderItemForBusinessCommand(command, params, client) {
function orderItemForBusiness(businessId, itemType, amount) {
if (getBusinessData(businessId).till < orderTotalCost) {
let neededAmount = orderTotalCost - getBusinessData(businessId).till;
//messagePlayerError(client, `The business doesn't have enough money (needs {ALTCOLOUR}$${neededAmount} {MAINCOLOUR}more)! Use {ALTCOLOUR}/bizdeposit {MAINCOLOUR}to add money to the business.`);
//messagePlayerError(client, `The business doesn't have enough money (needs {ALTCOLOUR}${getCurrencyString(neededAmount)} {MAINCOLOUR}more)! Use {ALTCOLOUR}/bizdeposit {MAINCOLOUR}to add money to the business.`);
return false;
}
getBusinessData(businessId).till -= orderTotalCost;
addToBusinessInventory(businessId, itemType, amount);
//messagePlayerSuccess(client, `You ordered ${amount} ${getPluralForm(getItemTypeData(itemType).name)} (${getItemValueDisplay(itemType, value)}) at $${getItemTypeData(itemType).orderPrice} each for business {businessBlue}${getBusinessData(businessId).name}`);
//messagePlayerSuccess(client, `You ordered ${amount} ${getPluralForm(getItemTypeData(itemType).name)} (${getItemValueDisplay(itemType, value)}) at ${getCurrencyString(getItemTypeData(itemType).orderPrice)} each for business {businessBlue}${getBusinessData(businessId).name}`);
}
// ===========================================================================
@@ -1611,7 +1629,7 @@ function viewBusinessTillAmountCommand(command, params, client) {
return false;
}
messagePlayerSuccess(client, `Business {businessBlue}${getBusinessData(businessId).name}{MAINCOLOUR} till has {ALTCOLOUR}$${getBusinessData(businessId).till}`);
messagePlayerSuccess(client, `Business {businessBlue}${getBusinessData(businessId).name}{MAINCOLOUR} till has {ALTCOLOUR}${getCurrencyString(getBusinessData(businessId).till)}`);
}
// ===========================================================================
@@ -1644,7 +1662,7 @@ function buyBusinessCommand(command, params, client) {
}
showPlayerPrompt(client, getLocaleString(client, "BuyBusinessConfirmMessage"), getLocaleString(client, "BuyBusinessConfirmTitle"), getLocaleString(client, "Yes"), getLocaleString(client, "No"));
getPlayerData(client).promptType = AGRP_PROMPT_BIZBUY;
getPlayerData(client).promptType = AGRP_PROMPT_BUYBIZ;
}
// ===========================================================================
@@ -1684,7 +1702,7 @@ function moveBusinessEntranceCommand(command, params, client) {
getBusinessData(businessId).needsSaved = true;
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} moved business {businessBlue}${getBusinessData(businessId).name}{MAINCOLOUR} entrance to their position`);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} moved business {businessBlue}${getBusinessData(businessId).name}{MAINCOLOUR} entrance to their position`, true);
}
// ===========================================================================
@@ -1722,7 +1740,7 @@ function moveBusinessExitCommand(command, params, client) {
getBusinessData(businessId).needsSaved = true;
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} moved business {businessBlue}${getBusinessData(businessId).name}{MAINCOLOUR}exit to their position`);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} moved business {businessBlue}${getBusinessData(businessId).name}{MAINCOLOUR} exit to their position`, true);
}
// ===========================================================================
@@ -1874,7 +1892,7 @@ function saveBusinessToDatabase(businessId) {
return false;
}
logToConsole(LOG_DEBUG, `[VRR.Business]: Saving business '${tempBusinessData.name}' to database ...`);
logToConsole(LOG_DEBUG, `[AGRP.Business]: Saving business '${tempBusinessData.name}' to database ...`);
let dbConnection = connectToDatabase();
if (dbConnection) {
let safeBusinessName = escapeDatabaseString(dbConnection, tempBusinessData.name);
@@ -1895,7 +1913,7 @@ function saveBusinessToDatabase(businessId) {
["biz_entrance_vw", tempBusinessData.entranceDimension],
["biz_entrance_pickup", tempBusinessData.entrancePickupModel],
["biz_entrance_blip", tempBusinessData.entranceBlipModel],
//["biz_entrance_cutscene", tempBusinessData.entranceCutscene],
["biz_entrance_scene", tempBusinessData.entranceScene],
["biz_exit_pos_x", tempBusinessData.exitPosition.x],
["biz_exit_pos_y", tempBusinessData.exitPosition.y],
["biz_exit_pos_z", tempBusinessData.exitPosition.z],
@@ -1904,11 +1922,11 @@ function saveBusinessToDatabase(businessId) {
["biz_exit_vw", tempBusinessData.exitDimension],
["biz_exit_pickup", tempBusinessData.exitPickupModel],
["biz_exit_blip", tempBusinessData.exitBlipModel],
//["biz_exit_cutscene", tempBusinessData.exitCutscene],
["biz_exit_scene", tempBusinessData.exitScene],
["biz_has_interior", boolToInt(tempBusinessData.hasInterior)],
["biz_interior_lights", boolToInt(tempBusinessData.interiorLights)],
["biz_label_help_type", tempBusinessData.labelHelpType],
["biz_radio_station", toInteger(tempBusinessData.streamingRadioStation)],
["biz_radio_station", (getRadioStationData(tempBusinessData.streamingRadioStationIndex) != false) ? toInteger(getRadioStationData(tempBusinessData.streamingRadioStationIndex).databaseId) : -1],
["biz_custom_interior", boolToInt(tempBusinessData.customInterior)],
["biz_buy_price", tempBusinessData.buyPrice],
//["biz_rent_price", tempBusinessData.rentPrice],
@@ -1930,7 +1948,7 @@ function saveBusinessToDatabase(businessId) {
disconnectFromDatabase(dbConnection);
return true;
}
logToConsole(LOG_DEBUG, `[VRR.Business]: Saved business '${tempBusinessData.name}' to database!`);
logToConsole(LOG_DEBUG, `[AGRP.Business]: Saved business '${tempBusinessData.name}' to database!`);
return false;
}
@@ -1948,10 +1966,6 @@ function createAllBusinessPickups() {
return false;
}
if (!isGameFeatureSupported("pickup")) {
return false;
}
for (let i in getServerData().businesses) {
createBusinessEntrancePickup(i);
createBusinessExitPickup(i);
@@ -1994,38 +2008,34 @@ function createAllBusinessBlips() {
*
*/
function createBusinessEntrancePickup(businessId) {
if (!areServerElementsSupported()) {
return false;
}
if (!getServerConfig().createBusinessPickups) {
return false;
}
if (!isGameFeatureSupported("pickup")) {
return false;
}
let businessData = getBusinessData(businessId);
//if(businessData.hasInterior) {
// return false;
//}
if (businessData.entrancePickupModel == -1) {
return false;
}
logToConsole(LOG_VERBOSE, `[AGRP.Job]: Creating entrance pickup for business ${businessData.name}`);
let pickupModelId = getGameConfig().pickupModels[getGame()].Business;
if (areServerElementsSupported() && getGame() != AGRP_GAME_MAFIA_ONE && getGame() != AGRP_GAME_GTA_IV) {
let entrancePickup = null;
if (isGameFeatureSupported("pickup")) {
let pickupModelId = getGameConfig().pickupModels[getGame()].Business;
if (businessData.entrancePickupModel != 0) {
pickupModelId = businessData.entrancePickupModel;
}
if (businessData.entrancePickupModel == -1) {
return false;
}
logToConsole(LOG_VERBOSE, `[VRR.Job]: Creating entrance pickup for business ${businessData.name} (model ${pickupModelId})`);
if (businessData.entrancePickupModel != 0) {
pickupModelId = businessData.entrancePickupModel;
}
entrancePickup = createGamePickup(pickupModelId, businessData.entrancePosition, getGameConfig().pickupTypes[getGame()].business);
}
if (areServerElementsSupported()) {
let entrancePickup = createGamePickup(pickupModelId, businessData.entrancePosition, getGameConfig().pickupTypes[getGame()].business);
if (entrancePickup != null) {
if (businessData.entranceDimension != -1) {
setElementDimension(entrancePickup, businessData.entranceDimension);
@@ -2044,15 +2054,10 @@ function createBusinessEntrancePickup(businessId) {
getBusinessData(businessId).entrancePickup = entrancePickup;
updateBusinessPickupLabelData(businessId);
}
} else {
let pickupModelId = getGameConfig().pickupModels[getGame()].Business;
if (businessData.entrancePickupModel != 0) {
pickupModelId = businessData.entrancePickupModel;
}
sendBusinessToPlayer(null, businessId, businessData.name, businessData.entrancePosition, blipModelId, pickupModelId, businessData.hasInterior, doesBusinessHaveAnyItemsToBuy(businessId));
}
updateBusinessPickupLabelData(businessId);
return false;
}
@@ -2066,10 +2071,6 @@ function createBusinessEntrancePickup(businessId) {
*
*/
function createBusinessEntranceBlip(businessId) {
if (!areServerElementsSupported()) {
return false;
}
if (!getServerConfig().createBusinessBlips) {
return false;
}
@@ -2094,9 +2095,9 @@ function createBusinessEntranceBlip(businessId) {
blipModelId = businessData.entranceBlipModel;
}
logToConsole(LOG_VERBOSE, `[VRR.Job]: Creating entrance blip for business ${businessData.name} (model ${blipModelId})`);
logToConsole(LOG_VERBOSE, `[AGRP.Job]: Creating entrance blip for business ${businessData.name} (model ${blipModelId})`);
if (areServerElementsSupported()) {
if (areServerElementsSupported() && getGame() != AGRP_GAME_MAFIA_ONE && getGame() != AGRP_GAME_GTA_IV) {
let entranceBlip = createGameBlip(businessData.entrancePosition, blipModelId, 1, getColourByType("businessBlue"));
if (entranceBlip != null) {
if (businessData.entranceDimension != -1) {
@@ -2136,10 +2137,6 @@ function createBusinessExitPickup(businessId) {
return false;
}
if (!isGameFeatureSupported("pickup")) {
return false;
}
let businessData = getBusinessData(businessId);
//if(!businessData.hasInterior) {
@@ -2150,15 +2147,19 @@ function createBusinessExitPickup(businessId) {
return false;
}
let pickupModelId = getGameConfig().pickupModels[getGame()].Exit;
logToConsole(LOG_VERBOSE, `[AGRP.Job]: Creating exit pickup for business ${businessData.name}`);
if (businessData.exitPickupModel != 0) {
pickupModelId = businessData.exitPickupModel;
let exitPickup = null;
if (isGameFeatureSupported("pickup")) {
let pickupModelId = getGameConfig().pickupModels[getGame()].Exit;
if (businessData.exitPickupModel != 0) {
pickupModelId = businessData.exitPickupModel;
}
exitPickup = createGamePickup(pickupModelId, businessData.exitPosition, getGameConfig().pickupTypes[getGame()].business);
}
logToConsole(LOG_VERBOSE, `[VRR.Job]: Creating exit pickup for business ${businessData.name} (model ${pickupModelId})`);
let exitPickup = createGamePickup(pickupModelId, businessData.exitPosition, getGameConfig().pickupTypes[getGame()].business);
if (exitPickup != null) {
if (businessData.exitDimension != -1) {
setElementDimension(exitPickup, businessData.exitDimension);
@@ -2177,6 +2178,7 @@ function createBusinessExitPickup(businessId) {
getBusinessData(businessId).exitPickup = exitPickup;
updateBusinessPickupLabelData(businessId);
}
}
// ===========================================================================
@@ -2217,7 +2219,7 @@ function createBusinessExitBlip(businessId) {
blipModelId = businessData.exitBlipModel;
}
logToConsole(LOG_VERBOSE, `[VRR.Job]: Creating exit blip for business ${businessData.name} (model ${blipModelId})`);
logToConsole(LOG_VERBOSE, `[AGRP.Job]: Creating exit blip for business ${businessData.name} (model ${blipModelId})`);
let exitBlip = createGameBlip(businessData.exitPosition, blipModelId, 1, getColourByName("businessBlue"));
if (exitBlip != null) {
@@ -2281,11 +2283,13 @@ function deleteBusiness(businessId, whoDeleted = 0) {
* @return {Boolean} Whether or not the players were forced to exit
*
*/
function removePlayersFromBusiness(businessId) {
function removePlayersFromBusiness(businessIndex) {
getClients().forEach(function (client) {
if (doesBusinessHaveInterior(businessId)) {
if (getPlayerBusiness(client) == businessId) {
exitBusiness(client);
if (doesBusinessHaveInterior(businessIndex)) {
if (getPlayerBusiness(client) == businessIndex) {
if (getPlayerInterior(client) == getBusinessData(businessIndex).exitInterior && getPlayerDimension(client) == getBusinessData(businessIndex).exitDimension) {
exitBusiness(client);
}
}
}
});
@@ -2402,10 +2406,6 @@ function deleteBusinessEntrancePickup(businessId) {
return false;
}
if (!isGameFeatureSupported("pickup")) {
return false;
}
if (getBusinessData(businessId).entrancePickup != null) {
//removeFromWorld(getBusinessData(businessId).entrancePickup);
deleteGameElement(getBusinessData(businessId).entrancePickup);
@@ -2429,10 +2429,6 @@ function deleteBusinessExitPickup(businessId) {
return false;
}
if (!isGameFeatureSupported("pickup")) {
return false;
}
if (getBusinessData(businessId).exitPickup != null) {
//removeFromWorld(getBusinessData(businessId).exitPickup);
deleteGameElement(getBusinessData(businessId).exitPickup);
@@ -2668,12 +2664,16 @@ function buyFromBusinessCommand(command, params, client) {
//messagePlayerSuccess(client, `You bought ${amount} {ALTCOLOUR}${itemName} {MAINCOLOUR}for ${totalCost} ${priceEach}`);
meActionToNearbyPlayers(client, `buys a ${itemName}`);
if (doesPlayerHaveKeyBindsDisabled(client) && doesPlayerHaveKeyBindForCommand("inv")) {
let keyData = getPlayerKeyBindForCommand("inv");
messagePlayerNewbieTip(client, getLocaleString(client, "ViewInventoryKeyPressTip", `{ALTCOLOUR}${getKeyNameFromId(keyData.key)}{MAINCOLOUR}`));
} else {
messagePlayerNewbieTip(client, getLocaleString(client, "ViewInventoryCommandTip", `{ALTCOLOUR}/inv{MAINCOLOUR}`));
if (!hasPlayerSeenActionTip(client, "ViewInventory")) {
if (doesPlayerHaveKeyBindsDisabled(client) && doesPlayerHaveKeyBindForCommand("inv")) {
let keyData = getPlayerKeyBindForCommand("inv");
messagePlayerActionTip(client, getGroupedLocaleString(client, "ActionTips", "ViewInventory", `{ALTCOLOUR}${getKeyNameFromId(keyData.key)}{MAINCOLOUR}`));
} else {
messagePlayerActionTip(client, getGroupedLocaleString(client, "ActionTips", "ViewInventory", `{ALTCOLOUR}/inv{MAINCOLOUR}`));
}
}
markPlayerActionTipSeen(client, "ViewInventory");
}
// ===========================================================================
@@ -2716,7 +2716,7 @@ function setBusinessItemSellPriceCommand(command, params, client) {
getItemData(getBusinessData(businessId).floorItemCache[itemSlot - 1]).buyPrice = newPrice;
messagePlayerSuccess(client, `You changed the price of the {ALTCOLOUR}${getItemTypeData(getItemData(getBusinessData(businessId).floorItemCache[itemSlot - 1]).itemTypeIndex).name}'s {MAINCOLOUR}in slot {ALTCOLOUR}${itemSlot} {MAINCOLOUR}from $${makeLargeNumberReadable(oldPrice)} to $${makeLargeNumberReadable(newprice)}`);
messagePlayerSuccess(client, `You changed the price of the {ALTCOLOUR}${getItemTypeData(getItemData(getBusinessData(businessId).floorItemCache[itemSlot - 1]).itemTypeIndex).name}'s {MAINCOLOUR}in slot {ALTCOLOUR}${itemSlot} {MAINCOLOUR}from ${getCurrencyString(oldPrice)} to ${getCurrencyString(newprice)}`);
}
// ===========================================================================
@@ -2825,11 +2825,11 @@ function getBusinessFloorFirstFreeItemSlot(businessId) {
// Caches all items for all businesses
function cacheAllBusinessItems() {
logToConsole(LOG_DEBUG, "[VRR.Business] Caching all business items ...");
logToConsole(LOG_DEBUG, "[AGRP.Business] Caching all business items ...");
for (let i in getServerData().businesses) {
cacheBusinessItems(i);
}
logToConsole(LOG_DEBUG, "[VRR.Business] Cached all business items successfully!");
logToConsole(LOG_DEBUG, "[AGRP.Business] Cached all business items successfully!");
}
// ===========================================================================
@@ -2840,11 +2840,11 @@ function cacheBusinessItems(businessId) {
clearArray(getBusinessData(businessId).storageItemCache);
//let businessData = getBusinessData(businessId);
//logToConsole(LOG_VERBOSE, `[VRR.Business] Caching business items for business ${businessId} (${businessData.name}) ...`);
//logToConsole(LOG_VERBOSE, `[AGRP.Business] Caching business items for business ${businessId} (${businessData.name}) ...`);
//getBusinessData(businessId).floorItemCache = getServerData().items.filter(item => item.ownerType == AGRP_ITEM_OWNER_BIZFLOOR && item.ownerId == businessData.databaseId).map(i => i.index);
//getBusinessData(businessId).storageItemCache = getServerData().items.filter(item => item.ownerType == AGRP_ITEM_OWNER_BIZSTORAGE && item.ownerId == businessData.databaseId);
logToConsole(LOG_VERBOSE, `[VRR.Business] Caching business items for business ${businessId} (${getBusinessData(businessId).name}) ...`);
logToConsole(LOG_VERBOSE, `[AGRP.Business] Caching business items for business ${businessId} (${getBusinessData(businessId).name}) ...`);
for (let i in getServerData().items) {
if (getItemData(i).ownerType == AGRP_ITEM_OWNER_BIZFLOOR && getItemData(i).ownerId == getBusinessData(businessId).databaseId) {
getBusinessData(businessId).floorItemCache.push(i);
@@ -2853,7 +2853,7 @@ function cacheBusinessItems(businessId) {
}
}
logToConsole(LOG_VERBOSE, `[VRR.Business] Successfully cached ${getBusinessData(businessId).floorItemCache.length} floor items and ${getBusinessData(businessId).storageItemCache} storage items for business ${businessId} (${getBusinessData(businessId).name})!`);
logToConsole(LOG_VERBOSE, `[AGRP.Business] Successfully cached ${getBusinessData(businessId).floorItemCache.length} floor items and ${getBusinessData(businessId).storageItemCache} storage items for business ${businessId} (${getBusinessData(businessId).name})!`);
}
// ===========================================================================
@@ -2867,7 +2867,8 @@ function getBusinessIdFromDatabaseId(databaseId) {
// Updates all pickup data for a business by businessId
function updateBusinessPickupLabelData(businessId) {
if (!areServerElementsSupported()) {
if (!areServerElementsSupported() || getGame() == AGRP_GAME_MAFIA_ONE || getGame() == AGRP_GAME_GTA_IV) {
sendBusinessToPlayer(null, businessId, getBusinessData(businessId).name, getBusinessData(businessId).entrancePosition, getBusinessEntranceBlipModelForNetworkEvent(businessId), getBusinessEntrancePickupModelForNetworkEvent(businessId), getBusinessData(businessId).buyPrice, getBusinessData(businessId).rentPrice, getBusinessData(businessId).hasInterior, getBusinessData(businessId).locked, doesBusinessHaveAnyItemsToBuy(businessId));
return false;
}
@@ -2916,6 +2917,7 @@ function updateBusinessPickupLabelData(businessId) {
}
setEntityData(getBusinessData(businessId).entrancePickup, "agrp.label.price", getBusinessData(businessId).buyPrice, true);
setEntityData(getBusinessData(businessId).entrancePickup, "agrp.label.fee", getBusinessData(businessId).entranceFee, true);
}
}
@@ -3200,4 +3202,34 @@ function doesBusinessHaveBuyableItemOfUseType(businessId, useType) {
return false;
}
// ===========================================================================
function getBusinessEntranceBlipModelForNetworkEvent(businessIndex) {
let blipModelId = -1;
if (isGameFeatureSupported("blip")) {
blipModelId = getGameConfig().blipSprites[getGame()].Business;
if (getBusinessData(businessIndex).entranceBlipModel != 0) {
blipModelId = getBusinessData(businessIndex).entranceBlipModel;
}
}
return blipModelId;
}
// ===========================================================================
function getBusinessEntrancePickupModelForNetworkEvent(businessIndex) {
let pickupModelId = -1;
if (isGameFeatureSupported("pickup")) {
pickupModelId = getGameConfig().pickupModels[getGame()].Business;
if (getBusinessData(businessIndex).entrancePickupModel != 0) {
pickupModelId = getBusinessData(businessIndex).entrancePickupModel;
}
}
return pickupModelId;
}
// ===========================================================================

View File

@@ -118,20 +118,7 @@ function blackJackHitCommand(command, params, client) {
hand.push(deck.pop());
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;
}
}
let tempHandValue = getValueOfBlackJackHand(hand);
if (handValue > 21) {
playerBustBlackJack(client);
@@ -155,14 +142,6 @@ function blackJackStandCommand(command, params, client) {
// ===========================================================================
function blackJackHit(hand, deck) {
return handValue;
}
// ===========================================================================
function dealPlayerBlackJackHand(deck, players) {
// Alternate handing cards to each player, 2 cards each
for (var i = 0; i < 2; i++) {
@@ -174,4 +153,23 @@ function dealPlayerBlackJackHand(deck, players) {
}
}
// ===========================================================================
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

@@ -9,8 +9,8 @@
// ===========================================================================
function initChatScript() {
logToConsole(LOG_INFO, "[VRR.Chat]: Initializing chat script ...");
logToConsole(LOG_INFO, "[VRR.Chat]: Chat script initialized successfully!");
logToConsole(LOG_INFO, "[AGRP.Chat]: Initializing chat script ...");
logToConsole(LOG_INFO, "[AGRP.Chat]: Chat script initialized successfully!");
return true;
}
@@ -174,7 +174,14 @@ function adminChatCommand(command, params, client) {
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}`);
}
// ===========================================================================
@@ -217,7 +224,10 @@ function privateMessageCommand(command, params, client) {
getPlayerData(targetClient).privateMessageReplyTo = client;
messagePlayerPrivateMessage(targetClient, client, messageText);
messagePlayerTip(client, getLocaleString(client, "PrivateMessageReplyCommandTip", "{ALTCOLOUR}/reply{MAINCOLOUR}"))
if (!hasPlayerSeenActionTip(targetClient, "ReplyToDirectMessage")) {
messagePlayerTip(targetClient, getGroupedLocaleString(targetClient, "ActionTips", "ReplyToDirectMessage", "{ALTCOLOUR}/reply{MAINCOLOUR}"));
}
}
// ===========================================================================
@@ -240,6 +250,8 @@ function replyToLastPrivateMessageCommand(command, params, client) {
getPlayerData(targetClient).privateMessageReplyTo = client;
messagePlayerPrivateMessage(targetClient, client, messageText);
markPlayerActionTipSeen(client, "ReplyToDirectMessage");
}
// ===========================================================================

View File

@@ -110,15 +110,15 @@ class ClanMemberData {
// ===========================================================================
function initClanScript() {
logToConsole(LOG_INFO, "[VRR.Clan]: Initializing clans script ...");
logToConsole(LOG_INFO, "[VRR.Clan]: Clan script initialized successfully!");
logToConsole(LOG_INFO, "[AGRP.Clan]: Initializing clans script ...");
logToConsole(LOG_INFO, "[AGRP.Clan]: Clan script initialized successfully!");
return true;
}
// ===========================================================================
function loadClansFromDatabase() {
logToConsole(LOG_INFO, "[VRR.Clan]: Loading clans from database ...");
logToConsole(LOG_INFO, "[AGRP.Clan]: Loading clans from database ...");
let tempClans = [];
let dbConnection = connectToDatabase();
@@ -133,7 +133,7 @@ function loadClansFromDatabase() {
//tempClanData.members = loadClanMembersFromDatabase(tempClanData.databaseId);
tempClanData.ranks = loadClanRanksFromDatabase(tempClanData.databaseId);
tempClans.push(tempClanData);
logToConsole(LOG_DEBUG, `[VRR.Clan]: Clan '${tempClanData.name}' loaded from database successfully!`);
logToConsole(LOG_DEBUG, `[AGRP.Clan]: Clan '${tempClanData.name}' loaded from database successfully!`);
}
}
freeDatabaseQuery(dbQuery);
@@ -141,14 +141,14 @@ function loadClansFromDatabase() {
disconnectFromDatabase(dbConnection);
}
logToConsole(LOG_INFO, `[VRR.Clan]: ${tempClans.length} clans loaded from database successfully!`);
logToConsole(LOG_INFO, `[AGRP.Clan]: ${tempClans.length} clans loaded from database successfully!`);
return tempClans;
}
// ===========================================================================
function loadClanMembersFromDatabase() {
logToConsole(LOG_INFO, "[VRR.Clan]: Loading clans from database ...");
logToConsole(LOG_INFO, "[AGRP.Clan]: Loading clans from database ...");
let tempClans = [];
let dbConnection = connectToDatabase();
@@ -161,7 +161,7 @@ function loadClanMembersFromDatabase() {
while (dbAssoc = fetchQueryAssoc(dbQuery)) {
let tempClanData = new ClanData(dbAssoc);
tempClans.push(tempClanData);
logToConsole(LOG_VERBOSE, `[VRR.Clan]: Clan '${tempClanData.name}' loaded from database successfully!`);
logToConsole(LOG_VERBOSE, `[AGRP.Clan]: Clan '${tempClanData.name}' loaded from database successfully!`);
}
}
freeDatabaseQuery(dbQuery);
@@ -169,14 +169,14 @@ function loadClanMembersFromDatabase() {
disconnectFromDatabase(dbConnection);
}
logToConsole(LOG_INFO, `[VRR.Clan]: ${tempClans.length} clans loaded from database successfully!`);
logToConsole(LOG_INFO, `[AGRP.Clan]: ${tempClans.length} clans loaded from database successfully!`);
return tempClans;
}
// ===========================================================================
function loadClanRanksFromDatabase(clanDatabaseId) {
logToConsole(LOG_INFO, `[VRR.Clan]: Loading ranks for clan ${clanDatabaseId} from database ...`);
logToConsole(LOG_INFO, `[AGRP.Clan]: Loading ranks for clan ${clanDatabaseId} from database ...`);
let dbConnection = connectToDatabase();
let dbAssoc;
@@ -189,7 +189,7 @@ function loadClanRanksFromDatabase(clanDatabaseId) {
while (dbAssoc = fetchQueryAssoc(dbQuery)) {
let tempClanRankData = new ClanRankData(dbAssoc);
tempClanRanks.push(tempClanRankData);
logToConsole(LOG_VERBOSE, `[VRR.Clan]: Clan rank '${tempClanRankData.name}' loaded from database successfully!`);
logToConsole(LOG_VERBOSE, `[AGRP.Clan]: Clan rank '${tempClanRankData.name}' loaded from database successfully!`);
}
}
freeDatabaseQuery(dbQuery);
@@ -197,7 +197,7 @@ function loadClanRanksFromDatabase(clanDatabaseId) {
disconnectFromDatabase(dbConnection);
}
logToConsole(LOG_INFO, `[VRR.Clan]: Loaded ranks for clan ${clanDatabaseId} from database successfully!`);
logToConsole(LOG_INFO, `[AGRP.Clan]: Loaded ranks for clan ${clanDatabaseId} from database successfully!`);
return tempClanRanks;
}
@@ -1292,10 +1292,10 @@ function setClanRankTitle(clanId, rankId, title) {
// ===========================================================================
function saveAllClansToDatabase() {
logToConsole(LOG_DEBUG, `[VRR.Clan]: Saving all server clans to database ...`);
logToConsole(LOG_DEBUG, `[AGRP.Clan]: Saving all server clans to database ...`);
if (getServerConfig().devServer) {
logToConsole(LOG_DEBUG, `[VRR.Clan]: Aborting save all clans to database, dev server is enabled.`);
logToConsole(LOG_DEBUG, `[AGRP.Clan]: Aborting save all clans to database, dev server is enabled.`);
return false;
}
@@ -1303,7 +1303,7 @@ function saveAllClansToDatabase() {
saveClanToDatabase(i);
}
logToConsole(LOG_INFO, `[VRR.Clan]: Saved all server clans to database`);
logToConsole(LOG_INFO, `[AGRP.Clan]: Saved all server clans to database`);
}
// ===========================================================================

View File

@@ -17,13 +17,12 @@ const AGRP_RETURNTO_TYPE_SKINSELECT = 2; // "Return to" data is from sk
/**
* @class Representing extra data for a client
* @property {AccountData} accountData
* @property {Array.<SubAccountData>} subAccounts
*/
class ClientData {
constructor(client, accountData, subAccounts) {
/** @member {AccountData} accountData */
this.accountData = accountData;
/** @member {Array.<SubAccountData>} subAccounts */
this.subAccounts = subAccounts; // Characters
// General Info
@@ -116,7 +115,7 @@ class ClientData {
// Misc
this.changingCharacterName = false;
this.currentPickup = false;
this.currentPickup = null;
this.usingSkinSelect = false;
this.keyBinds = [];
this.incomingDamageMultiplier = 1;
@@ -126,12 +125,14 @@ class ClientData {
this.locale = 0;
this.enteringVehicle = null;
this.customDisconnectReason = "";
this.interiorCutscene = -1;
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;
@@ -155,14 +156,14 @@ class ClientData {
// ===========================================================================
function initClientScript() {
logToConsole(LOG_DEBUG, "[VRR.Client]: Initializing client script ...");
logToConsole(LOG_DEBUG, "[VRR.Client]: Client script initialized!");
logToConsole(LOG_DEBUG, "[AGRP.Client]: Initializing client script ...");
logToConsole(LOG_DEBUG, "[AGRP.Client]: Client script initialized!");
}
// ===========================================================================
function resetClientStuff(client) {
logToConsole(LOG_DEBUG, `[VRR.Utilities] Resetting client data for ${getPlayerDisplayForConsole(client)}`);
logToConsole(LOG_DEBUG, `[AGRP.Utilities] Resetting client data for ${getPlayerDisplayForConsole(client)}`);
if (!getPlayerData(client)) {
return false;
@@ -172,24 +173,128 @@ function resetClientStuff(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;
//getPlayerData(client).lastVehicle = null;
}
// ===========================================================================
function kickAllClients() {
getClients().forEach((client) => {
getPlayerData(client).customDisconnectReason = `Kicked - All clients are being disconnected`;
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

@@ -44,8 +44,8 @@ let serverCommands = [];
// ===========================================================================
function initCommandScript() {
logToConsole(LOG_INFO, "[VRR.Command]: Initializing commands script ...");
logToConsole(LOG_INFO, "[VRR.Command]: Initialized commands script!");
logToConsole(LOG_INFO, "[AGRP.Command]: Initializing commands script ...");
logToConsole(LOG_INFO, "[AGRP.Command]: Initialized commands script!");
}
// ===========================================================================
@@ -77,9 +77,12 @@ function loadCommands() {
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: [],
@@ -137,7 +140,7 @@ function loadCommands() {
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("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("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"),
@@ -160,9 +163,6 @@ function loadCommands() {
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("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("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"),
@@ -355,6 +355,7 @@ function loadCommands() {
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("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"),
@@ -362,7 +363,7 @@ function loadCommands() {
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", setItemTypeSizeCommand, "<item type> <order value>", getStaffFlagValue("ManageItems"), true, false, "Sets an item type's capacity (how much it can hold)"),
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("delplritems", deleteAllItemsInPlayerInventoryCommand, "<player name/id>", getStaffFlagValue("ManageItems"), true, false, "Removes all items from a player's personal inventory"),
@@ -461,6 +462,7 @@ function loadCommands() {
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("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("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"),
@@ -514,6 +516,9 @@ function loadCommands() {
],
security: [],
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("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."),
@@ -590,6 +595,7 @@ function loadCommands() {
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: [],
subAccount: [
@@ -632,7 +638,7 @@ function loadCommands() {
new CommandData("vehowner", setVehicleOwnerCommand, "<player id/name>", getStaffFlagValue("ManageVehicles"), true, true),
new CommandData("vehpublic", setVehiclePublicCommand, "", getStaffFlagValue("ManageVehicles"), 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("vehdelowner", removeVehicleOwnerCommand, "", getStaffFlagValue("ManageVehicles"), true, true),
new CommandData("vehrank", setVehicleRankCommand, "<rank id/name>", getStaffFlagValue("None"), true, true),
@@ -688,7 +694,6 @@ function loadCommands() {
new CommandData("vehiclerepair", 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("passenger", enterVehicleAsPassengerCommand, "", getStaffFlagValue("None"), true, true, "Enters a vehicle as passenger"),
],
};
@@ -703,7 +708,7 @@ function addAllCommandHandlers() {
let commands = getCommands();
for (let i in commands) {
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);
commandCount++;
}
@@ -712,11 +717,14 @@ function addAllCommandHandlers() {
removeCommandHandler("help");
addCommandHandler("help", helpCommand);
logToConsole(LOG_INFO, `[VRR.Command] ${commandCount} command handlers added!`);
logToConsole(LOG_INFO, `[AGRP.Command] ${commandCount} command handlers added!`);
}
// ===========================================================================
/**
* @return {CommandData} command
*/
function getCommand(command) {
let commandGroups = getCommands()
for (let i in commandGroups) {
@@ -733,6 +741,9 @@ function getCommand(command) {
// ===========================================================================
/**
* @return {CommandData} command
*/
function getCommandData(command) {
return getCommand(command);
}
@@ -784,12 +795,12 @@ function disableCommand(command, params, client) {
params = toLowerCase(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;
}
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;
}
@@ -804,12 +815,12 @@ function enableCommand(command, params, client) {
params = toLowerCase(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;
}
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;
}
@@ -824,7 +835,7 @@ function disableAllCommandsByType(command, params, client) {
params = toLowerCase(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;
}
@@ -832,7 +843,7 @@ function disableAllCommandsByType(command, params, client) {
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;
}
@@ -847,7 +858,7 @@ function enableAllCommandsByType(command, params, client) {
params = toLowerCase(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;
}
@@ -855,7 +866,7 @@ function enableAllCommandsByType(command, params, client) {
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;
}
@@ -880,7 +891,7 @@ function processPlayerCommand(command, params, client) {
}
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);
if (possibleCommand != false && doesPlayerHaveStaffPermission(client, getCommandRequiredPermissions(toLowerCase(possibleCommand.command)))) {
@@ -892,7 +903,7 @@ function processPlayerCommand(command, params, client) {
}
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, getLocaleString(client, "CommandDisabled", `{ALTCOLOUR}/${command}{MAINCOLOUR}`));
return false;
@@ -900,7 +911,7 @@ function processPlayerCommand(command, params, client) {
if (doesCommandRequireLogin(toLowerCase(command))) {
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}`));
return false;
}
@@ -908,7 +919,7 @@ function processPlayerCommand(command, params, client) {
if (isClientFromDiscord(client)) {
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!`);
return false;
}
@@ -916,13 +927,13 @@ function processPlayerCommand(command, params, client) {
if (!isConsole(client)) {
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}`));
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);
}
@@ -1027,10 +1038,10 @@ function cacheAllCommandsAliases() {
// ===========================================================================
function getCommandAliasesNames(command) {
function getCommandAliasesNames(commandData) {
let commandAliases = [];
for (let i in command.aliases) {
commandAliases.push(command.aliases[i].name);
for (let i in commandData.aliases) {
commandAliases.push(commandData.aliases[i].name);
}
return commandAliases;

View File

@@ -126,8 +126,8 @@ class ServerConfigData {
this.discordBotToken = intToBool(dbAssoc["svr_discord_bot_token"]);
this.introMusicURL = dbAssoc["svr_intro_music"];
//this.useRealTime = intToBool(toInteger(dbAssoc["svr_real_time_enabled"]));
//this.realTimeZone = dbAssoc["svr_real_time_timezone"];
this.useRealTime = intToBool(toInteger(dbAssoc["svr_real_time_enabled"]));
this.realTimeZone = dbAssoc["svr_real_time_timezone"];
this.discord = {
sendEvents: intToBool(dbAssoc["svr_discord_send_events"]),
@@ -194,8 +194,8 @@ let globalConfig = {
subAccountNameAllowedCharacters: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
emailValidationRegex: /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/,
itemActionDelayExtraTimeout: 1000,
geoIPCountryDatabaseFilePath: "geoip-country.mmdb",
geoIPCityDatabaseFilePath: "geoip-city.mmdb",
geoIPCountryDatabaseFilePath: "modules/geoip/geoip-country.mmdb",
geoIPCityDatabaseFilePath: "modules/geoip/geoip-city.mmdb",
randomTipInterval: 600000,
weaponEquippableTypes: [
AGRP_ITEM_USE_TYPE_WEAPON,
@@ -246,85 +246,82 @@ let globalConfig = {
fishingCastMaxStrength: 100,
fishingCastMinStrength: 30,
jobRouteLocationSphereRadius: 3,
monthlyChanceOfSnow: [90, 50, 10, 0, 0, 0, 0, 0, 0, 0, 50, 90],
};
// ===========================================================================
function initConfigScript() {
logToConsole(LOG_INFO, "[VRR.Config]: Initializing config script ...");
logToConsole(LOG_INFO, "[VRR.Config]: Config script initialized!");
logToConsole(LOG_INFO, "[AGRP.Config]: Initializing config script ...");
logToConsole(LOG_INFO, "[AGRP.Config]: Config script initialized!");
}
// ===========================================================================
function loadGlobalConfig() {
logToConsole(LOG_DEBUG, "[VRR.Config] Loading global configuration ...");
logToConsole(LOG_DEBUG, "[AGRP.Config] Loading global configuration ...");
try {
getGlobalConfig().database = loadDatabaseConfig();
} 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();
}
try {
getGlobalConfig().economy = loadEconomyConfig();
} 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();
}
try {
getGlobalConfig().locale = loadLocaleConfig();
} 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();
}
try {
getGlobalConfig().accents = loadAccentConfig();
} 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();
}
try {
getGlobalConfig().discord = loadDiscordConfig();
} 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();
}
try {
getGlobalConfig().keyBind = loadKeyBindConfig();
} 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();
}
try {
getGlobalConfig().email = loadEmailConfig();
} 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();
}
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();
if (dbConnection) {
let dbQueryString = `SELECT * FROM svr_main WHERE svr_game = ${gameId} AND svr_port = ${port} LIMIT 1;`;
let dbQuery = queryDatabase(dbConnection, dbQueryString);
if (dbQuery) {
if (dbQuery.numRows > 0) {
let dbAssoc = fetchQueryAssoc(dbQuery);
let tempServerConfigData = new ServerConfigData(dbAssoc);
freeDatabaseQuery(dbQuery);
return tempServerConfigData;
}
let dbAssoc = await fetchQueryAssoc(dbConnection, dbQueryString);
if (dbAssoc.length > 0) {
let tempServerConfigData = new ServerConfigData(dbAssoc[0]);
return tempServerConfigData;
}
disconnectFromDatabase(dbConnection);
}
@@ -333,18 +330,15 @@ function loadServerConfigFromGameAndPort(gameId, port) {
// ===========================================================================
function loadServerConfigFromGame(gameId) {
async function loadServerConfigFromGame(gameId) {
let dbConnection = connectToDatabase();
if (dbConnection) {
let dbQueryString = `SELECT * FROM svr_main WHERE svr_game = ${gameId} LIMIT 1;`;
let dbQuery = queryDatabase(dbConnection, dbQueryString);
if (dbQuery) {
if (dbQuery.numRows > 0) {
let dbAssoc = fetchQueryAssoc(dbQuery);
let tempServerConfigData = new ServerConfigData(dbAssoc);
freeDatabaseQuery(dbQuery);
return tempServerConfigData;
}
let dbAssocArray = await fetchQueryAssoc(dbConnection, dbQueryString);
logToConsole(LOG_DEBUG | LOG_WARN, `${dbAssocArray[0]}`);
if (dbAssocArray.length > 0) {
let tempServerConfigData = new ServerConfigData(dbAssocArray[0]);
return tempServerConfigData;
}
disconnectFromDatabase(dbConnection);
}
@@ -353,38 +347,36 @@ function loadServerConfigFromGame(gameId) {
// ===========================================================================
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 dbQuery = queryDatabase(dbConnection, dbQueryString);
if (dbQuery) {
if (dbQuery.numRows > 0) {
let dbAssoc = fetchQueryAssoc(dbQuery);
let tempServerConfigData = new ServerConfigData(dbAssoc);
freeDatabaseQuery(dbQuery);
return tempServerConfigData;
}
let dbAssoc = await fetchQueryAssoc(dbConnection, dbQueryString);
if (dbAssoc.length > 0) {
let tempServerConfigData = new ServerConfigData(dbAssoc[0]);
return tempServerConfigData;
}
disconnectFromDatabase(dbConnection);
}
disconnectFromDatabase(dbConnection);
return false;
}
// ===========================================================================
function applyConfigToServer(tempServerConfig) {
logToConsole(LOG_INFO, "[VRR.Config]: Applying server config ...");
logToConsole(LOG_DEBUG, "[VRR.Config]: Server config applied successfully!");
logToConsole(LOG_INFO, "[AGRP.Config]: Applying server config ...");
logToConsole(LOG_DEBUG, "[AGRP.Config]: Server config applied successfully!");
if (isTimeSupported()) {
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);
}
updateServerGameTime();
//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()) {
logToConsole(LOG_DEBUG, `[VRR.Config]: Setting weather to ${tempServerConfig.weather}`);
game.forceWeather(tempServerConfig.weather);
logToConsole(LOG_DEBUG, `[AGRP.Config]: Setting weather to ${tempServerConfig.weather}`);
game.forceWeather(getWeatherData(tempServerConfig.weather).weatherId);
}
updateServerRules();
@@ -393,7 +385,7 @@ function applyConfigToServer(tempServerConfig) {
// ===========================================================================
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) {
let dbConnection = connectToDatabase();
if (dbConnection) {
@@ -457,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!`);
}
// ===========================================================================
@@ -580,19 +572,19 @@ function setWeatherCommand(command, params, client) {
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!`);
return false;
}
game.forceWeather(toInteger(weatherId));
getServerConfig().weather = weatherId;
game.forceWeather(getWeatherData(weatherIndex).weatherId);
getServerConfig().weather = weatherIndex;
getServerConfig().needsSaved = true;
announceAdminAction("ServerWeatherSet", getPlayerName(client), getGameConfig().weatherNames[getGame()][toInteger(weatherId)]);
announceAdminAction("ServerWeatherSet", getPlayerName(client), getWeatherData(weatherIndex).name);
updateServerRules();
return true;
}
@@ -931,7 +923,7 @@ function reloadEmailConfigurationCommand(command, params, client) {
*/
function reloadDatabaseConfigurationCommand(command, params, client) {
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 = null;
}
@@ -979,8 +971,8 @@ function getServerIntroMusicURL() {
// ===========================================================================
function loadLocaleConfig() {
logToConsole(LOG_DEBUG, "[VRR.Config] Loading locale configuration");
let localeConfig = JSON.parse(loadTextFile(`config/locale.json`));
logToConsole(LOG_DEBUG, "[AGRP.Config] Loading locale configuration");
let localeConfig = JSON.parse(getContentsOfTextFile(`config/locale.json`));
if (localeConfig != null) {
return localeConfig;
}
@@ -989,8 +981,8 @@ function loadLocaleConfig() {
// ===========================================================================
function loadEconomyConfig() {
logToConsole(LOG_DEBUG, "[VRR.Config] Loading economy configuration");
let economyConfig = JSON.parse(loadTextFile(`config/economy.json`));
logToConsole(LOG_DEBUG, "[AGRP.Config] Loading economy configuration");
let economyConfig = JSON.parse(getContentsOfTextFile(`config/economy.json`));
if (economyConfig != null) {
return economyConfig;
}
@@ -999,8 +991,8 @@ function loadEconomyConfig() {
// ===========================================================================
function loadAccentConfig() {
logToConsole(LOG_DEBUG, "[VRR.Config] Loading accents configuration");
let accentConfig = JSON.parse(loadTextFile(`config/accents.json`));
logToConsole(LOG_DEBUG, "[AGRP.Config] Loading accents configuration");
let accentConfig = JSON.parse(getContentsOfTextFile(`config/accents.json`));
if (accentConfig != null) {
return accentConfig;
}
@@ -1009,8 +1001,8 @@ function loadAccentConfig() {
// ===========================================================================
function loadDiscordConfig() {
logToConsole(LOG_DEBUG, "[VRR.Config] Loading discord configuration");
let discordConfig = JSON.parse(loadTextFile(`config/discord.json`));
logToConsole(LOG_DEBUG, "[AGRP.Config] Loading discord configuration");
let discordConfig = JSON.parse(getContentsOfTextFile(`config/discord.json`));
if (discordConfig != null) {
return discordConfig;
}
@@ -1020,8 +1012,8 @@ function loadDiscordConfig() {
// ===========================================================================
function loadDatabaseConfig() {
logToConsole(LOG_DEBUG, "[VRR.Config] Loading database configuration");
let databaseConfig = JSON.parse(loadTextFile("config/database.json"));
logToConsole(LOG_DEBUG, "[AGRP.Config] Loading database configuration");
let databaseConfig = JSON.parse(getContentsOfTextFile("config/database.json"));
if (databaseConfig != null) {
return databaseConfig;
}
@@ -1031,8 +1023,8 @@ function loadDatabaseConfig() {
// ===========================================================================
function loadKeyBindConfig() {
logToConsole(LOG_DEBUG, "[VRR.Config] Loading keybind configuration");
let keyBindConfig = JSON.parse(loadTextFile("config/keybind.json"));
logToConsole(LOG_DEBUG, "[AGRP.Config] Loading keybind configuration");
let keyBindConfig = JSON.parse(getContentsOfTextFile("config/keybind.json"));
if (keyBindConfig != null) {
return keyBindConfig;
}
@@ -1042,8 +1034,8 @@ function loadKeyBindConfig() {
// ===========================================================================
function loadEmailConfig() {
logToConsole(LOG_DEBUG, "[VRR.Config] Loading email configuration");
let emailConfig = JSON.parse(loadTextFile("config/email.json"));
logToConsole(LOG_DEBUG, "[AGRP.Config] Loading email configuration");
let emailConfig = JSON.parse(getContentsOfTextFile("config/email.json"));
if (emailConfig != null) {
return emailConfig;
}
@@ -1125,20 +1117,25 @@ function getDatabaseConfig() {
// ===========================================================================
function loadServerConfig() {
logToConsole(LOG_DEBUG, "[VRR.Config] Loading server configuration");
try {
if (toInteger(server.getCVar("agrp_devserver")) == 1) {
serverConfig = loadServerConfigFromGame(getGame());
} else {
serverConfig = loadServerConfigFromGameAndPort(getGame(), getServerPort());
}
logToConsole(LOG_DEBUG, "[AGRP.Config] Loading server configuration");
} catch (error) {
logToConsole(LOG_ERROR, `[VRR.Config] Could not load server configuration for game ${getGame()} and port ${getServerPort}`);
thisResource.stop();
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());
if (serverConfig == false) {
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

@@ -8,9 +8,9 @@
// TYPE: Server (JavaScript)
// ===========================================================================
let scriptVersion = "1.2";
let scriptVersion = "1.3";
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 playerResourceStarted = new Array(server.maxClients).fill(false);

View File

@@ -15,8 +15,8 @@ let persistentDatabaseConnection = null;
// ===========================================================================
function initDatabaseScript() {
logToConsole(LOG_INFO, "[VRR.Database]: Initializing database script ...");
logToConsole(LOG_INFO, "[VRR.Database]: Database script initialized successfully!");
logToConsole(LOG_INFO, "[AGRP.Database]: Initializing database script ...");
logToConsole(LOG_INFO, "[AGRP.Database]: Database script initialized successfully!");
}
// ===========================================================================

View File

@@ -9,7 +9,7 @@
// ===========================================================================
function initDeveloperScript() {
logToConsole(LOG_INFO, "[VRR.Developer]: Initializing developer script ...");
logToConsole(LOG_INFO, "[AGRP.Developer]: Initializing developer script ...");
// Use GTAC command handlers for these since they need to be available on console
//addCommandHandler("sc", executeServerCodeCommand);
@@ -18,7 +18,7 @@ function initDeveloperScript() {
//addCommandHandler("allcmd", simulateCommandForAllPlayersCommand);
//addCommandHandler("addloglvl", setServerLogLevelCommand);
logToConsole(LOG_INFO, "[VRR.Developer]: Developer script initialized successfully!");
logToConsole(LOG_INFO, "[AGRP.Developer]: Developer script initialized successfully!");
return true;
}
@@ -152,7 +152,7 @@ function addLogLevelCommand(command, params, client) {
}
sendPlayerLogLevel(null, logLevel);
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} {MAINCOLOUR}enabled log level {ALTCOLOUR}${toLowerCase(params)}`);
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)}{MAINCOLOUR} enabled log level {ALTCOLOUR}${toLowerCase(params)}`);
return true;
}
@@ -219,7 +219,7 @@ function removeLogLevelCommand(command, params, client) {
}
sendPlayerLogLevel(null, logLevel);
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} {MAINCOLOUR}disabled log level {ALTCOLOUR}${toLowerCase(params)}`);
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)}{MAINCOLOUR} disabled log level {ALTCOLOUR}${toLowerCase(params)}`);
return true;
}
@@ -254,7 +254,7 @@ function simulateCommandForPlayerCommand(command, params, client) {
}
if (!getCommand(tempCommand)) {
messagePlayerError(client, `The command {ALTCOLOUR}/${command} {MAINCOLOUR}does not exist! Use /help for commands and information.`);
messagePlayerError(client, `The command {ALTCOLOUR}/${command}{MAINCOLOUR} does not exist! Use /help for commands and information.`);
return false;
}
@@ -288,7 +288,7 @@ function simulateCommandForAllPlayersCommand(command, params, client) {
let tempParams = splitParams.slice(1).join(" ");
if (!getCommand(tempCommand)) {
messagePlayerError(client, `The command {ALTCOLOUR}/${command} {MAINCOLOUR}does not exist! Use /help for commands and information.`);
messagePlayerError(client, `The command {ALTCOLOUR}/${command}{MAINCOLOUR} does not exist! Use /help for commands and information.`);
return false;
}
@@ -441,22 +441,16 @@ function testErrorGUICommand(command, params, client) {
// ===========================================================================
function saveServerDataCommand(command, params, client) {
messageAdmins(`{adminOrange}Vortrex{MAINCOLOUR} has forced a manual save of all data. Initiating ...`);
messageAdmins(`{adminOrange}Vortrex{MAINCOLOUR} has forced a manual save of all data. Initiating ...`, true);
saveServerDataToDatabase();
messageAdmins(`{MAINCOLOUR}All server data saved to database successfully!`);
messageAdmins(`{MAINCOLOUR}All server data saved to database successfully!`, true);
return true;
}
// ===========================================================================
function testEmailCommand(command, params, client) {
try {
messagePlayerAlert(client, `Sending test email to ${params}`);
sendEmail(params, "Player", "Test email", "Just testing the SMTP module for the server!");
} catch (error) {
messagePlayerError(client, "The email could not be sent! Error: ${error}");
return false;
}
async function testEmailCommand(command, params, client) {
sendEmail(params, "Player", "Test email", "Just testing the email system for the server!");
return true;
}

View File

@@ -16,8 +16,8 @@ const AGRP_DISCORD_WEBHOOK_ADMIN = 2;
// ===========================================================================
function initDiscordScript() {
logToConsole(LOG_INFO, "[VRR.Discord]: Initializing discord script ...");
logToConsole(LOG_INFO, "[VRR.Discord]: Discord script initialized successfully!");
logToConsole(LOG_INFO, "[AGRP.Discord]: Initializing discord script ...");
logToConsole(LOG_INFO, "[AGRP.Discord]: Discord script initialized successfully!");
}
// ===========================================================================
@@ -184,7 +184,7 @@ function triggerDiscordWebHook(messageString, serverId = getServerId(), type = A
}
let tempURL = getGlobalConfig().discord.webhook.webhookBaseURL;
tempURL = tempURL.replace("{0}", encodeURI(messageString));
tempURL = tempURL.replace("{0}", encodeURIComponent(messageString));
tempURL = tempURL.replace("{1}", serverId);
tempURL = tempURL.replace("{2}", type);
tempURL = tempURL.replace("{3}", getGlobalConfig().discord.webhook.pass);
@@ -211,7 +211,7 @@ function triggerClanDiscordWebHook(clanIndex, messageString) {
let webhookURL = getClanData(clanIndex).discordWebhookURL;
let tempURL = getGlobalConfig().discord.webhook.webhookBaseURL;
tempURL = tempURL.replace("{0}", encodeURI(messageString));
tempURL = tempURL.replace("{0}", encodeURIComponent(messageString));
tempURL = tempURL.replace("{1}", serverId);
tempURL = tempURL.replace("{2}", type);
tempURL = tempURL.replace("{3}", getGlobalConfig().discord.webhook.pass);

View File

@@ -9,8 +9,8 @@
// ===========================================================================
function initEconomyScript() {
logToConsole(LOG_INFO, "[VRR.Economy]: Initializing economy script ...");
logToConsole(LOG_INFO, "[VRR.Economy]: Economy script initialized successfully!");
logToConsole(LOG_INFO, "[AGRP.Economy]: Initializing economy script ...");
logToConsole(LOG_INFO, "[AGRP.Economy]: Economy script initialized successfully!");
}
// ===========================================================================
@@ -47,15 +47,15 @@ function playerPayDay(client) {
let netIncome = Math.round(grossIncome - incomeTaxAmount);
messagePlayerAlert(client, "== Payday! =============================");
messagePlayerInfo(client, `Paycheck: {ALTCOLOUR}$${grossIncome}`);
messagePlayerInfo(client, `Taxes: {ALTCOLOUR}$${incomeTaxAmount}`);
messagePlayerInfo(client, `You receive: {ALTCOLOUR}$${netIncome}`);
messagePlayerInfo(client, `Paycheck: {ALTCOLOUR}${getCurrencyString(grossIncome)}`);
messagePlayerInfo(client, `Taxes: {ALTCOLOUR}${getCurrencyString(incomeTaxAmount)}`);
messagePlayerInfo(client, `You receive: {ALTCOLOUR}${getCurrencyString(netIncome)}`);
if (netIncome < incomeTaxAmount) {
let totalCash = getPlayerCash(client);
let canPayNow = totalCash + netIncome;
if (incomeTaxAmount <= canPayNow) {
takePlayerCash(client, canPayNow);
messagePlayerInfo(client, `{orange}${getLocaleString(client, "RemainingTaxPaidInCash", `{ALTCOLOUR}${canPayNow}{MAINCOLOUR}`)}`);
messagePlayerInfo(client, `{orange}${getLocaleString(client, "RemainingTaxPaidInCash", `{ALTCOLOUR}${getCurrencyString(canPayNow)}{MAINCOLOUR}`)}`);
messagePlayerAlert(client, `{orange}${getLocaleString(client, "LostMoneyFromTaxes")}`);
messagePlayerAlert(client, `{orange}${getLocaleString(client, "NextPaycheckRepossessionWarning")}`);
} else {
@@ -141,14 +141,14 @@ function setPayDayBonusMultiplier(command, params, client) {
function taxInfoCommand(command, params, client) {
let wealth = calculateWealth(client);
let tax = calculateIncomeTax(wealth);
messagePlayerInfo(client, `Your tax on payday is: $${tax}. Use {ALTCOLOUR}/help tax {MAINCOLOUR}for more information.`);
messagePlayerInfo(client, getLocaleString(client, "YourTax", `{ALTCOLOUR}${getCurrencyString(tax)}{MAINCOLOUR}`, `{ALTCOLOUR}/help tax{MAINCOLOUR}`));
}
// ===========================================================================
function wealthInfoCommand(command, params, client) {
let wealth = calculateWealth(client);
messagePlayerInfo(client, `Your wealth is: {ALTCOLOUR}$${wealth}{MAINCOLOUR}. Use {ALTCOLOUR}/help wealth {MAINCOLOUR}for more information.`);
messagePlayerInfo(client, getLocaleString(client, "YourWealth", `{ALTCOLOUR}${getCurrencyString(wealth)}{MAINCOLOUR}`, `{ALTCOLOUR}/help wealth{MAINCOLOUR}`));
}
// ===========================================================================
@@ -213,4 +213,12 @@ function isDoubleBonusActive() {
return false;
}
// ===========================================================================
function getCurrencyString(amount) {
let tempString = getGlobalConfig().economy.currencyString;
tempString = tempString.replace("{AMOUNT}", toString(makeLargeNumberReadable(amount)));
return tempString;
}
// ===========================================================================

View File

@@ -8,33 +8,68 @@
// TYPE: Server (JavaScript)
// ===========================================================================
// Email Methods
const AGRP_EMAIL_METHOD_NONE = 0; // None
const AGRP_EMAIL_METHOD_SMTP_MODULE = "smtp"; // Use SMTP module
const AGRP_EMAIL_METHOD_GET_REQUEST = "http"; // Use HTTP request (httpGet to custom PHP page)
// ===========================================================================
function initEmailScript() {
logToConsole(LOG_INFO, "[VRR.Email]: Initializing email script ...");
logToConsole(LOG_INFO, "[VRR.Email]: Email script initialized successfully!");
logToConsole(LOG_INFO, "[AGRP.Email]: Initializing email script ...");
logToConsole(LOG_INFO, "[AGRP.Email]: Email script initialized successfully!");
}
// ===========================================================================
async function sendEmail(toEmail, toName, subject, body) {
if (!checkForSMTPModule()) {
return false;
switch (getEmailConfig().method) {
case AGRP_EMAIL_METHOD_SMTP_MODULE:
if (!checkForSMTPModule()) {
return false;
}
Promise.resolve().then(() => {
module.smtp.send(
getEmailConfig().smtp.host,
getEmailConfig().smtp.port,
intToBool(getEmailConfig().smtp.useTLS),
getEmailConfig().smtp.username,
getEmailConfig().smtp.password,
toEmail,
toName,
subject,
body,
getEmailConfig().smtp.from,
getEmailConfig().smtp.fromName
);
});
break;
case AGRP_EMAIL_METHOD_GET_REQUEST:
let tempURL = getEmailConfig().http.baseURL;
tempURL = tempURL.replace("{0}", encodeURIComponent(getEmailConfig().http.password));
tempURL = tempURL.replace("{1}", encodeURIComponent(toEmail));
tempURL = tempURL.replace("{2}", encodeURIComponent(toName));
tempURL = tempURL.replace("{3}", encodeURIComponent(subject));
tempURL = tempURL.replace("{4}", encodeURIComponent(body));
httpGet(
tempURL,
"",
function (data) {
},
function (data) {
}
);
break;
default:
return false;
}
Promise.resolve().then(() => {
module.smtp.send(
getEmailConfig().smtp.host,
getEmailConfig().smtp.port,
intToBool(getEmailConfig().smtp.useTLS),
getEmailConfig().smtp.username,
getEmailConfig().smtp.password,
toEmail,
toName,
subject,
body,
getEmailConfig().smtp.from,
getEmailConfig().smtp.fromName
);
});
return true;
}
// ===========================================================================

View File

@@ -9,9 +9,9 @@
// ===========================================================================
function initEventScript() {
logToConsole(LOG_INFO, "[VRR.Event]: Initializing event script ...");
logToConsole(LOG_INFO, "[AGRP.Event]: Initializing event script ...");
addAllEventHandlers();
logToConsole(LOG_INFO, "[VRR.Event]: Event script initialized!");
logToConsole(LOG_INFO, "[AGRP.Event]: Event script initialized!");
}
// ===========================================================================
@@ -28,17 +28,21 @@ function addAllEventHandlers() {
addEventHandler("onElementStreamIn", onElementStreamIn);
addEventHandler("onElementStreamOut", onElementStreamOut);
addEventHandler("onPedSpawn", onPedSpawn);
addEventHandler("OnPickupPickedUp", onPedPickupPickedUp);
addEventHandler("onPedEnteredVehicleEx", onPedEnteredVehicle);
addEventHandler("onPedExitedVehicleEx", onPedExitedVehicle);
addEventHandler("onPedEnteredSphereEx", onPedEnteredSphere);
addEventHandler("onPedExitedSphereEx", onPedExitedSphere);
addEventHandler("OnPickupPickedUp", onPedPickupPickedUp);
if (getGame() == AGRP_GAME_MAFIA_ONE) {
addEventHandler("onPedFall", onPedFall);
}
}
// ===========================================================================
function onPlayerConnect(event, ipAddress, port) {
logToConsole(LOG_INFO, `[VRR.Event] Client connecting (IP: ${ipAddress})`);
logToConsole(LOG_INFO, `[AGRP.Event] onPlayerConnect - Client connecting (IP: ${ipAddress})`);
//if(isIpAddressBanned(ipAddress)) {
// messagePlayerError(client, "You are banned from this server!");
// return false;
@@ -48,15 +52,14 @@ function onPlayerConnect(event, ipAddress, port) {
// ===========================================================================
function onPlayerJoin(event, client) {
logToConsole(LOG_INFO, `[VRR.Event] Client ${getPlayerName(client)}[${getPlayerId(client)}] joining from ${getPlayerIP(client)}`);
logToConsole(LOG_INFO, `[AGRP.Event] onPlayerJoin - Client ${getPlayerDisplayForConsole(client)} joining from ${getPlayerIP(client)}`);
//if (isFadeCameraSupported()) {
// fadeCamera(client, true, 1.0);
//}
playerResourceReady[getPlayerId(client)] = false;
playerResourceStarted[getPlayerId(client)] = false;
playerInitialized[getPlayerId(client)] = false;
playerGUIReady[getPlayerId(client)] = false;
//if(isCustomCameraSupported()) {
// showConnectCameraToPlayer(client);
//}
getServerData().clients[getPlayerId(client)] = null;
let messageText = `👋 ${getPlayerName(client)} is connecting to the server ...`;
messageDiscordEventChannel(messageText);
@@ -65,13 +68,12 @@ function onPlayerJoin(event, client) {
for (let i in clients) {
messagePlayerNormal(clients[i], getLocaleString(clients[i], "PlayerConnecting", getPlayerName(client)));
}
//messageDiscordEventChannel(`👋 ${getPlayerDisplayForConsole(client)} has joined the server.`);
}
// ===========================================================================
function onPlayerJoined(event, client) {
logToConsole(LOG_INFO, `[AGRP.Event] onPlayerJoined - Client ${getPlayerDisplayForConsole(client)} joined from ${getPlayerIP(client)}`);
//initClient(client);
}
@@ -99,37 +101,23 @@ function onElementStreamOut(event, element, client) {
// ===========================================================================
function onPlayerQuit(event, client, quitReasonId) {
logToConsole(LOG_INFO, `👋 Client ${getPlayerDisplayForConsole(client)} disconnected (${disconnectReasons[quitReasonId]}[${quitReasonId}])`);
updateConnectionLogOnQuit(client, quitReasonId);
let disconnectName = disconnectReasons[quitReasonId];
let reasonTextEnglish = getLanguageGroupedLocaleString(englishLocale, "DisconnectReasons", disconnectName);
let clientName = getPlayerName(client);
let reasonText = disconnectReasons[quitReasonId];
if (getPlayerData(client) != false) {
if (getPlayerData(client).customDisconnectReason != "") {
reasonText = getPlayerData(client).customDisconnectReason;
disconnectName = getPlayerData(client).customDisconnectReason;
}
}
//messagePlayerNormal(null, `👋 ${getPlayerName(client)} has left the server (${reasonText})`, getColourByName("softYellow"));
updateConnectionLogOnQuit(client, disconnectName);
//if (isPlayerFishing(client)) {
// stopFishing(client);
//}
if (isPlayerInPaintBall(client)) {
stopPaintBall(client);
}
if (isPlayerOnJobRoute(client)) {
stopJobRoute(client);
}
if (isPlayerWorking(client)) {
stopWorking(client);
}
resetClientStuff(client);
if (isPlayerLoggedIn(client)) {
savePlayerToDatabase(client);
resetClientStuff(client);
}
if (getPlayerData(client).loginTimeout != null) {
@@ -141,13 +129,15 @@ function onPlayerQuit(event, client, quitReasonId) {
playerInitialized[client.index] = false;
playerGUIReady[client.index] = false;
messageDiscordEventChannel(`👋 ${getPlayerName(client)} has left the server (${reasonText})`);
getClients().forEach(forClient => {
let reasonText = getGroupedLocaleString(forClient, "DisconnectReasons", quitReasonId);
messagePlayerNormal(forClient, getLocaleString(forClient, "PlayerLeftServer", getPlayerName(client), reasonText));
});
getServerData().clients[getPlayerId(client)] = null;
logToConsole(LOG_INFO, `👋 Client ${getPlayerDisplayForConsole(client)} disconnected (quitReasonId - ${reasonTextEnglish})`);
//messageDiscordEventChannel(`👋 ${clientName} has left the server (${reasonTextEnglish})`);
messageDiscordEventChannel(`👋 ${getLanguageLocaleString(englishLocale, "PlayerLeftServer", clientName, reasonTextEnglish)}`);
getClients().filter(c => c != client).forEach(forClient => {
messagePlayerNormal(forClient, getLocaleString(forClient, "PlayerLeftServer", clientName, getGroupedLocaleString(forClient, "DisconnectReasons", disconnectName)));
});
}
// ===========================================================================
@@ -215,28 +205,23 @@ function onPedExitingVehicle(event, ped, vehicle) {
let client = getClientFromPlayerElement(ped);
getPlayerData(client).pedState = AGRP_PEDSTATE_EXITINGVEHICLE;
}
if (!getVehicleData(vehicle).spawnLocked) {
getVehicleData(vehicle).spawnPosition = getVehiclePosition(vehicle);
getVehicleData(vehicle).spawnRotation = getVehicleHeading(vehicle);
getVehicleData(vehicle).needsSaved = true;
}
}
// ===========================================================================
function onResourceStart(event, resource) {
logToConsole(LOG_WARN, `[VRR.Event] Resource ${resource.name} started!`);
logToConsole(LOG_WARN | LOG_DEBUG, `[AGRP.Event] Resource ${resource.name} started!`);
//if(resource != thisResource) {
// messageAdmins(`{MAINCOLOUR}Resource {ALTCOLOUR}${resource.name}{MAINCOLOUR} started!`);
//}
if (resource == thisResource) {
//messageAdmins(`{MAINCOLOUR}Resource {ALTCOLOUR}${resource.name}{MAINCOLOUR} started!`);
messageDiscordEventChannel(`✅ Server is starting up!`);
}
}
// ===========================================================================
function onResourceStop(event, resource) {
logToConsole(LOG_WARN, `[VRR.Event] Resource ${resource.name} stopped!`);
logToConsole(LOG_WARN | LOG_DEBUG, `[AGRP.Event] Resource ${resource.name} stopped!`);
//if(resource != thisResource) {
// messageAdmins(`{MAINCOLOUR}Resource {ALTCOLOUR}${resource.name}{MAINCOLOUR} stopped!`);
@@ -247,27 +232,31 @@ function onResourceStop(event, resource) {
saveServerDataToDatabase();
disconnectFromDatabase(persistentDatabaseConnection, true);
collectAllGarbage();
messageDiscordEventChannel(`⛔ Server is shutting down!`);
}
}
// ===========================================================================
function onPedEnteredSphere(event, ped, sphere) {
if (ped.isType(ELEMENT_PLAYER)) {
let client = getClientFromPlayerElement(ped);
logToConsole(LOG_WARN | LOG_DEBUG, `[AGRP.Event] Ped ${ped.id} entered sphere ${sphere.id}!`);
//if (ped.isType(ELEMENT_PLAYER)) {
// let client = getClientFromPlayerElement(ped);
// Handled client-side since server spheres aren't showing on GTAC atm (bug)
//if (isPlayerOnJobRoute(client)) {
// if (sphere == getJobRouteLocationData(getPlayerJob(client), getPlayerJobRoute(client), getPlayerJobRouteLocation(client)).marker) {
// playerArrivedAtJobRouteLocation(client);
// }
//}
}
// Handled client-side since server spheres aren't showing on GTAC atm (bug)
//if (isPlayerOnJobRoute(client)) {
// if (sphere == getJobRouteLocationData(getPlayerJob(client), getPlayerJobRoute(client), getPlayerJobRouteLocation(client)).marker) {
// playerArrivedAtJobRouteLocation(client);
// }
//}
//}
}
// ===========================================================================
function onPedExitedSphere(event, ped, sphere) {
logToConsole(LOG_WARN | LOG_DEBUG, `[AGRP.Event] Ped ${ped.id} exited sphere ${sphere.id}!`);
//if (ped.isType(ELEMENT_PLAYER)) {
// let client = getClientFromPlayerElement(ped);
//}
@@ -276,6 +265,8 @@ function onPedExitedSphere(event, ped, sphere) {
// ===========================================================================
function onPedPickupPickedUp(event, ped, pickup) {
logToConsole(LOG_WARN | LOG_DEBUG, `[AGRP.Event] Ped ${ped.id} picked up pickup ${pickup.id}!`);
if (ped.isType(ELEMENT_PLAYER)) {
let client = getClientFromPlayerElement(ped);
@@ -289,7 +280,10 @@ function onPedPickupPickedUp(event, ped, pickup) {
// ===========================================================================
/*
function onPedWasted(event, ped, killerPed, weapon, pedPiece) {
logToConsole(LOG_WARN | LOG_DEBUG, `[AGRP.Event] Ped ${ped.id} wasted by ped ${killerPed.id}!`);
if (ped.isType(ELEMENT_PLAYER)) {
let killerClient = null;
if (killerPed != null && killerPed.type == ELEMENT_PLAYER) {
@@ -298,10 +292,13 @@ function onPedWasted(event, ped, killerPed, weapon, pedPiece) {
onPlayerWasted(getClientFromPlayerElement(ped), killerClient, weapon, pedPiece);
}
}
*/
// ===========================================================================
function onPlayerDeath(client, killer, weapon, pedPiece) {
logToConsole(LOG_WARN | LOG_DEBUG, `[AGRP.Event] Player ${getPlayerDisplayForConsole(client)} died!`);
logToConsole(LOG_INFO, `${getPlayerDisplayForConsole(client)} died.`);
getPlayerData(client).pedState = AGRP_PEDSTATE_DEAD;
updatePlayerSpawnedState(client, false);
@@ -393,74 +390,81 @@ function onPlayerDeath(client, killer, weapon, pedPiece) {
// ===========================================================================
function onPedSpawn(ped) {
if (ped.type == ELEMENT_PLAYER) {
//setTimeout(onPlayerSpawn, 250, ped);
onPlayerSpawn();
}
logToConsole(LOG_WARN | LOG_DEBUG, `[AGRP.Event] Ped ${ped.id} spawned!`);
//if (ped.type == ELEMENT_PLAYER) {
// if (getGame() != AGRP_GAME_MAFIA_ONE) {
// //setTimeout(onPlayerSpawn, 250, getClientFromPlayerElement(ped));
// //onPlayerSpawn(getClientFromPlayerElement(ped));
// }
//}
}
// ===========================================================================
async function onPlayerSpawn(client) {
//logToConsole(LOG_DEBUG, `[VRR.Event] Checking for ${getPlayerDisplayForConsole(client)}'s player ped`);
logToConsole(LOG_WARN | LOG_DEBUG, `[AGRP.Event] Player ${getPlayerDisplayForConsole(client)} spawned!`);
//logToConsole(LOG_DEBUG, `[AGRP.Event] Checking for ${getPlayerDisplayForConsole(client)}'s player ped`);
//if(getPlayerPed(client) == null) {
// logToConsole(LOG_DEBUG, `[VRR.Event] ${getPlayerDisplayForConsole(client)}'s player element not set yet. Rechecking ...`);
// logToConsole(LOG_DEBUG, `[AGRP.Event] ${getPlayerDisplayForConsole(client)}'s player element not set yet. Rechecking ...`);
// setTimeout(onPlayerSpawn, 500, client);
// return false;
//}
//logToConsole(LOG_DEBUG, `[VRR.Event] ${getPlayerDisplayForConsole(client)}'s player ped is valid. Continuing spawn processing ...`);
//logToConsole(LOG_DEBUG, `[AGRP.Event] ${getPlayerDisplayForConsole(client)}'s player ped is valid. Continuing spawn processing ...`);
if (areServerElementsSupported()) {
await waitUntil(() => client != null && getPlayerPed(client) != null);
}
//logToConsole(LOG_DEBUG, `[VRR.Event] Checking ${getPlayerDisplayForConsole(client)}'s player data`);
stopRadioStreamForPlayer(client);
//logToConsole(LOG_DEBUG, `[AGRP.Event] Checking ${getPlayerDisplayForConsole(client)}'s player data`);
if (!getPlayerData(client)) {
logToConsole(LOG_DEBUG, `[VRR.Event] ${getPlayerDisplayForConsole(client)}'s player data is invalid. Kicking them from server.`);
getPlayerData(targetClient).customDisconnectReason = `Kicked - Spawn bug. Data invalid.`;
logToConsole(LOG_DEBUG, `[AGRP.Event] ${getPlayerDisplayForConsole(client)}'s player data is invalid. Kicking them from server.`);
getPlayerData(targetClient).customDisconnectReason = "Desync";
disconnectPlayer(client);
return false;
}
//logToConsole(LOG_DEBUG, `[VRR.Event] Checking ${getPlayerDisplayForConsole(client)}'s login status`);
//logToConsole(LOG_DEBUG, `[AGRP.Event] Checking ${getPlayerDisplayForConsole(client)}'s login status`);
if (!isPlayerLoggedIn(client)) {
logToConsole(LOG_DEBUG, `[VRR.Event] ${getPlayerDisplayForConsole(client)} is NOT logged in. Despawning their player.`);
getPlayerData(targetClient).customDisconnectReason = `Kicked - Tried to force spawn without logging in.`;
logToConsole(LOG_DEBUG, `[AGRP.Event] ${getPlayerDisplayForConsole(client)} is NOT logged in. Despawning their player.`);
getPlayerData(targetClient).customDisconnectReason = "Desync";
disconnectPlayer(client);
return false;
}
//logToConsole(LOG_DEBUG, `[VRR.Event] Checking ${getPlayerDisplayForConsole(client)}'s selected character status`);
//logToConsole(LOG_DEBUG, `[AGRP.Event] Checking ${getPlayerDisplayForConsole(client)}'s selected character status`);
if (getPlayerData(client).currentSubAccount == -1) {
logToConsole(LOG_DEBUG, `[VRR.Event] ${getPlayerDisplayForConsole(client)} has NOT selected a character. Despawning their player.`);
getPlayerData(targetClient).customDisconnectReason = `Kicked - Tried to force spawn without selecting a character.`;
logToConsole(LOG_DEBUG, `[AGRP.Event] ${getPlayerDisplayForConsole(client)} has NOT selected a character. Despawning their player.`);
getPlayerData(targetClient).customDisconnectReason = "Desync";
disconnectPlayer(client);
return false;
}
logToConsole(LOG_DEBUG, `[VRR.Event] ${getPlayerDisplayForConsole(client)}'s player data is valid. Continuing spawn processing ...`);
logToConsole(LOG_DEBUG, `[AGRP.Event] ${getPlayerDisplayForConsole(client)}'s player data is valid. Continuing spawn processing ...`);
if (isGameFeatureSupported("pedScale")) {
logToConsole(LOG_DEBUG, `[VRR.Event] Setting ${getPlayerDisplayForConsole(client)}'s ped scale (${getPlayerCurrentSubAccount(client).pedScale})`);
logToConsole(LOG_DEBUG, `[AGRP.Event] Setting ${getPlayerDisplayForConsole(client)}'s ped scale (${getPlayerCurrentSubAccount(client).pedScale})`);
setEntityData(getPlayerPed(client), "agrp.scale", getPlayerCurrentSubAccount(client).pedScale, true);
}
//if (isPlayerSwitchingCharacter(client) || isPlayerCreatingCharacter(client)) {
// logToConsole(LOG_DEBUG, `[VRR.Event] ${getPlayerDisplayForConsole(client)}'s ped is being used for character selection/creation. No further spawn processing needed'`);
// logToConsole(LOG_DEBUG, `[AGRP.Event] ${getPlayerDisplayForConsole(client)}'s ped is being used for character selection/creation. No further spawn processing needed'`);
// return false;
//}
if (isCustomCameraSupported() && getGame() != AGRP_GAME_GTA_IV && getGame() != AGRP_GAME_GTA_IV_EFLC) {
logToConsole(LOG_DEBUG, `[VRR.Event] Restoring ${getPlayerDisplayForConsole(client)}'s camera`);
if (isCustomCameraSupported()) {
logToConsole(LOG_DEBUG, `[AGRP.Event] Restoring ${getPlayerDisplayForConsole(client)}'s camera`);
restorePlayerCamera(client);
}
if (areServerElementsSupported()) {
logToConsole(LOG_DEBUG, `[VRR.Event] Storing ${getPlayerDisplayForConsole(client)} ped in client data `);
logToConsole(LOG_DEBUG, `[AGRP.Event] Storing ${getPlayerDisplayForConsole(client)} ped in client data `);
getPlayerData(client).ped = getPlayerPed(client);
}
logToConsole(LOG_DEBUG, `[VRR.Event] Sending ${getPlayerDisplayForConsole(client)} the 'now playing as' message`);
logToConsole(LOG_DEBUG, `[AGRP.Event] Sending ${getPlayerDisplayForConsole(client)} the 'now playing as' message`);
messagePlayerAlert(client, `You are now playing as: {businessBlue}${getCharacterFullName(client)}`, getColourByName("white"));
//messagePlayerNormal(client, "This server is in early development and may restart at any time for updates.", getColourByName("orange"));
//messagePlayerNormal(client, "Please report any bugs using /bug and suggestions using /idea", getColourByName("yellow"));
@@ -474,68 +478,74 @@ async function onPlayerSpawn(client) {
//}
if (isGameFeatureSupported("interior")) {
logToConsole(LOG_DEBUG, `[VRR.Event] Setting player interior for ${getPlayerDisplayForConsole(client)} to ${getPlayerCurrentSubAccount(client).interior}`);
logToConsole(LOG_DEBUG, `[AGRP.Event] Setting player interior for ${getPlayerDisplayForConsole(client)} to ${getPlayerCurrentSubAccount(client).interior}`);
setPlayerInterior(client, getPlayerCurrentSubAccount(client).interior);
}
logToConsole(LOG_DEBUG, `[VRR.Event] Setting player dimension for ${getPlayerDisplayForConsole(client)} to ${getPlayerCurrentSubAccount(client).dimension}`);
logToConsole(LOG_DEBUG, `[AGRP.Event] Setting player dimension for ${getPlayerDisplayForConsole(client)} to ${getPlayerCurrentSubAccount(client).dimension}`);
setPlayerDimension(client, getPlayerCurrentSubAccount(client).dimension);
//if(getPlayerCurrentSubAccount(client).interior != 0 || getPlayerCurrentSubAccount(client).dimension != 0) {
// updateAllInteriorVehiclesForPlayer(client, getPlayerCurrentSubAccount(client).interior, getPlayerCurrentSubAccount(client).dimension);
//}
logToConsole(LOG_DEBUG, `[VRR.Event] Setting player health for ${getPlayerDisplayForConsole(client)} to ${getPlayerCurrentSubAccount(client).health}`);
logToConsole(LOG_DEBUG, `[AGRP.Event] Setting player health for ${getPlayerDisplayForConsole(client)} to ${getPlayerCurrentSubAccount(client).health}`);
setPlayerHealth(client, getPlayerCurrentSubAccount(client).health);
if (isGameFeatureSupported("pedArmour")) {
logToConsole(LOG_DEBUG, `[VRR.Event] Setting player armour for ${getPlayerDisplayForConsole(client)} to ${getPlayerCurrentSubAccount(client).armour}`);
logToConsole(LOG_DEBUG, `[AGRP.Event] Setting player armour for ${getPlayerDisplayForConsole(client)} to ${getPlayerCurrentSubAccount(client).armour}`);
setPlayerArmour(client, getPlayerCurrentSubAccount(client).armour);
}
logToConsole(LOG_DEBUG, `[VRR.Event] Sending ${getPlayerDisplayForConsole(client)}'s job type to their client (${getJobIndexFromDatabaseId(getPlayerCurrentSubAccount(client))})`);
logToConsole(LOG_DEBUG, `[AGRP.Event] Sending ${getPlayerDisplayForConsole(client)}'s job type to their client (${getJobIndexFromDatabaseId(getPlayerCurrentSubAccount(client))})`);
sendPlayerJobType(client, getPlayerCurrentSubAccount(client).job);
if (isGameFeatureSupported("rendering2D")) {
logToConsole(LOG_DEBUG, `[VRR.Event] Enabling all rendering states for ${getPlayerDisplayForConsole(client)}`);
logToConsole(LOG_DEBUG, `[AGRP.Event] Enabling all rendering states for ${getPlayerDisplayForConsole(client)}`);
setPlayer2DRendering(client, true, true, true, true, true, true);
}
if (isGameFeatureSupported("snow")) {
logToConsole(LOG_DEBUG, `[VRR.Event] Sending snow states to ${getPlayerDisplayForConsole(client)}`);
updatePlayerSnowState(client);
}
//if (isGameFeatureSupported("snow")) {
// logToConsole(LOG_DEBUG, `[AGRP.Event] Sending snow states to ${getPlayerDisplayForConsole(client)}`);
// updatePlayerSnowState(client, true);
//}
if (areServerElementsSupported() && isGameFeatureSupported("walkStyle")) {
logToConsole(LOG_DEBUG, `[VRR.Event] Setting player walking style for ${getPlayerDisplayForConsole(client)}`);
logToConsole(LOG_DEBUG, `[AGRP.Event] Setting player walking style for ${getPlayerDisplayForConsole(client)}`);
setEntityData(getPlayerPed(client), "agrp.walkStyle", getPlayerCurrentSubAccount(client).walkStyle, true);
}
if (isGameFeatureSupported("fightStyle")) {
logToConsole(LOG_DEBUG, `[VRR.Event] Setting player fighting style for ${getPlayerDisplayForConsole(client)}`);
logToConsole(LOG_DEBUG, `[AGRP.Event] Setting player fighting style for ${getPlayerDisplayForConsole(client)}`);
setPlayerFightStyle(client, getPlayerCurrentSubAccount(client).fightStyle);
}
if (isGameFeatureSupported("rendering2D")) {
logToConsole(LOG_DEBUG, `[VRR.Event] Updating logo state for ${getPlayerDisplayForConsole(client)}`);
logToConsole(LOG_DEBUG, `[AGRP.Event] Updating logo state for ${getPlayerDisplayForConsole(client)}`);
updatePlayerShowLogoState(client, (getServerConfig().showLogo && doesPlayerHaveLogoEnabled(client)));
}
logToConsole(LOG_DEBUG, `[VRR.Event] Caching ${getPlayerDisplayForConsole(client)}'s hotbar items`);
logToConsole(LOG_DEBUG, `[AGRP.Event] Caching ${getPlayerDisplayForConsole(client)}'s hotbar items`);
cachePlayerHotBarItems(client);
logToConsole(LOG_DEBUG, `[VRR.Event] Syncing ${getPlayerDisplayForConsole(client)}'s hotbar`);
logToConsole(LOG_DEBUG, `[AGRP.Event] Syncing ${getPlayerDisplayForConsole(client)}'s hotbar`);
updatePlayerHotBar(client);
logToConsole(LOG_DEBUG, `[VRR.Event] Setting ${getPlayerDisplayForConsole(client)}'s switchchar state to false`);
logToConsole(LOG_DEBUG, `[AGRP.Event] Setting ${getPlayerDisplayForConsole(client)}'s switchchar state to false`);
getPlayerData(client).switchingCharacter = false;
if (!doesPlayerHaveKeyBindsDisabled(client) && doesPlayerHaveKeyBindForCommand(client, "enter")) {
let keyId = getPlayerKeyBindForCommand(client, "enter");
logToConsole(LOG_DEBUG, `[VRR.Event] Sending custom enter property key ID (${keyId.key}, ${toUpperCase(getKeyNameFromId(keyId.key))}) to ${getPlayerDisplayForConsole(client)}`);
logToConsole(LOG_DEBUG, `[AGRP.Event] Sending custom enter property key ID (${keyId.key}, ${toUpperCase(getKeyNameFromId(keyId.key))}) to ${getPlayerDisplayForConsole(client)}`);
sendPlayerEnterPropertyKey(client, keyId.key);
}
sendPlayerChatBoxTimeStampsState(client, isPlayerAccountSettingEnabled(client, "ChatBoxTimestamps"));
sendPlayerChatEmojiState(client, isPlayerAccountSettingEnabled(client, "ChatEmoji"));
sendPlayerProfanityFilterState(client, isPlayerAccountSettingEnabled(client, "ProfanityFilter"));
sendPlayerChatScrollLines(client, getPlayerData(client).accountData.chatScrollLines);
//sendPlayerGlobalKeyBindsState(client, !isPlayerAccountSettingEnabled(client, "NoKeyBinds"));
//if(isGTAIV()) {
// setEntityData(getPlayerPed(client), "agrp.bodyPartHair", getPlayerCurrentSubAccount(client).bodyParts.hair, true);
// setEntityData(getPlayerPed(client), "agrp.bodyPartHead", getPlayerCurrentSubAccount(client).bodyParts.head, true);
@@ -557,7 +567,7 @@ async function onPlayerSpawn(client) {
//sendPlayerPedPartsAndProps(client);
}
logToConsole(LOG_DEBUG, `[VRR.Event] Setting ${getPlayerDisplayForConsole(client)}'s ped state to ready`);
logToConsole(LOG_DEBUG, `[AGRP.Event] Setting ${getPlayerDisplayForConsole(client)}'s ped state to ready`);
getPlayerData(client).pedState = AGRP_PEDSTATE_READY;
if (areServerElementsSupported()) {
@@ -567,23 +577,29 @@ async function onPlayerSpawn(client) {
//}, 1000);
}
logToConsole(LOG_DEBUG, `[VRR.Event] Syncing ${getPlayerDisplayForConsole(client)}'s cash ${getPlayerCurrentSubAccount(client).cash}`);
logToConsole(LOG_DEBUG, `[AGRP.Event] Syncing ${getPlayerDisplayForConsole(client)}'s cash ${getPlayerCurrentSubAccount(client).cash}`);
updatePlayerCash(client);
if (isGameFeatureSupported("customNametag")) {
logToConsole(LOG_DEBUG, `[VRR.Event] Sending player nametag distance to ${getPlayerDisplayForConsole(client)}`);
logToConsole(LOG_DEBUG, `[AGRP.Event] Sending player nametag distance to ${getPlayerDisplayForConsole(client)}`);
sendNameTagDistanceToClient(client, getServerConfig().nameTagDistance);
}
if (!areServerElementsSupported()) {
if (!areServerElementsSupported() || getGame() == AGRP_GAME_MAFIA_ONE || getGame() == AGRP_GAME_GTA_IV) {
logToConsole(LOG_DEBUG, `[AGRP.Event] Sending properties, jobs, and vehicles to ${getPlayerDisplayForConsole(client)} (no server elements)`);
sendAllBusinessesToPlayer(client);
sendAllHousesToPlayer(client);
//sendAllJobsToPlayer(client);
//sendAllVehiclesToPlayer(client);
if (getGame() != AGRP_GAME_GTA_IV) {
sendAllJobsToPlayer(client);
}
requestPlayerPedNetworkId(client);
}
logToConsole(LOG_DEBUG, `[VRR.Event] Updating spawned state for ${getPlayerDisplayForConsole(client)} to true`);
if (!areServerElementsSupported()) {
sendAllVehiclesToPlayer(client);
}
logToConsole(LOG_DEBUG, `[AGRP.Event] Updating spawned state for ${getPlayerDisplayForConsole(client)} to true`);
updatePlayerSpawnedState(client, true);
getPlayerData(client).payDayTickStart = sdl.ticks;
@@ -591,14 +607,29 @@ async function onPlayerSpawn(client) {
// Locales are handled via resource files now. No need to send anymore, but kept in case revert is needed.
//sendPlayerLocaleStrings(client);
logToConsole(LOG_DEBUG, `[VRR.Event] Updating all player name tags`);
logToConsole(LOG_DEBUG, `[AGRP.Event] Updating all player name tags`);
updateAllPlayerNameTags();
setPlayerWeaponDamageEvent(client, AGRP_WEAPON_DAMAGE_EVENT_NORMAL);
if (doesPlayerHaveGUIEnabled(client) && getServerConfig().useGUI == true) {
if (checkForGeoIPModule()) {
let iso = getPlayerCountryISOCode(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");
}
}
}
}
if (areServerElementsSupported()) {
if (getGlobalConfig().playerStreamInDistance == -1 || getGlobalConfig().playerStreamOutDistance == -1) {
getPlayerPed(client).netFlags.distanceStreaming = false;
//getPlayerPed(client).netFlags.distanceStreaming = false;
setElementStreamInDistance(getPlayerPed(client), 99999);
setElementStreamOutDistance(getPlayerPed(client), 99999);
} else {
setElementStreamInDistance(getPlayerPed(client), getServerConfig().playerStreamInDistance);
setElementStreamOutDistance(getPlayerPed(client), getServerConfig().playerStreamOutDistance);
@@ -609,7 +640,7 @@ async function onPlayerSpawn(client) {
// Radio stuff must be last thing sent to client because it hangs the client for a second, which blocks processing of other incoming packets
// Start playing business/house radio if in one
if (getPlayerCurrentSubAccount(client).interior != getGameConfig().mainWorldInterior[getGame()] || getPlayerCurrentSubAccount(client).dimension != getGameConfig().mainWorldDimension[getGame()]) {
if (getPlayerDimension(client) != getGameConfig().mainWorldDimension[getGame()]) {
let businessId = getPlayerBusiness(client);
let houseId = getPlayerHouse(client);
if (businessId != -1) {
@@ -623,8 +654,6 @@ async function onPlayerSpawn(client) {
} else {
stopRadioStreamForPlayer(client);
}
} else {
stopRadioStreamForPlayer(client);
}
messageDiscordEventChannel(`🧍 ${getPlayerName(client)} spawned as ${getCharacterFullName(client)}`);
@@ -632,7 +661,11 @@ async function onPlayerSpawn(client) {
// ===========================================================================
// Only used for MP mods without an "add command handler" ability
// Not bound on GTA Connected or RageMP
function onPlayerCommand(event, client, command, params) {
logToConsole(LOG_WARN | LOG_DEBUG, `[AGRP.Event] Player used command ${command}!`);
if (!doesCommandExist(command)) {
processPlayerCommand(command, params, client);
}
@@ -641,11 +674,23 @@ function onPlayerCommand(event, client, command, params) {
// ===========================================================================
function onPedExitedVehicle(event, ped, vehicle, seat) {
logToConsole(LOG_WARN | LOG_DEBUG, `[AGRP.Event] Ped ${ped.id} exited vehicle ${vehicle.id} from seat ${seat}!`);
if (getVehicleData(vehicle) == false) {
return false;
}
if (ped.isType(ELEMENT_PLAYER)) {
let client = getClientFromPlayerElement(ped);
if (client != null) {
getPlayerData(client).pedState = AGRP_PEDSTATE_READY;
if (getVehicleData(vehicle).spawnLocked == false && canPlayerManageVehicle(client, vehicle) == true) {
getVehicleData(vehicle).spawnPosition = getVehiclePosition(vehicle);
getVehicleData(vehicle).spawnRotation = getVehicleHeading(vehicle);
getVehicleData(vehicle).needsSaved = true;
}
stopRadioStreamForPlayer(client);
if (!getVehicleData(vehicle)) {
@@ -662,7 +707,7 @@ function onPedExitedVehicle(event, ped, vehicle, seat) {
getVehicleData(vehicle).lastActiveTime = getCurrentUnixTimestamp();
logToConsole(LOG_DEBUG, `[VRR.Event] ${getPlayerDisplayForConsole(client)} exited a ${getVehicleName(vehicle)} (ID: ${vehicle.getData("agrp.dataSlot")}, Database ID: ${getVehicleData(vehicle).databaseId})`);
logToConsole(LOG_DEBUG, `[AGRP.Event] ${getPlayerDisplayForConsole(client)} exited a ${getVehicleName(vehicle)} (ID: ${vehicle.getData("agrp.dataSlot")}, Database ID: ${getVehicleData(vehicle).databaseId})`);
}
}
}
@@ -670,6 +715,8 @@ function onPedExitedVehicle(event, ped, vehicle, seat) {
// ===========================================================================
function onPedEnteredVehicle(event, ped, vehicle, seat) {
logToConsole(LOG_WARN | LOG_DEBUG, `[AGRP.Event] Ped ${ped.id} entered vehicle ${vehicle.id} in seat ${seat}!`);
if (ped.isType(ELEMENT_PLAYER)) {
let client = getClientFromPlayerElement(ped);
if (client != null) {
@@ -677,31 +724,29 @@ function onPedEnteredVehicle(event, ped, vehicle, seat) {
return false;
}
if (getGame() == AGRP_GAME_GTA_IV) {
vehicle = getVehicleFromIVNetworkId(clientVehicle);
}
if (!getVehicleData(vehicle)) {
return false;
}
logToConsole(LOG_DEBUG, `[VRR.Event] ${getPlayerDisplayForConsole(client)} entered a ${getVehicleName(vehicle)} (ID: ${vehicle.getData("agrp.dataSlot")}, Database ID: ${getVehicleData(vehicle).databaseId})`);
logToConsole(LOG_DEBUG, `[AGRP.Event] ${getPlayerDisplayForConsole(client)} entered a ${getVehicleName(vehicle)} (ID: ${vehicle.getData("agrp.dataSlot")}, Database ID: ${getVehicleData(vehicle).databaseId})`);
getPlayerData(client).lastVehicle = vehicle;
getVehicleData(vehicle).lastActiveTime = getCurrentUnixTimestamp();
if (getPlayerVehicleSeat(client) == AGRP_VEHSEAT_DRIVER) {
if (seat == AGRP_VEHSEAT_DRIVER) {
vehicle.engine = getVehicleData(vehicle).engine;
setEntityData(vehicle, "agrp.engine", getVehicleData(vehicle).engine, true);
//vehicle.netFlags.sendSync = getVehicleData(vehicle).engine;
if (getVehicleData(vehicle).buyPrice > 0) {
messagePlayerAlert(client, getLocaleString(client, "VehicleForSale", getVehicleName(vehicle), `{ALTCOLOUR}$${makeLargeNumberReadable(getVehicleData(vehicle).buyPrice)}{MAINCOLOUR}`, `{ALTCOLOUR}/vehbuy{MAINCOLOUR}`));
messagePlayerAlert(client, getLocaleString(client, "VehicleForSale", getVehicleName(vehicle), `{ALTCOLOUR}${getCurrencyString(getVehicleData(vehicle).buyPrice)}{MAINCOLOUR}`, `{ALTCOLOUR}/vehbuy{MAINCOLOUR}`));
resetVehiclePosition(vehicle);
} else if (getVehicleData(vehicle).rentPrice > 0) {
if (getVehicleData(vehicle).rentedBy != client) {
messagePlayerAlert(client, getLocaleString(client, "VehicleForRent", getVehicleName(vehicle), `{ALTCOLOUR}$${makeLargeNumberReadable(getVehicleData(vehicle).rentPrice)}{MAINCOLOUR}`, `{ALTCOLOUR}/vehrent{MAINCOLOUR}`));
messagePlayerAlert(client, getLocaleString(client, "VehicleForRent", getVehicleName(vehicle), `{ALTCOLOUR}${getCurrencyString(getVehicleData(vehicle).rentPrice)}{MAINCOLOUR}`, `{ALTCOLOUR}/vehrent{MAINCOLOUR}`));
resetVehiclePosition(vehicle);
} else {
messagePlayerAlert(client, getLocaleString(client, "CurrentlyRentingThisVehicle", `{vehiclePurple}${getVehicleName(vehicle)}{MAINCOLOUR}`, `{ALTCOLOUR}$${makeLargeNumberReadable(getVehicleData(vehicle).rentPrice)}`, `{ALTCOLOUR}/stoprent{MAINCOLOUR}`));
messagePlayerAlert(client, getLocaleString(client, "CurrentlyRentingThisVehicle", `{vehiclePurple}${getVehicleName(vehicle)}{MAINCOLOUR}`, `{ALTCOLOUR}${getCurrencyString(getVehicleData(vehicle).rentPrice)}`, `{ALTCOLOUR}/stoprent{MAINCOLOUR}`));
}
} else {
let ownerName = "Nobody";
@@ -725,7 +770,7 @@ function onPedEnteredVehicle(event, ped, vehicle, seat) {
break;
case AGRP_VEHOWNER_BIZ:
ownerName = getBusinessData(getVehicleData(vehicle).ownerId).name;
ownerName = getBusinessData(getBusinessIdFromDatabaseId(getVehicleData(vehicle).ownerId)).name;
ownerType = getLocaleString(client, "Business");
break;
@@ -757,7 +802,9 @@ function onPedEnteredVehicle(event, ped, vehicle, seat) {
if (getVehicleData(vehicle).ownerType == AGRP_VEHOWNER_JOB) {
if (getVehicleData(vehicle).ownerId == getPlayerCurrentSubAccount(client).job) {
getPlayerCurrentSubAccount(client).lastJobVehicle = vehicle;
messagePlayerInfo(client, `Use /startroute to start working in this vehicle`);
if (!hasPlayerSeenActionTip(client, "JobRouteStart")) {
messagePlayerInfo(client, getGroupedLocaleString(client, "ActionTips", "JobRouteStart", `{ALTCOLOUR}/startroute{MAINCOLOUR}`));
}
}
}
}
@@ -784,10 +831,15 @@ function onPedEnteredVehicle(event, ped, vehicle, seat) {
// ===========================================================================
function onPedEnteringVehicle(event, ped, vehicle, seat) {
logToConsole(LOG_WARN | LOG_DEBUG, `[AGRP.Event] Ped ${ped.id} is entering vehicle ${vehicle.id} in seat ${seat}!`);
if (ped.isType(ELEMENT_PLAYER)) {
let client = getClientFromPlayerElement(ped);
if (client != null) {
if (seat == AGRP_VEHSEAT_DRIVER) {
//vehicle.netFlags.sendSync = getVehicleData(vehicle).engine;
}
onPlayerEnteringVehicle(client, vehicle, seat);
}
}
}
@@ -795,12 +847,40 @@ function onPedEnteringVehicle(event, ped, vehicle, seat) {
// ===========================================================================
function onPedExitingVehicle(event, ped, vehicle, seat) {
logToConsole(LOG_WARN | LOG_DEBUG, `[AGRP.Event] Ped ${ped.id} is exiting vehicle ${vehicle.id} in seat ${seat}!`);
if (ped.isType(ELEMENT_PLAYER)) {
let client = getClientFromPlayerElement(ped);
if (client != null) {
if (seat == AGRP_VEHSEAT_DRIVER) {
//vehicle.netFlags.sendSync = getVehicleData(vehicle).engine;
}
onPlayerExitingVehicle(client, vehicle, seat);
}
}
}
// ===========================================================================
function onPlayerEnteringVehicle(client, vehicle, seat) {
}
// ===========================================================================
function onPlayerExitingVehicle(client, vehicle, seat) {
}
// ===========================================================================
function onPedFall(ped) {
if (ped.isType(ELEMENT_PLAYER)) {
let client = getClientFromPlayerElement(ped);
if (client != null) {
processPlayerDeath(client);
}
}
}
// ===========================================================================

View File

@@ -87,8 +87,8 @@ let fishingParticleEffects = {
// ===========================================================================
function initFishingScript() {
logToConsole(LOG_INFO, "[VRR.Fishing]: Initializing fishing script ...");
logToConsole(LOG_INFO, "[VRR.Fishing]: Fishing script initialized successfully!");
logToConsole(LOG_INFO, "[AGRP.Fishing]: Initializing fishing script ...");
logToConsole(LOG_INFO, "[AGRP.Fishing]: Fishing script initialized successfully!");
}
// ===========================================================================

View File

@@ -46,8 +46,8 @@ class GateData {
// ===========================================================================
function initGateScript() {
logToConsole(LOG_INFO, `[VRR.Gate]: Initializing gate script ...`);
logToConsole(LOG_INFO, `[VRR.Gate]: Gate script initialized successfully!`);
logToConsole(LOG_INFO, `[AGRP.Gate]: Initializing gate script ...`);
logToConsole(LOG_INFO, `[AGRP.Gate]: Gate script initialized successfully!`);
}
// ===========================================================================
@@ -194,7 +194,7 @@ function saveGateToDatabase(gateId) {
return false;
}
logToConsole(LOG_VERBOSE, `[VRR.Gate]: Saving gate ${tempGateData.databaseId} to database ...`);
logToConsole(LOG_VERBOSE, `[AGRP.Gate]: Saving gate ${tempGateData.databaseId} to database ...`);
let dbConnection = connectToDatabase();
if (dbConnection) {
let safeGateName = escapeDatabaseString(tempGateData.name);
@@ -228,7 +228,7 @@ function saveGateToDatabase(gateId) {
disconnectFromDatabase(dbConnection);
return true;
}
logToConsole(LOG_VERBOSE, `[VRR.Gate]: Saved gate ${gateDataId} to database!`);
logToConsole(LOG_VERBOSE, `[AGRP.Gate]: Saved gate ${gateDataId} to database!`);
return true;
}
@@ -236,7 +236,7 @@ function saveGateToDatabase(gateId) {
// ===========================================================================
function loadGatesFromDatabase() {
logToConsole(LOG_INFO, "[VRR.Gate]: Loading gates from database ...");
logToConsole(LOG_INFO, "[AGRP.Gate]: Loading gates from database ...");
let tempGates = [];
let dbConnection = connectToDatabase();
@@ -249,7 +249,7 @@ function loadGatesFromDatabase() {
while (dbAssoc = fetchQueryAssoc(dbQuery)) {
let tempGateData = new GateData(dbAssoc);
tempGates.push(tempGateData);
logToConsole(LOG_DEBUG, `[VRR.Gate]: Gate '${tempGateData.name}' loaded from database successfully!`);
logToConsole(LOG_DEBUG, `[AGRP.Gate]: Gate '${tempGateData.name}' loaded from database successfully!`);
}
}
freeDatabaseQuery(dbQuery);
@@ -257,7 +257,7 @@ function loadGatesFromDatabase() {
disconnectFromDatabase(dbConnection);
}
logToConsole(LOG_INFO, `[VRR.Gate]: ${tempGates.length} gates loaded from database successfully!`);
logToConsole(LOG_INFO, `[AGRP.Gate]: ${tempGates.length} gates loaded from database successfully!`);
return tempGates;
}

View File

@@ -8,280 +8,21 @@
// TYPE: Server (JavaScript)
// ===========================================================================
// Prompts (used for client GUI prompt responses)
const AGRP_PROMPT_NONE = 0;
const AGRP_PROMPT_CREATEFIRSTCHAR = 1;
const AGRP_PROMPT_BIZORDER = 2;
const AGRP_PROMPT_GIVEVEHTOCLAN = 3;
const AGRP_PROMPT_GIVEBIZTOCLAN = 4;
const AGRP_PROMPT_GIVEHOUSETOCLAN = 5;
const AGRP_PROMPT_BUYBIZ = 6;
const AGRP_PROMPT_BUYHOUSE = 7;
const AGRP_PROMPT_RESETKEYBINDS = 8;
// ===========================================================================
function initGUIScript() {
logToConsole(LOG_INFO, "[VRR.GUI]: Initializing GUI script ...");
logToConsole(LOG_INFO, "[VRR.GUI]: GUI script initialized successfully!");
logToConsole(LOG_INFO, "[AGRP.GUI]: Initializing GUI script ...");
logToConsole(LOG_INFO, "[AGRP.GUI]: GUI script initialized successfully!");
}
// ===========================================================================
function playerPromptAnswerNo(client) {
if (getPlayerData(client).promptType == AGRP_PROMPT_NONE) {
return false;
}
logToConsole(LOG_DEBUG, `[VRR.GUI] ${getPlayerDisplayForConsole(client)} answered NO to their prompt (${getPlayerData(client).promptType})`);
switch (getPlayerData(client).promptType) {
case AGRP_PROMPT_CREATEFIRSTCHAR:
logToConsole(LOG_DEBUG, `${getPlayerDisplayForConsole(client)} chose not to create a first character. Kicking them from the server ...`);
showPlayerErrorGUI(client, "You don't have a character to play. Goodbye!", "No Characters");
getPlayerData(targetClient).customDisconnectReason = `Kicked - Didn't create a character`;
setTimeout(function () { disconnectPlayer(client); }, 5000);
break;
case AGRP_PROMPT_BIZORDER:
if (getPlayerData(client).businessOrderAmount > 0) {
if (canPlayerUseGUI(client)) {
showPlayerErrorGUI(client, "You canceled the order.", "Business Order Canceled");
} else {
logToConsole(LOG_DEBUG, `${getPlayerDisplayForConsole(client)} canceled the order of ${getPlayerData(client).businessOrderAmount} ${getPlayerData(client).businessOrderItem} at ${getPlayerData(client).businessOrderCost / getPlayerData(client).businessOrderAmount} each for business ${getBusinessData(getPlayerData(client).businessOrderBusiness)}`);
messagePlayerError(client, "You canceled the order!");
}
} else {
showPlayerErrorGUI(client, "You aren't ordering anything for a business!", "Business Order Canceled");
}
break;
default:
break;
}
getPlayerData(client).promptType = AGRP_PROMPT_NONE;
}
// ===========================================================================
function playerPromptAnswerYes(client) {
if (getPlayerData(client).promptType == AGRP_PROMPT_NONE) {
return false;
}
logToConsole(LOG_DEBUG, `[VRR.GUI] ${getPlayerDisplayForConsole(client)} answered YES to their prompt (${getPlayerData(client).promptType})`);
switch (getPlayerData(client).promptType) {
case AGRP_PROMPT_CREATEFIRSTCHAR: {
showPlayerNewCharacterGUI(client);
break;
}
case AGRP_PROMPT_BIZORDER: {
if (getPlayerData(client).businessOrderAmount > 0) {
if (getBusinessData(getPlayerData(client).businessOrderBusiness).till < getPlayerData(client).businessOrderCost) {
logToConsole(LOG_DEBUG, `[VRR.GUI] ${getPlayerDisplayForConsole(client)} failed to order ${getPlayerData(client).businessOrderAmount} ${getItemTypeData(getPlayerData(client).businessOrderItem).name} at ${getPlayerData(client).businessOrderCost / getPlayerData(client).businessOrderAmount} each for business ${getBusinessData(getPlayerData(client).businessOrderBusiness).name} (Reason: Not enough money in business till)`);
showPlayerErrorGUI(client, "This business doesn't have enough money! Deposit some using /bizdeposit", "Business Order Canceled");
getPlayerData(client).businessOrderAmount = 0;
getPlayerData(client).businessOrderBusiness = false;
getPlayerData(client).businessOrderItem = -1;
getPlayerData(client).businessOrderValue = -1;
} else {
logToConsole(LOG_DEBUG, `[VRR.GUI] ${getPlayerDisplayForConsole(client)} successfully ordered ${getPlayerData(client).businessOrderAmount} ${getItemTypeData(getPlayerData(client).businessOrderItem).name} at ${getPlayerData(client).businessOrderCost / getPlayerData(client).businessOrderAmount} each for business ${getBusinessData(getPlayerData(client).businessOrderBusiness).name}`);
showPlayerInfoGUI(client, `You ordered ${getPlayerData(client).businessOrderAmount} ${getItemTypeData(getPlayerData(client).businessOrderItem).name} (${getItemValueDisplay(getPlayerData(client).businessOrderItem, getPlayerData(client).businessOrderValue)}) for ${getPlayerData(client).businessOrderCost}!`, "Business Order Successful");
createItem(getPlayerData(client).businessOrderItem, getPlayerData(client).businessOrderValue, AGRP_ITEM_OWNER_BIZFLOOR, getBusinessData(getPlayerData(client).businessOrderBusiness).databaseId, getPlayerData(client).businessOrderAmount);
cacheBusinessItems(getPlayerData(client).businessOrderBusiness);
getBusinessData(getPlayerData(client).businessOrderBusiness).till -= getPlayerData(client).businessOrderCost;
updateBusinessPickupLabelData(getPlayerData(client).businessOrderBusiness);
getPlayerData(client).businessOrderAmount = 0;
getPlayerData(client).businessOrderBusiness = false;
getPlayerData(client).businessOrderItem = -1;
getPlayerData(client).businessOrderValue = -1;
}
} else {
showPlayerErrorGUI(client, ``, `Business Order Canceled`);
}
break;
}
case AGRP_PROMPT_GIVEVEHTOCLAN: {
if (!isPlayerInAnyVehicle(client)) {
messagePlayerError(client, getLocaleString(client, "MustBeInVehicle"));
return false;
}
if (!getVehicleData(getPlayerVehicle(client))) {
messagePlayerError(client, getLocaleString(client, "RandomVehicleCommandsDisabled"));
return false;
}
if (getVehicleData(getPlayerVehicle(client)).ownerType != AGRP_VEHOWNER_PLAYER) {
messagePlayerError(client, getLocaleString(client, "MustOwnVehicle"));
return false;
}
if (getVehicleData(getPlayerVehicle(client)).ownerId != getPlayerCurrentSubAccount(client).databaseId) {
messagePlayerError(client, getLocaleString(client, "MustOwnVehicle"));
return false;
}
getVehicleData(getPlayerVehicle(client)).ownerType = AGRP_VEHOWNER_CLAN;
getVehicleData(getPlayerVehicle(client)).ownerId = getPlayerCurrentSubAccount(client).clan;
messagePlayerSuccess(client, getLocaleString(client, "GaveVehicleToClan", getVehicleName(getPlayerVehicle(client))));
//messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} {MAINCOLOUR}set their {vehiclePurple}${getVehicleName(vehicle)} {MAINCOLOUR}owner to the {clanOrange}${getClanData(clanId).name} {MAINCOLOUR}clan`);
break;
}
case AGRP_PROMPT_GIVEHOUSETOCLAN: {
let houseId = getPlayerHouse(client);
if (!houseId) {
messagePlayerError(client, getLocaleString(client, "InvalidHouse"));
return false;
}
if (getHouseData(houseId).ownerType != AGRP_VEHOWNER_PLAYER) {
messagePlayerError(client, getLocaleString(client, "MustOwnHouse"));
return false;
}
if (getHouseData(houseId).ownerId != getPlayerCurrentSubAccount(client).databaseId) {
messagePlayerError(client, getLocaleString(client, "MustOwnHouse"));
return false;
}
getHouseData(houseId).ownerType = AGRP_HOUSE_OWNER_CLAN;
getHouseData(houseId).ownerId = getPlayerCurrentSubAccount(client).clan;
messagePlayerSuccess(client, getLocaleString(client, "GaveHouseToClan"));
//messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} {MAINCOLOUR}set their {vehiclePurple}${getVehicleName(vehicle)} {MAINCOLOUR}owner to the {clanOrange}${getClanData(clanId).name} {MAINCOLOUR}clan`);
break;
}
case AGRP_PROMPT_GIVEBIZTOCLAN: {
let businessId = getPlayerBusiness(client);
if (!businessId) {
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
if (getBusinessData(businessId).ownerType != AGRP_VEHOWNER_PLAYER) {
messagePlayerError(client, getLocaleString(client, "MustOwnBusiness"));
return false;
}
if (getBusinessData(businessId).ownerId != getPlayerCurrentSubAccount(client).databaseId) {
messagePlayerError(client, getLocaleString(client, "MustOwnBusiness"));
return false;
}
getBusinessData(businessId).ownerType = AGRP_BIZ_OWNER_CLAN;
getBusinessData(businessId).ownerId = getPlayerCurrentSubAccount(client).clan;
messagePlayerSuccess(client, getLocaleString(client, "GaveBusinessToClan"));
//messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} {MAINCOLOUR}set their {vehiclePurple}${getVehicleName(vehicle)} {MAINCOLOUR}owner to the {clanOrange}${getClanData(clanId).name} {MAINCOLOUR}clan`);
break;
}
case AGRP_PROMPT_BUYHOUSE: {
let houseId = getPlayerHouse(client);
if (!houseId) {
messagePlayerError(client, getLocaleString(client, "InvalidHouse"));
return false;
}
if (getHouseData(houseId).buyPrice <= 0) {
messagePlayerError(client, getLocaleString(client, "HouseNotForSale"));
return false;
}
if (getPlayerCurrentSubAccount(client).cash < getHouseData(houseId).buyPrice) {
messagePlayerError(client, getLocaleString(client, "HousePurchaseNotEnoughMoney"));
return false;
}
getHouseData(houseId).ownerType = AGRP_HOUSE_OWNER_PLAYER;
getHouseData(houseId).ownerId = getPlayerCurrentSubAccount(client).databaseId;
getHouseData(houseId).buyPrice = 0;
getHouseData(houseId).needsSaved = true;
updateHousePickupLabelData(houseId);
messageDiscordEventChannel(`🏘️ ${getCharacterFullName(client)} is now the owner of *${getHouseData(houseId).description}*!`);
messagePlayerSuccess(client, `🏘️ You are now the owner of {houseGreen}${getHouseData(houseId).description}`);
break;
}
case AGRP_PROMPT_BUYBIZ: {
let businessId = getPlayerBusiness(client);
if (!businessId) {
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
if (getBusinessData(businessId).buyPrice <= 0) {
messagePlayerError(client, getLocaleString(client, "BusinessNotForSale"));
return false;
}
if (getPlayerCurrentSubAccount(client).cash < getBusinessData(businessId).buyPrice) {
messagePlayerError(client, getLocaleString(client, "BusinessPurchaseNotEnoughMoney"));
return false;
}
getBusinessData(businessId).ownerType = AGRP_BIZ_OWNER_PLAYER;
getBusinessData(businessId).ownerId = getPlayerCurrentSubAccount(client).databaseId;
getBusinessData(businessId).buyPrice = 0;
getBusinessData(businessId).needsSaved = true;
updateBusinessPickupLabelData(businessId);
messageDiscordEventChannel(`🏢 ${getCharacterFullName(client)} is now the owner of *${getBusinessData(businessId).name}*!`);
messagePlayerSuccess(client, `🏢 You are now the owner of {businessBlue}${getBusinessData(businessId).name}`);
break;
}
case AGRP_PROMPT_RESETKEYBINDS: {
break;
}
case AGRP_PROMPT_COPYKEYBINDSTOSERVER: {
break;
}
default: {
submitBugReport(client, `[AUTOMATED REPORT] Unknown prompt type: ${getPlayerData(client).promptType}`);
break;
}
}
getPlayerData(client).promptType = AGRP_PROMPT_NONE;
}
// ===========================================================================
function canPlayerUseGUI(client) {
function doesPlayerUseGUI(client) {
return (doesServerHaveGUIEnabled() && doesPlayerHaveGUIEnabled(client));
}
// ===========================================================================
function playerPromptAnswerYesCommand(command, params, client) {
playerPromptAnswerYes(client);
}
// ===========================================================================
function playerPromptAnswerNoCommand(command, params, client) {
playerPromptAnswerNo(client);
}
// ===========================================================================
function playerToggledGUI(client) {
toggleAccountGUICommand("gui", "", client);
}
// ===========================================================================
function showPlayerTwoFactorAuthenticationGUI(client) {
sendNetworkEventToPlayer("agrp.2fa", client);
}
// ===========================================================================

View File

@@ -9,8 +9,8 @@
// ===========================================================================
function initHelpScript() {
logToConsole(LOG_INFO, `[VRR.Help]: Initializing help script ...`);
logToConsole(LOG_INFO, `[VRR.Help]: Help script initialized successfully!`);
logToConsole(LOG_INFO, `[AGRP.Help]: Initializing help script ...`);
logToConsole(LOG_INFO, `[AGRP.Help]: Help script initialized successfully!`);
}
// ===========================================================================
@@ -204,9 +204,9 @@ function showAccountHelpMessage(client) {
function showVehicleHelpMessage(client) {
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderVehicleHelp")));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "VehicleHelp", 0, `{ALTCOLOUR}/info dealership{MAINCOLOUR}`));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "VehicleHelp", 1, `{ALTCOLOUR}/lock, /engine, /lights, /trunk, /rentveh, /buyveh, /rentprice, /buyprice{MAINCOLOUR}`));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "VehicleHelp", 2));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "VehicleHelp", 0));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "VehicleHelp", 1, `{ALTCOLOUR}/info dealership{MAINCOLOUR}`));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "VehicleHelp", 2, `{ALTCOLOUR}/lock, /engine, /lights, /trunk, /rentveh, /buyveh, /rentprice, /buyprice{MAINCOLOUR}`));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "VehicleHelp", 3, `{ALTCOLOUR}/info mechanic{MAINCOLOUR}`));
}
@@ -216,8 +216,8 @@ function showVehicleDealershipHelpMessage(client) {
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderVehicleDealershipHelp")));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "VehicleDealershipHelp", 0, `{ALTCOLOUR}/gps{MAINCOLOUR}`));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "VehicleDealershipHelp", 1));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "VehicleDealershipHelp", 1, `{ALTCOLOUR}/buyveh{MAINCOLOUR}`));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "VehicleDealershipHelp", 2));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "VehicleDealershipHelp", 2, `{ALTCOLOUR}/buyveh{MAINCOLOUR}`));
messagePlayerHelpContent(client, getGroupedLocaleString(client, "VehicleDealershipHelp", 3));
}
// ===========================================================================
@@ -348,22 +348,23 @@ function showCommandHelpMessage(client, commandName) {
commandName = commandName.slice(1);
}
let command = getCommandData(commandName);
let aliases = getCommandAliasesNames(command);
let commandData = getCommandData(commandName);
let aliases = getCommandAliasesNames(commandData);
messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderCommandInfo", commandName)));
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Description: ${command.helpDescription}`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Description: ${commandData.helpDescription}`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Usage: /${commandData.command} ${commandData.syntaxString}`);
if (aliases.length > 0) {
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Aliases: ${aliases.join(", ")}`);
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Aliases: ${aliases.map(alias => `/${alias.command}`).join(", ")}`);
} else {
messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Aliases: (None)`);
}
//messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Usable on Discord: ${getYesNoFromBool(command.allowOnDiscord)}`);
//messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Usable on Discord: ${getYesNoFromBool(commandData.allowOnDiscord)}`);
//if(doesPlayerHaveStaffPermission(client, getStaffFlagValue("BasicModeration"))) {
// messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Usable on Discord: ${getYesNoFromBool(command.allowOnDiscord)}`);
// messagePlayerNormal(client, `{clanOrange}• {MAINCOLOUR}Usable on Discord: ${getYesNoFromBool(commandData.allowOnDiscord)}`);
//}
}
@@ -398,4 +399,24 @@ function helpGetSkinCommand(command, params, client) {
messagePlayerAlert(client, ``);
}
// ===========================================================================
function hasPlayerSeenActionTip(client, seenActionTipFlagName) {
let seenActionTipFlagValue = getSeenActionTipsValue(seenActionTipFlagName);
if (hasBitFlag(getPlayerData(client).accountData.seenActionTips, seenActionTipFlagValue)) {
return true;
}
return false;
}
// ===========================================================================
function markPlayerActionTipSeen(client, seenActionTipFlagName) {
let seenActionTipFlagValue = getSeenActionTipsValue(seenActionTipFlagName);
getPlayerData(client).accountData.seenActionTips = addBitFlag(getPlayerData(client).accountData.seenActionTips, seenActionTipFlagValue);
}
// ===========================================================================

View File

@@ -42,6 +42,7 @@ class HouseData {
this.index = -1;
this.needsSaved = false;
this.interiorLights = true;
this.propertyType = AGRP_PROPERTY_TYPE_HOUSE;
this.itemCache = [];
this.locations = [];
@@ -55,6 +56,7 @@ class HouseData {
this.entranceBlipModel = -1;
this.entrancePickup = null;
this.entranceBlip = null;
this.entranceScene = "";
this.exitPosition = false;
this.exitRotation = 0.0;
@@ -64,6 +66,7 @@ class HouseData {
this.exitBlipModel = -1;
this.exitPickup = null;
this.exitBlip = null;
this.exitScene = "";
this.streamingRadioStation = 0;
this.streamingRadioStationIndex = -1;
@@ -86,6 +89,7 @@ class HouseData {
this.entranceDimension = toInteger(dbAssoc["house_entrance_vw"]);
this.entrancePickupModel = toInteger(dbAssoc["house_entrance_pickup"]);
this.entranceBlipModel = toInteger(dbAssoc["house_entrance_blip"]);
this.entranceScene = toString(dbAssoc["house_entrance_scene"]);
this.exitPosition = toVector3(toFloat(dbAssoc["house_exit_pos_x"]), toFloat(dbAssoc["house_exit_pos_y"]), toFloat(dbAssoc["house_exit_pos_z"]));
this.exitRotation = toFloat(dbAssoc["house_exit_rot_z"]);
@@ -93,6 +97,7 @@ class HouseData {
this.exitDimension = toInteger(dbAssoc["house_exit_vw"]);
this.exitPickupModel = toInteger(dbAssoc["house_exit_pickup"]);
this.exitBlipModel = toInteger(dbAssoc["house_exit_blip"]);
this.exitScene = toString(dbAssoc["house_exit_scene"]);
}
}
};
@@ -163,15 +168,15 @@ class HouseGameScriptData {
// ===========================================================================
function initHouseScript() {
logToConsole(LOG_INFO, "[VRR.House]: Initializing house script ...");
logToConsole(LOG_INFO, "[VRR.House]: House script initialized successfully!");
logToConsole(LOG_INFO, "[AGRP.House]: Initializing house script ...");
logToConsole(LOG_INFO, "[AGRP.House]: House script initialized successfully!");
return true;
}
// ===========================================================================
function loadHousesFromDatabase() {
logToConsole(LOG_INFO, "[VRR.House]: Loading houses from database ...");
logToConsole(LOG_INFO, "[AGRP.House]: Loading houses from database ...");
let tempHouses = [];
let dbConnection = connectToDatabase();
let dbAssoc;
@@ -183,14 +188,14 @@ function loadHousesFromDatabase() {
while (dbAssoc = fetchQueryAssoc(dbQuery)) {
let tempHouseData = new HouseData(dbAssoc);
tempHouses.push(tempHouseData);
logToConsole(LOG_VERBOSE, `[VRR.House]: House '${tempHouseData.description}' (ID ${tempHouseData.databaseId}) loaded!`);
logToConsole(LOG_VERBOSE, `[AGRP.House]: House '${tempHouseData.description}' (ID ${tempHouseData.databaseId}) loaded!`);
}
}
freeDatabaseQuery(dbQuery);
}
disconnectFromDatabase(dbConnection);
}
logToConsole(LOG_INFO, `[VRR.House]: ${tempHouses.length} houses loaded from database successfully!`);
logToConsole(LOG_INFO, `[AGRP.House]: ${tempHouses.length} houses loaded from database successfully!`);
return tempHouses;
}
@@ -211,8 +216,8 @@ function createHouseCommand(command, params, client) {
return false;
}
createHouse(params, getPlayerPosition(client), toVector3(0.0, 0.0, 0.0), getGameConfig().pickupModels[getGame()].House, -1, getPlayerInterior(client), getPlayerDimension(client), getPlayerData(client).interiorCutscene);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} created house: {houseGreen}${params}`);
createHouse(params, getPlayerPosition(client), toVector3(0.0, 0.0, 0.0), getGameConfig().pickupModels[getGame()].House, -1, getPlayerInterior(client), getPlayerDimension(client), getPlayerData(client).interiorScene);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} created house: {houseGreen}${params}`, true);
}
// ===========================================================================
@@ -270,7 +275,7 @@ function setHouseDescriptionCommand(command, params, client) {
getHouseData(houseId).needsSaved = true;
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} renamed house {houseGreen}${oldDescription}{MAINCOLOUR} to {houseGreen}${getHouseData(houseId).description}`);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} renamed house {houseGreen}${oldDescription}{MAINCOLOUR} to {houseGreen}${getHouseData(houseId).description}`, true);
}
// ===========================================================================
@@ -305,11 +310,12 @@ function setHouseOwnerCommand(command, params, client) {
}
}
getHouseData(houseId).needsSaved = true;
getHouseData(houseId).ownerType = AGRP_HOUSE_OWNER_PLAYER;
getHouseData(houseId).ownerId = getPlayerCurrentSubAccount(newHouseOwner).databaseId;
messagePlayerSuccess(`{MAINCOLOUR}You gave house {houseGreen}${getHouseData(houseId).description}{MAINCOLOUR} to {ALTCOLOUR}${newHouseOwner.name}`);
getHouseData(houseId).needsSaved = true;
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} gave house {houseGreen}${getHouseData(houseId).description}{MAINCOLOUR} to {ALTCOLOUR}${getCharacterFullName(newHouseOwner)}`);
}
/**
@@ -340,7 +346,7 @@ function removeHouseOwnerCommand(command, params, client) {
getHouseData(houseId).ownerId = -1;
getHouseData(houseId).needsSaved = true;
messagePlayerSuccess(client, `{MAINCOLOUR}You removed house {houseGreen}${getHouseData(houseId).description}'s{MAINCOLOUR} owner`);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} removed house {houseGreen}${getHouseData(houseId).description}'s{MAINCOLOUR} owner`);
}
// ===========================================================================
@@ -380,7 +386,7 @@ function setHouseClanCommand(command, params, client) {
}
showPlayerPrompt(client, getLocaleString(client, "SetHouseClanConfirmMessage"), getLocaleString(client, "SetHouseClanConfirmTitle"), getLocaleString(client, "Yes"), getLocaleString(client, "No"));
getPlayerData(client).promptType = AGRP_PROMPT_HOUSEGIVETOCLAN;
getPlayerData(client).promptType = AGRP_PROMPT_GIVEHOUSETOCLAN;
//messagePlayerSuccess(`{MAINCOLOUR}You gave house {houseGreen}${getHouseData(houseId).description}{MAINCOLOUR} to the {clanOrange}${getClanData(clanId).name} {MAINCOLOUR}clan!`);
}
@@ -463,7 +469,7 @@ function setHousePickupCommand(command, params, client) {
getHouseData(houseId).needsSaved = true;
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} set house {houseGreen}${getHouseData(houseId).description}{MAINCOLOUR} pickup display to {ALTCOLOUR}${toLowerCase(typeParam)}`);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} set house {houseGreen}${getHouseData(houseId).description}{MAINCOLOUR} pickup to {ALTCOLOUR}${toLowerCase(typeParam)}`, true);
}
// ===========================================================================
@@ -499,7 +505,7 @@ function setHouseInteriorTypeCommand(command, params, client) {
tempHouseLocation.exitInterior = -1;
getHouseData(houseId).exitPickupModel = -1;
getHouseData(houseId).hasInterior = false;
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} removed house {houseGreen}${getHouseData(houseId).description}{MAINCOLOUR} interior`);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} removed house {houseGreen}${getHouseData(houseId).description}{MAINCOLOUR} interior`, true);
return false;
}
@@ -529,7 +535,7 @@ function setHouseInteriorTypeCommand(command, params, client) {
getHouseData(houseId).needsSaved = true;
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} set house {houseGreen}${getHouseData(houseId).description}{MAINCOLOUR} interior type to {ALTCOLOUR}${toLowerCase(typeParam)}`);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} set house {houseGreen}${getHouseData(houseId).description}{MAINCOLOUR} interior type to {ALTCOLOUR}${typeParam}`, true);
}
// ===========================================================================
@@ -580,7 +586,7 @@ function setHouseBlipCommand(command, params, client) {
resetHouseBlips(houseId);
getHouseData(houseId).needsSaved = true;
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} set house {houseGreen}${getHouseData(houseId).description}{MAINCOLOUR} blip display to {ALTCOLOUR}${toLowerCase(typeParam)}`);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} set house {houseGreen}${getHouseData(houseId).description}{MAINCOLOUR} blip to {ALTCOLOUR}${toLowerCase(typeParam)}`, true);
}
// ===========================================================================
@@ -616,7 +622,7 @@ function moveHouseEntranceCommand(command, params, client) {
getHouseData(houseId).needsSaved = true;
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} moved house {houseGreen}${getHouseData(houseId).description}{MAINCOLOUR} entrance to their position`);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} moved house {houseGreen}${getHouseData(houseId).description}{MAINCOLOUR} entrance to their position`, true);
}
// ===========================================================================
@@ -656,7 +662,7 @@ function moveHouseExitCommand(command, params, client) {
getHouseData(houseId).needsSaved = true;
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} moved house {houseGreen}${getHouseData(houseId).description}{MAINCOLOUR} exit to their position`);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} moved house {houseGreen}${getHouseData(houseId).description}{MAINCOLOUR} exit to their position`, true);
}
// ===========================================================================
@@ -692,8 +698,13 @@ function deleteHouseCommand(command, params, client) {
* @return {bool} Whether or not the house was successfully deleted
*
*/
function deleteHouse(houseId, whoDeleted = 0) {
let tempHouseData = getServerData().houses[houseId];
function deleteHouse(houseIndex, whoDeleted = 0) {
if (!getHouseData(houseIndex)) {
messagePlayerError(client, getLocaleString(client, "InvalidHouse"));
return false;
}
let tempHouseData = getServerData().houses[houseIndex];
let dbConnection = connectToDatabase();
let dbQuery = null;
@@ -706,15 +717,15 @@ function deleteHouse(houseId, whoDeleted = 0) {
disconnectFromDatabase(dbConnection);
}
deleteHouseEntrancePickup(houseId);
deleteHouseExitPickup(houseId);
deleteHouseEntrancePickup(houseIndex);
deleteHouseExitPickup(houseIndex);
deleteHouseEntranceBlip(houseId);
deleteHouseExitBlip(houseId);
deleteHouseEntranceBlip(houseIndex);
deleteHouseExitBlip(houseIndex);
removePlayersFromHouse(houseId);
removePlayersFromHouse(houseIndex);
getServerData().houses.splice(houseId, 1);
getServerData().houses.splice(houseIndex, 1);
}
// ===========================================================================
@@ -739,11 +750,13 @@ function removePlayerFromHouse(client) {
* @return {Boolean} Whether or not the players were forced to exit
*
*/
function removePlayersFromHouse(houseId) {
function removePlayersFromHouse(houseIndex) {
getClients().forEach(function (client) {
if (doesHouseHaveInterior(houseId)) {
if (getPlayerHouse(client) == houseId) {
exitHouse(client);
if (doesHouseHaveInterior(houseIndex)) {
if (getPlayerHouse(client) == houseIndex) {
if (getPlayerInterior(client) == getHouseData(houseIndex).exitInterior && getPlayerDimension(client) == getHouseData(houseIndex).exitDimension) {
exitHouse(client);
}
}
}
});
@@ -761,7 +774,7 @@ function removePlayersFromHouse(houseId) {
* @return {bool} Whether or not the player was successfully removed from the house
*
*/
function createHouse(description, entrancePosition, exitPosition, entrancePickupModel = -1, entranceBlipModel = -1, entranceInterior = 0, entranceDimension = 0, entranceCutscene = -1) {
function createHouse(description, entrancePosition, exitPosition, entrancePickupModel = -1, entranceBlipModel = -1, entranceInterior = 0, entranceDimension = 0, entranceScene = -1) {
let tempHouseData = new HouseData(false);
tempHouseData.description = description;
@@ -771,7 +784,7 @@ function createHouse(description, entrancePosition, exitPosition, entrancePickup
tempHouseData.entranceBlipModel = entranceBlipModel;
tempHouseData.entranceInterior = entranceInterior;
tempHouseData.entranceDimension = entranceDimension;
tempHouseData.entranceCutscene = entranceCutscene;
tempHouseData.entranceScene = entranceScene;
tempHouseData.exitPosition = exitPosition;
tempHouseData.exitRotation = 0.0;
@@ -779,7 +792,7 @@ function createHouse(description, entrancePosition, exitPosition, entrancePickup
tempHouseData.exitBlipModel = -1;
tempHouseData.exitInterior = 0;
tempHouseData.exitDimension = 0;
tempHouseData.exitCutscene = -1;
tempHouseData.exitScene = -1;
tempHouseData.needsSaved = true;
@@ -867,9 +880,9 @@ function getPlayerHouse(client) {
// ===========================================================================
function saveAllHousesToDatabase() {
logToConsole(LOG_DEBUG, `[VRR.House]: Saving all server houses to database ...`);
logToConsole(LOG_DEBUG, `[AGRP.House]: Saving all server houses to database ...`);
if (getServerConfig().devServer) {
logToConsole(LOG_DEBUG | LOG_WARN, `[VRR.House]: Aborting save all houses to database, dev server is enabled.`);
logToConsole(LOG_DEBUG | LOG_WARN, `[AGRP.House]: Aborting save all houses to database, dev server is enabled.`);
return false;
}
@@ -878,7 +891,7 @@ function saveAllHousesToDatabase() {
saveHouseToDatabase(i);
}
}
logToConsole(LOG_INFO, `[VRR.House]: Saved all server houses to database`);
logToConsole(LOG_INFO, `[AGRP.House]: Saved all server houses to database`);
}
// ===========================================================================
@@ -890,7 +903,7 @@ function saveHouseToDatabase(houseId) {
return false;
}
logToConsole(LOG_VERBOSE, `[VRR.House]: Saving house '${tempHouseData.description}' to database ...`);
logToConsole(LOG_VERBOSE, `[AGRP.House]: Saving house '${tempHouseData.description}' to database ...`);
let dbConnection = connectToDatabase();
if (dbConnection) {
let safeHouseDescription = escapeDatabaseString(dbConnection, tempHouseData.description);
@@ -910,7 +923,7 @@ function saveHouseToDatabase(houseId) {
["house_entrance_vw", tempHouseData.entranceDimension],
["house_entrance_pickup", tempHouseData.entrancePickupModel],
["house_entrance_blip", tempHouseData.entranceBlipModel],
//["house_entrance_cutscene", tempHouseData.entranceCutscene],
["house_entrance_scene", tempHouseData.entranceScene],
["house_exit_pos_x", tempHouseData.exitPosition.x],
["house_exit_pos_y", tempHouseData.exitPosition.y],
["house_exit_pos_z", tempHouseData.exitPosition.z],
@@ -919,13 +932,13 @@ function saveHouseToDatabase(houseId) {
["house_exit_vw", tempHouseData.exitDimension],
["house_exit_pickup", tempHouseData.exitPickupModel],
["house_exit_blip", tempHouseData.exitBlipModel],
//["house_exit_cutscene", tempHouseData.exitCutscene],
["house_exit_scene", tempHouseData.exitScene],
["house_buy_price", tempHouseData.buyPrice],
["house_rent_price", tempHouseData.rentPrice],
["house_has_interior", boolToInt(tempHouseData.hasInterior)],
["house_interior_lights", boolToInt(tempHouseData.interiorLights)],
["house_custom_interior", boolToInt(tempHouseData.customInterior)],
["house_radio_station", boolToInt(tempHouseData.streamingRadioStation)],
["house_radio_station", (getRadioStationData(tempHouseData.streamingRadioStationIndex) != false) ? getRadioStationData(tempHouseData.streamingRadioStationIndex) : -1],
];
let dbQuery = null;
@@ -944,7 +957,7 @@ function saveHouseToDatabase(houseId) {
disconnectFromDatabase(dbConnection);
return true;
}
logToConsole(LOG_VERBOSE, `[VRR.House]: Saved house '${tempHouseData.description}' to database!`);
logToConsole(LOG_VERBOSE, `[AGRP.House]: Saved house '${tempHouseData.description}' to database!`);
return false;
}
@@ -958,7 +971,7 @@ function saveHouseLocationToDatabase(houseId, locationId) {
return false;
}
logToConsole(LOG_VERBOSE, `[VRR.House]: Saving house location ${locationId} for house ${houseId} to database ...`);
logToConsole(LOG_VERBOSE, `[AGRP.House]: Saving house location ${locationId} for house ${houseId} to database ...`);
let dbConnection = connectToDatabase();
if (dbConnection) {
let data = [
@@ -999,7 +1012,7 @@ function saveHouseLocationToDatabase(houseId, locationId) {
disconnectFromDatabase(dbConnection);
return true;
}
logToConsole(LOG_VERBOSE, `[VRR.House]: Saved location ${locationId} for house ${houseId} to database`);
logToConsole(LOG_VERBOSE, `[AGRP.House]: Saved location ${locationId} for house ${houseId} to database`);
return false;
}
@@ -1029,10 +1042,6 @@ function createHouseEntrancePickup(houseId) {
return false;
}
if (!isGameFeatureSupported("pickup")) {
return false;
}
if (!getHouseData(houseId)) {
return false;
}
@@ -1047,14 +1056,20 @@ function createHouseEntrancePickup(houseId) {
return false;
}
let pickupModelId = getGameConfig().pickupModels[getGame()].House;
if (areServerElementsSupported() && getGame() != AGRP_GAME_MAFIA_ONE && getGame() != AGRP_GAME_GTA_IV) {
let entrancePickup = null;
if (isGameFeatureSupported("pickup")) {
let pickupModelId = getGameConfig().pickupModels[getGame()].House;
if (getServerData().houses[houseId].entrancePickupModel != 0) {
pickupModelId = getHouseData(houseId).entrancePickupModel;
}
if (getServerData().houses[houseId].entrancePickupModel != 0) {
pickupModelId = getHouseData(houseId).entrancePickupModel;
}
entrancePickup = createGamePickup(pickupModelId, houseData.entrancePosition, getGameConfig().pickupTypes[getGame()].house);
} else if (isGameFeatureSupported("dummyElement")) {
entrancePickup = createGameDummyElement(houseData.exitPosition);
}
if (areServerElementsSupported()) {
let entrancePickup = createGamePickup(pickupModelId, getHouseData(houseId).entrancePosition, getGameConfig().pickupTypes[getGame()].house);
if (entrancePickup != null) {
setElementOnAllDimensions(entrancePickup, false);
setElementDimension(entrancePickup, getHouseData(houseId).entranceDimension);
@@ -1065,13 +1080,6 @@ function createHouseEntrancePickup(houseId) {
getHouseData(houseId).entrancePickup = entrancePickup;
updateHousePickupLabelData(houseId);
}
} else {
let pickupModelId = getGameConfig().pickupModels[getGame()].House;
if (houseData.entrancePickupModel != 0) {
pickupModelId = houseData.entrancePickupModel;
}
sendHouseToPlayer(null, houseId, houseId.description, houseId.entrancePosition, blipModelId, pickupModelId, houseId.hasInterior);
}
}
@@ -1143,10 +1151,6 @@ function createHouseExitPickup(houseId) {
return false;
}
if (!isGameFeatureSupported("pickup")) {
return false;
}
if (!getHouseData(houseId)) {
return false;
}
@@ -1161,13 +1165,19 @@ function createHouseExitPickup(houseId) {
return false;
}
let pickupModelId = getGameConfig().pickupModels[getGame()].Exit;
let exitPickup = null;
if (isGameFeatureSupported("pickup")) {
let pickupModelId = getGameConfig().pickupModels[getGame()].Exit;
if (getServerData().houses[houseId].exitPickupModel != 0) {
pickupModelId = houseData.exitPickupModel;
if (getServerData().houses[houseId].exitPickupModel != 0) {
pickupModelId = houseData.exitPickupModel;
}
exitPickup = createGamePickup(pickupModelId, houseData.exitPosition, getGameConfig().pickupTypes[getGame()].house);
} else if (isGameFeatureSupported("dummyElement")) {
//exitPickup = createGameDummyElement(houseData.exitPosition);
}
let exitPickup = createGamePickup(pickupModelId, houseData.exitPosition, getGameConfig().pickupTypes[getGame()].house);
if (exitPickup != null) {
setElementDimension(exitPickup, houseData.exitDimension);
setElementOnAllDimensions(exitPickup, false);
@@ -1377,7 +1387,7 @@ function setHouseBuyPriceCommand(command, params, client) {
getHouseData(houseId).buyPrice = amount;
getHouseData(houseId).needsSaved = true;
updateHousePickupLabelData(houseId);
messagePlayerSuccess(client, `{MAINCOLOUR}You set house {houseGreen}${getHouseData(houseId).description}'s{MAINCOLOUR} for-sale price to {ALTCOLOUR}$${makeLargeNumberReadable(amount)}`);
messagePlayerSuccess(client, `{MAINCOLOUR}You set house {houseGreen}${getHouseData(houseId).description}'s{MAINCOLOUR} for-sale price to {ALTCOLOUR}${getCurrencyString(amount)}`);
}
// ===========================================================================
@@ -1415,7 +1425,7 @@ function setHouseRentPriceCommand(command, params, client) {
getHouseData(houseId).rentPrice = amount;
getHouseData(houseId).needsSaved = true;
updateHousePickupLabelData(houseId);
messagePlayerSuccess(client, `{MAINCOLOUR}You set house {houseGreen}${getHouseData(houseId).description}'s{MAINCOLOUR} rent price to {ALTCOLOUR}$${makeLargeNumberReadable(amount)}`);
messagePlayerSuccess(client, `{MAINCOLOUR}You set house {houseGreen}${getHouseData(houseId).description}'s{MAINCOLOUR} rent price to {ALTCOLOUR}${getCurrencyString(amount)}`);
}
// ===========================================================================
@@ -1447,8 +1457,8 @@ function buyHouseCommand(command, params, client) {
return false;
}
getPlayerData(client).promptType = AGRP_PROMPT_BUYHOUSE;
showPlayerPrompt(client, getLocaleString(client, "BuyHouseConfirmMessage"), getLocaleString(client, "BuyHouseConfirmTitle"), getLocaleString(client, "Yes"), getLocaleString(client, "No"));
getPlayerData(client).promptType = AGRP_PROMPT_HOUSEBUY;
}
// ===========================================================================
@@ -1771,7 +1781,8 @@ function getHouseFromParams(params) {
// ===========================================================================
function updateHousePickupLabelData(houseId) {
if (!areServerElementsSupported()) {
if (!areServerElementsSupported() || getGame() == AGRP_GAME_MAFIA_ONE || getGame() == AGRP_GAME_GTA_IV) {
sendHouseToPlayer(null, houseId, getHouseData(houseId).description, getHouseData(houseId).entrancePosition, getHouseEntranceBlipModelForNetworkEvent(houseId), getHouseEntrancePickupModelForNetworkEvent(houseId), getHouseData(houseId).buyPrice, getHouseData(houseId).rentPrice, getHouseData(houseId).hasInterior, getHouseData(houseId).locked);
return false;
}
@@ -1783,14 +1794,14 @@ function updateHousePickupLabelData(houseId) {
setEntityData(houseData.entrancePickup, "agrp.label.type", AGRP_LABEL_HOUSE, true);
setEntityData(houseData.entrancePickup, "agrp.label.name", houseData.description, true);
setEntityData(houseData.entrancePickup, "agrp.label.locked", houseData.locked, true);
setEntityData(houseData.entrancePickup, "agrp.label.price", houseData.buyPrice, true);
setEntityData(houseData.entrancePickup, "agrp.label.rentprice", houseData.rentPrice, true);
setEntityData(houseData.entrancePickup, "agrp.label.help", AGRP_PROPLABEL_INFO_ENTER, true);
if (houseData.buyPrice > 0) {
setEntityData(houseData.entrancePickup, "agrp.label.price", houseData.buyPrice, true);
setEntityData(houseData.entrancePickup, "agrp.label.help", AGRP_PROPLABEL_INFO_BUYHOUSE, true);
} else {
if (houseData.rentPrice > 0) {
setEntityData(houseData.entrancePickup, "agrp.label.rentprice", houseData.rentPrice, true);
setEntityData(houseData.entrancePickup, "agrp.label.help", AGRP_PROPLABEL_INFO_RENTHOUSE, true);
}
} else if (houseData.rentPrice > 0) {
setEntityData(houseData.entrancePickup, "agrp.label.help", AGRP_PROPLABEL_INFO_RENTHOUSE, true);
}
}
@@ -1852,4 +1863,34 @@ function isPlayerInAnyHouse(client) {
return false;
}
// ===========================================================================
function getHouseEntranceBlipModelForNetworkEvent(houseIndex) {
let blipModelId = -1;
if (isGameFeatureSupported("blip")) {
blipModelId = getGameConfig().blipSprites[getGame()].House;
if (getHouseData(houseIndex).entranceBlipModel != 0) {
blipModelId = getHouseData(houseIndex).entranceBlipModel;
}
}
return blipModelId;
}
// ===========================================================================
function getHouseEntrancePickupModelForNetworkEvent(houseIndex) {
let pickupModelId = -1;
if (isGameFeatureSupported("pickup")) {
pickupModelId = getGameConfig().pickupModels[getGame()].House;
if (getHouseData(houseIndex).entrancePickupModel != 0) {
pickupModelId = getHouseData(houseIndex).entrancePickupModel;
}
}
return pickupModelId;
}
// ===========================================================================

86
scripts/server/index.js Normal file
View File

@@ -0,0 +1,86 @@
// Shared Scripts
require("shared/const.js");
require("shared/utilities.js");
require("shared/gamedata.js");
// Multiplayer Mod (Wrapped Natives)
require("native/ragemp.js");
// Server Scripts
require("class.js");
require("accent.js");
require("account.js");
require("animation.js");
require("anticheat.js");
require("ban.js");
require("bitflag.js");
require("business.js");
require("chat.js");
require("clan.js");
require("client.js");
require("colour.js");
require("const.js");
require("database.js");
require("developer.js");
require("discord.js");
require("economy.js");
require("email.js");
require("event.js");
require("fishing.js");
require("gui.js");
require("help.js");
require("house.js");
require("item.js");
require("job.js");
require("keybind.js");
require("locale.js");
require("messaging.js");
require("misc.js");
require("npc.js");
require("staff.js");
require("race.js");
require("radio.js");
require("security.js");
require("subaccount.js");
require("timers.js");
require("trigger.js");
require("utilities.js");
require("vehicle.js");
require("config.js");
require("core.js");
require("command.js");
// Server Business Scripts
require("business/bakery.js");
require("business/bar.js");
require("business/burger.js");
require("business/clothing.js");
require("business/club.js");
require("business/fuel.js");
require("business/mechanic.js");
require("business/pizza.js");
require("business/restaurant.js");
require("business/vehicle.js");
require("business/weapon.js");
// Server Job Scripts
require("job/bus.js");
require("job/drug.js");
require("job/fire.js");
require("job/garbage.js");
require("job/medic.js");
require("job/police.js");
require("job/taxi.js");
require("job/weapon.js");
// Server Item Scripts
require("item/food.js");
require("item/drink.js");
require("item/walkie-talkie.js");
require("item/phone.js");
require("item/handcuff.js");
require("item/rope.js");
require("item/tazer.js");
// Startup
require("startup.js");

View File

@@ -281,59 +281,51 @@ let itemRecipes = [
// ===========================================================================
function initItemScript() {
logToConsole(LOG_DEBUG, "[VRR.Item]: Initializing item script ...");
logToConsole(LOG_INFO, "[VRR.Item]: Item script initialized successfully!");
logToConsole(LOG_DEBUG, "[AGRP.Item]: Initializing item script ...");
logToConsole(LOG_INFO, "[AGRP.Item]: Item script initialized successfully!");
return true;
}
// ===========================================================================
function loadItemsFromDatabase() {
logToConsole(LOG_DEBUG, `[VRR.Item]: Loading items from database ...`);
async function loadItemsFromDatabase() {
logToConsole(LOG_DEBUG, `[AGRP.Item]: Loading items from database ...`);
let tempItems = [];
let dbConnection = connectToDatabase();
let dbFetchAssoc;
let dbAssoc;
if (dbConnection) {
let dbQuery = queryDatabase(dbConnection, `SELECT * FROM item_main WHERE item_deleted = 0 AND item_server = ${getServerId()}`);
if (dbQuery) {
if (dbQuery.numRows > 0) {
while (dbFetchAssoc = fetchQueryAssoc(dbQuery)) {
let tempItemData = new ItemData(dbFetchAssoc);
tempItems.push(tempItemData);
logToConsole(LOG_VERBOSE, `[VRR.Item]: Loaded item ${tempItemData.databaseId} (type ${tempItemData.itemType})} from database`);
}
}
freeDatabaseQuery(dbQuery);
let dbQueryString = `SELECT * FROM item_main WHERE item_server = ${getServerId()}`;
dbAssoc = await fetchQueryAssoc(dbConnection, dbQueryString);
for (let i in dbAssoc) {
let tempItemData = new ItemData(dbAssoc[i]);
tempItems.push(tempItemData);
}
disconnectFromDatabase(dbConnection);
}
logToConsole(LOG_DEBUG, `[VRR.Item]: Loaded ${tempItems.length} items from database ...`);
logToConsole(LOG_DEBUG, `[AGRP.Item]: Loaded ${tempItems.length} items from database ...`);
return tempItems;
}
// ===========================================================================
function loadItemTypesFromDatabase() {
logToConsole(LOG_DEBUG, `[VRR.Item]: Loading item types from database ...`);
async function loadItemTypesFromDatabase() {
logToConsole(LOG_DEBUG, `[AGRP.Item]: Loading item types from database ...`);
let tempItemTypes = [];
let dbConnection = connectToDatabase();
let dbFetchAssoc;
let dbAssoc;
if (dbConnection) {
let dbQuery = queryDatabase(dbConnection, `SELECT * FROM item_type WHERE item_type_deleted = 0 AND item_type_enabled = 1 AND item_type_server = ${getServerId()}`);
if (dbQuery) {
if (getQueryNumRows(dbQuery) > 0) {
while (dbFetchAssoc = fetchQueryAssoc(dbQuery)) {
let tempItemTypeData = new ItemTypeData(dbFetchAssoc);
tempItemTypes.push(tempItemTypeData);
logToConsole(LOG_VERBOSE, `[VRR.Item]: Loaded item type ${tempItemTypeData.name} (id ${tempItemTypeData.databaseId}} from database`);
}
}
freeDatabaseQuery(dbQuery);
let dbQueryString = `SELECT * FROM item_type WHERE item_type_enabled = 1 AND item_type_server = ${getServerId()}`;
dbAssoc = await fetchQueryAssoc(dbConnection, dbQueryString);
for (let i in dbAssoc) {
let tempItemTypeData = new ItemTypeData(dbAssoc[i]);
tempItemTypes.push(tempItemTypeData);
}
disconnectFromDatabase(dbConnection);
}
logToConsole(LOG_DEBUG, `[VRR.Item]: Loaded ${tempItemTypes.length} item types from database ...`);
logToConsole(LOG_DEBUG, `[AGRP.Item]: Loaded ${tempItemTypes.length} item types from database ...`);
return tempItemTypes;
}
@@ -381,7 +373,10 @@ function createGroundItemObject(itemId) {
setElementRotation(getItemData(itemId).object, getItemTypeData(getItemData(itemId).itemTypeIndex).dropRotation);
setElementOnAllDimensions(getItemData(itemId).object, false);
setElementDimension(getItemData(itemId).object, getItemData(itemId).dimension);
//setEntityData(getItemData(itemId).object, "agrp.scale", getItemTypeData(getItemData(itemId).itemTypeIndex).dropScale, true);
setElementInterior(getItemData(itemId).object, getItemData(itemId).interior);
setEntityData(getItemData(itemId).object, "agrp.scale", getItemTypeData(getItemData(itemId).itemTypeIndex).dropScale, true);
setEntityData(getItemData(itemId).object, "agrp.collisions", false, true);
forcePlayerToSyncElementProperties(null, getItemData(itemId).object);
addToWorld(getItemData(itemId).object);
}
}
@@ -492,13 +487,13 @@ function useItemCommand(command, params, client) {
let itemId = getPlayerData(client).hotBarItems[hotBarSlot];
if (!getItemData(itemId)) {
messagePlayerError(client, getLocaleString(client, "UseItemBug"));
messagePlayerError(client, getLocaleString(client, "UseItemBugged"));
submitBugReport(client, `(AUTOMATED REPORT) Use Item: Getting item data for item ${itemId} in player hotbar slot ${hotBarSlot} (cache ${getPlayerData(client).hotBarItems[hotBarSlot]}) returned false.`);
return false;
}
if (!getItemTypeData(getItemData(itemId).itemTypeIndex)) {
messagePlayerError(client, getLocaleString(client, "UseItemBug"));
messagePlayerError(client, getLocaleString(client, "UseItemBugged"));
submitBugReport(client, `(AUTOMATED REPORT) Use Item: Getting item type ${getItemData(itemId).itemType} data for item ${itemId}/${getItemData(itemId).databaseId} in player hotbar slot ${hotBarSlot} (cache ${getPlayerData(client).hotBarItems[hotBarSlot]}) returned false.`);
return false;
}
@@ -699,7 +694,7 @@ function dropItemCommand(command, params, client) {
*
*/
function putItemCommand(command, params, client) {
clearPlayerItemActionState(client);
//clearPlayerItemActionState(client);
let hotBarSlot = toInteger(params);
@@ -742,6 +737,8 @@ function putItemCommand(command, params, client) {
return false;
}
clearPlayerItemActionState(client);
if (getItemTypeData(getItemData(itemId).itemTypeIndex).putAnimationIndex != -1 && !isPlayerInAnyVehicle(client)) {
forcePlayerPlayAnimation(client, getItemTypeData(getItemData(itemId).itemTypeIndex).putAnimationIndex, 0.0);
}
@@ -827,7 +824,7 @@ function createItemTypeCommand(command, params, client) {
}
let itemTypeIndex = createItemType(params);
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} created new item {ALTCOLOUR}${params}. {MAINCOLOUR}ID: ${itemTypeIndex}/${getItemTypeData(itemTypeIndex).databaseId}!`);
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} created new item type: {ALTCOLOUR}${params}. {MAINCOLOUR}ID: ${itemTypeIndex}/${getItemTypeData(itemTypeIndex).databaseId}!`, true);
}
// ===========================================================================
@@ -847,6 +844,7 @@ function setItemTypeDropModelCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let itemTypeIndex = getItemTypeFromParams(splitParams.slice(0, -1).join(" "));
let modelIndex = getObjectModelIndexFromParams(splitParams.slice(-1).join(" "));
@@ -857,7 +855,7 @@ function setItemTypeDropModelCommand(command, params, client) {
getItemTypeData(itemTypeIndex).dropModel = modelIndex;
getItemTypeData(itemTypeIndex).needsSaved = true;
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} set item type {ALTCOLOUR}${getItemTypeData(itemTypeIndex).name}'s{MAINCOLOUR} dropped object model index to ${modelIndex}`);
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} set item type {ALTCOLOUR}${getItemTypeData(itemTypeIndex).name}'s{MAINCOLOUR} dropped object model index to ${modelIndex}`, true);
}
// ===========================================================================
@@ -877,6 +875,7 @@ function setItemTypeOrderPriceCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let itemTypeIndex = getItemTypeFromParams(splitParams.slice(0, -1).join(" "));
let orderPrice = splitParams[splitParams.length - 1];
@@ -887,7 +886,7 @@ function setItemTypeOrderPriceCommand(command, params, client) {
getItemTypeData(itemTypeIndex).orderPrice = orderPrice;
getItemTypeData(itemTypeIndex).needsSaved = true;
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} set item type {ALTCOLOUR}${getItemTypeData(itemTypeIndex).name}{MAINCOLOUR} base price to {ALTCOLOUR}$${orderPrice}`);
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} set item type {ALTCOLOUR}${getItemTypeData(itemTypeIndex).name}{MAINCOLOUR} base price to {ALTCOLOUR}${getCurrencyString(orderPrice)}`, true);
}
// ===========================================================================
@@ -907,6 +906,7 @@ function setItemTypeOrderValueCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let itemTypeIndex = getItemTypeFromParams(splitParams.slice(0, -1).join(" "));
let orderValue = splitParams[splitParams.length - 1];
@@ -917,7 +917,7 @@ function setItemTypeOrderValueCommand(command, params, client) {
getItemTypeData(itemTypeIndex).orderValue = orderValue;
getItemTypeData(itemTypeIndex).needsSaved = true;
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} set item type {ALTCOLOUR}${getItemTypeData(itemTypeIndex).name}{MAINCOLOUR} order value to {ALTCOLOUR}${orderValue}`);
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} set item type {ALTCOLOUR}${getItemTypeData(itemTypeIndex).name}{MAINCOLOUR} order value to {ALTCOLOUR}${orderValue}`, true);
}
// ===========================================================================
@@ -937,6 +937,7 @@ function setItemTypeRiskMultiplierCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let itemTypeIndex = getItemTypeFromParams(splitParams.slice(0, -1).join(" "));
let riskMultiplier = splitParams[splitParams.length - 1];
@@ -945,9 +946,9 @@ function setItemTypeRiskMultiplierCommand(command, params, client) {
return false;
}
getItemTypeData(itemTypeIndex).riskMultiplier = riskMultiplier;
getItemTypeData(itemTypeIndex).riskMultiplier = riskMultiplier / 100;
getItemTypeData(itemTypeIndex).needsSaved = true;
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} set item type {ALTCOLOUR}${getItemTypeData(itemTypeIndex).name}{MAINCOLOUR} risk multiplier to {ALTCOLOUR}${riskMultiplier}`);
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} set item type {ALTCOLOUR}${getItemTypeData(itemTypeIndex).name}{MAINCOLOUR} risk multiplier to {ALTCOLOUR}${riskMultiplier}%`, true);
}
// ===========================================================================
@@ -976,7 +977,7 @@ function toggleItemTypeEnabledCommand(command, params, client) {
getItemTypeData(itemTypeIndex).enabled = !getItemTypeData(itemTypeIndex).enabled;
getItemTypeData(itemTypeIndex).needsSaved = true;
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} ${getEnabledDisabledFromBool(getItemTypeData(itemTypeIndex).enabled)} item type {ALTCOLOUR}${getItemTypeData(itemTypeIndex).name}`);
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} ${getEnabledDisabledFromBool(getItemTypeData(itemTypeIndex).enabled)} item type {ALTCOLOUR}${getItemTypeData(itemTypeIndex).name}`, true);
}
// ===========================================================================
@@ -996,6 +997,7 @@ function setItemTypeUseTypeCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let itemTypeIndex = getItemTypeFromParams(splitParams.slice(0, -1).join(" "));
let useType = splitParams[splitParams.length - 1];
@@ -1006,7 +1008,7 @@ function setItemTypeUseTypeCommand(command, params, client) {
getItemTypeData(itemTypeIndex).useType = useType;
getItemTypeData(itemTypeIndex).needsSaved = true;
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} set item type {ALTCOLOUR}${getItemTypeData(itemTypeIndex).name}{MAINCOLOUR} use type to {ALTCOLOUR}${useType}`);
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} set item type {ALTCOLOUR}${getItemTypeData(itemTypeIndex).name}{MAINCOLOUR} use type to {ALTCOLOUR}${useType}`, true);
}
// ===========================================================================
@@ -1026,6 +1028,7 @@ function setItemTypeUseValueCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let itemTypeIndex = getItemTypeFromParams(splitParams.slice(0, -1).join(" "));
let useValue = splitParams[splitParams.length - 1];
@@ -1036,7 +1039,7 @@ function setItemTypeUseValueCommand(command, params, client) {
getItemTypeData(itemTypeIndex).useValue = useValue;
getItemTypeData(itemTypeIndex).needsSaved = true;
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} set item type {ALTCOLOUR}${getItemTypeData(itemTypeIndex).name}{MAINCOLOUR} use value to {ALTCOLOUR}${useValue}`);
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} set item type {ALTCOLOUR}${getItemTypeData(itemTypeIndex).name}{MAINCOLOUR} use value to {ALTCOLOUR}${useValue}`, true);
}
// ===========================================================================
@@ -1056,17 +1059,23 @@ function setItemTypeDropFrontDistanceCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let itemTypeIndex = getItemTypeFromParams(splitParams.slice(0, -1).join(" "));
let dropFrontDistance = splitParams.slice(-1);
let dropFrontDistance = splitParams.slice(-1) || 0.0;
if (!getItemTypeData(itemTypeIndex)) {
messagePlayerError(client, getLocaleString(client, "InvalidItemType"));
return false;
}
if (isNaN(dropFrontDistance)) {
messagePlayerError(client, `The distance must be a number!`);
return false;
}
getItemTypeData(itemTypeIndex).dropFrontDistance = dropFrontDistance;
getItemTypeData(itemTypeIndex).needsSaved = true;
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} set item type {ALTCOLOUR}${getItemTypeData(itemTypeIndex).name}{MAINCOLOUR} drop front distance to {ALTCOLOUR}${dropFrontDistance}`);
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} set item type {ALTCOLOUR}${getItemTypeData(itemTypeIndex).name}{MAINCOLOUR} drop front distance to {ALTCOLOUR}${dropFrontDistance.toFixed(2)}`, true);
}
// ===========================================================================
@@ -1086,6 +1095,7 @@ function setItemTypeDropPositionCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let itemTypeIndex = getItemTypeFromParams(splitParams.slice(0, -3).join(" "));
let x = splitParams.slice(-3, -2) || 0.0;
let y = splitParams.slice(-2, -1) || 0.0;
@@ -1096,11 +1106,16 @@ function setItemTypeDropPositionCommand(command, params, client) {
return false;
}
if (isNaN(x) || isNaN(y) || isNaN(z)) {
messagePlayerError(client, `The positions must be numbers!`);
return false;
}
let dropPosition = toVector3(x, y, z);
getItemTypeData(itemTypeIndex).dropPosition = dropPosition;
getItemTypeData(itemTypeIndex).needsSaved = true;
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} set item type {ALTCOLOUR}${getItemTypeData(itemTypeIndex).name}{MAINCOLOUR} drop position offset to {ALTCOLOUR}${dropPosition.x}, ${dropPosition.y}, ${dropPosition.z}`);
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} set item type {ALTCOLOUR}${getItemTypeData(itemTypeIndex).name}{MAINCOLOUR} drop position offset to {ALTCOLOUR}${dropPosition.x.toFixed(2)}, ${dropPosition.y.toFixed(2)}, ${dropPosition.z.toFixed(2)}`, true);
}
// ===========================================================================
@@ -1120,6 +1135,7 @@ function setItemTypeDropRotationCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let itemTypeIndex = getItemTypeFromParams(splitParams.slice(0, -3).join(" "));
let x = splitParams.slice(-3, -2) || 0.0;
let y = splitParams.slice(-2, -1) || 0.0;
@@ -1130,11 +1146,16 @@ function setItemTypeDropRotationCommand(command, params, client) {
return false;
}
if (isNaN(x) || isNaN(y) || isNaN(z)) {
messagePlayerError(client, `The positions must be numbers!`);
return false;
}
let dropRotation = toVector3(x, y, z);
getItemTypeData(itemTypeIndex).dropRotation = dropRotation;
getItemTypeData(itemTypeIndex).needsSaved = true;
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} set item type {ALTCOLOUR}${getItemTypeData(itemTypeIndex).name}{MAINCOLOUR} drop rotation to {ALTCOLOUR}${dropRotation.x}, ${dropRotation.y}, ${dropRotation.z}`);
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} set item type {ALTCOLOUR}${getItemTypeData(itemTypeIndex).name}{MAINCOLOUR} drop rotation to {ALTCOLOUR}${dropRotation.x.toFixed(2)}, ${dropRotation.y.toFixed(2)}, ${dropRotation.z.toFixed(2)}`, true);
}
// ===========================================================================
@@ -1154,6 +1175,7 @@ function setItemTypeDropScaleCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let itemTypeIndex = getItemTypeFromParams(splitParams.slice(0, -3).join(" "));
let x = splitParams.slice(-3, -2) || 1.0;
let y = splitParams.slice(-2, -1) || 1.0;
@@ -1164,11 +1186,16 @@ function setItemTypeDropScaleCommand(command, params, client) {
return false;
}
if (isNaN(x) || isNaN(y) || isNaN(z)) {
messagePlayerError(client, `The positions must be numbers!`);
return false;
}
let dropScale = toVector3(x, y, z);
getItemTypeData(itemTypeIndex).dropScale = dropScale;
getItemTypeData(itemTypeIndex).needsSaved = true;
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} set item type {ALTCOLOUR}${getItemTypeData(itemTypeIndex).name}{MAINCOLOUR} drop scale to {ALTCOLOUR}${dropScale.x}, ${dropScale.y}, ${dropScale.z}`);
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} set item type {ALTCOLOUR}${getItemTypeData(itemTypeIndex).name}{MAINCOLOUR} drop scale to {ALTCOLOUR}${dropScale.x.toFixed(2)}, ${dropScale.y.toFixed(2)}, ${dropScale.z.toFixed(2)}`, true);
}
// ===========================================================================
@@ -1188,6 +1215,7 @@ function setItemTypeDemandMultiplierCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let itemTypeIndex = getItemTypeFromParams(splitParams.slice(0, -3).join(" "));
let demandMultiplier = splitParams.slice(-1) || 100;
@@ -1196,9 +1224,14 @@ function setItemTypeDemandMultiplierCommand(command, params, client) {
return false;
}
getItemTypeData(itemTypeIndex).demandMultiplier = demandMultiplayer / 100;
if (isNaN(demandMultiplier)) {
messagePlayerError(client, `The demand multiplier must be numbers!`);
return false;
}
getItemTypeData(itemTypeIndex).demandMultiplier = demandMultiplier / 100;
getItemTypeData(itemTypeIndex).needsSaved = true;
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} set item type {ALTCOLOUR}${getItemTypeData(itemTypeIndex).name}{MAINCOLOUR} demand multiplier to {ALTCOLOUR}${demandMultiplier}%`);
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} set item type {ALTCOLOUR}${getItemTypeData(itemTypeIndex).name}{MAINCOLOUR} demand multiplier to {ALTCOLOUR}${demandMultiplier}%`, true);
}
// ===========================================================================
@@ -1218,6 +1251,7 @@ function setItemTypeMaxValueCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let itemTypeIndex = getItemTypeFromParams(splitParams.slice(0, -3).join(" "));
let maxValue = splitParams.slice(-1) || 100;
@@ -1226,9 +1260,14 @@ function setItemTypeMaxValueCommand(command, params, client) {
return false;
}
if (isNaN(maxValue)) {
messagePlayerError(client, `The max value must be numbers!`);
return false;
}
getItemTypeData(itemTypeIndex).maxValue = maxValue;
getItemTypeData(itemTypeIndex).needsSaved = true;
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} set item type {ALTCOLOUR}${getItemTypeData(itemTypeIndex).name}{MAINCOLOUR} max value to {ALTCOLOUR}${maxValue}`);
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} set item type {ALTCOLOUR}${getItemTypeData(itemTypeIndex).name}{MAINCOLOUR} max value to {ALTCOLOUR}${maxValue}`, true);
}
// ===========================================================================
@@ -1248,6 +1287,7 @@ function setItemTypeSizeCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let itemTypeIndex = getItemTypeFromParams(splitParams.slice(0, -3).join(" "));
let size = splitParams.slice(-1) || 100;
@@ -1256,9 +1296,14 @@ function setItemTypeSizeCommand(command, params, client) {
return false;
}
if (isNaN(size)) {
messagePlayerError(client, `The size must be numbers!`);
return false;
}
getItemTypeData(itemTypeIndex).size = size;
getItemTypeData(itemTypeIndex).needsSaved = true;
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} set item type {ALTCOLOUR}${getItemTypeData(itemTypeIndex).name}{MAINCOLOUR} size to {ALTCOLOUR}${size}`);
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} set item type {ALTCOLOUR}${getItemTypeData(itemTypeIndex).name}{MAINCOLOUR} size to {ALTCOLOUR}${size}`, true);
}
// ===========================================================================
@@ -1278,6 +1323,7 @@ function setItemTypeCapacityCommand(command, params, client) {
return false;
}
let splitParams = params.split(" ");
let itemTypeIndex = getItemTypeFromParams(splitParams.slice(0, -3).join(" "));
let capacity = splitParams.slice(-1) || 100;
@@ -1286,9 +1332,14 @@ function setItemTypeCapacityCommand(command, params, client) {
return false;
}
if (isNaN(capacity)) {
messagePlayerError(client, `The capacity must be numbers!`);
return false;
}
getItemTypeData(itemTypeIndex).capacity = capacity;
getItemTypeData(itemTypeIndex).needsSaved = true;
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} set item type {ALTCOLOUR}${getItemTypeData(itemTypeIndex).name}{MAINCOLOUR} capacity to {ALTCOLOUR}${capacity}`);
messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} set item type {ALTCOLOUR}${getItemTypeData(itemTypeIndex).name}{MAINCOLOUR} capacity to {ALTCOLOUR}${capacity}`, true);
}
// ===========================================================================
@@ -1297,7 +1348,7 @@ function playerUseItem(client, hotBarSlot) {
let itemIndex = getPlayerData(client).hotBarItems[hotBarSlot];
if (itemIndex == -1) {
logToConsole(LOG_DEBUG | LOG_WARN, `[VRR.Item] ${getPlayerDisplayForConsole(client)} tried to use an empty hotbar slot ${hotBarSlot}`);
logToConsole(LOG_DEBUG | LOG_WARN, `[AGRP.Item] ${getPlayerDisplayForConsole(client)} tried to use an empty hotbar slot ${hotBarSlot}`);
return false;
}
@@ -1311,7 +1362,9 @@ function playerUseItem(client, hotBarSlot) {
let itemTypeData = getItemTypeData(itemData.itemTypeIndex);
let hotBarItems = getPlayerData(client).hotBarItems;
logToConsole(LOG_DEBUG, `[VRR.Item] ${getPlayerDisplayForConsole(client)} used a ${itemTypeData.name} (use type ${itemTypeData.useType} - ${typeof itemTypeData.useType}) item (ID: ${itemData.index}/${itemData.databaseId}, TypeID: ${itemTypeData.index}/${itemTypeData.databaseId})`);
logToConsole(LOG_DEBUG, `[AGRP.Item] ${getPlayerDisplayForConsole(client)} used a ${itemTypeData.name} (use type ${itemTypeData.useType} - ${typeof itemTypeData.useType}) item (ID: ${itemData.index}/${itemData.databaseId}, TypeID: ${itemTypeData.index}/${itemTypeData.databaseId})`);
markPlayerActionTipSeen(client, "UseItemKeyAfterEquipping");
switch (toInteger(itemTypeData.useType)) {
case AGRP_ITEM_USE_TYPE_SKIN: {
@@ -1335,6 +1388,8 @@ function playerUseItem(client, hotBarSlot) {
itemData.value = itemData.value + ammoItemData.value;
deleteItem(hotBarItems[i]);
meActionToNearbyPlayers(client, `loads some ammo into their ${itemTypeData.name}`);
markPlayerActionTipSeen(client, "AmmoClipItemUsage");
return true;
}
}
@@ -1441,7 +1496,7 @@ function playerUseItem(client, hotBarSlot) {
meActionToNearbyPlayers(client, `takes their key and removes the handcuffs from ${getCharacterFullName(closestPlayer)}`);
} else {
if (!isPlayerSurrendered(closestPlayer)) {
messagePlayerError(client, getLocaleString(client, "PlayerNotSurrenderedHandcuffed", getCharacterFullName(closestPlayer)));
messagePlayerError(client, getLocaleString(client, "PlayerNotSurrenderedHandcuff", getCharacterFullName(closestPlayer)));
return false;
}
@@ -1461,8 +1516,10 @@ function playerUseItem(client, hotBarSlot) {
if (itemData.value <= 0) {
destroyItem(itemIndex);
}
markPlayerActionTipSeen(client, "VehicleRepairItemUsage");
} else {
messagePlayerError(client, getLocaleString(client, "VehicleRepairFailedTooFar"));
messagePlayerError(client, getLocaleString(client, "VehicleFailedTooFar"));
}
break;
}
@@ -1472,6 +1529,9 @@ function playerUseItem(client, hotBarSlot) {
if (getDistance(getPlayerPosition(client), getVehiclePosition(vehicle)) <= getGlobalConfig().vehicleRepairDistance) {
meActionToNearbyPlayers(client, `takes their upgrade kit and adds a ${itemTypeData.name} to the vehicle.`);
addVehicleUpgrade(vehicle, itemTypeData.useId);
markPlayerActionTipSeen(client, "VehiclePartItemUsage");
} else {
messagePlayerError(client, getLocaleString(client, "VehicleTooFar"));
}
break;
}
@@ -1490,13 +1550,17 @@ function playerUseItem(client, hotBarSlot) {
if (getDistance(getPlayerPosition(client), getVehiclePosition(vehicle)) <= getGlobalConfig().vehicleRepairDistance) {
if (itemData.useId == 1) {
meActionToNearbyPlayers(client, `takes their vehicle colour kit and changes the primary colour of the vehicle.`);
vehicle.colour1 = itemData.value;
setVehicleColours(vehicle, getVehicleData(vehicle).colour1, itemData.value);
markPlayerActionTipSeen(client, "VehicleColourItemUsage");
} else {
if (itemTypeData.useId == 1) {
meActionToNearbyPlayers(client, `takes their vehicle colour kit and changes the secondary colour of the vehicle.`);
vehicle.colour2 = itemData.value;
setVehicleColours(vehicle, getVehicleData(vehicle).colour1, itemData.value);
markPlayerActionTipSeen(client, "VehicleColourItemUsage");
}
}
} else {
messagePlayerError(client, getLocaleString(client, "VehicleTooFar"));
}
break;
}
@@ -1519,16 +1583,22 @@ function playerUseItem(client, hotBarSlot) {
//}
}
} else {
if (getDistance(getPlayerPosition(client), getFuelPumpData(fuelPump).position) <= getGlobalConfig().vehicleRepairDistance) {
if (itemData.useId == 1) {
meActionToNearbyPlayers(client, `takes their vehicle colour kit and changes the primary colour of the vehicle.`);
vehicle.colour1 = itemTypeData.value;
} else {
if (itemData.useId == 1) {
meActionToNearbyPlayers(client, `takes their vehicle colour kit and changes the secondary colour of the vehicle.`);
vehicle.colour2 = itemData.value;
if (getDistance(getPlayerPosition(client), getFuelPumpData(fuelPump).position) <= getGlobalConfig().fuelPumpUseDistance) {
if (itemData.amount < 100) {
let amountToFull = 100 - itemData.amount;
let totalCost = getFuelPumpData(fuelPump).pricePerUnit * amountToFull;
if (getPlayerCurrentSubAccount(client).cash >= totalCost) {
meActionToNearbyPlayers(client, `refills their fuel can`);
getItemData(itemIndex).amount = 100;
takePlayerCash(client, totalCost);
} else {
messagePlayerError(client, getLocaleString(client, "NotEnoughCashNeedAmountMore", `{ALTCOLOUR}${getCurrencyString(totalCost - getPlayerCurrentSubAccount(client).cash)}{MAINCOLOUR}`));
}
} else {
messagePlayerError(client, "Your fuel can is already full!");
}
}
}
break;
@@ -1537,6 +1607,12 @@ function playerUseItem(client, hotBarSlot) {
case AGRP_ITEM_USE_TYPE_WALKIETALKIE: {
itemData.enabled = !itemData.enabled;
meActionToNearbyPlayers(client, `turns ${toLowerCase(getOnOffFromBool(itemData.enabled))} their walkie-talkie`);
if (itemData.enabled) {
if (!hasPlayerSeenActionTip(client, "RadioCommandAfterEnablingWalkieTalkie")) {
messagePlayerInfo(client, getGroupedLocaleString(client, "ActionTips", "RadioCommandAfterEnablingWalkieTalkie", `{ALTCOLOUR}/r{MAINCOLOUR}`));
}
}
break;
}
@@ -1829,7 +1905,7 @@ function playerSwitchItem(client, newHotBarSlot) {
}
let currentHotBarSlot = getPlayerData(client).activeHotBarSlot;
logToConsole(LOG_DEBUG, `[VRR.Item] ${getPlayerDisplayForConsole(client)} switched from hotbar slot ${currentHotBarSlot} to ${newHotBarSlot}`);
logToConsole(LOG_DEBUG, `[AGRP.Item] ${getPlayerDisplayForConsole(client)} switched from hotbar slot ${currentHotBarSlot} to ${newHotBarSlot}`);
let currentHotBarItem = -1;
let newHotBarItem = -1;
@@ -1905,6 +1981,44 @@ function playerSwitchItem(client, newHotBarSlot) {
return false;
}
switch (getItemTypeData(getItemData(newHotBarItem).itemTypeIndex).useType) {
case AGRP_ITEM_USE_TYPE_AMMO_CLIP:
if (!hasPlayerSeenActionTip(client, "AmmoClipItemUsage")) {
messagePlayerTip(client, getGroupedLocaleString(client, "AmmoClipItemUsage", getKeyOrCommandForPlayerMessage(client, "use")));
}
break;
case AGRP_ITEM_USE_TYPE_VEHREPAIR:
if (!hasPlayerSeenActionTip(client, "VehicleRepairKitItemUsage")) {
messagePlayerTip(client, getGroupedLocaleString(client, "VehicleRepairKitItemUsage", getKeyOrCommandForPlayerMessage(client, "use")));
}
break;
case AGRP_ITEM_USE_TYPE_VEHCOLOUR:
if (!hasPlayerSeenActionTip(client, "VehicleColourKitItemUsage")) {
messagePlayerTip(client, getGroupedLocaleString(client, "VehicleColourKitItemUsage", getKeyOrCommandForPlayerMessage(client, "use")));
}
break;
case AGRP_ITEM_USE_TYPE_VEHUPGRADE_PART:
if (!hasPlayerSeenActionTip(client, "VehiclePartItemUsage")) {
messagePlayerTip(client, getGroupedLocaleString(client, "VehiclePartItemUsage", getKeyOrCommandForPlayerMessage(client, "use"), getItemTypeData(getItemData(newHotBarItem).itemTypeIndex).name));
}
break;
case AGRP_ITEM_USE_TYPE_WALKIETALKIE:
if (!hasPlayerSeenActionTip(client, "UseItemKeyAfterEquippingWalkieTalkie")) {
messagePlayerInfo(client, getGroupedLocaleString(client, "ActionTips", "UseItemKeyAfterEquippingWalkieTalkie", (doesPlayerHaveKeyBindForCommand(client, "use")) ? `{ALTCOLOUR}U{MAINCOLOUR}` : `{ALTCOLOUR}/use{MAINCOLOUR}`));
}
break;
default:
if (!hasPlayerSeenActionTip(client, "UseItemKeyAfterEquipping")) {
messagePlayerInfo(client, getGroupedLocaleString(client, "ActionTips", "UseItemKeyAfterEquipping", (doesPlayerHaveKeyBindForCommand(client, "use")) ? `{ALTCOLOUR}U{MAINCOLOUR}` : `{ALTCOLOUR}/use{MAINCOLOUR}`));
}
break;
}
getPlayerData(client).activeHotBarSlot = newHotBarSlot;
updatePlayerHotBar(client);
}
@@ -2021,7 +2135,7 @@ function cacheAllGroundItems() {
function createAllGroundItemObjects() {
for (let i in getServerData().groundItemCache) {
createGroundItemObject(i);
createGroundItemObject(getServerData().groundItemCache[i]);
}
}
@@ -2150,6 +2264,20 @@ function deleteItem(itemId, whoDeleted = -1) {
function getBestNewOwnerToPutItem(client) {
let position = getPlayerPosition(client);
let possibleItem = getClosestItemOnGround(position);
if (possibleItem != -1) {
if (getDistance(getItemPosition(possibleItem), position) <= getGlobalConfig().itemContainerDistance) {
return [AGRP_ITEM_OWNER_ITEM, possibleItem];
}
}
let possibleVehicle = getClosestVehicle(position);
if (possibleVehicle != false) {
if (getVehicleData(possibleVehicle) != false && getDistance(getVehicleTrunkPosition(possibleVehicle), position) <= getGlobalConfig().vehicleTrunkDistance) {
return [AGRP_ITEM_OWNER_VEHTRUNK, possibleVehicle];
}
}
let possibleHouse = getPlayerHouse(client);
if (possibleHouse != -1) {
if (getHouseData(possibleHouse) != false) {
@@ -2164,20 +2292,6 @@ function getBestNewOwnerToPutItem(client) {
}
}
let possibleVehicle = getClosestVehicle(position);
if (possibleVehicle != false) {
if (getVehicleData(possibleVehicle) != false && getDistance(getVehicleTrunkPosition(possibleVehicle), position) <= getGlobalConfig().vehicleTrunkDistance) {
return [AGRP_ITEM_OWNER_VEHTRUNK, possibleVehicle];
}
}
let possibleItem = getClosestItemOnGround(position);
if (possibleItem != -1) {
if (getDistance(getItemPosition(possibleItem), position) <= getGlobalConfig().itemContainerDistance) {
return [AGRP_ITEM_OWNER_ITEM, possibleItem];
}
}
return [AGRP_ITEM_OWNER_NONE, 0];
}
@@ -2190,6 +2304,15 @@ function getBestItemToTake(client, slot) {
let ownerType = AGRP_ITEM_OWNER_NONE;
let ownerId = 0;
let possibleItem = getClosestItemOnGround(position);
if (getItemData(possibleItem)) {
if (typeof getItemData(possibleItem).itemCache[slot] != "undefined") {
itemId = getItemData(possibleItem).itemCache[slot]
ownerType = AGRP_ITEM_OWNER_ITEM;
ownerId = possibleItem;
}
}
let possibleHouse = getPlayerHouse(client);
if (getHouseData(possibleHouse)) {
if (typeof getHouseData(possibleHouse).itemCache[slot] != "undefined") {
@@ -2434,7 +2557,7 @@ function saveItemToDatabase(itemId) {
return false;
}
logToConsole(LOG_VERBOSE, `[VRR.Item]: Saving item '${itemData.index}' to database ...`);
logToConsole(LOG_VERBOSE, `[AGRP.Item]: Saving item '${itemData.index}' to database ...`);
let position = getItemPosition(itemId);
@@ -2491,7 +2614,7 @@ function saveItemTypeToDatabase(itemTypeId) {
return false;
}
logToConsole(LOG_VERBOSE, `[VRR.Item]: Saving item type '${itemTypeData.name}' to database ...`);
logToConsole(LOG_VERBOSE, `[AGRP.Item]: Saving item type '${itemTypeData.name}' to database ...`);
let dbConnection = connectToDatabase();
if (dbConnection) {
@@ -2623,7 +2746,7 @@ function getItemTypeIndexFromDatabaseId(databaseId) {
// ===========================================================================
function playerItemActionDelayComplete(client) {
logToConsole(LOG_VERBOSE, `[VRR.Item]: Player ${getPlayerDisplayForConsole(client)} item action delay complete (State: ${getPlayerData(client).itemActionState})`);
logToConsole(LOG_VERBOSE, `[AGRP.Item]: Player ${getPlayerDisplayForConsole(client)} item action delay complete (State: ${getPlayerData(client).itemActionState})`);
switch (getPlayerData(client).itemActionState) {
case AGRP_ITEM_ACTION_USE:
playerUseItem(client, getPlayerData(client).itemActionItem);
@@ -2940,7 +3063,7 @@ function showBusinessFloorInventoryToPlayer(client, businessId) {
if (getBusinessData(businessId).floorItemCache == -1) {
itemDisplay.push(`{MAINCOLOUR}${toInteger(i) + 1}{ALTCOLOUR}(Empty)`);
} else {
itemDisplay.push(`{MAINCOLOUR}${toInteger(i) + 1}: {ALTCOLOUR}${getItemTypeData(getItemData(getBusinessData(businessId).floorItemCache[i]).itemTypeIndex).name} - ${(getPlayerCurrentSubAccount(client).cash > getItemData(getBusinessData(businessId).floorItemCache[i]).buyPrice) ? "{softGreen}" : "{softRed}"}$${getItemData(getBusinessData(businessId).floorItemCache[i]).buyPrice}`);
itemDisplay.push(`{MAINCOLOUR}${toInteger(i) + 1}: {ALTCOLOUR}${getItemTypeData(getItemData(getBusinessData(businessId).floorItemCache[i]).itemTypeIndex).name} - ${(getPlayerCurrentSubAccount(client).cash > getItemData(getBusinessData(businessId).floorItemCache[i]).buyPrice) ? "{softGreen}" : "{softRed}"}${getCurrencyString(getItemData(getBusinessData(businessId).floorItemCache[i]).buyPrice)}`);
}
}
@@ -2959,7 +3082,7 @@ function showBusinessStorageInventoryToPlayer(client, businessId) {
if (getBusinessData(businessId).storageItemCache == -1) {
itemDisplay.push(`{MAINCOLOUR}${toInteger(i) + 1}{ALTCOLOUR}(Empty)`);
} else {
itemDisplay.push(`{MAINCOLOUR}${toInteger(i) + 1}: {ALTCOLOUR}${getItemTypeData(getItemData(getBusinessData(businessId).storageItemCache[i]).itemTypeIndex).name}`);
itemDisplay.push(`{MAINCOLOUR}${toInteger(i) + 1}: {ALTCOLOUR}${getItemTypeData(getItemData(getBusinessData(businessId).storageItemCache[i]).itemTypeIndex).name} ${getItemValueDisplayForItem(getBusinessData(businessId).storageItemCache[i])}`);
}
}
@@ -2977,9 +3100,9 @@ function showItemInventoryToPlayer(client, itemId) {
let itemDisplay = [];
for (let i in getItemData(itemId).itemCache) {
if (getItemData(itemId).itemCache == -1) {
itemDisplay.push(`{MAINCOLOUR}${toInteger(i) + 1}{ALTCOLOUR}(Empty)`);
itemDisplay.push(`{businessBlue}${toInteger(i) + 1}{ALTCOLOUR}(Empty)`);
} else {
itemDisplay.push(`{MAINCOLOUR}${toInteger(i) + 1}: {ALTCOLOUR}${getItemTypeData(getItemData(getItemData(itemId).itemCache[i]).itemTypeIndex).name}`);
itemDisplay.push(`{businessBlue}${toInteger(i) + 1}: {ALTCOLOUR}${getItemTypeData(getItemData(getItemData(itemId).itemCache[i]).itemTypeIndex).name} ${getItemValueDisplayForItem(getItemData(itemId).itemCache[i])}`);
}
}
@@ -3002,13 +3125,13 @@ function showPlayerInventoryToPlayer(showToClient, targetClient) {
colour = "{yellow}";
}
if (getPlayerData(targetClient).hotBarItems[i] == -1) {
itemDisplay.push(`{MAINCOLOUR}${toInteger(i) + 1}: ${colour}(Empty)`);
itemDisplay.push(`{businessBlue}${toInteger(i) + 1}: ${colour}(Empty)`);
} else {
let itemTypeData = getItemTypeData(getItemData(getPlayerData(targetClient).hotBarItems[i]).itemTypeIndex);
if (itemTypeData != false) {
itemDisplay.push(`{MAINCOLOUR}${toInteger(i) + 1}: ${colour}${itemTypeData.name}`);
itemDisplay.push(`{businessBlue}${toInteger(i) + 1}: ${colour}${itemTypeData.name} ${getItemValueDisplayForItem(getPlayerData(targetClient).hotBarItems[i])}`);
} else {
itemDisplay.push(`{MAINCOLOUR}${toInteger(i) + 1}: ${colour}(Empty)`);
itemDisplay.push(`{businessBlue}${toInteger(i) + 1}: ${colour}(Empty)`);
}
}
}
@@ -3033,7 +3156,7 @@ function showHouseInventoryToPlayer(client, houseId) {
if (getHouseData(houseId).itemCache == -1) {
itemDisplay.push(`{MAINCOLOUR}${toInteger(i) + 1}{ALTCOLOUR}(Empty)`);
} else {
itemDisplay.push(`{MAINCOLOUR}${toInteger(i) + 1}: {ALTCOLOUR}${getItemTypeData(getItemData(getHouseData(houseId).itemCache[i]).itemTypeIndex).name}`);
itemDisplay.push(`{MAINCOLOUR}${toInteger(i) + 1}: {ALTCOLOUR}${getItemTypeData(getItemData(getHouseData(houseId).itemCache[i]).itemTypeIndex).name} ${getItemValueDisplayForItem(getHouseData(houseId).itemCache[i])}`);
}
}

View File

@@ -131,7 +131,10 @@ function walkieTalkieChatCommand(command, params, client) {
messagePlayerError(client, "Please turn on a walkie talkie first!");
return false;
}
walkieTalkieTransmit(getPlayerActiveWalkieTalkieFrequency(client), params, client);
markPlayerActionTipSeen(client, "RadioCommandAfterEnablingWalkieTalkie");
}
// ===========================================================================

View File

@@ -472,15 +472,15 @@ let jobRouteLocationTypeNames = {
// ===========================================================================
function initJobScript() {
logToConsole(LOG_DEBUG, "[VRR.Job]: Initializing job script ...");
logToConsole(LOG_INFO, "[VRR.Job]: Job script initialized successfully!");
logToConsole(LOG_DEBUG, "[AGRP.Job]: Initializing job script ...");
logToConsole(LOG_INFO, "[AGRP.Job]: Job script initialized successfully!");
return true;
}
// ===========================================================================
function loadJobsFromDatabase() {
logToConsole(LOG_DEBUG, "[VRR.Job]: Loading jobs from database ...");
logToConsole(LOG_DEBUG, "[AGRP.Job]: Loading jobs from database ...");
let tempJobs = [];
let dbConnection = connectToDatabase();
@@ -499,7 +499,7 @@ function loadJobsFromDatabase() {
tempJobData.routes = loadJobRoutesFromDatabase(tempJobData.databaseId);
tempJobData.ranks = loadJobRanksFromDatabase(tempJobData.databaseId);
tempJobs.push(tempJobData);
logToConsole(LOG_VERBOSE, `[VRR.Job]: Job '${tempJobData.name}' loaded from database successfully!`);
logToConsole(LOG_VERBOSE, `[AGRP.Job]: Job '${tempJobData.name}' loaded from database successfully!`);
}
}
freeDatabaseQuery(dbQuery);
@@ -507,7 +507,7 @@ function loadJobsFromDatabase() {
disconnectFromDatabase(dbConnection);
}
logToConsole(LOG_DEBUG, `[VRR.Job]: ${tempJobs.length} jobs loaded from database successfully!`);
logToConsole(LOG_DEBUG, `[AGRP.Job]: ${tempJobs.length} jobs loaded from database successfully!`);
return tempJobs;
}
@@ -546,7 +546,7 @@ function loadAllJobLocationsFromDatabase() {
// ===========================================================================
function loadJobRanksFromDatabase(jobDatabaseId) {
logToConsole(LOG_DEBUG, `[VRR.Job]: Loading ranks for job ${jobDatabaseId} from database ...`);
logToConsole(LOG_DEBUG, `[AGRP.Job]: Loading ranks for job ${jobDatabaseId} from database ...`);
let tempJobRanks = [];
let dbConnection = connectToDatabase();
@@ -560,7 +560,7 @@ function loadJobRanksFromDatabase(jobDatabaseId) {
while (dbAssoc = fetchQueryAssoc(dbQuery)) {
let tempJobRankData = new JobRankData(dbAssoc);
tempJobRanks.push(tempJobRankData);
logToConsole(LOG_VERBOSE, `[VRR.Job]: Job rank '${tempJobRankData.name}' loaded from database successfully!`);
logToConsole(LOG_VERBOSE, `[AGRP.Job]: Job rank '${tempJobRankData.name}' loaded from database successfully!`);
}
}
freeDatabaseQuery(dbQuery);
@@ -568,14 +568,14 @@ function loadJobRanksFromDatabase(jobDatabaseId) {
disconnectFromDatabase(dbConnection);
}
logToConsole(LOG_DEBUG, `[VRR.Job]: ${tempJobRanks.length} ranks for job ${jobDatabaseId} loaded from database successfully!`);
logToConsole(LOG_DEBUG, `[AGRP.Job]: ${tempJobRanks.length} ranks for job ${jobDatabaseId} loaded from database successfully!`);
return tempJobRanks;
}
// ===========================================================================
function loadJobRoutesFromDatabase(jobDatabaseId) {
logToConsole(LOG_DEBUG, `[VRR.Job]: Loading job routes for job ${jobDatabaseId} from database ...`);
logToConsole(LOG_DEBUG, `[AGRP.Job]: Loading job routes for job ${jobDatabaseId} from database ...`);
let tempJobRoutes = [];
let dbConnection = connectToDatabase();
@@ -590,7 +590,7 @@ function loadJobRoutesFromDatabase(jobDatabaseId) {
let tempJobRouteData = new JobRouteData(dbAssoc);
tempJobRouteData.locations = loadJobRouteLocationsFromDatabase(tempJobRouteData.databaseId);
tempJobRoutes.push(tempJobRouteData);
logToConsole(LOG_VERBOSE, `[VRR.Job]: Job route '${tempJobRouteData.name}' loaded from database successfully!`);
logToConsole(LOG_VERBOSE, `[AGRP.Job]: Job route '${tempJobRouteData.name}' loaded from database successfully!`);
}
}
freeDatabaseQuery(dbQuery);
@@ -598,14 +598,14 @@ function loadJobRoutesFromDatabase(jobDatabaseId) {
disconnectFromDatabase(dbConnection);
}
logToConsole(LOG_DEBUG, `[VRR.Job]: ${tempJobRoutes.length} job routes for job ${jobDatabaseId} loaded from database successfully!`);
logToConsole(LOG_DEBUG, `[AGRP.Job]: ${tempJobRoutes.length} job routes for job ${jobDatabaseId} loaded from database successfully!`);
return tempJobRoutes;
}
// ===========================================================================
function loadJobRouteLocationsFromDatabase(jobRouteId) {
logToConsole(LOG_DEBUG, `[VRR.Job]: Loading locations for job route ${jobRouteId} from database ...`);
logToConsole(LOG_DEBUG, `[AGRP.Job]: Loading locations for job route ${jobRouteId} from database ...`);
let tempJobRouteLocations = [];
let dbConnection = connectToDatabase();
@@ -619,7 +619,7 @@ function loadJobRouteLocationsFromDatabase(jobRouteId) {
while (dbAssoc = fetchQueryAssoc(dbQuery)) {
let tempJobRouteLocationData = new JobRouteLocationData(dbAssoc);
tempJobRouteLocations.push(tempJobRouteLocationData);
logToConsole(LOG_VERBOSE, `[VRR.Job]: Job route location '${tempJobRouteLocationData.databaseId}' loaded from database successfully!`);
logToConsole(LOG_VERBOSE, `[AGRP.Job]: Job route location '${tempJobRouteLocationData.databaseId}' loaded from database successfully!`);
}
}
freeDatabaseQuery(dbQuery);
@@ -627,14 +627,14 @@ function loadJobRouteLocationsFromDatabase(jobRouteId) {
disconnectFromDatabase(dbConnection);
}
logToConsole(LOG_DEBUG, `[VRR.Job]: ${tempJobRouteLocations.length} locations for job route ${jobRouteId} loaded from database successfully!`);
logToConsole(LOG_DEBUG, `[AGRP.Job]: ${tempJobRouteLocations.length} locations for job route ${jobRouteId} loaded from database successfully!`);
return tempJobRouteLocations;
}
// ===========================================================================
function loadJobEquipmentsFromDatabase(jobDatabaseId) {
logToConsole(LOG_DEBUG, `[VRR.Job]: Loading job equipments for job ${jobDatabaseId} from database ...`);
logToConsole(LOG_DEBUG, `[AGRP.Job]: Loading job equipments for job ${jobDatabaseId} from database ...`);
let tempJobEquipments = [];
let dbConnection = connectToDatabase();
@@ -649,7 +649,7 @@ function loadJobEquipmentsFromDatabase(jobDatabaseId) {
let tempJobEquipmentData = new JobEquipmentData(dbAssoc);
tempJobEquipmentData.items = loadJobEquipmentItemsFromDatabase(tempJobEquipmentData.databaseId);
tempJobEquipments.push(tempJobEquipmentData);
logToConsole(LOG_VERBOSE, `[VRR.Job]: Job equipment '${tempJobEquipmentData.name}' loaded from database successfully!`);
logToConsole(LOG_VERBOSE, `[AGRP.Job]: Job equipment '${tempJobEquipmentData.name}' loaded from database successfully!`);
}
}
freeDatabaseQuery(dbQuery);
@@ -657,14 +657,14 @@ function loadJobEquipmentsFromDatabase(jobDatabaseId) {
disconnectFromDatabase(dbConnection);
}
logToConsole(LOG_DEBUG, `[VRR.Job]: ${tempJobEquipments.length} job equipments for job ${jobDatabaseId} loaded from database successfully!`);
logToConsole(LOG_DEBUG, `[AGRP.Job]: ${tempJobEquipments.length} job equipments for job ${jobDatabaseId} loaded from database successfully!`);
return tempJobEquipments;
}
// ===========================================================================
function loadJobLocationsFromDatabase(jobDatabaseId) {
logToConsole(LOG_DEBUG, `[VRR.Job]: Loading job locations for job ${jobDatabaseId} from database ...`);
logToConsole(LOG_DEBUG, `[AGRP.Job]: Loading job locations for job ${jobDatabaseId} from database ...`);
let tempJobLocations = [];
let dbConnection = connectToDatabase();
@@ -678,7 +678,7 @@ function loadJobLocationsFromDatabase(jobDatabaseId) {
while (dbAssoc = fetchQueryAssoc(dbQuery)) {
let tempJobLocationData = new JobLocationData(dbAssoc);
tempJobLocations.push(tempJobLocationData);
logToConsole(LOG_VERBOSE, `[VRR.Job]: Job location '${tempJobLocationData.databaseId}' loaded from database successfully!`);
logToConsole(LOG_VERBOSE, `[AGRP.Job]: Job location '${tempJobLocationData.databaseId}' loaded from database successfully!`);
}
}
freeDatabaseQuery(dbQuery);
@@ -686,14 +686,14 @@ function loadJobLocationsFromDatabase(jobDatabaseId) {
disconnectFromDatabase(dbConnection);
}
logToConsole(LOG_DEBUG, `[VRR.Job]: ${tempJobLocations.length} job locations for job ${jobDatabaseId} loaded from database successfully!`);
logToConsole(LOG_DEBUG, `[AGRP.Job]: ${tempJobLocations.length} job locations for job ${jobDatabaseId} loaded from database successfully!`);
return tempJobLocations;
}
// ===========================================================================
function loadJobUniformsFromDatabase(jobDatabaseId) {
logToConsole(LOG_DEBUG, `[VRR.Job]: Loading job uniforms for job ${jobDatabaseId} from database ...`);
logToConsole(LOG_DEBUG, `[AGRP.Job]: Loading job uniforms for job ${jobDatabaseId} from database ...`);
let tempJobUniforms = [];
let dbConnection = connectToDatabase();
@@ -707,7 +707,7 @@ function loadJobUniformsFromDatabase(jobDatabaseId) {
while (dbAssoc = fetchQueryAssoc(dbQuery)) {
let tempJobUniformData = new JobUniformData(dbAssoc);
tempJobUniforms.push(tempJobUniformData);
logToConsole(LOG_VERBOSE, `[VRR.Job]: Job uniform '${tempJobUniformData.databaseId}' loaded from database successfully!`);
logToConsole(LOG_VERBOSE, `[AGRP.Job]: Job uniform '${tempJobUniformData.databaseId}' loaded from database successfully!`);
}
}
freeDatabaseQuery(dbQuery);
@@ -715,14 +715,14 @@ function loadJobUniformsFromDatabase(jobDatabaseId) {
disconnectFromDatabase(dbConnection);
}
logToConsole(LOG_DEBUG, `[VRR.Job]: ${tempJobUniforms.length} job uniforms for job ${jobDatabaseId} loaded from database successfully!`);
logToConsole(LOG_DEBUG, `[AGRP.Job]: ${tempJobUniforms.length} job uniforms for job ${jobDatabaseId} loaded from database successfully!`);
return tempJobUniforms;
}
// ===========================================================================
function loadJobEquipmentItemsFromDatabase(jobEquipmentDatabaseId) {
logToConsole(LOG_DEBUG, `[VRR.Job]: Loading job equipment items for job equipment ${jobEquipmentDatabaseId} from database ...`);
logToConsole(LOG_DEBUG, `[AGRP.Job]: Loading job equipment items for job equipment ${jobEquipmentDatabaseId} from database ...`);
let tempJobEquipmentItems = [];
let dbConnection = connectToDatabase();
@@ -736,7 +736,7 @@ function loadJobEquipmentItemsFromDatabase(jobEquipmentDatabaseId) {
while (dbAssoc = fetchQueryAssoc(dbQuery)) {
let tempJobEquipmentItemData = new JobEquipmentItemData(dbAssoc);
tempJobEquipmentItems.push(tempJobEquipmentItemData);
logToConsole(LOG_VERBOSE, `[VRR.Job]: Job equipment item '${tempJobEquipmentItemData.databaseId}' loaded from database successfully!`);
logToConsole(LOG_VERBOSE, `[AGRP.Job]: Job equipment item '${tempJobEquipmentItemData.databaseId}' loaded from database successfully!`);
}
}
freeDatabaseQuery(dbQuery);
@@ -744,7 +744,7 @@ function loadJobEquipmentItemsFromDatabase(jobEquipmentDatabaseId) {
disconnectFromDatabase(dbConnection);
}
logToConsole(LOG_DEBUG, `[VRR.Job]: ${tempJobEquipmentItems.length} job equipment items for equipment ${jobEquipmentDatabaseId} loaded from database successfully!`);
logToConsole(LOG_DEBUG, `[AGRP.Job]: ${tempJobEquipmentItems.length} job equipment items for equipment ${jobEquipmentDatabaseId} loaded from database successfully!`);
return tempJobEquipmentItems;
}
@@ -755,13 +755,13 @@ function createAllJobBlips() {
return false;
}
logToConsole(LOG_DEBUG, `[VRR.Job] Spawning all job location blips ...`);
logToConsole(LOG_DEBUG, `[AGRP.Job] Spawning all job location blips ...`);
for (let i in getServerData().jobs) {
for (let j in getServerData().jobs[i].locations) {
createJobLocationBlip(i, j);
}
}
logToConsole(LOG_DEBUG, `[VRR.Job] All job location blips spawned!`);
logToConsole(LOG_DEBUG, `[AGRP.Job] All job location blips spawned!`);
}
// ===========================================================================
@@ -771,7 +771,7 @@ function createAllJobPickups() {
return false;
}
logToConsole(LOG_DEBUG, `[VRR.Job] Spawning all job location pickups ...`);
logToConsole(LOG_DEBUG, `[AGRP.Job] Spawning all job location pickups ...`);
let pickupCount = 0;
for (let i in getServerData().jobs) {
if (getServerData().jobs[i].pickupModel != 0) {
@@ -787,11 +787,11 @@ function createAllJobPickups() {
setElementDimension(getServerData().jobs[i].locations[j].pickup, getServerData().jobs[i].locations[j].dimension);
addToWorld(getServerData().jobs[i].locations[j].pickup);
logToConsole(LOG_VERBOSE, `[VRR.Job] Job '${getServerData().jobs[i].name}' location pickup ${j} spawned!`);
logToConsole(LOG_VERBOSE, `[AGRP.Job] Job '${getServerData().jobs[i].name}' location pickup ${j} spawned!`);
}
}
}
logToConsole(LOG_DEBUG, `[VRR.Job] All job location pickups (${pickupCount}) spawned!`);
logToConsole(LOG_DEBUG, `[AGRP.Job] All job location pickups (${pickupCount}) spawned!`);
}
// ===========================================================================
@@ -904,7 +904,7 @@ function jobListCommand(command, params, client) {
function takeJobCommand(command, params, client) {
if (!canPlayerUseJobs(client)) {
messagePlayerError(client, "You are not allowed to use any jobs!");
messagePlayerError(client, getLocaleString(client, "NotAllowedToUseJobs"));
return false;
}
@@ -912,7 +912,7 @@ function takeJobCommand(command, params, client) {
let jobData = getJobData(closestJobLocation.jobIndex);
if (closestJobLocation.position.distance(getPlayerPosition(client)) > getGlobalConfig().takeJobDistance) {
messagePlayerError(client, "There are no job points close enough!");
messagePlayerError(client, getLocaleString(client, "NoJobLocationCloseEnough"));
return false;
}
@@ -922,12 +922,12 @@ function takeJobCommand(command, params, client) {
}
if (!canPlayerUseJob(client, closestJobLocation.jobIndex)) {
messagePlayerError(client, "You can't use this job!");
messagePlayerError(client, getLocaleString(client, "CantUseThisJob"));
return false;
}
takeJob(client, closestJobLocation.jobIndex);
messagePlayerSuccess(client, `{MAINCOLOUR}You now have the {jobYellow}${jobData.name} {MAINCOLOUR}job`);
messagePlayerSuccess(client, getLocaleString(client, "JobChanged", `{jobYellow}${jobData.name}{MAINCOLOUR}`));
return true;
}
@@ -944,7 +944,7 @@ function startWorkingCommand(command, params, client) {
if (closestJobLocation.position.distance(getPlayerPosition(client)) > getGlobalConfig().startWorkingDistance) {
let closestVehicle = getClosestVehicle(getPlayerPosition(client));
if (getDistance(getVehiclePosition(closestVehicle), getPlayerPosition(client)) > getGlobalConfig().startWorkingDistance) {
messagePlayerError(client, "You need to be near your job site or vehicle that belongs to your job!");
messagePlayerError(client, getLocaleString(client, "NeedToBeNearJob"));
return false;
}
@@ -961,13 +961,13 @@ function startWorkingCommand(command, params, client) {
jobData = getJobData(getJobIdFromDatabaseId(getVehicleData(closestVehicle).ownerId));
} else {
if (getPlayerCurrentSubAccount(client).job == AGRP_JOB_NONE) {
messagePlayerError(client, "You don't have a job!");
messagePlayerError(client, getLocaleString(client, "DontHaveAJob"));
messagePlayerInfo(client, "You can get a job by going the yellow points on the map.");
return false;
}
if (getPlayerCurrentSubAccount(client).job != closestJobLocation.jobId) {
messagePlayerError(client, "This is not your job!");
messagePlayerError(client, getLocaleString(client, "NotYourJob"));
messagePlayerInfo(client, getLocaleString(client, "QuitJobToTakeAnother", "{ALTCOLOUR}/quitjob{MAINCOLOUR}"));
return false;
}
@@ -980,11 +980,16 @@ function startWorkingCommand(command, params, client) {
return false;
}
messagePlayerSuccess(client, `💼 You are now working for the {jobYellow}${jobData.name}{MAINCOLOUR} job`);
messagePlayerSuccess(client, getLocaleString(client, "StartedWorking", jobData.name));
messageDiscordEventChannel(`💼 ${getCharacterFullName(client)} started working for the {jobYellow}${jobData.name}{MAINCOLOUR} job`);
startWorking(client);
//messagePlayerNewbieTip(client, `Enter a job vehicle to get started!`);
if (doesJobLocationHaveAnyRoutes(closestJobLocation)) {
if (hasPlayerSeenActionTip(client, "EnterJobVehicleForRoute")) {
messagePlayerTip(client, getGroupedLocaleString(client, "ActionTips", "EnterJobVehicleForRoute"));
}
}
return true;
}
@@ -996,13 +1001,13 @@ function stopWorkingCommand(command, params, client) {
}
if (!isPlayerWorking(client)) {
messagePlayerError(client, "You are not working!");
messagePlayerError(client, getLocaleString(client, "NeedToBeWorking", "{ALTCOLOUR}/startwork{MAINCOLOUR}"));
return false;
}
deleteJobItems(client);
stopWorking(client);
messagePlayerSuccess(client, "You have stopped working!");
messagePlayerSuccess(client, getLocaleString(client, "StoppedWorking"));
return true;
}
@@ -1017,7 +1022,7 @@ function startWorking(client) {
getPlayerCurrentSubAccount(client).skin = getPlayerSkin(client);
storePlayerItemsInTempLocker(client);
getPlayerData(client).tempLockerType = AGRP_TEMP_LOCKER_TYPE_JOB;
messagePlayerInfo(client, "Your personal items have been stored in your locker while you work");
messagePlayerInfo(client, getLocaleString(client, "ItemsStoredForJob"));
getPlayerCurrentSubAccount(client).isWorking = true;
@@ -1067,7 +1072,7 @@ function startWorking(client) {
function getJobInfoCommand(command, params, client) {
let closestJobLocation = getClosestJobLocation(getPlayerPosition(client), getPlayerDimension(client));
messagePlayerInfo(client, `{jobYellow}[Job Info] {MAINCOLOUR}Name: {ALTCOLOUR}${getJobData(closestJobLocation.jobIndex).name}, {MAINCOLOUR}Enabled: {ALTCOLOUR}${getYesNoFromBool(intToBool(getJobData(closestJobLocation.jobIndex).enabled))}, {MAINCOLOUR}Whitelisted: {ALTCOLOUR}${getYesNoFromBool(intToBool(getJobData(closestJobLocation.jobIndex).whiteListEnabled))}, {MAINCOLOUR}Blacklisted: {ALTCOLOUR}${getYesNoFromBool(intToBool(getJobData(closestJobLocation.jobIndex).blackListEnabled))}, {MAINCOLOUR}ID: {ALTCOLOUR}${getJobData(closestJobLocation.jobIndex).databaseId}/${closestJobLocation.jobIndex}`);
messagePlayerInfo(client, `{jobYellow}[Job Info] {MAINCOLOUR}Name:{ALTCOLOUR} ${getJobData(closestJobLocation.jobIndex).name}, {MAINCOLOUR}Enabled:{ALTCOLOUR} ${getYesNoFromBool(intToBool(getJobData(closestJobLocation.jobIndex).enabled))}, {MAINCOLOUR}Whitelisted:{ALTCOLOUR} ${getYesNoFromBool(intToBool(getJobData(closestJobLocation.jobIndex).whiteListEnabled))}, {MAINCOLOUR}Blacklisted:{ALTCOLOUR} ${getYesNoFromBool(intToBool(getJobData(closestJobLocation.jobIndex).blackListEnabled))}, {MAINCOLOUR}ID:{ALTCOLOUR} ${getJobData(closestJobLocation.jobIndex).databaseId}/${closestJobLocation.jobIndex}`);
}
// ===========================================================================
@@ -1075,7 +1080,7 @@ function getJobInfoCommand(command, params, client) {
function getJobLocationInfoCommand(command, params, client) {
let closestJobLocation = getClosestJobLocation(getPlayerPosition(client), getPlayerDimension(client));
messagePlayerInfo(client, `{jobYellow}[Job Location Info] {MAINCOLOUR}Job: {ALTCOLOUR}${getJobData(closestJobLocation.jobIndex).name} (${getJobData(closestJobLocation.jobIndex).databaseId}/${closestJobLocation.jobIndex}), {MAINCOLOUR}Enabled: {ALTCOLOUR}${getYesNoFromBool(closestJobLocation.enabled)}, {MAINCOLOUR}Database ID: {ALTCOLOUR}${closestJobLocation.databaseId}`);
messagePlayerInfo(client, `{jobYellow}[Job Location Info] {MAINCOLOUR}Job:{ALTCOLOUR} ${getJobData(closestJobLocation.jobIndex).name} (${getJobData(closestJobLocation.jobIndex).databaseId}/${closestJobLocation.jobIndex}), {MAINCOLOUR}Enabled:{ALTCOLOUR} ${getYesNoFromBool(closestJobLocation.enabled)}, {MAINCOLOUR}Database ID:{ALTCOLOUR} ${closestJobLocation.databaseId}`);
}
// ===========================================================================
@@ -1148,6 +1153,7 @@ function stopWorking(client) {
let jobId = getPlayerJob(client);
messageDiscordEventChannel(`💼 ${getCharacterFullName(client)} has stopped working as a ${getJobData(jobId).name}`);
/*
switch (getJobType(jobId)) {
case AGRP_JOB_POLICE:
messagePlayerInfo(client, "Your uniform, equipment, and vehicle have been returned to the police station");
@@ -1186,6 +1192,7 @@ function stopWorking(client) {
default:
break;
}
*/
updatePlayerNameTag(client);
sendPlayerWorkingState(client, false);
@@ -1200,12 +1207,12 @@ function jobUniformCommand(command, params, client) {
}
if (!doesPlayerHaveAnyJob(client)) {
messagePlayerError(client, "You don't have a job!");
messagePlayerError(client, getLocaleString(client, "DontHaveAJob"));
return false;
}
if (!isPlayerWorking(client)) {
messagePlayerError(client, "You are not working! Use /startwork at your job location or a job vehicle.");
messagePlayerError(client, getLocaleString(client, "NeedToBeWorking", `{ALTCOLOUR}/startwork{MAINCOLOUR}`));
return false;
}
@@ -1215,7 +1222,7 @@ function jobUniformCommand(command, params, client) {
if (closestJobLocation.position.distance(getPlayerPosition(client)) > getGlobalConfig().startWorkingDistance) {
let closestVehicle = getClosestVehicle(getPlayerPosition(client));
if (getDistance(getVehiclePosition(closestVehicle), getPlayerPosition(client)) > getGlobalConfig().startWorkingDistance) {
messagePlayerError(client, "You need to be near your job site or vehicle that belongs to your job!");
messagePlayerError(client, getLocaleString(client, "NeedToBeNearJob"));
return false;
}
@@ -1303,12 +1310,12 @@ function jobEquipmentCommand(command, params, client) {
}
if (!doesPlayerHaveAnyJob(client)) {
messagePlayerError(client, "You don't have a job!");
messagePlayerError(client, getLocaleString(client, "DontHaveAJob"));
return false;
}
if (!isPlayerWorking(client)) {
messagePlayerError(client, "You are not working! Use /startwork at your job location.");
messagePlayerError(client, getLocaleString(client, "NeedToBeWorking", `{ALTCOLOUR}/startwork{MAINCOLOUR}`));
return false;
}
@@ -1318,7 +1325,7 @@ function jobEquipmentCommand(command, params, client) {
if (closestJobLocation.position.distance(getPlayerPosition(client)) > getGlobalConfig().startWorkingDistance) {
let closestVehicle = getClosestVehicle(getPlayerPosition(client));
if (getDistance(getVehiclePosition(closestVehicle), getPlayerPosition(client)) > getGlobalConfig().startWorkingDistance) {
messagePlayerError(client, "You need to be near your job site or vehicle that belongs to your job!");
messagePlayerError(client, getLocaleString(client, "NeedToBeNearJob"));
return false;
}
@@ -1336,12 +1343,15 @@ function jobEquipmentCommand(command, params, client) {
} else {
if (getPlayerCurrentSubAccount(client).job == AGRP_JOB_NONE) {
messagePlayerError(client, getLocaleString(client, "NotYourJob"));
messagePlayerInfo(client, getLocaleString(client, "JobPoints"));
if (hasPlayerSeenActionTip(client, "JobLocations")) {
messagePlayerInfo(client, getGroupedLocaleString(client, "ActionTips", "JobPoints", "{ALTCOLOUR}/gps{MAINCOLOUR}"));
}
return false;
}
if (getPlayerCurrentSubAccount(client).job != closestJobLocation.jobId) {
messagePlayerError(client, "This is not your job!");
messagePlayerError(client, getLocaleString(client, "NotYourJob"));
messagePlayerInfo(client, getLocaleString(client, "QuitJobToTakeAnother", "{ALTCOLOUR}/quitjob{MAINCOLOUR}"));
return false;
}
@@ -1377,7 +1387,7 @@ function jobEquipmentCommand(command, params, client) {
}
if (equipmentId < 1 || equipmentId > equipments.length) {
messagePlayerError(client, "That equipment ID is invalid!");
messagePlayerError(client, getLocaleString(client, "InvalidJobEquipment"));
return false;
}
@@ -1394,11 +1404,15 @@ function jobEquipmentCommand(command, params, client) {
givePlayerJobEquipment(client, equipmentId - 1);
//messagePlayerSuccess(client, `You have been given the ${equipments[equipmentId-1].name} equipment`);
meActionToNearbyPlayers(client, `grabs the ${jobEquipmentData.name} equipment from the locker`);
if (doesPlayerHaveKeyBindForCommand(client, "inv")) {
messagePlayerTip(client, getLocaleString(client, "JobEquipmentInventoryKeyBindTip", toUpperCase(getKeyNameFromId(getPlayerKeyBindForCommand(client, "inv").key))));
} else {
messagePlayerTip(client, getLocaleString(client, "JobEquipmentInventoryCommandTip", "/inv"));
if (!hasPlayerSeenActionTip(client, "JobEquipmentInventory")) {
if (doesPlayerHaveKeyBindForCommand(client, "inv")) {
messagePlayerTip(client, getGroupedLocaleString(client, "ActionTips", "JobEquipmentInventory", toUpperCase(getKeyNameFromId(getPlayerKeyBindForCommand(client, "inv").key))));
} else {
messagePlayerTip(client, getGroupedLocaleString(client, "ActionTips", "JobEquipmentInventory", "/inv"));
}
markPlayerActionTipSeen(client, "JobEquipmentInventory");
}
}
// ===========================================================================
@@ -1548,11 +1562,11 @@ function createJobLocationCommand(command, params, client) {
let jobId = getJobFromParams(params);
if (!getJobData(jobId)) {
messagePlayerError(client, "That job was not found!");
messagePlayerError(client, getLocaleString(client, "InvalidJob"));
return false;
}
createJobLocation(jobId, getPlayerPosition(client), getPlayerInterior(client), getPlayerDimension(client));
createJobLocation(jobId, getPlayerPosition(client), getPlayerInterior(client), getPlayerDimension(client), getPlayerData(client).accountData.databaseId);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} created a location for the {jobYellow}${getJobData(jobId).name}{MAINCOLOUR} job`);
return true;
}
@@ -1562,10 +1576,8 @@ function createJobLocationCommand(command, params, client) {
function deleteJobLocationCommand(command, params, client) {
let closestJobLocation = getClosestJobLocation(getPlayerPosition(client), getPlayerDimension(client));
deleteJobLocation(closestJobLocation.jobIndex, closestJobLocation.index);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} deleted location {ALTCOLOUR}${closestJobLocation.index} (DB ID ${closestJobLocation.databaseId}){MAINCOLOUR} for the {jobYellow}${getJobData(closestJobLocation.jobIndex).name}{MAINCOLOUR} job`);
deleteJobLocation(closestJobLocation);
}
// ===========================================================================
@@ -1743,7 +1755,7 @@ function toggleJobRouteEnabledCommand(command, params, client) {
if (isPlayerOnJobRoute(clients[i])) {
if (getPlayerJob(clients[i]) == jobId && getPlayerJobRoute(clients[i]) == jobRoute) {
stopJobRoute(clients[i], true, false);
messagePlayerAlert(clients[i], "The job route you were on has been disabled by an admin");
messagePlayerAlert(clients[i], getLocaleString(clients[i], "CurrentJobRouteDeleted"));
}
}
}
@@ -2139,7 +2151,7 @@ function setJobRoutePayCommand(command, params, client) {
getJobData(jobId).routes[jobRoute].pay = toInteger(amount);
getJobData(jobId).routes[jobRoute].needsSaved = true;
messageAdmins(`{adminOrange}${getPlayerName(client)} {MAINCOLOUR} set the pay for route {ALTCOLOUR}${getJobRouteData(jobId, jobRoute).name}{MAINCOLOUR} of the {jobYellow}${getJobData(jobId).name}{MAINCOLOUR} job to {ALTCOLOUR}$${makeLargeNumberReadable(amount)} {MAINCOLOUR} `);
messageAdmins(`{adminOrange}${getPlayerName(client)} {MAINCOLOUR} set the pay for route {ALTCOLOUR}${getJobRouteData(jobId, jobRoute).name}{MAINCOLOUR} of the {jobYellow}${getJobData(jobId).name}{MAINCOLOUR} job to {ALTCOLOUR}${getCurrencyString(amount)} {MAINCOLOUR} `);
}
// ===========================================================================
@@ -2304,27 +2316,32 @@ function forceAllPlayersToStopWorking() {
function jobStartRouteCommand(command, params, client) {
if (!canPlayerUseJobs(client)) {
messagePlayerError(client, "You are not allowed to use jobs.");
messagePlayerError(client, getLocaleString(client, "NotAllowedToUseJobs"));
return false;
}
if (!isPlayerWorking(client)) {
messagePlayerError(client, "You aren't working yet! Use /startwork first.");
messagePlayerError(client, getLocaleString(client, "NeedToBeWorking", "{ALTCOLOUR}/startwork{MAINCOLOUR}"));
return false;
}
if (getJobData(getPlayerJob(client)).routes.length == 0) {
messagePlayerError(client, "Your job doesn't have any routes for this location!");
messagePlayerError(client, getLocaleString(client, "NoJobRoutesForLocation"));
return false;
}
if (!isPlayerInAnyVehicle(client)) {
messagePlayerError(client, getLocaleString(client, "MustBeInAVehicle"));
return false;
}
if (!isPlayerInJobVehicle(client)) {
messagePlayerError(client, "You need to be in a vehicle that belongs to your job!");
messagePlayerError(client, getLocaleString(client, "NeedToBeInJobVehicle"));
return false;
}
if (isPlayerOnJobRoute(client)) {
messagePlayerError(client, "You're already on a job route! Finish the route or use /stoproute");
messagePlayerError(client, getLocaleString(client, "AlreadyOnJobRoute", "{ALTCOLOUR}/stoproute{MAINCOLOUR}"));
return false;
}
@@ -2338,6 +2355,8 @@ function jobStartRouteCommand(command, params, client) {
}
}
markPlayerActionTipSeen(client, "JobRouteStart");
startJobRoute(client, forceRoute);
return true;
}
@@ -2346,7 +2365,7 @@ function jobStartRouteCommand(command, params, client) {
function jobStopRouteCommand(command, params, client) {
if (!canPlayerUseJobs(client)) {
messagePlayerError(client, "You are not allowed to use jobs.");
messagePlayerError(client, getLocaleString(client, "NotAllowedToUseJobs"));
return false;
}
@@ -2409,7 +2428,7 @@ function startJobRoute(client, forceRoute = -1) {
}
if (jobRoute == -1) {
messagePlayerError(client, `There are no routes for this location.`);
messagePlayerError(client, getLocaleString(client, "NoRoutesForLocation"));
return false;
}
@@ -2441,6 +2460,10 @@ function startJobRoute(client, forceRoute = -1) {
// ===========================================================================
function stopJobRoute(client, successful = false, alertPlayer = true) {
if (!isPlayerOnJobRoute(client)) {
return false;
}
let jobId = getPlayerJob(client);
let routeId = getPlayerJobRoute(client);
@@ -2453,12 +2476,14 @@ function stopJobRoute(client, successful = false, alertPlayer = true) {
return false;
}
if (alertPlayer) {
messageDiscordEventChannel(`💼 ${getCharacterFullName(client)} failed to finish the ${getJobRouteData(jobId, getPlayerJobRoute(client)).name} route for the ${getJobData(jobId).name} job and didn't earn anything.`);
}
//if (alertPlayer) {
// messagePlayerAlert(client, replaceJobRouteStringsInMessage(getJobRouteData(jobId, routeId).failedMessage, jobId, routeId));
//}
messageDiscordEventChannel(`💼 ${getCharacterFullName(client)} failed to finish the ${getJobRouteData(jobId, getPlayerJobRoute(client)).name} route for the ${getJobData(jobId).name} job and didn't earn anything.`);
stopReturnToJobVehicleCountdown(client);
sendPlayerStopJobRoute(client);
respawnVehicle(getPlayerData(client).jobRouteVehicle);
@@ -2546,14 +2571,14 @@ function canPlayerUseJob(client, jobId) {
// ===========================================================================
function deleteJobLocation(jobLocationData) {
function deleteJobLocation(jobIndex, jobLocationIndex) {
if (jobLocationData.databaseId > 0) {
quickDatabaseQuery(`DELETE FROM job_loc WHERE job_loc_id = ${jobLocationData.databaseId}`);
quickDatabaseQuery(`DELETE FROM job_loc WHERE job_loc_id = ${getJobLocationData(jobIndex, jobLocationIndex).databaseId}`);
}
deleteJobLocationBlip(tempJob, tempLocation);
deleteJobLocationPickup(tempJob, tempLocation);
getJobData(getJobIdFromDatabaseId(tempJob)).locations.splice(tempLocation, 1);
deleteJobLocationBlip(jobIndex, jobLocationIndex);
deleteJobLocationPickup(jobIndex, jobLocationIndex);
getJobData(getJobIdFromDatabaseId(jobIndex)).locations.splice(jobLocationIndex, 1);
setAllJobDataIndexes();
}
@@ -2634,7 +2659,7 @@ function setAllJobDataIndexes() {
// ===========================================================================
function createJobLocation(jobId, position, interior, dimension) {
function createJobLocation(jobId, position, interior, dimension, whoCreated) {
let jobLocationData = new JobLocationData(false);
jobLocationData.position = position;
jobLocationData.jobId = getJobData(jobId).databaseId;
@@ -2643,11 +2668,14 @@ function createJobLocation(jobId, position, interior, dimension) {
jobLocationData.enabled = true;
jobLocationData.jobIndex = jobId;
jobLocationData.needsSaved = true;
jobLocationData.whoCreated = whoCreated;
jobLocationData.whenCreated = getCurrentUnixTimestamp();
getServerData().jobs[jobId].locations.push(jobLocationData);
let newSlot = getServerData().jobs[jobId].locations.length - 1;
getServerData().jobs[jobId].locations[newSlot].index = newSlot;
createJobLocationPickup(jobId, newSlot);
createJobLocationBlip(jobId, newSlot);
saveJobLocationToDatabase(jobLocationData);
}
@@ -2660,11 +2688,11 @@ function saveJobToDatabase(jobData) {
}
if (jobData.needsSaved == false) {
logToConsole(LOG_DEBUG, `[VRR.Job]: Job ${jobData.name} doesn't need saved. Skipping ...`);
logToConsole(LOG_DEBUG, `[AGRP.Job]: Job ${jobData.name} doesn't need saved. Skipping ...`);
return false;
}
logToConsole(LOG_DEBUG, `[VRR.Job]: Saving job ${jobData.name} to database ...`);
logToConsole(LOG_DEBUG, `[AGRP.Job]: Saving job ${jobData.name} to database ...`);
let dbConnection = connectToDatabase();
if (dbConnection) {
let safeName = escapeDatabaseString(dbConnection, jobData.name);
@@ -2701,7 +2729,7 @@ function saveJobToDatabase(jobData) {
disconnectFromDatabase(dbConnection);
return true;
}
logToConsole(LOG_DEBUG, `[VRR.Job]: Saved job ${jobData.name} to database!`);
logToConsole(LOG_DEBUG, `[AGRP.Job]: Saved job ${jobData.name} to database!`);
return false;
}
@@ -2715,11 +2743,11 @@ function saveJobRankToDatabase(jobRankData) {
}
if (jobRankData.needsSaved == false) {
logToConsole(LOG_DEBUG, `[VRR.Job]: Job route ${jobRankData.name} (DB ID ${jobRankData.databaseId}) doesn't need saved. Skipping ...`);
logToConsole(LOG_DEBUG, `[AGRP.Job]: Job route ${jobRankData.name} (DB ID ${jobRankData.databaseId}) doesn't need saved. Skipping ...`);
return false;
}
logToConsole(LOG_DEBUG, `[VRR.Job]: Saving job route ${jobRankData.name} to database ...`);
logToConsole(LOG_DEBUG, `[AGRP.Job]: Saving job route ${jobRankData.name} to database ...`);
let dbConnection = connectToDatabase();
if (dbConnection) {
let safeName = escapeDatabaseString(dbConnection, jobRankData.name);
@@ -2750,7 +2778,7 @@ function saveJobRankToDatabase(jobRankData) {
disconnectFromDatabase(dbConnection);
return true;
}
logToConsole(LOG_DEBUG, `[VRR.Job]: Saved job rank ${jobRankData.name} to database!`);
logToConsole(LOG_DEBUG, `[AGRP.Job]: Saved job rank ${jobRankData.name} to database!`);
return false;
}
@@ -2764,11 +2792,11 @@ function saveJobRouteToDatabase(jobRouteData) {
}
if (jobRouteData.needsSaved == false) {
logToConsole(LOG_DEBUG, `[VRR.Job]: Job route ${jobRouteData.name} (DB ID ${jobRouteData.databaseId}) doesn't need saved. Skipping ...`);
logToConsole(LOG_DEBUG, `[AGRP.Job]: Job route ${jobRouteData.name} (DB ID ${jobRouteData.databaseId}) doesn't need saved. Skipping ...`);
return false;
}
logToConsole(LOG_DEBUG, `[VRR.Job]: Saving job route ${jobRouteData.name} to database ...`);
logToConsole(LOG_DEBUG, `[AGRP.Job]: Saving job route ${jobRouteData.name} to database ...`);
let dbConnection = connectToDatabase();
if (dbConnection) {
let safeName = escapeDatabaseString(dbConnection, jobRouteData.name);
@@ -2809,7 +2837,7 @@ function saveJobRouteToDatabase(jobRouteData) {
disconnectFromDatabase(dbConnection);
return true;
}
logToConsole(LOG_DEBUG, `[VRR.Job]: Saved job route ${jobRouteData.name} to database!`);
logToConsole(LOG_DEBUG, `[AGRP.Job]: Saved job route ${jobRouteData.name} to database!`);
return false;
}
@@ -2823,11 +2851,11 @@ function saveJobRouteLocationToDatabase(jobRouteLocationData) {
}
if (jobRouteLocationData.needsSaved == false) {
logToConsole(LOG_DEBUG, `[VRR.Job]: Job route location ${jobRouteLocationData.name} (DB ID ${jobRouteLocationData.databaseId}) doesn't need saved. Skipping ...`);
logToConsole(LOG_DEBUG, `[AGRP.Job]: Job route location ${jobRouteLocationData.name} (DB ID ${jobRouteLocationData.databaseId}) doesn't need saved. Skipping ...`);
return false;
}
logToConsole(LOG_DEBUG, `[VRR.Job]: Saving job route location ${jobRouteLocationData.name} to database ...`);
logToConsole(LOG_DEBUG, `[AGRP.Job]: Saving job route location ${jobRouteLocationData.name} to database ...`);
let dbConnection = connectToDatabase();
if (dbConnection) {
let safeName = escapeDatabaseString(dbConnection, jobRouteLocationData.name);
@@ -2859,7 +2887,7 @@ function saveJobRouteLocationToDatabase(jobRouteLocationData) {
disconnectFromDatabase(dbConnection);
return true;
}
logToConsole(LOG_DEBUG, `[VRR.Job]: Saved job route location ${jobRoutePositionData.name} (${jobRouteLocationData.databaseId}) to database!`);
logToConsole(LOG_DEBUG, `[AGRP.Job]: Saved job route location ${jobRoutePositionData.name} (${jobRouteLocationData.databaseId}) to database!`);
return false;
}
@@ -2873,11 +2901,11 @@ function saveJobLocationToDatabase(jobLocationData) {
}
if (!jobLocationData.needsSaved) {
logToConsole(LOG_DEBUG, `[VRR.Job]: Job location ${jobLocationData.name} (${jobLocationData.databaseId}) doesn't need saved. Skipping ...`);
logToConsole(LOG_DEBUG, `[AGRP.Job]: Job location ${jobLocationData.name} (${jobLocationData.databaseId}) doesn't need saved. Skipping ...`);
return false;
}
logToConsole(LOG_DEBUG, `[VRR.Job]: Saving job location ${jobLocationData.databaseId} to database ...`);
logToConsole(LOG_DEBUG, `[AGRP.Job]: Saving job location ${jobLocationData.databaseId} to database ...`);
let dbConnection = connectToDatabase();
if (dbConnection) {
let data = [
@@ -2908,7 +2936,7 @@ function saveJobLocationToDatabase(jobLocationData) {
return true;
}
logToConsole(LOG_DEBUG, `[VRR.Job]: Saved job location ${jobLocationData.databaseId} to database`);
logToConsole(LOG_DEBUG, `[AGRP.Job]: Saved job location ${jobLocationData.databaseId} to database`);
return false;
}
@@ -2922,11 +2950,11 @@ function saveJobEquipmentToDatabase(jobEquipmentData) {
}
if (!jobEquipmentData.needsSaved) {
logToConsole(LOG_DEBUG, `[VRR.Job]: Job equipment ${jobEquipmentData.name} (${jobEquipmentData.databaseId}) doesn't need saved. Skipping ...`);
logToConsole(LOG_DEBUG, `[AGRP.Job]: Job equipment ${jobEquipmentData.name} (${jobEquipmentData.databaseId}) doesn't need saved. Skipping ...`);
return false;
}
logToConsole(LOG_DEBUG, `[VRR.Job]: Saving job equipment ${jobEquipmentData.databaseId} to database ...`);
logToConsole(LOG_DEBUG, `[AGRP.Job]: Saving job equipment ${jobEquipmentData.databaseId} to database ...`);
let dbConnection = connectToDatabase();
if (dbConnection) {
let safeName = escapeDatabaseString(dbConnection, jobEquipmentData.name);
@@ -2954,7 +2982,7 @@ function saveJobEquipmentToDatabase(jobEquipmentData) {
disconnectFromDatabase(dbConnection);
return true;
}
logToConsole(LOG_DEBUG, `[VRR.Job]: Saved job equipment ${jobEquipmentData.databaseId} to database`);
logToConsole(LOG_DEBUG, `[AGRP.Job]: Saved job equipment ${jobEquipmentData.databaseId} to database`);
return false;
}
@@ -2968,11 +2996,11 @@ function saveJobEquipmentItemToDatabase(jobEquipmentItemData) {
}
if (!jobEquipmentItemData.needsSaved) {
logToConsole(LOG_DEBUG, `[VRR.Job]: Job equipment item ${jobEquipmentItemData.databaseId} doesn't need saved. Skipping ...`);
logToConsole(LOG_DEBUG, `[AGRP.Job]: Job equipment item ${jobEquipmentItemData.databaseId} doesn't need saved. Skipping ...`);
return false;
}
logToConsole(LOG_DEBUG, `[VRR.Job]: Saving job equipment weapon ${jobEquipmentItemData.databaseId} to database ...`);
logToConsole(LOG_DEBUG, `[AGRP.Job]: Saving job equipment weapon ${jobEquipmentItemData.databaseId} to database ...`);
let dbConnection = connectToDatabase();
if (dbConnection) {
let data = [
@@ -2999,7 +3027,7 @@ function saveJobEquipmentItemToDatabase(jobEquipmentItemData) {
disconnectFromDatabase(dbConnection);
return true;
}
logToConsole(LOG_DEBUG, `[VRR.Job]: Saved job equipment weapon ${jobEquipmentItemData.databaseId} to database`);
logToConsole(LOG_DEBUG, `[AGRP.Job]: Saved job equipment weapon ${jobEquipmentItemData.databaseId} to database`);
return false;
}
@@ -3013,11 +3041,11 @@ function saveJobUniformToDatabase(jobUniformData) {
}
if (!jobUniformData.needSaved) {
logToConsole(LOG_DEBUG, `[VRR.Job]: Job uniform ${jobUniformData.databaseId} doesn't need saved. Skipping ...`);
logToConsole(LOG_DEBUG, `[AGRP.Job]: Job uniform ${jobUniformData.databaseId} doesn't need saved. Skipping ...`);
return false;
}
logToConsole(LOG_DEBUG, `[VRR.Job]: Saving job uniform ${jobUniformData.databaseId} to database ...`);
logToConsole(LOG_DEBUG, `[AGRP.Job]: Saving job uniform ${jobUniformData.databaseId} to database ...`);
let dbConnection = connectToDatabase();
if (dbConnection) {
let safeName = escapeDatabaseString(dbConnection, jobUniformData.name);
@@ -3046,7 +3074,7 @@ function saveJobUniformToDatabase(jobUniformData) {
disconnectFromDatabase(dbConnection);
return true;
}
logToConsole(LOG_DEBUG, `[VRR.Job]: Saved job uniform ${jobUniformData.databaseId} to database`);
logToConsole(LOG_DEBUG, `[AGRP.Job]: Saved job uniform ${jobUniformData.databaseId} to database`);
return false;
}
@@ -3112,21 +3140,20 @@ function createJobLocationPickup(jobId, locationId) {
return false;
}
if (!isGameFeatureSupported("pickup")) {
return false;
}
let tempJobData = getJobData(jobId);
logToConsole(LOG_VERBOSE, `[AGRP.Job]: Creating pickup for location ${locationId} of the ${tempJobData.name} job`);
if (tempJobData.pickupModel != -1) {
let pickupModelId = getGameConfig().pickupModels[getGame()].Job;
let pickupModelId = -1;
if (isGameFeatureSupported("pickup")) {
pickupModelId = getGameConfig().pickupModels[getGame()].Job;
if (tempJobData.pickupModel != 0) {
pickupModelId = tempJobData.pickupModel;
if (tempJobData.pickupModel != 0) {
pickupModelId = tempJobData.pickupModel;
}
}
logToConsole(LOG_VERBOSE, `[VRR.Job]: Creating pickup for location ${locationId} of the ${tempJobData.name} job`);
if (areServerElementsSupported()) {
let pickup = createGamePickup(pickupModelId, tempJobData.locations[locationId].position, getGameConfig().pickupTypes[getGame()].job);
if (pickup != false) {
@@ -3141,7 +3168,16 @@ function createJobLocationPickup(jobId, locationId) {
addToWorld(pickup);
}
} else {
// sendJobToPlayer(null, jobId, tempJobData.name, tempJobData.locations[locationId].position, pickupModel);
let blipModelId = -1;
if (isGameFeatureSupported("blip")) {
blipModelId = getGameConfig().blipSprites[getGame()].Job;
if (getJobData(jobId).blipModel != 0) {
blipModelId = getJobData(jobId).blipModel;
}
}
sendJobToPlayer(null, jobId, tempJobData.name, tempJobData.locations[locationId].position, blipModelId, pickupModelId);
}
}
}
@@ -3189,8 +3225,6 @@ function createJobLocationBlip(jobId, locationId) {
updateJobBlipsForPlayer(clients[i]);
}
}
} else {
sendJobToPlayer(null, jobId, tempJobData.name, tempJobData.locations[locationId].position, blipModelId);
}
}
@@ -3416,7 +3450,7 @@ function createJobRouteCommand(command, params, client) {
}
if (isPlayerOnJobRoute(client)) {
messagePlayerError(client, getLocaleString(client, "AlreadyOnJobRoute", "{ALTCOLOUR}/startroute{MAINCOLOUR}"));
messagePlayerError(client, getLocaleString(client, "AlreadyOnJobRoute", "{ALTCOLOUR}/stoproute{MAINCOLOUR}"));
return false;
}
@@ -3483,7 +3517,7 @@ function createJobUniformCommand(command, params, client) {
return false;
}
let splitParams = params.spli(" ");
let splitParams = params.split(" ");
let jobId = getJobFromParams(getParam(params, " ", 1));
let skinIndex = getSkinModelIndexFromParams(splitParams.slice(1).join(" "), getGame());
@@ -3498,7 +3532,7 @@ function createJobUniformCommand(command, params, client) {
}
createJobUniform(jobId, skinIndex);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} created uniform with skin {ALTCOLOUR}${getGameConfig().skins[skinIndex][1]} (}${getGameConfig().skins[skinIndex][0]}){MAINCOLOUR} for job {jobYellow}${getJobData(jobId).name}`);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} created uniform with skin {ALTCOLOUR}${getGameConfig().skins[skinIndex][1]} (${getGameConfig().skins[skinIndex][0]}){MAINCOLOUR} for job {jobYellow}${getJobData(jobId).name}`);
return true;
}
@@ -3756,6 +3790,14 @@ function getRandomJobRouteForLocation(closestJobLocation) {
* @return {JobUniformData} The jobroutes's data (class instance)
*/
function getJobUniformData(jobIndex, uniformIndex) {
if (typeof getServerData().jobs[jobIndex] == "undefined") {
return false;
}
if (typeof getServerData().jobs[jobIndex].uniforms[uniformIndex] == "undefined") {
return false;
}
return getServerData().jobs[jobIndex].uniforms[uniformIndex];
}
@@ -3767,6 +3809,14 @@ function getJobUniformData(jobIndex, uniformIndex) {
* @return {JobEquipmentData} The job equipment loadout's data (class instance)
*/
function getJobEquipmentData(jobIndex, equipmentIndex) {
if (typeof getServerData().jobs[jobIndex] == "undefined") {
return false;
}
if (typeof getServerData().jobs[jobIndex].equipment[equipmentIndex] == "undefined") {
return false;
}
return getServerData().jobs[jobIndex].equipment[equipmentIndex];
}
@@ -3779,7 +3829,15 @@ function getJobEquipmentData(jobIndex, equipmentIndex) {
* @return {JobEquipmentItemData} The job equipment loadout's data (class instance)
*/
function getJobEquipmentItemData(jobIndex, equipmentIndex, equipmentItemIndex) {
return getJobEquipmentData(jobIndex, equipmentIndex).items[equipmentItemIndex];
if (typeof getServerData().jobs[jobIndex] == "undefined") {
return false;
}
if (typeof getServerData().jobs[jobIndex].equipment[equipmentIndex] == "undefined") {
return false;
}
return getServerData().jobs[jobIndex].equipment[equipmentIndex].items[equipmentItemIndex];
}
// ===========================================================================
@@ -3790,6 +3848,10 @@ function getJobEquipmentItemData(jobIndex, equipmentIndex, equipmentItemIndex) {
* @return {JobRouteData} The job rank's data (class instance)
*/
function getJobRankData(jobIndex, rankIndex) {
if (typeof getServerData().jobs[jobIndex] == "undefined") {
return false;
}
return getServerData().jobs[jobIndex].ranks[rankIndex];
}
@@ -3801,6 +3863,14 @@ function getJobRankData(jobIndex, rankIndex) {
* @return {JobRouteData} The job routes's data (class instance)
*/
function getJobRouteData(jobIndex, routeIndex) {
if (typeof getServerData().jobs[jobIndex] == "undefined") {
return false;
}
if (typeof getServerData().jobs[jobIndex].routes[routeIndex] == "undefined") {
return false;
}
return getServerData().jobs[jobIndex].routes[routeIndex];
}
@@ -3813,7 +3883,38 @@ function getJobRouteData(jobIndex, routeIndex) {
* @return {JobRouteLocationData} The job route locations's data (class instance)
*/
function getJobRouteLocationData(jobIndex, routeIndex, routeLocationIndex) {
return getJobRouteData(jobIndex, routeIndex).locations[routeLocationIndex];
if (typeof getServerData().jobs[jobIndex] == "undefined") {
return false;
}
if (typeof getServerData().jobs[jobIndex].routes[routeIndex] == "undefined") {
return false;
}
if (typeof getServerData().jobs[jobIndex].routes[routeIndex].locations[routeLocationIndex] == "undefined") {
return false;
}
return getServerData().jobs[jobIndex].routes[routeIndex].locations[routeLocationIndex];
}
// ===========================================================================
/**
* @param {number} jobIndex - The data index of the job
* @param {number} locationIndex - The data index of the job location
* @return {JobLocationData} The job route locations's data (class instance)
*/
function getJobLocationData(jobIndex, locationIndex) {
if (typeof getServerData().jobs[jobIndex] == "undefined") {
return false;
}
if (typeof getServerData().jobs[jobIndex].locations[locationIndex] == "undefined") {
return false;
}
return getServerData().jobs[jobIndex].locations[locationIndex];
}
// ===========================================================================
@@ -3856,7 +3957,7 @@ function finishSuccessfulJobRoute(client) {
let payout = toInteger(applyServerInflationMultiplier(jobRouteData.pay));
getPlayerData(client).payDayAmount = getPlayerData(client).payDayAmount + payout;
messageDiscordEventChannel(`💼 ${getCharacterFullName(client)} finished the ${jobRouteData.name} route for the ${getJobData(jobId).name} job and earned $${jobRouteData.pay}!`);
messageDiscordEventChannel(`💼 ${getCharacterFullName(client)} finished the ${jobRouteData.name} route for the ${getJobData(jobId).name} job and earned ${getCurrencyString(jobRouteData.pay)}!`);
messagePlayerSuccess(client, replaceJobRouteStringsInMessage(jobRouteData.finishMessage, jobId, jobRouteData.index));
stopReturnToJobVehicleCountdown(client);
@@ -3916,7 +4017,7 @@ function replaceJobRouteStringsInMessage(messageText, jobId, jobRouteId) {
tempFind = `{JOBROUTEPAY}`;
tempRegex = new RegExp(tempFind, 'g');
messageText = messageText.replace(tempRegex, `$${tempJobRouteData.pay}`);
messageText = messageText.replace(tempRegex, `${getCurrencyString(tempJobRouteData.pay)}`);
tempFind = `{JOBNAME}`;
tempRegex = new RegExp(tempFind, 'g');
@@ -4024,4 +4125,10 @@ function createAllJobRouteLocationMarkers() {
}
}
// ===========================================================================
function doesJobLocationHaveAnyRoutes(jobLocationData) {
return (getRandomJobRouteForLocation(jobLocationData) != -1);
}
// ===========================================================================

View File

@@ -36,8 +36,8 @@ class KeyBindData {
// ===========================================================================
function initKeyBindScript() {
logToConsole(LOG_DEBUG, "[VRR.KeyBind]: Initializing key bind script ...");
logToConsole(LOG_INFO, "[VRR.KeyBind]: Key bind script initialized!");
logToConsole(LOG_DEBUG, "[AGRP.KeyBind]: Initializing key bind script ...");
logToConsole(LOG_INFO, "[AGRP.KeyBind]: Key bind script initialized!");
}
// ===========================================================================
@@ -78,7 +78,7 @@ function removeKeyBindCommand(command, params, client) {
if (!keyId) {
messagePlayerError(client, getLocaleString(client, "InvalidKeyBindName"));
messagePlayerTip(client, getLocaleString(client, "KeyBindNameTip"));
messagePlayerInfo(client, getLocaleString(client, "UniversalInlineExampleList", `{ALTCOLOUR}1, 2, a, b, numplus, num1, f1, f2, pageup, delete, insert, rightshift, leftctrl{MAINCOLOR}`));
messagePlayerInfo(client, getLocaleString(client, "UniversalInlineExamplesList", `{ALTCOLOUR}1, 2, a, b, numplus, num1, f1, f2, pageup, delete, insert, rightshift, leftctrl{MAINCOLOR}`));
return false;
}
@@ -106,18 +106,18 @@ function copyKeyBindsToServerCommand(command, params, client) {
// ===========================================================================
function addPlayerKeyBind(client, keys, command, params, tempKey = false) {
function addPlayerKeyBind(client, keyId, command, params, tempKey = false) {
let keyBindData = new KeyBindData(false, keys, `${command} ${params}`);
if (tempKey == true) {
keyBindData.databaseId = -1;
}
getPlayerData(client).keyBinds.push(keyBindData);
sendAddAccountKeyBindToClient(client, keys, (keys.length > 1) ? AGRP_KEYSTATE_COMBO : AGRP_KEYSTATE_UP);
sendAddAccountKeyBindToClient(client, keyId, AGRP_KEYSTATE_UP);
if (!doesPlayerHaveKeyBindsDisabled(client) && doesPlayerHaveKeyBindForCommand(client, "enter")) {
let keyId = getPlayerKeyBindForCommand(client, "enter");
logToConsole(LOG_DEBUG, `[VRR.Event] Sending custom enter property key ID (${keyId.key}, ${toUpperCase(getKeyNameFromId(keyId.key))}) to ${getPlayerDisplayForConsole(client)}`);
logToConsole(LOG_DEBUG, `[AGRP.Event] Sending custom enter property key ID (${keyId.key}, ${toUpperCase(getKeyNameFromId(keyId.key))}) to ${getPlayerDisplayForConsole(client)}`);
sendPlayerEnterPropertyKey(client, keyId.key);
} else {
sendPlayerEnterPropertyKey(client, false);
@@ -141,7 +141,7 @@ function removePlayerKeyBind(client, keyId) {
if (!doesPlayerHaveKeyBindsDisabled(client) && doesPlayerHaveKeyBindForCommand(client, "enter")) {
let keyId = getPlayerKeyBindForCommand(client, "enter");
logToConsole(LOG_DEBUG, `[VRR.Event] Sending custom enter property key ID (${keyId.key}, ${toUpperCase(getKeyNameFromId(keyId.key))}) to ${getPlayerDisplayForConsole(client)}`);
logToConsole(LOG_DEBUG, `[AGRP.Event] Sending custom enter property key ID (${keyId.key}, ${toUpperCase(getKeyNameFromId(keyId.key))}) to ${getPlayerDisplayForConsole(client)}`);
sendPlayerEnterPropertyKey(client, keyId.key);
} else {
sendPlayerEnterPropertyKey(client, false);
@@ -209,7 +209,7 @@ function playerUsedKeyBind(client, key, duration = 0) {
return false;
}
logToConsole(LOG_DEBUG, `[VRR.KeyBind] ${getPlayerDisplayForConsole(client)} used keybind ${toUpperCase(getKeyNameFromId(key))} (${key})`);
logToConsole(LOG_DEBUG, `[AGRP.KeyBind] ${getPlayerDisplayForConsole(client)} used keybind ${toUpperCase(getKeyNameFromId(key))} (${key})`);
if (!doesPlayerHaveKeyBindsDisabled(client) && doesPlayerHaveKeyBindForKey(client, key)) {
let keyBindData = getPlayerKeyBindForKey(client, key);
if (keyBindData.enabled) {

View File

@@ -23,9 +23,13 @@ class LocaleData {
// ===========================================================================
let englishLocale = 0;
// ===========================================================================
function initLocaleScript() {
logToConsole(LOG_DEBUG, "[VRR.Locale]: Initializing locale script ...");
logToConsole(LOG_INFO, "[VRR.Locale]: Locale script initialized!");
logToConsole(LOG_DEBUG, "[AGRP.Locale]: Initializing locale script ...");
logToConsole(LOG_INFO, "[AGRP.Locale]: Locale script initialized!");
}
// ===========================================================================
@@ -35,9 +39,9 @@ function getLocaleString(client, stringName, ...args) {
return "";
}
let tempString = getRawLocaleString(stringName, getPlayerData(client).locale);
let tempString = getRawLocaleString(getPlayerData(client).locale, stringName);
if (tempString == "" || tempString == null || typeof tempString == "undefined") {
logToConsole(LOG_WARN, `[VRR.Locale] Locale string missing for ${stringName} on language ${getLocaleData(getPlayerData(client).locale).englishName}`);
logToConsole(LOG_WARN, `[AGRP.Locale] Locale string missing for ${stringName} on language ${getLocaleData(getPlayerData(client).locale).englishName}`);
submitBugReport(client, `(AUTOMATED REPORT) Locale string "${stringName}" is missing for "${getPlayerLocaleName(client)}"`);
return "";
}
@@ -52,9 +56,9 @@ function getLocaleString(client, stringName, ...args) {
// ===========================================================================
function getLanguageLocaleString(localeId, stringName, ...args) {
let tempString = getRawLocaleString(stringName, localeId);
let tempString = getRawLocaleString(localeId, stringName);
if (tempString == "" || tempString == null || typeof tempString == "undefined") {
logToConsole(LOG_WARN, `[VRR.Locale] Locale string missing for ${stringName} on language ${getLocaleData(localeId).englishName}`);
logToConsole(LOG_WARN, `[AGRP.Locale] Locale string missing for ${stringName} on language ${getLocaleData(localeId).englishName}`);
submitBugReport(null, `(AUTOMATED REPORT) Locale string "${stringName}" is missing for "${getLocaleData(localeId).englishName}"`);
return "";
}
@@ -68,12 +72,29 @@ function getLanguageLocaleString(localeId, stringName, ...args) {
// ===========================================================================
function getLanguageGroupedLocaleString(localeId, stringName, index, ...args) {
let tempString = getRawGroupedLocaleString(localeId, stringName, index);
if (tempString == "" || tempString == null || typeof tempString == "undefined") {
logToConsole(LOG_WARN, `[AGRP.Locale] Locale string missing for index ${index} of "${stringName}" on language ${getLocaleData(localeId).englishName}`);
submitBugReport(null, `(AUTOMATED REPORT) Locale string index ${index} of "${stringName}" is missing for "${getLocaleData(localeId).englishName}"`);
return "";
}
for (let i = 1; i <= args.length; i++) {
tempString = tempString.replace(`{${i}}`, args[i - 1]);
}
return tempString;
}
// ===========================================================================
function getGroupedLocaleString(client, stringName, index, ...args) {
if (client == null) {
return "";
}
let tempString = getRawGroupedLocaleString(stringName, getPlayerData(client).locale, index);
let tempString = getRawGroupedLocaleString(getPlayerData(client).locale, stringName, index);
for (let i = 1; i <= args.length; i++) {
tempString = tempString.replace(`{${i}}`, args[i - 1]);
@@ -84,9 +105,9 @@ function getGroupedLocaleString(client, stringName, index, ...args) {
// ===========================================================================
function getRawLocaleString(stringName, localeId) {
function getRawLocaleString(localeId, stringName) {
if (typeof getLocaleStrings()[localeId][stringName] == "undefined") {
logToConsole(LOG_WARN, `[VRR.Locale] Locale string missing for ${getLocaleStrings()[localeId][stringName]} on language ${getLocaleData(localeId).englishName}[${localeId}]`);
logToConsole(LOG_WARN, `[AGRP.Locale] Locale string missing for ${getLocaleStrings()[localeId][stringName]} on language ${getLocaleData(localeId).englishName}[${localeId}]`);
submitBugReport(null, `(AUTOMATED REPORT) Locale string is missing for "${getLocaleStrings()[localeId][stringName]}" on language ${getLocaleData(localeId).englishName}[${localeId}]`);
return "";
}
@@ -105,9 +126,9 @@ function getRawLocaleString(stringName, localeId) {
// ===========================================================================
function getRawGroupedLocaleString(stringName, localeId, index) {
function getRawGroupedLocaleString(localeId, stringName, index) {
if (typeof getLocaleStrings()[localeId][stringName][index] == "undefined") {
logToConsole(LOG_WARN, `[VRR.Locale] Grouped locale string missing for index ${index} of string ${getLocaleStrings()[localeId][stringName][index]} on language ${getLocaleData(localeId).englishName}[${localeId}]`);
logToConsole(LOG_WARN, `[AGRP.Locale] Grouped locale string missing for index ${index} of string ${getLocaleStrings()[localeId][stringName][index]} on language ${getLocaleData(localeId).englishName}[${localeId}]`);
submitBugReport(null, `(AUTOMATED REPORT) Grouped locale string is missing for index ${index} of string "${getLocaleStrings()[localeId][stringName][index]}" on language ${getLocaleData(localeId).englishName}[${localeId}]`);
return "";
}
@@ -143,7 +164,7 @@ function loadAllLocaleStrings() {
let locales = getGlobalConfig().locale.locales;
for (let i in locales) {
let localeData = locales[i];
let localeFile = JSON.parse(loadTextFile(`locale/${localeData.stringsFile}`));
let localeFile = JSON.parse(getContentsOfTextFile(`locale/${localeData.stringsFile}`));
tempLocaleStrings[i] = localeFile;
}
@@ -258,7 +279,7 @@ async function translateMessage(messageText, translateFrom = getGlobalConfig().l
}
}
let thisTranslationURL = getGlobalConfig().locale.translateURL.format(encodeURI(messageText), toUpperCase(getGlobalConfig().locale.locales[translateFrom].isoCode), toUpperCase(getGlobalConfig().locale.locales[translateTo].isoCode), getGlobalConfig().locale.apiEmail);
let thisTranslationURL = getGlobalConfig().locale.translateURL.format(encodeURIComponent(messageText), toUpperCase(getGlobalConfig().locale.locales[translateFrom].isoCode), toUpperCase(getGlobalConfig().locale.locales[translateTo].isoCode), getGlobalConfig().locale.apiEmail);
httpGet(
thisTranslationURL,
"",
@@ -274,4 +295,16 @@ async function translateMessage(messageText, translateFrom = getGlobalConfig().l
});
}
// ===========================================================================
function getLocaleFromCountryISO(isoCode = "US") {
for (let i in getLocales()) {
for (let j in getLocales()[i].countries) {
if (toLowerCase(getLocales()[i].countries[j]) == toLowerCase(isoCode)) {
return getLocales()[i].id;
}
}
}
}
// ===========================================================================

View File

@@ -9,8 +9,8 @@
// ===========================================================================
function initMessagingScript() {
logToConsole(LOG_INFO, "[VRR.Messaging]: Initializing messaging script ...");
logToConsole(LOG_INFO, "[VRR.Messaging]: Messaging script initialized successfully!");
logToConsole(LOG_INFO, "[AGRP.Messaging]: Initializing messaging script ...");
logToConsole(LOG_INFO, "[AGRP.Messaging]: Messaging script initialized successfully!");
}
// ===========================================================================
@@ -41,37 +41,31 @@ function announceAdminAction(localeString, ...args) {
function messagePlayerNormal(client, messageText, colour = COLOUR_WHITE) {
if (client != null) {
if (client.console) {
logToConsole(LOG_INFO, `${messageText}`);
logToConsole(LOG_INFO, `${removeColoursInMessage(messageText)}`);
return false;
}
}
//logToConsole(LOG_INFO, `${messageText}`);
//messageText = replaceColoursInMessage(messageText);
//if(client == null) {
// message(messageText, colour);
//} else {
// messageClient(messageText, client, colour);
//}
sendChatBoxMessageToPlayer(client, messageText, colour);
return true;
}
// ===========================================================================
function messageAdmins(messageText, colour = getColourByName("softRed")) {
function messageAdmins(messageText, announceToEventChannel = false) {
let clients = getClients();
for (let i in clients) {
if (doesPlayerHaveStaffPermission(clients[i], getStaffFlagValue("BasicModeration"))) {
messagePlayerNormal(clients[i], `🛡️ ${messageText}`, colour);
messagePlayerNormal(clients[i], `🛡️ ${messageText}`, getColourByName("white"));
}
}
let plainMessage = removeColoursInMessage(messageText);
messageDiscordAdminChannel(plainMessage);
if (announceToEventChannel == true) {
messageDiscordEventChannel(`🛡️ ${plainMessage}`);
}
}
// ===========================================================================
@@ -169,7 +163,7 @@ function messagePlayerDoAction(client, doingActionClient, messageText) {
// ===========================================================================
function messagePlayerMeAction(client, doingActionClient, messageText) {
messagePlayerNormal(client, `${getClientSubAccountName(doingActionClient)} ${messageText}`, getColourByType("meActionMessage"));
messagePlayerNormal(client, `${getCharacterFullName(doingActionClient)} ${messageText}`, getColourByType("meActionMessage"));
}
// ===========================================================================
@@ -181,7 +175,7 @@ function messagePlayerClanChat(client, clanChattingClient, messageText) {
// ===========================================================================
function messagePlayerAdminChat(client, adminChattingClient, messageText) {
messagePlayerNormal(client, `🛡️ [ADMIN CHAT] {ALTCOLOUR}${getPlayerData(adminChattingClient).accountData.staffTitle} [#CCCCCC]${getPlayerData(adminChattingClient).accountData.name}: {MAINCOLOUR}${messageText}`, getColourByType("orange"));
messagePlayerNormal(client, `🛡️ [ADMIN CHAT] {ALTCOLOUR}${getPlayerData(adminChattingClient).accountData.staffTitle} {lightGrey}${getPlayerData(adminChattingClient).accountData.name}: {MAINCOLOUR}${messageText}`, getColourByType("orange"));
}
// ===========================================================================
@@ -238,7 +232,28 @@ function messagePlayersInRace(raceId, message) {
// ===========================================================================
function messagePlayerPrivateMessage(toClient, fromClient, messageText) {
messagePlayerNormal(toClient, `{yellow}[DM] ${getCharacterFullName(fromClient)}{MAINCOLOUR}says: {ALTCOLOUR}${messageText}`);
messagePlayerNormal(toClient, `📥 {yellow}DM from ${getCharacterFullName(fromClient)}{MAINCOLOUR}: ${messageText}`);
messagePlayerNormal(fromClient, `📤 {yellow}DM to ${getCharacterFullName(toClient)}{MAINCOLOUR}: ${messageText}`);
}
// ===========================================================================
function showPlayerError(client, errorMessage, errorTitle = "Error") {
if (doesPlayerUseGUI(client)) {
showPlayerErrorGUI(client, errorMessage, errorTitle);
} else {
messagePlayerError(client, errorMessage);
}
}
// ===========================================================================
function showPlayerAlert(client, alertMessage, alertTitle = "Alert") {
if (doesPlayerUseGUI(client)) {
showPlayerInfoGUI(client, alertMessage, alertTitle);
} else {
messagePlayerAlert(client, alertMessage);
}
}
// ===========================================================================

View File

@@ -31,7 +31,7 @@ const AGRP_BLIP_EXIT = 6;
// ===========================================================================
// Ped States
const AGRP_PEDSTATE_NONE = 2; // None
const AGRP_PEDSTATE_NONE = 0; // None
const AGRP_PEDSTATE_READY = 1; // Ready
const AGRP_PEDSTATE_DRIVER = 2; // Driving a vehicle
const AGRP_PEDSTATE_PASSENGER = 3; // In a vehicle as passenger
@@ -47,11 +47,16 @@ const AGRP_PEDSTATE_INITEM = 12; // In item (crate, box, etc)
const AGRP_PEDSTATE_HANDSUP = 13; // Has hands up (surrendering)
const AGRP_PEDSTATE_SPAWNING = 14; // Spawning
// Property Types
const AGRP_PROPERTY_TYPE_NONE = 0; // None
const AGRP_PROPERTY_TYPE_BUSINESS = 1; // Business
const AGRP_PROPERTY_TYPE_HOUSE = 2; // House
// ===========================================================================
function initMiscScript() {
logToConsole(LOG_DEBUG, "[VRR.Misc]: Initializing misc script ...");
logToConsole(LOG_INFO, "[VRR.Misc]: Misc script initialized successfully!");
logToConsole(LOG_DEBUG, "[AGRP.Misc]: Initializing misc script ...");
logToConsole(LOG_INFO, "[AGRP.Misc]: Misc script initialized successfully!");
return true;
}
@@ -144,7 +149,7 @@ function setNewCharacterMoneyCommand(command, params, client) {
getServerConfig().newCharacter.cash = amount;
getServerConfig().needsSaved = true;
messagePlayerNormal(client, `The new character money has been set to $${amount}`);
messagePlayerNormal(client, `The new character money has been set to ${getCurrencyString(amount)}`);
return true;
}
@@ -200,80 +205,147 @@ function enterExitPropertyCommand(command, params, client) {
let isEntrance = false;
let isBusiness = false;
if (areServerElementsSupported()) {
if (!getPlayerData(client).currentPickup) {
return false;
}
// Make sure they aren't already trying to enter/exit a property
if (getPlayerData(client).pedState == AGRP_PEDSTATE_ENTERINGPROPERTY || getPlayerData(client).pedState == AGRP_PEDSTATE_EXITINGPROPERTY) {
messagePlayerError(client, getLocaleString(client, "UnableToDoThat"));
return false;
}
let ownerType = getEntityData(getPlayerData(client).currentPickup, "agrp.owner.type");
let ownerId = getEntityData(getPlayerData(client).currentPickup, "agrp.owner.id");
let position = getPlayerPosition(client);
let dimension = getPlayerDimension(client);
switch (ownerType) {
case AGRP_PICKUP_BUSINESS_ENTRANCE:
isBusiness = true;
isEntrance = true;
closestProperty = getServerData().businesses[ownerId];
break;
/*
// The player's currentPickup wasn't always being set. This prevented entering/exiting a property.
// Needs further testing and tweaks.
if (getPlayerData(client).currentPickup != null) {
if (getDistance(getPlayerData(client).currentPickup.position, getPlayerPosition(client)) <= 2) {
let ownerType = getEntityData(getPlayerData(client).currentPickup, "agrp.owner.type");
let ownerId = getEntityData(getPlayerData(client).currentPickup, "agrp.owner.id");
case AGRP_PICKUP_BUSINESS_EXIT:
isBusiness = true;
isEntrance = false;
closestProperty = getServerData().businesses[ownerId];
break;
switch (ownerType) {
case AGRP_PICKUP_BUSINESS_ENTRANCE:
isBusiness = true;
isEntrance = true;
closestProperty = getServerData().businesses[ownerId];
break;
case AGRP_PICKUP_HOUSE_ENTRANCE:
isBusiness = false;
isEntrance = true;
closestProperty = getServerData().houses[ownerId];
break;
case AGRP_PICKUP_BUSINESS_EXIT:
isBusiness = true;
isEntrance = false;
closestProperty = getServerData().businesses[ownerId];
break;
case AGRP_PICKUP_HOUSE_EXIT:
isBusiness = false;
isEntrance = false;
closestProperty = getServerData().houses[ownerId];
break;
case AGRP_PICKUP_HOUSE_ENTRANCE:
isBusiness = false;
isEntrance = true;
closestProperty = getServerData().houses[ownerId];
break;
default:
return false;
}
} else {
for (let i in getServerData().businesses) {
if (getPlayerDimension(client) == getGameConfig().mainWorldDimension[getGame()] && getPlayerInterior(client) == getGameConfig().mainWorldInterior[getGame()]) {
let businessId = getClosestBusinessEntrance(getPlayerPosition(client), getPlayerDimension(client));
isBusiness = true;
isEntrance = true;
closestProperty = getServerData().businesses[businessId];
} else {
let businessId = getClosestBusinessExit(getPlayerPosition(client), getPlayerDimension(client));
isBusiness = true;
isEntrance = false;
closestProperty = getServerData().businesses[businessId];
case AGRP_PICKUP_HOUSE_EXIT:
isBusiness = false;
isEntrance = false;
closestProperty = getServerData().houses[ownerId];
break;
default:
return false;
}
} else {
getPlayerData(client).currentPickup = null;
}
}
*/
for (let j in getServerData().houses) {
if (getPlayerDimension(client) == getGameConfig().mainWorldDimension[getGame()] && getPlayerInterior(client) == getGameConfig().mainWorldInterior[getGame()]) {
let houseId = getClosestHouseEntrance(getPlayerPosition(client), getPlayerDimension(client));
isBusiness = false;
isEntrance = true;
closestProperty = getServerData().businesses[houseId];
/*
// Check businesses first
if (closestProperty == null) {
let businessIndex = getClosestBusinessEntrance(getPlayerPosition(client), getPlayerDimension(client));
if (getDistance(getBusinessData(businessIndex).entrancePosition, getPlayerPosition(client)) <= 1.5) {
isBusiness = true;
isEntrance = true;
closestProperty = getServerData().businesses[businessIndex];
}
}
if (closestProperty == null) {
let businessIndex = getClosestBusinessExit(getPlayerPosition(client), getPlayerDimension(client));
if (getDistance(getBusinessData(businessIndex).exitPosition, getPlayerPosition(client)) <= 1.5) {
isBusiness = true;
isEntrance = false;
closestProperty = getServerData().businesses[businessIndex];
}
}
// Check houses second
if (closestProperty == null) {
let houseIndex = getClosestHouseEntrance(getPlayerPosition(client), getPlayerDimension(client));
if (getDistance(getHouseData(houseIndex).entrancePosition, getPlayerPosition(client)) <= 1.5) {
isBusiness = false;
isEntrance = true;
closestProperty = getServerData().houses[houseIndex];
}
}
if (closestProperty == null) {
let houseIndex = getClosestHouseExit(getPlayerPosition(client), getPlayerDimension(client));
if (getDistance(getHouseData(houseIndex).exitPosition, getPlayerPosition(client)) <= 1.5) {
isBusiness = false;
isEntrance = false;
closestProperty = getServerData().houses[houseIndex];
}
}
*/
// Check businesses first
if (closestProperty == null) {
for (let i in getServerData().businesses) {
if (getServerData().businesses[i].entranceDimension == dimension) {
if (getDistance(position, getServerData().businesses[i].entrancePosition) <= getGlobalConfig().enterPropertyDistance) {
isBusiness = true;
isEntrance = true;
closestProperty = getServerData().businesses[i];
}
} else {
let houseId = getClosestHouseExit(getPlayerPosition(client), getPlayerDimension(client));
isBusiness = false;
isEntrance = false;
closestProperty = getServerData().businesses[houseId];
if (getServerData().businesses[i].exitDimension == dimension) {
if (getDistance(position, getServerData().businesses[i].exitPosition) <= getGlobalConfig().exitPropertyDistance) {
isBusiness = true;
isEntrance = false;
closestProperty = getServerData().businesses[i];
}
}
}
}
}
if (closestProperty == null) {
for (let i in getServerData().houses) {
if (getServerData().houses[i].entranceDimension == dimension) {
if (getDistance(position, getServerData().houses[i].entrancePosition) <= getGlobalConfig().enterPropertyDistance) {
isBusiness = false;
isEntrance = true;
closestProperty = getServerData().houses[i];
}
} else {
if (getServerData().houses[i].exitDimension == dimension) {
if (getDistance(position, getServerData().houses[i].exitPosition) <= getGlobalConfig().exitPropertyDistance) {
isBusiness = false;
isEntrance = false;
closestProperty = getServerData().houses[i];
}
}
}
}
}
if (closestProperty == null) {
logToConsole(LOG_DEBUG, `${getPlayerDisplayForConsole(client)}'s closest door is null`);
return false;
}
logToConsole(LOG_DEBUG, `${getPlayerDisplayForConsole(client)}'s closest door is ${(isBusiness) ? closestProperty.name : closestProperty.description} ${(isEntrance) ? "entrance" : "exit"}`);
let englishId = getLocaleFromParams("English");
let typeString = (isBusiness) ? getLocaleString(client, "Business") : getLocaleString(client, "House");
let typeString = (isBusiness) ? getLanguageLocaleString(englishId, "Business") : getLanguageLocaleString(englishId, "House");
let nameString = (isBusiness) ? closestProperty.name : closestProperty.description;
if (isEntrance) {
@@ -290,43 +362,27 @@ function enterExitPropertyCommand(command, params, client) {
clearPlayerStateToEnterExitProperty(client);
getPlayerData(client).pedState = AGRP_PEDSTATE_ENTERINGPROPERTY;
getPlayerData(client).enteringExitingProperty = [(isBusiness) ? AGRP_PROPERTY_TYPE_BUSINESS : AGRP_PROPERTY_TYPE_HOUSE, closestProperty.index];
meActionToNearbyPlayers(client, getLanguageLocaleString(englishId, "EntersProperty", typeString, nameString));
if (closestProperty.exitScene != "" && isGameFeatureSupported("interiorScene")) {
getPlayerCurrentSubAccount(client).spawnPosition = closestProperty.exitPosition;
if (isMainWorldScene(closestProperty.exitScene) || closestProperty.exitScene == "AGRP.MAINWORLD") {
setPlayerScene(client, getGameConfig().mainWorldScene[getGame()]);
} else {
setPlayerScene(client, closestProperty.exitScene);
}
return false;
}
if (isFadeCameraSupported()) {
fadeCamera(client, false, 1.0);
}
setTimeout(function () {
setPlayerInCutsceneInterior(client, closestProperty.exitCutscene);
setPlayerDimension(client, closestProperty.exitDimension);
setPlayerInterior(client, closestProperty.exitInterior);
setPlayerPosition(client, closestProperty.exitPosition);
setPlayerHeading(client, closestProperty.exitRotation);
setTimeout(function () {
if (isFadeCameraSupported()) {
fadeCamera(client, true, 1.0);
}
updateInteriorLightsForPlayer(client, closestProperty.interiorLights);
}, 1000);
//setPlayerInCutsceneInterior(client, closestProperty.exitCutscene);
//updateAllInteriorVehiclesForPlayer(client, closestProperty.exitInterior, closestProperty.exitDimension);
processPlayerEnteringExitingProperty(client);
}, 1100);
if (isBusiness) {
if (closestProperty.type == AGRP_BIZ_TYPE_PAINTBALL) {
messagePlayerAlert(client, getLocaleString(client, "JoinedPaintBall"));
startPaintBall(client);
}
}
let radioStationIndex = closestProperty.streamingRadioStationIndex;
if (radioStationIndex != -1) {
if (getRadioStationData(radioStationIndex)) {
playRadioStreamForPlayer(client, getRadioStationData(radioStationIndex).url);
getPlayerData(client).streamingRadioStation = radioStationIndex;
}
}
return true;
}
} else {
@@ -335,69 +391,34 @@ function enterExitPropertyCommand(command, params, client) {
meActionToNearbyPlayers(client, getLocaleString(client, "EnterExitPropertyDoorLocked", (isBusiness) ? getLocaleString(client, "Business") : getLocaleString(client, "House")));
return false;
}
getPlayerData(client).pedState = AGRP_PEDSTATE_EXITINGPROPERTY;
clearPlayerStateToEnterExitProperty(client);
getPlayerData(client).pedState = AGRP_PEDSTATE_EXITINGPROPERTY;
getPlayerData(client).enteringExitingProperty = [(isBusiness) ? AGRP_PROPERTY_TYPE_BUSINESS : AGRP_PROPERTY_TYPE_HOUSE, closestProperty.index];
meActionToNearbyPlayers(client, getLanguageLocaleString(englishId, "ExitsProperty", typeString, nameString));
if (closestProperty.entranceScene != "" && isGameFeatureSupported("interiorScene")) {
getPlayerCurrentSubAccount(client).spawnPosition = closestProperty.entrancePosition;
if (isMainWorldScene(closestProperty.entranceScene) || closestProperty.entranceScene == "AGRP.MAINWORLD") {
setPlayerScene(client, getGameConfig().mainWorldScene[getGame()]);
} else {
setPlayerScene(client, closestProperty.entranceScene);
}
return false;
}
if (isFadeCameraSupported()) {
fadeCamera(client, false, 1.0);
}
disableCityAmbienceForPlayer(client, true);
setTimeout(function () {
setPlayerInCutsceneInterior(client, closestProperty.entranceCutscene);
setPlayerPosition(client, closestProperty.entrancePosition);
setPlayerHeading(client, closestProperty.entranceRotation);
setPlayerDimension(client, closestProperty.entranceDimension);
setPlayerInterior(client, closestProperty.entranceInterior);
setTimeout(function () {
if (isFadeCameraSupported()) {
fadeCamera(client, true, 1.0);
}
updateInteriorLightsForPlayer(client, true);
}, 1000);
processPlayerEnteringExitingProperty(client);
}, 1100);
if (isBusiness) {
if (closestProperty.type == AGRP_BIZ_TYPE_PAINTBALL) {
messagePlayerAlert(client, getLocaleString(client, "LeftPaintBall"));
stopPaintBall(client);
}
}
clearLocalPickupsForPlayer(client);
//setPlayerInCutsceneInterior(client, closestProperty.entranceCutscene);
stopRadioStreamForPlayer(client);
getPlayerData(client).streamingRadioStation = -1;
// Check if exiting property was into another house/business and set radio station accordingly
let inHouse = getPlayerHouse(client);
let inBusiness = getPlayerBusiness(client);
if (inBusiness != -1) {
if (getBusinessData(inBusiness).streamingRadioStationIndex != -1) {
if (getRadioStationData(getBusinessData(inBusiness).streamingRadioStationIndex)) {
playRadioStreamForPlayer(client, getRadioStationData(getBusinessData(inBusiness).streamingRadioStationIndex).url);
getPlayerData(client).streamingRadioStation = getBusinessData(inBusiness).streamingRadioStationIndex;
}
}
} else if (inHouse != -1) {
if (getHouseData(inHouse).streamingRadioStationIndex != -1) {
if (getRadioStationData(getHouseData(inHouse).streamingRadioStationIndex)) {
playRadioStreamForPlayer(client, getRadioStationData(getHouseData(inHouse).streamingRadioStationIndex).url);
getPlayerData(client).streamingRadioStation = getHouseData(inHouse).streamingRadioStationIndex;
}
}
}
//logToConsole(LOG_DEBUG, `[VRR.Misc] ${getPlayerDisplayForConsole(client)} exited business ${inBusiness.name}[${inBusiness.index}/${inBusiness.databaseId}]`);
return true;
}
}
//logToConsole(LOG_DEBUG, `[AGRP.Misc] ${getPlayerDisplayForConsole(client)} exited business ${inBusiness.name}[${inBusiness.index}/${inBusiness.databaseId}]`);
return true;
}
@@ -446,16 +467,16 @@ function getPlayerInfoCommand(command, params, client) {
["Account", `${getPlayerData(targetClient).accountData.name}{mediumGrey}[${getPlayerData(targetClient).accountData.databaseId}]{ALTCOLOUR}`],
["Character", `${getCharacterFullName(targetClient)}{mediumGrey}[${getPlayerCurrentSubAccount(targetClient).databaseId}]{ALTCOLOUR}`],
["Connected", `${getTimeDifferenceDisplay(getCurrentUnixTimestamp(), getPlayerData(targetClient).connectTime)} ago`],
["Registered", `${registerDate.toLocaleDateString()} - ${registerDate.toLocaleTimeString()}`],
["Registered", `${registerDate.toLocaleDateString()}`],
["Game Version", `${targetClient.gameVersion}`],
["Script Version", `${scriptVersion}`],
["Client Version", `${getPlayerData(targetClient).clientVersion}`],
["Client Version", `${getPlayerData(targetClient).clientVersion}`],
["Cash", `$${getPlayerCurrentSubAccount(client).cash}`],
["Skin", `${skinName}{mediumGrey}[${skinModel}]{ALTCOLOUR}`],
["Cash", `${getCurrencyString(getPlayerCurrentSubAccount(client).cash)}`],
["Skin", `${skinName}{mediumGrey}[Model: ${skinModel}/Index: ${skinIndex}]{ALTCOLOUR}`],
["Clan", `${clan}`],
["Job", `${job}`],
["Current Date", `${currentDate.toLocaleDateString()} - ${currentDate.toLocaleTimeString()}`],
["Current Date", `${currentDate.toLocaleDateString()}`],
]
let stats = tempStats.map(stat => `{MAINCOLOUR}${stat[0]}: {ALTCOLOUR}${stat[1]} {MAINCOLOUR}`);
@@ -500,11 +521,11 @@ function checkPlayerSpawning() {
// ===========================================================================
function showPlayerPrompt(client, promptMessage, promptTitle, yesButtonText, noButtonText) {
if (canPlayerUseGUI(client)) {
if (doesPlayerUseGUI(client)) {
showPlayerPromptGUI(client, promptMessage, promptTitle, yesButtonText, noButtonText);
} else {
messagePlayerNormal(client, ` ${promptMessage} `);
messagePlayerInfo(client, getLocaleString(client, "PromptResponseTip", `{ ALTCOLOUR } /yes{MAINCOLOUR}`, `{ALTCOLOUR}/no{ MAINCOLOUR } `));
messagePlayerNormal(client, `🛎️ ${promptMessage} `);
messagePlayerInfo(client, getLocaleString(client, "PromptResponseTip", `{ALTCOLOUR}/yes{MAINCOLOUR}`, `{ALTCOLOUR}/no{MAINCOLOUR}`));
}
}
@@ -547,7 +568,7 @@ function listOnlineAdminsCommand(command, params, client) {
if (getPlayerData(clients[i])) {
if (typeof getPlayerData(clients[i]).accountData.flags.admin != "undefined") {
if (getPlayerData(clients[i]).accountData.flags.admin > 0 || getPlayerData(clients[i]).accountData.flags.admin == -1) {
admins.push(`{ ALTCOLOUR } [${getPlayerData(clients[i]).accountData.staffTitle}] { MAINCOLOUR }${getCharacterFullName(clients[i])} `);
admins.push(`{ALTCOLOUR}[${getPlayerData(clients[i]).accountData.staffTitle}]{MAINCOLOUR} ${getCharacterFullName(clients[i])}`);
}
}
}
@@ -904,9 +925,7 @@ function processPlayerDeath(client) {
updatePlayerSpawnedState(client, false);
setPlayerControlState(client, false);
setTimeout(function () {
if (isFadeCameraSupported()) {
fadeCamera(client, false, 1.0);
}
fadePlayerCamera(client, false, 1000);
setTimeout(function () {
if (isPlayerInPaintBall(client)) {
respawnPlayerForPaintBall(client);
@@ -921,15 +940,9 @@ function processPlayerDeath(client) {
stopWorking(client);
}
if (getGame() == AGRP_GAME_MAFIA_ONE) {
spawnPlayer(client, getGameConfig().skins[getGame()][getPlayerCurrentSubAccount(client).skin][0], closestJail.position, closestJail.heading);
} else {
spawnPlayer(client, closestJail.position, closestJail.heading, getGameConfig().skins[getGame()][getPlayerCurrentSubAccount(client).skin][0]);
}
spawnPlayer(client, closestJail.position, closestJail.heading, getGameConfig().skins[getGame()][getPlayerCurrentSubAccount(client).skin][0]);
if (isFadeCameraSupported()) {
fadeCamera(client, true, 1.0);
}
fadePlayerCamera(client, true, 1000);
updatePlayerSpawnedState(client, true);
makePlayerStopAnimation(client);
setPlayerControlState(client, true);
@@ -944,16 +957,8 @@ function processPlayerDeath(client) {
stopWorking(client);
}
if (getGame() == AGRP_GAME_MAFIA_ONE) {
spawnPlayer(client, getGameConfig().skins[getGame()][getPlayerCurrentSubAccount(client).skin][0], closestHospital.position, closestHospital.heading);
} else {
spawnPlayer(client, closestHospital.position, closestHospital.heading, getGameConfig().skins[getGame()][getPlayerCurrentSubAccount(client).skin][0]);
}
if (isFadeCameraSupported()) {
fadeCamera(client, true, 1.0);
}
spawnPlayer(client, closestHospital.position, closestHospital.heading, getGameConfig().skins[getGame()][getPlayerCurrentSubAccount(client).skin][0]);
fadePlayerCamera(client, true, 1000);
updatePlayerSpawnedState(client, true);
makePlayerStopAnimation(client);
setPlayerControlState(client, true);
@@ -987,4 +992,22 @@ function isPlayerRestrained(client) {
return (getPlayerData(client).pedState == AGRP_PEDSTATE_BINDED);
}
// ===========================================================================
function getPlayerInPropertyData(client) {
let businessId = getPlayerBusiness(client);
if (businessId != -1) {
getPlayerData(client).inProperty = [AGRP_PROPERTY_TYPE_BUSINESS, businessId];
return false;
}
let houseId = getPlayerHouse(client);
if (houseId != -1) {
getPlayerData(client).inProperty = [AGRP_PROPERTY_TYPE_HOUSE, houseId];
return false;
}
getPlayerData(client).inProperty = null;
}
// ===========================================================================

View File

@@ -24,18 +24,18 @@ let builtInCommands = [
// ===========================================================================
let disconnectReasons = [
"Lost Connection",
"LostConnection",
"Disconnected",
"Unsupported Client",
"Wrong Game",
"Incorrect Password",
"Unsupported Executable",
"UnsupportedClient",
"WrongGame",
"IncorrectPassword",
"UnsupportedExecutable",
"Disconnected",
"Banned",
"Failed",
"Invalid Name",
"InvalidName",
"Crashed",
"Modified Game"
"ModifiedGame"
];
// ===========================================================================
@@ -193,9 +193,9 @@ function getVehicleHeading(vehicle) {
// ===========================================================================
function setVehicleHeading(vehicle, heading) {
if (getGame() == AGRP_GAME_GTA_IV) {
return sendNetworkEventToPlayer("agrp.vehPosition", null, getVehicleForNetworkEvent(vehicle), heading);
}
//if (getGame() == AGRP_GAME_GTA_IV) {
// return sendNetworkEventToPlayer("agrp.vehPosition", null, getVehicleForNetworkEvent(vehicle), heading);
//}
return vehicle.heading = heading;
}
@@ -227,12 +227,12 @@ function getVehicleSyncer(vehicle) {
// ===========================================================================
function getVehicleForNetworkEvent(vehicle) {
if (getGame() == AGRP_GAME_GTA_IV) {
if (getVehicleData(vehicle).ivNetworkId != -1) {
return getVehicleData(vehicle).ivNetworkId;
}
return -1;
}
//if (getGame() == AGRP_GAME_GTA_IV) {
// if (getVehicleData(vehicle).ivNetworkId != -1) {
// return getVehicleData(vehicle).ivNetworkId;
// }
// return -1;
//}
return vehicle.id;
}
@@ -490,6 +490,15 @@ function createGamePickup(modelIndex, position, type) {
// ===========================================================================
function createGameDummyElement(position) {
if (!isGameFeatureSupported("dummyElement")) {
return false;
}
return game.createDummy(position);
}
// ===========================================================================
function createGameBlip(position, type = 0, size = 1, colour = toColour(255, 255, 255, 255)) {
if (!isGameFeatureSupported("blip")) {
return false;
@@ -565,97 +574,75 @@ function isVehicleObject(vehicle) {
// ===========================================================================
function repairVehicle(vehicleIndex) {
if (areServerElementsSupported()) {
getElementFromId(vehicleIndex).vehicle.fix();
} else {
sendNetworkEventToPlayer("agrp.veh.fix", null, vehicleIndex);
function repairVehicle(vehicle) {
vehicle.fix();
}
// ===========================================================================
function setVehicleLights(vehicle, lights) {
setEntityData(vehicle, "agrp.lights", lights, true);
sendNetworkEventToPlayer("agrp.veh.lights", null, vehicle.id, lights);
}
// ===========================================================================
function setVehicleEngine(vehicle, engine) {
//vehicle.engine = engine;
setEntityData(vehicle, "agrp.engine", engine, true);
sendNetworkEventToPlayer("agrp.veh.engine", null, vehicle.id, engine);
}
// ===========================================================================
function setVehicleLocked(vehicle, locked) {
vehicle.locked = locked;
setEntityData(vehicle, "agrp.locked", locked, true);
sendNetworkEventToPlayer("agrp.veh.locked", null, vehicle.id, locked);
}
// ===========================================================================
function setVehicleSiren(vehicle, siren) {
vehicle.siren = siren;
}
// ===========================================================================
function getVehicleLights(vehicle) {
return vehicle.lights;
}
// ===========================================================================
function getVehicleEngine(vehicle) {
return vehicle.engine;
}
// ===========================================================================
function getVehicleLocked(vehicle) {
return vehicle.lockedStatus;
}
// ===========================================================================
function getVehicleSiren(vehicle) {
return vehicle.siren;
}
// ===========================================================================
function setVehicleColours(vehicle, colour1, colour2, colour3 = -1, colour4 = -1) {
vehicle.colour1 = colour1;
vehicle.colour2 = colour2;
if (colour3 != -1) {
vehicle.colour3 = colour3;
}
}
// ===========================================================================
function setVehicleLights(vehicleIndex, lights) {
if (areServerElementsSupported()) {
setEntityData(getElementFromId(vehicleIndex), "agrp.lights", lights, true);
sendNetworkEventToPlayer("agrp.veh.lights", null, vehicleIndex, lights);
} else {
sendNetworkEventToPlayer("agrp.veh.lights", null, vehicleIndex, lights);
}
}
// ===========================================================================
function setVehicleEngine(vehicleIndex, engine) {
if (areServerElementsSupported()) {
getElementFromId(vehicleIndex).engine = engine;
setEntityData(getElementFromId(vehicleIndex), "agrp.engine", engine, true);
} else {
sendNetworkEventToPlayer("agrp.veh.engine", null, vehicleIndex, engine);
}
}
// ===========================================================================
function setVehicleLocked(vehicleIndex, locked) {
if (areServerElementsSupported()) {
getElementFromId(vehicleIndex).vehicle.locked = locked;
} else {
sendNetworkEventToPlayer("agrp.veh.locked", null, vehicleIndex, locked);
}
}
// ===========================================================================
function setVehicleSiren(vehicleIndex, siren) {
if (areServerElementsSupported()) {
getVehicleData(vehicleIndex).vehicle.siren = siren;
} else {
sendNetworkEventToPlayer("agrp.veh.siren", null, vehicleIndex, siren);
}
}
// ===========================================================================
function getVehicleLights(vehicleIndex) {
return getVehicleData(vehicleIndex).lights;
}
// ===========================================================================
function getVehicleEngine(vehicleIndex) {
return getVehicleData(vehicleIndex).engine;
}
// ===========================================================================
function getVehicleLocked(vehicleIndex) {
return getVehicleData(vehicleIndex).locked;
}
// ===========================================================================
function getVehicleSiren(vehicleIndex) {
return getVehicleData(vehicleIndex).siren;
}
// ===========================================================================
function setVehicleColours(vehicleIndex, colour1, colour2, colour3 = -1, colour4 = -1) {
if (areServerElementsSupported()) {
getVehicleData(vehicleIndex).vehicle.colour1 = colour1;
getVehicleData(vehicleIndex).vehicle.colour2 = colour2;
if (colour3 != -1) {
getVehicleData(vehicleIndex).vehicle.colour3 = colour3;
}
if (colour4 != -1) {
getVehicleData(vehicleIndex).vehicle.colour4 = colour4;
}
} else {
sendNetworkEventToPlayer("agrp.veh.colours", null, vehicleIndex, colour1, colour2, colour3, colour4);
if (colour4 != -1) {
vehicle.colour4 = colour4;
}
}
@@ -734,7 +721,7 @@ function setPlayerFightStyle(client, fightStyleId) {
return false;
}
if (!isGameFeatureSupported("fightStyles")) {
if (!areFightStylesSupported()) {
return false;
}
@@ -835,24 +822,24 @@ function getPlayerWeapon(client) {
function connectToDatabase() {
if (getDatabaseConfig().usePersistentConnection) {
if (persistentDatabaseConnection == null) {
logToConsole(LOG_DEBUG, `[VRR.Database] Initializing database connection ...`);
logToConsole(LOG_DEBUG, `[AGRP.Database] Initializing database connection ...`);
persistentDatabaseConnection = module.mysql.connect(getDatabaseConfig().host, getDatabaseConfig().user, getDatabaseConfig().pass, getDatabaseConfig().name, getDatabaseConfig().port);
if (persistentDatabaseConnection.error) {
logToConsole(LOG_ERROR, `[VRR.Database] Database connection error: ${persistentDatabaseConnection.error}`);
logToConsole(LOG_ERROR, `[AGRP.Database] Database connection error: ${persistentDatabaseConnection.error}`);
persistentDatabaseConnection = null;
return false;
}
logToConsole(LOG_DEBUG, `[VRR.Database] Database connection successful!`);
logToConsole(LOG_DEBUG, `[AGRP.Database] Database connection successful!`);
return persistentDatabaseConnection;
} else {
logToConsole(LOG_DEBUG, `[VRR.Database] Using existing database connection.`);
logToConsole(LOG_DEBUG, `[AGRP.Database] Using existing database connection.`);
return persistentDatabaseConnection;
}
} else {
let databaseConnection = module.mysql.connect(getDatabaseConfig().host, getDatabaseConfig().user, getDatabaseConfig().pass, getDatabaseConfig().name, getDatabaseConfig().port);
if (databaseConnection.error) {
logToConsole(LOG_ERROR, `[VRR.Database] Database connection error: ${persistentDatabaseConnection.error}`);
logToConsole(LOG_ERROR, `[AGRP.Database] Database connection error: ${persistentDatabaseConnection.error}`);
return false;
} else {
return databaseConnection;
@@ -866,9 +853,9 @@ function disconnectFromDatabase(dbConnection, force = false) {
if (!getDatabaseConfig().usePersistentConnection || force == true) {
try {
dbConnection.close();
logToConsole(LOG_DEBUG, `[VRR.Database] Database connection closed successfully`);
logToConsole(LOG_DEBUG, `[AGRP.Database] Database connection closed successfully`);
} catch (error) {
logToConsole(LOG_ERROR, `[VRR.Database] Database connection could not be closed! (Error: ${error})`);
logToConsole(LOG_ERROR, `[AGRP.Database] Database connection could not be closed! (Error: ${error})`);
}
}
return true;
@@ -877,7 +864,7 @@ function disconnectFromDatabase(dbConnection, force = false) {
// ===========================================================================
function queryDatabase(dbConnection, queryString, useThread = false) {
logToConsole(LOG_DEBUG, `[VRR.Database] Query string: ${queryString}`);
logToConsole(LOG_DEBUG, `[AGRP.Database] Query string: ${queryString}`);
if (useThread == true) {
Promise.resolve().then(() => {
let queryResult = dbConnection.query(queryString);
@@ -930,8 +917,18 @@ function freeDatabaseQuery(dbQuery) {
// ===========================================================================
function fetchQueryAssoc(dbQuery) {
return dbQuery.fetchAssoc();
async function fetchQueryAssoc(dbConnection, dbQueryString) {
//logToConsole(LOG_DEBUG, dbQueryString);
let dbQuery = dbConnection.query(dbQueryString);
let assocArray = [];
let dbAssoc = null;
while (dbAssoc = dbQuery.fetchAssoc()) {
assocArray.push(dbAssoc);
//logToConsole(LOG_DEBUG | LOG_WARN, dbAssoc["svr_id"]);
}
return assocArray;
}
// ===========================================================================
@@ -940,19 +937,19 @@ function quickDatabaseQuery(queryString) {
let dbConnection = connectToDatabase();
let insertId = 0;
if (dbConnection) {
//logToConsole(LOG_DEBUG, `[VRR.Database] Query string: ${queryString}`);
//logToConsole(LOG_DEBUG, `[AGRP.Database] Query string: ${queryString}`);
let dbQuery = queryDatabase(dbConnection, queryString);
if (getDatabaseInsertId(dbConnection)) {
insertId = getDatabaseInsertId(dbConnection);
logToConsole(LOG_DEBUG, `[VRR.Database] Query returned insert id ${insertId}`);
logToConsole(LOG_DEBUG, `[AGRP.Database] Query returned insert id ${insertId}`);
}
if (dbQuery) {
try {
freeDatabaseQuery(dbQuery);
logToConsole(LOG_DEBUG, `[VRR.Database] Query result free'd successfully`);
logToConsole(LOG_DEBUG, `[AGRP.Database] Query result free'd successfully`);
} catch (error) {
logToConsole(LOG_ERROR, `[VRR.Database] Query result could not be free'd! (Error: ${error})`);
logToConsole(LOG_ERROR, `[AGRP.Database] Query result could not be free'd! (Error: ${error})`);
}
}
@@ -1004,9 +1001,9 @@ function setConstantsAsGlobalVariablesInDatabase() {
let dbConnection = connectToDatabase();
let entries = Object.entries(global);
for (let i in entries) {
logToConsole(LOG_DEBUG, `[VRR.Database] Checking entry ${i} (${entries[i]})`);
logToConsole(LOG_DEBUG, `[AGRP.Database] Checking entry ${i} (${entries[i]})`);
if (toString(i).slice(0, 3).indexOf("AGRP_") != -1) {
logToConsole(LOG_DEBUG, `[VRR.Database] Adding ${i} (${entries[i]}) to database global variables`);
logToConsole(LOG_DEBUG, `[AGRP.Database] Adding ${i} (${entries[i]}) to database global variables`);
}
}
}
@@ -1128,18 +1125,15 @@ function getClosestCivilian(position) {
// ===========================================================================
function getVehiclesInRange(position, range) {
if (!areServerElementsSupported()) {
return getServerData().vehicles.filter(x => getDistance(position, x.syncPosition) <= distance);
}
//if (getGame() == AGRP_GAME_GTA_IV) {
// return getServerData().vehicles.reduce((i, j) => (getDistance(position, i.syncPosition) <= getDistance(position, j.syncPosition)) ? i : j);
//}
return getElementsByTypeInRange(ELEMENT_VEHICLE, position, range);
}
// ===========================================================================
function getClosestVehicle(position) {
if (!areServerElementsSupported()) {
getServerData().vehicles.reduce((i, j) => (getDistance(position, i.syncPosition) <= getDistance(position, j.syncPosition)) ? i : j);
}
return getClosestElementByType(ELEMENT_VEHICLE, position);
}
@@ -1194,7 +1188,7 @@ function setVehicleHealth(vehicle, health) {
// ===========================================================================
function givePlayerWeapon(client, weaponId, ammo, active = true) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending signal to ${getPlayerDisplayForConsole(client)} to give weapon (Weapon: ${weaponId}, Ammo: ${ammo})`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending signal to ${getPlayerDisplayForConsole(client)} to give weapon (Weapon: ${weaponId}, Ammo: ${ammo})`);
sendNetworkEventToPlayer("agrp.giveWeapon", client, weaponId, ammo, active);
}
@@ -1231,16 +1225,40 @@ function setElementStreamOutDistance(element, distance) {
// ===========================================================================
function getElementStreamInDistance(element) {
if (!isNull(element) && element != false) {
if (typeof element == "Entity") {
if (typeof element.streamInDistance != "undefined") {
return element.streamInDistance;
}
}
}
}
// ===========================================================================
function getElementStreamOutDistance(element) {
if (!isNull(element) && element != false) {
if (typeof element == "Entity") {
if (typeof element.streamOutDistance != "undefined") {
return element.streamOutDistance;
}
}
}
}
// ===========================================================================
function getPlayerPed(client) {
if (isNull(client)) {
return null;
}
if (getGame() == AGRP_GAME_GTA_IV) {
return getPlayerData(client).ped;
} else {
return client.player;
}
//if (getGame() == AGRP_GAME_GTA_IV) {
// return getPlayerData(client).ped;
//} else {
return client.player;
//}
}
// ===========================================================================
@@ -1494,4 +1512,22 @@ function setServerPassword(password) {
server.setPassword(password);
}
// ===========================================================================
function shutdownServer() {
server.shutdown();
}
// ===========================================================================
function getContentsOfTextFile(filePath) {
return loadTextFile(filePath);
}
// ===========================================================================
function setServerRule(ruleName, ruleValue) {
server.setRule(ruleName, ruleValue);
}
// ===========================================================================

View File

@@ -3,39 +3,14 @@
// https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// ===========================================================================
// FILE: connected.js
// DESC: Provides wrapped natives for GTA Connected and Mafia Connected mods
// FILE: ragemp.js
// DESC: Provides wrapped natives for RAGEMP
// TYPE: Server (JavaScript)
// ===========================================================================
var fs = require('fs');
let builtInCommands = [
"refresh",
"restart",
"stop",
"start",
"reconnect",
"setname",
"connect",
"disconnect",
"say",
"dumpdoc",
];
// ===========================================================================
let disconnectReasons = [
"Lost Connection",
"Disconnected",
"Unsupported Client",
"Wrong Game",
"Incorrect Password",
"Unsupported Executable",
"Disconnected",
"Banned",
"Failed",
"Invalid Name",
"Crashed",
"Modified Game"
];
// ===========================================================================
@@ -760,24 +735,24 @@ function getPlayerWeapon(client) {
function connectToDatabase() {
if (getDatabaseConfig().usePersistentConnection) {
if (persistentDatabaseConnection == null) {
logToConsole(LOG_DEBUG, `[VRR.Database] Initializing database connection ...`);
logToConsole(LOG_DEBUG, `[AGRP.Database] Initializing database connection ...`);
persistentDatabaseConnection = module.mysql.connect(getDatabaseConfig().host, getDatabaseConfig().user, getDatabaseConfig().pass, getDatabaseConfig().name, getDatabaseConfig().port);
if (persistentDatabaseConnection.error) {
logToConsole(LOG_ERROR, `[VRR.Database] Database connection error: ${persistentDatabaseConnection.error}`);
logToConsole(LOG_ERROR, `[AGRP.Database] Database connection error: ${persistentDatabaseConnection.error}`);
persistentDatabaseConnection = null;
return false;
}
logToConsole(LOG_DEBUG, `[VRR.Database] Database connection successful!`);
logToConsole(LOG_DEBUG, `[AGRP.Database] Database connection successful!`);
return persistentDatabaseConnection;
} else {
logToConsole(LOG_DEBUG, `[VRR.Database] Using existing database connection.`);
logToConsole(LOG_DEBUG, `[AGRP.Database] Using existing database connection.`);
return persistentDatabaseConnection;
}
} else {
let databaseConnection = module.mysql.connect(getDatabaseConfig().host, getDatabaseConfig().user, getDatabaseConfig().pass, getDatabaseConfig().name, getDatabaseConfig().port);
if (databaseConnection.error) {
logToConsole(LOG_ERROR, `[VRR.Database] Database connection error: ${persistentDatabaseConnection.error}`);
logToConsole(LOG_ERROR, `[AGRP.Database] Database connection error: ${persistentDatabaseConnection.error}`);
return false;
} else {
return databaseConnection;
@@ -791,9 +766,9 @@ function disconnectFromDatabase(dbConnection) {
if (!getDatabaseConfig().usePersistentConnection) {
try {
dbConnection.close();
logToConsole(LOG_DEBUG, `[VRR.Database] Database connection closed successfully`);
logToConsole(LOG_DEBUG, `[AGRP.Database] Database connection closed successfully`);
} catch (error) {
logToConsole(LOG_ERROR, `[VRR.Database] Database connection could not be closed! (Error: ${error})`);
logToConsole(LOG_ERROR, `[AGRP.Database] Database connection could not be closed! (Error: ${error})`);
}
}
return true;
@@ -802,7 +777,7 @@ function disconnectFromDatabase(dbConnection) {
// ===========================================================================
function queryDatabase(dbConnection, queryString, useThread = false) {
logToConsole(LOG_DEBUG, `[VRR.Database] Query string: ${queryString}`);
logToConsole(LOG_DEBUG, `[AGRP.Database] Query string: ${queryString}`);
if (useThread == true) {
Promise.resolve().then(() => {
let queryResult = dbConnection.query(queryString);
@@ -865,19 +840,19 @@ function quickDatabaseQuery(queryString) {
let dbConnection = connectToDatabase();
let insertId = 0;
if (dbConnection) {
//logToConsole(LOG_DEBUG, `[VRR.Database] Query string: ${queryString}`);
//logToConsole(LOG_DEBUG, `[AGRP.Database] Query string: ${queryString}`);
let dbQuery = queryDatabase(dbConnection, queryString);
if (getDatabaseInsertId(dbConnection)) {
insertId = getDatabaseInsertId(dbConnection);
logToConsole(LOG_DEBUG, `[VRR.Database] Query returned insert id ${insertId}`);
logToConsole(LOG_DEBUG, `[AGRP.Database] Query returned insert id ${insertId}`);
}
if (dbQuery) {
try {
freeDatabaseQuery(dbQuery);
logToConsole(LOG_DEBUG, `[VRR.Database] Query result free'd successfully`);
logToConsole(LOG_DEBUG, `[AGRP.Database] Query result free'd successfully`);
} catch (error) {
logToConsole(LOG_ERROR, `[VRR.Database] Query result could not be free'd! (Error: ${error})`);
logToConsole(LOG_ERROR, `[AGRP.Database] Query result could not be free'd! (Error: ${error})`);
}
}
@@ -1014,7 +989,7 @@ function setVehicleHealth(vehicle, health) {
// ===========================================================================
function givePlayerWeapon(client, weaponId, ammo, active = true) {
//logToConsole(LOG_DEBUG, `[VRR.Client] Sending signal to ${getPlayerDisplayForConsole(client)} to give weapon (Weapon: ${weaponId}, Ammo: ${ammo})`);
//logToConsole(LOG_DEBUG, `[AGRP.Client] Sending signal to ${getPlayerDisplayForConsole(client)} to give weapon (Weapon: ${weaponId}, Ammo: ${ammo})`);
//sendNetworkEventToPlayer("agrp.giveWeapon", client, weaponId, ammo, active);
client.giveWeapon(weaponId, ammo);
}
@@ -1223,36 +1198,35 @@ function bindServerEventHandler(eventName, bindTo, handlerFunction) {
});
}
// ===========================================================================
function setElementName(element, name) {
element.name = name;
//element.name = name;
}
// ===========================================================================
function hideElementForPlayer(element, client) {
element.setExistsFor(client, false);
//element.setExistsFor(client, false);
}
// ===========================================================================
function showElementForPlayer(element, client) {
element.setExistsFor(client, true);
//element.setExistsFor(client, true);
}
// ===========================================================================
function setElementShownByDefault(element, state) {
element.netFlags.defaultExistance = state;
//element.netFlags.defaultExistance = state;
}
// ===========================================================================
function createAttachedGameBlip(element, type, size, colour = toColour(255, 255, 255, 255)) {
if (isGameFeatureSupported("attachedBlip")) {
return game.createBlipAttachedTo(element, type, size, colour, true, false);
// return game.createBlipAttachedTo(element, type, size, colour, true, false);
}
}
@@ -1264,7 +1238,11 @@ function deletePlayerPed(client) {
} else {
sendNetworkEventToPlayer("agrp.deleteLocalPlayerPed", client);
}
//if (areServerElementsSupported()) {
// destroyElement(client.player);
//} else {
// sendNetworkEventToPlayer("agrp.deleteLocalPlayerPed", client);
//}
}
// ===========================================================================
@@ -1276,13 +1254,31 @@ function isPlayerOnBoat(client) {
// ===========================================================================
function setServerName(name) {
server.name = name;
//server.name = name;
}
// ===========================================================================
function setServerPassword(password) {
server.setPassword(password);
//server.setPassword(password);
}
// ===========================================================================
// ===========================================================================
function setServerRule(ruleName, ruleValue) {
//server.setRule(ruleName, ruleValue);
}
// ===========================================================================
async function getContentsOfTextFile(filePath) {
let fileContents = fs.readFile(filePath, 'utf8', function (err, data) {
if (err) {
console.error("Could not open file: %s", err);
} else {
return data;
}
});
}
// ===========================================================================

View File

@@ -9,14 +9,14 @@
// ===========================================================================
function initNetworkEventsScript() {
logToConsole(LOG_DEBUG, "[VRR.NetEvents]: Initializing network events script ...");
logToConsole(LOG_INFO, "[VRR.NetEvents]: Network events script initialized!");
logToConsole(LOG_DEBUG, "[AGRP.NetEvents]: Initializing network events script ...");
logToConsole(LOG_INFO, "[AGRP.NetEvents]: Network events script initialized!");
}
// ===========================================================================
function addAllNetworkEventHandlers() {
logToConsole(LOG_DEBUG, "[VRR.Client]: Adding network handlers ...");
logToConsole(LOG_DEBUG, "[AGRP.Client]: Adding network handlers ...");
// KeyBind
addNetworkEventHandler("agrp.useKeyBind", playerUsedKeyBind);
@@ -74,21 +74,20 @@ function addAllNetworkEventHandlers() {
addNetworkEventHandler("agrp.vehBuyState", receiveVehiclePurchaseStateUpdateFromClient);
addNetworkEventHandler("agrp.playerPedId", receivePlayerPedNetworkId);
addNetworkEventHandler("agrp.playerCop", setPlayerAsCopState);
addNetworkEventHandler("agrp.vehicleSpawned", vehicleSpawnedByPlayer)
addNetworkEventHandler("agrp.mapLoaded", playerMapLoaded);
}
// ===========================================================================
function updatePlayerNameTag(client) {
//logToConsole(LOG_DEBUG, `[VRR.Client] Sending ${getPlayerDisplayForConsole(client)}'s updated nametag to all players`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending ${getPlayerDisplayForConsole(client)}'s updated nametag to all players`);
sendNetworkEventToPlayer("agrp.nametag", null, getPlayerName(client), getPlayerNameForNameTag(client), getPlayerColour(client), getPlayerData(client).afk, getPlayerPing(client));
}
// ===========================================================================
function updateAllPlayerNameTags() {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending updated nametags to all players`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending updated nametags to all players`);
let clients = getClients();
for (let i in clients) {
updatePlayerNameTag(clients[i]);
@@ -98,7 +97,7 @@ function updateAllPlayerNameTags() {
// ===========================================================================
function updatePlayerPing(client) {
//logToConsole(LOG_DEBUG, `[VRR.Client] Sending ${getPlayerDisplayForConsole(client)}'s ping to all players`);
//logToConsole(LOG_DEBUG, `[AGRP.Client] Sending ${getPlayerDisplayForConsole(client)}'s ping to all players`);
sendNetworkEventToPlayer("agrp.ping", null, getPlayerName(client), getPlayerPing(client));
}
@@ -106,7 +105,7 @@ function updatePlayerPing(client) {
function playerClientReady(client) {
playerResourceReady[client.index] = true;
logToConsole(LOG_DEBUG, `[VRR.Client] ${getPlayerDisplayForConsole(client)}'s client resources are downloaded and ready! Started: ${getYesNoFromBool(playerResourceStarted[client.index])}`);
logToConsole(LOG_DEBUG, `[AGRP.Client] ${getPlayerDisplayForConsole(client)}'s client resources are downloaded and ready! Started: ${getYesNoFromBool(playerResourceStarted[client.index])}`);
if (playerResourceStarted[client.index] == true && playerInitialized[client.index] == false) {
initClient(client);
}
@@ -116,14 +115,14 @@ function playerClientReady(client) {
function playerGUIReady(client) {
playerGUI[client.index] = true;
logToConsole(LOG_DEBUG, `[VRR.Client] ${getPlayerDisplayForConsole(client)}'s client GUI is initialized and ready!`);
logToConsole(LOG_DEBUG, `[AGRP.Client] ${getPlayerDisplayForConsole(client)}'s client GUI is initialized and ready!`);
}
// ===========================================================================
function playerClientStarted(client) {
playerResourceStarted[client.index] = true;
logToConsole(LOG_DEBUG, `[VRR.Client] ${getPlayerDisplayForConsole(client)}'s client resources are started and running! Ready: ${getYesNoFromBool(playerResourceReady[client.index])}`);
logToConsole(LOG_DEBUG, `[AGRP.Client] ${getPlayerDisplayForConsole(client)}'s client resources are started and running! Ready: ${getYesNoFromBool(playerResourceReady[client.index])}`);
if (playerResourceReady[client.index] == true && playerInitialized[client.index] == false) {
initClient(client);
}
@@ -132,15 +131,21 @@ function playerClientStarted(client) {
// ===========================================================================
function playerClientStopped(client) {
//logToConsole(LOG_DEBUG, `[VRR.Client] ${getPlayerDisplayForConsole(client)}'s client resources have stopped (possibly error?). Kicking them from the server ...`);
//getPlayerData(client).customDisconnectReason = `Kicked - Client script verification failed. Possible hacks.`;
logToConsole(LOG_DEBUG | LOG_WARN, `[AGRP.Client] ${getPlayerDisplayForConsole(client)}'s client resources have stopped (possibly error?)`);
getPlayerData(client).customDisconnectReason = "ClientScriptVerificationFail";
//disconnectPlayer(client);
}
// ===========================================================================
function showSmallGameMessage(client, text, colour, duration, fontName = "Pricedown") {
logToConsole(LOG_DEBUG, `[VRR.Client] Showing game message to ${getPlayerDisplayForConsole(client)} (${text}) for ${duration} milliseconds`);
function showSmallGameMessage(client, text, colour, duration, fontName = "Roboto") {
logToConsole(LOG_DEBUG, `[AGRP.Client] Showing game message to ${getPlayerDisplayForConsole(client)} (${text}) for ${duration} milliseconds`);
if (getGame() <= AGRP_GAME_GTA_IV_EFLC) {
fontName = "Pricedown";
} else {
fontName = "AuroraBdCnBT";
}
sendNetworkEventToPlayer("agrp.smallGameMessage", client, text, colour, duration, fontName);
}
@@ -151,7 +156,7 @@ function enableCityAmbienceForPlayer(client, clearElements = false) {
// return false;
//}
//logToConsole(LOG_DEBUG, `[VRR.Client] Setting ${getPlayerDisplayForConsole(client)}'s city ambience to ${toUpperCase(getOnOffFromBool(false))}`);
//logToConsole(LOG_DEBUG, `[AGRP.Client] Setting ${getPlayerDisplayForConsole(client)}'s city ambience to ${toUpperCase(getOnOffFromBool(false))}`);
//sendNetworkEventToPlayer("agrp.ambience", client, true);
}
@@ -162,21 +167,21 @@ function disableCityAmbienceForPlayer(client, clearElements = false) {
// return false;
//}
//logToConsole(LOG_DEBUG, `[VRR.Client] Setting ${getPlayerDisplayForConsole(client)}'s city ambience to ${toUpperCase(getOnOffFromBool(false))}`);
//logToConsole(LOG_DEBUG, `[AGRP.Client] Setting ${getPlayerDisplayForConsole(client)}'s city ambience to ${toUpperCase(getOnOffFromBool(false))}`);
//sendNetworkEventToPlayer("agrp.ambience", client, false, clearElements);
}
// ===========================================================================
function clearPlayerOwnedPeds(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Clearing peds owned by ${getPlayerDisplayForConsole(client)}`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Clearing peds owned by ${getPlayerDisplayForConsole(client)}`);
sendNetworkEventToPlayer("agrp.clearPeds", client);
}
// ===========================================================================
function updatePlayerSpawnedState(client, state) {
logToConsole(LOG_DEBUG, `[VRR.Client] Setting ${getPlayerDisplayForConsole(client)}'s spawned state ${toUpperCase(getOnOffFromBool(state))}`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Setting ${getPlayerDisplayForConsole(client)}'s spawned state ${toUpperCase(getOnOffFromBool(state))}`);
getPlayerData(client).spawned = true;
sendNetworkEventToPlayer("agrp.spawned", client, state);
}
@@ -184,21 +189,21 @@ function updatePlayerSpawnedState(client, state) {
// ===========================================================================
function setPlayerControlState(client, state) {
logToConsole(LOG_DEBUG, `[VRR.Client] Setting ${getPlayerDisplayForConsole(client)}'s control state ${toUpperCase(getOnOffFromBool(state))}`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Setting ${getPlayerDisplayForConsole(client)}'s control state ${toUpperCase(getOnOffFromBool(state))}`);
sendNetworkEventToPlayer("agrp.control", client, state, !state);
}
// ===========================================================================
function updatePlayerShowLogoState(client, state) {
logToConsole(LOG_DEBUG, `[VRR.Client] Setting ${getPlayerDisplayForConsole(client)}'s logo state ${toUpperCase(getOnOffFromBool(state))}`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Setting ${getPlayerDisplayForConsole(client)}'s logo state ${toUpperCase(getOnOffFromBool(state))}`);
sendNetworkEventToPlayer("agrp.logo", client, state);
}
// ===========================================================================
function restorePlayerCamera(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Restoring ${getPlayerDisplayForConsole(client)}'s camera`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Restoring ${getPlayerDisplayForConsole(client)}'s camera`);
sendNetworkEventToPlayer("agrp.restoreCamera", client);
}
@@ -211,23 +216,23 @@ function setPlayer2DRendering(client, hudState = false, labelState = false, smal
// ===========================================================================
function syncPlayerProperties(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending signal to sync ${getPlayerDisplayForConsole(client)}'s player ped properties`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending signal to sync ${getPlayerDisplayForConsole(client)}'s player ped properties`);
sendNetworkEventToPlayer("agrp.syncElement", null, getPlayerPed(client).id);
}
// ===========================================================================
function updatePlayerSnowState(client) {
function updatePlayerSnowState(client, forceGroundSnow = false) {
if (isSnowSupported(getGame())) {
logToConsole(LOG_DEBUG, `[VRR.Client] Setting ${getPlayerDisplayForConsole(client)}'s snow state (Falling: ${toUpperCase(getOnOffFromBool(getServerConfig().fallingSnow))}, Ground: ${toUpperCase(getOnOffFromBool(getServerConfig().groundSnow))})`);
sendNetworkEventToPlayer("agrp.snow", client, getServerConfig().fallingSnow, getServerConfig().groundSnow);
logToConsole(LOG_DEBUG, `[AGRP.Client] Setting ${getPlayerDisplayForConsole(client)}'s snow state (Falling: ${toUpperCase(getOnOffFromBool(getServerConfig().fallingSnow))}, Ground: ${toUpperCase(getOnOffFromBool(getServerConfig().groundSnow))})`);
sendNetworkEventToPlayer("agrp.snow", client, getServerConfig().fallingSnow, getServerConfig().groundSnow, forceGroundSnow);
}
}
// ===========================================================================
function updatePlayerHotBar(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending updated hotbar data to ${getPlayerDisplayForConsole(client)}`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending updated hotbar data to ${getPlayerDisplayForConsole(client)}`);
let tempHotBarItems = [];
for (let i in getPlayerData(client).hotBarItems) {
let itemImage = "";
@@ -250,14 +255,14 @@ function updatePlayerHotBar(client) {
// ===========================================================================
function setPlayerWeaponDamageEnabled(client, state) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending weapon damage state for ${getPlayerDisplayForConsole(client)} to all players`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending weapon damage state for ${getPlayerDisplayForConsole(client)} to all players`);
sendNetworkEventToPlayer("agrp.weaponDamageEnabled", null, getPlayerName(client), state);
}
// ===========================================================================
function setPlayerWeaponDamageEvent(client, eventType) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending weapon damage event (${eventType}) for ${getPlayerDisplayForConsole(client)} to all players`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending weapon damage event (${eventType}) for ${getPlayerDisplayForConsole(client)} to all players`);
sendNetworkEventToPlayer("agrp.weaponDamageEvent", null, getPlayerName(client), eventType);
getPlayerData(client).weaponDamageEvent = eventType;
}
@@ -265,259 +270,259 @@ function setPlayerWeaponDamageEvent(client, eventType) {
// ===========================================================================
function sendJobRouteLocationToPlayer(client, position, colour) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending job route location data to ${getPlayerDisplayForConsole(client)}`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending job route location data to ${getPlayerDisplayForConsole(client)}`);
sendNetworkEventToPlayer("agrp.showJobRouteLocation", client, position, colour);
}
// ===========================================================================
function showPlayerLoginSuccessGUI(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending login success GUI signal to ${getPlayerDisplayForConsole(client)}`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending login success GUI signal to ${getPlayerDisplayForConsole(client)}`);
sendNetworkEventToPlayer("agrp.loginSuccess", client);
}
// ===========================================================================
function showPlayerLoginFailedGUI(client, errorMessage) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending login failed GUI signal to ${getPlayerDisplayForConsole(client)}`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending login failed GUI signal to ${getPlayerDisplayForConsole(client)}`);
sendNetworkEventToPlayer("agrp.loginFailed", client, errorMessage);
}
// ===========================================================================
function showPlayerRegistrationSuccessGUI(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending registration success GUI signal to ${getPlayerDisplayForConsole(client)}`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending registration success GUI signal to ${getPlayerDisplayForConsole(client)}`);
sendNetworkEventToPlayer("agrp.registrationSuccess", client);
}
// ===========================================================================
function showPlayerRegistrationFailedGUI(client, errorMessage) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending registration failed GUI signal to ${getPlayerDisplayForConsole(client)}`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending registration failed GUI signal to ${getPlayerDisplayForConsole(client)}`);
sendNetworkEventToPlayer("agrp.registrationFailed", client, errorMessage);
}
// ===========================================================================
function sendPlayerGUIColours(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending GUI colours to ${getPlayerDisplayForConsole(client)}`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending GUI colours to ${getPlayerDisplayForConsole(client)}`);
sendNetworkEventToPlayer("agrp.guiColour", client, getServerConfig().guiColourPrimary[0], getServerConfig().guiColourPrimary[1], getServerConfig().guiColourPrimary[2], getServerConfig().guiColourSecondary[0], getServerConfig().guiColourSecondary[1], getServerConfig().guiColourSecondary[2], getServerConfig().guiTextColourPrimary[0], getServerConfig().guiTextColourPrimary[1], getServerConfig().guiTextColourPrimary[2]);
}
// ===========================================================================
function sendPlayerGUIInit(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending GUI init signal to ${getPlayerDisplayForConsole(client)}`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending GUI init signal to ${getPlayerDisplayForConsole(client)}`);
sendNetworkEventToPlayer("agrp.guiInit", client);
}
// ===========================================================================
function showPlayerLoginGUI(client, errorMessage = "") {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending show login GUI signal to ${getPlayerDisplayForConsole(client)}`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending show login GUI signal to ${getPlayerDisplayForConsole(client)}`);
sendNetworkEventToPlayer("agrp.showLogin", client);
}
// ===========================================================================
function showPlayerRegistrationGUI(client, errorMessage = "") {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending show registration GUI signal to ${getPlayerDisplayForConsole(client)}`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending show registration GUI signal to ${getPlayerDisplayForConsole(client)}`);
sendNetworkEventToPlayer("agrp.showRegistration", client);
}
// ===========================================================================
function showPlayerNewCharacterGUI(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending show new character GUI signal to ${getPlayerDisplayForConsole(client)}`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending show new character GUI signal to ${getPlayerDisplayForConsole(client)}`);
sendNetworkEventToPlayer("agrp.showNewCharacter", client);
}
// ===========================================================================
function showPlayerChangePasswordGUI(client, errorMessage = "") {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending show change password GUI signal to ${getPlayerDisplayForConsole(client)}`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending show change password GUI signal to ${getPlayerDisplayForConsole(client)}`);
sendNetworkEventToPlayer("agrp.showChangePassword", client, errorMessage);
}
// ===========================================================================
function showPlayerResetPasswordCodeInputGUI(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending show reset password code input GUI signal to ${getPlayerDisplayForConsole(client)}`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending show reset password code input GUI signal to ${getPlayerDisplayForConsole(client)}`);
sendNetworkEventToPlayer("agrp.showResetPasswordCodeInput", client);
}
// ===========================================================================
function showPlayerResetPasswordEmailInputGUI(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending show reset password email input GUI signal to ${getPlayerDisplayForConsole(client)}`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending show reset password email input GUI signal to ${getPlayerDisplayForConsole(client)}`);
sendNetworkEventToPlayer("agrp.showResetPasswordEmailInput", client);
}
// ===========================================================================
function showPlayerCharacterSelectGUI(client, firstName, lastName, cash, clan, lastPlayed, skin) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending character select GUI signal to ${getPlayerDisplayForConsole(client)}`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending character select GUI signal to ${getPlayerDisplayForConsole(client)}`);
sendNetworkEventToPlayer("agrp.showCharacterSelect", client, firstName, lastName, cash, clan, lastPlayed, skin);
}
// ===========================================================================
function updatePlayerCharacterSelectGUI(client, firstName, lastName, cash, clan, lastPlayed, skin) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending update character select GUI signal to ${getPlayerDisplayForConsole(client)}`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending update character select GUI signal to ${getPlayerDisplayForConsole(client)}`);
sendNetworkEventToPlayer("agrp.switchCharacterSelect", client, firstName, lastName, cash, clan, lastPlayed, skin);
}
// ===========================================================================
function showPlayerCharacterSelectSuccessGUI(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending character select success GUI signal to ${getPlayerDisplayForConsole(client)}`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending character select success GUI signal to ${getPlayerDisplayForConsole(client)}`);
sendNetworkEventToPlayer("agrp.characterSelectSuccess", client);
}
// ===========================================================================
function showPlayerCharacterSelectFailedGUI(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending character select failed GUI signal to ${getPlayerDisplayForConsole(client)}`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending character select failed GUI signal to ${getPlayerDisplayForConsole(client)}`);
sendNetworkEventToPlayer("agrp.characterSelectFailed", client);
}
// ===========================================================================
function showPlayerPromptGUI(client, promptMessage, promptTitle, yesButtonText = "Yes", noButtonText = "No") {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending show prompt GUI signal to ${getPlayerDisplayForConsole(client)} (Title: ${promptTitle}, Message: ${promptMessage}, YesButton: ${yesButtonText}, NoButton: ${noButtonText})`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending show prompt GUI signal to ${getPlayerDisplayForConsole(client)} (Title: ${promptTitle}, Message: ${promptMessage}, YesButton: ${yesButtonText}, NoButton: ${noButtonText})`);
sendNetworkEventToPlayer("agrp.showPrompt", client, promptMessage, promptTitle, yesButtonText, noButtonText);
}
// ===========================================================================
function showPlayerInfoGUI(client, infoMessage, infoTitle, buttonText = "OK") {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending show info GUI signal to ${getPlayerDisplayForConsole(client)} (Title: ${infoTitle}, Message: ${infoMessage})`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending show info GUI signal to ${getPlayerDisplayForConsole(client)} (Title: ${infoTitle}, Message: ${infoMessage})`);
sendNetworkEventToPlayer("agrp.showInfo", client, infoMessage, infoTitle, buttonText);
}
// ===========================================================================
function showPlayerErrorGUI(client, errorMessage, errorTitle, buttonText = "OK") {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending show error GUI signal to ${getPlayerDisplayForConsole(client)} (Title: ${errorTitle}, Message: ${errorMessage})`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending show error GUI signal to ${getPlayerDisplayForConsole(client)} (Title: ${errorTitle}, Message: ${errorMessage})`);
sendNetworkEventToPlayer("agrp.showError", client, errorMessage, errorTitle, buttonText);
}
// ===========================================================================
function sendRunCodeToClient(client, code, returnTo) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending runcode to ${getPlayerDisplayForConsole(client)} (returnTo: ${getPlayerDisplayForConsole(getClientFromIndex(returnTo))}, Code: ${code})`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending runcode to ${getPlayerDisplayForConsole(client)} (returnTo: ${getPlayerDisplayForConsole(getClientFromIndex(returnTo))}, Code: ${code})`);
sendNetworkEventToPlayer("agrp.runCode", client, code, getPlayerId(returnTo));
}
// ===========================================================================
function sendPlayerWorkingState(client, state) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending working state (${toUpperCase(getYesNoFromBool(state))}) to ${getPlayerDisplayForConsole(client)}`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending working state (${toUpperCase(getYesNoFromBool(state))}) to ${getPlayerDisplayForConsole(client)}`);
sendNetworkEventToPlayer("agrp.working", client, state);
}
// ===========================================================================
function sendPlayerJobType(client, jobType) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending job type (${jobType}) to ${getPlayerDisplayForConsole(client)}`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending job type (${jobType}) to ${getPlayerDisplayForConsole(client)}`);
sendNetworkEventToPlayer("agrp.jobType", client, jobType);
}
// ===========================================================================
function sendPlayerStopJobRoute(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending signal to abort job route to ${getPlayerDisplayForConsole(client)}`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending signal to abort job route to ${getPlayerDisplayForConsole(client)}`);
sendNetworkEventToPlayer("agrp.hideJobRouteLocation", client);
}
// ===========================================================================
function sendPlayerMouseCameraToggle(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending signal to toggle mouse camera ${getPlayerDisplayForConsole(client)}`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending signal to toggle mouse camera ${getPlayerDisplayForConsole(client)}`);
sendNetworkEventToPlayer("agrp.mouseCamera", client);
}
// ===========================================================================
function setPlayerMouseCameraState(client, state) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending signal to toggle mouse camera ${getPlayerDisplayForConsole(client)}`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending signal to toggle mouse camera ${getPlayerDisplayForConsole(client)}`);
sendNetworkEventToPlayer("agrp.mouseCameraForce", client, state);
}
// ===========================================================================
function sendPlayerMouseCursorToggle(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending signal to toggle mouse cursor ${getPlayerDisplayForConsole(client)}`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending signal to toggle mouse cursor ${getPlayerDisplayForConsole(client)}`);
sendNetworkEventToPlayer("agrp.mouseCursor", client);
}
// ===========================================================================
function sendAddAccountKeyBindToClient(client, key, keyState) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending added keybind to ${getPlayerDisplayForConsole(client)} (Key: ${toUpperCase(getKeyNameFromId(key))}, State: ${(keyState) ? "down" : "up"})`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending added keybind to ${getPlayerDisplayForConsole(client)} (Key: ${toUpperCase(getKeyNameFromId(key))}, State: ${(keyState) ? "down" : "up"})`);
sendNetworkEventToPlayer("agrp.addKeyBind", client, toInteger(key), (keyState) ? KEYSTATE_DOWN : KEYSTATE_UP);
}
// ===========================================================================
function sendClearKeyBindsToClient(client, key, keyState) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending added keybind to ${getPlayerDisplayForConsole(client)} (Key: ${toUpperCase(getKeyNameFromId(key))}, State: ${(keyState) ? "down" : "up"})`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending added keybind to ${getPlayerDisplayForConsole(client)} (Key: ${toUpperCase(getKeyNameFromId(key))}, State: ${(keyState) ? "down" : "up"})`);
sendNetworkEventToPlayer("agrp.clearKeyBinds", client);
}
// ===========================================================================
function sendRemoveAccountKeyBindToClient(client, key) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending deleted keybind to ${getPlayerDisplayForConsole(client)} (Key: ${toUpperCase(getKeyNameFromId(key))})`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending deleted keybind to ${getPlayerDisplayForConsole(client)} (Key: ${toUpperCase(getKeyNameFromId(key))})`);
sendNetworkEventToPlayer("agrp.delKeyBind", client, toInteger(key));
}
// ===========================================================================
function sendPlayerSetPosition(client, position) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending set position signal to ${getPlayerDisplayForConsole(client)} (Position: ${position.x}, ${position.y}, ${position.z})`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending set position signal to ${getPlayerDisplayForConsole(client)} (Position: ${position.x}, ${position.y}, ${position.z})`);
sendNetworkEventToPlayer("agrp.position", client, position);
}
// ===========================================================================
function sendPlayerSetHeading(client, heading) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending set heading signal to ${getPlayerDisplayForConsole(client)} (Heading: ${heading})`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending set heading signal to ${getPlayerDisplayForConsole(client)} (Heading: ${heading})`);
sendNetworkEventToPlayer("agrp.heading", client, heading);
}
// ===========================================================================
function sendPlayerSetInterior(client, interior) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending set interior signal to ${getPlayerDisplayForConsole(client)} (Interior: ${interior})`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending set interior signal to ${getPlayerDisplayForConsole(client)} (Interior: ${interior})`);
sendNetworkEventToPlayer("agrp.interior", client, interior);
}
// ===========================================================================
function sendPlayerFrozenState(client, state) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending set frozen signal to ${getPlayerDisplayForConsole(client)} (State: ${toUpperCase(getYesNoFromBool(state))})`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending set frozen signal to ${getPlayerDisplayForConsole(client)} (State: ${toUpperCase(getYesNoFromBool(state))})`);
sendNetworkEventToPlayer("agrp.frozen", client, state);
}
// ===========================================================================
function clearPlayerWeapons(client, clearData = true) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending signal to ${getPlayerDisplayForConsole(client)} to clear weapons`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending signal to ${getPlayerDisplayForConsole(client)} to clear weapons`);
sendNetworkEventToPlayer("agrp.clearWeapons", client, clearData);
}
// ===========================================================================
function showPlayerNewCharacterFailedGUI(client, errorMessage) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending new character failed GUI signal to ${getPlayerDisplayForConsole(client)}`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending new character failed GUI signal to ${getPlayerDisplayForConsole(client)}`);
sendNetworkEventToPlayer("agrp.newCharacterFailed", client, errorMessage);
}
// ===========================================================================
function sendPlayerRemoveFromVehicle(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Sending remove from vehicle signal to ${getPlayerDisplayForConsole(client)}`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Sending remove from vehicle signal to ${getPlayerDisplayForConsole(client)}`);
sendNetworkEventToPlayer("agrp.removeFromVehicle", client);
}
@@ -535,10 +540,10 @@ function showPlayerItemTakeDelay(client, itemId) {
if (getItemData(itemId)) {
let delay = getItemTypeData(getItemData(itemId).itemTypeIndex).pickupDelay;
if (delay > 0) {
logToConsole(LOG_DEBUG, `[VRR.Client] Showing item TAKE delay to ${getPlayerDisplayForConsole(client)} (${delay} milliseconds)`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Showing item TAKE delay to ${getPlayerDisplayForConsole(client)} (${delay} milliseconds)`);
sendNetworkEventToPlayer("agrp.showItemActionDelay", client, delay);
} else {
logToConsole(LOG_DEBUG, `[VRR.Client] Showing item TAKE delay to ${getPlayerDisplayForConsole(client)} (instant)`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Showing item TAKE delay to ${getPlayerDisplayForConsole(client)} (instant)`);
playerItemActionDelayComplete(client);
}
}
@@ -550,10 +555,10 @@ function showPlayerItemUseDelay(client, itemSlot) {
if (getItemData(getPlayerData(client).hotBarItems[itemSlot])) {
let delay = getItemTypeData(getItemData(getPlayerData(client).hotBarItems[itemSlot]).itemTypeIndex).useDelay;
if (delay > 0) {
logToConsole(LOG_DEBUG, `[VRR.Client] Showing item USE delay to ${getPlayerDisplayForConsole(client)} (${delay} milliseconds)`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Showing item USE delay to ${getPlayerDisplayForConsole(client)} (${delay} milliseconds)`);
sendNetworkEventToPlayer("agrp.showItemActionDelay", client, delay);
} else {
logToConsole(LOG_DEBUG, `[VRR.Client] Showing item USE delay to ${getPlayerDisplayForConsole(client)} (instant)`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Showing item USE delay to ${getPlayerDisplayForConsole(client)} (instant)`);
playerItemActionDelayComplete(client);
}
}
@@ -565,10 +570,10 @@ function showPlayerItemDropDelay(client, itemSlot) {
if (getItemData(getPlayerData(client).hotBarItems[itemSlot])) {
let delay = getItemTypeData(getItemData(getPlayerData(client).hotBarItems[itemSlot]).itemTypeIndex).dropDelay;
if (delay > 0) {
logToConsole(LOG_DEBUG, `[VRR.Client] Showing item DROP delay to ${getPlayerDisplayForConsole(client)} (${delay} milliseconds)`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Showing item DROP delay to ${getPlayerDisplayForConsole(client)} (${delay} milliseconds)`);
sendNetworkEventToPlayer("agrp.showItemActionDelay", client, delay);
} else {
logToConsole(LOG_DEBUG, `[VRR.Client] Showing item DROP delay to ${getPlayerDisplayForConsole(client)} (instant)`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Showing item DROP delay to ${getPlayerDisplayForConsole(client)} (instant)`);
playerItemActionDelayComplete(client);
}
}
@@ -580,10 +585,10 @@ function showPlayerItemPickupDelay(client, itemId) {
if (getItemData(itemId)) {
let delay = getItemTypeData(getItemData(itemId).itemTypeIndex).pickupDelay;
if (delay > 0) {
logToConsole(LOG_DEBUG, `[VRR.Client] Showing item PICKUP delay to ${getPlayerDisplayForConsole(client)} (${delay} milliseconds)`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Showing item PICKUP delay to ${getPlayerDisplayForConsole(client)} (${delay} milliseconds)`);
sendNetworkEventToPlayer("agrp.showItemActionDelay", client, delay);
} else {
logToConsole(LOG_DEBUG, `[VRR.Client] Showing item PICKUP delay to ${getPlayerDisplayForConsole(client)} (instant)`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Showing item PICKUP delay to ${getPlayerDisplayForConsole(client)} (instant)`);
playerItemActionDelayComplete(client);
}
}
@@ -595,10 +600,10 @@ function showPlayerItemPutDelay(client, itemSlot) {
if (getItemData(getPlayerData(client).hotBarItems[itemSlot])) {
let delay = getItemTypeData(getItemData(getPlayerData(client).hotBarItems[itemSlot]).itemTypeIndex).putDelay;
if (delay > 0) {
logToConsole(LOG_DEBUG, `[VRR.Client] Showing item PUT delay to ${getPlayerDisplayForConsole(client)} (${delay} milliseconds)`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Showing item PUT delay to ${getPlayerDisplayForConsole(client)} (${delay} milliseconds)`);
sendNetworkEventToPlayer("agrp.showItemActionDelay", client, delay);
} else {
logToConsole(LOG_DEBUG, `[VRR.Client] Showing item PUT delay to ${getPlayerDisplayForConsole(client)} (instant)`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Showing item PUT delay to ${getPlayerDisplayForConsole(client)} (instant)`);
playerItemActionDelayComplete(client);
}
}
@@ -611,18 +616,18 @@ function showPlayerItemSwitchDelay(client, itemSlot) {
if (getPlayerData(client).hotBarItems[itemSlot] != -1) {
let delay = getItemTypeData(getItemData(getPlayerData(client).hotBarItems[itemSlot]).itemTypeIndex).switchDelay;
if (delay > 0) {
logToConsole(LOG_DEBUG, `[VRR.Client] Showing item switch delay to ${getPlayerDisplayForConsole(client)} (${delay} milliseconds)`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Showing item switch delay to ${getPlayerDisplayForConsole(client)} (${delay} milliseconds)`);
sendNetworkEventToPlayer("agrp.showItemActionDelay", client, delay);
} else {
logToConsole(LOG_DEBUG, `[VRR.Client] Showing item switch delay to ${getPlayerDisplayForConsole(client)} (instant)`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Showing item switch delay to ${getPlayerDisplayForConsole(client)} (instant)`);
playerItemActionDelayComplete(client);
}
} else {
logToConsole(LOG_DEBUG, `[VRR.Client] Showing item switch delay to ${getPlayerDisplayForConsole(client)} (instant)`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Showing item switch delay to ${getPlayerDisplayForConsole(client)} (instant)`);
playerItemActionDelayComplete(client);
}
} else {
logToConsole(LOG_DEBUG, `[VRR.Client] Showing item switch delay to ${getPlayerDisplayForConsole(client)} (instant)`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Showing item switch delay to ${getPlayerDisplayForConsole(client)} (instant)`);
playerSwitchItem(client, itemSlot);
}
}
@@ -630,14 +635,14 @@ function showPlayerItemSwitchDelay(client, itemSlot) {
// ===========================================================================
function sendPlayerDrunkEffect(client, amount, duration) {
logToConsole(LOG_DEBUG, `[VRR.Client] Setting drunk effect for ${getPlayerDisplayForConsole(client)} to ${amount} for ${duration} milliseconds`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Setting drunk effect for ${getPlayerDisplayForConsole(client)} to ${amount} for ${duration} milliseconds`);
sendNetworkEventToPlayer("agrp.drunkEffect", client, amount, duration);
}
// ===========================================================================
function sendPlayerClearPedState(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Clearing ped state for ${getPlayerDisplayForConsole(client)}`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Clearing ped state for ${getPlayerDisplayForConsole(client)}`);
sendNetworkEventToPlayer("agrp.clearPedState", client);
}
@@ -647,29 +652,29 @@ function playerDamagedByPlayer(client, damagerEntityName, weaponId, pedPiece, he
let damagerEntity = getPlayerFromParams(damagerEntityName);
if (isNull(damagerEntity)) {
logToConsole(LOG_DEBUG, `[VRR.Client] ${getPlayerDisplayForConsole(client)}'s damager entity from ID is null`);
logToConsole(LOG_DEBUG, `[AGRP.Client] ${getPlayerDisplayForConsole(client)}'s damager entity from ID is null`);
return false;
}
logToConsole(LOG_DEBUG, `[VRR.Client] ${getPlayerDisplayForConsole(client)} was damaged by ${damagerEntity}`);
logToConsole(LOG_DEBUG, `[AGRP.Client] ${getPlayerDisplayForConsole(client)} was damaged by ${damagerEntity}`);
if (isNull(damagerEntity)) {
logToConsole(LOG_DEBUG, `[VRR.Client] ${getPlayerDisplayForConsole(client)}'s damager client is INVALID`);
logToConsole(LOG_DEBUG, `[AGRP.Client] ${getPlayerDisplayForConsole(client)}'s damager client is INVALID`);
return false;
}
if (!getPlayerData(damagerEntity) || !getPlayerData(client)) {
logToConsole(LOG_DEBUG, `[VRR.Client] ${getPlayerDisplayForConsole(client)}'s damager's client data is INVALID`);
logToConsole(LOG_DEBUG, `[AGRP.Client] ${getPlayerDisplayForConsole(client)}'s damager's client data is INVALID`);
return false;
}
logToConsole(LOG_DEBUG, `[VRR.Client] ${getPlayerDisplayForConsole(client)}'s damager is ${getPlayerDisplayForConsole(damagerEntity)}`);
logToConsole(LOG_DEBUG, `[AGRP.Client] ${getPlayerDisplayForConsole(client)}'s damager is ${getPlayerDisplayForConsole(damagerEntity)}`);
switch (getPlayerData(damagerEntity).weaponDamageEvent) {
case AGRP_WEAPON_DAMAGE_EVENT_TAZER:
logToConsole(LOG_DEBUG, `[VRR.Client] ${getPlayerDisplayForConsole(client)}'s damager ${getPlayerDisplayForConsole(damagerEntity)} is using a tazer`);
logToConsole(LOG_DEBUG, `[AGRP.Client] ${getPlayerDisplayForConsole(client)}'s damager ${getPlayerDisplayForConsole(damagerEntity)} is using a tazer`);
if (!isPlayerTazed(client) && !isPlayerHandCuffed(client) && !isPlayerInAnyVehicle(client)) {
logToConsole(LOG_DEBUG, `[VRR.Client] ${getPlayerDisplayForConsole(client)} was not previously tazed, binded, or in a vehicle. Taze successful`);
logToConsole(LOG_DEBUG, `[AGRP.Client] ${getPlayerDisplayForConsole(client)} was not previously tazed, binded, or in a vehicle. Taze successful`);
meActionToNearbyPlayers(damagerEntity, `electrifies ${getCharacterFullName(client)} with their tazer`);
tazePlayer(client);
}
@@ -682,10 +687,10 @@ function playerDamagedByPlayer(client, damagerEntityName, weaponId, pedPiece, he
break;
case AGRP_WEAPON_DAMAGE_EVENT_NORMAL:
logToConsole(LOG_DEBUG, `[VRR.Client] ${getPlayerDisplayForConsole(client)}'s damager ${getPlayerDisplayForConsole(damagerEntity)} caused ${healthLoss} damage (damage reduction makes it ${(healthLoss * getPlayerData(client).incomingDamageMultiplier)})`);
logToConsole(LOG_DEBUG, `[AGRP.Client] ${getPlayerDisplayForConsole(client)}'s damager ${getPlayerDisplayForConsole(damagerEntity)} caused ${healthLoss} damage (damage reduction makes it ${(healthLoss * getPlayerData(client).incomingDamageMultiplier)})`);
let remainingDamage = healthLoss * getPlayerData(client).incomingDamageMultiplier;
if (getPlayerArmour(client) > 0) {
//logToConsole(LOG_DEBUG, `[VRR.Client] ${getPlayerDisplayForConsole(client)}'s armour was ${getPlayerArmour(client)}, so it was reduced by ${healthLoss}`);
//logToConsole(LOG_DEBUG, `[AGRP.Client] ${getPlayerDisplayForConsole(client)}'s armour was ${getPlayerArmour(client)}, so it was reduced by ${healthLoss}`);
if (getPlayerArmour(client) - remainingDamage < 0) {
setPlayerArmour(client, 0);
remainingDamage = remainingDamage - getPlayerArmour(client);
@@ -697,7 +702,7 @@ function playerDamagedByPlayer(client, damagerEntityName, weaponId, pedPiece, he
break;
default:
logToConsole(LOG_DEBUG, `[VRR.Client] ${getPlayerDisplayForConsole(client)}'s damager ${getPlayerDisplayForConsole(damagerEntity)} caused ${healthLoss} damage (damage reduction makes it ${(healthLoss * getPlayerData(client).incomingDamageMultiplier)})`);
logToConsole(LOG_DEBUG, `[AGRP.Client] ${getPlayerDisplayForConsole(client)}'s damager ${getPlayerDisplayForConsole(damagerEntity)} caused ${healthLoss} damage (damage reduction makes it ${(healthLoss * getPlayerData(client).incomingDamageMultiplier)})`);
setPlayerHealth(client, getPlayerHealth(client) - (healthLoss * getPlayerData(client).incomingDamageMultiplier));
break;
}
@@ -957,21 +962,21 @@ function sendPlayerChatAutoHideDelay(client, delay) {
// ===========================================================================
function playRadioStreamForPlayer(client, streamURL, loop = true, volume = 0, element = false) {
logToConsole(LOG_DEBUG, `[VRR.Client] Forcing ${getPlayerDisplayForConsole(client)} to stream ${streamURL}`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Forcing ${getPlayerDisplayForConsole(client)} to stream ${streamURL}`);
sendNetworkEventToPlayer("agrp.radioStream", client, streamURL, loop, volume, element);
}
// ===========================================================================
function playAudioFileForPlayer(client, audioName, loop = true, volume = 0, element = false) {
logToConsole(LOG_DEBUG, `[VRR.Client] Forcing ${getPlayerDisplayForConsole(client)} to play audio ${audioName}`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Forcing ${getPlayerDisplayForConsole(client)} to play audio ${audioName}`);
sendNetworkEventToPlayer("agrp.audioFileStream", client, audioName, loop, volume);
}
// ===========================================================================
function stopRadioStreamForPlayer(client) {
logToConsole(LOG_DEBUG, `[VRR.Client] Forcing ${getPlayerDisplayForConsole(client)} to stop their radio stream`);
logToConsole(LOG_DEBUG, `[AGRP.Client] Forcing ${getPlayerDisplayForConsole(client)} to stop their radio stream`);
sendNetworkEventToPlayer("agrp.stopRadioStream", client);
}
@@ -1098,25 +1103,25 @@ function setPlayerInfiniteRun(client, state) {
// ==========================================================================
function sendBusinessToPlayer(client, businessId, name, entrancePosition, blipModel, pickupModel, hasInterior, hasItems) {
sendNetworkEventToPlayer("agrp.business", client, businessId, name, entrancePosition, blipModel, pickupModel, hasInterior, hasItems);
function sendBusinessToPlayer(client, businessId, name, entrancePosition, blipModel, pickupModel, buyPrice, rentPrice, hasInterior, locked, hasItems) {
sendNetworkEventToPlayer("agrp.business", client, businessId, name, entrancePosition, blipModel, pickupModel, buyPrice, rentPrice, hasInterior, locked, hasItems);
}
// ==========================================================================
function sendHouseToPlayer(client, houseId, description, entrancePosition, blipModel, pickupModel, hasInterior) {
sendNetworkEventToPlayer("agrp.house", client, houseId, description, entrancePosition, blipModel, pickupModel, hasInterior);
function sendHouseToPlayer(client, houseId, description, entrancePosition, blipModel, pickupModel, buyPrice, rentPrice, hasInterior, locked) {
sendNetworkEventToPlayer("agrp.house", client, houseId, description, entrancePosition, blipModel, pickupModel, buyPrice, rentPrice, hasInterior, locked);
}
// ==========================================================================
function sendJobToPlayer(client, jobId, jobLocationId, name, position) {
function sendJobToPlayer(client, jobId, jobLocationId, name, position, blipModel, pickupModel) {
sendNetworkEventToPlayer("agrp.job", client, jobId, jobLocationId, name, position);
}
// ==========================================================================
function sendVehicleToPlayer(client, vehicleId, networkId, model, position, heading, colour1, colour2, colour3, colour4) {
function sendVehicleToPlayer(client, vehicleId, model, position, heading, colour1, colour2, colour3, colour4) {
sendNetworkEventToPlayer("agrp.vehicle", client, vehicleId, model, position, heading, colour1, colour2, colour3, colour4);
}
@@ -1125,7 +1130,7 @@ function sendVehicleToPlayer(client, vehicleId, networkId, model, position, head
function sendAllBusinessesToPlayer(client) {
let businesses = getServerData().businesses;
for (let i in businesses) {
sendBusinessToPlayer(client, businesses[i].index, businesses[i].name, businesses[i].entrancePosition, businesses[i].entranceBlipModel, businesses[i].entrancePickupModel, businesses[i].hasInterior, false);
sendBusinessToPlayer(client, businesses[i].index, businesses[i].name, businesses[i].entrancePosition, businesses[i].entranceBlipModel, businesses[i].entrancePickupModel, businesses[i].buyPrice, businesses[i].rentPrice, businesses[i].hasInterior, doesBusinessHaveAnyItemsToBuy(i));
}
}
@@ -1134,7 +1139,7 @@ function sendAllBusinessesToPlayer(client) {
function sendAllHousesToPlayer(client) {
let houses = getServerData().houses;
for (let i in houses) {
sendHouseToPlayer(client, houses[i].index, houses[i].entrancePosition, houses[i].entranceBlipModel, houses[i].entrancePickupModel, houses[i].hasInterior);
sendHouseToPlayer(client, houses[i].index, houses[i].entrancePosition, houses[i].entranceBlipModel, houses[i].entrancePickupModel, houses[i].buyPrice, houses[i].rentPrice, houses[i].hasInterior);
}
}
@@ -1144,7 +1149,7 @@ function sendAllJobsToPlayer(client) {
let jobs = getServerData().jobs;
for (let i in jobs) {
for (let j in jobs[i].locations) {
sendJobToPlayer(client, jobs[i].index, jobs[i].locations[j].index, jobs[i].name, jobs[i].locations[j].position, jobs[i].blipModel);
sendJobToPlayer(client, jobs[i].index, jobs[i].locations[j].index, jobs[i].name, jobs[i].locations[j].position, jobs[i].pickupModel, jobs[i].blipModel);
}
}
}
@@ -1154,7 +1159,7 @@ function sendAllJobsToPlayer(client) {
function sendAllVehiclesToPlayer(client) {
let vehicles = getServerData().vehicles;
for (let i in vehicles) {
sendVehicleToPlayer(client, vehicles[i].index, vehicles[i].ivNetworkId, vehicles[i].model, vehicles[i].syncPosition, vehicles[i].syncHeading, vehicles[i].colour1, vehicles[i].colour2, vehicles[i].colour3, vehicles[i].colour4);
sendVehicleToPlayer(client, vehicles[i].index, vehicles[i].model, vehicles[i].syncPosition, vehicles[i].syncHeading, vehicles[i].colour1, vehicles[i].colour2, vehicles[i].colour3, vehicles[i].colour4);
}
}
@@ -1178,9 +1183,9 @@ function requestPlayerPedNetworkId(client) {
// ==========================================================================
function setPlayerInCutsceneInterior(client, cutsceneName) {
getPlayerData(client).interiorCutscene = cutsceneName;
sendNetworkEventToPlayer("agrp.cutsceneInterior", client, cutsceneName);
function setPlayerScene(client, sceneName) {
getPlayerData(client).scene = sceneName;
sendNetworkEventToPlayer("agrp.scene", client, sceneName);
}
// ==========================================================================
@@ -1277,4 +1282,45 @@ function showSingleParticleEffect(position, particleEffectId, strength = 1.0, du
sendNetworkEventToPlayer("agrp.particleEffectSingle", null, position, particleEffectId, strength, duration);
}
// ==========================================================================
function sendPlayerCurrencyString(client) {
sendNetworkEventToPlayer("agrp.currencyString", client, getGlobalConfig().economy.currencyString);
}
// ==========================================================================
function sendMapChangeWarningToPlayer(client, changingToNight) {
sendNetworkEventToPlayer("agrp.mapChangingSoon", client, changingToNight);
}
// ==========================================================================
function playerMapLoaded(client, mapName) {
//updateAllInteriorVehiclesForPlayer(client, propertyData.exitInterior, propertyData.exitDimension);
getPlayerData(client).scene = mapName;
setTimeout(function () {
processPlayerEnteringExitingProperty(client);
}, 500);
}
// ==========================================================================
function setMapChangeWarningForPlayer(client, isChanging) {
sendNetworkEventToPlayer("agrp.mapChangeWarning", client, isChanging);
}
// ==========================================================================
function fadePlayerCamera(client, fadeIn, time, colour = toColour(0, 0, 0, 255)) {
sendNetworkEventToPlayer("agrp.fadeCamera", client, fadeIn, time, colour);
}
// ==========================================================================
function sendClientVariablesToClient(client) {
sendNetworkEventToPlayer("agrp.cvar", client, JSON.stringify(clientVariables));
}
// ==========================================================================

View File

@@ -45,6 +45,7 @@ class NPCData {
this.scale = toVector3(1.0, 1.0, 1.0);
this.heading = 0.0;
this.clan = 0;
this.rank = 0;
this.isWorking = false;
this.jobUniform = this.skin;
this.lastJobVehicle = null;
@@ -65,6 +66,7 @@ class NPCData {
this.animationName = "";
this.ownerType = AGRP_NPC_OWNER_NONE;
this.ownerId = 0;
this.enabled = false;
this.bodyParts = {
hair: [0, 0],
@@ -98,21 +100,22 @@ class NPCData {
this.rotation = toVector3(toFloat(dbAssoc["npc_rot_x"]), toFloat(dbAssoc["npc_rot_y"]), toFloat(dbAssoc["npc_rot_z"]));
this.scale = toVector3(toFloat(dbAssoc["npc_scale_x"]), toFloat(dbAssoc["npc_scale_y"]), toFloat(dbAssoc["npc_scale_z"]));
this.heading = toFloat(dbAssoc["npc_rot_z"]);
this.lastLogin = toInteger(dbAssoc["npc_when_lastlogin"]);
this.rank = toInteger(dbAssoc["npc_rank"]);
this.title = toInteger(dbAssoc["npc_title"]);
this.job = toInteger(dbAssoc["npc_job"]);
this.interior = toInteger(dbAssoc["npc_int"]);
this.dimension = toInteger(dbAssoc["npc_vw"]);
this.walkStyle = toInteger(dbAssoc["npc_walkstyle"]);
this.fightStyle = toInteger(dbAssoc["npc_fightstyle"]);
this.walkStyle = toInteger(dbAssoc["npc_walk_style"]);
this.fightStyle = toInteger(dbAssoc["npc_fight_style"]);
this.health = toInteger(dbAssoc["npc_health"]);
this.armour = toInteger(dbAssoc["npc_armour"]);
this.typeFlags = toInteger(dbAssoc["npc_type_flags"]);
this.heedThreats = intToBool(dbAssoc["npc_headthreats"]);
this.threats = toInteger(dbAssoc["npc_threats"]);
this.invincible = intToBool(dbAssoc["npc_invincible"]);
this.animationName = intToBool(dbAssoc["npc_animation"]);
this.animationName = toString(dbAssoc["npc_animation"]);
this.enabled = intToBool(dbAssoc["npc_enabled"]);
this.lookAtPlayer = intToBool(dbAssoc["npc_lookatplr"]);
this.bodyParts = {
hair: [toInteger(dbAssoc["npc_hd_part_hair_model"]) || 0, toInteger(dbAssoc["npc_hd_part_hair_texture"]) || 0],
@@ -203,8 +206,8 @@ class NPCTriggerResponseData {
// ===========================================================================
function initNPCScript() {
logToConsole(LOG_DEBUG, "[VRR.NPC]: Initializing NPC script ...");
logToConsole(LOG_INFO, "[VRR.NPC]: NPC script initialized successfully!");
logToConsole(LOG_DEBUG, "[AGRP.NPC]: Initializing NPC script ...");
logToConsole(LOG_INFO, "[AGRP.NPC]: NPC script initialized successfully!");
}
// ===========================================================================
@@ -243,100 +246,92 @@ function createNPCCommand(command, params, client) {
// ===========================================================================
function loadNPCsFromDatabase() {
logToConsole(LOG_DEBUG, `[VRR.NPC]: Loading NPCs from database ...`);
async function loadNPCsFromDatabase() {
logToConsole(LOG_DEBUG, `[AGRP.NPC]: Loading NPCs from database ...`);
let dbConnection = connectToDatabase();
let tempNPCs = [];
let dbAssoc;
if (dbConnection) {
let dbQueryString = `SELECT * FROM npc_main WHERE npc_server = ${getServerId()} AND npc_enabled = 1`;
let dbQuery = queryDatabase(dbConnection, dbQueryString);
if (dbQuery) {
while (dbAssoc = fetchQueryAssoc(dbQuery)) {
let tempNPCData = new NPCData(dbAssoc);
tempNPCData.triggers = loadNPCTriggersFromDatabase(tempNPCData.databaseId);
tempNPCs.push(tempNPCData);
}
freeDatabaseQuery(dbQuery);
dbAssoc = await fetchQueryAssoc(dbConnection, dbQueryString);
for (let i in dbAssoc) {
let tempNPCData = new NPCData(dbAssoc[i]);
tempNPCData.triggers = loadNPCTriggersFromDatabase();
tempNPCs.push(tempNPCData);
}
disconnectFromDatabase(dbConnection);
}
logToConsole(LOG_DEBUG, `[VRR.NPC]: ${tempNPCs.length} NPCs loaded from database successfully!`);
logToConsole(LOG_DEBUG, `[AGRP.NPC]: ${tempNPCs.length} NPCs loaded from database successfully!`);
return tempNPCs;
}
// ===========================================================================
function loadNPCTriggersFromDatabase(npcDatabaseId) {
logToConsole(LOG_DEBUG, `[VRR.NPC]: Loading NPC triggers for NPC ${npcDatabaseId} from database ...`);
async function loadNPCTriggersFromDatabase(npcDatabaseId) {
logToConsole(LOG_DEBUG, `[AGRP.NPC]: Loading NPC triggers for NPC ${npcDatabaseId} from database ...`);
let dbConnection = connectToDatabase();
let tempNPCTriggers = [];
let dbAssoc;
if (dbConnection) {
let dbQueryString = `SELECT * FROM npc_trig WHERE npc_trig_npc = ${npcDatabaseId} AND npc_trig_enabled = 1`;
let dbQuery = queryDatabase(dbConnection, dbQueryString);
if (dbQuery) {
while (dbAssoc = fetchQueryAssoc(dbQuery)) {
let tempNPCTriggerData = new NPCTriggerData(dbAssoc);
tempNPCTriggerData.conditions = loadNPCTriggerConditionsFromDatabase(tempNPCTriggerData.databaseId);
tempNPCTriggerData.responses = loadNPCTriggerResponsesFromDatabase(tempNPCTriggerData.databaseId);
tempNPCTriggers.push(tempNPCTriggerData);
}
freeDatabaseQuery(dbQuery);
dbAssoc = await fetchQueryAssoc(dbConnection, dbQueryString);
for (let i in dbAssoc) {
let tempNPCTriggerData = new NPCTriggerData(dbAssoc[i]);
tempNPCTriggerData.conditions = loadNPCTriggerConditionsFromDatabase(tempNPCTriggerData.databaseId);
tempNPCTriggerData.responses = loadNPCTriggerResponsesFromDatabase(tempNPCTriggerData.databaseId);
tempNPCTriggers.push(tempNPCTriggerData);
}
disconnectFromDatabase(dbConnection);
}
logToConsole(LOG_DEBUG, `[VRR.NPC]: ${tempNPCTriggers.length} NPC triggers loaded for NPC ${npcDatabaseId} from database successfully!`);
logToConsole(LOG_DEBUG, `[AGRP.NPC]: ${tempNPCTriggers.length} NPC triggers loaded for NPC ${npcDatabaseId} from database successfully!`);
return tempNPCTriggers;
}
// ===========================================================================
function loadNPCTriggerConditionsFromDatabase(npcTriggerDatabaseId) {
logToConsole(LOG_DEBUG, `[VRR.NPC]: Loading NPC trigger conditions for trigger ${npcTriggerDatabaseId} from database ...`);
async function loadNPCTriggerConditionsFromDatabase(npcTriggerDatabaseId) {
logToConsole(LOG_DEBUG, `[AGRP.NPC]: Loading NPC trigger conditions for trigger ${npcTriggerDatabaseId} from database ...`);
let dbConnection = connectToDatabase();
let tempNPCTriggerConditions = [];
let dbAssoc;
if (dbConnection) {
let dbQueryString = `SELECT * FROM npc_cond WHERE npc_cond_trig = ${npcTriggerDatabaseId} AND npc_cond_enabled = 1`;
let dbQuery = queryDatabase(dbConnection, dbQueryString);
if (dbQuery) {
while (dbAssoc = fetchQueryAssoc(dbQuery)) {
let tempNPCTriggerConditionData = new NPCTriggerConditionData(dbAssoc);
tempNPCTriggerConditions.push(tempNPCTriggerConditionData);
}
freeDatabaseQuery(dbQuery);
dbAssoc = await fetchQueryAssoc(dbConnection, dbQueryString);
for (let i in dbAssoc) {
let tempNPCTriggerConditionData = new NPCTriggerConditionData(dbAssoc[i]);
tempNPCTriggerConditions.push(tempNPCTriggerConditionData);
}
disconnectFromDatabase(dbConnection);
}
logToConsole(LOG_DEBUG, `[VRR.NPC]: ${tempNPCTriggerConditions.length} conditions loaded for trigger ${npcTriggerDatabaseId} from database successfully!`);
logToConsole(LOG_DEBUG, `[AGRP.NPC]: ${tempNPCTriggerConditions.length} conditions loaded for trigger ${npcTriggerDatabaseId} from database successfully!`);
return tempNPCTriggerConditions;
}
// ===========================================================================
function loadNPCTriggerResponsesFromDatabase(npcTriggerDatabaseId) {
logToConsole(LOG_DEBUG, `[VRR.NPC]: Loading NPC trigger responses for trigger ${npcTriggerDatabaseId} from database ...`);
async function loadNPCTriggerResponsesFromDatabase(npcTriggerDatabaseId) {
logToConsole(LOG_DEBUG, `[AGRP.NPC]: Loading NPC trigger responses for trigger ${npcTriggerDatabaseId} from database ...`);
let dbConnection = connectToDatabase();
let tempNPCTriggerResponses = [];
let dbAssoc;
if (dbConnection) {
let dbQueryString = `SELECT * FROM npc_resp WHERE npc_resp_trig = ${npcTriggerDatabaseId} AND npc_resp_enabled = 1`;
let dbQuery = queryDatabase(dbConnection, dbQueryString);
if (dbQuery) {
while (dbAssoc = fetchQueryAssoc(dbQuery)) {
let tempNPCTriggerResponseData = new NPCTriggerResponseData(dbAssoc);
tempNPCTriggerResponses.push(tempNPCTriggerResponseData);
}
freeDatabaseQuery(dbQuery);
dbAssoc = await fetchQueryAssoc(dbConnection, dbQueryString);
for (let i in dbAssoc) {
let tempNPCTriggerResponseData = new NPCTriggerResponseData(dbAssoc[i]);
tempNPCTriggerResponses.push(tempNPCTriggerResponseData);
}
disconnectFromDatabase(dbConnection);
}
logToConsole(LOG_DEBUG, `[VRR.NPC]: ${tempNPCTriggerResponses.length} responses loaded for trigger ${npcTriggerDatabaseId} from database successfully!`);
logToConsole(LOG_DEBUG, `[AGRP.NPC]: ${tempNPCTriggerResponses.length} responses loaded for trigger ${npcTriggerDatabaseId} from database successfully!`);
return tempNPCTriggerResponses;
}
@@ -356,28 +351,28 @@ function saveAllNPCsToDatabase() {
function saveNPCToDatabase(npcDataId) {
if (getServerConfig().devServer) {
logToConsole(LOG_VERBOSE, `[VRR.NPC]: NPC ${npcDataId} can't be saved because server is running as developer only. Aborting save ...`);
logToConsole(LOG_VERBOSE, `[AGRP.NPC]: NPC ${npcDataId} can't be saved because server is running as developer only. Aborting save ...`);
return false;
}
if (getNPCData(npcDataId) == false) {
logToConsole(LOG_VERBOSE, `[VRR.NPC]: NPC ${npcDataId} data is invalid. Aborting save ...`);
logToConsole(LOG_VERBOSE, `[AGRP.NPC]: NPC ${npcDataId} data is invalid. Aborting save ...`);
return false;
}
let tempNPCData = getNPCData(npcDataId);
if (tempNPCData.databaseId == -1) {
logToConsole(LOG_VERBOSE, `[VRR.NPC]: NPC ${npcDataId} is a temp NPC. Aborting save ...`);
logToConsole(LOG_VERBOSE, `[AGRP.NPC]: NPC ${npcDataId} is a temp NPC. Aborting save ...`);
return false;
}
if (!tempNPCData.needsSaved) {
logToConsole(LOG_VERBOSE, `[VRR.NPC]: NPC ${npcDataId} hasn't changed data. Aborting save ...`);
logToConsole(LOG_VERBOSE, `[AGRP.NPC]: NPC ${npcDataId} hasn't changed data. Aborting save ...`);
return false;
}
logToConsole(LOG_VERBOSE, `[VRR.NPC]: Saving NPC ${tempNPCData.databaseId} to database ...`);
logToConsole(LOG_VERBOSE, `[AGRP.NPC]: Saving NPC ${tempNPCData.databaseId} to database ...`);
let dbConnection = connectToDatabase();
if (dbConnection) {
if (tempNPCData.ped != false) {
@@ -394,6 +389,7 @@ function saveNPCToDatabase(npcDataId) {
let safeAnimationName = escapeDatabaseString(dbConnection, tempNPCData.animationName);
let safeName = escapeDatabaseString(dbConnection, tempNPCData.name);
let safeTitle = escapeDatabaseString(dbConnection, tempNPCData.title);
let data = [
["npc_server", getServerId()],
@@ -416,6 +412,15 @@ function saveNPCToDatabase(npcDataId) {
["npc_threats", toInteger(tempNPCData.threats)],
["npc_stay", boolToInt(tempNPCData.stay)],
["npc_type_flags", toInteger(tempNPCData.typeFlags)],
["npc_int", toInteger(tempNPCData.interior)],
["npc_vw", toInteger(tempNPCData.dimension)],
["npc_fight_style", toInteger(tempNPCData.fightStyle)],
["npc_walk_style", toInteger(tempNPCData.walkStyle)],
["npc_rank", toInteger(tempNPCData.rank)],
["npc_title", toString(safeTitle)],
["npc_enabled", boolToInt(tempNPCData.enabled)],
["npc_lookatplr", boolToInt(tempNPCData.lookAtPlayer)],
//["npc_recreate", toInteger(tempNPCData.recreateOnDeath)],
];
let dbQuery = null;
@@ -434,7 +439,7 @@ function saveNPCToDatabase(npcDataId) {
disconnectFromDatabase(dbConnection);
return true;
}
logToConsole(LOG_VERBOSE, `[VRR.NPC]: Saved NPC ${npcDataId} to database!`);
logToConsole(LOG_VERBOSE, `[AGRP.NPC]: Saved NPC ${npcDataId} to database!`);
return false;
}
@@ -502,7 +507,7 @@ function deleteNPCCommand(command, params, client) {
let npcName = getNPCData(closestNPC).name;
deleteNPC(closestNPC);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} deleted NPC {npcPink}${npcName}`);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} deleted NPC {npcPink}${npcName}`, true);
}
// ===========================================================================
@@ -512,7 +517,7 @@ function deleteNPC(npcId) {
if (getNPCData(npcId)) {
if (getNPCData(npcId).ped != false) {
deleteEntity(getNPCData(npcId).ped);
deleteGameElement(getNPCData(npcId).ped);
}
getServerData().npcs.splice(npcId, 1);
}
@@ -606,7 +611,7 @@ function setNPCClanCommand(command, params, client) {
getNPCData(closestNPC).ownerId = getClanData(clanId).databaseId;
getNPCData(closestNPC).needsSaved = true;
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} set {npcPink}${getNPCData(closestNPC).name}${MAINCOLOUR}'s clan to {clanOrange}${getClanData(clanId).name}`);
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} set {npcPink}${getNPCData(closestNPC).name}${MAINCOLOUR}'s clan to {clanOrange}${getClanData(clanId).name}`, true);
}
// ===========================================================================
@@ -618,25 +623,11 @@ function addNPCTriggerCommand(command, params, client) {
}
let closestNPC = getClosestNPC(getPlayerPosition(client), getPlayerDimension(client), getPlayerInterior(client));
let clanId = getClanFromParams(params);
if (!getNPCData(closestNPC)) {
messagePlayerError(client, getLocaleString(client, "InvalidNPC"));
return false;
}
if (!getClanData(clanId)) {
messagePlayerError(client, getLocaleString(client, "InvalidClan"));
return false;
}
//let triggerData = new TriggerData();
getNPCData(closestNPC).ownerType = AGRP_NPC_OWNER_CLAN;
getNPCData(closestNPC).ownerId = getClanData(clanId).databaseId;
getNPCData(closestNPC).needsSaved = true;
messageAdmins(`{adminOrange}${getPlayerName(client)}{MAINCOLOUR} set {npcPink}${getNPCData(closestNPC).name}${MAINCOLOUR}'s clan to {clanOrange}${getClanData(clanId).name}`);
}
// ===========================================================================
@@ -664,7 +655,7 @@ function getNPCInfoCommand(command, params, client) {
return false;
}
let closestNPC = getClosestNPC(getPlayerPosition(client));
let closestNPC = getClosestNPC(getPlayerPosition(client), getPlayerDimension(client), getPlayerInterior(client));
if (!getNPCData(closestNPC)) {
messagePlayerError(client, getLocaleString(client, "InvalidNPC"));
@@ -724,13 +715,15 @@ function getNPCInfoCommand(command, params, client) {
// ===========================================================================
function getClosestNPC(position, interior, dimension) {
function getClosestNPC(position, dimension, interior) {
let npcs = getServerData().npcs;
let closest = 0;
for (let i in npcs) {
if (getDistance(npcs[i].ped.position, position) < getDistance(npcs[closest].ped.position, position) && npcs[closest].interior == interior && npcs[closest].dimension == dimension) {
closest = i;
if (npcs[i].interior == interior && npcs[i].dimension == dimension) {
if (getDistance(npcs[i].ped.position, position) < getDistance(npcs[closest].ped.position, position)) {
closest = i;
}
}
}

View File

@@ -50,14 +50,18 @@ let paintBallItemNames = {
// ===========================================================================
function initPaintBallScript() {
logToConsole(LOG_DEBUG, "[VRR.PaintBall]: Initializing paintball script ...");
logToConsole(LOG_DEBUG, "[VRR.PaintBall]: Paintball script initialized successfully!");
logToConsole(LOG_DEBUG, "[AGRP.PaintBall]: Initializing paintball script ...");
logToConsole(LOG_DEBUG, "[AGRP.PaintBall]: Paintball script initialized successfully!");
}
// ===========================================================================
function startPaintBall(client) {
logToConsole(LOG_DEBUG, `[VRR.PaintBall]: Starting paintball for ${getPlayerDisplayForConsole(client)} ...`);
if (isPlayerInPaintBall(client)) {
return false;
}
logToConsole(LOG_DEBUG, `[AGRP.PaintBall]: Starting paintball for ${getPlayerDisplayForConsole(client)} ...`);
if (isPlayerWorking(client)) {
stopWorking(client);
}
@@ -67,25 +71,62 @@ function startPaintBall(client) {
getPlayerData(client).inPaintBall = true;
getPlayerData(client).paintBallBusiness = getPlayerBusiness(client);
getPlayerData(client).paintBallKills = 0;
getPlayerData(client).paintBallDeaths = 0;
getBusinessData(getPlayerData(client).paintBallBusiness).paintBallPlayers.push(client.index);
getBusinessData(getPlayerData(client).paintBallBusiness).paintBallPot += getBusinessData(getPlayerData(client).paintBallBusiness).entranceFee * 2;
givePlayerPaintBallItems(client);
logToConsole(LOG_DEBUG, `[VRR.PaintBall]: Started paintball for ${getPlayerDisplayForConsole(client)} successfully`);
messagePlayerAlert(client, getLocaleString(client, "JoinedPaintBall"));
logToConsole(LOG_DEBUG, `[AGRP.PaintBall]: Started paintball for ${getPlayerDisplayForConsole(client)} successfully`);
}
// ===========================================================================
function stopPaintBall(client) {
logToConsole(LOG_DEBUG, `[VRR.PaintBall]: Stopping paintball for ${getPlayerDisplayForConsole(client)} ...`);
if (!isPlayerInPaintBall(client)) {
return false;
}
logToConsole(LOG_DEBUG, `[AGRP.PaintBall]: Stopping paintball for ${getPlayerDisplayForConsole(client)} ...`);
clearPlayerWeapons(client);
deletePaintBallItems(client);
restorePlayerTempLockerItems(client);
logToConsole(LOG_DEBUG, `[VRR.PaintBall]: Stopped paintball for ${getPlayerDisplayForConsole(client)} successfully`);
let tempBusiness = getPlayerData(client).paintBallBusiness;
messagePlayerAlert(client, getLocaleString(client, "LeftPaintBall"));
getBusinessData(tempBusiness).paintBallPlayers.splice(getBusinessData(tempBusiness).paintBallPlayers.indexOf(client.index), 1);
if (getBusinessData(tempBusiness).paintBallPlayers.length == 0) {
messagePlayerAlert(client, getLocaleString(client, "PaintBallEnded"));
messagePlayerInfo(client, getLocaleString(client, "YourPaintBallResults", getPlayerData(client).paintBallKills, getPlayerData(client).paintBallDeaths));
//messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderEventWinners")));
//messagePlayerInfo(client, makeChatBoxSectionHeader(getLocaleString(client, "HeaderEventWinners")));
givePlayerCash(client, getBusinessData(tempBusiness).paintBallPot);
getBusinessData(tempBusiness).paintBallPot = 0;
}
getPlayerData(client).inPaintBall = false;
getPlayerData(client).paintBallBusiness = false;
getPlayerData(client).tempLockerType = AGRP_TEMP_LOCKER_TYPE_NONE;
getPlayerData(client).paintBallKills = 0;
getPlayerData(client).paintBallDeaths = 0;
//checkRemainingPaintBallPlayers(tempBusiness);
logToConsole(LOG_DEBUG, `[AGRP.PaintBall]: Stopped paintball for ${getPlayerDisplayForConsole(client)} successfully`);
}
// ===========================================================================
function givePlayerPaintBallItems(client) {
logToConsole(LOG_DEBUG, `[VRR.PaintBall]: Giving ${getPlayerDisplayForConsole(client)} paintball items ...`);
logToConsole(LOG_DEBUG, `[AGRP.PaintBall]: Giving ${getPlayerDisplayForConsole(client)} paintball items ...`);
for (let i in paintBallItems) {
let itemId = createItem(paintBallItems[i], 999999, AGRP_ITEM_OWNER_PLAYER, getPlayerCurrentSubAccount(client).databaseId);
getItemData(itemId).needsSaved = false;
@@ -95,26 +136,26 @@ function givePlayerPaintBallItems(client) {
getPlayerData(client).paintBallItemCache.push(itemId);
updatePlayerHotBar(client);
}
logToConsole(LOG_DEBUG, `[VRR.PaintBall]: Gave ${getPlayerDisplayForConsole(client)} paintball items successfully`);
logToConsole(LOG_DEBUG, `[AGRP.PaintBall]: Gave ${getPlayerDisplayForConsole(client)} paintball items successfully`);
}
// ===========================================================================
function deletePaintBallItems(client) {
logToConsole(LOG_DEBUG, `[VRR.PaintBall]: Deleting paintball items for ${getPlayerDisplayForConsole(client)} ...`);
logToConsole(LOG_DEBUG, `[AGRP.PaintBall]: Deleting paintball items for ${getPlayerDisplayForConsole(client)} ...`);
for (let i in getPlayerData(client).paintBallItemCache) {
deleteItem(getPlayerData(client).paintBallItemCache[i]);
}
cachePlayerHotBarItems(client);
updatePlayerHotBar(client);
logToConsole(LOG_DEBUG, `[VRR.PaintBall]: Deleting paintball items for ${getPlayerDisplayForConsole(client)} successfully`);
logToConsole(LOG_DEBUG, `[AGRP.PaintBall]: Deleting paintball items for ${getPlayerDisplayForConsole(client)} successfully`);
}
// ===========================================================================
function cacheAllPaintBallItemTypes() {
logToConsole(LOG_DEBUG, `[VRR.PaintBall]: Cacheing all paintball item types ...`);
logToConsole(LOG_DEBUG, `[AGRP.PaintBall]: Cacheing all paintball item types ...`);
for (let i in paintBallItemNames[getGame()]) {
let itemTypeId = getItemTypeFromParams(paintBallItemNames[getGame()][i]);
if (itemTypeId != -1 && getItemTypeData(itemTypeId) != false) {
@@ -122,13 +163,13 @@ function cacheAllPaintBallItemTypes() {
}
}
logToConsole(LOG_DEBUG, `[VRR.PaintBall]: Cached all paintball item types`);
logToConsole(LOG_DEBUG, `[AGRP.PaintBall]: Cached all paintball item types`);
}
// ===========================================================================
function respawnPlayerForPaintBall(client) {
logToConsole(LOG_DEBUG, `[VRR.PaintBall]: Respawning ${getPlayerDisplayForConsole(client)} for paintball ...`);
logToConsole(LOG_DEBUG, `[AGRP.PaintBall]: Respawning ${getPlayerDisplayForConsole(client)} for paintball ...`);
despawnPlayer(client);
let businessId = getPlayerData(client).paintBallBusiness;
@@ -143,7 +184,7 @@ function respawnPlayerForPaintBall(client) {
makePlayerStopAnimation(client);
setPlayerControlState(client, true);
resetPlayerBlip(client);
logToConsole(LOG_DEBUG, `[VRR.PaintBall]: Respawned ${getPlayerDisplayForConsole(client)} for paintball successfully`);
logToConsole(LOG_DEBUG, `[AGRP.PaintBall]: Respawned ${getPlayerDisplayForConsole(client)} for paintball successfully`);
}
// ===========================================================================
@@ -152,4 +193,12 @@ function isPlayerInPaintBall(client) {
return getPlayerData(client).inPaintBall;
}
// ===========================================================================
function checkRemainingPaintBallPlayers(businessIndex) {
//if (getBusinessData(businessIndex).paintBallPlayers.length == 0) {
//
//}
}
// ===========================================================================

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

@@ -0,0 +1,300 @@
// ===========================================================================
// Asshat Gaming Roleplay
// https://github.com/VortrexFTW/agrp_main
// (c) 2022 Asshat Gaming
// ===========================================================================
// FILE: prompt.js
// DESC: Provides prompt (yes/no confirmations) functions and usage
// TYPE: Server (JavaScript)
// ===========================================================================
// Prompts (used for prompt responses)
const AGRP_PROMPT_NONE = 0;
const AGRP_PROMPT_CREATEFIRSTCHAR = 1;
const AGRP_PROMPT_BIZORDER = 2;
const AGRP_PROMPT_GIVEVEHTOCLAN = 3;
const AGRP_PROMPT_GIVEBIZTOCLAN = 4;
const AGRP_PROMPT_GIVEHOUSETOCLAN = 5;
const AGRP_PROMPT_BUYBIZ = 6;
const AGRP_PROMPT_BUYHOUSE = 7;
const AGRP_PROMPT_RESETKEYBINDS = 8;
// ===========================================================================
function initPromptScript() {
logToConsole(LOG_INFO, "[AGRP.Prompt]: Initializing Prompt script ...");
logToConsole(LOG_INFO, "[AGRP.Prompt]: Prompt script initialized successfully!");
}
// ===========================================================================
function playerPromptAnswerNo(client) {
if (getPlayerData(client).promptType == AGRP_PROMPT_NONE) {
return false;
}
logToConsole(LOG_DEBUG, `[AGRP.Prompt] ${getPlayerDisplayForConsole(client)} answered NO to their prompt (${getPlayerData(client).promptType})`);
switch (getPlayerData(client).promptType) {
case AGRP_PROMPT_CREATEFIRSTCHAR:
logToConsole(LOG_DEBUG, `${getPlayerDisplayForConsole(client)} chose not to create a first character. Kicking them from the server ...`);
showPlayerErrorGUI(client, getLocaleString(client, "DidNotCreateCharacter"), getLocaleString(client, getLocaleString(client, "GUIWarningTitle")));
getPlayerData(targetClient).customDisconnectReason = "FailedToCreateCharacter";
setTimeout(function () { disconnectPlayer(client); }, 5000);
break;
case AGRP_PROMPT_BIZORDER:
if (getPlayerData(client).businessOrderAmount > 0) {
if (doesPlayerUseGUI(client)) {
showPlayerErrorGUI(client, getLocaleString(client, "BusinessOrderCanceled"), getLocaleString(client, "Alert"));
} else {
logToConsole(LOG_DEBUG, `${getPlayerDisplayForConsole(client)} canceled the order of ${getPlayerData(client).businessOrderAmount} ${getPlayerData(client).businessOrderItem} at ${getPlayerData(client).businessOrderCost / getPlayerData(client).businessOrderAmount} each for business ${getBusinessData(getPlayerData(client).businessOrderBusiness)}`);
messagePlayerError(client, getLocaleString(client, "BusinessOrderCanceled"));
}
} else {
showPlayerErrorGUI(client, getLocaleString(client, "NotOrderingAnyBusinessItems"), getLocaleString(client, getLocaleString(client, "GUIWarningTitle")));
}
break;
default:
messagePlayerError(client, getLocaleString(client, "NoPromptReject"));
submitBugReport(client, `[AUTOMATED REPORT] Tried to reject invalid prompt type: ${getPlayerData(client).promptType}`);
break;
}
getPlayerData(client).promptType = AGRP_PROMPT_NONE;
}
// ===========================================================================
function playerPromptAnswerYes(client) {
if (getPlayerData(client).promptType == AGRP_PROMPT_NONE) {
return false;
}
logToConsole(LOG_DEBUG, `[AGRP.Prompt] ${getPlayerDisplayForConsole(client)} answered YES to their prompt (${getPlayerData(client).promptType})`);
switch (getPlayerData(client).promptType) {
case AGRP_PROMPT_CREATEFIRSTCHAR: {
showPlayerNewCharacterGUI(client);
break;
}
case AGRP_PROMPT_BIZORDER: {
if (getPlayerData(client).businessOrderAmount > 0) {
if (getBusinessData(getPlayerData(client).businessOrderBusiness).till < getPlayerData(client).businessOrderCost) {
logToConsole(LOG_DEBUG, `[AGRP.Prompt] ${getPlayerDisplayForConsole(client)} failed to order ${getPlayerData(client).businessOrderAmount} ${getItemTypeData(getPlayerData(client).businessOrderItem).name} at ${getPlayerData(client).businessOrderCost / getPlayerData(client).businessOrderAmount} each for business ${getBusinessData(getPlayerData(client).businessOrderBusiness).name} (Reason: Not enough money in business till)`);
if (doesPlayerHaveGUIEnabled(client)) {
showPlayerErrorGUI(client, getLocaleString(client, "BusinessOrderNotEnoughMoney", `{ALTCOLOUR}/bizdeposit{MAINCOLOUR}`), getLocaleString(client, "BusinessOrderCanceled"));
} else {
messagePlayerError(client, getLocaleString(client, "BusinessOrderNotEnoughMoney", `{ALTCOLOUR}/bizdeposit{MAINCOLOUR}`));
}
getPlayerData(client).businessOrderAmount = 0;
getPlayerData(client).businessOrderBusiness = false;
getPlayerData(client).businessOrderItem = -1;
getPlayerData(client).businessOrderValue = -1;
} else {
logToConsole(LOG_DEBUG, `[AGRP.Prompt] ${getPlayerDisplayForConsole(client)} successfully ordered ${getPlayerData(client).businessOrderAmount} ${getItemTypeData(getPlayerData(client).businessOrderItem).name} at ${getPlayerData(client).businessOrderCost / getPlayerData(client).businessOrderAmount} each for business ${getBusinessData(getPlayerData(client).businessOrderBusiness).name}`);
showPlayerInfoGUI(client, getLocaleString(client, "BusinessOrderSuccessInfo", getPlayerData(client).businessOrderAmount, getItemTypeData(getPlayerData(client).businessOrderItem).name, getItemValueDisplay(getPlayerData(client).businessOrderItem, getPlayerData(client).businessOrderValue), getPlayerData(client).businessOrderCost), getLocaleString(client, "GUIInfoTitle"));
createItem(getPlayerData(client).businessOrderItem, getPlayerData(client).businessOrderValue, AGRP_ITEM_OWNER_BIZFLOOR, getBusinessData(getPlayerData(client).businessOrderBusiness).databaseId, getPlayerData(client).businessOrderAmount);
cacheBusinessItems(getPlayerData(client).businessOrderBusiness);
getBusinessData(getPlayerData(client).businessOrderBusiness).till -= getPlayerData(client).businessOrderCost;
updateBusinessPickupLabelData(getPlayerData(client).businessOrderBusiness);
getPlayerData(client).businessOrderAmount = 0;
getPlayerData(client).businessOrderBusiness = false;
getPlayerData(client).businessOrderItem = -1;
getPlayerData(client).businessOrderValue = -1;
}
} else {
showPlayerErrorGUI(client, ``, `Business Order Canceled`);
}
break;
}
case AGRP_PROMPT_GIVEVEHTOCLAN: {
if (!isPlayerInAnyVehicle(client)) {
messagePlayerError(client, getLocaleString(client, "MustBeInVehicle"));
return false;
}
if (!getVehicleData(getPlayerVehicle(client))) {
messagePlayerError(client, getLocaleString(client, "RandomVehicleCommandsDisabled"));
return false;
}
if (getVehicleData(getPlayerVehicle(client)).ownerType != AGRP_VEHOWNER_PLAYER) {
messagePlayerError(client, getLocaleString(client, "MustOwnVehicle"));
return false;
}
if (getVehicleData(getPlayerVehicle(client)).ownerId != getPlayerCurrentSubAccount(client).databaseId) {
messagePlayerError(client, getLocaleString(client, "MustOwnVehicle"));
return false;
}
getVehicleData(getPlayerVehicle(client)).ownerType = AGRP_VEHOWNER_CLAN;
getVehicleData(getPlayerVehicle(client)).ownerId = getPlayerCurrentSubAccount(client).clan;
messagePlayerSuccess(client, getLocaleString(client, "GaveVehicleToClan", getVehicleName(getPlayerVehicle(client))));
//messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} {MAINCOLOUR}set their {vehiclePurple}${getVehicleName(vehicle)} {MAINCOLOUR}owner to the {clanOrange}${getClanData(clanId).name} {MAINCOLOUR}clan`);
break;
}
case AGRP_PROMPT_GIVEHOUSETOCLAN: {
let houseId = getPlayerHouse(client);
if (!houseId) {
messagePlayerError(client, getLocaleString(client, "InvalidHouse"));
return false;
}
if (getHouseData(houseId).ownerType != AGRP_VEHOWNER_PLAYER) {
messagePlayerError(client, getLocaleString(client, "MustOwnHouse"));
return false;
}
if (getHouseData(houseId).ownerId != getPlayerCurrentSubAccount(client).databaseId) {
messagePlayerError(client, getLocaleString(client, "MustOwnHouse"));
return false;
}
getHouseData(houseId).ownerType = AGRP_HOUSE_OWNER_CLAN;
getHouseData(houseId).ownerId = getPlayerCurrentSubAccount(client).clan;
messagePlayerSuccess(client, getLocaleString(client, "GaveHouseToClan"));
//messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} {MAINCOLOUR}set their {vehiclePurple}${getVehicleName(vehicle)} {MAINCOLOUR}owner to the {clanOrange}${getClanData(clanId).name} {MAINCOLOUR}clan`);
break;
}
case AGRP_PROMPT_GIVEBIZTOCLAN: {
let businessId = getPlayerBusiness(client);
if (!businessId) {
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
if (getBusinessData(businessId).ownerType != AGRP_VEHOWNER_PLAYER) {
messagePlayerError(client, getLocaleString(client, "MustOwnBusiness"));
return false;
}
if (getBusinessData(businessId).ownerId != getPlayerCurrentSubAccount(client).databaseId) {
messagePlayerError(client, getLocaleString(client, "MustOwnBusiness"));
return false;
}
getBusinessData(businessId).ownerType = AGRP_BIZ_OWNER_CLAN;
getBusinessData(businessId).ownerId = getPlayerCurrentSubAccount(client).clan;
messagePlayerSuccess(client, getLocaleString(client, "GaveBusinessToClan"));
//messageAdmins(`{ALTCOLOUR}${getPlayerName(client)} {MAINCOLOUR}set their {vehiclePurple}${getVehicleName(vehicle)} {MAINCOLOUR}owner to the {clanOrange}${getClanData(clanId).name} {MAINCOLOUR}clan`);
break;
}
case AGRP_PROMPT_BUYHOUSE: {
let houseId = getPlayerHouse(client);
if (!houseId) {
messagePlayerError(client, getLocaleString(client, "InvalidHouse"));
return false;
}
if (getHouseData(houseId).buyPrice <= 0) {
messagePlayerError(client, getLocaleString(client, "HouseNotForSale"));
return false;
}
if (getPlayerCurrentSubAccount(client).cash < getHouseData(houseId).buyPrice) {
messagePlayerError(client, getLocaleString(client, "HousePurchaseNotEnoughMoney"));
return false;
}
getHouseData(houseId).ownerType = AGRP_HOUSE_OWNER_PLAYER;
getHouseData(houseId).ownerId = getPlayerCurrentSubAccount(client).databaseId;
getHouseData(houseId).buyPrice = 0;
getHouseData(houseId).needsSaved = true;
updateHousePickupLabelData(houseId);
messageDiscordEventChannel(`🏘️ ${getCharacterFullName(client)} is now the owner of house *${getHouseData(houseId).description}*!`);
messagePlayerSuccess(client, `🏘️ You are now the owner of {houseGreen}${getHouseData(houseId).description}`);
break;
}
case AGRP_PROMPT_BUYBIZ: {
let businessId = getPlayerBusiness(client);
if (!businessId) {
messagePlayerError(client, getLocaleString(client, "InvalidBusiness"));
return false;
}
if (getBusinessData(businessId).buyPrice <= 0) {
messagePlayerError(client, getLocaleString(client, "BusinessNotForSale"));
return false;
}
if (getPlayerCurrentSubAccount(client).cash < getBusinessData(businessId).buyPrice) {
messagePlayerError(client, getLocaleString(client, "BusinessPurchaseNotEnoughMoney"));
return false;
}
getBusinessData(businessId).ownerType = AGRP_BIZ_OWNER_PLAYER;
getBusinessData(businessId).ownerId = getPlayerCurrentSubAccount(client).databaseId;
getBusinessData(businessId).buyPrice = 0;
getBusinessData(businessId).needsSaved = true;
updateBusinessPickupLabelData(businessId);
messageDiscordEventChannel(`🏢 ${getCharacterFullName(client)} is now the owner of *${getBusinessData(businessId).name}*!`);
messagePlayerSuccess(client, getLocaleString(client, "BusinessPurchased", `{businessBlue}${getBusinessData(businessId).name}{MAINCOLOUR}`));
break;
}
case AGRP_PROMPT_RESETKEYBINDS: {
// TODO: Needs database query!
//for (let i in getPlayerData(client).keyBinds) {
// removePlayerKeyBind(client, getPlayerData(client).keyBinds[i].key)
//}
//for (let i in getGlobalConfig().keyBind.defaultKeyBinds) {
// let tempKeyBindData = new KeyBindData(false);
// tempKeyBindData.databaseId = -1;
// tempKeyBindData.key = getKeyIdFromParams(getGlobalConfig().keyBind.defaultKeyBinds[i].keyName);
// tempKeyBindData.commandString = getGlobalConfig().keyBind.defaultKeyBinds[i].commandString;
// tempKeyBindData.keyState = getGlobalConfig().keyBind.defaultKeyBinds[i].keyState;
// getPlayerData(client).keyBinds.push(tempKeyBindData);
//}
//messagePlayerSuccess(client, getLocaleString(client, "KeyBindsReset"));
break;
}
case AGRP_PROMPT_COPYKEYBINDSTOSERVER: {
//messagePlayerSuccess(client, getLocaleString(client, "KeyBindsCopiedToServer", serverName));
break;
}
default: {
messagePlayerError(client, getLocaleString(client, "NoPromptAccept"));
submitBugReport(client, `[AUTOMATED REPORT] Tried to accept invalid prompt type: ${getPlayerData(client).promptType}`);
break;
}
}
getPlayerData(client).promptType = AGRP_PROMPT_NONE;
}
// ===========================================================================
function playerPromptAnswerYesCommand(command, params, client) {
playerPromptAnswerYes(client);
}
// ===========================================================================
function playerPromptAnswerNoCommand(command, params, client) {
playerPromptAnswerNo(client);
}
// ===========================================================================
function showPlayerTwoFactorAuthenticationGUI(client) {
sendNetworkEventToPlayer("agrp.2fa", client);
}
// ===========================================================================

2658
scripts/server/property.js Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -9,8 +9,8 @@
// ===========================================================================
function initRaceScript() {
logToConsole(LOG_INFO, "[VRR.Race]: Initializing race script ...");
logToConsole(LOG_INFO, "[VRR.Race]: Race script initialized successfully!");
logToConsole(LOG_INFO, "[AGRP.Race]: Initializing race script ...");
logToConsole(LOG_INFO, "[AGRP.Race]: Race script initialized successfully!");
}
// ===========================================================================

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