update eetc
This commit is contained in:
@@ -228,6 +228,43 @@ if ($action === 'progress' && $method === 'POST') {
|
||||
json_response(['ok' => true, 'id' => $id, 'value' => $val, 'unlocked' => $val >= $target]);
|
||||
}
|
||||
|
||||
/* streak — สำหรับ achievement แบบ "ติดต่อกัน" (a6/d4/e1): event 'hit' นับต่อ, 'miss' รีเซ็ต 0.
|
||||
* เก็บ current streak แยกใน accounts[].achvStreak {id:count} · achievement = best streak ที่เคยถึง (ไม่ลดลงเวลารีเซ็ต) */
|
||||
if ($action === 'streak' && $method === 'POST') {
|
||||
$secretFile = ADMIN_PRIVATE_DIR . '/game-award-secret.txt';
|
||||
$expected = is_file($secretFile) ? trim((string) @file_get_contents($secretFile)) : '';
|
||||
$secret = (string) ($body['secret'] ?? '');
|
||||
if ($expected === '' || strlen($secret) < 16 || !hash_equals($expected, $secret)) {
|
||||
json_response(['ok' => false, 'error' => 'unauthorized'], 403);
|
||||
}
|
||||
$key = trim((string) ($body['playerKey'] ?? ''));
|
||||
$id = preg_replace('/[^a-zA-Z0-9_]/', '', (string) ($body['id'] ?? ''));
|
||||
$event = (string) ($body['event'] ?? '');
|
||||
if (!achv_valid_key($key) || $id === '' || ($event !== 'hit' && $event !== 'miss')) {
|
||||
json_response(['ok' => false, 'error' => 'bad params'], 400);
|
||||
}
|
||||
$catalog = achv_load_catalog();
|
||||
$target = 0;
|
||||
foreach ($catalog as $c) { if ($c['id'] === $id) { $target = (int) $c['target']; break; } }
|
||||
if ($target <= 0) json_response(['ok' => false, 'error' => 'unknown id'], 404);
|
||||
|
||||
$store = read_store();
|
||||
$i = achv_find_or_create($store, $key);
|
||||
$acct = $store['accounts'][$i];
|
||||
$streaks = (isset($acct['achvStreak']) && is_array($acct['achvStreak'])) ? $acct['achvStreak'] : [];
|
||||
$sc = max(0, (int) ($streaks[$id] ?? 0));
|
||||
$sc = ($event === 'hit') ? ($sc + 1) : 0;
|
||||
$streaks[$id] = $sc;
|
||||
$cur = achv_progress_of($acct);
|
||||
$best = max(0, min($target, max((int) ($cur[$id] ?? 0), $sc))); /* achievement = best ไม่ลดลง */
|
||||
$cur[$id] = $best;
|
||||
$store['accounts'][$i]['achievements'] = (object) $cur;
|
||||
$store['accounts'][$i]['achvStreak'] = (object) $streaks;
|
||||
$store['accounts'][$i]['updatedAt'] = gmdate('c');
|
||||
if (!write_store($store)) json_response(['ok' => false, 'error' => 'save failed'], 500);
|
||||
json_response(['ok' => true, 'id' => $id, 'streak' => $sc, 'value' => $best, 'unlocked' => $best >= $target]);
|
||||
}
|
||||
|
||||
/* ---------- Admin ---------- */
|
||||
require_login();
|
||||
|
||||
|
||||
@@ -0,0 +1,345 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* Achievements — แคตตาล็อก + progress รายผู้เล่น
|
||||
*
|
||||
* แคตตาล็อก override : Admin/private/achievements.json (ถ้าไม่มี ใช้ default ในไฟล์นี้)
|
||||
* progress รายผู้เล่น : เก็บใน store.json -> accounts[].achievements { id: count }
|
||||
*
|
||||
* Public (ไม่ต้องล็อกอิน):
|
||||
* GET ?action=state&playerKey=KEY -> { ok, catalog:[...], progress:{id:count} }
|
||||
* GET ?action=catalog -> { ok, catalog:[...] }
|
||||
*
|
||||
* Server-only (มี secret game-award-secret.txt) — สำหรับ auto-track ภายหลัง:
|
||||
* POST {action:'progress', secret, playerKey, id, inc?, set?}
|
||||
*
|
||||
* Admin (ต้องล็อกอิน session):
|
||||
* POST {action:'saveCatalog', catalog:[...]}
|
||||
* GET ?action=players -> รายชื่อผู้เล่น + จำนวนที่ปลดล็อก
|
||||
* GET ?action=player&playerKey=KEY -> progress ของผู้เล่นคนเดียว
|
||||
* POST {action:'setProgress', playerKey, id, value}
|
||||
* POST {action:'unlock', playerKey, id} -> set = target
|
||||
* POST {action:'resetPlayer', playerKey} -> ล้าง progress ทั้งหมด
|
||||
*/
|
||||
require __DIR__ . '/_common.php';
|
||||
|
||||
date_default_timezone_set('Asia/Bangkok');
|
||||
|
||||
define('ACHV_CATALOG_FILE', ADMIN_PRIVATE_DIR . '/achievements.json');
|
||||
|
||||
function achv_default_catalog(): array
|
||||
{
|
||||
return [
|
||||
['id' => 'a1_first_deduction', 'g' => 1, 'title' => 'First Deduction', 'desc' => 'โหวตถูกตัวคนร้ายเป็นครั้งแรก', 'target' => 1, 'enabled' => true],
|
||||
['id' => 'a2_sharp_eye', 'g' => 1, 'title' => 'Sharp Eye', 'desc' => 'สะสมหลักฐานระดับมีน้ำหนัก (Silver) ครบ 10 ใบ', 'target' => 10, 'enabled' => true],
|
||||
['id' => 'a3_mind_architect', 'g' => 1, 'title' => 'Mind Architect', 'desc' => 'สะสมหลักฐานครบทุกระดับ (ทั่วไป, มีน้ำหนัก, ชี้ชัด) ใน 1 คดี', 'target' => 1, 'enabled' => true],
|
||||
['id' => 'a4_logic_over_luck', 'g' => 1, 'title' => 'Logic Over Luck', 'desc' => 'โหวตถูกโดยไม่พึ่งหลักฐานชี้ชัด (Legendary) เลย 3 ครั้ง', 'target' => 3, 'enabled' => true],
|
||||
['id' => 'a5_truth_hunter', 'g' => 1, 'title' => 'Truth Hunter', 'desc' => 'จับคนร้ายถูกตัวสะสมครบ 20 คดี', 'target' => 20, 'enabled' => true],
|
||||
['id' => 'a6_unbreakable_logic', 'g' => 1, 'title' => 'Unbreakable Logic', 'desc' => 'โหวตถูกตัวติดกัน 5 คดีรวด', 'target' => 5, 'enabled' => true],
|
||||
|
||||
['id' => 'b1_evidence_collector', 'g' => 2, 'title' => 'Evidence Collector', 'desc' => 'สะสมหลักฐานระดับทั่วไป (Common) ครบ 20 ใบ', 'target' => 20, 'enabled' => true],
|
||||
['id' => 'b2_relentless_investigator', 'g' => 2, 'title' => 'Relentless Investigator', 'desc' => 'เล่น Mini Game ครบทุกรอบ ใน 1 คดี', 'target' => 1, 'enabled' => true],
|
||||
['id' => 'b3_hidden_fragment', 'g' => 2, 'title' => 'Hidden Fragment', 'desc' => 'ค้นพบหลักฐานระดับชี้ชัด (Legendary/Gold) เป็นครั้งแรก', 'target' => 1, 'enabled' => true],
|
||||
['id' => 'b4_data_miner', 'g' => 2, 'title' => 'Data Miner', 'desc' => 'สะสมการ์ดหลักฐานรวมครบ 100 ใบ', 'target' => 100, 'enabled' => true],
|
||||
['id' => 'b5_deep_scanner', 'g' => 2, 'title' => 'Deep Scanner', 'desc' => 'เก็บไอเทมช่วยเหลือ (ตำรวจ/ทนาย) สะสมครบ 10 ครั้ง', 'target' => 10, 'enabled' => true],
|
||||
|
||||
['id' => 'c1_early_accusation', 'g' => 3, 'title' => 'Early Accusation', 'desc' => 'ชี้ตัวคนร้ายก่อนที่จะเปิดหลักฐานครบ', 'target' => 1, 'enabled' => true],
|
||||
['id' => 'c2_high_stakes', 'g' => 3, 'title' => 'High Stakes', 'desc' => 'ชี้ตัวคนร้ายถูกโดยมีหลักฐานในมือไม่เกิน 3 ใบ', 'target' => 1, 'enabled' => true],
|
||||
['id' => 'c3_quick_draw', 'g' => 3, 'title' => 'Quick Draw', 'desc' => 'ชี้ตัวคนร้ายเร็วที่สุดในทีมสะสมครบ 10 ครั้ง', 'target' => 10, 'enabled' => true],
|
||||
['id' => 'c4_clutch_mind', 'g' => 3, 'title' => 'Clutch Mind', 'desc' => 'โหวตถูกในช่วง 10 วินาทีสุดท้ายก่อนหมดเวลา', 'target' => 1, 'enabled' => true],
|
||||
['id' => 'c5_lone_wolf', 'g' => 3, 'title' => 'Lone Wolf', 'desc' => 'โหวตสวนทางกับเสียงส่วนใหญ่ของทีม (คุณถูกคนเดียว)', 'target' => 1, 'enabled' => true],
|
||||
|
||||
['id' => 'd1_minigame_solver', 'g' => 4, 'title' => 'Minigame Solver', 'desc' => 'เอาชีวิตรอด / เล่นมินิเกมสำเร็จ 20 ครั้ง', 'target' => 20, 'enabled' => true],
|
||||
['id' => 'd2_silent_guardian', 'g' => 4, 'title' => 'Silent Guardian', 'desc' => 'ไม่โดนโหวตใช้การ์ด Event พิเศษ เลยตลอด 5 คดี', 'target' => 5, 'enabled' => true],
|
||||
['id' => 'd3_the_backbone', 'g' => 4, 'title' => 'The Backbone', 'desc' => 'ส่งมอบหลักฐานให้เพื่อนวิเคราะห์ครบ 30 ใบ', 'target' => 30, 'enabled' => true],
|
||||
['id' => 'd4_flawless_diver', 'g' => 4, 'title' => 'Flawless Diver', 'desc' => 'ไม่โหวตจับผิดตัวเลยตลอด 15 คดี', 'target' => 15, 'enabled' => true],
|
||||
|
||||
['id' => 'e1_the_observer', 'g' => 5, 'title' => 'The Observer', 'desc' => 'เล่นจบ 15 คดีโดยไม่เคยสัมผัสหลักฐานชี้ชัด (Legendary) เลยสักครั้ง', 'target' => 15, 'enabled' => true],
|
||||
['id' => 'e2_the_impostor', 'g' => 5, 'title' => 'The Impostor', 'desc' => 'รับบทเป็น "ตัวป่วน" ครั้งแรก', 'target' => 1, 'enabled' => true],
|
||||
['id' => 'e3_master_of_doubt', 'g' => 5, 'title' => 'Master of Doubt', 'desc' => 'เอาชนะคดีในฐานะตัวป่วนได้สำเร็จ', 'target' => 1, 'enabled' => true],
|
||||
['id' => 'e4_agent_of_chaos', 'g' => 5, 'title' => 'Agent of Chaos', 'desc' => 'รับบทเป็นตัวป่วนสะสมครบ 10 ครั้ง', 'target' => 10, 'enabled' => true],
|
||||
['id' => 'e5_slippery_eel', 'g' => 5, 'title' => 'Slippery Eel', 'desc' => 'เป็นตัวป่วนแต่รอดพ้นจากการถูกจับได้ (ไม่ถูกโหวตออก) จนจบเกม 5 ครั้ง', 'target' => 5, 'enabled' => true],
|
||||
];
|
||||
}
|
||||
|
||||
function achv_sanitize_catalog(array $arr): array
|
||||
{
|
||||
$out = [];
|
||||
$seen = [];
|
||||
foreach ($arr as $row) {
|
||||
if (!is_array($row)) continue;
|
||||
$id = preg_replace('/[^a-zA-Z0-9_]/', '', (string) ($row['id'] ?? ''));
|
||||
if ($id === '' || isset($seen[$id])) continue;
|
||||
$seen[$id] = true;
|
||||
$g = (int) ($row['g'] ?? 1);
|
||||
if ($g < 1 || $g > 5) $g = 1;
|
||||
$title = trim((string) ($row['title'] ?? ''));
|
||||
$desc = trim((string) ($row['desc'] ?? ''));
|
||||
if (function_exists('mb_substr')) {
|
||||
$title = mb_substr($title, 0, 60);
|
||||
$desc = mb_substr($desc, 0, 200);
|
||||
}
|
||||
$target = (int) ($row['target'] ?? 1);
|
||||
if ($target < 1) $target = 1;
|
||||
if ($target > 100000) $target = 100000;
|
||||
$out[] = [
|
||||
'id' => $id,
|
||||
'g' => $g,
|
||||
'title' => $title !== '' ? $title : $id,
|
||||
'desc' => $desc,
|
||||
'target' => $target,
|
||||
'enabled' => !isset($row['enabled']) || !empty($row['enabled']),
|
||||
];
|
||||
}
|
||||
return $out;
|
||||
}
|
||||
|
||||
function achv_load_catalog(): array
|
||||
{
|
||||
if (is_file(ACHV_CATALOG_FILE)) {
|
||||
$raw = @file_get_contents(ACHV_CATALOG_FILE);
|
||||
$j = json_decode($raw ?: '[]', true);
|
||||
if (is_array($j) && $j) {
|
||||
$c = achv_sanitize_catalog($j);
|
||||
if ($c) return $c;
|
||||
}
|
||||
}
|
||||
return achv_default_catalog();
|
||||
}
|
||||
|
||||
function achv_save_catalog(array $catalog): bool
|
||||
{
|
||||
if (!is_dir(ADMIN_PRIVATE_DIR)) {
|
||||
if (!@mkdir(ADMIN_PRIVATE_DIR, 0750, true)) return false;
|
||||
}
|
||||
$tmp = ACHV_CATALOG_FILE . '.tmp.' . bin2hex(random_bytes(4));
|
||||
$json = json_encode($catalog, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
|
||||
if ($json === false) return false;
|
||||
if (file_put_contents($tmp, $json, LOCK_EX) === false) return false;
|
||||
if (!rename($tmp, ACHV_CATALOG_FILE)) { @unlink($tmp); return false; }
|
||||
return true;
|
||||
}
|
||||
|
||||
function achv_valid_key(string $key): bool
|
||||
{
|
||||
return (bool) preg_match('/^[a-zA-Z0-9_-]{8,128}$/', $key);
|
||||
}
|
||||
|
||||
/* หา index บัญชี guest ตาม playerKey (สร้างใหม่ถ้าไม่มี) */
|
||||
function achv_find_or_create(array &$store, string $key): int
|
||||
{
|
||||
foreach ($store['accounts'] as $i => $a) {
|
||||
if (($a['loginType'] ?? '') === 'guest' && ($a['providerUserId'] ?? '') === $key) {
|
||||
return $i;
|
||||
}
|
||||
}
|
||||
$store['accounts'][] = [
|
||||
'id' => new_id(),
|
||||
'email' => '',
|
||||
'displayName' => 'Guest',
|
||||
'loginType' => 'guest',
|
||||
'providerUserId' => $key,
|
||||
'notes' => 'auto: achievements',
|
||||
'blocked' => false,
|
||||
'coins' => 0,
|
||||
'achievements' => new \stdClass(),
|
||||
'createdAt' => gmdate('c'),
|
||||
'updatedAt' => gmdate('c'),
|
||||
];
|
||||
return count($store['accounts']) - 1;
|
||||
}
|
||||
|
||||
function achv_progress_of(array $account): array
|
||||
{
|
||||
$p = $account['achievements'] ?? [];
|
||||
if (!is_array($p)) return [];
|
||||
$out = [];
|
||||
foreach ($p as $k => $v) {
|
||||
$id = preg_replace('/[^a-zA-Z0-9_]/', '', (string) $k);
|
||||
if ($id === '') continue;
|
||||
$out[$id] = max(0, (int) $v);
|
||||
}
|
||||
return $out;
|
||||
}
|
||||
|
||||
$method = $_SERVER['REQUEST_METHOD'] ?? 'GET';
|
||||
$action = (string) ($_GET['action'] ?? '');
|
||||
if ($method === 'POST') {
|
||||
$body = require_json_body();
|
||||
if (!$action) $action = (string) ($body['action'] ?? '');
|
||||
} else {
|
||||
$body = [];
|
||||
}
|
||||
|
||||
/* ---------- Public ---------- */
|
||||
if ($action === 'catalog' && $method === 'GET') {
|
||||
json_response(['ok' => true, 'catalog' => achv_load_catalog()]);
|
||||
}
|
||||
|
||||
if ($action === 'state' && $method === 'GET') {
|
||||
$key = trim((string) ($_GET['playerKey'] ?? ''));
|
||||
if (!achv_valid_key($key)) {
|
||||
json_response(['ok' => false, 'error' => 'playerKey ไม่ถูกต้อง'], 400);
|
||||
}
|
||||
$catalog = achv_load_catalog();
|
||||
$store = read_store();
|
||||
$progress = [];
|
||||
foreach ($store['accounts'] as $a) {
|
||||
if (($a['loginType'] ?? '') === 'guest' && ($a['providerUserId'] ?? '') === $key) {
|
||||
$progress = achv_progress_of($a);
|
||||
break;
|
||||
}
|
||||
}
|
||||
json_response(['ok' => true, 'catalog' => $catalog, 'progress' => (object) $progress]);
|
||||
}
|
||||
|
||||
/* ---------- Server-only (secret) : auto-track ภายหลัง ---------- */
|
||||
if ($action === 'progress' && $method === 'POST') {
|
||||
$secretFile = ADMIN_PRIVATE_DIR . '/game-award-secret.txt';
|
||||
$expected = is_file($secretFile) ? trim((string) @file_get_contents($secretFile)) : '';
|
||||
$secret = (string) ($body['secret'] ?? '');
|
||||
if ($expected === '' || strlen($secret) < 16 || !hash_equals($expected, $secret)) {
|
||||
json_response(['ok' => false, 'error' => 'unauthorized'], 403);
|
||||
}
|
||||
$key = trim((string) ($body['playerKey'] ?? ''));
|
||||
$id = preg_replace('/[^a-zA-Z0-9_]/', '', (string) ($body['id'] ?? ''));
|
||||
if (!achv_valid_key($key) || $id === '') {
|
||||
json_response(['ok' => false, 'error' => 'bad params'], 400);
|
||||
}
|
||||
$catalog = achv_load_catalog();
|
||||
$target = 0;
|
||||
foreach ($catalog as $c) { if ($c['id'] === $id) { $target = (int) $c['target']; break; } }
|
||||
if ($target <= 0) json_response(['ok' => false, 'error' => 'unknown id'], 404);
|
||||
|
||||
$store = read_store();
|
||||
$i = achv_find_or_create($store, $key);
|
||||
$cur = achv_progress_of($store['accounts'][$i]);
|
||||
if (isset($body['set'])) {
|
||||
$val = max(0, min($target, (int) $body['set']));
|
||||
} else {
|
||||
$inc = (int) ($body['inc'] ?? 1);
|
||||
$val = max(0, min($target, ($cur[$id] ?? 0) + $inc));
|
||||
}
|
||||
$cur[$id] = $val;
|
||||
$store['accounts'][$i]['achievements'] = (object) $cur;
|
||||
$store['accounts'][$i]['updatedAt'] = gmdate('c');
|
||||
if (!write_store($store)) json_response(['ok' => false, 'error' => 'save failed'], 500);
|
||||
json_response(['ok' => true, 'id' => $id, 'value' => $val, 'unlocked' => $val >= $target]);
|
||||
}
|
||||
|
||||
/* ---------- Admin ---------- */
|
||||
require_login();
|
||||
|
||||
if ($action === 'saveCatalog' && $method === 'POST') {
|
||||
$catIn = (isset($body['catalog']) && is_array($body['catalog'])) ? $body['catalog'] : null;
|
||||
if ($catIn === null) json_response(['ok' => false, 'error' => 'ไม่มี catalog'], 400);
|
||||
$clean = achv_sanitize_catalog($catIn);
|
||||
if (!$clean) json_response(['ok' => false, 'error' => 'catalog ว่าง'], 400);
|
||||
if (!achv_save_catalog($clean)) {
|
||||
json_response(['ok' => false, 'error' => 'บันทึก achievements.json ไม่สำเร็จ (chown ให้ user เว็บ)'], 500);
|
||||
}
|
||||
json_response(['ok' => true, 'catalog' => $clean]);
|
||||
}
|
||||
|
||||
if ($action === 'resetCatalog' && $method === 'POST') {
|
||||
$def = achv_default_catalog();
|
||||
if (!achv_save_catalog($def)) {
|
||||
json_response(['ok' => false, 'error' => 'บันทึกไม่สำเร็จ'], 500);
|
||||
}
|
||||
json_response(['ok' => true, 'catalog' => $def]);
|
||||
}
|
||||
|
||||
if ($action === 'players' && $method === 'GET') {
|
||||
$catalog = achv_load_catalog();
|
||||
$byId = [];
|
||||
foreach ($catalog as $c) $byId[$c['id']] = (int) $c['target'];
|
||||
$store = read_store();
|
||||
$rows = [];
|
||||
foreach ($store['accounts'] as $a) {
|
||||
if (($a['loginType'] ?? '') !== 'guest') continue;
|
||||
$key = (string) ($a['providerUserId'] ?? '');
|
||||
if ($key === '') continue;
|
||||
$prog = achv_progress_of($a);
|
||||
$unlocked = 0;
|
||||
foreach ($prog as $id => $v) {
|
||||
if (isset($byId[$id]) && $v >= $byId[$id]) $unlocked++;
|
||||
}
|
||||
$rows[] = [
|
||||
'playerKey' => $key,
|
||||
'displayName' => (string) ($a['displayName'] ?? ($a['lbName'] ?? 'Guest')),
|
||||
'coins' => max(0, (int) ($a['coins'] ?? 0)),
|
||||
'blocked' => !empty($a['blocked']),
|
||||
'unlocked' => $unlocked,
|
||||
'total' => count($byId),
|
||||
'updatedAt' => (string) ($a['updatedAt'] ?? ''),
|
||||
];
|
||||
}
|
||||
json_response(['ok' => true, 'players' => $rows, 'total' => count($byId)]);
|
||||
}
|
||||
|
||||
if ($action === 'player' && $method === 'GET') {
|
||||
$key = trim((string) ($_GET['playerKey'] ?? ''));
|
||||
if (!achv_valid_key($key)) json_response(['ok' => false, 'error' => 'playerKey ไม่ถูกต้อง'], 400);
|
||||
$store = read_store();
|
||||
foreach ($store['accounts'] as $a) {
|
||||
if (($a['loginType'] ?? '') === 'guest' && ($a['providerUserId'] ?? '') === $key) {
|
||||
json_response(['ok' => true, 'playerKey' => $key, 'displayName' => (string) ($a['displayName'] ?? 'Guest'), 'progress' => (object) achv_progress_of($a)]);
|
||||
}
|
||||
}
|
||||
json_response(['ok' => true, 'playerKey' => $key, 'displayName' => 'Guest', 'progress' => (object) []]);
|
||||
}
|
||||
|
||||
if ($action === 'setProgress' && $method === 'POST') {
|
||||
$key = trim((string) ($body['playerKey'] ?? ''));
|
||||
$id = preg_replace('/[^a-zA-Z0-9_]/', '', (string) ($body['id'] ?? ''));
|
||||
if (!achv_valid_key($key) || $id === '') json_response(['ok' => false, 'error' => 'bad params'], 400);
|
||||
$catalog = achv_load_catalog();
|
||||
$target = 0;
|
||||
foreach ($catalog as $c) { if ($c['id'] === $id) { $target = (int) $c['target']; break; } }
|
||||
if ($target <= 0) json_response(['ok' => false, 'error' => 'unknown id'], 404);
|
||||
$value = max(0, min($target, (int) ($body['value'] ?? 0)));
|
||||
$store = read_store();
|
||||
$i = achv_find_or_create($store, $key);
|
||||
$cur = achv_progress_of($store['accounts'][$i]);
|
||||
$cur[$id] = $value;
|
||||
$store['accounts'][$i]['achievements'] = (object) $cur;
|
||||
$store['accounts'][$i]['updatedAt'] = gmdate('c');
|
||||
if (!write_store($store)) json_response(['ok' => false, 'error' => 'save failed'], 500);
|
||||
json_response(['ok' => true, 'id' => $id, 'value' => $value, 'unlocked' => $value >= $target]);
|
||||
}
|
||||
|
||||
if ($action === 'unlock' && $method === 'POST') {
|
||||
$key = trim((string) ($body['playerKey'] ?? ''));
|
||||
$id = preg_replace('/[^a-zA-Z0-9_]/', '', (string) ($body['id'] ?? ''));
|
||||
if (!achv_valid_key($key) || $id === '') json_response(['ok' => false, 'error' => 'bad params'], 400);
|
||||
$catalog = achv_load_catalog();
|
||||
$target = 0;
|
||||
foreach ($catalog as $c) { if ($c['id'] === $id) { $target = (int) $c['target']; break; } }
|
||||
if ($target <= 0) json_response(['ok' => false, 'error' => 'unknown id'], 404);
|
||||
$store = read_store();
|
||||
$i = achv_find_or_create($store, $key);
|
||||
$cur = achv_progress_of($store['accounts'][$i]);
|
||||
$cur[$id] = $target;
|
||||
$store['accounts'][$i]['achievements'] = (object) $cur;
|
||||
$store['accounts'][$i]['updatedAt'] = gmdate('c');
|
||||
if (!write_store($store)) json_response(['ok' => false, 'error' => 'save failed'], 500);
|
||||
json_response(['ok' => true, 'id' => $id, 'value' => $target, 'unlocked' => true]);
|
||||
}
|
||||
|
||||
if ($action === 'resetPlayer' && $method === 'POST') {
|
||||
$key = trim((string) ($body['playerKey'] ?? ''));
|
||||
if (!achv_valid_key($key)) json_response(['ok' => false, 'error' => 'playerKey ไม่ถูกต้อง'], 400);
|
||||
$store = read_store();
|
||||
foreach ($store['accounts'] as $idx => $a) {
|
||||
if (($a['loginType'] ?? '') === 'guest' && ($a['providerUserId'] ?? '') === $key) {
|
||||
$store['accounts'][$idx]['achievements'] = new \stdClass();
|
||||
$store['accounts'][$idx]['updatedAt'] = gmdate('c');
|
||||
if (!write_store($store)) json_response(['ok' => false, 'error' => 'save failed'], 500);
|
||||
json_response(['ok' => true]);
|
||||
}
|
||||
}
|
||||
json_response(['ok' => true]);
|
||||
}
|
||||
|
||||
json_response(['ok' => false, 'error' => 'unknown action'], 400);
|
||||
@@ -53,7 +53,7 @@
|
||||
"blocked": false,
|
||||
"coins": 3156,
|
||||
"createdAt": "2026-04-02T05:52:21+00:00",
|
||||
"updatedAt": "2026-07-05T15:34:25+00:00",
|
||||
"updatedAt": "2026-07-06T03:41:08+00:00",
|
||||
"daily": {
|
||||
"anchorMs": 1781197200000,
|
||||
"claimedDays": [
|
||||
@@ -95,10 +95,16 @@
|
||||
"e3_master_of_doubt": 1,
|
||||
"e5_slippery_eel": 1,
|
||||
"b4_data_miner": 1,
|
||||
"b1_evidence_collector": 1
|
||||
"b1_evidence_collector": 1,
|
||||
"e1_the_observer": 1,
|
||||
"d4_flawless_diver": 0
|
||||
},
|
||||
"lobbyColorThemeIndex": 7,
|
||||
"lobbySkinToneIndex": 1
|
||||
"lobbySkinToneIndex": 1,
|
||||
"achvStreak": {
|
||||
"e1_the_observer": 1,
|
||||
"d4_flawless_diver": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "1d64c56fadb64a93eae68a1d",
|
||||
|
||||
@@ -2064,6 +2064,25 @@ function submitAchievementProgress(items) {
|
||||
});
|
||||
}
|
||||
|
||||
/* streak achievements (a6/d4/e1) — POST action=streak {playerKey,id,event:'hit'|'miss'}
|
||||
PHP นับต่อ/รีเซ็ตเอง + set achievement = best streak (ไม่ลดลง) */
|
||||
function submitAchievementStreak(items) {
|
||||
const secret = gameAwardSecret();
|
||||
if (!secret || !Array.isArray(items) || !items.length) return;
|
||||
items.forEach((it) => {
|
||||
if (!it || !it.playerKey || !it.id || (it.event !== 'hit' && it.event !== 'miss')) return;
|
||||
try {
|
||||
fetch(ACHIEVEMENTS_URL, {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ action: 'streak', secret, playerKey: it.playerKey, id: it.id, event: it.event }),
|
||||
}).then((r) => r.json()).then((d) => {
|
||||
if (!d || !d.ok) console.error('[achv] streak failed', it.id, d);
|
||||
}).catch((e) => console.error('[achv] streak error', e && e.message));
|
||||
} catch (e) { console.error('[achv] streak throw', e && e.message); }
|
||||
});
|
||||
}
|
||||
|
||||
/* แจกเหรียญตามอันดับคะแนน (เฉพาะผู้รอดชีวิต ผู้ตาย = 0) + คะแนนสะสมเข้า leaderboard — ครั้งเดียวต่อรอบ */
|
||||
function awardMinigameRankCoins(sid, space) {
|
||||
if (!space || space.coinAwardDoneForRun) return;
|
||||
@@ -3728,6 +3747,8 @@ function assignDetectiveSuspectCardMinigames(space) {
|
||||
// ชุดการ์ดใหม่ = ล้างหลักฐานที่ผู้เล่นเก็บได้ (รวม evidenceByNick fallback — กันหลักฐานคดีเก่า leak ข้ามคดี)
|
||||
space.playerEvidence = {};
|
||||
space.evidenceByNick = {};
|
||||
space.caseMinigameSuspects = {}; /* [achv b2] มินิเกมที่รันในคดีนี้ (suspectIndex) — เช็ค "เล่นครบทุกรอบ" */
|
||||
space.caseCardTargetedKeys = {}; /* [achv d2] playerKey ที่โดนโหวตการ์ด Silence/Ban ในคดีนี้ */
|
||||
/* #6: ความคืบหน้าการสืบต่อผู้ต้องสงสัย (shared — เท่ากันทุกคน) = จำนวนมินิเกมที่เล่นให้คนนั้น (0-3)
|
||||
ใช้โชว์ช่องหลักฐานใต้การ์ด suspect แทนหลักฐานส่วนตัว (เดิมแต่ละคนเห็นไม่เท่ากัน) */
|
||||
space.suspectTeamProgress = [0, 0, 0];
|
||||
@@ -3843,6 +3864,11 @@ function trackEvidenceCollectAchv(space, playerId, card) {
|
||||
|
||||
function awardDetectiveEvidenceForMinigameEnd(space, suspectIndex, playerIds, grade) {
|
||||
const out = {};
|
||||
/* [achv b2] บันทึกว่า suspect นี้มีมินิเกมรันในคดีนี้ (ใช้เช็ค "เล่นมินิเกมครบทุกรอบ") */
|
||||
if (suspectIndex >= 0 && suspectIndex <= 2) {
|
||||
space.caseMinigameSuspects = space.caseMinigameSuspects || {};
|
||||
space.caseMinigameSuspects[suspectIndex] = true;
|
||||
}
|
||||
const grantedKeys = new Set(); /* แจก 1 การ์ด/playerKey ต่อเกม — กัน "หลายแท็บ/ชื่อซ้ำ" key เดียวได้เกิน */
|
||||
(playerIds || []).forEach((pid) => {
|
||||
if (!space.peers.has(pid)) return;
|
||||
@@ -4283,6 +4309,8 @@ function computeAndEmitTrialResult(sid, space) {
|
||||
const evTotal = evRows.reduce((s, row) => s + (Array.isArray(row) ? row.length : 0), 0);
|
||||
/* c2 High Stakes: โหวตถูกโดยมีหลักฐาน ≤3 ใบ */
|
||||
if (evTotal <= 3) achv.push({ playerKey: p.playerKey, id: 'c2_high_stakes', inc: 1 });
|
||||
/* c1 Early Accusation: โหวตถูกโดยมีหลักฐาน ≤1 ใบ (ชี้ตัวก่อนเปิดหลักฐานครบ) */
|
||||
if (evTotal <= 1) achv.push({ playerKey: p.playerKey, id: 'c1_early_accusation', inc: 1 });
|
||||
/* a4 Logic Over Luck: โหวตถูกโดยไม่มีหลักฐาน legendary (ชี้ชัด) เลย */
|
||||
const hasLegendary = evRows.some((row) => Array.isArray(row) && row.some((c) => c && c.rarity === 'legendary'));
|
||||
if (!hasLegendary) achv.push({ playerKey: p.playerKey, id: 'a4_logic_over_luck', inc: 1 });
|
||||
@@ -4307,7 +4335,47 @@ function computeAndEmitTrialResult(sid, space) {
|
||||
achv.push({ playerKey: dKey, id: 'e5_slippery_eel', inc: 1 }); /* target 5 */
|
||||
}
|
||||
}
|
||||
/* ===== Phase C/D (2026-07-06) — ต่อผู้เล่นที่จบคดี (ไม่ใช่แค่ผู้โหวตถูก) ===== */
|
||||
const streakItems = [];
|
||||
/* c3 Quick Draw: ผู้โหวตถูกที่ "โหวตเร็วที่สุด" ในทีม (ใช้ trialVoteAt) */
|
||||
{
|
||||
let fastId = null, fastAt = Infinity;
|
||||
winners.forEach((id) => {
|
||||
const at = space.trialVoteAt && space.trialVoteAt[id];
|
||||
const wp = space.peers.get(id);
|
||||
if (at && wp && wp.playerKey && at < fastAt) { fastAt = at; fastId = id; }
|
||||
});
|
||||
if (fastId) { const fp = space.peers.get(fastId); if (fp && fp.playerKey) achv.push({ playerKey: fp.playerKey, id: 'c3_quick_draw', inc: 1 }); }
|
||||
}
|
||||
/* วนผู้เล่นจริงทุกคนที่จบคดี (ข้ามบอท/ผู้ถูกแบน spectator) */
|
||||
const caseMgSuspects = Object.keys(space.caseMinigameSuspects || {}).map((n) => parseInt(n, 10));
|
||||
const targetedKeys = space.caseCardTargetedKeys || {};
|
||||
space.peers.forEach((p, pid) => {
|
||||
if (!p || !p.playerKey || p.bannedSpectator) return;
|
||||
const evRows = clonePlayerEvidence(space, pid);
|
||||
const rarSet = {};
|
||||
evRows.forEach((row) => { if (Array.isArray(row)) row.forEach((c) => { if (c && c.rarity) rarSet[c.rarity] = true; }); });
|
||||
/* a3 Mind Architect: มีหลักฐานครบ 3 ระดับในคดีนี้ (common+rare+legendary) */
|
||||
if (rarSet.common && rarSet.rare && rarSet.legendary) achv.push({ playerKey: p.playerKey, id: 'a3_mind_architect', inc: 1 });
|
||||
/* b2 Relentless Investigator: เก็บหลักฐานครบทุก suspect ที่มีมินิเกมรันในคดีนี้ (= เล่นครบทุกรอบ) */
|
||||
if (caseMgSuspects.length > 0 && caseMgSuspects.every((si) => Array.isArray(evRows[si]) && evRows[si].length > 0)) {
|
||||
achv.push({ playerKey: p.playerKey, id: 'b2_relentless_investigator', inc: 1 });
|
||||
}
|
||||
/* d2 Silent Guardian: ไม่โดนโหวตการ์ด Silence/Ban ในคดีนี้ */
|
||||
if (!targetedKeys[p.playerKey]) achv.push({ playerKey: p.playerKey, id: 'd2_silent_guardian', inc: 1 });
|
||||
/* e1 The Observer (streak): จบคดีนี้โดยไม่แตะ legendary = hit, แตะ = รีเซ็ต */
|
||||
streakItems.push({ playerKey: p.playerKey, id: 'e1_the_observer', event: rarSet.legendary ? 'miss' : 'hit' });
|
||||
});
|
||||
/* a6 Unbreakable Logic (โหวตถูกติดกัน) + d4 Flawless Diver (ไม่โหวตผิดติดกัน) — เฉพาะคนที่โหวตจริง */
|
||||
Object.keys(votes).forEach((id) => {
|
||||
const p = space.peers.get(id);
|
||||
if (!p || !p.playerKey) return;
|
||||
const ok = votes[id] === culprit;
|
||||
streakItems.push({ playerKey: p.playerKey, id: 'a6_unbreakable_logic', event: ok ? 'hit' : 'miss' });
|
||||
streakItems.push({ playerKey: p.playerKey, id: 'd4_flawless_diver', event: ok ? 'hit' : 'miss' });
|
||||
});
|
||||
submitAchievementProgress(achv);
|
||||
submitAchievementStreak(streakItems);
|
||||
} catch (e) { console.error('[achv] trial-result', e && e.message); }
|
||||
|
||||
space.silencedPlayerId = null;
|
||||
@@ -4576,6 +4644,14 @@ function resolvePlayerPickVote(sid, space) {
|
||||
const tc = pv.candidates.find((c) => c.id === target);
|
||||
const targetName = tc ? tc.nickname : '';
|
||||
io.to(sid).emit('player-pick-vote-result', { purpose: pv.purpose, targetId: target, targetName, counts });
|
||||
/* [achv d2] บันทึก playerKey ที่โดนโหวตการ์ด Silence/Ban ในคดีนี้ (→ ไม่ได้ d2_silent_guardian) */
|
||||
if (target && (pv.purpose === 'silence' || pv.purpose === 'ban')) {
|
||||
const tp = space.peers.get(target);
|
||||
if (tp && tp.playerKey) {
|
||||
space.caseCardTargetedKeys = space.caseCardTargetedKeys || {};
|
||||
space.caseCardTargetedKeys[tp.playerKey] = true;
|
||||
}
|
||||
}
|
||||
const cb = pv.onResolve;
|
||||
space.pickVote = null;
|
||||
if (typeof cb === 'function') cb(target, targetName);
|
||||
@@ -11149,6 +11225,11 @@ io.on('connection', (socket) => {
|
||||
const sq = space.specialQuiz;
|
||||
if (!sq || sq.triggered || sq.done) return reply({ ok: false });
|
||||
const started = startSpecialQuizSession(sid, space);
|
||||
/* [achv b5] คนที่แตะไอคอน ตำรวจ/ทนาย = คนเก็บไอเทมช่วยเหลือ (trigger ครั้งเดียว/ไอคอน) */
|
||||
if (started) {
|
||||
const bp = space.peers.get(socket.id);
|
||||
if (bp && bp.playerKey) submitAchievementProgress([{ playerKey: bp.playerKey, id: 'b5_deep_scanner', inc: 1 }]);
|
||||
}
|
||||
reply({ ok: !!started });
|
||||
});
|
||||
|
||||
@@ -11804,7 +11885,15 @@ io.on('connection', (socket) => {
|
||||
return reply({ ok: false, error: 'ต้องเลือกหลักฐาน ' + required + ' ใบ (ตามจำนวนที่เก็บได้)' });
|
||||
}
|
||||
if (!space.testimonySubmitted) space.testimonySubmitted = {};
|
||||
const d3AlreadySubmitted = space.testimonySubmitted[socket.id] !== undefined;
|
||||
space.testimonySubmitted[socket.id] = picks.slice(0, required);
|
||||
/* [achv d3] นับหลักฐานที่ "ส่งมอบให้ทีมวิเคราะห์" บนหน้า es3 (ห้องสรุปหลักฐาน) — นับครั้งแรกของรอบนี้เท่านั้น กันนับซ้ำ */
|
||||
if (!d3AlreadySubmitted) {
|
||||
const d3p = space.peers.get(socket.id);
|
||||
if (d3p && d3p.playerKey && picks.length > 0) {
|
||||
submitAchievementProgress([{ playerKey: d3p.playerKey, id: 'd3_the_backbone', inc: picks.length }]);
|
||||
}
|
||||
}
|
||||
emitTestimonyStatus(sid, space);
|
||||
/* ไม่ auto-reveal — รอ host กดปุ่ม "เปิดหลักฐานทั้งหมด" เองตาม design
|
||||
(UX: host ต้องเห็นปุ่มเปลี่ยนรูปจาก btn-send → btn-open-card แล้วค่อยกดเอง) */
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -16239,3 +16239,146 @@
|
||||
{"t":1783265946499,"cat":"LobbyB","room":"a-1783265509117","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:21.3,11.2->20.2,11.0 b1:5.4,9.3->5.4,9.3 b2:8.4,8.9->8.4,10.0 b3:19.3,9.2->19.3,9.2 b4:27.9,10.7->27.9,10.7] [+279503ms]","src":"client"}
|
||||
{"t":1783265950528,"cat":"LobbyB","room":"a-1783265509117","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:8.4,7.5->8.4,7.5 b1:8.0,10.6->7.1,11.1 b2:24.9,16.9->24.9,16.9 b3:21.0,13.6->20.0,13.3 b4:14.2,6.6->14.9,7.3] [+283534ms]","src":"client"}
|
||||
{"t":1783265954564,"cat":"LobbyB","room":"a-1783265509117","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:12.4,5.4->12.4,5.4 b1:7.6,9.1->7.6,9.1 b2:22.9,6.2->22.9,6.2 b3:19.0,11.4->19.0,11.4 b4:26.0,8.3->25.9,7.3] [+287567ms]","src":"client"}
|
||||
{"t":1783308796514,"cat":"LobbyA","room":"a-1783308793150","who":"บอท7","ev":"lobby-open","detail":"space=a-1783308793150 [+0ms]","src":"client"}
|
||||
{"t":1783308796652,"cat":"LobbyA","room":"a-1783308793150","who":"บอท7","ev":"preload-start","detail":" [+23ms]","src":"client"}
|
||||
{"t":1783308796657,"cat":"LobbyA","room":"a-1783308793150","who":"บอท7","ev":"suspect-gate","detail":"postCase=false howtoOk=true micOk=true sent=false [+21ms]","src":"client"}
|
||||
{"t":1783308796738,"cat":"LobbyA","room":"a-1783308793150","who":"บอท7","ev":"manifest-done","detail":" [+213ms]","src":"client"}
|
||||
{"t":1783308796743,"cat":"LobbyA","room":"a-1783308793150","who":"บอท7","ev":"colors-resolved","detail":" [+213ms]","src":"client"}
|
||||
{"t":1783308796803,"cat":"LobbyA","room":"a-1783308793150","who":"บอท7","ev":"socket-connect","detail":" [+248ms]","src":"client"}
|
||||
{"t":1783308796809,"cat":"LobbyA","room":"a","who":"บอท7","ev":"join","detail":"สี#7 · คน 1 + บอท 5","src":"server"}
|
||||
{"t":1783308798275,"cat":"LobbyA","room":"a-1783308793150","who":"บอท7","ev":"join-ok","detail":"peers=1 host=me map=mlsbbxfe bots=5 [+1758ms]","src":"client"}
|
||||
{"t":1783308798315,"cat":"LobbyA","room":"a-1783308793150","who":"บอท7","ev":"suspect-join","detail":"phaseActive=false pickIdx=0 postCase=false clientMapId=mlsbbxfe spaceId=a-1783308793150 mapName=LobbyA [+1786ms]","src":"client"}
|
||||
{"t":1783308798319,"cat":"LobbyA","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:10.0,14.0->10.9,14.0 b1:16.0,14.0->16.8,13.6 b2:22.0,13.0->21.1,13.2 b3:23.0,8.0->23.4,7.2 b4:15.0,5.0->14.1,5.0] [+1791ms]","src":"client"}
|
||||
{"t":1783308799352,"cat":"LobbyA","room":"a-1783308793150","who":"บอท7","ev":"mychar-tinted","detail":"roomJoinReady=true [+2851ms]","src":"client"}
|
||||
{"t":1783308800993,"cat":"LobbyA","room":"a-1783308793150","who":"บอท7","ev":"preload-occupants-done","detail":" [+4488ms]","src":"client"}
|
||||
{"t":1783308801017,"cat":"LobbyA","room":"a-1783308793150","who":"บอท7","ev":"preload-ready(occupants)","detail":" [+4489ms]","src":"client"}
|
||||
{"t":1783308801039,"cat":"LobbyA","room":"a-1783308793150","who":"บอท7","ev":"loading-hide","detail":"เริ่มเล่นได้ [+4489ms]","src":"client"}
|
||||
{"t":1783308804980,"cat":"LobbyA","room":"a","who":"บอท7","ev":"preplay-lock","detail":"[TC154] host เปิด wizard เลือกคดี → ล็อก set-ready ทั้งห้อง (1 คนในห้อง)","src":"server"}
|
||||
{"t":1783308808805,"cat":"LobbyA","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:28.0,13.7->28.0,13.7 b1:20.2,10.2->20.2,10.2 b2:6.4,15.8->6.4,15.8 b3:19.0,4.6->19.0,4.6 b4:6.1,4.1->6.1,4.0] [+12301ms]","src":"client"}
|
||||
{"t":1783308808868,"cat":"LobbyB","room":"a","who":"บอท7","ev":"preplay-lock","detail":"[TC154] host ปิด wizard → ปลดล็อก set-ready (1 คนในห้อง)","src":"server"}
|
||||
{"t":1783308809327,"cat":"LobbyA","room":"a-1783308793150","who":"บอท7","ev":"loading-hide","detail":"เริ่มเล่นได้ [+12816ms]","src":"client"}
|
||||
{"t":1783308812129,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"suspect-gate","detail":"postCase=true howtoOk=true micOk=true sent=false [+15600ms]","src":"client"}
|
||||
{"t":1783308812804,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"suspect-open-evt","detail":"idx=0 postCase=true [+16280ms]","src":"client"}
|
||||
{"t":1783308812980,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:16.0,13.5->15.1,13.3 b1:14.5,12.2->14.5,12.3 b2:8.1,17.0->8.1,17.0 b3:7.6,16.6->7.6,16.6 b4:11.7,12.8->12.4,13.2] [+16425ms]","src":"client"}
|
||||
{"t":1783308813857,"cat":"LobbyB","room":"a","who":"บอท7","ev":"story-gate","detail":"[TC156] อ่าน story จบ 1/1","src":"server"}
|
||||
{"t":1783308813858,"cat":"LobbyB","room":"a","who":"","ev":"story-gate","detail":"[TC156] ทุกคนอ่าน story ครบ (1) → ปลดล็อกเลือกผู้ต้องสงสัย (pass)","src":"server"}
|
||||
{"t":1783308814305,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"loading-hide","detail":"เริ่มเล่นได้ [+17799ms]","src":"client"}
|
||||
{"t":1783308817108,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:5.9,9.8->6.7,10.0 b1:14.4,14.6->15.5,14.2 b2:16.0,14.0->14.9,14.1 b3:7.6,16.6->7.6,16.6 b4:9.2,12.1->10.1,11.7] [+20604ms]","src":"client"}
|
||||
{"t":1783308821165,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->27.7,14.7 b1:15.7,13.7->20.4,12.7 b2:6.3,15.7->9.5,15.1 b3:5.9,15.1->5.8,15.1 b4:20.4,5.9->20.4,5.9] [+24662ms]","src":"client"}
|
||||
{"t":1783308825196,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->14.4,8.9 b1:15.7,13.7->8.1,8.0 b2:6.3,15.7->27.6,11.7 b3:5.9,15.1->27.9,13.7 b4:20.4,5.9->7.6,16.6] [+28690ms]","src":"client"}
|
||||
{"t":1783308829238,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->27.4,16.8 b1:15.7,13.7->8.1,4.7 b2:6.3,15.7->16.3,8.5 b3:5.9,15.1->25.5,12.2 b4:20.4,5.9->7.6,16.6] [+32730ms]","src":"client"}
|
||||
{"t":1783308833265,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->8.3,13.0 b1:15.7,13.7->7.4,13.6 b2:6.3,15.7->7.8,14.1 b3:5.9,15.1->12.7,12.6 b4:20.4,5.9->14.2,10.9] [+36759ms]","src":"client"}
|
||||
{"t":1783308837302,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->24.0,6.0 b1:15.7,13.7->26.3,14.0 b2:6.3,15.7->20.2,9.3 b3:5.9,15.1->16.6,16.7 b4:20.4,5.9->28.0,10.4] [+40796ms]","src":"client"}
|
||||
{"t":1783308841334,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->12.1,6.7 b1:15.7,13.7->5.3,9.8 b2:6.3,15.7->23.6,8.5 b3:5.9,15.1->17.8,5.2 b4:20.4,5.9->20.3,5.2] [+44830ms]","src":"client"}
|
||||
{"t":1783308845500,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->10.4,7.8 b1:15.7,13.7->5.3,9.5 b2:6.3,15.7->27.9,9.2 b3:5.9,15.1->17.4,8.0 b4:20.4,5.9->11.7,12.3] [+48904ms]","src":"client"}
|
||||
{"t":1783308849416,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->8.2,7.5 b1:15.7,13.7->15.2,13.4 b2:6.3,15.7->19.2,9.0 b3:5.9,15.1->21.6,5.3 b4:20.4,5.9->15.1,16.4] [+52912ms]","src":"client"}
|
||||
{"t":1783308853447,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->24.0,13.5 b1:15.7,13.7->13.7,5.3 b2:6.3,15.7->22.2,8.3 b3:5.9,15.1->14.3,10.9 b4:20.4,5.9->7.2,13.5] [+56939ms]","src":"client"}
|
||||
{"t":1783308857476,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->27.9,10.4 b1:15.7,13.7->9.3,16.9 b2:6.3,15.7->16.2,13.0 b3:5.9,15.1->13.4,13.1 b4:20.4,5.9->16.0,6.4] [+60968ms]","src":"client"}
|
||||
{"t":1783308861518,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->23.7,16.8 b1:15.7,13.7->13.9,5.7 b2:6.3,15.7->23.3,15.1 b3:5.9,15.1->21.9,5.2 b4:20.4,5.9->7.6,10.8] [+65011ms]","src":"client"}
|
||||
{"t":1783308865542,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->22.5,16.8 b1:15.7,13.7->13.9,5.5 b2:6.3,15.7->19.0,9.1 b3:5.9,15.1->12.7,11.6 b4:20.4,5.9->28.0,14.4] [+69037ms]","src":"client"}
|
||||
{"t":1783308869576,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->16.9,13.3 b1:15.7,13.7->19.0,10.1 b2:6.3,15.7->8.2,8.3 b3:5.9,15.1->20.2,15.7 b4:20.4,5.9->28.3,12.4] [+73071ms]","src":"client"}
|
||||
{"t":1783308873618,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->25.8,4.0 b1:15.7,13.7->26.4,10.6 b2:6.3,15.7->28.8,8.6 b3:5.9,15.1->11.1,12.2 b4:20.4,5.9->19.9,7.3] [+77108ms]","src":"client"}
|
||||
{"t":1783308877655,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->26.8,8.7 b1:15.7,13.7->24.6,8.8 b2:6.3,15.7->10.3,15.7 b3:5.9,15.1->19.5,6.1 b4:20.4,5.9->16.3,6.4] [+81148ms]","src":"client"}
|
||||
{"t":1783308881690,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->18.1,16.2 b1:15.7,13.7->8.1,8.0 b2:6.3,15.7->13.4,16.7 b3:5.9,15.1->27.6,16.4 b4:20.4,5.9->28.6,8.1] [+85185ms]","src":"client"}
|
||||
{"t":1783308885722,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->15.8,16.8 b1:15.7,13.7->13.3,11.2 b2:6.3,15.7->21.2,8.8 b3:5.9,15.1->7.1,14.9 b4:20.4,5.9->19.5,10.9] [+89216ms]","src":"client"}
|
||||
{"t":1783308889750,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->15.5,16.4 b1:15.7,13.7->24.5,17.0 b2:6.3,15.7->19.1,10.9 b3:5.9,15.1->7.1,14.8 b4:20.4,5.9->19.4,11.0] [+93246ms]","src":"client"}
|
||||
{"t":1783308893787,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->19.2,11.5 b1:15.7,13.7->24.5,17.0 b2:6.3,15.7->10.0,8.5 b3:5.9,15.1->13.5,9.0 b4:20.4,5.9->9.6,12.4] [+97280ms]","src":"client"}
|
||||
{"t":1783308897822,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->7.9,16.8 b1:15.7,13.7->13.9,5.0 b2:6.3,15.7->12.0,10.7 b3:5.9,15.1->19.5,9.0 b4:20.4,5.9->6.5,10.6] [+101315ms]","src":"client"}
|
||||
{"t":1783308901902,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->14.6,12.9 b1:15.7,13.7->13.9,5.4 b2:6.3,15.7->14.6,10.6 b3:5.9,15.1->27.8,12.0 b4:20.4,5.9->23.4,8.2] [+105393ms]","src":"client"}
|
||||
{"t":1783308905962,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->8.1,5.2 b1:15.7,13.7->13.9,5.5 b2:6.3,15.7->11.4,7.6 b3:5.9,15.1->12.4,5.1 b4:20.4,5.9->27.7,16.1] [+109458ms]","src":"client"}
|
||||
{"t":1783308909992,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->17.7,14.9 b1:15.7,13.7->18.9,8.8 b2:6.3,15.7->20.0,14.1 b3:5.9,15.1->12.4,5.1 b4:20.4,5.9->27.7,16.8] [+113487ms]","src":"client"}
|
||||
{"t":1783308914022,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->7.7,10.4 b1:15.7,13.7->15.3,8.8 b2:6.3,15.7->9.7,16.8 b3:5.9,15.1->8.3,9.0 b4:20.4,5.9->12.8,5.2] [+117515ms]","src":"client"}
|
||||
{"t":1783308918051,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->19.1,9.5 b1:15.7,13.7->27.3,9.6 b2:6.3,15.7->24.7,13.2 b3:5.9,15.1->16.8,5.4 b4:20.4,5.9->22.2,16.8] [+121546ms]","src":"client"}
|
||||
{"t":1783308922088,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->21.5,7.1 b1:15.7,13.7->18.0,8.6 b2:6.3,15.7->27.6,10.1 b3:5.9,15.1->17.9,5.4 b4:20.4,5.9->27.7,16.7] [+125583ms]","src":"client"}
|
||||
{"t":1783308926131,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->19.3,10.0 b1:15.7,13.7->18.0,8.6 b2:6.3,15.7->27.6,10.0 b3:5.9,15.1->15.3,8.7 b4:20.4,5.9->27.7,16.7] [+129622ms]","src":"client"}
|
||||
{"t":1783308930159,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->19.3,10.6 b1:15.7,13.7->27.5,11.7 b2:6.3,15.7->20.1,16.7 b3:5.9,15.1->23.4,7.8 b4:20.4,5.9->28.7,8.4] [+133654ms]","src":"client"}
|
||||
{"t":1783308934192,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->8.5,7.5 b1:15.7,13.7->12.4,17.0 b2:6.3,15.7->20.0,11.4 b3:5.9,15.1->6.2,10.6 b4:20.4,5.9->28.7,8.2] [+137687ms]","src":"client"}
|
||||
{"t":1783308938234,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->28.0,9.2 b1:15.7,13.7->14.2,16.3 b2:6.3,15.7->15.3,8.8 b3:5.9,15.1->8.8,16.7 b4:20.4,5.9->19.6,16.9] [+141729ms]","src":"client"}
|
||||
{"t":1783308942267,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->10.8,6.7 b1:15.7,13.7->27.5,11.4 b2:6.3,15.7->8.6,15.9 b3:5.9,15.1->8.8,16.7 b4:20.4,5.9->19.6,16.9] [+145762ms]","src":"client"}
|
||||
{"t":1783308946307,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->25.6,10.4 b1:15.7,13.7->19.6,9.9 b2:6.3,15.7->8.3,11.5 b3:5.9,15.1->27.3,16.6 b4:20.4,5.9->9.5,5.5] [+149800ms]","src":"client"}
|
||||
{"t":1783308950335,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->12.2,7.8 b1:15.7,13.7->20.2,5.0 b2:6.3,15.7->15.0,10.8 b3:5.9,15.1->23.6,6.0 b4:20.4,5.9->12.6,7.0] [+153831ms]","src":"client"}
|
||||
{"t":1783308954374,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->19.3,8.0 b1:15.7,13.7->22.5,16.8 b2:6.3,15.7->23.4,8.9 b3:5.9,15.1->17.0,17.0 b4:20.4,5.9->11.9,16.3] [+157869ms]","src":"client"}
|
||||
{"t":1783308958408,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->13.5,15.9 b1:15.7,13.7->26.1,10.1 b2:6.3,15.7->6.5,9.3 b3:5.9,15.1->6.8,17.0 b4:20.4,5.9->28.0,15.0] [+161902ms]","src":"client"}
|
||||
{"t":1783308962454,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->19.4,11.6 b1:15.7,13.7->19.4,10.8 b2:6.3,15.7->14.5,11.4 b3:5.9,15.1->7.6,9.4 b4:20.4,5.9->28.0,15.0] [+165949ms]","src":"client"}
|
||||
{"t":1783308966477,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->19.4,12.7 b1:15.7,13.7->9.9,5.0 b2:6.3,15.7->14.6,14.8 b3:5.9,15.1->9.1,16.8 b4:20.4,5.9->12.1,16.8] [+169971ms]","src":"client"}
|
||||
{"t":1783308970523,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->9.0,16.9 b1:15.7,13.7->9.9,5.6 b2:6.3,15.7->18.7,13.3 b3:5.9,15.1->15.8,6.0 b4:20.4,5.9->21.9,5.3] [+174016ms]","src":"client"}
|
||||
{"t":1783308974557,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->27.9,14.5 b1:15.7,13.7->27.1,5.9 b2:6.3,15.7->21.8,13.5 b3:5.9,15.1->20.3,7.2 b4:20.4,5.9->8.7,9.1] [+178048ms]","src":"client"}
|
||||
{"t":1783308978590,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->27.9,14.4 b1:15.7,13.7->7.6,16.7 b2:6.3,15.7->23.9,6.1 b3:5.9,15.1->8.9,6.1 b4:20.4,5.9->8.8,4.3] [+182085ms]","src":"client"}
|
||||
{"t":1783308982626,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->9.0,9.4 b1:15.7,13.7->14.9,9.3 b2:6.3,15.7->16.5,6.1 b3:5.9,15.1->5.3,16.9 b4:20.4,5.9->8.8,4.4] [+186122ms]","src":"client"}
|
||||
{"t":1783308986657,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->16.2,5.7 b1:15.7,13.7->27.6,9.2 b2:6.3,15.7->13.5,5.7 b3:5.9,15.1->20.2,12.6 b4:20.4,5.9->11.2,6.5] [+190152ms]","src":"client"}
|
||||
{"t":1783308990699,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->7.6,11.8 b1:15.7,13.7->16.9,13.4 b2:6.3,15.7->14.6,16.6 b3:5.9,15.1->20.1,13.7 b4:20.4,5.9->14.1,10.9] [+194194ms]","src":"client"}
|
||||
{"t":1783308994721,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->7.2,13.9 b1:15.7,13.7->18.1,13.4 b2:6.3,15.7->27.6,16.5 b3:5.9,15.1->18.6,8.9 b4:20.4,5.9->8.3,4.3] [+198215ms]","src":"client"}
|
||||
{"t":1783308998756,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->16.1,5.4 b1:15.7,13.7->9.0,7.0 b2:6.3,15.7->19.3,10.5 b3:5.9,15.1->14.7,9.0 b4:20.4,5.9->14.2,9.9] [+202250ms]","src":"client"}
|
||||
{"t":1783309002779,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->9.3,16.9 b1:15.7,13.7->9.4,7.1 b2:6.3,15.7->14.0,14.0 b3:5.9,15.1->5.4,9.4 b4:20.4,5.9->8.3,7.8] [+206273ms]","src":"client"}
|
||||
{"t":1783309006814,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->27.1,12.1 b1:15.7,13.7->8.4,6.3 b2:6.3,15.7->18.6,13.3 b3:5.9,15.1->19.2,10.2 b4:20.4,5.9->14.6,10.0] [+210307ms]","src":"client"}
|
||||
{"t":1783309010857,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->27.7,11.5 b1:15.7,13.7->8.4,4.5 b2:6.3,15.7->16.2,15.2 b3:5.9,15.1->26.0,16.8 b4:20.4,5.9->13.6,11.6] [+214353ms]","src":"client"}
|
||||
{"t":1783309014882,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->17.1,6.0 b1:15.7,13.7->8.4,4.5 b2:6.3,15.7->6.6,15.4 b3:5.9,15.1->19.6,12.7 b4:20.4,5.9->19.0,6.7] [+218376ms]","src":"client"}
|
||||
{"t":1783309018908,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->20.8,9.7 b1:15.7,13.7->14.7,12.9 b2:6.3,15.7->28.7,8.7 b3:5.9,15.1->21.8,11.3 b4:20.4,5.9->16.4,8.8] [+222407ms]","src":"client"}
|
||||
{"t":1783309022946,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->19.4,9.5 b1:15.7,13.7->9.2,12.8 b2:6.3,15.7->19.1,11.5 b3:5.9,15.1->5.2,15.2 b4:20.4,5.9->15.9,8.5] [+226441ms]","src":"client"}
|
||||
{"t":1783309026992,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->19.4,9.7 b1:15.7,13.7->14.5,9.1 b2:6.3,15.7->19.1,11.8 b3:5.9,15.1->19.3,6.2 b4:20.4,5.9->14.7,12.1] [+230485ms]","src":"client"}
|
||||
{"t":1783309031024,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->19.4,10.0 b1:15.7,13.7->27.3,10.2 b2:6.3,15.7->28.7,12.7 b3:5.9,15.1->19.7,6.5 b4:20.4,5.9->28.7,6.7] [+234518ms]","src":"client"}
|
||||
{"t":1783309035059,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->19.4,9.8 b1:15.7,13.7->19.3,12.4 b2:6.3,15.7->19.1,11.0 b3:5.9,15.1->23.1,13.3 b4:20.4,5.9->28.4,6.7] [+238555ms]","src":"client"}
|
||||
{"t":1783309039175,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->26.4,8.1 b1:15.7,13.7->9.1,7.1 b2:6.3,15.7->11.2,16.4 b3:5.9,15.1->19.3,10.9 b4:20.4,5.9->27.3,5.1] [+242670ms]","src":"client"}
|
||||
{"t":1783309043199,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->28.8,12.9 b1:15.7,13.7->14.8,10.5 b2:6.3,15.7->11.0,10.3 b3:5.9,15.1->13.5,5.3 b4:20.4,5.9->25.1,4.6] [+246693ms]","src":"client"}
|
||||
{"t":1783309047233,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->9.2,5.4 b1:15.7,13.7->23.0,6.1 b2:6.3,15.7->8.3,5.2 b3:5.9,15.1->27.9,10.8 b4:20.4,5.9->25.1,4.3] [+250727ms]","src":"client"}
|
||||
{"t":1783309051271,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->21.8,5.5 b1:15.7,13.7->28.9,7.2 b2:6.3,15.7->8.3,4.4 b3:5.9,15.1->28.5,12.5 b4:20.4,5.9->19.4,12.7] [+254762ms]","src":"client"}
|
||||
{"t":1783309055303,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->9.3,5.4 b1:15.7,13.7->25.0,16.5 b2:6.3,15.7->13.3,5.6 b3:5.9,15.1->12.3,6.7 b4:20.4,5.9->27.6,14.4] [+258797ms]","src":"client"}
|
||||
{"t":1783309059340,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->24.3,8.6 b1:15.7,13.7->12.5,17.0 b2:6.3,15.7->8.5,7.3 b3:5.9,15.1->27.7,10.1 b4:20.4,5.9->11.1,6.4] [+262834ms]","src":"client"}
|
||||
{"t":1783309063377,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->22.4,12.0 b1:15.7,13.7->13.0,17.0 b2:6.3,15.7->13.6,9.2 b3:5.9,15.1->27.7,10.1 b4:20.4,5.9->27.7,16.8] [+266874ms]","src":"client"}
|
||||
{"t":1783309067403,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->6.6,17.0 b1:15.7,13.7->9.3,14.6 b2:6.3,15.7->25.0,14.1 b3:5.9,15.1->27.7,10.9 b4:20.4,5.9->10.4,12.0] [+270898ms]","src":"client"}
|
||||
{"t":1783309071439,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->14.0,5.7 b1:15.7,13.7->7.5,9.3 b2:6.3,15.7->7.4,14.1 b3:5.9,15.1->20.4,8.9 b4:20.4,5.9->26.9,11.1] [+274935ms]","src":"client"}
|
||||
{"t":1783309075465,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->9.4,16.5 b1:15.7,13.7->20.8,14.5 b2:6.3,15.7->24.8,13.4 b3:5.9,15.1->8.4,4.7 b4:20.4,5.9->22.6,6.4] [+278960ms]","src":"client"}
|
||||
{"t":1783309079506,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->12.7,14.2 b1:15.7,13.7->17.2,16.7 b2:6.3,15.7->21.9,13.7 b3:5.9,15.1->9.8,14.8 b4:20.4,5.9->17.1,8.5] [+282998ms]","src":"client"}
|
||||
{"t":1783309083535,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->25.5,7.3 b1:15.7,13.7->19.0,10.8 b2:6.3,15.7->27.8,13.0 b3:5.9,15.1->14.8,10.3 b4:20.4,5.9->11.1,14.6] [+287037ms]","src":"client"}
|
||||
{"t":1783309087574,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->21.0,16.7 b1:15.7,13.7->19.1,6.5 b2:6.3,15.7->11.2,15.9 b3:5.9,15.1->20.8,15.5 b4:20.4,5.9->12.8,16.7] [+291070ms]","src":"client"}
|
||||
{"t":1783309091604,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->15.2,16.9 b1:15.7,13.7->17.9,5.6 b2:6.3,15.7->23.1,14.5 b3:5.9,15.1->7.4,10.7 b4:20.4,5.9->20.6,6.8] [+295101ms]","src":"client"}
|
||||
{"t":1783309095637,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->13.7,16.9 b1:15.7,13.7->14.0,10.3 b2:6.3,15.7->7.0,11.8 b3:5.9,15.1->8.2,7.2 b4:20.4,5.9->27.9,16.6] [+299132ms]","src":"client"}
|
||||
{"t":1783309099679,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->25.4,3.2 b1:15.7,13.7->8.6,16.9 b2:6.3,15.7->13.8,5.1 b3:5.9,15.1->7.5,14.8 b4:20.4,5.9->27.9,16.9] [+303175ms]","src":"client"}
|
||||
{"t":1783309103720,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->25.4,4.6 b1:15.7,13.7->19.2,11.7 b2:6.3,15.7->13.8,5.1 b3:5.9,15.1->6.5,9.1 b4:20.4,5.9->27.9,14.4] [+307215ms]","src":"client"}
|
||||
{"t":1783309107775,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->24.3,5.5 b1:15.7,13.7->19.2,11.0 b2:6.3,15.7->27.9,15.5 b3:5.9,15.1->9.2,9.0 b4:20.4,5.9->5.2,15.7] [+311260ms]","src":"client"}
|
||||
{"t":1783309111819,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->28.6,7.1 b1:15.7,13.7->19.2,12.1 b2:6.3,15.7->27.9,16.4 b3:5.9,15.1->27.7,14.4 b4:20.4,5.9->18.8,13.3] [+315318ms]","src":"client"}
|
||||
{"t":1783309115827,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->22.7,8.2 b1:15.7,13.7->17.2,6.3 b2:6.3,15.7->7.8,11.0 b3:5.9,15.1->27.7,14.6 b4:20.4,5.9->28.5,8.6] [+319322ms]","src":"client"}
|
||||
{"t":1783309119861,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->8.2,7.1 b1:15.7,13.7->14.8,12.7 b2:6.3,15.7->15.3,13.1 b3:5.9,15.1->19.4,9.2 b4:20.4,5.9->26.2,10.0] [+323359ms]","src":"client"}
|
||||
{"t":1783309123896,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->25.2,5.5 b1:15.7,13.7->17.4,16.5 b2:6.3,15.7->18.1,8.8 b3:5.9,15.1->16.7,5.1 b4:20.4,5.9->8.8,10.0] [+327394ms]","src":"client"}
|
||||
{"t":1783309127932,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->7.5,14.5 b1:15.7,13.7->23.7,6.5 b2:6.3,15.7->25.7,8.9 b3:5.9,15.1->7.0,13.8 b4:20.4,5.9->8.9,10.0] [+331430ms]","src":"client"}
|
||||
{"t":1783309131975,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->27.4,8.8 b1:15.7,13.7->8.1,5.8 b2:6.3,15.7->29.0,8.9 b3:5.9,15.1->14.8,9.2 b4:20.4,5.9->16.4,13.1] [+335472ms]","src":"client"}
|
||||
{"t":1783309136013,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->28.9,7.5 b1:15.7,13.7->9.7,5.8 b2:6.3,15.7->19.2,12.7 b3:5.9,15.1->26.3,7.2 b4:20.4,5.9->8.1,8.8] [+339510ms]","src":"client"}
|
||||
{"t":1783309140099,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->27.6,14.6 b1:15.7,13.7->27.8,9.7 b2:6.3,15.7->18.1,8.9 b3:5.9,15.1->13.5,16.5 b4:20.4,5.9->9.2,11.6] [+343541ms]","src":"client"}
|
||||
{"t":1783309144087,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.3,13.9->25.5,9.5 b1:15.7,13.7->16.3,6.4 b2:6.3,15.7->8.4,8.1 b3:5.9,15.1->13.5,16.5 b4:20.4,5.9->18.0,8.1] [+347579ms]","src":"client"}
|
||||
{"t":1783309148121,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:19.0,9.2->19.0,9.2 b1:18.5,13.6->19.5,13.5 b2:14.6,12.1->14.6,12.2 b3:16.6,5.1->16.6,5.0 b4:17.8,5.9->17.8,5.9] [+351617ms]","src":"client"}
|
||||
{"t":1783309152158,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:19.0,11.5->19.0,11.6 b1:16.9,8.8->16.9,8.8 b2:14.6,10.1->14.6,9.9 b3:14.8,11.6->14.8,11.6 b4:20.0,7.5->20.9,8.1] [+355652ms]","src":"client"}
|
||||
{"t":1783309156195,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:7.1,13.6->7.1,13.6 b1:14.8,14.4->15.5,13.9 b2:28.6,6.8->28.6,6.8 b3:14.8,12.0->14.8,12.1 b4:28.0,13.6->28.0,13.6] [+359690ms]","src":"client"}
|
||||
{"t":1783309160226,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:7.0,9.3->7.0,9.3 b1:12.3,6.2->11.4,6.1 b2:8.0,6.4->8.0,6.4 b3:28.1,6.0->28.5,6.9 b4:28.0,13.2->28.0,13.2] [+363721ms]","src":"client"}
|
||||
{"t":1783309164265,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:11.3,6.9->12.2,6.4 b1:14.9,12.2->14.9,12.2 b2:27.8,5.7->28.1,6.4 b3:27.8,16.2->27.8,16.7 b4:12.8,8.3->13.7,8.8] [+367757ms]","src":"client"}
|
||||
{"t":1783309168296,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:19.4,7.4->18.4,7.3 b1:14.1,9.6->13.8,8.6 b2:19.3,11.1->19.2,11.3 b3:13.2,10.4->14.0,9.8 b4:27.7,16.9->27.7,16.9] [+371791ms]","src":"client"}
|
||||
{"t":1783309172337,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:23.2,7.0->23.2,7.0 b1:9.2,16.6->9.2,16.6 b2:19.2,12.6->19.2,12.6 b3:16.7,7.2->16.3,7.3 b4:27.6,13.7->27.6,13.7] [+375832ms]","src":"client"}
|
||||
{"t":1783309176377,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:7.3,10.3->7.3,10.3 b1:14.6,15.4->15.6,15.2 b2:12.7,11.8->11.9,11.4 b3:16.5,8.9->16.0,8.9 b4:27.6,13.8->27.6,13.8] [+379868ms]","src":"client"}
|
||||
{"t":1783309180424,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:8.2,7.6->8.1,7.1 b1:27.5,10.7->27.5,10.7 b2:7.4,9.2->7.4,9.2 b3:9.8,15.4->9.3,16.2 b4:27.6,13.4->27.6,13.4] [+383918ms]","src":"client"}
|
||||
{"t":1783309184454,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:8.6,4.8->8.6,4.8 b1:13.6,5.1->13.6,5.1 b2:15.2,6.8->16.2,6.5 b3:9.0,14.1->8.0,13.8 b4:27.6,5.3->27.6,5.3] [+387947ms]","src":"client"}
|
||||
{"t":1783309188488,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:8.6,4.9->8.6,4.9 b1:13.6,5.3->13.6,5.3 b2:27.6,16.6->27.6,16.6 b3:10.3,8.9->10.8,8.1 b4:24.4,5.6->24.4,5.6] [+391983ms]","src":"client"}
|
||||
{"t":1783309192522,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:8.1,6.1->8.1,6.1 b1:15.8,16.5->15.8,16.5 b2:26.7,16.6->26.7,16.6 b3:18.4,8.3->19.3,8.1 b4:13.3,5.4->13.7,5.2] [+396015ms]","src":"client"}
|
||||
{"t":1783309196560,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:17.3,6.7->18.4,6.8 b1:15.1,13.3->15.0,13.3 b2:26.7,16.6->26.7,16.6 b3:14.9,12.1->14.9,12.3 b4:18.0,8.8->18.0,8.8] [+400053ms]","src":"client"}
|
||||
{"t":1783309200595,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:28.6,7.6->28.6,7.6 b1:14.5,6.3->14.5,6.3 b2:10.2,10.8->9.3,11.4 b3:14.9,12.4->14.9,12.4 b4:11.3,14.8->10.7,15.7] [+404089ms]","src":"client"}
|
||||
{"t":1783309204633,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:19.5,9.8->19.5,9.8 b1:24.9,16.6->24.9,16.6 b2:8.9,13.6->9.7,13.1 b3:27.9,13.3->27.9,13.3 b4:14.8,12.1->14.9,11.7] [+408127ms]","src":"client"}
|
||||
{"t":1783309208665,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:22.2,7.8->23.0,7.3 b1:28.7,12.4->28.7,12.4 b2:14.9,9.3->14.2,9.9 b3:27.8,9.7->27.9,9.5 b4:14.9,10.3->14.9,10.3] [+412161ms]","src":"client"}
|
||||
{"t":1783309212702,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:25.3,4.1->25.3,4.1 b1:16.5,5.0->16.2,5.0 b2:19.6,16.9->19.6,16.9 b3:28.9,8.3->28.9,8.3 b4:7.7,10.3->7.7,10.2] [+416196ms]","src":"client"}
|
||||
{"t":1783309216729,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:24.3,6.2->23.7,7.0 b1:17.2,5.9->17.8,6.5 b2:21.6,5.7->21.4,6.6 b3:11.5,7.4->11.4,7.5 b4:13.0,16.8->13.0,16.8] [+420223ms]","src":"client"}
|
||||
{"t":1783309220760,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:22.9,7.9->21.9,8.2 b1:13.2,13.6->14.2,13.6 b2:18.3,16.5->18.3,16.5 b3:25.2,10.4->25.6,10.7 b4:23.4,12.0->24.4,11.6] [+424256ms]","src":"client"}
|
||||
{"t":1783309224803,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:19.4,10.8->19.4,11.7 b1:28.8,12.3->28.8,12.3 b2:22.1,16.6->22.1,16.6 b3:27.9,16.3->27.9,16.3 b4:27.8,9.5->27.8,9.5] [+428295ms]","src":"client"}
|
||||
{"t":1783309228846,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:15.0,11.7->15.0,11.8 b1:18.7,6.3->18.6,6.3 b2:16.4,13.8->17.3,14.3 b3:19.3,9.3->19.3,9.3 b4:20.7,15.3->19.7,15.5] [+432337ms]","src":"client"}
|
||||
{"t":1783309232879,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:15.0,12.2->15.0,12.2 b1:26.2,6.4->26.2,6.4 b2:7.3,13.5->7.3,13.5 b3:16.5,16.6->16.5,16.6 b4:17.8,7.9->18.8,7.5] [+436372ms]","src":"client"}
|
||||
{"t":1783309236916,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:21.5,7.8->22.4,7.6 b1:19.0,6.1->19.0,6.1 b2:15.3,16.9->15.3,16.9 b3:16.8,16.6->17.6,16.5 b4:23.2,16.6->23.2,16.6] [+440411ms]","src":"client"}
|
||||
{"t":1783309240950,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:8.5,7.1->8.5,7.2 b1:7.4,14.1->7.4,14.5 b2:17.8,13.1->18.4,13.1 b3:23.6,17.0->23.6,17.0 b4:9.3,6.2->9.4,5.3] [+444444ms]","src":"client"}
|
||||
{"t":1783309244988,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:8.5,7.2->8.5,7.2 b1:5.3,16.4->5.3,16.4 b2:25.4,14.6->25.4,14.6 b3:19.4,6.0->19.9,6.0 b4:9.7,5.3->9.7,5.3] [+448480ms]","src":"client"}
|
||||
{"t":1783309249105,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:14.8,11.6->14.8,11.6 b1:8.4,11.3->8.4,11.3 b2:12.4,5.1->12.4,5.1 b3:28.5,8.3->28.5,8.1 b4:8.9,4.2->8.9,4.2] [+452561ms]","src":"client"}
|
||||
{"t":1783309253118,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:7.4,13.5->7.4,13.5 b1:27.9,16.3->27.9,16.3 b2:28.1,12.8->28.1,12.8 b3:20.7,12.2->21.1,11.9 b4:8.9,4.2->8.9,4.2] [+456608ms]","src":"client"}
|
||||
{"t":1783309257587,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:20.3,14.0->21.3,14.2 b1:27.9,16.3->27.9,16.3 b2:6.0,9.4->6.0,9.4 b3:8.9,7.1->8.4,7.2 b4:14.8,10.2->14.8,10.3] [+460670ms]","src":"client"}
|
||||
{"t":1783309261185,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:19.5,11.2->19.4,12.1 b1:26.5,6.2->26.0,6.5 b2:21.3,5.7->21.5,5.4 b3:18.6,7.6->19.4,7.2 b4:19.4,14.9->20.3,15.3] [+464679ms]","src":"client"}
|
||||
{"t":1783309265213,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:28.5,12.6->28.5,12.6 b1:12.5,10.2->13.2,9.4 b2:14.9,7.0->15.7,6.3 b3:29.0,8.6->29.0,8.6 b4:19.7,10.8->19.4,10.1] [+468708ms]","src":"client"}
|
||||
{"t":1783309268512,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"trial-confirm","detail":"[TC180] กดยืนยันโหวต (แยก select\/confirm) → ส่งจริง [+472005ms]","src":"client"}
|
||||
{"t":1783309268507,"cat":"LobbyB","room":"a","who":"","ev":"trial-vote","detail":"[TC180] ยืนยันโหวต 6/6 — ครบ → reveal (pass)","src":"server"}
|
||||
{"t":1783309268620,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"trial-reveal-dur","detail":"[TC174] โชว์ผลโหวต 7000ms (admin ปรับได้) ก่อนไปหน้าผลเต็ม [+472114ms]","src":"client"}
|
||||
{"t":1783309269252,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:18.3,8.8->18.3,8.8 b1:15.8,16.8->15.8,16.8 b2:17.9,5.7->17.9,5.9 b3:14.2,6.3->13.4,6.0 b4:23.5,15.3->23.5,16.2] [+472746ms]","src":"client"}
|
||||
{"t":1783309273375,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:26.1,14.5->26.0,13.6 b1:25.3,8.4->26.0,7.8 b2:21.3,7.0->21.8,7.8 b3:13.9,5.5->13.9,5.5 b4:19.2,9.3->19.2,9.3] [+476777ms]","src":"client"}
|
||||
{"t":1783309277336,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:25.1,3.7->25.1,3.7 b1:16.8,6.8->16.7,7.3 b2:27.9,11.5->27.9,11.5 b3:6.0,9.5->6.0,9.5 b4:24.8,12.4->24.3,11.6] [+480819ms]","src":"client"}
|
||||
{"t":1783309281564,"cat":"LobbyB","room":"a-1783308793150","who":"บอท7","ev":"bot-pos","detail":"map=35x20 n=5 [b0:25.1,4.2->25.1,4.2 b1:15.3,8.9->15.3,8.9 b2:5.1,16.4->5.1,16.5 b3:6.4,10.6->6.4,10.6 b4:15.9,8.9->15.9,8.9] [+485035ms]","src":"client"}
|
||||
|
||||
Reference in New Issue
Block a user