This commit is contained in:
aozhiwei 2021-11-11 14:09:00 +08:00
parent 8154244110
commit 2e3b720eb5
2 changed files with 196 additions and 5 deletions

View File

@ -1,19 +1,51 @@
import time
import datetime
import traceback
import cs_proto_pb2
import cs_msgid_pb2
kPropHp = 1
kPropMaxHp = 2
kPropInventory = 3
kPropSkillLeftTime_ = 4
kPropSkillCd = 5
kPropTankBulletNum = 6
kPropTankOil = 7
kPropBulletNum = 8
kPropItem = 9
kPropWeaponAmmo = 10
kPropCar = 11
kPropZombieId = 23
kPropSkillLeftTime = 24
kPropSkillCurrTimes = 25
kPropSkillMaxTimes = 26
kPropCarOil = 27
kPropFollowTarget = 30
kPropDive = 31
class Simulate(object):
def __init__(self, joined_msg, mapinfo_msg):
self._joined_msg = joined_msg
self._mapinfo_msg = mapinfo_msg
self._curr_player = None
self._curr_player = {
'obj_uniid': 0,
'action_type': 0,
'action_duration': 0,
'action_frameno': 0,
'items': [],
'inventory': [],
'cur_weapon_idx': 0,
'weapons': [],
'skill_list': []
}
self._frames = []
self._curr_frameno = 0
self._objHash = []
self._objHash = {}
def addFrame(self, frame):
self._frames.append(frame)
@ -24,8 +56,164 @@ class Simulate(object):
self._updateFrame(self._frames[i])
i += 1
self._frames = []
self._cmmove()
def _cmmove(self):
pass
def _updateFrame(self, frame):
self._curr_frameno = frame.frameno
for obj in frame.full_objects:
self._objHash[obj['union_obj_' + obj.object_type]] = obj
for newobj in frame.full_objects:
obj = self._getRealFullObj(newobj)
if newobj.object_flags == 0:
self._objHash[obj.obj_uniid] = obj
else:
pass
for partobj in frame.part_objects:
self._updatePartObj(self._getRealPartObj(partobj))
self._updateActivePlayerData(frame)
for objid in frame.out_objids:
del self._objHash[objid]
for objid in frame.del_objids:
del self._objHash[objid]
self._chgedBuffList(frame)
self._chgedPropList(frame)
def _getRealFullObj(self, newobj):
if newobj.object_type == 1:
return newobj.union_obj_1
elif newobj.object_type == 2:
return newobj.union_obj_2
elif newobj.object_type == 3:
return newobj.union_obj_3
elif newobj.object_type == 4:
return newobj.union_obj_4
elif newobj.object_type == 5:
return newobj.union_obj_5
elif newobj.object_type == 6:
return newobj.union_obj_6
elif newobj.object_type == 7:
return newobj.union_obj_7
elif newobj.object_type == 8:
return newobj.union_obj_8
elif newobj.object_type == 9:
return newobj.union_obj_9
elif newobj.object_type == 10:
return newobj.union_obj_10
elif newobj.object_type == 11:
return newobj.union_obj_11
else:
return None
def _getRealPartObj(self, partobj):
if partobj.object_type == 1:
return partobj.union_obj_1
elif partobj.object_type == 2:
return partobj.union_obj_2
elif partobj.object_type == 3:
return partobj.union_obj_3
elif partobj.object_type == 4:
return partobj.union_obj_4
elif partobj.object_type == 5:
return partobj.union_obj_5
elif partobj.object_type == 6:
return partobj.union_obj_6
elif partobj.object_type == 7:
return partobj.union_obj_7
elif partobj.object_type == 8:
return partobj.union_obj_8
elif partobj.object_type == 9:
return partobj.union_obj_9
elif partobj.object_type == 10:
return partobj.union_obj_10
elif partobj.object_type == 11:
return partobj.union_obj_11
else:
return None
def _updatePartObj(self, obj):
entity = self._objHash[obj.obj_uniid]
entity.pos = obj.pos
entity.dir = obj.dir
def _updateActivePlayerData(self, frame):
active_player = self._objHash[frame.active_player_id]
self._curr_player['obj_uniid'] = frame.active_player_id
self._curr_player['action_type'] = frame.action_type
self._curr_player['action_duration'] = frame.action_duration
self._curr_player['action_frameno'] = frame.action_frameno
self._curr_player['items'] = frame.items
self._curr_player['inventory'] = frame.inventory
self._curr_player['cur_weapon_idx'] = frame.cur_weapon_idx
self._curr_player['weapons'] = frame.weapons
self._curr_player['skill_list'] = frame.skill_list
def _chgedBuffList(self, frame):
for chged_buff in frame.chged_buff_list:
entity = self._objHash[chged_buff.obj_id]
if entity:
if chged_buff.chg == 0:
self._entityUpdateBuff(entity, chged_buff.buff)
elif chged_buff.chg == 1:
self._entityRemoveBuff(entity, chged_buff.buff)
def _chgedPropList(self, frame):
for chged_prop in frame.chged_property_list:
entity = self._objHash[chged_prop.obj_id]
if entity:
self.applyChgedProp(entity, chged_prop)
def _entityUpdateBuff(self, entity, pb_buff):
buff = self.getBuffByUniId(self, entity, pb_buff.buff_uniid)
if buff:
entity.buff_list.erase(buff)
entity.buff_list.append(pb_buff)
def _entityRemoveBuff(self, entity, pb_buff):
buff = self.getBuffByUniId(self, entity, pb_buff.buff_uniid)
if buff:
entity.buff_list.erase(buff)
def getBuffByUniId(self, entity, buff_uniid):
for buff in entity.buff_list:
if buff.buff_uniid == buff_uniid:
return buff
return None
def applyChgedProp(self, e, prop):
if prop.property_type == kPropHp:
e.health = prop.value
elif prop.property_type == kPropMaxHp:
e.max_health = prop.value
elif prop.property_type == kPropInventory:
self._curr_player['inventory'][prop.property_subtype] = prop.value
elif prop.property_type == kPropSkillLeftTime_:
pass
elif prop.property_type == kPropSkillCd:
pass
elif prop.property_type == kPropTankBulletNum:
pass
elif prop.property_type == kPropTankOil:
pass
elif prop.property_type == kPropBulletNum:
pass
elif prop.property_type == kPropItem:
pass
elif prop.property_type == kPropWeaponAmmo:
pass
elif prop.property_type == kPropCar:
pass
elif prop.property_type == kPropZombieId:
pass
elif prop.property_type == kPropSkillLeftTime:
pass
elif prop.property_type == kPropSkillCurrTimes:
pass
elif prop.property_type == kPropSkillMaxTimes:
pass
elif prop.property_type == kPropCarOil:
pass
elif prop.property_type == kPropFollowTarget:
pass
elif prop.property_type == kPropDive:
pass

View File

@ -1,5 +1,7 @@
import time
import datetime
import sys
import traceback
from tornado import gen
from tornado import httpclient
@ -129,7 +131,8 @@ class VirtualClient(object):
self._simulate.update()
yield None
except Exception as e:
print('co_updateSimulate', e)
exc_type, exc_value, exc_obj = sys.exc_info()
traceback.print_tb(exc_obj, exc_type, exc_value)
@gen.coroutine
def run(self):