def __init__( self, world ): self.entities = [ world ] world.state().entity_id = 10000 self.clients = [] self.conn_no = 0 self.server = Server( 0.1, self.new_connection, self.new_entity ) self.server.run()
class ServerEntitySystem: def __init__( self, world ): self.entities = [ world ] world.state().entity_id = 10000 self.clients = [] self.conn_no = 0 self.server = Server( 0.1, self.new_connection, self.new_entity ) self.server.run() def new_connection( self, client ): print "Newconn" self.clients.append( client ) pos, angles = (0., 1., 0.), (0., 0., 0.) new_char = Character( pos, angles ) new_player = Player( new_char, None ) new_weapon = TestWeapon( TestProjectile ) new_char.equip( new_weapon ) client.network_id = 2*self.conn_no new_char.state().entity_id = 2*self.conn_no new_player.state().entity_id = 2*self.conn_no + 1 self.conn_no += 1 print "Newconn!" return new_player.state() def new_entity( self, ent ): l = struct.pack( "!H", len( ent.__class__.__name__ ) ) type_id = ent.__class__.__name__ print "new ent", type_id return l + type_id + ent.serialize() def append( self, ent ): self.entities.append( ent ) def draw( self ): for i in filter( lambda x: x.drawable, self.entities ): i.draw() batchable = list( filter( lambda x: x.batchable, self.entities ) ) batches = defaultdict( list ) for b in batchable: batches[ b.__class__ ].append( b ) for b in batches.values(): Batch( b, False ).draw() def update( self, dt ): self.output_entities = \ filter( lambda x: x.server_sendable, self.entities ) for e in self.output_entities: self.server.update( e.state() ) for i in filter( lambda x: x.updatable, self.entities ): i.update( dt ) colls = list( filter( lambda x: x.collidable, self.entities ) ) for i, e in enumerate( colls[:] ): for o in colls[:][i+1:]: self.collide( e, o ) def collide( self, e1, e2 ): cg1 = e1.collision_geometry() cg2 = e2.collision_geometry() coll = cg1.collide( cg2 ) if coll.collided: e1.resolve( e2, coll )