Haxball โ Script
);
room.on('playerJoin', (p) => room.sendChat( ๐ $p.name joined! ); if (!p.admin && room.getPlayerList().length === 1) room.setAdmin(p.id, true); room.sendChat( $p.name is now admin. );
room.on('playerChat', (p, msg) => if (msg === '!teams') Blue: $blue );
room.on('teamGoal', (team) => room.sendChat( Goal! $team === 0 ? 'Red' : 'Blue' scores. ); ); node room.js 4. Core Events (Most Useful) | Event | Trigger | Parameters | |-------|---------|------------| | playerJoin | Player enters | player object | | playerLeave | Player leaves | player object | | teamGoal | Goal scored | team (0=red,1=blue) | | playerBallKick | Player touches ball | player , velocity | | gameStart / gameStop | Match starts/ends | None | | playerChat | Chat message | player , message | | playerAdminChange | Admin given/removed | player , byPlayer | 5. Common Commands (Room API) | Command | Effect | |---------|--------| | sendChat(text) | Send global message | | setScore(red, blue) | Change scoreboard | | kickPlayer(id, reason, banMins) | Kick or ban | | setAdmin(id, admin) | Grant/revoke admin | | movePlayerToTeam(id, team) | Change team | | setStadium(stadiumName) | Change map | | setTimeLimit(minutes) | Adjust match length | | clearBans() | Unban all | 6. Creating Admin Commands Add this inside your playerChat event: Script Haxball
room.on('teamGoal', (team) => const now = Date.now(); if (now - lastTouch.time < 500) room.sendChat( Goal by $lastTouch.player.name ); else room.sendChat('Goal cancelled: no recent touch'); // Undo goal (requires score tracking yourself)
const fs = require('fs'); let stats = {}; if (fs.existsSync('stats.json')) stats = JSON.parse(fs.readFileSync('stats.json'));
room.on('roomReady', () => console.log('Room is ready!'); room.setDefaultStadium('Classic'); ); ); room
let lastTouch = player: null, time: 0 ; room.on('playerBallKick', (player, vel) => lastTouch = player: player, time: Date.now() ; );
); Use a JSON file to store wins/losses:
room.on('roomReady', () => console.log('Room ready!'); room.setScore(0, 0); room.sendChat("=== Script Loaded ==="); ); $team === 0
const Haxball = require('haxball.js'); const room = Haxball.createRoom( token: "YOUR_HAXBALL_TOKEN", // Get from haxball.com/headless roomName: "My Scripted Room", maxPlayers: 10, public: true );
room.on('playerChat', (player, message) => if (!player.admin) return; const args = message.split(' '); const cmd = args[0].toLowerCase();
room.on('playerJoin', (player) => room.sendChat( Welcome $player.name! ); );
case '!ban': const banId = parseInt(args[1]); room.kickPlayer(banId, 'Banned', 30); // 30 min ban break; case '!score': room.setScore(parseInt(args[1]), parseInt(args[2])); break; case '!stadium': room.setStadium(args[1]); break; ); Prevents goals if a player is offside (simple version).
switch(cmd) case '!kick': const targetId = parseInt(args[1]); room.kickPlayer(targetId, 'Kicked by admin', 0); room.sendChat( $player.name kicked $targetId ); break;