Cyber's REPutation System
scripted for TFS 0.3.6 && 0.4
tested with Gesior AAC && ModernAAC
Special Thanks to:
Sync,Shawak,Chris,nsanee,5mok3
All users of this system are advised to update to the last revision.
Rev6.0+6.1 Update Log
-Removed globalevent, it was buggy.
-Added PvP tile check, rep won't be affected when players are killed in that type of tile.
-Code slightly reduced.
-Deprecated Rep getTime function.
-New feature: Opinion Points.
-Function onLook updated, to show your rank at your description.
-Commands !rep && !ranks merged.
-Added exhaustion for !rep command.
-Rep Power Feature is optional, and disabled by default.
-Deprecated Skulls Limitation when killing for rep.
-Added "SameIP" when killing for rep.
-Added "lastKilled" when killing for rep.
-Fixed Rep Highscores talkaction command.
-Added Modern AAC compat., highscores and injection included.
-New Rep Stripes made by 5mok3.
-Pictures for PHP Scripts are hosted at Cyber's tinypic repository.
-Upgraded highscores queries, players with 0 rep are not ranked.
-Enhanced PHP Script for Gesior AAC.
->Features
+ Positive and Negative Ranks
+ Graphic Bar and Names for each rank
+ A player's reputation rank may be seen by clicking on him/her
+ Reputation Outfits for the three best and worst ranks
+ Commands for players to repute other players.
+ Command to see Rep Highscores ingame.
+ Optional Reputation Power Feature, that depends on the player's reputation points.
+ PHP Scripts to show Reputation Highscores.
+ Opinion points that are gained each determined time the player keeps online.
+ Animated text when reputing.
+ Exhaustion when using !rep command.
+ Reputation points are infinite.
+ Fully Customizable System.
+ Extra commands with no limitations for Staff
->Commands
[!rep]
Shows reputation highscores or your reputation info, depending if you param is used or not.
!rep + / !rep 1 -> shows positive rep highscores
!rep - / !rep 2 -> shows negative rep highscores
If param is not used, it'll display your points, opinion points and minutes left to gain more, reputation power and last reputed player. Sets your reputation outfit if you have any.
[!hail]Command to add reputation to a player. The amount depends on your RepPower, though it'll be 5 if RepPower is disabled. You may not hail neither yourself nor anyone from your same IP.->!hail Cyber
[!fuck]Command to remove reputation to a player. The amount depends on your RepPower, though it'll be 5 if RepPower is disabled. You may not repudiate neither yourself nor anyone from your same IP.->!fuck Cyber
[/hail]Staff command to add specified reputation without limitation.
*If you don't type the amount, the default one will be +5 points.
-> /hail Cyber
*If you type the amount, those specified reputation points will be added to target
-> /hail Cyber,96
[/fuck]Staff command to remove specified reputation without limitation.
*If you don't type the amount, the default one will be -5 points.
-> /fuck Cyber
*If you type the amount, those specified reputation points will be removed to target
-> /fuck Cyber,45
[/set] Staff Command to set absolute reputation points, either positive or negative.
-> /set John,-4500
-> /set John,0
-> /set John,1899
->Functions
rep.getPoints(cid) Returns the amount of a player's reputation points
rep.getRank(points) Returns the reputation rank based on the specified reputation points.
rep.set(amount) Sets absolute reputation points to target.
rep.add(cid, amount, color) Adds reputation amount to target with animated colored text.
rep.remove(cid, amount, color) Subtracts reputation amount to target with animated colored text.
rep.getPower(points) Returns the RepPower based on the specified reputation amount.
->Conditions to gain REP+
> With !hail command
> Quest (+5)
> Killing a PK player (+15)
> Killing a RedSkull player (+30)
> Killing a BlackSkull player (+40)
> Killing certain Monsters (Demon+3) (Behemoth+4) (Orshabaal+10), etc
> You may add more conditions(level advance, monster killing, quests, etc)
...just use function rep.add(cid, amount, color)
->Conditions to lose REP-
> With !fuck command (-5)
> When a player is killed by another player that was not same last killer
> Killing NON-SKULLED player (-30)
> You may add more conditions(banned, jailed, littering, rule violation, notations, etc)
...just use function rep.remove(cid, amount, color)
->Download
View attachment Cyber's REPSystem 6.1 [10.2010].zip
>>Pass: otland.net
->Setup
1)Execute SQL query
SQL:
ALTER TABLE `players` ADD COLUMN `rep` INT( 11 ) NOT NULL DEFAULT '0' COMMENT 'Cyber''s REPSystem © OTLand.net';
2) Create mods/rep.xml
XML:
<?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,
getPVPOption = function(pos)
local result = false
if isInArray({'open','hardcore','optional'}, getConfigValue('worldType')) then
result = getTileInfo(pos).hardcore and true
else
result = getTileInfo(pos).pvp and true
end
return result
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 getPVPOption(getThingPos(cid)) 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()] 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>
->ADD'ons
Quests
|> @data/actions/scripts/quests/system.lua
1st line, add
Lua:
domodlib('repSystem')
Lua:
if(questsExperience[storage] ~= nil) then
Lua:
rep.add(cid, 5)
Donations
|> @data/globalevents/scripts/shop.lua
1st line, add
Lua:
domodlib('repSystem')
After
Lua:
if received_item == RETURNVALUE_NOERROR then
Lua:
rep.add(cid, 1)
Last edited: