Tibia Dark

TibiaDark Aqui Podras Encontrar Todo Sobre OTXserver.


War System funcionando

Comparte

God Relaxer

Mensajes : 1
Reputación : 1

Re: War System funcionando

Mensaje por God Relaxer el Jue Sep 18, 2014 5:59 pm

Y los comandos para invitar a war cuales son amigo?
avatar
Kroxos

Vocacion : Paladin

Experiencia : LUA

Mensajes : 7
Reputación : 2
Edad : 22
Localización : Venezuela

War System funcionando

Mensaje por Kroxos el Sáb Mayo 03, 2014 4:10 pm

Aqui le traigo el war sistem funcionando a la perfecion:

primero que nada copian un xml y le llaman guildWarSystem y le agregan el siguiente mod:

Código:
<?xml version="1.0" encoding="UTF-8"?>
<mod name="Guild War System" version="0.3.5+" author="Xampy and Nahruto" contact="otland.net" enabled="yes">
<config name="function_config"><![CDATA[
DelayToCancel = 24 -- HOURS <-> [max: 47 -- min: 24] --> default: 24 hours [1 day]

Maps = {
        ["map1"] =
                {
                        Guild1Pos = {x=238, y=442, z=12},
                        Guild2Pos = {x=244, y=442, z=12}
                },
        ["map2"] =
                {
                        Guild1Pos = {x=994, y=1004, z=6},
                        Guild2Pos = {x=1000, y=1003, z=6}                      
                }
        }

TimeToTeleport = 1 --minutes, when start a challenge
StopBattle = TRUE --Stop battle after X time ? TRUE  /  FALSE
TimeToStop = 60 --Minutes Time to Stop if StopBattle = TRUE.

--Cancel messages~
CancelMessagesWar = {
        --Message when player try accept/reject/cancel a war but there is no a invitation.
        [1] = "Not pending invitations.",
        --Message when the player is not the guild leader.
        [2] = "Only Guild Leader can execute this command.",
        --Message when try Cancel the invitation but the war is already accepted.
        [3] = "The war is already accepted.",
        --MEssage when the invited guild name is not correct or does not exist.
        [4] = "Not correct guild name.",
        --Message when try invite any guild to a war but his guild already have a war or a pending invitation.
        [5] = "Your guild is already in war or have a pending invitation.",
        --Same of the cancel message 5 but the the enemy guild.
        [6] = "This guild is already in war or have a pending invitation.",
        --Message when use invite command but not write guild name.
        [7] = "Command needs param.",
        --Message when try invite his guild.
        [8] = "You can\'t invite you guild.",
        --Message when the map name is not correct.
        [9] = "Please write a correct name.",
        --Message when try go to any map but the guild is have no received/sent any war invitation
        [10] = "Your guild is not in any war.",
        --When try to cancel a war before the delay
        [11] = "You should wait ".. DelayToCancel .." hours to cancel the war"
        }
      
--Broadcast messages when invite/accept/reject/cancel ~ Remember the Spaces.
BroadCast_Type = MESSAGE_EVENT_ADVANCE
BroadCast = {
        --Message when inviting
        [1] =
                {
                        "Guild ",
                        --Here will be the guild name
                        " have invited guild ",
                        --Here will be the invited guild name
                        " to have a war."
                },
        --Message when accept.
        [2] =
                {
                        "Guild ",
                        --Here will be the guild name
                        " have accepted the invitation of the guild " ,
                        --Here will be the name of the guild who have invited em.
                        " to have a war."
                },
        --Message when reject.
        [3] =
                {
                        "Guild ",
                        --Here will be the guild name
                        " have rejected the invitation of the guild " ,
                        --Here will be the name of the guild who have invited em.
                        " to have a war."
                },
        --Message when cancel.
        [4] =
                {
                        "Guild ",
                        --Here will be the guild name
                        " have canceled the invitation to the guild " ,
                        --Here will be the name of the guild who have invited em.
                        " to have a war."
                },
        --Message whenstar a battle..
        [5] =
                {
                        "Guild ",
                        --Here will be the guild name
                        " and guild " ,
                        --Here will be the name of the guild who have invited em.
                        " will have a battle in the map :"
                },
        --message when a battle ends.
        [6] =
                {
                        "The battle betwen guild ",
                        --Here will be the guild name
                        " and guild " ,
                        --Here will be the name of the guild who have invited em.
                        " its over."
                },
        }

--Functions ~.

function getShowInfo(id)
        local Info = db.getResult("SELECT `show` FROM `guilds` WHERE `id` = " .. id .. "")
        if Info:getID() ~= -1 then
                local showy = Info:getDataInt("show")
                Info:free()
                return showy
        end
        return -1
end

function getKills(name)
        local Info = db.getResult("SELECT `kills` FROM `guilds` WHERE `name` = '"..name.."'")
        if Info:getID() ~= -1 then
                local killy = Info:getDataInt("kills")
                Info:free()
                return killy
        end
        return -1
end

function getGuildWarInfo(id)
        local Info = db.getResult("SELECT `invited_to`, `invited_by`, `in_war_with`,`war_time` FROM `guilds` WHERE `id` = " .. id .. "")
        if Info:getID() ~= -1 then
                local invTo, invBy, warWith, Time = Info:getDataInt("invited_to"), Info:getDataInt("invited_by"), Info:getDataInt("in_war_with"), Info:getDataInt("war_time")
                Info:free()
                return {To = invTo, By = invBy, With = warWith, T = Time}
        end
        return -1
end

function getGuildNameById(id)
        local Info = db.getResult("SELECT `name` FROM `guilds` WHERE `id` = " .. id .. "")
                if Info:getID() ~= -1 then
                local Name = Info:getDataString("name")
                Info:free()
                return Name
        end
        return -1
end

function GuildIsInPEace(id)
        local Info = getGuildWarInfo(id)
        return (Info.To == 0 and Info.By == 0 and Info.With == 0)
end

function doInviteToWar(myGuild, enemyGuild)
        local StartTime = os.time()
        db.executeQuery("UPDATE `guilds` SET `invited_to` = ".. enemyGuild ..", `war_time` = ".. StartTime .." WHERE `id` = ".. myGuild .."")
        db.executeQuery("UPDATE `guilds` SET `invited_by` = ".. myGuild .." WHERE `id` = ".. enemyGuild .."")
end

function WarAccept(myGuild, enemyGuild)
        local StartTime = os.time()
        db.executeQuery("UPDATE `guilds` SET `invited_to` = 0, `invited_by` = 0, `in_war_with`  =  ".. myGuild ..", `kills` = 0, `show` = 1 WHERE `id` = ".. enemyGuild .."")
        db.executeQuery("UPDATE `guilds` SET `invited_to` = 0, `invited_by` = 0, `war_time` = ".. StartTime ..", `in_war_with`  =  ".. enemyGuild ..", `kills` = 0, `show` = 0 WHERE `id` = ".. myGuild .."")
end

function cleanInfo(myGuild)
        db.executeQuery("UPDATE `guilds` SET `invited_to` = 0, `invited_by` = 0, `war_time` = 0, `in_war_with`  =  0, `kills` = 0, `show` = 0 WHERE `id` = ".. myGuild .."")
end

function registerDeathOne(myGuild, enemyGuild, cid, target)
        db.executeQuery("INSERT INTO `deaths_in_wars` (`guild_id`, `player_id`, `killer_guild`, `killer`, `date`, `result1`, `result2`) VALUES ("..enemyGuild..", "..getPlayerGUID(target)..", "..myGuild..", "..getPlayerGUID(cid)..", " .. os.time() ..", 1, 0);")      
        db.executeQuery("UPDATE `guilds` SET `kills` = `kills` + 1 WHERE `id` = ".. myGuild .."")
end

function registerDeathTwo(myGuild, enemyGuild, cid, target)
        db.executeQuery("INSERT INTO `deaths_in_wars` (`guild_id`, `player_id`, `killer_guild`, `killer`, `date`, `result1`, `result2`) VALUES ("..enemyGuild..", "..getPlayerGUID(target)..", "..myGuild..", "..getPlayerGUID(cid)..", " .. os.time() ..", 0, 1);")      
        db.executeQuery("UPDATE `guilds` SET `kills` = `kills` + 1 WHERE `id` = ".. myGuild .."")
end

function removeDeaths(id)
        db.executeQuery("DELETE FROM `deaths_in_wars` WHERE `guild_id` = " ..id .. ";")
end

function StopWar(myGuild, enemyGuild)
        cleanInfo(myGuild)
        cleanInfo(enemyGuild)
        removeDeaths(myGuild)
        removeDeaths(enemyGuild)
end

function WeAreInWar(myGuild, enemyGuild)
        local myGuildInfo = getGuildWarInfo(myGuild)
        local enemyGuildInfo = getGuildWarInfo(enemyGuild)
        if myGuild == enemyGuildInfo.With and enemyGuild ==  myGuildInfo.With then
                if enemyGuildInfo.ON == 1 and myGuildInfo.ON == 1 then
                        return TRUE
                end            
        end
        return FALSE
end

function getOnlineMembers(id)
        local PlayersOnline = getPlayersOnline()
        local MembersOnline = {}
        for i, pid in ipairs(PlayersOnline) do
                if id == getPlayerGuildId(PlayersOnline[i]) then
                        table.insert(MembersOnline, PlayersOnline[i])
                end
        end
        return MembersOnline
end

function teleportGuild(id, pos)
        local Members = getOnlineMembers(id)
        if #Members > 0 then
        for i = 1, #Members do
                if #Members > 1 then
                        if getTilePzInfo(getCreaturePosition(Members[i])) == TRUE then
                                doTeleportThing(Members[i], pos, FALSE)
                                doSendMagicEffect(pos, CONST_ME_TELEPORT)
                                doSendMagicEffect(getCreaturePosition(Members[i]), CONST_ME_POFF)
                                doPlayerSendTextMessage(Members[i], 22, 'Prepare to fight!')
                        else
                                doPlayerPopupFYI(Members[i], 'GuildWar challenge error:\n\nBoth guild members must stay in Protection Zone.')
                        end
                else
                        doPlayerPopupFYI(Members[i], 'GuildWar challenge error:\n\nBoth guilds must have more than one player online (leader & any member, at least).')
                end
        end
        end
end

function getGuildsWithWar()
        local res = db.getResult("SELECT `id` FROM `guilds` WHERE `in_war_with` > 0")
        local GuildW = {}
        if res:getID() ~= -1 then
                while true do
                        table.insert(GuildW, res:getDataInt "id")
                        if not res:next() then
                                break
                        end
                end
                res:free()
        end
        return GuildW
end

function guildExist(nom)
        local Get = db.getResult("SELECT `id` FROM `guilds` WHERE `name` = " .. db.escapeString(nom) .. ";")
        if Get:getID() ~= -1 then
                local ret = Get:getDataInt("id")
                Get:free()
                return ret
        end
        return -1
end

function StartWar(x)
        teleportGuild(x.myGuild, Maps[x.map].Guild1Pos)
        teleportGuild(x.enemyGuild, Maps[x.map].Guild2Pos)

        if StopBattle == TRUE then
                addEvent(StopWarNow, 60 * 1000, {myGuild = x.myGuild, enemyGuild = x.enemyGuild})
        end
end    

function StopWarNow(c)
        StopWar(c.myGuild, c.enemyGuild)
        doBroadcastMessage(BroadCast[6][1] ..getGuildNameById(c.myGuild).. BroadCast[6][2] ..getGuildNameById(c.enemyGuild).. BroadCast[6][3], BroadCast_Type)
end

function putWarOn(myGuild, enemyGuild)
        db.executeQuery("UPDATE `guilds` SET `war_time`  = 1 WHERE `id` = ".. myGuild .."")
        db.executeQuery("UPDATE `guilds` SET `war_time`  = 1 WHERE `id` = ".. enemyGuild .."")
end]]></config>


