Advertisement
Guest User

CustomEvents - shopmenu.py

a guest
May 21st, 2019
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 10.70 KB | None | 0 0
  1. from players.entity import Player
  2. from players.helpers import index_from_userid, playerinfo_from_userid, index_from_playerinfo, userid_from_index
  3. from menus import SimpleMenu
  4. from menus import SimpleOption
  5. from menus import PagedOption
  6. from menus import Text
  7. from engines.server import queue_command_string,execute_server_command
  8. import wcs
  9. from commands.say import SayCommand
  10. from commands.client import ClientCommand
  11. from menus import PagedMenu
  12. import wcs.events
  13. from events import Event
  14. from listeners import OnLevelInit
  15. from filters.players import PlayerIter
  16. import random
  17. from cvars import ConVar
  18. from wcs import wcsmenu
  19.  
  20.  
  21.  
  22. popups = []
  23. items = {}
  24. money = {}
  25. maxitems = {}
  26.  
  27. for player in PlayerIter('all'):
  28.     if player.userid not in items:
  29.         items[player.userid] = {}
  30.  
  31.  
  32.  
  33. def canBuy(userid, item, pay=True):
  34.     userid = int(userid)
  35.     level = wcs.wcs.wcsplayers[userid].totallevel
  36.     iteminfo = wcs.wcs.itemdb.getItem(item)
  37.     player_entity = Player(index_from_userid(userid))
  38.     if player_entity.dead:
  39.         is_dead = 0
  40.     else:
  41.         is_dead = 1
  42.  
  43.     if is_dead == int(iteminfo['dab']) or int(iteminfo['dab']) == 2:
  44.         section = wcs.wcs.itemdb.getSectionFromItem(item)
  45.         if not userid in maxitems:
  46.             maxitems[userid] = {}
  47.  
  48.         if not section in maxitems[userid]:
  49.             maxitems[userid][section] = 0
  50.  
  51.         if maxitems[userid][section] and int(wcs.wcs.itemdb[section]['maxitems']) <= maxitems[userid][section]:
  52.             return 4
  53.            
  54.         if int(iteminfo['level']) and level < int(iteminfo['level']):
  55.             return 6
  56.  
  57.         race = wcs.wcs.wcsplayers[userid].currace
  58.         v = wcs.wcs.racedb.races[race]['restrictitem'].split('|')
  59.         if (item in v) or ('ITEMS' in v):
  60.             return 3
  61.  
  62.         cfg = iteminfo['cfg']
  63.         if cfg in items[userid]:
  64.             if item in items[userid][cfg]:
  65.                 if int(iteminfo['max']) and items[userid][cfg][item] >= int(iteminfo['max']):
  66.                     return 1
  67.            
  68.         payment = player_entity.cash
  69.  
  70.         if payment >= int(iteminfo['cost']) or not pay:
  71.             return 0
  72.         return 2
  73.     return 5
  74.    
  75. def shopmenu_menu_cats_build(menu, index):
  76.     menu.clear()
  77.     allitems = wcs.wcs.itemdb.getSections()
  78.     for item in allitems:
  79.         option = PagedOption('%s' % str(item), item)
  80.         menu.append(option)
  81.  
  82. def shopmenu_menu_cats_select(menu, index, choice):
  83.     userid = userid_from_index(index)
  84.     doCommand1(userid, choice.value)       
  85.        
  86. shopmenu_menu_cats = PagedMenu(title='Shopmenu Menu', build_callback=shopmenu_menu_cats_build, select_callback=shopmenu_menu_cats_select)
  87.        
  88. def doCommand(userid):
  89.     index = index_from_userid(userid)
  90.     allitems = wcs.wcs.itemdb.getSections()
  91.     if len(allitems):
  92.         shopmenu_menu_cats.send(index)
  93.        
  94.  
  95.  
  96.  
  97.  
  98. item_names = []
  99.    
  100. def shopmenu_menu_subcats_build(menu, index):
  101.     menu.clear()
  102.     userid = userid_from_index(index)
  103.     section = menu.title
  104.     menu.parent_menu = shopmenu_menu_cats
  105.     items_all = wcs.wcs.ini.getItems
  106.     items_all.walk(gather_subsection)
  107.     for item in item_names:
  108.         item_sec = wcs.wcs.itemdb.getSectionFromItem(item)
  109.         if item_sec == section:
  110.             iteminfo = wcs.wcs.itemdb.getItem(item)
  111.             option = PagedOption('%s - %s$' % (str(iteminfo['name']), str(iteminfo['cost'])), item)
  112.             menu.append(option)
  113.                
  114.    
  115. def gather_subsection(section, key):
  116.     if section.depth > 1:
  117.         if section.name not in item_names:
  118.             item_names.append(section.name)
  119.            
  120. def shopmenu_menu_subcats_select(menu, index, choice):
  121.     userid = userid_from_index(index)
  122.     addItem(userid, choice.value)
  123.  
  124. #shopmenu_menu_subcats = PagedMenu(build_callback=shopmenu_menu_subcats_build, select_callback=shopmenu_menu_subcats_select)
  125.  
  126.            
  127. def doCommand1(userid, value):
  128.     index = index_from_userid(userid)
  129.     itemkeys = wcs.wcs.ini.getItems
  130.     shopmenu_menu_subcats = PagedMenu(build_callback=shopmenu_menu_subcats_build, select_callback=shopmenu_menu_subcats_select)
  131.     shopmenu_menu_subcats.title = value
  132.     shopmenu_menu_subcats.send(index)
  133.  
  134. def addItem(userid, item, pay=True, tell=True):
  135.     section = wcs.wcs.itemdb.getSectionFromItem(item)
  136.     itemsa = wcs.wcs.ini.getItems
  137.     userid = int(userid)
  138.     player_entity = Player(index_from_userid(userid))
  139.     if not userid in items:
  140.         items[userid] = {}
  141.     c = canBuy(userid, item, pay)
  142.  
  143.     if not c:
  144.         if pay:
  145.             player_entity.cash -= int(itemsa[section][item]['cost'])
  146.         if tell:
  147.             wcs.wcs.tell(userid, '\x04[WCS] \x04You have purchased: \x05%s' % itemsa[section][item]['name'])
  148.  
  149.         cfg = itemsa[section][item]['cfg']
  150.         if not cfg in items[userid]:
  151.             items[userid][cfg] = {}
  152.  
  153.         if not item in items[userid][cfg]:
  154.             items[userid][cfg][item] = 0
  155.  
  156.         items[userid][cfg][item] += 1
  157.  
  158.         if not userid in maxitems:
  159.             maxitems[userid] = {}
  160.  
  161.         if not section in maxitems[userid]:
  162.             maxitems[userid][section] = 0
  163.  
  164.         maxitems[userid][section] += 1
  165.  
  166.         checkBuy(userid, item)
  167.         event_instance = wcs.events.wcs_itembought(userid=userid, item=item, cost=int(wcs.wcs.itemdb.getItem(item)['cost']))
  168.         event_instance.fire()  
  169.  
  170.     elif c == 1:
  171.         doCommand1(userid, section)
  172.         if tell:
  173.             wcs.wcs.tell(userid, '\x04[WCS] \x05Item \x04%s \x05is out of stock.' % itemsa[section][item]['name'])
  174.     elif c == 2:
  175.         doCommand1(userid, section)
  176.         if tell:
  177.             payment = player_entity.cash
  178.             wcs.wcs.tell(userid, '\x04[WCS] \x05You need \x04%s \05to buy \x04%s.' % (int(itemsa[section][item]['cost'])-payment, itemsa[section][item]['name']))
  179.     elif c == 3:
  180.         doCommand1(userid, section)
  181.         if tell:
  182.             wcs.wcs.tell(userid, "\x04[WCS] \x05You can't buy \x04%s\x05, it's restricted from your current race." % itemsa[section][item]['name'])
  183.     elif c == 4:
  184.         doCommand1(userid, section)
  185.         if tell:
  186.             wcs.wcs.tell(userid, "\x04[WCS] \x05You can't buy the item \x04%s\x05 because you've bought too many items in the section \x04%s" % (itemsa[section][item]['name'], section))
  187.     elif c == 5:
  188.         doCommand1(userid, section)
  189.         if tell:
  190.             wcs.wcs.tell(userid, "\x04[WCS] \x05You can't buy \x04%s\x05, you need to be \x04%s." % (itemsa[section][item]['name'], ['<death>','<alive>','<death or alive>'][int(itemsa[section][item]['dab'])]))
  191.     elif c == 6:
  192.         doCommand1(userid, section)
  193.         iteminfo = wcs.wcs.itemdb.getItem(item)
  194.         diffience = int(iteminfo['level']) - int(wcs.wcs.wcsplayers[userid].level)
  195.         if tell:
  196.             wcs.wcs.tell(userid, "\x04[WCS] \x05Sorry, you have not the required level, difference is \x04%s." % diffience)
  197.            
  198.  
  199.                            
  200. def checkEvent(userid, event):
  201.     userid = int(userid)
  202.     player = Player.from_userid(userid)
  203.     if player.team > 1:
  204.         if userid in items:
  205.             if event in items[userid]:
  206.                 for item in items[userid][event]:
  207.                     v = items[userid][event][item]
  208.                     item, section = item, wcs.wcs.itemdb.getSectionFromItem(item)
  209.                     iteminfo = wcs.wcs.ini.getItems[section][item]
  210.  
  211.                     ConVar('wcs_userid').set_int(userid)
  212.                     ConVar('wcs_dice').set_int(random.randint(0, 100))
  213.  
  214.                     while v > 0:
  215.                         if (iteminfo['cfg'] == 'player_buy' or event == 'player_buy') and iteminfo['cmdbuy']:
  216.                             settings = str(iteminfo['cmdbuy'])
  217.                             if ';' in settings:
  218.                                 sub_settings = settings.split(';')
  219.                                 for com in sub_settings:
  220.                                     execute_server_command('es', com)
  221.                             else:
  222.                                 execute_server_command('es', settings)
  223.  
  224.                         elif iteminfo['cmdactivate']:
  225.                             settings = str(iteminfo['cmdactivate'])
  226.                             if ';' in settings:
  227.                                 sub_settings = settings.split(';')
  228.                                 for com in sub_settings:
  229.                                     execute_server_command('es', com)
  230.                             else:
  231.                                 execute_server_command('es', settings)
  232.                             wcs.wcs.tell(userid, '\x04[WCS] %s \x05activated!' % iteminfo['name'])
  233.  
  234.                         v -= 1
  235.                            
  236.                            
  237. def checkBuy(userid, item):
  238.     userid = int(userid)
  239.     iteminfo = wcs.wcs.ini.getItems[wcs.wcs.itemdb.getSectionFromItem(item)][item]
  240.     player_entity = Player(index_from_userid(userid))
  241.     if player_entity.dead:
  242.         is_dead = 0
  243.     else:
  244.         is_dead = 1
  245.     if is_dead == int(iteminfo['dab']) or int(iteminfo['dab']) == 2:
  246.         ConVar('wcs_userid').set_int(userid)
  247.         ConVar('wcs_dice').set_int(random.randint(0, 100))
  248.         if iteminfo['cfg'] == 'player_buy' and iteminfo['cmdactivate']:
  249.             settings = iteminfo['cmdactivate']
  250.             if ';' in settings:
  251.                 sub_settings = settings.split(';')
  252.                 for com in sub_settings:
  253.                     execute_server_command('es', com)
  254.             else:
  255.                 execute_server_command('es', settings)
  256.         elif iteminfo['cmdbuy']:
  257.             settings = iteminfo['cmdbuy']
  258.             if ';' in settings:
  259.                 sub_settings = settings.split(';')
  260.                 for com in sub_settings:
  261.                     execute_server_command('es', com)
  262.             else:
  263.                 execute_server_command('es', settings)
  264.            
  265.    
  266.  
  267. #Shopmenu Execution Stuff
  268. @Event('player_death')                 
  269. def player_death(event):
  270.     victim = event.get_int('userid')
  271.     attacker = event.get_int('attacker')
  272.     weapon = event.get_string('weapon')
  273.     vic_entity = Player(index_from_userid(victim))
  274.  
  275.     if attacker and victim:
  276.         atk_entity = Player(index_from_userid(attacker))
  277.         if not victim == attacker:
  278.             if not atk_entity.team == vic_entity.team:
  279.                 checkEvent(victim,  'player_death')
  280.                 checkEvent(attacker, 'player_kill')
  281.  
  282.     if victim and not attacker:
  283.         checkEvent(victim,  'player_death')
  284.        
  285.     if victim:
  286.         removeItems(victim,1)
  287.         if victim in maxitems:
  288.             maxitems[victim].clear()
  289.        
  290. def removeItems(userid, value):
  291.     if userid in items:
  292.         for x in items[userid]:
  293.             for q in items[userid][x].copy():
  294.                 item = wcs.wcs.itemdb.getItem(q)
  295.                 if int(item['duration']) == value:
  296.                     items[userid][x][q] = 0
  297.        
  298. @Event('player_hurt')
  299. def player_hurt(event):
  300.     victim = event.get_int('userid')
  301.     attacker = event.get_int('attacker')
  302.     weapon = event.get_string('weapon')
  303.    
  304.     if victim:  
  305.         vic_entity = Player(index_from_userid(victim))
  306.     if attacker:
  307.         atk_entity = Player(index_from_userid(attacker))
  308.     if attacker and victim and not weapon.lower() in ('point_hurt'):
  309.         if not victim == attacker:
  310.             if not atk_entity.team == vic_entity.team:
  311.                 checkEvent(victim, 'player_victim')
  312.                 checkEvent(attacker, 'player_attacker')
  313.         checkEvent(victim, 'player_hurt')
  314.  
  315. @Event('wcs_player_spawn')
  316. def player_spawn(event):
  317.     userid = event.get_int('userid')
  318.     if userid:
  319.         checkEvent(userid, 'player_spawn')
  320.        
  321. @Event('round_end')
  322. def round_end(event):
  323.     for player in PlayerIter('all'):
  324.         removeItems(player.userid,0)
  325.  
  326. @Event('player_say')
  327. def player_say(event):
  328.     text = event.get_string('text').lower()
  329.     userid = event.get_int('userid')
  330.     checkEvent(userid, 'player_say')
  331.  
  332.  
  333. @Event('player_activate')
  334. def player_activate(event):
  335.     userid = event.get_int('userid')
  336.     if not userid in items:
  337.         items[userid] = {}
  338.        
  339.        
  340. @Event('player_disconnect')
  341. def player_disconnect(event):
  342.     userid = event.get_int('userid')
  343.     if userid in items:
  344.         del items[userid]
  345.  
  346.     if userid in maxitems:
  347.         del maxitems[userid]
  348.  
  349.  
  350. @OnLevelInit
  351. def level_init_listener(mapname):
  352.     items.clear()
  353.     maxitems.clear()
  354.  
  355.  
  356.  
  357. def load():
  358.     for player in PlayerIter():
  359.         items[int(player.userid)] = {}
  360.  
  361.  
  362. def unload():
  363.     items.clear()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement