185 lines
5.0 KiB
Lua
185 lines
5.0 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
|
|
|
|
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)
|