Features
KOTH provides a fully configurable King of the Hill system designed for PvP-focused ARK servers. It supports both scheduled and admin-driven events, with flexible rule control, persistence, and integration with existing server systems.
Control & Scoring
Restrictions & Zone Rules
Blocked Items System
Rewards & Integration
- Commands execute as the player with admin privileges
- Compatible with commands that require or do not require SteamID
- Uses contribution-based ranking
Announcements & Webhooks
HUD & Visuals
Commands
Configuration
- Admin overrides
- Per-location overrides
- Commented configuration file available for reference
Requirements
KOTH provides a fully configurable King of the Hill system designed for PvP-focused ARK servers. It supports both scheduled and admin-driven events, with flexible rule control, persistence, and integration with existing server systems.
- Scheduled Events – Automatically start daily events using configurable time, duration, and location selection
- Admin Spawning – Spawn events manually anywhere or at predefined locations using commands
- Multi-Map Support – Configure multiple maps and locations with independent settings
- Weighted Location Selection – Control how often each location is chosen
- Event Persistence – Active events continue correctly after server restart using database storage
- Cluster Awareness – Supports multiple server instances using per-server filtering
Control & Scoring
- Tribe-Based Control System – Players compete for control of the hill based on presence
- Contested State Handling – Automatically pauses scoring when multiple tribes are present
- Flexible Scoring System – Points awarded based on control time and contribution
- Winner Bonus Support – Optional bonus for the winning tribe
- Contribution Tracking – Tracks player participation for accurate rewards
Restrictions & Zone Rules
- Dino Restrictions – Block, push, or remove dinos from the event area
- Flyer Control – Independently control flyer access
- Structure Blocking – Prevent placement of structures, beds, and turrets in and around the arena
- Projectile & Damage Control – Block incoming damage types into the zone
- TEK Suit Suppression – Disable TEK/Fed movement abilities inside the event
Blocked Items System
- Per-Event Item Blocking – Block specific weapons or items for each location
- Admin Event Support – Define separate blocked items for admin-spawned events
- Global Fallback System – Automatically applies default rules when no override is defined
- Clear Priority System – Location → Admin → Global
- Explicit Control – Empty lists allow all items, missing sections fall back to defaults
Rewards & Integration
- ArkShop Integration – Award points directly to players or tribes
- Deferred Payout Support – Ensures rewards are delivered reliably
- Top Player Rewards (Optional)
- Commands execute as the player with admin privileges
- Compatible with commands that require or do not require SteamID
- Uses contribution-based ranking
Announcements & Webhooks
- In-Game Announcements – Broadcast event start, control changes, and end
- Periodic Reminders – Configurable interval reminders during events
- Discord Webhook Support – Send event updates externally
- Pre-Event Announcements – Notify players before events begin
HUD & Visuals
- Live HUD Display – Shows active event information in real time
- Nearest Event Tracking – Displays only relevant event data per player
- Custom Status Indicators – Shows claimed, contested, or empty states
- Forcefield Visuals – Optional arena boundary visuals
Commands
- Full admin command support including:
- koth.reload
- koth.spawn here
- koth.spawn <map> <locationId>
- koth.list
- koth.stop <eventId>
- koth.stop
Configuration
JSON:
{
"General": {
"Enabled": true, // Master enable for the plugin.
"ClusterId": "main", // Cluster identifier used for cross-server features and announcements.
"ServerName": "Tazz" // Friendly server name used in messages/logging.
},
"Database": {
"UseMysql": true, // If true, use MySQL for persistence. Required for restart restore and shared data.
"MysqlHost": "127.0.0.1", // MySQL host or IP.
"MysqlPort": 3306, // MySQL port.
"MysqlUser": "", // MySQL username.
"MysqlPassword": "", // MySQL password.
"MysqlDatabase": "" // MySQL database name.
},
"ArkShop": {
"Enabled": true, // Enables ArkShop point payouts.
"UseDeferredPayout": true, // If true, payouts can be queued/deferred when needed.
"MinimumPointsToAward": 1, // Minimum whole points required before a payout is created.
"RoundDownFractionalPoints": true // If true, fractional points are rounded down before payout.
},
"Schedule": {
"UseAutomaticDailyRotation": true, // Enables automatic daily event spawning.
"DailyStartHour": 14, // Hour of day to start the scheduled event (24h format, server local time).
"DailyStartMinute": 0, // Minute of the hour to start the scheduled event.
"DefaultDurationMinutes": 90, // Default event length if a location does not override it.
"SelectionMode": "WeightedRandom", // How the scheduler picks a location. Example: WeightedRandom.
"PreventSameLocationBackToBack": false, // If true, the same location cannot be selected twice in a row.
"LocationRepeatCooldownDays": 1, // Optional cooldown before a location is eligible again.
"UsePerLocationDurationOverride": true, // If true, DurationMinutes on a location overrides the default duration.
"AllowedWeekdays": [
"Saturday",
"Sunday"
] // Optional. If set, automatic scheduled events only spawn on these days. If missing, scheduler runs every day. If empty, no automatic events will spawn.
},
"Scoring": {
"PayoutAllTribesWithPoints": true, // If true, every tribe with eligible points gets paid. If false, only the winner is paid.
"PointsPerControlMinute": 100, // Base points awarded per control minute.
"AwardWinnerBonus": true, // If true, award the winner bonus to the winning tribe.
"WinnerBonusPoints": 2000, // Bonus points awarded to the winning tribe.
"SplitMethod": "ContributionWeighted", // How payout is split across contributions. Example: ContributionWeighted.
"MinimumEligibleContributionSeconds": 30, // Minimum contribution time required to be payout-eligible.
"ControlTickSeconds": 5, // Control/scoring update interval in seconds.
"PayoutAtEventEndOnly": true, // If true, payouts are processed only when the event ends.
"RequireFullMinuteForPointCredit": true // If true, a tribe must hold for a full minute before that minute awards points.
},
"TopPlayerRewards": {
"Enabled": false, // If true, enables command rewards for the top 3 players at event end (based on contribution, not tribe).
"Rank1Commands": [], // Commands executed for 1st place player. Runs as the player with admin privileges. Supports placeholders like {steamid}, {rank}, {points}, etc.
"Rank2Commands": [], // Commands executed for 2nd place player. Optional. Leave empty to disable.
"Rank3Commands": [] // Commands executed for 3rd place player. Optional. Leave empty to disable.
// Supported Placeholders
// {steamid}
// {playerid}
// {tribeid}
// {rank}
// {points}
// {controlseconds}
},
"Control": {
"UseOuterProtectionSphere": true, // Enables the outer protection sphere.
"UseInnerControlSphere": true, // Enables the inner control sphere used for claiming/control.
"DefaultOuterRadius": 8000.0, // Default outer sphere radius in unreal units.
"DefaultInnerRadius": 5000.0, // Default inner sphere radius in unreal units.
"PlayersMustBeAlive": true, // Dead players do not count for contest/control if true.
"MinimumContestPlayers": 2, // Preferred minimum players from a tribe required to fully qualify for control.
"SinglePlayerContestAfterSeconds": 15, // Time after which a single player may qualify if minimum players are not met.
"ContestWarmupSeconds": 15, // Warmup time before control becomes active.
"RespawnContestLockoutSeconds": 30, // Respawn lockout window used for contest qualification.
"ReentryQualificationSeconds": 10, // Time a player must remain after re-entry before qualifying again.
"RequireContinuousPresenceForControl": true, // If true, players must continuously remain inside to qualify.
"PauseScoringWhenContested": true, // If true, no points are awarded while contested.
"MaxQualifyingPlayersPerTribe": 0 // 0 = unlimited. Otherwise caps how many players per tribe can qualify at once.
},
"DinoRestrictions": {
"Enabled": true, // Master enable for dino restriction handling.
"ForceDismountOnEntry": false, // If true, mounted players are forcibly dismounted on entry when dino rules require it.
"PushDinosOutFirst": true, // If true, attempt a push-out before teleport fallback.
"PushStrength": 1500.0, // Strength of the push applied to dinos inside the restricted zone.
"PushIntervalSeconds": 0.5, // How often the push-out check runs.
"TeleportFallbackIfStillInside": true, // If true, teleport out if the dino is still inside after push handling.
"TeleportFallbackDelaySeconds": 2.0, // Delay before teleport fallback is applied.
"BlockDinoFollowInsideZone": true, // If true, follow behavior is blocked while inside the restricted zone.
"BlockDinoDamageToPlayersInsideZone": true, // If true, dinos are prevented from damaging players inside the zone.
"BlockOnlyWhenTargetInsideProtectionSphere": true // If true, the dino damage block applies only when the target is inside the protection sphere.
},
"Structures": {
"BlockStructurePlacementInOuterSphere": true, // Blocks normal structure placement in the outer sphere.
"BlockBedPlacementInOuterSphere": true, // Blocks bed placement in the outer sphere.
"BlockSleepingBagPlacementInOuterSphere": true, // Blocks sleeping bag placement in the outer sphere.
"AdditionalBedBlockRadius": 10000.0, // Extra radius outside the arena where beds/sleeping bags are also blocked.
"DestroyExploitPlacedStructures": true, // If true, structures that slipped through and violate the rules can be auto-destroyed.
"DestroyExploitPlacedBeds": true, // If true, exploit-placed beds/sleeping bags can be auto-destroyed.
"DestroyCheckIntervalSeconds": 2.0, // How often exploit cleanup checks run.
"BlockTurretPlacementNearArena": true, // Blocks turret placement near the arena using the extra radius below.
"AdditionalTurretBlockRadius": 10000.0 // Extra radius outside the arena where turret placement is blocked.
},
"ZoneRules": {
"BlockDinos": true, // If true, dinos are not allowed in the zone.
"BlockFlyers": true, // If true, flyer dinos are not allowed in the zone.
"BlockMountedPlayers": true, // Scoring rule: mounted players do not qualify/control when blocked.
"AllowPlayersOnFoot": true, // Scoring rule for players on foot.
"AllowTekSuitPlayers": false, // Suppression-only rule for TEK/Fed movement inside the zone.
"BlockStructurePlacement": true, // Per-event structure placement block.
"BlockBeds": true, // Per-event bed placement block.
"BlockSleepingBags": true, // Per-event sleeping bag placement block.
"BlockDinoDamageIntoZone": true, // Blocks dino damage into the zone.
"BlockProjectileDamageIntoZone": false // Blocks projectile damage into the zone.
},
"BlockedItems": [], // Global default blocked items. Used when a location or admin event does NOT define its own BlockedItems section. Empty = nothing is blocked.
"Visuals": {
"UseForcefieldVisuals": true, // Master enable for arena forcefield visuals.
"OuterForcefieldEnabled": true, // Shows the outer sphere visual.
"InnerForcefieldEnabled": true // Shows the inner sphere visual.
},
"Hud": {
"Enabled": true, // Master enable for the KOTH HUD.
"PermanentDisplay": true, // If true, HUD is always shown when conditions are met.
"RefreshSeconds": 1.0, // HUD refresh interval.
"ShowOnlyOnActiveMap": true, // If true, only show HUD when the player is on a map with an active/relevant event.
"ShowNearestEventOnly": true, // If true, HUD shows only the nearest event.
"UseDisplayCoords": true, // Uses configured display lat/lon if available.
"CoordinateDecimalPlaces": 1, // Number of decimals to show in displayed coordinates.
"FallbackToNameIfMissing": true, // If true, fall back to location/map name if display coords are missing.
"ShowTimeRemaining": true, // Shows event time remaining.
"ShowStatus": true, // Shows event status text.
"ShowControllingTribe": true, // Shows the tribe currently controlling the hill.
"StatusTextEmpty": "EMPTY", // HUD label for empty state.
"StatusTextClaimed": "CLAIMED", // HUD label for claimed state.
"StatusTextContested": "CONTESTED" // HUD label for contested state.
},
"Announcements": {
"Enabled": true, // Master enable for in-game announcement broadcasts.
"AnnounceEventStartClusterWide": true, // Broadcast event start cluster-wide.
"AnnounceControlChangesClusterWide": true, // Broadcast control changes cluster-wide.
"AnnounceEventEndClusterWide": true, // Broadcast event end cluster-wide.
"AnnouncePeriodicRemindersClusterWide": true, // Broadcast periodic reminder messages cluster-wide.
"ReminderIntervalMinutes": 30 // Reminder interval in minutes.
},
"Webhook": {
"Enabled": true, // Master enable for Discord webhook posting.
"Url": "", // Discord webhook URL.
"SendStart": true, // Send a webhook when an event starts.
"SendControlChange": true, // Send a webhook when control changes.
"SendReminder": true, // Send periodic reminder webhooks.
"SendEnd": true, // Send a webhook when an event ends.
"SendPreSpawn": true, // Send a pre-spawn webhook before the scheduled event starts.
"PreSpawnMinutes": 30 // Minutes before the daily start time to send the pre-spawn webhook.
},
"Commands": {
"KothCommand": "koth", // Root KOTH command.
"KothListCommand": "koth.list", // Command to list active/upcoming KOTH events.
"KothReloadCommand": "koth.reload", // Reload command.
"KothSpawnCommand": "koth.spawn", // Admin command to spawn an event.
"KothStopCommand": "koth.stop", // Admin command to stop an event.
"KothNextCommand": "koth.next" // Command to show the next scheduled event time.
},
"Messages": {
"EventStarted": "[KOTH] A new hill is active on {MapName} at {Coords}. Time remaining: {Duration}.", // Message used when an event starts.
"ControlGained": "[KOTH] {TribeName} has taken control of the hill on {MapName} at {Coords}.", // Message used when a tribe takes control.
"EventContested": "[KOTH] The hill on {MapName} at {Coords} is now contested.", // Message used when the hill becomes contested.
"EventEnded": "[KOTH] The event has ended on {MapName} at {Coords}. Winner: {TribeName}.", // Message used when the event ends.
"DinoBlocked": "[KOTH] Dinos are not allowed inside the active KOTH zone.", // Message shown when dinos are blocked from the zone.
"MountBlocked": "[KOTH] Mounted control is not allowed inside the active KOTH zone.", // Message shown when mounted control is blocked.
"StructureBlocked": "[KOTH] Structures and beds cannot be placed near the active KOTH." // Message shown when structure placement is blocked near the arena.
},
"AdminCommands": {
"AllowReloadCommand": true, // Enables the reload admin command.
"AllowSpawnCommand": true, // Enables the spawn admin command.
"AllowMultipleActiveEvents": true, // If true, admins may run multiple active events at once.
"DefaultSpawnHereDurationMinutes": 90, // Default duration for admin spawn-here actions.
"DefaultSpawnHereOuterRadius": 8000.0, // Default outer radius for admin spawn-here actions.
"DefaultSpawnHereInnerRadius": 5000.0 // Default inner radius for admin spawn-here actions.
},
"AdminDefaults": {
"BlockedItems": [] // Default blocked items for admin-spawned events (e.g. koth.spawn here). If this section exists, it overrides global. If empty, nothing is blocked. If missing entirely, falls back to global BlockedItems.
},
"Maps": [
{
"MapName": "Ragnarok", // Runtime/display map name used for map matching.
"Enabled": true, // Enables this map entry.
"Locations": [
{
"Id": "test", // Unique location id used by commands/scheduler/history.
"Enabled": true, // Enables this location.
"Weight": 1, // Relative weight used by weighted random scheduling.
"DisplayCoords": {
"Lat": 65.07, // Display latitude for HUD/messages.
"Lon": 14.39 // Display longitude for HUD/messages.
},
"Center": {
"X": -185325, // World X position of the arena center.
"Y": 86248, // World Y position of the arena center.
"Z": 11588 // World Z position of the arena center.
},
"OuterRadius": 9000.0, // Outer protection sphere radius for this location.
"InnerRadius": 6000.0, // Inner control sphere radius for this location.
"DurationMinutes": 90, // Per-location event duration override.
"PointsPerControlMinute": 100, // Per-location score override.
"WinnerBonusPoints": 2000, // Per-location winner bonus override.
"ZoneRules": {
"BlockDinos": false, // Per-location override for dino blocking.
"BlockFlyers": false, // Per-location override for flyer blocking.
"BlockMountedPlayers": true, // Per-location override for mounted-player scoring.
"AllowPlayersOnFoot": true, // Per-location override for on-foot scoring.
"AllowTekSuitPlayers": false, // Per-location override for TEK/Fed suppression.
"BlockStructurePlacement": true, // Per-location structure placement block.
"BlockBeds": true, // Per-location bed placement block.
"BlockSleepingBags": true, // Per-location sleeping bag placement block.
"BlockDinoDamageIntoZone": true, // Per-location dino damage block.
"BlockProjectileDamageIntoZone": false // Per-location projectile damage block.
},
"AllowedServers": [], // Optional server-instance filter. Empty = valid on any server for this map. Values should match -KOTHServer=...
"BlockedItems": [
"PrimalItem_WeaponMachinedSniper"
] // Item class names or blueprint-path fragments blocked for this specific event location.
}
]
},
{
"MapName": "Ragnarok",
"Enabled": true,
"Locations": [
{
"Id": "test2",
"Enabled": true,
"Weight": 1,
"DisplayCoords": {
"Lat": 65.07,
"Lon": 14.39
},
"Center": {
"X": -185325,
"Y": 86248,
"Z": 11588
},
"OuterRadius": 9000.0,
"InnerRadius": 6000.0,
"DurationMinutes": 90,
"PointsPerControlMinute": 100,
"WinnerBonusPoints": 2000,
"ZoneRules": { // If left empty it will use global zone rules
},
"AllowedServers": []
}
]
}
]
}
- Fully configurable via config.json
- Supports layered configuration:
- Admin overrides
- Per-location overrides
- Commented configuration file available for reference
Requirements
- ARK: Survival Evolved Dedicated Server
- Ark Server API 3.56+
- MySQL (required for persistence features)
