class Round(): # Initialisation Function def __init__(self, showbase): # Initialise Window self.showbase = showbase # total time since start of game, to keep ticks updating on time (rather, not before) self.total_time = 0 # packets queue self.incoming = deque() # this is unnecessary lol but meh ill comment it anyway self.hp = OnscreenText(text="HP: " + str(100.0), pos=(0.95, -0.95), scale=0.07, fg=(1, 1, 1, 1), align=TextNode.ACenter, mayChange=1) # Keys array (down if 1, up if 0) self.keys = {"left": 0, "right": 0, "up": 0, "down": 0, "c": 0, "x": 0} self.skybox = Skybox(self.showbase) self.ch = CameraHandler() # maybe this shit too, or this can stay here and just pass in an array of spells self.showbase.spell_man = SpellManager( self.showbase.num_warlocks ) # until the Game() class is created in here which i think it should for i in self.showbase.spells: self.showbase.spell_man.add_spell(i) self.game = Game(self.showbase, game_tick) self.warlock = self.game.warlock[self.showbase.which] self.warlock.attach_ring(self.showbase) self.tick = 0 self.temp_tick = 0 # Set event handlers for keys self.showbase.accept("escape", sys.exit) # holding c will focus the camera on clients warlock self.showbase.accept("c", set_value, [self.keys, "c", 1]) self.showbase.accept("c-up", set_value, [self.keys, "c", 0]) # variable to track which spell has been requested self.current_spell = -1 # keys to change spell self.showbase.accept("q", self.set_spell, [0]) self.showbase.accept("w", self.set_spell, [1]) self.showbase.accept("e", self.set_spell, [2]) self.showbase.accept("r", self.set_spell, [3]) # mouse 1 is for casting the spell set by the keys self.showbase.accept("mouse1", self.cast_spell) # mouse 3 is for movement, or canceling keys for casting spell self.showbase.accept("mouse3", self.update_destination) # sets the camera up behind clients warlock looking down on it from angle follow = self.warlock.model self.ch.setTarget(follow.getPos().getX(), follow.getPos().getY(), follow.getPos().getZ()) self.ch.turnCameraAroundPoint(follow.getH(), 0) # Add the game loop procedure to the task manager. self.showbase.taskMgr.add(self.game_loop, "Game Loop") def set_spell(self, spell): self.current_spell = spell # sends spell request to server if one is selected def cast_spell(self): if not self.current_spell == -1: target = self.ch.get_mouse_3d() if not target.getZ() == -1: data = {} data[0] = "spell" data[1] = {} data[1][0] = self.current_spell data[1][1] = {} data[1][1][0] = target.getX() data[1][1][1] = target.getY() self.showbase.client.sendData(data) self.current_spell = -1 # sends destination request to server, or cancels spell if selected def update_destination(self): if self.current_spell == -1: destination = self.ch.get_mouse_3d() if not destination.getZ() == -1: data = {} data[0] = "destination" data[1] = {} data[1][0] = destination.getX() data[1][1] = destination.getY() self.showbase.client.sendData(data) else: self.current_spell = -1 def update_camera(self, dt): # sets the camMoveTask to be run every frame self.ch.camMoveTask(dt) # if c is down update camera to always be following on the warlock if self.keys["c"]: follow = self.warlock.model self.ch.setTarget(follow.getPos().getX(), follow.getPos().getY(), follow.getPos().getZ()) self.ch.turnCameraAroundPoint(0, 0) # Game Loop Procedure def game_loop(self, task): # update total time self.total_time += globalClock.getDt() # process any incoming network packets temp = self.showbase.client.getData() if temp != []: for i in range(len(temp)): # this part puts the next packets onto the end of the queue self.incoming.append(temp[i]) # while there is packets to process while list(self.incoming): valid_packet = False package = self.incoming.popleft() # if username is sent, assign to client if package[0] == 'tick': # not sure if this is the best way to do this but yea something to look into for syncing them all preround i guess if package[1] == 0: self.total_time = 0 # check what tick it should be self.temp_tick = package[1] # if this tick needs to be run (if frames are up to the server tick) if self.temp_tick * game_tick <= self.total_time: # run tick if not self.game.run_tick(): print 'Game Over' self.update_camera( game_tick ) # maybe this should be put outside of this loop and just updated from the globalClock.getDt() self.hp.setText( "HP: " + str(self.warlock.hp) ) # i think there should be a HUD class which will show all the info needed for the player (like hps,spells cds, etc) valid_packet = True else: # otherwise put packet back on front of list and end frame processing self.incoming.appendleft(package) break # i think it should check for 'tick' and if not tick then pass the rest of the packets to a packet handler (kind of makes it more modable i guess for changing the game to another like pudgewars or centipede or w/e) # so i guess these will be put into a packet manager (i think this idea you had before anyway :P) silly me! :D # well, just leave here for now i guess :P elif package[0] == 'update_dest': # if its an update packet then update destination of required warlock print "Update Destination: " + str(package[1]) + " " + str( package[2]) self.game.warlock[package[1]].set_destination( Vec3(package[2][0], package[2][1], 0)) valid_packet = True elif package[0] == 'update_spell': # if its an update packet then update destination of required warlock print "Update Spell: " + str(package[1]) + " " + str( package[2]) + " " + str(package[3]) self.game.warlock[package[1]].set_spell(package[2], package[3]) valid_packet = True # Return cont to run task again next frame return task.cont
class Round(): # Initialisation Function def __init__(self,showbase): # Initialise Window self.showbase=showbase # total time since start of game, to keep ticks updating on time (rather, not before) self.total_time = 0 # packets queue self.incoming=deque() # this is unnecessary lol but meh ill comment it anyway self.hp = OnscreenText(text = "HP: "+str(100.0), pos = (0.95,-0.95), scale = 0.07,fg=(1,1,1,1),align=TextNode.ACenter,mayChange=1) # Keys array (down if 1, up if 0) self.keys={"left":0,"right":0,"up":0,"down":0,"c":0,"x":0} self.skybox=Skybox(self.showbase) self.ch=CameraHandler() # maybe this shit too, or this can stay here and just pass in an array of spells self.showbase.spell_man=SpellManager(self.showbase.num_warlocks) # until the Game() class is created in here which i think it should for i in self.showbase.spells: self.showbase.spell_man.add_spell(i) self.game=Game(self.showbase,game_tick) self.warlock=self.game.warlock[self.showbase.which] self.warlock.attach_ring(self.showbase) self.tick=0 self.temp_tick=0 # Set event handlers for keys self.showbase.accept("escape",sys.exit) # holding c will focus the camera on clients warlock self.showbase.accept("c",set_value,[self.keys,"c",1]) self.showbase.accept("c-up",set_value,[self.keys,"c",0]) # variable to track which spell has been requested self.current_spell=-1 # keys to change spell self.showbase.accept("q",self.set_spell,[0]) self.showbase.accept("w",self.set_spell,[1]) self.showbase.accept("e",self.set_spell,[2]) self.showbase.accept("r",self.set_spell,[3]) # mouse 1 is for casting the spell set by the keys self.showbase.accept("mouse1",self.cast_spell) # mouse 3 is for movement, or canceling keys for casting spell self.showbase.accept("mouse3",self.update_destination) # sets the camera up behind clients warlock looking down on it from angle follow=self.warlock.model self.ch.setTarget(follow.getPos().getX(),follow.getPos().getY(),follow.getPos().getZ()) self.ch.turnCameraAroundPoint(follow.getH(),0) # Add the game loop procedure to the task manager. self.showbase.taskMgr.add(self.game_loop,"Game Loop") def set_spell(self,spell): self.current_spell=spell # sends spell request to server if one is selected def cast_spell(self): if not self.current_spell==-1: target=self.ch.get_mouse_3d() if not target.getZ()==-1: data = {} data[0] = "spell" data[1] = {} data[1][0] = self.current_spell data[1][1] = {} data[1][1][0] = target.getX() data[1][1][1] = target.getY() self.showbase.client.sendData(data) self.current_spell=-1 # sends destination request to server, or cancels spell if selected def update_destination(self): if self.current_spell==-1: destination=self.ch.get_mouse_3d() if not destination.getZ()==-1: data = {} data[0] = "destination" data[1] = {} data[1][0] = destination.getX() data[1][1] = destination.getY() self.showbase.client.sendData(data) else: self.current_spell=-1 def update_camera(self,dt): # sets the camMoveTask to be run every frame self.ch.camMoveTask(dt) # if c is down update camera to always be following on the warlock if self.keys["c"]: follow=self.warlock.model self.ch.setTarget(follow.getPos().getX(),follow.getPos().getY(),follow.getPos().getZ()) self.ch.turnCameraAroundPoint(0,0) # Game Loop Procedure def game_loop(self,task): # update total time self.total_time+=globalClock.getDt() # process any incoming network packets temp=self.showbase.client.getData() if temp!=[]: for i in range(len(temp)): # this part puts the next packets onto the end of the queue self.incoming.append(temp[i]) # while there is packets to process while list(self.incoming): valid_packet=False package=self.incoming.popleft() # if username is sent, assign to client if package[0]=='tick': # not sure if this is the best way to do this but yea something to look into for syncing them all preround i guess if package[1]==0: self.total_time=0 # check what tick it should be self.temp_tick=package[1] # if this tick needs to be run (if frames are up to the server tick) if self.temp_tick*game_tick<=self.total_time: # run tick if not self.game.run_tick(): print 'Game Over' self.update_camera(game_tick) # maybe this should be put outside of this loop and just updated from the globalClock.getDt() self.hp.setText("HP: "+str(self.warlock.hp)) # i think there should be a HUD class which will show all the info needed for the player (like hps,spells cds, etc) valid_packet=True else: # otherwise put packet back on front of list and end frame processing self.incoming.appendleft(package) break # i think it should check for 'tick' and if not tick then pass the rest of the packets to a packet handler (kind of makes it more modable i guess for changing the game to another like pudgewars or centipede or w/e) # so i guess these will be put into a packet manager (i think this idea you had before anyway :P) silly me! :D # well, just leave here for now i guess :P elif package[0]=='update_dest': # if its an update packet then update destination of required warlock print "Update Destination: "+str(package[1])+" "+str(package[2]) self.game.warlock[package[1]].set_destination(Vec3(package[2][0],package[2][1],0)) valid_packet=True elif package[0]=='update_spell': # if its an update packet then update destination of required warlock print "Update Spell: "+str(package[1])+" "+str(package[2])+" "+str(package[3]) self.game.warlock[package[1]].set_spell(package[2],package[3]) valid_packet=True # Return cont to run task again next frame return task.cont
class Playstate(): # Initialisation Function def __init__(self,showbase): # Initialise Window self.showbase=showbase # total time since start of game, to keep ticks updating on time (rather, not before) self.total_time = 0 # packets queue self.incoming=deque() # this is unnecessary lol but meh ill comment it anyway self.hp = OnscreenText(text = "HP: "+str(100.0), pos = (0.95,-0.95), scale = 0.07,fg=(1,1,1,1),align=TextNode.ACenter,mayChange=1) # Keys array (down if 1, up if 0) self.keys={"left":0,"right":0,"up":0,"down":0,"c":0,"x":0} self.skybox=Skybox(self.showbase) self.ch=CameraHandler() self.game=Game(self.showbase.num_warlocks,game_tick,self.showbase) self.warlock=self.game.warlock[self.showbase.which] self.warlock.attach_ring(self.showbase) self.tick=0 self.temp_tick=0 # Set event handlers for keys self.showbase.accept("escape",sys.exit) # holding c will focus the camera on clients warlock self.showbase.accept("c",set_value,[self.keys,"c",1]) self.showbase.accept("c-up",set_value,[self.keys,"c",0]) # variable to track which spell has been requested self.current_spell=0 # keys to change spell self.showbase.accept("q",self.set_spell,[1]) self.showbase.accept("w",self.set_spell,[2]) self.showbase.accept("e",self.set_spell,[3]) self.showbase.accept("r",self.set_spell,[4]) # mouse 1 is for casting the spell set by the keys self.showbase.accept("mouse1",self.cast_spell) # mouse 3 is for movement, or canceling keys for casting spell self.showbase.accept("mouse3",self.update_destination) # Create a method to read key-status and then do. on server side. # Should add a key here for the spell.. . # x is for spell test. self.showbase.accept("x",set_value,[self.keys,"spell1", 1]) self.showbase.accept("x-up",set_value,[self.keys,"spell1", 0]) #self.showbase.accept("a",self.warlock.add_spell_vel,[Vec3(20,0,0)]) #self.showbase.accept("d",self.warlock.add_spell_vel,[Vec3(-20,0,0)]) #self.showbase.accept("w",self.warlock.add_spell_vel,[Vec3(0,-20,0)]) #self.showbase.accept("s",self.warlock.add_spell_vel,[Vec3(0,20,0)]) #self.showbase.accept("+",self.warlock.add_damage,[1]) #self.showbase.accept("-",self.warlock.add_damage,[-1]) # sets the camera up behind clients warlock looking down on it from angle follow=self.warlock self.ch.setTarget(follow.getPos().getX(),follow.getPos().getY(),follow.getPos().getZ()) self.ch.turnCameraAroundPoint(follow.getH(),0) # Add the game loop procedure to the task manager. self.showbase.taskMgr.add(self.game_loop,"Game Loop") def set_spell(self,spell): self.current_spell=spell # sends spell request to server if one is selected def cast_spell(self): if not self.current_spell==0: target=self.ch.get_mouse_3d() if not target.getZ()==-1: data = {} data[0] = "spell" data[1] = {} data[1][0] = self.current_spell data[1][1] = {} data[1][1][0] = target.getX() data[1][1][1] = target.getY() self.showbase.client.sendData(data) self.current_spell=0 # sends destination request to server, or cancels spell if selected def update_destination(self): print "update_destination "+str(self.current_spell) if self.current_spell==0: destination=self.ch.get_mouse_3d() if not destination.getZ()==-1: data = {} data[0] = "destination" data[1] = {} data[1][0] = destination.getX() data[1][1] = destination.getY() self.showbase.client.sendData(data) else: self.current_spell=0 def update_camera(self,dt): # sets the camMoveTask to be run every frame self.ch.camMoveTask(dt) # if c is down update camera to always be following on the warlock if self.keys["c"]: follow=self.warlock self.ch.setTarget(follow.getPos().getX(),follow.getPos().getY(),follow.getPos().getZ()) self.ch.turnCameraAroundPoint(0,0) # Game Loop Procedure def game_loop(self,task): # update total time self.total_time+=globalClock.getDt() # process any incoming network packets temp=self.showbase.client.getData() if temp!=[]: for i in range(len(temp)): # this part puts the next packets onto the end of the queue self.incoming.append(temp[i]) # while there is packets to process while list(self.incoming): valid_packet=False package=self.incoming.popleft() # if username is sent, assign to client if package[0]=='tick': if package[1]==0: self.total_time=0 # check what tick it should be self.temp_tick=package[1] # if this tick needs to be run (if frames are up to the server tick) if self.temp_tick*game_tick<=self.total_time: # run tick self.game.run_tick() self.update_camera(game_tick) self.hp.setText("HP: "+str(self.warlock.hp)) #self.tick+=1 valid_packet=True else: #print "temp: "+str(self.temp_tick*game_tick) #print "total:"+str(self.total_time) # otherwise put packet back on front of list and end frame processing self.incoming.appendleft(package) break elif package[0]=='update_dest': # if its an update packet then update destination of required warlock print "Update Destination: "+str(package[1])+" "+str(package[2]) self.game.warlock[package[1]].set_destination(Vec3(package[2][0],package[2][1],0)) valid_packet=True elif package[0]=='update_spell': # if its an update packet then update destination of required warlock print "Update Spell: "+str(package[1])+" "+str(package[2])+" "+str(package[3]) self.game.warlock[package[1]].set_spell(package[2],package[3]) valid_packet=True if not valid_packet: data = {} data[0] = "error" data[1] = "Fail Server" self.game.client.sendData(data) print "Bad packet from server" print "Received: " + str(package) # Return cont to run task again next frame return task.cont