Server Dashboard
Total Rooms
0
Online Players
0
Waiting
0
Playing
0
Active Rooms
CodeTypeStatusPlayersTimeMapCreated
Players
NameUser IDItemStatus
Select a room
API Documentation
Base URL
-WebSocket
-
Room Management
5 endpoints
POST
/api/rooms/quickplay
Find available room or create new one
Request Body
{
"map": "track_1",
"timeLimit": 90
}Response 200
{
"roomId": "ABC123",
"type": "public"
}
POST
/api/rooms/public
Create a public room
Request Body
{
"map": "track_1",
"timeLimit": 90
}Response 200
{
"roomId": "XYZ789",
"type": "public"
}
POST
/api/rooms/private
Create a private room
Request Body
{
"map": "track_1",
"timeLimit": 90
}Response 200
{
"roomId": "ABC123",
"type": "private"
}
GET
/api/rooms/list
List all public rooms
Response 200
{
"count": 2,
"rooms": [
{
"roomId": "ABC123",
"map": "track_1",
"playerCount": 3,
"maxPlayers": 5,
"status": "waiting",
"type": "public",
"timeLimit": 90,
"createdAt": 1706612345
}
]
}
GET
/api/rooms/{roomId}
Get room details
Parameters
roomIdstringRoom code (e.g. ABC123)
Response 200
{
"id": "ABC123",
"type": "public",
"status": "waiting",
"map": "track_1",
"maxPlayers": 5,
"timeLimit": 90,
"timeLeft": 90,
"players": {},
"boosters": {},
"traps": {}
}
History & Stats
3 endpoints
GET
/api/history/room/{roomId}
Get game history for a room
Parameters
roomIdstringRoom code
Response 200
{
"roomId": "ABC123",
"map": "track_1",
"type": "public",
"duration": 85,
"playerCount": 4,
"winners": [
{"userId": "u1", "name": "Player1", "position": 1, "time": 45}
]
}
GET
/api/history/user/{userId}
Get user's game history
Parameters
userIdstringUser ID
limitintMax results (default 10)
Response 200
{
"history": [
{"roomId": "ABC123", "map": "track_1", "duration": 85, "playerCount": 4}
]
}
GET
/api/stats
Get global game statistics
Response 200
{
"total_games": 150,
"avg_duration": 72.5,
"by_time_limit": {"60": 30, "90": 80, "180": 40}
}
Response Examples
Full Data Samples
Room Waiting (with Players)
Room yang sedang menunggu pemain ready
{
"id": "ABC123",
"type": "public",
"status": "waiting",
"map": "track_1",
"maxPlayers": 5,
"timeLimit": 90,
"timeLeft": 90,
"createdAt": "2026-01-30T15:30:00+07:00",
"players": {
"player-uuid-1": {
"id": "player-uuid-1",
"userId": "user-123",
"name": "SpeedRacer",
"skin": "ninja_red",
"isReady": true,
"isFinished": false,
"finishTime": 0,
"finishPosition": 0,
"heldItem": null,
"position": {"x": 0, "y": 0, "z": 0}
},
"player-uuid-2": {
"id": "player-uuid-2",
"userId": "user-456",
"name": "TurboKing",
"skin": "robot_blue",
"isReady": false,
"isFinished": false,
"finishTime": 0,
"finishPosition": 0,
"heldItem": null,
"position": {"x": 0, "y": 0, "z": 0}
}
},
"boosters": {},
"traps": {}
}
Room Playing (Active Game)
Room yang sedang bermain dengan item boxes, player holding items, dan traps
{
"id": "XYZ789",
"type": "public",
"status": "playing",
"map": "track_1",
"maxPlayers": 5,
"timeLimit": 90,
"timeLeft": 45,
"createdAt": "2026-01-30T15:30:00+07:00",
"startedAt": "2026-01-30T15:31:00+07:00",
"players": {
"player-uuid-1": {
"id": "player-uuid-1",
"userId": "user-123",
"name": "SpeedRacer",
"skin": "ninja_red",
"isReady": true,
"isFinished": false,
"finishTime": 0,
"finishPosition": 0,
"heldItem": {
"type": "bomb",
"obtainedAt": "2026-01-30T15:31:30+07:00"
},
"position": {"x": 125.5, "y": 2.0, "z": 340.8}
},
"player-uuid-2": {
"id": "player-uuid-2",
"userId": "user-456",
"name": "TurboKing",
"skin": "robot_blue",
"isReady": true,
"isFinished": true,
"finishTime": 42,
"finishPosition": 1,
"heldItem": null,
"position": {"x": 500.0, "y": 0, "z": 1000.0}
},
"player-uuid-3": {
"id": "player-uuid-3",
"userId": "user-789",
"name": "NitroBlast",
"skin": "alien_green",
"isReady": true,
"isFinished": false,
"finishTime": 0,
"finishPosition": 0,
"heldItem": {
"type": "shield",
"obtainedAt": "2026-01-30T15:32:00+07:00"
},
"position": {"x": 89.2, "y": 1.5, "z": 280.3}
}
},
"boosters": {
"box-uuid-1": {
"id": "box-uuid-1",
"type": "speed_boost",
"position": {"x": 50.0, "y": 0, "z": 100.0},
"taken": true,
"takenBy": "player-uuid-1"
},
"box-uuid-2": {
"id": "box-uuid-2",
"type": "lightning",
"position": {"x": 150.0, "y": 0, "z": 300.0},
"taken": false,
"takenBy": ""
},
"box-uuid-3": {
"id": "box-uuid-3",
"type": "freeze",
"position": {"x": 250.0, "y": 0, "z": 500.0},
"taken": false,
"takenBy": ""
}
},
"traps": {
"trap-uuid-1": {
"id": "trap-uuid-1",
"type": "bomb",
"placedBy": "player-uuid-2",
"position": {"x": 180.5, "y": 0, "z": 420.3},
"radius": 8.0,
"active": true,
"createdAt": "2026-01-30T15:32:15+07:00"
},
"trap-uuid-2": {
"id": "trap-uuid-2",
"type": "freeze",
"placedBy": "player-uuid-1",
"position": {"x": 95.0, "y": 0, "z": 200.0},
"radius": 5.0,
"active": false,
"triggeredBy": "player-uuid-3",
"createdAt": "2026-01-30T15:31:45+07:00"
}
}
}
Room Ended (Game Finished)
Room yang sudah selesai dengan hasil akhir
{
"id": "DEF456",
"type": "public",
"status": "ended",
"map": "track_1",
"maxPlayers": 5,
"timeLimit": 90,
"timeLeft": 0,
"createdAt": "2026-01-30T15:00:00+07:00",
"startedAt": "2026-01-30T15:01:00+07:00",
"endedAt": "2026-01-30T15:02:30+07:00",
"players": {
"player-uuid-1": {
"id": "player-uuid-1",
"userId": "user-123",
"name": "SpeedRacer",
"isFinished": true,
"finishTime": 45,
"finishPosition": 1,
"heldItem": null
},
"player-uuid-2": {
"id": "player-uuid-2",
"userId": "user-456",
"name": "TurboKing",
"isFinished": true,
"finishTime": 52,
"finishPosition": 2,
"heldItem": null
},
"player-uuid-3": {
"id": "player-uuid-3",
"userId": "user-789",
"name": "NitroBlast",
"isFinished": true,
"finishTime": 68,
"finishPosition": 3,
"heldItem": null
}
},
"boosters": {},
"traps": {}
}
Game Start Event
Event yang dikirim server saat game dimulai
{
"type": "game_start",
"payload": {
"roomId": "ABC123",
"timeLeft": 90,
"players": [
{"id": "p1", "userId": "user-123", "name": "SpeedRacer", "skin": "ninja_red"},
{"id": "p2", "userId": "user-456", "name": "TurboKing", "skin": "robot_blue"}
],
"boosters": [
{"id": "box-1", "type": "bomb", "position": {"x": 50, "y": 0, "z": 100}, "taken": false},
{"id": "box-2", "type": "shield", "position": {"x": 150, "y": 0, "z": 300}, "taken": false},
{"id": "box-3", "type": "speed_boost", "position": {"x": 250, "y": 0, "z": 500}, "taken": false}
]
}
}
Game End Event
Event yang dikirim server saat game selesai
{
"type": "game_end",
"payload": {
"roomId": "ABC123",
"finishedPlayers": ["player-uuid-1", "player-uuid-2", "player-uuid-3"],
"winners": [
{"userId": "user-123", "name": "SpeedRacer", "position": 1, "time": 45},
{"userId": "user-456", "name": "TurboKing", "position": 2, "time": 52},
{"userId": "user-789", "name": "NitroBlast", "position": 3, "time": 68}
]
}
}
WebSocket Events
Client & Server
Connect to: wss://gameapi.copod.my.id/ws/{roomId}
Client → Server
player_joined
{"type":"player_joined","payload":{"userId":"x","name":"Player","skin":"ninja"}}player_ready
{"type":"player_ready","payload":{}}player_unready
{"type":"player_unready","payload":{}}position_update
{"type":"position_update","payload":{"playerId":"x","x":10.5,"y":0,"z":20.3}}item_taken
{"type":"item_taken","payload":{"boosterId":"box-id","playerId":"player-id"}}item_used
{"type":"item_used","payload":{"playerId":"x","itemType":"bomb","x":10,"y":0,"z":5}}trap_triggered
{"type":"trap_triggered","payload":{"trapId":"trap-id","victimId":"player-id"}}player_finish
{"type":"player_finish","payload":{}}Server → Client
room_updateFull room state on join
game_startGame started with boosters & players
timer_update
{"type":"timer_update","payload":{"timeLeft":85}}trap_placed
{"type":"trap_placed","payload":{"trapId":"x","type":"bomb","x":10,"y":0,"z":5,"radius":8}}trap_hit
{"type":"trap_hit","payload":{"trapId":"x","victimIds":["p1","p2"],"attackerId":"p3"}}player_finish
{"type":"player_finish","payload":{"playerId":"x","position":1,"time":45}}game_endGame ended with winners list
Item Types
bomblightningshield
speed_boostjump_boostfreezeteleport
Response
Game History
Search Games
RoomMapDurationPlayersWinnersDate
Enter User ID to search
Admin Management
UserUsernameCreatedLast LoginAction