or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

bot-management.mdcommunication.mdcontainer-management.mdentity-management.mdgame-mechanics.mdindex.mdinventory-items.mdmovement-physics.mdworld-interaction.md

game-mechanics.mddocs/

0

# Game Mechanics

1

2

Advanced game mechanic integrations including sleep management, fishing, book writing, specialized interactions, and comprehensive gameplay automation for sophisticated bot behavior.

3

4

## Capabilities

5

6

### Sleep and Bed Management

7

8

Manage sleep cycles and bed interactions for health regeneration and time control.

9

10

```typescript { .api }

11

/**

12

* Sleep in a bed block

13

* @param bedBlock - Bed block to sleep in

14

* @returns Promise that resolves when sleep action completes

15

*/

16

sleep(bedBlock: Block): Promise<void>;

17

18

/**

19

* Check if a block is a valid bed

20

* @param bedBlock - Block to check

21

* @returns True if block is a bed

22

*/

23

isABed(bedBlock: Block): boolean;

24

25

/**

26

* Wake up from sleep

27

* @returns Promise that resolves when wake action completes

28

*/

29

wake(): Promise<void>;

30

```

31

32

**Usage Examples:**

33

34

```typescript

35

// Find and sleep in nearest bed

36

const bed = bot.findBlock({

37

matching: (block) => bot.isABed(block),

38

maxDistance: 16

39

});

40

41

if (bed) {

42

try {

43

await bot.sleep(bed);

44

console.log("Bot is now sleeping");

45

46

// Wake up after some time

47

setTimeout(async () => {

48

await bot.wake();

49

console.log("Bot woke up");

50

}, 10000);

51

} catch (error) {

52

console.log("Could not sleep:", error.message);

53

}

54

}

55

56

// Auto-sleep at night

57

bot.on("time", () => {

58

if (!bot.time.isDay && !bot.isSleeping) {

59

const nearbyBed = bot.findBlock({

60

matching: (block) => bot.isABed(block),

61

maxDistance: 20

62

});

63

64

if (nearbyBed) {

65

bot.sleep(nearbyBed).catch(console.error);

66

}

67

}

68

});

69

```

70

71

### Fishing System

72

73

Automated fishing with timing and item collection.

74

75

```typescript { .api }

76

/**

77

* Start fishing with equipped fishing rod

78

* @returns Promise that resolves when fishing completes (catch or timeout)

79

*/

80

fish(): Promise<void>;

81

82

/**

83

* Check if bot is currently using held item (like fishing rod)

84

*/

85

readonly usingHeldItem: boolean;

86

```

87

88

**Usage Examples:**

89

90

```typescript

91

// Basic fishing

92

const fishingRod = bot.inventory.findItem("fishing_rod");

93

if (fishingRod) {

94

await bot.equip(fishingRod, "hand");

95

96

// Look at water

97

const water = bot.findBlock({

98

matching: (block) => block.name === "water",

99

maxDistance: 10

100

});

101

102

if (water) {

103

await bot.lookAt(water.position);

104

await bot.fish();

105

console.log("Caught something!");

106

}

107

}

108

109

// Automated fishing loop

110

async function autoFish(duration: number) {

111

const fishingRod = bot.inventory.findItem("fishing_rod");

112

if (!fishingRod) {

113

console.log("No fishing rod found");

114

return;

115

}

116

117

await bot.equip(fishingRod, "hand");

118

119

const endTime = Date.now() + duration;

120

let catches = 0;

121

122

while (Date.now() < endTime) {

123

try {

124

await bot.fish();

125

catches++;

126

console.log(`Caught item #${catches}`);

127

128

// Brief pause between catches

129

await new Promise(resolve => setTimeout(resolve, 1000));

130

} catch (error) {

131

console.log("Fishing failed:", error.message);

132

break;

133

}

134

}

135

136

console.log(`Fishing session ended. Total catches: ${catches}`);

137

}

138

139

// Auto-fish for 10 minutes

140

autoFish(10 * 60 * 1000);

141

```

142

143

### Book Writing and Editing

144

145

Write and edit books and written books with custom content.

146

147

```typescript { .api }

