• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

[8.6x] OTServ 0.6.4 (Cast System)

@Nottinghster i just added the guild war system but i was looking in the github i didnt find or see the command or talkaction for it?
Lua:
function checkExhausted(cid, storage, seconds)
local v = exhaustion.get(cid, storage)
    if(not v) then
        exhaustion.set(cid, storage, seconds)
    else
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Please wait " .. v .. " seconds before trying this command again.")
    return false
end
    return true
end

function onSay(cid, words, param)
    if(not checkExhausted(cid, 674, 2)) then
        return false
    end
    local guild = getPlayerGuildId(cid)
    if(not guild or getPlayerGuildLevel(cid) < 3) then
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You are not in a guild or you are not the leader.")
        return false
    end

    local t = string.explode(param, ",")
    if(not t[2]) then
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Not enough param(s).")
        return false
    end

    local enemy = getGuildId(t[2])
    if(enemy == false) then
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Guild \"" .. t[2] .. "\" does not exists.")
        return false
    end

    if(enemy == guild) then
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You cannot perform war action against your own guild.")
        return false
    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 t[1] == "accept" or t[1] == "reject" or t[1] == "cancel" then
        local query = "`guild_id` = " .. enemy .. " AND `opponent_id` = " .. guild
        if(t[1] == "cancel") then
            query = "`guild_id` = " .. guild .. " AND `opponent_id` = " .. enemy
        end

        tmp = db.getResult("SELECT `id`, `declaration_date`, `end_date`, `guild_fee` FROM `guild_wars` WHERE " .. query .. " AND `status` = -1")
        if(tmp:getID() == -1) then
            doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Currently there's no pending invitation for a war with " .. enemyName .. ".")
            return false
        end

        query = "UPDATE `guild_wars` SET "
        local msg = "accepted Guild " .. enemyName .. " invitation to war."
        if(t[1] == "reject") then
            query = "DELETE FROM `guild_wars`"
            msg = "rejected Guild " .. enemyName .. " invitation to war."
        elseif(t[1] == "cancel") then
            query = "DELETE FROM `guild_wars`"
            msg = "canceled invitation to a war with Guild " .. enemyName .. "."
        else
            query = query .. "`declaration_date` = " .. os.time() .. ", `status` = 1"
        end

        query = query .. " WHERE `id` = " .. tmp:getDataInt("id")
        db.executeQuery(query)
        if(t[1] == "accept") then 
            if doUpdateGuildWar(tmp:getDataInt("id")) then
                doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Guild War started!')
            else
                doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Sorry but you or your opponent doesnt\'t have enough cash on bank')
            return false
            end
         end
        tmp:free()     
        doBroadcastMessage("Guild ".. getPlayerGuildName(cid) .. " has " .. msg, MESSAGE_EVENT_ADVANCE)
        return false
    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 `opponent_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 Guild " .. enemyName .. " to war."
                else
                    str = "Guild ".. enemyName .. " have already invited you to war."
                end
            else
                str = "You are already on a war with Guild " .. enemyName .. "."
            end
            tmp:free()
        end

        if(str ~= "") then
            doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, str)
            return false
        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(0, math.min(1000000000, payment))
        else
            payment = 0
        end
        local begining, ending = os.time(), tonumber(t[5])
        if(ending ~= nil and ending ~= 0 and ending <= 31) then
            ending = begining + (ending * 86400)
        else
            ending = begining + (7 * 86400)
        end
       
        db.executeQuery("INSERT INTO `guild_wars` (`guild_id`, `opponent_id`, `declaration_date`, `end_date`, `frag_limit`, `guild_fee`, `opponent_fee`, `status`) VALUES (" .. guild .. ", " .. enemy .. ", " .. begining .. ", " .. ending .. ", " .. frags .. ", " .. payment .. ", " .. payment .. ", -1);")
        doBroadcastMessage("Guild ".. getPlayerGuildName(cid) .. " has invited Guild " .. enemyName .. " to war until " .. frags .. " frags.", MESSAGE_EVENT_ADVANCE)
        return false
    end

    doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Currently there's no active war with " .. enemyName .. ".")
    return true
end
 
Lua:
function checkExhausted(cid, storage, seconds)
local v = exhaustion.get(cid, storage)
    if(not v) then
        exhaustion.set(cid, storage, seconds)
    else
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Please wait " .. v .. " seconds before trying this command again.")
    return false
end
    return true
end

function onSay(cid, words, param)
    if(not checkExhausted(cid, 674, 2)) then
        return false
    end
    local guild = getPlayerGuildId(cid)
    if(not guild or getPlayerGuildLevel(cid) < 3) then
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You are not in a guild or you are not the leader.")
        return false
    end

    local t = string.explode(param, ",")
    if(not t[2]) then
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Not enough param(s).")
        return false
    end

    local enemy = getGuildId(t[2])
    if(enemy == false) then
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Guild \"" .. t[2] .. "\" does not exists.")
        return false
    end

    if(enemy == guild) then
        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You cannot perform war action against your own guild.")
        return false
    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 t[1] == "accept" or t[1] == "reject" or t[1] == "cancel" then
        local query = "`guild_id` = " .. enemy .. " AND `opponent_id` = " .. guild
        if(t[1] == "cancel") then
            query = "`guild_id` = " .. guild .. " AND `opponent_id` = " .. enemy
        end

        tmp = db.getResult("SELECT `id`, `declaration_date`, `end_date`, `guild_fee` FROM `guild_wars` WHERE " .. query .. " AND `status` = -1")
        if(tmp:getID() == -1) then
            doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Currently there's no pending invitation for a war with " .. enemyName .. ".")
            return false
        end

        query = "UPDATE `guild_wars` SET "
        local msg = "accepted Guild " .. enemyName .. " invitation to war."
        if(t[1] == "reject") then
            query = "DELETE FROM `guild_wars`"
            msg = "rejected Guild " .. enemyName .. " invitation to war."
        elseif(t[1] == "cancel") then
            query = "DELETE FROM `guild_wars`"
            msg = "canceled invitation to a war with Guild " .. enemyName .. "."
        else
            query = query .. "`declaration_date` = " .. os.time() .. ", `status` = 1"
        end

        query = query .. " WHERE `id` = " .. tmp:getDataInt("id")
        db.executeQuery(query)
        if(t[1] == "accept") then
            if doUpdateGuildWar(tmp:getDataInt("id")) then
                doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Guild War started!')
            else
                doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Sorry but you or your opponent doesnt\'t have enough cash on bank')
            return false
            end
         end
        tmp:free()    
        doBroadcastMessage("Guild ".. getPlayerGuildName(cid) .. " has " .. msg, MESSAGE_EVENT_ADVANCE)
        return false
    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 `opponent_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 Guild " .. enemyName .. " to war."
                else
                    str = "Guild ".. enemyName .. " have already invited you to war."
                end
            else
                str = "You are already on a war with Guild " .. enemyName .. "."
            end
            tmp:free()
        end

        if(str ~= "") then
            doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, str)
            return false
        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(0, math.min(1000000000, payment))
        else
            payment = 0
        end
        local begining, ending = os.time(), tonumber(t[5])
        if(ending ~= nil and ending ~= 0 and ending <= 31) then
            ending = begining + (ending * 86400)
        else
            ending = begining + (7 * 86400)
        end
      
        db.executeQuery("INSERT INTO `guild_wars` (`guild_id`, `opponent_id`, `declaration_date`, `end_date`, `frag_limit`, `guild_fee`, `opponent_fee`, `status`) VALUES (" .. guild .. ", " .. enemy .. ", " .. begining .. ", " .. ending .. ", " .. frags .. ", " .. payment .. ", " .. payment .. ", -1);")
        doBroadcastMessage("Guild ".. getPlayerGuildName(cid) .. " has invited Guild " .. enemyName .. " to war until " .. frags .. " frags.", MESSAGE_EVENT_ADVANCE)
        return false
    end

    doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Currently there's no active war with " .. enemyName .. ".")
    return true
