THE Players'Reputation System, MysticSpirit Edition
compiled in TFS Mystic Spirit 0.2.5, ought to work in older 0.2 distros
100% tested and fully working
Credits
>Original Level Ranks Feature by Gelio
>Rep System Talkaction by chris77
>Support by: Shawak, Evil Hero
>addremove.lua code extracted from Jail w/autokick by Gesior
Translation:
Update Log
Features
+ Positive and Negative Ranks
+ Graphic Bar and Names for each rank
+ A player's rep may be seen by clicking on you or a player
+ Special Outfits for the best and worst ranks
+ Commands for players to add/remove another player's rep.
+ Many ways to add/remove rep
+ Animated text and msg when add/remove rep
+ Reputation points are unlimited
+ Storages-based System
+ This system is fully customizable
+ Extra commands with no limitations for GMs/GODs
Ranks
[Points] [Rank] [Bar]
5000 Legendary Hero [==========+++]
2000 Hero [==========++=]
1500 The Best [==========+==]
1000 Hailed [=========|===]
500 Popular [========|====]
300 Well-Known [=======|=====]
0 Noob [======|======]
-300 Bad Guy [=====|=======]
-500 PK [====|========]
-1000 Villain [===|=========]
-1500 Gangster [==*==========]
-2000 Evil [=**==========]
-5000 Power Abuser [***==========]
Commands
[!hail] Gives +5 rep points to a player. May be used each 4 hours. You may not hail yourself.
-> !hail "Dorcas
[!fuck] Removes -5 rep points to a player. May be used each 4 hours You may not fuck yourself.
-> !fuck "Dorcas
[!rep] Check how many rep points you got, the rank and set the rep's outfit.
[/hail] GM Command to add specified rep without without limits
-> /hail "Dorcas,50
[/fuck] GM Command to remove specified rep without limits
-> /fuck "Dorcas,50
[/set] GM Command to set absolute rep points
-> /set "Dorcas,0
Functions
getRepPoints(cid) -> Returns rep points(number)
getRepRank(cid) -> Returns rep rank(string)
setPlayerRep(cid, points) -> Sets absolute positive rep to target
addPlayerRep(cid, amount, color) -> Adds rep amount to target with animated text colot
removePlayerRep(cid, amount, color) -> Subtracts rep amount to target with animated text colot
Conditions to gain REP+
> Via !hail command (+5)
> Making a quest (+5)
> Killing a PK player (+15)
> Killing a RedSkull player (+30)
> you may add more conditions(level advance, monster killing, etc)
Conditions to lose REP-
> Via !fuck command (-5)
> When player dies (-5)
> Killing NON-SKULLED player (-30)
> you may add more conditions(banned, jailed, littering, etc)
ADD-ons by users
Rep Door by Kekox
Rep Quest(Amber's Book example) by Znote
PART I - C++ CODING
In: player.cpp:
Above:
Add:
In this code (up) you will change ranks etc.
In player.cpp:
Under:
Add:
In player.h
Above:
Add:
Then compile, and this part is done.
PART II - LUA CODING
download scripts here
pass: otland.net
or make the manual job:
1) Global.lua
add @data/global.lua
2) Creaturescripts
a) @creaturescripts.xml add:
@data/creaturescripts create represet.lua then add in it:
b) @kill.lua add in it before last end:
c) @playerdeath.lua add in it:
3) Actions(quests) @data/actions/quests/scripted.lua
I'll give you an example of my quest code(Amber's Book Quest):
So, in conclusion, you just need to add this function in your quest script, for each quest, to add rep to a player when he finds the chest:
4) Talkactions
@talkactions.xml add:
Create a folder named "rep" @talkactions/scripts
addremove.lua
hail.lua
fuck.lua
info.lua
And that's all. Comments, gratitudes, suggestions, reports are welcomed. DON'T COME HERE to critizice my ranks, if you don't like them then change'em!<_<. Special thanks to Gelio, who helped me coding C++ storage. REP++ ME!
You got TFS Crying Damson? Don't worry I've made the system for 0.3 too!! Click this link to view it
compiled in TFS Mystic Spirit 0.2.5, ought to work in older 0.2 distros
100% tested and fully working
Credits
>Original Level Ranks Feature by Gelio
>Rep System Talkaction by chris77
>Support by: Shawak, Evil Hero
>addremove.lua code extracted from Jail w/autokick by Gesior
Translation:
Code:
You see yourself. You are the God and the boss. [B]You are Legendary Hero[==========+++][/B]
Update Log
vr2.0(next version)
-add ip or account check to avoid rep
-return time left to player to rep
-set rep outfit when login via C++
vr1.5(actual)
-Rep+++ 8.5 outfits for female/male
-improved /hail&/fuck
-/reset is now /set
-Cleaner and shortened code
shortened info.lua
fixed fuck.lua
fixed hail.lua
merged reset.lua, minusrep.lua&plusrep.lua into addremove.lua
-new FUNCTIONS:
getRepPoints(cid)
getRepRank(cid)
setPlayerRep(cid, points)
addPlayerRep(cid, amount, color)
removePlayerRep(cid, amount, color)
-available links to download LUA scripts
vr1.0
-Commands to add/remove rep
-C++/LUA System
-more details at Features(below)
-System coded for 0.2s distros, may work in older ones
Features
+ Positive and Negative Ranks
+ Graphic Bar and Names for each rank
+ A player's rep may be seen by clicking on you or a player
+ Special Outfits for the best and worst ranks
+ Commands for players to add/remove another player's rep.
+ Many ways to add/remove rep
+ Animated text and msg when add/remove rep
+ Reputation points are unlimited
+ Storages-based System
+ This system is fully customizable
+ Extra commands with no limitations for GMs/GODs
Ranks
[Points] [Rank] [Bar]
5000 Legendary Hero [==========+++]
2000 Hero [==========++=]
1500 The Best [==========+==]
1000 Hailed [=========|===]
500 Popular [========|====]
300 Well-Known [=======|=====]
0 Noob [======|======]
-300 Bad Guy [=====|=======]
-500 PK [====|========]
-1000 Villain [===|=========]
-1500 Gangster [==*==========]
-2000 Evil [=**==========]
-5000 Power Abuser [***==========]
Commands
[!hail] Gives +5 rep points to a player. May be used each 4 hours. You may not hail yourself.
-> !hail "Dorcas
[!fuck] Removes -5 rep points to a player. May be used each 4 hours You may not fuck yourself.
-> !fuck "Dorcas
[!rep] Check how many rep points you got, the rank and set the rep's outfit.
[/hail] GM Command to add specified rep without without limits
-> /hail "Dorcas,50
[/fuck] GM Command to remove specified rep without limits
-> /fuck "Dorcas,50
[/set] GM Command to set absolute rep points
-> /set "Dorcas,0
Functions
getRepPoints(cid) -> Returns rep points(number)
getRepRank(cid) -> Returns rep rank(string)
setPlayerRep(cid, points) -> Sets absolute positive rep to target
addPlayerRep(cid, amount, color) -> Adds rep amount to target with animated text colot
removePlayerRep(cid, amount, color) -> Subtracts rep amount to target with animated text colot
Conditions to gain REP+
> Via !hail command (+5)
> Making a quest (+5)
> Killing a PK player (+15)
> Killing a RedSkull player (+30)
> you may add more conditions(level advance, monster killing, etc)
Conditions to lose REP-
> Via !fuck command (-5)
> When player dies (-5)
> Killing NON-SKULLED player (-30)
> you may add more conditions(banned, jailed, littering, etc)
ADD-ons by users
Rep Door by Kekox
Lua:
function onUse(cid, item, frompos, item2, topos)
local config = {
repNeeded = 500
}
if getRepPoints(cid) >= config.repNeeded then
pos = getPlayerPosition(cid)
if pos.x == topos.x then
if pos.y < topos.y then
pos.y = topos.y + 1
else
pos.y = topos.y - 1
end
elseif pos.y == topos.y then
if pos.x < topos.x then
pos.x = topos.x + 1
else
pos.x = topos.x - 1
end
else
doPlayerSendTextMessage(cid,22,'Stay in front of the door.')
return 1
end
doTeleportThing(cid,pos)
doSendMagicEffect(topos,12)
else
doPlayerSendTextMessage(cid,22,"Only players with " .. config.repNeeded .. " can go there.")
end
return TRUE
end
Rep Quest(Amber's Book example) by Znote
Lua:
if item.uid == 60035 then
if getPlayerStorageValue(cid,2010) > 499 then
if getPlayerStorageValue(cid,60035) == -1 then
doPlayerSendTextMessage(cid,25,"You found a book.")
local book = doPlayerAddItem(cid,2325,1)
doSetItemText(book,"Hardek *\nBozo *\nSam ****\n\nOswald\nPartos ***\nQuentin *\nTark ***\nHarsky ***\nStutch *\nFerumbras *\nFrodo **\nNoodles ****")
setPlayerStorageValue(cid, 2010, (rep+10)) -- REP INCLUDE --
doSendAnimatedText(playerpos, "+REP", TEXTCOLOR_LIGHTBLUE) -- REP INCLUDE --
setPlayerStorageValue(cid,60035,1)
else
doPlayerSendTextMessage(cid,25,"It is empty.")
else
doPlayerSendTextMessage(cid,25,"You need to be Popular to make this quest.")
end
PART I - C++ CODING
In: player.cpp:
Above:
Code:
std::string Player::getDescription(int32_t lookDistance) const
Add:
Code:
std::string Player::getPVPRank(uint32_t level) const
{
std::string rank = "Noob [======|======]";
int32_t intValue = 0;
if(getStorageValue(2010, intValue))
{
if(intValue <= -5000)
rank = "Power Abuser [***==========]";
else if(intValue >= -2000 && intValue < -1500)
rank = "Evil [=**==========]";
else if(intValue >= -1500 && intValue < -1000)
rank = "Gangster [==*==========]";
else if(intValue >= -1000 && intValue < -500)
rank = "Villain [===|=========]";
else if(intValue >= -500 && intValue < -300)
rank = "PK [====|========]";
else if(intValue >= -300 && intValue < 0)
rank = "Bad Guy [=====|=======]";
else if(intValue >= 0 && intValue < 300)
rank = "Noob [======|======]";
else if(intValue >= 300 && intValue < 500)
rank = "Well-Known [=======|=====]";
else if(intValue >= 500 && intValue < 1000)
rank = "Popular [========|====]";
else if(intValue >= 1000 && intValue < 1500)
rank = "Hailed [=========|===]";
else if(intValue >= 1500 && intValue < 2000)
rank = "The Best [==========+==]";
else if(intValue >= 2000 && intValue < 5000)
rank = "Hero [==========++=]";
else if(intValue >= 5000)
rank = "Legendary Hero [==========+++]";
else
rank = "Noob [======|======]";
};
return rank;
}
In this code (up) you will change ranks etc.
In player.cpp:
Code:
std::string Player::getDescription(int32_t lookDistance) const
Under:
Code:
s << " (Level " << level << ")";
}
s << ".";
Add:
Code:
if(sex == PLAYERSEX_FEMALE)
{
s << " She";
}
else
{
s << " He";
}
s << " is ";
std::string rank = Player::getPVPRank(level);
s << rank << ".";
In player.h
Above:
Code:
virtual std::string getDescription(int32_t lookDistance) const;
Add:
Code:
virtual std::string getPVPRank(uint32_t level) const;
Then compile, and this part is done.
PART II - LUA CODING
download scripts here
pass: otland.net
or make the manual job:
1) Global.lua
add @data/global.lua
Lua:
--THE Players' REP++Sys by CbrMstr {LUA_FUNCTIONS}--
PLAYER_REP = 2010 --storage used for the player's rep points
function getRepPoints(cid)
return getPlayerStorageValue(cid, PLAYER_REP)
end
function getRepRank(cid)
rep = getRepPoints(cid)
if rep > 4999 then
REP_RANK = "Legendary Hero [==========+++]"
elseif rep > 1999 then
REP_RANK = "Hero [==========++=]"
elseif rep > 1499 then
REP_RANK = "The Best [==========+==]"
elseif rep > 999 then
REP_RANK = "Hailed [=========|===]"
elseif rep > 499 then
REP_RANK = "Popular [========|====]"
elseif rep > 299 then
REP_RANK = "Well-Known [=======|=====]"
elseif rep > -1 then
REP_RANK = "Noob [======|======]"
elseif rep < -299 then
REP_RANK = "Bad Guy [======|======]"
elseif rep < -499 then
REP_RANK = "PK [====|========]"
elseif rep < -999 then
REP_RANK = "Villain [===|=========]"
elseif rep < -1499 then
REP_RANK = "Gangster [==*==========]"
elseif rep < -1999 then
REP_RANK = "Evil [=**==========]"
elseif rep < -4999 then
REP_RANK = "Power Abuser [***==========]"
end
return REP_RANK
end
function setPlayerRep(cid, points)
return setPlayerStorageValue(cid, PLAYER_REP, points)
end
function addPlayerRep(cid, amount, color)
REP_POINTS = getPlayerStorageValue(cid, PLAYER_REP)
setPlayerStorageValue(cid, PLAYER_REP, (REP_POINTS+amount))
doSendAnimatedText(getPlayerPosition(cid), "+REP", color)
doPlayerSendCancel(cid,'You got hailed and received '.. amount ..' rep points.')
end
function removePlayerRep(cid, amount, color)
REP_POINTS = getPlayerStorageValue(cid, PLAYER_REP)
setPlayerStorageValue(cid, PLAYER_REP, (REP_POINTS-amount))
doSendAnimatedText(getPlayerPosition(cid), "-REP", color)
doPlayerSendCancel(cid,'You got fucked and lost '.. amount ..' rep points.')
end
2) Creaturescripts
a) @creaturescripts.xml add:
Lua:
<event type="login" name="RepReset" script="represet.lua"/>
Lua:
-- >>> THE Players' REP++Sys by Cybermaster <<< --
-- >>> Scripted for TFS 0.2s, and older distros<<< --
function onLogin(cid)
if getPlayerStorageValue(cid, 2011) == -1 then
setPlayerRep(cid, 0)
setPlayerStorageValue(cid, 2011, 1)
doPlayerPopupFYI(cid, "Your rank: \nNoob [======|======] \nYou have 0 rep points.")
end
return TRUE
end
b) @kill.lua add in it before last end:
Lua:
--rep+ sys
if isPlayer(cid) == TRUE and isPlayer(target) == TRUE then
if getPlayerSkullType(target) == SKULL_WHITE then
addPlayerRep(cid, 15, TEXTCOLOR_LIGHTBLUE)
elseif getPlayerSkullType(target) == SKULL_RED then
addPlayerRep(cid, 30, TEXTCOLOR_LIGHTBLUE)
elseif getPlayerSkullType(target) == SKULL_NONE then
removePlayerRep(cid, 30, TEXTCOLOR_RED)
end
return TRUE
end
c) @playerdeath.lua add in it:
Lua:
removePlayerRep(cid, 5, TEXTCOLOR_RED) --rep+ sys
I'll give you an example of my quest code(Amber's Book Quest):
Lua:
function onUse(cid, item, frompos, item2, topos)
if item.uid == 60035 then
if getPlayerStorageValue(cid,60035) == -1 then
doPlayerSendTextMessage(cid,25,"You found a book.")
local book = doPlayerAddItem(cid,2325,1)
doSetItemText(book,"Hardek *\nBozo *\nSam ****\n\nOswald\nPartos ***\nQuentin *\nTark ***\nHarsky ***\nStutch *\nFerumbras *\nFrodo **\nNoodles ****")
addPlayerRep(cid, 5, TEXTCOLOR_LIGHTBLUE) --rep+ sys
setPlayerStorageValue(cid,60035,1)
else
doPlayerSendTextMessage(cid,25,"It is empty.")
end...etc
So, in conclusion, you just need to add this function in your quest script, for each quest, to add rep to a player when he finds the chest:
Lua:
addPlayerRep(cid, 5, TEXTCOLOR_LIGHTBLUE) --rep+ sys
4) Talkactions
@talkactions.xml add:
Lua:
<talkaction words="/hail" script="rep/addremove.lua"/>
<talkaction words="/fuck" script="rep/addremove.lua"/>
<talkaction words="/set" script="rep/addremove.lua"/>
<talkaction words="!hail" script="rep/hail.lua"/>
<talkaction words="!fuck" script="rep/fuck.lua"/>
<talkaction words="!rep" script="rep/info.lua"/>
Create a folder named "rep" @talkactions/scripts
addremove.lua
Lua:
-- >>> THE Players' REP++Sys by Cybermaster <<< --
-- >>> Credits to Gesior in this script<<< --
-- >>> Scripted for TFS 0.2s, and older distros<<< --
default_rep = 0 -- don't modify this
grouprequired = 4 --only gm or god can execute these commands
function onSay(cid, words, param)
local rep_amount = 5 --if you don't type amount then this qty will be the number
for word in string.gmatch(tostring(param), "(%w+)") do
if tostring(tonumber(word)) == word then
rep_amount = tonumber(word)
end
end
local isplayer = getPlayerByName(param) --name-read code from param, do not modify
if isPlayer(isplayer) ~= TRUE then
isplayer = getPlayerByName(string.sub(param, string.len(rep_amount)+1))
if isPlayer(isplayer) ~= TRUE then
isplayer = getPlayerByName(string.sub(param, string.len(rep_amount)+2))
if isPlayer(isplayer) ~= TRUE then
isplayer = getPlayerByName(string.sub(param, string.len(rep_amount)+3))
end
end
end
if rep_amount ~= -1 then
rep_amount = rep_amount
else
rep_amount = default_rep
end
if words == '/fuck' then --REMOVE RELATIVE REP POINTS
if getPlayerGroupId(cid) >= grouprequired then
if isPlayer(isplayer) == TRUE then
removePlayerRep(isplayer, rep_amount, TEXTCOLOR_RED)
return TRUE
else
doPlayerSendCancel(cid,"Player not found.")
return FALSE
end
else
doPlayerSendCancel(cid,"You may not execute this command.")
return FALSE
end
elseif words == '/hail' then --ADD RELATIVE REP POINTS
if getPlayerGroupId(cid) >= grouprequired then
if isPlayer(isplayer) == TRUE then
addPlayerRep(isplayer, rep_amount, TEXTCOLOR_PLATINUMBLUE)
return TRUE
else
doPlayerSendCancel(cid,"Player not found.")
return FALSE
end
else
doPlayerSendCancel(cid,"You may not execute this command.")
return FALSE
end
elseif words == '/set' then --SET ABSOLUTE POSITIVE REP POINTS, needs a fix to allow negative points
if getPlayerGroupId(cid) >= grouprequired then
if isPlayer(isplayer) == TRUE then
setPlayerRep(isplayer, rep_amount)
return TRUE
else
doPlayerSendCancel(cid,"Player not found.")
return FALSE
end
else
doPlayerSendCancel(cid,"You may not execute this command.")
return FALSE
end
end
return FALSE
end
hail.lua
Lua:
-- >>> THE Players' REP++Sys by Cybermaster <<< --
-- >>> Credits to chris77 in this script<<< --
-- >>> Scripted for TFS 0.2s, and older distros<<< --
function onSay(cid, words, param, channel)
local config = {
compareTime = 3600 * 4, -- This is 4 hours, in seconds. Time between rep.
currentTime = getPlayerStorageValue(cid, 23232),
level = 20,
}
if config.currentTime == -1 then
setPlayerStorageValue(cid, 23232, os.time())
end
--checkings--
local hours = math.ceil(getWorldUpTime() / 3600) - 1
if hours < 3 then --SERVER RESTART OVERREP PROTECTION CODE
doPlayerSendCancel(cid,"You may give rep again in less than 4 hours.")
return TRUE
end
if param == getPlayerName(cid) then
doPlayerSendCancel(cid,"You may not give rep to yourself.")
return TRUE
end
if param == "" then
doPlayerSendCancel(cid,"Player not found.")
return TRUE
end
if (os.time() - config.currentTime) < config.compareTime then
doPlayerSendCancel(cid, "You may give rep again in less than 4 hours.")
return TRUE
end
if getPlayerLevel(cid) < config.level then
doPlayerSendCancel(cid,'You may give rep from level '.. config.level ..' and so on.')
return TRUE
end
local sent = getPlayerByName(param)
if isPlayer(sent) == TRUE then
setPlayerStorageValue(cid, 23232, os.time())
addPlayerRep(sent, 5, TEXTCOLOR_LIGHTBLUE)
doPlayerSendCancel(cid,'You just hailed ' .. sent .. '. You may give rep again in less than 4 hours.')
else
doPlayerSendCancel(cid,"Player not found.")
return FALSE
end
end
fuck.lua
Lua:
-- >>> THE Players' REP++Sys by Cybermaster <<< --
-- >>> Credits to chris77 in this script<<< --
-- >>> Scripted for TFS 0.2s, and older distros<<< --
function onSay(cid, words, param, channel)
local config = {
compareTime = 3600 * 4, -- This is 4 hours, in seconds. Time between rep.
currentTime = getPlayerStorageValue(cid, 23232),
level = 20,
}
if config.currentTime == -1 then
setPlayerStorageValue(cid, 23232, os.time())
end
--checkings--
local hours = math.ceil(getWorldUpTime() / 3600) - 1
if hours < 3 then --SERVER RESTART OVERREP PROTECTION CODE
doPlayerSendCancel(cid,"You may remove rep again in less than 4 hours.")
return TRUE
end
if param == getPlayerName(cid) then
doPlayerSendCancel(cid,"You may not remove rep to yourself.")
return TRUE
end
if param == "" then
doPlayerSendCancel(cid,"Player not found.")
return TRUE
end
if (os.time() - config.currentTime) < config.compareTime then
doPlayerSendCancel(cid, "You may remove rep again in less than 4 hours.")
return TRUE
end
if getPlayerLevel(cid) < config.level then
doPlayerSendCancel(cid,'You may remove rep from level '.. config.level ..' and so on.')
return TRUE
end
local sent = getPlayerByName(param)
if isPlayer(sent) == TRUE then
setPlayerStorageValue(cid, 23232, os.time())
removePlayerRep(sent, 5, TEXTCOLOR_RED)
doPlayerSendCancel(cid,'You just fucked ' .. sent .. '. You may remove rep again in less than 4 hours.')
else
doPlayerSendCancel(cid,"Player not found.")
return FALSE
end
end
info.lua
Lua:
-- >>> THE Players' REP++Sys by Cybermaster <<< --
-- >>> Scripted for TFS 0.2s, and older distros<<< --
function onSay(cid, words, param, channel)
doPlayerSendTextMessage(cid, 19, 'You have ' .. getRepPoints(cid) .. ' rep points. You are ' .. getRepRank(cid) .. '')
if rep > 4999 and getPlayerSex(cid) == 0 then -- female rep+++ queen outfit --
disguise = {lookType = 331, lookHead = 0 , lookBody = 0, lookLegs = 0, lookFeet = 0, lookTypeEx = 0, lookAddons = 0}
doSetCreatureOutfit(cid, disguise, -1)
elseif rep > 4999 and getPlayerSex(cid) > 0 then -- male rep+++ king outfit --
disguise = {lookType = 332, lookHead = 0 , lookBody = 0, lookLegs = 0, lookFeet = 0, lookTypeEx = 0, lookAddons = 0}
doSetCreatureOutfit(cid, disguise, -1)
elseif rep > 1999 then -- rep++ cm outfit --
disguise = {lookType = 266, lookHead = 0 , lookBody = 0, lookLegs = 0, lookFeet = 0, lookTypeEx = 0, lookAddons = 0}
doSetCreatureOutfit(cid, disguise, -1)
elseif rep > 1499 then -- rep+ hero outfit --
disguise = {lookType = 73, lookHead = 0 , lookBody = 0, lookLegs = 0, lookFeet = 0, lookTypeEx = 0, lookAddons = 0}
doSetCreatureOutfit(cid, disguise, -1)
elseif rep < -4999 then -- rep*** devil outfit --
disguise = {lookType = 40, lookHead = 0 , lookBody = 0, lookLegs = 0, lookFeet = 0, lookTypeEx = 0, lookAddons = 0}
doSetCreatureOutfit(cid, disguise, -1)
elseif rep < -1999 then -- rep** pig outfit --
disguise = {lookType = 60, lookHead = 0 , lookBody = 0, lookLegs = 0, lookFeet = 0, lookTypeEx = 0, lookAddons = 0}
doSetCreatureOutfit(cid, disguise, -1)
elseif rep < -1499 then -- rep* orc outfit --
disguise = {lookType = 5, lookHead = 0 , lookBody = 0, lookLegs = 0, lookFeet = 0, lookTypeEx = 0, lookAddons = 0}
doSetCreatureOutfit(cid, disguise, -1)
end
end
And that's all. Comments, gratitudes, suggestions, reports are welcomed. DON'T COME HERE to critizice my ranks, if you don't like them then change'em!<_<. Special thanks to Gelio, who helped me coding C++ storage. REP++ ME!
You got TFS Crying Damson? Don't worry I've made the system for 0.3 too!! Click this link to view it
Last edited: