Daniel Braga
New Member
- Joined
- Mar 17, 2018
- Messages
- 53
- Reaction score
- 1
LIB \/
--[[ Query to Execute
CREATE TABLE
guild_storages
(guild_id
int NOT NULL default 0,key
int NOT NULL default 0,value
varchar(255) NOT NULL default 0);
-- ]]
--[[ Function List ]]--
function setGuildStorageValue(guild_id, key, value)
local func = db.executeQuery or db.query
local query = db.getResult("SELECT
value
FROM guild_storages WHERE key
= "..key.." AND guild_id = "..guild_id)if query:getID() == -1 then
return func("INSERT INTO guild_storages (guild_id,
key
, value
) VALUES ("..guild_id..", "..key..", "..value..")")end
return func("UPDATE guild_storages SET
value
= "..value.." WHERE key
= "..key.." AND guild_id = "..guild_id)end
function getGuildStorageValue(guild_id, key)
local ret = db.getResult("SELECT
value
FROM guild_storages WHERE guild_id = "..guild_id.." AND key
= "..key)if ret:getID() == -1 then
return -1
end
return ret:getDataInt("value") or ret:getDataString("value")
end
function getGuildMembers(id)
local players, query = {}, db.getResult("SELECT
name
FROM players
WHERE rank_id
IN (SELECT id
FROM guild_ranks
WHERE guild_id
= " .. id .. ");")if (query:getID() ~= -1) then
repeat
players[#players+1] = query:getDataString("name")
until not query:next()
query:free()
end
return players
end
function doAddGuildTaskReward(name, items, texto)
local parcel = doCreateItemEx(ITEM_PARCEL)
for _, i_i in ipairs(items) do
local item, amount = i_i[1],i_i[2]
if isItemStackable(item) or amount == 1 then
doAddContainerItem(parcel, item, amount)
else
for i = 1, amount do
doAddContainerItem(parcel, item, 1)
end
end
end
local carta = doAddContainerItem(parcel, 1952)
doItemSetAttribute(carta, "writer", "[+] Guild Task [+]")
doItemSetAttribute(carta, "text", texto)
doPlayerSendMailByName(name, parcel)
return true
end
function doRandomMobs(tab, bat)
local r = tab[math.random(1, #tab)]
if isInArray(bat, r) then
return doRandomMobs(tab, bat)
end
return r
end
function doMsgCastGuild(id, type, msg)
for _, cid in pairs(getPlayersOnline()) do
if getPlayerGuildId(cid) == id then
doPlayerSendTextMessage(cid, type, msg)
end
end
return true
end
function doDeleteAllTaskStorage()
local func = db.executeQuery or db.query
for i = 13000, 13050 do -- 50 task max
func("DELETE FROM
guild_storages
WHERE key
== "..i) -- testar WHERE key
> and < andend
return true
end
function getAmountTaskFinished(guild_id)
dofile(getDataDir() .. 'guildtask.lua')
local finit, totalt = 0,0
for task, info in pairs(gtask) do
totalt = totalt +1
local ret = getGuildStorageValue(guild_id, info.storage) <= 0 and 0 or getGuildStorageValue(guild_id, info.storage)
if getGuildStorageValue(guild_id, info.storage) >= info.amount then
finit = finit + 1
end
end
return {finit, totalt}
end
function CloseGuildTaskEvent()
doDeleteAllTaskStorage() -- del storages guilds
setGlobalStorageValue(Guild_Task_Config.storages[1], 0)
setGlobalStorageValue(Guild_Task_Config.storages[2], 0)
ZerarPlayerStorageTaskEvent() -- del storage players
end
function ZerarPlayerStorageTaskEvent()
local func = db.executeQuery or db.query
for _, pid in ipairs(getPlayersOnline()) do
setPlayerStorageValue(pid, Guild_Task_Config.storages[3], -1) -- reset storage from players online
end
return func("DELETE FROM
player_storage
WHERE key
= "..Guild_Task_Config.storages[3]) -- reset player offlineend
function getTopTaskFinished()
local list,t = db.getResult("SELECT
id
, name
FROM guilds
;"),{} if(list:getID() ~= -1) then
repeat
local name, gid = list:getDataString("name"), list:getDataInt("id")
local amount = getAmountTaskFinished(gid)[1]
if amount > 0 then
t[#t+1] = {name, amount}
end
until not list:next()
list:free()
end
if #t > 1 then table.sort(t, function(a, b) return a[2] > b[2] end) end
return t
end
function isInRankTable(tab, id)
for _, ret in pairs(tab) do
if ret[1] == id then
return true
end
end
return false
end
function getRankGuildTaskKills(key)
local players, t = getPlayersOnline(),{}
for _, pid in ipairs(players) do
if getPlayerStorageValue(pid, key) > 0 then
t[#t+1] = {getPlayerGUID(pid), getPlayerStorageValue(pid, key)}
end
end
if Guild_Task_Config.reward_player_offline then
local query = db.getResult("SELECT
player_id
, value
FROM player_storage
WHERE key
= "..key.." and value
> 0 ORDER BY cast(value as INTEGER) DESC;")if (query:getID() ~= -1) then
repeat
local playerid, amount = query:getDataInt("player_id"), query:getDataInt("value")
if not isInRankTable(t, playerid) then
t[#t+1] = {playerid, amount}
end
until not query:next()
end
end
if #t > 1 then table.sort(t, function(a, b) return a[2] > b[2] end) end
return t
end
function doCreateRandomGuildTask(tabble, amount_tasks, min_max_kills, storage)
local ret = {}
local n = amount_tasks
newFile = io.open('data/guildtask.lua', 'w+')
newFile:write('gtask = {')
repeat
local name = doRandomMobs(tabble, ret)
ret[#ret+1] = name
local number = math.random(min_max_kills[1], min_max_kills[2])
storage = storage + 1
newFile:write('\n["'..name:lower()..'"] = {storage = '..storage..', amount = '..number..'}'..(n == 1 and '}' or ','))
n = n-1
until n == 0
newFile:close()
end
function doUpdateGuildTaskRank(text)
file = io.open(getDataDir() .. 'guildtaskrank.txt','w+')
file:write(text)
file:close()
end
function GuildTaskShout(delay)
if delay > 1 then
doBroadcastMessage(string.format(Guild_Task_Config.messages.time, delay), MESSAGE_STATUS_WARNING)
elseif delay == 1 then
doBroadcastMessage(string.format(Guild_Task_Config.messages.time, delay), MESSAGE_STATUS_WARNING)
local creating_task = Guild_Task_Tab[getGlobalStorageValue(Guild_Task_Config.storages[1])]
if #creating_task.monsters >= creating_task.min_random_task then
doCreateRandomGuildTask(creating_task.monsters, creating_task.min_random_task, creating_task.min_max_monster_kill, 13000)
doUpdateGuildTaskRank("[Guild Task System]\n\nUma Nova Guild Task começou agora, o Rank será atualizado em instantes!")
else
setGlobalStorageValue(Guild_Task_Config.storages[1], 0)
print("[Guild Task System] ERROR - Tabela de monstro é menor que o numero de monstros para gerar")
end
elseif delay == 0 then
local creating_task = Guild_Task_Tab[getGlobalStorageValue(Guild_Task_Config.storages[1])]
if #creating_task.monsters >= creating_task.min_random_task then
setGlobalStorageValue(Guild_Task_Config.storages[2], os.time()+60*creating_task.minutes_to_finish)
doBroadcastMessage("Boa sorte! A "..GUILD_TASK_TYPES[getGlobalStorageValue(Guild_Task_Config.storages[1])].." task começou e vocês tem "..timeString(60*creating_task.minutes_to_finish).." para terminar! A lista de monstro está no comando !gtask.")
end
end
addEvent(GuildTaskShout, 60000, delay-1)
end
function doGuildMembersTaskReward(id)
local members, legivel = getGuildMembers(id), {}
for _, cid in pairs(members) do
local online = getPlayerByNameWildcard(cid)
if online then
if getPlayerStorageValue(online, Guild_Task_Config.storages[3]) >= Guild_Task_Config.min_kill_to_enable_reward then
legivel[#legivel+1] = cid
end
else
if Guild_Task_Config.reward_player_offline then
local getPlayer = getPlayerGUIDByName(cid)
local query = db.getResult("SELECT
value
FROM player_storage
WHERE player_id
= ".. getPlayer .." AND key
= ".. Guild_Task_Config.storages[3])if (query:getID() ~= -1) then
if query:getDataInt("value" )>= Guild_Task_Config.min_kill_to_enable_reward then
legivel[#legivel+1] = cid
end
end
end
end
end
if #legivel > 0 then
local reward = Guild_Task_Tab[getGlobalStorageValue(Guild_Task_Config.storages[1])].rewards
for _, present in pairs(legivel) do
doAddGuildTaskReward(present, reward, "[Guild Task System]\n\nParabéns! Sua Guild terminou todas as task primeiro e voce recebeu alguns presentes:\n"..getItemsFromList(reward)..".")
end
end
end
function getOfflinePlayerGuildId(name)
local result = db.getResult("SELECT
guild_ranks
.guild_id
AS guildid
FROM guild_ranks
, guilds
WHERE guild_ranks
.id
= (SELECT players
.rank_id
FROM players
WHERE name
LIKE '".. name .."') AND guild_ranks
.guild_id
= guilds
.id
LIMIT 1")if result then
return result:getDataInt("guildid")
end
return 0
end
function getGuildNameById(id)
local result = db.getResult("SELECT
name
FROM guilds
WHERE id
= " .. id .. " LIMIT 1")if result then
return result:getDataString("name")
end
return ""
end
function timeString(timeDiff)
local dateFormat = {
{"day", timeDiff / 60 / 60 / 24},
{"hour", timeDiff / 60 / 60 % 24},
{"minute", timeDiff / 60 % 60},
{"second", timeDiff % 60}
}
local out = {}
for k, t in ipairs(dateFormat) do
local v = math.floor(t[2])
if(v > 0) then
table.insert(out, (k < #dateFormat and (#out > 0 and ', ' or '') or ' and ') .. v .. ' ' .. t[1] .. (v ~= 1 and 's' or ''))
end
end
local ret = table.concat(out)
if ret:len() < 16 and ret:find("second") then
local a, b = ret:find(" and ")
ret = ret:sub(b+1)
end
return ret
end