<talkaction words="!disband; /war-invite; /war-accept; /war-reject; /war-cancel-invite; /war-cancel" event="script"><![CDATA[
domodlib('function_config')
function onSay(cid, words, param, channel)
        if getPlayerGuildLevel(cid) == GUILDLEVEL_LEADER then
                local myGuild = getPlayerGuildId(cid)
                if words == "/war-invite" then
                        if GuildIsInPEace(myGuild) == true then
                                if param ~= "" then
                                        if guildExist(param) ~= -1 then
                                                local invitedGuild = getGuildId(param)
                                                if invitedGuild ~= -1 then
                                                        if invitedGuild ~= myGuild then
                                                                if GuildIsInPEace(invitedGuild) == true then
                                    if getPlayerStorageValue(cid, 65570) <= os.time() then
                                                                            doInviteToWar(myGuild, invitedGuild)
                                                                            doBroadcastMessage(BroadCast[1][1] ..getPlayerGuildName(cid).. BroadCast[1][2] ..getGuildNameById(invitedGuild).. BroadCast[1][3], BroadCast_Type)
                                        setPlayerStorageValue(cid, 65570, os.time()+(20*60))
                                    else
                                        local waitTime = (getPlayerStorageValue(cid, 65570) - os.time())
                                        doPlayerSendCancel(cid, "You must wait " .. os.date("%M", waitTime) .. " minutes and " .. os.date("%S", waitTime) .. " seconds until declare another war.")
                                    end
                                                                else
                                                                        doPlayerSendCancel(cid, CancelMessagesWar[6])
                                                                end
                                                        else
                                                                doPlayerSendCancel(cid, CancelMessagesWar[8])
                                                        end
                                                else
                                                        doPlayerSendCancel(cid, CancelMessagesWar[4])
                                                end
                                        else
                                                doPlayerSendCancel(cid, CancelMessagesWar[4])
                                        end
                                else
                                        doPlayerSendCancel(cid, CancelMessagesWar[7])
                                end
                        else
                                doPlayerSendCancel(cid, CancelMessagesWar[5])
                        end
                elseif words == "/war-accept" then
                        if getGuildWarInfo(myGuild).By ~= 0 then
                                local enemyGuild = getGuildWarInfo(myGuild).By
                                doBroadcastMessage(BroadCast[2][1] ..getPlayerGuildName(cid).. BroadCast[2][2] ..getGuildNameById(enemyGuild).. BroadCast[2][3], BroadCast_Type)
                                WarAccept(myGuild, enemyGuild)
                        else
                                doPlayerSendCancel(cid, CancelMessagesWar[1])
                        end
                elseif words == "/war-reject" then
                        if getGuildWarInfo(myGuild).By ~= 0 then
                                doBroadcastMessage(BroadCast[3][1] ..getPlayerGuildName(cid).. BroadCast[3][2] ..getGuildNameById(getGuildWarInfo(myGuild).By).. BroadCast[3][3], BroadCast_Type)
                                cleanInfo(getGuildWarInfo(myGuild).By)
                                cleanInfo(myGuild)
                        else
                                doPlayerSendCancel(cid, CancelMessagesWar[1])  
                        end
                elseif words == "/war-cancel-invite" then
                        if getGuildWarInfo(myGuild).To ~= 0 then
                                if getGuildWarInfo(myGuild).With == 0 then
                                        doBroadcastMessage(BroadCast[4][1] ..getPlayerGuildName(cid).. BroadCast[4][2] ..getGuildNameById(getGuildWarInfo(myGuild).To).. BroadCast[4][3], BroadCast_Type)
                                        cleanInfo(getGuildWarInfo(myGuild).To)
                                        cleanInfo(myGuild)
                                else
                                        doPlayerSendCancel(cid, CancelMessagesWar[3])
                                end
                        else
                                doPlayerSendCancel(cid, CancelMessagesWar[1])  
                        end
                elseif words == "/war-challenge" then
                        local map = Maps[param]
                        if map then
                                if enemy ~= 0 then
                                        local enemyGuild = getGuildWarInfo(myGuild).With
                                        addEvent(StartWar, 15000, {myGuild = myGuild, enemyGuild = enemyGuild, map = param})
                                        doBroadcastMessage(BroadCast[5][1] ..getPlayerGuildName(cid).. BroadCast[5][2] ..getGuildNameById(enemyGuild).. BroadCast[5][3] .. param ..".", BroadCast_Type)
                                else
                                        doPlayerSendCancel(cid, CancelMessagesWar[10])
                                end
                        else
                                doPlayerSendCancel(cid, CancelMessagesWar[9])
                        end
                elseif words == "/war-cancel" then
                        local enemy = getGuildWarInfo(myGuild).With
                        if enemy ~= 0 then
                                if (os.time() - getGuildWarInfo(myGuild).T) >= (60 * 60 * DelayToCancel) then
                                        StopWar(myGuild, enemy)
                                        doBroadcastMessage(BroadCast[6][1] ..getGuildNameById(myGuild).. BroadCast[6][2] ..getGuildNameById(enemy).. BroadCast[6][3], BroadCast_Type)
                                else
                    local timeEnd = getGuildWarInfo(myGuild).T + (60 * 60 * DelayToCancel)
                    local timeLeft = timeEnd - os.time()
                    local hours = (os.date("%H", timeLeft) + 23)
                                        doPlayerSendCancel(cid, "Time remaining: "..hours.." hours, " .. os.date("%M", timeLeft) .. " minutes and " .. os.date("%S", timeLeft) .. " seconds.")
                                end
                        else
                                doPlayerSendCancel(cid, CancelMessagesWar[10])
                        end
                elseif words == "!disband" then
                        local enemy = getGuildWarInfo(myGuild).With
                        if enemy > 0 then
                if channel == CHANNEL_GUILD then
                    if (os.time() - getGuildWarInfo(myGuild).T) >= (60 * 60 * DelayToCancel) then
                                            StopWar(myGuild, enemy)
                                            doBroadcastMessage(BroadCast[6][1] ..getGuildNameById(myGuild).. BroadCast[6][2] ..getGuildNameById(enemy).. BroadCast[6][3], BroadCast_Type)
                                    else
                    local timeEnd = getGuildWarInfo(myGuild).T + (60 * 60 * DelayToCancel)
                    local timeLeft = timeEnd - os.time()
                    local hours = (os.date("%H", timeLeft) + 23)
                                        doPlayerSendCancel(cid, "Time remaining: "..hours.." hours, " .. os.date("%M", timeLeft) .. " minutes and " .. os.date("%S", timeLeft) .. " seconds.")
                                    end
                            else
                    doPlayerSendCancel(cid, "You have to say this command in your guild channel.")
                            end
            else
                                return FALSE
            end
                                return FALSE
                end
        else
                doPlayerSendCancel(cid, CancelMessagesWar[2])
        end
        local file = io.open("data/logs/Wars.txt", "a")
        file:write("".. os.date("%d %B %Y %X ", os.time()) .." -->  "..getCreatureName(cid)..": "..words.." "..param.."\n")
        file:close()
        return TRUE
end]]></talkaction>

