VIP System Configuration
The VIP System provides a premium membership purchasing interface with configurable tiers, pricing options, and bonus systems. Players can purchase VIP status using WCoins, WPCoins, or Goblin Points.
File Location#
Data/Plugins/Characters/VIP/VIPSystem.xml
VIP Tiers#
| Tier | Description | Typical Use |
|---|---|---|
| 0 | Free Player | Default non-VIP status (not purchasable) |
| 1-3 | VIP Tiers | Purchasable premium tiers with increasing benefits |
Configuration Structure#
<VIPSystem Enabled="true" MaxTiers="4">
<Tiers>
<!-- Tier definitions with descriptions and bonuses -->
</Tiers>
<Pricing>
<!-- Price options for each tier -->
</Pricing>
<UpgradeRules>
<!-- How upgrades and time conversion work -->
</UpgradeRules>
<Display>
<!-- UI text customization -->
</Display>
</VIPSystem>
Sections#
Root Element#
<VIPSystem Enabled="true" MaxTiers="4">
| Attribute | Type | Default | Description |
|---|---|---|---|
Enabled | bool | false | Enable/disable the entire VIP system |
MaxTiers | int | 4 | Total number of tiers (including tier 0 free tier) |
Tiers#
Each tier defines a membership level with its display properties, description, and bonuses.
<Tier Index="1" Name="Bronze VIP" Color="CD7F32" IconIndex="1">
<Description>
<Line>+20% Experience Rate</Line>
<Line>+10% Item Drop Rate</Line>
</Description>
<Bonuses>
<Bonus Type="EXP" Value="20" Display="+20% Experience" />
<Bonus Type="DROP" Value="10" Display="+10% Item Drop" />
</Bonuses>
</Tier>
Tier Attributes#
| Attribute | Type | Description |
|---|---|---|
Index | int | Tier level (0=Free, 1-3=VIP tiers) |
Name | string | Display name (max 32 characters) |
Color | hex | RGB color code without # prefix (e.g., "FFD700" for gold) |
IconIndex | int | Icon reference for client UI |
Description Lines#
Add multiple <Line> elements to describe the tier benefits. Maximum 8 lines, 64 characters each. The limit is compiled into the server; additional lines are ignored during load.
<Description>
<Line>+50% Experience Rate</Line>
<Line>+25% Item Drop Rate</Line>
<Line>Access to VIP Maps</Line>
</Description>
Bonuses#
Bonuses are displayed to the player in the UI. The bonus values shown here are for display only - actual gameplay bonuses must be configured in ServerInfo.txt under the VIP rate multipliers.
Maximum 12 bonuses per tier. The limit is compiled into the server; additional entries are ignored during load.
<Bonus Type="EXP" Value="50" Display="+50% Experience" />
<Bonus Type="FEATURE" Display="VIP Maps Access" />
| Attribute | Type | Description |
|---|---|---|
Type | enum | Bonus category: EXP, DROP, ZEN, FEATURE, COSMETIC |
Value | int | Numeric value (used for rate bonuses, optional for features) |
Display | string | Text shown to player (max 48 characters) |
Bonus Types:
| Type | Purpose | Example |
|---|---|---|
EXP | Experience rate bonus | "Value=50" = 50% bonus |
DROP | Item drop rate bonus | "Value=25" = 25% bonus |
ZEN | Zen drop rate bonus | "Value=25" = 25% bonus |
FEATURE | Gameplay feature | "VIP Maps Access" |
COSMETIC | Visual effect | "Gold Name Color" |
Pricing#
Define pricing options for each purchasable tier. Multiple duration options can be offered per tier.
<TierPricing TierIndex="1">
<Option Days="7" WCoins="100" WPCoins="0" GoblinPoints="500" />
<Option Days="30" WCoins="350" WPCoins="0" GoblinPoints="1800" />
<Option Days="90" WCoins="900" WPCoins="0" GoblinPoints="4500" />
</TierPricing>
TierPricing Attributes#
| Attribute | Type | Description |
|---|---|---|
TierIndex | int | Which tier this pricing applies to (1-3) |
Option Attributes#
| Attribute | Type | Valid Range | Description |
|---|---|---|---|
Days | int | 1-255 | Duration of VIP membership in days (sent as BYTE, max 255) |
WCoins | int | 0+ | Cost in WCoins (set to 0 to disable this currency) |
WPCoins | int | 0+ | Cost in WPCoins (set to 0 to disable this currency) |
GoblinPoints | int | 0+ | Cost in Goblin Points (set to 0 to disable this currency) |
Currency Selection Logic:
- Any currency with a value > 0 is available for payment
- The player chooses which currency to use during purchase
- At least one currency must be > 0 for a valid option
Example Configurations:
<Option Days="30" WCoins="500" WPCoins="0" GoblinPoints="0" />
Players can only pay with WCoins for this option.
<Option Days="30" WCoins="500" WPCoins="250" GoblinPoints="2500" />
Players can choose to pay with WCoins, WPCoins, OR Goblin Points.
<Option Days="7" WCoins="0" WPCoins="0" GoblinPoints="1000" />
Special promotion - only purchasable with Goblin Points.
Upgrade Rules#
Controls how VIP tier upgrades and time conversion work.
<UpgradeRules>
<Rule ConvertRemainingTime="true" ConversionRate="50" AllowDowngrade="false" />
</UpgradeRules>
| Attribute | Type | Default | Description |
|---|---|---|---|
ConvertRemainingTime | bool | true | Convert remaining lower-tier time when upgrading to higher tier |
ConversionRate | int | 50 | Percentage of time that carries over (0-100) |
AllowDowngrade | bool | false | Allow purchasing lower tier when player has higher tier |
Time Conversion Behavior#
When a player upgrades from a lower tier to a higher tier, the system can convert their remaining time on the old tier.
Formula:
ConvertedTime = RemainingSeconds × (CurrentTier / NewTier) × (ConversionRate / 100)
Example:
Player has 15 days remaining on VIP1 (Bronze) and upgrades to VIP3 (Gold) with ConversionRate="50":
ConvertedTime = 15 days × (1/3) × 0.5 = 2.5 days
The player gets 2.5 days bonus added to their VIP3 purchase.
Display Settings#
Customize the UI text shown in the VIP purchase window.
<Display>
<WindowTitle>VIP Membership</WindowTitle>
<PurchaseButtonText>Purchase</PurchaseButtonText>
<ExtendButtonText>Extend</ExtendButtonText>
<UpgradeButtonText>Upgrade</UpgradeButtonText>
<CurrentTierLabel>Current Tier:</CurrentTierLabel>
<ExpiresLabel>Expires:</ExpiresLabel>
<SelectDurationLabel>Select Duration:</SelectDurationLabel>
</Display>
| Element | Max Length | Description |
|---|---|---|
WindowTitle | 64 chars | Window title bar text |
PurchaseButtonText | 32 chars | Button text for new VIP purchase |
ExtendButtonText | 32 chars | Button text for extending current tier |
UpgradeButtonText | 32 chars | Button text for upgrading to higher tier |
CurrentTierLabel | 32 chars | Label for current VIP status |
ExpiresLabel | 32 chars | Label for expiration date |
SelectDurationLabel | 32 chars | Label for duration selection dropdown |
Important Behavior#
Menu Tabs Are Config-Driven#
The VIP menu opened from the (U) interface builds one tab per configured tier. The number of tabs comes from MaxTiers and each tab label comes from that tier's Name; neither is fixed on the client. Add, remove, or rename tiers here and the menu tabs follow on the next login (or plugin reload) with no client change.
- A tier with a blank
Nameproduces no tab, so leave every purchasable tier named. MaxTierscounts the free tier (Index 0). For 3 purchasable tabs plus the free reference tier, setMaxTiers="4".
Purchase Types#
The system automatically determines the purchase type:
| Type | Condition | Behavior |
|---|---|---|
| NEW | Player has no VIP (tier 0) | Grants VIP starting now |
| EXTEND | Player purchases same tier | Adds duration to existing expiration |
| UPGRADE | Player purchases higher tier | Converts remaining time + adds new duration |
Currency Deduction#
When a purchase succeeds:
- Currency is deducted from the player's account via a DataServer currency write to DataServer
- Player's balance updates immediately in the client UI (via a client balance update notification)
- Account level and expiration are updated via a JoinServer account-level write to JoinServer
Account Level Storage#
VIP tier is stored in the AccountLevel field:
- Tier 0 = Free player
- Tier 1-3 = VIP tiers
- Expiration date stored in
AccountExpireDatefield
Time Handling#
The system handles time zones and expiration as follows:
- All times use server local time
- Expiration format:
YYYY-MM-DD HH:MM:SS - Grace period: Players retain benefits until the exact expiration second
- Extensions: GameServer calculates new expiration locally AND sends duration to JoinServer for database persistence
Examples#
<VIPSystem Enabled="true" MaxTiers="4">
<Tiers>
<Tier Index="0" Name="Free Player" Color="808080" IconIndex="0">
<Description>
<Line>Standard gameplay</Line>
</Description>
<Bonuses />
</Tier>
<Tier Index="1" Name="Bronze VIP" Color="CD7F32" IconIndex="1">
<Description>
<Line>+20% Experience</Line>
<Line>+10% Drop Rate</Line>
</Description>
<Bonuses>
<Bonus Type="EXP" Value="20" Display="+20% Experience" />
<Bonus Type="DROP" Value="10" Display="+10% Drop Rate" />
</Bonuses>
</Tier>
<Tier Index="2" Name="Silver VIP" Color="C0C0C0" IconIndex="2">
<Description>
<Line>+50% Experience</Line>
<Line>+25% Drop Rate</Line>
</Description>
<Bonuses>
<Bonus Type="EXP" Value="50" Display="+50% Experience" />
<Bonus Type="DROP" Value="25" Display="+25% Drop Rate" />
</Bonuses>
</Tier>
<Tier Index="3" Name="Gold VIP" Color="FFD700" IconIndex="3">
<Description>
<Line>+100% Experience</Line>
<Line>+50% Drop Rate</Line>
</Description>
<Bonuses>
<Bonus Type="EXP" Value="100" Display="+100% Experience" />
<Bonus Type="DROP" Value="50" Display="+50% Drop Rate" />
</Bonuses>
</Tier>
</Tiers>
<Pricing>
<TierPricing TierIndex="1">
<Option Days="7" WCoins="100" WPCoins="0" GoblinPoints="0" />
<Option Days="30" WCoins="350" WPCoins="0" GoblinPoints="0" />
</TierPricing>
<TierPricing TierIndex="2">
<Option Days="7" WCoins="200" WPCoins="0" GoblinPoints="0" />
<Option Days="30" WCoins="700" WPCoins="0" GoblinPoints="0" />
</TierPricing>
<TierPricing TierIndex="3">
<Option Days="7" WCoins="400" WPCoins="0" GoblinPoints="0" />
<Option Days="30" WCoins="1400" WPCoins="0" GoblinPoints="0" />
</TierPricing>
</Pricing>
<UpgradeRules>
<Rule ConvertRemainingTime="true" ConversionRate="50" AllowDowngrade="false" />
</UpgradeRules>
<Display>
<WindowTitle>VIP Membership</WindowTitle>
<PurchaseButtonText>Purchase</PurchaseButtonText>
<ExtendButtonText>Extend</ExtendButtonText>
<UpgradeButtonText>Upgrade</UpgradeButtonText>
<CurrentTierLabel>Current Tier:</CurrentTierLabel>
<ExpiresLabel>Expires:</ExpiresLabel>
<SelectDurationLabel>Select Duration:</SelectDurationLabel>
</Display>
</VIPSystem>
<Pricing>
<TierPricing TierIndex="1">
<!-- Regular pricing -->
<Option Days="30" WCoins="350" WPCoins="0" GoblinPoints="0" />
<!-- Special event: Buy with Goblin Points -->
<Option Days="7" WCoins="0" WPCoins="0" GoblinPoints="500" />
</TierPricing>
<TierPricing TierIndex="2">
<!-- Allow payment with either WCoins OR Goblin Points -->
<Option Days="30" WCoins="700" WPCoins="0" GoblinPoints="3500" />
</TierPricing>
</Pricing>
This configuration offers flexible payment options for special events.
<UpgradeRules>
<Rule ConvertRemainingTime="false" ConversionRate="0" AllowDowngrade="false" />
</UpgradeRules>
Players lose remaining time when upgrading. This encourages players to wait until their VIP expires before upgrading.
Common Issues#
Dependencies#
| Depends On | Purpose |
|---|---|
| JoinServer | Stores VIP tier and expiration date in account table |
| DataServer | Deducts currency from account balance |
| ServerInfo.txt | Actual rate multipliers for VIP bonuses |
Related Configuration#
- ServerInfo.txt - VIP rate multipliers (EXP, Drop, Zen)
- CashShop - WCoin/WPCoin management
- Move/Gate configurations - VIP-only map access
- common.dat - shared GameServer identity used by the per-account-level gates
- command.dat - account-level multipliers applied to class command stats
- Item configuration - item identity used by Bonus display entries