def setShardData(self, data):
        dg = PyDatagram(data)
        di = PyDatagramIterator(dg)
        context = di.getUint8()

        while di.getRemainingSize():
            self._doUpdateShard(di)

        if context > 0:
            self.sendUpdateToChannel(self.air.getMsgSender(), "setShardDataRes", [context])
    def setShardData(self, data):
        dg = PyDatagram(data)
        di = PyDatagramIterator(dg)
        context = di.getUint8()

        while di.getRemainingSize():
            self._doUpdateShard(di)

        if context > 0:
            self.sendUpdateToChannel(self.air.getMsgSender(),
                                     "setShardDataRes", [context])
    def enterJudgeName(self):
        dg = PyDatagram(self.name)
        dgi = PyDatagramIterator(dg)
        isPattern, name = isNamePattern(dgi, self.csm.namePattern, self.dna.gender)
        
        if not name:
            self.demand('Kill', 'There\'s an issue with your name request!')
            return
        
        toonFields = {'WishNameState': ('PENDING',), 'WishName': (name,)}
        
        if isPattern:
            toonFields['WishNameState'] = ('',)
            toonFields['WishName'] = ('',)
            toonFields['setName'] = (name,)

        if self.avId:
            self.csm.air.dbInterface.updateObject(
                self.csm.air.dbId,
                self.avId,
                self.csm.air.dclassesByName['DistributedToonUD'],
                toonFields)

            self.csm.air.writeServerEvent('avatarWishname', self.avId, name)
            self.csm.accountDB.handlePostNameRequest(self.avId, name)

        self.csm.sendUpdateToAccountId(self.target, 'updateNameResp', [])
        self.demand('Off')
 def w(klass, data):
     if data:
         dg = PyDatagram(data)
         dgi = PyDatagramIterator(dg)
     
         def unpackPlant(_):
             return dgi.getUint32, dgi.getInt8(), dgi.getUint32(), dgi.getInt8(), dgi.getUint16()
         
         flowers = map(unpackPlant, range(10))
         trees = map(unpackPlant, range(8))
         st = dgi.getUint8()
         started = dgi.getBool()
         
     else:
         flowers = NULL_FLOWERS
         trees = NULL_TREES
         st = NULL_STATUARY
         started = 0
         
     return f(klass, started, flowers, trees, st)
Пример #5
0
    def w(klass, data):
        if data:
            dg = PyDatagram(data)
            dgi = PyDatagramIterator(dg)

            def unpackPlant(_):
                return dgi.getUint32, dgi.getInt8(), dgi.getUint32(
                ), dgi.getInt8(), dgi.getUint16()

            flowers = map(unpackPlant, range(10))
            trees = map(unpackPlant, range(8))
            st = dgi.getUint8()
            started = dgi.getBool()

        else:
            flowers = NULL_FLOWERS
            trees = NULL_TREES
            st = NULL_STATUARY
            started = 0

        return f(klass, started, flowers, trees, st)
Пример #6
0
 def processData(self, datagram):
     iterator = PyDatagramIterator(datagram)
     source = datagram.getConnection()
     callback = iterator.getString()
     getattr(globals()[callback], 'execute')(self, iterator, source)
Пример #7
0
	def processData(self, datagram):
		iterator = PyDatagramIterator(datagram)
		source = datagram.getConnection()
		callback = iterator.getString()
		getattr(globals()[callback], 'execute')(self, iterator)