<event type="login" name="WarLogin" event="script"><![CDATA[
domodlib('function_config')
function onLogin(cid)
        registerCreatureEvent(cid, "WarKill")
        return true
end]]></event>

<event type="kill" name="WarKill" event="script"><![CDATA[
domodlib('function_config')
              
local PZ = createConditionObject(CONDITION_INFIGHT)
setConditionParam(PZ, CONDITION_PARAM_TICKS, getConfigInfo('whiteSkullTime'))

function onKill(cid, target, lastHit)

        if isPlayer(cid) == TRUE and isPlayer(target) == TRUE then

local config = {
                removeFrags = true -- If 'true' player won't gain frags from a player that is versus him; else, player will gain frags as normal.
                }

        local GUID = getPlayerGUID(cid)
        local namec = getPlayerName(cid)
        local namet = getPlayerName(target)
        local skull = getCreatureSkullType(cid)
        local skullend = getPlayerSkullEnd(cid)
    local playerPos = getPlayerPosition(cid)
    local targetPos = getPlayerPosition(target)
        local cidd = cid

        local timeA = os.time()
        local timesA = {today = (timeA - 86400), week = (timeA - (7 * 86400))}

        local contentsA, resultA = {day = {}, week = {}, month = {}}, db.getResult("SELECT `pd`.`date`, `pd`.`level`, `p`.`name` FROM `player_killers` pk LEFT JOIN `killers` k ON `pk`.`kill_id` = `k`.`id` LEFT JOIN `player_deaths` pd ON `k`.`death_id` = `pd`.`id` LEFT JOIN `players` p ON `pd`.`player_id` = `p`.`id` WHERE `pk`.`player_id` = " .. getPlayerGUID(cid) .. " AND `k`.`unjustified` = 1 AND `pd`.`date` >= " .. (timeA - (30 * 86400)) .. " ORDER BY `pd`.`date` DESC")
        if(resultA:getID() ~= -1) then
                repeat
                        local contentA = {
                                name = resultA:getDataString("name"),
                                level = resultA:getDataInt("level"),
                                date = resultA:getDataInt("date")
                        }
                        if(contentA.date > timesA.today) then
                                table.insert(contentsA.day, contentA)
                        elseif(contentA.date > timesA.week) then
                                table.insert(contentsA.week, contentA)
                        else
                                table.insert(contentsA.month, contentA)
                        end
                until not resultA:next()
                resultA:free()
        end

        local sizeA = {
                day = table.maxn(contentsA.day),
                week = table.maxn(contentsA.week),
                month = table.maxn(contentsA.month)
        }
local function removeFrag(cid)

        local timeB = os.time()
        local timesB = {today = (timeB - 86400), week = (timeB - (7 * 86400))}

        local contentsB, resultB = {day = {}, week = {}, month = {}}, db.getResult("SELECT `pd`.`date`, `pd`.`level`, `p`.`name` FROM `player_killers` pk LEFT JOIN `killers` k ON `pk`.`kill_id` = `k`.`id` LEFT JOIN `player_deaths` pd ON `k`.`death_id` = `pd`.`id` LEFT JOIN `players` p ON `pd`.`player_id` = `p`.`id` WHERE `pk`.`player_id` = " .. GUID .. " AND `k`.`unjustified` = 1 AND `pd`.`date` >= " .. (timeB - (30 * 86400)) .. " ORDER BY `pd`.`date` DESC")
        if(resultB:getID() ~= -1) then
                repeat
                        local contentB = {
                                name = resultB:getDataString("name"),
                                level = resultB:getDataInt("level"),
                                date = resultB:getDataInt("date")
                        }
                        if(contentB.date > timesB.today) then
                                table.insert(contentsB.day, contentB)
                        elseif(contentB.date > timesB.week) then
                                table.insert(contentsB.week, contentB)
                        else
                                table.insert(contentsB.month, contentB)
                        end
                until not resultB:next()
                resultB:free()
        end

        local sizeB = {
                day = table.maxn(contentsB.day),
                week = table.maxn(contentsB.week),
                month = table.maxn(contentsB.month)
        }


if sizeB.day > sizeA.day or sizeB.week > sizeA.week or sizeB.month > sizeA.month then
        db.executeQuery("UPDATE `killers` SET `unjustified` = 0 WHERE `id` IN (SELECT `kill_id` FROM `player_killers` WHERE `player_id` = "..GUID..") ORDER BY `death_id` DESC LIMIT 1;")
        doPlayerSendTextMessage(cidd, 21, "Frag from "..namet.." wasn't counted.")
end

if skull == SKULL_RED then
        if getCreatureSkullType(cidd) == SKULL_BLACK then
                doPlayerSetSkullEnd(cidd, skullend, SKULL_RED)
                doCreatureSetSkullType(cidd, SKULL_RED)
        end
elseif skull == SKULL_WHITE then
        if getCreatureSkullType(cidd) == SKULL_RED then
                doPlayerSetSkullEnd(cidd, timeB, SKULL_RED)
                doCreatureSetSkullType(cidd, SKULL_WHITE)
        end
end

end

                local myGuild = getPlayerGuildId(cid)
                local enemyGuild = getPlayerGuildId(target)

                if myGuild ~= 0 and enemyGuild ~= 0 then
                        if enemyGuild == getGuildWarInfo(myGuild).With then
local guildc = getPlayerGuildName(cid)
local guildt = getPlayerGuildName(target)
                                doAddCondition(cid, PZ)

                                if lastHit == TRUE then
                    if getTileZoneInfo(playerPos) == 0 and getTileZoneInfo(targetPos) == 0 then
                                            if getShowInfo(myGuild) == 1 then
                                                    registerDeathOne(myGuild, enemyGuild, cid, target)
                                            else
                                                    registerDeathTwo(myGuild, enemyGuild, cid, target)
                                            end    
                    else
                        doPlayerSendTextMessage(cid, 19, "Remember: in PvP zone the system doesn't register the frag.")
                    end
                                end

                                if config.removeFrags == true then
                                        addEvent(removeFrag, 150)
                                end

local gsim = getShowInfo(myGuild)
local gsie = getShowInfo(enemyGuild)

if gsim > gsie then
    resulta = getKills(guildc)
    resultb = getKills(guildt)
else
    resulta = getKills(guildt)
    resultb = getKills(guildc)
end

local players = getOnlinePlayers()
    for i,playerName in ipairs(players) do
        local player = getPlayerByName(playerName);
        if getPlayerGuildId(player) == myGuild then
    if getTileZoneInfo(playerPos) == 0 and getTileZoneInfo(targetPos) == 0 then
            doPlayerSendChannelMessage(player, "", "Opponent "..namet.." of the "..guildt.." was killed by "..namec..". The new score is "..resulta..":"..resultb.." frags.", TALKTYPE_CHANNEL_W, CHANNEL_GUILD)
    end
        end
    end
                        end
                end
        end
        return TRUE
end]]></event>
</mod>