148

/**

149

* Write content to a book

150

* @param slot - Inventory slot containing the book

151

* @param pages - Array of page contents (strings)

152

* @returns Promise that resolves when writing completes

153

*/

154

writeBook(slot: number, pages: string[]): Promise<void>;

155

```

156

157

**Usage Examples:**

158

159

```typescript

160

// Write a simple book

161

const book = bot.inventory.findItem("writable_book");

162

if (book) {

163

const pages = [

164

"Chapter 1: The Beginning\n\nOnce upon a time, in a world made of blocks...",

165

"Chapter 2: The Adventure\n\nOur hero ventured forth into the dangerous caves...",

166

"Chapter 3: The End\n\nAnd they lived happily ever after.\n\nThe End."

167

];

168

169

await bot.writeBook(book.slot, pages);

170

console.log("Book written successfully!");

171

}

172

173

// Create a diary entry

174

async function writeDiary() {

175

const book = bot.inventory.findItem("writable_book");

176

if (!book) return;

177

178

const date = new Date().toLocaleDateString();

179

const time = bot.time.timeOfDay;

180

const weather = bot.isRaining ? "raining" : "clear";

181

const pos = bot.entity.position;

182

183

const diaryEntry = [

184

`Diary Entry - ${date}\n\nTime: ${time}\nWeather: ${weather}\nLocation: ${pos.x.toFixed(1)}, ${pos.y.toFixed(1)}, ${pos.z.toFixed(1)}`,

185

`Today I explored the world and learned many things about survival in Minecraft...`,

186

`Health: ${bot.health}/20\nFood: ${bot.food}/20\n\nUntil tomorrow,\n- Bot`

187

];

188

189

await bot.writeBook(book.slot, diaryEntry);

190

}

191

192

// Auto-documentation system

193

async function documentDiscoveries() {

194

const discoveries: string[] = [];

195

196

// Track new blocks discovered

197

bot.on("blockUpdate", (oldBlock, newBlock) => {

198

if (newBlock && !oldBlock) {

199

discoveries.push(`Found ${newBlock.name} at ${newBlock.position}`);

200

}

201

});

202

203

// Track new entities

204

bot.on("entitySpawn", (entity) => {

205

discoveries.push(`Encountered ${entity.type} at ${entity.position}`);

206

});

207

208

// Write discoveries to book every hour

209

setInterval(async () => {

210

if (discoveries.length > 0) {

211

const book = bot.inventory.findItem("writable_book");

212

if (book) {

213

const pages = [];

214

let currentPage = "Discoveries:\n\n";

215

216

for (const discovery of discoveries) {

217

if (currentPage.length + discovery.length > 256) {

218

pages.push(currentPage);

219

currentPage = discovery + "\n";

220

} else {

221

currentPage += discovery + "\n";

222

}

223

}

224

225

if (currentPage.length > 0) {

226

pages.push(currentPage);

227

}

228

229

await bot.writeBook(book.slot, pages);

230

discoveries.length = 0; // Clear discoveries

231

}

232

}

233

}, 3600000); // Every hour

234

}

235

```

236

237

### Command Block Management

238

239

Set and configure command blocks for automated server operations.

240

241

```typescript { .api }

242

/**

243

* Set a command block with specific command and options

244

* @param pos - Position of the command block

245

* @param command - Command to set

246

* @param options - Command block configuration

247

*/

248

setCommandBlock(pos: Vec3, command: string, options: CommandBlockOptions): void;

249

250

interface CommandBlockOptions {

251

/** Command block mode (0=impulse, 1=chain, 2=repeat) */

252

mode: number;

253

/** Track command output */

254

trackOutput: boolean;

255

/** Conditional execution */

256

conditional: boolean;

257

/** Always active */

258

alwaysActive: boolean;

259

}

260

```

261

262

**Usage Examples:**

263

264

```typescript

265

// Set up automated farm with command blocks

266

const commandBlockPos = new Vec3(100, 64, 200);

267

268

// Set a repeating command block

269

bot.setCommandBlock(commandBlockPos, "/say Automated message", {

270

mode: 2, // Repeat mode

271

trackOutput: true,

272

conditional: false,

273

alwaysActive: true

274

});

