diff --git a/dist/app/Enums/Auth/Permissions.php b/dist/app/Enums/Auth/Permissions.php index 993f282..865bd07 100644 --- a/dist/app/Enums/Auth/Permissions.php +++ b/dist/app/Enums/Auth/Permissions.php @@ -16,4 +16,5 @@ enum Permissions: string case INBOX_MAILER = 'inbox-mailer'; case CHAT_REPORTS = 'chat-reports'; case PLAYER_REPORTS = 'player-reports'; + case MATCH_CONFIGIURATION = 'match-configuration'; } diff --git a/dist/app/Enums/Game/ExperienceEventType.php b/dist/app/Enums/Game/ExperienceEventType.php new file mode 100644 index 0000000..ca8d50e --- /dev/null +++ b/dist/app/Enums/Game/ExperienceEventType.php @@ -0,0 +1,25 @@ +getEventTypeMultiplier($this); + } +} diff --git a/dist/app/Http/Controllers/Api/Matchmaking/MatchmakingController.php b/dist/app/Http/Controllers/Api/Matchmaking/MatchmakingController.php index 09d0470..8b5ebb9 100644 --- a/dist/app/Http/Controllers/Api/Matchmaking/MatchmakingController.php +++ b/dist/app/Http/Controllers/Api/Matchmaking/MatchmakingController.php @@ -15,6 +15,7 @@ use App\Http\Responses\Api\Matchmaking\QueueResponse; use App\Models\Admin\Archive\ArchivedGame; use App\Models\Admin\Archive\ArchivedPlayerProgression; +use App\Models\Admin\CurrencyMultipliers; use App\Models\Admin\Versioning\CurrentGameVersion; use App\Models\Game\Matchmaking\Game; use App\Models\Game\Matchmaking\QueuedPlayer; @@ -215,7 +216,8 @@ public function playerEndOfMatch(PlayerEndOfMatchRequest $request) $experienceSum = 0; foreach ($request->experienceEvents as $experienceEvent) { - $experienceSum += (int)$experienceEvent['amount']; + // Multiply the amount by the Multiplier of the type + $experienceSum += (int)($experienceEvent->amount * $experienceEvent->type->getMultiplier()); } $characterData->addExperience($experienceSum); @@ -226,17 +228,18 @@ public function playerEndOfMatch(PlayerEndOfMatchRequest $request) $gainedCurrencyA = 0; $gainedCurrencyB = 0; $gainedCurrencyC = 0; + $currencyMultipliers = CurrencyMultipliers::get(); foreach ($request->earnedCurrencies as $earnedCurrency) { switch ($earnedCurrency['currencyName']) { case 'CurrencyA': - $gainedCurrencyA += $earnedCurrency['amount']; + $gainedCurrencyA += (int)($earnedCurrency['amount'] * $currencyMultipliers->currencyA); break; case 'CurrencyB': - $gainedCurrencyB += $earnedCurrency['amount']; + $gainedCurrencyB += (int)($earnedCurrency['amount'] * $currencyMultipliers->currencyB); break; case 'CurrencyC': - $gainedCurrencyC += $earnedCurrency['amount']; + $gainedCurrencyC += (int)($earnedCurrency['amount'] * $currencyMultipliers->currencyC); } } diff --git a/dist/app/Http/Controllers/Web/Admin/Tools/AdminToolController.php b/dist/app/Http/Controllers/Web/Admin/Tools/AdminToolController.php index e71e039..4408a00 100644 --- a/dist/app/Http/Controllers/Web/Admin/Tools/AdminToolController.php +++ b/dist/app/Http/Controllers/Web/Admin/Tools/AdminToolController.php @@ -33,6 +33,7 @@ final public static function getAllTools(): array VersioningController::class, LauncherMessageController::class, LogViewerController::class, + MatchConfigurationController::class, UsersController::class, ChatMessageController::class, InboxMailerController::class, diff --git a/dist/app/Http/Controllers/Web/Admin/Tools/MatchConfigurationController.php b/dist/app/Http/Controllers/Web/Admin/Tools/MatchConfigurationController.php new file mode 100644 index 0000000..0eb363b --- /dev/null +++ b/dist/app/Http/Controllers/Web/Admin/Tools/MatchConfigurationController.php @@ -0,0 +1,76 @@ +setEventTypeMultiplier(ExperienceEventType::ConstructDefeats, $request->constructDefeatsMultiplier); + $experienceMultipliers->setEventTypeMultiplier(ExperienceEventType::Downing, $request->downingMultiplier); + $experienceMultipliers->setEventTypeMultiplier(ExperienceEventType::Drones, $request->dronesMultiplier); + $experienceMultipliers->setEventTypeMultiplier(ExperienceEventType::Execution, $request->executionMultiplier); + $experienceMultipliers->setEventTypeMultiplier(ExperienceEventType::GardenFinale, $request->gardenFinaleMultiplier); + $experienceMultipliers->setEventTypeMultiplier(ExperienceEventType::Hacking, $request->hackingMultiplier); + $experienceMultipliers->setEventTypeMultiplier(ExperienceEventType::HunterClose, $request->hunterCloseMultiplier); + $experienceMultipliers->setEventTypeMultiplier(ExperienceEventType::Resources, $request->resourcesMultiplier); + $experienceMultipliers->setEventTypeMultiplier(ExperienceEventType::TeamActions, $request->teamActionsMultiplier); + $experienceMultipliers->save(); + + Session::flash('alert-success', 'Configuration saved successfully.'); + } catch (\Exception $e) { + Session::flash('alert-error', 'Configuration could not be saved, something went wrong: ' . $e->getMessage()); + } + + return back(); + } + + public function saveCurrency(SaveCurrencyConfiguration $request) + { + $currencyMultiplier = CurrencyMultipliers::get(); + + try { + $currencyMultiplier->currencyA = $request->currencyAMultiplier; + $currencyMultiplier->currencyB = $request->currencyBMultiplier; + $currencyMultiplier->currencyC = $request->currencyCMultiplier; + $currencyMultiplier->save(); + + Session::flash('alert-success', 'Configuration saved successfully.'); + } catch (\Exception $e) { + Session::flash('alert-error', 'Configuration could not be saved, something went wrong: ' . $e->getMessage()); + } + + return back(); + } + +} \ No newline at end of file diff --git a/dist/app/Http/Controllers/Web/Admin/Tools/VersioningController.php b/dist/app/Http/Controllers/Web/Admin/Tools/VersioningController.php index 4e9f6ec..96c47ff 100644 --- a/dist/app/Http/Controllers/Web/Admin/Tools/VersioningController.php +++ b/dist/app/Http/Controllers/Web/Admin/Tools/VersioningController.php @@ -16,16 +16,14 @@ class VersioningController extends AdminToolController { protected static string $name = 'Versioning'; - protected static string $description = 'Manage the Launcher & Game Versions.'; + protected static string $description = 'Manage the Launcher & Game Versions'; protected static string $iconComponent = 'icons.arrow-left-right'; protected static Permissions $neededPermission = Permissions::FILE_UPLOAD; public function index() { - return view('admin.tools.versioning', [ - 'message' => LauncherMessage::getMessage(), - ]); + return view('admin.tools.versioning'); } public function save(SaveVersioningRequest $request) { diff --git a/dist/app/Http/Requests/Api/Admin/Tools/SaveCurrencyConfiguration.php b/dist/app/Http/Requests/Api/Admin/Tools/SaveCurrencyConfiguration.php new file mode 100644 index 0000000..6a8dfbb --- /dev/null +++ b/dist/app/Http/Requests/Api/Admin/Tools/SaveCurrencyConfiguration.php @@ -0,0 +1,33 @@ +|string> + */ + public function rules(): array + { + return [ + 'currencyA' => 'required|decimal:0,2', + 'currencyB' => 'required|decimal:0,2', + 'currencyC' => 'required|decimal:0,2', + ]; + } + + protected function passedValidation() + { + $this->currencyAMultiplier = $this->input('currencyA'); + $this->currencyBMultiplier = $this->input('currencyB'); + $this->currencyCMultiplier = $this->input('currencyC'); + } +} diff --git a/dist/app/Http/Requests/Api/Admin/Tools/SaveMatchConfigurationRequest.php b/dist/app/Http/Requests/Api/Admin/Tools/SaveMatchConfigurationRequest.php new file mode 100644 index 0000000..b0c0f77 --- /dev/null +++ b/dist/app/Http/Requests/Api/Admin/Tools/SaveMatchConfigurationRequest.php @@ -0,0 +1,51 @@ +|string> + */ + public function rules(): array + { + return [ + 'construct-defeats' => 'required|decimal:0,2', + 'downing' => 'required|decimal:0,2', + 'drones' => 'required|decimal:0,2', + 'execution' => 'required|decimal:0,2', + 'garden-finale' => 'required|decimal:0,2', + 'hacking' => 'required|decimal:0,2', + 'hunter-close' => 'required|decimal:0,2', + 'resources' => 'required|decimal:0,2', + 'team-actions' => 'required|decimal:0,2', + ]; + } + + protected function passedValidation() + { + $this->constructDefeatsMultiplier = $this->input('construct-defeats'); + $this->downingMultiplier = $this->input('downing'); + $this->dronesMultiplier = $this->input('drones'); + $this->executionMultiplier = $this->input('execution'); + $this->gardenFinaleMultiplier = $this->input('garden-finale'); + $this->hackingMultiplier = $this->input('hacking'); + $this->hunterCloseMultiplier = $this->input('hunter-close'); + $this->resourcesMultiplier = $this->input('resources'); + $this->teamActionsMultiplier = $this->input('team-actions'); + } +} diff --git a/dist/app/Http/Requests/Api/Matchmaking/ExperienceEvent.php b/dist/app/Http/Requests/Api/Matchmaking/ExperienceEvent.php new file mode 100644 index 0000000..cf06881 --- /dev/null +++ b/dist/app/Http/Requests/Api/Matchmaking/ExperienceEvent.php @@ -0,0 +1,14 @@ + 'required|string', 'data.matchGameMode' => 'required|string', 'data.experienceEvents' => 'present|array', + 'data.experienceEvents.*.type' => ['sometimes', Rule::enum(ExperienceEventType::class)], + 'data.experienceEvents.*.amount' => 'sometimes|int', 'data.earnedCurrencies' => 'present|array', 'data.completedChallenges' => 'present|array', ]; @@ -77,7 +83,15 @@ protected function passedValidation() $this->characterState = CharacterState::tryFrom($this->input('data.characterState')); $this->matchId = $this->input('data.matchId'); $this->gamemode = $this->input('data.matchGameMode'); - $this->experienceEvents = $this->input('data.experienceEvents'); + + $this->experienceEvents = []; + foreach ($this->input('data.experienceEvents') as $event) { + $this->experienceEvents[] = new ExperienceEvent( + ExperienceEventType::tryFrom($event['type']), + $event['amount'], + ); + } + $this->earnedCurrencies = $this->input('data.earnedCurrencies'); $this->completedChallenges = $this->input('data.completedChallenges'); } diff --git a/dist/app/Models/AbstractFileBasedModel.php b/dist/app/Models/AbstractFileBasedModel.php index f006900..19e0c2c 100644 --- a/dist/app/Models/AbstractFileBasedModel.php +++ b/dist/app/Models/AbstractFileBasedModel.php @@ -30,7 +30,7 @@ public static function get(): ?static { function () { $data = static::getDisk()->get(static::FILE_NAME); - return $data === null ? null : unserialize($data); + return $data === null ? static::getDefault() : unserialize($data); } ); } @@ -38,4 +38,8 @@ function () { protected static function getDisk(): FilesystemAdapter { return static::$disk ?? static::$disk = Storage::disk('local'); } + + protected static function getDefault(): ?static { + return null; + } } \ No newline at end of file diff --git a/dist/app/Models/Admin/CurrencyMultipliers.php b/dist/app/Models/Admin/CurrencyMultipliers.php new file mode 100644 index 0000000..8205524 --- /dev/null +++ b/dist/app/Models/Admin/CurrencyMultipliers.php @@ -0,0 +1,22 @@ +constructDefeats = $multiplier; + if ($type === ExperienceEventType::Downing) + $this->downing = $multiplier; + if ($type === ExperienceEventType::Drones) + $this->drones = $multiplier; + if ($type === ExperienceEventType::Execution) + $this->execution = $multiplier; + if ($type === ExperienceEventType::GardenFinale) + $this->gardenFinale = $multiplier; + if ($type === ExperienceEventType::Hacking) + $this->hacking = $multiplier; + if ($type === ExperienceEventType::HunterClose) + $this->hunterClose = $multiplier; + if ($type === ExperienceEventType::Resources) + $this->resources = $multiplier; + if ($type === ExperienceEventType::TeamActions) + $this->teamActions = $multiplier; + } + + public function getEventTypeMultiplier(ExperienceEventType $type): float { + return match ($type) { + ExperienceEventType::ConstructDefeats => $this->constructDefeats, + ExperienceEventType::Downing => $this->downing, + ExperienceEventType::Drones => $this->drones, + ExperienceEventType::Execution => $this->execution, + ExperienceEventType::GardenFinale => $this->gardenFinale, + ExperienceEventType::Hacking => $this->hacking, + ExperienceEventType::HunterClose => $this->hunterClose, + ExperienceEventType::Resources => $this->resources, + ExperienceEventType::TeamActions => $this->teamActions, + default => 0, + }; + } + + protected static function getDefault(): ?static + { + return new static(); + } +} \ No newline at end of file diff --git a/dist/database/seeders/RolesAndPermissionsSeeder.php b/dist/database/seeders/RolesAndPermissionsSeeder.php index 6edb08c..74f0403 100644 --- a/dist/database/seeders/RolesAndPermissionsSeeder.php +++ b/dist/database/seeders/RolesAndPermissionsSeeder.php @@ -31,6 +31,7 @@ public function run(): void $inboxMailerPerm = Permission::findOrCreate(Permissions::INBOX_MAILER->value); $chatReportsPerm = Permission::findOrCreate(Permissions::CHAT_REPORTS->value); $playerReportsPerm = Permission::findOrCreate(Permissions::PLAYER_REPORTS->value); + $matchConfigPerm = Permission::findOrCreate(Permissions::MATCH_CONFIGIURATION->value); $adminRole->givePermissionTo( $viewAdminAreaPerm, @@ -44,6 +45,7 @@ public function run(): void $inboxMailerPerm, $chatReportsPerm, $playerReportsPerm, + $matchConfigPerm, )->save(); $moderatorRole->givePermissionTo( diff --git a/dist/resources/views/admin/tools/match-configuration.blade.php b/dist/resources/views/admin/tools/match-configuration.blade.php new file mode 100644 index 0000000..32f476e --- /dev/null +++ b/dist/resources/views/admin/tools/match-configuration.blade.php @@ -0,0 +1,195 @@ +@php + use App\Enums\Game\ExperienceEventType; + + $experienceMultipliers = \App\Models\Admin\ExperienceMultipliers::get(); + $currencyMultipliers = \App\Models\Admin\CurrencyMultipliers::get(); +@endphp + + + + + + @csrf + + Experience Multipliers + + + + + Construct Defeat + + + + + + + + + Downing + + + + + + + Drones + + + + + + + Execution + + + + + + + Garden Finale + + + + + + + Hacking + + + + + + + Hunter Close + + + + + + + Resources + + + + + + + Team Actions + + + + + + + + Save + + + + @csrf + + Currency Multipliers + + + + + Iron + + + + + + + + Blood Cells + + + + + + + + Ink Cells + + + + + + Save + + + + + \ No newline at end of file diff --git a/dist/resources/views/components/icons/globe.blade.php b/dist/resources/views/components/icons/globe.blade.php new file mode 100644 index 0000000..273992e --- /dev/null +++ b/dist/resources/views/components/icons/globe.blade.php @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/dist/routes/admin.php b/dist/routes/admin.php index 4a07917..4b90d1a 100644 --- a/dist/routes/admin.php +++ b/dist/routes/admin.php @@ -8,6 +8,7 @@ use App\Http\Controllers\Web\Admin\Tools\InboxMailerController; use App\Http\Controllers\Web\Admin\Tools\LauncherMessageController; use App\Http\Controllers\Web\Admin\Tools\LogViewerController; +use App\Http\Controllers\Web\Admin\Tools\MatchConfigurationController; use App\Http\Controllers\Web\Admin\Tools\PlayerReportsController; use App\Http\Controllers\Web\Admin\Tools\UsersController; use App\Http\Controllers\Web\Admin\Tools\VersioningController; @@ -52,6 +53,10 @@ Route::get('versioning', [VersioningController::class, 'index'])->name(VersioningController::class); Route::post('versioning', [VersioningController::class, 'save'])->name('versioning.save'); +Route::get('match-configuration', [MatchConfigurationController::class, 'index'])->name(MatchConfigurationController::class); +Route::post('match-configuration/experience', [MatchConfigurationController::class, 'saveExperience'])->name('match-configuration.save.experience'); +Route::post('match-configuration/currency', [MatchConfigurationController::class, 'saveCurrency'])->name('match-configuration.save.currency'); + Route::fallback(function () { return redirect(route('admin.dashboard')); });