Achievements (All TibiaRl Achievements, including the secret ones)
This lib includes all existing achievements.
List and functions were made by me.
To add this achievements system to your server, just follow these steps:
Create a file named:
data/lib/108-achievements.lua
How to use? here is an example of all functions.
data/talkactions/scripts/achievements.lua
data/talkactions/talkactions.xml
Commands:
* /addach -- add achievement to a player (/addach Darkhaos, 5 - /addach Darkhaos, Chorister)
* /addallach --add all achievements to a player (/addallach Darkhaos)
* /removeach --remove achievement to a player (/removeach Darkhaos, 5 - /removeach Darkhaos, Chorister)
* /removeallach --remove all achievements to a player (/removeallach Darkhaos)
* /getach --get achievements from a player (/getach Darkhaos)
* /getsecretach --get secret achievements from a player (/getsecretach Darkhaos)
Please report all bugs here... Enjoy.
This lib includes all existing achievements.
List and functions were made by me.
To add this achievements system to your server, just follow these steps:
Create a file named:
data/lib/108-achievements.lua
Lua:
ACHIEVEMENTSPOINTS_BASE = "achievement_points"
achievements = {
[1] = {name = "Afraid of no Ghost!", grade = 1, points = 2, secret = false},
[2] = {name = "Allow Cookies?", grade = 1, points = 2, secret = false},
[3] = {name = "Allowance Collector", grade = 1, points = 2, secret = true},
[4] = {name = "Amateur Actor", grade = 1, points = 2, secret = false},
[5] = {name = "Animal Activist", grade = 1, points = 2, secret = false},
[6] = {name = "Arachnoise", grade = 1, points = 1, secret = false},
[7] = {name = "Archpostman", grade = 1, points = 3, secret = false},
[8] = {name = "Askarak Nemesis", grade = 1, points = 1, secret = true},
[9] = {name = "Baby Sitter", grade = 1, points = 1, secret = true},
[10] = {name = "Back from the Dead", grade = 1, points = 2, secret = false},
[11] = {name = "Back into the Abyss", grade = 1, points = 1, secret = false},
[12] = {name = "Backpack Tourist", grade = 1, points = 1, secret = true},
[13] = {name = "Bad Timing", grade = 1, points = 2, secret = true},
[14] = {name = "Bane of the Hive", grade = 1, points = 2, secret = false},
[15] = {name = "Banebringers' Bane", grade = 1, points = 2, secret = true},
[16] = {name = "Beach Tamer", grade = 1, points = 2, secret = false},
[17] = {name = "Bearhugger", grade = 1, points = 1, secret = false},
[18] = {name = "Beautiful Agony", grade = 1, points = 2, secret = false},
[19] = {name = "Berserker", grade = 1, points = 3, secret = false},
[20] = {name = "King of the Ring", grade = 1, points = 2, secret = false},
[21] = {name = "Blessed!", grade = 1, points = 2, secret = false},
[22] = {name = "Blood-Red Snapper", grade = 1, points = 1, secret = false},
[23] = {name = "Bluebarian", grade = 1, points = 2, secret = true},
[24] = {name = "Bone Brother", grade = 1, points = 1, secret = false},
[25] = {name = "Breaking the Ice", grade = 1, points = 1, secret = false},
[26] = {name = "Bunny Slipped", grade = 1, points = 2, secret = true},
[27] = {name = "Cake Conqueror", grade = 1, points = 1, secret = true},
[28] = {name = "Chest Robber", grade = 1, points = 1, secret = false},
[29] = {name = "Choking on Her Venom", grade = 1, points = 1, secret = false},
[30] = {name = "Chorister", grade = 1, points = 1, secret = false},
[31] = {name = "Clay Fighter", grade = 1, points = 3, secret = true},
[32] = {name = "Coccon of Doom", grade = 1, points = 3, secret = true},
[33] = {name = "Commitment Phobic", grade = 1, points = 2, secret = true},
[34] = {name = "Confusion", grade = 1, points = 0, secret = false},
[35] = {name = "Cookie Monster", grade = 1, points = 1, secret = true},
[36] = {name = "Crawling Death", grade = 1, points = 1, secret = false},
[37] = {name = "Cursed!", grade = 1, points = 3, secret = true},
[38] = {name = "Daring Trespasser", grade = 1, points = 3, secret = true},
[39] = {name = "Dark Voodoo Priest", grade = 1, points = 2, secret = true},
[40] = {name = "Dazzler", grade = 1, points = 3, secret = false},
[41] = {name = "Death Song", grade = 1, points = 3, secret = false},
[42] = {name = "Deer Hunt", grade = 1, points = 1, secret = true},
[43] = {name = "Demonic Barkeeper", grade = 1, points = 3, secret = false},
[44] = {name = "Depth Dwellers", grade = 1, points = 3, secret = false},
[45] = {name = "Desert Fisher", grade = 1, points = 1, secret = false},
[46] = {name = "Do not Disturb", grade = 1, points = 1, secret = true},
[47] = {name = "Doctor! Doctor!", grade = 1, points = 2, secret = true},
[48] = {name = "Dog Slitter", grade = 1, points = 1, secret = false},
[49] = {name = "Down the Drain", grade = 1, points = 2, secret = false},
[50] = {name = "Dream's Over", grade = 1, points = 1, secret = false},
[51] = {name = "Efreet Ally", grade = 1, points = 3, secret = false},
[52] = {name = "Enter zze Draken!", grade = 1, points = 2, secret = false},
[53] = {name = "Exquisite Taste", grade = 1, points = 2, secret = false},
[54] = {name = "Extreme Degustation", grade = 1, points = 2, secret = true},
[55] = {name = "Eye of the Deep", grade = 1, points = 1, secret = true},
[56] = {name = "Fire Devil", grade = 1, points = 3, secret = true},
[57] = {name = "Fire from the Earth", grade = 1, points = 2, secret = false},
[58] = {name = "Fire Lighter", grade = 1, points = 1, secret = true},
[59] = {name = "Firefighter", grade = 1, points = 2, secret = true},
[60] = {name = "Fireworks in the Sky", grade = 1, points = 2, secret = true},
[61] = {name = "Fool at Heart", grade = 1, points = 3, secret = false},
[62] = {name = "Fountain of Life", grade = 1, points = 1, secret = true},
[63] = {name = "Free Items!", grade = 1, points = 3, secret = true},
[64] = {name = "Gatherer", grade = 1, points = 2, secret = false},
[65] = {name = "Gem Cutter", grade = 1, points = 1, secret = true},
[66] = {name = "Ghost Sailor", grade = 1, points = 1, secret = true},
[67] = {name = "Ghostwhisperer", grade = 1, points = 3, secret = false},
[68] = {name = "Greenhorn", grade = 1, points = 2, secret = false},
[69] = {name = "Guard Killer", grade = 1, points = 2, secret = false},
[70] = {name = "Guinea Pig", grade = 1, points = 2, secret = false},
[71] = {name = "Happy Farmer", grade = 1, points = 1, secret = true},
[72] = {name = "Headache", grade = 1, points = 2, secret = false},
[73] = {name = "Heartburn", grade = 1, points = 3, secret = false},
[74] = {name = "Here, Fishy Fishy!", grade = 1, points = 1, secret = true},
[75] = {name = "Hickup", grade = 1, points = 2, secret = false},
[76] = {name = "Hidden Powers", grade = 1, points = 2, secret = false},
[77] = {name = "His True Face", grade = 1, points = 3, secret = true},
[78] = {name = "Hissing Downfall", grade = 1, points = 2, secret = false},
[79] = {name = "Hive Fighter", grade = 1, points = 1, secret = false},
[80] = {name = "Hive Infiltrator", grade = 1, points = 3, secret = false},
[81] = {name = "Hive War Veteran", grade = 1, points = 1, secret = false},
[82] = {name = "Homebrewed", grade = 1, points = 1, secret = true},
[83] = {name = "Honest Finder", grade = 1, points = 1, secret = false},
[84] = {name = "Honorary Barbarian", grade = 1, points = 1, secret = false},
[85] = {name = "Howly Silence", grade = 1, points = 1, secret = false},
[86] = {name = "Huntsman", grade = 1, points = 2, secret = false},
[87] = {name = "I Did My Part", grade = 1, points = 2, secret = true},
[88] = {name = "I Like it Fancy", grade = 1, points = 1, secret = true},
[89] = {name = "I Need a Hug", grade = 1, points = 2, secret = false},
[90] = {name = "Ice Harvester", grade = 1, points = 1, secret = false},
[91] = {name = "Ice Sculptor", grade = 1, points = 3, secret = true},
[92] = {name = "Invader of the Deep", grade = 1, points = 2, secret = true},
[93] = {name = "Jinx", grade = 1, points = 2, secret = true},
[94] = {name = "Joke's on You", grade = 1, points = 1, secret = true},
[95] = {name = "Just Cracked Me Up!", grade = 1, points = 2, secret = false},
[96] = {name = "Just in Time", grade = 1, points = 1, secret = false},
[97] = {name = "Kapow!", grade = 1, points = 1, secret = false},
[98] = {name = "Keeper of the Flame", grade = 1, points = 2, secret = true},
[99] = {name = "King Tibianus Fan", grade = 1, points = 3, secret = false},
[100] = {name = "Let the Sunshine In", grade = 1, points = 1, secret = true},
[101] = {name = "Loyal Subject", grade = 1, points = 1, secret = true},
[102] = {name = "Lucid Dreamer", grade = 1, points = 2, secret = false},
[103] = {name = "Mageslayer", grade = 1, points = 1, secret = true},
[104] = {name = "Make a Wish", grade = 1, points = 1, secret = true},
[105] = {name = "Marbeleous", grade = 1, points = 3, secret = true},
[106] = {name = "Marid Ally", grade = 1, points = 3, secret = false},
[107] = {name = "Masquerader", grade = 1, points = 3, secret = true},
[108] = {name = "Master Shapeshifter", grade = 1, points = 2, secret = true},
[109] = {name = "Mastermind", grade = 1, points = 3, secret = false},
[110] = {name = "Matchmaker", grade = 1, points = 1, secret = false},
[111] = {name = "Mathemagician", grade = 1, points = 1, secret = false},
[112] = {name = "Meat Skewer", grade = 1, points = 1, secret = false},
[113] = {name = "Merry Adventures", grade = 1, points = 2, secret = false},
[114] = {name = "Ministrel", grade = 1, points = 2, secret = true},
[115] = {name = "Minor Disturbance", grade = 1, points = 2, secret = false},
[116] = {name = "Mister Sandman", grade = 1, points = 2, secret = true},
[117] = {name = "Modest Guest", grade = 1, points = 1, secret = true},
[118] = {name = "Mutated Presents", grade = 1, points = 1, secret = true},
[119] = {name = "Natural Born Cowboy", grade = 1, points = 1, secret = true},
[120] = {name = "Natural Sweetener", grade = 1, points = 1, secret = true},
[121] = {name = "Nether Pirate", grade = 1, points = 3, secret = true},
[122] = {name = "Nightmare Knight", grade = 1, points = 1, secret = false},
[123] = {name = "No More Hiding", grade = 1, points = 1, secret = false},
[124] = {name = "Nomad Soul", grade = 1, points = 2, secret = true},
[125] = {name = "Nothing Can Stop Me", grade = 1, points = 1, secret = true},
[126] = {name = "Number of the Beast", grade = 1, points = 2, secret = false},
[127] = {name = "One Less", grade = 1, points = 2, secret = false},
[128] = {name = "Oops", grade = 1, points = 2, secret = true},
[129] = {name = "Party Animal", grade = 1, points = 1, secret = true},
[130] = {name = "Passionate Kisser", grade = 1, points = 3, secret = false},
[131] = {name = "Perfect Fool", grade = 1, points = 3, secret = false},
[132] = {name = "Petrologist", grade = 1, points = 2, secret = true},
[133] = {name = "Piece of Cake", grade = 1, points = 1, secret = false},
[134] = {name = "Pimple", grade = 1, points = 3, secret = false},
[135] = {name = "Planter", grade = 1, points = 2, secret = false},
[136] = {name = "Poet Laureate", grade = 1, points = 2, secret = true},
[137] = {name = "Preservationist", grade = 1, points = 1, secret = true},
[138] = {name = "Quick as a Turtle", grade = 1, points = 2, secret = true},
[139] = {name = "Recognised Trader", grade = 1, points = 3, secret = false},
[140] = {name = "Rock Me to Sleep", grade = 1, points = 1, secret = true},
[141] = {name = "Rocket in Pocket", grade = 1, points = 1, secret = true},
[142] = {name = "Rockstar", grade = 1, points = 3, secret = true},
[143] = {name = "Rollercoaster", grade = 1, points = 1, secret = false},
[144] = {name = "Rootless Behaviour", grade = 1, points = 1, secret = false},
[145] = {name = "Safely Stored Away", grade = 1, points = 2, secret = true},
[146] = {name = "Santa's Li'l Helper", grade = 1, points = 2, secret = true},
[147] = {name = "Scorched Flames", grade = 1, points = 1, secret = false},
[148] = {name = "Scrapper", grade = 1, points = 3, secret = false},
[149] = {name = "Sea Scout", grade = 1, points = 2, secret = false},
[150] = {name = "Secret Agent", grade = 1, points = 1, secret = false},
[151] = {name = "Shaburak Nemesis", grade = 1, points = 1, secret = true},
[152] = {name = "Sharpshooter", grade = 1, points = 3, secret = false},
[153] = {name = "Si, Ariki!", grade = 1, points = 1, secret = false},
[154] = {name = "Shell Seeker", grade = 1, points = 3, secret = true},
[155] = {name = "Silent Pet", grade = 1, points = 1, secret = true},
[156] = {name = "Slayer of Anmothra", grade = 1, points = 2, secret = true},
[157] = {name = "Slayer of Chikhaton", grade = 1, points = 2, secret = true},
[158] = {name = "Slayer of Irahsae", grade = 1, points = 2, secret = true},
[159] = {name = "Slayer of Phrodomo", grade = 1, points = 2, secret = true},
[160] = {name = "Slayer of Teneshpar", grade = 1, points = 2, secret = true},
[161] = {name = "Slim Chance", grade = 1, points = 1, secret = false},
[162] = {name = "Slimer", grade = 1, points = 1, secret = true},
[163] = {name = "Snowbunny", grade = 1, points = 2, secret = true},
[164] = {name = "Someone's Bored", grade = 1, points = 1, secret = true},
[165] = {name = "Something Smells", grade = 1, points = 1, secret = false},
[166] = {name = "Something's in There", grade = 1, points = 1, secret = true},
[167] = {name = "Spareribs for Dinner", grade = 1, points = 1, secret = false},
[168] = {name = "Spectral Traveler", grade = 1, points = 2, secret = true},
[169] = {name = "Steampunked", grade = 1, points = 2, secret = true},
[170] = {name = "Stepped on a Big Toe", grade = 1, points = 1, secret = false},
[171] = {name = "Supersitious", grade = 1, points = 2, secret = true},
[172] = {name = "Supplier", grade = 1, points = 3, secret = false},
[173] = {name = "Sweet Tooth", grade = 1, points = 2, secret = true},
[174] = {name = "Talented Dancer", grade = 1, points = 1, secret = false},
[175] = {name = "Teamplayer", grade = 1, points = 2, secret = true},
[176] = {name = "Territorial", grade = 1, points = 1, secret = true},
[177] = {name = "The Cake's the Truth", grade = 1, points = 1, secret = true},
[178] = {name = "The Day After", grade = 1, points = 2, secret = true},
[179] = {name = "The Drowned Sea God", grade = 1, points = 2, secret = false},
[180] = {name = "The Milkman", grade = 1, points = 2, secret = false},
[181] = {name = "The Serpent's Bride", grade = 1, points = 2, secret = false},
[182] = {name = "The Undertaker", grade = 1, points = 2, secret = true},
[183] = {name = "Torn Treasures", grade = 1, points = 1, secret = true},
[184] = {name = "Trail of the Ape God", grade = 1, points = 1, secret = true},
[185] = {name = "True Colors", grade = 1, points = 3, secret = true},
[186] = {name = "Truth Be Told", grade = 1, points = 2, secret = true},
[187] = {name = "Twisted Mutation", grade = 1, points = 1, secret = false},
[188] = {name = "Vanity", grade = 1, points = 3, secret = true},
[189] = {name = "Vive la Resistance", grade = 1, points = 2, secret = false},
[190] = {name = "Wayfarer", grade = 1, points = 3, secret = true},
[191] = {name = "Whistle-Blower", grade = 1, points = 1, secret = true},
[192] = {name = "Witches Lil' Helper", grade = 1, points = 1, secret = true},
[193] = {name = "With a Cherry on Top", grade = 1, points = 1, secret = true},
[194] = {name = "Worm Whacker", grade = 1, points = 1, secret = true},
[195] = {name = "Yalahari of Power", grade = 1, points = 3, secret = false},
[196] = {name = "Yalahari of Wisdom", grade = 1, points = 3, secret = false},
[197] = {name = "You Don't Know Jack", grade = 1, points = 2, secret = true},
[198] = {name = "Zzztill Zzztanding!", grade = 1, points = 1, secret = false},
[199] = {name = "Alumni", grade = 2, points = 6, secret = false},
[200] = {name = "Annihilator", grade = 2, points = 5, secret = false},
[201] = {name = "Aristocrat", grade = 2, points = 4, secret = false},
[202] = {name = "Ashes to Dust", grade = 2, points = 4, secret = true},
[203] = {name = "Beak Doctor", grade = 2, points = 4, secret = false},
[204] = {name = "Brutal Politeness", grade = 2, points = 6, secret = false},
[205] = {name = "Castlemania", grade = 2, points = 5, secret = true},
[206] = {name = "Champion of Chazorai", grade = 2, points = 4, secret = false},
[207] = {name = "Chistin Bane", grade = 2, points = 5, secret = false},
[208] = {name = "Clay to Fame", grade = 2, points = 4, secret = true},
[209] = {name = "Culinary Master", grade = 2, points = 4, secret = false},
[210] = {name = "Deep Sea Diver", grade = 2, points = 4, secret = true},
[211] = {name = "Demonbane", grade = 2, points = 6, secret = false},
[212] = {name = "Devovorga's Nemesis", grade = 2, points = 5, secret = true},
[213] = {name = "Elite Hunter", points = 5, secret = false},
[214] = {name = "Exemplary Citizen", grade = 2, points = 4, secret = false},
[215] = {name = "Explorer", grade = 2, points = 4, secret = false},
[216] = {name = "Exterminator", grade = 2, points = 0, secret = false},
[217] = {name = "Follower of Azerus", grade = 2, points = 4, secret = false},
[218] = {name = "Follower of Palimuth", grade = 2, points = 4, secret = false},
[219] = {name = "Friend of the Apes", grade = 2, points = 4, secret = false},
[220] = {name = "Godslayer", grade = 2, points = 4, secret = false},
[221] = {name = "Gold Digger", points = 4, secret = true},
[222] = {name = "Golem in the Gears", grade = 2, points = 4, secret = false},
[223] = {name = "Green Thumb", grade = 2, points = 4, secret = true},
[224] = {name = "Guardian Downfall", grade = 2, points = 4, secret = false},
[225] = {name = "High Inquisitor", grade = 2, points = 5, secret = false},
[226] = {name = "High-Flyer", grade = 2, points = 4, secret = true},
[227] = {name = "Hive Blinder", grade = 2, points = 4, secret = false},
[228] = {name = "Honorary Witch", grade = 2, points = 4, secret = true},
[229] = {name = "Hunting with Style", grade = 2, points = 6, secret = false},
[230] = {name = "In Shining Armor", grade = 2, points = 6, secret = false},
[231] = {name = "Interior Decorator", grade = 2, points = 4, secret = true},
[232] = {name = "Jamjam", grade = 2, points = 5, secret = true},
[233] = {name = "Life on the Streets", grade = 2, points = 4, secret = false},
[234] = {name = "Lord of the Elements", grade = 2, points = 5, secret = false},
[235] = {name = "Lucky Devil", grade = 2, points = 4, secret = true},
[236] = {name = "Manic", grade = 2, points = 0, secret = false},
[237] = {name = "Marble Madness", grade = 2, points = 6, secret = true},
[238] = {name = "Master of the Nexus", grade = 2, points = 6, secret = false},
[239] = {name = "Master of War", grade = 2, points = 6, secret = false},
[240] = {name = "Master Thief", grade = 2, points = 4, secret = false},
[241] = {name = "Mystic Fabric Magic", grade = 2, points = 0, secret = false},
[242] = {name = "Navigational Error", grade = 2, points = 5, secret = true},
[243] = {name = "Nightmare Walker", grade = 2, points = 6, secret = false},
[244] = {name = "Of Wolves and Bears", grade = 2, points = 6, secret = false},
[245] = {name = "One Thousand and One", grade = 2, points = 6, secret = false},
[246] = {name = "Out in the Snowstorm", grade = 2, points = 4, secret = false},
[247] = {name = "Peazzekeeper", grade = 2, points = 6, secret = false},
[248] = {name = "Polisher", grade = 2, points = 4, secret = true},
[249] = {name = "Potion Addict", grade = 2, points = 4, secret = true},
[250] = {name = "Ritualist", grade = 2, points = 6, secret = false},
[251] = {name = "Ruthless", grade = 2, points = 5, secret = false},
[252] = {name = "Scourge of Death", grade = 2, points = 5, secret = true},
[253] = {name = "Ship's Kobold", grade = 2, points = 4, secret = true},
[254] = {name = "Skin-Deep", grade = 2, points = 4, secret = true},
[255] = {name = "Skull and Bones", grade = 2, points = 6, secret = false},
[256] = {name = "Spolium Profundis", grade = 2, points = 4, secret = false},
[257] = {name = "Stomach Ulcer", grade = 2, points = 4, secret = false},
[258] = {name = "Suppressor", grade = 2, points = 4, secret = false},
[259] = {name = "Swashbuckler", grade = 2, points = 6, secret = false},
[260] = {name = "Swift Death", grade = 2, points = 6, secret = false},
[261] = {name = "Top AVIN Agent", grade = 2, points = 4, secret = false},
[262] = {name = "Top CGB Agent", grade = 2, points = 4, secret = false},
[263] = {name = "Top TBI Agent", grade = 2, points = 4, secret = false},
[264] = {name = "True Lightbearer", grade = 2, points = 5, secret = true},
[265] = {name = "Turncoat", grade = 2, points = 4, secret = true},
[266] = {name = "Warlock", grade = 2, points = 6, secret = false},
[267] = {name = "Warlord of Svargrond", grade = 2, points = 5, secret = false},
[268] = {name = "Way of the Shaman", grade = 2, points = 6, secret = false},
[269] = {name = "Wild Warrior", grade = 2, points = 6, secret = false},
[270] = {name = "Dead Lord", grade = 3, points = 8, secret = true},
[271] = {name = "Herbicide", grade = 3, points = 8, secret = true},
[272] = {name = "Lord Protector", grade = 3, points = 8, secret = true},
[273] = {name = "Pwned a Lot of Fur", grade = 3, points = 8, secret = true},
[274] = {name = "Pwned All Fur", grade = 3, points = 8, secret = true},
[275] = {name = "Razing!", grade = 3, points = 7, secret = true}
}
ACHIEVEMENT_FIRST = 1
ACHIEVEMENT_LAST = #achievements
function getAchievementInfoById(id)
for k, v in pairs(achievements) do
if k == id then
local t = {}
t.id = k
for inf, it in pairs(v) do
t[inf] = it
end
return t
end
end
return false
end
function getAchievementInfoByName(name)
for k, v in pairs(achievements) do
if v.name:lower() == name:lower() then
local t = {}
t.id = k
for inf, it in pairs(v) do
t[inf] = it
end
return t
end
end
return false
end
function getSecretAchievements()
local t = {}
for k, v in pairs(achievements) do
if v.secret then
table.insert(t, k)
end
end
return t
end
function getPublicAchievements()
local t = {}
for k, v in ipairs(achivements) do
if not v.secret then
table.insert(t, k)
end
end
return t
end
function doPlayerAddAchievement(cid, ach, showMsg)
local achievement
if isNumber(ach) then
achievement = getAchievementInfoById(ach)
else
achievement = getAchievementInfoByName(ach)
end
if not achievement then return print("[!] -> Invalid achievement \"" .. ach .. "\".") and false end
if not hasAchievement(cid, achievement.id) then
doCreatureSetStorage(cid, achievement.name:lower(), 1)
if getCreatureStorage(cid, ACHIEVEMENTSPOINTS_BASE) < 0 then
doCreatureSetStorage(cid, ACHIEVEMENTSPOINTS_BASE, 0)
end
doCreatureSetStorage(cid, ACHIEVEMENTSPOINTS_BASE, getCreatureStorage(cid, ACHIEVEMENTSPOINTS_BASE) + achievement.points)
if showMsg then
doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "Congratulations! You earned the achievement \"" .. achievement.name .. "\".")
end
end
return true
end
function doPlayerRemoveAchievement(cid, ach)
local achievement
if isNumber(ach) then
achievement = getAchievementInfoById(ach)
else
achievement = getAchievementInfoByName(ach)
end
if not achievement then return print("[!] -> Invalid achievement \"" .. ach .. "\".") and false end
if hasAchievement(cid, achievement.id) then
doCreatureSetStorage(cid, achievement.name:lower(), 0)
doCreatureSetStorage(cid, ACHIEVEMENTSPOINTS_BASE, getCreatureStorage(cid, ACHIEVEMENTSPOINTS_BASE) - achievement.points)
end
return true
end
function hasAchievement(cid, ach)
local achievement
if isNumber(ach) then
achievement = getAchievementInfoById(ach)
else
achievement = getAchievementInfoByName(ach)
end
if not achievement then return print("[!] -> Invalid achievement \"" .. ach .. "\".") and false end
if getCreatureStorage(cid, achievement.name:lower()) > 0 then
return true
end
return false
end
function doPlayerAddAllAchievements(cid, showMsg)
for k, v in pairs(achievements) do
if not hasAchievement(cid, k) then
doPlayerAddAchievement(cid, k, showMsg)
end
end
return true
end
function doPlayerRemoveAllAchievements(cid)
for k, v in pairs(achievements) do
if hasAchievement(cid, k) then
doPlayerRemoveAchievement(cid, k)
end
end
return true
end
function getPlayerSecretAchievements(cid)
local t = {}
for k, v in pairs(achievements) do
if hasAchievement(cid, k) and v.secret then
table.insert(t, k)
end
end
return t
end
function getPlayerPublicAchievements(cid)
local t = {}
for k, v in pairs(achievements) do
if hasAchievement(cid, k) and not v.secret then
table.insert(t, k)
end
end
return t
end
function getPlayerAchievements(cid)
local t = {}
for k, v in pairs(achievements) do
if hasAchievement(cid, k) then
table.insert(t, k)
end
end
return t
end
function isAchievementSecret(ach)
local achievement
if isNumber(ach) then
achievement = getAchievementInfoById(ach)
else
achievement = getAchievementInfoByName(ach)
end
if not achievement then return print("[!] -> Invalid achievement \"" .. ach .. "\".") and false end
return achievement.secret
end
How to use? here is an example of all functions.
data/talkactions/scripts/achievements.lua
Lua:
function onSay(cid, words, param, channel)
if(param == "") then
return true
end
local player, ach
local DESCR = MESSAGE_INFO_DESCR
if words == "/addach" then
param = string.explode(param, ",")
if not param[2] then
return doPlayerSendCancel(cid, "Invalid achievement id/name.")
end
if not getPlayerByNameWildcard(param[1]) or getPlayerByNameWildcard(param[1]) == "" then
return doPlayerSendCancel(cid, "Invalid player name.")
end
player, ach = getPlayerByNameWildcard(param[1]), param[2]
ach = type(ach) == "string" and getAchievementInfoByName(ach) or getAchievementInfo(tonumber(ach))
if ach then
if playerHasAchievement(cid, ach.id) then
doPlayerSendCancel(cid, "Player already has the achievement \"" .. ach.name .. "\".")
else
doPlayerAddAchievement(player, ach.id, (param[3] and true or false))
doPlayerSendTextMessage(cid, DESCR, "You added achievement " .. ach.id .. " (" .. ach.name .. ") to " .. param[1] .. ".")
doPlayerSendTextMessage(player, DESCR, "You received the achievement: " .. ach.name)
doSendMagicEffect(getCreaturePosition(player), CONST_ME_MAGIC_RED)
return true
end
else
return doPlayerSendCancel(cid, "Invaled achievement.")
end
elseif words == "/addallach" then
param = string.explode(param, ",")
player = getPlayerByNameWildcard(param[1])
if not player or player == "" then
return doPlayerSendCancel(cid, "Invalid player name.")
end
doPlayerAddAllAchievements(player, (param[2] and true or false))
doPlayerSendTextMessage(cid, DESCR, "You added all achievements to " .. param .. ".")
doPlayerSendTextMessage(player, DESCR, "You received all achievements.")
doSendMagicEffect(getCreaturePosition(player), CONST_ME_MAGIC_RED)
return true
elseif words == "/removeach" then
param = string.explode(param, ",")
if not param[2] then
return doPlayerSendCancel(cid, "Invalid achievement id/name.")
end
if not getPlayerByNameWildcard(param[1]) or getPlayerByNameWildcard(param[1]) == "" then
return doPlayerSendCancel(cid, "Invalid player name.")
end
player, ach = getPlayerByNameWildcard(param[1]), tonumber(param[2])
ach = type(ach) == "string" and getAchievementInfoByName(ach) or getAchievementInfo(tonumber(ach))
if ach then
if playerHasAchievement(cid, ach.id) then
doPlayerRemoveAchievement(player, ach.id)
doPlayerSendTextMessage(cid, DESCR, "You removed achievement " .. ach.id .. " (" .. ach.name .. ") to " .. param[1] .. ".")
doPlayerSendTextMessage(player, DESCR, "You lost the achievement: " .. ach.name)
return true
else
return doPlayerSendCancel(cid, "That player doest not has that achievement.")
end
else
return doPlayerSendCancel(cid, "Invaled achievement.")
end
elseif words == "/removeallach" then
player = getPlayerByNameWildcard(param)
if not player or player == "" then
return doPlayerSendCancel(cid, "Invalid player name.")
end
doPlayerRemoveAllAchievements(player)
doPlayerSendTextMessage(cid, DESCR, "You removed all achievements to " .. getCreatureName(player) .. ".")
doPlayerSendTextMessage(player, DESCR, "You lost all achievements.")
return true
elseif words == "/getach" then
player = getPlayerByNameWildcard(param)
if not player or player == "" then
return doPlayerSendCancel(cid, "Invalid player name.")
end
local ach = getPlayerAchievements(player)
if #ach > 0 then
local text = ""
for i = 1, #ach do
text = text .. getAchievementInfo(tonumber(ach[i])).id .. " - " .. getAchievementInfo(tonumber(ach[i])).name .. "\n"
end
return doShowTextDialog(cid, 2195, "Player " .. param .. " has the following achievements...\n\n" .. text)
else
return doPlayerSendTextMessage(cid, DESCR, "Player " .. param .. " does not have any achievements.")
end
elseif words == "/getsecretach" then
player = getPlayerByNameWildcard(param)
if not player or player == "" then
return doPlayerSendCancel(cid, "Invalid player name.")
end
local ach = getPlayerSecretAchievements(player)
if #ach > 0 then
local text = ""
for i = 1, #ach do
text = text .. getAchievementInfo(tonumber(ach[i])).id .. " - " .. getAchievementInfo(tonumber(ach[i])).name .. "\n"
end
return doShowTextDialog(cid, 2195, "Player " .. param .. " has the following secret achievements...\n\n" .. text)
else
return doPlayerSendTextMessage(cid, DESCR, "Player " .. param .. " does not have any secret achievements.")
end
end
return true
end
data/talkactions/talkactions.xml
XML:
<talkaction words="/addach;/addallach;/removeach;/removeallach;/getach;/getsecretach" event="script" value="achievements.lua"/>
Commands:
* /addach -- add achievement to a player (/addach Darkhaos, 5 - /addach Darkhaos, Chorister)
* /addallach --add all achievements to a player (/addallach Darkhaos)
* /removeach --remove achievement to a player (/removeach Darkhaos, 5 - /removeach Darkhaos, Chorister)
* /removeallach --remove all achievements to a player (/removeallach Darkhaos)
* /getach --get achievements from a player (/getach Darkhaos)
* /getsecretach --get secret achievements from a player (/getsecretach Darkhaos)
Please report all bugs here... Enjoy.
Last edited: