First, we can install the addon for you for free. Just create a ticket in our Discord and we will install it for you.
app/Http/Controllers/Api/Client/Servers/ServerController.php
'user_permissions' => $this->permissionsService->handle($server, $request->user()),
'egg_id' => $server->egg_id,
app/Http/ViewComposers/AssetComposer.php
use
statements add this code:use Pterodactyl\Models\PocketAddonsConfig;
$view->with('asset', $this->assetHashService);
$pe_egg_id = (int) PocketAddonsConfig::first()->pe_eggs;
'recaptcha' => [
'enabled' => config('recaptcha.enabled', false),
'siteKey' => config('recaptcha.website_key') ?? '',
],
'pocketmine_egg' => $pe_egg_id,
resources/scripts/api/server/getServer.ts
export default (uuid: string): Promise<[Server, string[]]> => {
export default (uuid: string): Promise<[Server, string[], number]> => {
data.meta?.is_server_owner ? ['*'] : data.meta?.user_permissions || [],
data.meta?.egg_id || 0,
resources/scripts/routers/ServerRouter.tsx
import
statements add this code:import { ApplicationStore } from '@/state';
const getServer = ServerContext.useStoreActions((actions) => actions.server.getServer);
const clearServerState = ServerContext.useStoreActions((actions) => actions.clearServerState)
const eggId = ServerContext.useStoreState((state) => state.server.eggId);
const pocketmineEggid = useStoreState((state: ApplicationStore) => state.settings.data!.pocketmine_egg);
route.permission ? (
<Can key={route.path} action={route.permission} matchAny>
<NavLink to={to(route.path, true)} exact={route.exact}>
{route.name}
</NavLink>
</Can>
) : (
<NavLink key={route.path} to={to(route.path, true)} exact={route.exact}>
{route.name}
</NavLink>
)
route.peEggId && pocketmineEggid !== eggId ? null : (
route.permission ? (
<Can key={route.path} action={route.permission} matchAny>
<NavLink to={to(route.path, true)} exact={route.exact}>
{route.name}
</NavLink>
</Can>
) : (
<NavLink key={route.path} to={to(route.path, true)} exact={route.exact}>
{route.name}
</NavLink>
)
)
{routes.server.map(({ path, permission, component: Component }) => (
<PermissionRoute key={path} permission={permission} path={to(path)} exact>
<Spinner.Suspense>
<Component />
</Spinner.Suspense>
</PermissionRoute>
))}
{routes.server.map(({ path, permission, component: Component, peEggId }) => (
peEggId && pocketmineEggid !== eggId ? null : (
<PermissionRoute key={path} permission={permission} path={to(path)} exact>
<Spinner.Suspense>
<Component />
</Spinner.Suspense>
</PermissionRoute>
)
))}
resources/scripts/routers/routes.ts
import
statements add this code:import PocketAddonsContainer from '@/components/server/pocketaddons/PocketAddonsContainer';
permission: string | string[] | null;
peEggId?: boolean;
{
path: '/statistics',
permission: null,
name: 'Statistics',
component: StatisticsContainer,
},
{
path: '/pocketaddons',
permission: null,
name: 'PocketAddons',
peEggId: true,
component: PocketAddonsContainer,
},
resources/scripts/state/server/index.ts
import
statements add this code:import pocketaddons, { PocketAddonsStore } from '@/state/server/pocketaddons';
permissions: string[];
eggId?: number;
setPermissions: Action<ServerDataStore, string[]>;
setEggId: Action<ServerDataStore, number>;
const [server, permissions] = await getServer(payload);
const [server, permissions, eggId] = await getServer(payload);
actions.setPermissions(permissions);
actions.setEggId(eggId);
setPermissions: action((state, payload) => {
if (!isEqual(payload, state.permissions)) {
state.permissions = payload;
}
}),
setEggId: action((state, payload) => {
if (!isEqual(payload, state.eggId)) {
state.eggId = payload;
}
}),
status: ServerStatusStore;
pocketaddons: PocketAddonsStore;
schedules,
pocketaddons,
state.schedules.data = [];
state.server.eggId = undefined;
state.pocketaddons.data = [];
resources/scripts/state/settings.ts
enabled: boolean;
siteKey: string;
};
pocketmine_egg: number;
resources/views/layouts/admin.blade.php
<li class="{{ ! starts_with(Route::currentRouteName(), 'admin.nests') ?: 'active' }}">
<a href="{{ route('admin.nests') }}">
<i class="fa fa-th-large"></i> <span>Nests</span>
</a>
</li>
<li class="header">POCKET ADDONS</li>
<li class="{{ ! starts_with(Route::currentRouteName(), 'admin.pocketaddons') ?: 'active' }}">
<a href="{{ route('admin.pocketaddons') }}">
<i class="fa fa-cubes"></i> <span>PocketAddons</span>
</a>
</li>
Open the file routes/admin.php
Under all use
statements add this code:
use Pterodactyl\Http\Controllers\Admin\PocketAddons\PocketAddonsController;
/**
* --------------------------------------------------------------------------
* Pocket addons Controller Routes
* --------------------------------------------------------------------------
*
* Endpoint: /admin/pocketaddons
*/
Route::group(['prefix' => 'pocketaddons'], function () {
Route::get('/', [PocketAddonsController::class, 'index'])->name('admin.pocketaddons');
Route::patch('/', [PocketAddonsController::class, 'update']);
});
routes/api-client.php
use
statements add this code:use Pterodactyl\Http\Controllers\Api\Client\Servers\PocketAddons\getPocketAddons;
use Pterodactyl\Http\Controllers\Api\Client\Servers\PocketAddons\InstallAddon;
Route::post('/command', [Client\Servers\CommandController::class, 'index']);
Route::post('/power', [Client\Servers\PowerController::class, 'index']);
Route::get('/pocketaddons', [getPocketAddons::class, 'get']);
Route::post('/pocketaddons/install', [InstallAddon::class, 'install']);
php artisan migrate --seed --force
php artisan db:seed pocketAddonsConfig
php artisan view:clear
php artisan cache:clear
build the panel: refer to the pterodactyl docs
run theses commands:
chown -R www-data:www-data /var/www/pterodactyl/*
chmod -R 755 storage/* bootstrap/cache
php artisan queue:restart
Made by MyPlugins for Pocket Addons