346 lines
18 KiB
Go
346 lines
18 KiB
Go
package rules
|
|
|
|
import "errors"
|
|
|
|
// RuleCategory defines the major categories of rules in EQ2
|
|
type RuleCategory int32
|
|
|
|
const (
|
|
CategoryClient RuleCategory = 0 // Client-related rules
|
|
CategoryFaction RuleCategory = 1 // Faction system rules
|
|
CategoryGuild RuleCategory = 2 // Guild system rules
|
|
CategoryPlayer RuleCategory = 3 // Player-related rules
|
|
CategoryPVP RuleCategory = 4 // Player vs Player rules
|
|
CategoryCombat RuleCategory = 5 // Combat system rules
|
|
CategorySpawn RuleCategory = 6 // Spawn/NPC rules
|
|
CategoryUI RuleCategory = 7 // User interface rules
|
|
CategoryWorld RuleCategory = 8 // World/server rules
|
|
CategoryZone RuleCategory = 9 // Zone-specific rules
|
|
CategoryLoot RuleCategory = 10 // Loot system rules
|
|
CategorySpells RuleCategory = 11 // Spell system rules
|
|
CategoryExpansion RuleCategory = 12 // Expansion flags
|
|
CategoryDiscord RuleCategory = 13 // Discord integration
|
|
)
|
|
|
|
// RuleType defines specific rule types within categories
|
|
type RuleType int32
|
|
|
|
// CLIENT RULES
|
|
const (
|
|
ClientShowWelcomeScreen RuleType = 0 // Show welcome screen to new players
|
|
ClientGroupSpellsTimer RuleType = 1 // Group spells update timer
|
|
ClientQuestQueueTimer RuleType = 2 // Quest queue processing timer
|
|
)
|
|
|
|
// FACTION RULES
|
|
const (
|
|
FactionAllowBasedCombat RuleType = 0 // Allow faction-based combat
|
|
)
|
|
|
|
// GUILD RULES
|
|
const (
|
|
GuildMaxLevel RuleType = 0 // Maximum guild level
|
|
GuildMaxPlayers RuleType = 1 // Maximum guild members
|
|
)
|
|
|
|
// PLAYER RULES
|
|
const (
|
|
PlayerMaxLevel RuleType = 0 // Maximum player level
|
|
PlayerMaxLevelOverrideStatus RuleType = 1 // Status required to override max level
|
|
PlayerMaxPlayers RuleType = 2 // Maximum players on server
|
|
PlayerMaxPlayersOverrideStatus RuleType = 3 // Status required to override max players
|
|
PlayerVitalityAmount RuleType = 4 // Vitality bonus amount
|
|
PlayerVitalityFrequency RuleType = 5 // Vitality bonus frequency
|
|
PlayerMaxAA RuleType = 6 // Maximum total AA points
|
|
PlayerMaxClassAA RuleType = 7 // Maximum class AA points
|
|
PlayerMaxSubclassAA RuleType = 8 // Maximum subclass AA points
|
|
PlayerMaxShadowsAA RuleType = 9 // Maximum shadows AA points
|
|
PlayerMaxHeroicAA RuleType = 10 // Maximum heroic AA points
|
|
PlayerMaxTradeskillAA RuleType = 11 // Maximum tradeskill AA points
|
|
PlayerMaxPrestigeAA RuleType = 12 // Maximum prestige AA points
|
|
PlayerMaxTradeskillPrestigeAA RuleType = 13 // Maximum tradeskill prestige AA points
|
|
PlayerMaxDragonAA RuleType = 14 // Maximum dragon AA points
|
|
PlayerMinLastNameLevel RuleType = 15 // Minimum level for last name
|
|
PlayerMaxLastNameLength RuleType = 16 // Maximum last name length
|
|
PlayerMinLastNameLength RuleType = 17 // Minimum last name length
|
|
PlayerDisableHouseAlignmentRequirement RuleType = 18 // Disable house alignment requirement
|
|
PlayerMentorItemDecayRate RuleType = 19 // Item decay rate when mentoring
|
|
PlayerTemporaryItemLogoutTime RuleType = 20 // Time for temporary items to decay
|
|
PlayerHeirloomItemShareExpiration RuleType = 21 // Heirloom item sharing expiration
|
|
PlayerSwimmingSkillMinSpeed RuleType = 22 // Minimum swimming speed
|
|
PlayerSwimmingSkillMaxSpeed RuleType = 23 // Maximum swimming speed
|
|
PlayerSwimmingSkillMinBreathLength RuleType = 24 // Minimum breath length
|
|
PlayerSwimmingSkillMaxBreathLength RuleType = 25 // Maximum breath length
|
|
PlayerAutoSkillUpBaseSkills RuleType = 26 // Auto-skill base skills on level
|
|
PlayerMaxWeightStrengthMultiplier RuleType = 27 // Strength multiplier for max weight
|
|
PlayerBaseWeight RuleType = 28 // Base weight for all classes
|
|
PlayerWeightPercentImpact RuleType = 29 // Speed impact per weight percent
|
|
PlayerWeightPercentCap RuleType = 30 // Maximum weight impact cap
|
|
PlayerCoinWeightPerStone RuleType = 31 // Coin weight per stone
|
|
PlayerWeightInflictsSpeed RuleType = 32 // Whether weight affects speed
|
|
PlayerLevelMasterySkillMultiplier RuleType = 33 // Level mastery skill multiplier
|
|
PlayerTraitTieringSelection RuleType = 34 // Trait tiering selection rules
|
|
PlayerClassicTraitLevelTable RuleType = 35 // Use classic trait level table
|
|
PlayerTraitFocusSelectLevel RuleType = 36 // Trait focus selection level
|
|
PlayerTraitTrainingSelectLevel RuleType = 37 // Trait training selection level
|
|
PlayerTraitRaceSelectLevel RuleType = 38 // Trait race selection level
|
|
PlayerTraitCharacterSelectLevel RuleType = 39 // Trait character selection level
|
|
PlayerStartHPBase RuleType = 40 // Starting HP base
|
|
PlayerStartPowerBase RuleType = 41 // Starting power base
|
|
PlayerStartHPLevelMod RuleType = 42 // HP level modifier
|
|
PlayerStartPowerLevelMod RuleType = 43 // Power level modifier
|
|
PlayerAllowEquipCombat RuleType = 44 // Allow equipment changes in combat
|
|
PlayerMaxTargetCommandDistance RuleType = 45 // Max distance for target command
|
|
PlayerMinSkillMultiplierValue RuleType = 46 // Min skill multiplier value
|
|
PlayerHarvestSkillUpMultiplier RuleType = 47 // Harvest skill up multiplier
|
|
PlayerMiniDingPercentage RuleType = 48 // Mini ding percentage
|
|
)
|
|
|
|
// PVP RULES
|
|
const (
|
|
PVPAllowPVP RuleType = 0 // Allow PVP combat
|
|
PVPLevelRange RuleType = 1 // PVP level range
|
|
PVPInvisPlayerDiscoveryRange RuleType = 2 // Invisible player discovery range
|
|
PVPMitigationModByLevel RuleType = 3 // PVP mitigation modifier by level
|
|
PVPType RuleType = 4 // PVP type (FFA, alignment, etc.)
|
|
)
|
|
|
|
// COMBAT RULES
|
|
const (
|
|
CombatMaxRange RuleType = 0 // Maximum combat range
|
|
CombatDeathExperienceDebt RuleType = 1 // Experience debt on death
|
|
CombatGroupExperienceDebt RuleType = 2 // Share debt with group
|
|
CombatPVPDeathExperienceDebt RuleType = 3 // PVP death experience debt
|
|
CombatExperienceToDebt RuleType = 4 // Percentage of experience to debt
|
|
CombatExperienceDebtRecoveryPercent RuleType = 5 // Debt recovery percentage
|
|
CombatExperienceDebtRecoveryPeriod RuleType = 6 // Debt recovery period
|
|
CombatEnableSpiritShards RuleType = 7 // Enable spirit shards
|
|
CombatSpiritShardSpawnScript RuleType = 8 // Spirit shard spawn script
|
|
CombatShardDebtRecoveryPercent RuleType = 9 // Shard debt recovery percentage
|
|
CombatShardRecoveryByRadius RuleType = 10 // Shard recovery by radius
|
|
CombatShardLifetime RuleType = 11 // Shard lifetime
|
|
CombatEffectiveMitigationCapLevel RuleType = 12 // Effective mitigation cap level
|
|
CombatCalculatedMitigationCapLevel RuleType = 13 // Calculated mitigation cap level
|
|
CombatMitigationLevelEffectivenessMax RuleType = 14 // Max mitigation effectiveness
|
|
CombatMitigationLevelEffectivenessMin RuleType = 15 // Min mitigation effectiveness
|
|
CombatMaxMitigationAllowed RuleType = 16 // Max mitigation allowed PVE
|
|
CombatMaxMitigationAllowedPVP RuleType = 17 // Max mitigation allowed PVP
|
|
CombatStrengthNPC RuleType = 18 // NPC strength multiplier
|
|
CombatStrengthOther RuleType = 19 // Other strength multiplier
|
|
CombatMaxSkillBonusByLevel RuleType = 20 // Max skill bonus by level
|
|
CombatLockedEncounterNoAttack RuleType = 21 // Locked encounter no attack
|
|
CombatMaxChaseDistance RuleType = 22 // Maximum chase distance
|
|
)
|
|
|
|
// SPAWN RULES
|
|
const (
|
|
SpawnSpeedMultiplier RuleType = 0 // Speed multiplier
|
|
SpawnClassicRegen RuleType = 1 // Use classic regeneration
|
|
SpawnHailMovementPause RuleType = 2 // Hail movement pause time
|
|
SpawnHailDistance RuleType = 3 // Hail distance
|
|
SpawnUseHardCodeWaterModelType RuleType = 4 // Use hardcoded water model type
|
|
SpawnUseHardCodeFlyingModelType RuleType = 5 // Use hardcoded flying model type
|
|
)
|
|
|
|
// UI RULES
|
|
const (
|
|
UIMaxWhoResults RuleType = 0 // Maximum /who results
|
|
UIMaxWhoOverrideStatus RuleType = 1 // Status to override max /who results
|
|
)
|
|
|
|
// WORLD RULES
|
|
const (
|
|
WorldDefaultStartingZoneID RuleType = 0 // Default starting zone ID
|
|
WorldEnablePOIDiscovery RuleType = 1 // Enable POI discovery
|
|
WorldGamblingTokenItemID RuleType = 2 // Gambling token item ID
|
|
WorldGuildAutoJoin RuleType = 3 // Auto join guild
|
|
WorldGuildAutoJoinID RuleType = 4 // Auto join guild ID
|
|
WorldGuildAutoJoinDefaultRankID RuleType = 5 // Auto join default rank ID
|
|
WorldServerLocked RuleType = 6 // Server locked
|
|
WorldServerLockedOverrideStatus RuleType = 7 // Server locked override status
|
|
WorldSyncZonesWithLogin RuleType = 8 // Sync zones with login
|
|
WorldSyncEquipWithLogin RuleType = 9 // Sync equipment with login
|
|
WorldUseBannedIPsTable RuleType = 10 // Use banned IPs table
|
|
WorldLinkDeadTimer RuleType = 11 // Link dead timer
|
|
WorldRemoveDisconnectedClientsTimer RuleType = 12 // Remove disconnected clients timer
|
|
WorldPlayerCampTimer RuleType = 13 // Player camp timer
|
|
WorldGMCampTimer RuleType = 14 // GM camp timer
|
|
WorldAutoAdminPlayers RuleType = 15 // Auto admin players
|
|
WorldAutoAdminGMs RuleType = 16 // Auto admin GMs
|
|
WorldAutoAdminStatusValue RuleType = 17 // Auto admin status value
|
|
WorldDuskTime RuleType = 18 // Dusk time
|
|
WorldDawnTime RuleType = 19 // Dawn time
|
|
WorldThreadedLoad RuleType = 20 // Threaded loading
|
|
WorldTradeskillSuccessChance RuleType = 21 // Tradeskill success chance
|
|
WorldTradeskillCritSuccessChance RuleType = 22 // Tradeskill critical success chance
|
|
WorldTradeskillFailChance RuleType = 23 // Tradeskill fail chance
|
|
WorldTradeskillCritFailChance RuleType = 24 // Tradeskill critical fail chance
|
|
WorldTradeskillEventChance RuleType = 25 // Tradeskill event chance
|
|
WorldEditorURL RuleType = 26 // Editor URL
|
|
WorldEditorIncludeID RuleType = 27 // Editor include ID
|
|
WorldEditorOfficialServer RuleType = 28 // Editor official server
|
|
WorldSavePaperdollImage RuleType = 29 // Save paperdoll image
|
|
WorldSaveHeadshotImage RuleType = 30 // Save headshot image
|
|
WorldSendPaperdollImagesToLogin RuleType = 31 // Send paperdoll images to login
|
|
WorldTreasureChestDisabled RuleType = 32 // Treasure chest disabled
|
|
WorldStartingZoneLanguages RuleType = 33 // Starting zone languages
|
|
WorldStartingZoneRuleFlag RuleType = 34 // Starting zone rule flag
|
|
WorldEnforceRacialAlignment RuleType = 35 // Enforce racial alignment
|
|
WorldMemoryCacheZoneMaps RuleType = 36 // Memory cache zone maps
|
|
WorldAutoLockEncounter RuleType = 37 // Auto lock encounter
|
|
WorldDisplayItemTiers RuleType = 38 // Display item tiers
|
|
WorldLoreAndLegendAccept RuleType = 39 // Lore and legend accept
|
|
)
|
|
|
|
// ZONE RULES
|
|
const (
|
|
ZoneMinLevelOverrideStatus RuleType = 0 // Min level override status
|
|
ZoneMinAccessOverrideStatus RuleType = 1 // Min access override status
|
|
ZoneXPMultiplier RuleType = 2 // Experience multiplier
|
|
ZoneTSXPMultiplier RuleType = 3 // Tradeskill experience multiplier
|
|
ZoneWeatherEnabled RuleType = 4 // Weather enabled
|
|
ZoneWeatherType RuleType = 5 // Weather type
|
|
ZoneMinWeatherSeverity RuleType = 6 // Min weather severity
|
|
ZoneMaxWeatherSeverity RuleType = 7 // Max weather severity
|
|
ZoneWeatherChangeFrequency RuleType = 8 // Weather change frequency
|
|
ZoneWeatherChangePerInterval RuleType = 9 // Weather change per interval
|
|
ZoneWeatherDynamicMaxOffset RuleType = 10 // Weather dynamic max offset
|
|
ZoneWeatherChangeChance RuleType = 11 // Weather change chance
|
|
ZoneSpawnUpdateTimer RuleType = 12 // Spawn update timer
|
|
ZoneCheckAttackPlayer RuleType = 13 // Check attack player
|
|
ZoneCheckAttackNPC RuleType = 14 // Check attack NPC
|
|
ZoneHOTime RuleType = 15 // Heroic opportunity time
|
|
ZoneUseMapUnderworldCoords RuleType = 16 // Use map underworld coords
|
|
ZoneMapUnderworldCoordOffset RuleType = 17 // Map underworld coord offset
|
|
ZoneSharedMaxPlayers RuleType = 18 // Shared zone max players
|
|
ZoneRegenTimer RuleType = 19 // Regeneration timer
|
|
ZoneClientSaveTimer RuleType = 20 // Client save timer
|
|
ZoneShutdownDelayTimer RuleType = 21 // Shutdown delay timer
|
|
ZoneWeatherTimer RuleType = 22 // Weather timer
|
|
ZoneSpawnDeleteTimer RuleType = 23 // Spawn delete timer
|
|
)
|
|
|
|
// LOOT RULES
|
|
const (
|
|
LootRadius RuleType = 0 // Loot pickup radius
|
|
LootAutoDisarmChest RuleType = 1 // Auto disarm chest
|
|
LootChestTriggerRadiusGroup RuleType = 2 // Chest trigger radius group
|
|
LootChestUnlockedTimeDrop RuleType = 3 // Chest unlocked time drop
|
|
LootAllowChestUnlockByDropTime RuleType = 4 // Allow chest unlock by drop time
|
|
LootChestUnlockedTimeTrap RuleType = 5 // Chest unlocked time trap
|
|
LootAllowChestUnlockByTrapTime RuleType = 6 // Allow chest unlock by trap time
|
|
LootSkipGrayMob RuleType = 7 // Skip loot from gray mobs
|
|
LootDistributionTime RuleType = 8 // Loot distribution time
|
|
)
|
|
|
|
// SPELLS RULES
|
|
const (
|
|
SpellsNoInterruptBaseChance RuleType = 0 // No interrupt base chance
|
|
SpellsEnableFizzleSpells RuleType = 1 // Enable fizzle spells
|
|
SpellsDefaultFizzleChance RuleType = 2 // Default fizzle chance
|
|
SpellsFizzleMaxSkill RuleType = 3 // Fizzle max skill
|
|
SpellsFizzleDefaultSkill RuleType = 4 // Fizzle default skill
|
|
SpellsEnableCrossZoneGroupBuffs RuleType = 5 // Enable cross zone group buffs
|
|
SpellsEnableCrossZoneTargetBuffs RuleType = 6 // Enable cross zone target buffs
|
|
SpellsPlayerSpellSaveStateWaitInterval RuleType = 7 // Player spell save state wait interval
|
|
SpellsPlayerSpellSaveStateCap RuleType = 8 // Player spell save state cap
|
|
SpellsRequirePreviousTierScribe RuleType = 9 // Require previous tier scribe
|
|
SpellsCureSpellID RuleType = 10 // Cure spell ID
|
|
SpellsCureCurseSpellID RuleType = 11 // Cure curse spell ID
|
|
SpellsCureNoxiousSpellID RuleType = 12 // Cure noxious spell ID
|
|
SpellsCureMagicSpellID RuleType = 13 // Cure magic spell ID
|
|
SpellsCureTraumaSpellID RuleType = 14 // Cure trauma spell ID
|
|
SpellsCureArcaneSpellID RuleType = 15 // Cure arcane spell ID
|
|
SpellsMinistrationSkillID RuleType = 16 // Ministration skill ID
|
|
SpellsMinistrationPowerReductionMax RuleType = 17 // Ministration power reduction max
|
|
SpellsMinistrationPowerReductionSkill RuleType = 18 // Ministration power reduction skill
|
|
SpellsMasterSkillReduceSpellResist RuleType = 19 // Master skill reduce spell resist
|
|
SpellsUseClassicSpellLevel RuleType = 20 // Use classic spell level
|
|
)
|
|
|
|
// EXPANSION RULES
|
|
const (
|
|
ExpansionGlobalFlag RuleType = 0 // Global expansion flag
|
|
ExpansionHolidayFlag RuleType = 1 // Global holiday flag
|
|
)
|
|
|
|
// DISCORD RULES
|
|
const (
|
|
DiscordEnabled RuleType = 0 // Discord enabled
|
|
DiscordWebhookURL RuleType = 1 // Discord webhook URL
|
|
DiscordBotToken RuleType = 2 // Discord bot token
|
|
DiscordChannel RuleType = 3 // Discord channel
|
|
DiscordListenChan RuleType = 4 // Discord listen channel
|
|
)
|
|
|
|
// Rule validation constants
|
|
const (
|
|
MaxRuleValueLength = 1024 // Maximum rule value length
|
|
MaxRuleCombinedLength = 2048 // Maximum combined rule string length
|
|
MaxRuleNameLength = 64 // Maximum rule name length
|
|
)
|
|
|
|
// Database constants
|
|
const (
|
|
TableRuleSets = "rulesets"
|
|
TableRuleSetDetails = "ruleset_details"
|
|
TableVariables = "variables"
|
|
DefaultRuleSetIDVar = "default_ruleset_id"
|
|
)
|
|
|
|
// Error variables
|
|
var (
|
|
ErrRuleNotFound = errors.New("rule not found")
|
|
ErrRuleSetNotFound = errors.New("rule set not found")
|
|
ErrInvalidRuleCategory = errors.New("invalid rule category")
|
|
ErrInvalidRuleType = errors.New("invalid rule type")
|
|
ErrInvalidRuleValue = errors.New("invalid rule value")
|
|
ErrDuplicateRuleSet = errors.New("duplicate rule set")
|
|
ErrRuleSetNotActive = errors.New("rule set not active")
|
|
ErrGlobalRuleSetNotSet = errors.New("global rule set not set")
|
|
ErrZoneRuleSetNotFound = errors.New("zone rule set not found")
|
|
ErrRuleValueTooLong = errors.New("rule value too long")
|
|
ErrRuleNameTooLong = errors.New("rule name too long")
|
|
)
|
|
|
|
// Rule category names for string conversion
|
|
var CategoryNames = map[RuleCategory]string{
|
|
CategoryClient: "Client",
|
|
CategoryFaction: "Faction",
|
|
CategoryGuild: "Guild",
|
|
CategoryPlayer: "Player",
|
|
CategoryPVP: "PVP",
|
|
CategoryCombat: "Combat",
|
|
CategorySpawn: "Spawn",
|
|
CategoryUI: "UI",
|
|
CategoryWorld: "World",
|
|
CategoryZone: "Zone",
|
|
CategoryLoot: "Loot",
|
|
CategorySpells: "Spells",
|
|
CategoryExpansion: "Expansion",
|
|
CategoryDiscord: "Discord",
|
|
}
|
|
|
|
// Reverse mapping for category name lookup
|
|
var CategoryByName = make(map[string]RuleCategory)
|
|
|
|
func init() {
|
|
// Initialize reverse category mapping
|
|
for category, name := range CategoryNames {
|
|
CategoryByName[name] = category
|
|
}
|
|
}
|
|
|
|
// GetCategoryName returns the string name for a rule category
|
|
func GetCategoryName(category RuleCategory) string {
|
|
if name, exists := CategoryNames[category]; exists {
|
|
return name
|
|
}
|
|
return "Unknown"
|
|
}
|
|
|
|
// GetCategoryByName returns the rule category for a string name
|
|
func GetCategoryByName(name string) (RuleCategory, bool) {
|
|
category, exists := CategoryByName[name]
|
|
return category, exists
|
|
} |