package packets import ( "fmt" "sync" ) // InternalOpcode represents the internal opcode enumeration type InternalOpcode int32 // Internal opcode constants - these map to the C++ EmuOpcode enum const ( OP_Unknown InternalOpcode = iota // Login server specific opcodes (from C++ LoginServer) OP_Login2 OP_GetLoginInfo OP_LoginInfo OP_SessionId OP_SessionKey OP_Disconnect OP_AllFinish OP_Ack5 OP_SendServersFragment OP_ServerList OP_RequestServerStatus OP_SendServerStatus OP_Version OP_LoginBanner OP_PlayCharacterRequest OP_CharacterList OP_CharacterCreate OP_CharacterDelete // Login and authentication operations OP_LoginReplyMsg OP_LoginByNumRequestMsg OP_WSLoginRequestMsg // Server initialization and zone management OP_ESInitMsg OP_ESReadyForClientsMsg OP_CreateZoneInstanceMsg OP_ZoneInstanceCreateReplyMsg OP_ZoneInstanceDestroyedMsg OP_ExpectClientAsCharacterRequest OP_ExpectClientAsCharacterReplyMs OP_ZoneInfoMsg // Character creation and loading OP_CreateCharacterRequestMsg OP_DoneLoadingZoneResourcesMsg OP_DoneSendingInitialEntitiesMsg OP_DoneLoadingEntityResourcesMsg OP_DoneLoadingUIResourcesMsg // Game state updates OP_PredictionUpdateMsg OP_RemoteCmdMsg OP_SetRemoteCmdsMsg OP_GameWorldTimeMsg OP_MOTDMsg OP_ZoneMOTDMsg // Command dispatching OP_ClientCmdMsg OP_DispatchClientCmdMsg OP_DispatchESMsg // Character sheet and inventory updates OP_UpdateCharacterSheetMsg OP_UpdateSpellBookMsg OP_UpdateInventoryMsg OP_CharacterPet OP_UpdateRaidMsg OP_CharacterCurrency // Zone transitions OP_ChangeZoneMsg OP_ClientTeleportRequestMsg OP_TeleportWithinZoneMsg OP_ReadyToZoneMsg // Chat system OP_ChatTellChannelMsg OP_ChatTellUserMsg // Position updates OP_UpdatePositionMsg // Achievement system OP_AchievementUpdateMsg OP_CharacterAchievements // Faction system OP_FactionUpdateMsg // Title system OP_TitleUpdateMsg OP_CharacterTitles OP_SetActiveTitleMsg OP_UpdateTitleCmd // NPC system OP_NPCAttackMsg OP_NPCTargetMsg OP_NPCInfoMsg OP_NPCSpellCastMsg OP_NPCMovementMsg // Item system OP_ItemMoveMsg OP_ItemEquipMsg OP_ItemUnequipMsg OP_ItemPickupMsg OP_ItemDropMsg OP_ItemExamineMsg OP_ItemUpdateMsg // Recipe and crafting system OP_UpdateRecipeBookMsg OP_RequestRecipeDetailsMsg OP_RecipeDetailsMsg OP_ShowCreateFromRecipeUIMsg OP_CancelCreateFromRecipeMsg OP_ShowRecipeBookMsg OP_RecipeList OP_RecipeBook OP_RecipeListUnknown // Skills system OP_UpdateSkillBookMsg OP_UpdateSkillsMsg OP_PopulateSkillMapsMsg OP_SkillInfoRequest OP_SkillInfoResponse OP_TradeskillList // Tradeskill/Crafting system OP_CreateFromRecipe OP_ItemCreationUI OP_StopCrafting OP_CounterReaction OP_UpdateCreateItem OP_TradeskillEventTriggered OP_CraftingResults OP_UpdateCraftingUI OP_SendCreateFromRecipe // Traits system OP_TraitsList OP_TraitRewardPackMsg OP_SelectTraits OP_UpdateTraits // Transmutation system OP_EqTargetItemCmd OP_ChoiceWindow OP_QuestComplete OP_TransmuteItem // Trade system OP_TradeRequestMsg OP_TradeRequestReplyMsg OP_TradeAcceptMsg OP_TradeCancelMsg OP_TradeCompleteMsg OP_UpdateTradeMsg OP_AddItemToTradeMsg OP_RemoveItemFromTradeMsg OP_TradeCoinUpdate // Sign and widget system OP_EqCreateSignWidgetCmd OP_EqUpdateSignWidgetCmd OP_SignalMsg // Widget system OP_UpdateWidgetCmd OP_WidgetTimerUpdate OP_WidgetCloseCmd // Spawn and object system OP_TintWidgetsMsg OP_MoveableObjectPlacementCriteri OP_EnterMoveObjectModeMsg OP_PositionMoveableObject OP_CancelMoveObjectModeMsg // Spell system OP_RemoveSpellEffectMsg OP_DispatchSpellCmdMsg OP_SpellGainedMsg OP_CancelSpellCast OP_AfterInvSpellUpdate OP_EqHearSpellCastCmd OP_EqHearSpellInterruptCmd OP_EqHearSpellFizzleCmd OP_EqHearSpellNoLandCmd OP_EqHearChainEffectCmd OP_EqDisplaySpellFailCmd OP_EqSpellCastStartCmd OP_EqSpellCastEndCmd OP_EqSpellMoveToRangeAndRetryCmd // EverQuest specific commands - Core OP_EqHearChatCmd OP_EqDisplayTextCmd OP_EqCreateGhostCmd OP_EqCreateWidgetCmd OP_EqDestroyGhostCmd OP_EqUpdateGhostCmd OP_EqSetControlGhostCmd OP_EqSetPOVGhostCmd // Alt Advancement opcodes OP_AdventureList OP_AdvancementRequestMsg OP_CommitAATemplate OP_ExamineAASpellInfo // Appearance system opcodes OP_DressingRoom OP_ReskinCharacterRequestMsg // Chat system opcodes (additional ones beyond existing) OP_ChatRelationshipUpdateMsg OP_ChatCreateChannelMsg OP_ChatJoinChannelMsg OP_ChatWhoChannelMsg OP_ChatLeaveChannelMsg OP_ChatToggleFriendMsg OP_ChatToggleIgnoreMsg OP_ChatSendFriendsMsg OP_ChatSendIgnoresMsg OP_ChatFiltersMsg OP_EqChatChannelUpdateCmd // Collection system opcodes OP_EqCollectionUpdateCmd OP_EqCollectionFilterCmd OP_EqCollectionItemCmd // Entity system opcodes (additional ones beyond existing) OP_EntityVerbsRequestMsg OP_EntityVerbsReplyMsg OP_EntityVerbsVerbMsg // Group system opcodes OP_GroupUpdateMsg OP_RaidUpdateMsg OP_GroupInviteMsg OP_GroupDeclineMsg OP_GroupChatMsg OP_GroupMessageMsg OP_GroupOptionsMsg OP_DefaultGroupOptionsMsg OP_DefaultGroupOptionsRequestMsg // Guild system opcodes OP_GuildUpdateMsg OP_GuildEventListMsg OP_GuildEventDetailsMsg OP_GuildEventAddMsg OP_GuildMembershipResponseMsg OP_JoinGuildNotifyMsg OP_LeaveGuildNotifyMsg OP_GuildInviteMsg OP_GuildDeclineMsg OP_GuildRecruitingMsg OP_GuildRecruitingDetailsMsg OP_ModifyGuildMsg OP_RequestGuildInfoMsg // Quest system opcodes OP_QuestJournalOpenMsg OP_QuestJournalInspectMsg OP_QuestJournalSetVisibleMsg OP_QuestJournalWaypointMsg OP_QuestReward OP_OfferQuestMsg OP_EqQuestJournalUpdateCmd OP_EqQuestJournalReplyCmd OP_EqQuestGroupCmd OP_JournalQuestStoryline OP_QuestionnaireMsg // Heroic Opportunity system opcodes OP_HeroicOpportunityMsg OP_HeroicOpportunityStartMsg OP_HeroicOpportunityCompleteMsg OP_HeroicOpportunityTimerMsg OP_HeroicOpportunityWheelMsg OP_HeroicOpportunityProgressMsg OP_HeroicOpportunityErrorMsg OP_HeroicOpportunityShiftMsg // Combat system opcodes OP_CombatLogDataMsg OP_OutgoingAttackMsg OP_IncomingAttackMsg OP_CombatMitigationMsg OP_WeaponReadyMsg OP_CombatDamageMsg OP_CombatHealMsg OP_CombatInterruptMsg OP_PVPKillMsg OP_HateThreatUpdateMsg OP_CombatSessionUpdateMsg // Add more opcodes as needed... _maxInternalOpcode // Sentinel value ) // OpcodeNames maps internal opcodes to their string names for debugging var OpcodeNames = map[InternalOpcode]string{ OP_Unknown: "OP_Unknown", // Login server opcodes OP_Login2: "OP_Login2", OP_GetLoginInfo: "OP_GetLoginInfo", OP_LoginInfo: "OP_LoginInfo", OP_SessionId: "OP_SessionId", OP_SessionKey: "OP_SessionKey", OP_Disconnect: "OP_Disconnect", OP_AllFinish: "OP_AllFinish", OP_Ack5: "OP_Ack5", OP_SendServersFragment: "OP_SendServersFragment", OP_ServerList: "OP_ServerList", OP_RequestServerStatus: "OP_RequestServerStatus", OP_SendServerStatus: "OP_SendServerStatus", OP_Version: "OP_Version", OP_LoginBanner: "OP_LoginBanner", OP_PlayCharacterRequest: "OP_PlayCharacterRequest", OP_CharacterList: "OP_CharacterList", OP_CharacterCreate: "OP_CharacterCreate", OP_CharacterDelete: "OP_CharacterDelete", OP_LoginReplyMsg: "OP_LoginReplyMsg", OP_LoginByNumRequestMsg: "OP_LoginByNumRequestMsg", OP_WSLoginRequestMsg: "OP_WSLoginRequestMsg", OP_ESInitMsg: "OP_ESInitMsg", OP_ESReadyForClientsMsg: "OP_ESReadyForClientsMsg", OP_CreateZoneInstanceMsg: "OP_CreateZoneInstanceMsg", OP_ZoneInstanceCreateReplyMsg: "OP_ZoneInstanceCreateReplyMsg", OP_ZoneInstanceDestroyedMsg: "OP_ZoneInstanceDestroyedMsg", OP_ExpectClientAsCharacterRequest: "OP_ExpectClientAsCharacterRequest", OP_ExpectClientAsCharacterReplyMs: "OP_ExpectClientAsCharacterReplyMs", OP_ZoneInfoMsg: "OP_ZoneInfoMsg", OP_CreateCharacterRequestMsg: "OP_CreateCharacterRequestMsg", OP_DoneLoadingZoneResourcesMsg: "OP_DoneLoadingZoneResourcesMsg", OP_DoneSendingInitialEntitiesMsg: "OP_DoneSendingInitialEntitiesMsg", OP_DoneLoadingEntityResourcesMsg: "OP_DoneLoadingEntityResourcesMsg", OP_DoneLoadingUIResourcesMsg: "OP_DoneLoadingUIResourcesMsg", OP_PredictionUpdateMsg: "OP_PredictionUpdateMsg", OP_RemoteCmdMsg: "OP_RemoteCmdMsg", OP_SetRemoteCmdsMsg: "OP_SetRemoteCmdsMsg", OP_GameWorldTimeMsg: "OP_GameWorldTimeMsg", OP_MOTDMsg: "OP_MOTDMsg", OP_ZoneMOTDMsg: "OP_ZoneMOTDMsg", OP_ClientCmdMsg: "OP_ClientCmdMsg", OP_DispatchClientCmdMsg: "OP_DispatchClientCmdMsg", OP_DispatchESMsg: "OP_DispatchESMsg", OP_UpdateCharacterSheetMsg: "OP_UpdateCharacterSheetMsg", OP_UpdateSpellBookMsg: "OP_UpdateSpellBookMsg", OP_UpdateInventoryMsg: "OP_UpdateInventoryMsg", OP_ChangeZoneMsg: "OP_ChangeZoneMsg", OP_ClientTeleportRequestMsg: "OP_ClientTeleportRequestMsg", OP_TeleportWithinZoneMsg: "OP_TeleportWithinZoneMsg", OP_ReadyToZoneMsg: "OP_ReadyToZoneMsg", OP_ChatTellChannelMsg: "OP_ChatTellChannelMsg", OP_ChatTellUserMsg: "OP_ChatTellUserMsg", OP_UpdatePositionMsg: "OP_UpdatePositionMsg", OP_AchievementUpdateMsg: "OP_AchievementUpdateMsg", OP_CharacterAchievements: "OP_CharacterAchievements", OP_FactionUpdateMsg: "OP_FactionUpdateMsg", OP_TitleUpdateMsg: "OP_TitleUpdateMsg", OP_CharacterTitles: "OP_CharacterTitles", OP_SetActiveTitleMsg: "OP_SetActiveTitleMsg", OP_UpdateTitleCmd: "OP_UpdateTitleCmd", OP_NPCAttackMsg: "OP_NPCAttackMsg", OP_NPCTargetMsg: "OP_NPCTargetMsg", OP_NPCInfoMsg: "OP_NPCInfoMsg", OP_NPCSpellCastMsg: "OP_NPCSpellCastMsg", OP_NPCMovementMsg: "OP_NPCMovementMsg", OP_ItemMoveMsg: "OP_ItemMoveMsg", OP_ItemEquipMsg: "OP_ItemEquipMsg", OP_ItemUnequipMsg: "OP_ItemUnequipMsg", OP_ItemPickupMsg: "OP_ItemPickupMsg", OP_ItemDropMsg: "OP_ItemDropMsg", OP_ItemExamineMsg: "OP_ItemExamineMsg", OP_ItemUpdateMsg: "OP_ItemUpdateMsg", // Recipe and crafting system opcodes OP_UpdateRecipeBookMsg: "OP_UpdateRecipeBookMsg", OP_RequestRecipeDetailsMsg: "OP_RequestRecipeDetailsMsg", OP_RecipeDetailsMsg: "OP_RecipeDetailsMsg", OP_ShowCreateFromRecipeUIMsg: "OP_ShowCreateFromRecipeUIMsg", OP_CancelCreateFromRecipeMsg: "OP_CancelCreateFromRecipeMsg", OP_ShowRecipeBookMsg: "OP_ShowRecipeBookMsg", OP_RecipeList: "OP_RecipeList", OP_RecipeBook: "OP_RecipeBook", OP_RecipeListUnknown: "OP_RecipeListUnknown", // Skills system opcodes OP_UpdateSkillBookMsg: "OP_UpdateSkillBookMsg", OP_UpdateSkillsMsg: "OP_UpdateSkillsMsg", OP_PopulateSkillMapsMsg: "OP_PopulateSkillMapsMsg", OP_SkillInfoRequest: "OP_SkillInfoRequest", OP_SkillInfoResponse: "OP_SkillInfoResponse", OP_TradeskillList: "OP_TradeskillList", // Tradeskill/Crafting system opcodes OP_CreateFromRecipe: "OP_CreateFromRecipe", OP_ItemCreationUI: "OP_ItemCreationUI", OP_StopCrafting: "OP_StopCrafting", OP_CounterReaction: "OP_CounterReaction", OP_UpdateCreateItem: "OP_UpdateCreateItem", OP_TradeskillEventTriggered: "OP_TradeskillEventTriggered", OP_CraftingResults: "OP_CraftingResults", OP_UpdateCraftingUI: "OP_UpdateCraftingUI", OP_SendCreateFromRecipe: "OP_SendCreateFromRecipe", // Traits system opcodes OP_TraitsList: "OP_TraitsList", OP_TraitRewardPackMsg: "OP_TraitRewardPackMsg", OP_SelectTraits: "OP_SelectTraits", OP_UpdateTraits: "OP_UpdateTraits", // Transmutation system opcodes OP_EqTargetItemCmd: "OP_EqTargetItemCmd", OP_ChoiceWindow: "OP_ChoiceWindow", OP_QuestComplete: "OP_QuestComplete", OP_TransmuteItem: "OP_TransmuteItem", // Trade system opcodes OP_TradeRequestMsg: "OP_TradeRequestMsg", OP_TradeRequestReplyMsg: "OP_TradeRequestReplyMsg", OP_TradeAcceptMsg: "OP_TradeAcceptMsg", OP_TradeCancelMsg: "OP_TradeCancelMsg", OP_TradeCompleteMsg: "OP_TradeCompleteMsg", OP_UpdateTradeMsg: "OP_UpdateTradeMsg", OP_AddItemToTradeMsg: "OP_AddItemToTradeMsg", OP_RemoveItemFromTradeMsg: "OP_RemoveItemFromTradeMsg", OP_TradeCoinUpdate: "OP_TradeCoinUpdate", // Sign and widget system opcodes OP_EqCreateSignWidgetCmd: "OP_EqCreateSignWidgetCmd", OP_EqUpdateSignWidgetCmd: "OP_EqUpdateSignWidgetCmd", OP_SignalMsg: "OP_SignalMsg", // Widget system opcodes OP_UpdateWidgetCmd: "OP_UpdateWidgetCmd", OP_WidgetTimerUpdate: "OP_WidgetTimerUpdate", OP_WidgetCloseCmd: "OP_WidgetCloseCmd", // Spawn and object system opcodes OP_TintWidgetsMsg: "OP_TintWidgetsMsg", OP_MoveableObjectPlacementCriteri: "OP_MoveableObjectPlacementCriteri", OP_EnterMoveObjectModeMsg: "OP_EnterMoveObjectModeMsg", OP_PositionMoveableObject: "OP_PositionMoveableObject", OP_CancelMoveObjectModeMsg: "OP_CancelMoveObjectModeMsg", // Spell system opcodes OP_RemoveSpellEffectMsg: "OP_RemoveSpellEffectMsg", OP_DispatchSpellCmdMsg: "OP_DispatchSpellCmdMsg", OP_SpellGainedMsg: "OP_SpellGainedMsg", OP_CancelSpellCast: "OP_CancelSpellCast", OP_AfterInvSpellUpdate: "OP_AfterInvSpellUpdate", OP_EqHearSpellCastCmd: "OP_EqHearSpellCastCmd", OP_EqHearSpellInterruptCmd: "OP_EqHearSpellInterruptCmd", OP_EqHearSpellFizzleCmd: "OP_EqHearSpellFizzleCmd", OP_EqHearSpellNoLandCmd: "OP_EqHearSpellNoLandCmd", OP_EqHearChainEffectCmd: "OP_EqHearChainEffectCmd", OP_EqDisplaySpellFailCmd: "OP_EqDisplaySpellFailCmd", OP_EqSpellCastStartCmd: "OP_EqSpellCastStartCmd", OP_EqSpellCastEndCmd: "OP_EqSpellCastEndCmd", OP_EqSpellMoveToRangeAndRetryCmd: "OP_EqSpellMoveToRangeAndRetryCmd", OP_EqHearChatCmd: "OP_EqHearChatCmd", OP_EqDisplayTextCmd: "OP_EqDisplayTextCmd", OP_EqCreateGhostCmd: "OP_EqCreateGhostCmd", OP_EqCreateWidgetCmd: "OP_EqCreateWidgetCmd", OP_EqDestroyGhostCmd: "OP_EqDestroyGhostCmd", OP_EqUpdateGhostCmd: "OP_EqUpdateGhostCmd", OP_EqSetControlGhostCmd: "OP_EqSetControlGhostCmd", OP_EqSetPOVGhostCmd: "OP_EqSetPOVGhostCmd", OP_AdventureList: "OP_AdventureList", OP_AdvancementRequestMsg: "OP_AdvancementRequestMsg", OP_CommitAATemplate: "OP_CommitAATemplate", OP_ExamineAASpellInfo: "OP_ExamineAASpellInfo", OP_DressingRoom: "OP_DressingRoom", OP_ReskinCharacterRequestMsg: "OP_ReskinCharacterRequestMsg", OP_ChatRelationshipUpdateMsg: "OP_ChatRelationshipUpdateMsg", OP_ChatCreateChannelMsg: "OP_ChatCreateChannelMsg", OP_ChatJoinChannelMsg: "OP_ChatJoinChannelMsg", OP_ChatWhoChannelMsg: "OP_ChatWhoChannelMsg", OP_ChatLeaveChannelMsg: "OP_ChatLeaveChannelMsg", OP_ChatToggleFriendMsg: "OP_ChatToggleFriendMsg", OP_ChatToggleIgnoreMsg: "OP_ChatToggleIgnoreMsg", OP_ChatSendFriendsMsg: "OP_ChatSendFriendsMsg", OP_ChatSendIgnoresMsg: "OP_ChatSendIgnoresMsg", OP_ChatFiltersMsg: "OP_ChatFiltersMsg", OP_EqChatChannelUpdateCmd: "OP_EqChatChannelUpdateCmd", // Collection system opcodes OP_EqCollectionUpdateCmd: "OP_EqCollectionUpdateCmd", OP_EqCollectionFilterCmd: "OP_EqCollectionFilterCmd", OP_EqCollectionItemCmd: "OP_EqCollectionItemCmd", // Entity system opcodes (additional ones beyond existing) OP_EntityVerbsRequestMsg: "OP_EntityVerbsRequestMsg", OP_EntityVerbsReplyMsg: "OP_EntityVerbsReplyMsg", OP_EntityVerbsVerbMsg: "OP_EntityVerbsVerbMsg", // Group system opcodes OP_GroupUpdateMsg: "OP_GroupUpdateMsg", OP_RaidUpdateMsg: "OP_RaidUpdateMsg", OP_GroupInviteMsg: "OP_GroupInviteMsg", OP_GroupDeclineMsg: "OP_GroupDeclineMsg", OP_GroupChatMsg: "OP_GroupChatMsg", OP_GroupMessageMsg: "OP_GroupMessageMsg", OP_GroupOptionsMsg: "OP_GroupOptionsMsg", OP_DefaultGroupOptionsMsg: "OP_DefaultGroupOptionsMsg", OP_DefaultGroupOptionsRequestMsg: "OP_DefaultGroupOptionsRequestMsg", // Guild system opcodes OP_GuildUpdateMsg: "OP_GuildUpdateMsg", OP_GuildEventListMsg: "OP_GuildEventListMsg", OP_GuildEventDetailsMsg: "OP_GuildEventDetailsMsg", OP_GuildEventAddMsg: "OP_GuildEventAddMsg", OP_GuildMembershipResponseMsg: "OP_GuildMembershipResponseMsg", OP_JoinGuildNotifyMsg: "OP_JoinGuildNotifyMsg", OP_LeaveGuildNotifyMsg: "OP_LeaveGuildNotifyMsg", OP_GuildInviteMsg: "OP_GuildInviteMsg", OP_GuildDeclineMsg: "OP_GuildDeclineMsg", OP_GuildRecruitingMsg: "OP_GuildRecruitingMsg", OP_GuildRecruitingDetailsMsg: "OP_GuildRecruitingDetailsMsg", OP_ModifyGuildMsg: "OP_ModifyGuildMsg", OP_RequestGuildInfoMsg: "OP_RequestGuildInfoMsg", // Quest system opcodes OP_QuestJournalOpenMsg: "OP_QuestJournalOpenMsg", OP_QuestJournalInspectMsg: "OP_QuestJournalInspectMsg", OP_QuestJournalSetVisibleMsg: "OP_QuestJournalSetVisibleMsg", OP_QuestJournalWaypointMsg: "OP_QuestJournalWaypointMsg", OP_QuestReward: "OP_QuestReward", OP_OfferQuestMsg: "OP_OfferQuestMsg", OP_EqQuestJournalUpdateCmd: "OP_EqQuestJournalUpdateCmd", OP_EqQuestJournalReplyCmd: "OP_EqQuestJournalReplyCmd", OP_EqQuestGroupCmd: "OP_EqQuestGroupCmd", OP_JournalQuestStoryline: "OP_JournalQuestStoryline", OP_QuestionnaireMsg: "OP_QuestionnaireMsg", // Heroic Opportunity system opcodes OP_HeroicOpportunityMsg: "OP_HeroicOpportunityMsg", OP_HeroicOpportunityStartMsg: "OP_HeroicOpportunityStartMsg", OP_HeroicOpportunityCompleteMsg: "OP_HeroicOpportunityCompleteMsg", OP_HeroicOpportunityTimerMsg: "OP_HeroicOpportunityTimerMsg", OP_HeroicOpportunityWheelMsg: "OP_HeroicOpportunityWheelMsg", OP_HeroicOpportunityProgressMsg: "OP_HeroicOpportunityProgressMsg", OP_HeroicOpportunityErrorMsg: "OP_HeroicOpportunityErrorMsg", OP_HeroicOpportunityShiftMsg: "OP_HeroicOpportunityShiftMsg", // Combat system opcodes OP_CombatLogDataMsg: "OP_CombatLogDataMsg", OP_OutgoingAttackMsg: "OP_OutgoingAttackMsg", OP_IncomingAttackMsg: "OP_IncomingAttackMsg", OP_CombatMitigationMsg: "OP_CombatMitigationMsg", OP_WeaponReadyMsg: "OP_WeaponReadyMsg", OP_CombatDamageMsg: "OP_CombatDamageMsg", OP_CombatHealMsg: "OP_CombatHealMsg", OP_CombatInterruptMsg: "OP_CombatInterruptMsg", OP_PVPKillMsg: "OP_PVPKillMsg", OP_HateThreatUpdateMsg: "OP_HateThreatUpdateMsg", OP_CombatSessionUpdateMsg: "OP_CombatSessionUpdateMsg", } // OpcodeManager handles the mapping between client-specific opcodes and internal opcodes type OpcodeManager struct { // Maps client version -> (client opcode -> internal opcode) clientToInternal map[int32]map[uint16]InternalOpcode // Maps internal opcode -> client version -> client opcode internalToClient map[InternalOpcode]map[int32]uint16 mutex sync.RWMutex } // NewOpcodeManager creates a new opcode manager func NewOpcodeManager() *OpcodeManager { return &OpcodeManager{ clientToInternal: make(map[int32]map[uint16]InternalOpcode), internalToClient: make(map[InternalOpcode]map[int32]uint16), } } // LoadOpcodeMap loads opcode mappings for a specific client version func (om *OpcodeManager) LoadOpcodeMap(clientVersion int32, opcodeMap map[string]uint16) error { om.mutex.Lock() defer om.mutex.Unlock() // Initialize maps for this client version if om.clientToInternal[clientVersion] == nil { om.clientToInternal[clientVersion] = make(map[uint16]InternalOpcode) } // Process each opcode mapping for opcodeName, clientOpcode := range opcodeMap { // Find the internal opcode for this name internalOpcode := OP_Unknown for intOp, name := range OpcodeNames { if name == opcodeName { internalOpcode = intOp break } } if internalOpcode == OP_Unknown && opcodeName != "OP_Unknown" { // Log warning for unknown opcode but don't fail fmt.Printf("Warning: Unknown internal opcode name: %s\n", opcodeName) continue } // Set client -> internal mapping om.clientToInternal[clientVersion][clientOpcode] = internalOpcode // Set internal -> client mapping if om.internalToClient[internalOpcode] == nil { om.internalToClient[internalOpcode] = make(map[int32]uint16) } om.internalToClient[internalOpcode][clientVersion] = clientOpcode } fmt.Printf("Loaded %d opcode mappings for client version %d\n", len(opcodeMap), clientVersion) return nil } // ClientOpcodeToInternal converts a client opcode to internal opcode func (om *OpcodeManager) ClientOpcodeToInternal(clientVersion int32, clientOpcode uint16) InternalOpcode { om.mutex.RLock() defer om.mutex.RUnlock() if versionMap, exists := om.clientToInternal[clientVersion]; exists { if internalOp, found := versionMap[clientOpcode]; found { return internalOp } } return OP_Unknown } // InternalOpcodeToClient converts an internal opcode to client opcode func (om *OpcodeManager) InternalOpcodeToClient(internalOpcode InternalOpcode, clientVersion int32) uint16 { om.mutex.RLock() defer om.mutex.RUnlock() if versionMap, exists := om.internalToClient[internalOpcode]; exists { if clientOp, found := versionMap[clientVersion]; found { return clientOp } } return 0 // Invalid client opcode } // GetOpcodeName returns the human-readable name for an internal opcode func (om *OpcodeManager) GetOpcodeName(internalOpcode InternalOpcode) string { if name, exists := OpcodeNames[internalOpcode]; exists { return name } return "OP_Unknown" } // GetSupportedVersions returns all client versions with loaded opcodes func (om *OpcodeManager) GetSupportedVersions() []int32 { om.mutex.RLock() defer om.mutex.RUnlock() versions := make([]int32, 0, len(om.clientToInternal)) for version := range om.clientToInternal { versions = append(versions, version) } return versions } // GetOpcodeCount returns the number of opcodes loaded for a client version func (om *OpcodeManager) GetOpcodeCount(clientVersion int32) int { om.mutex.RLock() defer om.mutex.RUnlock() if versionMap, exists := om.clientToInternal[clientVersion]; exists { return len(versionMap) } return 0 } // Global opcode manager instance var globalOpcodeManager = NewOpcodeManager() // GetOpcodeManager returns the global opcode manager func GetOpcodeManager() *OpcodeManager { return globalOpcodeManager } // Convenience functions for global access // LoadGlobalOpcodeMap loads opcodes into the global manager func LoadGlobalOpcodeMap(clientVersion int32, opcodeMap map[string]uint16) error { return globalOpcodeManager.LoadOpcodeMap(clientVersion, opcodeMap) } // ClientToInternal converts using the global manager func ClientToInternal(clientVersion int32, clientOpcode uint16) InternalOpcode { return globalOpcodeManager.ClientOpcodeToInternal(clientVersion, clientOpcode) } // InternalToClient converts using the global manager func InternalToClient(internalOpcode InternalOpcode, clientVersion int32) uint16 { return globalOpcodeManager.InternalOpcodeToClient(internalOpcode, clientVersion) } // GetInternalOpcodeName returns name using the global manager func GetInternalOpcodeName(internalOpcode InternalOpcode) string { return globalOpcodeManager.GetOpcodeName(internalOpcode) }