Advertisement
satoon101

entity_attributes

Nov 3rd, 2015
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 10.04 KB | None | 0 0
  1. import pickle
  2. from warnings import warn
  3.  
  4. from path import Path
  5.  
  6. from commands.server import ServerCommand
  7. from core import GAME_NAME
  8. from core import SOURCE_ENGINE
  9. from engines.server import engine_server
  10. from engines.server import global_vars
  11. from entities.entity import Entity
  12. from entities.factories import factory_dictionary
  13. from entities.helpers import index_from_edict
  14. from entities.helpers import remove_entity
  15. from filters.entities import EntityIter
  16. from filters.players import PlayerIter
  17. from players.bots import bot_manager
  18. from players.entity import PlayerEntity
  19.  
  20.  
  21. # Set to the path where all virtuals are held
  22. # Virtual files should be in <path>/<GAME_NAME>/server/ directory
  23. VIRTUAL_PATH = Path('E:/Virtuals')
  24.  
  25. DUMP_BASE_PATH = Path(__file__).parent
  26. ENGINE_DUMP_PATH = DUMP_BASE_PATH.joinpath(SOURCE_ENGINE)
  27. if not ENGINE_DUMP_PATH.isdir():
  28.     ENGINE_DUMP_PATH.mkdir()
  29. GAME_DUMP_FILE = ENGINE_DUMP_PATH.joinpath(GAME_NAME + '.db')
  30. ENGINE_DUMP_FILE = DUMP_BASE_PATH.joinpath(SOURCE_ENGINE + '.db')
  31. ALL_FILE = DUMP_BASE_PATH.joinpath('all.db')
  32. value_types = ('virtual_function', 'input', 'keyvalue', 'property')
  33.  
  34.  
  35. class NoMapLoadedError(Exception):
  36.  
  37.     """No map is currently loaded."""
  38.  
  39.  
  40. if not global_vars.map_name:
  41.     raise NoMapLoadedError(NoMapLoadedError.__doc__)
  42.  
  43.  
  44. def get_virtuals(server_class):
  45.     game_virtuals = VIRTUAL_PATH.joinpath(GAME_NAME, 'server')
  46.     class_virtuals = list()
  47.     if not game_virtuals.isdir():
  48.         warn('No virtuals for game "{0}"'.format(GAME_NAME))
  49.         return None
  50.     class_file = game_virtuals.joinpath(server_class + '.txt')
  51.     if not class_file.isfile():
  52.         warn('No virtuals for class "{0}" in game "{1}"'.format(
  53.             server_class, GAME_NAME))
  54.         return None
  55.     start = tuple('_ZN{0}{1},_ZNK{0}{1}'.format(
  56.         len(server_class), server_class).split(','))
  57.     with class_file.open() as open_file:
  58.         contents = open_file.readlines()
  59.         for line in contents:
  60.             line = line.strip()
  61.             if line.split()[1].startswith(start):
  62.                 class_virtuals.append(line)
  63.     return class_virtuals
  64.  
  65. server_classes = dict()
  66.  
  67. for classname in sorted(factory_dictionary):
  68.     created = False
  69.     if classname == 'worldspawn':
  70.         entity = Entity(0)
  71.     elif classname == 'player':
  72.         for entity in PlayerIter(return_types='player'):
  73.             break
  74.         else:
  75.             created = True
  76.             entity = PlayerEntity(index_from_edict(
  77.                 bot_manager.create_bot('test_bot')))
  78.     else:
  79.         for entity in EntityIter(classname, True, 'entity'):
  80.             break
  81.         else:
  82.             try:
  83.                 entity = Entity.create(classname)
  84.                 created = True
  85.             except (OverflowError, ValueError):
  86.                 continue
  87.     if classname != entity.classname:
  88.         continue
  89.     for server_class in entity.server_classes:
  90.         name = server_class.__name__
  91.         if name in server_classes:
  92.             continue
  93.         server_classes[name] = {
  94.             'virtual_function': get_virtuals(name),
  95.             'input': list(server_class.inputs),
  96.             'keyvalue': list(server_class.keyvalues),
  97.             'property': list(server_class.properties),
  98.             }
  99.     if created:
  100.         if classname == 'player':
  101.             engine_server.server_command('kickid {0};'.format(entity.userid))
  102.         else:
  103.             print('\tRemoving:', classname, entity.index)
  104.             #remove_entity(entity.index)
  105.  
  106. print('DONE!!!')
  107.  
  108. with GAME_DUMP_FILE.open('wb') as open_file:
  109.     pickle.dump(server_classes, open_file)
  110.  
  111. print('dumped')
  112.  
  113.  
  114. @ServerCommand('compare')
  115. def compare_databases(command):
  116.     try:
  117.         compare_type = command[1]
  118.     except IndexError:
  119.         print('No type given...')
  120.         return
  121.     if compare_type not in ('games', 'engines'):
  122.         print('Given type must be "games" or "engines"')
  123.         return
  124.     if compare_type == 'games':
  125.         compare_games()
  126.     else:
  127.         compare_engines()
  128.  
  129.  
  130. def compare_games():
  131.     for engine_dir in DUMP_BASE_PATH.dirs():
  132.         if engine_dir.namebase in ('__pycache__', 'results'):
  133.             continue
  134.         for start_file in engine_dir.files():
  135.             if not VIRTUAL_PATH.joinpath(start_file.namebase).isdir():
  136.                 continue
  137.             with start_file.open('rb') as open_file:
  138.                 result = pickle.load(open_file)
  139.             break
  140.         else:
  141.             warn('No virtuals for engine "{0}"'.format(engine_dir.namebase))
  142.             continue
  143.         for file in engine_dir.files():
  144.             if file == start_file:
  145.                 continue
  146.             with file.open('rb') as open_file:
  147.                 current = pickle.load(open_file)
  148.             for server_class in list(result):
  149.                 if server_class not in current:
  150.                     del result[server_class]
  151.                 else:
  152.                     for key in value_types:
  153.                         if current[server_class][key] is None:
  154.                             continue
  155.                         for value in list(result[server_class][key]):
  156.                             if value not in current[server_class][key]:
  157.                                 result[server_class][key].remove(value)
  158.         engine_file = DUMP_BASE_PATH.joinpath(engine_dir.namebase + '.db')
  159.         with engine_file.open('wb') as open_file:
  160.             pickle.dump(result, open_file)
  161.  
  162.  
  163. def compare_engines():
  164.     if not ENGINE_DUMP_FILE.isfile():
  165.         print('Engine dump file not written!!!')
  166.         return
  167.     with ENGINE_DUMP_FILE.open('rb') as open_file:
  168.         result = pickle.load(open_file)
  169.     for file in DUMP_BASE_PATH.files('*.db'):
  170.         if file.namebase == SOURCE_ENGINE:
  171.             continue
  172.         with file.open('rb') as open_file:
  173.             current = pickle.load(open_file)
  174.         for server_class in list(result):
  175.             if server_class not in current:
  176.                 del result[server_class]
  177.             else:
  178.                 for key in value_types:
  179.                     if current[server_class][key] is None:
  180.                         continue
  181.                     for value in list(result[server_class][key]):
  182.                         if value not in current[server_class][key]:
  183.                             result[server_class][key].remove(value)
  184.     with ALL_FILE.open('wb') as open_file:
  185.         pickle.dump(result, open_file)
  186.  
  187.  
  188. @ServerCommand('dump_attributes')
  189. def dump_attributes(command):
  190.     if not ALL_FILE.isfile():
  191.         print('No engine compare file created!!!')
  192.         return
  193.     result_dir = DUMP_BASE_PATH.joinpath('results')
  194.     if result_dir.isdir():
  195.         print('Remove results directory before proceding!!')
  196.         return
  197.     result_dir.mkdir()
  198.     with ALL_FILE.open('rb') as open_file:
  199.         all_contents = pickle.load(open_file)
  200.     for server_class in all_contents:
  201.         file = result_dir.joinpath(server_class + '.txt')
  202.         with file.open('w') as open_file:
  203.             for key in value_types:
  204.                 if not all_contents[server_class][key]:
  205.                     continue
  206.                 open_file.write('{0}\n'.format(key))
  207.                 for value in sorted(all_contents[server_class][key]):
  208.                     open_file.write('    {0}\n'.format(value))
  209.         with file.open() as open_file:
  210.             contents = open_file.read()
  211.         if not len(contents):
  212.             file.remove()
  213.     for engine in DUMP_BASE_PATH.dirs():
  214.         if engine.namebase in ('__pycache__', 'results'):
  215.             continue
  216.         engine_dir = result_dir.joinpath(engine.namebase)
  217.         engine_dir.mkdir()
  218.         engine_file = DUMP_BASE_PATH.joinpath(engine.namebase + '.db')
  219.         with engine_file.open('rb') as open_file:
  220.             engine_contents = pickle.load(open_file)
  221.         for server_class in engine_contents:
  222.             file = engine_dir.joinpath(server_class + '.txt')
  223.             with file.open('w') as open_file:
  224.                 for key in value_types:
  225.                     if engine_contents[server_class][key] is None:
  226.                         continue
  227.                     contents = set(engine_contents[server_class][key])
  228.                     contents.difference_update(set(all_contents.get(
  229.                         server_class, {}).get(key, list())))
  230.                     if not contents:
  231.                         continue
  232.                     open_file.write('{0}\n'.format(key))
  233.                     for value in sorted(contents):
  234.                         open_file.write('    {0}\n'.format(value))
  235.             with file.open() as open_file:
  236.                 contents = open_file.read()
  237.             if not len(contents):
  238.                 file.remove()
  239.         for game in engine.files():
  240.             game_dir = engine_dir.joinpath(game.namebase)
  241.             game_dir.mkdir()
  242.             game_file = DUMP_BASE_PATH.joinpath(
  243.                 engine.namebase, game.namebase + '.db')
  244.             with game_file.open('rb') as open_file:
  245.                 game_contents = pickle.load(open_file)
  246.             for server_class in game_contents:
  247.                 file = game_dir.joinpath(server_class + '.txt')
  248.                 with file.open('w') as open_file:
  249.                     for key in value_types:
  250.                         if game_contents[server_class][key] is None:
  251.                             continue
  252.                         contents = set(game_contents[server_class][key])
  253.                         contents.difference_update(set(engine_contents.get(
  254.                             server_class, {}).get(key, list())))
  255.                         if not contents:
  256.                             continue
  257.                         open_file.write('{0}\n'.format(key))
  258.                         for value in sorted(contents):
  259.                             open_file.write('    {0}\n'.format(value))
  260.                 with file.open() as open_file:
  261.                     contents = open_file.read()
  262.                 if not len(contents):
  263.                     file.remove()
  264.             if not len(game_dir.files()):
  265.                 game_dir.rmdir()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement