args); $v->rule('required', [ 'itemType', ]) ->rule('in', 'itemType', array_keys(GameConst::$allItems)); if (!$v->validate()) { return "{$v->errorStr()}"; } return null; } public function getRequiredSessionMode(): int { return static::REQ_GAME_LOGIN; } public function launch(Session $session, ?\DateTimeInterface $modifiedSince, ?string $reqEtag) { $generalID = $session->generalID; $me = General::createGeneralObjFromDB($generalID); $itemType = $this->args['itemType']; $item = $me->getItem($itemType); if ($item->getRawClassName() === 'None') { return '아이템을 가지고 있지 않습니다.'; } $me->setItem($itemType, 'None'); $logger = $me->getLogger(); $generalName = $me->getName(); $josaYi = JosaUtil::pick($generalName, '이'); $itemName = $item->getName(); $itemRawName = $item->getRawName(); $josaUl = JosaUtil::pick($itemRawName, '을'); $logger->pushGeneralActionLog("{$itemName}{$josaUl} 버렸습니다."); $nationName = $me->getStaticNation()['name']; $db = DB::db(); if (!$item->isBuyable()) { $logger->pushGlobalActionLog("{$generalName}{$josaYi} {$itemName}{$josaUl} 잃었습니다!"); $logger->pushGlobalHistoryLog("【망실】{$nationName}{$generalName}{$josaYi} {$itemName}{$josaUl} 잃었습니다!"); $gameStor = KVStorage::getStorage($db, 'game_env'); $givenUnique = $gameStor->getValue('givenUnique') ?? []; $itemCode = $item->getRawClassName(); if (key_exists($itemCode, $givenUnique)) { $givenUniqueCnt = $givenUnique[$itemCode]; $givenUniqueCnt -= 1; if ($givenUniqueCnt <= 0) { unset($givenUnique[$itemCode]); } else { $givenUnique[$itemCode] = $givenUniqueCnt; } } else { //XXX: 처리하지 못한 코드가 있는가? //FIXME: 여기에서 무언가 경고를 내야함 } $gameStor->setValue('givenUnique', $givenUnique); } $me->applyDB($db); return null; } }