luego se van a talkation/scripts y agregan un lua llamado war y agregan lo siguiente:

Código:
function onSay(cid, words, param, channel)
 local guild = getPlayerGuildId(cid)
 if(not guild or getPlayerGuildLevel(cid) < GUILDLEVEL_LEADER) then
 doPlayerSendChannelMessage(cid, "", "You cannot execute this talkaction.", TALKTYPE_CHANNEL_W, 0)
 return true
 end

 local t = string.explode(param, ",")
 if(not t[2]) then
 doPlayerSendChannelMessage(cid, "", "Not enough param(s).", TALKTYPE_CHANNEL_W, 0)
 return true
 end

 local enemy = getGuildId(t[2])
 if(not enemy) then
 doPlayerSendChannelMessage(cid, "", "Guild \"" .. t[2] .. "\" does not exists.", TALKTYPE_CHANNEL_W, 0)
 return true
 end

 if(enemy == guild) then
 doPlayerSendChannelMessage(cid, "", "You cannot perform war action on your own guild.", TALKTYPE_CHANNEL_W, 0)
 return true
 end

 local enemyName, tmp = "", db.getResult("SELECT `name` FROM `guilds` WHERE `id` = " .. enemy)
 if(tmp:getID() ~= -1) then
 enemyName = tmp:getDataString("name")
 tmp:free()
 end

 if(isInArray({"accept", "reject", "cancel"}, t[1])) then
 local query = "`guild_id` = " .. enemy .. " AND `enemy_id` = " .. guild
 if(t[1] == "cancel") then
 query = "`guild_id` = " .. guild .. " AND `enemy_id` = " .. enemy
 end

 tmp = db.getResult("SELECT `id`, `begin`, `end`, `payment` FROM `guild_wars` WHERE " .. query .. " AND `status` = 0")
 if(tmp:getID() == -1) then
 doPlayerSendChannelMessage(cid, "", "Currently there's no pending invitation for a war with " .. enemyName .. ".", TALKTYPE_CHANNEL_W, 0)
 return true
 end

 if(t[1] == "accept") then
 local _tmp = db.getResult("SELECT `balance` FROM `guilds` WHERE `id` = " .. guild)
 local state = _tmp:getID() < 0 or _tmp:getDataInt("balance") < tmp:getDataInt("payment")

 _tmp:free()
 if(state) then
 doPlayerSendChannelMessage(cid, "", "Your guild balance is too low to accept this invitation.", TALKTYPE_CHANNEL_W, 0)
 return true
 end

 db.executeQuery("UPDATE `guilds` SET `balance` = `balance` - " .. tmp:getDataInt("payment") .. " WHERE `id` = " .. guild)
 end

 query = "UPDATE `guild_wars` SET "
 local msg = "accepted " .. enemyName .. " invitation to war."
 if(t[1] == "reject") then
 query = query .. "`end` = " .. os.time() .. ", `status` = 2"
 msg = "rejected " .. enemyName .. " invitation to war."
 elseif(t[1] == "cancel") then
 query = query .. "`end` = " .. os.time() .. ", `status` = 3"
 msg = "canceled invitation to a war with " .. enemyName .. "."
 else
 query = query .. "`begin` = " .. os.time() .. ", `end` = " .. (tmp:getDataInt("end") > 0 and (os.time() + ((tmp:getDataInt("begin") - tmp:getDataInt("end")) / 86400)) or 0) .. ", `status` = 1"
 end

 query = query .. " WHERE `id` = " .. tmp:getDataInt("id")
 if(t[1] == "accept") then
 doGuildAddEnemy(guild, enemy, tmp:getDataInt("id"), WAR_GUILD)
 doGuildAddEnemy(enemy, guild, tmp:getDataInt("id"), WAR_ENEMY)
 end

 tmp:free()
 db.executeQuery(query)
 doBroadcastMessage(getPlayerGuildName(cid) .. " has " .. msg, MESSAGE_EVENT_ADVANCE)
 return true
 end

 if(t[1] == "invite") then
 local str = ""
 tmp = db.getResult("SELECT `guild_id`, `status` FROM `guild_wars` WHERE `guild_id` IN (" .. guild .. "," .. enemy .. ") AND `enemy_id` IN (" .. enemy .. "," .. guild .. ") AND `status` IN (0, 1)")
 if(tmp:getID() ~= -1) then
 if(tmp:getDataInt("status") == 0) then
 if(tmp:getDataInt("guild_id") == guild) then
 str = "You have already invited " .. enemyName .. " to war."
 else
 str = enemyName .. " have already invited you to war."
 end
 else
 str = "You are already on a war with " .. enemyName .. "."
 end

 tmp:free()
 end

 if(str ~= "") then
 doPlayerSendChannelMessage(cid, "", str, TALKTYPE_CHANNEL_W, 0)
 return true
 end

 local frags = tonumber(t[3])
 if(frags ~= nil) then
 frags = math.max(10, math.min(1000, frags))
 else
 frags = 100
 end

 local payment = tonumber(t[4])
 if(payment ~= nil) then
 payment = math.max(100000, math.min(1000000000, payment))
 tmp = db.getResult("SELECT `balance` FROM `guilds` WHERE `id` = " .. guild)

 local state = tmp:getID() < 0 or tmp:getDataInt("balance") < payment
 tmp:free()
 if(state) then
 doPlayerSendChannelMessage(cid, "", "Your guild balance is too low for such payment.", TALKTYPE_CHANNEL_W, 0)
 return true
 end

 db.executeQuery("UPDATE `guilds` SET `balance` = `balance` - " .. payment .. " WHERE `id` = " .. guild)
 else
 payment = 0
 end

 local begining, ending = os.time(), tonumber(t[5])
 if(ending ~= nil and ending ~= 0) then
 ending = begining + (ending * 86400)
 else
 ending = 0
 end

 db.executeQuery("INSERT INTO `guild_wars` (`guild_id`, `enemy_id`, `begin`, `end`, `frags`, `payment`) VALUES (" .. guild .. ", " .. enemy .. ", " .. begining .. ", " .. ending .. ", " .. frags .. ", " .. payment .. ");")
 doBroadcastMessage(getPlayerGuildName(cid) .. " has invited " .. enemyName .. " to war till " .. frags .. " frags.", MESSAGE_EVENT_ADVANCE)
 return true
 end

 if(not isInArray({"end", "finish"}, t[1])) then
 return false
 end

 local status = (t[1] == "end" and 1 or 4)
 tmp = db.getResult("SELECT `id` FROM `guild_wars` WHERE `guild_id` = " .. guild .. " AND `enemy_id` = " .. enemy .. " AND `status` = " .. status)
 if(tmp:getID() ~= -1) then
 local query = "UPDATE `guild_wars` SET `end` = " .. os.time() .. ", `status` = 5 WHERE `id` = " .. tmp:getDataInt("id")
 tmp:free()
 doGuildRemoveEnemy(guild, enemy)
 doGuildRemoveEnemy(enemy, guild)

 db.executeQuery(query)
 doBroadcastMessage(getPlayerGuildName(cid) .. " has " .. (status == 4 and "mend fences" or "ended up a war") .. " with " .. enemyName .. ".", MESSAGE_EVENT_ADVANCE)
 return true
 end

 if(status == 4) then
 doPlayerSendChannelMessage(cid, "", "Currently there's no pending war truce from " .. enemyName .. ".", TALKTYPE_CHANNEL_W, 0)
 return true
 end

 tmp = db.getResult("SELECT `id`, `end` FROM `guild_wars` WHERE `guild_id` = " .. enemy .. " AND `enemy_id` = " .. guild .. " AND `status` = 1")
 if(tmp:getID() ~= -1) then
 if(tmp:getDataInt("end") > 0) then
 tmp:free()
 doPlayerSendChannelMessage(cid, "", "You cannot request ending for war with " .. enemyName .. ".", TALKTYPE_CHANNEL_W, 0)
 return true
 end

 local query = "UPDATE `guild_wars` SET `status` = 4, `end` = " .. os.time() .. " WHERE `id` = " .. tmp:getDataInt("id")
 tmp:free()

 db.executeQuery(query)
 doBroadcastMessage(getPlayerGuildName(cid) .. " has signed an armstice declaration on a war with " .. enemyName .. ".", MESSAGE_EVENT_ADVANCE)
 return true
 end

 doPlayerSendChannelMessage(cid, "", "Currently there's no active war with " .. enemyName .. ".", TALKTYPE_CHANNEL_W, 0)
 return true
