web/resources/lua/MultiplayerSharedScript.lua

213 lines
7.2 KiB
Lua

-- Prepended to GroupBuild.lua and Join.lua --
pcall(function() game:SetPlaceID({{ PlaceID }}, {{ OfficialPlace }}) end)
settings()["Game Options"].CollisionSoundEnabled = true
pcall(function() settings().Rendering.EnableFRM = true end)
pcall(function() settings().Physics.Is30FpsThrottleEnabled = true end)
pcall(function() settings()["Task Scheduler"].PriorityMethod = Enum.PriorityMethod.AccumulatedError end)
pcall(function() settings().Physics.PhysicsEnvironmentalThrottle = Enum.EnviromentalPhysicsThrottle.DefaultAuto end)
-- arguments ---------------------------------------
local threadSleepTime = ...
if threadSleepTime==nil then
threadSleepTime = 15
end
local test = {{ IsTest }}
print("! Joining game '{{ JobID }}' place {{ PlaceID }} at {{ MachineAddress }}")
game:GetService("ChangeHistoryService"):SetEnabled(false)
game:GetService("ContentProvider"):SetThreadPool(16)
game:GetService("InsertService"):SetBaseSetsUrl("{{ BaseUrl }}/Game/Tools/InsertAsset.ashx?nsets=10&type=base")
game:GetService("InsertService"):SetUserSetsUrl("{{ BaseUrl }}/Game/Tools/InsertAsset.ashx?nsets=20&type=user&userid=%d")
game:GetService("InsertService"):SetCollectionUrl("{{ BaseUrl }}/Game/Tools/InsertAsset.ashx?sid=%d")
game:GetService("InsertService"):SetAssetUrl("{{ BaseUrl }}/Asset/?id=%d")
game:GetService("InsertService"):SetAssetVersionUrl("{{ BaseUrl }}/Asset/?assetversionid=%d")
pcall(function() game:GetService("SocialService"):SetFriendUrl("{{ BaseUrl }}/Game/LuaWebService/HandleSocialRequest.ashx?method=IsFriendsWith&playerid=%d&userid=%d") end)
pcall(function() game:GetService("SocialService"):SetBestFriendUrl("{{ BaseUrl }}/Game/LuaWebService/HandleSocialRequest.ashx?method=IsBestFriendsWith&playerid=%d&userid=%d") end)
pcall(function() game:GetService("SocialService"):SetGroupUrl("{{ BaseUrl }}/Game/LuaWebService/HandleSocialRequest.ashx?method=IsInGroup&playerid=%d&groupid=%d") end)
pcall(function() game:GetService("SocialService"):SetGroupRankUrl("{{ BaseUrl }}/Game/LuaWebService/HandleSocialRequest.ashx?method=GetGroupRank&playerid=%d&groupid=%d") end)
pcall(function() game:GetService("SocialService"):SetGroupRoleUrl("{{ BaseUrl }}/Game/LuaWebService/HandleSocialRequest.ashx?method=GetGroupRole&playerid=%d&groupid=%d") end)
pcall(function() game:GetService("GamePassService"):SetPlayerHasPassUrl("{{ BaseUrl }}/Game/GamePass/GamePassHandler.ashx?Action=HasPass&UserID=%d&PassID=%d") end)
pcall(function() game:SetCreatorID({{ CreatorID }}, Enum.CreatorType.{{ CreatorType }}) end)
-- Bubble chat. This is all-encapsulated to allow us to turn it off with a config setting
pcall(function() game:GetService("Players"):SetChatStyle(Enum.ChatStyle.{{ ChatStyle }}) end)
local waitingForCharacter = false
pcall( function()
if settings().Network.MtuOverride == 0 then
settings().Network.MtuOverride = 1400
end
end)
-- globals -----------------------------------------
client = game:GetService("NetworkClient")
visit = game:GetService("Visit")
-- functions ---------------------------------------
function setMessage(message)
-- todo: animated "..."
if not {{ IsTeleport }} then
game:SetMessage(message)
else
-- hack, good enought for now
game:SetMessage("Teleporting ...")
end
end
function showErrorWindow(message, errorType, errorCategory)
game:SetMessage(message)
end
function reportError(err, message)
print("***ERROR*** " .. err)
if not test then visit:SetUploadUrl("") end
client:Disconnect()
wait(4)
showErrorWindow("Error: " .. err, message, "Other")
end
-- called when the client connection closes
function onDisconnection(peer, lostConnection)
if lostConnection then
showErrorWindow("You have lost the connection to the game", "LostConnection", "LostConnection")
else
showErrorWindow("This game has shut down", "Kick", "Kick")
end
end
function requestCharacter(replicator)
-- prepare code for when the Character appears
local connection
connection = player.Changed:connect(function (property)
if property=="Character" then
game:ClearMessage()
waitingForCharacter = false
connection:disconnect()
end
end)
setMessage("Requesting character")
local success, err = pcall(function()
replicator:RequestCharacter()
setMessage("Waiting for character")
waitingForCharacter = true
end)
if not success then
reportError(err,"W4C")
return
end
end
-- called when the client connection is established
function onConnectionAccepted(url, replicator)
local waitingForMarker = true
local success, err = pcall(function()
if not test then
visit:SetPing("{{ ClientPresenceUrl }}", 300)
end
if not {{ IsTeleport }} then
game:SetMessageBrickCount()
else
setMessage("Teleporting ...")
end
replicator.Disconnection:connect(onDisconnection)
-- Wait for a marker to return before creating the Player
local marker = replicator:SendMarker()
marker.Received:connect(function()
waitingForMarker = false
requestCharacter(replicator)
end)
end)
if not success then
reportError(err,"ConnectionAccepted")
return
end
-- TODO: report marker progress
while waitingForMarker do
workspace:ZoomToExtents()
wait(0.5)
end
end
-- called when the client connection fails
function onConnectionFailed(_, error)
showErrorWindow("Failed to connect to the Game. (ID=" .. error .. ")", "ID" .. error, "Other")
end
-- called when the client connection is rejected
function onConnectionRejected()
connectionFailed:disconnect()
showErrorWindow("This game is not available. Please try another", "WrongVersion", "WrongVersion")
end
idled = false
function onPlayerIdled(time)
if time > 20*60 then
showErrorWindow(string.format("You were disconnected for being idle %d minutes", time/60), "Idle", "Idle")
client:Disconnect()
if not idled then
idled = true
end
end
end
-- main ------------------------------------------------------------
pcall(function() settings().Diagnostics:LegacyScriptMode() end)
local success, err = pcall(function()
game:SetRemoteBuildMode(true)
setMessage("Connecting to Server")
client.ConnectionAccepted:connect(onConnectionAccepted)
client.ConnectionRejected:connect(onConnectionRejected)
connectionFailed = client.ConnectionFailed:connect(onConnectionFailed)
client.Ticket = "{{ PlayerTicket }}"
playerConnectSucces, player = pcall(function() return client:PlayerConnect({{ PlayerID }}, "{{ MachineAddress }}", {{ MachinePort }}, 0, threadSleepTime) end)
if not playerConnectSucces then
--Old player connection scheme
player = game:GetService("Players"):CreateLocalPlayer({{ PlayerID }})
client:Connect("{{ MachineAddress }}", {{ MachinePort }}, 0, threadSleepTime)
end
player:SetSuperSafeChat({{ PlayerSSC }})
pcall(function() player:SetMembershipType(Enum.MembershipType.{{ PlayerMembership }}) end)
pcall(function() player:SetAccountAge({{ PlayerAge }}) end)
player.Idled:connect(onPlayerIdled)
-- Overriden
onPlayerAdded(player)
pcall(function() player.Name = [========[{{ PlayerName }}]========] end)
player.CharacterAppearance = "{{ PlayerAppearance }}"
if not test then visit:SetUploadUrl("")end
end)
if not success then
reportError(err,"CreatePlayer")
end
pcall(function() game:SetScreenshotInfo("{{ ScreenshotInfo }}") end)
pcall(function() game:SetVideoInfo('{{ VideoInfo }}') end)
-- use single quotes here because the video info string may have unescaped double quotes