100 lines
6.1 KiB
PHP
100 lines
6.1 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
$hasBilling = website_billing_available();
|
|
$pricing = website_config('pricing', []);
|
|
$standardSlotStart = (float)($pricing['standard_slot_start'] ?? 0.50);
|
|
$legacyMonthlyStart = (float)($pricing['legacy_monthly_start'] ?? 4.00);
|
|
$standardMinSlots = (int)($pricing['standard_min_slots'] ?? 16);
|
|
$pricingDisclaimer = trim((string)($pricing['disclaimer'] ?? ''));
|
|
$customWorkNote = trim((string)($pricing['custom_work_note'] ?? ''));
|
|
$fixedCapNote = trim((string)($pricing['fixed_cap_note'] ?? ''));
|
|
?>
|
|
<section class="page-heading">
|
|
<div class="container">
|
|
<h1>Game Servers</h1>
|
|
<p>Order a standard hosted server for a modern or legacy game, or use the catalog as the starting point for something more customized. Individual servers can be reviewed for mods, scripts, automation, integrations, and community-specific requirements.</p>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="section">
|
|
<div class="container">
|
|
<div class="summary-grid">
|
|
<article class="summary-card">
|
|
<h3>Straightforward starting prices</h3>
|
|
<p>Standard game servers start at $<?= website_escape(number_format($standardSlotStart, 2)) ?> per slot, and most standard plans use a <?= website_escape((string)$standardMinSlots) ?>-slot minimum.</p>
|
|
<p><?= website_escape($fixedCapNote) ?></p>
|
|
</article>
|
|
<article class="summary-card">
|
|
<h3>Legacy games are part of the catalog</h3>
|
|
<p>Selected lightweight legacy servers can start around $<?= website_escape(number_format($legacyMonthlyStart, 2)) ?> per month, with practical help for older Windows and Linux server software, mod stacks, and migration work.</p>
|
|
</article>
|
|
<article class="summary-card">
|
|
<h3>Not just cookie-cutter hosting</h3>
|
|
<p>Every server can be individualized around files, startup parameters, Workshop content, automation, APIs, Discord integrations, and community-specific tooling.</p>
|
|
<p><?= website_escape($customWorkNote) ?></p>
|
|
</article>
|
|
</div>
|
|
<p class="muted" style="margin-top: 18px;"><?= website_escape($pricingDisclaimer) ?></p>
|
|
</div>
|
|
</section>
|
|
|
|
<section class="section">
|
|
<div class="container">
|
|
<?php if ($hasBilling && !empty($services)): ?>
|
|
<div class="catalog-list" role="list">
|
|
<div class="catalog-list-heading" aria-hidden="true">
|
|
<span>Server</span>
|
|
<span>Platform</span>
|
|
<span>Description</span>
|
|
<span>Price</span>
|
|
<span>Actions</span>
|
|
</div>
|
|
<?php foreach ($services as $service): ?>
|
|
<?php
|
|
$serviceName = website_service_name($service);
|
|
$platformLabel = website_service_platform($service);
|
|
$description = trim((string)($service['description'] ?? ''));
|
|
$price = (float)($service['price_monthly'] ?? 0);
|
|
$orderHref = website_order_url((string)$service['service_id']);
|
|
$docSlug = trim((string)($service['cfg_game_key'] ?? ''));
|
|
$hasDoc = $docSlug !== '' && website_doc_path($docSlug) !== null;
|
|
?>
|
|
<article class="catalog-row" role="listitem">
|
|
<div class="catalog-server">
|
|
<img class="catalog-thumb" src="<?= website_escape(website_service_image_url((string)($service['img_url'] ?? ''))) ?>" alt="" loading="lazy">
|
|
<h3><?= website_escape($serviceName) ?></h3>
|
|
</div>
|
|
<div class="catalog-platform" data-label="Platform">
|
|
<span class="status-badge status-badge-neutral"><?= website_escape($platformLabel) ?></span>
|
|
</div>
|
|
<p class="catalog-description" data-label="Description"><?= website_escape($description !== '' ? $description : 'Virtual private hosting with full configuration access, mod support, GSP panel management, and optional custom engineering help.') ?></p>
|
|
<div class="catalog-price" data-label="Price"><?= $price > 0 ? '$' . number_format($price, 2) . ' / month' : 'Contact for pricing' ?></div>
|
|
<div class="catalog-actions">
|
|
<a class="button button-primary" href="<?= website_escape($orderHref) ?>">Order Now</a>
|
|
<?php if ($hasDoc): ?>
|
|
<a class="button button-secondary" href="<?= website_escape(documentation_url($docSlug)) ?>">Documentation</a>
|
|
<?php else: ?>
|
|
<a class="button button-secondary" href="<?= website_escape(website_url('docs.php')) ?>">Documentation</a>
|
|
<?php endif; ?>
|
|
</div>
|
|
</article>
|
|
<?php endforeach; ?>
|
|
</div>
|
|
<?php else: ?>
|
|
<div class="empty-state">
|
|
<h2>Server catalog unavailable</h2>
|
|
<p><?= website_escape((string)website_config('admin_notice')) ?></p>
|
|
<p class="muted">Standard servers start at $<?= website_escape(number_format($standardSlotStart, 2)) ?> per slot, while selected legacy servers can start around $<?= website_escape(number_format($legacyMonthlyStart, 2)) ?> per month.</p>
|
|
<div class="card-actions">
|
|
<a class="button button-primary" href="<?= website_escape(website_url('support.php')) ?>">Contact Support</a>
|
|
<a class="button button-secondary" href="<?= website_escape(website_custom_project_url()) ?>">Discuss a Custom Server</a>
|
|
</div>
|
|
<?php if (!website_billing_config_present()): ?>
|
|
<p class="muted">If you already know what you want to build, contact support and we can review the request directly even while the public catalog is unavailable.</p>
|
|
<?php endif; ?>
|
|
</div>
|
|
<?php endif; ?>
|
|
</div>
|
|
</section>
|