I am writing a script for the mission. I'm trying to swap the character with the seated player and vice versa. None of it works. All jump up from their seats.
Steps:
1. hire a character through "?hire".
2. Make him sit in the vehicle.
3. Make places with the character through "?sw".
(!) Yes, we changed places, but jumped out of our seats.
g_savedata = { ["settings"] = false, ["workers"] = {}, ["peer_id"] = nil, ["player_id"] = nil, ["is_sit"] = false, ["vehicle_id"] = -1, ["seat_name"] = nil, ["day"] = nil } --local worker = { name = pname, outfit = 1, isPlayer = true, id=my_character_id, is_sit = false, vehicle_id = -1, seat_name= nil, pop_up= nil, is_powered=false, powered_time=nil}; function onTick( game_tick) if (g_savedata.day == nil) then g_savedata.day = server.getDateValue(); end; if g_savedata.day < server.getDateValue() then g_savedata.day = server.getDateValue(); server.announce("[server]", "new Day " ..g_savedata.day); dailyPay(); end; if not server.getTutorial() then if not g_savedata.settings then g_savedata.settings = true; server.setGameSetting("third_person", true); server.setGameSetting("third_person_vehicle", true); server.setGameSetting("vehicle_damage", true); server.setGameSetting("player_damage", true); server.setGameSetting("npc_damage", true); server.setGameSetting("sharks", true); server.setGameSetting("fast_travel", true); server.setGameSetting("teleport_vehicle", true); server.setGameSetting("rogue_mode", false); server.setGameSetting("auto_refuel", true); server.setGameSetting("megalodon", true); server.setGameSetting("map_show_players", false); server.setGameSetting("map_show_vehicles", false); server.setGameSetting("show_3d_waypoints", false); server.setGameSetting("show_name_plates", true); server.setGameSetting("infinite_money", false); server.setGameSetting("settings_menu", false); server.setGameSetting("unlock_all_islands", false); server.setGameSetting("unlock_all_components", false); server.setGameSetting("infinite_batteries", false); server.setGameSetting("infinite_fuel", false); server.setGameSetting("engine_overheating", true); server.setGameSetting("no_clip", false); server.setGameSetting("map_teleport", true); server.setGameSetting("cleanup_veicle", true); server.setGameSetting("vehicle_spawning", true); server.setGameSetting("photo_mode", true); server.setGameSetting("respawning", true); server.setGameSetting("settings_menu_lock", true); server.setGameSetting("despawn_on_leave", true); end end end; function onVehicleSpawn(vehicle_id, peer_id, x, y, z, cost) server.setVehicleEditable(vehicle_id, true); end; function onPlayerJoin(steam_id, name, peer_id, is_admin, is_auth) g_savedata.peer_id = peer_id; local p_id, is_success = server.getPlayerCharacterID(peer_id); g_savedata.player_id = p_id; end; function onCharacterSit(object_id, vehicle_id, seat_name) local text = "onCharacterSit: object_id=" ..object_id.. "; vehicle_id=" ..vehicle_id.. "; seat_name=" ..seat_name; server.announce("[debug]", text); for _, h in pairs(g_savedata.workers) do if (h.id == object_id) then h.vehicle_id = vehicle_id; h.seat_name = seat_name; h.is_sit = true; end end; if (object_id == g_savedata.player_id) then g_savedata.vehicle_id = vehicle_id; g_savedata.seat_name = seat_name; g_savedata.is_sit = true; end; end; function onCustomCommand(full_message, peer_id, is_admin, is_auth, command, arg1, arg2, arg3, arg4, arg5) if (command == "?") or (command == "?help" and arg1 == nil) then print_help(peer_id); end if command == "?settings" then local enabled = server.getGameSettings().settings_menu; server.setGameSetting("settings_menu", not enabled); end; if (command == "?hire") then if (arg1 == nil) then hire(peer_id, workerName()); else hire(peer_id, arg1); end; end; if (command == "?sw") then switchTo(peer_id, arg1); end; if (command == "?rn") then renameW(peer_id, arg1, arg2); end; if (command == "?gps") then if (arg1 == nil) then local enabled = server.getGameSettings().map_show_players; server.setGameSetting("map_show_players", not enabled); end; if (arg1 == "on" or arg1 == "1" or arg1 == "enabled") then server.setGameSetting("map_show_players", true); end; if (arg1 == "off" or arg1 == "0" or arg1 == "disabled") then server.setGameSetting("map_show_players", false); end; end; end function print_help(user_peer_id) server.announce("[server]", "? or ?help --- showing this help."); server.announce("[server]", "?settings --- enable/disable settings menu."); server.announce("[server]", "?here --- hire a worker for $ 2000 and pay him $ 100 daily."); server.announce("[server]", "?sw --- switch to nearest worker."); server.announce("[server]", "?sw name --- switch to nearest worker with name."); server.announce("[server]", "?rn name new_name --- rename nearest worker with namer to new_name"); server.announce("[server]", "?gps --- enable/disable player map markers."); end; function isSit(object_id) local vehicle_id, is_success = server.getCharacterVehicle(object_id); if (is_success) then local vdata, is_success = server.getVehicleData(vehicle_id); if (is_success) then for _, id in pairs(vdata.characters) do if (object_id == id) then return true; end; end; end; end; return false; end; function swap2W(peer_id, workerid) local player_matrix, _ = server.getPlayerPos(peer_id); local worker_matrix, success = server.getObjectPos(workerid); local p_id, is_success = server.getPlayerCharacterID(peer_id); local my_data = server.getCharacterData(p_id); local meq_id1, msuccess1 = server.getCharacterItem(p_id, 1); local meq_id2, msuccess2 = server.getCharacterItem(p_id, 2); local meq_id3, msuccess3 = server.getCharacterItem(p_id, 3); local meq_id4, msuccess4 = server.getCharacterItem(p_id, 4); local meq_id5, msuccess5 = server.getCharacterItem(p_id, 5); local meq_id6, msuccess6 = server.getCharacterItem(p_id, 6); local w_data = server.getCharacterData(workerid); local weq_id1, wsuccess1 = server.getCharacterItem(workerid, 1); local weq_id2, wsuccess2 = server.getCharacterItem(workerid, 2); local weq_id3, wsuccess3 = server.getCharacterItem(workerid, 3); local weq_id4, wsuccess4 = server.getCharacterItem(workerid, 4); local weq_id5, wsuccess5 = server.getCharacterItem(workerid, 5); local weq_id6, wsuccess6 = server.getCharacterItem(workerid, 6); server.setCharacterData(workerid, my_data.hp, false, true); server.setCharacterItem(workerid, 1, meq_id1, false); server.setCharacterItem(workerid, 2, meq_id2, false); server.setCharacterItem(workerid, 3, meq_id3, false); server.setCharacterItem(workerid, 4, meq_id4, false); server.setCharacterItem(workerid, 5, meq_id5, false); server.setCharacterItem(workerid, 6, meq_id6, false); server.setCharacterData(p_id, w_data.hp, false, true); server.setCharacterItem(p_id, 1, weq_id1, false); server.setCharacterItem(p_id, 2, weq_id2, false); server.setCharacterItem(p_id, 3, weq_id3, false); server.setCharacterItem(p_id, 4, weq_id4, false); server.setCharacterItem(p_id, 5, weq_id5, false); server.setCharacterItem(p_id, 6, weq_id6, false); local ws = isSit(workerid); local ps = isSit(p_id); server.setPlayerPos(peer_id, worker_matrix); server.setObjectPos(workerid, player_matrix); if (ps) then server.announce("[debug]", "player is sit!"); server.setCharacterSeated(workerid, g_savedata.vehicle_id, g_savedata.seat_name); end; if (ws) then server.announce("[debug]", "worker is sit!"); server.setCharacterSeated(p_id, g_savedata.workers[workerid].vehicle_id, g_savedata.workers[workerid].seat_name); end; server.setCharacterData(workerid, my_data.hp, true, true); server.setCharacterData(p_id, w_data.hp, true, true); end; function switchTo(peer_id, arg1) local worker = nil; local best_ditance = nil; local player_matrix, _ = server.getPlayerPos(peer_id); local px, py, pz = matrix.position(player_matrix); for _, h in pairs(g_savedata.workers) do if (arg1 == nil or (type(arg1) == "string" and h.name == arg1) or (type(arg1) == "number" and h.id == arg1)) then worker_matrix, success = server.getObjectPos(h.id); if (success) then local wx, wy, wz = matrix.position(worker_matrix); local distSQ = ((wx - px)^2) + ((wy - py)^2) + ((wz - pz)^2); if (best_ditance == nil or best_ditance > distSQ) then best_ditance = distSQ; worker = h; end; end; end; end; if (worker ~= nil) then swap2W(peer_id, worker.id); end; end; function hire(peer_id, worker_name) local my_currency = server.getCurrency(); local my_research_points = server.getResearchPoints(); local lx, ly, lz, is_look = server.getPlayerLookDirection(peer_id); local transform_matrix, is_pos = server.getPlayerPos(peer_id); if (is_look and is_pos) then local x,y,z = matrix.position(transform_matrix); x = x + lx*2; z = z + lz*2; local rescuer_pos = matrix.translation(x, y, z); local rescuer_id = server.spawnCharacter(rescuer_pos, 1); rescuer_pos, is_success = server.getObjectPos(rescuer_id); while (not is_success) do rescuer_pos, is_success = server.getObjectPos(rescuer_id); end; local pid = server.getMapID(); local worker = { name = worker_name, outfit = 1, is_powered = true, isPlayer = false, id=rescuer_id, is_sit = false, vehicle_id = -1, seat_name= nil, pop_up=server.getMapID(), powered_time = server.getDateValue()}; g_savedata.workers[rescuer_id] = worker; local text = worker_name.. " powered by " ..server.getPlayerName(peer_id); server.setPopup(-1, g_savedata.workers[rescuer_id].pop_up, g_savedata.workers[rescuer_id].name, true, text, 0, 1.0, 0, 5, 0, g_savedata.workers[rescuer_id].id); local cost = 2000; server.setCurrency(my_currency - cost, my_research_points); end; end; function rn2W(peer_id, worker, new_name) worker.name = new_name; g_savedata.workers[worker.id] = worker; local text = new_name.. " powered by " ..server.getPlayerName(peer_id); server.setPopup(-1, g_savedata.workers[worker.id].pop_up, g_savedata.workers[worker.id].name, true, text, 0, 1.0, 0, 5, 0, g_savedata.workers[worker.id].id); end; function renameW(peer_id, arg1, arg2) local worker = nil; local best_ditance = nil; local player_matrix, _ = server.getPlayerPos(peer_id); local px, py, pz = matrix.position(player_matrix); for _, h in pairs(g_savedata.workers) do if (arg1 == nil or (type(arg1) == "string" and h.name == arg1) or (type(arg1) == "number" and h.id == arg1)) then worker_matrix, success = server.getObjectPos(h.id); if (success) then local wx, wy, wz = matrix.position(worker_matrix); local distSQ = ((wx - px)^2) + ((wy - py)^2) + ((wz - pz)^2); if (best_ditance == nil or best_ditance > distSQ) then best_ditance = distSQ; worker = h; end; end; end; end; if (worker ~= nil) then rn2W(peer_id, worker, arg2); end; end; function workerName() return "worker"; end; function dailyPay() local dailyCost = 100; for _, h in pairs(g_savedata.workers) do if (h.is_powered == nil or h.is_powered) then local my_currency = server.getCurrency(); local my_research_points = server.getResearchPoints(); if (my_currency > dailyCost) then server.setCurrency(my_currency - dailyCost, my_research_points); local my_currency = server.getCurrency(); local my_research_points = server.getResearchPoints(); server.announce("[Daily payment for " ..h.name.. "]", dailyCost.. " balance: " ..my_currency); end; end; end; end; function toStringO(o)   if type(o) == 'table' then    local s = '{ '    for k,v in pairs(o) do      if type(k) ~= 'number' then k = '"'..k..'"' end      s = s .. '['..k..'] = ' .. toStringO(v) .. ','    end    return s .. '} '   else    return tostring(o)   end end function tableLength(T) local count = 0 for _ in pairs(T) do count = count + 1 end return count end