diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index e7042c2e5..0a174232d 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -5,7 +5,7 @@ Contributing to AsYetUntitled ## Guidelines -1. **Don't break the build**: We have a simple continuous integration system setup with [Travis](https://travis-ci.org/AsYetUntitled/Framework). If your pull request does not pass then it will not be merged. Travis will only check your changes after you submit a pull request. +1. **Don't break the build**: We have a simple continuous integration system setup with [GitHub Actions](https://github.com/AsYetUntitled/Framework/actions). If your pull request does not pass then it will not be merged. GitHub Actions will only check your changes after you submit a pull request. 2. **Search before posting**: It is likely that what you have to say has already been said. Use the search function to see if someone else has already made a similar issue or pull request. 3. **Test, test, and test**: Test your changes thoroughly prior to submitting a pull request. If you were unable to test your changes then ask if someone else can test them for you in your pull request message. Take it a step further and test another person's pull request and report your result to them. 4. **Bug fixes over features**: New features may be cool, but ideally bug fixes and optimisations for existing features should be prioritised above implementing new features. diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml new file mode 100644 index 000000000..3b126b7bd --- /dev/null +++ b/.github/workflows/validate.yml @@ -0,0 +1,25 @@ +name: Validation + +on: + push: + branches: + - 'master' + - 'v5.X.X' + pull_request: + branches: + - 'master' + - 'v5.X.X' + +jobs: + validate: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-python@v1 + with: + python-version: '3.6.10' + - name: Validate SQF + run: python ./tools/sqf_validator.py + - name: Validate Configs + run: python ./tools/config_style_checker.py diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 2ea664a88..000000000 --- a/.travis.yml +++ /dev/null @@ -1,10 +0,0 @@ -language: python -python: -- '3.4' -before_script: -# Credits to ACE3 for these validators -- wget https://www.dropbox.com/s/wzj5js0kc2xlanc/sqf_validator.py -- wget https://www.dropbox.com/s/jza43yuxswvx2hz/config_style_checker.py -script: -- python3 sqf_validator.py -- python3 config_style_checker.py diff --git a/AL.ini b/AL.ini new file mode 100755 index 000000000..b23904e72 --- /dev/null +++ b/AL.ini @@ -0,0 +1,352 @@ +[Default] + +Version = 1 +;; Used incase there is ever a breaking change, or to inform user in log about a new feature. + +Strip Chars = ";[]" +;; List of characters to strip out +Strip Chars Mode = 0 +;; 0 = Strip Bad Chars, 1 = Strip + Log Bad Chars, 2 = Return Error & Log Bad Chars +;; Note: Logging on works when sending data to database. + +Input SQF Parser = false +;; Expermential +;; If enabled will use SQF Array Parser instead of : seperator for values +;; i.e 0:SQL:UpdatePlayer:["Joe",[1,2,0],0.22333,"PlayerBackpack",-3] +;; Advantage is that you don't need to strip : seperator from user inputted values + +[resetLifeVehicles] +SQL1_1 = CALL resetLifeVehicles + +[deleteOldHouses] +SQL1_1 = CALL deleteOldHouses + +[deleteDeadVehicles] +SQL1_1 = CALL deleteDeadVehicles + +[deleteOldGangs] +SQL1_1 = CALL deleteOldGangs + +[deleteOldContainers] +SQL1_1 = CALL deleteOldContainers + + + +[checkPlayerExists] +SQL1_1 = SELECT pid, name FROM players WHERE pid = ? +SQL1_INPUTS = 1 +OUTPUT = 1-STRING, 2-STRING + +[selectName] +SQL1_1 = SELECT name FROM players WHERE pid = ? +SQL1_INPUTS = 1 +OUTPUT = 1-STRING + +[insertNewPlayer] +SQL1_1 = INSERT INTO players (pid, name, cash, bankacc, aliases, cop_licenses, med_licenses, civ_licenses, civ_gear, cop_gear, med_gear) VALUES (?, ?, ?, ?, ?,'[]','[]','[]','[]','[]','[]') +SQL1_INPUTS = 1, 2, 3, 4, 5 + +[selectWest] +SQL1_1 = SELECT pid, name, cash, bankacc, adminlevel, donorlevel, cop_licenses, coplevel, cop_gear, blacklist, cop_stats, playtime FROM players WHERE pid = ? +SQL1_INPUTS = 1 +OUTPUT = 1-STRING, 2-STRING, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 + +[selectCiv] +SQL1_1 = SELECT pid, name, cash, bankacc, adminlevel, donorlevel, civ_licenses, arrested, civ_gear, civ_stats, civ_alive, civ_position, playtime FROM players WHERE pid = ? +SQL1_INPUTS = 1 +OUTPUT = 1-STRING, 2-STRING, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 + +[selectIndep] +SQL1_1 = SELECT pid, name, cash, bankacc, adminlevel, donorlevel, med_licenses, mediclevel, med_gear, med_stats, playtime FROM players WHERE pid = ? +SQL1_INPUTS = 1 +OUTPUT = 1-STRING, 2-STRING, 3, 4, 5, 6, 7, 8, 9, 10, 11 + +[updateWest] +SQL1_1 = UPDATE players SET name = ?, cash = ?, bankacc = ?, cop_gear = ?, cop_licenses = ?, cop_stats = ?, playtime = ? WHERE pid = ? +SQL1_INPUTS = 1, 2, 3, 4, 5, 6, 7, 8 + +[updateCiv] +SQL1_1 = UPDATE players SET name = ?, cash = ?, bankacc = ?, civ_licenses = ?, civ_gear = ?, arrested = ?, civ_stats = ?, civ_alive = ?, civ_position = ?, playtime = ? WHERE pid = ? +SQL1_INPUTS = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 + +[updateIndep] +SQL1_1 = UPDATE players SET name = ?, cash = ?, bankacc = ?, med_licenses = ?, med_gear = ?, med_stats = ?, playtime = ? WHERE pid = ? +SQL1_INPUTS = 1, 2, 3, 4, 5, 6, 7, 8 + +[updateCash] +SQL1_1 = UPDATE players SET cash = ? WHERE pid = ? +SQL1_INPUTS = 1, 2 + +[updateBank] +SQL1_1 = UPDATE players SET bankacc = ? WHERE pid = ? +SQL1_INPUTS = 1, 2 + +[updateWestLicenses] +SQL1_1 = UPDATE players SET cop_licenses = ? WHERE pid = ? +SQL1_INPUTS = 1, 2 + +[updateCivLicenses] +SQL1_1 = UPDATE players SET civ_licenses = ? WHERE pid = ? +SQL1_INPUTS = 1, 2 + +[updateIndepLicenses] +SQL1_1 = UPDATE players SET med_licenses = ? WHERE pid = ? +SQL1_INPUTS = 1, 2 + +[updateWestGear] +SQL1_1 = UPDATE players SET cop_gear = ? WHERE pid = ? +SQL1_INPUTS = 1, 2 + +[updateCivGear] +SQL1_1 = UPDATE players SET civ_gear = ? WHERE pid = ? +SQL1_INPUTS = 1, 2 + +[updateIndepGear] +SQL1_1 = UPDATE players SET med_gear = ? WHERE pid = ? +SQL1_INPUTS = 1, 2 + +[updateCivPosition] +SQL1_1 = UPDATE players SET civ_alive = ?, civ_position = ? WHERE pid = ? +SQL1_INPUTS = 1, 2, 3 + +[updateCivAlive] +SQL1_1 = UPDATE players SET civ_alive = '0' WHERE civ_alive = '1' + +[updateArrested] +SQL1_1 = UPDATE players SET arrested = ? WHERE pid = ? +SQL1_INPUTS = 1, 2 + +[updateCashAndBank] +SQL1_1 = UPDATE players SET cash = ?, bankacc = ? WHERE pid = ? +SQL1_INPUTS = 1, 2, 3 + + + +[selectPlayerGang] +SQL1_1 = SELECT id, owner, name, maxmembers, bank, members FROM gangs WHERE active = '1' AND members LIKE ? +SQL1_INPUTS = 1 +OUTPUT = 1, 2-STRING, 3-STRING, 4, 5, 6 + +[selectGangID] +SQL1_1 = SELECT id FROM gangs WHERE name = ? AND active = '1' +SQL1_INPUTS = 1 + +[selectGangIDFromMembers] +SQL1_1 = SELECT id FROM gangs WHERE members LIKE ? AND active = '1' +SQL1_INPUTS = 1 + +[selectGangIDFromOwner] +SQL1_1 = SELECT id FROM gangs WHERE owner = ? AND active = '1' +SQL1_INPUTS = 1 + +[selectInactiveGang] +SQL1_1 = SELECT id, active FROM gangs WHERE name = ? AND active = '0' +SQL1_INPUTS = 1 + +[updateGang] +SQL1_1 = UPDATE gangs SET active = '1', owner = ?, members = ? WHERE id = ? +SQL1_INPUTS = 1, 2, 3 + +[updateGang1] +SQL1_1 = UPDATE gangs SET bank = ?, maxmembers = ?, owner = ? WHERE id = ? +SQL1_INPUTS = 1, 2, 3, 4 + +[updateGangBank] +SQL1_1 = UPDATE gangs SET bank = ? WHERE id = ? +SQL1_INPUTS = 1, 2 + +[updateGangMembers] +SQL1_1 = UPDATE gangs SET members = ? WHERE id = ? +SQL1_INPUTS = 1, 2 + +[updateGangMaxmembers] +SQL1_1 = UPDATE gangs SET maxmembers = ? WHERE id = ? +SQL1_INPUTS = 1, 2 + +[updateGangOwner] +SQL1_1 = UPDATE gangs SET owner = ? WHERE id = ? +SQL1_INPUTS = 1, 2 + +[insertGang] +SQL1_1 = INSERT INTO gangs (owner, name, members) VALUES (?, ?, ?) +SQL1_INPUTS = 1, 2, 3 + +[deleteGang] +SQL1_1 = UPDATE gangs SET active = '0' WHERE id = ? +SQL1_INPUTS = 1 + + + +[insertHouse] +SQL1_1 = INSERT INTO houses (pid, pos, owned) VALUES (?, ?, '1') +SQL1_INPUTS = 1, 2 + +[selectHouseID] +SQL1_1 = SELECT id FROM houses WHERE pos = ? AND pid = ? AND owned = '1' +SQL1_INPUTS = 1, 2 + +[selectAllHouses] +SQL1_1 = SELECT COUNT(*) FROM houses WHERE owned = '1' + +[selectPlayerHouses] +SQL1_1 = SELECT houses.id, houses.pid, houses.pos, players.name, houses.garage FROM houses INNER JOIN players WHERE houses.owned = '1' AND houses.pid = players.pid LIMIT ?, 10 +SQL1_INPUTS = 1 +OUTPUT = 1, 2-STRING, 3, 4-STRING, 5 + +[selectHousePositions] +SQL1_1 = SELECT pid, pos FROM houses WHERE pid = ? AND owned = '1' +SQL1_INPUTS = 1 +OUTPUT = 1-STRING, 2 + +[updateHouseTrunk] +SQL1_1 = UPDATE containers SET inventory = ? WHERE id = ? +SQL1_INPUTS = 1, 2 + +[deleteHouse] +SQL1_1 = UPDATE houses SET owned = '0', pos = '[]' WHERE pid = ? AND pos = ? AND owned = '1' +SQL1_INPUTS = 1, 2 + +[deleteHouse1] +SQL1_1 = UPDATE houses SET owned = '0', pos = '[]' WHERE id = ? +SQL1_INPUTS = 1 + +[updateGarage] +SQL1_1 = UPDATE houses SET garage = ? WHERE pid = ? AND pos = ? +SQL1_INPUTS = 1, 2, 3 + +[selectContainerPositions] +SQL1_1 = SELECT pid, pos FROM containers WHERE pid = ? AND owned = '1' +SQL1_INPUTS = 1 +OUTPUT = 1-STRING, 2 + +[selectContainers] +SQL1_1 = SELECT pid, pos, classname, inventory, gear, dir, id FROM containers WHERE pid = ? AND owned = '1' +SQL1_INPUTS = 1 +OUTPUT = 1-STRING, 2, 3-STRING, 4, 5, 6, 7 + +[selectContainerID] +SQL1_1 = SELECT id FROM containers WHERE pos = ? AND pid = ? AND owned = '1' +SQL1_INPUTS = 1, 2 + +[insertContainer] +SQL1_1 = INSERT INTO containers (pid, pos, classname, inventory, gear, owned, dir) VALUES (?, ?, ?, '[[],0]', '[]', '1', ?) +SQL1_INPUTS = 1, 2, 3, 4 + +[updateContainer] +SQL1_1 = UPDATE containers SET gear = ? WHERE id = ? +SQL1_INPUTS = 1, 2 + +[deleteContainer] +SQL1_1 = UPDATE containers SET owned = '0', pos = '[]' WHERE pid = ? AND pos = ? AND owned = '1' +SQL1_INPUTS = 1, 2 + +[deleteContainer1] +SQL1_1 = UPDATE containers SET owned = '0', pos = '[]' WHERE id = ? +SQL1_INPUTS = 1 + + + + +[selectVehicles] +SQL1_1 = SELECT id, side, classname, type, pid, alive, active, plate, color FROM vehicles WHERE pid = ? AND alive = '1' AND active = '0' AND side = ? AND type = ? +SQL1_INPUTS = 1, 2, 3 +OUTPUT = 1, 2-STRING, 3-STRING, 4-STRING, 5-STRING, 6, 7, 8, 9 + +[selectVehiclesMore] +SQL1_1 = SELECT id, side, classname, type, pid, alive, active, plate, color, inventory, gear, fuel, damage, blacklist FROM vehicles WHERE id = ? AND pid = ? +SQL1_INPUTS = 1, 2 +OUTPUT = 1, 2-STRING, 3-STRING, 4-STRING, 5-STRING, 6, 7, 8, 9, 10, 11, 12, 13, 14 + +[updateVehicle] +SQL1_1 = UPDATE vehicles SET active = '1' WHERE pid = ? AND id = ? +SQL1_INPUTS = 1, 2 + +[updateVehicleBlacklist] +SQL1_1 = UPDATE vehicles SET blacklist = '0' WHERE id = ? AND pid = ? +SQL1_INPUTS = 1, 2 + +[updateVehicleBlacklistPlate] +SQL1_1 = UPDATE vehicles SET blacklist = '1' WHERE pid = ? AND plate = ? +SQL1_INPUTS = 1, 2 + +[updateVehicleFuel] +SQL1_1 = UPDATE vehicles SET active = '0', fuel = ?, damage = ? WHERE pid = ? AND plate = ? +SQL1_INPUTS = 1, 2, 3, 4 + +[updateVehicleAll] +SQL1_1 = UPDATE vehicles SET active = '0', inventory = ?, gear = ?, fuel = ?, damage = ? WHERE pid = ? AND plate = ? +SQL1_INPUTS = 1, 2, 3, 4, 5, 6 + +[updateVehicleGear] +SQL1_1 = UPDATE vehicles SET gear = ? WHERE pid = ? AND plate = ? +SQL1_INPUTS = 1, 2, 3 + +[updateVehicleTrunk] +SQL1_1 = UPDATE vehicles SET inventory = ? WHERE pid = ? AND plate = ? +SQL1_INPUTS = 1, 2, 3 + +[insertVehicle] +SQL1_1 = INSERT INTO vehicles (side, classname, type, pid, alive, active, inventory, color, plate, gear, damage) VALUES (?, ?, ?, ?, '1','1','[[],0]', ?, ?,'[]','[]') +SQL1_INPUTS = 1, 2, 3, 4, 5, 6 + +[deleteVehicle] +SQL1_1 = UPDATE vehicles SET alive = '0' WHERE pid = ? AND plate = ? +SQL1_INPUTS = 1, 2 + +[deleteVehicleID] +SQL1_1 = UPDATE vehicles SET alive = '0' WHERE pid = ? AND id = ? +SQL1_INPUTS = 1, 2 + +[cleanupVehicle] +SQL1_1 = UPDATE vehicles SET active = '0', fuel = ? WHERE pid = ? AND plate = ? +SQL1_INPUTS = 1, 2, 3 + + +[selectWanted] +SQL1_1 = SELECT wantedID, wantedName, wantedCrimes, wantedBounty FROM wanted WHERE active = '1' AND wantedID = ? +SQL1_INPUTS = 1 +OUTPUT = 1-STRING, 2-STRING, 3, 4 + +[selectWantedID] +SQL1_1 = SELECT wantedID FROM wanted WHERE wantedID = ? +SQL1_INPUTS = 1 +OUTPUT = 1-STRING + +[selectWantedCrimes] +SQL1_1 = SELECT wantedCrimes, wantedBounty FROM wanted WHERE wantedID = ? +SQL1_INPUTS = 1 + +[selectWantedActive] +SQL1_1 = SELECT wantedCrimes, wantedBounty FROM wanted WHERE active = '1' AND wantedID = ? +SQL1_INPUTS = 1 + +[selectWantedActiveID] +SQL1_1 = SELECT wantedID, wantedName FROM wanted WHERE active = '1' AND wantedID in (?) +SQL1_INPUTS = 1 +OUTPUT = 1-STRING, 2-STRING + +[selectWantedBounty] +SQL1_1 = SELECT wantedID, wantedName, wantedBounty FROM wanted WHERE active = '1' AND wantedID = ? +SQL1_INPUTS = 1 +OUTPUT = 1-STRING, 2-STRING, 3 + +[selectWantedName] +SQL1_1 = SELECT wantedName FROM wanted WHERE wantedID = ? +SQL1_INPUTS = 1 +OUTPUT = 1-STRING + +[insertWanted] +SQL1_1 = INSERT INTO wanted (wantedID, wantedName, wantedCrimes, wantedBounty, active) VALUES (?, ?, ?, ?, '1') +SQL1_INPUTS = 1, 2, 3, 4 + +[updateWanted] +SQL1_1 = UPDATE wanted SET wantedCrimes = ?, wantedBounty = wantedBounty + ?, active = '1' WHERE wantedID = ? +SQL1_INPUTS = 1, 2, 3 + +[updateWantedName] +SQL1_1 = UPDATE wanted SET wantedName = ? WHERE wantedID = ? +SQL1_INPUTS = 1, 2 + +[deleteWanted] +SQL1_1 = UPDATE wanted SET active = '0', wantedCrimes = '[]', wantedBounty = 0 WHERE wantedID = ? +SQL1_INPUTS = 1 diff --git a/Altis_Life.Altis/CfgRemoteExec.hpp b/Altis_Life.Altis/CfgRemoteExec.hpp index d08d6d4bb..c78e4e95b 100644 --- a/Altis_Life.Altis/CfgRemoteExec.hpp +++ b/Altis_Life.Altis/CfgRemoteExec.hpp @@ -68,12 +68,12 @@ class CfgRemoteExec { F(SOCK_fnc_insertPlayerInfo,CLIENT) F(SOCK_fnc_requestReceived,CLIENT) F(SOCK_fnc_updateRequest,CLIENT) - F(TON_fnc_clientGangKick,CLIENT) - F(TON_fnc_clientGangLeader,CLIENT) - F(TON_fnc_clientGangLeft,CLIENT) + F(life_fnc_clientGangKick,CLIENT) + JIP(life_fnc_clientGangLeader,CLIENT) + F(life_fnc_clientGangLeft,CLIENT) F(TON_fnc_clientGetKey,CLIENT) - F(TON_fnc_clientMessage,CLIENT) - F(TON_fnc_player_query,CLIENT) + F(life_fnc_clientMessage,CLIENT) + F(life_util_fnc_playerQuery,CLIENT) /* Server only functions */ F(DB_fnc_insertRequest,SERVER) diff --git a/Altis_Life.Altis/Functions.hpp b/Altis_Life.Altis/Functions.hpp index 97aa193fd..a9c15ac63 100644 --- a/Altis_Life.Altis/Functions.hpp +++ b/Altis_Life.Altis/Functions.hpp @@ -21,6 +21,18 @@ class SpyGlass { }; }; +class Life_Client_Utilities { + tag = "life_util"; + + class Main { + file = "core\utils"; + class isNumber {}; + class index {}; + class playerQuery {}; + class terrainSort {}; + }; +}; + class Life_Client_Core { tag = "life"; @@ -178,17 +190,18 @@ class Life_Client_Core { class checkMap {}; class clearVehicleAmmo {}; class dropItems {}; - class escInterupt {}; + class onGameInterrupt {}; class fetchCfgDetails {}; class fetchDeadGear {}; class fetchVehInfo {}; class isDamaged {}; + class getInMan {}; + class getOutMan {}; class giveDiff {}; class handleDamage {}; class handleInv {}; class handleItem {}; class hideObj {}; - class hudSetup {}; class hudUpdate {}; class inventoryClosed {}; class inventoryOpened {}; @@ -221,6 +234,9 @@ class Life_Client_Core { class Gangs { file = "core\gangs"; + class clientGangKick {}; + class clientGangLeader {}; + class clientGangLeft {}; class createGang {}; class gangCreated {}; class gangDisband {}; @@ -300,6 +316,7 @@ class Life_Client_Core { class Player_Menu { file = "core\pmenu"; class cellphone {}; + class clientMessage {}; class giveItem {}; class giveMoney {}; class keyDrop {}; @@ -309,6 +326,7 @@ class Life_Client_Core { class p_updateMenu {}; class pardon {}; class removeItem {}; + class sendMessage {}; class s_onChar {}; class s_onCheckedChange {}; class s_onSliderChange {}; @@ -356,6 +374,7 @@ class Life_Client_Core { class Vehicle { file = "core\vehicle"; class addVehicle2Chain {}; + class clientGetKey {}; class colorVehicle {}; class deviceMine {}; class FuelRefuelcar {}; diff --git a/Altis_Life.Altis/SpyGlass/README.md b/Altis_Life.Altis/SpyGlass/README.md index 489ad3b0c..dccfa6522 100644 --- a/Altis_Life.Altis/SpyGlass/README.md +++ b/Altis_Life.Altis/SpyGlass/README.md @@ -5,6 +5,24 @@ SpyGlass Notes +If *Arma 3* has updated then it may be possible that the developers have included new files into the game. +If this is the case then launch *Arma 3* and go to the editor (you do not need to load a mission.) +Open the debug console and paste in the following code, then locally execute: + +```sqf +_cfgPatches = []; _binConfigPatches = configFile >> "CfgPatches"; for "_i" from 0 to count (_binConfigPatches)-1 do { _patchEntry = _binConfigPatches select _i; if (isClass _patchEntry) then { _cfgPatches pushBackUnique (configName _patchEntry); }; }; copyToClipboard str(_cfgPatches); +``` + +1. Paste the results into a source code editor such as [Notepad++](https://notepad-plus-plus.org/) or [Atom](https://atom.io/). +2. Open SpyGlass/[fn_initSpy.sqf](https://github.com/AsYetUntitled/Framework/blob/master/Altis_Life.Altis/SpyGlass/fn_initSpy.sqf) and find `_patchList =` +3. Edit the result that you got from executing the code to include this at the start: `["life_server",` +4. Paste in your results and follow the existing structure. + +This should fix any issues with SpyGlass. If you continue to experience issues then please see [contact on Contributing to AsYetUntitled](https://github.com/AsYetUntitled/Framework/blob/master/.github/CONTRIBUTING.md#contact). + + +Variable checking is deprecated, the following is currently disabled + If SpyGlass is kicking on join then make sure that all functions that you have changed in the mission have been whitelisted. Check your *Arma 3* [client RPT](https://community.bistudio.com/wiki/Crash_Files) log file to find message outputs as to why you are being kicked. Example: @@ -28,19 +46,4 @@ If there are Bohemia Interactive [functions](https://community.bistudio.com/wiki BIS_Functions[] = {"",""}; ``` -... and so on. - -If *Arma 3* has updated then it may be possible that the developers have included new files into the game. -If this is the case then launch *Arma 3* and go to the editor (you do not need to load a mission.) -Open the debug console and paste in the following code, then locally execute: - -```sqf -_cfgPatches = []; _binConfigPatches = configFile >> "CfgPatches"; for "_i" from 0 to count (_binConfigPatches)-1 do { _patchEntry = _binConfigPatches select _i; if (isClass _patchEntry) then { _cfgPatches set [count _cfgPatches,(configName _patchEntry)]; }; }; copyToClipboard str(_cfgPatches); -``` - -1. Paste the results into a source code editor such as [Notepad++](https://notepad-plus-plus.org/) or [Atom](https://atom.io/). -2. Open SpyGlass/[fn_initSpy.sqf](https://github.com/AsYetUntitled/Framework/blob/master/Altis_Life.Altis/SpyGlass/fn_initSpy.sqf) and find `_patchList =` -3. Edit the result that you got from executing the code to include this at the start: `["life_server",` -4. Paste in your results and follow the existing structure. - -This should fix any issues with SpyGlass. If you continue to experience issues then please see [contact on Contributing to AsYetUntitled](https://github.com/AsYetUntitled/Framework/blob/master/.github/CONTRIBUTING.md#contact). +... and so on. \ No newline at end of file diff --git a/Altis_Life.Altis/SpyGlass/endoftheline.sqf b/Altis_Life.Altis/SpyGlass/endoftheline.sqf index 4e20bafb4..681ebffb6 100644 --- a/Altis_Life.Altis/SpyGlass/endoftheline.sqf +++ b/Altis_Life.Altis/SpyGlass/endoftheline.sqf @@ -1,8 +1 @@ -/* - File: endoftheline.sqf - Author: - - Description: - -*/ #include "Hi, it appears that your client crashed. Do not worry we will get back with you in six years." diff --git a/Altis_Life.Altis/SpyGlass/fn_initSpy.sqf b/Altis_Life.Altis/SpyGlass/fn_initSpy.sqf index 9776d3189..520ddc923 100644 --- a/Altis_Life.Altis/SpyGlass/fn_initSpy.sqf +++ b/Altis_Life.Altis/SpyGlass/fn_initSpy.sqf @@ -41,9 +41,7 @@ CONST(JJJJ_MMMM___EEEEEEE_SPAWN_WEAPON,"false"); for "_i" from 0 to count (_binConfigPatches)-1 do { _patchEntry = _binConfigPatches select _i; if (isClass _patchEntry) then { - if (!((configName _patchEntry) in SPY_cfg_patchList)) then { - _cfgPatches set[count _cfgPatches,(configName _patchEntry)]; - }; + _cfgPatches pushBackUnique (configName _patchEntry); }; }; @@ -59,157 +57,9 @@ CONST(JJJJ_MMMM___EEEEEEE_SPAWN_WEAPON,"false"); "JSRS2_Po30_Orca","JSRS2_Strider","JSRS2_SUV","JSRS2_T100_Varsuk","JSRS2_Truck1","JSRS2_Truck2","JSRS2_UAV_1","JSRS2_UH80_GhostHawk","JSRS2_Van","JSRS2_WY55_Hellcat","JSRS2_ZSU39_Tigris","cba_xeh_a3"] */ -private _patchList = -["life_server","Core","A3Data","A3_Functions_F","A3_Functions_F_EPA","A3_Functions_F_EPC","A3_Data_F","A3_Data_F_Hook","A3_Data_F_ParticleEffects","A3_Dubbing_F","A3_Dubbing_F_Beta","A3_Dubbing_F_Gamma","A3_Dubbing_Radio_F","A3_Dubbing_Radio_F_Data_ENG", -"A3_Dubbing_Radio_F_Data_ENGB","A3_Dubbing_Radio_F_Data_GRE","A3_Dubbing_Radio_F_Data_PER","A3_Dubbing_Radio_F_Data_VR","A3_Editor_F","A3_EditorPreviews_F","A3_Functions_F_Curator","A3_Language_F","A3_Language_F_Beta","A3_Language_F_Gamma", -"A3_LanguageMissions_F","A3_LanguageMissions_F_Beta","A3_LanguageMissions_F_Gamma","A3_Misc_F","A3_Misc_F_Helpers","A3_Modules_F","A3_Modules_F_Data","A3_Modules_F_DynO","A3_Modules_F_Effects","A3_Modules_F_Events","A3_Modules_F_GroupModifiers", -"A3_Modules_F_Hc","A3_Modules_F_Intel","A3_Modules_F_LiveFeed","A3_Modules_F_Marta","A3_Modules_F_Misc","A3_Modules_F_Multiplayer","A3_Modules_F_ObjectModifiers","A3_Modules_F_Sites","A3_Modules_F_Skirmish","A3_Modules_F_StrategicMap", -"A3_Modules_F_Supports","A3_Modules_F_Uav","A3_Modules_F_Beta","A3_Modules_F_Beta_Data","A3_Modules_F_Beta_FiringDrills","A3_Modules_F_EPB","A3_Modules_F_EPB_Misc","A3_Music_F","A3_Music_F_Music","A3_Music_F_EPA","A3_Music_F_EPA_Music","A3_Music_F_EPB", -"A3_Music_F_EPB_Music","A3_Music_F_EPC","A3_Music_F_EPC_Music","A3_Plants_F","A3_Roads_F","A3_Rocks_F","A3_Rocks_F_Blunt","A3_Rocks_F_Sharp","A3_Rocks_F_Water","A3_Structures_F","A3_Structures_F_Bridges","A3_Structures_F_Civ", -"A3_Structures_F_Civ_Accessories","A3_Structures_F_Civ_Ancient","A3_Structures_F_Civ_BellTowers","A3_Structures_F_Civ_Calvaries","A3_Structures_F_Civ_Camping","A3_Structures_F_Civ_Chapels","A3_Structures_F_Civ_Constructions", -"A3_Structures_F_Civ_Dead","A3_Structures_F_Civ_Garbage","A3_Structures_F_Civ_Graffiti","A3_Structures_F_Civ_InfoBoards","A3_Structures_F_Civ_Kiosks","A3_Structures_F_Civ_Lamps","A3_Structures_F_Civ_Market","A3_Structures_F_Civ_Offices", -"A3_Structures_F_Civ_Pavements","A3_Structures_F_Civ_PlayGround","A3_Structures_F_Civ_SportsGrounds","A3_Structures_F_Civ_Statues","A3_Structures_F_Civ_Tourism","A3_Structures_F_Data","A3_Structures_F_Dominants","A3_Structures_F_Dominants_Amphitheater", -"A3_Structures_F_Dominants_Castle","A3_Structures_F_Dominants_Church","A3_Structures_F_Dominants_Hospital","A3_Structures_F_Dominants_Lighthouse","A3_Structures_F_Dominants_WIP","A3_Structures_F_Furniture","A3_Structures_F_Households", -"A3_Structures_F_Households_Addons","A3_Structures_F_Households_House_Big01","A3_Structures_F_Households_House_Big02","A3_Structures_F_Households_House_Shop01","A3_Structures_F_Households_House_Shop02","A3_Structures_F_Households_House_Small01", -"A3_Structures_F_Households_House_Small02","A3_Structures_F_Households_House_Small03","A3_Structures_F_Households_Slum","A3_Structures_F_Households_Stone_Big","A3_Structures_F_Households_Stone_Shed","A3_Structures_F_Households_Stone_Small", -"A3_Structures_F_Households_WIP","A3_Structures_F_Ind","A3_Structures_F_Ind_AirPort","A3_Structures_F_Ind_Cargo","A3_Structures_F_Ind_CarService","A3_Structures_F_Ind_ConcreteMixingPlant","A3_Structures_F_Ind_Crane","A3_Structures_F_Ind_DieselPowerPlant", -"A3_Structures_F_Ind_Factory","A3_Structures_F_Ind_FuelStation","A3_Structures_F_Ind_FuelStation_Small","A3_Structures_F_Ind_Pipes","A3_Structures_F_Ind_PowerLines","A3_Structures_F_Ind_ReservoirTank","A3_Structures_F_Ind_Shed", -"A3_Structures_F_Ind_SolarPowerPlant","A3_Structures_F_Ind_Tank","A3_Structures_F_Ind_Transmitter_Tower","A3_Structures_F_Ind_WavePowerPlant","A3_Structures_F_Ind_Windmill","A3_Structures_F_Ind_WindPowerPlant","A3_Structures_F_Items", -"A3_Structures_F_Items_Documents","A3_Structures_F_Items_Electronics","A3_Structures_F_Items_Food","A3_Structures_F_Items_Gadgets","A3_Structures_F_Items_Luggage","A3_Structures_F_Items_Medical","A3_Structures_F_Items_Military", -"A3_Structures_F_Items_Stationery","A3_Structures_F_Items_Tools","A3_Structures_F_Items_Valuables","A3_Structures_F_Items_Vessels","A3_Structures_F_Mil","A3_Structures_F_Mil_BagBunker","A3_Structures_F_Mil_BagFence", -"A3_Structures_F_Mil_Barracks","A3_Structures_F_Mil_Bunker","A3_Structures_F_Mil_Cargo","A3_Structures_F_Mil_Flags","A3_Structures_F_Mil_Fortification","A3_Structures_F_Mil_Helipads","A3_Structures_F_Mil_Offices","A3_Structures_F_Mil_Radar", -"A3_Structures_F_Mil_Shelters","A3_Structures_F_Mil_TentHangar","A3_Structures_F_Naval","A3_Structures_F_Naval_Buoys","A3_Structures_F_Naval_Fishing","A3_Structures_F_Naval_Piers","A3_Structures_F_Naval_RowBoats","A3_Structures_F_Research", -"A3_Structures_F_System","A3_Structures_F_Training","A3_Structures_F_Training_InvisibleTarget","A3_Structures_F_Walls","A3_Structures_F_EPA","A3_Structures_F_EPA_Civ_Camping","A3_Structures_F_EPA_Civ_Constructions","A3_Structures_F_EPA_Items_Electronics", -"A3_Structures_F_EPA_Items_Food","A3_Structures_F_EPA_Items_Medical","A3_Structures_F_EPA_Items_Tools","A3_Structures_F_EPA_Items_Vessels","A3_Structures_F_EPA_Walls","A3_Structures_F_EPB","A3_Structures_F_EPB_Civ_Accessories", -"A3_Structures_F_EPB_Civ_Camping","A3_Structures_F_EPB_Civ_Dead","A3_Structures_F_EPB_Civ_Garbage","A3_Structures_F_EPB_Civ_Graffiti","A3_Structures_F_EPB_Civ_PlayGround","A3_Structures_F_EPB_Furniture","A3_Structures_F_EPB_Items_Documents", -"A3_Structures_F_EPB_Items_Luggage","A3_Structures_F_EPB_Items_Military","A3_Structures_F_EPB_Items_Vessels","A3_Structures_F_EPB_Naval_Fishing","A3_Structures_F_EPC","A3_Structures_F_EPC_Civ_Accessories","A3_Structures_F_EPC_Civ_Camping", -"A3_Structures_F_EPC_Civ_Garbage","A3_Structures_F_EPC_Civ_InfoBoards","A3_Structures_F_EPC_Civ_Kiosks","A3_Structures_F_EPC_Civ_Playground","A3_Structures_F_EPC_Civ_Tourism","A3_Structures_F_EPC_Dominants_GhostHotel", -"A3_Structures_F_EPC_Dominants_Stadium","A3_Structures_F_EPC_Furniture","A3_Structures_F_EPC_Items_Documents","A3_Structures_F_EPC_Items_Electronics","A3_Structures_F_EPC_Walls","A3_UiFonts_F","A3_Animals_F","A3_Animals_F_Animconfig", -"A3_Animals_F_Fishes","A3_Animals_F_Kestrel","A3_Animals_F_Rabbit","A3_Animals_F_Seagull","A3_Animals_F_Snakes","A3_Animals_F_Turtle","A3_Animals_F_Beta","A3_Animals_F_Beta_Chicken","A3_Animals_F_Beta_Dog","A3_Animals_F_Beta_Goat", -"A3_Animals_F_Beta_Sheep","A3_Anims_F","A3_Anims_F_Config_Sdr","A3_Anims_F_Config_Sdr_WeaponSwitching","A3_Anims_F_Data","A3_Anims_F_EPA","A3_Anims_F_EPC","A3_Dubbing_F_EPA","A3_Dubbing_F_EPB","A3_Dubbing_F_EPC","A3_Language_F_EPA","A3_Language_F_EPB", -"A3_Language_F_EPC","A3_LanguageMissions_F_EPA","A3_LanguageMissions_F_EPB","A3_LanguageMissions_F_EPC","A3_Map_Data","A3_Map_Data_Exp","A3_Map_Stratis","A3_Map_Stratis_Data","A3_Map_Stratis_Data_Layers","A3_Map_Stratis_Scenes_F","A3_Plants_F_Bush", -"A3_Signs_F","A3_Signs_F_Signs_Ad","A3_Structures_F_Signs_Companies","A3_Ui_F","A3_Ui_F_Data","A3_Ui_F_Curator","A3_Weapons_F","A3_Weapons_F_Ammoboxes","A3_Weapons_F_DummyWeapons","A3_Weapons_F_Explosives","A3_Weapons_F_Items","A3_Weapons_F_Launchers_NLAW", -"A3_Weapons_F_Launchers_RPG32","A3_Weapons_F_Launchers_Titan","A3_Weapons_F_LongRangeRifles_DMR_01","A3_Weapons_F_LongRangeRifles_EBR","A3_Weapons_F_LongRangeRifles_GM6","A3_Weapons_F_LongRangeRifles_M320","A3_Weapons_F_Machineguns_M200", -"A3_Weapons_F_Machineguns_Zafir","A3_Weapons_F_Pistols_ACPC2","A3_Weapons_F_Pistols_P07","A3_Weapons_F_Pistols_Pistol_Heavy_01","A3_Weapons_F_Pistols_Pistol_Heavy_02","A3_Weapons_F_Pistols_Rook40","A3_Weapons_F_Rifles_Khaybar","A3_Weapons_F_Rifles_MK20", -"A3_Weapons_F_Rifles_MX","A3_Weapons_F_Rifles_MX_Black","A3_Weapons_F_Rifles_SDAR","A3_Weapons_F_Rifles_TRG20","A3_Weapons_F_SMGs_Pdw2000","A3_Weapons_F_SMGs_SMG_01","A3_Weapons_F_SMGs_SMG_02","A3_Weapons_F_Beta","A3_Weapons_F_Beta_Ammoboxes", -"A3_Weapons_F_Beta_LongRangeRifles_EBR","A3_Weapons_F_Beta_LongRangeRifles_GM6","A3_Weapons_F_Beta_LongRangeRifles_M320","A3_Weapons_F_Beta_Rifles_Khaybar","A3_Weapons_F_Beta_Rifles_MX","A3_Weapons_F_Beta_Rifles_TRG20","A3_Weapons_F_Gamma", -"A3_Weapons_F_Gamma_Ammoboxes","A3_Weapons_F_Gamma_LongRangeRifles_EBR","A3_Weapons_F_Gamma_Rifles_MX","A3_Characters_F","A3_Characters_F_BLUFOR","A3_Characters_F_Civil","A3_Characters_F_Heads","A3_Characters_F_OPFOR","A3_Characters_F_Proxies", -"A3_Characters_F_Beta","A3_Characters_F_Beta_INDEP","A3_Characters_F_Gamma","A3_Map_Altis","A3_Map_Altis_Data","A3_Map_Altis_Data_Layers","A3_Map_Altis_Scenes_F","A3_Missions_F","A3_Missions_F_Data","A3_Missions_F_Video","A3_Missions_F_Beta", -"A3_Missions_F_Beta_Data","A3_Missions_F_Beta_Video","A3_Missions_F_Gamma","A3_Missions_F_Gamma_Data","A3_Missions_F_Gamma_Video","A3_Sounds_F","A3_Sounds_F_Arsenal","A3_Sounds_F_Characters","A3_Sounds_F_Environment","A3_Sounds_F_Sfx","A3_Sounds_F_Vehicles", -"A3_Sounds_F_EPB","A3_Sounds_F_EPC","A3_Static_F","A3_Static_F_Mortar_01","A3_Static_F_Beta","A3_Static_F_Beta_Mortar_01","A3_Static_F_Gamma","A3_Static_F_Gamma_Mortar_01","A3_Weapons_F_Acc","A3_Weapons_F_Beta_Acc","A3_Weapons_F_EPA","A3_Weapons_F_EPA_Acc", -"A3_Weapons_F_EPA_Ammoboxes","A3_Weapons_F_EPB","A3_Weapons_F_EPB_Acc","A3_Weapons_F_EPB_Ammoboxes","A3_Weapons_F_EPB_LongRangeRifles_GM6","A3_Weapons_F_EPC","A3_Weapons_F_Gamma_Acc","A3_Air_F","A3_Air_F_Heli_Light_01","A3_Air_F_Heli_Light_02", -"A3_Air_F_Beta","A3_Air_F_Beta_Heli_Attack_01","A3_Air_F_Beta_Heli_Attack_02","A3_Air_F_Beta_Heli_Transport_01","A3_Air_F_Beta_Heli_Transport_02","A3_Air_F_Beta_Parachute_01","A3_Air_F_Beta_Parachute_02","A3_Air_F_Gamma","A3_Air_F_Gamma_Plane_Fighter_03", -"A3_Armor_F","A3_Armor_F_Beta","A3_Armor_F_Beta_APC_Tracked_01","A3_Armor_F_Beta_APC_Tracked_02","A3_Armor_F_Gamma","A3_Armor_F_Gamma_MBT_01","A3_Armor_F_Gamma_MBT_02","A3_Boat_F","A3_Boat_F_Boat_Armed_01","A3_Boat_F_Boat_Transport_01","A3_Boat_F_Beta", -"A3_Boat_F_Beta_Boat_Armed_01","A3_Boat_F_Beta_Boat_Transport_01","A3_Boat_F_Beta_SDV_01","A3_Boat_F_Gamma","A3_Boat_F_Gamma_Boat_Civil_01","A3_Boat_F_Gamma_Boat_Civil_04","A3_Boat_F_Gamma_Boat_Transport_01","A3_Characters_F_Common","A3_Characters_F_EPA", -"A3_Characters_F_EPB","A3_Characters_F_EPB_Heads","A3_Characters_F_EPC","A3_Missions_F_EPA","A3_Missions_F_EPA_Data","A3_Missions_F_EPA_Video","A3_Missions_F_EPB","A3_Missions_F_EPC","A3_Soft_F","A3_Soft_F_MRAP_01","A3_Soft_F_MRAP_02","A3_Soft_F_Offroad_01", -"A3_Soft_F_Quadbike_01","A3_Soft_F_Beta","A3_Soft_F_Beta_MRAP_03","A3_Soft_F_Beta_Quadbike_01","A3_Soft_F_Beta_Truck_01","A3_Soft_F_Beta_Truck_02","A3_Soft_F_Gamma","A3_Soft_F_Gamma_Hatchback_01","A3_Soft_F_Gamma_Offroad_01","A3_Soft_F_Gamma_Quadbike_01", -"A3_Soft_F_Gamma_SUV_01","A3_Soft_F_Gamma_Truck_01","A3_Soft_F_Gamma_Truck_02","A3_Soft_F_Gamma_Van_01","A3_Static_F_AA_01","A3_Static_F_AT_01","A3_Structures_F_Mil_Scrapyard","A3_Structures_F_Wrecks","A3_Structures_F_EPA_Mil_Scrapyard","A3_Air_F_EPB", -"A3_Air_F_EPB_Heli_Light_03","A3_Air_F_EPC","A3_Air_F_EPC_Plane_CAS_01","A3_Air_F_EPC_Plane_CAS_02","A3_Air_F_EPC_Plane_Fighter_03","A3_Armor_F_Beta_APC_Wheeled_01","A3_Armor_F_Beta_APC_Wheeled_02","A3_Armor_F_EPB","A3_Armor_F_EPB_APC_Tracked_03", -"A3_Armor_F_EPB_MBT_03","A3_Armor_F_EPC","A3_Armor_F_EPC_MBT_01","A3_Armor_F_Gamma_APC_Wheeled_03","A3_Boat_F_EPC","A3_Boat_F_EPC_Submarine_01","A3_Cargoposes_F","A3_Drones_F","A3_Drones_F_Air_F_Gamma_UAV_01","A3_Drones_F_Air_F_Gamma_UAV_02", -"A3_Drones_F_Characters_F_Gamma","A3_Drones_F_Soft_F_Gamma_UGV_01","A3_Drones_F_Weapons_F_Gamma_Ammoboxes","A3_Drones_F_Weapons_F_Gamma_Items","A3_Soft_F_EPC","A3_Soft_F_EPC_Truck_03","A3_Data_F_Loadorder","A3_Data_F_Curator", -"A3_Data_F_Curator_Characters","A3_Data_F_Curator_Eagle","A3_Data_F_Curator_Intel","A3_Data_F_Curator_Misc","A3_Data_F_Curator_Music","A3_Data_F_Curator_Respawn","A3_Data_F_Curator_Virtual","A3_Language_F_Curator","A3_Modules_F_Curator", -"A3_Modules_F_Curator_Animals","A3_Modules_F_Curator_CAS","A3_Modules_F_Curator_Curator","A3_Modules_F_Curator_Effects","A3_Modules_F_Curator_Environment","A3_Modules_F_Curator_Flares","A3_Modules_F_Curator_Intel","A3_Modules_F_Curator_Lightning", -"A3_Modules_F_Curator_Mines","A3_Modules_F_Curator_Misc","A3_Modules_F_Curator_Multiplayer","A3_Modules_F_Curator_Objectives","A3_Modules_F_Curator_Ordnance","A3_Modules_F_Curator_Respawn","A3_Modules_F_Curator_SmokeShells","A3_Missions_F_Curator", -"A3_Modules_F_Curator_Chemlights","A3_Data_F_Curator_Loadorder","A3_Data_F_Kart","A3_Data_F_Kart_ParticleEffects","A3_Language_F_Kart","A3_LanguageMissions_F_Kart","A3_Missions_F_Kart","A3_Missions_F_Kart_Data","A3_Modules_F_Kart","A3_Modules_F_Kart_Data", -"A3_Modules_F_Kart_TimeTrials","A3_Soft_F_Kart","A3_Soft_F_Kart_Kart_01","A3_Sounds_F_Kart","A3_Structures_F_Kart","A3_Structures_F_Kart_Civ_SportsGrounds","A3_Structures_F_Kart_Mil_Flags","A3_Structures_F_Kart_Signs_Companies","A3_Ui_F_Kart", -"A3_Weapons_F_Kart","A3_Weapons_F_Kart_Pistols_Pistol_Signal_F","A3_Anims_F_Kart","A3_Characters_F_Kart","A3_Data_F_Kart_Loadorder","A3_Data_F_Bootcamp","A3_Dubbing_F_Bootcamp","A3_Functions_F_Bootcamp","A3_Language_F_Bootcamp", -"A3_LanguageMissions_F_Bootcamp","A3_Map_VR","A3_Map_VR_Scenes_F","A3_Missions_F_Bootcamp","A3_Missions_F_Bootcamp_Data","A3_Missions_F_Bootcamp_Video","A3_Modules_F_Bootcamp","A3_Modules_F_Bootcamp_Misc","A3_Music_F_Bootcamp", -"A3_Music_F_Bootcamp_Music","A3_Soft_F_Bootcamp","A3_Soft_F_Bootcamp_Offroad_01","A3_Soft_F_Bootcamp_Quadbike_01","A3_Soft_F_Bootcamp_Van_01","A3_Sounds_F_Bootcamp","A3_Structures_F_Bootcamp","A3_Structures_F_Bootcamp_Civ_Camping", -"A3_Structures_F_Bootcamp_Civ_SportsGrounds","A3_Structures_F_Bootcamp_Ind_Cargo","A3_Structures_F_Bootcamp_Items_Electronics","A3_Structures_F_Bootcamp_Items_Food","A3_Structures_F_Bootcamp_Items_Sport","A3_Structures_F_Bootcamp_System", -"A3_Structures_F_Bootcamp_Training","A3_Structures_F_Bootcamp_VR_Blocks","A3_Structures_F_Bootcamp_VR_CoverObjects","A3_Structures_F_Bootcamp_VR_Helpers","A3_Ui_F_Bootcamp","A3_Weapons_F_Bootcamp","A3_Weapons_F_Bootcamp_Ammoboxes", -"A3_Weapons_F_Bootcamp_LongRangeRifles_GM6_Camo","A3_Weapons_F_Bootcamp_LongRangeRifles_M320_Camo","A3_Anims_F_Bootcamp","A3_Characters_F_Bootcamp","A3_Characters_F_Bootcamp_Common","A3_Data_F_Bootcamp_Loadorder","A3_Data_F_Heli", -"A3_Dubbing_F_Heli","A3_Functions_F_Heli","A3_Language_F_Heli","A3_LanguageMissions_F_Heli","A3_Missions_F_Heli","A3_Missions_F_Heli_Data","A3_Missions_F_Heli_Video","A3_Modules_F_Heli","A3_Modules_F_Heli_Misc","A3_Music_F_Heli", -"A3_Music_F_Heli_Music","A3_Soft_F_Heli","A3_Soft_F_Heli_Hatchback_01","A3_Soft_F_Heli_MRAP_01","A3_Soft_F_Heli_MRAP_02","A3_Soft_F_Heli_MRAP_03","A3_Soft_F_Heli_Quadbike_01","A3_Soft_F_Heli_SUV_01","A3_Soft_F_Heli_UGV_01","A3_Soft_F_Heli_Van_01", -"A3_Sounds_F_Heli","A3_Structures_F_Heli","A3_Structures_F_Heli_Civ_Accessories","A3_Structures_F_Heli_Civ_Constructions","A3_Structures_F_Heli_Civ_Garbage","A3_Structures_F_Heli_Civ_Market","A3_Structures_F_Heli_Furniture","A3_Structures_F_Heli_Ind_Airport", -"A3_Structures_F_Heli_Ind_Cargo","A3_Structures_F_Heli_Ind_Machines","A3_Structures_F_Heli_Items_Airport","A3_Structures_F_Heli_Items_Electronics","A3_Structures_F_Heli_Items_Food","A3_Structures_F_Heli_Items_Luggage","A3_Structures_F_Heli_Items_Sport", -"A3_Structures_F_Heli_Items_Tools","A3_Structures_F_Heli_VR_Helpers","A3_Supplies_F_Heli","A3_Supplies_F_Heli_Bladders","A3_Supplies_F_Heli_CargoNets","A3_Supplies_F_Heli_Fuel","A3_Supplies_F_Heli_Slingload","A3_Ui_F_Heli","A3_Air_F_Heli", -"A3_Air_F_Heli_Heli_Attack_01","A3_Air_F_Heli_Heli_Attack_02","A3_Air_F_Heli_Heli_Light_01","A3_Air_F_Heli_Heli_Light_02","A3_Air_F_Heli_Heli_Light_03","A3_Air_F_Heli_Heli_Transport_01","A3_Air_F_Heli_Heli_Transport_02","A3_Air_F_Heli_Heli_Transport_03", -"A3_Air_F_Heli_Heli_Transport_04","A3_Anims_F_Heli","A3_Boat_F_Heli","A3_Boat_F_Heli_Boat_Armed_01","A3_Boat_F_Heli_SDV_01","A3_Cargoposes_F_Heli","A3_Data_F_Heli_Loadorder","A3_Data_F_Mark","A3_Dubbing_F_Mark","A3_Dubbing_F_MP_Mark","A3_Functions_F_Mark", -"A3_Functions_F_MP_Mark","A3_Language_F_Mark","A3_Language_F_MP_Mark","A3_LanguageMissions_F_Mark","A3_LanguageMissions_F_MP_Mark","A3_Missions_F_Mark","A3_Missions_F_Mark_Data","A3_Missions_F_Mark_Video","A3_Missions_F_MP_Mark","A3_Missions_F_MP_Mark_Data", -"A3_Modules_F_Mark","A3_Modules_F_Mark_FiringDrills","A3_Modules_F_MP_Mark","A3_Modules_F_MP_Mark_Objectives","A3_Music_F_Mark","A3_Music_F_Mark_Music","A3_Sounds_F_Mark","A3_Static_F_Mark","A3_Static_F_Mark_Designator_01","A3_Static_F_Mark_Designator_02", -"A3_Structures_F_Mark","A3_Structures_F_Mark_Items_Military","A3_Structures_F_Mark_Items_Sport","A3_Structures_F_Mark_Mil_Flags","A3_Structures_F_Mark_Training","A3_Structures_F_Mark_VR_Helpers","A3_Structures_F_Mark_VR_Shapes", -"A3_Structures_F_Mark_VR_Targets","A3_Supplies_F_Mark","A3_Ui_F_Mark","A3_Ui_F_MP_Mark","A3_Weapons_F_Mark","A3_Weapons_F_Mark_Acc","A3_Weapons_F_Mark_LongRangeRifles_DMR_01","A3_Weapons_F_Mark_LongRangeRifles_DMR_02","A3_Weapons_F_Mark_LongRangeRifles_DMR_03", -"A3_Weapons_F_Mark_LongRangeRifles_DMR_04","A3_Weapons_F_Mark_LongRangeRifles_DMR_05","A3_Weapons_F_Mark_LongRangeRifles_DMR_06","A3_Weapons_F_Mark_LongRangeRifles_EBR","A3_Weapons_F_Mark_LongRangeRifles_GM6","A3_Weapons_F_Mark_LongRangeRifles_GM6_Camo", -"A3_Weapons_F_Mark_LongRangeRifles_M320","A3_Weapons_F_Mark_LongRangeRifles_M320_Camo","A3_Weapons_F_Mark_Machineguns_M200","A3_Weapons_F_Mark_Machineguns_MMG_01","A3_Weapons_F_Mark_Machineguns_MMG_02","A3_Weapons_F_Mark_Machineguns_Zafir", -"A3_Weapons_F_Mark_Rifles_Khaybar","A3_Weapons_F_Mark_Rifles_MK20","A3_Weapons_F_Mark_Rifles_MX","A3_Weapons_F_Mark_Rifles_SDAR","A3_Weapons_F_Mark_Rifles_TRG20","A3_Anims_F_Mark","A3_Anims_F_Mark_Deployment","A3_Characters_F_Mark","A3_Data_F_Mark_Loadorder", -"A3_Data_F_Exp_A","A3_Functions_F_Exp_A","A3_Language_F_Exp_A","A3_LanguageMissions_F_Exp_A","A3_Missions_F_Exp_A","A3_Missions_F_Exp_A_Data","A3_Modules_F_Exp_A","A3_Props_F_Exp_A","A3_Props_F_Exp_A_Military","A3_Props_F_Exp_A_Military_Equipment", -"A3_Sounds_F_Exp_A","A3_Structures_F_Exp_A","A3_Structures_F_Exp_A_VR_Blocks","A3_Structures_F_Exp_A_VR_Helpers","A3_Ui_F_Exp_A","A3_Anims_F_Exp_A","A3_Data_F_Exp_A_Virtual","A3_Data_F_Exp_A_Loadorder","A3_Data_F_Exp_B","A3_Language_F_Exp_B","A3_3DEN", -"A3_3DEN_Language","A3_BaseConfig_F","3DEN","A3_Animals_F_Chicken","A3_Animals_F_Dog","A3_Animals_F_Goat","A3_Animals_F_Sheep","A3_Armor_F_Panther","A3_Armor_F_AMV","A3_Armor_F_Marid","A3_Armor_F_APC_Wheeled_03","A3_Armor_F_Slammer","A3_Armor_F_T100K", -"A3_Boat_F_SDV_01","A3_Boat_F_EPC_Submarine_01_F","A3_Boat_F_Civilian_Boat","A3_Boat_F_Trawler","A3_Characters_F_INDEP","A3_Air_F_Gamma_UAV_01","A3_Air_F_Gamma_UAV_02","A3_UAV_F_Characters_F_Gamma","A3_Soft_F_Crusher_UGV","A3_UAV_F_Weapons_F_Gamma_Ammoboxes", -"A3_Weapons_F_gamma_Items","A3_Map_Altis_Scenes","A3_Map_Stratis_Scenes","Map_VR","A3_Map_VR_Scenes","A3_Modules_F_Heli_SpawnAi","A3_Modules_F_Mark_Objectives","A3_Signs_F_AD","A3_Soft_F_Quadbike","A3_Soft_F_MRAP_03","A3_Soft_F_Beta_Quadbike","A3_Soft_F_HEMTT", -"A3_Soft_F_TruckHeavy","A3_Soft_F_Bootcamp_Quadbike","A3_Soft_F_Bootcamp_Truck","A3_Soft_F_Car","A3_Soft_F_Gamma_Offroad","A3_Soft_F_Gamma_Quadbike","A3_Soft_F_SUV","A3_Soft_F_Gamma_HEMTT","A3_Soft_F_Gamma_TruckHeavy","A3_Soft_F_Truck", -"A3_Soft_F_Heli_Car","A3_Soft_F_Heli_Quadbike","A3_Soft_F_Heli_SUV","A3_Soft_F_Heli_Crusher_UGV","A3_Soft_F_Heli_Truck","A3_Static_F_Gamma_AA","A3_Static_F_Gamma_AT","A3_Structures_F_Items_Cans","A3_Weapons_F_NATO","A3_Weapons_F_CSAT","A3_Weapons_F_AAF", -"A3_weapons_F_FIA","A3_Weapons_F_ItemHolders","A3_Weapons_F_Headgear","A3_Weapons_F_Uniforms","A3_Weapons_F_Vests","A3_Weapons_F_Launchers_LAW","A3_Weapons_F_EPA_LongRangeRifles_DMR_01","A3_Weapons_F_EBR","A3_Weapons_F_EPB_Rifles_MX_Black", -"A3_Weapons_F_Pistols_PDW2000","A3_Weapons_F_Rifles_Vector","a3_weapons_f_rifles_SMG_02","A3_Weapons_F_beta_EBR","A3_Weapons_F_EPA_LongRangeRifles_GM6","A3_Weapons_F_EPB_LongRangeRifles_M320","A3_Weapons_F_Bootcamp_LongRangeRifles_GM6", -"A3_Weapons_F_Bootcamp_LongRangeRifles_M320","A3_Weapons_F_EPB_LongRangeRifles_GM3","A3_Weapons_F_EPA_EBR","A3_Weapons_F_EPA_Rifles_MX","A3_Weapons_F_Mark_EBR","CuratorOnly_Air_F_Beta_Heli_Attack_01","CuratorOnly_Air_F_Beta_Heli_Attack_02", -"CuratorOnly_Air_F_Gamma_UAV_01","CuratorOnly_Armor_F_AMV","CuratorOnly_armor_f_beta_APC_Tracked_02","CuratorOnly_Armor_F_Marid","CuratorOnly_Armor_F_Panther","CuratorOnly_Armor_F_Slammer","CuratorOnly_Armor_F_T100K","CuratorOnly_Boat_F_Boat_Armed_01", -"CuratorOnly_Characters_F_BLUFOR","CuratorOnly_Characters_F_Common","CuratorOnly_Characters_F_OPFOR","CuratorOnly_Modules_F_Curator_Animals","CuratorOnly_Modules_F_Curator_Chemlights","CuratorOnly_Modules_F_Curator_Effects", -"CuratorOnly_Modules_F_Curator_Environment","CuratorOnly_Modules_F_Curator_Flares","CuratorOnly_Modules_F_Curator_Lightning","CuratorOnly_Modules_F_Curator_Mines","CuratorOnly_Modules_F_Curator_Objectives","CuratorOnly_Modules_F_Curator_Ordnance", -"CuratorOnly_Modules_F_Curator_Smokeshells","CuratorOnly_Signs_F","CuratorOnly_Soft_F_Crusher_UGV","CuratorOnly_Soft_F_MRAP_01","CuratorOnly_Soft_F_MRAP_02","CuratorOnly_Soft_F_Quadbike","CuratorOnly_Static_F_Gamma","CuratorOnly_Static_F_Mortar_01", -"CuratorOnly_Structures_F_Civ_Ancient","CuratorOnly_Structures_F_Civ_Camping","CuratorOnly_Structures_F_Civ_Garbage","CuratorOnly_Structures_F_EPA_Civ_Constructions","CuratorOnly_Structures_F_EPB_Civ_Dead","CuratorOnly_Structures_F_Ind_Cargo", -"CuratorOnly_Structures_F_Ind_Crane","CuratorOnly_Structures_F_Ind_ReservoirTank","CuratorOnly_Structures_F_Ind_Transmitter_Tower","CuratorOnly_Structures_F_Items_Vessels","CuratorOnly_Structures_F_Mil_BagBunker","CuratorOnly_Structures_F_Mil_BagFence", -"CuratorOnly_Structures_F_Mil_Cargo","CuratorOnly_Structures_F_Mil_Fortification","CuratorOnly_Structures_F_Mil_Radar","CuratorOnly_Structures_F_Mil_Shelters","CuratorOnly_Structures_F_Research","CuratorOnly_Structures_F_Walls", -"CuratorOnly_Structures_F_Wrecks","A3_Data_F_Exp_B_Loadorder","A3_Data_F_Mod","A3_Language_F_Mod","A3_Sounds_F_Mod","A3_Weapons_F_Mod","A3_Weapons_F_Mod_SMGs_SMG_03","A3_Anims_F_Mod","A3_Data_F_Exp","A3_Data_F_Exp_ParticleEffects", -"A3_Data_F_Mod_Loadorder","A3_Dubbing_F_Exp","A3_Dubbing_Radio_F_EXP","A3_Dubbing_Radio_F_EXP_Data_CHI","A3_Dubbing_Radio_F_EXP_Data_ENGFRE","A3_Dubbing_Radio_F_EXP_Data_FRE","A3_EditorPreviews_F_Exp","A3_Functions_F_Exp","A3_Language_F_Exp", -"A3_LanguageMissions_F_Exp","A3_Missions_F_Exp","A3_Missions_F_Exp_Data","A3_Missions_F_Exp_Video","A3_Modules_F_Exp","A3_Music_F_Exp","A3_Music_F_Exp_Music","A3_Props_F_Exp","A3_Props_F_Exp_Civilian","A3_Props_F_Exp_Civilian_Garbage", -"A3_Props_F_Exp_Commercial","A3_Props_F_Exp_Commercial_Market","A3_Props_F_Exp_Industrial","A3_Props_F_Exp_Industrial_HeavyEquipment","A3_Props_F_Exp_Infrastructure","A3_Props_F_Exp_Infrastructure_Railways","A3_Props_F_Exp_Infrastructure_Traffic", -"A3_Props_F_Exp_Military","A3_Props_F_Exp_Military_Camps","A3_Props_F_Exp_Military_OldPlaneWrecks","A3_Props_F_Exp_Naval","A3_Props_F_Exp_Naval_Boats","A3_Rocks_F_Exp","A3_Rocks_F_Exp_Cliff","A3_Rocks_F_Exp_LavaStones","A3_Soft_F_Exp", -"A3_Soft_F_Exp_LSV_01","A3_Soft_F_Exp_LSV_02","A3_Soft_F_Exp_MRAP_01","A3_Soft_F_Exp_MRAP_02","A3_Soft_F_Exp_Offroad_01","A3_Soft_F_Exp_Offroad_02","A3_Soft_F_Exp_Quadbike_01","A3_Soft_F_Exp_Truck_01","A3_Soft_F_Exp_Truck_03","A3_Soft_F_Exp_UGV_01", -"A3_Soft_F_Exp_Van_01","A3_Static_F_Exp","A3_Static_F_Exp_AA_01","A3_Static_F_Exp_AT_01","A3_Static_F_Exp_GMG_01","A3_Static_F_Exp_HMG_01","A3_Static_F_Exp_Mortar_01","A3_Structures_F_Exp","A3_Structures_F_Exp_Civilian","A3_Structures_F_Exp_Civilian_Accessories", -"A3_Structures_F_Exp_Civilian_Garages","A3_Structures_F_Exp_Civilian_House_Big_01","A3_Structures_F_Exp_Civilian_House_Big_02","A3_Structures_F_Exp_Civilian_House_Big_03","A3_Structures_F_Exp_Civilian_House_Big_04","A3_Structures_F_Exp_Civilian_House_Big_05", -"A3_Structures_F_Exp_Civilian_House_Native_01","A3_Structures_F_Exp_Civilian_House_Native_02","A3_Structures_F_Exp_Civilian_House_Small_01","A3_Structures_F_Exp_Civilian_House_Small_02","A3_Structures_F_Exp_Civilian_House_Small_03", -"A3_Structures_F_Exp_Civilian_House_Small_04","A3_Structures_F_Exp_Civilian_House_Small_05","A3_Structures_F_Exp_Civilian_House_Small_06","A3_Structures_F_Exp_Civilian_School_01","A3_Structures_F_Exp_Civilian_Sheds","A3_Structures_F_Exp_Civilian_Slum_01", -"A3_Structures_F_Exp_Civilian_Slum_02","A3_Structures_F_Exp_Civilian_Slum_03","A3_Structures_F_Exp_Civilian_Slum_04","A3_Structures_F_Exp_Civilian_Slum_05","A3_Structures_F_Exp_Civilian_SportsGrounds","A3_Structures_F_Exp_Commercial", -"A3_Structures_F_Exp_Commercial_Addons","A3_Structures_F_Exp_Commercial_Advertisements","A3_Structures_F_Exp_Commercial_FuelStation_01","A3_Structures_F_Exp_Commercial_FuelStation_02","A3_Structures_F_Exp_Commercial_Hotel_01", -"A3_Structures_F_Exp_Commercial_Hotel_02","A3_Structures_F_Exp_Commercial_Market","A3_Structures_F_Exp_Commercial_MultistoryBuilding_01","A3_Structures_F_Exp_Commercial_MultistoryBuilding_03","A3_Structures_F_Exp_Commercial_MultistoryBuilding_04", -"A3_Structures_F_Exp_Commercial_Shop_City_01","A3_Structures_F_Exp_Commercial_Shop_City_02","A3_Structures_F_Exp_Commercial_Shop_City_03","A3_Structures_F_Exp_Commercial_Shop_City_04","A3_Structures_F_Exp_Commercial_Shop_City_05", -"A3_Structures_F_Exp_Commercial_Shop_City_06","A3_Structures_F_Exp_Commercial_Shop_City_07","A3_Structures_F_Exp_Commercial_Shop_Town_01","A3_Structures_F_Exp_Commercial_Shop_Town_02","A3_Structures_F_Exp_Commercial_Shop_Town_03", -"A3_Structures_F_Exp_Commercial_Shop_Town_04","A3_Structures_F_Exp_Commercial_Shop_Town_05","A3_Structures_F_Exp_Commercial_Supermarket_01","A3_Structures_F_Exp_Commercial_Warehouses","A3_Structures_F_Exp_Cultural","A3_Structures_F_Exp_Cultural_AncientRelics", -"A3_Structures_F_Exp_Cultural_BasaltRuins","A3_Structures_F_Exp_Cultural_Cathedral_01","A3_Structures_F_Exp_Cultural_Cemeteries","A3_Structures_F_Exp_Cultural_Church_01","A3_Structures_F_Exp_Cultural_Church_02","A3_Structures_F_Exp_Cultural_Church_03", -"A3_Structures_F_Exp_Cultural_Fortress_01","A3_Structures_F_Exp_Cultural_Temple_Native_01","A3_Structures_F_Exp_Cultural_Totems","A3_Structures_F_Exp_Data","A3_Structures_F_Exp_Industrial","A3_Structures_F_Exp_Industrial_DieselPowerPlant_01", -"A3_Structures_F_Exp_Industrial_Fields","A3_Structures_F_Exp_Industrial_Materials","A3_Structures_F_Exp_Industrial_Port","A3_Structures_F_Exp_Industrial_Stockyard_01","A3_Structures_F_Exp_Industrial_SugarCaneFactory_01", -"A3_Structures_F_Exp_Industrial_SurfaceMine_01","A3_Structures_F_Exp_Infrastructure","A3_Structures_F_Exp_Infrastructure_Airports","A3_Structures_F_Exp_Infrastructure_Bridges","A3_Structures_F_Exp_Infrastructure_Pavements", -"A3_Structures_F_Exp_Infrastructure_Powerlines","A3_Structures_F_Exp_Infrastructure_Railways","A3_Structures_F_Exp_Infrastructure_Roads","A3_Structures_F_Exp_Infrastructure_Runways","A3_Structures_F_Exp_Infrastructure_WaterSupply", -"A3_Structures_F_Exp_Military","A3_Structures_F_Exp_Military_Barracks_01","A3_Structures_F_Exp_Military_Camonets","A3_Structures_F_Exp_Military_ContainerBases","A3_Structures_F_Exp_Military_Emplacements","A3_Structures_F_Exp_Military_Flags", -"A3_Structures_F_Exp_Military_Fortifications","A3_Structures_F_Exp_Military_Pillboxes","A3_Structures_F_Exp_Military_Trenches","A3_Structures_F_Exp_Naval","A3_Structures_F_Exp_Naval_Canals","A3_Structures_F_Exp_Naval_Piers","A3_Structures_F_Exp_Signs", -"A3_Structures_F_Exp_Signs_Companies","A3_Structures_F_Exp_Signs_Traffic","A3_Structures_F_Exp_Walls","A3_Structures_F_Exp_Walls_BackAlleys","A3_Structures_F_Exp_Walls_Bamboo","A3_Structures_F_Exp_Walls_Concrete","A3_Structures_F_Exp_Walls_Crashbarriers", -"A3_Structures_F_Exp_Walls_Hedges","A3_Structures_F_Exp_Walls_Net","A3_Structures_F_Exp_Walls_Pipe","A3_Structures_F_Exp_Walls_Polewalls","A3_Structures_F_Exp_Walls_Railings","A3_Structures_F_Exp_Walls_Slum","A3_Structures_F_Exp_Walls_Stone", -"A3_Structures_F_Exp_Walls_Tin","A3_Structures_F_Exp_Walls_Wired","A3_Structures_F_Exp_Walls_Wooden","A3_Supplies_F_Exp","A3_Supplies_F_Exp_Ammoboxes","A3_Ui_F_Exp","A3_Vegetation_F_Exp","A3_Weapons_F_Exp","A3_Weapons_F_Exp_Launchers_RPG32", -"A3_Weapons_F_Exp_Launchers_RPG7","A3_Weapons_F_Exp_Launchers_Titan","A3_Weapons_F_Exp_LongRangeRifles_DMR_07","A3_Weapons_F_Exp_Machineguns_LMG_03","A3_Weapons_F_Exp_Pistols_Pistol_01","A3_Weapons_F_Exp_Rifles_AK12","A3_Weapons_F_Exp_Rifles_AKM", -"A3_Weapons_F_Exp_Rifles_AKS","A3_Weapons_F_Exp_Rifles_ARX","A3_Weapons_F_Exp_Rifles_CTAR","A3_Weapons_F_Exp_Rifles_CTARS","A3_Weapons_F_Exp_Rifles_SPAR_01","A3_Weapons_F_Exp_Rifles_SPAR_02","A3_Weapons_F_Exp_Rifles_SPAR_03","A3_Weapons_F_Exp_SMGs_SMG_05", -"A3_Air_F_Exp","A3_Air_F_Exp_Heli_Light_01","A3_Air_F_Exp_Heli_Transport_01","A3_Air_F_Exp_Plane_Civil_01","A3_Air_F_Exp_UAV_03","A3_Air_F_Exp_UAV_04","A3_Air_F_Exp_VTOL_01","A3_Air_F_Exp_VTOL_02","A3_Anims_F_Exp","A3_Anims_F_Exp_Revive","A3_Armor_F_Exp", -"A3_Armor_F_Exp_APC_Tracked_01","A3_Armor_F_Exp_APC_Tracked_02","A3_Armor_F_Exp_APC_Wheeled_01","A3_Armor_F_Exp_APC_Wheeled_02","A3_Armor_F_Exp_MBT_01","A3_Armor_F_Exp_MBT_02","A3_Boat_F_Exp","A3_Boat_F_Exp_Boat_Armed_01","A3_Boat_F_Exp_Boat_Transport_01", -"A3_Boat_F_Exp_Boat_Transport_02","A3_Boat_F_Exp_Scooter_Transport_01","A3_Cargoposes_F_Exp","A3_Characters_F_Exp","A3_Characters_F_Exp_Civil","A3_Characters_F_Exp_Headgear","A3_Characters_F_Exp_Vests","A3_Sounds_F_Exp","A3_Data_F_Exp_Loadorder", -"A3_Data_F_Jets","A3_Dubbing_F_Jets","A3_EditorPreviews_F_Jets","A3_Functions_F_Destroyer","A3_Functions_F_Jets","A3_Language_F_Jets","A3_LanguageMissions_F_Jets","A3_Modules_F_Jets","A3_Music_F_Jets","A3_Props_F_Jets","A3_Props_F_Jets_Military_Tractor", -"A3_Props_F_Jets_Military_Trolley","A3_Sounds_F_Jets","A3_Static_F_Jets","A3_Static_F_Jets_AAA_System_01","A3_Static_F_Jets_SAM_System_01","A3_Static_F_Jets_SAM_System_02","A3_Ui_F_Jets","A3_Weapons_F_Jets","A3_Air_F_Jets","A3_Air_F_Jets_Plane_Fighter_01", -"A3_Air_F_Jets_Plane_Fighter_02","A3_Air_F_Jets_Plane_Fighter_04","A3_Air_F_Jets_UAV_05","A3_Anims_F_Jets","A3_Boat_F_Jets","A3_Boat_F_Jets_Carrier_01","A3_Cargoposes_F_Jets","A3_Characters_F_Jets","A3_Characters_F_Jets_Vests","A3_Missions_F_Jets", -"A3_Boat_F_Destroyer","A3_Boat_F_Destroyer_Destroyer_01","A3_Data_F_Jets_Loadorder","A3_Data_F_Argo","A3_EditorPreviews_F_Argo","A3_Language_F_Argo","A3_Map_Malden","A3_Map_Malden_Data","A3_Map_Malden_Data_Layers","A3_Map_Malden_Scenes_F","A3_Music_F_Argo", -"A3_Props_F_Argo","A3_Props_F_Argo_Civilian","A3_Props_F_Argo_Civilian_InfoBoards","A3_Props_F_Argo_Items","A3_Props_F_Argo_Items_Documents","A3_Props_F_Argo_Items_Electronics","A3_Rocks_F_Argo","A3_Rocks_F_Argo_Limestone","A3_Structures_F_Argo", -"A3_Structures_F_Argo_Civilian","A3_Structures_F_Argo_Civilian_Accessories","A3_Structures_F_Argo_Civilian_Addons","A3_Structures_F_Argo_Civilian_Garbage","A3_Structures_F_Argo_Civilian_House_Big01","A3_Structures_F_Argo_Civilian_House_Big02", -"A3_Structures_F_Argo_Civilian_House_Small01","A3_Structures_F_Argo_Civilian_House_Small02","A3_Structures_F_Argo_Civilian_Stone_House_Big_01","A3_Structures_F_Argo_Civilian_Stone_Shed_01","A3_Structures_F_Argo_Civilian_Unfinished_Building_01", -"A3_Structures_F_Argo_Commercial","A3_Structures_F_Argo_Commercial_Accessories","A3_Structures_F_Argo_Commercial_Billboards","A3_Structures_F_Argo_Commercial_FuelStation_01","A3_Structures_F_Argo_Commercial_Shop_02","A3_Structures_F_Argo_Commercial_Supermarket_01", -"A3_Structures_F_Argo_Cultural","A3_Structures_F_Argo_Cultural_Church","A3_Structures_F_Argo_Cultural_Statues","A3_Structures_F_Argo_Decals","A3_Structures_F_Argo_Decals_Horizontal","A3_Structures_F_Argo_Industrial","A3_Structures_F_Argo_Industrial_Agriculture", -"A3_Structures_F_Argo_Industrial_Materials","A3_Structures_F_Argo_Infrastructure","A3_Structures_F_Argo_Infrastructure_Runways","A3_Structures_F_Argo_Infrastructure_Seaports","A3_Structures_F_Argo_Infrastructure_WaterSupply","A3_Structures_F_Argo_Military", -"A3_Structures_F_Argo_Military_Bunkers","A3_Structures_F_Argo_Military_ContainerBases","A3_Structures_F_Argo_Military_Domes","A3_Structures_F_Argo_Military_Fortifications","A3_Structures_F_Argo_Military_Turrets","A3_Structures_F_Argo_Signs", -"A3_Structures_F_Argo_Signs_City","A3_Structures_F_Argo_Signs_Directions","A3_Structures_F_Argo_Signs_Warnings","A3_Structures_F_Argo_Walls","A3_Structures_F_Argo_Walls_City","A3_Structures_F_Argo_Walls_Concrete","A3_Structures_F_Argo_Walls_Military", -"A3_Structures_F_Argo_Walls_Net","A3_Structures_F_Argo_Walls_Pipe","A3_Structures_F_Argo_Walls_Tin","A3_Structures_F_Argo_Walls_Wooden","A3_Structures_F_Argo_Wrecks","A3_Vegetation_F_Argo","A3_Armor_F_Argo","A3_Armor_F_Argo_APC_Tracked_01", -"A3_Armor_F_Argo_APC_Wheeled_02","A3_Data_F_Argo_Loadorder","A3_Data_F_Patrol","A3_Functions_F_Patrol","A3_Language_F_Patrol","A3_LanguageMissions_F_Patrol","A3_Map_Tanoabuka","A3_Map_Tanoabuka_Data","A3_Map_Tanoabuka_Data_Layers","A3_Modules_F_Patrol", -"A3_Sounds_F_Patrol","A3_Ui_F_Patrol","A3_Weapons_F_Patrol","A3_Characters_F_Patrol","A3_Map_Tanoa_Scenes_F","A3_Missions_F_Patrol","A3_Data_F_Patrol_Loadorder","A3_Data_F_Orange","A3_Dubbing_F_Orange","A3_EditorPreviews_F_Orange","A3_Functions_F_Orange", -"A3_Language_F_Orange","A3_LanguageMissions_F_Orange","A3_Missions_F_Orange","A3_Modules_F_Orange","A3_Music_F_Orange","A3_Props_F_Orange","A3_Props_F_Orange_Civilian","A3_Props_F_Orange_Civilian_Constructions","A3_Props_F_Orange_Civilian_InfoBoards", -"A3_Props_F_Orange_Furniture","A3_Props_F_Orange_Humanitarian","A3_Props_F_Orange_Humanitarian_Camps","A3_Props_F_Orange_Humanitarian_Garbage","A3_Props_F_Orange_Humanitarian_Supplies","A3_Props_F_Orange_Items","A3_Props_F_Orange_Items_Decorative", -"A3_Props_F_Orange_Items_Documents","A3_Props_F_Orange_Items_Electronics","A3_Props_F_Orange_Items_Tools","A3_Soft_F_Orange","A3_Soft_F_Orange_Offroad_01","A3_Soft_F_Orange_Offroad_02","A3_Soft_F_Orange_Truck_02","A3_Soft_F_Orange_UGV_01","A3_Soft_F_Orange_Van_02", -"A3_Structures_F_Orange","A3_Structures_F_Orange_Humanitarian","A3_Structures_F_Orange_Humanitarian_Camps","A3_Structures_F_Orange_Humanitarian_Flags","A3_Structures_F_Orange_Industrial","A3_Structures_F_Orange_Industrial_Cargo","A3_Structures_F_Orange_Signs", -"A3_Structures_F_Orange_Signs_Mines","A3_Structures_F_Orange_Signs_Special","A3_Structures_F_Orange_VR_Helpers","A3_Structures_F_Orange_Walls","A3_Structures_F_Orange_Walls_Plastic","A3_Supplies_F_Orange","A3_Supplies_F_Orange_Ammoboxes","A3_Supplies_F_Orange_Bags", -"A3_Supplies_F_Orange_CargoNets","A3_Ui_F_Orange","A3_Weapons_F_Orange","A3_Weapons_F_Orange_Explosives","A3_Weapons_F_Orange_Items","A3_Air_F_Orange","A3_Air_F_Orange_Heli_Transport_02","A3_Air_F_Orange_UAV_01","A3_Air_F_Orange_UAV_06","A3_Cargoposes_F_Orange", -"A3_Characters_F_Orange","A3_Characters_F_Orange_Facewear","A3_Characters_F_Orange_Headgear","A3_Characters_F_Orange_Uniforms","A3_Characters_F_Orange_Vests","A3_Sounds_F_Orange","A3_Data_F_Orange_Loadorder","A3_Data_F_Tacops","A3_Dubbing_F_Tacops", -"A3_Functions_F_Tacops","A3_Language_F_Tacops","A3_LanguageMissions_F_Tacops","A3_Missions_F_Tacops","A3_Modules_F_Tacops","A3_Music_F_Tacops","A3_Sounds_F_Tacops","A3_Ui_F_Tacops","A3_Characters_F_Tacops","A3_Data_F_Tacops_Loadorder","A3_Data_F_Tank", -"A3_Data_F_Warlords","A3_Dubbing_F_Tank","A3_Dubbing_F_Warlords","A3_EditorPreviews_F_Tank","A3_Functions_F_Tank","A3_Functions_F_Warlords","A3_Language_F_Tank","A3_Language_F_Warlords","A3_LanguageMissions_F_Tank","A3_Missions_F_Tank","A3_Missions_F_Warlords", -"A3_Missions_F_Warlords_Data","A3_Modules_F_Tank","A3_Modules_F_Warlords","A3_Music_F_Tank","A3_Props_F_Tank","A3_Props_F_Tank_Military","A3_Props_F_Tank_Military_TankAcc","A3_Props_F_Tank_Military_Wrecks","A3_Sounds_F_Tank","A3_Structures_F_Tank", -"A3_Structures_F_Tank_Decals","A3_Structures_F_Tank_Decals_Horizontal","A3_Structures_F_Tank_Military","A3_Structures_F_Tank_Military_Fortifications","A3_Structures_F_Tank_Military_RepairDepot","A3_Ui_F_Tank","A3_Weapons_F_Tank","A3_Weapons_F_Tank_Bags", -"A3_Weapons_F_Tank_Launchers_MRAWS","A3_Weapons_F_Tank_Launchers_Vorona","A3_Armor_F_Tank","A3_Armor_F_Tank_AFV_Wheeled_01","A3_Armor_F_Tank_LT_01","A3_Armor_F_Tank_MBT_04","A3_Cargoposes_F_Tank","A3_Characters_F_Tank","A3_Characters_F_Tank_Headgear", -"A3_Characters_F_Tank_Uniforms","A3_Data_F_Tank_Loadorder","A3_Data_F_Warlords_Loadorder","A3_Data_F_Destroyer","A3_Data_F_Sams","A3_EditorPreviews_F_Destroyer","A3_EditorPreviews_F_Sams","A3_Language_F_Destroyer","A3_Language_F_Sams","A3_Props_F_Destroyer", -"A3_Props_F_Destroyer_Military_BriefingRoomDesk","A3_Props_F_Destroyer_Military_BriefingRoomScreen","A3_Static_F_Destroyer","A3_Static_F_Destroyer_Boat_Rack_01","A3_Static_F_Destroyer_Ship_Gun_01","A3_Static_F_Destroyer_Ship_MRLS_01","A3_Static_F_Sams", -"A3_Static_F_Sams_Radar_System_01","A3_Static_F_Sams_Radar_System_02","A3_Static_F_Sams_SAM_System_03","A3_Static_F_Sams_SAM_System_04","A3_Weapons_F_Destroyer","A3_Weapons_F_Sams","A3_Data_F_Destroyer_Loadorder","A3_Data_F_Sams_Loadorder"]; +// Last updated vers. 5.0.0 +private _patchList = ["Core","A3Data","A3_Functions_F","A3_Functions_F_EPA","A3_Functions_F_EPC","A3_Data_F","A3_Data_F_Hook","A3_Data_F_ParticleEffects","A3_Dubbing_F","A3_Dubbing_F_Beta","A3_Dubbing_F_Gamma","A3_Dubbing_Radio_F","A3_Dubbing_Radio_F_Data_ENG","A3_Dubbing_Radio_F_Data_ENGB","A3_Dubbing_Radio_F_Data_GRE","A3_Dubbing_Radio_F_Data_PER","A3_Dubbing_Radio_F_Data_VR","A3_Editor_F","A3_EditorPreviews_F","A3_Functions_F_Curator","A3_Language_F","A3_Language_F_Beta","A3_Language_F_Gamma","A3_LanguageMissions_F","A3_LanguageMissions_F_Beta","A3_LanguageMissions_F_Gamma","A3_Misc_F","A3_Misc_F_Helpers","A3_Modules_F","A3_Modules_F_Data","A3_Modules_F_DynO","A3_Modules_F_Effects","A3_Modules_F_Events","A3_Modules_F_GroupModifiers","A3_Modules_F_Hc","A3_Modules_F_Intel","A3_Modules_F_LiveFeed","A3_Modules_F_Marta","A3_Modules_F_Misc","A3_Modules_F_Multiplayer","A3_Modules_F_ObjectModifiers","A3_Modules_F_Sites","A3_Modules_F_Skirmish","A3_Modules_F_StrategicMap","A3_Modules_F_Supports","A3_Modules_F_Uav","A3_Modules_F_Beta","A3_Modules_F_Beta_Data","A3_Modules_F_Beta_FiringDrills","A3_Modules_F_EPB","A3_Modules_F_EPB_Misc","A3_Music_F","A3_Music_F_Music","A3_Music_F_EPA","A3_Music_F_EPA_Music","A3_Music_F_EPB","A3_Music_F_EPB_Music","A3_Music_F_EPC","A3_Music_F_EPC_Music","A3_Plants_F","A3_Roads_F","A3_Rocks_F","A3_Rocks_F_Blunt","A3_Rocks_F_Sharp","A3_Rocks_F_Water","A3_Structures_F","A3_Structures_F_Bridges","A3_Structures_F_Civ","A3_Structures_F_Civ_Accessories","A3_Structures_F_Civ_Ancient","A3_Structures_F_Civ_BellTowers","A3_Structures_F_Civ_Calvaries","A3_Structures_F_Civ_Camping","A3_Structures_F_Civ_Chapels","A3_Structures_F_Civ_Constructions","A3_Structures_F_Civ_Dead","A3_Structures_F_Civ_Garbage","A3_Structures_F_Civ_Graffiti","A3_Structures_F_Civ_InfoBoards","A3_Structures_F_Civ_Kiosks","A3_Structures_F_Civ_Lamps","A3_Structures_F_Civ_Market","A3_Structures_F_Civ_Offices","A3_Structures_F_Civ_Pavements","A3_Structures_F_Civ_PlayGround","A3_Structures_F_Civ_SportsGrounds","A3_Structures_F_Civ_Statues","A3_Structures_F_Civ_Tourism","A3_Structures_F_Data","A3_Structures_F_Dominants","A3_Structures_F_Dominants_Amphitheater","A3_Structures_F_Dominants_Castle","A3_Structures_F_Dominants_Church","A3_Structures_F_Dominants_Hospital","A3_Structures_F_Dominants_Lighthouse","A3_Structures_F_Dominants_WIP","A3_Structures_F_Furniture","A3_Structures_F_Households","A3_Structures_F_Households_Addons","A3_Structures_F_Households_House_Big01","A3_Structures_F_Households_House_Big02","A3_Structures_F_Households_House_Shop01","A3_Structures_F_Households_House_Shop02","A3_Structures_F_Households_House_Small01","A3_Structures_F_Households_House_Small02","A3_Structures_F_Households_House_Small03","A3_Structures_F_Households_Slum","A3_Structures_F_Households_Stone_Big","A3_Structures_F_Households_Stone_Shed","A3_Structures_F_Households_Stone_Small","A3_Structures_F_Households_WIP","A3_Structures_F_Ind","A3_Structures_F_Ind_AirPort","A3_Structures_F_Ind_Cargo","A3_Structures_F_Ind_CarService","A3_Structures_F_Ind_ConcreteMixingPlant","A3_Structures_F_Ind_Crane","A3_Structures_F_Ind_DieselPowerPlant","A3_Structures_F_Ind_Factory","A3_Structures_F_Ind_FuelStation","A3_Structures_F_Ind_FuelStation_Small","A3_Structures_F_Ind_Pipes","A3_Structures_F_Ind_PowerLines","A3_Structures_F_Ind_ReservoirTank","A3_Structures_F_Ind_Shed","A3_Structures_F_Ind_SolarPowerPlant","A3_Structures_F_Ind_Tank","A3_Structures_F_Ind_Transmitter_Tower","A3_Structures_F_Ind_WavePowerPlant","A3_Structures_F_Ind_Windmill","A3_Structures_F_Ind_WindPowerPlant","A3_Structures_F_Items","A3_Structures_F_Items_Documents","A3_Structures_F_Items_Electronics","A3_Structures_F_Items_Food","A3_Structures_F_Items_Gadgets","A3_Structures_F_Items_Luggage","A3_Structures_F_Items_Medical","A3_Structures_F_Items_Military","A3_Structures_F_Items_Stationery","A3_Structures_F_Items_Tools","A3_Structures_F_Items_Valuables","A3_Structures_F_Items_Vessels","A3_Structures_F_Mil","A3_Structures_F_Mil_BagBunker","A3_Structures_F_Mil_BagFence","A3_Structures_F_Mil_Barracks","A3_Structures_F_Mil_Bunker","A3_Structures_F_Mil_Cargo","A3_Structures_F_Mil_Flags","A3_Structures_F_Mil_Fortification","A3_Structures_F_Mil_Helipads","A3_Structures_F_Mil_Offices","A3_Structures_F_Mil_Radar","A3_Structures_F_Mil_Shelters","A3_Structures_F_Mil_TentHangar","A3_Structures_F_Naval","A3_Structures_F_Naval_Buoys","A3_Structures_F_Naval_Fishing","A3_Structures_F_Naval_Piers","A3_Structures_F_Naval_RowBoats","A3_Structures_F_Research","A3_Structures_F_System","A3_Structures_F_Training","A3_Structures_F_Training_InvisibleTarget","A3_Structures_F_Walls","A3_Structures_F_EPA","A3_Structures_F_EPA_Civ_Camping","A3_Structures_F_EPA_Civ_Constructions","A3_Structures_F_EPA_Items_Electronics","A3_Structures_F_EPA_Items_Food","A3_Structures_F_EPA_Items_Medical","A3_Structures_F_EPA_Items_Tools","A3_Structures_F_EPA_Items_Vessels","A3_Structures_F_EPA_Walls","A3_Structures_F_EPB","A3_Structures_F_EPB_Civ_Accessories","A3_Structures_F_EPB_Civ_Camping","A3_Structures_F_EPB_Civ_Dead","A3_Structures_F_EPB_Civ_Garbage","A3_Structures_F_EPB_Civ_Graffiti","A3_Structures_F_EPB_Civ_PlayGround","A3_Structures_F_EPB_Furniture","A3_Structures_F_EPB_Items_Documents","A3_Structures_F_EPB_Items_Luggage","A3_Structures_F_EPB_Items_Military","A3_Structures_F_EPB_Items_Vessels","A3_Structures_F_EPB_Naval_Fishing","A3_Structures_F_EPC","A3_Structures_F_EPC_Civ_Accessories","A3_Structures_F_EPC_Civ_Camping","A3_Structures_F_EPC_Civ_Garbage","A3_Structures_F_EPC_Civ_InfoBoards","A3_Structures_F_EPC_Civ_Kiosks","A3_Structures_F_EPC_Civ_Playground","A3_Structures_F_EPC_Civ_Tourism","A3_Structures_F_EPC_Dominants_GhostHotel","A3_Structures_F_EPC_Dominants_Stadium","A3_Structures_F_EPC_Furniture","A3_Structures_F_EPC_Items_Documents","A3_Structures_F_EPC_Items_Electronics","A3_Structures_F_EPC_Walls","A3_UiFonts_F","A3_Animals_F","A3_Animals_F_Animconfig","A3_Animals_F_Fishes","A3_Animals_F_Kestrel","A3_Animals_F_Rabbit","A3_Animals_F_Seagull","A3_Animals_F_Snakes","A3_Animals_F_Turtle","A3_Animals_F_Beta","A3_Animals_F_Beta_Chicken","A3_Animals_F_Beta_Dog","A3_Animals_F_Beta_Goat","A3_Animals_F_Beta_Sheep","A3_Anims_F","A3_Anims_F_Config_Sdr","A3_Anims_F_Config_Sdr_WeaponSwitching","A3_Anims_F_Data","A3_Anims_F_EPA","A3_Anims_F_EPC","A3_Dubbing_F_EPA","A3_Dubbing_F_EPB","A3_Dubbing_F_EPC","A3_Language_F_EPA","A3_Language_F_EPB","A3_Language_F_EPC","A3_LanguageMissions_F_EPA","A3_LanguageMissions_F_EPB","A3_LanguageMissions_F_EPC","A3_Map_Data","A3_Map_Data_Exp","A3_Map_Stratis","A3_Map_Stratis_Data","A3_Map_Stratis_Data_Layers","A3_Map_Stratis_Scenes_F","A3_Plants_F_Bush","A3_Signs_F","A3_Signs_F_Signs_Ad","A3_Structures_F_Signs_Companies","A3_Ui_F","A3_Ui_F_Data","A3_Ui_F_Curator","A3_Weapons_F","A3_Weapons_F_Ammoboxes","A3_Weapons_F_DummyWeapons","A3_Weapons_F_Explosives","A3_Weapons_F_Items","A3_Weapons_F_Launchers_NLAW","A3_Weapons_F_Launchers_RPG32","A3_Weapons_F_Launchers_Titan","A3_Weapons_F_LongRangeRifles_DMR_01","A3_Weapons_F_LongRangeRifles_EBR","A3_Weapons_F_LongRangeRifles_GM6","A3_Weapons_F_LongRangeRifles_M320","A3_Weapons_F_Machineguns_M200","A3_Weapons_F_Machineguns_Zafir","A3_Weapons_F_Pistols_ACPC2","A3_Weapons_F_Pistols_P07","A3_Weapons_F_Pistols_Pistol_Heavy_01","A3_Weapons_F_Pistols_Pistol_Heavy_02","A3_Weapons_F_Pistols_Rook40","A3_Weapons_F_Rifles_Khaybar","A3_Weapons_F_Rifles_MK20","A3_Weapons_F_Rifles_MX","A3_Weapons_F_Rifles_MX_Black","A3_Weapons_F_Rifles_SDAR","A3_Weapons_F_Rifles_TRG20","A3_Weapons_F_SMGs_Pdw2000","A3_Weapons_F_SMGs_SMG_01","A3_Weapons_F_SMGs_SMG_02","A3_Weapons_F_Beta","A3_Weapons_F_Beta_Ammoboxes","A3_Weapons_F_Beta_LongRangeRifles_EBR","A3_Weapons_F_Beta_LongRangeRifles_GM6","A3_Weapons_F_Beta_LongRangeRifles_M320","A3_Weapons_F_Beta_Rifles_Khaybar","A3_Weapons_F_Beta_Rifles_MX","A3_Weapons_F_Beta_Rifles_TRG20","A3_Weapons_F_Gamma","A3_Weapons_F_Gamma_Ammoboxes","A3_Weapons_F_Gamma_LongRangeRifles_EBR","A3_Weapons_F_Gamma_Rifles_MX","A3_Characters_F","A3_Characters_F_BLUFOR","A3_Characters_F_Civil","A3_Characters_F_Heads","A3_Characters_F_OPFOR","A3_Characters_F_Proxies","A3_Characters_F_Beta","A3_Characters_F_Beta_INDEP","A3_Characters_F_Gamma","A3_Map_Altis","A3_Map_Altis_Data","A3_Map_Altis_Data_Layers","A3_Map_Altis_Scenes_F","A3_Missions_F","A3_Missions_F_Data","A3_Missions_F_Video","A3_Missions_F_Beta","A3_Missions_F_Beta_Data","A3_Missions_F_Beta_Video","A3_Missions_F_Gamma","A3_Missions_F_Gamma_Data","A3_Missions_F_Gamma_Video","A3_Sounds_F","A3_Sounds_F_Arsenal","A3_Sounds_F_Characters","A3_Sounds_F_Environment","A3_Sounds_F_Sfx","A3_Sounds_F_Vehicles","A3_Sounds_F_EPB","A3_Sounds_F_EPC","A3_Static_F","A3_Static_F_HMG_02","A3_Static_F_Mortar_01","A3_Static_F_Beta","A3_Static_F_Beta_Mortar_01","A3_Static_F_Gamma","A3_Static_F_Gamma_Mortar_01","A3_Weapons_F_Acc","A3_Weapons_F_Beta_Acc","A3_Weapons_F_EPA","A3_Weapons_F_EPA_Acc","A3_Weapons_F_EPA_Ammoboxes","A3_Weapons_F_EPB","A3_Weapons_F_EPB_Acc","A3_Weapons_F_EPB_Ammoboxes","A3_Weapons_F_EPB_LongRangeRifles_GM6","A3_Weapons_F_EPC","A3_Weapons_F_Gamma_Acc","A3_Air_F","A3_Air_F_Heli_Light_01","A3_Air_F_Heli_Light_02","A3_Air_F_Beta","A3_Air_F_Beta_Heli_Attack_01","A3_Air_F_Beta_Heli_Attack_02","A3_Air_F_Beta_Heli_Transport_01","A3_Air_F_Beta_Heli_Transport_02","A3_Air_F_Beta_Parachute_01","A3_Air_F_Beta_Parachute_02","A3_Air_F_Gamma","A3_Air_F_Gamma_Plane_Fighter_03","A3_Armor_F","A3_Armor_F_Beta","A3_Armor_F_Beta_APC_Tracked_01","A3_Armor_F_Beta_APC_Tracked_02","A3_Armor_F_Gamma","A3_Armor_F_Gamma_MBT_01","A3_Armor_F_Gamma_MBT_02","A3_Boat_F","A3_Boat_F_Boat_Armed_01","A3_Boat_F_Boat_Transport_01","A3_Boat_F_Beta","A3_Boat_F_Beta_Boat_Armed_01","A3_Boat_F_Beta_Boat_Transport_01","A3_Boat_F_Beta_SDV_01","A3_Boat_F_Gamma","A3_Boat_F_Gamma_Boat_Civil_01","A3_Boat_F_Gamma_Boat_Civil_04","A3_Boat_F_Gamma_Boat_Transport_01","A3_Characters_F_Common","A3_Characters_F_EPA","A3_Characters_F_EPB","A3_Characters_F_EPB_Heads","A3_Characters_F_EPC","A3_Missions_F_EPA","A3_Missions_F_EPA_Data","A3_Missions_F_EPA_Video","A3_Missions_F_EPB","A3_Missions_F_EPC","A3_Soft_F","A3_Soft_F_MRAP_01","A3_Soft_F_MRAP_02","A3_Soft_F_Offroad_01","A3_Soft_F_Quadbike_01","A3_Soft_F_Beta","A3_Soft_F_Beta_MRAP_03","A3_Soft_F_Beta_Quadbike_01","A3_Soft_F_Beta_Truck_01","A3_Soft_F_Beta_Truck_02","A3_Soft_F_Gamma","A3_Soft_F_Gamma_Hatchback_01","A3_Soft_F_Gamma_Offroad_01","A3_Soft_F_Gamma_Quadbike_01","A3_Soft_F_Gamma_SUV_01","A3_Soft_F_Gamma_Truck_01","A3_Soft_F_Gamma_Truck_02","A3_Soft_F_Gamma_Van_01","A3_Static_F_AA_01","A3_Static_F_AT_01","A3_Structures_F_Mil_Scrapyard","A3_Structures_F_Wrecks","A3_Structures_F_EPA_Mil_Scrapyard","A3_Air_F_EPB","A3_Air_F_EPB_Heli_Light_03","A3_Air_F_EPC","A3_Air_F_EPC_Plane_CAS_01","A3_Air_F_EPC_Plane_CAS_02","A3_Air_F_EPC_Plane_Fighter_03","A3_Armor_F_Beta_APC_Wheeled_01","A3_Armor_F_Beta_APC_Wheeled_02","A3_Armor_F_EPB","A3_Armor_F_EPB_APC_Tracked_03","A3_Armor_F_EPB_MBT_03","A3_Armor_F_EPC","A3_Armor_F_EPC_MBT_01","A3_Armor_F_Gamma_APC_Wheeled_03","A3_Boat_F_EPC","A3_Boat_F_EPC_Submarine_01","A3_Cargoposes_F","A3_Drones_F","A3_Drones_F_Air_F_Gamma_UAV_01","A3_Drones_F_Air_F_Gamma_UAV_02","A3_Drones_F_Characters_F_Gamma","A3_Drones_F_Soft_F_Gamma_UGV_01","A3_Drones_F_Weapons_F_Gamma_Ammoboxes","A3_Drones_F_Weapons_F_Gamma_Items","A3_Soft_F_EPC","A3_Soft_F_EPC_Truck_03","A3_Data_F_Loadorder","A3_Data_F_Curator","A3_Data_F_Curator_Characters","A3_Data_F_Curator_Eagle","A3_Data_F_Curator_Intel","A3_Data_F_Curator_Misc","A3_Data_F_Curator_Music","A3_Data_F_Curator_Respawn","A3_Data_F_Curator_Virtual","A3_Language_F_Curator","A3_Modules_F_Curator","A3_Modules_F_Curator_Animals","A3_Modules_F_Curator_CAS","A3_Modules_F_Curator_Curator","A3_Modules_F_Curator_Effects","A3_Modules_F_Curator_Environment","A3_Modules_F_Curator_Flares","A3_Modules_F_Curator_Intel","A3_Modules_F_Curator_Lightning","A3_Modules_F_Curator_Mines","A3_Modules_F_Curator_Misc","A3_Modules_F_Curator_Multiplayer","A3_Modules_F_Curator_Objectives","A3_Modules_F_Curator_Ordnance","A3_Modules_F_Curator_Respawn","A3_Modules_F_Curator_SmokeShells","A3_Missions_F_Curator","A3_Modules_F_Curator_Chemlights","A3_Data_F_Curator_Loadorder","A3_Data_F_Kart","A3_Data_F_Kart_ParticleEffects","A3_Language_F_Kart","A3_LanguageMissions_F_Kart","A3_Missions_F_Kart","A3_Missions_F_Kart_Data","A3_Modules_F_Kart","A3_Modules_F_Kart_Data","A3_Modules_F_Kart_TimeTrials","A3_Soft_F_Kart","A3_Soft_F_Kart_Kart_01","A3_Sounds_F_Kart","A3_Structures_F_Kart","A3_Structures_F_Kart_Civ_SportsGrounds","A3_Structures_F_Kart_Mil_Flags","A3_Structures_F_Kart_Signs_Companies","A3_Ui_F_Kart","A3_Weapons_F_Kart","A3_Weapons_F_Kart_Pistols_Pistol_Signal_F","A3_Anims_F_Kart","A3_Characters_F_Kart","A3_Data_F_Kart_Loadorder","A3_Data_F_Bootcamp","A3_Dubbing_F_Bootcamp","A3_Functions_F_Bootcamp","A3_Language_F_Bootcamp","A3_LanguageMissions_F_Bootcamp","A3_Map_VR","A3_Map_VR_Scenes_F","A3_Missions_F_Bootcamp","A3_Missions_F_Bootcamp_Data","A3_Missions_F_Bootcamp_Video","A3_Modules_F_Bootcamp","A3_Modules_F_Bootcamp_Misc","A3_Music_F_Bootcamp","A3_Music_F_Bootcamp_Music","A3_Soft_F_Bootcamp","A3_Soft_F_Bootcamp_Offroad_01","A3_Soft_F_Bootcamp_Quadbike_01","A3_Soft_F_Bootcamp_Van_01","A3_Sounds_F_Bootcamp","A3_Structures_F_Bootcamp","A3_Structures_F_Bootcamp_Civ_Camping","A3_Structures_F_Bootcamp_Civ_SportsGrounds","A3_Structures_F_Bootcamp_Ind_Cargo","A3_Structures_F_Bootcamp_Items_Electronics","A3_Structures_F_Bootcamp_Items_Food","A3_Structures_F_Bootcamp_Items_Sport","A3_Structures_F_Bootcamp_System","A3_Structures_F_Bootcamp_Training","A3_Structures_F_Bootcamp_VR_Blocks","A3_Structures_F_Bootcamp_VR_CoverObjects","A3_Structures_F_Bootcamp_VR_Helpers","A3_Ui_F_Bootcamp","A3_Weapons_F_Bootcamp","A3_Weapons_F_Bootcamp_Ammoboxes","A3_Weapons_F_Bootcamp_LongRangeRifles_GM6_Camo","A3_Weapons_F_Bootcamp_LongRangeRifles_M320_Camo","A3_Anims_F_Bootcamp","A3_Characters_F_Bootcamp","A3_Characters_F_Bootcamp_Common","A3_Data_F_Bootcamp_Loadorder","A3_Data_F_Heli","A3_Dubbing_F_Heli","A3_Functions_F_Heli","A3_Language_F_Heli","A3_LanguageMissions_F_Heli","A3_Missions_F_Heli","A3_Missions_F_Heli_Data","A3_Missions_F_Heli_Video","A3_Modules_F_Heli","A3_Modules_F_Heli_Misc","A3_Music_F_Heli","A3_Music_F_Heli_Music","A3_Soft_F_Heli","A3_Soft_F_Heli_Hatchback_01","A3_Soft_F_Heli_MRAP_01","A3_Soft_F_Heli_MRAP_02","A3_Soft_F_Heli_MRAP_03","A3_Soft_F_Heli_Quadbike_01","A3_Soft_F_Heli_SUV_01","A3_Soft_F_Heli_UGV_01","A3_Soft_F_Heli_Van_01","A3_Sounds_F_Heli","A3_Structures_F_Heli","A3_Structures_F_Heli_Civ_Accessories","A3_Structures_F_Heli_Civ_Constructions","A3_Structures_F_Heli_Civ_Garbage","A3_Structures_F_Heli_Civ_Market","A3_Structures_F_Heli_Furniture","A3_Structures_F_Heli_Ind_Airport","A3_Structures_F_Heli_Ind_Cargo","A3_Structures_F_Heli_Ind_Machines","A3_Structures_F_Heli_Items_Airport","A3_Structures_F_Heli_Items_Electronics","A3_Structures_F_Heli_Items_Food","A3_Structures_F_Heli_Items_Luggage","A3_Structures_F_Heli_Items_Sport","A3_Structures_F_Heli_Items_Tools","A3_Structures_F_Heli_VR_Helpers","A3_Supplies_F_Heli","A3_Supplies_F_Heli_Bladders","A3_Supplies_F_Heli_CargoNets","A3_Supplies_F_Heli_Fuel","A3_Supplies_F_Heli_Slingload","A3_Ui_F_Heli","A3_Air_F_Heli","A3_Air_F_Heli_Heli_Attack_01","A3_Air_F_Heli_Heli_Attack_02","A3_Air_F_Heli_Heli_Light_01","A3_Air_F_Heli_Heli_Light_02","A3_Air_F_Heli_Heli_Light_03","A3_Air_F_Heli_Heli_Transport_01","A3_Air_F_Heli_Heli_Transport_02","A3_Air_F_Heli_Heli_Transport_03","A3_Air_F_Heli_Heli_Transport_04","A3_Anims_F_Heli","A3_Boat_F_Heli","A3_Boat_F_Heli_Boat_Armed_01","A3_Boat_F_Heli_SDV_01","A3_Cargoposes_F_Heli","A3_Data_F_Heli_Loadorder","A3_Data_F_Mark","A3_Dubbing_F_Mark","A3_Dubbing_F_MP_Mark","A3_Functions_F_Mark","A3_Functions_F_MP_Mark","A3_Language_F_Mark","A3_Language_F_MP_Mark","A3_LanguageMissions_F_Mark","A3_LanguageMissions_F_MP_Mark","A3_Missions_F_Mark","A3_Missions_F_Mark_Data","A3_Missions_F_Mark_Video","A3_Missions_F_MP_Mark","A3_Missions_F_MP_Mark_Data","A3_Modules_F_Mark","A3_Modules_F_Mark_FiringDrills","A3_Modules_F_MP_Mark","A3_Modules_F_MP_Mark_Objectives","A3_Music_F_Mark","A3_Music_F_Mark_Music","A3_Sounds_F_Mark","A3_Static_F_Mark","A3_Static_F_Mark_Designator_01","A3_Static_F_Mark_Designator_02","A3_Structures_F_Mark","A3_Structures_F_Mark_Items_Military","A3_Structures_F_Mark_Items_Sport","A3_Structures_F_Mark_Mil_Flags","A3_Structures_F_Mark_Training","A3_Structures_F_Mark_VR_Helpers","A3_Structures_F_Mark_VR_Shapes","A3_Structures_F_Mark_VR_Targets","A3_Supplies_F_Mark","A3_Ui_F_Mark","A3_Ui_F_MP_Mark","A3_Weapons_F_Mark","A3_Weapons_F_Mark_Acc","A3_Weapons_F_Mark_LongRangeRifles_DMR_01","A3_Weapons_F_Mark_LongRangeRifles_DMR_02","A3_Weapons_F_Mark_LongRangeRifles_DMR_03","A3_Weapons_F_Mark_LongRangeRifles_DMR_04","A3_Weapons_F_Mark_LongRangeRifles_DMR_05","A3_Weapons_F_Mark_LongRangeRifles_DMR_06","A3_Weapons_F_Mark_LongRangeRifles_EBR","A3_Weapons_F_Mark_LongRangeRifles_GM6","A3_Weapons_F_Mark_LongRangeRifles_GM6_Camo","A3_Weapons_F_Mark_LongRangeRifles_M320","A3_Weapons_F_Mark_LongRangeRifles_M320_Camo","A3_Weapons_F_Mark_Machineguns_M200","A3_Weapons_F_Mark_Machineguns_MMG_01","A3_Weapons_F_Mark_Machineguns_MMG_02","A3_Weapons_F_Mark_Machineguns_Zafir","A3_Weapons_F_Mark_Rifles_Khaybar","A3_Weapons_F_Mark_Rifles_MK20","A3_Weapons_F_Mark_Rifles_MX","A3_Weapons_F_Mark_Rifles_SDAR","A3_Weapons_F_Mark_Rifles_TRG20","A3_Anims_F_Mark","A3_Anims_F_Mark_Deployment","A3_Characters_F_Mark","A3_Data_F_Mark_Loadorder","A3_Data_F_Exp_A","A3_Functions_F_Exp_A","A3_Language_F_Exp_A","A3_LanguageMissions_F_Exp_A","A3_Missions_F_Exp_A","A3_Missions_F_Exp_A_Data","A3_Modules_F_Exp_A","A3_Props_F_Exp_A","A3_Props_F_Exp_A_Military","A3_Props_F_Exp_A_Military_Equipment","A3_Sounds_F_Exp_A","A3_Structures_F_Exp_A","A3_Structures_F_Exp_A_VR_Blocks","A3_Structures_F_Exp_A_VR_Helpers","A3_Ui_F_Exp_A","A3_Anims_F_Exp_A","A3_Data_F_Exp_A_Virtual","A3_Data_F_Exp_A_Loadorder","A3_Data_F_Exp_B","A3_Language_F_Exp_B","A3_3DEN","A3_3DEN_Language","A3_BaseConfig_F","3DEN","A3_Animals_F_Chicken","A3_Animals_F_Dog","A3_Animals_F_Goat","A3_Animals_F_Sheep","A3_Armor_F_Panther","A3_Armor_F_AMV","A3_Armor_F_Marid","A3_Armor_F_APC_Wheeled_03","A3_Armor_F_Slammer","A3_Armor_F_T100K","A3_Boat_F_SDV_01","A3_Boat_F_EPC_Submarine_01_F","A3_Boat_F_Civilian_Boat","A3_Boat_F_Trawler","A3_Characters_F_INDEP","A3_Air_F_Gamma_UAV_01","A3_Air_F_Gamma_UAV_02","A3_UAV_F_Characters_F_Gamma","A3_Soft_F_Crusher_UGV","A3_UAV_F_Weapons_F_Gamma_Ammoboxes","A3_Weapons_F_gamma_Items","A3_Map_Altis_Scenes","A3_Map_Stratis_Scenes","Map_VR","A3_Map_VR_Scenes","A3_Modules_F_Heli_SpawnAi","A3_Modules_F_Mark_Objectives","A3_Signs_F_AD","A3_Soft_F_Quadbike","A3_Soft_F_MRAP_03","A3_Soft_F_Beta_Quadbike","A3_Soft_F_HEMTT","A3_Soft_F_TruckHeavy","A3_Soft_F_Bootcamp_Quadbike","A3_Soft_F_Bootcamp_Truck","A3_Soft_F_Car","A3_Soft_F_Gamma_Offroad","A3_Soft_F_Gamma_Quadbike","A3_Soft_F_SUV","A3_Soft_F_Gamma_HEMTT","A3_Soft_F_Gamma_TruckHeavy","A3_Soft_F_Truck","A3_Soft_F_Heli_Car","A3_Soft_F_Heli_Quadbike","A3_Soft_F_Heli_SUV","A3_Soft_F_Heli_Crusher_UGV","A3_Soft_F_Heli_Truck","A3_Static_F_Gamma_AA","A3_Static_F_Gamma_AT","A3_Structures_F_Items_Cans","A3_Weapons_F_NATO","A3_Weapons_F_CSAT","A3_Weapons_F_AAF","A3_weapons_F_FIA","A3_Weapons_F_ItemHolders","A3_Weapons_F_Headgear","A3_Weapons_F_Uniforms","A3_Weapons_F_Vests","A3_Weapons_F_Launchers_LAW","A3_Weapons_F_EPA_LongRangeRifles_DMR_01","A3_Weapons_F_EBR","A3_Weapons_F_EPB_Rifles_MX_Black","A3_Weapons_F_Pistols_PDW2000","A3_Weapons_F_Rifles_Vector","a3_weapons_f_rifles_SMG_02","A3_Weapons_F_beta_EBR","A3_Weapons_F_EPA_LongRangeRifles_GM6","A3_Weapons_F_EPB_LongRangeRifles_M320","A3_Weapons_F_Bootcamp_LongRangeRifles_GM6","A3_Weapons_F_Bootcamp_LongRangeRifles_M320","A3_Weapons_F_EPB_LongRangeRifles_GM3","A3_Weapons_F_EPA_EBR","A3_Weapons_F_EPA_Rifles_MX","A3_Weapons_F_Mark_EBR","CuratorOnly_Air_F_Beta_Heli_Attack_01","CuratorOnly_Air_F_Beta_Heli_Attack_02","CuratorOnly_Air_F_Gamma_UAV_01","CuratorOnly_Armor_F_AMV","CuratorOnly_armor_f_beta_APC_Tracked_02","CuratorOnly_Armor_F_Marid","CuratorOnly_Armor_F_Panther","CuratorOnly_Armor_F_Slammer","CuratorOnly_Armor_F_T100K","CuratorOnly_Boat_F_Boat_Armed_01","CuratorOnly_Characters_F_BLUFOR","CuratorOnly_Characters_F_Common","CuratorOnly_Characters_F_OPFOR","CuratorOnly_Modules_F_Curator_Animals","CuratorOnly_Modules_F_Curator_Chemlights","CuratorOnly_Modules_F_Curator_Effects","CuratorOnly_Modules_F_Curator_Environment","CuratorOnly_Modules_F_Curator_Flares","CuratorOnly_Modules_F_Curator_Lightning","CuratorOnly_Modules_F_Curator_Mines","CuratorOnly_Modules_F_Curator_Objectives","CuratorOnly_Modules_F_Curator_Ordnance","CuratorOnly_Modules_F_Curator_Smokeshells","CuratorOnly_Signs_F","CuratorOnly_Soft_F_Crusher_UGV","CuratorOnly_Soft_F_MRAP_01","CuratorOnly_Soft_F_MRAP_02","CuratorOnly_Soft_F_Quadbike","CuratorOnly_Static_F_Gamma","CuratorOnly_Static_F_Mortar_01","CuratorOnly_Structures_F_Civ_Ancient","CuratorOnly_Structures_F_Civ_Camping","CuratorOnly_Structures_F_Civ_Garbage","CuratorOnly_Structures_F_EPA_Civ_Constructions","CuratorOnly_Structures_F_EPB_Civ_Dead","CuratorOnly_Structures_F_Ind_Cargo","CuratorOnly_Structures_F_Ind_Crane","CuratorOnly_Structures_F_Ind_ReservoirTank","CuratorOnly_Structures_F_Ind_Transmitter_Tower","CuratorOnly_Structures_F_Items_Vessels","CuratorOnly_Structures_F_Mil_BagBunker","CuratorOnly_Structures_F_Mil_BagFence","CuratorOnly_Structures_F_Mil_Cargo","CuratorOnly_Structures_F_Mil_Fortification","CuratorOnly_Structures_F_Mil_Radar","CuratorOnly_Structures_F_Mil_Shelters","CuratorOnly_Structures_F_Research","CuratorOnly_Structures_F_Walls","CuratorOnly_Structures_F_Wrecks","A3_Data_F_Exp_B_Loadorder","A3_Data_F_Mod","A3_Language_F_Mod","A3_Sounds_F_Mod","A3_Weapons_F_Mod","A3_Weapons_F_Mod_SMGs_SMG_03","A3_Anims_F_Mod","A3_Data_F_Exp","A3_Data_F_Exp_ParticleEffects","A3_Data_F_Mod_Loadorder","A3_Dubbing_F_Exp","A3_Dubbing_Radio_F_EXP","A3_Dubbing_Radio_F_EXP_Data_CHI","A3_Dubbing_Radio_F_EXP_Data_ENGFRE","A3_Dubbing_Radio_F_EXP_Data_FRE","A3_EditorPreviews_F_Exp","A3_Functions_F_Exp","A3_Language_F_Exp","A3_LanguageMissions_F_Exp","A3_Missions_F_Exp","A3_Missions_F_Exp_Data","A3_Missions_F_Exp_Video","A3_Modules_F_Exp","A3_Music_F_Exp","A3_Music_F_Exp_Music","A3_Props_F_Exp","A3_Props_F_Exp_Civilian","A3_Props_F_Exp_Civilian_Garbage","A3_Props_F_Exp_Commercial","A3_Props_F_Exp_Commercial_Market","A3_Props_F_Exp_Industrial","A3_Props_F_Exp_Industrial_HeavyEquipment","A3_Props_F_Exp_Infrastructure","A3_Props_F_Exp_Infrastructure_Railways","A3_Props_F_Exp_Infrastructure_Traffic","A3_Props_F_Exp_Military","A3_Props_F_Exp_Military_Camps","A3_Props_F_Exp_Military_OldPlaneWrecks","A3_Props_F_Exp_Naval","A3_Props_F_Exp_Naval_Boats","A3_Rocks_F_Exp","A3_Rocks_F_Exp_Cliff","A3_Rocks_F_Exp_LavaStones","A3_Soft_F_Exp","A3_Soft_F_Exp_LSV_01","A3_Soft_F_Exp_LSV_02","A3_Soft_F_Exp_MRAP_01","A3_Soft_F_Exp_MRAP_02","A3_Soft_F_Exp_Offroad_01","A3_Soft_F_Exp_Offroad_02","A3_Soft_F_Exp_Quadbike_01","A3_Soft_F_Exp_Truck_01","A3_Soft_F_Exp_Truck_02","A3_Soft_F_Exp_Truck_03","A3_Soft_F_Exp_UGV_01","A3_Soft_F_Exp_Van_01","A3_Static_F_Exp","A3_Static_F_Exp_AA_01","A3_Static_F_Exp_AT_01","A3_Static_F_Exp_GMG_01","A3_Static_F_Exp_HMG_01","A3_Static_F_Exp_Mortar_01","A3_Structures_F_Exp","A3_Structures_F_Exp_Civilian","A3_Structures_F_Exp_Civilian_Accessories","A3_Structures_F_Exp_Civilian_Garages","A3_Structures_F_Exp_Civilian_House_Big_01","A3_Structures_F_Exp_Civilian_House_Big_02","A3_Structures_F_Exp_Civilian_House_Big_03","A3_Structures_F_Exp_Civilian_House_Big_04","A3_Structures_F_Exp_Civilian_House_Big_05","A3_Structures_F_Exp_Civilian_House_Native_01","A3_Structures_F_Exp_Civilian_House_Native_02","A3_Structures_F_Exp_Civilian_House_Small_01","A3_Structures_F_Exp_Civilian_House_Small_02","A3_Structures_F_Exp_Civilian_House_Small_03","A3_Structures_F_Exp_Civilian_House_Small_04","A3_Structures_F_Exp_Civilian_House_Small_05","A3_Structures_F_Exp_Civilian_House_Small_06","A3_Structures_F_Exp_Civilian_School_01","A3_Structures_F_Exp_Civilian_Sheds","A3_Structures_F_Exp_Civilian_Slum_01","A3_Structures_F_Exp_Civilian_Slum_02","A3_Structures_F_Exp_Civilian_Slum_03","A3_Structures_F_Exp_Civilian_Slum_04","A3_Structures_F_Exp_Civilian_Slum_05","A3_Structures_F_Exp_Civilian_SportsGrounds","A3_Structures_F_Exp_Commercial","A3_Structures_F_Exp_Commercial_Addons","A3_Structures_F_Exp_Commercial_Advertisements","A3_Structures_F_Exp_Commercial_FuelStation_01","A3_Structures_F_Exp_Commercial_FuelStation_02","A3_Structures_F_Exp_Commercial_Hotel_01","A3_Structures_F_Exp_Commercial_Hotel_02","A3_Structures_F_Exp_Commercial_Market","A3_Structures_F_Exp_Commercial_MultistoryBuilding_01","A3_Structures_F_Exp_Commercial_MultistoryBuilding_03","A3_Structures_F_Exp_Commercial_MultistoryBuilding_04","A3_Structures_F_Exp_Commercial_Shop_City_01","A3_Structures_F_Exp_Commercial_Shop_City_02","A3_Structures_F_Exp_Commercial_Shop_City_03","A3_Structures_F_Exp_Commercial_Shop_City_04","A3_Structures_F_Exp_Commercial_Shop_City_05","A3_Structures_F_Exp_Commercial_Shop_City_06","A3_Structures_F_Exp_Commercial_Shop_City_07","A3_Structures_F_Exp_Commercial_Shop_Town_01","A3_Structures_F_Exp_Commercial_Shop_Town_02","A3_Structures_F_Exp_Commercial_Shop_Town_03","A3_Structures_F_Exp_Commercial_Shop_Town_04","A3_Structures_F_Exp_Commercial_Shop_Town_05","A3_Structures_F_Exp_Commercial_Supermarket_01","A3_Structures_F_Exp_Commercial_Warehouses","A3_Structures_F_Exp_Cultural","A3_Structures_F_Exp_Cultural_AncientRelics","A3_Structures_F_Exp_Cultural_BasaltRuins","A3_Structures_F_Exp_Cultural_Cathedral_01","A3_Structures_F_Exp_Cultural_Cemeteries","A3_Structures_F_Exp_Cultural_Church_01","A3_Structures_F_Exp_Cultural_Church_02","A3_Structures_F_Exp_Cultural_Church_03","A3_Structures_F_Exp_Cultural_Fortress_01","A3_Structures_F_Exp_Cultural_Temple_Native_01","A3_Structures_F_Exp_Cultural_Totems","A3_Structures_F_Exp_Data","A3_Structures_F_Exp_Industrial","A3_Structures_F_Exp_Industrial_DieselPowerPlant_01","A3_Structures_F_Exp_Industrial_Fields","A3_Structures_F_Exp_Industrial_Materials","A3_Structures_F_Exp_Industrial_Port","A3_Structures_F_Exp_Industrial_Stockyard_01","A3_Structures_F_Exp_Industrial_SugarCaneFactory_01","A3_Structures_F_Exp_Industrial_SurfaceMine_01","A3_Structures_F_Exp_Infrastructure","A3_Structures_F_Exp_Infrastructure_Airports","A3_Structures_F_Exp_Infrastructure_Bridges","A3_Structures_F_Exp_Infrastructure_Pavements","A3_Structures_F_Exp_Infrastructure_Powerlines","A3_Structures_F_Exp_Infrastructure_Railways","A3_Structures_F_Exp_Infrastructure_Roads","A3_Structures_F_Exp_Infrastructure_Runways","A3_Structures_F_Exp_Infrastructure_WaterSupply","A3_Structures_F_Exp_Military","A3_Structures_F_Exp_Military_Barracks_01","A3_Structures_F_Exp_Military_Camonets","A3_Structures_F_Exp_Military_ContainerBases","A3_Structures_F_Exp_Military_Emplacements","A3_Structures_F_Exp_Military_Flags","A3_Structures_F_Exp_Military_Fortifications","A3_Structures_F_Exp_Military_Pillboxes","A3_Structures_F_Exp_Military_Trenches","A3_Structures_F_Exp_Naval","A3_Structures_F_Exp_Naval_Canals","A3_Structures_F_Exp_Naval_Piers","A3_Structures_F_Exp_Signs","A3_Structures_F_Exp_Signs_Companies","A3_Structures_F_Exp_Signs_Traffic","A3_Structures_F_Exp_Walls","A3_Structures_F_Exp_Walls_BackAlleys","A3_Structures_F_Exp_Walls_Bamboo","A3_Structures_F_Exp_Walls_Concrete","A3_Structures_F_Exp_Walls_Crashbarriers","A3_Structures_F_Exp_Walls_Hedges","A3_Structures_F_Exp_Walls_Net","A3_Structures_F_Exp_Walls_Pipe","A3_Structures_F_Exp_Walls_Polewalls","A3_Structures_F_Exp_Walls_Railings","A3_Structures_F_Exp_Walls_Slum","A3_Structures_F_Exp_Walls_Stone","A3_Structures_F_Exp_Walls_Tin","A3_Structures_F_Exp_Walls_Wired","A3_Structures_F_Exp_Walls_Wooden","A3_Supplies_F_Exp","A3_Supplies_F_Exp_Ammoboxes","A3_Ui_F_Exp","A3_Vegetation_F_Exp","A3_Weapons_F_Exp","A3_Weapons_F_Exp_Launchers_RPG32","A3_Weapons_F_Exp_Launchers_RPG7","A3_Weapons_F_Exp_Launchers_Titan","A3_Weapons_F_Exp_LongRangeRifles_DMR_07","A3_Weapons_F_Exp_Machineguns_LMG_03","A3_Weapons_F_Exp_Pistols_Pistol_01","A3_Weapons_F_Exp_Rifles_AK12","A3_Weapons_F_Exp_Rifles_AKM","A3_Weapons_F_Exp_Rifles_AKS","A3_Weapons_F_Exp_Rifles_ARX","A3_Weapons_F_Exp_Rifles_CTAR","A3_Weapons_F_Exp_Rifles_CTARS","A3_Weapons_F_Exp_Rifles_SPAR_01","A3_Weapons_F_Exp_Rifles_SPAR_02","A3_Weapons_F_Exp_Rifles_SPAR_03","A3_Weapons_F_Exp_SMGs_SMG_05","A3_Air_F_Exp","A3_Air_F_Exp_Heli_Light_01","A3_Air_F_Exp_Heli_Transport_01","A3_Air_F_Exp_Plane_Civil_01","A3_Air_F_Exp_UAV_03","A3_Air_F_Exp_UAV_04","A3_Air_F_Exp_VTOL_01","A3_Air_F_Exp_VTOL_02","A3_Anims_F_Exp","A3_Anims_F_Exp_Revive","A3_Armor_F_Exp","A3_Armor_F_Exp_APC_Tracked_01","A3_Armor_F_Exp_APC_Tracked_02","A3_Armor_F_Exp_APC_Wheeled_01","A3_Armor_F_Exp_APC_Wheeled_02","A3_Armor_F_Exp_MBT_01","A3_Armor_F_Exp_MBT_02","A3_Boat_F_Exp","A3_Boat_F_Exp_Boat_Armed_01","A3_Boat_F_Exp_Boat_Transport_01","A3_Boat_F_Exp_Boat_Transport_02","A3_Boat_F_Exp_Scooter_Transport_01","A3_Cargoposes_F_Exp","A3_Characters_F_Exp","A3_Characters_F_Exp_Civil","A3_Characters_F_Exp_Headgear","A3_Characters_F_Exp_Vests","A3_Sounds_F_Exp","A3_Data_F_Exp_Loadorder","A3_Data_F_Jets","A3_Dubbing_F_Jets","A3_EditorPreviews_F_Jets","A3_Functions_F_Destroyer","A3_Functions_F_Jets","A3_Language_F_Jets","A3_LanguageMissions_F_Jets","A3_Modules_F_Jets","A3_Music_F_Jets","A3_Props_F_Jets","A3_Props_F_Jets_Military_Tractor","A3_Props_F_Jets_Military_Trolley","A3_Sounds_F_Jets","A3_Static_F_Jets","A3_Static_F_Jets_AAA_System_01","A3_Static_F_Jets_SAM_System_01","A3_Static_F_Jets_SAM_System_02","A3_Ui_F_Jets","A3_Weapons_F_Jets","A3_Air_F_Jets","A3_Air_F_Jets_Plane_Fighter_01","A3_Air_F_Jets_Plane_Fighter_02","A3_Air_F_Jets_Plane_Fighter_04","A3_Air_F_Jets_UAV_05","A3_Anims_F_Jets","A3_Boat_F_Jets","A3_Boat_F_Jets_Carrier_01","A3_Cargoposes_F_Jets","A3_Characters_F_Jets","A3_Characters_F_Jets_Vests","A3_Missions_F_Jets","A3_Boat_F_Destroyer","A3_Boat_F_Destroyer_Destroyer_01","A3_Data_F_Jets_Loadorder","A3_Data_F_Argo","A3_EditorPreviews_F_Argo","A3_Language_F_Argo","A3_Map_Malden","A3_Map_Malden_Data","A3_Map_Malden_Data_Layers","A3_Map_Malden_Scenes_F","A3_Music_F_Argo","A3_Props_F_Argo","A3_Props_F_Argo_Civilian","A3_Props_F_Argo_Civilian_InfoBoards","A3_Props_F_Argo_Items","A3_Props_F_Argo_Items_Documents","A3_Props_F_Argo_Items_Electronics","A3_Rocks_F_Argo","A3_Rocks_F_Argo_Limestone","A3_Structures_F_Argo","A3_Structures_F_Argo_Civilian","A3_Structures_F_Argo_Civilian_Accessories","A3_Structures_F_Argo_Civilian_Addons","A3_Structures_F_Argo_Civilian_Garbage","A3_Structures_F_Argo_Civilian_House_Big01","A3_Structures_F_Argo_Civilian_House_Big02","A3_Structures_F_Argo_Civilian_House_Small01","A3_Structures_F_Argo_Civilian_House_Small02","A3_Structures_F_Argo_Civilian_Stone_House_Big_01","A3_Structures_F_Argo_Civilian_Stone_Shed_01","A3_Structures_F_Argo_Civilian_Unfinished_Building_01","A3_Structures_F_Argo_Commercial","A3_Structures_F_Argo_Commercial_Accessories","A3_Structures_F_Argo_Commercial_Billboards","A3_Structures_F_Argo_Commercial_FuelStation_01","A3_Structures_F_Argo_Commercial_Shop_02","A3_Structures_F_Argo_Commercial_Supermarket_01","A3_Structures_F_Argo_Cultural","A3_Structures_F_Argo_Cultural_Church","A3_Structures_F_Argo_Cultural_Statues","A3_Structures_F_Argo_Decals","A3_Structures_F_Argo_Decals_Horizontal","A3_Structures_F_Argo_Industrial","A3_Structures_F_Argo_Industrial_Agriculture","A3_Structures_F_Argo_Industrial_Materials","A3_Structures_F_Argo_Infrastructure","A3_Structures_F_Argo_Infrastructure_Runways","A3_Structures_F_Argo_Infrastructure_Seaports","A3_Structures_F_Argo_Infrastructure_WaterSupply","A3_Structures_F_Argo_Military","A3_Structures_F_Argo_Military_Bunkers","A3_Structures_F_Argo_Military_ContainerBases","A3_Structures_F_Argo_Military_Domes","A3_Structures_F_Argo_Military_Fortifications","A3_Structures_F_Argo_Military_Turrets","A3_Structures_F_Argo_Signs","A3_Structures_F_Argo_Signs_City","A3_Structures_F_Argo_Signs_Directions","A3_Structures_F_Argo_Signs_Warnings","A3_Structures_F_Argo_Walls","A3_Structures_F_Argo_Walls_City","A3_Structures_F_Argo_Walls_Concrete","A3_Structures_F_Argo_Walls_Military","A3_Structures_F_Argo_Walls_Net","A3_Structures_F_Argo_Walls_Pipe","A3_Structures_F_Argo_Walls_Tin","A3_Structures_F_Argo_Walls_Wooden","A3_Structures_F_Argo_Wrecks","A3_Vegetation_F_Argo","A3_Armor_F_Argo","A3_Armor_F_Argo_APC_Tracked_01","A3_Armor_F_Argo_APC_Wheeled_02","A3_Data_F_Argo_Loadorder","A3_Data_F_Patrol","A3_Functions_F_Patrol","A3_Language_F_Patrol","A3_LanguageMissions_F_Patrol","A3_Map_Tanoabuka","A3_Map_Tanoabuka_Data","A3_Map_Tanoabuka_Data_Layers","A3_Modules_F_Patrol","A3_Sounds_F_Patrol","A3_Ui_F_Patrol","A3_Weapons_F_Patrol","A3_Characters_F_Patrol","A3_Map_Tanoa_Scenes_F","A3_Missions_F_Patrol","A3_Data_F_Patrol_Loadorder","A3_Data_F_Orange","A3_Dubbing_F_Orange","A3_EditorPreviews_F_Orange","A3_Functions_F_Orange","A3_Language_F_Orange","A3_LanguageMissions_F_Orange","A3_Missions_F_Orange","A3_Modules_F_Orange","A3_Music_F_Orange","A3_Props_F_Orange","A3_Props_F_Orange_Civilian","A3_Props_F_Orange_Civilian_Constructions","A3_Props_F_Orange_Civilian_InfoBoards","A3_Props_F_Orange_Furniture","A3_Props_F_Orange_Humanitarian","A3_Props_F_Orange_Humanitarian_Camps","A3_Props_F_Orange_Humanitarian_Garbage","A3_Props_F_Orange_Humanitarian_Supplies","A3_Props_F_Orange_Items","A3_Props_F_Orange_Items_Decorative","A3_Props_F_Orange_Items_Documents","A3_Props_F_Orange_Items_Electronics","A3_Props_F_Orange_Items_Tools","A3_Soft_F_Orange","A3_Soft_F_Orange_Offroad_01","A3_Soft_F_Orange_Offroad_02","A3_Soft_F_Orange_Truck_02","A3_Soft_F_Orange_UGV_01","A3_Soft_F_Orange_Van_02","A3_Structures_F_Orange","A3_Structures_F_Orange_Humanitarian","A3_Structures_F_Orange_Humanitarian_Camps","A3_Structures_F_Orange_Humanitarian_Flags","A3_Structures_F_Orange_Industrial","A3_Structures_F_Orange_Industrial_Cargo","A3_Structures_F_Orange_Signs","A3_Structures_F_Orange_Signs_Mines","A3_Structures_F_Orange_Signs_Special","A3_Structures_F_Orange_VR_Helpers","A3_Structures_F_Orange_Walls","A3_Structures_F_Orange_Walls_Plastic","A3_Supplies_F_Orange","A3_Supplies_F_Orange_Ammoboxes","A3_Supplies_F_Orange_Bags","A3_Supplies_F_Orange_CargoNets","A3_Ui_F_Orange","A3_Weapons_F_Orange","A3_Weapons_F_Orange_Explosives","A3_Weapons_F_Orange_Items","A3_Air_F_Orange","A3_Air_F_Orange_Heli_Transport_02","A3_Air_F_Orange_UAV_01","A3_Air_F_Orange_UAV_06","A3_Cargoposes_F_Orange","A3_Characters_F_Orange","A3_Characters_F_Orange_Facewear","A3_Characters_F_Orange_Headgear","A3_Characters_F_Orange_Uniforms","A3_Characters_F_Orange_Vests","A3_Sounds_F_Orange","A3_Data_F_Orange_Loadorder","A3_Data_F_Tacops","A3_Dubbing_F_Tacops","A3_Functions_F_Tacops","A3_Language_F_Tacops","A3_LanguageMissions_F_Tacops","A3_Missions_F_Tacops","A3_Modules_F_Tacops","A3_Music_F_Tacops","A3_Sounds_F_Tacops","A3_Ui_F_Tacops","A3_Characters_F_Tacops","A3_Data_F_Tacops_Loadorder","A3_Data_F_Tank","A3_Dubbing_F_Tank","A3_EditorPreviews_F_Tank","A3_Functions_F_Tank","A3_Language_F_Tank","A3_Language_F_Warlords","A3_LanguageMissions_F_Tank","A3_Missions_F_Tank","A3_Modules_F_Tank","A3_Music_F_Tank","A3_Props_F_Tank","A3_Props_F_Tank_Military","A3_Props_F_Tank_Military_TankAcc","A3_Props_F_Tank_Military_Wrecks","A3_Sounds_F_Tank","A3_Structures_F_Tank","A3_Structures_F_Tank_Decals","A3_Structures_F_Tank_Decals_Horizontal","A3_Structures_F_Tank_Military","A3_Structures_F_Tank_Military_Fortifications","A3_Structures_F_Tank_Military_RepairDepot","A3_Ui_F_Tank","A3_Weapons_F_Tank","A3_Weapons_F_Tank_Bags","A3_Weapons_F_Tank_Launchers_MRAWS","A3_Weapons_F_Tank_Launchers_Vorona","A3_Armor_F_Tank","A3_Armor_F_Tank_AFV_Wheeled_01","A3_Armor_F_Tank_LT_01","A3_Armor_F_Tank_MBT_04","A3_Cargoposes_F_Tank","A3_Characters_F_Tank","A3_Characters_F_Tank_Headgear","A3_Characters_F_Tank_Uniforms","A3_Data_F_Tank_Loadorder","A3_Language_F_Oldman","A3_Data_F_Destroyer","A3_Data_F_Sams","A3_Data_F_Warlords","A3_Dubbing_F_Warlords","A3_EditorPreviews_F_Destroyer","A3_EditorPreviews_F_Sams","A3_Functions_F_Warlords","A3_Language_F_Destroyer","A3_Language_F_Sams","A3_Missions_F_Warlords","A3_Missions_F_Warlords_Data","A3_Modules_F_Warlords","A3_Props_F_Destroyer","A3_Props_F_Destroyer_Military_BriefingRoomDesk","A3_Props_F_Destroyer_Military_BriefingRoomScreen","A3_Static_F_Destroyer","A3_Static_F_Destroyer_Boat_Rack_01","A3_Static_F_Destroyer_Ship_Gun_01","A3_Static_F_Destroyer_Ship_MRLS_01","A3_Static_F_Sams","A3_Static_F_Sams_Radar_System_01","A3_Static_F_Sams_Radar_System_02","A3_Static_F_Sams_SAM_System_03","A3_Static_F_Sams_SAM_System_04","A3_Weapons_F_Destroyer","A3_Weapons_F_Sams","A3_Data_F_Destroyer_Loadorder","A3_Data_F_Sams_Loadorder","A3_Data_F_Warlords_Loadorder","A3_Data_F_Enoch","A3_Dubbing_Radio_F_Enoch","A3_EditorPreviews_F_Enoch","A3_Functions_F_Enoch","A3_Language_F_Enoch","A3_Missions_F_Enoch","A3_Music_F_Enoch","A3_Props_F_Enoch","A3_Props_F_Enoch_Civilian","A3_Props_F_Enoch_Civilian_Camping","A3_Props_F_Enoch_Civilian_Forest","A3_Props_F_Enoch_Civilian_Garbage","A3_Props_F_Enoch_Civilian_InfoBoards","A3_Props_F_Enoch_Industrial","A3_Props_F_Enoch_Industrial_Electric","A3_Props_F_Enoch_Industrial_Supplies","A3_Props_F_Enoch_Infrastructure","A3_Props_F_Enoch_Infrastructure_Traffic","A3_Props_F_Enoch_Items","A3_Props_F_Enoch_Items_Documents","A3_Props_F_Enoch_Items_AluminiumFoil","A3_Props_F_Enoch_Military","A3_Props_F_Enoch_Military_Camps","A3_Props_F_Enoch_Military_Decontamination","A3_Props_F_Enoch_Military_Equipment","A3_Props_F_Enoch_Military_Garbage","A3_Props_F_Enoch_Military_Supplies","A3_Props_F_Enoch_Military_Wrecks","A3_Rocks_F_Enoch","A3_Rocks_F_Enoch_Sinkhole","A3_Soft_F_Enoch","A3_Soft_F_Enoch_Offroad_01","A3_Soft_F_Enoch_Quadbike_01","A3_Soft_F_Enoch_Tractor_01","A3_Soft_F_Enoch_Truck_01","A3_Soft_F_Enoch_Truck_02","A3_Soft_F_Enoch_UGV_01","A3_Soft_F_Enoch_UGV_02","A3_Soft_F_Enoch_Van_02","A3_Sounds_F_Enoch","A3_Static_F_Enoch","A3_Static_F_Enoch_AA_01","A3_Static_F_Enoch_AT_01","A3_Static_F_Enoch_Designator_01","A3_Static_F_Enoch_GMG_01","A3_Static_F_Enoch_HMG_01","A3_Static_F_Enoch_Mortar_01","A3_Static_F_Enoch_Radar_System_01","A3_Static_F_Enoch_SAM_System_03","A3_Structures_F_Enoch","A3_Structures_F_Enoch_Civilian","A3_Structures_F_Enoch_Civilian_Accessories","A3_Structures_F_Enoch_Civilian_Camps","A3_Structures_F_Enoch_Civilian_Constructions","A3_Structures_F_Enoch_Civilian_Houses","A3_Structures_F_Enoch_Civilian_Medical","A3_Structures_F_Enoch_Civilian_Police","A3_Structures_F_Enoch_Civilian_Sheds","A3_Structures_F_Enoch_Commercial","A3_Structures_F_Enoch_Commercial_FuelStation_03","A3_Structures_F_Enoch_Commercial_VillageStore_01","A3_Structures_F_Enoch_Cultural","A3_Structures_F_Enoch_Cultural_Calvary_03","A3_Structures_F_Enoch_Cultural_Calvary_04","A3_Structures_F_Enoch_Cultural_CastleRuins","A3_Structures_F_Enoch_Cultural_Cemeteries","A3_Structures_F_Enoch_Cultural_Chapel_01","A3_Structures_F_Enoch_Cultural_Chapel_02","A3_Structures_F_Enoch_Cultural_Church_04","A3_Structures_F_Enoch_Cultural_Church_05","A3_Structures_F_Enoch_Cultural_OrthodoxChurches","A3_Structures_F_Enoch_Cultural_Statues","A3_Structures_F_Enoch_Data","A3_Structures_F_Enoch_Decals","A3_Structures_F_Enoch_Decals_Horizontal","A3_Structures_F_Enoch_Furniture","A3_Structures_F_Enoch_Industrial","A3_Structures_F_Enoch_Industrial_Agriculture","A3_Structures_F_Enoch_Industrial_Cargo","A3_Structures_F_Enoch_Industrial_CementWorks","A3_Structures_F_Enoch_Industrial_CoalPlant_01","A3_Structures_F_Enoch_Industrial_DieselPowerPlant_01","A3_Structures_F_Enoch_Industrial_Farms","A3_Structures_F_Enoch_Industrial_Garages","A3_Structures_F_Enoch_Industrial_Houses","A3_Structures_F_Enoch_Industrial_Materials","A3_Structures_F_Enoch_Industrial_Mines","A3_Structures_F_Enoch_Industrial_Pipes","A3_Structures_F_Enoch_Industrial_Power","A3_Structures_F_Enoch_Industrial_Sawmills","A3_Structures_F_Enoch_Industrial_Sheds","A3_Structures_F_Enoch_Industrial_Smokestacks","A3_Structures_F_Enoch_Industrial_Transmitter_Tower","A3_Structures_F_Enoch_Infrastructure","A3_Structures_F_Enoch_Infrastructure_Benchmarks","A3_Structures_F_Enoch_Infrastructure_Bridges","A3_Structures_F_Enoch_Infrastructure_Highway","A3_Structures_F_Enoch_Infrastructure_Lamps","A3_Structures_F_Enoch_Infrastructure_Pavements","A3_Structures_F_Enoch_Infrastructure_Powerlines","A3_Structures_F_Enoch_Infrastructure_Railways","A3_Structures_F_Enoch_Infrastructure_Roads","A3_Structures_F_Enoch_Military","A3_Structures_F_Enoch_Military_Airfield","A3_Structures_F_Enoch_Military_Barracks","A3_Structures_F_Enoch_Military_Bunkers","A3_Structures_F_Enoch_Military_Camonets","A3_Structures_F_Enoch_Military_Camps","A3_Structures_F_Enoch_Military_Domes","A3_Structures_F_Enoch_Military_Flags","A3_Structures_F_Enoch_Military_Radar","A3_Structures_F_Enoch_Military_Training","A3_Structures_F_Enoch_Ruins","A3_Structures_F_Enoch_Signs","A3_Structures_F_Enoch_Signs_City","A3_Structures_F_Enoch_Signs_Companies","A3_Structures_F_Enoch_Signs_Directions","A3_Structures_F_Enoch_Signs_Traffic","A3_Structures_F_Enoch_Signs_Warnings","A3_Structures_F_Enoch_VR_Helpers","A3_Structures_F_Enoch_Walls","A3_Structures_F_Enoch_Walls_Brick","A3_Structures_F_Enoch_Walls_Concrete","A3_Structures_F_Enoch_Walls_Net","A3_Structures_F_Enoch_Walls_Pipe","A3_Structures_F_Enoch_Walls_Polewalls","A3_Structures_F_Enoch_Walls_Stone","A3_Structures_F_Enoch_Walls_Wooden","A3_Structures_F_Enoch_Wrecks","A3_Supplies_F_Enoch","A3_Supplies_F_Enoch_Ammoboxes","A3_Supplies_F_Enoch_Bags","A3_Ui_F_Enoch","A3_Vegetation_F_Enoch","A3_Weapons_F_Enoch","A3_Weapons_F_Enoch_Acc","A3_Weapons_F_Enoch_Items","A3_Weapons_F_Enoch_Launchers_RPG32","A3_Weapons_F_Enoch_Launchers_Titan","A3_Weapons_F_Enoch_LongRangeRifles_DMR_06","A3_Weapons_F_Enoch_Machineguns_M200","A3_Weapons_F_Enoch_Pistols_ESD","A3_Weapons_F_Enoch_Pistols_Pistol_Heavy_01","A3_Weapons_F_Enoch_Rifles_AK12","A3_Weapons_F_Enoch_Rifles_MSBS","A3_Weapons_F_Enoch_Rifles_MX","A3_Weapons_F_Enoch_Rifles_HunterShotgun_01","A3_Air_F_Enoch","A3_Air_F_Enoch_Heli_Light_03","A3_Air_F_Enoch_UAV_01","A3_Air_F_Enoch_UAV_06","A3_Anims_F_Enoch","A3_Armor_F_Enoch","A3_Armor_F_Enoch_APC_Tracked_03","A3_Cargoposes_F_Enoch","A3_Characters_F_Enoch","A3_Characters_F_Enoch_Facewear","A3_Characters_F_Enoch_Headgear","A3_Characters_F_Enoch_Vests","A3_Map_Enoch","A3_Map_Enoch_Data","A3_Map_Enoch_Data_Layers","A3_Map_Enoch_Scenes_F","A3_Data_F_Enoch_Loadorder","A3_Data_F_Oldman","A3_Dubbing_F_Oldman","A3_EditorPreviews_F_Oldman","A3_Functions_F_Oldman","A3_LanguageMissions_F_Oldman","A3_Missions_F_Oldman","A3_Modules_F_Oldman","A3_Music_F_Oldman","A3_Props_F_Oldman","A3_Props_F_Oldman_Items","A3_Soft_F_Oldman","A3_Soft_F_Oldman_Offroad_01","A3_Sounds_F_Oldman","A3_Static_F_Oldman","A3_Static_F_Oldman_HMG_02","A3_Structures_F_Oldman","A3_Structures_F_Oldman_Decals","A3_Structures_F_Oldman_Signs","A3_Structures_F_Oldman_Signs_Boards","A3_Structures_F_Oldman_Signs_Traffic","A3_Supplies_F_Oldman","A3_Ui_F_Oldman","A3_Characters_F_Oldman","A3_Characters_F_Oldman_Headgear","A3_Characters_F_Oldman_Heads","A3_Data_F_Oldman_Loadorder"]; + uiNamespace setVariable ["RscDisplayRemoteMissions",displayNull]; //for Spy-Glass uiNamespace setVariable ["RscDisplayMultiplayer",displayNull]; @@ -296,5 +146,9 @@ if (getText(configFile >> "CfgFunctions" >> "init") != "A3\functions_f\initFunct }; [] execVM "SpyGlass\fn_cmdMenuCheck.sqf"; -[] execVM "SpyGlass\fn_variableCheck.sqf"; -[] execVM "SpyGlass\fn_menuCheck.sqf"; \ No newline at end of file +[] execVM "SpyGlass\fn_menuCheck.sqf"; + +/* + Disabled at 5.0.0 +*/ +//[] execVM "SpyGlass\fn_variableCheck.sqf"; diff --git a/Altis_Life.Altis/SpyGlass/fn_variableCheck.sqf b/Altis_Life.Altis/SpyGlass/fn_variableCheck.sqf index 66b0fabf7..e53cde68c 100644 --- a/Altis_Life.Altis/SpyGlass/fn_variableCheck.sqf +++ b/Altis_Life.Altis/SpyGlass/fn_variableCheck.sqf @@ -98,11 +98,11 @@ for "_i" from 0 to 1 step 0 do { objNull call _checkFunction; uiSleep 10; objNull call _uiCheckFunction; - + if !((count allVariables profileNameSpace) isEqualTo _profileCount) then { failMission "SpyGlass"; }; - + if !((count allVariables parsingNamespace) isEqualTo 0) then { //We should check whether both these variables are present in parsingNS on init, and whether the order is consistent, so to remove the loop { diff --git a/Altis_Life.Altis/config/Config_Loadouts.hpp b/Altis_Life.Altis/config/Config_Loadouts.hpp index f38e94db9..af01f9bf2 100644 --- a/Altis_Life.Altis/config/Config_Loadouts.hpp +++ b/Altis_Life.Altis/config/Config_Loadouts.hpp @@ -1,83 +1,83 @@ -#define true 1 -#define false 0 -/* - class PLAYERSIDE { // PLAYERSIDE can be: WEST (for cops), CIV (for civ/reb), GUER (for medics), EAST (for opfor) - // NOTES: - // empty array means that nothing will be add on players - // CIV's loadout are selected randonly if he is not in jail, - // otherwise, for the other teams, player will get the uniform related to his level - - // Unit Loadout Array detailed information: https://community.bistudio.com/wiki/Unit_Loadout_Array - class side_level_X : side_level_0 { // where side can be: civ, cop or med. And X is a level number of the given side - uniformClass = ""; - backpack = ""; - linkedItems[] = {}; - weapons[] = {}; - items[] = {}; - magazines[] = {}; - }; - }; -*/ -class Loadouts { - // CIV - civilian_randomClothing = true; // true: select a random uniform from 'civRandomClothing' and adds into 'civ_level_random' class - false: use 'civ_level_random' class as it is - civRandomClothing[] = {"U_C_Poloshirt_blue", "U_C_Poloshirt_burgundy", "U_C_Poloshirt_stripped", "U_C_Poloshirt_tricolour", "U_C_Poloshirt_salmon", "U_C_Poloshirt_redwhite", "U_C_Commoner1_1"}; // Clothes that a civilian can spawn with - class civ_level_random { - uniformClass = "U_C_Commoner1_1"; - backpack = ""; - linkedItems[] = {"ItemMap" , "ItemCompass", "ItemWatch"}; - weapons[] = {}; - items[] = {}; - magazines[] = {}; - }; - class civ_level_arrested { // Arrested player's loadout - uniformClass = "U_C_WorkerCoveralls"; - backpack = ""; - linkedItems[] = {}; - weapons[] = {}; - items[] = {}; - magazines[] = {}; - }; - - // COP - class cop_level_0 { - uniformClass = "U_Rangemaster"; - backpack = ""; - linkedItems[] = {"H_Cap_blk", "V_Rangemaster_belt", "ItemMap" , "ItemCompass", "ItemWatch"}; - weapons[] = {"hgun_P07_snds_F"}; - items[] = {}; - magazines[] = {"16Rnd_9x21_Mag", "16Rnd_9x21_Mag", "16Rnd_9x21_Mag", "16Rnd_9x21_Mag", "16Rnd_9x21_Mag", "16Rnd_9x21_Mag"}; - }; - class cop_level_1 : cop_level_0 {}; - class cop_level_2 : cop_level_0 {}; - class cop_level_3 : cop_level_0 {}; - class cop_level_4 : cop_level_0 {}; - class cop_level_5 : cop_level_0 {}; - class cop_level_6 : cop_level_0 {}; - class cop_level_7 : cop_level_0 {}; - - // MED - class med_level_0 { - uniformClass = "U_Rangemaster"; - backpack = ""; - linkedItems[] = {"H_Cap_red", "ItemMap" , "ItemCompass", "ItemWatch"}; - weapons[] = {}; - items[] = {"FirstAidKit", "FirstAidKit"}; - magazines[] = {}; - }; - class med_level_1 : med_level_0 {}; - class med_level_2 : med_level_0 {}; - class med_level_3 : med_level_0 {}; - class med_level_4 : med_level_0 {}; - class med_level_5 : med_level_0 {}; - - // EAST - class east_level_0 { - uniformClass = "U_C_Commoner1_1"; - backpack = ""; - linkedItems[] = {"ItemMap" , "ItemCompass", "ItemWatch"}; - weapons[] = {}; - items[] = {}; - magazines[] = {}; - }; -}; +#define true 1 +#define false 0 +/* + class PLAYERSIDE { // PLAYERSIDE can be: WEST (for cops), CIV (for civ/reb), GUER (for medics), EAST (for opfor) + // NOTES: + // empty array means that nothing will be add on players + // CIV's loadout are selected randonly if he is not in jail, + // otherwise, for the other teams, player will get the uniform related to his level + + // Unit Loadout Array detailed information: https://community.bistudio.com/wiki/Unit_Loadout_Array + class side_level_X : side_level_0 { // where side can be: civ, cop or med. And X is a level number of the given side + uniformClass = ""; + backpack = ""; + linkedItems[] = {}; + weapons[] = {}; + items[] = {}; + magazines[] = {}; + }; + }; +*/ +class Loadouts { + // CIV + civilian_randomClothing = true; // true: select a random uniform from 'civRandomClothing' and adds into 'civ_level_random' class - false: use 'civ_level_random' class as it is + civRandomClothing[] = {"U_C_Poloshirt_blue", "U_C_Poloshirt_burgundy", "U_C_Poloshirt_stripped", "U_C_Poloshirt_tricolour", "U_C_Poloshirt_salmon", "U_C_Poloshirt_redwhite", "U_C_Commoner1_1"}; // Clothes that a civilian can spawn with + class civ_level_random { + uniformClass = "U_C_Commoner1_1"; + backpack = ""; + linkedItems[] = {"ItemMap" , "ItemCompass", "ItemWatch"}; + weapons[] = {}; + items[] = {}; + magazines[] = {}; + }; + class civ_level_arrested { // Arrested player's loadout + uniformClass = "U_C_WorkerCoveralls"; + backpack = ""; + linkedItems[] = {}; + weapons[] = {}; + items[] = {}; + magazines[] = {}; + }; + + // COP + class cop_level_0 { + uniformClass = "U_Rangemaster"; + backpack = ""; + linkedItems[] = {"H_Cap_blk", "V_Rangemaster_belt", "ItemMap" , "ItemCompass", "ItemWatch"}; + weapons[] = {"hgun_P07_snds_F"}; + items[] = {}; + magazines[] = {"16Rnd_9x21_Mag", "16Rnd_9x21_Mag", "16Rnd_9x21_Mag", "16Rnd_9x21_Mag", "16Rnd_9x21_Mag", "16Rnd_9x21_Mag"}; + }; + class cop_level_1 : cop_level_0 {}; + class cop_level_2 : cop_level_0 {}; + class cop_level_3 : cop_level_0 {}; + class cop_level_4 : cop_level_0 {}; + class cop_level_5 : cop_level_0 {}; + class cop_level_6 : cop_level_0 {}; + class cop_level_7 : cop_level_0 {}; + + // MED + class med_level_0 { + uniformClass = "U_Rangemaster"; + backpack = ""; + linkedItems[] = {"H_Cap_red", "ItemMap" , "ItemCompass", "ItemWatch"}; + weapons[] = {}; + items[] = {"FirstAidKit", "FirstAidKit"}; + magazines[] = {}; + }; + class med_level_1 : med_level_0 {}; + class med_level_2 : med_level_0 {}; + class med_level_3 : med_level_0 {}; + class med_level_4 : med_level_0 {}; + class med_level_5 : med_level_0 {}; + + // EAST + class east_level_0 { + uniformClass = "U_C_Commoner1_1"; + backpack = ""; + linkedItems[] = {"ItemMap" , "ItemCompass", "ItemWatch"}; + weapons[] = {}; + items[] = {}; + magazines[] = {}; + }; +}; diff --git a/Altis_Life.Altis/config/Config_Master.hpp b/Altis_Life.Altis/config/Config_Master.hpp index 7e24641db..de540767d 100644 --- a/Altis_Life.Altis/config/Config_Master.hpp +++ b/Altis_Life.Altis/config/Config_Master.hpp @@ -15,6 +15,14 @@ class Life_Settings { player_moneyLog = false; //False [default] - No money logging. True - Logs player bank deposits, withdraws, and transfers, gang bank deposits and withdraws, money picked up off of the ground, and player robbery. Search for: money_log player_deathLog = false; //False [default] - No death logging. True - Logs victim and killer, and vehicle or weapon if used, when a player dies. Search for: death_log +/* Performance Settings */ + /* Vehicle Wrecks */ + dead_vehicles_despawn_delay = 30; //delay in seconds before despawning dead vehicles + dead_vehicles_max_units_distance = 300; //maximum distance between wreck and nearest player before despawning (vehicle despawns anyway after specified delay!) + + /* Cleanup */ + vehicles_despawn_max_distance = 1000; //maximum distance between a vehicle and the nearest player, before server puts it back to garage + /* Database Related Settings */ /* Player Data Saving */ save_virtualItems = true; //Save Virtual items (all sides)? @@ -41,6 +49,9 @@ class Life_Settings { noatm_timer = 10; //Time in minutes that players cannot deposit money after selling stolen gold. minimum_cops = 5; //Minimum cops required online to rob the Federal Reserve + /* Messaging Settings */ + message_maxlength = 400; //maximum character count allowed in text messages. Used to prevent improper message displaying. -1 to disable the limit + /*Death settings*/ drop_weapons_onDeath = false; //Set true to enable weapon dropping on death. False (default) will delete player weapons on death, allowing them to be revived with them instead @@ -77,7 +88,7 @@ class Life_Settings { gang_price = 75000; //Gang creation price. --Remember they are persistent so keep it reasonable to avoid millions of gangs. gang_upgradeBase = 10000; //The base cost for purchasing additional slots in a gang gang_upgradeMultiplier = 2.5; //CURRENTLY NOT IN USE - gang_area[] = {"gang_area_1","gang_area_2","gang_area_3"}; //Variable of gang zone markers + gang_area[] = {"gang_area_1","gang_area_2","gang_area_3"}; //Variable of gang zone markers /* Housing System Configurations */ house_limit = 5; //Maximum number of houses a player can own. @@ -137,6 +148,7 @@ class Life_Settings { vehicle_infiniteRepair[] = {false, false, true, false}; //Set to true for unlimited repairs with 1 toolkit. False will remove toolkit upon use. civilian, west, independent, east vehicleShop_rentalOnly[] = { "B_MRAP_01_hmg_F", "B_G_Offroad_01_armed_F", "B_Boat_Armed_01_minigun_F" }; //Vehicles that can only be rented and not purchased. (Last only for the session) vehicleShop_3D = false; //Add preview 3D inside Shop vehicle. Default : False + vehicle_rentalReturn = false; //Can return rental vehicles to 'Store vehicle in garage', doesn't actually store it in garage. /* Vehicle Purchase Prices */ vehicle_purchase_multiplier_CIVILIAN = 1; //Civilian Vehicle Buy Price = Config_Vehicle price * multiplier @@ -212,11 +224,11 @@ class Life_Settings { {"STR_Crime_24","10000","24"}, {"STR_Crime_25","20000","25"} }; - + /* ! --- Do not change --- ! */ - framework_version = "5.0.0"; + framework_version = "6.0.0"; /* ------------------------- */ - + }; #include "Config_Clothing.hpp" @@ -229,4 +241,4 @@ class Life_Settings { #include "Config_Process.hpp" #include "Config_Housing.hpp" #include "Config_Garages.hpp" -#include "Config_Loadouts.hpp" \ No newline at end of file +#include "Config_Loadouts.hpp" diff --git a/Altis_Life.Altis/config/Config_SpyGlass.hpp b/Altis_Life.Altis/config/Config_SpyGlass.hpp index da5676e2f..e19a3dcea 100644 --- a/Altis_Life.Altis/config/Config_SpyGlass.hpp +++ b/Altis_Life.Altis/config/Config_SpyGlass.hpp @@ -244,17 +244,17 @@ class SpyGlass { "life_fnc_adminspectate_meta","life_fnc_adminteleport","life_fnc_adminteleport_meta","life_fnc_admintphere","life_fnc_admintphere_meta","life_fnc_animsync","life_fnc_animsync_meta","life_fnc_arrestaction","life_fnc_arrestaction_meta","life_fnc_atmmenu","life_fnc_atmmenu_meta","life_fnc_bankdeposit","life_fnc_bankdeposit_meta","life_fnc_banktransfer", "life_fnc_banktransfer_meta","life_fnc_bankwithdraw","life_fnc_bankwithdraw_meta","life_fnc_blastingcharge","life_fnc_blastingcharge_meta","life_fnc_boltcutter","life_fnc_boltcutter_meta","life_fnc_bountyreceive","life_fnc_bountyreceive_meta","life_fnc_broadcast","life_fnc_broadcast_meta","life_fnc_buyclothes","life_fnc_buyclothes_meta","life_fnc_buyhouse", "life_fnc_buyhouse_meta","life_fnc_buyhousegarage","life_fnc_buyhousegarage_meta","life_fnc_buylicense","life_fnc_buylicense_meta","life_fnc_calweightdiff","life_fnc_calweightdiff_meta","life_fnc_capturehideout","life_fnc_capturehideout_meta","life_fnc_catchfish","life_fnc_catchfish_meta","life_fnc_catchturtle","life_fnc_catchturtle_meta","life_fnc_cellphone", - "life_fnc_cellphone_meta","life_fnc_checkmap","life_fnc_checkmap_meta","life_fnc_changeclothes","life_fnc_changeclothes_meta","life_fnc_chopshopmenu","life_fnc_chopshopmenu_meta","life_fnc_chopshopselection","life_fnc_chopshopselection_meta","life_fnc_chopshopsell","life_fnc_chopshopsell_meta","life_fnc_chopShopSold","life_fnc_chopShopSold_meta","life_fnc_civmarkers","life_fnc_civmarkers_meta", + "life_fnc_cellphone_meta","life_fnc_checkmap","life_fnc_checkmap_meta","life_fnc_changeclothes","life_fnc_changeclothes_meta","life_fnc_chopshopmenu","life_fnc_chopshopmenu_meta","life_fnc_chopshopselection","life_fnc_chopshopselection_meta","life_fnc_chopshopsell","life_fnc_chopshopsell_meta","life_fnc_chopshopsold","life_fnc_chopshopsold_meta","life_fnc_civmarkers","life_fnc_civmarkers_meta", "life_fnc_clearvehicleammo","life_fnc_clearvehicleammo_meta","life_fnc_clothingfilter","life_fnc_clothingfilter_meta","life_fnc_clothingmenu","life_fnc_clothingmenu_meta","life_fnc_colorvehicle","life_fnc_colorvehicle_meta","life_fnc_containerinvsearch","life_fnc_containerinvsearch_meta","life_fnc_containermenu","life_fnc_containermenu_meta","life_fnc_copbreakdoor", "life_fnc_copbreakdoor_meta","life_fnc_cophouseowner","life_fnc_cophouseowner_meta","life_fnc_copinteractionmenu","life_fnc_copinteractionmenu_meta","life_fnc_coplights","life_fnc_coplights_meta","life_fnc_copmarkers","life_fnc_copmarkers_meta","life_fnc_copsearch","life_fnc_copsearch_meta","life_fnc_copsiren", "life_fnc_copsiren_meta","life_fnc_copsplit","life_fnc_copsplit_meta","life_fnc_corpse","life_fnc_corpse_meta","life_fnc_creategang","life_fnc_creategang_meta","life_fnc_deathscreen","life_fnc_deathscreen_meta","life_fnc_defusekit","life_fnc_defusekit_meta","life_fnc_demochargetimer","life_fnc_demochargetimer_meta","life_fnc_devicemine","life_fnc_devicemine_meta", - "life_fnc_displayhandler","life_fnc_displayhandler_meta","life_fnc_dooranimate","life_fnc_dooranimate_meta","life_fnc_dpfinish","life_fnc_dpfinish_meta","life_fnc_dropfishingnet","life_fnc_dropfishingnet_meta","life_fnc_dropitems","life_fnc_dropitems_meta","life_fnc_escinterupt","life_fnc_escinterupt_meta","life_fnc_escortaction","life_fnc_escortaction_meta", + "life_fnc_displayhandler","life_fnc_displayhandler_meta","life_fnc_dooranimate","life_fnc_dooranimate_meta","life_fnc_dpfinish","life_fnc_dpfinish_meta","life_fnc_dropfishingnet","life_fnc_dropfishingnet_meta","life_fnc_dropitems","life_fnc_dropitems_meta","life_fnc_ongameinterrupt","life_fnc_ongameinterrupt_meta","life_fnc_escortaction","life_fnc_escortaction_meta", "life_fnc_fedcamdisplay","life_fnc_fedcamdisplay_meta","life_fnc_fetchcfgdetails","life_fnc_fetchcfgdetails_meta","life_fnc_fetchdeadgear","life_fnc_fetchdeadgear_meta","life_fnc_fetchvehinfo","life_fnc_fetchvehinfo_meta","life_fnc_flashbang","life_fnc_flashbang_meta","life_fnc_freezeplayer","life_fnc_freezeplayer_meta","life_fnc_fuellbchange","life_fnc_fuellbchange_meta", "life_fnc_fuelrefuelcar","life_fnc_fuelrefuelcar_meta","life_fnc_fuelstatopen","life_fnc_fuelstatopen_meta","life_fnc_fuelstore","life_fnc_fuelstore_meta","life_fnc_fuelsupply","life_fnc_fuelsupply_meta","life_fnc_gangcreated","life_fnc_gangcreated_meta","life_fnc_usegangbank","life_fnc_usegangbank_meta","life_fnc_gangdisband","life_fnc_gangdisband_meta","life_fnc_gangdisbanded", "life_fnc_gangdisbanded_meta","life_fnc_ganginvite","life_fnc_ganginvite_meta","life_fnc_ganginviteplayer","life_fnc_ganginviteplayer_meta","life_fnc_gangkick","life_fnc_gangkick_meta","life_fnc_gangleave","life_fnc_gangleave_meta","life_fnc_gangmenu","life_fnc_gangmenu_meta","life_fnc_gangnewleader","life_fnc_gangnewleader_meta","life_fnc_gangupgrade","life_fnc_gangupgrade_meta", "life_fnc_gangbankresponse","life_fnc_gangbankresponse_meta","life_fnc_garagelbchange","life_fnc_garagelbchange_meta","life_fnc_garagerefund","life_fnc_garagerefund_meta","life_fnc_gather","life_fnc_gather_meta","life_fnc_getbuildingpositions","life_fnc_getbuildingpositions_meta","life_fnc_getdpmission","life_fnc_getdpmission_meta","life_fnc_givediff","life_fnc_givediff_meta","life_fnc_giveitem", "life_fnc_giveitem_meta","life_fnc_givemoney","life_fnc_givemoney_meta","life_fnc_gutanimal","life_fnc_gutanimal_meta","life_fnc_handledamage","life_fnc_handledamage_meta","life_fnc_handleinv","life_fnc_handleinv_meta","life_fnc_handleitem","life_fnc_handleitem_meta","life_fnc_healhospital","life_fnc_healhospital_meta","life_fnc_hideobj","life_fnc_hideobj_meta","life_fnc_houseconfig", - "life_fnc_houseconfig_meta","life_fnc_housemenu","life_fnc_housemenu_meta","life_fnc_hudsetup","life_fnc_hudsetup_meta","life_fnc_hudupdate","life_fnc_hudupdate_meta","life_fnc_impoundaction","life_fnc_impoundaction_meta","life_fnc_impoundmenu","life_fnc_impoundmenu_meta","life_fnc_initciv","life_fnc_initciv_meta","life_fnc_initcop","life_fnc_initcop_meta","life_fnc_initgang", + "life_fnc_houseconfig_meta","life_fnc_housemenu","life_fnc_housemenu_meta","life_fnc_hudupdate","life_fnc_hudupdate_meta","life_fnc_impoundaction","life_fnc_impoundaction_meta","life_fnc_impoundmenu","life_fnc_impoundmenu_meta","life_fnc_initciv","life_fnc_initciv_meta","life_fnc_initcop","life_fnc_initcop_meta","life_fnc_initgang", "life_fnc_initgang_meta","life_fnc_inithouses","life_fnc_inithouses_meta","life_fnc_initmedic","life_fnc_initmedic_meta","life_fnc_inventoryclosed","life_fnc_inventoryclosed_meta","life_fnc_inventoryopened","life_fnc_inventoryopened_meta","life_fnc_isdamaged","life_fnc_isdamaged_meta","life_fnc_isnumeric","life_fnc_isnumeric_meta","life_fnc_isuidactive","life_fnc_isuidactive_meta", "life_fnc_itemweight","life_fnc_itemweight_meta","life_fnc_jail","life_fnc_jail_meta","life_fnc_jailme","life_fnc_jailme_meta","life_fnc_jailsys","life_fnc_jailsys_meta","life_fnc_jerrycanrefuel","life_fnc_jerrycanrefuel_meta","life_fnc_jerryrefuel","life_fnc_jerryrefuel_meta","life_fnc_jumpfnc","life_fnc_jumpfnc_meta","life_fnc_keydrop","life_fnc_keydrop_meta","life_fnc_keygive", "life_fnc_keygive_meta","life_fnc_keyhandler","life_fnc_keyhandler_meta","life_fnc_keymenu","life_fnc_keymenu_meta","life_fnc_knockedout","life_fnc_knockedout_meta","life_fnc_knockoutaction","life_fnc_knockoutaction_meta","life_fnc_levelcheck","life_fnc_levelcheck_meta","life_fnc_licensecheck","life_fnc_licensecheck_meta","life_fnc_licensesread","life_fnc_licensesread_meta","life_fnc_lighthouse", @@ -273,7 +273,7 @@ class SpyGlass { "life_fnc_seizeplayeraction_meta","life_fnc_sellgarage","life_fnc_sellgarage_meta","life_fnc_sellhouse","life_fnc_sellhouse_meta","life_fnc_sellhousegarage","life_fnc_sellhousegarage_meta","life_fnc_servicechopper","life_fnc_servicechopper_meta","life_fnc_setfuel","life_fnc_setfuel_meta","life_fnc_setmapposition","life_fnc_setmapposition_meta","life_fnc_settexture_meta","life_fnc_settingsmenu", "life_fnc_settingsmenu_meta","life_fnc_setupactions","life_fnc_setupactions_meta","life_fnc_setupevh","life_fnc_setupevh_meta","life_fnc_simdisable","life_fnc_simdisable_meta","life_fnc_sirenlights","life_fnc_sirenlights_meta","life_fnc_sounddevice","life_fnc_sounddevice_meta","life_fnc_spawnconfirm","life_fnc_spawnconfirm_meta","life_fnc_spawnmenu","life_fnc_spawnmenu_meta","life_fnc_spawnpointcfg", "life_fnc_spawnpointcfg_meta","life_fnc_spawnpointselected","life_fnc_spawnpointselected_meta","life_fnc_spikestrip","life_fnc_spikestrip_meta","life_fnc_spikestripeffect","life_fnc_spikestripeffect_meta","life_fnc_stopescorting","life_fnc_stopescorting_meta","life_fnc_storagebox","life_fnc_storagebox_meta","life_fnc_storevehicle","life_fnc_storevehicle_meta","life_fnc_storevehicleaction", - "life_fnc_storevehicleaction_meta","life_fnc_startLoadout","life_fnc_startLoadout_meta","life_fnc_stripdownplayer","life_fnc_stripdownplayer_meta","life_fnc_surrender","life_fnc_surrender_meta","life_fnc_survival","life_fnc_survival_meta","life_fnc_tazed","life_fnc_tazed_meta","life_fnc_teleport","life_fnc_teleport_meta","life_fnc_ticketaction","life_fnc_ticketaction_meta","life_fnc_ticketgive", + "life_fnc_storevehicleaction_meta","life_fnc_startloadout","life_fnc_startloadout_meta","life_fnc_stripdownplayer","life_fnc_stripdownplayer_meta","life_fnc_surrender","life_fnc_surrender_meta","life_fnc_survival","life_fnc_survival_meta","life_fnc_tazed","life_fnc_tazed_meta","life_fnc_teleport","life_fnc_teleport_meta","life_fnc_ticketaction","life_fnc_ticketaction_meta","life_fnc_ticketgive", "life_fnc_ticketgive_meta","life_fnc_ticketpaid","life_fnc_ticketpaid_meta","life_fnc_ticketpay","life_fnc_ticketpay_meta","life_fnc_ticketprompt","life_fnc_ticketprompt_meta","life_fnc_unimpound","life_fnc_unimpound_meta","life_fnc_unrestrain","life_fnc_unrestrain_meta","life_fnc_updateviewdistance","life_fnc_updateviewdistance_meta","life_fnc_useitem","life_fnc_useitem_meta", "life_fnc_vehicleanimate","life_fnc_vehicleanimate_meta","life_fnc_vehiclecolor3drefresh","life_fnc_vehiclecolor3drefresh_meta","life_fnc_vehiclecolorcfg","life_fnc_vehiclecolorcfg_meta","life_fnc_vehiclecolorstr","life_fnc_vehiclecolorstr_meta","life_fnc_vehiclegarage","life_fnc_vehiclegarage_meta","life_fnc_vehiclelistcfg","life_fnc_vehiclelistcfg_meta","life_fnc_vehicleowners", "life_fnc_vehicleowners_meta","life_fnc_3dpreviewdisplay","life_fnc_3dpreviewdisplay_meta","life_fnc_vehicleshopbuy","life_fnc_vehicleshopbuy_meta","life_fnc_3dpreviewexit","life_fnc_3dpreviewexit_meta","life_fnc_3dpreviewinit","life_fnc_3dpreviewinit_meta","life_fnc_vehicleshoplbchange","life_fnc_vehicleshoplbchange_meta", @@ -281,16 +281,16 @@ class SpyGlass { "life_fnc_vehtakeitem","life_fnc_vehtakeitem_meta","life_fnc_vinteractionmenu","life_fnc_vinteractionmenu_meta","life_fnc_virt_buy","life_fnc_virt_buy_meta","life_fnc_virt_menu","life_fnc_virt_menu_meta","life_fnc_virt_sell","life_fnc_virt_sell_meta","life_fnc_virt_update","life_fnc_virt_update_meta","life_fnc_wantedadd","life_fnc_wantedadd_meta","life_fnc_wantedaddp","life_fnc_wantedaddp_meta", "life_fnc_wantedbounty","life_fnc_wantedbounty_meta","life_fnc_wantedfetch","life_fnc_wantedfetch_meta","life_fnc_wantedgrab","life_fnc_wantedgrab_meta","life_fnc_wantedinfo","life_fnc_wantedinfo_meta","life_fnc_wantedlist","life_fnc_wantedlist_meta","life_fnc_wantedmenu","life_fnc_wantedmenu_meta","life_fnc_wantedperson","life_fnc_wantedperson_meta","life_fnc_wantedpunish","life_fnc_wantedpunish_meta", "life_fnc_wantedremove","life_fnc_wantedremove_meta","life_fnc_wantedticket","life_fnc_wantedticket_meta","life_fnc_weaponshopaccs","life_fnc_weaponshopaccs_meta","life_fnc_weaponshopbuysell","life_fnc_weaponshopbuysell_meta","life_fnc_weaponshopcfg","life_fnc_weaponshopcfg_meta","life_fnc_weaponshopfilter","life_fnc_weaponshopfilter_meta","life_fnc_weaponshopmags","life_fnc_weaponshopmags_meta", - "life_fnc_weaponshopmenu","life_fnc_weaponshopmenu_meta","life_fnc_weaponshopselection","life_fnc_weaponshopselection_meta","life_fnc_welcomenotification","life_fnc_welcomenotification_meta","life_fnc_whereami","life_fnc_whereami_meta","life_fnc_wiretransfer","life_fnc_wiretransfer_meta" + "life_fnc_weaponshopmenu","life_fnc_weaponshopmenu_meta","life_fnc_weaponshopselection","life_fnc_weaponshopselection_meta","life_fnc_welcomenotification","life_fnc_welcomenotification_meta","life_fnc_whereami","life_fnc_whereami_meta","life_fnc_wiretransfer","life_fnc_wiretransfer_meta","life_fnc_getinman", "life_fnc_getinman_meta","life_fnc_getoutman", "life_fnc_getoutman_meta" }; SERVER_Functions[] = { - "db_fnc_asynccall","db_fnc_bool","db_fnc_insertrequest","db_fnc_insertvehicle","db_fnc_mresarray","db_fnc_mresstring","db_fnc_mrestoarray","db_fnc_numbersafe","db_fnc_queryrequest","db_fnc_updatepartial","db_fnc_updaterequest","ton_fnc_addhouse","ton_fnc_addhouse_meta","ton_fnc_cell_adminmsg","ton_fnc_cell_adminmsgall","ton_fnc_cell_emsrequest","ton_fnc_cell_textadmin","ton_fnc_cell_textcop", - "ton_fnc_cell_textmsg","ton_fnc_chopshopsell","ton_fnc_chopshopsell_meta","ton_fnc_cleanup","ton_fnc_cleanup_meta","ton_fnc_cleanuprequest","ton_fnc_cleanuprequest_meta","ton_fnc_clientdisconnect","ton_fnc_clientdisconnect_meta","ton_fnc_clientgangkick","ton_fnc_clientgangleader","ton_fnc_clientgangleft","TON_fnc_clientGangLeft","ton_fnc_clientgetkey","ton_fnc_clientmessage","ton_fnc_federalupdate", - "ton_fnc_federalupdate_meta","ton_fnc_fetchplayerhouses","ton_fnc_fetchplayerhouses_meta","ton_fnc_getid","ton_fnc_getid_meta","ton_fnc_getvehicles","ton_fnc_getvehicles_meta","ton_fnc_housecleanup","ton_fnc_housecleanup_meta","ton_fnc_huntingzone","ton_fnc_huntingzone_meta","ton_fnc_index","ton_fnc_inithouses","ton_fnc_inithouses_meta","ton_fnc_insertgang","ton_fnc_insertgang_meta","ton_fnc_isnumber", - "ton_fnc_keymanagement","ton_fnc_keymanagement_meta","ton_fnc_managesc","ton_fnc_managesc_meta","ton_fnc_pickupaction","ton_fnc_pickupaction_meta","ton_fnc_player_query","ton_fnc_queryplayergang","ton_fnc_queryplayergang_meta","ton_fnc_removegang","ton_fnc_removegang_meta","ton_fnc_sellhouse","ton_fnc_sellhouse_meta","ton_fnc_spawnvehicle", - "ton_fnc_spawnvehicle_meta","ton_fnc_spikestrip","ton_fnc_spikestrip_meta","ton_fnc_terrainsort","ton_fnc_terrainsort_meta","ton_fnc_updategang","ton_fnc_updategang_meta","ton_fnc_updatehousecontainers","ton_fnc_updatehousecontainers_meta","ton_fnc_updatehousetrunk","ton_fnc_updatehousetrunk_meta","ton_fnc_vehiclecreate","ton_fnc_vehiclecreate_meta","ton_fnc_vehicledead","ton_fnc_vehicledead_meta", - "ton_fnc_vehicledelete","ton_fnc_vehicledelete_meta","ton_fnc_vehiclestore","ton_fnc_vehiclestore_meta","ton_fnc_entityRespawned","ton_fnc_entityRespawned_meta" + "db_fnc_asynccall","db_fnc_bool","db_fnc_insertrequest","db_fnc_insertvehicle","db_fnc_mresarray","db_fnc_mresstring","db_fnc_mrestoarray","db_fnc_numbersafe","db_fnc_queryrequest","db_fnc_updatepartial","db_fnc_updaterequest","ton_fnc_addhouse","ton_fnc_addhouse_meta","life_fnc_sendmessage","life_fnc_sendmessage_meta", + "ton_fnc_chopshopsell","ton_fnc_chopshopsell_meta","ton_fnc_cleanup","ton_fnc_cleanup_meta","ton_fnc_cleanuprequest","ton_fnc_cleanuprequest_meta","ton_fnc_clientdisconnect","ton_fnc_clientdisconnect_meta","life_fnc_clientGangKick","life_fnc_clientGangLeader","life_fnc_clientGangLeft","life_fnc_clientGangLeft","ton_fnc_clientgetkey","life_fnc_clientmessage", + "ton_fnc_fetchplayerhouses","ton_fnc_fetchplayerhouses_meta","ton_fnc_getid","ton_fnc_getid_meta","ton_fnc_getvehicles","ton_fnc_getvehicles_meta","ton_fnc_housecleanup","ton_fnc_housecleanup_meta","ton_fnc_huntingzone","ton_fnc_huntingzone_meta","life_util_fnc_index","ton_fnc_inithouses","ton_fnc_inithouses_meta","ton_fnc_insertgang","ton_fnc_insertgang_meta","life_util_fnc_isnumber", + "ton_fnc_keymanagement","ton_fnc_keymanagement_meta","ton_fnc_managesc","ton_fnc_managesc_meta","ton_fnc_pickupaction","ton_fnc_pickupaction_meta","life_util_fnc_playerquery","ton_fnc_queryplayergang","ton_fnc_queryplayergang_meta","ton_fnc_removegang","ton_fnc_removegang_meta","ton_fnc_sellhouse","ton_fnc_sellhouse_meta","ton_fnc_spawnvehicle", + "ton_fnc_spawnvehicle_meta","ton_fnc_spikestrip","ton_fnc_spikestrip_meta","life_util_fnc_terrainsort","life_util_fnc_terrainsort_meta","ton_fnc_updategang","ton_fnc_updategang_meta","ton_fnc_updatehousecontainers","ton_fnc_updatehousecontainers_meta","ton_fnc_updatehousetrunk","ton_fnc_updatehousetrunk_meta","ton_fnc_vehiclecreate","ton_fnc_vehiclecreate_meta","ton_fnc_vehicledead","ton_fnc_vehicledead_meta", + "ton_fnc_vehicledelete","ton_fnc_vehicledelete_meta","ton_fnc_vehiclestore","ton_fnc_vehiclestore_meta","ton_fnc_entityrespawned","ton_fnc_entityrespawned_meta" }; SOCK_Functions[] = { @@ -323,7 +323,7 @@ class SpyGlass { { "luce_1", "SCRIPT" }, { "life_bail_amount", "SCALAR" }, { "life_canpay_bail", "BOOL" }, { "hc_life", "SCALAR" }, { "life_fnc_requestclientid", "OBJECT" }, { "life_hc_isactive", "BOOL" }, { "ton_fnc_playtime_values", "ARRAY" }, { "ton_fnc_playtime_values_request", "ARRAY" }, { "hc_1", "OBJECT" }, { "hc_life", "BOOL" }, { "rscdisplaympinterrupt_respawntime", "SCALAR" }, { "bis_dynamictext_spawn_8", "SCRIPT" }, { "life_my_gang", "OBJECT" }, {"am_exit","SCALAR"}, { "life_garage_sp", "ARRAY" }, { "life_garage_sp", "STRING" }, { "0", "ARRAY" }, { "life_oldvestitems", "ARRAY" }, { "life_shop_cam", "OBJECT" }, { "life_oldclothes", "STRING" }, { "life_cmenu_lock", "BOOL" }, { "life_oldhat", "STRING" }, { "life_oldvest", "STRING" }, { "life_oldglasses", "STRING" }, { "life_oldbackpackitems","ARRAY"}, {"life_oldbackpack","STRING"}, { "rscnotification_data", "ARRAY" }, { "life_curwep_h", "STRING" }, { "carshop_lux_1", "OBJECT" }, { "life_olduniformitems", "ARRAY" }, { "bis_fnc_setvehiclemass_fsm", "SCALAR" }, { "life_3dPreview_light", "OBJECT" }, { "life_3dPreview_camera", "OBJECT" }, { "life_3dPreview_object", "OBJECT" }, - { "life_pos_attach", "ARRAY" }, { "life_inv_", "SCALAR" }, { "life_markers", "BOOL" }, { "life_markers_active", "BOOL" }, { "life_frozen", "BOOL" }, { "life_settings_revealobjects", "BOOL" }, { "life_inv_rooster", "SCALAR" }, { "station_shop_09", "OBJECT" }, { "station_shop_08", "OBJECT" }, { "station_shop_07", "OBJECT" }, { "station_shop_06", "OBJECT" }, { "station_shop_04", "OBJECT" }, { "life_disable_getout", "BOOL" }, + { "life_pos_attach", "ARRAY" }, { "life_inv_", "SCALAR" }, { "life_markers", "BOOL" }, { "life_markers_active", "BOOL" }, { "life_frozen", "BOOL" }, { "life_inv_rooster", "SCALAR" }, { "station_shop_09", "OBJECT" }, { "station_shop_08", "OBJECT" }, { "station_shop_07", "OBJECT" }, { "station_shop_06", "OBJECT" }, { "station_shop_04", "OBJECT" }, { "life_disable_getout", "BOOL" }, { "bis_taskenhancements_3d", "BOOL" }, { "life_settings_enablenewsbroadcast", "BOOL" }, { "life_settings_enablesidechannel", "BOOL" }, { "life_isknocked", "BOOL" }, { "life_settings_viewdistancecar", "SCALAR" }, { "life_save_gear", "ARRAY" }, { "life_settings_viewdistanceair", "SCALAR" }, { "life_disable_getin", "BOOL" }, { "life_god", "BOOL" }, { "station_shop_3", "OBJECT" }, { "station_shop_2", "OBJECT" }, { "station_shop_1", "OBJECT" }, { "station_shop_24", "OBJECT" }, { "station_shop_23", "OBJECT" }, { "station_shop_22", "OBJECT" }, { "station_shop_21", "OBJECT" }, { "station_shop_20", "OBJECT" }, { "life_settings_viewdistancefoot", "SCALAR" }, { "life_settings_tagson", "BOOL" }, { "station_shop_19", "OBJECT" }, { "bis_taskenhancements_enable", "BOOL" }, { "station_shop_18", "OBJECT" }, { "station_shop_17", "OBJECT" }, { "life_container_activeobj", "OBJECT" }, { "station_shop_16", "OBJECT" }, { "station_shop_15", "OBJECT" }, { "station_shop_14", "OBJECT" }, { "station_shop_13", "OBJECT" }, { "station_shop_12", "OBJECT" }, { "station_shop_11", "OBJECT" }, { "station_shop_10", "OBJECT" }, { "life_progress", "DISPLAY" }, { "life_veh_shop", "ARRAY" }, { "bis_fnc_feedback_deltadamage", "SCALAR" }, { "life_clothing_store", "STRING" }, @@ -351,7 +351,7 @@ class SpyGlass { { "db_async_active", "BOOL" }, { "life_removewanted", "BOOL" }, { "life_redgull_effect", "SCALAR" }, { "life_id_playertags", "STRING" }, { "life_delivery_in_progress", "BOOL" }, { "life_inv_ornate", "SCALAR" }, { "fed_bank", "OBJECT" }, { "bis_uncblur", "SCALAR" }, { "life_inv_tunaraw", "SCALAR" }, { "license_civ_medmarijuana", "BOOL" }, { "life_inv_mullet", "SCALAR" }, { "life_vdair", "SCALAR" }, { "life_inv_diamondcut", "SCALAR" }, { "bis_suffblur", "SCALAR" }, { "license_civ_salt", "BOOL" }, { "life_carryweight", "SCALAR" }, { "life_server_isready", "BOOL" }, { "hq_lt_1", "OBJECT" }, { "life_inv_catsharkraw", "SCALAR" }, { "heroin_processor", "OBJECT" }, { "life_respawn_timer", "SCALAR" }, { "carshop1_2", "OBJECT" }, { "hq_desk_1", "OBJECT" }, { "carshop1_3", "OBJECT" }, { "bis_blendcoloralpha", "SCALAR" }, { "life_vdcar", "SCALAR" }, { "db_async_extralock", "BOOL" }, { "life_clothing_purchase", "ARRAY" }, { "license_civ_driver", "BOOL" }, { "license_civ_ggst1", "BOOL" }, { "license_civ_ggst2", "BOOL" }, { "license_civ_ggst3", "BOOL" }, { "vhe_fnc_grua", "CODE" }, { "vhe_fnc_initgrua", "CODE" }, { "vhe_fnc_sirenasems", "CODE" }, { "vhe_fnc_sirenas", "CODE" }, { "reb_1_4", "OBJECT" }, - { "ggs_shop", "OBJECT" }, { "reb_helicopter_1", "OBJECT" }, { "reb_helicopter_2", "OBJECT" }, { "life_inv_spikestrip", "SCALAR" }, { "license_civ_heroin", "BOOL" }, { "life_inv_waterbottle", "SCALAR" }, { "bis_oldlifestate", "STRING" }, { "life_inv_ornateraw", "SCALAR" }, { "life_id_revealobjects", "STRING" }, { "h1_3", "OBJECT" }, { "bis_pp_burnparams", "ARRAY" }, + { "ggs_shop", "OBJECT" }, { "reb_helicopter_1", "OBJECT" }, { "reb_helicopter_2", "OBJECT" }, { "life_inv_spikestrip", "SCALAR" }, { "license_civ_heroin", "BOOL" }, { "life_inv_waterbottle", "SCALAR" }, { "bis_oldlifestate", "STRING" }, { "life_inv_ornateraw", "SCALAR" }, { "life_id_revealobjects", "SCALAR" }, { "life_id_playertags", "SCALAR" }, { "h1_3", "OBJECT" }, { "bis_pp_burnparams", "ARRAY" }, { "life_session_completed", "BOOL" }, { "license_civ_gun", "BOOL" }, { "license_cop_cair", "BOOL" }, { "bis_stackedeventhandlers_oneachframe", "ARRAY" }, { "bis_teamswitched", "BOOL" }, { "life_inv_rabbitraw", "SCALAR" }, { "life_inv_defibrillator", "SCALAR" }, { "life_inv_toolkit", "SCALAR" }, { "life_gear", "ARRAY" }, { "life_istazed", "BOOL" }, { "life_net_dropped", "BOOL"}, { "life_shop_npc", "OBJECT" }, { "life_shop_type", "STRING" }, { "life_deathcamera", "OBJECT" }, { "life_corpse", "OBJECT" }, { "life_admin_debug", "BOOL" }, { "bis_fnc_camera_target", "OBJECT" }, { "bis_fnc_camera_cam", "OBJECT" }, { "bis_fnc_camera_acctime", "SCALAR" }, { "bis_fnc_shownotification_process", "SCRIPT" }, { "bis_fnc_shownotification_counter", "SCALAR" }, { "bis_fnc_shownotification_queue", "ARRAY" }, { "life_action_spikestrippickup", "SCALAR" }, { "life_container_active", "BOOL" }, { "life_cur_task", "TASK" }, { "life_cur_task", "OBJECT" }, { "life_enablenewsbroadcast", "BOOL" }, { "life_enablesidechannel", "BOOL" }, { "life_fed_scam", "OBJECT" }, { "life_coprecieve", "OBJECT" }, { "life_chopshop", "STRING" }, {"life_civ_position","ARRAY"}, {"life_is_alive","BOOL"}, {"finishedloop","BOOL"}, {"life_fnc_wantedcrimes","CODE"}, diff --git a/Altis_Life.Altis/core/actions/fn_arrestAction.sqf b/Altis_Life.Altis/core/actions/fn_arrestAction.sqf index d246d2370..97935ed73 100644 --- a/Altis_Life.Altis/core/actions/fn_arrestAction.sqf +++ b/Altis_Life.Altis/core/actions/fn_arrestAction.sqf @@ -1,36 +1,34 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_arrestAction.sqf - Author: - - Description: - Arrests the targeted person. -*/ -private ["_unit","_id"]; -_unit = param [0,objNull,[objNull]]; -if (isNull _unit) exitWith {}; //Not valid -if (isNil "_unit") exitWith {}; //Not Valid -if (!(_unit isKindOf "CAManBase")) exitWith {}; //Not a unit -if (!isPlayer _unit) exitWith {}; //Not a human -if (!(_unit getVariable "restrained")) exitWith {}; //He's not restrained. -if (!((side _unit) in [civilian,independent])) exitWith {}; //Not a civ - -if (life_HC_isActive) then { - [getPlayerUID _unit,_unit,player,false] remoteExecCall ["HC_fnc_wantedBounty",HC_Life]; -} else { - [getPlayerUID _unit,_unit,player,false] remoteExecCall ["life_fnc_wantedBounty",RSERV]; -}; - -if (isNull _unit) exitWith {}; //Not valid -detach _unit; -[_unit,false] remoteExecCall ["life_fnc_jail",_unit]; -[0,"STR_NOTF_Arrested_1",true, [_unit getVariable ["realname",name _unit], profileName]] remoteExecCall ["life_fnc_broadcast",RCLIENT]; - -if (LIFE_SETTINGS(getNumber,"player_advancedLog") isEqualTo 1) then { - if (LIFE_SETTINGS(getNumber,"battlEye_friendlyLogging") isEqualTo 1) then { - advanced_log = format [localize "STR_DL_AL_Arrested_BEF",_unit getVariable ["realname",name _unit]]; - } else { - advanced_log = format [localize "STR_DL_AL_Arrested",profileName,(getPlayerUID player),_unit getVariable ["realname",name _unit]]; - }; - publicVariableServer "advanced_log"; -}; +#include "..\..\script_macros.hpp" +/* + File: fn_arrestAction.sqf + Author: + + Description: + Arrests the targeted person. +*/ +params [ + ["_unit", objNull, [objNull]] +]; + +if (isNull _unit || {!isPlayer _unit}) exitWith {}; //Not valid +if !(_unit getVariable "restrained") exitWith {}; //He's not restrained. +if !((side _unit) in [civilian,independent]) exitWith {}; //Not a civ + +if (life_HC_isActive) then { + [getPlayerUID _unit,_unit,player,false] remoteExecCall ["HC_fnc_wantedBounty",HC_Life]; +} else { + [getPlayerUID _unit,_unit,player,false] remoteExecCall ["life_fnc_wantedBounty",RSERV]; +}; + +detach _unit; +[_unit,false] remoteExecCall ["life_fnc_jail",_unit]; +[0,"STR_NOTF_Arrested_1",true, [_unit getVariable ["realname",name _unit], profileName]] remoteExecCall ["life_fnc_broadcast",RCLIENT]; + +if (LIFE_SETTINGS(getNumber,"player_advancedLog") isEqualTo 1) then { + if (LIFE_SETTINGS(getNumber,"battlEye_friendlyLogging") isEqualTo 1) then { + advanced_log = format [localize "STR_DL_AL_Arrested_BEF",_unit getVariable ["realname",name _unit]]; + } else { + advanced_log = format [localize "STR_DL_AL_Arrested",profileName,(getPlayerUID player),_unit getVariable ["realname",name _unit]]; + }; + publicVariableServer "advanced_log"; +}; diff --git a/Altis_Life.Altis/core/actions/fn_buyLicense.sqf b/Altis_Life.Altis/core/actions/fn_buyLicense.sqf index 744bcc5ff..f3924ff6e 100644 --- a/Altis_Life.Altis/core/actions/fn_buyLicense.sqf +++ b/Altis_Life.Altis/core/actions/fn_buyLicense.sqf @@ -6,14 +6,13 @@ Description: Called when purchasing a license. May need to be revised. */ -private ["_type","_varName","_displayName","_sideFlag","_price"]; -_type = _this select 3; +params ["", "", "", "_type"]; if (!isClass (missionConfigFile >> "Licenses" >> _type)) exitWith {}; //Bad entry? -_displayName = M_CONFIG(getText,"Licenses",_type,"displayName"); -_price = M_CONFIG(getNumber,"Licenses",_type,"price"); -_sideFlag = M_CONFIG(getText,"Licenses",_type,"side"); -_varName = LICENSE_VARNAME(_type,_sideFlag); +private _displayName = M_CONFIG(getText,"Licenses",_type,"displayName"); +private _price = M_CONFIG(getNumber,"Licenses",_type,"price"); +private _sideFlag = M_CONFIG(getText,"Licenses",_type,"side"); +private _varName = LICENSE_VARNAME(_type,_sideFlag); if (CASH < _price) exitWith {hint format [localize "STR_NOTF_NE_1",[_price] call life_fnc_numberText,localize _displayName];}; CASH = CASH - _price; diff --git a/Altis_Life.Altis/core/actions/fn_captureHideout.sqf b/Altis_Life.Altis/core/actions/fn_captureHideout.sqf index f3e630208..820a98a62 100644 --- a/Altis_Life.Altis/core/actions/fn_captureHideout.sqf +++ b/Altis_Life.Altis/core/actions/fn_captureHideout.sqf @@ -9,13 +9,13 @@ private _altisArray = ["Land_u_Barracks_V2_F","Land_i_Barracks_V2_F"]; private _tanoaArray = ["Land_School_01_F","Land_Warehouse_03_F","Land_House_Small_02_F"]; -private _hideoutObjs = [[["Altis", _altisArray], ["Tanoa", _tanoaArray]]] call TON_fnc_terrainSort; +private _hideoutObjs = [[["Altis", _altisArray], ["Tanoa", _tanoaArray]]] call life_util_fnc_terrainSort; private _hideout = (nearestObjects[getPosATL player,_hideoutObjs,25]) select 0; private _group = _hideout getVariable ["gangOwner",grpNull]; if (isNil {group player getVariable "gang_name"}) exitWith {titleText[localize "STR_GNOTF_CreateGang","PLAIN"];}; -if (_group == group player) exitWith {titleText[localize "STR_GNOTF_Controlled","PLAIN"]}; +if (_group isEqualTo group player) exitWith {titleText[localize "STR_GNOTF_Controlled","PLAIN"]}; if ((_hideout getVariable ["inCapture",false])) exitWith {hint localize "STR_GNOTF_onePersonAtATime";}; private "_action"; @@ -80,7 +80,7 @@ if (life_interrupted) exitWith {life_interrupted = false; titleText[localize "ST life_action_inUse = false; titleText[localize "STR_GNOTF_Captured","PLAIN"]; -private _flagTexture = [ +private _flagTexture = selectRandom [ "\A3\Data_F\Flags\Flag_red_CO.paa", "\A3\Data_F\Flags\Flag_green_CO.paa", "\A3\Data_F\Flags\Flag_blue_CO.paa", @@ -89,7 +89,7 @@ private _flagTexture = [ "\A3\Data_F\Flags\flag_fd_green_CO.paa", "\A3\Data_F\Flags\flag_fd_blue_CO.paa", "\A3\Data_F\Flags\flag_fd_orange_CO.paa" - ] call BIS_fnc_selectRandom; + ]; _this select 0 setFlagTexture _flagTexture; [[0,1],"STR_GNOTF_CaptureSuccess",true,[name player,(group player) getVariable "gang_name"]] remoteExecCall ["life_fnc_broadcast",RCLIENT]; _hideout setVariable ["inCapture",false,true]; diff --git a/Altis_Life.Altis/core/actions/fn_catchFish.sqf b/Altis_Life.Altis/core/actions/fn_catchFish.sqf index f03e7c025..20df700d4 100644 --- a/Altis_Life.Altis/core/actions/fn_catchFish.sqf +++ b/Altis_Life.Altis/core/actions/fn_catchFish.sqf @@ -1,30 +1,43 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_catchFish.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Catches a fish that is near by. -*/ -private ["_fish","_type","_typeName"]; -_fish = [_this,0,objNull,[objNull]] call BIS_fnc_param; -if (isNull _fish) exitWith {}; //Object passed is null? -if (player distance _fish > 3.5) exitWith {}; - -switch (true) do { - case ((typeOf _fish) isEqualTo "Salema_F"): {_typeName = localize "STR_ANIM_Salema"; _type = "salema_raw";}; - case ((typeOf _fish) isEqualTo "Ornate_random_F") : {_typeName = localize "STR_ANIM_Ornate"; _type = "ornate_raw";}; - case ((typeOf _fish) isEqualTo "Mackerel_F") : {_typeName = localize "STR_ANIM_Mackerel"; _type = "mackerel_raw";}; - case ((typeOf _fish) isEqualTo "Tuna_F") : {_typeName = localize "STR_ANIM_Tuna"; _type = "tuna_raw";}; - case ((typeOf _fish) isEqualTo "Mullet_F") : {_typeName = localize "STR_ANIM_Mullet"; _type = "mullet_raw";}; - case ((typeOf _fish) isEqualTo "CatShark_F") : {_typeName = localize "STR_ANIM_Catshark"; _type = "catshark_raw";}; - case ((typeOf _fish) isEqualTo "Turtle_F") : {_typeName = localize "STR_ANIM_Turtle"; _type = "turtle_raw";}; - default {_type = ""}; -}; - -if (_type isEqualTo "") exitWith {}; //Couldn't get a type - -if ([true,_type,1] call life_fnc_handleInv) then { - deleteVehicle _fish; - titleText[format [(localize "STR_NOTF_Fishing"),_typeName],"PLAIN"]; -}; \ No newline at end of file +#include "..\..\script_macros.hpp" +/* + File: fn_catchFish.sqf + Author: Bryan "Tonic" Boardwine + + Description: + Catches a fish that is near by. +*/ +params [ + ["_fish", objNull, [objNull]] +]; + +//--- Fish is null or distance to fish is more than 3.5 metres +if (isNull _fish || {player distance _fish > 3.5}) exitWith {}; + +//--- Set Fish Information +private _fishInfo = switch typeOf _fish do { + case "Salema_F": {["STR_ANIM_Salema", "salema_raw"]}; + case "Ornate_random_F": {["STR_ANIM_Ornate", "ornate_raw"]}; + case "Mackerel_F": {["STR_ANIM_Mackerel", "mackerel_raw"]}; + case "Tuna_F": {["STR_ANIM_Tuna", "tuna_raw"]}; + case "Mullet_F": {["STR_ANIM_Mullet", "mullet_raw"]}; + case "CatShark_F": {["STR_ANIM_Catshark", "catshark_raw"]}; + case "Turtle_F": {["STR_ANIM_Turtle", "turtle_raw"]}; + default {["", ""]}; +}; + +//--- Sort out array +_fishInfo params ["_fishName", "_fishType"]; + +//--- No fishtype +if (_fishType isEqualTo "") exitWith {}; //Couldn't get a type + +//--- Localize name of fish +private _fishName = localize _fishName; + +//--- Add fish into inventory +if ([true,_type,1] call life_fnc_handleInv) then { + //--- Delete fish in water + deleteVehicle _fish; + + titleText [format [localize "STR_NOTF_Fishing", _fishName], "PLAIN"]; +}; diff --git a/Altis_Life.Altis/core/actions/fn_dpFinish.sqf b/Altis_Life.Altis/core/actions/fn_dpFinish.sqf index 54c4327f5..758799330 100644 --- a/Altis_Life.Altis/core/actions/fn_dpFinish.sqf +++ b/Altis_Life.Altis/core/actions/fn_dpFinish.sqf @@ -1,21 +1,23 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_dpFinish.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Finishes the DP Mission and calculates the money earned based - on distance between A->B -*/ -private ["_dp","_dis","_price"]; -_dp = [_this,0,objNull,[objNull]] call BIS_fnc_param; -life_delivery_in_progress = false; -life_dp_point = nil; -_dis = round((getPos life_dp_start) distance (getPos _dp)); -_price = round(1.7 * _dis); - -["DeliverySucceeded",[format [(localize "STR_NOTF_Earned_1"),[_price] call life_fnc_numberText]]] call bis_fnc_showNotification; -life_cur_task setTaskState "Succeeded"; -player removeSimpleTask life_cur_task; -CASH = CASH + _price; -[0] call SOCK_fnc_updatePartial; \ No newline at end of file +#include "..\..\script_macros.hpp" +/* + File: fn_dpFinish.sqf + Author: Bryan "Tonic" Boardwine + + Description: + Finishes the DP Mission and calculates the money earned based + on distance between A->B +*/ +params [ + ["_dp", objNull, [objNull]] +]; + +life_delivery_in_progress = false; +life_dp_point = nil; +private _dis = round((getPosATL life_dp_start) distance (getPosATL _dp)); +private _price = round(1.7 * _dis); + +["DeliverySucceeded",[format [(localize "STR_NOTF_Earned_1"),[_price] call life_fnc_numberText]]] call bis_fnc_showNotification; +life_cur_task setTaskState "Succeeded"; +player removeSimpleTask life_cur_task; +CASH = CASH + _price; +[0] call SOCK_fnc_updatePartial; diff --git a/Altis_Life.Altis/core/actions/fn_dropFishingNet.sqf b/Altis_Life.Altis/core/actions/fn_dropFishingNet.sqf index 7746eb82d..9a86decdb 100644 --- a/Altis_Life.Altis/core/actions/fn_dropFishingNet.sqf +++ b/Altis_Life.Altis/core/actions/fn_dropFishingNet.sqf @@ -5,33 +5,41 @@ Description: Drops a virtual fishing net from the boat. */ -private ["_fish","_type","_typeName"]; -if (!(vehicle player isKindOf "Ship")) exitWith {}; -_fish = (nearestObjects[getPos vehicle player,["Fish_Base_F"],20]); +private _vehicle = vehicle player; +if !(_vehicle isKindOf "Ship") exitWith {}; +private _fish = nearestObjects[getPosASL _vehicle,["Fish_Base_F"],20]; life_net_dropped = true; titleText[localize "STR_NOTF_NetDrop","PLAIN"]; sleep 5; -if (_fish isEqualTo []) exitWith {titleText[localize "STR_NOTF_NetDropFail","PLAIN"]; life_net_dropped = false;}; +if (_fish isEqualTo []) exitWith { + titleText[localize "STR_NOTF_NetDropFail","PLAIN"]; + life_net_dropped = false; +}; + { if (_x isKindOf "Fish_Base_F") then { - switch (true) do { - case ((typeOf _x) isEqualTo "Salema_F"): {_typeName = localize "STR_ANIM_Salema"; _type = "salema_raw";}; - case ((typeOf _x) isEqualTo "Ornate_random_F") : {_typeName = localize "STR_ANIM_Ornate"; _type = "ornate_raw";}; - case ((typeOf _x) isEqualTo "Mackerel_F") : {_typeName = localize "STR_ANIM_Mackerel"; _type = "mackerel_raw";}; - case ((typeOf _x) isEqualTo "Tuna_F") : {_typeName = localize "STR_ANIM_Tuna"; _type = "tuna_raw";}; - case ((typeOf _x) isEqualTo "Mullet_F") : {_typeName = localize "STR_ANIM_Mullet"; _type = "mullet_raw";}; - case ((typeOf _x) isEqualTo "CatShark_F") : {_typeName = localize "STR_ANIM_Catshark"; _type = "catshark_raw";}; - default {_type = "";}; + private _fishInfo = switch (typeOf _x) do { + case "Salema_F": {["STR_ANIM_Salema", "salema_raw"]}; + case "Ornate_random_F": {["STR_ANIM_Ornate", "ornate_raw"]}; + case "Mackerel_F": {["STR_ANIM_Mackerel", "mackerel_raw"]}; + case "Tuna_F": {["STR_ANIM_Tuna", "tuna_raw"]}; + case "Mullet_F": {["STR_ANIM_Mullet", "mullet_raw"]}; + case "CatShark_F": {["STR_ANIM_Catshark", "catshark_raw"]}; + default {["", ""]}; }; + _fishInfo params ["_fishName", "_fishType"]; + _fishName = localize _fishName; + sleep 3; - if ([true,_type,1] call life_fnc_handleInv) then { + if ([true, _fishType, 1] call life_fnc_handleInv) then { deleteVehicle _x; - titleText[format [(localize "STR_NOTF_Fishing"),_typeName],"PLAIN"]; + titleText[format [(localize "STR_NOTF_Fishing"),_fishName],"PLAIN"]; }; }; -} forEach (_fish); + true +} count _fish; sleep 1.5; titleText[localize "STR_NOTF_NetUp","PLAIN"]; diff --git a/Altis_Life.Altis/core/actions/fn_escortAction.sqf b/Altis_Life.Altis/core/actions/fn_escortAction.sqf index 128348bfd..e4d28ef74 100644 --- a/Altis_Life.Altis/core/actions/fn_escortAction.sqf +++ b/Altis_Life.Altis/core/actions/fn_escortAction.sqf @@ -1,28 +1,29 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_escortAction.sqf - Author: Bryan "Tonic" Boardwine - - Description: Attaches the desired person(_unit) to the player(player) and "escorts them". -*/ -private ["_unit"]; -_unit = [_this,0,objNull,[objNull]] call BIS_fnc_param; - -if (!isNull(player getVariable ["escortingPlayer",objNull])) exitWith {}; -if (isNil "_unit" || isNull _unit || !isPlayer _unit) exitWith {}; -if (!(side _unit in [civilian,independent])) exitWith {}; -if (player distance _unit > 3) exitWith {}; - -_unit attachTo [player,[0.1,1.1,0]]; -player setVariable ["escortingPlayer",_unit]; -player setVariable ["isEscorting",true]; -_unit setVariable ["transporting",false,true]; -_unit setVariable ["Escorting",true,true]; -player reveal _unit; - -[_unit] spawn { - _unit = _this select 0; - waitUntil {(!(_unit getVariable ["Escorting",false]))}; - player setVariable ["escortingPlayer",nil]; - player setVariable ["isEscorting",false]; -}; \ No newline at end of file +#include "..\..\script_macros.hpp" +/* + File: fn_escortAction.sqf + Author: Bryan "Tonic" Boardwine + + Description: Attaches the desired person(_unit) to the player(player) and "escorts them". +*/ +params [ + ["_unit", objNull, [objNull]] +]; + +if (!isNull (player getVariable ["escortingPlayer",objNull])) exitWith {}; +if (isNull _unit || {!isPlayer _unit}) exitWith {}; +if !(side _unit in [civilian,independent]) exitWith {}; +if (player distance _unit > 3) exitWith {}; + +_unit attachTo [player, [0.1,1.1,0]]; +player setVariable ["escortingPlayer", _unit]; +player setVariable ["isEscorting", true]; + +[_unit] spawn { + params [ + ["_unit", objNull, [objNull]] + ]; + waitUntil {!(_unit getVariable ["Escorting",false])}; + + player setVariable ["escortingPlayer",nil]; + player setVariable ["isEscorting",false]; +}; diff --git a/Altis_Life.Altis/core/actions/fn_gather.sqf b/Altis_Life.Altis/core/actions/fn_gather.sqf index 78fb7d42e..c8ce3bfda 100644 --- a/Altis_Life.Altis/core/actions/fn_gather.sqf +++ b/Altis_Life.Altis/core/actions/fn_gather.sqf @@ -6,19 +6,27 @@ Description: Main functionality for gathering. */ -private ["_maxGather","_resource","_amount","_maxGather","_requiredItem"]; + +scopeName "main"; + if (life_action_inUse) exitWith {}; if !(isNull objectParent player) exitWith {}; if (player getVariable "restrained") exitWith {hint localize "STR_NOTF_isrestrained";}; if (player getVariable "playerSurrender") exitWith {hint localize "STR_NOTF_surrender";}; life_action_inUse = true; -_zone = ""; -_requiredItem = ""; -_exit = false; +private _zone = ""; +private _requiredItem = ""; + +private _resourceCfg = missionConfigFile >> "CfgGather" >> "Resources"; -_resourceCfg = missionConfigFile >> "CfgGather" >> "Resources"; -for "_i" from 0 to count(_resourceCfg)-1 do { +private "_curConfig"; +private "_resource"; +private "_maxGather"; +private "_zoneSize"; +private "_resourceZones"; + +for "_i" from 0 to (count _resourceCfg)-1 do { _curConfig = _resourceCfg select _i; _resource = configName _curConfig; @@ -26,31 +34,31 @@ for "_i" from 0 to count(_resourceCfg)-1 do { _zoneSize = getNumber(_curConfig >> "zoneSize"); _resourceZones = getArray(_curConfig >> "zones"); _requiredItem = getText(_curConfig >> "item"); + { if ((player distance (getMarkerPos _x)) < _zoneSize) exitWith {_zone = _x;}; - } forEach _resourceZones; + true + } count _resourceZones; - if (_zone != "") exitWith {}; + if !(_zone isEqualTo "") exitWith {}; }; if (_zone isEqualTo "") exitWith {life_action_inUse = false;}; -if (_requiredItem != "") then { - _valItem = missionNamespace getVariable "life_inv_" + _requiredItem; +if !(_requiredItem isEqualTo "") then { + private _valItem = missionNamespace getVariable [format["life_inv_%1", _requiredItem], 0]; if (_valItem < 1) exitWith { switch (_requiredItem) do { //Messages here }; life_action_inUse = false; - _exit = true; + breakOut "main"; }; }; -if (_exit) exitWith {life_action_inUse = false;}; - -_amount = round(random(_maxGather)) + 1; -_diff = [_resource,_amount,life_carryWeight,life_maxWeight] call life_fnc_calWeightDiff; +private _amount = round(random(_maxGather)) + 1; +private _diff = [_resource,_amount,life_carryWeight,life_maxWeight] call life_fnc_calWeightDiff; if (_diff isEqualTo 0) exitWith { hint localize "STR_NOTF_InvFull"; life_action_inUse = false; @@ -63,12 +71,12 @@ switch (_requiredItem) do { for "_i" from 0 to 4 do { player playMoveNow "AinvPercMstpSnonWnonDnon_Putdown_AmovPercMstpSnonWnonDnon"; - waitUntil{animationState player != "AinvPercMstpSnonWnonDnon_Putdown_AmovPercMstpSnonWnonDnon";}; + waitUntil {animationState player != "AinvPercMstpSnonWnonDnon_Putdown_AmovPercMstpSnonWnonDnon";}; sleep 0.5; }; if ([true,_resource,_diff] call life_fnc_handleInv) then { - _itemName = M_CONFIG(getText,"VirtualItems",_resource,"displayName"); + private _itemName = M_CONFIG(getText,"VirtualItems",_resource,"displayName"); titleText[format [localize "STR_NOTF_Gather_Success",(localize _itemName),_diff],"PLAIN"]; }; diff --git a/Altis_Life.Altis/core/actions/fn_getDPMission.sqf b/Altis_Life.Altis/core/actions/fn_getDPMission.sqf index e38466fa9..89a518266 100644 --- a/Altis_Life.Altis/core/actions/fn_getDPMission.sqf +++ b/Altis_Life.Altis/core/actions/fn_getDPMission.sqf @@ -35,12 +35,12 @@ player setCurrentTask life_cur_task; ["DeliveryAssigned",[format [localize "STR_NOTF_DPTask",_dp]]] call bis_fnc_showNotification; [] spawn { - waitUntil {!life_delivery_in_progress || !alive player}; + waitUntil {!life_delivery_in_progress || {!alive player}}; if (!alive player) then { life_cur_task setTaskState "Failed"; player removeSimpleTask life_cur_task; - ["DeliveryFailed",[localize "STR_NOTF_DPFailed"]] call BIS_fnc_showNotification; + ["DeliveryFailed", [localize "STR_NOTF_DPFailed"]] call BIS_fnc_showNotification; life_delivery_in_progress = false; life_dp_point = nil; }; -}; \ No newline at end of file +}; diff --git a/Altis_Life.Altis/core/actions/fn_gutAnimal.sqf b/Altis_Life.Altis/core/actions/fn_gutAnimal.sqf index bf08325a5..746f6c6ce 100644 --- a/Altis_Life.Altis/core/actions/fn_gutAnimal.sqf +++ b/Altis_Life.Altis/core/actions/fn_gutAnimal.sqf @@ -1,68 +1,74 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_gutAnimal.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Guts the animal? -*/ -private ["_animalCorpse","_upp","_ui","_progress","_pgText","_cP","_displayName","_item"]; -_animalCorpse = param [0,objNull,[objNull]]; -if (isNull _animalCorpse) exitWith {}; //Object passed is null? - -life_interrupted = false; -if (player distance _animalCorpse > 3.5) exitWith {}; //WTF need check with nearest objects I love Arma -life_action_inUse = true; - -switch (typeOf _animalCorpse) do { - case "Hen_random_F": {_displayName = localize "STR_ANIM_chicken"; _item = "hen_raw";}; - case "Cock_random_F": {_displayName = localize "STR_ANIM_Rooster"; _item = "rooster_raw";}; - case "Goat_random_F": {_displayName = localize "STR_ANIM_Goat"; _item = "goat_raw";}; - case "Sheep_random_F": {_displayName = localize "STR_ANIM_Sheep"; _item = "sheep_raw";}; - case "Rabbit_F": {_displayName = localize "STR_ANIM_Rabbit"; _item = "rabbit_raw";}; - default {_displayName = ""; _item = "";}; -}; - -if (_displayName isEqualTo "") exitWith {life_action_inUse = false;}; - -_upp = format [localize "STR_NOTF_Gutting",_displayName]; -//Setup our progress bar. -disableSerialization; -"progressBar" cutRsc ["life_progress","PLAIN"]; -_ui = uiNamespace getVariable "life_progress"; -_progress = _ui displayCtrl 38201; -_pgText = _ui displayCtrl 38202; -_pgText ctrlSetText format ["%2 (1%1)...","%",_upp]; -_progress progressSetPosition 0.01; -_cP = 0.01; - -for "_i" from 0 to 1 step 0 do { - if (animationState player != "AinvPknlMstpSnonWnonDnon_medic_1") then { - [player,"AinvPknlMstpSnonWnonDnon_medic_1",true] remoteExecCall ["life_fnc_animSync",RCLIENT]; - player switchMove "AinvPknlMstpSnonWnonDnon_medic_1"; - player playMoveNow "AinvPknlMstpSnonWnonDnon_medic_1"; - }; - uiSleep 0.15; - _cP = _cP + 0.01; - _progress progressSetPosition _cP; - _pgText ctrlSetText format ["%3 (%1%2)...",round(_cP * 100),"%",_upp]; - if (_cP >= 1) exitWith {}; - if (!alive player) exitWith {}; - if (isNull _animalCorpse) exitWith {}; - if !(isNull objectParent player) exitWith {}; - if (life_interrupted) exitWith {}; -}; - -life_action_inUse = false; -"progressBar" cutText ["","PLAIN"]; -player playActionNow "stop"; -if (isNull _animalCorpse) exitWith {life_action_inUse = false;}; -if (life_interrupted) exitWith {life_interrupted = false; titleText[localize "STR_NOTF_ActionCancel","PLAIN"]; life_action_inUse = false;}; -if !(isNull objectParent player) exitWith {titleText[localize "STR_NOTF_ActionInVehicle","PLAIN"];}; - -if ([true,_item,1] call life_fnc_handleInv) then { - deleteVehicle _animalCorpse; - titleText[format [(localize "STR_NOTF_Guttingfinish"),_displayName],"PLAIN"]; -} else { - titleText[(localize "STR_NOTF_InvFull"),"PLAIN"]; -}; \ No newline at end of file +#include "..\..\script_macros.hpp" +/* + File: fn_gutAnimal.sqf + Author: Bryan "Tonic" Boardwine + + Description: + Guts the animal? +*/ + +params [ + ["_animalCorpse", objNull, [objNull]] +]; + +if (isNull _animalCorpse) exitWith {}; //Object passed is null? + +life_interrupted = false; +if (player distance _animalCorpse > 3.5) exitWith {}; +life_action_inUse = true; + +private _animalInfo = switch (typeOf _animalCorpse) do { + case "Hen_random_F": {["STR_ANIM_chicken", "hen_raw"]}; + case "Cock_random_F": {["STR_ANIM_Rooster", "rooster_raw"]}; + case "Goat_random_F": {["STR_ANIM_Goat", "goat_raw"]}; + case "Sheep_random_F": {["STR_ANIM_Sheep", "sheep_raw"]}; + case "Rabbit_F": {["STR_ANIM_Rabbit", "rabbit_raw"]}; + default {["", ""]}; +}; + +_animalInfo params ["_displayName", "_item"]; +_displayName = localize _displayName; + +if (_displayName isEqualTo "") exitWith {life_action_inUse = false;}; + +private _upp = format [localize "STR_NOTF_Gutting",_displayName]; +//Setup our progress bar. +disableSerialization; +"progressBar" cutRsc ["life_progress","PLAIN"]; +private _ui = uiNamespace getVariable "life_progress"; +private _progress = _ui displayCtrl 38201; +private _pgText = _ui displayCtrl 38202; +_pgText ctrlSetText format ["%2 (1%1)...","%",_upp]; +private _progress progressSetPosition 0.01; +private _cP = 0.01; + +for "_i" from 0 to 1 step 0 do { + if (animationState player != "AinvPknlMstpSnonWnonDnon_medic_1") then { + [player,"AinvPknlMstpSnonWnonDnon_medic_1",true] remoteExecCall ["life_fnc_animSync",RCLIENT]; + player switchMove "AinvPknlMstpSnonWnonDnon_medic_1"; + player playMoveNow "AinvPknlMstpSnonWnonDnon_medic_1"; + }; + uiSleep 0.15; + _cP = _cP + 0.01; + _progress progressSetPosition _cP; + _pgText ctrlSetText format ["%3 (%1%2)...",round(_cP * 100),"%",_upp]; + if (_cP >= 1) exitWith {}; + if (!alive player) exitWith {}; + if (isNull _animalCorpse) exitWith {}; + if !(isNull objectParent player) exitWith {}; + if (life_interrupted) exitWith {}; +}; + +life_action_inUse = false; +"progressBar" cutText ["","PLAIN"]; +player playActionNow "stop"; +if (isNull _animalCorpse) exitWith {life_action_inUse = false;}; +if (life_interrupted) exitWith {life_interrupted = false; titleText[localize "STR_NOTF_ActionCancel","PLAIN"]; life_action_inUse = false;}; +if !(isNull objectParent player) exitWith {titleText[localize "STR_NOTF_ActionInVehicle","PLAIN"];}; + +if ([true,_item,1] call life_fnc_handleInv) then { + deleteVehicle _animalCorpse; + titleText[format [(localize "STR_NOTF_Guttingfinish"),_displayName],"PLAIN"]; +} else { + titleText[(localize "STR_NOTF_InvFull"),"PLAIN"]; +}; diff --git a/Altis_Life.Altis/core/actions/fn_healHospital.sqf b/Altis_Life.Altis/core/actions/fn_healHospital.sqf index c6367e7ea..cd7ca7d7d 100644 --- a/Altis_Life.Altis/core/actions/fn_healHospital.sqf +++ b/Altis_Life.Altis/core/actions/fn_healHospital.sqf @@ -1,39 +1,42 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_healHospital.sqf - Author: Bryan "Tonic" Boardwine - Reworked: Jesse "TKCJesse" Schultz - - Description: - Prompts user with a confirmation dialog to heal themselves. - Used at the hospitals to restore health to full. - Note: Dialog helps stop a few issues regarding money loss. -*/ -private ["_healCost","_action"]; -if (life_action_inUse) exitWith {}; -if ((damage player) < 0.01) exitWith {hint localize "STR_NOTF_HS_FullHealth"}; -_healCost = LIFE_SETTINGS(getNumber,"hospital_heal_fee"); -if (CASH < _healCost) exitWith {hint format [localize "STR_NOTF_HS_NoCash",[_healCost] call life_fnc_numberText];}; - -life_action_inUse = true; -_action = [ - format [localize "STR_NOTF_HS_PopUp",[_healCost] call life_fnc_numberText], - localize "STR_NOTF_HS_TITLE", - localize "STR_Global_Yes", - localize "STR_Global_No" -] call BIS_fnc_guiMessage; - -if (_action) then { - titleText[localize "STR_NOTF_HS_Healing","PLAIN"]; - closeDialog 0; - uiSleep 8; - if (player distance (_this select 0) > 5) exitWith {life_action_inUse = false; titleText[localize "STR_NOTF_HS_ToFar","PLAIN"]}; - titleText[localize "STR_NOTF_HS_Healed","PLAIN"]; - player setDamage 0; - CASH = CASH - _healCost; - life_action_inUse = false; -} else { - hint localize "STR_NOTF_ActionCancel"; - closeDialog 0; - life_action_inUse = false; -}; +#include "..\..\script_macros.hpp" +/* + File: fn_healHospital.sqf + Author: Bryan "Tonic" Boardwine + Reworked: Jesse "TKCJesse" Schultz + + Description: + Prompts user with a confirmation dialog to heal themselves. + Used at the hospitals to restore health to full. + Note: Dialog helps stop a few issues regarding money loss. +*/ +params [ + ["_target", objNull, [objNull]] +]; + +if (life_action_inUse) exitWith {}; +if ((damage player) < 0.01) exitWith {hint localize "STR_NOTF_HS_FullHealth"}; + +private _healCost = LIFE_SETTINGS(getNumber,"hospital_heal_fee"); +if (CASH < _healCost) exitWith {hint format [localize "STR_NOTF_HS_NoCash",[_healCost] call life_fnc_numberText]}; + +life_action_inUse = true; + +private _action = [ + format [localize "STR_NOTF_HS_PopUp",[_healCost] call life_fnc_numberText], + localize "STR_NOTF_HS_TITLE", + localize "STR_Global_Yes", + localize "STR_Global_No" +] call BIS_fnc_guiMessage; + +closeDialog 0; +if (_action) then { + titleText [localize "STR_NOTF_HS_Healing", "PLAIN"]; + uiSleep 8; + if (player distance _target > 5) exitWith {life_action_inUse = false; titleText [localize "STR_NOTF_HS_ToFar", "PLAIN"]}; + titleText [localize "STR_NOTF_HS_Healed", "PLAIN"]; + player setDamage 0; + CASH = CASH - _healCost; +} else { + hint localize "STR_NOTF_ActionCancel"; +}; +life_action_inUse = false; diff --git a/Altis_Life.Altis/core/actions/fn_impoundAction.sqf b/Altis_Life.Altis/core/actions/fn_impoundAction.sqf index 1bf326fcf..adca0ea63 100644 --- a/Altis_Life.Altis/core/actions/fn_impoundAction.sqf +++ b/Altis_Life.Altis/core/actions/fn_impoundAction.sqf @@ -1,80 +1,89 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_impoundAction.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Impounds the vehicle -*/ -private ["_vehicle","_type","_time","_value","_vehicleData","_upp","_ui","_progress","_pgText","_cP","_filters","_impoundValue","_price","_impoundMultiplier"]; -_vehicle = param [0,objNull,[objNull]]; -_filters = ["Car","Air","Ship"]; -if (!((KINDOF_ARRAY(_vehicle,_filters)))) exitWith {}; -if (player distance cursorObject > 10) exitWith {}; -if (_vehicle getVariable "NPC") exitWith {hint localize "STR_NPC_Protected"}; - -_vehicleData = _vehicle getVariable ["vehicle_info_owners",[]]; -if (_vehicleData isEqualTo 0) exitWith {deleteVehicle _vehicle}; //Bad vehicle. -_vehicleName = FETCH_CONFIG2(getText,"CfgVehicles",(typeOf _vehicle),"displayName"); -_price = M_CONFIG(getNumber,"LifeCfgVehicles",(typeOf _vehicle),"price"); -[0,"STR_NOTF_BeingImpounded",true,[((_vehicleData select 0) select 1),_vehicleName]] remoteExecCall ["life_fnc_broadcast",RCLIENT]; -life_action_inUse = true; - -_upp = localize "STR_NOTF_Impounding"; -//Setup our progress bar. -disableSerialization; -"progressBar" cutRsc ["life_progress","PLAIN"]; -_ui = uiNamespace getVariable "life_progress"; -_progress = _ui displayCtrl 38201; -_pgText = _ui displayCtrl 38202; -_pgText ctrlSetText format ["%2 (1%1)...","%",_upp]; -_progress progressSetPosition 0.01; -_cP = 0.01; - -for "_i" from 0 to 1 step 0 do { - uiSleep 0.09; - _cP = _cP + 0.01; - _progress progressSetPosition _cP; - _pgText ctrlSetText format ["%3 (%1%2)...",round(_cP * 100),"%",_upp]; - if (_cP >= 1) exitWith {}; - if (player distance _vehicle > 10) exitWith {}; - if (!alive player) exitWith {}; -}; - -"progressBar" cutText ["","PLAIN"]; - -if (player distance _vehicle > 10) exitWith {hint localize "STR_NOTF_ImpoundingCancelled"; life_action_inUse = false;}; -if (!alive player) exitWith {life_action_inUse = false;}; - -if (count crew _vehicle isEqualTo 0) then { - if (!(KINDOF_ARRAY(_vehicle,_filters))) exitWith {life_action_inUse = false;}; - _type = FETCH_CONFIG2(getText,"CfgVehicles",(typeOf _vehicle),"displayName"); - - life_impound_inuse = true; - - if (life_HC_isActive) then { - [_vehicle,true,player] remoteExec ["HC_fnc_vehicleStore",HC_Life]; - } else { - [_vehicle,true,player] remoteExec ["TON_fnc_vehicleStore",RSERV]; - }; - - waitUntil {!life_impound_inuse}; - if (playerSide isEqualTo west) then { - _impoundMultiplier = LIFE_SETTINGS(getNumber,"vehicle_cop_impound_multiplier"); - _value = _price * _impoundMultiplier; - [0,"STR_NOTF_HasImpounded",true,[profileName,((_vehicleData select 0) select 1),_vehicleName]] remoteExecCall ["life_fnc_broadcast",RCLIENT]; - if (_vehicle in life_vehicles) then { - hint format [localize "STR_NOTF_OwnImpounded",[_value] call life_fnc_numberText,_type]; - BANK = BANK - _value; - } else { - hint format [localize "STR_NOTF_Impounded",_type,[_value] call life_fnc_numberText]; - BANK = BANK + _value; - }; - if (BANK < 0) then {BANK = 0;}; - [1] call SOCK_fnc_updatePartial; - }; -} else { - hint localize "STR_NOTF_ImpoundingCancelled"; -}; - -life_action_inUse = false; +#include "..\..\script_macros.hpp" +/* + File: fn_impoundAction.sqf + Author: Bryan "Tonic" Boardwine + + Description: + Impounds the vehicle +*/ + +params [ + ["_vehicle", objNull, [objNull]] +]; + +private _filters = ["Car","Air","Ship"]; + +if !(KINDOF_ARRAY(_vehicle,_filters)) exitWith {}; +if (player distance cursorObject > 10) exitWith {}; +if (_vehicle getVariable "NPC") exitWith {hint localize "STR_NPC_Protected"}; + +private _vehicleData = _vehicle getVariable ["vehicle_info_owners",[]]; +if (_vehicleData isEqualTo []) exitWith {deleteVehicle _vehicle}; //Bad vehicle. + +private _vehicleName = FETCH_CONFIG2(getText,"CfgVehicles",(typeOf _vehicle),"displayName"); +private _price = M_CONFIG(getNumber,"LifeCfgVehicles",(typeOf _vehicle),"price"); + +[0,"STR_NOTF_BeingImpounded",true,[((_vehicleData select 0) select 1),_vehicleName]] remoteExecCall ["life_fnc_broadcast",RCLIENT]; +life_action_inUse = true; + +private _upp = localize "STR_NOTF_Impounding"; +//Setup our progress bar. +disableSerialization; +"progressBar" cutRsc ["life_progress","PLAIN"]; +private _ui = uiNamespace getVariable "life_progress"; +private _progress = _ui displayCtrl 38201; +private _pgText = _ui displayCtrl 38202; +_pgText ctrlSetText format ["%2 (1%1)...","%",_upp]; +private _progress progressSetPosition 0.01; +private _cP = 0.01; + +for "_i" from 0 to 1 step 0 do { + uiSleep 0.09; + _cP = _cP + 0.01; + _progress progressSetPosition _cP; + _pgText ctrlSetText format ["%3 (%1%2)...",round(_cP * 100),"%",_upp]; + if (_cP >= 1) exitWith {}; + if (player distance _vehicle > 10) exitWith {}; + if (!alive player) exitWith {}; +}; + +"progressBar" cutText ["","PLAIN"]; + +if (player distance _vehicle > 10) exitWith { + hint localize "STR_NOTF_ImpoundingCancelled"; + life_action_inUse = false; +}; + +if (!alive player) exitWith {life_action_inUse = false;}; + +if (crew _vehicle isEqualTo []) then { + private _type = FETCH_CONFIG2(getText,"CfgVehicles",(typeOf _vehicle),"displayName"); + + life_impound_inuse = true; + + if (life_HC_isActive) then { + [_vehicle,true,player] remoteExec ["HC_fnc_vehicleStore",HC_Life]; + } else { + [_vehicle,true,player] remoteExec ["TON_fnc_vehicleStore",RSERV]; + }; + + waitUntil {!life_impound_inuse}; + if (playerSide isEqualTo west) then { + private _impoundMultiplier = LIFE_SETTINGS(getNumber,"vehicle_cop_impound_multiplier"); + private _value = _price * _impoundMultiplier; + [0,"STR_NOTF_HasImpounded",true,[profileName,((_vehicleData select 0) select 1),_vehicleName]] remoteExecCall ["life_fnc_broadcast",RCLIENT]; + if (_vehicle in life_vehicles) then { + hint format [localize "STR_NOTF_OwnImpounded",[_value] call life_fnc_numberText,_type]; + BANK = BANK - _value; + } else { + hint format [localize "STR_NOTF_Impounded",_type,[_value] call life_fnc_numberText]; + BANK = BANK + _value; + }; + if (BANK < 0) then {BANK = 0;}; + [1] call SOCK_fnc_updatePartial; + }; +} else { + hint localize "STR_NOTF_ImpoundingCancelled"; +}; + +life_action_inUse = false; diff --git a/Altis_Life.Altis/core/actions/fn_mine.sqf b/Altis_Life.Altis/core/actions/fn_mine.sqf index 873f64b58..23d00d109 100644 --- a/Altis_Life.Altis/core/actions/fn_mine.sqf +++ b/Altis_Life.Altis/core/actions/fn_mine.sqf @@ -1,29 +1,42 @@ #include "..\..\script_macros.hpp" - /* - File: fn_mine.sqf - Author: Devilfloh - Editor: Dardo - - Description: - Same as fn_gather,but it allows use of probabilities for mining. - */ -private ["_maxGather", "_resource", "_amount", "_requiredItem", "_mined"]; +/* + File: fn_mine.sqf + Author: Devilfloh + Editor: Dardo + + Description: + Same as fn_gather,but it allows use of probabilities for mining. +*/ + +scopeName "main"; + if (life_action_inUse) exitWith {}; if !(isNull objectParent player) exitWith {}; if (player getVariable "restrained") exitWith { hint localize "STR_NOTF_isrestrained"; }; -_exit = false; + if (player getVariable "playerSurrender") exitWith { hint localize "STR_NOTF_surrender"; }; + life_action_inUse = true; -_zone = ""; -_requiredItem = ""; + +private _zone = ""; +private _requiredItem = ""; _resourceCfg = missionConfigFile >> "CfgGather" >> "Minerals"; _percent = (floor random 100) + 1; //Make sure it's not 0 +private "_curConfig"; +private "_resource"; +private "_resources"; +private "_maxGather"; +private "_zoneSize"; +private "_resourceZones"; +private "_mined"; + + for "_i" from 0 to count(_resourceCfg)-1 do { _curConfig = _resourceCfg select _i; _resources = getArray(_curConfig >> "mined"); @@ -73,16 +86,12 @@ if (_requiredItem != "") then { }; }; life_action_inUse = false; - _exit = true; + breakOut "main"; }; }; -if (_exit) exitWith { - life_action_inUse = false; -}; - -_amount = round(random(_maxGather)) + 1; -_diff = [_mined, _amount, life_carryWeight, life_maxWeight] call life_fnc_calWeightDiff; +private _amount = round(random(_maxGather)) + 1; +private _diff = [_mined, _amount, life_carryWeight, life_maxWeight] call life_fnc_calWeightDiff; if (_diff isEqualTo 0) exitWith { hint localize "STR_NOTF_InvFull"; life_action_inUse = false; diff --git a/Altis_Life.Altis/core/actions/fn_newsBroadcast.sqf b/Altis_Life.Altis/core/actions/fn_newsBroadcast.sqf index 74b5ebbf5..3d919e8e0 100644 --- a/Altis_Life.Altis/core/actions/fn_newsBroadcast.sqf +++ b/Altis_Life.Altis/core/actions/fn_newsBroadcast.sqf @@ -6,21 +6,19 @@ Description: Creates the dialog and handles the data in the Channel 7 News Dialog. */ -#define Confirm 100104 -private ["_msgCost","_display","_confirmBtn","_msgCooldown","_broadcastDelay"]; - -if (!dialog) then { +if !(dialog) then { createDialog "life_news_broadcast"; }; disableSerialization; -_display = findDisplay 100100; -_confirmBtn = _display displayCtrl Confirm; + +private _display = findDisplay 100100; +private _confirmBtn = _display displayCtrl 100104; _confirmBtn ctrlEnable false; -_msgCooldown = (60 * LIFE_SETTINGS(getNumber,"news_broadcast_cooldown")); -_msgCost = LIFE_SETTINGS(getNumber,"news_broadcast_cost"); +private _msgCooldown = 60 * LIFE_SETTINGS(getNumber,"news_broadcast_cooldown"); +private _msgCost = LIFE_SETTINGS(getNumber,"news_broadcast_cost"); if (CASH < _msgCost) then { hint format [localize "STR_News_NotEnough",[_msgCost] call life_fnc_numberText]; @@ -29,6 +27,7 @@ if (CASH < _msgCost) then { _confirmBtn buttonSetAction "[] call life_fnc_postNewsBroadcast; closeDialog 0;"; }; +private "_broadcastDelay"; if (isNil "life_broadcastTimer" || {(time - life_broadcastTimer) > _msgCooldown}) then { _broadcastDelay = localize "STR_News_Now"; } else { @@ -36,4 +35,4 @@ if (isNil "life_broadcastTimer" || {(time - life_broadcastTimer) > _msgCooldown} _confirmBtn ctrlEnable false; }; -CONTROL(100100,100103) ctrlSetStructuredText parseText format [ localize "STR_News_StructuredText",[_msgCost] call life_fnc_numberText,_broadcastDelay]; \ No newline at end of file +CONTROL(100100,100103) ctrlSetStructuredText parseText format [localize "STR_News_StructuredText",[_msgCost] call life_fnc_numberText,_broadcastDelay]; diff --git a/Altis_Life.Altis/core/actions/fn_packupSpikes.sqf b/Altis_Life.Altis/core/actions/fn_packupSpikes.sqf index 860820561..a31a51493 100644 --- a/Altis_Life.Altis/core/actions/fn_packupSpikes.sqf +++ b/Altis_Life.Altis/core/actions/fn_packupSpikes.sqf @@ -5,8 +5,8 @@ Description: Packs up a deployed spike strip. */ -private ["_spikes"]; -_spikes = nearestObjects[getPos player,["Land_Razorwire_F"],8] select 0; + +private _spikes = nearestObjects[getPos player, ["Land_Razorwire_F"], 8] select 0; if (isNil "_spikes") exitWith {}; if ([true,"spikeStrip",1] call life_fnc_handleInv) then { diff --git a/Altis_Life.Altis/core/actions/fn_pickupItem.sqf b/Altis_Life.Altis/core/actions/fn_pickupItem.sqf index 9ed5d5af2..8d942d5d6 100644 --- a/Altis_Life.Altis/core/actions/fn_pickupItem.sqf +++ b/Altis_Life.Altis/core/actions/fn_pickupItem.sqf @@ -1,62 +1,71 @@ -#include "..\..\script_macros.hpp" -#define INUSE(ENTITY) ENTITY setVariable ["inUse",false,true] -/* - File: fn_pickupItem.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Master handling for picking up an item. -*/ -private ["_itemInfo","_itemName","_illegal","_diff"]; -if ((time - life_action_delay) < 2) exitWith {hint localize "STR_NOTF_ActionDelay"; INUSE(_this);}; -if (isNull _this || {player distance _this > 3}) exitWith {INUSE(_this);}; - -_itemInfo = _this getVariable ["item",[]]; if (count _itemInfo isEqualTo 0) exitWith {deleteVehicle _this;}; -_illegal = ITEM_ILLEGAL(_itemInfo select 0); -_itemName = ITEM_NAME(_itemInfo select 0); -if (isLocalized _itemName) then { - _itemName = (localize _itemName); -}; - -if (playerSide isEqualTo west && _illegal isEqualTo 1) exitWith { - titleText[format [localize "STR_NOTF_PickedEvidence",_itemName,[round(ITEM_SELLPRICE(_itemInfo select 0) / 2)] call life_fnc_numberText],"PLAIN"]; - BANK = BANK + round(ITEM_SELLPRICE(_itemInfo select 0) / 2); - deleteVehicle _this; - [1] call SOCK_fnc_updatePartial; - life_action_delay = time; -}; - -life_action_delay = time; -_diff = [(_itemInfo select 0),(_itemInfo select 1),life_carryWeight,life_maxWeight] call life_fnc_calWeightDiff; -if (_diff <= 0) exitWith {hint localize "STR_NOTF_InvFull"; INUSE(_this);}; - -if (!(_diff isEqualTo (_itemInfo select 1))) then { - if ([true,(_itemInfo select 0),_diff] call life_fnc_handleInv) then { - player playMove "AinvPknlMstpSlayWrflDnon"; - - _this setVariable ["item",[(_itemInfo select 0),(_itemInfo select 1) - _diff],true]; - titleText[format [localize "STR_NOTF_Picked",_diff,_itemName],"PLAIN"]; - INUSE(_this); - } else { - INUSE(_this); - }; -} else { - if ([true,(_itemInfo select 0),(_itemInfo select 1)] call life_fnc_handleInv) then { - deleteVehicle _this; - //waitUntil{isNull _this}; - player playMove "AinvPknlMstpSlayWrflDnon"; - - titleText[format [localize "STR_NOTF_Picked",_diff,_itemName],"PLAIN"]; - } else { - INUSE(_this); - }; -}; - -if (LIFE_SETTINGS(getNumber,"player_advancedLog") isEqualTo 1) then { - if (LIFE_SETTINGS(getNumber,"battlEye_friendlyLogging") isEqualTo 1) then { - advanced_log = format [localize "STR_DL_AL_pickedUp_BEF",_diff,_itemName]; - } else { - advanced_log = format [localize "STR_DL_AL_pickedUp",profileName,(getPlayerUID player),_diff,_itemName]; - }; - publicVariableServer "advanced_log"; -}; +#include "..\..\script_macros.hpp" +/* + File: fn_pickupItem.sqf + Author: Bryan "Tonic" Boardwine + + Description: + Master handling for picking up an item. +*/ +params [ + ["_object", objNull, [objNull]] +]; + +#define RELEASE_USE(ENTITY) ENTITY setVariable ["inUse",false,true] + +if ((time - life_action_delay) < 2) exitWith {hint localize "STR_NOTF_ActionDelay"; RELEASE_USE(_object);}; +if (isNull _object || {player distance _object > 3}) exitWith {RELEASE_USE(_object);}; + +private _itemInfo = _object getVariable ["item",[]]; +if (_itemInfo isEqualTo []) exitWith {deleteVehicle _object;}; + +_itemInfo params ["_item", "_value"]; + +private _illegal = ITEM_ILLEGAL(_item); +private _itemName = ITEM_NAME(_item); + +if (isLocalized _itemName) then { + _itemName = localize _itemName; +}; + +life_action_delay = time; + +if (playerSide isEqualTo west && {_illegal isEqualTo 1}) exitWith { + private _evidencePrice = round(ITEM_SELLPRICE(_item) / 2); + titleText[format [localize "STR_NOTF_PickedEvidence",_itemName,[_evidencePrice] call life_fnc_numberText],"PLAIN"]; + BANK = BANK + _evidencePrice; + deleteVehicle _object; + [1] call SOCK_fnc_updatePartial; +}; + +private _diff = [_item,_value,life_carryWeight,life_maxWeight] call life_fnc_calWeightDiff; +if (_diff <= 0) exitWith { + hint localize "STR_NOTF_InvFull"; + RELEASE_USE(_object); +}; + +if !(_diff isEqualTo _value) then { + if ([true,_item,_diff] call life_fnc_handleInv) then { + player playMove "AinvPknlMstpSlayWrflDnon"; + _object setVariable ["item",[_item,_value - _diff],true]; + + titleText[format [localize "STR_NOTF_Picked",_diff,_itemName],"PLAIN"]; + }; + RELEASE_USE(_object); +} else { + if ([true,_item,_value] call life_fnc_handleInv) then { + deleteVehicle _object; + player playMove "AinvPknlMstpSlayWrflDnon"; + titleText[format [localize "STR_NOTF_Picked",_diff,_itemName],"PLAIN"]; + } else { + RELEASE_USE(_object); + }; +}; + +if (LIFE_SETTINGS(getNumber,"player_advancedLog") isEqualTo 1) then { + if (LIFE_SETTINGS(getNumber,"battlEye_friendlyLogging") isEqualTo 1) then { + advanced_log = format [localize "STR_DL_AL_pickedUp_BEF",_diff,_itemName]; + } else { + advanced_log = format [localize "STR_DL_AL_pickedUp",profileName,(getPlayerUID player),_diff,_itemName]; + }; + publicVariableServer "advanced_log"; +}; diff --git a/Altis_Life.Altis/core/actions/fn_pickupMoney.sqf b/Altis_Life.Altis/core/actions/fn_pickupMoney.sqf index 49eebc289..aa4239eab 100644 --- a/Altis_Life.Altis/core/actions/fn_pickupMoney.sqf +++ b/Altis_Life.Altis/core/actions/fn_pickupMoney.sqf @@ -1,37 +1,45 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_pickupMoney.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Picks up money -*/ -private "_value"; -if ((time - life_action_delay) < 1.5) exitWith {hint localize "STR_NOTF_ActionDelay"; _this setVariable ["inUse",false,true];}; -if (isNull _this || {player distance _this > 3}) exitWith {_this setVariable ["inUse",false,true];}; - -_value = ((_this getVariable "item") select 1); -if (!isNil "_value") exitWith { - deleteVehicle _this; - - switch (true) do { - case (_value > 20000000) : {_value = 100000;}; //VAL>20mil->100k - case (_value > 5000000) : {_value = 250000;}; //VAL>5mil->250k - default {}; - }; - - player playMove "AinvPknlMstpSlayWrflDnon"; - titleText[format [localize "STR_NOTF_PickedMoney",[_value] call life_fnc_numberText],"PLAIN"]; - CASH = CASH + _value; - [0] call SOCK_fnc_updatePartial; - life_action_delay = time; - - if (LIFE_SETTINGS(getNumber,"player_moneyLog") isEqualTo 1) then { - if (LIFE_SETTINGS(getNumber,"battlEye_friendlyLogging") isEqualTo 1) then { - money_log = format [localize "STR_DL_ML_pickedUpMoney_BEF",[_value] call life_fnc_numberText,[BANK] call life_fnc_numberText,[CASH] call life_fnc_numberText]; - } else { - money_log = format [localize "STR_DL_ML_pickedUpMoney",profileName,(getPlayerUID player),[_value] call life_fnc_numberText,[BANK] call life_fnc_numberText,[CASH] call life_fnc_numberText]; - }; - publicVariableServer "money_log"; - }; -}; \ No newline at end of file +#include "..\..\script_macros.hpp" +/* + File: fn_pickupMoney.sqf + Author: Bryan "Tonic" Boardwine + + Description: + Picks up money +*/ +params [ + ["_money", objNull, [objNull]] +]; + +if ((time - life_action_delay) < 1.5) exitWith { + hint localize "STR_NOTF_ActionDelay"; + _money setVariable ["inUse",false,true]; +}; +if (isNull _money || {player distance _money > 3}) exitWith { + _money setVariable ["inUse",false,true]; +}; + +private _value = (_money getVariable "item") select 1; +if (!isNil "_value") exitWith { + deleteVehicle _money; + + _value = switch (true) do { + case (_value > 20000000) : {100000}; //VAL>20mil->100k + case (_value > 5000000) : {250000}; //VAL>5mil->250k + default {}; + }; + + player playMove "AinvPknlMstpSlayWrflDnon"; + titleText[format [localize "STR_NOTF_PickedMoney",[_value] call life_fnc_numberText],"PLAIN"]; + CASH = CASH + _value; + [0] call SOCK_fnc_updatePartial; + life_action_delay = time; + + if (LIFE_SETTINGS(getNumber,"player_moneyLog") isEqualTo 1) then { + if (LIFE_SETTINGS(getNumber,"battlEye_friendlyLogging") isEqualTo 1) then { + money_log = format [localize "STR_DL_ML_pickedUpMoney_BEF",[_value] call life_fnc_numberText,[BANK] call life_fnc_numberText,[CASH] call life_fnc_numberText]; + } else { + money_log = format [localize "STR_DL_ML_pickedUpMoney",profileName,(getPlayerUID player),[_value] call life_fnc_numberText,[BANK] call life_fnc_numberText,[CASH] call life_fnc_numberText]; + }; + publicVariableServer "money_log"; + }; +}; diff --git a/Altis_Life.Altis/core/actions/fn_postBail.sqf b/Altis_Life.Altis/core/actions/fn_postBail.sqf index 34f1cbcc5..98f355a72 100644 --- a/Altis_Life.Altis/core/actions/fn_postBail.sqf +++ b/Altis_Life.Altis/core/actions/fn_postBail.sqf @@ -7,8 +7,12 @@ Called when the player attempts to post bail. Needs to be revised. */ -private ["_unit"]; -_unit = param [1,objNull,[objNull]]; + +params [ + "", + ["_unit", objNull, [objNull]] +]; + if (life_bail_paid) exitWith {}; if (isNil "life_bail_amount") then {life_bail_amount = 3500;}; if (!life_canpay_bail) exitWith {hint localize "STR_NOTF_Bail_Post"}; diff --git a/Altis_Life.Altis/core/actions/fn_processAction.sqf b/Altis_Life.Altis/core/actions/fn_processAction.sqf index e47edc0b1..81308b77c 100644 --- a/Altis_Life.Altis/core/actions/fn_processAction.sqf +++ b/Altis_Life.Altis/core/actions/fn_processAction.sqf @@ -1,147 +1,202 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_processAction.sqf - Author: Bryan "Tonic" Boardwine - Modified : NiiRoZz - - Description: - Master handling for processing an item. - NiiRoZz : Added multiprocess -*/ -private ["_vendor","_type","_itemInfo","_oldItem","_newItemWeight","_newItem","_oldItemWeight","_cost","_upp","_hasLicense","_itemName","_oldVal","_ui","_progress","_pgText","_cP","_materialsRequired","_materialsGiven","_noLicenseCost","_text","_filter","_totalConversions","_minimumConversions"]; -_vendor = [_this,0,objNull,[objNull]] call BIS_fnc_param; -_type = [_this,3,"",[""]] call BIS_fnc_param; -//Error check -if (isNull _vendor || _type isEqualTo "" || (player distance _vendor > 10)) exitWith {}; -life_action_inUse = true;//Lock out other actions during processing. - -if (isClass (missionConfigFile >> "ProcessAction" >> _type)) then { - _filter = false; - _materialsRequired = M_CONFIG(getArray,"ProcessAction",_type,"MaterialsReq"); - _materialsGiven = M_CONFIG(getArray,"ProcessAction",_type,"MaterialsGive"); - _noLicenseCost = M_CONFIG(getNumber,"ProcessAction",_type,"NoLicenseCost"); - _text = M_CONFIG(getText,"ProcessAction",_type,"Text"); -} else {_filter = true;}; - -if (_filter) exitWith {life_action_inUse = false;}; - -_itemInfo = [_materialsRequired,_materialsGiven,_noLicenseCost,(localize format ["%1",_text])]; -if (count _itemInfo isEqualTo 0) exitWith {life_action_inUse = false;}; - -//Setup vars. -_oldItem = _itemInfo select 0; -_newItem = _itemInfo select 1; -_cost = _itemInfo select 2; -_upp = _itemInfo select 3; -_exit = false; -if (count _oldItem isEqualTo 0) exitWith {life_action_inUse = false;}; - -_totalConversions = []; -{ - _var = ITEM_VALUE(_x select 0); - if (_var isEqualTo 0) exitWith {_exit = true;}; - if (_var < (_x select 1)) exitWith {_exit = true;}; - _totalConversions pushBack (floor (_var/(_x select 1))); -} forEach _oldItem; - -if (_exit) exitWith {life_is_processing = false; hint localize "STR_NOTF_NotEnoughItemProcess"; life_action_inUse = false;}; - -if (_vendor in [mari_processor,coke_processor,heroin_processor]) then { - _hasLicense = true; -} else { - _hasLicense = LICENSE_VALUE(_type,"civ"); -}; - -_cost = _cost * (count _oldItem); - -_minimumConversions = _totalConversions call BIS_fnc_lowestNum; -_oldItemWeight = 0; -{ - _weight = ([_x select 0] call life_fnc_itemWeight) * (_x select 1); - _oldItemWeight = _oldItemWeight + _weight; -} count _oldItem; - -_newItemWeight = 0; -{ - _weight = ([_x select 0] call life_fnc_itemWeight) * (_x select 1); - _newItemWeight = _newItemWeight + _weight; -} count _newItem; - -_exit = false; - -if (_newItemWeight > _oldItemWeight) then { - _netChange = _newItemWeight - _oldItemWeight; - _freeSpace = life_maxWeight - life_carryWeight; - if (_freeSpace < _netChange) exitWith {_exit = true;}; - private _estConversions = floor(_freeSpace / _netChange); - if (_estConversions < _minimumConversions) then { - _minimumConversions = _estConversions; - }; -}; - -if (_exit) exitWith {hint localize "STR_Process_Weight"; life_is_processing = false; life_action_inUse = false;}; - -//Setup our progress bar. -disableSerialization; -"progressBar" cutRsc ["life_progress","PLAIN"]; -_ui = uiNamespace getVariable "life_progress"; -_progress = _ui displayCtrl 38201; -_pgText = _ui displayCtrl 38202; -_pgText ctrlSetText format ["%2 (1%1)...","%",_upp]; -_progress progressSetPosition 0.01; -_cP = 0.01; - -life_is_processing = true; - -if (_hasLicense) then { - for "_i" from 0 to 1 step 0 do { - uiSleep 0.28; - _cP = _cP + 0.01; - _progress progressSetPosition _cP; - _pgText ctrlSetText format ["%3 (%1%2)...",round(_cP * 100),"%",_upp]; - if (_cP >= 1) exitWith {}; - if (player distance _vendor > 10) exitWith {}; - }; - if (player distance _vendor > 10) exitWith {hint localize "STR_Process_Stay"; "progressBar" cutText ["","PLAIN"]; life_is_processing = false; life_action_inUse = false;}; - - { - [false,(_x select 0),((_x select 1)*(_minimumConversions))] call life_fnc_handleInv; - } count _oldItem; - - { - [true,(_x select 0),((_x select 1)*(_minimumConversions))] call life_fnc_handleInv; - } count _newItem; - - "progressBar" cutText ["","PLAIN"]; - if (_minimumConversions isEqualTo (_totalConversions call BIS_fnc_lowestNum)) then {hint localize "STR_NOTF_ItemProcess";} else {hint localize "STR_Process_Partial";}; - life_is_processing = false; life_action_inUse = false; -} else { - if (CASH < _cost) exitWith {hint format [localize "STR_Process_License",[_cost] call life_fnc_numberText]; "progressBar" cutText ["","PLAIN"]; life_is_processing = false; life_action_inUse = false;}; - - for "_i" from 0 to 1 step 0 do { - uiSleep 0.9; - _cP = _cP + 0.01; - _progress progressSetPosition _cP; - _pgText ctrlSetText format ["%3 (%1%2)...",round(_cP * 100),"%",_upp]; - if (_cP >= 1) exitWith {}; - if (player distance _vendor > 10) exitWith {}; - }; - - if (player distance _vendor > 10) exitWith {hint localize "STR_Process_Stay"; "progressBar" cutText ["","PLAIN"]; life_is_processing = false; life_action_inUse = false;}; - if (CASH < _cost) exitWith {hint format [localize "STR_Process_License",[_cost] call life_fnc_numberText]; "progressBar" cutText ["","PLAIN"]; life_is_processing = false; life_action_inUse = false;}; - - { - [false,(_x select 0),((_x select 1)*(_minimumConversions))] call life_fnc_handleInv; - } count _oldItem; - - { - [true,(_x select 0),((_x select 1)*(_minimumConversions))] call life_fnc_handleInv; - } count _newItem; - - "progressBar" cutText ["","PLAIN"]; - if (_minimumConversions isEqualTo (_totalConversions call BIS_fnc_lowestNum)) then {hint localize "STR_NOTF_ItemProcess";} else {hint localize "STR_Process_Partial";}; - CASH = CASH - _cost; - [0] call SOCK_fnc_updatePartial; - life_is_processing = false; - life_action_inUse = false; -}; +#include "..\..\script_macros.hpp" +/* + File: fn_processAction.sqf + Author: Bryan "Tonic" Boardwine + Modified : NiiRoZz + + Description: + Master handling for processing an item. + NiiRoZz : Added multiprocess +*/ + +scopeName "main"; + +params [ + ["_vendor", objNull, [objNull]], + "", + "", + ["_type", "", [""]] + +]; + +//Error check +if (isNull _vendor || {_type isEqualTo ""} || {player distance _vendor > 10}) exitWith {}; + +if !(isClass (missionConfigFile >> "ProcessAction" >> _type)) exitWith { + diag_log format ["%1: Processor class doesn't exist",_type]; +}; + +private _materialsRequired = M_CONFIG(getArray,"ProcessAction",_type,"MaterialsReq"); +if (_materialsRequired isEqualTo []) exitWith {}; + +life_action_inUse = true; +private _materialsGiven = M_CONFIG(getArray,"ProcessAction",_type,"MaterialsGive"); +private _noLicenseCost = M_CONFIG(getNumber,"ProcessAction",_type,"NoLicenseCost"); +private _text = M_CONFIG(getText,"ProcessAction",_type,"Text"); + +if (isLocalized _text) then { + _text = localize _text; +}; + +private _totalConversions = []; +{ + _x params [ + "_var", + "_noRequired" + ]; + + private _var = ITEM_VALUE(_var); + + if (_var isEqualTo 0 || {_var < _noRequired}) then { + hint localize "STR_NOTF_NotEnoughItemProcess"; + life_action_inUse = false; + breakOut "main"; + }; + _totalConversions pushBack (floor (_var / _noRequired)); + + true +} count _materialsRequired; + +private _hasLicense = true; +if !(_vendor in [mari_processor,coke_processor,heroin_processor]) then { + _hasLicense = LICENSE_VALUE(_type,"civ"); +}; + +_noLicenseCost = _noLicenseCost * (count _materialsRequired); + +private _minimumConversions = selectMin _totalConversions; +private _materialsRequiredWeight = 0; +{ + _x params ["_item","_count"]; + private _weight = ([_item] call life_fnc_itemWeight) * _count; + _materialsRequiredWeight = _materialsRequiredWeight + _weight; + true +} count _materialsRequired; + +private _materialsGivenWeight = 0; +{ + _x params ["_item","_count"]; + private _weight = ([_item] call life_fnc_itemWeight) * _count; + _materialsGivenWeight = _materialsGivenWeight + _weight; + true +} count _materialsGiven; + +if (_materialsGivenWeight > _materialsRequiredWeight) then { + private _netChange = _materialsGivenWeight - _materialsRequiredWeight; + private _freeSpace = life_maxWeight - life_carryWeight; + + if (_freeSpace < _netChange) then { + hint localize "STR_Process_Weight"; + life_action_inUse = false; + breakOut "main"; + }; + + private _estConversions = floor(_freeSpace / _netChange); + if (_estConversions < _minimumConversions) then { + _minimumConversions = _estConversions; + }; +}; + +//Setup our progress bar. +disableSerialization; +"progressBar" cutRsc ["life_progress","PLAIN"]; +private _ui = uiNamespace getVariable "life_progress"; +private _progress = _ui displayCtrl 38201; +private _pgText = _ui displayCtrl 38202; +_pgText ctrlSetText format ["%2 (1%1)...","%",_text]; +_progress progressSetPosition 0.01; +private _cP = 0.01; + +life_is_processing = true; + +if (_hasLicense) then { + for "_i" from 0 to 1 step 0 do { + uiSleep 0.28; + _cP = _cP + 0.01; + _progress progressSetPosition _cP; + _pgText ctrlSetText format ["%3 (%1%2)...",round(_cP * 100),"%",_text]; + if (_cP >= 1) exitWith {}; + if (player distance _vendor > 10) exitWith {}; + }; + if (player distance _vendor > 10) exitWith { + hint localize "STR_Process_Stay"; + "progressBar" cutText ["","PLAIN"]; + life_is_processing = false; + life_action_inUse = false; + }; + + { + _x params ["_item","_count"]; + [false,_item,_count * (_minimumConversions)] call life_fnc_handleInv; + true + } count _materialsRequired; + + { + _x params ["_item","_count"]; + [true,_item,_count * (_minimumConversions)] call life_fnc_handleInv; + true + } count _materialsGiven; + + "progressBar" cutText ["","PLAIN"]; + if (_minimumConversions isEqualTo (selectMin _totalConversions)) then { + hint localize "STR_NOTF_ItemProcess"; + } else { + hint localize "STR_Process_Partial"; + }; + + life_is_processing = false; + life_action_inUse = false; +} else { + if (CASH < _noLicenseCost) exitWith { + hint format [localize "STR_Process_License",[_noLicenseCost] call life_fnc_numberText]; + "progressBar" cutText ["","PLAIN"]; + life_is_processing = false; + life_action_inUse = false; + }; + + for "_i" from 0 to 1 step 0 do { + uiSleep 0.9; + _cP = _cP + 0.01; + _progress progressSetPosition _cP; + _pgText ctrlSetText format ["%3 (%1%2)...",round(_cP * 100),"%",_text]; + if (_cP >= 1) exitWith {}; + if (player distance _vendor > 10) exitWith {}; + }; + + if (player distance _vendor > 10) exitWith { + hint localize "STR_Process_Stay"; + "progressBar" cutText ["","PLAIN"]; + life_is_processing = false; + life_action_inUse = false; + }; + + if (CASH < _noLicenseCost) exitWith { + hint format [localize "STR_Process_License",[_noLicenseCost] call life_fnc_numberText]; + "progressBar" cutText ["","PLAIN"]; + life_is_processing = false; + life_action_inUse = false; + }; + + { + _x params ["_item","_count"]; + [false,_item,_count * (_minimumConversions)] call life_fnc_handleInv; + true + } count _materialsRequired; + + { + _x params ["_item","_count"]; + [true,_item,_count * (_minimumConversions)] call life_fnc_handleInv; + true + } count _materialsGiven; + + "progressBar" cutText ["","PLAIN"]; + if (_minimumConversions isEqualTo (selectMin _totalConversions)) then { + hint localize "STR_NOTF_ItemProcess"; + } else { + hint localize "STR_Process_Partial"; + }; + CASH = CASH - _noLicenseCost; + [0] call SOCK_fnc_updatePartial; + life_is_processing = false; + life_action_inUse = false; +}; diff --git a/Altis_Life.Altis/core/actions/fn_pulloutAction.sqf b/Altis_Life.Altis/core/actions/fn_pulloutAction.sqf index fc0383e9e..3a6094193 100644 --- a/Altis_Life.Altis/core/actions/fn_pulloutAction.sqf +++ b/Altis_Life.Altis/core/actions/fn_pulloutAction.sqf @@ -6,12 +6,14 @@ Description: Pulls civilians out of a car if it's stopped. */ -private ["_crew"]; -_crew = crew cursorObject; + +private _crew = crew cursorObject; { if !(side _x isEqualTo west) then { - _x setVariable ["transporting",false,true]; _x setVariable ["Escorting",false,true]; + _x setVariable ["transporting",false,true]; + _x setVariable ["Escorting",false,true]; [_x] remoteExecCall ["life_fnc_pulloutVeh",_x]; }; -} forEach _crew; + true +} count _crew; diff --git a/Altis_Life.Altis/core/actions/fn_putInCar.sqf b/Altis_Life.Altis/core/actions/fn_putInCar.sqf index a920b480e..dd2c80c34 100644 --- a/Altis_Life.Altis/core/actions/fn_putInCar.sqf +++ b/Altis_Life.Altis/core/actions/fn_putInCar.sqf @@ -1,19 +1,23 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_putInCar.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Finds the nearest vehicle and loads the target into the vehicle. -*/ -private ["_unit"]; -_unit = param [0,objNull,[objNull]]; -if (isNull _unit || !isPlayer _unit) exitWith {}; - -_nearestVehicle = nearestObjects[getPosATL player,["Car","Ship","Submarine","Air"],10] select 0; -if (isNil "_nearestVehicle") exitWith {hint localize "STR_NOTF_VehicleNear"}; - -detach _unit; -[_nearestVehicle] remoteExecCall ["life_fnc_moveIn",_unit]; -_unit setVariable ["Escorting",false,true]; -_unit setVariable ["transporting",true,true]; \ No newline at end of file +#include "..\..\script_macros.hpp" +/* + File: fn_putInCar.sqf + Author: Bryan "Tonic" Boardwine + + Description: + Finds the nearest vehicle and loads the target into the vehicle. +*/ +params [ + ["_unit", objNull, [objNull]] +]; + +if (isNull _unit || {!isPlayer _unit}) exitWith {}; + +(nearestObjects[getPosATL player,["Car","Ship","Submarine","Air"], 10]) params [["_nearestVehicle", objNull, [objNull]]]; +if (isNull _nearestVehicle) exitWith { + hint localize "STR_NOTF_VehicleNear" +}; + +detach _unit; +[_nearestVehicle] remoteExecCall ["life_fnc_moveIn",_unit]; +_unit setVariable ["Escorting",false,true]; +_unit setVariable ["transporting",true,true]; diff --git a/Altis_Life.Altis/core/actions/fn_removeContainer.sqf b/Altis_Life.Altis/core/actions/fn_removeContainer.sqf index fbe4d75e4..2f2263dcc 100644 --- a/Altis_Life.Altis/core/actions/fn_removeContainer.sqf +++ b/Altis_Life.Altis/core/actions/fn_removeContainer.sqf @@ -1,48 +1,54 @@ -#include "..\..\script_macros.hpp" -/* - File : removeContainer.sqf - Author: NiiRoZz - - Description: - Delete Container from house storage -*/ -private ["_house","_action","_container","_containerType","_containers"]; -_container = param [0,objNull,[objNull]]; -_containerType = typeOf _container; -_house = nearestObject [player, "House"]; -if (!(_house in life_vehicles)) exitWith {hint localize "STR_ISTR_Box_NotinHouse"}; -if (isNull _container) exitWith {}; -_containers = _house getVariable ["containers",[]]; -closeDialog 0; - -_action = [ - format [localize "STR_House_DeleteContainerMSG"],localize "STR_pInAct_RemoveContainer",localize "STR_Global_Remove",localize "STR_Global_Cancel" -] call BIS_fnc_guiMessage; - -if (_action) then { - private ["_box","_diff"]; - _box = switch (_containerType) do { - case ("B_supplyCrate_F"): {"storagebig"}; - case ("Box_IND_Grenades_F"): {"storagesmall"}; - default {"None"}; - }; - if (_box == "None") exitWith {}; - - _diff = [_box,1,life_carryWeight,life_maxWeight] call life_fnc_calWeightDiff; - if (_diff isEqualTo 0) exitWith {hint localize "STR_NOTF_InvFull"}; - - if (life_HC_isActive) then { - [_container] remoteExecCall ["HC_fnc_deleteDBContainer",HC_Life]; - } else { - [_container] remoteExecCall ["TON_fnc_deleteDBContainer",RSERV]; - }; - - { - if (_x == _container) then { - _containers deleteAt _forEachIndex; - }; - } forEach _containers; - _house setVariable ["containers",_containers,true]; - - [true,_box,1] call life_fnc_handleInv; -}; +#include "..\..\script_macros.hpp" +/* + File : removeContainer.sqf + Author: NiiRoZz + + Description: + Delete Container from house storage +*/ + +params [ + ["_container", objNull, [objNull]] +]; +if (isNull _container) exitWith {}; + +private _containerType = typeOf _container; +private _house = nearestObject [player, "House"]; + +if !(_house in life_vehicles) exitWith { + hint localize "STR_ISTR_Box_NotinHouse" +}; + +private _containers = _house getVariable ["containers",[]]; +closeDialog 0; + +private _action = [ + format [localize "STR_House_DeleteContainerMSG"],localize "STR_pInAct_RemoveContainer",localize "STR_Global_Remove",localize "STR_Global_Cancel" +] call BIS_fnc_guiMessage; + +if (_action) then { + private _box = switch _containerType do { + case "B_supplyCrate_F": {"storagebig"}; + case "Box_IND_Grenades_F": {"storagesmall"}; + default {"None"}; + }; + if (_box isEqualTo "None") exitWith {}; + + private _diff = [_box,1,life_carryWeight,life_maxWeight] call life_fnc_calWeightDiff; + if (_diff isEqualTo 0) exitWith {hint localize "STR_NOTF_InvFull"}; + + if (life_HC_isActive) then { + [_container] remoteExecCall ["HC_fnc_deleteDBContainer",HC_Life]; + } else { + [_container] remoteExecCall ["TON_fnc_deleteDBContainer",RSERV]; + }; + + { + if (_x isEqualTo _container) then { + _containers deleteAt _forEachIndex; + }; + } forEach _containers; + _house setVariable ["containers",_containers,true]; + + [true,_box,1] call life_fnc_handleInv; +}; diff --git a/Altis_Life.Altis/core/actions/fn_repairTruck.sqf b/Altis_Life.Altis/core/actions/fn_repairTruck.sqf index ebe562142..9a9bbdf67 100644 --- a/Altis_Life.Altis/core/actions/fn_repairTruck.sqf +++ b/Altis_Life.Altis/core/actions/fn_repairTruck.sqf @@ -1,71 +1,73 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_repairTruck.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Main functionality for toolkits, to be revised in later version. -*/ -private ["_veh","_upp","_ui","_progress","_pgText","_cP","_displayName","_test","_sideRepairArray"]; -_veh = cursorObject; -life_interrupted = false; -if (isNull _veh) exitWith {}; -if ((_veh isKindOf "Car") || (_veh isKindOf "Ship") || (_veh isKindOf "Air")) then { - if (life_inv_toolkit > 0) then { - life_action_inUse = true; - _displayName = FETCH_CONFIG2(getText,"CfgVehicles",(typeOf _veh),"displayName"); - _upp = format [localize "STR_NOTF_Repairing",_displayName]; - - //Setup our progress bar. - disableSerialization; - "progressBar" cutRsc ["life_progress","PLAIN"]; - _ui = uiNamespace getVariable "life_progress"; - _progress = _ui displayCtrl 38201; - _pgText = _ui displayCtrl 38202; - _pgText ctrlSetText format ["%2 (1%1)...","%",_upp]; - _progress progressSetPosition 0.01; - _cP = 0.01; - - for "_i" from 0 to 1 step 0 do { - if (animationState player != "AinvPknlMstpSnonWnonDnon_medic_1") then { - [player,"AinvPknlMstpSnonWnonDnon_medic_1",true] remoteExecCall ["life_fnc_animSync",RCLIENT]; - player switchMove "AinvPknlMstpSnonWnonDnon_medic_1"; - player playMoveNow "AinvPknlMstpSnonWnonDnon_medic_1"; - }; - - uiSleep 0.27; - _cP = _cP + 0.01; - _progress progressSetPosition _cP; - _pgText ctrlSetText format ["%3 (%1%2)...",round(_cP * 100),"%",_upp]; - if (_cP >= 1) exitWith {}; - if (!alive player) exitWith {}; - if !(isNull objectParent player) exitWith {}; - if (life_interrupted) exitWith {}; - }; - - life_action_inUse = false; - "progressBar" cutText ["","PLAIN"]; - player playActionNow "stop"; - if (life_interrupted) exitWith {life_interrupted = false; titleText[localize "STR_NOTF_ActionCancel","PLAIN"]; life_action_inUse = false;}; - if !(isNull objectParent player) exitWith {titleText[localize "STR_NOTF_ActionInVehicle","PLAIN"];}; - - _sideRepairArray = LIFE_SETTINGS(getArray,"vehicle_infiniteRepair"); - - //Check if playerSide has infinite repair enabled - if (playerSide isEqualTo civilian && (_sideRepairArray select 0) isEqualTo 0) then { - [false,"toolkit",1] call life_fnc_handleInv; - }; - if (playerSide isEqualTo west && (_sideRepairArray select 1) isEqualTo 0) then { - [false,"toolkit",1] call life_fnc_handleInv; - }; - if (playerSide isEqualTo independent && (_sideRepairArray select 2) isEqualTo 0) then { - [false,"toolkit",1] call life_fnc_handleInv; - }; - if (playerSide isEqualTo east && (_sideRepairArray select 3) isEqualTo 0) then { - [false,"toolkit",1] call life_fnc_handleInv; - }; - - _veh setDamage 0; - titleText[localize "STR_NOTF_RepairedVehicle","PLAIN"]; - }; -}; +#include "..\..\script_macros.hpp" +/* + File: fn_repairTruck.sqf + Author: Bryan "Tonic" Boardwine + + Description: + Main functionality for toolkits, to be revised in later version. +*/ + +private _veh = cursorObject; +life_interrupted = false; + +if (isNull _veh) exitWith {}; +if ((_veh isKindOf "Car") || (_veh isKindOf "Ship") || (_veh isKindOf "Air")) then { + if (life_inv_toolkit > 0) then { + life_action_inUse = true; + private _displayName = FETCH_CONFIG2(getText,"CfgVehicles",(typeOf _veh),"displayName"); + private _upp = format [localize "STR_NOTF_Repairing",_displayName]; + + //Setup our progress bar. + disableSerialization; + "progressBar" cutRsc ["life_progress","PLAIN"]; + private _ui = uiNamespace getVariable "life_progress"; + private _progress = _ui displayCtrl 38201; + private _pgText = _ui displayCtrl 38202; + _pgText ctrlSetText format ["%2 (1%1)...","%",_upp]; + _progress progressSetPosition 0.01; + private _cP = 0.01; + + for "_i" from 0 to 1 step 0 do { + if (animationState player != "AinvPknlMstpSnonWnonDnon_medic_1") then { + [player,"AinvPknlMstpSnonWnonDnon_medic_1",true] remoteExecCall ["life_fnc_animSync",RCLIENT]; + player switchMove "AinvPknlMstpSnonWnonDnon_medic_1"; + player playMoveNow "AinvPknlMstpSnonWnonDnon_medic_1"; + }; + + uiSleep 0.27; + _cP = _cP + 0.01; + _progress progressSetPosition _cP; + _pgText ctrlSetText format ["%3 (%1%2)...",round(_cP * 100),"%",_upp]; + if (_cP >= 1) exitWith {}; + if (!alive player) exitWith {}; + if !(isNull objectParent player) exitWith {}; + if (life_interrupted) exitWith {}; + }; + + life_action_inUse = false; + "progressBar" cutText ["","PLAIN"]; + player playActionNow "stop"; + if (life_interrupted) exitWith {life_interrupted = false; titleText[localize "STR_NOTF_ActionCancel","PLAIN"]; life_action_inUse = false;}; + if !(isNull objectParent player) exitWith {titleText[localize "STR_NOTF_ActionInVehicle","PLAIN"];}; + + private _sideRepairArray = LIFE_SETTINGS(getArray,"vehicle_infiniteRepair"); + + //Check if playerSide has infinite repair enabled + call { + if (playerSide isEqualTo civilian && (_sideRepairArray select 0) isEqualTo 0) exitWith { + [false,"toolkit",1] call life_fnc_handleInv; + }; + if (playerSide isEqualTo west && (_sideRepairArray select 1) isEqualTo 0) exitWith { + [false,"toolkit",1] call life_fnc_handleInv; + }; + if (playerSide isEqualTo independent && (_sideRepairArray select 2) isEqualTo 0) exitWith { + [false,"toolkit",1] call life_fnc_handleInv; + }; + if (playerSide isEqualTo east && (_sideRepairArray select 3) isEqualTo 0) exitWith { + [false,"toolkit",1] call life_fnc_handleInv; + }; + }; + _veh setDamage 0; + titleText[localize "STR_NOTF_RepairedVehicle","PLAIN"]; + }; +}; diff --git a/Altis_Life.Altis/core/actions/fn_restrainAction.sqf b/Altis_Life.Altis/core/actions/fn_restrainAction.sqf index cfc09bb96..d305128ff 100644 --- a/Altis_Life.Altis/core/actions/fn_restrainAction.sqf +++ b/Altis_Life.Altis/core/actions/fn_restrainAction.sqf @@ -6,16 +6,16 @@ Description: Restrains the target. */ -private ["_unit"]; -_unit = cursorObject; -if (isNull _unit) exitWith {}; //Not valid + +private _unit = cursorObject; +if (isNull _unit) exitWith {}; if (player distance _unit > 3) exitWith {}; if (_unit getVariable "restrained") exitWith {}; if (side _unit isEqualTo west) exitWith {}; if (player isEqualTo _unit) exitWith {}; if (!isPlayer _unit) exitWith {}; -//Broadcast! +//Broadcast! _unit setVariable ["playerSurrender",false,true]; _unit setVariable ["restrained",true,true]; [player] remoteExec ["life_fnc_restrain",_unit]; diff --git a/Altis_Life.Altis/core/actions/fn_robAction.sqf b/Altis_Life.Altis/core/actions/fn_robAction.sqf index 29d30ebdb..1e5ad475f 100644 --- a/Altis_Life.Altis/core/actions/fn_robAction.sqf +++ b/Altis_Life.Altis/core/actions/fn_robAction.sqf @@ -15,4 +15,4 @@ if (!isPlayer _target) exitWith {}; if (_target getVariable ["robbed",false]) exitWith {}; [player] remoteExecCall ["life_fnc_robPerson",_target]; -_target setVariable ["robbed",true,true]; +_target setVariable ["robbed",true,true]; \ No newline at end of file diff --git a/Altis_Life.Altis/core/actions/fn_searchAction.sqf b/Altis_Life.Altis/core/actions/fn_searchAction.sqf index da370aaad..3ed8a638d 100644 --- a/Altis_Life.Altis/core/actions/fn_searchAction.sqf +++ b/Altis_Life.Altis/core/actions/fn_searchAction.sqf @@ -8,9 +8,14 @@ params [ ["_unit",objNull,[objNull]] ]; + if (isNull _unit) exitWith {}; + hint localize "STR_NOTF_Searching"; sleep 2; -if (player distance _unit > 5 || !alive player || !alive _unit) exitWith {hint localize "STR_NOTF_CannotSearchPerson"}; + +if (player distance _unit > 5 || {!alive player} || {!alive _unit}) exitWith { + hint localize "STR_NOTF_CannotSearchPerson" +}; [player] remoteExec ["life_fnc_searchClient",_unit]; life_action_inUse = true; \ No newline at end of file diff --git a/Altis_Life.Altis/core/actions/fn_searchVehAction.sqf b/Altis_Life.Altis/core/actions/fn_searchVehAction.sqf index d0bccd4e7..0a32f3f93 100644 --- a/Altis_Life.Altis/core/actions/fn_searchVehAction.sqf +++ b/Altis_Life.Altis/core/actions/fn_searchVehAction.sqf @@ -6,10 +6,11 @@ Description: */ -private ["_vehicle","_data"]; -_vehicle = cursorObject; -if ((_vehicle isKindOf "Car") || !(_vehicle isKindOf "Air") || !(_vehicle isKindOf "Ship")) then { - _owners = _vehicle getVariable "vehicle_info_owners"; + +private _vehicle = cursorObject; + +if (_vehicle isKindOf "Car" || {!(_vehicle isKindOf "Air")} || {!(_vehicle isKindOf "Ship")}) then { + private _owners = _vehicle getVariable "vehicle_info_owners"; if (isNil "_owners") exitWith {hint localize "STR_NOTF_VehCheat"; deleteVehicle _vehicle;}; life_action_inUse = true; diff --git a/Altis_Life.Altis/core/actions/fn_seizePlayerAction.sqf b/Altis_Life.Altis/core/actions/fn_seizePlayerAction.sqf index c8d8244de..f1eea2f43 100644 --- a/Altis_Life.Altis/core/actions/fn_seizePlayerAction.sqf +++ b/Altis_Life.Altis/core/actions/fn_seizePlayerAction.sqf @@ -10,8 +10,11 @@ params [ ["_unit",objNull,[objNull]] ]; + if (isNull _unit) exitWith {}; + sleep 2; + if (player distance _unit > 5 || !alive player || !alive _unit) exitWith {hint localize "STR_NOTF_CannotSeizePerson"}; [player] remoteExec ["life_fnc_seizeClient",_unit]; life_action_inUse = false; \ No newline at end of file diff --git a/Altis_Life.Altis/core/actions/fn_serviceChopper.sqf b/Altis_Life.Altis/core/actions/fn_serviceChopper.sqf index ffa7b16c1..c9254366c 100644 --- a/Altis_Life.Altis/core/actions/fn_serviceChopper.sqf +++ b/Altis_Life.Altis/core/actions/fn_serviceChopper.sqf @@ -1,50 +1,59 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_serviceChopper.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Main functionality for the chopper service paid, to be replaced in later version. -*/ -private ["_serviceCost"]; -disableSerialization; -private ["_search","_ui","_progress","_cP","_pgText"]; -if (life_action_inUse) exitWith {hint localize "STR_NOTF_Action"}; - -_serviceCost = LIFE_SETTINGS(getNumber,"service_chopper"); -_search = nearestObjects[getPos air_sp, ["Air"],10]; - -if (count _search isEqualTo 0) exitWith {hint localize "STR_Service_Chopper_NoAir"}; -if (CASH < _serviceCost) exitWith {hint localize "STR_Serive_Chopper_NotEnough"}; - -life_action_inUse = true; -"progressBar" cutRsc ["life_progress","PLAIN"]; -_ui = uiNamespace getVariable "life_progress"; -_progress = _ui displayCtrl 38201; -_pgText = _ui displayCtrl 38202; -_pgText ctrlSetText format [localize "STR_Service_Chopper_Servicing","waiting..."]; -_progress progressSetPosition 0.01; -_cP = 0.01; - -for "_i" from 0 to 1 step 0 do { - uiSleep 0.2; - _cP = _cP + 0.01; - _progress progressSetPosition _cP; - _pgText ctrlSetText format [localize "STR_Service_Chopper_Servicing",round(_cP * 100)]; - if (_cP >= 1) exitWith {}; -}; - -if (!alive (_search select 0) || (_search select 0) distance air_sp > 15) exitWith {life_action_inUse = false; hint localize "STR_Service_Chopper_Missing"}; - -CASH = CASH - _serviceCost; -if (!local (_search select 0)) then { - [(_search select 0),1] remoteExecCall ["life_fnc_setFuel",(_search select 0)]; -} else { - (_search select 0) setFuel 1; -}; - -(_search select 0) setDamage 0; - -"progressBar" cutText ["","PLAIN"]; -titleText [localize "STR_Service_Chopper_Done","PLAIN"]; -life_action_inUse = false; +#include "..\..\script_macros.hpp" +/* + File: fn_serviceChopper.sqf + Author: Bryan "Tonic" Boardwine + + Description: + Main functionality for the chopper service paid, to be replaced in later version. +*/ + +disableSerialization; + +if (life_action_inUse) exitWith {hint localize "STR_NOTF_Action"}; + +private _serviceCost = LIFE_SETTINGS(getNumber,"service_chopper"); +private _search = nearestObjects [getPos air_sp, ["Air"], 10]; + +if (_search isEqualTo []) exitWith { + hint localize "STR_Service_Chopper_NoAir" +}; +if (CASH < _serviceCost) exitWith { + hint format [localize "STR_Service_Chopper_NotEnough", _serviceCost]; +}; + +life_action_inUse = true; +"progressBar" cutRsc ["life_progress","PLAIN"]; +private _ui = uiNamespace getVariable "life_progress"; +private _progress = _ui displayCtrl 38201; +private _pgText = _ui displayCtrl 38202; +_pgText ctrlSetText format [localize "STR_Service_Chopper_Servicing","waiting..."]; +_progress progressSetPosition 0.01; +private _cP = 0.01; + +for "_i" from 0 to 1 step 0 do { + uiSleep 0.2; + _cP = _cP + 0.01; + _progress progressSetPosition _cP; + _pgText ctrlSetText format [localize "STR_Service_Chopper_Servicing",round(_cP * 100)]; + if (_cP >= 1) exitWith {}; +}; + +_search params ["_nearestChopper"]; + +if (!alive _nearestChopper || {_nearestChopper distance air_sp > 15}) exitWith { + life_action_inUse = false; + hint localize "STR_Service_Chopper_Missing" +}; + +CASH = CASH - _serviceCost; +if (!local _nearestChopper) then { + [_nearestChopper,1] remoteExecCall ["life_fnc_setFuel",_nearestChopper]; +} else { + _nearestChopper setFuel 1; +}; + +_nearestChopper setDamage 0; + +"progressBar" cutText ["","PLAIN"]; +titleText [localize "STR_Service_Chopper_Done","PLAIN"]; +life_action_inUse = false; diff --git a/Altis_Life.Altis/core/actions/fn_stopEscorting.sqf b/Altis_Life.Altis/core/actions/fn_stopEscorting.sqf index 791ef14d8..36d84a60c 100644 --- a/Altis_Life.Altis/core/actions/fn_stopEscorting.sqf +++ b/Altis_Life.Altis/core/actions/fn_stopEscorting.sqf @@ -13,4 +13,4 @@ if (isNull _unit) exitWith {}; //Target not found even after using cursorTarget. if (!(_unit getVariable ["Escorting",false])) exitWith {}; //He's not being Escorted. detach _unit; _unit setVariable ["Escorting",false,true]; -player setVariable ["isEscorting",false]; +player setVariable ["isEscorting",false]; \ No newline at end of file diff --git a/Altis_Life.Altis/core/actions/fn_storeVehicle.sqf b/Altis_Life.Altis/core/actions/fn_storeVehicle.sqf index 5de3baf66..6f5522ea5 100644 --- a/Altis_Life.Altis/core/actions/fn_storeVehicle.sqf +++ b/Altis_Life.Altis/core/actions/fn_storeVehicle.sqf @@ -1,41 +1,50 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_storeVehicle.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Stores the vehicle in the garage. -*/ -private ["_nearVehicles","_vehicle"]; -if !(isNull objectParent player) then { - _vehicle = vehicle player; -} else { - _nearVehicles = nearestObjects[getPos (_this select 0),["Car","Air","Ship"],30]; //Fetch vehicles within 30m. - if (count _nearVehicles > 0) then { - { - if (!isNil "_vehicle") exitWith {}; //Kill the loop. - _vehData = _x getVariable ["vehicle_info_owners",[]]; - if (count _vehData > 0) then { - _vehOwner = ((_vehData select 0) select 0); - if ((getPlayerUID player) == _vehOwner) exitWith { - _vehicle = _x; - }; - }; - } forEach _nearVehicles; - }; -}; - -if (isNil "_vehicle") exitWith {hint localize "STR_Garage_NoNPC"}; -if (isNull _vehicle) exitWith {}; -if (!alive _vehicle) exitWith {hint localize "STR_Garage_SQLError_Destroyed"}; - -_storetext = localize "STR_Garage_Store_Success"; - -if (life_HC_isActive) then { - [_vehicle,false,(_this select 1),_storetext] remoteExec ["HC_fnc_vehicleStore",HC_Life]; -} else { - [_vehicle,false,(_this select 1),_storetext] remoteExec ["TON_fnc_vehicleStore",RSERV]; -}; - -hint localize "STR_Garage_Store_Server"; -life_garage_store = true; +#include "..\..\script_macros.hpp" +/* + File: fn_storeVehicle.sqf + Author: Bryan "Tonic" Boardwine + + Description: + Stores the vehicle in the garage. +*/ +params [ + ["_garage", objNull, [objNull]], + ["_unit", objNull, [objNull]] +]; + +private _vehicle = objNull; +if !(isNull objectParent player) then { + _vehicle = vehicle player; +} else { + private _nearVehicles = nearestObjects[getPos _garage,["Car","Air","Ship"],30]; //Fetch vehicles within 30m. + if !(_nearVehicles isEqualTo []) then { + { + if (!isNil "_vehicle") exitWith {}; //Kill the loop. + private _vehData = _x getVariable ["vehicle_info_owners",[]]; + if (count _vehData > 0) then { + private _vehOwner = ((_vehData select 0) select 0); + if (getPlayerUID player isEqualTo _vehOwner) exitWith { + _vehicle = _x; + }; + }; + true + } count _nearVehicles; + }; +}; + +if (isNull _vehicle) exitWith { + hint localize "STR_Garage_NoNPC" +}; +if (!alive _vehicle) exitWith { + hint localize "STR_Garage_SQLError_Destroyed" +}; + +private _storetext = localize "STR_Garage_Store_Success"; + +if (life_HC_isActive) then { + [_vehicle,false,_unit,_storetext] remoteExec ["HC_fnc_vehicleStore",HC_Life]; +} else { + [_vehicle,false,_unit,_storetext] remoteExec ["TON_fnc_vehicleStore",RSERV]; +}; + +hint localize "STR_Garage_Store_Server"; +life_garage_store = true; diff --git a/Altis_Life.Altis/core/actions/fn_surrender.sqf b/Altis_Life.Altis/core/actions/fn_surrender.sqf index 731687228..cb11f11b6 100644 --- a/Altis_Life.Altis/core/actions/fn_surrender.sqf +++ b/Altis_Life.Altis/core/actions/fn_surrender.sqf @@ -5,20 +5,19 @@ Description: Causes player to put their hands on their head. */ -if ( player getVariable ["restrained",false] ) exitWith {}; -if ( player getVariable ["Escorting",false] ) exitWith {}; -if ( vehicle player != player ) exitWith {}; -if ( speed player > 1 ) exitWith {}; +if (player getVariable ["restrained",false]) exitWith {}; +if (player getVariable ["Escorting",false]) exitWith {}; +if (!isNull objectParent player) exitWith {}; +if (speed player > 1) exitWith {}; -if (player getVariable ["playerSurrender",false]) then { - player setVariable ["playerSurrender",false,true]; -} else { - player setVariable ["playerSurrender",true,true]; -}; +private _currentState = player getVariable ["playerSurrender",false]; +player setVariable ["playerSurrender", !_currentState, true]; while {player getVariable ["playerSurrender",false]} do { player playMove "AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon"; - if (!alive player || !(isNull objectParent player)) then { player setVariable ["playerSurrender",false,true]; }; + if (!alive player || {!isNull objectParent player}) then { + player setVariable ["playerSurrender",false,true]; + }; }; player playMoveNow "AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon"; diff --git a/Altis_Life.Altis/core/actions/fn_ticketAction.sqf b/Altis_Life.Altis/core/actions/fn_ticketAction.sqf index 7ac77c7a4..3a4e1ccdb 100644 --- a/Altis_Life.Altis/core/actions/fn_ticketAction.sqf +++ b/Altis_Life.Altis/core/actions/fn_ticketAction.sqf @@ -1,15 +1,18 @@ -/* - File: fn_ticketAction.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Starts the ticketing process. -*/ -params [ - ["_unit",objNull,[objNull]] -]; -disableSerialization; -if (!(createDialog "life_ticket_give")) exitWith {hint localize "STR_Cop_TicketFail"}; -if (isNull _unit || !isPlayer _unit) exitWith {}; -ctrlSetText[2651,format [localize "STR_Cop_Ticket",_unit getVariable ["realname",name _unit]]]; -life_ticket_unit = _unit; \ No newline at end of file +/* + File: fn_ticketAction.sqf + Author: Bryan "Tonic" Boardwine + + Description: + Starts the ticketing process. +*/ +params [ + ["_unit",objNull,[objNull]] +]; + +if !(createDialog "life_ticket_give") exitWith { + hint localize "STR_Cop_TicketFail" +}; +if (isNull _unit || {!isPlayer _unit}) exitWith {}; + +ctrlSetText [2651,format [localize "STR_Cop_Ticket",_unit getVariable ["realname",name _unit]]]; +life_ticket_unit = _unit; diff --git a/Altis_Life.Altis/core/actions/fn_unrestrain.sqf b/Altis_Life.Altis/core/actions/fn_unrestrain.sqf index 5ff967dcc..6efe98993 100644 --- a/Altis_Life.Altis/core/actions/fn_unrestrain.sqf +++ b/Altis_Life.Altis/core/actions/fn_unrestrain.sqf @@ -6,9 +6,12 @@ Description: */ -private ["_unit"]; -_unit = param [0,objNull,[objNull]]; -if (isNull _unit || !(_unit getVariable ["restrained",false])) exitWith {}; //Error check? + +params [ + ["_unit",objNull,[objNull]] +]; + +if (isNull _unit || {!(_unit getVariable ["restrained",false])}) exitWith {}; _unit setVariable ["restrained",false,true]; _unit setVariable ["Escorting",false,true]; diff --git a/Altis_Life.Altis/core/admin/fn_adminCompensate.sqf b/Altis_Life.Altis/core/admin/fn_adminCompensate.sqf index 2e5d74d70..48f9b0836 100644 --- a/Altis_Life.Altis/core/admin/fn_adminCompensate.sqf +++ b/Altis_Life.Altis/core/admin/fn_adminCompensate.sqf @@ -4,15 +4,22 @@ Author: ColinM9991 Description: - Figure it out. + Gives compensation money to the local player */ -private ["_value","_action"]; -if (FETCH_CONST(life_adminlevel) < 2) exitWith {closeDialog 0; hint localize "STR_ANOTF_ErrorLevel";}; -_value = parseNumber(ctrlText 9922); + +if (FETCH_CONST(life_adminlevel) < 2) exitWith { + closeDialog 0; + hint localize "STR_ANOTF_ErrorLevel"; +}; + +private _value = parseNumber(ctrlText 9922); + if (_value < 0) exitWith {}; -if (_value > 999999) exitWith {hint localize "STR_ANOTF_Fail"}; +if (_value > 999999) exitWith { + hint localize "STR_ANOTF_Fail" +}; -_action = [ +private _action = [ format [localize "STR_ANOTF_CompWarn",[_value] call life_fnc_numberText], localize "STR_Admin_Compensate", localize "STR_Global_Yes", @@ -22,8 +29,8 @@ _action = [ if (_action) then { CASH = CASH + _value; hint format [localize "STR_ANOTF_Success",[_value] call life_fnc_numberText]; - closeDialog 0; } else { hint localize "STR_NOTF_ActionCancel"; - closeDialog 0; }; + +closeDialog 0; diff --git a/Altis_Life.Altis/core/admin/fn_adminDebugCon.sqf b/Altis_Life.Altis/core/admin/fn_adminDebugCon.sqf index 248b82da1..6ef6b3651 100644 --- a/Altis_Life.Altis/core/admin/fn_adminDebugCon.sqf +++ b/Altis_Life.Altis/core/admin/fn_adminDebugCon.sqf @@ -6,7 +6,11 @@ Description: Opens the Debug Console. */ -if (FETCH_CONST(life_adminlevel) < 5) exitWith {closeDialog 0; hint localize "STR_NOTF_adminDebugCon";}; +if (FETCH_CONST(life_adminlevel) < 5) exitWith { + closeDialog 0; + hint localize "STR_NOTF_adminDebugCon"; +}; + life_admin_debug = true; createDialog "RscDisplayDebugPublic"; diff --git a/Altis_Life.Altis/core/admin/fn_adminFreeze.sqf b/Altis_Life.Altis/core/admin/fn_adminFreeze.sqf index e34c452f2..ccbece27e 100644 --- a/Altis_Life.Altis/core/admin/fn_adminFreeze.sqf +++ b/Altis_Life.Altis/core/admin/fn_adminFreeze.sqf @@ -1,16 +1,19 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_adminFreeze.sqf - Author: ColinM9991 - - Description: Freezes selected player -*/ -if (FETCH_CONST(life_adminlevel) < 4) exitWith {closeDialog 0; hint localize "STR_ANOTF_ErrorLevel";}; - -private _unit = lbData[2902,lbCurSel (2902)]; -_unit = call compile format ["%1", _unit]; -if (isNil "_unit") exitWith {}; -if (isNull _unit) exitWith {}; -if (_unit == player) exitWith {hint localize "STR_ANOTF_Error";}; - -[player] remoteExec ["life_fnc_freezePlayer",_unit]; +#include "..\..\script_macros.hpp" +/* + File: fn_adminFreeze.sqf + Author: ColinM9991 + + Description: Freezes selected player +*/ +if (FETCH_CONST(life_adminlevel) < 4) exitWith { + closeDialog 0; + hint localize "STR_ANOTF_ErrorLevel"; +}; + +private _unit = lbData[2902,lbCurSel (2902)]; +_unit = call compile format ["%1", _unit]; + +if (isNil "_unit" || {isNull _unit}) exitWith {}; +if (_unit isEqualTo player) exitWith {hint localize "STR_ANOTF_Error";}; + +[player] remoteExecCall ["life_fnc_freezePlayer",_unit]; diff --git a/Altis_Life.Altis/core/admin/fn_adminGetID.sqf b/Altis_Life.Altis/core/admin/fn_adminGetID.sqf index 3c84c1e43..45bc9e490 100644 --- a/Altis_Life.Altis/core/admin/fn_adminGetID.sqf +++ b/Altis_Life.Altis/core/admin/fn_adminGetID.sqf @@ -1,15 +1,15 @@ -/* - File: fn_adminGetID.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Fetches the selected ID of the player. - Used by in-game admins to issue bans/kicks. - https://community.bistudio.com/wiki/Multiplayer_Server_Commands -*/ -private _unit = lbData[2902,lbCurSel (2902)]; -_unit = call compile format ["%1", _unit]; -if (isNil "_unit") exitWith {}; -if (isNull _unit) exitWith {}; - -[_unit,player] remoteExecCall ["TON_fnc_getID",2]; \ No newline at end of file +/* + File: fn_adminGetID.sqf + Author: Bryan "Tonic" Boardwine + + Description: + Fetches the selected ID of the player. + Used by in-game admins to issue bans/kicks. + https://community.bistudio.com/wiki/Multiplayer_Server_Commands +*/ + +private _unit = lbData[2902,lbCurSel (2902)]; +_unit = call compile format ["%1", _unit]; +if (isNil "_unit" || {isNull _unit}) exitWith {}; + +[_unit,player] remoteExecCall ["TON_fnc_getID",2]; diff --git a/Altis_Life.Altis/core/admin/fn_adminGodMode.sqf b/Altis_Life.Altis/core/admin/fn_adminGodMode.sqf index f77c5bcc0..a1dd686cc 100644 --- a/Altis_Life.Altis/core/admin/fn_adminGodMode.sqf +++ b/Altis_Life.Altis/core/admin/fn_adminGodMode.sqf @@ -1,21 +1,24 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_adminGodMode.sqf - Author: Tobias 'Xetoxyc' Sittenauer - - Description: Enables God mode for Admin -*/ - -if (FETCH_CONST(life_adminlevel) < 4) exitWith {closeDialog 0; hint localize "STR_ANOTF_ErrorLevel";}; - -closeDialog 0; - -if (life_god) then { - life_god = false; - titleText [localize "STR_ANOTF_godModeOff","PLAIN"]; titleFadeOut 2; - player allowDamage true; -} else { - life_god = true; - titleText [localize "STR_ANOTF_godModeOn","PLAIN"]; titleFadeOut 2; - player allowDamage false; -}; \ No newline at end of file +#include "..\..\script_macros.hpp" +/* + File: fn_adminGodMode.sqf + Author: Tobias 'Xetoxyc' Sittenauer + + Description: Enables God mode for Admin +*/ + +if (FETCH_CONST(life_adminlevel) < 4) exitWith { + closeDialog 0; + hint localize "STR_ANOTF_ErrorLevel"; +}; + +closeDialog 0; + +if (life_god) then { + titleText [localize "STR_ANOTF_godModeOff","PLAIN"]; +} else { + titleText [localize "STR_ANOTF_godModeOn","PLAIN"]; +}; +titleFadeOut 2; + +player allowDamage life_god; +life_god = !life_god; diff --git a/Altis_Life.Altis/core/admin/fn_adminID.sqf b/Altis_Life.Altis/core/admin/fn_adminID.sqf index 5c9201391..509ad454d 100644 --- a/Altis_Life.Altis/core/admin/fn_adminID.sqf +++ b/Altis_Life.Altis/core/admin/fn_adminID.sqf @@ -1,14 +1,17 @@ -/* - File: fn_adminID.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Output information received to admin menu. -*/ -private ["_display","_ret","_text"]; -disableSerialization; -_ret = _this select 0; -_display = findDisplay 2900; -_text = _display displayCtrl 2903; - -_text ctrlSetStructuredText parseText format ["ID: %1",_ret]; \ No newline at end of file +/* + File: fn_adminID.sqf + Author: Bryan "Tonic" Boardwine + + Description: + Output information received to admin menu. +*/ + +disableSerialization; + +params [ + ["_ret", -1, [0]] +]; +private _display = findDisplay 2900; +private _text = _display displayCtrl 2903; + +_text ctrlSetStructuredText parseText format ["ID: %1",_ret]; diff --git a/Altis_Life.Altis/core/admin/fn_adminInfo.sqf b/Altis_Life.Altis/core/admin/fn_adminInfo.sqf index dc28a3edf..a2f8c40bf 100644 --- a/Altis_Life.Altis/core/admin/fn_adminInfo.sqf +++ b/Altis_Life.Altis/core/admin/fn_adminInfo.sqf @@ -1,46 +1,55 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_adminInfo.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Output information received to admin menu. -*/ -private ["_ret","_unit","_prim","_sec","_vest","_uni","_bp","_attach","_steamName","_secondary"]; -_ret = _this; -disableSerialization; - -_unit = _ret select 3; -_prim = if (!(primaryWeapon _unit isEqualTo "")) then { FETCH_CONFIG2(getText,"CfgWeapons",primaryWeapon _unit,"displayName")} else {"None"}; -_sec = if (!(handgunWeapon _unit isEqualTo "")) then { FETCH_CONFIG2(getText,"CfgWeapons",handgunWeapon _unit,"displayName")} else {"None"}; -_vest = if (!(vest _unit isEqualTo "")) then { FETCH_CONFIG2(getText,"CfgWeapons",vest _unit,"displayName")} else {"None"}; -_uni = if (!(uniform _unit isEqualTo "")) then { FETCH_CONFIG2(getText,"CfgWeapons",uniform _unit,"displayName")} else {"None"}; -_bp = if (!(backpack _unit isEqualTo "")) then {FETCH_CONFIG2(getText,"CfgVehicles",backpack _unit,"displayName")} else {"None"}; - -_attach = []; -_secondary = []; -if (!(primaryWeapon _unit isEqualTo "")) then { - { - if (!(_x isEqualTo "")) then { - _attach pushBack (FETCH_CONFIG2(getText,"CfgWeapons",_x,"displayName")); - }; - } forEach (primaryWeaponItems _unit); -}; - -if (!(handgunItems _unit isEqualTo "")) then { - { - if (!(_x isEqualTo "")) then { - _secondary pushBack (FETCH_CONFIG2(getText,"CfgWeapons",_x,"displayName")); - }; - } forEach (handgunItems _unit); -}; - -_steamName = _ret select 4; -if (!((_ret select 4) isEqualType "")) then { - _steamName = "Not a Steam User!"; -}; - -if (count _attach isEqualTo 0) then {_attach = "None"}; -if (count _secondary isEqualTo 0) then {_secondary = "None"}; -CONTROL(2900,2903) ctrlSetStructuredText parseText format ["Name: %1
Steam Name: %10
Player UID: %11
Player Side: %12
Bank: %2
Money: %3
Uniform: %4
Vest: %5
Backpack: %6
Primary: %7
Handgun: %8
Primary Attachments
%9
Secondary Attachments
%13
", -_unit getVariable ["realname",name _unit],[(_ret select 0)] call life_fnc_numberText,[(_ret select 1)] call life_fnc_numberText, _uni,_vest,_bp,_prim,_sec,_attach,_steamName,(_ret select 5),(_ret select 6),_secondary]; +#include "..\..\script_macros.hpp" +/* + File: fn_adminInfo.sqf + Author: Bryan "Tonic" Boardwine + + Description: + Output information received to admin menu. +*/ + +params [ + ["_bank", 0, [0]], + ["_cash", 0, [0]], + ["_owner", -1, [0]], + ["_unit", objNull, [objNull]], + ["_steamName", "", [""]], + ["_uid", "", [""]], + ["_side", sideUnknown, [civilian]] +]; + +disableSerialization; + +private _prim = if !(primaryWeapon _unit isEqualTo "") then {FETCH_CONFIG2(getText,"CfgWeapons",primaryWeapon _unit,"displayName")} else {"None"}; +private _sec = if !(handgunWeapon _unit isEqualTo "") then {FETCH_CONFIG2(getText,"CfgWeapons",handgunWeapon _unit,"displayName")} else {"None"}; +private _vest = if !(vest _unit isEqualTo "") then { FETCH_CONFIG2(getText,"CfgWeapons",vest _unit,"displayName")} else {"None"}; +private _uni = if !(uniform _unit isEqualTo "") then { FETCH_CONFIG2(getText,"CfgWeapons",uniform _unit,"displayName")} else {"None"}; +private _bp = if !(backpack _unit isEqualTo "") then {FETCH_CONFIG2(getText,"CfgVehicles",backpack _unit,"displayName")} else {"None"}; + +private _attach = []; +private _secondary = []; +if !(primaryWeapon _unit isEqualTo "") then { + { + if !(_x isEqualTo "") then { + _attach pushBack (FETCH_CONFIG2(getText,"CfgWeapons",_x,"displayName")); + }; + true + } count (primaryWeaponItems _unit); +}; + +if !(handgunItems _unit isEqualTo "") then { + { + if !(_x isEqualTo "") then { + _secondary pushBack (FETCH_CONFIG2(getText,"CfgWeapons",_x,"displayName")); + }; + true + } count (handgunItems _unit); +}; + +if !(_steamName isEqualType "") then { + _steamName = "Not a Steam User!"; +}; + +if (_attach isEqualTo []) then {_attach = "None"}; +if (_secondary isEqualTo []) then {_secondary = "None"}; +CONTROL(2900,2903) ctrlSetStructuredText parseText format ["Name: %1
Steam Name: %10
Player UID: %11
Player Side: %12
Bank: %2
Money: %3
Uniform: %4
Vest: %5
Backpack: %6
Primary: %7
Handgun: %8
Primary Attachments
%9
Secondary Attachments
%13
", +_unit getVariable ["realname",name _unit],[_bank] call life_fnc_numberText,[_cash] call life_fnc_numberText, _uni,_vest,_bp,_prim,_sec,_attach,_steamName,_uid,_side,_secondary]; diff --git a/Altis_Life.Altis/core/admin/fn_adminMenu.sqf b/Altis_Life.Altis/core/admin/fn_adminMenu.sqf index f1ac50e36..a3de20f6f 100644 --- a/Altis_Life.Altis/core/admin/fn_adminMenu.sqf +++ b/Altis_Life.Altis/core/admin/fn_adminMenu.sqf @@ -6,14 +6,16 @@ Description: Opens the admin menu and hides buttons based on life_adminlevel. */ -private ["_display","_list","_side","_godmode","_markers"]; -if (FETCH_CONST(life_adminlevel) < 1) exitWith {closeDialog 0;}; + +if (FETCH_CONST(life_adminlevel) < 1) exitWith { + closeDialog 0; +}; disableSerialization; waitUntil {!isNull (findDisplay 2900)}; -_list = CONTROL(2900,2902); -if (FETCH_CONST(life_adminlevel) < 1) exitWith {closeDialog 0;}; +private _list = CONTROL(2900,2902); + switch (FETCH_CONST(life_adminlevel)) do { @@ -27,17 +29,24 @@ switch (FETCH_CONST(life_adminlevel)) do lbClear _list; { - _side = switch (side _x) do {case west: {"Cop"}; case civilian: {"Civ"}; case independent: {"Medic"}; default {"Unknown"};}; - _list lbAdd format ["%1 - %2", _x getVariable ["realname",name _x],_side]; - _list lbSetdata [(lbSize _list)-1,str(_x)]; -} forEach playableUnits; -if (FETCH_CONST(life_adminlevel) < 1) exitWith {closeDialog 0;}; + private _side = switch (side _x) do { + case west: {"Cop"}; + case civilian: {"Civ"}; + case independent: {"Medic"}; + default {"Unknown"}; + }; + _list lbAdd format ["%1 - %2", _x getVariable ["realname",name _x], _side]; + _list lbSetdata [(lbSize _list)-1, str _x]; + + true +} count playableUnits; + if (life_god) then { - _godmode = CONTROL(2900,2908); + private _godmode = CONTROL(2900,2908); _godmode ctrlSetTextColor [0, 255, 0, 1]; // green }; if (life_markers) then { - _markers = CONTROL(2900,2910); + private _markers = CONTROL(2900,2910); _markers ctrlSetTextColor [0, 255, 0, 1]; // green }; \ No newline at end of file diff --git a/Altis_Life.Altis/core/admin/fn_adminQuery.sqf b/Altis_Life.Altis/core/admin/fn_adminQuery.sqf index a3bef64e8..fd3a9c4e1 100644 --- a/Altis_Life.Altis/core/admin/fn_adminQuery.sqf +++ b/Altis_Life.Altis/core/admin/fn_adminQuery.sqf @@ -1,19 +1,23 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_adminQuery.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Starts the query on a player. -*/ -private ["_text","_info","_prim","_sec","_vest","_uni","_bp","_attach","_tmp"]; -disableSerialization; -if (!isNil "admin_query_ip") exitWith {hint localize "STR_ANOTF_Query_2"}; -_text = CONTROL(2900,2903); -_info = lbData[2902,lbCurSel (2902)]; -_info = call compile format ["%1", _info]; - -if (isNil "_info") exitWith {_text ctrlSetText localize "STR_ANOTF_QueryFail";}; -if (isNull _info) exitWith {_text ctrlSetText localize "STR_ANOTF_QueryFail";}; -[player] remoteExec ["TON_fnc_player_query",_info]; -_text ctrlSetText localize "STR_ANOTF_Query"; +#include "..\..\script_macros.hpp" +/* + File: fn_adminQuery.sqf + Author: Bryan "Tonic" Boardwine + + Description: + Starts the query on a player. +*/ + +disableSerialization; + +if (!isNil "admin_query_ip") exitWith { + hint localize "STR_ANOTF_Query_2" +}; + +private _text = CONTROL(2900,2903); +private _info = lbData[2902,lbCurSel (2902)]; +_info = call compile format ["%1", _info]; + +if (isNil "_info" || {isNull _info}) exitWith {_text ctrlSetText localize "STR_ANOTF_QueryFail"}; +remoteExecCall ["life_util_fnc_playerQuery",_info]; + +_text ctrlSetText localize "STR_ANOTF_Query"; diff --git a/Altis_Life.Altis/core/admin/fn_adminSpectate.sqf b/Altis_Life.Altis/core/admin/fn_adminSpectate.sqf index a15ff2cf9..8098e9621 100644 --- a/Altis_Life.Altis/core/admin/fn_adminSpectate.sqf +++ b/Altis_Life.Altis/core/admin/fn_adminSpectate.sqf @@ -1,21 +1,23 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_adminSpectate.sqf - Author: ColinM9991 - - Description: - Spectate the chosen player. -*/ -if (FETCH_CONST(life_adminlevel) < 3) exitWith {closeDialog 0;}; - -private _unit = lbData[2902,lbCurSel (2902)]; -_unit = call compile format ["%1", _unit]; -if (isNil "_unit") exitWith {}; -if (isNull _unit) exitWith {}; -if (_unit == player) exitWith {hint localize "STR_ANOTF_Error";}; - -closeDialog 0; - -_unit switchCamera "INTERNAL"; -hint format [localize "STR_NOTF_nowSpectating",_unit getVariable ["realname",name _unit]]; -AM_Exit = (findDisplay 46) displayAddEventHandler ["KeyDown", "if ((_this select 1) == 68) then {(findDisplay 46) displayRemoveEventHandler ['KeyDown',AM_Exit]; player switchCamera 'INTERNAL'; hint localize 'STR_NOTF_stoppedSpectating';}; false"]; +#include "..\..\script_macros.hpp" +/* + File: fn_adminSpectate.sqf + Author: ColinM9991 + + Description: + Spectate the chosen player. +*/ + +if (FETCH_CONST(life_adminlevel) < 3) exitWith {closeDialog 0;}; + +private _unit = lbData[2902,lbCurSel (2902)]; +_unit = call compile format ["%1", _unit]; +if (isNil "_unit" || {isNull _unit}) exitWith {}; +if (_unit isEqualTo player) exitWith { + hint localize "STR_ANOTF_Error"; +}; + +closeDialog 0; + +_unit switchCamera "INTERNAL"; +hint format [localize "STR_NOTF_nowSpectating",_unit getVariable ["realname",name _unit]]; +AM_Exit = (findDisplay 46) displayAddEventHandler ["KeyDown", "if ((_this select 1) == 68) then {(findDisplay 46) displayRemoveEventHandler ['KeyDown',AM_Exit]; player switchCamera 'INTERNAL'; hint localize 'STR_NOTF_stoppedSpectating';}; false"]; diff --git a/Altis_Life.Altis/core/admin/fn_adminTeleport.sqf b/Altis_Life.Altis/core/admin/fn_adminTeleport.sqf index 42e91e2d0..4325ad968 100644 --- a/Altis_Life.Altis/core/admin/fn_adminTeleport.sqf +++ b/Altis_Life.Altis/core/admin/fn_adminTeleport.sqf @@ -1,14 +1,15 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_adminTeleport.sqf - Author: ColinM9991 - Credits: To original script author(s) - Description: - Teleport to chosen position. -*/ -if (FETCH_CONST(life_adminlevel) < 3) exitWith {closeDialog 0;}; - -closeDialog 0; - -openMap [true, false]; -onMapSingleClick "[_pos select 0, _pos select 1, _pos select 2] call life_fnc_teleport"; \ No newline at end of file +#include "..\..\script_macros.hpp" +/* + File: fn_adminTeleport.sqf + Author: ColinM9991 + Credits: To original script author(s) + Description: + Teleport to chosen position. +*/ + +if (FETCH_CONST(life_adminlevel) < 3) exitWith {closeDialog 0;}; + +closeDialog 0; + +openMap [true, false]; +onMapSingleClick "_pos call life_fnc_teleport"; diff --git a/Altis_Life.Altis/core/admin/fn_adminTpHere.sqf b/Altis_Life.Altis/core/admin/fn_adminTpHere.sqf index 7bf0f9872..4d580a6d7 100644 --- a/Altis_Life.Altis/core/admin/fn_adminTpHere.sqf +++ b/Altis_Life.Altis/core/admin/fn_adminTpHere.sqf @@ -1,18 +1,24 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_adminTpHere.sqf - Author: ColinM9991 - - Description: - Teleport selected player to you. -*/ -if (FETCH_CONST(life_adminlevel) < 4) exitWith {closeDialog 0;}; - -private _target = lbData[2902,lbCurSel (2902)]; -_target = call compile format ["%1", _target]; -if (isNil "_target" || isNull _target) exitWith {}; -if (_target == player) exitWith {hint localize "STR_ANOTF_Error";}; - -if (!(vehicle _target isEqualTo _target)) exitWith {hint localize "STR_Admin_CannotTpHere"}; -_target setPos (getPos player); -hint format [localize "STR_NOTF_haveTPedToYou",_target getVariable ["realname",name _target]]; +#include "..\..\script_macros.hpp" +/* + File: fn_adminTpHere.sqf + Author: ColinM9991 + + Description: + Teleport selected player to you. +*/ + +if (FETCH_CONST(life_adminlevel) < 4) exitWith {closeDialog 0}; + +private _target = lbData[2902,lbCurSel (2902)]; +_target = call compile format ["%1", _target]; +if (isNil "_target" || {isNull _target}) exitWith {}; +if (_target isEqualTo player) exitWith { + hint localize "STR_ANOTF_Error"; +}; + +if !(vehicle _target isEqualTo _target) exitWith { + hint localize "STR_Admin_CannotTpHere" +}; + +_target setPos (getPos player); +hint format [localize "STR_NOTF_haveTPedToYou",_target getVariable ["realname",name _target]]; diff --git a/Altis_Life.Altis/core/civilian/fn_civMarkers.sqf b/Altis_Life.Altis/core/civilian/fn_civMarkers.sqf index c1dc99ed1..13d4960da 100644 --- a/Altis_Life.Altis/core/civilian/fn_civMarkers.sqf +++ b/Altis_Life.Altis/core/civilian/fn_civMarkers.sqf @@ -5,9 +5,9 @@ Description: Add markers for civilians in groups. */ -private ["_markers","_members"]; -_markers = []; -_members = []; + +private _markers = []; +private _members = []; for "_i" from 0 to 1 step 0 do { sleep 0.5; @@ -16,28 +16,33 @@ for "_i" from 0 to 1 step 0 do { _members = units (group player); { if !(_x isEqualTo player) then { - _marker = createMarkerLocal [format ["%1_marker",_x],visiblePosition _x]; + private _marker = createMarkerLocal [format ["%1_marker",_x],visiblePosition _x]; _marker setMarkerColorLocal "ColorCivilian"; _marker setMarkerTypeLocal "Mil_dot"; _marker setMarkerTextLocal format ["%1", _x getVariable ["realname",name _x]]; _markers pushBack [_marker,_x]; }; - } forEach _members; + true + } count _members; while {visibleMap} do { { - private ["_unit"]; - _unit = _x select 1; - if (!isNil "_unit" && !isNull _unit) then { - (_x select 0) setMarkerPosLocal (visiblePosition _unit); + _x params ["_marker", "_unit"]; + if (!isNil "_unit" && {!isNull _unit}) then { + _marker setMarkerPosLocal (visiblePosition _unit); }; - } forEach _markers; + true + } count _markers; if (!visibleMap) exitWith {}; sleep 0.02; }; - {deleteMarkerLocal (_x select 0);} forEach _markers; + { + deleteMarkerLocal (_x select 0); + true + } count _markers; + _markers = []; _members = []; }; diff --git a/Altis_Life.Altis/core/civilian/fn_demoChargeTimer.sqf b/Altis_Life.Altis/core/civilian/fn_demoChargeTimer.sqf index 386984718..e9c22cbcc 100644 --- a/Altis_Life.Altis/core/civilian/fn_demoChargeTimer.sqf +++ b/Altis_Life.Altis/core/civilian/fn_demoChargeTimer.sqf @@ -6,12 +6,14 @@ Description: Starts the "Demo" timer for the police. */ -private ["_uiDisp","_time","_timer"]; + disableSerialization; + "lifeTimer" cutRsc ["life_timer","PLAIN"]; -_uiDisp = uiNamespace getVariable "life_timer"; -_timer = _uiDisp displayCtrl 38301; -_time = time + (5 * 60); + +private _uiDisp = uiNamespace getVariable "life_timer"; +private _timer = _uiDisp displayCtrl 38301; +private _time = time + (5 * 60); for "_i" from 0 to 1 step 0 do { if (isNull _uiDisp) then { @@ -20,8 +22,9 @@ for "_i" from 0 to 1 step 0 do { _timer = _uiDisp displayCtrl 38301; }; if (round(_time - time) < 1) exitWith {}; - if (!(fed_bank getVariable ["chargeplaced",false])) exitWith {}; + if !(fed_bank getVariable ["chargeplaced",false]) exitWith {}; _timer ctrlSetText format ["%1",[(_time - time),"MM:SS.MS"] call BIS_fnc_secondsToString]; sleep 0.08; }; + "lifeTimer" cutText["","PLAIN"]; \ No newline at end of file diff --git a/Altis_Life.Altis/core/civilian/fn_freezePlayer.sqf b/Altis_Life.Altis/core/civilian/fn_freezePlayer.sqf index 32ef58d2f..0b875edeb 100644 --- a/Altis_Life.Altis/core/civilian/fn_freezePlayer.sqf +++ b/Altis_Life.Altis/core/civilian/fn_freezePlayer.sqf @@ -6,17 +6,18 @@ Description: Freezes selected player. */ -private ["_admin"]; -_admin = [_this,0,objNull,[objNull]] call BIS_fnc_param; + +params [ + ["_admin", objNull, [objNull]] +]; if (life_frozen) then { hint localize "STR_NOTF_Unfrozen"; [1,format [localize "STR_ANOTF_Unfrozen",profileName]] remoteExecCall ["life_fnc_broadcast",_admin]; - disableUserInput false; - life_frozen = false; } else { hint localize "STR_NOTF_Frozen"; [1,format [localize "STR_ANOTF_Frozen",profileName]] remoteExecCall ["life_fnc_broadcast",_admin]; - disableUserInput true; - life_frozen = true; }; + +life_frozen = !life_frozen; +disableUserInput life_frozen; diff --git a/Altis_Life.Altis/core/civilian/fn_jail.sqf b/Altis_Life.Altis/core/civilian/fn_jail.sqf index 1d26930ca..de4ac8e6e 100644 --- a/Altis_Life.Altis/core/civilian/fn_jail.sqf +++ b/Altis_Life.Altis/core/civilian/fn_jail.sqf @@ -1,62 +1,66 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_jail.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Starts the initial process of jailing. -*/ -private ["_illegalItems"]; -params [ - ["_unit",objNull,[objNull]], - ["_bad",false,[false]] -]; - -if (isNull _unit) exitWith {}; //Dafuq? -if !(_unit isEqualTo player) exitWith {}; //Dafuq? -if (life_is_arrested) exitWith {}; //Dafuq i'm already arrested -_illegalItems = LIFE_SETTINGS(getArray,"jail_seize_vItems"); - -player setVariable ["restrained",false,true]; -player setVariable ["Escorting",false,true]; -player setVariable ["transporting",false,true]; - -titleText[localize "STR_Jail_Warn","PLAIN"]; -hint localize "STR_Jail_LicenseNOTF"; -player setPos (getMarkerPos "jail_marker"); - -if (_bad) then { - waitUntil {alive player}; - sleep 1; -}; - -//Check to make sure they goto check -if (player distance (getMarkerPos "jail_marker") > 40) then { - player setPos (getMarkerPos "jail_marker"); -}; - -[1] call life_fnc_removeLicenses; - -{ - _amount = ITEM_VALUE(_x); - if (_amount > 0) then { - [false,_x,_amount] call life_fnc_handleInv; - }; -} forEach _illegalItems; - -life_is_arrested = true; - -if (LIFE_SETTINGS(getNumber,"jail_seize_inventory") isEqualTo 1) then { - [] spawn life_fnc_seizeClient; -} else { - removeAllWeapons player; - {player removeMagazine _x} forEach (magazines player); -}; - -if (life_HC_isActive) then { - [player,_bad] remoteExecCall ["HC_fnc_jailSys",HC_Life]; -} else { - [player,_bad] remoteExecCall ["life_fnc_jailSys",RSERV]; -}; - -[5] call SOCK_fnc_updatePartial; +#include "..\..\script_macros.hpp" +/* + File: fn_jail.sqf + Author: Bryan "Tonic" Boardwine + + Description: + Starts the initial process of jailing. +*/ + +params [ + ["_unit",objNull,[objNull]], + ["_bad",false,[false]] +]; + +if (isNull _unit) exitWith {}; +if !(_unit isEqualTo player) exitWith {}; +if (life_is_arrested) exitWith {}; + +private _illegalItems = LIFE_SETTINGS(getArray,"jail_seize_vItems"); + +player setVariable ["restrained",false,true]; +player setVariable ["Escorting",false,true]; +player setVariable ["transporting",false,true]; + +titleText [localize "STR_Jail_Warn","PLAIN"]; +hint localize "STR_Jail_LicenseNOTF"; +player setPos (getMarkerPos "jail_marker"); + +if (_bad) then { + waitUntil {alive player}; + sleep 1; +}; + +//Check to make sure they goto check +if (player distance (getMarkerPos "jail_marker") > 40) then { + player setPos (getMarkerPos "jail_marker"); +}; + +[1] call life_fnc_removeLicenses; + +{ + _amount = ITEM_VALUE(_x); + if (_amount > 0) then { + [false,_x,_amount] call life_fnc_handleInv; + }; + true +} count _illegalItems; + +life_is_arrested = true; + +if (LIFE_SETTINGS(getNumber,"jail_seize_inventory") isEqualTo 1) then { + [] call life_fnc_seizeClient; +} else { + removeAllWeapons player; + { + player removeMagazine _x + } count (magazines player); +}; + +if (life_HC_isActive) then { + [player,_bad] remoteExecCall ["HC_fnc_jailSys",HC_Life]; +} else { + [player,_bad] remoteExecCall ["life_fnc_jailSys",RSERV]; +}; + +[5] call SOCK_fnc_updatePartial; diff --git a/Altis_Life.Altis/core/civilian/fn_jailMe.sqf b/Altis_Life.Altis/core/civilian/fn_jailMe.sqf index 12749203c..d43f533ad 100644 --- a/Altis_Life.Altis/core/civilian/fn_jailMe.sqf +++ b/Altis_Life.Altis/core/civilian/fn_jailMe.sqf @@ -8,8 +8,8 @@ */ params [ - ["_ret",[],[[]]], - ["_bad",false,[false]] + ["_ret", [], [[]]], + ["_bad", false, [false]] ]; private _esc = false; @@ -37,6 +37,7 @@ if !(_ret isEqualTo []) then { life_canpay_bail = true; }; +private "_countDown"; for "_i" from 0 to 1 step 0 do { if (round(_time - time) > 0) then { _countDown = [(_time - time), "MM:SS.MS"] call BIS_fnc_secondsToString; @@ -47,7 +48,7 @@ for "_i" from 0 to 1 step 0 do { player forceWalk true; }; - private _escDist = [[["Altis", 60], ["Tanoa", 145]]] call TON_fnc_terrainSort; + private _escDist = [[["Altis", 60], ["Tanoa", 145]]] call life_util_fnc_terrainSort; if (player distance (getMarkerPos "jail_marker") > _escDist) exitWith { _esc = true; diff --git a/Altis_Life.Altis/core/civilian/fn_knockedOut.sqf b/Altis_Life.Altis/core/civilian/fn_knockedOut.sqf index 7e6579a2a..558039443 100644 --- a/Altis_Life.Altis/core/civilian/fn_knockedOut.sqf +++ b/Altis_Life.Altis/core/civilian/fn_knockedOut.sqf @@ -1,34 +1,33 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_knockedOut.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Starts and monitors the knocked out state. -*/ -private "_obj"; -params [ - ["_target",objNull,[objNull]], - ["_who","",[""]] -]; - -if (isNull _target) exitWith {}; -if !(_target isEqualTo player) exitWith {}; -if (_who isEqualTo "") exitWith {}; - -titleText[format [localize "STR_Civ_KnockedOut",_who],"PLAIN"]; -player playMoveNow "Incapacitated"; -disableUserInput true; - -_obj = "Land_ClutterCutter_small_F" createVehicle ASLTOATL(visiblePositionASL player); -_obj setPosATL ASLTOATL(visiblePositionASL player); - -life_isknocked = true; -player attachTo [_obj,[0,0,0]]; -sleep 15; -player playMoveNow "AmovPpneMstpSrasWrflDnon"; -disableUserInput false; -detach player; -deleteVehicle _obj; -life_isknocked = false; -player setVariable ["robbed",false,true]; +#include "..\..\script_macros.hpp" +/* + File: fn_knockedOut.sqf + Author: Bryan "Tonic" Boardwine + + Description: + Starts and monitors the knocked out state. +*/ + +params [ + ["_target",objNull,[objNull]], + ["_who","",[""]] +]; + +if (isNull _target || {_who isEqualTo ""}) exitWith {}; +if !(_target isEqualTo player) exitWith {}; + +titleText [format [localize "STR_Civ_KnockedOut",_who],"PLAIN"]; +player playMoveNow "Incapacitated"; +disableUserInput true; + +private _obj = "Land_ClutterCutter_small_F" createVehicle ASLTOATL (visiblePositionASL player); +_obj setPosATL ASLTOATL (visiblePositionASL player); + +life_isknocked = true; +player attachTo [_obj,[0,0,0]]; +sleep 15; +player playMoveNow "AmovPpneMstpSrasWrflDnon"; +disableUserInput false; +detach player; +deleteVehicle _obj; +life_isknocked = false; +player setVariable ["robbed",false,true]; diff --git a/Altis_Life.Altis/core/civilian/fn_knockoutAction.sqf b/Altis_Life.Altis/core/civilian/fn_knockoutAction.sqf index 1eab0409b..ed1752e42 100644 --- a/Altis_Life.Altis/core/civilian/fn_knockoutAction.sqf +++ b/Altis_Life.Altis/core/civilian/fn_knockoutAction.sqf @@ -1,22 +1,23 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_knockoutAction.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Knocks out the target. -*/ -private "_target"; -_target = param [0,objNull,[objNull]]; - -//Error checks -if (isNull _target) exitWith {}; -if (!isPlayer _target) exitWith {}; -if (player distance _target > 4) exitWith {}; -life_knockout = true; -[player,"AwopPercMstpSgthWrflDnon_End2"] remoteExecCall ["life_fnc_animSync",RCLIENT]; -sleep 0.08; -[_target,profileName] remoteExec ["life_fnc_knockedOut",_target]; - -sleep 3; -life_knockout = false; +#include "..\..\script_macros.hpp" +/* + File: fn_knockoutAction.sqf + Author: Bryan "Tonic" Boardwine + + Description: + Knocks out the target. +*/ + +params [ + ["_target",objNull,[objNull]] +]; + +//Error checks +if (isNull _target || {player distance _target > 4}) exitWith {}; + +life_knockout = true; +[player,"AwopPercMstpSgthWrflDnon_End2"] remoteExecCall ["life_fnc_animSync",RCLIENT]; +sleep 0.08; +[_target,profileName] remoteExec ["life_fnc_knockedOut",_target]; + +sleep 3; +life_knockout = false; diff --git a/Altis_Life.Altis/core/civilian/fn_removeLicenses.sqf b/Altis_Life.Altis/core/civilian/fn_removeLicenses.sqf index 8826fb6f5..b921e5be1 100644 --- a/Altis_Life.Altis/core/civilian/fn_removeLicenses.sqf +++ b/Altis_Life.Altis/core/civilian/fn_removeLicenses.sqf @@ -6,8 +6,10 @@ Description: Used for stripping certain licenses off of civilians as punishment. */ -private "_state"; -_state = param [0,1,[0]]; + +params [ + ["_state", 1, [0]] +]; switch (_state) do { //Death while being wanted @@ -28,7 +30,11 @@ switch (_state) do { //Remove motor vehicle licenses case 2: { - if (missionNamespace getVariable LICENSE_VARNAME("driver","civ") || missionNamespace getVariable LICENSE_VARNAME("pilot","civ") || missionNamespace getVariable LICENSE_VARNAME("trucking","civ") || missionNamespace getVariable LICENSE_VARNAME("boat","civ")) then { + if (missionNamespace getVariable LICENSE_VARNAME("driver","civ") || + {missionNamespace getVariable LICENSE_VARNAME("pilot","civ")} || + {missionNamespace getVariable LICENSE_VARNAME("trucking","civ")} || + {missionNamespace getVariable LICENSE_VARNAME("boat","civ")} + ) then { missionNamespace setVariable [LICENSE_VARNAME("pilot","civ"),false]; missionNamespace setVariable [LICENSE_VARNAME("driver","civ"),false]; missionNamespace setVariable [LICENSE_VARNAME("trucking","civ"),false]; diff --git a/Altis_Life.Altis/core/civilian/fn_robPerson.sqf b/Altis_Life.Altis/core/civilian/fn_robPerson.sqf index 254c79e1f..d5e55e86f 100644 --- a/Altis_Life.Altis/core/civilian/fn_robPerson.sqf +++ b/Altis_Life.Altis/core/civilian/fn_robPerson.sqf @@ -1,28 +1,29 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_robPerson.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Robs a person. -*/ -params [ - ["_robber",objNull,[objNull]] -]; -if (isNull _robber) exitWith {}; //No one to return it to? - -if (CASH > 0) then { - [CASH,player,_robber] remoteExecCall ["life_fnc_robReceive",_robber]; - - if (life_HC_isActive) then { - [getPlayerUID _robber,_robber getVariable ["realname",name _robber],"211"] remoteExecCall ["HC_fnc_wantedAdd",HC_Life]; - } else { - [getPlayerUID _robber,_robber getVariable ["realname",name _robber],"211"] remoteExecCall ["life_fnc_wantedAdd",RSERV]; - }; - - [1,"STR_NOTF_Robbed",true,[_robber getVariable ["realname",name _robber],profileName,[CASH] call life_fnc_numberText]] remoteExecCall ["life_fnc_broadcast",RCLIENT]; - CASH = 0; - [0] call SOCK_fnc_updatePartial; -} else { - [2,"STR_NOTF_RobFail",true,[profileName]] remoteExecCall ["life_fnc_broadcast",_robber]; -}; +#include "..\..\script_macros.hpp" +/* + File: fn_robPerson.sqf + Author: Bryan "Tonic" Boardwine + + Description: + Robs a person. +*/ +params [ + ["_robber",objNull,[objNull]] +]; + +if (isNull _robber) exitWith {}; + +if (CASH > 0) then { + [CASH,player] remoteExecCall ["life_fnc_robReceive",_robber]; + + if (life_HC_isActive) then { + [getPlayerUID _robber,_robber getVariable ["realname",name _robber],"211"] remoteExecCall ["HC_fnc_wantedAdd",HC_Life]; + } else { + [getPlayerUID _robber,_robber getVariable ["realname",name _robber],"211"] remoteExecCall ["life_fnc_wantedAdd",RSERV]; + }; + + [1,"STR_NOTF_Robbed",true,[_robber getVariable ["realname",name _robber],profileName,[CASH] call life_fnc_numberText]] remoteExecCall ["life_fnc_broadcast",RCLIENT]; + CASH = 0; + [0] call SOCK_fnc_updatePartial; +} else { + [2,"STR_NOTF_RobFail",true,[profileName]] remoteExecCall ["life_fnc_broadcast",_robber]; +}; diff --git a/Altis_Life.Altis/core/civilian/fn_robReceive.sqf b/Altis_Life.Altis/core/civilian/fn_robReceive.sqf index 2838646cc..ecf90ab06 100644 --- a/Altis_Life.Altis/core/civilian/fn_robReceive.sqf +++ b/Altis_Life.Altis/core/civilian/fn_robReceive.sqf @@ -1,29 +1,30 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_robReceive.sqf - Author: Bryan "Tonic" Boardwine - - Description: - -*/ -params [ - ["_cash",0,[0]], - ["_victim",objNull,[objNull]], - ["_robber",objNull,[objNull]] -]; - -if (_robber == _victim) exitWith {}; -if (_cash isEqualTo 0) exitWith {titleText[localize "STR_Civ_RobFail","PLAIN"]}; - -CASH = CASH + _cash; -[0] call SOCK_fnc_updatePartial; -titleText[format [localize "STR_Civ_Robbed",[_cash] call life_fnc_numberText],"PLAIN"]; - -if (LIFE_SETTINGS(getNumber,"player_moneyLog") isEqualTo 1) then { - if (LIFE_SETTINGS(getNumber,"battlEye_friendlyLogging") isEqualTo 1) then { - money_log = format [localize "STR_DL_ML_Robbed_BEF",[_cash] call life_fnc_numberText,_victim,[BANK] call life_fnc_numberText,[CASH] call life_fnc_numberText]; - } else { - money_log = format [localize "STR_DL_ML_Robbed",profileName,(getPlayerUID player),[_cash] call life_fnc_numberText,_victim,[BANK] call life_fnc_numberText,[CASH] call life_fnc_numberText]; - }; - publicVariableServer "money_log"; -}; +#include "..\..\script_macros.hpp" +/* + File: fn_robReceive.sqf + Author: Bryan "Tonic" Boardwine + + Description: + +*/ +params [ + ["_cash",0,[0]], + ["_victim",objNull,[objNull]] +]; + +if (player isEqualTo _victim) exitWith {}; +if (_cash isEqualTo 0) exitWith { + titleText[localize "STR_Civ_RobFail","PLAIN"] +}; + +CASH = CASH + _cash; +[0] call SOCK_fnc_updatePartial; +titleText[format [localize "STR_Civ_Robbed",[_cash] call life_fnc_numberText],"PLAIN"]; + +if (LIFE_SETTINGS(getNumber,"player_moneyLog") isEqualTo 1) then { + if (LIFE_SETTINGS(getNumber,"battlEye_friendlyLogging") isEqualTo 1) then { + money_log = format [localize "STR_DL_ML_Robbed_BEF",[_cash] call life_fnc_numberText,_victim,[BANK] call life_fnc_numberText,[CASH] call life_fnc_numberText]; + } else { + money_log = format [localize "STR_DL_ML_Robbed",profileName,(getPlayerUID player),[_cash] call life_fnc_numberText,_victim,[BANK] call life_fnc_numberText,[CASH] call life_fnc_numberText]; + }; + publicVariableServer "money_log"; +}; diff --git a/Altis_Life.Altis/core/civilian/fn_tazed.sqf b/Altis_Life.Altis/core/civilian/fn_tazed.sqf index 38b953ddd..3a5b1d2e3 100644 --- a/Altis_Life.Altis/core/civilian/fn_tazed.sqf +++ b/Altis_Life.Altis/core/civilian/fn_tazed.sqf @@ -1,59 +1,68 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_tazed.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Starts the tazed animation and broadcasts out what it needs to. -*/ -private ["_curWep","_curMags","_attach"]; -params [ - ["_unit",objNull,[objNull]], - ["_shooter",objNull,[objNull]] -]; - -if (isNull _unit || isNull _shooter) exitWith {player allowDamage true; life_istazed = false;}; - -if (_shooter isKindOf "CAManBase" && alive player) then { - if (!life_istazed) then { - life_istazed = true; - _curWep = currentWeapon player; - _curMags = magazines player; - _attach = if (!(primaryWeapon player isEqualTo "")) then {primaryWeaponItems player} else {[]}; - - {player removeMagazine _x} forEach _curMags; - player removeWeapon _curWep; - player addWeapon _curWep; - if (!(count _attach isEqualTo 0) && !(primaryWeapon player isEqualTo "")) then { - { - _unit addPrimaryWeaponItem _x; - } forEach _attach; - }; - - if (!(count _curMags isEqualTo 0)) then { - {player addMagazine _x;} forEach _curMags; - }; - [_unit,"tazerSound",100,1] remoteExecCall ["life_fnc_say3D",RCLIENT]; - - _obj = "Land_ClutterCutter_small_F" createVehicle ASLTOATL(visiblePositionASL player); - _obj setPosATL ASLTOATL(visiblePositionASL player); - - [player,"AinjPfalMstpSnonWnonDf_carried_fallwc"] remoteExecCall ["life_fnc_animSync",RCLIENT]; - [0,"STR_NOTF_Tazed",true,[profileName, _shooter getVariable ["realname",name _shooter]]] remoteExecCall ["life_fnc_broadcast",RCLIENT]; - _unit attachTo [_obj,[0,0,0]]; - disableUserInput true; - sleep 15; - - [player,"AmovPpneMstpSrasWrflDnon"] remoteExecCall ["life_fnc_animSync",RCLIENT]; - - if (!(player getVariable ["Escorting",false])) then { - detach player; - }; - life_istazed = false; - player allowDamage true; - disableUserInput false; - }; -} else { - _unit allowDamage true; - life_istazed = false; -}; +#include "..\..\script_macros.hpp" +/* + File: fn_tazed.sqf + Author: Bryan "Tonic" Boardwine + + Description: + Starts the tazed animation and broadcasts out what it needs to. +*/ + +params [ + ["_unit",objNull,[objNull]], + ["_shooter",objNull,[objNull]] +]; + +if (isNull _unit || {isNull _shooter}) exitWith { + player allowDamage true; + life_istazed = false; +}; + +if (_shooter isKindOf "Man" && {alive player}) then { + if (!life_istazed) then { + life_istazed = true; + private _curWep = currentWeapon player; + private _curMags = magazines player; + private _attach = if (!(primaryWeapon player isEqualTo "")) then {primaryWeaponItems player} else {[]}; + + { + player removeMagazine _x + } count _curMags; + + player removeWeapon _curWep; + player addWeapon _curWep; + if (!(_attach isEqualTo []) && {!(primaryWeapon player isEqualTo "")}) then { + { + _unit addPrimaryWeaponItem _x; + } count _attach; + }; + + if !(_curMags isEqualTo []) then { + { + player addMagazine _x; + } count _curMags; + }; + [_unit,"tazerSound",100,1] remoteExecCall ["life_fnc_say3D",RCLIENT]; + + private _obj = "Land_ClutterCutter_small_F" createVehicle ASLTOATL (visiblePositionASL player); + _obj setPosATL ASLTOATL (visiblePositionASL player); + + [player,"AinjPfalMstpSnonWnonDf_carried_fallwc"] remoteExecCall ["life_fnc_animSync",RCLIENT]; + [0,"STR_NOTF_Tazed",true,[profileName, _shooter getVariable ["realname",name _shooter]]] remoteExecCall ["life_fnc_broadcast",RCLIENT]; + _unit attachTo [_obj,[0,0,0]]; + disableUserInput true; + sleep 15; + + [player,"AmovPpneMstpSrasWrflDnon"] remoteExecCall ["life_fnc_animSync",RCLIENT]; + + if !(player getVariable ["Escorting",false]) then { + detach player; + }; + + life_istazed = false; + player allowDamage true; + disableUserInput false; + }; +} else { + _unit allowDamage true; + life_istazed = false; +}; diff --git a/Altis_Life.Altis/core/clientValidator.sqf b/Altis_Life.Altis/core/clientValidator.sqf index 3428cc68e..60bba7725 100644 --- a/Altis_Life.Altis/core/clientValidator.sqf +++ b/Altis_Life.Altis/core/clientValidator.sqf @@ -1,4 +1,5 @@ #include "..\script_macros.hpp" + /* File: clientValidator.sqf Author: @@ -8,11 +9,10 @@ or not they are defined, if they are defined then trigger spyglass and kick the client to the lobby. */ -private ["_vars"]; -_vars = [ - "life_revive_fee", "life_gangPrice", "life_gangUpgradeBase", "life_enableFatigue", "life_paycheck_period", "life_vShop_rentalOnly", "sell_array", "buy_array", - "life_weapon_shop_array", "life_garage_prices", "life_garage_sell", "life_houseLimit", "life_gangUpgradeMultipler", "life_impound_car", "life_impound_boat", - "life_impound_air" + +private _vars = [ + "life_revive_fee", "life_gangPrice", "life_gangUpgradeBase", "life_enableFatigue", "life_paycheck_period", "life_vShop_rentalOnly", "life_weapon_shop_array", + "life_garage_prices", "life_garage_sell", "life_houseLimit", "life_gangUpgradeMultipler", "life_impound_car", "life_impound_boat", "life_impound_air" ]; { diff --git a/Altis_Life.Altis/core/config/fn_houseConfig.sqf b/Altis_Life.Altis/core/config/fn_houseConfig.sqf index 1e4fd7969..f5fa63b0a 100644 --- a/Altis_Life.Altis/core/config/fn_houseConfig.sqf +++ b/Altis_Life.Altis/core/config/fn_houseConfig.sqf @@ -6,7 +6,9 @@ Fetch data from Config_Housing/Garages */ -private _house = param [0,"",[""]]; +params [ + ["_house", "", [""]] +]; if (_house isEqualTo "") exitWith {[]}; diff --git a/Altis_Life.Altis/core/config/fn_itemWeight.sqf b/Altis_Life.Altis/core/config/fn_itemWeight.sqf index 0039f34d2..6e72403af 100644 --- a/Altis_Life.Altis/core/config/fn_itemWeight.sqf +++ b/Altis_Life.Altis/core/config/fn_itemWeight.sqf @@ -6,8 +6,11 @@ Description: Gets the items weight and returns it. */ -private ["_item"]; -_item = [_this,0,"",[""]] call BIS_fnc_param; + +params [ + ["_item", "", [""]] +]; + if (_item isEqualTo "") exitWith {}; M_CONFIG(getNumber,"VirtualItems",_item,"weight"); diff --git a/Altis_Life.Altis/core/config/fn_vehicleAnimate.sqf b/Altis_Life.Altis/core/config/fn_vehicleAnimate.sqf index b9c190d1f..04b034e6f 100644 --- a/Altis_Life.Altis/core/config/fn_vehicleAnimate.sqf +++ b/Altis_Life.Altis/core/config/fn_vehicleAnimate.sqf @@ -5,27 +5,25 @@ Description: Pass what you want to be animated. */ -private ["_vehicle","_animate","_state"]; -_vehicle = [_this,0,objNull,[objNull]] call BIS_fnc_param; -if (isNull _vehicle) exitWith {}; //FUCK -_animate = [_this,1,"",["",[]]] call BIS_fnc_param; -_preset = [_this,2,false,[false]] call BIS_fnc_param; -if (!_preset) then -{ +params [ + ["_vehicle", objNull, [objNull]], + ["_animate", "", ["", []]], + ["_preset", false, [true]] +]; + +if (isNull _vehicle) exitWith {}; + +if (!_preset) then { if (count _animate > 1) then { { _vehicle animate[_x select 0,_x select 1]; - } forEach _animate; - } - else - { + } count _animate; + } else { _vehicle animate[_animate select 0,_animate select 1]; }; -} - else -{ +} else { switch (_animate) do { case "civ_littlebird": diff --git a/Altis_Life.Altis/core/config/fn_vehicleWeightCfg.sqf b/Altis_Life.Altis/core/config/fn_vehicleWeightCfg.sqf index 413c1d565..e22131244 100644 --- a/Altis_Life.Altis/core/config/fn_vehicleWeightCfg.sqf +++ b/Altis_Life.Altis/core/config/fn_vehicleWeightCfg.sqf @@ -1,19 +1,25 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_vehicleWeightCfg.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Master configuration for vehicle weight. -*/ -private ["_className","_classNameLife","_weight"]; -_className = [_this,0,"",[""]] call BIS_fnc_param; -_classNameLife = _className; -if (!isClass (missionConfigFile >> "LifeCfgVehicles" >> _classNameLife)) then { - _classNameLife = "Default"; //Use Default class if it doesn't exist - diag_log format ["%1: LifeCfgVehicles class doesn't exist",_className]; -}; -_weight = M_CONFIG(getNumber,"LifeCfgVehicles",_classNameLife,"vItemSpace"); - -if (isNil "_weight") then {_weight = -1;}; -_weight; \ No newline at end of file +#include "..\..\script_macros.hpp" +/* + File: fn_vehicleWeightCfg.sqf + Author: Bryan "Tonic" Boardwine + + Description: + Master configuration for vehicle weight. +*/ + +params [ + ["_className", "", [""]] +]; + +if !(isClass (missionConfigFile >> "LifeCfgVehicles" >> _className)) then { + diag_log format ["%1: LifeCfgVehicles class doesn't exist", _className]; + _className = "Default"; //Use Default +}; + +private _weight = M_CONFIG(getNumber,"LifeCfgVehicles",_className,"vItemSpace"); + +if (isNil "_weight") then { + _weight = -1; +}; + +_weight; diff --git a/Altis_Life.Altis/core/configuration.sqf b/Altis_Life.Altis/core/configuration.sqf index 5f70b0cc7..3b3135219 100644 --- a/Altis_Life.Altis/core/configuration.sqf +++ b/Altis_Life.Altis/core/configuration.sqf @@ -1,104 +1,101 @@ -#include "..\script_macros.hpp" -/* - File: configuration.sqf - Author: - - Description: - Master Life Configuration File - This file is to setup variables for the client, there are still other configuration files in the system - -***************************** -****** Backend Variables ***** -***************************** -*/ -life_action_delay = time; -life_trunk_vehicle = objNull; -life_session_completed = false; -life_garage_store = false; -life_session_tries = 0; -life_siren_active = false; -life_clothing_filter = 0; -life_redgull_effect = time; -life_is_processing = false; -life_bail_paid = false; -life_impound_inuse = false; -life_action_inUse = false; -life_spikestrip = objNull; -life_knockout = false; -life_interrupted = false; -life_respawned = false; -life_removeWanted = false; -life_action_gathering = false; -life_god = false; -life_frozen = false; -life_save_gear = []; -life_container_activeObj = objNull; -life_disable_getIn = false; -life_disable_getOut = false; -life_admin_debug = false; -life_civ_position = []; -life_markers = false; -life_markers_active = false; -life_canpay_bail = true; -life_storagePlacing = scriptNull; -life_hideoutBuildings = []; -life_firstSpawn = true; - -//Settings -life_settings_enableNewsBroadcast = profileNamespace getVariable ["life_enableNewsBroadcast", true]; -life_settings_enableSidechannel = profileNamespace getVariable ["life_enableSidechannel", true]; -life_settings_tagson = profileNamespace getVariable ["life_settings_tagson", true]; -life_settings_revealObjects = profileNamespace getVariable ["life_settings_revealObjects", true]; -life_settings_viewDistanceFoot = profileNamespace getVariable ["life_viewDistanceFoot", 1250]; -life_settings_viewDistanceCar = profileNamespace getVariable ["life_viewDistanceCar", 1250]; -life_settings_viewDistanceAir = profileNamespace getVariable ["life_viewDistanceAir", 1250]; - -//Uniform price (0),Hat Price (1),Glasses Price (2),Vest Price (3),Backpack Price (4) -life_clothing_purchase = [-1, -1, -1, -1, -1]; -/* -***************************** -****** Weight Variables ***** -***************************** -*/ -life_maxWeight = LIFE_SETTINGS(getNumber, "total_maxWeight"); -life_carryWeight = 0; //Represents the players current inventory weight (MUST START AT 0). - -/* -***************************** -****** Life Variables ******* -***************************** -*/ -life_net_dropped = false; -life_use_atm = true; -life_is_arrested = false; -life_is_alive = false; -life_delivery_in_progress = false; -life_thirst = 100; -life_hunger = 100; -CASH = 0; - -life_istazed = false; -life_isknocked = false; -life_vehicles = []; - -/* - Master Array of items? -*/ -//Setup variable inv vars. -{ - missionNamespace setVariable [ITEM_VARNAME(configName _x), 0]; -} forEach ("true" configClasses (missionConfigFile >> "VirtualItems")); - -/* Setup the BLAH! */ -{ - _varName = getText(_x >> "variable"); - _sideFlag = getText(_x >> "side"); - - missionNamespace setVariable [LICENSE_VARNAME(_varName,_sideFlag), false]; -} forEach ("true" configClasses (missionConfigFile >> "Licenses")); - -/* Setup life_hideoutBuildings */ -{ - _building = nearestBuilding getMarkerPos _x; - life_hideoutBuildings pushBack _building -} forEach (LIFE_SETTINGS(getArray,"gang_area")); +#include "..\script_macros.hpp" +/* + File: configuration.sqf + Author: + + Description: + Master Life Configuration File + This file is to setup variables for the client, there are still other configuration files in the system + +***************************** +****** Backend Variables ***** +***************************** +*/ +life_action_delay = time; +life_trunk_vehicle = objNull; +life_session_completed = false; +life_garage_store = false; +life_session_tries = 0; +life_siren_active = false; +life_clothing_filter = 0; +life_redgull_effect = time; +life_is_processing = false; +life_bail_paid = false; +life_impound_inuse = false; +life_action_inUse = false; +life_spikestrip = objNull; +life_knockout = false; +life_interrupted = false; +life_respawned = false; +life_removeWanted = false; +life_god = false; +life_frozen = false; +life_save_gear = []; +life_container_activeObj = objNull; +life_disable_getIn = false; +life_disable_getOut = false; +life_admin_debug = false; +life_civ_position = []; +life_markers = false; +life_markers_active = false; +life_canpay_bail = true; +life_storagePlacing = scriptNull; +life_hideoutBuildings = []; +life_firstSpawn = true; + +//Settings +life_settings_enableNewsBroadcast = profileNamespace getVariable ["life_enableNewsBroadcast", true]; +life_settings_enableSidechannel = profileNamespace getVariable ["life_enableSidechannel", true]; +life_settings_viewDistanceFoot = profileNamespace getVariable ["life_viewDistanceFoot", 1250]; +life_settings_viewDistanceCar = profileNamespace getVariable ["life_viewDistanceCar", 1250]; +life_settings_viewDistanceAir = profileNamespace getVariable ["life_viewDistanceAir", 1250]; + +//Uniform price (0),Hat Price (1),Glasses Price (2),Vest Price (3),Backpack Price (4) +life_clothing_purchase = [-1, -1, -1, -1, -1]; +/* +***************************** +****** Weight Variables ***** +***************************** +*/ +life_maxWeight = LIFE_SETTINGS(getNumber, "total_maxWeight"); +life_carryWeight = 0; //Represents the players current inventory weight (MUST START AT 0). + +/* +***************************** +****** Life Variables ******* +***************************** +*/ +life_net_dropped = false; +life_use_atm = true; +life_is_arrested = false; +life_is_alive = false; +life_delivery_in_progress = false; +life_thirst = 100; +life_hunger = 100; +CASH = 0; + +life_istazed = false; +life_isknocked = false; +life_vehicles = []; + +/* + Master Array of items? +*/ +//Setup variable inv vars. +{ + missionNamespace setVariable [ITEM_VARNAME(configName _x), 0]; +} forEach ("true" configClasses (missionConfigFile >> "VirtualItems")); + +/* Setup the BLAH! */ +{ + _varName = getText(_x >> "variable"); + _sideFlag = getText(_x >> "side"); + + missionNamespace setVariable [LICENSE_VARNAME(_varName,_sideFlag), false]; +} forEach ("true" configClasses (missionConfigFile >> "Licenses")); + +/* Setup life_hideoutBuildings */ +{ + _building = nearestBuilding getMarkerPos _x; + life_hideoutBuildings pushBack _building +} forEach (LIFE_SETTINGS(getArray,"gang_area")); diff --git a/Altis_Life.Altis/core/cop/fn_bountyReceive.sqf b/Altis_Life.Altis/core/cop/fn_bountyReceive.sqf index 37c42bef8..ce9beddcc 100644 --- a/Altis_Life.Altis/core/cop/fn_bountyReceive.sqf +++ b/Altis_Life.Altis/core/cop/fn_bountyReceive.sqf @@ -6,9 +6,11 @@ Description: Notifies the player he has received a bounty and gives him the cash. */ -private ["_val","_total"]; -_val = [_this,0,"",["",0]] call BIS_fnc_param; -_total = [_this,1,"",["",0]] call BIS_fnc_param; + +params [ + ["_val", "", [""]], + ["_total", "", [""]] +]; if (_val == _total) then { titleText[format [localize "STR_Cop_BountyRecieve",[_val] call life_fnc_numberText],"PLAIN"]; diff --git a/Altis_Life.Altis/core/cop/fn_containerInvSearch.sqf b/Altis_Life.Altis/core/cop/fn_containerInvSearch.sqf index ceaccab38..13ee5b4b7 100644 --- a/Altis_Life.Altis/core/cop/fn_containerInvSearch.sqf +++ b/Altis_Life.Altis/core/cop/fn_containerInvSearch.sqf @@ -1,42 +1,46 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_containerInvSearch.sqf - Author: NiiRoZz - Inspired : Bryan "Tonic" Boardwine - - Description: - Searches the container for illegal items. -*/ -private ["_container","_containerInfo","_value"]; -_container = [_this,0,objNull,[objNull]] call BIS_fnc_param; -if (isNull _container) exitWith {}; - -_containerInfo = _container getVariable ["Trunk",[]]; -if (count _containerInfo isEqualTo 0) exitWith {hint localize "STR_Cop_ContainerEmpty"}; - -_value = 0; -_illegalValue = 0; -{ - _var = _x select 0; - _val = _x select 1; - _isIllegalItem = M_CONFIG(getNumber,"VirtualItems",_var,"illegal"); - if (_isIllegalItem isEqualTo 1 ) then { - _illegalPrice = M_CONFIG(getNumber,"VirtualItems",_var,"sellPrice"); - if (!isNull (missionConfigFile >> "VirtualItems" >> _var >> "processedItem")) then { - _illegalItemProcessed = M_CONFIG(getText,"VirtualItems",_var,"processedItem"); - _illegalPrice = M_CONFIG(getNumber,"VirtualItems",_illegalItemProcessed,"sellPrice"); - }; - - _illegalValue = _illegalValue + (round(_val * _illegalPrice / 2)); - }; -} forEach (_containerInfo select 0); -_value = _illegalValue; -if (_value > 0) then { - [0,"STR_NOTF_ContainerContraband",true,[[_value] call life_fnc_numberText]] remoteExecCall ["life_fnc_broadcast",RCLIENT]; - BANK = BANK + _value; - [1] call SOCK_fnc_updatePartial; - _container setVariable ["Trunk",[[],0],true]; - [_container] remoteExecCall ["TON_fnc_updateHouseTrunk",2]; -} else { - hint localize "STR_Cop_NoIllegalContainer"; -}; +#include "..\..\script_macros.hpp" +/* + File: fn_containerInvSearch.sqf + Author: NiiRoZz + Inspired : Bryan "Tonic" Boardwine + + Description: + Searches the container for illegal items. +*/ + +params [ + ["_container", objNull, [objNull]] +]; + +if (isNull _container) exitWith {}; + +private _containerInfo = _container getVariable ["Trunk",[]]; +if (_containerInfo isEqualTo []) exitWith {hint localize "STR_Cop_ContainerEmpty"}; +_containerInfo params ["_items"]; + +private _illegalValue = 0; +{ + _x params ["_var", "_val"]; + + private _isIllegalItem = M_CONFIG(getNumber,"VirtualItems",_var,"illegal"); + if (_isIllegalItem isEqualTo 1) then { + private _illegalPrice = M_CONFIG(getNumber,"VirtualItems",_var,"sellPrice"); + if !(isNull (missionConfigFile >> "VirtualItems" >> _var >> "processedItem")) then { + private _illegalItemProcessed = M_CONFIG(getText,"VirtualItems",_var,"processedItem"); + _illegalPrice = M_CONFIG(getNumber,"VirtualItems",_illegalItemProcessed,"sellPrice"); + }; + + _illegalValue = _illegalValue + (round(_val * _illegalPrice / 2)); + }; + true +} count _items; + +if (_illegalValue > 0) then { + [0,"STR_NOTF_ContainerContraband",true,[[_illegalValue] call life_fnc_numberText]] remoteExecCall ["life_fnc_broadcast",RCLIENT]; + BANK = BANK + _illegalValue; + [1] call SOCK_fnc_updatePartial; + _container setVariable ["Trunk",[[],0],true]; + [_container] remoteExecCall ["TON_fnc_updateHouseTrunk",2]; +} else { + hint localize "STR_Cop_NoIllegalContainer"; +}; diff --git a/Altis_Life.Altis/core/cop/fn_copInteractionMenu.sqf b/Altis_Life.Altis/core/cop/fn_copInteractionMenu.sqf index 8eb9dedf6..156e624bd 100644 --- a/Altis_Life.Altis/core/cop/fn_copInteractionMenu.sqf +++ b/Altis_Life.Altis/core/cop/fn_copInteractionMenu.sqf @@ -1,90 +1,101 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_copInteractionMenu.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Replaces the mass addactions for various cop actions towards another player. -*/ -#define Btn1 37450 -#define Btn2 37451 -#define Btn3 37452 -#define Btn4 37453 -#define Btn5 37454 -#define Btn6 37455 -#define Btn7 37456 -#define Btn8 37457 -#define Title 37401 - -private ["_display","_curTarget","_seizeRank","_Btn1","_Btn2","_Btn3","_Btn4","_Btn5","_Btn6","_Btn7","_Btn8"]; - -disableSerialization; -_curTarget = param [0,objNull,[objNull]]; -_seizeRank = LIFE_SETTINGS(getNumber,"seize_minimum_rank"); - -if (player getVariable ["Escorting", false]) then { - if (isNull _curTarget) exitWith {closeDialog 0;}; //Bad target - if (!isPlayer _curTarget && side _curTarget isEqualTo civilian) exitWith {closeDialog 0;}; //Bad side check? - if (player distance _curTarget > 4 ) exitWith {closeDialog 0;}; // Prevents menu accessing from far distances. -}; - -if (!dialog) then { - createDialog "pInteraction_Menu"; -}; - -_display = findDisplay 37400; -_Btn1 = _display displayCtrl Btn1; -_Btn2 = _display displayCtrl Btn2; -_Btn3 = _display displayCtrl Btn3; -_Btn4 = _display displayCtrl Btn4; -_Btn5 = _display displayCtrl Btn5; -_Btn6 = _display displayCtrl Btn6; -_Btn7 = _display displayCtrl Btn7; -_Btn8 = _display displayCtrl Btn8; -life_pInact_curTarget = _curTarget; - -if (player getVariable ["isEscorting",false]) then { - { _x ctrlShow false; } forEach [_Btn1,_Btn2,_Btn3,_Btn5,_Btn6,_Btn7,_Btn8]; -}; - -//Set Unrestrain Button -_Btn1 ctrlSetText localize "STR_pInAct_Unrestrain"; -_Btn1 buttonSetAction "[life_pInact_curTarget] call life_fnc_unrestrain; closeDialog 0;"; - -//Set Check Licenses Button -_Btn2 ctrlSetText localize "STR_pInAct_checkLicenses"; -_Btn2 buttonSetAction "[player] remoteExecCall [""life_fnc_licenseCheck"",life_pInact_curTarget]; closeDialog 0;"; - -//Set Search Button -_Btn3 ctrlSetText localize "STR_pInAct_SearchPlayer"; -_Btn3 buttonSetAction "[life_pInact_curTarget] spawn life_fnc_searchAction; closeDialog 0;"; - -//Set Escort Button -if (player getVariable ["isEscorting",false]) then { - _Btn4 ctrlSetText localize "STR_pInAct_StopEscort"; - _Btn4 buttonSetAction "[] call life_fnc_stopEscorting; closeDialog 0;"; -} else { - _Btn4 ctrlSetText localize "STR_pInAct_Escort"; - _Btn4 buttonSetAction "[life_pInact_curTarget] call life_fnc_escortAction; closeDialog 0;"; -}; - -//Set Ticket Button -_Btn5 ctrlSetText localize "STR_pInAct_TicketBtn"; -_Btn5 buttonSetAction "[life_pInact_curTarget] call life_fnc_ticketAction;"; - -_Btn6 ctrlSetText localize "STR_pInAct_Arrest"; -_Btn6 buttonSetAction "[life_pInact_curTarget] call life_fnc_arrestAction; closeDialog 0;"; -_Btn6 ctrlEnable false; - -_Btn7 ctrlSetText localize "STR_pInAct_PutInCar"; -_Btn7 buttonSetAction "[life_pInact_curTarget] call life_fnc_putInCar; closeDialog 0;"; - -//SeizeWeapons Button -_Btn8 ctrlSetText localize "STR_pInAct_Seize"; -_Btn8 buttonSetAction "[life_pInact_curTarget] spawn life_fnc_seizePlayerAction; closeDialog 0;"; - -if (FETCH_CONST(life_coplevel) < _seizeRank) then {_Btn8 ctrlEnable false;}; - -{ - if ((player distance (getMarkerPos _x) <30)) exitWith { _Btn6 ctrlEnable true;}; -} forEach LIFE_SETTINGS(getArray,"sendtoJail_locations"); \ No newline at end of file +#include "..\..\script_macros.hpp" +/* + File: fn_copInteractionMenu.sqf + Author: Bryan "Tonic" Boardwine + + Description: + Replaces the mass addactions for various cop actions towards another player. +*/ + +#define BTN_1 37450 +#define BTN_2 37451 +#define BTN_3 37452 +#define BTN_4 37453 +#define BTN_5 37454 +#define BTN_6 37455 +#define BTN_7 37456 +#define BTN_8 37457 +#define TITLE 37401 + +params [ + ["_curTarget", objNull, [objNull]] +]; + +disableSerialization; + +if (player getVariable ["Escorting", false]) then { + if (isNull _curTarget || {player distance _curTarget > 4}) exitWith { + closeDialog 0; + }; + if (!isPlayer _curTarget && {side _curTarget isEqualTo civilian}) exitWith { + closeDialog 0; + }; +}; + +if (!dialog) then { + createDialog "pInteraction_Menu"; +}; + +private _display = findDisplay 37400; +private _btn1 = _display displayCtrl BTN_1; +private _btn2 = _display displayCtrl BTN_2; +private _btn3 = _display displayCtrl BTN_3; +private _btn4 = _display displayCtrl BTN_4; +private _btn5 = _display displayCtrl BTN_5; +private _btn6 = _display displayCtrl BTN_6; +private _btn7 = _display displayCtrl BTN_7; +private _btn8 = _display displayCtrl BTN_8; + +life_pInact_curTarget = _curTarget; +private _seizeRank = LIFE_SETTINGS(getNumber,"seize_minimum_rank"); + +if (player getVariable ["isEscorting",false]) then { + { + _x ctrlShow false; + } count [_btn1,_btn2,_btn3,_btn5,_btn6,_btn7,_btn8]; +}; + +//Set Unrestrain Button +_btn1 ctrlSetText localize "STR_pInAct_Unrestrain"; +_btn1 buttonSetAction "[life_pInact_curTarget] call life_fnc_unrestrain; closeDialog 0;"; + +//Set Check Licenses Button +_btn2 ctrlSetText localize "STR_pInAct_checkLicenses"; +_btn2 buttonSetAction "[player] remoteExecCall [""life_fnc_licenseCheck"",life_pInact_curTarget]; closeDialog 0;"; + +//Set Search Button +_btn3 ctrlSetText localize "STR_pInAct_SearchPlayer"; +_btn3 buttonSetAction "[life_pInact_curTarget] spawn life_fnc_searchAction; closeDialog 0;"; + +//Set Escort Button +if (player getVariable ["isEscorting",false]) then { + _btn4 ctrlSetText localize "STR_pInAct_StopEscort"; + _btn4 buttonSetAction "[] call life_fnc_stopEscorting; closeDialog 0;"; +} else { + _btn4 ctrlSetText localize "STR_pInAct_Escort"; + _btn4 buttonSetAction "[life_pInact_curTarget] call life_fnc_escortAction; closeDialog 0;"; +}; + +//Set Ticket Button +_btn5 ctrlSetText localize "STR_pInAct_TicketBtn"; +_btn5 buttonSetAction "[life_pInact_curTarget] call life_fnc_ticketAction;"; + +_btn6 ctrlSetText localize "STR_pInAct_Arrest"; +_btn6 buttonSetAction "[life_pInact_curTarget] call life_fnc_arrestAction; closeDialog 0;"; +_btn6 ctrlEnable false; + +_btn7 ctrlSetText localize "STR_pInAct_PutInCar"; +_btn7 buttonSetAction "[life_pInact_curTarget] call life_fnc_putInCar; closeDialog 0;"; + +//SeizeWeapons Button +_btn8 ctrlSetText localize "STR_pInAct_Seize"; +_btn8 buttonSetAction "[life_pInact_curTarget] spawn life_fnc_seizePlayerAction; closeDialog 0;"; + +if (FETCH_CONST(life_coplevel) < _seizeRank) then {_btn8 ctrlEnable false;}; + +{ + if (player distance (getMarkerPos _x) < 30) exitWith { + _btn6 ctrlEnable true; + }; + true +} count LIFE_SETTINGS(getArray,"sendtoJail_locations"); diff --git a/Altis_Life.Altis/core/cop/fn_copMarkers.sqf b/Altis_Life.Altis/core/cop/fn_copMarkers.sqf index 1c6c14251..d75d63a67 100644 --- a/Altis_Life.Altis/core/cop/fn_copMarkers.sqf +++ b/Altis_Life.Altis/core/cop/fn_copMarkers.sqf @@ -5,39 +5,42 @@ Description: Marks cops on the map for other cops. Only initializes when the actual map is open. */ -private ["_markers","_cops"]; -_markers = []; -_cops = []; + +private _markers = []; +private _cops = []; sleep 0.5; if (visibleMap) then { - {if (side _x isEqualTo west) then {_cops pushBack _x;}} forEach playableUnits; //Fetch list of cops / blufor + _cops = playableUnits select {side _x isEqualTo west}; //Create markers { if !(_x isEqualTo player) then { - _marker = createMarkerLocal [format ["%1_marker",_x],visiblePosition _x]; + private _marker = createMarkerLocal [format ["%1_marker",_x],visiblePosition _x]; _marker setMarkerColorLocal "ColorBLUFOR"; _marker setMarkerTypeLocal "Mil_dot"; _marker setMarkerTextLocal format ["%1", _x getVariable ["realname",name _x]]; _markers pushBack [_marker,_x]; }; - } forEach _cops; + true + } count _cops; while {visibleMap} do { { - private ["_unit"]; - _unit = _x select 1; - if (!isNil "_unit" && !isNull _unit) then { - (_x select 0) setMarkerPosLocal (visiblePosition _unit); + _x params ["_marker","_unit"]; + if (!isNil "_unit" && {!isNull _unit}) then { + _marker setMarkerPosLocal (visiblePosition _unit); }; - } forEach _markers; + true + } count _markers; if (!visibleMap) exitWith {}; sleep 0.02; }; - {deleteMarkerLocal (_x select 0);} forEach _markers; + { + deleteMarkerLocal (_x select 0); + } count _markers; _markers = []; _cops = []; }; diff --git a/Altis_Life.Altis/core/cop/fn_copSearch.sqf b/Altis_Life.Altis/core/cop/fn_copSearch.sqf index 76ad6d2bb..c594bc18f 100644 --- a/Altis_Life.Altis/core/cop/fn_copSearch.sqf +++ b/Altis_Life.Altis/core/cop/fn_copSearch.sqf @@ -1,63 +1,69 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_copSearch.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Returns information on the search. -*/ -life_action_inUse = false; -private ["_license","_guns","_gun"]; -params [ - ["_civ",objNull,[objNull]], - ["_invs",[],[[]]], - ["_robber",false,[false]] -]; - -if (isNull _civ) exitWith {}; - -_illegal = 0; -_inv = ""; -if (count _invs > 0) then { - { - _displayName = M_CONFIG(getText,"VirtualItems",(_x select 0),"displayName"); - _inv = _inv + format ["%1 %2
",(_x select 1),(localize _displayName)]; - _price = M_CONFIG(getNumber,"VirtualItems",(_x select 0),"sellPrice"); - if (!isNull (missionConfigFile >> "VirtualItems" >> (_x select 0) >> "processedItem")) then { - _processed = M_CONFIG(getText,"VirtualItems",(_x select 0),"processedItem"); - _price = M_CONFIG(getNumber,"VirtualItems",_processed,"sellPrice"); - }; - - if (!(_price isEqualTo -1)) then { - _illegal = _illegal + ((_x select 1) * _price); - }; - } forEach _invs; - if (_illegal > 6000) then { - - if (life_HC_isActive) then { - [getPlayerUID _civ,_civ getVariable ["realname",name _civ],"482"] remoteExecCall ["HC_fnc_wantedAdd",HC_Life]; - } else { - [getPlayerUID _civ,_civ getVariable ["realname",name _civ],"482"] remoteExecCall ["life_fnc_wantedAdd",RSERV]; - }; - - }; - - if (life_HC_isActive) then { - [getPlayerUID _civ,_civ getVariable ["realname",name _civ],"481"] remoteExecCall ["HC_fnc_wantedAdd",HC_Life]; - } else { - [getPlayerUID _civ,_civ getVariable ["realname",name _civ],"481"] remoteExecCall ["life_fnc_wantedAdd",RSERV]; - }; - - [0,"STR_Cop_Contraband",true,[(_civ getVariable ["realname",name _civ]),[_illegal] call life_fnc_numberText]] remoteExecCall ["life_fnc_broadcast",west]; -} else { - _inv = localize "STR_Cop_NoIllegal"; -}; - -if (!alive _civ || player distance _civ > 5) exitWith {hint format [localize "STR_Cop_CouldntSearch",_civ getVariable ["realname",name _civ]]}; -//hint format ["%1",_this]; -hint parseText format ["%1

" +(localize "STR_Cop_IllegalItems")+ "

%2



%3" -,(_civ getVariable ["realname",name _civ]),_inv,if (_robber) then {"Robbed the bank"} else {""}]; - -if (_robber) then { - [0,"STR_Cop_Robber",true,[(_civ getVariable ["realname",name _civ])]] remoteExecCall ["life_fnc_broadcast",RCLIENT]; -}; +#include "..\..\script_macros.hpp" +/* + File: fn_copSearch.sqf + Author: Bryan "Tonic" Boardwine + + Description: + Returns information on the search. +*/ + +life_action_inUse = false; + +params [ + ["_civ",objNull,[objNull]], + ["_invs",[],[[]]], + ["_robber",false,[false]] +]; + +if (isNull _civ) exitWith {}; + +private _inv = ""; +if (count _invs > 0) then { + private _illegal = 0; + { + _x params ["_var", "_count"]; + + private _displayName = M_CONFIG(getText,"VirtualItems", _var, "displayName"); + _inv = _inv + format ["%1 %2
", _count, localize _displayName]; + private _price = M_CONFIG(getNumber,"VirtualItems", _var, "sellPrice"); + if (!isNull (missionConfigFile >> "VirtualItems" >> _var >> "processedItem")) then { + private _processed = M_CONFIG(getText,"VirtualItems", _var, "processedItem"); + _price = M_CONFIG(getNumber,"VirtualItems", _processed, "sellPrice"); + }; + + if !(_price isEqualTo -1) then { + _illegal = _illegal + (_count * _price); + }; + true + } count _invs; + if (_illegal > 6000) then { + + if (life_HC_isActive) then { + [getPlayerUID _civ,_civ getVariable ["realname",name _civ],"482"] remoteExecCall ["HC_fnc_wantedAdd",HC_Life]; + } else { + [getPlayerUID _civ,_civ getVariable ["realname",name _civ],"482"] remoteExecCall ["life_fnc_wantedAdd",RSERV]; + }; + + }; + + if (life_HC_isActive) then { + [getPlayerUID _civ,_civ getVariable ["realname",name _civ],"481"] remoteExecCall ["HC_fnc_wantedAdd",HC_Life]; + } else { + [getPlayerUID _civ,_civ getVariable ["realname",name _civ],"481"] remoteExecCall ["life_fnc_wantedAdd",RSERV]; + }; + + [0,"STR_Cop_Contraband",true,[(_civ getVariable ["realname",name _civ]),[_illegal] call life_fnc_numberText]] remoteExecCall ["life_fnc_broadcast",west]; +} else { + _inv = localize "STR_Cop_NoIllegal"; +}; + +if (!alive _civ || {player distance _civ > 5}) exitWith { + hint format [localize "STR_Cop_CouldntSearch",_civ getVariable ["realname",name _civ]] +}; + +hint parseText format ["%1

" + (localize "STR_Cop_IllegalItems")+ "

%2



%3", +(_civ getVariable ["realname",name _civ]), _inv, ["", "Robbed the bank"] select _robber]; + +if (_robber) then { + [0,"STR_Cop_Robber",true,[_civ getVariable ["realname",name _civ]]] remoteExecCall ["life_fnc_broadcast",RCLIENT]; +}; diff --git a/Altis_Life.Altis/core/cop/fn_copSiren.sqf b/Altis_Life.Altis/core/cop/fn_copSiren.sqf index 93226def6..1d747c651 100644 --- a/Altis_Life.Altis/core/cop/fn_copSiren.sqf +++ b/Altis_Life.Altis/core/cop/fn_copSiren.sqf @@ -1,23 +1,25 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_copSiren.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Starts the cop siren sound for other players. -*/ -private ["_vehicle"]; -_vehicle = param [0,objNull,[objNull]]; - -if (isNull _vehicle) exitWith {}; -if (isNil {_vehicle getVariable "siren"}) exitWith {}; - -for "_i" from 0 to 1 step 0 do { - if (!(_vehicle getVariable "siren")) exitWith {}; - if (count crew _vehicle isEqualTo 0) then {_vehicle setVariable ["siren",false,true]}; - if (!alive _vehicle) exitWith {}; - if (isNull _vehicle) exitWith {}; - _vehicle say3D ["sirenLong",500,1]; //Class name specified in description.ext, max distance & pitch - sleep 4.870;//Exactly matches the length of the audio file. - if (!(_vehicle getVariable "siren")) exitWith {}; -}; +#include "..\..\script_macros.hpp" +/* + File: fn_copSiren.sqf + Author: Bryan "Tonic" Boardwine + + Description: + Starts the cop siren sound for other players. +*/ + +params [ + ["_vehicle",objNull,[objNull]] +]; + +if (isNull _vehicle) exitWith {}; +if (isNil {_vehicle getVariable "siren"}) exitWith {}; + +for "_i" from 0 to 1 step 0 do { + if !(alive _vehicle) exitWith {}; //also checks for objNull + if !(_vehicle getVariable "siren") exitWith {}; + if (crew _vehicle isEqualTo []) then { + _vehicle setVariable ["siren",false,true] + }; + _vehicle say3D ["sirenLong",500,1]; //Class name specified in description.ext, max distance & pitch + uiSleep 4.870; //Exactly matches the length of the audio file. +}; diff --git a/Altis_Life.Altis/core/cop/fn_doorAnimate.sqf b/Altis_Life.Altis/core/cop/fn_doorAnimate.sqf index 4d87ddafc..60df077ac 100644 --- a/Altis_Life.Altis/core/cop/fn_doorAnimate.sqf +++ b/Altis_Life.Altis/core/cop/fn_doorAnimate.sqf @@ -5,7 +5,7 @@ Author: Bryan "Tonic" Boardwine Description: - Animates a door? + Animates a door */ params [ diff --git a/Altis_Life.Altis/core/cop/fn_fedCamDisplay.sqf b/Altis_Life.Altis/core/cop/fn_fedCamDisplay.sqf index 6e1552bb0..ebade7236 100644 --- a/Altis_Life.Altis/core/cop/fn_fedCamDisplay.sqf +++ b/Altis_Life.Altis/core/cop/fn_fedCamDisplay.sqf @@ -16,7 +16,7 @@ params [ private _altisArray = [16019.5,16952.9,0]; private _tanoaArray = [11074.2,11501.5,0.00137329]; -private _pos = [[["Altis", _altisArray], ["Tanoa", _tanoaArray]]] call TON_fnc_terrainSort; +private _pos = [[["Altis", _altisArray], ["Tanoa", _tanoaArray]]] call life_util_fnc_terrainSort; private _dome = nearestObject [_pos,"Land_Dome_Big_F"]; @@ -35,9 +35,9 @@ private _mTwPositions = [ ["vault",[19.9775,-0.0078125,-1.90735e-006],[-5.00684,0.59375,-9.57164]], ["front",[0.972656,78.8281,15.617],[-0.657227,22.9082,-10.4033]], ["back",[28.9248,-42.0977,-3.8896],[-1.33789,-24.6035,-10.2108]] -]; +]; //modelToWorld positions -private _index = [_mode,_mTwPositions] call TON_fnc_index; +private _index = [_mode,_mTwPositions] call life_util_fnc_index; if (_index isEqualTo -1) then { //Turn off @@ -46,7 +46,7 @@ if (_index isEqualTo -1) then { _laptop setObjectTexture [0,""]; life_fed_scam = nil; } else { - _temp = _mTwPositions select _index; + private _temp = _mTwPositions select _index; life_fed_scam camSetPos (_dome modelToWorld (_temp select 1)); life_fed_scam camSetTarget (_dome modelToWorld (_temp select 2)); life_fed_scam camCommit 0; diff --git a/Altis_Life.Altis/core/cop/fn_licenseCheck.sqf b/Altis_Life.Altis/core/cop/fn_licenseCheck.sqf index 385f3b9ca..a5972f830 100644 --- a/Altis_Life.Altis/core/cop/fn_licenseCheck.sqf +++ b/Altis_Life.Altis/core/cop/fn_licenseCheck.sqf @@ -1,25 +1,31 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_licenseCheck.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Returns the licenses to the cop. -*/ -private ["_cop","_licenses","_licensesConfigs"]; -_cop = param [0,objNull,[objNull]]; -if (isNull _cop) exitWith {}; //Bad entry - -_licenses = ""; - -//Config entries for licenses that are civilian -_licensesConfigs = "getText(_x >> 'side') isEqualTo 'civ'" configClasses (missionConfigFile >> "Licenses"); - -{ - if (LICENSE_VALUE(configName _x,"civ")) then { - _licenses = _licenses + localize getText(_x >> "displayName") + "
"; - }; -} forEach _licensesConfigs; - -if (_licenses isEqualTo "") then {_licenses = (localize "STR_Cop_NoLicensesFound");}; -[profileName,_licenses] remoteExecCall ["life_fnc_licensesRead",_cop]; +#include "..\..\script_macros.hpp" +/* + File: fn_licenseCheck.sqf + Author: Bryan "Tonic" Boardwine + + Description: + Returns the licenses to the cop. +*/ + +params [ + ["_cop",objNull,[objNull]] +]; + +if (isNull _cop) exitWith {}; //Bad entry + +private _licenses = ""; + +//Config entries for licenses that are civilian +private _licensesConfigs = "getText(_x >> 'side') isEqualTo 'civ'" configClasses (missionConfigFile >> "Licenses"); + +{ + if (LICENSE_VALUE(configName _x, "civ")) then { + _licenses = _licenses + localize getText(_x >> "displayName") + "
"; + }; + true +} count _licensesConfigs; + +if (_licenses isEqualTo "") then { + _licenses = localize "STR_Cop_NoLicensesFound"; +}; +[profileName,_licenses] remoteExecCall ["life_fnc_licensesRead",_cop]; diff --git a/Altis_Life.Altis/core/cop/fn_licensesRead.sqf b/Altis_Life.Altis/core/cop/fn_licensesRead.sqf index 65471ff48..a7af674d5 100644 --- a/Altis_Life.Altis/core/cop/fn_licensesRead.sqf +++ b/Altis_Life.Altis/core/cop/fn_licensesRead.sqf @@ -1,13 +1,14 @@ -/* - File: fn_licensesRead.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Outprints the licenses. -*/ -params [ - ["_civ","",[""]], - ["_licenses",(localize "STR_Cop_NoLicenses"),[""]] -]; - -hint parseText format ["%1
" +(localize "STR_Cop_Licenses")+ "
%2",_civ,_licenses]; \ No newline at end of file +/* + File: fn_licensesRead.sqf + Author: Bryan "Tonic" Boardwine + + Description: + Outprints the licenses. +*/ + +params [ + ["_civ", "", [""]], + ["_licenses", "", [""]] +]; + +hint parseText format ["%1
" + (localize "STR_Cop_Licenses")+ "
%2",_civ,_licenses]; diff --git a/Altis_Life.Altis/core/cop/fn_questionDealer.sqf b/Altis_Life.Altis/core/cop/fn_questionDealer.sqf index 1a97e6c56..fc49414c2 100644 --- a/Altis_Life.Altis/core/cop/fn_questionDealer.sqf +++ b/Altis_Life.Altis/core/cop/fn_questionDealer.sqf @@ -1,33 +1,44 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_questionDealer.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Questions the drug dealer and sets the sellers wanted. -*/ -private ["_sellers","_crimes","_names"]; -_sellers = (_this select 0) getVariable ["sellers",[]]; -if (count _sellers isEqualTo 0) exitWith {hint localize "STR_Cop_DealerQuestion"}; //No data. -life_action_inUse = true; -_crimes = LIFE_SETTINGS(getArray,"crimes"); - -_names = ""; -{ - _val = 0; - if ((_x select 2) > 150000) then { - _val = round((_x select 2) / 16); - } else { - _val = ["483",_crimes] call TON_fnc_index; - _val = ((_crimes select _val) select 1); - if (_val isEqualType "") then { - _val = parseNumber _val; - }; - }; - [(_x select 0),(_x select 1),"483",_val] remoteExecCall ["life_fnc_wantedAdd",RSERV]; - _names = _names + format ["%1
",(_x select 1)]; -} forEach _sellers; - -hint parseText format [(localize "STR_Cop_DealerMSG")+ "

%1",_names]; -(_this select 0) setVariable ["sellers",[],true]; -life_action_inUse = false; +#include "..\..\script_macros.hpp" +/* + File: fn_questionDealer.sqf + Author: Bryan "Tonic" Boardwine + + Description: + Questions the drug dealer and sets the sellers wanted. +*/ + +params [ + ["_dealer", objNull, [objNull]] +]; + +private _sellers = _dealer getVariable ["sellers", []]; + +if (_sellers isEqualTo []) exitWith { + hint localize "STR_Cop_DealerQuestion" +}; + +life_action_inUse = true; +private _crimes = LIFE_SETTINGS(getArray,"crimes"); + +private _names = ""; +{ + _x params ["_uid","_name","_value"]; + private _val = 0; + if (_value > 150000) then { + _val = round(_value / 16); + } else { + _val = ["483",_crimes] call life_util_fnc_index; + _val = ((_crimes select _val) select 1); + if (_val isEqualType "") then { + _val = parseNumber _val; + }; + }; + [_uid,_name,"483",_val] remoteExecCall ["life_fnc_wantedAdd",RSERV]; + _names = _names + format ["%1
",_name]; + + true +} count _sellers; + +hint parseText format [(localize "STR_Cop_DealerMSG")+ "

%1",_names]; +_dealer setVariable ["sellers",[],true]; +life_action_inUse = false; diff --git a/Altis_Life.Altis/core/cop/fn_radar.sqf b/Altis_Life.Altis/core/cop/fn_radar.sqf index 1c6657b9b..844a65e2b 100644 --- a/Altis_Life.Altis/core/cop/fn_radar.sqf +++ b/Altis_Life.Altis/core/cop/fn_radar.sqf @@ -1,23 +1,22 @@ -/* - File: fn_radar.sqf - Author: Silly Aussie kid named Jaydon - - Description: - Looks like weird but radar? -*/ -if !(playerSide isEqualTo west) exitWith {}; -private ["_speed","_vehicle"]; -_vehicle = cursorObject; -_speed = round speed _vehicle; - -if ((_vehicle isKindOf "Car") && (currentWeapon player) isEqualTo "hgun_P07_snds_F") then { - switch (true) do { - case (_speed > 33 && _speed <= 80): { - hint parseText format ["" +(localize "STR_Cop_Radar")+ "
" +(localize "STR_Cop_VehSpeed"),round _speed]; - }; - - case (_speed > 80): { - hint parseText format ["" +(localize "STR_Cop_Radar")+ "
" +(localize "STR_Cop_VehSpeed"),round _speed]; - }; - }; -}; +/* + File: fn_radar.sqf + Author: Silly Aussie kid named Jaydon + + Description: + Radar +*/ + +if !(playerSide isEqualTo west) exitWith {}; + +private _vehicle = cursorObject; +if (_vehicle isKindOf "Car" && {currentWeapon player isEqualTo "hgun_P07_snds_F"}) then { + private _speed = round speed _vehicle; + + if (_speed > 80) then { + hint parseText format ["" + (localize "STR_Cop_Radar")+ "
" + (localize "STR_Cop_VehSpeed"), _speed]; + } else { + if (_speed > 33) then { + hint parseText format ["" + (localize "STR_Cop_Radar")+ "
" + (localize "STR_Cop_VehSpeed"), _speed]; + }; + }; +}; diff --git a/Altis_Life.Altis/core/cop/fn_repairDoor.sqf b/Altis_Life.Altis/core/cop/fn_repairDoor.sqf index ec858acbb..a8b20febb 100644 --- a/Altis_Life.Altis/core/cop/fn_repairDoor.sqf +++ b/Altis_Life.Altis/core/cop/fn_repairDoor.sqf @@ -6,43 +6,55 @@ Description: Re-locks the door mainly for the federal reserve structures. */ -private ["_building","_doors","_door","_cP","_cpRate","_ui","_title","_titleText","_locked"]; -_building = param [0,objNull,[objNull]]; + +params [ + ["_building", objNull, [objNull]] +]; + if (isNull _building) exitWith {}; -if (!(_building isKindOf "House_F")) exitWith {hint localize "STR_ISTR_Bolt_NotNear";}; +if !(_building isKindOf "House_F") exitWith { + hint localize "STR_ISTR_Bolt_NotNear"; +}; -_doors = 1; +private _doors = 1; _doors = FETCH_CONFIG2(getNumber,"CfgVehicles",(typeOf _building),"NumberOfDoors"); -_door = 0; +private _door = 0; + //Find the nearest door for "_i" from 1 to _doors do { - _selPos = _building selectionPosition format ["Door_%1_trigger",_i]; - _worldSpace = _building modelToWorld _selPos; - if (player distance _worldSpace < 5) exitWith {_door = _i;}; + private _selPos = _building selectionPosition format ["Door_%1_trigger",_i]; + private _worldSpace = _building modelToWorld _selPos; + if (player distance _worldSpace < 5) exitWith { + _door = _i; + }; }; -if (_door isEqualTo 0) exitWith {hint localize "STR_Cop_NotaDoor"}; //Not near a door to be broken into. -_doorN = _building getVariable [format ["bis_disabled_Door_%1",_door],0]; -if (_doorN isEqualTo 1) exitWith {hint localize "STR_House_FedDoor_Locked"}; +if (_door isEqualTo 0) exitWith { + hint localize "STR_Cop_NotaDoor" +}; //Not near a door to be broken into. +private _doorN = _building getVariable [format ["bis_disabled_Door_%1",_door],0]; +if (_doorN isEqualTo 1) exitWith { + hint localize "STR_House_FedDoor_Locked" +}; life_action_inUse = true; closeDialog 0; //Setup the progress bar disableSerialization; -_title = localize "STR_Cop_RepairingDoor"; +private _title = localize "STR_Cop_RepairingDoor"; "progressBar" cutRsc ["life_progress","PLAIN"]; -_ui = uiNamespace getVariable "life_progress"; -_progressBar = _ui displayCtrl 38201; -_titleText = _ui displayCtrl 38202; +private _ui = uiNamespace getVariable "life_progress"; +private _progressBar = _ui displayCtrl 38201; +private _titleText = _ui displayCtrl 38202; _titleText ctrlSetText format ["%2 (1%1)...","%",_title]; _progressBar progressSetPosition 0.01; -_cP = 0.01; +private _cP = 0.01; -switch (typeOf _building) do { - case "Land_Dome_Big_F": {_cpRate = 0.008;}; +private _cpRate = switch (typeOf _building) do { + case "Land_Dome_Big_F": {0.008}; case "Land_Medevac_house_V1_F"; - case "Land_Research_house_V1_F": {_cpRate = 0.005;}; - default {_cpRate = 0.08;} + case "Land_Research_house_V1_F": {0.005}; + default {0.08}; }; for "_i" from 0 to 1 step 0 do { @@ -59,23 +71,31 @@ for "_i" from 0 to 1 step 0 do { _cP = _cP + _cpRate; _progressBar progressSetPosition _cP; _titleText ctrlSetText format ["%3 (%1%2)...",round(_cP * 100),"%",_title]; - if (_cP >= 1 || !alive player) exitWith {}; + if (_cP >= 1 || {!alive player}) exitWith {}; if (life_interrupted) exitWith {}; }; //Kill the UI display and check for various states "progressBar" cutText ["","PLAIN"]; player playActionNow "stop"; -if (!alive player) exitWith {life_action_inUse = false;}; -if (life_interrupted) exitWith {life_interrupted = false; titleText[localize "STR_NOTF_ActionCancel","PLAIN"]; life_action_inUse = false;}; + life_action_inUse = false; +if (!alive player) exitWith {}; + +if (life_interrupted) exitWith { + life_interrupted = false; + titleText[localize "STR_NOTF_ActionCancel","PLAIN"]; +}; + _building animateSource [format ["Door_%1_source", _door], 0]; _building setVariable [format ["bis_disabled_Door_%1",_door],1,true]; //Lock the door. -_locked = true; +private _locked = true; for "_i" from 1 to _doors do { - if ((_building getVariable [format ["bis_disabled_Door_%1",_i],0]) isEqualTo 0) exitWith {_locked = false}; + if (_building getVariable [format ["bis_disabled_Door_%1",_i],0] isEqualTo 0) exitWith { + _locked = false + }; }; if (_locked) then { diff --git a/Altis_Life.Altis/core/cop/fn_restrain.sqf b/Altis_Life.Altis/core/cop/fn_restrain.sqf index 655b8bc3a..2d67079b5 100644 --- a/Altis_Life.Altis/core/cop/fn_restrain.sqf +++ b/Altis_Life.Altis/core/cop/fn_restrain.sqf @@ -1,94 +1,101 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_restrain.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Restrains the client. -*/ -private ["_cop","_player","_vehicle"]; -_cop = [_this,0,objNull,[objNull]] call BIS_fnc_param; -_player = player; -_vehicle = vehicle player; -if (isNull _cop) exitWith {}; - -//Monitor excessive restrainment -[] spawn { - private "_time"; - for "_i" from 0 to 1 step 0 do { - _time = time; - waitUntil {(time - _time) > (5 * 60)}; - - if (!(player getVariable ["restrained",false])) exitWith {}; - if (!([west,getPos player,30] call life_fnc_nearUnits) && (player getVariable ["restrained",false]) && isNull objectParent player) exitWith { - player setVariable ["restrained",false,true]; - player setVariable ["Escorting",false,true]; - player setVariable ["transporting",false,true]; - detach player; - titleText[localize "STR_Cop_ExcessiveRestrain","PLAIN"]; - }; - }; -}; - -titleText[format [localize "STR_Cop_Restrained",_cop getVariable ["realname",name _cop]],"PLAIN"]; - -life_disable_getIn = true; -life_disable_getOut = false; - -while {player getVariable "restrained"} do { - if (isNull objectParent player) then { - player playMove "AmovPercMstpSnonWnonDnon_Ease"; - }; - - _state = vehicle player; - waitUntil {animationState player != "AmovPercMstpSnonWnonDnon_Ease" || !(player getVariable "restrained") || vehicle player != _state}; - - if (!alive player) exitWith { - player setVariable ["restrained",false,true]; - player setVariable ["Escorting",false,true]; - player setVariable ["transporting",false,true]; - detach _player; - }; - - if (!alive _cop) then { - player setVariable ["Escorting",false,true]; - detach player; - }; - - if (!(isNull objectParent player) && life_disable_getIn) then { - player action["eject",vehicle player]; - }; - - if (!(isNull objectParent player) && !(vehicle player isEqualTo _vehicle)) then { - _vehicle = vehicle player; - }; - - if (isNull objectParent player && life_disable_getOut) then { - player moveInCargo _vehicle; - }; - - if (!(isNull objectParent player) && life_disable_getOut && (driver (vehicle player) isEqualTo player)) then { - player action["eject",vehicle player]; - player moveInCargo _vehicle; - }; - - if (!(isNull objectParent player) && life_disable_getOut) then { - _turrets = [[-1]] + allTurrets _vehicle; - { - if (_vehicle turretUnit [_x select 0] isEqualTo player) then { - player action["eject",vehicle player]; - sleep 1; - player moveInCargo _vehicle; - }; - }forEach _turrets; - }; -}; - -//disableUserInput false; - -if (alive player) then { - player switchMove "AmovPercMstpSlowWrflDnon_SaluteIn"; - player setVariable ["Escorting",false,true]; - player setVariable ["transporting",false,true]; - detach player; -}; +#include "..\..\script_macros.hpp" +/* + File: fn_restrain.sqf + Author: Bryan "Tonic" Boardwine + + Description: + Restrains the client. +*/ + +params [ + ["_cop", objNull, [objNull]] +]; + +private _vehicle = vehicle player; +if (isNull _cop) exitWith {}; + +//Monitor excessive restrainment +[] spawn { + private "_time"; + for "_i" from 0 to 1 step 0 do { + _time = time; + waitUntil {time - _time > (5 * 60)}; + + if !(player getVariable ["restrained",false]) exitWith {}; + if (!([west,getPos player,30] call life_fnc_nearUnits) && {player getVariable ["restrained",false]} && {isNull objectParent player}) exitWith { + player setVariable ["restrained",false,true]; + player setVariable ["Escorting",false,true]; + player setVariable ["transporting",false,true]; + detach player; + titleText[localize "STR_Cop_ExcessiveRestrain","PLAIN"]; + }; + }; +}; + +titleText[format [localize "STR_Cop_Restrained", _cop getVariable ["realname",name _cop]], "PLAIN"]; + +life_disable_getIn = true; +life_disable_getOut = false; + +while {player getVariable ["restrained", false]} do { + if (isNull objectParent player) then { + player playMove "AmovPercMstpSnonWnonDnon_Ease"; + }; + + private _state = vehicle player; + waitUntil { + animationState player != "AmovPercMstpSnonWnonDnon_Ease" || + {!(player getVariable ["restrained", false])} || + {vehicle player != _state} + }; + + if (!alive player) exitWith { + player setVariable ["restrained",false,true]; + player setVariable ["Escorting",false,true]; + player setVariable ["transporting",false,true]; + detach player; + }; + + if (!alive _cop) then { + player setVariable ["Escorting",false,true]; + detach player; + }; + + if (!(isNull objectParent player) && {life_disable_getIn}) then { + player action["eject",vehicle player]; + }; + + if (!(isNull objectParent player) && {!(vehicle player isEqualTo _vehicle)}) then { + _vehicle = vehicle player; + }; + + if (isNull objectParent player && {life_disable_getOut}) then { + player moveInCargo _vehicle; + }; + + if (!(isNull objectParent player) && {life_disable_getOut} && {driver (vehicle player) isEqualTo player}) then { + player action["eject",vehicle player]; + player moveInCargo _vehicle; + }; + + if (!(isNull objectParent player) && {life_disable_getOut}) then { + _turrets = [[-1]] + allTurrets _vehicle; + { + if (_vehicle turretUnit [_x select 0] isEqualTo player) then { + player action["eject",vehicle player]; + sleep 1; + player moveInCargo _vehicle; + }; + true + } count _turrets; + }; +}; + +//disableUserInput false; + +if (alive player) then { + player switchMove "AmovPercMstpSlowWrflDnon_SaluteIn"; + player setVariable ["Escorting",false,true]; + player setVariable ["transporting",false,true]; + detach player; +}; diff --git a/Altis_Life.Altis/core/cop/fn_searchClient.sqf b/Altis_Life.Altis/core/cop/fn_searchClient.sqf index afb51eae6..0ca0d898f 100644 --- a/Altis_Life.Altis/core/cop/fn_searchClient.sqf +++ b/Altis_Life.Altis/core/cop/fn_searchClient.sqf @@ -6,24 +6,26 @@ Description: Searches the player and he returns information back to the player. */ -private ["_inv","_val","_var","_robber"]; + params [ ["_cop",objNull,[objNull]] ]; + if (isNull _cop) exitWith {}; -_inv = []; -_robber = false; +private _inv = []; +private _robber = false; //Illegal items { - _var = configName(_x); - _val = ITEM_VALUE(_var); + private _var = configName(_x); + private _val = ITEM_VALUE(_var); if (_val > 0) then { _inv pushBack [_var,_val]; [false,_var,_val] call life_fnc_handleInv; }; -} forEach ("getNumber(_x >> 'illegal') isEqualTo 1" configClasses (missionConfigFile >> "VirtualItems")); + true +} count ("getNumber(_x >> 'illegal') isEqualTo 1" configClasses (missionConfigFile >> "VirtualItems")); if (!life_use_atm) then { CASH = 0; diff --git a/Altis_Life.Altis/core/cop/fn_seizeClient.sqf b/Altis_Life.Altis/core/cop/fn_seizeClient.sqf index e4d850b51..d7c3fe902 100644 --- a/Altis_Life.Altis/core/cop/fn_seizeClient.sqf +++ b/Altis_Life.Altis/core/cop/fn_seizeClient.sqf @@ -6,45 +6,56 @@ Description: Removes the players weapons client side */ -private ["_exempt","_uniform","_vest","_headgear"]; -_exempt = LIFE_SETTINGS(getArray,"seize_exempt"); -_headgear = LIFE_SETTINGS(getArray,"seize_headgear"); -_vest = LIFE_SETTINGS(getArray,"seize_vest"); -_uniform = LIFE_SETTINGS(getArray,"seize_uniform"); + +private _exempt = LIFE_SETTINGS(getArray,"seize_exempt"); +private _headgear = LIFE_SETTINGS(getArray,"seize_headgear"); +private _vest = LIFE_SETTINGS(getArray,"seize_vest"); +private _uniform = LIFE_SETTINGS(getArray,"seize_uniform"); { - if (!(_x in _exempt)) then { + if !(_x in _exempt) then { player removeWeapon _x; }; -} forEach weapons player; + true +} count weapons player; { - if (!(_x in _exempt)) then { + if !(_x in _exempt) then { player removeItemFromUniform _x; }; -} forEach uniformItems player; + true +} count uniformItems player; { - if (!(_x in _exempt)) then { + if !(_x in _exempt) then { player removeItemFromVest _x; }; -} forEach vestItems player; + true +} count vestItems player; { - if (!(_x in _exempt)) then { + if !(_x in _exempt) then { player removeItemFromBackpack _x; }; -} forEach backpackItems player; + true +} count backpackItems player; { - if (!(_x in _exempt)) then { - player removeMagazine _x; + if !(_x in _exempt) then { + player removeMagazine _x; }; -} forEach magazines player; - -if (uniform player in _uniform) then {removeUniform player;}; -if (vest player in _vest) then {removeVest player;}; -if (headgear player in _headgear) then {removeHeadgear player;}; + true +} count magazines player; + +if (uniform player in _uniform) then { + removeUniform player; +}; +if (vest player in _vest) then { + removeVest player; +}; +if (headgear player in _headgear) then { + removeHeadgear player; +}; [] call SOCK_fnc_updateRequest; titleText[localize "STR_NOTF_SeizeIllegals","PLAIN"]; diff --git a/Altis_Life.Altis/core/cop/fn_sirenLights.sqf b/Altis_Life.Altis/core/cop/fn_sirenLights.sqf index fbe4f4940..e6dae3721 100644 --- a/Altis_Life.Altis/core/cop/fn_sirenLights.sqf +++ b/Altis_Life.Altis/core/cop/fn_sirenLights.sqf @@ -4,26 +4,20 @@ Author: Bryan "Tonic" Boardwine Description: - Lets play a game! Can you guess what it does? I have faith in you, if you can't - then you have failed me and therefor I lose all faith in humanity.. No pressure. + Toggles siren lights */ + params [ ["_vehicle",objNull,[objNull]] ]; -if (isNull _vehicle) exitWith {}; //Bad entry! -if !(typeOf _vehicle in ["C_Offroad_01_F","B_MRAP_01_F","C_SUV_01_F","C_Hatchback_01_sport_F","B_Heli_Light_01_F","B_Heli_Transport_01_F"]) exitWith {}; //Last chance check to prevent something from defying humanity and creating a monster. -private _trueorfalse = _vehicle getVariable ["lights",false]; +if (isNull _vehicle) exitWith {}; +if !(typeOf _vehicle in ["C_Offroad_01_F","B_MRAP_01_F","C_SUV_01_F","C_Hatchback_01_sport_F","B_Heli_Light_01_F","B_Heli_Transport_01_F"]) exitWith {}; + +private _lightsOn = _vehicle getVariable ["lights",false]; -if (_trueorfalse) then { - _vehicle setVariable ["lights",false,true]; - if !(isNil {(_vehicle getVariable "lightsJIP")}) then { - private _jip = _vehicle getVariable "lightsJIP"; - _vehicle setVariable ["lightsJIP",nil,true]; - remoteExec ["",_jip]; //remove from JIP queue - }; -} else { - _vehicle setVariable ["lights",true,true]; - private _jip = [_vehicle,0.22] remoteExec ["life_fnc_copLights",RCLIENT,true]; - _vehicle setVariable ["lightsJIP",_jip,true]; +if (!_lightsOn) then { + [_vehicle,0.22] remoteExec ["life_fnc_copLights",RCLIENT]; }; + +_vehicle setVariable ["lights", !_lightsOn, true]; \ No newline at end of file diff --git a/Altis_Life.Altis/core/cop/fn_spikeStripEffect.sqf b/Altis_Life.Altis/core/cop/fn_spikeStripEffect.sqf index 16a811648..e797fbde2 100644 --- a/Altis_Life.Altis/core/cop/fn_spikeStripEffect.sqf +++ b/Altis_Life.Altis/core/cop/fn_spikeStripEffect.sqf @@ -1,14 +1,16 @@ -/* - File: fn_spikeStripEffect.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Doesn't work without the server-side effect but shifted part of it clientside - so code can easily be changed. Ultimately it just pops the tires. -*/ -private ["_vehicle"]; -_vehicle = [_this,0,objNull,[objNull]] call BIS_fnc_param; -if (isNull _vehicle) exitWith {}; //Bad vehicle type - -_vehicle setHitPointDamage["HitLFWheel",1]; -_vehicle setHitPointDamage["HitRFWheel",1]; +/* + File: fn_spikeStripEffect.sqf + Author: Bryan "Tonic" Boardwine + + Description: + Pops the vehicles tyres - required due to the local arguments for setHitPointDamage being local. +*/ + +params [ + ["_vehicle",objNull,[objNull]] +]; + +if (isNull _vehicle) exitWith {}; + +_vehicle setHitPointDamage ["HitLFWheel",1]; +_vehicle setHitPointDamage ["HitRFWheel",1]; diff --git a/Altis_Life.Altis/core/cop/fn_ticketGive.sqf b/Altis_Life.Altis/core/cop/fn_ticketGive.sqf index 1fe0d7768..be8ef5193 100644 --- a/Altis_Life.Altis/core/cop/fn_ticketGive.sqf +++ b/Altis_Life.Altis/core/cop/fn_ticketGive.sqf @@ -1,19 +1,29 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_ticketGive.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Gives a ticket to the targeted player. -*/ -if (isNil "life_ticket_unit") exitWith {hint localize "STR_Cop_TicketNil"}; -if (isNull life_ticket_unit) exitWith {hint localize "STR_Cop_TicketExist"}; - -private _val = ctrlText 2652; - -if (!([_val] call TON_fnc_isnumber)) exitWith {hint localize "STR_Cop_TicketNum"}; -if ((parseNumber _val) > 200000) exitWith {hint localize "STR_Cop_TicketOver100"}; - -[0,"STR_Cop_TicketGive",true,[profileName,[(parseNumber _val)] call life_fnc_numberText,life_ticket_unit getVariable ["realname",name life_ticket_unit]]] remoteExecCall ["life_fnc_broadcast",RCLIENT]; -[player,(parseNumber _val)] remoteExec ["life_fnc_ticketPrompt",life_ticket_unit]; -closeDialog 0; +#include "..\..\script_macros.hpp" +/* + File: fn_ticketGive.sqf + Author: Bryan "Tonic" Boardwine + + Description: + Gives a ticket to the targeted player. +*/ + +if (isNil "life_ticket_unit") exitWith { + hint localize "STR_Cop_TicketNil" +}; + +if (isNull life_ticket_unit) exitWith { + hint localize "STR_Cop_TicketExist" +}; + +private _val = ctrlText 2652; +private _parsedVal = parseNumber _val; + +if !([_val] call life_util_fnc_isNumber) exitWith {hint localize "STR_Cop_TicketNum"}; + +if (_parsedVal > 200000) exitWith { + hint localize "STR_Cop_TicketOver100" +}; + +[0,"STR_Cop_TicketGive", true, [profileName, [_parsedVal] call life_fnc_numberText, life_ticket_unit getVariable ["realname", name life_ticket_unit]]] remoteExecCall ["life_fnc_broadcast", RCLIENT]; +[player, _parsedVal] remoteExecCall ["life_fnc_ticketPrompt", life_ticket_unit]; +closeDialog 0; diff --git a/Altis_Life.Altis/core/cop/fn_ticketPaid.sqf b/Altis_Life.Altis/core/cop/fn_ticketPaid.sqf index 714413c30..cbe500c49 100644 --- a/Altis_Life.Altis/core/cop/fn_ticketPaid.sqf +++ b/Altis_Life.Altis/core/cop/fn_ticketPaid.sqf @@ -1,18 +1,20 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_ticketPaid.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Verifies that the ticket was paid. -*/ -params [ - ["_value",5,[0]], - ["_unit",objNull,[objNull]], - ["_cop",objNull,[objNull]] -]; -if (isNull _unit || {!(_unit isEqualTo life_ticket_unit)}) exitWith {}; //NO -if (isNull _cop || {!(_cop isEqualTo player)}) exitWith {}; //Double NO - -BANK = BANK + _value; -[1] call SOCK_fnc_updatePartial; +#include "..\..\script_macros.hpp" +/* + File: fn_ticketPaid.sqf + Author: Bryan "Tonic" Boardwine + + Description: + Verifies that the ticket was paid. +*/ + +params [ + ["_value", 5, [0]], + ["_unit", objNull, [objNull]] +]; + +if (isNull _unit || {!(_unit isEqualTo life_ticket_unit)}) exitWith {}; +private _name = _unit getVariable ["realname",name _unit]; + +hint format [localize "STR_Cop_Ticket_PaidNOTF_2",_name]; +BANK = BANK + _value; +[1] call SOCK_fnc_updatePartial; diff --git a/Altis_Life.Altis/core/cop/fn_ticketPay.sqf b/Altis_Life.Altis/core/cop/fn_ticketPay.sqf index 90e6fc963..4625a3b29 100644 --- a/Altis_Life.Altis/core/cop/fn_ticketPay.sqf +++ b/Altis_Life.Altis/core/cop/fn_ticketPay.sqf @@ -1,47 +1,47 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_ticketPay.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Pays the ticket. -*/ -if (isNil "life_ticket_val" || isNil "life_ticket_cop") exitWith {}; -if (CASH < life_ticket_val) exitWith { - if (BANK < life_ticket_val) exitWith { - hint localize "STR_Cop_Ticket_NotEnough"; - [1,"STR_Cop_Ticket_NotEnoughNOTF",true,[profileName]] remoteExecCall ["life_fnc_broadcast",life_ticket_cop]; - closeDialog 0; - }; - - hint format [localize "STR_Cop_Ticket_Paid",[life_ticket_val] call life_fnc_numberText]; - BANK = BANK - life_ticket_val; - [1] call SOCK_fnc_updatePartial; - life_ticket_paid = true; - - [0,"STR_Cop_Ticket_PaidNOTF",true,[profileName,[life_ticket_val] call life_fnc_numberText]] remoteExecCall ["life_fnc_broadcast",west]; - [1,"STR_Cop_Ticket_PaidNOTF_2",true,[profileName]] remoteExecCall ["life_fnc_broadcast",life_ticket_cop]; - [life_ticket_val,player,life_ticket_cop] remoteExecCall ["life_fnc_ticketPaid",life_ticket_cop]; - - if (life_HC_isActive) then { - [getPlayerUID player] remoteExecCall ["HC_fnc_wantedRemove",HC_Life]; - } else { - [getPlayerUID player] remoteExecCall ["life_fnc_wantedRemove",RSERV]; - }; - closeDialog 0; -}; - -CASH = CASH - life_ticket_val; -[0] call SOCK_fnc_updatePartial; -life_ticket_paid = true; - -if (life_HC_isActive) then { - [getPlayerUID player] remoteExecCall ["HC_fnc_wantedRemove",HC_Life]; -} else { - [getPlayerUID player] remoteExecCall ["life_fnc_wantedRemove",RSERV]; -}; - -[0,"STR_Cop_Ticket_PaidNOTF",true,[profileName,[life_ticket_val] call life_fnc_numberText]] remoteExecCall ["life_fnc_broadcast",west]; -closeDialog 0; -[1,"STR_Cop_Ticket_PaidNOTF_2",true,[profileName]] remoteExecCall ["life_fnc_broadcast",life_ticket_cop]; -[life_ticket_val,player,life_ticket_cop] remoteExecCall ["life_fnc_ticketPaid",life_ticket_cop]; \ No newline at end of file +#include "..\..\script_macros.hpp" +/* + File: fn_ticketPay.sqf + Author: Bryan "Tonic" Boardwine + + Description: + Pays the ticket. +*/ + +if (isNil "life_ticket_val" || {isNil "life_ticket_cop"}) exitWith {}; +if (CASH < life_ticket_val) exitWith { + if (BANK < life_ticket_val) exitWith { + hint localize "STR_Cop_Ticket_NotEnough"; + [1,"STR_Cop_Ticket_NotEnoughNOTF", true, [profileName]] remoteExecCall ["life_fnc_broadcast", life_ticket_cop]; + closeDialog 0; + }; + + hint format [localize "STR_Cop_Ticket_Paid", [life_ticket_val] call life_fnc_numberText]; + BANK = BANK - life_ticket_val; + [1] call SOCK_fnc_updatePartial; + life_ticket_paid = true; + + [0, "STR_Cop_Ticket_PaidNOTF", true, [profileName, [life_ticket_val] call life_fnc_numberText]] remoteExecCall ["life_fnc_broadcast", west]; + [1, "STR_Cop_Ticket_PaidNOTF_2", true, [profileName]] remoteExecCall ["life_fnc_broadcast", life_ticket_cop]; + [life_ticket_val, player, life_ticket_cop] remoteExecCall ["life_fnc_ticketPaid", life_ticket_cop]; + + if (life_HC_isActive) then { + [getPlayerUID player] remoteExecCall ["HC_fnc_wantedRemove",HC_Life]; + } else { + [getPlayerUID player] remoteExecCall ["life_fnc_wantedRemove",RSERV]; + }; + closeDialog 0; +}; + +CASH = CASH - life_ticket_val; +[0] call SOCK_fnc_updatePartial; +life_ticket_paid = true; + +if (life_HC_isActive) then { + [getPlayerUID player] remoteExecCall ["HC_fnc_wantedRemove", HC_Life]; +} else { + [getPlayerUID player] remoteExecCall ["life_fnc_wantedRemove", RSERV]; +}; + +[0, "STR_Cop_Ticket_PaidNOTF", true, [profileName, [life_ticket_val] call life_fnc_numberText]] remoteExecCall ["life_fnc_broadcast", west]; +closeDialog 0; +[life_ticket_val, player] remoteExecCall ["life_fnc_ticketPaid", life_ticket_cop]; diff --git a/Altis_Life.Altis/core/cop/fn_ticketPrompt.sqf b/Altis_Life.Altis/core/cop/fn_ticketPrompt.sqf index e976f51b7..1a9bff783 100644 --- a/Altis_Life.Altis/core/cop/fn_ticketPrompt.sqf +++ b/Altis_Life.Altis/core/cop/fn_ticketPrompt.sqf @@ -1,31 +1,33 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_ticketPrompt - Author: Bryan "Tonic" Boardwine - - Description: - Prompts the player that he is being ticketed. -*/ -private ["_cop","_val"]; -if (!isNull (findDisplay 2600)) exitWith {}; //Already at the ticket menu, block for abuse? -_cop = _this select 0; -if (isNull _cop) exitWith {}; -_val = _this select 1; - -createDialog "life_ticket_pay"; -disableSerialization; -waitUntil {!isNull (findDisplay 2600)}; - -life_ticket_paid = false; -life_ticket_val = _val; -life_ticket_cop = _cop; -CONTROL(2600,2601) ctrlSetStructuredText parseText format ["" +(localize "STR_Cop_Ticket_GUI_Given"),_cop getVariable ["realname",name _cop],_val]; - -[] spawn { - disableSerialization; - waitUntil {life_ticket_paid || (isNull (findDisplay 2600))}; - if (isNull (findDisplay 2600) && !life_ticket_paid) then { - [0,"STR_Cop_Ticket_Refuse",true,[profileName]] remoteExecCall ["life_fnc_broadcast",west]; - [1,"STR_Cop_Ticket_Refuse",true,[profileName]] remoteExecCall ["life_fnc_broadcast",life_ticket_cop]; - }; -}; \ No newline at end of file +#include "..\..\script_macros.hpp" +/* + File: fn_ticketPrompt + Author: Bryan "Tonic" Boardwine + + Description: + Prompts the player that he is being ticketed. +*/ + +if (!isNull (findDisplay 2600)) exitWith {}; + +params [ + ["_cop", objNull, [objNull]], + ["_val", -1, [0]] +]; + +if (isNull _cop || {_val isEqualTo -1}) exitWith {}; + +createDialog "life_ticket_pay"; + +life_ticket_paid = false; +life_ticket_val = _val; +life_ticket_cop = _cop; + +CONTROL(2600,2601) ctrlSetStructuredText parseText format ["" + (localize "STR_Cop_Ticket_GUI_Given"), _cop getVariable ["realname",name _cop], _val]; + +[] spawn { + waitUntil {life_ticket_paid || {isNull (findDisplay 2600)}}; + if (isNull (findDisplay 2600) && {!life_ticket_paid}) then { + [0, "STR_Cop_Ticket_Refuse", true, [profileName]] remoteExecCall ["life_fnc_broadcast", west]; + [1, "STR_Cop_Ticket_Refuse", true, [profileName]] remoteExecCall ["life_fnc_broadcast", life_ticket_cop]; + }; +}; diff --git a/Altis_Life.Altis/core/cop/fn_vehInvSearch.sqf b/Altis_Life.Altis/core/cop/fn_vehInvSearch.sqf index aaf4b08d5..a27e5b86f 100644 --- a/Altis_Life.Altis/core/cop/fn_vehInvSearch.sqf +++ b/Altis_Life.Altis/core/cop/fn_vehInvSearch.sqf @@ -1,41 +1,43 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_vehInvSearch.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Searches the vehicle for illegal items. -*/ -private ["_vehicle","_vehicleInfo","_value","_list"]; -_vehicle = cursorObject; -_list = ["Air","Ship","LandVehicle"]; -if (isNull _vehicle || {!(KINDOF_ARRAY(_vehicle,_list))}) exitWith {}; - -_vehicleInfo = _vehicle getVariable ["Trunk",[]]; -if (count _vehicleInfo isEqualTo 0) exitWith {hint localize "STR_Cop_VehEmpty"}; - -_value = 0; -_illegalValue = 0; -{ - _var = _x select 0; - _val = _x select 1; - _isIllegalItem = M_CONFIG(getNumber,"VirtualItems",_var,"illegal"); - if (_isIllegalItem isEqualTo 1 ) then{ - _illegalPrice = M_CONFIG(getNumber,"VirtualItems",_var,"sellPrice"); - if (!isNull (missionConfigFile >> "VirtualItems" >> _var >> "processedItem")) then { - _illegalItemProcessed = M_CONFIG(getText,"VirtualItems",_var,"processedItem"); - _illegalPrice = M_CONFIG(getNumber,"VirtualItems",_illegalItemProcessed,"sellPrice"); - }; - - _illegalValue = _illegalValue + (round(_val * _illegalPrice / 2)); - }; -} forEach (_vehicleInfo select 0); -_value = _illegalValue; -if (_value > 0) then { - [0,"STR_NOTF_VehContraband",true,[[_value] call life_fnc_numberText]] remoteExecCall ["life_fnc_broadcast",RCLIENT]; - BANK = BANK + _value; - [1] call SOCK_fnc_updatePartial; - _vehicle setVariable ["Trunk",[[],0],true]; -} else { - hint localize "STR_Cop_NoIllegalVeh"; -}; +#include "..\..\script_macros.hpp" +/* + File: fn_vehInvSearch.sqf + Author: Bryan "Tonic" Boardwine + + Description: + Searches the vehicle for illegal items. +*/ + +private _vehicle = cursorObject; +private _typeList = ["Air","Ship","LandVehicle"]; + +if (isNull _vehicle || {!(KINDOF_ARRAY(_vehicle, _typeList))}) exitWith {}; + +private _vehicleInfo = _vehicle getVariable ["Trunk",[]]; +if (_vehicleInfo isEqualTo []) exitWith {hint localize "STR_Cop_VehEmpty"}; +_vehicleInfo params ["_items"]; + +private _value = 0; +private _illegalValue = 0; +{ + _x params ["_var", "_val"]; + private _isIllegalItem = M_CONFIG(getNumber,"VirtualItems",_var,"illegal"); + if (_isIllegalItem isEqualTo 1) then { + private _illegalPrice = M_CONFIG(getNumber,"VirtualItems",_var,"sellPrice"); + if !(isNull (missionConfigFile >> "VirtualItems" >> _var >> "processedItem")) then { + private _illegalItemProcessed = M_CONFIG(getText,"VirtualItems",_var,"processedItem"); + _illegalPrice = M_CONFIG(getNumber,"VirtualItems",_illegalItemProcessed,"sellPrice"); + }; + + _illegalValue = _illegalValue + round(_val * _illegalPrice / 2); + }; + true +} count _items; + +if (_illegalValue > 0) then { + [0, "STR_NOTF_VehContraband", true, [[_illegalValue] call life_fnc_numberText]] remoteExecCall ["life_fnc_broadcast", RCLIENT]; + BANK = BANK + _illegalValue; + [1] call SOCK_fnc_updatePartial; + _vehicle setVariable ["Trunk", [[],0], true]; +} else { + hint localize "STR_Cop_NoIllegalVeh"; +}; diff --git a/Altis_Life.Altis/core/cop/fn_wantedGrab.sqf b/Altis_Life.Altis/core/cop/fn_wantedGrab.sqf index deaa3587c..f8c1a7841 100644 --- a/Altis_Life.Altis/core/cop/fn_wantedGrab.sqf +++ b/Altis_Life.Altis/core/cop/fn_wantedGrab.sqf @@ -6,16 +6,18 @@ Description: Prepare the array to query the crimes. */ -private ["_display","_tab","_criminal"]; + disableSerialization; -_display = findDisplay 2400; -_tab = _display displayCtrl 2402; -_criminal = lbData[2401,(lbCurSel 2401)]; + +private _display = findDisplay 2400; +private _tab = _display displayCtrl 2402; +private _criminal = lbData[2401,(lbCurSel 2401)]; _criminal = call compile format ["%1", _criminal]; + if (isNil "_criminal") exitWith {}; if (life_HC_isActive) then { - [player,_criminal] remoteExec ["HC_fnc_wantedCrimes",HC_Life]; + [player,_criminal] remoteExec ["HC_fnc_wantedCrimes", HC_Life]; } else { - [player,_criminal] remoteExec ["life_fnc_wantedCrimes",RSERV]; + [player,_criminal] remoteExec ["life_fnc_wantedCrimes", RSERV]; }; diff --git a/Altis_Life.Altis/core/fn_initCiv.sqf b/Altis_Life.Altis/core/fn_initCiv.sqf index fa922a0ee..3d8ef9e55 100644 --- a/Altis_Life.Altis/core/fn_initCiv.sqf +++ b/Altis_Life.Altis/core/fn_initCiv.sqf @@ -8,7 +8,7 @@ */ private _altisArray = ["Land_i_Shop_01_V1_F","Land_i_Shop_01_V2_F","Land_i_Shop_01_V3_F","Land_i_Shop_02_V1_F","Land_i_Shop_02_V2_F","Land_i_Shop_02_V3_F"]; private _tanoaArray = ["Land_House_Small_01_F"]; -private _spawnBuildings = [[["Altis", _altisArray], ["Tanoa", _tanoaArray]]] call TON_fnc_terrainSort; +private _spawnBuildings = [[["Altis", _altisArray], ["Tanoa", _tanoaArray]]] call life_util_fnc_terrainSort; civ_spawn_1 = nearestObjects[getMarkerPos "civ_spawn_1", _spawnBuildings,350]; civ_spawn_2 = nearestObjects[getMarkerPos "civ_spawn_2", _spawnBuildings,350]; diff --git a/Altis_Life.Altis/core/fn_setupEVH.sqf b/Altis_Life.Altis/core/fn_setupEVH.sqf index 67707de38..ace441f9a 100644 --- a/Altis_Life.Altis/core/fn_setupEVH.sqf +++ b/Altis_Life.Altis/core/fn_setupEVH.sqf @@ -14,4 +14,9 @@ player addEventHandler ["InventoryClosed", {_this call life_fnc_inventoryClosed} player addEventHandler ["InventoryOpened", {_this call life_fnc_inventoryOpened}]; player addEventHandler ["HandleRating", {0}]; +player addEventHandler ["GetInMan", {_this call life_fnc_getInMan}]; +player addEventHandler ["GetOutMan", {_this call life_fnc_getOutMan}]; + addMissionEventHandler ["Map", {_this call life_fnc_checkMap}]; + +[missionNamespace,"OnGameInterrupt",{_this call life_fnc_onGameInterrupt}] call BIS_fnc_addScriptedEventHandler; diff --git a/Altis_Life.Altis/core/fn_setupStationService.sqf b/Altis_Life.Altis/core/fn_setupStationService.sqf index 6512588b8..ff4d2fd23 100644 --- a/Altis_Life.Altis/core/fn_setupStationService.sqf +++ b/Altis_Life.Altis/core/fn_setupStationService.sqf @@ -150,7 +150,7 @@ private _tanoaPositions = [ [11637.2,13052.8,-0.228891] ]; -private _stationPositions = [[["Altis", _altisPositions], ["Tanoa", _tanoaPositions]]] call TON_fnc_terrainSort; +private _stationPositions = [[["Altis", _altisPositions], ["Tanoa", _tanoaPositions]]] call life_util_fnc_terrainSort; { private _pump = nearestObjects [_x,["Land_fs_feed_F","Land_FuelStation_01_pump_F","Land_FuelStation_02_pump_F"],5] select 0; diff --git a/Altis_Life.Altis/core/fn_survival.sqf b/Altis_Life.Altis/core/fn_survival.sqf index 0b207e985..cb39a1f33 100644 --- a/Altis_Life.Altis/core/fn_survival.sqf +++ b/Altis_Life.Altis/core/fn_survival.sqf @@ -46,19 +46,37 @@ _fnc_water = { }; }; +private _fnc_paycheck = { + if (alive player) then { + private _paycheck = call life_paycheck; + if (player distance (getMarkerPos "fed_reserve") < 120 && playerSide isEqualTo west) then { + systemChat format [localize "STR_ReceivedPay",[_paycheck + 1500] call life_fnc_numberText]; + BANK = BANK + _paycheck + 1500; + } else { + BANK = BANK + _paycheck; + systemChat format [localize "STR_ReceivedPay",[_paycheck] call life_fnc_numberText]; + }; + } else { + systemChat localize "STR_MissedPay"; + }; + systemChat format [localize "STR_FSM_Paycheck",(getNumber(missionConfigFile >> "Life_Settings" >> "paycheck_period"))]; +}; + //Setup the time-based variables. _foodTime = time; _waterTime = time; +private _paycheckTime = time; +private _paycheckPeriod = (getNumber(missionConfigFile >> "Life_Settings" >> "paycheck_period")) * 60; _walkDis = 0; _bp = ""; _lastPos = visiblePosition player; _lastPos = (_lastPos select 0) + (_lastPos select 1); -_lastState = vehicle player; for "_i" from 0 to 1 step 0 do { /* Thirst / Hunger adjustment that is time based */ if ((time - _waterTime) > 600 && {!life_god}) then {[] call _fnc_water; _waterTime = time;}; if ((time - _foodTime) > 850 && {!life_god}) then {[] call _fnc_food; _foodTime = time;}; + if ((time - _paycheckTime) > _paycheckPeriod) then {[] call _fnc_paycheck; _paycheckTime = time}; /* Adjustment of carrying capacity based on backpack changes */ if (backpack player isEqualTo "") then { @@ -71,12 +89,6 @@ for "_i" from 0 to 1 step 0 do { }; }; - /* Check if the player's state changed? */ - if (!(vehicle player isEqualTo _lastState) || {!alive player}) then { - [] call life_fnc_updateViewDistance; - _lastState = vehicle player; - }; - /* Check if the weight has changed and the player is carrying to much */ if (life_carryWeight > life_maxWeight && {!isForcedWalk player} && {!life_god}) then { player forceWalk true; diff --git a/Altis_Life.Altis/core/fsm/client.fsm b/Altis_Life.Altis/core/fsm/client.fsm deleted file mode 100644 index f064b1b8f..000000000 --- a/Altis_Life.Altis/core/fsm/client.fsm +++ /dev/null @@ -1,94 +0,0 @@ -/*%FSM*/ -/*%FSM*/ -/* -item0[] = {"Main_Init",0,250,-40.348839,-141.279068,49.651161,-91.279068,0.000000,"Main Init"}; -item1[] = {"true",8,218,-39.994308,-65.712906,50.005692,-15.712896,0.000000,"true"}; -item2[] = {"Split",2,4346,-39.994308,10.874098,50.005707,60.874100,0.000000,"Split"}; -item3[] = {"Time_to_pay_",4,218,-168.727005,-14.470595,-78.726974,35.529457,0.000000,"Time to pay?"}; -link0[] = {0,1}; -link1[] = {1,2}; -link2[] = {2,3}; -link3[] = {3,2}; -globals[] = {0.000000,0,0,0,0,640,480,1,26,6316128,1,-456.200378,358.065338,379.837494,-151.171021,1032,673,1}; -window[] = {0,-1,-1,-1,-1,893,75,1515,75,1,1050}; -*//*%FSM*/ -class FSM -{ - fsmName = "Life Client FSM"; - class States - { - /*%FSM*/ - class Main_Init - { - name = "Main_Init"; - init = /*%FSM*/"private [""_lastcheck"",""_food"",""_water"",""_lastsync""];" \n - "_lastcheck = time;" \n - "_food = time;" \n - "_water = time;" \n - "_lastsync = time;"/*%FSM*/; - precondition = /*%FSM*/""/*%FSM*/; - class Links - { - /*%FSM*/ - class true - { - priority = 0.000000; - to="Split"; - precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/"true"/*%FSM*/; - action=/*%FSM*/""/*%FSM*/; - }; - /*%FSM*/ - }; - }; - /*%FSM*/ - /*%FSM*/ - class Split - { - name = "Split"; - init = /*%FSM*/"systemChat format [localize ""STR_FSM_Paycheck"",(getNumber(missionConfigFile >> ""Life_Settings"" >> ""paycheck_period""))];"/*%FSM*/; - precondition = /*%FSM*/""/*%FSM*/; - class Links - { - /*%FSM*/ - class Time_to_pay_ - { - priority = 0.000000; - to="Split"; - precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/"(time - _lastcheck) > ((getNumber(missionConfigFile >> ""Life_Settings"" >> ""paycheck_period"")) * 60)"/*%FSM*/; - action=/*%FSM*/"if (!alive player) then {" \n - " systemChat localize ""STR_FSM_MissedPay"";" \n - "} else {" \n - " if (player distance (getMarkerPos ""fed_reserve"") < 120 && playerSide isEqualTo west) then {" \n - " systemChat format [localize ""STR_FSM_ReceivedPay"",[(call life_paycheck) + 1500] call life_fnc_numberText];" \n - " life_atmbank = life_atmbank + (call life_paycheck) + 1500;" \n - " } else {" \n - " life_atmbank = life_atmbank + (call life_paycheck);" \n - " systemChat format [localize ""STR_FSM_ReceivedPay"",[(call life_paycheck)] call life_fnc_numberText];" \n - " };" \n - "};" \n - "" \n - "_lastcheck = time;" \n - "" \n - "//Group clean (Local)" \n - "{" \n - " if (local _x && {(units _x isEqualTo [])}) then {" \n - " deleteGroup _x;" \n - " };" \n - "} forEach allGroups;" \n - "" \n - "" \n - ""/*%FSM*/; - }; - /*%FSM*/ - }; - }; - /*%FSM*/ - }; - initState="Main_Init"; - finalStates[] = - { - }; -}; -/*%FSM*/ diff --git a/Altis_Life.Altis/core/fsm/timeModule.fsm b/Altis_Life.Altis/core/fsm/timeModule.fsm deleted file mode 100644 index 06e46776d..000000000 --- a/Altis_Life.Altis/core/fsm/timeModule.fsm +++ /dev/null @@ -1,108 +0,0 @@ -/*%FSM*/ -/*%FSM*/ -/* -item0[] = {"Init",0,250,375.000000,0.000000,475.000000,50.000000,0.000000,"Init"}; -item1[] = {"isServer",4,218,375.000000,75.000000,475.000000,125.000000,0.000000,"isServer"}; -item2[] = {"Apply_Time_Multi",2,250,375.000000,150.000000,475.000000,200.000000,0.000000,"Apply Time" \n "Multiplier"}; -item3[] = {"Opposite_Sunstat",4,4314,500.000000,200.000000,600.000000,250.000000,0.000000,"Opposite" \n "Sunstate"}; -item4[] = {"",7,210,421.000000,221.000000,429.000000,229.000000,0.000000,""}; -item5[] = {"",7,210,546.000000,171.000000,554.000000,179.000000,0.000000,""}; -item6[] = {"Linear_Multiplie",4,218,250.000000,150.000000,350.000000,200.000000,1.000000,"Linear" \n "Multiplier"}; -item7[] = {"Exit",1,250,125.000000,150.000000,225.000000,200.000000,0.000000,"Exit"}; -link0[] = {0,1}; -link1[] = {1,2}; -link2[] = {2,4}; -link3[] = {2,6}; -link4[] = {3,5}; -link5[] = {4,3}; -link6[] = {5,2}; -link7[] = {6,7}; -globals[] = {25.000000,1,0,0,0,640,480,1,10,6316128,1,-179.640472,752.478394,458.482788,-385.274109,1403,1270,1}; -window[] = {2,-1,-1,-1,-1,1020,260,1700,260,3,1421}; -*//*%FSM*/ -class FSM -{ - fsmName = "timeModules.fsm : Altis Life"; - class States - { - /*%FSM*/ - class Init - { - name = "Init"; - init = /*%FSM*/"private [""_skipDay"", ""_skipNight"", ""_method"", ""_fastNight"", ""_sunState""];" \n - "_skipDay = [_this,0,8,[0]] call BIS_fnc_param;" \n - "_fastNight = [_this,1,false,[true]] call BIS_fnc_param;" \n - "_skipNight = [_this,2,12,[0]] call BIS_fnc_param;"/*%FSM*/; - precondition = /*%FSM*/""/*%FSM*/; - class Links - { - /*%FSM*/ - class isServer - { - priority = 0.000000; - to="Apply_Time_Multi"; - precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/"isServer"/*%FSM*/; - action=/*%FSM*/""/*%FSM*/; - }; - /*%FSM*/ - }; - }; - /*%FSM*/ - /*%FSM*/ - class Apply_Time_Multi - { - name = "Apply_Time_Multi"; - init = /*%FSM*/"if (_fastNight && {sunOrMoon isEqualTo 0}) then {" \n - " setTimeMultiplier _skipNight;" \n - "} else {" \n - " setTimeMultiplier _skipDay;" \n - "};" \n - "" \n - "private ""_sunState"";" \n - "_sunState = sunOrMoon;"/*%FSM*/; - precondition = /*%FSM*/""/*%FSM*/; - class Links - { - /*%FSM*/ - class Linear_Multiplie - { - priority = 1.000000; - to="Exit"; - precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/"!_fastNight"/*%FSM*/; - action=/*%FSM*/""/*%FSM*/; - }; - /*%FSM*/ - /*%FSM*/ - class Opposite_Sunstat - { - priority = 0.000000; - to="Apply_Time_Multi"; - precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/"sunOrMoon isEqualTo 1 - _sunState"/*%FSM*/; - action=/*%FSM*/""/*%FSM*/; - }; - /*%FSM*/ - }; - }; - /*%FSM*/ - /*%FSM*/ - class Exit - { - name = "Exit"; - init = /*%FSM*/""/*%FSM*/; - precondition = /*%FSM*/""/*%FSM*/; - class Links - { - }; - }; - /*%FSM*/ - }; - initState="Init"; - finalStates[] = - { - "Exit", - }; -}; -/*%FSM*/ diff --git a/Altis_Life.Altis/core/functions/fn_actionKeyHandler.sqf b/Altis_Life.Altis/core/functions/fn_actionKeyHandler.sqf index 467288252..a5b528656 100644 --- a/Altis_Life.Altis/core/functions/fn_actionKeyHandler.sqf +++ b/Altis_Life.Altis/core/functions/fn_actionKeyHandler.sqf @@ -1,124 +1,114 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_actionKeyHandler.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Master action key handler, handles requests for picking up various items and - interacting with other players (Cops = Cop Menu for unrestrain,escort,stop escort, arrest (if near cop hq), etc). -*/ -private ["_curObject","_isWater","_CrateModelNames","_crate","_fish","_animal","_whatIsIt","_handle"]; -_curObject = cursorObject; -if (life_action_inUse) exitWith {}; //Action is in use, exit to prevent spamming. -if (life_interrupted) exitWith {life_interrupted = false;}; -_isWater = surfaceIsWater (visiblePositionASL player); - -if (playerSide isEqualTo west && {player getVariable ["isEscorting",false]}) exitWith { - [] call life_fnc_copInteractionMenu; -}; - -if (LIFE_SETTINGS(getNumber,"global_ATM") isEqualTo 1) then{ - //Check if the player is near an ATM. - if ((call life_fnc_nearATM) && {!dialog}) exitWith { - [] call life_fnc_atmMenu; - }; -}; - -if (isNull _curObject) exitWith { - if (_isWater) then { - _fish = (nearestObjects[player,(LIFE_SETTINGS(getArray,"animaltypes_fish")),3]) select 0; - if (!isNil "_fish") then { - if (!alive _fish) then { - [_fish] call life_fnc_catchFish; - }; - }; - } else { - _animal = (nearestObjects[player,(LIFE_SETTINGS(getArray,"animaltypes_hunting")),3]) select 0; - if (!isNil "_animal") then { - if (!alive _animal) then { - [_animal] call life_fnc_gutAnimal; - }; - } else { - private "_handle"; - if (playerSide isEqualTo civilian && !life_action_gathering) then { - _whatIsIt = [] call life_fnc_whereAmI; - if (life_action_gathering) exitWith {}; //Action is in use, exit to prevent spamming. - switch (_whatIsIt) do { - case "mine" : { _handle = [] spawn life_fnc_mine }; - default { _handle = [] spawn life_fnc_gather }; - }; - life_action_gathering = true; - waitUntil {scriptDone _handle}; - life_action_gathering = false; - }; - }; - }; -}; - -if ((_curObject isKindOf "B_supplyCrate_F" || _curObject isKindOf "Box_IND_Grenades_F") && {player distance _curObject < 3} ) exitWith { - if (alive _curObject) then { - [_curObject] call life_fnc_containerMenu; - }; -}; - -private _vaultHouse = [[["Altis", "Land_Research_house_V1_F"], ["Tanoa", "Land_Medevac_house_V1_F"]]] call TON_fnc_terrainSort; -private _altisArray = [16019.5,16952.9,0]; -private _tanoaArray = [11074.2,11501.5,0.00137329]; -private _pos = [[["Altis", _altisArray], ["Tanoa", _tanoaArray]]] call TON_fnc_terrainSort; - -if (_curObject isKindOf "House_F" && {player distance _curObject < 12} || ((nearestObject [_pos,"Land_Dome_Big_F"]) isEqualTo _curObject || (nearestObject [_pos,_vaultHouse]) isEqualTo _curObject)) exitWith { - [_curObject] call life_fnc_houseMenu; -}; - -if (dialog) exitWith {}; //Don't bother when a dialog is open. -if !(isNull objectParent player) exitWith {}; //He's in a vehicle, cancel! -life_action_inUse = true; - -//Temp fail safe. -[] spawn { - sleep 60; - life_action_inUse = false; -}; - -//Check if it's a dead body. -if (_curObject isKindOf "CAManBase" && {!alive _curObject}) exitWith { - //Hotfix code by ins0 - if ((playerSide isEqualTo west && {(LIFE_SETTINGS(getNumber,"revive_cops") isEqualTo 1)}) || {(playerSide isEqualTo civilian && {(LIFE_SETTINGS(getNumber,"revive_civ") isEqualTo 1)})} || {(playerSide isEqualTo east && {(LIFE_SETTINGS(getNumber,"revive_east") isEqualTo 1)})} || {playerSide isEqualTo independent}) then { - if (life_inv_defibrillator > 0) then { - [_curObject] call life_fnc_revivePlayer; - }; - }; -}; - -//If target is a player then check if we can use the cop menu. -if (isPlayer _curObject && _curObject isKindOf "CAManBase") then { - if ((_curObject getVariable ["restrained",false]) && !dialog && playerSide isEqualTo west) then { - [_curObject] call life_fnc_copInteractionMenu; - }; -} else { - //OK, it wasn't a player so what is it? - private ["_isVehicle","_miscItems","_money","_list"]; - - _list = ["landVehicle","Ship","Air"]; - _isVehicle = if (KINDOF_ARRAY(_curObject,_list)) then {true} else {false}; - _miscItems = ["Land_BottlePlastic_V1_F","Land_TacticalBacon_F","Land_Can_V3_F","Land_CanisterFuel_F","Land_Suitcase_F"]; - - //It's a vehicle! open the vehicle interaction key! - if (_isVehicle) then { - if (!dialog) then { - if (player distance _curObject < ((boundingBox _curObject select 1) select 0)+2 && (!(player getVariable ["restrained",false])) && (!(player getVariable ["playerSurrender",false])) && !life_isknocked && !life_istazed) then { - [_curObject] call life_fnc_vInteractionMenu; - }; - }; - } else { - //OK, it wasn't a vehicle so let's see what else it could be? - if ((typeOf _curObject) in _miscItems) then { - [_curObject,player,false] remoteExecCall ["TON_fnc_pickupAction",RSERV]; - } else { - //It wasn't a misc item so is it money? - if ((typeOf _curObject) isEqualTo "Land_Money_F" && {!(_curObject getVariable ["inUse",false])}) then { - [_curObject,player,true] remoteExecCall ["TON_fnc_pickupAction",RSERV]; - }; - }; - }; -}; +#include "..\..\script_macros.hpp" +/* + File: fn_actionKeyHandler.sqf + Author: Bryan "Tonic" Boardwine + + Description: + Master action key handler, handles requests for picking up various items and + interacting with other players (Cops = Cop Menu for unrestrain,escort,stop escort, arrest (if near cop hq), etc). +*/ +private _curObject = cursorObject; +if (life_action_inUse) exitWith {}; //Action is in use, exit to prevent spamming. +if (life_interrupted) exitWith {life_interrupted = false;}; +private _isWater = surfaceIsWater (visiblePositionASL player); + +if (playerSide isEqualTo west && {player getVariable ["isEscorting",false]}) exitWith { + [] call life_fnc_copInteractionMenu; +}; + +if (LIFE_SETTINGS(getNumber,"global_ATM") isEqualTo 1) then{ + //Check if the player is near an ATM. + if ((call life_fnc_nearATM) && {!dialog}) exitWith { + [] call life_fnc_atmMenu; + }; +}; + +if (isNull _curObject) exitWith { + if (_isWater) then { + (nearestObjects[player,(LIFE_SETTINGS(getArray,"animaltypes_fish")),3]) params [["_fish", objNull]]; + if !(alive _fish) then { //alive also checks for objNull + [_fish] call life_fnc_catchFish; + }; + } else { + (nearestObjects[player,(LIFE_SETTINGS(getArray,"animaltypes_hunting")),3]) params [["_animal", objNull]]; + if !(isNull _animal) then { + if !(alive _animal) then { + [_animal] call life_fnc_gutAnimal; + }; + } else { + if (playerSide isEqualTo civilian && !life_action_inUse) then { + private _whatIsIt = [] call life_fnc_whereAmI; + switch _whatIsIt do { + case "mine": {[] spawn life_fnc_mine}; + default {[] spawn life_fnc_gather}; + }; + }; + }; + }; +}; + +if ((_curObject isKindOf "B_supplyCrate_F" || _curObject isKindOf "Box_IND_Grenades_F") && {player distance _curObject < 3}) exitWith { + if (alive _curObject) then { + [_curObject] call life_fnc_containerMenu; + }; +}; + +private _vaultHouse = [[["Altis", "Land_Research_house_V1_F"], ["Tanoa", "Land_Medevac_house_V1_F"]]] call life_util_fnc_terrainSort; +private _altisArray = [16019.5,16952.9,0]; +private _tanoaArray = [11074.2,11501.5,0.00137329]; +private _pos = [[["Altis", _altisArray], ["Tanoa", _tanoaArray]]] call life_util_fnc_terrainSort; + +if (_curObject isKindOf "House_F" && {player distance _curObject < 12} || ((nearestObject [_pos,"Land_Dome_Big_F"]) isEqualTo _curObject || (nearestObject [_pos,_vaultHouse]) isEqualTo _curObject)) exitWith { + [_curObject] call life_fnc_houseMenu; +}; + +if (dialog) exitWith {}; //Don't bother when a dialog is open. +if !(isNull objectParent player) exitWith {}; //He's in a vehicle, cancel! +life_action_inUse = true; + +//Temp fail safe. +[] spawn { + sleep 60; + life_action_inUse = false; +}; + +//Check if it's a dead body. +if (_curObject isKindOf "CAManBase" && {!alive _curObject}) exitWith { + //Hotfix code by ins0 + if ((playerSide isEqualTo west && {(LIFE_SETTINGS(getNumber,"revive_cops") isEqualTo 1)}) || {(playerSide isEqualTo civilian && {(LIFE_SETTINGS(getNumber,"revive_civ") isEqualTo 1)})} || {(playerSide isEqualTo east && {(LIFE_SETTINGS(getNumber,"revive_east") isEqualTo 1)})} || {playerSide isEqualTo independent}) then { + if (life_inv_defibrillator > 0) then { + [_curObject] call life_fnc_revivePlayer; + }; + }; +}; + +//If target is a player then check if we can use the cop menu. +if (isPlayer _curObject && _curObject isKindOf "CAManBase") then { + if ((_curObject getVariable ["restrained",false]) && !dialog && playerSide isEqualTo west) then { + [_curObject] call life_fnc_copInteractionMenu; + }; +//OK, it wasn't a player so what is it? +} else { + private _list = ["landVehicle","Ship","Air"]; + private _isVehicle = if (KINDOF_ARRAY(_curObject,_list)) then {true} else {false}; + private _miscItems = ["Land_BottlePlastic_V1_F","Land_TacticalBacon_F","Land_Can_V3_F","Land_CanisterFuel_F","Land_Suitcase_F"]; + + //It's a vehicle! open the vehicle interaction key! + if (_isVehicle) then { + if (!dialog) then { + if (player distance _curObject < ((boundingBox _curObject select 1) select 0)+2 && (!(player getVariable ["restrained",false])) && (!(player getVariable ["playerSurrender",false])) && !life_isknocked && !life_istazed) then { + [_curObject] call life_fnc_vInteractionMenu; + }; + }; + } else { + //OK, it wasn't a vehicle so let's see what else it could be? + if ((typeOf _curObject) in _miscItems) then { + [_curObject,player,false] remoteExecCall ["TON_fnc_pickupAction",RSERV]; + } else { + //It wasn't a misc item so is it money? + if ((typeOf _curObject) isEqualTo "Land_Money_F" && {!(_curObject getVariable ["inUse",false])}) then { + [_curObject,player,true] remoteExecCall ["TON_fnc_pickupAction",RSERV]; + }; + }; + }; +}; diff --git a/Altis_Life.Altis/core/functions/fn_escInterupt.sqf b/Altis_Life.Altis/core/functions/fn_escInterupt.sqf deleted file mode 100644 index d7bf904ad..000000000 --- a/Altis_Life.Altis/core/functions/fn_escInterupt.sqf +++ /dev/null @@ -1,69 +0,0 @@ -#include "..\..\script_macros.hpp" - -/* - File: fn_escInterupt.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Monitors when the ESC menu is pulled up and blocks off - certain controls when conditions meet. -*/ -disableSerialization; - -private _escSync = { - disableSerialization; - private _abortButton = CONTROL(49,104); - private _abortTime = LIFE_SETTINGS(getNumber,"escapeMenu_timer"); - private _timeStamp = time + _abortTime; - - waitUntil { - _abortButton ctrlSetText format [localize "STR_NOTF_AbortESC",[(_timeStamp - time),"SS.MS"] call BIS_fnc_secondsToString]; - _abortButton ctrlCommit 0; - if (dialog && {isNull (findDisplay 7300)}) then {closeDialog 0}; - - round(_timeStamp - time) <= 0 || {isNull (findDisplay 49)} - }; - - _abortButton ctrlSetText localize "STR_DISP_INT_ABORT"; - _abortButton ctrlCommit 0; - _abortButton ctrlEnable true; -}; - -private _canUseControls = { - (playerSide isEqualTo west) || {!((player getVariable ["restrained",false]) || {player getVariable ["Escorting",false]} || {player getVariable ["transporting",false]} || {life_is_arrested} || {life_istazed} || {life_isknocked})} -}; - -for "_i" from 0 to 1 step 0 do { - waitUntil {!isNull (findDisplay 49)}; - private _abortButton = CONTROL(49,104); - _abortButton buttonSetAction "call SOCK_fnc_updateRequest; [player] remoteExec [""TON_fnc_cleanupRequest"",2];"; - private _respawnButton = CONTROL(49,1010); - private _fieldManual = CONTROL(49,122); - private _saveButton = CONTROL(49,103); - _saveButton ctrlSetText ""; - - //Extras - if (LIFE_SETTINGS(getNumber,"escapeMenu_displayExtras") isEqualTo 1) then { - private _topButton = CONTROL(49,2); - _topButton ctrlEnable false; - _topButton ctrlSetText format ["%1",LIFE_SETTINGS(getText,"escapeMenu_displayText")]; - _saveButton ctrlEnable false; - _saveButton ctrlSetText format ["Player UID: %1",getPlayerUID player]; - }; - - //Block off our buttons first. - _abortButton ctrlEnable false; - _fieldManual ctrlEnable false; //Never re-enable, blocks an old script executor. - _fieldManual ctrlShow false; - - if (call _canUseControls) then { - [] spawn _escSync; - } else { - _respawnButton ctrlEnable false; - }; - - waitUntil {isNull (findDisplay 49) || {!alive player}}; - if (!isNull (findDisplay 49) && {!alive player}) then { - (findDisplay 49) closeDisplay 2; - }; -}; diff --git a/Altis_Life.Altis/core/functions/fn_getInMan.sqf b/Altis_Life.Altis/core/functions/fn_getInMan.sqf new file mode 100644 index 000000000..21a212461 --- /dev/null +++ b/Altis_Life.Altis/core/functions/fn_getInMan.sqf @@ -0,0 +1,16 @@ +/* + File: fn_getInMan.sqf + Author: blackfisch + + Description: + Handles player entering a vehicle. +*/ +params [ + ["_unit", objNull, [objNull]], + ["_role", "", [""]], + ["_vehicle", objNull, [objNull]], + ["_turret", [], [[]]] +]; + +//update view distance settings +[] call life_fnc_updateViewDistance; diff --git a/Altis_Life.Altis/core/functions/fn_getOutMan.sqf b/Altis_Life.Altis/core/functions/fn_getOutMan.sqf new file mode 100644 index 000000000..f498fabde --- /dev/null +++ b/Altis_Life.Altis/core/functions/fn_getOutMan.sqf @@ -0,0 +1,16 @@ +/* + File: fn_getOutMan.sqf + Author: blackfisch + + Description: + Handles player leaving a vehicle. +*/ +params [ + ["_unit", objNull, [objNull]], + ["_role", "", [""]], + ["_vehicle", objNull, [objNull]], + ["_turret", [], [[]]] +]; + +//update view distance settings +[] call life_fnc_updateViewDistance; diff --git a/Altis_Life.Altis/core/functions/fn_hudSetup.sqf b/Altis_Life.Altis/core/functions/fn_hudSetup.sqf deleted file mode 100644 index 7510277e2..000000000 --- a/Altis_Life.Altis/core/functions/fn_hudSetup.sqf +++ /dev/null @@ -1,22 +0,0 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_hudSetup.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Setups the hud for the player? -*/ -disableSerialization; - -cutRsc ["playerHUD", "PLAIN", 2, false]; -[] call life_fnc_hudUpdate; - -[] spawn -{ - private ["_dam"]; - for "_i" from 0 to 1 step 0 do { - _dam = damage player; - waitUntil {!((damage player) isEqualTo _dam)}; - [] call life_fnc_hudUpdate; - }; -}; diff --git a/Altis_Life.Altis/core/functions/fn_hudUpdate.sqf b/Altis_Life.Altis/core/functions/fn_hudUpdate.sqf index 1590b2547..03b1e50d9 100644 --- a/Altis_Life.Altis/core/functions/fn_hudUpdate.sqf +++ b/Altis_Life.Altis/core/functions/fn_hudUpdate.sqf @@ -8,7 +8,9 @@ */ disableSerialization; -if (isNull LIFEdisplay) then {[] call life_fnc_hudSetup;}; +if (isNull LIFEdisplay) then { + cutRsc ["playerHUD", "PLAIN", 2, false]; +}; LIFEctrl(2200) progressSetPosition (life_hunger / 100); LIFEctrl(2201) progressSetPosition (1 - (damage player)); LIFEctrl(2202) progressSetPosition (life_thirst / 100); diff --git a/Altis_Life.Altis/core/functions/fn_inventoryOpened.sqf b/Altis_Life.Altis/core/functions/fn_inventoryOpened.sqf index c715c2d00..49b84d84b 100644 --- a/Altis_Life.Altis/core/functions/fn_inventoryOpened.sqf +++ b/Altis_Life.Altis/core/functions/fn_inventoryOpened.sqf @@ -46,3 +46,11 @@ private _list = ["LandVehicle", "Ship", "Air"]; true breakOut "main"; }; } count [_container, _secContainer]; + +[] spawn { + private _startTime = time; + waitUntil {!(isNull (findDisplay 49)) || time > (_startTime + 2.5)}; + if !(isNull (findDisplay 49)) then { + (findDisplay 49) closeDisplay 2; //close Esc dialog + }; +}; \ No newline at end of file diff --git a/Altis_Life.Altis/core/functions/fn_onGameInterrupt.sqf b/Altis_Life.Altis/core/functions/fn_onGameInterrupt.sqf new file mode 100644 index 000000000..7506a4368 --- /dev/null +++ b/Altis_Life.Altis/core/functions/fn_onGameInterrupt.sqf @@ -0,0 +1,47 @@ +#include "..\..\script_macros.hpp" +/* + File: fn_onGameInterrupt.sqf + Author: DomT602 + Description: Handles game interuptions - ie when esc menu is opened. +*/ +params [ + ["_display",displayNull,[displayNull]] +]; + +private _abortButton = _display displayCtrl 104; +private _respawnButton = _display displayCtrl 1010; +private _fieldManual = _display displayCtrl 122; +private _saveButton = _display displayCtrl 103; +private _topButton = _display displayCtrl 2; + +_abortButton ctrlEnable false; +_abortButton buttonSetAction "call SOCK_fnc_updateRequest; [player] remoteExec [""TON_fnc_cleanupRequest"",2];"; +_fieldManual ctrlEnable false; +_saveButton ctrlEnable false; + +if (LIFE_SETTINGS(getNumber,"escapeMenu_displayExtras") isEqualTo 1) then { + _topButton ctrlEnable false; + _topButton ctrlSetText (LIFE_SETTINGS(getText,"escapeMenu_displayText")); + _saveButton ctrlSetText format ["Player UID: %1",getPlayerUID player]; +}; + +private _conditions = playerSide isEqualTo west || {!((player getVariable ["restrained",false]) || {player getVariable ["Escorting",false]} || {player getVariable ["transporting",false]} || {life_is_arrested} || {life_istazed} || {life_isknocked})}; +if (_conditions) then { + [_display,_abortButton] spawn { + params ["_display","_abortButton"]; + private _abortTime = LIFE_SETTINGS(getNumber,"escapeMenu_timer"); + private _timeStamp = time + _abortTime; + + waitUntil { + _abortButton ctrlSetText format [localize "STR_NOTF_AbortESC",[(_timeStamp - time),"SS.MS"] call BIS_fnc_secondsToString]; + if (dialog && {isNull (findDisplay 7300)}) then {closeDialog 0}; + + (_timeStamp - time) <= 0 || {isNull _display || {!alive player}} + }; + if (!alive player) exitWith {}; + _abortButton ctrlSetText localize "STR_DISP_INT_ABORT"; + _abortButton ctrlEnable true; + }; +} else { + _respawnButton ctrlEnable false; +}; \ No newline at end of file diff --git a/Altis_Life.Altis/core/functions/fn_playerTags.sqf b/Altis_Life.Altis/core/functions/fn_playerTags.sqf index bc8bc4134..9dd15ef7b 100644 --- a/Altis_Life.Altis/core/functions/fn_playerTags.sqf +++ b/Altis_Life.Altis/core/functions/fn_playerTags.sqf @@ -6,8 +6,6 @@ Description: Adds the tags above other players heads when close and have visible range. */ -if (!life_settings_tagson) exitWith {}; -private ["_ui","_units","_masks"]; #define iconID 78000 #define scale 0.8 @@ -15,16 +13,16 @@ if (visibleMap || {!alive player} || {dialog}) exitWith { 500 cutText["","PLAIN"]; }; -_ui = uiNamespace getVariable ["Life_HUD_nameTags",displayNull]; +private _ui = uiNamespace getVariable ["Life_HUD_nameTags",displayNull]; if (isNull _ui) then { 500 cutRsc["Life_HUD_nameTags","PLAIN"]; _ui = uiNamespace getVariable ["Life_HUD_nameTags",displayNull]; }; -_units = nearestObjects[(visiblePosition player),["CAManBase","Land_Pallet_MilBoxes_F","Land_Sink_F"],50]; +private _units = nearestObjects[(visiblePosition player),["CAManBase","Land_Pallet_MilBoxes_F","Land_Sink_F"],50]; _units = _units - [player]; -_masks = LIFE_SETTINGS(getArray,"clothing_masks"); +private _masks = LIFE_SETTINGS(getArray,"clothing_masks"); private _index = -1; { diff --git a/Altis_Life.Altis/core/functions/fn_receiveMoney.sqf b/Altis_Life.Altis/core/functions/fn_receiveMoney.sqf index 68954f5c4..d9b8d968a 100644 --- a/Altis_Life.Altis/core/functions/fn_receiveMoney.sqf +++ b/Altis_Life.Altis/core/functions/fn_receiveMoney.sqf @@ -15,7 +15,7 @@ params [ if (isNull _unit || isNull _from || _val isEqualTo "") exitWith {}; if !(player isEqualTo _unit) exitWith {}; -if (!([_val] call TON_fnc_isnumber)) exitWith {}; +if (!([_val] call life_util_fnc_isNumber)) exitWith {}; if (_unit == _from) exitWith {}; //Bad boy, trying to exploit his way to riches. hint format [localize "STR_NOTF_GivenMoney",_from getVariable ["realname",name _from],[(parseNumber (_val))] call life_fnc_numberText]; diff --git a/Altis_Life.Altis/core/functions/fn_revealObjects.sqf b/Altis_Life.Altis/core/functions/fn_revealObjects.sqf index 075dfa6e5..d3f36315a 100644 --- a/Altis_Life.Altis/core/functions/fn_revealObjects.sqf +++ b/Altis_Life.Altis/core/functions/fn_revealObjects.sqf @@ -8,8 +8,6 @@ Can be taxing on low-end systems or AMD CPU users. */ -if (!life_settings_revealObjects) exitWith {}; - private _objects = nearestObjects[visiblePositionASL player, ["Land_CargoBox_V1_F","Land_BottlePlastic_V1_F","Land_TacticalBacon_F","Land_Can_V3_F","Land_CanisterFuel_F","Land_Money_F","Land_Suitcase_F","CAManBase"], 15]; { player reveal _x; diff --git a/Altis_Life.Altis/core/functions/fn_startLoadout.sqf b/Altis_Life.Altis/core/functions/fn_startLoadout.sqf index 2a6b38e32..d7f6b2859 100644 --- a/Altis_Life.Altis/core/functions/fn_startLoadout.sqf +++ b/Altis_Life.Altis/core/functions/fn_startLoadout.sqf @@ -1,37 +1,37 @@ -#include "..\..\script_macros.hpp" -/* - File: fn_startLoadout.sqf - Author: Casperento - - Description: - Loads a custom loadout on player when he got a new life -*/ -private _side = call { - if (playerSide isEqualTo civilian) exitWith {"civ"}; - if (playerSide isEqualTo west) exitWith {"cop"}; - if (playerSide isEqualTo independent) exitWith {"med"}; - if (playerSide isEqualTo east) exitWith {"east"}; -}; - -if (_side isEqualTo "civ") then { - if (life_is_arrested) exitWith { - player setUnitLoadout (missionConfigFile >> "Loadouts" >> "civ_level_arrested"); - }; - - private _civLoadout = getUnitLoadout (missionConfigFile >> "Loadouts" >> "civ_level_random"); - if (getNumber(missionConfigFile >> "Loadouts" >> "civilian_randomClothing") isEqualTo 1) then { - private _arr = getArray(missionConfigFile >> "Loadouts" >> "civRandomClothing"); - (_civLoadout select 3) set [0, selectRandom _arr]; - }; - player setUnitLoadout _civLoadout; -} else { - private _level = call { - if (_side isEqualTo "cop") exitWith {FETCH_CONST(life_coplevel)}; - if (_side isEqualTo "med") exitWith {FETCH_CONST(life_mediclevel)}; - if (_side isEqualTo "east") exitWith {0}; - }; - player setUnitLoadout (missionConfigFile >> "Loadouts" >> format["%1_level_%2", _side, _level]); -}; - -[] call life_fnc_playerSkins; -[] call life_fnc_saveGear; +#include "..\..\script_macros.hpp" +/* + File: fn_startLoadout.sqf + Author: Casperento + + Description: + Loads a custom loadout on player when he got a new life +*/ +private _side = call { + if (playerSide isEqualTo civilian) exitWith {"civ"}; + if (playerSide isEqualTo west) exitWith {"cop"}; + if (playerSide isEqualTo independent) exitWith {"med"}; + if (playerSide isEqualTo east) exitWith {"east"}; +}; + +if (_side isEqualTo "civ") then { + if (life_is_arrested) exitWith { + player setUnitLoadout (missionConfigFile >> "Loadouts" >> "civ_level_arrested"); + }; + + private _civLoadout = getUnitLoadout (missionConfigFile >> "Loadouts" >> "civ_level_random"); + if (getNumber(missionConfigFile >> "Loadouts" >> "civilian_randomClothing") isEqualTo 1) then { + private _arr = getArray(missionConfigFile >> "Loadouts" >> "civRandomClothing"); + (_civLoadout select 3) set [0, selectRandom _arr]; + }; + player setUnitLoadout _civLoadout; +} else { + private _level = call { + if (_side isEqualTo "cop") exitWith {FETCH_CONST(life_coplevel)}; + if (_side isEqualTo "med") exitWith {FETCH_CONST(life_mediclevel)}; + if (_side isEqualTo "east") exitWith {0}; + }; + player setUnitLoadout (missionConfigFile >> "Loadouts" >> format["%1_level_%2", _side, _level]); +}; + +[] call life_fnc_playerSkins; +[] call life_fnc_saveGear; diff --git a/Altis_Life.Altis/core/functions/fn_stripDownPlayer.sqf b/Altis_Life.Altis/core/functions/fn_stripDownPlayer.sqf index a34d06814..dacb3058b 100644 --- a/Altis_Life.Altis/core/functions/fn_stripDownPlayer.sqf +++ b/Altis_Life.Altis/core/functions/fn_stripDownPlayer.sqf @@ -4,8 +4,14 @@ Description: Strip the player down */ + removeAllWeapons player; -{player removeMagazine _x;} forEach (magazines player); + +{ + player removeMagazine _x; + true +} count (magazines player); + removeUniform player; removeVest player; removeBackpack player; @@ -15,8 +21,9 @@ removeHeadGear player; { player unassignItem _x; player removeItem _x; -} forEach (assignedItems player); + true +} count (assignedItems player); -if (hmd player != "") then { +if !(hmd player isEqualTo "") then { player unlinkItem (hmd player); }; \ No newline at end of file diff --git a/Altis_Life.Altis/core/functions/network/fn_corpse.sqf b/Altis_Life.Altis/core/functions/network/fn_corpse.sqf index d1a0ede5c..b4cc626bb 100644 --- a/Altis_Life.Altis/core/functions/network/fn_corpse.sqf +++ b/Altis_Life.Altis/core/functions/network/fn_corpse.sqf @@ -5,9 +5,11 @@ Description: Hides dead bodies. */ -private ["_corpse"]; -_corpse = [_this,0,objNull,[objNull]] call BIS_fnc_param; + +params [ + ["_corpse", objNull, [objNull]] +]; + if (isNull _corpse) exitWith {}; -if (alive _corpse) exitWith {}; //Stop script kiddies. -deleteVehicle _corpse; \ No newline at end of file +deleteVehicle _corpse; diff --git a/Altis_Life.Altis/core/functions/network/fn_jumpFnc.sqf b/Altis_Life.Altis/core/functions/network/fn_jumpFnc.sqf index db1815771..7252f29c2 100644 --- a/Altis_Life.Altis/core/functions/network/fn_jumpFnc.sqf +++ b/Altis_Life.Altis/core/functions/network/fn_jumpFnc.sqf @@ -1,36 +1,38 @@ -/* - File: fn_jumpFnc.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Makes the target jump. -*/ -private ["_unit","_vel","_dir","_v1","_v2","_anim","_oldpos"]; -_unit = [_this,0,objNull,[objNull]] call BIS_fnc_param; -_oldpos = getPosATL _unit; - -if (isNull _unit) exitWith {}; //Bad data - -if (animationState _unit == "AovrPercMrunSrasWrflDf") exitWith {}; - -if (local _unit) then { - _v1 = 3.82; - _v2 = .4; - _dir = direction player; - _vel = velocity _unit; - _unit setVelocity[(_vel select 0)+(sin _dir*_v2),(_vel select 1)+(cos _dir*_v2),(_vel select 2)+_v1]; -}; - -_anim = animationState _unit; -_unit switchMove "AovrPercMrunSrasWrflDf"; - -if (local _unit) then { - waitUntil { - if ((getPos _unit select 2) > 4) then { - _unit setposATL _oldpos; - _unit setVelocity [0, 0, 0]; - }; - animationState _unit != "AovrPercMrunSrasWrflDf" - }; - _unit switchMove _anim; -}; +/* + File: fn_jumpFnc.sqf + Author: Bryan "Tonic" Boardwine + + Description: + Makes the target jump. +*/ + +params [ + ["_unit", objNull, [objNull]] +]; + +if (isNull _unit) exitWith {}; +if (animationState _unit == "AovrPercMrunSrasWrflDf") exitWith {}; + +private _oldPos = getPosATL _unit; + +if (local _unit) then { + private _v1 = 3.82; + private _v2 = .4; + private _dir = direction _unit; + (velocity _unit) params ["_xVel","_yVel","_zVel"]; + _unit setVelocity [_xVel + (sin _dir*_v2), _yVel + (cos _dir*_v2), _zVel + _v1]; +}; + +private _anim = animationState _unit; +_unit switchMove "AovrPercMrunSrasWrflDf"; + +if (local _unit) then { + waitUntil { + if ((getPos _unit select 2) > 4) then { + _unit setPosATL _oldPos; + _unit setVelocity [0, 0, 0]; + }; + animationState _unit != "AovrPercMrunSrasWrflDf" + }; + _unit switchMove _anim; +}; diff --git a/Altis_Life.Altis/core/functions/network/fn_setFuel.sqf b/Altis_Life.Altis/core/functions/network/fn_setFuel.sqf index 09bbbdc4f..5aa2c68f9 100644 --- a/Altis_Life.Altis/core/functions/network/fn_setFuel.sqf +++ b/Altis_Life.Altis/core/functions/network/fn_setFuel.sqf @@ -4,4 +4,12 @@ Description: Used to set fuel levels in vehicles. (Ex. Service Chopper) */ -(_this select 0) setFuel (_this select 1); \ No newline at end of file + +params [ + ["_object", objNull, [objNull]], + ["_value", 1, [0]] +]; + +if (isNull _object) exitWith {}; + +_object setFuel _value; diff --git a/Altis_Life.Altis/core/functions/network/fn_soundDevice.sqf b/Altis_Life.Altis/core/functions/network/fn_soundDevice.sqf index 49bc84dae..6d4bafbd1 100644 --- a/Altis_Life.Altis/core/functions/network/fn_soundDevice.sqf +++ b/Altis_Life.Altis/core/functions/network/fn_soundDevice.sqf @@ -5,12 +5,16 @@ Description: Plays a device sound for mining (Mainly Tempest device). */ -if (isNull _this) exitWith {}; -if (player distance _this > 2500) exitWith {}; //Don't run it... They're to far out.. +params [ + ["_vehicle", objNull, [objNull]] +]; + +if (isNull _vehicle) exitWith {}; +if (player distance _vehicle > 2500) exitWith {}; for "_i" from 0 to 1 step 0 do { - if (isNull _this || !alive _this) exitWith {}; - if (isNil {_this getVariable "mining"}) exitWith {}; - _this say3D ["Device_disassembled_loop",150,1]; + if !(alive _vehicle) exitWith {}; + if (isNil {_vehicle getVariable "mining"}) exitWith {}; + _vehicle say3D ["Device_disassembled_loop",150,1]; sleep 28.6; }; diff --git a/Altis_Life.Altis/core/gangs/fn_clientGangKick.sqf b/Altis_Life.Altis/core/gangs/fn_clientGangKick.sqf new file mode 100644 index 000000000..92d2cefb4 --- /dev/null +++ b/Altis_Life.Altis/core/gangs/fn_clientGangKick.sqf @@ -0,0 +1,10 @@ +/* + File: fn_clientGangKick.sqf + Author: Bryan "Tonic" Boardwine + + Description: handles being kicked out of a gang +*/ + +life_my_gang = grpNull; +[player] joinSilent (createGroup civilian); +hint localize "STR_GNOTF_KickOutGang"; diff --git a/Altis_Life.Altis/core/gangs/fn_clientGangLeader.sqf b/Altis_Life.Altis/core/gangs/fn_clientGangLeader.sqf new file mode 100644 index 000000000..c952885fe --- /dev/null +++ b/Altis_Life.Altis/core/gangs/fn_clientGangLeader.sqf @@ -0,0 +1,18 @@ +/* + File: fn_clientGangLeader.sqf + Author: Bryan "Tonic" Boardwine + + Description: appoints player as gang leader +*/ +params [ + ["_unit", objNull, [objNull]], + ["_group", grpNull, [grpNull]] +]; + +_unit setRank "COLONEL"; + +if !(local _group) exitWith {}; +_group selectLeader _unit; + +if !(_unit isEqualTo player) exitWith {}; +hint localize "STR_GNOTF_GaveTransfer"; diff --git a/Altis_Life.Altis/core/gangs/fn_clientGangLeft.sqf b/Altis_Life.Altis/core/gangs/fn_clientGangLeft.sqf new file mode 100644 index 000000000..6fff2479d --- /dev/null +++ b/Altis_Life.Altis/core/gangs/fn_clientGangLeft.sqf @@ -0,0 +1,10 @@ +/* + File: fn_clientGangLeft.sqf + Author: Bryan "Tonic" Boardwine + + Description: leaves the group +*/ + +life_my_gang = grpNull; +[player] joinSilent (createGroup civilian); +hint localize "STR_GNOTF_LeaveGang"; diff --git a/Altis_Life.Altis/core/gangs/fn_gangCreated.sqf b/Altis_Life.Altis/core/gangs/fn_gangCreated.sqf index ac5746c87..c40485775 100644 --- a/Altis_Life.Altis/core/gangs/fn_gangCreated.sqf +++ b/Altis_Life.Altis/core/gangs/fn_gangCreated.sqf @@ -6,7 +6,6 @@ Description: Tells the player that the gang is created and throws him into it. */ -private "_group"; life_action_gangInUse = nil; if (BANK < (LIFE_SETTINGS(getNumber,"gang_price"))) exitWith { @@ -17,4 +16,4 @@ if (BANK < (LIFE_SETTINGS(getNumber,"gang_price"))) exitWith { BANK = BANK - LIFE_SETTINGS(getNumber,"gang_price"); [1] call SOCK_fnc_updatePartial; -hint format [localize "STR_GNOTF_CreateSuccess",(group player) getVariable "gang_name",[(LIFE_SETTINGS(getNumber,"gang_price"))] call life_fnc_numberText]; \ No newline at end of file +hint format [localize "STR_GNOTF_CreateSuccess",(group player) getVariable "gang_name",[(LIFE_SETTINGS(getNumber,"gang_price"))] call life_fnc_numberText]; diff --git a/Altis_Life.Altis/core/gangs/fn_gangDisband.sqf b/Altis_Life.Altis/core/gangs/fn_gangDisband.sqf index 9d8590689..4d871bdf1 100644 --- a/Altis_Life.Altis/core/gangs/fn_gangDisband.sqf +++ b/Altis_Life.Altis/core/gangs/fn_gangDisband.sqf @@ -7,8 +7,7 @@ Prompts the user about disbanding the gang and if the user accepts the gang will be disbanded and removed from the database. */ -private "_action"; -_action = [ +private _action = [ localize "STR_GNOTF_DisbandWarn", localize "STR_Gang_Disband_Gang", localize "STR_Global_Yes", @@ -26,4 +25,4 @@ if (_action) then { } else { hint localize "STR_GNOTF_DisbandGangCanc"; -}; \ No newline at end of file +}; diff --git a/Altis_Life.Altis/core/gangs/fn_gangDisbanded.sqf b/Altis_Life.Altis/core/gangs/fn_gangDisbanded.sqf index 5dfef7638..1c0024485 100644 --- a/Altis_Life.Altis/core/gangs/fn_gangDisbanded.sqf +++ b/Altis_Life.Altis/core/gangs/fn_gangDisbanded.sqf @@ -5,14 +5,12 @@ Description: Notifies members that the gang has been disbanded. */ -private "_group"; -_group = param [0,grpNull,[grpNull]]; +private _group = param [0,grpNull,[grpNull]]; if (isNull _group) exitWith {}; //Fail horn please. if (!isNull (findDisplay 2620)) then {closeDialog 2620}; hint localize "STR_GNOTF_DisbandWarn_2"; -[player] joinSilent (createGroup civilian); -if (units _group isEqualTo []) then { - deleteGroup _group; -}; +private _newGroup = createGroup civilian; +[player] joinSilent _newGroup; +_newGroup deleteGroupWhenEmpty true; diff --git a/Altis_Life.Altis/core/gangs/fn_gangKick.sqf b/Altis_Life.Altis/core/gangs/fn_gangKick.sqf index 63ef0b7a1..0638ff357 100644 --- a/Altis_Life.Altis/core/gangs/fn_gangKick.sqf +++ b/Altis_Life.Altis/core/gangs/fn_gangKick.sqf @@ -23,7 +23,7 @@ if (!(_members isEqualType [])) exitWith {}; _members = _members - [_unitID]; group player setVariable ["gang_members",_members,true]; -[_unit,group player] remoteExec ["TON_fnc_clientGangKick",_unit]; //Boot that bitch! +remoteExecCall ["life_fnc_clientGangKick",_unit]; if (life_HC_isActive) then { [4,group player] remoteExec ["HC_fnc_updateGang",HC_Life]; //Update the database. diff --git a/Altis_Life.Altis/core/gangs/fn_gangLeave.sqf b/Altis_Life.Altis/core/gangs/fn_gangLeave.sqf index 9c7e727ba..3d6ae9e43 100644 --- a/Altis_Life.Altis/core/gangs/fn_gangLeave.sqf +++ b/Altis_Life.Altis/core/gangs/fn_gangLeave.sqf @@ -17,7 +17,7 @@ if (!(_members isEqualType [])) exitWith {}; _members = _members - [_unitID]; group player setVariable ["gang_members",_members,true]; -[player,group player] remoteExec ["TON_fnc_clientGangLeft",player]; +call life_fnc_clientGangLeft; if (life_HC_isActive) then { [4,group player] remoteExec ["HC_fnc_updateGang",HC_Life]; //Update the database. diff --git a/Altis_Life.Altis/core/gangs/fn_gangNewLeader.sqf b/Altis_Life.Altis/core/gangs/fn_gangNewLeader.sqf index d484cd744..cf1a85266 100644 --- a/Altis_Life.Altis/core/gangs/fn_gangNewLeader.sqf +++ b/Altis_Life.Altis/core/gangs/fn_gangNewLeader.sqf @@ -25,16 +25,15 @@ _action = [ if (_action) then { _unitID = getPlayerUID _unit; if (_unitID isEqualTo "") exitWith {hint localize "STR_GNOTF_badUID";}; //Unlikely? - group player setVariable ["gang_owner",_unitID,true]; - group player selectLeader _unit; - [_unit,group player] remoteExec ["TON_fnc_clientGangLeader",_unit]; //Boot that bitch! + private _group = group player; + _group setVariable ["gang_owner",_unitID,true]; + [_unit, _group] remoteExecCall ["life_fnc_clientGangLeader", _group, _group]; if (life_HC_isActive) then { [3,group player] remoteExec ["HC_fnc_updateGang",HC_Life]; //Update the database. } else { [3,group player] remoteExec ["TON_fnc_updateGang",RSERV]; //Update the database. }; - } else { hint localize "STR_GNOTF_TransferCancel"; }; diff --git a/Altis_Life.Altis/core/gangs/fn_initGang.sqf b/Altis_Life.Altis/core/gangs/fn_initGang.sqf index 0d559756e..f7d036d7f 100644 --- a/Altis_Life.Altis/core/gangs/fn_initGang.sqf +++ b/Altis_Life.Altis/core/gangs/fn_initGang.sqf @@ -29,11 +29,11 @@ _exitLoop = false; if (!isNil "_group") then { [player] join _group; if ((life_gangData select 1) isEqualTo getPlayerUID player) then { - _group selectLeader player; - [player,_group] remoteExecCall ["TON_fnc_clientGangLeader",(units _group)]; + [_unit, _group] remoteExecCall ["life_fnc_clientGangLeader", _group, _group]; }; } else { _group = group player; + _group deleteGroupWhenEmpty true; _group setVariable ["gang_id",(life_gangData select 0),true]; _group setVariable ["gang_owner",(life_gangData select 1),true]; _group setVariable ["gang_name",(life_gangData select 2),true]; diff --git a/Altis_Life.Altis/core/housing/fn_houseMenu.sqf b/Altis_Life.Altis/core/housing/fn_houseMenu.sqf index d1b51cb15..c197d05f5 100644 --- a/Altis_Life.Altis/core/housing/fn_houseMenu.sqf +++ b/Altis_Life.Altis/core/housing/fn_houseMenu.sqf @@ -46,10 +46,10 @@ if (_curTarget in life_hideoutBuildings) exitWith { if (_curTarget isKindOf "House_F" && playerSide isEqualTo west) exitWith { - private _vaultHouse = [[["Altis", "Land_Research_house_V1_F"], ["Tanoa", "Land_Medevac_house_V1_F"]]] call TON_fnc_terrainSort; + private _vaultHouse = [[["Altis", "Land_Research_house_V1_F"], ["Tanoa", "Land_Medevac_house_V1_F"]]] call life_util_fnc_terrainSort; private _altisArray = [16019.5,16952.9,0]; private _tanoaArray = [11074.2,11501.5,0.00137329]; - private _pos = [[["Altis", _altisArray], ["Tanoa", _tanoaArray]]] call TON_fnc_terrainSort; + private _pos = [[["Altis", _altisArray], ["Tanoa", _tanoaArray]]] call life_util_fnc_terrainSort; if ((nearestObject [_pos,"Land_Dome_Big_F"]) isEqualTo _curTarget || (nearestObject [_pos,_vaultHouse]) isEqualTo _curTarget) then { diff --git a/Altis_Life.Altis/core/housing/fn_sellHouse.sqf b/Altis_Life.Altis/core/housing/fn_sellHouse.sqf index 11f240a6c..b4c23752f 100644 --- a/Altis_Life.Altis/core/housing/fn_sellHouse.sqf +++ b/Altis_Life.Altis/core/housing/fn_sellHouse.sqf @@ -58,7 +58,7 @@ if (_action) then { life_vehicles deleteAt _index; }; - _index = [str(getPosATL _house),life_houses] call TON_fnc_index; + _index = [str(getPosATL _house),life_houses] call life_util_fnc_index; if !(_index isEqualTo -1) then { life_houses deleteAt _index; }; diff --git a/Altis_Life.Altis/core/init.sqf b/Altis_Life.Altis/core/init.sqf index 82cc02cf9..72c1e26e7 100644 --- a/Altis_Life.Altis/core/init.sqf +++ b/Altis_Life.Altis/core/init.sqf @@ -44,8 +44,6 @@ diag_log "[Life Client] Server loading completed "; waitUntil {life_session_completed}; 0 cutText[localize "STR_Init_ClientFinish","BLACK FADED",99999999]; -[] spawn life_fnc_escInterupt; - switch (playerSide) do { case west: { life_paycheck = LIFE_SETTINGS(getNumber,"paycheck_cop"); @@ -54,6 +52,7 @@ switch (playerSide) do { case civilian: { life_paycheck = LIFE_SETTINGS(getNumber,"paycheck_civ"); [] call life_fnc_initCiv; + (group player) deleteGroupWhenEmpty true; }; case independent: { life_paycheck = LIFE_SETTINGS(getNumber,"paycheck_med"); @@ -69,27 +68,20 @@ player setVariable ["playerSurrender", false, true]; player setVariable ["realname", profileName, true]; diag_log "[Life Client] Past Settings Init"; -[] execFSM "core\fsm\client.fsm"; -diag_log "[Life Client] Executing client.fsm"; (findDisplay 46) displayAddEventHandler ["KeyDown", "_this call life_fnc_keyHandler"]; [player, life_settings_enableSidechannel, playerSide] remoteExecCall ["TON_fnc_manageSC", RSERV]; -[] call life_fnc_hudSetup; [] spawn life_fnc_survival; 0 cutText ["","BLACK IN"]; -[] spawn { - for "_i" from 0 to 1 step 0 do { - waitUntil {(!isNull (findDisplay 49)) && {(!isNull (findDisplay 602))}}; // Check if Inventory and ESC dialogs are open - (findDisplay 49) closeDisplay 2; // Close ESC dialog - (findDisplay 602) closeDisplay 2; // Close Inventory dialog - }; +if (profileNamespace getVariable ["life_settings_revealObjects",true]) then { + LIFE_ID_PlayerTags = addMissionEventHandler ["EachFrame", life_fnc_playerTags]; +}; +if (profileNamespace getVariable ["life_settings_revealObjects",true]) then { + LIFE_ID_RevealObjects = addMissionEventHandler ["EachFrame", life_fnc_revealObjects]; }; - -addMissionEventHandler ["EachFrame", life_fnc_playerTags]; -addMissionEventHandler ["EachFrame", life_fnc_revealObjects]; if (LIFE_SETTINGS(getNumber,"enable_fatigue") isEqualTo 0) then {player enableFatigue false;}; if (LIFE_SETTINGS(getNumber,"pump_service") isEqualTo 1) then { @@ -120,6 +112,8 @@ if (life_HC_isActive) then { [getPlayerUID player, player getVariable ["realname", name player]] remoteExec ["life_fnc_wantedProfUpdate", RSERV]; }; +[] call life_fnc_hudUpdate; + diag_log "----------------------------------------------------------------------------------------------------"; diag_log format [" End of Altis Life Client Init :: Total Execution Time %1 seconds ",(diag_tickTime - _timeStamp)]; diag_log "----------------------------------------------------------------------------------------------------"; diff --git a/Altis_Life.Altis/core/items/fn_blastingCharge.sqf b/Altis_Life.Altis/core/items/fn_blastingCharge.sqf index 1119108f1..f33fb6ed9 100644 --- a/Altis_Life.Altis/core/items/fn_blastingCharge.sqf +++ b/Altis_Life.Altis/core/items/fn_blastingCharge.sqf @@ -17,10 +17,10 @@ if (west countSide playableUnits < (LIFE_SETTINGS(getNumber,"minimum_cops"))) ex hint format [localize "STR_Civ_NotEnoughCops",(LIFE_SETTINGS(getNumber,"minimum_cops"))]; }; -private _vaultHouse = [[["Altis", "Land_Research_house_V1_F"], ["Tanoa", "Land_Medevac_house_V1_F"]]] call TON_fnc_terrainSort; +private _vaultHouse = [[["Altis", "Land_Research_house_V1_F"], ["Tanoa", "Land_Medevac_house_V1_F"]]] call life_util_fnc_terrainSort; private _altisArray = [16019.5,16952.9,0]; private _tanoaArray = [11074.2,11501.5,0.00137329]; -private _pos = [[["Altis", _altisArray], ["Tanoa", _tanoaArray]]] call TON_fnc_terrainSort; +private _pos = [[["Altis", _altisArray], ["Tanoa", _tanoaArray]]] call life_util_fnc_terrainSort; if ((nearestObject [_pos,_vaultHouse]) getVariable ["locked",true]) exitWith {hint localize "STR_ISTR_Blast_Exploit"}; if (!([false,"blastingcharge",1] call life_fnc_handleInv)) exitWith {}; //Error? diff --git a/Altis_Life.Altis/core/items/fn_boltcutter.sqf b/Altis_Life.Altis/core/items/fn_boltcutter.sqf index 255d3ad6a..e46ab0fd7 100644 --- a/Altis_Life.Altis/core/items/fn_boltcutter.sqf +++ b/Altis_Life.Altis/core/items/fn_boltcutter.sqf @@ -9,10 +9,10 @@ private ["_building","_door","_doors","_cpRate","_title","_progressBar","_titleText","_cp","_ui"]; _building = param [0,objNull,[objNull]]; -private _vaultHouse = [[["Altis", "Land_Research_house_V1_F"], ["Tanoa", "Land_Medevac_house_V1_F"]]] call TON_fnc_terrainSort; +private _vaultHouse = [[["Altis", "Land_Research_house_V1_F"], ["Tanoa", "Land_Medevac_house_V1_F"]]] call life_util_fnc_terrainSort; private _altisArray = [16019.5,16952.9,0]; private _tanoaArray = [11074.2,11501.5,0.00137329]; -private _pos = [[["Altis", _altisArray], ["Tanoa", _tanoaArray]]] call TON_fnc_terrainSort; +private _pos = [[["Altis", _altisArray], ["Tanoa", _tanoaArray]]] call life_util_fnc_terrainSort; if (isNull _building) exitWith {}; if (!(_building isKindOf "House_F")) exitWith {hint localize "STR_ISTR_Bolt_NotNear";}; diff --git a/Altis_Life.Altis/core/pmenu/fn_clientMessage.sqf b/Altis_Life.Altis/core/pmenu/fn_clientMessage.sqf new file mode 100644 index 000000000..6d2948755 --- /dev/null +++ b/Altis_Life.Altis/core/pmenu/fn_clientMessage.sqf @@ -0,0 +1,75 @@ +/* + File: fn_clientMessage.sqf + Author: Bryan "Tonic" Boardwine + + Description: + displays a received message +*/ +params [ + ["_msg", "", [""]], + ["_from", "", [""]], + ["_type", "", [""]], + ["_loc", "Unknown", [""]] +]; + +if (_from isEqualTo "" || {_msg isEqualTo ""}) exitWith {}; +private _message = ""; + +switch (toLower _type) do { + case "cop" : { + if !(playerSide isEqualTo west) exitWith {}; + _message = format ["--- 911 DISPATCH FROM %1: %2",_from,_msg]; + + hint parseText format ["New Dispatch

To: All Officers
From: %1
Coords: %2

Message:
%3",_from,_loc,_msg]; + + ["PoliceDispatch",[format ["A New Police Report From: %1",_from]]] call bis_fnc_showNotification; + }; + + case "med": { + if !(playerSide isEqualTo independent) exitWith {}; + + _message = format ["!!! EMS REQUEST: %1",_msg]; + hint parseText format ["EMS Request

To: You
From: %1
Coords: %2

Message:
%3",_from,_loc,_msg]; + + ["TextMessage",[format ["EMS Request from %1",_from]]] call bis_fnc_showNotification; + }; + + case "admin" : { + if ((call life_adminlevel) < 1) exitWith {}; + _message = format ["!!! ADMIN REQUEST FROM %1: %2",_from,_msg]; + + hint parseText format ["Admin Request

To: Admins
From: %1
Coords: %2

Message:
%3",_from,_loc,_msg]; + + ["AdminDispatch",[format ["%1 Has Requested An Admin!",_from]]] call bis_fnc_showNotification; + }; + + case "adminall" : { + _message = format ["!!! ADMIN MESSAGE: %1",_msg]; + _admin = format ["Sent by admin: %1", _from]; + hint parseText format ["Admin Message

To: You
From: An Admin

Message:
%1",_msg]; + + ["AdminMessage",["You Have Received A Message From An Admin!"]] call bis_fnc_showNotification; + if ((call life_adminlevel) > 0) then {systemChat _admin;}; + }; + + case "admintoplayer": { + _message = format ["!!!ADMIN MESSAGE: %1",_msg]; + + hint parseText format ["Admin Message

To: All Players
From: The Admins

Message:
%1",_msg]; + + ["AdminMessage",["You Have Received A Message From An Admin!"]] call bis_fnc_showNotification; + if ((call life_adminlevel) > 0) then { + private _admin = format ["Sent by admin: %1", _from]; + systemChat _admin; + }; + }; + + default { + _message = format [">>>MESSAGE FROM %1: %2",_from,_msg]; + hint parseText format ["New Message

To: You
From: %1

Message:
%2",_from,_msg]; + + ["TextMessage",[format ["You Received A New Private Message From %1",_from]]] call bis_fnc_showNotification; + }; +}; + +systemChat _message; diff --git a/Altis_Life.Altis/core/pmenu/fn_giveItem.sqf b/Altis_Life.Altis/core/pmenu/fn_giveItem.sqf index 3b5746677..2ddfa9e31 100644 --- a/Altis_Life.Altis/core/pmenu/fn_giveItem.sqf +++ b/Altis_Life.Altis/core/pmenu/fn_giveItem.sqf @@ -34,7 +34,7 @@ call { private _item = lbData [2005, lbCurSel 2005]; - if !([_value] call TON_fnc_isnumber) exitWith { + if !([_value] call life_util_fnc_isNumber) exitWith { hint localize "STR_NOTF_notNumberFormat"; }; if (parseNumber _value <= 0) exitWith { diff --git a/Altis_Life.Altis/core/pmenu/fn_giveMoney.sqf b/Altis_Life.Altis/core/pmenu/fn_giveMoney.sqf index 5e5fce9ab..ef8f1ed86 100644 --- a/Altis_Life.Altis/core/pmenu/fn_giveMoney.sqf +++ b/Altis_Life.Altis/core/pmenu/fn_giveMoney.sqf @@ -18,7 +18,7 @@ if (isNull _unit) exitWith {ctrlShow[2001,true];}; //A series of checks *ugh* if (!life_use_atm) exitWith {hint localize "STR_NOTF_recentlyRobbedBank";ctrlShow[2001,true];}; -if (!([_amount] call TON_fnc_isnumber)) exitWith {hint localize "STR_NOTF_notNumberFormat";ctrlShow[2001,true];}; +if (!([_amount] call life_util_fnc_isNumber)) exitWith {hint localize "STR_NOTF_notNumberFormat";ctrlShow[2001,true];}; if (parseNumber(_amount) <= 0) exitWith {hint localize "STR_NOTF_enterAmount";ctrlShow[2001,true];}; if (parseNumber(_amount) > CASH) exitWith {hint localize "STR_NOTF_notEnoughtToGive";ctrlShow[2001,true];}; if (isNull _unit) exitWith {ctrlShow[2001,true];}; diff --git a/Altis_Life.Altis/core/pmenu/fn_keyGive.sqf b/Altis_Life.Altis/core/pmenu/fn_keyGive.sqf index 599a24b5c..daaf9c05a 100644 --- a/Altis_Life.Altis/core/pmenu/fn_keyGive.sqf +++ b/Altis_Life.Altis/core/pmenu/fn_keyGive.sqf @@ -28,11 +28,11 @@ if (_unit == player) exitWith {}; _uid = getPlayerUID _unit; _owners = _vehicle getVariable "vehicle_info_owners"; -_index = [_uid,_owners] call TON_fnc_index; +_index = [_uid,_owners] call life_util_fnc_index; if (_index isEqualTo -1) then { _owners pushBack [_uid,_unit getVariable ["realname",name _unit]]; _vehicle setVariable ["vehicle_info_owners",_owners,true]; }; hint format [localize "STR_NOTF_givenKeysTo",_unit getVariable ["realname",name _unit],typeOf _vehicle]; -[_vehicle,_unit,profileName] remoteExecCAll ["TON_fnc_clientGetKey",_unit]; +[_vehicle,profileName] remoteExecCall ["TON_fnc_clientGetKey",_unit]; diff --git a/Altis_Life.Altis/core/pmenu/fn_removeItem.sqf b/Altis_Life.Altis/core/pmenu/fn_removeItem.sqf index fd6571b5d..c2b539c78 100644 --- a/Altis_Life.Altis/core/pmenu/fn_removeItem.sqf +++ b/Altis_Life.Altis/core/pmenu/fn_removeItem.sqf @@ -13,7 +13,7 @@ _data = lbData[2005,(lbCurSel 2005)]; _value = ctrlText 2010; if (_data isEqualTo "") exitWith {hint localize "STR_NOTF_didNotSelectToRemove";}; -if (!([_value] call TON_fnc_isnumber)) exitWith {hint localize "STR_NOTF_notNumberFormat";}; +if (!([_value] call life_util_fnc_isNumber)) exitWith {hint localize "STR_NOTF_notNumberFormat";}; if (parseNumber(_value) <= 0) exitWith {hint localize "STR_NOTF_enterAmountRemove";}; if (ITEM_ILLEGAL(_data) isEqualTo 1 && ([west,visiblePosition player,100] call life_fnc_nearUnits)) exitWith {titleText[localize "STR_NOTF_illegalItemCannotDispose","PLAIN"]}; if !(isNull objectParent player) exitWith {titleText[localize "STR_NOTF_cannotRemoveInVeh","PLAIN"]}; diff --git a/Altis_Life.Altis/core/pmenu/fn_s_onCheckedChange.sqf b/Altis_Life.Altis/core/pmenu/fn_s_onCheckedChange.sqf index 3a3269fce..dfbce176f 100644 --- a/Altis_Life.Altis/core/pmenu/fn_s_onCheckedChange.sqf +++ b/Altis_Life.Altis/core/pmenu/fn_s_onCheckedChange.sqf @@ -6,30 +6,30 @@ Description: Switching it up and making it prettier.. */ -private ["_option","_state"]; -_option = _this select 0; -_state = _this select 1; +params [ + ["_option","",[""]], + ["_state",0,[0]] +]; +if (_option isEqualTo "") exitWith {}; -switch (_option) do { +switch _option do { case "tags": { if (_state isEqualTo 1) then { - life_settings_tagson = true; profileNamespace setVariable ["life_settings_tagson",true]; + LIFE_ID_PlayerTags = addMissionEventHandler ["EachFrame", life_fnc_playerTags]; } else { - life_settings_tagson = false; profileNamespace setVariable ["life_settings_tagson",false]; + removeMissionEventHandler ["EachFrame",LIFE_ID_PlayerTags]; }; }; case "objects": { if (_state isEqualTo 1) then { - life_settings_revealObjects = true; profileNamespace setVariable ["life_settings_revealObjects",true]; - LIFE_ID_RevealObjects = ["LIFE_RevealObjects","onEachFrame","life_fnc_revealObjects"] call BIS_fnc_addStackedEventHandler; + LIFE_ID_RevealObjects = addMissionEventHandler ["EachFrame", life_fnc_revealObjects]; } else { - life_settings_revealObjects = false; profileNamespace setVariable ["life_settings_revealObjects",false]; - [LIFE_ID_RevealObjects,"onEachFrame"] call BIS_fnc_removeStackedEventHandler; + removeMissionEventHandler ["EachFrame",LIFE_ID_RevealObjects]; }; }; diff --git a/Altis_Life.Altis/core/pmenu/fn_sendMessage.sqf b/Altis_Life.Altis/core/pmenu/fn_sendMessage.sqf new file mode 100644 index 000000000..a55c38a3f --- /dev/null +++ b/Altis_Life.Altis/core/pmenu/fn_sendMessage.sqf @@ -0,0 +1,77 @@ +#define CLIENTS -2 +/* + File: fn_sendMessage.sqf + Author: blackfisch + + Description: send message to target +*/ +params [ + ["_ehParams", [], [[]]], + ["_target", "player", [""]] +]; +_ehParams params [ + ["_control", controlNull, [controlNull]] +]; + +_control ctrlEnable false; + +if (_target isEqualTo "cop" && {(west countSide allPlayers) isEqualTo 0}) exitWith { + hint localize "STR_CELLMSG_NoCops"; + _control ctrlEnable true; +}; + +if (_target isEqualTo "med" && {(independent countSide allPlayers) isEqualTo 0}) exitWith { + hint localize "STR_CELLMSG_NoMedics"; + _control ctrlEnable true; +}; + +private _to = call compile format ["%1",(lbData[3004,(lbCurSel 3004)])]; +if ((_target in ["adminToPlayer", "player"]) && {isNil "_to" || {isNull _to}}) exitWith { + _control ctrlEnable true; +}; + +private _msg = ctrlText 3003; +if (_msg isEqualTo "") exitWith { + hint localize "STR_CELLMSG_EnterMSG"; + _control ctrlEnable true; +}; + +private _maxLength = getNumber(missionConfigFile >> "Life_Settings" >> "message_maxlength"); +if (_maxLength > -1 && {(count _msg) > _maxLength}) exitWith { + hint localize "STR_CELLMSG_LIMITEXCEEDED"; + _control ctrlEnable true; +}; + +private _remoteTarget = CLIENTS; +private _confirmMessage = (switch (toLower _target) do { + case "cop": { + _remoteTarget = west; + "STR_CELLMSG_ToPolice"; + }; + case "med": { + _remoteTarget = independent; + "STR_CELLMSG_ToEMS"; + }; + case "admin": { + "STR_CELLMSG_ToAdmin"; + }; + case "adminall": { + "STR_CELLMSG_AdminToAll"; + }; + case "admintoplayer": { + _remoteTarget = _to; + "STR_CELLMSG_AdminToPerson"; + }; + default { + _remoteTarget = _to; + "STR_CELLMSG_ToPerson"; + }; +}); + +private _sender = player getVariable ["realName", profileName]; +[_msg,_sender,_target, mapGridPosition player] remoteExecCall ["life_fnc_clientMessage",_remoteTarget]; +call life_fnc_cellphone; + +private _toName = (if (isNil "_to" || {isNull _to}) then {"ERROR"} else {_to getVariable ["realname", name _to]}); +hint format [localize _confirmMessage,_toName,_msg]; +_control ctrlEnable true; diff --git a/Altis_Life.Altis/core/pmenu/fn_settingsMenu.sqf b/Altis_Life.Altis/core/pmenu/fn_settingsMenu.sqf index 912b308ee..96d988b81 100644 --- a/Altis_Life.Altis/core/pmenu/fn_settingsMenu.sqf +++ b/Altis_Life.Altis/core/pmenu/fn_settingsMenu.sqf @@ -24,14 +24,12 @@ ctrlSetText[2922, format ["%1", life_settings_viewDistanceAir]]; } forEach [[2901,life_settings_viewDistanceFoot],[2911,life_settings_viewDistanceCar],[2921,life_settings_viewDistanceAir]]; -if (isNil "life_settings_revealObjects") then { +if (isNil "life_settings_enableNewsBroadcast") then { life_settings_enableNewsBroadcast = profileNamespace setVariable ["life_enableNewsBroadcast",true]; life_settings_enableSidechannel = profileNamespace setVariable ["life_enableSidechannel",true]; - life_settings_tagson = profileNamespace setVariable ["life_settings_tagson",true]; - life_settings_revealObjects = profileNamespace setVariable ["life_settings_revealObjects",true]; }; CONTROL(2900,2971) cbSetChecked life_settings_enableSidechannel; CONTROL(2900,2973) cbSetChecked life_settings_enableNewsBroadcast; -CONTROL(2900,2970) cbSetChecked life_settings_tagson; -CONTROL(2900,2972) cbSetChecked life_settings_revealObjects; +CONTROL(2900,2970) cbSetChecked (profileNamespace getVariable ["life_settings_tagson",true]); +CONTROL(2900,2972) cbSetChecked (profileNamespace getVariable ["life_settings_revealObjects",true]); diff --git a/Altis_Life.Altis/core/session/fn_requestReceived.sqf b/Altis_Life.Altis/core/session/fn_requestReceived.sqf old mode 100644 new mode 100755 index 08e7b211d..8a349d3c0 --- a/Altis_Life.Altis/core/session/fn_requestReceived.sqf +++ b/Altis_Life.Altis/core/session/fn_requestReceived.sqf @@ -8,6 +8,7 @@ sort through the information, validate it and if all valid set the client up. */ + private _count = count _this; life_session_tries = life_session_tries + 1; if (life_session_completed) exitWith {}; //Why did this get executed when the client already initialized? Fucking arma... @@ -32,8 +33,8 @@ if (!isServer && (!isNil "life_adminlevel" || !isNil "life_coplevel" || !isNil " }; //Parse basic player information. -CASH = parseNumber (_this select 2); -BANK = parseNumber (_this select 3); +CASH = _this select 2; +BANK = _this select 3; CONST(life_adminlevel,(_this select 4)); if (LIFE_SETTINGS(getNumber,"donor_level") isEqualTo 1) then { CONST(life_donorlevel,(_this select 5)); @@ -42,7 +43,7 @@ if (LIFE_SETTINGS(getNumber,"donor_level") isEqualTo 1) then { }; //Loop through licenses -if (count (_this select 6) > 0) then { +if !((_this select 6) isEqualTo []) then { {missionNamespace setVariable [(_x select 0),(_x select 1)];} forEach (_this select 6); }; @@ -86,7 +87,7 @@ switch (playerSide) do { } forEach life_houses; life_gangData = _this select (_count - 2); - if !(count life_gangData isEqualTo 0) then { + if !(life_gangData isEqualTo []) then { [] spawn life_fnc_initGang; }; [] spawn life_fnc_initHouses; @@ -104,9 +105,9 @@ switch (playerSide) do { }; life_gear = _this select 8; -call life_fnc_loadGear; +[true] call life_fnc_loadGear; -if (count (_this select (_count - 1)) > 0) then { +if !((_this select (_count - 1)) isEqualTo []) then { {life_vehicles pushBack _x;} forEach (_this select (_count - 1)); }; diff --git a/Altis_Life.Altis/core/shops/fn_vehicleShopLBChange.sqf b/Altis_Life.Altis/core/shops/fn_vehicleShopLBChange.sqf index c25d06063..948362f6f 100644 --- a/Altis_Life.Altis/core/shops/fn_vehicleShopLBChange.sqf +++ b/Altis_Life.Altis/core/shops/fn_vehicleShopLBChange.sqf @@ -92,7 +92,7 @@ _numberindexcolorarray = []; for "_i" from 0 to (count(_colorArray) - 1) do { _numberindexcolorarray pushBack _i; }; -_indexrandom = _numberindexcolorarray call BIS_fnc_selectRandom; +_indexrandom = selectRandom _numberindexcolorarray; _ctrl lbSetCurSel _indexrandom; if (_className in (LIFE_SETTINGS(getArray,"vehicleShop_rentalOnly"))) then { diff --git a/Altis_Life.Altis/core/shops/fn_virt_buy.sqf b/Altis_Life.Altis/core/shops/fn_virt_buy.sqf index 4ce9415fd..9f4fc0a69 100644 --- a/Altis_Life.Altis/core/shops/fn_virt_buy.sqf +++ b/Altis_Life.Altis/core/shops/fn_virt_buy.sqf @@ -11,14 +11,14 @@ if ((lbCurSel 2401) isEqualTo -1) exitWith {hint localize "STR_Shop_Virt_Nothing _type = lbData[2401,(lbCurSel 2401)]; _price = lbValue[2401,(lbCurSel 2401)]; _amount = ctrlText 2404; -if (!([_amount] call TON_fnc_isnumber)) exitWith {hint localize "STR_Shop_Virt_NoNum";}; +if (!([_amount] call life_util_fnc_isNumber)) exitWith {hint localize "STR_Shop_Virt_NoNum";}; _diff = [_type,parseNumber(_amount),life_carryWeight,life_maxWeight] call life_fnc_calWeightDiff; _amount = parseNumber(_amount); if (_diff <= 0) exitWith {hint localize "STR_NOTF_NoSpace"}; _amount = _diff; private _altisArray = ["Land_u_Barracks_V2_F","Land_i_Barracks_V2_F"]; private _tanoaArray = ["Land_School_01_F","Land_Warehouse_03_F","Land_House_Small_02_F"]; -private _hideoutObjs = [[["Altis", _altisArray], ["Tanoa", _tanoaArray]]] call TON_fnc_terrainSort; +private _hideoutObjs = [[["Altis", _altisArray], ["Tanoa", _tanoaArray]]] call life_util_fnc_terrainSort; _hideout = (nearestObjects[getPosATL player,_hideoutObjs,25]) select 0; if ((_price * _amount) > CASH && {!isNil "_hideout" && {!isNil {group player getVariable "gang_bank"}} && {(group player getVariable "gang_bank") <= _price * _amount}}) exitWith {hint localize "STR_NOTF_NotEnoughMoney"}; if ((time - life_action_delay) < 0.2) exitWith {hint localize "STR_NOTF_ActionDelay";}; diff --git a/Altis_Life.Altis/core/shops/fn_virt_sell.sqf b/Altis_Life.Altis/core/shops/fn_virt_sell.sqf index 90270991e..83ebacf80 100644 --- a/Altis_Life.Altis/core/shops/fn_virt_sell.sqf +++ b/Altis_Life.Altis/core/shops/fn_virt_sell.sqf @@ -13,7 +13,7 @@ _price = M_CONFIG(getNumber,"VirtualItems",_type,"sellPrice"); if (_price isEqualTo -1) exitWith {}; _amount = ctrlText 2405; -if (!([_amount] call TON_fnc_isnumber)) exitWith {hint localize "STR_Shop_Virt_NoNum";}; +if (!([_amount] call life_util_fnc_isNumber)) exitWith {hint localize "STR_Shop_Virt_NoNum";}; _amount = parseNumber (_amount); if (_amount > (ITEM_VALUE(_type))) exitWith {hint localize "STR_Shop_Virt_NotEnough"}; if ((time - life_action_delay) < 0.2) exitWith {hint localize "STR_NOTF_ActionDelay";}; @@ -31,7 +31,7 @@ if ([false,_type,_amount] call life_fnc_handleInv) then { if (life_shop_type isEqualTo "drugdealer") then { private ["_array","_ind","_val"]; _array = life_shop_npc getVariable ["sellers",[]]; - _ind = [getPlayerUID player,_array] call TON_fnc_index; + _ind = [getPlayerUID player,_array] call life_util_fnc_index; if (!(_ind isEqualTo -1)) then { _val = ((_array select _ind) select 2); _val = _val + _price; diff --git a/Altis_Life.Altis/core/shops/fn_weaponShopBuySell.sqf b/Altis_Life.Altis/core/shops/fn_weaponShopBuySell.sqf index abbfb7b66..d8b4f286c 100644 --- a/Altis_Life.Altis/core/shops/fn_weaponShopBuySell.sqf +++ b/Altis_Life.Altis/core/shops/fn_weaponShopBuySell.sqf @@ -31,7 +31,7 @@ if ((uiNamespace getVariable ["Weapon_Shop_Filter",0]) isEqualTo 1) then { } else { private _altisArray = ["Land_u_Barracks_V2_F","Land_i_Barracks_V2_F"]; private _tanoaArray = ["Land_School_01_F","Land_Warehouse_03_F","Land_House_Small_02_F"]; - private _hideoutObjs = [[["Altis", _altisArray], ["Tanoa", _tanoaArray]]] call TON_fnc_terrainSort; + private _hideoutObjs = [[["Altis", _altisArray], ["Tanoa", _tanoaArray]]] call life_util_fnc_terrainSort; private _hideout = (nearestObjects[getPosATL player,_hideoutObjs,25]) select 0; if (!isNil "_hideout" && {!isNil {group player getVariable "gang_bank"}} && {(group player getVariable "gang_bank") >= _price}) then { _action = [ diff --git a/Altis_Life.Altis/core/shops/fn_weaponShopFilter.sqf b/Altis_Life.Altis/core/shops/fn_weaponShopFilter.sqf index ac0de74a5..21138a86d 100644 --- a/Altis_Life.Altis/core/shops/fn_weaponShopFilter.sqf +++ b/Altis_Life.Altis/core/shops/fn_weaponShopFilter.sqf @@ -133,7 +133,7 @@ if ((uiNamespace getVariable ["Weapon_Magazine",0]) isEqualTo 1 || {(uiNamespace _y = _x; { if (!(_x in _listedItems) && _x != "") then { - _iS = [_x,_y] call TON_fnc_index; + _iS = [_x,_y] call life_util_fnc_index; if !(_iS isEqualTo -1) then { _z = _y select _iS; if (!((_z select 3) isEqualTo -1)) then { diff --git a/Altis_Life.Altis/core/shops/fn_weaponShopSelection.sqf b/Altis_Life.Altis/core/shops/fn_weaponShopSelection.sqf index 065894710..fafdb6f96 100644 --- a/Altis_Life.Altis/core/shops/fn_weaponShopSelection.sqf +++ b/Altis_Life.Altis/core/shops/fn_weaponShopSelection.sqf @@ -20,7 +20,7 @@ if ((uiNamespace getVariable ["Weapon_Shop_Filter",0]) isEqualTo 1) then { _itemArray = M_CONFIG(getArray,"WeaponShops",_shop,"items"); _itemArray append M_CONFIG(getArray,"WeaponShops",_shop,"mags"); _itemArray append M_CONFIG(getArray,"WeaponShops",_shop,"accs"); - _item = [_item,_itemArray] call TON_fnc_index; + _item = [_item,_itemArray] call life_util_fnc_index; _price = ((_itemArray select _item) select 3); _priceTag ctrlSetStructuredText parseText format ["Price: $%1",[(_price)] call life_fnc_numberText]; _control lbSetValue[_index,_price]; diff --git a/Altis_Life.Altis/core/utils/fn_index.sqf b/Altis_Life.Altis/core/utils/fn_index.sqf new file mode 100644 index 000000000..9e79f271a --- /dev/null +++ b/Altis_Life.Altis/core/utils/fn_index.sqf @@ -0,0 +1,12 @@ +/* + File: fn_index.sqf + Author: Bryan "Tonic" Boardwine + + Description: return index of _item in _stack +*/ +params [ + "_item", + ["_stack",[],[[]]] +]; + +_stack findIf {_item in _x}; diff --git a/Altis_Life.Altis/core/utils/fn_isNumber.sqf b/Altis_Life.Altis/core/utils/fn_isNumber.sqf new file mode 100644 index 000000000..215649cdf --- /dev/null +++ b/Altis_Life.Altis/core/utils/fn_isNumber.sqf @@ -0,0 +1,13 @@ +/* + File: fn_isNumber.sqf + Author: Bryan "Tonic" Boardwine + + Description: determines whether or not a string represents a valid number +*/ +params [ + ["_string","",[""]] +]; +if (_string isEqualTo "") exitWith {false}; +private _array = _string splitString ""; + +(_array findIf {!(_x in ["0","1","2","3","4","5","6","7","8","9"])}) isEqualTo -1; diff --git a/Altis_Life.Altis/core/utils/fn_playerQuery.sqf b/Altis_Life.Altis/core/utils/fn_playerQuery.sqf new file mode 100644 index 000000000..3a234bc32 --- /dev/null +++ b/Altis_Life.Altis/core/utils/fn_playerQuery.sqf @@ -0,0 +1,10 @@ +/* + File: fn_playerQuery.sqf + Author: Bryan "Tonic" Boardwine + + Description: + pass local variables to admin +*/ +if (!isRemoteExecuted) exitWith {}; + +[life_atmbank,life_cash,owner player,player,profileNameSteam,getPlayerUID player,playerSide] remoteExecCall ["life_fnc_adminInfo",remoteExecutedOwner]; diff --git a/life_server/Functions/Systems/fn_terrainSort.sqf b/Altis_Life.Altis/core/utils/fn_terrainSort.sqf similarity index 100% rename from life_server/Functions/Systems/fn_terrainSort.sqf rename to Altis_Life.Altis/core/utils/fn_terrainSort.sqf diff --git a/Altis_Life.Altis/core/vehicle/fn_clientGetKey.sqf b/Altis_Life.Altis/core/vehicle/fn_clientGetKey.sqf new file mode 100644 index 000000000..16737225f --- /dev/null +++ b/Altis_Life.Altis/core/vehicle/fn_clientGetKey.sqf @@ -0,0 +1,17 @@ +/* + File: fn_clientGetKey.sqf + Author: Bryan "Tonic" Boardwine + + Description: adds key to keychain and displays a message +*/ +params [ + ["_vehicle", objNull, [objNull]], + ["_from", "", [""]] +]; + +if (_vehicle in life_vehicles) exitWith {}; + +private _name = getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "displayName"); +hint format [localize "STR_NOTF_gaveKeysFrom",_from,_name]; +life_vehicles pushBack _vehicle; +[getPlayerUID player,playerSide,_vehicle,1] remoteExecCall ["TON_fnc_keyManagement",2]; diff --git a/Altis_Life.Altis/core/vehicle/fn_deviceMine.sqf b/Altis_Life.Altis/core/vehicle/fn_deviceMine.sqf index 834e627c0..fd6f6a209 100644 --- a/Altis_Life.Altis/core/vehicle/fn_deviceMine.sqf +++ b/Altis_Life.Altis/core/vehicle/fn_deviceMine.sqf @@ -126,7 +126,7 @@ for "_i" from 0 to 1 step 0 do { _vehicle_data = _vehicle getVariable ["Trunk",[[],0]]; _inv = +(_vehicle_data select 0); _space = (_vehicle_data select 1); - _itemIndex = [_resource,_inv] call TON_fnc_index; + _itemIndex = [_resource,_inv] call life_util_fnc_index; _weight = [_vehicle] call life_fnc_vehicleWeight; _random = 10 + round((random(10))); _sum = [_resource,_random,(_weight select 1),(_weight select 0)] call life_fnc_calWeightDiff; // Get a sum base of the remaining weight.. diff --git a/Altis_Life.Altis/core/vehicle/fn_vehStoreItem.sqf b/Altis_Life.Altis/core/vehicle/fn_vehStoreItem.sqf index 93a77f875..5a11359e5 100644 --- a/Altis_Life.Altis/core/vehicle/fn_vehStoreItem.sqf +++ b/Altis_Life.Altis/core/vehicle/fn_vehStoreItem.sqf @@ -14,7 +14,7 @@ if ((life_trunk_vehicle getVariable ["trunk_in_use_by",player]) != player) exitW _ctrl = ctrlSelData(3503); _num = ctrlText 3506; -if (!([_num] call TON_fnc_isnumber)) exitWith {hint localize "STR_MISC_WrongNumFormat";}; +if (!([_num] call life_util_fnc_isNumber)) exitWith {hint localize "STR_MISC_WrongNumFormat";}; _num = parseNumber(_num); if (_num < 1) exitWith {hint localize "STR_MISC_Under1";}; @@ -27,7 +27,7 @@ _inv = _veh_data select 0; if (_ctrl == "goldbar" && {!(life_trunk_vehicle isKindOf "LandVehicle")}) exitWith {hint localize "STR_NOTF_canOnlyStoreInLandVeh";}; if (_ctrl == "money") then { - _index = [_ctrl,_inv] call TON_fnc_index; + _index = [_ctrl,_inv] call life_util_fnc_index; if (CASH < _num) exitWith {hint localize "STR_NOTF_notEnoughCashToStoreInVeh";}; if (_index isEqualTo -1) then { _inv pushBack [_ctrl,_num]; @@ -44,7 +44,7 @@ if (_ctrl == "money") then { if (((_totalWeight select 1) + _itemWeight) > (_totalWeight select 0)) exitWith {hint localize "STR_NOTF_VehicleFullOrInsufCap";}; if (!([false,_ctrl,_num] call life_fnc_handleInv)) exitWith {hint localize "STR_CouldNotRemoveItemsToPutInVeh";}; - _index = [_ctrl,_inv] call TON_fnc_index; + _index = [_ctrl,_inv] call life_util_fnc_index; if (_index isEqualTo -1) then { _inv pushBack [_ctrl,_num]; } else { diff --git a/Altis_Life.Altis/core/vehicle/fn_vehTakeItem.sqf b/Altis_Life.Altis/core/vehicle/fn_vehTakeItem.sqf index 6c0fb418d..4c0fb3f1c 100644 --- a/Altis_Life.Altis/core/vehicle/fn_vehTakeItem.sqf +++ b/Altis_Life.Altis/core/vehicle/fn_vehTakeItem.sqf @@ -17,11 +17,11 @@ if ((life_trunk_vehicle getVariable ["trunk_in_use_by",player]) != player) exitW if ((lbCurSel 3502) isEqualTo -1) exitWith {hint localize "STR_Global_NoSelection";}; _ctrl = ctrlSelData(3502); _num = ctrlText 3505; -if (!([_num] call TON_fnc_isnumber)) exitWith {hint localize "STR_MISC_WrongNumFormat";}; +if (!([_num] call life_util_fnc_isNumber)) exitWith {hint localize "STR_MISC_WrongNumFormat";}; _num = parseNumber(_num); if (_num < 1) exitWith {hint localize "STR_MISC_Under1";}; -_index = [_ctrl,((life_trunk_vehicle getVariable "Trunk") select 0)] call TON_fnc_index; +_index = [_ctrl,((life_trunk_vehicle getVariable "Trunk") select 0)] call life_util_fnc_index; _data = (life_trunk_vehicle getVariable "Trunk") select 0; _old = life_trunk_vehicle getVariable "Trunk"; if (_index isEqualTo -1) exitWith {}; diff --git a/Altis_Life.Altis/dialog/cell_phone.hpp b/Altis_Life.Altis/dialog/cell_phone.hpp index f761b3082..6c238b398 100644 --- a/Altis_Life.Altis/dialog/cell_phone.hpp +++ b/Altis_Life.Altis/dialog/cell_phone.hpp @@ -60,7 +60,7 @@ class Life_cell_phone { idc = 3015; text = "$STR_CELL_TextMSGBtn"; colorBackground[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])", 0.5}; - onButtonClick = "[] call TON_fnc_cell_textmsg"; + onButtonClick = "[_this, 'player'] call life_fnc_sendMessage"; x = 0.11; y = 0.35; w = 0.2; @@ -79,7 +79,7 @@ class Life_cell_phone { idc = 3016; text = "$STR_CELL_TextPolice"; colorBackground[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])", 0.5}; - onButtonClick = "[] call TON_fnc_cell_textcop"; + onButtonClick = "[_this, 'cop'] call life_fnc_sendMessage"; x = 0.32; y = 0.35; w = 0.2; @@ -90,7 +90,7 @@ class Life_cell_phone { idc = 3017; text = "$STR_CELL_TextAdmins"; colorBackground[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])", 0.5}; - onButtonClick = "[] call TON_fnc_cell_textadmin"; + onButtonClick = "[_this, 'admin'] call life_fnc_sendMessage"; x = 0.53; y = 0.35; w = 0.2; @@ -101,7 +101,7 @@ class Life_cell_phone { idc = 3020; text = "$STR_CELL_AdminMsg"; colorBackground[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])", 0.5}; - onButtonClick = "[] call TON_fnc_cell_adminmsg"; + onButtonClick = "[_this, 'adminToPlayer'] call life_fnc_sendMessage"; x = 0.32; y = 0.4; w = 0.2; @@ -112,7 +112,7 @@ class Life_cell_phone { idc = 3021; text = "$STR_CELL_AdminMSGAll"; colorBackground[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])", 0.5}; - onButtonClick = "[] call TON_fnc_cell_adminmsgall"; + onButtonClick = "[_this, 'adminAll'] call life_fnc_sendMessage"; x = 0.53; y = 0.4; w = 0.2; @@ -123,7 +123,7 @@ class Life_cell_phone { idc = 3022; text = "$STR_CELL_EMSRequest"; colorBackground[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])", "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])", "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])", 0.5}; - onButtonClick = "[] call TON_fnc_cell_emsrequest"; + onButtonClick = "[_this, 'med'] call life_fnc_sendMessage"; x = 0.11; y = 0.45; w = 0.2; @@ -140,4 +140,4 @@ class Life_cell_phone { h = (1 / 25); }; }; -}; \ No newline at end of file +}; diff --git a/Altis_Life.Altis/dialog/function/fn_bankDeposit.sqf b/Altis_Life.Altis/dialog/function/fn_bankDeposit.sqf index ee09479ee..e8f584aac 100644 --- a/Altis_Life.Altis/dialog/function/fn_bankDeposit.sqf +++ b/Altis_Life.Altis/dialog/function/fn_bankDeposit.sqf @@ -12,7 +12,7 @@ _value = parseNumber(ctrlText 2702); //Series of stupid checks if (_value > 999999) exitWith {hint localize "STR_ATM_GreaterThan";}; if (_value < 0) exitWith {}; -if (!([str(_value)] call TON_fnc_isnumber)) exitWith {hint localize "STR_ATM_notnumeric"}; +if (!([str(_value)] call life_util_fnc_isNumber)) exitWith {hint localize "STR_ATM_notnumeric"}; if (_value > CASH) exitWith {hint localize "STR_ATM_NotEnoughCash"}; CASH = CASH - _value; diff --git a/Altis_Life.Altis/dialog/function/fn_bankTransfer.sqf b/Altis_Life.Altis/dialog/function/fn_bankTransfer.sqf index ceed20547..1b3bdfd6c 100644 --- a/Altis_Life.Altis/dialog/function/fn_bankTransfer.sqf +++ b/Altis_Life.Altis/dialog/function/fn_bankTransfer.sqf @@ -14,7 +14,7 @@ if ((lbCurSel 2703) isEqualTo -1) exitWith {hint localize "STR_ATM_NoneSelected" if (isNil "_unit") exitWith {hint localize "STR_ATM_DoesntExist"}; if (_value > 999999) exitWith {hint localize "STR_ATM_TransferMax";}; if (_value < 0) exitWith {}; -if (!([str(_value)] call TON_fnc_isnumber)) exitWith {hint localize "STR_ATM_notnumeric"}; +if (!([str(_value)] call life_util_fnc_isNumber)) exitWith {hint localize "STR_ATM_notnumeric"}; if (_value > BANK) exitWith {hint localize "STR_ATM_NotEnoughFunds"}; _tax = _value * LIFE_SETTINGS(getNumber,"bank_transferTax"); if ((_value + _tax) > BANK) exitWith {hint format [localize "STR_ATM_SentMoneyFail",_value,_tax]}; diff --git a/Altis_Life.Altis/dialog/function/fn_bankWithdraw.sqf b/Altis_Life.Altis/dialog/function/fn_bankWithdraw.sqf index a49cf4201..cf653d2c0 100644 --- a/Altis_Life.Altis/dialog/function/fn_bankWithdraw.sqf +++ b/Altis_Life.Altis/dialog/function/fn_bankWithdraw.sqf @@ -10,7 +10,7 @@ private ["_value"]; _value = parseNumber(ctrlText 2702); if (_value > 999999) exitWith {hint localize "STR_ATM_WithdrawMax";}; if (_value < 0) exitWith {}; -if (!([str(_value)] call TON_fnc_isnumber)) exitWith {hint localize "STR_ATM_notnumeric"}; +if (!([str(_value)] call life_util_fnc_isNumber)) exitWith {hint localize "STR_ATM_notnumeric"}; if (_value > BANK) exitWith {hint localize "STR_ATM_NotEnoughFunds"}; if (_value < 100 && BANK > 20000000) exitWith {hint localize "STR_ATM_WithdrawMin"}; //Temp fix for something. diff --git a/Altis_Life.Altis/dialog/function/fn_safeStore.sqf b/Altis_Life.Altis/dialog/function/fn_safeStore.sqf index b94035c54..df2709c99 100644 --- a/Altis_Life.Altis/dialog/function/fn_safeStore.sqf +++ b/Altis_Life.Altis/dialog/function/fn_safeStore.sqf @@ -12,7 +12,7 @@ _ctrl = CONTROL_DATA(3503); _num = ctrlText 3506; //Error checks -if (!([_num] call TON_fnc_isnumber)) exitWith {hint localize "STR_MISC_WrongNumFormat";}; +if (!([_num] call life_util_fnc_isNumber)) exitWith {hint localize "STR_MISC_WrongNumFormat";}; _num = parseNumber(_num); if (_num < 1) exitWith {hint localize "STR_Cop_VaultUnder1";}; if (!(_ctrl isEqualTo "goldBar")) exitWith {hint localize "STR_Cop_OnlyGold"}; diff --git a/Altis_Life.Altis/dialog/function/fn_safeTake.sqf b/Altis_Life.Altis/dialog/function/fn_safeTake.sqf index 6b1596160..fe6b3c0dd 100644 --- a/Altis_Life.Altis/dialog/function/fn_safeTake.sqf +++ b/Altis_Life.Altis/dialog/function/fn_safeTake.sqf @@ -15,7 +15,7 @@ _num = ctrlText 3505; _safeInfo = life_safeObj getVariable ["safe",0]; //Error checks -if (!([_num] call TON_fnc_isnumber)) exitWith {hint localize "STR_MISC_WrongNumFormat";}; +if (!([_num] call life_util_fnc_isNumber)) exitWith {hint localize "STR_MISC_WrongNumFormat";}; _num = parseNumber(_num); if (_num < 1) exitWith {hint localize "STR_Cop_VaultUnder1";}; if (!(_ctrl isEqualTo "goldBar")) exitWith {hint localize "STR_Cop_OnlyGold"}; diff --git a/Altis_Life.Altis/dialog/function/fn_sellGarage.sqf b/Altis_Life.Altis/dialog/function/fn_sellGarage.sqf index f291d1192..c078be048 100644 --- a/Altis_Life.Altis/dialog/function/fn_sellGarage.sqf +++ b/Altis_Life.Altis/dialog/function/fn_sellGarage.sqf @@ -46,6 +46,16 @@ _sellPrice = _purchasePrice * _multiplier; if (!(_sellPrice isEqualType 0) || _sellPrice < 1) then {_sellPrice = 500;}; +closeDialog 0; +private _action = [ + format[localize "STR_Garage_SellWarn", getText(configFile >> "CfgVehicles" >> _vehicle >> "displayName"), [_sellPrice] call life_fnc_numberText], + localize "STR_Garage_SellWarnTitle", + localize "STR_Global_Yes", + localize "STR_Global_No" +] call BIS_fnc_guiMessage; + +if !(_action) exitWith {}; + if (life_HC_isActive) then { [_vid,_pid,_sellPrice,player,life_garage_type] remoteExecCall ["HC_fnc_vehicleDelete",HC_Life]; } else { @@ -66,4 +76,4 @@ if (LIFE_SETTINGS(getNumber,"player_advancedLog") isEqualTo 1) then { }; life_action_delay = time; -closeDialog 0; \ No newline at end of file +closeDialog 0; diff --git a/Altis_Life.Altis/dialog/function/fn_spawnConfirm.sqf b/Altis_Life.Altis/dialog/function/fn_spawnConfirm.sqf index 9f6dc95d7..603f50fcb 100644 --- a/Altis_Life.Altis/dialog/function/fn_spawnConfirm.sqf +++ b/Altis_Life.Altis/dialog/function/fn_spawnConfirm.sqf @@ -17,7 +17,7 @@ if (life_spawn_point isEqualTo []) then { if (isNil {(call compile format ["%1",_sp select 0])}) then { player setPos (getMarkerPos (_sp select 0)); } else { - _spawnPos = (call compile format ["%1",_sp select 0]) call BIS_fnc_selectRandom; + _spawnPos = selectRandom (call compile format ["%1",_sp select 0]); _spawnPos = _spawnPos buildingPos 0; player setPos _spawnPos; }; @@ -39,13 +39,13 @@ if (life_spawn_point isEqualTo []) then { }; {_bPos = _bPos - [(_house buildingPos _x)];} forEach (_house getVariable ["slots",[]]); - _pos = _bPos call BIS_fnc_selectRandom; + _pos = selectRandom _bPos; player setPosATL _pos; } else { player setPos (getMarkerPos (life_spawn_point select 0)); }; } else { - _spawnPos = (call compile format ["%1", life_spawn_point select 0]) call BIS_fnc_selectRandom; + _spawnPos = selectRandom (call compile format ["%1", life_spawn_point select 0]); _spawnPos = _spawnPos buildingPos 0; player setPos _spawnPos; }; @@ -60,4 +60,3 @@ if (life_firstSpawn) then { [] call life_fnc_welcomeNotification; }; [] call life_fnc_playerSkins; -[] call life_fnc_hudSetup; diff --git a/Altis_Life.Altis/dialog/function/fn_useGangBank.sqf b/Altis_Life.Altis/dialog/function/fn_useGangBank.sqf index eace99c7b..cdcac3051 100644 --- a/Altis_Life.Altis/dialog/function/fn_useGangBank.sqf +++ b/Altis_Life.Altis/dialog/function/fn_useGangBank.sqf @@ -18,7 +18,7 @@ if ((time - life_action_delay) < 0.5) exitWith {hint localize "STR_NOTF_ActionDe if (isNil {(group player) getVariable "gang_name"}) exitWith {hint localize "STR_ATM_NotInGang"}; // Checks if player isn't in a gang if (_value > 999999) exitWith {hint localize "STR_ATM_WithdrawMax";}; if (_value < 1) exitWith {}; -if (!([str(_value)] call TON_fnc_isnumber)) exitWith {hint localize "STR_ATM_notnumeric"}; +if (!([str(_value)] call life_util_fnc_isNumber)) exitWith {hint localize "STR_ATM_notnumeric"}; if (_deposit && _value > CASH) exitWith {hint localize "STR_ATM_NotEnoughCash"}; if (!_deposit && _value > _gFund) exitWith {hint localize "STR_ATM_NotEnoughFundsG"}; diff --git a/Altis_Life.Altis/dialog/impound.hpp b/Altis_Life.Altis/dialog/impound.hpp index 6fcc8691a..fd58e4beb 100644 --- a/Altis_Life.Altis/dialog/impound.hpp +++ b/Altis_Life.Altis/dialog/impound.hpp @@ -76,7 +76,7 @@ class Life_impound_menu { class SellCar: Life_RscButtonMenu { idc = -1; text = "$STR_Global_Sell"; - onButtonClick = "[] call life_fnc_sellGarage; closeDialog 0;"; + onButtonClick = "closeDialog 0; [] spawn life_fnc_sellGarage;"; x = 0.26 + (6.25 / 40) + (1 / 250 / (safezoneW / safezoneH)); y = 0.9 - (1 / 25); w = (6.25 / 40); @@ -126,4 +126,4 @@ class Life_impound_menu { h = (1 / 15); }; }; -}; \ No newline at end of file +}; diff --git a/Altis_Life.Altis/icons/ico_mail.paa b/Altis_Life.Altis/icons/ico_mail.paa deleted file mode 100644 index 7ff088d75..000000000 Binary files a/Altis_Life.Altis/icons/ico_mail.paa and /dev/null differ diff --git a/Altis_Life.Altis/icons/ico_map.paa b/Altis_Life.Altis/icons/ico_map.paa deleted file mode 100644 index 159af9cc1..000000000 Binary files a/Altis_Life.Altis/icons/ico_map.paa and /dev/null differ diff --git a/Altis_Life.Altis/icons/ico_settings.paa b/Altis_Life.Altis/icons/ico_settings.paa deleted file mode 100644 index 28769cfcd..000000000 Binary files a/Altis_Life.Altis/icons/ico_settings.paa and /dev/null differ diff --git a/Altis_Life.Altis/icons/ico_speech.paa b/Altis_Life.Altis/icons/ico_speech.paa deleted file mode 100644 index 7a42d86be..000000000 Binary files a/Altis_Life.Altis/icons/ico_speech.paa and /dev/null differ diff --git a/Altis_Life.Altis/stringtable.xml b/Altis_Life.Altis/stringtable.xml index e5795e5b1..ece51c246 100644 --- a/Altis_Life.Altis/stringtable.xml +++ b/Altis_Life.Altis/stringtable.xml @@ -1,13394 +1,13478 @@ - - - - - Setting up client, please wait... - - Configurando cliente. Por favor espere... - - Einrichten des Clients, bitte warten... - Caricamento dati, attendi... - Configuration du client. Patientez s'il vous plait... - Configurando o cliente. Por favor, aguarde... - - 配置客户端,请稍等... - - - Waiting for the server to be ready... - - Esperando a que el servidor esté listo... - - Warten, bis der Server bereit ist... - Caricamento Server, attendi... - En attente du chargement du serveur... - Esperando o servidor estar pronto... - - 等待服务器准备就绪... - - - extDB failed to load, please contact an administrator. - - extDB no se pudo cargar, por favor contacte a un administrador. - - extDB konnte nicht geladen werden, wenden Sie sich bitte an einen Administrator. - C'è stato un'errore con extDB, perfavore contatta un amministratore. - extDB ne s'est pas lancé correctement. Veuillez contacter un administrateur. - O extDB falhou ao carregar, por favor, contacte um administrador. - - 数据加载失败,请联系管理员。 - - - Finishing client setup procedure... - - Finalizando configuración del cliente... - - Finalisation de la procédure de configuration du client... - Fertigstellen der Client-Einrichtungs-Prozedur... - Completando procedura d'inizializzazione - Terminando o processo de configuração do cliente... - - 完成客户端设置程序... - - - - - Bruce's Outback Outfits - Bruceovy Outback Oblečení - Vêtements de Bruce - Tienda de Ropa - - Loja de Roupas - Sklep odzieżowy - Emporio di Bruce - Bruce's Outback Outfits - 服装商店 - - - Altis Police Department Shop - Altis policejní oddělení Shop - Vêtements policiers - Tienda del Departamento de Policía - - Loja de Roupas Policiais - Sklep Policyjny - Dipartimento della Polizia di Altis - Altis Polizei Department Geschäft - 警局商店 - - - Mohammed's Jihadi Shop - Mohamedův džihád Shop - Vêtements rebelle - Tienda Jihadi de Mohamed - Negozio della Jihad di Mohammed - - Loja de Roupas Rebeldes - Sklep samobójców AKBAR - Mohammed's Ausrüstungen - 叛军商店 - - - Steve's Diving Shop - Steve je potápění obchod - Vêtements de plongée de Steve - Tienda de Buceo - Negozio Sub di Steve - - Steve's Taucherausrüstung - Loja de equipamentos para Mergulho - Sklep dla nurków - 潜水商店 - - - Billy Joe's Clothing - Billy Joe oblečení - Tienda de Ropa de Billy Joe - - Billy Joe's Bekleidung - Emporio di Billy - Vêtements de tir - Loja de Roupa do Billy Joe - Billy Joe Odzież - 服装商店 - - - Billy Joe's Firearms - Billy Joe Střelné zbraně - Tienda de Armas de Billy Joe - - Billy Joe's Schusswaffen - Armeria di Billy Joe - Armurerie de Billy Joe - Loja de Armas do Billy Joe - Broń palna Billy Joe - 武器商店 - - - Bobby's Kart-Racing Outfits - Billy Joe Střelné zbraně - Vêtements de kart - Tienda de Trajes de Carreras - Vestiario da Pilota - - Bobby's Gokart Rennbekleidung - Loja de equipamentos para Kart - Sklep Kartingowy - 卡丁车赛车服 - - - Altis Market - Altis Market - Mercado de Altis - - Altis Markt - Mercato - Marché d'Altis - Mercado - Market Altis - 市场 - - - Rebel Market - Rebel Market - Mercado Rebelde - - Rebellen Markt - Mercato Ribelle - Marché Rebelle - Mercado Rebelde - Market Rebeliantów - 叛军市场 - - - Gang Market - gang Market - Mercado Pandillero - - Gang Markt - Mercato Gang - Marché de Gang - Mercado da Gangue - Market Gangu - 帮派市场 - - - Gang Clothing - gang Oblečení - Ropa Pandillera - - Gang Kleidung - Gang Abbigliamento - Vêtements de Gang - Roupa Gangue - Gang Odzież - 帮派服装 - - - Wong's Food Cart - Wongova Food košík - Kiosko de Wong - - Wong's Spezialitäten - Alimentari - Restaurant de Wong - Praça de Alimentação - Przysmaki Wonga - 食品商 - - - Gyro's Coffee - gyros Coffee - Cafetería de Gyro - - Gyro's Café - Caffè - Café de Gyro - Café do Gyro - Kawiarnia - 咖啡店 - - - Tonic's Narcotics - Tonic je narkotika - Narcotraficante - - Drogendealer - Spacciatore - Dealeur de Drogue - Traficante - Sprzedawca 'Trawy' - 非法药品贸易商 - - - Oil Trader - olej Trader - Comerciante de Petroleo - - Ölhändler - Vendita Petrolio - Acheteur de Pétrole - Comprador de Petróleo - Skup Ropy - 石油贸易商 - - - Local Fish Market - Místní Fish Market - Mercado Local del Pescado - - Fischmarkt - Pescivendolo - Marché de Poissons - Mercado de Peixes - Sklep Rybny - 海产品市场 - - - Glass Trader - sklo Trader - Comerciante de Vidrio - - Glashändler - Vendita Vetro - Acheteur de Verre - Comprador de Vidro - Skup Szkła - 玻璃贸易商 - - - Altis Industrial Trader - Altis Industrial Trader - Comerciante Industrial - - Altis Industriehandel - Vendita materiali industriali - Acheteur de minerais - Comprador de Material Indústrial - Skup materiałów przemysłowych - 铁/铜贸易 - - - APD Item Shop - APD Item Shop - Equipamiento Policial - - APD Ausrüstung - Negozio Polizia - Equipement policier - Equipamentos da Polícia - Zbrojownia Policji - 警察物品店 - - - Juan's Cement Laying - Juanovo Cement Pokládka - Fabrica de Cemento de Juan - - Juan's Zementleger - Vendita Cemento - Acheteur de Ciment - Comprador de Cimento - Wytwórnia cementu - 水泥贸易商 - - - Cash 4 Gold - Peněžní 4 Gold - Comprador de Oro - - Goldhändler - Vendita Oro - Acheteur d'Or - Comprador de Ouro - Skup złota - 黄金贸易商 - - - Diamond Dealer - Diamond Dealer - Comerciante de Diamantes - - Juwelier - Gioielleria - Acheteur de Diamant - Comprador de Diamante - Skup Diamentów - 钻石贸易商 - - - Salt Trader - sůl Trader - Comerciante de Sal - - Salzhändler - Vendita Sale - Acheteur de Sel - Comprador de Sal - Skup soli - 食盐贸易商 - - - Fuel Station Coffee - Palivo Coffee Station - Café de la Station service - Cafeteria de Gasolinera - Stazione di Servizio - - Tankstellen Café - Loja de Conveniência - Caffe OLLEN - 加油站咖啡店 - - - - - Close - Zavřít - Cerrar - - Schließen - Fermer - Chiudi - Fechar - Zamknij - 关闭 - - - Sell - Prodat - Vender - - Verkaufen - Vendre - Vendi - Vender - Sprzedaj - 出售 - - - Buy - Koupit - Comprar - - Kaufen - Acheter - Compra - Comprar - Kup - 购买 - - - Magazines - časopisy - Chargeurs - Cargadores - Caricatori - Magazyny - - Munições - Magazine - 弹药 - - - Accessories - Příslušenství - Accessoires - Accesorios - Accessori - Akcesoria - - Acessórios - Zubehör - 附件 - - - Weapons - Zbraně - Armes - Armas - Armi - Broń - - Armas - Bewaffnung - 武器 - - - Give - Dát - Dar - - Geben - Donner - Dai - Dar - Daj - 给予 - - - Use - Použití - Usar - - Benutzen - Utiliser - Usa - Usar - Użyj - 使用 - - - Remove - Odstranit - Remover - - Entfernen - Supprimer - Rimuovi - Remover - Usuń - 删除 - - - Settings - Nastavení - Configuración - - Einstellungen - Paramètres - Impostazioni - Configurar - Opcje - 设置 - - - Rent - Nájemné - Rentar - - Mieten - Louer - Affitta - Alugar - Wynajmij - 租赁 - - - Retrieve - získat - Recuperar - - Ausparken - Récupérer - Ritira - Recuperar - Odzyskaj - 取回 - - - You did not select anything. - Nevybrali jste nic. - No seleccionastes algo. - - Du hast nichts ausgewählt. - Vous n'avez rien sélectionné. - Non hai selezionato nulla. - Você não selecionou nada. - Niczego nie zaznaczyłeś. - 你没有选择任何东西。 - - - Yes - Ano - Si - - Ja - Oui - Si - Sim - Tak - - - - No - Ne - No - - Nein - Non - No - Não - Nie - - - - Cancel - Zrušit - Cancelar - - Abbrechen - Annuler - Annulla - Cancelar - Anuluj - 取消 - - - - - Admin Menu - Nabídka admin - Menu de Admin - - Admin Menü - Menu Admin - Menu Admin - Menu Admin - Admin Menu - 管理菜单 - - - Put the amount you want to compensate: - Vložte částku, kterou chcete kompenzovat: - Entrez le montant à rembourser - Pon la cantidad que quieres compensar: - Inserire l'importo da rimborsare: - - Trage den Wert für die Entschädigung ein: - Coloque a quantidade que você quer compensar: - Wprowadź wartość rekompensaty - 输入赔偿金额: - - - Get ID - Získat ID - Ver ID - - ID abfragen - Obtenir ID - Vedi ID - Obter ID - ID gracza - 获取 ID - - - Spectate - spectate - Observar - Osserva - - Zuschauen - Regarder - Observar - Obserwuj - 观看 - - - Teleport - Teleport - Teleport - Teleport - - Teleport - Téléporter - Teleportar - Teleport - 传送 - - - TP Here - TP Zde - TP Aquí - TP Qui - - TP Hier - TP Ici - TP Aqui - Do Mnie - 传送到这儿 - - - You cannot teleport the player here because they are inside of a vehicle. - Nelze teleportovat přehrávač zde proto, že jsou uvnitř vozidla. - Vous ne pouvez pas TP le joueur ici, car il est actuellement dans un véhicule. - No puedes teletransportar a este jugador aquí, porque está dentro de un vehículo. - Il giocatore non può essere teletrasportato perché in un veicolo. - Nie można teleportować gracza tutaj, ponieważ są one wewnątrz pojazdu. - Você não pode se teletransportar o jogador aqui, porque ele esta dentro de um veículo. - Вы не можете телепортировать игрока здесь, потому что они находятся внутри автомобиля. - Du kannst den Spieler nicht hierher teleportieren, weil dieser im Inneren eines Fahrzeugs sitzt. - 你不能将玩家传送到这里,因为他们在车内。 - - - Debug - Ladit - Debug - Debug - - Debug - Debug - Depuração - Debug - 清除BUG - - - Comp - Comp - Comp - Comp - - Entschädigen - Compenser - Compensar - Comp - 赔偿金 - - - GodMode - Božský mód - Modo Dios - GodMode - - Gott-Mod - God - Modo Deus - GodMode - 上帝模式 - - - Freeze - Zmrazit - Congelar - Congelare - - Einfrieren - Freeze - Congelar - Zamroź - 冻结 - - - Markers - markery - Marcadores - Indicatori - - Spieler Markierungen - Marqueurs - Marcações - Markery - 标记 - - - - - Querying... - Dotazování ... - Buscando... - - Abfrage läuft... - Interrogation... - Ricerca... - Pesquisando... - Wyszukuję... - 查询... - - - Searching Database for vehicles... - Vyhledávání databáze pro vozidla ... - Buscando Vehiculo en la Base de Datos - - Durchsuche Garage nach Fahrzeugen... - Recherche des véhicules dans le garage... - Ricerca di veicoli nel Database... - Buscando por veículo na base de dados... - Szukam pojazdu w bazie danych... - 从数据库中搜索载具... - - - You are already querying a player. - Již jste dotazování přehrávač. - Ya estan buscando a un jugador. - - Du fragst bereits einen Spieler ab. - Vous êtes déjà en train d'interroger ce joueur. - Stai già ispezionando un giocatore. - Você já está buscando por um jogador. - Przeszukujesz gracza - 你已经在查询玩家了。 - - - Player no longer exists? - Hráč neexistuje? - El jugador ya no existe? - - Spieler existiert nicht mehr? - Le joueur ne semble pas exister. - Il giocatore non esiste più - Jogador não existe mais? - Gracz już nie istnieje? - 玩家不存在? - - - You are about to give yourself $%1 to compensate to another player <br/><br/>You must give this cash to the person you are compensating manually. - Chystáte se dát si $%1 kompenzovat jinému hráči <br/><br/> Musíte dát tuto hotovost na osoby, které jsou kompenzačním ručně. - Estas a punto de darte $%1 para compensar a otro jugador<br/><br/> Debes darle el dinero a la persona manualmente. - Stai per donarti €%1 per rimborsare un altro giocatore <br/><br/> Dovrai donare il denaro manualmente. - - Du bist dabei dir selbst $%1 zu geben, um einen anderen Spieler zu entschädigen.<br/><br/>Gib das Geld dann an den Spieler weiter. - Vous êtes sur le point de vous donner $%1 pour rembourser un autre joueur <br/><br/> Merci de le lui donner manuellement. - Você está prestes a dar para você mesmo R$%1 para compensar outro jogador <br/><br/>Você deve dar este dinheiro para a pessoa que você está compensando manualmente. - Właśnie przydzieliłeś sobie $%1 w celu rekompensaty graczowi <br/><br/>Musisz przekazać te środki osobiście osobie poszkodowanej. - 你将获得赔偿金 $%1,小心别输入错误了 <br/><br/>你只能手动操作把这笔钱给玩家。 - - - You have added $%1 to your account. - Přidali jste $%1 se ke svému účtu. - Has agregado $%1 a tu cuenta. - €%1 ti sono stati accreditati. - - Dir wurden $%1 auf deinem Bankkonto gutgeschrieben. - Vous avez ajouté $%1 à votre compte - Você adicionou R$%1 em sua conta. - Przekazałeś na konto $%1 - 你已将 $%1 添加到你的账户上 。 - - - You can not go above $999,999 - Nemůžete jít nad $ 999999 - No te puedes dar más de $999,999 - Non puoi superare i €999.999 - - Maximaler Wert $999,999! - Vous ne pouvez pas aller au-dessus $999,999 ! - Você não pode ir além de $999,999! - Nie można obracać kwotami wyższymi niż $999,999! - 你不能处理超过 $999,999 的资金 - - - Please type in the amount to compensate. - Prosím, zadejte částku, která má kompenzovat. - Por favor pon la cantidad a compensar. - Si prega di inserire l'importo da rimborsare. - - Bitte Entschädigungsbetrag eingeben. - S'il vous plaît entrez le montant pour compenser. - Por favor, insira a quantidade para compensar. - Wprowadź kwotę rekompensaty - 请输入赔偿金额。 - - - You have disabled %1's input. - Jste zakázali vstup %1 je. - Has deshabilitado los controles de %1 - Hai disattivato l'input di %1. - - Du hast %1 eingefroren. Er kann sich nicht mehr bewegen. - Vous avez désactivé les contrôles de %1. - Você desabilitou as entradas de %1. - Zablokowałeś grę gracza $%1 - 您被禁止 %1 秒输入。 - - - You have enabled %1's input. - Jste povolili vstup %1 je. - Has habilitado los controles de %1 - Hai riabilitato l'input di %1. - - Du hast %1 wieder aufgetaut. - Vous avez activé les contrôles de %1. - Você habilitou as entradas de %1. - Odblokowałeś grę gracza $%1 - 你被允许 %1 秒输入。 - - - You can't do that dumbass. - Můžete to udělat blbec. - No puedes hacer eso, pendejo - Impossibile. - - Das geht gerade nicht. - Vous ne pouvez pas le faire sur vous-même. - Você não pode fazer isso, idiota. - Tak nie można! - 你不可以这样做。 - - - Your Admin Level is not high enough. - Váš správce úroveň není dostatečně vysoká. - No tienes suficiente nivel de Admin. - Il tuo livello amministratore non soddisfa i requisiti. - - Dein Admin Level ist nicht hoch genug. - Votre niveau admin n'est pas suffisamment élevé. - Seu nível de Admin não é alto o bastante. - Nie masz wystarczających uprawnień, za niski poziom administracyjny - 您的管理等级不够高。 - - - Player Markers Disabled. - Hráč Markers pro invalidy. - Marqueurs désactivés - Marcadores de Jugadores Deshabilitados - Indicatori Giocatori Disabilitati. - - Spieler Markierungen deaktiviert. - Marcações dos jogadores desabilitada. - Markery 'OFF' graczy Wyłączone - 禁用玩家标记。 - - - Player Markers Enabled. - Hráč Markers Povoleno. - Marqueurs activés - Marcadores de Jugadores habilitados. - Indicatori Giocatori Abilitati. - - Spieler Markierungen aktiviert. - Marcações dos jogadores habilitada. - Markery 'ON' graczy Włączone - 启用玩家标记。 - - - God mode enabled - nesmrtelnost povolen - Mode Dieu activé - Modo Dios habilitado - Godmode abilitata - God mode włączony - Modo Deus ativado - Режим бога включен - Gott-Modus aktiviert. - 启用上帝模式 - - - God mode disabled - nesmrtelnost zakázán - Mode Dieu désactivé - Modo Dios deshabilitado - Godmode disabilitata - God mode wyłączony - Modo Deus desativado - Режим бога отключен - Gott-Modus deaktiviert. - 禁用上帝模式 - - - Action Cancelled - akce byla zrušena - Acción Cancelada - - Aktion abgebrochen. - Action annulée - Azione Annullata - Ação Cancelada - Anulowano akcję - 操作取消 - - - Commander/Tactical View Disabled - Commander/Tactical View Disabled - Commander/Tactical View Disabled - Commander/Tactical View Disabled - Commander/Vue tactique désactivée - Befehlshaber-Übersicht deaktiviert. - Commander/Tactical View Disabled - Commander/Tactical View Disabled - Commander/Tactical View Disabled - 指挥官/战术视图被禁用 - - - Hit spacebar to place the container. - Hit mezerníku na místo Kontejner. - Appuyez sur espace pour placer le conteneur. - Aprieta la barra de espacio para colocar el Contenedor. - Premi barra spaziatrice per posizionare il contenitore. - Hit spacji, aby umieścić pojemnik. - Pressione a barra de espaço para colocar. - Хит пробел, чтобы поместить контейнер. - Drücke die Leertaste, um den Container zu platzieren. - 按空格键放置物品。 - - - Placement of container has been aborted. - Placement of container has been aborted. - Placement of container has been aborted. - Placement of container has been aborted. - Placement of container has been aborted. - Placement of container has been aborted. - Placement of container has been aborted. - Placement of container has been aborted. - Die Platzierung des Containers wurde abgebrochen. - 物品放置已被中止. - - - Your faction is not allowed to chop vehicles! - Váš frakce není povoleno sekat vozidla! - Votre faction ne peut pas vendre les véhicules ! - Tu facción no tiene permitido usar esta tienda! - La tua fazione non può rubare veicoli! - Twoja frakcja nie może posiekać pojazdy! - - Sua facção não têm direito de usar essa loja - Deiner Fraktion ist es nicht erlaubt, Fahrzeuge bei dem Schrotthändler zu verkaufen! - 你的帮派不允许出售这载具! - - - A pickaxe is required - Je vyžadován krumpáč - Requieres un pico - - Hier benötigst du eine Spitzhacke! - Vous avez besoin d'une pioche. - Devi possedere un piccone! - A picareta é necessária - Wymagana jest kilof - 你需要一把镐 - - - You are restrained - Ty jsou omezeny - Estas retenido - - Wie willst du mit gefesselten Händen sammeln? - Vous êtes menotté. - Sei stato ammanettato - Você está algemado - Ty skrępowaniem - 你被限制 - - - You can't do this while you surrender - Můžete to udělat, když se vzdáš - No puedes hacer esto mientras te estas rindiendo - - Mit erhobenen Händen kannst du nichts sammeln! - Vous ne pouvez pas faire cela tant que vous avez les mains sur la tête. - Non puoi effettuare questa azione mentre tieni le mani in alto - Você não pode fazer isso enquanto você se entrega - Nie można tego zrobić, gdy się poddasz - 你投降时不能这么做 - - - You can't gather this resource with this vehicle! - Nemůžete shromáždit tento prostředek s tímto vozidlem! - No puedes recolectar este recurso con este vehiculo! - - Du kannst diese Ressource nicht mit diesem Fahrzeug abbauen! - Vous ne pouvez pas récolter cette ressource avec ce véhicule. - Non puoi raccogliere questa risorsa con questo veicolo ! - Voce não pode colher este recurso com este veiculo! - You can't gather this resource with this vehicle! - 你不能用这载具收集这个资源! - - - You have no business using this. - Nemáš podnikání pomocí tohoto. - Vous n'avez pas le niveau pour utiliser la console. - No tienes permiso de usar esto. - Non hai il permesso di farlo. - Nie masz działalność z wykorzystaniem tego produktu. - Você não tem nenhum negócio usando isto. - У вас нет бизнеса с помощью этого. - Du hast hier nichts verloren! - 您无权这样做。 - - - Admin %1 has opened the debug console. - Admin %1 otevřel ladění konzoli. - Administrateur %1 a ouvert la console de debug. - Administrador %1 ha abierto la consola de depuración. - Admin %1 ha aperto la console di debug. - Administrator %1 otworzył konsoli debugowania. - Administrador %1 abriu o console de depuração. - Администратор %1 открыл консоль отладки. - Admin %1 hat die Debug-Konsole geöffnet. - 管理员 %1 已打开调试控制台。 - - - You cannot drop keys to a vehicle which is locked and you are inside of. - You cannot drop keys to a vehicle which is locked and you are inside of. - You cannot drop keys to a vehicle which is locked and you are inside of. - You cannot drop keys to a vehicle which is locked and you are inside of. - You cannot drop keys to a vehicle which is locked and you are inside of. - You cannot drop keys to a vehicle which is locked and you are inside of. - You cannot drop keys to a vehicle which is locked and you are inside of. - You cannot drop keys to a vehicle which is locked and you are inside of. - Du kannst den Schlüssel nicht wegschmeißen, weil das Auto verschlossen ist und du drin sitzt. - 你不能把钥匙掉在一辆锁着的车里,你就在车里面。 - - - Emergency lights are not set for this vehicle. - Emergency lights are not set for this vehicle. - Emergency lights are not set for this vehicle. - Emergency lights are not set for this vehicle. - Emergency lights are not set for this vehicle. - Emergency lights are not set for this vehicle. - Emergency lights are not set for this vehicle. - Emergency lights are not set for this vehicle. - Emergency lights are not set for this vehicle. - 此车辆没有设置应急灯。 - - - - - Bank Account Management - Vedení bankovního účtu - Cuenta Bancaria - - Bankkonto verwalten - Gestion du Compte Bancaire - Gestione Bancaria - Conta Bancária - Bankomat Altis - 银行账户管理 - - - Withdraw - ustoupit - Retirar - - Abheben - Retirer - Preleva - Sacar - Wypłać - 取款 - - - Deposit - Vklad - Depositar - - Einzahlen - Déposer - Deposita - Depositar - Deopozyt - 存款 - - - Withdraw: Gang - Odstoupit: Gang - Retirer: Gang - Retirar: Pandilla - - Sacar: gangue - Ritira: Gang - Wycofaj: Gang - Abheben: Gang - 取款:帮派 - - - Deposit: Gang - Záloha: Gang - Déposer: Gang - Depositar: Pandilla - - Depositar: Gangue - Deposita: Gang - Depozyt: Gang - Einzahlen: Gang - 存款: 帮派 - - - Transfer - Převod - Transferir - - Überweisen - Transférer - Trasferisci - Transferir - Przelew - 转账 - - - You can't deposit more then $999,999 at a time - Nemůžete vložit více než 999.999 $ najednou - No puedes depositar mas de $999,999 a la vez - - Du kannst nicht mehr als $999,999 gleichzeitig einzahlen. - Vous ne pouvez pas déposer plus de $999,999. - Non puoi depositare più di €999,999 alla volta - Você não pode transferir mais de R$999.999 em uma transação - Możesz jednorazowo zdeponować nie więcej niż $999,999 - 您一次不能存入超过 $999,999 - - - The amount entered isn't a numeric value. - Uvedená částka není číselná hodnota. - No escribistes un valor numérico. - - Die eingegebene Zahl ist keine richtige Zahl. - La valeur entrée n'est pas un nombre. - Il valore inserito non è numerico. - O valor digitado não é um número. - Wprwadzona wartość nie jest liczbą - 输入的金额不是数值。 - - - You need to select someone to transfer to - Je třeba vybrat někoho převést na - Debes seleccionar a quien transferirle el dinero - - Du hast niemanden für die Überweisung ausgewählt. - Sélectionnez une personne pour le transfert. - Devi selezionare qualcuno a cui trasferire l'importo - Você tem que selecionar para quem deseja transferir - Musisz wybrać odbiorcę przelewu - 您需要选择某人来转账 - - - The player selected doesn't seem to exist? - Hráč vybraný Nezdá se, že neexistuje? - Le joueur sélectionné ne semble pas exister - El jugador que seleccionastes no existe? - - Der Spieler scheint nicht zu existieren? - Sembra che il giocatore selezionato non esista - O jogador selecionado parece não existir! - Wybrany gracz wydaje się nie występować w grze - 选定的玩家似乎不存在? - - - You can't transfer more then $999,999 - Nemůžete přenést více než 999.999 $ - No puedes transferir más de $999,999 - - Du kannst nicht mehr als $999,999 überweisen! - Vous ne pouvez pas transférer plus de $999,999. - Non puoi trasferire più di €999.000 alla volta - Você pode trasferir no máximo R$999.999. - Możesz jednorazowo przelać nie więcej niż $999,999 - 你转账不能超过 $999,999 - - - You don't have that much in your bank account! - Nemusíte to hodně na váš bankovní účet! - No tienes tanto dinero en tu cuenta de banco! - - Du hast nicht so viel Geld auf deinem Bankkonto! - Vous n'avez pas autant dans votre compte en banque ! - Non hai fondi sufficienti nel tuo conto in banca! - Você não tem todo esse dinhero na sua conta bancária - Nie masz tyle środków na koncie! - 你的银行账户里没有那么多钱! - - - You don't have that much in your gang bank account! - Nemusíte to hodně ve svém gang bankovní účet! - No hay tanto dinero en la cuenta de tu pandilla! - Il conto della gang non ha abbastanza denaro! - Nie ma tego dużo na koncie bankowym gang! - - Vous n'avez pas autant sur le compte de votre gang ! - Você não tem todo esse dinhero na sua gangue! - Ihr habt nicht genügend Geld auf dem Gangkonto! - 你的帮派银行账户里没有那么多钱! - - - You do not have enough money in your bank account, to transfer $%1 you will need $%2 as a tax fee. - Nemáte dostatek peněz na váš bankovní účet, převést $%1 budete potřebovat $%2 jako daňový poplatek. - No tienes el dinero suficiente, para transferir $%1 necesitaras $%2 para pagar como cuota. - - Du hast nicht genug Geld auf deinem Bankkonto, es kostet $%2 um $%1 zu überweisen. - Vous n'avez pas assez d'argent dans votre compte bancaire, pour transférer $%1 vous devez payer $%2 de taxes. - Non hai fondi sufficienti nel tuo conto in banca, per trasferire €%1 necessiti di €%2 per pagare la tassa di trasferimento. - Você não tem dinheiro suficiente na sua conta bancária. Para trasferir R$%1 você irá pagar R$%2 de taxa - Nie masz wystarczająco dużo środków na końcie, do przelewu $%1 będziesz potrzebował jeszcze $%2 na opłatę - 你的银行账户里没有足够的钱, 要转账 $%1 你需要支付 $%2 作为手续费. - - - You have transfered $%1 to %2.\n\nA tax fee of $%3 was taken for the wire transfer. - Jste přenesli $%1 do %2. \n\nA daňový poplatek ve výši $%3 byla pořízena na bankovním převodem. - Has transferido $%1 a $%2 \n\nUna cuota de $%3 fue tomada de tu cuenta. - - Du hast $%1 an %2 überwiesen.\n\nEine Gebühr von $%3 wurde verrechnet. - Vous avez transféré $%1 à %2.\n\nA Une taxe de $%3 vous a été prélevée pendant le transfert. - Hai trasferito €%1 a %2.\n\nSono stati trattenuti €%3 di tassa per il trasferimento. - Você trasferiu R$%1 para %2.\n\nA taxa de trasferência foi de: R$%3. - Przelałeś $%1 do %2.\n\nA opłata $%3 pobrana przez WIRE TRANSFER - 你已转账 $%1 给 %2。\n\n手续费 $%3 已从你的账户扣除。 - - - %1 has wire transferred $%2 to you. - - %1 ha transferido $%2 a tu cuenta. - - %1 hat dir $%2 überwiesen. - %1 vous a fait un virement de $%2. - %1 ha effettuato un bonifico sul tuo conto di €%2 - %1 transferiu $%2 para a tua conta. - - %1 通过电汇将 $%2 转账给你。 - - - You can't withdraw more then $999,999 - Nemůžete zrušit více než 999.999 $ - No puedes retirar más de $999,999 - - Du kannst nicht mehr als $999,999 abheben. - Vous ne pouvez pas retirer plus de $999,999. - Non puoi prelevare più di €999.000 in una volta - Você pode sacar no máximo R$999.999 - Możesz jednorazowo pobrać maks $999,999 - 你不能取款大于 $999,999 - - - You can't withdraw less then $100 - Nemůžete odvolat méně než 100 $ - No puedes retirar menos de $100 - - Du kannst nicht weniger als $100 abheben. - Vous ne pouvez pas retirer moins de $100. - Non puoi prelevare meno di €100 - Você não pode sacar menos de $100. - Nie możesz pobrać mniej niż $100 - 你不能取款小于 $100 - - - You have withdrawn $%1 from your bank account - Jste staženy $%1 z vašeho bankovního účtu - Has retirado $%1 de tu cuenta bancaria - - Du hast $%1 von deinem Bankkonto abgehoben. - Vous avez retiré $%1 de votre compte en banque. - Hai prelevato €%1 dal tuo conto in banca - Você sacou R$%1 de sua conta bancária. - Pobrałeś z konta kwotę $%1 - 你已从你的银行账户取走 $%1 - - - You have withdrawn $%1 from your gang. - Jste staženy $%1 z naší bandy - Has retirado $%1 de tu pandilla - Hai ritirato €%1 dal nostro gruppo. - Masz %1 $ wycofane z naszego gangu. - - Vous avez retiré $%1 de votre gang. - Você sacou R$%1 da sua gangue - Du hast $%1 vom Gangkonto abgehoben. - 你已从你的帮派账户取走 $%1 . - - - Someone is already trying to withdraw from your gang. - Někdo se již snaží ustoupit od svého gangu. - Quelqu'un est déjà en train de retirer de l'argent de votre gang. - Alguien ya esta tratando de retirar dinero de tu pandilla. - Qualcuno sta già cercando di ritirare del denaro dal fondo gang. - Ktoś już próbował wycofać się ze swojego gangu. - - Alguém já está tentando sacar da sua gangue. - Jemand versucht bereits, Geld vom Gangkonto abzuheben. - 有人从你的帮派账户中取款. - - - You do not have that much cash on you. - Nemáte tolik peněz na vás. - No tienes tanto dinero contigo. - - Du hast nicht so viel Geld bei dir. - Vous n'avez pas autant d'argent sur vous. - Non hai abbastanza denaro con te. - Você não tem todo esse dinheiro. - Nie masz przy sobie tyle pieniędzy - 你身上没有那么多现金. - - - You have deposited $%1 into your bank account - Máte uloženy $%1 na váš bankovní účet - Has depositado $%1 en tu cuenta de banco. - - Du hast $%1 auf dein Bankkonto überwiesen. - Vous avez déposé $%1 dans votre compte en banque. - Hai despositato €%1 nel tuo conto bancario - Você depositou R$%1 na sua conta bancária - Zdeponowałeś na koncie bankowym $%1 - 你已将 $%1 存入到你的银行账户 - - - You have deposited $%1 into your gang's bank account. - Máte uloženy $%1 na bankovní účet svého gangu. - Has depositado $%1 en la cuenta de tu pandilla. - - Du hast $%1 auf das Gangkonto überwiesen. - Vous avez déposé $%1 sur le compte en banque de votre gang. - Hai despositato €%1 nei fondi della tua gang. - Você depositou R$%1 na conta da sua gangue. - Zdeponowałeś na koncie gangu kwotę $%1. - 你已将 $%1 存入到你的帮派账户. - - - Someone is already trying to deposit into your gang's bank account. - Někdo se již snaží vložit na bankovní účet svého gangu. - Quelqu'un est déjà en train de déposer dans le compte bancaire de votre gang. - Alguien ya esta tratando de depositar en la cuenta de banco de tu pandilla. - Qualcuno sta già cercando di depositare del denaro nel conto della Gang. - Ktoś jest już stara się o wpłatę na rachunek bankowy swojego gangu. - - Alguém já está tentando depositar na conta da sua gangue. - Jemand versucht bereits Geld auf das Gangkonto einzuzahlen. - 有人存款到你的帮派银行账户. - - - You are not in a Gang! - Nejste v gangu! - Vous n'êtes pas dans une bande! - ¡No estás en una pandilla! - Non sei in un Gang! - Nie jesteś w gangu! - Você não está em uma gangue! - Du bist nicht in einer Gang! - 你没有在帮派里! - - - - - Altis Mobile - Altis Mobile - Celular - - Altis Mobilfunk - Altis Mobile - Cellulare Altis - Celular - Telefon - 手机 - - - Message To Send: - Zpráv pro odeslání: - Mensaje a Enviar: - - Deine Nachricht: - SMS à Envoyer : - Messaggio da inviare: - Mensagem à enviar: - Treść wiadomości - 发送信息: - - - Text Message: - Textová zpráva: - Mensaje: - - Nachricht: - Message Texte : - Msg Giocatore: - Mensagem: - Do: Gracz - 发短信: - - - Text Police - Text Police - Msg Policía - - An die Polizei - Police - Msg Polizia - Polícia - Do: Policja - 发短信给警察 - - - Text Admins - textové Administrátoři - Msg Admin - - An die Admins - Requête Admin - Msg Admin - Msg Admins - Do: Admin - 发短信给管理 - - - Admin Message - admin Message - Msg de Admin - - Admin-Nachricht - Message Admin - Admin Msg - Admin Msg - AdmGracz - 管理员信息 - - - Admin Msg All - Admin zpráva Vše - Admin Msg All - - Admin-Nachricht an alle - Admin MSG ALL - Admin Msg - Admin Msg All - SMS do Wszyscy - 管理员全服信息 - - - Request EMS - žádost o EMS - Pedir Médico - - An die Sanitäter - SAMU - Msg medici - Chamar SAMU - MEDYK - 发短信给医疗 - - - - - You must enter a message to send! - You must enter a message to send! - You must enter a message to send! - You must enter a message to send! - Du musst eine Nachricht eingeben! - Vous devez entrer un message à envoyer! - You must enter a message to send! - You must enter a message to send! - You must enter a message to send! - 您必须输入要发送的消息! - - - Your message cannot exceed 400 characters! - Your message cannot exceed 400 characters! - Your message cannot exceed 400 characters! - Your message cannot exceed 400 characters! - Deine Nachricht darf maximal 400 Zeichen enthalten!! - Votre message ne peut pas excéder 400 caractères ! - Your message cannot exceed 400 characters! - Your message cannot exceed 400 characters! - Your message cannot exceed 400 characters! - 您的信息不能超过400个字符! - - - You must select a player you are sending the text to! - You must select a player you are sending the text to! - You must select a player you are sending the text to! - You must select a player you are sending the text to! - Du musst einen Spieler auswählen! - Vous devez sélectionner un joueur à qui envoyer le message ! - You must select a player you are sending the text to! - You must select a player you are sending the text to! - You must select a player you are sending the text to! - 当你发送信息时必须选择一个玩家! - - - You have sent a message to all EMS Units. - You have sent a message to all EMS Units. - You have sent a message to all EMS Units. - You have sent a message to all EMS Units. - Du hast eine Nachricht an alle Sanitäter gesendet. - Vous avez envoyé un message à tous les EMS. - You have sent a message to all EMS Units. - You have sent a message to all EMS Units. - You have sent a message to all EMS Units. - 你已经向所有医护人员发送了消息. - - - You sent %1 a message: %2 - You sent %1 a message: %2 - You sent %1 a message: %2 - You sent %1 a message: %2 - Du sendest %1 eine Nachricht: %2 - Vous avez envoyé à %1 le message : %2 - You sent %1 a message: %2 - You sent %1 a message: %2 - You sent %1 a message: %2 - 你向 %1 发送了信息: %2 - - - You are not an admin! - You are not an admin! - You are not an admin! - You are not an admin! - Du bist kein Admin! - Vous n'êtes pas un admin ! - You are not an admin! - You are not an admin! - You are not an admin! - 你不是管理员! - - - Admin Message Sent To: %1 - Message: %2 - Admin Message Sent To: %1 - Message: %2 - Admin Message Sent To: %1 - Message: %2 - Admin Message Sent To: %1 - Message: %2 - Admin Nachricht Gesendet an: %1 - Nachricht: %2 - Message admin envoyé à %1 - Message : %2 - Admin Message Sent To: %1 - Message: %2 - Admin Message Sent To: %1 - Message: %2 - Admin Message Sent To: %1 - Message: %2 - 管理员消息发送给: %1 - 信息: %2 - - - Admin Message Sent To All: %1 - Admin Message Sent To All: %1 - Admin Message Sent To All: %1 - Admin Message Sent To All: %1 - Admin Nachricht Gesendet an Alle: %1 - Message admin envoyé à tous les joueurs : %1 - Admin Message Sent To All: %1 - Admin Message Sent To All: %1 - Admin Message Sent To All: %1 - 管理员发送信息到全体: %1 - - - - - Local Chop Shop - Místní Chop Shop - Desguazadero - - Schrotthändler - Revendeur de véhicules volés - Ricettatore - Desmanche - Dziupla - 销赃盗窃的载具 - - - - - Gang Management - gang Vedení - Administración de Pandilla - - Gangübersicht - Gestion du Gang - Gestione Gang - Gerenciar Gangue - Gang Menu - 帮派管理 - - - Gang Management - Current Gangs - Gang Management - Současné Gangs - Administracion de Pandilla - Pandillas Actuales - - Gangübersicht - Aktuelle Gangs - Gestion de Gangs - Liste des Gangs Actuels - Gestione Gang - Gang Attuali - Gerenciar Gangue - Gangue atual - Gang - zarządzaj - 帮派管理-当前帮派 - - - Join - Připojit - Unirse - - Beitreten - Rejoindre - Unisciti - Entrar - Dołącz - 加入 - - - Leave - Dovolená - Salir - - Verlassen - Quitter - Abbandona - Sair - Opuść - 退出 - - - Upgrade Slots - upgradem Slots - Aumentar Slots - - Anzahl erhöhen - Augmenter Slots - Aumenta Posti - Aumentar o número de Slots - Powiększ gang - 升级人数 - - - Kick - Kop - Expulsar - - Kicken - Virer - Espelli - Expulsar - Wykop - 踢出 - - - Set Leader - Set Leader - Hacer Líder - - Neuer Anführer - Passer Chef - Imposta Capo - Passar Liderança - Ustaw lidera - 设置管理者 - - - To create a gang it costs $%1 - Chcete-li vytvořit gang stojí $%1 - Cuesta $%1 para crear una pandilla - - Le prix de création d'un gang est de %1$ - Eine Gang zu erstellen kostet $%1. - Creare una gang costa $%1 - Criar uma Gangue custa R$%1 - Koszt ustanowienia gangu to $%1 - 创建一个帮派的成本 $%1 - - - Create - Vytvořit - Crear - - Erstellen - Créer - Crea - Criar - Stwórz - 创建 - - - Your Gang Name - Váš Gang Jméno - Nombre de tu Pandilla - - Dein Gangname - Nom du Gang - Nome della tua Gang - Nome da Gangue - Nazwa gangu - 输入你要创建的帮派名字 - - - Invite Player - Pozvat Player - Invitar Jugador - - Spieler einladen - Inviter joueur - Invita Giocatore - Convidar Jogador - Zaproś - 邀请玩家 - - - Disband Gang - rozpustit Gang - Deshacer Pandilla - - Gang auflösen - Dissoudre Gang - Sciogli Gang - Desfazer Gangue - Opuść gang - 解散帮派 - - - Gang Invitation - gang Pozvánka - Invitación de Pandilla - - Gangeinladung - Invitation de Gang - Invito Gang - Convite para Gangue - Zaproszenie do gangu - 帮派邀请 - - - Transfer Gang Leadership - Přeneste Gang Vedení - Transferir Liderazgo de Pandilla - - Gangführung übertragen - Transfert du chef du Gang - Trasferisci Comando - Transferir Liderança - Przekaż kierowanie gangiem - 移交帮派管理 - - - Upgrade Maximum Allowed Gang Members - Inovovat Maximální povolená Gang Členové - Aumentar Cantidad Máxima de Miembros de la Pandilla - - Maximale Anzahl an Mitgliedern erhöhen - Augmentation du nombre de membre total - Aumenta numero massimo membri della Gang - Atualizar limite máximo de membros - Zwiększ maksymalną liczbę członków gangu - 升级帮派成员人数 - - - - - You must create a gang first before capturing it! - You must create a gang first before capturing it! - Debes crear una pandilla antes de capturar este escondite! - - Du musst erst in einer Gang sein, um das Versteck einnehmen zu können! - Vous devez créer un gang avant de le capturer ! - Devi creare una gang prima di catturarla! - Você precisa criar uma gangue antes de tentar capturar! - Przed przechwyceniem musisz stworzyć gang - 您必须先创建一个帮派然后才能建立帮派据点! - - - Your gang already has control over this hideout! - Naše parta už má kontrolu nad tímto úkrytu! - Tu Pandilla ya tiene control de este escondite! - - Deine Gang hat bereits die Kontrolle über dieses Versteck! - Votre gang a déjà le contrôle de cette planque ! - La tua Gang ha già il controllo di questo Covo - Sua gangue já tem controle sobre esse esconderijo! - Twój gang aktualnie kontroluje tę kryjówkę ! - 你的帮派已经控制了这个帮派据点! - - - Only one person shall capture at once! - Pouze jedna osoba musí být schopná zachytit najednou! - Solo una persona puede capturar a la vez! - - Nur eine Person kann das Versteck einnehmen! - Une seule personne à la fois peut capturer la cachette ! - Può conquistare solo una persona alla volta! - Somente uma pessoa pode capturar! - Przejmowanie powinna przeprowadzić na raz tylko jedna osoba - 每次只能抓捕帮派据点的一个人! - - - This hideout is controlled by %1.<br/><br/>Are you sure you want to take over their gang area? - Tento úkryt je řízen %1.<br/><br/>Opravdu chcete převzít svůj gang prostor? - Este escondite esta controlado por %1.<br/><br/>Estas seguro que quieres tomarlo? - - Das Versteck wird durch %1 kontrolliert.<br/><br/>Bist du sicher, dass du ihr Ganggebiet übernehmen möchtest? - Cette planque est contrôlée par %1.<br/><br/>Etes-vous sûr que vous voulez prendre leur cachette ? - Questo Covo è controllato da %1.<br/><br/>Sicuro di voler prendere il controllo della loro area? - Esse esconderijo é controlado por %1.<br/><br/>Você tem certeza que deseja tomar essa área? - Ta kryjówka jest kontrolowana przez %1.<br/><br/>Jesteś pewny że chcesz przjąć ten rejon. - 帮派据点由 %1 控制.<br/><br/>你确定要接管他们的帮派吗? - - - Hideout is currently under control... - Hideout is currently under control... - Escondite bajo control... - - Versteck ist derzeit unter Kontrolle... - La planque est actuellement sous contrôle... - Il Covo è già sotto controllo... - Esconderijo sobre controle.... - Kryjówka pod kontrolą ... - 帮派据点正在控制... - - - Capturing cancelled - zachycení zrušen - Toma de Control Cancelada - - Einnehmen abgebrochen. - Capture annulée - Cattura annullata - Ação concelada - Przejmowanie anulowane - 帮派据点控制取消 - - - Capturing Hideout - zachycení Hideout - Capturando el Escondite - - Versteck einnehmen - Capture de la planque - Catturando il Covo - Capturando Esconderijo - Przejmowanie kryjówki - 控制的帮派据点 - - - Hideout has been captured. - Úkryt byl zajat. - La cachette a été capturée. - Escondite ha sido capturado. - Hideout è stato catturato. - Hideout został schwytany. - Hideout foi capturado. - Хайдеаут был захвачен в плен. - Versteck wurde eingenommen. - 帮派据点已被控制。 - - - %1 and his gang: %2 - have taken control of a local hideout! - %1 a jeho gang: %2 - vzali kontrolu místního úkrytu! - %1 y su pandilla: %2 - han tomado control de un Escondite! - - %1 und seine Gang: %2 - haben die Kontrolle über ein lokales Versteck übernommen! - %1 et son gang: %2 ont pris le contrôle d'une cachette ! - %1 e la sua Gang: %2 - hanno preso il controllo di un Covo! - %1 e sua gangue: %2 - agora têm o controle de um esconderijo! - %1 i jego gang: %2 - przejął kontrolę nad kryjówką! - %1 和他的帮派: %2 - 已经控制了一个帮派据点! - - - You can't have a gang name longer then 32 characters. - Nemůžete mít název gang delší než 32 znaků. - El nombre de tu Pandilla no puede tener mas de 32 caracteres. - - Dein Gangname kann nicht länger als 32 Zeichen sein. - Vous ne pouvez pas avoir un nom de gang de plus de 32 caractères. - %1 e la sua Gang: %2 - hanno preso il controllo di un Covo! - O nome de sua gangue não pode ter mais de 32 caracteres. - Nazwa gangu może posiadać maksymalnie 32 znaki - 你的帮派名称超过32个字符。 - - - You have invalid characters in your gang name. It can only consist of Numbers and letters with an underscore - Máte neplatné znaky v názvu vaší gangu. To se může skládat pouze z číslic a písmen s podtržítkem - El nombre de tu pandilla solo puede consistir de: "Numeros, Letras y guion bajo" - - Du hast ein ungültiges Zeichen in deinem Gangnamen. Der Name darf nur aus Zahlen und Buchstaben sowie einem Unterstrich bestehen! - Vous avez des caractères non valides dans le nom de votre gang. Il ne peut être constitué que de chiffres et de lettres. - Hai inserito caratteri non validi nel nome della Gang. Puoi inserire solo numeri e lettere con un underscore - O nome da sua gangue tem caracteres inválidos. O nome so pode conter caracteres e números separados por underline - Masz nieprawidłowe znaki w nazwie gangu - tylko litery i cyfry oraz podkreślnik - 你的帮派名称中有无效字符,它只能由下划线、数字和字母组成 - - - You do not have enough money in your bank account.\n\nYou lack: $%1 - Nemáte dostatek peněz na váš bankovní účet \ ne vy balení:. $%1 - No tienes suficiente dinero en tu cuenta.\n\nTe falta: $%1 - - Du hast nicht genug Geld auf deinem Bankkonto.\n\nDir fehlen: $%1 - Vous n'avez pas assez d'argent dans votre compte en banque.\n\nIl vous manque: $%1 - Non hai abbastanza fondi nel tuo conto in banca.\n\nTi mancano: $%1 - Você não tem dinheiro suficiente na sua conta bancária.\n\nFaltam: R$%1 - Nie masz tyle pieniędzy na koncie.\n\nYou brakuje: $%1 - 你的银行账户里没有足够的钱.\n\n你缺少: $%1 - - - You have created the gang %1 for $%2 - Vytvořili jste gangu %1 pro $%2 - Has creado la Pandilla %1 por $%2 - - Du hast die Gang: %1 für $%2 erstellt. - Vous avez créé le gang %1 pour $%2. - Hai creato la Gang %1 al costo di $%2 - Você criou a gangue %1 por R$%2 - Stworzyłeś gang %1 za $%2 - 你创造帮派 %1 花费了 $%2 - - - You are about to disband the gang, by disbanding the gang it will be removed from the database and the group will be dropped. <br/><br/>Are you sure you want to disband the group? You will not be refunded the price for creating it. - Chystáte se rozpustit gang, tím, že rozpustí gang bude odstraněna z databáze a skupina bude vynechána. < br / > < br / > Opravdu chcete rozpustit skupinu? Budete nevrací cenu za jeho vytvoření. - Estas a punto de desmantelar la Pandilla, si prosiges la Pandilla se borrara de la base de datos. <br/><br/>Estas seguro de querer desmantelarla? Cualquier dinero invertido no sera devuelto. - - Du bist dabei die Gang aufzulösen. Durch Auflösung der Gang wird diese aus der Datenbank entfernt. <br/><br/>Bist du sicher, dass du die Gang auflösen willst? Du erhältst die Kosten für die Erstellung nicht zurück. - Vous vous apprêtez à dissoudre le gang. En démantelant le gang, il sera supprimé de la base de données et le groupe sera supprimé. <br/><br/>Etes-vous sûr de vouloir dissoudre le groupe? Vous ne serez pas remboursé du prix de sa création. - Stai per sciogliere la Gang, facendolo sarà rimossa dal Database e il gruppo verrà cancellato. <br/><br/>Sei sicuro di voler sciogliere il gruppo? Non verrai rimborsato dei fondi spesi per crearlo. - Você vai desfazer a sua gangue, ela será apagada do banco de dados. <br/><br/>Você tem certeza que quer desfazer a gangue? Você não será reembolsado. - Chcesz rozwiązać gang, po jego rozwiązaniu zostanie on usunięty z bazy danych i cała grupa zostanie rozwiązana. <br/><br/>Naprawdę chcesz rozwiązać grupę? Nie dostaniesz zwrotu środków za przeznaczonych na stworzenie gangu. - 你要解散帮派,帮派将从数据库中删除. <br/><br/>你确定你想解散帮派? 不会退还你创建帮派的花费. - - - Disbanding the gang... - Rozpuštění gang ... - Desmantelando la Pandilla... - - Gang wird aufgelöst... - Démantèlement du gang... - Sciogliendo la Gang... - Desfazendo a gangue... - Rozwiąż gang - 解散帮派... - - - Disbanding cancelled - rozpuštění zrušen - Desmantelamiento Cancelado - - Auflösung abgebrochen. - Démantèlement annulé - Scioglimento annullato - Desfazer gangue cancelado - Rozwiązywanie gangu anulowane - 解散取消 - - - The leader has disbanded the gang. - Vůdce se rozpustil gang. - El lider ha desmantelado la Pandilla. - - Der Anführer hat die Gang aufgelöst. - Le chef a démantelé le gang. - Il Capo ha sciolto la Gang - O lider desfez a gangue. - Szef rozwiązał gang - 老大解散了帮派。 - - - %1 has invited you to a gang called %2<br/>If you accept the invitation you will be a part of their gang and will have access to the gang funds and controlled gang hideouts. - %1 vás pozval na party s názvem %2<br/>Pokud přijmete pozvání budete součástí jejich gangu a budou mít přístup ke gangu fondů a řízených gangů úkrytů. - %1 te ha invitado a una Pandilla llamada %2<br/>Si aceptas seras parte de su pandilla, compartiras el banco de la pandilla y controlaras sus escondites. - - %1 hat dich zu der Gang: %2 eingeladen. <br/> Wenn Du die Einladung annimmst, wirst du ein Teil der Gang und bekommst Zugang zu dem Gangkonto und kontrollierten Verstecken. - %1 vous a invité dans un gang appelé %2<br/>Si vous acceptez l'invitation, vous serez dans leur gang et aurez accès à des fonds de gangs et des planques de gangs contrôlées. - %1 ti ha invitato nella Gang: %2<br/>Se vuoi accettarai l'invito entrerai a far parte della loro Gang ed avrai accesso ai loro fondi e ai loro Covi. - %1 convidou você para a gangue %2<br/>Se você aceitar terá acesso aos recursos da gangue e os esconderijos controlados pela mesma. - %1 zaprosił cię do gangu o nazwie %2<br/>Jeżeli zaakceptujesz zaproszenie będziesz członkiem gangu i uzyskasz dostęp do funduszy gangu oraz jego kryjówek - %1 邀请你加入一个叫做 %2 的帮派<br/>如果你接受了这个邀请,你将成为他们的帮派成员,并且可以获得帮派资金和使用帮派控制的帮派据点。 - - - You are about to invite %1 to your gang, if they accept the invite they will have access to the gang's funds. - Chystáte se pozvat%1 na svůj gang, pokud přijmou pozvání budou mít přístup k finančním prostředkům gangu. - Estas a putno de invitar a %1 a tu pandilla, si aceptan tendran aceso al banco de tu Pandilla. - - Du bist dabei %1 in deine Gang einzuladen. Wenn die Einladung angenommen wird, hat der Spieler Zugang zu den Gangbesitztümern. - Vous êtes sur le point d'inviter %1 dans votre gang, s'il accepte l'invitation, il aura accès aux fonds du gang. - Stai per invitare %1 nella tua Gang, se accetterà l'invito avrà accesso ai fondi della Gang. - Você está prestes a convidar %1 para a gangue, ele terá acesso aos recursos da gangue. - Właśnie zaprosiłeś %1 do gangu, jeśli zaakceptuje zaproszenie będzie miał dostęp do funduszy gangu. - 您将邀请 %1 加入您的帮派,如果他接受邀请,他将有权使用帮派的资金。 - - - You need to select a person to invite! - Musíte vybrat osobu vyzvat! - Tiense que selecionar a quien invitar! - - Du musst einen Spieler zum Einladen auswählen! - Vous devez sélectionner une personne à inviter ! - Devi selezionare una persona da invitare! - Você tem que selecionar um jogador para convidar! - Musisz zaznaczyć osobę aby ją zaprosić - 你需要选择一个人来邀请他! - - - You have sent a invite to your gang to %1 - Jste adresoval zvou na svůj gang do %1 - Has invitado a %1 a tu Pandilla - - Du hast eine Einladung in diese Gang an %1 gesendet. - Vous avez envoyé une invitation à rejoindre votre gang à %1 - Hai mandato l'invito alla tua Gang a %1 - Você enviou um convite para %1 se juntar a sua gangue - Wysłałeś zaproszenie do twojego gangu do %1 - 你已经给 %1 发送了一个加入你帮派的邀请 - - - Invitation Cancelled - Pozvánka byla zrušena - Invitación Cancelada - - Einladung abgebrochen. - Invitation annulée - Invito Annullato - Convite Cancelado - Zaproszenie anulowane - 取消邀请 - - - You cannot kick yourself! - Nemůžete kopat sami! - No te puedes expulsar a ti mismo! - - Du kannst dich nicht selbst kicken! - Vous ne pouvez pas vous éjecter vous-même ! - Non puoi espellerti da solo! - Você não pode kickar você mesmo! - Nie możesz sam się wykopać! - 你不能踢出自己! - - - Your gang has reached its maximum allowed slots, please upgrade your gangs slot limit. - Váš gang dosáhla svého maxima dovoleno sloty, proveďte upgrade hranice slotu vašeho gangu. - Tu Pandilla ha llegado a su máxima capacidad, aumenta los slots para seguir invitando. - - Deine Gang hat die maximale Anzahl an Mitgliedern erreicht, bitte erhöhe das Limit deiner Gang. - Votre gang a atteint le nombre de membre maximum, veuillez augmenter cette limite. - la tua Gang ha raggiungo il numero massimo di posti consentiti, aumentane il limite. - Sua gangue está lotada, você deve aumentar o número máximo de jogadores. - Twój gang osiągnął maksymalną pojemność, powiększ swój gang! - 你的帮派成员数已经达到了允许的最大范围, 请升级你的帮派成员数. - - - You need to select a person to kick! - Musíte vybrat osobu kopat! - Tienes que seleccionar a quien expulsar! - - Du musst einen Spieler auswählen, um ihn kicken zu können! - Vous devez choisir une personne à virer ! - Devi selezionare una persona da espellere! - Você tem que selecionar um jogador para kickar! - Musisz zaznaczyć osobę do wykopania - 你需要选择一个人来踢出! - - - You cannot leave the gang without appointing a new leader first! - Nemůžete opustit gang, aniž by o jmenování nového vůdce první! - No puedes salir de la Pandilla sin apuntar a un nuevo líder! - - Du kannst die Gang nicht verlassen, ohne vorher einen neuen Anführer zu ernennen! - Vous ne pouvez pas quitter le gang sans passer le lead à quelqu'un ! - Non puoi abbandonare la Gang prima di aver selezionato un nuovo Capo! - Você não pode sair da gangue sem transferir a liderança antes! - Nie możesz opuścić gangu bez przekazania komuś szefostwa nad gangiem - 没有任命新的老大,你不能离开这个帮派! - - - You have quit the gang. - You have quit the gang. - You have quit the gang. - You have quit the gang. - Du hast die Gang verlassen. - Vous avez quitté le gang. - You have quit the gang. - You have quit the gang. - You have quit the gang. - 你已经退出了帮派. - - - You are about to transfer leadership over to %1 <br/>By transferring leadership you will no longer be in control of the gang unless ownership is transferred back. - Chystáte se přenést vedoucí přes %1 <br/>Převedením vedení už nebude mít kontrolu nad gangu, pokud je vlastnictví převedeno zpět. - Estas a punto de transferir liderazgo a %1 <br/>Al transferir liderazgo no tendrás control de la Pandilla. - - Du bist dabei, die Gangführung an %1 zu übertragen<br/>Durch die Übertragung der Gangführung hast du keine Kontrolle mehr über die Gang. - Vous allez transférer le commandement à %1 <br/>En transférant le commandement, vous ne serez plus le chef du gang. - Stai per traferire il comando a %1 <br/>Facendolo non avrai più il controllo della Gang fino a quando non ti verrà restituito il comando. - Você vai transferir a liderança da gangue para %1 <br/>Você não será mais o lider, a não ser que a liderança seja transferida novamente. - Przekazałeś kierowanie gangiem %1 <br/>W związku z tym nie będzesz od tej chwili kontroli nad gangiem chyba, że kierowownictwo zostanie ci powierzone ponownie. - 你将要把老大的位置移交给 %1 <br/>老大的位置移交后,你将不能再控制这个帮派,除非有人将帮派老大位置还给你. - - - Transfer of leadership cancelled. - Převod vedení zrušen. - Transferencia de liderazgo cancelada. - - Übertragung der Gangführung abgebrochen. - Transfert du commandement annulé. - Trasferimento del comando annullato. - Transferencia de liderança cancelada. - Przkazanie kierownictwa anulowane. - 取消帮派老大的移交。 - - - You are already the leader! - Již jste vůdce! - Tu ya eres el líder! - - Du bist bereits der Anführer! - Vous êtes déjà chef ! - Sei già il Capo! - Você já está na liderança! - Jesteś już liderem! - 你已经是帮派老大了! - - - You need to select a person first! - Je třeba vybrat prvního člověka! - Tienes que seleccionar a alguien primero! - - Du musst erst einen Spieler auswählen! - Vous devez choisir une personne ! - Devi selezionare una persona! - Você tem que selecionar um jogador antes! - Musisz najpierw zaznaczyć osobę! - 你需要先选一个人! - - - You have been made the new leader. - You have been made the new leader. - You have been made the new leader. - You have been made the new leader. - Du wurdest zum neuen Anführer ernannt. - Vous êtes le nouveau leader. - You have been made the new leader. - You have been made the new leader. - You have been made the new leader. - 你被选为新的帮派老大. - - - You are about to upgrade the maximum members allowed for your gang. - Chystáte se aktualizovat maximální povolené členy pro svůj gang. - Estas a punto de aumentar la capacidad de tu Pandilla. - - Du bist dabei, die maximale Anzahl an Mitgliedern zu erhöhen. - Vous êtes sur le point de mettre à niveau la limite de membre maximum pour votre gang. - Stai aumentando il numero massimo di membri consentiti all'interno della tua Gang - Você vai atualizar o limite de membros da gangue. - Chcesz zwiększyć maksymalną ilość członków w gangu. - 您将升级您的帮派所允许的最大成员数. - - - Current Max: %1 - Proud Max: %1 - Límite Corriente: %1 - - Aktuelles Maximum: %1 - Max actuel: %1 - Attuali Max: %1 - Número máximo atual: %1 - Aktualnie Max: %1 - 目前的最大值: %1 - - - Upgraded Max: %2 - Modernizované Max: %2 - Nuevo Límite: %2 - - Maximum erhöhen: %2 - Après mise à niveau : %2 - Aumento Max: %2 - Novo número máximo: %2 - Po ulepszeniu Max: %2 - 升级最大值: %2 - - - Price: - Cena: - Precio: - - Preis: - Prix : - Costo: - Preço: - Koszt: - 价钱: - - - You do not have enough money in your bank account to upgrade the gangs maximum member limit. - Nemáte dostatek peněz na modernizaci gangů maximální limit člena svého bankovního účtu. - No tienes suficiente dinero como para mejorar la capacidad de tu pandilla. - - Du hast nicht genug Geld auf deinem Bankkonto, um das Mitgliederlimit deiner Gang zu erhöhen. - Vous n'avez pas assez d'argent dans votre compte en banque pour mettre à niveau la limite de membre maximale. - Non hai abbastanza fondi nel tuo conto in banca per aumentare il limite massimo di membri. - Você não dinheiro suficiente para aumentar o limite da gangue. - Nie posiadasz wystarczającej ilości środków na koncie aby powiększyć gang - 您的银行帐户没有足够的钱升级帮派最大成员限制。 - - - Current: - Aktuální - Corriente: - - Aktuell: - Actuel : - Attuale: - Atual: - Aktualny: - 最近的: - - - Lacking: - postrádat - Falta: - - Fehlend: - Manquant : - Mancanza: - Faltando: - Brakuje: - 缺少: - - - You have upgraded from %1 to %2 maximum slots for <t color='#8cff9b'>$%3</t> - Provedli jste upgrade z%1 do%2 Maximální sloty pro < k color = "# 8cff9b '> $%3 < / > - Has aumentado de %1 a %2 slots <t color='#8cff9b'>$%3</t> - - Du hast für <t color='#8cff9b'>$%3</t> die Anzahl von %1 auf %2 Mitgliedern erhöht. - Vous avez mis à niveau le nombre maximal de membres de %1 à %2 pour <t color='#8cff9b'>$%3</t> - Hai aumentato i posti massimi da %1 a %2 per <t color='#8cff9b'>$%3</t> - Limite de membros atualizado de %1 para %2 por <t color='#8cff9b'>R$%3</t> - Zwiększyłeś ilość możliwych członków gangu z %1 do %2 for <t color='#8cff9b'>$%3</t> - 你已经从 %1 升级到 %2 最大成员数 <t color='#8cff9b'>$%3</t> - - - Upgrade cancelled. - Upgrade zrušena. - Mejora Cancelada. - - Erhöhung abgebrochen. - Mise à jour annulée. - Aumento annullato. - Cancelar Upgrade. - Ulepszanie anulowane. - 升级取消。 - - - Funds: - fondy - Fondos: - - Geld: - Fonds : - Fondi - Recursos: - Środki: - 基金: - - - (Gang Leader) - (Gang Leader) - (Lider de Pandilla) - - (Gangführung) - (Chef de Gang) - (Capo Gang) - (Lider da Gangue) - (Szef gangu) - (帮派老大) - - - You are already in a gang. - Jste již v gangu. - Ya estas en una pandilla. - - Du befindest dich bereits in einer Gang. - Vous êtes déjà dans un gang. - Sei già in una banda. - Você já está em uma gangue. - Jesteś już w gangu. - 你已经在帮派中了。 - - - Bad UID? - Bad UID? - Mauvais UID ? - Bad UID? - Bad UID? - Bad UID? - Bad UID? - Bad UID? - Bad UID? - 错误的UID? - - - This player is already in a gang. - Tento hráč je již v gangu. - Ce joueur est déjà dans un gang. - Este jugador ya está en una pandilla. - Questo giocatore è già in una banda. - Ten gracz jest już w gangu. - Este jogador já está em uma gangue. - Этот игрок уже в банде. - Dieser Spieler ist bereits in einer Gang. - 这个玩家已经在帮派中了。 - - - You have been kicked out of the gang. - You have been kicked out of the gang. - Vous avez été éjecté de votre gang. - You have been kicked out of the gang. - You have been kicked out of the gang. - You have been kicked out of the gang. - You have been kicked out of the gang. - You have been kicked out of the gang. - Du wurdest aus der Gang gekickt. - 你被踢出了帮派。 - - - - - This garage has already been bought! - - - - Diese Garage wurde bereits gekauft! - Ce garage a déjà été acheté ! - - - - 这个仓库已经被购买了! - - - You are not the owner of this house! - - - - Vous n'êtes pas le propriétaire de cette maison ! - Du bist nicht der Eigentümer dieses Hauses! - - - - 你不是这所建筑的主人! - - - This garage is available for <t color='#8cff9b'>$%1</t><br/> - - - - Diese Garage steht dir für <t color='#8cff9b'>$%1</t><br/>zur Verfügung! - Ce garage est disponible pour <t color='#8cff9b'>$%1</t><br/> - - - - 这个仓库花费 <t color='#8cff9b'>$%1</t><br/> - - - This building is a Gang Hideout! - - - - Dieses Gebäude ist ein Gangversteck! - Ce bâtiment est une cachette de gang ! - - - - 这个建筑是一个帮派据点! - - - Are you sure you want to sell your garage? It will sell for: <t color='#8cff9b'>$%1</t> - - - - Bist du sicher, dass du diese Garage verkaufen willst? Sie wird verkauft für: <t color='#8cff9b'>$%1</t> - Êtes-vous sûr de vouloir vendre votre garage ? Vous le vendrez pour : <t color='#8cff9b'>$%1</t> - - - - 你确定要卖掉你的仓库吗? 它将售出: <t color='#8cff9b'>$%1</t> - - - Sell Garage - - - - Vendre le garage - Garage verkaufen - - - - 出售仓库 - - - Purchase Garage - - - - Acheter ce garage - Garage kaufen - - - - 购买仓库 - - - You do not own a garage here! - - - - Du besitzt hier keine Garage! - Vous ne possédez pas de garage ici ! - - - - 你在这里没有仓库! - - - Vehicle Garage - Garáž Vehicle - Garaje de Vehículos - - Fahrzeug Garage - Garage de Véhicules - Garage Veicoli - Garagem de Veículos - Garaż - 载具仓库 - - - Get Vehicle - Získat vozidlo - Obtener Vehículo - - Ausparken - Récupérer - Ritira Veicolo - Pegar Veículo - Wyciągnij pojazd: - 获取载具 - - - Sell Vehicle - Navrhujeme Vehicle - Vender Vehículo - - Fahrzeug verkaufen - Vendre - Vendi Veicolo - Vender Veículo - Sprzedaj pojazd - 出售载具 - - - Sell Price - Navrhujeme Cena - Precio de Venta - - Verkaufspreis - Prix de vente - Prezzo di vendita - Preço de Venda - Cena sprzedaży - 出售价格 - - - Storage Fee - skladného - Cuota de Guardado - - Parkgebühr - Frais de Stockage - Costo ritiro - Taxa de Armazenamento - Opłata parkingowa - 保管费 - - - No vehicles found in garage. - Žádná vozidla nalezený v garáži. - No se encontraron vehículos en el Garaje. - - Keine Fahrzeuge in der Garage gefunden. - Aucun véhicule trouvé dans le garage. - Non hai veicoli nel Garage. - Nenhum veiculo encontrado na garagem. - Nie znaleziono pojazdów w garażu - 仓库内没有载具。 - - - You don't have $%1 in your bank account - Nemáte $%1 z vašeho bankovního účtu - No tienes $%1 en tu cuenta de Banco - - Du hast keine $%1 auf deinem Bankkonto. - Vous n'avez pas %1$ sur ton compte en banque. - Non hai $%1 nel tuo conto in banca - Você não tem R$%1 na sua conta bancária - Nie masz %1 na koncie bankowym: - 你的银行账户里没有 $%1 - - - Spawning vehicle please wait... - Plodit vozidlo čekejte prosím ... - Creando vehículo, por favor espera... - - Fahrzeug wird bereitgestellt, bitte warten... - Mise en place du Véhicule, merci de patienter... - Creazione veicolo attendere... - Obtendo veiculo, aguarde por favor... - Wyciągam pojazd, proszę czekać ... - 正在提取载具请稍候... - - - Sorry but %1 was classified as a destroyed vehicle and was sent to the scrap yard. - Je nám líto, ale%1 byl klasifikován jako zničené vozidlo a byl poslán na šrotiště. - Lo siento, pero %1 fue clasificado como destruido y fue mandado al basurero. - - Entschuldigung, aber dein %1 wurde zerstört und auf den Schrottplatz geschickt. - Désolé, mais votre %1 a été détruit et vendu à la casse. - Purtroppo %1 è stato classificato come veicolo distrutto ed è stato mandato allo sfascio. - O veículo %1 foi mandado para o ferro velho pois foi classificado como destroido. - Przepraszamy ale %1 został sklasyfikowany jako zniszczony i został odesłany na złom. - 对不起 %1 被认定为损坏的载具并送往废弃场。 - - - Sorry but %1 is already active somewhere in the world and cannot be spawned. - Je nám líto, ale%1 je již aktivní někde ve světě a nemůže být třel. - Lo siento, pero %1 esta activo en alguna parte del mundo y no puede aparecer. - - Entschuldigung, aber dein %1 ist bereits ausgeparkt worden und kann darum nicht bereitgestellt werden. - Désolé, mais votre %1 a déjà été sorti du garage. - Purtroppo %1 è già presente nella mappa e non può essere ricreato - O veículo %1 já está presente no mapa e não pode ser retirado novamente - Przepraszamy ale %1 jest aktywny gdzieś na mapie i nie może zostać wyciągnięty. - 对不起,%1 被归类为毁坏的载具,并被送到废弃场。 - - - There is already a vehicle on the spawn point. You will be refunded the cost of getting yours out. - K dispozici je již vozidlo na spawn bodu. Ty budou vráceny náklady dostat se ven. - Ya hay un vehículo en el punto de Spawn, se te reembolsara el costo de sacar el vehículo. - - Es steht ein Fahrzeug auf dem Spawnpunkt. Die Kosten für das Bereitstellen werden dir erstattet. - Il y a déjà un véhicule sur le point de spawn. Le coût de sortie du véhicule vous a été remboursé. - C'è già un veicolo nel punto di creazione. Verrai rimborsato della spesa appena effettuata. - Existe um outro veiculo na area de spawn. Você será reembolsado. - W strefie parkowania znajduje się już pojazd. Środki za parkowanie zostaną zwrócone. - 载具重生点已经被另一辆载具占据。你的花费将会返还。 - - - You sold that vehicle for $%1 - Ty jsi prodal toto vozidlo za $%1 - Vendiste el vehículo por $%1 - - Du verkaufst dein Fahrzeug für $%1. - Vous avez vendu ce véhicule pour $%1. - Hai venduto il veicolo per $%1 - Você vendeu um veículo por R$%1 - Sprzedałeś pojazd za %1 - 你以 $%1 的价格出售了这辆载具 - - - That vehicle is a rental and cannot be stored in your garage. - Že vozidlo je půjčovna a nemohou být uloženy ve vaší garáži. - Este vehículo es rentado y no puede ser guardado. - - Mietwagen können nicht in der Garage geparkt werden. - Ce véhicule est une location et ne peut pas être stocké dans votre garage. - Il veicolo è in affitto e non può essere depositato in garage. - Esse veículo é alugado e não pode ser armazenado na garagem. - Pojazd wynajęty, nie możesz go schować w garażu. - 载具是租赁的,不能存放在你的仓库里。 - - - That vehicle doesn't belong to you therefor you cannot store it in your garage. - Co vozidlo nepatří k vám proto jej nelze ukládat ve vaší garáži. - Este vehículo no es tuyo! Asi que no lo puedes guardar. - - Das Fahrzeug gehört nicht dir und kann deshalb nicht in der Garage geparkt werden. - Ce véhicule ne vous appartient pas, vous ne pouvez pas le stocker dans votre garage. - Il veicolo non ti appartiene e quindi non puoi depositarlo nel tuo garage. - Você não é o proprietário desse veiculo, logo não poderá guarda-lo na garagem. - Pojazd nie należy do ciebie nie możesz go schować w garażu. Ale zawsze możesz podjechać do dziupli! - 载具不属于你,所以你不能把它存放在仓库里。 - - - The vehicle has been stored in your garage. - Vozidlo bylo uložené v garáži. - Has guardado el vehículo en el garaje. - - Das Fahrzeug wurde in die Garage eingeparkt. - Le véhicule a été entreposé dans le garage. - Il veicolo è stato depositato nel tuo garage. - O veículo foi guardado na sua garagem. - Pojazd został zaparkowany. - 载具已存放在你的仓库里. - - - Your vehicle is ready! - Vaše vozidlo je připraven! - Tu vehículo esta listo! - - Dein Fahrzeug steht bereit! - Votre véhicule est prêt. - Il tuo veicolo è pronto - O seu veículo está pronto - Pojazd jest gotowy - 你的载具准备好了! - - - The server is trying to store the vehicle... - Tento server se pokouší uložit vozidlo ... - El servidor esta tratando de guardar el vehículo... - - Der Server versucht, das Fahrzeug einzuparken... - Le serveur tente de stocker le véhicule... - Il server sta cercando di depositare il veicolo... - O servidor está guardando o veiculo... - Serwer próbuje schować pojazd w garażu ... - 服务器正试图存储载具... - - - The selection had a error... - Volba obsahuje chybu ... - Huvo un error en la selección... - - Die Auswahl hat einen Fehler... - La sélection a une erreur... - La selezione ha avuto un errore... - Erro ao selecionar.... - Ten wybór powoduje błąd - 选择有错误... - - - There isn't a vehicle near the NPC. - Není vozidla v blízkosti NPC. - No hay un vehículo cerca del NPC. - - Es befindet sich kein Fahrzeug in der Nähe des NPC. - Il n'y a pas de véhicule près du PNJ. - Non c'è alcun veicolo vicino all'NPC. - Não existe um veículo proximo ao NPC - Nie ma pojazdu w pobliżu NPC - NPC附近没有载具。 - - - - - Key Chain - Current List of Keys - Klíčenka - Aktuální seznam klíčů - Llavero - Lista de llaves - - Schlüsselbund - Aktuelle Liste - Porte-clés - Liste actuelle des clés - Portachiavi - Lista delle Chiavi - Chaves - Atual Lista de Chaves - Lista kluczyków - 钥匙 - 当前列表 - - - Drop Key - Drop Key - Tirar llave - - Wegwerfen - Jeter Clef - Abbandona Chiave - Remover Chave - Wyrzuć klucz - 丢弃钥匙 - - - Give Key - dát klíč - Dar Llave - - Geben - Donner Clef - Dai Chiave - Dar Chave - Daj klucz - 给予钥匙 - - - - - Player Menu - Nabídka přehrávače - Menu de Jugador - - Spieler Menü - Menu du Joueur - Menu Giocatore - Menu Jogador - Menu gracza - 玩家菜单 - - - Current Items - Aktuální položky - Objetos Actuales - - Aktuelle Gegenstände - Items Actuels - Oggetti Attuali - Items Atuais - Aktualne wyposażenie: - 当前物品 - - - Licenses - licencí - Licencias - - Lizenzen - Licences - Licenze - Licenças - Licencje - 许可证 - - - Money Stats - peníze Statistiky - Dinero - - Geld Statistik - Stats Monétaires - Statistiche Fondi - Dinheiro - Twoje środki - 资产统计 - - - My Gang - My Gang - Mi Pandilla - - Meine Gang - Mon Gang - Mia Gang - Gangue - Gang - 我的帮派 - - - Wanted List - seznamu hledaných - Lista de Busqueda - - Fahndungsliste - Interpol - Lista Ricercati - Lista de Foragidos - Poszukiwani - 通缉名单 - - - Cell Phone - Mobilní telefon - Celular - - Telefon - Téléphone - Cellulare - Celular - Telefon - 短消息 - - - Key Chain - Klíčenka - Llavero - - Schlüssel - Porte-clés - Portachiavi - Chaves - Klucze - 钥匙 - - - Admin Menu - Nabídka admin - Menu Admin - - Admin Menü - Menu Admin - Menu Admin - Menu Admin - Admin Menu - 管理菜单 - - - Sync Data - synchronizace dat - Sincronizar - - Speichern - Sync Data - Salva Dati - Sincronizar Dados - Synchronizuj - 同步数据 - - - - - Settings Menu - Nabídka Nastavení - Configuración - - Einstellungen - Menu Paramètres - Menu Impostazioni - Configurações - Ustawienia: - 设置菜单 - - - On Foot: - Pěšky: - A Pie: - - Zu Fuß: - A pied : - A piedi: - A Pé: - Na nogach: - 步行: - - - In Car: - V autě: - En Carro: - - Im Auto: - En voiture : - Auto: - No Carro: - W aucie: - 载具: - - - In Air: - Ve vzduchu: - En Aire: - - Im Himmel: - Air - Aria: - No Ar: - W powietrzu: - 空中: - - - View distance while on foot - Pohled vzdálenost, zatímco na nohy - Distancia de vista a pie - - Sichtweite zu Fuß - Distance de vue à pied - Distanza visiva a piedi - Visualizar distância enquanto a pé - Widoczność gdy na nogach - 视距 - - - View distance while in a land vehicle - Pohled vzdálenost, zatímco v pozemního vozidla - Distancia de vista en vehiculo terrestre - - Sichtweite in Landfahrzeugen - Distance de vue en véhicule terrestre - Distanza visiva su veicolo di terra - Visualizar distância enquanto em veículos terrestres - Widoczność gdy w aucie - 在陆地载具中观察距离 - - - View distance while in a air vehicle - Pohled vzdálenost, zatímco ve vzduchu vozidle - Distancia de vista en vehiculo aéreo - - Sichtweite in Luftfahrzeugen - Distance de vue en véhicule aérien - Distanza visiva su velivolo - Visualisar distância enquanto em veículos aéreos - Widoczność gdy w powietrzu - 在飞行器上观察距离 - - - Player Tags - přehrávač Tags - Marcador de Jugadores - - Spielernamen - Tags Joueurs - Tag Giocatore - Tags de Jogadores - Tagi graczy - 玩家标签 - - - Tags ON - značky na - Tags ON - - Namen AN - Tags ON - Tags ON - Tags ON - Tagi ON - 启用标签 - - - Tags OFF - Štítky OFF - Tags OFF - - Namen AUS - Tags OFF - Tags OFF - Tags OFF - Tagi OFF - 关闭标签 - - - Sidechat Switch - Sidechat Spínač - Canal Side - Habilitar Sidechat - Interruttore Sidechat - Sidechat Przełącznik - - Habilitar Sidechat - Sidechat umschalten - 聊天框开关 - - - Reveal Nearest Objects - Reveal Nejbližší objekty - Révéler les objets les plus proches - Revelar Objetos Cercanos - Rivela oggetti più vicini - Odsłonić Najbliższa Przedmioty - - Mostrar Objetos Próximos - Nahe Objekte anzeigen - 显示最近的物体 - - - Broadcast Switch - - Interrupteur de Transmission - Habilitar Transmisiones - - - - Habilitar Transmissões - Broadcast umschalten - 广播开关 - - - Sidechat OFF - Sidechat OFF - Sidechat OFF - - Sidechat AUS - Canal camp OFF - Chat fazione OFF - Sidechat OFF - Czat strony OFF - 聊天关闭 - - - Sidechat ON - Boční Chat ON - Sidechat OFF - - Sidechat AN - Canal camp ON - Chat fazione ON - Sidechat ON - Czat strony ON - 聊天开启 - - - - - Shop Inventory - Obchod Zásoby - Inventario de Tienda - - Ladeninventar - Boutique - Inventario Negozio - Loja de Inventário - Oferta sklepu - 店铺库存 - - - Your Inventory - Váš Inventory - Tu Inventario - - Eigenes Inventar - Votre Inventaire - Inventario Personale - Seu Inventário - Twoje wyposażenie - 你的库存 - - - Buy Item - Koupit Item - Comprar - - Kaufen - Acheter Objet - Compra Oggetto - Comprar Item - Kup objekt - 买东西 - - - Sell Item - Navrhujeme Item - Vender - - Verkaufen - Vendre Objet - Vendi Oggetto - Vender Item - Sprzedaj obiekt - 卖东西 - - - - - Spawn Selection - potěr Selection - Selección de Spawn - - Aufwachpunkt Auswahl - Sélection du Spawn - Selezione Spawn - Locais para Começar - Wybierz punkt odrodzenia - 选择重生点 - - - Spawn - Potěr - Spawn - - Aufwachen - Spawn - Spawn - Começar - Odradzanie - 重生 - - - Current Spawn Point - Aktuální potěr Point - Punto de Spawn Actual - - Aktueller Aufwachpunkt - Point de Spawn Actuel - Punto di Spawn corrente - Ponto de início Atual - Aktualny punkt odrodzenia - 目前的重生点 - - - You have spawned at - Jste třel - Has aparecido en - - Du bist aufgewacht in - Tu as spawn à - Ti trovi a - Você irá começar em - Odrodziłeś się w - 你重生了 - - - - - Give Ticket - Dejte Ticket - Dar Tiquete - - Ticket geben - Verbaliser - Dai Multa - Dar Multa - Wystaw mandat - 开据罚单 - - - Pay Ticket - Pay vstupenek - Pagar Tiquete - - Ticket bezahlen - Payer l'amende - Paga Multa - Pagar Multa - Zapłać mandat - 支付罚款 - - - Refuse Ticket - odmítnout Ticket - Denegar Tiquete - - Ticket ablehnen - Refuser l'amende - Rifiuta Multa - Recusar Multa - Odmów przyjęcia mandatu - 拒绝缴款 - - - - - Trunk Inventory - kufr Inventory - Inventario del Vehículo - - Kofferraum - Coffre - Inventario Veicolo - Inventário do Veículo - Zawartość - 库存清单 - - - Player Inventory - hráč Inventory - Inventario del Jugador - - Spielerinventar - Inventaire Joueur - Inventario Giocatore - Inventário do Jogador - Wyposażenie gracza - 玩家清单 - - - Take - Vzít - Sacar - - Nehmen - Récupérer - Prendi - Pegar - Weź - 取出 - - - Store - Obchod - Guardar - - Lagern - Déposer - Deposita - Depositar - Schowaj - 存储 - - - - - APD Wanted List - LAPD seznamu hledaných - Lista de Busqueda - - Fahndungsliste - Interpol - Lista Ricercati - Lista APD Poszukiwane - Lista de Procurados - 通缉名单 - - - Pardon - Pardon - Perdonar - - Erlassen - Pardonner - Perdona - Pardon - Perdão - 赦免 - - - Add - Přidat - Ajouter - Agregar - Aggiungere - Dodaj - - Adicionar - Hinzufügen - 添加 - - - Wanted People - chtěl, aby lidé - Personnes recherchées - Gente Buscada - La gente voleva - Ludzie chcieli - - Pessoas Procuradas - Gesuchte Personen - 通缉犯 - - - Citizens - občané - Citoyens - Ciudadanos - cittadini - Obywatele - - Cidadãos - Bürger - 公民 - - - Crimes - Zločiny - Crimes - Crimenes - crimini - Zbrodnie - - Crimes - Verbrechen - 罪犯 - - - %1 has been added to the wanted list. - %1 byl přidán do seznamu hledaných. - %1 a été ajouté à la liste des personnes recherchées. - %1 ha sido agregado a la Lista de Busqueda. - %1 è stato aggiunto alla lista dei ricercati. - %1 został dodany do listy pożądanego. - - %1 foi adicionado a lista de procurados. - %1 wurde zur Fahndungsliste hinzugefügt. - %1 已添加到通缉名单. - - - %1 count(s) of %2 - Počet%1 (y) z %2 - %1 chef (s) de %2 - %1 cuenta(s) de %2 - %1 count (s) del %2 - %1 count (ów) z %2 - - %1 contagem(s) de %2 - %1 Vergehen: %2 - %1 违法(次数) %2 - - - Current Bounty Price: $%1 - Aktuální Bounty Cena: $ %1 - Prix de la prime: $%1 - Recompensa Actual: $%1 - Corrente Bounty Prezzo: $%1 - Aktualny Bounty Cena: $%1 - - Atual recompensa: R$%1 - Aktuelle Prämie: $%1 - 目前的赏金: $%1 - - - - - Salema - Salema - Salema - - Sardine - Saumon - Salmone - Salema - Salema - 加州异鳍石鲈 - - - Ornate - Vyšperkovaný - Ornate - - Kaiserfisch - Doré - Orata - Ornamentado - Dorada - 橙带蝴蝶鱼 - - - Mackerel - Makrela - Verdel - - Makrele - Maquereau - Sgombro - Cavalinha - Makrela - 鲭鱼 - - - Tuna - Tuňák - Atún - - Thunfisch - Thon - Tonno - Atum - Tuńczyk - 金枪鱼 - - - Mullet - cípal - Lisas - - Meerbarbe - Mullet - Triglia - Tainha - Cefal - 梭鱼 - - - Cat Shark - Cat žralok - Pez Gato - - Katzenhai - Poisson Chat - Squalo - Tubarão Gato - Rekin - 鲨鱼 - - - Rabbit - Králičí - Conejo - - Hase - Lapin - Coniglio - Coelho - Zając - 兔子 - - - Chicken - Kuře - Gallina - - Hühnchen - Poulet - Pollo - Frango - Kurczak - 雏鸡 - - - Rooster - Kohout - Gallo - - Hähnchen - Coq - gallo - galo - kogut - 公鸡 - - - Goat - Koza - Cabra - - Ziege - Chèvre - Capra - Cabra - Koza - 山羊 - - - Sheep - Ovce - Obeja - - Schaf - Mouton - pecora - ovelha - Owca - 绵羊 - - - Turtle - Želva - Tortuga - - Schildkröte - Tortue - Tartaruga - Tartaruga - żółw - 乌龟 - - - - - You do not have $%1 for a %2 - Nemáte $%1 pro%2 - No tienes $%1 para una %2 - - Du hast keine $%1 für einen %2. - Vous n'avez pas %1$ pour cet élément : %2 - Non hai $%1 per $2 - Você não tem R$%1 para %2 - Nie masz $%1 na %2 - 你没有 $%1 支付 %2 - - - You bought a %1 for $%2 - Koupil sis%1 pro $ %2 - Comprastes una %1 por $%2 - - Du hast einen %1 für $%2 gekauft. - Vous avez acheté : %1 pour %2$ - Hai comprato un %1 per $%2 - Você comprou %1 por R$%2 - Kupiłeś %1 za $%2 - 你购买 %1 花费 $%2 - - - %1 was arrested by %2 - %1 byl zatčen%2 - %1 fue arrestado por %2 - - %1 wurde von %2 verhaftet. - %1 a été arrêté par %2 - %1 è stato arrestato da %2 - %1 foi preso por %2 - %1 został aresztowany przez %2 - %1 被 %2 逮捕 - - - You caught a %1 - chytil jste%1 - Atrapastes un %1 - - Du hast einen %1 gefangen. - Vous avez attrapé un %1 - Hai pescato %1 - Você pegou %1 - Złapałeś %1 - 你逮捕了 %1 - - - Gutting %1 - Kuchání%1 - Eviscerando %1 - - %1 ausnehmen - Eviscération de %1 - eviscerazione %1 - evisceração %1 - Patroszenie %1 - 去除 %1 的内脏 - - - You have collected some raw %1 meat - Nasbíráte nějaké syrové maso %1 - Has recolectado carne cruda de %1 - - Du hast rohes %1 Fleisch erhalten. - Vous avez récolté quelques morceaux de %1 cru - You have collected some raw %1 meat - You have collected some raw %1 meat - You have collected some raw %1 meat - 你已经从 %1 收集生肉 - - - You have taken some turtle meat - Jste si vzali nějaké želví maso - Has tomado carne de tortuga. - - Du hast etwas Schildkrötenfleisch bekommen. - Vous avez récupéré un peu de viande de tortue - Hai raccolto della carne di tartaruga - Você pegou carne de tartaruga - Wziąłeś trochę mięsa żółwia - 你吃了一些海龟肉 - - - You have earned $%1 - Jste získali $%1 - Has ganado $%1 - - Du hast $%1 verdient. - Vous avez gagné %1$ - Hai guadagnato $%1 - Você ganhou R$%1 - Otrzymałeś $%1 - 你赚了 $%1 - - - Dropping fishing net... - Pád rybářská síť ... - Tirando red de pesca... - - Fischernetz auswerfen... - Déploiement du filet de pêche... - Posizionando la rete da pesca... - Jogando rede de pesca... - Rzucam sieć... - 撒下鱼网... - - - Didn't catch any fish... - Nezachytil žádnou rybu ... - No atrapastes peces... - - Keinen Fisch gefangen... - Vous n'avez pas réussi à attraper de poisson... - Non hai pescato nulla... - A rede voltou vazia... - Nic nie złapałeś... - 没有捕到任何鱼... - - - Fishing net pulled up. - Rybářská síť vytáhl nahoru. - Recogistes la red. - - Fischernetz eingeholt. - Le filet de pêche a été entièrement relevé. - Rete da pesca recuperata. - A rede de pesca foi recolhida - Sieć wciągnięta. - 拉起渔网。 - - - Your inventory space is full. - Váš inventář prostor je plný. - No tienes espacio en tu inventorio. - - Dein Inventar ist voll. - Vous n'avez plus de place dans votre inventaire. - Il tuo inventario è pieno. - Seu inventário está cheio - Nie masz więcej miejsca. - 您的库存空间已满。 - - - Gathering %1... - Sběr%1 ... - Recolectando %1... - - Sammle %1... - Ramassage de %1... - Raccogliendo %1 - Coletando %1... - Zbierasz %1 - 采集 %1... - - - You have sold a %1 for $%2 - Jste prodal%1 pro $ %2 - Has vendido un %1 por $%2 - - Du hast einen %1 für $%2 verschrottet. - Vous avez vendu un(e) %1 pour $%2 - Hai venduto un %1 per %2$ - Você vendeu %1 por R$%2 - Sprzedałeś %1 za $%2 - 你卖掉 %1 赚了 $%2 - - - You have picked %1 %2 - Jste si vybrali% %1 2 - Has recogido %1 %2 - - Du hast %1 %2 aufgenommen. - Vous avez ramassé : %1 %2 - Hai trovato %1 %2 - Você pegou %1 %2 - Podniosłeś %1 %2 - 你采集了 %1 个 %2 - - - You have collected some %1 - Jste nasbírali řadu%1 - Has recolectado %1 - - Du hast etwas %1 gesammelt. - Vous avez récolté %1 - Hai raccolto %1 - Você coletou %1 - Wziąłeś %1 - 你采集了一些 %1 - - - You are to deliver this package to %1. - Jste doručit tento balíček %1 - Debes llevar este paquete a %1 - - Du musst dieses Paket bei %1 abliefern. - Vous avez livré ce paquet à %1 - Devi consegnare questo pacco al %1 - Você deverá entregar esse pacote para %1 - Dostarcz tę przesyłkę do %1 - 你要递送这个包裹到 %1。 - - - Deliver this package to %1. - Doručit tento balíček %1 - LLeva el paquete a: %1 - - Liefere dieses Paket bei %1 ab. - Livrer ce paquet à %1. - Consegna questo pacco al %1 - Entregue esse pacote para %1 - Dostarcz przesyłkę do %1 - 把这个包裹送到 %1。 - - - You failed to deliver the package because you died. - Nepodařilo se vám doručit balíček, protože jsi zemřela. - Fallastes la misión, porque moristes. - - Da du gestorben bist, hast du es nicht geschafft das Paket abzuliefern. - Vous êtes mort, livraison annulée. - Compra Oggetto - Você falhou na tarefa de entrega pois você morreu. - Nie dostarczyłeś przesyłki z uwagi na to że zmarłeś. - 因为你死了,所以你没能投递包裹。 - - - You do not have $%1 to be healed - Nemáte $%1, aby se léčil - No tienes $%1 para ser curado - - Du hast keine $%1, um behandelt zu werden. - Vous n'avez pas $%1 pour être soigné. - Non hai $%1 per essere curato - Você não tem R$%1 para ser curado - Nie masz $%1 na leczenie - 你没有 $%1 治疗费 - - - You do not need to be healed! - Nemusíte být uzdraven! - Vous êtes déjà en pleine forme ! - Usted no necesita ser curado! - Non è necessario essere guarito! - Nie trzeba się wyleczyć! - Você não precisa ser curado! - Вам не нужно быть исцелены! - Du brauchst keine Behandlung! - 你不需要治疗! - - - Spend $%1 to be fully healed? - Útrata $%1 musí být zcela vyléčit? - Donner $%1 pour être complètement guéri ? - Gastar $%1 para ser curado por completo? - Spendere $%1 di essere completamente guarito? - Wydać $%1 w pełni uzdrowiony? - Gastar US $%1 para ser totalmente curado? - Потратит $%1, чтобы быть полностью зажила? - Willst du dich für $%1 vollständig behandeln lassen? - 花费 $%1 痊愈? - - - Doctor - Doktor - Docteur - Médico - Medico - Lekarz - Médico - Врач - Arzt - 医疗人员 - - - Please stay still - Prosím, zůstat v klidu - Por favor, no te muevas - - Bitte bewege dich nicht! - Ne bougez pas - Attendi pazientemente - Fique parado por favor - Proszę się nie ruszać - 请不要动 - - - You need to be within 5m while the doctor is healing you - Musíte být v rámci 5m, zatímco lékař vás hojení - Debes estar a 5m mientras que te curan. - - Du musst in der Nähe vom Arzt bleiben, damit er dich behandeln kann. - Vous devez être à moins de 5m du médecin pendant qu'il vous soigne. - Devi restare entro 5m dal dottore per essere curato - Você tem que estar a 5m para o médico curá-lo - Musisz być w pobliżu doktora gdy ten cię leczy - ok 5m - 医疗人员在治疗你的时候,你必须在5米以内 - - - You are now fully healed. - Ty jsou nyní plně uzdravil. - Estas curado! - - Du wurdest behandelt. - Vous êtes completement soigné. - Sei stato curato completamente. - Sua saúde está perfeita - Zostałeś wyleczony - 你现在痊愈了。 - - - %1 your %2 is being impounded by the police. - %1 Váš%2 je zabaveno policií. - %1 tu %2 esta siendo embargado por la policía. - - %1 dein %2 wird von der Polizei beschlagnahmt! - %1, votre %2 est en train d'être envoyé à la fourrière par la police. - %1 il tuo %2 sta per essere sequestrato dalla Polizia. - %1 seu %2 está sendo apreendido pela Polícia - %1 twój %2 jest usuwany przez Policję - %1 的 %2 正在被警察扣留。 - - - Impounding Vehicle - vzdouvání Vehicle - Embargando Vehículo - - Fahrzeug wird beschlagnahmt - Mise en fourrière - Sequestro Veicolo in corso - Apreendendo veículo - Usuwam pojazd - 扣留载具 - - - Impounding has been cancelled. - Zabavení byla zrušena. - Embargo cancelado. - - Beschlagnahmung abgebrochen. - Mise en fourrière annulée. - Il sequestro è stato annullato. - Ação de apreender foi cancelada - Przerwano usuwanie pojazdu - 扣留已被取消. - - - You have impounded a %1\n\nYou have received $%2 for cleaning up the streets! - Jste zabaveno a %1 \n\n jste obdržel $%2 pro čištění ulic! - Has embargado un %1\n\nHas recibido $%2 por limpiar las calles! - - Du hast einen %1 beschlagnahmt\n\nDu hast $%2 für das Aufräumen der Straßen bekommen! - Vous avez mis en fourrière un(e) %1\n\nVous avez reçu $%2. - Hai sequestrato un %1\n\nHai ricevuto $%2 per aver mantenuto l'ordine nelle strade! - Você apreendeu %1\n\nVocê recebeu R$%2 por deixar as ruas mais seguras! - Usunąłeś %1\n\n Otrzymujesz $%2 za oczyszczanie mapy - 你扣留了 %1\n\你收到了 $%2 扣留费! - - - %1 has impounded %2's %3 - %1 byl odtažen% %2 3 je - %1 a embargado el %3 de %2 - - %1 hat %2's %3 beschlagnahmt. - %1 a mis en fourrière le %3 de %2. - %1 ha sequestrato il %2 di %3 - %1 apreendeu %3 de %2 - %1 usunął %2's %3 - %1 扣留了 %2 的 %3 - - - You paid $%1 for impounding your own %2. - Zaplatil jste $%1 pro vzdouvání vlastní %2. - Vous avez payé $%1 pour la mise en fourrière de votre propre %2. - Has pagado $%2 para embargar tu propio %1. - Hai pagato $%1 per sequestro la propria %2. - Zapłaciłeś $%1 do zatrzymywania własną %2. - - Du hast $%1 bezahlt, weil du dein eigenen %2 beschlagnahmt hast. - Você pagou R$%1 para guardar seu próprio %2. - 你支付 $%1 取出了被扣留的 %2. - - - Abort available in %1 - Přerušit k dispozici v %1 - Aborto disponible en %1 - - Déconnexion disponible dans %1 - Abbruch möglich in %1. - Abbandona disponibile in %1 - Abortar disponível em %1 - Możesz przerwać za %1 - 距离下线时间 %1 - - - This vehicle is already mining - Toto vozidlo je již dobývání - Este Vehículo ya esta minando - - Dieses Fahrzeug ist bereits am Abbauen. - Ce véhicule est déjà en train de miner - Questo veicolo sta già estraendo risorse - Esse veículo já está minerando - Pojazd jest w trakcie wydobycia surowców - 载具已经在开采了 - - - The vehicle is full - Vozidlo je plná - El vehículo esta lleno! - - Das Fahrzeug ist voll. - Le véhicule est plein. - Il veicolo è pieno - O veículo está cheio. - Pojazd jest pełny - 载具库存已满 - - - You are not near a resource field - Nejste v blízkosti oblasti zdrojů - No estas cerca de un campo de recursos. - - Du bist nicht in der Nähe eines Ressourcenfeldes. - Vous n'êtes pas à proximité d'un champ de ressources. - Non sei vicino ad un campo risorse - Você não está próximo ao recurso - Nie jesteś w pobliżu pola surowców - 你不在资源区域附近 - - - You cannot turn the vehicle on when mining - Nemůžete otočit vozidlo o tom, kdy výtěžek - No puedes girar el vehículo mientras esta minando - - Du kannst das Fahrzeug nicht starten, solange es am Abbauen ist. - Le moteur doit être arrêté pour que le véhicule puisse miner - Non puoi accendere il veicolo mentre estrae risorse - Você não pode ligar o veículo enquanto minera - Nie możesz poruszać pojazdem w trakcie wydobycia. - 开采时不能打开载具 - - - The Device is mining... - Zařízení je důlní ... - El Dispositivo esta minando... - - Das Fahrzeug baut ab... - Le véhicule est en train de miner... - Il veicolo sta estrando risorse... - A máquina está minerando... - Trwa wydobycie... - 设备正在开采... - - - Completed cycle, the device has mined %1 %2 - Dokončena cyklus, přístroj se těžil% %1 2 - Ciclo completado el dispositivo ha minado %1 %2 - - Sammeln beendet, das Fahrzeug hat %1 %2 abgebaut. - Cycle terminé, le véhicule a miné %1 %2 - Ciclo completato, il veicolo ha raccolto %1 %2 - Ciclo completo, a máquina minerou %1 %2 - Urządzenie wydobyło %1 %2 - 完成一个开采周期,设备已开采 %1 %2 - - - Vehicle is out of fuel - Vozidlo je mimo pohonné hmoty - El vehículo no tiene gasolina. - - Das Fahrzeug hat keinen Treibstoff mehr. - Le véhicule n'a plus de carburant. - Il veicolo è senza carburante - O veículo está sem combustível - Brak paliwa w pojezdzie - 载具燃料不足 - - - You have packed up the spike strip. - Jste sbalil spike proužek. - Has agarrado la Barrera de Clavos. - - Du hast das Nagelband eingepackt. - Vous avez récupéré la herse. - Hai raccolto una striscia chiodata. - Você recolheu o tapete de espinhos. - Kolczatka zwinięta - 你铺设了钉刺带。 - - - %1 has been placed in evidence, you have received $%2 as a reward. - %1 byl umístěn v důkazu, jste obdrželi $%2 jako odměnu. - %1 ha sido colocado en evidencias, has recibido $%2 como recompensa. - - %1 hat Beweise hinterlassen, als Belohnung erhälst du $%2. - Vous avez mis sous scellé la drogue de %1, vous avez reçu $%2 comme récompense. - E' stata trovata della merce illegale: %1, hai ricevuto $%2 come ricompensa. - %1 foi pego como evidência, você recebeu R$%2 como recompensa. - %1 umieszczony w dowodach, otrzymujesz w nagrodę $%2 - %1 已经被送入监狱,你已经收到了 $%2 作为奖励. - - - You have picked up $%1 - Jste zvedl $%1 - Has recogido $%1 - - Du hast $%1 aufgehoben. - Vous avez ramassé $%1 - Hai raccolto $%1 - Você pegou R$%1 - Podniosłeś $%1 - 你捡到了 $%1 - - - You must wait at least 3 minutes in jail before paying a bail. - Musíte počkat nejméně 3 minuty ve vězení předtím, než platit kauci. - Debes esperar un minimo de 3 minutos en la cárcel antes de poder pagar la fianza. - - Du musst mindestens 3 Minuten lang im Gefängnis bleiben, bevor du die Kaution beantragen kannst. - Vous devez attendre au moins 3 minutes en prison avant de pouvoir payer votre caution. - Devi aspettare almeno 3 minuti in prigione prima di poter pagare la cauzione. - Você precisa esperar pelo menos 3 minutos antes de poder pagar fiança. - Musisz poczekać conajmniej 3 minuty w więzieniu zanim zapłacisz kaucję. - 在保释之前,你必须至少在监狱里呆3分钟。 - - - You do not have $%1 in your bank account to pay bail. - Nemáte $%1 z vašeho bankovního účtu platit kauci. - No tienes $%1 en tu cuenta de banco para pagar la fianza! - - Du hast keine $%1 auf deinem Bankkonto, um die Kaution zu bezahlen. - Vous n'avez pas $%1 dans votre compte en banque pour payer la caution. - Non hai $%1 nel tuo conto in banca per poter pagare la cauzione. - Você não tem R$%1 em sua conta bancária para pagar a fiança. - Nie masz $%1 na koncie aby zapłacić kaucję. - 你的银行账户没有 $%1 的金额。 - - - %1 has posted bail! - %1 byl vyslán na kauci! - %1 a pagado la fianza! - - %1 hat die Kaution bezahlt! - %1 a payé sa caution ! - %1 ha pagato la cauzione! - %1 pagou a fiança! - %1 wpłacił kaucję! - %1 已保释! - - - There isn't a vehicle nearby... - Není vozidlo v blízkosti ... - No hay un vehículo cerca... - - Es ist kein Fahrzeug in der Nähe... - Il n'y a pas de véhicule à proximité... - Non c'è alcun veicolo qui vicino... - Não existe um veículo por perto... - W pobliżu nie ma pojazdu... - 附近没有载具... - - - You can't chop a vehicle while a player is near! - Nemůžeš sekat vozidla, zatímco hráč je blízko! - Vous ne pouvez pas vendre un véhicule alors que son propriétaire est à proximité ! - No puedes vender este vehículo mientras hay un jugador cerca! - Non si può rubare un veicolo mentre un giocatore è vicino! - Nie można posiekać pojazd podczas gdy gracz jest w pobliżu! - - Você não pode usar o desmanche enquanto um jogador está próximo! - Du kannst kein Fahrzeug beim Schrotthändler verschrotten, während ein Spieler in der Nähe ist! - 当玩家靠近时,你不能盗窃载具! - - - %1 was restrained by %2 - %1 byl omezen%2 - %1 fue retenido por %2 - - %1 wurde von %2 festgenommen - %1 a été menotté par %2 - %1 è stato ammanettato da %2 - %1 foi imobilizado por %2 - %1 został skuty przez %2 - %1 被 %2 约束 - - - Searching... - Hledám ... - Buscando... - - Durchsuche... - Recherche... - Ricerca... - Revistando... - Szukam... - 搜查... - - - Couldn't search the vehicle - Nemohli vyhledávat na vozidlo - No se pudo buscar el vehículo. - - Das Fahrzeug konnte nicht durchsucht werden! - Impossible de fouiller le véhicule. - Impossibile ispezionare il veicolo - Você não pode revistar o veículo - Nie można przeszukać pojazdu - 不能搜查载具 - - - Your illegal items have been put into evidence. - Vaše nelegálních položky byly uvedeny do důkazy. - Tus objetos ilegales fueron confiscados. - - Deine illegalen Gegenstände wurden als Beweismittel eingezogen. - Vos objets illégaux ont été mis sous scellé. - I tuoi articoli illegali sono stati messi sotto sequestro. - Seus itens ilegais foram postos em evidência. - Twoje nielegalne pozycje zostały wprowadzone do dowodów. - 你的非法物品被查获。 - - - This vehicle has no information, it was probably spawned in through cheats. \n\nDeleting vehicle. - Toto vozidlo nemá žádné informace, to bylo pravděpodobně třel dovnitř podvodníky. \ In \ Odstranění vozidla. - Este vehículo no tiene informacion, posiblemente fue creado atravez de Cheats \n\nBorrando vehículo. - - Über das Fahrzeug gibt es keine Informationen, es wurde vermutlich durch Cheats gespawnt. \n\nLösche das Fahrzeug. - Ce véhicule ne dispose d'aucune information, il a probablement été créé par un hackeur. \n\ Suppression du véhicule. - Il veicolo è privo di identificativi, probabilmente è stato creato mediante cheat. \n\nCancellazione veicolo. - Esse veículo não tem informações, é provável que ele tenha sido criado por um cheater.\n\nDeletando veículo. - Pojazd bez informacji servera, prawdopodobnie umieszczony przez hakera \n\n usuwam pojazd. - 这载具没有任何信息, 它可能是通过作弊产生的. \n\n删除载具。 - - - You are already doing an action. Please wait for it to end. - Ty jsou již dělá akci. Počkejte prosím, až to skončí. - Ya estas haciendo una acción, espera a que termine. - - Du führst bereits eine Aktion aus. Bitte warte, bis diese beendet ist. - Vous faites déjà une action. Merci d'attendre la fin de celle-ci. - Stai già compiendo un'azione, attendi che finisca. - Você já está executando uma ação. Por favor espere até que ela acabe. - Aktualnie wykonujesz jakąś akcję poczekaj aż skończysz. - 你已经在行动了.请等待结束. - - - %1 was unrestrained by %2 - %1 byl živelný%2 - %1 fue soltado por %2 - - %1 wurde von %2 freigelassen. - %1 a été démenotté par %2. - %2 ha tolto le manette a %1 - %1 foi liberado por %2 - %1 został rozkuty przez %2 - %1 摆脱了 %2 的约束 - - - %1 has robbed %2 for $%3 - %1 oloupil%2 na $ %3 - %1 le ha robado $%3 a %2 - - %1 hat $%3 von %2 geraubt. - %1 a volé %2 pour $%3. - %1 ha rapinato %2 di $%3 - %1 roubou R$%3 de %2 - %1 obrabował $%2 na $%3 - %1 抢劫了 %2 金钱 $%3 - - - %1 doesn't have any money. - %1 nemá žádné peníze. - %1 No tiene dinero. - - %1 hat kein Geld. - %1 n'a pas d'argent. - %1 non ha alcun soldo. - %1 não tem nenhum dinheiro. - %1 nie ma pieniędzy. - %1 身无分文。 - - - %1 was tazed by %2 - %1 byl tased%2 - %1 fue paralizado por %2 - - %1 wurde von %2 getazert. - %1 a été tazé par %2. - %1 è stato taserato da %2 - %1 foi eletrocutado por %2 - %1 został potraktowany paralizatorem przez %2 - %1 被 %2 约束 - - - A vehicle was searched and has $%1 worth of drugs / contraband. - Vozidlo byl prohledán a má $%1 v hodnotě drog / kontrabandu. - Un vehículo fue buscado y se econtro $%1 en drogas / contrabando. - - Ein Fahrzeug wurde durchsucht und es wurden Drogen / Schmuggelware im Wert von $%1 gefunden. - Un véhicule venant d'être fouillé avait $%1 de drogue / contrebande. - Un veicolo è stato ispezionato e sono stati sequestrati $%1 in materiale illegale. - O veículo foi revistado e tem R$%1 em drogas ou contrabandos - Podczas przeszukania znalezono narkotyki/kontrabandę o wartości $%1 - 搜查载具查获价值 $%1 的毒品/违禁品。 - - - A container of house was searched and has $%1 worth of drugs / contraband. - Kontejner domu byl prohledán a má $%1 v hodnotě drog / kontrabandu. - Un contenedor fue buscado y se econtro $%1 en drogas / contrabando. - - Ein Container im Haus wurde durchsucht und es wurden Drogen / Schmuggelware im Wert von $%1 gefunden. - Un conteneur de maison venant d'être fouillé avait $%1 de drogue / contrebande. - Un veicolo è stato ispezionato e sono stati sequestrati $%1 in materiale illegale. - O veículo foi revistado e tem R$%1 em drogas ou contrabandos - Podczas przeszukania znalezono narkotyki/kontrabandę o wartości $%1 - 搜查房子存储箱查获价值 $%1 的毒品/违禁品. - - - You have been pulled out of the vehicle. - Byli jste vytáhl z vozu. - Te han sacado del vehículo - - Du wurdest aus dem Fahrzeug gezogen. - Vous avez sorti les personnes du véhicule. - Sei stato estratto dal veicolo - Você foi retirado do veículo - Zostałeś wyciągnięty z pojazdu - 你从车里被拖出来了。 - - - %1 has gave you %2 %3. - %1 vám již dal% %2 3. - %1 te ha dado %2 %3 - - %1 hat dir %2 %3 gegeben. - %1 vous a donné %2 %3. - %1 ti ha dato %2 %3 - %1 lhe deu %2 %3 - %1 dał ci %2 %3 - %1 给了你 %2 %3. - - - %1 has given you $%2. - %1 vám dal $ %2. - %1 te ha dado $%2 - - %1 hat dir $%2 gegeben. - %1 vous a donné $%2. - %1 ti ha dato $%2 - %1 lhe deu R$%2 - %1 dał ci $%2 - %1 给了你 $%2. - - - Sending information to server please wait..... - Odesílání informací serveru čekejte prosím ... - Mandando información, por favor espere... - - Sende Informationen an den Server, bitte warten..... - Envoi d'informations au serveur, patientez s'il vous plait... - Invio delle informazioni al server, attendere prego...... - Enviando informações para o servidor, seja paciente..... - Przesyłam informacje na server poczekaj .... - 发送信息到服务器,请稍候..... - - - An action is already being processed... - Akce je již zpracován ... - Una acción ya esta siendo procesada... - - Es wird bereits eine Aktion ausgeführt... - Une action est déjà en cours de traitement... - Un'azione è già in corso... - Você já está realizando um ação... - Akcja jest w trakcie wykonywania... - 正在处理操作... - - - You're doing it too fast! - Děláte to příliš rychle! - Moins vite entre chaque action ! - Lo estas haciendo muy rapido! - Lo stai facendo troppo veloce! - - Du bist ganz aus der Puste! Warte ein paar Sekunden! - Você está fazendo isso muito rápido! - Za szybko zwolnij ! - 你做得太快了! - - - You don't have enough space for that amount! - Nemáte dostatek prostoru pro tuto částku! - No tienes suficiente espacio para eso! - - Du hast für diese Menge nicht genug Platz! - Vous n'avez pas assez de place pour cette quantité ! - Non hai abbastanza spazio per quel quantitativo! - Você não tem espaço suficiente para guardar o item - Nie masz tyle miejsca! - 你没有足够的空间存放物品! - - - You don't have that much money! - Nemáte tolik peněz! - No tienes tanto dinero! - - Du hast nicht so viel Geld! - Vous n'avez pas assez d'argent ! - Non hai tutti quei soldi! - Você não tem todo esse dinheiro! - Nie masz tyle pieniędzy! - 你没有那么多钱! - - - You are not a cop. - Ty nejsi polda. - No eres policía. - - Du bist kein Polizist. - Vous n'êtes pas policier. - Non sei un poliziotto. - Você não é um Policial. - Nie jesteś policjantem - 你不是警察。 - - - You don't have enough room for that item. - Nemáte dostatek prostoru pro danou položku. - No tienes el espacio suficiente. - - Du hast nicht genug Platz für den Gegenstand. - Vous n'avez pas assez de place. - Non hai abbastanza spazio per quell'oggetto. - Você não tem espaço suficiente no seu inventário. - Nie masz wystarczająco miejsca na tą rzecz. - 你没有足够的空间存放这个物品。 - - - You need $%1 to process without a license! - Musíte $%1 bez povolení ke zpracování! - Necesitas $%1 par procesar sin una licencia! - È necessario $%1 a processo senza patente! - - Du benötigst $%1, um ohne Lizenz verarbeiten zu können! - Vous devez payer $%1 pour traiter sans licence ! - Você precisa de R$%1 para processar sem uma licença! - Potrzebujesz $%1 w celu przetworzenia bez licencji - 你未取得许可需要支付 $%1 才能加工! - - - You don't have enough items! - Ty nemají dostatek položku! - No tienes suficientes objetos! - Non disponi di abbastanza materiale grezzo! - Nie masz wystarczająco dużo rzeczy! - - Vous n'avez pas assez d'items ! - Você não tem itens suficientes! - Du hast nicht genug Materialien! - 你没有足够的物品! - - - You have processed your item(s)! - Jste zpracujeme vaši položku (y)! - Has procesado tus objeto(s) - - Vous avez traité vos objet(s) ! - Hai processato i tuoi oggetti! - Przetworzeniu swój przedmiot (y)! - Você processou seu(s) item(s) - Du hast deine Materialien verarbeitet! - 你已经加工了你的物品! - - - You can't rapidly use action keys! - Nemůžete rychle využít akčních kláves! - No puedes usar Keys de Acciones tan rápido! - - Die Aktionstaste kann nicht so schnell hintereinander genutzt werden! - Vous ne pouvez pas utiliser rapidement les touches d'action ! - Non puoi riusare così rapidamente il tasto azione! - Você não pode usar a tecla de ação repetidamente! - Za szybko używasz przycisku akcji! - 你不能快速点击按键! - - - You do not have enough funds in your bank account. - Nemáte dostatek prostředků na váš bankovní účet. - No tienes tanto dinero en tu cuenta de banco. - - Du hast nicht genug Geld auf deinem Bankkonto. - Vous n'avez pas assez de fonds dans votre compte en banque. - Non hai abbastanza fondi nel tuo conto in banca. - Você não tem todo esse dinheiro em sua conta bancária. - Nie masz wystarczających środków w banku. - 你的银行账户里没有足够的资金。 - - - Couldn't add it to your inventory. - Nemohl ji přidat do svého inventáře. - No se pudo agregar a tu inventario. - - Es konnte nichts zu deinem Inventar hinzugefügt werden. - Impossible d'ajouter cela à votre inventaire. - Non puoi aggiungerlo al tuo inventario. - Não foi possível adicionar o item ao seu inventário - Nie można dodać tego do twojego wyposażenia - 无法将其添加到你的库存中。 - - - You haven't eaten anything in awhile, You should find something to eat soon! - Jste nejedli nic za čas, byste měli najít něco k jídlu brzy! - No has comido nada en un largo rato. Deberías buscar algo de comer! - - Du hast schon eine Weile nichts mehr gegessen! Du solltest langsam etwas zum Essen suchen! - Vous n'avez rien mangé depuis un certain temps, vous devriez trouver quelque chose à manger ! - E' da tempo che non mangi qualcosa, dovresti trovare qualcosa da mettere sotto i denti in fretta! - Você não come a bastante tempo. Ache algo para comer logo!. - Zaczynasz być głodny, poszukaj czegoś do jedzenia! - 你有一阵子没吃东西了,你应该马上找点吃的! - - - You are starting to starve, you need to find something to eat otherwise you will die. - Můžete se začínají hladovět, budete muset najít něco k jídlu jinak zemřete. - Te esta dando mucha, mucha hambre. Come algo o moriras! - - Du hast Hunger! Du solltest schnell etwas essen oder du wirst verhungern. - Vous commencez à mourir de faim, vous devez trouver quelque chose à manger, ou vous mourrez. - Ti stai indebolendo, devi trovare qualcosa da mangiare o morirai. - Você está começando a ficar famindo. Se você não comer irá morrer de fome. - Długo nie jadłeś, zjedz coś lub zginiesz z głodu. - 你感觉饿了,你需要找点东西吃,否则你会死的。 - - - You are now starving to death, you will die very soon if you don't eat something. - Nyní jste hladoví k smrti, zemřete velmi brzy, pokud nemáte něco jíst. - Estas a punto de morir de hambre, busca comida rápido! - - Du bist am Verhungern! Du wirst sterben, wenn du nichts zum Essen findest! - Vous êtes en train de mourir de faim, vous allez mourir très bientôt si vous ne mangez pas quelque chose. - Stai perdendo le forze, se non mangi qualcosa in fretta morirai. - Você está morrendo de fome, coma algo ou irá morrer. - Zaczynasz słabnąć z głodu zjedz coś lub zginiesz !!! - 你现在很饿,如果你不吃东西,很快就会死的。 - - - You have starved to death. - Jste hladem. - Te has muerto de hambre. - - Du bist verhungert! - Vous êtes mort de faim. - Sei morto per la fame. - Você morreu de fome - Wygłodziłeś się na śmierć. - 你饿死了。 - - - You haven't drank anything in awhile, You should find something to drink soon. - Nemáte pil nic za čas, byste měli najít něco k pití brzy. - No has tomado nada en un largo rato. Deberías buscar algo de tomar! - - Du hast schon eine Weile nichts mehr getrunken! Du solltest langsam etwas zum Trinken suchen! - Vous n'avez rien bu depuis un certain temps, vous devriez trouver quelque chose à boire ! - E' da parecchio tempo che non bevi qualcosa, dovresti trovare qualcosa da bere. - Você não bebe nada a bastante tempo. Ache algo para beber logo. - Zaczynasz być spragniony, powinienieś poszukać czegoś do picia. - 你有一阵子没喝水了,你应该马上找点喝的。 - - - You haven't drank anything in along time, you should find something to drink soon or you'll start to die from dehydration. - Vy jste nic pil na delší dobu, měli byste si najít něco k pití hned, nebo budete začnou umírat z dehydratace. - Te esta dando mucha, mucha sed. Toma algo o moriras! - - Du hast Durst! Du solltest schnell etwas trinken oder du wirst verdursten! - Vous commencez à mourir de soif, vous allez mourir de soif si vous ne buvez pas. - E' troppo tempo che non bevi qualcosa, dovresti trovare qualcosa da bere o comincerai a disitratarti. - Você está ficando desidratado. Se não beber algo poderá morrer. - Długo nic nie piłeś, napij się czegoś bo możesz zginąć z pragnienia. - 你在一段时间内没有喝水,你要尽快找到喝的,否则你会开始脱水而死。 - - - You are now suffering from severe dehydration find something to drink quickly! - Nyní trpí těžkou dehydratací najít něco k pití rychle! - Estas a punto de morir de desidratación, busca algo de tomar rapido! - - Du bist am Verdursten! Du wirst sterben, wenn du nichts zum Trinken findest! - Vous êtes en train de mourir de soif, vous allez mourir très bientôt si vous ne buvez pas. - Stai soffrendo per una grave deidratazione, trova velocemente qualcosa da bere o morirai! - Você está sofrendo de desidratação. Beba algo ou irá morrer! - Zaczynasz słabnąć z pragnienia, wypij coś inaczej zginiesz!!! - 你现在正严重脱水,快找点喝的! - - - You have died from dehydration. - Jsi zemřel na dehydrataci. - Has muerto de desidratación. - - Du bist verdurstet! - Vous êtes mort de soif. - Sei morto per disidratazione. - Você morreu desidratado. - Umarłeś z uwagi na odwodnienie organizmu - 你死于脱水. - - - You are over carrying your max weight! You will not be able to run or move fast till you drop some items! - Překročili jste přenášení maximální váhu! Nebudete moci spustit nebo přesunout rychle, dokud se kapka některé položky! - Estas cargando tu peso máximo! No puedes correr o moverte rapido hasta que botes algunos objetos! - - Du trägst zu viel bei dir! Du bist nicht in der Lage, zu rennen oder dich schnell zu bewegen, bis du einige Gegenstände abgelegt hast! - Vous êtes surchargé, vous ne pouvez plus courir ou bouger rapidement à moins de lacher quelques objets ! - Stai trasportando oltre il tuo carico massimo! Non riuscirai a correre fino a quando non ti libererai di qualche oggetto! - Você está carregando muito peso. Você não irá conseguir correr ou se mover rapidamente. - Niesiesz maksymalny ciężar, nie będziesz mógł biegać ani szybko chodzić dopuki nie wyrzucisz jakiejś rzeczy - 你超过了最大负重!除非你丢弃一些物品,否则你不能跑或跑得很快! - - - <t color='#FF0000'><t size='2'>Vehicle Info</t></t><br/><t color='#FFD700'><t size='1.5'>Owners</t></t><br/> %1 - <t color='#FF0000'><t size='2'>Informace o vozidle</t></t><br/><t color='#FFD700'><t size='1.5'>Majitelé</t></t><br/> %1 - <t color='#FF0000'><t size='2'>Info de Vehículo</t></t><br/><t color='#FFD700'><t size='1.5'>Dueños</t></t><br/> %1 - <t color='#FF0000'><t size='2'>Vehicle Info</t></t><br/><t color='#FFD700'><t size='1.5'>Owners</t></t><br/> %1 - <t color='#FF0000'><t size='2'>Fahrzeuginfo</t></t><br/><t color='#FFD700'><t size='1.5'>Besitzer</t></t><br/> %1 - <t color='#FF0000'><t size='2'>Info du véhicule</t></t><br/><t color='#FFD700'><t size='1.5'>Propriétaires</t></t><br/> %1 - <t color='#FF0000'><t size='2'>Vehicle Info</t></t><br/><t color='#FFD700'><t size='1.5'>Owners</t></t><br/> %1 - <t color='#FF0000'><t size='2'>Info do Veículo</t></t><br/><t color='#FFD700'><t size='1.5'>Donos</t></t><br/> %1 - <t color='#FF0000'><t size='2'>Informacja o pojeździe</t></t><br/><t color='#FFD700'><t size='1.5'>Właściciel</t></t><br/> %1 - <t color='#FF0000'><t size='2'>载具信息</t></t><br/><t color='#FFD700'><t size='1.5'>车主</t></t><br/> %1 - - - Cannot search that person. - Nelze vyhledávat tuto osobu. - No puedes buscar a esa persona. - - Diese Person kann nicht durchsucht werden! - Vous ne pouvez pas fouiller cette personne. - Impossibile perquisire quella persona. - Essa pessoa não pode ser revistada. - Nie możesz przeszukać tej osoby - 无法搜查此人。 - - - You couldn't effectively seize any items. Try again. - Dalo by se efektivně využily všech položek. Zkus to znovu. - Vous n'avez pas pu saisir les objets. Réessayez. - No pudistes efectivamente, confiscar algun objeto. Prueba de nuevo. - Impossibile perquisire la persona in maniera esaustiva. Riprova. - Nie można skutecznie wykorzystać żadnych przedmiotów. Spróbuj ponownie. - - Você não pode apreender nenhum item, efetivamente. Tente de novo. - Es konnten nicht alle Gegenstände beschlagnahmt werden. Versuche es noch einmal. - 并非所有物品你都能没收。再试一次。 - - - Repairing %1 - Dalo by se efektivně využily všech položek. Zkus to znovu.... - Reparando %1 - - Wird repariert %1... - Réparation de %1 - Riparando %1 - Reparando %1 - Naprawiam %1 - 修复 %1 - - - You can't do that from inside the vehicle! - Můžete to udělat zevnitř vozu! - Vous ne pouvez pas faire ceci à l'intérieur du véhicule ! - No puedes hacer eso desde adentro del vehículo! - Non si può fare dall'interno del veicolo! - - Du kannst das nicht tun während du in einem Fahrzeug sitzt! - Você não pode fazer isso de dentro do veículo! - Nie możesz tego wykonać z wntrza pojazdu! - 你在载具内不能维修! - - - You have repaired that vehicle. - Jste opravil, že vozidlo. - >Has reparado el vehículo. - - Du hast dieses Fahrzeug repariert. - Vous avez réparé ce véhicule. - Hai riparato il veicolo. - Você reparou esse veículo. - Naprawiłeś pojazd - 你修好了载具。 - - - You have mined %2 %1(s). - Jste shromáždili %2 %1(y). - Vous avez recueilli %2 %1(s). - Has recolectado %2 %1(s). - Hai raccolto %2 unità di %1. - - Du hast %2 %1 abgebaut. - Você colheu %2 %1(s). - Zebrałeś %2 %1 (s). - 你开采了 %2 个 %1。 - - - You have gathered %2 %1(s). - Jste shromáždili %2 %1(y). - Vous avez recueilli %2 %1(s). - Has recolectado %2 %1(s). - Hai raccolto %2 unità di %1. - - Du hast %2 %1 gesammelt. - Você colheu %2 %1(s). - Zebrałeś %2 %1 (s). - 你采集了 %2 个 %1。 - - - You can't gather from inside a car! - Nemůžete sbírat zevnitř vozu! - Vous ne pouvez pas ramasser à l'intérieur d'une voiture ! - No puedes recolectar desde adentro de un vehículo! - Non si può raccogliere da dentro una macchina! - - Wie soll das von hier aus gehen? Du sitzt in einem Fahrzeug! - Você não pode colher de dentro do carro! - Nie możesz zbierać z wnętrza samochodu - 你不能从车里搜集! - - - You are not allowed to loot dead bodies. - Ty jsou není dovoleno kořist mrtvoly. - Vous n'êtes pas autorisé à piller des cadavres. - No puedes buscar cuerpos muertos. - Non è consentito a saccheggiare cadaveri. - - Du darfst keine Leichen durchsuchen! - Você não está liberado para lootiar corpos mortos - Nie możesz przeszukiwać martwych ciał - 你不能抢劫尸体。 - - - You have been frozen by an administrator. - Vy byly zmrazeny správcem. - Vous avez été gelé par un administrateur. - Un admin te ha congelado! - Sei stato congelato da un amministratore. - - Du wurdest von einem Admin eingefroren. - Você foi congelado por um administrador - Zostałeś zamrożony przez administratora - 你被管理员冻结了。 - - - You have teleported to your selected position. - Jste teleported do vašeho zvolené poloze. - Vous avez été téléporté à la position sélectionnée. - Te has teletransportado a la posisción seleccionada. - Ti sei teletrasportaato alla posizione selezionata. - Masz teleportowany do wybranej pozycji. - - Você foi teleportado para a posição que você selecionou - Du hast dich zu deiner gewünschten Position teleportiert. - 你已传送到选择的位置。 - - - You have been unfrozen by an administrator. - Byli jste zmrzlá správcem. - Vous avez été dégelé par un administrateur. - Un admin te ha descongelado! - Sei stato scongelato da un amministratore. - - Ein Admin hat dich wieder aufgetaut. - Você foi descongelado por um administrador - Zostałeś odmrożony przez administratora - 你已被管理员解冻。 - - - No one was selected! - Nikdo byl vybrán! - Personne n'a été sélectionné ! - Nadie fue seleccionado! - Nessuno è stato selezionato! - Nikt nie został wybrany! - Ninguém foi selecionado! - Никто не был выбран! - Niemand wurde ausgewählt! - 没有选中玩家! - - - You didn't select an item you wanted to give. - Nevybrali jste položku, kterou chtěl dát. - Vous n'avez pas sélectionné l'objet que vous vouliez donner. - No ha seleccionado el objeto que quiere dar. - non è stato selezionato un elemento che si voleva dare. - Nie wybrano element, który chciał dać. - Você não selecionou um item que você queria dar. - Вы не выбрали пункт, который вы хотели дать. - Du hast keinen Gegenstand ausgewählt, um diesen weitergeben zu können. - 你没有选择你想给的东西。 - - - You didn't enter an actual number format. - Nezadal jste skutečný formát čísla. - Vous n'avez pas saisi un format de nombre réel. - No ha especificado un formato de número real. - Non hai inserito un formato di numero reale. - Nie wprowadzono rzeczywisty format liczb. - Você não inseriu um formato número real. - Вы не ввели фактический формат числа. - Du hast keine echte Zahl eingegeben. - 你没有输入正确的数字格式。 - - - You need to enter an actual amount you want to give. - Musíte zadat skutečnou částku, kterou chcete dát. - Vous devez entrer un montant réel que vous voulez donner. - Es necesario introducir una cantidad real que se desea dar. - È necessario immettere un importo effettivo si vuole dare. - Musisz podać rzeczywistą kwotę, którą chcesz dać. - É necessário introduzir uma quantidade real que você quer dar. - Вам необходимо ввести фактическую сумму, которую вы хотите дать. - Du musst einen tatsächlichen Wert eingeben, um diesen weitergeben zu können. - 你需要输入你想要给的正确金额。 - - - You need to enter an actual amount you want to remove. - Musíte zadat skutečnou částku, kterou chcete odebrat. - Vous devez entrer un montant réel que vous souhaitez supprimer. - Es necesario introducir una cantidad real que se desea eliminar. - È necessario immettere un importo effettivo che si desidera rimuovere. - Musisz podać rzeczywistą kwotę, którą chcesz usunąć. - É necessário introduzir uma quantidade real que você deseja remover. - Вам необходимо ввести фактическую сумму, которую вы хотите удалить. - Du musst einen tatsächlichen Wert eigeben, um diese löschen zu können. - 你需要输入你想要删除的正确金额。 - - - The selected player is not within range. - Zvolená Hráč není v dosahu. - Le joueur sélectionné est hors de portée. - El jugador seleccionado no está dentro del rango. - Il giocatore selezionato non è nel raggio d'azione. - Wybrany gracz nie jest w zasięgu. - O jogador selecionado não está dentro do alcance. - Выбранный игрок не находится в пределах диапазона. - Der ausgewählte Spieler ist nicht in Reichweite. - 选定的玩家不在有效范围内。 - - - Couldn't give that much of that item, maybe you don't have that amount? - Nemohl dát, že velká část této položky, možná nemáte tuto částku? - Impossible de donner cet objet, peut-être que vous n'en n'avez pas autant ? - No se pudo dar a que gran parte de ese elemento, tal vez usted no tiene esa cantidad? - Impossibile dare quella quantità di oggetti. - nie mógł dać, że wiele z tego elementu, może nie masz tej kwoty? - não poderia dar que muito desse item, talvez você não tem essa quantia? - Не могу дать, что большая часть этого пункта, может быть, у вас нет этой суммы? - Du konntest nicht so eine große Menge von diesem Gegenstand weitergeben. Hast du vielleicht nicht genug davon? - 不能给那么多的东西,也许你没有那么多? - - - You gave %1 %2 %3. - Ty jsi dal %1 %2 %3. - Vous avez donné %1 %2 %3. - Diste %1 %2 %3. - Hai dato %1 %2 %3. - Daliście %1 %2 %3. - você deu %1 %2 %3. - Ты дал %1 %2 %3. - Du hast %1 %2 %3 gegeben. - 你给了 %1 %2 %3。 - - - You don't have that much to give! - Nemusíte to hodně dát! - Vous n'avez pas autant à donner ! - Usted no tiene mucho para dar! - Non hai abbastanza oggetti da dare! - Nie ma tego dużo dać! - Você não tem muito para dar! - Вы не так много, чтобы дать! - Du hast nicht so eine große Menge von diesem Gegenstand! - 你没有这么多去给别人! - - - You gave $%1 to %2. - Dal jsi $%1 do %2. - Vous avez donné $%1 à %2. - Usted le dio $%1 a %2. - Hai dato $%1 a %2. - Dałeś $%1 do %2. - Você deu $%1 para %2. - Вы дали $%1 %2. - Du hast $%1 %2 gegeben. - 你将 $%1 给了 %2。 - - - You recently robbed the bank! You can't give money away just yet. - Nedávno jste vyloupil banku! Nemůžete dávat peníze pryč jen zatím. - Vous avez récemment volé la banque! Vous ne pouvez pas donner de l'argent pour l'instant. - Recientemente has robado el banco! No se puede dar dinero por el momento. - Recentemente hai rapinato la banca! Non puoi ancora depositare i soldi nel tuo conto bancario. - Niedawno obrabował bank! Nie można dać pieniądze w błoto jeszcze. - Recentemente, você roubou o banco! Você não pode dar dinheiro fora ainda. - Вы недавно ограбили банк! Вы не можете отдавать деньги только пока. - Du hast kürzlich die Bank ausgeraubt! Du kannst deswegen kein Geld weitergeben. - 你最近抢劫了银行!你还不能现在把钱给出去。 - - - No data selected. - vybrány žádné údaje. - Aucune donnée sélectionnée. - No hay datos seleccionados. - Non ci sono dati selezionati. - Nie wybrano danych. - Não há dados selecionado. - Нет выбранных данных. - Keine Daten ausgewählt. - 没有选择数据。 - - - You did not select a vehicle. - Nevybrali jste vozidlo. - Vous n'avez pas sélectionné de véhicule. - No ha seleccionado un vehículo. - Non hai selezionato un veicolo. - Nie wybrano pojazdu. - Você não selecionou um veículo. - Вы не выбрали автомобиль. - Du hast kein Fahrzeug ausgewählt. - 你没有选择载具。 - - - You do not own any vehicles. - Nevlastníte žádná vozidla. - Vous ne possédez pas de véhicules. - Usted no posee ningún vehículo. - Non possedete tutti i veicoli. - Nie posiada żadnych pojazdów. - Você não possui quaisquer veículos. - Вы не являетесь владельцем каких-либо транспортных средств. - Du besitzt keine Fahrzeuge. - 你没有任何载具。 - - - You did not select a player. - Nevybrali jste si přehrávač. - Vous n'avez pas sélectionné de joueur. - No ha seleccionado un jugador. - Non hai selezionato un giocatore. - Nie wybrano odtwarzacza. - Você não selecionou um jogador. - Вы не выбрали игрока. - Du hast keinen Spieler ausgewählt. - 你没有选择玩家。 - - - You have given %1 keys to your %2. - Dali jste %1 klíče ke svému %2. - Vous avez donné les clés de votre %2 à %1. - Usted ha dado %1 llaves de su %2. - Hai dato a %1 chiavi della vostra %2. - Dałeś %1 klucze do %2. - Você tem dado %1 chaves de sua %2. - Вы дали %1 ключи от %2. - Du hast %1 die Schlüssel zu deinem %2 gegeben. - 你将 %2 的钥匙给了 %1。 - - - %1 has gave you keys for a %2. - %1 has gave you keys for a %2. - %1 a vous a donné les clés de %2. - %1 has gave you keys for a %2. - %1 has gave you keys for a %2. - %1 has gave you keys for a %2. - %1 has gave you keys for a %2. - %1 has gave you keys for a %2. - %1 hat dir die Schlüssel zum %2 gegeben. - %1 给了你一把 %2 的钥匙。 - - - You cannot remove the keys to your house! - Nemůžete odstranit klíče od domu! - Vous ne pouvez pas supprimer les clés de votre maison ! - No se puede quitar las llaves de su casa! - Non è possibile rimuovere le chiavi a casa tua! - Nie można usunąć klucze do swojego domu! - Você não pode remover as chaves de sua casa! - Вы не можете удалить ключи к вашему дому! - Du kannst die Schlüssel zu diesem Haus nicht wegwerfen! - 你不能丢弃你家的钥匙! - - - You did not select anything to remove. - Nevybrali jste nic odstranit. - Vous avez rien sélectionné à supprimer. - No ha seleccionado nada que quitar. - Non hai selezionato niente da rimuovere. - Nie zrobił nic, aby usunąć wybrać. - Você não selecionou nada para remover. - Вы ничего удалить не выбрать. - Du hast nichts zum Entsorgen ausgewählt. - 你没有选择要删除的任何东西。 - - - Could not remove that much of that item. Maybe you do not have that amount? - Nepodařilo se odstranit, že velká část této položky. Možná, že nemáte tuto částku? - Impossible d'en supprimer autant. Peut-être que vous ne disposez pas de ce montant ? - No se pudo eliminar que gran parte de ese elemento. Tal vez usted no tiene esa cantidad? - Impossibile rimuovere quel quantitativo di oggetti. - Nie można usunąć, że wiele z tego elementu. Może nie masz tej kwoty? - Não foi possível remover que muito desse item. Talvez você não tem essa quantia? - Не удалось удалить, что большая часть этого элемента. Может быть, у вас нет этой суммы? - Du konntest nicht so eine große Menge von diesem Gegenstand entsorgen. Hast du vielleicht nicht so viele davon? - 不能丢弃大部分东西。也许你没有那么多数额? - - - You have successfully removed %1 %2 from your inventory. - Úspěšně jste odstraněny %1 %2 z vašeho inventáře. - Vous avez réussi à retirer %1 %2 de votre inventaire. - Has eliminado correctamente %1 %2 de su inventario. - Hai rimosso con successo %1 %2 dal tuo inventario. - Pomyślnie usunięto %1 %2 z inwentarza. - Você removeu com êxito %1 %2 do seu inventário. - Вы успешно удалены %1 %2 из инвентаря. - Du hast erfolgreich %1 %2 aus deinem Inventar entsorgt. - 你已成功地从库存删除 %1 %2。 - - - Something went wrong; the menu will not open? - Něco se pokazilo; nabídka neotevře? - Quelque chose s'est mal déroulé; le menu ne s'ouvre pas ? - Algo salió mal; el menú no se abre? - Qualcosa è andato storto; il menu non si apre? - Coś poszło nie tak; menu nie otworzy? - Algo deu errado; o menu não vai abrir? - Что-то пошло не так; меню не откроется? - Etwas ist schief gelaufen. Das Menü konnte nicht geöffnet werden. - 出错了;菜单不能打开? - - - Config does not exist? - Config neexistuje? - Config n'existe pas ? - Config no existe? - Config non esiste? - Konfiguracja nie istnieje? - O configuração não existe? - Config не существует? - Einstellung nicht vorhanden? - 配置不存在? - - - You cannot store that in anything but a land vehicle! - Nelze uložit, že v ničem jiném než pozemní vozidla! - Vous pouvez stocker cet objet seulement dans les véhicules terrestres ! - No se puede almacenar en cualquier cosa menos que un vehículo terrestre! - Non è possibile depositare questa risorsa in un veicolo che non sia terrestre! - Nie można zapisać, że w nic poza pojazdem lądowym! - Você não pode armazenar isso em qualquer coisa, mas um veículo de terra! - Вы не можете хранить, что ничего, кроме наземного транспортного средства! - Du kannst das nur in einem Landfahrzeug lagern! - 除了陆地载具,你不能储存它! - - - You don't have that much cash on you to store in the vehicle! - Nemáte tolik peněz na vás uložit do vozidla! - Vous ne disposez pas d'autant d'argent sur vous pour stocker dans le véhicule ! - Usted no tiene esa cantidad de dinero en efectivo para almacenar en el vehículo! - Non hai abbastanza denaro con te da mettere nel veicolo! - Nie ma tego dużo gotówki na ciebie do przechowywania w pojeździe! - Você não tem que muito dinheiro em você para armazenar no veículo! - У вас не так много наличных денег на вас, чтобы хранить в автомобиле! - Du hast nicht genug Geld bei dir, um die eingegeben Menge in das Fahrzeug zu lagern! - 你没有那么多现金可以存放在载具里! - - - The vehicle is either full or cannot hold that much. - Vozidlo je buď plný nebo nemůže myslet si, že mnoho. - Le véhicule est plein ou ne peut pas en contenir autant. - El vehículo está llena o no puede contener tanta. - Il veicolo è pieno o non può tenere quel quantitativo. - Pojazd jest albo w pełnym lub nie można uznać, że dużo. - O veículo está cheio ou não pode segurar muito. - Транспортное средство либо полностью или не может держать так много. - Das Fahrzeug ist entweder voll oder kann nicht so viel halten. - 这载具要么是满的,要么就是装不下那么多。 - - - Couldn't remove the items from your inventory to put in the vehicle. - Vozidlo je buď plný nebo nemůže myslet si, že mnoho. - Le véhicule est déjà plein ou ne peut pas stocker d'avantage d'objets. - El vehículo está llena o no puede contener tanta. - Impossibile rimuovere quel quantitativo di oggetti dal tuo inventario per metterlo nel veicolo. - Pojazd jest albo w pełnym lub nie można uznać, że dużo. - O veículo está cheio ou não pode segurar muito. - Транспортное средство либо полностью или не может держать так много. - Das Fahrzeug ist entweder voll oder hat nicht so viel Platz. - 无法从你的库存中取出物品放入车内。 - - - This is an illegal item and cops are near by. You cannot dispose of the evidence. - To je ilegální položky a policajti jsou v blízkosti. Nemůžete zbavit důkazů. - Ceci est un objet illégal et les policiers sont à proximité. Vous ne pouvez pas le jeter. - Este es un artículo ilegal y policías están cerca. No se puede disponer de las pruebas. - Non puoi liberarti di questo oggetto dato che è una prova evidente. - Jest to nielegalne element i policjanci są w pobliżu. Nie można pozbyć się dowodów. - Este é um item ilegal e policiais estão nas proximidades. Você não pode dispor das provas. - Это незаконный пункт и полицейские находятся поблизости. Вы не можете избавиться от доказательств. - Dies ist ein illegaler Gegenstand und Polizisten sind in der Nähe. Du kannst die Beweise nicht einfach so entsorgen. - 这是非法物品,警察就在附近。你不能把它扔掉。 - - - You cannot remove an item when you are in a vehicle. - Nemůžete-li odebrat položku, když jste ve vozidle. - Vous ne pouvez pas supprimer un objet lorsque vous êtes dans un véhicule. - No se puede eliminar un elemento cuando se está en un vehículo. - Non è possibile rimuovere un elemento quando si è in un veicolo. - Nie można usunąć element, kiedy jesteś w pojeździe. - Você não pode remover um item quando você está em um veículo. - Вы не можете удалить элемент, когда вы находитесь в автомобиле. - Du kannst keinen Gegenstand entsorgen, wenn du in einem Fahrzeug sitzt. - 当你在车内时,无法扔掉物品。 - - - You are now spectating %1.\n\nPress F10 to stop spectating. - Nyní diváck é%1.\n\nStisknutím klávesy F10 k zastavení divácké. - Vous êtes maintenant spectateur %1.\n\nAppuyez sur F10 pour arrêter le mode spectateur. - Ahora está como espectador de %1.\n\nPulse F10 para salir de modo espectador. - Si è ora spectating %1.\n\nPremere F10 per smettere di spettatori. - Grasz teraz spectating %1.\n\nNaciśnij klawisz F10, aby zatrzymać spectating. - Você agora está como espectador %1.\n\nPressione F10 para sair. - Теперь вы spectating %1.\n\nНажмите F10, чтобы остановить spectating. - Du beobachtest nun %1.\n\nDrücke F10, um das Beobachten zu beenden. - 你现在正在观看 %1.\n\n 按F10停止观看. - - - You have stopped spectating. - Přestali jste divácké úlohy. - Vous avez arrêté spectating. - Usted ha dejado de ser espectador. - Hai smesso di spettatori. - Zatrzymaniu widzem. - Você parou espectador. - Вы остановили spectating. - Du hast das Beobachten beendet. - 你已经停止了观看。 - - - You have teleported %1 to your location. - Jste teleported %1 do vaší polohy. - Vous avez téléporté %1 à votre emplacement. - Usted ha teletransportado %1 a su ubicación. - Hai teletrasportato %1 alla vostra posizione. - Masz teleportował %1 na swoim miejscu. - Você teletransportou %1 para a sua localização. - Вы телепортированы %1 к вашему положению. - Du hast %1 zu deiner Position teleportiert. - 传送 %1 到你的位置。 - - - <t color='#ADFF2F'>ATM</t> - <t color='#ADFF2F'>Bankomat</t> - <t color='#ADFF2F'>DAB</t> - <t color='#ADFF2F'>ATM</t> - <t color='#ADFF2F'>ATM</t> - <t color='#ADFF2F'>Bankomat</t> - <t color='#ADFF2F'>Caixa Eletrônico</t> - <t color='#ADFF2F'>Банкомат</t> - <t color='#ADFF2F'>Geldautomat</t> - <t color='#ADFF2F'>自动取款机</t> - - - Capture Gang Hideout - Zachyťte Gang skrýš - Capturer la cachette de gang - Capturar Escondite - Cattura Banda Nascondiglio - Przechwytywanie Banda Kryjówka - Capturar Esconderijo de Gangue - Захват шайка укрытие - Gangversteck einnehmen - 占领帮派藏身处 - - - An empty array was passed to fn_levelCheck.sqf - An empty array was passed to fn_levelCheck.sqf - An empty array was passed to fn_levelCheck.sqf - An empty array was passed to fn_levelCheck.sqf - An empty array was passed to fn_levelCheck.sqf - An empty array was passed to fn_levelCheck.sqf - An empty array was passed to fn_levelCheck.sqf - An empty array was passed to fn_levelCheck.sqf - Ein leeres Feld wurde an fn_levelCheck.sqf übergeben. - 一个空字段传递给fn_levelCheck.sqf - - - - - News Station Broadcast - - Anuncio de la Estación de Noticias - - Nachrichtensender - Annonce d'informations - - Estação de Transmissão de Notícias - - 新闻广播 - - - Channel 7 News Station - - Estación del Canal de Noticias 7 - - Chaine d'infos Numéro 7 - Kanal 7 Nachrichtensender - - Estação de Notícias do Canal 7 - - 7频道新闻台 - - - Message Heading: - - Título del Mensaje - - Titre de l'annonce : - Nachrichtenüberschrift: - - Titulo da Mensagem: - - 消息标题: - - - Message Content: - - Contenido del Anuncio - - Contenu de l'annonce: - Nachrichteninhalt: - - Conteúdo da Mensagem: - - 消息内容: - - - Broadcast Message - - Transmitir Anuncio - - Diffusion de l'annonce - Nachricht übertragen - - Transmitir Anúncio - - 广播消息 - - - Broadcast Cost: %1<br />Next Broadcast Available: %2 - - Costo de Transmisión: %1<br />Siguiente Transmisión Disponible en: %2 - - Übertragungskosten: %1<br />Nächste Übertragung möglich in: %2 - Coût de Transmission : %1<br />Prochaine Transmission Disponible dans : %2. - - Custo de Trasnmissão: %1<br />Próxima transmissão disponível em: %2 - - 广播费用: %1<br />下一个广播可用于: %2 - - - The header cannot be over %1 characters - - El título no puede tener mas de %1 caracteres - - L'en-tête ne peut pas dépasser %1 caractères - Die Überschrift darf nicht über %1 Zeichen lang sein. - - O cabeçalho não pode ter mais que %1 caracteres - - 标题不能超过 %1 个字符 - - - You've entered an unsupported character! - - Has introducido un carácter inválido - - Vous avez entré un caractère non pris en charge ! - Du hast ein nicht ungültiges Zeichen eingegeben! - - Você inseriu um caractere inválido - - 你输入了一个不支持的字符! - - - Now - - Ahora - - Jetzt - Maintenant - - Agora - - 现在 - - - You need $%1 to send a broadcast! - - Necesitas %1 para transmitir un anuncio! - - Vous avez besoin de $%1 pour envoyer une diffusion ! - Du benötigst $%1, eine Nachricht senden zu können! - - Você precisa de $%1 para enviar uma transmissão! - - 你需要支付 $%1 才能发送广播! - - - <t size='2'>%1</t><br />Broadcasted by: %2 - - <t size='2'>%1</t><br />Transmitido por: %2 - - <t size='2'>%1</t><br />Diffusé par : %2 - <t size='2'>%1</t><br />Gesendet von: %2 - - <t size='2'>%1</t><br />Transmitido por: %2 - - <t size='2'>%1</t><br />广播发送者: %2 - - - - - You have been arrested, wait your time out. If you attempt to respawn or reconnect your time will increase! - Jste byli zatčeni, počkejte si na čas ven. Pokud se pokusíte respawn nebo připojit váš čas zvýší! - Te han arrestado. Si tratas de matarte o te desconectas se incrementara tu estadía en la cárcel! - - Du wurdest verhaftet. Sitze deine Zeit ab. Wenn du versuchst neu aufzuwachen oder die Verbindung zu trennen, verlängert sich deine Zeit! - Vous avez été arrêté, attendez que votre peine soit terminée. Si vous tentez de respawn ou reconnectez, le temps sera augmenté ! - Sei stato arrestato, sconta la tua pena. Se cercherai di rinascere o di riconnetterti il tuo tempo aumenterà! - Você foi preso, cumpra sua pena. Se você tentar renascer ou reconectar seu tempo na cadeia irá aumentar! - Zostałeś aresztowany, poczekaj na koniec kary. Jeśli się rozłączysz albo odrodzisz twoja kara zostanie powiększona - 你被捕了,耐心坐牢吧。如果你试图重生或重新连接坐牢时间会增加! - - - For being arrested you have lost the following licenses if you own them\n\nFirearms License\nRebel License - Za byl zatčen jste ztratili tyto licence, pokud je vlastní \ žádný zbrojní pas \ jRebel licence - Por ser arrestado se te han quitado estas licencias (si las tienes)\n\nL. de Armas \nL. Rebelde - - Bei der Verhaftung hast du folgende Lizenzen verloren, sofern du sie besessen hast:\n\nWaffenschein\nRebellenausbildung. - Après emprisonnement, vous avez perdu les licences suivantes si vous les aviez\n\nPermis de port d'arme\n LicenceRebelle - A causa del tuo arresto hai perso le seguenti licenze, se le possedevi\n\nPorto d'armi\nLicenza Ribelle - Você perdeu as seguintes licenças por ter sido preso\n\nPorte de Armas\n\nTreinamento Rebelde - Z uwagi na aresztowanie straciłeś następujące licencje jeśli je posiadałeś \n\nPozwolenie na broń \nTrening Rebelianta - 你如果被捕了,会失去\n\n枪支许可证\n叛军许可证 - - - %1 has escaped from jail! - %1 utekl z vězení! - %1 se ha escapado de la cárcel! - - %1 ist aus dem Gefängnis ausgebrochen! - %1 s'est échappé de prison ! - %1 è scappato dalla prigione! - %1 escapou da prisão - %1 uciekł z więzienia! - %1 越狱了! - - - You have escaped from jail, you still retain your previous crimes and now have a count of escaping jail. - Jste utekl z vězení, si stále zachovávají své předchozí zločiny a nyní mají počet uniknout vězení. - Te has escapado de la cárcel, retienes tus crimenes anteriores más un crimen de escapado de la cárcel. - - Vous vous êtes échappé de prison, vous conserver toujours vos crimes précédents et les autorités sont au courant de votre évasion. - Du bist aus dem Gefängnis ausgebrochen! Die Polizei sucht jetzt nach dir, wegen deiner früheren Verbrechen und dem Gefängnisausbruch. - Sei scappato di prigione, rimarrai ricercato per i crimini da te commessi in precedenza e in aggiunta per essere scappato di prigione. - Você escapou da prisão, agora você é procurado por esse crime e todos os outros que havia cometido anteriormente - Uciekłeś z więzienia, dalej jesteś ścigany za poprzednie przestępstwa i dodatkowo za ucieczkę. - 你已经从监狱逃跑了,你仍然保留着你以前的罪行,现在算是越狱。 - - - You have served your time in jail and have been released. - Sloužil jste svůj čas ve vězení a byli propuštěni. - Has pasado el tiempo en la cárcel y has sido liberado. - - Du hast deine Zeit im Gefängnis abgesessen. - Vous avez purgé votre peine, vous êtes désormais libre. - Hai scontato la tua pena in prigione e sei stato rilasciato. - Você pagou pelo seus crimes e foi libertado. - Odbyłeś swoją karę zostałeś zwolniony z więzienia. - 你已经在监狱服完刑,并被释放。 - - - Time Remaining: - Zbývající čas: - Tiempo Restante: - - Verbleibende Zeit: - Temps restant : - Tempo rimanente: - Tempo Restante: - Pozostały czas kary: - 剩余时间: - - - Can pay bail: - Může zaplatit kauci: - Puedes pagar la fianza en: - - Kann Kaution zahlen: - Peut payer la caution : - Puoi pagare la cauzione: - Pode pagar fiança: - Możesz wpłacić kaucję - 可以支付保释金: - - - Bail Price: - Bail Cena: - Precio de Fianza: - - Kaution: - Prix de la caution : - Costo cauzione: - Preço da fiança: - Wartość kaucji: - 保释金额: - - - You have paid your bail and are now free. - Jste zaplatili kauci a nyní jsou zdarma. - Has pagado tu fianza y has sido liberado. - - Du hast deine Kaution bezahlt und bist nun frei. - Vous avez payé votre caution, vous êtes désormais libre. - Hai pagato la cauzione e sei libero. - Você pagou a fiança e agora está livre. - Zapłaciłeś kaucję jesteś wolny. - 你已经支付了保释金,现在自由了. - - - - - %1 has knocked you out. - %1 zaklepal vás. - %1 te a noqueado. - - %1 hat dich niedergeschlagen. - %1 vous a assommé. - %1 ti ha colpito stordendoti. - %1 nocauteou você. - zostałeś ogłuszony przez %1 - %1 把你击倒了。 - - - You have lost all your motor vehicle licenses for vehicular manslaughter. - Jste ztratili všechny své licence motorových vozidel pro dopravní zabití. - Has perdido todas tus licencias de vehículos de motor por homicidio vehicular. - - Du hast alle deine Führerscheine durch fahrlässige Tötung mit einem Fahrzeug verloren. - Vous avez perdu tous vos permis véhicule pour avoir écrasé quelqu'un. - Hai perso tutte le tue licenze di guida a causa di un omicidio stradale. - Você não perdeu suas licenças de motorista por atropelamento. - Straciłeś wszystkie uprawnienia na pojazdy z uwagi na ciągłe zabijanie ludzi pojazdami. - 你因载具过失杀人被吊销了所有机动载具驾驶许可证。 - - - You have lost your firearms license for manslaughter. - Jste ztratili zbrojního průkazu za zabití. - Has perdido tu licencia de armas por homicidio. - - Du hast deinen Waffenschein wegen Mordes verloren. - Vous avez perdu votre permis d'armes à feu pour homicide involontaire. - Hai perso il tuo Porto d'Armi a causa di un omicidio - Você perdeu suas licenças de porte de arma por cometer homicídio. - Straciłeś pozwolenie na broń z uwagi na zabijanie ludzi z broni palnej - 你因过失杀人而丧失了枪支许可证。 - - - They didn't have any cash... - Oni neměli žádnou hotovost ... - No tenian dinero... - - Er hatte kein Geld... - Il n'a pas d'argent... - Non hai soldi... - Eles não tinham nenhum dinheiro.. - Nie posiadają żadnych pieniędzy ... - 他们没有现金... - - - You stole $%1 - Ukradl jsi $%1 - Robastes $%1 - - Du hast $%1 geraubt. - Vous avez volé $%1 - Hai rubato $%1 - Você roubou R$%1 - Ukradłeś %1 - 你偷了 $%1 - - - The safe is empty! - Bezpečné je prázdný! - La caja esta vacía! - - Der Tresor ist leer! - Le coffre est vide ! - La cassaforte è vuota! - O Cofre está vazio! - Sejf jest pusty! - 保险箱是空的! - - - Someone is already accessing the safe.. - Někdo je již přístup k bezpečné .. - Alguien ya esta entrando en la caja.. - - Jemand greift bereits auf diesen Tresor zu. - Quelqu'un accède déjà au coffre... - Qualcuno sta già interagendo con la cassaforte.. - Alguem já está acessando o cofre. - Ktoś właśnie włamuje się do sejfu! - 有人已经进入保险箱了。 - - - There needs to be %1 or more cops online to continue. - Musí existovat%1 nebo více policajtů on-line pokračovat. - Necesita haber %1 o mas policías para continuar. - - Es müssen %1 oder mehr Polizisten online sein, um fortfahren zu können. - Il faut au minimum %1 policiers pour continuer. - Servono almeno %1 poliziotti online per continuare. - É necessário ter %1 ou mais policiais online para continuar. - Potrzeba conajmniej %1 policjantów aby kontynuować - 需要有 %1 或更多的警察才能继续。 - - - Safe Inventory - Safe Inventory - Inventario de la Caja - - Tresorinventar - Coffre - Inventario cassaforte - Cofre - Wyposażenie sejfu - 保险箱库存 - - - You need to select an item! - Je třeba vybrat položku! - Debes selecionar un objeto! - - Du musst einen Gegenstand auswählen! - Vous devez sélectionner un objet ! - Devi selezionare un oggetto! - Você precisa selecionar um item! - Musisz coś wybrać - 您需要选择一个物品! - - - There isn't %1 gold bar(s) in the safe! - Není %1 zlatá bar (y) v bezpečí! - No hay %1 barra(s) de oro en la caja! - - Es sind keine %1 Goldbarren im Tresor! - Il n'y a pas %1 lingot(s) d'or dans le coffre ! - Nella cassaforte non ci sono %1 lingotti d'oro - Não existe %1 barra(s) de ouro no cofre! - W sejfie nie ma % sztab złota! - 金库里没有 %1 金条! - - - - - Couldn't open the ticketing interface - Nemohl otevřít jízdenek rozhraní - No se pudo abrir el menu de tiquetes! - - Der Bußgeldkatalog konnte nicht geöffnet werden! - Impossible d'ouvrir l'interface des amendes - Impossibile aprire l'interfaccia per le multe - Não foi possível abrir o bloco de multa - Nie potrafię otworzyć interfejsu mandatów - 无法打开罚款界面 - - - Ticketing %1 - Jízdenek%1 - Dando Tiquete a %1 - - Verrechne %1 - Verbalisation de %1 - Multando %1 - Multando %1 - Mandat dla %1 - 开据罚单给 %1 - - - %2 got back a blacklisted vehicle near %1. - %2 dostat zpět na černou listinu vozidlo nedaleko %1. - %2 a récupéré un véhicule blacklisté près de %1. - %2 volver un vehículo en la lista negra cerca de %1. - %2 ha ritirato un veicolo blacklistato vicino %1. - %2 wrócić do czarnej listy pojazd pobliżu %1. - %2 retirou um veículo que se encontra na lista negra, perto de %1. - %2 получить обратно в черный список автомобиль возле %1. - %2 hat ein gesuchtes Fahrzeug nahe %1 ausgeparkt. - %2 在 %1 附近找回了被列入黑名单的载具。 - - - Person to ticket is nil - Osoba, která má lístku je nulová - La persona a quien tiquetear es nulo - - Die Person, für das das Ticket vorgesehen war, ist verschwunden. - La personne à verbaliser n'existe pas. - La persona da multare è nil - Jogador a ser multado é nulo - Osoba do ukarania mandatem to "nil" - 被罚款的玩家为“无” - - - Person to ticket doesn't exist. - Osoba, která má letenku neexistuje. - La perosna a quien tiquetear no existe. - - Die Person, für das Ticket, gibt es nicht. - La personne à verbaliser est inexistante. - La persona da multare non esiste. - Jogador a ser multado não existe. - Nie ma osoby ukaranej mandatem - nie istnieje - 被罚款的玩家不存在。 - - - You didn't enter actual number. - Jste nezadali skutečný počet. - No escribistes un numero real. - - Du hast keine echte Zahl eingegeben. - Vous n'avez pas saisi de nombre. - Non hai inserito un numero correttamente. - Você não digitou um número válido - Wybrałeś zły numer - 你没有输入正确的数字. - - - Tickets can not be more than $200,000! - Vstupenky nemůže být více než 200.000 $! - Los tiquetes no pueden ser mas de $200,000! - - Strafzettel können nicht mehr als $200.000 betragen! - Les amendes ne peuvent pas dépasser plus de $200,000 ! - La multa non può essere più di $200.000! - A multa não pode ser maior que R$200.000! - Mandat nie może być wyższy niż $200.000! - 罚单不能超过 $200,000! - - - %1 gave a ticket of $%2 to %3 - %1 dal lístek na $% %2 3 - %1 le dio un tiquete de $%2 a %3 - - %1 hat %3 einen Strafzettel über $%2 ausgestellt. - %1 a mis une contravention de $%2 à %3. - %1 ha dato una multa di $%2 a %3 - %1 deu uma multa de R$%2 para %3 - %1 Wystawił mandat w wysokości %2 dla %3 - %1 开据金额 $%2 的罚单给 %3 - - - You don't have enough money in your bank account or on you to pay the ticket. - Nemáte dostatek peněz na váš bankovní účet, nebo na vás zaplatit letenku. - No tienes suficiente dinero para pagar el tiquete. - - Du hast nicht genug Geld auf deinem Bankkonto, um den Strafzettel bezahlen zu können. - Vous n'avez pas assez d'argent dans votre compte en banque ou sur vous pour payer l'amende. - Non hai fondi sufficienti nel tuo conto in banca per pagare la multa. - Você não possui dinheiro suficiente na sua conta bancária ou na sua mão para pagar o bilhete. - Nie masz środków na koncie aby zapłacić mandat. - 你的银行帐户中没有足够的钱来支付罚金。 - - - %1 couldn't pay the ticket due to not having enough money. - %1 nemohl zaplatit letenku z důvodu nemají dostatek peněz. - %1 No puedo pagar el tiquete porque no tiene suficiente dinero. - - %1 konnte den Strafzettel nicht bezahlen, weil er nicht genug Geld hat. - %1 ne pouvait pas payer la contravention car il n'avait pas assez d'argent. - %1 non può pagare la multa perchè non ha sufficienti fondi nel suo conto in banca. - %1 não pode pagar a multa pois não tem dinheiro suficiente. - %1 nie może zapłacić mandatu bo nie ma tylu środków na koncie - %1 由于没有足够的钱,无法支付罚金。 - - - You have paid the ticket of $%1 - Jste zaplatili letenku ve výši $%1 - Has pagado el tiquete de $%1 - - Du hast den Strafzettel von $%1 bezahlt. - Vous avez payé l'amende de $%1 - Hai pagato la multa di $%1 - Você pagou a multa de R$%1 - Zapłaciłeś mandat w wysokości $%1 - 你已经支付了 $%1 的罚金 - - - %1 paid the ticket of $%2 - %1 zaplatil letenku ve výši $ %2 - %1 a pagado el tiquete de $%2 - - %1 zahlte einen Strafzettel von $%2. - %1 payé la contravention de $%2 - %1 ha pagato la multa di $%2 - %1 pagou a multa de R$%2 - %1 zapłacił mandat w wyskości $%2 - %1 支付了 $%2 的罚金 - - - %1 paid the ticket. - %1 zaplatil jízdenku. - %1 pago el tiquete. - - %1 hat den Strafzettel bezahlt. - %1 payé la contravention. - %1 ha pagato la multa. - %1 pagou a multa. - %1 zapłacił mandat. - %1 支付了罚金。 - - - %1 has given you a ticket for $%2 - %1 vám dal lístek za $ %2 - %1 te ha dado un tiquete de $%2 - - %1 hat dir einen Strafzettel über $%2 gegeben. - %1 vous a donné une amende de $%2 - %1 ti ha dato una multa di $%2 - %1 lhe aplicou uma multa de R$%2 - %1 dał ci mandat w wysokości $%2 - %1 给你开了一张 $%2 的罚单 - - - %1 refused to pay the ticket. - %1 odmítl zaplatit letenku. - >%1 no aceptó pagar el tiquete. - - %1 weigert sich, den Strafzettel zu bezahlen. - %1 a refusé de payer l'amende. - %1 si è rifiutato di pagare la multa. - %1 se recusou a pagar a multa. - %1 odmówił zapłaty mandatu. - %1 拒绝支付罚金。 - - - You have collected a bounty of $%1 for arresting a criminal. - Nasbíráte kvantum $%1 pro aretaci zločince. - Has recolectado la recompensa de $%1 por arrestar a un criminal. - - Du hast ein Prämie von $%1 für die Festnahme eines Verbrechers bekommen. - Vous avez reçu une prime de $%1 pour avoir arrêté un criminel. - Hai ricevuto il pagamento di una taglia di $%1 per aver arrestato un criminale ricercato. - Você ganhou uma recompensa de R$%1 por prender um criminoso. - Otrzymujesz nagrodę w wysokości $%1 za aresztowanie poszukiwanego kryminalisty. - 你捉拿罪犯获得 %1 赏金。 - - - You have collected a bounty of $%1 for killing a wanted criminal, if you had arrested him you would of received $%2. - Nasbíráte kvantum $%1 za zabití hledaného zločince, pokud jste ho zatkli byste přijímaného $%2. - Has recolectado la recompensa de $%1 por matar a un criminal, si lo hubieras arrestado hubieses conseguido $%2. - - Du hast ein Prämie von $%1 für das Töten eines gesuchten Verbrechers erhalten, für seine Festnahme hättest du $%2 bekommen. - Vous avez reçu une prime de $%1 pour le meurtre d'un criminel recherché, si vous l'aviez arrêté, vous auriez reçu $%2. - Hai ricevuto il pagamento di una taglia di $%1 per aver ucciso un criminale ricercato, se lo avessi arrestato avresti ricevuto $%2. - Você ganhou uma recompensa de $%1 por matar um criminoso procurado, se você tivesse o prendido ganharia R$%2. - Otrzymujesz nagrodę w wysokości $%1 za zabicie poszukiwanego kryminalisty, w przypadku gdybyś go aresztował otrzymałbyć $%2. - 你杀害被通缉的罪犯获得 %1 赏金,如果你逮捕了他,你就会获得 $%2 赏金。 - - - %1 has $%2 worth of contraband on them. - %1 má $%2 v hodnotě kontrabandu na nich. - %1 tiene $%2 en contrabando con el. - - %1 hatte Schmuggelware im Wert von $%2 bei sich. - %1 a $%2 de contrebande sur lui. - %1 ha $%2 in materiali illegali con se. - %1 tem R$%1 em contrabando. - %1 miał przy sobie kontrabandę o wartości $%2. - %1 有价值 $%2 的非法物品。 - - - Illegal Items - nelegální položky - Objetos Ilegales - - Illegale Gegenstände - Objets illégaux - Oggetti Illegali - Items Ilegais - Nielegalne przedmioty / kontrabanda - 非法物品 - - - %1 was identified as the bank robber! - %1 byl identifikován jako bankovního lupiče! - %1 fue identificado como el ladrón del banco! - - %1 wurde als Bankräuber identifiziert! - %1 a été identifié comme un braqueur de banque ! - %1 è stato identificato come il rapinatore della banca! - %1 foi identificado como ladrão de banco! - %1 zidentyfikowany jako kasairz rabujący banki! - %1 被认定为银行抢劫犯! - - - No illegal items - Žádné ilegální položek - No objetos ilegales - - Keine illegalen Gegenstände. - Aucun objet illégal - Nessun oggetto illegale - Sem items ilegais - Brak kontrabandy i nielegalnych przedmiotów - 没有非法物品 - - - You are not near a door! - Nejste u dveří! - No estas cerca de una puerta! - - Du bist nicht in der Nähe einer Tür! - Vous n'êtes pas près d'une porte ! - Non sei vicno ad una porta! - Você não está perto de uma porta! - Nie jesteś przy drzwiach - 你不在门附近! - - - You need to enable Picture in Picture (PiP) through your video settings to use this! - Je nutné povolit obraz v obraze (PIP) pomocí nastavení videa použít tento! - Debes habilitar la opcion de "Picture in Picture"(PiP) En tus opciones de video para usar esto! - - Du musst "Bild in Bild" (PiP) in deinen Video-Einstellungen aktivieren, um dies nutzen zu können! - Vous devez activer le "Picture in Picture" (PiP) dans vos paramètres vidéo pour utilser ceci ! - Devi attivare Picture in Picture (PiP) nelle tue impostazioni video per usare questa funzione! - Você precisa habilitar o Picture in Picture (PiP), através das suas configurações de vídeo para usar esta opção! - Musisz włączyć Obraz w obrazie (PiP) w ustawieniach graficznych aby tego używać! - 您需要通过视频设置启用画中画(PiP)才能使用此功能! - - - Licenses: - licencí - Licencias: - - Lizenzen: - Licences : - Licenze: - Licenças: - Licencje: - 许可证: - - - No Licenses - žádné licence - No Licencias - - Keine Lizenzen! - Aucune licence - Nessuna Licenza - Sem Licenças - Brak licencji - 没有许可证 - - - Nothing illegal in this vehicle - Nic nezákonného v tomto vozidle - Nada ilegal en este vehículo - - Nichts Illegales in diesem Fahrzeug. - Rien d'illégal dans ce véhicule - Niente di illegale nel veicolo - Nada ilegal dentro do veículo - Nie znaleziono niczego nielegalnego w pojeździe - 这载具没有非法物品 - - - Nothing illegal in this container. - Nic nezákonného v tomto kontejneru - Nada ilegal en este contenedor - Nulla di illegale in questo contenitore - Nic nielegalnego w tym pojemniku. - - Nada ilegal dentro do container - Rien d'illégal dans ce conteneur - Nichts Illegales in diesem Container. - 这个库存没有非法物品。 - - - This vehicle is empty - Toto vozidlo je prázdná - Este vehículo esta limpio - - Dieses Fahrzeug ist leer. - Ce véhicule est vide - Questo veicolo è vuoto - Esse veículo está vazio - Pojazd jest pusty - 这载具是空的 - - - This container is empty - Tento zásobník je prázdný - Ce conteneur est vide - Este contenedor esta vacío - Questo contenitore è vuoto - Ten pojemnik jest pusty - Este recipiente está vazio - Этот контейнер пуст - Dieser Container ist leer. - 这个库存是空的 - - - $%1 from the Federal Reserve robbery was returned from the robber being killed. - $%1 z Federálního rezervního systému loupeže byla vrácena ze lupič byl zabit. - $%1 de la Reserva Federal fue devuelto, ya que mataron al ladrón. - - $%1 wurden in die Zentralbank zurückgebracht, weil der Bankräuber gestorben ist. - $%1 du vol de la Banque Fédérale ont été récupérés sur le braqueur, qui vient d'être tué. - $%1 della rapina alla Riserva Federale sono stati recuperati dal rapinatore ucciso. - R$%1 que foi roubado da Reserva Federal retornou a ela após a morte do ladrão. - $%1 z kradzieży w Banku zostało zwrócone po zabiciu włamywacza. - 由于抢劫犯被杀死,联邦储备被抢的 $%1 被归还。 - - - Repairing vault... - Oprava klenby ... - Reparando bóveda... - - Tresor wird repariert... - Réparation du coffre... - Riparando il Caveau - Reparando Cofre... - Naprawiam skarbiec... - 修理金库... - - - The vault is now fixed and re-secured. - Klenba je nyní pevně stanovena a re-zabezpečeny. - La bóveda esta reparada y segura. - - Der Tresor wurde repariert. - Le coffre est de nouveau sécurisé. - Il Caveau è stato riparato e messo in sicurezza. - O Cofre foi consertado e está seguro. - Skarbiec jest naprawiony i zabezpieczony. - 金库现在已修复并重新加固。 - - - The vault is already locked? - Klenba je již uzamčen? - La bóveda ya esta cerrada? - - Ist der Tresor abgeschlossen? - Le coffre est déjà fermé? - Il Caveau è già bloccato? - O Cofre está trancado? - Skarbiec jest zablokowany? - 金库已经锁好了? - - - You can't enter anything below 1! - Nemůžete nic zadávat menší než 1! - No puede poner nada menor que 1! - - Du kannst nichts unter 1 eingeben! - Vous ne pouvez pas prendre moins de 1 objet ! - Non puoi selezionare nulla sotto l'1! - Não é permitido usar valores abaixo de 1! - Nie możesz wprowadzić niczego poniżej 1! - 你不能输入少于1的任何物品! - - - You can't store anything but gold bars in the safe. - Nemůžete ukládat nic jiného než zlaté pruty v trezoru. - Solo puedes guardar barras de oro en la bóveda. - - Du kannst nur Goldbarren in den Tresor legen. - Vous ne pouvez rien stocker à part des lingots d'or dans le coffre. - Nella cassaforte puoi depositare solo lingotti d'oro. - Você só pode guardar Barras de Ouro no cofre. - Nie możesz składować niczego poza sztabami złota w sejfie. - 保险箱除了金条外,你不能存放其它物品。 - - - You don't have %1 gold bar(s) - Nemáte%1 zlatá tyč (y) - No tienes %1 barra(s) de oro - - Du hast keine %1 Goldbarren! - Vous n'avez pas %1 lingot(s) d'or - Non hai %1 lingotti d'oro - Você não tem %1 Barra(s) de Ouro - Nie masz %1 sztab(y) złota - 你没有 %1 根金条 - - - Couldn't remove the item(s) from your inventory to put in the safe. - Nepodařilo se odstranit položky) z inventáře dát do trezoru. - No se pudieron mover las objetos de tu inventario a la caja. - - Es konnten keine Gegenstände von deinem Inventar in den Tresor gelegt werden. - Vous ne pouvez pas supprimer les items de votre inventaire pour les mettre dans le coffre. - Non è stato possibile rimuovere gli oggetti dal tuo inventario per metterli nella cassaforte. - Não foi possível mover o item do inventário para o cofre. - Nie można usunąć rzeczy z twojego wyposażenia aby włożyć je do sejfu - 无法从你的库存中取出物品放在保险箱里。 - - - Couldn't search %1 - Nemohl hledání%1 - No se pudo buscar a %1 - - %1 konnte nicht durchsucht werden. - Impossible de fouiller %1 - Impossibile ispezionare %1 - Não foi possível buscar por %1 - Nie można przeszukać %1 - 无法搜索 %1 - - - Repairing Door... - Oprava dveří ... - Reparando Puerta... - - Tür wird repariert... - Réparation de la porte... - Riparando la porta... - Reparando a porta.... - Naprawiam drzwi... - 修理门... - - - No Licenses<br/> - Žádné Licence < br / > - No Licencias<br/> - - Keine Lizenzen!<br/> - Aucune licence<br/> - Nessuna Licenza<br/> - Você não tem licença<br/> - Brak licencji<br/> - 没有许可证<br/> - - - No one has sold to this dealer recently. - Nikdo se prodalo tohoto prodejce nedávno. - Nadie le ha vendido a este comerciante recientemente. - - Niemand hat kürzlich an diesem Dealer etwas verkauft. - Personne n'est venu vendre quelque chose ici récemment. - Non è stato visto nessuno vendere a questo spacciatore di recente. - Ninguém vendeu para esse negociante recentemente - Nikt nie sprzedawał ostatnio u dilera. - 最近没有人出售物品给这个经销商。 - - - The following people have been selling to this dealer recently. - Následující lidé byli prodeji tohoto prodejce nedávno. - Las siguientes personas le han estado vendiendo a este comerciante recientemente. - - Folgende Personen haben kürzlich an diesem Dealer etwas verkauft: - Les personnes suivantes sont venues vendre quelque chose récemment. - Le seguenti persone sono state viste vendere a questo spacciatore. - Os seguintes jogadores venderam para esse negociante recentemente. - Ostatnio u dilera sprzedawali następujący ludzie. - 以下人员最近一直在向这个经销商销售物品。 - - - Radar - Radar - Radar - - Radar - Radar - Autovelox - Radar - Radar - 测速雷达 - - - Vehicle Speed %1 km/h - Rychlost vozidla%1 km / h - Velocidad %1 km/h - - Geschwindigkeit: %1 km/h! - Vitesse du véhicule %1 km/h - Velocità veicolo %1 km/h - Velocidade do Veículo %1 km/h - Prędkość pojazdu %1 km/h - 载具速度 %1 km/h - - - You have been released automatically for excessive restrainment time - Byli jste automaticky uvolněn pro nadměrnou restrainment čas - Has sido liberado automáticamente por tiempo excesivo de estar retenido. - - Du wurdest automatisch freigelassen, da die maximale Verhaftungszeit überschritten wurde. - Vous avez été démenotté automatiquement pour un menottage excessivement long - Sei stato automaticamente liberato per essere rimasto ammanettato troppo tempo - Você foi solto automaticamente, devido ao tempo limite ter expirado. - Zostałeś automatycznie rozkuty z uwagi na długi upływ czasu od skucia. - 由于约束时间过长你已经被自动释放 - - - You have been restrained by %1 - Byli jste omezeni%1 - Has sido retenido por %1 - - Du wurdest von %1 festgenommen. - Vous avez été menotté par %1 - %1 ti ha messo le manette - Você foi imobilizado por %1 - Zostałeś rozkuty przez %1 - 你被 %1 约束了 - - - Who do you think you are? - Kdo si myslíš že jsi? - Qui pensez-vous être? - ¿Quién te crees que eres? - Chi ti credi di essere? - Za kogo Ty się masz? - Quem você pensa que é? - Кто ты, по-твоему, такой? - Was glaubst du wer du bist? - 你以为你是谁? - - - You must select a perp. - Je třeba vybrat pachatele. - Vous devez sélectionner une personne. - Debe seleccionar un asesino. - È necessario selezionare un criminale. - Musisz wybrać perp. - Você deve selecionar um criminoso. - Вы должны выбрать преступника. - Du musst einen Verbrecher auswählen. - 你必须选择一个罪犯。 - - - You must select a crime. - Je třeba vybrat trestného činu. - Vous devez sélectionner un crime. - Debe seleccionar un crimen. - È necessario selezionare un crimine. - Musisz wybrać przestępstwa. - Você deve selecionar um crime. - Вы должны выбрать преступление. - Du musst ein Verbrechen auswählen. - 你必须选择一种犯罪行为。 - - - Failed to fetch crimes. - Nepodařilo se načíst trestných činů. - Impossible de récupérer les crimes. - No se pudieron obtener los crímenes. - Impossibile recuperare i crimini. - Nie udało się pobrać przestępstw. - Falha ao buscar crimes. - Не удалось получить преступления. - Die Verbrechen konnten nicht heruntergeladen werden. - 无法搜索犯罪记录。 - - - - - You tried to give %1 %2 %3 but they couldn't hold that so it was returned. - Pokusili jste se dát% %1 %2 3, ale nemohli si myslí, že tak to bylo se vrátil. - Le tratastes de dar %1 %2 %3 pero no tenian espacio asi que se te devolvió. - - Du wolltest %1 %2 %3 geben, aber er hat keinen Platz in seinem Inventar und hat es darum zurückgegeben. - Vous avez essayé de donner %1 %2 %3 mais il n'a pas assez de place et vous a tout redonné. - Hai provato a dare a %1 %2 unità di %3 ma non poteva trasportarlo quindi ti sono state restituite restituite. - Você tentou dar %1 %2 %3, mas não conseguiu segurar e por isso que foi devolvido. - Próbowałeś dać %1 %2 %3 lecz gracz nie mógł tego unieść, przedmioty zostały zwrócone. - 你试着给 %1 %2 %3 但他们不能持有,所以物品被归还。 - - - %1 returned %2 %3 because they couldn't hold that amount. - %1 vrátila% %2 3, protože oni nemohli držet tuto částku. - %1 devolvió %2 %3 porque no tenian espacio. - - %1 hat %2 %3 zurückgegeben, weil er nicht so viel tragen kann. - %1 vous a redonné %2 %3 parce qu'il ne pouvait pas en prendre autant. - %1 ha restituito %2 %3 perchè non poteva trasportare quella quantità - %1 retornou %2 %3 porque não conseguiu segurar essa quantidade. - %1 zwrócił %2 %3 ponieważ nie mógł tego unieść - %1 返还 %2 %3 因为他们拿不出这笔钱。 - - - %1 has gave you %2 but you can only hold %3 so %4 was returned back. - %1 vám již dal%2, ale můžete mít pouze% %3 4 tak byla vrácena zpět. - %1 te a dado %2, pero solo puedes cargar %3 asi que %4 fue devuelto. - - %1 hat dir %2 gegeben, du kannst aber nur %3 tragen, also hast du %4 zurückgegeben. - %1 vous a donné %2 mais vous ne pouvez en prendre que %3 donc %4 a été redonné. - %1 ti ha dato %2 ma puoi portare solo %3 quindi %4 unità sono state restituite. - %1 retornou %2 %3 porque não conseguiu segurar essa quantidade. - %1 dał ci %2 lecz możesz unieść tylko %3, w związku z tym zwróciłeś %4. - %1 已经给了你 %2 但你只能持有 %3 所以 %4 被退回. - - - Do you want to add this item to your weapon or inventory? If you add it to your weapon your current existing attachment will be lost! - Chcete přidat tuto položku do zbraně nebo inventáře? Pokud si jej přidat do svého zbraň váš současný stávající příloha bude ztraceno! - Quieres agregar este Objeto/Arma a tu inventario? Si lo agregas a tu arma tu accesorio actual se perdera! - - Möchtest du den Aufsatz zu deiner Waffe oder deinem Inventar hinzufügen? Wenn du es zur Waffe hinzufügst, geht der vorhandene Aufsatz verloren! - Voulez-vous ajouter cet objet à votre arme ou le mettre dans votre inventaire? Si vous l'ajoutez à votre arme, votre accessoire actuel sera perdu! - Vuoi aggiungere questo oggetto alla tua arma o all'inventario? Se lo aggiungerai all'arma verrà rimosso l'eventuale accessorio già presente su di essa! - Você quer adicionar este item à sua arma ou inventário? Se você adicioná-lo à sua arma seu item atual existente será perdida! - Chcesz dodać tę rzecz do broni lub wyposażenia? Jeśli to zrobisz twoje aktualne wyposażenie broni zostanie zmienione na nowo zakupione i przepadnie! - 你想把这个物品添加到你的武器或库存中吗?如果你把它添加到你的武器,你当前的现有附件将会丢失! - - - Attachment slot taken! - Attachment slot vzít! - Slot de accesorio tomado! - - Aufsatz Platz belegt! - Accessoire déjà présent! - Slot Accessorio preso! - Slot de acessório utilizado! - Podjąłeś slot - 附件插槽! - - - Weapon - Zbraň - Arma - - Waffe - Armes - Arma - Armas - Broń - 武器 - - - Inventory - Inventář - Inventario - - Inventar - Inventaire - Inventario - Inventário - Wyposażenie - 库存 - - - You are not allowed to look into someone's backpack! - Nejste dovoleno dívat se do něčí batohu! - No tienes permiso de ver dentro de las mochilas de los demas! - - Du bist nicht berechtigt, in fremde Rucksäcke zu schauen! - Vous n'êtes pas autorisé à regarder dans le sac à dos de quelqu'un! - Non sei autorizzato a guardare negli zaini altrui! - Você não é liberado para olhar a mochila dos outros! - Nie możesz zaglądać do czyichś plecaków! - 你不允许看别人的背包! - - - You are not allowed to access this vehicle while its locked. - Nemáte povolen přístup k toto vozidlo zatímco jeho uzamčen. - No tienes permiso de accesar este vehículo mientras esta cerrado. - - Du bist nicht berechtigt, auf dieses Fahrzeug zuzugreifen, während es abgeschlossen ist. - Vous n'êtes pas autorisé à accéder à ce véhicule tant qu'il est verrouillé. - Non ti è permesso l'accesso a questo veicolo mentre è bloccato. - Você não pode acessar o veiculo enquanto ele estiver trancado. - Nie masz dostępu do pojazdu gdy ten jest zamknięty - 你不能在锁门的情况下进入载具。 - - - This vehicle's trunk is in use, only one person can use it at a time. - kmen toto vozidlo je v provozu, může jen jedna osoba ji použít najednou. - El maletero de este vehículo solo puede ser usado por una persona a la vez. - - Der Kofferraum dieses Fahrzeuges wird bereits benutzt, nur eine Person kann auf ihn zugreifen. - Le coffre de ce véhicule est en cours d'utilisation, une seule personne peut l'utiliser à la fois. - L'inventario di questo veicolo è in uso, può essere usato solo da una persona alla volta. - A mala desse veículo está em uso, somente uma pessoa pode acessá-la de cada vez. - Bagażnik pojazdu jest w użyciu, na raz może korzystać z niego tylko jedna osoba. - 这载具的存储箱正在使用中,一次只能一个人使用它。 - - - Failed Creating Dialog - Nepodařilo Vytvoření dialog - Falló la creación del dialogo - - Erstellen des Dialogs gescheitert! - Échec à la création de dialogue - Creazione dialogo fallito - Falha ao criar Diálogo - Nie udało się nawiązać kontaktu - 创建对话框失败 - - - You have unlocked your vehicle. - Jste odemkli své vozidlo. - Has abierto tu vehículo - - Du hast dein Fahrzeug aufgeschlossen. - Vous avez déverrouillé votre véhicule. - Hai sbloccato il tuo veicolo. - Você destrancou o veículo. - Odblokowałeś pojazd - 你已经解锁了你的载具。 - - - You have locked your vehicle. - Jste zamkli své vozidlo. - Has cerrado tu vehículo. - - Du hast dein Fahrzeug abgeschlossen. - Vous avez verrouillé votre véhicule. - Hai bloccato il tuo veicolo - Você trancou o veículo. - Zablokowałeś pojazd - 你已经锁好你的车了。 - - - This can only be done by the last driver of this vehicle. - This can only be done by the last driver of this vehicle. - This can only be done by the last driver of this vehicle. - This can only be done by the last driver of this vehicle. - This can only be done by the last driver of this vehicle. - This can only be done by the last driver of this vehicle. - This can only be done by the last driver of this vehicle. - This can only be done by the last driver of this vehicle. - This can only be done by the last driver of this vehicle. - 这只能由该车辆的最后一个驾驶员完成。 - - - Sirens On - Na sirény - Sirenas Prendidas - - Sirene AN - Sirènes On - Sirene accese - Sirene Ligada - Syrena włączona - 开启警笛 - - - Sirens Off - sirény Off - Sirenas Apagadas - - Sirene AUS - Sirènes Off - Sirene spente - Sirene Desligada - Syrena wyłączona - 关闭警笛 - - - You need to install storage containers to have storing capabilities! - Je třeba nainstalovat kontejnery skladovací mít skladovací kapacity! - Debes instalar contenedores para tener capabilidades de almacenamiento! - - Du musst dir Container kaufen, um etwas einlagern zu können! - Vous devez installer des conteneurs de stockage pour disposer de capacité de stockage! - Devi posizionare dei contenitori per aver la possibilità di depositare qualcosa! - Você tem que instalar caixas para poder guardar items! - Musisz zainstalować pojemniki aby uzyskać możliwość składowania rzeczy - 你需要安装存储容器才能具有存储功能! - - - This vehicle isn't capable of storing virtual items. - Toto vozidlo není schopné uchovávat virtuální položky. - Este vehiculo no puede guardar objetos virtuales. - - Dieses Fahrzeug kann keine virtuellen Gegenstände lagern. - Ce véhicule n'est pas en mesure de stocker des objets virtuels. - Questo veicolo non è in grado di trasportare oggetti virtuali. - Esse veículo não pode armazenar items virtuais. - Ten pojazd nie przechowuje wirtualnych przedmiotów - 此载具无法存储虚拟物品。 - - - Weight: - Hmotnost: - Peso: - - Gewicht: - Poids: - Peso: - Peso: - Waga: - 重量: - - - House Storage - dům Storage - Inventario de la casa - - Lagerplatz des Hauses - Conteneur de stockage - Inventario Casa - Cavalos de Força: - Domowa skrzynka - 房子存储 - - - Vehicle Trunk - vozidlo Trunk - Maletero de Vehículo - - Kofferraum - Coffre du véhicule - Inventario veicolo - Capacidade da mala: - Bagażnik pojazdu - 载具存储箱 - - - The vehicle either doesn't exist or is destroyed. - Vozidlo buď neexistuje, nebo je zničena. - El vehículo no existe o fue destruido. - - Le véhicule n'existe pas ou a été détruit. - Entweder existiert das Fahrzeug nicht oder es wurde zerstört. - Il veicolo non esiste o è stato distrutto. - Veículo não existe ou está destruido. - Pojazd nie istnieje lub jest zniszczony - 载具要么不存在要么被毁坏。 - - - Invalid number format - Neplatný formát number - Formato de numero inválido - - Ungültiges Zahlenformat! - Format de nombre invalide - Formato numerico non valido - Formato de número inválido. - Niepoprawny format liczby - 数字格式无效 - - - You can't enter anything below 1! - Nemůžete nic zadávat menší než 1! - No puedes poner nada menos que 1! - - Du kannst nichts unter 1 eingeben! - Vous ne pouvez pas prendre moins d'1 objet ! - Non puoi inserire nulla al di sotto di 1! - Você não pode digitar nada abaixo de 1! - Nie możesz wprowadzić niczego poniżej 1! - 你不能输入少于1的任何物品! - - - The vehicle doesn't have that many of that item. - Vozidlo nemá že mnohé z této položky. - El vehículo no tiene tantos de ese objeto. - - Das Fahrzeug hat nicht so viele dieser Gegenstände. - Le véhicule ne contient pas autant de cet objet. - Il veicolo non contiene così tanti oggetti. - O veículo não tem essa quantidade de items. - Pojazd nie posiada takiej ilości rzeczy. - 载具没有那么多的物品。 - - - Your sound was set to normal mode! - Váš zvuk byl nastaven do normálního režimu! - Votre son a été augmenté! - Tu sonido fue puesto en modo normal! - Il vostro sound è stato impostato in modalità normale! - - Die Lautstärke ist wieder normal! - Seu som voltou ao normal! - Dzwięk został ustawiony w tryb normalny! - 你的声音被设置为正常模式! - - - Your sound was set to fade mode! - Váš zvuk byl nastaven do režimu slábnout! - Votre son a été diminué! - Tu sonido fue puesto en modo bajo! - Il vostro sound è stato impostato in modalità a svanire! - - Deine Lautstärke wurde in den "Fade-Mode" geändert! - Seu som está abafado. - Dzwięk został ustawiony w tryb wyciszony! - 你的声音被设置为静音模式! - - - An RPG game mode developed by Tonic. - Mód RPG hra vyvinutá Tonic. - Un mode de jeu de RPG développé par Tonic. - Un modo de juego de rol desarrollado por Tonic. - Una modalità di gioco RPG sviluppato da Tonic. - Tryb gry RPG stworzona przez Tonic. - Um modo de jogo RPG desenvolvido pela Tonic. - Режим RPG игра, разработанная компанией Tonic. - Ein RPG-Modus entwickelt von Tonic. - 由Tonic开发的RPG游戏模式。 - - - - - Error saving container, couldn't locate house? - Chyba při ukládání kontejner, nemohl najít dům? - Error al salvar contenedor, no se pudo encontrar la casa? - - Fehler beim Speichern der Container: Es konnte kein Haus gefunden werden. - Erreur lors de la sauvegarde des conteneurs, impossible de localiser la maison. - Errore nel salvataggio del contenitore, impossibile trovare la cas a? - Erro ao salvar a caixa, não foi possível encontrar a casa. - Błąd w zapisywaniu pojemnika, nie można zlokalizować domu. - 保存库存错误,找不到房子? - - - You are not allowed to access this storage container without the owner opening it. - Nemáte povolen přístup k tomuto skladovacího kontejneru, aniž by majitel otevření. - No tienes permiso de acceder este contenedor, sin el dueño haberlo abierto. - - Du bist nicht berechtigt, auf diesen Container zuzugreifen, ohne dass der Besitzer ihn aufgeschlossen hat. - Vous n'êtes pas autorisé à accéder à ce conteneur de stockage sans que le propriétaire ne l'ouvre. - Non sei autorizzato ad accedere a questo contentitore senza il permesso del proprietario. - Você so pode acessar a caixa se o dono deixar ela aberta. - Nie masz dostępu do pojemnika dopóki właściciel go nie otworzy. - 除非所有者打开此库存,否则不允许访问该库存。 - - - There are no houses near you. - Nejsou žádné domy u vás. - No hay casas cerca de ti. - Non ci sono case vicino a voi. - Brak domy w pobliżu ciebie. - - Il n'y a aucune maison près de vous. - Não há casas perto de você. - Es gibt keine Häuser in deiner Nähe. - 你在附近没有房子。 - - - The storage box is over the stairs! - Úložný box je u konce schodů! - Le conteneur est dans les escaliers! - La caja de almacenamiento está sobre las escaleras! - Il contenitore è sopra le scale! - Schowek jest na schodach! - A caixa de armazenamento é sobre as escadas! - Ящик для хранения находится над лестницей! - Der Container ist über die Treppe! - 存储箱在楼梯上! - - - You are not the owner of the house. - Nejste vlastníkem domu. - No eres el dueño de la casa. - Non sei il proprietario della casa. - Nie jesteś właścicielem domu. - - Vous n'êtes pas le propriétaire de la maison. - Você não é o dono da casa. - Du bist nicht der Eigentümer des Hauses. - 你不是房子的主人。 - - - You have unlocked the door. - Jste odemkl dveře. - Has abierto la puerta. - - Du hast die Tür aufgeschlossen. - Vous avez ouvert la porte. - Hai sbloccato la porta. - Você destrancou a porta. - Odblokowałeś drzwi. - 你打开了门。 - - - You have locked the door. - Jste zamkli dveře. - Has cerrado con llave la puerta. - - Du hast die Tür abgeschlossen. - Vous avez fermé à clé la porte. - Hai bloccato la porta. - Você trancou a porta. - Zablokowałeś drzwi. - 你锁上了门。 - - - You are not near a door! - Nejste u dveří! - No estas cerca de una puerta! - - Keine Tür in der Nähe! - Vous n'êtes pas près d'une porte! - Non sei vicino ad una porta! - Você não está perto de uma porta! - Nie jesteś przy drzwiach! - 你不在门附近! - - - This house was recently sold and is still processing in the database. - Tento dům byl nedávno prodán a je stále zpracovává v databázi. - Esta casa fue vendida recientemente y esta procesando datos. - - Dieses Haus wurde vor Kurzem verkauft. - Cette maison a été récemment vendue et est en cours de traitement dans la base de données. - Questa casa è stata venduta di recente ed il database la sta ancora processando. - Essa casa já foi vendida, estamos processando a ordem de compra - Ten dom został ostatnio sprzedany i trwa jego przetwarzanie w bazie danych. - 这套房子最近已售出,目前仍在数据库中处理。 - - - You do not have a home owners license! - Nemáte majitelům licenci doma! - No tienes licencia mobiliaria! - - Du hast keine Eigentumsurkunde! - Vous n'avez pas le permis de propriétaires de maison! - Non hai la licenza per il possesso delle case! - Você não tem um Registro Civil para comprar casas! - Nie masz licencji zarządcy nieruchomości! - 你没有房产许可证! - - - You can only own %1 houses at a time. - Můžete vlastnit pouze%1 domy najednou. - Solo puedes ser dueño de %1 casas a la vez. - - Du darfst nur %1 Häuser zugleich besitzen. - Vous ne pouvez posséder que %1 maisons à la fois. - Puoi possedere solo %1 case - Você só pode ter %1 casa(s)! - Możesz posiadać maksymalnie %1 domów. - 你一次只能拥有 %1 套房子。 - - - You do not have enough money! - Nemáte dost peněz! - No tienes suficiente dinero! - - Du hast nicht genug Geld! - Vous n'avez pas assez d'argent! - Non hai fondi a sufficienza! - Você não tem todo esse dinheiro! - Nie masz tyle pieniędzy! - 你没有足够的钱! - - - This house is available for <t color='#8cff9b'>$%1</t><br/>It supports up to %2 storage containers - Tento dům je k dispozici pro <t color='#8cff9b'>$%1</t><br/> Podporuje až %2 skladovací kontejnery - Esta casa esta disponible por <t color='#8cff9b'>$%1</t><br/>Soporta hasta %2 contenedores - - Dieses Haus kostet <t color='#8cff9b'>$%1</t><br/>. Es unterstützt %2 Container. - Cette maison est disponible pour <t color='#8cff9b'>$%1</t><br/> Il prend en charge jusqu'à %2 conteneurs de stockage - Questa casa è disponibile per <t color='#8cff9b'>$%1</t><br/>Può supportare fino a %2 contenitori - Essa casa está disponível por <t color='#8cff9b'>R$%1</t><br/>Ela suporta até %2 caixa(s) - Ten dom jest dostępny za <t color='#8cff9b'>$%1</t><br/>Ma %2 miejsca na pojemniki do przechowywania wyposażenia - 这所房子可以住 <t color='#8cff9b'>$%1</t><br/>它最多支持 %2 个存储箱 - - - Purchase House - nákup domu - Comprar Casa - - Haus kaufen - Acheter la Maison - Compra Casa - Comprar Casa - Kup dom! - 购买房子 - - - This house doesn't belong to anyone. - Tento dům nepatří nikomu. - Esta casa no tiene dueño. - - Dieses Haus gehört niemandem. - Cette maison n'appartient à personne. - Questa casa non appartiene a nessuno. - Essa casa não tem dono. - Ten dom nie ma właściciela. - 这套房子不属于任何人。 - - - This person is not online there for you cannot raid their house! - Tato osoba není on-line proto nelze nájezd svůj dům! - No puedes asaltar esta casa, porque el dueño no esta en linea! - - Der Hausbesitzer ist nicht online, daher kannst du sein Haus nicht durchsuchen! - Cette personne n'est pas sur l'île, vous ne pouvez pas perquisitionner cette maison! - Questa persona non è online quindi non puoi perquisire la sua casa! - O dono da casa não está online, você não pode vasculhar a casa! - Osoba nie jest na serwerze, nie możesz przeszukać domu. - 房子主人不在线,你不能搜查房子! - - - The door is already unlocked! - Dveře jsou již odemčené! - La puerta ya esta abierta! - - Die Tür ist bereits offen! - La porte est déjà débloqué! - La porta è già sbloccata! - A porta está destrancada! - Drzwi są już odblokowane! - 门已经解锁了! - - - The door is already locked! - Dveře jsou již zamčené! - La porte est déjà fermée! - La puerta ya esta cerrada con llave! - La porta è già chiusa a chiave! - - Die Tür ist bereits verriegelt! - Esta porta já está trancada! - Drzwi są już zablokowane! - 门已经锁好了! - - - Breaking lock on door - Lámání zámek na dveřích - Rompiendo la cerradura de la puerta. - - Türschloss wird aufgebrochen... - En train de casser la serrure - Sbloccando la porta - Quebrando a fechadura da porta - Wyłamuje zablokowane drzwi... - 撬开门锁 - - - %1 your house is being raided by the cops! - %1 vašeho domu je vpadl policajti! - %1 tu casa esta siendo asaltada por los policías! - - %1 dein Haus wird von der Polizei durchsucht! - %1, votre maison est perquisitionnée par les policiers ! - %1 la Polizia si sta introducendo in casa tua! - %1 Sua casa está sendo vasculhada pela Policia! - %1 twój dom jest kontrolowany przez policję! - %1 的房子被警察搜查了! - - - House Owner - Majitel domu - Dueño de la casa - - Hauseigentümer - Propriétaire - Proprietario Casa - Proprietário - Właściciel domu - 房子主人 - - - There is nothing in this house. - Není nic v tomto domě. - Esta casa esta vacía. - - Es gibt nichts in diesem Haus. - Il n'y a rien dans cette maison - In questa casa non c'è nulla. - Essa casa está vazia. - Nie znaleziono niczego nielegalnego. - 房子里什么也没有。 - - - Searching House... - Vyhledávání dům ... - Buscando Casa... - - Haus wird durchsucht... - Perquisition de la Maison... - Perquisendo la Casa... - Vasculhando a casa... - Przeszukuję dom... - 搜索房子... - - - You went too far away from the house! - Jste zašel příliš daleko od domu! - Te alejastes mucho de la casa! - - Du hast dich zu weit vom Haus entfernt! - Vous vous êtes trop éloigné de la maison! - Sei andato troppo distante dalla casa! - Você está muito distante da casa! - Jesteś za daleko od domu! - 你离房子太远了! - - - A house was raided and had $%1 worth of drugs / contraband. - Dům byl vpadl a měl $%1 v hodnotě drog / kontrabandu. - Una casa fue asaltada y se econtraron $%1 en drogas / contrabando. - - Ein Haus wurde durchsucht und es wurden Drogen / Schmuggelware im Wert von $% gefunden. - Une maison a été perquisitionné et avait $%1 de drogue / contrebande. - Una casa è stata perquisita e sono stati trovati $%1 in materiali illegali. - A casa assaltada tem R$%1 em drogas ou contrabandos. - Podczas przeszukania domu znaleziono kontrabandę o wartości $%1. - 一所房子被搜查,查获价值 $%1 的毒品/违禁品。 - - - Nothing illegal in this house. - Nic nezákonného v tomto domě. - Nada ilegal en esta casa. - - Nichts Illegales in diesem Haus. - Rien d'illégal dans cette maison - Questa casa non contiene nulla d'illegale. - Nada ilegal nessa casa. - Nie znaleziono niczego nielegalnego. - 这房子没有违法物品。 - - - House storage unlocked - Dům skladování odemkl - Inventario de la casa abierto - - Lagerplatz des Hauses aufgeschlossen. - Stockage de la maison déverrouillé - Contenitori della casa sbloccati - Armário da casa destrancado - Pojemnik odblokowany - 房子存储箱解锁 - - - House storage locked - Dům skladování zamčené - Inventario de la casa cerrado con llave - - Lagerplatz des Hauses abgeschlossen. - Stockage de Maison verrouillé - Contenitori della casa bloccati - Armário da casa trancado - Pojemnik zablokowany - 房子存储箱锁定 - - - Locking up house please wait... - Zamykání domu čekejte prosím ... - La casa se esta cerrando con llave, por favor espere... - - Haus wird abgeschlosen, bitte warten... - Fermeture de la maison, veuillez patienter... - Bloccando la casa, attendere prego... - Trancando a casa, aguarde... - Blokuję zamykam dom proszę czekać... - 房子锁定中请稍等... - - - House has been locked up. - Dům byl zamčený. - La maison a été verrouillée. - La casa se a cerrado con llave. - - Haus wurde abgeschlossen. - La casa è stata bloccata. - Sua casa foi trancada! - Dom został zablokowany / zamknięty! - 房子被锁定。 - - - Are you sure you want to sell your house? It will sell for: <t color='#8cff9b'>$%1</t> - Jste si jisti, že chcete prodat svůj dům? To se bude prodávat za: <t color='#8cff9b'>$%1</t> - Estas seguro de que quieres vender tu casa? Se vendera por: <t color='#8cff9b'>$%1</t> - - Bist Du sicher, dass du dein Haus verkaufen möchtest? Du würdest dafür <t color='#8cff9b'>$%1</t> bekommen. - Etes-vous sûr de vouloir vendre votre maison? Elle se vendra pour: <t color='#8cff9b'>$%1</t> - Sei sicuro di voler vendere la tua casa? La venderai per: <t color='#8cff9b'>$%1</t> - Você tem certeza que deseja vender a casa? O valor de venda é: <t color='#8cff9b'>R$%1</t> - Jesteś pewny że chcesz sprzedać dom za <t color='#8cff9b'>$%1</t> - 你确定要卖掉你的房子吗?出售价格:<t color='#8cff9b'>$%1</t> - - - Are you sure you want to remove it? - Jsou si jisti, že jej chcete odstranit? - Estas seguro de que lo quieres remover? - Sei sicuro di voler rimuovere esso? - Czy na pewno chcesz go usunąć? - - Etes-vous sûr de vouloir supprimer le conteneur ? - Você tem certeza que quer remover isso? - Bist du sicher, dass du den Container entfernen möchtest? - 你确定要删除存储箱吗? - - - This house is already owned even though you shouldn't be seeing this hint... - Tento dům je již ve vlastnictví i když by nemělo být vidět tuto radu ... - Cette maison a déjà un propriétaire, même si vous ne devriez pas voir ce message ... - Esta casa es de propiedad ya pesar de que no debería estar viendo esta pista ... - Questa casa è già di proprietà, anche se non si dovrebbe essere visto questo suggerimento ... - Ten dom jest już własnością, nawet jeśli nie należy widzieć tę wskazówkę ... - Esta casa já é de propriedade mesmo que você não deveria estar vendo essa dica ... - Этот дом уже находится в собственности, даже если вы не должны видеть эту подсказку ... - Dieses Haus befindet sich bereits in deinem Besitz. Diesen Hinweis solltest du eigentlich gar nicht sehen... - 尽管你不该看到这个提示,但这所房子已经有房主了... - - - There is no owner for this house. - Neexistuje žádný majitel tohoto domu. - Il n'y a pas le propriétaire de cette maison. - No hay ningún propietario de esta casa. - Non vi è alcun proprietario per questa casa. - Nie ma właściciel tego domu. - Não há proprietário para esta casa. - Там нет владельца для этого дома. - Es gibt keinen Eigentümer für dieses Haus. - 这房子没有主人. - - - - - Food - Jídlo - Faim - Comida - Cibo - Jedzenie - - Hunger - Comida - 食物 - - - Health - Zdraví - Vie - Vida - Salute - Zdrowie - - Gesundheit - Vida - 健康 - - - Water - Voda - Soif - Agua - acqua - Woda - - Durst - Água - - - - - - There isn't a chopper on the helipad! - Není vrtulník na přistávací plocha pro vrtulník! - No hay un helicóptero en el Helipad. - - Es ist kein Helikopter auf dem Landeplatz! - Il n'y a pas d'hélicoptère sur l'héliport - Non c'è alcun elicottero sulla piazzola d'atterraggio - Não existe uma aeronave no heliponto! - W pobliżu nie ma helikoptera! - 直升机停机坪上没有直升机! - - - You need $1,000 to service your chopper - Musíte $ 1,000 servisních kontrol vrtulník - Necesitas $1,000 para reparar el helicóptero. - - Du benötigst $1,000, um deinen Helikopter zu warten. - Vous avez besoin de $1000 pour entretien de votre hélicoptère - Necessiti di $1.000 per fare manutenzione al tuo elicottero - Você precisa de R$1.000 para reparar a sua aeronave - Potrzebujesz $1000 aby serwisować helikopter - 你需要 $1,000 来维修你的直升机 - - - Servicing Chopper [%1]... - Servis Chopper [%1] ... - Reparando Helicóptero [%1]... - - Helikopter wird gewartet [%1]... - Entretien [%1]... - Manutenendo Elicottero [%1]... - Reparando aeronave [%1]... - Serwisuję helikopter [%1]... - 维修直升机 [%1]... - - - The vehicle is no longer alive or on the helipad! - Vozidlo je již nežije nebo na přistávací plocha pro vrtulník! - El vehiculo no esta vivo o en el helipad! - - Das Fahrzeug wurde zerstört oder befindest sich nicht mehr auf dem Helikopterlandeplatz! - L'hélicoptère est détruit ou n'est plus sur l'héliport! - Il veicolo non è più attivo sulla piazzola d'atterraggio! - "A aeronave não está mais disponível no heliponto! - Pojazd nie jest dłużej dostępny na lądowisku - 载具不再存在或停在停机坪上! - - - Your chopper is now repaired and refuelled. - Váš vrtulník není opraveno a tankovat. - Tu helicóptero esta reparado y lleno de combustible. - - Der Helikopter ist nun repariert und aufgetankt. - Votre hélicoptère est maintenant réparé et ravitaillé - L'elicottero è stato riparato e rifornito di carburante. - Sua aeronave está reparada e com o tanque cheio! - Helikopter został naprawiony i natankowany - 你的直升机现在已经修好并加满油。 - - - - - Marijuana leaf - marihuana list - Cannabis - - Kannabis - Cannabis - Cannabis - Maconha não Processada - Konopie - 大麻叶 - - - Apple - Jablko - Manzana - - Apfel - Pomme - Mela - Maçã - Jabłko - 苹果 - - - Apples - jablka - Manzanas - - Äpfel - Pommes - Mele - Maçãs - Jabłka - 很多苹果 - - - Heroin - Heroin - Heroina - - Heroin - Heroïne - Eroina - Heroína - Heroina - 海洛因 - - - Oil - Olej - Petróleo - - Öl - Pétrole - Olio - Petróleo - Benzyna - 石油 - - - Peach - Broskev - Melocotón - - Pfirsich - Pêche - Pesca - Pêssego - Brzoskwinia - 桃子 - - - Peaches - broskve - Melocotones - - Pfirsiche - Pêches - Pesche - Pêssegos - Brzoskwinie - 很多桃子 - - - Crude Oil - Ropa - Petróleo Crudo - - Unverarbeitetes Öl - Pétrole non raffiné - Olio non processato - Petróleo não Refinado - Ropa naftowa - 原油 - - - Processed Oil - Zpracovaný olej - Petróleo Procesado - - Verarbeitetes Öl - Pétrole raffiné - Olio processato - Petróleo Refinado - Olej napędowy - 成品油 - - - Opium Poppy - Mák setý - Planta del Opio - - Unverarbeitetes Heroin - Graine de pavot - Eroina non processata - Heroína não Processada - Heroina nieoczyszczona - 罂粟 - - - Heroin - Heroin - Heroina - - Verarbeitetes Heroin - Héroïne - Eroina processata - Heroína Processada - Heroina oczyszczona - 海洛因 - - - Pot - Hrnec - Marihuana - - Marihuana - Marijuana - Marijuana - Maconha Processada - Marihuana - 大麻 - - - Raw Rabbit - Raw Rabbit - Carne de Conejo - - Rohes Hasenfleisch - Viande de Lapin - Carne di coniglio - Carne de Coelho - Mięso zająca - 生兔肉 - - - Grilled Rabbit - grilované Rabbit - Conejo Asado - - Gegrilltes Hasenfleisch - Lapin grillé - Carne di coniglio alla griglia - Carne de coelho grelhado - Grilowany zając - 烤兔肉 - - - Raw Salema - Raw Salema - Salema Crudo - - Rohe Sardine - Filet de Saupe - Carne di Salmone - Peixe Salema - Mięso salemy - 生沙丁鱼肉 - - - Grilled Salema - Grilované Salema - Salema Cocinado - - Gegrillte Sardine - Sardine grillée - Sardine alla griglia - Sardinha Grelhada - Grilowana Salema - 烤沙丁鱼肉 - - - Raw Ornate - Raw Ozdobený - Ornate Crudo - - Roher Kaiserfisch - Filet d'Ornate - Carne di Orata - Carne Francesa - Mięso Ornata - 生梭鱼肉 - - - Grilled Ornate - grilované Ozdobený - Ornate Cocinado - - Gegrillter Kaiserfisch - Doré grillé - Angelfish alla griglia - Angelfish Grelhado - Grilowany Ornat - 烤梭鱼肉 - - - Raw Mackerel - Raw Makrela - Verdel Crudo - - Rohe Makrele - Filet de Maquereau - Carne di Sgombro - Peixe Cavalinha - Mięso Makreli - 生鲭鱼肉 - - - Grilled Mackerel - grilované makrely - Verdel Cocinado - - Gegrillte Makrele - Maquereau grillé - Sgombro alla griglia - Cavalinha Grelhada - Grilowana Makrela - 烤鲭鱼肉 - - - Raw Tuna - syrového tuňáka - Atún Crudo - - Roher Thunfisch - Filet de Thon - Carne di Tonno - Peixe Tuna - Mięso Tuńczyka - 生金枪鱼肉 - - - Grilled Tuna - grilované Tuna - Atún Cocinado - - Gegrillter Thunfisch - Thon grillé - tonno alla griglia - Atum Grelhado - Grilowany Tuńczyk - 烤金枪鱼肉 - - - Raw Mullet - Raw Mullet - Lisa Cruda - - Rohe Meerbarbe - Filet de Mulet - Carne di Triglia - Peixe Mullet - Mięso Cefala - 生鲻鱼肉 - - - Fried Mullet - Fried Mullet - Lisa Cocinada - - Frittierte Meerbarbe - Rouget frits - Triglia fritta - Mullet Fritado - Grilowany Cefal - 油炸鲻鱼肉 - - - Raw Catshark - Raw máčka - Pez Gato Crudo - - Roher Katzenhai - Filet de Poisson Chat - Carne di Squalo - Tubarão Gato - Mięso Rekina - 生鲨鱼肉 - - - Fried Catshark - Fried máčka - Pez Gato Cocinado - - Frittierter Katzenhai - Poisson-chat frit - profondo palombo fritti - Tubarão Gato Frito - Grilowany Rekin - 油炸鲨鱼肉 - - - Raw Turtle - Raw Turtle - Carne de Tortuga - - Rohes Schildkrötenfleisch - Viande de Tortue - Carne di Tartaruga - Carne de Tartaruga - Mięso Żółwia - 生海龟肉 - - - Turtle Soup - Turtle Soup - Sopa de Tortuga - - Schildkrötensuppe - Soupe à la Tortue - Zuppa di Tartaruga - Sopa de Tartaruga - Zupa z żółwia - 海龟肉汤 - - - Raw Chicken - Raw Chicken - Carne de Pollo - - Poulet cru - Rohes Hühnchenfleisch - pollo crudo - Galinha Crua - Surowy Kurczak - 生鸡肉 - - - Deep Fried Chicken - Smažené kuře - Pollo Frito - - Schwarz Frittiertes Hühnchen - Poulet frit - Nero Fried Chicken - Frango Frito - Smażony Kurczak - 炸鸡肉 - - - Raw Rooster - Raw Kohout - Carne de Gallo - - Coq cru - Rohes Hähnchenfleisch - Rooster Raw - Galo Cru - Surowy Kogut - 生公鸡肉 - - - Grilled Rooster - grilované Kohout - Gallo Asado - - Gegrilltes Hähnchen - Coq grillé - cazzo alla griglia - Galo Grelhado - Grilowany Kogut - 烤鸡肉 - - - Raw Goat - Raw Kozí - Carne de Cabra - - Rohes Ziegenfleisch - Chèvre crue - Carne di capra Raw - Carne de Cabra Crua - Surowa Koza - 生山羊肉 - - - Grilled Goat - grilovaný kozí - Cabra Asada - - Gegrilltes Ziegenfleisch - Chèvre grillée - Carne di capra alla griglia - Carne de Cabra Grelhada - Grilowana Koza - 烤山羊肉 - - - Raw Sheep - Raw Ovce - Carne de Obeja - - Rohes Schafsfleisch - Mouton cru - Carne di pecora grezza - Carne de Ovelha Crua - Surowa Owca - 生绵羊肉 - - - Grilled Sheep - grilované Ovce - Obeja Asada - - Gegrilltes Schafsfleisch - Mouton grillé - Mutton alla griglia - Mutton Grelhado - Grilowana Owca - 烤全羊肉 - - - Fishing Pole - Rybářský prut - Palo de Pesca - - Angel - Canne à pêche - Canna da pesca - Vara de Pescar - Wędka - 钓鱼竿 - - - Water Bottle - Láhev na vodu - Botella de Agua - - Wasserflasche - Bouteille d'eau - Bottiglia d'acqua - Garrafa d'água - Butelka wody - 瓶装水 - - - Coffee - Káva - Café - - Kaffee - Café - Caffè - Café - Kawa - 咖啡 - - - Donuts - koblihy - Donas - - Donuts - Donuts - Ciambelle - Rosquinha - Pączki - 甜甜圈 - - - Empty Fuel Canister - Prázdný palivo může - Bidón de Combustible Vacío - - Leerer Benzinkanister - Jerrican Vide - Tanica di carburante vuota - Tanque de Gasolina Vazio - Pusty kanister - 空汽油桶 - - - Full Fuel Canister - Plná palivo může - Bidón de Combustible Lleno - - Gefüllter Benzinkanister - Jerrican de Carburant - Tanica di carburante piena - Tanque de Gasolina Cheio - Pełny Kanister - 满汽油桶 - - - Defibrillator - defibrilátor - Desfibrilador - - Defibrillator - Défibrillateur - defibrillatore - Desfibrilador - defibrylator - 心脏除颤器 - - - Toolkit - Toolkit - Kit de Herramientas - - Werkzeugkit - Boîte à outils - kit di strumenti - conjunto de ferramentas - zestaw narzędzi - 维修包 - - - Pickaxe - Krumpáč - Pico - - Spitzhacke - Pioche - Piccone - Picareta - Kilof - 镐子 - - - Copper Ore - Měděná ruda - Cobre - - Kupfererz - Minerai de Cuivre - Minerale di Rame - Pepita de Cobre - Ruda miedzi - 铜矿石 - - - Iron Ore - Železná Ruda - Hierro - - Eisenerz - Minerai de Fer - Minerale di Ferro - Pepita de Ferro - Ruda żelaza - 铁矿石 - - - Iron Ingot - Železná cihla - Lingote de Hierro - - Eisenbarren - Lingot de Fer - Lingotto di ferro - Barra de Ferro - Sztabka żelaza - 铁锭 - - - Copper Ingot - měď ingotů - Lingote de Cobre - - Kupferbarren - Lingot de cuivre - Lingotto di Rame - Barra de Cobre - Sztabka miedzi - 铜锭 - - - Sand - Písek - Arena - - Sand - Sable - Sabbia - Areia - Piasek - 沙子 - - - Salt - Sůl - Sal - - Salz - Sel - Sale - Sal - Sól kopana - 盐矿 - - - Refined Salt - rafinovaný Salt - Sal Refinada - - Raffiniertes Salz - Sel traité - Sale raffinato - Sal Refinado - Sól rafinowana - 食盐 - - - Glass - Sklo - Vidrio - - Glas - Verre - Vetro - Vidro - Szkło - 玻璃 - - - Polished Diamond - leštěný Diamond - Diamante Pulido - - Geschliffene Diamanten - Diamant Taillé - Diamante tagliato - Diamante Lapidado - Diament szlifowany - 钻石抛光 - - - Uncut Diamond - Uncut Diamond - Diamante Bruto - - Ungeschliffene Diamanten - Diamant Brut - Diamante grezzo - Diamante Bruto - Diament surowy - 未切割钻石 - - - Tactical Bacon - Tactical Bacon - Tocino - - Taktischer Speck - Bacon tactique - Carne secca - Bacon Tático - Posiłek taktyczny - 战术培根 - - - RedGull - RedGull - RedGull - RedGull - RedGull - RedGull - RedGull - RedGull - RedGull - 红牛 - - - Lockpick - Šperhák - Ganzúa - - Dietrich - Outil de crochetage - Grimaldello - Chave Mestra - Wytrych - 开锁工具 - - - Rock - Skála - Piedra - - Stein - Pierre - Roccia - Pedra - Skała - 矿石 - - - Cement Bag - cement Bag - Bolsa de Cemento - - Zement Sack - Sac de ciment - Sacco di Cemento - Saco de Cimento - Worek cementu - 水泥 - - - Gold Bar - Gold Bar - Barra de Oro - - Goldbarren - Lingot d'or - Lingotto d'Oro - Barra de Ouro - Sztabka złota - 金条 - - - Blasting Charge - Trhací Charge - Carga Explosiva - - Sprengladung - Charge de dynamite - Carica Esplosiva - Explosivo - Ładunek wybuchowy - 爆破装置 - - - Bolt Cutter - Bolt Cutter - Cizalla - - Bolzenschneider - Outils de serrurier - Tronchese - Alicate - Nożyce do kłódek - 螺栓切割机 - - - Bomb Defuse Kit - Bomby zneškodnit Kit - Kit para Desarmar Bombas - - Bombenentschärfungskit - Outils de désamorçage - Attrezzi per il disinnesco - Kit anti-bomba - Zestaw saperski - 爆破拆除工具 - - - Small Storage Box - Malá přihrádka - Contenedor Pequeño - - Kleine Lagerbox - Petit Conteneur de stockage - Contenitore piccolo - Caixa Pequena - Mały pojemnik - 小储物箱 - - - Large Storage Box - Velký úložný box - Contenedor Grande - - Große Lagerbox - Grand Conteneur de stockage - Contenitore grande - Caixa Grande - Duży pojemnik - 大储物箱 - - - Coca Leaf - Coca Leaf - Hoja de Coca - - Unverarbeitetes Kokain - Feuille de Coca - Cocaina non processata - Cocaína não Refinada - Nieoczyszczona kokaina - 古柯叶 - - - Coke - Koks - Cocaína - - Verarbeitetes Kokain - Cocaïne - Cocaina processata - Cocaína Refinada - Oczyszczona kokaina - 可卡因 - - - Spike Strip - Spike Strip - Barrera de Clavos - - Nagelband - Herse - Striscia Chiodata - Tapete de Espinhos - Kolczatka drogowa - 钉刺带 - - - - - Driver License - Řidičský průkaz - Licencia de Conducir - - Führerschein - Permis de Conduire - Licenza di Guida - Licença de Motorista - Prawo jazdy - 小车驾驶证 - - - Pilot License - pilotní licence - Licencia de Piloto - - Pilotenschein - Licence de Pilote - Licenza da Pilota - Licença de Piloto - Licencja Pilota - 飞行员证 - - - Heroin Training - heroin Training - Entrenamiento de Heroina - - Heroinausbildung - Transformation d'Héroïne - Processo Eroina - Treinamento de Heroina - Wytwarzanie Heroiny - 海洛因加工证 - - - Oil Processing - Zpracování olej - Procesamiento de Petroleo - - Ölverarbeitung - Raffinage du pétrole - Processo Olio - Refinamento de Petróleo - Rafinacja ropy naftowej - 石油提炼证 - - - Diving License - potápěčské licence - Licencia de Buceo - - Taucherschein - Permis de Plongée - Licenza di Pesca - Licença de Mergulho - Licencja Nurka - 潜水证 - - - Boating License - Vodácký licence - Licencia de Botes - - Bootsschein - Permis Bateau - Licenza Nautica - Licença de Barco - Patent Motorowodny - 海员证 - - - Firearm License - zbrojní průkaz - Licencia de Armas - - Waffenschein - Permis de Port d'Arme - Porto d'Armi - Licença de Porte de Armas - Pozwolenie na broń - 持枪证 - - - Coast Guard License - Pobřežní stráž licence - Licencia de Guardia Costera - - Küstenwachenausbildung - Garde-Côtes - Licenza Guardia Costiera - Licença da Guarda Costeira - Trening straż przybrzeżna - 海岸警卫队证 - - - Rebel Training - Rebel Training - Entrenamiento Rebelde - - Rebellenausbildung - Entraînement rebelle - Licenza da Ribelle - Treinamento Rebelde - Trening rebelianta - 叛军训练 - - - Truck License - Truck licence - Licencia de Camiones - - LKW-Führerschein - Permis Poids Lourds - Licenza Camion - Licença de Caminhão - Prawo jazdy - ciężarówki - 货车驾驶证 - - - Diamond Processing - Diamond Processing - Procesamiento de Diamantes - - Diamantenverarbeitung - Taillage des Diamants - Processo Diamanti - Lapidação de Diamante - Szlifierz diamentów - 钻石加工厂 - - - Copper Processing - Zpracování měď - Procesamiento de Cobre - - Kupferverarbeitung - Fonte du Cuivre - Processo Rame - Processamento de Cobre - Wytapianie miedzi - 铜矿加工 - - - Iron Processing - Zpracování Iron - Procesamiento de Hierro - - Eisenverarbeitung - Fonte du Fer - Processo Ferro - Processamento de Ferro - Wytapianie żelaza - 铁矿加工 - - - Sand Processing - Zpracování písek - Procesamiento de Arena - - Sandverarbeitung - Traitement du Sable - Processo Sabbia - Processamento de Areia - Hutnik szkła z piasku - 玻璃制造证 - - - Salt Processing - sůl Processing - Procesamiento de Sal - - Salzverarbeitung - Traitement du Sel - Processo Sale - Processamento de Sal - Warzenie soli - 食盐制造证 - - - Cocaine Training - kokain Training - Entrenamiento de Cocaína - - Kokainausbildung - Transformation de la Cocaïne - Processo Cocaina - Treinamento de Cocaína - Oczyszczanie kokainy - 可卡因加工证 - - - Marijuana Training - Marihuana Training - Entrenamiento de Marihuana - - Marihuanaausbildung - Traitement du Cannabis - Processo Marijuana - Treinamento de Maconha - Suszenie konopi - 大麻加工证 - - - Cement Mixing License - Cement Mixing licence - Licencia para Mezclar Cemento - - Zementmisch-Lizenz - Fabrication du Ciment - Processo Cemento - Licença de Cimento - Wytwórca cementu - 水泥制造证 - - - Medical Marijuana License - Medical Marihuana Licence - Licencia de Marihuana Medicinal - - Medizinisches Marijuana-Lizenz - Licence de Cannabis Médical - Medical Marijuana Licenza - Licença Medical Marijuana - Medical Marijuana Licencji - 医用大麻许可证 - - - Home Owners License - Home Majitelé licence - Licencia Mobiliaria - - Eigentumsurkunde - Droit de Propriété - Licenza possesso Casa - Licença de Casas - Zarządca nieruchomości - 房产证 - - - - - This can only be used on a vault. - To lze použít pouze v trezoru. - Esto solo se puede usar en una bóveda. - - Dies kann nur an einem Tresor benutzt werden. - Cela ne peut être utilisé que sur un coffre-fort. - Può essere usata solo sulla cassaforte. - Isso só pode ser usado em um cofre. - Możesz tego użyć na skarbcu. - 这只能用于金库。 - - - There is already a charge placed on this vault. - Existuje již náboj umístěn na tomto trezoru. - Ya hay un explosivo puesto en esta bóveda - - Es gibt bereits eine Sprengladung am Tresor. - Une charge de dynamite est déjà placé sur ce coffre. - C'è già una carica piazzata sulla cassaforte. - Já existe uma carga colocada sobre esse cofre. - Już założono ładunek wybuchowy na skarbcu. - 这座金库已经安装爆破装置。 - - - The vault is already opened. - Klenba je již otevřen. - La bóveda ya esta abierta. - - Der Tresor ist bereits offen. - Le coffre est déjà ouvert. - La cassaforte è già aperta. - O cofre está aberto. - Skarbiec jest już otwarty. - 金库已经打开了. - - - A blasting charge has been placed on the federal reserves vault, You have till the clock runs out to disarm the charge! - S rozbuškami náboj byl umístěn na federální rezervy trezoru, jste až do hodiny vyčerpá odzbrojit náboj! - Una carga explosiva ha sido puesta en la bóveda de la reserva federal, tienes hasta que se acabe el tiempo para desarmar el explosivo! - - Eine Sprengladung wurde am Safe angebracht. Du hast Zeit, bis die Uhr abläuft, um die Ladung zu entschärfen! - Une charge de dynamite a été placée sur le coffre de la réserve fédérale. Vous avez jusqu'au temps imparti pour désarmorcer la charge ! - Una carica esplosiva è stata piazzata sulla cassaforte della Riserva Federale, puoi cercare di disinnescarla prima che scada il tempo! - O explosivo foi colocado no cofre , você tem até o tempo acabar para desarmar o explosivo. - Ładunek wybuchowy został założony na skarbcu rezerw federalnych, musisz rozbroić ładunek nim wybuchnie! - 金库里已经安装了爆破装置,你必须有足够的时间解除爆破装置! - - - The timer is ticking! Keep the cops away from the vault! - Časovač je tikání! Udržujte policajty od trezoru! - El tiempo esta corriendo, manten alejados a los policías! - - Der Timer läuft! Halte die Polizei von Safe fern! - La minuterie est lancée! Gardez la police loin de la bombe ! - Il tempo sta scorrendo! Tieni la polizia lontana dalla cassaforte! - O tempo está passando! Mantenha os policiais longe do cofre - Zegar tyka! Trzymaj policję z dala od skarbca! - 计时器开始计时!请远离爆破点! - - - The charge has been disarmed! - Náboj byl odzbrojen! - El explosivo ha sido desarmado! - - Die Sprengladung wurde entschärft! - La charge a été désamorcée ! - La carica esplosiva è stata disinnescata! - O explosivo foi desarmado! - Ładunek wybuchowy rozbrojony! - 爆破装置被解除! - - - The vault is now opened - Klenba je nyní otevřena - La bóveda esta abierta - - Der Tresor ist jetzt offen! - Le coffre est maintenant ouvert - La cassaforte è stata aperta - O cofre está aberto. - Skarbiec otwarty - 金库现在已经打开了 - - - You must open the container before placing the charge! - Je nutné otevřít nádobu před umístěním nabíječku! - Vous devez ouvrir le conteneur avant de placer le chargeur ! - Debes abrir el contenedor antes de poner el explosivo! - È necessario aprire il contenitore prima di mettere il caricabatterie! - Musisz otworzyć pojemnik przed wprowadzeniem opłat! - - Você deve abrir o container antes de colocar o explosivo! - Du musst den Container öffnen, bevor du die Ladung platzieren kannst! - 安装爆破装置前你必须打开金库大门! - - - You are not looking at a house door. - Nejste při pohledu na dveře domu. - No estas viendo a la puerta de una casa. - - Du siehst keine Haustür an. - Vous n'êtes pas en face de la porte. - Non sei girato verso la porta di una casa. - Você não esta olhando para a porta. - Nie patrzysz w stronę drzwi. - 你需要靠近门才能使用。 - - - !!!!! SOMEONE IS BREAKING INTO THE FEDERAL RESERVE !!!!!! - !!!!! Někdo vloupání do Federálního rezervního systému !!!!!! - !!!!! LA RESERVA FEDERAL ESTA SIENDO ASALTADA !!!!!! - - !!!!! JEMAND BRICHT IN DIE ZENTRALBANK EIN !!!!!! - !!!!! QUELQU'UN TENTE DE S'INTRODUIRE DANS LA RÉSERVE FÉDÉRALE !!!!!! - !!!!!! QUALCUNO STA CERCANDO DI INTRODURSI NELLA RISERVA FEDERALE !!!!!! - !!!!! A RESERVA FEDERAL ESTÁ SENDO ROUBADA !!!!!! - !!!!!! KTOŚ SIĘ WŁAMUJE DO BANKU REZERW FEDERALNYCH !!!!! - !!!!! 有人闯进金库 !!!!!! - - - %1 was seen breaking into a house. - %1 byl viděn vloupání do domu. - %1 ha sido visto entrando a una casa. - - %1 wurde beim Einbruch in ein Haus gesehen. - %1 a été vu rentrant dans une maison par effraction. - %1 è stato visto fare irruzione in una casa. - %1 foi visto invadindo sua casa. - %1 był widziany jak włamywał się do domu. - %1 闯入一所房子。 - - - Cutting lock on door - Řezání zámek na dveřích - Cortando la cerradura de la puerta - - Schloss wird aufgebrochen... - Crochetage de la serrure - Tranciando i blocchi sulla porta - Quebrando o cadeado da porta - Przecinam zabezpieczenia domu - 门锁被撬 - - - You must open the outside doors before opening it! - Je nutné otevřít venkovní dveře před otevřením! - Vous devez ouvrir les portes extérieures avant de l'ouvrir ! - Debes abrir las puertas de afuera antes de abrir esta! - È necessario aprire le porte esterne prima di aprirlo! - Musisz otworzyć zewnętrzne drzwi przed otwarciem! - - Você deve abrir as portas externas antes de abrir essa! - Du musst die Außentüren öffnen, bevor du weitermachen kannst! - 打开门前你必须先打开外面的门! - - - You are not looking at a vault. - Nejste při pohledu na klenbu. - Vous ne regardez pas le coffre. - No estas apuntando a la bóveda. - Non cercate in un caveau. - Nie jesteś patrząc na sklepieniu. - Você não está olhando para um cofre. - Вы не смотрите на хранилище. - Du siehst keinen Tresor an. - 你不是金库看守。 - - - There is no charge on the vault? - Neexistuje žádný poplatek na klenbě? - No hay un explosivo en la bobeda? - - Es gibt keine Sprengladung am Tresor? - Il n'y a pas de dynamite sur le coffre ? - Non c'è alcuna carica esplosiva sulla cassaforte - Não há nenhum explosivo no cofre. - Nie ma ładunku na skarbcu? - 爆破装置安装在了金库里? - - - Defusing charge... - Zneškodňovat náboj ... - Desarmando Explosivo... - - Sprengladung wird entschärft... - Désamorçage de la charge... - Disinnescando la carica esplosiva... - Desarmando o explosivo... - Rozbrajam ładunek... - 拆除爆破装置... - - - The charge has been defused - Obvinění byla zneškodněna - El explosivo ha sido desarmado - - Die Sprengladung wurde entschärft. - La charge a été désamorcée - La carica esplosiva è stata disinnescata - O explosivo foi desarmado - Ładunek został rozbrojony - 爆破装置已被拆除 - - - You need to look at the vehicle you want to refuel! - Musíte se podívat na vozidla, které chcete natankovat! - Debes mirar a el vehiculo que quieres llenar de combustible! - - Du musst das Fahrzeug ansehen, das du auftanken möchtest! - Vous avez besoin de regarder le véhicule dont vous voulez faire le plein ! - Devi essere girato verso il veicolo che vuoi rifornire! - Você precisa estar olhando para o veículo que deseja abastecer! - Musisz spojrzeć w kierunku pojazdu który chcesz zatankować! - 你要看看你的载具是否加满了油! - - - You need to be closer to the vehicle! - Musíte být blíže k vozidlu! - Debes estar más cerca del vehiculo! - - Du musst näher am Fahrzeug sein! - Vous devez être plus proche du véhicule ! - Devi stare più vicino al veicolo! - Você precisa estar mais perto do veículo! - Musisz być bliżej pojazdu! - 你需要离载具近一点! - - - Refuelling Fuel Canister - Tankování paliva kanystr - Ravitaillement en carburant de la citerne - Llenando Bidón de Combustible - Rifornimento carburante scatola metallica - Tankowanie paliwa Kanister - O reabastecimento de combustível vasilha - Дозаправка топлива канистра - Benzinkanister befüllen - 加注汽油桶 - - - Fuel Station Pump - Čerpací stanice čerpadla - Pompe à essence - Estación de bombeo de combustible - Pompa Stazione di rifornimento - Paliwo przepompowni - Bomba de Combustível Station - Топливная Насосная станция - Zapfsäule - 燃料加油站 - - - Spend $%1 to refuel your Empty Fuel Canister? - Utratit $%1 natankovat vaše prázdné palivové kanystr? - Dépenser $%1 pour faire le plein de votre réservoir ? - Gastar $%1 para llenar el Bidón de Combustible? - Spendere $%1 per rifornire di carburante la vostra scatola metallica del combustibile vuoto? - Wydać $%1 zatankować swój pustego zasobnika paliwa? - Gastar R$%1 para reabastecer a sua vasilha de combustível vazio? - Потратить $%1 для дозаправки ваш Пусто баллон с горючим? - Willst du deinen leeren Kraftstoffkanister für $%1 befüllen? - 花费 $%1 加满你的空汽油桶? - - - You must be closer to the fuel pump! - Musíte být blíže k palivovému čerpadlu! - Vous devez être plus proche de la pompe à carburant ! - Debe estar más cerca de la bomba de combustible! - È necessario essere più vicino alla pompa del carburante! - Você deve estar mais perto da bomba de combustível! - Você deve estar mais perto da bomba de combustível! - Вы должны быть ближе к топливному насосу! - Du musst dich näher an der Zapfsäule befinden! - 你必须靠近加油机! - - - You have successfully refuelled the Fuel Canister! - Úspěšně jste tankovat palivový kanystr! - Vous avez ravitaillé avec succès le réservoir d'essence ! - Usted ha llenado con exito el Bidón de Combustible! - Hai rifornimento con successo il canestro del combustibile! - Pomyślnie zatankowany kanistra paliwa! - Você reabastecido com sucesso a vasilha de combustível! - Вы успешно заправились на баллон с горючим! - Der Benzinkanister wurde befüllt! - 你已加满汽油桶! - - - Refuelling %1 - Doplňování paliva %1 - Llenado el Bidón %1 - - Wird befüllt %1... - Ravitaillement en cours de %1 - Rifornendo %1 - Abastecendo %1 - Tankuję %1 - 补充油量 %1 - - - You have refuelled that %1 - Jsi natankoval, že produkt %1 - Has llenado el %1 - - Du hast deinen %1 befüllt. - Vous avez ravitaillé %1 - Hai rifornito di carburante un %1 - Você abasteceu %1 - Zatankowałeś %1 - 你要补充油量 %1 - - - This vehicle is already in your key-chain. - Toto vozidlo je již ve vaší klíčenky. - Esta vehiculo ya esta en tu llavero. - - Du hast diesen Fahrzeugschlüssel bereits an deinem Schlüsselbund. - Ce véhicule est déjà dans votre porte-clé. - Possiedi già le chiavi di questo veicolo. - Você já tem a chave desse veículo. - Masz już klucze do tego pojazdu. - 你已经获得载具钥匙。 - - - Lock-picking %1 - Lockpicking %1 - Abriendo Cerradura %1 - - Wird aufgebrochen %1... - Crochetage de %1 - Scassinando %1 - Arrombando %1 - Włamujesz się do %1 - 撬锁 %1 - - - You got to far away from the target. - Dostal jsi příliš daleko od cíle. - Le alejastes mucho del objeto. - - Du hast dich zu weit vom Ziel entfernt. - Vous êtes trop loin de la cible. - Sei andato troppo lontano dall'obiettivo - Voçê está muito longe do seu alvo. - Jesteś za daleko od celu. - 你必须远离目标。 - - - You now have keys to this vehicle. - Nyní máte klíče k tomuto vozidlu. - Ahora tienes las llaves para este vehiculo. - - Du hast nun einen Schlüssel zu diesem Fahrzeug. - Vous avez maintenant les clés de ce véhicule - Sei ora in possesso delle chiavi di questo veicolo. - Agora você tem as chaves do veiculo. - Masz teraz klucze do tego pojazdu - 你现在获得了载具钥匙。 - - - The lockpick broke. - Paklíč zlomil. - La ganzua se rompió. - - Der Dietrich ist abgebrochen. - L'outil de crochetage s'est cassé - Il grimaldello si è rotto. - A Chave Mestra quebrou. - Wytrych się złamał. - 撬锁工具坏了。 - - - %1 was seen trying to lockpick a car. - %1 byl viděn snaží lockpick auto. - %1 ha sido visto tratando de abrir un carro. - - %1 wurde beim Aufbrechen eines Auto erwischt. - %1 a été vu essayant de crocheter une voiture - %1 è stato visto provare a scassinare un veicolo. - %1 foi visto usando uma Chave Mestra em um carro. - %1 był widziany jak próbował włamać się do samochodu. - %1 试图撬开一辆载具的门锁。 - - - You are not near a mine! - Nejste v blízkosti dolu! - No estas cerca de una mina! - - Du bist nicht in der Nähe einer Mine! - Vous n'êtes pas près d'une mine! - Non ti trovi vicino ad una cava! - Você não está próximo de uma mina! - Nie jesteś blisko kopalni! - 你不在矿场附近! - - - You can't mine from inside a car! - Nemůžete dolovat z vnitřku vozu! - No puedes minar desde adentro de un vehiculo! - - Du kannst nicht in deinem Auto abbauen! - Vous ne pouvez pas miner à l'intérieur d'une voiture! - Non puoi minare da dentro un veicolo! - Você não pode minerar dentro do carro! - Nie możesz wydobywać z samochodu! - 你不能从车里面采集! - - - You have mined %2 %1 - Jste těžil% %2 1 - Has minado %2 %1 - - Du hast %2 %1 abgebaut. - Vous avez miné %2 %1 - Hai minato %2 %1 - Você minerou %2 %1 - Wydobyłeś %2 %1 - 你开采 %2 %1 - - - Place Spike Strip - Umístěte Spike Strip - Poner Barrera de Clavos - - Nagelband platzieren - Placer la herse - Posa striscie chiodate - Tapete de Espinhos armado. - Rozłóż kolczatkę - 放置钉刺带 - - - Pack up Spike Strip - Sbalit Spike Strip - Guardar Barrera de Clavos - - Nagelband zusammenpacken - Ranger la herse - Recupera striscie chiodate - Pegar Tapete de Espinhos. - Zwiń kolczatkę - 收起钉刺带 - - - You need to be inside your house to place this. - Musíte být uvnitř svého domu na místo toto. - Debes estar dentro de tu casa para poner eso. - - Du musst in deinem Haus sein, um dies platzieren zu können. - Vous devez être à l'interieur de votre maison pour placer ceci - Devi essere all'interno della tua casa per posizionarlo. - Você precisa estar dentro da sua casa para colocar isso! - Musisz być wewnątrz własnego domu aby to umieścić. - 你需要在你的房子里放置这个。 - - - You cannot place any more storage containers in your house. - Nelze umístit žádné další skladovací kontejnery ve vašem domě. - No puedes poner mas contenedores en tu casa. - - Es können keine weiteren Container in dein Haus gestellt werden. - Vous ne pouvez pas placer d'autres conteneurs dans votre maison. - Non puoi installare altri contenitori in casa tua. - Você não pode colocar mais caixas dentro da sua casa. - Nie masz więcej miejsca na pojemniki w tym domu. - 你不能在你的房子里放更多的储藏存储箱。 - - - No more free storage spaces in your house. - Žádné další volné skladové prostory v domě. - No hay más espacio de almacenamiento en tu casa. - - Es gibt in deinem Haus keinen freien Lagerplatz mehr. - Il n'y a plus d'espace libre dans votre maison. - I contenitori in casa tua hanno finito lo spazio disponibile. - Não ha mais espaços para guardar itens em sua casa. - Brak wolnych miejsc na pojemniki w domu. - 你的房子没有空闲的储藏空间。 - - - You need to select an item first! - Je třeba vybrat položku na prvním místě! - Debes seleccionar un objeto primero! - - Du musst zuerst einen Gegenstand auswählen! - Vous devez sélectionner un objet ! - Devi prima selezionare un oggetto! - Você precisa selecionar um item primeiro! - Zaznacz najpier rzecz. - 你需要选择一个物品! - - - You can now run farther for 3 minutes - Nyní můžete spustit další 3 minuty - Ahora puedes correr mas por 3 minutos - - Vous pouvez courir pendant 3 minutes - Du kannst jetzt für 3 Minuten weiter laufen. - Puoi ora correre per 3 minuti consecutivi - Você agora pode correr por 3 minutos - Możesz przez 3 minuty biec bez wysiłku - 你现在可以跑3分钟 - - - You already have a Spike Strip active in deployment - Ty už mají Spike Strip aktivní při nasazení - Ya tienes una Barrera de Clavos activada - - Du platzierst bereits ein Nagelband! - Vous avez déjà une herse en train d'être deployée - Hai già una striscia chiodata piazzata - Você já tem um Tapete de Espinhos ativo - Aktualnie masz rozłożoną kolczatkę - 你已经部署了一个钉刺带。 - - - You can't refuel the vehicle while in it! - Nemůžete natankovat z vozidla, když v něm! - No puedes llenar tu vehiculo mientras estas adentro de él! - - Du kannst ein Fahrzeug nicht betanken während du dich darin befindest! - Vous ne pouvez pas faire le plein du véhicule tout en étant à l'intérieur ! - Non puoi rifornire il veicolo di benzina mentre ci sei dentro! - Você não pode abastecer o veículo enquanto dentro dele! - Nie możesz zatankować pojazdu gdy w nim jesteś! - 你不能在车里加油! - - - This item isn't usable. - Tato položka není použitelný. - Este objeto no es utilizable. - - Dieser Gegenstand ist nicht benutzbar. - Cet objet n'est pas utilisable. - Questo oggetto è inutilizzabile. - Esse item não é usável. - Nie można użyć tej rzeczy. - 这个物品不能使用。 - - - - - Processing Oil - zpracování ropy - Procesando Petróleo - - Öl wird verarbeitet... - Raffinage de Pétrole - Raffinando il Petrolio - Processando Petróleo - Rafinacja ropy - 加工石油 - - - Cutting Diamonds - řezání diamantů - Cortando Diamantes - - Diamanten werden geschliffen... - Taillage de diamant - Rifinendo diamanti - Lapidando Diamante - Szlif diamentów - 切割钻石 - - - Processing Opium - zpracování Opium - Procesando Opio - - Heroin wird verarbeitet... - Traitement d'Héroïne - Processando Eroina - Processando Heroína - Oczyszczanie heroiny - 加工海洛因 - - - Casting Copper Ingots - Casting měděných ingotů - Fundiendo Lingotes de Cobre - - Fonte du Cuivre - Kupfer wird verarbeitet... - Processando in lingotti di Rame - Processando Cobre - Wytop miedzi - 铸造铜锭 - - - Casting Iron Ingots - Litiny ingoty - Fundiendo Lingotes de Hierro - - Fonte du Fer - Eisen wird verarbeitet... - Processando Ferro - Processando Ferro - Wytop żelaza - 铸造铁锭 - - - Processing Sand - zpracování Písek - Procesando Arena - - Sand wird verarbeitet... - Fonte du Sable - Processando Sabbia - Processando Areia - Topienie piasku - 制作玻璃 - - - Processing Salt - zpracování Salt - Procesando Sal - - Salz wird verarbeitet... - Traitement du Sel - Processando Sale - Refinando Sal - Warzenie soli - 制造食盐 - - - Processing Coca Leaves - Zpracování listů koky - Procesando Hojas de Coca - - Kokain wird verarbeitet... - Traitement de Cocaïne - Processando Cocaina - Processando Cocaína - Oczyszczanie kokainy - 加工可卡因 - - - Processing Marijuana - zpracování Marihuana - Procesando Marihuana - - Marihuana wird verarbeitet... - Traitement de Marijuana - Processando Marijuana - Processando Maconha - Suszenie marihuany - 加工大麻 - - - Mixing Cement - Míchání Cement - Mezclando Cemento - - Zement wird gemischt... - Mélange de ciment - Processando Cemento - Misturando Cimento - Mielenie cementu - 制造水泥 - - - You need to stay within 10m to process. - Musíte zůstat v rozmezí 10 m zpracovat. - Debes estar a menos de 10m para procesar. - - Du musst innerhalb von 10m bleiben, um verarbeiten zu können. - Vous devez rester à 10m pour traiter vos objets. - Devi stare entro 10m per processare. - Você precisa ficar a menos de 10m para processar. - Musisz być w odległości 10 m aby przetwarzanie się odbyło. - 您需要保持10米以内的距离。 - - - You have no inventory space to process your materials. - Nemáš zásob prostor ke zpracování vašich materiálů. - Vous n'avez pas de place pour traiter vos matériaux. - Usted no tiene espacio en el inventario para procesar sus materiales. - Non hai spazio nell'inventario per elaborare i materiali. - Nie masz miejsca na przetwarzanie swoich zapasów materiałów. - Você não tem espaço no inventário para processar seus materiais. - У вас нет места инвентаря для обработки ваших материалов. - Du hast keinen Platz im Inventar, um die Materialien zu verarbeiten. - 你没有库存空间来处理你的物品。 - - - Only part of your materials could be processed due to reaching your maximum weight. - Pouze část svých materiálů by mohla být zpracována z důvodu dosažení maximální váhu. - Seule une partie de votre matériel pourrait être traité en raison de l'atteinte de votre poids maximum. - Sólo una parte de los materiales se han podido procesar debido a alcanzar tu peso máximo. - Solo una parte del tuo materiali possono essere trattati a causa di raggiungere il vostro peso massimo. - Tylko część swoich materiałów może być przetwarzane ze względu na osiągnięcie maksymalnej wadze. - Apenas uma parte de seus materiais puderam ser processados, devido o peso máximo ter sido atingido. - Только часть ваших материалов может быть обработан из-за достижения вашего максимального веса. - Nur ein Teil der Materialien konnte verarbeitet werden, sonst würde das maximale Gewicht erreicht werden. - 只有部分材料可以加工,已达到你的最大重量。 - - - You need $%1 to process without a license! - Musíte $%1 bez povolení ke zpracování! - Necesitas $%1 para procesar sin licencia! - - Du brauchst $%1, um ohne eine Lizenz verarbeiten zu können! - Vous avez besoin de $%1 pour traiter sans licence ! - Hai bisogno di $%1 per processare senza la dovuta licenza! - Você precisa de R$%1 para processar sem licença! - Musisz mieć $%1 aby przetworzyć bez odpowiedniej licencji - 你没有加工许可所以需要 $%1 加工! - - - You have processed %1 into %2 - Máte zpracovaný %1 do %2 - Has procesado %1 a %2 - - Du hast %1 in %2 verarbeitet. - Vous avez traité %1 en %2 - Hai processato %1 in %2 - Você trasformou %1 em %2 - Przetworzyłeś %1 na %2 - 你将 %1 加工为 %2 - - - You have processed %1 into %2 for $%3 - Máte zpracovaný %1 do %2 na $%3 - Has procesado %1 a %2 por $%3 - - Du hast %1 für $%3 in %2 verarbeitet. - Vous avez traité %1 en %2 pour $%3 - Hai processato %1 in %2 al costo di $%3 - Você trasformou %1 em %2 por R$%3 - Przetworzyłeś %1 na % za $%3 - 你将 %1 加工为 %2 花费 $%3 - - - - - Medics Online: %1 - Zdravotníci Online: %1 - Médicos en línea: %1 - - Sanitäter online: %1 - Médecin en ligne : %1 - Medici Online: %1 - Médicos Online: %1 - Medycy Online: %1 - 在线的医疗人员:%1 - - - Medics Nearby: %1 - Zdravotníci v blízkosti:%1 - Médicos Cerca: %1 - - Sanitäter in der Nähe: %1 - Médecin à proximité : %1 - Medici Vicini: %1 - Médicos por perto: %1 - Medycy w pobliżu: %1 - 附近的医疗人员:%1 - - - %1 is requesting EMS Revive. - %1 požaduje EMS oživit. - %1 esta pidiendo servicio médico. - - %1 benötigt medizinische Hilfe. - %1 demande de l'aide du SAMU. - %1 sta richiedendo l'intervento medico. - %1 requisitou o resgate do SAMU - %1 prosi o pomoc medyczną. - %1 要求医疗救治。 - - - Respawn Available in: %1 - Respawn K dispozici v:%1 - Puedes reaparecer en: %1 - - Réapparition disponible dans: %1 - Aufwachen verfügbar in: %1 - Respawn disponibile in: %1 - Respawn Disponível em: %1 - Odrodzenie możliwe za: %1 - 重生在: %1 - - - You can now respawn - Nyní lze respawn - Ya puedes reaparecer - - Du kannst jetzt aufwachen! - Vous pouvez désormais réapparaître - Puoi ora fare respawn - Você pode dar respawn - Możesz się odrodzić - 现在你可以重生 - - - %1 has revived you and a fee of $%2 was taken from your bank account for their services. - %1 oživil vy a poplatek ve výši $%2 byl převzat z bankovního účtu za své služby. - %1 te a revivido y una cuota de $%2 a sido tomada de tu cuenta por sus servicios. - - %1 hat dich wiederbelebt und dafür eine Gebühr von $%2 von deinem Bankkonto eingezogen. - %1 vous a réanimé, des frais de $%2 ont été transférés depuis votre compte en banque sur celui du médecin. - %1 ti ha rianimato e sono stati prelevati $%2 dal tuo conto in banca per pagare la prestazione. - %1 reviveu você e uma taxa de R$%2 foi cobrada da sua conta bancária para os serviços prestados. - %1 pobrał opłatę w wysokości $%2 za reanimację i przywrócenie funkcji życiowych. - %1 已经将你救治,从你的银行账户收取 $%2 的服务费。 - - - Someone else is already reviving this person - Někdo jiný již užívají tuto osobu - Alguien ya esta reviviendo a esta persona - - Jemand anderes belebt diese Person bereits wieder. - Quelqu'un d'autre s'occupe déjà de cette personne - Qualcun'altro sta già provando a rianimare questa persona - Outro médico já está revivendo esse jogador - Ktoś inny aktualnie reanimuje tę osobę - 其他人已经在救治这个人了 - - - Reviving %1 - Oživení %1 - Reviviendo %1 - - Wird wiederbelebt %1... - Réanimation de %1 - Rianimando %1 - Revivendo %1 - Reanimacja %1 - 救治 %1 - - - This person either respawned or was already revived. - Tato osoba buď respawned nebo již byl přijat. - Esta persona ya reapareció o fue revivida. - - Cette personne a peut-être fait réapparition ou a déjà été réanimée. - Diese Person ist entweder aufgewacht oder wurde bereits wiederbelebt. - Questa persona è stata già rianimata o ha fatto respawn. - Esse jogador já deu respawn ou já foi reanimado. - Ta osoba wcześniej się odrodziła lub została reanimowana. - 这个人重生或已经复活了。 - - - You have revived %1 and received $%2 for your services. - Obdrželi jste %1 a získal $%2 za vaše služby. - Has revivido a %1 y recivido $%2 por tus servicios. - - Du hast %1 wiederbelebt und $%2 für deine Dienste erhalten. - Vous avez réanimé %1, vous avez reçu $%2 pour votre aide - Hai rianimato %1 e hai ricevuto $%2 per la tua prestazione. - Você reviveu %1 e recebeu R$%2 pelo seus serviços prestados. - Reanimowałeś %1 i za uratowanie życia otrzymałeś $%2. - 你已经救治了 %1 并得到 $%2 的服务费用。 - - - You got to far away from the body. - Dostal jsi příliš daleko od těla. - Te alejastes mucho del cuerpo. - - Du bist zu weit vom Körper entfernt. - Vous êtes trop loin du corps. - Sei andato troppo distante dal corpo. - Você está muito distante do corpo. - Jesteś za daleko od ciała. - 你离尸体太远。 - - - - - The robbery has failed due to unknown reasons - Lupič selhalo kvůli neznámých důvodů - El robo fallo por razones desconocidas - - Der Raub ist aus unbekannten Gründen fehlgeschlagen. - Le vol de la réserve fédérale a échoué pour des raisons inconnues - La rapina è fallita per cause sconosciute - O roubo falhou por uma causa desconhecida. - Napad się nie udał z niewiadomych powodów. - 由于不明原因,抢劫失败了。 - - - $%1 was stolen from the robbery on the federal reserve - $%1 byl ukraden z loupeže na federální rezervy - $%1 fue robado de la reserva federal - - $%1 wurden von den Räubern aus der Zentralbank gestohlen. - $%1 a été volé à la réserve fédérale. - $%1 sono stati rubati durante la rapina alla banca - R$%1 foi roubado da Reserva Federal. - $%1 ukradziono z Rezerwy Federalnej - $%1 从联邦储备银行中被抢劫 - - - This vault is already being robbed by someone else - Tato klenba je již okraden někým jiným - La bóveda ya esta siendo robada por alguien mas - - Ce coffre est déjà en train d'être pillé par quelqu'un d'autre. - Der Tresor wird bereits von jemand anderem ausgeraubt. - Questo Caveau sta venendo rapinando da qualcun'altro - Esse cofre já está sendo roubado por outro jogador. - Skarbiec jest aktualnie rabowany przez inną osobę. - 这个金库已经被别人抢劫了 - - - This vault was already robbed recently - Tato klenba byla již nedávno okraden - La bóveda fue robada muy recientemente - - Der Tresor wurde bereits vor Kurzem ausgeraubt. - Ce coffre a déjà été pillé récemment - Questo Caveau è stato svaligiato di recente - Esse cofre já foi assaltado recentemente. - Skarbiec został niedawno zrabowany - 这个金库最近被抢了 - - - - - Garage - Garáž - Garaje - - Garage - Garage - Garage - Garagem - Garaż - 载具仓库 - - - Your Vehicles - Vaše Vozidla - Tus vehículos - - Deine Fahrzeuge - Vos véhicules - I tuoi Veicoli - Seus Veículos - Twój pojazd - 你的载具 - - - Vehicle Information - Informace o vozidle - Información de Vehículos - - Fahrzeuginformationen - Carte grise du vehicule - Informazioni Veicolo - Informações do Veículo - Informacja o pojeździe - 载具信息 - - - Automatically reveals nearest objects within 15m, turn this setting off if you are experiencing performance issues. - Automaticky odhaluje nejbližší objektů v rámci 15m, toto nastavení vypnete, pokud jste se setkali s problémy s výkonem. - Automáticamente revela los objetos más cercanos dentro de 15m, apaga esta opción si estas teniendo problemas de performación. - - Zeigt automatisch nächstgelegene Objekte innerhalb von 15m an, deaktiviere es, wenn du Leistungprobleme hast. - Révèle automatiquement les objets les plus proches au sein de 15m, désactiver ce paramètre si vous rencontrez des problèmes de performance. - Rivela automaticamente gli oggettivi vicini entro 15m, disattiva quest'impostazione se riscontri dei problemi di perfomance di sistema. - Revela objetos à 15m, desabilite essa opção se está tendo problemas de performance. - Automatycznie wykrywa najbliższe obiekty w promieniu 15m, wyłącz tę opcję jeśli masz problemy z wydajnością - 自动显示1500米以内的最近对象,如果你遇到性能问题,请将此设置关闭。 - - - Switch side-channel mode, turn this off if you don't want to talk with players from your side. - Přepnout do režimu side-channel, tuto funkci vypnout, pokud nechcete mluvit s hráči z vaší strany. - Activer le canal camp, désactiver cette fonction si vous ne voulez pas parler avec des joueurs de la même faction que vous. - Habilita/Deshabilita el SideChannel, apaga esto si no quieres hablar con jugador de tu lado. - Interruttore modalità side-channel, disattivare questa funzione se non si vuole parlare con i giocatori da parte vostra. - Przełącznik trybu side-channel, to wyłączyć, jeśli nie chce rozmawiać z graczami z boku. - - Habilita/Desabilita o side-channel, desabilite caso você não queira conversar com os jogadores da sua facção. - Sidechat umschalten. Ausschalten, wenn du nicht mit Spielern deiner Fraktion sprechen möchtest. - 切换侧通道模式,如果你不想和你身边的玩家交谈,关掉这个频道。 - - - Switch player's broadcast mode, turn this off if you don't want to see any broadcast from other players. - - Activer/Désactiver les annonces. Désactivez ceci si vous ne voulez voir aucune annonce d'autres joueurs. - Habilitar/Deshabilitar transmisiones, deshabilita esto si no quieres ver transmisiones de otros jugadores. - - - - Habilita/Desabilita as transmissões dos jogadores, desabilite caso você não queira ver as transmissões dos outros jogadores. - Broadcast umschalten. Ausschalten, wenn du keine Broadcasts von anderen Spielern erhalten möchtest. - 切换玩家的广播模式,如果你不想看到其他玩家的广播,就关掉它。 - - - Controls whether or not players will have name tags above their head. - Přepnout do režimu side-channel, tuto funkci vypnout, pokud nechcete mluvit s hráči z vaší strany. - Controla si los jugadores tienen nombres (tags) sobre sus cabezas. - - Contrôler si les joueurs auront ou non leurs noms au dessus de leur tête - Namensschilder umschalten. Ausschalten, wenn du keine Namensschilder über den Spielerköpfen sehen möchtest. - Controlla la visualizzazione delle tags sopra la testa dei giocatori - Controla se os jogadores terão os nomes em suas cabeças. - Kontroluje czy gracze będą mieli nad głowami swoje Tagi z nazwą - 控制球员是否有名字标签在他们的头上方。 - - - Shop Stock - Obchod Sklad - Inventario de la Tienda - - Lagerbestand - Boutique - Stock Negozio - Estoque - Sklep oferta - 商店库存 - - - - - Player Interaction Menu - Hráč Interakce Menu - Menu de Interacción de Jugadores - - Spielerinteraktionsmenü - Menu d'interaction du Joueur - Menu d'interazione Giocatore - Menu de Interação do Jogador - Menu Interakcji - 玩家互动菜单 - - - Put in vehicle - Vložíme do vozidla - Poner en vehículo - - Ins Fahrzeug setzen - Embarquer - Metti nel Veicolo - Colocar no Veículo - Włóż do pojazdu - 押上载具 - - - Un-Restrain - živelný - Quitar Esposas - - Freilassen - Démenotter - Togli Manette - Soltar - Rozkuj - 解开手铐 - - - Check Licenses - Zkontrolujte licence - Revisar Licencias - - Lizenzen überprüfen - Vérifier Licences - Controlla Licenze - Verificar Licenças - Sprawdź licencje - 检查许可证 - - - Search Player - Hledat hráče - Buscar Jugadores - - Spieler durchsuchen - Fouiller Joueur - Ricerca Giocatore - Revistar Jogador - Przeszukaj - 搜身 - - - Stop Escorting - Zastavit doprovázet - Parar de Escoltar - - Eskortieren stoppen - Arrêter Escorte - Ferma Scorta - Parar de Escoltar - Przestań eskortować - 停止押送 - - - Escort Player - Escort Player - Escoltar Jugador - - Spieler eskortieren - Escorter Joueur - Scorta Giocatore - Escoltar Jogador - Eskortuj - 押送 - - - Ticket Player - Ticket Player - Dar Tiquete - - Strafzettel ausstellen - Amende Joueur - Multa Giocatore - Multar Jogador - Wystaw mandat - 开据罚单 - - - Seize Weapons - zabavili zbraně - Confiscar Armas - - Waffen beschlagnahmen - Saisir les armes - cogliere Armi - Apreender Armas - Chwytaj broń - 没收武器 - - - Send to jail - Poslat do vězení - Encarcelar - - Ins Gefängnis stecken - Envoyer en prison - Arresta - Enviar p/ Prisão - Do więzienia - 送进监狱 - - - Repair Door - oprava dveří - Reparar Puerta - - Tür reparieren - Réparer la porte - Ripara porta - Consertar Porta - Napraw drzwi - 检修门 - - - Open / Close - Otevřít zavřít - Abrir / Cerrar - - Öffnen / Schließen - Ouvrir / Fermer - Apri / Chiudi - Abrir / Fechar - Otwórz / Zamknij - 打开/关闭 - - - Break down door - Rozebrat dveře - Romper Puerta - - Tür aufbrechen - Forcer la porte - Sfonda Porta - Quebrar Porta - Wyważ drzwi - 打破门 - - - Garage - - - - Garage - Garage - - - - 车库 - - - You can buy a garage at this house for $%1. You must first purchase the house! - - - - Du könntest eine Garage an diesem Haus für $%1 kaufen. Du müsstest aber zuerst das Haus kaufen! - Vous pouvez acheter un garage dans cette maison pour $%1. Vous devez d'abord acheter la maison ! - - - - 你可以在这所房子里买一个 $%1 的仓库。你必须先买房子! - - - Search house - Vyhledávání dům - Buscar casa - - Haus durchsuchen - Fouiller la maison - Cerca Casa - Vasculhar a Casa - Przeszukaj dom - 搜索房子 - - - Lock up house - Zamknout dům - Cerrar la casa con llave - - Haus abschliessen - Fermer la maison - Chiudi Casa - Trancar a Casa - Zamknij dom - 锁上房子 - - - Buy House - Koupit dům - Comprar casa - - Haus kaufen - Acheter la maison - Compra Casa - Comprar a Casa - Kup dom - 买房子 - - - Buy House Garage - - - - Garage kaufen - Acheter le Garage de cette Maison - - - - 买房子的仓库 - - - Sell Garage - Navrhujeme Garáž - Vender Garaje - - Garage verkaufen - Vendre le garage - Vendi Garage - Vender Garagem - Sprzedaj garaż - 出售仓库 - - - Remove Container - Nádobu - Remover Contenedor - rimuovere Container - Wyjąć pojemnik - - Supprimer le conteneur - Remover Caixa - Container entfernen - 删除存储箱 - - - Garage - Garáž - Garaje - - Garage - Garage - Garage - Garagem - Garaż - 仓库 - - - Store Vehicle - Store Vehicle - Guardar Vehiculo - - Fahrzeug parken - Ranger le véhicule - Parcheggia Veicolo - Guardar Veículo - Zaparkuj pojazd - 载具商店 - - - Sell House - prodat dům - Vender Casa - - Haus verkaufen - Vendre la maison - Vendi Casa - Vender Casa - Sprzedaj dom - 卖房子 - - - Unlock Storage - odemknout úložiště - Abrir Almacenamiento - - Lagerplatz aufschliessen - Déverrouiller l'inventaire - Sblocca contenitori - Destrancar Caixa - Odblokuj pojemnik - 解锁存储 - - - Lock Storage - zámek Storage - Cerrar Almacenamiento con Llave - - Lagerplatz abschliessen - Verrouiller l'inventaire - Blocca contenitori - Trancar Caixa - Zablokuj pojemnik - 锁定存储 - - - Turn Lights Off - Blinkrů Off - Apagar Luces - - Licht ausschalten - Lumières éteintes - Spegni luci - Ligar as Luzes - Włącz światło - 把灯关掉 - - - Turn Lights On - Turn zapnutá světla - Prender Luces - - Licht anschalten - Lumières allumées - Accendi luci - Apagar as Luzes - Wyłącz światło - 把灯打开 - - - - - Vehicle Interaction Menu - Interakce vozidel Menu - Menu de interacción de Vehículo - - Fahrzeuginteraktionsmenü - Menu Interaction du Véhicule - Menu d'interazione Veicolo - Menu do Veículo - Menu Interakcji pojazdu - 载具交互菜单 - - - Unflip Vehicle - Unflip Vehicle - Dar la Vuelta al Vehículo - - Fahrzeug umdrehen - Retourner Véhicule - Raddrizza veicolo - Desvirar Veículo - Ustaw pojazd - 翻转载具 - - - Get In Vehicle - - - - Monter dans le véhicule - Gehe ins Fahrzeug - - - - 进入载具 - - - Push Boat - tlačit loď - Empujar Bote - - Boot schieben - Pousser bateau - Spingi Barca - Empurrar Barco - Popchnij - 推船 - - - Repair Vehicle - opravy vozidel - Reparar Vehículo - - Fahrzeug reparieren - Réparer Véhicule - Ripara Veicolo - Consertar Veículo - Napraw - 修理载具 - - - Registration - Registrace - Registración - - Eigentümer - Enregistrement - Registrazione - Registro - Zarejestruj - 登记信息 - - - Search Vehicle - Vyhledávání Vehicle - Buscar Vehículo - - Fahrzeug durchsuchen - Fouiller Véhicule - Cerca Veicolo - Vasculhar Veículo - Przeszukaj pojazd - 搜查载具 - - - Search Container - Vyhledávání Container - Buscar Contenedor - Ricerca Container - Szukaj Kontener - - Fouiller le conteneur - Vasculhar Container - Container durchsuchen - 搜索容器 - - - Pullout Players - Pull Out Hráči - Sacar Jugadores - - Aus Fahrzeug ziehen - Sortir les passagers - Estrai Giocatore - Retirar Jogadores - Wyciągnij graczy - 从载具拉出玩家 - - - Impound Vehicle - úschovy Vehicle - Confiscar Vehículo - - Fahrzeug beschlagnahmen - Mise en fourrière - Sequestra Veicolo - Apreender Veículo - Usunń pojazd - 扣押载具 - - - Mine from device - Mine ze zařízení - Minar desde dispositivo - - Vom Fahrzeug abbauen - Dispositif de minage - Piazza mine dal veicolo - Minerar - Uruchom wydobycie - 矿山设备 - - - Store your vehicle - Ukládat vaše vozidlo - Guardar tu Vehículo - Conservare il veicolo - Przechowuj swój pojazd - - Ranger votre véhicule - Guardar seu veículo - Fahrzeug einparken - 存储你的载具 - - - Store - Obchod - Guardar - Negozio - Sklep - - Ranger - Guardar - Fahrzeughändler - 商场 - - - Clean - Čistý - Limpiar - Pulito - Czysty - - Nettoyer - Limpar - Reinigen - 清洁 - - - This vehicle is NPC protected. - Toto vozidlo je chráněno NPC. - Ce véhicule est protégé par un PNJ. - Este vehículo esta protegido. - Questo veicolo è protetto NPC. - Pojazd ten jest chroniony NPC. - - Esse veículo está protegido. - Dieses Fahrzeug ist NPC-geschützt. - 这载具是NPC保护的。 - - - - - Sending request to server for player information UID [%1] - Odesílání požadavku na server pro informační hráč UID [%1] - Pidiendo informacion del UID de [%1] del server - - Frage Spieler Informationen zu UID [%1] ab... - Envoi de la requête au serveur pour obtenir des informations lecteur UID [%1] - Invio richiesta al server per le informazioni del giocatore UID [%1] - Obtendo informações do UID [%1] no servidor - Wysyłam żądanie do serwera po informację o fraczu UID [%1] - 发送请求到服务器玩家信息UID [%1] - - - The server didn't find any player information matching your UID, attempting to add player to system. - Server nenašel žádné informace hráče nalezen.Chcete UID, pokusu o přidání hráče do systému. - No se encontro ninguna información con tu UID, se esta creando un nuevo jugador. - - Der Server hat keine Spieler Informationen zu deiner UID gefunden, versuche Spieler ins System hinzuzufügen... - Le serveur n'a pas trouvé toutes les informations de lecteur correspondant à votre UID, tentative d'ajout du joueur dans le système. - Il server non ha trovato alcuna informazione sul giocatore con il tuo UID, tentativo di aggiunta del giocatore al sistema. - O servidor não encontrou nenhuma informação correspondente ao seu UID, tentando adicionar jogador ao sistema. - Serwer nie odnalazł informacji zgodnych z UID, dodaję gracza do bazy danych. - 服务器没有找到任何玩家信息匹配你的UID,试图添加播放器系统。 - - - There was an error in trying to setup your client. - Došlo k chybě při pokusu o nastavení vašeho klienta. - Hubo un error en tratando de preparar tu cliente. - - Es gab einen Fehler beim Versuch, deinen Clienten einzurichten! - Il y avait une erreur en essayant de configurer votre client. - C'è stato qualche errore nel cercare di inizializzare il tuo client - Ocorreu um erro ao tentar configurar o seu cliente. - Wystąpił błąd w trakcie ustawiania klienta - 试图设置客户机时出错。 - - - Received request from server... Validating... - Obdržení požadavku ze serveru ... Ověřování ... - Pedido del server recibido... Validando... - - >Empfange Daten vom Server... Überprüfe... - Demande reçue du serveur... Validation... - Ricevuta richiesta dal server... Convalida... - Pedido recebido do servidor... Validando... - Otrzymano żądanie serwera ... sprawdzam - 接收来自服务器的请求...验证... - - - You have already used the sync option, you can only use this feature once every 5 minutes. - Již jste použili možnosti synchronizace, můžete použít pouze tuto funkci jednou za 5 minut. - Ya has usado la función de sincronización, solo la puedes usar una vez cada 5 minutos. - - Du hast bereits deine Daten gespeichert, diese Funktion kann nur einmal alle 5 Minuten verwendet werden. - Vous avez déjà utilisé l'option de synchronisation, vous ne pouvez utiliser cette fonction une fois toutes les 5 minutes. - Hai già utilizzato la funzione di salva dati, puoi usare quest'opzione solo una volta ogni 5 minuti. - Você já usou a opção de sincronização, você só pode usar esse recurso uma vez a cada 5 minutos. - Użyłeś niedawno opcji synchronizacji, możesz jej używać maksymalnie co 5 minut. - 你已经使用了同步数据,你只能每隔5分钟使用一次这个功能。 - - - Syncing player information to the server.\n\nPlease wait up to 20 seconds before leaving. - Synchronizace informace o hráčích na serveru. \ O \ Prosím, vyčkejte až 20 sekund před odjezdem. - Se esta sinconizando tu información con el server.\n\nPor favor espera 20 segundos antes de salir del server. - - Speichere deine Spieler-Informationen auf dem Server. \n\nBitte warte bis zu 20 Sekunden vor dem Verlassen. - Synchronisation des informations de joueur sur le serveur.\n\nS'il vous plaît, veuillez attendre 20 secondes avant de vous déconnecter. - Salvando le informazioni giocatore sul server.\n\nAttendere fino a 20 secondi prima di abbandonare. - Sincronizando informação do jogador com o servidor.\n\n Por favor aguarde 20 segundos antes de sair. - Synchronizuję informację z serwere, .\n\nProszę poczekać ok 20 sekund przed opuszczeniem serwera - 同步玩家数据到服务器。\n\n请等待20秒后再下线。 - - - - - Because you robbed the bank you can't use the ATM for %1 minutes. - Protože jste vyloupil banku nelze použít bankomat pro%1 minut. - Porque robastes el banco no puedes usar el ATM por %1 minutos. - - Da du die Zentralbank ausgeraubt hast, kannst du für %1 Minuten keinen Bankomaten benutzen. - Vous avez pillé la banque, vous ne pouvez pas utiliser de DAB pendant %1 minutes. - Avendo appena rapinato la banca non puoi utilizzare il Bancomat per %1 minuti. - Você não pode usar o ATM por %1 minuto(s), pois você assaltou o banco. - Z uwagi na to że okradłeś bank nie możesz korzystać z bankomatu przez najbliższe %1 minut. - 因为你抢了银行,你不能在 %1 分钟内使用自动取款机。 - - - You didn't choose the clothes you wanted to buy. - Vy nevybral oblečení, které chtěl koupit. - No elegistes lo que quieres comprar. - - Du hast die Kleidung, die du kaufen wolltest, nicht ausgewählt. - Vous n'avez pas choisi les vêtements que vous vouliez acheter. - Non hai selezionato i vestiti che vuoi comprare. - Você não selecionou a roupa que deseja comprar. - Nie wybrałeś ubrań które chcesz kupić. - 你没有选择你想买的衣服。 - - - Sorry sir, you don't have enough money to buy those clothes. - Je nám líto, pane, nemáte dost peněz na nákup ty šaty. - No tienes suficiente dinero. - - Entschuldigung, du hast nicht genug Geld, um diese Kleidung zu kaufen. - Désolé monsieur, vous n'avez pas assez d'argent pour acheter ces vêtements. - Spiacente ma non hai fondi a sufficienza per comprare questi vestiti. - Desculpe senhor, você não tem dinheiro para pagar. Volte sempre. - Przepraszam, ale nie masz tyle pieniędzy aby kupić to ubranie. - 对不起,你没有足够的钱去买那些衣服。 - - - Total: - Celkový: - Total: - - Gesamt: - Total : - Totale: - Total: - Razem: - 总额: - - - No Selection - žádný výběr - No Seleccionastes - - Keine Auswahl! - Aucune Sélection - Nessuna Selezione - Nada Selecionado - Nie wybrano - 没有选择 - - - No Display - Ne Displej - No Display - - Keine Anzeige! - Pas d'affichage - No Display - Sem exibir - Brak widoku - 没有显示 - - - There are no vehicles near to sell. - Nejsou žádné vozy blízko k prodeji. - No hay Vehículos cercanos para vender. - - Es ist keine Fahrzeug zum Verkaufen in der Nähe. - Il n'y a pas de véhicules à proximité à vendre - Nelle vicinanze non ci sono veicoli da vendere. - Não existem veículos para serem vendidos. - W pobliżu nie ma pojazdu do sprzedania. - 附近没有载具出售。 - - - There was a problem opening the chop shop menu. - Tam bylo otevření nabídky kotleta obchod problém. - Hubo un problema abriendo el menu de la tienda. - - Es gab ein Problem beim Öffnen des Schrotthändler Menüs. - Il y a eu un problème en ouvrant le menu de revente de véhicule. - C'è stato un problema aprendo il menu del ricettatore - Ocorreu um problema abrindo o menu, tente novamente. - Powstał problem przy otwieraniu menu dziupli - 打开黑车店菜单有问题。 - - - Selling vehicle please wait... - Prodejní vozidlo čekejte prosím ... - Vendiendo vehículo, por favor espera... - - Verschrotte Fahrzeug, bitte warten... - Vente du véhicule, veuillez patienter... - Vendendo il veicolo, attendere prego... - Vendendo o veiculo, aguarde.... - Sprzedaję pojazd proszę czekać ... - 出售载具请稍候... - - - You need to be a civilian to use this store! - Musíte být civilní použít tento obchod! - Necesitas ser un civil para usar esta tienda! - - Du musst ein Zivilist sein, um dieses Geschäft nutzen zu können! - Vous devez être un civil pour utiliser ce magasin ! - Devi essere un civile per utilizzare questo negozio! - Você tem que ser um cívil para user essa loja! - Musisz być cywilem aby móc kupować w tym sklepie! - 你需要成为平民才能使用这家商店! - - - You need to be a cop to use this store! - Musíte být policista použít tento obchod! - Necesitas ser policía para usar esta tienda! - - Du musst ein Polizist sein, um dieses Geschäft nutzen zu können! - Vous devez être policier pour utiliser ce magasin ! - Devi essere un poliziotto per utilizzare questo negozio! - Você tem que ser um policial para usar essa loja! - Musisz być policjantem aby kupować w tym sklepie! - 你需要当警察来使用这家商店! - - - You don't have rebel training yet! - Nemáte rebelů výcvik ještě! - No tienes Entrenamiento Rebelde! - - Du hast keine Rebellenausbildung absolviert! - Vous n'avez pas encore d'entraînement rebelle ! - Devi essere ribelle per poter utilizzare questo negozio! - Você não tem Treinamento Rebelde! - Nie posiadasz treningu rebelianta! - 你还没有进行叛军训练! - - - You need a Diving license to use this shop! - Potřebujete licenci potápění použít tento obchod! - Necesitas una licencia de buceo para usar esta tienda! - - Du benötigst einen Taucherschein, um dieses Tauchergeschäft nutzen zu können! - Vous devez avoir votre diplôme de plongée pour utiliser ce magasin ! - Ti serve la licenza di pesca per usare questo negozio! - Você precisa de uma Licença de Mergulho para usar essa loja! - Nie posiadasz licencji nurka aby kupować w tym sklepie! - 你需要一张潜水执照才能使用这家商店! - - - You need a %1 to buy from this shop! - Potřebujete %1 koupit od tomto obchodě! - Necesitas un %1 para comprar algo de esta tienda! - - Du benötigst eine %1, um dieses Geschäft nutzen zu können! - Vous avez besoin de %1 pour acheter dans ce magasin ! - Hai bisogno di %1 per comprare da questo negozio! - Você precisa de %1 para comprar nessa loja! - Potrzebujesz %1 by kupować w tym sklepie! - 你需要从这家商店买 %1! - - - Clothing - Oblečení - Ropa - - Kleidung - Tenues - Abiti - Roupas - Odzież - 服装 - - - Hats - klobouky - Sombreros - - Kopfbedeckungen - Chapeaux - Copricapi - Chapéus - Czapki - 帽子 - - - Glasses - Brýle - Lentes - - Brillen - Lunettes - Occhiali - Óculos - Okulary - 眼镜 - - - Vests - vesty - Chalecos - - Westen - Gilets - Vesti - Coletes - Kamizelki - 背心 - - - Backpack - Batoh - Mochillas - - Rucksack - Sacs à dos - Zaini - Mochilas - Plecaki - 背包 - - - There is currently a car there. - Tam je v současné době auto. - Actualmente hay un carro ahi. - - Es steht bereits ein Fahrzeug dort. - Il y a actuellement une voiture. - C'è già un veicolo qui. - Há um veiculo atualmente no respawn. - Aktualnie jest tam samochód. - 目前有一载具在那里。 - - - You do not have enough money on you or in your bank to get your car back. - Nemáte dostatek peněz na vás nebo ve vaší bance, aby si své auto zpátky. - No tienes suficiente dinero para recuperar tu carro. - - Du hast nicht genug Geld bei dir oder auf dem Bankkonto, um dein Auto auslösen zukönnen. - Vous n'avez pas assez d'argent sur vous ou dans votre compte en banque pour récupérer votre voiture. - Non hai abbastanza fondi con te o nel tuo conto in banca per poter ritirare il tuo veicolo. - Você não tem dinheiro suficiente em sua conta bancária para obter seu veiculo. - Nie masz tyle pieniędzy na koncie aby wyciągnąć samochód. - 你没有足够的钱在银行或你的身上。 - - - You have unimpounded your %1 for $%3 - Jste unimpounded svůj %1 na $%3 - Has desembargado tu %1 por $%3 - - Du hast deinen %1 für $%3 ausgelöst. - Vous avez sorti votre %1 pour $%3 - Hai ritirato dal sequestro il tuo %1 al costo di $%3 - Você liberou %1 for R$%3 - Przywróciłeś swój %1 za $%3 - 你为 %1 花费 $%3 - - - You did not pick a vehicle! - Vy nevybral vozidlo! - No has selecionado un vehículo! - - Du hast kein Fahrzeug ausgewählt! - Vous n'avez pas choisi de véhicule ! - Non hai selezionato un veicolo! - Você não conseguiu roubar o veiculo! - Nie wybrałeś pojazdu! - 你没有选择一载具! - - - You do not have enough cash to purchase this vehicle.\n\nAmount Lacking: $%1 - Nemáte dostatek peněz na koupi tohoto vozidla \n\nAmount Postrádat: $%1 - No tienes suficiente dinero para comprar este vehículo.\n\nFalta: $%1 - - Du hast nicht genug Geld, um das Fahrzeug zu kaufen.\n\nFehlender Betrag: $%1 - Vous n'avez pas assez d'argent pour acheter ce véhicule \n\nArgent Manquant: $%1 - Non hai fondi sufficienti per comprare questo veicolo.\n\nTi mancano: $%1 - Você não tem dinheiro suficiente para comprar esse veiculo.\n\nFaltam: R$%1 - Nie masz tyle pieniędzy by kupić ten pojazd.\n\nBrakuje: $%1 - 你没有足够的现金购买这载具。\n\n缺少资金: $%1 - - - You do not have the required license and/or level! - Nemáte požadovanou licenci! - No tienes la licencia requerida! - - Du besitzt den benötigten Führerschein / Rang nicht! - Vous n'avez pas la licence requise ! - Non hai la licenza richiesta per l'acquisto! - Você não tem a licença necessária! - Nie posiadasz odpowiedniej licencji! - 你没有所需的许可证和/或级别! - - - There is a vehicle currently blocking the spawn point - Tam je vozidlo v současné době blokuje potěr bod - Hay un vehículo bloqueando el punto de Spawn. - - Ein Fahrzeug blockiert gerade den Spawnpunkt. - Il y a actuellement un véhicule qui bloque le point de spawn - C'è già un veicolo che blocca la zona di spawn - Existe um veiculo bloquenado a area de respaw - Inny pojazd blokuje miejsce odrodzenia pojazdów - 目前有一载具挡住了生成点。 - - - You bought a %1 for $%2 - Koupil sis %1 pro $%2 - Comprastes %1 por $%2 - - Du kaufst eine(n) %1 für $%2. - Vous avez acheté un %1 pour $%2 - Hai comprato un %1 al costo di $%2 - Você comprou %1 por R$%2 - Kupiłeś %1 za $%2 - 你买了一个 %1 花费 $%2 - - - You rented a %1 for $%2 - Pronajali jste si %1 za $%2 - Alquiló un %1 por $%2 - Вы арендовали %1 за $%2 - Sie haben %1 für $%2 gemietet - Vous avez loué un %1 pour $%2 - Hai noleggiato un %1 per $%2 - Você alugou um %1 por $%2 - Wypożyczyłeś %1 za $%2 - 您以 $%2 的价格租了一个 %1 - - - Rental Price: - Pronájem Cena: - Precio de Renta: - - Mietpreis: - Prix de location : - Costo Noleggio: - Alugar: - Wypożyczenie: - 租赁价格: - - - Ownership Price: - Vlastnictví Cena: - Precio de Compra: - - Kaufpreis: - Prix d'achat : - Costo Acquisto: - Comprar: - Kupno: - 所有权价格: - - - Max Speed: - Maximální rychlost: - Máxima Velocidad: - - Max. Geschwindigkeit: - Vitesse Max : - Velocità Max: - Velocidade Máxima: - Prędkość: - 最大速度: - - - Horse Power: - Koňská síla: - Caballos de Fuerza: - - Pferdestärken: - Puissance en chevaux : - Cavalli: - Cavalos de Força: - Moc: - 马力: - - - Passenger Seats: - Sedadla pro cestující: - Asientos de Pasajeros: - - Passagierplätze: - Sièges passager : - Sedili passeggeri: - Assentos: - Ilość miejsc: - 乘客座位: - - - Trunk Capacity: - Zavazadlový prostor Kapacita: - Capacidad de Maletero: - - Kofferraumgröße: - Capacité du coffre : - Capacità Inventario: - Capacidade do Inventário: - Pojemność bagażnika: - 后备箱容积: - - - Fuel Capacity: - Palivo Kapacita: - >Capacidad de Combustible: - - Tankgröße: - Capacité du réservoir : - Capacità Serbatoio: - Capacidade do Reservatório: - Pojemność baku: - 燃料容量: - - - Armor Rating: - Armor Hodnocení: - Clasificación de Armadura: - - Panzerungsbewertung: - Blindage : - Resistenza: - Resistência: - Pancerz - 护甲值: - - - Retrieval Price: - Retrieval Cena: - Precio de Recuperación: - - Einstellpreis: - Prix de sortie : - Costo di ritiro: - Preço para Recuperar: - Koszt wyciągnięcia: - 检索价格: - - - Sell Price: - Prodejní cena: - Precio de Venta: - - Verkaufspreis: - Prix de vente : - Costo di vendita: - Preço de Venda - Cena sprzedaży: - 出售价格: - - - Color: - Barva: - Color: - - Farbe: - Couleur : - Colore: - Cor: - Kolor - 颜色: - - - You are not allowed to use this shop! - Ty jsou není dovoleno používat tento obchod! - No tienes permiso de usar esta tienda! - - Du bist nicht befugt, dieses Geschäft zu benutzen! - Vous n'êtes pas autorisé à utiliser cette boutique ! - Non sei autorizzato ad usare questo negozio! - Você não está autorizado a utilizar essa loja! - Nie jesteś uprawniony do używania tego sklepu! - 不许你使用这家商店! - - - You need to select an item to buy. - Je třeba vybrat položku, kterou chcete koupit. - Debes selecionar un objeto para comprar. - - Du musst einen Gegenstand auswählen, um ihn zu kaufen. - Vous devez sélectionner un objet pour l'acheter. - Seleziona un oggetto per poterlo comprare. - Você precisa selecionar um item para comprar. - Musisz zaznaczyć co chcesz kupić. - 你需要选择要购买的物品。 - - - You didn't enter an actual number - Nezadal jste skutečný počet - No metistes un numero real - - Du hast keine echte Zahl eingegeben. - Vous n'avez pas saisi un nombre réel - Non hai inserito correttamente un numero - Você não digitou um número válido. - Nie podałeś aktualnego numeru - 你没有输入一个正确的数字 - - - You don't have that many items to sell! - Nemusíte, že mnoho položek k prodeji! - No tienes tantos objetos! - - Du hast nicht so viele Gegenstände zum Verkaufen! - Vous n'avez pas autant d'objets à vendre ! - Non hai tutti quegli oggetti da vendere! - Você não tem todos esse items para vender - Nie masz tak dużo rzeczy do sprzedania! - 你没有那么多物品可以出售! - - - The gang has enough funds to pay for this, would you like to pay with the gangs funds or your own? - Gang má dostatek finančních prostředků na zaplacení za to, byste chtěli platit fondů bandy nebo sami? - Tu pandilla tiene suficiente dinero para pagar esto, quieres pagar con ese dinero o el tuyo? - - Die Gang hat genügend Geld, um dafür zu zahlen. Willst du mit dem Geld der Gang oder deinem Eigenem bezahlen? - Le gang a suffisamment de fonds pour payer pour cela, voulez-vous payer avec les fonds de gangs ou avec votre propre argent ? - La Gang ha fondi a sufficienza per pagare questo oggetto, vuoi usare i fondi della Gang o i tuoi personali? - A Gangue tem dinheiro suficiente para pagar por isso, você gostaria de usar o dinheiro da Gangue? - Gang posiada wystarczającą ilość środków aby za to zapłacić, chcesz zapłacić za to środkami gangu, czy własnymi? - 帮派有足够的钱来支付这笔钱,你愿意用帮派的钱还是自己的钱? - - - Gang Funds: - Gang fondy: - Fondos de Pandilla: - - Geld der Gang: - Fonds du gang : - Fondi Gang: - Fundos da Gangue: - Środki gangu: - 帮派资金: - - - Your Cash: - Váš Cash: - Tu dinero: - - Bargeld: - Votre argent : - Tuoi Fondi: - Seu Dinheiro: - Twoje środki: - 你的现金: - - - Pay with cash or gang funds - Platit v hotovosti nebo gangů fondů - Pagar con tu dinero o el de tu pandilla? - - Mit Bargeld oder Geld der Gang bezahlen? - Payez avec votre argent ou avec les fonds du gang - Paga con i tuoi contanti o con i fondi della Gang - Pagar com a sua conta ou a da Gangue - Zapłać gotówką albo środkami gangu - 用现金或帮派基金支付 - - - Gang Funds - Gang fondy - Fondos de la Pandilla - - Geld der Gang - Fonds du gang : - Fondi Gang - Gangue - Środki gangu - 帮派资金 - - - Your Cash - Váš Cash - Tu dinero - - Bargeld: - Votre argent - Tuoi Fondi - Seu - Twoje środki - 你的现金 - - - You bought %1 %2 for $%3 with the gangs funds - Koupili jste% %1 %2 za $ 3 s fondy gangů - Comprastes %1 %2 por $%3 con el dinero de la pandilla - - Du kaufst %1 %2 für $%3 mit dem Geld der Gang - Vous avez acheté %1 %2 pour $%3 avec les fonds gangs - Hai comprato %1 %2 al costo di $%3 con i fondi della Gang - Você comprou %1 %2 por R$%3 com o dinheiro da gangue - Kupiłeś %1 %2 za $%3 ze środków gangu - 你购买 %1 %2 花费 $%3 帮派基金 - - - You bought %1 %2 for $%3 - Koupili jste% %1 2 na $ %3 - Comprastes %1 %2 por $%3 - - Du hast %1 %2 für $%3 gekauft. - Vous avez acheté %1 %2 pour $%3 - Hai comprato %1 %2 al costo di $%3 - Voce comprou %1 %2 por R$%3 - Kupiłeś %1 %2 za $%3 - 你购买 %1 %2 花费 $%3 - - - You sold %1 %2 for $%3 - Prodali jste% %1 2 na $ %3 - Vendistes %1 %2 por $%3 - - Du hast %1 %2 für $%3 verkauft. - Vous avez vendu %1 %2 pour $%3 - Hai venduto %1 %2 al prezzo di $%3 - Você vendeu %1 %2 por R$%3 - Sprzedałeś %1 %2 za $%3 - 你出售 %1 %2 得到 $%3 - - - You need to select an item to buy/sell. - Je třeba vybrat položku na buy / sell. - Necesitas seleccionar un objetar para vender/comprar. - - Du musst einen Gegenstand auswählen, um ihn zu kaufen / zu verkaufen. - Vous devez sélectionner un objet à acheter/vendre. - Devi selezionare un oggetto per comprare/vendere. - Selecione um item para comprar ou vender. - Musisz wybrać rzecz którą chcesz kupić/sprzedać - 你需要选择一个物品来购买/出售。 - - - You sold a %1 for <t color='#8cff9b'>$%2</t> - prodával jsi %1 pro <t color='#8cff9b'>$%2</t> - Vendistes un %1 por <t color='#8cff9b'>$%2</t> - - Du hast eine %1 für <t color='#8cff9b'>$%2</t> verkauft. - Vous avez vendu un %1 pour <t color='#8cff9b'>$%2</t> - Hai venduto un %1 al prezzo di <t color='#8cff9b'>$%2</t> - Você vendeu %1 por <t color='#8cff9b'>R$%2</t> - Sprzedałeś %1 za <t color='#8cff9b'>$%2</t> - 你出售 %1 得到 <t color='#8cff9b'>$%2</t> - - - You bought a %1 for <t color='#8cff9b'>$%2</t> with the gangs funds. - Koupil sis %1 pro <t color='#8cff9b'>$%2</t> s peněžními prostředky gangů. - Comprastes un %1 por <t color='#8cff9b'>$%2</t> con los fondos de tu pandilla. - - Du hast mit dem Geld der Gang eine %1 für <t color='#8cff9b'>$%2</t> gekauft. - Vous avez acheté un %1 pour <t color='#8cff9b'>$%2</t> avec les fonds du gang. - Hai comprato un %1 al costo di <t color='#8cff9b'>$%2</t> con i fondi della Gang. - Você comprou %1 por <t color='#8cff9b'>R$%2</t> com o dinheiro da gangue. - Kupiłeś %1 za <t color='#8cff9b'>$%2</t> ze środków gangu. - 你购买 %1 花费 <t color='#8cff9b'>$%2</t> 黑帮基金。 - - - You bought a %1 for <t color='#8cff9b'>$%2</t> - Koupil sis %1 pro <t color='#8cff9b'>$%2</t> - Comprastes un %1 por <t color='#8cff9b'>$%2</t> - - Du hast eine %1 für <t color='#8cff9b'>$%2</t> gekauft. - Vous avez acheté un %1 pour <t color='#8cff9b'>$%2</t> - Hai comprato un %1 al costo di <t color='#8cff9b'>$%2</t> - Você comprou %1 por <t color='#8cff9b'>R$%2</t> - Kupiłeś %1 za <t color='#8cff9b'>$%2</t> - 你购买 %1 花费 <t color='#8cff9b'>$%2</t> - - - Shop Inventory - Obchod Zásoby - Inventario de la Tienda - - Ladeninventar - Inventaire de la boutique - Inventario Negozio - Loja de Inventário - Wyposażenie sklepu - 店铺库存 - - - Your Inventory - Váš Inventory - Tu inventario - - Dein Inventar - Votre inventaire - Inventario Personale - Seu Inventário - Twoje wyposażenie - 你的库存 - - - - - You will receive your next paycheck in %1 minutes. - Obdržíte svůj další výplatní pásku v %1 minut. - Recibiras tu siguiente pago en %1 minutos - - Du erhältst deinen nächsten Gehaltsscheck in %1 Minuten. - Vous recevrez votre prochaine paye dans %1 minutes. - Riceverai il tuo prossimo stipendio in %1 minuti. - Você irá receber seu próximo pagamento em %1 minuto(s). - Otrzymasz kolejną wypłatę w ciągu %1 minut. - 你将在 %1 分钟后收到你的下一张薪水支票。 - - - You have missed a paycheck because you were dead. - Jste vynechal výplatu, protože jste byli mrtví. - Te has perdido un pago por estar muerto. - - Du erhältst kein Gehaltsscheck, da du gestorben bist. - Vous n'avez pas reçu votre paye en raison de votre mort. - Hai perso uno stipendio . - Você não recebeu seu pagamento pois estava morto. - Ominęła cię wypłata ponieważ byłeś martwy. - 因为你死了,你错过了薪水。 - - - You have received a paycheck of $%1. - Dostali jste výplatu ve výši $ %1. - Has recibido un pago de $%1 - - Du hast deinen Gehaltscheck in Höhe von $%1 erhalten. - Vous avez reçu votre paye de $%1. - Hai ricevuto uno stipendio di $%1. - Você recebeu seu pagamento de R$%1. - Otrzymałeś wypłatę w kwocie $%1. - 你收到了一张 $%1 的薪水支票。 - - - - - Refuel Fuel Canister - Tankovat paliva kanystr - Ravitailler le bidon en carburant - Llenar Bidón de Combustible - Fare rifornimento di carburante scatola metallica - Tankowanie paliwa Canister - Reabastecer de combustível vasilha - Заправить баллон с горючим - Benzinkanister befüllen - 给汽油桶加油 - - - Refuel Vehicle - tankovací Vehicle - Llenar Vehículo - Fare rifornimento di veicoli - Tankowanie samochodów - - Reabastecer Veículo - Ravitailler en essence le véhicule - Fahrzeug auftanken - 给车加油 - - - Price per Liter: $%1 - Cena za litr: $ %1 - Precio por Litro: $%1 - Prezzo al litro: $%1 - Cena za litr: $%1 - - Preço por Litro : R$%1 - Prix au Litre : $%1 - Preis pro Liter: $%1 - 每升价格:$%1 - - - Current Fuel Amount: - Aktuální výše Palivo: - Quantité de carburant actuelle : - Actual cantidad de combustible: - Quantità corrente di benzina: - Aktualny Ilość paliwa: - - Quantidade Atual de Combustível: - Aktuelle Kraftstoffmenge: - 当前燃料量: - - - Select a vehicle - Vyberte si vůz - Selecciona un Vehículo - Selezionare un veicolo - Wybierz pojazd - - Selecione um veículo - Sélectionner un vehicule - Wähle ein Fahrzeug: - 选择载具 - - - The vehicle is too far or you are in! - Vozidlo je příliš daleko, nebo jste se! - El Vehículo esta muy lejos o tu estas adentro! - Il veicolo è troppo lontano o vi sei all'interno! - Pojazd jest zbyt daleko lub jesteś w! - - O veículo está muito longe ou você está nele! - Le véhicule est peut-etre trop loin, ou tu es dedans ! - Das Fahrzeug ist zu weit entfernt oder du sitzt noch drin! - 载具太远了,或者你在载具里! - - - The vehicle is full! - Vozidlo je plná! - El Vehículo esta lleno! - Il veicolo è pieno! - Pojazd jest pełna! - - O veículo está cheio! - Le véhicule est plein ! - Das Fahrzeug ist voll! - 载具已满! - - - - - Drop Fishing Net - Drop rybářská síť - Tirar Red de Pesca - - Fischernetz auswerfen - Lancer le filet de pêche - Drop Fishing Net - Jogar Rede de Pesca - Zarzuć sieć - 放下渔网 - - - Rob Person - Rob Pearson - Robar Persona - - Person ausrauben - Voler la personne - Deruba - Roubar Jogador - Obrabuj osobę - 抢劫此人 - - - - - Fish Market - Rybí trh - Marché aux poissons - Mercado de Pescado - - Fischmarkt - Peixaria - Sklep rybny - Pescivendolo - 海产品市场 - - - Hospital - Nemocnice - Hôpital - Hospital - - Krankenhaus - Hospital - Szpital - Ospedale - 医院 - - - Police Station - Policejní stanice - Poste de police - Estación de Policia - - Polizei Revier - Estação Policial - Posterunek policji - Questura - 警察分局 - - - Police Air HQ - Police Air HQ - Base aérienne de la Police - Cuartel Aéreo Policial - QG Aereo Polizia - - Polizei HQ Flughafen - QG Aéreo Policial - Baza lotnicza policji - 警察航空总部 - - - Iron Mine - Železný důl - Mine de fer - Mina de Hierro - - Eisenmine - Mina de Ferro - Kopalnia miedzi - Miniera di ferro - 铁矿 - - - Salt Mine - Solný důl - Mine de sel - Mina de Sal - - Salzmine - Mina de Sal - Kopalnia soli - Salina - 盐矿 - - - Salt Processing - sůl Processing - Traitement de sel - Procesador de Sal - - Salzverarbeitung - Processador de Sal - Warzelnia soli - Processo del sale - 食盐制造厂 - - - Altis Corrections - Altis Opravy - Prison d'Altis - Prisión de Altis - - Altis Bundesgefängnis - Prisão de Altis - Więzienie Altis - Penitenziario di Altis - 监狱 - - - Tanoa Corrections - Tanoa Opravy - Prison de Tanoa - Prisión de Tanoa - - Tanoa Bundesgefängnis - Prisão de Tanoa - Więzienie Tanoa - Penitenziario di Tanoa - Tanoa更正 - - - Police HQ - Police HQ - QG de la police - Comisaria de Policía - QG Polizia - - Polizei HQ - QG Policial - KG Policji Altis - 警察总部 - - - Coast Guard - pobřežní hlídka - Garde-côte - Guardia Costera - - Küstenwache - Guarda Costeira - Straż przybrzeżna - Guardia Costiera - 海岸警卫队 - - - Rebel Outpost - Rebel Outpost - Avant-Poste Rebelle - Base Rebelde - Avamposto Ribelle - - Rebellen Außenposten - Base Rebelde - Baza rebeliantów - 叛军前哨 - - - Air Shop - Air Shop - Concessionnaire aérien - Tienda Aérea - Negozio Aereo - - Luftfahrzeug Händler - Loja Aérea - Sklep lotniczy - 空中载具商店 - - - Truck Shop - Truck Shop - Vendeur de camion - Tienda de Camiones - - LKW Händler - Loja de Caminhões - Salon ciężarówek - Concessionaria Camion - 卡车商店 - - - Oil Processing - Zpracování olej - Traitement du Pétrole - Procesador de Petróleo - - Öl Verarbeiter - Processador de Petróleo - Rafineria ropy naftowej - Raffineria di Petrolio - 石油加工 - - - Iron Processing - Zpracování Iron - Traitement du Fer - Procesador de Hierro - Processo del ferro - - Eisenschmelze - Processador de Ferro - Huta żelaza - 铁矿加工 - - - Sand Mine - písek Mine - Mine de Sable - Mina de Arena - Miniera di sabbia - - Sand Mine - Mina de Areia - Kopalnia piasku - 采沙场 - - - Chop Shop - Chop Shop - Revendeur de véhicules volés - Desguace Clandestino - Ricettatore - - Schrotthändler - Desmanche - Dziupla - 黑车店 - - - Cocaine Processing - Zpracování kokain - Traitement de Cocaïne - Procesador de Cocaína - Trattamento cocaina - - Kokain Verarbeiter - Processador de Cocaína - Oczyszczanie kokainy - 可卡因加工点 - - - Copper Mine - měděný důl - Mine de Cuivre - Mina de Cobre - Miniera di rame - - Kupfermine - Mina de Cobre - Kopalnia miedzi - 铜矿 - - - ATM - bankomat - DAB - ATM - ATM - - Geldautomat - Caixa Eletrônico - Bankomat - 自动取款机 - - - Local Bank - místní bankovní - Banque locale - Banco Local - Banca locale - - Zentralbank - Banco Local - Bank Altis - 银行 - - - Car Shop - Auto Shop - Concessionnaire - Tienda de Coches - Concessionario d `auto - - Autohändler - Loja de Carros - Salon samochodowy - 小汽车店 - - - Hospital/Clinic - Nemocnice / Klinika - Clinique - Hospital/Clínica - Ospedale / Clinica - - Krankenhaus - Hospital/Clínica - Klinika Altis - 医院/诊所 - - - Diamond Mine - Diamond Mine - Mine de diamant - Mina de Diamantes - Miniera di diamanti - - Diamanten Mine - Mina de Diamante - Kopalnia diamentów - 钻石矿场 - - - General Store - Obchod se smíšeným zbožím - Magasin général - Tienda General - Strumenti Generali - - Supermarkt - Loja de Equipamentos - Sklep techniczny - 物品商店 - - - Civilian Shops - civilní Obchody - Magasins civils - Tiendas Civiles - Negozi civili - - Geschäft für Zivilisten - Lojas Civis - Sklepy dla cywilów - 平民商店 - - - Boat Shop - Lodní Shop - Concessionnaire de bateaux - Tienda de Barcos - Concessionaria Nautica - - Boots Händler - Loja de Barcos - Sklep z łodziami - 船舶商店 - - - Bruce's Outback Outfits - Bruceovy Outback Oblečení - Vêtements de Bruce - Tienda de Ropa - Outfit di Bruce - - Loja de Roupas - Sklep odzieżowy - Bruce's Outback Outfits - 服装店 - - - Apple Field - Apple Field - Champs de Pommes - Campo de Manzanas - Campo di Mele - - Apfel Plantage - Campo de Maçãs - Sad jabłkowy - 苹果树林 - - - Peaches Field - broskve Field - Champs de Pêches - Campo de Melocotones - Campo di Pesche - - Pfirsich Plantage - Campo de Pêras - Sad brzoskwiniowy - 桃树林 - - - Market - Trh - Marché - Mercado - Mercato - - Markt - Mercado - Market spożywczy - 市场 - - - Air Service Station - Stanice Air Service - Réparateur Aérien - Estación de Servicio Aéreo - Stazione Servizio Aereo - - Werkstatt für Luftfahrzeuge - Estação de Serviços Aéreos - Serwis lotniczy - 航空服务站 - - - Channel 7 News - Channel 7 News - Chaine d'infos Numéro 7 - Canal de Noticias 7 - Notiziario di Altis - - Kanal 7 Nachrichtensender - Canal de Notícias 7 - Maszt nadawczy - 新闻广播电台 - - - DMV - DMV - Magasin de licences - Registro de Licencias - - Zulassungstelle - Loja de Licenças - Urząd licencyjny - Licenze - 许可证办理 - - - Delivery Missions - Dodací mise - Missions de livraison - Misiones de Entrega - - Kurier Mission - Missões de Entrega - Misje kurierskie - Missioni Postali - 快递任务 - - - Deliver Package - doručit balíček - Livrer le paquet - Entregar Paquete - - Paket ausliefern - Entregar Pacote - Dostarcz przesyłkę - Consegna il pacco - 完成快递任务 - - - Get Delivery Mission - Získat Delivery mise - Obtenir Mission de livraison - Empezar Misión de Entrega - - Starte Kurier Mission - Pegar Missão de Entrega - Pobierz przesyłkę do dostarczenia - Ottieni una missione postale - 得到快递任务 - - - Diving Shop - Potápění Shop - Boutique de plongée - Tienda de Buceo - - Steve's Taucherausrüstung - Loja de Mergulho - Akcesoria do nurkowania - Negozio da Sub - 潜水店 - - - Drug Dealer - Drug prodejce - Dealeur de drogue - Narcotraficante - - Drogendealer - Traficante - Diler narkotyków - Spacciatore - 毒贩 - - - Diamond Processing - Diamond Processing - Traitement du diamant - Procesador de Diamante - - Diamantenschleifer - Processador de Diamante - Szlifierz diamentów - Processo diamanti - 钻石加工 - - - Oil Field - Ropné poles - Champ de Pétrole - Campo de Petróleo - - Öl Felder - Campo de Petróleo - Szyb naftowy - Giacimento di Petrolio - 油田 - - - Marijuana Field - Marihuana Field - Champ de Marijuana - Campo de Marihuana - - Marihuana Plantage - Campo de Maconha - Pole marihuany - Campo di Marijuana - 大麻产地 - - - Marijuana Processing - Zpracování marihuana - Traitement de la Marijuana - Procesador de Marihuana - - Marihuana Verarbeitung - Processador de Maconha - Suszarnia marihuany - Trattamento Marijuana - 大麻加工 - - - Boat Spawn - Lodní potěr - Port - Spawn de Barcos - - Boot Spawn - Spawn de Barcos - Przystań - Consegna Barche - 码头 - - - Copper Processing - Zpracování měď - Traitement du cuivre - Procesador de Cobre - - Kupferschmelze - Processador de Cobre - Huta miedzi - Processo Rame - 铜矿加工 - - - Coca Field - Coca Field - Champ de Cocaïne - Campo de Cocaína - - Kokain Plantage - Campo de Cocaína - Pole kokainy - Campo di Cocaina - 可卡因树林 - - - Oil Trader - olej Trader - Vendeur de pétrole - Comerciante de Petróleo - - Öl Händler - Comprador de Petróleo - Skup benzyny - Vendita Olio - 石油贸易商 - - - Salt Trader - sůl Trader - Vendeur de sel - Comerciante de Sal - - Salz Händler - Comprador de Sal - Skup soli - Vendita Sale - 食盐贸易商 - - - Diamond Trader - Diamond Trader - Vendeur de diamant - Comerciante de Diamantes - - Juwelier - Comprador de Diamante - Skup diamentów - Vendita Diamanti - 钻石贸易商 - - - Glass Trader - sklo Trader - Vendeur de verre - Comerciante de Vidrio - - Glasbläserei - Comprador de Vidro - Skup szkła - Vendita del Vetro - 玻璃贸易商 - - - Iron / Copper Trader - Žehlička / Měď Trader - Vendeur de minerais - Comerciante de Hierro / Cobre - - Industriehandel - Comprador de Ferro e Cobre - Skup metali - Vendita del Ferro/Rame - 铁/铜交易商 - - - Sand Processing - Zpracování písek - Traitement du sable - Procesador de Arena - - Sand Verarbeiter - Processador de Areia - Huta szkła - Processo Sabbia - 玻璃制造厂 - - - Gun Store - Gun Store - Armurerie - Tienda de Armas - - Waffengeschäft - Loja de Armas - Sklep z bronią - Armeria - 武器商店 - - - Opium Poppy Field - Opium Poppy Field - Champ d'héroïne - Campo de Opio - Opium Poppy Field - - Heroin Plantage - Campo de Heroína - Pole heroiny - 罂粟产地 - - - Heroin Processing - Zpracování heroin - Traitement d'héroïne - Procesador de Heroina - Processing eroina - - Heroin Verarbeitung - Processador de Heroína - Oczyszczanie heroiny - 海洛因加工点 - - - Garage - Garáž - Garage - Garaje - Box auto - - Garage - Garagem - Garaż - 载具仓库 - - - Federal Reserve - federální rezervní systém - Banque fédérale - Reserva Federal - - Zentralbank - Reserva Federal - Bank Rezerw Federalnych - Banca Federale - 金库 - - - Highway Patrol Outpost - Dálniční hlídka Outpost - Avant-poste de Police - Puesto de Patrulla de Carretera - - Mautstation - Base da Polícia Rodoviária - Posterunek policji drogowej - Checkpoint di polizia - 公路巡逻队 - - - Rock Quarry - kamenolomu - Mine de pierres - Mina de Piedra - - Steinbruch - Pedreira - Kamieniołom - Cava di Roccia - 采矿石场 - - - Rock Processing - rock Processing - Traitement de pierres - Procesador de Piedra - - Stein Verarbeitung - Processador de Pedra - Wytwórnia cementu z kamienia - Processo Roccia - 水泥制造厂 - - - Cement Trader - cement Trader - Vendeur de ciments - Comerciante de Cemento - - Zement Händler - Comprador de Cimento - Skup cementu - Vendita del Cemento - 水泥贸易商 - - - Turtle Poaching - Turtle pytláctví - Réserve protégée de tortues - Caza de Tortugas - Bracconaggio di Tartarughe - - Wilderei für Schildkröten - Área de Tartarugas - Strefa występowania żółwi morskich - 海龟捕猎区 - - - Turtle Dealer - Turtle prodejce - Dealeur de Tortues - Traficante de Tortugas - - Schildkröten Händler - Comprador de Tartarugas - Skup żółwi - Vendita Tartarughe - 海龟走私商 - - - Go-Kart Shop - Go-Kart Shop - Concessionnaire de karts - Tienda de Go-Kart - - Bobby's Gokarthandel - Loja de Karts - Sklep z GoKartami - Parco Go-Kart - 卡丁车店 - - - Gold Bars Buyer - Gold Bary kupujícího - Acheteur d'Or - Comprador de Oro - - Goldhändler - Comprador de Barras de Ouro - Skup złota - Gioielliere - 金条买家 - - - Gang Hideout 1 - Gang Hideout 1 - Cachette 1 - Escondite de Pandillas 1 - - Gang Versteck 1 - Esconderijo de Gangs 1 - Kryjówka gangu 1 - Covo Gang 1 - 帮派据点1 - - - Gang Hideout 2 - Gang Hideout 2 - Cachette 2 - Escondite de Pandillas 2 - - Gang Versteck 2 - Esconderijo de Gangs 2 - Kryjówka gangu 2 - Covo Gang 2 - 帮派据点2 - - - Gang Hideout 3 - Gang Hideout 3 - Cachette 3 - Escondite de Pandillas 3 - - Gang Versteck 3 - Esconderijo de Gangs 3 - Kryjówka gangu 3 - Covo Gang 3 - 帮派据点3 - - - Hunting Grounds - honební revír - Terrain de chasse - Zona de Caza - - Jagdgebiet - Área de Caça - Strefa polowań - Riserva di Caccia - 狩猎场 - - - Rebel Clothing Shop - Rebel Oblečení Shop - Vêtements rebelle - Tienda de Ropa Rebelde - Rebel negozio di abbigliamento - - Rebellen Kleidungsgeschäft - Loja de Roupas Rebeldes - Magazyn rebelianta - 叛军服装店 - - - Rebel Weapon Shop - Rebel obchodu se zbraněmi - Armurerie rebelle - Tienda de Armas Rebeldes - - Rebellen Waffenhändler - Loja de Armas Rebeldes - Zbrojownia rebelianta - Armeria della Guerriglia - 叛军武器店 - - - Helicopter Shop - vrtulník Shop - Concessionnaire aérien - Tienda de Helicópteros - Elicottero negozio - - Helikopter Händler - Loja de Helicópteros - Sklep lotniczy - 飞行载具店 - - - Fuel Station Store - Palivo Store Station - Cafet' de Station - Tienda de Gasolinera - Stazione di rifornimento Conservare - - Tankstelle - Loja de Conveniência - Sklep OLLEN - 加油站商店 - - - Rebel Market - Rebel Market - Marché Rebelle - Mercado Rebelde - mercato Rebel - - Rebellen Markt - Mercado Rebelde - Market rebelianta - 叛军市场 - - - Question Dealer - Otázka prodejce - Questionner le dealer - Informante - - Informant - Perguntar ao Traficante - Przesłuchaj dilera - Minaccia Spacciatore - 询问经销商 - - - Service Helicopter - Service Vrtulník - Service d'hélicoptère - Helicóptero de Servicio - - Helikopter Werkstatt - Serviço Aéreo - Serwisuj pojazd lotniczy - Servizio Aereo - 维修直升机 - - - Clothing Store - Obchod s oblečením - Vêtements - Tienda de Ropa - - Kleidungsgeschäft - Loja de Roupas - Sklep odzieżowy - Vestiario - 服装店 - - - Medical Assistance - lékařská pomoc - Assistance médicale - Asistencia Médica - - Medizinischer Ersthelfer - Assistência Médica - Pomoc medyczna - Assistenza Medica - 医疗救助 - - - Store vehicle in Garage - Skladovat vozidlo v garáži - Ranger le véhicule dans le garage - Guardar vehículo en el Garaje - - Fahrzeug in Garage einparken - Guardar veículo na Garagem - Umieść pojazd w garażu - Deposita veicolo in garage - 将载具存放在仓库 - - - Cop Item Shop - Cop Item Shop - Magasin de la Police - Tienda de Objetos de Policía - Strumenti - - Polizei Ausrüstung - Loja de Items da Polícia - Zaopatrzenie - 警察物品商店 - - - Cop Clothing Shop - Cop Oblečení Shop - Vêtements de policier - Tienda de Ropa de Policía - Uniformi - - Polizei Uniformen - Loja de Roupas da Polícia - Umundurowanie - 警察服装店 - - - Cop Weapon Shop - Cop obchodu se zbraněmi - Armurerie de Police - Tienda de Armas de Policía - Armeria da Agenti - - Polizei Waffengeschäft - Loja de Armas da Polícia - Broń policji - 警察武器店 - - - Patrol Officer Weapon Shop - Policistou obchodu se zbraněmi - Armurerie d'officier - Tienda de Armas de Oficial de Patrulla - Armeria da Pattuglia - - Loja de Armas de Patrulha - Broń patrolowa - Streifenpolizist Waffengeschäft - 巡警武器商店 - - - Sergeant Weapon Shop - Seržant obchodu se zbraněmi - Armurerie de sergent - Tienda de Armas de Oficial de Sargento - Armeria dei Sergenti - - Lojas de Armas de Sargento - Broń sierżanta - Sergeant Waffengeschäft - 警长武器商店 - - - Vehicle Shop - Shop Vehicle - Concessionnaire de véhicule - Tienda de Vehículos - di veicoli - - Autohändler - Loja de Carros - Pojazdy - sklep - 载具商店 - - - Process Sand - proces Písek - Traiter le sable - Procesar Arena - - Verarbeite Sand - Processar Areia - Przetop piasek na szkło - Lavorazione Sabbia - 把沙子制造成玻璃 - - - Process Rock - proces rock - Traiter la pierre - Procesar Piedra - - Verarbeite Stein - Processar Pedra - Zmiel skały na cement - Processo Roccia - 把矿石制造成水泥 - - - Wong's Food Cart - Křídla Food košík - Magasin de Wong - Kiosko de Wong - Wong Food Cart - - Wong's Spezialitäten - Boteco do Wongs - Bar u Wonga - 食品商人 - - - Open Vault - otevřená Vault - Ouvrir coffre - Abrir Bóveda - Apri Cassaforte - - Geöffneter Tresor - Abrir Cofre - Otwórz skarbiec - 打开金库 - - - Fix Vault - Fix Vault - Réparer coffre - Reparar Bóveda - - Tresor reparieren - Consertar Cofre - Napraw skarbiec - Ripara Cassaforte - 修复金库 - - - Federal Reserve - Front Entrance - Federální rezervní systém - přední vchod - Banque fédérale - Entrée avant - Reserva Federal - Entrada Principal - Riserva Federale - Entrata Frontale - - Zentralbank - Haupteingang - Reserva Federal - Entrada Frontal - Rezerwa federalna - wejście główne - 金库-前门 - - - Federal Reserve - Side Entrance - Federální rezervní systém - Boční vchod - Banque fédérale - Entrée latérale - Reserva Federal - Entrada Lateral - Riserva Federale - Ingresso laterale - - Zentralbank - Seiteneingang - Reserva Federal - Entrada Lateral - Rezerwa federalna - wejście boczne - 金库-侧门 - - - Federal Reserve - Back Entrance - Federální rezervní systém - zadní vchod - Banque fédérale - Entrée Arrière - Reserva Federal - Entrada Trasera - Riserva Federale - Ingresso sul Retro - - Zentralbank - Hintereingang - Reserva Federal - Entrada Traseira - Rezerwa federalna - wejście tylne - 金库-后门 - - - Federal Reserve - Vault View - Federální rezervní systém - Vault View - Banque fédérale - Voir Coffre - Reserva Federal - Vista a la Bóveda - Riserva Federale - Vista della Cassaforte - - Zentralbank - Tresor - Reserva Federal - Visão do Cofre - Rezerwa federalna - skarbiec - 金库-保险箱 - - - Turn Off Display - Vypnout displej - Désactiver l'affichage - Apagar el Display - Disattivare la visualizzazione - - Bildschirm ausschalten - Desligar Monitor - Wyłącz wyświetlacz - 关闭显示 - - - Armament - Vyzbrojení - Armement - Armamento - Armamento - - Rüstkammer - Armamento - Zbrojownia gangu - 武器装备 - - - EMS Item Shop - EMS Item Shop - Magasin de médecin - Tienda de Objetos de Médico - Strumenti EMS - - Sanitäter Ausrüstung - Loja de Items Médicos - Wyposażenie medyczne - 医疗物品店 - - - EMS Clothing Shop - EMS Oblečení Shop - Uniformes du SAMU - Tienda de Ropa de Médico - Uniformi EMS - - Sanitäter Kleidungsgeschäft - EMS Roupa Loja - Sklep odzieżowy EMS - 医疗服装店 - - - Helicopter Garage - vrtulník Garáž - Garage d'hélicoptère - Garaje de Helicóptero - Garage d'Elicotteri - - Helikopter Hangar - Garagem Aérea - Hangar lotniczy - 直升机库 - - - Car Garage - Car Garage - Garage de voitures - Garaje de Coches - - Fahrzeug Garage - Garagem de Carros - Hangar lotniczy - Garage Automobili - 载具仓库 - - - Pay Bail - Pay Bail - Payer la caution - Pagar Fianza - - Zahle Kaution - Pagar Fiança - Zapłać kaucję - Paga cauzione - 支付保释金 - - - - - Remove Uniform - Remove Uniform - Remove Uniform - Remove Uniform - Entferne Kleidung - Retirer uniforme - Remove Uniform - Remove Uniform - Remove Uniform - 删除制服 - - - Remove Hat - Remove Hat - Remove Hat - Remove Hat - Entferne Kopfbedeckung - Retirer chapeau - Remove Hat - Remove Hat - Remove Hat - 删除帽子 - - - Remove Glasses - Remove Glasses - Remove Glasses - Remove Glasses - Entferne Brille - Retirer lunettes - Remove Glasses - Remove Glasses - Remove Glasses - 删除眼镜 - - - Remove Vest - Remove Vest - Remove Vest - Remove Vest - Entferne Weste - Retirer gilet - Remove Vest - Remove Vest - Remove Vest - 删除背心 - - - Remove Backpack - Remove Backpack - Remove Backpack - Remove Backpack - Entferne Rucksack - Retirer sac - Remove Backpack - Remove Backpack - Remove Backpack - 删除背包 - - - Casual Wears - Casual Wears - Casual Wears - Casual Wears - Büro Kleidung - Casual Wears - Casual Wears - Casual Wears - Casual Wears - 休闲装 - - - Hat and Bandana - Hat and Bandana - Hat and Bandana - Hat and Bandana - Mütze und Kopftuch - Chapeau et bandana - Hat and Bandana - Hat and Bandana - Hat and Bandana - 帽子和头巾 - - - Cop Uniform - Cop Uniform - Cop Uniform - Cop Uniform - Polizei Uniform - Uniforme de service - Cop Uniform - Cop Uniform - Cop Uniform - 警察制服 - - - EMS Uniform - EMS Uniform - EMS Uniform - EMS Uniform - Sanitäter Uniform - Uniforme du SAMU - EMS Uniform - EMS Uniform - EMS Uniform - 医疗制服 - - - EMS Backpack - EMS Backpack - EMS Backpack - EMS Backpack - Sanitäter Rucksack - Sac à dos SAMU - EMS Backpack - EMS Backpack - EMS Backpack - 医疗背包 - - - Flashbang - Flashbang - Flashbang - Flashbang - Blendgranate - Flashbang - Flashbang - Flashbang - Flashbang - 闪光弹 - - - Stun Pistol - Stun Pistol - Stun Pistol - Stun Pistol - Betäubungs-Pistole - Taser - Stun Pistol - Stun Pistol - Stun Pistol - 眩晕手枪 - - - Taser Rifle - Taser Rifle - Taser Rifle - Taser Rifle - Betäubungs-Gewehr - Fusil taser - Taser Rifle - Taser Rifle - Taser Rifle - 泰瑟步枪 - - - Taser Rifle Magazine - Taser Rifle Magazine - Taser Rifle Magazine - Taser Rifle Magazine - Betäubungs-Gewehr-Magazine - Chargeurs de fléchettes électriques - Taser Rifle Magazine - Taser Rifle Magazine - Taser Rifle Magazine - 泰瑟步枪弹匣 - - - Northern Rebel Base - Northern Rebel Base - Northern Rebel Base - Northern Rebel Base - Nord Rebellen Basis - Base rebelle Nord - Northern Rebel Base - Northern Rebel Base - Northern Rebel Base - 北部叛军基地 - - - Southern Rebel Base - Southern Rebel Base - Southern Rebel Base - Southern Rebel Base - Süd Rebellen Basis - Base rebelle Sud - Southern Rebel Base - Southern Rebel Base - Southern Rebel Base - 南部叛军基地 - - - Eastern Rebel Base - Eastern Rebel Base - Eastern Rebel Base - Eastern Rebel Base - Ost Rebellen Basis - Base rebelle Est - Eastern Rebel Base - Eastern Rebel Base - Eastern Rebel Base - 东部叛军基地 - - - North Western Rebel Base - North Western Rebel Base - North Western Rebel Base - North Western Rebel Base - Nord-West Rebellen Basis - Base rebelle Nord-Ouest - North Western Rebel Base - North Western Rebel Base - North Western Rebel Base - 西北叛军基地 - - - North Eastern Rebel Base - North Eastern Rebel Base - North Eastern Rebel Base - North Eastern Rebel Base - Nord-Ost Rebellen Basis - Base rebelle Nord-Est - North Eastern Rebel Base - North Eastern Rebel Base - North Eastern Rebel Base - 东北叛军基地 - - - Kavala Hospital - Kavala Hospital - Kavala Hospital - Kavala Hospital - Kavala Krankenhaus - Hôpital de Kavala - Kavala Hospital - Kavala Hospital - Kavala Hospital - Kavala医院 - - - Athira Regional - Athira Regional - Athira Regional - Athira Regional - Athira Krankenhaus - Hôpital d'Athira - Athira Regional - Athira Regional - Athira Regional - Athira地区 - - - Pyrgos Hospital - Pyrgos Hospital - Pyrgos Hospital - Pyrgos Hospital - Pyrgos Krankenhaus - Hôpital de Pyrgos - Pyrgos Hospital - Pyrgos Hospital - Pyrgos Hospital - Pyrgos医院 - - - South East Hospital - South East Hospital - South East Hospital - South East Hospital - Süd-Ost Krankenhaus - Hôpital du Sud-Est - South East Hospital - South East Hospital - South East Hospital - 东南医院 - - - Tanouka Regional - Tanouka Regional - Tanouka Regional - Tanouka Regional - Tanouka Krankenhaus - Hôpital de Tanouka - Tanouka Regional - Tanouka Regional - Tanouka Regional - Tanouka地区 - - - North East Airport Hospital - North East Airport Hospital - North East Airport Hospital - North East Airport Hospital - Nord-Ost Flughafen Krankenhaus - Hôpital de l'aéroport - North East Airport Hospital - North East Airport Hospital - North East Airport Hospital - 东北机场医院 - - - North Airport HQ - North Airport HQ - North Airport HQ - North Airport HQ - Nord Flughafen HQ - Base aérienne nord - North Airport HQ - North Airport HQ - North Airport HQ - 北部机场总部 - - - South Western Airport HQ - South Western Airport HQ - South Western Airport HQ - South Western Airport HQ - Süd-Westliche HQ Flughafen - Base aérienne sud-ouest - South Western Airport HQ - South Western Airport HQ - South Western Airport HQ - 西南机场总部 - - - - - Vehicular Manslaughter - dopravní zabití - Vol de véhicule - Homicidio Vehicular - Omicidio colposo veicolare - Kołowego Manslaughter - - Atropelamento - Fahrlässige Tötung - 载具撞人 - - - Manslaughter - Zabití - Homicide involontaire - Homicidio - Omicidio colposo - Zabójstwo - - Homicidio Involuntario - Totschlag - 过失杀人 - - - Escaping Jail - Jak uniknout vězení - Evasion de prison - Escaparse de la Cárcel - Fuga dalla prigione - Uciekając Jail - - Fuga da Prisão - Ausbruch - 逃离监狱 - - - Attempted Auto Theft - Pokusili Theft Auto - Tentative de vol de véhicule - Atentado: Robo de Vehículo - Tentativo di furto d'auto - Próba Theft Auto - - Tentativa de Roubo de Veiculo - Versuchter Autodiebstahl - 企图盗窃载具 - - - Use of illegal explosives - Používání nelegálních výbušnin - Utilisation d'explosifs illégaux - Uso de Explosivos Ilegales - Uso di esplosivi illegali - Używanie nielegalnych materiałów wybuchowych - - Uso de explosivos ilegais - Verwendung von illegalen Sprengstoff - 使用非法爆炸物 - - - Robbery - Loupež - Vol - Robo - Rapina - Rozbój - - Roubo - Raub - 抢劫 - - - Kidnapping - Únos - Enlèvement - Secuestro - Rapimento - Porwanie - - Sequestro - Entführung - 绑架 - - - Attempted Kidnapping - pokus o únos - Tentative de kidnapping - Atentado: Secuestro - - Tentativa de Sequestro - Versuchte Entführung - Tentativo di rapimento - Próba porwania - 绑架未遂 - - - Public Intoxication - veřejné Intoxikace - Intoxication publique - Intoxicación Pública - - Uso de Droga em Publico - Öffentlicher Drogenmissbrauch - Uso di stupefacenti in pubblico - Upojenie publiczny - 公共场合使用非法药品 - - - Grand Theft - velká loupež - Vol de voiture - Robo Mayor - grande furto - Wielka kradzież - - Grande Roubo - Auto Diebstahl - 盗窃 - - - Petty Theft - Petty Theft - Petit vol - Robo Menor - piccoli furti - Drobnych kradzieży - - Pequeno Roubo - Kleiner Diebstahl - 小偷小摸 - - - Hit and run - Zavinit nehodu a ujet - Délit de fuite - Pega y Corre - Mordi e fuggi - Uderz i uciekaj - - Fugir de Batida - Fahrerflucht - 交通肇事后逃逸 - - - Drug Possession - držení drog - Possession de drogue - Posesión de Drogas - possesso di droga - Posiadanie narkotyków - - Posse de Droga - Drogenbesitz - 持有毒品 - - - Intent to distribute - Intent distribuovat - Intention de distribuer - Intención de Distribuir - - Tentativa de Trafico - Versuchter Drogenhandel - Tentativo di spaccio - Zamiarem dystrybucji - 意图散布 - - - Drug Trafficking - Obchodování s drogami - Trafic de drogue - Tráfico de Drogas - - Trafico de Drogas - Drogenhandel - Vendita di droga - Handel narkotykami - 贩毒 - - - Burglary - loupež - Cambriolage - Robo de Casa - furto con scasso - Włamanie - - Arrombamento - Einbruch - 盗窃 - - - Tax Evasion - Daňový únik - Évasion fiscale - Evadir Impuestos - - Evasão Fiscal - Steuerhinterziehung - Evasione delle tasse - Unikanie podatków - 逃税 - - - Terrorism - Terorismus - Terrorisme - Terrorismo - - Terrorismo - Terrorismus - Terrorismo - Terroryzm - 恐怖主义 - - - Unlicensed Hunting - Volně prodejné Hunting - Chasse sans licence - Caza sin Licencia - - Caça sem Licença - Jagen ohne Jagdschein - Caccia senza licenza - Polowanie nielicencjonowane - 无证狩猎 - - - Organ Theft - Organ Krádež - Vol d'organes - Robo de Organos - organo furto - Narząd kradzieżą - - Roubo de Orgãos - Organ Diebstahl - 盗窃公共财物 - - - Attempted Organ Theft - Pokus o krádež Organ - Tentative de vol d'organes - Atentado: Robo de Organos - Tentativo furto di organi - Próba kradzieży narządów - - Tentativa de Roubo de Orgãos - Versuchter Organ Diebstahl - 盗窃公共财物未遂 - - - Driving without license - Jízda bez povolení - Conducir sin Licencia - - Absence du permis de conduire - Dirigir sem Licença - Fahren ohne Führerschein - Guida senza patente - Jazda bez licencji - 无证驾驶 - - - Driving on the wrong side of the road - Jízda v špatným směrem do ulice - Conducir en el lado incorrecto de la calle - - Conduite sur le mauvais côté de la route - Dirigindo no sentido contrario - Guida Contromano - Jazda po niewłaściwej stronie drogi - Fahren in die falsche Richtung der Straße - 在错误的道路上驾驶 - - - Not respecting the signalizations - Nerespektování signalizací - No respetar las señales - - Non respect des signalisations - Não respeitar as sinalizações - Nicht unter Beachtung der Signalisierungen - Mancato rispetto dei segnali stradali - Nie przestrzegając sygnalizacji czy - 不遵守交通灯号 - - - Speeding - rychlá jízda - Exceso de Velocidad - - Excès de vitesse - Excesso de Velocidade - Geschwindigkeitsüberschreitung - Eccesso di velocità - Przyśpieszenie - 超速 - - - No headlight in the night - No světel v noci - Manejar sin luces en la noche - - Absence de phare la nuit - Farois Apagados Durante a Noite - Fahren ohne Licht - Luci spente durante la notte - Brak świateł w nocy - 夜间不开车灯 - - - Driving kart without helmet - Hnací motokáru bez helmy - Manejar un Kart sin casco - - Non-port du casque en Kart - Dirigindo Kart Sem Capacete - Fahren ohne Helm - Guida di Kart senza casco - Jazda bez kasku gokarta - 驾驶卡丁车不戴安全头盔 - - - Badly parked vehicle - Špatně zaparkované vozidlo - Vehículo mal estacionado - - Véhicule mal garé - Veículo Mal Estacionado - Parksünder - Veicolo mal parcheggiato - Źle zaparkowany samochód - 乱停放载具 - - - Rebel vehicle (Not armed) - Rebel vozidla (není ozbrojený) - Vehículo Rebelde (No Armado) - - Véhicule rebel non armé - Veículo Rebelde(Não Armado) - Rebellen Fahrzeug (nicht bewaffnet) - Veicolo blindato(Non armato) - Rebel pojeździe (nie czuwa) - 叛军载具(无武装) - - - Grand Theft (Civilian Vehicle) - Grand Theft (Civilian Vehicle) - Robo Mayor (Vehículo Civil) - - Vol de véhicule civil - Roubo de Veículo (Veículo Civil) - Schwerer Diebstahl (Zivilfahrzeug) - Furto di veicolo (Civile) - Grand Theft (Cywilny Vehicle) - 盗窃载具(民用载具) - - - Grand Theft (Military Vehicle) - Grand Theft (Military Vehicle) - Robo Mayor (Vehículo Militar) - - Vol de véhicule militaire - Roubo de Veículo(Militar) - Schwerer Diebstahl (Dienstfahrzeug) - Furto di veicolo militare - Grand Theft (pojazd wojskowy) - 盗窃载具(军用载具) - - - Armored Vehicle - obrněné vozidlo - Vehículo Blindado - - Véhicules blindés - Veículo Armado - Panzerfahrzeug - Veicolo D'assalto - Opancerzony pojazd - 装甲载具 - - - Flying over the city without authorization - Létání nad městem bez povolení - Volar sobre la ciudad sin autorización - - Survol de ville sans autorisation - Sobrevoando sobre a cidade sem autorização - Fliegen über die Stadt ohne Genehmigung - Guida di velivolo su città abitata senza autorizzazione - Latające nad miastem bez zezwolenia - 未经授权飞越城市 - - - Closing the street without authorization - Uzavření ulici bez povolení - Cerrar las calles sin autorización - - Interdiction de se poser sans autorisation - Fechar Rua Sem Autorização - Absperren der Straße ohne Genehmigung - Impedimento del traffico senza permesso - Zamknięcie ulicy bez zezwolenia - 擅自堵塞街道 - - - Open carry in city (Legal Weapon) - open carry ve městě (právní Weapon) - Cargar Arma Abiertamente en la Ciudad (Arma Legal) - Aprire il trasporto in città (Arma Legale) - Otwarty Carry w mieście (prawny Weapon) - - Arme légale visible en ville - Portar em Cidades(Arma Legal) - Offenes Tragen einer legalen Waffe in der Stadt - 公开携带武器进入城市(合法武器) - - - Rebel weapon - Rebel zbraň - Arma Rebelde - - Armes rebelles - Arma Rebelde - Rebellen Waffe - Arma Ribelle - Rebel bronią - 叛军武器 - - - Illegal clothing - Nelegální oblečení - Ropa Ilegal - abbigliamento illegale - Nielegalna odzież - - Vêtements illégaux - Roupas Ilegais - Illegale Kleidung - 非法服装 - - - Hiding face (Mask) - Schovává tvář (Mask) - Ocultar su Cara (Máscara) - Nascondere faccia (Mask) - Ukrywając twarz (maska) - - Cacher son visage - Esconder o Rosto(Mascara) - Verstecken des Gesichts (Maske) - 隐藏面部(面具) - - - Refuses to cooperate - Odmítá spolupracovat - Reusa a Cooperar - Si rifiuta di collaborare - Odmawia współpracy - - Refus d'obtempérer - Recusou-se a Cooperar - Behinderung der Staatsgewalt - 拒绝合作 - - - Hit and run - Zavinit nehodu a ujet - Golpea y Corre - Mordi e fuggi - Uderz i uciekaj - - Délit de fuite - Bater e Fugir - Fahrerflucht - 交通肇事逃逸 - - - Insulting a civilian - Urážky civilní - Insultar a un Civil - - Insulte envers un civil - Insulto a Civil - Beleidigung - Insulto a civile - Obrażanie cywilem - 侮辱平民 - - - Insulting a soldier - Urážky vojáka - Insultar a un Soldado - - Insulte envers un militaire - Insulto as Autoridades - Beamtenbeleidigung - Insulto a pubblico ufficiale - Znieważenie żołnierza - 侮辱士兵 - - - Drug dealing - Urážky vojáka... - Venta de Drogas - - Trafique de drogue - Trafico de Drogas - Drogenhandel - Traffico di droga - Handel narkotykami - 毒品交易 - - - Federal Reserve breaking - Federální rezervní systém lámání - Entrar a la Reserva Federal - - Intrusion dans la réserve fédérale - Invasão a Reserva Federal - Bankeinbruch - Rapina alla Riserva Federale - Rezerwa Federalna łamanie - 非法打开金库 - - - Killing of a civilian - Zabíjení civilní - Homicidio de un Civil - Uccisione di un civile - Zabójstwo cywilnej - - Meurtre d'un civil - Matou um Civil - Töten eines Zivilen - 杀害平民 - - - Killing of a soldier - Zabití vojáka - Homicidio de un Soldado - - Meurtre d'un militaire - Matou um Policial - Töten eines Beamten - Omicidio di un agente - Zabijając żołnierza - 杀害士兵 - - - - - Gas Storage - Gas Storage - Stockage de gaz - Almacenamiento de Combustible - Stoccaggio di Gas - Magazynów gazu - - Treibstofflager - Posto de Combustível - 燃料储存 - - - Supply - Zásobování - Ravitailler - Suministro - Fornitura - Dostawa - - Liefern - Abastecer - 供应 - - - Store - Obchod - Déposer - Guardar - Negozio - Sklep - - Lagern - Guardar - 商场 - - - Stop - Stop - Arrêter - Parar - Stop - Zatrzymać - - Stoppen - Parar - 停止 - - - Tanker is already in use. - Tankery je již používán. - Le camion citerne est déjà en cours d'utilisation. - El Camión Cisterna ya esta siendo usado. - La cisterna è già in uso. - Cysterna jest już w użyciu. - - Tankwagen wird bereits benutzt. - Os tanques já estão em uso. - 油轮已投入使用。 - - - Gas station is in use. - Čerpací stanice je v provozu. - La station-service est en cours de fonctionnement. - La estación ya se esta usando. - La stazione di benzina è già in uso. - Stacja benzynowa jest w użyciu. - - Tankstelle wird bereits beliefert. - O posto já está sendo usado. - 加油站在使用中。 - - - Tanker is empty. - Tankery je prázdný. - Le camion citerne est vide. - El Camión cisterna esta vacío. - La cisterna è vuota. - Cysterna jest pusta. - - Treibstofftank ist leer. - Os tanques estão vazios. - 油轮是空的。 - - - Tankers is full. - Tankery je plná. - Réservoir plein. - El Camión cisterna esta lleno. - La cisterna è piena. - Zbiornikowce jest pełna. - - Treibstofftank ist voll. - Os tanques estão cheios. - 油轮已满。 - - - Gas station has enough fuel. - Čerpací stanice má dostatek paliva. - La station service a suffisamment de carburant. - La estación tiene suficiente gasolina. - Il distributore ha abbastanza benzina. - Stacja benzynowa ma wystarczającą ilość paliwa. - - Tankstelle hat genug Treibstoff. - O posto tem combustível suficiente. - 加油站有足够的燃料。 - - - This gas station is supplied through a pipeline. - Tento Čerpací stanice se dodává potrubím. - Cette station service est fournie par un pipeline - Esta estación es suministrada por una tubería. - Questa stazione di gas è alimentata attraverso una tubatura. - Ta stacja gaz jest dostarczany rurociągiem. - - Diese Tankstelle wird über eine Pipeline versorgt. - Esse posto é abastecido através de uma mangueira. - 这个加油站通过管道供给。 - - - Discontinued operation. - Ukončená činnost. - Activité abandonnée. - Operación discontinuada. - Incarico Incompleto. - Działalność zaniechana. - - Vorgang abgebrochen. - Operação descontinuada. - 停止运营。 - - - Your share is $%1. - Váš podíl $%1. - Votre part est de $%1. - Tu ganancia es $%1. - La vostra quota è di $%1. - Twój udział jest $%1. - - Dein Anteil beträgt $%1. - A sua parte é de R$%1. - 你的份额为 $%1. - - - - - Mission Failed - Mise selhala - Mission échouée - Misión fallida - Missione fallita - Misja nie powiodła się - Missão fracassada - Миссия провалена - Mission fehlgeschlagen. - 任务失败 - - - You are not white-listed to use this slot. - Mise selhala - Vous n'êtes pas white-listé. - No tienes permiso de usar este slot. - Missione fallita - Misja nie powiodła się - Missão fracassada - Миссия провалена - Nicht auf der Whitelist. - 你不是白名单不能使用这个栏位。 - - - You are not allowed to use this slot because you do not have the appropriate permissions. Try another slot. - Ty jsou není dovoleno používat tento slot, protože nemáte příslušná oprávnění. Zkuste použít jiný slot. - Vous n'êtes pas autorisé à utiliser cet emplacement parce que vous ne disposez pas des autorisations appropriées. Essayez un autre emplacement. - No puede usar este slot porque no tiene los permisos requeridos. Por favor trate con otro slot. - Non è consentito usare questo slot, perché non si dispone delle autorizzazioni appropriate. Prova un altro slot. - Nie wolno korzystać z tego gniazda, ponieważ nie masz odpowiednich uprawnień. Spróbuj użyć innego gniazda. - Você não tem permissão para usar esse slot, porque você não tem as permissões apropriadas. Tente outro slot. - Вы не можете использовать этот слот, потому что у вас нет соответствующих разрешений. Попробуйте использовать другой слот. - Du bist nicht auf der Whitelist, deswegen kannst du diesen Platz nicht verwenden. Versuche es auf einen anderen Platz. - 你不允许使用此栏位,因为你没有适当的权限。尝试另一个栏位。 - - - - - Mission Failed - Mise selhala - Mission échouée - Misión fallida - Missione fallita - Misja nie powiodła się - Missão fracassada - Миссия провалена - Mission fehlgeschlagen - 任务失败 - - - You are blacklisted from cops. - Ty jsou na černé listině z policajtů. - Vous êtes sur blacklisté de la police. - Usted está en la lista negra de policías. - Stai lista nera da poliziotti. - Jesteś na czarnej liście od policjantów. - Você está na lista negra de policiais. - Вы в черном списке от ментов. - Du bist von Polizisten auf die schwarze Liste gesetzt worden. - 你被警察列入黑名单。 - - - You are not allowed to be a cop due to previous actions and the admins have removed you from being a cop. - Ty jsou nesmí být policajt vzhledem k předcházejícími akcemi a administrátoři vám odstraní z bytí policista. - Vous avez été blacklisté de la police en raisons d'actions précédentes allant à l'encontre des règles. Vous ne pouvez plus devenir policier. - No tiene permiso a ser policía por acciones anteriores. Los administradores han bloqueado su acceso. - Non è consentito fare il poliziotto a causa di azioni precedenti e gli amministratori di aver rimosso da essere un poliziotto. - Nie mogą być policjantem z powodu wcześniejszych działań oraz administratorzy usunęli cię od bycia policjantem. - Você não tem permissão para ser um policial devido a ações anteriores e os admins ter removido-lo de ser um policial. - Вы не можете быть полицейским в связи с предыдущими действиями и админы удалили вас от того, чтобы быть полицейским. - Du bist aufgrund früherer Aktion, kein Polizist mehr. Du wurdest von den Admins aus der Polizei entfernt. - 由于以前的行为,你不再是警察,警局已将你从警队中开除。 - - - - - The SpyGlass sees you! - Dalekohled tě vidí! - SpyGlass vous voit ! - El SpyGlass te ve! - Il cannocchiale si vede! - Lunetę widzi! - O SpyGlass te vê! - SpyGlass видит, что вы! - SpyGlass sieht dich! - SpyGlass正在检测你! - - - You were detected by the SpyGlass. - Vy byly detekovány dalekohled. - Vous avez été détecté par SpyGlass. - Fue detectado por el SpyGlass. - Lei è stato rilevato dal SpyGlass. - Ty zostały wykryte przez lunetę. - Você foi detectado pelo SpyGlass. - Вы были обнаружены с помощью SpyGlass. - Du wurdest von SpyGlass erkannt. - 你被SpyGlass检测。 - - - You were detected for cheating and have been reported to the server. Enjoy your day. - Vy byly detekovány za podvádění a byly zaznamenány na server. Užijte si svůj den. - Vous avez été détecté pour triche et avez été signalé au serveur. Profitez de votre journée. - Fue detectada por hacer trampas y se le ha informado al servidor. Disfruta tu día. - Lei è stato rilevato per truffa e sono stati segnalati per il server. Buona giornata. - Ty wykryto oszustwo i zostały zgłoszone do serwera. Miłego dnia. - Está foram detectados por engano e têm sido relatados para o servidor. Aproveite seu dia. - Вы были обнаружены для мошенничества и было сообщено на сервер. Удачного дня. - >Du wurdest wegen Betrug erkannt und an den Server gemeldet. Genieße deinen Tag. - 你被发现作弊,并已报告给服务器。珍惜你的生活吧。 - - - SPYGLASS-FLAG: %1 : %2 : %3 - SPYGLASS-FLAG: %1 : %2 : %3 - SPYGLASS-FLAG: %1 : %2 : %3 - SPYGLASS-FLAG: %1 : %2 : %3 - SPYGLASS-FLAG: %1 : %2 : %3 - SPYGLASS-FLAG: %1 : %2 : %3 - SPYGLASS-FLAG: %1 : %2 : %3 - SPYGLASS-FLAG: %1 : %2 : %3 - SPYGLASS-ERKENNUNG: %1 : %2 : %3 - SPYGLASS-标记: %1 : %2 : %3 - - - <t align='center'><t color='#FF0000'><t size='3'>SPY-GLASS</t></t><br/>Cheater Flagged</t><br/<br/>Name: %1<br/>Detection: %2 - <t align='center'><t color='#FF0000'><t size='3'>SPY-GLASS</t></t><br/>Cheater Flagged</t><br/<br/>Name: %1<br/>Detection: %2 - <t align='center'><t color='#FF0000'><t size='3'>SPY-GLASS</t></t><br/>Cheater Flagged</t><br/<br/>Name: %1<br/>Detection: %2 - <t align='center'><t color='#FF0000'><t size='3'>SPY-GLASS</t></t><br/>Cheater Flagged</t><br/<br/>Name: %1<br/>Detection: %2 - <t align='center'><t color='#FF0000'><t size='3'>SPY-GLASS</t></t><br/>Cheater Flagged</t><br/<br/>Name: %1<br/>Detection: %2 - <t align='center'><t color='#FF0000'><t size='3'>SPY-GLASS</t></t><br/>Cheater Flagged</t><br/<br/>Name: %1<br/>Detection: %2 - <t align='center'><t color='#FF0000'><t size='3'>SPY-GLASS</t></t><br/>Cheater Flagged</t><br/<br/>Name: %1<br/>Detection: %2 - <t align='center'><t color='#FF0000'><t size='3'>SPY-GLASS</t></t><br/>Cheater Flagged</t><br/<br/>Name: %1<br/>Detection: %2 - <t align='center'><t color='#FF0000'><t size='3'>SPY-GLASS</t></t><br/>Betrüger Erkannt</t><br/<br/>Name: %1<br/>Erkennung: %2 - <t align='center'><t color='#FF0000'><t size='3'>SPY-GLASS</t></t><br/>作弊者被标记</t><br/<br/>姓名:%1<br/>发现:%2 - - - %1 was observed by SPY-GLASS, he/she was trying to access commanding menu:\n\n %2\n\n and that commanding-menu is not known to the system. PLEASE NOTE he/she may not be cheating but the SPY-GLASS found it relevant to report in. - %1 was observed by SPY-GLASS, he/she was trying to access commanding menu:\n\n %2\n\n and that commanding-menu is not known to the system. PLEASE NOTE he/she may not be cheating but the SPY-GLASS found it relevant to report in. - %1 was observed by SPY-GLASS, he/she was trying to access commanding menu:\n\n %2\n\n and that commanding-menu is not known to the system. PLEASE NOTE he/she may not be cheating but the SPY-GLASS found it relevant to report in. - %1 was observed by SPY-GLASS, he/she was trying to access commanding menu:\n\n %2\n\n and that commanding-menu is not known to the system. PLEASE NOTE he/she may not be cheating but the SPY-GLASS found it relevant to report in. - %1 was observed by SPY-GLASS, he/she was trying to access commanding menu:\n\n %2\n\n and that commanding-menu is not known to the system. PLEASE NOTE he/she may not be cheating but the SPY-GLASS found it relevant to report in. - %1 was observed by SPY-GLASS, he/she was trying to access commanding menu:\n\n %2\n\n and that commanding-menu is not known to the system. PLEASE NOTE he/she may not be cheating but the SPY-GLASS found it relevant to report in. - %1 was observed by SPY-GLASS, he/she was trying to access commanding menu:\n\n %2\n\n and that commanding-menu is not known to the system. PLEASE NOTE he/she may not be cheating but the SPY-GLASS found it relevant to report in. - %1 was observed by SPY-GLASS, he/she was trying to access commanding menu:\n\n %2\n\n and that commanding-menu is not known to the system. PLEASE NOTE he/she may not be cheating but the SPY-GLASS found it relevant to report in. - %1 wurde beobachtet durch SPY-GLASS. Er/Sie hatte versucht auf das Befehlsmenü:\n\n %2\n\n zuzugreifen, diese ist dem System aber nicht bekannt. BITTE BEACHTE! Er/Sie betrügt deshalb nicht, aber SPY-GLASS fand es trotzdem relevant es zu melden. - %1 被SPY-GLASS检测, 他/她试图访问命令菜单:\n\n %2\n\n 并且系统不知道命令菜单。请注意他/她可能不会作弊,但SPY-GLASS发现了它的报告相关。 - - - Variable: %1 is not allowed TYPE: %2 NS: MN - Variable: %1 is not allowed TYPE: %2 NS: MN - Variable: %1 is not allowed TYPE: %2 NS: MN - Variable: %1 is not allowed TYPE: %2 NS: MN - Variable: %1 is not allowed TYPE: %2 NS: MN - Variable: %1 is not allowed TYPE: %2 NS: MN - Variable: %1 is not allowed TYPE: %2 NS: MN - Variable: %1 is not allowed TYPE: %2 NS: MN - Variable: %1 ist nicht erlaubt. TYPE: %2 NS: MN - 变量:不允许: %1 类型: %2 NS: MN - - - Variable: %1 is not allowed TYPE: %2 NS: UI - Variable: %1 is not allowed TYPE: %2 NS: UI - Variable: %1 is not allowed TYPE: %2 NS: UI - Variable: %1 is not allowed TYPE: %2 NS: UI - Variable: %1 is not allowed TYPE: %2 NS: UI - Variable: %1 is not allowed TYPE: %2 NS: UI - Variable: %1 is not allowed TYPE: %2 NS: UI - Variable: %1 is not allowed TYPE: %2 NS: UI - Variable: %1 ist nicht erlaubt. TYPE: %2 NS: UI - 变量:不允许: %1 类型: %2 NS: UI - - - ||SPY-GLASS Observes|| Name: %1 | UID: %2 | Reason: %3 - ||SPY-GLASS Observes|| Name: %1 | UID: %2 | Reason: %3 - ||SPY-GLASS Observes|| Name: %1 | UID: %2 | Reason: %3 - ||SPY-GLASS Observes|| Name: %1 | UID: %2 | Reason: %3 - ||SPY-GLASS Observes|| Name: %1 | UID: %2 | Reason: %3 - ||SPY-GLASS Observes|| Name: %1 | UID: %2 | Reason: %3 - ||SPY-GLASS Observes|| Name: %1 | UID: %2 | Reason: %3 - ||SPY-GLASS Observes|| Name: %1 | UID: %2 | Reason: %3 - ||SPY-GLASS Beobachtung|| Name: %1 | UID: %2 | Grund: %3 - ||SPY-GLASS 观察|| 姓名:%1 | UID:%2 | 原因:%3 - - - Variable set before client initialized: %1 - Variable set before client initialized: %1 - Variable set before client initialized: %1 - Variable set before client initialized: %1 - Variable set before client initialized: %1 - Variable set before client initialized: %1 - Variable set before client initialized: %1 - Variable set before client initialized: %1 - Variable gesetzt bevor Client initialisiert: %1 - 客户端初始化之前的变量集:%1 - - - - - EMS Requested - EMS Požadované - Medecin demandé - Medico Solicitado - EMS richiesto - EMS Zamówiony - EMS solicitada - EMS Запрошенный - Sanitäter benachrichtigt - EMS要求 - - - Delivery Job Accepted - Dodávka Job Accepted - Mission de livraison acceptée - Misión de Entrega Aceptada - Incarico Postale accettato - Dostawa Praca Zaakceptowany - Entrega aceitado Job - Доставка Работа Принято - Lieferauftrag angenommen - 接受交货工作 - - - Delivery Job Failed - Nepodařilo dodávka Job - Mission de livraison échouée - Misión de Entrega Fallada - Incarico Postale Fallito - Dostawa Praca Failed - Falha de entrega Job - Доставка Работа Ошибка - Lieferauftrag fehlgeschlagen - 交货工作失败 - - - Delivery Job Completed - Dokončena dodávka Job - Mission de livraison réussie - Misión de Entrega Completada - Incarico Postale Completato - Dostawa Praca Zakończony - Concluída a entrega Job - Доставка Работа Завершено - Lieferauftrag abgeschlossen - 交货工作已完成 - - - Received A Text Message - Přijetí textové zprávy - SMS reçu - Recibió un mensaje de texto - Hai ricevuto un messaggio di testo - Otrzymał wiadomość tekstową - Recebeu uma mensagem de texto - Получено текстовое сообщение - Erhielt eine Textnachricht - 收到短信 - - - 911 Dispatch Center - 911 Dispatch Center - 911 Dispatch Centre - 911 Centro de Despacho - 911 Centro Richieste - 911 Dispatch Center - 911 Centro de Despacho - 911 диспетчерский центр - 110 Dispatch Zentrum - 911调度中心 - - - Admin Dispatch Center - Admin Dispatch Center - Message Administrateur - Centro de Despacho de Administradores - Admin centro di spedizione - Administrator Dispatch Center - Administrador Centro de Despacho - Администратор диспетчерский центр - Admin Verteilzentrum - 管理调度中心 - - - Admin Message - - - - Admin Nachricht - - Message Admin - - - 管理员信息 - - - - - Civ Plane - - Avion civil - - - - - - Zivilflugzeug - 民用飞机 - - - Police HQ - - QG de Police - - - - - - Polizei HQ - 警察总部 - - - Police Store - - Magasin de la police - - - - - - Polizei Ausrüstung - 警察商店 - - - Police Car - - Concessionnaire de police - - - - - - Dienstfahrzeuge - 警车 - - - Police Heli - - Héliport de police - - - - - - Polizei Helikopter - 警用直升机 - - - Police Boat - - Vendeur de bateaux de police - - - - - - Polizei Boote - 警察船舶 - - - Rebel Car - - Concessionnaire rebelle - - - - - - Rebellen Fahrzeuge - 叛军载具 - - - Rebel Heli - - Héliport rebelle - - - - - - Rebellen Helikopter - 叛军直升机 - - - Police HQ - - QG de Police - - - - - - Polizei HQ - 警察总部 - - - - - arrested %1 - zadržen %1 - a arrêté %1 - arrestó a %1 - - - prendeu %1 - арестовано %1 - hat %1 verhaftet - 逮捕 %1 - - - %1 - %2 arrested %3 - %1 - %2 %3 zatčen - %1 - %2 a arrêté %3 - %1 - %2 arrestó a %3 - - - %1 - %2 prendeu %3 - %1 - %2 %3 арестовано - %1 - %2 hat %3 verhaftet. - %1 - %2 逮捕 %3 - - - picked up %1 %2 - vyzvednout %1 %2 - a ramassé %1 %2 - recogió %1 %2 - - - pegou %1 %2 - поднял %1 %2 - hat $%1 $%2 aufgehoben. - 拿起 %1 %2 - - - %1 - %2 picked up %3 %4 - %1 - %2 vyzvednout%3 %4 - %1 - %2 a ramassé %3 %4 - %1 - %2 recogió %3 %4 - - - %1 - %2 pegou %3 %4 - взял $%1 от земли. Банковский баланс: $%2 на руку Баланс: $%3 - %1 - %2 hat %3 %4 aufgehoben. - %1 - %2 捡起 %3 %4 - - - picked up $%1 from the ground. Bank Balance: $%2 On Hand Balance: $%3 - zvedl $%1 ze země. Banka Zůstatek: $%2 po zralé úvaze rukou: $%3 - a récupéré $%1 par terre. Argent en banque : $%2 - Cash : $%3 - recogió $%1 del suelo. Saldo Bancario: $%2 Saldo en Efectivo: $%3 - - - pegou R$%1 do chão. Quantia no Banco: R$%2 Quantia na Mão: R$%3 - взял $%1 от земли. Банковский баланс: $%2 на руку Баланс: $%3 - hat $%1 vom Boden aufgehoben. Bankkonto: $%2 Bargeld: $%3 - 从地上捡起 $%1。银行存款余额:$%2 手上余额:$%3 - - - %1 - %2 picked up $%3 from the ground. Bank Balance: $%4 On Hand Balance $%5 - %1 - %2 vyzvednout $%3 ze země. Banka Zůstatek: $%4 po ruce Balance $%5 - %1 - %2 a récupéré $%3 par terre. Argent en banque : $%4 Cash : $%5 - %1 - %2 recogió $%3 del suelo. Saldo Bancario: $%4 Saldo en Efectivo: $%5 - - - %1 - %2 pegou R$%3 do chão. Quantia no Banco: R$%4 Quantia na mão: R$%5 - %1 - %2 взял $%3 от земли. Банковский баланс: $%4 На Hand Баланс $%5 - %1 - %2 hat $%3 vom Boden aufgehoben. Bankkonto: $%4 Bargeld: $%5 - %1 - %2 从地上捡起 $%3。银行存款余额:$%4 手上余额 $%5 - - - robbed $%1 from %2. Bank Balance: $%3 On Hand Balance: $%4 - oloupen $%1 z %2. Banka Zůstatek: $%3 po zralé úvaze rukou: $%4 - a volé $%1 de %2. Argent en banque : $%4 Cash : $%4 - robó $%1 de $%2. Saldo Bancario: $%3 Saldo en Efectivo: $%4 - - - roubou R$%1 de %2. Quantia no Banco: R$%3 Quantia na Mão: R$%4 - ограбил $%1 из %2. Банковский баланс: $%3 на руку Баланс: $%4 - hat $%1 von $%2 geraubt. Bankkonto: $%3 Bargeld: $%4 - 从 %2 抢劫 $%1。银行存款余额:$%3 手上余额:$%4 - - - %1 - %2 robbed $%3 from %4. Bank Balance: $%5 On Hand Balance: $%6 - %1 - %2 okraden $%3 z %4. Banka Zůstatek: $%5 po zralé úvaze rukou: $%6 - %1 - %2 a volé $%3 de %4. Argent en banque : $%5. Cash : $%6 - %1 - %2 robó $%3 de $%4. Saldo Bancario: $%5 Saldo en Efectivo: $%6 - - - %1 - %2 roubou R$%3 de %4. Quantia no Banco: R$%5 Quantia na Mão: R$%6 - %1 - %2 ограбил $%3 от %4. Банковский баланс: $%5 на руку Баланс: $%6 - %1 - %2 hat $%3 von %4 geraubt. Bankkonto: $%5 Bargeld: $%6 - %1 - %2 抢走了%4 $%3。银行存款余额:$%5 手上余额:$%6 - - - created a gang named: %1 for $%2 - Vytvořili gang s názvem: %1 za $%2 - a créé un gang nommé : %1 pour $%2 - creó una pandilla llamada: %1 por $%2 - - - criou uma gangue chamada: %1 por R$%2 - создали банду под названием: %1 за $%2 - hat eine Gang mit dem Namen: $1 für $%2 erstellt. - 创建一个名为:%1 的帮派 花费 $%2 - - - %1 - %2 created a gang named: %3 for $%4 - %1 - %2 vytvořili gang s názvem: %3 za $%4 - %1 - %2 a créé un gang nommé : %3 pour $%4 - %1 - %2 creó una pandilla llamada: %3 por $%4 - - - %1 - %2 criou uma gangue chamada: %3 por R$%4 - %1 - %2 создали банду под названием: %3 за $%4 - %1 - %2 hat eine Gang mit dem Namen: %3 für $%4 erstellt. - %1 - %2 创建一个名为:%3 的帮派 花费 $%4 - - - bought a house for $%1. Bank Balance: $%2 On Hand Cash: $%3 - koupil dům za $%1. Banka Zůstatek: $%2 On Hand Cash: $%3 - a acheté une maison pour $%1. Argent en banque : $%2 Cash : $%3 - compró una casa por $%1. Saldo Bancario: $%2 Saldo en Efectivo: $%3 - - - comprou uma casa por R$%1. Quantia no Banco: R$%2 Quantia na Mão: R$%3 - купил дом за $%1. Банковский баланс: $%2 на руках наличные деньги: $%3 - hat sich ein Haus für $%1 gekauft. Bankkonto: $%2 Bargeld: $%3 - 买了一所房子花费 $%。 银行存款余额: $%2 手头现金: $%3 - - - %1 - %2 bought a house for $%3. Bank Balance: $%4 On Hand Cash: $%5 - %1 - %2 koupil dům za $%3. Banka Zůstatek: $%4 On Hand Cash: $%5 - %1 - %2 a acheté une maison pour $%3. Argent en banque : $%4 Cash : $%5 - %1 - %2 compró una casa por $%3. Saldo Bancario: $%4 Saldo en Efectivo: $%5 - - - %1 - %2 comprou uma casa por R$%3. Quantia no Banco: R$%4 Quantia na Mão: R$%5 - %1 - %2 купил дом за $%3. Банковский баланс: $%4 на руках наличные деньги: $%5 - %1 - %2 hat sich ein Haus für $%3 gekauft. Bankkonto: $%4 Bargeld: $%5 - %1 - %2 买了一所房子花费 $%3。银行存款余额:$%4 手头现金:$%5 - - - sold a house for $%1. Bank Balance: $%2 - prodal dům za $%1. Banka Zůstatek: $%2 - a vendu une maison pour $%1. Argent en banque : $%2 - vendió una casa por $%1. Saldo Bancario: $%2 - - - vendeu uma casa por R$%1. Quantia no Banco: R$%2 - продал дом за $%1. Банковский баланс: $%2 - hat sein Haus für $%1 verkauft. Bankkonto: $%2 - 卖掉房子得到 $%1。银行存款余额:$%2 - - - %1 - %2 sold a house for $%3. Bank Balance: $%4 - %1 - %2 prodal dům za $%3. Banka Zůstatek: $%4 - %1 - %2 a vendu une maison pour $%3. Argent en banque : $%4 - %1 - %2 vendió una casa por $%3. Saldo Bancario: $%4 - - - %1 - %2 vendeu uma casa por R$%3. Quantia no Banco: R$%4 - %1 - %2 продал дом за $%3. Банковский баланс: $%4 - %1 - %2 hat sich ein Haus für $%3 verkauft. Bankkonto: $%4 - %1 - %2 卖掉房子得到 $%3。银行存款余额: $%4 - - - chopped vehicle %1 for $%2 On Hand Cash(pre-chop): $%3 - nasekané vozidlo %1 nebo $%2 na ruce hotovosti (pre-CHOP): $%3 - a mis en pièces le véhicule %1 pour $%2. Cash (avant la vente) : $%3 - vendió el vehiculo %1 en el desguace por $%2. Saldo en Efectivo(antes de la venta): $%3 - - - desmanchou um %1 por R$%2 Quantia na Mão (antes do desmanche): R$%3 - нарезанного машина %1 или $%2 на руках Cash (предварительно отбивной): $%3 - hat das Fahrzeug %1 für $%2 beim Schrotthändler verschrottet. Bargeld(vor Schrott): $%3 - 出售盗窃到的载具 %1 赚取 $%2 手头现金(预付):$%3 - - - %1 - %2 chopped vehicle %3 for $%4 On Hand Cash(pre-chop): $%5 - %1 - %2 nasekané vozidla %3 za $%4 po ruce hotovosti (před-kotleta): $%5 - %1 - %2 a revendu le véhicule %3 pour $%4. Cash (avant la vente) : $%5 - %1 - %2 vendió el vehiculo %3 en el desguace por $%4. Saldo en Efectivo(antes de la venta): $%5 - - - %1 - %2 desmanchou um %3 por R$%4 Quantia na Mão(antes do desmanche): R$%5 - %1 - %2 нарезанной автомобиля %3 за $%4 на руку Cash (предварительно отбивной): $%5 - %1 - %2 hat das Fahrzeug %3 für $%4 beim Schrotthändler verschrottet. Bargeld(vor Schrott): $%6 - %1 - %2 出售盗窃到的载具 %3 赚取 $%4 手头现金(预付):$%5 - - - bought vehicle %1 for $%2. On Hand Cash: $%3 Bank Balance: $%4 - koupil vozidla %1 nebo $%2. On Hand Cash: $%3 bankovní konto: $%4 - a acheté le véhicule %1 pour $%2. Cash : $%3 Argent en banque : $%4 - compró el vehiculo %1 por $%2. Saldo Bancario: $%3 Saldo en Efectivo: $%4 - - - comprou um %1 por R$%2. Quantia na Mão: R$%3 Quantia no Banco: R$%4 - купил автомобиль %1 или $%2. На Hand Cash: $%3 банка Баланс: $%4 - hat sich das Fahrzeug %1 für $%2 gekauft. Bargeld: $%3 Bankkonto: $%4 - 购买载具 %1 花费 $%2。 手头现金:$%3 银行存款余额:$%4 - - - %1 - %2 bought vehicle %3 for $%4. On Hand Cash: $%5 Bank Balance $%6 - %1 - %2 koupilo vozidla %3 za $%4. On Hand Cash: $%5 bankovní konto $%6 - %1 - %2 a acheté le véhicule %3 pour $%4. Cash $%5 Argent en banque : $%6 - %1 - %2 compró el vehiculo %3 por $%4. Saldo Bancario: $%5 Saldo en Efectivo: $%6 - - - %1 - %2 comprou um %3 por R$%4. Quantia na Mão: R$%5 Quantia no Banco: R$%6 - %1 - %2 купил автомобиль за $%3 %4. На Hand наличных: $%5 баланса банка $%6 - %1 - %2 hat sich das Fahrzeug %3 für $%4 gekauft. Bargeld: $%5 Bankkonto: $%6 - %1 - %2 购买载具 %3 花费 $%4。 手头现金:$%5 银行存款余额 $%6 - - - sold vehicle %1 for $%2. Bank Balance: $%3 On Hand Balance: $%4 - prodával vozidla %1 pro $%2. Banka Zůstatek: $%3 po zralé úvaze rukou: $%4 - a vendu le véhicule %1 pour $%2. Argent en banque : $%3 Cash : $%4 - vendió el vehiculo %1 por $%2. Saldo Bancario: $%3 Saldo en Efectivo: $%4 - - - vendeu um %1 por R$%2. Quantia no Banco: R$%3 Quantia na Mão: R$%4 - продается автомобиль %1 за $%2. Банковский баланс: $%3 на руку Баланс: $%4 - hat das Fahrzeug %1 für $%2 verkauft. Bankkonto: $%3 Bargeld: $%4 - 出售载具 %1 获得 $%2。 银行存款余额:$%3 手上现金:$%4 - - - %1 - %2 sold vehicle %3 for $%4. Bank Balance: $%5 On Hand Balance: $%6 - %1 - %2 prodával vozidla %3 za $%4. Banka Zůstatek: $%5 po zralé úvaze rukou: $%6 - %1 - %2 a vendu le véhicule %3 pour $%4. Argent en banque : $%5 Cash : $%6 - %1 - %2 vendió el vehiculo %3 por $%4. Saldo Bancario: $%5 Saldo en Efectivo: $%6 - - - %1 - %2 vendeu um %3 por R$%4. Quantia no Banco: R$%5 Quantia na Mão: R$%6 - %1 - %2 продал автомобиль за $%3 %4. Банковский баланс: $%5 на руку Баланс: $%6 - %1 - %2 hat das Fahrzeug %3 für %4 verkauft. Bankkonto: $%5 Bargeld: $%6 - %1 - %2 出售载具 %3 获得 $%4。银行存款余额:$%5 手上现金:$%6 - - - withdrew $%1 from their gang bank. Gang Bank Balance: $%2 Bank Balance: $%3 On Hand Balance: $%4 - stáhl $%1 z jejich gangu banky. Gang bankovní konto: $%2 bankovní konto: $%3 po zralé úvaze rukou: $%4 - a retiré $%1 du compte bancaire du Gang. Solde bancaire du Gang : $%2 Argent en banque(perso) : $%3 Cash : $%4 - sacó $%1 de la cuenta de su pandilla. Saldo Bancario de la Pandilla: $%2 Saldo Bancario: $%3 Saldo en Efectivo: $%4 - - - sacou R$%1 no banco da sua gangue. Quantia no Banco da Gangue: R$%2 Quantia no Banco: R$%3 Quantia na Mão: R$%4 - снял $%1 от их банды банка. Gang Bank Баланс: $%2 банка Баланс: $%3 на руку Баланс: $%4 - hat $%1 vom Gangkonto abgehoben. Gangkonto: $%2 Bankkonto: $%3 Bargeld: $%4 - 从他们的帮派银行账户取出 $%1。帮派银行余额:$%2 银行存款余额:$%3 手上现金:$%4 - - - %1 - %2 withdrew $%3 from their gang bank. Gang Bank Balance: $%4 Bank Balance: $%5 On Hand Balance: $%6 - %1 - %2 stáhl $%3 z jejich gangu banky. Gang bankovní konto: $%4 bankovní konto: $%5 po zralé úvaze rukou: $%6 - %1 - %2 a retiré $%3 du compte bancaire du Gang. Solde bancaire du Gang : $%4 Argent en banque(perso) : $%5 Cash : $%6 - %1 - %2 sacó $%3 de la cuenta de su pandilla. Saldo Bancario de la Pandilla: $%4 Saldo Bancario: $%5 Saldo en Efectivo: $%6 - - - %1 - %2 sacou R$%3 no banco da sua gangue. Quantia no Banco da Gangue: R$%4 Quantia no Banco: R$%5 Quantia na Mão: R$%6 - %1 - %2 отозвала $%3 из их банды банка. Gang Bank Баланс: $%4 банка Баланс: $%5 на руку Баланс: $%6 - %1 - %2 hat $%3 vom Bankkonto abgehoben. Gangkonto: $%4 Bankkonto: $%5 Bargeld: $%6 - %1 - %2 从他们的帮派银行账户取出 $%3。帮派银行余额:$%4 银行存款余额:$%5 手上现金:$%6 - - - deposited $%1 into their gang bank. Gang Bank Balance: $%2 Bank Balance: $%3 On Hand Balance: $%4 - uložen $%1 do svého gangu banky. Gang bankovní konto: $%2 bankovní konto: $%3 po zralé úvaze rukou: $%4 - a déposé $%1 sur compte bancaire du Gang. Solde bancaire du Gang : $%2 Argent en banque(perso) : $%3 Cash : $%4 - depositó $%1 a la cuenta de su pandilla. Saldo Bancario de la Pandilla: $%2 Saldo Bancario: $%3 Saldo en Efectivo: $%4 - - - depositou R$%1 no banco da sua gangue. Quantia no Banco da Gangue: R$%2 Quantia no Banco: R$%3 Quantia na Mão: R$%4 - депозит в размере $%1 в их банде банка. Gang Bank Баланс: $%2 банка Баланс: $%3 на руку Баланс: $%4 - hat $%1 auf sein Gangkonto eingezahlt. Gangkonto: $%2 Bankkonto: $%3 Bargeld: $%4 - 将 $%1 存进他们的帮派银行账户。帮派银行余额:$%2 银行存款余额:$%3 手上现金:$%4 - - - %1 - %2 deposited $%3 into their gang bank. Gang Bank Balance: $%4 Bank Balance: $%5 On Hand Balance: $%6 - %1 - %2 uloženy $%3 do jejich gangu banky. Gang bankovní konto: $%4 bankovní konto: $%5 po zralé úvaze rukou: $%6 - %1 - %2 a déposé $%3 sur compte bancaire du Gang. Solde bancaire du Gang : $%4 Argent en banque(perso) : $%5 Cash : $%6 - %1 - %2 depositó $%3 a la cuenta de su pandilla. Saldo Bancario de la Pandilla: $%4 Saldo Bancario: $%5 Saldo en Efectivo: $%6 - - - %1 - %2 depositou R$%3 no banco da sua gangue. Quantia no Banco da Gangue: R$%4 Quantia no Banco: R$%5 Quantia na Mão: R$%6 - %1 - %2 депозит в размере $%3 в их банде банка. Gang Bank Баланс: $%4 банка Баланс: $%5 на руку Баланс: $%6 - %1 - %2 hat $%3 auf sein Gangkonto überwiesen. Gangkonto: $%4 Bankkonto: $%5 Bargeld: $%6 - %1 - %2 将 $%3 存进他们的帮派银行账户。帮派银行余额:$%4 银行存款余额:$%5 手上现金:$%6 - - - withdrew $%1 from their bank. Bank Balance: $%2 On Hand Balance: $%3 - stáhl $%1 z jejich banky. Banka Zůstatek: $%2 po zralé úvaze rukou: $%3 - a retiré $%1 de sa banque. Argent en banque : $%2 Cash : $%3 - sacó $%1 de su cuenta de banco. Saldo Bancario: $%2 Saldo en Efectivo: $%3 - - - sacou R$%1 do seu banco. Quantia no Banco: R$%2 Quantia na Mão: R$%3 - снял $%1 от своего банка. Банковский баланс: $%2 на руку Баланс: $%3 - hat $%1 von seinem Bankkonto abgehoben. Bankkonto: $%2 Bargeld: $%3 - 从他们的帮派银行账户取出 $%1。银行存款余额:$%2 手上现金:$%3 - - - %1 - %2 withdrew $%3 from their bank. Bank Balance: $%4 On Hand Balance: $%5 - %1 - %2 stáhl $%3 od své banky. Banka Zůstatek: $%4 po zralé úvaze rukou: $%5 - %1 - %2 a retiré $%3 de sa banque. Argent en banque : $%4 Cash : $%5 - %1 - %2 sacó $%3 de su cuenta de banco. Saldo Bancario: $%4 Saldo en Efectivo: $%5 - - - %1 - %2 sacou R$%3 do seu banco. Quantia no Banco: R$%4 Quantia na Mão: R$%5 - %1 - %2 отозвала $%3 из своего банка. Банковский баланс: $%4 на руку Баланс: $%5 - %1 - %2 hat $%3 von seinem Bankkonto abgehoben. Bankkonto: $%4 Bargeld: $%5 - %1 - %2 从他们银行账户取出 $%3。银行存款余额:$%4 手上现金:$%5 - - - transferred $%1 to %2. Bank Balance: $%3 On Hand Balance: $%4 - přestoupil $%1 do %2. Banka Zůstatek: $%3 po zralé úvaze rukou: $%4 - a transféré $%1 à %2. Argent en banque : $%3 Cash : $%4 - transferió $%1 a $%2. Saldo Bancario: $%3 Saldo en Efectivo: $%4 - - - transferiu R$%1 para %2. Quantia no Banco: R$%3 Quantia na Mão: R$%4 - перечислил $%1 %2. Банковский баланс: $%3 на руку Баланс: $%4 - hat %2 $%1 überwiesen. Bankkonto: $%3 Bargeld: $%4 - 转帐 $%1 给 %2。银行存款余额:$%3 手上现金:$%4 - - - %1 - %2 transferred $%3 to %4. Bank Balance: $%5 On Hand Balance: $%6 - %1 - %2 převedena $%3 až %4. Banka Zůstatek: $%5 po zralé úvaze rukou: $%6 - %1 - %2 a transféré $%3 à %4. Argent en banque : $%5 Cash : $%6 - %1 - %2 transferió $%3 a $%4. Saldo Bancario: $%5 Saldo en Efectivo: $%6 - - - %1 - %2 transferiu R$%3 para %4. Quantia no Banco: R$%5 Quantia na Mão: R$%6 - %1 -%2 перевели $%3 до %4. Банковский баланс: $%5 на руку Баланс: $%6 - %1 - %2 hat %4 $%3 überwiesen. Bankkonto: $%5 Bargeld: $%6 - %1 - %2 转帐 $%3 给 %4。银行存款余额:$%5 手上现金:$%6 - - - deposited $%1 into their bank. Bank Balance: $%2 On Hand Balance: $%3 - uložen $%1 do své banky. Banka Zůstatek: $%2 po zralé úvaze rukou: $%3 - a déposé $%1 dans son compte. Argent en banque $%2 Cash : $%3 - depositó $%1 a su cuenta de banco. Saldo Bancario: $%2 Saldo en Efectivo: $%3 - - - depositou R$%1 no seu banco. Quantia no Banco: R$%2 Quantia na Mão: R$%3 - депозит в размере $%1 в их банке. Банковский баланс: $%2 на руку Баланс: $%3 - hat $%1 auf sein Bankkonto eingezahlt. Bankkonto: $%2 Bargeld: $%3 - 将 $%1 存进他们的银行账户。银行存款余额:$%2 手上现金:$%3 - - - %1 - %2 deposited $%3 into their bank. Bank Balance: $%4 On Hand Balance: $%5 - %1 - %2 uloženy $%3 do své banky. Banka Zůstatek: $%4 po zralé úvaze rukou: $%5 - %1 - %2 a déposé $%3 dans son compte. Argent en banque : $%4 Cash : $%5 - %1 - %2 depositó $%3 a su cuenta de banco. Saldo Bancario: $%4 Saldo en Efectivo: $%5 - - - %1 - %2 depositou R$%3 no seu banco. Quantia no Banco: R$%4 Quantia na Mão: R$%5 - %1 - %2 депозит в размере $%3 в свой банк. Банковский баланс: $%4 на руку Баланс: $%5 - %1 - %2 hat $%3 auf sein Bankkonto eingezahlt. Bankkonto: $%4 Bargeld: $%5 - %1 - %2 将 $%3 存进他们的银行账户。银行存款余额:$%4 手上现金:$%5 - - - \ No newline at end of file + + + + + Setting up client, please wait... + + Configurando cliente. Por favor espere... + + Einrichten des Clients, bitte warten... + Caricamento dati, attendi... + Configuration du client. Patientez s'il vous plait... + Configurando o cliente. Por favor, aguarde... + + 配置客户端,请稍等... + + + Waiting for the server to be ready... + + Esperando a que el servidor esté listo... + + Warten, bis der Server bereit ist... + Caricamento Server, attendi... + En attente du chargement du serveur... + Esperando o servidor estar pronto... + + 等待服务器准备就绪... + + + extDB failed to load, please contact an administrator. + + extDB no se pudo cargar, por favor contacte a un administrador. + + extDB konnte nicht geladen werden, wenden Sie sich bitte an einen Administrator. + C'è stato un'errore con extDB, perfavore contatta un amministratore. + extDB ne s'est pas lancé correctement. Veuillez contacter un administrateur. + O extDB falhou ao carregar, por favor, contacte um administrador. + + 数据加载失败,请联系管理员。 + + + Finishing client setup procedure... + + Finalizando configuración del cliente... + + Finalisation de la procédure de configuration du client... + Fertigstellen der Client-Einrichtungs-Prozedur... + Completando procedura d'inizializzazione + Terminando o processo de configuração do cliente... + + 完成客户端设置程序... + + + + + Bruce's Outback Outfits + Bruceovy Outback Oblečení + Vêtements de Bruce + Tienda de Ropa + + Loja de Roupas + Sklep odzieżowy + Emporio di Bruce + Bruce's Outback Outfits + 服装商店 + + + Altis Police Department Shop + Altis policejní oddělení Shop + Vêtements policiers + Tienda del Departamento de Policía + + Loja de Roupas Policiais + Sklep Policyjny + Dipartimento della Polizia di Altis + Altis Polizei Department Geschäft + 警局商店 + + + Mohammed's Jihadi Shop + Mohamedův džihád Shop + Vêtements rebelle + Tienda Jihadi de Mohamed + Negozio della Jihad di Mohammed + + Loja de Roupas Rebeldes + Sklep samobójców AKBAR + Mohammed's Ausrüstungen + 叛军商店 + + + Steve's Diving Shop + Steve je potápění obchod + Vêtements de plongée de Steve + Tienda de Buceo + Negozio Sub di Steve + + Steve's Taucherausrüstung + Loja de equipamentos para Mergulho + Sklep dla nurków + 潜水商店 + + + Billy Joe's Clothing + Billy Joe oblečení + Tienda de Ropa de Billy Joe + + Billy Joe's Bekleidung + Emporio di Billy + Vêtements de tir + Loja de Roupa do Billy Joe + Billy Joe Odzież + 服装商店 + + + Billy Joe's Firearms + Billy Joe Střelné zbraně + Tienda de Armas de Billy Joe + + Billy Joe's Schusswaffen + Armeria di Billy Joe + Armurerie de Billy Joe + Loja de Armas do Billy Joe + Broń palna Billy Joe + 武器商店 + + + Bobby's Kart-Racing Outfits + Billy Joe Střelné zbraně + Vêtements de kart + Tienda de Trajes de Carreras + Vestiario da Pilota + + Bobby's Gokart Rennbekleidung + Loja de equipamentos para Kart + Sklep Kartingowy + 卡丁车赛车服 + + + Altis Market + Altis Market + Mercado de Altis + + Altis Markt + Mercato + Marché d'Altis + Mercado + Market Altis + 市场 + + + Rebel Market + Rebel Market + Mercado Rebelde + + Rebellen Markt + Mercato Ribelle + Marché Rebelle + Mercado Rebelde + Market Rebeliantów + 叛军市场 + + + Gang Market + gang Market + Mercado Pandillero + + Gang Markt + Mercato Gang + Marché de Gang + Mercado da Gangue + Market Gangu + 帮派市场 + + + Gang Clothing + gang Oblečení + Ropa Pandillera + + Gang Kleidung + Gang Abbigliamento + Vêtements de Gang + Roupa Gangue + Gang Odzież + 帮派服装 + + + Wong's Food Cart + Wongova Food košík + Kiosko de Wong + + Wong's Spezialitäten + Alimentari + Restaurant de Wong + Praça de Alimentação + Przysmaki Wonga + 食品商 + + + Gyro's Coffee + gyros Coffee + Cafetería de Gyro + + Gyro's Café + Caffè + Café de Gyro + Café do Gyro + Kawiarnia + 咖啡店 + + + Tonic's Narcotics + Tonic je narkotika + Narcotraficante + + Drogendealer + Spacciatore + Dealeur de Drogue + Traficante + Sprzedawca 'Trawy' + 非法药品贸易商 + + + Oil Trader + olej Trader + Comerciante de Petroleo + + Ölhändler + Vendita Petrolio + Acheteur de Pétrole + Comprador de Petróleo + Skup Ropy + 石油贸易商 + + + Local Fish Market + Místní Fish Market + Mercado Local del Pescado + + Fischmarkt + Pescivendolo + Marché de Poissons + Mercado de Peixes + Sklep Rybny + 海产品市场 + + + Glass Trader + sklo Trader + Comerciante de Vidrio + + Glashändler + Vendita Vetro + Acheteur de Verre + Comprador de Vidro + Skup Szkła + 玻璃贸易商 + + + Altis Industrial Trader + Altis Industrial Trader + Comerciante Industrial + + Altis Industriehandel + Vendita materiali industriali + Acheteur de minerais + Comprador de Material Indústrial + Skup materiałów przemysłowych + 铁/铜贸易 + + + APD Item Shop + APD Item Shop + Equipamiento Policial + + APD Ausrüstung + Negozio Polizia + Equipement policier + Equipamentos da Polícia + Zbrojownia Policji + 警察物品店 + + + Juan's Cement Laying + Juanovo Cement Pokládka + Fabrica de Cemento de Juan + + Juan's Zementleger + Vendita Cemento + Acheteur de Ciment + Comprador de Cimento + Wytwórnia cementu + 水泥贸易商 + + + Cash 4 Gold + Peněžní 4 Gold + Comprador de Oro + + Goldhändler + Vendita Oro + Acheteur d'Or + Comprador de Ouro + Skup złota + 黄金贸易商 + + + Diamond Dealer + Diamond Dealer + Comerciante de Diamantes + + Juwelier + Gioielleria + Acheteur de Diamant + Comprador de Diamante + Skup Diamentów + 钻石贸易商 + + + Salt Trader + sůl Trader + Comerciante de Sal + + Salzhändler + Vendita Sale + Acheteur de Sel + Comprador de Sal + Skup soli + 食盐贸易商 + + + Fuel Station Coffee + Palivo Coffee Station + Café de la Station service + Cafeteria de Gasolinera + Stazione di Servizio + + Tankstellen Café + Loja de Conveniência + Caffe OLLEN + 加油站咖啡店 + + + + + Close + Zavřít + Cerrar + + Schließen + Fermer + Chiudi + Fechar + Zamknij + 关闭 + + + Sell + Prodat + Vender + + Verkaufen + Vendre + Vendi + Vender + Sprzedaj + 出售 + + + Buy + Koupit + Comprar + + Kaufen + Acheter + Compra + Comprar + Kup + 购买 + + + Magazines + časopisy + Chargeurs + Cargadores + Caricatori + Magazyny + + Munições + Magazine + 弹药 + + + Accessories + Příslušenství + Accessoires + Accesorios + Accessori + Akcesoria + + Acessórios + Zubehör + 附件 + + + Weapons + Zbraně + Armes + Armas + Armi + Broń + + Armas + Bewaffnung + 武器 + + + Give + Dát + Dar + + Geben + Donner + Dai + Dar + Daj + 给予 + + + Use + Použití + Usar + + Benutzen + Utiliser + Usa + Usar + Użyj + 使用 + + + Remove + Odstranit + Remover + + Entfernen + Supprimer + Rimuovi + Remover + Usuń + 删除 + + + Settings + Nastavení + Configuración + + Einstellungen + Paramètres + Impostazioni + Configurar + Opcje + 设置 + + + Rent + Nájemné + Rentar + + Mieten + Louer + Affitta + Alugar + Wynajmij + 租赁 + + + Retrieve + získat + Recuperar + + Ausparken + Récupérer + Ritira + Recuperar + Odzyskaj + 取回 + + + You did not select anything. + Nevybrali jste nic. + No seleccionastes algo. + + Du hast nichts ausgewählt. + Vous n'avez rien sélectionné. + Non hai selezionato nulla. + Você não selecionou nada. + Niczego nie zaznaczyłeś. + 你没有选择任何东西。 + + + Yes + Ano + Si + + Ja + Oui + Si + Sim + Tak + + + + No + Ne + No + + Nein + Non + No + Não + Nie + + + + Cancel + Zrušit + Cancelar + + Abbrechen + Annuler + Annulla + Cancelar + Anuluj + 取消 + + + + + Admin Menu + Nabídka admin + Menu de Admin + + Admin Menü + Menu Admin + Menu Admin + Menu Admin + Admin Menu + 管理菜单 + + + Put the amount you want to compensate: + Vložte částku, kterou chcete kompenzovat: + Entrez le montant à rembourser + Pon la cantidad que quieres compensar: + Inserire l'importo da rimborsare: + + Trage den Wert für die Entschädigung ein: + Coloque a quantidade que você quer compensar: + Wprowadź wartość rekompensaty + 输入赔偿金额: + + + Get ID + Získat ID + Ver ID + + ID abfragen + Obtenir ID + Vedi ID + Obter ID + ID gracza + 获取 ID + + + Spectate + spectate + Observar + Osserva + + Zuschauen + Regarder + Observar + Obserwuj + 观看 + + + Teleport + Teleport + Teleport + Teleport + + Teleport + Téléporter + Teleportar + Teleport + 传送 + + + TP Here + TP Zde + TP Aquí + TP Qui + + TP Hier + TP Ici + TP Aqui + Do Mnie + 传送到这儿 + + + You cannot teleport the player here because they are inside of a vehicle. + Nelze teleportovat přehrávač zde proto, že jsou uvnitř vozidla. + Vous ne pouvez pas TP le joueur ici, car il est actuellement dans un véhicule. + No puedes teletransportar a este jugador aquí, porque está dentro de un vehículo. + Il giocatore non può essere teletrasportato perché in un veicolo. + Nie można teleportować gracza tutaj, ponieważ są one wewnątrz pojazdu. + Você não pode se teletransportar o jogador aqui, porque ele esta dentro de um veículo. + Вы не можете телепортировать игрока здесь, потому что они находятся внутри автомобиля. + Du kannst den Spieler nicht hierher teleportieren, weil dieser im Inneren eines Fahrzeugs sitzt. + 你不能将玩家传送到这里,因为他们在车内。 + + + Debug + Ladit + Debug + Debug + + Debug + Debug + Depuração + Debug + 清除BUG + + + Comp + Comp + Comp + Comp + + Entschädigen + Compenser + Compensar + Comp + 赔偿金 + + + GodMode + Božský mód + Modo Dios + GodMode + + Gott-Mod + God + Modo Deus + GodMode + 上帝模式 + + + Freeze + Zmrazit + Congelar + Congelare + + Einfrieren + Freeze + Congelar + Zamroź + 冻结 + + + Markers + markery + Marcadores + Indicatori + + Spieler Markierungen + Marqueurs + Marcações + Markery + 标记 + + + + + Querying... + Dotazování ... + Buscando... + + Abfrage läuft... + Interrogation... + Ricerca... + Pesquisando... + Wyszukuję... + 查询... + + + Searching Database for vehicles... + Vyhledávání databáze pro vozidla ... + Buscando Vehiculo en la Base de Datos + + Durchsuche Garage nach Fahrzeugen... + Recherche des véhicules dans le garage... + Ricerca di veicoli nel Database... + Buscando por veículo na base de dados... + Szukam pojazdu w bazie danych... + 从数据库中搜索载具... + + + You are already querying a player. + Již jste dotazování přehrávač. + Ya estan buscando a un jugador. + + Du fragst bereits einen Spieler ab. + Vous êtes déjà en train d'interroger ce joueur. + Stai già ispezionando un giocatore. + Você já está buscando por um jogador. + Przeszukujesz gracza + 你已经在查询玩家了。 + + + Player no longer exists? + Hráč neexistuje? + El jugador ya no existe? + + Spieler existiert nicht mehr? + Le joueur ne semble pas exister. + Il giocatore non esiste più + Jogador não existe mais? + Gracz już nie istnieje? + 玩家不存在? + + + You are about to give yourself $%1 to compensate to another player <br/><br/>You must give this cash to the person you are compensating manually. + Chystáte se dát si $%1 kompenzovat jinému hráči <br/><br/> Musíte dát tuto hotovost na osoby, které jsou kompenzačním ručně. + Estas a punto de darte $%1 para compensar a otro jugador<br/><br/> Debes darle el dinero a la persona manualmente. + Stai per donarti €%1 per rimborsare un altro giocatore <br/><br/> Dovrai donare il denaro manualmente. + + Du bist dabei dir selbst $%1 zu geben, um einen anderen Spieler zu entschädigen.<br/><br/>Gib das Geld dann an den Spieler weiter. + Vous êtes sur le point de vous donner $%1 pour rembourser un autre joueur <br/><br/> Merci de le lui donner manuellement. + Você está prestes a dar para você mesmo R$%1 para compensar outro jogador <br/><br/>Você deve dar este dinheiro para a pessoa que você está compensando manualmente. + Właśnie przydzieliłeś sobie $%1 w celu rekompensaty graczowi <br/><br/>Musisz przekazać te środki osobiście osobie poszkodowanej. + 你将获得赔偿金 $%1,小心别输入错误了 <br/><br/>你只能手动操作把这笔钱给玩家。 + + + You have added $%1 to your account. + Přidali jste $%1 se ke svému účtu. + Has agregado $%1 a tu cuenta. + €%1 ti sono stati accreditati. + + Dir wurden $%1 auf deinem Bankkonto gutgeschrieben. + Vous avez ajouté $%1 à votre compte + Você adicionou R$%1 em sua conta. + Przekazałeś na konto $%1 + 你已将 $%1 添加到你的账户上 。 + + + You can not go above $999,999 + Nemůžete jít nad $ 999999 + No te puedes dar más de $999,999 + Non puoi superare i €999.999 + + Maximaler Wert $999,999! + Vous ne pouvez pas aller au-dessus $999,999 ! + Você não pode ir além de $999,999! + Nie można obracać kwotami wyższymi niż $999,999! + 你不能处理超过 $999,999 的资金 + + + Please type in the amount to compensate. + Prosím, zadejte částku, která má kompenzovat. + Por favor pon la cantidad a compensar. + Si prega di inserire l'importo da rimborsare. + + Bitte Entschädigungsbetrag eingeben. + S'il vous plaît entrez le montant pour compenser. + Por favor, insira a quantidade para compensar. + Wprowadź kwotę rekompensaty + 请输入赔偿金额。 + + + You have disabled %1's input. + Jste zakázali vstup %1 je. + Has deshabilitado los controles de %1 + Hai disattivato l'input di %1. + + Du hast %1 eingefroren. Er kann sich nicht mehr bewegen. + Vous avez désactivé les contrôles de %1. + Você desabilitou as entradas de %1. + Zablokowałeś grę gracza $%1 + 您被禁止 %1 秒输入。 + + + You have enabled %1's input. + Jste povolili vstup %1 je. + Has habilitado los controles de %1 + Hai riabilitato l'input di %1. + + Du hast %1 wieder aufgetaut. + Vous avez activé les contrôles de %1. + Você habilitou as entradas de %1. + Odblokowałeś grę gracza $%1 + 你被允许 %1 秒输入。 + + + You can't do that dumbass. + Můžete to udělat blbec. + No puedes hacer eso, pendejo + Impossibile. + + Das geht gerade nicht. + Vous ne pouvez pas le faire sur vous-même. + Você não pode fazer isso, idiota. + Tak nie można! + 你不可以这样做。 + + + Your Admin Level is not high enough. + Váš správce úroveň není dostatečně vysoká. + No tienes suficiente nivel de Admin. + Il tuo livello amministratore non soddisfa i requisiti. + + Dein Admin Level ist nicht hoch genug. + Votre niveau admin n'est pas suffisamment élevé. + Seu nível de Admin não é alto o bastante. + Nie masz wystarczających uprawnień, za niski poziom administracyjny + 您的管理等级不够高。 + + + Player Markers Disabled. + Hráč Markers pro invalidy. + Marqueurs désactivés + Marcadores de Jugadores Deshabilitados + Indicatori Giocatori Disabilitati. + + Spieler Markierungen deaktiviert. + Marcações dos jogadores desabilitada. + Markery 'OFF' graczy Wyłączone + 禁用玩家标记。 + + + Player Markers Enabled. + Hráč Markers Povoleno. + Marqueurs activés + Marcadores de Jugadores habilitados. + Indicatori Giocatori Abilitati. + + Spieler Markierungen aktiviert. + Marcações dos jogadores habilitada. + Markery 'ON' graczy Włączone + 启用玩家标记。 + + + God mode enabled + nesmrtelnost povolen + Mode Dieu activé + Modo Dios habilitado + Godmode abilitata + God mode włączony + Modo Deus ativado + Режим бога включен + Gott-Modus aktiviert. + 启用上帝模式 + + + God mode disabled + nesmrtelnost zakázán + Mode Dieu désactivé + Modo Dios deshabilitado + Godmode disabilitata + God mode wyłączony + Modo Deus desativado + Режим бога отключен + Gott-Modus deaktiviert. + 禁用上帝模式 + + + Action Cancelled + akce byla zrušena + Acción Cancelada + + Aktion abgebrochen. + Action annulée + Azione Annullata + Ação Cancelada + Anulowano akcję + 操作取消 + + + Commander/Tactical View Disabled + Commander/Tactical View Disabled + Commander/Tactical View Disabled + Commander/Tactical View Disabled + Commander/Vue tactique désactivée + Befehlshaber-Übersicht deaktiviert. + Commander/Tactical View Disabled + Commander/Tactical View Disabled + Commander/Tactical View Disabled + 指挥官/战术视图被禁用 + + + Hit spacebar to place the container. + Hit mezerníku na místo Kontejner. + Appuyez sur espace pour placer le conteneur. + Aprieta la barra de espacio para colocar el Contenedor. + Premi barra spaziatrice per posizionare il contenitore. + Hit spacji, aby umieścić pojemnik. + Pressione a barra de espaço para colocar. + Хит пробел, чтобы поместить контейнер. + Drücke die Leertaste, um den Container zu platzieren. + 按空格键放置物品。 + + + Placement of container has been aborted. + Placement of container has been aborted. + Placement of container has been aborted. + Placement of container has been aborted. + Placement of container has been aborted. + Placement of container has been aborted. + Placement of container has been aborted. + Placement of container has been aborted. + Die Platzierung des Containers wurde abgebrochen. + 物品放置已被中止. + + + Your faction is not allowed to chop vehicles! + Váš frakce není povoleno sekat vozidla! + Votre faction ne peut pas vendre les véhicules ! + Tu facción no tiene permitido usar esta tienda! + La tua fazione non può rubare veicoli! + Twoja frakcja nie może posiekać pojazdy! + + Sua facção não têm direito de usar essa loja + Deiner Fraktion ist es nicht erlaubt, Fahrzeuge bei dem Schrotthändler zu verkaufen! + 你的帮派不允许出售这载具! + + + A pickaxe is required + Je vyžadován krumpáč + Requieres un pico + + Hier benötigst du eine Spitzhacke! + Vous avez besoin d'une pioche. + Devi possedere un piccone! + A picareta é necessária + Wymagana jest kilof + 你需要一把镐 + + + You are restrained + Ty jsou omezeny + Estas retenido + + Wie willst du mit gefesselten Händen sammeln? + Vous êtes menotté. + Sei stato ammanettato + Você está algemado + Ty skrępowaniem + 你被限制 + + + You can't do this while you surrender + Můžete to udělat, když se vzdáš + No puedes hacer esto mientras te estas rindiendo + + Mit erhobenen Händen kannst du nichts sammeln! + Vous ne pouvez pas faire cela tant que vous avez les mains sur la tête. + Non puoi effettuare questa azione mentre tieni le mani in alto + Você não pode fazer isso enquanto você se entrega + Nie można tego zrobić, gdy się poddasz + 你投降时不能这么做 + + + You can't gather this resource with this vehicle! + Nemůžete shromáždit tento prostředek s tímto vozidlem! + No puedes recolectar este recurso con este vehiculo! + + Du kannst diese Ressource nicht mit diesem Fahrzeug abbauen! + Vous ne pouvez pas récolter cette ressource avec ce véhicule. + Non puoi raccogliere questa risorsa con questo veicolo ! + Voce não pode colher este recurso com este veiculo! + You can't gather this resource with this vehicle! + 你不能用这载具收集这个资源! + + + You have no business using this. + Nemáš podnikání pomocí tohoto. + Vous n'avez pas le niveau pour utiliser la console. + No tienes permiso de usar esto. + Non hai il permesso di farlo. + Nie masz działalność z wykorzystaniem tego produktu. + Você não tem nenhum negócio usando isto. + У вас нет бизнеса с помощью этого. + Du hast hier nichts verloren! + 您无权这样做。 + + + Admin %1 has opened the debug console. + Admin %1 otevřel ladění konzoli. + Administrateur %1 a ouvert la console de debug. + Administrador %1 ha abierto la consola de depuración. + Admin %1 ha aperto la console di debug. + Administrator %1 otworzył konsoli debugowania. + Administrador %1 abriu o console de depuração. + Администратор %1 открыл консоль отладки. + Admin %1 hat die Debug-Konsole geöffnet. + 管理员 %1 已打开调试控制台。 + + + You cannot drop keys to a vehicle which is locked and you are inside of. + You cannot drop keys to a vehicle which is locked and you are inside of. + You cannot drop keys to a vehicle which is locked and you are inside of. + You cannot drop keys to a vehicle which is locked and you are inside of. + You cannot drop keys to a vehicle which is locked and you are inside of. + You cannot drop keys to a vehicle which is locked and you are inside of. + You cannot drop keys to a vehicle which is locked and you are inside of. + You cannot drop keys to a vehicle which is locked and you are inside of. + Du kannst den Schlüssel nicht wegschmeißen, weil das Auto verschlossen ist und du drin sitzt. + 你不能把钥匙掉在一辆锁着的车里,你就在车里面。 + + + Emergency lights are not set for this vehicle. + Emergency lights are not set for this vehicle. + Emergency lights are not set for this vehicle. + Emergency lights are not set for this vehicle. + Emergency lights are not set for this vehicle. + Emergency lights are not set for this vehicle. + Emergency lights are not set for this vehicle. + Emergency lights are not set for this vehicle. + Emergency lights are not set for this vehicle. + 此车辆没有设置应急灯。 + + + + + Bank Account Management + Vedení bankovního účtu + Cuenta Bancaria + + Bankkonto verwalten + Gestion du Compte Bancaire + Gestione Bancaria + Conta Bancária + Bankomat Altis + 银行账户管理 + + + Withdraw + ustoupit + Retirar + + Abheben + Retirer + Preleva + Sacar + Wypłać + 取款 + + + Deposit + Vklad + Depositar + + Einzahlen + Déposer + Deposita + Depositar + Deopozyt + 存款 + + + Withdraw: Gang + Odstoupit: Gang + Retirer: Gang + Retirar: Pandilla + + Sacar: gangue + Ritira: Gang + Wycofaj: Gang + Abheben: Gang + 取款:帮派 + + + Deposit: Gang + Záloha: Gang + Déposer: Gang + Depositar: Pandilla + + Depositar: Gangue + Deposita: Gang + Depozyt: Gang + Einzahlen: Gang + 存款: 帮派 + + + Transfer + Převod + Transferir + + Überweisen + Transférer + Trasferisci + Transferir + Przelew + 转账 + + + You can't deposit more then $999,999 at a time + Nemůžete vložit více než 999.999 $ najednou + No puedes depositar mas de $999,999 a la vez + + Du kannst nicht mehr als $999,999 gleichzeitig einzahlen. + Vous ne pouvez pas déposer plus de $999,999. + Non puoi depositare più di €999,999 alla volta + Você não pode transferir mais de R$999.999 em uma transação + Możesz jednorazowo zdeponować nie więcej niż $999,999 + 您一次不能存入超过 $999,999 + + + The amount entered isn't a numeric value. + Uvedená částka není číselná hodnota. + No escribistes un valor numérico. + + Die eingegebene Zahl ist keine richtige Zahl. + La valeur entrée n'est pas un nombre. + Il valore inserito non è numerico. + O valor digitado não é um número. + Wprwadzona wartość nie jest liczbą + 输入的金额不是数值。 + + + You need to select someone to transfer to + Je třeba vybrat někoho převést na + Debes seleccionar a quien transferirle el dinero + + Du hast niemanden für die Überweisung ausgewählt. + Sélectionnez une personne pour le transfert. + Devi selezionare qualcuno a cui trasferire l'importo + Você tem que selecionar para quem deseja transferir + Musisz wybrać odbiorcę przelewu + 您需要选择某人来转账 + + + The player selected doesn't seem to exist? + Hráč vybraný Nezdá se, že neexistuje? + Le joueur sélectionné ne semble pas exister + El jugador que seleccionastes no existe? + + Der Spieler scheint nicht zu existieren? + Sembra che il giocatore selezionato non esista + O jogador selecionado parece não existir! + Wybrany gracz wydaje się nie występować w grze + 选定的玩家似乎不存在? + + + You can't transfer more then $999,999 + Nemůžete přenést více než 999.999 $ + No puedes transferir más de $999,999 + + Du kannst nicht mehr als $999,999 überweisen! + Vous ne pouvez pas transférer plus de $999,999. + Non puoi trasferire più di €999.000 alla volta + Você pode trasferir no máximo R$999.999. + Możesz jednorazowo przelać nie więcej niż $999,999 + 你转账不能超过 $999,999 + + + You don't have that much in your bank account! + Nemusíte to hodně na váš bankovní účet! + No tienes tanto dinero en tu cuenta de banco! + + Du hast nicht so viel Geld auf deinem Bankkonto! + Vous n'avez pas autant dans votre compte en banque ! + Non hai fondi sufficienti nel tuo conto in banca! + Você não tem todo esse dinhero na sua conta bancária + Nie masz tyle środków na koncie! + 你的银行账户里没有那么多钱! + + + You don't have that much in your gang bank account! + Nemusíte to hodně ve svém gang bankovní účet! + No hay tanto dinero en la cuenta de tu pandilla! + Il conto della gang non ha abbastanza denaro! + Nie ma tego dużo na koncie bankowym gang! + + Vous n'avez pas autant sur le compte de votre gang ! + Você não tem todo esse dinhero na sua gangue! + Ihr habt nicht genügend Geld auf dem Gangkonto! + 你的帮派银行账户里没有那么多钱! + + + You do not have enough money in your bank account, to transfer $%1 you will need $%2 as a tax fee. + Nemáte dostatek peněz na váš bankovní účet, převést $%1 budete potřebovat $%2 jako daňový poplatek. + No tienes el dinero suficiente, para transferir $%1 necesitaras $%2 para pagar como cuota. + + Du hast nicht genug Geld auf deinem Bankkonto, es kostet $%2 um $%1 zu überweisen. + Vous n'avez pas assez d'argent dans votre compte bancaire, pour transférer $%1 vous devez payer $%2 de taxes. + Non hai fondi sufficienti nel tuo conto in banca, per trasferire €%1 necessiti di €%2 per pagare la tassa di trasferimento. + Você não tem dinheiro suficiente na sua conta bancária. Para trasferir R$%1 você irá pagar R$%2 de taxa + Nie masz wystarczająco dużo środków na końcie, do przelewu $%1 będziesz potrzebował jeszcze $%2 na opłatę + 你的银行账户里没有足够的钱, 要转账 $%1 你需要支付 $%2 作为手续费. + + + You have transfered $%1 to %2.\n\nA tax fee of $%3 was taken for the wire transfer. + Jste přenesli $%1 do %2. \n\nA daňový poplatek ve výši $%3 byla pořízena na bankovním převodem. + Has transferido $%1 a $%2 \n\nUna cuota de $%3 fue tomada de tu cuenta. + + Du hast $%1 an %2 überwiesen.\n\nEine Gebühr von $%3 wurde verrechnet. + Vous avez transféré $%1 à %2.\n\nA Une taxe de $%3 vous a été prélevée pendant le transfert. + Hai trasferito €%1 a %2.\n\nSono stati trattenuti €%3 di tassa per il trasferimento. + Você trasferiu R$%1 para %2.\n\nA taxa de trasferência foi de: R$%3. + Przelałeś $%1 do %2.\n\nA opłata $%3 pobrana przez WIRE TRANSFER + 你已转账 $%1 给 %2。\n\n手续费 $%3 已从你的账户扣除。 + + + %1 has wire transferred $%2 to you. + + %1 ha transferido $%2 a tu cuenta. + + %1 hat dir $%2 überwiesen. + %1 vous a fait un virement de $%2. + %1 ha effettuato un bonifico sul tuo conto di €%2 + %1 transferiu $%2 para a tua conta. + + %1 通过电汇将 $%2 转账给你。 + + + You can't withdraw more then $999,999 + Nemůžete zrušit více než 999.999 $ + No puedes retirar más de $999,999 + + Du kannst nicht mehr als $999,999 abheben. + Vous ne pouvez pas retirer plus de $999,999. + Non puoi prelevare più di €999.000 in una volta + Você pode sacar no máximo R$999.999 + Możesz jednorazowo pobrać maks $999,999 + 你不能取款大于 $999,999 + + + You can't withdraw less then $100 + Nemůžete odvolat méně než 100 $ + No puedes retirar menos de $100 + + Du kannst nicht weniger als $100 abheben. + Vous ne pouvez pas retirer moins de $100. + Non puoi prelevare meno di €100 + Você não pode sacar menos de $100. + Nie możesz pobrać mniej niż $100 + 你不能取款小于 $100 + + + You have withdrawn $%1 from your bank account + Jste staženy $%1 z vašeho bankovního účtu + Has retirado $%1 de tu cuenta bancaria + + Du hast $%1 von deinem Bankkonto abgehoben. + Vous avez retiré $%1 de votre compte en banque. + Hai prelevato €%1 dal tuo conto in banca + Você sacou R$%1 de sua conta bancária. + Pobrałeś z konta kwotę $%1 + 你已从你的银行账户取走 $%1 + + + You have withdrawn $%1 from your gang. + Jste staženy $%1 z naší bandy + Has retirado $%1 de tu pandilla + Hai ritirato €%1 dal nostro gruppo. + Masz %1 $ wycofane z naszego gangu. + + Vous avez retiré $%1 de votre gang. + Você sacou R$%1 da sua gangue + Du hast $%1 vom Gangkonto abgehoben. + 你已从你的帮派账户取走 $%1 . + + + Someone is already trying to withdraw from your gang. + Někdo se již snaží ustoupit od svého gangu. + Quelqu'un est déjà en train de retirer de l'argent de votre gang. + Alguien ya esta tratando de retirar dinero de tu pandilla. + Qualcuno sta già cercando di ritirare del denaro dal fondo gang. + Ktoś już próbował wycofać się ze swojego gangu. + + Alguém já está tentando sacar da sua gangue. + Jemand versucht bereits, Geld vom Gangkonto abzuheben. + 有人从你的帮派账户中取款. + + + You do not have that much cash on you. + Nemáte tolik peněz na vás. + No tienes tanto dinero contigo. + + Du hast nicht so viel Geld bei dir. + Vous n'avez pas autant d'argent sur vous. + Non hai abbastanza denaro con te. + Você não tem todo esse dinheiro. + Nie masz przy sobie tyle pieniędzy + 你身上没有那么多现金. + + + You have deposited $%1 into your bank account + Máte uloženy $%1 na váš bankovní účet + Has depositado $%1 en tu cuenta de banco. + + Du hast $%1 auf dein Bankkonto überwiesen. + Vous avez déposé $%1 dans votre compte en banque. + Hai despositato €%1 nel tuo conto bancario + Você depositou R$%1 na sua conta bancária + Zdeponowałeś na koncie bankowym $%1 + 你已将 $%1 存入到你的银行账户 + + + You have deposited $%1 into your gang's bank account. + Máte uloženy $%1 na bankovní účet svého gangu. + Has depositado $%1 en la cuenta de tu pandilla. + + Du hast $%1 auf das Gangkonto überwiesen. + Vous avez déposé $%1 sur le compte en banque de votre gang. + Hai despositato €%1 nei fondi della tua gang. + Você depositou R$%1 na conta da sua gangue. + Zdeponowałeś na koncie gangu kwotę $%1. + 你已将 $%1 存入到你的帮派账户. + + + Someone is already trying to deposit into your gang's bank account. + Někdo se již snaží vložit na bankovní účet svého gangu. + Quelqu'un est déjà en train de déposer dans le compte bancaire de votre gang. + Alguien ya esta tratando de depositar en la cuenta de banco de tu pandilla. + Qualcuno sta già cercando di depositare del denaro nel conto della Gang. + Ktoś jest już stara się o wpłatę na rachunek bankowy swojego gangu. + + Alguém já está tentando depositar na conta da sua gangue. + Jemand versucht bereits Geld auf das Gangkonto einzuzahlen. + 有人存款到你的帮派银行账户. + + + You are not in a Gang! + Nejste v gangu! + Vous n'êtes pas dans une bande! + ¡No estás en una pandilla! + Non sei in un Gang! + Nie jesteś w gangu! + Você não está em uma gangue! + Du bist nicht in einer Gang! + 你没有在帮派里! + + + + + Altis Mobile + Altis Mobile + Celular + + Altis Mobilfunk + Altis Mobile + Cellulare Altis + Celular + Telefon + 手机 + + + Message To Send: + Zpráv pro odeslání: + Mensaje a Enviar: + + Deine Nachricht: + SMS à Envoyer : + Messaggio da inviare: + Mensagem à enviar: + Treść wiadomości + 发送信息: + + + Text Message: + Textová zpráva: + Mensaje: + + Nachricht: + Message Texte : + Msg Giocatore: + Mensagem: + Do: Gracz + 发短信: + + + Text Police + Text Police + Msg Policía + + An die Polizei + Police + Msg Polizia + Polícia + Do: Policja + 发短信给警察 + + + Text Admins + textové Administrátoři + Msg Admin + + An die Admins + Requête Admin + Msg Admin + Msg Admins + Do: Admin + 发短信给管理 + + + Admin Message + admin Message + Msg de Admin + + Admin-Nachricht + Message Admin + Admin Msg + Admin Msg + AdmGracz + 管理员信息 + + + Admin Msg All + Admin zpráva Vše + Admin Msg All + + Admin-Nachricht an alle + Admin MSG ALL + Admin Msg + Admin Msg All + SMS do Wszyscy + 管理员全服信息 + + + Request EMS + žádost o EMS + Pedir Médico + + An die Sanitäter + SAMU + Msg medici + Chamar SAMU + MEDYK + 发短信给医疗 + + + + + You must enter a message to send! + You must enter a message to send! + You must enter a message to send! + You must enter a message to send! + Du musst eine Nachricht eingeben! + Vous devez entrer un message à envoyer! + You must enter a message to send! + You must enter a message to send! + You must enter a message to send! + 您必须输入要发送的消息! + + + Your message cannot exceed 400 characters! + Your message cannot exceed 400 characters! + Your message cannot exceed 400 characters! + Your message cannot exceed 400 characters! + Deine Nachricht darf maximal 400 Zeichen enthalten!! + Votre message ne peut pas excéder 400 caractères ! + Your message cannot exceed 400 characters! + Your message cannot exceed 400 characters! + Your message cannot exceed 400 characters! + 您的信息不能超过400个字符! + + + You must select a player you are sending the text to! + You must select a player you are sending the text to! + You must select a player you are sending the text to! + You must select a player you are sending the text to! + Du musst einen Spieler auswählen! + Vous devez sélectionner un joueur à qui envoyer le message ! + You must select a player you are sending the text to! + You must select a player you are sending the text to! + You must select a player you are sending the text to! + 当你发送信息时必须选择一个玩家! + + + You have sent a message to all EMS Units. + You have sent a message to all EMS Units. + You have sent a message to all EMS Units. + You have sent a message to all EMS Units. + Du hast eine Nachricht an alle Sanitäter gesendet. + Vous avez envoyé un message à tous les EMS. + You have sent a message to all EMS Units. + You have sent a message to all EMS Units. + You have sent a message to all EMS Units. + 你已经向所有医护人员发送了消息. + + + You have sent a message to all Police Units. + You have sent a message to all Police Units. + You have sent a message to all Police Units. + You have sent a message to all Police Units. + Du hast eine Nachricht an alle Polizisten gesendet. + Vous avez envoyé un message à tous les Police. + You have sent a message to all Police Units. + You have sent a message to all Police Units. + You have sent a message to all Police Units. + + + + You have sent a message to all Admins. + You have sent a message to all Admins. + You have sent a message to all Admins. + You have sent a message to all Admins. + Du hast eine Nachricht an alle Admins gesendet. + Vous avez envoyé un message à tous les Admins. + You have sent a message to all Admins. + You have sent a message to all Admins. + You have sent a message to all Admins. + + + + You sent %1 a message: %2 + You sent %1 a message: %2 + You sent %1 a message: %2 + You sent %1 a message: %2 + Du sendest %1 eine Nachricht: %2 + Vous avez envoyé à %1 le message : %2 + You sent %1 a message: %2 + You sent %1 a message: %2 + You sent %1 a message: %2 + 你向 %1 发送了信息: %2 + + + You are not an admin! + You are not an admin! + You are not an admin! + You are not an admin! + Du bist kein Admin! + Vous n'êtes pas un admin ! + You are not an admin! + You are not an admin! + You are not an admin! + 你不是管理员! + + + Admin Message Sent To: %1 - Message: %2 + Admin Message Sent To: %1 - Message: %2 + Admin Message Sent To: %1 - Message: %2 + Admin Message Sent To: %1 - Message: %2 + Admin Nachricht Gesendet an: %1 - Nachricht: %2 + Message admin envoyé à %1 - Message : %2 + Admin Message Sent To: %1 - Message: %2 + Admin Message Sent To: %1 - Message: %2 + Admin Message Sent To: %1 - Message: %2 + 管理员消息发送给: %1 - 信息: %2 + + + Admin Message Sent To All: %2 + Admin Message Sent To All: %2 + Admin Message Sent To All: %2 + Admin Message Sent To All: %2 + Admin Nachricht Gesendet an Alle: %2 + Message admin envoyé à tous les joueurs : %2 + Admin Message Sent To All: %2 + Admin Message Sent To All: %2 + Admin Message Sent To All: %2 + 管理员发送信息到全体: %2 + + + There are currently no police units available! + Momentálně nejsou k dispozici žádné policejní jednotky! + ¡Actualmente no hay unidades de policía disponibles! + В настоящее время нет полицейских подразделений! + Aktuell stehen keine Polizeieinheiten zur Verfügung! + Il n'y a actuellement aucune unité de police disponible! + Al momento non ci sono unità di polizia disponibili! + Actualmente não há unidades policiais disponíveis! + Obecnie nie ma żadnych jednostek policyjnych! + 目前没有警用单位! + + + There are currently no EMS units available! + Momentálně nejsou k dispozici žádné jednotky EMS! + Actualmente no hay unidades de EMS disponibles! + В настоящее время нет доступных модулей EMS! + Aktuell stehen keine Sanitäter zur Verfügung! + Il n'y a actuellement aucune unité EMS disponible ! + Attualmente non ci sono unità EMS disponibili! + Não existem actualmente unidades EMS disponíveis! + Obecnie nie ma dostępnych jednostek EMS! + 目前没有特快专递单位! + + + + + Local Chop Shop + Místní Chop Shop + Desguazadero + + Schrotthändler + Revendeur de véhicules volés + Ricettatore + Desmanche + Dziupla + 销赃盗窃的载具 + + + + + Gang Management + gang Vedení + Administración de Pandilla + + Gangübersicht + Gestion du Gang + Gestione Gang + Gerenciar Gangue + Gang Menu + 帮派管理 + + + Gang Management - Current Gangs + Gang Management - Současné Gangs + Administracion de Pandilla - Pandillas Actuales + + Gangübersicht - Aktuelle Gangs + Gestion de Gangs - Liste des Gangs Actuels + Gestione Gang - Gang Attuali + Gerenciar Gangue - Gangue atual + Gang - zarządzaj + 帮派管理-当前帮派 + + + Join + Připojit + Unirse + + Beitreten + Rejoindre + Unisciti + Entrar + Dołącz + 加入 + + + Leave + Dovolená + Salir + + Verlassen + Quitter + Abbandona + Sair + Opuść + 退出 + + + Upgrade Slots + upgradem Slots + Aumentar Slots + + Anzahl erhöhen + Augmenter Slots + Aumenta Posti + Aumentar o número de Slots + Powiększ gang + 升级人数 + + + Kick + Kop + Expulsar + + Kicken + Virer + Espelli + Expulsar + Wykop + 踢出 + + + Set Leader + Set Leader + Hacer Líder + + Neuer Anführer + Passer Chef + Imposta Capo + Passar Liderança + Ustaw lidera + 设置管理者 + + + To create a gang it costs $%1 + Chcete-li vytvořit gang stojí $%1 + Cuesta $%1 para crear una pandilla + + Le prix de création d'un gang est de %1$ + Eine Gang zu erstellen kostet $%1. + Creare una gang costa $%1 + Criar uma Gangue custa R$%1 + Koszt ustanowienia gangu to $%1 + 创建一个帮派的成本 $%1 + + + Create + Vytvořit + Crear + + Erstellen + Créer + Crea + Criar + Stwórz + 创建 + + + Your Gang Name + Váš Gang Jméno + Nombre de tu Pandilla + + Dein Gangname + Nom du Gang + Nome della tua Gang + Nome da Gangue + Nazwa gangu + 输入你要创建的帮派名字 + + + Invite Player + Pozvat Player + Invitar Jugador + + Spieler einladen + Inviter joueur + Invita Giocatore + Convidar Jogador + Zaproś + 邀请玩家 + + + Disband Gang + rozpustit Gang + Deshacer Pandilla + + Gang auflösen + Dissoudre Gang + Sciogli Gang + Desfazer Gangue + Opuść gang + 解散帮派 + + + Gang Invitation + gang Pozvánka + Invitación de Pandilla + + Gangeinladung + Invitation de Gang + Invito Gang + Convite para Gangue + Zaproszenie do gangu + 帮派邀请 + + + Transfer Gang Leadership + Přeneste Gang Vedení + Transferir Liderazgo de Pandilla + + Gangführung übertragen + Transfert du chef du Gang + Trasferisci Comando + Transferir Liderança + Przekaż kierowanie gangiem + 移交帮派管理 + + + Upgrade Maximum Allowed Gang Members + Inovovat Maximální povolená Gang Členové + Aumentar Cantidad Máxima de Miembros de la Pandilla + + Maximale Anzahl an Mitgliedern erhöhen + Augmentation du nombre de membre total + Aumenta numero massimo membri della Gang + Atualizar limite máximo de membros + Zwiększ maksymalną liczbę członków gangu + 升级帮派成员人数 + + + + + You must create a gang first before capturing it! + You must create a gang first before capturing it! + Debes crear una pandilla antes de capturar este escondite! + + Du musst erst in einer Gang sein, um das Versteck einnehmen zu können! + Vous devez créer un gang avant de le capturer ! + Devi creare una gang prima di catturarla! + Você precisa criar uma gangue antes de tentar capturar! + Przed przechwyceniem musisz stworzyć gang + 您必须先创建一个帮派然后才能建立帮派据点! + + + Your gang already has control over this hideout! + Naše parta už má kontrolu nad tímto úkrytu! + Tu Pandilla ya tiene control de este escondite! + + Deine Gang hat bereits die Kontrolle über dieses Versteck! + Votre gang a déjà le contrôle de cette planque ! + La tua Gang ha già il controllo di questo Covo + Sua gangue já tem controle sobre esse esconderijo! + Twój gang aktualnie kontroluje tę kryjówkę ! + 你的帮派已经控制了这个帮派据点! + + + Only one person shall capture at once! + Pouze jedna osoba musí být schopná zachytit najednou! + Solo una persona puede capturar a la vez! + + Nur eine Person kann das Versteck einnehmen! + Une seule personne à la fois peut capturer la cachette ! + Può conquistare solo una persona alla volta! + Somente uma pessoa pode capturar! + Przejmowanie powinna przeprowadzić na raz tylko jedna osoba + 每次只能抓捕帮派据点的一个人! + + + This hideout is controlled by %1.<br/><br/>Are you sure you want to take over their gang area? + Tento úkryt je řízen %1.<br/><br/>Opravdu chcete převzít svůj gang prostor? + Este escondite esta controlado por %1.<br/><br/>Estas seguro que quieres tomarlo? + + Das Versteck wird durch %1 kontrolliert.<br/><br/>Bist du sicher, dass du ihr Ganggebiet übernehmen möchtest? + Cette planque est contrôlée par %1.<br/><br/>Etes-vous sûr que vous voulez prendre leur cachette ? + Questo Covo è controllato da %1.<br/><br/>Sicuro di voler prendere il controllo della loro area? + Esse esconderijo é controlado por %1.<br/><br/>Você tem certeza que deseja tomar essa área? + Ta kryjówka jest kontrolowana przez %1.<br/><br/>Jesteś pewny że chcesz przjąć ten rejon. + 帮派据点由 %1 控制.<br/><br/>你确定要接管他们的帮派吗? + + + Hideout is currently under control... + Hideout is currently under control... + Escondite bajo control... + + Versteck ist derzeit unter Kontrolle... + La planque est actuellement sous contrôle... + Il Covo è già sotto controllo... + Esconderijo sobre controle.... + Kryjówka pod kontrolą ... + 帮派据点正在控制... + + + Capturing cancelled + zachycení zrušen + Toma de Control Cancelada + + Einnehmen abgebrochen. + Capture annulée + Cattura annullata + Ação concelada + Przejmowanie anulowane + 帮派据点控制取消 + + + Capturing Hideout + zachycení Hideout + Capturando el Escondite + + Versteck einnehmen + Capture de la planque + Catturando il Covo + Capturando Esconderijo + Przejmowanie kryjówki + 控制的帮派据点 + + + Hideout has been captured. + Úkryt byl zajat. + La cachette a été capturée. + Escondite ha sido capturado. + Hideout è stato catturato. + Hideout został schwytany. + Hideout foi capturado. + Хайдеаут был захвачен в плен. + Versteck wurde eingenommen. + 帮派据点已被控制。 + + + %1 and his gang: %2 - have taken control of a local hideout! + %1 a jeho gang: %2 - vzali kontrolu místního úkrytu! + %1 y su pandilla: %2 - han tomado control de un Escondite! + + %1 und seine Gang: %2 - haben die Kontrolle über ein lokales Versteck übernommen! + %1 et son gang: %2 ont pris le contrôle d'une cachette ! + %1 e la sua Gang: %2 - hanno preso il controllo di un Covo! + %1 e sua gangue: %2 - agora têm o controle de um esconderijo! + %1 i jego gang: %2 - przejął kontrolę nad kryjówką! + %1 和他的帮派: %2 - 已经控制了一个帮派据点! + + + You can't have a gang name longer then 32 characters. + Nemůžete mít název gang delší než 32 znaků. + El nombre de tu Pandilla no puede tener mas de 32 caracteres. + + Dein Gangname kann nicht länger als 32 Zeichen sein. + Vous ne pouvez pas avoir un nom de gang de plus de 32 caractères. + %1 e la sua Gang: %2 - hanno preso il controllo di un Covo! + O nome de sua gangue não pode ter mais de 32 caracteres. + Nazwa gangu może posiadać maksymalnie 32 znaki + 你的帮派名称超过32个字符。 + + + You have invalid characters in your gang name. It can only consist of Numbers and letters with an underscore + Máte neplatné znaky v názvu vaší gangu. To se může skládat pouze z číslic a písmen s podtržítkem + El nombre de tu pandilla solo puede consistir de: "Numeros, Letras y guion bajo" + + Du hast ein ungültiges Zeichen in deinem Gangnamen. Der Name darf nur aus Zahlen und Buchstaben sowie einem Unterstrich bestehen! + Vous avez des caractères non valides dans le nom de votre gang. Il ne peut être constitué que de chiffres et de lettres. + Hai inserito caratteri non validi nel nome della Gang. Puoi inserire solo numeri e lettere con un underscore + O nome da sua gangue tem caracteres inválidos. O nome so pode conter caracteres e números separados por underline + Masz nieprawidłowe znaki w nazwie gangu - tylko litery i cyfry oraz podkreślnik + 你的帮派名称中有无效字符,它只能由下划线、数字和字母组成 + + + You do not have enough money in your bank account.\n\nYou lack: $%1 + Nemáte dostatek peněz na váš bankovní účet \ ne vy balení:. $%1 + No tienes suficiente dinero en tu cuenta.\n\nTe falta: $%1 + + Du hast nicht genug Geld auf deinem Bankkonto.\n\nDir fehlen: $%1 + Vous n'avez pas assez d'argent dans votre compte en banque.\n\nIl vous manque: $%1 + Non hai abbastanza fondi nel tuo conto in banca.\n\nTi mancano: $%1 + Você não tem dinheiro suficiente na sua conta bancária.\n\nFaltam: R$%1 + Nie masz tyle pieniędzy na koncie.\n\nYou brakuje: $%1 + 你的银行账户里没有足够的钱.\n\n你缺少: $%1 + + + You have created the gang %1 for $%2 + Vytvořili jste gangu %1 pro $%2 + Has creado la Pandilla %1 por $%2 + + Du hast die Gang: %1 für $%2 erstellt. + Vous avez créé le gang %1 pour $%2. + Hai creato la Gang %1 al costo di $%2 + Você criou a gangue %1 por R$%2 + Stworzyłeś gang %1 za $%2 + 你创造帮派 %1 花费了 $%2 + + + You are about to disband the gang, by disbanding the gang it will be removed from the database and the group will be dropped. <br/><br/>Are you sure you want to disband the group? You will not be refunded the price for creating it. + Chystáte se rozpustit gang, tím, že rozpustí gang bude odstraněna z databáze a skupina bude vynechána. < br / > < br / > Opravdu chcete rozpustit skupinu? Budete nevrací cenu za jeho vytvoření. + Estas a punto de desmantelar la Pandilla, si prosiges la Pandilla se borrara de la base de datos. <br/><br/>Estas seguro de querer desmantelarla? Cualquier dinero invertido no sera devuelto. + + Du bist dabei die Gang aufzulösen. Durch Auflösung der Gang wird diese aus der Datenbank entfernt. <br/><br/>Bist du sicher, dass du die Gang auflösen willst? Du erhältst die Kosten für die Erstellung nicht zurück. + Vous vous apprêtez à dissoudre le gang. En démantelant le gang, il sera supprimé de la base de données et le groupe sera supprimé. <br/><br/>Etes-vous sûr de vouloir dissoudre le groupe? Vous ne serez pas remboursé du prix de sa création. + Stai per sciogliere la Gang, facendolo sarà rimossa dal Database e il gruppo verrà cancellato. <br/><br/>Sei sicuro di voler sciogliere il gruppo? Non verrai rimborsato dei fondi spesi per crearlo. + Você vai desfazer a sua gangue, ela será apagada do banco de dados. <br/><br/>Você tem certeza que quer desfazer a gangue? Você não será reembolsado. + Chcesz rozwiązać gang, po jego rozwiązaniu zostanie on usunięty z bazy danych i cała grupa zostanie rozwiązana. <br/><br/>Naprawdę chcesz rozwiązać grupę? Nie dostaniesz zwrotu środków za przeznaczonych na stworzenie gangu. + 你要解散帮派,帮派将从数据库中删除. <br/><br/>你确定你想解散帮派? 不会退还你创建帮派的花费. + + + Disbanding the gang... + Rozpuštění gang ... + Desmantelando la Pandilla... + + Gang wird aufgelöst... + Démantèlement du gang... + Sciogliendo la Gang... + Desfazendo a gangue... + Rozwiąż gang + 解散帮派... + + + Disbanding cancelled + rozpuštění zrušen + Desmantelamiento Cancelado + + Auflösung abgebrochen. + Démantèlement annulé + Scioglimento annullato + Desfazer gangue cancelado + Rozwiązywanie gangu anulowane + 解散取消 + + + The leader has disbanded the gang. + Vůdce se rozpustil gang. + El lider ha desmantelado la Pandilla. + + Der Anführer hat die Gang aufgelöst. + Le chef a démantelé le gang. + Il Capo ha sciolto la Gang + O lider desfez a gangue. + Szef rozwiązał gang + 老大解散了帮派。 + + + %1 has invited you to a gang called %2<br/>If you accept the invitation you will be a part of their gang and will have access to the gang funds and controlled gang hideouts. + %1 vás pozval na party s názvem %2<br/>Pokud přijmete pozvání budete součástí jejich gangu a budou mít přístup ke gangu fondů a řízených gangů úkrytů. + %1 te ha invitado a una Pandilla llamada %2<br/>Si aceptas seras parte de su pandilla, compartiras el banco de la pandilla y controlaras sus escondites. + + %1 hat dich zu der Gang: %2 eingeladen. <br/> Wenn Du die Einladung annimmst, wirst du ein Teil der Gang und bekommst Zugang zu dem Gangkonto und kontrollierten Verstecken. + %1 vous a invité dans un gang appelé %2<br/>Si vous acceptez l'invitation, vous serez dans leur gang et aurez accès à des fonds de gangs et des planques de gangs contrôlées. + %1 ti ha invitato nella Gang: %2<br/>Se vuoi accettarai l'invito entrerai a far parte della loro Gang ed avrai accesso ai loro fondi e ai loro Covi. + %1 convidou você para a gangue %2<br/>Se você aceitar terá acesso aos recursos da gangue e os esconderijos controlados pela mesma. + %1 zaprosił cię do gangu o nazwie %2<br/>Jeżeli zaakceptujesz zaproszenie będziesz członkiem gangu i uzyskasz dostęp do funduszy gangu oraz jego kryjówek + %1 邀请你加入一个叫做 %2 的帮派<br/>如果你接受了这个邀请,你将成为他们的帮派成员,并且可以获得帮派资金和使用帮派控制的帮派据点。 + + + You are about to invite %1 to your gang, if they accept the invite they will have access to the gang's funds. + Chystáte se pozvat%1 na svůj gang, pokud přijmou pozvání budou mít přístup k finančním prostředkům gangu. + Estas a putno de invitar a %1 a tu pandilla, si aceptan tendran aceso al banco de tu Pandilla. + + Du bist dabei %1 in deine Gang einzuladen. Wenn die Einladung angenommen wird, hat der Spieler Zugang zu den Gangbesitztümern. + Vous êtes sur le point d'inviter %1 dans votre gang, s'il accepte l'invitation, il aura accès aux fonds du gang. + Stai per invitare %1 nella tua Gang, se accetterà l'invito avrà accesso ai fondi della Gang. + Você está prestes a convidar %1 para a gangue, ele terá acesso aos recursos da gangue. + Właśnie zaprosiłeś %1 do gangu, jeśli zaakceptuje zaproszenie będzie miał dostęp do funduszy gangu. + 您将邀请 %1 加入您的帮派,如果他接受邀请,他将有权使用帮派的资金。 + + + You need to select a person to invite! + Musíte vybrat osobu vyzvat! + Tiense que selecionar a quien invitar! + + Du musst einen Spieler zum Einladen auswählen! + Vous devez sélectionner une personne à inviter ! + Devi selezionare una persona da invitare! + Você tem que selecionar um jogador para convidar! + Musisz zaznaczyć osobę aby ją zaprosić + 你需要选择一个人来邀请他! + + + You have sent a invite to your gang to %1 + Jste adresoval zvou na svůj gang do %1 + Has invitado a %1 a tu Pandilla + + Du hast eine Einladung in diese Gang an %1 gesendet. + Vous avez envoyé une invitation à rejoindre votre gang à %1 + Hai mandato l'invito alla tua Gang a %1 + Você enviou um convite para %1 se juntar a sua gangue + Wysłałeś zaproszenie do twojego gangu do %1 + 你已经给 %1 发送了一个加入你帮派的邀请 + + + Invitation Cancelled + Pozvánka byla zrušena + Invitación Cancelada + + Einladung abgebrochen. + Invitation annulée + Invito Annullato + Convite Cancelado + Zaproszenie anulowane + 取消邀请 + + + You cannot kick yourself! + Nemůžete kopat sami! + No te puedes expulsar a ti mismo! + + Du kannst dich nicht selbst kicken! + Vous ne pouvez pas vous éjecter vous-même ! + Non puoi espellerti da solo! + Você não pode kickar você mesmo! + Nie możesz sam się wykopać! + 你不能踢出自己! + + + Your gang has reached its maximum allowed slots, please upgrade your gangs slot limit. + Váš gang dosáhla svého maxima dovoleno sloty, proveďte upgrade hranice slotu vašeho gangu. + Tu Pandilla ha llegado a su máxima capacidad, aumenta los slots para seguir invitando. + + Deine Gang hat die maximale Anzahl an Mitgliedern erreicht, bitte erhöhe das Limit deiner Gang. + Votre gang a atteint le nombre de membre maximum, veuillez augmenter cette limite. + la tua Gang ha raggiungo il numero massimo di posti consentiti, aumentane il limite. + Sua gangue está lotada, você deve aumentar o número máximo de jogadores. + Twój gang osiągnął maksymalną pojemność, powiększ swój gang! + 你的帮派成员数已经达到了允许的最大范围, 请升级你的帮派成员数. + + + You need to select a person to kick! + Musíte vybrat osobu kopat! + Tienes que seleccionar a quien expulsar! + + Du musst einen Spieler auswählen, um ihn kicken zu können! + Vous devez choisir une personne à virer ! + Devi selezionare una persona da espellere! + Você tem que selecionar um jogador para kickar! + Musisz zaznaczyć osobę do wykopania + 你需要选择一个人来踢出! + + + You cannot leave the gang without appointing a new leader first! + Nemůžete opustit gang, aniž by o jmenování nového vůdce první! + No puedes salir de la Pandilla sin apuntar a un nuevo líder! + + Du kannst die Gang nicht verlassen, ohne vorher einen neuen Anführer zu ernennen! + Vous ne pouvez pas quitter le gang sans passer le lead à quelqu'un ! + Non puoi abbandonare la Gang prima di aver selezionato un nuovo Capo! + Você não pode sair da gangue sem transferir a liderança antes! + Nie możesz opuścić gangu bez przekazania komuś szefostwa nad gangiem + 没有任命新的老大,你不能离开这个帮派! + + + You have quit the gang. + You have quit the gang. + You have quit the gang. + You have quit the gang. + Du hast die Gang verlassen. + Vous avez quitté le gang. + You have quit the gang. + You have quit the gang. + You have quit the gang. + 你已经退出了帮派. + + + You are about to transfer leadership over to %1 <br/>By transferring leadership you will no longer be in control of the gang unless ownership is transferred back. + Chystáte se přenést vedoucí přes %1 <br/>Převedením vedení už nebude mít kontrolu nad gangu, pokud je vlastnictví převedeno zpět. + Estas a punto de transferir liderazgo a %1 <br/>Al transferir liderazgo no tendrás control de la Pandilla. + + Du bist dabei, die Gangführung an %1 zu übertragen<br/>Durch die Übertragung der Gangführung hast du keine Kontrolle mehr über die Gang. + Vous allez transférer le commandement à %1 <br/>En transférant le commandement, vous ne serez plus le chef du gang. + Stai per traferire il comando a %1 <br/>Facendolo non avrai più il controllo della Gang fino a quando non ti verrà restituito il comando. + Você vai transferir a liderança da gangue para %1 <br/>Você não será mais o lider, a não ser que a liderança seja transferida novamente. + Przekazałeś kierowanie gangiem %1 <br/>W związku z tym nie będzesz od tej chwili kontroli nad gangiem chyba, że kierowownictwo zostanie ci powierzone ponownie. + 你将要把老大的位置移交给 %1 <br/>老大的位置移交后,你将不能再控制这个帮派,除非有人将帮派老大位置还给你. + + + Transfer of leadership cancelled. + Převod vedení zrušen. + Transferencia de liderazgo cancelada. + + Übertragung der Gangführung abgebrochen. + Transfert du commandement annulé. + Trasferimento del comando annullato. + Transferencia de liderança cancelada. + Przkazanie kierownictwa anulowane. + 取消帮派老大的移交。 + + + You are already the leader! + Již jste vůdce! + Tu ya eres el líder! + + Du bist bereits der Anführer! + Vous êtes déjà chef ! + Sei già il Capo! + Você já está na liderança! + Jesteś już liderem! + 你已经是帮派老大了! + + + You need to select a person first! + Je třeba vybrat prvního člověka! + Tienes que seleccionar a alguien primero! + + Du musst erst einen Spieler auswählen! + Vous devez choisir une personne ! + Devi selezionare una persona! + Você tem que selecionar um jogador antes! + Musisz najpierw zaznaczyć osobę! + 你需要先选一个人! + + + You have been made the new leader. + You have been made the new leader. + You have been made the new leader. + You have been made the new leader. + Du wurdest zum neuen Anführer ernannt. + Vous êtes le nouveau leader. + You have been made the new leader. + You have been made the new leader. + You have been made the new leader. + 你被选为新的帮派老大. + + + You are about to upgrade the maximum members allowed for your gang. + Chystáte se aktualizovat maximální povolené členy pro svůj gang. + Estas a punto de aumentar la capacidad de tu Pandilla. + + Du bist dabei, die maximale Anzahl an Mitgliedern zu erhöhen. + Vous êtes sur le point de mettre à niveau la limite de membre maximum pour votre gang. + Stai aumentando il numero massimo di membri consentiti all'interno della tua Gang + Você vai atualizar o limite de membros da gangue. + Chcesz zwiększyć maksymalną ilość członków w gangu. + 您将升级您的帮派所允许的最大成员数. + + + Current Max: %1 + Proud Max: %1 + Límite Corriente: %1 + + Aktuelles Maximum: %1 + Max actuel: %1 + Attuali Max: %1 + Número máximo atual: %1 + Aktualnie Max: %1 + 目前的最大值: %1 + + + Upgraded Max: %2 + Modernizované Max: %2 + Nuevo Límite: %2 + + Maximum erhöhen: %2 + Après mise à niveau : %2 + Aumento Max: %2 + Novo número máximo: %2 + Po ulepszeniu Max: %2 + 升级最大值: %2 + + + Price: + Cena: + Precio: + + Preis: + Prix : + Costo: + Preço: + Koszt: + 价钱: + + + You do not have enough money in your bank account to upgrade the gangs maximum member limit. + Nemáte dostatek peněz na modernizaci gangů maximální limit člena svého bankovního účtu. + No tienes suficiente dinero como para mejorar la capacidad de tu pandilla. + + Du hast nicht genug Geld auf deinem Bankkonto, um das Mitgliederlimit deiner Gang zu erhöhen. + Vous n'avez pas assez d'argent dans votre compte en banque pour mettre à niveau la limite de membre maximale. + Non hai abbastanza fondi nel tuo conto in banca per aumentare il limite massimo di membri. + Você não dinheiro suficiente para aumentar o limite da gangue. + Nie posiadasz wystarczającej ilości środków na koncie aby powiększyć gang + 您的银行帐户没有足够的钱升级帮派最大成员限制。 + + + Current: + Aktuální + Corriente: + + Aktuell: + Actuel : + Attuale: + Atual: + Aktualny: + 最近的: + + + Lacking: + postrádat + Falta: + + Fehlend: + Manquant : + Mancanza: + Faltando: + Brakuje: + 缺少: + + + You have upgraded from %1 to %2 maximum slots for <t color='#8cff9b'>$%3</t> + Provedli jste upgrade z%1 do%2 Maximální sloty pro < k color = "# 8cff9b '> $%3 < / > + Has aumentado de %1 a %2 slots <t color='#8cff9b'>$%3</t> + + Du hast für <t color='#8cff9b'>$%3</t> die Anzahl von %1 auf %2 Mitgliedern erhöht. + Vous avez mis à niveau le nombre maximal de membres de %1 à %2 pour <t color='#8cff9b'>$%3</t> + Hai aumentato i posti massimi da %1 a %2 per <t color='#8cff9b'>$%3</t> + Limite de membros atualizado de %1 para %2 por <t color='#8cff9b'>R$%3</t> + Zwiększyłeś ilość możliwych członków gangu z %1 do %2 for <t color='#8cff9b'>$%3</t> + 你已经从 %1 升级到 %2 最大成员数 <t color='#8cff9b'>$%3</t> + + + Upgrade cancelled. + Upgrade zrušena. + Mejora Cancelada. + + Erhöhung abgebrochen. + Mise à jour annulée. + Aumento annullato. + Cancelar Upgrade. + Ulepszanie anulowane. + 升级取消。 + + + Funds: + fondy + Fondos: + + Geld: + Fonds : + Fondi + Recursos: + Środki: + 基金: + + + (Gang Leader) + (Gang Leader) + (Lider de Pandilla) + + (Gangführung) + (Chef de Gang) + (Capo Gang) + (Lider da Gangue) + (Szef gangu) + (帮派老大) + + + You are already in a gang. + Jste již v gangu. + Ya estas en una pandilla. + + Du befindest dich bereits in einer Gang. + Vous êtes déjà dans un gang. + Sei già in una banda. + Você já está em uma gangue. + Jesteś już w gangu. + 你已经在帮派中了。 + + + Bad UID? + Bad UID? + Mauvais UID ? + Bad UID? + Bad UID? + Bad UID? + Bad UID? + Bad UID? + Bad UID? + 错误的UID? + + + This player is already in a gang. + Tento hráč je již v gangu. + Ce joueur est déjà dans un gang. + Este jugador ya está en una pandilla. + Questo giocatore è già in una banda. + Ten gracz jest już w gangu. + Este jogador já está em uma gangue. + Этот игрок уже в банде. + Dieser Spieler ist bereits in einer Gang. + 这个玩家已经在帮派中了。 + + + You have been kicked out of the gang. + You have been kicked out of the gang. + Vous avez été éjecté de votre gang. + You have been kicked out of the gang. + You have been kicked out of the gang. + You have been kicked out of the gang. + You have been kicked out of the gang. + You have been kicked out of the gang. + Du wurdest aus der Gang gekickt. + 你被踢出了帮派。 + + + + + This garage has already been bought! + + + + Diese Garage wurde bereits gekauft! + Ce garage a déjà été acheté ! + + + + 这个仓库已经被购买了! + + + You are not the owner of this house! + + + + Vous n'êtes pas le propriétaire de cette maison ! + Du bist nicht der Eigentümer dieses Hauses! + + + + 你不是这所建筑的主人! + + + This garage is available for <t color='#8cff9b'>$%1</t><br/> + + + + Diese Garage steht dir für <t color='#8cff9b'>$%1</t><br/>zur Verfügung! + Ce garage est disponible pour <t color='#8cff9b'>$%1</t><br/> + + + + 这个仓库花费 <t color='#8cff9b'>$%1</t><br/> + + + This building is a Gang Hideout! + + + + Dieses Gebäude ist ein Gangversteck! + Ce bâtiment est une cachette de gang ! + + + + 这个建筑是一个帮派据点! + + + Are you sure you want to sell your garage? It will sell for: <t color='#8cff9b'>$%1</t> + + + + Bist du sicher, dass du diese Garage verkaufen willst? Sie wird verkauft für: <t color='#8cff9b'>$%1</t> + Êtes-vous sûr de vouloir vendre votre garage ? Vous le vendrez pour : <t color='#8cff9b'>$%1</t> + + + + 你确定要卖掉你的仓库吗? 它将售出: <t color='#8cff9b'>$%1</t> + + + Sell Garage + + + + Vendre le garage + Garage verkaufen + + + + 出售仓库 + + + Purchase Garage + + + + Acheter ce garage + Garage kaufen + + + + 购买仓库 + + + You do not own a garage here! + + + + Du besitzt hier keine Garage! + Vous ne possédez pas de garage ici ! + + + + 你在这里没有仓库! + + + Vehicle Garage + Garáž Vehicle + Garaje de Vehículos + + Fahrzeug Garage + Garage de Véhicules + Garage Veicoli + Garagem de Veículos + Garaż + 载具仓库 + + + Get Vehicle + Získat vozidlo + Obtener Vehículo + + Ausparken + Récupérer + Ritira Veicolo + Pegar Veículo + Wyciągnij pojazd: + 获取载具 + + + Sell Vehicle + Navrhujeme Vehicle + Vender Vehículo + + Fahrzeug verkaufen + Vendre + Vendi Veicolo + Vender Veículo + Sprzedaj pojazd + 出售载具 + + + Sell Price + Navrhujeme Cena + Precio de Venta + + Verkaufspreis + Prix de vente + Prezzo di vendita + Preço de Venda + Cena sprzedaży + 出售价格 + + + Storage Fee + skladného + Cuota de Guardado + + Parkgebühr + Frais de Stockage + Costo ritiro + Taxa de Armazenamento + Opłata parkingowa + 保管费 + + + No vehicles found in garage. + Žádná vozidla nalezený v garáži. + No se encontraron vehículos en el Garaje. + + Keine Fahrzeuge in der Garage gefunden. + Aucun véhicule trouvé dans le garage. + Non hai veicoli nel Garage. + Nenhum veiculo encontrado na garagem. + Nie znaleziono pojazdów w garażu + 仓库内没有载具。 + + + You don't have $%1 in your bank account + Nemáte $%1 z vašeho bankovního účtu + No tienes $%1 en tu cuenta de Banco + + Du hast keine $%1 auf deinem Bankkonto. + Vous n'avez pas %1$ sur ton compte en banque. + Non hai $%1 nel tuo conto in banca + Você não tem R$%1 na sua conta bancária + Nie masz %1 na koncie bankowym: + 你的银行账户里没有 $%1 + + + Spawning vehicle please wait... + Plodit vozidlo čekejte prosím ... + Creando vehículo, por favor espera... + + Fahrzeug wird bereitgestellt, bitte warten... + Mise en place du Véhicule, merci de patienter... + Creazione veicolo attendere... + Obtendo veiculo, aguarde por favor... + Wyciągam pojazd, proszę czekać ... + 正在提取载具请稍候... + + + Sorry but %1 was classified as a destroyed vehicle and was sent to the scrap yard. + Je nám líto, ale%1 byl klasifikován jako zničené vozidlo a byl poslán na šrotiště. + Lo siento, pero %1 fue clasificado como destruido y fue mandado al basurero. + + Entschuldigung, aber dein %1 wurde zerstört und auf den Schrottplatz geschickt. + Désolé, mais votre %1 a été détruit et vendu à la casse. + Purtroppo %1 è stato classificato come veicolo distrutto ed è stato mandato allo sfascio. + O veículo %1 foi mandado para o ferro velho pois foi classificado como destroido. + Przepraszamy ale %1 został sklasyfikowany jako zniszczony i został odesłany na złom. + 对不起 %1 被认定为损坏的载具并送往废弃场。 + + + Sorry but %1 is already active somewhere in the world and cannot be spawned. + Je nám líto, ale%1 je již aktivní někde ve světě a nemůže být třel. + Lo siento, pero %1 esta activo en alguna parte del mundo y no puede aparecer. + + Entschuldigung, aber dein %1 ist bereits ausgeparkt worden und kann darum nicht bereitgestellt werden. + Désolé, mais votre %1 a déjà été sorti du garage. + Purtroppo %1 è già presente nella mappa e non può essere ricreato + O veículo %1 já está presente no mapa e não pode ser retirado novamente + Przepraszamy ale %1 jest aktywny gdzieś na mapie i nie może zostać wyciągnięty. + 对不起,%1 被归类为毁坏的载具,并被送到废弃场。 + + + There is already a vehicle on the spawn point. You will be refunded the cost of getting yours out. + K dispozici je již vozidlo na spawn bodu. Ty budou vráceny náklady dostat se ven. + Ya hay un vehículo en el punto de Spawn, se te reembolsara el costo de sacar el vehículo. + + Es steht ein Fahrzeug auf dem Spawnpunkt. Die Kosten für das Bereitstellen werden dir erstattet. + Il y a déjà un véhicule sur le point de spawn. Le coût de sortie du véhicule vous a été remboursé. + C'è già un veicolo nel punto di creazione. Verrai rimborsato della spesa appena effettuata. + Existe um outro veiculo na area de spawn. Você será reembolsado. + W strefie parkowania znajduje się już pojazd. Środki za parkowanie zostaną zwrócone. + 载具重生点已经被另一辆载具占据。你的花费将会返还。 + + + You sold that vehicle for $%1 + Ty jsi prodal toto vozidlo za $%1 + Vendiste el vehículo por $%1 + + Du verkaufst dein Fahrzeug für $%1. + Vous avez vendu ce véhicule pour $%1. + Hai venduto il veicolo per $%1 + Você vendeu um veículo por R$%1 + Sprzedałeś pojazd za %1 + 你以 $%1 的价格出售了这辆载具 + + + That vehicle is a rental and cannot be stored in your garage. + Že vozidlo je půjčovna a nemohou být uloženy ve vaší garáži. + Este vehículo es rentado y no puede ser guardado. + + Mietwagen können nicht in der Garage geparkt werden. + Ce véhicule est une location et ne peut pas être stocké dans votre garage. + Il veicolo è in affitto e non può essere depositato in garage. + Esse veículo é alugado e não pode ser armazenado na garagem. + Pojazd wynajęty, nie możesz go schować w garażu. + 载具是租赁的,不能存放在你的仓库里。 + + + Thank you for returning the rental vehicle. + Děkujeme za vrácení zapůjčeného vozidla. + Gracias por devolver el vehículo de alquiler. + Спасибо, что вернул автомобиль в аренду. + Vielen Dank für die Rückgabe des Mietwagens. + Nous vous remercions de nous avoir rendu le véhicule de location. + Grazie per aver restituito il veicolo a noleggio. + Obrigado por devolver o veículo alugado. + Dziękuję za zwrot wypożyczonego pojazdu. + 感谢您归还租车。 + + + That vehicle doesn't belong to you therefor you cannot store it in your garage. + Co vozidlo nepatří k vám proto jej nelze ukládat ve vaší garáži. + Este vehículo no es tuyo! Asi que no lo puedes guardar. + + Das Fahrzeug gehört nicht dir und kann deshalb nicht in der Garage geparkt werden. + Ce véhicule ne vous appartient pas, vous ne pouvez pas le stocker dans votre garage. + Il veicolo non ti appartiene e quindi non puoi depositarlo nel tuo garage. + Você não é o proprietário desse veiculo, logo não poderá guarda-lo na garagem. + Pojazd nie należy do ciebie nie możesz go schować w garażu. Ale zawsze możesz podjechać do dziupli! + 载具不属于你,所以你不能把它存放在仓库里。 + + + The vehicle has been stored in your garage. + Vozidlo bylo uložené v garáži. + Has guardado el vehículo en el garaje. + + Das Fahrzeug wurde in die Garage eingeparkt. + Le véhicule a été entreposé dans le garage. + Il veicolo è stato depositato nel tuo garage. + O veículo foi guardado na sua garagem. + Pojazd został zaparkowany. + 载具已存放在你的仓库里. + + + Your vehicle is ready! + Vaše vozidlo je připraven! + Tu vehículo esta listo! + + Dein Fahrzeug steht bereit! + Votre véhicule est prêt. + Il tuo veicolo è pronto + O seu veículo está pronto + Pojazd jest gotowy + 你的载具准备好了! + + + The server is trying to store the vehicle... + Tento server se pokouší uložit vozidlo ... + El servidor esta tratando de guardar el vehículo... + + Der Server versucht, das Fahrzeug einzuparken... + Le serveur tente de stocker le véhicule... + Il server sta cercando di depositare il veicolo... + O servidor está guardando o veiculo... + Serwer próbuje schować pojazd w garażu ... + 服务器正试图存储载具... + + + The selection had a error... + Volba obsahuje chybu ... + Huvo un error en la selección... + + Die Auswahl hat einen Fehler... + La sélection a une erreur... + La selezione ha avuto un errore... + Erro ao selecionar.... + Ten wybór powoduje błąd + 选择有错误... + + + There isn't a vehicle near the NPC. + Není vozidla v blízkosti NPC. + No hay un vehículo cerca del NPC. + + Es befindet sich kein Fahrzeug in der Nähe des NPC. + Il n'y a pas de véhicule près du PNJ. + Non c'è alcun veicolo vicino all'NPC. + Não existe um veículo proximo ao NPC + Nie ma pojazdu w pobliżu NPC + NPC附近没有载具。 + + + Are you sure you want to sell your %1 for $%2? + Opravdu chcete prodat svůj %1 za $%2? + ¿Estás seguro de que quieres vender tu %1 por $%2? + Вы уверены, что хотите продать свой %1 за $%2? + Bist du sicher, dass du deine(n) %1 für $%2 verkaufen möchtest? + Êtes-vous sûr de vouloir vendre votre %1 pour $%2 ? + Siete sicuri di voler vendere la vostra %1 per $%2? + Tem a certeza que quer vender a sua %1 por $%2? + Jesteś pewien, że chcesz sprzedać swój %1 za $%2? + 你确定要把你的%1卖给%2? + + + Sell vehicle + Prodat vozidlo + Vender el vehículo + Продать автомобиль + Fahrzeug verkaufen + Vendre un véhicule + Vendere il veicolo + Vender veículo + Sprzedaj pojazd + 出售车辆 + + + + + Key Chain - Current List of Keys + Klíčenka - Aktuální seznam klíčů + Llavero - Lista de llaves + + Schlüsselbund - Aktuelle Liste + Porte-clés - Liste actuelle des clés + Portachiavi - Lista delle Chiavi + Chaves - Atual Lista de Chaves + Lista kluczyków + 钥匙 - 当前列表 + + + Drop Key + Drop Key + Tirar llave + + Wegwerfen + Jeter Clef + Abbandona Chiave + Remover Chave + Wyrzuć klucz + 丢弃钥匙 + + + Give Key + dát klíč + Dar Llave + + Geben + Donner Clef + Dai Chiave + Dar Chave + Daj klucz + 给予钥匙 + + + + + Player Menu + Nabídka přehrávače + Menu de Jugador + + Spieler Menü + Menu du Joueur + Menu Giocatore + Menu Jogador + Menu gracza + 玩家菜单 + + + Current Items + Aktuální položky + Objetos Actuales + + Aktuelle Gegenstände + Items Actuels + Oggetti Attuali + Items Atuais + Aktualne wyposażenie: + 当前物品 + + + Licenses + licencí + Licencias + + Lizenzen + Licences + Licenze + Licenças + Licencje + 许可证 + + + Money Stats + peníze Statistiky + Dinero + + Geld Statistik + Stats Monétaires + Statistiche Fondi + Dinheiro + Twoje środki + 资产统计 + + + My Gang + My Gang + Mi Pandilla + + Meine Gang + Mon Gang + Mia Gang + Gangue + Gang + 我的帮派 + + + Wanted List + seznamu hledaných + Lista de Busqueda + + Fahndungsliste + Interpol + Lista Ricercati + Lista de Foragidos + Poszukiwani + 通缉名单 + + + Cell Phone + Mobilní telefon + Celular + + Telefon + Téléphone + Cellulare + Celular + Telefon + 短消息 + + + Key Chain + Klíčenka + Llavero + + Schlüssel + Porte-clés + Portachiavi + Chaves + Klucze + 钥匙 + + + Admin Menu + Nabídka admin + Menu Admin + + Admin Menü + Menu Admin + Menu Admin + Menu Admin + Admin Menu + 管理菜单 + + + Sync Data + synchronizace dat + Sincronizar + + Speichern + Sync Data + Salva Dati + Sincronizar Dados + Synchronizuj + 同步数据 + + + + + Settings Menu + Nabídka Nastavení + Configuración + + Einstellungen + Menu Paramètres + Menu Impostazioni + Configurações + Ustawienia: + 设置菜单 + + + On Foot: + Pěšky: + A Pie: + + Zu Fuß: + A pied : + A piedi: + A Pé: + Na nogach: + 步行: + + + In Car: + V autě: + En Carro: + + Im Auto: + En voiture : + Auto: + No Carro: + W aucie: + 载具: + + + In Air: + Ve vzduchu: + En Aire: + + Im Himmel: + Air + Aria: + No Ar: + W powietrzu: + 空中: + + + View distance while on foot + Pohled vzdálenost, zatímco na nohy + Distancia de vista a pie + + Sichtweite zu Fuß + Distance de vue à pied + Distanza visiva a piedi + Visualizar distância enquanto a pé + Widoczność gdy na nogach + 视距 + + + View distance while in a land vehicle + Pohled vzdálenost, zatímco v pozemního vozidla + Distancia de vista en vehiculo terrestre + + Sichtweite in Landfahrzeugen + Distance de vue en véhicule terrestre + Distanza visiva su veicolo di terra + Visualizar distância enquanto em veículos terrestres + Widoczność gdy w aucie + 在陆地载具中观察距离 + + + View distance while in a air vehicle + Pohled vzdálenost, zatímco ve vzduchu vozidle + Distancia de vista en vehiculo aéreo + + Sichtweite in Luftfahrzeugen + Distance de vue en véhicule aérien + Distanza visiva su velivolo + Visualisar distância enquanto em veículos aéreos + Widoczność gdy w powietrzu + 在飞行器上观察距离 + + + Player Tags + přehrávač Tags + Marcador de Jugadores + + Spielernamen + Tags Joueurs + Tag Giocatore + Tags de Jogadores + Tagi graczy + 玩家标签 + + + Tags ON + značky na + Tags ON + + Namen AN + Tags ON + Tags ON + Tags ON + Tagi ON + 启用标签 + + + Tags OFF + Štítky OFF + Tags OFF + + Namen AUS + Tags OFF + Tags OFF + Tags OFF + Tagi OFF + 关闭标签 + + + Sidechat Switch + Sidechat Spínač + Canal Side + Habilitar Sidechat + Interruttore Sidechat + Sidechat Przełącznik + + Habilitar Sidechat + Sidechat umschalten + 聊天框开关 + + + Reveal Nearest Objects + Reveal Nejbližší objekty + Révéler les objets les plus proches + Revelar Objetos Cercanos + Rivela oggetti più vicini + Odsłonić Najbliższa Przedmioty + + Mostrar Objetos Próximos + Nahe Objekte anzeigen + 显示最近的物体 + + + Broadcast Switch + + Interrupteur de Transmission + Habilitar Transmisiones + + + + Habilitar Transmissões + Broadcast umschalten + 广播开关 + + + Sidechat OFF + Sidechat OFF + Sidechat OFF + + Sidechat AUS + Canal camp OFF + Chat fazione OFF + Sidechat OFF + Czat strony OFF + 聊天关闭 + + + Sidechat ON + Boční Chat ON + Sidechat OFF + + Sidechat AN + Canal camp ON + Chat fazione ON + Sidechat ON + Czat strony ON + 聊天开启 + + + + + Shop Inventory + Obchod Zásoby + Inventario de Tienda + + Ladeninventar + Boutique + Inventario Negozio + Loja de Inventário + Oferta sklepu + 店铺库存 + + + Your Inventory + Váš Inventory + Tu Inventario + + Eigenes Inventar + Votre Inventaire + Inventario Personale + Seu Inventário + Twoje wyposażenie + 你的库存 + + + Buy Item + Koupit Item + Comprar + + Kaufen + Acheter Objet + Compra Oggetto + Comprar Item + Kup objekt + 买东西 + + + Sell Item + Navrhujeme Item + Vender + + Verkaufen + Vendre Objet + Vendi Oggetto + Vender Item + Sprzedaj obiekt + 卖东西 + + + + + Spawn Selection + potěr Selection + Selección de Spawn + + Aufwachpunkt Auswahl + Sélection du Spawn + Selezione Spawn + Locais para Começar + Wybierz punkt odrodzenia + 选择重生点 + + + Spawn + Potěr + Spawn + + Aufwachen + Spawn + Spawn + Começar + Odradzanie + 重生 + + + Current Spawn Point + Aktuální potěr Point + Punto de Spawn Actual + + Aktueller Aufwachpunkt + Point de Spawn Actuel + Punto di Spawn corrente + Ponto de início Atual + Aktualny punkt odrodzenia + 目前的重生点 + + + You have spawned at + Jste třel + Has aparecido en + + Du bist aufgewacht in + Tu as spawn à + Ti trovi a + Você irá começar em + Odrodziłeś się w + 你重生了 + + + + + Give Ticket + Dejte Ticket + Dar Tiquete + + Ticket geben + Verbaliser + Dai Multa + Dar Multa + Wystaw mandat + 开据罚单 + + + Pay Ticket + Pay vstupenek + Pagar Tiquete + + Ticket bezahlen + Payer l'amende + Paga Multa + Pagar Multa + Zapłać mandat + 支付罚款 + + + Refuse Ticket + odmítnout Ticket + Denegar Tiquete + + Ticket ablehnen + Refuser l'amende + Rifiuta Multa + Recusar Multa + Odmów przyjęcia mandatu + 拒绝缴款 + + + + + Trunk Inventory + kufr Inventory + Inventario del Vehículo + + Kofferraum + Coffre + Inventario Veicolo + Inventário do Veículo + Zawartość + 库存清单 + + + Player Inventory + hráč Inventory + Inventario del Jugador + + Spielerinventar + Inventaire Joueur + Inventario Giocatore + Inventário do Jogador + Wyposażenie gracza + 玩家清单 + + + Take + Vzít + Sacar + + Nehmen + Récupérer + Prendi + Pegar + Weź + 取出 + + + Store + Obchod + Guardar + + Lagern + Déposer + Deposita + Depositar + Schowaj + 存储 + + + + + APD Wanted List + LAPD seznamu hledaných + Lista de Busqueda + + Fahndungsliste + Interpol + Lista Ricercati + Lista APD Poszukiwane + Lista de Procurados + 通缉名单 + + + Pardon + Pardon + Perdonar + + Erlassen + Pardonner + Perdona + Pardon + Perdão + 赦免 + + + Add + Přidat + Ajouter + Agregar + Aggiungere + Dodaj + + Adicionar + Hinzufügen + 添加 + + + Wanted People + chtěl, aby lidé + Personnes recherchées + Gente Buscada + La gente voleva + Ludzie chcieli + + Pessoas Procuradas + Gesuchte Personen + 通缉犯 + + + Citizens + občané + Citoyens + Ciudadanos + cittadini + Obywatele + + Cidadãos + Bürger + 公民 + + + Crimes + Zločiny + Crimes + Crimenes + crimini + Zbrodnie + + Crimes + Verbrechen + 罪犯 + + + %1 has been added to the wanted list. + %1 byl přidán do seznamu hledaných. + %1 a été ajouté à la liste des personnes recherchées. + %1 ha sido agregado a la Lista de Busqueda. + %1 è stato aggiunto alla lista dei ricercati. + %1 został dodany do listy pożądanego. + + %1 foi adicionado a lista de procurados. + %1 wurde zur Fahndungsliste hinzugefügt. + %1 已添加到通缉名单. + + + %1 count(s) of %2 + Počet%1 (y) z %2 + %1 chef (s) de %2 + %1 cuenta(s) de %2 + %1 count (s) del %2 + %1 count (ów) z %2 + + %1 contagem(s) de %2 + %1 Vergehen: %2 + %1 违法(次数) %2 + + + Current Bounty Price: $%1 + Aktuální Bounty Cena: $ %1 + Prix de la prime: $%1 + Recompensa Actual: $%1 + Corrente Bounty Prezzo: $%1 + Aktualny Bounty Cena: $%1 + + Atual recompensa: R$%1 + Aktuelle Prämie: $%1 + 目前的赏金: $%1 + + + + + Salema + Salema + Salema + + Sardine + Saumon + Salmone + Salema + Salema + 加州异鳍石鲈 + + + Ornate + Vyšperkovaný + Ornate + + Kaiserfisch + Doré + Orata + Ornamentado + Dorada + 橙带蝴蝶鱼 + + + Mackerel + Makrela + Verdel + + Makrele + Maquereau + Sgombro + Cavalinha + Makrela + 鲭鱼 + + + Tuna + Tuňák + Atún + + Thunfisch + Thon + Tonno + Atum + Tuńczyk + 金枪鱼 + + + Mullet + cípal + Lisas + + Meerbarbe + Mullet + Triglia + Tainha + Cefal + 梭鱼 + + + Cat Shark + Cat žralok + Pez Gato + + Katzenhai + Poisson Chat + Squalo + Tubarão Gato + Rekin + 鲨鱼 + + + Rabbit + Králičí + Conejo + + Hase + Lapin + Coniglio + Coelho + Zając + 兔子 + + + Chicken + Kuře + Gallina + + Hühnchen + Poulet + Pollo + Frango + Kurczak + 雏鸡 + + + Rooster + Kohout + Gallo + + Hähnchen + Coq + gallo + galo + kogut + 公鸡 + + + Goat + Koza + Cabra + + Ziege + Chèvre + Capra + Cabra + Koza + 山羊 + + + Sheep + Ovce + Obeja + + Schaf + Mouton + pecora + ovelha + Owca + 绵羊 + + + Turtle + Želva + Tortuga + + Schildkröte + Tortue + Tartaruga + Tartaruga + żółw + 乌龟 + + + + + You do not have $%1 for a %2 + Nemáte $%1 pro%2 + No tienes $%1 para una %2 + + Du hast keine $%1 für einen %2. + Vous n'avez pas %1$ pour cet élément : %2 + Non hai $%1 per $2 + Você não tem R$%1 para %2 + Nie masz $%1 na %2 + 你没有 $%1 支付 %2 + + + You bought a %1 for $%2 + Koupil sis%1 pro $ %2 + Comprastes una %1 por $%2 + + Du hast einen %1 für $%2 gekauft. + Vous avez acheté : %1 pour %2$ + Hai comprato un %1 per $%2 + Você comprou %1 por R$%2 + Kupiłeś %1 za $%2 + 你购买 %1 花费 $%2 + + + %1 was arrested by %2 + %1 byl zatčen%2 + %1 fue arrestado por %2 + + %1 wurde von %2 verhaftet. + %1 a été arrêté par %2 + %1 è stato arrestato da %2 + %1 foi preso por %2 + %1 został aresztowany przez %2 + %1 被 %2 逮捕 + + + You caught a %1 + chytil jste%1 + Atrapastes un %1 + + Du hast einen %1 gefangen. + Vous avez attrapé un %1 + Hai pescato %1 + Você pegou %1 + Złapałeś %1 + 你逮捕了 %1 + + + Gutting %1 + Kuchání%1 + Eviscerando %1 + + %1 ausnehmen + Eviscération de %1 + eviscerazione %1 + evisceração %1 + Patroszenie %1 + 去除 %1 的内脏 + + + You have collected some raw %1 meat + Nasbíráte nějaké syrové maso %1 + Has recolectado carne cruda de %1 + + Du hast rohes %1 Fleisch erhalten. + Vous avez récolté quelques morceaux de %1 cru + You have collected some raw %1 meat + You have collected some raw %1 meat + You have collected some raw %1 meat + 你已经从 %1 收集生肉 + + + You have taken some turtle meat + Jste si vzali nějaké želví maso + Has tomado carne de tortuga. + + Du hast etwas Schildkrötenfleisch bekommen. + Vous avez récupéré un peu de viande de tortue + Hai raccolto della carne di tartaruga + Você pegou carne de tartaruga + Wziąłeś trochę mięsa żółwia + 你吃了一些海龟肉 + + + You have earned $%1 + Jste získali $%1 + Has ganado $%1 + + Du hast $%1 verdient. + Vous avez gagné %1$ + Hai guadagnato $%1 + Você ganhou R$%1 + Otrzymałeś $%1 + 你赚了 $%1 + + + Dropping fishing net... + Pád rybářská síť ... + Tirando red de pesca... + + Fischernetz auswerfen... + Déploiement du filet de pêche... + Posizionando la rete da pesca... + Jogando rede de pesca... + Rzucam sieć... + 撒下鱼网... + + + Didn't catch any fish... + Nezachytil žádnou rybu ... + No atrapastes peces... + + Keinen Fisch gefangen... + Vous n'avez pas réussi à attraper de poisson... + Non hai pescato nulla... + A rede voltou vazia... + Nic nie złapałeś... + 没有捕到任何鱼... + + + Fishing net pulled up. + Rybářská síť vytáhl nahoru. + Recogistes la red. + + Fischernetz eingeholt. + Le filet de pêche a été entièrement relevé. + Rete da pesca recuperata. + A rede de pesca foi recolhida + Sieć wciągnięta. + 拉起渔网。 + + + Your inventory space is full. + Váš inventář prostor je plný. + No tienes espacio en tu inventorio. + + Dein Inventar ist voll. + Vous n'avez plus de place dans votre inventaire. + Il tuo inventario è pieno. + Seu inventário está cheio + Nie masz więcej miejsca. + 您的库存空间已满。 + + + Gathering %1... + Sběr%1 ... + Recolectando %1... + + Sammle %1... + Ramassage de %1... + Raccogliendo %1 + Coletando %1... + Zbierasz %1 + 采集 %1... + + + You have sold a %1 for $%2 + Jste prodal%1 pro $ %2 + Has vendido un %1 por $%2 + + Du hast einen %1 für $%2 verschrottet. + Vous avez vendu un(e) %1 pour $%2 + Hai venduto un %1 per %2$ + Você vendeu %1 por R$%2 + Sprzedałeś %1 za $%2 + 你卖掉 %1 赚了 $%2 + + + You have picked %1 %2 + Jste si vybrali% %1 2 + Has recogido %1 %2 + + Du hast %1 %2 aufgenommen. + Vous avez ramassé : %1 %2 + Hai trovato %1 %2 + Você pegou %1 %2 + Podniosłeś %1 %2 + 你采集了 %1 个 %2 + + + You have collected some %1 + Jste nasbírali řadu%1 + Has recolectado %1 + + Du hast etwas %1 gesammelt. + Vous avez récolté %1 + Hai raccolto %1 + Você coletou %1 + Wziąłeś %1 + 你采集了一些 %1 + + + You are to deliver this package to %1. + Jste doručit tento balíček %1 + Debes llevar este paquete a %1 + + Du musst dieses Paket bei %1 abliefern. + Vous avez livré ce paquet à %1 + Devi consegnare questo pacco al %1 + Você deverá entregar esse pacote para %1 + Dostarcz tę przesyłkę do %1 + 你要递送这个包裹到 %1。 + + + Deliver this package to %1. + Doručit tento balíček %1 + LLeva el paquete a: %1 + + Liefere dieses Paket bei %1 ab. + Livrer ce paquet à %1. + Consegna questo pacco al %1 + Entregue esse pacote para %1 + Dostarcz przesyłkę do %1 + 把这个包裹送到 %1。 + + + You failed to deliver the package because you died. + Nepodařilo se vám doručit balíček, protože jsi zemřela. + Fallastes la misión, porque moristes. + + Da du gestorben bist, hast du es nicht geschafft das Paket abzuliefern. + Vous êtes mort, livraison annulée. + Compra Oggetto + Você falhou na tarefa de entrega pois você morreu. + Nie dostarczyłeś przesyłki z uwagi na to że zmarłeś. + 因为你死了,所以你没能投递包裹。 + + + You do not have $%1 to be healed + Nemáte $%1, aby se léčil + No tienes $%1 para ser curado + + Du hast keine $%1, um behandelt zu werden. + Vous n'avez pas $%1 pour être soigné. + Non hai $%1 per essere curato + Você não tem R$%1 para ser curado + Nie masz $%1 na leczenie + 你没有 $%1 治疗费 + + + You do not need to be healed! + Nemusíte být uzdraven! + Vous êtes déjà en pleine forme ! + Usted no necesita ser curado! + Non è necessario essere guarito! + Nie trzeba się wyleczyć! + Você não precisa ser curado! + Вам не нужно быть исцелены! + Du brauchst keine Behandlung! + 你不需要治疗! + + + Spend $%1 to be fully healed? + Útrata $%1 musí být zcela vyléčit? + Donner $%1 pour être complètement guéri ? + Gastar $%1 para ser curado por completo? + Spendere $%1 di essere completamente guarito? + Wydać $%1 w pełni uzdrowiony? + Gastar US $%1 para ser totalmente curado? + Потратит $%1, чтобы быть полностью зажила? + Willst du dich für $%1 vollständig behandeln lassen? + 花费 $%1 痊愈? + + + Doctor + Doktor + Docteur + Médico + Medico + Lekarz + Médico + Врач + Arzt + 医疗人员 + + + Please stay still + Prosím, zůstat v klidu + Por favor, no te muevas + + Bitte bewege dich nicht! + Ne bougez pas + Attendi pazientemente + Fique parado por favor + Proszę się nie ruszać + 请不要动 + + + You need to be within 5m while the doctor is healing you + Musíte být v rámci 5m, zatímco lékař vás hojení + Debes estar a 5m mientras que te curan. + + Du musst in der Nähe vom Arzt bleiben, damit er dich behandeln kann. + Vous devez être à moins de 5m du médecin pendant qu'il vous soigne. + Devi restare entro 5m dal dottore per essere curato + Você tem que estar a 5m para o médico curá-lo + Musisz być w pobliżu doktora gdy ten cię leczy - ok 5m + 医疗人员在治疗你的时候,你必须在5米以内 + + + You are now fully healed. + Ty jsou nyní plně uzdravil. + Estas curado! + + Du wurdest behandelt. + Vous êtes completement soigné. + Sei stato curato completamente. + Sua saúde está perfeita + Zostałeś wyleczony + 你现在痊愈了。 + + + %1 your %2 is being impounded by the police. + %1 Váš%2 je zabaveno policií. + %1 tu %2 esta siendo embargado por la policía. + + %1 dein %2 wird von der Polizei beschlagnahmt! + %1, votre %2 est en train d'être envoyé à la fourrière par la police. + %1 il tuo %2 sta per essere sequestrato dalla Polizia. + %1 seu %2 está sendo apreendido pela Polícia + %1 twój %2 jest usuwany przez Policję + %1 的 %2 正在被警察扣留。 + + + Impounding Vehicle + vzdouvání Vehicle + Embargando Vehículo + + Fahrzeug wird beschlagnahmt + Mise en fourrière + Sequestro Veicolo in corso + Apreendendo veículo + Usuwam pojazd + 扣留载具 + + + Impounding has been cancelled. + Zabavení byla zrušena. + Embargo cancelado. + + Beschlagnahmung abgebrochen. + Mise en fourrière annulée. + Il sequestro è stato annullato. + Ação de apreender foi cancelada + Przerwano usuwanie pojazdu + 扣留已被取消. + + + You have impounded a %1\n\nYou have received $%2 for cleaning up the streets! + Jste zabaveno a %1 \n\n jste obdržel $%2 pro čištění ulic! + Has embargado un %1\n\nHas recibido $%2 por limpiar las calles! + + Du hast einen %1 beschlagnahmt\n\nDu hast $%2 für das Aufräumen der Straßen bekommen! + Vous avez mis en fourrière un(e) %1\n\nVous avez reçu $%2. + Hai sequestrato un %1\n\nHai ricevuto $%2 per aver mantenuto l'ordine nelle strade! + Você apreendeu %1\n\nVocê recebeu R$%2 por deixar as ruas mais seguras! + Usunąłeś %1\n\n Otrzymujesz $%2 za oczyszczanie mapy + 你扣留了 %1\n\你收到了 $%2 扣留费! + + + %1 has impounded %2's %3 + %1 byl odtažen% %2 3 je + %1 a embargado el %3 de %2 + + %1 hat %2's %3 beschlagnahmt. + %1 a mis en fourrière le %3 de %2. + %1 ha sequestrato il %2 di %3 + %1 apreendeu %3 de %2 + %1 usunął %2's %3 + %1 扣留了 %2 的 %3 + + + You paid $%1 for impounding your own %2. + Zaplatil jste $%1 pro vzdouvání vlastní %2. + Vous avez payé $%1 pour la mise en fourrière de votre propre %2. + Has pagado $%2 para embargar tu propio %1. + Hai pagato $%1 per sequestro la propria %2. + Zapłaciłeś $%1 do zatrzymywania własną %2. + + Du hast $%1 bezahlt, weil du dein eigenen %2 beschlagnahmt hast. + Você pagou R$%1 para guardar seu próprio %2. + 你支付 $%1 取出了被扣留的 %2. + + + Abort available in %1 + Přerušit k dispozici v %1 + Aborto disponible en %1 + + Déconnexion disponible dans %1 + Abbruch möglich in %1. + Abbandona disponibile in %1 + Abortar disponível em %1 + Możesz przerwać za %1 + 距离下线时间 %1 + + + This vehicle is already mining + Toto vozidlo je již dobývání + Este Vehículo ya esta minando + + Dieses Fahrzeug ist bereits am Abbauen. + Ce véhicule est déjà en train de miner + Questo veicolo sta già estraendo risorse + Esse veículo já está minerando + Pojazd jest w trakcie wydobycia surowców + 载具已经在开采了 + + + The vehicle is full + Vozidlo je plná + El vehículo esta lleno! + + Das Fahrzeug ist voll. + Le véhicule est plein. + Il veicolo è pieno + O veículo está cheio. + Pojazd jest pełny + 载具库存已满 + + + You are not near a resource field + Nejste v blízkosti oblasti zdrojů + No estas cerca de un campo de recursos. + + Du bist nicht in der Nähe eines Ressourcenfeldes. + Vous n'êtes pas à proximité d'un champ de ressources. + Non sei vicino ad un campo risorse + Você não está próximo ao recurso + Nie jesteś w pobliżu pola surowców + 你不在资源区域附近 + + + You cannot turn the vehicle on when mining + Nemůžete otočit vozidlo o tom, kdy výtěžek + No puedes girar el vehículo mientras esta minando + + Du kannst das Fahrzeug nicht starten, solange es am Abbauen ist. + Le moteur doit être arrêté pour que le véhicule puisse miner + Non puoi accendere il veicolo mentre estrae risorse + Você não pode ligar o veículo enquanto minera + Nie możesz poruszać pojazdem w trakcie wydobycia. + 开采时不能打开载具 + + + The Device is mining... + Zařízení je důlní ... + El Dispositivo esta minando... + + Das Fahrzeug baut ab... + Le véhicule est en train de miner... + Il veicolo sta estrando risorse... + A máquina está minerando... + Trwa wydobycie... + 设备正在开采... + + + Completed cycle, the device has mined %1 %2 + Dokončena cyklus, přístroj se těžil% %1 2 + Ciclo completado el dispositivo ha minado %1 %2 + + Sammeln beendet, das Fahrzeug hat %1 %2 abgebaut. + Cycle terminé, le véhicule a miné %1 %2 + Ciclo completato, il veicolo ha raccolto %1 %2 + Ciclo completo, a máquina minerou %1 %2 + Urządzenie wydobyło %1 %2 + 完成一个开采周期,设备已开采 %1 %2 + + + Vehicle is out of fuel + Vozidlo je mimo pohonné hmoty + El vehículo no tiene gasolina. + + Das Fahrzeug hat keinen Treibstoff mehr. + Le véhicule n'a plus de carburant. + Il veicolo è senza carburante + O veículo está sem combustível + Brak paliwa w pojezdzie + 载具燃料不足 + + + You have packed up the spike strip. + Jste sbalil spike proužek. + Has agarrado la Barrera de Clavos. + + Du hast das Nagelband eingepackt. + Vous avez récupéré la herse. + Hai raccolto una striscia chiodata. + Você recolheu o tapete de espinhos. + Kolczatka zwinięta + 你铺设了钉刺带。 + + + %1 has been placed in evidence, you have received $%2 as a reward. + %1 byl umístěn v důkazu, jste obdrželi $%2 jako odměnu. + %1 ha sido colocado en evidencias, has recibido $%2 como recompensa. + + %1 hat Beweise hinterlassen, als Belohnung erhälst du $%2. + Vous avez mis sous scellé la drogue de %1, vous avez reçu $%2 comme récompense. + E' stata trovata della merce illegale: %1, hai ricevuto $%2 come ricompensa. + %1 foi pego como evidência, você recebeu R$%2 como recompensa. + %1 umieszczony w dowodach, otrzymujesz w nagrodę $%2 + %1 已经被送入监狱,你已经收到了 $%2 作为奖励. + + + You have picked up $%1 + Jste zvedl $%1 + Has recogido $%1 + + Du hast $%1 aufgehoben. + Vous avez ramassé $%1 + Hai raccolto $%1 + Você pegou R$%1 + Podniosłeś $%1 + 你捡到了 $%1 + + + You must wait at least 3 minutes in jail before paying a bail. + Musíte počkat nejméně 3 minuty ve vězení předtím, než platit kauci. + Debes esperar un minimo de 3 minutos en la cárcel antes de poder pagar la fianza. + + Du musst mindestens 3 Minuten lang im Gefängnis bleiben, bevor du die Kaution beantragen kannst. + Vous devez attendre au moins 3 minutes en prison avant de pouvoir payer votre caution. + Devi aspettare almeno 3 minuti in prigione prima di poter pagare la cauzione. + Você precisa esperar pelo menos 3 minutos antes de poder pagar fiança. + Musisz poczekać conajmniej 3 minuty w więzieniu zanim zapłacisz kaucję. + 在保释之前,你必须至少在监狱里呆3分钟。 + + + You do not have $%1 in your bank account to pay bail. + Nemáte $%1 z vašeho bankovního účtu platit kauci. + No tienes $%1 en tu cuenta de banco para pagar la fianza! + + Du hast keine $%1 auf deinem Bankkonto, um die Kaution zu bezahlen. + Vous n'avez pas $%1 dans votre compte en banque pour payer la caution. + Non hai $%1 nel tuo conto in banca per poter pagare la cauzione. + Você não tem R$%1 em sua conta bancária para pagar a fiança. + Nie masz $%1 na koncie aby zapłacić kaucję. + 你的银行账户没有 $%1 的金额。 + + + %1 has posted bail! + %1 byl vyslán na kauci! + %1 a pagado la fianza! + + %1 hat die Kaution bezahlt! + %1 a payé sa caution ! + %1 ha pagato la cauzione! + %1 pagou a fiança! + %1 wpłacił kaucję! + %1 已保释! + + + There isn't a vehicle nearby... + Není vozidlo v blízkosti ... + No hay un vehículo cerca... + + Es ist kein Fahrzeug in der Nähe... + Il n'y a pas de véhicule à proximité... + Non c'è alcun veicolo qui vicino... + Não existe um veículo por perto... + W pobliżu nie ma pojazdu... + 附近没有载具... + + + You can't chop a vehicle while a player is near! + Nemůžeš sekat vozidla, zatímco hráč je blízko! + Vous ne pouvez pas vendre un véhicule alors que son propriétaire est à proximité ! + No puedes vender este vehículo mientras hay un jugador cerca! + Non si può rubare un veicolo mentre un giocatore è vicino! + Nie można posiekać pojazd podczas gdy gracz jest w pobliżu! + + Você não pode usar o desmanche enquanto um jogador está próximo! + Du kannst kein Fahrzeug beim Schrotthändler verschrotten, während ein Spieler in der Nähe ist! + 当玩家靠近时,你不能盗窃载具! + + + %1 was restrained by %2 + %1 byl omezen%2 + %1 fue retenido por %2 + + %1 wurde von %2 festgenommen + %1 a été menotté par %2 + %1 è stato ammanettato da %2 + %1 foi imobilizado por %2 + %1 został skuty przez %2 + %1 被 %2 约束 + + + Searching... + Hledám ... + Buscando... + + Durchsuche... + Recherche... + Ricerca... + Revistando... + Szukam... + 搜查... + + + Couldn't search the vehicle + Nemohli vyhledávat na vozidlo + No se pudo buscar el vehículo. + + Das Fahrzeug konnte nicht durchsucht werden! + Impossible de fouiller le véhicule. + Impossibile ispezionare il veicolo + Você não pode revistar o veículo + Nie można przeszukać pojazdu + 不能搜查载具 + + + Your illegal items have been put into evidence. + Vaše nelegálních položky byly uvedeny do důkazy. + Tus objetos ilegales fueron confiscados. + + Deine illegalen Gegenstände wurden als Beweismittel eingezogen. + Vos objets illégaux ont été mis sous scellé. + I tuoi articoli illegali sono stati messi sotto sequestro. + Seus itens ilegais foram postos em evidência. + Twoje nielegalne pozycje zostały wprowadzone do dowodów. + 你的非法物品被查获。 + + + This vehicle has no information, it was probably spawned in through cheats. \n\nDeleting vehicle. + Toto vozidlo nemá žádné informace, to bylo pravděpodobně třel dovnitř podvodníky. \ In \ Odstranění vozidla. + Este vehículo no tiene informacion, posiblemente fue creado atravez de Cheats \n\nBorrando vehículo. + + Über das Fahrzeug gibt es keine Informationen, es wurde vermutlich durch Cheats gespawnt. \n\nLösche das Fahrzeug. + Ce véhicule ne dispose d'aucune information, il a probablement été créé par un hackeur. \n\ Suppression du véhicule. + Il veicolo è privo di identificativi, probabilmente è stato creato mediante cheat. \n\nCancellazione veicolo. + Esse veículo não tem informações, é provável que ele tenha sido criado por um cheater.\n\nDeletando veículo. + Pojazd bez informacji servera, prawdopodobnie umieszczony przez hakera \n\n usuwam pojazd. + 这载具没有任何信息, 它可能是通过作弊产生的. \n\n删除载具。 + + + You are already doing an action. Please wait for it to end. + Ty jsou již dělá akci. Počkejte prosím, až to skončí. + Ya estas haciendo una acción, espera a que termine. + + Du führst bereits eine Aktion aus. Bitte warte, bis diese beendet ist. + Vous faites déjà une action. Merci d'attendre la fin de celle-ci. + Stai già compiendo un'azione, attendi che finisca. + Você já está executando uma ação. Por favor espere até que ela acabe. + Aktualnie wykonujesz jakąś akcję poczekaj aż skończysz. + 你已经在行动了.请等待结束. + + + %1 was unrestrained by %2 + %1 byl živelný%2 + %1 fue soltado por %2 + + %1 wurde von %2 freigelassen. + %1 a été démenotté par %2. + %2 ha tolto le manette a %1 + %1 foi liberado por %2 + %1 został rozkuty przez %2 + %1 摆脱了 %2 的约束 + + + %1 has robbed %2 for $%3 + %1 oloupil%2 na $ %3 + %1 le ha robado $%3 a %2 + + %1 hat $%3 von %2 geraubt. + %1 a volé %2 pour $%3. + %1 ha rapinato %2 di $%3 + %1 roubou R$%3 de %2 + %1 obrabował $%2 na $%3 + %1 抢劫了 %2 金钱 $%3 + + + %1 doesn't have any money. + %1 nemá žádné peníze. + %1 No tiene dinero. + + %1 hat kein Geld. + %1 n'a pas d'argent. + %1 non ha alcun soldo. + %1 não tem nenhum dinheiro. + %1 nie ma pieniędzy. + %1 身无分文。 + + + %1 was tazed by %2 + %1 byl tased%2 + %1 fue paralizado por %2 + + %1 wurde von %2 getazert. + %1 a été tazé par %2. + %1 è stato taserato da %2 + %1 foi eletrocutado por %2 + %1 został potraktowany paralizatorem przez %2 + %1 被 %2 约束 + + + A vehicle was searched and has $%1 worth of drugs / contraband. + Vozidlo byl prohledán a má $%1 v hodnotě drog / kontrabandu. + Un vehículo fue buscado y se econtro $%1 en drogas / contrabando. + + Ein Fahrzeug wurde durchsucht und es wurden Drogen / Schmuggelware im Wert von $%1 gefunden. + Un véhicule venant d'être fouillé avait $%1 de drogue / contrebande. + Un veicolo è stato ispezionato e sono stati sequestrati $%1 in materiale illegale. + O veículo foi revistado e tem R$%1 em drogas ou contrabandos + Podczas przeszukania znalezono narkotyki/kontrabandę o wartości $%1 + 搜查载具查获价值 $%1 的毒品/违禁品。 + + + A container of house was searched and has $%1 worth of drugs / contraband. + Kontejner domu byl prohledán a má $%1 v hodnotě drog / kontrabandu. + Un contenedor fue buscado y se econtro $%1 en drogas / contrabando. + + Ein Container im Haus wurde durchsucht und es wurden Drogen / Schmuggelware im Wert von $%1 gefunden. + Un conteneur de maison venant d'être fouillé avait $%1 de drogue / contrebande. + Un veicolo è stato ispezionato e sono stati sequestrati $%1 in materiale illegale. + O veículo foi revistado e tem R$%1 em drogas ou contrabandos + Podczas przeszukania znalezono narkotyki/kontrabandę o wartości $%1 + 搜查房子存储箱查获价值 $%1 的毒品/违禁品. + + + You have been pulled out of the vehicle. + Byli jste vytáhl z vozu. + Te han sacado del vehículo + + Du wurdest aus dem Fahrzeug gezogen. + Vous avez sorti les personnes du véhicule. + Sei stato estratto dal veicolo + Você foi retirado do veículo + Zostałeś wyciągnięty z pojazdu + 你从车里被拖出来了。 + + + %1 has gave you %2 %3. + %1 vám již dal% %2 3. + %1 te ha dado %2 %3 + + %1 hat dir %2 %3 gegeben. + %1 vous a donné %2 %3. + %1 ti ha dato %2 %3 + %1 lhe deu %2 %3 + %1 dał ci %2 %3 + %1 给了你 %2 %3. + + + %1 has given you $%2. + %1 vám dal $ %2. + %1 te ha dado $%2 + + %1 hat dir $%2 gegeben. + %1 vous a donné $%2. + %1 ti ha dato $%2 + %1 lhe deu R$%2 + %1 dał ci $%2 + %1 给了你 $%2. + + + Sending information to server please wait..... + Odesílání informací serveru čekejte prosím ... + Mandando información, por favor espere... + + Sende Informationen an den Server, bitte warten..... + Envoi d'informations au serveur, patientez s'il vous plait... + Invio delle informazioni al server, attendere prego...... + Enviando informações para o servidor, seja paciente..... + Przesyłam informacje na server poczekaj .... + 发送信息到服务器,请稍候..... + + + An action is already being processed... + Akce je již zpracován ... + Una acción ya esta siendo procesada... + + Es wird bereits eine Aktion ausgeführt... + Une action est déjà en cours de traitement... + Un'azione è già in corso... + Você já está realizando um ação... + Akcja jest w trakcie wykonywania... + 正在处理操作... + + + You're doing it too fast! + Děláte to příliš rychle! + Moins vite entre chaque action ! + Lo estas haciendo muy rapido! + Lo stai facendo troppo veloce! + + Du bist ganz aus der Puste! Warte ein paar Sekunden! + Você está fazendo isso muito rápido! + Za szybko zwolnij ! + 你做得太快了! + + + You don't have enough space for that amount! + Nemáte dostatek prostoru pro tuto částku! + No tienes suficiente espacio para eso! + + Du hast für diese Menge nicht genug Platz! + Vous n'avez pas assez de place pour cette quantité ! + Non hai abbastanza spazio per quel quantitativo! + Você não tem espaço suficiente para guardar o item + Nie masz tyle miejsca! + 你没有足够的空间存放物品! + + + You don't have that much money! + Nemáte tolik peněz! + No tienes tanto dinero! + + Du hast nicht so viel Geld! + Vous n'avez pas assez d'argent ! + Non hai tutti quei soldi! + Você não tem todo esse dinheiro! + Nie masz tyle pieniędzy! + 你没有那么多钱! + + + You are not a cop. + Ty nejsi polda. + No eres policía. + + Du bist kein Polizist. + Vous n'êtes pas policier. + Non sei un poliziotto. + Você não é um Policial. + Nie jesteś policjantem + 你不是警察。 + + + You don't have enough room for that item. + Nemáte dostatek prostoru pro danou položku. + No tienes el espacio suficiente. + + Du hast nicht genug Platz für den Gegenstand. + Vous n'avez pas assez de place. + Non hai abbastanza spazio per quell'oggetto. + Você não tem espaço suficiente no seu inventário. + Nie masz wystarczająco miejsca na tą rzecz. + 你没有足够的空间存放这个物品。 + + + You need $%1 to process without a license! + Musíte $%1 bez povolení ke zpracování! + Necesitas $%1 par procesar sin una licencia! + È necessario $%1 a processo senza patente! + + Du benötigst $%1, um ohne Lizenz verarbeiten zu können! + Vous devez payer $%1 pour traiter sans licence ! + Você precisa de R$%1 para processar sem uma licença! + Potrzebujesz $%1 w celu przetworzenia bez licencji + 你未取得许可需要支付 $%1 才能加工! + + + You don't have enough items! + Ty nemají dostatek položku! + No tienes suficientes objetos! + Non disponi di abbastanza materiale grezzo! + Nie masz wystarczająco dużo rzeczy! + + Vous n'avez pas assez d'items ! + Você não tem itens suficientes! + Du hast nicht genug Materialien! + 你没有足够的物品! + + + You have processed your item(s)! + Jste zpracujeme vaši položku (y)! + Has procesado tus objeto(s) + + Vous avez traité vos objet(s) ! + Hai processato i tuoi oggetti! + Przetworzeniu swój przedmiot (y)! + Você processou seu(s) item(s) + Du hast deine Materialien verarbeitet! + 你已经加工了你的物品! + + + You can't rapidly use action keys! + Nemůžete rychle využít akčních kláves! + No puedes usar Keys de Acciones tan rápido! + + Die Aktionstaste kann nicht so schnell hintereinander genutzt werden! + Vous ne pouvez pas utiliser rapidement les touches d'action ! + Non puoi riusare così rapidamente il tasto azione! + Você não pode usar a tecla de ação repetidamente! + Za szybko używasz przycisku akcji! + 你不能快速点击按键! + + + You do not have enough funds in your bank account. + Nemáte dostatek prostředků na váš bankovní účet. + No tienes tanto dinero en tu cuenta de banco. + + Du hast nicht genug Geld auf deinem Bankkonto. + Vous n'avez pas assez de fonds dans votre compte en banque. + Non hai abbastanza fondi nel tuo conto in banca. + Você não tem todo esse dinheiro em sua conta bancária. + Nie masz wystarczających środków w banku. + 你的银行账户里没有足够的资金。 + + + Couldn't add it to your inventory. + Nemohl ji přidat do svého inventáře. + No se pudo agregar a tu inventario. + + Es konnte nichts zu deinem Inventar hinzugefügt werden. + Impossible d'ajouter cela à votre inventaire. + Non puoi aggiungerlo al tuo inventario. + Não foi possível adicionar o item ao seu inventário + Nie można dodać tego do twojego wyposażenia + 无法将其添加到你的库存中。 + + + You haven't eaten anything in awhile, You should find something to eat soon! + Jste nejedli nic za čas, byste měli najít něco k jídlu brzy! + No has comido nada en un largo rato. Deberías buscar algo de comer! + + Du hast schon eine Weile nichts mehr gegessen! Du solltest langsam etwas zum Essen suchen! + Vous n'avez rien mangé depuis un certain temps, vous devriez trouver quelque chose à manger ! + E' da tempo che non mangi qualcosa, dovresti trovare qualcosa da mettere sotto i denti in fretta! + Você não come a bastante tempo. Ache algo para comer logo!. + Zaczynasz być głodny, poszukaj czegoś do jedzenia! + 你有一阵子没吃东西了,你应该马上找点吃的! + + + You are starting to starve, you need to find something to eat otherwise you will die. + Můžete se začínají hladovět, budete muset najít něco k jídlu jinak zemřete. + Te esta dando mucha, mucha hambre. Come algo o moriras! + + Du hast Hunger! Du solltest schnell etwas essen oder du wirst verhungern. + Vous commencez à mourir de faim, vous devez trouver quelque chose à manger, ou vous mourrez. + Ti stai indebolendo, devi trovare qualcosa da mangiare o morirai. + Você está começando a ficar famindo. Se você não comer irá morrer de fome. + Długo nie jadłeś, zjedz coś lub zginiesz z głodu. + 你感觉饿了,你需要找点东西吃,否则你会死的。 + + + You are now starving to death, you will die very soon if you don't eat something. + Nyní jste hladoví k smrti, zemřete velmi brzy, pokud nemáte něco jíst. + Estas a punto de morir de hambre, busca comida rápido! + + Du bist am Verhungern! Du wirst sterben, wenn du nichts zum Essen findest! + Vous êtes en train de mourir de faim, vous allez mourir très bientôt si vous ne mangez pas quelque chose. + Stai perdendo le forze, se non mangi qualcosa in fretta morirai. + Você está morrendo de fome, coma algo ou irá morrer. + Zaczynasz słabnąć z głodu zjedz coś lub zginiesz !!! + 你现在很饿,如果你不吃东西,很快就会死的。 + + + You have starved to death. + Jste hladem. + Te has muerto de hambre. + + Du bist verhungert! + Vous êtes mort de faim. + Sei morto per la fame. + Você morreu de fome + Wygłodziłeś się na śmierć. + 你饿死了。 + + + You haven't drank anything in awhile, You should find something to drink soon. + Nemáte pil nic za čas, byste měli najít něco k pití brzy. + No has tomado nada en un largo rato. Deberías buscar algo de tomar! + + Du hast schon eine Weile nichts mehr getrunken! Du solltest langsam etwas zum Trinken suchen! + Vous n'avez rien bu depuis un certain temps, vous devriez trouver quelque chose à boire ! + E' da parecchio tempo che non bevi qualcosa, dovresti trovare qualcosa da bere. + Você não bebe nada a bastante tempo. Ache algo para beber logo. + Zaczynasz być spragniony, powinienieś poszukać czegoś do picia. + 你有一阵子没喝水了,你应该马上找点喝的。 + + + You haven't drank anything in along time, you should find something to drink soon or you'll start to die from dehydration. + Vy jste nic pil na delší dobu, měli byste si najít něco k pití hned, nebo budete začnou umírat z dehydratace. + Te esta dando mucha, mucha sed. Toma algo o moriras! + + Du hast Durst! Du solltest schnell etwas trinken oder du wirst verdursten! + Vous commencez à mourir de soif, vous allez mourir de soif si vous ne buvez pas. + E' troppo tempo che non bevi qualcosa, dovresti trovare qualcosa da bere o comincerai a disitratarti. + Você está ficando desidratado. Se não beber algo poderá morrer. + Długo nic nie piłeś, napij się czegoś bo możesz zginąć z pragnienia. + 你在一段时间内没有喝水,你要尽快找到喝的,否则你会开始脱水而死。 + + + You are now suffering from severe dehydration find something to drink quickly! + Nyní trpí těžkou dehydratací najít něco k pití rychle! + Estas a punto de morir de desidratación, busca algo de tomar rapido! + + Du bist am Verdursten! Du wirst sterben, wenn du nichts zum Trinken findest! + Vous êtes en train de mourir de soif, vous allez mourir très bientôt si vous ne buvez pas. + Stai soffrendo per una grave deidratazione, trova velocemente qualcosa da bere o morirai! + Você está sofrendo de desidratação. Beba algo ou irá morrer! + Zaczynasz słabnąć z pragnienia, wypij coś inaczej zginiesz!!! + 你现在正严重脱水,快找点喝的! + + + You have died from dehydration. + Jsi zemřel na dehydrataci. + Has muerto de desidratación. + + Du bist verdurstet! + Vous êtes mort de soif. + Sei morto per disidratazione. + Você morreu desidratado. + Umarłeś z uwagi na odwodnienie organizmu + 你死于脱水. + + + You are over carrying your max weight! You will not be able to run or move fast till you drop some items! + Překročili jste přenášení maximální váhu! Nebudete moci spustit nebo přesunout rychle, dokud se kapka některé položky! + Estas cargando tu peso máximo! No puedes correr o moverte rapido hasta que botes algunos objetos! + + Du trägst zu viel bei dir! Du bist nicht in der Lage, zu rennen oder dich schnell zu bewegen, bis du einige Gegenstände abgelegt hast! + Vous êtes surchargé, vous ne pouvez plus courir ou bouger rapidement à moins de lacher quelques objets ! + Stai trasportando oltre il tuo carico massimo! Non riuscirai a correre fino a quando non ti libererai di qualche oggetto! + Você está carregando muito peso. Você não irá conseguir correr ou se mover rapidamente. + Niesiesz maksymalny ciężar, nie będziesz mógł biegać ani szybko chodzić dopuki nie wyrzucisz jakiejś rzeczy + 你超过了最大负重!除非你丢弃一些物品,否则你不能跑或跑得很快! + + + <t color='#FF0000'><t size='2'>Vehicle Info</t></t><br/><t color='#FFD700'><t size='1.5'>Owners</t></t><br/> %1 + <t color='#FF0000'><t size='2'>Informace o vozidle</t></t><br/><t color='#FFD700'><t size='1.5'>Majitelé</t></t><br/> %1 + <t color='#FF0000'><t size='2'>Info de Vehículo</t></t><br/><t color='#FFD700'><t size='1.5'>Dueños</t></t><br/> %1 + <t color='#FF0000'><t size='2'>Vehicle Info</t></t><br/><t color='#FFD700'><t size='1.5'>Owners</t></t><br/> %1 + <t color='#FF0000'><t size='2'>Fahrzeuginfo</t></t><br/><t color='#FFD700'><t size='1.5'>Besitzer</t></t><br/> %1 + <t color='#FF0000'><t size='2'>Info du véhicule</t></t><br/><t color='#FFD700'><t size='1.5'>Propriétaires</t></t><br/> %1 + <t color='#FF0000'><t size='2'>Vehicle Info</t></t><br/><t color='#FFD700'><t size='1.5'>Owners</t></t><br/> %1 + <t color='#FF0000'><t size='2'>Info do Veículo</t></t><br/><t color='#FFD700'><t size='1.5'>Donos</t></t><br/> %1 + <t color='#FF0000'><t size='2'>Informacja o pojeździe</t></t><br/><t color='#FFD700'><t size='1.5'>Właściciel</t></t><br/> %1 + <t color='#FF0000'><t size='2'>载具信息</t></t><br/><t color='#FFD700'><t size='1.5'>车主</t></t><br/> %1 + + + Cannot search that person. + Nelze vyhledávat tuto osobu. + No puedes buscar a esa persona. + + Diese Person kann nicht durchsucht werden! + Vous ne pouvez pas fouiller cette personne. + Impossibile perquisire quella persona. + Essa pessoa não pode ser revistada. + Nie możesz przeszukać tej osoby + 无法搜查此人。 + + + You couldn't effectively seize any items. Try again. + Dalo by se efektivně využily všech položek. Zkus to znovu. + Vous n'avez pas pu saisir les objets. Réessayez. + No pudistes efectivamente, confiscar algun objeto. Prueba de nuevo. + Impossibile perquisire la persona in maniera esaustiva. Riprova. + Nie można skutecznie wykorzystać żadnych przedmiotów. Spróbuj ponownie. + + Você não pode apreender nenhum item, efetivamente. Tente de novo. + Es konnten nicht alle Gegenstände beschlagnahmt werden. Versuche es noch einmal. + 并非所有物品你都能没收。再试一次。 + + + Repairing %1 + Dalo by se efektivně využily všech položek. Zkus to znovu.... + Reparando %1 + + Wird repariert %1... + Réparation de %1 + Riparando %1 + Reparando %1 + Naprawiam %1 + 修复 %1 + + + You can't do that from inside the vehicle! + Můžete to udělat zevnitř vozu! + Vous ne pouvez pas faire ceci à l'intérieur du véhicule ! + No puedes hacer eso desde adentro del vehículo! + Non si può fare dall'interno del veicolo! + + Du kannst das nicht tun während du in einem Fahrzeug sitzt! + Você não pode fazer isso de dentro do veículo! + Nie możesz tego wykonać z wntrza pojazdu! + 你在载具内不能维修! + + + You have repaired that vehicle. + Jste opravil, že vozidlo. + >Has reparado el vehículo. + + Du hast dieses Fahrzeug repariert. + Vous avez réparé ce véhicule. + Hai riparato il veicolo. + Você reparou esse veículo. + Naprawiłeś pojazd + 你修好了载具。 + + + You have mined %2 %1(s). + Jste shromáždili %2 %1(y). + Vous avez recueilli %2 %1(s). + Has recolectado %2 %1(s). + Hai raccolto %2 unità di %1. + + Du hast %2 %1 abgebaut. + Você colheu %2 %1(s). + Zebrałeś %2 %1 (s). + 你开采了 %2 个 %1。 + + + You have gathered %2 %1(s). + Jste shromáždili %2 %1(y). + Vous avez recueilli %2 %1(s). + Has recolectado %2 %1(s). + Hai raccolto %2 unità di %1. + + Du hast %2 %1 gesammelt. + Você colheu %2 %1(s). + Zebrałeś %2 %1 (s). + 你采集了 %2 个 %1。 + + + You can't gather from inside a car! + Nemůžete sbírat zevnitř vozu! + Vous ne pouvez pas ramasser à l'intérieur d'une voiture ! + No puedes recolectar desde adentro de un vehículo! + Non si può raccogliere da dentro una macchina! + + Wie soll das von hier aus gehen? Du sitzt in einem Fahrzeug! + Você não pode colher de dentro do carro! + Nie możesz zbierać z wnętrza samochodu + 你不能从车里搜集! + + + You are not allowed to loot dead bodies. + Ty jsou není dovoleno kořist mrtvoly. + Vous n'êtes pas autorisé à piller des cadavres. + No puedes buscar cuerpos muertos. + Non è consentito a saccheggiare cadaveri. + + Du darfst keine Leichen durchsuchen! + Você não está liberado para lootiar corpos mortos + Nie możesz przeszukiwać martwych ciał + 你不能抢劫尸体。 + + + You have been frozen by an administrator. + Vy byly zmrazeny správcem. + Vous avez été gelé par un administrateur. + Un admin te ha congelado! + Sei stato congelato da un amministratore. + + Du wurdest von einem Admin eingefroren. + Você foi congelado por um administrador + Zostałeś zamrożony przez administratora + 你被管理员冻结了。 + + + You have teleported to your selected position. + Jste teleported do vašeho zvolené poloze. + Vous avez été téléporté à la position sélectionnée. + Te has teletransportado a la posisción seleccionada. + Ti sei teletrasportaato alla posizione selezionata. + Masz teleportowany do wybranej pozycji. + + Você foi teleportado para a posição que você selecionou + Du hast dich zu deiner gewünschten Position teleportiert. + 你已传送到选择的位置。 + + + You have been unfrozen by an administrator. + Byli jste zmrzlá správcem. + Vous avez été dégelé par un administrateur. + Un admin te ha descongelado! + Sei stato scongelato da un amministratore. + + Ein Admin hat dich wieder aufgetaut. + Você foi descongelado por um administrador + Zostałeś odmrożony przez administratora + 你已被管理员解冻。 + + + No one was selected! + Nikdo byl vybrán! + Personne n'a été sélectionné ! + Nadie fue seleccionado! + Nessuno è stato selezionato! + Nikt nie został wybrany! + Ninguém foi selecionado! + Никто не был выбран! + Niemand wurde ausgewählt! + 没有选中玩家! + + + You didn't select an item you wanted to give. + Nevybrali jste položku, kterou chtěl dát. + Vous n'avez pas sélectionné l'objet que vous vouliez donner. + No ha seleccionado el objeto que quiere dar. + non è stato selezionato un elemento che si voleva dare. + Nie wybrano element, który chciał dać. + Você não selecionou um item que você queria dar. + Вы не выбрали пункт, который вы хотели дать. + Du hast keinen Gegenstand ausgewählt, um diesen weitergeben zu können. + 你没有选择你想给的东西。 + + + You didn't enter an actual number format. + Nezadal jste skutečný formát čísla. + Vous n'avez pas saisi un format de nombre réel. + No ha especificado un formato de número real. + Non hai inserito un formato di numero reale. + Nie wprowadzono rzeczywisty format liczb. + Você não inseriu um formato número real. + Вы не ввели фактический формат числа. + Du hast keine echte Zahl eingegeben. + 你没有输入正确的数字格式。 + + + You need to enter an actual amount you want to give. + Musíte zadat skutečnou částku, kterou chcete dát. + Vous devez entrer un montant réel que vous voulez donner. + Es necesario introducir una cantidad real que se desea dar. + È necessario immettere un importo effettivo si vuole dare. + Musisz podać rzeczywistą kwotę, którą chcesz dać. + É necessário introduzir uma quantidade real que você quer dar. + Вам необходимо ввести фактическую сумму, которую вы хотите дать. + Du musst einen tatsächlichen Wert eingeben, um diesen weitergeben zu können. + 你需要输入你想要给的正确金额。 + + + You need to enter an actual amount you want to remove. + Musíte zadat skutečnou částku, kterou chcete odebrat. + Vous devez entrer un montant réel que vous souhaitez supprimer. + Es necesario introducir una cantidad real que se desea eliminar. + È necessario immettere un importo effettivo che si desidera rimuovere. + Musisz podać rzeczywistą kwotę, którą chcesz usunąć. + É necessário introduzir uma quantidade real que você deseja remover. + Вам необходимо ввести фактическую сумму, которую вы хотите удалить. + Du musst einen tatsächlichen Wert eigeben, um diese löschen zu können. + 你需要输入你想要删除的正确金额。 + + + The selected player is not within range. + Zvolená Hráč není v dosahu. + Le joueur sélectionné est hors de portée. + El jugador seleccionado no está dentro del rango. + Il giocatore selezionato non è nel raggio d'azione. + Wybrany gracz nie jest w zasięgu. + O jogador selecionado não está dentro do alcance. + Выбранный игрок не находится в пределах диапазона. + Der ausgewählte Spieler ist nicht in Reichweite. + 选定的玩家不在有效范围内。 + + + Couldn't give that much of that item, maybe you don't have that amount? + Nemohl dát, že velká část této položky, možná nemáte tuto částku? + Impossible de donner cet objet, peut-être que vous n'en n'avez pas autant ? + No se pudo dar a que gran parte de ese elemento, tal vez usted no tiene esa cantidad? + Impossibile dare quella quantità di oggetti. + nie mógł dać, że wiele z tego elementu, może nie masz tej kwoty? + não poderia dar que muito desse item, talvez você não tem essa quantia? + Не могу дать, что большая часть этого пункта, может быть, у вас нет этой суммы? + Du konntest nicht so eine große Menge von diesem Gegenstand weitergeben. Hast du vielleicht nicht genug davon? + 不能给那么多的东西,也许你没有那么多? + + + You gave %1 %2 %3. + Ty jsi dal %1 %2 %3. + Vous avez donné %1 %2 %3. + Diste %1 %2 %3. + Hai dato %1 %2 %3. + Daliście %1 %2 %3. + você deu %1 %2 %3. + Ты дал %1 %2 %3. + Du hast %1 %2 %3 gegeben. + 你给了 %1 %2 %3。 + + + You don't have that much to give! + Nemusíte to hodně dát! + Vous n'avez pas autant à donner ! + Usted no tiene mucho para dar! + Non hai abbastanza oggetti da dare! + Nie ma tego dużo dać! + Você não tem muito para dar! + Вы не так много, чтобы дать! + Du hast nicht so eine große Menge von diesem Gegenstand! + 你没有这么多去给别人! + + + You gave $%1 to %2. + Dal jsi $%1 do %2. + Vous avez donné $%1 à %2. + Usted le dio $%1 a %2. + Hai dato $%1 a %2. + Dałeś $%1 do %2. + Você deu $%1 para %2. + Вы дали $%1 %2. + Du hast $%1 %2 gegeben. + 你将 $%1 给了 %2。 + + + You recently robbed the bank! You can't give money away just yet. + Nedávno jste vyloupil banku! Nemůžete dávat peníze pryč jen zatím. + Vous avez récemment volé la banque! Vous ne pouvez pas donner de l'argent pour l'instant. + Recientemente has robado el banco! No se puede dar dinero por el momento. + Recentemente hai rapinato la banca! Non puoi ancora depositare i soldi nel tuo conto bancario. + Niedawno obrabował bank! Nie można dać pieniądze w błoto jeszcze. + Recentemente, você roubou o banco! Você não pode dar dinheiro fora ainda. + Вы недавно ограбили банк! Вы не можете отдавать деньги только пока. + Du hast kürzlich die Bank ausgeraubt! Du kannst deswegen kein Geld weitergeben. + 你最近抢劫了银行!你还不能现在把钱给出去。 + + + No data selected. + vybrány žádné údaje. + Aucune donnée sélectionnée. + No hay datos seleccionados. + Non ci sono dati selezionati. + Nie wybrano danych. + Não há dados selecionado. + Нет выбранных данных. + Keine Daten ausgewählt. + 没有选择数据。 + + + You did not select a vehicle. + Nevybrali jste vozidlo. + Vous n'avez pas sélectionné de véhicule. + No ha seleccionado un vehículo. + Non hai selezionato un veicolo. + Nie wybrano pojazdu. + Você não selecionou um veículo. + Вы не выбрали автомобиль. + Du hast kein Fahrzeug ausgewählt. + 你没有选择载具。 + + + You do not own any vehicles. + Nevlastníte žádná vozidla. + Vous ne possédez pas de véhicules. + Usted no posee ningún vehículo. + Non possedete tutti i veicoli. + Nie posiada żadnych pojazdów. + Você não possui quaisquer veículos. + Вы не являетесь владельцем каких-либо транспортных средств. + Du besitzt keine Fahrzeuge. + 你没有任何载具。 + + + You did not select a player. + Nevybrali jste si přehrávač. + Vous n'avez pas sélectionné de joueur. + No ha seleccionado un jugador. + Non hai selezionato un giocatore. + Nie wybrano odtwarzacza. + Você não selecionou um jogador. + Вы не выбрали игрока. + Du hast keinen Spieler ausgewählt. + 你没有选择玩家。 + + + You have given %1 keys to your %2. + Dali jste %1 klíče ke svému %2. + Vous avez donné les clés de votre %2 à %1. + Usted ha dado %1 llaves de su %2. + Hai dato a %1 chiavi della vostra %2. + Dałeś %1 klucze do %2. + Você tem dado %1 chaves de sua %2. + Вы дали %1 ключи от %2. + Du hast %1 die Schlüssel zu deinem %2 gegeben. + 你将 %2 的钥匙给了 %1。 + + + %1 has gave you keys for a %2. + %1 has gave you keys for a %2. + %1 a vous a donné les clés de %2. + %1 has gave you keys for a %2. + %1 has gave you keys for a %2. + %1 has gave you keys for a %2. + %1 has gave you keys for a %2. + %1 has gave you keys for a %2. + %1 hat dir die Schlüssel zum %2 gegeben. + %1 给了你一把 %2 的钥匙。 + + + You cannot remove the keys to your house! + Nemůžete odstranit klíče od domu! + Vous ne pouvez pas supprimer les clés de votre maison ! + No se puede quitar las llaves de su casa! + Non è possibile rimuovere le chiavi a casa tua! + Nie można usunąć klucze do swojego domu! + Você não pode remover as chaves de sua casa! + Вы не можете удалить ключи к вашему дому! + Du kannst die Schlüssel zu diesem Haus nicht wegwerfen! + 你不能丢弃你家的钥匙! + + + You did not select anything to remove. + Nevybrali jste nic odstranit. + Vous avez rien sélectionné à supprimer. + No ha seleccionado nada que quitar. + Non hai selezionato niente da rimuovere. + Nie zrobił nic, aby usunąć wybrać. + Você não selecionou nada para remover. + Вы ничего удалить не выбрать. + Du hast nichts zum Entsorgen ausgewählt. + 你没有选择要删除的任何东西。 + + + Could not remove that much of that item. Maybe you do not have that amount? + Nepodařilo se odstranit, že velká část této položky. Možná, že nemáte tuto částku? + Impossible d'en supprimer autant. Peut-être que vous ne disposez pas de ce montant ? + No se pudo eliminar que gran parte de ese elemento. Tal vez usted no tiene esa cantidad? + Impossibile rimuovere quel quantitativo di oggetti. + Nie można usunąć, że wiele z tego elementu. Może nie masz tej kwoty? + Não foi possível remover que muito desse item. Talvez você não tem essa quantia? + Не удалось удалить, что большая часть этого элемента. Может быть, у вас нет этой суммы? + Du konntest nicht so eine große Menge von diesem Gegenstand entsorgen. Hast du vielleicht nicht so viele davon? + 不能丢弃大部分东西。也许你没有那么多数额? + + + You have successfully removed %1 %2 from your inventory. + Úspěšně jste odstraněny %1 %2 z vašeho inventáře. + Vous avez réussi à retirer %1 %2 de votre inventaire. + Has eliminado correctamente %1 %2 de su inventario. + Hai rimosso con successo %1 %2 dal tuo inventario. + Pomyślnie usunięto %1 %2 z inwentarza. + Você removeu com êxito %1 %2 do seu inventário. + Вы успешно удалены %1 %2 из инвентаря. + Du hast erfolgreich %1 %2 aus deinem Inventar entsorgt. + 你已成功地从库存删除 %1 %2。 + + + Something went wrong; the menu will not open? + Něco se pokazilo; nabídka neotevře? + Quelque chose s'est mal déroulé; le menu ne s'ouvre pas ? + Algo salió mal; el menú no se abre? + Qualcosa è andato storto; il menu non si apre? + Coś poszło nie tak; menu nie otworzy? + Algo deu errado; o menu não vai abrir? + Что-то пошло не так; меню не откроется? + Etwas ist schief gelaufen. Das Menü konnte nicht geöffnet werden. + 出错了;菜单不能打开? + + + Config does not exist? + Config neexistuje? + Config n'existe pas ? + Config no existe? + Config non esiste? + Konfiguracja nie istnieje? + O configuração não existe? + Config не существует? + Einstellung nicht vorhanden? + 配置不存在? + + + You cannot store that in anything but a land vehicle! + Nelze uložit, že v ničem jiném než pozemní vozidla! + Vous pouvez stocker cet objet seulement dans les véhicules terrestres ! + No se puede almacenar en cualquier cosa menos que un vehículo terrestre! + Non è possibile depositare questa risorsa in un veicolo che non sia terrestre! + Nie można zapisać, że w nic poza pojazdem lądowym! + Você não pode armazenar isso em qualquer coisa, mas um veículo de terra! + Вы не можете хранить, что ничего, кроме наземного транспортного средства! + Du kannst das nur in einem Landfahrzeug lagern! + 除了陆地载具,你不能储存它! + + + You don't have that much cash on you to store in the vehicle! + Nemáte tolik peněz na vás uložit do vozidla! + Vous ne disposez pas d'autant d'argent sur vous pour stocker dans le véhicule ! + Usted no tiene esa cantidad de dinero en efectivo para almacenar en el vehículo! + Non hai abbastanza denaro con te da mettere nel veicolo! + Nie ma tego dużo gotówki na ciebie do przechowywania w pojeździe! + Você não tem que muito dinheiro em você para armazenar no veículo! + У вас не так много наличных денег на вас, чтобы хранить в автомобиле! + Du hast nicht genug Geld bei dir, um die eingegeben Menge in das Fahrzeug zu lagern! + 你没有那么多现金可以存放在载具里! + + + The vehicle is either full or cannot hold that much. + Vozidlo je buď plný nebo nemůže myslet si, že mnoho. + Le véhicule est plein ou ne peut pas en contenir autant. + El vehículo está llena o no puede contener tanta. + Il veicolo è pieno o non può tenere quel quantitativo. + Pojazd jest albo w pełnym lub nie można uznać, że dużo. + O veículo está cheio ou não pode segurar muito. + Транспортное средство либо полностью или не может держать так много. + Das Fahrzeug ist entweder voll oder kann nicht so viel halten. + 这载具要么是满的,要么就是装不下那么多。 + + + Couldn't remove the items from your inventory to put in the vehicle. + Vozidlo je buď plný nebo nemůže myslet si, že mnoho. + Le véhicule est déjà plein ou ne peut pas stocker d'avantage d'objets. + El vehículo está llena o no puede contener tanta. + Impossibile rimuovere quel quantitativo di oggetti dal tuo inventario per metterlo nel veicolo. + Pojazd jest albo w pełnym lub nie można uznać, że dużo. + O veículo está cheio ou não pode segurar muito. + Транспортное средство либо полностью или не может держать так много. + Das Fahrzeug ist entweder voll oder hat nicht so viel Platz. + 无法从你的库存中取出物品放入车内。 + + + This is an illegal item and cops are near by. You cannot dispose of the evidence. + To je ilegální položky a policajti jsou v blízkosti. Nemůžete zbavit důkazů. + Ceci est un objet illégal et les policiers sont à proximité. Vous ne pouvez pas le jeter. + Este es un artículo ilegal y policías están cerca. No se puede disponer de las pruebas. + Non puoi liberarti di questo oggetto dato che è una prova evidente. + Jest to nielegalne element i policjanci są w pobliżu. Nie można pozbyć się dowodów. + Este é um item ilegal e policiais estão nas proximidades. Você não pode dispor das provas. + Это незаконный пункт и полицейские находятся поблизости. Вы не можете избавиться от доказательств. + Dies ist ein illegaler Gegenstand und Polizisten sind in der Nähe. Du kannst die Beweise nicht einfach so entsorgen. + 这是非法物品,警察就在附近。你不能把它扔掉。 + + + You cannot remove an item when you are in a vehicle. + Nemůžete-li odebrat položku, když jste ve vozidle. + Vous ne pouvez pas supprimer un objet lorsque vous êtes dans un véhicule. + No se puede eliminar un elemento cuando se está en un vehículo. + Non è possibile rimuovere un elemento quando si è in un veicolo. + Nie można usunąć element, kiedy jesteś w pojeździe. + Você não pode remover um item quando você está em um veículo. + Вы не можете удалить элемент, когда вы находитесь в автомобиле. + Du kannst keinen Gegenstand entsorgen, wenn du in einem Fahrzeug sitzt. + 当你在车内时,无法扔掉物品。 + + + You are now spectating %1.\n\nPress F10 to stop spectating. + Nyní diváck é%1.\n\nStisknutím klávesy F10 k zastavení divácké. + Vous êtes maintenant spectateur %1.\n\nAppuyez sur F10 pour arrêter le mode spectateur. + Ahora está como espectador de %1.\n\nPulse F10 para salir de modo espectador. + Si è ora spectating %1.\n\nPremere F10 per smettere di spettatori. + Grasz teraz spectating %1.\n\nNaciśnij klawisz F10, aby zatrzymać spectating. + Você agora está como espectador %1.\n\nPressione F10 para sair. + Теперь вы spectating %1.\n\nНажмите F10, чтобы остановить spectating. + Du beobachtest nun %1.\n\nDrücke F10, um das Beobachten zu beenden. + 你现在正在观看 %1.\n\n 按F10停止观看. + + + You have stopped spectating. + Přestali jste divácké úlohy. + Vous avez arrêté spectating. + Usted ha dejado de ser espectador. + Hai smesso di spettatori. + Zatrzymaniu widzem. + Você parou espectador. + Вы остановили spectating. + Du hast das Beobachten beendet. + 你已经停止了观看。 + + + You have teleported %1 to your location. + Jste teleported %1 do vaší polohy. + Vous avez téléporté %1 à votre emplacement. + Usted ha teletransportado %1 a su ubicación. + Hai teletrasportato %1 alla vostra posizione. + Masz teleportował %1 na swoim miejscu. + Você teletransportou %1 para a sua localização. + Вы телепортированы %1 к вашему положению. + Du hast %1 zu deiner Position teleportiert. + 传送 %1 到你的位置。 + + + <t color='#ADFF2F'>ATM</t> + <t color='#ADFF2F'>Bankomat</t> + <t color='#ADFF2F'>DAB</t> + <t color='#ADFF2F'>ATM</t> + <t color='#ADFF2F'>ATM</t> + <t color='#ADFF2F'>Bankomat</t> + <t color='#ADFF2F'>Caixa Eletrônico</t> + <t color='#ADFF2F'>Банкомат</t> + <t color='#ADFF2F'>Geldautomat</t> + <t color='#ADFF2F'>自动取款机</t> + + + Capture Gang Hideout + Zachyťte Gang skrýš + Capturer la cachette de gang + Capturar Escondite + Cattura Banda Nascondiglio + Przechwytywanie Banda Kryjówka + Capturar Esconderijo de Gangue + Захват шайка укрытие + Gangversteck einnehmen + 占领帮派藏身处 + + + An empty array was passed to fn_levelCheck.sqf + An empty array was passed to fn_levelCheck.sqf + An empty array was passed to fn_levelCheck.sqf + An empty array was passed to fn_levelCheck.sqf + An empty array was passed to fn_levelCheck.sqf + An empty array was passed to fn_levelCheck.sqf + An empty array was passed to fn_levelCheck.sqf + An empty array was passed to fn_levelCheck.sqf + Ein leeres Feld wurde an fn_levelCheck.sqf übergeben. + 一个空字段传递给fn_levelCheck.sqf + + + + + News Station Broadcast + + Anuncio de la Estación de Noticias + + Nachrichtensender + Annonce d'informations + + Estação de Transmissão de Notícias + + 新闻广播 + + + Channel 7 News Station + + Estación del Canal de Noticias 7 + + Chaine d'infos Numéro 7 + Kanal 7 Nachrichtensender + + Estação de Notícias do Canal 7 + + 7频道新闻台 + + + Message Heading: + + Título del Mensaje + + Titre de l'annonce : + Nachrichtenüberschrift: + + Titulo da Mensagem: + + 消息标题: + + + Message Content: + + Contenido del Anuncio + + Contenu de l'annonce: + Nachrichteninhalt: + + Conteúdo da Mensagem: + + 消息内容: + + + Broadcast Message + + Transmitir Anuncio + + Diffusion de l'annonce + Nachricht übertragen + + Transmitir Anúncio + + 广播消息 + + + Broadcast Cost: %1<br />Next Broadcast Available: %2 + + Costo de Transmisión: %1<br />Siguiente Transmisión Disponible en: %2 + + Übertragungskosten: %1<br />Nächste Übertragung möglich in: %2 + Coût de Transmission : %1<br />Prochaine Transmission Disponible dans : %2. + + Custo de Trasnmissão: %1<br />Próxima transmissão disponível em: %2 + + 广播费用: %1<br />下一个广播可用于: %2 + + + The header cannot be over %1 characters + + El título no puede tener mas de %1 caracteres + + L'en-tête ne peut pas dépasser %1 caractères + Die Überschrift darf nicht über %1 Zeichen lang sein. + + O cabeçalho não pode ter mais que %1 caracteres + + 标题不能超过 %1 个字符 + + + You've entered an unsupported character! + + Has introducido un carácter inválido + + Vous avez entré un caractère non pris en charge ! + Du hast ein nicht ungültiges Zeichen eingegeben! + + Você inseriu um caractere inválido + + 你输入了一个不支持的字符! + + + Now + + Ahora + + Jetzt + Maintenant + + Agora + + 现在 + + + You need $%1 to send a broadcast! + + Necesitas %1 para transmitir un anuncio! + + Vous avez besoin de $%1 pour envoyer une diffusion ! + Du benötigst $%1, eine Nachricht senden zu können! + + Você precisa de $%1 para enviar uma transmissão! + + 你需要支付 $%1 才能发送广播! + + + <t size='2'>%1</t><br />Broadcasted by: %2 + + <t size='2'>%1</t><br />Transmitido por: %2 + + <t size='2'>%1</t><br />Diffusé par : %2 + <t size='2'>%1</t><br />Gesendet von: %2 + + <t size='2'>%1</t><br />Transmitido por: %2 + + <t size='2'>%1</t><br />广播发送者: %2 + + + + + You have been arrested, wait your time out. If you attempt to respawn or reconnect your time will increase! + Jste byli zatčeni, počkejte si na čas ven. Pokud se pokusíte respawn nebo připojit váš čas zvýší! + Te han arrestado. Si tratas de matarte o te desconectas se incrementara tu estadía en la cárcel! + + Du wurdest verhaftet. Sitze deine Zeit ab. Wenn du versuchst neu aufzuwachen oder die Verbindung zu trennen, verlängert sich deine Zeit! + Vous avez été arrêté, attendez que votre peine soit terminée. Si vous tentez de respawn ou reconnectez, le temps sera augmenté ! + Sei stato arrestato, sconta la tua pena. Se cercherai di rinascere o di riconnetterti il tuo tempo aumenterà! + Você foi preso, cumpra sua pena. Se você tentar renascer ou reconectar seu tempo na cadeia irá aumentar! + Zostałeś aresztowany, poczekaj na koniec kary. Jeśli się rozłączysz albo odrodzisz twoja kara zostanie powiększona + 你被捕了,耐心坐牢吧。如果你试图重生或重新连接坐牢时间会增加! + + + For being arrested you have lost the following licenses if you own them\n\nFirearms License\nRebel License + Za byl zatčen jste ztratili tyto licence, pokud je vlastní \ žádný zbrojní pas \ jRebel licence + Por ser arrestado se te han quitado estas licencias (si las tienes)\n\nL. de Armas \nL. Rebelde + + Bei der Verhaftung hast du folgende Lizenzen verloren, sofern du sie besessen hast:\n\nWaffenschein\nRebellenausbildung. + Après emprisonnement, vous avez perdu les licences suivantes si vous les aviez\n\nPermis de port d'arme\n LicenceRebelle + A causa del tuo arresto hai perso le seguenti licenze, se le possedevi\n\nPorto d'armi\nLicenza Ribelle + Você perdeu as seguintes licenças por ter sido preso\n\nPorte de Armas\n\nTreinamento Rebelde + Z uwagi na aresztowanie straciłeś następujące licencje jeśli je posiadałeś \n\nPozwolenie na broń \nTrening Rebelianta + 你如果被捕了,会失去\n\n枪支许可证\n叛军许可证 + + + %1 has escaped from jail! + %1 utekl z vězení! + %1 se ha escapado de la cárcel! + + %1 ist aus dem Gefängnis ausgebrochen! + %1 s'est échappé de prison ! + %1 è scappato dalla prigione! + %1 escapou da prisão + %1 uciekł z więzienia! + %1 越狱了! + + + You have escaped from jail, you still retain your previous crimes and now have a count of escaping jail. + Jste utekl z vězení, si stále zachovávají své předchozí zločiny a nyní mají počet uniknout vězení. + Te has escapado de la cárcel, retienes tus crimenes anteriores más un crimen de escapado de la cárcel. + + Vous vous êtes échappé de prison, vous conserver toujours vos crimes précédents et les autorités sont au courant de votre évasion. + Du bist aus dem Gefängnis ausgebrochen! Die Polizei sucht jetzt nach dir, wegen deiner früheren Verbrechen und dem Gefängnisausbruch. + Sei scappato di prigione, rimarrai ricercato per i crimini da te commessi in precedenza e in aggiunta per essere scappato di prigione. + Você escapou da prisão, agora você é procurado por esse crime e todos os outros que havia cometido anteriormente + Uciekłeś z więzienia, dalej jesteś ścigany za poprzednie przestępstwa i dodatkowo za ucieczkę. + 你已经从监狱逃跑了,你仍然保留着你以前的罪行,现在算是越狱。 + + + You have served your time in jail and have been released. + Sloužil jste svůj čas ve vězení a byli propuštěni. + Has pasado el tiempo en la cárcel y has sido liberado. + + Du hast deine Zeit im Gefängnis abgesessen. + Vous avez purgé votre peine, vous êtes désormais libre. + Hai scontato la tua pena in prigione e sei stato rilasciato. + Você pagou pelo seus crimes e foi libertado. + Odbyłeś swoją karę zostałeś zwolniony z więzienia. + 你已经在监狱服完刑,并被释放。 + + + Time Remaining: + Zbývající čas: + Tiempo Restante: + + Verbleibende Zeit: + Temps restant : + Tempo rimanente: + Tempo Restante: + Pozostały czas kary: + 剩余时间: + + + Can pay bail: + Může zaplatit kauci: + Puedes pagar la fianza en: + + Kann Kaution zahlen: + Peut payer la caution : + Puoi pagare la cauzione: + Pode pagar fiança: + Możesz wpłacić kaucję + 可以支付保释金: + + + Bail Price: + Bail Cena: + Precio de Fianza: + + Kaution: + Prix de la caution : + Costo cauzione: + Preço da fiança: + Wartość kaucji: + 保释金额: + + + You have paid your bail and are now free. + Jste zaplatili kauci a nyní jsou zdarma. + Has pagado tu fianza y has sido liberado. + + Du hast deine Kaution bezahlt und bist nun frei. + Vous avez payé votre caution, vous êtes désormais libre. + Hai pagato la cauzione e sei libero. + Você pagou a fiança e agora está livre. + Zapłaciłeś kaucję jesteś wolny. + 你已经支付了保释金,现在自由了. + + + + + %1 has knocked you out. + %1 zaklepal vás. + %1 te a noqueado. + + %1 hat dich niedergeschlagen. + %1 vous a assommé. + %1 ti ha colpito stordendoti. + %1 nocauteou você. + zostałeś ogłuszony przez %1 + %1 把你击倒了。 + + + You have lost all your motor vehicle licenses for vehicular manslaughter. + Jste ztratili všechny své licence motorových vozidel pro dopravní zabití. + Has perdido todas tus licencias de vehículos de motor por homicidio vehicular. + + Du hast alle deine Führerscheine durch fahrlässige Tötung mit einem Fahrzeug verloren. + Vous avez perdu tous vos permis véhicule pour avoir écrasé quelqu'un. + Hai perso tutte le tue licenze di guida a causa di un omicidio stradale. + Você não perdeu suas licenças de motorista por atropelamento. + Straciłeś wszystkie uprawnienia na pojazdy z uwagi na ciągłe zabijanie ludzi pojazdami. + 你因载具过失杀人被吊销了所有机动载具驾驶许可证。 + + + You have lost your firearms license for manslaughter. + Jste ztratili zbrojního průkazu za zabití. + Has perdido tu licencia de armas por homicidio. + + Du hast deinen Waffenschein wegen Mordes verloren. + Vous avez perdu votre permis d'armes à feu pour homicide involontaire. + Hai perso il tuo Porto d'Armi a causa di un omicidio + Você perdeu suas licenças de porte de arma por cometer homicídio. + Straciłeś pozwolenie na broń z uwagi na zabijanie ludzi z broni palnej + 你因过失杀人而丧失了枪支许可证。 + + + They didn't have any cash... + Oni neměli žádnou hotovost ... + No tenian dinero... + + Er hatte kein Geld... + Il n'a pas d'argent... + Non hai soldi... + Eles não tinham nenhum dinheiro.. + Nie posiadają żadnych pieniędzy ... + 他们没有现金... + + + You stole $%1 + Ukradl jsi $%1 + Robastes $%1 + + Du hast $%1 geraubt. + Vous avez volé $%1 + Hai rubato $%1 + Você roubou R$%1 + Ukradłeś %1 + 你偷了 $%1 + + + The safe is empty! + Bezpečné je prázdný! + La caja esta vacía! + + Der Tresor ist leer! + Le coffre est vide ! + La cassaforte è vuota! + O Cofre está vazio! + Sejf jest pusty! + 保险箱是空的! + + + Someone is already accessing the safe.. + Někdo je již přístup k bezpečné .. + Alguien ya esta entrando en la caja.. + + Jemand greift bereits auf diesen Tresor zu. + Quelqu'un accède déjà au coffre... + Qualcuno sta già interagendo con la cassaforte.. + Alguem já está acessando o cofre. + Ktoś właśnie włamuje się do sejfu! + 有人已经进入保险箱了。 + + + There needs to be %1 or more cops online to continue. + Musí existovat%1 nebo více policajtů on-line pokračovat. + Necesita haber %1 o mas policías para continuar. + + Es müssen %1 oder mehr Polizisten online sein, um fortfahren zu können. + Il faut au minimum %1 policiers pour continuer. + Servono almeno %1 poliziotti online per continuare. + É necessário ter %1 ou mais policiais online para continuar. + Potrzeba conajmniej %1 policjantów aby kontynuować + 需要有 %1 或更多的警察才能继续。 + + + Safe Inventory + Safe Inventory + Inventario de la Caja + + Tresorinventar + Coffre + Inventario cassaforte + Cofre + Wyposażenie sejfu + 保险箱库存 + + + You need to select an item! + Je třeba vybrat položku! + Debes selecionar un objeto! + + Du musst einen Gegenstand auswählen! + Vous devez sélectionner un objet ! + Devi selezionare un oggetto! + Você precisa selecionar um item! + Musisz coś wybrać + 您需要选择一个物品! + + + There isn't %1 gold bar(s) in the safe! + Není %1 zlatá bar (y) v bezpečí! + No hay %1 barra(s) de oro en la caja! + + Es sind keine %1 Goldbarren im Tresor! + Il n'y a pas %1 lingot(s) d'or dans le coffre ! + Nella cassaforte non ci sono %1 lingotti d'oro + Não existe %1 barra(s) de ouro no cofre! + W sejfie nie ma % sztab złota! + 金库里没有 %1 金条! + + + + + Couldn't open the ticketing interface + Nemohl otevřít jízdenek rozhraní + No se pudo abrir el menu de tiquetes! + + Der Bußgeldkatalog konnte nicht geöffnet werden! + Impossible d'ouvrir l'interface des amendes + Impossibile aprire l'interfaccia per le multe + Não foi possível abrir o bloco de multa + Nie potrafię otworzyć interfejsu mandatów + 无法打开罚款界面 + + + Ticketing %1 + Jízdenek%1 + Dando Tiquete a %1 + + Verrechne %1 + Verbalisation de %1 + Multando %1 + Multando %1 + Mandat dla %1 + 开据罚单给 %1 + + + %2 got back a blacklisted vehicle near %1. + %2 dostat zpět na černou listinu vozidlo nedaleko %1. + %2 a récupéré un véhicule blacklisté près de %1. + %2 volver un vehículo en la lista negra cerca de %1. + %2 ha ritirato un veicolo blacklistato vicino %1. + %2 wrócić do czarnej listy pojazd pobliżu %1. + %2 retirou um veículo que se encontra na lista negra, perto de %1. + %2 получить обратно в черный список автомобиль возле %1. + %2 hat ein gesuchtes Fahrzeug nahe %1 ausgeparkt. + %2 在 %1 附近找回了被列入黑名单的载具。 + + + Person to ticket is nil + Osoba, která má lístku je nulová + La persona a quien tiquetear es nulo + + Die Person, für das das Ticket vorgesehen war, ist verschwunden. + La personne à verbaliser n'existe pas. + La persona da multare è nil + Jogador a ser multado é nulo + Osoba do ukarania mandatem to "nil" + 被罚款的玩家为“无” + + + Person to ticket doesn't exist. + Osoba, která má letenku neexistuje. + La perosna a quien tiquetear no existe. + + Die Person, für das Ticket, gibt es nicht. + La personne à verbaliser est inexistante. + La persona da multare non esiste. + Jogador a ser multado não existe. + Nie ma osoby ukaranej mandatem - nie istnieje + 被罚款的玩家不存在。 + + + You didn't enter actual number. + Jste nezadali skutečný počet. + No escribistes un numero real. + + Du hast keine echte Zahl eingegeben. + Vous n'avez pas saisi de nombre. + Non hai inserito un numero correttamente. + Você não digitou um número válido + Wybrałeś zły numer + 你没有输入正确的数字. + + + Tickets can not be more than $200,000! + Vstupenky nemůže být více než 200.000 $! + Los tiquetes no pueden ser mas de $200,000! + + Strafzettel können nicht mehr als $200.000 betragen! + Les amendes ne peuvent pas dépasser plus de $200,000 ! + La multa non può essere più di $200.000! + A multa não pode ser maior que R$200.000! + Mandat nie może być wyższy niż $200.000! + 罚单不能超过 $200,000! + + + %1 gave a ticket of $%2 to %3 + %1 dal lístek na $% %2 3 + %1 le dio un tiquete de $%2 a %3 + + %1 hat %3 einen Strafzettel über $%2 ausgestellt. + %1 a mis une contravention de $%2 à %3. + %1 ha dato una multa di $%2 a %3 + %1 deu uma multa de R$%2 para %3 + %1 Wystawił mandat w wysokości %2 dla %3 + %1 开据金额 $%2 的罚单给 %3 + + + You don't have enough money in your bank account or on you to pay the ticket. + Nemáte dostatek peněz na váš bankovní účet, nebo na vás zaplatit letenku. + No tienes suficiente dinero para pagar el tiquete. + + Du hast nicht genug Geld auf deinem Bankkonto, um den Strafzettel bezahlen zu können. + Vous n'avez pas assez d'argent dans votre compte en banque ou sur vous pour payer l'amende. + Non hai fondi sufficienti nel tuo conto in banca per pagare la multa. + Você não possui dinheiro suficiente na sua conta bancária ou na sua mão para pagar o bilhete. + Nie masz środków na koncie aby zapłacić mandat. + 你的银行帐户中没有足够的钱来支付罚金。 + + + %1 couldn't pay the ticket due to not having enough money. + %1 nemohl zaplatit letenku z důvodu nemají dostatek peněz. + %1 No puedo pagar el tiquete porque no tiene suficiente dinero. + + %1 konnte den Strafzettel nicht bezahlen, weil er nicht genug Geld hat. + %1 ne pouvait pas payer la contravention car il n'avait pas assez d'argent. + %1 non può pagare la multa perchè non ha sufficienti fondi nel suo conto in banca. + %1 não pode pagar a multa pois não tem dinheiro suficiente. + %1 nie może zapłacić mandatu bo nie ma tylu środków na koncie + %1 由于没有足够的钱,无法支付罚金。 + + + You have paid the ticket of $%1 + Jste zaplatili letenku ve výši $%1 + Has pagado el tiquete de $%1 + + Du hast den Strafzettel von $%1 bezahlt. + Vous avez payé l'amende de $%1 + Hai pagato la multa di $%1 + Você pagou a multa de R$%1 + Zapłaciłeś mandat w wysokości $%1 + 你已经支付了 $%1 的罚金 + + + %1 paid the ticket of $%2 + %1 zaplatil letenku ve výši $ %2 + %1 a pagado el tiquete de $%2 + + %1 zahlte einen Strafzettel von $%2. + %1 payé la contravention de $%2 + %1 ha pagato la multa di $%2 + %1 pagou a multa de R$%2 + %1 zapłacił mandat w wyskości $%2 + %1 支付了 $%2 的罚金 + + + %1 paid the ticket. + %1 zaplatil jízdenku. + %1 pago el tiquete. + + %1 hat den Strafzettel bezahlt. + %1 payé la contravention. + %1 ha pagato la multa. + %1 pagou a multa. + %1 zapłacił mandat. + %1 支付了罚金。 + + + %1 has given you a ticket for $%2 + %1 vám dal lístek za $ %2 + %1 te ha dado un tiquete de $%2 + + %1 hat dir einen Strafzettel über $%2 gegeben. + %1 vous a donné une amende de $%2 + %1 ti ha dato una multa di $%2 + %1 lhe aplicou uma multa de R$%2 + %1 dał ci mandat w wysokości $%2 + %1 给你开了一张 $%2 的罚单 + + + %1 refused to pay the ticket. + %1 odmítl zaplatit letenku. + >%1 no aceptó pagar el tiquete. + + %1 weigert sich, den Strafzettel zu bezahlen. + %1 a refusé de payer l'amende. + %1 si è rifiutato di pagare la multa. + %1 se recusou a pagar a multa. + %1 odmówił zapłaty mandatu. + %1 拒绝支付罚金。 + + + You have collected a bounty of $%1 for arresting a criminal. + Nasbíráte kvantum $%1 pro aretaci zločince. + Has recolectado la recompensa de $%1 por arrestar a un criminal. + + Du hast ein Prämie von $%1 für die Festnahme eines Verbrechers bekommen. + Vous avez reçu une prime de $%1 pour avoir arrêté un criminel. + Hai ricevuto il pagamento di una taglia di $%1 per aver arrestato un criminale ricercato. + Você ganhou uma recompensa de R$%1 por prender um criminoso. + Otrzymujesz nagrodę w wysokości $%1 za aresztowanie poszukiwanego kryminalisty. + 你捉拿罪犯获得 %1 赏金。 + + + You have collected a bounty of $%1 for killing a wanted criminal, if you had arrested him you would of received $%2. + Nasbíráte kvantum $%1 za zabití hledaného zločince, pokud jste ho zatkli byste přijímaného $%2. + Has recolectado la recompensa de $%1 por matar a un criminal, si lo hubieras arrestado hubieses conseguido $%2. + + Du hast ein Prämie von $%1 für das Töten eines gesuchten Verbrechers erhalten, für seine Festnahme hättest du $%2 bekommen. + Vous avez reçu une prime de $%1 pour le meurtre d'un criminel recherché, si vous l'aviez arrêté, vous auriez reçu $%2. + Hai ricevuto il pagamento di una taglia di $%1 per aver ucciso un criminale ricercato, se lo avessi arrestato avresti ricevuto $%2. + Você ganhou uma recompensa de $%1 por matar um criminoso procurado, se você tivesse o prendido ganharia R$%2. + Otrzymujesz nagrodę w wysokości $%1 za zabicie poszukiwanego kryminalisty, w przypadku gdybyś go aresztował otrzymałbyć $%2. + 你杀害被通缉的罪犯获得 %1 赏金,如果你逮捕了他,你就会获得 $%2 赏金。 + + + %1 has $%2 worth of contraband on them. + %1 má $%2 v hodnotě kontrabandu na nich. + %1 tiene $%2 en contrabando con el. + + %1 hatte Schmuggelware im Wert von $%2 bei sich. + %1 a $%2 de contrebande sur lui. + %1 ha $%2 in materiali illegali con se. + %1 tem R$%1 em contrabando. + %1 miał przy sobie kontrabandę o wartości $%2. + %1 有价值 $%2 的非法物品。 + + + Illegal Items + nelegální položky + Objetos Ilegales + + Illegale Gegenstände + Objets illégaux + Oggetti Illegali + Items Ilegais + Nielegalne przedmioty / kontrabanda + 非法物品 + + + %1 was identified as the bank robber! + %1 byl identifikován jako bankovního lupiče! + %1 fue identificado como el ladrón del banco! + + %1 wurde als Bankräuber identifiziert! + %1 a été identifié comme un braqueur de banque ! + %1 è stato identificato come il rapinatore della banca! + %1 foi identificado como ladrão de banco! + %1 zidentyfikowany jako kasairz rabujący banki! + %1 被认定为银行抢劫犯! + + + No illegal items + Žádné ilegální položek + No objetos ilegales + + Keine illegalen Gegenstände. + Aucun objet illégal + Nessun oggetto illegale + Sem items ilegais + Brak kontrabandy i nielegalnych przedmiotów + 没有非法物品 + + + You are not near a door! + Nejste u dveří! + No estas cerca de una puerta! + + Du bist nicht in der Nähe einer Tür! + Vous n'êtes pas près d'une porte ! + Non sei vicno ad una porta! + Você não está perto de uma porta! + Nie jesteś przy drzwiach + 你不在门附近! + + + You need to enable Picture in Picture (PiP) through your video settings to use this! + Je nutné povolit obraz v obraze (PIP) pomocí nastavení videa použít tento! + Debes habilitar la opcion de "Picture in Picture"(PiP) En tus opciones de video para usar esto! + + Du musst "Bild in Bild" (PiP) in deinen Video-Einstellungen aktivieren, um dies nutzen zu können! + Vous devez activer le "Picture in Picture" (PiP) dans vos paramètres vidéo pour utilser ceci ! + Devi attivare Picture in Picture (PiP) nelle tue impostazioni video per usare questa funzione! + Você precisa habilitar o Picture in Picture (PiP), através das suas configurações de vídeo para usar esta opção! + Musisz włączyć Obraz w obrazie (PiP) w ustawieniach graficznych aby tego używać! + 您需要通过视频设置启用画中画(PiP)才能使用此功能! + + + Licenses: + licencí + Licencias: + + Lizenzen: + Licences : + Licenze: + Licenças: + Licencje: + 许可证: + + + No Licenses + žádné licence + No Licencias + + Keine Lizenzen! + Aucune licence + Nessuna Licenza + Sem Licenças + Brak licencji + 没有许可证 + + + Nothing illegal in this vehicle + Nic nezákonného v tomto vozidle + Nada ilegal en este vehículo + + Nichts Illegales in diesem Fahrzeug. + Rien d'illégal dans ce véhicule + Niente di illegale nel veicolo + Nada ilegal dentro do veículo + Nie znaleziono niczego nielegalnego w pojeździe + 这载具没有非法物品 + + + Nothing illegal in this container. + Nic nezákonného v tomto kontejneru + Nada ilegal en este contenedor + Nulla di illegale in questo contenitore + Nic nielegalnego w tym pojemniku. + + Nada ilegal dentro do container + Rien d'illégal dans ce conteneur + Nichts Illegales in diesem Container. + 这个库存没有非法物品。 + + + This vehicle is empty + Toto vozidlo je prázdná + Este vehículo esta limpio + + Dieses Fahrzeug ist leer. + Ce véhicule est vide + Questo veicolo è vuoto + Esse veículo está vazio + Pojazd jest pusty + 这载具是空的 + + + This container is empty + Tento zásobník je prázdný + Ce conteneur est vide + Este contenedor esta vacío + Questo contenitore è vuoto + Ten pojemnik jest pusty + Este recipiente está vazio + Этот контейнер пуст + Dieser Container ist leer. + 这个库存是空的 + + + $%1 from the Federal Reserve robbery was returned from the robber being killed. + $%1 z Federálního rezervního systému loupeže byla vrácena ze lupič byl zabit. + $%1 de la Reserva Federal fue devuelto, ya que mataron al ladrón. + + $%1 wurden in die Zentralbank zurückgebracht, weil der Bankräuber gestorben ist. + $%1 du vol de la Banque Fédérale ont été récupérés sur le braqueur, qui vient d'être tué. + $%1 della rapina alla Riserva Federale sono stati recuperati dal rapinatore ucciso. + R$%1 que foi roubado da Reserva Federal retornou a ela após a morte do ladrão. + $%1 z kradzieży w Banku zostało zwrócone po zabiciu włamywacza. + 由于抢劫犯被杀死,联邦储备被抢的 $%1 被归还。 + + + Repairing vault... + Oprava klenby ... + Reparando bóveda... + + Tresor wird repariert... + Réparation du coffre... + Riparando il Caveau + Reparando Cofre... + Naprawiam skarbiec... + 修理金库... + + + The vault is now fixed and re-secured. + Klenba je nyní pevně stanovena a re-zabezpečeny. + La bóveda esta reparada y segura. + + Der Tresor wurde repariert. + Le coffre est de nouveau sécurisé. + Il Caveau è stato riparato e messo in sicurezza. + O Cofre foi consertado e está seguro. + Skarbiec jest naprawiony i zabezpieczony. + 金库现在已修复并重新加固。 + + + The vault is already locked? + Klenba je již uzamčen? + La bóveda ya esta cerrada? + + Ist der Tresor abgeschlossen? + Le coffre est déjà fermé? + Il Caveau è già bloccato? + O Cofre está trancado? + Skarbiec jest zablokowany? + 金库已经锁好了? + + + You can't enter anything below 1! + Nemůžete nic zadávat menší než 1! + No puede poner nada menor que 1! + + Du kannst nichts unter 1 eingeben! + Vous ne pouvez pas prendre moins de 1 objet ! + Non puoi selezionare nulla sotto l'1! + Não é permitido usar valores abaixo de 1! + Nie możesz wprowadzić niczego poniżej 1! + 你不能输入少于1的任何物品! + + + You can't store anything but gold bars in the safe. + Nemůžete ukládat nic jiného než zlaté pruty v trezoru. + Solo puedes guardar barras de oro en la bóveda. + + Du kannst nur Goldbarren in den Tresor legen. + Vous ne pouvez rien stocker à part des lingots d'or dans le coffre. + Nella cassaforte puoi depositare solo lingotti d'oro. + Você só pode guardar Barras de Ouro no cofre. + Nie możesz składować niczego poza sztabami złota w sejfie. + 保险箱除了金条外,你不能存放其它物品。 + + + You don't have %1 gold bar(s) + Nemáte%1 zlatá tyč (y) + No tienes %1 barra(s) de oro + + Du hast keine %1 Goldbarren! + Vous n'avez pas %1 lingot(s) d'or + Non hai %1 lingotti d'oro + Você não tem %1 Barra(s) de Ouro + Nie masz %1 sztab(y) złota + 你没有 %1 根金条 + + + Couldn't remove the item(s) from your inventory to put in the safe. + Nepodařilo se odstranit položky) z inventáře dát do trezoru. + No se pudieron mover las objetos de tu inventario a la caja. + + Es konnten keine Gegenstände von deinem Inventar in den Tresor gelegt werden. + Vous ne pouvez pas supprimer les items de votre inventaire pour les mettre dans le coffre. + Non è stato possibile rimuovere gli oggetti dal tuo inventario per metterli nella cassaforte. + Não foi possível mover o item do inventário para o cofre. + Nie można usunąć rzeczy z twojego wyposażenia aby włożyć je do sejfu + 无法从你的库存中取出物品放在保险箱里。 + + + Couldn't search %1 + Nemohl hledání%1 + No se pudo buscar a %1 + + %1 konnte nicht durchsucht werden. + Impossible de fouiller %1 + Impossibile ispezionare %1 + Não foi possível buscar por %1 + Nie można przeszukać %1 + 无法搜索 %1 + + + Repairing Door... + Oprava dveří ... + Reparando Puerta... + + Tür wird repariert... + Réparation de la porte... + Riparando la porta... + Reparando a porta.... + Naprawiam drzwi... + 修理门... + + + No Licenses<br/> + Žádné Licence < br / > + No Licencias<br/> + + Keine Lizenzen!<br/> + Aucune licence<br/> + Nessuna Licenza<br/> + Você não tem licença<br/> + Brak licencji<br/> + 没有许可证<br/> + + + No one has sold to this dealer recently. + Nikdo se prodalo tohoto prodejce nedávno. + Nadie le ha vendido a este comerciante recientemente. + + Niemand hat kürzlich an diesem Dealer etwas verkauft. + Personne n'est venu vendre quelque chose ici récemment. + Non è stato visto nessuno vendere a questo spacciatore di recente. + Ninguém vendeu para esse negociante recentemente + Nikt nie sprzedawał ostatnio u dilera. + 最近没有人出售物品给这个经销商。 + + + The following people have been selling to this dealer recently. + Následující lidé byli prodeji tohoto prodejce nedávno. + Las siguientes personas le han estado vendiendo a este comerciante recientemente. + + Folgende Personen haben kürzlich an diesem Dealer etwas verkauft: + Les personnes suivantes sont venues vendre quelque chose récemment. + Le seguenti persone sono state viste vendere a questo spacciatore. + Os seguintes jogadores venderam para esse negociante recentemente. + Ostatnio u dilera sprzedawali następujący ludzie. + 以下人员最近一直在向这个经销商销售物品。 + + + Radar + Radar + Radar + + Radar + Radar + Autovelox + Radar + Radar + 测速雷达 + + + Vehicle Speed %1 km/h + Rychlost vozidla%1 km / h + Velocidad %1 km/h + + Geschwindigkeit: %1 km/h! + Vitesse du véhicule %1 km/h + Velocità veicolo %1 km/h + Velocidade do Veículo %1 km/h + Prędkość pojazdu %1 km/h + 载具速度 %1 km/h + + + You have been released automatically for excessive restrainment time + Byli jste automaticky uvolněn pro nadměrnou restrainment čas + Has sido liberado automáticamente por tiempo excesivo de estar retenido. + + Du wurdest automatisch freigelassen, da die maximale Verhaftungszeit überschritten wurde. + Vous avez été démenotté automatiquement pour un menottage excessivement long + Sei stato automaticamente liberato per essere rimasto ammanettato troppo tempo + Você foi solto automaticamente, devido ao tempo limite ter expirado. + Zostałeś automatycznie rozkuty z uwagi na długi upływ czasu od skucia. + 由于约束时间过长你已经被自动释放 + + + You have been restrained by %1 + Byli jste omezeni%1 + Has sido retenido por %1 + + Du wurdest von %1 festgenommen. + Vous avez été menotté par %1 + %1 ti ha messo le manette + Você foi imobilizado por %1 + Zostałeś rozkuty przez %1 + 你被 %1 约束了 + + + Who do you think you are? + Kdo si myslíš že jsi? + Qui pensez-vous être? + ¿Quién te crees que eres? + Chi ti credi di essere? + Za kogo Ty się masz? + Quem você pensa que é? + Кто ты, по-твоему, такой? + Was glaubst du wer du bist? + 你以为你是谁? + + + You must select a perp. + Je třeba vybrat pachatele. + Vous devez sélectionner une personne. + Debe seleccionar un asesino. + È necessario selezionare un criminale. + Musisz wybrać perp. + Você deve selecionar um criminoso. + Вы должны выбрать преступника. + Du musst einen Verbrecher auswählen. + 你必须选择一个罪犯。 + + + You must select a crime. + Je třeba vybrat trestného činu. + Vous devez sélectionner un crime. + Debe seleccionar un crimen. + È necessario selezionare un crimine. + Musisz wybrać przestępstwa. + Você deve selecionar um crime. + Вы должны выбрать преступление. + Du musst ein Verbrechen auswählen. + 你必须选择一种犯罪行为。 + + + Failed to fetch crimes. + Nepodařilo se načíst trestných činů. + Impossible de récupérer les crimes. + No se pudieron obtener los crímenes. + Impossibile recuperare i crimini. + Nie udało się pobrać przestępstw. + Falha ao buscar crimes. + Не удалось получить преступления. + Die Verbrechen konnten nicht heruntergeladen werden. + 无法搜索犯罪记录。 + + + + + You tried to give %1 %2 %3 but they couldn't hold that so it was returned. + Pokusili jste se dát% %1 %2 3, ale nemohli si myslí, že tak to bylo se vrátil. + Le tratastes de dar %1 %2 %3 pero no tenian espacio asi que se te devolvió. + + Du wolltest %1 %2 %3 geben, aber er hat keinen Platz in seinem Inventar und hat es darum zurückgegeben. + Vous avez essayé de donner %1 %2 %3 mais il n'a pas assez de place et vous a tout redonné. + Hai provato a dare a %1 %2 unità di %3 ma non poteva trasportarlo quindi ti sono state restituite restituite. + Você tentou dar %1 %2 %3, mas não conseguiu segurar e por isso que foi devolvido. + Próbowałeś dać %1 %2 %3 lecz gracz nie mógł tego unieść, przedmioty zostały zwrócone. + 你试着给 %1 %2 %3 但他们不能持有,所以物品被归还。 + + + %1 returned %2 %3 because they couldn't hold that amount. + %1 vrátila% %2 3, protože oni nemohli držet tuto částku. + %1 devolvió %2 %3 porque no tenian espacio. + + %1 hat %2 %3 zurückgegeben, weil er nicht so viel tragen kann. + %1 vous a redonné %2 %3 parce qu'il ne pouvait pas en prendre autant. + %1 ha restituito %2 %3 perchè non poteva trasportare quella quantità + %1 retornou %2 %3 porque não conseguiu segurar essa quantidade. + %1 zwrócił %2 %3 ponieważ nie mógł tego unieść + %1 返还 %2 %3 因为他们拿不出这笔钱。 + + + %1 has gave you %2 but you can only hold %3 so %4 was returned back. + %1 vám již dal%2, ale můžete mít pouze% %3 4 tak byla vrácena zpět. + %1 te a dado %2, pero solo puedes cargar %3 asi que %4 fue devuelto. + + %1 hat dir %2 gegeben, du kannst aber nur %3 tragen, also hast du %4 zurückgegeben. + %1 vous a donné %2 mais vous ne pouvez en prendre que %3 donc %4 a été redonné. + %1 ti ha dato %2 ma puoi portare solo %3 quindi %4 unità sono state restituite. + %1 retornou %2 %3 porque não conseguiu segurar essa quantidade. + %1 dał ci %2 lecz możesz unieść tylko %3, w związku z tym zwróciłeś %4. + %1 已经给了你 %2 但你只能持有 %3 所以 %4 被退回. + + + Do you want to add this item to your weapon or inventory? If you add it to your weapon your current existing attachment will be lost! + Chcete přidat tuto položku do zbraně nebo inventáře? Pokud si jej přidat do svého zbraň váš současný stávající příloha bude ztraceno! + Quieres agregar este Objeto/Arma a tu inventario? Si lo agregas a tu arma tu accesorio actual se perdera! + + Möchtest du den Aufsatz zu deiner Waffe oder deinem Inventar hinzufügen? Wenn du es zur Waffe hinzufügst, geht der vorhandene Aufsatz verloren! + Voulez-vous ajouter cet objet à votre arme ou le mettre dans votre inventaire? Si vous l'ajoutez à votre arme, votre accessoire actuel sera perdu! + Vuoi aggiungere questo oggetto alla tua arma o all'inventario? Se lo aggiungerai all'arma verrà rimosso l'eventuale accessorio già presente su di essa! + Você quer adicionar este item à sua arma ou inventário? Se você adicioná-lo à sua arma seu item atual existente será perdida! + Chcesz dodać tę rzecz do broni lub wyposażenia? Jeśli to zrobisz twoje aktualne wyposażenie broni zostanie zmienione na nowo zakupione i przepadnie! + 你想把这个物品添加到你的武器或库存中吗?如果你把它添加到你的武器,你当前的现有附件将会丢失! + + + Attachment slot taken! + Attachment slot vzít! + Slot de accesorio tomado! + + Aufsatz Platz belegt! + Accessoire déjà présent! + Slot Accessorio preso! + Slot de acessório utilizado! + Podjąłeś slot + 附件插槽! + + + Weapon + Zbraň + Arma + + Waffe + Armes + Arma + Armas + Broń + 武器 + + + Inventory + Inventář + Inventario + + Inventar + Inventaire + Inventario + Inventário + Wyposażenie + 库存 + + + You are not allowed to look into someone's backpack! + Nejste dovoleno dívat se do něčí batohu! + No tienes permiso de ver dentro de las mochilas de los demas! + + Du bist nicht berechtigt, in fremde Rucksäcke zu schauen! + Vous n'êtes pas autorisé à regarder dans le sac à dos de quelqu'un! + Non sei autorizzato a guardare negli zaini altrui! + Você não é liberado para olhar a mochila dos outros! + Nie możesz zaglądać do czyichś plecaków! + 你不允许看别人的背包! + + + You are not allowed to access this vehicle while its locked. + Nemáte povolen přístup k toto vozidlo zatímco jeho uzamčen. + No tienes permiso de accesar este vehículo mientras esta cerrado. + + Du bist nicht berechtigt, auf dieses Fahrzeug zuzugreifen, während es abgeschlossen ist. + Vous n'êtes pas autorisé à accéder à ce véhicule tant qu'il est verrouillé. + Non ti è permesso l'accesso a questo veicolo mentre è bloccato. + Você não pode acessar o veiculo enquanto ele estiver trancado. + Nie masz dostępu do pojazdu gdy ten jest zamknięty + 你不能在锁门的情况下进入载具。 + + + This vehicle's trunk is in use, only one person can use it at a time. + kmen toto vozidlo je v provozu, může jen jedna osoba ji použít najednou. + El maletero de este vehículo solo puede ser usado por una persona a la vez. + + Der Kofferraum dieses Fahrzeuges wird bereits benutzt, nur eine Person kann auf ihn zugreifen. + Le coffre de ce véhicule est en cours d'utilisation, une seule personne peut l'utiliser à la fois. + L'inventario di questo veicolo è in uso, può essere usato solo da una persona alla volta. + A mala desse veículo está em uso, somente uma pessoa pode acessá-la de cada vez. + Bagażnik pojazdu jest w użyciu, na raz może korzystać z niego tylko jedna osoba. + 这载具的存储箱正在使用中,一次只能一个人使用它。 + + + Failed Creating Dialog + Nepodařilo Vytvoření dialog + Falló la creación del dialogo + + Erstellen des Dialogs gescheitert! + Échec à la création de dialogue + Creazione dialogo fallito + Falha ao criar Diálogo + Nie udało się nawiązać kontaktu + 创建对话框失败 + + + You have unlocked your vehicle. + Jste odemkli své vozidlo. + Has abierto tu vehículo + + Du hast dein Fahrzeug aufgeschlossen. + Vous avez déverrouillé votre véhicule. + Hai sbloccato il tuo veicolo. + Você destrancou o veículo. + Odblokowałeś pojazd + 你已经解锁了你的载具。 + + + You have locked your vehicle. + Jste zamkli své vozidlo. + Has cerrado tu vehículo. + + Du hast dein Fahrzeug abgeschlossen. + Vous avez verrouillé votre véhicule. + Hai bloccato il tuo veicolo + Você trancou o veículo. + Zablokowałeś pojazd + 你已经锁好你的车了。 + + + This can only be done by the last driver of this vehicle. + This can only be done by the last driver of this vehicle. + This can only be done by the last driver of this vehicle. + This can only be done by the last driver of this vehicle. + This can only be done by the last driver of this vehicle. + This can only be done by the last driver of this vehicle. + This can only be done by the last driver of this vehicle. + This can only be done by the last driver of this vehicle. + This can only be done by the last driver of this vehicle. + 这只能由该车辆的最后一个驾驶员完成。 + + + Sirens On + Na sirény + Sirenas Prendidas + + Sirene AN + Sirènes On + Sirene accese + Sirene Ligada + Syrena włączona + 开启警笛 + + + Sirens Off + sirény Off + Sirenas Apagadas + + Sirene AUS + Sirènes Off + Sirene spente + Sirene Desligada + Syrena wyłączona + 关闭警笛 + + + You need to install storage containers to have storing capabilities! + Je třeba nainstalovat kontejnery skladovací mít skladovací kapacity! + Debes instalar contenedores para tener capabilidades de almacenamiento! + + Du musst dir Container kaufen, um etwas einlagern zu können! + Vous devez installer des conteneurs de stockage pour disposer de capacité de stockage! + Devi posizionare dei contenitori per aver la possibilità di depositare qualcosa! + Você tem que instalar caixas para poder guardar items! + Musisz zainstalować pojemniki aby uzyskać możliwość składowania rzeczy + 你需要安装存储容器才能具有存储功能! + + + This vehicle isn't capable of storing virtual items. + Toto vozidlo není schopné uchovávat virtuální položky. + Este vehiculo no puede guardar objetos virtuales. + + Dieses Fahrzeug kann keine virtuellen Gegenstände lagern. + Ce véhicule n'est pas en mesure de stocker des objets virtuels. + Questo veicolo non è in grado di trasportare oggetti virtuali. + Esse veículo não pode armazenar items virtuais. + Ten pojazd nie przechowuje wirtualnych przedmiotów + 此载具无法存储虚拟物品。 + + + Weight: + Hmotnost: + Peso: + + Gewicht: + Poids: + Peso: + Peso: + Waga: + 重量: + + + House Storage + dům Storage + Inventario de la casa + + Lagerplatz des Hauses + Conteneur de stockage + Inventario Casa + Cavalos de Força: + Domowa skrzynka + 房子存储 + + + Vehicle Trunk + vozidlo Trunk + Maletero de Vehículo + + Kofferraum + Coffre du véhicule + Inventario veicolo + Capacidade da mala: + Bagażnik pojazdu + 载具存储箱 + + + The vehicle either doesn't exist or is destroyed. + Vozidlo buď neexistuje, nebo je zničena. + El vehículo no existe o fue destruido. + + Le véhicule n'existe pas ou a été détruit. + Entweder existiert das Fahrzeug nicht oder es wurde zerstört. + Il veicolo non esiste o è stato distrutto. + Veículo não existe ou está destruido. + Pojazd nie istnieje lub jest zniszczony + 载具要么不存在要么被毁坏。 + + + Invalid number format + Neplatný formát number + Formato de numero inválido + + Ungültiges Zahlenformat! + Format de nombre invalide + Formato numerico non valido + Formato de número inválido. + Niepoprawny format liczby + 数字格式无效 + + + You can't enter anything below 1! + Nemůžete nic zadávat menší než 1! + No puedes poner nada menos que 1! + + Du kannst nichts unter 1 eingeben! + Vous ne pouvez pas prendre moins d'1 objet ! + Non puoi inserire nulla al di sotto di 1! + Você não pode digitar nada abaixo de 1! + Nie możesz wprowadzić niczego poniżej 1! + 你不能输入少于1的任何物品! + + + The vehicle doesn't have that many of that item. + Vozidlo nemá že mnohé z této položky. + El vehículo no tiene tantos de ese objeto. + + Das Fahrzeug hat nicht so viele dieser Gegenstände. + Le véhicule ne contient pas autant de cet objet. + Il veicolo non contiene così tanti oggetti. + O veículo não tem essa quantidade de items. + Pojazd nie posiada takiej ilości rzeczy. + 载具没有那么多的物品。 + + + Your sound was set to normal mode! + Váš zvuk byl nastaven do normálního režimu! + Votre son a été augmenté! + Tu sonido fue puesto en modo normal! + Il vostro sound è stato impostato in modalità normale! + + Die Lautstärke ist wieder normal! + Seu som voltou ao normal! + Dzwięk został ustawiony w tryb normalny! + 你的声音被设置为正常模式! + + + Your sound was set to fade mode! + Váš zvuk byl nastaven do režimu slábnout! + Votre son a été diminué! + Tu sonido fue puesto en modo bajo! + Il vostro sound è stato impostato in modalità a svanire! + + Deine Lautstärke wurde in den "Fade-Mode" geändert! + Seu som está abafado. + Dzwięk został ustawiony w tryb wyciszony! + 你的声音被设置为静音模式! + + + An RPG game mode developed by Tonic. + Mód RPG hra vyvinutá Tonic. + Un mode de jeu de RPG développé par Tonic. + Un modo de juego de rol desarrollado por Tonic. + Una modalità di gioco RPG sviluppato da Tonic. + Tryb gry RPG stworzona przez Tonic. + Um modo de jogo RPG desenvolvido pela Tonic. + Режим RPG игра, разработанная компанией Tonic. + Ein RPG-Modus entwickelt von Tonic. + 由Tonic开发的RPG游戏模式。 + + + + + Error saving container, couldn't locate house? + Chyba při ukládání kontejner, nemohl najít dům? + Error al salvar contenedor, no se pudo encontrar la casa? + + Fehler beim Speichern der Container: Es konnte kein Haus gefunden werden. + Erreur lors de la sauvegarde des conteneurs, impossible de localiser la maison. + Errore nel salvataggio del contenitore, impossibile trovare la cas a? + Erro ao salvar a caixa, não foi possível encontrar a casa. + Błąd w zapisywaniu pojemnika, nie można zlokalizować domu. + 保存库存错误,找不到房子? + + + You are not allowed to access this storage container without the owner opening it. + Nemáte povolen přístup k tomuto skladovacího kontejneru, aniž by majitel otevření. + No tienes permiso de acceder este contenedor, sin el dueño haberlo abierto. + + Du bist nicht berechtigt, auf diesen Container zuzugreifen, ohne dass der Besitzer ihn aufgeschlossen hat. + Vous n'êtes pas autorisé à accéder à ce conteneur de stockage sans que le propriétaire ne l'ouvre. + Non sei autorizzato ad accedere a questo contentitore senza il permesso del proprietario. + Você so pode acessar a caixa se o dono deixar ela aberta. + Nie masz dostępu do pojemnika dopóki właściciel go nie otworzy. + 除非所有者打开此库存,否则不允许访问该库存。 + + + There are no houses near you. + Nejsou žádné domy u vás. + No hay casas cerca de ti. + Non ci sono case vicino a voi. + Brak domy w pobliżu ciebie. + + Il n'y a aucune maison près de vous. + Não há casas perto de você. + Es gibt keine Häuser in deiner Nähe. + 你在附近没有房子。 + + + The storage box is over the stairs! + Úložný box je u konce schodů! + Le conteneur est dans les escaliers! + La caja de almacenamiento está sobre las escaleras! + Il contenitore è sopra le scale! + Schowek jest na schodach! + A caixa de armazenamento é sobre as escadas! + Ящик для хранения находится над лестницей! + Der Container ist über die Treppe! + 存储箱在楼梯上! + + + You are not the owner of the house. + Nejste vlastníkem domu. + No eres el dueño de la casa. + Non sei il proprietario della casa. + Nie jesteś właścicielem domu. + + Vous n'êtes pas le propriétaire de la maison. + Você não é o dono da casa. + Du bist nicht der Eigentümer des Hauses. + 你不是房子的主人。 + + + You have unlocked the door. + Jste odemkl dveře. + Has abierto la puerta. + + Du hast die Tür aufgeschlossen. + Vous avez ouvert la porte. + Hai sbloccato la porta. + Você destrancou a porta. + Odblokowałeś drzwi. + 你打开了门。 + + + You have locked the door. + Jste zamkli dveře. + Has cerrado con llave la puerta. + + Du hast die Tür abgeschlossen. + Vous avez fermé à clé la porte. + Hai bloccato la porta. + Você trancou a porta. + Zablokowałeś drzwi. + 你锁上了门。 + + + You are not near a door! + Nejste u dveří! + No estas cerca de una puerta! + + Keine Tür in der Nähe! + Vous n'êtes pas près d'une porte! + Non sei vicino ad una porta! + Você não está perto de uma porta! + Nie jesteś przy drzwiach! + 你不在门附近! + + + This house was recently sold and is still processing in the database. + Tento dům byl nedávno prodán a je stále zpracovává v databázi. + Esta casa fue vendida recientemente y esta procesando datos. + + Dieses Haus wurde vor Kurzem verkauft. + Cette maison a été récemment vendue et est en cours de traitement dans la base de données. + Questa casa è stata venduta di recente ed il database la sta ancora processando. + Essa casa já foi vendida, estamos processando a ordem de compra + Ten dom został ostatnio sprzedany i trwa jego przetwarzanie w bazie danych. + 这套房子最近已售出,目前仍在数据库中处理。 + + + You do not have a home owners license! + Nemáte majitelům licenci doma! + No tienes licencia mobiliaria! + + Du hast keine Eigentumsurkunde! + Vous n'avez pas le permis de propriétaires de maison! + Non hai la licenza per il possesso delle case! + Você não tem um Registro Civil para comprar casas! + Nie masz licencji zarządcy nieruchomości! + 你没有房产许可证! + + + You can only own %1 houses at a time. + Můžete vlastnit pouze%1 domy najednou. + Solo puedes ser dueño de %1 casas a la vez. + + Du darfst nur %1 Häuser zugleich besitzen. + Vous ne pouvez posséder que %1 maisons à la fois. + Puoi possedere solo %1 case + Você só pode ter %1 casa(s)! + Możesz posiadać maksymalnie %1 domów. + 你一次只能拥有 %1 套房子。 + + + You do not have enough money! + Nemáte dost peněz! + No tienes suficiente dinero! + + Du hast nicht genug Geld! + Vous n'avez pas assez d'argent! + Non hai fondi a sufficienza! + Você não tem todo esse dinheiro! + Nie masz tyle pieniędzy! + 你没有足够的钱! + + + This house is available for <t color='#8cff9b'>$%1</t><br/>It supports up to %2 storage containers + Tento dům je k dispozici pro <t color='#8cff9b'>$%1</t><br/> Podporuje až %2 skladovací kontejnery + Esta casa esta disponible por <t color='#8cff9b'>$%1</t><br/>Soporta hasta %2 contenedores + + Dieses Haus kostet <t color='#8cff9b'>$%1</t><br/>. Es unterstützt %2 Container. + Cette maison est disponible pour <t color='#8cff9b'>$%1</t><br/> Il prend en charge jusqu'à %2 conteneurs de stockage + Questa casa è disponibile per <t color='#8cff9b'>$%1</t><br/>Può supportare fino a %2 contenitori + Essa casa está disponível por <t color='#8cff9b'>R$%1</t><br/>Ela suporta até %2 caixa(s) + Ten dom jest dostępny za <t color='#8cff9b'>$%1</t><br/>Ma %2 miejsca na pojemniki do przechowywania wyposażenia + 这所房子可以住 <t color='#8cff9b'>$%1</t><br/>它最多支持 %2 个存储箱 + + + Purchase House + nákup domu + Comprar Casa + + Haus kaufen + Acheter la Maison + Compra Casa + Comprar Casa + Kup dom! + 购买房子 + + + This house doesn't belong to anyone. + Tento dům nepatří nikomu. + Esta casa no tiene dueño. + + Dieses Haus gehört niemandem. + Cette maison n'appartient à personne. + Questa casa non appartiene a nessuno. + Essa casa não tem dono. + Ten dom nie ma właściciela. + 这套房子不属于任何人。 + + + This person is not online there for you cannot raid their house! + Tato osoba není on-line proto nelze nájezd svůj dům! + No puedes asaltar esta casa, porque el dueño no esta en linea! + + Der Hausbesitzer ist nicht online, daher kannst du sein Haus nicht durchsuchen! + Cette personne n'est pas sur l'île, vous ne pouvez pas perquisitionner cette maison! + Questa persona non è online quindi non puoi perquisire la sua casa! + O dono da casa não está online, você não pode vasculhar a casa! + Osoba nie jest na serwerze, nie możesz przeszukać domu. + 房子主人不在线,你不能搜查房子! + + + The door is already unlocked! + Dveře jsou již odemčené! + La puerta ya esta abierta! + + Die Tür ist bereits offen! + La porte est déjà débloqué! + La porta è già sbloccata! + A porta está destrancada! + Drzwi są już odblokowane! + 门已经解锁了! + + + The door is already locked! + Dveře jsou již zamčené! + La porte est déjà fermée! + La puerta ya esta cerrada con llave! + La porta è già chiusa a chiave! + + Die Tür ist bereits verriegelt! + Esta porta já está trancada! + Drzwi są już zablokowane! + 门已经锁好了! + + + Breaking lock on door + Lámání zámek na dveřích + Rompiendo la cerradura de la puerta. + + Türschloss wird aufgebrochen... + En train de casser la serrure + Sbloccando la porta + Quebrando a fechadura da porta + Wyłamuje zablokowane drzwi... + 撬开门锁 + + + %1 your house is being raided by the cops! + %1 vašeho domu je vpadl policajti! + %1 tu casa esta siendo asaltada por los policías! + + %1 dein Haus wird von der Polizei durchsucht! + %1, votre maison est perquisitionnée par les policiers ! + %1 la Polizia si sta introducendo in casa tua! + %1 Sua casa está sendo vasculhada pela Policia! + %1 twój dom jest kontrolowany przez policję! + %1 的房子被警察搜查了! + + + House Owner + Majitel domu + Dueño de la casa + + Hauseigentümer + Propriétaire + Proprietario Casa + Proprietário + Właściciel domu + 房子主人 + + + There is nothing in this house. + Není nic v tomto domě. + Esta casa esta vacía. + + Es gibt nichts in diesem Haus. + Il n'y a rien dans cette maison + In questa casa non c'è nulla. + Essa casa está vazia. + Nie znaleziono niczego nielegalnego. + 房子里什么也没有。 + + + Searching House... + Vyhledávání dům ... + Buscando Casa... + + Haus wird durchsucht... + Perquisition de la Maison... + Perquisendo la Casa... + Vasculhando a casa... + Przeszukuję dom... + 搜索房子... + + + You went too far away from the house! + Jste zašel příliš daleko od domu! + Te alejastes mucho de la casa! + + Du hast dich zu weit vom Haus entfernt! + Vous vous êtes trop éloigné de la maison! + Sei andato troppo distante dalla casa! + Você está muito distante da casa! + Jesteś za daleko od domu! + 你离房子太远了! + + + A house was raided and had $%1 worth of drugs / contraband. + Dům byl vpadl a měl $%1 v hodnotě drog / kontrabandu. + Una casa fue asaltada y se econtraron $%1 en drogas / contrabando. + + Ein Haus wurde durchsucht und es wurden Drogen / Schmuggelware im Wert von $% gefunden. + Une maison a été perquisitionné et avait $%1 de drogue / contrebande. + Una casa è stata perquisita e sono stati trovati $%1 in materiali illegali. + A casa assaltada tem R$%1 em drogas ou contrabandos. + Podczas przeszukania domu znaleziono kontrabandę o wartości $%1. + 一所房子被搜查,查获价值 $%1 的毒品/违禁品。 + + + Nothing illegal in this house. + Nic nezákonného v tomto domě. + Nada ilegal en esta casa. + + Nichts Illegales in diesem Haus. + Rien d'illégal dans cette maison + Questa casa non contiene nulla d'illegale. + Nada ilegal nessa casa. + Nie znaleziono niczego nielegalnego. + 这房子没有违法物品。 + + + House storage unlocked + Dům skladování odemkl + Inventario de la casa abierto + + Lagerplatz des Hauses aufgeschlossen. + Stockage de la maison déverrouillé + Contenitori della casa sbloccati + Armário da casa destrancado + Pojemnik odblokowany + 房子存储箱解锁 + + + House storage locked + Dům skladování zamčené + Inventario de la casa cerrado con llave + + Lagerplatz des Hauses abgeschlossen. + Stockage de Maison verrouillé + Contenitori della casa bloccati + Armário da casa trancado + Pojemnik zablokowany + 房子存储箱锁定 + + + Locking up house please wait... + Zamykání domu čekejte prosím ... + La casa se esta cerrando con llave, por favor espere... + + Haus wird abgeschlosen, bitte warten... + Fermeture de la maison, veuillez patienter... + Bloccando la casa, attendere prego... + Trancando a casa, aguarde... + Blokuję zamykam dom proszę czekać... + 房子锁定中请稍等... + + + House has been locked up. + Dům byl zamčený. + La maison a été verrouillée. + La casa se a cerrado con llave. + + Haus wurde abgeschlossen. + La casa è stata bloccata. + Sua casa foi trancada! + Dom został zablokowany / zamknięty! + 房子被锁定。 + + + Are you sure you want to sell your house? It will sell for: <t color='#8cff9b'>$%1</t> + Jste si jisti, že chcete prodat svůj dům? To se bude prodávat za: <t color='#8cff9b'>$%1</t> + Estas seguro de que quieres vender tu casa? Se vendera por: <t color='#8cff9b'>$%1</t> + + Bist Du sicher, dass du dein Haus verkaufen möchtest? Du würdest dafür <t color='#8cff9b'>$%1</t> bekommen. + Etes-vous sûr de vouloir vendre votre maison? Elle se vendra pour: <t color='#8cff9b'>$%1</t> + Sei sicuro di voler vendere la tua casa? La venderai per: <t color='#8cff9b'>$%1</t> + Você tem certeza que deseja vender a casa? O valor de venda é: <t color='#8cff9b'>R$%1</t> + Jesteś pewny że chcesz sprzedać dom za <t color='#8cff9b'>$%1</t> + 你确定要卖掉你的房子吗?出售价格:<t color='#8cff9b'>$%1</t> + + + Are you sure you want to remove it? + Jsou si jisti, že jej chcete odstranit? + Estas seguro de que lo quieres remover? + Sei sicuro di voler rimuovere esso? + Czy na pewno chcesz go usunąć? + + Etes-vous sûr de vouloir supprimer le conteneur ? + Você tem certeza que quer remover isso? + Bist du sicher, dass du den Container entfernen möchtest? + 你确定要删除存储箱吗? + + + This house is already owned even though you shouldn't be seeing this hint... + Tento dům je již ve vlastnictví i když by nemělo být vidět tuto radu ... + Cette maison a déjà un propriétaire, même si vous ne devriez pas voir ce message ... + Esta casa es de propiedad ya pesar de que no debería estar viendo esta pista ... + Questa casa è già di proprietà, anche se non si dovrebbe essere visto questo suggerimento ... + Ten dom jest już własnością, nawet jeśli nie należy widzieć tę wskazówkę ... + Esta casa já é de propriedade mesmo que você não deveria estar vendo essa dica ... + Этот дом уже находится в собственности, даже если вы не должны видеть эту подсказку ... + Dieses Haus befindet sich bereits in deinem Besitz. Diesen Hinweis solltest du eigentlich gar nicht sehen... + 尽管你不该看到这个提示,但这所房子已经有房主了... + + + There is no owner for this house. + Neexistuje žádný majitel tohoto domu. + Il n'y a pas le propriétaire de cette maison. + No hay ningún propietario de esta casa. + Non vi è alcun proprietario per questa casa. + Nie ma właściciel tego domu. + Não há proprietário para esta casa. + Там нет владельца для этого дома. + Es gibt keinen Eigentümer für dieses Haus. + 这房子没有主人. + + + + + Food + Jídlo + Faim + Comida + Cibo + Jedzenie + + Hunger + Comida + 食物 + + + Health + Zdraví + Vie + Vida + Salute + Zdrowie + + Gesundheit + Vida + 健康 + + + Water + Voda + Soif + Agua + acqua + Woda + + Durst + Água + + + + + + There isn't a chopper on the helipad! + Není vrtulník na přistávací plocha pro vrtulník! + No hay un helicóptero en el Helipad. + + Es ist kein Helikopter auf dem Landeplatz! + Il n'y a pas d'hélicoptère sur l'héliport + Non c'è alcun elicottero sulla piazzola d'atterraggio + Não existe uma aeronave no heliponto! + W pobliżu nie ma helikoptera! + 直升机停机坪上没有直升机! + + + You need $%1 to service your chopper + Musíte $%1 servisních kontrol vrtulník + Necesitas $%1 para reparar el helicóptero. + + Du benötigst $%1, um deinen Helikopter zu warten. + Vous avez besoin de $%1 pour entretien de votre hélicoptère + Necessiti di $%1 per fare manutenzione al tuo elicottero + Você precisa de R$%1 para reparar a sua aeronave + Potrzebujesz $%1 aby serwisować helikopter + 你需要 $%1 来维修你的直升机 + + + Servicing Chopper [%1]... + Servis Chopper [%1] ... + Reparando Helicóptero [%1]... + + Helikopter wird gewartet [%1]... + Entretien [%1]... + Manutenendo Elicottero [%1]... + Reparando aeronave [%1]... + Serwisuję helikopter [%1]... + 维修直升机 [%1]... + + + The vehicle is no longer alive or on the helipad! + Vozidlo je již nežije nebo na přistávací plocha pro vrtulník! + El vehiculo no esta vivo o en el helipad! + + Das Fahrzeug wurde zerstört oder befindest sich nicht mehr auf dem Helikopterlandeplatz! + L'hélicoptère est détruit ou n'est plus sur l'héliport! + Il veicolo non è più attivo sulla piazzola d'atterraggio! + "A aeronave não está mais disponível no heliponto! + Pojazd nie jest dłużej dostępny na lądowisku + 载具不再存在或停在停机坪上! + + + Your chopper is now repaired and refuelled. + Váš vrtulník není opraveno a tankovat. + Tu helicóptero esta reparado y lleno de combustible. + + Der Helikopter ist nun repariert und aufgetankt. + Votre hélicoptère est maintenant réparé et ravitaillé + L'elicottero è stato riparato e rifornito di carburante. + Sua aeronave está reparada e com o tanque cheio! + Helikopter został naprawiony i natankowany + 你的直升机现在已经修好并加满油。 + + + + + Marijuana leaf + marihuana list + Cannabis + + Kannabis + Cannabis + Cannabis + Maconha não Processada + Konopie + 大麻叶 + + + Apple + Jablko + Manzana + + Apfel + Pomme + Mela + Maçã + Jabłko + 苹果 + + + Apples + jablka + Manzanas + + Äpfel + Pommes + Mele + Maçãs + Jabłka + 很多苹果 + + + Heroin + Heroin + Heroina + + Heroin + Heroïne + Eroina + Heroína + Heroina + 海洛因 + + + Oil + Olej + Petróleo + + Öl + Pétrole + Olio + Petróleo + Benzyna + 石油 + + + Peach + Broskev + Melocotón + + Pfirsich + Pêche + Pesca + Pêssego + Brzoskwinia + 桃子 + + + Peaches + broskve + Melocotones + + Pfirsiche + Pêches + Pesche + Pêssegos + Brzoskwinie + 很多桃子 + + + Crude Oil + Ropa + Petróleo Crudo + + Unverarbeitetes Öl + Pétrole non raffiné + Olio non processato + Petróleo não Refinado + Ropa naftowa + 原油 + + + Processed Oil + Zpracovaný olej + Petróleo Procesado + + Verarbeitetes Öl + Pétrole raffiné + Olio processato + Petróleo Refinado + Olej napędowy + 成品油 + + + Opium Poppy + Mák setý + Planta del Opio + + Unverarbeitetes Heroin + Graine de pavot + Eroina non processata + Heroína não Processada + Heroina nieoczyszczona + 罂粟 + + + Heroin + Heroin + Heroina + + Verarbeitetes Heroin + Héroïne + Eroina processata + Heroína Processada + Heroina oczyszczona + 海洛因 + + + Pot + Hrnec + Marihuana + + Marihuana + Marijuana + Marijuana + Maconha Processada + Marihuana + 大麻 + + + Raw Rabbit + Raw Rabbit + Carne de Conejo + + Rohes Hasenfleisch + Viande de Lapin + Carne di coniglio + Carne de Coelho + Mięso zająca + 生兔肉 + + + Grilled Rabbit + grilované Rabbit + Conejo Asado + + Gegrilltes Hasenfleisch + Lapin grillé + Carne di coniglio alla griglia + Carne de coelho grelhado + Grilowany zając + 烤兔肉 + + + Raw Salema + Raw Salema + Salema Crudo + + Rohe Sardine + Filet de Saupe + Carne di Salmone + Peixe Salema + Mięso salemy + 生沙丁鱼肉 + + + Grilled Salema + Grilované Salema + Salema Cocinado + + Gegrillte Sardine + Sardine grillée + Sardine alla griglia + Sardinha Grelhada + Grilowana Salema + 烤沙丁鱼肉 + + + Raw Ornate + Raw Ozdobený + Ornate Crudo + + Roher Kaiserfisch + Filet d'Ornate + Carne di Orata + Carne Francesa + Mięso Ornata + 生梭鱼肉 + + + Grilled Ornate + grilované Ozdobený + Ornate Cocinado + + Gegrillter Kaiserfisch + Doré grillé + Angelfish alla griglia + Angelfish Grelhado + Grilowany Ornat + 烤梭鱼肉 + + + Raw Mackerel + Raw Makrela + Verdel Crudo + + Rohe Makrele + Filet de Maquereau + Carne di Sgombro + Peixe Cavalinha + Mięso Makreli + 生鲭鱼肉 + + + Grilled Mackerel + grilované makrely + Verdel Cocinado + + Gegrillte Makrele + Maquereau grillé + Sgombro alla griglia + Cavalinha Grelhada + Grilowana Makrela + 烤鲭鱼肉 + + + Raw Tuna + syrového tuňáka + Atún Crudo + + Roher Thunfisch + Filet de Thon + Carne di Tonno + Peixe Tuna + Mięso Tuńczyka + 生金枪鱼肉 + + + Grilled Tuna + grilované Tuna + Atún Cocinado + + Gegrillter Thunfisch + Thon grillé + tonno alla griglia + Atum Grelhado + Grilowany Tuńczyk + 烤金枪鱼肉 + + + Raw Mullet + Raw Mullet + Lisa Cruda + + Rohe Meerbarbe + Filet de Mulet + Carne di Triglia + Peixe Mullet + Mięso Cefala + 生鲻鱼肉 + + + Fried Mullet + Fried Mullet + Lisa Cocinada + + Frittierte Meerbarbe + Rouget frits + Triglia fritta + Mullet Fritado + Grilowany Cefal + 油炸鲻鱼肉 + + + Raw Catshark + Raw máčka + Pez Gato Crudo + + Roher Katzenhai + Filet de Poisson Chat + Carne di Squalo + Tubarão Gato + Mięso Rekina + 生鲨鱼肉 + + + Fried Catshark + Fried máčka + Pez Gato Cocinado + + Frittierter Katzenhai + Poisson-chat frit + profondo palombo fritti + Tubarão Gato Frito + Grilowany Rekin + 油炸鲨鱼肉 + + + Raw Turtle + Raw Turtle + Carne de Tortuga + + Rohes Schildkrötenfleisch + Viande de Tortue + Carne di Tartaruga + Carne de Tartaruga + Mięso Żółwia + 生海龟肉 + + + Turtle Soup + Turtle Soup + Sopa de Tortuga + + Schildkrötensuppe + Soupe à la Tortue + Zuppa di Tartaruga + Sopa de Tartaruga + Zupa z żółwia + 海龟肉汤 + + + Raw Chicken + Raw Chicken + Carne de Pollo + + Poulet cru + Rohes Hühnchenfleisch + pollo crudo + Galinha Crua + Surowy Kurczak + 生鸡肉 + + + Deep Fried Chicken + Smažené kuře + Pollo Frito + + Schwarz Frittiertes Hühnchen + Poulet frit + Nero Fried Chicken + Frango Frito + Smażony Kurczak + 炸鸡肉 + + + Raw Rooster + Raw Kohout + Carne de Gallo + + Coq cru + Rohes Hähnchenfleisch + Rooster Raw + Galo Cru + Surowy Kogut + 生公鸡肉 + + + Grilled Rooster + grilované Kohout + Gallo Asado + + Gegrilltes Hähnchen + Coq grillé + cazzo alla griglia + Galo Grelhado + Grilowany Kogut + 烤鸡肉 + + + Raw Goat + Raw Kozí + Carne de Cabra + + Rohes Ziegenfleisch + Chèvre crue + Carne di capra Raw + Carne de Cabra Crua + Surowa Koza + 生山羊肉 + + + Grilled Goat + grilovaný kozí + Cabra Asada + + Gegrilltes Ziegenfleisch + Chèvre grillée + Carne di capra alla griglia + Carne de Cabra Grelhada + Grilowana Koza + 烤山羊肉 + + + Raw Sheep + Raw Ovce + Carne de Obeja + + Rohes Schafsfleisch + Mouton cru + Carne di pecora grezza + Carne de Ovelha Crua + Surowa Owca + 生绵羊肉 + + + Grilled Sheep + grilované Ovce + Obeja Asada + + Gegrilltes Schafsfleisch + Mouton grillé + Mutton alla griglia + Mutton Grelhado + Grilowana Owca + 烤全羊肉 + + + Fishing Pole + Rybářský prut + Palo de Pesca + + Angel + Canne à pêche + Canna da pesca + Vara de Pescar + Wędka + 钓鱼竿 + + + Water Bottle + Láhev na vodu + Botella de Agua + + Wasserflasche + Bouteille d'eau + Bottiglia d'acqua + Garrafa d'água + Butelka wody + 瓶装水 + + + Coffee + Káva + Café + + Kaffee + Café + Caffè + Café + Kawa + 咖啡 + + + Donuts + koblihy + Donas + + Donuts + Donuts + Ciambelle + Rosquinha + Pączki + 甜甜圈 + + + Empty Fuel Canister + Prázdný palivo může + Bidón de Combustible Vacío + + Leerer Benzinkanister + Jerrican Vide + Tanica di carburante vuota + Tanque de Gasolina Vazio + Pusty kanister + 空汽油桶 + + + Full Fuel Canister + Plná palivo může + Bidón de Combustible Lleno + + Gefüllter Benzinkanister + Jerrican de Carburant + Tanica di carburante piena + Tanque de Gasolina Cheio + Pełny Kanister + 满汽油桶 + + + Defibrillator + defibrilátor + Desfibrilador + + Defibrillator + Défibrillateur + defibrillatore + Desfibrilador + defibrylator + 心脏除颤器 + + + Toolkit + Toolkit + Kit de Herramientas + + Werkzeugkit + Boîte à outils + kit di strumenti + conjunto de ferramentas + zestaw narzędzi + 维修包 + + + Pickaxe + Krumpáč + Pico + + Spitzhacke + Pioche + Piccone + Picareta + Kilof + 镐子 + + + Copper Ore + Měděná ruda + Cobre + + Kupfererz + Minerai de Cuivre + Minerale di Rame + Pepita de Cobre + Ruda miedzi + 铜矿石 + + + Iron Ore + Železná Ruda + Hierro + + Eisenerz + Minerai de Fer + Minerale di Ferro + Pepita de Ferro + Ruda żelaza + 铁矿石 + + + Iron Ingot + Železná cihla + Lingote de Hierro + + Eisenbarren + Lingot de Fer + Lingotto di ferro + Barra de Ferro + Sztabka żelaza + 铁锭 + + + Copper Ingot + měď ingotů + Lingote de Cobre + + Kupferbarren + Lingot de cuivre + Lingotto di Rame + Barra de Cobre + Sztabka miedzi + 铜锭 + + + Sand + Písek + Arena + + Sand + Sable + Sabbia + Areia + Piasek + 沙子 + + + Salt + Sůl + Sal + + Salz + Sel + Sale + Sal + Sól kopana + 盐矿 + + + Refined Salt + rafinovaný Salt + Sal Refinada + + Raffiniertes Salz + Sel traité + Sale raffinato + Sal Refinado + Sól rafinowana + 食盐 + + + Glass + Sklo + Vidrio + + Glas + Verre + Vetro + Vidro + Szkło + 玻璃 + + + Polished Diamond + leštěný Diamond + Diamante Pulido + + Geschliffene Diamanten + Diamant Taillé + Diamante tagliato + Diamante Lapidado + Diament szlifowany + 钻石抛光 + + + Uncut Diamond + Uncut Diamond + Diamante Bruto + + Ungeschliffene Diamanten + Diamant Brut + Diamante grezzo + Diamante Bruto + Diament surowy + 未切割钻石 + + + Tactical Bacon + Tactical Bacon + Tocino + + Taktischer Speck + Bacon tactique + Carne secca + Bacon Tático + Posiłek taktyczny + 战术培根 + + + RedGull + RedGull + RedGull + RedGull + RedGull + RedGull + RedGull + RedGull + RedGull + 红牛 + + + Lockpick + Šperhák + Ganzúa + + Dietrich + Outil de crochetage + Grimaldello + Chave Mestra + Wytrych + 开锁工具 + + + Rock + Skála + Piedra + + Stein + Pierre + Roccia + Pedra + Skała + 矿石 + + + Cement Bag + cement Bag + Bolsa de Cemento + + Zement Sack + Sac de ciment + Sacco di Cemento + Saco de Cimento + Worek cementu + 水泥 + + + Gold Bar + Gold Bar + Barra de Oro + + Goldbarren + Lingot d'or + Lingotto d'Oro + Barra de Ouro + Sztabka złota + 金条 + + + Blasting Charge + Trhací Charge + Carga Explosiva + + Sprengladung + Charge de dynamite + Carica Esplosiva + Explosivo + Ładunek wybuchowy + 爆破装置 + + + Bolt Cutter + Bolt Cutter + Cizalla + + Bolzenschneider + Outils de serrurier + Tronchese + Alicate + Nożyce do kłódek + 螺栓切割机 + + + Bomb Defuse Kit + Bomby zneškodnit Kit + Kit para Desarmar Bombas + + Bombenentschärfungskit + Outils de désamorçage + Attrezzi per il disinnesco + Kit anti-bomba + Zestaw saperski + 爆破拆除工具 + + + Small Storage Box + Malá přihrádka + Contenedor Pequeño + + Kleine Lagerbox + Petit Conteneur de stockage + Contenitore piccolo + Caixa Pequena + Mały pojemnik + 小储物箱 + + + Large Storage Box + Velký úložný box + Contenedor Grande + + Große Lagerbox + Grand Conteneur de stockage + Contenitore grande + Caixa Grande + Duży pojemnik + 大储物箱 + + + Coca Leaf + Coca Leaf + Hoja de Coca + + Unverarbeitetes Kokain + Feuille de Coca + Cocaina non processata + Cocaína não Refinada + Nieoczyszczona kokaina + 古柯叶 + + + Coke + Koks + Cocaína + + Verarbeitetes Kokain + Cocaïne + Cocaina processata + Cocaína Refinada + Oczyszczona kokaina + 可卡因 + + + Spike Strip + Spike Strip + Barrera de Clavos + + Nagelband + Herse + Striscia Chiodata + Tapete de Espinhos + Kolczatka drogowa + 钉刺带 + + + + + Driver License + Řidičský průkaz + Licencia de Conducir + + Führerschein + Permis de Conduire + Licenza di Guida + Licença de Motorista + Prawo jazdy + 小车驾驶证 + + + Pilot License + pilotní licence + Licencia de Piloto + + Pilotenschein + Licence de Pilote + Licenza da Pilota + Licença de Piloto + Licencja Pilota + 飞行员证 + + + Heroin Training + heroin Training + Entrenamiento de Heroina + + Heroinausbildung + Transformation d'Héroïne + Processo Eroina + Treinamento de Heroina + Wytwarzanie Heroiny + 海洛因加工证 + + + Oil Processing + Zpracování olej + Procesamiento de Petroleo + + Ölverarbeitung + Raffinage du pétrole + Processo Olio + Refinamento de Petróleo + Rafinacja ropy naftowej + 石油提炼证 + + + Diving License + potápěčské licence + Licencia de Buceo + + Taucherschein + Permis de Plongée + Licenza di Pesca + Licença de Mergulho + Licencja Nurka + 潜水证 + + + Boating License + Vodácký licence + Licencia de Botes + + Bootsschein + Permis Bateau + Licenza Nautica + Licença de Barco + Patent Motorowodny + 海员证 + + + Firearm License + zbrojní průkaz + Licencia de Armas + + Waffenschein + Permis de Port d'Arme + Porto d'Armi + Licença de Porte de Armas + Pozwolenie na broń + 持枪证 + + + Coast Guard License + Pobřežní stráž licence + Licencia de Guardia Costera + + Küstenwachenausbildung + Garde-Côtes + Licenza Guardia Costiera + Licença da Guarda Costeira + Trening straż przybrzeżna + 海岸警卫队证 + + + Rebel Training + Rebel Training + Entrenamiento Rebelde + + Rebellenausbildung + Entraînement rebelle + Licenza da Ribelle + Treinamento Rebelde + Trening rebelianta + 叛军训练 + + + Truck License + Truck licence + Licencia de Camiones + + LKW-Führerschein + Permis Poids Lourds + Licenza Camion + Licença de Caminhão + Prawo jazdy - ciężarówki + 货车驾驶证 + + + Diamond Processing + Diamond Processing + Procesamiento de Diamantes + + Diamantenverarbeitung + Taillage des Diamants + Processo Diamanti + Lapidação de Diamante + Szlifierz diamentów + 钻石加工厂 + + + Copper Processing + Zpracování měď + Procesamiento de Cobre + + Kupferverarbeitung + Fonte du Cuivre + Processo Rame + Processamento de Cobre + Wytapianie miedzi + 铜矿加工 + + + Iron Processing + Zpracování Iron + Procesamiento de Hierro + + Eisenverarbeitung + Fonte du Fer + Processo Ferro + Processamento de Ferro + Wytapianie żelaza + 铁矿加工 + + + Sand Processing + Zpracování písek + Procesamiento de Arena + + Sandverarbeitung + Traitement du Sable + Processo Sabbia + Processamento de Areia + Hutnik szkła z piasku + 玻璃制造证 + + + Salt Processing + sůl Processing + Procesamiento de Sal + + Salzverarbeitung + Traitement du Sel + Processo Sale + Processamento de Sal + Warzenie soli + 食盐制造证 + + + Cocaine Training + kokain Training + Entrenamiento de Cocaína + + Kokainausbildung + Transformation de la Cocaïne + Processo Cocaina + Treinamento de Cocaína + Oczyszczanie kokainy + 可卡因加工证 + + + Marijuana Training + Marihuana Training + Entrenamiento de Marihuana + + Marihuanaausbildung + Traitement du Cannabis + Processo Marijuana + Treinamento de Maconha + Suszenie konopi + 大麻加工证 + + + Cement Mixing License + Cement Mixing licence + Licencia para Mezclar Cemento + + Zementmisch-Lizenz + Fabrication du Ciment + Processo Cemento + Licença de Cimento + Wytwórca cementu + 水泥制造证 + + + Medical Marijuana License + Medical Marihuana Licence + Licencia de Marihuana Medicinal + + Medizinisches Marijuana-Lizenz + Licence de Cannabis Médical + Medical Marijuana Licenza + Licença Medical Marijuana + Medical Marijuana Licencji + 医用大麻许可证 + + + Home Owners License + Home Majitelé licence + Licencia Mobiliaria + + Eigentumsurkunde + Droit de Propriété + Licenza possesso Casa + Licença de Casas + Zarządca nieruchomości + 房产证 + + + + + This can only be used on a vault. + To lze použít pouze v trezoru. + Esto solo se puede usar en una bóveda. + + Dies kann nur an einem Tresor benutzt werden. + Cela ne peut être utilisé que sur un coffre-fort. + Può essere usata solo sulla cassaforte. + Isso só pode ser usado em um cofre. + Możesz tego użyć na skarbcu. + 这只能用于金库。 + + + There is already a charge placed on this vault. + Existuje již náboj umístěn na tomto trezoru. + Ya hay un explosivo puesto en esta bóveda + + Es gibt bereits eine Sprengladung am Tresor. + Une charge de dynamite est déjà placé sur ce coffre. + C'è già una carica piazzata sulla cassaforte. + Já existe uma carga colocada sobre esse cofre. + Już założono ładunek wybuchowy na skarbcu. + 这座金库已经安装爆破装置。 + + + The vault is already opened. + Klenba je již otevřen. + La bóveda ya esta abierta. + + Der Tresor ist bereits offen. + Le coffre est déjà ouvert. + La cassaforte è già aperta. + O cofre está aberto. + Skarbiec jest już otwarty. + 金库已经打开了. + + + A blasting charge has been placed on the federal reserves vault, You have till the clock runs out to disarm the charge! + S rozbuškami náboj byl umístěn na federální rezervy trezoru, jste až do hodiny vyčerpá odzbrojit náboj! + Una carga explosiva ha sido puesta en la bóveda de la reserva federal, tienes hasta que se acabe el tiempo para desarmar el explosivo! + + Eine Sprengladung wurde am Safe angebracht. Du hast Zeit, bis die Uhr abläuft, um die Ladung zu entschärfen! + Une charge de dynamite a été placée sur le coffre de la réserve fédérale. Vous avez jusqu'au temps imparti pour désarmorcer la charge ! + Una carica esplosiva è stata piazzata sulla cassaforte della Riserva Federale, puoi cercare di disinnescarla prima che scada il tempo! + O explosivo foi colocado no cofre , você tem até o tempo acabar para desarmar o explosivo. + Ładunek wybuchowy został założony na skarbcu rezerw federalnych, musisz rozbroić ładunek nim wybuchnie! + 金库里已经安装了爆破装置,你必须有足够的时间解除爆破装置! + + + The timer is ticking! Keep the cops away from the vault! + Časovač je tikání! Udržujte policajty od trezoru! + El tiempo esta corriendo, manten alejados a los policías! + + Der Timer läuft! Halte die Polizei von Safe fern! + La minuterie est lancée! Gardez la police loin de la bombe ! + Il tempo sta scorrendo! Tieni la polizia lontana dalla cassaforte! + O tempo está passando! Mantenha os policiais longe do cofre + Zegar tyka! Trzymaj policję z dala od skarbca! + 计时器开始计时!请远离爆破点! + + + The charge has been disarmed! + Náboj byl odzbrojen! + El explosivo ha sido desarmado! + + Die Sprengladung wurde entschärft! + La charge a été désamorcée ! + La carica esplosiva è stata disinnescata! + O explosivo foi desarmado! + Ładunek wybuchowy rozbrojony! + 爆破装置被解除! + + + The vault is now opened + Klenba je nyní otevřena + La bóveda esta abierta + + Der Tresor ist jetzt offen! + Le coffre est maintenant ouvert + La cassaforte è stata aperta + O cofre está aberto. + Skarbiec otwarty + 金库现在已经打开了 + + + You must open the container before placing the charge! + Je nutné otevřít nádobu před umístěním nabíječku! + Vous devez ouvrir le conteneur avant de placer le chargeur ! + Debes abrir el contenedor antes de poner el explosivo! + È necessario aprire il contenitore prima di mettere il caricabatterie! + Musisz otworzyć pojemnik przed wprowadzeniem opłat! + + Você deve abrir o container antes de colocar o explosivo! + Du musst den Container öffnen, bevor du die Ladung platzieren kannst! + 安装爆破装置前你必须打开金库大门! + + + You are not looking at a house door. + Nejste při pohledu na dveře domu. + No estas viendo a la puerta de una casa. + + Du siehst keine Haustür an. + Vous n'êtes pas en face de la porte. + Non sei girato verso la porta di una casa. + Você não esta olhando para a porta. + Nie patrzysz w stronę drzwi. + 你需要靠近门才能使用。 + + + !!!!! SOMEONE IS BREAKING INTO THE FEDERAL RESERVE !!!!!! + !!!!! Někdo vloupání do Federálního rezervního systému !!!!!! + !!!!! LA RESERVA FEDERAL ESTA SIENDO ASALTADA !!!!!! + + !!!!! JEMAND BRICHT IN DIE ZENTRALBANK EIN !!!!!! + !!!!! QUELQU'UN TENTE DE S'INTRODUIRE DANS LA RÉSERVE FÉDÉRALE !!!!!! + !!!!!! QUALCUNO STA CERCANDO DI INTRODURSI NELLA RISERVA FEDERALE !!!!!! + !!!!! A RESERVA FEDERAL ESTÁ SENDO ROUBADA !!!!!! + !!!!!! KTOŚ SIĘ WŁAMUJE DO BANKU REZERW FEDERALNYCH !!!!! + !!!!! 有人闯进金库 !!!!!! + + + %1 was seen breaking into a house. + %1 byl viděn vloupání do domu. + %1 ha sido visto entrando a una casa. + + %1 wurde beim Einbruch in ein Haus gesehen. + %1 a été vu rentrant dans une maison par effraction. + %1 è stato visto fare irruzione in una casa. + %1 foi visto invadindo sua casa. + %1 był widziany jak włamywał się do domu. + %1 闯入一所房子。 + + + Cutting lock on door + Řezání zámek na dveřích + Cortando la cerradura de la puerta + + Schloss wird aufgebrochen... + Crochetage de la serrure + Tranciando i blocchi sulla porta + Quebrando o cadeado da porta + Przecinam zabezpieczenia domu + 门锁被撬 + + + You must open the outside doors before opening it! + Je nutné otevřít venkovní dveře před otevřením! + Vous devez ouvrir les portes extérieures avant de l'ouvrir ! + Debes abrir las puertas de afuera antes de abrir esta! + È necessario aprire le porte esterne prima di aprirlo! + Musisz otworzyć zewnętrzne drzwi przed otwarciem! + + Você deve abrir as portas externas antes de abrir essa! + Du musst die Außentüren öffnen, bevor du weitermachen kannst! + 打开门前你必须先打开外面的门! + + + You are not looking at a vault. + Nejste při pohledu na klenbu. + Vous ne regardez pas le coffre. + No estas apuntando a la bóveda. + Non cercate in un caveau. + Nie jesteś patrząc na sklepieniu. + Você não está olhando para um cofre. + Вы не смотрите на хранилище. + Du siehst keinen Tresor an. + 你不是金库看守。 + + + There is no charge on the vault? + Neexistuje žádný poplatek na klenbě? + No hay un explosivo en la bobeda? + + Es gibt keine Sprengladung am Tresor? + Il n'y a pas de dynamite sur le coffre ? + Non c'è alcuna carica esplosiva sulla cassaforte + Não há nenhum explosivo no cofre. + Nie ma ładunku na skarbcu? + 爆破装置安装在了金库里? + + + Defusing charge... + Zneškodňovat náboj ... + Desarmando Explosivo... + + Sprengladung wird entschärft... + Désamorçage de la charge... + Disinnescando la carica esplosiva... + Desarmando o explosivo... + Rozbrajam ładunek... + 拆除爆破装置... + + + The charge has been defused + Obvinění byla zneškodněna + El explosivo ha sido desarmado + + Die Sprengladung wurde entschärft. + La charge a été désamorcée + La carica esplosiva è stata disinnescata + O explosivo foi desarmado + Ładunek został rozbrojony + 爆破装置已被拆除 + + + You need to look at the vehicle you want to refuel! + Musíte se podívat na vozidla, které chcete natankovat! + Debes mirar a el vehiculo que quieres llenar de combustible! + + Du musst das Fahrzeug ansehen, das du auftanken möchtest! + Vous avez besoin de regarder le véhicule dont vous voulez faire le plein ! + Devi essere girato verso il veicolo che vuoi rifornire! + Você precisa estar olhando para o veículo que deseja abastecer! + Musisz spojrzeć w kierunku pojazdu który chcesz zatankować! + 你要看看你的载具是否加满了油! + + + You need to be closer to the vehicle! + Musíte být blíže k vozidlu! + Debes estar más cerca del vehiculo! + + Du musst näher am Fahrzeug sein! + Vous devez être plus proche du véhicule ! + Devi stare più vicino al veicolo! + Você precisa estar mais perto do veículo! + Musisz być bliżej pojazdu! + 你需要离载具近一点! + + + Refuelling Fuel Canister + Tankování paliva kanystr + Ravitaillement en carburant de la citerne + Llenando Bidón de Combustible + Rifornimento carburante scatola metallica + Tankowanie paliwa Kanister + O reabastecimento de combustível vasilha + Дозаправка топлива канистра + Benzinkanister befüllen + 加注汽油桶 + + + Fuel Station Pump + Čerpací stanice čerpadla + Pompe à essence + Estación de bombeo de combustible + Pompa Stazione di rifornimento + Paliwo przepompowni + Bomba de Combustível Station + Топливная Насосная станция + Zapfsäule + 燃料加油站 + + + Spend $%1 to refuel your Empty Fuel Canister? + Utratit $%1 natankovat vaše prázdné palivové kanystr? + Dépenser $%1 pour faire le plein de votre réservoir ? + Gastar $%1 para llenar el Bidón de Combustible? + Spendere $%1 per rifornire di carburante la vostra scatola metallica del combustibile vuoto? + Wydać $%1 zatankować swój pustego zasobnika paliwa? + Gastar R$%1 para reabastecer a sua vasilha de combustível vazio? + Потратить $%1 для дозаправки ваш Пусто баллон с горючим? + Willst du deinen leeren Kraftstoffkanister für $%1 befüllen? + 花费 $%1 加满你的空汽油桶? + + + You must be closer to the fuel pump! + Musíte být blíže k palivovému čerpadlu! + Vous devez être plus proche de la pompe à carburant ! + Debe estar más cerca de la bomba de combustible! + È necessario essere più vicino alla pompa del carburante! + Você deve estar mais perto da bomba de combustível! + Você deve estar mais perto da bomba de combustível! + Вы должны быть ближе к топливному насосу! + Du musst dich näher an der Zapfsäule befinden! + 你必须靠近加油机! + + + You have successfully refuelled the Fuel Canister! + Úspěšně jste tankovat palivový kanystr! + Vous avez ravitaillé avec succès le réservoir d'essence ! + Usted ha llenado con exito el Bidón de Combustible! + Hai rifornimento con successo il canestro del combustibile! + Pomyślnie zatankowany kanistra paliwa! + Você reabastecido com sucesso a vasilha de combustível! + Вы успешно заправились на баллон с горючим! + Der Benzinkanister wurde befüllt! + 你已加满汽油桶! + + + Refuelling %1 + Doplňování paliva %1 + Llenado el Bidón %1 + + Wird befüllt %1... + Ravitaillement en cours de %1 + Rifornendo %1 + Abastecendo %1 + Tankuję %1 + 补充油量 %1 + + + You have refuelled that %1 + Jsi natankoval, že produkt %1 + Has llenado el %1 + + Du hast deinen %1 befüllt. + Vous avez ravitaillé %1 + Hai rifornito di carburante un %1 + Você abasteceu %1 + Zatankowałeś %1 + 你要补充油量 %1 + + + This vehicle is already in your key-chain. + Toto vozidlo je již ve vaší klíčenky. + Esta vehiculo ya esta en tu llavero. + + Du hast diesen Fahrzeugschlüssel bereits an deinem Schlüsselbund. + Ce véhicule est déjà dans votre porte-clé. + Possiedi già le chiavi di questo veicolo. + Você já tem a chave desse veículo. + Masz już klucze do tego pojazdu. + 你已经获得载具钥匙。 + + + Lock-picking %1 + Lockpicking %1 + Abriendo Cerradura %1 + + Wird aufgebrochen %1... + Crochetage de %1 + Scassinando %1 + Arrombando %1 + Włamujesz się do %1 + 撬锁 %1 + + + You got to far away from the target. + Dostal jsi příliš daleko od cíle. + Le alejastes mucho del objeto. + + Du hast dich zu weit vom Ziel entfernt. + Vous êtes trop loin de la cible. + Sei andato troppo lontano dall'obiettivo + Voçê está muito longe do seu alvo. + Jesteś za daleko od celu. + 你必须远离目标。 + + + You now have keys to this vehicle. + Nyní máte klíče k tomuto vozidlu. + Ahora tienes las llaves para este vehiculo. + + Du hast nun einen Schlüssel zu diesem Fahrzeug. + Vous avez maintenant les clés de ce véhicule + Sei ora in possesso delle chiavi di questo veicolo. + Agora você tem as chaves do veiculo. + Masz teraz klucze do tego pojazdu + 你现在获得了载具钥匙。 + + + The lockpick broke. + Paklíč zlomil. + La ganzua se rompió. + + Der Dietrich ist abgebrochen. + L'outil de crochetage s'est cassé + Il grimaldello si è rotto. + A Chave Mestra quebrou. + Wytrych się złamał. + 撬锁工具坏了。 + + + %1 was seen trying to lockpick a car. + %1 byl viděn snaží lockpick auto. + %1 ha sido visto tratando de abrir un carro. + + %1 wurde beim Aufbrechen eines Auto erwischt. + %1 a été vu essayant de crocheter une voiture + %1 è stato visto provare a scassinare un veicolo. + %1 foi visto usando uma Chave Mestra em um carro. + %1 był widziany jak próbował włamać się do samochodu. + %1 试图撬开一辆载具的门锁。 + + + You are not near a mine! + Nejste v blízkosti dolu! + No estas cerca de una mina! + + Du bist nicht in der Nähe einer Mine! + Vous n'êtes pas près d'une mine! + Non ti trovi vicino ad una cava! + Você não está próximo de uma mina! + Nie jesteś blisko kopalni! + 你不在矿场附近! + + + You can't mine from inside a car! + Nemůžete dolovat z vnitřku vozu! + No puedes minar desde adentro de un vehiculo! + + Du kannst nicht in deinem Auto abbauen! + Vous ne pouvez pas miner à l'intérieur d'une voiture! + Non puoi minare da dentro un veicolo! + Você não pode minerar dentro do carro! + Nie możesz wydobywać z samochodu! + 你不能从车里面采集! + + + You have mined %2 %1 + Jste těžil% %2 1 + Has minado %2 %1 + + Du hast %2 %1 abgebaut. + Vous avez miné %2 %1 + Hai minato %2 %1 + Você minerou %2 %1 + Wydobyłeś %2 %1 + 你开采 %2 %1 + + + Place Spike Strip + Umístěte Spike Strip + Poner Barrera de Clavos + + Nagelband platzieren + Placer la herse + Posa striscie chiodate + Tapete de Espinhos armado. + Rozłóż kolczatkę + 放置钉刺带 + + + Pack up Spike Strip + Sbalit Spike Strip + Guardar Barrera de Clavos + + Nagelband zusammenpacken + Ranger la herse + Recupera striscie chiodate + Pegar Tapete de Espinhos. + Zwiń kolczatkę + 收起钉刺带 + + + You need to be inside your house to place this. + Musíte být uvnitř svého domu na místo toto. + Debes estar dentro de tu casa para poner eso. + + Du musst in deinem Haus sein, um dies platzieren zu können. + Vous devez être à l'interieur de votre maison pour placer ceci + Devi essere all'interno della tua casa per posizionarlo. + Você precisa estar dentro da sua casa para colocar isso! + Musisz być wewnątrz własnego domu aby to umieścić. + 你需要在你的房子里放置这个。 + + + You cannot place any more storage containers in your house. + Nelze umístit žádné další skladovací kontejnery ve vašem domě. + No puedes poner mas contenedores en tu casa. + + Es können keine weiteren Container in dein Haus gestellt werden. + Vous ne pouvez pas placer d'autres conteneurs dans votre maison. + Non puoi installare altri contenitori in casa tua. + Você não pode colocar mais caixas dentro da sua casa. + Nie masz więcej miejsca na pojemniki w tym domu. + 你不能在你的房子里放更多的储藏存储箱。 + + + No more free storage spaces in your house. + Žádné další volné skladové prostory v domě. + No hay más espacio de almacenamiento en tu casa. + + Es gibt in deinem Haus keinen freien Lagerplatz mehr. + Il n'y a plus d'espace libre dans votre maison. + I contenitori in casa tua hanno finito lo spazio disponibile. + Não ha mais espaços para guardar itens em sua casa. + Brak wolnych miejsc na pojemniki w domu. + 你的房子没有空闲的储藏空间。 + + + You need to select an item first! + Je třeba vybrat položku na prvním místě! + Debes seleccionar un objeto primero! + + Du musst zuerst einen Gegenstand auswählen! + Vous devez sélectionner un objet ! + Devi prima selezionare un oggetto! + Você precisa selecionar um item primeiro! + Zaznacz najpier rzecz. + 你需要选择一个物品! + + + You can now run farther for 3 minutes + Nyní můžete spustit další 3 minuty + Ahora puedes correr mas por 3 minutos + + Vous pouvez courir pendant 3 minutes + Du kannst jetzt für 3 Minuten weiter laufen. + Puoi ora correre per 3 minuti consecutivi + Você agora pode correr por 3 minutos + Możesz przez 3 minuty biec bez wysiłku + 你现在可以跑3分钟 + + + You already have a Spike Strip active in deployment + Ty už mají Spike Strip aktivní při nasazení + Ya tienes una Barrera de Clavos activada + + Du platzierst bereits ein Nagelband! + Vous avez déjà une herse en train d'être deployée + Hai già una striscia chiodata piazzata + Você já tem um Tapete de Espinhos ativo + Aktualnie masz rozłożoną kolczatkę + 你已经部署了一个钉刺带。 + + + You can't refuel the vehicle while in it! + Nemůžete natankovat z vozidla, když v něm! + No puedes llenar tu vehiculo mientras estas adentro de él! + + Du kannst ein Fahrzeug nicht betanken während du dich darin befindest! + Vous ne pouvez pas faire le plein du véhicule tout en étant à l'intérieur ! + Non puoi rifornire il veicolo di benzina mentre ci sei dentro! + Você não pode abastecer o veículo enquanto dentro dele! + Nie możesz zatankować pojazdu gdy w nim jesteś! + 你不能在车里加油! + + + This item isn't usable. + Tato položka není použitelný. + Este objeto no es utilizable. + + Dieser Gegenstand ist nicht benutzbar. + Cet objet n'est pas utilisable. + Questo oggetto è inutilizzabile. + Esse item não é usável. + Nie można użyć tej rzeczy. + 这个物品不能使用。 + + + + + Processing Oil + zpracování ropy + Procesando Petróleo + + Öl wird verarbeitet... + Raffinage de Pétrole + Raffinando il Petrolio + Processando Petróleo + Rafinacja ropy + 加工石油 + + + Cutting Diamonds + řezání diamantů + Cortando Diamantes + + Diamanten werden geschliffen... + Taillage de diamant + Rifinendo diamanti + Lapidando Diamante + Szlif diamentów + 切割钻石 + + + Processing Opium + zpracování Opium + Procesando Opio + + Heroin wird verarbeitet... + Traitement d'Héroïne + Processando Eroina + Processando Heroína + Oczyszczanie heroiny + 加工海洛因 + + + Casting Copper Ingots + Casting měděných ingotů + Fundiendo Lingotes de Cobre + + Fonte du Cuivre + Kupfer wird verarbeitet... + Processando in lingotti di Rame + Processando Cobre + Wytop miedzi + 铸造铜锭 + + + Casting Iron Ingots + Litiny ingoty + Fundiendo Lingotes de Hierro + + Fonte du Fer + Eisen wird verarbeitet... + Processando Ferro + Processando Ferro + Wytop żelaza + 铸造铁锭 + + + Processing Sand + zpracování Písek + Procesando Arena + + Sand wird verarbeitet... + Fonte du Sable + Processando Sabbia + Processando Areia + Topienie piasku + 制作玻璃 + + + Processing Salt + zpracování Salt + Procesando Sal + + Salz wird verarbeitet... + Traitement du Sel + Processando Sale + Refinando Sal + Warzenie soli + 制造食盐 + + + Processing Coca Leaves + Zpracování listů koky + Procesando Hojas de Coca + + Kokain wird verarbeitet... + Traitement de Cocaïne + Processando Cocaina + Processando Cocaína + Oczyszczanie kokainy + 加工可卡因 + + + Processing Marijuana + zpracování Marihuana + Procesando Marihuana + + Marihuana wird verarbeitet... + Traitement de Marijuana + Processando Marijuana + Processando Maconha + Suszenie marihuany + 加工大麻 + + + Mixing Cement + Míchání Cement + Mezclando Cemento + + Zement wird gemischt... + Mélange de ciment + Processando Cemento + Misturando Cimento + Mielenie cementu + 制造水泥 + + + You need to stay within 10m to process. + Musíte zůstat v rozmezí 10 m zpracovat. + Debes estar a menos de 10m para procesar. + + Du musst innerhalb von 10m bleiben, um verarbeiten zu können. + Vous devez rester à 10m pour traiter vos objets. + Devi stare entro 10m per processare. + Você precisa ficar a menos de 10m para processar. + Musisz być w odległości 10 m aby przetwarzanie się odbyło. + 您需要保持10米以内的距离。 + + + You have no inventory space to process your materials. + Nemáš zásob prostor ke zpracování vašich materiálů. + Vous n'avez pas de place pour traiter vos matériaux. + Usted no tiene espacio en el inventario para procesar sus materiales. + Non hai spazio nell'inventario per elaborare i materiali. + Nie masz miejsca na przetwarzanie swoich zapasów materiałów. + Você não tem espaço no inventário para processar seus materiais. + У вас нет места инвентаря для обработки ваших материалов. + Du hast keinen Platz im Inventar, um die Materialien zu verarbeiten. + 你没有库存空间来处理你的物品。 + + + Only part of your materials could be processed due to reaching your maximum weight. + Pouze část svých materiálů by mohla být zpracována z důvodu dosažení maximální váhu. + Seule une partie de votre matériel pourrait être traité en raison de l'atteinte de votre poids maximum. + Sólo una parte de los materiales se han podido procesar debido a alcanzar tu peso máximo. + Solo una parte del tuo materiali possono essere trattati a causa di raggiungere il vostro peso massimo. + Tylko część swoich materiałów może być przetwarzane ze względu na osiągnięcie maksymalnej wadze. + Apenas uma parte de seus materiais puderam ser processados, devido o peso máximo ter sido atingido. + Только часть ваших материалов может быть обработан из-за достижения вашего максимального веса. + Nur ein Teil der Materialien konnte verarbeitet werden, sonst würde das maximale Gewicht erreicht werden. + 只有部分材料可以加工,已达到你的最大重量。 + + + You need $%1 to process without a license! + Musíte $%1 bez povolení ke zpracování! + Necesitas $%1 para procesar sin licencia! + + Du brauchst $%1, um ohne eine Lizenz verarbeiten zu können! + Vous avez besoin de $%1 pour traiter sans licence ! + Hai bisogno di $%1 per processare senza la dovuta licenza! + Você precisa de R$%1 para processar sem licença! + Musisz mieć $%1 aby przetworzyć bez odpowiedniej licencji + 你没有加工许可所以需要 $%1 加工! + + + You have processed %1 into %2 + Máte zpracovaný %1 do %2 + Has procesado %1 a %2 + + Du hast %1 in %2 verarbeitet. + Vous avez traité %1 en %2 + Hai processato %1 in %2 + Você trasformou %1 em %2 + Przetworzyłeś %1 na %2 + 你将 %1 加工为 %2 + + + You have processed %1 into %2 for $%3 + Máte zpracovaný %1 do %2 na $%3 + Has procesado %1 a %2 por $%3 + + Du hast %1 für $%3 in %2 verarbeitet. + Vous avez traité %1 en %2 pour $%3 + Hai processato %1 in %2 al costo di $%3 + Você trasformou %1 em %2 por R$%3 + Przetworzyłeś %1 na % za $%3 + 你将 %1 加工为 %2 花费 $%3 + + + + + Medics Online: %1 + Zdravotníci Online: %1 + Médicos en línea: %1 + + Sanitäter online: %1 + Médecin en ligne : %1 + Medici Online: %1 + Médicos Online: %1 + Medycy Online: %1 + 在线的医疗人员:%1 + + + Medics Nearby: %1 + Zdravotníci v blízkosti:%1 + Médicos Cerca: %1 + + Sanitäter in der Nähe: %1 + Médecin à proximité : %1 + Medici Vicini: %1 + Médicos por perto: %1 + Medycy w pobliżu: %1 + 附近的医疗人员:%1 + + + %1 is requesting EMS Revive. + %1 požaduje EMS oživit. + %1 esta pidiendo servicio médico. + + %1 benötigt medizinische Hilfe. + %1 demande de l'aide du SAMU. + %1 sta richiedendo l'intervento medico. + %1 requisitou o resgate do SAMU + %1 prosi o pomoc medyczną. + %1 要求医疗救治。 + + + Respawn Available in: %1 + Respawn K dispozici v:%1 + Puedes reaparecer en: %1 + + Réapparition disponible dans: %1 + Aufwachen verfügbar in: %1 + Respawn disponibile in: %1 + Respawn Disponível em: %1 + Odrodzenie możliwe za: %1 + 重生在: %1 + + + You can now respawn + Nyní lze respawn + Ya puedes reaparecer + + Du kannst jetzt aufwachen! + Vous pouvez désormais réapparaître + Puoi ora fare respawn + Você pode dar respawn + Możesz się odrodzić + 现在你可以重生 + + + %1 has revived you and a fee of $%2 was taken from your bank account for their services. + %1 oživil vy a poplatek ve výši $%2 byl převzat z bankovního účtu za své služby. + %1 te a revivido y una cuota de $%2 a sido tomada de tu cuenta por sus servicios. + + %1 hat dich wiederbelebt und dafür eine Gebühr von $%2 von deinem Bankkonto eingezogen. + %1 vous a réanimé, des frais de $%2 ont été transférés depuis votre compte en banque sur celui du médecin. + %1 ti ha rianimato e sono stati prelevati $%2 dal tuo conto in banca per pagare la prestazione. + %1 reviveu você e uma taxa de R$%2 foi cobrada da sua conta bancária para os serviços prestados. + %1 pobrał opłatę w wysokości $%2 za reanimację i przywrócenie funkcji życiowych. + %1 已经将你救治,从你的银行账户收取 $%2 的服务费。 + + + Someone else is already reviving this person + Někdo jiný již užívají tuto osobu + Alguien ya esta reviviendo a esta persona + + Jemand anderes belebt diese Person bereits wieder. + Quelqu'un d'autre s'occupe déjà de cette personne + Qualcun'altro sta già provando a rianimare questa persona + Outro médico já está revivendo esse jogador + Ktoś inny aktualnie reanimuje tę osobę + 其他人已经在救治这个人了 + + + Reviving %1 + Oživení %1 + Reviviendo %1 + + Wird wiederbelebt %1... + Réanimation de %1 + Rianimando %1 + Revivendo %1 + Reanimacja %1 + 救治 %1 + + + This person either respawned or was already revived. + Tato osoba buď respawned nebo již byl přijat. + Esta persona ya reapareció o fue revivida. + + Cette personne a peut-être fait réapparition ou a déjà été réanimée. + Diese Person ist entweder aufgewacht oder wurde bereits wiederbelebt. + Questa persona è stata già rianimata o ha fatto respawn. + Esse jogador já deu respawn ou já foi reanimado. + Ta osoba wcześniej się odrodziła lub została reanimowana. + 这个人重生或已经复活了。 + + + You have revived %1 and received $%2 for your services. + Obdrželi jste %1 a získal $%2 za vaše služby. + Has revivido a %1 y recivido $%2 por tus servicios. + + Du hast %1 wiederbelebt und $%2 für deine Dienste erhalten. + Vous avez réanimé %1, vous avez reçu $%2 pour votre aide + Hai rianimato %1 e hai ricevuto $%2 per la tua prestazione. + Você reviveu %1 e recebeu R$%2 pelo seus serviços prestados. + Reanimowałeś %1 i za uratowanie życia otrzymałeś $%2. + 你已经救治了 %1 并得到 $%2 的服务费用。 + + + You got to far away from the body. + Dostal jsi příliš daleko od těla. + Te alejastes mucho del cuerpo. + + Du bist zu weit vom Körper entfernt. + Vous êtes trop loin du corps. + Sei andato troppo distante dal corpo. + Você está muito distante do corpo. + Jesteś za daleko od ciała. + 你离尸体太远。 + + + + + The robbery has failed due to unknown reasons + Lupič selhalo kvůli neznámých důvodů + El robo fallo por razones desconocidas + + Der Raub ist aus unbekannten Gründen fehlgeschlagen. + Le vol de la réserve fédérale a échoué pour des raisons inconnues + La rapina è fallita per cause sconosciute + O roubo falhou por uma causa desconhecida. + Napad się nie udał z niewiadomych powodów. + 由于不明原因,抢劫失败了。 + + + $%1 was stolen from the robbery on the federal reserve + $%1 byl ukraden z loupeže na federální rezervy + $%1 fue robado de la reserva federal + + $%1 wurden von den Räubern aus der Zentralbank gestohlen. + $%1 a été volé à la réserve fédérale. + $%1 sono stati rubati durante la rapina alla banca + R$%1 foi roubado da Reserva Federal. + $%1 ukradziono z Rezerwy Federalnej + $%1 从联邦储备银行中被抢劫 + + + This vault is already being robbed by someone else + Tato klenba je již okraden někým jiným + La bóveda ya esta siendo robada por alguien mas + + Ce coffre est déjà en train d'être pillé par quelqu'un d'autre. + Der Tresor wird bereits von jemand anderem ausgeraubt. + Questo Caveau sta venendo rapinando da qualcun'altro + Esse cofre já está sendo roubado por outro jogador. + Skarbiec jest aktualnie rabowany przez inną osobę. + 这个金库已经被别人抢劫了 + + + This vault was already robbed recently + Tato klenba byla již nedávno okraden + La bóveda fue robada muy recientemente + + Der Tresor wurde bereits vor Kurzem ausgeraubt. + Ce coffre a déjà été pillé récemment + Questo Caveau è stato svaligiato di recente + Esse cofre já foi assaltado recentemente. + Skarbiec został niedawno zrabowany + 这个金库最近被抢了 + + + + + Garage + Garáž + Garaje + + Garage + Garage + Garage + Garagem + Garaż + 载具仓库 + + + Your Vehicles + Vaše Vozidla + Tus vehículos + + Deine Fahrzeuge + Vos véhicules + I tuoi Veicoli + Seus Veículos + Twój pojazd + 你的载具 + + + Vehicle Information + Informace o vozidle + Información de Vehículos + + Fahrzeuginformationen + Carte grise du vehicule + Informazioni Veicolo + Informações do Veículo + Informacja o pojeździe + 载具信息 + + + Automatically reveals nearest objects within 15m, turn this setting off if you are experiencing performance issues. + Automaticky odhaluje nejbližší objektů v rámci 15m, toto nastavení vypnete, pokud jste se setkali s problémy s výkonem. + Automáticamente revela los objetos más cercanos dentro de 15m, apaga esta opción si estas teniendo problemas de performación. + + Zeigt automatisch nächstgelegene Objekte innerhalb von 15m an, deaktiviere es, wenn du Leistungprobleme hast. + Révèle automatiquement les objets les plus proches au sein de 15m, désactiver ce paramètre si vous rencontrez des problèmes de performance. + Rivela automaticamente gli oggettivi vicini entro 15m, disattiva quest'impostazione se riscontri dei problemi di perfomance di sistema. + Revela objetos à 15m, desabilite essa opção se está tendo problemas de performance. + Automatycznie wykrywa najbliższe obiekty w promieniu 15m, wyłącz tę opcję jeśli masz problemy z wydajnością + 自动显示1500米以内的最近对象,如果你遇到性能问题,请将此设置关闭。 + + + Switch side-channel mode, turn this off if you don't want to talk with players from your side. + Přepnout do režimu side-channel, tuto funkci vypnout, pokud nechcete mluvit s hráči z vaší strany. + Activer le canal camp, désactiver cette fonction si vous ne voulez pas parler avec des joueurs de la même faction que vous. + Habilita/Deshabilita el SideChannel, apaga esto si no quieres hablar con jugador de tu lado. + Interruttore modalità side-channel, disattivare questa funzione se non si vuole parlare con i giocatori da parte vostra. + Przełącznik trybu side-channel, to wyłączyć, jeśli nie chce rozmawiać z graczami z boku. + + Habilita/Desabilita o side-channel, desabilite caso você não queira conversar com os jogadores da sua facção. + Sidechat umschalten. Ausschalten, wenn du nicht mit Spielern deiner Fraktion sprechen möchtest. + 切换侧通道模式,如果你不想和你身边的玩家交谈,关掉这个频道。 + + + Switch player's broadcast mode, turn this off if you don't want to see any broadcast from other players. + + Activer/Désactiver les annonces. Désactivez ceci si vous ne voulez voir aucune annonce d'autres joueurs. + Habilitar/Deshabilitar transmisiones, deshabilita esto si no quieres ver transmisiones de otros jugadores. + + + + Habilita/Desabilita as transmissões dos jogadores, desabilite caso você não queira ver as transmissões dos outros jogadores. + Broadcast umschalten. Ausschalten, wenn du keine Broadcasts von anderen Spielern erhalten möchtest. + 切换玩家的广播模式,如果你不想看到其他玩家的广播,就关掉它。 + + + Controls whether or not players will have name tags above their head. + Přepnout do režimu side-channel, tuto funkci vypnout, pokud nechcete mluvit s hráči z vaší strany. + Controla si los jugadores tienen nombres (tags) sobre sus cabezas. + + Contrôler si les joueurs auront ou non leurs noms au dessus de leur tête + Namensschilder umschalten. Ausschalten, wenn du keine Namensschilder über den Spielerköpfen sehen möchtest. + Controlla la visualizzazione delle tags sopra la testa dei giocatori + Controla se os jogadores terão os nomes em suas cabeças. + Kontroluje czy gracze będą mieli nad głowami swoje Tagi z nazwą + 控制球员是否有名字标签在他们的头上方。 + + + Shop Stock + Obchod Sklad + Inventario de la Tienda + + Lagerbestand + Boutique + Stock Negozio + Estoque + Sklep oferta + 商店库存 + + + + + Player Interaction Menu + Hráč Interakce Menu + Menu de Interacción de Jugadores + + Spielerinteraktionsmenü + Menu d'interaction du Joueur + Menu d'interazione Giocatore + Menu de Interação do Jogador + Menu Interakcji + 玩家互动菜单 + + + Put in vehicle + Vložíme do vozidla + Poner en vehículo + + Ins Fahrzeug setzen + Embarquer + Metti nel Veicolo + Colocar no Veículo + Włóż do pojazdu + 押上载具 + + + Un-Restrain + živelný + Quitar Esposas + + Freilassen + Démenotter + Togli Manette + Soltar + Rozkuj + 解开手铐 + + + Check Licenses + Zkontrolujte licence + Revisar Licencias + + Lizenzen überprüfen + Vérifier Licences + Controlla Licenze + Verificar Licenças + Sprawdź licencje + 检查许可证 + + + Search Player + Hledat hráče + Buscar Jugadores + + Spieler durchsuchen + Fouiller Joueur + Ricerca Giocatore + Revistar Jogador + Przeszukaj + 搜身 + + + Stop Escorting + Zastavit doprovázet + Parar de Escoltar + + Eskortieren stoppen + Arrêter Escorte + Ferma Scorta + Parar de Escoltar + Przestań eskortować + 停止押送 + + + Escort Player + Escort Player + Escoltar Jugador + + Spieler eskortieren + Escorter Joueur + Scorta Giocatore + Escoltar Jogador + Eskortuj + 押送 + + + Ticket Player + Ticket Player + Dar Tiquete + + Strafzettel ausstellen + Amende Joueur + Multa Giocatore + Multar Jogador + Wystaw mandat + 开据罚单 + + + Seize Weapons + zabavili zbraně + Confiscar Armas + + Waffen beschlagnahmen + Saisir les armes + cogliere Armi + Apreender Armas + Chwytaj broń + 没收武器 + + + Send to jail + Poslat do vězení + Encarcelar + + Ins Gefängnis stecken + Envoyer en prison + Arresta + Enviar p/ Prisão + Do więzienia + 送进监狱 + + + Repair Door + oprava dveří + Reparar Puerta + + Tür reparieren + Réparer la porte + Ripara porta + Consertar Porta + Napraw drzwi + 检修门 + + + Open / Close + Otevřít zavřít + Abrir / Cerrar + + Öffnen / Schließen + Ouvrir / Fermer + Apri / Chiudi + Abrir / Fechar + Otwórz / Zamknij + 打开/关闭 + + + Break down door + Rozebrat dveře + Romper Puerta + + Tür aufbrechen + Forcer la porte + Sfonda Porta + Quebrar Porta + Wyważ drzwi + 打破门 + + + Garage + + + + Garage + Garage + + + + 车库 + + + You can buy a garage at this house for $%1. You must first purchase the house! + + + + Du könntest eine Garage an diesem Haus für $%1 kaufen. Du müsstest aber zuerst das Haus kaufen! + Vous pouvez acheter un garage dans cette maison pour $%1. Vous devez d'abord acheter la maison ! + + + + 你可以在这所房子里买一个 $%1 的仓库。你必须先买房子! + + + Search house + Vyhledávání dům + Buscar casa + + Haus durchsuchen + Fouiller la maison + Cerca Casa + Vasculhar a Casa + Przeszukaj dom + 搜索房子 + + + Lock up house + Zamknout dům + Cerrar la casa con llave + + Haus abschliessen + Fermer la maison + Chiudi Casa + Trancar a Casa + Zamknij dom + 锁上房子 + + + Buy House + Koupit dům + Comprar casa + + Haus kaufen + Acheter la maison + Compra Casa + Comprar a Casa + Kup dom + 买房子 + + + Buy House Garage + + + + Garage kaufen + Acheter le Garage de cette Maison + + + + 买房子的仓库 + + + Sell Garage + Navrhujeme Garáž + Vender Garaje + + Garage verkaufen + Vendre le garage + Vendi Garage + Vender Garagem + Sprzedaj garaż + 出售仓库 + + + Remove Container + Nádobu + Remover Contenedor + rimuovere Container + Wyjąć pojemnik + + Supprimer le conteneur + Remover Caixa + Container entfernen + 删除存储箱 + + + Garage + Garáž + Garaje + + Garage + Garage + Garage + Garagem + Garaż + 仓库 + + + Store Vehicle + Store Vehicle + Guardar Vehiculo + + Fahrzeug parken + Ranger le véhicule + Parcheggia Veicolo + Guardar Veículo + Zaparkuj pojazd + 载具商店 + + + Sell House + prodat dům + Vender Casa + + Haus verkaufen + Vendre la maison + Vendi Casa + Vender Casa + Sprzedaj dom + 卖房子 + + + Unlock Storage + odemknout úložiště + Abrir Almacenamiento + + Lagerplatz aufschliessen + Déverrouiller l'inventaire + Sblocca contenitori + Destrancar Caixa + Odblokuj pojemnik + 解锁存储 + + + Lock Storage + zámek Storage + Cerrar Almacenamiento con Llave + + Lagerplatz abschliessen + Verrouiller l'inventaire + Blocca contenitori + Trancar Caixa + Zablokuj pojemnik + 锁定存储 + + + Turn Lights Off + Blinkrů Off + Apagar Luces + + Licht ausschalten + Lumières éteintes + Spegni luci + Ligar as Luzes + Włącz światło + 把灯关掉 + + + Turn Lights On + Turn zapnutá světla + Prender Luces + + Licht anschalten + Lumières allumées + Accendi luci + Apagar as Luzes + Wyłącz światło + 把灯打开 + + + + + Vehicle Interaction Menu + Interakce vozidel Menu + Menu de interacción de Vehículo + + Fahrzeuginteraktionsmenü + Menu Interaction du Véhicule + Menu d'interazione Veicolo + Menu do Veículo + Menu Interakcji pojazdu + 载具交互菜单 + + + Unflip Vehicle + Unflip Vehicle + Dar la Vuelta al Vehículo + + Fahrzeug umdrehen + Retourner Véhicule + Raddrizza veicolo + Desvirar Veículo + Ustaw pojazd + 翻转载具 + + + Get In Vehicle + + + + Monter dans le véhicule + Gehe ins Fahrzeug + + + + 进入载具 + + + Push Boat + tlačit loď + Empujar Bote + + Boot schieben + Pousser bateau + Spingi Barca + Empurrar Barco + Popchnij + 推船 + + + Repair Vehicle + opravy vozidel + Reparar Vehículo + + Fahrzeug reparieren + Réparer Véhicule + Ripara Veicolo + Consertar Veículo + Napraw + 修理载具 + + + Registration + Registrace + Registración + + Eigentümer + Enregistrement + Registrazione + Registro + Zarejestruj + 登记信息 + + + Search Vehicle + Vyhledávání Vehicle + Buscar Vehículo + + Fahrzeug durchsuchen + Fouiller Véhicule + Cerca Veicolo + Vasculhar Veículo + Przeszukaj pojazd + 搜查载具 + + + Search Container + Vyhledávání Container + Buscar Contenedor + Ricerca Container + Szukaj Kontener + + Fouiller le conteneur + Vasculhar Container + Container durchsuchen + 搜索容器 + + + Pullout Players + Pull Out Hráči + Sacar Jugadores + + Aus Fahrzeug ziehen + Sortir les passagers + Estrai Giocatore + Retirar Jogadores + Wyciągnij graczy + 从载具拉出玩家 + + + Impound Vehicle + úschovy Vehicle + Confiscar Vehículo + + Fahrzeug beschlagnahmen + Mise en fourrière + Sequestra Veicolo + Apreender Veículo + Usunń pojazd + 扣押载具 + + + Mine from device + Mine ze zařízení + Minar desde dispositivo + + Vom Fahrzeug abbauen + Dispositif de minage + Piazza mine dal veicolo + Minerar + Uruchom wydobycie + 矿山设备 + + + Store your vehicle + Ukládat vaše vozidlo + Guardar tu Vehículo + Conservare il veicolo + Przechowuj swój pojazd + + Ranger votre véhicule + Guardar seu veículo + Fahrzeug einparken + 存储你的载具 + + + Store + Obchod + Guardar + Negozio + Sklep + + Ranger + Guardar + Fahrzeughändler + 商场 + + + Clean + Čistý + Limpiar + Pulito + Czysty + + Nettoyer + Limpar + Reinigen + 清洁 + + + This vehicle is NPC protected. + Toto vozidlo je chráněno NPC. + Ce véhicule est protégé par un PNJ. + Este vehículo esta protegido. + Questo veicolo è protetto NPC. + Pojazd ten jest chroniony NPC. + + Esse veículo está protegido. + Dieses Fahrzeug ist NPC-geschützt. + 这载具是NPC保护的。 + + + + + Sending request to server for player information UID [%1] + Odesílání požadavku na server pro informační hráč UID [%1] + Pidiendo informacion del UID de [%1] del server + + Frage Spieler Informationen zu UID [%1] ab... + Envoi de la requête au serveur pour obtenir des informations lecteur UID [%1] + Invio richiesta al server per le informazioni del giocatore UID [%1] + Obtendo informações do UID [%1] no servidor + Wysyłam żądanie do serwera po informację o fraczu UID [%1] + 发送请求到服务器玩家信息UID [%1] + + + The server didn't find any player information matching your UID, attempting to add player to system. + Server nenašel žádné informace hráče nalezen.Chcete UID, pokusu o přidání hráče do systému. + No se encontro ninguna información con tu UID, se esta creando un nuevo jugador. + + Der Server hat keine Spieler Informationen zu deiner UID gefunden, versuche Spieler ins System hinzuzufügen... + Le serveur n'a pas trouvé toutes les informations de lecteur correspondant à votre UID, tentative d'ajout du joueur dans le système. + Il server non ha trovato alcuna informazione sul giocatore con il tuo UID, tentativo di aggiunta del giocatore al sistema. + O servidor não encontrou nenhuma informação correspondente ao seu UID, tentando adicionar jogador ao sistema. + Serwer nie odnalazł informacji zgodnych z UID, dodaję gracza do bazy danych. + 服务器没有找到任何玩家信息匹配你的UID,试图添加播放器系统。 + + + There was an error in trying to setup your client. + Došlo k chybě při pokusu o nastavení vašeho klienta. + Hubo un error en tratando de preparar tu cliente. + + Es gab einen Fehler beim Versuch, deinen Clienten einzurichten! + Il y avait une erreur en essayant de configurer votre client. + C'è stato qualche errore nel cercare di inizializzare il tuo client + Ocorreu um erro ao tentar configurar o seu cliente. + Wystąpił błąd w trakcie ustawiania klienta + 试图设置客户机时出错。 + + + Received request from server... Validating... + Obdržení požadavku ze serveru ... Ověřování ... + Pedido del server recibido... Validando... + + >Empfange Daten vom Server... Überprüfe... + Demande reçue du serveur... Validation... + Ricevuta richiesta dal server... Convalida... + Pedido recebido do servidor... Validando... + Otrzymano żądanie serwera ... sprawdzam + 接收来自服务器的请求...验证... + + + You have already used the sync option, you can only use this feature once every 5 minutes. + Již jste použili možnosti synchronizace, můžete použít pouze tuto funkci jednou za 5 minut. + Ya has usado la función de sincronización, solo la puedes usar una vez cada 5 minutos. + + Du hast bereits deine Daten gespeichert, diese Funktion kann nur einmal alle 5 Minuten verwendet werden. + Vous avez déjà utilisé l'option de synchronisation, vous ne pouvez utiliser cette fonction une fois toutes les 5 minutes. + Hai già utilizzato la funzione di salva dati, puoi usare quest'opzione solo una volta ogni 5 minuti. + Você já usou a opção de sincronização, você só pode usar esse recurso uma vez a cada 5 minutos. + Użyłeś niedawno opcji synchronizacji, możesz jej używać maksymalnie co 5 minut. + 你已经使用了同步数据,你只能每隔5分钟使用一次这个功能。 + + + Syncing player information to the server.\n\nPlease wait up to 20 seconds before leaving. + Synchronizace informace o hráčích na serveru. \ O \ Prosím, vyčkejte až 20 sekund před odjezdem. + Se esta sinconizando tu información con el server.\n\nPor favor espera 20 segundos antes de salir del server. + + Speichere deine Spieler-Informationen auf dem Server. \n\nBitte warte bis zu 20 Sekunden vor dem Verlassen. + Synchronisation des informations de joueur sur le serveur.\n\nS'il vous plaît, veuillez attendre 20 secondes avant de vous déconnecter. + Salvando le informazioni giocatore sul server.\n\nAttendere fino a 20 secondi prima di abbandonare. + Sincronizando informação do jogador com o servidor.\n\n Por favor aguarde 20 segundos antes de sair. + Synchronizuję informację z serwere, .\n\nProszę poczekać ok 20 sekund przed opuszczeniem serwera + 同步玩家数据到服务器。\n\n请等待20秒后再下线。 + + + + + Because you robbed the bank you can't use the ATM for %1 minutes. + Protože jste vyloupil banku nelze použít bankomat pro%1 minut. + Porque robastes el banco no puedes usar el ATM por %1 minutos. + + Da du die Zentralbank ausgeraubt hast, kannst du für %1 Minuten keinen Bankomaten benutzen. + Vous avez pillé la banque, vous ne pouvez pas utiliser de DAB pendant %1 minutes. + Avendo appena rapinato la banca non puoi utilizzare il Bancomat per %1 minuti. + Você não pode usar o ATM por %1 minuto(s), pois você assaltou o banco. + Z uwagi na to że okradłeś bank nie możesz korzystać z bankomatu przez najbliższe %1 minut. + 因为你抢了银行,你不能在 %1 分钟内使用自动取款机。 + + + You didn't choose the clothes you wanted to buy. + Vy nevybral oblečení, které chtěl koupit. + No elegistes lo que quieres comprar. + + Du hast die Kleidung, die du kaufen wolltest, nicht ausgewählt. + Vous n'avez pas choisi les vêtements que vous vouliez acheter. + Non hai selezionato i vestiti che vuoi comprare. + Você não selecionou a roupa que deseja comprar. + Nie wybrałeś ubrań które chcesz kupić. + 你没有选择你想买的衣服。 + + + Sorry sir, you don't have enough money to buy those clothes. + Je nám líto, pane, nemáte dost peněz na nákup ty šaty. + No tienes suficiente dinero. + + Entschuldigung, du hast nicht genug Geld, um diese Kleidung zu kaufen. + Désolé monsieur, vous n'avez pas assez d'argent pour acheter ces vêtements. + Spiacente ma non hai fondi a sufficienza per comprare questi vestiti. + Desculpe senhor, você não tem dinheiro para pagar. Volte sempre. + Przepraszam, ale nie masz tyle pieniędzy aby kupić to ubranie. + 对不起,你没有足够的钱去买那些衣服。 + + + Total: + Celkový: + Total: + + Gesamt: + Total : + Totale: + Total: + Razem: + 总额: + + + No Selection + žádný výběr + No Seleccionastes + + Keine Auswahl! + Aucune Sélection + Nessuna Selezione + Nada Selecionado + Nie wybrano + 没有选择 + + + No Display + Ne Displej + No Display + + Keine Anzeige! + Pas d'affichage + No Display + Sem exibir + Brak widoku + 没有显示 + + + There are no vehicles near to sell. + Nejsou žádné vozy blízko k prodeji. + No hay Vehículos cercanos para vender. + + Es ist keine Fahrzeug zum Verkaufen in der Nähe. + Il n'y a pas de véhicules à proximité à vendre + Nelle vicinanze non ci sono veicoli da vendere. + Não existem veículos para serem vendidos. + W pobliżu nie ma pojazdu do sprzedania. + 附近没有载具出售。 + + + There was a problem opening the chop shop menu. + Tam bylo otevření nabídky kotleta obchod problém. + Hubo un problema abriendo el menu de la tienda. + + Es gab ein Problem beim Öffnen des Schrotthändler Menüs. + Il y a eu un problème en ouvrant le menu de revente de véhicule. + C'è stato un problema aprendo il menu del ricettatore + Ocorreu um problema abrindo o menu, tente novamente. + Powstał problem przy otwieraniu menu dziupli + 打开黑车店菜单有问题。 + + + Selling vehicle please wait... + Prodejní vozidlo čekejte prosím ... + Vendiendo vehículo, por favor espera... + + Verschrotte Fahrzeug, bitte warten... + Vente du véhicule, veuillez patienter... + Vendendo il veicolo, attendere prego... + Vendendo o veiculo, aguarde.... + Sprzedaję pojazd proszę czekać ... + 出售载具请稍候... + + + You need to be a civilian to use this store! + Musíte být civilní použít tento obchod! + Necesitas ser un civil para usar esta tienda! + + Du musst ein Zivilist sein, um dieses Geschäft nutzen zu können! + Vous devez être un civil pour utiliser ce magasin ! + Devi essere un civile per utilizzare questo negozio! + Você tem que ser um cívil para user essa loja! + Musisz być cywilem aby móc kupować w tym sklepie! + 你需要成为平民才能使用这家商店! + + + You need to be a cop to use this store! + Musíte být policista použít tento obchod! + Necesitas ser policía para usar esta tienda! + + Du musst ein Polizist sein, um dieses Geschäft nutzen zu können! + Vous devez être policier pour utiliser ce magasin ! + Devi essere un poliziotto per utilizzare questo negozio! + Você tem que ser um policial para usar essa loja! + Musisz być policjantem aby kupować w tym sklepie! + 你需要当警察来使用这家商店! + + + You don't have rebel training yet! + Nemáte rebelů výcvik ještě! + No tienes Entrenamiento Rebelde! + + Du hast keine Rebellenausbildung absolviert! + Vous n'avez pas encore d'entraînement rebelle ! + Devi essere ribelle per poter utilizzare questo negozio! + Você não tem Treinamento Rebelde! + Nie posiadasz treningu rebelianta! + 你还没有进行叛军训练! + + + You need a Diving license to use this shop! + Potřebujete licenci potápění použít tento obchod! + Necesitas una licencia de buceo para usar esta tienda! + + Du benötigst einen Taucherschein, um dieses Tauchergeschäft nutzen zu können! + Vous devez avoir votre diplôme de plongée pour utiliser ce magasin ! + Ti serve la licenza di pesca per usare questo negozio! + Você precisa de uma Licença de Mergulho para usar essa loja! + Nie posiadasz licencji nurka aby kupować w tym sklepie! + 你需要一张潜水执照才能使用这家商店! + + + You need a %1 to buy from this shop! + Potřebujete %1 koupit od tomto obchodě! + Necesitas un %1 para comprar algo de esta tienda! + + Du benötigst eine %1, um dieses Geschäft nutzen zu können! + Vous avez besoin de %1 pour acheter dans ce magasin ! + Hai bisogno di %1 per comprare da questo negozio! + Você precisa de %1 para comprar nessa loja! + Potrzebujesz %1 by kupować w tym sklepie! + 你需要从这家商店买 %1! + + + Clothing + Oblečení + Ropa + + Kleidung + Tenues + Abiti + Roupas + Odzież + 服装 + + + Hats + klobouky + Sombreros + + Kopfbedeckungen + Chapeaux + Copricapi + Chapéus + Czapki + 帽子 + + + Glasses + Brýle + Lentes + + Brillen + Lunettes + Occhiali + Óculos + Okulary + 眼镜 + + + Vests + vesty + Chalecos + + Westen + Gilets + Vesti + Coletes + Kamizelki + 背心 + + + Backpack + Batoh + Mochillas + + Rucksack + Sacs à dos + Zaini + Mochilas + Plecaki + 背包 + + + There is currently a car there. + Tam je v současné době auto. + Actualmente hay un carro ahi. + + Es steht bereits ein Fahrzeug dort. + Il y a actuellement une voiture. + C'è già un veicolo qui. + Há um veiculo atualmente no respawn. + Aktualnie jest tam samochód. + 目前有一载具在那里。 + + + You do not have enough money on you or in your bank to get your car back. + Nemáte dostatek peněz na vás nebo ve vaší bance, aby si své auto zpátky. + No tienes suficiente dinero para recuperar tu carro. + + Du hast nicht genug Geld bei dir oder auf dem Bankkonto, um dein Auto auslösen zukönnen. + Vous n'avez pas assez d'argent sur vous ou dans votre compte en banque pour récupérer votre voiture. + Non hai abbastanza fondi con te o nel tuo conto in banca per poter ritirare il tuo veicolo. + Você não tem dinheiro suficiente em sua conta bancária para obter seu veiculo. + Nie masz tyle pieniędzy na koncie aby wyciągnąć samochód. + 你没有足够的钱在银行或你的身上。 + + + You have unimpounded your %1 for $%3 + Jste unimpounded svůj %1 na $%3 + Has desembargado tu %1 por $%3 + + Du hast deinen %1 für $%3 ausgelöst. + Vous avez sorti votre %1 pour $%3 + Hai ritirato dal sequestro il tuo %1 al costo di $%3 + Você liberou %1 for R$%3 + Przywróciłeś swój %1 za $%3 + 你为 %1 花费 $%3 + + + You did not pick a vehicle! + Vy nevybral vozidlo! + No has selecionado un vehículo! + + Du hast kein Fahrzeug ausgewählt! + Vous n'avez pas choisi de véhicule ! + Non hai selezionato un veicolo! + Você não conseguiu roubar o veiculo! + Nie wybrałeś pojazdu! + 你没有选择一载具! + + + You do not have enough cash to purchase this vehicle.\n\nAmount Lacking: $%1 + Nemáte dostatek peněz na koupi tohoto vozidla \n\nAmount Postrádat: $%1 + No tienes suficiente dinero para comprar este vehículo.\n\nFalta: $%1 + + Du hast nicht genug Geld, um das Fahrzeug zu kaufen.\n\nFehlender Betrag: $%1 + Vous n'avez pas assez d'argent pour acheter ce véhicule \n\nArgent Manquant: $%1 + Non hai fondi sufficienti per comprare questo veicolo.\n\nTi mancano: $%1 + Você não tem dinheiro suficiente para comprar esse veiculo.\n\nFaltam: R$%1 + Nie masz tyle pieniędzy by kupić ten pojazd.\n\nBrakuje: $%1 + 你没有足够的现金购买这载具。\n\n缺少资金: $%1 + + + You do not have the required license and/or level! + Nemáte požadovanou licenci! + No tienes la licencia requerida! + + Du besitzt den benötigten Führerschein / Rang nicht! + Vous n'avez pas la licence requise ! + Non hai la licenza richiesta per l'acquisto! + Você não tem a licença necessária! + Nie posiadasz odpowiedniej licencji! + 你没有所需的许可证和/或级别! + + + There is a vehicle currently blocking the spawn point + Tam je vozidlo v současné době blokuje potěr bod + Hay un vehículo bloqueando el punto de Spawn. + + Ein Fahrzeug blockiert gerade den Spawnpunkt. + Il y a actuellement un véhicule qui bloque le point de spawn + C'è già un veicolo che blocca la zona di spawn + Existe um veiculo bloquenado a area de respaw + Inny pojazd blokuje miejsce odrodzenia pojazdów + 目前有一载具挡住了生成点。 + + + You bought a %1 for $%2 + Koupil sis %1 pro $%2 + Comprastes %1 por $%2 + + Du kaufst eine(n) %1 für $%2. + Vous avez acheté un %1 pour $%2 + Hai comprato un %1 al costo di $%2 + Você comprou %1 por R$%2 + Kupiłeś %1 za $%2 + 你买了一个 %1 花费 $%2 + + + You rented a %1 for $%2 + Pronajali jste si %1 za $%2 + Alquiló un %1 por $%2 + Вы арендовали %1 за $%2 + Sie haben %1 für $%2 gemietet + Vous avez loué un %1 pour $%2 + Hai noleggiato un %1 per $%2 + Você alugou um %1 por $%2 + Wypożyczyłeś %1 za $%2 + 您以 $%2 的价格租了一个 %1 + + + Rental Price: + Pronájem Cena: + Precio de Renta: + + Mietpreis: + Prix de location : + Costo Noleggio: + Alugar: + Wypożyczenie: + 租赁价格: + + + Ownership Price: + Vlastnictví Cena: + Precio de Compra: + + Kaufpreis: + Prix d'achat : + Costo Acquisto: + Comprar: + Kupno: + 所有权价格: + + + Max Speed: + Maximální rychlost: + Máxima Velocidad: + + Max. Geschwindigkeit: + Vitesse Max : + Velocità Max: + Velocidade Máxima: + Prędkość: + 最大速度: + + + Horse Power: + Koňská síla: + Caballos de Fuerza: + + Pferdestärken: + Puissance en chevaux : + Cavalli: + Cavalos de Força: + Moc: + 马力: + + + Passenger Seats: + Sedadla pro cestující: + Asientos de Pasajeros: + + Passagierplätze: + Sièges passager : + Sedili passeggeri: + Assentos: + Ilość miejsc: + 乘客座位: + + + Trunk Capacity: + Zavazadlový prostor Kapacita: + Capacidad de Maletero: + + Kofferraumgröße: + Capacité du coffre : + Capacità Inventario: + Capacidade do Inventário: + Pojemność bagażnika: + 后备箱容积: + + + Fuel Capacity: + Palivo Kapacita: + >Capacidad de Combustible: + + Tankgröße: + Capacité du réservoir : + Capacità Serbatoio: + Capacidade do Reservatório: + Pojemność baku: + 燃料容量: + + + Armor Rating: + Armor Hodnocení: + Clasificación de Armadura: + + Panzerungsbewertung: + Blindage : + Resistenza: + Resistência: + Pancerz + 护甲值: + + + Retrieval Price: + Retrieval Cena: + Precio de Recuperación: + + Einstellpreis: + Prix de sortie : + Costo di ritiro: + Preço para Recuperar: + Koszt wyciągnięcia: + 检索价格: + + + Sell Price: + Prodejní cena: + Precio de Venta: + + Verkaufspreis: + Prix de vente : + Costo di vendita: + Preço de Venda + Cena sprzedaży: + 出售价格: + + + Color: + Barva: + Color: + + Farbe: + Couleur : + Colore: + Cor: + Kolor + 颜色: + + + You are not allowed to use this shop! + Ty jsou není dovoleno používat tento obchod! + No tienes permiso de usar esta tienda! + + Du bist nicht befugt, dieses Geschäft zu benutzen! + Vous n'êtes pas autorisé à utiliser cette boutique ! + Non sei autorizzato ad usare questo negozio! + Você não está autorizado a utilizar essa loja! + Nie jesteś uprawniony do używania tego sklepu! + 不许你使用这家商店! + + + You need to select an item to buy. + Je třeba vybrat položku, kterou chcete koupit. + Debes selecionar un objeto para comprar. + + Du musst einen Gegenstand auswählen, um ihn zu kaufen. + Vous devez sélectionner un objet pour l'acheter. + Seleziona un oggetto per poterlo comprare. + Você precisa selecionar um item para comprar. + Musisz zaznaczyć co chcesz kupić. + 你需要选择要购买的物品。 + + + You didn't enter an actual number + Nezadal jste skutečný počet + No metistes un numero real + + Du hast keine echte Zahl eingegeben. + Vous n'avez pas saisi un nombre réel + Non hai inserito correttamente un numero + Você não digitou um número válido. + Nie podałeś aktualnego numeru + 你没有输入一个正确的数字 + + + You don't have that many items to sell! + Nemusíte, že mnoho položek k prodeji! + No tienes tantos objetos! + + Du hast nicht so viele Gegenstände zum Verkaufen! + Vous n'avez pas autant d'objets à vendre ! + Non hai tutti quegli oggetti da vendere! + Você não tem todos esse items para vender + Nie masz tak dużo rzeczy do sprzedania! + 你没有那么多物品可以出售! + + + The gang has enough funds to pay for this, would you like to pay with the gangs funds or your own? + Gang má dostatek finančních prostředků na zaplacení za to, byste chtěli platit fondů bandy nebo sami? + Tu pandilla tiene suficiente dinero para pagar esto, quieres pagar con ese dinero o el tuyo? + + Die Gang hat genügend Geld, um dafür zu zahlen. Willst du mit dem Geld der Gang oder deinem Eigenem bezahlen? + Le gang a suffisamment de fonds pour payer pour cela, voulez-vous payer avec les fonds de gangs ou avec votre propre argent ? + La Gang ha fondi a sufficienza per pagare questo oggetto, vuoi usare i fondi della Gang o i tuoi personali? + A Gangue tem dinheiro suficiente para pagar por isso, você gostaria de usar o dinheiro da Gangue? + Gang posiada wystarczającą ilość środków aby za to zapłacić, chcesz zapłacić za to środkami gangu, czy własnymi? + 帮派有足够的钱来支付这笔钱,你愿意用帮派的钱还是自己的钱? + + + Gang Funds: + Gang fondy: + Fondos de Pandilla: + + Geld der Gang: + Fonds du gang : + Fondi Gang: + Fundos da Gangue: + Środki gangu: + 帮派资金: + + + Your Cash: + Váš Cash: + Tu dinero: + + Bargeld: + Votre argent : + Tuoi Fondi: + Seu Dinheiro: + Twoje środki: + 你的现金: + + + Pay with cash or gang funds + Platit v hotovosti nebo gangů fondů + Pagar con tu dinero o el de tu pandilla? + + Mit Bargeld oder Geld der Gang bezahlen? + Payez avec votre argent ou avec les fonds du gang + Paga con i tuoi contanti o con i fondi della Gang + Pagar com a sua conta ou a da Gangue + Zapłać gotówką albo środkami gangu + 用现金或帮派基金支付 + + + Gang Funds + Gang fondy + Fondos de la Pandilla + + Geld der Gang + Fonds du gang : + Fondi Gang + Gangue + Środki gangu + 帮派资金 + + + Your Cash + Váš Cash + Tu dinero + + Bargeld: + Votre argent + Tuoi Fondi + Seu + Twoje środki + 你的现金 + + + You bought %1 %2 for $%3 with the gangs funds + Koupili jste% %1 %2 za $ 3 s fondy gangů + Comprastes %1 %2 por $%3 con el dinero de la pandilla + + Du kaufst %1 %2 für $%3 mit dem Geld der Gang + Vous avez acheté %1 %2 pour $%3 avec les fonds gangs + Hai comprato %1 %2 al costo di $%3 con i fondi della Gang + Você comprou %1 %2 por R$%3 com o dinheiro da gangue + Kupiłeś %1 %2 za $%3 ze środków gangu + 你购买 %1 %2 花费 $%3 帮派基金 + + + You bought %1 %2 for $%3 + Koupili jste% %1 2 na $ %3 + Comprastes %1 %2 por $%3 + + Du hast %1 %2 für $%3 gekauft. + Vous avez acheté %1 %2 pour $%3 + Hai comprato %1 %2 al costo di $%3 + Voce comprou %1 %2 por R$%3 + Kupiłeś %1 %2 za $%3 + 你购买 %1 %2 花费 $%3 + + + You sold %1 %2 for $%3 + Prodali jste% %1 2 na $ %3 + Vendistes %1 %2 por $%3 + + Du hast %1 %2 für $%3 verkauft. + Vous avez vendu %1 %2 pour $%3 + Hai venduto %1 %2 al prezzo di $%3 + Você vendeu %1 %2 por R$%3 + Sprzedałeś %1 %2 za $%3 + 你出售 %1 %2 得到 $%3 + + + You need to select an item to buy/sell. + Je třeba vybrat položku na buy / sell. + Necesitas seleccionar un objetar para vender/comprar. + + Du musst einen Gegenstand auswählen, um ihn zu kaufen / zu verkaufen. + Vous devez sélectionner un objet à acheter/vendre. + Devi selezionare un oggetto per comprare/vendere. + Selecione um item para comprar ou vender. + Musisz wybrać rzecz którą chcesz kupić/sprzedać + 你需要选择一个物品来购买/出售。 + + + You sold a %1 for <t color='#8cff9b'>$%2</t> + prodával jsi %1 pro <t color='#8cff9b'>$%2</t> + Vendistes un %1 por <t color='#8cff9b'>$%2</t> + + Du hast eine %1 für <t color='#8cff9b'>$%2</t> verkauft. + Vous avez vendu un %1 pour <t color='#8cff9b'>$%2</t> + Hai venduto un %1 al prezzo di <t color='#8cff9b'>$%2</t> + Você vendeu %1 por <t color='#8cff9b'>R$%2</t> + Sprzedałeś %1 za <t color='#8cff9b'>$%2</t> + 你出售 %1 得到 <t color='#8cff9b'>$%2</t> + + + You bought a %1 for <t color='#8cff9b'>$%2</t> with the gangs funds. + Koupil sis %1 pro <t color='#8cff9b'>$%2</t> s peněžními prostředky gangů. + Comprastes un %1 por <t color='#8cff9b'>$%2</t> con los fondos de tu pandilla. + + Du hast mit dem Geld der Gang eine %1 für <t color='#8cff9b'>$%2</t> gekauft. + Vous avez acheté un %1 pour <t color='#8cff9b'>$%2</t> avec les fonds du gang. + Hai comprato un %1 al costo di <t color='#8cff9b'>$%2</t> con i fondi della Gang. + Você comprou %1 por <t color='#8cff9b'>R$%2</t> com o dinheiro da gangue. + Kupiłeś %1 za <t color='#8cff9b'>$%2</t> ze środków gangu. + 你购买 %1 花费 <t color='#8cff9b'>$%2</t> 黑帮基金。 + + + You bought a %1 for <t color='#8cff9b'>$%2</t> + Koupil sis %1 pro <t color='#8cff9b'>$%2</t> + Comprastes un %1 por <t color='#8cff9b'>$%2</t> + + Du hast eine %1 für <t color='#8cff9b'>$%2</t> gekauft. + Vous avez acheté un %1 pour <t color='#8cff9b'>$%2</t> + Hai comprato un %1 al costo di <t color='#8cff9b'>$%2</t> + Você comprou %1 por <t color='#8cff9b'>R$%2</t> + Kupiłeś %1 za <t color='#8cff9b'>$%2</t> + 你购买 %1 花费 <t color='#8cff9b'>$%2</t> + + + Shop Inventory + Obchod Zásoby + Inventario de la Tienda + + Ladeninventar + Inventaire de la boutique + Inventario Negozio + Loja de Inventário + Wyposażenie sklepu + 店铺库存 + + + Your Inventory + Váš Inventory + Tu inventario + + Dein Inventar + Votre inventaire + Inventario Personale + Seu Inventário + Twoje wyposażenie + 你的库存 + + + + + You will receive your next paycheck in %1 minutes. + Obdržíte svůj další výplatní pásku v %1 minut. + Recibiras tu siguiente pago en %1 minutos + + Du erhältst deinen nächsten Gehaltsscheck in %1 Minuten. + Vous recevrez votre prochaine paye dans %1 minutes. + Riceverai il tuo prossimo stipendio in %1 minuti. + Você irá receber seu próximo pagamento em %1 minuto(s). + Otrzymasz kolejną wypłatę w ciągu %1 minut. + 你将在 %1 分钟后收到你的下一张薪水支票。 + + + You have missed a paycheck because you were dead. + Jste vynechal výplatu, protože jste byli mrtví. + Te has perdido un pago por estar muerto. + + Du erhältst kein Gehaltsscheck, da du gestorben bist. + Vous n'avez pas reçu votre paye en raison de votre mort. + Hai perso uno stipendio . + Você não recebeu seu pagamento pois estava morto. + Ominęła cię wypłata ponieważ byłeś martwy. + 因为你死了,你错过了薪水。 + + + You have received a paycheck of $%1. + Dostali jste výplatu ve výši $ %1. + Has recibido un pago de $%1 + + Du hast deinen Gehaltscheck in Höhe von $%1 erhalten. + Vous avez reçu votre paye de $%1. + Hai ricevuto uno stipendio di $%1. + Você recebeu seu pagamento de R$%1. + Otrzymałeś wypłatę w kwocie $%1. + 你收到了一张 $%1 的薪水支票。 + + + + + Refuel Fuel Canister + Tankovat paliva kanystr + Ravitailler le bidon en carburant + Llenar Bidón de Combustible + Fare rifornimento di carburante scatola metallica + Tankowanie paliwa Canister + Reabastecer de combustível vasilha + Заправить баллон с горючим + Benzinkanister befüllen + 给汽油桶加油 + + + Refuel Vehicle + tankovací Vehicle + Llenar Vehículo + Fare rifornimento di veicoli + Tankowanie samochodów + + Reabastecer Veículo + Ravitailler en essence le véhicule + Fahrzeug auftanken + 给车加油 + + + Price per Liter: $%1 + Cena za litr: $ %1 + Precio por Litro: $%1 + Prezzo al litro: $%1 + Cena za litr: $%1 + + Preço por Litro : R$%1 + Prix au Litre : $%1 + Preis pro Liter: $%1 + 每升价格:$%1 + + + Current Fuel Amount: + Aktuální výše Palivo: + Quantité de carburant actuelle : + Actual cantidad de combustible: + Quantità corrente di benzina: + Aktualny Ilość paliwa: + + Quantidade Atual de Combustível: + Aktuelle Kraftstoffmenge: + 当前燃料量: + + + Select a vehicle + Vyberte si vůz + Selecciona un Vehículo + Selezionare un veicolo + Wybierz pojazd + + Selecione um veículo + Sélectionner un vehicule + Wähle ein Fahrzeug: + 选择载具 + + + The vehicle is too far or you are in! + Vozidlo je příliš daleko, nebo jste se! + El Vehículo esta muy lejos o tu estas adentro! + Il veicolo è troppo lontano o vi sei all'interno! + Pojazd jest zbyt daleko lub jesteś w! + + O veículo está muito longe ou você está nele! + Le véhicule est peut-etre trop loin, ou tu es dedans ! + Das Fahrzeug ist zu weit entfernt oder du sitzt noch drin! + 载具太远了,或者你在载具里! + + + The vehicle is full! + Vozidlo je plná! + El Vehículo esta lleno! + Il veicolo è pieno! + Pojazd jest pełna! + + O veículo está cheio! + Le véhicule est plein ! + Das Fahrzeug ist voll! + 载具已满! + + + + + Drop Fishing Net + Drop rybářská síť + Tirar Red de Pesca + + Fischernetz auswerfen + Lancer le filet de pêche + Drop Fishing Net + Jogar Rede de Pesca + Zarzuć sieć + 放下渔网 + + + Rob Person + Rob Pearson + Robar Persona + + Person ausrauben + Voler la personne + Deruba + Roubar Jogador + Obrabuj osobę + 抢劫此人 + + + + + Fish Market + Rybí trh + Marché aux poissons + Mercado de Pescado + + Fischmarkt + Peixaria + Sklep rybny + Pescivendolo + 海产品市场 + + + Hospital + Nemocnice + Hôpital + Hospital + + Krankenhaus + Hospital + Szpital + Ospedale + 医院 + + + Police Station + Policejní stanice + Poste de police + Estación de Policia + + Polizei Revier + Estação Policial + Posterunek policji + Questura + 警察分局 + + + Police Air HQ + Police Air HQ + Base aérienne de la Police + Cuartel Aéreo Policial + QG Aereo Polizia + + Polizei HQ Flughafen + QG Aéreo Policial + Baza lotnicza policji + 警察航空总部 + + + Iron Mine + Železný důl + Mine de fer + Mina de Hierro + + Eisenmine + Mina de Ferro + Kopalnia miedzi + Miniera di ferro + 铁矿 + + + Salt Mine + Solný důl + Mine de sel + Mina de Sal + + Salzmine + Mina de Sal + Kopalnia soli + Salina + 盐矿 + + + Salt Processing + sůl Processing + Traitement de sel + Procesador de Sal + + Salzverarbeitung + Processador de Sal + Warzelnia soli + Processo del sale + 食盐制造厂 + + + Altis Corrections + Altis Opravy + Prison d'Altis + Prisión de Altis + + Altis Bundesgefängnis + Prisão de Altis + Więzienie Altis + Penitenziario di Altis + 监狱 + + + Tanoa Corrections + Tanoa Opravy + Prison de Tanoa + Prisión de Tanoa + + Tanoa Bundesgefängnis + Prisão de Tanoa + Więzienie Tanoa + Penitenziario di Tanoa + Tanoa更正 + + + Police HQ + Police HQ + QG de la police + Comisaria de Policía + QG Polizia + + Polizei HQ + QG Policial + KG Policji Altis + 警察总部 + + + Coast Guard + pobřežní hlídka + Garde-côte + Guardia Costera + + Küstenwache + Guarda Costeira + Straż przybrzeżna + Guardia Costiera + 海岸警卫队 + + + Rebel Outpost + Rebel Outpost + Avant-Poste Rebelle + Base Rebelde + Avamposto Ribelle + + Rebellen Außenposten + Base Rebelde + Baza rebeliantów + 叛军前哨 + + + Air Shop + Air Shop + Concessionnaire aérien + Tienda Aérea + Negozio Aereo + + Luftfahrzeug Händler + Loja Aérea + Sklep lotniczy + 空中载具商店 + + + Truck Shop + Truck Shop + Vendeur de camion + Tienda de Camiones + + LKW Händler + Loja de Caminhões + Salon ciężarówek + Concessionaria Camion + 卡车商店 + + + Oil Processing + Zpracování olej + Traitement du Pétrole + Procesador de Petróleo + + Öl Verarbeiter + Processador de Petróleo + Rafineria ropy naftowej + Raffineria di Petrolio + 石油加工 + + + Iron Processing + Zpracování Iron + Traitement du Fer + Procesador de Hierro + Processo del ferro + + Eisenschmelze + Processador de Ferro + Huta żelaza + 铁矿加工 + + + Sand Mine + písek Mine + Mine de Sable + Mina de Arena + Miniera di sabbia + + Sand Mine + Mina de Areia + Kopalnia piasku + 采沙场 + + + Chop Shop + Chop Shop + Revendeur de véhicules volés + Desguace Clandestino + Ricettatore + + Schrotthändler + Desmanche + Dziupla + 黑车店 + + + Cocaine Processing + Zpracování kokain + Traitement de Cocaïne + Procesador de Cocaína + Trattamento cocaina + + Kokain Verarbeiter + Processador de Cocaína + Oczyszczanie kokainy + 可卡因加工点 + + + Copper Mine + měděný důl + Mine de Cuivre + Mina de Cobre + Miniera di rame + + Kupfermine + Mina de Cobre + Kopalnia miedzi + 铜矿 + + + ATM + bankomat + DAB + ATM + ATM + + Geldautomat + Caixa Eletrônico + Bankomat + 自动取款机 + + + Local Bank + místní bankovní + Banque locale + Banco Local + Banca locale + + Zentralbank + Banco Local + Bank Altis + 银行 + + + Car Shop + Auto Shop + Concessionnaire + Tienda de Coches + Concessionario d `auto + + Autohändler + Loja de Carros + Salon samochodowy + 小汽车店 + + + Hospital/Clinic + Nemocnice / Klinika + Clinique + Hospital/Clínica + Ospedale / Clinica + + Krankenhaus + Hospital/Clínica + Klinika Altis + 医院/诊所 + + + Diamond Mine + Diamond Mine + Mine de diamant + Mina de Diamantes + Miniera di diamanti + + Diamanten Mine + Mina de Diamante + Kopalnia diamentów + 钻石矿场 + + + General Store + Obchod se smíšeným zbožím + Magasin général + Tienda General + Strumenti Generali + + Supermarkt + Loja de Equipamentos + Sklep techniczny + 物品商店 + + + Civilian Shops + civilní Obchody + Magasins civils + Tiendas Civiles + Negozi civili + + Geschäft für Zivilisten + Lojas Civis + Sklepy dla cywilów + 平民商店 + + + Boat Shop + Lodní Shop + Concessionnaire de bateaux + Tienda de Barcos + Concessionaria Nautica + + Boots Händler + Loja de Barcos + Sklep z łodziami + 船舶商店 + + + Bruce's Outback Outfits + Bruceovy Outback Oblečení + Vêtements de Bruce + Tienda de Ropa + Outfit di Bruce + + Loja de Roupas + Sklep odzieżowy + Bruce's Outback Outfits + 服装店 + + + Apple Field + Apple Field + Champs de Pommes + Campo de Manzanas + Campo di Mele + + Apfel Plantage + Campo de Maçãs + Sad jabłkowy + 苹果树林 + + + Peaches Field + broskve Field + Champs de Pêches + Campo de Melocotones + Campo di Pesche + + Pfirsich Plantage + Campo de Pêras + Sad brzoskwiniowy + 桃树林 + + + Market + Trh + Marché + Mercado + Mercato + + Markt + Mercado + Market spożywczy + 市场 + + + Air Service Station + Stanice Air Service + Réparateur Aérien + Estación de Servicio Aéreo + Stazione Servizio Aereo + + Werkstatt für Luftfahrzeuge + Estação de Serviços Aéreos + Serwis lotniczy + 航空服务站 + + + Channel 7 News + Channel 7 News + Chaine d'infos Numéro 7 + Canal de Noticias 7 + Notiziario di Altis + + Kanal 7 Nachrichtensender + Canal de Notícias 7 + Maszt nadawczy + 新闻广播电台 + + + DMV + DMV + Magasin de licences + Registro de Licencias + + Zulassungstelle + Loja de Licenças + Urząd licencyjny + Licenze + 许可证办理 + + + Delivery Missions + Dodací mise + Missions de livraison + Misiones de Entrega + + Kurier Mission + Missões de Entrega + Misje kurierskie + Missioni Postali + 快递任务 + + + Deliver Package + doručit balíček + Livrer le paquet + Entregar Paquete + + Paket ausliefern + Entregar Pacote + Dostarcz przesyłkę + Consegna il pacco + 完成快递任务 + + + Get Delivery Mission + Získat Delivery mise + Obtenir Mission de livraison + Empezar Misión de Entrega + + Starte Kurier Mission + Pegar Missão de Entrega + Pobierz przesyłkę do dostarczenia + Ottieni una missione postale + 得到快递任务 + + + Diving Shop + Potápění Shop + Boutique de plongée + Tienda de Buceo + + Steve's Taucherausrüstung + Loja de Mergulho + Akcesoria do nurkowania + Negozio da Sub + 潜水店 + + + Drug Dealer + Drug prodejce + Dealeur de drogue + Narcotraficante + + Drogendealer + Traficante + Diler narkotyków + Spacciatore + 毒贩 + + + Diamond Processing + Diamond Processing + Traitement du diamant + Procesador de Diamante + + Diamantenschleifer + Processador de Diamante + Szlifierz diamentów + Processo diamanti + 钻石加工 + + + Oil Field + Ropné poles + Champ de Pétrole + Campo de Petróleo + + Öl Felder + Campo de Petróleo + Szyb naftowy + Giacimento di Petrolio + 油田 + + + Marijuana Field + Marihuana Field + Champ de Marijuana + Campo de Marihuana + + Marihuana Plantage + Campo de Maconha + Pole marihuany + Campo di Marijuana + 大麻产地 + + + Marijuana Processing + Zpracování marihuana + Traitement de la Marijuana + Procesador de Marihuana + + Marihuana Verarbeitung + Processador de Maconha + Suszarnia marihuany + Trattamento Marijuana + 大麻加工 + + + Boat Spawn + Lodní potěr + Port + Spawn de Barcos + + Boot Spawn + Spawn de Barcos + Przystań + Consegna Barche + 码头 + + + Copper Processing + Zpracování měď + Traitement du cuivre + Procesador de Cobre + + Kupferschmelze + Processador de Cobre + Huta miedzi + Processo Rame + 铜矿加工 + + + Coca Field + Coca Field + Champ de Cocaïne + Campo de Cocaína + + Kokain Plantage + Campo de Cocaína + Pole kokainy + Campo di Cocaina + 可卡因树林 + + + Oil Trader + olej Trader + Vendeur de pétrole + Comerciante de Petróleo + + Öl Händler + Comprador de Petróleo + Skup benzyny + Vendita Olio + 石油贸易商 + + + Salt Trader + sůl Trader + Vendeur de sel + Comerciante de Sal + + Salz Händler + Comprador de Sal + Skup soli + Vendita Sale + 食盐贸易商 + + + Diamond Trader + Diamond Trader + Vendeur de diamant + Comerciante de Diamantes + + Juwelier + Comprador de Diamante + Skup diamentów + Vendita Diamanti + 钻石贸易商 + + + Glass Trader + sklo Trader + Vendeur de verre + Comerciante de Vidrio + + Glasbläserei + Comprador de Vidro + Skup szkła + Vendita del Vetro + 玻璃贸易商 + + + Iron / Copper Trader + Žehlička / Měď Trader + Vendeur de minerais + Comerciante de Hierro / Cobre + + Industriehandel + Comprador de Ferro e Cobre + Skup metali + Vendita del Ferro/Rame + 铁/铜交易商 + + + Sand Processing + Zpracování písek + Traitement du sable + Procesador de Arena + + Sand Verarbeiter + Processador de Areia + Huta szkła + Processo Sabbia + 玻璃制造厂 + + + Gun Store + Gun Store + Armurerie + Tienda de Armas + + Waffengeschäft + Loja de Armas + Sklep z bronią + Armeria + 武器商店 + + + Opium Poppy Field + Opium Poppy Field + Champ d'héroïne + Campo de Opio + Opium Poppy Field + + Heroin Plantage + Campo de Heroína + Pole heroiny + 罂粟产地 + + + Heroin Processing + Zpracování heroin + Traitement d'héroïne + Procesador de Heroina + Processing eroina + + Heroin Verarbeitung + Processador de Heroína + Oczyszczanie heroiny + 海洛因加工点 + + + Garage + Garáž + Garage + Garaje + Box auto + + Garage + Garagem + Garaż + 载具仓库 + + + Federal Reserve + federální rezervní systém + Banque fédérale + Reserva Federal + + Zentralbank + Reserva Federal + Bank Rezerw Federalnych + Banca Federale + 金库 + + + Highway Patrol Outpost + Dálniční hlídka Outpost + Avant-poste de Police + Puesto de Patrulla de Carretera + + Mautstation + Base da Polícia Rodoviária + Posterunek policji drogowej + Checkpoint di polizia + 公路巡逻队 + + + Rock Quarry + kamenolomu + Mine de pierres + Mina de Piedra + + Steinbruch + Pedreira + Kamieniołom + Cava di Roccia + 采矿石场 + + + Rock Processing + rock Processing + Traitement de pierres + Procesador de Piedra + + Stein Verarbeitung + Processador de Pedra + Wytwórnia cementu z kamienia + Processo Roccia + 水泥制造厂 + + + Cement Trader + cement Trader + Vendeur de ciments + Comerciante de Cemento + + Zement Händler + Comprador de Cimento + Skup cementu + Vendita del Cemento + 水泥贸易商 + + + Turtle Poaching + Turtle pytláctví + Réserve protégée de tortues + Caza de Tortugas + Bracconaggio di Tartarughe + + Wilderei für Schildkröten + Área de Tartarugas + Strefa występowania żółwi morskich + 海龟捕猎区 + + + Turtle Dealer + Turtle prodejce + Dealeur de Tortues + Traficante de Tortugas + + Schildkröten Händler + Comprador de Tartarugas + Skup żółwi + Vendita Tartarughe + 海龟走私商 + + + Go-Kart Shop + Go-Kart Shop + Concessionnaire de karts + Tienda de Go-Kart + + Bobby's Gokarthandel + Loja de Karts + Sklep z GoKartami + Parco Go-Kart + 卡丁车店 + + + Gold Bars Buyer + Gold Bary kupujícího + Acheteur d'Or + Comprador de Oro + + Goldhändler + Comprador de Barras de Ouro + Skup złota + Gioielliere + 金条买家 + + + Gang Hideout 1 + Gang Hideout 1 + Cachette 1 + Escondite de Pandillas 1 + + Gang Versteck 1 + Esconderijo de Gangs 1 + Kryjówka gangu 1 + Covo Gang 1 + 帮派据点1 + + + Gang Hideout 2 + Gang Hideout 2 + Cachette 2 + Escondite de Pandillas 2 + + Gang Versteck 2 + Esconderijo de Gangs 2 + Kryjówka gangu 2 + Covo Gang 2 + 帮派据点2 + + + Gang Hideout 3 + Gang Hideout 3 + Cachette 3 + Escondite de Pandillas 3 + + Gang Versteck 3 + Esconderijo de Gangs 3 + Kryjówka gangu 3 + Covo Gang 3 + 帮派据点3 + + + Hunting Grounds + honební revír + Terrain de chasse + Zona de Caza + + Jagdgebiet + Área de Caça + Strefa polowań + Riserva di Caccia + 狩猎场 + + + Rebel Clothing Shop + Rebel Oblečení Shop + Vêtements rebelle + Tienda de Ropa Rebelde + Rebel negozio di abbigliamento + + Rebellen Kleidungsgeschäft + Loja de Roupas Rebeldes + Magazyn rebelianta + 叛军服装店 + + + Rebel Weapon Shop + Rebel obchodu se zbraněmi + Armurerie rebelle + Tienda de Armas Rebeldes + + Rebellen Waffenhändler + Loja de Armas Rebeldes + Zbrojownia rebelianta + Armeria della Guerriglia + 叛军武器店 + + + Helicopter Shop + vrtulník Shop + Concessionnaire aérien + Tienda de Helicópteros + Elicottero negozio + + Helikopter Händler + Loja de Helicópteros + Sklep lotniczy + 飞行载具店 + + + Fuel Station Store + Palivo Store Station + Cafet' de Station + Tienda de Gasolinera + Stazione di rifornimento Conservare + + Tankstelle + Loja de Conveniência + Sklep OLLEN + 加油站商店 + + + Rebel Market + Rebel Market + Marché Rebelle + Mercado Rebelde + mercato Rebel + + Rebellen Markt + Mercado Rebelde + Market rebelianta + 叛军市场 + + + Question Dealer + Otázka prodejce + Questionner le dealer + Informante + + Informant + Perguntar ao Traficante + Przesłuchaj dilera + Minaccia Spacciatore + 询问经销商 + + + Service Helicopter + Service Vrtulník + Service d'hélicoptère + Helicóptero de Servicio + + Helikopter Werkstatt + Serviço Aéreo + Serwisuj pojazd lotniczy + Servizio Aereo + 维修直升机 + + + Clothing Store + Obchod s oblečením + Vêtements + Tienda de Ropa + + Kleidungsgeschäft + Loja de Roupas + Sklep odzieżowy + Vestiario + 服装店 + + + Medical Assistance + lékařská pomoc + Assistance médicale + Asistencia Médica + + Medizinischer Ersthelfer + Assistência Médica + Pomoc medyczna + Assistenza Medica + 医疗救助 + + + Store vehicle in Garage + Skladovat vozidlo v garáži + Ranger le véhicule dans le garage + Guardar vehículo en el Garaje + + Fahrzeug in Garage einparken + Guardar veículo na Garagem + Umieść pojazd w garażu + Deposita veicolo in garage + 将载具存放在仓库 + + + Cop Item Shop + Cop Item Shop + Magasin de la Police + Tienda de Objetos de Policía + Strumenti + + Polizei Ausrüstung + Loja de Items da Polícia + Zaopatrzenie + 警察物品商店 + + + Cop Clothing Shop + Cop Oblečení Shop + Vêtements de policier + Tienda de Ropa de Policía + Uniformi + + Polizei Uniformen + Loja de Roupas da Polícia + Umundurowanie + 警察服装店 + + + Cop Weapon Shop + Cop obchodu se zbraněmi + Armurerie de Police + Tienda de Armas de Policía + Armeria da Agenti + + Polizei Waffengeschäft + Loja de Armas da Polícia + Broń policji + 警察武器店 + + + Patrol Officer Weapon Shop + Policistou obchodu se zbraněmi + Armurerie d'officier + Tienda de Armas de Oficial de Patrulla + Armeria da Pattuglia + + Loja de Armas de Patrulha + Broń patrolowa + Streifenpolizist Waffengeschäft + 巡警武器商店 + + + Sergeant Weapon Shop + Seržant obchodu se zbraněmi + Armurerie de sergent + Tienda de Armas de Oficial de Sargento + Armeria dei Sergenti + + Lojas de Armas de Sargento + Broń sierżanta + Sergeant Waffengeschäft + 警长武器商店 + + + Vehicle Shop + Shop Vehicle + Concessionnaire de véhicule + Tienda de Vehículos + di veicoli + + Autohändler + Loja de Carros + Pojazdy - sklep + 载具商店 + + + Process Sand + proces Písek + Traiter le sable + Procesar Arena + + Verarbeite Sand + Processar Areia + Przetop piasek na szkło + Lavorazione Sabbia + 把沙子制造成玻璃 + + + Process Rock + proces rock + Traiter la pierre + Procesar Piedra + + Verarbeite Stein + Processar Pedra + Zmiel skały na cement + Processo Roccia + 把矿石制造成水泥 + + + Wong's Food Cart + Křídla Food košík + Magasin de Wong + Kiosko de Wong + Wong Food Cart + + Wong's Spezialitäten + Boteco do Wongs + Bar u Wonga + 食品商人 + + + Open Vault + otevřená Vault + Ouvrir coffre + Abrir Bóveda + Apri Cassaforte + + Geöffneter Tresor + Abrir Cofre + Otwórz skarbiec + 打开金库 + + + Fix Vault + Fix Vault + Réparer coffre + Reparar Bóveda + + Tresor reparieren + Consertar Cofre + Napraw skarbiec + Ripara Cassaforte + 修复金库 + + + Federal Reserve - Front Entrance + Federální rezervní systém - přední vchod + Banque fédérale - Entrée avant + Reserva Federal - Entrada Principal + Riserva Federale - Entrata Frontale + + Zentralbank - Haupteingang + Reserva Federal - Entrada Frontal + Rezerwa federalna - wejście główne + 金库-前门 + + + Federal Reserve - Side Entrance + Federální rezervní systém - Boční vchod + Banque fédérale - Entrée latérale + Reserva Federal - Entrada Lateral + Riserva Federale - Ingresso laterale + + Zentralbank - Seiteneingang + Reserva Federal - Entrada Lateral + Rezerwa federalna - wejście boczne + 金库-侧门 + + + Federal Reserve - Back Entrance + Federální rezervní systém - zadní vchod + Banque fédérale - Entrée Arrière + Reserva Federal - Entrada Trasera + Riserva Federale - Ingresso sul Retro + + Zentralbank - Hintereingang + Reserva Federal - Entrada Traseira + Rezerwa federalna - wejście tylne + 金库-后门 + + + Federal Reserve - Vault View + Federální rezervní systém - Vault View + Banque fédérale - Voir Coffre + Reserva Federal - Vista a la Bóveda + Riserva Federale - Vista della Cassaforte + + Zentralbank - Tresor + Reserva Federal - Visão do Cofre + Rezerwa federalna - skarbiec + 金库-保险箱 + + + Turn Off Display + Vypnout displej + Désactiver l'affichage + Apagar el Display + Disattivare la visualizzazione + + Bildschirm ausschalten + Desligar Monitor + Wyłącz wyświetlacz + 关闭显示 + + + Armament + Vyzbrojení + Armement + Armamento + Armamento + + Rüstkammer + Armamento + Zbrojownia gangu + 武器装备 + + + EMS Item Shop + EMS Item Shop + Magasin de médecin + Tienda de Objetos de Médico + Strumenti EMS + + Sanitäter Ausrüstung + Loja de Items Médicos + Wyposażenie medyczne + 医疗物品店 + + + EMS Clothing Shop + EMS Oblečení Shop + Uniformes du SAMU + Tienda de Ropa de Médico + Uniformi EMS + + Sanitäter Kleidungsgeschäft + EMS Roupa Loja + Sklep odzieżowy EMS + 医疗服装店 + + + Helicopter Garage + vrtulník Garáž + Garage d'hélicoptère + Garaje de Helicóptero + Garage d'Elicotteri + + Helikopter Hangar + Garagem Aérea + Hangar lotniczy + 直升机库 + + + Car Garage + Car Garage + Garage de voitures + Garaje de Coches + + Fahrzeug Garage + Garagem de Carros + Hangar lotniczy + Garage Automobili + 载具仓库 + + + Pay Bail + Pay Bail + Payer la caution + Pagar Fianza + + Zahle Kaution + Pagar Fiança + Zapłać kaucję + Paga cauzione + 支付保释金 + + + + + Remove Uniform + Remove Uniform + Remove Uniform + Remove Uniform + Entferne Kleidung + Retirer uniforme + Remove Uniform + Remove Uniform + Remove Uniform + 删除制服 + + + Remove Hat + Remove Hat + Remove Hat + Remove Hat + Entferne Kopfbedeckung + Retirer chapeau + Remove Hat + Remove Hat + Remove Hat + 删除帽子 + + + Remove Glasses + Remove Glasses + Remove Glasses + Remove Glasses + Entferne Brille + Retirer lunettes + Remove Glasses + Remove Glasses + Remove Glasses + 删除眼镜 + + + Remove Vest + Remove Vest + Remove Vest + Remove Vest + Entferne Weste + Retirer gilet + Remove Vest + Remove Vest + Remove Vest + 删除背心 + + + Remove Backpack + Remove Backpack + Remove Backpack + Remove Backpack + Entferne Rucksack + Retirer sac + Remove Backpack + Remove Backpack + Remove Backpack + 删除背包 + + + Casual Wears + Casual Wears + Casual Wears + Casual Wears + Büro Kleidung + Casual Wears + Casual Wears + Casual Wears + Casual Wears + 休闲装 + + + Hat and Bandana + Hat and Bandana + Hat and Bandana + Hat and Bandana + Mütze und Kopftuch + Chapeau et bandana + Hat and Bandana + Hat and Bandana + Hat and Bandana + 帽子和头巾 + + + Cop Uniform + Cop Uniform + Cop Uniform + Cop Uniform + Polizei Uniform + Uniforme de service + Cop Uniform + Cop Uniform + Cop Uniform + 警察制服 + + + EMS Uniform + EMS Uniform + EMS Uniform + EMS Uniform + Sanitäter Uniform + Uniforme du SAMU + EMS Uniform + EMS Uniform + EMS Uniform + 医疗制服 + + + EMS Backpack + EMS Backpack + EMS Backpack + EMS Backpack + Sanitäter Rucksack + Sac à dos SAMU + EMS Backpack + EMS Backpack + EMS Backpack + 医疗背包 + + + Flashbang + Flashbang + Flashbang + Flashbang + Blendgranate + Flashbang + Flashbang + Flashbang + Flashbang + 闪光弹 + + + Stun Pistol + Stun Pistol + Stun Pistol + Stun Pistol + Betäubungs-Pistole + Taser + Stun Pistol + Stun Pistol + Stun Pistol + 眩晕手枪 + + + Taser Rifle + Taser Rifle + Taser Rifle + Taser Rifle + Betäubungs-Gewehr + Fusil taser + Taser Rifle + Taser Rifle + Taser Rifle + 泰瑟步枪 + + + Taser Rifle Magazine + Taser Rifle Magazine + Taser Rifle Magazine + Taser Rifle Magazine + Betäubungs-Gewehr-Magazine + Chargeurs de fléchettes électriques + Taser Rifle Magazine + Taser Rifle Magazine + Taser Rifle Magazine + 泰瑟步枪弹匣 + + + Northern Rebel Base + Northern Rebel Base + Northern Rebel Base + Northern Rebel Base + Nord Rebellen Basis + Base rebelle Nord + Northern Rebel Base + Northern Rebel Base + Northern Rebel Base + 北部叛军基地 + + + Southern Rebel Base + Southern Rebel Base + Southern Rebel Base + Southern Rebel Base + Süd Rebellen Basis + Base rebelle Sud + Southern Rebel Base + Southern Rebel Base + Southern Rebel Base + 南部叛军基地 + + + Eastern Rebel Base + Eastern Rebel Base + Eastern Rebel Base + Eastern Rebel Base + Ost Rebellen Basis + Base rebelle Est + Eastern Rebel Base + Eastern Rebel Base + Eastern Rebel Base + 东部叛军基地 + + + North Western Rebel Base + North Western Rebel Base + North Western Rebel Base + North Western Rebel Base + Nord-West Rebellen Basis + Base rebelle Nord-Ouest + North Western Rebel Base + North Western Rebel Base + North Western Rebel Base + 西北叛军基地 + + + North Eastern Rebel Base + North Eastern Rebel Base + North Eastern Rebel Base + North Eastern Rebel Base + Nord-Ost Rebellen Basis + Base rebelle Nord-Est + North Eastern Rebel Base + North Eastern Rebel Base + North Eastern Rebel Base + 东北叛军基地 + + + Kavala Hospital + Kavala Hospital + Kavala Hospital + Kavala Hospital + Kavala Krankenhaus + Hôpital de Kavala + Kavala Hospital + Kavala Hospital + Kavala Hospital + Kavala医院 + + + Athira Regional + Athira Regional + Athira Regional + Athira Regional + Athira Krankenhaus + Hôpital d'Athira + Athira Regional + Athira Regional + Athira Regional + Athira地区 + + + Pyrgos Hospital + Pyrgos Hospital + Pyrgos Hospital + Pyrgos Hospital + Pyrgos Krankenhaus + Hôpital de Pyrgos + Pyrgos Hospital + Pyrgos Hospital + Pyrgos Hospital + Pyrgos医院 + + + South East Hospital + South East Hospital + South East Hospital + South East Hospital + Süd-Ost Krankenhaus + Hôpital du Sud-Est + South East Hospital + South East Hospital + South East Hospital + 东南医院 + + + Tanouka Regional + Tanouka Regional + Tanouka Regional + Tanouka Regional + Tanouka Krankenhaus + Hôpital de Tanouka + Tanouka Regional + Tanouka Regional + Tanouka Regional + Tanouka地区 + + + North East Airport Hospital + North East Airport Hospital + North East Airport Hospital + North East Airport Hospital + Nord-Ost Flughafen Krankenhaus + Hôpital de l'aéroport + North East Airport Hospital + North East Airport Hospital + North East Airport Hospital + 东北机场医院 + + + North Airport HQ + North Airport HQ + North Airport HQ + North Airport HQ + Nord Flughafen HQ + Base aérienne nord + North Airport HQ + North Airport HQ + North Airport HQ + 北部机场总部 + + + South Western Airport HQ + South Western Airport HQ + South Western Airport HQ + South Western Airport HQ + Süd-Westliche HQ Flughafen + Base aérienne sud-ouest + South Western Airport HQ + South Western Airport HQ + South Western Airport HQ + 西南机场总部 + + + + + Vehicular Manslaughter + dopravní zabití + Vol de véhicule + Homicidio Vehicular + Omicidio colposo veicolare + Kołowego Manslaughter + + Atropelamento + Fahrlässige Tötung + 载具撞人 + + + Manslaughter + Zabití + Homicide involontaire + Homicidio + Omicidio colposo + Zabójstwo + + Homicidio Involuntario + Totschlag + 过失杀人 + + + Escaping Jail + Jak uniknout vězení + Evasion de prison + Escaparse de la Cárcel + Fuga dalla prigione + Uciekając Jail + + Fuga da Prisão + Ausbruch + 逃离监狱 + + + Attempted Auto Theft + Pokusili Theft Auto + Tentative de vol de véhicule + Atentado: Robo de Vehículo + Tentativo di furto d'auto + Próba Theft Auto + + Tentativa de Roubo de Veiculo + Versuchter Autodiebstahl + 企图盗窃载具 + + + Use of illegal explosives + Používání nelegálních výbušnin + Utilisation d'explosifs illégaux + Uso de Explosivos Ilegales + Uso di esplosivi illegali + Używanie nielegalnych materiałów wybuchowych + + Uso de explosivos ilegais + Verwendung von illegalen Sprengstoff + 使用非法爆炸物 + + + Robbery + Loupež + Vol + Robo + Rapina + Rozbój + + Roubo + Raub + 抢劫 + + + Kidnapping + Únos + Enlèvement + Secuestro + Rapimento + Porwanie + + Sequestro + Entführung + 绑架 + + + Attempted Kidnapping + pokus o únos + Tentative de kidnapping + Atentado: Secuestro + + Tentativa de Sequestro + Versuchte Entführung + Tentativo di rapimento + Próba porwania + 绑架未遂 + + + Public Intoxication + veřejné Intoxikace + Intoxication publique + Intoxicación Pública + + Uso de Droga em Publico + Öffentlicher Drogenmissbrauch + Uso di stupefacenti in pubblico + Upojenie publiczny + 公共场合使用非法药品 + + + Grand Theft + velká loupež + Vol de voiture + Robo Mayor + grande furto + Wielka kradzież + + Grande Roubo + Auto Diebstahl + 盗窃 + + + Petty Theft + Petty Theft + Petit vol + Robo Menor + piccoli furti + Drobnych kradzieży + + Pequeno Roubo + Kleiner Diebstahl + 小偷小摸 + + + Hit and run + Zavinit nehodu a ujet + Délit de fuite + Pega y Corre + Mordi e fuggi + Uderz i uciekaj + + Fugir de Batida + Fahrerflucht + 交通肇事后逃逸 + + + Drug Possession + držení drog + Possession de drogue + Posesión de Drogas + possesso di droga + Posiadanie narkotyków + + Posse de Droga + Drogenbesitz + 持有毒品 + + + Intent to distribute + Intent distribuovat + Intention de distribuer + Intención de Distribuir + + Tentativa de Trafico + Versuchter Drogenhandel + Tentativo di spaccio + Zamiarem dystrybucji + 意图散布 + + + Drug Trafficking + Obchodování s drogami + Trafic de drogue + Tráfico de Drogas + + Trafico de Drogas + Drogenhandel + Vendita di droga + Handel narkotykami + 贩毒 + + + Burglary + loupež + Cambriolage + Robo de Casa + furto con scasso + Włamanie + + Arrombamento + Einbruch + 盗窃 + + + Tax Evasion + Daňový únik + Évasion fiscale + Evadir Impuestos + + Evasão Fiscal + Steuerhinterziehung + Evasione delle tasse + Unikanie podatków + 逃税 + + + Terrorism + Terorismus + Terrorisme + Terrorismo + + Terrorismo + Terrorismus + Terrorismo + Terroryzm + 恐怖主义 + + + Unlicensed Hunting + Volně prodejné Hunting + Chasse sans licence + Caza sin Licencia + + Caça sem Licença + Jagen ohne Jagdschein + Caccia senza licenza + Polowanie nielicencjonowane + 无证狩猎 + + + Organ Theft + Organ Krádež + Vol d'organes + Robo de Organos + organo furto + Narząd kradzieżą + + Roubo de Orgãos + Organ Diebstahl + 盗窃公共财物 + + + Attempted Organ Theft + Pokus o krádež Organ + Tentative de vol d'organes + Atentado: Robo de Organos + Tentativo furto di organi + Próba kradzieży narządów + + Tentativa de Roubo de Orgãos + Versuchter Organ Diebstahl + 盗窃公共财物未遂 + + + Driving without license + Jízda bez povolení + Conducir sin Licencia + + Absence du permis de conduire + Dirigir sem Licença + Fahren ohne Führerschein + Guida senza patente + Jazda bez licencji + 无证驾驶 + + + Driving on the wrong side of the road + Jízda v špatným směrem do ulice + Conducir en el lado incorrecto de la calle + + Conduite sur le mauvais côté de la route + Dirigindo no sentido contrario + Guida Contromano + Jazda po niewłaściwej stronie drogi + Fahren in die falsche Richtung der Straße + 在错误的道路上驾驶 + + + Not respecting the signalizations + Nerespektování signalizací + No respetar las señales + + Non respect des signalisations + Não respeitar as sinalizações + Nicht unter Beachtung der Signalisierungen + Mancato rispetto dei segnali stradali + Nie przestrzegając sygnalizacji czy + 不遵守交通灯号 + + + Speeding + rychlá jízda + Exceso de Velocidad + + Excès de vitesse + Excesso de Velocidade + Geschwindigkeitsüberschreitung + Eccesso di velocità + Przyśpieszenie + 超速 + + + No headlight in the night + No světel v noci + Manejar sin luces en la noche + + Absence de phare la nuit + Farois Apagados Durante a Noite + Fahren ohne Licht + Luci spente durante la notte + Brak świateł w nocy + 夜间不开车灯 + + + Driving kart without helmet + Hnací motokáru bez helmy + Manejar un Kart sin casco + + Non-port du casque en Kart + Dirigindo Kart Sem Capacete + Fahren ohne Helm + Guida di Kart senza casco + Jazda bez kasku gokarta + 驾驶卡丁车不戴安全头盔 + + + Badly parked vehicle + Špatně zaparkované vozidlo + Vehículo mal estacionado + + Véhicule mal garé + Veículo Mal Estacionado + Parksünder + Veicolo mal parcheggiato + Źle zaparkowany samochód + 乱停放载具 + + + Rebel vehicle (Not armed) + Rebel vozidla (není ozbrojený) + Vehículo Rebelde (No Armado) + + Véhicule rebel non armé + Veículo Rebelde(Não Armado) + Rebellen Fahrzeug (nicht bewaffnet) + Veicolo blindato(Non armato) + Rebel pojeździe (nie czuwa) + 叛军载具(无武装) + + + Grand Theft (Civilian Vehicle) + Grand Theft (Civilian Vehicle) + Robo Mayor (Vehículo Civil) + + Vol de véhicule civil + Roubo de Veículo (Veículo Civil) + Schwerer Diebstahl (Zivilfahrzeug) + Furto di veicolo (Civile) + Grand Theft (Cywilny Vehicle) + 盗窃载具(民用载具) + + + Grand Theft (Military Vehicle) + Grand Theft (Military Vehicle) + Robo Mayor (Vehículo Militar) + + Vol de véhicule militaire + Roubo de Veículo(Militar) + Schwerer Diebstahl (Dienstfahrzeug) + Furto di veicolo militare + Grand Theft (pojazd wojskowy) + 盗窃载具(军用载具) + + + Armored Vehicle + obrněné vozidlo + Vehículo Blindado + + Véhicules blindés + Veículo Armado + Panzerfahrzeug + Veicolo D'assalto + Opancerzony pojazd + 装甲载具 + + + Flying over the city without authorization + Létání nad městem bez povolení + Volar sobre la ciudad sin autorización + + Survol de ville sans autorisation + Sobrevoando sobre a cidade sem autorização + Fliegen über die Stadt ohne Genehmigung + Guida di velivolo su città abitata senza autorizzazione + Latające nad miastem bez zezwolenia + 未经授权飞越城市 + + + Closing the street without authorization + Uzavření ulici bez povolení + Cerrar las calles sin autorización + + Interdiction de se poser sans autorisation + Fechar Rua Sem Autorização + Absperren der Straße ohne Genehmigung + Impedimento del traffico senza permesso + Zamknięcie ulicy bez zezwolenia + 擅自堵塞街道 + + + Open carry in city (Legal Weapon) + open carry ve městě (právní Weapon) + Cargar Arma Abiertamente en la Ciudad (Arma Legal) + Aprire il trasporto in città (Arma Legale) + Otwarty Carry w mieście (prawny Weapon) + + Arme légale visible en ville + Portar em Cidades(Arma Legal) + Offenes Tragen einer legalen Waffe in der Stadt + 公开携带武器进入城市(合法武器) + + + Rebel weapon + Rebel zbraň + Arma Rebelde + + Armes rebelles + Arma Rebelde + Rebellen Waffe + Arma Ribelle + Rebel bronią + 叛军武器 + + + Illegal clothing + Nelegální oblečení + Ropa Ilegal + abbigliamento illegale + Nielegalna odzież + + Vêtements illégaux + Roupas Ilegais + Illegale Kleidung + 非法服装 + + + Hiding face (Mask) + Schovává tvář (Mask) + Ocultar su Cara (Máscara) + Nascondere faccia (Mask) + Ukrywając twarz (maska) + + Cacher son visage + Esconder o Rosto(Mascara) + Verstecken des Gesichts (Maske) + 隐藏面部(面具) + + + Refuses to cooperate + Odmítá spolupracovat + Reusa a Cooperar + Si rifiuta di collaborare + Odmawia współpracy + + Refus d'obtempérer + Recusou-se a Cooperar + Behinderung der Staatsgewalt + 拒绝合作 + + + Hit and run + Zavinit nehodu a ujet + Golpea y Corre + Mordi e fuggi + Uderz i uciekaj + + Délit de fuite + Bater e Fugir + Fahrerflucht + 交通肇事逃逸 + + + Insulting a civilian + Urážky civilní + Insultar a un Civil + + Insulte envers un civil + Insulto a Civil + Beleidigung + Insulto a civile + Obrażanie cywilem + 侮辱平民 + + + Insulting a soldier + Urážky vojáka + Insultar a un Soldado + + Insulte envers un militaire + Insulto as Autoridades + Beamtenbeleidigung + Insulto a pubblico ufficiale + Znieważenie żołnierza + 侮辱士兵 + + + Drug dealing + Urážky vojáka... + Venta de Drogas + + Trafique de drogue + Trafico de Drogas + Drogenhandel + Traffico di droga + Handel narkotykami + 毒品交易 + + + Federal Reserve breaking + Federální rezervní systém lámání + Entrar a la Reserva Federal + + Intrusion dans la réserve fédérale + Invasão a Reserva Federal + Bankeinbruch + Rapina alla Riserva Federale + Rezerwa Federalna łamanie + 非法打开金库 + + + Killing of a civilian + Zabíjení civilní + Homicidio de un Civil + Uccisione di un civile + Zabójstwo cywilnej + + Meurtre d'un civil + Matou um Civil + Töten eines Zivilen + 杀害平民 + + + Killing of a soldier + Zabití vojáka + Homicidio de un Soldado + + Meurtre d'un militaire + Matou um Policial + Töten eines Beamten + Omicidio di un agente + Zabijając żołnierza + 杀害士兵 + + + + + Gas Storage + Gas Storage + Stockage de gaz + Almacenamiento de Combustible + Stoccaggio di Gas + Magazynów gazu + + Treibstofflager + Posto de Combustível + 燃料储存 + + + Supply + Zásobování + Ravitailler + Suministro + Fornitura + Dostawa + + Liefern + Abastecer + 供应 + + + Store + Obchod + Déposer + Guardar + Negozio + Sklep + + Lagern + Guardar + 商场 + + + Stop + Stop + Arrêter + Parar + Stop + Zatrzymać + + Stoppen + Parar + 停止 + + + Tanker is already in use. + Tankery je již používán. + Le camion citerne est déjà en cours d'utilisation. + El Camión Cisterna ya esta siendo usado. + La cisterna è già in uso. + Cysterna jest już w użyciu. + + Tankwagen wird bereits benutzt. + Os tanques já estão em uso. + 油轮已投入使用。 + + + Gas station is in use. + Čerpací stanice je v provozu. + La station-service est en cours de fonctionnement. + La estación ya se esta usando. + La stazione di benzina è già in uso. + Stacja benzynowa jest w użyciu. + + Tankstelle wird bereits beliefert. + O posto já está sendo usado. + 加油站在使用中。 + + + Tanker is empty. + Tankery je prázdný. + Le camion citerne est vide. + El Camión cisterna esta vacío. + La cisterna è vuota. + Cysterna jest pusta. + + Treibstofftank ist leer. + Os tanques estão vazios. + 油轮是空的。 + + + Tankers is full. + Tankery je plná. + Réservoir plein. + El Camión cisterna esta lleno. + La cisterna è piena. + Zbiornikowce jest pełna. + + Treibstofftank ist voll. + Os tanques estão cheios. + 油轮已满。 + + + Gas station has enough fuel. + Čerpací stanice má dostatek paliva. + La station service a suffisamment de carburant. + La estación tiene suficiente gasolina. + Il distributore ha abbastanza benzina. + Stacja benzynowa ma wystarczającą ilość paliwa. + + Tankstelle hat genug Treibstoff. + O posto tem combustível suficiente. + 加油站有足够的燃料。 + + + This gas station is supplied through a pipeline. + Tento Čerpací stanice se dodává potrubím. + Cette station service est fournie par un pipeline + Esta estación es suministrada por una tubería. + Questa stazione di gas è alimentata attraverso una tubatura. + Ta stacja gaz jest dostarczany rurociągiem. + + Diese Tankstelle wird über eine Pipeline versorgt. + Esse posto é abastecido através de uma mangueira. + 这个加油站通过管道供给。 + + + Discontinued operation. + Ukončená činnost. + Activité abandonnée. + Operación discontinuada. + Incarico Incompleto. + Działalność zaniechana. + + Vorgang abgebrochen. + Operação descontinuada. + 停止运营。 + + + Your share is $%1. + Váš podíl $%1. + Votre part est de $%1. + Tu ganancia es $%1. + La vostra quota è di $%1. + Twój udział jest $%1. + + Dein Anteil beträgt $%1. + A sua parte é de R$%1. + 你的份额为 $%1. + + + + + Mission Failed + Mise selhala + Mission échouée + Misión fallida + Missione fallita + Misja nie powiodła się + Missão fracassada + Миссия провалена + Mission fehlgeschlagen. + 任务失败 + + + You are not white-listed to use this slot. + Mise selhala + Vous n'êtes pas white-listé. + No tienes permiso de usar este slot. + Missione fallita + Misja nie powiodła się + Missão fracassada + Миссия провалена + Nicht auf der Whitelist. + 你不是白名单不能使用这个栏位。 + + + You are not allowed to use this slot because you do not have the appropriate permissions. Try another slot. + Ty jsou není dovoleno používat tento slot, protože nemáte příslušná oprávnění. Zkuste použít jiný slot. + Vous n'êtes pas autorisé à utiliser cet emplacement parce que vous ne disposez pas des autorisations appropriées. Essayez un autre emplacement. + No puede usar este slot porque no tiene los permisos requeridos. Por favor trate con otro slot. + Non è consentito usare questo slot, perché non si dispone delle autorizzazioni appropriate. Prova un altro slot. + Nie wolno korzystać z tego gniazda, ponieważ nie masz odpowiednich uprawnień. Spróbuj użyć innego gniazda. + Você não tem permissão para usar esse slot, porque você não tem as permissões apropriadas. Tente outro slot. + Вы не можете использовать этот слот, потому что у вас нет соответствующих разрешений. Попробуйте использовать другой слот. + Du bist nicht auf der Whitelist, deswegen kannst du diesen Platz nicht verwenden. Versuche es auf einen anderen Platz. + 你不允许使用此栏位,因为你没有适当的权限。尝试另一个栏位。 + + + + + Mission Failed + Mise selhala + Mission échouée + Misión fallida + Missione fallita + Misja nie powiodła się + Missão fracassada + Миссия провалена + Mission fehlgeschlagen + 任务失败 + + + You are blacklisted from cops. + Ty jsou na černé listině z policajtů. + Vous êtes sur blacklisté de la police. + Usted está en la lista negra de policías. + Stai lista nera da poliziotti. + Jesteś na czarnej liście od policjantów. + Você está na lista negra de policiais. + Вы в черном списке от ментов. + Du bist von Polizisten auf die schwarze Liste gesetzt worden. + 你被警察列入黑名单。 + + + You are not allowed to be a cop due to previous actions and the admins have removed you from being a cop. + Ty jsou nesmí být policajt vzhledem k předcházejícími akcemi a administrátoři vám odstraní z bytí policista. + Vous avez été blacklisté de la police en raisons d'actions précédentes allant à l'encontre des règles. Vous ne pouvez plus devenir policier. + No tiene permiso a ser policía por acciones anteriores. Los administradores han bloqueado su acceso. + Non è consentito fare il poliziotto a causa di azioni precedenti e gli amministratori di aver rimosso da essere un poliziotto. + Nie mogą być policjantem z powodu wcześniejszych działań oraz administratorzy usunęli cię od bycia policjantem. + Você não tem permissão para ser um policial devido a ações anteriores e os admins ter removido-lo de ser um policial. + Вы не можете быть полицейским в связи с предыдущими действиями и админы удалили вас от того, чтобы быть полицейским. + Du bist aufgrund früherer Aktion, kein Polizist mehr. Du wurdest von den Admins aus der Polizei entfernt. + 由于以前的行为,你不再是警察,警局已将你从警队中开除。 + + + + + The SpyGlass sees you! + Dalekohled tě vidí! + SpyGlass vous voit ! + El SpyGlass te ve! + Il cannocchiale si vede! + Lunetę widzi! + O SpyGlass te vê! + SpyGlass видит, что вы! + SpyGlass sieht dich! + SpyGlass正在检测你! + + + You were detected by the SpyGlass. + Vy byly detekovány dalekohled. + Vous avez été détecté par SpyGlass. + Fue detectado por el SpyGlass. + Lei è stato rilevato dal SpyGlass. + Ty zostały wykryte przez lunetę. + Você foi detectado pelo SpyGlass. + Вы были обнаружены с помощью SpyGlass. + Du wurdest von SpyGlass erkannt. + 你被SpyGlass检测。 + + + You were detected for cheating and have been reported to the server. Enjoy your day. + Vy byly detekovány za podvádění a byly zaznamenány na server. Užijte si svůj den. + Vous avez été détecté pour triche et avez été signalé au serveur. Profitez de votre journée. + Fue detectada por hacer trampas y se le ha informado al servidor. Disfruta tu día. + Lei è stato rilevato per truffa e sono stati segnalati per il server. Buona giornata. + Ty wykryto oszustwo i zostały zgłoszone do serwera. Miłego dnia. + Está foram detectados por engano e têm sido relatados para o servidor. Aproveite seu dia. + Вы были обнаружены для мошенничества и было сообщено на сервер. Удачного дня. + >Du wurdest wegen Betrug erkannt und an den Server gemeldet. Genieße deinen Tag. + 你被发现作弊,并已报告给服务器。珍惜你的生活吧。 + + + SPYGLASS-FLAG: %1 : %2 : %3 + SPYGLASS-FLAG: %1 : %2 : %3 + SPYGLASS-FLAG: %1 : %2 : %3 + SPYGLASS-FLAG: %1 : %2 : %3 + SPYGLASS-FLAG: %1 : %2 : %3 + SPYGLASS-FLAG: %1 : %2 : %3 + SPYGLASS-FLAG: %1 : %2 : %3 + SPYGLASS-FLAG: %1 : %2 : %3 + SPYGLASS-ERKENNUNG: %1 : %2 : %3 + SPYGLASS-标记: %1 : %2 : %3 + + + <t align='center'><t color='#FF0000'><t size='3'>SPY-GLASS</t></t><br/>Cheater Flagged</t><br/<br/>Name: %1<br/>Detection: %2 + <t align='center'><t color='#FF0000'><t size='3'>SPY-GLASS</t></t><br/>Cheater Flagged</t><br/<br/>Name: %1<br/>Detection: %2 + <t align='center'><t color='#FF0000'><t size='3'>SPY-GLASS</t></t><br/>Cheater Flagged</t><br/<br/>Name: %1<br/>Detection: %2 + <t align='center'><t color='#FF0000'><t size='3'>SPY-GLASS</t></t><br/>Cheater Flagged</t><br/<br/>Name: %1<br/>Detection: %2 + <t align='center'><t color='#FF0000'><t size='3'>SPY-GLASS</t></t><br/>Cheater Flagged</t><br/<br/>Name: %1<br/>Detection: %2 + <t align='center'><t color='#FF0000'><t size='3'>SPY-GLASS</t></t><br/>Cheater Flagged</t><br/<br/>Name: %1<br/>Detection: %2 + <t align='center'><t color='#FF0000'><t size='3'>SPY-GLASS</t></t><br/>Cheater Flagged</t><br/<br/>Name: %1<br/>Detection: %2 + <t align='center'><t color='#FF0000'><t size='3'>SPY-GLASS</t></t><br/>Cheater Flagged</t><br/<br/>Name: %1<br/>Detection: %2 + <t align='center'><t color='#FF0000'><t size='3'>SPY-GLASS</t></t><br/>Betrüger Erkannt</t><br/<br/>Name: %1<br/>Erkennung: %2 + <t align='center'><t color='#FF0000'><t size='3'>SPY-GLASS</t></t><br/>作弊者被标记</t><br/<br/>姓名:%1<br/>发现:%2 + + + %1 was observed by SPY-GLASS, he/she was trying to access commanding menu:\n\n %2\n\n and that commanding-menu is not known to the system. PLEASE NOTE he/she may not be cheating but the SPY-GLASS found it relevant to report in. + %1 was observed by SPY-GLASS, he/she was trying to access commanding menu:\n\n %2\n\n and that commanding-menu is not known to the system. PLEASE NOTE he/she may not be cheating but the SPY-GLASS found it relevant to report in. + %1 was observed by SPY-GLASS, he/she was trying to access commanding menu:\n\n %2\n\n and that commanding-menu is not known to the system. PLEASE NOTE he/she may not be cheating but the SPY-GLASS found it relevant to report in. + %1 was observed by SPY-GLASS, he/she was trying to access commanding menu:\n\n %2\n\n and that commanding-menu is not known to the system. PLEASE NOTE he/she may not be cheating but the SPY-GLASS found it relevant to report in. + %1 was observed by SPY-GLASS, he/she was trying to access commanding menu:\n\n %2\n\n and that commanding-menu is not known to the system. PLEASE NOTE he/she may not be cheating but the SPY-GLASS found it relevant to report in. + %1 was observed by SPY-GLASS, he/she was trying to access commanding menu:\n\n %2\n\n and that commanding-menu is not known to the system. PLEASE NOTE he/she may not be cheating but the SPY-GLASS found it relevant to report in. + %1 was observed by SPY-GLASS, he/she was trying to access commanding menu:\n\n %2\n\n and that commanding-menu is not known to the system. PLEASE NOTE he/she may not be cheating but the SPY-GLASS found it relevant to report in. + %1 was observed by SPY-GLASS, he/she was trying to access commanding menu:\n\n %2\n\n and that commanding-menu is not known to the system. PLEASE NOTE he/she may not be cheating but the SPY-GLASS found it relevant to report in. + %1 wurde beobachtet durch SPY-GLASS. Er/Sie hatte versucht auf das Befehlsmenü:\n\n %2\n\n zuzugreifen, diese ist dem System aber nicht bekannt. BITTE BEACHTE! Er/Sie betrügt deshalb nicht, aber SPY-GLASS fand es trotzdem relevant es zu melden. + %1 被SPY-GLASS检测, 他/她试图访问命令菜单:\n\n %2\n\n 并且系统不知道命令菜单。请注意他/她可能不会作弊,但SPY-GLASS发现了它的报告相关。 + + + Variable: %1 is not allowed TYPE: %2 NS: MN + Variable: %1 is not allowed TYPE: %2 NS: MN + Variable: %1 is not allowed TYPE: %2 NS: MN + Variable: %1 is not allowed TYPE: %2 NS: MN + Variable: %1 is not allowed TYPE: %2 NS: MN + Variable: %1 is not allowed TYPE: %2 NS: MN + Variable: %1 is not allowed TYPE: %2 NS: MN + Variable: %1 is not allowed TYPE: %2 NS: MN + Variable: %1 ist nicht erlaubt. TYPE: %2 NS: MN + 变量:不允许: %1 类型: %2 NS: MN + + + Variable: %1 is not allowed TYPE: %2 NS: UI + Variable: %1 is not allowed TYPE: %2 NS: UI + Variable: %1 is not allowed TYPE: %2 NS: UI + Variable: %1 is not allowed TYPE: %2 NS: UI + Variable: %1 is not allowed TYPE: %2 NS: UI + Variable: %1 is not allowed TYPE: %2 NS: UI + Variable: %1 is not allowed TYPE: %2 NS: UI + Variable: %1 is not allowed TYPE: %2 NS: UI + Variable: %1 ist nicht erlaubt. TYPE: %2 NS: UI + 变量:不允许: %1 类型: %2 NS: UI + + + ||SPY-GLASS Observes|| Name: %1 | UID: %2 | Reason: %3 + ||SPY-GLASS Observes|| Name: %1 | UID: %2 | Reason: %3 + ||SPY-GLASS Observes|| Name: %1 | UID: %2 | Reason: %3 + ||SPY-GLASS Observes|| Name: %1 | UID: %2 | Reason: %3 + ||SPY-GLASS Observes|| Name: %1 | UID: %2 | Reason: %3 + ||SPY-GLASS Observes|| Name: %1 | UID: %2 | Reason: %3 + ||SPY-GLASS Observes|| Name: %1 | UID: %2 | Reason: %3 + ||SPY-GLASS Observes|| Name: %1 | UID: %2 | Reason: %3 + ||SPY-GLASS Beobachtung|| Name: %1 | UID: %2 | Grund: %3 + ||SPY-GLASS 观察|| 姓名:%1 | UID:%2 | 原因:%3 + + + Variable set before client initialized: %1 + Variable set before client initialized: %1 + Variable set before client initialized: %1 + Variable set before client initialized: %1 + Variable set before client initialized: %1 + Variable set before client initialized: %1 + Variable set before client initialized: %1 + Variable set before client initialized: %1 + Variable gesetzt bevor Client initialisiert: %1 + 客户端初始化之前的变量集:%1 + + + + + EMS Requested + EMS Požadované + Medecin demandé + Medico Solicitado + EMS richiesto + EMS Zamówiony + EMS solicitada + EMS Запрошенный + Sanitäter benachrichtigt + EMS要求 + + + Delivery Job Accepted + Dodávka Job Accepted + Mission de livraison acceptée + Misión de Entrega Aceptada + Incarico Postale accettato + Dostawa Praca Zaakceptowany + Entrega aceitado Job + Доставка Работа Принято + Lieferauftrag angenommen + 接受交货工作 + + + Delivery Job Failed + Nepodařilo dodávka Job + Mission de livraison échouée + Misión de Entrega Fallada + Incarico Postale Fallito + Dostawa Praca Failed + Falha de entrega Job + Доставка Работа Ошибка + Lieferauftrag fehlgeschlagen + 交货工作失败 + + + Delivery Job Completed + Dokončena dodávka Job + Mission de livraison réussie + Misión de Entrega Completada + Incarico Postale Completato + Dostawa Praca Zakończony + Concluída a entrega Job + Доставка Работа Завершено + Lieferauftrag abgeschlossen + 交货工作已完成 + + + Received A Text Message + Přijetí textové zprávy + SMS reçu + Recibió un mensaje de texto + Hai ricevuto un messaggio di testo + Otrzymał wiadomość tekstową + Recebeu uma mensagem de texto + Получено текстовое сообщение + Erhielt eine Textnachricht + 收到短信 + + + 911 Dispatch Center + 911 Dispatch Center + 911 Dispatch Centre + 911 Centro de Despacho + 911 Centro Richieste + 911 Dispatch Center + 911 Centro de Despacho + 911 диспетчерский центр + 110 Dispatch Zentrum + 911调度中心 + + + Admin Dispatch Center + Admin Dispatch Center + Message Administrateur + Centro de Despacho de Administradores + Admin centro di spedizione + Administrator Dispatch Center + Administrador Centro de Despacho + Администратор диспетчерский центр + Admin Verteilzentrum + 管理调度中心 + + + Admin Message + + + + Admin Nachricht + + Message Admin + + + 管理员信息 + + + + + Civ Plane + + Avion civil + + + + + + Zivilflugzeug + 民用飞机 + + + Police HQ + + QG de Police + + + + + + Polizei HQ + 警察总部 + + + Police Store + + Magasin de la police + + + + + + Polizei Ausrüstung + 警察商店 + + + Police Car + + Concessionnaire de police + + + + + + Dienstfahrzeuge + 警车 + + + Police Heli + + Héliport de police + + + + + + Polizei Helikopter + 警用直升机 + + + Police Boat + + Vendeur de bateaux de police + + + + + + Polizei Boote + 警察船舶 + + + Rebel Car + + Concessionnaire rebelle + + + + + + Rebellen Fahrzeuge + 叛军载具 + + + Rebel Heli + + Héliport rebelle + + + + + + Rebellen Helikopter + 叛军直升机 + + + Police HQ + + QG de Police + + + + + + Polizei HQ + 警察总部 + + + + + arrested %1 + zadržen %1 + a arrêté %1 + arrestó a %1 + + + prendeu %1 + арестовано %1 + hat %1 verhaftet + 逮捕 %1 + + + %1 - %2 arrested %3 + %1 - %2 %3 zatčen + %1 - %2 a arrêté %3 + %1 - %2 arrestó a %3 + + + %1 - %2 prendeu %3 + %1 - %2 %3 арестовано + %1 - %2 hat %3 verhaftet. + %1 - %2 逮捕 %3 + + + picked up %1 %2 + vyzvednout %1 %2 + a ramassé %1 %2 + recogió %1 %2 + + + pegou %1 %2 + поднял %1 %2 + hat $%1 $%2 aufgehoben. + 拿起 %1 %2 + + + %1 - %2 picked up %3 %4 + %1 - %2 vyzvednout%3 %4 + %1 - %2 a ramassé %3 %4 + %1 - %2 recogió %3 %4 + + + %1 - %2 pegou %3 %4 + взял $%1 от земли. Банковский баланс: $%2 на руку Баланс: $%3 + %1 - %2 hat %3 %4 aufgehoben. + %1 - %2 捡起 %3 %4 + + + picked up $%1 from the ground. Bank Balance: $%2 On Hand Balance: $%3 + zvedl $%1 ze země. Banka Zůstatek: $%2 po zralé úvaze rukou: $%3 + a récupéré $%1 par terre. Argent en banque : $%2 - Cash : $%3 + recogió $%1 del suelo. Saldo Bancario: $%2 Saldo en Efectivo: $%3 + + + pegou R$%1 do chão. Quantia no Banco: R$%2 Quantia na Mão: R$%3 + взял $%1 от земли. Банковский баланс: $%2 на руку Баланс: $%3 + hat $%1 vom Boden aufgehoben. Bankkonto: $%2 Bargeld: $%3 + 从地上捡起 $%1。银行存款余额:$%2 手上余额:$%3 + + + %1 - %2 picked up $%3 from the ground. Bank Balance: $%4 On Hand Balance $%5 + %1 - %2 vyzvednout $%3 ze země. Banka Zůstatek: $%4 po ruce Balance $%5 + %1 - %2 a récupéré $%3 par terre. Argent en banque : $%4 Cash : $%5 + %1 - %2 recogió $%3 del suelo. Saldo Bancario: $%4 Saldo en Efectivo: $%5 + + + %1 - %2 pegou R$%3 do chão. Quantia no Banco: R$%4 Quantia na mão: R$%5 + %1 - %2 взял $%3 от земли. Банковский баланс: $%4 На Hand Баланс $%5 + %1 - %2 hat $%3 vom Boden aufgehoben. Bankkonto: $%4 Bargeld: $%5 + %1 - %2 从地上捡起 $%3。银行存款余额:$%4 手上余额 $%5 + + + robbed $%1 from %2. Bank Balance: $%3 On Hand Balance: $%4 + oloupen $%1 z %2. Banka Zůstatek: $%3 po zralé úvaze rukou: $%4 + a volé $%1 de %2. Argent en banque : $%4 Cash : $%4 + robó $%1 de $%2. Saldo Bancario: $%3 Saldo en Efectivo: $%4 + + + roubou R$%1 de %2. Quantia no Banco: R$%3 Quantia na Mão: R$%4 + ограбил $%1 из %2. Банковский баланс: $%3 на руку Баланс: $%4 + hat $%1 von $%2 geraubt. Bankkonto: $%3 Bargeld: $%4 + 从 %2 抢劫 $%1。银行存款余额:$%3 手上余额:$%4 + + + %1 - %2 robbed $%3 from %4. Bank Balance: $%5 On Hand Balance: $%6 + %1 - %2 okraden $%3 z %4. Banka Zůstatek: $%5 po zralé úvaze rukou: $%6 + %1 - %2 a volé $%3 de %4. Argent en banque : $%5. Cash : $%6 + %1 - %2 robó $%3 de $%4. Saldo Bancario: $%5 Saldo en Efectivo: $%6 + + + %1 - %2 roubou R$%3 de %4. Quantia no Banco: R$%5 Quantia na Mão: R$%6 + %1 - %2 ограбил $%3 от %4. Банковский баланс: $%5 на руку Баланс: $%6 + %1 - %2 hat $%3 von %4 geraubt. Bankkonto: $%5 Bargeld: $%6 + %1 - %2 抢走了%4 $%3。银行存款余额:$%5 手上余额:$%6 + + + created a gang named: %1 for $%2 + Vytvořili gang s názvem: %1 za $%2 + a créé un gang nommé : %1 pour $%2 + creó una pandilla llamada: %1 por $%2 + + + criou uma gangue chamada: %1 por R$%2 + создали банду под названием: %1 за $%2 + hat eine Gang mit dem Namen: $1 für $%2 erstellt. + 创建一个名为:%1 的帮派 花费 $%2 + + + %1 - %2 created a gang named: %3 for $%4 + %1 - %2 vytvořili gang s názvem: %3 za $%4 + %1 - %2 a créé un gang nommé : %3 pour $%4 + %1 - %2 creó una pandilla llamada: %3 por $%4 + + + %1 - %2 criou uma gangue chamada: %3 por R$%4 + %1 - %2 создали банду под названием: %3 за $%4 + %1 - %2 hat eine Gang mit dem Namen: %3 für $%4 erstellt. + %1 - %2 创建一个名为:%3 的帮派 花费 $%4 + + + bought a house for $%1. Bank Balance: $%2 On Hand Cash: $%3 + koupil dům za $%1. Banka Zůstatek: $%2 On Hand Cash: $%3 + a acheté une maison pour $%1. Argent en banque : $%2 Cash : $%3 + compró una casa por $%1. Saldo Bancario: $%2 Saldo en Efectivo: $%3 + + + comprou uma casa por R$%1. Quantia no Banco: R$%2 Quantia na Mão: R$%3 + купил дом за $%1. Банковский баланс: $%2 на руках наличные деньги: $%3 + hat sich ein Haus für $%1 gekauft. Bankkonto: $%2 Bargeld: $%3 + 买了一所房子花费 $%。 银行存款余额: $%2 手头现金: $%3 + + + %1 - %2 bought a house for $%3. Bank Balance: $%4 On Hand Cash: $%5 + %1 - %2 koupil dům za $%3. Banka Zůstatek: $%4 On Hand Cash: $%5 + %1 - %2 a acheté une maison pour $%3. Argent en banque : $%4 Cash : $%5 + %1 - %2 compró una casa por $%3. Saldo Bancario: $%4 Saldo en Efectivo: $%5 + + + %1 - %2 comprou uma casa por R$%3. Quantia no Banco: R$%4 Quantia na Mão: R$%5 + %1 - %2 купил дом за $%3. Банковский баланс: $%4 на руках наличные деньги: $%5 + %1 - %2 hat sich ein Haus für $%3 gekauft. Bankkonto: $%4 Bargeld: $%5 + %1 - %2 买了一所房子花费 $%3。银行存款余额:$%4 手头现金:$%5 + + + sold a house for $%1. Bank Balance: $%2 + prodal dům za $%1. Banka Zůstatek: $%2 + a vendu une maison pour $%1. Argent en banque : $%2 + vendió una casa por $%1. Saldo Bancario: $%2 + + + vendeu uma casa por R$%1. Quantia no Banco: R$%2 + продал дом за $%1. Банковский баланс: $%2 + hat sein Haus für $%1 verkauft. Bankkonto: $%2 + 卖掉房子得到 $%1。银行存款余额:$%2 + + + %1 - %2 sold a house for $%3. Bank Balance: $%4 + %1 - %2 prodal dům za $%3. Banka Zůstatek: $%4 + %1 - %2 a vendu une maison pour $%3. Argent en banque : $%4 + %1 - %2 vendió una casa por $%3. Saldo Bancario: $%4 + + + %1 - %2 vendeu uma casa por R$%3. Quantia no Banco: R$%4 + %1 - %2 продал дом за $%3. Банковский баланс: $%4 + %1 - %2 hat sich ein Haus für $%3 verkauft. Bankkonto: $%4 + %1 - %2 卖掉房子得到 $%3。银行存款余额: $%4 + + + chopped vehicle %1 for $%2 On Hand Cash(pre-chop): $%3 + nasekané vozidlo %1 nebo $%2 na ruce hotovosti (pre-CHOP): $%3 + a mis en pièces le véhicule %1 pour $%2. Cash (avant la vente) : $%3 + vendió el vehiculo %1 en el desguace por $%2. Saldo en Efectivo(antes de la venta): $%3 + + + desmanchou um %1 por R$%2 Quantia na Mão (antes do desmanche): R$%3 + нарезанного машина %1 или $%2 на руках Cash (предварительно отбивной): $%3 + hat das Fahrzeug %1 für $%2 beim Schrotthändler verschrottet. Bargeld(vor Schrott): $%3 + 出售盗窃到的载具 %1 赚取 $%2 手头现金(预付):$%3 + + + %1 - %2 chopped vehicle %3 for $%4 On Hand Cash(pre-chop): $%5 + %1 - %2 nasekané vozidla %3 za $%4 po ruce hotovosti (před-kotleta): $%5 + %1 - %2 a revendu le véhicule %3 pour $%4. Cash (avant la vente) : $%5 + %1 - %2 vendió el vehiculo %3 en el desguace por $%4. Saldo en Efectivo(antes de la venta): $%5 + + + %1 - %2 desmanchou um %3 por R$%4 Quantia na Mão(antes do desmanche): R$%5 + %1 - %2 нарезанной автомобиля %3 за $%4 на руку Cash (предварительно отбивной): $%5 + %1 - %2 hat das Fahrzeug %3 für $%4 beim Schrotthändler verschrottet. Bargeld(vor Schrott): $%6 + %1 - %2 出售盗窃到的载具 %3 赚取 $%4 手头现金(预付):$%5 + + + bought vehicle %1 for $%2. On Hand Cash: $%3 Bank Balance: $%4 + koupil vozidla %1 nebo $%2. On Hand Cash: $%3 bankovní konto: $%4 + a acheté le véhicule %1 pour $%2. Cash : $%3 Argent en banque : $%4 + compró el vehiculo %1 por $%2. Saldo Bancario: $%3 Saldo en Efectivo: $%4 + + + comprou um %1 por R$%2. Quantia na Mão: R$%3 Quantia no Banco: R$%4 + купил автомобиль %1 или $%2. На Hand Cash: $%3 банка Баланс: $%4 + hat sich das Fahrzeug %1 für $%2 gekauft. Bargeld: $%3 Bankkonto: $%4 + 购买载具 %1 花费 $%2。 手头现金:$%3 银行存款余额:$%4 + + + %1 - %2 bought vehicle %3 for $%4. On Hand Cash: $%5 Bank Balance $%6 + %1 - %2 koupilo vozidla %3 za $%4. On Hand Cash: $%5 bankovní konto $%6 + %1 - %2 a acheté le véhicule %3 pour $%4. Cash $%5 Argent en banque : $%6 + %1 - %2 compró el vehiculo %3 por $%4. Saldo Bancario: $%5 Saldo en Efectivo: $%6 + + + %1 - %2 comprou um %3 por R$%4. Quantia na Mão: R$%5 Quantia no Banco: R$%6 + %1 - %2 купил автомобиль за $%3 %4. На Hand наличных: $%5 баланса банка $%6 + %1 - %2 hat sich das Fahrzeug %3 für $%4 gekauft. Bargeld: $%5 Bankkonto: $%6 + %1 - %2 购买载具 %3 花费 $%4。 手头现金:$%5 银行存款余额 $%6 + + + sold vehicle %1 for $%2. Bank Balance: $%3 On Hand Balance: $%4 + prodával vozidla %1 pro $%2. Banka Zůstatek: $%3 po zralé úvaze rukou: $%4 + a vendu le véhicule %1 pour $%2. Argent en banque : $%3 Cash : $%4 + vendió el vehiculo %1 por $%2. Saldo Bancario: $%3 Saldo en Efectivo: $%4 + + + vendeu um %1 por R$%2. Quantia no Banco: R$%3 Quantia na Mão: R$%4 + продается автомобиль %1 за $%2. Банковский баланс: $%3 на руку Баланс: $%4 + hat das Fahrzeug %1 für $%2 verkauft. Bankkonto: $%3 Bargeld: $%4 + 出售载具 %1 获得 $%2。 银行存款余额:$%3 手上现金:$%4 + + + %1 - %2 sold vehicle %3 for $%4. Bank Balance: $%5 On Hand Balance: $%6 + %1 - %2 prodával vozidla %3 za $%4. Banka Zůstatek: $%5 po zralé úvaze rukou: $%6 + %1 - %2 a vendu le véhicule %3 pour $%4. Argent en banque : $%5 Cash : $%6 + %1 - %2 vendió el vehiculo %3 por $%4. Saldo Bancario: $%5 Saldo en Efectivo: $%6 + + + %1 - %2 vendeu um %3 por R$%4. Quantia no Banco: R$%5 Quantia na Mão: R$%6 + %1 - %2 продал автомобиль за $%3 %4. Банковский баланс: $%5 на руку Баланс: $%6 + %1 - %2 hat das Fahrzeug %3 für %4 verkauft. Bankkonto: $%5 Bargeld: $%6 + %1 - %2 出售载具 %3 获得 $%4。银行存款余额:$%5 手上现金:$%6 + + + withdrew $%1 from their gang bank. Gang Bank Balance: $%2 Bank Balance: $%3 On Hand Balance: $%4 + stáhl $%1 z jejich gangu banky. Gang bankovní konto: $%2 bankovní konto: $%3 po zralé úvaze rukou: $%4 + a retiré $%1 du compte bancaire du Gang. Solde bancaire du Gang : $%2 Argent en banque(perso) : $%3 Cash : $%4 + sacó $%1 de la cuenta de su pandilla. Saldo Bancario de la Pandilla: $%2 Saldo Bancario: $%3 Saldo en Efectivo: $%4 + + + sacou R$%1 no banco da sua gangue. Quantia no Banco da Gangue: R$%2 Quantia no Banco: R$%3 Quantia na Mão: R$%4 + снял $%1 от их банды банка. Gang Bank Баланс: $%2 банка Баланс: $%3 на руку Баланс: $%4 + hat $%1 vom Gangkonto abgehoben. Gangkonto: $%2 Bankkonto: $%3 Bargeld: $%4 + 从他们的帮派银行账户取出 $%1。帮派银行余额:$%2 银行存款余额:$%3 手上现金:$%4 + + + %1 - %2 withdrew $%3 from their gang bank. Gang Bank Balance: $%4 Bank Balance: $%5 On Hand Balance: $%6 + %1 - %2 stáhl $%3 z jejich gangu banky. Gang bankovní konto: $%4 bankovní konto: $%5 po zralé úvaze rukou: $%6 + %1 - %2 a retiré $%3 du compte bancaire du Gang. Solde bancaire du Gang : $%4 Argent en banque(perso) : $%5 Cash : $%6 + %1 - %2 sacó $%3 de la cuenta de su pandilla. Saldo Bancario de la Pandilla: $%4 Saldo Bancario: $%5 Saldo en Efectivo: $%6 + + + %1 - %2 sacou R$%3 no banco da sua gangue. Quantia no Banco da Gangue: R$%4 Quantia no Banco: R$%5 Quantia na Mão: R$%6 + %1 - %2 отозвала $%3 из их банды банка. Gang Bank Баланс: $%4 банка Баланс: $%5 на руку Баланс: $%6 + %1 - %2 hat $%3 vom Bankkonto abgehoben. Gangkonto: $%4 Bankkonto: $%5 Bargeld: $%6 + %1 - %2 从他们的帮派银行账户取出 $%3。帮派银行余额:$%4 银行存款余额:$%5 手上现金:$%6 + + + deposited $%1 into their gang bank. Gang Bank Balance: $%2 Bank Balance: $%3 On Hand Balance: $%4 + uložen $%1 do svého gangu banky. Gang bankovní konto: $%2 bankovní konto: $%3 po zralé úvaze rukou: $%4 + a déposé $%1 sur compte bancaire du Gang. Solde bancaire du Gang : $%2 Argent en banque(perso) : $%3 Cash : $%4 + depositó $%1 a la cuenta de su pandilla. Saldo Bancario de la Pandilla: $%2 Saldo Bancario: $%3 Saldo en Efectivo: $%4 + + + depositou R$%1 no banco da sua gangue. Quantia no Banco da Gangue: R$%2 Quantia no Banco: R$%3 Quantia na Mão: R$%4 + депозит в размере $%1 в их банде банка. Gang Bank Баланс: $%2 банка Баланс: $%3 на руку Баланс: $%4 + hat $%1 auf sein Gangkonto eingezahlt. Gangkonto: $%2 Bankkonto: $%3 Bargeld: $%4 + 将 $%1 存进他们的帮派银行账户。帮派银行余额:$%2 银行存款余额:$%3 手上现金:$%4 + + + %1 - %2 deposited $%3 into their gang bank. Gang Bank Balance: $%4 Bank Balance: $%5 On Hand Balance: $%6 + %1 - %2 uloženy $%3 do jejich gangu banky. Gang bankovní konto: $%4 bankovní konto: $%5 po zralé úvaze rukou: $%6 + %1 - %2 a déposé $%3 sur compte bancaire du Gang. Solde bancaire du Gang : $%4 Argent en banque(perso) : $%5 Cash : $%6 + %1 - %2 depositó $%3 a la cuenta de su pandilla. Saldo Bancario de la Pandilla: $%4 Saldo Bancario: $%5 Saldo en Efectivo: $%6 + + + %1 - %2 depositou R$%3 no banco da sua gangue. Quantia no Banco da Gangue: R$%4 Quantia no Banco: R$%5 Quantia na Mão: R$%6 + %1 - %2 депозит в размере $%3 в их банде банка. Gang Bank Баланс: $%4 банка Баланс: $%5 на руку Баланс: $%6 + %1 - %2 hat $%3 auf sein Gangkonto überwiesen. Gangkonto: $%4 Bankkonto: $%5 Bargeld: $%6 + %1 - %2 将 $%3 存进他们的帮派银行账户。帮派银行余额:$%4 银行存款余额:$%5 手上现金:$%6 + + + withdrew $%1 from their bank. Bank Balance: $%2 On Hand Balance: $%3 + stáhl $%1 z jejich banky. Banka Zůstatek: $%2 po zralé úvaze rukou: $%3 + a retiré $%1 de sa banque. Argent en banque : $%2 Cash : $%3 + sacó $%1 de su cuenta de banco. Saldo Bancario: $%2 Saldo en Efectivo: $%3 + + + sacou R$%1 do seu banco. Quantia no Banco: R$%2 Quantia na Mão: R$%3 + снял $%1 от своего банка. Банковский баланс: $%2 на руку Баланс: $%3 + hat $%1 von seinem Bankkonto abgehoben. Bankkonto: $%2 Bargeld: $%3 + 从他们的帮派银行账户取出 $%1。银行存款余额:$%2 手上现金:$%3 + + + %1 - %2 withdrew $%3 from their bank. Bank Balance: $%4 On Hand Balance: $%5 + %1 - %2 stáhl $%3 od své banky. Banka Zůstatek: $%4 po zralé úvaze rukou: $%5 + %1 - %2 a retiré $%3 de sa banque. Argent en banque : $%4 Cash : $%5 + %1 - %2 sacó $%3 de su cuenta de banco. Saldo Bancario: $%4 Saldo en Efectivo: $%5 + + + %1 - %2 sacou R$%3 do seu banco. Quantia no Banco: R$%4 Quantia na Mão: R$%5 + %1 - %2 отозвала $%3 из своего банка. Банковский баланс: $%4 на руку Баланс: $%5 + %1 - %2 hat $%3 von seinem Bankkonto abgehoben. Bankkonto: $%4 Bargeld: $%5 + %1 - %2 从他们银行账户取出 $%3。银行存款余额:$%4 手上现金:$%5 + + + transferred $%1 to %2. Bank Balance: $%3 On Hand Balance: $%4 + přestoupil $%1 do %2. Banka Zůstatek: $%3 po zralé úvaze rukou: $%4 + a transféré $%1 à %2. Argent en banque : $%3 Cash : $%4 + transferió $%1 a $%2. Saldo Bancario: $%3 Saldo en Efectivo: $%4 + + + transferiu R$%1 para %2. Quantia no Banco: R$%3 Quantia na Mão: R$%4 + перечислил $%1 %2. Банковский баланс: $%3 на руку Баланс: $%4 + hat %2 $%1 überwiesen. Bankkonto: $%3 Bargeld: $%4 + 转帐 $%1 给 %2。银行存款余额:$%3 手上现金:$%4 + + + %1 - %2 transferred $%3 to %4. Bank Balance: $%5 On Hand Balance: $%6 + %1 - %2 převedena $%3 až %4. Banka Zůstatek: $%5 po zralé úvaze rukou: $%6 + %1 - %2 a transféré $%3 à %4. Argent en banque : $%5 Cash : $%6 + %1 - %2 transferió $%3 a $%4. Saldo Bancario: $%5 Saldo en Efectivo: $%6 + + + %1 - %2 transferiu R$%3 para %4. Quantia no Banco: R$%5 Quantia na Mão: R$%6 + %1 -%2 перевели $%3 до %4. Банковский баланс: $%5 на руку Баланс: $%6 + %1 - %2 hat %4 $%3 überwiesen. Bankkonto: $%5 Bargeld: $%6 + %1 - %2 转帐 $%3 给 %4。银行存款余额:$%5 手上现金:$%6 + + + deposited $%1 into their bank. Bank Balance: $%2 On Hand Balance: $%3 + uložen $%1 do své banky. Banka Zůstatek: $%2 po zralé úvaze rukou: $%3 + a déposé $%1 dans son compte. Argent en banque $%2 Cash : $%3 + depositó $%1 a su cuenta de banco. Saldo Bancario: $%2 Saldo en Efectivo: $%3 + + + depositou R$%1 no seu banco. Quantia no Banco: R$%2 Quantia na Mão: R$%3 + депозит в размере $%1 в их банке. Банковский баланс: $%2 на руку Баланс: $%3 + hat $%1 auf sein Bankkonto eingezahlt. Bankkonto: $%2 Bargeld: $%3 + 将 $%1 存进他们的银行账户。银行存款余额:$%2 手上现金:$%3 + + + %1 - %2 deposited $%3 into their bank. Bank Balance: $%4 On Hand Balance: $%5 + %1 - %2 uloženy $%3 do své banky. Banka Zůstatek: $%4 po zralé úvaze rukou: $%5 + %1 - %2 a déposé $%3 dans son compte. Argent en banque : $%4 Cash : $%5 + %1 - %2 depositó $%3 a su cuenta de banco. Saldo Bancario: $%4 Saldo en Efectivo: $%5 + + + %1 - %2 depositou R$%3 no seu banco. Quantia no Banco: R$%4 Quantia na Mão: R$%5 + %1 - %2 депозит в размере $%3 в свой банк. Банковский баланс: $%4 на руку Баланс: $%5 + %1 - %2 hat $%3 auf sein Bankkonto eingezahlt. Bankkonto: $%4 Bargeld: $%5 + %1 - %2 将 $%3 存进他们的银行账户。银行存款余额:$%4 手上现金:$%5 + + + diff --git a/BEFilters/remoteexec.txt b/BEFilters/remoteexec.txt index f1aba0f4a..a1737120e 100644 --- a/BEFilters/remoteexec.txt +++ b/BEFilters/remoteexec.txt @@ -1,3 +1,3 @@ //regex 1 "" !="_this call fn_whoDoneIt" -5 "" !BIS_fnc_(effectKilled(AirDestruction|Secondaries)|execVM) !DB_fnc_(insertRequest|queryRequest|updatePartial|updateRequest) !HC_fnc_(addContainer|addHouse|chopShopSell|deleteDBContainer|getVehicles|insertGang|insertRequest|jailSys|queryRequest|receivekeyofServer) !HC_fnc_(removeGang|sellHouse(Container)?|spawnVehicle|spikeStrip) !HC_fnc_update(Gang|HouseContainers|HouseTrunk|Partial|Request) !HC_fnc_vehicle(Create|Delete|Store|Update) !HC_fnc_wanted(Add|Bounty|Crimes|Fetch|ProfUpdate|Remove) !life_fnc_(AAN|addVehicle2Chain|adminid|admininfo|animSync|bountyReceive|broadcast|colorVehicle|copLights) !life_fnc_(copSearch|CopSiren|corpse|demoChargeTimer|flashbang|freezePlayer|gangCreated|gangDisbanded|gangInvite) !life_fnc_(garageRefund|giveDiff|hideObj|impoundMenu|jail(Me|Sys)?) !life_fnc_(jumpFnc|knockedOut|licenseCheck|licensesRead|lightHouse|lockVehicle|medic(Lights|Request|Siren)) !life_fnc_(moveIn|pickupItem|pickupMoney|pulloutVeh|receiveItem|receiveMoney|removeLicenses|restrain|revived) !life_fnc_(robPerson|robReceive|say3D|searchClient|seizeClient|setFuel|simDisable|soundDevice|spikeStripEffect) !life_fnc_(tazeSound|ticketPaid|ticketPrompt|vehicleAnimate|gangBankResponse) !life_fnc_wanted(Add|Bounty|Crimes|Fetch|Info|List|ProfUpdate|Remove) !life_fnc_wireTransfer !SOCK_fnc_(dataQuery|insertPlayerInfo|updateRequest) !SPY_fnc_(cookieJar|notifyAdmins|observe) !TON_fnc_(addContainer|addHouse|chopShopSell|cleanupRequest|handleBlastingCharge) !TON_fnc_clientGang(Kick|Leader|Left) !TON_fnc_(clientGetKey|clientMessage) !TON_fnc_(deleteDBContainer|getID|getVehicles|insertGang|keyManagement|managesc|pickupAction|player_query|recupkeyforHC) !TON_fnc_(removeGang|sellHouse(Container)?|spawnVehicle|spikeStrip) !TON_fnc_update(Gang|HouseContainers|HouseTrunk) !TON_fnc_vehicle(Create|Delete|Store|Update) !="_this call fn_whoDoneIt" +5 "" !BIS_fnc_(effectKilled(AirDestruction|Secondaries)|execVM) !DB_fnc_(insertRequest|queryRequest|updatePartial|updateRequest) !HC_fnc_(addContainer|addHouse|chopShopSell|deleteDBContainer|getVehicles|insertGang|insertRequest|jailSys|queryRequest|receivekeyofServer) !HC_fnc_(removeGang|sellHouse(Container)?|spawnVehicle|spikeStrip) !HC_fnc_update(Gang|HouseContainers|HouseTrunk|Partial|Request) !HC_fnc_vehicle(Create|Delete|Store|Update) !HC_fnc_wanted(Add|Bounty|Crimes|Fetch|ProfUpdate|Remove) !life_fnc_(AAN|addVehicle2Chain|adminid|admininfo|animSync|bountyReceive|broadcast|colorVehicle|copLights) !life_fnc_(copSearch|CopSiren|corpse|demoChargeTimer|flashbang|freezePlayer|gangCreated|gangDisbanded|gangInvite) !life_fnc_(garageRefund|giveDiff|hideObj|impoundMenu|jail(Me|Sys)?) !life_fnc_(jumpFnc|knockedOut|licenseCheck|licensesRead|lightHouse|lockVehicle|medic(Lights|Request|Siren)) !life_fnc_(moveIn|pickupItem|pickupMoney|pulloutVeh|receiveItem|receiveMoney|removeLicenses|restrain|revived) !life_fnc_(robPerson|robReceive|say3D|searchClient|seizeClient|setFuel|simDisable|soundDevice|spikeStripEffect) !life_fnc_(tazeSound|ticketPaid|ticketPrompt|vehicleAnimate|gangBankResponse) !life_fnc_wanted(Add|Bounty|Crimes|Fetch|Info|List|ProfUpdate|Remove) !life_fnc_wireTransfer !SOCK_fnc_(dataQuery|insertPlayerInfo|updateRequest) !SPY_fnc_(cookieJar|notifyAdmins|observe) !TON_fnc_(addContainer|addHouse|chopShopSell|cleanupRequest|handleBlastingCharge) !life_fnc_clientGang(Kick|Leader|Left) !life_fnc_(clientGetKey|clientMessage) !TON_fnc_(deleteDBContainer|getID|getVehicles|insertGang|keyManagement|managesc|pickupAction|recupkeyforHC) !life_util_fnc_playerQuery !TON_fnc_(removeGang|sellHouse(Container)?|spawnVehicle|spikeStrip) !TON_fnc_update(Gang|HouseContainers|HouseTrunk) !TON_fnc_vehicle(Create|Delete|Store|Update) !="_this call fn_whoDoneIt" diff --git a/README.md b/README.md index fda112d77..744638318 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ AsYetUntitled, formerly Altis Life RPG and ARMARPGLIFE is a rolepl This Github is not currently associated with any forums. +![Validation](https://github.com/AsYetUntitled/Framework/workflows/Validation/badge.svg?branch=master) + # Features: - Police, Civ and Medic roles @@ -15,7 +17,7 @@ This Github is not currently associated with any forums. - Many more. # License: -Altis Life RPG by AsYetUntitled is licensed under a [Creative Commons Attribution-NonCommercial-NoDerivs 4.0 International License] (http://creativecommons.org/licenses/by-nc-nd/4.0/deed.en_US) +Altis Life RPG by AsYetUntitled is licensed under a [Creative Commons Attribution-NonCommercial-NoDerivs 4.0 International License](http://creativecommons.org/licenses/by-nc-nd/4.0/deed.en_US) # Links: - Discord: https://discord.gg/ajGUDSH @@ -24,10 +26,7 @@ Altis Life RPG by AsYetUntitled is licensed under a [Creative Commons Attributio - Releases (Stable Builds): https://github.com/AsYetUntitled/Framework/releases

- - Build Status - - + Join the chat at https://discord.gg/ajGUDSH

diff --git a/altislife.sql b/altislife.sql old mode 100644 new mode 100755 index 1bcb7b96b..0d7c2997a --- a/altislife.sql +++ b/altislife.sql @@ -87,25 +87,26 @@ CREATE TABLE IF NOT EXISTS `players` ( `civ_gear` TEXT NOT NULL, `cop_gear` TEXT NOT NULL, `med_gear` TEXT NOT NULL, - `civ_stats` VARCHAR(25) NOT NULL DEFAULT '"[100,100,0]"', - `cop_stats` VARCHAR(25) NOT NULL DEFAULT '"[100,100,0]"', - `med_stats` VARCHAR(25) NOT NULL DEFAULT '"[100,100,0]"', + `civ_stats` VARCHAR(25) NOT NULL DEFAULT '[100,100,0]', + `cop_stats` VARCHAR(25) NOT NULL DEFAULT '[100,100,0]', + `med_stats` VARCHAR(25) NOT NULL DEFAULT '[100,100,0]', `arrested` TINYINT NOT NULL DEFAULT 0, `adminlevel` ENUM('0','1','2','3','4','5') NOT NULL DEFAULT '0', `donorlevel` ENUM('0','1','2','3','4','5') NOT NULL DEFAULT '0', `blacklist` TINYINT NOT NULL DEFAULT 0, `civ_alive` TINYINT NOT NULL DEFAULT 0, - `civ_position` VARCHAR(32) NOT NULL DEFAULT '"[]"', - `playtime` VARCHAR(32) NOT NULL DEFAULT '"[0,0,0]"', + `civ_position` VARCHAR(32) NOT NULL DEFAULT '[]', + `playtime` VARCHAR(32) NOT NULL DEFAULT '[0,0,0]', `insert_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `last_seen` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - + PRIMARY KEY (`pid`), UNIQUE KEY `unique_uid` (`uid`), INDEX `index_name` (`name`), INDEX `index_blacklist` (`blacklist`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + -- -------------------------------------------------------- -- @@ -128,7 +129,7 @@ CREATE TABLE IF NOT EXISTS `vehicles` ( `fuel` DOUBLE NOT NULL DEFAULT 1, `damage` VARCHAR(256) NOT NULL, `insert_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - + PRIMARY KEY (`id`), INDEX `fkIdx_players_vehicles` (`pid`), CONSTRAINT `FK_players_vehicles` FOREIGN KEY `fkIdx_players_vehicles` (`pid`) @@ -152,7 +153,7 @@ CREATE TABLE IF NOT EXISTS `houses` ( `owned` TINYINT DEFAULT 0, `garage` TINYINT NOT NULL DEFAULT 0, `insert_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - + PRIMARY KEY (`id`), INDEX `fkIdx_players_houses` (`pid`), CONSTRAINT `FK_players_houses` FOREIGN KEY `fkIdx_players_houses` (`pid`) @@ -176,7 +177,7 @@ CREATE TABLE IF NOT EXISTS `gangs` ( `bank` INT DEFAULT 0, `active` TINYINT NOT NULL DEFAULT 1, `insert_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - + PRIMARY KEY (`id`), UNIQUE KEY `unique_name` (`name`), INDEX `fkIdx_players_gangs` (`owner`), @@ -203,7 +204,7 @@ CREATE TABLE IF NOT EXISTS `containers` ( `active` TINYINT NOT NULL DEFAULT 0, `owned` TINYINT NOT NULL DEFAULT 0, `insert_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - + PRIMARY KEY (`id`), INDEX `fkIdx_players_containers` (`pid`), CONSTRAINT `FK_players_containers` FOREIGN KEY `fkIdx_players_containers` (`pid`) @@ -225,7 +226,7 @@ CREATE TABLE IF NOT EXISTS `wanted` ( `wantedBounty` INT NOT NULL, `active` TINYINT NOT NULL DEFAULT 0, `insert_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - + PRIMARY KEY (`wantedID`), CONSTRAINT `FK_players_wanted` FOREIGN KEY `fkIdx_players_wanted` (`wantedID`) REFERENCES `players` (`pid`) diff --git a/life_hc/FSM/cleanup.fsm b/life_hc/FSM/cleanup.fsm deleted file mode 100644 index 9bcecd41d..000000000 --- a/life_hc/FSM/cleanup.fsm +++ /dev/null @@ -1,145 +0,0 @@ -/*%FSM*/ -/*%FSM*/ -/* -item0[] = {"init",0,250,-65.004578,-391.651611,24.995417,-341.651672,0.000000,"init"}; -item1[] = {"true",8,218,-62.976639,-315.185364,27.023363,-265.185364,0.000000,"true"}; -item2[] = {"Share__Work_load",2,250,-64.183350,-224.681931,25.816656,-174.681931,0.000000,"Share " \n "Work-load"}; -item3[] = {"true",8,218,-54.709698,75.189262,35.290302,125.189262,0.000000,"true"}; -item4[] = {"Time_Check",4,218,-219.425827,-133.310532,-129.425964,-83.310455,0.000000,"Time Check"}; -item5[] = {"Delete_Dead_Cars",2,4346,-220.186951,-29.248400,-130.187195,20.751413,0.000000,"Delete" \n "Dead" \n "Cars"}; -item6[] = {"",7,210,-312.538239,95.295059,-304.538239,103.295059,0.000000,""}; -item7[] = {"",7,210,-311.750000,-203.033707,-303.750000,-195.033707,0.000000,""}; -link0[] = {0,1}; -link1[] = {1,2}; -link2[] = {2,4}; -link3[] = {3,6}; -link4[] = {4,5}; -link5[] = {5,3}; -link6[] = {6,7}; -link7[] = {7,2}; -globals[] = {0.000000,0,0,0,0,640,480,1,46,6316128,1,-629.444153,611.207214,293.309357,-434.050568,1243,885,1}; -window[] = {2,-1,-1,-1,-1,985,225,1868,225,3,1261}; -*//*%FSM*/ -class FSM -{ - fsmName = "Server-Side Cleanup"; - class States - { - /*%FSM*/ - class init - { - name = "init"; - init = /*%FSM*/"private [""_impound"",""_cars"",""_objs"",""_totCars"",""_thread""];" \n - "_impound = time;" \n - "_cars = time;" \n - "_objs = time;"/*%FSM*/; - precondition = /*%FSM*/""/*%FSM*/; - class Links - { - /*%FSM*/ - class true - { - priority = 0.000000; - to="Share__Work_load"; - precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/"true"/*%FSM*/; - action=/*%FSM*/""/*%FSM*/; - }; - /*%FSM*/ - }; - }; - /*%FSM*/ - /*%FSM*/ - class Share__Work_load - { - name = "Share__Work_load"; - init = /*%FSM*/""/*%FSM*/; - precondition = /*%FSM*/""/*%FSM*/; - class Links - { - /*%FSM*/ - class Time_Check - { - priority = 0.000000; - to="Delete_Dead_Cars"; - precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/"((time - _cars) > (3 * 60))"/*%FSM*/; - action=/*%FSM*/""/*%FSM*/; - }; - /*%FSM*/ - }; - }; - /*%FSM*/ - /*%FSM*/ - class Delete_Dead_Cars - { - name = "Delete_Dead_Cars"; - init = /*%FSM*/"{" \n - " if (!alive _x) then {" \n - " _dbInfo = _x getVariable [""dbInfo"",[]];" \n - " if (count _dbInfo > 0) then {" \n - " _uid = _dbInfo select 0;" \n - " _plate = _dbInfo select 1;" \n - "" \n - " _query = format [""UPDATE vehicles SET alive='0' WHERE pid='%1' AND plate='%2'"",_uid,_plate];" \n - " _query spawn {" \n - " " \n - " _thread = [_this,1] call HC_fnc_asyncCall;" \n - " };" \n - " };" \n - " if (!isNil ""_x"" && {!isNull _x}) then {" \n - " deleteVehicle _x;" \n - " };" \n - " };" \n - "} forEach allMissionObjects ""LandVehicle"";" \n - "" \n - "{" \n - " if (!alive _x) then {" \n - " _dbInfo = _x getVariable [""dbInfo"",[]];" \n - " if (count _dbInfo > 0) then {" \n - " _uid = _dbInfo select 0;" \n - " _plate = _dbInfo select 1;" \n - "" \n - " _query = format [""UPDATE vehicles SET alive='0' WHERE pid='%1' AND plate='%2'"",_uid,_plate];" \n - " _query spawn {" \n - " " \n - " _thread = [_this,1] call HC_fnc_asyncCall;" \n - " };" \n - " };" \n - " if (!isNil ""_x"" && {!isNull _x}) then {" \n - " deleteVehicle _x;" \n - " };" \n - " };" \n - "} forEach allMissionObjects ""Air"";" \n - "" \n - "_cars = time;" \n - "" \n - "//Group cleanup." \n - "{" \n - " if (units _x isEqualTo [] && local _x) then {" \n - " deleteGroup _x;" \n - " };" \n - "} forEach allGroups;"/*%FSM*/; - precondition = /*%FSM*/""/*%FSM*/; - class Links - { - /*%FSM*/ - class true - { - priority = 0.000000; - to="Share__Work_load"; - precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/"true"/*%FSM*/; - action=/*%FSM*/""/*%FSM*/; - }; - /*%FSM*/ - }; - }; - /*%FSM*/ - }; - initState="init"; - finalStates[] = - { - }; -}; -/*%FSM*/ diff --git a/life_hc/MySQL/Gangs/fn_insertGang.sqf b/life_hc/MySQL/Gangs/fn_insertGang.sqf old mode 100644 new mode 100755 index 951187662..bc4f48424 --- a/life_hc/MySQL/Gangs/fn_insertGang.sqf +++ b/life_hc/MySQL/Gangs/fn_insertGang.sqf @@ -8,31 +8,32 @@ Description: Inserts the gang into the database. */ -private ["_query","_queryResult","_gangMembers","_group"]; + params [ - ["_ownerID",objNull,[objNull]], - ["_uid","",[""]], - ["_gangName","",[""]] + ["_ownerID", objNull, [objNull]], + ["_uid", "", [""]], + ["_gangName", "", [""]] ]; -_group = group _ownerID; -if (isNull _ownerID || _uid isEqualTo "" || _gangName isEqualTo "") exitWith {}; //Fail +private _group = group _ownerID; + +if (isNull _ownerID || {_uid isEqualTo ""} || {_gangName isEqualTo ""}) exitWith {}; -_gangName = [_gangName] call HC_fnc_mresString; -_query = format ["SELECT id FROM gangs WHERE name='%1' AND active='1'",_gangName]; +private _query = format ["selectGangID:%1", _gangName]; -_queryResult = [_query,2] call HC_fnc_asyncCall; +private _queryResult = [_query, 2] call HC_fnc_asyncCall; //Check to see if the gang name already exists. -if (!(count _queryResult isEqualTo 0)) exitWith { - [1,"There is already a gang created with that name please pick another name."] remoteExecCall ["life_fnc_broadcast",_ownerID]; +if !(_queryResult isEqualTo []) exitWith { + [1, "There is already a gang created with that name please pick another name."] remoteExecCall ["life_fnc_broadcast",_ownerID]; life_action_gangInUse = nil; _ownerID publicVariableClient "life_action_gangInUse"; }; -_query = format ["SELECT id FROM gangs WHERE members LIKE '%2%1%2' AND active='1'",_uid,"%"]; +private _uidLike = format["%2%1%2", _uid, "%"]; +_query = format ["selectGangIDFromMembers:%1", _uidLike]; -_queryResult = [_query,2] call HC_fnc_asyncCall; +_queryResult = [_query, 2] call HC_fnc_asyncCall; //Check to see if this person already owns or belongs to a gang. if (!(count _queryResult isEqualTo 0)) exitWith { @@ -42,29 +43,29 @@ if (!(count _queryResult isEqualTo 0)) exitWith { }; //Check to see if a gang with that name already exists but is inactive. -_query = format ["SELECT id, active FROM gangs WHERE name='%1' AND active='0'",_gangName]; +_query = format ["selectInactiveGang:%1", _gangName]; -_queryResult = [_query,2] call HC_fnc_asyncCall; -_gangMembers = [[_uid]] call HC_fnc_mresArray; +_queryResult = [_query, 2] call HC_fnc_asyncCall; +private _gangMembers = [_uid]; -if (!(count _queryResult isEqualTo 0)) then { - _query = format ["UPDATE gangs SET active='1', owner='%1',members='%2' WHERE id='%3'",_uid,_gangMembers,(_queryResult select 0)]; +if !(_queryResult isEqualTo []) then { + _query = format ["updateGang:%1:%2:%3", (_queryResult select 0), _gangMembers, _uid]; } else { - _query = format ["INSERT INTO gangs (owner, name, members) VALUES('%1','%2','%3')",_uid,_gangName,_gangMembers]; + _query = format ["insertGang:%1:%2:%3", _uid, _gangName, _gangMembers]; }; -_queryResult = [_query,1] call HC_fnc_asyncCall; +_queryResult = [_query, 1] call HC_fnc_asyncCall; -_group setVariable ["gang_name",_gangName,true]; -_group setVariable ["gang_owner",_uid,true]; -_group setVariable ["gang_bank",0,true]; -_group setVariable ["gang_maxMembers",8,true]; -_group setVariable ["gang_members",[_uid],true]; -[_group] remoteExecCall ["life_fnc_gangCreated",_ownerID]; +_group setVariable ["gang_name", _gangName, true]; +_group setVariable ["gang_owner", _uid, true]; +_group setVariable ["gang_bank", 0, true]; +_group setVariable ["gang_maxMembers", 8, true]; +_group setVariable ["gang_members", [_uid], true]; +[_group] remoteExecCall ["life_fnc_gangCreated", _ownerID]; -sleep 0.35; -_query = format ["SELECT id FROM gangs WHERE owner='%1' AND active='1'",_uid]; +uiSleep 0.35; +_query = format ["selectGangIDFromOwner:%1", _uid]; -_queryResult = [_query,2] call HC_fnc_asyncCall; +_queryResult = [_query, 2] call HC_fnc_asyncCall; -_group setVariable ["gang_id",(_queryResult select 0),true]; +_group setVariable ["gang_id", (_queryResult select 0), true]; diff --git a/life_hc/MySQL/Gangs/fn_queryPlayerGang.sqf b/life_hc/MySQL/Gangs/fn_queryPlayerGang.sqf old mode 100644 new mode 100755 index e4492417f..ee9f00f82 --- a/life_hc/MySQL/Gangs/fn_queryPlayerGang.sqf +++ b/life_hc/MySQL/Gangs/fn_queryPlayerGang.sqf @@ -7,15 +7,9 @@ Description: Queries to see if the player belongs to any gang. */ -private ["_query","_queryResult"]; -_query = format ["SELECT id, owner, name, maxmembers, bank, members FROM gangs WHERE active='1' AND members LIKE '%2%1%2'",_this,"%"]; +private _pid = format ["%2%1%2", _this, "%"]; +private _query = format ["selectPlayerGang:%1", _pid]; +private _queryResult = [_query,2] call HC_fnc_asyncCall; -_queryResult = [_query,2] call HC_fnc_asyncCall; - -if !(count _queryResult isEqualTo 0) then { - _tmp = [_queryResult select 5] call HC_fnc_mresToArray; - if (_tmp isEqualType "") then {_tmp = call compile format ["%1",_tmp];}; - _queryResult set[5, _tmp]; -}; -missionNamespace setVariable [format ["gang_%1",_this],_queryResult]; +missionNamespace setVariable [format ["gang_%1", _this], _queryResult]; diff --git a/life_hc/MySQL/Gangs/fn_removeGang.sqf b/life_hc/MySQL/Gangs/fn_removeGang.sqf old mode 100644 new mode 100755 index 537e22808..6b24e7988 --- a/life_hc/MySQL/Gangs/fn_removeGang.sqf +++ b/life_hc/MySQL/Gangs/fn_removeGang.sqf @@ -8,19 +8,19 @@ Description: Blah */ -private ["_group","_groupID"]; -_group = param [0,grpNull,[grpNull]]; + +params [ + ["_group", grpNull, [grpNull]] +]; + if (isNull _group) exitWith {}; -_groupID = _group getVariable ["gang_id",-1]; +private _groupID = _group getVariable ["gang_id",-1]; if (_groupID isEqualTo -1) exitWith {}; -[format ["UPDATE gangs SET active='0' WHERE id='%1'",_groupID],1] call HC_fnc_asyncCall; +_group setVariable ["gang_owner",nil,true]; +[format ["deleteGang:%1", _groupID], 1] call HC_fnc_asyncCall; -_result = [format ["SELECT id FROM gangs WHERE active='1' AND id='%1'",_groupID],2] call HC_fnc_asyncCall; -if (count _result isEqualTo 0) then { - [_group] remoteExecCall ["life_fnc_gangDisbanded",(units _group)]; - sleep 5; - deleteGroup _group; -}; -["CALL deleteOldGangs",1] call DB_fnc_asyncCall; +[_group] remoteExecCall ["life_fnc_gangDisbanded",(units _group)]; +uiSleep 5; +deleteGroup _group; \ No newline at end of file diff --git a/life_hc/MySQL/Gangs/fn_updateGang.sqf b/life_hc/MySQL/Gangs/fn_updateGang.sqf old mode 100644 new mode 100755 index eef95d891..3b4d2b5f7 --- a/life_hc/MySQL/Gangs/fn_updateGang.sqf +++ b/life_hc/MySQL/Gangs/fn_updateGang.sqf @@ -8,26 +8,28 @@ Description: Updates the gang information? */ -private ["_groupID","_bank","_maxMembers","_members","_membersFinal","_query","_owner"]; + params [ - ["_mode",0,[0]], - ["_group",grpNull,[grpNull]] + ["_mode", 0, [0]], + ["_group", grpNull, [grpNull]] ]; if (isNull _group) exitWith {}; //FAIL -_groupID = _group getVariable ["gang_id",-1]; +private _groupID = _group getVariable ["gang_id", -1]; if (_groupID isEqualTo -1) exitWith {}; +private "_query"; + switch (_mode) do { case 0: { - _bank = [(_group getVariable ["gang_bank",0])] call HC_fnc_numberSafe; - _maxMembers = _group getVariable ["gang_maxMembers",8]; - _members = [(_group getVariable "gang_members")] call HC_fnc_mresArray; - _owner = _group getVariable ["gang_owner",""]; + private _bank = _group getVariable ["gang_bank", 0]; + private _maxMembers = _group getVariable ["gang_maxMembers", 8]; + private _members = _group getVariable "gang_members"; + private _owner = _group getVariable ["gang_owner", ""]; if (_owner isEqualTo "") exitWith {}; - _query = format ["UPDATE gangs SET bank='%1', maxmembers='%2', owner='%3' WHERE id='%4'",_bank,_maxMembers,_owner,_groupID]; + _query = format ["updateGang1:%1:%2:%3:%4", _bank, _maxMembers, _owner, _groupID]; }; case 1: { @@ -45,7 +47,6 @@ switch (_mode) do { _funds = _funds + _value; _group setVariable ["gang_bank",_funds,true]; [1,"STR_ATM_DepositSuccessG",true,[_value]] remoteExecCall ["life_fnc_broadcast",remoteExecutedOwner]; - _cash = _cash - _value; } else { if (_value > _funds) exitWith { [1,"STR_ATM_NotEnoughFundsG",true] remoteExecCall ["life_fnc_broadcast",remoteExecutedOwner]; @@ -63,23 +64,24 @@ switch (_mode) do { diag_log (format [localize "STR_DL_ML_withdrewGang",name _unit,(getPlayerUID _unit),_value,[_funds] call life_fnc_numberText,[0] call life_fnc_numberText,[_cash] call life_fnc_numberText]); }; }; - _query = format ["UPDATE gangs SET bank='%1' WHERE id='%2'",([_funds] call HC_fnc_numberSafe),_groupID]; [getPlayerUID _unit,side _unit,_cash,0] call HC_fnc_updatePartial; + _query = format ["updateGangBank:%1:%2", _group getVariable ["gang_bank", 0], _groupID]; }; case 2: { - _query = format ["UPDATE gangs SET maxmembers='%1' WHERE id='%2'",(_group getVariable ["gang_maxMembers",8]),_groupID]; + _query = format ["updateGangMaxmembers:%1:%2", (_group getVariable ["gang_maxMembers", 8]), _groupID]; }; case 3: { - _owner = _group getVariable ["gang_owner",""]; + private _owner = _group getVariable ["gang_owner", ""]; if (_owner isEqualTo "") exitWith {}; - _query = format ["UPDATE gangs SET owner='%1' WHERE id='%2'",_owner,_groupID]; + _query = format ["updateGangOwner:%1:%2", _owner, _groupID]; }; case 4: { - _members = _group getVariable "gang_members"; - if (count _members > (_group getVariable ["gang_maxMembers",8])) then { + private _members = _group getVariable "gang_members"; + private "_membersFinal"; + if (count _members > (_group getVariable ["gang_maxMembers", 8])) then { _membersFinal = []; for "_i" from 0 to _maxMembers -1 do { _membersFinal pushBack (_members select _i); @@ -87,11 +89,10 @@ switch (_mode) do { } else { _membersFinal = _group getVariable "gang_members"; }; - _membersFinal = [_membersFinal] call HC_fnc_mresArray; - _query = format ["UPDATE gangs SET members='%1' WHERE id='%2'",_membersFinal,_groupID]; + _query = format ["updateGangMembers:%1:%2", _membersFinal, _groupID]; }; }; if (!isNil "_query") then { - [_query,1] call HC_fnc_asyncCall; + [_query, 1] call HC_fnc_asyncCall; }; diff --git a/life_hc/MySQL/General/fn_bool.sqf b/life_hc/MySQL/General/fn_bool.sqf deleted file mode 100644 index 2d9a70f23..000000000 --- a/life_hc/MySQL/General/fn_bool.sqf +++ /dev/null @@ -1,26 +0,0 @@ -/* - File: fn_bool.sqf - Author: TAW_Tonic - - Description: - Handles bool conversion for MySQL since MySQL doesn't support 'true' or 'false' - instead MySQL uses Tinyint for BOOLEAN (0 = false, 1 = true) -*/ -private ["_bool","_mode"]; -_bool = [_this,0,0,[false,0]] call BIS_fnc_param; -_mode = [_this,1,0,[0]] call BIS_fnc_param; - -switch (_mode) do { - case 0: { - if (_bool isEqualType 0) exitWith {0}; - if (_bool) then {1} else {0}; - }; - - case 1: { - if (!(_bool isEqualType 0)) exitWith {false}; - switch (_bool) do { - case 0: {false}; - case 1: {true}; - }; - }; -}; diff --git a/life_hc/MySQL/General/fn_cleanup.sqf b/life_hc/MySQL/General/fn_cleanup.sqf old mode 100644 new mode 100755 index 6afd87668..f28d57c7a --- a/life_hc/MySQL/General/fn_cleanup.sqf +++ b/life_hc/MySQL/General/fn_cleanup.sqf @@ -1,69 +1,81 @@ -#include "\life_hc\hc_macros.hpp" -/* - File: fn_cleanup.sqf - Author: Bryan "Tonic" Boardwine - - This file is for Nanou's HeadlessClient. - - Description: - Server-side cleanup script on vehicles. - Sort of a lame way but whatever. -*/ -private "_deleted"; -_deleted = false; -for "_i" from 0 to 1 step 0 do { - private ["_veh","_units","_fuel"]; - sleep (60 * 60); - { - _protect = false; - _veh = _x; - _vehicleClass = getText(configFile >> "CfgVehicles" >> (typeOf _veh) >> "vehicleClass"); - _fuel = 1; - - if (!isNil {_veh getVariable "NPC"} && {_veh getVariable "NPC"}) then {_protect = true;}; - - if ((_vehicleClass in ["Car","Air","Ship","Armored","Submarine"]) && {!(_protect)}) then { - if (LIFE_SETTINGS(getNumber,"save_vehicle_fuel") isEqualTo 1) then {_fuel = (fuel _veh);}; - _dbInfo = _veh getVariable ["dbInfo",[]]; - _units = {(_x distance _veh < 300)} count playableUnits; - if (crew _x isEqualTo []) then { - switch (true) do { - case ((_x getHitPointDamage "HitEngine") > 0.7 && _units isEqualTo 0) : {deleteVehicle _x; _deleted = true;}; - case ((_x getHitPointDamage "HitLFWheel") > 0.98 && _units isEqualTo 0) : {deleteVehicle _x; _deleted = true;}; - case ((_x getHitPointDamage "HitLF2Wheel") > 0.98 && _units isEqualTo 0) : {deleteVehicle _x; _deleted = true;}; - case ((_x getHitPointDamage "HitRFWheel") > 0.98 && _units isEqualTo 0) : {deleteVehicle _x; _deleted = true;}; - case ((_x getHitPointDamage "HitRF2Wheel") > 0.98 && _units isEqualTo 0) : {deleteVehicle _x; _deleted = true;}; - case (_units isEqualTo 0): {deleteVehicle _x; _deleted = true;}; - }; - }; - - if (_deleted) then { - waitUntil {isNull _veh}; - _deleted = false; - }; - - if (isNull _veh) then { - if (count _dbInfo > 0) then { - _uid = _dbInfo select 0; - _plate = _dbInfo select 1; - - _query = format ["UPDATE vehicles SET active='0', fuel='%3' WHERE pid='%1' AND plate='%2'",_uid,_plate,_fuel]; - - [_query,1] call HC_fnc_asyncCall; - }; - }; - }; - } forEach vehicles; - - sleep (3 * 60); //3 minute cool-down before next cycle. - { - if ((typeOf _x) in ["Land_BottlePlastic_V1_F","Land_TacticalBacon_F","Land_Can_V3_F","Land_CanisterFuel_F", "Land_Can_V3_F","Land_Money_F","Land_Suitcase_F"]) then { - deleteVehicle _x; - }; - } forEach (allMissionObjects "Thing"); - - sleep (2 * 60); - { - deleteVehicle _x; - } forEach (allMissionObjects "GroundWeaponHolder"); -}; +#include "\life_hc\hc_macros.hpp" +/* + File: fn_cleanup.sqf + Author: Bryan "Tonic" Boardwine + + Description: + Server-side cleanup script on vehicles, dealers and fed reserve. +*/ +private _saveFuel = LIFE_SETTINGS(getNumber,"save_vehicle_fuel") isEqualTo 1; +private _minUnitDistance = LIFE_SETTINGS(getNumber,"vehicles_despawn_max_distance"); + +private _fnc_fedDealerUpdate = { + { + private _dealer = missionNamespace getVariable [_x, objNull]; + if !(isNull _dealer) then { + _x setVariable ["sellers", [], true]; + }; + } forEach ["Dealer_1", "Dealer_2", "Dealer_3"]; + + + private _funds = fed_bank getVariable ["safe", 0]; + fed_bank setVariable ["safe", round(_funds+((count playableUnits)/2)), true]; +}; + +private _fnc_cleanVehicles = { + { + private _vehicleClass = getText(configFile >> "CfgVehicles" >> (typeOf _x) >> "vehicleClass"); + private _protect = _x getVariable ["NPC",false]; + + if ((_vehicleClass in ["Car","Air","Ship","Armored","Submarine"]) && {!_protect}) then { + private _noUnitsNear = (nearestObjects [_x, ["CAManBase"], _minUnitDistance]) findIf {isPlayer _x && {alive _x}} isEqualTo -1; + + if (crew _x isEqualTo [] && {_noUnitsNear}) then { + private _fuel = if (_saveFuel) then {fuel _x} else {1}; + private _dbInfo = _x getVariable "dbInfo"; + + deleteVehicle _x; + + if (isNil "_dbInfo") exitWith {}; + + waitUntil {uiSleep 1; isNull _x}; + + _dbInfo params [ + "_uid", + "_plate" + ]; + + private _query = format ["cleanupVehicle:%1:%2:%3", _fuel, _uid, _plate]; + [_query, 1] call HC_fnc_asyncCall; + }; + }; + } forEach vehicles; + + { + if (!isNil {_x getVariable "item"}) then { + deleteVehicle _x; + }; + true + } count (allMissionObjects "Thing"); +}; + +//Array format: [parameters,function,delayTime] +private _routines = [ + [[], _fnc_fedDealerUpdate, 1800], + [[], _fnc_cleanVehicles, 3600] +]; + +{ + _x pushBack (diag_tickTime + (_x # 2)); +} forEach _routines; + +for "_i" from 0 to 1 step 0 do { + { + _x params ["_params", "_function", "_delay", "_timeToRun"]; + if (diag_tickTime > _timeToRun) then { + _params call _function; + _x set [2, diag_tickTime + _delay]; + }; + } forEach _routines; + uiSleep 1e-6; +}; diff --git a/life_hc/MySQL/General/fn_insertRequest.sqf b/life_hc/MySQL/General/fn_insertRequest.sqf old mode 100644 new mode 100755 index 73d9422b7..0869f5a00 --- a/life_hc/MySQL/General/fn_insertRequest.sqf +++ b/life_hc/MySQL/General/fn_insertRequest.sqf @@ -6,10 +6,10 @@ This file is for Nanou's HeadlessClient. Description: - Does something with inserting... Don't have time for - descriptions... Need to write it... + Adds a player to the database upon first joining of the server. + Recieves information from core\sesison\fn_insertPlayerInfo.sqf */ -private ["_queryResult","_query","_alias"]; + params [ "_uid", "_name", @@ -19,26 +19,21 @@ params [ ]; //Error checks -if ((_uid isEqualTo "") || (_name isEqualTo "")) exitWith {}; -if (isNull _returnToSender) exitWith {}; - -_query = format ["SELECT pid, name FROM players WHERE pid='%1'",_uid]; +if (_uid isEqualTo "" || {_name isEqualTo ""}) exitWith {systemChat "Bad UID or name";}; //Let the client be 'lost' in 'transaction' +if (isNull _returnToSender) exitWith {systemChat "ReturnToSender is Null!";}; //No one to send this to! -_tickTime = diag_tickTime; -_queryResult = [_query,2] call HC_fnc_asyncCall; +private _query = format ["checkPlayerExists:%1", _uid]; +private _queryResult = [_query, 2] call HC_fnc_asyncCall; //Double check to make sure the client isn't in the database... -if (_queryResult isEqualType "") exitWith {[] remoteExecCall ["SOCK_fnc_dataQuery",_returnToSender];}; //There was an entry! -if !(count _queryResult isEqualTo 0) exitWith {[] remoteExecCall ["SOCK_fnc_dataQuery",_returnToSender];}; +if (_queryResult isEqualType "" || {!(_queryResult isEqualTo [])}) exitWith { + [] remoteExecCall ["SOCK_fnc_dataQuery", _returnToSender]; +}; -//Clense and prepare some information. -_name = [_name] call HC_fnc_mresString; //Clense the name of bad chars. -_alias = [[_name]] call HC_fnc_mresArray; -_money = [_money] call HC_fnc_numberSafe; -_bank = [_bank] call HC_fnc_numberSafe; +private _alias = [_name]; //Prepare the query statement.. -_query = format ["INSERT INTO players (pid, name, cash, bankacc, aliases, cop_licenses, med_licenses, civ_licenses, civ_gear, cop_gear, med_gear) VALUES('%1', '%2', '%3', '%4', '%5','""[]""','""[]""','""[]""','""[]""','""[]""','""[]""')", +_query = format ["insertNewPlayer:%1:%2:%3:%4:%5", _uid, _name, _money, @@ -46,5 +41,5 @@ _query = format ["INSERT INTO players (pid, name, cash, bankacc, aliases, cop_li _alias ]; -[_query,1] call HC_fnc_asyncCall; -[] remoteExecCall ["SOCK_fnc_dataQuery",_returnToSender]; +[_query, 1] call HC_fnc_asyncCall; +[] remoteExecCall ["SOCK_fnc_dataQuery", _returnToSender]; diff --git a/life_hc/MySQL/General/fn_insertVehicle.sqf b/life_hc/MySQL/General/fn_insertVehicle.sqf old mode 100644 new mode 100755 index 8706d734a..0a049b5fa --- a/life_hc/MySQL/General/fn_insertVehicle.sqf +++ b/life_hc/MySQL/General/fn_insertVehicle.sqf @@ -7,7 +7,7 @@ Description: Inserts the vehicle into the database */ -private ["_query","_sql"]; + params [ "_uid", "_side", @@ -18,8 +18,7 @@ params [ ]; //Stop bad data being passed. -if (_uid isEqualTo "" || _side isEqualTo "" || _type isEqualTo "" || _className isEqualTo "" || _color isEqualTo -1 || _plate isEqualTo -1) exitWith {}; - -_query = format ["INSERT INTO vehicles (side, classname, type, pid, alive, active, inventory, color, plate, gear, damage) VALUES ('%1', '%2', '%3', '%4', '1','1','""[[],0]""', '%5', '%6','""[]""','""[]""')",_side,_className,_type,_uid,_color,_plate]; +if (_uid isEqualTo "" || {_side isEqualTo ""} || {_type isEqualTo ""} || {_className isEqualTo ""} || {_color isEqualTo -1} || {_plate isEqualTo -1}) exitWith {}; -[_query,1] call HC_fnc_asyncCall; +private _query = format ["insertVehicle:%1:%2:%3:%4:%5:%6", _side, _className, _type, _uid, _color, _plate]; +[_query, 1] call HC_fnc_asyncCall; diff --git a/life_hc/MySQL/General/fn_mresArray.sqf b/life_hc/MySQL/General/fn_mresArray.sqf deleted file mode 100644 index d8433f26a..000000000 --- a/life_hc/MySQL/General/fn_mresArray.sqf +++ /dev/null @@ -1,27 +0,0 @@ -/* - File: fn_mresArray.sqf - Author: Bryan "Tonic" Boardwine"; - - Description: - Acts as a mres (MySQL Real Escape) for arrays so they - can be properly inserted into the database without causing - any problems. The return method is 'hacky' but it's effective. -*/ -private ["_array"]; -_array = [_this,0,[],[[]]] call BIS_fnc_param; -_array = str _array; -_array = toArray(_array); - -for "_i" from 0 to (count _array)-1 do -{ - _sel = _array select _i; - if (!(_i isEqualTo 0) && !(_i isEqualTo ((count _array)-1))) then - { - if (_sel isEqualTo 34) then - { - _array set[_i,96]; - }; - }; -}; - -str(toString(_array)); diff --git a/life_hc/MySQL/General/fn_mresString.sqf b/life_hc/MySQL/General/fn_mresString.sqf deleted file mode 100644 index 584a8e7bd..000000000 --- a/life_hc/MySQL/General/fn_mresString.sqf +++ /dev/null @@ -1,21 +0,0 @@ -/* - File: fn_mresString.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Makes the string safe to be passed to MySQL (strips various stuff). -*/ -private ["_string","_filter"]; -_string = [_this,0,"",[""]] call BIS_fnc_param; -_filter = "'/\`:|;,{}-""<>"; - -_string = toArray _string; //Blow it up to an array -_filter = toArray _filter; //Blow it up to an array - -{ - if (_x in _filter) then { - _string deleteAt _forEachIndex; - }; -} forEach _string; - -toString _string; diff --git a/life_hc/MySQL/General/fn_mresToArray.sqf b/life_hc/MySQL/General/fn_mresToArray.sqf deleted file mode 100644 index e93e75d67..000000000 --- a/life_hc/MySQL/General/fn_mresToArray.sqf +++ /dev/null @@ -1,26 +0,0 @@ -/* - File: fn_mresToArray.sqf - Author: Bryan "Tonic" Boardwine"; - - Description: - Acts as a mres (MySQL Real Escape) for arrays so they - can be properly inserted into the database without causing - any problems. The return method is 'hacky' but it's effective. -*/ -private ["_array"]; -_array = [_this,0,"",[""]] call BIS_fnc_param; -if (_array isEqualTo "") exitWith {[]}; -_array = toArray(_array); - -for "_i" from 0 to (count _array)-1 do -{ - _sel = _array select _i; - if (_sel == 96) then - { - _array set[_i,39]; - }; -}; - -_array = toString(_array); -_array = call compile format ["%1", _array]; -_array; \ No newline at end of file diff --git a/life_hc/MySQL/General/fn_numberSafe.sqf b/life_hc/MySQL/General/fn_numberSafe.sqf deleted file mode 100644 index 0fc534d88..000000000 --- a/life_hc/MySQL/General/fn_numberSafe.sqf +++ /dev/null @@ -1,28 +0,0 @@ -/* - File: fn_numberSafe.sqf - Author: Karel Moricky - - Description: - Convert a number into string (avoiding scientific notation) - - Parameter(s): - _this: NUMBER - - Returns: - STRING -*/ -private ["_number","_mod","_digots","_digitsCount","_modBase","_numberText"]; - -_number = [_this,0,0,[0]] call bis_fnc_param; -_mod = [_this,1,3,[0]] call bis_fnc_param; - -_digits = _number call bis_fnc_numberDigits; -_digitsCount = count _digits - 1; - -_modBase = _digitsCount % _mod; -_numberText = ""; -{ - _numberText = _numberText + str _x; - if ((_foreachindex - _modBase) % (_mod) isEqualTo 0 && !(_foreachindex isEqualTo _digitsCount)) then {_numberText = _numberText + "";}; -} forEach _digits; -_numberText diff --git a/life_hc/MySQL/General/fn_queryRequest.sqf b/life_hc/MySQL/General/fn_queryRequest.sqf old mode 100644 new mode 100755 index 1ce62f7b5..b70224edd --- a/life_hc/MySQL/General/fn_queryRequest.sqf +++ b/life_hc/MySQL/General/fn_queryRequest.sqf @@ -2,7 +2,7 @@ /* File: fn_queryRequest.sqf Author: Bryan "Tonic" Boardwine - + This file is for Nanou's HeadlessClient. Description: @@ -13,149 +13,90 @@ ARRAY - If array has 0 elements it should be handled as an error in client-side files. STRING - The request had invalid handles or an unknown error and is logged to the RPT. */ -private ["_uid","_side","_query","_queryResult","_tickTime","_tmp"]; -_uid = [_this,0,"",[""]] call BIS_fnc_param; -_side = [_this,1,sideUnknown,[civilian]] call BIS_fnc_param; -_ownerID = [_this,2,objNull,[objNull]] call BIS_fnc_param; -if (isNull _ownerID) exitWith {}; +params [ + ["_uid", "", [""]], + ["_side", sideUnknown, [civilian]], + ["_ownerID", objNull, [objNull]] +]; -if (LIFE_SETTINGS(getNumber,"player_deathLog") isEqualTo 1) then { - _ownerID addMPEventHandler ["MPKilled", {_this call fn_whoDoneIt}]; -}; +if (isNull _ownerID) exitWith {}; -_query = switch (_side) do { +private _query = switch (_side) do { // West - 11 entries returned - case west: {format ["SELECT pid, name, cash, bankacc, adminlevel, donorlevel, cop_licenses, coplevel, cop_gear, blacklist, cop_stats, playtime FROM players WHERE pid='%1'",_uid];}; + case west: {format ["selectWest:%1", _uid];}; // Civilian - 12 entries returned - case civilian: {format ["SELECT pid, name, cash, bankacc, adminlevel, donorlevel, civ_licenses, arrested, civ_gear, civ_stats, civ_alive, civ_position, playtime FROM players WHERE pid='%1'",_uid];}; + case civilian: {format ["selectCiv:%1", _uid];}; // Independent - 10 entries returned - case independent: {format ["SELECT pid, name, cash, bankacc, adminlevel, donorlevel, med_licenses, mediclevel, med_gear, med_stats, playtime FROM players WHERE pid='%1'",_uid];}; + case independent: {format ["selectIndep:%1",_uid];}; }; +private _tickTime = diag_tickTime; +private _queryResult = [_query,2] call DB_fnc_asyncCall; -_tickTime = diag_tickTime; -_queryResult = [_query,2] call HC_fnc_asyncCall; - -if (_queryResult isEqualType "") exitWith { - [] remoteExecCall ["SOCK_fnc_insertPlayerInfo",_ownerID]; +if (EXTDB_SETTING(getNumber,"DebugMode") isEqualTo 1) then { + diag_log "------------- Client Query Request -------------"; + diag_log format ["QUERY: %1",_query]; + diag_log format ["Time to complete: %1 (in seconds)",(diag_tickTime - _tickTime)]; + diag_log format ["Result: %1",_queryResult]; + diag_log "------------------------------------------------"; }; -if (_queryResult isEqualTo []) exitWith { +if (_queryResult isEqualType "" || _queryResult isEqualTo []) exitWith { [] remoteExecCall ["SOCK_fnc_insertPlayerInfo",_ownerID]; }; -//Blah conversion thing from a2net->extdb -_tmp = _queryResult select 2; -_queryResult set[2,[_tmp] call HC_fnc_numberSafe]; -_tmp = _queryResult select 3; -_queryResult set[3,[_tmp] call HC_fnc_numberSafe]; - -//Parse licenses (Always index 6) -_new = [(_queryResult select 6)] call HC_fnc_mresToArray; -if (_new isEqualType "") then {_new = call compile format ["%1", _new];}; -_queryResult set[6,_new]; - -//Convert tinyint to boolean -_old = _queryResult select 6; -for "_i" from 0 to (count _old)-1 do { - _data = _old select _i; - _old set[_i,[_data select 0, ([_data select 1,1] call HC_fnc_bool)]]; +private _licenses = _queryResult select 6; + +for "_i" from 0 to (count _licenses) -1 do { + (_licenses select _i) params ["_license", "_owned"]; + _licenses set[_i, [_license, [false, true] select _owned]]; }; -_queryResult set[6,_old]; +private "_playTimes"; -_new = [(_queryResult select 8)] call HC_fnc_mresToArray; -if (_new isEqualType "") then {_new = call compile format ["%1", _new];}; -_queryResult set[8,_new]; -//Parse data for specific side. switch (_side) do { - case west: { - _queryResult set[9,([_queryResult select 9,1] call HC_fnc_bool)]; - - //Parse Stats - _new = [(_queryResult select 10)] call HC_fnc_mresToArray; - if (_new isEqualType "") then {_new = call compile format ["%1", _new];}; - _queryResult set[10,_new]; - - //Playtime - _new = [(_queryResult select 11)] call HC_fnc_mresToArray; - if (_new isEqualType "") then {_new = call compile format ["%1", _new];}; - _index = TON_fnc_playtime_values_request find [_uid, _new]; - if !(_index isEqualTo -1) then { - TON_fnc_playtime_values_request set[_index,-1]; - TON_fnc_playtime_values_request = TON_fnc_playtime_values_request - [-1]; - TON_fnc_playtime_values_request pushBack [_uid, _new]; - } else { - TON_fnc_playtime_values_request pushBack [_uid, _new]; - }; - _new = _new select 0; - [_uid, _new] call HC_fnc_setPlayTime; - }; - - case civilian: { - _queryResult set[7,([_queryResult select 7,1] call HC_fnc_bool)]; - - //Parse Stats - _new = [(_queryResult select 9)] call HC_fnc_mresToArray; - if (_new isEqualType "") then {_new = call compile format ["%1", _new];}; - _queryResult set[9,_new]; - - //Position - _queryResult set[10,([_queryResult select 10,1] call HC_fnc_bool)]; - _new = [(_queryResult select 11)] call HC_fnc_mresToArray; - if (_new isEqualType "") then {_new = call compile format ["%1", _new];}; - _queryResult set[11,_new]; - - //Playtime - _new = [(_queryResult select 12)] call HC_fnc_mresToArray; - if (_new isEqualType "") then {_new = call compile format ["%1", _new];}; - _index = TON_fnc_playtime_values_request find [_uid, _new]; - if !(_index isEqualTo -1) then { - TON_fnc_playtime_values_request set[_index,-1]; - TON_fnc_playtime_values_request = TON_fnc_playtime_values_request - [-1]; - TON_fnc_playtime_values_request pushBack [_uid, _new]; - } else { - TON_fnc_playtime_values_request pushBack [_uid, _new]; - }; - _new = _new select 2; - [_uid, _new] call HC_fnc_setPlayTime; - - _houseData = _uid spawn HC_fnc_fetchPlayerHouses; - waitUntil {scriptDone _houseData}; - _queryResult pushBack (missionNamespace getVariable [format ["houses_%1",_uid],[]]); - _gangData = _uid spawn HC_fnc_queryPlayerGang; - waitUntil{scriptDone _gangData}; - _queryResult pushBack (missionNamespace getVariable [format ["gang_%1",_uid],[]]); - }; - - case independent: { - //Parse Stats - _new = [(_queryResult select 9)] call HC_fnc_mresToArray; - if (_new isEqualType "") then {_new = call compile format ["%1", _new];}; - _queryResult set[9,_new]; - - //Playtime - _new = [(_queryResult select 10)] call HC_fnc_mresToArray; - if (_new isEqualType "") then {_new = call compile format ["%1", _new];}; - _index = TON_fnc_playtime_values_request find [_uid, _new]; - if !(_index isEqualTo -1) then { - TON_fnc_playtime_values_request set[_index,-1]; - TON_fnc_playtime_values_request = TON_fnc_playtime_values_request - [-1]; - TON_fnc_playtime_values_request pushBack [_uid, _new]; - } else { - TON_fnc_playtime_values_request pushBack [_uid, _new]; - }; - _new = _new select 1; - [_uid, _new] call HC_fnc_setPlayTime; - }; + case civilian: { + _queryResult set[7, [false, true] select (_queryResult select 7)]; + _queryResult set[10, [false, true] select (_queryResult select 10)]; + + _playTimes = _queryResult select 12; + + /* Make sure nothing else is added under here */ + _houseData = _uid spawn TON_fnc_fetchPlayerHouses; + waitUntil {scriptDone _houseData}; + _queryResult pushBack (missionNamespace getVariable [format ["houses_%1",_uid],[]]); + _gangData = _uid spawn TON_fnc_queryPlayerGang; + waitUntil {scriptDone _gangData}; + _queryResult pushBack (missionNamespace getVariable [format ["gang_%1",_uid],[]]); + }; + + case west: { + _queryResult set[9, [false, true] select (_queryResult select 9)]; + _playTimes = _queryResult select 11; + }; + + case independent: { + _playTimes = _queryResult select 10; + }; +}; + +_index = TON_fnc_playtime_values_request find [_uid, _playTimes]; + +if (_index != -1) then { + TON_fnc_playtime_values_request set[_index,-1]; + TON_fnc_playtime_values_request = TON_fnc_playtime_values_request - [-1]; + TON_fnc_playtime_values_request pushBack [_uid, _playTimes]; +} else { + TON_fnc_playtime_values_request pushBack [_uid, _playTimes]; }; +[_uid, _playTimes select 2] call TON_fnc_setPlayTime; publicVariable "TON_fnc_playtime_values_request"; life_keyreceived = false; life_keyreceivedvar = []; -[_uid,_side] remoteExecCall ["TON_fnc_recupKeyForHC",RSERV]; +[_uid, _side] remoteExecCall ["TON_fnc_recupKeyForHC", RSERV]; waitUntil {life_keyreceived}; _keyArr = life_keyreceivedvar; _queryResult pushBack _keyArr; diff --git a/life_hc/MySQL/General/fn_updatePartial.sqf b/life_hc/MySQL/General/fn_updatePartial.sqf old mode 100644 new mode 100755 index 494c0af4c..498f05af3 --- a/life_hc/MySQL/General/fn_updatePartial.sqf +++ b/life_hc/MySQL/General/fn_updatePartial.sqf @@ -8,81 +8,68 @@ Takes partial data of a player and updates it, this is meant to be less network intensive towards data flowing through it for updates. */ -private ["_uid","_side","_value","_value1","_value2","_mode","_query"]; -_uid = [_this,0,"",[""]] call BIS_fnc_param; -_side = [_this,1,sideUnknown,[civilian]] call BIS_fnc_param; -_mode = [_this,3,-1,[0]] call BIS_fnc_param; -if (_uid isEqualTo "" || _side isEqualTo sideUnknown) exitWith {}; //Bad. -_query = ""; +params [ + ["_uid", "", [""]], + ["_side", sideUnknown, [civilian]], + "_value", + ["_mode", -1, [0]], + "_value1" +]; + +if (_uid isEqualTo "" || {_side isEqualTo sideUnknown}) exitWith {}; //Bad. +private _query = ""; switch (_mode) do { case 0: { - _value = [_this,2,0,[0]] call BIS_fnc_param; - _value = [_value] call HC_fnc_numberSafe; - _query = format ["UPDATE players SET cash='%1' WHERE pid='%2'",_value,_uid]; + _query = format ["updateCash:%1:%2", _value, _uid]; }; case 1: { - _value = [_this,2,0,[0]] call BIS_fnc_param; - _value = [_value] call HC_fnc_numberSafe; - _query = format ["UPDATE players SET bankacc='%1' WHERE pid='%2'",_value,_uid]; + _query = format ["updateBank:%1:%2",_value,_uid]; }; case 2: { - _value = [_this,2,[],[[]]] call BIS_fnc_param; - //Does something license related but I can't remember I only know it's important? - for "_i" from 0 to count(_value)-1 do { - _bool = [(_value select _i) select 1] call HC_fnc_bool; - _value set[_i,[(_value select _i) select 0,_bool]]; - }; - _value = [_value] call HC_fnc_mresArray; + for "_i" from 0 to (count _value) -1 do { + (_value select _i) params ["_license", "_owned"]; + _value set[_i, [_license, [0, 1] select _owned]]; + }; + switch (_side) do { - case west: {_query = format ["UPDATE players SET cop_licenses='%1' WHERE pid='%2'",_value,_uid];}; - case civilian: {_query = format ["UPDATE players SET civ_licenses='%1' WHERE pid='%2'",_value,_uid];}; - case independent: {_query = format ["UPDATE players SET med_licenses='%1' WHERE pid='%2'",_value,_uid];}; + case west: {_query = format ["updateWestLicenses:%1:%2", _value, _uid];}; + case civilian: {_query = format ["updateCivLicenses:%1:%2", _value, _uid];}; + case independent: {_query = format ["updateIndepLicenses:%1:%2", _value, _uid];}; }; }; case 3: { - _value = [_this,2,[],[[]]] call BIS_fnc_param; - _value = [_value] call HC_fnc_mresArray; switch (_side) do { - case west: {_query = format ["UPDATE players SET cop_gear='%1' WHERE pid='%2'",_value,_uid];}; - case civilian: {_query = format ["UPDATE players SET civ_gear='%1' WHERE pid='%2'",_value,_uid];}; - case independent: {_query = format ["UPDATE players SET med_gear='%1' WHERE pid='%2'",_value,_uid];}; + case west: {_query = format ["updateWestGear:%1:%2", _value, _uid];}; + case civilian: {_query = format ["updateCivGear:%1:%2", _value, _uid];}; + case independent: {_query = format ["updateIndepGear:%1:%2", _value, _uid];}; }; }; case 4: { - _value = [_this,2,false,[true]] call BIS_fnc_param; - _value = [_value] call HC_fnc_bool; - _value2 = [_this,4,[],[[]]] call BIS_fnc_param; - _value2 = if (count _value2 isEqualTo 3) then {_value2} else {[0,0,0]}; - _value2 = [_value2] call HC_fnc_mresArray; - _query = format ["UPDATE players SET civ_alive='%1', civ_position='%2' WHERE pid='%3'",_value,_value2,_uid]; + _value = [0, 1] select _value; + _value1 = if (count _value1 isEqualTo 3) then {_value1} else {[0,0,0]}; + _query = format ["updateCivPosition:%1:%2:%3", _value, _value1, _uid]; }; case 5: { - _value = [_this,2,false,[true]] call BIS_fnc_param; - _value = [_value] call HC_fnc_bool; - _query = format ["UPDATE players SET arrested='%1' WHERE pid='%2'",_value,_uid]; + _value = [0, 1] select _value; + _query = format ["updateArrested:%1:%2",_value,_uid]; }; case 6: { - _value1 = [_this,2,0,[0]] call BIS_fnc_param; - _value2 = [_this,4,0,[0]] call BIS_fnc_param; - _value1 = [_value1] call HC_fnc_numberSafe; - _value2 = [_value2] call HC_fnc_numberSafe; - _query = format ["UPDATE players SET cash='%1', bankacc='%2' WHERE pid='%3'",_value1,_value2,_uid]; + _query = format ["updateCashAndBank:%1:%2:%3", _value, _value1, _uid]; }; case 7: { - _array = [_this,2,[],[[]]] call BIS_fnc_param; - [_uid,_side,_array,0] remoteExecCall ["TON_fnc_keyManagement",RSERV]; + [_uid, _side, _value, 0] call TON_fnc_keyManagement; }; }; if (_query isEqualTo "") exitWith {}; -[_query,1] call HC_fnc_asyncCall; +[_query, 1] call HC_fnc_asyncCall; diff --git a/life_hc/MySQL/General/fn_updateRequest.sqf b/life_hc/MySQL/General/fn_updateRequest.sqf old mode 100644 new mode 100755 index b3cc164fe..67292ac1e --- a/life_hc/MySQL/General/fn_updateRequest.sqf +++ b/life_hc/MySQL/General/fn_updateRequest.sqf @@ -8,37 +8,34 @@ Updates ALL player information in the database. Information gets passed here from the client side file: core\session\fn_updateRequest.sqf */ -private ["_uid","_side","_cash","_bank","_licenses","_gear","_stats","_name","_alive","_position","_query"]; -_uid = [_this,0,"",[""]] call BIS_fnc_param; -_name = [_this,1,"",[""]] call BIS_fnc_param; -_side = [_this,2,sideUnknown,[civilian]] call BIS_fnc_param; -_cash = [_this,3,0,[0]] call BIS_fnc_param; -_bank = [_this,4,5000,[0]] call BIS_fnc_param; -_licenses = [_this,5,[],[[]]] call BIS_fnc_param; -_gear = [_this,6,[],[[]]] call BIS_fnc_param; -_stats = [_this,7,[100,100],[[]]] call BIS_fnc_param; -_alive = [_this,9,false,[true]] call BIS_fnc_param; -_position = [_this,10,[],[[]]] call BIS_fnc_param; + +params [ + ["_uid", "", [""]], + ["_name", "", [""]], + ["_side", sideUnknown, [civilian]], + ["_cash", 0, [0]], + ["_bank", 5000, [0]], + ["_licenses", [], [[]]], + ["_gear", [], [[]]], + ["_stats", [100,100],[[]]], + ["_arrested", false, [true]], + ["_alive", false, [true]], + ["_position", [], [[]]] +]; //Get to those error checks. -if ((_uid isEqualTo "") || (_name isEqualTo "")) exitWith {}; +if (_uid isEqualTo "" || {_name isEqualTo ""}) exitWith {}; -//Parse and setup some data. -_name = [_name] call HC_fnc_mresString; -_gear = [_gear] call HC_fnc_mresArray; -_stats = [_stats] call HC_fnc_mresArray; -_cash = [_cash] call HC_fnc_numberSafe; -_bank = [_bank] call HC_fnc_numberSafe; -_position = if (_side isEqualTo civilian) then {[_position] call HC_fnc_mresArray} else {[]}; +//Setup some data. +_position = if (_side isEqualTo civilian) then {_position} else {[]}; +_arrested = [0, 1] select _arrested; +_alive = [0, 1] select _alive; -//Does something license related but I can't remember I only know it's important? -for "_i" from 0 to count(_licenses)-1 do { - _bool = [(_licenses select _i) select 1] call HC_fnc_bool; - _licenses set[_i,[(_licenses select _i) select 0,_bool]]; +for "_i" from 0 to (count _licenses) -1 do { + (_licenses select _i) params ["_license", "_owned"]; + _licenses set[_i, [_license, [0, 1] select _owned]]; }; -_licenses = [_licenses] call HC_fnc_mresArray; - //PLAYTIME _playtime = [_uid] call HC_fnc_getPlayTime; _playtime_update = []; @@ -54,12 +51,12 @@ switch (_side) do { case civilian: {_playtime_update set[2,_playtime];}; case independent: {_playtime_update set[1,_playtime];}; }; -_playtime_update = [_playtime_update] call HC_fnc_mresArray; -switch (_side) do { - case west: {_query = format ["UPDATE players SET name='%1', cash='%2', bankacc='%3', cop_gear='%4', cop_licenses='%5', cop_stats='%6', playtime='%7' WHERE pid='%8'",_name,_cash,_bank,_gear,_licenses,_stats,_playtime_update,_uid];}; - case civilian: {_query = format ["UPDATE players SET name='%1', cash='%2', bankacc='%3', civ_licenses='%4', civ_gear='%5', arrested='%6', civ_stats='%7', civ_alive='%8', civ_position='%9', playtime='%10' WHERE pid='%11'",_name,_cash,_bank,_licenses,_gear,[_this select 8] call HC_fnc_bool,_stats,[_alive] call HC_fnc_bool,_position,_playtime_update,_uid];}; - case independent: {_query = format ["UPDATE players SET name='%1', cash='%2', bankacc='%3', med_licenses='%4', med_gear='%5', med_stats='%6', playtime='%7' WHERE pid='%8'",_name,_cash,_bank,_licenses,_gear,_stats,_playtime_update,_uid];}; +private _query = switch (_side) do { + case west: {format ["updateWest:%1:%2:%3:%4:%5:%6:%7:%8", _name, _cash, _bank, _gear, _licenses, _stats, _playtime_update, _uid];}; + case civilian: {format ["updateCiv:%1:%2:%3:%4:%5:%6:%7:%8:%9:%10:%11", _name, _cash, _bank, _licenses, _gear, _arrested, _stats, _alive, _position, _playtime_update, _uid];}; + case independent: {format ["updateIndep:%1:%2:%3:%4:%5:%6:%7:%8", _name, _cash, _bank, _licenses, _gear, _stats, _playtime_update, _uid];}; }; -_queryResult = [_query,1] call HC_fnc_asyncCall; + +_queryResult = [_query, 1] call HC_fnc_asyncCall; diff --git a/life_hc/MySQL/Housing/fn_addContainer.sqf b/life_hc/MySQL/Housing/fn_addContainer.sqf old mode 100644 new mode 100755 index 85f53291a..ad06651d3 --- a/life_hc/MySQL/Housing/fn_addContainer.sqf +++ b/life_hc/MySQL/Housing/fn_addContainer.sqf @@ -8,24 +8,23 @@ Description: Add container in Database. */ -private ["_containerPos","_query","_className","_dir"]; + params [ - ["_uid","",[""]], - ["_container",objNull,[objNull]] + ["_uid", "", [""]], + ["_container", objNull, [objNull]] ]; -if (isNull _container || _uid isEqualTo "") exitWith {}; - -_containerPos = getPosATL _container; -_className = typeOf _container; -_dir = [vectorDir _container, vectorUp _container]; +if (isNull _container || {_uid isEqualTo ""}) exitWith {}; -_query = format ["INSERT INTO containers (pid, pos, classname, inventory, gear, owned, dir) VALUES('%1', '%2', '%3', '""[[],0]""', '""[]""', '1', '%4')",_uid,_containerPos,_className,_dir]; -[_query,1] call HC_fnc_asyncCall; +private _containerPos = getPosATL _container; +private _className = typeOf _container; +private _dir = [vectorDir _container, vectorUp _container]; -sleep 0.3; +private _query = format ["insertContainer:%1:%2:%3:%4", _uid, _containerPos, _className, _dir]; +[_query, 1] call HC_fnc_asyncCall; -_query = format ["SELECT id FROM containers WHERE pos='%1' AND pid='%2' AND owned='1'",_containerPos,_uid]; -_queryResult = [_query,2] call HC_fnc_asyncCall; +uiSleep 0.3; -_container setVariable ["container_id",(_queryResult select 0),true]; +_query = format ["selectContainerID:%1:%2", _containerPos, _uid]; +_queryResult = [_query, 2] call HC_fnc_asyncCall; +_container setVariable ["container_id", _queryResult select 0, true]; diff --git a/life_hc/MySQL/Housing/fn_addHouse.sqf b/life_hc/MySQL/Housing/fn_addHouse.sqf old mode 100644 new mode 100755 index fad0676ab..4fc9c4e40 --- a/life_hc/MySQL/Housing/fn_addHouse.sqf +++ b/life_hc/MySQL/Housing/fn_addHouse.sqf @@ -6,23 +6,27 @@ This file is for Nanou's HeadlessClient. Description: - Blah + Inserts the players newly bought house in the database. */ -private ["_housePos","_query"]; + params [ ["_uid","",[""]], ["_house",objNull,[objNull]] ]; -if (isNull _house || _uid isEqualTo "") exitWith {}; -_housePos = getPosATL _house; +if (isNull _house || {_uid isEqualTo ""}) exitWith {}; + +private _housePos = getPosATL _house; -_query = format ["INSERT INTO houses (pid, pos, owned) VALUES('%1', '%2', '1')",_uid,_housePos]; -[_query,1] call HC_fnc_asyncCall; +private _query = format ["insertHouse:%1:%2", _uid, _housePos]; +if (EXTDB_SETTING(getNumber,"DebugMode") isEqualTo 1) then { + diag_log format ["Query: %1",_query]; +}; -sleep 0.3; +[_query, 1] call HC_fnc_asyncCall; -_query = format ["SELECT id FROM houses WHERE pos='%1' AND pid='%2' AND owned='1'",_housePos,_uid]; -_queryResult = [_query,2] call HC_fnc_asyncCall; +uiSleep 0.3; -_house setVariable ["house_id",(_queryResult select 0),true]; +_query = format ["selectHouseID:%1:%2", _housePos, _uid]; +_queryResult = [_query, 2] call HC_fnc_asyncCall; +_house setVariable ["house_id", _queryResult select 0, true]; diff --git a/life_hc/MySQL/Housing/fn_deleteDBContainer.sqf b/life_hc/MySQL/Housing/fn_deleteDBContainer.sqf old mode 100644 new mode 100755 index 36b9b55bc..6135b7a58 --- a/life_hc/MySQL/Housing/fn_deleteDBContainer.sqf +++ b/life_hc/MySQL/Housing/fn_deleteDBContainer.sqf @@ -7,22 +7,27 @@ Description: Delete Container and remove Container in Database */ -private ["_house","_houseID","_ownerID","_housePos","_query","_radius","_containers"]; -_container = [_this,0,objNull,[objNull]] call BIS_fnc_param; + +params [ + ["_container", objNull, [objNull]] +]; + if (isNull _container) exitWith {diag_log "container null";}; +_containerID = _container getVariable ["container_id", -1]; + +private "_query"; -_containerID = _container getVariable ["container_id",-1]; if (_containerID isEqualTo -1) then { _containerPos = getPosATL _container; - _ownerID = (_container getVariable "container_owner") select 0; - _query = format ["UPDATE containers SET owned='0', pos='[]' WHERE pid='%1' AND pos='%2' AND owned='1'",_ownerID,_containerPos]; + private _ownerID = (_container getVariable "container_owner") select 0; + _query = format ["deleteContainer:%1:%2", _ownerID, _containerPos]; } else { - _query = format ["UPDATE containers SET owned='0', pos='[]' WHERE id='%1'",_containerID]; + _query = format ["deleteContainer1:%1",_containerID]; }; -_container setVariable ["container_id",nil,true]; -_container setVariable ["container_owner",nil,true]; +_container setVariable ["container_id", nil, true]; +_container setVariable ["container_owner", nil, true]; -[_query,1] call HC_fnc_asyncCall; +[_query, 1] call HC_fnc_asyncCall; -["CALL deleteOldContainers",1] call HC_fnc_asyncCall; +["deleteOldContainers", 1] call HC_fnc_asyncCall; deleteVehicle _container; diff --git a/life_hc/MySQL/Housing/fn_fetchPlayerHouses.sqf b/life_hc/MySQL/Housing/fn_fetchPlayerHouses.sqf old mode 100644 new mode 100755 index 08940cb8e..368060a29 --- a/life_hc/MySQL/Housing/fn_fetchPlayerHouses.sqf +++ b/life_hc/MySQL/Housing/fn_fetchPlayerHouses.sqf @@ -10,30 +10,30 @@ 1. Fetches all the players houses and sets them up. 2. Fetches all the players containers and sets them up. */ -private ["_query","_containers","_containerss","_houses"]; + params [ ["_uid","",[""]] ]; + if (_uid isEqualTo "") exitWith {}; -_query = format ["SELECT pid, pos, classname, inventory, gear, dir, id FROM containers WHERE pid='%1' AND owned='1'",_uid]; -_containers = [_query,2,true] call HC_fnc_asyncCall; +private _query = format ["selectContainers:%1", _uid]; +private _containers = [_query, 2, true] call HC_fnc_asyncCall; +private _containerss = []; -_containerss = []; { _position = call compile format ["%1",_x select 1]; _house = nearestObject [_position, "House"]; _direction = call compile format ["%1",_x select 5]; - _trunk = [_x select 3] call HC_fnc_mresToArray; + _trunk = _x select 3; if (_trunk isEqualType "") then {_trunk = call compile format ["%1", _trunk];}; - _gear = [_x select 4] call HC_fnc_mresToArray; + _gear = _x select 4; if (_gear isEqualType "") then {_gear = call compile format ["%1", _gear];}; _container = createVehicle[_x select 2,[0,0,999],[],0,"NONE"]; waitUntil {!isNil "_container" && {!isNull _container}}; _containerss = _house getVariable ["containers",[]]; _containerss pushBack _container; _container allowDamage false; - _container enableRopeAttach false; _container setPosATL _position; _container setVectorDirAndUp _direction; //Fix position for more accurate positioning @@ -71,11 +71,11 @@ _containerss = []; _container addBackpackCargoGlobal [((_backpacks select 0) select _i), ((_backpacks select 1) select _i)]; }; }; - _house setVariable ["containers",_containerss,true]; + _house setVariable ["containers", _containerss, true]; } forEach _containers; -_query = format ["SELECT pid, pos FROM houses WHERE pid='%1' AND owned='1'",_uid]; -_houses = [_query,2,true] call HC_fnc_asyncCall; +_query = format ["selectHousePositions:%1", _uid]; +private _houses = [_query, 2, true] call HC_fnc_asyncCall; _return = []; { @@ -85,4 +85,4 @@ _return = []; _return pushBack [_x select 1]; } forEach _houses; -missionNamespace setVariable [format ["houses_%1",_uid],_return]; +missionNamespace setVariable [format ["houses_%1", _uid], _return]; diff --git a/life_hc/MySQL/Housing/fn_houseGarage.sqf b/life_hc/MySQL/Housing/fn_houseGarage.sqf old mode 100644 new mode 100755 index 56baebfe1..56bfb6a4c --- a/life_hc/MySQL/Housing/fn_houseGarage.sqf +++ b/life_hc/MySQL/Housing/fn_houseGarage.sqf @@ -12,21 +12,9 @@ params [ ["_mode",-1,[0]] ]; -if (_uid isEqualTo "") exitWith {}; -if (isNull _house) exitWith {}; -if (_mode isEqualTo -1) exitWith {}; +if (_uid isEqualTo "" || {isNull _house} || {_mode isEqualTo -1}) exitWith {}; private _housePos = getPosATL _house; -private "_query"; - -if (_mode isEqualTo 0) then { - _query = format ["UPDATE houses SET garage='1' WHERE pid='%1' AND pos='%2'",_uid,_housePos]; -} else { - _query = format ["UPDATE houses SET garage='0' WHERE pid='%1' AND pos='%2'",_uid,_housePos]; -}; - -if (EXTDB_SETTING(getNumber,"DebugMode") isEqualTo 1) then { - diag_log format ["Query: %1",_query]; -}; - -[_query,1] call DB_fnc_asyncCall; \ No newline at end of file +private _active = ["0", "1"] select (_mode isEqualTo 0); +private _query = format ["updateGarage:%1:%2:%3", _active, _uid, _housePos]; +[_query, 1] call HC_fnc_asyncCall; diff --git a/life_hc/MySQL/Housing/fn_sellHouse.sqf b/life_hc/MySQL/Housing/fn_sellHouse.sqf old mode 100644 new mode 100755 index 16fd3be32..c7bffcfee --- a/life_hc/MySQL/Housing/fn_sellHouse.sqf +++ b/life_hc/MySQL/Housing/fn_sellHouse.sqf @@ -8,22 +8,28 @@ Used in selling the house, sets the owned to 0 and will cleanup with a stored procedure on restart. */ -private ["_house","_houseID","_ownerID","_housePos","_query","_radius","_containers"]; -_house = [_this,0,objNull,[objNull]] call BIS_fnc_param; -if (isNull _house) exitWith {}; -_houseID = _house getVariable ["house_id",-1]; +params [ + ["_house", objNull, [objNull]] +]; + +if (isNull _house) exitWith {systemChat ":SERVER:sellHouse: House is null";}; +private _houseID = _house getVariable ["house_id", -1]; + +private "_query"; + if (_houseID isEqualTo -1) then { - _housePos = getPosATL _house; - _ownerID = (_house getVariable "house_owner") select 0; - _query = format ["UPDATE houses SET owned='0', pos='[]' WHERE pid='%1' AND pos='%2' AND owned='1'",_ownerID,_housePos]; + private _housePos = getPosATL _house; + private _ownerID = (_house getVariable "house_owner") select 0; + _query = format ["deleteHouse:%1:%2", _ownerID, _housePos]; } else { - _query = format ["UPDATE houses SET owned='0', pos='[]' WHERE id='%1'",_houseID]; + _query = format ["deleteHouse1:%1", _houseID]; }; -_house setVariable ["house_id",nil,true]; -_house setVariable ["house_owner",nil,true]; +_house setVariable ["house_id", nil, true]; +_house setVariable ["house_owner", nil, true]; +_house setVariable ["garageBought", false, true]; -[_query,1] call HC_fnc_asyncCall; -_house setVariable ["house_sold",nil,true]; -["CALL deleteOldHouses",1] call HC_fnc_asyncCall; \ No newline at end of file +[_query, 1] call HC_fnc_asyncCall; +_house setVariable ["house_sold", nil, true]; +["deleteOldHouses", 1] call HC_fnc_asyncCall; diff --git a/life_hc/MySQL/Housing/fn_sellHouseContainer.sqf b/life_hc/MySQL/Housing/fn_sellHouseContainer.sqf old mode 100644 new mode 100755 index 0f6152575..a080686bb --- a/life_hc/MySQL/Housing/fn_sellHouseContainer.sqf +++ b/life_hc/MySQL/Housing/fn_sellHouseContainer.sqf @@ -8,22 +8,27 @@ Used in selling the house, container sets the owned to 0 and will cleanup with a stored procedure on restart. */ -private ["_house","_houseID","_ownerID","_housePos","_query","_radius","_containers"]; -_container = [_this,0,objNull,[objNull]] call BIS_fnc_param; -if (isNull _container) exitWith {}; +params [ + ["_container", objNull, [objNull]] +]; + +if (isNull _container) exitWith {}; _containerID = _container getVariable ["container_id",-1]; + +private "_query"; + if (_containerID isEqualTo -1) then { _containerPos = getPosATL _container; - _ownerID = (_container getVariable "container_owner") select 0; - _query = format ["UPDATE containers SET owned='0', pos='[]' WHERE pid='%1' AND pos='%2' AND owned='1'",_ownerID,_containerPos]; + private _ownerID = (_container getVariable "container_owner") select 0; + _query = format ["deleteContainer:%1:%2", _ownerID, _containerPos]; } else { - _query = format ["UPDATE containers SET owned='0', pos='[]' WHERE id='%1'",_containerID]; + _query = format ["deleteContainer1:%1", _containerID]; }; -_container setVariable ["container_id",nil,true]; -_container setVariable ["container_owner",nil,true]; +_container setVariable ["container_id", nil, true]; +_container setVariable ["container_owner", nil, true]; deleteVehicle _container; -[_query,1] call HC_fnc_asyncCall; -["CALL deleteOldContainers",1] call HC_fnc_asyncCall; \ No newline at end of file +[_query, 1] call HC_fnc_asyncCall; +["deleteOldContainers", 1] call HC_fnc_asyncCall; diff --git a/life_hc/MySQL/Housing/fn_updateHouseContainers.sqf b/life_hc/MySQL/Housing/fn_updateHouseContainers.sqf old mode 100644 new mode 100755 index d34158199..8aca57fe3 --- a/life_hc/MySQL/Housing/fn_updateHouseContainers.sqf +++ b/life_hc/MySQL/Housing/fn_updateHouseContainers.sqf @@ -7,20 +7,22 @@ Description: Update inventory "i" in container */ -private ["_containerID","_containers","_query","_vehItems","_vehMags","_vehWeapons","_vehBackpacks","_cargo"]; -_container = [_this,0,objNull,[objNull]] call BIS_fnc_param; + +params [ + ["_container", objNull, [objNull]] +]; + if (isNull _container) exitWith {}; -_containerID = _container getVariable ["container_id",-1]; -if (_houseID isEqualTo -1) exitWith {}; -_vehItems = getItemCargo _container; -_vehMags = getMagazineCargo _container; -_vehWeapons = getWeaponCargo _container; -_vehBackpacks = getBackpackCargo _container; -_cargo = [_vehItems,_vehMags,_vehWeapons,_vehBackpacks]; +private _containerID = _container getVariable ["container_id", -1]; +if (_containerID isEqualTo -1) exitWith {}; -_cargo = [_cargo] call HC_fnc_mresArray; +private _vehItems = getItemCargo _container; +private _vehMags = getMagazineCargo _container; +private _vehWeapons = getWeaponCargo _container; +private _vehBackpacks = getBackpackCargo _container; +private _cargo = [_vehItems, _vehMags, _vehWeapons, _vehBackpacks]; -_query = format ["UPDATE containers SET gear='%1' WHERE id='%2'",_cargo,_containerID]; +private _query = format ["updateContainer:%1:%2", _cargo, _containerID]; -[_query,1] call HC_fnc_asyncCall; +[_query, 1] call HC_fnc_asyncCall; diff --git a/life_hc/MySQL/Housing/fn_updateHouseTrunk.sqf b/life_hc/MySQL/Housing/fn_updateHouseTrunk.sqf old mode 100644 new mode 100755 index 02f5ae6fe..c05c347e5 --- a/life_hc/MySQL/Housing/fn_updateHouseTrunk.sqf +++ b/life_hc/MySQL/Housing/fn_updateHouseTrunk.sqf @@ -7,16 +7,17 @@ Description: Update inventory "y" in container */ -private ["_house"]; -_container = [_this,0,objNull,[objNull]] call BIS_fnc_param; -if (isNull _container) exitWith {}; -_trunkData = _container getVariable ["Trunk",[[],0]]; -_containerID = _container getVariable ["container_id",-1]; +params [ + ["_container", objNull, [objNull]] +]; + +if (isNull _container) exitWith {}; -if (_containerID isEqualTo -1) exitWith {}; //Dafuq? +_trunkData = _container getVariable ["Trunk", [[], 0]]; +_containerID = _container getVariable ["container_id", -1]; -_trunkData = [_trunkData] call HC_fnc_mresArray; -_query = format ["UPDATE containers SET inventory='%1' WHERE id='%2'",_trunkData,_containerID]; +if (_containerID isEqualTo -1) exitWith {}; -[_query,1] call HC_fnc_asyncCall; +_query = format ["updateHouseTrunk:%1:%2", _trunkData, _containerID]; +[_query, 1] call HC_fnc_asyncCall; diff --git a/life_hc/MySQL/Vehicles/fn_chopShopSell.sqf b/life_hc/MySQL/Vehicles/fn_chopShopSell.sqf old mode 100644 new mode 100755 index a47da9473..1628eb5ec --- a/life_hc/MySQL/Vehicles/fn_chopShopSell.sqf +++ b/life_hc/MySQL/Vehicles/fn_chopShopSell.sqf @@ -24,10 +24,10 @@ private _displayName = FETCH_CONFIG2(getText,"CfgVehicles",typeOf _vehicle, "dis private _dbInfo = _vehicle getVariable ["dbInfo",[]]; if (count _dbInfo > 0) then { _dbInfo params ["_uid","_plate"]; - private _query = format ["UPDATE vehicles SET alive='0' WHERE pid='%1' AND plate='%2'",_uid,_plate]; + private _query = format ["deleteVehicle:%1:%2", _uid, _plate]; [_query,1] call HC_fnc_asyncCall; }; deleteVehicle _vehicle; -[_price,_displayName] remoteExecCall ["life_fnc_chopShopSold", remoteExecutedOwner]; \ No newline at end of file +[_price,_displayName] remoteExecCall ["life_fnc_chopShopSold", remoteExecutedOwner]; diff --git a/life_hc/MySQL/Vehicles/fn_getVehicles.sqf b/life_hc/MySQL/Vehicles/fn_getVehicles.sqf old mode 100644 new mode 100755 index 1debb7a1a..6a742e038 --- a/life_hc/MySQL/Vehicles/fn_getVehicles.sqf +++ b/life_hc/MySQL/Vehicles/fn_getVehicles.sqf @@ -8,16 +8,18 @@ Description: Sends a request to query the database information and returns vehicles. */ -private ["_pid","_side","_type","_unit","_ret","_tickTime","_queryResult"]; -_pid = [_this,0,"",[""]] call BIS_fnc_param; -_side = [_this,1,sideUnknown,[west]] call BIS_fnc_param; -_type = [_this,2,"",[""]] call BIS_fnc_param; -_unit = [_this,3,objNull,[objNull]] call BIS_fnc_param; + +params [ + ["_pid", "", [""]], + ["_side", sideUnknown, [west]], + ["_type", "", [""]], + ["_unit", objNull, [objNull]] +]; //Error checks -if (_pid isEqualTo "" || _side isEqualTo sideUnknown || _type isEqualTo "" || isNull _unit) exitWith { +if (_pid isEqualTo "" || {_side isEqualTo sideUnknown} || {_type isEqualTo ""} || {isNull _unit}) exitWith { if (!isNull _unit) then { - [[]] remoteExec ["life_fnc_impoundMenu",_unit]; + [[]] remoteExec ["life_fnc_impoundMenu", _unit]; }; }; @@ -28,17 +30,15 @@ _side = switch (_side) do { default {"Error"}; }; -if (_side == "Error") exitWith { - [[]] remoteExec ["life_fnc_impoundMenu",_unit]; +if (_side isEqualTo "Error") exitWith { + [[]] remoteExec ["life_fnc_impoundMenu", _unit]; }; -_query = format ["SELECT id, side, classname, type, pid, alive, active, plate, color FROM vehicles WHERE pid='%1' AND alive='1' AND active='0' AND side='%2' AND type='%3'",_pid,_side,_type]; - -_tickTime = diag_tickTime; -_queryResult = [_query,2,true] call HC_fnc_asyncCall; +private _query = format ["selectVehicles:%1:%2:%3", _pid, _side, _type]; +private _queryResult = [_query, 2, true] call HC_fnc_asyncCall; if (_queryResult isEqualType "") exitWith { - [[]] remoteExec ["life_fnc_impoundMenu",_unit]; + [[]] remoteExec ["life_fnc_impoundMenu", _unit]; }; -[_queryResult] remoteExec ["life_fnc_impoundMenu",_unit]; +[_queryResult] remoteExec ["life_fnc_impoundMenu", _unit]; diff --git a/life_hc/MySQL/Vehicles/fn_spawnVehicle.sqf b/life_hc/MySQL/Vehicles/fn_spawnVehicle.sqf old mode 100644 new mode 100755 index 48c0409fa..c6accc63a --- a/life_hc/MySQL/Vehicles/fn_spawnVehicle.sqf +++ b/life_hc/MySQL/Vehicles/fn_spawnVehicle.sqf @@ -9,6 +9,7 @@ Sends the query request to the database, if an array is returned then it creates the vehicle if it's not in use or dead. */ + params [ ["_vid", -1, [0]], ["_pid", "", [""]], @@ -19,24 +20,19 @@ params [ "_spawntext" ]; - - -private _ownerID = _unit getVariable ["life_clientID",-1]; private _unit_return = _unit; private _name = name _unit; private _side = side _unit; -//_unit = owner _unit; - if (_vid isEqualTo -1 || {_pid isEqualTo ""}) exitWith {}; if (_vid in serv_sv_use) exitWith {}; serv_sv_use pushBack _vid; -private _servIndex = serv_sv_use find _vid; -private _query = format ["SELECT id, side, classname, type, pid, alive, active, plate, color, inventory, gear, fuel, damage, blacklist FROM vehicles WHERE id='%1' AND pid='%2'",_vid,_pid]; +private _servIndex = serv_sv_use find _vid; private _tickTime = diag_tickTime; -private _queryResult = [_query,2] call HC_fnc_asyncCall; +private _query = format ["selectVehiclesMore:%1:%2", _vid, _pid]; +private _queryResult = [_query, 2] call HC_fnc_asyncCall; if (EXTDB_SETTING(getNumber,"DebugMode") isEqualTo 1) then { diag_log "------------- Client Query Request -------------"; @@ -48,9 +44,9 @@ if (EXTDB_SETTING(getNumber,"DebugMode") isEqualTo 1) then { if (_queryResult isEqualType "") exitWith {}; -_vInfo = _queryResult; +private _vInfo = _queryResult; if (isNil "_vInfo") exitWith {serv_sv_use deleteAt _servIndex;}; -if (count _vInfo isEqualTo 0) exitWith {serv_sv_use deleteAt _servIndex;}; +if (_vInfo isEqualTo []) exitWith {serv_sv_use deleteAt _servIndex;}; if ((_vInfo select 5) isEqualTo 0) exitWith { serv_sv_use deleteAt _servIndex; @@ -62,7 +58,6 @@ if ((_vInfo select 6) isEqualTo 1) exitWith { [1,"STR_Garage_SQLError_Active",true,[_vInfo select 2]] remoteExecCall ["life_fnc_broadcast",_unit]; }; - private "_nearVehicles"; if !(_sp isEqualType "") then { _nearVehicles = nearestObjects[_sp,["Car","Air","Ship"],10]; @@ -70,21 +65,21 @@ if !(_sp isEqualType "") then { _nearVehicles = []; }; -if (count _nearVehicles > 0) exitWith { +if !(_nearVehicles isEqualTo []) exitWith { serv_sv_use deleteAt _servIndex; [_price,_unit_return] remoteExecCall ["life_fnc_garageRefund",_unit]; [1,"STR_Garage_SpawnPointError",true] remoteExecCall ["life_fnc_broadcast",_unit]; }; -_query = format ["UPDATE vehicles SET active='1', damage='""[]""' WHERE pid='%1' AND id='%2'",_pid,_vid]; +_query = format ["updateVehicle:%1:%2", _pid, _vid]; -private _trunk = [(_vInfo select 9)] call HC_fnc_mresToArray; -private _gear = [(_vInfo select 10)] call HC_fnc_mresToArray; -private _damage = [call compile (_vInfo select 12)] call HC_fnc_mresToArray; +private _trunk = _vInfo select 9; +private _gear = _vInfo select 10; +private _damage = _vInfo select 12; private _wasIllegal = _vInfo select 13; -_wasIllegal = if (_wasIllegal isEqualTo 1) then { true } else { false }; +_wasIllegal = _wasIllegal isEqualTo 1; -[_query,1] call HC_fnc_asyncCall; +[_query, 1] call HC_fnc_asyncCall; private "_vehicle"; if (_sp isEqualType "") then { @@ -93,7 +88,7 @@ if (_sp isEqualType "") then { _vehicle allowDamage false; _hs = nearestObjects[getMarkerPos _sp,["Land_Hospital_side2_F"],50] select 0; _vehicle setPosATL (_hs modelToWorld [-0.4,-4,12.65]); - sleep 0.6; + uiSleep 0.6; } else { _vehicle = createVehicle [(_vInfo select 2),_sp,[],0,"NONE"]; waitUntil {!isNil "_vehicle" && {!isNull _vehicle}}; @@ -105,11 +100,10 @@ if (_sp isEqualType "") then { _vehicle allowDamage true; //Send keys over the network. [_vehicle] remoteExecCall ["life_fnc_addVehicle2Chain",_unit]; -/*[_pid,_side,_vehicle,1] call HC_fnc_keyManagement;*/ [_pid,_side,_vehicle,1] remoteExecCall ["TON_fnc_keyManagement",RSERV]; _vehicle lock 2; //Reskin the vehicle -[_vehicle,_vInfo select 8] remoteExecCall ["life_fnc_colorVehicle",_unit]; +[_vehicle, _vInfo select 8] remoteExecCall ["life_fnc_colorVehicle",_unit]; _vehicle setVariable ["vehicle_info_owners",[[_pid,_name]],true]; _vehicle setVariable ["dbInfo",[(_vInfo select 4),(_vInfo select 7)],true]; _vehicle disableTIEquipment true; //No Thermals.. They're cheap but addictive. @@ -118,42 +112,42 @@ _vehicle disableTIEquipment true; //No Thermals.. They're cheap but addictive. if (LIFE_SETTINGS(getNumber,"save_vehicle_virtualItems") isEqualTo 1) then { _vehicle setVariable ["Trunk",_trunk,true]; - + if (_wasIllegal) then { private _refPoint = if (_sp isEqualType "") then {getMarkerPos _sp;} else {_sp;}; - + private _distance = 100000; private "_location"; { private _tempLocation = nearestLocation [_refPoint, _x]; private _tempDistance = _refPoint distance _tempLocation; - + if (_tempDistance < _distance) then { _location = _tempLocation; _distance = _tempDistance; }; false - + } count ["NameCityCapital", "NameCity", "NameVillage"]; - + _location = text _location; - [1,"STR_NOTF_BlackListedVehicle",true,[_location,_name]] remoteExecCall ["life_fnc_broadcast",west]; + [1, "STR_NOTF_BlackListedVehicle", true, [_location, _name]] remoteExecCall ["life_fnc_broadcast", west]; - _query = format ["UPDATE vehicles SET blacklist='0' WHERE id='%1' AND pid='%2'",_vid,_pid]; - [_query,1] call HC_fnc_asyncCall; - }; + _query = format ["updateVehicleBlacklist:%1:%2", _vid, _pid]; + [_query, 1] call HC_fnc_asyncCall; + }; } else { - _vehicle setVariable ["Trunk",[[],0],true]; + _vehicle setVariable ["Trunk", [[], 0], true]; }; if (LIFE_SETTINGS(getNumber,"save_vehicle_fuel") isEqualTo 1) then { _vehicle setFuel (_vInfo select 11); - } else { +} else { _vehicle setFuel 1; }; -if (count _gear > 0 && (LIFE_SETTINGS(getNumber,"save_vehicle_inventory") isEqualTo 1)) then { +if (!(_gear isEqualTo []) && (LIFE_SETTINGS(getNumber,"save_vehicle_inventory") isEqualTo 1)) then { _items = _gear select 0; _mags = _gear select 1; _weapons = _gear select 2; @@ -173,7 +167,7 @@ if (count _gear > 0 && (LIFE_SETTINGS(getNumber,"save_vehicle_inventory") isEqua }; }; -if (count _damage > 0 && (LIFE_SETTINGS(getNumber,"save_vehicle_damage") isEqualTo 1)) then { +if (!(_damage isEqualTo []) && (LIFE_SETTINGS(getNumber,"save_vehicle_damage") isEqualTo 1)) then { _parts = getAllHitPointsDamage _vehicle; for "_i" from 0 to ((count _damage) - 1) do { @@ -182,7 +176,7 @@ if (count _damage > 0 && (LIFE_SETTINGS(getNumber,"save_vehicle_damage") isEqual }; //Sets of animations -if ((_vInfo select 1) isEqualTo "civ" && ((_vInfo select 2)) isEqualTo "B_Heli_Light_01_F" && !((_vInfo select 8) isEqualTo 13)) then { +if ((_vInfo select 1) isEqualTo "civ" && (_vInfo select 2) isEqualTo "B_Heli_Light_01_F" && !((_vInfo select 8) isEqualTo 13)) then { [_vehicle,"civ_littlebird",true] remoteExecCall ["life_fnc_vehicleAnimate",_unit]; }; @@ -190,9 +184,9 @@ if ((_vInfo select 1) isEqualTo "cop" && ((_vInfo select 2)) in ["C_Offroad_01_F [_vehicle,"cop_offroad",true] remoteExecCall ["life_fnc_vehicleAnimate",_unit]; }; -if ((_vInfo select 1) isEqualTo "med" && ((_vInfo select 2)) isEqualTo "C_Offroad_01_F") then { +if ((_vInfo select 1) isEqualTo "med" && (_vInfo select 2) isEqualTo "C_Offroad_01_F") then { [_vehicle,"med_offroad",true] remoteExecCall ["life_fnc_vehicleAnimate",_unit]; }; -[1,_spawntext] remoteExecCall ["life_fnc_broadcast",_unit]; +[1, _spawntext] remoteExecCall ["life_fnc_broadcast",_unit]; serv_sv_use deleteAt _servIndex; diff --git a/life_hc/MySQL/Vehicles/fn_vehicleCreate.sqf b/life_hc/MySQL/Vehicles/fn_vehicleCreate.sqf old mode 100644 new mode 100755 index bb64db519..5f2434c74 --- a/life_hc/MySQL/Vehicles/fn_vehicleCreate.sqf +++ b/life_hc/MySQL/Vehicles/fn_vehicleCreate.sqf @@ -7,17 +7,19 @@ Description: Answers the query request to create the vehicle in the database. */ -private ["_uid","_side","_type","_classname","_color","_plate"]; -_uid = [_this,0,"",[""]] call BIS_fnc_param; -_side = [_this,1,sideUnknown,[west]] call BIS_fnc_param; -_vehicle = [_this,2,objNull,[objNull]] call BIS_fnc_param; -_color = [_this,3,-1,[0]] call BIS_fnc_param; + +params [ + ["_uid", "", [""]], + ["_side", sideUnknown, [west]], + ["_vehicle", objNull, [objNull]], + ["_color", -1, [0]] +]; //Error checks -if (_uid isEqualTo "" || _side isEqualTo sideUnknown || isNull _vehicle) exitWith {}; +if (_uid isEqualTo "" || {_side isEqualTo sideUnknown} || {isNull _vehicle}) exitWith {}; if (!alive _vehicle) exitWith {}; -_className = typeOf _vehicle; -_type = switch (true) do { +private _className = typeOf _vehicle; +private _type = switch (true) do { case (_vehicle isKindOf "Car"): {"Car"}; case (_vehicle isKindOf "Air"): {"Air"}; case (_vehicle isKindOf "Ship"): {"Ship"}; @@ -30,8 +32,7 @@ _side = switch (_side) do { default {"Error"}; }; -_plate = round(random(1000000)); - -[_uid,_side,_type,_classname,_color,_plate] call HC_fnc_insertVehicle; +private _plate = round(random(1000000)); +[_uid, _side, _type, _classname, _color, _plate] call HC_fnc_insertVehicle; -_vehicle setVariable ["dbInfo",[_uid,_plate],true]; +_vehicle setVariable ["dbInfo", [_uid, _plate], true]; diff --git a/life_hc/MySQL/Vehicles/fn_vehicleDelete.sqf b/life_hc/MySQL/Vehicles/fn_vehicleDelete.sqf old mode 100644 new mode 100755 index 7c392232f..218dfe874 --- a/life_hc/MySQL/Vehicles/fn_vehicleDelete.sqf +++ b/life_hc/MySQL/Vehicles/fn_vehicleDelete.sqf @@ -8,16 +8,16 @@ Doesn't actually delete since we don't give our DB user that type of access so instead we set it to alive=0 so it never shows again. */ -diag_log "Script VehicleDelete HC"; -private ["_vid","_sp","_pid","_query","_sql","_type","_thread"]; -_vid = [_this,0,-1,[0]] call BIS_fnc_param; -_pid = [_this,1,"",[""]] call BIS_fnc_param; -_sp = [_this,2,2500,[0]] call BIS_fnc_param; -_unit = [_this,3,objNull,[objNull]] call BIS_fnc_param; -_type = [_this,4,"",[""]] call BIS_fnc_param; -if (_vid isEqualTo -1 || _pid isEqualTo "" || _sp isEqualTo 0 || isNull _unit || _type isEqualTo "") exitWith {}; +params [ + ["_vid", -1, [0]], + ["_pid", "", [""]], + ["_sp", 2500, [0]], + ["_unit", objNull, [objNull]], + ["_type", "", [""]] +]; -_query = format ["UPDATE vehicles SET alive='0' WHERE pid='%1' AND id='%2'",_pid,_vid]; +if (_vid isEqualTo -1 || {_pid isEqualTo ""} || {_sp isEqualTo 0} || {isNull _unit} || {_type isEqualTo ""}) exitWith {}; -_thread = [_query,1] call HC_fnc_asyncCall; +private _query = format ["deleteVehicleID:%1:%2", _pid, _vid]; +private _thread = [_query, 1] call HC_fnc_asyncCall; diff --git a/life_hc/MySQL/Vehicles/fn_vehicleStore.sqf b/life_hc/MySQL/Vehicles/fn_vehicleStore.sqf old mode 100644 new mode 100755 index f963dd9de..9f27bba11 --- a/life_hc/MySQL/Vehicles/fn_vehicleStore.sqf +++ b/life_hc/MySQL/Vehicles/fn_vehicleStore.sqf @@ -2,44 +2,49 @@ /* File: fn_vehicleStore.sqf Author: Bryan "Tonic" Boardwine - - This file is for Nanou's HeadlessClient. - Description: Stores the vehicle in the 'Garage' */ -private ["_vehicle","_impound","_vInfo","_vInfo","_plate","_uid","_query","_sql","_unit","_trunk","_vehItems","_vehMags","_vehWeapons","_vehBackpacks","_cargo","_saveItems","_storetext","_resourceItems","_fuel","_damage","_itemList","_totalweight","_weight"]; -_vehicle = [_this,0,objNull,[objNull]] call BIS_fnc_param; -_impound = [_this,1,false,[true]] call BIS_fnc_param; -_unit = [_this,2,objNull,[objNull]] call BIS_fnc_param; -_storetext = [_this,3,"",[""]] call BIS_fnc_param; -_ownerID = _unit getVariable ["life_clientID",-1]; -_resourceItems = LIFE_SETTINGS(getArray,"save_vehicle_items"); - -if (isNull _vehicle || isNull _unit) exitWith {life_impound_inuse = false; _ownerID publicVariableClient "life_impound_inuse";life_garage_store = false;_ownerID publicVariableClient "life_garage_store";}; //Bad data passed. -_vInfo = _vehicle getVariable ["dbInfo",[]]; - -if (count _vInfo > 0) then { + +params [ + ["_vehicle", objNull, [objNull]], + ["_impound", false, [true]], + ["_unit", objNull, [objNull]], + ["_storetext", "", [""]] +]; + +private _resourceItems = LIFE_SETTINGS(getArray,"save_vehicle_items"); +private _ownerID = _unit getVariable ["life_clientID",-1]; + +if (isNull _vehicle || {isNull _unit}) exitWith {life_impound_inuse = false; _ownerID publicVariableClient "life_impound_inuse";life_garage_store = false;_ownerID publicVariableClient "life_garage_store";}; //Bad data passed. +private _vInfo = _vehicle getVariable ["dbInfo", []]; +private "_plate"; +private "_uid"; + +if !(_vInfo isEqualTo []) then { _plate = _vInfo select 1; _uid = _vInfo select 0; }; // save damage. +private "_damage"; if (LIFE_SETTINGS(getNumber,"save_vehicle_damage") isEqualTo 1) then { _damage = getAllHitPointsDamage _vehicle; _damage = _damage select 2; - } else { +} else { _damage = []; }; -_damage = [_damage] call HC_fnc_mresArray; // because fuel price! +private "_fuel"; if (LIFE_SETTINGS(getNumber,"save_vehicle_fuel") isEqualTo 1) then { _fuel = (fuel _vehicle); - } else { +} else { _fuel = 1; }; +private "_query"; +private "_thread"; if (_impound) exitWith { if (_vInfo isEqualTo []) then { life_impound_inuse = false; @@ -49,7 +54,7 @@ if (_impound) exitWith { deleteVehicle _vehicle; }; } else { // no free repairs! - _query = format ["UPDATE vehicles SET active='0', fuel='%3', damage='%4' WHERE pid='%1' AND plate='%2'",_uid , _plate, _fuel, _damage]; + _query = format ["updateVehicleFuel:%1:%2:%3:%4", _fuel, _damage, _uid, _plate]; _thread = [_query,1] call HC_fnc_asyncCall; if (!isNil "_vehicle" && {!isNull _vehicle}) then { @@ -63,7 +68,14 @@ if (_impound) exitWith { // not persistent so just do this! if (_vInfo isEqualTo []) exitWith { + if (LIFE_SETTINGS(getNumber,"vehicle_rentalReturn") isEqualTo 1) then { + [1,"STR_Garage_Store_NotPersistent2",true] remoteExecCall ["life_fnc_broadcast",_ownerID]; + if (!isNil "_vehicle" && {!isNull _vehicle}) then { + deleteVehicle _vehicle; + }; + } else { [1,"STR_Garage_Store_NotPersistent",true] remoteExecCall ["life_fnc_broadcast",_ownerID]; + }; life_garage_store = false; _ownerID publicVariableClient "life_garage_store"; }; @@ -75,23 +87,25 @@ if !(_uid isEqualTo getPlayerUID _unit) exitWith { }; // sort out whitelisted items! -_trunk = _vehicle getVariable ["Trunk", [[], 0]]; -_itemList = _trunk select 0; -_totalweight = 0; +private _trunk = _vehicle getVariable ["Trunk", [[], 0]]; +private _itemList = _trunk select 0; +private _totalweight = 0; +private "_weight"; _items = []; if (LIFE_SETTINGS(getNumber,"save_vehicle_virtualItems") isEqualTo 1) then { if (LIFE_SETTINGS(getNumber,"save_vehicle_illegal") isEqualTo 1) then { - _blacklist = false; - _profileQuery = format ["SELECT name FROM players WHERE pid='%1'", _uid]; + private _blacklist = false; + _profileQuery = format ["selectName:%1", _uid]; _profileName = [_profileQuery, 2] call HC_fnc_asyncCall; _profileName = _profileName select 0; + { - _isIllegal = M_CONFIG(getNumber,"VirtualItems",_x select 0,"illegal"); + private _isIllegal = M_CONFIG(getNumber,"VirtualItems",(_x select 0),"illegal"); - _isIllegal = if (_isIllegal isEqualTo 1) then { true } else { false }; + _isIllegal = if (_isIllegal isEqualTo 1) then { true } else { false }; - if (((_x select 0) in _resourceItems) || (_isIllegal)) then { - _items pushBack[_x select 0, _x select 1]; + if (((_x select 0) in _resourceItems) || (_isIllegal)) then { + _items pushBack[(_x select 0),(_x select 1)]; _weight = (ITEM_WEIGHT(_x select 0)) * (_x select 1); _totalweight = _weight + _totalweight; }; @@ -101,48 +115,47 @@ if (LIFE_SETTINGS(getNumber,"save_vehicle_virtualItems") isEqualTo 1) then { } foreach _itemList; - if (_blacklist) then { - [_uid, _profileName, "481"] remoteExecCall["HC_fnc_wantedAdd", HC_Life]; - _query = format ["UPDATE vehicles SET blacklist='1' WHERE pid='%1' AND plate='%2'", _uid, _plate]; + if (_blacklist) then { + [_uid, _profileName, "481"] remoteExecCall["life_fnc_wantedAdd", RSERV]; + _query = format ["updateVehicleBlacklistPlate:%1:%2", _uid, _plate]; _thread = [_query, 1] call HC_fnc_asyncCall; }; } else { - { - if ((_x select 0) in _resourceItems) then { - _items pushBack[_x select 0,_x select 1]; - _weight = (ITEM_WEIGHT(_x select 0)) * (_x select 1); - _totalweight = _weight + _totalweight; - }; - } - forEach _itemList; + { + if ((_x select 0) in _resourceItems) then { + _items pushBack[(_x select 0),(_x select 1)]; + _weight = (ITEM_WEIGHT(_x select 0)) * (_x select 1); + _totalweight = _weight + _totalweight; + }; + } + forEach _itemList; }; - _trunk = [_items, _totalweight]; - } - else { - _trunk = [[], 0]; - }; + _trunk = [_items, _totalweight]; +} +else { + _trunk = [[], 0]; +}; + +private "_cargo"; + if (LIFE_SETTINGS(getNumber,"save_vehicle_inventory") isEqualTo 1) then { - _vehItems = getItemCargo _vehicle; - _vehMags = getMagazineCargo _vehicle; - _vehWeapons = getWeaponCargo _vehicle; - _vehBackpacks = getBackpackCargo _vehicle; - _cargo = [_vehItems,_vehMags,_vehWeapons,_vehBackpacks]; + private _vehItems = getItemCargo _vehicle; + private _vehMags = getMagazineCargo _vehicle; + private _vehWeapons = getWeaponCargo _vehicle; + private _vehBackpacks = getBackpackCargo _vehicle; + _cargo = [_vehItems, _vehMags, _vehWeapons, _vehBackpacks]; // no items? clean the array so the database looks pretty if (((_vehItems select 0) isEqualTo []) && ((_vehMags select 0) isEqualTo []) && ((_vehWeapons select 0) isEqualTo []) && ((_vehBackpacks select 0) isEqualTo [])) then {_cargo = [];}; } else { _cargo = []; }; -// prepare -_trunk = [_trunk] call HC_fnc_mresArray; -_cargo = [_cargo] call HC_fnc_mresArray; - // update -_query = format ["UPDATE vehicles SET active='0', inventory='%3', gear='%4', fuel='%5', damage='%6' WHERE pid='%1' AND plate='%2'", _uid, _plate, _trunk, _cargo, _fuel, _damage]; +_query = format ["updateVehicleAll:%1:%2:%3:%4:%5:%6", _trunk, _cargo, _fuel, _damage, _uid, _plate]; _thread = [_query,1] call HC_fnc_asyncCall; if (!isNil "_vehicle" && {!isNull _vehicle}) then { @@ -151,4 +164,4 @@ if (!isNil "_vehicle" && {!isNull _vehicle}) then { life_garage_store = false; _ownerID publicVariableClient "life_garage_store"; -[1,_storetext] remoteExecCall ["life_fnc_broadcast",_ownerID]; +[1, _storetext] remoteExecCall ["life_fnc_broadcast", _ownerID]; diff --git a/life_hc/MySQL/Vehicles/fn_vehicleUpdate.sqf b/life_hc/MySQL/Vehicles/fn_vehicleUpdate.sqf old mode 100644 new mode 100755 index 39590e998..d623b2fef --- a/life_hc/MySQL/Vehicles/fn_vehicleUpdate.sqf +++ b/life_hc/MySQL/Vehicles/fn_vehicleUpdate.sqf @@ -8,48 +8,53 @@ Description: Tells the database that this vehicle need update inventory. */ -private ["_vehicle","_plate","_uid","_query","_sql","_dbInfo","_thread","_cargo","_trunk","_resourceItems","_itemList","_totalweight","_weight"]; -_vehicle = [_this,0,objNull,[objNull]] call BIS_fnc_param; -_mode = [_this,1,1,[0]] call BIS_fnc_param; + +params [ + ["_vehicle", objNull, [objNull]], + ["_mode", 1, [0]] +]; + if (isNull _vehicle) exitWith {}; //NULL -_dbInfo = _vehicle getVariable ["dbInfo",[]]; +private _dbInfo = _vehicle getVariable ["dbInfo",[]]; if (_dbInfo isEqualTo []) exitWith {}; -_uid = _dbInfo select 0; -_plate = _dbInfo select 1; + +private _uid = _dbInfo select 0; +private _plate = _dbInfo select 1; + switch (_mode) do { case 1: { - _vehItems = getItemCargo _vehicle; - _vehMags = getMagazineCargo _vehicle; - _vehWeapons = getWeaponCargo _vehicle; - _vehBackpacks = getBackpackCargo _vehicle; - _cargo = [_vehItems,_vehMags,_vehWeapons,_vehBackpacks]; + private _vehItems = getItemCargo _vehicle; + private _vehMags = getMagazineCargo _vehicle; + private _vehWeapons = getWeaponCargo _vehicle; + private _vehBackpacks = getBackpackCargo _vehicle; + private _cargo = [_vehItems,_vehMags,_vehWeapons,_vehBackpacks]; // Keep it clean! - if (((_vehItems select 0) isEqualTo []) && ((_vehMags select 0) isEqualTo []) && ((_vehWeapons select 0) isEqualTo []) && ((_vehBackpacks select 0) isEqualTo [])) then {_cargo = [];}; - - _cargo = [_cargo] call HC_fnc_mresArray; + if (((_vehItems select 0) isEqualTo []) && ((_vehMags select 0) isEqualTo []) && ((_vehWeapons select 0) isEqualTo []) && ((_vehBackpacks select 0) isEqualTo [])) then { + _cargo = []; + }; - _query = format ["UPDATE vehicles SET gear='%3' WHERE pid='%1' AND plate='%2'",_uid,_plate,_cargo]; - _thread = [_query,1] call HC_fnc_asyncCall; + private _query = format ["updateVehicleGear:%1:%2:%3", _cargo, _uid, _plate]; + private _thread = [_query, 1] call HC_fnc_asyncCall; }; case 2: { - _resourceItems = LIFE_SETTINGS(getArray,"save_vehicle_items"); - _trunk = _vehicle getVariable ["Trunk",[[],0]]; - _totalweight = 0; - _items = []; + private _resourceItems = LIFE_SETTINGS(getArray,"save_vehicle_items"); + private _trunk = _vehicle getVariable ["Trunk",[[],0]]; + private _itemList = _trunk select 0; + private _totalweight = 0; + private _items = []; { if ((_x select 0) in _resourceItems) then { - _items pushBack [(_x select 0),(_x select 1)]; - _weight = (ITEM_WEIGHT(_x select 0)) * (_x select 1); + _items pushBack [_x select 0,_x select 1]; + private _weight = (ITEM_WEIGHT(_x select 0)) * (_x select 1); _totalweight = _weight + _totalweight; }; - }forEach (_trunk select 0); + } forEach _itemList; _trunk = [_items,_totalweight]; - _trunk = [_trunk] call HC_fnc_mresArray; - _query = format ["UPDATE vehicles SET inventory='%3' WHERE pid='%1' AND plate='%2'",_uid,_plate,_trunk]; - _thread = [_query,1] call HC_fnc_asyncCall; + private _query = format ["updateVehicleTrunk:%1:%2:%3", _trunk, _uid, _plate]; + private _thread = [_query,1] call HC_fnc_asyncCall; }; }; diff --git a/life_hc/MySQL/WantedSystem/fn_wantedAdd.sqf b/life_hc/MySQL/WantedSystem/fn_wantedAdd.sqf old mode 100644 new mode 100755 index c878dc3c5..9b369a26a --- a/life_hc/MySQL/WantedSystem/fn_wantedAdd.sqf +++ b/life_hc/MySQL/WantedSystem/fn_wantedAdd.sqf @@ -10,88 +10,45 @@ Description: Adds or appends a unit to the wanted list. */ -private ["_uid","_type","_index","_data","_crime","_val","_customBounty","_name","_pastCrimes","_query","_queryResult"]; -_uid = [_this,0,"",[""]] call BIS_fnc_param; -_name = [_this,1,"",[""]] call BIS_fnc_param; -_type = [_this,2,"",[""]] call BIS_fnc_param; -_customBounty = [_this,3,-1,[0]] call BIS_fnc_param; -if (_uid isEqualTo "" || _type isEqualTo "" || _name isEqualTo "") exitWith {}; //Bad data passed. + +params [ + ["_uid","",[""]], + ["_name","",[""]], + ["_type","",[""]], + ["_customBounty",-1,[0]] +]; + +if (_uid isEqualTo "" || {_type isEqualTo ""} || {_name isEqualTo ""}) exitWith {}; //Bad data passed. //What is the crime? -switch (_type) do -{ - case "187V": {_type = ["187V",650]}; - case "187": {_type = ["187",2000]}; - case "901": {_type = ["901",450]}; - case "215": {_type = ["215",200]}; - case "213": {_type = ["213",1000]}; - case "211": {_type = ["211",100]}; - case "207": {_type = ["207",350]}; - case "207A": {_type = ["207A",200]}; - case "390": {_type = ["390",1500]}; - case "487": {_type = ["487",150]}; - case "488": {_type = ["488",70]}; - case "480": {_type = ["480",100]}; - case "481": {_type = ["481",100]}; - case "482": {_type = ["482",500]}; - case "483": {_type = ["483",950]}; - case "459": {_type = ["459",650]}; - case "666": {_type = ["666",200]}; - case "667": {_type = ["667",4500]}; - case "668": {_type = ["668",1500]}; +private _crimesConfig = getArray(missionConfigFile >> "Life_Settings" >> "crimes"); +private _index = [_type, _crimesConfig] call life_util_fnc_index; - case "1": {_type = ["1",250]}; - case "2": {_type = ["2",100]}; - case "3": {_type = ["3",75]}; - case "4": {_type = ["4",125]}; - case "5": {_type = ["5",50]}; - case "6": {_type = ["6",40]}; - case "7": {_type = ["7",75]}; - case "8": {_type = ["8",2500]}; - case "9": {_type = ["9",2500]}; - case "10": {_type = ["10",7500]}; - case "11": {_type = ["11",5000]}; - case "12": {_type = ["12",1250]}; - case "13": {_type = ["13",750]}; - case "14": {_type = ["14",250]}; - case "15": {_type = ["15",1250]}; - case "16": {_type = ["16",750]}; - case "17": {_type = ["17",50]}; - case "18": {_type = ["18",750]}; - case "19": {_type = ["19",1250]}; - case "20": {_type = ["20",250]}; - case "21": {_type = ["21",250]}; - case "22": {_type = ["22",1000]}; - case "23": {_type = ["23",2500]}; - case "24": {_type = ["24",5000]}; - case "25": {_type = ["25",10000]}; - default {_type = [];}; -}; +if (_index isEqualTo -1) exitWith {}; + +_type = [_type, parseNumber ((_crimesConfig select _index) select 1)]; if (_type isEqualTo []) exitWith {}; //Not our information being passed... //Is there a custom bounty being sent? Set that as the pricing. if !(_customBounty isEqualTo -1) then {_type set[1,_customBounty];}; //Search the wanted list to make sure they are not on it. -_query = format ["SELECT wantedID FROM wanted WHERE wantedID='%1'",_uid]; -_queryResult = [_query,2,true] call HC_fnc_asyncCall; -_val = [_type select 1] call HC_fnc_numberSafe; -_number = _type select 0; +private _query = format ["selectWantedID:%1", _uid]; +private _queryResult = [_query,2,true] call HC_fnc_asyncCall; +private _val = _type select 1; +private _number = _type select 0; + +if !(_queryResult isEqualTo []) then { + _query = format ["selectWantedCrimes:%1", _uid]; + _queryResult = [_query,2] call HC_fnc_asyncCall; + _pastCrimes = _queryResult select 0; -if !(count _queryResult isEqualTo 0) then -{ - _crime = format ["SELECT wantedCrimes, wantedBounty FROM wanted WHERE wantedID='%1'",_uid]; - _crimeresult = [_crime,2] call HC_fnc_asyncCall; - _pastcrimess = [_crimeresult select 0] call HC_fnc_mresToArray; - if (_pastcrimess isEqualType "") then {_pastcrimess = call compile format ["%1", _pastcrimess];}; - _pastCrimes = _pastcrimess; + if (_pastCrimes isEqualType "") then {_pastCrimes = call compile format ["%1", _pastCrimes];}; _pastCrimes pushBack _number; - _pastCrimes = [_pastCrimes] call HC_fnc_mresArray; - _query = format ["UPDATE wanted SET wantedCrimes = '%1', wantedBounty = wantedBounty + '%2', active = '1' WHERE wantedID='%3'",_pastCrimes,_val,_uid]; + _query = format ["updateWanted:%1:%2:%3", _pastCrimes, _val, _uid]; [_query,1] call HC_fnc_asyncCall; } else { _crime = [_type select 0]; - _crime = [_crime] call HC_fnc_mresArray; - _query = format ["INSERT INTO wanted (wantedID, wantedName, wantedCrimes, wantedBounty, active) VALUES('%1', '%2', '%3', '%4', '1')",_uid,_name,_crime,_val]; + _query = format ["insertWanted:%1:%2:%3:%4", _uid, _name, _crime, _val]; [_query,1] call HC_fnc_asyncCall; }; diff --git a/life_hc/MySQL/WantedSystem/fn_wantedBounty.sqf b/life_hc/MySQL/WantedSystem/fn_wantedBounty.sqf old mode 100644 new mode 100755 index 9096a2ef4..7c99d2219 --- a/life_hc/MySQL/WantedSystem/fn_wantedBounty.sqf +++ b/life_hc/MySQL/WantedSystem/fn_wantedBounty.sqf @@ -10,24 +10,27 @@ Description: Checks if the person is on the bounty list and awards the cop for killing them. */ -private ["_civ","_cop","_id","_half","_result","_queryResult","_amount"]; -_uid = [_this,0,"",[""]] call BIS_fnc_param; -_civ = [_this,1,objNull,[objNull]] call BIS_fnc_param; -_cop = [_this,2,objNull,[objNull]] call BIS_fnc_param; -_half = [_this,3,false,[false]] call BIS_fnc_param; -if (isNull _civ || isNull _cop) exitWith {}; -_query = format ["SELECT wantedID, wantedName, wantedCrimes, wantedBounty FROM wanted WHERE active='1' AND wantedID='%1'",_uid]; -_queryResult = [_query,2] call HC_fnc_asyncCall; +params [ + ["_uid","",[""]], + ["_civ",objNull,[objNull]], + ["_cop",objNull,[objNull]], + ["_half",false,[false]] +]; -if !(count _queryResult isEqualTo 0) then -{ - _amount = _queryResult select 3; +if (isNull _civ || {isNull _cop}) exitWith {}; + +private _query = format ["selectWanted:%1", _uid]; +private _queryResult = [_query,2] call HC_fnc_asyncCall; + +private "_amount"; +if !(_queryResult isEqualTo []) then { + _amount = _queryResult param [3]; if !(_amount isEqualTo 0) then { if (_half) then { - [((_amount) / 2),_amount] remoteExecCall ["life_fnc_bountyReceive",_cop]; + [((_amount) / 2),_amount] remoteExecCall ["life_fnc_bountyReceive", _cop]; } else { - [_amount,_amount] remoteExecCall ["life_fnc_bountyReceive",_cop]; + [_amount,_amount] remoteExecCall ["life_fnc_bountyReceive", _cop]; }; }; }; diff --git a/life_hc/MySQL/WantedSystem/fn_wantedCrimes.sqf b/life_hc/MySQL/WantedSystem/fn_wantedCrimes.sqf old mode 100644 new mode 100755 index 90722f07a..562c904af --- a/life_hc/MySQL/WantedSystem/fn_wantedCrimes.sqf +++ b/life_hc/MySQL/WantedSystem/fn_wantedCrimes.sqf @@ -10,71 +10,27 @@ Description: Grabs a list of crimes committed by a person. */ -private ["_display","_criminal","_tab","_queryResult","_result","_ret","_crimesDb","_crimesArr","_type"]; + disableSerialization; -_ret = [_this,0,objNull,[objNull]] call BIS_fnc_param; -_criminal = [_this,1,[],[]] call BIS_fnc_param; -_query = format ["SELECT wantedCrimes, wantedBounty FROM wanted WHERE active='1' AND wantedID='%1'",_criminal select 0]; -_queryResult = [_query,2] call HC_fnc_asyncCall; +params [ + ["_ret",objNull,[objNull]], + ["_criminal",[],[[]]] +]; -_crimesArr = []; +private _query = format ["selectWantedActive:%1", _criminal select 0]; +private _queryResult = [_query, 2] call HC_fnc_asyncCall; -_type = [_queryResult select 0] call HC_fnc_mresToArray; +private _type = _queryResult select 0; if (_type isEqualType "") then {_type = call compile format ["%1", _type];}; + +private _crimesArr = []; { - switch (_x) do - { - case "187V": {_x = "STR_Crime_187V"}; - case "187": {_x = "STR_Crime_187"}; - case "901": {_x = "STR_Crime_901"}; - case "215": {_x = "STR_Crime_215"}; - case "213": {_x = "STR_Crime_213"}; - case "211": {_x = "STR_Crime_211"}; - case "207": {_x = "STR_Crime_207"}; - case "207A": {_x = "STR_Crime_207A"}; - case "390": {_x = "STR_Crime_390"}; - case "487": {_x = "STR_Crime_487"}; - case "488": {_x = "STR_Crime_488"}; - case "480": {_x = "STR_Crime_480"}; - case "481": {_x = "STR_Crime_481"}; - case "482": {_x = "STR_Crime_482"}; - case "483": {_x = "STR_Crime_483"}; - case "459": {_x = "STR_Crime_459"}; - case "666": {_x = "STR_Crime_666"}; - case "667": {_x = "STR_Crime_667"}; - case "668": {_x = "STR_Crime_668"}; - case "919": {_x = "STR_Crime_919"}; - case "919A": {_x = "STR_Crime_919A"}; + private _str = format ["STR_Crime_%1", _x]; + _crimesArr pushBack _str; + false +} count _type; - case "1": {_x = "STR_Crime_1"}; - case "2": {_x = "STR_Crime_2"}; - case "3": {_x = "STR_Crime_3"}; - case "4": {_x = "STR_Crime_4"}; - case "5": {_x = "STR_Crime_5"}; - case "6": {_x = "STR_Crime_6"}; - case "7": {_x = "STR_Crime_7"}; - case "8": {_x = "STR_Crime_8"}; - case "9": {_x = "STR_Crime_9"}; - case "10": {_x = "STR_Crime_10"}; - case "11": {_x = "STR_Crime_11"}; - case "12": {_x = "STR_Crime_12"}; - case "13": {_x = "STR_Crime_13"}; - case "14": {_x = "STR_Crime_14"}; - case "15": {_x = "STR_Crime_15"}; - case "16": {_x = "STR_Crime_16"}; - case "17": {_x = "STR_Crime_17"}; - case "18": {_x = "STR_Crime_18"}; - case "19": {_x = "STR_Crime_19"}; - case "20": {_x = "STR_Crime_20"}; - case "21": {_x = "STR_Crime_21"}; - case "22": {_x = "STR_Crime_22"}; - case "23": {_x = "STR_Crime_23"}; - case "24": {_x = "STR_Crime_24"}; - case "25": {_x = "STR_Crime_25"}; - }; - _crimesArr pushBack _x; -}forEach _type; -_queryResult set[0,_crimesArr]; +_queryResult set[0, _crimesArr]; -[_queryResult] remoteExec ["life_fnc_wantedInfo",_ret]; +[_queryResult] remoteExec ["life_fnc_wantedInfo", _ret]; diff --git a/life_hc/MySQL/WantedSystem/fn_wantedFetch.sqf b/life_hc/MySQL/WantedSystem/fn_wantedFetch.sqf old mode 100644 new mode 100755 index 40e66bdf0..eaa133e51 --- a/life_hc/MySQL/WantedSystem/fn_wantedFetch.sqf +++ b/life_hc/MySQL/WantedSystem/fn_wantedFetch.sqf @@ -11,39 +11,46 @@ Description: Displays wanted list information sent from the server. */ -private ["_ret","_list","_result","_queryResult","_units","_inStatement"]; -_ret = [_this,0,objNull,[objNull]] call BIS_fnc_param; + +params [ + ["_ret", objNull, [objNull]] +]; + if (isNull _ret) exitWith {}; -_inStatement = ""; -_list = []; -_units = []; -{if ((side _x) isEqualTo civilian) then {_units pushBack (getPlayerUID _x)};} forEach playableUnits; + +private _inStatement = ""; +private _list = []; +private _units = []; +{ + if (side _x isEqualTo civilian) then {_units pushBack (getPlayerUID _x)}; + false +} count playableUnits; if (_units isEqualTo []) exitWith {[_list] remoteExec ["life_fnc_wantedList",_ret];}; { if (count _units > 1) then { - if (_inStatement isEqualTo "") then { + if (_inStatement isEqualTo "") then { _inStatement = "'" + _x + "'"; } else { _inStatement = _inStatement + ", '" + _x + "'"; }; } else { - _inStatement = _x; + _inStatement = _x; }; } forEach _units; -_query = format ["SELECT wantedID, wantedName FROM wanted WHERE active='1' AND wantedID in (%1)",_inStatement]; -_queryResult = [_query,2,true] call HC_fnc_asyncCall; - -diag_log format ["Query: %1",_query]; - +private _query = format ["selectWantedActiveID:%1", _inStatement]; +private _queryResult = [_query, 2, true] call HC_fnc_asyncCall; +if (EXTDB_SETTING(getNumber,"DebugMode") isEqualTo 1) then { + diag_log format ["Query: %1",_query]; +}; { - _list pushBack (_x); -} -forEach _queryResult; + _list pushBack _x; + false +} count _queryResult; -if (_list isEqualTo []) exitWith {[_list] remoteExec ["life_fnc_wantedList",_ret];}; +if (_list isEqualTo []) exitWith {[_list] remoteExec ["life_fnc_wantedList", _ret];}; -[_list] remoteExec ["life_fnc_wantedList",_ret]; +[_list] remoteExec ["life_fnc_wantedList", _ret]; diff --git a/life_hc/MySQL/WantedSystem/fn_wantedPerson.sqf b/life_hc/MySQL/WantedSystem/fn_wantedPerson.sqf old mode 100644 new mode 100755 index c1ffdf50b..383c96fa2 --- a/life_hc/MySQL/WantedSystem/fn_wantedPerson.sqf +++ b/life_hc/MySQL/WantedSystem/fn_wantedPerson.sqf @@ -10,12 +10,16 @@ Description: Fetches a specific person from the wanted array. */ -private ["_unit","_index","_queryResult","_result"]; -_unit = [_this,0,objNull,[objNull]] call BIS_fnc_param; + +params [ + ["_unit", objNull, [objNull]] +]; + if (isNull _unit) exitWith {[]}; -_uid = getPlayerUID player; -_query = format ["SELECT wantedID, wantedName, wantedBounty FROM wanted WHERE active='1' AND wantedID='%1'",_uid]; -_queryResult = [_query,2] call HC_fnc_asyncCall; +private _uid = getPlayerUID _unit; +private _query = format ["selectWantedBounty:%1", _uid]; +private _queryResult = [_query,2] call HC_fnc_asyncCall; + if (_queryResult isEqualTo []) exitWith {[]}; _queryResult; diff --git a/life_hc/MySQL/WantedSystem/fn_wantedProfUpdate.sqf b/life_hc/MySQL/WantedSystem/fn_wantedProfUpdate.sqf old mode 100644 new mode 100755 index 3daa31ea9..f74adc3ad --- a/life_hc/MySQL/WantedSystem/fn_wantedProfUpdate.sqf +++ b/life_hc/MySQL/WantedSystem/fn_wantedProfUpdate.sqf @@ -9,19 +9,20 @@ Description: Updates name of player if they change profiles */ -private ["_uid","_name","_query","_tickTime","_wantedCheck","_wantedQuery"]; -_uid = [_this,0,"",[""]] call BIS_fnc_param; -_name = [_this,1,"",[""]] call BIS_fnc_param; +params [ + ["_uid","",[""]], + ["_name","",[""]] +]; + //Bad data check -if (_uid isEqualTo "" || _name isEqualTo "") exitWith {}; +if (_uid isEqualTo "" || {_name isEqualTo ""}) exitWith {}; -_wantedCheck = format ["SELECT wantedName FROM wanted WHERE wantedID='%1'",_uid]; -_wantedQuery = [_wantedCheck,2] call HC_fnc_asyncCall; +private _wantedCheck = format ["selectWantedName:%1", _uid]; +private _wantedQuery = [_wantedCheck, 2] call HC_fnc_asyncCall; if (_wantedQuery isEqualTo []) exitWith {}; -_wantedQuery = call compile format ["%1",_wantedQuery]; if !(_name isEqualTo (_wantedQuery select 0)) then { - _query = format ["UPDATE wanted SET wantedName='%1' WHERE wantedID='%2'",_name,_uid]; - [_query,2] call HC_fnc_asyncCall; + private _query = format ["updateWantedName:%1:%2", _name, _uid]; + [_query, 2] call HC_fnc_asyncCall; }; diff --git a/life_hc/MySQL/WantedSystem/fn_wantedRemove.sqf b/life_hc/MySQL/WantedSystem/fn_wantedRemove.sqf old mode 100644 new mode 100755 index 677047ade..4c2bca12c --- a/life_hc/MySQL/WantedSystem/fn_wantedRemove.sqf +++ b/life_hc/MySQL/WantedSystem/fn_wantedRemove.sqf @@ -10,9 +10,12 @@ Description: Removes a person from the wanted list. */ -private ["_uid","_query"]; -_uid = [_this,0,"",[""]] call BIS_fnc_param; + +params [ + ["_uid", "", [""]] +]; + if (_uid isEqualTo "") exitWith {}; //Bad data -_query = format ["UPDATE wanted SET active = '0', wantedCrimes = '[]', wantedBounty = 0 WHERE wantedID='%1'",_uid]; -[_query,2] call HC_fnc_asyncCall; +private _query = format ["deleteWanted:%1", _uid]; +[_query, 2] call HC_fnc_asyncCall; diff --git a/life_hc/config.cpp b/life_hc/config.cpp old mode 100644 new mode 100755 index 3478c4f4a..da33046a0 --- a/life_hc/config.cpp +++ b/life_hc/config.cpp @@ -24,13 +24,8 @@ class CfgFunctions { file = "\life_hc\MySQL\General"; class asyncCall {}; - class bool {}; class insertRequest {}; class insertVehicle {}; - class mresArray {}; - class mresString {}; - class mresToArray {}; - class numberSafe {}; class queryRequest {}; class updatePartial {}; class updateRequest {}; diff --git a/life_hc/initHC.sqf b/life_hc/initHC.sqf index ed820d00a..7d333a6a2 100644 --- a/life_hc/initHC.sqf +++ b/life_hc/initHC.sqf @@ -21,7 +21,7 @@ if (isNil {uiNamespace getVariable "life_sql_id"}) then { try { _result = EXTDB format ["9:ADD_DATABASE:%1",EXTDB_SETTING(getText,"DatabaseName")]; if (!(_result isEqualTo "[1]")) then {throw "extDB3: Error with Database Connection"}; - _result = EXTDB format ["9:ADD_DATABASE_PROTOCOL:%2:SQL:%1:TEXT2",FETCH_CONST(life_sql_id),EXTDB_SETTING(getText,"DatabaseName")]; + _result = EXTDB format ["9:ADD_DATABASE_PROTOCOL:%2:SQL_CUSTOM:%1:AL.ini",FETCH_CONST(life_sql_id),EXTDB_SETTING(getText,"DatabaseName")]; if (!(_result isEqualTo "[1]")) then {throw "extDB3: Error with Database Connection"}; } catch { diag_log _exception; @@ -48,10 +48,10 @@ if (_extDBNotLoaded isEqualType []) then { if (_extDBNotLoaded isEqualType []) exitWith {}; //extDB3-HC did not fully initialize so terminate the rest of the initialization process. -["CALL resetLifeVehicles",1] call HC_fnc_asyncCall; -["CALL deleteDeadVehicles",1] call HC_fnc_asyncCall; -["CALL deleteOldHouses",1] call HC_fnc_asyncCall; -["CALL deleteOldGangs",1] call HC_fnc_asyncCall; +["resetLifeVehicles", 1] call HC_fnc_asyncCall; +["deleteDeadVehicles", 1] call HC_fnc_asyncCall; +["deleteOldHouses", 1] call HC_fnc_asyncCall; +["deleteOldGangs", 1] call HC_fnc_asyncCall; _timeStamp = diag_tickTime; diag_log "----------------------------------------------------------------------------------------------------"; @@ -59,8 +59,6 @@ diag_log "------------------------------------ Starting Altis Life HC Init ----- diag_log format["-------------------------------------------- Version %1 -----------------------------------------",(LIFE_SETTINGS(getText,"framework_version"))]; diag_log "----------------------------------------------------------------------------------------------------"; -[] execFSM "\life_hc\FSM\cleanup.fsm"; - [] spawn HC_fnc_cleanup; /* Initialize hunting zone(s) */ @@ -86,7 +84,6 @@ HC_MPAllowedFuncs = [ "hc_fnc_addhouse", "hc_fnc_deletedbcontainer", "hc_fnc_fetchplayerhouses", - "hc_fnc_housecleanup", "hc_fnc_sellhouse", "hc_fnc_sellhousecontainer", "hc_fnc_updatehousecontainers", diff --git a/life_server/FSM/cleanup.fsm b/life_server/FSM/cleanup.fsm deleted file mode 100644 index 7ea28061e..000000000 --- a/life_server/FSM/cleanup.fsm +++ /dev/null @@ -1,179 +0,0 @@ -/*%FSM*/ -/*%FSM*/ -/* -item0[] = {"init",0,250,-62.908096,-391.651611,27.091887,-341.651672,0.000000,"init"}; -item1[] = {"true",8,218,-62.976639,-315.185364,27.023363,-265.185364,0.000000,"true"}; -item2[] = {"Share__Work_load",2,250,-64.183350,-224.681931,25.816656,-174.681931,0.000000,"Share " \n "Work-load"}; -item3[] = {"Continue__",4,4314,-220.591476,74.216980,-130.591476,124.216980,0.000000,"" \n "" \n "Continue" \n "" \n ""}; -item4[] = {"Time_Check",4,218,-219.425827,-133.310532,-129.425964,-83.310455,0.000000,"Time Check"}; -item5[] = {"Delete_Dead_Cars",2,250,-220.186951,-29.248400,-130.187195,20.751413,0.000000,"Delete" \n "Dead" \n "Cars"}; -item6[] = {"",7,210,-312.538239,95.295059,-304.538239,103.295059,0.000000,""}; -item7[] = {"",7,210,-312.798218,-204.081940,-304.798218,-196.081940,0.000000,""}; -item8[] = {"End_Cleanup_",1,250,-64.828239,87.581070,25.171984,137.581238,0.000000,"" \n "End Cleanup" \n ""}; -item9[] = {"Check_for_HC_",4,218,-65.059021,-30.047342,24.941008,19.952658,0.000000,"" \n "Check for HC" \n ""}; -link0[] = {0,1}; -link1[] = {1,2}; -link2[] = {2,4}; -link3[] = {3,6}; -link4[] = {4,5}; -link5[] = {5,3}; -link6[] = {5,9}; -link7[] = {6,7}; -link8[] = {7,2}; -link9[] = {9,8}; -globals[] = {0.000000,0,0,0,0,640,480,1,53,6316128,1,-481.887177,425.726196,554.522583,-436.926575,857,816,1}; -window[] = {0,-1,-1,-32000,-32000,1120,545,1909,159,1,875}; -*//*%FSM*/ -class FSM -{ - fsmName = "Server-Side Cleanup"; - class States - { - /*%FSM*/ - class init - { - name = "init"; - itemno = 0; - init = /*%FSM*/"private [""_impound"",""_cars"",""_objs"",""_totCars"",""_thread""];" \n - "_impound = time;" \n - "_cars = time;" \n - "_objs = time;" \n - "cleanupFSM setFSMVariable [""stopfsm"",false];"/*%FSM*/; - precondition = /*%FSM*/""/*%FSM*/; - class Links - { - /*%FSM*/ - class true - { - itemno = 1; - priority = 0.000000; - to="Share__Work_load"; - precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/"true"/*%FSM*/; - action=/*%FSM*/""/*%FSM*/; - }; - /*%FSM*/ - }; - }; - /*%FSM*/ - /*%FSM*/ - class Share__Work_load - { - name = "Share__Work_load"; - itemno = 2; - init = /*%FSM*/""/*%FSM*/; - precondition = /*%FSM*/""/*%FSM*/; - class Links - { - /*%FSM*/ - class Time_Check - { - itemno = 4; - priority = 0.000000; - to="Delete_Dead_Cars"; - precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/"((time - _cars) > (3 * 60))"/*%FSM*/; - action=/*%FSM*/""/*%FSM*/; - }; - /*%FSM*/ - }; - }; - /*%FSM*/ - /*%FSM*/ - class Delete_Dead_Cars - { - name = "Delete_Dead_Cars"; - itemno = 5; - init = /*%FSM*/"{" \n - " if (!alive _x) then {" \n - " _dbInfo = _x getVariable [""dbInfo"",[]];" \n - " if (count _dbInfo > 0) then {" \n - " _uid = _dbInfo select 0;" \n - " _plate = _dbInfo select 1;" \n - "" \n - " _query = format [""UPDATE vehicles SET alive='0' WHERE pid='%1' AND plate='%2'"",_uid,_plate];" \n - " _query spawn {" \n - " " \n - " _thread = [_this,1] call DB_fnc_asyncCall;" \n - " };" \n - " };" \n - " if (!isNil ""_x"" && {!isNull _x}) then {" \n - " deleteVehicle _x;" \n - " };" \n - " };" \n - "} forEach allMissionObjects ""LandVehicle"";" \n - "" \n - "{" \n - " if (!alive _x) then {" \n - " _dbInfo = _x getVariable [""dbInfo"",[]];" \n - " if (count _dbInfo > 0) then {" \n - " _uid = _dbInfo select 0;" \n - " _plate = _dbInfo select 1;" \n - "" \n - " _query = format [""UPDATE vehicles SET alive='0' WHERE pid='%1' AND plate='%2'"",_uid,_plate];" \n - " _query spawn {" \n - " " \n - " _thread = [_this,1] call DB_fnc_asyncCall;" \n - " };" \n - " };" \n - " if (!isNil ""_x"" && {!isNull _x}) then {" \n - " deleteVehicle _x;" \n - " };" \n - " };" \n - "} forEach allMissionObjects ""Air"";" \n - "_cars = time;" \n - "" \n - "//Group cleanup." \n - "{" \n - " if (units _x isEqualTo [] && local _x) then {" \n - " deleteGroup _x;" \n - " };" \n - "} forEach allGroups;"/*%FSM*/; - precondition = /*%FSM*/""/*%FSM*/; - class Links - { - /*%FSM*/ - class Check_for_HC_ - { - itemno = 9; - priority = 0.000000; - to="End_Cleanup_"; - precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/"cleanupFSM getFSMVariable ""stopfsm"""/*%FSM*/; - action=/*%FSM*/""/*%FSM*/; - }; - /*%FSM*/ - /*%FSM*/ - class Continue__ - { - itemno = 3; - priority = 0.000000; - to="Share__Work_load"; - precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/"!(cleanupFSM getFSMVariable ""stopfsm"")"/*%FSM*/; - action=/*%FSM*/""/*%FSM*/; - }; - /*%FSM*/ - }; - }; - /*%FSM*/ - /*%FSM*/ - class End_Cleanup_ - { - name = "End_Cleanup_"; - itemno = 8; - init = /*%FSM*/""/*%FSM*/; - precondition = /*%FSM*/""/*%FSM*/; - class Links - { - }; - }; - /*%FSM*/ - }; - initState="init"; - finalStates[] = - { - "End_Cleanup_", - }; -}; -/*%FSM*/ diff --git a/life_server/Functions/Gangs/fn_insertGang.sqf b/life_server/Functions/Gangs/fn_insertGang.sqf old mode 100644 new mode 100755 index 784b1229a..bea490774 --- a/life_server/Functions/Gangs/fn_insertGang.sqf +++ b/life_server/Functions/Gangs/fn_insertGang.sqf @@ -6,64 +6,65 @@ Description: Inserts the gang into the database. */ -private ["_query","_queryResult","_gangMembers","_group"]; + params [ - ["_ownerID",objNull,[objNull]], - ["_uid","",[""]], - ["_gangName","",[""]] + ["_ownerID", objNull, [objNull]], + ["_uid", "", [""]], + ["_gangName", "", [""]] ]; -_group = group _ownerID; -if (isNull _ownerID || _uid isEqualTo "" || _gangName isEqualTo "") exitWith {}; //Fail +private _group = group _ownerID; + +if (isNull _ownerID || {_uid isEqualTo ""} || {_gangName isEqualTo ""}) exitWith {}; _ownerID = owner _ownerID; -_gangName = [_gangName] call DB_fnc_mresString; -_query = format ["SELECT id FROM gangs WHERE name='%1' AND active='1'",_gangName]; +private _query = format ["selectGangID:%1", _gangName]; -_queryResult = [_query,2] call DB_fnc_asyncCall; +private _queryResult = [_query, 2] call DB_fnc_asyncCall; //Check to see if the gang name already exists. -if (!(count _queryResult isEqualTo 0)) exitWith { - [1,"There is already a gang created with that name please pick another name."] remoteExecCall ["life_fnc_broadcast",_ownerID]; +if !(_queryResult isEqualTo []) exitWith { + [1, "There is already a gang created with that name please pick another name."] remoteExecCall ["life_fnc_broadcast", _ownerID]; life_action_gangInUse = nil; _ownerID publicVariableClient "life_action_gangInUse"; }; -_query = format ["SELECT id FROM gangs WHERE members LIKE '%2%1%2' AND active='1'",_uid,"%"]; +private _uidLike = format["%2%1%2", _uid, "%"]; +_query = format ["selectGangIDFromMembers:%1", _uidLike]; -_queryResult = [_query,2] call DB_fnc_asyncCall; +_queryResult = [_query,2 ] call DB_fnc_asyncCall; //Check to see if this person already owns or belongs to a gang. if (!(count _queryResult isEqualTo 0)) exitWith { - [1,"You are currently already active in a gang, please leave the gang first."] remoteExecCall ["life_fnc_broadcast",_ownerID]; + [1, "You are currently already active in a gang, please leave the gang first."] remoteExecCall ["life_fnc_broadcast", _ownerID]; life_action_gangInUse = nil; _ownerID publicVariableClient "life_action_gangInUse"; }; //Check to see if a gang with that name already exists but is inactive. -_query = format ["SELECT id, active FROM gangs WHERE name='%1' AND active='0'",_gangName]; +_query = format ["selectInactiveGang:%1", _gangName]; -_queryResult = [_query,2] call DB_fnc_asyncCall; -_gangMembers = [[_uid]] call DB_fnc_mresArray; +_queryResult = [_query, 2] call DB_fnc_asyncCall; +private _gangMembers = [_uid]; -if (!(count _queryResult isEqualTo 0)) then { - _query = format ["UPDATE gangs SET active='1', owner='%1',members='%2' WHERE id='%3'",_uid,_gangMembers,(_queryResult select 0)]; +if !(_queryResult isEqualTo []) then { + _query = format ["updateGang:%1:%2:%3", (_queryResult select 0), _gangMembers, _uid]; } else { - _query = format ["INSERT INTO gangs (owner, name, members) VALUES('%1','%2','%3')",_uid,_gangName,_gangMembers]; + _query = format ["insertGang:%1:%2:%3", _uid, _gangName, _gangMembers]; }; -_queryResult = [_query,1] call DB_fnc_asyncCall; +_queryResult = [_query, 1] call DB_fnc_asyncCall; -_group setVariable ["gang_name",_gangName,true]; -_group setVariable ["gang_owner",_uid,true]; -_group setVariable ["gang_bank",0,true]; -_group setVariable ["gang_maxMembers",8,true]; -_group setVariable ["gang_members",[_uid],true]; -[_group] remoteExecCall ["life_fnc_gangCreated",_ownerID]; +_group setVariable ["gang_name", _gangName, true]; +_group setVariable ["gang_owner", _uid, true]; +_group setVariable ["gang_bank", 0, true]; +_group setVariable ["gang_maxMembers", 8, true]; +_group setVariable ["gang_members", [_uid], true]; +[_group] remoteExecCall ["life_fnc_gangCreated", _ownerID]; uiSleep 0.35; -_query = format ["SELECT id FROM gangs WHERE owner='%1' AND active='1'",_uid]; +_query = format ["selectGangIDFromOwner:%1", _uid]; -_queryResult = [_query,2] call DB_fnc_asyncCall; +_queryResult = [_query, 2] call DB_fnc_asyncCall; -_group setVariable ["gang_id",(_queryResult select 0),true]; +_group setVariable ["gang_id", (_queryResult select 0), true]; diff --git a/life_server/Functions/Gangs/fn_queryPlayerGang.sqf b/life_server/Functions/Gangs/fn_queryPlayerGang.sqf old mode 100644 new mode 100755 index 36f6a7526..35313845e --- a/life_server/Functions/Gangs/fn_queryPlayerGang.sqf +++ b/life_server/Functions/Gangs/fn_queryPlayerGang.sqf @@ -5,15 +5,9 @@ Description: Queries to see if the player belongs to any gang. */ -private ["_query","_queryResult"]; -_query = format ["SELECT id, owner, name, maxmembers, bank, members FROM gangs WHERE active='1' AND members LIKE '%2%1%2'",_this,"%"]; +private _pid = format ["%2%1%2", _this, "%"]; +private _query = format ["selectPlayerGang:%1", _pid]; +private _queryResult = [_query, 2] call DB_fnc_asyncCall; -_queryResult = [_query,2] call DB_fnc_asyncCall; - -if !(count _queryResult isEqualTo 0) then { - _tmp = [_queryResult select 5] call DB_fnc_mresToArray; - if (_tmp isEqualType "") then {_tmp = call compile format ["%1", _tmp];}; - _queryResult set[5, _tmp]; -}; -missionNamespace setVariable [format ["gang_%1",_this],_queryResult]; +missionNamespace setVariable [format ["gang_%1", _this], _queryResult]; diff --git a/life_server/Functions/Gangs/fn_removeGang.sqf b/life_server/Functions/Gangs/fn_removeGang.sqf old mode 100644 new mode 100755 index fafb7a70d..cb5eb0c7a --- a/life_server/Functions/Gangs/fn_removeGang.sqf +++ b/life_server/Functions/Gangs/fn_removeGang.sqf @@ -6,19 +6,19 @@ Description: Removes gang from database */ -private ["_group","_groupID"]; -_group = param [0,grpNull,[grpNull]]; + +params [ + ["_group", grpNull, [grpNull]] +]; + if (isNull _group) exitWith {}; -_groupID = _group getVariable ["gang_id",-1]; +private _groupID = _group getVariable ["gang_id",-1]; if (_groupID isEqualTo -1) exitWith {}; -[format ["UPDATE gangs SET active='0' WHERE id='%1'",_groupID],1] call DB_fnc_asyncCall; +_group setVariable ["gang_owner",nil,true]; +[format ["deleteGang:%1", _groupID], 1] call DB_fnc_asyncCall; -_result = [format ["SELECT id FROM gangs WHERE active='1' AND id='%1'",_groupID],2] call DB_fnc_asyncCall; -if (count _result isEqualTo 0) then { - [_group] remoteExecCall ["life_fnc_gangDisbanded",(units _group)]; - uiSleep 5; - deleteGroup _group; -}; -["CALL deleteOldGangs",1] call DB_fnc_asyncCall; +[_group] remoteExecCall ["life_fnc_gangDisbanded", (units _group)]; +uiSleep 5; +deleteGroup _group; \ No newline at end of file diff --git a/life_server/Functions/Gangs/fn_updateGang.sqf b/life_server/Functions/Gangs/fn_updateGang.sqf old mode 100644 new mode 100755 index a8815996b..f985e51f7 --- a/life_server/Functions/Gangs/fn_updateGang.sqf +++ b/life_server/Functions/Gangs/fn_updateGang.sqf @@ -6,26 +6,28 @@ Description: Updates the gang information? */ -private ["_groupID","_bank","_maxMembers","_members","_membersFinal","_query","_owner"]; + params [ - ["_mode",0,[0]], - ["_group",grpNull,[grpNull]] + ["_mode", 0, [0]], + ["_group", grpNull, [grpNull]] ]; if (isNull _group) exitWith {}; //FAIL -_groupID = _group getVariable ["gang_id",-1]; +private _groupID = _group getVariable ["gang_id", -1]; if (_groupID isEqualTo -1) exitWith {}; +private "_query"; + switch (_mode) do { case 0: { - _bank = [(_group getVariable ["gang_bank",0])] call DB_fnc_numberSafe; - _maxMembers = _group getVariable ["gang_maxMembers",8]; - _members = [(_group getVariable "gang_members")] call DB_fnc_mresArray; - _owner = _group getVariable ["gang_owner",""]; + private _bank = _group getVariable ["gang_bank", 0]; + private _maxMembers = _group getVariable ["gang_maxMembers", 8]; + private _members = _group getVariable "gang_members"; + private _owner = _group getVariable ["gang_owner", ""]; if (_owner isEqualTo "") exitWith {}; - _query = format ["UPDATE gangs SET bank='%1', maxmembers='%2', owner='%3' WHERE id='%4'",_bank,_maxMembers,_owner,_groupID]; + _query = format ["updateGang1:%1:%2:%3:%4", _bank, _maxMembers, _owner, _groupID]; }; case 1: { @@ -43,7 +45,6 @@ switch (_mode) do { _funds = _funds + _value; _group setVariable ["gang_bank",_funds,true]; [1,"STR_ATM_DepositSuccessG",true,[_value]] remoteExecCall ["life_fnc_broadcast",remoteExecutedOwner]; - _cash = _cash - _value; } else { if (_value > _funds) exitWith { [1,"STR_ATM_NotEnoughFundsG",true] remoteExecCall ["life_fnc_broadcast",remoteExecutedOwner]; @@ -61,23 +62,24 @@ switch (_mode) do { diag_log (format [localize "STR_DL_ML_withdrewGang",name _unit,(getPlayerUID _unit),_value,[_funds] call life_fnc_numberText,[0] call life_fnc_numberText,[_cash] call life_fnc_numberText]); }; }; - _query = format ["UPDATE gangs SET bank='%1' WHERE id='%2'",([_funds] call DB_fnc_numberSafe),_groupID]; [getPlayerUID _unit,side _unit,_cash,0] call DB_fnc_updatePartial; + _query = format ["updateGangBank:%1:%2", _group getVariable ["gang_bank", 0], _groupID]; }; case 2: { - _query = format ["UPDATE gangs SET maxmembers='%1' WHERE id='%2'",(_group getVariable ["gang_maxMembers",8]),_groupID]; + _query = format ["updateGangMaxmembers:%1:%2", (_group getVariable ["gang_maxMembers", 8]), _groupID]; }; case 3: { - _owner = _group getVariable ["gang_owner",""]; + private _owner = _group getVariable ["gang_owner", ""]; if (_owner isEqualTo "") exitWith {}; - _query = format ["UPDATE gangs SET owner='%1' WHERE id='%2'",_owner,_groupID]; + _query = format ["updateGangOwner:%1:%2", _owner, _groupID]; }; case 4: { - _members = _group getVariable "gang_members"; - if (count _members > (_group getVariable ["gang_maxMembers",8])) then { + private _members = _group getVariable "gang_members"; + private "_membersFinal"; + if (count _members > (_group getVariable ["gang_maxMembers", 8])) then { _membersFinal = []; for "_i" from 0 to _maxMembers -1 do { _membersFinal pushBack (_members select _i); @@ -85,11 +87,10 @@ switch (_mode) do { } else { _membersFinal = _group getVariable "gang_members"; }; - _membersFinal = [_membersFinal] call DB_fnc_mresArray; - _query = format ["UPDATE gangs SET members='%1' WHERE id='%2'",_membersFinal,_groupID]; + _query = format ["updateGangMembers:%1:%2", _membersFinal, _groupID]; }; }; if (!isNil "_query") then { - [_query,1] call DB_fnc_asyncCall; + [_query, 1] call DB_fnc_asyncCall; }; diff --git a/life_server/Functions/Housing/fn_addContainer.sqf b/life_server/Functions/Housing/fn_addContainer.sqf old mode 100644 new mode 100755 index e7a999ac3..a3962cece --- a/life_server/Functions/Housing/fn_addContainer.sqf +++ b/life_server/Functions/Housing/fn_addContainer.sqf @@ -6,28 +6,27 @@ Description: Add container in Database. */ -private ["_containerPos","_query","_className","_dir"]; + params [ - ["_uid","",[""]], - ["_container",objNull,[objNull]] + ["_uid", "", [""]], + ["_container", objNull, [objNull]] ]; -if (isNull _container || _uid isEqualTo "") exitWith {}; +if (isNull _container || {_uid isEqualTo ""}) exitWith {}; -_containerPos = getPosATL _container; -_className = typeOf _container; -_dir = [vectorDir _container, vectorUp _container]; +private _containerPos = getPosATL _container; +private _className = typeOf _container; +private _dir = [vectorDir _container, vectorUp _container]; -_query = format ["INSERT INTO containers (pid, pos, classname, inventory, gear, owned, dir) VALUES('%1', '%2', '%3', '""[[],0]""', '""[]""', '1', '%4')",_uid,_containerPos,_className,_dir]; +private _query = format ["insertContainer:%1:%2:%3:%4", _uid, _containerPos, _className, _dir]; if (EXTDB_SETTING(getNumber,"DebugMode") isEqualTo 1) then { - diag_log format ["Query: %1",_query]; + diag_log format ["Query: %1", _query]; }; -[_query,1] call DB_fnc_asyncCall; +[_query, 1] call DB_fnc_asyncCall; uiSleep 0.3; -_query = format ["SELECT id FROM containers WHERE pos='%1' AND pid='%2' AND owned='1'",_containerPos,_uid]; -_queryResult = [_query,2] call DB_fnc_asyncCall; -//systemChat format ["House ID assigned: %1",_queryResult select 0]; -_container setVariable ["container_id",(_queryResult select 0),true]; +_query = format ["selectContainerID:%1:%2", _containerPos, _uid]; +_queryResult = [_query, 2] call DB_fnc_asyncCall; +_container setVariable ["container_id", _queryResult select 0, true]; diff --git a/life_server/Functions/Housing/fn_addHouse.sqf b/life_server/Functions/Housing/fn_addHouse.sqf old mode 100644 new mode 100755 index 6c4aa62cf..de33fbb96 --- a/life_server/Functions/Housing/fn_addHouse.sqf +++ b/life_server/Functions/Housing/fn_addHouse.sqf @@ -6,25 +6,26 @@ Description: Inserts the players newly bought house in the database. */ -private ["_housePos","_query"]; + params [ ["_uid","",[""]], ["_house",objNull,[objNull]] ]; -if (isNull _house || _uid isEqualTo "") exitWith {}; -_housePos = getPosATL _house; +if (isNull _house || {_uid isEqualTo ""}) exitWith {}; + +private _housePos = getPosATL _house; -_query = format ["INSERT INTO houses (pid, pos, owned) VALUES('%1', '%2', '1')",_uid,_housePos]; +private _query = format ["insertHouse:%1:%2", _uid, _housePos]; if (EXTDB_SETTING(getNumber,"DebugMode") isEqualTo 1) then { diag_log format ["Query: %1",_query]; }; -[_query,1] call DB_fnc_asyncCall; +[_query, 1] call DB_fnc_asyncCall; uiSleep 0.3; -_query = format ["SELECT id FROM houses WHERE pos='%1' AND pid='%2' AND owned='1'",_housePos,_uid]; -_queryResult = [_query,2] call DB_fnc_asyncCall; -//systemChat format ["House ID assigned: %1",_queryResult select 0]; -_house setVariable ["house_id",(_queryResult select 0),true]; +_query = format ["selectHouseID:%1:%2", _housePos, _uid]; +_queryResult = [_query, 2] call DB_fnc_asyncCall; +//systemChat format ["House ID assigned: %1", _queryResult select 0]; +_house setVariable ["house_id", _queryResult select 0, true]; diff --git a/life_server/Functions/Housing/fn_deleteDBContainer.sqf b/life_server/Functions/Housing/fn_deleteDBContainer.sqf old mode 100644 new mode 100755 index df05d16b3..99aa5d9b2 --- a/life_server/Functions/Housing/fn_deleteDBContainer.sqf +++ b/life_server/Functions/Housing/fn_deleteDBContainer.sqf @@ -5,24 +5,27 @@ Description: Delete Container and remove Container in Database */ -private ["_house","_houseID","_ownerID","_housePos","_query","_radius","_containers"]; -_container = [_this,0,objNull,[objNull]] call BIS_fnc_param; + +params [ + ["_container", objNull, [objNull]] +]; + if (isNull _container) exitWith {diag_log "container null";}; +_containerID = _container getVariable ["container_id", -1]; + +private "_query"; -_containerID = _container getVariable ["container_id",-1]; if (_containerID isEqualTo -1) then { _containerPos = getPosATL _container; - _ownerID = (_container getVariable "container_owner") select 0; - _query = format ["UPDATE containers SET owned='0', pos='[]' WHERE pid='%1' AND pos='%2' AND owned='1'",_ownerID,_containerPos]; - //systemChat format [":SERVER:sellHouse: container_id does not exist"]; + private _ownerID = (_container getVariable "container_owner") select 0; + _query = format ["deleteContainer:%1:%2", _ownerID, _containerPos]; } else { - //systemChat format [":SERVER:sellHouse: house_id is %1",_houseID]; - _query = format ["UPDATE containers SET owned='0', pos='[]' WHERE id='%1'",_containerID]; + _query = format ["deleteContainer1:%1",_containerID]; }; -_container setVariable ["container_id",nil,true]; -_container setVariable ["container_owner",nil,true]; +_container setVariable ["container_id", nil, true]; +_container setVariable ["container_owner", nil, true]; -[_query,1] call DB_fnc_asyncCall; +[_query, 1] call DB_fnc_asyncCall; -["CALL deleteOldContainers",1] call DB_fnc_asyncCall; +["deleteOldContainers", 1] call DB_fnc_asyncCall; deleteVehicle _container; diff --git a/life_server/Functions/Housing/fn_fetchPlayerHouses.sqf b/life_server/Functions/Housing/fn_fetchPlayerHouses.sqf old mode 100644 new mode 100755 index 1d7f750ee..38bfd9b11 --- a/life_server/Functions/Housing/fn_fetchPlayerHouses.sqf +++ b/life_server/Functions/Housing/fn_fetchPlayerHouses.sqf @@ -8,30 +8,30 @@ 1. Fetches all the players houses and sets them up. 2. Fetches all the players containers and sets them up. */ -private ["_query","_containers","_containerss","_houses"]; + params [ ["_uid","",[""]] ]; + if (_uid isEqualTo "") exitWith {}; -_query = format ["SELECT pid, pos, classname, inventory, gear, dir, id FROM containers WHERE pid='%1' AND owned='1'",_uid]; -_containers = [_query,2,true] call DB_fnc_asyncCall; +private _query = format ["selectContainers:%1", _uid]; +private _containers = [_query, 2, true] call DB_fnc_asyncCall; +private _containerss = []; -_containerss = []; { _position = call compile format ["%1",_x select 1]; _house = nearestObject [_position, "House"]; _direction = call compile format ["%1",_x select 5]; - _trunk = [_x select 3] call DB_fnc_mresToArray; + _trunk = _x select 3; if (_trunk isEqualType "") then {_trunk = call compile format ["%1", _trunk];}; - _gear = [_x select 4] call DB_fnc_mresToArray; + _gear = _x select 4; if (_gear isEqualType "") then {_gear = call compile format ["%1", _gear];}; _container = createVehicle[_x select 2,[0,0,999],[],0,"NONE"]; waitUntil {!isNil "_container" && {!isNull _container}}; _containerss = _house getVariable ["containers",[]]; _containerss pushBack _container; _container allowDamage false; - _container enableRopeAttach false; _container setPosATL _position; _container setVectorDirAndUp _direction; //Fix position for more accurate positioning @@ -59,21 +59,21 @@ _containerss = []; for "_i" from 0 to ((count (_items select 0)) - 1) do { _container addItemCargoGlobal [((_items select 0) select _i), ((_items select 1) select _i)]; }; - for "_i" from 0 to ((count (_mags select 0)) - 1) do{ + for "_i" from 0 to ((count (_mags select 0)) - 1) do { _container addMagazineCargoGlobal [((_mags select 0) select _i), ((_mags select 1) select _i)]; }; - for "_i" from 0 to ((count (_weapons select 0)) - 1) do{ + for "_i" from 0 to ((count (_weapons select 0)) - 1) do { _container addWeaponCargoGlobal [((_weapons select 0) select _i), ((_weapons select 1) select _i)]; }; - for "_i" from 0 to ((count (_backpacks select 0)) - 1) do{ + for "_i" from 0 to ((count (_backpacks select 0)) - 1) do { _container addBackpackCargoGlobal [((_backpacks select 0) select _i), ((_backpacks select 1) select _i)]; }; }; - _house setVariable ["containers",_containerss,true]; + _house setVariable ["containers", _containerss, true]; } forEach _containers; -_query = format ["SELECT pid, pos FROM houses WHERE pid='%1' AND owned='1'",_uid]; -_houses = [_query,2,true] call DB_fnc_asyncCall; +_query = format ["selectHousePositions:%1", _uid]; +private _houses = [_query, 2, true] call DB_fnc_asyncCall; _return = []; { @@ -83,4 +83,4 @@ _return = []; _return pushBack [_x select 1]; } forEach _houses; -missionNamespace setVariable [format ["houses_%1",_uid],_return]; +missionNamespace setVariable [format ["houses_%1", _uid], _return]; diff --git a/life_server/Functions/Housing/fn_houseCleanup.sqf b/life_server/Functions/Housing/fn_houseCleanup.sqf old mode 100644 new mode 100755 index fc835445d..177272f1a --- a/life_server/Functions/Housing/fn_houseCleanup.sqf +++ b/life_server/Functions/Housing/fn_houseCleanup.sqf @@ -1,7 +1,6 @@ /* File: fn_houseCleanup.sqf Author: NiiRoZz - Description: Cleans up containers inside in house of player. */ @@ -9,7 +8,7 @@ params [ ["_uid","",[""]] ]; -private _query = format ["SELECT pos FROM containers WHERE pid='%1' AND owned='1'",_uid]; +private _query = format ["selectContainerPositions:%1", _this]; private _containers = [_query,2,true] call DB_fnc_asyncCall; { diff --git a/life_server/Functions/Housing/fn_houseGarage.sqf b/life_server/Functions/Housing/fn_houseGarage.sqf old mode 100644 new mode 100755 index 3d2c69e0a..33393f206 --- a/life_server/Functions/Housing/fn_houseGarage.sqf +++ b/life_server/Functions/Housing/fn_houseGarage.sqf @@ -12,21 +12,14 @@ params [ ["_mode",-1,[0]] ]; -if (_uid isEqualTo "") exitWith {}; -if (isNull _house) exitWith {}; -if (_mode isEqualTo -1) exitWith {}; +if (_uid isEqualTo "" || {isNull _house} || {_mode isEqualTo -1}) exitWith {}; private _housePos = getPosATL _house; -private "_query"; - -if (_mode isEqualTo 0) then { - _query = format ["UPDATE houses SET garage='1' WHERE pid='%1' AND pos='%2'",_uid,_housePos]; -} else { - _query = format ["UPDATE houses SET garage='0' WHERE pid='%1' AND pos='%2'",_uid,_housePos]; -}; +private _active = ["0", "1"] select (_mode isEqualTo 0); +private _query = format ["updateGarage:%1:%2:%3", _active, _uid, _housePos]; if (EXTDB_SETTING(getNumber,"DebugMode") isEqualTo 1) then { - diag_log format ["Query: %1",_query]; + diag_log format ["Query: %1", _query]; }; -[_query,1] call DB_fnc_asyncCall; \ No newline at end of file +[_query, 1] call DB_fnc_asyncCall; diff --git a/life_server/Functions/Housing/fn_initHouses.sqf b/life_server/Functions/Housing/fn_initHouses.sqf old mode 100644 new mode 100755 index d5d98eb50..61278a7af --- a/life_server/Functions/Housing/fn_initHouses.sqf +++ b/life_server/Functions/Housing/fn_initHouses.sqf @@ -4,31 +4,30 @@ Description: Initalizes house setup when player joins the server. */ -private ["_queryResult","_query","_count","_blacklistedHouses","_blacklistedGarages"]; -_count = (["SELECT COUNT(*) FROM houses WHERE owned='1'",2] call DB_fnc_asyncCall) select 0; +private _count = (["selectAllHouses" ,2] call DB_fnc_asyncCall) select 0; for [{_x=0},{_x<=_count},{_x=_x+10}] do { - _query = format ["SELECT houses.id, houses.pid, houses.pos, players.name, houses.garage FROM houses INNER JOIN players WHERE houses.owned='1' AND houses.pid = players.pid LIMIT %1,10",_x]; - _queryResult = [_query,2,true] call DB_fnc_asyncCall; - if (count _queryResult isEqualTo 0) exitWith {}; + private _query = format ["selectPlayerHouses:%1", _x]; + private _queryResult = [_query, 2, true] call DB_fnc_asyncCall; + if (_queryResult isEqualTo []) exitWith {}; { - _pos = call compile format ["%1",_x select 2]; + _pos = call compile format ["%1", _x select 2]; _house = nearestObject [_pos, "House"]; - _house setVariable ["house_owner",[_x select 1,_x select 3],true]; - _house setVariable ["house_id",_x select 0,true]; - _house setVariable ["locked",true,true]; //Lock up all the stuff. + _house setVariable ["house_owner",[_x select 1, _x select 3],true]; + _house setVariable ["house_id", _x select 0, true]; + _house setVariable ["locked", true, true]; //Lock up all the stuff. if (_x select 4 isEqualTo 1) then { - _house setVariable ["garageBought",true,true]; + _house setVariable ["garageBought", true, true]; }; _numOfDoors = getNumber(configFile >> "CfgVehicles" >> (typeOf _house) >> "numberOfDoors"); for "_i" from 1 to _numOfDoors do { - _house setVariable [format ["bis_disabled_Door_%1",_i],1,true]; + _house setVariable [format ["bis_disabled_Door_%1",_i], 1, true]; }; } forEach _queryResult; }; -_blacklistedHouses = "count (getArray (_x >> 'garageBlacklists')) > 0" configClasses (missionconfigFile >> "Housing" >> worldName); -_blacklistedGarages = "count (getArray (_x >> 'garageBlacklists')) > 0" configClasses (missionconfigFile >> "Garages" >> worldName); +private _blacklistedHouses = "count (getArray (_x >> 'garageBlacklists')) > 0" configClasses (missionconfigFile >> "Housing" >> worldName); +private _blacklistedGarages = "count (getArray (_x >> 'garageBlacklists')) > 0" configClasses (missionconfigFile >> "Garages" >> worldName); _blacklistedHouses = _blacklistedHouses apply {configName _x}; _blacklistedGarages = _blacklistedGarages apply {configName _x}; @@ -38,7 +37,7 @@ for "_i" from 0 to count(_blacklistedHouses)-1 do { { _obj = nearestObject [_x,_className]; if (isNull _obj) then { - _obj setVariable ["blacklistedGarage",true,true]; + _obj setVariable ["blacklistedGarage", true, true]; }; } forEach _positions; }; @@ -49,7 +48,7 @@ for "_i" from 0 to count(_blacklistedGarages)-1 do { { _obj = nearestObject [_x,_className]; if (isNull _obj) then { - _obj setVariable ["blacklistedGarage",true,true]; + _obj setVariable ["blacklistedGarage", true, true]; }; } forEach _positions; }; diff --git a/life_server/Functions/Housing/fn_sellHouse.sqf b/life_server/Functions/Housing/fn_sellHouse.sqf old mode 100644 new mode 100755 index 81b20b55d..fe94b9255 --- a/life_server/Functions/Housing/fn_sellHouse.sqf +++ b/life_server/Functions/Housing/fn_sellHouse.sqf @@ -6,25 +6,28 @@ Used in selling the house, sets the owned to 0 and will cleanup with a stored procedure on restart. */ -private ["_house","_houseID","_ownerID","_housePos","_query","_radius","_containers"]; -_house = [_this,0,objNull,[objNull]] call BIS_fnc_param; + +params [ + ["_house", objNull, [objNull]] +]; + if (isNull _house) exitWith {systemChat ":SERVER:sellHouse: House is null";}; +private _houseID = _house getVariable ["house_id", -1]; + +private "_query"; -_houseID = _house getVariable ["house_id",-1]; if (_houseID isEqualTo -1) then { - _housePos = getPosATL _house; - _ownerID = (_house getVariable "house_owner") select 0; - _query = format ["UPDATE houses SET owned='0', pos='[]' WHERE pid='%1' AND pos='%2' AND owned='1'",_ownerID,_housePos]; - //systemChat format [":SERVER:sellHouse: house_id does not exist, query: %1",_query]; + private _housePos = getPosATL _house; + private _ownerID = (_house getVariable "house_owner") select 0; + _query = format ["deleteHouse:%1:%2", _ownerID, _housePos]; } else { - //systemChat format [":SERVER:sellHouse: house_id is %1",_houseID]; - _query = format ["UPDATE houses SET owned='0', pos='[]' WHERE id='%1'",_houseID]; + _query = format ["deleteHouse1:%1", _houseID]; }; -_house setVariable ["house_id",nil,true]; -_house setVariable ["house_owner",nil,true]; -_house setVariable ["garageBought",false,true]; +_house setVariable ["house_id", nil, true]; +_house setVariable ["house_owner", nil, true]; +_house setVariable ["garageBought", false, true]; -[_query,1] call DB_fnc_asyncCall; -_house setVariable ["house_sold",nil,true]; -["CALL deleteOldHouses",1] call DB_fnc_asyncCall; +[_query, 1] call DB_fnc_asyncCall; +_house setVariable ["house_sold", nil, true]; +["deleteOldHouses", 1] call DB_fnc_asyncCall; diff --git a/life_server/Functions/Housing/fn_sellHouseContainer.sqf b/life_server/Functions/Housing/fn_sellHouseContainer.sqf old mode 100644 new mode 100755 index e331f9726..e51c39c1f --- a/life_server/Functions/Housing/fn_sellHouseContainer.sqf +++ b/life_server/Functions/Housing/fn_sellHouseContainer.sqf @@ -6,22 +6,27 @@ Used in selling the house, container sets the owned to 0 and will cleanup with a stored procedure on restart. */ -private ["_house","_houseID","_ownerID","_housePos","_query","_radius","_containers"]; -_container = [_this,0,objNull,[objNull]] call BIS_fnc_param; -if (isNull _container) exitWith {}; +params [ + ["_container", objNull, [objNull]] +]; + +if (isNull _container) exitWith {}; _containerID = _container getVariable ["container_id",-1]; + +private "_query"; + if (_containerID isEqualTo -1) then { _containerPos = getPosATL _container; - _ownerID = (_container getVariable "container_owner") select 0; - _query = format ["UPDATE containers SET owned='0', pos='[]' WHERE pid='%1' AND pos='%2' AND owned='1'",_ownerID,_containerPos]; + private _ownerID = (_container getVariable "container_owner") select 0; + _query = format ["deleteContainer:%1:%2", _ownerID, _containerPos]; } else { - _query = format ["UPDATE containers SET owned='0', pos='[]' WHERE id='%1'",_containerID]; + _query = format ["deleteContainer1:%1", _containerID]; }; -_container setVariable ["container_id",nil,true]; -_container setVariable ["container_owner",nil,true]; +_container setVariable ["container_id", nil, true]; +_container setVariable ["container_owner", nil, true]; deleteVehicle _container; -[_query,1] call DB_fnc_asyncCall; -["CALL deleteOldContainers",1] call DB_fnc_asyncCall; +[_query, 1] call DB_fnc_asyncCall; +["deleteOldContainers", 1] call DB_fnc_asyncCall; diff --git a/life_server/Functions/Housing/fn_updateHouseContainers.sqf b/life_server/Functions/Housing/fn_updateHouseContainers.sqf old mode 100644 new mode 100755 index 8e0be88c0..99717e6ad --- a/life_server/Functions/Housing/fn_updateHouseContainers.sqf +++ b/life_server/Functions/Housing/fn_updateHouseContainers.sqf @@ -5,20 +5,22 @@ Description: Update inventory "i" in container */ -private ["_containerID","_containers","_query","_vehItems","_vehMags","_vehWeapons","_vehBackpacks","_cargo"]; -_container = [_this,0,objNull,[objNull]] call BIS_fnc_param; + +params [ + ["_container", objNull, [objNull]] +]; + if (isNull _container) exitWith {}; -_containerID = _container getVariable ["container_id",-1]; -if (_containerID isEqualTo -1) exitWith {}; -_vehItems = getItemCargo _container; -_vehMags = getMagazineCargo _container; -_vehWeapons = getWeaponCargo _container; -_vehBackpacks = getBackpackCargo _container; -_cargo = [_vehItems,_vehMags,_vehWeapons,_vehBackpacks]; +private _containerID = _container getVariable ["container_id", -1]; +if (_containerID isEqualTo -1) exitWith {}; -_cargo = [_cargo] call DB_fnc_mresArray; +private _vehItems = getItemCargo _container; +private _vehMags = getMagazineCargo _container; +private _vehWeapons = getWeaponCargo _container; +private _vehBackpacks = getBackpackCargo _container; +private _cargo = [_vehItems, _vehMags, _vehWeapons, _vehBackpacks]; -_query = format ["UPDATE containers SET gear='%1' WHERE id='%2'",_cargo,_containerID]; +private _query = format ["updateContainer:%1:%2", _cargo, _containerID]; -[_query,1] call DB_fnc_asyncCall; +[_query, 1] call DB_fnc_asyncCall; diff --git a/life_server/Functions/Housing/fn_updateHouseTrunk.sqf b/life_server/Functions/Housing/fn_updateHouseTrunk.sqf old mode 100644 new mode 100755 index 16e37c845..4d0fab1cb --- a/life_server/Functions/Housing/fn_updateHouseTrunk.sqf +++ b/life_server/Functions/Housing/fn_updateHouseTrunk.sqf @@ -5,16 +5,18 @@ Description: Update inventory "y" in container */ -private ["_house"]; -_container = [_this,0,objNull,[objNull]] call BIS_fnc_param; + +params [ + ["_container", objNull, [objNull]] +]; + if (isNull _container) exitWith {}; -_trunkData = _container getVariable ["Trunk",[[],0]]; -_containerID = _container getVariable ["container_id",-1]; +_trunkData = _container getVariable ["Trunk", [[], 0]]; +_containerID = _container getVariable ["container_id", -1]; -if (_containerID isEqualTo -1) exitWith {}; //Dafuq? +if (_containerID isEqualTo -1) exitWith {}; -_trunkData = [_trunkData] call DB_fnc_mresArray; -_query = format ["UPDATE containers SET inventory='%1' WHERE id='%2'",_trunkData,_containerID]; +_query = format ["updateHouseTrunk:%1:%2", _trunkData, _containerID]; -[_query,1] call DB_fnc_asyncCall; +[_query, 1] call DB_fnc_asyncCall; diff --git a/life_server/Functions/MySQL/fn_asyncCall.sqf b/life_server/Functions/MySQL/fn_asyncCall.sqf old mode 100644 new mode 100755 index 57782bfdd..cb16a479c --- a/life_server/Functions/MySQL/fn_asyncCall.sqf +++ b/life_server/Functions/MySQL/fn_asyncCall.sqf @@ -11,18 +11,20 @@ 1: INTEGER (1 = ASYNC + not return for update/insert, 2 = ASYNC + return for query's). 3: BOOL (True to return a single array, false to return multiple entries mainly for garage). */ -private ["_queryStmt","_mode","_multiarr","_queryResult","_key","_return","_loop"]; -_queryStmt = [_this,0,"",[""]] call BIS_fnc_param; -_mode = [_this,1,1,[0]] call BIS_fnc_param; -_multiarr = [_this,2,false,[false]] call BIS_fnc_param; -_key = EXTDB format ["%1:%2:%3",_mode,FETCH_CONST(life_sql_id),_queryStmt]; +params [ + ["_queryStmt", "", [""]], + ["_mode", 1, [0]], + ["_multiarr", false, [true]] +]; + +private _key = EXTDB format ["%1:%2:%3",_mode,FETCH_CONST(life_sql_id),_queryStmt]; if (_mode isEqualTo 1) exitWith {true}; _key = call compile format ["%1",_key]; -_key = (_key select 1); -_queryResult = EXTDB format ["4:%1", _key]; +_key = _key select 1; +private _queryResult = EXTDB format ["4:%1", _key]; //Make sure the data is received if (_queryResult isEqualTo "[3]") then { @@ -33,7 +35,7 @@ if (_queryResult isEqualTo "[3]") then { }; if (_queryResult isEqualTo "[5]") then { - _loop = true; + private _loop = true; for "_i" from 0 to 1 step 0 do { // extDB3 returned that result is Multi-Part Message _queryResult = ""; for "_i" from 0 to 1 step 0 do { @@ -46,9 +48,9 @@ if (_queryResult isEqualTo "[5]") then { }; _queryResult = call compile _queryResult; if ((_queryResult select 0) isEqualTo 0) exitWith {diag_log format ["extDB3: Protocol Error: %1", _queryResult]; []}; -_return = (_queryResult select 1); -if (!_multiarr && count _return > 0) then { - _return = (_return select 0); +private _return = (_queryResult select 1); +if (!_multiarr && {!(_return isEqualTo [])}) then { + _return = _return select 0; }; _return; diff --git a/life_server/Functions/MySQL/fn_bool.sqf b/life_server/Functions/MySQL/fn_bool.sqf deleted file mode 100644 index 2d9a70f23..000000000 --- a/life_server/Functions/MySQL/fn_bool.sqf +++ /dev/null @@ -1,26 +0,0 @@ -/* - File: fn_bool.sqf - Author: TAW_Tonic - - Description: - Handles bool conversion for MySQL since MySQL doesn't support 'true' or 'false' - instead MySQL uses Tinyint for BOOLEAN (0 = false, 1 = true) -*/ -private ["_bool","_mode"]; -_bool = [_this,0,0,[false,0]] call BIS_fnc_param; -_mode = [_this,1,0,[0]] call BIS_fnc_param; - -switch (_mode) do { - case 0: { - if (_bool isEqualType 0) exitWith {0}; - if (_bool) then {1} else {0}; - }; - - case 1: { - if (!(_bool isEqualType 0)) exitWith {false}; - switch (_bool) do { - case 0: {false}; - case 1: {true}; - }; - }; -}; diff --git a/life_server/Functions/MySQL/fn_insertRequest.sqf b/life_server/Functions/MySQL/fn_insertRequest.sqf old mode 100644 new mode 100755 index b8b9f9bb6..f3e7432e2 --- a/life_server/Functions/MySQL/fn_insertRequest.sqf +++ b/life_server/Functions/MySQL/fn_insertRequest.sqf @@ -7,7 +7,7 @@ Adds a player to the database upon first joining of the server. Recieves information from core\sesison\fn_insertPlayerInfo.sqf */ -private ["_queryResult","_query","_alias"]; + params [ "_uid", "_name", @@ -17,35 +17,28 @@ params [ ]; //Error checks -if ((_uid isEqualTo "") || (_name isEqualTo "")) exitWith {systemChat "Bad UID or name";}; //Let the client be 'lost' in 'transaction' +if (_uid isEqualTo "" || {_name isEqualTo ""}) exitWith {systemChat "Bad UID or name";}; //Let the client be 'lost' in 'transaction' if (isNull _returnToSender) exitWith {systemChat "ReturnToSender is Null!";}; //No one to send this to! -_query = format ["SELECT pid, name FROM players WHERE pid='%1'",_uid]; - - +private _query = format ["checkPlayerExists:%1", _uid]; _tickTime = diag_tickTime; -_queryResult = [_query,2] call DB_fnc_asyncCall; +private _queryResult = [_query, 2] call DB_fnc_asyncCall; if (EXTDB_SETTING(getNumber,"DebugMode") isEqualTo 1) then { diag_log "------------- Insert Query Request -------------"; - diag_log format ["QUERY: %1",_query]; - diag_log format ["Time to complete: %1 (in seconds)",(diag_tickTime - _tickTime)]; - diag_log format ["Result: %1",_queryResult]; + diag_log format ["QUERY: %1", _query]; + diag_log format ["Time to complete: %1 (in seconds)", (diag_tickTime - _tickTime)]; + diag_log format ["Result: %1", _queryResult]; diag_log "------------------------------------------------"; }; //Double check to make sure the client isn't in the database... -if (_queryResult isEqualType "") exitWith {[] remoteExecCall ["SOCK_fnc_dataQuery",(owner _returnToSender)];}; //There was an entry! -if !(count _queryResult isEqualTo 0) exitWith {[] remoteExecCall ["SOCK_fnc_dataQuery",(owner _returnToSender)];}; +if (_queryResult isEqualType "" && !(_queryResult isEqualTo [])) exitWith {[] remoteExecCall ["SOCK_fnc_dataQuery", (owner _returnToSender)];}; -//Clense and prepare some information. -_name = [_name] call DB_fnc_mresString; //Clense the name of bad chars. -_alias = [[_name]] call DB_fnc_mresArray; -_money = [_money] call DB_fnc_numberSafe; -_bank = [_bank] call DB_fnc_numberSafe; +private _alias = [_name]; //Prepare the query statement.. -_query = format ["INSERT INTO players (pid, name, cash, bankacc, aliases, cop_licenses, med_licenses, civ_licenses, civ_gear, cop_gear, med_gear) VALUES('%1', '%2', '%3', '%4', '%5','""[]""','""[]""','""[]""','""[]""','""[]""','""[]""')", +_query = format ["insertNewPlayer:%1:%2:%3:%4:%5", _uid, _name, _money, @@ -53,5 +46,5 @@ _query = format ["INSERT INTO players (pid, name, cash, bankacc, aliases, cop_li _alias ]; -[_query,1] call DB_fnc_asyncCall; -[] remoteExecCall ["SOCK_fnc_dataQuery",(owner _returnToSender)]; +[_query, 1] call DB_fnc_asyncCall; +[] remoteExecCall ["SOCK_fnc_dataQuery", (owner _returnToSender)]; diff --git a/life_server/Functions/MySQL/fn_insertVehicle.sqf b/life_server/Functions/MySQL/fn_insertVehicle.sqf old mode 100644 new mode 100755 index 6682832a4..59532ad2e --- a/life_server/Functions/MySQL/fn_insertVehicle.sqf +++ b/life_server/Functions/MySQL/fn_insertVehicle.sqf @@ -5,7 +5,7 @@ Description: Inserts the vehicle into the database */ -private ["_query","_sql"]; + params [ "_uid", "_side", @@ -16,9 +16,7 @@ params [ ]; //Stop bad data being passed. -if (_uid isEqualTo "" || _side isEqualTo "" || _type isEqualTo "" || _className isEqualTo "" || _color isEqualTo -1 || _plate isEqualTo -1) exitWith {}; - -_query = format ["INSERT INTO vehicles (side, classname, type, pid, alive, active, inventory, color, plate, gear, damage) VALUES ('%1', '%2', '%3', '%4', '1','1','""[[],0]""', '%5', '%6','""[]""','""[]""')",_side,_className,_type,_uid,_color,_plate]; - +if (_uid isEqualTo "" || {_side isEqualTo ""} || {_type isEqualTo ""} || {_className isEqualTo ""} || {_color isEqualTo -1} || {_plate isEqualTo -1}) exitWith {}; -[_query,1] call DB_fnc_asyncCall; +private _query = format ["insertVehicle:%1:%2:%3:%4:%5:%6", _side, _className, _type, _uid, _color, _plate]; +[_query, 1] call DB_fnc_asyncCall; diff --git a/life_server/Functions/MySQL/fn_mresArray.sqf b/life_server/Functions/MySQL/fn_mresArray.sqf deleted file mode 100644 index d8433f26a..000000000 --- a/life_server/Functions/MySQL/fn_mresArray.sqf +++ /dev/null @@ -1,27 +0,0 @@ -/* - File: fn_mresArray.sqf - Author: Bryan "Tonic" Boardwine"; - - Description: - Acts as a mres (MySQL Real Escape) for arrays so they - can be properly inserted into the database without causing - any problems. The return method is 'hacky' but it's effective. -*/ -private ["_array"]; -_array = [_this,0,[],[[]]] call BIS_fnc_param; -_array = str _array; -_array = toArray(_array); - -for "_i" from 0 to (count _array)-1 do -{ - _sel = _array select _i; - if (!(_i isEqualTo 0) && !(_i isEqualTo ((count _array)-1))) then - { - if (_sel isEqualTo 34) then - { - _array set[_i,96]; - }; - }; -}; - -str(toString(_array)); diff --git a/life_server/Functions/MySQL/fn_mresString.sqf b/life_server/Functions/MySQL/fn_mresString.sqf deleted file mode 100644 index 584a8e7bd..000000000 --- a/life_server/Functions/MySQL/fn_mresString.sqf +++ /dev/null @@ -1,21 +0,0 @@ -/* - File: fn_mresString.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Makes the string safe to be passed to MySQL (strips various stuff). -*/ -private ["_string","_filter"]; -_string = [_this,0,"",[""]] call BIS_fnc_param; -_filter = "'/\`:|;,{}-""<>"; - -_string = toArray _string; //Blow it up to an array -_filter = toArray _filter; //Blow it up to an array - -{ - if (_x in _filter) then { - _string deleteAt _forEachIndex; - }; -} forEach _string; - -toString _string; diff --git a/life_server/Functions/MySQL/fn_mresToArray.sqf b/life_server/Functions/MySQL/fn_mresToArray.sqf deleted file mode 100644 index e93e75d67..000000000 --- a/life_server/Functions/MySQL/fn_mresToArray.sqf +++ /dev/null @@ -1,26 +0,0 @@ -/* - File: fn_mresToArray.sqf - Author: Bryan "Tonic" Boardwine"; - - Description: - Acts as a mres (MySQL Real Escape) for arrays so they - can be properly inserted into the database without causing - any problems. The return method is 'hacky' but it's effective. -*/ -private ["_array"]; -_array = [_this,0,"",[""]] call BIS_fnc_param; -if (_array isEqualTo "") exitWith {[]}; -_array = toArray(_array); - -for "_i" from 0 to (count _array)-1 do -{ - _sel = _array select _i; - if (_sel == 96) then - { - _array set[_i,39]; - }; -}; - -_array = toString(_array); -_array = call compile format ["%1", _array]; -_array; \ No newline at end of file diff --git a/life_server/Functions/MySQL/fn_numberSafe.sqf b/life_server/Functions/MySQL/fn_numberSafe.sqf deleted file mode 100644 index 0fc534d88..000000000 --- a/life_server/Functions/MySQL/fn_numberSafe.sqf +++ /dev/null @@ -1,28 +0,0 @@ -/* - File: fn_numberSafe.sqf - Author: Karel Moricky - - Description: - Convert a number into string (avoiding scientific notation) - - Parameter(s): - _this: NUMBER - - Returns: - STRING -*/ -private ["_number","_mod","_digots","_digitsCount","_modBase","_numberText"]; - -_number = [_this,0,0,[0]] call bis_fnc_param; -_mod = [_this,1,3,[0]] call bis_fnc_param; - -_digits = _number call bis_fnc_numberDigits; -_digitsCount = count _digits - 1; - -_modBase = _digitsCount % _mod; -_numberText = ""; -{ - _numberText = _numberText + str _x; - if ((_foreachindex - _modBase) % (_mod) isEqualTo 0 && !(_foreachindex isEqualTo _digitsCount)) then {_numberText = _numberText + "";}; -} forEach _digits; -_numberText diff --git a/life_server/Functions/MySQL/fn_queryRequest.sqf b/life_server/Functions/MySQL/fn_queryRequest.sqf old mode 100644 new mode 100755 index 42b5587e5..de92704f0 --- a/life_server/Functions/MySQL/fn_queryRequest.sqf +++ b/life_server/Functions/MySQL/fn_queryRequest.sqf @@ -11,30 +11,27 @@ ARRAY - If array has 0 elements it should be handled as an error in client-side files. STRING - The request had invalid handles or an unknown error and is logged to the RPT. */ -private ["_uid","_side","_query","_queryResult","_tickTime","_tmp"]; -_uid = [_this,0,"",[""]] call BIS_fnc_param; -_side = [_this,1,sideUnknown,[civilian]] call BIS_fnc_param; -_ownerID = [_this,2,objNull,[objNull]] call BIS_fnc_param; -if (isNull _ownerID) exitWith {}; - -if (LIFE_SETTINGS(getNumber,"player_deathLog") isEqualTo 1) then { - _ownerID addMPEventHandler ["MPKilled", {_this call fn_whoDoneIt}]; -}; +params [ + ["_uid", "", [""]], + ["_side", sideUnknown, [civilian]], + ["_ownerID", objNull, [objNull]] +]; +if (isNull _ownerID) exitWith {}; _ownerID = owner _ownerID; -_query = switch (_side) do { +private _query = switch (_side) do { // West - 11 entries returned - case west: {format ["SELECT pid, name, cash, bankacc, adminlevel, donorlevel, cop_licenses, coplevel, cop_gear, blacklist, cop_stats, playtime FROM players WHERE pid='%1'",_uid];}; + case west: {format ["selectWest:%1", _uid];}; // Civilian - 12 entries returned - case civilian: {format ["SELECT pid, name, cash, bankacc, adminlevel, donorlevel, civ_licenses, arrested, civ_gear, civ_stats, civ_alive, civ_position, playtime FROM players WHERE pid='%1'",_uid];}; + case civilian: {format ["selectCiv:%1", _uid];}; // Independent - 10 entries returned - case independent: {format ["SELECT pid, name, cash, bankacc, adminlevel, donorlevel, med_licenses, mediclevel, med_gear, med_stats, playtime FROM players WHERE pid='%1'",_uid];}; + case independent: {format ["selectIndep:%1",_uid];}; }; -_tickTime = diag_tickTime; -_queryResult = [_query,2] call DB_fnc_asyncCall; +private _tickTime = diag_tickTime; +private _queryResult = [_query,2] call DB_fnc_asyncCall; if (EXTDB_SETTING(getNumber,"DebugMode") isEqualTo 1) then { diag_log "------------- Client Query Request -------------"; @@ -44,122 +41,60 @@ if (EXTDB_SETTING(getNumber,"DebugMode") isEqualTo 1) then { diag_log "------------------------------------------------"; }; -if (_queryResult isEqualType "") exitWith { +if (_queryResult isEqualType "" || _queryResult isEqualTo []) exitWith { [] remoteExecCall ["SOCK_fnc_insertPlayerInfo",_ownerID]; }; -if (count _queryResult isEqualTo 0) exitWith { - [] remoteExecCall ["SOCK_fnc_insertPlayerInfo",_ownerID]; -}; +private _licenses = (_queryResult select 6); -//Blah conversion thing from a2net->extdb -_tmp = _queryResult select 2; -_queryResult set[2,[_tmp] call DB_fnc_numberSafe]; -_tmp = _queryResult select 3; -_queryResult set[3,[_tmp] call DB_fnc_numberSafe]; - -//Parse licenses (Always index 6) -_new = [(_queryResult select 6)] call DB_fnc_mresToArray; -if (_new isEqualType "") then {_new = call compile format ["%1", _new];}; -_queryResult set[6,_new]; - -//Convert tinyint to boolean -_old = _queryResult select 6; -for "_i" from 0 to (count _old)-1 do { - _data = _old select _i; - _old set[_i,[_data select 0, ([_data select 1,1] call DB_fnc_bool)]]; +for "_i" from 0 to (count _licenses) -1 do { + (_licenses select _i) params ["_license", "_owned"]; + _licenses set[_i, [_license, [false, true] select _owned]]; }; -_queryResult set[6,_old]; +private "_playTimes"; -_new = [(_queryResult select 8)] call DB_fnc_mresToArray; -if (_new isEqualType "") then {_new = call compile format ["%1", _new];}; -_queryResult set[8,_new]; -//Parse data for specific side. switch (_side) do { - case west: { - _queryResult set[9,([_queryResult select 9,1] call DB_fnc_bool)]; - - //Parse Stats - _new = [(_queryResult select 10)] call DB_fnc_mresToArray; - if (_new isEqualType "") then {_new = call compile format ["%1", _new];}; - _queryResult set[10,_new]; - - //Playtime - _new = [(_queryResult select 11)] call DB_fnc_mresToArray; - if (_new isEqualType "") then {_new = call compile format ["%1", _new];}; - _index = TON_fnc_playtime_values_request find [_uid, _new]; - if (_index != -1) then { - TON_fnc_playtime_values_request set[_index,-1]; - TON_fnc_playtime_values_request = TON_fnc_playtime_values_request - [-1]; - TON_fnc_playtime_values_request pushBack [_uid, _new]; - } else { - TON_fnc_playtime_values_request pushBack [_uid, _new]; - }; - [_uid,_new select 0] call TON_fnc_setPlayTime; - }; - - case civilian: { - _queryResult set[7,([_queryResult select 7,1] call DB_fnc_bool)]; - - //Parse Stats - _new = [(_queryResult select 9)] call DB_fnc_mresToArray; - if (_new isEqualType "") then {_new = call compile format ["%1", _new];}; - _queryResult set[9,_new]; - - //Position - _queryResult set[10,([_queryResult select 10,1] call DB_fnc_bool)]; - _new = [(_queryResult select 11)] call DB_fnc_mresToArray; - if (_new isEqualType "") then {_new = call compile format ["%1", _new];}; - _queryResult set[11,_new]; - - //Playtime - _new = [(_queryResult select 12)] call DB_fnc_mresToArray; - if (_new isEqualType "") then {_new = call compile format ["%1", _new];}; - _index = TON_fnc_playtime_values_request find [_uid, _new]; - if (_index != -1) then { - TON_fnc_playtime_values_request set[_index,-1]; - TON_fnc_playtime_values_request = TON_fnc_playtime_values_request - [-1]; - TON_fnc_playtime_values_request pushBack [_uid, _new]; - } else { - TON_fnc_playtime_values_request pushBack [_uid, _new]; - }; - [_uid,_new select 2] call TON_fnc_setPlayTime; - - /* Make sure nothing else is added under here */ - _houseData = _uid spawn TON_fnc_fetchPlayerHouses; - waitUntil {scriptDone _houseData}; - _queryResult pushBack (missionNamespace getVariable [format ["houses_%1",_uid],[]]); - _gangData = _uid spawn TON_fnc_queryPlayerGang; - waitUntil{scriptDone _gangData}; - _queryResult pushBack (missionNamespace getVariable [format ["gang_%1",_uid],[]]); - - }; - - case independent: { - //Parse Stats - _new = [(_queryResult select 9)] call DB_fnc_mresToArray; - if (_new isEqualType "") then {_new = call compile format ["%1", _new];}; - _queryResult set[9,_new]; - - //Playtime - _new = [(_queryResult select 10)] call DB_fnc_mresToArray; - if (_new isEqualType "") then {_new = call compile format ["%1", _new];}; - _index = TON_fnc_playtime_values_request find [_uid, _new]; - if !(_index isEqualTo -1) then { - TON_fnc_playtime_values_request set[_index,-1]; - TON_fnc_playtime_values_request = TON_fnc_playtime_values_request - [-1]; - TON_fnc_playtime_values_request pushBack [_uid, _new]; - } else { - TON_fnc_playtime_values_request pushBack [_uid, _new]; - }; - [_uid,_new select 1] call TON_fnc_setPlayTime; - }; + case civilian: { + _queryResult set[7, [false, true] select (_queryResult select 7)]; + _queryResult set[10, [false, true] select (_queryResult select 10)]; + + _playTimes = _queryResult select 12; + [_uid, _playTimes select 2] call TON_fnc_setPlayTime; + + /* Make sure nothing else is added under here */ + _houseData = _uid spawn TON_fnc_fetchPlayerHouses; + waitUntil {scriptDone _houseData}; + _queryResult pushBack (missionNamespace getVariable [format ["houses_%1",_uid],[]]); + _gangData = _uid spawn TON_fnc_queryPlayerGang; + waitUntil {scriptDone _gangData}; + _queryResult pushBack (missionNamespace getVariable [format ["gang_%1",_uid],[]]); + }; + + case west: { + _queryResult set[9, [false, true] select (_queryResult select 9)]; + _playTimes = _queryResult select 11; + [_uid, _playTimes select 0] call TON_fnc_setPlayTime; + }; + + case independent: { + _playTimes = _queryResult select 10; + [_uid, _playTimes select 1] call TON_fnc_setPlayTime; + }; +}; + +_index = TON_fnc_playtime_values_request find [_uid, _playTimes]; + +if !(_index isEqualTo -1) then { + TON_fnc_playtime_values_request set[_index,-1]; + TON_fnc_playtime_values_request = TON_fnc_playtime_values_request - [-1]; + TON_fnc_playtime_values_request pushBack [_uid, _playTimes]; +} else { + TON_fnc_playtime_values_request pushBack [_uid, _playTimes]; }; publicVariable "TON_fnc_playtime_values_request"; -_keyArr = missionNamespace getVariable [format ["%1_KEYS_%2",_uid,_side],[]]; +_keyArr = missionNamespace getVariable [format ["%1_KEYS_%2",_uid,_side], []]; _queryResult pushBack _keyArr; - -_queryResult remoteExec ["SOCK_fnc_requestReceived",_ownerID]; +_queryResult remoteExec ["SOCK_fnc_requestReceived", _ownerID]; diff --git a/life_server/Functions/MySQL/fn_updatePartial.sqf b/life_server/Functions/MySQL/fn_updatePartial.sqf old mode 100644 new mode 100755 index 58f161bce..4c573ca66 --- a/life_server/Functions/MySQL/fn_updatePartial.sqf +++ b/life_server/Functions/MySQL/fn_updatePartial.sqf @@ -6,81 +6,68 @@ Takes partial data of a player and updates it, this is meant to be less network intensive towards data flowing through it for updates. */ -private ["_uid","_side","_value","_value1","_value2","_mode","_query"]; -_uid = [_this,0,"",[""]] call BIS_fnc_param; -_side = [_this,1,sideUnknown,[civilian]] call BIS_fnc_param; -_mode = [_this,3,-1,[0]] call BIS_fnc_param; -if (_uid isEqualTo "" || _side isEqualTo sideUnknown) exitWith {}; //Bad. -_query = ""; +params [ + ["_uid", "", [""]], + ["_side", sideUnknown, [civilian]], + "_value", + ["_mode", -1, [0]], + "_value1" +]; + +if (_uid isEqualTo "" || {_side isEqualTo sideUnknown}) exitWith {}; //Bad. +private _query = ""; switch (_mode) do { case 0: { - _value = [_this,2,0,[0]] call BIS_fnc_param; - _value = [_value] call DB_fnc_numberSafe; - _query = format ["UPDATE players SET cash='%1' WHERE pid='%2'",_value,_uid]; + _query = format ["updateCash:%1:%2", _value, _uid]; }; case 1: { - _value = [_this,2,0,[0]] call BIS_fnc_param; - _value = [_value] call DB_fnc_numberSafe; - _query = format ["UPDATE players SET bankacc='%1' WHERE pid='%2'",_value,_uid]; + _query = format ["updateBank:%1:%2",_value,_uid]; }; case 2: { - _value = [_this,2,[],[[]]] call BIS_fnc_param; - //Does something license related but I can't remember I only know it's important? - for "_i" from 0 to count(_value)-1 do { - _bool = [(_value select _i) select 1] call DB_fnc_bool; - _value set[_i,[(_value select _i) select 0,_bool]]; + for "_i" from 0 to (count _value) -1 do { + (_value select _i) params ["_license", "_owned"]; + _value set[_i, [_license, [0, 1] select _owned]]; }; - _value = [_value] call DB_fnc_mresArray; + switch (_side) do { - case west: {_query = format ["UPDATE players SET cop_licenses='%1' WHERE pid='%2'",_value,_uid];}; - case civilian: {_query = format ["UPDATE players SET civ_licenses='%1' WHERE pid='%2'",_value,_uid];}; - case independent: {_query = format ["UPDATE players SET med_licenses='%1' WHERE pid='%2'",_value,_uid];}; + case west: {_query = format ["updateWestLicenses:%1:%2", _value, _uid];}; + case civilian: {_query = format ["updateCivLicenses:%1:%2", _value, _uid];}; + case independent: {_query = format ["updateIndepLicenses:%1:%2", _value, _uid];}; }; }; case 3: { - _value = [_this,2,[],[[]]] call BIS_fnc_param; - _value = [_value] call DB_fnc_mresArray; switch (_side) do { - case west: {_query = format ["UPDATE players SET cop_gear='%1' WHERE pid='%2'",_value,_uid];}; - case civilian: {_query = format ["UPDATE players SET civ_gear='%1' WHERE pid='%2'",_value,_uid];}; - case independent: {_query = format ["UPDATE players SET med_gear='%1' WHERE pid='%2'",_value,_uid];}; + case west: {_query = format ["updateWestGear:%1:%2", _value, _uid];}; + case civilian: {_query = format ["updateCivGear:%1:%2", _value, _uid];}; + case independent: {_query = format ["updateIndepGear:%1:%2", _value, _uid];}; }; }; case 4: { - _value = [_this,2,false,[true]] call BIS_fnc_param; - _value = [_value] call DB_fnc_bool; - _value2 = [_this,4,[],[[]]] call BIS_fnc_param; - _value2 = if (count _value2 isEqualTo 3) then {_value2} else {[0,0,0]}; - _value2 = [_value2] call DB_fnc_mresArray; - _query = format ["UPDATE players SET civ_alive='%1', civ_position='%2' WHERE pid='%3'",_value,_value2,_uid]; + _value = [0, 1] select _value; + _value1 = if (count _value1 isEqualTo 3) then {_value1} else {[0,0,0]}; + _query = format ["updateCivPosition:%1:%2:%3", _value, _value1, _uid]; }; case 5: { - _value = [_this,2,false,[true]] call BIS_fnc_param; - _value = [_value] call DB_fnc_bool; - _query = format ["UPDATE players SET arrested='%1' WHERE pid='%2'",_value,_uid]; + _value = [0, 1] select _value; + _query = format ["updateArrested:%1:%2",_value,_uid]; }; case 6: { - _value1 = [_this,2,0,[0]] call BIS_fnc_param; - _value2 = [_this,4,0,[0]] call BIS_fnc_param; - _value1 = [_value1] call DB_fnc_numberSafe; - _value2 = [_value2] call DB_fnc_numberSafe; - _query = format ["UPDATE players SET cash='%1', bankacc='%2' WHERE pid='%3'",_value1,_value2,_uid]; + _query = format ["updateCashAndBank:%1:%2:%3", _value, _value1, _uid]; }; case 7: { - _array = [_this,2,[],[[]]] call BIS_fnc_param; - [_uid,_side,_array,0] call TON_fnc_keyManagement; + [_uid, _side, _value, 0] call TON_fnc_keyManagement; }; }; if (_query isEqualTo "") exitWith {}; -[_query,1] call DB_fnc_asyncCall; +[_query, 1] call DB_fnc_asyncCall; diff --git a/life_server/Functions/MySQL/fn_updateRequest.sqf b/life_server/Functions/MySQL/fn_updateRequest.sqf old mode 100644 new mode 100755 index 884059855..7d0f11668 --- a/life_server/Functions/MySQL/fn_updateRequest.sqf +++ b/life_server/Functions/MySQL/fn_updateRequest.sqf @@ -6,37 +6,34 @@ Updates ALL player information in the database. Information gets passed here from the client side file: core\session\fn_updateRequest.sqf */ -private ["_uid","_side","_cash","_bank","_licenses","_gear","_stats","_name","_alive","_position","_query","_thread"]; -_uid = [_this,0,"",[""]] call BIS_fnc_param; -_name = [_this,1,"",[""]] call BIS_fnc_param; -_side = [_this,2,sideUnknown,[civilian]] call BIS_fnc_param; -_cash = [_this,3,0,[0]] call BIS_fnc_param; -_bank = [_this,4,5000,[0]] call BIS_fnc_param; -_licenses = [_this,5,[],[[]]] call BIS_fnc_param; -_gear = [_this,6,[],[[]]] call BIS_fnc_param; -_stats = [_this,7,[100,100],[[]]] call BIS_fnc_param; -_alive = [_this,9,false,[true]] call BIS_fnc_param; -_position = [_this,10,[],[[]]] call BIS_fnc_param; + +params [ + ["_uid", "", [""]], + ["_name", "", [""]], + ["_side", sideUnknown, [civilian]], + ["_cash", 0, [0]], + ["_bank", 5000, [0]], + ["_licenses", [], [[]]], + ["_gear", [], [[]]], + ["_stats", [100,100],[[]]], + ["_arrested", false, [true]], + ["_alive", false, [true]], + ["_position", [], [[]]] +]; //Get to those error checks. -if ((_uid isEqualTo "") || (_name isEqualTo "")) exitWith {}; +if (_uid isEqualTo "" || {_name isEqualTo ""}) exitWith {}; -//Parse and setup some data. -_name = [_name] call DB_fnc_mresString; -_gear = [_gear] call DB_fnc_mresArray; -_stats = [_stats] call DB_fnc_mresArray; -_cash = [_cash] call DB_fnc_numberSafe; -_bank = [_bank] call DB_fnc_numberSafe; -_position = if (_side isEqualTo civilian) then {[_position] call DB_fnc_mresArray} else {[]}; +//Setup some data. +_position = if (_side isEqualTo civilian) then {_position} else {[]}; +_arrested = [0, 1] select _arrested; +_alive = [0, 1] select _alive; -//Does something license related but I can't remember I only know it's important? -for "_i" from 0 to count(_licenses)-1 do { - _bool = [(_licenses select _i) select 1] call DB_fnc_bool; - _licenses set[_i,[(_licenses select _i) select 0,_bool]]; +for "_i" from 0 to (count _licenses) -1 do { + (_licenses select _i) params ["_license", "_owned"]; + _licenses set[_i, [_license, [0, 1] select _owned]]; }; -_licenses = [_licenses] call DB_fnc_mresArray; - //PLAYTIME _playtime = [_uid] call TON_fnc_getPlayTime; _playtime_update = []; @@ -52,13 +49,11 @@ switch (_side) do { case civilian: {_playtime_update set[2,_playtime];}; case independent: {_playtime_update set[1,_playtime];}; }; -_playtime_update = [_playtime_update] call DB_fnc_mresArray; -switch (_side) do { - case west: {_query = format ["UPDATE players SET name='%1', cash='%2', bankacc='%3', cop_gear='%4', cop_licenses='%5', cop_stats='%6', playtime='%7' WHERE pid='%8'",_name,_cash,_bank,_gear,_licenses,_stats,_playtime_update,_uid];}; - case civilian: {_query = format ["UPDATE players SET name='%1', cash='%2', bankacc='%3', civ_licenses='%4', civ_gear='%5', arrested='%6', civ_stats='%7', civ_alive='%8', civ_position='%9', playtime='%10' WHERE pid='%11'",_name,_cash,_bank,_licenses,_gear,[_this select 8] call DB_fnc_bool,_stats,[_alive] call DB_fnc_bool,_position,_playtime_update,_uid];}; - case independent: {_query = format ["UPDATE players SET name='%1', cash='%2', bankacc='%3', med_licenses='%4', med_gear='%5', med_stats='%6', playtime='%7' WHERE pid='%8'",_name,_cash,_bank,_licenses,_gear,_stats,_playtime_update,_uid];}; +private _query = switch (_side) do { + case west: {format ["updateWest:%1:%2:%3:%4:%5:%6:%7:%8", _name, _cash, _bank, _gear, _licenses, _stats, _playtime_update, _uid];}; + case civilian: {format ["updateCiv:%1:%2:%3:%4:%5:%6:%7:%8:%9:%10:%11", _name, _cash, _bank, _licenses, _gear, _arrested, _stats, _alive, _position, _playtime_update, _uid];}; + case independent: {format ["updateIndep:%1:%2:%3:%4:%5:%6:%7:%8", _name, _cash, _bank, _licenses, _gear, _stats, _playtime_update, _uid];}; }; - -_queryResult = [_query,1] call DB_fnc_asyncCall; +_queryResult = [_query, 1] call DB_fnc_asyncCall; diff --git a/life_server/Functions/Systems/fn_chopShopSell.sqf b/life_server/Functions/Systems/fn_chopShopSell.sqf old mode 100644 new mode 100755 index 100f62901..512d65394 --- a/life_server/Functions/Systems/fn_chopShopSell.sqf +++ b/life_server/Functions/Systems/fn_chopShopSell.sqf @@ -2,7 +2,6 @@ /* File: fn_chopShopSell.sqf Author: Bryan "Tonic" Boardwine - Description: Checks whether or not the vehicle is persistent or temp and sells it. */ @@ -22,7 +21,7 @@ private _displayName = FETCH_CONFIG2(getText,"CfgVehicles",typeOf _vehicle, "dis private _dbInfo = _vehicle getVariable ["dbInfo",[]]; if (count _dbInfo > 0) then { _dbInfo params ["_uid","_plate"]; - private _query = format ["UPDATE vehicles SET alive='0' WHERE pid='%1' AND plate='%2'",_uid,_plate]; + _query = format ["deleteVehicle:%1:%2", _uid, _plate]; [_query,1] call DB_fnc_asyncCall; }; diff --git a/life_server/Functions/Systems/fn_cleanup.sqf b/life_server/Functions/Systems/fn_cleanup.sqf old mode 100644 new mode 100755 index f3351e81b..0f822c50d --- a/life_server/Functions/Systems/fn_cleanup.sqf +++ b/life_server/Functions/Systems/fn_cleanup.sqf @@ -1,67 +1,80 @@ -#include "\life_server\script_macros.hpp" -/* - File: fn_cleanup.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Server-side cleanup script on vehicles. - Sort of a lame way but whatever. Yep someone should look at it! -*/ -private "_deleted"; -_deleted = false; -for "_i" from 0 to 1 step 0 do { - private ["_veh","_units","_fuel"]; - uiSleep (60 * 60); - { - _protect = false; - _veh = _x; - _vehicleClass = getText(configFile >> "CfgVehicles" >> (typeOf _veh) >> "vehicleClass"); - _fuel = 1; - - if (!isNil {_veh getVariable "NPC"} && {_veh getVariable "NPC"}) then {_protect = true;}; - - if ((_vehicleClass in ["Car","Air","Ship","Armored","Submarine"]) && {!(_protect)}) then { - if (LIFE_SETTINGS(getNumber,"save_vehicle_fuel") isEqualTo 1) then {_fuel = (fuel _veh);}; - _dbInfo = _veh getVariable ["dbInfo",[]]; - _units = {(_x distance _veh < 300)} count playableUnits; - if (count crew _x isEqualTo 0) then { - switch (true) do { - case ((_x getHitPointDamage "HitEngine") > 0.7 && _units isEqualTo 0) : {deleteVehicle _x; _deleted = true;}; - case ((_x getHitPointDamage "HitLFWheel") > 0.98 && _units isEqualTo 0) : {deleteVehicle _x; _deleted = true;}; - case ((_x getHitPointDamage "HitLF2Wheel") > 0.98 && _units isEqualTo 0) : {deleteVehicle _x; _deleted = true;}; - case ((_x getHitPointDamage "HitRFWheel") > 0.98 && _units isEqualTo 0) : {deleteVehicle _x; _deleted = true;}; - case ((_x getHitPointDamage "HitRF2Wheel") > 0.98 && _units isEqualTo 0) : {deleteVehicle _x; _deleted = true;}; - case (_units isEqualTo 0): {deleteVehicle _x; _deleted = true;}; - }; - }; - - if (_deleted) then { - waitUntil {isNull _veh}; - _deleted = false; - }; - - if (isNull _veh) then { - if (count _dbInfo > 0) then { - _uid = _dbInfo select 0; - _plate = _dbInfo select 1; - - _query = format ["UPDATE vehicles SET active='0', fuel='%3' WHERE pid='%1' AND plate='%2'",_uid,_plate,_fuel]; - - [_query,1] call DB_fnc_asyncCall; - }; - }; - }; - } forEach vehicles; - - uiSleep (3 * 60); //3 minute cool-down before next cycle. - { - if ((typeOf _x) in ["Land_BottlePlastic_V1_F","Land_TacticalBacon_F","Land_Can_V3_F","Land_CanisterFuel_F", "Land_Can_V3_F","Land_Money_F","Land_Suitcase_F"]) then { - deleteVehicle _x; - }; - } forEach (allMissionObjects "Thing"); - - uiSleep (2 * 60); - { - deleteVehicle _x; - } forEach (allMissionObjects "GroundWeaponHolder"); -}; +#include "\life_server\script_macros.hpp" +/* + File: fn_cleanup.sqf + Author: Bryan "Tonic" Boardwine + + Description: + Server-side cleanup script on vehicles, dealers and fed reserve. +*/ +private _saveFuel = LIFE_SETTINGS(getNumber,"save_vehicle_fuel") isEqualTo 1; +private _minUnitDistance = LIFE_SETTINGS(getNumber,"vehicles_despawn_max_distance"); + +private _fnc_fedDealerUpdate = { + { + private _dealer = missionNamespace getVariable [_x, objNull]; + if !(isNull _dealer) then { + _x setVariable ["sellers", [], true]; + }; + } forEach ["Dealer_1", "Dealer_2", "Dealer_3"]; + + private _funds = fed_bank getVariable ["safe", 0]; + fed_bank setVariable ["safe", round(_funds + ((count playableUnits)/2)), true]; +}; + +private _fnc_cleanVehicles = { + { + private _vehicleClass = getText(configFile >> "CfgVehicles" >> (typeOf _x) >> "vehicleClass"); + private _protect = _x getVariable ["NPC",false]; + + if ((_vehicleClass in ["Car","Air","Ship","Armored","Submarine"]) && {!_protect}) then { + private _noUnitsNear = (nearestObjects [_x, ["CAManBase"], _minUnitDistance]) findIf {isPlayer _x && {alive _x}} isEqualTo -1; + + if (crew _x isEqualTo [] && {_noUnitsNear}) then { + private _fuel = if (_saveFuel) then {fuel _x} else {1}; + private _dbInfo = _x getVariable "dbInfo"; + + deleteVehicle _x; + + if (isNil "_dbInfo") exitWith {}; + + waitUntil {uiSleep 1; isNull _x}; + + _dbInfo params [ + "_uid", + "_plate" + ]; + + private _query = format ["cleanupVehicle:%1:%2:%3", _fuel, _uid, _plate]; + [_query, 1] call DB_fnc_asyncCall; + }; + }; + } forEach vehicles; + + { + if (!isNil {_x getVariable "item"}) then { + deleteVehicle _x; + }; + true + } count (allMissionObjects "Thing"); +}; + +//Array format: [parameters,function,delayTime] +private _routines = [ + [[], _fnc_fedDealerUpdate, 1800], + [[], _fnc_cleanVehicles, 3600] +]; + +{ + _x pushBack (diag_tickTime + (_x # 2)); +} forEach _routines; + +for "_i" from 0 to 1 step 0 do { + { + _x params ["_params", "_function", "_delay", "_timeToRun"]; + if (diag_tickTime > _timeToRun) then { + _params call _function; + _x set [2, diag_tickTime + _delay]; + }; + } forEach _routines; + uiSleep 1e-6; +}; diff --git a/life_server/Functions/Systems/fn_entityKilled.sqf b/life_server/Functions/Systems/fn_entityKilled.sqf new file mode 100644 index 000000000..836d8d8c9 --- /dev/null +++ b/life_server/Functions/Systems/fn_entityKilled.sqf @@ -0,0 +1,78 @@ +#include "\life_server\script_macros.hpp" +/* + File: fn_entityKilled.sqf + Author: DomT602 + Description: + Called when an entity dies +*/ +params [ + ["_killed", objNull, [objNull]], + ["_killer", objNull, [objNull]], + ["_instigator", objNull, [objNull]], + ["_useEffects", true, [true]] +]; + +if (isPlayer _killed) exitWith { + if (LIFE_SETTINGS(getNumber,"player_deathLog") isEqualTo 0) exitWith {}; + private _killedName = name _killed; + + if (_killed isEqualTo _killer) exitWith { + diag_log format ["death_log: Suicide Message: %1 committed suicide (or disconnected)", _killedName]; + }; + + //instigator is null -> indicated Roadkill + //reference: https://community.bistudio.com/wiki/Arma_3:_Event_Handlers/addMissionEventHandler#EntityKilled + if (isNull _instigator) exitWith { + private _vehicle = vehicle _killer; + private _vehicleName = getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "displayName"); + (UAVControl _vehicle) params ["_instigator"]; + + if !(isNull _instigator) exitWith { + diag_log format ["death_log: UAV Death Message: %1 has knocked down %2 with a %3", name _instigator, _killedName, _vehicleName]; + }; + + if (_vehicle isKindOf "Air") exitWith { + diag_log format ["death_log: Aircraft Death Message: %1 has obliterated %2 with a %3", name _killer, _killedName, _vehicleName]; + }; + diag_log format ["death_log: Vehicle Death Message: %1 has knocked down %2 with a %3", name _killer, _killedName, _vehicleName]; + }; + + private _weaponName = getText(configFile >> "cfgWeapons" >> (currentWeapon _instigator) >> "displayName"); + private _distance = floor(_killer distance _killed); + + diag_log format ["death_log: Weapon Death Message: %1 has killed %2 with Weapon %3 from %4 Meters", name _instigator, _killedName, _weaponName, _distance]; +}; + +private _vehicleClass = getText(configFile >> "CfgVehicles" >> (typeOf _killed) >> "vehicleClass"); + +if (_vehicleClass in ["Air","Armored","Car","Ship","Submarine"]) exitWith { + private _dbInfo = _killed getVariable ["dbInfo",[]]; + + if (count _dbInfo > 0) then { + _dbInfo params [ + "_uid", + "_plate" + ]; + + private _query = format ["deleteVehicle:%1:%2", _uid, _plate]; + [_query,1] call DB_fnc_asyncCall; + }; + + if (!isNull _killed) then { + + [_killed] spawn { + private _startTime = serverTime; + private _delay = LIFE_SETTINGS(getNumber,"dead_vehicles_despawn_delay"); + private _minUnitDistance = LIFE_SETTINGS(getNumber,"dead_vehicles_max_units_distance"); + params [ + ["_killed", objNull, [objNull]] + ]; + + waitUntil { + uiSleep 1; + ((nearestObjects [_killed, ["CAManBase"], _minUnitDistance]) findIf {isPlayer _x && {alive _x}} isEqualTo -1) || {serverTime - _startTime >= _delay} + }; + deleteVehicle _killed; + }; + }; +}; diff --git a/life_server/Functions/Systems/fn_federalUpdate.sqf b/life_server/Functions/Systems/fn_federalUpdate.sqf deleted file mode 100644 index b114cb189..000000000 --- a/life_server/Functions/Systems/fn_federalUpdate.sqf +++ /dev/null @@ -1,13 +0,0 @@ -/* - File: fn_federalUpdate.sqf - Author: Bryan "Tonic" Boardwine - - Description: - Uhhh, adds to it? -*/ -private "_funds"; -for "_i" from 0 to 1 step 0 do { - uiSleep (30 * 60); - _funds = fed_bank getVariable ["safe",0]; - fed_bank setVariable ["safe",round(_funds+((count playableUnits)/2)),true]; -}; diff --git a/life_server/Functions/Systems/fn_getVehicles.sqf b/life_server/Functions/Systems/fn_getVehicles.sqf old mode 100644 new mode 100755 index 9cf95f78a..e89bf0e83 --- a/life_server/Functions/Systems/fn_getVehicles.sqf +++ b/life_server/Functions/Systems/fn_getVehicles.sqf @@ -6,14 +6,16 @@ Description: Sends a request to query the database information and returns vehicles. */ -private ["_pid","_side","_type","_unit","_ret","_tickTime","_queryResult"]; -_pid = [_this,0,"",[""]] call BIS_fnc_param; -_side = [_this,1,sideUnknown,[west]] call BIS_fnc_param; -_type = [_this,2,"",[""]] call BIS_fnc_param; -_unit = [_this,3,objNull,[objNull]] call BIS_fnc_param; + +params [ + ["_pid", "", [""]], + ["_side", sideUnknown, [west]], + ["_type", "", [""]], + ["_unit", objNull, [objNull]] +]; //Error checks -if (_pid isEqualTo "" || _side isEqualTo sideUnknown || _type isEqualTo "" || isNull _unit) exitWith { +if (_pid isEqualTo "" || {_side isEqualTo sideUnknown} || {_type isEqualTo ""} || {isNull _unit}) exitWith { if (!isNull _unit) then { [[]] remoteExec ["life_fnc_impoundMenu",(owner _unit)]; }; @@ -27,26 +29,25 @@ _side = switch (_side) do { default {"Error"}; }; -if (_side == "Error") exitWith { - [[]] remoteExec ["life_fnc_impoundMenu",(owner _unit)]; +if (_side isEqualTo "Error") exitWith { + [[]] remoteExec ["life_fnc_impoundMenu", (owner _unit)]; }; -_query = format ["SELECT id, side, classname, type, pid, alive, active, plate, color FROM vehicles WHERE pid='%1' AND alive='1' AND active='0' AND side='%2' AND type='%3'",_pid,_side,_type]; - +private _query = format ["selectVehicles:%1:%2:%3", _pid, _side, _type]; -_tickTime = diag_tickTime; -_queryResult = [_query,2,true] call DB_fnc_asyncCall; +private _tickTime = diag_tickTime; +private _queryResult = [_query, 2, true] call DB_fnc_asyncCall; if (EXTDB_SETTING(getNumber,"DebugMode") isEqualTo 1) then { diag_log "------------- Client Query Request -------------"; - diag_log format ["QUERY: %1",_query]; - diag_log format ["Time to complete: %1 (in seconds)",(diag_tickTime - _tickTime)]; - diag_log format ["Result: %1",_queryResult]; + diag_log format ["QUERY: %1", _query]; + diag_log format ["Time to complete: %1 (in seconds)", (diag_tickTime - _tickTime)]; + diag_log format ["Result: %1", _queryResult]; diag_log "------------------------------------------------"; }; if (_queryResult isEqualType "") exitWith { - [[]] remoteExec ["life_fnc_impoundMenu",(owner _unit)]; + [[]] remoteExec ["life_fnc_impoundMenu", (owner _unit)]; }; -[_queryResult] remoteExec ["life_fnc_impoundMenu",_unit]; +[_queryResult] remoteExec ["life_fnc_impoundMenu", _unit]; diff --git a/life_server/Functions/Systems/fn_spawnVehicle.sqf b/life_server/Functions/Systems/fn_spawnVehicle.sqf old mode 100644 new mode 100755 index a03cafb13..3eaddef48 --- a/life_server/Functions/Systems/fn_spawnVehicle.sqf +++ b/life_server/Functions/Systems/fn_spawnVehicle.sqf @@ -7,6 +7,7 @@ Sends the query request to the database, if an array is returned then it creates the vehicle if it's not in use or dead. */ + params [ ["_vid", -1, [0]], ["_pid", "", [""]], @@ -28,10 +29,10 @@ serv_sv_use pushBack _vid; private _servIndex = serv_sv_use find _vid; -private _query = format ["SELECT id, side, classname, type, pid, alive, active, plate, color, inventory, gear, fuel, damage, blacklist FROM vehicles WHERE id='%1' AND pid='%2'",_vid,_pid]; +private _query = format ["selectVehiclesMore:%1:%2", _vid, _pid]; private _tickTime = diag_tickTime; -private _queryResult = [_query,2] call DB_fnc_asyncCall; +private _queryResult = [_query, 2] call DB_fnc_asyncCall; if (EXTDB_SETTING(getNumber,"DebugMode") isEqualTo 1) then { diag_log "------------- Client Query Request -------------"; @@ -45,7 +46,7 @@ if (_queryResult isEqualType "") exitWith {}; private _vInfo = _queryResult; if (isNil "_vInfo") exitWith {serv_sv_use deleteAt _servIndex;}; -if (count _vInfo isEqualTo 0) exitWith {serv_sv_use deleteAt _servIndex;}; +if (_vInfo isEqualTo []) exitWith {serv_sv_use deleteAt _servIndex;}; if ((_vInfo select 5) isEqualTo 0) exitWith { serv_sv_use deleteAt _servIndex; @@ -64,21 +65,21 @@ if !(_sp isEqualType "") then { _nearVehicles = []; }; -if (count _nearVehicles > 0) exitWith { +if !(_nearVehicles isEqualTo []) exitWith { serv_sv_use deleteAt _servIndex; [_price,_unit_return] remoteExecCall ["life_fnc_garageRefund",_unit]; [1,"STR_Garage_SpawnPointError",true] remoteExecCall ["life_fnc_broadcast",_unit]; }; -_query = format ["UPDATE vehicles SET active='1', damage='""[]""' WHERE pid='%1' AND id='%2'",_pid,_vid]; +_query = format ["updateVehicle:%1:%2", _pid, _vid]; -private _trunk = [(_vInfo select 9)] call DB_fnc_mresToArray; -private _gear = [(_vInfo select 10)] call DB_fnc_mresToArray; -private _damage = [call compile (_vInfo select 12)] call DB_fnc_mresToArray; +private _trunk = _vInfo select 9; +private _gear = _vInfo select 10; +private _damage = _vInfo select 12; private _wasIllegal = _vInfo select 13; -_wasIllegal = if (_wasIllegal isEqualTo 1) then { true } else { false }; +_wasIllegal = _wasIllegal isEqualTo 1; -[_query,1] call DB_fnc_asyncCall; +[_query, 1] call DB_fnc_asyncCall; private "_vehicle"; if (_sp isEqualType "") then { @@ -111,42 +112,42 @@ _vehicle disableTIEquipment true; //No Thermals.. They're cheap but addictive. if (LIFE_SETTINGS(getNumber,"save_vehicle_virtualItems") isEqualTo 1) then { _vehicle setVariable ["Trunk",_trunk,true]; - + if (_wasIllegal) then { private _refPoint = if (_sp isEqualType "") then {getMarkerPos _sp;} else {_sp;}; - + private _distance = 100000; private "_location"; { private _tempLocation = nearestLocation [_refPoint, _x]; private _tempDistance = _refPoint distance _tempLocation; - + if (_tempDistance < _distance) then { _location = _tempLocation; _distance = _tempDistance; }; false - + } count ["NameCityCapital", "NameCity", "NameVillage"]; - + _location = text _location; - [1,"STR_NOTF_BlackListedVehicle",true,[_location,_name]] remoteExecCall ["life_fnc_broadcast",west]; + [1, "STR_NOTF_BlackListedVehicle", true, [_location, _name]] remoteExecCall ["life_fnc_broadcast", west]; - _query = format ["UPDATE vehicles SET blacklist='0' WHERE id='%1' AND pid='%2'",_vid,_pid]; - [_query,1] call DB_fnc_asyncCall; + _query = format ["updateVehicleBlacklist:%1:%2", _vid, _pid]; + [_query, 1] call DB_fnc_asyncCall; }; } else { - _vehicle setVariable ["Trunk",[[],0],true]; + _vehicle setVariable ["Trunk", [[], 0], true]; }; if (LIFE_SETTINGS(getNumber,"save_vehicle_fuel") isEqualTo 1) then { _vehicle setFuel (_vInfo select 11); - }else{ +} else { _vehicle setFuel 1; }; -if (count _gear > 0 && (LIFE_SETTINGS(getNumber,"save_vehicle_inventory") isEqualTo 1)) then { +if (!(_gear isEqualTo []) && (LIFE_SETTINGS(getNumber,"save_vehicle_inventory") isEqualTo 1)) then { _items = _gear select 0; _mags = _gear select 1; _weapons = _gear select 2; @@ -166,7 +167,7 @@ if (count _gear > 0 && (LIFE_SETTINGS(getNumber,"save_vehicle_inventory") isEqua }; }; -if (count _damage > 0 && (LIFE_SETTINGS(getNumber,"save_vehicle_damage") isEqualTo 1)) then { +if (!(_damage isEqualTo []) && (LIFE_SETTINGS(getNumber,"save_vehicle_damage") isEqualTo 1)) then { _parts = getAllHitPointsDamage _vehicle; for "_i" from 0 to ((count _damage) - 1) do { diff --git a/life_server/Functions/Systems/fn_vehicleCreate.sqf b/life_server/Functions/Systems/fn_vehicleCreate.sqf old mode 100644 new mode 100755 index 844ec7374..078215457 --- a/life_server/Functions/Systems/fn_vehicleCreate.sqf +++ b/life_server/Functions/Systems/fn_vehicleCreate.sqf @@ -5,17 +5,19 @@ Description: Answers the query request to create the vehicle in the database. */ -private ["_uid","_side","_type","_classname","_color","_plate"]; -_uid = [_this,0,"",[""]] call BIS_fnc_param; -_side = [_this,1,sideUnknown,[west]] call BIS_fnc_param; -_vehicle = [_this,2,objNull,[objNull]] call BIS_fnc_param; -_color = [_this,3,-1,[0]] call BIS_fnc_param; + +params [ + ["_uid", "", [""]], + ["_side", sideUnknown, [west]], + ["_vehicle", objNull, [objNull]], + ["_color", -1, [0]] +]; //Error checks -if (_uid isEqualTo "" || _side isEqualTo sideUnknown || isNull _vehicle) exitWith {}; +if (_uid isEqualTo "" || {_side isEqualTo sideUnknown} || {isNull _vehicle}) exitWith {}; if (!alive _vehicle) exitWith {}; -_className = typeOf _vehicle; -_type = switch (true) do { +private _className = typeOf _vehicle; +private _type = switch (true) do { case (_vehicle isKindOf "Car"): {"Car"}; case (_vehicle isKindOf "Air"): {"Air"}; case (_vehicle isKindOf "Ship"): {"Ship"}; @@ -28,7 +30,7 @@ _side = switch (_side) do { default {"Error"}; }; -_plate = round(random(1000000)); -[_uid,_side,_type,_classname,_color,_plate] call DB_fnc_insertVehicle; +private _plate = round(random(1000000)); +[_uid, _side, _type, _classname, _color, _plate] call DB_fnc_insertVehicle; -_vehicle setVariable ["dbInfo",[_uid,_plate],true]; +_vehicle setVariable ["dbInfo", [_uid, _plate], true]; diff --git a/life_server/Functions/Systems/fn_vehicleDelete.sqf b/life_server/Functions/Systems/fn_vehicleDelete.sqf old mode 100644 new mode 100755 index 09bd48033..a3b3622c5 --- a/life_server/Functions/Systems/fn_vehicleDelete.sqf +++ b/life_server/Functions/Systems/fn_vehicleDelete.sqf @@ -6,16 +6,16 @@ Doesn't actually delete since we don't give our DB user that type of access so instead we set it to alive=0 so it never shows again. */ -private ["_vid","_sp","_pid","_query","_type","_thread"]; -_vid = [_this,0,-1,[0]] call BIS_fnc_param; -_pid = [_this,1,"",[""]] call BIS_fnc_param; -_sp = [_this,2,2500,[0]] call BIS_fnc_param; -_unit = [_this,3,objNull,[objNull]] call BIS_fnc_param; -_type = [_this,4,"",[""]] call BIS_fnc_param; -if (_vid isEqualTo -1 || _pid isEqualTo "" || _sp isEqualTo 0 || isNull _unit || _type isEqualTo "") exitWith {}; -_unit = owner _unit; +params [ + ["_vid", -1, [0]], + ["_pid", "", [""]], + ["_sp", 2500, [0]], + ["_unit", objNull, [objNull]], + ["_type", "", [""]] +]; -_query = format ["UPDATE vehicles SET alive='0' WHERE pid='%1' AND id='%2'",_pid,_vid]; +if (_vid isEqualTo -1 || {_pid isEqualTo ""} || {_sp isEqualTo 0} || {isNull _unit} || {_type isEqualTo ""}) exitWith {}; -_thread = [_query,1] call DB_fnc_asyncCall; \ No newline at end of file +private _query = format ["deleteVehicleID:%1:%2", _pid, _vid]; +private _thread = [_query, 1] call DB_fnc_asyncCall; diff --git a/life_server/Functions/Systems/fn_vehicleStore.sqf b/life_server/Functions/Systems/fn_vehicleStore.sqf old mode 100644 new mode 100755 index f4963f449..5b56d6ab3 --- a/life_server/Functions/Systems/fn_vehicleStore.sqf +++ b/life_server/Functions/Systems/fn_vehicleStore.sqf @@ -5,39 +5,47 @@ Description: Stores the vehicle in the 'Garage' */ -private ["_vehicle","_impound","_vInfo","_vInfo","_plate","_uid","_query","_sql","_unit","_trunk","_vehItems","_vehMags","_vehWeapons","_vehBackpacks","_cargo","_saveItems","_storetext","_resourceItems","_fuel","_damage","_itemList","_totalweight","_weight","_thread"]; -_vehicle = [_this,0,objNull,[objNull]] call BIS_fnc_param; -_impound = [_this,1,false,[true]] call BIS_fnc_param; -_unit = [_this,2,objNull,[objNull]] call BIS_fnc_param; -_storetext = [_this,3,"",[""]] call BIS_fnc_param; -_resourceItems = LIFE_SETTINGS(getArray,"save_vehicle_items"); -if (isNull _vehicle || isNull _unit) exitWith {life_impound_inuse = false; (owner _unit) publicVariableClient "life_impound_inuse";life_garage_store = false;(owner _unit) publicVariableClient "life_garage_store";}; //Bad data passed. -_vInfo = _vehicle getVariable ["dbInfo",[]]; +params [ + ["_vehicle", objNull, [objNull]], + ["_impound", false, [true]], + ["_unit", objNull, [objNull]], + ["_storetext", "", [""]] +]; -if (count _vInfo > 0) then { +private _resourceItems = LIFE_SETTINGS(getArray,"save_vehicle_items"); + +if (isNull _vehicle || {isNull _unit}) exitWith {life_impound_inuse = false; (owner _unit) publicVariableClient "life_impound_inuse";life_garage_store = false;(owner _unit) publicVariableClient "life_garage_store";}; //Bad data passed. +private _vInfo = _vehicle getVariable ["dbInfo", []]; +private "_plate"; +private "_uid"; + +if !(_vInfo isEqualTo []) then { _plate = _vInfo select 1; _uid = _vInfo select 0; }; // save damage. +private "_damage"; if (LIFE_SETTINGS(getNumber,"save_vehicle_damage") isEqualTo 1) then { _damage = getAllHitPointsDamage _vehicle; _damage = _damage select 2; - } else { +} else { _damage = []; }; -_damage = [_damage] call DB_fnc_mresArray; // because fuel price! +private "_fuel"; if (LIFE_SETTINGS(getNumber,"save_vehicle_fuel") isEqualTo 1) then { _fuel = (fuel _vehicle); - } else { +} else { _fuel = 1; }; +private "_query"; +private "_thread"; if (_impound) exitWith { - if (count _vInfo isEqualTo 0) then { + if (_vInfo isEqualTo []) then { life_impound_inuse = false; (owner _unit) publicVariableClient "life_impound_inuse"; @@ -45,7 +53,7 @@ if (_impound) exitWith { deleteVehicle _vehicle; }; } else { // no free repairs! - _query = format ["UPDATE vehicles SET active='0', fuel='%3', damage='%4' WHERE pid='%1' AND plate='%2'",_uid , _plate, _fuel, _damage]; + _query = format ["updateVehicleFuel:%1:%2:%3:%4", _fuel, _damage, _uid, _plate]; _thread = [_query,1] call DB_fnc_asyncCall; if (!isNil "_vehicle" && {!isNull _vehicle}) then { @@ -58,8 +66,15 @@ if (_impound) exitWith { }; // not persistent so just do this! -if (count _vInfo isEqualTo 0) exitWith { - [1,"STR_Garage_Store_NotPersistent",true] remoteExecCall ["life_fnc_broadcast",(owner _unit)]; +if (_vInfo isEqualTo []) exitWith { + if (LIFE_SETTINGS(getNumber,"vehicle_rentalReturn") isEqualTo 1) then { + [1,"STR_Garage_Store_NotPersistent2",true] remoteExecCall ["life_fnc_broadcast",(owner _unit)]; + if (!isNil "_vehicle" && {!isNull _vehicle}) then { + deleteVehicle _vehicle; + }; + } else { + [1,"STR_Garage_Store_NotPersistent",true] remoteExecCall ["life_fnc_broadcast",(owner _unit)]; + }; life_garage_store = false; (owner _unit) publicVariableClient "life_garage_store"; }; @@ -71,20 +86,20 @@ if !(_uid isEqualTo getPlayerUID _unit) exitWith { }; // sort out whitelisted items! -_trunk = _vehicle getVariable ["Trunk", [[], 0]]; -_itemList = _trunk select 0; -_totalweight = 0; +private _trunk = _vehicle getVariable ["Trunk", [[], 0]]; +private _itemList = _trunk select 0; +private _totalweight = 0; +private "_weight"; _items = []; if (LIFE_SETTINGS(getNumber,"save_vehicle_virtualItems") isEqualTo 1) then { if (LIFE_SETTINGS(getNumber,"save_vehicle_illegal") isEqualTo 1) then { - private ["_isIllegal", "_blacklist"]; - _blacklist = false; - _profileQuery = format ["SELECT name FROM players WHERE pid='%1'", _uid]; + private _blacklist = false; + _profileQuery = format ["selectName:%1", _uid]; _profileName = [_profileQuery, 2] call DB_fnc_asyncCall; _profileName = _profileName select 0; { - _isIllegal = M_CONFIG(getNumber,"VirtualItems",(_x select 0),"illegal"); + private _isIllegal = M_CONFIG(getNumber,"VirtualItems",(_x select 0),"illegal"); _isIllegal = if (_isIllegal isEqualTo 1) then { true } else { false }; @@ -102,7 +117,7 @@ if (LIFE_SETTINGS(getNumber,"save_vehicle_virtualItems") isEqualTo 1) then { if (_blacklist) then { [_uid, _profileName, "481"] remoteExecCall["life_fnc_wantedAdd", RSERV]; - _query = format ["UPDATE vehicles SET blacklist='1' WHERE pid='%1' AND plate='%2'", _uid, _plate]; + _query = format ["updateVehicleBlacklistPlate:%1:%2", _uid, _plate]; _thread = [_query, 1] call DB_fnc_asyncCall; }; @@ -124,23 +139,22 @@ else { _trunk = [[], 0]; }; +private "_cargo"; + if (LIFE_SETTINGS(getNumber,"save_vehicle_inventory") isEqualTo 1) then { - _vehItems = getItemCargo _vehicle; - _vehMags = getMagazineCargo _vehicle; - _vehWeapons = getWeaponCargo _vehicle; - _vehBackpacks = getBackpackCargo _vehicle; - _cargo = [_vehItems,_vehMags,_vehWeapons,_vehBackpacks]; + private _vehItems = getItemCargo _vehicle; + private _vehMags = getMagazineCargo _vehicle; + private _vehWeapons = getWeaponCargo _vehicle; + private _vehBackpacks = getBackpackCargo _vehicle; + _cargo = [_vehItems, _vehMags, _vehWeapons, _vehBackpacks]; // no items? clean the array so the database looks pretty - if ((count (_vehItems select 0) isEqualTo 0) && (count (_vehMags select 0) isEqualTo 0) && (count (_vehWeapons select 0) isEqualTo 0) && (count (_vehBackpacks select 0) isEqualTo 0)) then {_cargo = [];}; + if (((_vehItems select 0) isEqualTo []) && ((_vehMags select 0) isEqualTo []) && ((_vehWeapons select 0) isEqualTo []) && ((_vehBackpacks select 0) isEqualTo [])) then {_cargo = [];}; } else { _cargo = []; }; -// prepare -_trunk = [_trunk] call DB_fnc_mresArray; -_cargo = [_cargo] call DB_fnc_mresArray; // update -_query = format ["UPDATE vehicles SET active='0', inventory='%3', gear='%4', fuel='%5', damage='%6' WHERE pid='%1' AND plate='%2'", _uid, _plate, _trunk, _cargo, _fuel, _damage]; +_query = format ["updateVehicleAll:%1:%2:%3:%4:%5:%6", _trunk, _cargo, _fuel, _damage, _uid, _plate]; _thread = [_query,1] call DB_fnc_asyncCall; if (!isNil "_vehicle" && {!isNull _vehicle}) then { diff --git a/life_server/Functions/Systems/fn_vehicleUpdate.sqf b/life_server/Functions/Systems/fn_vehicleUpdate.sqf old mode 100644 new mode 100755 index bf59eab04..dc685b4f9 --- a/life_server/Functions/Systems/fn_vehicleUpdate.sqf +++ b/life_server/Functions/Systems/fn_vehicleUpdate.sqf @@ -6,51 +6,53 @@ Description: Tells the database that this vehicle need update inventory. */ -private ["_vehicle","_plate","_uid","_query","_sql","_dbInfo","_thread","_cargo","_trunk","_resourceItems","_fuel","_damage","_itemList","_totalweight","_weight"]; -_vehicle = [_this,0,objNull,[objNull]] call BIS_fnc_param; -_mode = [_this,1,1,[0]] call BIS_fnc_param; + +params [ + ["_vehicle", objNull, [objNull]], + ["_mode", 1, [0]] +]; + if (isNull _vehicle) exitWith {}; //NULL -_dbInfo = _vehicle getVariable ["dbInfo",[]]; -if (count _dbInfo isEqualTo 0) exitWith {}; -_uid = _dbInfo select 0; -_plate = _dbInfo select 1; +private _dbInfo = _vehicle getVariable ["dbInfo",[]]; +if (_dbInfo isEqualTo []) exitWith {}; + +private _uid = _dbInfo select 0; +private _plate = _dbInfo select 1; + switch (_mode) do { case 1: { - _vehItems = getItemCargo _vehicle; - _vehMags = getMagazineCargo _vehicle; - _vehWeapons = getWeaponCargo _vehicle; - _vehBackpacks = getBackpackCargo _vehicle; - _cargo = [_vehItems,_vehMags,_vehWeapons,_vehBackpacks]; + private _vehItems = getItemCargo _vehicle; + private _vehMags = getMagazineCargo _vehicle; + private _vehWeapons = getWeaponCargo _vehicle; + private _vehBackpacks = getBackpackCargo _vehicle; + private _cargo = [_vehItems,_vehMags,_vehWeapons,_vehBackpacks]; // Keep it clean! - if ((count (_vehItems select 0) isEqualTo 0) && (count (_vehMags select 0) isEqualTo 0) && (count (_vehWeapons select 0) isEqualTo 0) && (count (_vehBackpacks select 0) isEqualTo 0)) then { + if (((_vehItems select 0) isEqualTo []) && ((_vehMags select 0) isEqualTo []) && ((_vehWeapons select 0) isEqualTo []) && ((_vehBackpacks select 0) isEqualTo [])) then { _cargo = []; }; - _cargo = [_cargo] call DB_fnc_mresArray; - - _query = format ["UPDATE vehicles SET gear='%3' WHERE pid='%1' AND plate='%2'",_uid,_plate,_cargo]; - _thread = [_query,1] call DB_fnc_asyncCall; + private _query = format ["updateVehicleGear:%1:%2:%3", _cargo, _uid, _plate]; + private _thread = [_query, 1] call DB_fnc_asyncCall; }; case 2: { - _resourceItems = LIFE_SETTINGS(getArray,"save_vehicle_items"); - _trunk = _vehicle getVariable ["Trunk",[[],0]]; - _itemList = _trunk select 0; - _totalweight = 0; - _items = []; + private _resourceItems = LIFE_SETTINGS(getArray,"save_vehicle_items"); + private _trunk = _vehicle getVariable ["Trunk",[[],0]]; + private _itemList = _trunk select 0; + private _totalweight = 0; + private _items = []; { if ((_x select 0) in _resourceItems) then { _items pushBack [_x select 0,_x select 1]; - _weight = (ITEM_WEIGHT(_x select 0)) * (_x select 1); + private _weight = (ITEM_WEIGHT(_x select 0)) * (_x select 1); _totalweight = _weight + _totalweight; }; - }forEach _itemList; + } forEach _itemList; _trunk = [_items,_totalweight]; - _trunk = [_trunk] call DB_fnc_mresArray; - _query = format ["UPDATE vehicles SET inventory='%3' WHERE pid='%1' AND plate='%2'",_uid,_plate,_trunk]; - _thread = [_query,1] call DB_fnc_asyncCall; + private _query = format ["updateVehicleTrunk:%1:%2:%3", _trunk, _uid, _plate]; + private _thread = [_query,1] call DB_fnc_asyncCall; }; -}; \ No newline at end of file +}; diff --git a/life_server/Functions/Systems/fn_whoDoneIt.sqf b/life_server/Functions/Systems/fn_whoDoneIt.sqf deleted file mode 100644 index fac03e6b5..000000000 --- a/life_server/Functions/Systems/fn_whoDoneIt.sqf +++ /dev/null @@ -1,40 +0,0 @@ -/* - File: fn_whoDoneIt.sqf - Description: Save log file of units killed. - Author: Å ColinM - Help of BI Wiki & Forums. - - Credits: KillzoneKid for his Debug_Console v3.0 file. Cuel from the BI Forums for his current & previous posts. -*/ -params [ - ["_victim",objNull,[objNull]], - ["_killer",objNull,[objNull]] -]; - -if (isServer) then { - private ["_killerWep","_killerVeh","_distance","_message"]; - if (isNull _victim || isNull _killer) exitWith {}; - - _killerWep = currentWeapon _killer; - _killerVeh = vehicle _killer; - _distance = _killer distance _victim; - _distance = floor(_distance); - - _message = ""; - if (_victim == _killer) then { - _message = format ["Suicide Message: %1 committed suicide (or disconnected)", (name _victim)]; - }; - if (_killerWep != "") then { - _message = format ["Weapon Death Message: %1 has killed %2 with Weapon %3 from %4 Meters", (name _killer), (name _victim), (getText(configFile >> "cfgWeapons" >> _killerWep >> "displayName")), _distance]; - }; - if (_killerVeh isKindOf "Car" && _killerWep isEqualTo "") then { - _message = format ["Vehicle Death Message: %1 has knocked down %2 with a %3", (name _killer), (name _victim), (getText(configFile >> "CfgVehicles" >> (typeOf _killerVeh) >> "displayName"))]; - }; - if (_killerVeh isKindOf "Air" && _killerWep isEqualTo "") then { - _message = format ["Aircraft Death Message: %1 has obliterated %2 with a %3", (name _killer), (name _victim), (getText(configFile >> "CfgVehicles" >> (typeOf _killerVeh) >> "displayName"))]; - }; - if (_message isEqualTo "") then { - _message = format ["Death Message: %1 has killed %2", (name _killer), (name _victim)]; - }; - - diag_log format ["death_log: %1",_message]; -}; diff --git a/life_server/Functions/WantedSystem/fn_wantedAdd.sqf b/life_server/Functions/WantedSystem/fn_wantedAdd.sqf old mode 100644 new mode 100755 index 1114c1053..f93752195 --- a/life_server/Functions/WantedSystem/fn_wantedAdd.sqf +++ b/life_server/Functions/WantedSystem/fn_wantedAdd.sqf @@ -8,6 +8,7 @@ Description: Adds or appends a unit to the wanted list. */ + params [ ["_uid","",[""]], ["_name","",[""]], @@ -19,35 +20,33 @@ if (_uid isEqualTo "" || {_type isEqualTo ""} || {_name isEqualTo ""}) exitWith //What is the crime? private _crimesConfig = getArray(missionConfigFile >> "Life_Settings" >> "crimes"); -private _index = [_type,_crimesConfig] call TON_fnc_index; +private _index = [_type, _crimesConfig] call life_util_fnc_index; if (_index isEqualTo -1) exitWith {}; _type = [_type, parseNumber ((_crimesConfig select _index) select 1)]; -if (count _type isEqualTo 0) exitWith {}; //Not our information being passed... +if (_type isEqualTo []) exitWith {}; //Not our information being passed... //Is there a custom bounty being sent? Set that as the pricing. if !(_customBounty isEqualTo -1) then {_type set[1,_customBounty];}; //Search the wanted list to make sure they are not on it. -private _query = format ["SELECT wantedID FROM wanted WHERE wantedID='%1'",_uid]; +private _query = format ["selectWantedID:%1", _uid]; private _queryResult = [_query,2,true] call DB_fnc_asyncCall; -private _val = [_type select 1] call DB_fnc_numberSafe; +private _val = _type select 1; private _number = _type select 0; -if !(count _queryResult isEqualTo 0) then { - _query = format ["SELECT wantedCrimes, wantedBounty FROM wanted WHERE wantedID='%1'",_uid]; +if !(_queryResult isEqualTo []) then { + _query = format ["selectWantedCrimes:%1", _uid]; _queryResult = [_query,2] call DB_fnc_asyncCall; - _pastCrimes = [_queryResult select 0] call DB_fnc_mresToArray; + _pastCrimes = _queryResult select 0; if (_pastCrimes isEqualType "") then {_pastCrimes = call compile format ["%1", _pastCrimes];}; _pastCrimes pushBack _number; - _pastCrimes = [_pastCrimes] call DB_fnc_mresArray; - _query = format ["UPDATE wanted SET wantedCrimes = '%1', wantedBounty = wantedBounty + '%2', active = '1' WHERE wantedID='%3'",_pastCrimes,_val,_uid]; + _query = format ["updateWanted:%1:%2:%3", _pastCrimes, _val, _uid]; [_query,1] call DB_fnc_asyncCall; } else { _crime = [_type select 0]; - _crime = [_crime] call DB_fnc_mresArray; - _query = format ["INSERT INTO wanted (wantedID, wantedName, wantedCrimes, wantedBounty, active) VALUES('%1', '%2', '%3', '%4', '1')",_uid,_name,_crime,_val]; + _query = format ["insertWanted:%1:%2:%3:%4", _uid, _name, _crime, _val]; [_query,1] call DB_fnc_asyncCall; }; diff --git a/life_server/Functions/WantedSystem/fn_wantedBounty.sqf b/life_server/Functions/WantedSystem/fn_wantedBounty.sqf old mode 100644 new mode 100755 index 3a41b0080..5cc334532 --- a/life_server/Functions/WantedSystem/fn_wantedBounty.sqf +++ b/life_server/Functions/WantedSystem/fn_wantedBounty.sqf @@ -8,6 +8,7 @@ Description: Checks if the person is on the bounty list and awards the cop for killing them. */ + params [ ["_uid","",[""]], ["_civ",objNull,[objNull]], @@ -17,11 +18,11 @@ params [ if (isNull _civ || isNull _cop) exitWith {}; -private _query = format ["SELECT wantedID, wantedName, wantedCrimes, wantedBounty FROM wanted WHERE active='1' AND wantedID='%1'",_uid]; +private _query = format ["selectWanted:%1", _uid]; private _queryResult = [_query,2] call DB_fnc_asyncCall; private "_amount"; -if !(count _queryResult isEqualTo 0) then { +if !(_queryResult isEqualTo []) then { _amount = _queryResult param [3]; if !(_amount isEqualTo 0) then { if (_half) then { @@ -30,4 +31,4 @@ if !(count _queryResult isEqualTo 0) then { [_amount,_amount] remoteExecCall ["life_fnc_bountyReceive",(owner _cop)]; }; }; -}; \ No newline at end of file +}; diff --git a/life_server/Functions/WantedSystem/fn_wantedCrimes.sqf b/life_server/Functions/WantedSystem/fn_wantedCrimes.sqf old mode 100644 new mode 100755 index 58668a495..dfdceec55 --- a/life_server/Functions/WantedSystem/fn_wantedCrimes.sqf +++ b/life_server/Functions/WantedSystem/fn_wantedCrimes.sqf @@ -8,19 +8,20 @@ Description: Grabs a list of crimes committed by a person. */ + disableSerialization; params [ ["_ret",objNull,[objNull]], - ["_criminal",[],[]] + ["_criminal",[],[[]]] ]; -private _query = format ["SELECT wantedCrimes, wantedBounty FROM wanted WHERE active='1' AND wantedID='%1'",_criminal select 0]; -private _queryResult = [_query,2] call DB_fnc_asyncCall; +private _query = format ["selectWantedActive:%1", _criminal select 0]; +private _queryResult = [_query, 2] call DB_fnc_asyncCall; _ret = owner _ret; -private _type = [_queryResult select 0] call DB_fnc_mresToArray; +private _type = _queryResult select 0; if (_type isEqualType "") then {_type = call compile format ["%1", _type];}; private _crimesArr = []; @@ -30,6 +31,6 @@ private _crimesArr = []; false } count _type; -_queryResult set[0,_crimesArr]; +_queryResult set[0, _crimesArr]; -[_queryResult] remoteExec ["life_fnc_wantedInfo",_ret]; +[_queryResult] remoteExec ["life_fnc_wantedInfo", _ret]; diff --git a/life_server/Functions/WantedSystem/fn_wantedFetch.sqf b/life_server/Functions/WantedSystem/fn_wantedFetch.sqf old mode 100644 new mode 100755 index 826cf8141..f80041657 --- a/life_server/Functions/WantedSystem/fn_wantedFetch.sqf +++ b/life_server/Functions/WantedSystem/fn_wantedFetch.sqf @@ -9,7 +9,11 @@ Description: Displays wanted list information sent from the server. */ -private _ret = param [0,objNull,[objNull]]; + +params [ + ["_ret", objNull, [objNull]] +]; + if (isNull _ret) exitWith {}; _ret = owner _ret; private _inStatement = ""; @@ -20,7 +24,7 @@ private _units = []; false } count playableUnits; -if (count _units isEqualTo 0) exitWith {[_list] remoteExec ["life_fnc_wantedList",_ret];}; +if (_units isEqualTo []) exitWith {[_list] remoteExec ["life_fnc_wantedList",_ret];}; { if (count _units > 1) then { @@ -34,7 +38,7 @@ if (count _units isEqualTo 0) exitWith {[_list] remoteExec ["life_fnc_wantedList }; } forEach _units; -private _query = format ["SELECT wantedID, wantedName FROM wanted WHERE active='1' AND wantedID in (%1)",_inStatement]; +private _query = format ["selectWantedActiveID:%1", _inStatement]; private _queryResult = [_query,2,true] call DB_fnc_asyncCall; if (EXTDB_SETTING(getNumber,"DebugMode") isEqualTo 1) then { diag_log format ["Query: %1",_query]; @@ -45,6 +49,6 @@ if (EXTDB_SETTING(getNumber,"DebugMode") isEqualTo 1) then { false } count _queryResult; -if (count _list isEqualTo 0) exitWith {[_list] remoteExec ["life_fnc_wantedList",_ret];}; +if (_list isEqualTo []) exitWith {[_list] remoteExec ["life_fnc_wantedList",_ret];}; [_list] remoteExec ["life_fnc_wantedList",_ret]; diff --git a/life_server/Functions/WantedSystem/fn_wantedPerson.sqf b/life_server/Functions/WantedSystem/fn_wantedPerson.sqf old mode 100644 new mode 100755 index 4c5b6e663..f057a4307 --- a/life_server/Functions/WantedSystem/fn_wantedPerson.sqf +++ b/life_server/Functions/WantedSystem/fn_wantedPerson.sqf @@ -8,13 +8,16 @@ Description: Fetches a specific person from the wanted array. */ -private _unit = param [0,objNull,[objNull]]; + +params [ + ["_unit", objNull, [objNull]] +]; if (isNull _unit) exitWith {[]}; private _uid = getPlayerUID _unit; -private _query = format ["SELECT wantedID, wantedName, wantedBounty FROM wanted WHERE active='1' AND wantedID='%1'",_uid]; +private _query = format ["selectWantedBounty:%1", _uid]; private _queryResult = [_query,2] call DB_fnc_asyncCall; -if (count _queryResult isEqualTo 0) exitWith {[]}; +if (_queryResult isEqualTo []) exitWith {[]}; _queryResult; diff --git a/life_server/Functions/WantedSystem/fn_wantedProfUpdate.sqf b/life_server/Functions/WantedSystem/fn_wantedProfUpdate.sqf old mode 100644 new mode 100755 index e472a6cc9..cb89c4804 --- a/life_server/Functions/WantedSystem/fn_wantedProfUpdate.sqf +++ b/life_server/Functions/WantedSystem/fn_wantedProfUpdate.sqf @@ -6,20 +6,20 @@ Description: Updates name of player if they change profiles */ -private ["_query","_tickTime","_wantedCheck","_wantedQuery"]; + params [ ["_uid","",[""]], ["_name","",[""]] ]; //Bad data check -if (_uid isEqualTo "" || {_name isEqualTo ""}) exitWith {}; +if (_uid isEqualTo "" || {_name isEqualTo ""}) exitWith {}; -_wantedCheck = format ["SELECT wantedName FROM wanted WHERE wantedID='%1'",_uid]; -_wantedQuery = [_wantedCheck,2] call DB_fnc_asyncCall; -if (count _wantedQuery isEqualTo 0) exitWith {}; +private _wantedCheck = format ["selectWantedName:%1", _uid]; +private _wantedQuery = [_wantedCheck, 2] call DB_fnc_asyncCall; +if (_wantedQuery isEqualTo []) exitWith {}; if !(_name isEqualTo (_wantedQuery select 0)) then { - _query = format ["UPDATE wanted SET wantedName='%1' WHERE wantedID='%2'",_name,_uid]; - [_query,2] call DB_fnc_asyncCall; + private _query = format ["updateWantedName:%1:%2", _name, _uid]; + [_query, 2] call DB_fnc_asyncCall; }; diff --git a/life_server/Functions/WantedSystem/fn_wantedRemove.sqf b/life_server/Functions/WantedSystem/fn_wantedRemove.sqf old mode 100644 new mode 100755 index 0b1ffaacd..c5af59c5b --- a/life_server/Functions/WantedSystem/fn_wantedRemove.sqf +++ b/life_server/Functions/WantedSystem/fn_wantedRemove.sqf @@ -8,9 +8,12 @@ Description: Removes a person from the wanted list. */ -private _uid = param [0,"",[""]]; + +params [ + ["_uid", "", [""]] +]; if (_uid isEqualTo "") exitWith {}; //Bad data -private _query = format ["UPDATE wanted SET active = '0', wantedCrimes = '[]', wantedBounty = 0 WHERE wantedID='%1'",_uid]; -[_query,2] call DB_fnc_asyncCall; \ No newline at end of file +private _query = format ["deleteWanted:%1", _uid]; +[_query, 2] call DB_fnc_asyncCall; diff --git a/life_server/config.cpp b/life_server/config.cpp index 57adf021b..ab3414c5a 100644 --- a/life_server/config.cpp +++ b/life_server/config.cpp @@ -15,16 +15,11 @@ class CfgFunctions { class MySQL { file = "\life_server\Functions\MySQL"; - class numberSafe {}; - class mresArray {}; class queryRequest{}; class asyncCall{}; class insertRequest{}; class updateRequest{}; - class mresToArray {}; class insertVehicle {}; - class bool {}; - class mresString {}; class updatePartial {}; }; }; @@ -67,16 +62,15 @@ class CfgFunctions { class vehicleDelete {}; class spikeStrip {}; class transferOwnership {}; - class federalUpdate {}; class chopShopSell {}; class clientDisconnect {}; class entityRespawned {}; + class entityKilled {}; class cleanupRequest {}; class keyManagement {}; class vehicleUpdate {}; class recupkeyforHC {}; class handleBlastingCharge {}; - class terrainSort {}; }; class Housing { diff --git a/life_server/functions.sqf b/life_server/functions.sqf deleted file mode 100644 index 9892cb97b..000000000 --- a/life_server/functions.sqf +++ /dev/null @@ -1,319 +0,0 @@ -#include "script_macros.hpp" -/* - File: functions.sqf - Author: Bryan "Tonic" Boardwine - - Description: They are functions. -*/ - -publicVariable "TON_fnc_terrainSort"; - -TON_fnc_index = -compileFinal " - params [ - ""_item"", - [""_stack"",[],[[]]] - ]; - - _stack findIf {_item in _x}; -"; - -TON_fnc_player_query = -compileFinal " - private [""_ret""]; - _ret = _this select 0; - if (isNull _ret) exitWith {}; - if (isNil ""_ret"") exitWith {}; - - [life_atmbank,life_cash,owner player,player,profileNameSteam,getPlayerUID player,playerSide] remoteExecCall [""life_fnc_adminInfo"",_ret]; -"; -publicVariable "TON_fnc_player_query"; -publicVariable "TON_fnc_index"; - -TON_fnc_isNumber = -compileFinal " - params [ - ['_string','',['']] - ]; - if (_string isEqualTo '') exitWith {false}; - private _array = _string splitString ''; - private _return = true; - { - if !(_x in ['0','1','2','3','4','5','6','7','8','9']) exitWith { - _return = false; - }; - } forEach _array; - _return; -"; - -publicVariable "TON_fnc_isNumber"; - -TON_fnc_clientGangKick = -compileFinal " - private [""_unit"",""_group""]; - _unit = _this select 0; - _group = _this select 1; - if (isNil ""_unit"" || isNil ""_group"") exitWith {}; - if (player isEqualTo _unit && (group player) == _group) then { - life_my_gang = objNull; - [player] joinSilent (createGroup civilian); - hint localize ""STR_GNOTF_KickOutGang""; - }; -"; - -publicVariable "TON_fnc_clientGangKick"; - -TON_fnc_clientGetKey = -compileFinal " - private [""_vehicle"",""_unit"",""_giver""]; - _vehicle = _this select 0; - _unit = _this select 1; - _giver = _this select 2; - if (isNil ""_unit"" || isNil ""_giver"") exitWith {}; - if (player isEqualTo _unit && !(_vehicle in life_vehicles)) then { - _name = getText(configFile >> ""CfgVehicles"" >> (typeOf _vehicle) >> ""displayName""); - hint format [localize ""STR_NOTF_gaveKeysFrom"",_giver,_name]; - life_vehicles pushBack _vehicle; - [getPlayerUID player,playerSide,_vehicle,1] remoteExecCall [""TON_fnc_keyManagement"",2]; - }; -"; - -publicVariable "TON_fnc_clientGetKey"; - -TON_fnc_clientGangLeader = -compileFinal " - private [""_unit"",""_group""]; - _unit = _this select 0; - _group = _this select 1; - if (isNil ""_unit"" || isNil ""_group"") exitWith {}; - if (player isEqualTo _unit && (group player) == _group) then { - player setRank ""COLONEL""; - _group selectLeader _unit; - hint localize ""STR_GNOTF_GaveTransfer""; - }; -"; - -publicVariable "TON_fnc_clientGangLeader"; - -TON_fnc_clientGangLeft = -compileFinal " - private [""_unit"",""_group""]; - _unit = _this select 0; - _group = _this select 1; - if (isNil ""_unit"" || isNil ""_group"") exitWith {}; - if (player isEqualTo _unit && (group player) == _group) then { - life_my_gang = objNull; - [player] joinSilent (createGroup civilian); - hint localize ""STR_GNOTF_LeaveGang""; - }; -"; - -publicVariable "TON_fnc_clientGangLeft"; - -//Cell Phone Messaging -/* - -fnc_cell_textmsg - -fnc_cell_textcop - -fnc_cell_textadmin - -fnc_cell_adminmsg - -fnc_cell_adminmsgall -*/ - -//To EMS -TON_fnc_cell_emsrequest = -compileFinal " -private [""_msg"",""_to""]; - ctrlShow[3022,false]; - _msg = ctrlText 3003; - _length = count (toArray(_msg)); - if (_length > 400) exitWith {hint localize ""STR_CELLMSG_LIMITEXCEEDED"";ctrlShow[3022,true];}; - _to = ""EMS Units""; - if (_msg isEqualTo """") exitWith {hint localize ""STR_CELLMSG_EnterMSG"";ctrlShow[3022,true];}; - - [_msg,name player,5,mapGridPosition player,player] remoteExecCall [""TON_fnc_clientMessage"",independent]; - [] call life_fnc_cellphone; - hint format [localize ""STR_CELLMSG_ToEMS"",_to,_msg]; - ctrlShow[3022,true]; -"; -//To One Person -TON_fnc_cell_textmsg = -compileFinal " - private [""_msg"",""_to""]; - ctrlShow[3015,false]; - _msg = ctrlText 3003; - - _length = count (toArray(_msg)); - if (_length > 400) exitWith {hint localize ""STR_CELLMSG_LIMITEXCEEDED"";ctrlShow[3015,true];}; - if (lbCurSel 3004 isEqualTo -1) exitWith {hint localize ""STR_CELLMSG_SelectPerson""; ctrlShow[3015,true];}; - - _to = call compile format [""%1"",(lbData[3004,(lbCurSel 3004)])]; - if (isNull _to) exitWith {ctrlShow[3015,true];}; - if (isNil ""_to"") exitWith {ctrlShow[3015,true];}; - if (_msg isEqualTo """") exitWith {hint localize ""STR_CELLMSG_EnterMSG"";ctrlShow[3015,true];}; - - [_msg,name player,0] remoteExecCall [""TON_fnc_clientMessage"",_to]; - [] call life_fnc_cellphone; - hint format [localize ""STR_CELLMSG_ToPerson"",name _to,_msg]; - ctrlShow[3015,true]; -"; -//To All Cops -TON_fnc_cell_textcop = -compileFinal " - private [""_msg"",""_to""]; - ctrlShow[3016,false]; - _msg = ctrlText 3003; - _to = ""The Police""; - - if (_msg isEqualTo """") exitWith {hint localize ""STR_CELLMSG_EnterMSG"";ctrlShow[3016,true];}; - _length = count (toArray(_msg)); - if (_length > 400) exitWith {hint localize ""STR_CELLMSG_LIMITEXCEEDED"";ctrlShow[3016,true];}; - - [_msg,name player,1,mapGridPosition player,player] remoteExecCall [""TON_fnc_clientMessage"",-2]; - [] call life_fnc_cellphone; - hint format [localize ""STR_CELLMSG_ToPerson"",_to,_msg]; - ctrlShow[3016,true]; -"; -//To All Admins -TON_fnc_cell_textadmin = -compileFinal " - private [""_msg"",""_to"",""_from""]; - ctrlShow[3017,false]; - _msg = ctrlText 3003; - _to = ""The Admins""; - - if (_msg isEqualTo """") exitWith {hint localize ""STR_CELLMSG_EnterMSG"";ctrlShow[3017,true];}; - _length = count (toArray(_msg)); - if (_length > 400) exitWith {hint localize ""STR_CELLMSG_LIMITEXCEEDED"";ctrlShow[3017,true];}; - - [_msg,name player,2,mapGridPosition player,player] remoteExecCall [""TON_fnc_clientMessage"",-2]; - [] call life_fnc_cellphone; - hint format [localize ""STR_CELLMSG_ToPerson"",_to,_msg]; - ctrlShow[3017,true]; -"; -//Admin To One Person -TON_fnc_cell_adminmsg = -compileFinal " - if (isServer) exitWith {}; - if ((call life_adminlevel) < 1) exitWith {hint localize ""STR_CELLMSG_NoAdmin"";}; - private [""_msg"",""_to""]; - ctrlShow[3020,false]; - _msg = ctrlText 3003; - _to = call compile format [""%1"",(lbData[3004,(lbCurSel 3004)])]; - if (isNull _to) exitWith {ctrlShow[3020,true];}; - if (isNil ""_to"") exitWith {ctrlShow[3020,true];}; - if (_msg isEqualTo """") exitWith {hint localize ""STR_CELLMSG_EnterMSG"";ctrlShow[3020,true];}; - - [_msg,name player,3] remoteExecCall [""TON_fnc_clientMessage"",_to]; - [] call life_fnc_cellphone; - hint format [localize ""STR_CELLMSG_AdminToPerson"",name _to,_msg]; - ctrlShow[3020,true]; -"; - -TON_fnc_cell_adminmsgall = -compileFinal " - if (isServer) exitWith {}; - if ((call life_adminlevel) < 1) exitWith {hint localize ""STR_CELLMSG_NoAdmin"";}; - private [""_msg"",""_from""]; - ctrlShow[3021,false]; - _msg = ctrlText 3003; - if (_msg isEqualTo """") exitWith {hint localize ""STR_CELLMSG_EnterMSG"";ctrlShow[3021,true];}; - - [_msg,name player,4] remoteExecCall [""TON_fnc_clientMessage"",-2]; - [] call life_fnc_cellphone; - hint format [localize ""STR_CELLMSG_AdminToAll"",_msg]; - ctrlShow[3021,true]; -"; - -publicVariable "TON_fnc_cell_textmsg"; -publicVariable "TON_fnc_cell_textcop"; -publicVariable "TON_fnc_cell_textadmin"; -publicVariable "TON_fnc_cell_adminmsg"; -publicVariable "TON_fnc_cell_adminmsgall"; -publicVariable "TON_fnc_cell_emsrequest"; -//Client Message -/* - 0 = private message - 1 = police message - 2 = message to admin - 3 = message from admin - 4 = admin message to all -*/ -TON_fnc_clientMessage = -compileFinal " - if (isServer) exitWith {}; - private [""_msg"",""_from"", ""_type""]; - _msg = _this select 0; - _from = _this select 1; - _type = _this select 2; - if (_from isEqualTo """") exitWith {}; - switch (_type) do { - case 0 : { - private [""_message""]; - _message = format ["">>>MESSAGE FROM %1: %2"",_from,_msg]; - hint parseText format [""New Message

To: You
From: %1

Message:
%2"",_from,_msg]; - - [""TextMessage"",[format [""You Received A New Private Message From %1"",_from]]] call bis_fnc_showNotification; - systemChat _message; - }; - - case 1 : { - if (side player != west) exitWith {}; - private [""_message"",""_loc"",""_unit""]; - _loc = _this select 3; - _unit = _this select 4; - _message = format [""--- 911 DISPATCH FROM %1: %2"",_from,_msg]; - if (isNil ""_loc"") then {_loc = ""Unknown"";}; - hint parseText format [""New Dispatch

To: All Officers
From: %1
Coords: %2

Message:
%3"",_from,_loc,_msg]; - - [""PoliceDispatch"",[format [""A New Police Report From: %1"",_from]]] call bis_fnc_showNotification; - systemChat _message; - }; - - case 2 : { - if ((call life_adminlevel) < 1) exitWith {}; - private [""_message"",""_loc"",""_unit""]; - _loc = _this select 3; - _unit = _this select 4; - _message = format [""!!! ADMIN REQUEST FROM %1: %2"",_from,_msg]; - if (isNil ""_loc"") then {_loc = ""Unknown"";}; - hint parseText format [""Admin Request

To: Admins
From: %1
Coords: %2

Message:
%3"",_from,_loc,_msg]; - - [""AdminDispatch"",[format [""%1 Has Requested An Admin!"",_from]]] call bis_fnc_showNotification; - systemChat _message; - }; - - case 3 : { - private [""_message""]; - _message = format [""!!! ADMIN MESSAGE: %1"",_msg]; - _admin = format [""Sent by admin: %1"", _from]; - hint parseText format [""Admin Message

To: You
From: An Admin

Message:
%1"",_msg]; - - [""AdminMessage"",[""You Have Received A Message From An Admin!""]] call bis_fnc_showNotification; - systemChat _message; - if ((call life_adminlevel) > 0) then {systemChat _admin;}; - }; - - case 4 : { - private [""_message"",""_admin""]; - _message = format [""!!!ADMIN MESSAGE: %1"",_msg]; - _admin = format [""Sent by admin: %1"", _from]; - hint parseText format [""Admin Message

To: All Players
From: The Admins

Message:
%1"",_msg]; - - [""AdminMessage"",[""You Have Received A Message From An Admin!""]] call bis_fnc_showNotification; - systemChat _message; - if ((call life_adminlevel) > 0) then {systemChat _admin;}; - }; - - case 5: { - if (side player != independent) exitWith {}; - private [""_message"",""_loc"",""_unit""]; - _loc = _this select 3; - _unit = _this select 4; - _message = format [""!!! EMS REQUEST: %1"",_msg]; - hint parseText format [""EMS Request

To: You
From: %1
Coords: %2

Message:
%3"",_from,_loc,_msg]; - - [""TextMessage"",[format [""EMS Request from %1"",_from]]] call bis_fnc_showNotification; - }; - }; -"; -publicVariable "TON_fnc_clientMessage"; diff --git a/life_server/init.sqf b/life_server/init.sqf index 73b571e22..7a2a63262 100644 --- a/life_server/init.sqf +++ b/life_server/init.sqf @@ -17,7 +17,6 @@ _extDBNotLoaded = ""; serv_sv_use = []; publicVariable "life_server_isReady"; life_save_civilian_position = if (LIFE_SETTINGS(getNumber,"save_civilian_position") isEqualTo 0) then {false} else {true}; -fn_whoDoneIt = compile preprocessFileLineNumbers "\life_server\Functions\Systems\fn_whoDoneIt.sqf"; /* Prepare the headless client. @@ -43,7 +42,7 @@ if (isNil {uiNamespace getVariable "life_sql_id"}) then { try { _result = EXTDB format ["9:ADD_DATABASE:%1",EXTDB_SETTING(getText,"DatabaseName")]; if (!(_result isEqualTo "[1]")) then {throw "extDB3: Error with Database Connection"}; - _result = EXTDB format ["9:ADD_DATABASE_PROTOCOL:%2:SQL:%1:TEXT2",FETCH_CONST(life_sql_id),EXTDB_SETTING(getText,"DatabaseName")]; + _result = EXTDB format ["9:ADD_DATABASE_PROTOCOL:%2:SQL_CUSTOM:%1:AL.ini",FETCH_CONST(life_sql_id),EXTDB_SETTING(getText,"DatabaseName")]; if (!(_result isEqualTo "[1]")) then {throw "extDB3: Error with Database Connection"}; } catch { diag_log _exception; @@ -67,10 +66,10 @@ life_server_extDB_notLoaded = false; publicVariable "life_server_extDB_notLoaded"; /* Run stored procedures for SQL side cleanup */ -["CALL resetLifeVehicles",1] call DB_fnc_asyncCall; -["CALL deleteDeadVehicles",1] call DB_fnc_asyncCall; -["CALL deleteOldHouses",1] call DB_fnc_asyncCall; -["CALL deleteOldGangs",1] call DB_fnc_asyncCall; +["resetLifeVehicles", 1] call DB_fnc_asyncCall; +["deleteDeadVehicles", 1] call DB_fnc_asyncCall; +["deleteOldHouses", 1] call DB_fnc_asyncCall; +["deleteOldGangs", 1] call DB_fnc_asyncCall; _timeStamp = diag_tickTime; diag_log "----------------------------------------------------------------------------------------------------"; @@ -80,8 +79,7 @@ diag_log "---------------------------------------------------------------------- if (LIFE_SETTINGS(getNumber,"save_civilian_position_restart") isEqualTo 1) then { [] spawn { - _query = "UPDATE players SET civ_alive = '0' WHERE civ_alive = '1'"; - [_query,1] call DB_fnc_asyncCall; + ["updateCivAlive", 1] call DB_fnc_asyncCall; }; }; @@ -140,11 +138,9 @@ life_radio_indep = radioChannelCreate [[0, 0.95, 1, 0.8], "Side Channel", "%UNIT /* Set the amount of gold in the federal reserve at mission start */ fed_bank setVariable ["safe",count playableUnits,true]; -[] spawn TON_fnc_federalUpdate; /* Event handler for disconnecting players */ addMissionEventHandler ["HandleDisconnect",{_this call TON_fnc_clientDisconnect; false;}]; -[] call compile preprocessFileLineNumbers "\life_server\functions.sqf"; /* Set OwnerID players for Headless Client */ TON_fnc_requestClientID = @@ -160,17 +156,6 @@ TON_fnc_requestClientID = /* Miscellaneous mission-required stuff */ life_wanted_list = []; -cleanupFSM = [] execFSM "\life_server\FSM\cleanup.fsm"; - -[] spawn { - for "_i" from 0 to 1 step 0 do { - uiSleep (30 * 60); - { - _x setVariable ["sellers",[],true]; - } forEach [Dealer_1,Dealer_2,Dealer_3]; - }; -}; - [] spawn TON_fnc_initHouses; cleanup = [] spawn TON_fnc_cleanup; @@ -183,10 +168,10 @@ publicVariable "TON_fnc_playtime_values_request"; /* Setup the federal reserve building(s) */ -private _vaultHouse = [[["Altis", "Land_Research_house_V1_F"], ["Tanoa", "Land_Medevac_house_V1_F"]]] call TON_fnc_terrainSort; +private _vaultHouse = [[["Altis", "Land_Research_house_V1_F"], ["Tanoa", "Land_Medevac_house_V1_F"]]] call life_util_fnc_terrainSort; private _altisArray = [16019.5,16952.9,0]; private _tanoaArray = [11074.2,11501.5,0.00137329]; -private _pos = [[["Altis", _altisArray], ["Tanoa", _tanoaArray]]] call TON_fnc_terrainSort; +private _pos = [[["Altis", _altisArray], ["Tanoa", _tanoaArray]]] call life_util_fnc_terrainSort; _dome = nearestObject [_pos,"Land_Dome_Big_F"]; _rsb = nearestObject [_pos,_vaultHouse]; @@ -207,6 +192,7 @@ aiSpawn = ["hunting_zone",30] spawn TON_fnc_huntingZone; server_corpses = []; addMissionEventHandler ["EntityRespawned", {_this call TON_fnc_entityRespawned}]; +addMissionEventHandler ["EntityKilled", {_this call TON_fnc_entityKilled}]; diag_log "----------------------------------------------------------------------------------------------------"; diag_log format [" End of Altis Life Server Init :: Total Execution Time %1 seconds ",(diag_tickTime) - _timeStamp]; diff --git a/life_server/initHC.sqf b/life_server/initHC.sqf index d8ae68700..733fd897c 100644 --- a/life_server/initHC.sqf +++ b/life_server/initHC.sqf @@ -15,7 +15,6 @@ HC_UID = nil; HC_Life = owner hc_1; publicVariable "HC_Life"; HC_Life publicVariableClient "serv_sv_use"; - cleanupFSM setFSMVariable ["stopfsm",true]; terminate cleanup; terminate aiSpawn; [true] call TON_fnc_transferOwnership; @@ -24,7 +23,7 @@ HC_UID = nil; }; }; -HC_DC = ["HC_Disconnected","onPlayerDisconnected", +HC_DC = addMissionEventHandler ["PlayerDisconnected", { if (!isNil "HC_UID" && {_uid == HC_UID}) then { life_HC_isActive = false; @@ -32,12 +31,10 @@ HC_DC = ["HC_Disconnected","onPlayerDisconnected", HC_Life = false; publicVariable "HC_Life"; cleanup = [] spawn TON_fnc_cleanup; - cleanupFSM = [] execFSM "\life_server\FSM\cleanup.fsm"; [false] call TON_fnc_transferOwnership; aiSpawn = ["hunting_zone",30] spawn TON_fnc_huntingZone; diag_log "Headless client disconnected! Broadcasted the vars!"; diag_log "Ready for receiving queries on the server machine."; }; } -] call BIS_fnc_addStackedEventHandler; - +]; diff --git a/tools/LICENSE b/tools/LICENSE new file mode 100644 index 000000000..9ee63c844 --- /dev/null +++ b/tools/LICENSE @@ -0,0 +1,347 @@ +All work in this folder is licensed under the following license: + + +============================================================================ + Full GNU General Public License Text +============================================================================ + + +GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {description} + Copyright (C) {year} {fullname} + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + {signature of Ty Coon}, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/tools/config_style_checker.py b/tools/config_style_checker.py new file mode 100644 index 000000000..1ffae07ae --- /dev/null +++ b/tools/config_style_checker.py @@ -0,0 +1,161 @@ +#!/usr/bin/env python3 + +#credits to ACE3: https://github.com/acemod/ACE3/blob/master/tools/sqf_validator.py + +import fnmatch +import os +import re +import ntpath +import sys +import argparse + +def check_config_style(filepath): + bad_count_file = 0 + def pushClosing(t): + closingStack.append(closing.expr) + closing << Literal( closingFor[t[0]] ) + + def popClosing(): + closing << closingStack.pop() + + with open(filepath, 'r', encoding='utf-8', errors='ignore') as file: + content = file.read() + + # Store all brackets we find in this file, so we can validate everything on the end + brackets_list = [] + + # To check if we are in a comment block + isInCommentBlock = False + checkIfInComment = False + # Used in case we are in a line comment (//) + ignoreTillEndOfLine = False + # Used in case we are in a comment block (/* */). This is true if we detect a * inside a comment block. + # If the next character is a /, it means we end our comment block. + checkIfNextIsClosingBlock = False + + # We ignore everything inside a string + isInString = False + # Used to store the starting type of a string, so we can match that to the end of a string + inStringType = ''; + + lastIsCurlyBrace = False + checkForSemiColumn = False + + # Extra information so we know what line we find errors at + lineNumber = 1 + + indexOfCharacter = 0 + # Parse all characters in the content of this file to search for potential errors + for c in content: + if (lastIsCurlyBrace): + lastIsCurlyBrace = False + if c == '\n': # Keeping track of our line numbers + lineNumber += 1 # so we can print accurate line number information when we detect a possible error + if (isInString): # while we are in a string, we can ignore everything else, except the end of the string + if (c == inStringType): + isInString = False + # if we are not in a comment block, we will check if we are at the start of one or count the () {} and [] + elif (isInCommentBlock == False): + + # This means we have encountered a /, so we are now checking if this is an inline comment or a comment block + if (checkIfInComment): + checkIfInComment = False + if c == '*': # if the next character after / is a *, we are at the start of a comment block + isInCommentBlock = True + elif (c == '/'): # Otherwise, will check if we are in an line comment + ignoreTillEndOfLine = True # and an line comment is a / followed by another / (//) We won't care about anything that comes after it + + if (isInCommentBlock == False): + if (ignoreTillEndOfLine): # we are in a line comment, just continue going through the characters until we find an end of line + if (c == '\n'): + ignoreTillEndOfLine = False + else: # validate brackets + if (c == '"' or c == "'"): + isInString = True + inStringType = c + elif (c == '/'): + checkIfInComment = True + elif (c == '('): + brackets_list.append('(') + elif (c == ')'): + if (len(brackets_list) > 0 and brackets_list[-1] in ['{', '[']): + print("ERROR: Possible missing round bracket ')' detected at {0} Line number: {1}".format(filepath,lineNumber)) + bad_count_file += 1 + brackets_list.append(')') + elif (c == '['): + brackets_list.append('[') + elif (c == ']'): + if (len(brackets_list) > 0 and brackets_list[-1] in ['{', '(']): + print("ERROR: Possible missing square bracket ']' detected at {0} Line number: {1}".format(filepath,lineNumber)) + bad_count_file += 1 + brackets_list.append(']') + elif (c == '{'): + brackets_list.append('{') + elif (c == '}'): + lastIsCurlyBrace = True + if (len(brackets_list) > 0 and brackets_list[-1] in ['(', '[']): + print("ERROR: Possible missing curly brace '}}' detected at {0} Line number: {1}".format(filepath,lineNumber)) + bad_count_file += 1 + brackets_list.append('}') + elif (c== '\t'): + print("ERROR: Tab detected at {0} Line number: {1}".format(filepath,lineNumber)) + bad_count_file += 1 + + else: # Look for the end of our comment block + if (c == '*'): + checkIfNextIsClosingBlock = True; + elif (checkIfNextIsClosingBlock): + if (c == '/'): + isInCommentBlock = False + elif (c != '*'): + checkIfNextIsClosingBlock = False + indexOfCharacter += 1 + + if brackets_list.count('[') != brackets_list.count(']'): + print("ERROR: A possible missing square bracket [ or ] in file {0} [ = {1} ] = {2}".format(filepath,brackets_list.count('['),brackets_list.count(']'))) + bad_count_file += 1 + if brackets_list.count('(') != brackets_list.count(')'): + print("ERROR: A possible missing round bracket ( or ) in file {0} ( = {1} ) = {2}".format(filepath,brackets_list.count('('),brackets_list.count(')'))) + bad_count_file += 1 + if brackets_list.count('{') != brackets_list.count('}'): + print("ERROR: A possible missing curly brace {{ or }} in file {0} {{ = {1} }} = {2}".format(filepath,brackets_list.count('{'),brackets_list.count('}'))) + bad_count_file += 1 + return bad_count_file + +def main(): + + print("Validating Config Style") + + sqf_list = [] + bad_count = 0 + + parser = argparse.ArgumentParser() + parser.add_argument('-m','--module', help='only search specified module addon folder', required=False, default="") + args = parser.parse_args() + + # Allow running from root directory as well as from inside the tools directory + rootDir = "../Framework" + if (os.path.exists("Framework")): + rootDir = "Framework" + + for root, dirnames, filenames in os.walk(rootDir + '/' + args.module): + if ".git" in root: + continue + for filename in fnmatch.filter(filenames, '*.cpp'): + sqf_list.append(os.path.join(root, filename)) + for filename in fnmatch.filter(filenames, '*.hpp'): + sqf_list.append(os.path.join(root, filename)) + + for filename in sqf_list: + bad_count = bad_count + check_config_style(filename) + + print("------\nChecked {0} files\nErrors detected: {1}".format(len(sqf_list), bad_count)) + if (bad_count == 0): + print("Config validation PASSED") + else: + print("Config validation FAILED") + + return bad_count + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tools/sqf_validator.py b/tools/sqf_validator.py new file mode 100644 index 000000000..6676df19b --- /dev/null +++ b/tools/sqf_validator.py @@ -0,0 +1,194 @@ +#!/usr/bin/env python3 + +#credits to ACE3: https://github.com/acemod/ACE3/blob/master/tools/sqf_validator.py + +import fnmatch +import os +import re +import ntpath +import sys +import argparse + +def validKeyWordAfterCode(content, index): + keyWords = ["for", "do", "count", "each", "forEach", "else", "and", "not", "isEqualTo", "in", "call", "spawn", "execVM", "catch", "param", "select", "apply", "findIf", "remoteExec"]; + for word in keyWords: + try: + subWord = content.index(word, index, index+len(word)) + return True; + except: + pass + return False + +def check_sqf_syntax(filepath): + bad_count_file = 0 + def pushClosing(t): + closingStack.append(closing.expr) + closing << Literal( closingFor[t[0]] ) + + def popClosing(): + closing << closingStack.pop() + + with open(filepath, 'r', encoding='utf-8', errors='ignore') as file: + content = file.read() + + # Store all brackets we find in this file, so we can validate everything on the end + brackets_list = [] + + # To check if we are in a comment block + isInCommentBlock = False + checkIfInComment = False + # Used in case we are in a line comment (//) + ignoreTillEndOfLine = False + # Used in case we are in a comment block (/* */). This is true if we detect a * inside a comment block. + # If the next character is a /, it means we end our comment block. + checkIfNextIsClosingBlock = False + + # We ignore everything inside a string + isInString = False + # Used to store the starting type of a string, so we can match that to the end of a string + inStringType = ''; + + lastIsCurlyBrace = False + checkForSemicolon = False + onlyWhitespace = True + + # Extra information so we know what line we find errors at + lineNumber = 1 + + indexOfCharacter = 0 + # Parse all characters in the content of this file to search for potential errors + for c in content: + if (lastIsCurlyBrace): + lastIsCurlyBrace = False + # Test generates false positives with binary commands that take CODE as 2nd arg (e.g. findIf) + checkForSemicolon = not re.search('findIf', content, re.IGNORECASE) + + if c == '\n': # Keeping track of our line numbers + onlyWhitespace = True # reset so we can see if # is for a preprocessor command + lineNumber += 1 # so we can print accurate line number information when we detect a possible error + if (isInString): # while we are in a string, we can ignore everything else, except the end of the string + if (c == inStringType): + isInString = False + # if we are not in a comment block, we will check if we are at the start of one or count the () {} and [] + elif (isInCommentBlock == False): + + # This means we have encountered a /, so we are now checking if this is an inline comment or a comment block + if (checkIfInComment): + checkIfInComment = False + if c == '*': # if the next character after / is a *, we are at the start of a comment block + isInCommentBlock = True + elif (c == '/'): # Otherwise, will check if we are in an line comment + ignoreTillEndOfLine = True # and an line comment is a / followed by another / (//) We won't care about anything that comes after it + + if (isInCommentBlock == False): + if (ignoreTillEndOfLine): # we are in a line comment, just continue going through the characters until we find an end of line + if (c == '\n'): + ignoreTillEndOfLine = False + else: # validate brackets + if (c == '"' or c == "'"): + isInString = True + inStringType = c + elif (c == '#' and onlyWhitespace): + ignoreTillEndOfLine = True + elif (c == '/'): + checkIfInComment = True + elif (c == '('): + brackets_list.append('(') + elif (c == ')'): + if (brackets_list[-1] in ['{', '[']): + print("ERROR: Possible missing round bracket ')' detected at {0} Line number: {1}".format(filepath,lineNumber)) + bad_count_file += 1 + brackets_list.append(')') + elif (c == '['): + brackets_list.append('[') + elif (c == ']'): + if (brackets_list[-1] in ['{', '(']): + print("ERROR: Possible missing square bracket ']' detected at {0} Line number: {1}".format(filepath,lineNumber)) + bad_count_file += 1 + brackets_list.append(']') + elif (c == '{'): + brackets_list.append('{') + elif (c == '}'): + lastIsCurlyBrace = True + if (brackets_list[-1] in ['(', '[']): + print("ERROR: Possible missing curly brace '}}' detected at {0} Line number: {1}".format(filepath,lineNumber)) + bad_count_file += 1 + brackets_list.append('}') + elif (c== '\t'): + print("ERROR: Tab detected at {0} Line number: {1}".format(filepath,lineNumber)) + bad_count_file += 1 + + if (c not in [' ', '\t', '\n']): + onlyWhitespace = False + + if (checkForSemicolon): + if (c not in [' ', '\t', '\n', '/']): # keep reading until no white space or comments + checkForSemicolon = False + if (c not in [']', ')', '}', ';', ',', '&', '!', '|', '='] and not validKeyWordAfterCode(content, indexOfCharacter)): # , 'f', 'd', 'c', 'e', 'a', 'n', 'i']): + print("ERROR: Possible missing semicolon ';' detected at {0} Line number: {1}".format(filepath,lineNumber)) + bad_count_file += 1 + + else: # Look for the end of our comment block + if (c == '*'): + checkIfNextIsClosingBlock = True; + elif (checkIfNextIsClosingBlock): + if (c == '/'): + isInCommentBlock = False + elif (c != '*'): + checkIfNextIsClosingBlock = False + indexOfCharacter += 1 + + if brackets_list.count('[') != brackets_list.count(']'): + print("ERROR: A possible missing square bracket [ or ] in file {0} [ = {1} ] = {2}".format(filepath,brackets_list.count('['),brackets_list.count(']'))) + bad_count_file += 1 + if brackets_list.count('(') != brackets_list.count(')'): + print("ERROR: A possible missing round bracket ( or ) in file {0} ( = {1} ) = {2}".format(filepath,brackets_list.count('('),brackets_list.count(')'))) + bad_count_file += 1 + if brackets_list.count('{') != brackets_list.count('}'): + print("ERROR: A possible missing curly brace {{ or }} in file {0} {{ = {1} }} = {2}".format(filepath,brackets_list.count('{'),brackets_list.count('}'))) + bad_count_file += 1 + pattern = re.compile('\s*(/\*[\s\S]+?\*/)\s*#include') + if pattern.match(content): + print("ERROR: A found #include after block comment in file {0}".format(filepath)) + bad_count_file += 1 + + + + return bad_count_file + +def main(): + + print("Validating SQF") + + sqf_list = [] + bad_count = 0 + + parser = argparse.ArgumentParser() + parser.add_argument('-m','--module', help='only search specified module addon folder', required=False, default="") + args = parser.parse_args() + + # Allow running from root directory as well as from inside the tools directory + rootDir = "../Framework" + if (os.path.exists("Framework")): + rootDir = "Framework" + + for root, dirnames, filenames in os.walk(rootDir + '/' + args.module): + if ".git" in root: + continue + for filename in fnmatch.filter(filenames, '*.sqf'): + sqf_list.append(os.path.join(root, filename)) + + for filename in sqf_list: + bad_count = bad_count + check_sqf_syntax(filename) + + + print("------\nChecked {0} files\nErrors detected: {1}".format(len(sqf_list), bad_count)) + if (bad_count == 0): + print("SQF validation PASSED") + else: + print("SQF validation FAILED") + + return bad_count + +if __name__ == "__main__": + sys.exit(main())