e04f0f068c
Squire summon spell is intercepted to summon custom NPC with "service" dialogue options such as open mail, open bank, etc.
173 lines
4.5 KiB
Lua
173 lines
4.5 KiB
Lua
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
|
|
|
|
---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 player:HasFlag(PREMIUM_FLAG_INDEX, 1)
|
|
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
|
|
player:SetFlag(PREMIUM_FLAG_INDEX, 1)
|
|
|
|
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()
|
|
|
|
local squire = player:SpawnCreature(SQUIRE_CREATURE_TEMPLATE_ID, x + 1, y + 1, z, o, 1, 30000)
|
|
|
|
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)
|
|
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)
|
|
|