Security fixes, UI improvements, and game balance updates
- Fixed critical security vulnerabilities in shop targeting system - Fixed admin authentication bypass issues - Fixed auto-rearm feature config path (duck_spawning.rearm_on_duck_shot) - Updated duck spawn timing to 20-60 minutes for better game balance - Enhanced inventory display formatting with proper spacing - Added comprehensive admin security documentation
This commit is contained in:
46
ADMIN_SECURITY.md
Normal file
46
ADMIN_SECURITY.md
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
# Enhanced Admin Configuration
|
||||||
|
|
||||||
|
For better security, update your `config.json` to use hostmask-based admin authentication:
|
||||||
|
|
||||||
|
## Current (Less Secure) - Nick Only:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"admins": [
|
||||||
|
"peorth",
|
||||||
|
"computertech",
|
||||||
|
"colby"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Recommended (More Secure) - Hostmask Based:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"admins": [
|
||||||
|
{
|
||||||
|
"nick": "peorth",
|
||||||
|
"hostmask": "peorth!*@trusted.domain.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nick": "computertech",
|
||||||
|
"hostmask": "computertech!*@*.isp.net"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nick": "colby",
|
||||||
|
"hostmask": "colby!user@192.168.*.*"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Migration Notes:
|
||||||
|
- The bot supports both formats for backward compatibility
|
||||||
|
- Nick-only authentication generates security warnings in logs
|
||||||
|
- Hostmask patterns use shell-style wildcards (* and ?)
|
||||||
|
- Consider using registered nick services for additional security
|
||||||
|
|
||||||
|
## Security Benefits:
|
||||||
|
- Prevents nick spoofing attacks
|
||||||
|
- Allows IP/hostname restrictions
|
||||||
|
- Provides audit logging of admin access
|
||||||
|
- Maintains backward compatibility during migration
|
||||||
127
CONFIG.md
127
CONFIG.md
@@ -1,127 +0,0 @@
|
|||||||
# DuckHunt Bot Configuration Guide
|
|
||||||
|
|
||||||
This document explains all configuration options in `config.json`.
|
|
||||||
|
|
||||||
## 📡 IRC Connection Settings (`connection`)
|
|
||||||
|
|
||||||
| Setting | Description | Example |
|
|
||||||
|---------|-------------|---------|
|
|
||||||
| `server` | IRC server hostname | `"irc.rizon.net"` |
|
|
||||||
| `port` | IRC server port | `6697` (SSL) or `6667` (non-SSL) |
|
|
||||||
| `nick` | Bot's nickname on IRC | `"DuckHunt"` |
|
|
||||||
| `channels` | List of channels to auto-join | `["#channel1", "#channel2"]` |
|
|
||||||
| `ssl` | Use SSL/TLS encryption | `true` (recommended) |
|
|
||||||
| `password` | Server password (I-Line auth) | Change if server requires auth |
|
|
||||||
| `max_retries` | Connection retry attempts | `3` |
|
|
||||||
| `retry_delay` | Seconds between retries | `5` |
|
|
||||||
| `timeout` | Connection timeout in seconds | `30` |
|
|
||||||
|
|
||||||
## 🔐 SASL Authentication (`sasl`)
|
|
||||||
|
|
||||||
SASL is used for NickServ authentication on connect.
|
|
||||||
|
|
||||||
| Setting | Description | Example |
|
|
||||||
|---------|-------------|---------|
|
|
||||||
| `enabled` | Enable SASL authentication | `false` |
|
|
||||||
| `username` | Registered nickname | `"your_registered_nick"` |
|
|
||||||
| `password` | NickServ password | `"your_nickserv_password"` |
|
|
||||||
|
|
||||||
**Note:** Change `password` from the default if enabling SASL!
|
|
||||||
|
|
||||||
## 👑 Bot Administration (`admins`)
|
|
||||||
|
|
||||||
Array of IRC nicknames with admin privileges.
|
|
||||||
|
|
||||||
```json
|
|
||||||
"admins": ["peorth", "computertech", "colby"]
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🦆 Duck Spawning (`duck_spawning`)
|
|
||||||
|
|
||||||
| Setting | Description | Default |
|
|
||||||
|---------|-------------|---------|
|
|
||||||
| `spawn_min` | Minimum seconds between spawns | `10` |
|
|
||||||
| `spawn_max` | Maximum seconds between spawns | `30` |
|
|
||||||
| `timeout` | Global fallback timeout | `60` |
|
|
||||||
| `rearm_on_duck_shot` | Auto-rearm guns when duck shot | `true` |
|
|
||||||
|
|
||||||
## 🎯 Duck Types (`duck_types`)
|
|
||||||
|
|
||||||
### Normal Ducks (`normal`)
|
|
||||||
- `xp`: XP reward (default: `10`)
|
|
||||||
- `timeout`: Seconds before flying away (default: `60`)
|
|
||||||
|
|
||||||
### Golden Ducks (`golden`)
|
|
||||||
- `chance`: Spawn probability (default: `0.15` = 15%)
|
|
||||||
- `min_hp`: Minimum hit points (default: `3`)
|
|
||||||
- `max_hp`: Maximum hit points (default: `5`)
|
|
||||||
- `xp`: XP reward (default: `15`)
|
|
||||||
- `timeout`: Seconds before flying away (default: `60`)
|
|
||||||
|
|
||||||
### Fast Ducks (`fast`)
|
|
||||||
- `chance`: Spawn probability (default: `0.25` = 25%)
|
|
||||||
- `timeout`: Seconds before flying away (default: `20`)
|
|
||||||
- `xp`: XP reward (default: `12`)
|
|
||||||
|
|
||||||
**Note:** Chances are decimal percentages (0.15 = 15%, 0.25 = 25%)
|
|
||||||
|
|
||||||
## 👤 New Player Defaults (`player_defaults`)
|
|
||||||
|
|
||||||
Starting values for new players:
|
|
||||||
|
|
||||||
| Setting | Description | Default |
|
|
||||||
|---------|-------------|---------|
|
|
||||||
| `accuracy` | Starting accuracy percentage (0-100) | `75` |
|
|
||||||
| `magazines` | Starting number of magazines | `3` |
|
|
||||||
| `bullets_per_magazine` | Bullets per magazine | `6` |
|
|
||||||
| `jam_chance` | Gun jam percentage (0-100) | `15` |
|
|
||||||
| `xp` | Starting XP (also currency) | `0` |
|
|
||||||
|
|
||||||
## 🎮 Game Mechanics (`gameplay`)
|
|
||||||
|
|
||||||
| Setting | Description | Default |
|
|
||||||
|---------|-------------|---------|
|
|
||||||
| `befriend_success_rate` | Base befriend chance (%) | `75` |
|
|
||||||
| `befriend_xp` | XP from befriending | `5` |
|
|
||||||
| `accuracy_gain_on_hit` | Accuracy boost per hit | `1` |
|
|
||||||
| `accuracy_loss_on_miss` | Accuracy loss per miss | `2` |
|
|
||||||
| `min_accuracy` | Minimum accuracy limit | `10` |
|
|
||||||
| `max_accuracy` | Maximum accuracy limit | `100` |
|
|
||||||
| `min_befriend_success_rate` | Min befriend rate | `5` |
|
|
||||||
| `max_befriend_success_rate` | Max befriend rate | `95` |
|
|
||||||
|
|
||||||
## 🔧 Feature Toggles (`features`)
|
|
||||||
|
|
||||||
| Setting | Description | Default |
|
|
||||||
|---------|-------------|---------|
|
|
||||||
| `shop_enabled` | Enable shop system | `true` |
|
|
||||||
| `inventory_enabled` | Enable inventory system | `true` |
|
|
||||||
| `auto_rearm_enabled` | Enable auto gun rearming | `true` |
|
|
||||||
|
|
||||||
## ⚖️ System Limits (`limits`)
|
|
||||||
|
|
||||||
| Setting | Description | Default |
|
|
||||||
|---------|-------------|---------|
|
|
||||||
| `max_inventory_items` | Max items per player | `20` |
|
|
||||||
| `max_temp_effects` | Max temporary effects | `20` |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔧 Configuration Access
|
|
||||||
|
|
||||||
The bot uses dot notation to access nested settings:
|
|
||||||
|
|
||||||
```python
|
|
||||||
# Examples:
|
|
||||||
server = bot.get_config('connection.server')
|
|
||||||
normal_xp = bot.get_config('duck_types.normal.xp')
|
|
||||||
player_accuracy = bot.get_config('player_defaults.accuracy')
|
|
||||||
```
|
|
||||||
|
|
||||||
## 📝 Tips
|
|
||||||
|
|
||||||
1. **Percentages:** Most percentage values use 0-100 scale, but spawn chances use 0.0-1.0 decimals
|
|
||||||
2. **Authentication:** Set real passwords when using server auth or SASL
|
|
||||||
3. **Balance:** Adjust XP rewards and duck spawn rates to balance gameplay
|
|
||||||
4. **Testing:** Change one setting at a time to test effects
|
|
||||||
5. **Backup:** Keep a backup of working config before major changes
|
|
||||||
11
config.json
11
config.json
@@ -2,7 +2,7 @@
|
|||||||
"connection": {
|
"connection": {
|
||||||
"server": "irc.rizon.net",
|
"server": "irc.rizon.net",
|
||||||
"port": 6697,
|
"port": 6697,
|
||||||
"nick": "DuckHunt",
|
"nick": "DickHunt",
|
||||||
"channels": [
|
"channels": [
|
||||||
"#ct"
|
"#ct"
|
||||||
],
|
],
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
"timeout": 30
|
"timeout": 30
|
||||||
},
|
},
|
||||||
"sasl": {
|
"sasl": {
|
||||||
"enabled": true,
|
"enabled": false,
|
||||||
"username": "duckhunt",
|
"username": "duckhunt",
|
||||||
"password": "duckhunt//789//"
|
"password": "duckhunt//789//"
|
||||||
},
|
},
|
||||||
@@ -24,8 +24,8 @@
|
|||||||
"colby"
|
"colby"
|
||||||
],
|
],
|
||||||
"duck_spawning": {
|
"duck_spawning": {
|
||||||
"spawn_min": 10,
|
"spawn_min": 1200,
|
||||||
"spawn_max": 30,
|
"spawn_max": 3600,
|
||||||
"timeout": 60,
|
"timeout": 60,
|
||||||
"rearm_on_duck_shot": true
|
"rearm_on_duck_shot": true
|
||||||
},
|
},
|
||||||
@@ -62,7 +62,8 @@
|
|||||||
"min_accuracy": 10,
|
"min_accuracy": 10,
|
||||||
"max_accuracy": 100,
|
"max_accuracy": 100,
|
||||||
"min_befriend_success_rate": 5,
|
"min_befriend_success_rate": 5,
|
||||||
"max_befriend_success_rate": 95
|
"max_befriend_success_rate": 95,
|
||||||
|
"wet_clothes_duration": 300
|
||||||
},
|
},
|
||||||
"features": {
|
"features": {
|
||||||
"shop_enabled": true,
|
"shop_enabled": true,
|
||||||
|
|||||||
@@ -1,19 +1,23 @@
|
|||||||
{
|
{
|
||||||
"players": {
|
"players": {
|
||||||
"computertech": {
|
"computertech": {
|
||||||
"nick": "ComputerTech",
|
"nick": "computertech",
|
||||||
"xp": 60,
|
"xp": 67,
|
||||||
"ducks_shot": 5,
|
"ducks_shot": 6,
|
||||||
"ducks_befriended": 2,
|
"ducks_befriended": 2,
|
||||||
"accuracy": 62,
|
"shots_fired": 2,
|
||||||
|
"shots_missed": 1,
|
||||||
|
"accuracy": 63,
|
||||||
"gun_confiscated": false,
|
"gun_confiscated": false,
|
||||||
"current_ammo": 5,
|
"current_ammo": 6,
|
||||||
"magazines": 3,
|
"magazines": 3,
|
||||||
"bullets_per_magazine": 6,
|
"bullets_per_magazine": 6,
|
||||||
"jam_chance": 5,
|
"jam_chance": 5,
|
||||||
"inventory": {},
|
"inventory": {
|
||||||
|
"1": 1
|
||||||
|
},
|
||||||
"temporary_effects": []
|
"temporary_effects": []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"last_save": "1758825127.4272072"
|
"last_save": "1758909688.9995604"
|
||||||
}
|
}
|
||||||
75
duckhunt.log
75
duckhunt.log
@@ -651,3 +651,78 @@
|
|||||||
2025-09-24 18:56:53,434 [INFO ] DuckHuntBot.Shop - load_items:30: Loaded 5 shop items from /home/colby/duckhunt/shop.json
|
2025-09-24 18:56:53,434 [INFO ] DuckHuntBot.Shop - load_items:30: Loaded 5 shop items from /home/colby/duckhunt/shop.json
|
||||||
2025-09-24 18:56:53,436 [INFO ] DuckHuntBot.Levels - load_levels:28: Loaded 8 levels from /home/colby/duckhunt/levels.json
|
2025-09-24 18:56:53,436 [INFO ] DuckHuntBot.Levels - load_levels:28: Loaded 8 levels from /home/colby/duckhunt/levels.json
|
||||||
2025-09-24 18:56:53,439 [INFO ] DuckHuntBot.DB - load_database:47: Loaded 1 players from duckhunt.json
|
2025-09-24 18:56:53,439 [INFO ] DuckHuntBot.DB - load_database:47: Loaded 1 players from duckhunt.json
|
||||||
|
2025-09-25 18:05:24,467 [INFO ] DuckHuntBot - setup_logger:61: Enhanced logging system initialized with file rotation
|
||||||
|
2025-09-25 18:05:24,469 [INFO ] DuckHuntBot.DB - load_database:48: Loaded 1 players from duckhunt.json
|
||||||
|
2025-09-25 18:05:24,470 [INFO ] SASL - setup_logger:61: Enhanced logging system initialized with file rotation
|
||||||
|
2025-09-25 18:05:24,471 [INFO ] DuckHuntBot.Shop - load_items:30: Loaded 5 shop items from /home/colby/duckhunt/shop.json
|
||||||
|
2025-09-25 18:05:24,478 [INFO ] DuckHuntBot.Levels - load_levels:28: Loaded 8 levels from /home/colby/duckhunt/levels.json
|
||||||
|
2025-09-25 18:05:24,479 [INFO ] DuckHuntBot - main:28: 🦆 Starting DuckHunt Bot...
|
||||||
|
2025-09-25 18:05:24,568 [INFO ] DuckHuntBot - connect:115: Attempting to connect to irc.rizon.net:6697 (attempt 1/3)
|
||||||
|
2025-09-25 18:05:25,012 [INFO ] DuckHuntBot - connect:126: ✅ Successfully connected to irc.rizon.net:6697
|
||||||
|
2025-09-25 18:05:25,013 [INFO ] SASL - start_negotiation:45: SASL authentication enabled
|
||||||
|
2025-09-25 18:05:25,013 [INFO ] DuckHuntBot - run:774: 🦆 Bot is now running! Press Ctrl+C to stop.
|
||||||
|
2025-09-25 18:05:27,048 [INFO ] SASL - handle_cap_response:59: Server capabilities: ['away-notify', 'chghost', 'invite-notify', 'multi-prefix', 'sasl', 'userhost-in-names']
|
||||||
|
2025-09-25 18:05:27,048 [INFO ] SASL - handle_cap_response:61: SASL capability available
|
||||||
|
2025-09-25 18:05:27,098 [INFO ] SASL - handle_cap_response:72: SASL capability acknowledged
|
||||||
|
2025-09-25 18:05:27,098 [INFO ] SASL - handle_cap_response:74: Authenticating via SASL as duckhunt
|
||||||
|
2025-09-25 18:05:27,099 [INFO ] SASL - handle_sasl:94: Sending AUTHENTICATE PLAIN
|
||||||
|
2025-09-25 18:05:27,507 [INFO ] SASL - handle_authenticate_response:103: Server ready for SASL authentication
|
||||||
|
2025-09-25 18:05:27,508 [DEBUG ] SASL - handle_authenticate_response:106: Auth string length: 33 chars
|
||||||
|
2025-09-25 18:05:27,508 [DEBUG ] SASL - handle_authenticate_response:107: Auth components: user='duckhunt', pass='duc...'
|
||||||
|
2025-09-25 18:05:27,508 [DEBUG ] SASL - handle_authenticate_response:110: Base64 encoded length: 44 chars
|
||||||
|
2025-09-25 18:05:27,508 [DEBUG ] SASL - handle_authenticate_response:111: Sending: AUTHENTICATE ZHVja2h1bnQAZHVja2h1...
|
||||||
|
2025-09-25 18:05:27,918 [INFO ] SASL - handle_sasl_result:123: SASL authentication successful!
|
||||||
|
2025-09-25 18:05:28,019 [INFO ] DuckHuntBot - handle_message:232: Successfully registered with IRC server
|
||||||
|
2025-09-25 18:05:47,029 [INFO ] DuckHuntBot.Game - spawn_duck:149: Fast duck (hidden) spawned in #ct
|
||||||
|
2025-09-25 18:05:51,297 [DEBUG ] DuckHuntBot.DB - save_database:134: Database saved successfully with 1 players
|
||||||
|
2025-09-25 18:06:06,048 [INFO ] DuckHuntBot.Game - spawn_duck:161: Normal duck spawned in #ct
|
||||||
|
2025-09-25 18:06:13,814 [DEBUG ] DuckHuntBot.DB - save_database:134: Database saved successfully with 1 players
|
||||||
|
2025-09-25 18:06:24,064 [INFO ] DuckHuntBot.Game - spawn_duck:161: Normal duck spawned in #ct
|
||||||
|
2025-09-25 18:07:26,130 [INFO ] DuckHuntBot.Game - spawn_duck:149: Fast duck (hidden) spawned in #ct
|
||||||
|
2025-09-25 18:07:56,160 [INFO ] DuckHuntBot.Game - spawn_duck:137: Golden duck (hidden) spawned in #ct with 3 HP
|
||||||
|
2025-09-25 18:09:17,234 [INFO ] DuckHuntBot.Game - spawn_duck:161: Normal duck spawned in #ct
|
||||||
|
2025-09-25 18:10:24,298 [INFO ] DuckHuntBot.Game - spawn_duck:161: Normal duck spawned in #ct
|
||||||
|
2025-09-25 18:11:42,412 [INFO ] DuckHuntBot.Game - spawn_duck:137: Golden duck (hidden) spawned in #ct with 4 HP
|
||||||
|
2025-09-25 18:12:55,485 [INFO ] DuckHuntBot.Game - spawn_duck:161: Normal duck spawned in #ct
|
||||||
|
2025-09-25 18:14:06,578 [INFO ] DuckHuntBot.Game - spawn_duck:137: Golden duck (hidden) spawned in #ct with 3 HP
|
||||||
|
2025-09-25 18:15:14,722 [INFO ] DuckHuntBot.Game - spawn_duck:149: Fast duck (hidden) spawned in #ct
|
||||||
|
2025-09-25 18:15:54,792 [INFO ] DuckHuntBot.Game - spawn_duck:149: Fast duck (hidden) spawned in #ct
|
||||||
|
2025-09-25 18:16:15,812 [INFO ] DuckHuntBot.Game - spawn_duck:161: Normal duck spawned in #ct
|
||||||
|
2025-09-25 18:17:22,878 [INFO ] DuckHuntBot.Game - spawn_duck:161: Normal duck spawned in #ct
|
||||||
|
2025-09-25 18:18:31,953 [INFO ] DuckHuntBot.Game - spawn_duck:161: Normal duck spawned in #ct
|
||||||
|
2025-09-25 18:19:49,029 [INFO ] DuckHuntBot.Game - spawn_duck:161: Normal duck spawned in #ct
|
||||||
|
2025-09-25 18:20:57,099 [INFO ] DuckHuntBot.Game - spawn_duck:161: Normal duck spawned in #ct
|
||||||
|
2025-09-25 18:22:04,175 [INFO ] DuckHuntBot.Game - spawn_duck:161: Normal duck spawned in #ct
|
||||||
|
2025-09-25 18:23:19,252 [INFO ] DuckHuntBot.Game - spawn_duck:149: Fast duck (hidden) spawned in #ct
|
||||||
|
2025-09-25 18:23:46,278 [INFO ] DuckHuntBot.Game - spawn_duck:161: Normal duck spawned in #ct
|
||||||
|
2025-09-25 18:24:57,354 [INFO ] DuckHuntBot.Game - spawn_duck:137: Golden duck (hidden) spawned in #ct with 3 HP
|
||||||
|
2025-09-25 18:26:17,435 [INFO ] DuckHuntBot.Game - spawn_duck:161: Normal duck spawned in #ct
|
||||||
|
2025-09-25 18:27:24,505 [INFO ] DuckHuntBot.Game - spawn_duck:161: Normal duck spawned in #ct
|
||||||
|
2025-09-25 18:28:33,580 [INFO ] DuckHuntBot.Game - spawn_duck:161: Normal duck spawned in #ct
|
||||||
|
2025-09-25 18:29:37,647 [INFO ] DuckHuntBot.Game - spawn_duck:149: Fast duck (hidden) spawned in #ct
|
||||||
|
2025-09-25 18:30:17,686 [INFO ] DuckHuntBot.Game - spawn_duck:161: Normal duck spawned in #ct
|
||||||
|
2025-09-25 18:31:35,762 [INFO ] DuckHuntBot.Game - spawn_duck:161: Normal duck spawned in #ct
|
||||||
|
2025-09-25 18:33:01,847 [INFO ] DuckHuntBot.Game - spawn_duck:161: Normal duck spawned in #ct
|
||||||
|
2025-09-25 18:34:13,914 [INFO ] DuckHuntBot.Game - spawn_duck:161: Normal duck spawned in #ct
|
||||||
|
2025-09-25 18:35:27,982 [INFO ] DuckHuntBot.Game - spawn_duck:161: Normal duck spawned in #ct
|
||||||
|
2025-09-25 18:36:39,046 [INFO ] DuckHuntBot.Game - spawn_duck:161: Normal duck spawned in #ct
|
||||||
|
2025-09-25 18:37:41,102 [INFO ] DuckHuntBot.Game - spawn_duck:149: Fast duck (hidden) spawned in #ct
|
||||||
|
2025-09-25 18:38:18,132 [INFO ] DuckHuntBot.Game - spawn_duck:149: Fast duck (hidden) spawned in #ct
|
||||||
|
2025-09-25 18:38:44,166 [INFO ] DuckHuntBot.Game - spawn_duck:161: Normal duck spawned in #ct
|
||||||
|
2025-09-25 18:40:12,271 [INFO ] DuckHuntBot.Game - spawn_duck:161: Normal duck spawned in #ct
|
||||||
|
2025-09-25 18:41:23,349 [INFO ] DuckHuntBot.Game - spawn_duck:137: Golden duck (hidden) spawned in #ct with 3 HP
|
||||||
|
2025-09-25 18:42:28,415 [INFO ] DuckHuntBot.Game - spawn_duck:161: Normal duck spawned in #ct
|
||||||
|
2025-09-25 18:43:52,494 [INFO ] DuckHuntBot.Game - spawn_duck:137: Golden duck (hidden) spawned in #ct with 4 HP
|
||||||
|
2025-09-25 18:45:03,560 [INFO ] DuckHuntBot.Game - spawn_duck:137: Golden duck (hidden) spawned in #ct with 3 HP
|
||||||
|
2025-09-25 18:46:04,620 [INFO ] DuckHuntBot.Game - spawn_duck:161: Normal duck spawned in #ct
|
||||||
|
2025-09-25 18:47:20,702 [INFO ] DuckHuntBot.Game - spawn_duck:161: Normal duck spawned in #ct
|
||||||
|
2025-09-25 18:48:29,761 [INFO ] DuckHuntBot.Game - spawn_duck:161: Normal duck spawned in #ct
|
||||||
|
2025-09-25 18:49:35,827 [INFO ] DuckHuntBot.Game - spawn_duck:161: Normal duck spawned in #ct
|
||||||
|
2025-09-25 18:50:48,894 [INFO ] DuckHuntBot.Game - spawn_duck:161: Normal duck spawned in #ct
|
||||||
|
2025-09-25 18:51:51,944 [INFO ] DuckHuntBot.Game - spawn_duck:161: Normal duck spawned in #ct
|
||||||
|
2025-09-25 18:52:58,006 [INFO ] DuckHuntBot.Game - spawn_duck:161: Normal duck spawned in #ct
|
||||||
|
2025-09-25 18:53:59,056 [INFO ] DuckHuntBot.Game - spawn_duck:137: Golden duck (hidden) spawned in #ct with 4 HP
|
||||||
|
2025-09-25 18:55:08,121 [INFO ] DuckHuntBot.Game - spawn_duck:161: Normal duck spawned in #ct
|
||||||
|
2025-09-25 18:56:27,201 [INFO ] DuckHuntBot.Game - spawn_duck:161: Normal duck spawned in #ct
|
||||||
|
2025-09-25 18:57:44,273 [INFO ] DuckHuntBot.Game - spawn_duck:137: Golden duck (hidden) spawned in #ct with 3 HP
|
||||||
|
| ||||||