<?xml version="1.0" encoding="UTF-8"?>
<!-- To use this system, execute query:
ALTER TABLE `players` ADD COLUMN `rep` INT( 11 ) NOT NULL DEFAULT '0' COMMENT 'Cyber''s REPSystem © OTLand.net';
-->
<mod name="Cyber's REP System" revision="6.1" author="Cybermaster" web="otland.net" enabled="yes"
released="August2010" credits="Sync;Shawak;Chris;nsanee"><config name="repSystem"><![CDATA[
rep = {
--[[ CONFIG ]]--
interval = 3 * 60, --This is [3] hours, in minutes. Time to be online to gain [1] Opinion Point.
minLevel = 20, --From this level onwards player can use commands
pvpLevel = 30, --Minimum level for PVP Rep'ing
required = 5, --Opinion points required to repute with talkaction command
exhaustion = 60, --Seconds to wait to be able to use !rep command again
power = false, --Use RepPower Feature? OPTIONS 1:true 2:false
--[[ STORAGES ]]--
exhaust = 5045, --Exhaustion for !rep command.
lastName = 5036, --Used to store the last repped's GUID
lastKilled = 5037, --Used to store the last killed's GUID
opinion = 5038, --Used to store the opinion points
online = 5039, --Used to store online minutes
autoOpinion = function(cid)
if not isPlayer(cid) then
return true
end
doCreatureSetStorage(cid, rep.online, getCreatureStorage(cid, rep.online)+1)
if getCreatureStorage(cid, rep.online) >= rep.interval then
doCreatureSetStorage(cid, rep.online, 0)
doSendAnimatedText(getThingPos(cid), '+1', TEXTCOLOR_LIGHTBLUE)
doCreatureSetStorage(cid, rep.opinion, getCreatureStorage(cid, rep.opinion)+1)
doPlayerSendTextMessage(cid, 27, 'You have just obtained an opinion point.')
end
repEvent = addEvent(rep.autoOpinion, 60 * 1000, cid)
end,
getArticle = function(cid, uppercase)
return (getPlayerSex(cid) == 0 and (uppercase and 'Sh' or 'sh') or (uppercase and 'H' or 'h')) .. 'e'
end,
getPoints = function(cid)
local result = db.getResult('SELECT `rep` FROM `players` WHERE `id` = '.. getPlayerGUID(cid))
local data = result:getDataInt('rep')
result:free()
return data
end,
getPower = function(points)
local power = {{0,1},{300,2},{500,3},{1000,4},{1500,5},{2000,6},{5000,7}}
table.sort(power, function(a, b) return a[1] > b[1] end)
for _, t in ipairs(power) do
if math.abs(points) >= t[1] then
return t[2]
end
end
return power[1][2]
end,
getRank = function(points)
local ranks = {
{-5000, 'Power Abuser (*<<==========)'},
{-2000, 'Evil (=*<==========)'},
{-1500, 'Slayer (==*==========)'},
{-1000, 'Killer (===|=========)'},
{-500, 'Villain (====|========)'},
{-300, 'Creeping (=====|=======)'},
{0, 'Unknown (======|======)'},
{300, 'Avowed (=======|=====)'},
{500, 'Popular (========|====)'},
{1000, 'Hailed (=========|===)'},
{1500, 'Acclaimed (==========+==)'},
{2000, 'Hero (==========>+=)'},
{5000, 'Legend (==========>>+)'}
}
if points > -1 then
table.sort(ranks, function(a, b) return a[1] > b[1] end)
for _, t in ipairs(ranks) do if points >= t[1] then return t[2] end end
else
table.sort(ranks, function(a, b) return a[1] < b[1] end)
for _, t in ipairs(ranks) do if points <= t[1] then return t[2] end end
end
return ranks[1][2]
end,
set = function(cid, points)
db.executeQuery('UPDATE `players` SET `rep` = ' .. points .. ' WHERE `id` = ' .. getPlayerGUID(cid))
end,
add = function(cid, amount, color)
db.executeQuery('UPDATE `players` SET `rep` = `rep` + ' .. amount .. ' WHERE `id` = ' .. getPlayerGUID(cid))
doSendAnimatedText(getThingPos(cid), '+REP', color and color or math.random(255))
doPlayerSendCancel(cid, 'You have just been hailed and gained '.. amount ..' reputation points.')
end,
remove = function(cid, amount, color)
db.executeQuery('UPDATE `players` SET `rep` = `rep` - ' .. amount .. ' WHERE `id` = ' .. getPlayerGUID(cid))
doSendAnimatedText(getThingPos(cid), '-REP', color and color or math.random(255))
doPlayerSendCancel(cid, 'You have just been repudiated and lost '.. amount ..' reputation points.')
end,
format = function(str)
str = tostring(str):reverse()
str = str:gsub("(%d)(%d)(%d)", '%1%2%3' .. (',' or ' '), math.ceil(str:len() / 3)-1)
return str:reverse()
end,
}
]]></config>
<event type="login" name="repRegister" event="script"><![CDATA[
domodlib('repSystem')
function onLogin(cid)
repEvent = addEvent(rep.autoOpinion, 60 * 1000, cid)
if getCreatureStorage(cid, rep.opinion) == -1 then
doCreatureSetStorage(cid, rep.online, 0)
doCreatureSetStorage(cid, rep.opinion, 0)
end
registerCreatureEvent(cid, "repLook")
registerCreatureEvent(cid, "repKill")
registerCreatureEvent(cid, "repMonster")
return true
end
]]></event>
<event type="logout" name="repCancel" event="script"><![CDATA[
domodlib('repSystem')
function onLogout(cid)
stopEvent(repEvent)
return true
end
]]></event>
<event type="look" name="repLook" event="script"><![CDATA[
domodlib('repSystem')
function onLook(cid, thing, position, lookDistance)
if isPlayer(thing.uid) and thing.uid ~= cid then
doPlayerSetSpecialDescription(thing.uid,'\n'.. rep.getArticle(thing.uid, true)..' is ' .. rep.getRank(rep.getPoints(thing.uid)) ..'.')
return true
elseif thing.uid == cid then
local string = 'You see yourself.'
if getPlayerFlagValue(cid, PLAYERFLAG_SHOWGROUPINSTEADOFVOCATION) then
string = string..' You are '.. getPlayerGroupName(cid) ..'.'
elseif getPlayerVocation(cid) ~= 0 then
string = string..' You are '.. getPlayerVocationName(cid) ..'.'
else
string = string..' You have no vocation.'
end
string = string..' You are '.. rep.getRank(rep.getPoints(cid)) ..'.'
if getPlayerNameByGUID(getPlayerPartner(cid), false, false) ~= nil then
string = string..' You are '.. (getPlayerSex(cid) == 0 and 'wife' or 'husband') ..' of '.. getPlayerNameByGUID(getPlayerPartner(cid)) ..'.'
end
if getPlayerGuildId(cid) > 0 then
string = string..' You are ' .. (getPlayerGuildRank(cid) == '' and 'a member' or getPlayerGuildRank(cid)) ..' of the '.. getPlayerGuildName(cid)
string = getPlayerGuildNick(cid) ~= '' and string..' ('.. getPlayerGuildNick(cid) ..').' or string..'.'
end
if getPlayerFlagValue(cid, PLAYERCUSTOMFLAG_CANSEECREATUREDETAILS) then
string = string..'\nHealth: ['.. getCreatureHealth(cid) ..' / '.. getCreatureMaxHealth(cid) ..'], Mana: ['.. getCreatureMana(cid) ..' / '.. getCreatureMaxMana(cid) ..'].'
string = string..'\nIP: '.. doConvertIntegerToIp(getPlayerIp(cid)) ..'.'
end
if getPlayerFlagValue(cid, PLAYERCUSTOMFLAG_CANSEEPOSITION) then
string = string..'\nPosition: [X:'.. position.x..'] [Y:'.. position.y..'] [Z:'.. position.z..'].'
end
doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, string)
return false
end
return true
end]]>
</event>
<event type="kill" name="repKill" event="script"><![CDATA[
domodlib('repSystem')
local t = {
[SKULL_WHITE] = 15,
[SKULL_RED] = 20,
[SKULL_BLACK] = 40,
[SKULL_NONE] = -30,
}
function onKill(cid, target, lastHit)
if isPlayer(cid) and isPlayer(target) and getPlayerIp(cid) ~= getPlayerIp(target) and getCreatureStorage(cid, rep.lastKilled) ~= getPlayerGUID(target) and not getTileInfo(getThingPos(cid)).nopvp or not getTileInfo(getThingPos(cid)).optional then
--THE KILLER
if t[getCreatureSkullType(target)] and getPlayerLevel(target) >= rep.pvpLevel then
doSendAnimatedText(getThingPos(cid), getCreatureSkullType(target) == 0 and '-REP' or '+REP', math.random(255))
doCreatureSetStorage(cid, rep.lastKilled, getPlayerGUID(target))
rep.set(cid, rep.getPoints(cid)+t[getCreatureSkullType(target)])
doPlayerSendCancel(cid, 'You '.. (getCreatureSkullType(target) == 0 and 'lose' or 'gain') ..' reputation because you killed a player.')
end
--THE VICTIM
if rep.getPoints(target) == 0 then
return true
elseif rep.getPoints(target) > 0 then
rep.remove(target, 5, TEXTCOLOR_RED)
doPlayerSendCancel(target, 'You lose reputation because you were killed by a player.')
else
rep.add(target, 5, TEXTCOLOR_LIGHTBLUE)
doPlayerSendCancel(target, 'You lose reputation because you were killed by a player.')
end
end
return true
end]]>
</event>
<event type="kill" name="repMonster" event="script"><![CDATA[
domodlib('repSystem')
local monster = { --add monsters names only in lowercase
['demon'] = 3,
['behemoth'] = 4,
['hellfire fighter'] = 5,
['orshabaal'] = 10,
}
function onKill(cid, target, lastHit)
if isPlayer(cid) and isMonster(target) and monster[getCreatureName(target):lower()] and lastHit then
rep.add(cid, monster[getCreatureName(target):lower()])
end
return true
end]]>
</event>
<talkaction log="yes" words="/hail;/fuck;/set" access="4" event="buffer">
<![CDATA[
domodlib('repSystem')
if param == '' then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE,'[REP_SYSTEM] You must write a player\'s name.')
return true
end
local t = string.explode(param, ',')
local tid = getPlayerByNameWildcard(t[1])
if not isPlayer(tid) then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, '[REP_SYSTEM] Player ' .. param .. ' not found.')
return true
end
if not t[2] and isPlayer(tid) then
if words == '/hail' then
rep.add(tid, 5, TEXTCOLOR_TEAL)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, '[REP_SYSTEM] You added +5 rep points to ' .. getPlayerName(tid) .. ', and now ' .. rep.getArticle(tid, false) .. ' has ' .. rep.getPoints(tid) .. ' points.')
return true
end
if words == '/fuck' then
rep.remove(tid, 5, TEXTCOLOR_RED)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, '[REP_SYSTEM] You removed -5 rep points to ' .. getPlayerName(tid) .. ', and now ' .. rep.getArticle(tid, false) .. ' has ' .. rep.getPoints(tid) .. ' points.')
return true
end
end
if t[2] and isInArray({'/set','/hail','fuck'}, words) then
if not tonumber(t[2]) then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, '[REP_SYSTEM] Reputation amount is invalid.')
return true
end
end
if words == '/hail' then
rep.add(tid, t[2], TEXTCOLOR_TEAL)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, '[REP_SYSTEM] You added ' .. t[2] .. ' rep points to ' .. getPlayerName(tid) .. ', and now ' .. rep.getArticle(tid, false) .. ' has ' .. rep.getPoints(tid) .. ' points.')
return true
end
if words == '/fuck' then
rep.remove(tid, t[2], TEXTCOLOR_RED)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, '[REP_SYSTEM] You removed ' .. t[2] .. ' rep points to ' .. getPlayerName(tid) .. ', and now ' .. rep.getArticle(tid, false) .. ' has ' .. rep.getPoints(tid) .. ' points.')
return true
end
if t[2] and words == '/set' then
rep.set(tid, t[2])
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, '[REP_SYSTEM] You have set ' .. getPlayerName(tid) .. '\'s points to ' .. rep.getPoints(tid))
else
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, '[REP_SYSTEM] Absolute reputation amount not specified.')
return true
end
if not t[2] then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, '[REP_SYSTEM] Absolute reputation amount not specified.')
return true
end
return true]]>
</talkaction>
<talkaction words="!rep" event="buffer"><![CDATA[
domodlib('repSystem')
if exhaustion.check(cid, rep.exhaust) then
doPlayerSendCancel(cid, 'You can\'t use this command yet['..exhaustion.get(cid, rep.exhaust)..'].')
return true
else
exhaustion.set(cid, rep.exhaust, rep.exhaustion)
end
if param ~= '' then
local str, value, name, result = '', '',' ', 0, nil
if isInArray({'hero','pos','1','+'}, param) then
str,value,name = '[#]-[Name]-[Points]-[Rank]\n--[Positive Reputation Highscores]--\n','rep','name'
result = db.getResult('SELECT `name`, `rep` FROM `players` WHERE `rep` > 0 AND `name` NOT LIKE "%Sample" AND `name`!= "Account Manager" AND `deleted` = 0 AND `group_id` = 1 ORDER BY `rep` DESC LIMIT 10;')
elseif isInArray({'evil','neg','2','-'}, param) then
str,value,name = '[#]-[Name]-[Points]-[Rank]\n--[Negative Reputation Highscores]--\n','rep','name'
result = db.getResult('SELECT `name`, `rep` FROM `players` WHERE `rep` < 0 AND `name` NOT LIKE "%Sample" AND `name`!= "Account Manager" AND `deleted` = 0 AND `group_id` = 1 ORDER BY `rep` ASC LIMIT 10;')
else
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Unknown parameter, use only +, -, 1, 2.')
return true
end
if isInArray({-1,nil,false,''},result:getID()) then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'No results were found.')
return true
end
local i = 1
while true do
str = str .. '\n ' .. i .. '. ' .. result:getDataString('name') .. ' - [' .. result:getDataInt(value) .. '] - ' .. rep.getRank(result:getDataInt(value))
i = i + 1
if not(result:next()) then
break
end
end
result:free()
doPlayerPopupFYI(cid, str)
return true
elseif param == '' then
local points, action, name = rep.getPoints(cid), false, getPlayerNameByGUID(getCreatureStorage(cid, rep.lastName), false, false)
doPlayerSendTextMessage(cid, 27, 'You have '.. rep.format(points) ..' reputation points. You have ' .. getCreatureStorage(cid, rep.opinion) .. ' opinion points and you will gain one '.. (getCreatureStorage(cid, rep.opinion) > 0 and 'more ' or '') ..'in '.. rep.interval - getCreatureStorage(cid, rep.online) ..' minutes.'.. (rep.power and ' Your Rep Power is ' .. rep.getPower(points) ..'.' or '')..(name ~= nil and ' You last reputed ' .. name .. '.' or ''))
if points > 4999 then --female rep+++ queen outfit
disguise, text, action = getPlayerSex(cid) == 0 and 331 or 332, getPlayerSex(cid) == 0 and 'Queen!!' or 'King!!', true
elseif points > 1999 then --rep++ cm outfit
disguise, text, action = 73, 'Hero!!', true
elseif points > 1499 then --rep+ hero outfit
disguise, text, action = 63, 'Acclaimed!!', true
elseif points < -4999 then --rep*** devil outfit
disguise, text, action = 334, 'P.O.!', true
elseif points < -1999 then --rep** pig outfit
disguise, text, action = 306, 'Evil!!', true
elseif points < -1499 then --rep* orc outfit
disguise, text, action = 5, "Slayer!!", true
end
if action and getCreatureOutfit(cid).lookType ~= disguise then
doSetCreatureOutfit(cid, {lookType = disguise}, -1)
doSendAnimatedText(getThingPos(cid), text, math.random(255))
return true
end
end
return true]]>
</talkaction>
<talkaction words="!hail;!fuck" event="buffer"><![CDATA[
domodlib('repSystem')
if param == '' then
doPlayerSendCancel(cid, 'Command requires a player\'s name.')
return true
end
local target = getPlayerByNameWildcard(param)
if not isPlayer(target) then
doPlayerSendCancel(cid, 'That player does not exist or is offline.')
return true
end
if getPlayerLevel(cid) < rep.minLevel then
doPlayerSendCancel(cid,'You may repute from level ' .. rep.minLevel ..' onwards.')
return true
end
if getPlayerIp(cid) == getPlayerIp(target) then
doPlayerSendCancel(cid, 'You may not repute neither yourself nor anyone in your IP.')
return true
end
if getPlayerGUID(target) == getCreatureStorage(cid, rep.lastName) then
doPlayerSendCancel(cid, 'You may not repute that player two times in a row.')
return true
end
if getCreatureStorage(cid, rep.opinion) < rep.required then
doPlayerSendCancel(cid, 'You do not have enough opinion points to repute.')
return true
end
if words == '!hail' then
doCreatureSetStorage(cid, rep.lastName, getPlayerGUID(target))
doCreatureSetStorage(cid, rep.opinion, getCreatureStorage(cid, rep.opinion)-rep.required)
doPlayerSendCancel(cid, 'You have just reputed ' .. getCreatureName(target) .. '. You have ' .. getCreatureStorage(cid, rep.opinion) .. ' opinion points left.')
rep.add(target, rep.power and rep.getPower(rep.getPoints(cid)) or 5, TEXTCOLOR_LIGHTBLUE)
elseif words == '!fuck' then
doCreatureSetStorage(cid, rep.lastName, getPlayerGUID(target))
doCreatureSetStorage(cid, rep.opinion, getCreatureStorage(cid, rep.opinion)-rep.required)
doPlayerSendCancel(cid, 'You have just reputed ' .. getCreatureName(target) .. '. You have ' .. getCreatureStorage(cid, rep.opinion) .. ' opinion points left.')
rep.remove(target, rep.power and rep.getPower(rep.getPoints(cid)) or 5, TEXTCOLOR_RED)
end
return true
]]></talkaction>
</mod>