From c0e776c88d379a0667a1961db66f44e19e47f3a0 Mon Sep 17 00:00:00 2001 From: hided62 Date: Wed, 12 Aug 2026 15:35:39 +0000 Subject: [PATCH] fix: keep invader game reset watchdog active --- hwe/func_gamerule.php | 1 + hwe/sammo/Event/Action/InvaderEnding.php | 4 ++- hwe/sammo/Event/Action/RaiseInvader.php | 2 ++ hwe/sammo/TurnExecutionHelper.php | 16 ++++++++++ src/sammo/AutoResetProgress.php | 40 ++++++++++++++++++++++++ 5 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 src/sammo/AutoResetProgress.php diff --git a/hwe/func_gamerule.php b/hwe/func_gamerule.php index ee0790fd..88d43620 100644 --- a/hwe/func_gamerule.php +++ b/hwe/func_gamerule.php @@ -769,6 +769,7 @@ function checkEmperior() $gameStor->isunited = 2; $gameStor->refreshLimit = $gameStor->refreshLimit * 100; + AutoResetProgress::record($gameStor); foreach ($db->queryFirstColumn('SELECT no FROM general WHERE npc<2 AND age>=%i', GameConst::$minPushHallAge) as $hallGeneralNo) { CheckHall($hallGeneralNo); diff --git a/hwe/sammo/Event/Action/InvaderEnding.php b/hwe/sammo/Event/Action/InvaderEnding.php index aa458fbc..328f2190 100644 --- a/hwe/sammo/Event/Action/InvaderEnding.php +++ b/hwe/sammo/Event/Action/InvaderEnding.php @@ -2,6 +2,7 @@ namespace sammo\Event\Action; use sammo\ActionLogger; +use sammo\AutoResetProgress; use sammo\CityConst; use sammo\DB; use sammo\KVStorage; @@ -61,6 +62,7 @@ class InvaderEnding extends \sammo\Event\Action{ $logger->pushGlobalHistoryLog("【이벤트】백성은 언젠가 영웅이 나타나길 기다립니다."); } $gameStor->setValue('isunited', 3); + AutoResetProgress::record($gameStor); $logger->flush(); $gameStor->refreshLimit = $gameStor->refreshLimit * 100; @@ -71,4 +73,4 @@ class InvaderEnding extends \sammo\Event\Action{ return [__CLASS__, 'Deleted']; } -} \ No newline at end of file +} diff --git a/hwe/sammo/Event/Action/RaiseInvader.php b/hwe/sammo/Event/Action/RaiseInvader.php index dacef71f..31124777 100644 --- a/hwe/sammo/Event/Action/RaiseInvader.php +++ b/hwe/sammo/Event/Action/RaiseInvader.php @@ -4,6 +4,7 @@ namespace sammo\Event\Action; use Ds\Set; use sammo\ActionLogger; +use sammo\AutoResetProgress; use sammo\CityConst; use sammo\DB; use sammo\Json; @@ -119,6 +120,7 @@ class RaiseInvader extends \sammo\Event\Action $gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor->setValue('isunited', 1); + AutoResetProgress::record($gameStor); $turnterm = $gameStor->turnterm; $generalCnt = $db->queryFirstField('SELECT count(*) FROM general'); diff --git a/hwe/sammo/TurnExecutionHelper.php b/hwe/sammo/TurnExecutionHelper.php index 3dc67ce4..a5d20558 100644 --- a/hwe/sammo/TurnExecutionHelper.php +++ b/hwe/sammo/TurnExecutionHelper.php @@ -20,6 +20,18 @@ class TurnExecutionHelper { return max($completedTick, $candidateTick); } + + private static function recordInvaderProgress(KVStorage $gameStorage, int $beforeTick): void + { + if (Util::toInt($gameStorage->isunited) !== 1) { + return; + } + AutoResetProgress::recordIfAdvanced( + $gameStorage, + $beforeTick, + Util::toInt($gameStorage->turntime), + ); + } public function __destruct() { @@ -416,6 +428,8 @@ class TurnExecutionHelper $locked = true; return $gameStor->turntime; } + + $completionTickBeforeRun = Util::toInt($gameStor->turntime); $gameStor->cacheAll(); // 1턴이상 갱신 없었으면 서버 지연 @@ -462,6 +476,7 @@ class TurnExecutionHelper $currentTurn, ); } + self::recordInvaderProgress($gameStor, $completionTickBeforeRun); unlock(); return $gameStor->turntime; } @@ -520,6 +535,7 @@ class TurnExecutionHelper processTournament(); //거래 처리 processAuction(); + self::recordInvaderProgress($gameStor, $completionTickBeforeRun); // 잠금 해제 $turntime = $gameStor->turntime; diff --git a/src/sammo/AutoResetProgress.php b/src/sammo/AutoResetProgress.php new file mode 100644 index 00000000..8290bae9 --- /dev/null +++ b/src/sammo/AutoResetProgress.php @@ -0,0 +1,40 @@ +setValue(self::STORAGE_KEY, TimeUtil::format($wallTime, true)); + } + + public static function recordIfAdvanced( + KVStorage $gameStorage, + int $beforeTick, + int $afterTick, + ?\DateTimeInterface $wallTime = null, + ): bool { + if ($afterTick <= $beforeTick) { + return false; + } + self::record($gameStorage, $wallTime); + return true; + } +}