• 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!

TFS 1.2 (8.0 Ninjalulz) ban question

Solution
nvm fixed with this creaturescripts/scripts/playerdeath.lua

Lua:
local deathListEnabled = true
local maxDeathRecords = 5
local killsToBan = 6
local killsBanLenght = 3

function onDeath(player, corpse, killer, mostDamageKiller, unjustified, mostDamageUnjustified)
    local playerId = player:getId()
    if nextUseStaminaTime[playerId] ~= nil then
        nextUseStaminaTime[playerId] = nil
    end

    player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You are dead.")

    local byPlayer = 0
    local killerName
    if killer ~= nil then
        if killer:isPlayer() then
            byPlayer = 1
        else
            local master = killer:getMaster()
            if master and master ~= killer and master:isPlayer() then
                killer = master...
I haven't tried this myself, but why not use an onThink in creaturescripts and register it with the player in login.lua then write a script which auto bans the player when they have exceeded the limit of player killings and save it in creaturescripts/scripts/? You will also have to register it in creaturescripts.xml.

An example of this would be in creaturescripts.xml
HTML:
<event type="think" name="AutoBan" script="autoban.lua" />
Somewhere inside of onLogin in login.lua
Lua:
player:registerEvent("AutoBan")
Then your script, sorry I can't write it right now for you i have to get ready for work :(
 
nvm fixed with this creaturescripts/scripts/playerdeath.lua

Lua:
local deathListEnabled = true
local maxDeathRecords = 5
local killsToBan = 6
local killsBanLenght = 3

function onDeath(player, corpse, killer, mostDamageKiller, unjustified, mostDamageUnjustified)
    local playerId = player:getId()
    if nextUseStaminaTime[playerId] ~= nil then
        nextUseStaminaTime[playerId] = nil
    end

    player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You are dead.")

    local byPlayer = 0
    local killerName
    if killer ~= nil then
        if killer:isPlayer() then
            byPlayer = 1
        else
            local master = killer:getMaster()
            if master and master ~= killer and master:isPlayer() then
                killer = master
                byPlayer = 1
            end
        end
        killerName = killer:getName()
    else
        killerName = "field item"
    end

    local byPlayerMostDamage = 0
    local mostDamageKillerName
    if mostDamageKiller ~= nil then
        if mostDamageKiller:isPlayer() then
            byPlayerMostDamage = 1
        else
            local master = mostDamageKiller:getMaster()
            if master and master ~= mostDamageKiller and master:isPlayer() then
                mostDamageKiller = master
                byPlayerMostDamage = 1
            end
        end
        mostDamageName = mostDamageKiller:getName()
    else
        mostDamageName = "field item"
    end

    local playerGuid = player:getGuid()
    db.query("INSERT INTO `player_deaths` (`player_id`, `time`, `level`, `killed_by`, `is_player`, `mostdamage_by`, `mostdamage_is_player`, `unjustified`, `mostdamage_unjustified`) VALUES (" .. playerGuid .. ", " .. os.time() .. ", " .. player:getLevel() .. ", " .. db.escapeString(killerName) .. ", " .. byPlayer .. ", " .. db.escapeString(mostDamageName) .. ", " .. byPlayerMostDamage .. ", " .. (unjustified and 1 or 0) .. ", " .. (mostDamageUnjustified and 1 or 0) .. ")")
    local resultId = db.storeQuery("SELECT `player_id` FROM `player_deaths` WHERE `player_id` = " .. playerGuid)

    local deathRecords = 0
    local tmpResultId = resultId
    while tmpResultId ~= false do
        tmpResultId = result.next(resultId)
        deathRecords = deathRecords + 1
    end

    if resultId ~= false then
        result.free(resultId)
    end

    local limit = deathRecords - maxDeathRecords
    if limit > 0 then
        db.asyncQuery("DELETE FROM `player_deaths` WHERE `player_id` = " .. playerGuid .. " ORDER BY `time` LIMIT " .. limit)
    end

    if byPlayer == 1 then
        local targetGuild = player:getGuild()
        targetGuild = targetGuild and targetGuild:getId() or 0
        if targetGuild ~= 0 then
            local killerGuild = killer:getGuild()
            killerGuild = killerGuild and killerGuild:getId() or 0
            if killerGuild ~= 0 and targetGuild ~= killerGuild and isInWar(playerId, killer:getId()) then
                local warId = false
                resultId = db.storeQuery("SELECT `id` FROM `guild_wars` WHERE `status` = 1 AND ((`guild1` = " .. killerGuild .. " AND `guild2` = " .. targetGuild .. ") OR (`guild1` = " .. targetGuild .. " AND `guild2` = " .. killerGuild .. "))")
                if resultId ~= false then
                    warId = result.getDataInt(resultId, "id")
                    result.free(resultId)
                end

                if warId ~= false then
                    db.asyncQuery("INSERT INTO `guildwar_kills` (`killer`, `target`, `killerguild`, `targetguild`, `time`, `warid`) VALUES (" .. db.escapeString(killerName) .. ", " .. db.escapeString(player:getName()) .. ", " .. killerGuild .. ", " .. targetGuild .. ", " .. os.time() .. ", " .. warId .. ")")
                end
            end
        end

        local skullTime = killer:getSkullTime()
        if skullTime > 0 then
            local kills = math.ceil(skullTime / configManager.getNumber(configKeys.FRAG_TIME))
            if kills >= killsToBan then
                local timeNow = os.time()
                db.query("INSERT INTO `account_bans` (`account_id`, `reason`, `banned_at`, `expires_at`, `banned_by`) VALUES (" .. killer:getAccountId() .. ", " .. db.escapeString("Excessive Unjustified Player Killing.") .. ", " .. timeNow .. ", " .. timeNow + (killsBanLenght * 86400) .. ", 1)")
                killer:getPosition():sendMagicEffect(CONST_ME_MAGIC_RED)
                killer:remove()
            end
        end
    end
