- local allmaps = { "Gema Francais 2009 - Roi des Gemas",
- "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!goku-gema!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!GEMA_COLOR!!!!F.u#NICKY_GEMA_COLLOUR!!!!!",
- "!!!!!!!!!!!!!!!!!!!!!!goku-gema!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "!!!!!!!!!!!!!!!!Gema_CARTman_And_Tealulc",
- "!!!!!!!!!!A_GEMA!difficult!!!!!!!!!!",
- "!!!!!!!!!!Gema.Mauricio.Br.V12.2!!!!!!!!!!",
- "!!!!!!!!!!GEMA_2_WAYS_BY_.PTF_YOURMUM",
- "!!!!!!!G3M4_Brasilll_By_KriSiOn---!!",
- "!!!!!!!GemaBrasil_by_krision.$R$.",
- "!!!!!--!!!!!Gema++#F.U#",
- "!!!!!GEM@_OsK_Muito_LOK@!!!!!!",
- "!!!!!Gema.Do.Mauricio.BR!!!!!",
- "!!!!!GEMA_INTTELIGENCE!!!!!",
- "!!!!GEM@=BOMBERS-LEGENDARYS-E=FUZILEIROS",
- "!!!!GEM@=BOMBERS-LEGENDARYS-E=FUZILEIROS_v2",
- "!!!!GeMa_-d+d!.&.tim-xD",
- "!!!!Nicky_GEM@_2010_HARD!!!!",
- "!!!g3m@=sn1p3r_sh0t!!!",
- "!!!GEMA White Room Purple!!!",
- "!!!Gema!!!2009-by_Mr.Potatohead.",
- "!!!Gema!!!2009-by_Mr.Potatohead",
- "!!!gema!!!brown",
- "!!!GEMA!!!LOL!!!",
- "!!!gema!!!xxx3!!!",
- "!!!GEMA-Green(short)",
- "!!!GEMA-XXX-XXX-!!!",
- "!!!GEMA-XXX-XXX-XXX-!!!-(No_Se)",
- "!!!Gema.._M.a.C_hun.T-Tailor",
- "!!!GEMA@MAGIC_GREENLAND!!!",
- "!!!GemAaAaAaAaAa",
- "!!!Gema_By_Tealulc_And_Balou",
- "!!!Very!Good!Gema!!!",
- "!!!VERY!GOOD!GEMA!!!_v2",
- "!!!W00D_G3M4!!",
- "!!-HOT-GIRLS-GEMA-NAKED",
- "!!Easy_Gema_by_M0nsterkiller!!",
- "!!GEMA by DEATH [SUN] & CC Toni",
- "!!gema by yata & punjab!!",
- "!!gema!!m0nst3r",
- "!!GEMA-HARDandEASY-HB!!",
- "!!Gema..normal .By yata!!",
- "!!LS-GeMa=X.klanox",
- "!!Very Hard GEMA HS.FR!!",
- "!$!GemaT.S.O.RAP_Menace13!$!",
- "!+_+!GEMA!+_+!",
- "!+_+!GEMA_CLUB!+_+!",
- "!-!gema!-! ~ AudioJunkie ~ Tooph ~ sexygema944",
- "!A-C-A.SpecilGema_LSS!",
- "!BEN!_GEMA-NOT-LONG-DIFFICULT-NO-KILL",
- "!BEN!_GeMa_10_Levels",
- "!BEN!_GEMA_15_Levels_Beginner-map",
- "!BEN!_GEMA_Blue",
- "!BEN!_GEMA_LONG",
- "!BEN!_GEMA_LONG_2",
- "!BEN!_GEMA_LONG_AND_DIFFICULT-long-version",
- "!BEN!_GEMA_LONG_AND_DIFFICULT-simple-version",
- "!BEN!_GEMA_NO_NOOBS",
- "!delishe's-gema-y0zgat!.$R$.",
- "!delishe's-gema-y0zgat!",
- "!GEMA!-BAM-OIDA by stefel + hai",
- "!GEMA!-Free Fall by stefel",
- "!GEMA!-RING by stefel",
- "!GeMa-by-arvyduxx-FiNiShEd.$R$.",
- "!GeMa-by-arvyduxx-FiNiShEd",
- "!GeMa-by-arvyduxx",
- "!Gema-Extrem-y0zgat!",
- "!GeMa-gowac.webs.com.$R$.",
- "!GeMa-gowac.webs.com",
- "!Gema-Hard-Yozgat!",
- "!GeMa",
- "!Gema.Debutant.Colors",
- "!GemabyK!ll-Mutiny!",
- "!Gema_4all!",
- "!Gema_Choices!",
- "!gema_GAGA",
- "!KWxGema(Suicide-Choose)_by_KingWar",
- "!KWxGemaOnEarth_by_KingWar",
- "!KWxVertigeGema_by_KingWar",
- "!KWxVeryHardGema_by_KingWar",
- "!mini--gema--y0zgat!",
- "!New-Gema-y0zgat!",
- "!PK!GEMA_134a2_xXx_No_kiLL!!!!.",
- "!PK!GEMA_13a1_XxX_lol_123456789",
- "!TheBestGema!_by_Riiak_&_KingWar",
- "!y0zgat-gema!",
- "!^_Heavy_Met@l_Gem@_T.S.O.RAP_^!",
- "!_B0X_0F_Gema_T.S.0_RAP_!",
- "#gema-=)-mode#",
- "#Gema-SK-=)#",
- "#Gema-SK-by-=)#",
- "#Gema-White-Black-=)#.$R$.",
- "#Gema-White-Black-=)#",
- "#gema_Maze1.1",
- "$$$.THE.G3M@.Do.KiLL.$$$",
- "$uperior_Gema_V.2",
- "+!!gEmA!!+sExY(o)(o)dUnGeOn!.$R$.",
- "+!!gEmA!!+sExY(o)(o)dUnGeOn!",
- "+=_GEMA_=+CastleD00m!!!",
- "+GEMA+_by_didisuper!!!",
- "--GEMA-- ALL IN ONE!!!",
- "...G3M4...by...TraKinaS",
- "..gema..cave..",
- ".=L-E=.Gema",
- ".Gema-by-Jens.",
- "0===STAFFLORDS_NEW_GEMA_AND_LABYRINTHCTF",
- "111S0MM3R_G3M4",
- "40+ Gema (final version)",
- "40+ Gema (Fixed)",
- "40+Gema(finalversion)",
- "63gema.$R$.",
- "63gema",
- "=()gEmA()=sExYbEbOp.$R$.",
- "=()gEmA()=sExYbEbOp",
- "=(GEM@)=_NO-KILL.X",
- "=(o)=GEMA=(o)=.$R$.",
- "=(o)=GEMA=(o)=",
- "=CEF=GEMA_NO_KILL",
- "=Gema#Terror=",
- "=GEMA=AC-Gaara(beta)",
- "=GEMA=AC-Gaara.$R$.",
- "=GEMA=AC-Gaara",
- "=GEMA=AC-Jaomap.$R$.",
- "=GEMA=AC-Jaomap",
- "=GEMA=AC-Mega",
- "=GEMA=alienware.$R$.",
- "=GEMA=alienware",
- "=Gema=BuddelRemakeBetter",
- "=GEMA=Dunuts=Chili",
- "=GEMA=InCrEdIbLe=GEMA=",
- "=GeMa=[Skullkid-Buddel-Ua51]",
- "=Gema=_(Buddel)",
- "=Gema=_(Buddel)REMAKE_BY_UNARMED",
- "=GeMa=_2.1_by_SoM3GuY",
- "=LUNA=_GEMA_1",
- "=MC=Gema",
- "=MC=Gema=SkyHigh",
- "=]gema[=PK_park",
- "A-C-A.Gema.Debutant",
- "A-C-A.Gema6",
- "A-C-A.GemaInvisible.V2.2.$R$.",
- "A-C-A.GemaInvisible.V2.2",
- "A-C-A.GemaInvisible.V2",
- "A-C-A.Gema[RKO]",
- "A-C-A.SpecialGema,V5",
- "A-C-A.SpecialGema",
- "A-C-A.SpecialGema.V2",
- "A-C-A.SpecialGema.V3",
- "AcP_gema2",
- "ac_gema-by-raytman",
- "ac_gema12",
- "ac_gemabysuckers.$R$.",
- "Ac_GemaBySuCkeRs",
- "ac_gematron",
- "ac_gema{CB}_v2",
- "Ac_SuperGemaBySuCkeRs",
- "ac_swissmade(GEMA)",
- "AncientGoldGema-By_GemaPro",
- "Artistic_Piece_of_Shit_by_Zeme111",
- "ASpaceGEMA.$R$.",
- "ASpaceGEMA",
- "AU&M_Gema.$R$.",
- "AU&M_Gema",
- "aw_Gema difficult",
- "aw_GEMA Mega",
- "aw_GEMA-Mega",
- "aw_GEMA-Met@l",
- "aw_GEMA-Novice",
- "aw_Gema-Tarzan",
- "A_GeMa_pOy",
- "BL_gema",
- "bossepeach",
- "Bossy_Peaches_Gema1",
- "Bossy_Peaches_Gema7",
- "CC_gema-Battle",
- "CC_gema.$R$.",
- "CC_gema",
- "CC_Gema2.$R$.",
- "CC_Gema2",
- "cheapgema",
- "CL-GeMa",
- "CLAN-DTN.AC_GEMA-FACIL",
- "CLAN_SERVER-DTN.!!!!!!GEMA!!!FACIL",
- "CR_gema2_v.2",
- "CR_GEMA_V.5",
- "cS_MiniGema",
- "cS_MiniGema2",
- "difficultgema",
- "DKK_Gema_Easy",
- "doa_gema",
- "DRAGON_spongy_champion-gema",
- "DrunksGema",
- "DsQ_Gema.$R$.",
- "DsQ_Gema",
- "Easy-and-Hard-GEMA",
- "easygema",
- "easy_gema_koth",
- "easy_GERMA_BUT_NO_KILL",
- "EC.GemaII",
- "EC.GemaII3",
- "EC_Gema00.$R$.",
- "EC_Gema00",
- "F.F.A_gema-hard-for-noobs",
- "fc_gema.$R$.",
- "fc_gema",
- "FOX_gema_francais",
- "FraG-GeMa",
- "Fully_Flared__Gema!!!_By_Alienware_Sick(modif)",
- "Fully_Flared__Gema!!!_By_Alienware_Sick",
- "G11_Gema.$R$.",
- "G11_Gema",
- "G3M4-L0K4_xD",
- "G3M4_R34LM0UNT41N5",
- "g3m@=sn1p3r_sh0t1",
- "g3m@=sn1p3r_sh0t2",
- "G3MA=D3THMATCH",
- "Gem@_secret_route_comp=brasil-scale2.0",
- "GEMA 2009 - AntiNoob - V2",
- "gEMA FRANCAIS 2009 - Impossible [FOX]",
- "gEMA FRANCAIS 2009 - PaRtY GeMa",
- "Gema Francais 2009 - Roi des Gemas",
- "Gema la momie",
- "GeMa ~ CaStLe FlAg",
- "gEmA!_dReAdLoCk_m0oNpIe",
- "GEMA##WFA_ByDest##",
- "gema#7(easy~street).$R$.",
- "gema#7(easy~street)",
- "GEMA'ARCHER'DE'TOUT'LES'COTER'#F.U#",
- "GEMA'GEMA(GEMA)[GEMA]_GEMA_lil",
- "GEMA's_patience",
- "gema(beta)",
- "GEMA(caution-this-gema-is-very-hard-its-not-for-debutant",
- "gema(Spartan)",
- "gema,suisse",
- "GeMa---Predator--&--Hans",
- "Gema-008",
- "Gema-Alemao-Novo",
- "gema-allstarellis-edition",
- "gema-by-homer",
- "gema-by-ivan",
- "Gema-Commander-Edition",
- "Gema-E-M",
- "gema-easy-by-piuska",
- "GEMA-easy-GEMA",
- "gema-Enzo",
- "Gema-ESPANA-(corto)",
- "Gema-Factory-By-All-Star-Ellis-FIXED",
- "Gema-Factory",
- "GEMA-FaTal-f0liE",
- "Gema-Ge-Force",
- "GEMA-GEMA-GEMA-TRALALALILAAAA!!!!!!!!!!BY-LILWAYNE",
- "gEMA-GERMANY-IMPOSSIBLE",
- "Gema-Hard_V1",
- "Gema-Jungle",
- "Gema-Kruzzeg_SmurfD24",
- "GEMA-lightings2",
- "GEMA-lightings2_v2",
- "gema-magic",
- "gema-mines",
- "Gema-Mountain",
- "GEMA-NOOB-PROOF",
- "Gema-Novinho_By-_-GuNs_Alemao",
- "gema-paradise.$R$.",
- "gema-paradise",
- "gema-PreDator+grandes+psycko.$R$.",
- "gema-PreDator+grandes+psycko",
- "GEMA-R0LLER-COAST3R-W0NDERLAND",
- "Gema-Reach.The.Top---NO-KILL!!.$R$.",
- "Gema-Reach.The.Top---NO-KILL!!",
- "Gema-Short_V1",
- "Gema-SK-2",
- "Gema-SK-4",
- "Gema-SK-5",
- "Gema-teur-[rpg]-reserv_[rpg]",
- "gema-tMp",
- "gema-tomb",
- "GEMA-Toppler-by-Stream",
- "gema.artli.jump_jump_jump",
- "gema.artli.nades",
- "GEMA",
- "Gema.Hard.For.TMDC",
- "gema.killer",
- "gema.manfestoeh+PTF.mountainfixed",
- "gema.manfestoeh.alleyway",
- "gema.manfestoeh.bombdefuseLVL1",
- "gema.manfestoeh.calming",
- "gema.manfestoeh.castlegema.LVL6",
- "gema.manfestoeh.complexchase1.lesslag",
- "gema.manfestoeh.complexchase1extended",
- "gema.manfestoeh.complexchase2",
- "gema.manfestoeh.forbegginers",
- "gema.manfestoeh.forexperts",
- "gema.manfestoeh.forexpirenced",
- "gema.manfestoeh.gema4ever!",
- "gema.manfestoeh.gema4ever.SP",
- "gema.manfestoeh.horror",
- "gema.manfestoeh.lost!",
- "gema.manfestoeh.medium",
- "gema.manfestoeh.metal",
- "gema.manfestoeh.mountainlarge",
- "gema.manfestoeh.mountainsmall",
- "gema.manfestoeh.randomnessgema+ladders",
- "gema.manfestoeh.roofjumps",
- "gema.manfestoeh.snailtrail",
- "gema.manfestoeh.snipershotstyle",
- "gema.manfestoeh.streetchase",
- "gema.manfestoeh.streetchase2",
- "gema.manfestoeh.streetchase3",
- "gema.manfestoeh.streetchase5",
- "gema.manfestoeh.thekillergema",
- "gema.manfestoeh.thelab",
- "gema.manfestoeh.ThePunisherLVL10",
- "gema.manfestoeh.timetrail.LVL3",
- "gema.manfestoeh3.REV.II",
- "gema.manfestoh!",
- "gema.maze.pwnage",
- "Gema.Swirl",
- "gema01",
- "gema01_by_Mafia78#_and_Kyba",
- "gema02",
- "gema03",
- "gema1",
- "gema1000",
- "gema1021",
- "gema11",
- "gema114",
- "gema117",
- "gema118",
- "gema124",
- "gema125",
- "gema125{TyD}",
- "gema133",
- "gema134a",
- "gema137",
- "gema144",
- "gema16",
- "gema2",
- "gema20",
- "gema200",
- "gema2010nr1_MaP",
- "gema2010nr2_MaP",
- "gema202",
- "gema203",
- "gema209",
- "gema29",
- "gema30",
- "gema5000",
- "gema66Gundark",
- "gema777",
- "Gema888",
- "gema9",
- "gema927",
- "GeMa==ChocolateBrown-Predator(no-kill)",
- "gema=by=dudu.and.bruninha",
- "GEMA=DUNUTS=CHILI",
- "gema=Guillermo.$R$.",
- "Gema=[Diga]=Ai",
- "GeMaFernandoSuarezNS",
- "gemagreen",
- "GemaJD",
- "gemaMickye",
- "Geman3",
- "GEMApoolConcept_ByIAFMarko",
- "GemaSuperHard",
- "GEMATEST9",
- "GEMAv.2",
- "gemavosje",
- "GEMA_+wallis+",
- "GeMa_--Predator-And-Killaz",
- "GEMA_01",
- "gema_06_light",
- "gema_113",
- "gema_2009_RedRaven&BlackEye",
- "Gema_2009_RedRaven_BlackEye_Beta",
- "GEMA_3_Buddel_FIXED",
- "gema_40.$R$.",
- "gema_40",
- "GEMA_4_Buddel",
- "GEMA_4_Buddel_FIXED",
- "gema_4_By_K!LL_Fixed",
- "gema_4_By_K!LL_Fixed_2",
- "gEMA_5_Buddel_FIXED",
- "gema_62",
- "gema_62_laby",
- "gema_888_by_h00LiGaN",
- "gema_888_{BIC}.$R$.",
- "gema_888_{BIC}",
- "GEMA_ALL_IN_ONE_V2",
- "GeMa_AnGeLS_BiG",
- "GeMa_AnGeLS_MiNi",
- "gema_anti-kill__afro_samurai#2",
- "gema_arena",
- "Gema_Beta_Original_1.0",
- "GEMA_BLUE&RED",
- "GEMA_bootcamp",
- "GEMA_Bugboy1028_MAP_num.1",
- "gema_bunny",
- "Gema_by_Artigo_and_fifa09",
- "Gema_BY_BZE_ProSniper_&_Sparta",
- "Gema_by_osiris",
- "gema_city",
- "gema_cl_lights0.2",
- "gema_door-maze",
- "gema_dragonworld",
- "Gema_Easy",
- "Gema_easy_by_Artigo_and_hablo_tu_idioma",
- "gema_easy_by_fifa",
- "GEMA_Final_by_#L0u!$",
- "GEMA_FINAL_KAOS",
- "GEMA_FLNC13",
- "gema_follow-the-light",
- "gema_francais!!_par_Kyba",
- "Gema_FRUSTRATION!!!_by_Fate",
- "Gema_fr_2009_partygema.$R$.",
- "gema_gallery",
- "gema_gegegema_N.BAK",
- "GEMA_GERMANY_IMPOSSIBLE_PRIVATE",
- "GEMA_GERMANY_IMPOSSIBLE_WITH_TEXTURE",
- "GEMA_GIANT-GEMA_NO_KIL!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",
- "GeMa_GuNs-Alemao",
- "Gema_GV",
- "gema_hardfrancais!_by_BadBoy#1",
- "gema_horror",
- "gema_horror_house",
- "GEMA_IMPOSIBLE_INFERNORBR_AND_GETTO",
- "GEMA_IMPOSSIBLE_BASE",
- "GEMA_IMPOSSIBLE_GEARS",
- "GEMA_IMPOSSIBLE_ZONE",
- "gema_industrial_N-E",
- "GEMA_iniciante_do,w4r.EASY",
- "Gema_I_Can_Fly_By_The_Tank",
- "gema_jumping",
- "Gema_K&L_1.0",
- "Gema_Mario",
- "gema_monas.$R$.",
- "GEMA_nothingnewedition",
- "gema_nrmi",
- "Gema_Of_Invisoh",
- "Gema_Of_Swamp",
- "gema_parkour",
- "Gema_Par_WilliamB_0.1",
- "gema_pen-mountain",
- "Gema_Pic by DeadKillerMan",
- "Gema_Pic_by_.CEF.KingWar",
- "gema_Prince_0f_Persia",
- "GEMA_PRINCE_IMPOSSIBLE",
- "gema_RedRaven2",
- "gema_royeur",
- "gema_RUS.$R$.",
- "gema_saucy_cement",
- "Gema_SuperSniper",
- "GEMA_TOOTHLESS2",
- "GEMA_TRANSFORMERS",
- "Gema_Tunnels",
- "GEMA_UBER_PWN",
- "GEMA_WATER_amador_w4r_",
- "gEMA_YESKILL-BETA3",
- "gema_yeskill2-beta4",
- "gema_yusuke'xto-thez.$R$.",
- "gema___Boerndai",
- "Gema_{TD}",
- "gemma_shallim!!",
- "gemma_shawllim_reformed",
- "gena06",
- "GETTO-GEMA-!NO-KILL!",
- "GR4V3 G3M4 M0R3 E4SY",
- "great-race1(NO_KILL)",
- "green_gema_level",
- "GTRgema",
- "GuiGemaClips3",
- "GuiGemaClips_1",
- "H.S.FR.METAL.GEMA.ADSL",
- "H0N3Y_G3M4-V2.0",
- "HanzeGema",
- "hardgema",
- "Hard_Gema_v90",
- "Horus=firstGemas",
- "housejumpgema",
- "Hun-DarthAlex-teror-GeMa!!!",
- "Hun[GEMA-max]",
- "Hun[M.a.C.]-gema3-",
- "Hun[M.a.C.]gema-kegy",
- "Hun[M.a.C.]__gema__",
- "iDisco-Gema[2.6]",
- "iDisco-Gema[3.0]",
- "Impossible_TREE!_Gema!~By~SouthAuckland(S.A)&ALE-G",
- "intelligent_gema",
- "iTz_hyperGEMA!",
- "IWASBOREDSOIMADEA((((==GEMA!!!==))))",
- "I_L3T-My$e7F_G0-G3M4",
- "jesusGEMAkillYEAH!!!!!!",
- "JIGSAW_1.1",
- "jump_construct",
- "JuMp_GeMa_AnGeLS",
- "jump_objective",
- "jump_training",
- "jump_vertigo",
- "K.DeathRun-0.94",
- "K.DeathRun.Francais",
- "Ketchup_Gema2.0",
- "Ketchup_Gema2.6",
- "Ketchup_SandGema_v1.0",
- "Kyba&Yozgat.Gema04",
- "LA-PLU-GRANDE-GEMA-DE'AC",
- "Master_of_Gema's",
- "MenacingGema",
- "miesegema",
- "Mini.Hard.Gema",
- "miniGema2",
- "minigema_hard",
- "minilaby",
- "MiniParkours5",
- "moddedgema.$R$.",
- "moddedgema",
- "mountains_lights",
- "mUltimateGemmaxx",
- "mUltimateGemma_XXX",
- "nadejumpgema",
- "Natural Easy - GEMA",
- "Nature_Gema",
- "New.Hard.Gema",
- "NEW_GEMA",
- "NG2-Gema2",
- "Realistic_Gema.$R$.",
- "Realistic_Gema",
- "rooms-of-gema",
- "royeur",
- "S3XY-G3MA",
- "Salo_Gema_Tiles",
- "Saw_1_Gema",
- "sExYgEmA2(aMbUsH_eDiTiOn!)",
- "SJ-Joao_GETMAP_GEMA_!!!_NO_KILL",
- "SJ_GEMA_LOKA_2010",
- "Sniper-Gema-Hunting-WORld-Bitch",
- "special_gema_WWWW",
- "SpongyDragonChampionGema",
- "SpongyGema",
- "straining",
- "straining2",
- "SuperGema_V1.5",
- "Super_Gema_V1.5_(Easyer)",
- "TallTowerBright(Gema)byGemaPro",
- "tennis_wall",
- "The-NO_KILL-gema_by-Stassie-&-samsattF",
- "thehardestgemaeveeeeeeeeeeeeeeeeeeeerACAgema1",
- "training(gema)01",
- "training(gema)02",
- "training(gema)06",
- "training_parkour",
- "Un-Gema-Du-F.F.A",
- "vildark-gg",
- "vildark-impossible",
- "xXx-gema-xXx_by+wallis+",
- "^%GEMA#%^__8====D",
- "_++_GEMA_++_uberstupid",
- "_GEMA_-D+D!_HARD_FLAG_",
- "`!Getto_Gema_T.S.O.RAP!`",
- "{8ac8}gema_realy_hard",
- "{ACA}^REM[ii]X^_Illusionist_Gema",
- "{AS}Gema_by_ZeRo",
- "{MFK}GEMA",
- "{TaR}Gema_Lvl'S_1-5",
- "~=Gema-Terror=~",
- "~GEMA=[ORANGE]=GEMA~",
- "~SUPER~CHILL~GEMA~EZ~"}
- --GemaScript (c) 2010 BS-CiD, Rikki Guy, email: rikki.guy@gmail.com
- PLUGIN_NAME = "GemaScript"
- PLUGIN_AUTHOR = "BS-CiD"
- PLUGIN_VERSION = "0.5"
- include("split")
- include("ac_server")
- --[[
- TODO:
- Auto-Starting timer DONE
- display time upon score DONE
- store map scores DONE
- !reset command DONE
- store your times per-mapDONE
- overall map record DONE
- personal map record DONE
- ->achivements TODO
- ]]
- --[[
- Client Struct:
- besttime -> thier personal map best
- numtimes -> number of times this person has completed this map
- ]]
- --[[
- MapInfo:
- besttime -> the best time
- bestname -> name of the player who made the best time
- numtimes -> number of times this map has been completed
- ]]
- CLIENTINFO_CFG = "gema_clients"
- MAPINFO_CFG = "gema_maps"
- local clients = {}
- local starttimes = {}
- local mapinfo = {}
- local nextmap = 0
- local nextmode = 0
- --useful functions
- function randmap()
- return allmaps[math.random(1, 565)]
- end
- function PrintMsg(text, cn)
- clientprint(cn, "[\f1GEMA\f5] "..text)
- end
- function PrintMsgToAll(text)
- for t=0,14,1 do
- if isconnected(t) then
- PrintMsg(text, t)
- end
- end
- end
- function GetFormattedTime(secs)
- if secs < 0 then
- return "none"
- end
- local sec = math.floor(math.mod(secs, 60))
- local mins = math.floor(math.mod((secs / 60), 60))
- local hrs = math.floor(math.mod((secs / 3600), 24))
- local secstr = ""
- local minstr = ""
- local hrstr = ""
- if sec < 10 then
- secstr = "0"..sec
- else
- secstr = tostring(sec)
- end
- if mins < 10 then
- minstr = "0"..mins
- else
- minstr = tostring(mins)
- end
- if hrs < 10 then
- hrstr = "0"..hrs
- else
- hrstr = tostring(hrs)
- end
- return string.format("%s:%s:%s",hrstr,minstr,secstr)
- end
- function EmptyClientInfo(pid)
- local id = pid+1
- clients[id] = {
- ["besttime"] = -1,
- ["numtimes"] = 0
- }
- end
- function LoadClientInfo(pid)
- if not isconnected(pid) then return false end
- local id = pid+1
- local name = getname(pid)
- clients[id] = {}
- local infostr = cfg_getvalue(CLIENTINFO_CFG, name..":"..getmapname())
- print("CLIENTINFO_STRING: "..infostr)
- if infostr == "(fail)" or infostr == "" or infostr == nil then
- return false
- end
- print("CLIENTINFO_STRING_PROCESSED: "..infostr)
- local info = split(infostr, "[ ]")
- print("CLIENTINFO_DATA: "..tostring(info))
- for i=1, #info do
- local kv = split(info[i],"~")
- clients[id][kv[1]] = tonumber(kv[2])
- print("Loaded "..kv[1].." : "..kv[2])
- end
- return true
- end
- function StoreClientInfo(pid)
- if not isconnected(pid) then return false end
- local id = pid+1
- local storestr = ""
- for k,v in pairs(clients[id]) do
- storestr = storestr..k.."~"..v.." "
- end
- print("STORE_STRING: "..storestr)
- cfg_setvalue(CLIENTINFO_CFG, getname(pid)..":"..getmapname(), storestr)
- end
- function StoreAll()
- for i=0, maxclient()-1 do
- StoreClientInfo(i)
- end
- end
- function LoadAll()
- for i=0, maxclient()-1 do
- if not LoadClientInfo(i) then EmptyClientInfo(i) end
- end
- end
- function EmptyAll()
- for i=0, maxclient()-1 do
- EmptyClientInfo(i)
- end
- end
- function LoadMapInfo()
- print("MAPDATA <- CFG")
- local name = getmapname()
- mapinfo = {}
- local infostr = cfg_getvalue(MAPINFO_CFG, name)
- print("MAPINFO_STRING: "..infostr)
- if infostr == "(fail)" or infostr == "" or infostr == nil then
- return false
- end
- print("MAPINFO_STRING_PROCESSED: "..infostr)
- local info = split(infostr, " ")
- print("MAPINFO_DATA: "..tostring(info))
- for i=1, #info do
- local kv = split(info[i],"~")
- if kv[1] ~= "bestname" then
- mapinfo[kv[1]] = tonumber(kv[2])
- else
- mapinfo[kv[1]] = kv[2]
- end
- end
- return true
- end
- function StoreMapInfo()
- print("MAPDATA -> CFG")
- local name = getmapname()
- local storestr = ""
- for k,v in pairs(mapinfo) do
- storestr = storestr..k.."~"..v.." "
- end
- cfg_setvalue(MAPINFO_CFG, name, storestr)
- end
- function EmptyMapInfo()
- mapinfo = {
- ["besttime"] = -1,
- ["bestname"] = "nobody",
- ["numtimes"] = 0
- }
- end
- function ResetTime(pid)
- local id = pid+1
- starttimes[id] = getsvtick()
- end
- function ClientInfo(pid, name)
- if clients[pid+1][name] == nil then
- return nil
- else
- return clients[pid+1][name]
- end
- end
- function MapInfo(name)
- if mapinfo[name] == nil then
- return nil
- else
- return mapinfo[name]
- end
- end
- function NumClients()
- local num = 0
- for i=0, maxclient()-1 do
- if isconnected(i) then num = num + 1 end
- end
- return num
- end
- --hooks
- function onPlayerConnect(pid)
- PrintMsg("Welcome to this GemaScript server!", pid)
- if NumClients() <= 1 then
- math.randomseed(getsvtick())
- changemap(randmap(), GM_CTF, 15);
- onInit()
- if not LoadMapInfo() then EmptyMapInfo() end
- PrintMsg("Please just type /autoteam 0 !!!!!", pid)
- end
- clients[pid+1] = {}
- if not LoadClientInfo(pid) then EmptyClientInfo(pid) end
- --PrintMsg("You have completed this map\f1 "..ClientInfo(pid,"numtimes").." \f5times, with a best time of \f3"..GetFormattedTime(ClientInfo(pid, "besttime")), pid)
- end
- function onPlayerDisconnect(pid)
- StoreClientInfo(pid)
- EmptyClientInfo(pid)
- if NumClients() <= 1 then StoreMapInfo() end
- end
- function onPlayerSpawn(pid)
- PrintMsg("You have completed this map\f1 "..ClientInfo(pid,"numtimes").." \f5times, with a best time of \f3"..GetFormattedTime(ClientInfo(pid, "besttime")), pid)
- ResetTime(pid)
- PrintMsg("Your timer has started! Get Gema-ing!", pid)
- flagaction (pid, 1)
- end
- function onMapEnd()
- StoreAll()
- StoreMapInfo()
- if nextmap == 1 then
- nextmap = 0
- else setnextmap(randmap());
- end
- if nextmode == 1 then
- nextmode = 0
- else setnextmode(5);
- end
- end
- function onMapChange(mapname)
- onInit()
- if not LoadMapInfo() then EmptyMapInfo() end
- LoadAll()
- search_gema(getmapname())
- if gematest == 1 then
- PrintMsgToAll("\f2OK, this map must be a \f3Gema :D")
- elseif gematest == 2 then
- PrintMsgToAll("\f2Are you sure that this map is a \f3Gema?")
- end
- end
- function onFlagAction(pid, act, fid)
- local id = pid+1
- if act == FA_SCORE then
- --PrintMsg("\f3SVTICK: "..tostring(getsvtick()))
- --PrintMsg("\f3START_TIME: "..tostring(svtick()))
- local tme = (getsvtick() - starttimes[id]) / 1000
- starttimes[id] = -1
- clients[id]["numtimes"] = ClientInfo(pid, "numtimes") + 1
- mapinfo["numtimes"] = mapinfo["numtimes"] + 1
- PrintMsg("Player\f1 "..getname(pid).." \f5has finished with a time of \f3"..GetFormattedTime(tme), -1)
- if tme < ClientInfo(pid, "besttime") or ClientInfo(pid, "besttime") == -1 then
- PrintMsg("\f0Congratulations!\5 this is a new personal best for this map!", pid)
- clients[id]["besttime"] = tme
- end
- if tme < mapinfo["besttime"] or mapinfo["besttime"] == -1 then
- PrintMsg("\f0Congratulations!\5 Player\f3 "..getname(pid).." \f5has broken the previous record of\f3 "..GetFormattedTime(MapInfo("besttime")).." \f5(held by\f0 "..MapInfo("bestname").."\f5) for this map!", -1)
- mapinfo["besttime"] = tme
- mapinfo["bestname"] = getname(pid)
- end
- spawn(pid, 100, 0, 0, 0, GUN_GRENADE, GM_CTF, GUN_ASSAULT)
- spawn(pid, 100, 0, 45, 15, GUN_ASSAULT, GM_CTF, GUN_ASSAULT)
- end
- end
- function onPlayerSay(pid,text)
- cmd = split(text, " ")
- --PrintMsg("\f3TEXT: "..text,-1)
- --PrintMsg("\f3CMD_CONCAT: "..table.concat(cmd),-1)
- if cmd[1] == "!mytime" then
- PrintMsg("You have had \f3"..GetFormattedTime((getsvtick()-starttimes[pid+1])/1000).."\f5 so far.", pid)
- return PLUGIN_BLOCK
- elseif cmd[1] == "!reset" then
- spawn(pid, 100, 0, 0, 0, GUN_GRENADE, GM_CTF, GUN_ASSAULT)
- spawn(pid, 100, 0, 45, 15, GUN_ASSAULT, GM_CTF, GUN_ASSAULT)
- return PLUGIN_BLOCK
- elseif cmd[1] == "!info" then
- PrintMsg(PLUGIN_NAME.." by "..PLUGIN_AUTHOR.." (version "..PLUGIN_VERSION.."). Type !listcmds for a list of commands. Refer to the README for more info.", pid)
- PrintMsg("GemaScript (c) 2010 BS-CiD, Rikki Guy, email: rikki.guy@gmail.com", pid)
- return PLUGIN_BLOCK
- elseif cmd[1] == "!mybest" then
- PrintMsg("You have completed this map\f1 "..ClientInfo(pid,"numtimes").." \f5times, with a best time of \f3"..GetFormattedTime(ClientInfo(pid, "besttime")), pid)
- return PLUGIN_BLOCK
- elseif cmd[1] == "!mapbest" then
- PrintMsg("The recordholder of this map is\f1 "..mapinfo["bestname"].." \f5with a time of\f3 "..GetFormattedTime(mapinfo["besttime"]), pid)
- elseif cmd[1] == "!setnextmap" and isadmin(pid) then
- setnextmap(cmd[2])
- nextmap = 1
- PrintMsg("next map chosen", -1)
- elseif cmd[1] == "!setnextmode" and isadmin(pid) then
- setnextmode (tonumber(cmd[2]))
- nextmode = 1
- PrintMsg("next mode chosen", -1)
- elseif cmd[1] == "!gotonextmap" and isadmin(pid) then
- forcemapend()
- elseif cmd[1] == "!listcmds" then
- PrintMsg("Commands: !reset !mytime !info !mybest !mapbest !listcmds !pm *CN* *TEXT*", pid)
- if isadmin(pid) then
- PrintMsg("Admin Commands:!setnextmode *NUM_of_mode*, !setnextmap *MAP*, !gotonextmap, !map *TIME* *MAP*", pid)
- end
- return PLUGIN_BLOCK
- elseif cmd[1] == "!map" and isadmin(pid) then
- changemap(cmd[3], GM_CTF, tonumber(cmd[2]));
- elseif cmd[1] == "!randmap" and isadmin(pid) then
- changemap(randmap(), GM_CTF, 15);
- elseif cmd[1] == "!pm" then
- PrintMsg("You have sent : \f2\""..table.concat(cmd, " ", 3).."\"\f5 to the player \f3"..getname(tonumber(cmd[2])), pid)
- clientprint(tonumber(cmd[2]),"\f5"..getname(pid)..": \f2"..table.concat(cmd, " ", 3))
- return PLUGIN_BLOCK
- end
- end
- function onInit()
- clients = {}
- mapinfo = {}
- starttimes = {}
- for i=0, maxclient()-1 do
- starttimes[i] = -1
- end
- end
- function search_gema(name)
- z={"gema","Gema","GeMa","GEMA","GEM@","G3M@","G3M4","JIGSAW_1.1"}
- for key,value in pairs(z) do
- if string.find(name,value) then
- gematest = 1
- break
- else gematest = 2
- end
- end
- end
- function onPlayerDamage(victim, killer, damage)
- if killer == victim then
- --[[if getweapon(killer) == GUN_GREANADE then
- return PLUGIN_BLOCK
- end]]
- else
- PrintMsg("\f3 Do not shoot at other players!", killer)
- return PLUGIN_BLOCK
- end
- end