150 lines
4.9 KiB
Lua
150 lines
4.9 KiB
Lua
--TODO: add play solo
|
|
|
|
EnforceMaxPlayers=false;
|
|
SysopConnections={};
|
|
IPBannedlist={};
|
|
|
|
function IncommingConnection(Peer, Replicator)
|
|
for Index,Value in pairs(IPBannedlist) do
|
|
if (Value == Replicator.MachineAddress) then
|
|
Replicator:CloseConnection();
|
|
end
|
|
end
|
|
end
|
|
|
|
function CSServer(Port,Limit)
|
|
assert((type(Port)~="number" or tonumber(Port)~=nil or Port==nil),"CSRun Error: Port must be nil or a number.");
|
|
local NetworkServer=game:GetService("NetworkServer");
|
|
if (Limit) then
|
|
NetworkServer:SetOutgoingKBPSLimit(Limit)
|
|
end
|
|
pcall(NetworkServer.Stop,NetworkServer);
|
|
NetworkServer:Start(Port);
|
|
game:GetService("Players").PlayerAdded:connect(function(Player)
|
|
Player:LoadCharacter();
|
|
Player.Changed:connect(function(Property)
|
|
if (Property=="Character") and (Player.Character~=nil) then
|
|
local Character=Player.Character;
|
|
local Humanoid=Character:FindFirstChild("Humanoid");
|
|
if (Humanoid~=nil) then
|
|
Humanoid.Died:connect(function() delay(5,function() Player:LoadCharacter() end) end)
|
|
end
|
|
end
|
|
end)
|
|
end)
|
|
game:GetService("RunService"):Run();
|
|
pcall(function() game.Close:connect(function() NetworkServer:Stop(); end) end);
|
|
-- ChildAdded is being a retard. Sorry for inefficient code.
|
|
--[[while wait(0.1) do
|
|
print("OMG",#game.NetworkServer:children())
|
|
for Index,Child in pairs(NetworkServer:GetChildren()) do
|
|
if (Child.className == "") then
|
|
IncommingConnection(nil, Child);
|
|
end
|
|
end
|
|
end]]
|
|
NetworkServer.IncommingConnection:connect(IncommingConnection);
|
|
end
|
|
|
|
function CSConnect(UserID,ServerIP,ServerPort,PlayerName,Ticket,Limit)
|
|
pcall(function()
|
|
game:GetService("GuiService").Changed:connect(function()
|
|
pcall(function() game:GetService("GuiService").ShowLegacyPlayerList=true; end);
|
|
pcall(function() game.CoreGui.RobloxGui.PlayerListScript:Remove(); end);
|
|
pcall(function() game.CoreGui.RobloxGui.PlayerListTopRightFrame:Remove(); end);
|
|
pcall(function() game.CoreGui.RobloxGui.BigPlayerListWindowImposter:Remove(); end);
|
|
pcall(function() game.CoreGui.RobloxGui.BigPlayerlist:Remove(); end);
|
|
end);
|
|
end)
|
|
game:GetService("RunService"):Run();
|
|
assert((ServerIP~=nil and ServerPort~=nil),"CSConnect Error: ServerIP and ServerPort must be defined.");
|
|
local function SetMessage(Message) game:SetMessage(Message); end
|
|
local Visit,NetworkClient,PlayerSuccess,Player,ConnectionFailedHook=game:GetService("Visit"),game:GetService("NetworkClient");
|
|
|
|
local function GetClassCount(Class,Parent)
|
|
local Objects=Parent:GetChildren();
|
|
local Number=0;
|
|
for Index,Object in pairs(Objects) do
|
|
if (Object.className==Class) then
|
|
Number=Number+1;
|
|
end
|
|
Number=Number+GetClassCount(Class,Object);
|
|
end
|
|
return Number;
|
|
end
|
|
|
|
local function RequestCharacter(Replicator)
|
|
local Connection;
|
|
Connection=Player.Changed:connect(function(Property)
|
|
if (Property=="Character") then
|
|
game:ClearMessage();
|
|
end
|
|
end)
|
|
SetMessage("Requesting character...");
|
|
Replicator:RequestCharacter();
|
|
SetMessage("Waiting for character...");
|
|
end
|
|
|
|
local function Disconnection(Peer,LostConnection)
|
|
if (LostConnection==true) then
|
|
SetMessage("You have lost connection to the game");
|
|
else
|
|
SetMessage("You have lost connection to the game");
|
|
end
|
|
end
|
|
|
|
local function ConnectionAccepted(Peer,Replicator)
|
|
Replicator.Disconnection:connect(Disconnection);
|
|
local RequestingMarker=true;
|
|
game:SetMessageBrickCount();
|
|
local Marker=Replicator:SendMarker();
|
|
Marker.Received:connect(function()
|
|
RequestingMarker=false;
|
|
RequestCharacter(Replicator)
|
|
end)
|
|
while RequestingMarker do
|
|
Workspace:ZoomToExtents();
|
|
wait(0.5);
|
|
end
|
|
end
|
|
|
|
local function ConnectionFailed(Peer,Code)
|
|
SetMessage("Failed to connect to the Game. (ID="..Code..")");
|
|
end
|
|
|
|
pcall(function() settings().Diagnostics:LegacyScriptMode(); end);
|
|
pcall(function() game:SetRemoteBuildMode(true); end);
|
|
SetMessage("Progress: Connecting to the server ...");
|
|
NetworkClient.ConnectionAccepted:connect(ConnectionAccepted);
|
|
ConnectionFailedHook=NetworkClient.ConnectionFailed:connect(ConnectionFailed);
|
|
NetworkClient.ConnectionRejected:connect(function()
|
|
pcall(function() ConnectionFailedHook:disconnect(); end);
|
|
SetMessage("Failed to connect to the Game. (Connection rejected)");
|
|
end)
|
|
|
|
pcall(function() NetworkClient.Ticket=Ticket or ""; end) -- 2008 client has no ticket :O
|
|
if (Limit) then
|
|
NetworkClient:SetOutgoingKBPSLimit(Limit)
|
|
end
|
|
Player=game:GetService("Players"):CreateLocalPlayer(UserID);
|
|
PlayerSuccess=pcall(function() return NetworkClient:Connect(ServerIP,ServerPort) end);
|
|
|
|
if (not PlayerSuccess) then
|
|
SetMessage("Failed to connect to the Game. (Invalid IP Address");
|
|
NetworkClient:Disconnect();
|
|
end
|
|
|
|
if (not Player) then
|
|
SetMessage("Failed to connect to the Game. (Player not found)");
|
|
NetworkClient:Disconnect();
|
|
end
|
|
|
|
Player:SetSuperSafeChat(false);
|
|
Player.CharacterAppearance=0;
|
|
pcall(function() Player.Name=PlayerName or ""; end);
|
|
pcall(function() Visit:SetUploadUrl(""); end);
|
|
end
|
|
|
|
_G.CSServer=CSServer;
|
|
_G.CSConnect=CSConnect;
|