275

276

// Chain of command blocks for complex automation

277

const commands = [

278

"/fill ~1 ~-1 ~1 ~10 ~-1 ~10 minecraft:farmland",

279

"/fill ~1 ~ ~1 ~10 ~ ~10 minecraft:water",

280

"/give @p minecraft:wheat_seeds 64"

281

];

282

283

for (let i = 0; i < commands.length; i++) {

284

const pos = commandBlockPos.offset(i, 0, 0);

285

bot.setCommandBlock(pos, commands[i], {

286

mode: i === 0 ? 0 : 1, // First impulse, rest chain

287

trackOutput: true,

288

conditional: false,

289

alwaysActive: false

290

});

291

}

292

```

293

294

### Trading and Villager Management

295

296

Advanced villager trading with reputation management and trade optimization.

297

298

```typescript { .api }

299

/**

300

* Execute a trade with a villager

301

* @param villagerInstance - Open villager trading window

302

* @param tradeIndex - Index of the trade to execute

303

* @param times - Number of times to execute the trade

304

* @returns Promise that resolves when trading completes

305

*/

306

trade(villagerInstance: Villager, tradeIndex: string | number, times?: number): Promise<void>;

307

```

308

309

**Usage Examples:**

310

311

```typescript

312

// Optimize trading with multiple villagers

313

async function optimizeTrading() {

314

const villagers = Object.values(bot.entities).filter(entity =>

315

entity.name === "villager"

316

);

317

318

for (const villager of villagers) {

319

try {

320

const villagerWindow = await bot.openVillager(villager);

321

await new Promise<void>(resolve => villagerWindow.on("ready", resolve));

322

323

// Find best emerald trades

324

const emeraldTrades = villagerWindow.trades.filter(trade =>

325

trade.outputItem.name === "emerald" && !trade.tradeDisabled

326

);

327

328

for (const trade of emeraldTrades) {

329

const inputCount = bot.inventory.count(trade.inputItem1.type);

330

const maxTrades = Math.min(

331

Math.floor(inputCount / trade.inputItem1.count),

332

trade.maximumNbTradeUses - trade.nbTradeUses

333

);

334

335

if (maxTrades > 0) {

336

await bot.trade(villagerWindow, villagerWindow.trades.indexOf(trade), maxTrades);

337

console.log(`Traded ${maxTrades} times with villager`);

338

}

339

}

340

341

villagerWindow.close();

342

} catch (error) {

343

console.log("Trading failed:", error.message);

344

}

345

}

346

}

347

348

// Create emerald farm

349

async function createEmeraldFarm() {

350

// Find farmer villager

351

const farmer = Object.values(bot.entities).find(entity =>

352

entity.name === "villager" && entity.metadata[13] === 0

353

);

354

355

if (!farmer) return;

356

357

// Plant crops nearby

358

const farmArea = bot.findBlocks({

359

matching: (block) => block.name === "farmland",

360

maxDistance: 20,

361

count: 100

362

});

363

364

const seeds = bot.inventory.items().filter(item =>

365

item.name.includes("seeds") || item.name === "carrot" || item.name === "potato"

366

);

367

368

for (const seedType of seeds) {

369

for (const farmPos of farmArea) {

370

const airBlock = bot.blockAt(farmPos.offset(0, 1, 0));

371

if (airBlock && airBlock.type === 0) {

372

await bot.equip(seedType, "hand");

373

await bot.placeBlock(bot.blockAt(farmPos)!, new Vec3(0, 1, 0));

374

break;

375

}

376

}

377

}

378

379

console.log("Farm planted for emerald trading");

380

}

381

```

382

383

### Advanced Game State Management

384

385

Monitor and react to various game state changes and environmental conditions.

386

387

```typescript { .api }

388

interface Bot {

389

/** Whether bot is currently sleeping */

390

isSleeping: boolean;

391

/** Current weather state */

392

isRaining: boolean;

393

/** Thunder state */

394

thunderState: number;

395

/** Game time information */

396

time: Time;

397

/** Current experience */

398

experience: Experience;

399

}

