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) |