'''A Quick and Dirty Leveling Type Game for CSS Based on Castle Crashers for the 360 Some of code taken directly from dnd.py To Finish - Animal Orbs - Create a power for sea horse - Skipped for now - Pazzo, Hawkster food Grab, Mr Buddy, Seahorse magic - add effects based on your character - get native tools working for combos (+magic+attack, +magic+attack2, +magic+jump) - add mana regen dig - Add +dig/-dig - automated adding of dig points Respawning Shopmenu''' MenuCommands = ['menu', 'help', 'modmenu', 'helpmenu', 'wodmenu', 'rpgmenu', 'changerace', 'wcsmenu', '!skills', '!spells', 'shopmenu', '!menu'] import es, menulib, popuplib, os.path, cPickle, playerlib, gamethread, random, math, time IDStorage = {} Users = {} Junk = ['an old boot', 'road kill', 'some old source code', 'tattered jeans', 'a barrel'] Foods = ['fruit', 'meat', 'cookies', 'veggies', 'cake', 'cheese', 'milk', 'peanuts', 'V8'] Pistols = ['glock','usp','p228','deagle','fiveseven','elite'] ShotGuns = ['m3','xm1014'] SMGs = ['mac10','tmp','ump45','mp5navy','p90'] Rifles = ['galil','famas','m4a1','ak47','sg552','aug'] Snipers = ['scout','awp','sg550','g3sg1'] Grenades = ['hegrenade','flashbang','smokegrenade'] Weapons = [ 'ak47','m4a1','galil','famas','sg552','aug','glock','usp','p228','deagle','fiveseven', 'elite','m3','xm1014','mac10','tmp','ump45','mp5navy','p90','scout','awp','sg550','g3sg1', 'hegrenade','flashbang','smokegrenade','m249','knife'] Characters = [ 'Red Knight', 'Blue Knight', 'Green Knight', 'Orange Knight', 'Gray Knight', 'Barbarian', 'Thief', 'Peasant', 'Iceskimo', 'Conehead', 'Alien Hominid', 'Fire Demon', 'Ninjer', 'Skeleton', 'Bear', 'Industrialist', 'Fencer', 'Royal Guard', 'Saracen', 'King', 'Necromancer', 'Wizard\'s Minion', 'Open-Faced Gray Knight'] AnimalOrbs = [ 'Beholder', 'BiPolar Bear', 'Bitey Bat', 'Burly Bear', 'Cardinal', 'Chicken', 'Dragon', 'Frogglet', 'Giraffey', 'Hawkster', 'Install Ball', 'Meowburt', 'Monkey Face', 'Mr. Buddy', 'Owlet', 'Pazzo', 'Pelter', 'Piggy', 'Rammy', 'Scratchpaw', 'Seahorse', 'Sherbert', 'Snailburt', 'Snoot', 'Spiny', 'Troll', 'Yeti', 'Zebra'] DropAbleOrbs = ['Bitey Bat', 'Cardinal', 'Dragon', 'Install Ball', 'Meowburt', 'Owlet', 'Pelter', 'Rammy', 'Seahorse', 'Sherbert', 'Snailburt', 'Zebra'] AnimalOrbsInfo = { 'Beholder':{'strength':0, 'magic':2, 'toughness':0, 'speed':0}, 'BiPolar Bear':{'strength':0, 'magic':0, 'toughness':0, 'speed':0}, 'Bitey Bat':{'strength':0, 'magic':0, 'toughness':0, 'speed':0}, 'Burly Bear':{'strength':2, 'magic':0, 'toughness':0, 'speed':0}, 'Cardinal':{'strength':0, 'magic':0, 'toughness':0, 'speed':0}, 'Chicken':{'strength':1, 'magic':0, 'toughness':1, 'speed':1}, 'Dragon':{'strength':0, 'magic':0, 'toughness':0, 'speed':0}, 'Frogglet':{'strength':0, 'magic':0, 'toughness':0, 'speed':0}, 'Giraffey':{'strength':0, 'magic':0, 'toughness':0, 'speed':0}, 'Hawkster':{'strength':0, 'magic':0, 'toughness':0, 'speed':0}, 'Install Ball':{'strength':0, 'magic':0, 'toughness':0, 'speed':0}, 'Meowburt':{'strength':0, 'magic':0, 'toughness':0, 'speed':3}, 'Monkey Face':{'strength':0, 'magic':0, 'toughness':0, 'speed':0}, 'Mr. Buddy':{'strength':0, 'magic':0, 'toughness':0, 'speed':0}, 'Owlet':{'strength':0, 'magic':0, 'toughness':0, 'speed':0}, 'Pazzo':{'strength':0, 'magic':0, 'toughness':0, 'speed':0}, 'Pelter':{'strength':0, 'magic':0, 'toughness':0, 'speed':0}, 'Piggy':{'strength':0, 'magic':0, 'toughness':0, 'speed':0}, 'Rammy':{'strength':0, 'magic':0, 'toughness':0, 'speed':0}, 'Scratchpaw':{'strength':1, 'magic':0, 'toughness':0, 'speed':2}, 'Seahorse':{'strength':0, 'magic':0, 'toughness':0, 'speed':0}, 'Sherbert':{'strength':0, 'magic':0, 'toughness':0, 'speed':0}, 'Snailburt':{'strength':0, 'magic':0, 'toughness':5, 'speed':-5}, 'Snoot':{'strength':2, 'magic':0, 'toughness':0, 'speed':0}, 'Spiny':{'strength':0, 'magic':0, 'toughness':2, 'speed':0}, 'Troll':{'strength':0, 'magic':0, 'toughness':0, 'speed':0}, 'Yeti':{'strength':0, 'magic':0, 'toughness':0, 'speed':0}, 'Zebra':{'strength':0, 'magic':0, 'toughness':0, 'speed':0}} WeaponStats = { 'ak47':{'strength':4, 'magic':-1, 'toughness':0, 'speed':0, 'cost':130}, 'm4a1':{'strength':0, 'magic':0, 'toughness':-1, 'speed':4, 'cost':140}, 'galil':{'strength':0, 'magic':3, 'toughness':0, 'speed':0, 'cost':70}, 'famas':{'strength':0, 'magic':3, 'toughness':0, 'speed':0, 'cost':70}, 'sg552':{'strength':5, 'magic':0, 'toughness':5, 'speed':-2, 'cost':155}, 'aug':{'strength':0, 'magic':-2, 'toughness':5, 'speed':5, 'cost':150}, 'glock':{'strength':1, 'magic':0, 'toughness':0, 'speed':-1, 'cost':0}, 'usp':{'strength':-1, 'magic':0, 'toughness':0, 'speed':1, 'cost':0}, 'p228':{'strength':0, 'magic':2, 'toughness':0, 'speed':0, 'cost':30}, 'deagle':{'strength':2, 'magic':0, 'toughness':0, 'speed':0, 'cost':50}, 'fiveseven':{'strength':0, 'magic':0, 'toughness':1, 'speed':1, 'cost':40}, 'elite':{'strength':0, 'magic':0, 'toughness':0, 'speed':2, 'cost':40}, 'm3':{'strength':4, 'magic':0, 'toughness':4, 'speed':-4, 'cost':80}, 'xm1014':{'strength':4, 'magic':-2, 'toughness':0, 'speed':4, 'cost':130}, 'mac10':{'strength':0, 'magic':0, 'toughness':-2, 'speed':5, 'cost':60}, 'tmp':{'strength':0, 'magic':0, 'toughness':-2, 'speed':5, 'cost':60}, 'ump45':{'strength':-2, 'magic':5, 'toughness':0, 'speed':0, 'cost':60}, 'mp5navy':{'strength':-2, 'magic':3, 'toughness':0, 'speed':3, 'cost':70}, 'p90':{'strength':3, 'magic':3, 'toughness':-4, 'speed':3, 'cost':80}, 'scout':{'strength':0, 'magic':4, 'toughness':-4, 'speed':4, 'cost':80}, 'awp':{'strength':8, 'magic':0, 'toughness':4, 'speed':-4, 'cost':240}, 'sg550':{'strength':-4, 'magic':0, 'toughness':4, 'speed':6, 'cost':300}, 'g3sg1':{'strength':-4, 'magic':0, 'toughness':4, 'speed':6, 'cost':300}, 'm249':{'strength':10, 'magic':-5, 'toughness':10, 'speed':-5, 'cost':100}, 'knife':{'strength':0, 'magic':0, 'toughness':0, 'speed':0}, None:{'strength':0, 'magic':0, 'toughness':0, 'speed':0}, 'c4':{'strength':0, 'magic':0, 'toughness':0, 'speed':0}, 'flashbang':{'strength':0, 'magic':0, 'toughness':0, 'speed':0}, 'hegrenade':{'strength':0, 'magic':0, 'toughness':0, 'speed':0}, 'smokegrenade':{'strength':0, 'magic':0, 'toughness':0, 'speed':0}} def load(): global IDStorage, mainmenu str_path = es.getAddonPath('castlecrashers') + '/IDStorage.db' if os.path.isfile(str_path): file_users = open(str_path) IDStorage = cPickle.load(file_users) file_users.close() es.server.queuecmd('est_RegEventBlock player_hurt "es_xdoblock castlecrashers/prepHurt"') #es.server.queuecmd('es_xdoblock corelib/noisy_on') mainmenu = popuplib.create('mainmenu') mainmenu.addline('-[ Castle Crashers Source ]-') mainmenu.addline('-> 1. Characters') mainmenu.addline('-> 2. Animal Orbs') mainmenu.addline('-> 3. Weapons') mainmenu.addline('-> 4. Shop') mainmenu.addline('-> 5. FAQ') mainmenu.addline('-> 6. Player Info') mainmenu.addline('-> 7. My Stats') mainmenu.addline('0. Exit') mainmenu.menuselect = mainMenuSelect mainmenu.submenu(5, 'informationmenu') mainmenu.submenu(4, 'shopmenu') shop = popuplib.create('shopmenu') shop.addline('-[ Castle Crashers Shop ]-') #shop.addline('-> 1. Items') shop.addline('-> 2. Weapons') shop.addline('-> 3. Animal Orbs') shop.addline('-> 8. Back') shop.addline('0. Exit') shop.submenu(8, 'mainmenu') shop.submenu(3, 'orbsmenu') shop.menuselect = shopMenuSelect orbs = popuplib.create('orbsmenu') orbs.addline('-[ Castle Crashers Animal Orbs ]-') orbs.addline('-> 1. Monkeyface (750 Gold)') orbs.addline('-> 2. Pazzo (750 Gold)') orbs.addline('-> 3. Piggy (585 Gold)') orbs.addline('-> 4. Spiny (680 Gold)') orbs.addline('-> 8. Back') orbs.addline('0. Exit') orbs.submenu(8, 'shopmenu') orbs.menuselect = orbsMenuSelect informationmenu = popuplib.create('informationmenu') informationmenu.addline('-[ Castle Crashers Info ]-') informationmenu.addline('-> 1. What are Stats?') informationmenu.addline('-> 2. Why are there glowly things?') informationmenu.addline('-> 3. How do I get more guns?') informationmenu.addline('-> 4. Animal Orbs, wtf?') informationmenu.addline('-> 5. I can\'t play my character!') informationmenu.addline('-> 6. What is gold?') informationmenu.addline('-> 7. Credits :)') informationmenu.addline('-> 8. Back') informationmenu.addline('0. Exit') informationmenu.submenu(8, 'mainmenu') informationmenu.submenu(7, 'credits') informationmenu.submenu(5, 'characterinfo') informationmenu.submenu(4, 'familiarinfo') informationmenu.submenu(3, 'weaponinfo') informationmenu.submenu(2, 'dropinfo') informationmenu.submenu(1, 'statsinfo') gold = popuplib.create('goldinfo') gold.addline('-[ Castle Crashers Gold ]-') gold.addline(' You use gold to buy things...') gold.addline(' Complex huh? No really though, gold') gold.addline(' lets you buy everything from potions,') gold.addline(' to new Animal Orbs, to a new Weapon.') gold.addline(' Option #4 in the main menu is the shop.') gold.addline('-> 7. Who Made all This?') gold.addline('-> 8. Info Menu') gold.addline('0. Exit') gold.submenu(7, 'credits') gold.submenu(8, 'informationmenu') drop = popuplib.create('dropinfo') drop.addline('-[ Castle Crashers Drops ]-') drop.addline(' When players die they drop a random item.') drop.addline(' Each color ring represents a different type') drop.addline(' of item.') drop.addline(' Green: Food') drop.addline(' Yellow: Gold') drop.addline(' Red: Weapon') drop.addline(' Blue: Animal Orb') drop.addline('-> 7. Forward Ho!') drop.addline('-> 8. Info Menu') drop.addline('0. Exit') drop.submenu(7, 'weaponinfo') drop.submenu(8, 'informationmenu') character = popuplib.create('characterinfo') character.addline('-[ Castle Crashers Characters ]-') character.addline(' There is a limit to one of each character') character.addline(' playable on the server at a time. If your') character.addline(' favorite is in use wait for someone else to') character.addline(' change so you can use it.') character.addline('-> 7. Gold does?...') character.addline('-> 8. Info Menu') character.addline('0. Exit') character.submenu(8, 'informationmenu') character.submenu(7, 'goldinfo') familiar = popuplib.create('familiarinfo') familiar.addline('-[ Castle Crashers Animal Orbs ]-') familiar.addline(' Each Animal Orb gives you a small bonus') familiar.addline(' that can aide you on the battlefield.') familiar.addline(' Thumb through the lists to find one that') familiar.addline(' you like best.') familiar.addline('-> 1. Orbs Info') familiar.addline('-> 2. More Orbs') familiar.addline('-> 3. A few more Orbs') familiar.addline('-> 4. Last of them...') familiar.addline('-> 7. O! What next?') familiar.addline('-> 8. Info Menu') familiar.addline('0. Exit') familiar.submenu(8, 'informationmenu') familiar.submenu(7, 'characterinfo') familiar.submenu(4, 'orbsinfo4') familiar.submenu(3, 'orbsinfo3') familiar.submenu(2, 'orbsinfo2') familiar.submenu(1, 'orbsinfo1') orbs1 = popuplib.create('orbsinfo1') orbs1.addline('-[ Select an Orb to Learn About ]-') orbs1.addline('-> 1. Beholder') orbs1.addline('-> 2. BiPolar Bear') orbs1.addline('-> 3. Bitey Bat') orbs1.addline('-> 4. Burly Bear') orbs1.addline('-> 5. Cardinal') orbs1.addline('-> 6. Chicken') orbs1.addline('-> 7. Dragon') orbs1.addline('-> 8. Animal Orb Info') orbs1.addline('-> 9. More Orbs') orbs1.addline('0. Exit') orbs1.submenu(1, 'beholderinfo') orbs1.submenu(2, 'bipolarbearinfo') orbs1.submenu(3, 'biteybatinfo') orbs1.submenu(4, 'burlybearinfo') orbs1.submenu(5, 'cardinalinfo') orbs1.submenu(6, 'chickeninfo') orbs1.submenu(7, 'dragoninfo') orbs1.submenu(8, 'familiarinfo') orbs1.submenu(9, 'orbsinfo2') menu = popuplib.create('beholderinfo') menu.addline('-[ Castle Crashers Beholder ]-') menu.addline(' Increases Magic') menu.addline('-> 8. To Orbs List') menu.addline('-> 9. Next Orb') menu.addline('0. Exit') menu.submenu(8, 'orbsinfo1') menu.submenu(9, 'bipolarbearinfo') menu = popuplib.create('bipolarbearinfo') menu.addline('-[ Castle Crashers BiPolar Bear ]-') menu.addline(' Randomly damages nearby players') menu.addline(' that have low health.') menu.addline('-> 8. To Orbs List') menu.addline('-> 9. Next Orb') menu.addline('0. Exit') menu.submenu(8, 'orbsinfo1') menu.submenu(9, 'biteybatinfo') menu = popuplib.create('biteybatinfo') menu.addline('-[ Castle Crashers Bitey Bat ]-') menu.addline(' Holds a nearby enemy while damaging') menu.addline(' them slightly') menu.addline('-> 8. To Orbs List') menu.addline('-> 9. Next Orb') menu.addline('0. Exit') menu.submenu(8, 'orbsinfo1') menu.submenu(9, 'burlybearinfo') menu = popuplib.create('burlybearinfo') menu.addline('-[ Castle Crashers Burly Bear ]-') menu.addline(' Increases Strength') menu.addline('-> 8. To Orbs List') menu.addline('-> 9. Next Orb') menu.addline('0. Exit') menu.submenu(8, 'orbsinfo1') menu.submenu(9, 'cardinalinfo') menu = popuplib.create('cardinalinfo') menu.addline('-[ Castle Crashers Cardinal ]-') menu.addline(' Randomly finds items for you.') menu.addline('-> 8. To Orbs List') menu.addline('-> 9. Next Orb') menu.addline('0. Exit') menu.submenu(8, 'orbsinfo1') menu.submenu(9, 'chikeninfo') menu = popuplib.create('chickeninfo') menu.addline('-[ Castle Crashers Chicken ]-') menu.addline(' Increases Strength, Defense, and') menu.addline(' Agility.') menu.addline('-> 8. To Orbs List') menu.addline('-> 9. Next Orb') menu.addline('0. Exit') menu.submenu(8, 'orbsinfo1') menu.submenu(9, 'dragoninfo') menu = popuplib.create('dragoninfo') menu.addline('-[ Castle Crashers Dragon ]-') menu.addline(' Randomly shoots fireballs at enemies') menu.addline('-> 8. To Orbs List') menu.addline('-> 9. Next Orb') menu.addline('0. Exit') menu.submenu(8, 'orbsinfo1') menu.submenu(9, 'froggletinfo') orbs2 = popuplib.create('orbsinfo2') orbs2.addline('-[ Just Pick One ]-') orbs2.addline('-> 1. Frogglet') orbs2.addline('-> 2. Giraffey') orbs2.addline('-> 3. Hawkster') orbs2.addline('-> 4. Install Ball') orbs2.addline('-> 5. Meowburt') orbs2.addline('-> 6. Monkey Face') orbs2.addline('-> 7. Mr. Buddy') orbs2.addline('-> 8. Animal Orb Info') orbs2.addline('-> 9. A few more Orbs') orbs2.addline('0. Exit') orbs2.submenu(1, 'froggletinfo') orbs2.submenu(2, 'giraffeyinfo') orbs2.submenu(3, 'hawksterinfo') orbs2.submenu(4, 'installballinfo') orbs2.submenu(5, 'meowburtinfo') orbs2.submenu(6, 'monkeyfaceinfo') orbs2.submenu(7, 'mrbuddyinfo') orbs2.submenu(8, 'familiarinfo') orbs2.submenu(9, 'orbsinfo3') menu = popuplib.create('froggletinfo') menu.addline('-[ Castle Crashers Frogglet ]-') menu.addline(' Allows you to snag dropped items') menu.addline(' from a distance.') menu.addline('-> 8. To Orbs List') menu.addline('-> 9. Next Orb') menu.addline('0. Exit') menu.submenu(8, 'orbsinfo2') menu.submenu(9, 'giraffeyinfo') menu = popuplib.create('giraffeyinfo') menu.addline('-[ Castle Crashers Giraffey ]-') menu.addline(' Increases the at at which you') menu.addline(' level up.') menu.addline('-> 8. To Orbs List') menu.addline('-> 9. Next Orb') menu.addline('0. Exit') menu.submenu(8, 'orbsinfo2') menu.submenu(9, 'hawksterinfo') menu = popuplib.create('hawksterinfo') menu.addline('-[ Castle Crashers Hawkster ]-') menu.addline(' Attacks nearby enemies and') menu.addline(' helps recover nearby food.') menu.addline('-> 8. To Orbs List') menu.addline('-> 9. Next Orb') menu.addline('0. Exit') menu.submenu(8, 'orbsinfo2') menu.submenu(9, 'installballinfo') menu = popuplib.create('installballinfo') menu.addline('-[ Castle Crashers Install Ball ]-') menu.addline(' Shoots laser beams at nearby enemies') menu.addline('-> 8. To Orbs List') menu.addline('-> 9. Next Orb') menu.addline('0. Exit') menu.submenu(8, 'orbsinfo2') menu.submenu(9, 'meoburtinfo') menu = popuplib.create('meoburtinfo') menu.addline('-[ Castle Crashers Meoburt ]-') menu.addline(' Increases Agility') menu.addline('-> 8. To Orbs List') menu.addline('-> 9. Next Orb') menu.addline('0. Exit') menu.submenu(8, 'orbsinfo1') menu.submenu(9, 'monkeyfaceinfo') menu = popuplib.create('monkeyfaceinfo') menu.addline('-[ Castle Crashers Monkey Face ]-') menu.addline(' Gives you a chance to find better') menu.addline(' items from players.') menu.addline('-> 8. To Orbs List') menu.addline('-> 9. Next Orb') menu.addline('0. Exit') menu.submenu(8, 'orbsinfo2') menu.submenu(9, 'mrbuddyinfo') menu = popuplib.create('mrbuddyinfo') menu.addline('-[ Castle Crashers Mr Buddy ]-') menu.addline(' Increases the rate at which') menu.addline(' you dig.') menu.addline('-> 8. To Orbs List') menu.addline('-> 9. Next Orb') menu.addline('0. Exit') menu.submenu(8, 'orbsinfo2') menu.submenu(9, 'owletinfo') orbs3 = popuplib.create('orbsinfo3') orbs3.addline('-[ Orbs Orbs Everywhere... ]-') orbs3.addline('-> 1. Owlet') orbs3.addline('-> 2. Pazzo') orbs3.addline('-> 3. Pelter') orbs3.addline('-> 4. Piggy') orbs3.addline('-> 5. Rammy') orbs3.addline('-> 6. Scratchpaw') orbs3.addline('-> 7. Seahorse') orbs3.addline('-> 8. Animal Orb Info') orbs3.addline('-> 9. More Orbs') orbs3.addline('0. Exit') orbs3.submenu(1, 'owletinfo') orbs3.submenu(2, 'pazzoinfo') orbs3.submenu(3, 'pelterinfo') orbs3.submenu(4, 'piggyinfo') orbs3.submenu(5, 'rammyinfo') orbs3.submenu(6, 'scratchpawinfo') orbs3.submenu(7, 'seahorseinfo') orbs3.submenu(8, 'familiarinfo') orbs3.submenu(9, 'orbsinfo4') menu = popuplib.create('owletinfo') menu.addline('-[ Castle Crashers Owlet ]-') menu.addline(' Finds hidden food for you.') menu.addline('-> 8. To Orbs List') menu.addline('-> 9. Next Orb') menu.addline('0. Exit') menu.submenu(8, 'orbsinfo3') menu.submenu(9, 'pazzoinfo') menu = popuplib.create('pazzoinfo') menu.addline('-[ Castle Crashers Pazzo ]-') menu.addline(' Helps you spot burried tresure.') menu.addline('-> 8. To Orbs List') menu.addline('-> 9. Next Orb') menu.addline('0. Exit') menu.submenu(8, 'orbsinfo3') menu.submenu(9, 'pelterinfo') menu = popuplib.create('pelterinfo') menu.addline('-[ Castle Crashers Pelter ]-') menu.addline(' Throws snow balls at nearby') menu.addline(' enemies every now and then.') menu.addline('-> 8. To Orbs List') menu.addline('-> 9. Next Orb') menu.addline('0. Exit') menu.submenu(8, 'orbsinfo3') menu.submenu(9, 'piggyinfo') menu = popuplib.create('piggyinfo') menu.addline('-[ Castle Crashers Piggy ]-') menu.addline(' Increases the amount of health') menu.addline(' you gain from eating food.') menu.addline('-> 8. To Orbs List') menu.addline('-> 9. Next Orb') menu.addline('0. Exit') menu.submenu(8, 'orbsinfo3') menu.submenu(9, 'rammyinfo') menu = popuplib.create('rammyinfo') menu.addline('-[ Castle Crashers Rammy ]-') menu.addline(' Randomly stuns nearby enemies.') menu.addline('-> 8. To Orbs List') menu.addline('-> 9. Next Orb') menu.addline('0. Exit') menu.submenu(8, 'orbsinfo3') menu.submenu(9, 'scratchpawinfo') menu = popuplib.create('scratchpawinfo') menu.addline('-[ Castle Crashers Scratchpaw ]-') menu.addline(' Increased Strength and Agility.') menu.addline('-> 8. To Orbs List') menu.addline('-> 9. Next Orb') menu.addline('0. Exit') menu.submenu(8, 'orbsinfo3') menu.submenu(9, 'seahorseinfo') menu = popuplib.create('seahorseinfo') menu.addline('-[ Castle Crashers Seahorse ]-') menu.addline(' ') menu.addline(' ') menu.addline('-> 8. To Orbs List') menu.addline('-> 9. Next Orb') menu.addline('0. Exit') menu.submenu(8, 'orbsinfo3') menu.submenu(9, 'sherbertinfo') orbs4 = popuplib.create('orbsinfo4') orbs4.addline('-[ Shouldn\'t You be Fragging by Now? ]-') orbs4.addline('-> 1. Sherbert') orbs4.addline('-> 2. Snailburt') orbs4.addline('-> 3. Snoot') orbs4.addline('-> 4. Spiny') orbs4.addline('-> 5. Trolly') orbs4.addline('-> 6. Yeti') orbs4.addline('-> 7. Zebra') orbs4.addline('-> 8. Animal Orb Info') orbs4.addline('-> 9. First Orbs') orbs4.addline('0. Exit') orbs4.submenu(1, 'sherbertinfo') orbs4.submenu(2, 'snailburtinfo') orbs4.submenu(3, 'snootinfo') orbs4.submenu(4, 'spinyinfo') orbs4.submenu(5, 'trollyinfo') orbs4.submenu(6, 'yetiinfo') orbs4.submenu(7, 'zebrainfo') orbs4.submenu(8, 'familiarinfo') orbs4.submenu(9, 'orbsinfo1') menu = popuplib.create('info') menu.addline('-[ Castle Crashers Sherbert ]-') menu.addline(' Lets you jump higher ') menu.addline('-> 8. To Orbs List') menu.addline('-> 9. Next Orb') menu.addline('0. Exit') menu.submenu(8, 'orbsinfo4') menu.submenu(9, 'snailburtinfo') menu = popuplib.create('snailburtinfo') menu.addline('-[ Castle Crashers Snailburt ]-') menu.addline(' Increases Defense') menu.addline(' Decreases Agility') menu.addline('-> 8. To Orbs List') menu.addline('-> 9. Next Orb') menu.addline('0. Exit') menu.submenu(8, 'orbsinfo4') menu.submenu(9, 'snootinfo') menu = popuplib.create('snootinfo') menu.addline('-[ Castle Crashers Snoot ]-') menu.addline(' Increases Strength') menu.addline('-> 8. To Orbs List') menu.addline('-> 9. Next Orb') menu.addline('0. Exit') menu.submenu(8, 'orbsinfo4') menu.submenu(9, 'spinyinfo') menu = popuplib.create('spinyinfo') menu.addline('-[ Castle Crashers Spiny ]-') menu.addline(' Increases Defense') menu.addline('-> 8. To Orbs List') menu.addline('-> 9. Next Orb') menu.addline('0. Exit') menu.submenu(8, 'orbsinfo4') menu.submenu(9, 'trollyinfo') menu = popuplib.create('tollyinfo') menu.addline('-[ Castle Crashers Tolly ]-') menu.addline(' Recovers you health over time') menu.addline('-> 8. To Orbs List') menu.addline('-> 9. Next Orb') menu.addline('0. Exit') menu.submenu(8, 'orbsinfo4') menu.submenu(9, 'yetiinfo') menu = popuplib.create('yetiinfo') menu.addline('-[ Castle Crashers Yeti ]-') menu.addline(' Become immue to being frozen') menu.addline('-> 8. To Orbs List') menu.addline('-> 9. Next Orb') menu.addline('0. Exit') menu.submenu(8, 'orbsinfo4') menu.submenu(9, 'zebrainfo') menu = popuplib.create('zebrainfo') menu.addline('-[ Castle Crashers Zebra ]-') menu.addline(' Helps find hidden food') menu.addline('-> 8. To Orbs List') menu.addline('-> 9. Next Orb') menu.addline('0. Exit') menu.submenu(8, 'orbsinfo4') menu.submenu(9, 'beholderinfo') wpinfo = popuplib.create('weaponinfo') wpinfo.addline('-[ Castle Crashers Weapons ]-') wpinfo.addline(' In Castle Crashers player\'s drop items') wpinfo.addline(' when they die. A red ring represents a weapon') wpinfo.addline(' walk over it to obtain this (maybe) new gun.') wpinfo.addline(' Or you can buy be boring and buy them from') wpinfo.addline(' the shop.') wpinfo.addline('-> 1. Pistols') wpinfo.addline('-> 2. Shotguns & M249') wpinfo.addline('-> 3. SMGs') wpinfo.addline('-> 4. Rifles') wpinfo.addline('-> 5. Snipers') wpinfo.addline('-> 7. Next Lesson') wpinfo.addline('-> 8. Info Menu') wpinfo.addline('0. Exit') wpinfo.submenu(8, 'informationmenu') wpinfo.submenu(7, 'familiarinfo') wpinfo.submenu(5, 'snipersinfo') wpinfo.submenu(4, 'riflesinfo') wpinfo.submenu(3, 'smgsinfo') wpinfo.submenu(2, 'shottyinfo') wpinfo.submenu(1, 'pistolsinfo') rifles = popuplib.create('riflesinfo') rifles.addline('-[ Rifles Explained ]-') rifles.addline(' Galil (70 Gold): +3 Magic') rifles.addline(' Famas (70 Gold): +3 Magic') rifles.addline(' AK47 (130 Gold): +4 Strength, -1 Magic') rifles.addline(' M4A1 (140 Gold): +4 Speed, -1 Toughness') rifles.addline(' AUG (150 Gold): +5 Toughness, +5 Speed, -2 Magic') rifles.addline(' Sig (155 Gold): +5 Str, +5 Toughness, -2 Speed') rifles.addline('-> 8. Back') rifles.addline('0. Exit') rifles.submenu(8, 'weaponinfo') smgs = popuplib.create('smgsinfo') smgs.addline('-[ SMG 411 ]-') smgs.addline(' Mac10 (60 Gold): +5 Speed, -2 Toughness') smgs.addline(' TMP (60 Gold): +5 Speed, -2 Toughness') smgs.addline(' UMP45 (60 Gold): +5 Magic, -2 Str') smgs.addline(' MP5Navy (70 Gold): +3 Magic, +3 Speed, -2 Toughness') smgs.addline(' P90 (80 Gold): +3 Str, +3 Magic, +3 Speed, -4 Toughness') smgs.addline('-> 8. Back') smgs.addline('0. Exit') smgs.submenu(8, 'weaponinfo') shotty = popuplib.create('shottyinfo') shotty.addline('-[ Shotty & M249 Info ]-') shotty.addline(' M3 (80 Gold): +4 Str, +4 Toughness, -4 Speed') shotty.addline(' XM1014 (130 Gold): +4 Str, +4 Speed, -2 Magic') shotty.addline(' M249 (100 Gold): +10 Str, +10 Toughness, -5 Speed, -5 Magic') shotty.addline('-> 8. Back') shotty.addline('0. Exit') shotty.submenu(8, 'weaponinfo') pistol = popuplib.create('pistolsinfo') pistol.addline('-[ Pistols Information ]-') pistol.addline(' USP (Free): +1 Speed, -1 Str') pistol.addline(' Glock (Free): +1 Str, -1 Speed') pistol.addline(' Compact (30 Gold): +2 Magic') pistol.addline(' Deagle (50 Gold): +2 Str') pistol.addline(' Five-Seven (40 Gold): +1 Speed, +1 Toughness') pistol.addline(' Elites (40 Gold): +2 Speed') pistol.addline('-> 8. Back') pistol.addline('0. Exit') pistol.submenu(8, 'weaponinfo') sniper = popuplib.create('snipersinfo') sniper.addline('-[ Snipers Do What?! ]-') sniper.addline(' Scout (80 Gold): +4 Magic & Speed, -4 Toughness') sniper.addline(' AWP (240 Gold): +8 Str, +4 Toughness, -4 Speed') sniper.addline(' G3SG1 (300 Gold): +6 Speed, +4 Toughness, -4 Str') sniper.addline(' SG550 (300 Gold): +6 Speed, +4 Toughness, -4 Str') sniper.addline('-> 8. Back') sniper.addline('0. Exit') sniper.submenu(8, 'weaponinfo') statsinfo = popuplib.create('statsinfo') statsinfo.addline('-[ Castle Crashers Stats Info ]-') statsinfo.addline(' Stats each make you better! ') statsinfo.addline(' Strength - Bonus Damage') statsinfo.addline(' Magic - Better Magiks (DUH!)') statsinfo.addline(' Toughness - Increased Health and Damage Reduction') statsinfo.addline(' Speed - Move Faster') statsinfo.addline('-> 7. What Else is Different?') statsinfo.addline('-> 8. Info Menu') statsinfo.addline('0. Exit') statsinfo.submenu(8, 'informationmenu') statsinfo.submenu(7, 'dropinfo') credits = popuplib.create('credits') credits.addline('-[ Castle Crashers Source Credits ]-') credits.addline(' Creator: Jeff Hoogland') credits.addline(' Based On: Castle Crashers for the 360') credits.addline(' Written In: Python for Eventscripts') credits.addline(' Contacts:') credits.addline(' Email - Jeff@hobhq.com') credits.addline(' AIM/Steam - beastrace91') credits.addline('-> 8. Info Menu') credits.addline('0. Exit') credits.submenu(8, 'informationmenu') if not es.exists('clientcommand', '+magic'): es.regclientcmd('+magic', 'castlecrashers/plusMagic') if not es.exists('clientcommand', '-magic'): es.regclientcmd('-magic', 'castlecrashers/minusMagic') if not es.exists('saycommand', 'showxp'): es.regsaycmd('showxp', 'castlecrashers/sendXp') if not es.exists('saycommand', 'playerinfo'): es.regsaycmd('playerinfo', 'castlecrashers/playerInfo') if not es.exists('clientcommand', 'showxp'): es.regclientcmd('showxp', 'castlecrashers/sendXp') if not es.exists('clientcommand', 'playerinfo'): es.regclientcmd('playerinfo', 'castlecrashers/playerInfo') if not es.exists('saycommand', 'info'): es.regsaycmd('info', 'castlecrashers/info') if not es.exists('clientcommand', 'info'): es.regclientcmd('info', 'castlecrashers/info') for command in MenuCommands: if not es.exists('saycommand', command): es.regsaycmd(command, 'castlecrashers/sendMenu') if not es.exists('clientcommand', command): es.regclientcmd(command, 'castlecrashers/sendMenu') ItemsTracking() OrbLoop() def player_disconnect(ev): userid = int(ev['userid']) Key = getPlayer(userid) #Stop all pending delays linked to all players on round end while Key['delays'] > 0: gamethread.cancelDelayed('%s_%s'%(userid, Key['delays'])) Key['delays'] -= 1 def est_client_keypress(ev): userid = int(ev['userid']) Key = getPlayer(userid) if ev['keyname'] == 'attack': es.msg('%s has used attack, attempting to hook and redirect'%es.getplayername(userid)) if Key['magic']: MagicPrimary(ev['userid']) es.server.cmd('est_HookKey %s attack'%ev['userid']) else: es.msg('Nope wasn\'t holding +magic') def MagicPrimary(userid): es.msg('%s has used primary magic'%es.getplayername(userid)) def MagicSecondary(userid): es.msg('%s has used secondary magic'%es.getplayername(userid)) def MagicJump(userid): es.msg('%s has used jump magic'%es.getplayername(userid)) def OrbLoop(): for userid in es.getUseridList(): ID = Bank(userid) orb = ID['familiar'] if orb == 'BiPolar Bear': players = getNearList(userid, 480, 'health') if len(players): target = random.choice(players) Beam1(userid, target, 1, 102, 51, 51) Damage(target, userid, random.randrange(15, 30)) es.tell(userid, '#multi', '#defaultYour #greenBiPolar Bear #defaultjust attacked %s'%es.getplayername(target)) elif orb == "Bitey Bat": players = getNearList(userid, 480, 'other team') if len(players): target = random.choice(players) Stun(target, 1) BeamTop(target, 1, 0,0,0, 60) es.tell(userid, '#multi', '#defaultYour #greenBitey Bat #defaulthas held %s in place for a moment'%es.getplayername(target)) elif orb == 'Cardinal': Key = getPlayer(userid) if 'cardinal count' in Key: Key['cardinal count'] += 1 if Key['cardinal count'] > random.randint(4, 14): x,y,z = es.getplayerlocation(userid) percent = random.randint(1, 25) if percent <= 2: itemDrop(x,y,z-50, random.choice(Junk), 'junk') elif percent > 2 and percent <= 15: itemDrop(x,y,z-50, random.choice(['gold', 'gold2', 'gold3', 'gold4', 'gold5', 'gold6', 'gold7', 'gold8', 'gold9', 'gold10', 'gold11', 'gold12']), 'gold') elif percent > 15 and percent <= 17: itemDrop(x,y,z-50, 'gold sack', 'gold') elif percent > 17 and percent <= 24: itemDrop(x,y,z-50, random.choice(Foods), 'food') elif percent >= 25: weapons = Pistols+ShotGuns+SMGs+Rifles+Snipers weapons.remove('usp') weapons.remove('glock') itemDrop(x,y,z-50, random.choice(weapons), 'weapon') es.tell(userid, '#multi', '#defaultOh hey! #greenCardinal #defaultseems to have found something...') Key['cardinal count'] = 0 else: Key['cardinal count'] = 1 elif orb == "Dragon": players = getNearList(userid, 300, 'other team') if len(players): target = random.choice(players) Damage(target, userid, random.randrange(6, 15)) Beam1(userid, target, 1, 255, 0, 0) es.server.queuecmd('est_Burn %s 3'%target) es.tell(userid, '#multi', '#defaultYour #greenDragon #defaulthas hit %s with a fire ball!'%es.getplayername(target)) elif orb == 'Frogglet': Key = getPlayer(userid) if random.randrange(2) > 0: Key['frog cool'] = True elif orb == 'Hawkster': players = getNearList(userid, 480, 'other team') if len(players): target = random.choice(players) Beam1(userid, target, 1, 255, 204, 102) Damage(target, userid, random.randrange(8, 20)) es.tell(userid, '#multi', '#defaultYour #greenHawkster #defaultjust attacked %s'%es.getplayername(target)) elif orb == 'Install Ball': players = getNearList(userid, 360, 'other team') for player in players: Beam3(userid, player, 1, 255, 51, 255) Damage(player, userid, random.randrange(6, 15)) es.tell(userid, '#multi', '#defaultYour #greenInstall Ball #defaultjust attacked %s'%es.getplayername(player)) elif orb == 'Owlet': Key = getPlayer(userid) if 'owlet count' in Key: Key['owlet count'] += 1 if Key['owlet count'] > random.randint(6, 12): x,y,z = es.getplayerlocation(userid) itemDrop(x,y,z-50, random.choice(Foods), 'food') es.tell(userid, '#multi', '#defaultSomething smell good... #greenOwlet #defaultappears to have found some food!') Key['owlet count'] = 0 else: Key['owlet count'] = 1 elif orb == "Pelter": players = getNearList(userid, 420, 'other team') if len(players): target = random.choice(players) Damage(target, userid, random.randrange(8, 12)) Beam1(userid, target, 1, 153, 255, 255) Speed(target, -.2, 3) es.tell(userid, '#multi', '#greenPelter #defaulthas hit %s with a snow ball!'%es.getplayername(target)) elif orb == "Rammy": players = getNearList(userid, 360, 'other team') if len(players): target = random.choice(players) Beam1(userid, target, 1, 153, 153, 153) Stun(target, 3) es.tell(userid, '#multi', '#greenRammy #defaulthas stopped %s in their tracks :D'%es.getplayername(target)) elif orb == 'Trolly': Heal(userid, 1) elif orb == 'Zebra': Key = getPlayer(userid) if 'Zebra count' in Key: Key['Zebra count'] += 1 if Key['Zebra count'] > random.randint(4, 16): x,y,z = es.getplayerlocation(userid) itemDrop(x,y,z-50, random.choice(Foods), 'food') es.tell(userid, '#multi', '#defaultSomething smell good... #greenZebra #defaultappears to have found some food!') Key['Zebra count'] = 0 else: Key['Zebra count'] = 1 gamethread.delayed(2, OrbLoop) def getNearList(userid, distance, fish=None): x,y,z = es.getplayerlocation(userid) players = [] dellist = [] if es.getplayerteam(userid) > 1 and not es.getplayerprop(userid, "CBasePlayer.pl.deadflag"): for player in es.getUseridList(): if player != userid: x1,y1,z1 = es.getplayerlocation(player) if math.sqrt(math.pow((x-x1), 2) + math.pow((y-y1), 2) + math.pow((z-z1), 2)) < distance: players.append(player) if fish == 'health': for player in players: if es.getplayerprop(player, 'CBasePlayer.m_iHealth') > getPlayer(player)['maxhealth']*.25: dellist.append(player) elif fish == 'other team': for player in players: if es.getplayerteam(userid) == es.getplayerteam(player): dellist.append(player) for player in dellist: players.remove(player) return players def shopMenuSelect(userid, choice, popupid): if choice == 2: menulib.delete('weapons%s'%userid) weapon = menulib.create('weapons%s'%userid, 'shopmenu', weaponMenuSelect) weapon.settitle('-[ Castle Crashers Weapon Shoppy ]-') ID = Bank(userid) for wep in Weapons: if 'cost' in WeaponStats[wep]: if not ID['weapons'][wep]: if ID['gold'] >= WeaponStats[wep]['cost']: weapon.addoption(wep, '%s (%s Gold)'%(wep, WeaponStats[wep]['cost'])) weapon.send(userid) def weaponMenuSelect(userid, wep, popupid): ID = Bank(userid) if not ID['weapons'][wep]: if ID['gold'] >= WeaponStats[wep]['cost']: ID['gold'] -= WeaponStats[wep]['cost'] ID['weapons'][wep] = True es.tell(userid, '#multi', '#defaultYou have now unlocked the #lightgreen%s #defaultSelect it from the weapons menu to use it at next spawn'%wep) else: es.tell(userid, '#multi', '#defaultYou appear to have already unlocked the #lightgreen%s'%wep) def orbsMenuSelect(userid, choice, popupid): ID = Bank(userid) if choice == 1: if ID['gold'] >= 750: if not ID['familiars']['Monkeyface']: ID['familiar'] = 'Monkeyface' ID['familiars']['Monkeyface'] = True else: es.tell(userid, '#multi', '#defaulYou dope, you appear to already have obtained #greenMonkeyface') else: es.tell(userid, '#multi', '#defaultIt appears you are lacking the needed gold to buy #greenMonkeyface#default...') popupSend('orbsmenu', userid) elif choice == 2: if ID['gold'] >= 750: if not ID['familiars']['Pazzo']: ID['familiar'] = 'Pazzo' ID['familiars']['Pazzo'] = True else: es.tell(userid, '#multi', '#defaulYou dope, you appear to already have obtained #greenPazzo') else: es.tell(userid, '#multi', '#defaultIt appears you are lacking the needed gold to buy #greenPazzo#default...') popupSend('orbsmenu', userid) elif choice == 3: if ID['gold'] >= 585: if not ID['familiars']['Piggy']: ID['familiar'] = 'Piggy' ID['familiars']['Piggy'] = True else: es.tell(userid, '#multi', '#defaulYou dope, you appear to already have obtained #greenPiggy') else: es.tell(userid, '#multi', '#defaultIt appears you are lacking the needed gold to buy #greenPiggy#default...') popupSend('orbsmenu', userid) elif choice == 4: if ID['gold'] >= 680: if not ID['familiars']['Spiny']: ID['familiar'] = 'Spiny' ID['familiars']['Spiny'] = True else: es.tell(userid, '#multi', '#defaulYou dope, you appear to already have obtained #greenSpiny') else: es.tell(userid, '#multi', '#defaultIt appears you are lacking the needed gold to buy #greenSpiny#default...') popupSend('orbsmenu', userid) Items = {} def ItemsTracking(): try: for item in Items: x,y,z = Items[item]['location'] if Items[item]['type'] == 'food': r,g,b = 0, 255, 0 elif Items[item]['type'] == 'weapon': r,g,b = 255, 0, 0 elif Items[item]['type'] == 'gold': r,g,b = 255, 255, 0 elif Items[item]['type'] == 'orb': r,g,b = 0, 0, 255 elif Items[item]['type'] == 'junk': r,g,b = 0, 0, 0 Ring(x,y,z, 30, .25, r, g, b) for userid in es.getUseridList(): if es.getplayerteam(userid) > 1 and not es.getplayerprop(userid, "CBasePlayer.pl.deadflag"): x,y,z = es.getplayerlocation(userid) for item in Items: x1,y1,z1 = Items[item]['location'] reach = 50 Key = getPlayer(userid) ID = Bank(userid) orb = ID['familiar'] if orb == 'Frogglet': if 'frog cool' in Key: if 'frog cool': reach += 180 else: Key['frog cool'] = True reach += 180 distance = math.sqrt(math.pow((x-x1), 2) + math.pow((y-y1), 2) + math.pow((z-z1), 2)) if distance <= reach: if distance > 50 and orb == 'Frogglet': Beam2(userid, item, 1, 0, 255, 0) Key['frog cool'] = False es.tell(userid, '#multi', '#greenFrogglet #default snatched up an item for you :)') itemPickup(userid, item) gamethread.delayed(.25, ItemsTracking) except: ItemsTracking() def itemPickup(userid, item): #es.msg('#multi', '#lightgreen%s #defaultjust picked up #green%s'%(es.getplayername(userid), item)) ID = Bank(userid) if Items[item]['type'] == 'weapon': if not ID['weapons'][item]: ID['weapons'][item] = True es.tell(userid, '#multi', '#defaultLooks like you found a new weapon O sorts. Found a #lightgreen%s'%item) del Items[item] else: es.tell(userid, '#mutli', '#defaultIt looks like you already have the #green%s #defaultWeapon, Darn! Better luck next time ;)'%item) del Items[item] elif Items[item]['type'] == 'food': heal = random.randrange(17, 46) if ID['familiar'] == 'Piggy': heal += 20 Heal(userid, heal) es.tell(userid, '#multi', '#defaultOm Nom Nom. Found %s and healed for #lightgreen%s'%(item, heal)) del Items[item] elif Items[item]['type'] == 'orb': if not ID['familiars'][item]: es.tell(userid, '#multi', '#defaultHaha! It appears you stumbled across a new Animal Orb! #lightgreen%s #defaultis now your active Orb #green:)'%item) ID['familiars'][item] = True ID['familiar'] = item del Items[item] else: es.tell(userid, '#mutli', '#defaultIt looks like you already have the #green%s #defaultAnimal Orb, leave it for someone else who still needs it.'%item) elif Items[item]['type'] == 'gold': if 'gold' in item: ID['gold'] += 1 elif item == 'gold sack': ID['gold'] += 5 elif item == 'jewels': ID['gold'] += 10 es.tell(userid, '#multi', '#defaultOh look! Shinies! Found some gold you did...') del Items[item] elif Items[item]['type'] == 'junk': es.tell(userid, '#multi', '#defaultWhat the?... Its a flippin %s! Worthless :('%item) del Items[item] def itemDrop(x,y,z, item, kind): Items[item] = { 'location':[x,y,z], 'type':kind} def player_death(ev): userid = int(ev['userid']) es.server.queuecmd('est_RemoveIdle weapon') x,y,z = es.getplayerlocation(ev['userid']) percent = random.randint(1, 40) if ev['attacker']: ID = Bank(ev['attacker']) if ID['familiar'] == 'Monkeyface': percent += 3 if percent <= 22: itemDrop(x,y,z-50, random.choice(['gold', 'gold2', 'gold3', 'gold4', 'gold5', 'gold6', 'gold7', 'gold8', 'gold9', 'gold10', 'gold11', 'gold12']), 'gold') elif percent > 22 and percent <= 26: itemDrop(x,y,z-50, 'gold sack', 'gold') elif percent > 26 and percent <= 28: itemDrop(x,y,z-50, 'jewels', 'gold') elif percent > 28 and percent <= 36: itemDrop(x,y,z-50, random.choice(Foods), 'food') elif percent > 36 and percent <= 39: weapons = Pistols+ShotGuns+SMGs+Rifles+Snipers weapons.remove('usp') weapons.remove('glock') if not random.randrange(2): itemDrop(x,y,z-50, random.choice(weapons), 'weapon') else: itemDrop(x,y,z-50, getPlayer(ev['userid'])['weapon'], 'weapon') elif percent >= 40: if not random.randrange(2): itemDrop(x,y,z-50, random.choice(DropAbleOrbs), 'orb') else: ID = Bank(ev['attacker']) if ID['familiar']: itemDrop(x,y,z-50, ID['familiar'], 'orb') else: itemDrop(x,y,z-50, random.choice(DropAbleOrbs), 'orb') Key = getPlayer(userid) #Stop all pending delays linked to all players on round end while Key['delays'] > 0: gamethread.cancelDelayed('%s_%s'%(userid, Key['delays'])) Key['delays'] -= 1 def Ring(x,y,z, end, life, r, g, b): """ Normal beam effect. """ #es.msg('ring') es.server.queuecmd('est_effect 10 #a 0 "sprites/lgtning.vmt" %s %s %s 1 %s %s 10 20 10 %s %s %s 255 30'%(x,y,z,end,life,r,g,b)) def Beam1(player1,player2,life,r,g,b): # Connects 2 users together via a normal beam x,y,z = es.getplayerlocation(player1) x1,y1,z1 = es.getplayerlocation(player2) es.server.queuecmd('est_effect 3 #a 0 sprites/lgtning.vmt %s %s %s %s %s %s %s 40 10 %s %s %s 255'%(x,y,z + 30,x1,y1,z1 + 30,life,r,g,b)) def Beam2(player1,player2,life,r,g,b): # Connects 2 users together via a laser beam x,y,z = es.getplayerlocation(player1) if player2 in Items: x1,y1,z1 = Items[player2]['location'] else: x1,y1,z1 = es.getplayerlocation(player2) es.server.queuecmd('est_effect 3 #a 0 materials/sprites/laser.vmt %s %s %s %s %s %s %s 40 10 %s %s %s 255'%(x,y,z + 30,x1,y1,z1 + 30,life,r,g,b)) def BeamTop(player1,life,r,g,b,distance=180): # Connects 2 users together via a normal beam x,y,z = es.getplayerlocation(player1) x1,y1,z1 = x,y,z+distance es.server.queuecmd('est_effect 3 #a 0 sprites/lgtning.vmt %s %s %s %s %s %s %s 40 10 %s %s %s 255'%(x,y,z + 30,x1,y1,z1 + 30,life,r,g,b)) def plusMagic(): userid = es.getcmduserid() Key = getPlayer(userid) Key['magic'] = True def minusMagic(): userid = es.getcmduserid() Key = getPlayer(userid) Key['magic'] = False def sendXp(): displayPlayerInfo(es.getcmduserid(), es.getcmduserid()) def info(): popupSend('informationmenu', es.getcmduserid()) def familiarmenu(userid): menulib.delete('%sorbs'%userid) menu = menulib.create('%sorbs'%userid, 'mainmenu', familiarmenuSelect) menu.settitle('-[ Castle Crasher Animal Orbs ]-') ID = Bank(userid) for animal in AnimalOrbs: if ID['familiars'][animal]: menu.addoption(animal, animal) menu.send(userid) def familiarmenuSelect(userid, choice, popupid): ID = Bank(userid) if ID['familiar']: Speed(userid, AnimalOrbsInfo[ID['familiar']]['speed']*.01*(-1)) Health(userid, AnimalOrbsInfo[ID['familiar']]['toughness']*(-2)) ID['familiar'] = choice Speed(userid, AnimalOrbsInfo[ID['familiar']]['speed']*.01) Health(userid, AnimalOrbsInfo[ID['familiar']]['toughness']*2) es.tell(userid, '#multi', '#defaultYour #lightgreenAnimal Orb #defaulthas been set to #lightgreen%s'%choice) def charactermenu(userid): menulib.delete('%scharacters'%userid) menu = menulib.create('%scharacters'%userid, 'mainmenu', charactermenuSelect) menu.settitle('-[ Castle Crasher Characters ]-') ID = Bank(userid) for animal in Characters: if ID['characters'][animal] and characterCheck(animal, userid): menu.addoption(animal, animal) menu.send(userid) def charactermenuSelect(userid, choice, popupid): ID = Bank(userid) ID['character'] = choice checkCharacter(userid, choice) es.tell(userid, '#multi', '#defaultYour #lightgreenCharacter #defaulthas been set to #lightgreen%s'%choice) def mainMenuSelect(userid, choice, popupid): if choice == 1: charactermenu(userid) elif choice == 2: familiarmenu(userid) elif choice == 3: weaponmenu(userid) elif choice == 6: menulib.delete('%splayerinfo'%userid) playerinfo = menulib.create('%splayerinfo'%userid, 'mainmenu', playerSelect) playerinfo.settitle('-[ CC - Player Info ]-') for player in es.getUseridList(): playerinfo.addoption(player, es.getplayername(player)) popupSend('%splayerinfo 1'%userid, userid) elif choice == 7: displayPlayerInfo(userid, userid) def weaponmenu(userid): menulib.delete('%sweapons'%userid) menu = menulib.create('%sweapons'%userid, 'mainmenu', weaponmenuSelect) menu.settitle('-[ Castle Crasher Weapons ]-') ID = Bank(userid) for weapon in Weapons: if ID['weapons'][weapon]: menu.addoption(weapon, weapon) menu.send(userid) def weaponmenuSelect(userid, choice, popupid): Key = getPlayer(userid) Key['weapon'] = choice es.tell(userid, '#multi', '#defaultYour #lightgreenweapon #defaulthas been set to #lightgreen%s #defaultyou will have it next time you spawn'%choice) def playerInfo(): userid = es.getcmduserid() popupClose(userid) menulib.delete('%splayerinfo'%userid) playerinfo = menulib.create('%splayerinfo'%userid, 'mainmenu', playerSelect) playerinfo.settitle('-[ CC - Player Info ]-') for player in es.getUseridList(): playerinfo.addoption(player, es.getplayername(player)) popupSend('%splayerinfo 1'%userid, userid) def info(): popupSend('informationmenu', es.getcmduserid()) def playerSelect(userid, choice, popupid): displayPlayerInfo(userid, choice) def displayPlayerInfo(menuSend, target): ID = Bank(target) character = ID['character'] mymenu = popuplib.create('someguysinfo') mymenu.addline('-[ CC - %s Info ]-'%es.getplayername(target)) stats = ['Strength','Magic','Toughness','Speed'] mymenu.addline(' Character: %s'%character) mymenu.addline(' Animal Orb: %s'%ID['familiar']) mymenu.addline(' Gold: %s'%ID['gold']) mymenu.addline(' Level: %s'%ID[character]['level']) mymenu.addline(' Exp: %s'%ID[character]['xp']) for stat in stats: mymenu.addline(' %s:'%stat) mymenu.addline(' -- [%s]'%formatBars(ID[character][stat.lower()])) mymenu.addline('-> 8. Back') mymenu.addline('0. Exit') mymenu.submenu(8, 'mainmenu') popupSend('someguysinfo', menuSend) def sendMenu(): popupSend('mainmenu', es.getcmduserid()) #popuplib.find('mainmenu').send(es.getcmduserid()) def spendPoints(userid): ID = Bank(userid) character = ID['character'] if character: if ID[character]['unspent']: skills = popuplib.create('%sskills'%userid) skills.addline('-[ Spend Points - %s ]-'%ID[character]['unspent']) stats = ['Strength','Magic','Toughness','Speed'] for stat in stats: if ID[character][stat.lower()] < 25: skills.addline('-> %s. %s'%(stats.index(stat)+1, stat)) skills.addline(' -- [%s]'%formatBars(ID[character][stat.lower()])) else: skills.addline(' MAX %s [|||||||||||||||||||||||||]'%stat) skills.addline('0. Exit') skills.menuselect = spendPointsSelect popupSend('%sskills'%userid, userid) def spendPointsSelect(userid, choice, popupid): ID = Bank(userid) character = ID['character'] if ID[character]['unspent']: choice -= 1 stats = ['Strength','Magic','Toughness','Speed'] if choice <= 3: if ID[character][stats[choice].lower()] < 25: ID[character][stats[choice].lower()] += 1 ID[character]['unspent'] -= 1 es.tell(userid, '#multi', '#defaultYour %s has advanced to rank #green%s'%(stats[choice], ID[character][stats[choice].lower()])) spendPoints(userid) def round_end(ev): for userid in es.getUseridList(): spendPoints(userid) es.server.queuecmd('est_RemoveIdle weapon') str_path = open(es.getAddonPath('castlecrashers') + '/IDStorage.db', 'w') cPickle.dump(IDStorage, str_path) str_path.close() winner = int(ev['winner']) for userid in es.getUseridList(): Key = getPlayer(userid) #Stop all pending delays linked to all players on round end while Key['delays'] > 0: gamethread.cancelDelayed('%s_%s'%(userid, Key['delays'])) Key['delays'] -= 1 def formatBars(value): count = 25 bars = '' while value > 0: bars = '%s|'%bars value -= 1 count -= 1 while count > 0: bars = '%s-'%bars count -= 1 return bars def weaponDrop(userid, weapon): if weapon in WeaponStats: Health(userid, WeaponStats[weapon]['toughness']*(-1)) Speed(userid, WeaponStats[weapon]['speed']*.01*(-1)) def weaponPickup(userid, weapon): if weapon in WeaponStats: Health(userid, WeaponStats[weapon]['toughness']) Speed(userid, WeaponStats[weapon]['speed']*.01) def getLevel(userid, stat): ID = Bank(userid) level = 0 weapon = str(playerlib.getPlayer(userid).get('weapon')).replace('weapon_', '') if weapon != 'None': level += WeaponStats[weapon][stat] character = ID['character'] if character: level += ID[character][stat] familiar = ID['familiar'] if familiar: level += AnimalOrbsInfo[familiar][stat] return level def deBug(msg, level): if level <= int(es.ServerVar('castlecrashers_Debug')): es.msg(msg) def popupSend(popupName, userid): count = popuplib.active(userid)['count'] while count: count -= 1 popuplib.close(popuplib.active(userid)['name'], userid) popuplib.find(popupName).send(userid) def popupClose(userid): count = popuplib.active(userid)['count'] while count: count -= 1 popuplib.close(popuplib.active(userid)['name'], userid) def player_activate(ev): userid = int(ev['userid']) ID = Bank(userid) if ID['character'] == None or not characterCheck(ID['character'], userid): randomCharacter(userid) def player_jump(ev): '''Runs every time a user jumps''' userid = int(ev['userid']) ID = Bank(userid) jump_multi = 1 if ID['familiar'] == 'Sherbert': jump_multi += .15 #Code for long jump provided by SD temp_multiplier = jump_multi - 1 if temp_multiplier > 0: es.setplayerprop(userid, 'CBasePlayer.localdata.m_vecBaseVelocity', '%s,%s,%s' % tuple([es.getplayerprop(userid, 'CBasePlayer.localdata.m_vecVelocity[%s]' % x) * temp_multiplier for x in range(3)])) def randomCharacter(userid): mylist = [] ID = Bank(userid) for character in Characters: if ID['characters'][character] and characterCheck(character, userid): mylist.append(character) if len(mylist): character = random.choice(mylist) ID['character'] = character checkCharacter(userid, character) es.tell(userid, '#multi', '#defaultYou are now playing as the #lightgreen%s'%(character)) def checkCharacter(userid, character): ID = Bank(userid) if character not in ID: ID[character] = { 'level':1, 'xp':0, 'unspent':0, 'strength':0, 'magic':0, 'toughness':0, 'speed':0} def characterCheck(character, userid): if character: for player in es.getUseridList(): if Bank(player)['character'] == character and player != userid: return False return True def player_spawn(ev): userid = int(ev['userid']) if es.exists('userid', userid): ID = Bank(userid) Key = getPlayer(userid) while Key['delays'] > 0: #Stop all pending delays for a user that dies gamethread.cancelDelayed('%s_%s'%(userid, Key['delays'])) Key['delays'] -= 1 Default(userid) Health(userid, getLevel(userid, 'toughness')) Speed(userid, getLevel(userid, 'speed')*.01) Key['mana'] += getLevel(userid, 'magic')*5 ManaRegen(userid) if ID['familiar'] == 'Troll': Regeneration(userid, 4, 1) Key['spawn location'] = es.getplayerlocation(userid) ID['time stamp'] = time.time() if int(es.getplayerteam(userid)) > 1: es.server.queuecmd('est_RemoveWeapon %s 2'%userid) es.server.queuecmd('es_xgive %s weapon_%s'%(userid, Key['weapon'])) def ManaRegen(userid): Key = getPlayer(userid) magic = getLevel(userid, 'magic') if Key['mana']+magic*.2 <= Key['mana']+magic*5: Key['mana'] += magic*.2 else: Key['mana'] = Key['mana']+magic*5 def item_pickup(ev): userid = int(ev['userid']) item = ev['item'] if item in Weapons and item != 'knife': weaponPickup(userid, item) player = playerlib.getPlayer(userid) primary = player.get('primary') secondary = player.get('secondary') if primary: primary = primary.replace('weapon_', '') if primary != item: weaponDrop(userid, primary) es.server.queuecmd('est_RemoveWeapon %s weapon_%s'%(userid, primary)) if secondary: secondary = secondary.replace('weapon_', '') if secondary != item: weaponDrop(userid, secondary) es.server.queuecmd('est_RemoveWeapon %s weapon_%s'%(userid, secondary)) def prepHurt(): userid = ReturnEV('userid') attacker = ReturnEV('attacker') if attacker and attacker != '0': damage = ReturnEV('dmg_health') health = es.getplayerprop(userid, 'CBasePlayer.m_iHealth') Key = getPlayer(userid) damage_reduction = 0 deBug('Start Health: %s'%health, 2) deBug('Start Damage: %s'%damage, 2) #dmg_start = damage dr_percent = getLevel(userid, 'toughness')*.01 damage += damage*getLevel(attacker, 'strength')*.01 damage_reduction += min(damage*dr_percent, damage) if damage_reduction > damage or Key['blocking']: damage_reduction = damage if (health+damage_reduction) > (damage-damage_reduction): SetEV('dmg_health', (damage-damage_reduction)) SetEV('health', health+damage_reduction) deBug('End Damage %s'%(damage-damage_reduction),2) deBug('End Health %s'%str(health+(damage_reduction)),2) es.setplayerprop(userid, 'CBasePlayer.m_iHealth', health+damage_reduction) def player_hurt(ev): if ev['attacker'] and ev['attacker'] != '0' and ev['userid'] != '0': userid = int(ev['userid']) attacker = int(ev['attacker']) if ev['dmg_health']: damage = int(float(ev['dmg_health'])) else: damage = 0 giveXp(attacker, damage) #Gets/Sets event_var for our prep events def ReturnEV(variable): """ A little wrapper to set the Event Info in a pre event to return the value """ es.ServerVar('wcs_temp').set(0) es.server.cmd('est_geteventinfo wcs_temp %s'%variable) try: return int(es.ServerVar('wcs_temp')) except: return str(es.ServerVar('wcs_temp')) def SetEV(variable, value): """ A little wrapper to set the Event Info in a pre event to hold the value """ es.server.cmd('est_seteventinfo %s %s'%(variable, value)) def est_map_end(ev): """ Ran when the map ends. Delete all players if their inactivity is too high """ time_now = time.time() days_till_removed = 14.0 inactivity_length = days_till_removed * 86400 time_now -= inactivity_length dellist = [] for a in IDStorage: deBug('Found player %s'%a, 1) if 'time stamp' in IDStorage[a]: last_active = IDStorage[a]['time stamp'] if time_now >= last_active: dellist.append(a) else: dellist.append(a) for player in dellist: deBug('Removing player %s due to in activity'%a, 1) del IDStorage[player] def getPlayer(userid): '''Returns the user key of a given player, teporary storage never saved''' userid = int(userid) if es.exists('userid', userid): if userid not in Users: Users[userid] = {} Key = Users[userid] Key['Speed'] = 1.0 Key['magic'] = False Key['mana'] = 100 Key['weapon'] = 'glock' Key['freeze'] = 0 Key['stun'] = 0 Key['delays'] = 0 Key['gravity'] = 1.0 Key['maxhealth'] = 100 Key['jump'] = 1.0 Key['thermal range'] = 0 Key['spawn location'] = [0,0,0] Key['death location'] = [0,0,0] Key['mana'] = 0 Key['spell delay'] = False Key['blocking'] = False return Users[userid] def Bank(userid): '''Stores the only long term information for each player, contains each person's character list based on steamid returns each user's long term key''' userid = int(userid) if es.exists('userid', userid): steamid = playerlib.uniqueid(userid) if steamid not in IDStorage: IDStorage[steamid] = { 'character':None, 'familiar':None, 'gold':0, 'familiars':{ 'Beholder':False, 'BiPolar Bear':False, 'Bitey Bat':False, 'Burly Bear':False, 'Cardinal':False, 'Chicken':False, 'Dragon':False, 'Frogglet':False, 'Giraffey':False, 'Hawkster':False, 'Install Ball':False, 'Meowburt':False, 'Monkey Face':False, 'Mr. Buddy':False, 'Owlet':False, 'Pazzo':False, 'Pelter':False, 'Piggy':False, 'Rammy':False, 'Scratchpaw':False, 'Seahorse':False, 'Sherbert':False, 'Snailburt':False, 'Snoot':False, 'Spiny':False, 'Troll':False, 'Yeti':False, 'Zebra':False}, 'characters':{ 'Red Knight':True, 'Blue Knight':True, 'Green Knight':True, 'Orange Knight':True, 'Gray Knight':True, 'Barbarian':True, 'Thief':True, 'Peasant':True, 'Iceskimo':True, 'Conehead':True, 'Alien Hominid':False, 'Fire Demon':False, 'Ninjer':False, 'Skeleton':False, 'Bear':False, 'Industrialist':False, 'Fencer':False, 'Royal Guard':False, 'Saracen':False, 'King':False, 'Necromancer':False, 'Wizard\'s Minion':False, 'Open-Faced Gray Knight':False}, 'weapons':{ 'ak47':False,'m4a1':False,'galil':False,'famas':False,'sg552':False,'aug':False,'glock':True,'usp':True,'p228':False,'deagle':False,'fiveseven':False, 'elite':False,'m3':False,'xm1014':False,'mac10':False,'tmp':False,'ump45':False,'mp5navy':False,'p90':False,'scout':False,'awp':False,'sg550':False, 'g3sg1':False,'hegrenade':False,'flashbang':False,'smokegrenade':False,'m249':False,'knife':False}, 'items':{}} return IDStorage[steamid] else: return { 'character':None, 'familiar':None, None: {'level':0, 'xp':0, 'unspent':0, 'strength':0, 'magic':0, 'toughness':0, 'speed':0}} def Default(userid): '''Sets all of a user's values to defaults''' Key = getPlayer(userid) if es.exists('userid', userid): es.server.queuecmd('est_SetPlayerColor %s 255 255 255 255 1'%userid) es.server.queuecmd('est_setgravity %s 1.0'%userid) Key['Speed'] = 1.0 Key['magic'] = False Key['mana'] = 100 Key['freeze'] = 0 Key['stun'] = 0 Key['delays'] = 0 Key['gravity'] = 1.0 Key['maxhealth'] = 100 Key['jump'] = 1.0 Key['thermal range'] = 0 Key['spawn location'] = [0,0,0] Key['death location'] = [0,0,0] Key['mana'] = 0 Key['spell delay'] = False Key['blocking'] = False def giveXp(userid, amount): es.tell(userid, '#multi', '#lightgreenYou have gain #green%s #lightgreenXp!'%amount) ID = Bank(userid) character = ID['character'] if ID['familiar'] == 'Giraffey': amount += int(amount * .1) ID[character]['xp'] += amount if ID[character]['xp'] >= ID[character]['level']*1000: ID[character]['xp'] -= ID[character]['level']*1000 ID[character]['level'] += 1 es.tell(userid, '#multi', '#lightgreenYou have advanced to level #green%s'%ID[character]['level']) if ID[character]['level'] <= 20: ID[character]['unspent'] += 2 else: ID[character]['unspent'] += 1 def Speed(userid, amount, set=None, delay=None): '''A command method used to manage user's speed There is an issue with using just the playerprop to store the value so a dict is used to track each player's speed''' if es.exists('userid', userid): Key = getPlayer(userid) if not set: Key['Speed'] += amount else: Key['Speed'] = amount es.setplayerprop(userid, "CBasePlayer.localdata.m_flLaggedMovementValue", Key['Speed']) if delay: Delayed(userid, delay, Speed, (userid, amount*(-1))) def Delayed(userid, duration, callback, args=()): '''Handels our delay calls so they cancel on user death/round end''' if es.exists('userid', userid): Key = getPlayer(userid) Key['delays'] += 1 gamethread.delayedname(duration, '%s_%s'%(userid, Key['delays']), callback, args) def EndRndDelayed(duration, callback, args=()): gamethread.delayedname(duration, 'roundend', callback, args) def Blind(userid, duration): es.setplayerprop(userid, "CCSPlayer.m_flFlashMaxAlpha", 255) es.setplayerprop(userid, "CCSPlayer.m_flFlashDuration", duration) def Regeneration(userid, delay, amount, loops=None, currentloop=1): '''Excutes a looping heal command every X seconds''' if es.exists('userid', userid): Heal(userid, amount) if loops: if currentloop < loops: currentloop += 1 Delayed(userid, delay, Regeneration, (userid, delay, amount, loops, currentloop)) else: Delayed(userid, delay, Regeneration, (userid, delay, amount)) def Health(userid, amount, kind=None): '''Used to modify a user's max health''' Key = getPlayer(userid) if not kind: Key['maxhealth'] += amount if es.getplayerprop(userid, 'CBasePlayer.m_iHealth')+amount > 0: es.setplayerprop(userid, 'CBasePlayer.m_iHealth', es.getplayerprop(userid, 'CBasePlayer.m_iHealth')+amount) else: es.setplayerprop(userid, 'CBasePlayer.m_iHealth', 1) else: Key['maxhealth'] = amount es.setplayerprop(userid, 'CBasePlayer.m_iHealth', amount) def Heal(userid, amount, kind=None): '''Used to heal a user, meaning restore health up to their set max''' Key = getPlayer(userid) health = es.getplayerprop(userid, 'CBasePlayer.m_iHealth') if health+amount <= Key['maxhealth']: es.setplayerprop(userid, 'CBasePlayer.m_iHealth', health+amount) else: es.setplayerprop(userid, 'CBasePlayer.m_iHealth', Key['maxhealth']) def Gravity(userid, amount, set=False): '''Used to track/modify a user's current gravity level''' Key = getPlayer(userid) if not set: Key['gravity'] += amount else: Key['gravity'] = amount es.server.queuecmd('est_setgravity %s %s'%(userid, Key['gravity'])) def Freeze(userid, duration=None): '''Used to stop a player from moving/shooting/turning''' orb = Bank(userid)['familiar'] if orb != 'Yeti': es.setplayerprop(userid, "CBasePlayer.m_fFlags", 32.0) if duration: Delayed(userid, duration, Unfreeze, userid) def Unfreeze(userid): '''Restores a user's normal movement''' if es.exists('userid', userid): es.setplayerprop(userid, "CBasePlayer.m_fFlags", 1) def TempHealth(userid, amount, timer=None): '''Gives said users a temporary health boost''' Health(userid, amount) if timer: Delayed(userid, timer, TempHealthOff, (userid,amount)) def TempHealthOff(userid, amount, timer=None): '''Used to end a temp health boost''' if es.exists('userid', userid): if int(es.getplayerprop(userid, 'CBasePlayer.m_iHealth')) > amount: es.setplayerprop(userid, 'CBasePlayer.m_iHealth', int(es.getplayerprop(userid, 'CBasePlayer.m_iHealth'))-amount) else: es.setplayerprop(userid, 'CBasePlayer.m_iHealth', 1) getPlayer(userid)['maxhealth'] -= amount if timer: Delayed(userid, timer, MaxHealthIncrease, (userid,amount)) def MaxHealthIncrease(userid, amount): if es.exists('userid', userid): getPlayer(userid)['maxhealth'] += amount def Stun(userid, duration=None): '''Used to stop a player from walking (can still shoot ect.)''' orb = Bank(userid)['familiar'] if orb != 'Yeti': es.setplayerprop(userid, "CBaseEntity.movetype", 0) if duration: Delayed(userid, duration, Unstun, (userid)) def Unstun(userid): '''Restores a player's normal movement''' if es.exists('userid', userid): es.setplayerprop(userid, "CBaseEntity.movetype", 2) def Disguise(userid, delay=None): '''Used to make a player appear as the enemy''' model = None if es.getplayerteam(userid) == 2: model = random.choice(['ct_urban','ct_sas','ct_gsg9','ct_gign']) else: model = random.choice(['t_phoenix','t_leet','t_guerilla','t_arctic']) if model: es.server.queuecmd('est_SetModel %s player/%s'%(userid, model)) es.server.queuecmd('est_SetPlayerColor %s 255 255 255 255 1'%userid) if delay: Delayed(userid, delay, Undisguise, userid) def Cash(userid, amount, set=False): if not set: amount = es.getplayerprop(userid,'CCSPlayer.m_iAccount') + amount es.setplayerprop(userid,'CCSPlayer.m_iAccount', min(amount, 16000)) else: es.setplayerprop(userid,'CCSPlayer.m_iAccount', amount) def Undisguise(userid): '''Used to set a player's model to their teams''' if es.exists('userid', userid): model = None if es.getplayerteam(userid) == 2: model = random.choice(['t_phoenix','t_leet','t_guerilla','t_arctic']) else: model = random.choice(['ct_urban','ct_sas','ct_gsg9','ct_gign']) if model: es.server.queuecmd('est_SetModel %s player/%s'%(userid, model)) es.server.queuecmd('est_SetPlayerColor %s 255 255 255 255 1'%userid) def Damage(userid, attacker, damage): '''Used to cause damage between two users And is safe to call in player_hurt''' Key = getPlayer(userid) damage -= min(damage*getLevel(userid, 'toughness')*.01, damage) giveXp(attacker, damage) if es.getplayerprop(userid, 'CBasePlayer.m_iHealth') <= damage: es.server.queuecmd('damage %s %s 32 %s'%(userid, damage, attacker)) else: es.setplayerprop(userid, 'CBasePlayer.m_iHealth', es.getplayerprop(userid, 'CBasePlayer.m_iHealth')-damage) def HudHint(userid, msg): '''Displays the given message to users at the bottom of their screen''' es.usermsg('create','hudhint','HintText') es.usermsg('write','short','hudhint',-1) es.usermsg('write','string','hudhint',msg) es.usermsg('send','hudhint',userid) es.usermsg('delete','hudhint') def _cc_filter(userid, args): if args[0].lower() == 'drop': return False weapon = str(playerlib.getPlayer(userid).get('weapon')).replace('weapon_', '') weaponDrop(userid, weapon) elif args[0].lower() == 'buy': return False return True es.addons.registerClientCommandFilter(_cc_filter)