mirror of
https://port.numenaute.org/aleajactaest/clientbot.git
synced 2024-11-17 04:52:02 +00:00
262 lines
13 KiB
Python
262 lines
13 KiB
Python
#!/usr/bin/python3
|
|
# -*- coding: utf-8 -*-
|
|
#
|
|
# module BitStream
|
|
#
|
|
# Copyright (C) 2019 AleaJactaEst
|
|
#
|
|
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
import logging
|
|
#from ctypes import *
|
|
#import sys
|
|
#import inspect
|
|
#import copy
|
|
#import struct
|
|
#from tools import TPropIndex
|
|
from tools import Enum
|
|
#from tools import BitStream
|
|
from tools import CActionFactory
|
|
|
|
LOGGER='TVPNodeBase'
|
|
|
|
class TVPNodeBase():
|
|
|
|
def __init__(self, name=""):
|
|
# khanat-opennel-code/code/ryzom/client/src/network_connection.cpp:414
|
|
self.VPParent = None # TVPNodeBase
|
|
self.VPA = None # TVPNodeBase
|
|
self.VPB = None # TVPNodeBase
|
|
self.PropIndex = Enum.TPropIndex.NB_VISUAL_PROPERTIES
|
|
self.BranchHasPayload = False
|
|
self.Name = name
|
|
self.NameProperty = ""
|
|
|
|
def setNodePropIndex(self, property , name_property = ""):
|
|
self.PropIndex = property
|
|
self.NameProperty = name_property
|
|
|
|
def makeChildren(self):
|
|
self.VPA = TVPNodeBase(self.Name + '.VPA')
|
|
self.VPA.VPParent = self
|
|
self.VPB = TVPNodeBase(self.Name + '.VPB')
|
|
self.VPB.VPParent = self
|
|
|
|
def makeDescendants(self, nbLevels ):
|
|
self.makeChildren()
|
|
if nbLevels > 1:
|
|
self.VPA.makeDescendants( nbLevels-1 );
|
|
self.VPB.makeDescendants( nbLevels-1 );
|
|
|
|
def build_tree(self):
|
|
# khanat-opennel-code/code/ryzom/common/src/game_share/entity_types.h:458 uint buildTree()
|
|
self.makeChildren()
|
|
self.VPA.setNodePropIndex(Enum.TPropIndex.PROPERTY_POSITION, 'PROPERTY_POSITION')
|
|
self.VPB.makeChildren()
|
|
self.VPB.VPA.setNodePropIndex(Enum.TPropIndex.PROPERTY_ORIENTATION, 'PROPERTY_ORIENTATION')
|
|
self.VPB.VPB.makeDescendants( 3 ) # 8 leaves + those created by additional makeChildren()
|
|
self.VPB.VPB.VPA.VPA.VPA.setNodePropIndex( Enum.TPropIndex.PROPERTY_SHEET, 'PROPERTY_SHEET');
|
|
self.VPB.VPB.VPA.VPA.VPB.makeChildren();
|
|
self.VPB.VPB.VPA.VPA.VPB.VPA.setNodePropIndex( Enum.TPropIndex.PROPERTY_BEHAVIOUR, 'PROPERTY_BEHAVIOUR');
|
|
self.VPB.VPB.VPA.VPA.VPB.VPB.setNodePropIndex( Enum.TPropIndex.PROPERTY_OWNER_PEOPLE, 'PROPERTY_OWNER_PEOPLE');
|
|
self.VPB.VPB.VPA.VPB.VPA.makeChildren();
|
|
self.VPB.VPB.VPA.VPB.VPA.VPA.setNodePropIndex( Enum.TPropIndex.PROPERTY_NAME_STRING_ID, 'PROPERTY_NAME_STRING_ID');
|
|
self.VPB.VPB.VPA.VPB.VPA.VPB.setNodePropIndex( Enum.TPropIndex.PROPERTY_CONTEXTUAL, 'PROPERTY_CONTEXTUAL');
|
|
self.VPB.VPB.VPA.VPB.VPB.makeChildren();
|
|
self.VPB.VPB.VPA.VPB.VPB.VPA.setNodePropIndex( Enum.TPropIndex.PROPERTY_TARGET_LIST, 'PROPERTY_TARGET_LIST');
|
|
self.VPB.VPB.VPA.VPB.VPB.VPB.setNodePropIndex( Enum.TPropIndex.PROPERTY_TARGET_ID, 'PROPERTY_TARGET_ID');
|
|
self.VPB.VPB.VPB.VPA.VPA.makeChildren();
|
|
self.VPB.VPB.VPB.VPA.VPA.VPA.setNodePropIndex( Enum.TPropIndex.PROPERTY_MODE, 'PROPERTY_MODE');
|
|
self.VPB.VPB.VPB.VPA.VPA.VPB.setNodePropIndex( Enum.TPropIndex.PROPERTY_VPA, 'PROPERTY_VPA');
|
|
self.VPB.VPB.VPB.VPA.VPB.makeChildren();
|
|
self.VPB.VPB.VPB.VPA.VPB.VPA.setNodePropIndex( Enum.TPropIndex.PROPERTY_BARS, 'PROPERTY_BARS');
|
|
self.VPB.VPB.VPB.VPA.VPB.VPB.setNodePropIndex( Enum.TPropIndex.PROPERTY_VISUAL_FX, 'PROPERTY_VISUAL_FX');
|
|
self.VPB.VPB.VPB.VPB.VPA.makeChildren();
|
|
self.VPB.VPB.VPB.VPB.VPA.VPA.setNodePropIndex( Enum.TPropIndex.PROPERTY_VPB, 'PROPERTY_VPB');
|
|
self.VPB.VPB.VPB.VPB.VPA.VPB.makeChildren();
|
|
self.VPB.VPB.VPB.VPB.VPA.VPB.VPA.setNodePropIndex( Enum.TPropIndex.PROPERTY_VPC, 'PROPERTY_VPC');
|
|
self.VPB.VPB.VPB.VPB.VPA.VPB.VPB.makeChildren();
|
|
self.VPB.VPB.VPB.VPB.VPA.VPB.VPB.VPA.setNodePropIndex( Enum.TPropIndex.PROPERTY_EVENT_FACTION_ID, 'PROPERTY_EVENT_FACTION_ID');
|
|
self.VPB.VPB.VPB.VPB.VPA.VPB.VPB.VPB.makeChildren();
|
|
self.VPB.VPB.VPB.VPB.VPA.VPB.VPB.VPB.VPA.setNodePropIndex( Enum.TPropIndex.PROPERTY_PVP_MODE, 'PROPERTY_PVP_MODE');
|
|
self.VPB.VPB.VPB.VPB.VPA.VPB.VPB.VPB.VPB.setNodePropIndex( Enum.TPropIndex.PROPERTY_PVP_CLAN, 'PROPERTY_PVP_CLAN');
|
|
self.VPB.VPB.VPB.VPB.VPB.makeChildren();
|
|
self.VPB.VPB.VPB.VPB.VPB.VPA.makeChildren();
|
|
self.VPB.VPB.VPB.VPB.VPB.VPA.VPA.setNodePropIndex( Enum.TPropIndex.PROPERTY_ENTITY_MOUNTED_ID, 'PROPERTY_ENTITY_MOUNTED_ID');
|
|
self.VPB.VPB.VPB.VPB.VPB.VPA.VPB.setNodePropIndex( Enum.TPropIndex.PROPERTY_RIDER_ENTITY_ID, 'PROPERTY_RIDER_ENTITY_ID');
|
|
self.VPB.VPB.VPB.VPB.VPB.VPB.makeChildren();
|
|
self.VPB.VPB.VPB.VPB.VPB.VPB.VPA.setNodePropIndex( Enum.TPropIndex.PROPERTY_OUTPOST_INFOS, 'PROPERTY_OUTPOST_INFOS');
|
|
self.VPB.VPB.VPB.VPB.VPB.VPB.VPB.makeChildren();
|
|
self.VPB.VPB.VPB.VPB.VPB.VPB.VPB.VPA.setNodePropIndex( Enum.TPropIndex.PROPERTY_GUILD_SYMBOL, 'PROPERTY_GUILD_SYMBOL');
|
|
self.VPB.VPB.VPB.VPB.VPB.VPB.VPB.VPB.setNodePropIndex( Enum.TPropIndex.PROPERTY_GUILD_NAME_ID, 'PROPERTY_GUILD_NAME_ID');
|
|
|
|
# TVPNodeBase *getPOSITIONnode() { return VPA; }
|
|
# TVPNodeBase *getORIENTATIONnode() { return VPB->VPA; }
|
|
#
|
|
# // From the discrete root (mainroot->VPB->VPB)
|
|
# TVPNodeBase *getSHEETnode() { return VPA->VPA->VPA; }
|
|
# TVPNodeBase *getBEHAVIOURnode() { return VPA->VPA->VPB->VPA; }
|
|
# TVPNodeBase *getOWNER_PEOPLEnode() { return VPA->VPA->VPB->VPB; }
|
|
# TVPNodeBase *getNAME_STRING_IDnode() { return VPA->VPB->VPA->VPA; }
|
|
# TVPNodeBase *getCONTEXTUALnode() { return VPA->VPB->VPA->VPB; }
|
|
# TVPNodeBase *getTARGET_LISTnode() { return VPA->VPB->VPB->VPA; }
|
|
# TVPNodeBase *getTARGET_IDnode() { return VPA->VPB->VPB->VPB; }
|
|
# TVPNodeBase *getMODEnode() { return VPB->VPA->VPA->VPA; }
|
|
# TVPNodeBase *getVPAnode() { return VPB->VPA->VPA->VPB; }
|
|
# TVPNodeBase *getBARSnode() { return VPB->VPA->VPB->VPA; }
|
|
# TVPNodeBase *getVISUAL_FXnode() { return VPB->VPA->VPB->VPB; }
|
|
# TVPNodeBase *getVPBnode() { return VPB->VPB->VPA->VPA; }
|
|
# TVPNodeBase *getVPCnode() { return VPB->VPB->VPA->VPB->VPA; }
|
|
# TVPNodeBase *getEVENT_FACTION_IDnode() { return VPB->VPB->VPA->VPB->VPB->VPA; }
|
|
# TVPNodeBase *getPVP_MODEnode() { return VPB->VPB->VPA->VPB->VPB->VPB->VPA; }
|
|
# TVPNodeBase *getPVP_CLANnode() { return VPB->VPB->VPA->VPB->VPB->VPB->VPB; }
|
|
# TVPNodeBase *getENTITY_MOUNTED_IDnode() { return VPB->VPB->VPB->VPA->VPA; }
|
|
# TVPNodeBase *getRIDER_ENTITY_IDnode() { return VPB->VPB->VPB->VPA->VPB; }
|
|
# TVPNodeBase *getOUTPOST_INFOSnode() { return VPB->VPB->VPB->VPB->VPA; }
|
|
# TVPNodeBase *getGUILD_SYMBOLnode() { return VPB->VPB->VPB->VPB->VPB->VPA; }
|
|
# TVPNodeBase *getGUILD_NAME_IDnode() { return VPB->VPB->VPB->VPB->VPB->VPB; }
|
|
|
|
#uint buildTree()
|
|
# {
|
|
# makeChildren();
|
|
# setNodePropIndex( POSITION );
|
|
# VPB->makeChildren();
|
|
# setNodePropIndex( ORIENTATION );
|
|
#
|
|
# TVPNodeBase *discreetRoot = VPB->VPB;
|
|
# discreetRoot->makeDescendants( 3 ); // 8 leaves + those created by additional makeChildren()
|
|
# discreetRoot->setNodePropIndex( SHEET );
|
|
# discreetRoot->VPA->VPA->VPB->makeChildren();
|
|
# discreetRoot->setNodePropIndex( BEHAVIOUR );
|
|
# discreetRoot->setNodePropIndex( OWNER_PEOPLE );
|
|
# discreetRoot->VPA->VPB->VPA->makeChildren();
|
|
# discreetRoot->setNodePropIndex( NAME_STRING_ID );
|
|
# discreetRoot->setNodePropIndex( CONTEXTUAL );
|
|
# discreetRoot->VPA->VPB->VPB->makeChildren();
|
|
# discreetRoot->setNodePropIndex( TARGET_LIST );
|
|
# discreetRoot->setNodePropIndex( TARGET_ID );
|
|
# discreetRoot->VPB->VPA->VPA->makeChildren();
|
|
# discreetRoot->setNodePropIndex( MODE );
|
|
# discreetRoot->setNodePropIndex( VPA );
|
|
# discreetRoot->VPB->VPA->VPB->makeChildren();
|
|
# discreetRoot->setNodePropIndex( BARS );
|
|
# discreetRoot->setNodePropIndex( VISUAL_FX );
|
|
# discreetRoot->VPB->VPB->VPA->makeChildren();
|
|
# discreetRoot->setNodePropIndex( VPB );
|
|
# discreetRoot->VPB->VPB->VPA->VPB->makeChildren();
|
|
# discreetRoot->setNodePropIndex( VPC );
|
|
# discreetRoot->VPB->VPB->VPA->VPB->VPB->makeChildren();
|
|
# discreetRoot->setNodePropIndex( EVENT_FACTION_ID );
|
|
# discreetRoot->VPB->VPB->VPA->VPB->VPB->VPB->makeChildren();
|
|
# discreetRoot->setNodePropIndex( PVP_MODE );
|
|
# discreetRoot->setNodePropIndex( PVP_CLAN );
|
|
# discreetRoot->VPB->VPB->VPB->makeChildren();
|
|
# discreetRoot->VPB->VPB->VPB->VPA->makeChildren();
|
|
# discreetRoot->setNodePropIndex( ENTITY_MOUNTED_ID );
|
|
# discreetRoot->setNodePropIndex( RIDER_ENTITY_ID );
|
|
# discreetRoot->VPB->VPB->VPB->VPB->makeChildren();
|
|
# discreetRoot->setNodePropIndex( OUTPOST_INFOS );
|
|
# discreetRoot->VPB->VPB->VPB->VPB->VPB->makeChildren();
|
|
# discreetRoot->setNodePropIndex( GUILD_SYMBOL );
|
|
# discreetRoot->setNodePropIndex( GUILD_NAME_ID );
|
|
#
|
|
# return NB_VISUAL_PROPERTIES;
|
|
|
|
def isRoot(self):
|
|
# khanat-opennel-code/code/ryzom/common/src/game_share/entity_types.h:407 bool isRoot()
|
|
return self.VPParent == None
|
|
|
|
def isLeaf(self):
|
|
# khanat-opennel-code/code/ryzom/common/src/game_share/entity_types.h:410 bool isLeaf()
|
|
return self.PropIndex != Enum.TPropIndex.NB_VISUAL_PROPERTIES
|
|
|
|
def getLevel(self):
|
|
level = 0
|
|
node = self
|
|
while node != None:
|
|
level += 1
|
|
node = node.VPParent
|
|
return level
|
|
|
|
def decodeDiscreetProperty(self, msgin, propIndex, slot, world):
|
|
# khanat-opennel-code/code/ryzom/client/src/network_connection.cpp:1746 void CNetworkConnection::decodeDiscreetProperty
|
|
logging.getLogger(LOGGER).debug("decodeDiscreetProperty")
|
|
notices = {}
|
|
action = None
|
|
if propIndex == Enum.TPropIndex.PROPERTY_TARGET_LIST:
|
|
logging.getLogger(LOGGER).debug("PROPERTY_TARGET_LIST")
|
|
listSize = msgin.readUint8("listSize")
|
|
logging.getLogger(LOGGER).debug("listSize:{0}".format(listSize))
|
|
# TargetSlotsList.resize(listSize);
|
|
if listSize > 0:
|
|
for i in range(0, listSize):
|
|
d1 = msgin.readUint8( "TargetSlots_{0}".format(i));
|
|
logging.getLogger(LOGGER).debug("data:{0}".format(d1))
|
|
# Update property
|
|
return [], notices
|
|
|
|
logging.getLogger(LOGGER).debug("CActionFactory : {0}".format(slot))
|
|
action = CActionFactory.CActionFactory(world).createByPropIndex(slot, self.PropIndex, self.NameProperty)
|
|
action.set_header_notice("-")
|
|
logging.getLogger(LOGGER).debug("unpack: {0}".format(slot))
|
|
action.unpack(msgin)
|
|
if self.PropIndex == Enum.TPropIndex.PROPERTY_SHEET:
|
|
aliasBit = msgin.readBool("aliasBit")
|
|
logging.getLogger(LOGGER).debug("aliasBit:{0}".format(aliasBit))
|
|
if aliasBit:
|
|
alias = msgin.readUint32("alias");
|
|
logging.getLogger(LOGGER).debug("alias:{0}".format(alias))
|
|
elif self.PropIndex == Enum.TPropIndex.PROPERTY_MODE:
|
|
pass
|
|
else:
|
|
pass
|
|
logging.getLogger(LOGGER).debug("[decodeDiscreetProperty] (%s)" % (msgin.showAllData()))
|
|
for key in action.notice:
|
|
notices.setdefault(key[2:], action.notice[key])
|
|
return action, notices
|
|
|
|
|
|
def decodeDiscreetProperties(self, clientid, msgin, slot, world):
|
|
# khanat-opennel-code/code/ryzom/client/src/network_connection.h:148 void decodeDiscreetProperties
|
|
logging.getLogger(LOGGER).debug("decodeDiscreetProperties " + self.Name)
|
|
self.BranchHasPayload = msgin.readBool("BranchHasPayload [{0}, NameProperty:{1}]".format(self.Name, self.NameProperty))
|
|
actions = []
|
|
notices = {}
|
|
if self.BranchHasPayload:
|
|
if self.isLeaf():
|
|
# SlotContext.NetworkConnection->decodeDiscreetProperty( msgin, PropIndex );
|
|
logging.getLogger(LOGGER).debug("isLeaf")
|
|
action, addnotices = self.decodeDiscreetProperty(msgin, self.PropIndex, slot, world)
|
|
for key in addnotices:
|
|
notices.setdefault(key, addnotices[key])
|
|
if action:
|
|
actions.append(action)
|
|
else:
|
|
if self.VPA:
|
|
tmp, addnotices = self.VPA.decodeDiscreetProperties(clientid, msgin, slot, world)
|
|
for key in addnotices:
|
|
notices.setdefault(key, addnotices[key])
|
|
for action in tmp:
|
|
actions.append(action)
|
|
if self.VPB:
|
|
tmp, addnotices = self.VPB.decodeDiscreetProperties(clientid, msgin, slot, world)
|
|
for key in addnotices:
|
|
notices.setdefault(key, addnotices[key])
|
|
for action in tmp:
|
|
actions.append(action)
|
|
return actions, notices
|
|
|
|
|
|
def decodeDiscreetPropertiesVpbVpb(self, clientid, msgin, slot, world):
|
|
return self.VPB.VPB.decodeDiscreetProperties(clientid, msgin, slot, world)
|