local PLAYER_EVENT_ON_LOGIN = 3 local PLAYER_EVENT_ON_SPELL_CAST = 5 local PLAYER_EVENT_ON_LOGOUT = 4 local PLAYER_EVENT_ON_COMMAND = 42 local PREMIUM_FLAG_INDEX = 100 local ACCOUNT_FLAG_RECURRING_BILLING = 8192 local SUMMON_SQUIRE_SPELL_ID = 80000 local SQUIRE_CREATURE_TEMPLATE_ID = 9000001 local NPC_TEXT_ID = 10000000 local premiums_table = {} local squires_table = {} ---todo extract to utils ---@param inputstr string ---@param separator string ---@return table local function SplitString(inputstr, separator) if separator == nil then separator = "%s" end local t = {} for str in string.gmatch(inputstr, "([^" .. separator .. "]+)") do table.insert(t, str) end return t end ---@return boolean local function IsPremium(player) return premiums_table[player:GetAccountId()] == true end local function OnPremiumPlayer(player) if not IsPremium(player) then return end player:SendAreaTriggerMessage( 'На вашем аккаунте активна подписка Premium! Благодарим за поддержку проекта MoonWell.') player:LearnSpell(SUMMON_SQUIRE_SPELL_ID) player:SendBroadcastMessage("Милостью Элуны вам была выдана способность |cff71d5ff|Hspell:" .. SUMMON_SQUIRE_SPELL_ID .. "|h[" .. "Призыв Оруженосца]h|") end local function RefreshPremiumStatus(player) local query = AuthDBQuery("SELECT flags FROM account WHERE id = " .. player:GetAccountId()) if query then local function HasFlag(mask, flag) return bit_and(mask, flag) == flag end local flags = query:GetUInt32(0) if HasFlag(flags, ACCOUNT_FLAG_RECURRING_BILLING) then premiums_table[player:GetAccountId()] = true OnPremiumPlayer(player) return true end end return false end local function ApplyPremium(player) AuthDBExecute( string.format( "UPDATE account SET flags = flags | %d WHERE id = %d", ACCOUNT_FLAG_RECURRING_BILLING, player:GetAccountId() ) ) RefreshPremiumStatus(player) end local function OnLogin(event, player) RefreshPremiumStatus(player) end --- @param event any --- @param player any --- @param command string --- @param chatHandler any local function OnCommand(event, player, command, chatHandler) ---Console is not supported yet if not player then return end local parts = SplitString(command:lower(), ' ') if parts[1] ~= 'premium' then return end if parts[2] == 'add' then ApplyPremium(player:GetSelection()) end return false end local function OnSummonSquireCast(player) local x, y, z, o = player:GetLocation() if (squires_table[player:GetGUIDLow()] ~= nil) then local existing_squire = player:GetMap():GetWorldObject(squires_table[player:GetGUIDLow()]) if (existing_squire ~= nil) then existing_squire:DespawnOrUnsummon() end end local squire = player:SpawnCreature(SQUIRE_CREATURE_TEMPLATE_ID, x + 1, y + 1, z, o, 1, 30000) squires_table[player:GetGUIDLow()] = squire:GetGUID() print(squires_table[player:GetGUIDLow()]) if squire then squire:SetFaction(player:GetFaction()) end end local function OnSpellCast(event, player, spell, skipCheck) local spellId = spell:GetEntry() if spellId == SUMMON_SQUIRE_SPELL_ID then OnSummonSquireCast(player) end end local function OnGossipHello(event, player, creature) player:GossipClearMenu() player:GossipMenuAddItem(4, "Открыть почтовый ящик", 900001, 1) player:GossipMenuAddItem(1, "Открыть банк", 900001, 2) player:GossipMenuAddItem(6, "Открыть аукцион", 900001, 3) player:GossipMenuAddItem(4, "Отремонтировать снаряжение", 900001, 4) player:GossipSendMenu(NPC_TEXT_ID, creature) end local function OnGossipSelect(event, player, creature, sender, intid, code) if sender == 900001 then if intid == 1 then player:SendShowMailBox(creature:GetGUID()) player:GossipComplete() end if intid == 2 then player:SendShowBank(creature) player:GossipComplete() end if intid == 3 then player:SendAuctionMenu(creature) player:GossipComplete() end if intid == 4 then player:DurabilityRepairAll() player:PlayDirectSound(1116) player:GossipComplete() end end end local function OnLogout(event, player) player:RemoveSpell(SUMMON_SQUIRE_SPELL_ID) squires_table[player:GetGUID()] = nil end RegisterCreatureGossipEvent(SQUIRE_CREATURE_TEMPLATE_ID, 1, OnGossipHello) RegisterCreatureGossipEvent(SQUIRE_CREATURE_TEMPLATE_ID, 2, OnGossipSelect) RegisterPlayerEvent(PLAYER_EVENT_ON_LOGIN, OnLogin) RegisterPlayerEvent(PLAYER_EVENT_ON_LOGOUT, OnLogout) RegisterPlayerEvent(PLAYER_EVENT_ON_COMMAND, OnCommand) RegisterPlayerEvent(PLAYER_EVENT_ON_SPELL_CAST, OnSpellCast)