From 619b9445ba0529177b6ca809c3cbcb592d4a4bf6 Mon Sep 17 00:00:00 2001 From: Wotuu Date: Wed, 25 Sep 2024 17:39:03 +0200 Subject: [PATCH 1/9] #2515 Fixes for release v11.3.3 --- app/Models/Expansion.php | 5 +++++ resources/views/common/dungeon/grid.blade.php | 3 ++- .../common/handlebars/thumbnailcarousel.blade.php | 2 ++ .../dungeonroute/discover/wallpaper.blade.php | 15 ++++++++++----- 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/app/Models/Expansion.php b/app/Models/Expansion.php index 61724ec40..eabb38ca1 100644 --- a/app/Models/Expansion.php +++ b/app/Models/Expansion.php @@ -209,6 +209,11 @@ public function showDiscoverRoutesCardDungeonImage(): bool return !in_array($this->shortname, [Expansion::EXPANSION_SHADOWLANDS]); } + public function getWallpaperUrl(): string + { + return url(sprintf('/images/dungeons/%s/wallpaper.jpg', $this->shortname)); + } + /** * Saves an expansion with the data from a Request. * diff --git a/resources/views/common/dungeon/grid.blade.php b/resources/views/common/dungeon/grid.blade.php index 310c916e7..be6fc4da6 100644 --- a/resources/views/common/dungeon/grid.blade.php +++ b/resources/views/common/dungeon/grid.blade.php @@ -30,6 +30,7 @@ for( $j = 0; $j < $colCount; ++$j ) { $index = $i * $colCount + $j; if( $dungeons->has($index) ){ + /** @var Dungeon $dungeon */ $dungeon = $dungeons->get($index); $link = $links->where('dungeon', $dungeon->key)->first(); ?> @@ -53,7 +54,7 @@ class="grid_dungeon col-lg-{{ 12 / $colCount }} col-{{ 12 / ($colCount / 2) }} p @endisset {{ __($dungeon->name) }} @isset($link) diff --git a/resources/views/common/handlebars/thumbnailcarousel.blade.php b/resources/views/common/handlebars/thumbnailcarousel.blade.php index d0195644c..9efc95050 100644 --- a/resources/views/common/handlebars/thumbnailcarousel.blade.php +++ b/resources/views/common/handlebars/thumbnailcarousel.blade.php @@ -8,6 +8,8 @@ function handlebarsThumbnailCarouselParse(row) { let items = []; + console.log(row.dungeon); + if (row.has_thumbnail) { let facadeEnabled = row.dungeon.floors[row.dungeon.floors.length - 1].facade; for (let index in row.dungeon.floors) { diff --git a/resources/views/dungeonroute/discover/wallpaper.blade.php b/resources/views/dungeonroute/discover/wallpaper.blade.php index f66b76897..8ef167e2f 100644 --- a/resources/views/dungeonroute/discover/wallpaper.blade.php +++ b/resources/views/dungeonroute/discover/wallpaper.blade.php @@ -1,20 +1,26 @@
hasImageWallpaper()) - style="background-image: url('{{ url(sprintf('/images/dungeons/%s/wallpaper.jpg', $dungeon->expansion->shortname)) }}')"> + style="background-image: url('{{ $dungeon->getImageWallpaperUrl() }}')"> @else style="background-image: url('{{ $dungeon->getImageWallpaperUrl() }}')"> @endif @elseif(isset($expansion)) - style="background-image: url('{{ url(sprintf('/images/dungeons/%s/wallpaper.jpg', $expansion->shortname)) }}')"> + style="background-image: url('{{ $expansion->getWallpaperUrl() }}')"> @else @endif
@@ -24,4 +30,3 @@ } // @formatter:on -?> From b4141762f842cf2df24dea455797016046ebce80 Mon Sep 17 00:00:00 2001 From: Wouter Koppenol Date: Wed, 25 Sep 2024 23:09:30 +0200 Subject: [PATCH 2/9] #2501 WIP better handling failing MDT string imports. --- app/Http/Controllers/MDTImportController.php | 70 +++++++--------- app/Models/MDTImport.php | 12 ++- app/Service/MDT/MDTExportStringService.php | 22 +++--- app/Service/MDT/MDTImportStringService.php | 79 ++++++++++++------- .../MDT/MDTImportStringServiceInterface.php | 8 ++ ...e_column_nullable_on_mdt_imports_table.php | 27 +++++++ ..._add_error_column_to_mdt_imports_table.php | 27 +++++++ lang/en_US/logic.php | 46 ----------- lang/en_US/policy.php | 2 +- lang/en_US/services.php | 48 +++++++++++ 10 files changed, 208 insertions(+), 133 deletions(-) create mode 100644 database/migrations/2024_09_25_192209_make_dungeon_route_column_nullable_on_mdt_imports_table.php create mode 100644 database/migrations/2024_09_25_193640_add_error_column_to_mdt_imports_table.php diff --git a/app/Http/Controllers/MDTImportController.php b/app/Http/Controllers/MDTImportController.php index db1bda466..9b918c153 100644 --- a/app/Http/Controllers/MDTImportController.php +++ b/app/Http/Controllers/MDTImportController.php @@ -34,41 +34,35 @@ public function details( $validated = $request->validated(); $string = $validated['import_string']; - // try { - $warnings = collect(); - $errors = collect(); - - return $mdtImportStringService - ->setEncodedString($string) - ->getDetails($warnings, $errors); - // } catch (MDTStringParseException $ex) { - // return abort(StatusCode::INTERNAL_SERVER_ERROR, __('controller.mdtimport.error.mdt_string_parsing_failed')); - // } catch (InvalidMDTStringException $ex) { - // return abort(StatusCode::BAD_REQUEST, __('controller.mdtimport.error.mdt_string_format_not_recognized')); - // } catch (Exception $ex) { - // // Different message based on our deployment settings - // if (config('app.debug')) { - // $message = sprintf(__('controller.mdtimport.error.invalid_mdt_string_exception'), $ex->getMessage()); - // } else { - // $message = __('controller.admintools.error.invalid_mdt_string'); - // } - // - // // We're not interested if the string was 100% not an MDT string - it will never work then - // if (isValidBase64($string)) { - // report($ex); - // } - // - // Log::error($ex->getMessage()); - // - // return abort(StatusCode::BAD_REQUEST, $message); - // } catch (Throwable $error) { - // if ($error->getMessage() === "Class 'Lua' not found") { - // return abort(StatusCode::INTERNAL_SERVER_ERROR, __('controller.mdtimport.error.mdt_importer_not_configured_properly')); - // } - // Log::error($error->getMessage()); - // - // throw $error; - // } + try { + $warnings = collect(); + $errors = collect(); + + return $mdtImportStringService + ->setEncodedString($string) + ->getDetails($warnings, $errors); + } catch (MDTStringParseException $ex) { + return abort(StatusCode::INTERNAL_SERVER_ERROR, __('controller.mdtimport.error.mdt_string_parsing_failed')); + } catch (InvalidMDTStringException $ex) { + return abort(StatusCode::BAD_REQUEST, __('controller.mdtimport.error.mdt_string_format_not_recognized')); + } catch (Exception $ex) { + // Different message based on our deployment settings + if (config('app.debug')) { + $message = sprintf(__('controller.mdtimport.error.invalid_mdt_string_exception'), $ex->getMessage()); + } else { + $message = __('controller.admintools.error.invalid_mdt_string'); + } + + return abort(StatusCode::BAD_REQUEST, $message); + } catch (Throwable $error) { + Log::error($error->getMessage()); + + if ($error->getMessage() === "Class 'Lua' not found") { + return abort(StatusCode::INTERNAL_SERVER_ERROR, __('controller.mdtimport.error.mdt_importer_not_configured_properly')); + } + + throw $error; + } } /** @@ -97,12 +91,6 @@ public function import(ImportStringFormRequest $request, MDTImportStringServiceI $dungeonRoute->team_id = $validated['team_id'] ?? null; $dungeonRoute->save(); } - - // Keep track of the import - MDTImport::create([ - 'dungeon_route_id' => $dungeonRoute->id, - 'import_string' => $string, - ]); } catch (MDTStringParseException) { return abort(StatusCode::INTERNAL_SERVER_ERROR, __('controller.mdtimport.error.mdt_string_parsing_failed')); } catch (InvalidMDTStringException) { diff --git a/app/Models/MDTImport.php b/app/Models/MDTImport.php index 04671dc28..86dc6c541 100644 --- a/app/Models/MDTImport.php +++ b/app/Models/MDTImport.php @@ -8,9 +8,12 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; /** - * @property int $id - * @property int $dungeon_route_id - * @property string $import_string + * @property int $id + * @property int|null $dungeon_route_id + * @property string|null $error + * @property string $import_string + * + * @property DungeonRoute $dungeonRoute * * @mixin Eloquent */ @@ -21,13 +24,14 @@ class MDTImport extends Model protected $fillable = [ 'dungeon_route_id', + 'error', 'import_string', ]; /** * Get the dungeon route that this import created. */ - public function dungeonroute(): BelongsTo + public function dungeonRoute(): BelongsTo { return $this->belongsTo(DungeonRoute::class); } diff --git a/app/Service/MDT/MDTExportStringService.php b/app/Service/MDT/MDTExportStringService.php index 2ce986742..4f624b072 100644 --- a/app/Service/MDT/MDTExportStringService.php +++ b/app/Service/MDT/MDTExportStringService.php @@ -203,9 +203,9 @@ private function extractPulls(MappingVersion $mappingVersion, Collection $warnin NpcClassification::ALL[NpcClassification::NPC_CLASSIFICATION_BOSS], NpcClassification::ALL[NpcClassification::NPC_CLASSIFICATION_FINAL_BOSS]] )) { - $warnings->push(new ImportWarning(sprintf(__('logic.mdt.io.export_string.category.pull'), $pullIndex), - sprintf(__('logic.mdt.io.export_string.unable_to_find_mdt_enemy_for_kg_enemy'), $enemy->npc->name, $enemy->id, $enemy->getMdtNpcId()), - ['details' => __('logic.mdt.io.export_string.unable_to_find_mdt_enemy_for_kg_enemy_details')] + $warnings->push(new ImportWarning(sprintf(__('services.mdt.io.export_string.category.pull'), $pullIndex), + sprintf(__('services.mdt.io.export_string.unable_to_find_mdt_enemy_for_kg_enemy'), $enemy->npc->name, $enemy->id, $enemy->getMdtNpcId()), + ['details' => __('services.mdt.io.export_string.unable_to_find_mdt_enemy_for_kg_enemy_details')] )); } @@ -224,8 +224,8 @@ private function extractPulls(MappingVersion $mappingVersion, Collection $warnin // Do not add an empty pull if the killed enemy in our killzone was removed because it didn't exist in MDT, and that caused the pull to be empty if ($killZoneEnemies->count() !== 0 && $enemiesAdded === 0) { - $warnings->push(new ImportWarning(sprintf(__('logic.mdt.io.export_string.category.pull'), $pullIndex), - __('logic.mdt.io.export_string.unable_to_find_mdt_enemy_for_kg_caused_empty_pull'), + $warnings->push(new ImportWarning(sprintf(__('services.mdt.io.export_string.category.pull'), $pullIndex), + __('services.mdt.io.export_string.unable_to_find_mdt_enemy_for_kg_caused_empty_pull'), )); continue; @@ -289,9 +289,9 @@ public function getEncodedString(Collection $warnings): string // If stripping ascii characters worked in changing the title somehow if ($asciiTitle !== $this->dungeonRoute->title) { $warnings->push( - new ImportWarning(__('logic.mdt.io.export_string.category.title'), - __('logic.mdt.io.export_string.route_title_contains_non_ascii_char_bug'), - ['details' => sprintf(__('logic.mdt.io.export_string.route_title_contains_non_ascii_char_bug_details'), $this->dungeonRoute->title, $asciiTitle)] + new ImportWarning(__('services.mdt.io.export_string.category.title'), + __('services.mdt.io.export_string.route_title_contains_non_ascii_char_bug'), + ['details' => sprintf(__('services.mdt.io.export_string.route_title_contains_non_ascii_char_bug_details'), $this->dungeonRoute->title, $asciiTitle)] ) ); $this->dungeonRoute->title = $asciiTitle; @@ -304,9 +304,9 @@ public function getEncodedString(Collection $warnings): string $asciiComment = preg_replace('/[[:^print:]]/', '', $mapicon->comment ?? ''); if ($asciiComment !== $mapicon->comment) { $warnings->push( - new ImportWarning(__('logic.mdt.io.export_string.category.map_icon'), - __('logic.mdt.io.export_string.map_icon_contains_non_ascii_char_bug'), - ['details' => sprintf(__('logic.mdt.io.export_string.map_icon_contains_non_ascii_char_bug_details'), $asciiComment, $mapicon->comment)] + new ImportWarning(__('services.mdt.io.export_string.category.map_icon'), + __('services.mdt.io.export_string.map_icon_contains_non_ascii_char_bug'), + ['details' => sprintf(__('services.mdt.io.export_string.map_icon_contains_non_ascii_char_bug_details'), $asciiComment, $mapicon->comment)] ) ); $mapicon->comment = $asciiComment; diff --git a/app/Service/MDT/MDTImportStringService.php b/app/Service/MDT/MDTImportStringService.php index edb35a6c4..524dac370 100644 --- a/app/Service/MDT/MDTImportStringService.php +++ b/app/Service/MDT/MDTImportStringService.php @@ -25,6 +25,7 @@ use App\Models\MapIcon; use App\Models\MapIconType; use App\Models\Mapping\MappingVersion; +use App\Models\MDTImport; use App\Models\Npc\NpcEnemyForces; use App\Models\Path; use App\Models\Patreon\PatreonBenefit; @@ -126,8 +127,8 @@ private function parseRiftOffsets(ImportStringRiftOffsets $importStringRiftOffse ]; } catch (Exception) { - throw new ImportWarning(__('logic.mdt.io.import_string.category.awakened_obelisks'), - __('logic.mdt.io.import_string.unable_to_find_awakened_obelisks') + throw new ImportWarning(__('services.mdt.io.import_string.category.awakened_obelisks'), + __('services.mdt.io.import_string.unable_to_find_awakened_obelisks') ); } @@ -146,8 +147,8 @@ private function parseRiftOffsets(ImportStringRiftOffsets $importStringRiftOffse $obeliskMapIcon = $npcIdToMapIconMapping[$npcId]; if (isset($mdtXy['sublevel'])) { - throw new ImportWarning(__('logic.mdt.io.import_string.category.awakened_obelisks'), - __('logic.mdt.io.import_string.unable_to_find_awakened_obelisk_different_floor', + throw new ImportWarning(__('services.mdt.io.import_string.category.awakened_obelisks'), + __('services.mdt.io.import_string.unable_to_find_awakened_obelisk_different_floor', ['name' => __($obeliskMapIcon->mapicontype->name)]) ); } @@ -208,8 +209,8 @@ private function parseValuePulls( if (count($importStringPulls->getMdtPulls()) > config('keystoneguru.dungeon_route_limits.kill_zones')) { $importStringPulls->getErrors()->push( new ImportError( - __('logic.mdt.io.import_string.category.pulls'), - __('logic.mdt.io.import_string.limit_reached_pulls', ['limit' => config('keystoneguru.dungeon_route_limits.kill_zones')]) + __('services.mdt.io.import_string.category.pulls'), + __('services.mdt.io.import_string.limit_reached_pulls', ['limit' => config('keystoneguru.dungeon_route_limits.kill_zones')]) ) ); } @@ -285,9 +286,9 @@ private function parseValuePulls( // Don't throw this warning if we skipped things because they were not part of the seasonal index we're importing // Also don't throw it if the pull is simply empty in MDT, then just import an empty pull for consistency if (!$seasonalIndexSkip && $totalEnemiesMatched === 0) { - throw new ImportWarning(sprintf(__('logic.mdt.io.import_string.category.pull'), $newPullIndex), - __('logic.mdt.io.import_string.unable_to_find_enemies_pull_skipped'), - ['details' => __('logic.mdt.io.import_string.unable_to_find_enemies_pull_skipped_details')] + throw new ImportWarning(sprintf(__('services.mdt.io.import_string.category.pull'), $newPullIndex), + __('services.mdt.io.import_string.unable_to_find_enemies_pull_skipped'), + ['details' => __('services.mdt.io.import_string.unable_to_find_enemies_pull_skipped_details')] ); } @@ -379,9 +380,9 @@ private function parseMdtNpcClonesInPull( // No matching MDT enemy found - skip to the next enemy if ($mdtEnemy === null) { if (!$isEmissary) { - $importStringPulls->getWarnings()->push(new ImportWarning(sprintf(__('logic.mdt.io.import_string.category.pull'), $newPullIndex), - sprintf(__('logic.mdt.io.import_string.unable_to_find_mdt_enemy_for_clone_index'), $cloneIndex, $npcIndex), - ['details' => __('logic.mdt.io.import_string.unable_to_find_mdt_enemy_for_clone_index_details')] + $importStringPulls->getWarnings()->push(new ImportWarning(sprintf(__('services.mdt.io.import_string.category.pull'), $newPullIndex), + sprintf(__('services.mdt.io.import_string.unable_to_find_mdt_enemy_for_clone_index'), $cloneIndex, $npcIndex), + ['details' => __('services.mdt.io.import_string.unable_to_find_mdt_enemy_for_clone_index_details')] )); } @@ -411,10 +412,10 @@ private function parseMdtNpcClonesInPull( // Since an enemy on my side can only be mapped to one MDT enemy I now choose the Infiltrator and we can discard the other one. // The other enemy is marked as shrouded, so if we cannot find a shrouded normal mob we skip it and don't alert if (!$mdtEnemy->teeming && $mdtEnemy->seasonal_type !== Enemy::SEASONAL_TYPE_SHROUDED) { - $importStringPulls->getWarnings()->push(new ImportWarning(sprintf(__('logic.mdt.io.import_string.category.pull'), $newPullIndex), - sprintf(__('logic.mdt.io.import_string.unable_to_find_kg_equivalent_for_mdt_enemy'), $mdtEnemy->mdt_id, $mdtEnemy->npc->name, + $importStringPulls->getWarnings()->push(new ImportWarning(sprintf(__('services.mdt.io.import_string.category.pull'), $newPullIndex), + sprintf(__('services.mdt.io.import_string.unable_to_find_kg_equivalent_for_mdt_enemy'), $mdtEnemy->mdt_id, $mdtEnemy->npc->name, $mdtEnemy->npc_id), - ['details' => __('logic.mdt.io.import_string.unable_to_find_kg_equivalent_for_mdt_enemy_details')] + ['details' => __('services.mdt.io.import_string.unable_to_find_kg_equivalent_for_mdt_enemy_details')] )); } @@ -542,9 +543,9 @@ private function parseMdtNpcClonesInPull( // $kzEnemy->save(); // } // } else { - // throw new ImportWarning(sprintf(__('logic.mdt.io.import_string.category.pull'), $newPullIndex), + // throw new ImportWarning(sprintf(__('services.mdt.io.import_string.category.pull'), $newPullIndex), // sprintf(__('unable_to_find_awakened_enemy_for_final_boss'), $kzEnemy->enemy->npc_id, $kzEnemy->enemy->seasonal_index ?? -1, __($dungeonRoute->dungeon->name)), - // ['details' => __('logic.mdt.io.import_string.unable_to_find_awakened_enemy_for_final_boss_details')] + // ['details' => __('services.mdt.io.import_string.unable_to_find_awakened_enemy_for_final_boss_details')] // ); // } // } @@ -564,8 +565,8 @@ private function parseObjects(ImportStringObjects $importStringObjects): ImportS if (count($importStringObjects->getMdtObjects()) > config('keystoneguru.dungeon_route_limits.map_icons')) { $importStringObjects->getErrors()->push( new ImportError( - __('logic.mdt.io.import_string.category.notes'), - __('logic.mdt.io.import_string.limit_reached_notes', ['limit' => config('keystoneguru.dungeon_route_limits.map_icons')]) + __('services.mdt.io.import_string.category.notes'), + __('services.mdt.io.import_string.limit_reached_notes', ['limit' => config('keystoneguru.dungeon_route_limits.map_icons')]) ) ); @@ -628,9 +629,9 @@ private function parseObjects(ImportStringObjects $importStringObjects): ImportS if ($floor === null) { throw new ImportWarning( - sprintf(__('logic.mdt.io.import_string.category.object'), $objectIndex), - sprintf(__('logic.mdt.io.import_string.unable_to_find_floor_for_object'), $mdtSubLevel), - ['details' => __('logic.mdt.io.import_string.unable_to_find_floor_for_object_details') . json_encode($details)] + sprintf(__('services.mdt.io.import_string.category.object'), $objectIndex), + sprintf(__('services.mdt.io.import_string.unable_to_find_floor_for_object'), $mdtSubLevel), + ['details' => __('services.mdt.io.import_string.unable_to_find_floor_for_object_details') . json_encode($details)] ); } @@ -764,8 +765,8 @@ private function parseObjectLine( if ($importStringObjects->getLines()->count() > config('keystoneguru.dungeon_route_limits.brushlines')) { $importStringObjects->getErrors()->push( new ImportError( - __('logic.mdt.io.import_string.category.brushlines'), - __('logic.mdt.io.import_string.limit_reached_brushlines', ['limit' => config('keystoneguru.dungeon_route_limits.brushlines')]) + __('services.mdt.io.import_string.category.brushlines'), + __('services.mdt.io.import_string.limit_reached_brushlines', ['limit' => config('keystoneguru.dungeon_route_limits.brushlines')]) ) ); } @@ -775,8 +776,8 @@ private function parseObjectLine( if ($importStringObjects->getPaths()->count() > config('keystoneguru.dungeon_route_limits.paths')) { $importStringObjects->getErrors()->push( new ImportError( - __('logic.mdt.io.import_string.category.paths'), - __('logic.mdt.io.import_string.limit_reached_paths', ['limit' => config('keystoneguru.dungeon_route_limits.paths')]) + __('services.mdt.io.import_string.category.paths'), + __('services.mdt.io.import_string.limit_reached_paths', ['limit' => config('keystoneguru.dungeon_route_limits.paths')]) ) ); } @@ -803,8 +804,8 @@ private function parseObjectComment( $importStringObjects->getWarnings()->push( new ImportWarning( - __('logic.mdt.io.import_string.category.object'), - __('logic.mdt.io.import_string.object_out_of_bounds', ['comment' => (string)$details['4']]) + __('services.mdt.io.import_string.category.object'), + __('services.mdt.io.import_string.object_out_of_bounds', ['comment' => (string)$details['4']]) ) ); @@ -978,19 +979,30 @@ public function getDungeonRoute( bool $save = false, bool $importAsThisWeek = false ): DungeonRoute { + $error = null; + + // Keep track of the import + $mdtImport = MDTImport::create([ + 'dungeon_route_id' => null, + 'import_string' => $this->encodedString, + ]); + try { $this->log->getDungeonRouteStart($sandbox, $save, $importAsThisWeek); + $decoded = $this->decode($this->encodedString); if ($decoded === null) { - throw new MDTStringParseException('Unable to decode MDT import string'); + $error = __('services.mdt.io.import_string.unable_to_decode_mdt_import_string'); + throw new MDTStringParseException($error); } // Check if it's valid $isValid = $this->getLua()->call('ValidateImportPreset', [$decoded]); if (!$isValid) { - throw new InvalidMDTStringException('Unable to validate MDT import string in Lua'); + $error = __('services.mdt.io.import_string.unable_to_validate_mdt_import_string'); + throw new InvalidMDTStringException($error); } $dungeon = Conversion::convertMDTDungeonIDToDungeon($decoded['value']['currentDungeonIdx']); @@ -1072,10 +1084,17 @@ public function getDungeonRoute( $this->applyPullsToDungeonRoute($importStringPulls, $dungeonRoute); $this->applyObjectsToDungeonRoute($importStringObjects, $dungeonRoute); + + // Successfully imported! + $mdtImport->update(['dungeon_route_id' => $dungeonRoute->id]); } return $dungeonRoute; } finally { + if ($error !== null) { + $mdtImport->update(['error' => $error]); + } + $this->log->getDungeonRouteEnd(); } } diff --git a/app/Service/MDT/MDTImportStringServiceInterface.php b/app/Service/MDT/MDTImportStringServiceInterface.php index 0cca69355..b674b4a36 100644 --- a/app/Service/MDT/MDTImportStringServiceInterface.php +++ b/app/Service/MDT/MDTImportStringServiceInterface.php @@ -2,6 +2,9 @@ namespace App\Service\MDT; +use App\Logic\MDT\Exception\InvalidMDTDungeonException; +use App\Logic\MDT\Exception\InvalidMDTStringException; +use App\Logic\MDT\Exception\MDTStringParseException; use App\Models\DungeonRoute\DungeonRoute; use App\Service\MDT\Models\ImportStringDetails; use Illuminate\Support\Collection; @@ -10,6 +13,11 @@ interface MDTImportStringServiceInterface { public function getDecoded(): ?array; + /** + * @throws InvalidMDTDungeonException + * @throws InvalidMDTStringException + * @throws MDTStringParseException + */ public function getDetails(Collection $warnings, Collection $errors): ImportStringDetails; public function getDungeonRoute(Collection $warnings, Collection $errors, bool $sandbox = false, bool $save = false, bool $importAsThisWeek = false): DungeonRoute; diff --git a/database/migrations/2024_09_25_192209_make_dungeon_route_column_nullable_on_mdt_imports_table.php b/database/migrations/2024_09_25_192209_make_dungeon_route_column_nullable_on_mdt_imports_table.php new file mode 100644 index 000000000..58474d356 --- /dev/null +++ b/database/migrations/2024_09_25_192209_make_dungeon_route_column_nullable_on_mdt_imports_table.php @@ -0,0 +1,27 @@ +integer('dungeon_route_id')->nullable()->change(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('mdt_imports', function (Blueprint $table) { + $table->integer('dungeon_route_id')->nullable(false)->change(); + }); + } +}; diff --git a/database/migrations/2024_09_25_193640_add_error_column_to_mdt_imports_table.php b/database/migrations/2024_09_25_193640_add_error_column_to_mdt_imports_table.php new file mode 100644 index 000000000..4fed804a4 --- /dev/null +++ b/database/migrations/2024_09_25_193640_add_error_column_to_mdt_imports_table.php @@ -0,0 +1,27 @@ +string('error')->nullable()->after('dungeon_route_id')->default(null); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('mdt_imports', function (Blueprint $table) { + $table->dropColumn('error'); + }); + } +}; diff --git a/lang/en_US/logic.php b/lang/en_US/logic.php index 8b474649c..ca5d8ed54 100644 --- a/lang/en_US/logic.php +++ b/lang/en_US/logic.php @@ -2,50 +2,4 @@ return [ - 'mdt' => [ - 'io' => [ - 'export_string' => [ - 'category' => [ - 'pull' => 'Pull %d', - 'title' => 'Title', - 'map_icon' => 'Map icon', - ], - 'unable_to_find_mdt_enemy_for_kg_enemy' => 'Unable to find MDT equivalent for Keystone.guru enemy with NPC %s (enemy_id: %d, npc_id: %d).', - 'unable_to_find_mdt_enemy_for_kg_enemy_details' => 'This indicates that your route kills an enemy of which its NPC is known to MDT, but Keystone.guru hasn\'t coupled that enemy to an MDT equivalent yet (or it does not exist in MDT).', - 'unable_to_find_mdt_enemy_for_kg_caused_empty_pull' => 'This pull has been removed since all selected enemies could not be found in MDT, resulting in an otherwise empty pull.', - 'route_title_contains_non_ascii_char_bug' => 'Your route title contains non-ascii characters that are known to trigger a yet unresolved encoding bug in Keystone.guru. - Your route title has been stripped of all offending characters, we apologise for the inconvenience and hope to resolve this issue soon.', - 'route_title_contains_non_ascii_char_bug_details' => 'Old title: %s, new title: %s', - 'map_icon_contains_non_ascii_char_bug' => 'One of your comments on a map icon has non-ascii characters that are known to trigger a yet unresolved encoding bug in Keystone.guru. Your map comment has been stripped of all offending characters, we apologise for the inconvenience and hope to resolve this issue soon.', - 'map_icon_contains_non_ascii_char_bug_details' => 'Old comment: "%s", new comment: "%s"', - ], - 'import_string' => [ - 'category' => [ - 'awakened_obelisks' => 'Awakened Obelisks', - 'pulls' => 'Pulls', - 'notes' => 'Notes', - 'pull' => 'Pull %d', - 'object' => 'Object %d', - ], - 'object_out_of_bounds' => 'Unable to place comment: could not place comment ":comment" object is out of bounds.', - 'limit_reached_pulls' => 'Unable to import route: more than the max of :limit pulls.', - 'limit_reached_brushlines' => 'Unable to import route: more than the max of :limit lines.', - 'limit_reached_paths' => 'Unable to import route: more than the max of :limit paths.', - 'limit_reached_notes' => 'Unable to import route: more than the max of :limit notes.', - 'unable_to_find_floor_for_object' => 'Unable to find Keystone.guru floor that matches MDT floor ID %d.', - 'unable_to_find_floor_for_object_details' => 'This indicates that MDT has a floor that Keystone.guru does not have.', - 'unable_to_find_mdt_enemy_for_clone_index' => 'Unable to find MDT enemy for clone index %s and npc index %s.', - 'unable_to_find_mdt_enemy_for_clone_index_details' => 'This indicates MDT has mapped an enemy that is not known in Keystone.guru yet.', - 'unable_to_find_kg_equivalent_for_mdt_enemy' => 'Unable to find Keystone.guru equivalent for MDT enemy %s with NPC %s (id: %s).', - 'unable_to_find_kg_equivalent_for_mdt_enemy_details' => 'This indicates that your route kills an enemy of which its NPC is known to Keystone.guru, but Keystone.guru doesn\'t have that enemy mapped yet.', - 'unable_to_find_awakened_enemy_for_final_boss' => 'Unable to find Awakened Enemy %s (%s) at the final boss in %s.', - 'unable_to_find_awakened_enemy_for_final_boss_details' => 'This indicates Keystone.guru has a mapping error that will need to be corrected. Send the above warning to me and I\'ll correct it.', - 'unable_to_find_enemies_pull_skipped' => 'Failure to find enemies resulted in a pull being skipped.', - 'unable_to_find_enemies_pull_skipped_details' => 'This may indicate MDT recently had an update that is not integrated in Keystone.guru yet.', - 'unable_to_find_awakened_obelisks' => 'Cannot find Awakened Obelisks for your dungeon/week combination. Your Awakened Obelisk skips will not be imported.', - 'unable_to_find_awakened_obelisk_different_floor' => 'Unable to import Awakened Obelisk :name, it is on a different floor than the Obelisk itself. Keystone.guru does not support this at this time.', - ], - ], - ], - ]; diff --git a/lang/en_US/policy.php b/lang/en_US/policy.php index 4a6ef899a..dacc78c8f 100644 --- a/lang/en_US/policy.php +++ b/lang/en_US/policy.php @@ -5,7 +5,7 @@ 'view_route_not_published' => 'This route is not published and cannot be viewed. Please ask the author to publish this route to view it.', 'present_route_not_published' => 'This route is not published and cannot be presented. Please ask the author to publish this route to present it.', 'embed_route_not_published' => 'This route is not published and cannot be viewed. Please ask the author to publish this route to view it.', - 'embed_route_sandbox_not_allowed' => 'Sandbox routes cannot be embedded.', + 'embed_route_sandbox_not_allowed' => 'Temporary routes cannot be embedded.', 'publish_not_all_required_enemies_killed' => 'Unable to change sharing settings: not all required enemies have been killed.', 'add_kill_zone_limit_reached' => 'Unable to add more than :limit pulls to a single route.', 'add_brushline_limit_reached' => 'Unable to add more than :limit free-drawn lines to a single route.', diff --git a/lang/en_US/services.php b/lang/en_US/services.php index 206848091..63b8d909b 100644 --- a/lang/en_US/services.php +++ b/lang/en_US/services.php @@ -2,6 +2,54 @@ return [ + + 'mdt' => [ + 'io' => [ + 'export_string' => [ + 'category' => [ + 'pull' => 'Pull %d', + 'title' => 'Title', + 'map_icon' => 'Map icon', + ], + 'unable_to_find_mdt_enemy_for_kg_enemy' => 'Unable to find MDT equivalent for Keystone.guru enemy with NPC %s (enemy_id: %d, npc_id: %d).', + 'unable_to_find_mdt_enemy_for_kg_enemy_details' => 'This indicates that your route kills an enemy of which its NPC is known to MDT, but Keystone.guru hasn\'t coupled that enemy to an MDT equivalent yet (or it does not exist in MDT).', + 'unable_to_find_mdt_enemy_for_kg_caused_empty_pull' => 'This pull has been removed since all selected enemies could not be found in MDT, resulting in an otherwise empty pull.', + 'route_title_contains_non_ascii_char_bug' => 'Your route title contains non-ascii characters that are known to trigger a yet unresolved encoding bug in Keystone.guru. + Your route title has been stripped of all offending characters, we apologise for the inconvenience and hope to resolve this issue soon.', + 'route_title_contains_non_ascii_char_bug_details' => 'Old title: %s, new title: %s', + 'map_icon_contains_non_ascii_char_bug' => 'One of your comments on a map icon has non-ascii characters that are known to trigger a yet unresolved encoding bug in Keystone.guru. Your map comment has been stripped of all offending characters, we apologise for the inconvenience and hope to resolve this issue soon.', + 'map_icon_contains_non_ascii_char_bug_details' => 'Old comment: "%s", new comment: "%s"', + ], + 'import_string' => [ + 'category' => [ + 'awakened_obelisks' => 'Awakened Obelisks', + 'pulls' => 'Pulls', + 'notes' => 'Notes', + 'pull' => 'Pull %d', + 'object' => 'Object %d', + ], + 'object_out_of_bounds' => 'Unable to place comment: could not place comment ":comment" object is out of bounds.', + 'limit_reached_pulls' => 'Unable to import route: more than the max of :limit pulls.', + 'limit_reached_brushlines' => 'Unable to import route: more than the max of :limit lines.', + 'limit_reached_paths' => 'Unable to import route: more than the max of :limit paths.', + 'limit_reached_notes' => 'Unable to import route: more than the max of :limit notes.', + 'unable_to_find_floor_for_object' => 'Unable to find Keystone.guru floor that matches MDT floor ID %d.', + 'unable_to_find_floor_for_object_details' => 'This indicates that MDT has a floor that Keystone.guru does not have.', + 'unable_to_find_mdt_enemy_for_clone_index' => 'Unable to find MDT enemy for clone index %s and npc index %s.', + 'unable_to_find_mdt_enemy_for_clone_index_details' => 'This indicates MDT has mapped an enemy that is not known in Keystone.guru yet.', + 'unable_to_find_kg_equivalent_for_mdt_enemy' => 'Unable to find Keystone.guru equivalent for MDT enemy %s with NPC %s (id: %s).', + 'unable_to_find_kg_equivalent_for_mdt_enemy_details' => 'This indicates that your route kills an enemy of which its NPC is known to Keystone.guru, but Keystone.guru doesn\'t have that enemy mapped yet.', + 'unable_to_find_awakened_enemy_for_final_boss' => 'Unable to find Awakened Enemy %s (%s) at the final boss in %s.', + 'unable_to_find_awakened_enemy_for_final_boss_details' => 'This indicates Keystone.guru has a mapping error that will need to be corrected. Send the above warning to me and I\'ll correct it.', + 'unable_to_find_enemies_pull_skipped' => 'Failure to find enemies resulted in a pull being skipped.', + 'unable_to_find_enemies_pull_skipped_details' => 'This may indicate MDT recently had an update that is not integrated in Keystone.guru yet.', + 'unable_to_find_awakened_obelisks' => 'Cannot find Awakened Obelisks for your dungeon/week combination. Your Awakened Obelisk skips will not be imported.', + 'unable_to_find_awakened_obelisk_different_floor' => 'Unable to import Awakened Obelisk :name, it is on a different floor than the Obelisk itself. Keystone.guru does not support this at this time.', + 'unable_to_decode_mdt_import_string' => 'Unable to decode MDT import string', + 'unable_to_validate_mdt_import_string' => 'Unable to validate MDT import string', + ], + ], + ], 'npcservice' => [ 'all_dungeons' => 'All dungeons', ], From 07e8527b75cb9e84c6914943060d1ba2ea69e027 Mon Sep 17 00:00:00 2001 From: Wouter Koppenol Date: Sat, 28 Sep 2024 14:04:33 +0200 Subject: [PATCH 3/9] #2501 Failed MDT imports can now be seen in the admin panel and are no longer alerted on in Discord. --- app/Http/Controllers/AdminToolsController.php | 10 ++++ app/Http/Controllers/MDTImportController.php | 4 +- app/Models/MDTImport.php | 3 + lang/en_US/controller.php | 4 +- lang/en_US/view_admin.php | 13 +++++ .../assets/js/custom/inline/layouts/app.js | 4 +- resources/views/admin/tools/list.blade.php | 3 + .../views/admin/tools/mdt/list.blade.php | 58 +++++++++++++++++++ routes/web.php | 3 + 9 files changed, 96 insertions(+), 6 deletions(-) create mode 100644 resources/views/admin/tools/mdt/list.blade.php diff --git a/app/Http/Controllers/AdminToolsController.php b/app/Http/Controllers/AdminToolsController.php index f73550552..0796b0d38 100644 --- a/app/Http/Controllers/AdminToolsController.php +++ b/app/Http/Controllers/AdminToolsController.php @@ -13,6 +13,7 @@ use App\Models\DungeonRoute\DungeonRoute; use App\Models\Floor\Floor; use App\Models\Mapping\MappingVersion; +use App\Models\MDTImport; use App\Models\Npc\Npc; use App\Models\Npc\NpcClassification; use App\Models\Npc\NpcEnemyForces; @@ -438,6 +439,15 @@ public function mdtviewasdungeonroute(): View return view('admin.tools.mdt.string', ['asDungeonroute' => true]); } + public function mdtImportList(): View + { + return view('admin.tools.mdt.list', [ + 'mdtImports' => MDTImport::whereNotNull('error') + ->orderByDesc('created_at') + ->paginate(50), + ]); + } + /** * @return never|void * diff --git a/app/Http/Controllers/MDTImportController.php b/app/Http/Controllers/MDTImportController.php index 9b918c153..f0e0a3306 100644 --- a/app/Http/Controllers/MDTImportController.php +++ b/app/Http/Controllers/MDTImportController.php @@ -42,7 +42,7 @@ public function details( ->setEncodedString($string) ->getDetails($warnings, $errors); } catch (MDTStringParseException $ex) { - return abort(StatusCode::INTERNAL_SERVER_ERROR, __('controller.mdtimport.error.mdt_string_parsing_failed')); + return abort(StatusCode::BAD_REQUEST, __('controller.mdtimport.error.mdt_string_parsing_failed')); } catch (InvalidMDTStringException $ex) { return abort(StatusCode::BAD_REQUEST, __('controller.mdtimport.error.mdt_string_format_not_recognized')); } catch (Exception $ex) { @@ -92,7 +92,7 @@ public function import(ImportStringFormRequest $request, MDTImportStringServiceI $dungeonRoute->save(); } } catch (MDTStringParseException) { - return abort(StatusCode::INTERNAL_SERVER_ERROR, __('controller.mdtimport.error.mdt_string_parsing_failed')); + return abort(StatusCode::BAD_REQUEST, __('controller.mdtimport.error.mdt_string_parsing_failed')); } catch (InvalidMDTStringException) { return abort(StatusCode::BAD_REQUEST, __('controller.mdtimport.error.mdt_string_format_not_recognized')); } catch (Exception $ex) { diff --git a/app/Models/MDTImport.php b/app/Models/MDTImport.php index 86dc6c541..7cb8b3e5c 100644 --- a/app/Models/MDTImport.php +++ b/app/Models/MDTImport.php @@ -3,6 +3,7 @@ namespace App\Models; use App\Models\DungeonRoute\DungeonRoute; +use Carbon\Carbon; use Eloquent; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -14,6 +15,8 @@ * @property string $import_string * * @property DungeonRoute $dungeonRoute + * @property Carbon $created_at + * @property Carbon $updated_at * * @mixin Eloquent */ diff --git a/lang/en_US/controller.php b/lang/en_US/controller.php index cc47f4b79..44d799969 100644 --- a/lang/en_US/controller.php +++ b/lang/en_US/controller.php @@ -4,7 +4,7 @@ 'admintools' => [ 'error' => [ - 'mdt_string_parsing_failed' => 'MDT string parsing failed due to an internal server error.', + 'mdt_string_parsing_failed' => 'MDT string parsing failed. Did you really paste an MDT string?', 'mdt_string_format_not_recognized' => 'The MDT string format was not recognized.', 'invalid_mdt_string' => 'Invalid MDT string', 'invalid_mdt_string_exception' => 'Invalid MDT string: %s', @@ -130,7 +130,7 @@ 'mdtimport' => [ 'unknown_dungeon' => 'Unknown dungeon', 'error' => [ - 'mdt_string_parsing_failed' => 'MDT string parsing failed due to an internal server error.', + 'mdt_string_parsing_failed' => 'MDT string parsing failed. Did you really paste an MDT string?', 'mdt_string_format_not_recognized' => 'The MDT string format was not recognized.', 'invalid_mdt_string_exception' => 'Invalid MDT string: %s', 'invalid_mdt_string' => 'Invalid MDT string', diff --git a/lang/en_US/view_admin.php b/lang/en_US/view_admin.php index 245788c62..7657823fd 100644 --- a/lang/en_US/view_admin.php +++ b/lang/en_US/view_admin.php @@ -392,6 +392,18 @@ 'paste_your_mdt_export_string' => 'Paste your Mythic Dungeon Tools export string', 'submit' => 'Submit', ], + 'list' => [ + 'title' => 'Failed MDT imports', + 'header' => 'Failed MDT imports', + 'copy_mdt_string' => 'Copy MDT string', + 'table_header' => [ + 'id' => 'ID', + 'error' => 'Error', + 'import_string' => 'Import string', + 'date' => 'Date', + 'actions' => 'Actions', + ], + ], 'dungeonmappinghash' => [ 'title' => 'View MDT Dungeon Mapping Hash', 'header' => 'View MDT Dungeon Mapping Hash', @@ -431,6 +443,7 @@ 'subheader_mdt' => 'MDT', 'view_mdt_string' => 'View MDT String contents', 'view_mdt_string_as_dungeonroute' => 'View MDT String as Dungeonroute', + 'list_mdt_strings' => 'View failed MDT imports', 'view_dungeonroute_as_mdt_string' => 'View Dungeonroute as MDT String', 'view_mdt_diff' => 'View MDT Diff', 'view_dungeon_mapping_hash' => 'View dungeon mapping hash', diff --git a/resources/assets/js/custom/inline/layouts/app.js b/resources/assets/js/custom/inline/layouts/app.js index e325ea1de..4ed3c3e87 100644 --- a/resources/assets/js/custom/inline/layouts/app.js +++ b/resources/assets/js/custom/inline/layouts/app.js @@ -228,7 +228,7 @@ class LayoutsApp extends InlineCode { /** * The default function that should be called when an ajax request fails (error handler) **/ -function defaultAjaxErrorFn(xhr, textStatus, errorThrown) { +function defaultAjaxErrorFn(xhr/*, textStatus, errorThrown*/) { let message = lang.get('messages.ajax_error_default'); switch (xhr.status) { @@ -262,7 +262,7 @@ function defaultAjaxErrorFn(xhr, textStatus, errorThrown) { } } - showErrorNotification(`${message} (${xhr.status})`); + showErrorNotification(`${xhr.status}: ${message}`); } /** diff --git a/resources/views/admin/tools/list.blade.php b/resources/views/admin/tools/list.blade.php index cc726b2ef..754eb0164 100644 --- a/resources/views/admin/tools/list.blade.php +++ b/resources/views/admin/tools/list.blade.php @@ -27,6 +27,9 @@ + diff --git a/resources/views/admin/tools/mdt/list.blade.php b/resources/views/admin/tools/mdt/list.blade.php new file mode 100644 index 000000000..98f835b1c --- /dev/null +++ b/resources/views/admin/tools/mdt/list.blade.php @@ -0,0 +1,58 @@ + $mdtImports + */ +?> +@extends('layouts.sitepage', ['showAds' => false, 'title' => __('view_admin.tools.mdt.list.title')]) + +@section('header-title') + {{ __('view_admin.tools.mdt.list.header') }} +@endsection + +@section('scripts') + @parent + +@endsection + +@section('content') + + {{ $mdtImports->links() }} + + + + + + + + + + + + + @foreach($mdtImports as $mdtImport) + + + + + + + + @endforeach + +
{{ __('view_admin.tools.mdt.list.table_header.id') }}{{ __('view_admin.tools.mdt.list.table_header.error') }}{{ __('view_admin.tools.mdt.list.table_header.import_string') }}{{ __('view_admin.tools.mdt.list.table_header.date') }}{{ __('view_admin.tools.mdt.list.table_header.actions') }}
+ {{ $mdtImport->id }} + {{ $mdtImport->error }}{!! substr($mdtImport->import_string, 0, 75) !!}{{ $mdtImport->created_at->toDateTimeString() }} + +
+ + {{ $mdtImports->links() }} +@endsection diff --git a/routes/web.php b/routes/web.php index 9f377d49e..5d8bd6ff6 100644 --- a/routes/web.php +++ b/routes/web.php @@ -321,6 +321,9 @@ Route::get('dungeonroute/string', (new AdminToolsController())->mdtviewasstring(...))->name('admin.tools.mdt.dungeonroute.viewasstring'); Route::post('dungeonroute/string', (new AdminToolsController())->mdtviewasstringsubmit(...))->name('admin.tools.mdt.dungeonroute.viewasstring.submit'); + // View imported MDT strings + Route::get('string/list', (new AdminToolsController())->mdtImportList(...))->name('admin.tools.mdt.string.list'); + // View mapping hash Route::get('dungeonmappinghash', (new AdminToolsController())->mdtdungeonmappinghash(...))->name('admin.tools.mdt.dungeonmappinghash'); Route::post('dungeonmappinghash', (new AdminToolsController())->mdtdungeonmappinghashsubmit(...))->name('admin.tools.mdt.dungeonmappinghash.submit'); From 702dc1666b87e7176fd63f6f2e5d2527eb7159b1 Mon Sep 17 00:00:00 2001 From: Wouter Koppenol Date: Sat, 28 Sep 2024 15:41:34 +0200 Subject: [PATCH 4/9] #2518 Fixed The Stonevault enemy placement --- .../tww/thestonevault/1/dungeon_floor_switch_markers.json | 0 database/seeders/dungeondata/tww/thestonevault/1/enemies.json | 0 database/seeders/dungeondata/tww/thestonevault/1/enemy_packs.json | 0 .../seeders/dungeondata/tww/thestonevault/1/enemy_patrols.json | 0 .../dungeondata/tww/thestonevault/1/floor_union_areas.json | 0 .../seeders/dungeondata/tww/thestonevault/1/floor_unions.json | 0 database/seeders/dungeondata/tww/thestonevault/1/map_icons.json | 0 .../seeders/dungeondata/tww/thestonevault/1/mountable_areas.json | 0 database/seeders/dungeondata/tww/thestonevault/dungeonroutes.json | 0 database/seeders/dungeondata/tww/thestonevault/npcs.json | 0 10 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 database/seeders/dungeondata/tww/thestonevault/1/dungeon_floor_switch_markers.json mode change 100755 => 100644 database/seeders/dungeondata/tww/thestonevault/1/enemies.json mode change 100755 => 100644 database/seeders/dungeondata/tww/thestonevault/1/enemy_packs.json mode change 100755 => 100644 database/seeders/dungeondata/tww/thestonevault/1/enemy_patrols.json mode change 100755 => 100644 database/seeders/dungeondata/tww/thestonevault/1/floor_union_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/thestonevault/1/floor_unions.json mode change 100755 => 100644 database/seeders/dungeondata/tww/thestonevault/1/map_icons.json mode change 100755 => 100644 database/seeders/dungeondata/tww/thestonevault/1/mountable_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/thestonevault/dungeonroutes.json mode change 100755 => 100644 database/seeders/dungeondata/tww/thestonevault/npcs.json diff --git a/database/seeders/dungeondata/tww/thestonevault/1/dungeon_floor_switch_markers.json b/database/seeders/dungeondata/tww/thestonevault/1/dungeon_floor_switch_markers.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/thestonevault/1/enemies.json b/database/seeders/dungeondata/tww/thestonevault/1/enemies.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/thestonevault/1/enemy_packs.json b/database/seeders/dungeondata/tww/thestonevault/1/enemy_packs.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/thestonevault/1/enemy_patrols.json b/database/seeders/dungeondata/tww/thestonevault/1/enemy_patrols.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/thestonevault/1/floor_union_areas.json b/database/seeders/dungeondata/tww/thestonevault/1/floor_union_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/thestonevault/1/floor_unions.json b/database/seeders/dungeondata/tww/thestonevault/1/floor_unions.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/thestonevault/1/map_icons.json b/database/seeders/dungeondata/tww/thestonevault/1/map_icons.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/thestonevault/1/mountable_areas.json b/database/seeders/dungeondata/tww/thestonevault/1/mountable_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/thestonevault/dungeonroutes.json b/database/seeders/dungeondata/tww/thestonevault/dungeonroutes.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/thestonevault/npcs.json b/database/seeders/dungeondata/tww/thestonevault/npcs.json old mode 100755 new mode 100644 From 6bd0d5724501a1bb393f880c6b87378d95b8d113 Mon Sep 17 00:00:00 2001 From: Wouter Koppenol Date: Sat, 28 Sep 2024 15:42:12 +0200 Subject: [PATCH 5/9] #2518 Fixed permission issues with mapping files --- .../cata/grim_batol/1/dungeon_floor_switch_markers.json | 0 database/seeders/dungeondata/cata/grim_batol/1/enemies.json | 0 database/seeders/dungeondata/cata/grim_batol/1/enemy_packs.json | 0 database/seeders/dungeondata/cata/grim_batol/1/enemy_patrols.json | 0 .../seeders/dungeondata/cata/grim_batol/1/floor_union_areas.json | 0 database/seeders/dungeondata/cata/grim_batol/1/floor_unions.json | 0 database/seeders/dungeondata/cata/grim_batol/1/map_icons.json | 0 .../seeders/dungeondata/cata/grim_batol/1/mountable_areas.json | 0 database/seeders/dungeondata/cata/grim_batol/dungeonroutes.json | 0 database/seeders/dungeondata/cata/grim_batol/npcs.json | 0 .../classic/moltencore/1/dungeon_floor_switch_markers.json | 0 database/seeders/dungeondata/classic/moltencore/1/enemies.json | 0 .../seeders/dungeondata/classic/moltencore/1/enemy_packs.json | 0 .../seeders/dungeondata/classic/moltencore/1/enemy_patrols.json | 0 .../dungeondata/classic/moltencore/1/floor_union_areas.json | 0 .../seeders/dungeondata/classic/moltencore/1/floor_unions.json | 0 database/seeders/dungeondata/classic/moltencore/1/map_icons.json | 0 .../seeders/dungeondata/classic/moltencore/1/mountable_areas.json | 0 .../tww/ara_karacityofechoes/1/dungeon_floor_switch_markers.json | 0 .../seeders/dungeondata/tww/ara_karacityofechoes/1/enemies.json | 0 .../dungeondata/tww/ara_karacityofechoes/1/enemy_packs.json | 0 .../dungeondata/tww/ara_karacityofechoes/1/enemy_patrols.json | 0 .../dungeondata/tww/ara_karacityofechoes/1/floor_union_areas.json | 0 .../dungeondata/tww/ara_karacityofechoes/1/floor_unions.json | 0 .../seeders/dungeondata/tww/ara_karacityofechoes/1/map_icons.json | 0 .../dungeondata/tww/ara_karacityofechoes/1/mountable_areas.json | 0 .../tww/ara_karacityofechoes/2/dungeon_floor_switch_markers.json | 0 .../seeders/dungeondata/tww/ara_karacityofechoes/2/enemies.json | 0 .../dungeondata/tww/ara_karacityofechoes/2/enemy_packs.json | 0 .../dungeondata/tww/ara_karacityofechoes/2/enemy_patrols.json | 0 .../dungeondata/tww/ara_karacityofechoes/2/floor_union_areas.json | 0 .../dungeondata/tww/ara_karacityofechoes/2/floor_unions.json | 0 .../seeders/dungeondata/tww/ara_karacityofechoes/2/map_icons.json | 0 .../dungeondata/tww/ara_karacityofechoes/2/mountable_areas.json | 0 .../tww/ara_karacityofechoes/3/dungeon_floor_switch_markers.json | 0 .../seeders/dungeondata/tww/ara_karacityofechoes/3/enemies.json | 0 .../dungeondata/tww/ara_karacityofechoes/3/enemy_packs.json | 0 .../dungeondata/tww/ara_karacityofechoes/3/enemy_patrols.json | 0 .../dungeondata/tww/ara_karacityofechoes/3/floor_union_areas.json | 0 .../dungeondata/tww/ara_karacityofechoes/3/floor_unions.json | 0 .../seeders/dungeondata/tww/ara_karacityofechoes/3/map_icons.json | 0 .../dungeondata/tww/ara_karacityofechoes/3/mountable_areas.json | 0 .../dungeondata/tww/ara_karacityofechoes/dungeonroutes.json | 0 database/seeders/dungeondata/tww/ara_karacityofechoes/npcs.json | 0 .../tww/cinderbrewmeadery/1/dungeon_floor_switch_markers.json | 0 database/seeders/dungeondata/tww/cinderbrewmeadery/1/enemies.json | 0 .../seeders/dungeondata/tww/cinderbrewmeadery/1/enemy_packs.json | 0 .../dungeondata/tww/cinderbrewmeadery/1/enemy_patrols.json | 0 .../dungeondata/tww/cinderbrewmeadery/1/floor_union_areas.json | 0 .../seeders/dungeondata/tww/cinderbrewmeadery/1/floor_unions.json | 0 .../seeders/dungeondata/tww/cinderbrewmeadery/1/map_icons.json | 0 .../dungeondata/tww/cinderbrewmeadery/1/mountable_areas.json | 0 .../seeders/dungeondata/tww/cinderbrewmeadery/dungeonroutes.json | 0 database/seeders/dungeondata/tww/cinderbrewmeadery/npcs.json | 0 .../tww/cityofthreads/1/dungeon_floor_switch_markers.json | 0 database/seeders/dungeondata/tww/cityofthreads/1/enemies.json | 0 database/seeders/dungeondata/tww/cityofthreads/1/enemy_packs.json | 0 .../seeders/dungeondata/tww/cityofthreads/1/enemy_patrols.json | 0 .../dungeondata/tww/cityofthreads/1/floor_union_areas.json | 0 .../seeders/dungeondata/tww/cityofthreads/1/floor_unions.json | 0 database/seeders/dungeondata/tww/cityofthreads/1/map_icons.json | 0 .../seeders/dungeondata/tww/cityofthreads/1/mountable_areas.json | 0 .../tww/cityofthreads/2/dungeon_floor_switch_markers.json | 0 database/seeders/dungeondata/tww/cityofthreads/2/enemies.json | 0 database/seeders/dungeondata/tww/cityofthreads/2/enemy_packs.json | 0 .../seeders/dungeondata/tww/cityofthreads/2/enemy_patrols.json | 0 .../dungeondata/tww/cityofthreads/2/floor_union_areas.json | 0 .../seeders/dungeondata/tww/cityofthreads/2/floor_unions.json | 0 database/seeders/dungeondata/tww/cityofthreads/2/map_icons.json | 0 .../seeders/dungeondata/tww/cityofthreads/2/mountable_areas.json | 0 .../tww/cityofthreads/3/dungeon_floor_switch_markers.json | 0 database/seeders/dungeondata/tww/cityofthreads/3/enemies.json | 0 database/seeders/dungeondata/tww/cityofthreads/3/enemy_packs.json | 0 .../seeders/dungeondata/tww/cityofthreads/3/enemy_patrols.json | 0 .../dungeondata/tww/cityofthreads/3/floor_union_areas.json | 0 .../seeders/dungeondata/tww/cityofthreads/3/floor_unions.json | 0 database/seeders/dungeondata/tww/cityofthreads/3/map_icons.json | 0 .../seeders/dungeondata/tww/cityofthreads/3/mountable_areas.json | 0 database/seeders/dungeondata/tww/cityofthreads/dungeonroutes.json | 0 database/seeders/dungeondata/tww/cityofthreads/npcs.json | 0 .../tww/darkflamecleft/1/dungeon_floor_switch_markers.json | 0 database/seeders/dungeondata/tww/darkflamecleft/1/enemies.json | 0 .../seeders/dungeondata/tww/darkflamecleft/1/enemy_packs.json | 0 .../seeders/dungeondata/tww/darkflamecleft/1/enemy_patrols.json | 0 .../dungeondata/tww/darkflamecleft/1/floor_union_areas.json | 0 .../seeders/dungeondata/tww/darkflamecleft/1/floor_unions.json | 0 database/seeders/dungeondata/tww/darkflamecleft/1/map_icons.json | 0 .../seeders/dungeondata/tww/darkflamecleft/1/mountable_areas.json | 0 .../seeders/dungeondata/tww/darkflamecleft/dungeonroutes.json | 0 database/seeders/dungeondata/tww/darkflamecleft/npcs.json | 0 .../prioryofthesacredflame/1/dungeon_floor_switch_markers.json | 0 .../seeders/dungeondata/tww/prioryofthesacredflame/1/enemies.json | 0 .../dungeondata/tww/prioryofthesacredflame/1/enemy_packs.json | 0 .../dungeondata/tww/prioryofthesacredflame/1/enemy_patrols.json | 0 .../tww/prioryofthesacredflame/1/floor_union_areas.json | 0 .../dungeondata/tww/prioryofthesacredflame/1/floor_unions.json | 0 .../dungeondata/tww/prioryofthesacredflame/1/map_icons.json | 0 .../dungeondata/tww/prioryofthesacredflame/1/mountable_areas.json | 0 .../prioryofthesacredflame/2/dungeon_floor_switch_markers.json | 0 .../seeders/dungeondata/tww/prioryofthesacredflame/2/enemies.json | 0 .../dungeondata/tww/prioryofthesacredflame/2/enemy_packs.json | 0 .../dungeondata/tww/prioryofthesacredflame/2/enemy_patrols.json | 0 .../tww/prioryofthesacredflame/2/floor_union_areas.json | 0 .../dungeondata/tww/prioryofthesacredflame/2/floor_unions.json | 0 .../dungeondata/tww/prioryofthesacredflame/2/map_icons.json | 0 .../dungeondata/tww/prioryofthesacredflame/2/mountable_areas.json | 0 .../prioryofthesacredflame/3/dungeon_floor_switch_markers.json | 0 .../seeders/dungeondata/tww/prioryofthesacredflame/3/enemies.json | 0 .../dungeondata/tww/prioryofthesacredflame/3/enemy_packs.json | 0 .../dungeondata/tww/prioryofthesacredflame/3/enemy_patrols.json | 0 .../tww/prioryofthesacredflame/3/floor_union_areas.json | 0 .../dungeondata/tww/prioryofthesacredflame/3/floor_unions.json | 0 .../dungeondata/tww/prioryofthesacredflame/3/map_icons.json | 0 .../dungeondata/tww/prioryofthesacredflame/3/mountable_areas.json | 0 .../dungeondata/tww/prioryofthesacredflame/dungeonroutes.json | 0 database/seeders/dungeondata/tww/prioryofthesacredflame/npcs.json | 0 .../tww/thedawnbreaker/1/dungeon_floor_switch_markers.json | 0 database/seeders/dungeondata/tww/thedawnbreaker/1/enemies.json | 0 .../seeders/dungeondata/tww/thedawnbreaker/1/enemy_packs.json | 0 .../seeders/dungeondata/tww/thedawnbreaker/1/enemy_patrols.json | 0 .../dungeondata/tww/thedawnbreaker/1/floor_union_areas.json | 0 .../seeders/dungeondata/tww/thedawnbreaker/1/floor_unions.json | 0 database/seeders/dungeondata/tww/thedawnbreaker/1/map_icons.json | 0 .../seeders/dungeondata/tww/thedawnbreaker/1/mountable_areas.json | 0 .../seeders/dungeondata/tww/thedawnbreaker/dungeonroutes.json | 0 database/seeders/dungeondata/tww/thedawnbreaker/npcs.json | 0 .../tww/therookery/1/dungeon_floor_switch_markers.json | 0 database/seeders/dungeondata/tww/therookery/1/enemies.json | 0 database/seeders/dungeondata/tww/therookery/1/enemy_packs.json | 0 database/seeders/dungeondata/tww/therookery/1/enemy_patrols.json | 0 .../seeders/dungeondata/tww/therookery/1/floor_union_areas.json | 0 database/seeders/dungeondata/tww/therookery/1/floor_unions.json | 0 database/seeders/dungeondata/tww/therookery/1/map_icons.json | 0 .../seeders/dungeondata/tww/therookery/1/mountable_areas.json | 0 .../tww/therookery/2/dungeon_floor_switch_markers.json | 0 database/seeders/dungeondata/tww/therookery/2/enemies.json | 0 database/seeders/dungeondata/tww/therookery/2/enemy_packs.json | 0 database/seeders/dungeondata/tww/therookery/2/enemy_patrols.json | 0 .../seeders/dungeondata/tww/therookery/2/floor_union_areas.json | 0 database/seeders/dungeondata/tww/therookery/2/floor_unions.json | 0 database/seeders/dungeondata/tww/therookery/2/map_icons.json | 0 .../seeders/dungeondata/tww/therookery/2/mountable_areas.json | 0 .../tww/therookery/3/dungeon_floor_switch_markers.json | 0 database/seeders/dungeondata/tww/therookery/3/enemies.json | 0 database/seeders/dungeondata/tww/therookery/3/enemy_packs.json | 0 database/seeders/dungeondata/tww/therookery/3/enemy_patrols.json | 0 .../seeders/dungeondata/tww/therookery/3/floor_union_areas.json | 0 database/seeders/dungeondata/tww/therookery/3/floor_unions.json | 0 database/seeders/dungeondata/tww/therookery/3/map_icons.json | 0 .../seeders/dungeondata/tww/therookery/3/mountable_areas.json | 0 .../tww/therookery/4/dungeon_floor_switch_markers.json | 0 database/seeders/dungeondata/tww/therookery/4/enemies.json | 0 database/seeders/dungeondata/tww/therookery/4/enemy_packs.json | 0 database/seeders/dungeondata/tww/therookery/4/enemy_patrols.json | 0 .../seeders/dungeondata/tww/therookery/4/floor_union_areas.json | 0 database/seeders/dungeondata/tww/therookery/4/floor_unions.json | 0 database/seeders/dungeondata/tww/therookery/4/map_icons.json | 0 .../seeders/dungeondata/tww/therookery/4/mountable_areas.json | 0 .../tww/therookery/5/dungeon_floor_switch_markers.json | 0 database/seeders/dungeondata/tww/therookery/5/enemies.json | 0 database/seeders/dungeondata/tww/therookery/5/enemy_packs.json | 0 database/seeders/dungeondata/tww/therookery/5/enemy_patrols.json | 0 .../seeders/dungeondata/tww/therookery/5/floor_union_areas.json | 0 database/seeders/dungeondata/tww/therookery/5/floor_unions.json | 0 database/seeders/dungeondata/tww/therookery/5/map_icons.json | 0 .../seeders/dungeondata/tww/therookery/5/mountable_areas.json | 0 .../tww/therookery/6/dungeon_floor_switch_markers.json | 0 database/seeders/dungeondata/tww/therookery/6/enemies.json | 0 database/seeders/dungeondata/tww/therookery/6/enemy_packs.json | 0 database/seeders/dungeondata/tww/therookery/6/enemy_patrols.json | 0 .../seeders/dungeondata/tww/therookery/6/floor_union_areas.json | 0 database/seeders/dungeondata/tww/therookery/6/floor_unions.json | 0 database/seeders/dungeondata/tww/therookery/6/map_icons.json | 0 .../seeders/dungeondata/tww/therookery/6/mountable_areas.json | 0 .../tww/therookery/7/dungeon_floor_switch_markers.json | 0 database/seeders/dungeondata/tww/therookery/7/enemies.json | 0 database/seeders/dungeondata/tww/therookery/7/enemy_packs.json | 0 database/seeders/dungeondata/tww/therookery/7/enemy_patrols.json | 0 .../seeders/dungeondata/tww/therookery/7/floor_union_areas.json | 0 database/seeders/dungeondata/tww/therookery/7/floor_unions.json | 0 database/seeders/dungeondata/tww/therookery/7/map_icons.json | 0 .../seeders/dungeondata/tww/therookery/7/mountable_areas.json | 0 database/seeders/dungeondata/tww/therookery/dungeonroutes.json | 0 database/seeders/dungeondata/tww/therookery/npcs.json | 0 184 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 database/seeders/dungeondata/cata/grim_batol/1/dungeon_floor_switch_markers.json mode change 100755 => 100644 database/seeders/dungeondata/cata/grim_batol/1/enemies.json mode change 100755 => 100644 database/seeders/dungeondata/cata/grim_batol/1/enemy_packs.json mode change 100755 => 100644 database/seeders/dungeondata/cata/grim_batol/1/enemy_patrols.json mode change 100755 => 100644 database/seeders/dungeondata/cata/grim_batol/1/floor_union_areas.json mode change 100755 => 100644 database/seeders/dungeondata/cata/grim_batol/1/floor_unions.json mode change 100755 => 100644 database/seeders/dungeondata/cata/grim_batol/1/map_icons.json mode change 100755 => 100644 database/seeders/dungeondata/cata/grim_batol/1/mountable_areas.json mode change 100755 => 100644 database/seeders/dungeondata/cata/grim_batol/dungeonroutes.json mode change 100755 => 100644 database/seeders/dungeondata/cata/grim_batol/npcs.json mode change 100755 => 100644 database/seeders/dungeondata/classic/moltencore/1/dungeon_floor_switch_markers.json mode change 100755 => 100644 database/seeders/dungeondata/classic/moltencore/1/enemies.json mode change 100755 => 100644 database/seeders/dungeondata/classic/moltencore/1/enemy_packs.json mode change 100755 => 100644 database/seeders/dungeondata/classic/moltencore/1/enemy_patrols.json mode change 100755 => 100644 database/seeders/dungeondata/classic/moltencore/1/floor_union_areas.json mode change 100755 => 100644 database/seeders/dungeondata/classic/moltencore/1/floor_unions.json mode change 100755 => 100644 database/seeders/dungeondata/classic/moltencore/1/map_icons.json mode change 100755 => 100644 database/seeders/dungeondata/classic/moltencore/1/mountable_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/ara_karacityofechoes/1/dungeon_floor_switch_markers.json mode change 100755 => 100644 database/seeders/dungeondata/tww/ara_karacityofechoes/1/enemies.json mode change 100755 => 100644 database/seeders/dungeondata/tww/ara_karacityofechoes/1/enemy_packs.json mode change 100755 => 100644 database/seeders/dungeondata/tww/ara_karacityofechoes/1/enemy_patrols.json mode change 100755 => 100644 database/seeders/dungeondata/tww/ara_karacityofechoes/1/floor_union_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/ara_karacityofechoes/1/floor_unions.json mode change 100755 => 100644 database/seeders/dungeondata/tww/ara_karacityofechoes/1/map_icons.json mode change 100755 => 100644 database/seeders/dungeondata/tww/ara_karacityofechoes/1/mountable_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/ara_karacityofechoes/2/dungeon_floor_switch_markers.json mode change 100755 => 100644 database/seeders/dungeondata/tww/ara_karacityofechoes/2/enemies.json mode change 100755 => 100644 database/seeders/dungeondata/tww/ara_karacityofechoes/2/enemy_packs.json mode change 100755 => 100644 database/seeders/dungeondata/tww/ara_karacityofechoes/2/enemy_patrols.json mode change 100755 => 100644 database/seeders/dungeondata/tww/ara_karacityofechoes/2/floor_union_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/ara_karacityofechoes/2/floor_unions.json mode change 100755 => 100644 database/seeders/dungeondata/tww/ara_karacityofechoes/2/map_icons.json mode change 100755 => 100644 database/seeders/dungeondata/tww/ara_karacityofechoes/2/mountable_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/ara_karacityofechoes/3/dungeon_floor_switch_markers.json mode change 100755 => 100644 database/seeders/dungeondata/tww/ara_karacityofechoes/3/enemies.json mode change 100755 => 100644 database/seeders/dungeondata/tww/ara_karacityofechoes/3/enemy_packs.json mode change 100755 => 100644 database/seeders/dungeondata/tww/ara_karacityofechoes/3/enemy_patrols.json mode change 100755 => 100644 database/seeders/dungeondata/tww/ara_karacityofechoes/3/floor_union_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/ara_karacityofechoes/3/floor_unions.json mode change 100755 => 100644 database/seeders/dungeondata/tww/ara_karacityofechoes/3/map_icons.json mode change 100755 => 100644 database/seeders/dungeondata/tww/ara_karacityofechoes/3/mountable_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/ara_karacityofechoes/dungeonroutes.json mode change 100755 => 100644 database/seeders/dungeondata/tww/ara_karacityofechoes/npcs.json mode change 100755 => 100644 database/seeders/dungeondata/tww/cinderbrewmeadery/1/dungeon_floor_switch_markers.json mode change 100755 => 100644 database/seeders/dungeondata/tww/cinderbrewmeadery/1/enemies.json mode change 100755 => 100644 database/seeders/dungeondata/tww/cinderbrewmeadery/1/enemy_packs.json mode change 100755 => 100644 database/seeders/dungeondata/tww/cinderbrewmeadery/1/enemy_patrols.json mode change 100755 => 100644 database/seeders/dungeondata/tww/cinderbrewmeadery/1/floor_union_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/cinderbrewmeadery/1/floor_unions.json mode change 100755 => 100644 database/seeders/dungeondata/tww/cinderbrewmeadery/1/map_icons.json mode change 100755 => 100644 database/seeders/dungeondata/tww/cinderbrewmeadery/1/mountable_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/cinderbrewmeadery/dungeonroutes.json mode change 100755 => 100644 database/seeders/dungeondata/tww/cinderbrewmeadery/npcs.json mode change 100755 => 100644 database/seeders/dungeondata/tww/cityofthreads/1/dungeon_floor_switch_markers.json mode change 100755 => 100644 database/seeders/dungeondata/tww/cityofthreads/1/enemies.json mode change 100755 => 100644 database/seeders/dungeondata/tww/cityofthreads/1/enemy_packs.json mode change 100755 => 100644 database/seeders/dungeondata/tww/cityofthreads/1/enemy_patrols.json mode change 100755 => 100644 database/seeders/dungeondata/tww/cityofthreads/1/floor_union_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/cityofthreads/1/floor_unions.json mode change 100755 => 100644 database/seeders/dungeondata/tww/cityofthreads/1/map_icons.json mode change 100755 => 100644 database/seeders/dungeondata/tww/cityofthreads/1/mountable_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/cityofthreads/2/dungeon_floor_switch_markers.json mode change 100755 => 100644 database/seeders/dungeondata/tww/cityofthreads/2/enemies.json mode change 100755 => 100644 database/seeders/dungeondata/tww/cityofthreads/2/enemy_packs.json mode change 100755 => 100644 database/seeders/dungeondata/tww/cityofthreads/2/enemy_patrols.json mode change 100755 => 100644 database/seeders/dungeondata/tww/cityofthreads/2/floor_union_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/cityofthreads/2/floor_unions.json mode change 100755 => 100644 database/seeders/dungeondata/tww/cityofthreads/2/map_icons.json mode change 100755 => 100644 database/seeders/dungeondata/tww/cityofthreads/2/mountable_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/cityofthreads/3/dungeon_floor_switch_markers.json mode change 100755 => 100644 database/seeders/dungeondata/tww/cityofthreads/3/enemies.json mode change 100755 => 100644 database/seeders/dungeondata/tww/cityofthreads/3/enemy_packs.json mode change 100755 => 100644 database/seeders/dungeondata/tww/cityofthreads/3/enemy_patrols.json mode change 100755 => 100644 database/seeders/dungeondata/tww/cityofthreads/3/floor_union_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/cityofthreads/3/floor_unions.json mode change 100755 => 100644 database/seeders/dungeondata/tww/cityofthreads/3/map_icons.json mode change 100755 => 100644 database/seeders/dungeondata/tww/cityofthreads/3/mountable_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/cityofthreads/dungeonroutes.json mode change 100755 => 100644 database/seeders/dungeondata/tww/cityofthreads/npcs.json mode change 100755 => 100644 database/seeders/dungeondata/tww/darkflamecleft/1/dungeon_floor_switch_markers.json mode change 100755 => 100644 database/seeders/dungeondata/tww/darkflamecleft/1/enemies.json mode change 100755 => 100644 database/seeders/dungeondata/tww/darkflamecleft/1/enemy_packs.json mode change 100755 => 100644 database/seeders/dungeondata/tww/darkflamecleft/1/enemy_patrols.json mode change 100755 => 100644 database/seeders/dungeondata/tww/darkflamecleft/1/floor_union_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/darkflamecleft/1/floor_unions.json mode change 100755 => 100644 database/seeders/dungeondata/tww/darkflamecleft/1/map_icons.json mode change 100755 => 100644 database/seeders/dungeondata/tww/darkflamecleft/1/mountable_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/darkflamecleft/dungeonroutes.json mode change 100755 => 100644 database/seeders/dungeondata/tww/darkflamecleft/npcs.json mode change 100755 => 100644 database/seeders/dungeondata/tww/prioryofthesacredflame/1/dungeon_floor_switch_markers.json mode change 100755 => 100644 database/seeders/dungeondata/tww/prioryofthesacredflame/1/enemies.json mode change 100755 => 100644 database/seeders/dungeondata/tww/prioryofthesacredflame/1/enemy_packs.json mode change 100755 => 100644 database/seeders/dungeondata/tww/prioryofthesacredflame/1/enemy_patrols.json mode change 100755 => 100644 database/seeders/dungeondata/tww/prioryofthesacredflame/1/floor_union_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/prioryofthesacredflame/1/floor_unions.json mode change 100755 => 100644 database/seeders/dungeondata/tww/prioryofthesacredflame/1/map_icons.json mode change 100755 => 100644 database/seeders/dungeondata/tww/prioryofthesacredflame/1/mountable_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/prioryofthesacredflame/2/dungeon_floor_switch_markers.json mode change 100755 => 100644 database/seeders/dungeondata/tww/prioryofthesacredflame/2/enemies.json mode change 100755 => 100644 database/seeders/dungeondata/tww/prioryofthesacredflame/2/enemy_packs.json mode change 100755 => 100644 database/seeders/dungeondata/tww/prioryofthesacredflame/2/enemy_patrols.json mode change 100755 => 100644 database/seeders/dungeondata/tww/prioryofthesacredflame/2/floor_union_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/prioryofthesacredflame/2/floor_unions.json mode change 100755 => 100644 database/seeders/dungeondata/tww/prioryofthesacredflame/2/map_icons.json mode change 100755 => 100644 database/seeders/dungeondata/tww/prioryofthesacredflame/2/mountable_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/prioryofthesacredflame/3/dungeon_floor_switch_markers.json mode change 100755 => 100644 database/seeders/dungeondata/tww/prioryofthesacredflame/3/enemies.json mode change 100755 => 100644 database/seeders/dungeondata/tww/prioryofthesacredflame/3/enemy_packs.json mode change 100755 => 100644 database/seeders/dungeondata/tww/prioryofthesacredflame/3/enemy_patrols.json mode change 100755 => 100644 database/seeders/dungeondata/tww/prioryofthesacredflame/3/floor_union_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/prioryofthesacredflame/3/floor_unions.json mode change 100755 => 100644 database/seeders/dungeondata/tww/prioryofthesacredflame/3/map_icons.json mode change 100755 => 100644 database/seeders/dungeondata/tww/prioryofthesacredflame/3/mountable_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/prioryofthesacredflame/dungeonroutes.json mode change 100755 => 100644 database/seeders/dungeondata/tww/prioryofthesacredflame/npcs.json mode change 100755 => 100644 database/seeders/dungeondata/tww/thedawnbreaker/1/dungeon_floor_switch_markers.json mode change 100755 => 100644 database/seeders/dungeondata/tww/thedawnbreaker/1/enemies.json mode change 100755 => 100644 database/seeders/dungeondata/tww/thedawnbreaker/1/enemy_packs.json mode change 100755 => 100644 database/seeders/dungeondata/tww/thedawnbreaker/1/enemy_patrols.json mode change 100755 => 100644 database/seeders/dungeondata/tww/thedawnbreaker/1/floor_union_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/thedawnbreaker/1/floor_unions.json mode change 100755 => 100644 database/seeders/dungeondata/tww/thedawnbreaker/1/map_icons.json mode change 100755 => 100644 database/seeders/dungeondata/tww/thedawnbreaker/1/mountable_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/thedawnbreaker/dungeonroutes.json mode change 100755 => 100644 database/seeders/dungeondata/tww/thedawnbreaker/npcs.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/1/dungeon_floor_switch_markers.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/1/enemies.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/1/enemy_packs.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/1/enemy_patrols.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/1/floor_union_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/1/floor_unions.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/1/map_icons.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/1/mountable_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/2/dungeon_floor_switch_markers.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/2/enemies.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/2/enemy_packs.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/2/enemy_patrols.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/2/floor_union_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/2/floor_unions.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/2/map_icons.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/2/mountable_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/3/dungeon_floor_switch_markers.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/3/enemies.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/3/enemy_packs.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/3/enemy_patrols.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/3/floor_union_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/3/floor_unions.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/3/map_icons.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/3/mountable_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/4/dungeon_floor_switch_markers.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/4/enemies.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/4/enemy_packs.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/4/enemy_patrols.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/4/floor_union_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/4/floor_unions.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/4/map_icons.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/4/mountable_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/5/dungeon_floor_switch_markers.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/5/enemies.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/5/enemy_packs.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/5/enemy_patrols.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/5/floor_union_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/5/floor_unions.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/5/map_icons.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/5/mountable_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/6/dungeon_floor_switch_markers.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/6/enemies.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/6/enemy_packs.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/6/enemy_patrols.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/6/floor_union_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/6/floor_unions.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/6/map_icons.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/6/mountable_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/7/dungeon_floor_switch_markers.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/7/enemies.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/7/enemy_packs.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/7/enemy_patrols.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/7/floor_union_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/7/floor_unions.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/7/map_icons.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/7/mountable_areas.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/dungeonroutes.json mode change 100755 => 100644 database/seeders/dungeondata/tww/therookery/npcs.json diff --git a/database/seeders/dungeondata/cata/grim_batol/1/dungeon_floor_switch_markers.json b/database/seeders/dungeondata/cata/grim_batol/1/dungeon_floor_switch_markers.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/cata/grim_batol/1/enemies.json b/database/seeders/dungeondata/cata/grim_batol/1/enemies.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/cata/grim_batol/1/enemy_packs.json b/database/seeders/dungeondata/cata/grim_batol/1/enemy_packs.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/cata/grim_batol/1/enemy_patrols.json b/database/seeders/dungeondata/cata/grim_batol/1/enemy_patrols.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/cata/grim_batol/1/floor_union_areas.json b/database/seeders/dungeondata/cata/grim_batol/1/floor_union_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/cata/grim_batol/1/floor_unions.json b/database/seeders/dungeondata/cata/grim_batol/1/floor_unions.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/cata/grim_batol/1/map_icons.json b/database/seeders/dungeondata/cata/grim_batol/1/map_icons.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/cata/grim_batol/1/mountable_areas.json b/database/seeders/dungeondata/cata/grim_batol/1/mountable_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/cata/grim_batol/dungeonroutes.json b/database/seeders/dungeondata/cata/grim_batol/dungeonroutes.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/cata/grim_batol/npcs.json b/database/seeders/dungeondata/cata/grim_batol/npcs.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/classic/moltencore/1/dungeon_floor_switch_markers.json b/database/seeders/dungeondata/classic/moltencore/1/dungeon_floor_switch_markers.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/classic/moltencore/1/enemies.json b/database/seeders/dungeondata/classic/moltencore/1/enemies.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/classic/moltencore/1/enemy_packs.json b/database/seeders/dungeondata/classic/moltencore/1/enemy_packs.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/classic/moltencore/1/enemy_patrols.json b/database/seeders/dungeondata/classic/moltencore/1/enemy_patrols.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/classic/moltencore/1/floor_union_areas.json b/database/seeders/dungeondata/classic/moltencore/1/floor_union_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/classic/moltencore/1/floor_unions.json b/database/seeders/dungeondata/classic/moltencore/1/floor_unions.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/classic/moltencore/1/map_icons.json b/database/seeders/dungeondata/classic/moltencore/1/map_icons.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/classic/moltencore/1/mountable_areas.json b/database/seeders/dungeondata/classic/moltencore/1/mountable_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/ara_karacityofechoes/1/dungeon_floor_switch_markers.json b/database/seeders/dungeondata/tww/ara_karacityofechoes/1/dungeon_floor_switch_markers.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/ara_karacityofechoes/1/enemies.json b/database/seeders/dungeondata/tww/ara_karacityofechoes/1/enemies.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/ara_karacityofechoes/1/enemy_packs.json b/database/seeders/dungeondata/tww/ara_karacityofechoes/1/enemy_packs.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/ara_karacityofechoes/1/enemy_patrols.json b/database/seeders/dungeondata/tww/ara_karacityofechoes/1/enemy_patrols.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/ara_karacityofechoes/1/floor_union_areas.json b/database/seeders/dungeondata/tww/ara_karacityofechoes/1/floor_union_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/ara_karacityofechoes/1/floor_unions.json b/database/seeders/dungeondata/tww/ara_karacityofechoes/1/floor_unions.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/ara_karacityofechoes/1/map_icons.json b/database/seeders/dungeondata/tww/ara_karacityofechoes/1/map_icons.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/ara_karacityofechoes/1/mountable_areas.json b/database/seeders/dungeondata/tww/ara_karacityofechoes/1/mountable_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/ara_karacityofechoes/2/dungeon_floor_switch_markers.json b/database/seeders/dungeondata/tww/ara_karacityofechoes/2/dungeon_floor_switch_markers.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/ara_karacityofechoes/2/enemies.json b/database/seeders/dungeondata/tww/ara_karacityofechoes/2/enemies.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/ara_karacityofechoes/2/enemy_packs.json b/database/seeders/dungeondata/tww/ara_karacityofechoes/2/enemy_packs.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/ara_karacityofechoes/2/enemy_patrols.json b/database/seeders/dungeondata/tww/ara_karacityofechoes/2/enemy_patrols.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/ara_karacityofechoes/2/floor_union_areas.json b/database/seeders/dungeondata/tww/ara_karacityofechoes/2/floor_union_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/ara_karacityofechoes/2/floor_unions.json b/database/seeders/dungeondata/tww/ara_karacityofechoes/2/floor_unions.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/ara_karacityofechoes/2/map_icons.json b/database/seeders/dungeondata/tww/ara_karacityofechoes/2/map_icons.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/ara_karacityofechoes/2/mountable_areas.json b/database/seeders/dungeondata/tww/ara_karacityofechoes/2/mountable_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/ara_karacityofechoes/3/dungeon_floor_switch_markers.json b/database/seeders/dungeondata/tww/ara_karacityofechoes/3/dungeon_floor_switch_markers.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/ara_karacityofechoes/3/enemies.json b/database/seeders/dungeondata/tww/ara_karacityofechoes/3/enemies.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/ara_karacityofechoes/3/enemy_packs.json b/database/seeders/dungeondata/tww/ara_karacityofechoes/3/enemy_packs.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/ara_karacityofechoes/3/enemy_patrols.json b/database/seeders/dungeondata/tww/ara_karacityofechoes/3/enemy_patrols.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/ara_karacityofechoes/3/floor_union_areas.json b/database/seeders/dungeondata/tww/ara_karacityofechoes/3/floor_union_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/ara_karacityofechoes/3/floor_unions.json b/database/seeders/dungeondata/tww/ara_karacityofechoes/3/floor_unions.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/ara_karacityofechoes/3/map_icons.json b/database/seeders/dungeondata/tww/ara_karacityofechoes/3/map_icons.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/ara_karacityofechoes/3/mountable_areas.json b/database/seeders/dungeondata/tww/ara_karacityofechoes/3/mountable_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/ara_karacityofechoes/dungeonroutes.json b/database/seeders/dungeondata/tww/ara_karacityofechoes/dungeonroutes.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/ara_karacityofechoes/npcs.json b/database/seeders/dungeondata/tww/ara_karacityofechoes/npcs.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/cinderbrewmeadery/1/dungeon_floor_switch_markers.json b/database/seeders/dungeondata/tww/cinderbrewmeadery/1/dungeon_floor_switch_markers.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/cinderbrewmeadery/1/enemies.json b/database/seeders/dungeondata/tww/cinderbrewmeadery/1/enemies.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/cinderbrewmeadery/1/enemy_packs.json b/database/seeders/dungeondata/tww/cinderbrewmeadery/1/enemy_packs.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/cinderbrewmeadery/1/enemy_patrols.json b/database/seeders/dungeondata/tww/cinderbrewmeadery/1/enemy_patrols.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/cinderbrewmeadery/1/floor_union_areas.json b/database/seeders/dungeondata/tww/cinderbrewmeadery/1/floor_union_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/cinderbrewmeadery/1/floor_unions.json b/database/seeders/dungeondata/tww/cinderbrewmeadery/1/floor_unions.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/cinderbrewmeadery/1/map_icons.json b/database/seeders/dungeondata/tww/cinderbrewmeadery/1/map_icons.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/cinderbrewmeadery/1/mountable_areas.json b/database/seeders/dungeondata/tww/cinderbrewmeadery/1/mountable_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/cinderbrewmeadery/dungeonroutes.json b/database/seeders/dungeondata/tww/cinderbrewmeadery/dungeonroutes.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/cinderbrewmeadery/npcs.json b/database/seeders/dungeondata/tww/cinderbrewmeadery/npcs.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/cityofthreads/1/dungeon_floor_switch_markers.json b/database/seeders/dungeondata/tww/cityofthreads/1/dungeon_floor_switch_markers.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/cityofthreads/1/enemies.json b/database/seeders/dungeondata/tww/cityofthreads/1/enemies.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/cityofthreads/1/enemy_packs.json b/database/seeders/dungeondata/tww/cityofthreads/1/enemy_packs.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/cityofthreads/1/enemy_patrols.json b/database/seeders/dungeondata/tww/cityofthreads/1/enemy_patrols.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/cityofthreads/1/floor_union_areas.json b/database/seeders/dungeondata/tww/cityofthreads/1/floor_union_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/cityofthreads/1/floor_unions.json b/database/seeders/dungeondata/tww/cityofthreads/1/floor_unions.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/cityofthreads/1/map_icons.json b/database/seeders/dungeondata/tww/cityofthreads/1/map_icons.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/cityofthreads/1/mountable_areas.json b/database/seeders/dungeondata/tww/cityofthreads/1/mountable_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/cityofthreads/2/dungeon_floor_switch_markers.json b/database/seeders/dungeondata/tww/cityofthreads/2/dungeon_floor_switch_markers.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/cityofthreads/2/enemies.json b/database/seeders/dungeondata/tww/cityofthreads/2/enemies.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/cityofthreads/2/enemy_packs.json b/database/seeders/dungeondata/tww/cityofthreads/2/enemy_packs.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/cityofthreads/2/enemy_patrols.json b/database/seeders/dungeondata/tww/cityofthreads/2/enemy_patrols.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/cityofthreads/2/floor_union_areas.json b/database/seeders/dungeondata/tww/cityofthreads/2/floor_union_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/cityofthreads/2/floor_unions.json b/database/seeders/dungeondata/tww/cityofthreads/2/floor_unions.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/cityofthreads/2/map_icons.json b/database/seeders/dungeondata/tww/cityofthreads/2/map_icons.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/cityofthreads/2/mountable_areas.json b/database/seeders/dungeondata/tww/cityofthreads/2/mountable_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/cityofthreads/3/dungeon_floor_switch_markers.json b/database/seeders/dungeondata/tww/cityofthreads/3/dungeon_floor_switch_markers.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/cityofthreads/3/enemies.json b/database/seeders/dungeondata/tww/cityofthreads/3/enemies.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/cityofthreads/3/enemy_packs.json b/database/seeders/dungeondata/tww/cityofthreads/3/enemy_packs.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/cityofthreads/3/enemy_patrols.json b/database/seeders/dungeondata/tww/cityofthreads/3/enemy_patrols.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/cityofthreads/3/floor_union_areas.json b/database/seeders/dungeondata/tww/cityofthreads/3/floor_union_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/cityofthreads/3/floor_unions.json b/database/seeders/dungeondata/tww/cityofthreads/3/floor_unions.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/cityofthreads/3/map_icons.json b/database/seeders/dungeondata/tww/cityofthreads/3/map_icons.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/cityofthreads/3/mountable_areas.json b/database/seeders/dungeondata/tww/cityofthreads/3/mountable_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/cityofthreads/dungeonroutes.json b/database/seeders/dungeondata/tww/cityofthreads/dungeonroutes.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/cityofthreads/npcs.json b/database/seeders/dungeondata/tww/cityofthreads/npcs.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/darkflamecleft/1/dungeon_floor_switch_markers.json b/database/seeders/dungeondata/tww/darkflamecleft/1/dungeon_floor_switch_markers.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/darkflamecleft/1/enemies.json b/database/seeders/dungeondata/tww/darkflamecleft/1/enemies.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/darkflamecleft/1/enemy_packs.json b/database/seeders/dungeondata/tww/darkflamecleft/1/enemy_packs.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/darkflamecleft/1/enemy_patrols.json b/database/seeders/dungeondata/tww/darkflamecleft/1/enemy_patrols.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/darkflamecleft/1/floor_union_areas.json b/database/seeders/dungeondata/tww/darkflamecleft/1/floor_union_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/darkflamecleft/1/floor_unions.json b/database/seeders/dungeondata/tww/darkflamecleft/1/floor_unions.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/darkflamecleft/1/map_icons.json b/database/seeders/dungeondata/tww/darkflamecleft/1/map_icons.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/darkflamecleft/1/mountable_areas.json b/database/seeders/dungeondata/tww/darkflamecleft/1/mountable_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/darkflamecleft/dungeonroutes.json b/database/seeders/dungeondata/tww/darkflamecleft/dungeonroutes.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/darkflamecleft/npcs.json b/database/seeders/dungeondata/tww/darkflamecleft/npcs.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/prioryofthesacredflame/1/dungeon_floor_switch_markers.json b/database/seeders/dungeondata/tww/prioryofthesacredflame/1/dungeon_floor_switch_markers.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/prioryofthesacredflame/1/enemies.json b/database/seeders/dungeondata/tww/prioryofthesacredflame/1/enemies.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/prioryofthesacredflame/1/enemy_packs.json b/database/seeders/dungeondata/tww/prioryofthesacredflame/1/enemy_packs.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/prioryofthesacredflame/1/enemy_patrols.json b/database/seeders/dungeondata/tww/prioryofthesacredflame/1/enemy_patrols.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/prioryofthesacredflame/1/floor_union_areas.json b/database/seeders/dungeondata/tww/prioryofthesacredflame/1/floor_union_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/prioryofthesacredflame/1/floor_unions.json b/database/seeders/dungeondata/tww/prioryofthesacredflame/1/floor_unions.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/prioryofthesacredflame/1/map_icons.json b/database/seeders/dungeondata/tww/prioryofthesacredflame/1/map_icons.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/prioryofthesacredflame/1/mountable_areas.json b/database/seeders/dungeondata/tww/prioryofthesacredflame/1/mountable_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/prioryofthesacredflame/2/dungeon_floor_switch_markers.json b/database/seeders/dungeondata/tww/prioryofthesacredflame/2/dungeon_floor_switch_markers.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/prioryofthesacredflame/2/enemies.json b/database/seeders/dungeondata/tww/prioryofthesacredflame/2/enemies.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/prioryofthesacredflame/2/enemy_packs.json b/database/seeders/dungeondata/tww/prioryofthesacredflame/2/enemy_packs.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/prioryofthesacredflame/2/enemy_patrols.json b/database/seeders/dungeondata/tww/prioryofthesacredflame/2/enemy_patrols.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/prioryofthesacredflame/2/floor_union_areas.json b/database/seeders/dungeondata/tww/prioryofthesacredflame/2/floor_union_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/prioryofthesacredflame/2/floor_unions.json b/database/seeders/dungeondata/tww/prioryofthesacredflame/2/floor_unions.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/prioryofthesacredflame/2/map_icons.json b/database/seeders/dungeondata/tww/prioryofthesacredflame/2/map_icons.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/prioryofthesacredflame/2/mountable_areas.json b/database/seeders/dungeondata/tww/prioryofthesacredflame/2/mountable_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/prioryofthesacredflame/3/dungeon_floor_switch_markers.json b/database/seeders/dungeondata/tww/prioryofthesacredflame/3/dungeon_floor_switch_markers.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/prioryofthesacredflame/3/enemies.json b/database/seeders/dungeondata/tww/prioryofthesacredflame/3/enemies.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/prioryofthesacredflame/3/enemy_packs.json b/database/seeders/dungeondata/tww/prioryofthesacredflame/3/enemy_packs.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/prioryofthesacredflame/3/enemy_patrols.json b/database/seeders/dungeondata/tww/prioryofthesacredflame/3/enemy_patrols.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/prioryofthesacredflame/3/floor_union_areas.json b/database/seeders/dungeondata/tww/prioryofthesacredflame/3/floor_union_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/prioryofthesacredflame/3/floor_unions.json b/database/seeders/dungeondata/tww/prioryofthesacredflame/3/floor_unions.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/prioryofthesacredflame/3/map_icons.json b/database/seeders/dungeondata/tww/prioryofthesacredflame/3/map_icons.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/prioryofthesacredflame/3/mountable_areas.json b/database/seeders/dungeondata/tww/prioryofthesacredflame/3/mountable_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/prioryofthesacredflame/dungeonroutes.json b/database/seeders/dungeondata/tww/prioryofthesacredflame/dungeonroutes.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/prioryofthesacredflame/npcs.json b/database/seeders/dungeondata/tww/prioryofthesacredflame/npcs.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/thedawnbreaker/1/dungeon_floor_switch_markers.json b/database/seeders/dungeondata/tww/thedawnbreaker/1/dungeon_floor_switch_markers.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/thedawnbreaker/1/enemies.json b/database/seeders/dungeondata/tww/thedawnbreaker/1/enemies.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/thedawnbreaker/1/enemy_packs.json b/database/seeders/dungeondata/tww/thedawnbreaker/1/enemy_packs.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/thedawnbreaker/1/enemy_patrols.json b/database/seeders/dungeondata/tww/thedawnbreaker/1/enemy_patrols.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/thedawnbreaker/1/floor_union_areas.json b/database/seeders/dungeondata/tww/thedawnbreaker/1/floor_union_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/thedawnbreaker/1/floor_unions.json b/database/seeders/dungeondata/tww/thedawnbreaker/1/floor_unions.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/thedawnbreaker/1/map_icons.json b/database/seeders/dungeondata/tww/thedawnbreaker/1/map_icons.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/thedawnbreaker/1/mountable_areas.json b/database/seeders/dungeondata/tww/thedawnbreaker/1/mountable_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/thedawnbreaker/dungeonroutes.json b/database/seeders/dungeondata/tww/thedawnbreaker/dungeonroutes.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/thedawnbreaker/npcs.json b/database/seeders/dungeondata/tww/thedawnbreaker/npcs.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/1/dungeon_floor_switch_markers.json b/database/seeders/dungeondata/tww/therookery/1/dungeon_floor_switch_markers.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/1/enemies.json b/database/seeders/dungeondata/tww/therookery/1/enemies.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/1/enemy_packs.json b/database/seeders/dungeondata/tww/therookery/1/enemy_packs.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/1/enemy_patrols.json b/database/seeders/dungeondata/tww/therookery/1/enemy_patrols.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/1/floor_union_areas.json b/database/seeders/dungeondata/tww/therookery/1/floor_union_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/1/floor_unions.json b/database/seeders/dungeondata/tww/therookery/1/floor_unions.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/1/map_icons.json b/database/seeders/dungeondata/tww/therookery/1/map_icons.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/1/mountable_areas.json b/database/seeders/dungeondata/tww/therookery/1/mountable_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/2/dungeon_floor_switch_markers.json b/database/seeders/dungeondata/tww/therookery/2/dungeon_floor_switch_markers.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/2/enemies.json b/database/seeders/dungeondata/tww/therookery/2/enemies.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/2/enemy_packs.json b/database/seeders/dungeondata/tww/therookery/2/enemy_packs.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/2/enemy_patrols.json b/database/seeders/dungeondata/tww/therookery/2/enemy_patrols.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/2/floor_union_areas.json b/database/seeders/dungeondata/tww/therookery/2/floor_union_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/2/floor_unions.json b/database/seeders/dungeondata/tww/therookery/2/floor_unions.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/2/map_icons.json b/database/seeders/dungeondata/tww/therookery/2/map_icons.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/2/mountable_areas.json b/database/seeders/dungeondata/tww/therookery/2/mountable_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/3/dungeon_floor_switch_markers.json b/database/seeders/dungeondata/tww/therookery/3/dungeon_floor_switch_markers.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/3/enemies.json b/database/seeders/dungeondata/tww/therookery/3/enemies.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/3/enemy_packs.json b/database/seeders/dungeondata/tww/therookery/3/enemy_packs.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/3/enemy_patrols.json b/database/seeders/dungeondata/tww/therookery/3/enemy_patrols.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/3/floor_union_areas.json b/database/seeders/dungeondata/tww/therookery/3/floor_union_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/3/floor_unions.json b/database/seeders/dungeondata/tww/therookery/3/floor_unions.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/3/map_icons.json b/database/seeders/dungeondata/tww/therookery/3/map_icons.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/3/mountable_areas.json b/database/seeders/dungeondata/tww/therookery/3/mountable_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/4/dungeon_floor_switch_markers.json b/database/seeders/dungeondata/tww/therookery/4/dungeon_floor_switch_markers.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/4/enemies.json b/database/seeders/dungeondata/tww/therookery/4/enemies.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/4/enemy_packs.json b/database/seeders/dungeondata/tww/therookery/4/enemy_packs.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/4/enemy_patrols.json b/database/seeders/dungeondata/tww/therookery/4/enemy_patrols.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/4/floor_union_areas.json b/database/seeders/dungeondata/tww/therookery/4/floor_union_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/4/floor_unions.json b/database/seeders/dungeondata/tww/therookery/4/floor_unions.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/4/map_icons.json b/database/seeders/dungeondata/tww/therookery/4/map_icons.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/4/mountable_areas.json b/database/seeders/dungeondata/tww/therookery/4/mountable_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/5/dungeon_floor_switch_markers.json b/database/seeders/dungeondata/tww/therookery/5/dungeon_floor_switch_markers.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/5/enemies.json b/database/seeders/dungeondata/tww/therookery/5/enemies.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/5/enemy_packs.json b/database/seeders/dungeondata/tww/therookery/5/enemy_packs.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/5/enemy_patrols.json b/database/seeders/dungeondata/tww/therookery/5/enemy_patrols.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/5/floor_union_areas.json b/database/seeders/dungeondata/tww/therookery/5/floor_union_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/5/floor_unions.json b/database/seeders/dungeondata/tww/therookery/5/floor_unions.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/5/map_icons.json b/database/seeders/dungeondata/tww/therookery/5/map_icons.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/5/mountable_areas.json b/database/seeders/dungeondata/tww/therookery/5/mountable_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/6/dungeon_floor_switch_markers.json b/database/seeders/dungeondata/tww/therookery/6/dungeon_floor_switch_markers.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/6/enemies.json b/database/seeders/dungeondata/tww/therookery/6/enemies.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/6/enemy_packs.json b/database/seeders/dungeondata/tww/therookery/6/enemy_packs.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/6/enemy_patrols.json b/database/seeders/dungeondata/tww/therookery/6/enemy_patrols.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/6/floor_union_areas.json b/database/seeders/dungeondata/tww/therookery/6/floor_union_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/6/floor_unions.json b/database/seeders/dungeondata/tww/therookery/6/floor_unions.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/6/map_icons.json b/database/seeders/dungeondata/tww/therookery/6/map_icons.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/6/mountable_areas.json b/database/seeders/dungeondata/tww/therookery/6/mountable_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/7/dungeon_floor_switch_markers.json b/database/seeders/dungeondata/tww/therookery/7/dungeon_floor_switch_markers.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/7/enemies.json b/database/seeders/dungeondata/tww/therookery/7/enemies.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/7/enemy_packs.json b/database/seeders/dungeondata/tww/therookery/7/enemy_packs.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/7/enemy_patrols.json b/database/seeders/dungeondata/tww/therookery/7/enemy_patrols.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/7/floor_union_areas.json b/database/seeders/dungeondata/tww/therookery/7/floor_union_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/7/floor_unions.json b/database/seeders/dungeondata/tww/therookery/7/floor_unions.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/7/map_icons.json b/database/seeders/dungeondata/tww/therookery/7/map_icons.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/7/mountable_areas.json b/database/seeders/dungeondata/tww/therookery/7/mountable_areas.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/dungeonroutes.json b/database/seeders/dungeondata/tww/therookery/dungeonroutes.json old mode 100755 new mode 100644 diff --git a/database/seeders/dungeondata/tww/therookery/npcs.json b/database/seeders/dungeondata/tww/therookery/npcs.json old mode 100755 new mode 100644 From 57e76e7cfa0417669a7cc894fe82413306f3d319 Mon Sep 17 00:00:00 2001 From: Wouter Koppenol Date: Sat, 28 Sep 2024 22:19:56 +0200 Subject: [PATCH 6/9] #2495 CoverageService now uses a much simpler query. New routes now also check if the season should be the _next_ season (if you're already creating a route for a dungeon for an upcoming season). --- app/Models/DungeonRoute/DungeonRoute.php | 3 ++- app/Providers/KeystoneGuruServiceProvider.php | 2 +- app/Service/DungeonRoute/CoverageService.php | 16 +++++++++++----- .../dungeonroute/coverage/affixgroup.blade.php | 16 ++++++++-------- resources/views/profile/overview.blade.php | 11 ++++++++--- 5 files changed, 30 insertions(+), 18 deletions(-) diff --git a/app/Models/DungeonRoute/DungeonRoute.php b/app/Models/DungeonRoute/DungeonRoute.php index b90a7cdd9..b3e88f2c4 100644 --- a/app/Models/DungeonRoute/DungeonRoute.php +++ b/app/Models/DungeonRoute/DungeonRoute.php @@ -822,7 +822,8 @@ public function saveFromRequest( // If it was empty just set Unspecified instead $this->faction_id = empty($this->faction_id) ? 1 : $this->faction_id; - $activeSeason = $seasonService->getMostRecentSeasonForDungeon($this->dungeon); + $activeSeason = $seasonService->getUpcomingSeasonForDungeon($this->dungeon) ?? + $seasonService->getMostRecentSeasonForDungeon($this->dungeon); // Can still be null if there are no seasons for this dungeon, like in Classic $this->season_id = $activeSeason->id ?? null; diff --git a/app/Providers/KeystoneGuruServiceProvider.php b/app/Providers/KeystoneGuruServiceProvider.php index 0351ccf58..62689ff73 100644 --- a/app/Providers/KeystoneGuruServiceProvider.php +++ b/app/Providers/KeystoneGuruServiceProvider.php @@ -462,7 +462,7 @@ static function (View $view) use ($globalViewVariables) { $view->with('nextSeason', $regionViewVariables['nextSeason']); $view->with('selectedSeason', $selectedSeason); $view->with('currentAffixGroup', $selectedSeason->getCurrentAffixGroup()); - $view->with('affixgroups', $selectedSeason->affixGroups); + $view->with('affixGroups', $selectedSeason->affixGroups); $view->with('dungeons', $selectedSeason->dungeons); }); diff --git a/app/Service/DungeonRoute/CoverageService.php b/app/Service/DungeonRoute/CoverageService.php index 516d74dea..3306c2018 100644 --- a/app/Service/DungeonRoute/CoverageService.php +++ b/app/Service/DungeonRoute/CoverageService.php @@ -17,13 +17,9 @@ public function getForUser(User $user, Season $season): Collection return DungeonRoute::with(['affixes']) ->selectRaw('dungeon_routes.*, IF(dungeon_routes.enemy_forces < mapping_versions.enemy_forces_required, 0, 1) as has_enemy_forces') ->join('dungeons', 'dungeons.id', 'dungeon_routes.dungeon_id') - ->join('dungeon_route_affix_groups', 'dungeon_route_affix_groups.dungeon_route_id', 'dungeon_routes.id') - ->join('affix_groups', 'affix_groups.id', 'dungeon_route_affix_groups.affix_group_id') - ->join('season_dungeons', 'season_dungeons.dungeon_id', 'dungeons.id') ->join('mapping_versions', 'mapping_versions.id', 'dungeon_routes.mapping_version_id') ->where('dungeon_routes.author_id', $user->id) - ->where('affix_groups.season_id', $season->id) - ->where('season_dungeons.season_id', $season->id) + ->where('dungeon_routes.season_id', $season->id) ->whereNull('expires_at') ->groupBy('dungeon_routes.id') ->get() @@ -42,5 +38,15 @@ public function getForUser(User $user, Season $season): Collection // and `season_dungeons`.`season_id` = 9 // and `expires_at` is null // group by `dungeon_routes`.`id` + + + // select dungeon_routes.*, IF(mapping_versions.enemy_forces_required > dungeon_routes.enemy_forces, 0, 1) as has_enemy_forces + // from `dungeon_routes` + // inner join `mapping_versions` on `mapping_versions`.`id` = `dungeon_routes`.`mapping_version_id` + // where `dungeon_routes`.`author_id` = 20265 + // and `dungeon_routes`.`season_id` = 14 + // and `expires_at` is null + // group by `dungeon_routes`.`id` + // ORDER BY `dungeon_routes`.`dungeon_id` ASC } } diff --git a/resources/views/common/dungeonroute/coverage/affixgroup.blade.php b/resources/views/common/dungeonroute/coverage/affixgroup.blade.php index 5cd3ab74d..773e048a5 100644 --- a/resources/views/common/dungeonroute/coverage/affixgroup.blade.php +++ b/resources/views/common/dungeonroute/coverage/affixgroup.blade.php @@ -8,7 +8,7 @@ /** * @var Collection $dungeons - * @var Collection $affixgroups + * @var Collection $affixGroups * @var Collection $dungeonRoutes * @var AffixGroup|null $currentAffixGroup * @var Season $currentSeason @@ -18,12 +18,12 @@ if (!function_exists('getDungeonRoutesByDungeonIdAndAffixGroupId')) { /** - * @return Collection + * @return Collection */ function getDungeonRoutesByDungeonIdAndAffixGroupId(Collection $dungeonRoutes, Dungeon $dungeon, AffixGroup $affixGroup): Collection { if ($dungeonRoutes->has($dungeon->id)) { - /** @var Collection $dungeonRoutesList */ + /** @var Collection $dungeonRoutesList */ $dungeonRoutesList = $dungeonRoutes->get($dungeon->id); $result = $dungeonRoutesList->filter( static fn(DungeonRoute $dungeonRoute) => $dungeonRoute->affixes->filter( @@ -74,7 +74,7 @@ function getDungeonRoutesByDungeonIdAndAffixGroupId(Collection $dungeonRoutes, D ) !!} @endif - @foreach($affixgroups as $affixGroup) + @foreach($affixGroups as $affixGroup) @include('common.affixgroup.affixgroup', [ 'affixgroup' => $affixGroup, @@ -92,7 +92,7 @@ function getDungeonRoutesByDungeonIdAndAffixGroupId(Collection $dungeonRoutes, D {{ __($dungeon->name) }} - @foreach($affixgroups as $affixGroup) + @foreach($affixGroups as $affixGroup) isNotEmpty(); ?> isNotEmpty()) - class="{{ $hasEnemyForces ? 'covered' : 'covered_warning' }}" - @endif + @if($availableDungeonRoutes->isNotEmpty()) + class="{{ $hasEnemyForces ? 'covered' : 'covered_warning' }}" + @endif > @if($availableDungeonRoutes->isNotEmpty())
diff --git a/resources/views/profile/overview.blade.php b/resources/views/profile/overview.blade.php index d0f858f2f..0c373365a 100644 --- a/resources/views/profile/overview.blade.php +++ b/resources/views/profile/overview.blade.php @@ -1,10 +1,15 @@ @extends('layouts.sitepage', ['rootClass' => 'col-xl-10 offset-xl-1', 'wide' => true, 'title' => __('view_profile.overview.title')]) + * @var string $newRouteStyle + * @var GameVersion $currentUserGameVersion + * @var Collection $dungeonRoutes */ ?> From 68cda3b1cf5a81fc0271f9947e5f6ffcc273f605 Mon Sep 17 00:00:00 2001 From: Wouter Koppenol Date: Sat, 28 Sep 2024 23:16:31 +0200 Subject: [PATCH 7/9] #2512 MDT string import/export now has the correct affixes we're expecting. Mostly. Somehow MDT doesn't have last week in there (anymore)? Idk. It works now at least. --- app/Logic/MDT/Conversion.php | 24 ++++++++++++++++--- database/seeders/SeasonsSeeder.php | 2 +- .../views/admin/tools/mdt/list.blade.php | 2 +- .../common/affixgroup/affixgroup.blade.php | 16 +++++++++---- .../elements/dungeonroute/info.blade.php | 4 ++-- 5 files changed, 37 insertions(+), 11 deletions(-) diff --git a/app/Logic/MDT/Conversion.php b/app/Logic/MDT/Conversion.php index 7c0590e28..ec9e2ee8d 100644 --- a/app/Logic/MDT/Conversion.php +++ b/app/Logic/MDT/Conversion.php @@ -13,6 +13,7 @@ use App\Models\Dungeon; use App\Models\Expansion; use App\Models\Floor\Floor; +use App\Models\Season; use App\Service\Season\SeasonService; use Exception; @@ -295,18 +296,30 @@ public static function convertLatLngToMDTCoordinate(LatLng $latLng): array */ public static function convertWeekToAffixGroup(SeasonService $seasonService, Dungeon $dungeon, int $mdtWeek): ?AffixGroup { - $season = $dungeon->getActiveSeason($seasonService); + if (!$dungeon->gameVersion->has_seasons) { + return null; + } + + $season = $seasonService->getUpcomingSeasonForDungeon($dungeon) ?? + $seasonService->getMostRecentSeasonForDungeon($dungeon); + if ($season === null) { logger()->error(sprintf('Unable to find season for dungeon %s', __($dungeon->name))); return null; } - $affixGroup = $season->affixGroups->get(($season->start_affix_group_index + ($mdtWeek - 1)) % $season->affixGroups->count()); + // For each season this is different + if ($season->id === Season::SEASON_TWW_S1) { + $affixGroup = $season->affixGroups->get(($season->start_affix_group_index + $mdtWeek) % $season->affixGroups->count()); + } else { + $affixGroup = $season->affixGroups->get(($season->start_affix_group_index + ($mdtWeek - 1)) % $season->affixGroups->count()); + } + // $affixGroup = $season->affixgroups->get(($season->start_affix_group_index - ($mdtWeek - 1))); if ($affixGroup === null) { logger()->error('Unable to find affix group for mdtWeek - returning current affix group instead', [ - '$mdtWeek' => $mdtWeek, + 'mdtWeek' => $mdtWeek, ]); $affixGroup = $season->getCurrentAffixGroup(); @@ -317,6 +330,11 @@ public static function convertWeekToAffixGroup(SeasonService $seasonService, Dun public static function convertAffixGroupToWeek(AffixGroup $affixGroup): int { + // For each season this is different + if ($affixGroup->season_id === Season::SEASON_TWW_S1) { + return ($affixGroup->id - 2) % $affixGroup->season->affix_group_count; + } + // We need to figure out which week it is in the rotation return ($affixGroup->id - 1) % $affixGroup->season->affix_group_count; } diff --git a/database/seeders/SeasonsSeeder.php b/database/seeders/SeasonsSeeder.php index f0762b09c..d319370e0 100644 --- a/database/seeders/SeasonsSeeder.php +++ b/database/seeders/SeasonsSeeder.php @@ -234,7 +234,7 @@ public function run(): void 'start' => '2024-09-16 00:00:00', 'presets' => 0, 'affix_group_count' => 4, - 'start_affix_group_index' => 2, + 'start_affix_group_index' => 3, 'key_level_min' => 2, 'key_level_max' => 18, 'dungeons' => Dungeon::select('dungeons.*') diff --git a/resources/views/admin/tools/mdt/list.blade.php b/resources/views/admin/tools/mdt/list.blade.php index 98f835b1c..d816606cf 100644 --- a/resources/views/admin/tools/mdt/list.blade.php +++ b/resources/views/admin/tools/mdt/list.blade.php @@ -39,7 +39,7 @@ {{ $mdtImport->id }} {{ $mdtImport->error }} - {!! substr($mdtImport->import_string, 0, 75) !!} + {{ substr($mdtImport->import_string, 0, 75) }} {{ $mdtImport->created_at->toDateTimeString() }}