Пример #8
0
    def processData(self, datagram):
        iterator = PyDatagramIterator(datagram)
        msgID = iterator.getUint8()
        if msgID == LOGIN_SUCCESS:
            self.loginwindow.commandanddestroy(self.partyListScreen)
        elif msgID == LOGIN_FAIL:
            print iterator.getString()
        elif msgID == PARTY_CREATED:
            party = json.loads(iterator.getString32())
            self.party = party
        elif msgID == MAP_LIST:
            maps = json.loads(iterator.getString())
            self.mapchooserwindow = GUI.MapChooser(maps, self.background.frame, self.createParty, self.partyListScreen)
        elif msgID == PARTY_LIST:
            parties = json.loads(iterator.getString32())
            self.partylistwindow = GUI.PartyListWindow(self.joinParty, self.mapChooserScreen)
            self.partylistwindow.refresh(parties)
            print 'Received the party list:'
            for k in parties.keys():
                print ' - ',k
        elif msgID == UPDATE_PARTY_LIST:
            parties = json.loads(iterator.getString32())
            self.partylistwindow.refresh(parties)
        elif msgID == PARTY_JOINED:
            party = json.loads(iterator.getString32())
            self.party = party
        elif msgID == PARTY_JOIN_FAIL:
            print iterator.getString()
            parties = json.loads(iterator.getString32())
            self.partylistwindow = GUI.PartyListWindow(self.joinParty, self.mapChooserScreen)
            self.partylistwindow.refresh(parties)
            print 'Received the party list:'
            for k in parties.keys():
                print ' - ',k
        elif msgID == START_BATTLE:
            self.party = json.loads(iterator.getString32())
            self.transitionframe = DirectFrame( frameSize = ( -2, 2, -2, 2 ) )
            self.transitionframe.setTransparency(True)
            seq = Sequence()
            seq.append(LerpColorInterval(self.transitionframe, 2, (0,0,0,1), startColor=(0,0,0,0)))
            seq.append(Func(self.background.frame.destroy))
            seq.append(Func(self.music.stop))
            seq.append(Func(self.battle_init))
            seq.start()
        elif msgID == PARTY_UPDATED:
            self.party['yourturn'] = iterator.getBool()
            self.party['chars'] = json.loads(iterator.getString32())
            self.party_updated()
        elif msgID == WALKABLES_LIST:
            charid = iterator.getString()
            walkables = json.loads(iterator.getString())
            if walkables:
                self.setPhase('gui')
                GUI.Help(
                    'move_help',
                    lambda: self.setupWalkableTileChooser(charid, walkables),
                    self.turn
                )
            else:
                #TODO: show message "no walkable tile"
                print "no walkable tile"
                self.turn()
        elif msgID == PASSIVE_WALKABLES_LIST:
            charid = iterator.getString()
            walkables = json.loads(iterator.getString())
            if walkables:
                self.clicked_snd.play()
                self.setupPassiveWalkableZone(walkables)
                self.subphase = 'passivewalkables'
            else:
                #TODO: show message "no walkable tile"
                print "no walkable tile"
                self.turn()
        elif msgID == PATH:
            charid = iterator.getString()
            orig = json.loads(iterator.getString())
            origdir = iterator.getUint8()
            dest = json.loads(iterator.getString())
            path = json.loads(iterator.getString())
            
            seq = Sequence()
            seq.append( Func(self.hideAT) )
            seq.append( Func(self.updateSpriteAnimation, charid, 'run') )
            seq.append( Func(self.clearZone) )
            seq.append( self.getCharacterMoveSequence(charid, path) )
            seq.append( Func(self.updateSpriteAnimation, charid) )
            seq.append( Func(self.moveCheck, charid, orig, origdir, dest) )
            seq.start()
        elif msgID == MOVED:
            charid = iterator.getString()
            x2 = iterator.getUint8()
            y2 = iterator.getUint8()
            z2 = iterator.getUint8()

            (x1, y1, z1) = self.getCharacterCoords(charid)
            del self.party['map']['tiles'][x1][y1][z1]['char']
            self.party['map']['tiles'][x2][y2][z2]['char'] = charid
            self.turn()
        elif msgID == MOVED_PASSIVE:
            charid = iterator.getString()
            walkables = json.loads(iterator.getString())
            path = json.loads(iterator.getString())

            self.setPhase('animation')
            (x1, y1, z1) = path[0]
            (x2, y2, z2) = path[-1]
            del self.party['map']['tiles'][x1][y1][z1]['char']
            self.party['map']['tiles'][x2][y2][z2]['char'] = charid
            seq = Sequence()
            seq.append( Func(self.setupPassiveWalkableZone, walkables) )
            seq.append( Wait(0.5) )
            seq.append( Func(self.updateCursorPos, (x2, y2, z2)) )
            seq.append( Wait(0.5) )
            seq.append( Func(self.hideAT) )
            seq.append( Func(self.updateSpriteAnimation, charid, 'run') )
            seq.append( Func(self.camhandler.move, self.logic2terrain((x2, y2, z2))) )
            seq.append( self.getCharacterMoveSequence(charid, path) )
            seq.append( Wait(0.5) )
            seq.append( Func(self.updateSpriteAnimation, charid) )
            seq.append( Func(self.clearZone) )
            seq.append( Func(self.showAT, self.sprites[charid]) )
            seq.append( Func(self.setPhase, 'listen') )
            seq.start()
        elif msgID == WAIT_SUCCESS:
            self.turn()
        elif msgID == WAIT_PASSIVE:
            charid = iterator.getString()
            direction = iterator.getUint8()
            
            self.setPhase('animation')
            seq = Sequence()
            seq.append( Func(self.hideAT) )
            seq.append( Wait(0.5) )
            seq.append( Func(self.sprites[charid].setRealDir, direction) )
            seq.append( Wait(0.5) )
            seq.append( Func(self.setPhase, 'listen') )
            seq.append( Func(self.turn) )
            seq.start()
        elif msgID == ATTACKABLES_LIST:
            charid = iterator.getString()
            attackables = json.loads(iterator.getString())

            self.setPhase('tile')
            self.subphase = 'attack'
            self.setupAttackableZone(charid, attackables)
            if self.charcard:
                self.charcard.hide()
        elif msgID == ATTACK_SUCCESS:
            charid = iterator.getString()
            targetid = iterator.getString()
            damages = iterator.getUint8()

            print damages
            target = self.party['chars'][targetid]
            target['hp'] = target['hp'] - damages
            if target['hp'] < 0:
                target['hp'] = 0

            seq = Sequence()
            seq.append( self.getCharacterAttackSequence(charid, targetid) )
            seq.append( Func(self.turn) )
            seq.start()
        elif msgID == ATTACK_PASSIVE:
            charid = iterator.getString()
            targetid = iterator.getString()
            damages = iterator.getUint8()
            attackables = json.loads(iterator.getString())

            print damages
            target = self.party['chars'][targetid]
            target['hp'] = target['hp'] - damages
            if target['hp'] < 0:
                target['hp'] = 0

            self.setPhase('animation')
            seq = Sequence()
            seq.append( Func(self.setupAttackableZone, charid, attackables) )
            seq.append( Wait(0.5) )
            seq.append( Func(self.updateCursorPos, self.getCharacterCoords(targetid)) )
            seq.append( Func(self.camhandler.move, self.logic2terrain(self.getCharacterCoords(targetid))) )
            seq.append( Wait(0.5) )
            seq.append( self.getCharacterAttackSequence(charid, targetid) )
            seq.append( Func(self.camhandler.move, self.logic2terrain(self.getCharacterCoords(charid))) )
            seq.append( Func(self.setPhase, 'listen') )
            seq.start()
        elif msgID == GAME_OVER:
            if self.charbars:
                self.charbars.hide()
            if self.charcard:
                self.charcard.hide()
            for i,charid in enumerate(self.sprites):
                if self.sprites[charid].animation == 'walk':
                    self.updateSpriteAnimation(charid, 'stand')
            self.music.stop()
            self.music = base.loader.loadSfx(GAME+'/music/33.ogg')
            self.music.play()
            GUI.GameOver(self.end)
        elif msgID == BATTLE_COMPLETE:
            if self.charbars:
                self.charbars.hide()
            if self.charcard:
                self.charcard.hide()
            if self.actionpreview:
                self.actionpreview.hide()
            for i,charid in enumerate(self.sprites):
                if self.sprites[charid].animation == 'walk':
                    self.updateSpriteAnimation(charid, 'stand')
            self.music.stop()
            self.music = base.loader.loadSfx(GAME+'/music/13.ogg')
            self.music.play()
            GUI.BrownOverlay(GUI.Congratulations, self.end)
    def enterCreateAvatar(self):
        dna = ToonDNA()
        dna.makeFromNetString(self.dna)
            
        dg = PyDatagram(self.name)
        dgi = PyDatagramIterator(dg)
        isPattern, name = isNamePattern(dgi, self.csm.namePattern, dna.gender)
        
        if not name:
            self.demand('Kill', 'There\'s an issue with your name request!')
            return
        
        if not isPattern:
            self.__pendingName = name
            colorstring = TTLocalizer.NumToColor[dna.headColor]
            animaltype = TTLocalizer.AnimalToSpecies[dna.getAnimal()]
            name = colorstring + ' ' + animaltype

        toonFields = {
            'setName': (name,),
            'WishNameState': ('PENDING' if not isPattern else '',),
            'WishName': (self.__pendingName,),
            'setDNAString': (self.dna,),
            'setDISLid': (self.target,)
        }
        
        if not self.tf and not self.hood:
            toonFields['setTutorialAck'] = (1,)
            toonFields['setQuests'] = ([163, 1000, 1000, 100, 3],)
            
        if self.hood:
            hqZones = []
            
            if self.hood == 1: # dd
                if not -1 in self.trackChoice:
                    self.demand('Kill', 'Invalid track choice for DD!')
                    return
                    
                jarsize = 50
                gaglimit = 25
                hoodId = 1000
                prevZones = [2000]
                questlimit = 2
                tier = 4
                hp = 25
                expm = 1500
                
            elif self.hood == 2: # dg
                if -1 in self.trackChoice:
                    self.demand('Kill', 'Invalid track choice for DG!')
                    return
                    
                jarsize = 60
                gaglimit = 30
                hoodId = 5000
                prevZones = [1000, 2000]
                questlimit = 2
                tier = 7
                hp = 34
                expm = 2300
                
            elif self.hood == 3 and config.GetBool('csp-want-mm', False): # mm (MIGHT BE DISABLED)
                if -1 in self.trackChoice:
                    self.demand('Kill', 'Invalid track choice for MM!')
                    return
                    
                jarsize = 80
                gaglimit = 35
                hoodId = 4000
                prevZones = [1000, 2000, 5000]
                questlimit = 3
                tier = 8
                hp = 43
                expm = 4000
                hqZones = [11000]
                toonFields['setCogParts'] = ((0, 0, 0, 1),)
                
            else:
                self.demand('Kill', 'Invalid hood!')
                return
                
            ta = [0, 0, 0, 0, 1, 1, 0]
            for t in self.trackChoice:
                if t != -1:
                    ta[t] = 1
                
            toonFields['setMaxMoney'] = (jarsize,)
            toonFields['setMaxCarry'] = (gaglimit,)
            toonFields['setTrackAccess'] = (ta,)
            toonFields['setDefaultZone'] = (hoodId,)
            toonFields['setHoodsVisited'] = (prevZones + hqZones + [hoodId],)
            toonFields['setZonesVisited'] = (prevZones + hqZones + [hoodId],)
            toonFields['setTeleportAccess'] = (prevZones,)
            toonFields['setQuestCarryLimit'] = (questlimit,)
            toonFields['setRewardHistory'] = (tier, [])
            toonFields['setHp'] = (hp,)
            toonFields['setMaxHp'] = (hp,)
            toonFields['setTutorialAck'] = (1,)
            
            e = Experience()
            e.makeExpRegular(expm)
            
            for i, t in enumerate(ta):
                if not t:
                    e.experience[i] = 0
                    
            toonFields['setExperience'] = (e.makeNetString(),)

        self.csm.air.dbInterface.createObject(
            self.csm.air.dbId,
            self.csm.air.dclassesByName['DistributedToonUD'],
            toonFields,
            self.__handleCreate)
