Other objects:
- Workspace
- MCCurrentPlayers (Folder)
- ServerStorage
- MCServerLink
- MakeRequest (BindableEvent)
- PlayerAdded (BindableEvent)
- PlayerMove (BindableEvent)
- PlayerRemoving (BindableEvent)
- Base (Model)
- MCServerLink
Other objects:
local HttpService = game:GetService('HttpService') | |
local ServerStorage = game:GetService('ServerStorage') | |
local Storage = ServerStorage.MCServerLink | |
local MakeRequest = Storage.MakeRequest | |
local PlayerAdded = Storage.PlayerAdded | |
local PlayerRemoving = Storage.PlayerRemoving | |
local PlayerMove = Storage.PlayerMove | |
local Url = 'http://localhost:29295' | |
-- key is the username, value is always true | |
-- this loses order, but is faster than an ordered table | |
local CurrentPlayers = {} | |
local function HandleMakeRequest() | |
print('Requesting...') | |
local Positions = HttpService:JSONDecode(HttpService:GetAsync(Url)) | |
print('Got data') | |
for Username, _ in pairs(CurrentPlayers) do | |
if not Positions[Username] then | |
print('Player removed: '..Username) | |
PlayerRemoving:Fire(Username) | |
end | |
end | |
for Username, PositionData in pairs(Positions) do | |
local Position = Vector3.new(PositionData['x'], PositionData['y'], PositionData['z']) | |
local Orientation = Vector3.new(0, PositionData['yaw'], -PositionData['pitch']) | |
if not CurrentPlayers[Username] then | |
print('Player added: '..Username) | |
PlayerAdded:Fire(Username, Position, Orientation) | |
CurrentPlayers[Username] = true | |
else | |
print('Player moved: '..Username) | |
PlayerMove:Fire(Username, Position, Orientation) | |
end | |
end | |
end | |
MakeRequest.Event:Connect(HandleMakeRequest) | |
print('HttpHandler ready') | |
while wait(1/6) do | |
MakeRequest:Fire() | |
end |
local HttpService = game:GetService('HttpService') | |
local ServerStorage = game:GetService('ServerStorage') | |
local TextService = game:GetService('TextService') | |
local TweenService = game:GetService('TweenService') | |
local Storage = ServerStorage.MCServerLink | |
local PlayerAdded = Storage.PlayerAdded | |
local PlayerRemoving = Storage.PlayerRemoving | |
local PlayerMove = Storage.PlayerMove | |
local BaseModel = Storage.Base | |
local CurrentPlayersFolder = workspace.MCCurrentPlayers | |
local TInfo = TweenInfo.new(1/6, Enum.EasingStyle.Linear, Enum.EasingDirection.In, 0, false) | |
local function GetPlayerModel(Username) | |
local Model = CurrentPlayersFolder:FindFirstChild(Username) | |
if not Model then | |
Model = BaseModel:Clone() | |
Model.Name = Username | |
Model.Head.NameGui.NameLabel.Text = Username | |
-- not depending on the label here | |
local TextSize = TextService:GetTextSize(Username, 100, Enum.Font.Gotham, Vector2.new(2000, 100)) | |
Model.Head.NameGui.Background.Size = UDim2.new((TextSize.X / 2000) + 0.01, 0, 1, 0) | |
Model.Parent = CurrentPlayersFolder | |
end | |
return Model | |
end | |
local function MovePlayer(Model, Position, Orientation) | |
local CF = CFrame.Angles(0, -math.rad(Orientation.Y + 180), 0) | |
CF = CF:ToWorldSpace(CFrame.new()) | |
local Goal = {['CFrame'] = CF + (Position * 4)} | |
local Tween = TweenService:Create(Model.PrimaryPart, TInfo, Goal) | |
Tween:Play() | |
end | |
local function HandlePlayerChange(Username, Position, Orientation) | |
local Model = GetPlayerModel(Username) | |
MovePlayer(Model, Position, Orientation) | |
end | |
local function HandlePlayerRemove(Username) | |
local Model = CurrentPlayersFolder:FindFirstChild(Username) | |
if Model then | |
Model:Destroy() | |
end | |
end | |
PlayerAdded.Event:Connect(HandlePlayerChange) | |
PlayerMove.Event:Connect(HandlePlayerChange) | |
PlayerRemoving.Event:Connect(HandlePlayerRemove) |