end
Thanks bro =)
 
@Nottinghster sorry for my ignorance but i did add the talkaction /war and when i type it ingame it dont say nothing i did added to othire sources and it compiles good without any warning and i dont get anything in the console when i type the command
 
There seems to be crash when turning cast off:

Code:
#0  0x000055c2a63350d4 in Player::setCasting (this=0x55c2ab7718a0, c=c@entry=false) at player.cpp:261
#1  0x000055c2a63c4cef in LuaScriptInterface::luaDoPlayerSetCastState (L=0x55c2a7da44a0) at luascript.cpp:11119
#2  0x00007f9c8fc76e84 in ?? () from /usr/lib/liblua.so.5
#3  0x00007f9c8fc7f3bd in ?? () from /usr/lib/liblua.so.5
#4  0x00007f9c8fc76f8c in ?? () from /usr/lib/liblua.so.5
#5  0x00007f9c8fc7655a in ?? () from /usr/lib/liblua.so.5
#6  0x00007f9c8fc770c6 in ?? () from /usr/lib/liblua.so.5
#7  0x00007f9c8fc73d40 in lua_pcall () from /usr/lib/liblua.so.5
#8  0x000055c2a63a27e1 in LuaScriptInterface::callFunction (this=0x55c2a7da3408, nParams=nParams@entry=3,
    getReturnValue=getReturnValue@entry=true) at luascript.cpp:882