Пример #10
0
    def processData(self, datagram):
        iterator = PyDatagramIterator(datagram)
        source = datagram.getConnection()
        msgID = iterator.getUint8()
        
        if msgID == LOGIN_MESSAGE:

            login = iterator.getString()
            password = iterator.getString()

            if login != password:
                myPyDatagram = PyDatagram()
                myPyDatagram.addUint8(LOGIN_FAIL)
                myPyDatagram.addString('Wrong credentials.')
                self.cWriter.send(myPyDatagram, source)
            elif self.sessions.has_key(source):
                myPyDatagram = PyDatagram()
                myPyDatagram.addUint8(LOGIN_FAIL)
                myPyDatagram.addString('Already logged in.')
                self.cWriter.send(myPyDatagram, source)
            elif login in self.players.keys():
                myPyDatagram = PyDatagram()
                myPyDatagram.addUint8(LOGIN_FAIL)
                myPyDatagram.addString('Username already in use.')
                self.cWriter.send(myPyDatagram, source)
            else:
                self.players[login] = source
                self.sessions[source] = {}
                self.sessions[source]['login'] = login
                print login, 'logged in.'
                myPyDatagram = PyDatagram()
                myPyDatagram.addUint8(LOGIN_SUCCESS)
                self.cWriter.send(myPyDatagram, source)
        
        elif msgID == CREATE_PARTY:

            name = iterator.getString()
            mapname = iterator.getString()
            
            party = {
                'name': name,
                'mapname': mapname,
                'map' : Map.load(mapname),
                'chars': {},
                'log': {},
                'creator': self.sessions[source]['login'],
                'players': [],
            }
            party['players'].append(self.sessions[source]['login'])

            self.parties[name] = party
            self.sessions[source]['party'] = name
            self.sessions[source]['player'] = len(party['players'])-1
            
            self.updateAllPartyLists()
            
            print self.sessions[source]['login'], "created the party", name, "using the map", mapname
            myPyDatagram = PyDatagram()
            myPyDatagram.addUint8(PARTY_CREATED)
            myPyDatagram.addString32(json.dumps(party))
            self.cWriter.send(myPyDatagram, source)

        elif msgID == GET_MAPS:
            self.playersinlobby.remove(source)

            mapnames = map( lambda m: m.split('.')[0], os.listdir(GAME+'/maps'))

            maps = []
            for mapname in mapnames:
                mp = Map.load(mapname)
                del mp['tiles']
                maps.append(mp)

            myPyDatagram = PyDatagram()
            myPyDatagram.addUint8(MAP_LIST)
            myPyDatagram.addString(json.dumps(maps))
            self.cWriter.send(myPyDatagram, source)
        
        elif msgID == GET_PARTIES:
            self.playersinlobby.append(source)

            parties = deepcopy(self.parties)
            for party in parties.values():
                del party['map']['tiles']

            myPyDatagram = PyDatagram()
            myPyDatagram.addUint8(PARTY_LIST)
            myPyDatagram.addString32(json.dumps(parties))
            self.cWriter.send(myPyDatagram, source)
        
        elif msgID == JOIN_PARTY:
        
            name = iterator.getString()
            party = self.parties[name]
            
            if len(party['players']) >= len(party['map']['chartiles']):
                parties = deepcopy(self.parties)
                for party in parties.values():
                    del party['map']['tiles']
                myPyDatagram = PyDatagram()
                myPyDatagram.addUint8(PARTY_JOIN_FAIL)
                myPyDatagram.addString('Party '+name+' is full.')
                myPyDatagram.addString32(json.dumps(parties))
                self.cWriter.send(myPyDatagram, source)
            else:
                party['players'].append(self.sessions[source]['login'])
                self.sessions[source]['party'] = name
                self.sessions[source]['player'] = len(party['players'])-1
                self.playersinlobby.remove(source)

                print self.sessions[source]['login'], "joined the party", name
                myPyDatagram = PyDatagram()
                myPyDatagram.addUint8(PARTY_JOINED)
                myPyDatagram.addString32(json.dumps(party))
                self.cWriter.send(myPyDatagram, source)
                
                for teamid,team in enumerate(party['map']['chartiles']):
                    for chartile in team:
                        x = int(chartile['x'])
                        y = int(chartile['y'])
                        z = int(chartile['z'])
                        direction = int(chartile['direction'])
                        charid = str(x)+str(y)+str(z)
                        party['map']['tiles'][x][y][z]['char'] = charid
                        party['chars'][charid] = Character.Random(charid, teamid, direction)
                
                if len(party['players']) == len(party['map']['chartiles']):
                    for player in party['players']:
                        myPyDatagram = PyDatagram()
                        myPyDatagram.addUint8(START_BATTLE)
                        myPyDatagram.addString32(json.dumps(party))
                        self.cWriter.send(myPyDatagram, self.players[player])

                self.updateAllPartyLists()

        elif msgID == UPDATE_PARTY:

            party = self.parties[self.sessions[source]['party']]
            chars = party['chars']
            
            aliveteams = {}
            for charid in chars.keys():
                if chars[charid]['hp'] > 0:
                    if aliveteams.has_key(chars[charid]['team']):
                        aliveteams[chars[charid]['team']] = aliveteams[chars[charid]['team']] + 1
                    else:
                        aliveteams[chars[charid]['team']] = 1
            if len(aliveteams) < 2:
                for client in party['players']:
                    if source == self.players[client]:
                        myPyDatagram = PyDatagram()
                        myPyDatagram.addUint8(BATTLE_COMPLETE)
                        self.cWriter.send(myPyDatagram, self.players[client])
                    else:
                        myPyDatagram = PyDatagram()
                        myPyDatagram.addUint8(GAME_OVER)
                        self.cWriter.send(myPyDatagram, self.players[client])
                del self.parties[self.sessions[source]['party']]
                self.updateAllPartyLists()
                return

            for charid in chars.keys():
                party['yourturn'] = int(chars[charid]['team']) == int(self.sessions[source]['player'])
                if chars[charid]['active']:
                    myPyDatagram = PyDatagram()
                    myPyDatagram.addUint8(PARTY_UPDATED)
                    myPyDatagram.addBool(party['yourturn'])
                    myPyDatagram.addString32(json.dumps(chars))
                    self.cWriter.send(myPyDatagram, source)
                    return
            
            while True:
                for charid in chars.keys():
                    char = chars[charid]
                    char['ct'] = char['ct'] + char['speed']
                    if char['ct'] >= 100:
                        if char['hp'] > 0:
                            char['active'] = True
                            char['canmove'] = True
                            char['canact'] = True
                            party['yourturn'] = int(chars[charid]['team']) == int(self.sessions[source]['player'])
                            myPyDatagram = PyDatagram()
                            myPyDatagram.addUint8(PARTY_UPDATED)
                            myPyDatagram.addBool(party['yourturn'])
                            myPyDatagram.addString32(json.dumps(chars))
                            self.cWriter.send(myPyDatagram, source)
                            return
                        else:
                            char['ct'] = 0

        elif msgID == GET_WALKABLES:
        
            charid = iterator.getString()
            party = self.parties[self.sessions[source]['party']]
            walkables = Move.GetWalkables( party, charid )
            
            myPyDatagram = PyDatagram()
            myPyDatagram.addUint8(WALKABLES_LIST)
            myPyDatagram.addString(charid)
            myPyDatagram.addString(json.dumps(walkables))
            self.cWriter.send(myPyDatagram, source)
        
        elif msgID == GET_PASSIVE_WALKABLES:
        
            charid = iterator.getString()
            party = self.parties[self.sessions[source]['party']]
            walkables = Move.GetWalkables( party, charid )
            
            myPyDatagram = PyDatagram()
            myPyDatagram.addUint8(PASSIVE_WALKABLES_LIST)
            myPyDatagram.addString(charid)
            myPyDatagram.addString(json.dumps(walkables))
            self.cWriter.send(myPyDatagram, source)
        
        elif msgID == GET_PATH:
        
            charid = iterator.getString()
            x2 = iterator.getUint8()
            y2 = iterator.getUint8()
            z2 = iterator.getUint8()
            
            party = self.parties[self.sessions[source]['party']]
            
            orig = Character.Coords( party, charid )
            x1 = orig[0]
            y1 = orig[1]
            z1 = orig[2]
            
            path = Move.GetPath( party, charid, x1, y1, z1, x2, y2, z2 )
            
            myPyDatagram = PyDatagram()
            myPyDatagram.addUint8(PATH)
            myPyDatagram.addString(charid)
            myPyDatagram.addString(json.dumps(orig))
            myPyDatagram.addUint8(party['chars'][charid]['direction'])
            myPyDatagram.addString(json.dumps((x2,y2,z2)))
            myPyDatagram.addString(json.dumps(path))
            self.cWriter.send(myPyDatagram, source)
        
        elif msgID == MOVE_TO:
            
            charid = iterator.getString()
            x2 = iterator.getUint8()
            y2 = iterator.getUint8()
            z2 = iterator.getUint8()
            
            party = self.parties[self.sessions[source]['party']]
            
            orig = Character.Coords( party, charid )
            x1 = orig[0]
            y1 = orig[1]
            z1 = orig[2]

            path = Move.GetPath( party, charid, x1, y1, z1, x2, y2, z2 )
            walkables = Move.GetWalkables( party, charid )

            del party['map']['tiles'][x1][y1][z1]['char']
            party['map']['tiles'][x2][y2][z2]['char'] = charid

            party['chars'][charid]['direction'] = Move.GetNewDirection( x1, y1, x2, y2 )
            party['chars'][charid]['canmove'] = False
            
            myPyDatagram = PyDatagram()
            myPyDatagram.addUint8(MOVED)
            myPyDatagram.addString(charid)
            myPyDatagram.addUint8(x2)
            myPyDatagram.addUint8(y2)
            myPyDatagram.addUint8(z2)
            self.cWriter.send(myPyDatagram, source)
            
            for playerid,playerlogin in enumerate(party['players']):
                if playerid != self.sessions[source]['player']:
                    myPyDatagram = PyDatagram()
                    myPyDatagram.addUint8(MOVED_PASSIVE)
                    myPyDatagram.addString(charid)
                    myPyDatagram.addString(json.dumps(walkables))
                    myPyDatagram.addString(json.dumps(path))
                    self.cWriter.send(myPyDatagram, self.players[playerlogin])

        elif msgID == WAIT:
        
            charid = iterator.getString()
            direction = iterator.getUint8()
            
            party = self.parties[self.sessions[source]['party']]
            char = party['chars'][charid]

            if char['canmove'] and char['canact']:
                char['ct'] = char['ct'] - 60
            elif char['canmove'] or char['canact']:
                char['ct'] = char['ct'] - 80
            else:
                char['ct'] = char['ct'] - 100

            char['direction'] = direction

            char['active'] = False
            char['canmove'] = False
            char['canact'] = False
            
            myPyDatagram = PyDatagram()
            myPyDatagram.addUint8(WAIT_SUCCESS)
            self.cWriter.send(myPyDatagram, source)

            for playerid,playerlogin in enumerate(party['players']):
                if playerid != self.sessions[source]['player']:
                    myPyDatagram = PyDatagram()
                    myPyDatagram.addUint8(WAIT_PASSIVE)
                    myPyDatagram.addString(charid)
                    myPyDatagram.addUint8(direction)
                    self.cWriter.send(myPyDatagram, self.players[playerlogin])

        elif msgID == GET_ATTACKABLES:
        
            charid = iterator.getString()
            
            party = self.parties[self.sessions[source]['party']]
            
            attackables = Attack.GetAttackables( party, charid )
            
            myPyDatagram = PyDatagram()
            myPyDatagram.addUint8(ATTACKABLES_LIST)
            myPyDatagram.addString(charid)
            myPyDatagram.addString(json.dumps(attackables))
            self.cWriter.send(myPyDatagram, source)

        elif msgID == ATTACK:
        
            charid1 = iterator.getString()
            charid2 = iterator.getString()
            party = self.parties[self.sessions[source]['party']]
            char1 = party['chars'][charid1]
            char2 = party['chars'][charid2]
            
            damages = char1['pa'] * char1['br'] / 100 * char1['pa']
            
            char2['hp'] = char2['hp'] - damages*4
            if char2['hp'] < 0:
                char2['hp'] = 0
            
            char1['canact'] = False
            
            myPyDatagram = PyDatagram()
            myPyDatagram.addUint8(ATTACK_SUCCESS)
            myPyDatagram.addString(charid1)
            myPyDatagram.addString(charid2)
            myPyDatagram.addUint8(damages)
            self.cWriter.send(myPyDatagram, source)
            
            attackables = Attack.GetAttackables( party, charid1 )
            
            for playerid,playerlogin in enumerate(party['players']):
                if playerid != self.sessions[source]['player']:
                    myPyDatagram = PyDatagram()
                    myPyDatagram.addUint8(ATTACK_PASSIVE)
                    myPyDatagram.addString(charid1)
                    myPyDatagram.addString(charid2)
                    myPyDatagram.addUint8(damages)
                    myPyDatagram.addString(json.dumps(attackables))
                    self.cWriter.send(myPyDatagram, self.players[playerlogin])