end
function onSay(cid, words, param, channel)
 local guild = getPlayerGuildId(cid)
 if(not guild or getPlayerGuildLevel(cid) < GUILDLEVEL_LEADER) then
 doPlayerSendChannelMessage(cid, "", "You cannot execute this talkaction.", TALKTYPE_CHANNEL_W, 0)
 return true
 end

 local t = string.explode(param, ",")
 if(not t[2]) then
 doPlayerSendChannelMessage(cid, "", "Not enough param(s).", TALKTYPE_CHANNEL_W, 0)
 return true
 end

 local enemy = getGuildId(t[2])
 if(not enemy) then
 doPlayerSendChannelMessage(cid, "", "Guild \"" .. t[2] .. "\" does not exists.", TALKTYPE_CHANNEL_W, 0)
 return true
 end

 if(enemy == guild) then
 doPlayerSendChannelMessage(cid, "", "You cannot perform war action on your own guild.", TALKTYPE_CHANNEL_W, 0)
 return true
 end

 local enemyName, tmp = "", db.getResult("SELECT `name` FROM `guilds` WHERE `id` = " .. enemy)
 if(tmp:getID() ~= -1) then
 enemyName = tmp:getDataString("name")
 tmp:free()
 end

 if(isInArray({"accept", "reject", "cancel"}, t[1])) then
 local query = "`guild_id` = " .. enemy .. " AND `enemy_id` = " .. guild
 if(t[1] == "cancel") then
 query = "`guild_id` = " .. guild .. " AND `enemy_id` = " .. enemy
 end

 tmp = db.getResult("SELECT `id`, `begin`, `end`, `payment` FROM `guild_wars` WHERE " .. query .. " AND `status` = 0")
 if(tmp:getID() == -1) then
 doPlayerSendChannelMessage(cid, "", "Currently there's no pending invitation for a war with " .. enemyName .. ".", TALKTYPE_CHANNEL_W, 0)
 return true
 end

 if(t[1] == "accept") then
 local _tmp = db.getResult("SELECT `balance` FROM `guilds` WHERE `id` = " .. guild)
 local state = _tmp:getID() < 0 or _tmp:getDataInt("balance") < tmp:getDataInt("payment")

 _tmp:free()
 if(state) then
 doPlayerSendChannelMessage(cid, "", "Your guild balance is too low to accept this invitation.", TALKTYPE_CHANNEL_W, 0)
 return true
 end

 db.executeQuery("UPDATE `guilds` SET `balance` = `balance` - " .. tmp:getDataInt("payment") .. " WHERE `id` = " .. guild)
 end

 query = "UPDATE `guild_wars` SET "
 local msg = "accepted " .. enemyName .. " invitation to war."
 if(t[1] == "reject") then
 query = query .. "`end` = " .. os.time() .. ", `status` = 2"
 msg = "rejected " .. enemyName .. " invitation to war."
 elseif(t[1] == "cancel") then
 query = query .. "`end` = " .. os.time() .. ", `status` = 3"
 msg = "canceled invitation to a war with " .. enemyName .. "."
 else
 query = query .. "`begin` = " .. os.time() .. ", `end` = " .. (tmp:getDataInt("end") > 0 and (os.time() + ((tmp:getDataInt("begin") - tmp:getDataInt("end")) / 86400)) or 0) .. ", `status` = 1"
 end

 query = query .. " WHERE `id` = " .. tmp:getDataInt("id")
 if(t[1] == "accept") then
 doGuildAddEnemy(guild, enemy, tmp:getDataInt("id"), WAR_GUILD)
 doGuildAddEnemy(enemy, guild, tmp:getDataInt("id"), WAR_ENEMY)
 end

 tmp:free()
 db.executeQuery(query)
 doBroadcastMessage(getPlayerGuildName(cid) .. " has " .. msg, MESSAGE_EVENT_ADVANCE)
 return true
 end

 if(t[1] == "invite") then
 local str = ""
 tmp = db.getResult("SELECT `guild_id`, `status` FROM `guild_wars` WHERE `guild_id` IN (" .. guild .. "," .. enemy .. ") AND `enemy_id` IN (" .. enemy .. "," .. guild .. ") AND `status` IN (0, 1)")
 if(tmp:getID() ~= -1) then
 if(tmp:getDataInt("status") == 0) then
 if(tmp:getDataInt("guild_id") == guild) then
 str = "You have already invited " .. enemyName .. " to war."
 else
 str = enemyName .. " have already invited you to war."
 end
 else
 str = "You are already on a war with " .. enemyName .. "."
 end

 tmp:free()
 end

 if(str ~= "") then
 doPlayerSendChannelMessage(cid, "", str, TALKTYPE_CHANNEL_W, 0)
 return true
 end

 local frags = tonumber(t[3])
 if(frags ~= nil) then
 frags = math.max(10, math.min(1000, frags))
 else
 frags = 100
 end

 local payment = tonumber(t[4])
 if(payment ~= nil) then
 payment = math.max(100000, math.min(1000000000, payment))
 tmp = db.getResult("SELECT `balance` FROM `guilds` WHERE `id` = " .. guild)

 local state = tmp:getID() < 0 or tmp:getDataInt("balance") < payment
 tmp:free()
 if(state) then
 doPlayerSendChannelMessage(cid, "", "Your guild balance is too low for such payment.", TALKTYPE_CHANNEL_W, 0)
 return true
 end

 db.executeQuery("UPDATE `guilds` SET `balance` = `balance` - " .. payment .. " WHERE `id` = " .. guild)
 else
 payment = 0
 end

 local begining, ending = os.time(), tonumber(t[5])
 if(ending ~= nil and ending ~= 0) then
 ending = begining + (ending * 86400)
 else
 ending = 0
 end

 db.executeQuery("INSERT INTO `guild_wars` (`guild_id`, `enemy_id`, `begin`, `end`, `frags`, `payment`) VALUES (" .. guild .. ", " .. enemy .. ", " .. begining .. ", " .. ending .. ", " .. frags .. ", " .. payment .. ");")
 doBroadcastMessage(getPlayerGuildName(cid) .. " has invited " .. enemyName .. " to war till " .. frags .. " frags.", MESSAGE_EVENT_ADVANCE)
 return true
 end

 if(not isInArray({"end", "finish"}, t[1])) then
 return false
 end

 local status = (t[1] == "end" and 1 or 4)
 tmp = db.getResult("SELECT `id` FROM `guild_wars` WHERE `guild_id` = " .. guild .. " AND `enemy_id` = " .. enemy .. " AND `status` = " .. status)
 if(tmp:getID() ~= -1) then
 local query = "UPDATE `guild_wars` SET `end` = " .. os.time() .. ", `status` = 5 WHERE `id` = " .. tmp:getDataInt("id")
 tmp:free()
 doGuildRemoveEnemy(guild, enemy)
 doGuildRemoveEnemy(enemy, guild)

 db.executeQuery(query)
 doBroadcastMessage(getPlayerGuildName(cid) .. " has " .. (status == 4 and "mend fences" or "ended up a war") .. " with " .. enemyName .. ".", MESSAGE_EVENT_ADVANCE)
 return true
 end

 if(status == 4) then
 doPlayerSendChannelMessage(cid, "", "Currently there's no pending war truce from " .. enemyName .. ".", TALKTYPE_CHANNEL_W, 0)
 return true
 end

 tmp = db.getResult("SELECT `id`, `end` FROM `guild_wars` WHERE `guild_id` = " .. enemy .. " AND `enemy_id` = " .. guild .. " AND `status` = 1")
 if(tmp:getID() ~= -1) then
 if(tmp:getDataInt("end") > 0) then
 tmp:free()
 doPlayerSendChannelMessage(cid, "", "You cannot request ending for war with " .. enemyName .. ".", TALKTYPE_CHANNEL_W, 0)
 return true
 end

 local query = "UPDATE `guild_wars` SET `status` = 4, `end` = " .. os.time() .. " WHERE `id` = " .. tmp:getDataInt("id")
 tmp:free()

 db.executeQuery(query)
 doBroadcastMessage(getPlayerGuildName(cid) .. " has signed an armstice declaration on a war with " .. enemyName .. ".", MESSAGE_EVENT_ADVANCE)
 return true
 end

 doPlayerSendChannelMessage(cid, "", "Currently there's no active war with " .. enemyName .. ".", TALKTYPE_CHANNEL_W, 0)
 return true