#9  0x000055c2a62f5de0 in TalkAction::executeSay (this=0x55c2a8a5a680, player=player@entry=0x55c2ab7718a0, words=...,
    param=...) at talkaction.cpp:373
#10 0x000055c2a62f7cdb in TalkActions::onPlayerSpeak (this=0x55c2a7da33c0, player=player@entry=0x55c2ab7718a0,
    type=type@entry=SPEAK_SAY, words=..., pg=pg@entry=0x0) at talkaction.cpp:250
#11 0x000055c2a62a20e3 in Game::playerSay (this=0x55c2a66695e0 <g_game>, playerId=268490487, channelId=<optimized out>,
    type=SPEAK_SAY, receiver=..., text=..., pg=0x55c2b57a9c00) at game.cpp:3620
#12 0x000055c2a637b4bf in boost::_mfi::mf6<bool, Game, unsigned int, unsigned short, SpeakClasses, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ProtocolGame*>::operator() (a6=<optimized out>, a5=..., a4=..., a3=<optimized out>,
    a2=<optimized out>, a1=<optimized out>, p=<optimized out>, this=<optimized out>)
    at /usr/include/boost/bind/mem_fn_template.hpp:732
#13 boost::_bi::list7<boost::_bi::value<Game*>, boost::_bi::value<unsigned int>, boost::_bi::value<unsigned short>, boost::_bi::value<SpeakClasses>, boost::_bi::value<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::_bi::value<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::_bi::value<ProtocolGame*> >::operator()<bool, boost::_mfi::mf6<bool, Game, unsigned int, unsigned short, SpeakClasses, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ProtocolGame*>, boost::_bi::list0> (a=<synthetic pointer>..., f=..., this=<optimized out>)
    at /usr/include/boost/bind/bind.hpp:666
#14 boost::_bi::bind_t<bool, boost::_mfi::mf6<bool, Game, unsigned int, unsigned short, SpeakClasses, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ProtocolGame*>, boost::_bi::list7<boost::_bi::value<Game*>, boost::_bi::value<unsigned int>, boost::_bi::value<unsigned short>, boost::_bi::value<SpeakClasses>, boost::_bi::value<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::_bi::value<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::_bi::value<ProtocolGame*> > >::operator() (this=<optimized out>) at /usr/include/boost/bind/bind.hpp:1294
#15 boost::detail::function::void_function_obj_invoker0<boost::_bi::bind_t<bool, boost::_mfi::mf6<bool, Game, unsigned int, unsigned short, SpeakClasses, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ProtocolGame*>, boost::_bi::list7<boost::_bi::value<Game*>, boost::_bi::value<unsigned int>, boost::_bi::value<unsigned short>, boost::_bi::value<SpeakClasses>, boost::_bi::value<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::_bi::value<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::_bi::value<ProtocolGame*> > >, void>::invoke (
    function_obj_ptr=...) at /usr/include/boost/function/function_template.hpp:159
#16 0x000055c2a62ff740 in boost::function0<void>::operator() (this=0x55c36222c1a8)
    at /usr/include/boost/function/function_template.hpp:760
#17 Task::operator() (this=0x55c36222c1a0) at tasks.h:44
#18 Dispatcher::dispatcherThread (p=0x55c2a6669520 <g_dispatcher>) at tasks.cpp:87
#19 0x00007f9c8f30b9fd in ?? () from /usr/lib/libboost_thread-mt.so.1.66.0
#20 0x00007f9c8fee56c2 in ?? () from /lib/ld-musl-x86_64.so.1
#21 0x0000000000000000 in ?? ()

Might be of newer boost?
 
Back
Top