Untitled
unknown
lua
a month ago
50 kB
2
Indexable
Never
-- Made by GCodeman -- --configs startingcash = 20000 bailoutcost = 15000 --Not used unless bailout feature turned on hospitalbill = 500 recoverycostpercent = 0.80 maxloan = 15000 maxdebt = 15000 debtcap = 15000 fuelcostperliter = 500 debtperday = 0.5 incometax = 0 --Can be positive or negative islandclaiming = true --Set to false to disable claiming of islands and teleport/spawn/bench permissions negativetaxdebt = true --Set to false to disable negative tax adding debt. If player cannot pay, it'll just set them to $0 bank --[[ g_savedata = {} playertable {{player name, bank, debt, lastvehicle, lastdebtdate, lasttaxdate}, {player name, bank, debt, lastvehicle, lastdebtdate, lasttaxdate}} vehicletable {{vehicle id, owner name, cost}, {vehicle id, owner name, cost}} islandtable {island tile name, owner, {co-owners}, {allowed to teleport}, {allowed to spawn vehicles}, {allowed to bench}, {spawncoords}} datatable {incometax} append them together when saving to g_savedata ]]-- function saveGame() saveTables() server.save(("Career")) end function saveTables() g_savedata = {playertable, vehicletable, islandtable, datatable} end function ownsVehicle(target_id, target_vehicle) matches = 0 for k, v in pairs(vehicletable) do if (v[1] == target_vehicle) and (v[2] == server.getPlayerName(target_id)) then matches = 1 end end return matches end function isPlayerOnline(target_name) playeronline = 0 for k, v in pairs(server.getPlayers()) do if (v["name"] == target_name) then playeronline = 1 end end return playeronline end function getPlayerID(target_name) playerid = -1 for k, v in pairs(server.getPlayers()) do if (v["name"] == target_name) then playerid = v["id"] end end return playerid end function nearestVehicle(target_id) local playerloc = server.getPlayerPos(target_id) local nearestveh = -1 local nearestvehdistance = 1000 for k, v in pairs(vehicletable) do local dist, is_success = matrix.distance(playerloc, (server.getVehiclePos(v[1]))) if dist < nearestvehdistance then nearestvehdistance = dist nearestveh = v[1] end end return nearestveh, nearestvehdistance end function isInPurchasedArea(target_id) local playerloc = server.getPlayerPos(target_id) local x, y, z = matrix.position(playerloc) return server.getTilePurchased(matrix.translation(x,y,z)) end function isInMainland(target_id) local playerloc = server.getPlayerPos(target_id) local x, y, z = matrix.position(playerloc) if (z < 0 and z > -14000) then return true else return false end end function isHomeIsland(island_tile_name) local hometile = server.getStartTile() local hometilename = hometile["name"] if (island_tile_name == hometilename) then return 1 else return 0 end end function getIslandOwner(island_tile_name) for k, v in pairs(islandtable) do if v[1] == island_tile_name then return v[2] end end return "Unowned" end function getIslandKeyFromID(island_tile_name) for k, v in pairs(islandtable) do if v[1] == island_tile_name then return k end end return -1 --if not found end function getIslandCoOwners(island_tile_name) for k, v in pairs(islandtable) do if v[1] == island_tile_name then return v[3] end end return {} --if not found end function getIslandTeleportAccess(island_tile_name) for k, v in pairs(islandtable) do if v[1] == island_tile_name then return v[4] end end return {} --if not found end function getIslandSpawnAccess(island_tile_name) for k, v in pairs(islandtable) do if v[1] == island_tile_name then return v[5] end end return {} --if not found end function getIslandBenchAccess(island_tile_name) for k, v in pairs(islandtable) do if v[1] == island_tile_name then return v[6] end end return {} --if not found end function isCoOwner(player_name, island_tile_name) local coowners = getIslandCoOwners(island_tile_name) for k, v in pairs(coowners) do if v == player_name then return 1 end end return 0 end function hasTeleportAccess(player_name, island_tile_name) if isHomeIsland(island_tile_name) == 1 then return 1 end local access = getIslandTeleportAccess(island_tile_name) for k, v in pairs(access) do if v == player_name then return 1 end end return 0 end function hasSpawnAccess(player_name, island_tile_name) if isHomeIsland(island_tile_name) == 1 then return 1 end local access = getIslandSpawnAccess(island_tile_name) for k, v in pairs(access) do if v == player_name then return 1 end end return 0 end function hasBenchAccess(player_name, island_tile_name) if isHomeIsland(island_tile_name) == 1 then return 1 end local access = getIslandBenchAccess(island_tile_name) for k, v in pairs(access) do if v == player_name then return 1 end end return 0 end function tableToFormattedString(table) local string = "" for k, v in pairs(table) do string = string .. v .. "\n" end return string end function getBank(target_id) for k, v in pairs(playertable) do if (v[1] == server.getPlayerName(target_id)) then return playertable[k][2] --Returns bank amount end end end function getDebt(target_id) for k, v in pairs(playertable) do if (v[1] == server.getPlayerName(target_id)) then return playertable[k][3] --Returns debt amount end end end function teleportHome(target_id) local hometile = server.getStartTile() local x = hometile["x"] local y = hometile["y"] local z = hometile["z"] local pos = matrix.translation(x,y,z) server.setPlayerPos(target_id, pos) end function accrueDebt() for k, v in pairs(playertable) do if (v[3] > 0) and (v[5] < server.getDateValue()) then if (isPlayerOnline(v[1]) == 1) then local currentdebt = v[3] local debtadded = math.ceil(currentdebt * debtperday) local newdebt = math.ceil(currentdebt + debtadded) if (newdebt > debtcap) then newdebt = debtcap end playertable[k][3] = newdebt playertable[k][5] = server.getDateValue() server.notify(getPlayerID(v[1]), "Debt Accrued", "Debt: $" .. currentdebt .. "\n(" .. debtperday * 100 .. "%) = $" .. debtadded .. "\nNew Debt: $" .. newdebt, 8) end end end end function incomeTax() for k, v in pairs(playertable) do if (v[6] < server.getDateValue()) then if (isPlayerOnline(v[1]) == 1) then local amount = datatable[1] playertable[k][6] = server.getDateValue() if (amount == 0) then return end local target_id = getPlayerID(v[1]) addBank(target_id, amount) if (amount > 0) then server.notify(target_id, "Tax Return", "$" .. amount .. " has been added to your account", 8) else server.notify(target_id, "Taxes Due", "$" .. amount .. " has been deducted from your account", 8) if (getBank(target_id) < 0) then local deficit = getBank(target_id) setBank(target_id, 0) if (negativetaxdebt) then addDebt(target_id, deficit * -1) if (getDebt(target_id) > debtcap) then setDebt(target_id, debtcap) end end end end end end end end function displayUI() if (playertable ~= nil) then for k, v in pairs(playertable) do if (isPlayerOnline(v[1]) == 1) then local target_id = getPlayerID(v[1]) server.setPopupScreen(target_id, 47, "Bank", true, "Bank:\n$" .. string.format('%.0f', getBank(target_id)), 0.885, 0.75) if (getDebt(target_id) > 0) then server.setPopupScreen(target_id, 48, "Debt", true, "Debt:\n$" .. string.format('%.0f', getDebt(target_id)), 0.885, 0.62) server.setPopupScreen(target_id, 49, "Shared Bank", true, "Shared Bank:\n$" .. getSharedBank(), 0.885, 0.49) else server.setPopupScreen(target_id, 48, "Debt", false, "", 0.885, 0.62) server.setPopupScreen(target_id, 49, "Shared Bank", true, "Shared Bank:\n$" .. getSharedBank(), 0.885, 0.62) end end end end end function searchTable(table, searchedvalue) --returns key or -1 if not found for k, v in pairs(table) do if v == searchedvalue then return k end end return -1 end function getVehicleCost(target_vehicle) for k, v in pairs(vehicletable) do if (v[1] == target_vehicle) then return vehicletable[k][3] --Returns vehicle cost end end end function deleteVehicleFromTable(target_vehicle) for k, v in pairs(vehicletable) do if (v[1] == target_vehicle) then vehicletable[k] = nil --Removes from array end end end function getLastVehicle(target_id) for k, v in pairs(playertable) do if (v[1] == server.getPlayerName(target_id)) then return playertable[k][4] --Returns last vehicle they were in end end end function setLastVehicle(target_id, target_vehicle) for k, v in pairs(playertable) do if (v[1] == server.getPlayerName(target_id)) then playertable[k][4] = target_vehicle end end end function clearVehicles(target_id) for k, v in pairs(vehicletable) do if (v[2] == server.getPlayerName(target_id)) then server.despawnVehicle(v[1], true) end end end function getSharedBank() local sharedbank = server.getCurrency() - 1000000000 if sharedbank < 0 then return 0 else return sharedbank end end function addSharedBank(amount) -- do not subtract using this function if server.getCurrency() - 1000000000 < 0 then server.setCurrency(1000000000 + amount, server.getResearchPoints()) else server.setCurrency(server.getCurrency() + amount, server.getResearchPoints()) end end function addBank(target_id, amount) for k, v in pairs(playertable) do if (v[1] == server.getPlayerName(target_id)) then playertable[k][2] = playertable[k][2] + amount end end end function setBank(target_id, amount) for k, v in pairs(playertable) do if (v[1] == server.getPlayerName(target_id)) then playertable[k][2] = amount end end end --Used for loans and fines function addDebt(target_id, amount) for k, v in pairs(playertable) do if (v[1] == server.getPlayerName(target_id)) then if playertable[k][3] == 0 then playertable[k][5] = server.getDateValue() --Makes it so you dont get interest immediately end playertable[k][3] = playertable[k][3] + amount end end end --Used for loans and fines function setDebt(target_id, amount) for k, v in pairs(playertable) do if (v[1] == server.getPlayerName(target_id)) then if playertable[k][3] == 0 then playertable[k][5] = server.getDateValue() --Makes it so you dont get interest immediately end playertable[k][3] = amount end end end function InitializePlayer(target_player) playerfound = false for k, v in pairs(playertable) do if (v[1] == server.getPlayerName(target_player)) then playerfound = true end end if (playerfound == false) then table.insert (playertable, {server.getPlayerName(target_player), startingcash, 0, -1, -1, -1}) server.notify(target_player, "Welcome " .. server.getPlayerName(target_player), "$" .. startingcash .. " has been deposited into your account. Type '?help' to get started!", 8) else server.notify(target_player, "Welcome back " .. server.getPlayerName(target_player), "", 8) end end function getCurrentTileName(target_id) local playerloc = server.getPlayerPos(target_id) local x, y, z = matrix.position(playerloc) local islandinfo, is_success = server.getTile(playerloc) islandname = islandinfo["name"] if (islandname == nil) then return "NotFound" else return islandname end end function onCreate(is_world_create) server.setGameSetting("infinite_resources", false) --server.setGameSetting("auto_refuel", false) --No longer exists if (islandclaiming) then server.setGameSetting("map_teleport", false) server.setGameSetting("fast_travel", false) end if (is_world_create) then playertable = {} vehicletable = {} islandtable = {} datatable = {incometax} server.setCurrency(1000000000, server.getResearchPoints()) else playertable = g_savedata[1] vehicletable = g_savedata[2] islandtable = g_savedata[3] datatable = g_savedata[4] end --TURN OFF WHEN NOT TESTING --[[ ]]-- --[[ playertable = {} vehicletable = {} islandtable = {} datatable = {incometax} ]]-- end function onTick(game_ticks) if (server.getCurrency() < 1000000000) then server.setCurrency(0, server.getResearchPoints()) end accrueDebt() displayUI() end function onPlayerJoin(steam_id, name, peer_id, admin, auth) server.announce("[Server]", name .. " joined the game") InitializePlayer(peer_id) if getLastVehicle(peer_id) > -1 then server.pressVehicleButton(getLastVehicle(peer_id), "Killswitch") server.notify(peer_id, "Possible Crash/Disconnect", "If your last occupied vehicle has a button labelled 'Killswitch' it has been pressed", 8) end end function onPlayerLeave(steam_id, name, peer_id, admin, auth) server.announce("[Server]", name .. " left the game") saveGame() end function onCustomCommand(full_message, user_peer_id, is_admin, is_auth, command, arg1, arg2) --if (command == "?test") then --end if (command == "?addbank" and is_admin == true) then local arg2num = tonumber(arg2) addBank(arg1, arg2num) --target_id, amount server.notify(user_peer_id, "Account Updated", server.getPlayerName(arg1) .. "'s bank has increased by $" .. arg2, 8) server.notify(arg1, "Account Updated", "Your bank has been increased by $" .. arg2, 8) end if (command == "?adddebt" and is_admin == true) then local arg2num = tonumber(arg2) addDebt(arg1, arg2num) --target_id, amount server.notify(user_peer_id, "Account Updated", server.getPlayerName(arg1) .. "'s debt has increased by $" .. arg2, 8) server.notify(arg1, "Account Updated", "Your debt has been increased by $" .. arg2, 8) end if (command == "?setbank" and is_admin == true) then local arg2num = tonumber(arg2) setBank(arg1, arg2num) --target_id, amount server.notify(user_peer_id, "Account Updated", server.getPlayerName(arg1) .. "'s bank has been set to $" .. arg2, 8) server.notify(arg1, "Account Updated", "Your bank has been set to $" .. arg2, 8) end if (command == "?setdebt" and is_admin == true) then local arg2num = tonumber(arg2) setDebt(arg1, arg2num) --target_id, amount server.notify(user_peer_id, "Account Updated", server.getPlayerName(arg1) .. "'s debt has been set to $" .. arg2, 8) server.notify(arg1, "Account Updated", "Your debt has been set to $" .. arg2, 8) end if (command == "?resetisland" and is_admin == true) then local islandname = getCurrentTileName(user_peer_id) local formattedname = getFormattedTileName(islandname) if (formattedname ~= "NotFound") then server.notify(user_peer_id, "Island Reset", formattedname .. " is no longer owned by anybody", 8) local islandkey = getIslandKeyFromID(islandname) islandtable[islandkey] = nil else server.notify(user_peer_id, "Reset Failed", "This area is not ownable", 8) end end if (command == "?pay") then local arg2num = tonumber(arg2) if (arg2num > 0) then if (getBank(user_peer_id) >= arg2num) then addBank(user_peer_id, arg2num * -1) addBank(arg1, arg2num) server.notify(user_peer_id, "Payment Success", "You paid " .. server.getPlayerName(arg1) .. " $" .. arg2, 8) server.notify(arg1, "Payment Received", "You were paid $" .. arg2 .. " by " .. server.getPlayerName(user_peer_id), 8) else server.notify(user_peer_id, "Payment Failed", "You only have $" .. getBank(user_peer_id), 8) end else server.notify(user_peer_id, "Invalid number", "Please enter a valid number", 8) end end if (command == "?init") then InitializePlayer(user_peer_id) end if (command == "?loan") then local amount = tonumber(arg1) local currentdebt = getDebt(user_peer_id) if (amount + currentdebt <= maxloan) then addBank(user_peer_id, amount) addDebt(user_peer_id, amount) server.notify(user_peer_id, "Loan Successful", "Current Debt: $" .. currentdebt + amount.. "\nYour debt will increase by " .. debtperday * 100 .. "%" .. " at the beginning of each day", 8) else server.notify(user_peer_id, "Loan Failed", "Loan exceeds available amount\nMax: $" .. maxloan - currentdebt, 8) end end if (command == "?payloan") then local amount = tonumber(arg1) local currentdebt = getDebt(user_peer_id) if (amount > 0) then if (getBank(user_peer_id) >= amount) then if (currentdebt >= amount) then addBank(user_peer_id, amount * -1) addDebt(user_peer_id, amount * -1) server.notify(user_peer_id, "Payment Successful", "Remaining Debt: $" .. currentdebt - amount, 8) else server.notify(user_peer_id, "Payment Failed", "Amount larger than current debt", 8) end else server.notify(user_peer_id, "Payment Failed", "You do not have enough money", 8) end else server.notify(user_peer_id, "Payment Failed", "Please enter a valid number", 8) end end if (command == "?accruedebt" and is_admin == true) then accrueDebt() end --Currently disabled. System can be abused by taking loans then paying other players then getting bailed out --Could adapt this to an admin-only command --[[ if (command == "?bailout") then if (getBank(user_peer_id) >= bailoutcost) then if (getDebt(arg1) >= maxdebt) then clearVehicles(arg1) addBank(user_peer_id, bailoutcost * -1) setBank(arg1, startingcash) setDebt(arg1, 0) else server.notify(user_peer_id, "Bailout Failed", server.getPlayerName(arg1) .. " does not need a bailout", 8) end else server.notify(user_peer_id, "Bailout Failed", "You need $" .. bailoutcost .. "to bail out another player", 8) end end --]] if (command == "?bank") then local bank = getBank(user_peer_id) local debt = getDebt(user_peer_id) local sharedbank = getSharedBank() server.notify(user_peer_id, "Account", "Personal Bank: $" .. bank .. "\nShared Bank: $" .. sharedbank .. "\nDebt: $" .. debt, 8) end if (command == "?addsharedbank" and is_admin == true) then local arg1num = tonumber(arg1) if arg1num > 0 then addSharedBank(arg1num) else server.setCurrency(server.getCurrency() + arg1num, server.getResearchPoints()) end server.notify(user_peer_id, "Shared Account Updated", "Balance: $" .. getSharedBank(), 8) end if (command == "?addresearch" and is_admin == true) then local arg1num = tonumber(arg1) server.setCurrency(server.getCurrency(), server.getResearchPoints() + arg1num) server.notify(user_peer_id, "Research Updated", "Total Research: " .. server.getResearchPoints(), 8) end if (command == "?setresearch" and is_admin == true) then local arg1num = tonumber(arg1) server.setCurrency(server.getCurrency(), arg1num) server.notify(user_peer_id, "Research Updated", "Total Research: " .. server.getResearchPoints(), 8) end if (command == "?savegame") then saveGame() end if (command == "?playertable" and is_admin == true) then for k, v in pairs(playertable) do server.announce("Player Table", "Key ID " .. k .. "\nPlayer Name: " .. v[1] .. "\nBank: $" .. v[2] .. "\nDebt: $" .. v[3] .. "\nLast Veh ID: " .. v[4] .. "\nLast Debt Date: " .. v[5], (user_peer_id)) end end if (command == "?vehicletable" and is_admin == true) then for k, v in pairs(vehicletable) do server.announce("Vehicle Table", "Key ID " .. k .. "\nVehicle ID: " .. v[1] .. "\nOwner Name: " .. v[2] .. "\nCost: $" .. v[3], (user_peer_id)) end end if (command == "?islandtable" and is_admin == true) then for k, v in pairs(islandtable) do server.announce("Island Table", "Key ID " .. k .. "\nTile: " .. v[1] .. "\nOwner Name: " .. v[2] .. "\nCo-Owner Names: " .. "WIP" .. "\nTP Access: " .. "WIP" .. "\nSpawn Access: " .. "WIP" .. "\nBench Access: " .. "WIP", (user_peer_id)) end end if (command == "?bring" and is_admin == true) then server.setPlayerPos(arg1, (server.getPlayerPos(user_peer_id))) server.notify(user_peer_id, "Teleport", server.getPlayerName(arg1) .. " has been teleported to your position." , 8) server.notify(arg1, "Teleport", server.getPlayerName(user_peer_id) .. " has teleported you to their position." , 8) end if (command == "?goto" and is_admin == true) then server.setPlayerPos(user_peer_id, (server.getPlayerPos(arg1))) server.notify(user_peer_id, "Teleport", "You have teleported to " .. server.getPlayerName(arg1) .. "'s position", 8) server.notify(arg1, "Teleport", server.getPlayerName(user_peer_id) .. " has teleported to your position" , 8) end if (command == "?settax" and is_admin == true) then local arg1num = tonumber(arg1) if type(arg1num) ~= "number" then server.notify(user_peer_id, "Command Failed", "Please enter a valid number", 8) return end datatable[1] = arg1num server.notify(user_peer_id, "Taxes Updated", "Each player gets $" .. arg1num .. " per day", 8) end if (command == "?bancada") or (command == "?b") then local islandname = getCurrentTileName(user_peer_id) local formattedname = getFormattedTileName(islandname) if isInPurchasedArea(user_peer_id) or (string.find(formattedname, "Deposit")) then local playername = server.getPlayerName(user_peer_id) if (islandclaiming == false) or (hasBenchAccess(playername, islandname) == 1 or getIslandOwner(islandname) == playername or isCoOwner(playername, islandname) == 1 or (isHomeIsland(islandname) == 1)) then local nearestveh, nearestvehdist = nearestVehicle(user_peer_id) if (nearestvehdist <= 25) then if ownsVehicle(user_peer_id, nearestveh) == 1 then local vehiclecost = getVehicleCost(nearestveh) addBank(user_peer_id, vehiclecost) setLastVehicle(user_peer_id, -1) server.despawnVehicle(nearestveh, true) server.notify(user_peer_id, "Vehicle Returned", "$" .. string.format('%.0f', vehiclecost) .. " was refunded to your account", 8) else server.notify(user_peer_id, "Return Failed", "This vehicle does not belong to you", 8) end else server.notify(user_peer_id, "Return Failed", "No vehicle within 25m found", 8) end else server.notify(peer_id, "Bench Failed", "You do not have clearance to bench here", 8) end else server.notify(user_peer_id, "Return Failed", "You must be near a workbench you own", 8) end end if (command == "?lock" and is_admin == true) then local nearestveh, nearestvehdist = nearestVehicle(user_peer_id) if (nearestvehdist <= 25) then server.setVehicleEditable(nearestveh, false) server.notify(user_peer_id, "Vehicle Locked", "", 8) else server.notify(user_peer_id, "Lock Failed", "No vehicle within 25m found", 8) end end if (command == "?unlock" and is_admin == true) then local nearestveh, nearestvehdist = nearestVehicle(user_peer_id) if (nearestvehdist <= 25) then server.setVehicleEditable(nearestveh, true) server.notify(user_peer_id, "Vehicle Unlocked", "", 8) else server.notify(user_peer_id, "Unlock Failed", "No vehicle within 25m found", 8) end end if (command == "?resgatar" || ) or (command == "?r" || ) then local nearestveh, nearestvehdist = nearestVehicle(user_peer_id) if (nearestvehdist <= 25) then if ownsVehicle(user_peer_id, nearestveh) == 1 then local refund = math.floor(getVehicleCost(nearestveh) - (getVehicleCost(nearestveh) * recoverycostpercent)) addBank(user_peer_id, refund) server.notify(user_peer_id, "Vehicle Recovered", "$" .. string.format('%.0f', refund) .. " was refunded to your account after a " .. recoverycostpercent * 100 .. "% ($" .. (getVehicleCost(nearestveh) * recoverycostpercent) ..") recovery fee", 8) setLastVehicle(user_peer_id, -1) server.despawnVehicle(nearestveh, true) else server.notify(user_peer_id, "Return Failed", "This vehicle does not belong to you", 8) end else server.notify(user_peer_id, "Return Failed", "No vehicle within 25m found", 8) end end if (command == "?tilename" and is_admin == true) then local tilename = getCurrentTileName(user_peer_id) server.notify(user_peer_id, "Tile Name", tilename, 8) end if (command == "?help") then server.announce("Commands", "?bank\n?deposit (amount)\n?claim (amount)\n?pay (player id) (amount)\n?loan (amount)\n?payloan (amount)\n?bancada (ou ?b)\n?resgatar (ou ?r) [" .. string.format('%.0f', recoverycostpercent * 100) .. "% vehicle cost fee]\n?buyfuel (diesel/jetfuel) (amount) [$" .. fuelcostperliter .. "/L, non-dynamic tanks only]\n?savegame", (user_peer_id)) if (islandclaiming) then server.announce("Island Commands", "?access\n?islandaccess (island name)\n?claimisland\n?unclaimisland\n?setcoowner (player id) (island name)\n?setteleport (player id) (island name)\n?setspawn (player id) (island name)\n?setbench (player id) (island name)", (user_peer_id)) end if (is_admin == true) then server.announce("Admin Commands", "?addbank (player id) (amount)\n?setbank (player id) (amount)\n?addsharedbank (amount)\n?adddebt (player id) (amount)\n?setdebt (player id) (amount)\n?addresearch (amount)\n?setresearch (amount)\n?settax (amount)\n?bring (player id)\n?lock\n?unlock\n?resetisland", (user_peer_id)) server.announce("Debug Commands", "?init\n?playertable\n?vehicletable\n?islandtable\n?accruedebt\n?tilename", (user_peer_id)) end end if (command == "?deposit") then local arg1num = tonumber(arg1) if (arg1num > 0) then if (getBank(user_peer_id) >= arg1num) then addBank(user_peer_id, arg1num * -1) addSharedBank(arg1num) server.notify(-1, server.getPlayerName(user_peer_id) .. " has deposited $"..arg1num, "Shared Bank: $".. getSharedBank(), 8) else server.notify(user_peer_id, "Deposit Failed", "You only have $" .. getBank(user_peer_id), 8) end else server.notify(user_peer_id, "Invalid number", "Please enter a valid number", 8) end end if (command == "?claim") then local arg1num = tonumber(arg1) if (arg1num > 0) then if (getSharedBank() >= arg1num) then addBank(user_peer_id, arg1num * 1) server.setCurrency(server.getCurrency() - arg1num, server.getResearchPoints()) server.notify(-1, server.getPlayerName(user_peer_id) .. " has claimed $"..arg1num, "Shared Bank: $".. getSharedBank(), 8) else server.notify(user_peer_id, "Claim Failed", "The bank only has $" .. getSharedBank(), 8) end else server.notify(user_peer_id, "Invalid number", "Please enter a valid number", 8) end end if (command == "?buyfuel") then if (getLastVehicle(user_peer_id) ~= -1) then if isInMainland(user_peer_id) then if isInPurchasedArea(target_id) then if (arg1 == "diesel" or arg1 == "jetfuel") then if (getBank(user_peer_id) >= arg2 * fuelcostperliter) then addBank(user_peer_id, (arg2 * fuelcostperliter) * -1) if (arg1 == "diesel") then server.setVehicleTank(getLastVehicle(user_peer_id), tank_name, arg2, 1) server.notify(user_peer_id, "Fueling Successful", arg2 .. "L diesel purchased for $" .. arg2 * fuelcostperliter, 8) end if (arg1 == "jetfuel") then server.setVehicleTank(getLastVehicle(user_peer_id), tank_name, arg2, 2) server.notify(user_peer_id, "Fueling Successful", arg2 .. "L jet fuel purchased for $" .. arg2 * fuelcostperliter, 8) end else server.notify(user_peer_id, "Fueling Failed", "You do not have enough cash", 8) end else server.notify(user_peer_id, "Fueling Failed", "You must enter diesel or jetfuel", 8) end else server.notify(user_peer_id, "Fueling Failed", "You must be near a workbench you own", 8) end else server.notify(user_peer_id, "Fueling Failed", "You can only purchase fuel on the mainland and main islands", 8) end else server.notify(user_peer_id, "Fueling Failed", "You must be in a vehicle to do this", 8) end end --?teleport islandformattedname if (command == "?teleport") or (command == "?tp") then if (islandclaiming) then local islandformattedname = arg1 local islandtilename = getTileIDFromName(islandformattedname) local playername = server.getPlayerName(user_peer_id) if (islandtilename ~= "NotFound") then if (getIslandOwner(islandtilename) == playername) or (isCoOwner(playername, islandtilename) == 1) or hasTeleportAccess(playername, islandtilename) == 1 or isHomeIsland(islandtilename) == 1 then if (isHomeIsland(islandtilename) == 1) then local hometile = server.getStartTile() local x = hometile["x"] local y = hometile["y"] local z = hometile["z"] local loc = matrix.translation(x,y,z) server.setPlayerPos(user_peer_id, loc) else local islandkey = getIslandKeyFromID(islandtilename) local loc = islandtable[islandkey][7] server.setPlayerPos(user_peer_id, loc) end else server.notify(user_peer_id, "Teleport Failed", "You do not have clearance to teleport to " .. islandformattedname, 8) end else server.notify(user_peer_id, "Teleport Failed", "Island not found", 8) end else server.notify(user_peer_id, "Island Teleporting Disabled", "This command has been disabled by server settings", 8) end end if (command == "?access") then if (islandclaiming) then local hometile = server.getStartTile() local hometilename = hometile["name"] local hometileformattedname = getFormattedTileName(hometilename) local playername = server.getPlayerName(user_peer_id) local accessstring = hometileformattedname .. ": Home" for k, v in pairs(islandtable) do local island_tile_name = v[1] local islandformattedname = getFormattedTileName(island_tile_name) if (getIslandOwner(island_tile_name) == playername) then accessstring = accessstring .. "\n" .. islandformattedname .. ": Owner" elseif (isCoOwner(playername, island_tile_name) == 1) then accessstring = accessstring .. "\n" .. islandformattedname ..": Co-Owner" elseif hasTeleportAccess(playername, island_tile_name) == 1 or hasSpawnAccess(playername, island_tile_name) == 1 or hasBenchAccess(playername, island_tile_name) == 1 then accessstring = accessstring .. "\n" .. islandformattedname .. ": " if hasTeleportAccess(playername, island_tile_name) == 1 then accessstring = accessstring .. "Teleport " end if hasSpawnAccess(playername, island_tile_name) == 1 then accessstring = accessstring .. "Spawn " end if hasBenchAccess(playername, island_tile_name) == 1 then accessstring = accessstring .. "Bench" end end end server.announce("Access", accessstring, (user_peer_id)) else server.notify(user_peer_id, "Island Claiming Disabled", "This command has been disabled by server settings", 8) end end --?islandaccess islandformattedname if (command == "?islandaccess") then local islandformattedname = arg1 local islandtilename = getTileIDFromName(islandformattedname) local playername = server.getPlayerName(user_peer_id) if (islandtilename ~= "NotFound") then if (getIslandOwner(islandtilename) == playername) or (isCoOwner(playername, islandtilename) == 1) then for k, v in pairs(islandtable) do if (v[1] == islandtilename) then --Owner server.announce("Owner", getIslandOwner(islandtilename), (user_peer_id)) --Co-Owners local coowners = getIslandCoOwners(islandtilename) local coownersstring = tableToFormattedString(coowners) if (coownersstring ~= "") then server.announce("Co-Owners", coownersstring, (user_peer_id)) end --Teleport local teleportaccess = getIslandTeleportAccess(islandtilename) local teleportaccessstring = tableToFormattedString(teleportaccess) if (teleportaccessstring ~= "") then server.announce("Teleport Access", teleportaccessstring, (user_peer_id)) end --Spawn local spawnaccess = getIslandSpawnAccess(islandtilename) local spawnaccessstring = tableToFormattedString(spawnaccess) if (spawnaccessstring ~= "") then server.announce("Spawn Access", spawnaccessstring, (user_peer_id)) end --Bench local benchaccess = getIslandBenchAccess(islandtilename) local benchaccessstring = tableToFormattedString(benchaccess) if (benchaccessstring ~= "") then server.announce("Bench Access", benchaccessstring, (user_peer_id)) end end end else server.notify(user_peer_id, "Request Failed", "You do not have clearance to see this", 8) end else server.notify(user_peer_id, "Request Failed", "Island not found", 8) end end --?setcoowner playerid islandformattedname if (command == "?setcoowner") then local playername = server.getPlayerName(user_peer_id) local targetname = server.getPlayerName(arg1) local islandformattedname = arg2 local islandtilename = getTileIDFromName(islandformattedname) if (islandtilename ~= "NotFound") then if (arg1 ~= user_peer_id) then if (getIslandOwner(islandtilename) == playername) or (isCoOwner(playername, islandtilename) == 1) then if (getIslandOwner(islandtilename) ~= targetname) then local islandkey = getIslandKeyFromID(islandtilename) if (isCoOwner(targetname, islandtilename) == 1) then server.notify(user_peer_id, "Permission Removed", targetname .. " is no longer a co-owner of " .. islandformattedname, 8) local playerkey = searchTable(islandtable[islandkey][3], targetname) islandtable[islandkey][3][playerkey] = nil else table.insert (islandtable[islandkey][3], targetname) server.notify(user_peer_id, "Permission Added", targetname .. " is now a co-owner of " .. islandformattedname, 8) end else server.notify(user_peer_id, "Permission Failed", "That player is the owner of the island", 8) end else server.notify(user_peer_id, "Permission Failed", "You do not own this island", 8) end else server.notify(user_peer_id, "Permission Failed", "You cannot edit your own permissions", 8) end else server.notify(user_peer_id, "Permission Failed", "Island not found", 8) end end --?setteleport playerid islandformattedname if (command == "?setteleport") then local playername = server.getPlayerName(user_peer_id) local targetname = server.getPlayerName(arg1) local islandformattedname = arg2 local islandtilename = getTileIDFromName(islandformattedname) if (islandtilename ~= "NotFound") then if (arg1 ~= user_peer_id) then if (getIslandOwner(islandtilename) == playername) or (isCoOwner(playername, islandtilename) == 1) then if (getIslandOwner(islandtilename) ~= targetname) then local islandkey = getIslandKeyFromID(islandtilename) if (hasTeleportAccess(targetname, islandtilename) == 1) then server.notify(user_peer_id, "Permission Removed", targetname .. " can no longer teleport to " .. islandformattedname, 8) local playerkey = searchTable(islandtable[islandkey][4], targetname) islandtable[islandkey][4][playerkey] = nil else table.insert (islandtable[islandkey][4], targetname) server.notify(user_peer_id, "Permission Added", targetname .. " can now teleport to " .. islandformattedname, 8) end else server.notify(user_peer_id, "Permission Failed", "That player is the owner of the island", 8) end else server.notify(user_peer_id, "Permission Failed", "You do not own this island", 8) end else server.notify(user_peer_id, "Permission Failed", "You cannot edit your own permissions", 8) end else server.notify(user_peer_id, "Permission Failed", "Island not found", 8) end end --?setspawn playerid islandformattedname if (command == "?setspawn") then local playername = server.getPlayerName(user_peer_id) local targetname = server.getPlayerName(arg1) local islandformattedname = arg2 local islandtilename = getTileIDFromName(islandformattedname) if (islandtilename ~= "NotFound") then if (arg1 ~= user_peer_id) then if (getIslandOwner(islandtilename) == playername) or (isCoOwner(playername, islandtilename) == 1) then if (getIslandOwner(islandtilename) ~= targetname) then local islandkey = getIslandKeyFromID(islandtilename) if (hasSpawnAccess(targetname, islandtilename) == 1) then server.notify(user_peer_id, "Permission Removed", targetname .. " can no longer spawn vehicles at " .. islandformattedname, 8) local playerkey = searchTable(islandtable[islandkey][5], targetname) islandtable[islandkey][5][playerkey] = nil else table.insert (islandtable[islandkey][5], targetname) server.notify(user_peer_id, "Permission Added", targetname .. " can now spawn vehicles at " .. islandformattedname, 8) end else server.notify(user_peer_id, "Permission Failed", "That player is the owner of the island", 8) end else server.notify(user_peer_id, "Permission Failed", "You do not own this island", 8) end else server.notify(user_peer_id, "Permission Failed", "You cannot edit your own permissions", 8) end else server.notify(user_peer_id, "Permission Failed", "Island not found", 8) end end --?setbench playerid islandformattedname if (command == "?setbench") then local playername = server.getPlayerName(user_peer_id) local targetname = server.getPlayerName(arg1) local islandformattedname = arg2 local islandtilename = getTileIDFromName(islandformattedname) if (islandtilename ~= "NotFound") then if (arg1 ~= user_peer_id) then if (getIslandOwner(islandtilename) == playername) or (isCoOwner(playername, islandtilename) == 1) then if (getIslandOwner(islandtilename) ~= targetname) then local islandkey = getIslandKeyFromID(islandtilename) if (hasBenchAccess(targetname, islandtilename) == 1) then server.notify(user_peer_id, "Permission Removed", targetname .. " can no longer bench vehicles at " .. islandformattedname, 8) local playerkey = searchTable(islandtable[islandkey][6], targetname) islandtable[islandkey][6][playerkey] = nil else table.insert (islandtable[islandkey][6], targetname) server.notify(user_peer_id, "Permission Added", targetname .. " can now bench vehicles at " .. islandformattedname, 8) end else server.notify(user_peer_id, "Permission Failed", "That player is the owner of the island", 8) end else server.notify(user_peer_id, "Permission Failed", "You do not own this island", 8) end else server.notify(user_peer_id, "Permission Failed", "You cannot edit your own permissions", 8) end else server.notify(user_peer_id, "Permission Failed", "Island not found", 8) end end if (command == "?claimisland") then if (islandclaiming) then local islandname = getCurrentTileName(user_peer_id) local formattedname = getFormattedTileName(islandname) local islandowner = getIslandOwner(islandname) local is_purchased = isInPurchasedArea(user_peer_id) if (is_purchased) or (string.find(formattedname, "Deposit")) then if (isHomeIsland(islandname) == 0) then if (formattedname ~= "NotFound") then if (islandowner == "Unowned") then server.notify(user_peer_id, "Claim Successful", "You now own " .. formattedname, 8) table.insert (islandtable, {islandname, server.getPlayerName(user_peer_id), {}, {}, {}, {}, server.getPlayerPos(user_peer_id)}) --Sets to owner and spawn coordinates else server.notify(user_peer_id, "Claim Failed", formattedname .. " is already owned by " .. islandowner, 8) end else server.notify(user_peer_id, "Claim Failed", "This area is not ownable", 8) end else server.notify(user_peer_id, "Claim Failed", "The starting area is not ownable", 8) end else server.notify(user_peer_id, "Claim Failed", "This island is not purchased", 8) end else server.notify(user_peer_id, "Island Claiming Disabled", "This command has been disabled by server settings", 8) end end if (command == "?unclaimisland") then if (islandclaiming) then local islandname = getCurrentTileName(user_peer_id) local formattedname = getFormattedTileName(islandname) local islandowner = getIslandOwner(islandname) if (formattedname ~= "NotFound") then if (islandowner == server.getPlayerName(user_peer_id)) then server.notify(user_peer_id, "Unclaim Successful", "You no longer own " .. formattedname, 8) local islandkey = getIslandKeyFromID(islandname) islandtable[islandkey] = nil else server.notify(user_peer_id, "Unclaim Failed", "You do not own " .. formattedname, 8) end else server.notify(user_peer_id, "Unclaim Failed", "This area is not ownable", 8) end else server.notify(user_peer_id, "Island Claiming Disabled", "This command has been disabled by server settings", 8) end end end --end for custom commands function onPlayerSit(peer_id, vehicle_id, seat_name) setLastVehicle(peer_id, vehicle_id) end function onPlayerUnsit(peer_id, vehicle_id, seat_name) setLastVehicle(peer_id, -1) end function onPlayerRespawn(peer_id) setLastVehicle(peer_id, -1) teleportHome(peer_id) if (getBank(peer_id) >= hospitalbill) then addBank(peer_id, hospitalbill * -1) server.notify(peer_id, "Hospital Bills", "$" .. hospitalbill .. " was deducted from your account", 8) else server.notify(peer_id, "Hospital Bills", "$" .. getBank(peer_id) .. "was deducted from your account", 8) setBank(peer_id, 0) end end function onVehicleSpawn(vehicle_id, peer_id, x, y, z, cost) if (peer_id > -1) then local playername = server.getPlayerName(peer_id) local islandname = getCurrentTileName(peer_id) if (islandclaiming == false) or (hasSpawnAccess(playername, islandname) == 1 or getIslandOwner(islandname) == playername or isCoOwner(playername, islandname) == 1 or (isHomeIsland(islandname) == 1)) then if (cost ~= 2) then if (getDebt(peer_id) <= maxdebt) then if (getBank(peer_id) >= cost) then addBank((peer_id), cost * -1) server.setCurrency(server.getCurrency() + cost, server.getResearchPoints()) table.insert (vehicletable, {vehicle_id, server.getPlayerName(peer_id), cost}) --server.setVehicleEditable(vehicle_id, false) --Moved to onVehicleLoad server.notify(peer_id, "Vehicle Purchased", "$".. string.format('%.0f', getBank(peer_id)) .." remains", 8) if (server.getCurrency() < 1000000000) then server.setCurrency(0, server.getResearchPoints()) end --ontick doesnt work when vehicle is spawned here sometimes for some reason else server.despawnVehicle(vehicle_id, true) server.setCurrency(server.getCurrency() + cost, server.getResearchPoints()) server.notify(peer_id, "Not enough money", "You need $"..cost - getBank(server.getPlayerName(peer_id)).." more.", 8) end else server.despawnVehicle(vehicle_id, true) server.setCurrency(server.getCurrency() + cost, server.getResearchPoints()) server.notify(peer_id, "Debt too high", "You must get your debt below $" .. maxdebt .. " to spawn a vehicle", 8) end else server.despawnVehicle(vehicle_id, true) server.notify(-1, server.getPlayerName(peer_id) .. " accidentally spawned the Cube of Shame", "Everybody point and laugh", 8) end else server.despawnVehicle(vehicle_id, true) server.setCurrency(server.getCurrency() + cost, server.getResearchPoints()) server.notify(peer_id, "Purchase Failed", "You do not have clearance to spawn here", 8) end end end function onVehicleLoad(vehicle_id) server.setVehicleEditable(vehicle_id, false) --Had to move this here because it wasn't calculating fuel on spawn correctly end function onVehicleDespawn(vehicle_id, peer_id) deleteVehicleFromTable(vehicle_id) end --You can make a tile purchasable by adding entries in the next 2 sections --If "Deposit" is in the name, it can be claimed without purchasing (useful for areas with no purchase sign like oil sites) function getFormattedTileName(tile_id) --Base Tiles if (tile_id) == "data/tiles/island_33_tile_end.xml" then return "Camodo" end if (tile_id) == "data/tiles/island_33_tile_32.xml" then return "Spycakes" end if (tile_id) == "data/tiles/island_33_tile_33.xml" then return "Dreimor" end if (tile_id) == "data/tiles/island_43_multiplayer_base.xml" then return "MPI" end if (tile_id) == "data/tiles/island_15.xml" then return "Coastguard" end if (tile_id) == "data/tiles/test_tile.xml" then return "CoastguardTT" end if (tile_id) == "data/tiles/island12.xml" then return "CoastguardB" end if (tile_id) == "data/tiles/island_24.xml" then return "Airstrip" end if (tile_id) == "data/tiles/island_34_military.xml" then return "Military" end if (tile_id) == "data/tiles/island_25.xml" then return "Harbor" end if (tile_id) == "data/tiles/mega_island_9_8.xml" then return "NorthHarbor" end if (tile_id) == "data/tiles/mega_island_2_6.xml" then return "Harrison" end if (tile_id) == "data/tiles/mega_island_12_6.xml" then return "ONeill" end if (tile_id) == "data/tiles/mega_island_15_2.xml" then return "FishingVillage" end if (tile_id) == "data/tiles/island_31_playerbase_combo.xml" then return "CustomSmallBoat" end if (tile_id) == "data/tiles/island_30_playerbase_boat.xml" then return "CustomLargeBoat" end if (tile_id) == "data/tiles/island_32_playerbase_heli.xml" then return "CustomHeli" end if (tile_id) == "data/tiles/island_29_playerbase_submarine.xml" then return "CustomSub" end if (tile_id) == "data/tiles/oil_rig_playerbase.xml" then return "CustomRig" end if (tile_id) == "data/tiles/arctic_tile_22.xml" then return "Endo" end if (tile_id) == "data/tiles/arctic_tile_12_oilrig.xml" then return "Trinite" end if (tile_id) == "data/tiles/arctic_island_playerbase.xml" then return "Tajin" end --Desert Tiles if (tile_id) == "data/tiles/arid_island_5_14.xml" then return "NorthMeier" end if (tile_id) == "data/tiles/arid_island_8_15.xml" then return "Uran" end if (tile_id) == "data/tiles/arid_island_6_7.xml" then return "Serpentine" end if (tile_id) == "data/tiles/arid_island_7_5.xml" then return "Ender" end if (tile_id) == "data/tiles/arid_island_11_14.xml" then return "Brainz" end if (tile_id) == "data/tiles/arid_island_12_10.xml" then return "Mauve" end if (tile_id) == "data/tiles/arid_island_19_12.xml" then return "Monkey" end if (tile_id) == "data/tiles/arid_island_19_11.xml" then return "Clarke" end if (tile_id) == "data/tiles/arid_island_24_3.xml" then return "JSI" end if (tile_id) == "data/tiles/arid_island_26_14.xml" then return "FJWarner" end --Desert Oil Deposits if (tile_id) == "data/tiles/arid_island_23_14.xml" then return "CarnivoreDeposit" end if (tile_id) == "data/tiles/arid_island_24_4.xml" then return "JSIDeposit" end if (tile_id) == "data/tiles/arid_island_3_12.xml" then return "TurmoildDeposit" end if (tile_id) == "data/tiles/arid_island_8_11.xml" then return "ShymavanDeposit" end return "NotFound" end function getTileIDFromName(formatted_name) --Base Tiles if (formatted_name) == "Camodo" then return "data/tiles/island_33_tile_end.xml" end if (formatted_name) == "Spycakes" then return "data/tiles/island_33_tile_32.xml" end if (formatted_name) == "Dreimor" then return "data/tiles/island_33_tile_33.xml" end if (formatted_name) == "MPI" then return "data/tiles/island_43_multiplayer_base.xml" end if (formatted_name) == "Coastguard" then return "data/tiles/island_15.xml" end if (formatted_name) == "CoastguardTT" then return "data/tiles/test_tile.xml" end if (formatted_name) == "CoastguardB" then return "data/tiles/island12.xml" end if (formatted_name) == "Airstrip" then return "data/tiles/island_24.xml" end if (formatted_name) == "Military" then return "data/tiles/island_34_military.xml" end if (formatted_name) == "Harbor" then return "data/tiles/island_25.xml" end if (formatted_name) == "NorthHarbor" then return "data/tiles/mega_island_9_8.xml" end if (formatted_name) == "Harrison" then return "data/tiles/mega_island_2_6.xml" end if (formatted_name) == "ONeill" then return "data/tiles/mega_island_12_6.xml" end if (formatted_name) == "FishingVillage" then return "data/tiles/mega_island_15_2.xml" end if (formatted_name) == "CustomSmallBoat" then return "data/tiles/island_31_playerbase_combo.xml" end if (formatted_name) == "CustomLargeBoat" then return "data/tiles/island_30_playerbase_boat.xml" end if (formatted_name) == "CustomHeli" then return "data/tiles/island_32_playerbase_heli.xml" end if (formatted_name) == "CustomSub" then return "data/tiles/island_29_playerbase_submarine.xml" end if (formatted_name) == "CustomRig" then return "data/tiles/oil_rig_playerbase.xml" end if (formatted_name) == "Endo" then return "data/tiles/arctic_tile_22.xml" end if (formatted_name) == "Trinite" then return "data/tiles/arctic_tile_12_oilrig.xml" end if (formatted_name) == "Tajin" then return "data/tiles/arctic_island_playerbase.xml" end --Desert Tiles if (formatted_name) == "NorthMeier" then return "data/tiles/arid_island_5_14.xml" end if (formatted_name) == "Uran" then return "data/tiles/arid_island_8_15.xml" end if (formatted_name) == "Serpentine" then return "data/tiles/arid_island_6_7.xml" end if (formatted_name) == "Ender" then return "data/tiles/arid_island_7_5.xml" end if (formatted_name) == "Brainz" then return "data/tiles/arid_island_11_14.xml" end if (formatted_name) == "Mauve" then return "data/tiles/arid_island_12_10.xml" end if (formatted_name) == "Monkey" then return "data/tiles/arid_island_19_12.xml" end if (formatted_name) == "Clarke" then return "data/tiles/arid_island_19_11.xml" end if (formatted_name) == "JSI" then return "data/tiles/arid_island_24_3.xml" end if (formatted_name) == "FJWarner" then return "data/tiles/arid_island_26_14.xml" end --Desert Oil Deposits if (formatted_name) == "CarnivoreDeposit" then return "data/tiles/arid_island_23_14.xml" end if (formatted_name) == "JSIDeposit" then return "data/tiles/arid_island_24_4.xml" end if (formatted_name) == "TurmoildDeposit" then return "data/tiles/arid_island_3_12.xml" end if (formatted_name) == "ShymavanDeposit" then return "data/tiles/arid_island_8_11.xml" end return "NotFound" end