end

y en talkactions.xml agregan esto:

Código:
<talkaction words="/war" channel="0" event="script" value="war.lua"/>

en globalevents/scripts agregan un lua llamado init.lua y agregan lo siguiente:

Código:
local config = {
 creationTime = 7 * 86400,
 checkTime = 7 * 86400,
 viceCount = 4,
 memberCount = 10
}

function onStartup()
 local data, time, result = {}, os.time(), db.getResult("SELECT `id`, `ownerid`, `creationdata`, `checkdata` FROM `guilds` WHERE `world_id` = " .. getConfigValue('worldId') .. ";")
 if(result:getID() ~= -1) then
 repeat
 data[result:getDataInt("id")] = {result:getDataInt("ownerid"), result:getDataInt("creationdata"), result:getDataInt("checkdata")}
 until not(result:next())
 result:free()
 end

 for id, v in ipairs(data) do
 local owner, created, check = v[1], v[2], v[3]
 if(created < (time - config.creationTime)) then
 result = db.getResult("SELECT `id`, `level` FROM `guild_ranks` WHERE `guild_id` = " .. id .. ";")
 if(result:getID() ~= -1) then
 local rank, ranks = 0, {}
 repeat
 ranks[result:getDataInt("id")] = result:getDataInt("level")
 if(result:getDataInt("level") == 1) then
 rank = result:getDataInt("id")
 end
 until not(result:next())
 result:free()

 local members = {0, 0, 0, 0}
 for k, v in ipairs(ranks) do
 result = db.getResult("SELECT COUNT(`id`) AS `count` FROM `players` WHERE `rank_id` = " .. k .. ";")
 if(result:getID() ~= -1) then
 members[v] = members[v] + result:getDataInt("count")
 result:free()
 end

 if(v == 2) then
 result = db.getResult("SELECT `p`.`id` FROM `players` p LEFT JOIN `accounts` a ON `p`.`account_id` = `a`.`id` WHERE `p`.`rank_id` = " .. k .. " AND (`a`.`premdays` = 0 OR (`a`.`lastday` + (`a`.`premdays` * 86400) <= 0));")
 if(result:getID() ~= -1) then
 local demote = ""
 repeat
 demote = demote .. result:getDataInt("id") .. ","
 members[2] = members[2] - 1
 members[1] = members[1] + 1
 until not(result:next())
 result:free()

 if(demote ~= "" and rank ~= 0) then
 db.executeQuery("UPDATE `players` SET `rank_id` = " .. rank .. " WHERE `id` IN (" .. demote:sub(1, -2) .. ");")
 end
 end
 end
 end

 for i = 1, 3 do
 members[4] = members[4] + members[i]
 end

 if(members[2] < config.viceCount or members[4] < config.memberCount) then
 if(check == 0) then
 db.executeQuery("UPDATE `guilds` SET `checkdata` = " .. (time + config.checkTime) .. " WHERE `id` = " .. id .. ";")
 elseif(check < time) then
 local tmp = ""
 for rank, _ in ipairs(ranks) do
 tmp = tmp .. rank .. ","
 end

 db.executeQuery("UPDATE `players` SET `rank_id` = 0, `guildnick` = '', `guildjoin` = 0 WHERE `rank_id` IN (" .. tmp:sub(1, -2) .. ");")
 db.executeQuery("DELETE FROM `guilds` WHERE `id` = " .. id .. ";")
 end
 end
 end
 end
 end

 db.executeQuery("UPDATE `players` SET `online` = 0 WHERE `world_id` = " .. getConfigValue('worldId') .. " AND `online` > 0;")
 db.executeQuery("DELETE FROM `guild_wars` WHERE `status` = 0 AND `begin` < " .. (os.time() - 2 * 86400) .. ";")
 db.executeQuery("UPDATE `guild_wars` SET `status` = 5, `end` = " .. os.time() .. " WHERE `status` = 1 AND `end` > 0 AND `end` < " .. os.time() .. ";")
 return true
end

function onGlobalSave()
 if(getGameState() ~= GAMESTATE_CLOSING) then
 return onStartup()
 end

 return true
end

y en globalevents.xml agregan esto:

Código:
<globalevent name="init" type="startup" event="script" value="init.lua"/>

    Temas similares

    -

    Fecha y hora actual: Mar Sep 25, 2018 1:46 pm