400

401

interface Time {

402

/** Whether daylight cycle is enabled */

403

doDaylightCycle: boolean;

404

/** Full time value as BigInt */

405

bigTime: BigInt;

406

/** Time in ticks */

407

time: number;

408

/** Time of day (0-24000) */

409

timeOfDay: number;

410

/** Current day number */

411

day: number;

412

/** Whether it's daytime */

413

isDay: boolean;

414

/** Moon phase (0-7) */

415

moonPhase: number;

416

/** World age as BigInt */

417

bigAge: BigInt;

418

/** World age in ticks */

419

age: number;

420

}

421

422

interface Experience {

423

/** Experience level */

424

level: number;

425

/** Total experience points */

426

points: number;

427

/** Progress to next level (0-1) */

428

progress: number;

429

}

430

```

431

432

### Game Events and Reactions

433

434

React to various game events and environmental changes.

435

436

```typescript { .api }

437

interface BotEvents {

438

/** Sleep state changed */

439

sleep(): void;

440

wake(): void;

441

442

/** Weather events */

443

rain(): void;

444

445

/** Time events */

446

time(): void;

447

448

/** Experience gained */

449

experience(): void;

450

451

/** Death and respawn */

452

death(): void;

453

respawn(): void;

454

455

/** Health and status */

456

health(): void;

457

breath(): void;

458

459

/** Firework usage */

460

usedFirework(): void;

461

462

/** Spawn point changes */

463

spawnReset(): void;

464

}

465

```

466

467

**Usage Examples:**

468

469

```typescript

470

// React to weather changes

471

bot.on("rain", () => {

472

if (bot.isRaining) {

473

console.log("It started raining, seeking shelter");

474

const shelter = bot.findBlock({

475

matching: (block) => block.name.includes("roof") || block.name.includes("house"),

476

maxDistance: 50

477

});

478

479

if (shelter) {

480

// Move to shelter logic here

481

}

482

} else {

483

console.log("Rain stopped, can go outside");

484

}

485

});

486

487

// Time-based behavior

488

bot.on("time", () => {

489

const timeOfDay = bot.time.timeOfDay;

490

491

if (timeOfDay === 0) {

492

console.log("New day started!");

493

} else if (timeOfDay === 12000) {

494

console.log("Nighttime, being cautious");

495

// Enable defensive behavior

496

} else if (timeOfDay === 23000) {

497

console.log("Almost dawn, preparing for day");

498

}

499

});

500

501

// Experience tracking

502

bot.on("experience", () => {

503

console.log(`Level: ${bot.experience.level}, XP: ${bot.experience.points}`);

504

505

if (bot.experience.level % 5 === 0) {

506

bot.chat(`Reached level ${bot.experience.level}!`);

507

}

508

});

509

510

// Health monitoring

511

bot.on("health", () => {

512

if (bot.health < 6) {

513

console.log("Low health! Seeking food and safety");

514

515

// Find food

516

const food = bot.inventory.items().find(item =>

517

["bread", "apple", "cooked_beef", "golden_apple"].includes(item.name)

518

);

519

520

if (food) {

521

bot.equip(food, "hand").then(() => bot.consume()).catch(console.error);

522

}

523

}

524

});

525

526

// Auto-respawn system

527

bot.on("death", () => {

528

console.log("Bot died, respawning soon...");

529

});

530

531

bot.on("respawn", () => {

532

console.log("Bot respawned");

533

534

// Return to last known safe location

535

const safeLocation = new Vec3(0, 64, 0); // Spawn area

536

// Navigation logic here

537

});

538

539

// Comprehensive game state monitor

540

function monitorGameState() {

541

setInterval(() => {

542

const status = {

543

health: bot.health,

544

food: bot.food,

545

level: bot.experience.level,

546

time: bot.time.timeOfDay,

547

weather: bot.isRaining ? "rain" : "clear",

548

position: bot.entity.position,

549

dimension: bot.game.dimension

550

};

551

552

console.log("Bot Status:", JSON.stringify(status, null, 2));

553

}, 60000); // Every minute

554

}

555

556

monitorGameState();

557

```