end



thx for the help otland <3
 
Last edited:
Solution
What do I need to change in this script to make the player be banned instead of the account?
i'm using Gesior.pl commit
add player bans · gesior/forgottenserver@a53a65a (https://github.com/gesior/forgottenserver/commit/a53a65a14f007d5e38df2a644f687a77568b21d1)



Lua:
        local skullTime = killer:getSkullTime()
        if skullTime > 0 then
            local kills = math.ceil(skullTime / configManager.getNumber(configKeys.FRAG_TIME))
            if kills >= killsToBan then
                local timeNow = os.time()
                db.query("INSERT INTO `account_bans` (`account_id`, `reason`, `banned_at`, `expires_at`, `banned_by`) VALUES (" .. killer:getAccountId() .. ", " .. db.escapeString("Excessive Unjustified Player Killing.") .. ", " .. timeNow .. ", " .. timeNow + (killsBanLenght * 86400) .. ", 1)")
                killer:getPosition():sendMagicEffect(CONST_ME_MAGIC_RED)
                killer:remove()
 
You will need id, player_id, reason, banned_at, expires_at, banned_by:
So you can do it by switching into right table from account_bans to player_bans, changing killer:getAccountId() to killer:getGuid(). As id column is AUTO_INCREMENT, you won't need this inside lua.

Lua:
db.query("INSERT INTO `player_bans ` (`player_id`, `reason`, `banned_at`, `expires_at`, `banned_by`) VALUES (" .. killer:getGuid() .. ", " .. db.escapeString("Excessive Unjustified Player Killing.") .. ", " .. timeNow .. ", " .. timeNow + (killsBanLenght * 86400) .. ", 1)")

@Gesior.pl I would have changed the function about isPlayerBanned some, as there is no option for system ban such as "Excessive Unjustified Player Killing". This one is a system ban and won't need banned_by, users will have to create an player with id 0 so it shows correct within login try. What if you just remove:
Code:
`banned_by`, (SELECT `name` FROM `players` WHERE `id` = `banned_by`) AS `name` FROM `player_bans` WHERE `player_id` = " << playerId << " AND
from query in IOBan, and change
Code:
banInfo.bannedBy = result->getString("name");
to
Code:
banInfo.bannedBy = "[SYSTEM]";
Something like this? Not sure, haven't tested as I have no msvc here, but should I guess?
 
Last edited:
You will need id, player_id, reason, banned_at, expires_at, banned_by:
So you can do it by switching into right table from account_bans to player_bans, changing killer:getAccountId() to killer:getGuid(). As id column is AUTO_INCREMENT, you won't need this inside lua.

Lua:
db.query("INSERT INTO `player_bans ` (`player_id`, `reason`, `banned_at`, `expires_at`, `banned_by`) VALUES (" .. killer:getGuid() .. ", " .. db.escapeString("Excessive Unjustified Player Killing.") .. ", " .. timeNow .. ", " .. timeNow + (killsBanLenght * 86400) .. ", 1)")

@Gesior.pl I would have changed the function about isPlayerBanned some, as there is no option for system ban such as "Excessive Unjustified Player Killing". This one is a system ban and won't need banned_by, users will have to create an player with id 0 so it shows correct within login try. What if you just remove:
Code:
`banned_by`, (SELECT `name` FROM `players` WHERE `id` = `banned_by`) AS `name` FROM `player_bans` WHERE `player_id` = " << playerId << " AND
from query in IOBan, and change
Code:
banInfo.bannedBy = result->getString("name");
to
Code:
banInfo.bannedBy = "[SYSTEM]";
Something like this? Not sure, haven't tested as I have no msvc here, but should I guess?
You can also make 'banned_by' nullable. Then value loaded as name from database will be null. In code add 'if' name is empty, then show 'SYSTEM' and it will work with GM name and with system name.
 
Back
Top