'bundled/effect', 'furniture' => 'bundled/furniture', 'generic' => 'bundled/generic', 'pet' => 'bundled/pet', 'figure' => 'bundled/figure', 'generic_custom' => 'bundled/generic', ]; public function handle(): int { $gamedataPath = base_path('../Gamedata'); if (! File::exists($gamedataPath)) { $this->error('Gamedata directory not found at: ' . $gamedataPath); return Command::FAILURE; } $this->info('Checking gamedata symlinks...'); $this->newLine(); $created = 0; $skipped = 0; $fixed = 0; foreach ($this->symlinks as $link => $target) { $linkPath = $gamedataPath . '/' . $link; $targetPath = $gamedataPath . '/' . $target; if (! File::exists($targetPath)) { $this->warn(" ⚠️ Target does not exist: $target"); continue; } if (File::exists($linkPath)) { if (is_link($linkPath)) { $currentTarget = readlink($linkPath); if ($currentTarget === $target) { $this->line(" ✓ $link → $target (already correct)"); $skipped++; } elseif ($this->option('dry-run')) { $this->warn(" → Would fix: $link (currently points to: $currentTarget)"); } else { unlink($linkPath); symlink($target, $linkPath); $this->info(" ✨ Fixed: $link → $target"); $fixed++; } } elseif ($this->option('dry-run')) { $this->warn(" → Would replace: $link (is a regular file/directory)"); } else { $this->warn(" ⚠️ Cannot create symlink, $link exists as file/directory"); } } elseif ($this->option('dry-run')) { $this->warn(" → Would create: $link → $target"); } else { symlink($target, $linkPath); $this->info(" ✓ Created: $link → $target"); $created++; } } $this->newLine(); $this->info('Summary:'); $this->line(" Created: $created"); $this->line(" Fixed: $fixed"); $this->line(" Already correct: $skipped"); return Command::SUCCESS; } }