Question about posInterval, they seem to be what I need for my networking lag but when I use them they seem to be either to slow or to fast, is there any math I could do to help make them run smoother?
Also, i’m using dictionaries to help gather ip and then take the ip name and set up a cube to them so when and only that player moves, it only updates their pos and not someone elses by mistake, but I think i’m doing that wrong too?
Really i’m just having a mess of problems with my code that I cant seem to fixs =/ x.x;
- network seems to be to slow
- even the delete when offline doesnt work lol.
- dictionaring seems to be mess up, taking the wrong ip
- chat wont go away once started
- I know its mess up but I dont know how to do it either, I have it so when you click on one of the other players cube, it makes their program wait 20s then respawns them again,but I cant seem to get their cube ip to know who to send that data to.
#(1,2,3) 1:leftright,2:forwardbackwords,3:updown
import direct.directbase.DirectStart #Initialize Panda and create a window
import random, sys, os, math, time, threading, socket #libs
from direct.gui.OnscreenText import OnscreenText
from direct.gui.OnscreenImage import OnscreenImage
from direct.gui.DirectGui import *
from direct.task.Task import Task #Task run
from pandac.PandaModules import Fog
from pandac.PandaModules import *
from pandac.PandaModules import WindowProperties
from pandac.PandaModules import Shader
from pandac.PandaModules import Point3,Vec4
from pandac.PandaModules import NodePath
from pandac.PandaModules import CollisionTraverser,CollisionNode
from pandac.PandaModules import CollisionHandlerQueue,CollisionRay
from direct.showbase.DirectObject import DirectObject
#-----------------------------------------------------
class World(DirectObject):
def __init__(self):
self.zone = "town"
#self.ip = raw_input()
self.loadzone()
self.camera()
self.Collisions()
self.Controls()
self.connect()
self.Chat()
self.thread = threading.Thread(target=self.askfor)
self.thread.isDaemon()
self.thread.start()
######################### Key movement ########################################
def Controls(self):
self.keyMap = {"left":0, "right":0, "forward":0, "back":0, "shoot":0, "chat":0, "fps":0, "fullscreen":0}
# Accept the control keys for movement
self.accept("escape", sys.exit)
self.accept("a", self.setKey, ["left",1])
self.accept("d", self.setKey, ["right",1])
self.accept("w", self.setKey, ["forward",1])
self.accept("s", self.setKey, ["back",1])
self.accept("mouse1", self.setKey, ["shoot",1])
self.accept("enter", self.setKey, ["chat",1])
self.accept("`", self.setKey, ["fps",1])
self.accept("+", self.setKey, ["fullscreen",1])
self.accept("a-up", self.setKey, ["left",0])
self.accept("d-up", self.setKey, ["right",0])
self.accept("w-up", self.setKey, ["forward",0])
self.accept("s-up", self.setKey, ["back",0])
self.accept("mouse1-up", self.setKey, ["shoot",0])
self.accept("enter-up", self.setKey, ["chat",0])
self.accept("`-up", self.setKey, ["fps",0])
self.accept("+-up", self.setKey, ["fullscreen",0])
taskMgr.add(self.move,"moveTask")
taskMgr.doMethodLater(.25,self.sendfor,"sendforTask")
###############################################################################
#Game state variables
self.prevtime = 0
self.runforward = 0
self.runback = 0
self.FrameRateMeter = 0
self.jump = 0
self.full = 1
self.userlist = {}
self.tempmove = ""
self.temptime = 0
self.tempplayers = 1
self.tempchatonoff = 0
self.chatlistnumber = 0
self.tempZ = 0
self.gravitytime = 0
###############################################################################
#connects to my server
def connect(self):
self.client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
self.client.connect (("75.40.15.251", 5000))
self.Name = "Mradr"
self.Password = "123"
self.send="namepass"+" "+self.Name+" "+self.Password
self.client.send(self.send)
self.selfip = socket.gethostbyname(socket.gethostname())
self.userlist[socket.gethostname()] = 1
###############################################################################
#takes what it gets from the server, reads, then see if it can do anything from what it gets
def askfor(self):
while 1:
if self.client.recv(1024) != "":
self.read = self.client.recv(1024)
self.data = self.read.strip().split(" ")[-5:]
if not self.data[1] in self.userlist:
self.otherperson = (self.tempplayers + 1)
self.userlist[self.data[1]] = self.otherperson
self.userlist[self.otherperson] = loader.loadModel("towns/cube")
self.userlist[self.otherperson].reparentTo(render)
self.userlist[self.otherperson].setScale(0.015,0.015,0.015)
self.userlist[self.otherperson].setPos(0,0,40)
self.userlist[self.otherperson].setTag('myObjectTag', str(self.tempplayers + 1))
self.data = ""
print self.userlist
elif "isoffline" == self.data[3]:
del self.userlist[self.data[1]]
elif "MyPos" == self.data[0]:
self.userlist[self.otherperson].posInterval(.4,Point3(float(self.data[2]),float(self.data[3]),float(self.data[4])),fluid=1).start()
elif "Shoot" == self.data[2]:
if self.data[3] == self.selfip:
time.sleep(30)
base.camera.setPos(0,20,10)
else:
self.readtext = TextNode('read')
self.data = self.client.recv(1024)
self.readtext.setText(self.data)
self.readtextNodePath = aspect2d.attachNewNode(self.readtext)
self.readtextNodePath.setScale(0.06)
self.data = self.readtextNodePath
self.myScrolledList.addItem(self.readtextNodePath)
self.self.chatlistnumber = self.chatlistnumber + 1
self.myScrolledList.scrollTo(self.chatlistnumber)
###############################################################################
#sends pos of the camera
def sendfor(self, task):
if base.camera.getPos() != self.tempmove:
self.youX = base.camera.getX()
self.youY = base.camera.getY()
self.youZ = base.camera.getZ()
self.send = (" " + "MyPos" + " " + "(%s," + " " + str(self.youX) + " " + str(self.youY) + " " + str(self.youZ) + "\n") % self.selfip
self.client.send(self.send)
self.tempmove = base.camera.getPos()
return task.again
###############################################################################
#loads the zone and a fack cube for testing
def loadzone(self):
#Load the first environment model town.egg
self.environ = loader.loadModel("towns/a1")
self.environ.setTwoSided(True)
self.usertoon = loader.loadModel("towns/cube")
self.environ.reparentTo(render)
self.usertoon.reparentTo(render)
self.environ.setScale(0.015,0.015,0.015)
self.environ.setPos(0,0,0)
self.usertoon.setScale(0.015,0.015,0.015)
self.usertoon.setPos(0,20,10)
self.usertoon.setTag('myObjectTag', "1")
###############################################################################
#setup camera from the/that map
def camera(self):
base.disableMouse()
if self.zone == self.zone:
base.camLens.setFar(7000)
#base.camera.setP(base.camera, + 90)
#self.myFog = Fog("Fog Name")
#self.myFog.setColor(167,162,154)
#self.myFog.setExpDensity(.0001)
#render.setFog(self.myFog)
base.setBackgroundColor(0,0,0) #167,162,154
elif self.zone == "towns/controlroom":
base.camera.setPos(0,0,115)
base.camLens.setFar(2000)
self.infoText['text']='Control Room'
base.setBackgroundColor(0,0,0)
elif self.zone == "towns/dg1":
base.camera.setPos(0,0,115)
base.camLens.setFar(5000)
self.infoText['text']='Dg1'
self.myFog = Fog("Fog Name")
self.myFog.setColor(167,162,154)
self.myFog.setExpDensity(.001)
render.setFog(self.myFog)
base.setBackgroundColor(167,162,154)
###############################################################################
#collision
def Collisions(self):
base.cTrav = CollisionTraverser()
base.pusher = CollisionHandlerPusher()
base.pusher.setHorizontal(False)
base.handler = CollisionHandlerQueue()
cnodePath = base.camera.attachNewNode(CollisionNode('camera'))
cnodePath.node().addSolid(CollisionSphere(0, 0, 0, 2))
cnodePath.node().setIntoCollideMask(BitMask32.allOff())
base.pusher.addCollider(cnodePath,base.camera,base.drive.node())
base.cTrav.addCollider(cnodePath,base.pusher)
cnodePath2 = self.usertoon.attachNewNode(CollisionNode('cube'))
cnodePath2.node().addSolid(CollisionSphere(0, 0, 0, 2))
base.pusher.addCollider(cnodePath2,self.usertoon,base.drive.node())
base.cTrav.addCollider(cnodePath2,base.pusher)
self.pickerNode=CollisionNode('mouseRay')
self.pickerNP=base.camera.attachNewNode(self.pickerNode)
self.pickerNode.setFromCollideMask(BitMask32.bit(0))
self.pickerNode.setIntoCollideMask(BitMask32.allOff())
self.pickerRay=CollisionRay()
self.pickerNode.addSolid(self.pickerRay)
base.cTrav.addCollider(self.pickerNP, base.handler)
###############################################################################
#setup chat screen then hide it cus we dont need to see it at 1st
def Chat(self):
self.Textenter = DirectEntry(pos=(-1.32,0,-.96),scale=.08,width=25,text_scale=(.8,.8),rolloverSound=0,clickSound=0,cursorKeys=1,focus=1,command=self.sendchatdata)
self.myScrolledList = DirectScrolledList(
decButton_pos= (.57, 0, -0.6),decButton_text = "/\\",decButton_text_scale = 0.08,decButton_borderWidth = (0.005, 0.005),
incButton_pos= (.57, 0, -0.7),incButton_text = "\/",incButton_text_scale = 0.08,incButton_borderWidth = (0.005, 0.005),
numItemsVisible = 5,forceHeight = .11,itemFrame_frameSize = (-0.06, 1.8, -.5, 0.08),itemFrame_pos = (-1.27, 0, -.35))
self.Textenter.hide()
self.myScrolledList.hide()
###############################################################################
#sends chat data
def sendchatdata(self,Textenter):
self.Textenter.get()
if self.Textenter.get() != "" or self.Textenter.get() != " ":
self.text = TextNode('write')
self.data = self.Name+"> "+self.Textenter.get()
self.text.setText(self.Name+"> "+self.Textenter.get())
self.textNodePath = aspect2d.attachNewNode(self.text)
self.textNodePath.setScale(0.06)
self.Textenter.enterText('')
self.myScrolledList.addItem(self.textNodePath)
self.client.send(self.data)
self.chatlistnumber = self.chatlistnumber + 1
self.myScrolledList.scrollTo(self.chatlistnumber)
###############################################################################
#Records the state of the arrow keys
def setKey(self, key, value):
self.keyMap[key] = value
#keys-
def move(self, task):
elapsed = task.time - self.prevtime
if (self.keyMap["left"]!=0):
base.camera.setX(base.camera, - (elapsed*25))
if (self.keyMap["right"]!=0):
base.camera.setX(base.camera, + (elapsed*25))
if (self.keyMap["forward"]!=0):
base.camera.setY(base.camera, + (elapsed*25))
if (self.keyMap["back"]!=0):
base.camera.setY(base.camera, - (elapsed*25))
if (self.keyMap["shoot"]!=0):
self.mpos=base.mouseWatcherNode.getMouse()
self.pickerRay.setFromLens(base.camNode, self.mpos.getX(), self.mpos.getY())
base.cTrav.traverse(render)
if base.handler.getNumEntries() > 0:
base.handler.sortEntries()
self.pickedObj=base.handler.getEntry(0).getIntoNodePath()
self.pickedObj=self.pickedObj.findNetTag('myObjectTag')
if not self.pickedObj.isEmpty():
self.send = (" " + "Shoot" + " " + "(%s," + " " + str(self.pickedObj)) % self.selfip
if (self.keyMap["chat"]!=0):
time.sleep(.2)
if self.tempchatonoff == 0:
self.Textenter['focus'] = 1
self.Textenter.show()
self.myScrolledList.show()
self.tempchat = 1
if self.tempchatonoff == 1:
self.Textenter['focus'] = 0
base.disableMouse()
self.Textenter.hide()
self.myScrolledList.hide()
self.tempchat = 0
if (self.keyMap["fps"]!=0):
time.sleep(.2)
if self.FrameRateMeter == 0:
base.setFrameRateMeter(1)
self.FrameRateMeter = 1
elif self.FrameRateMeter == 1:
base.setFrameRateMeter(0)
self.FrameRateMeter = 0
if (self.keyMap["fullscreen"]!=0):
time.sleep(.2)
props = WindowProperties()
if self.full == 0:
props.setFullscreen(False)
props.setUndecorated(False)
props.setOrigin(200,150)
props.setSize(800,600)
self.full = 1
elif self.full == 1:
props.setFullscreen(True)
props.setOrigin(0,0)
props.setSize(1280,1024)
self.full = 0
base.win.requestProperties(props)
#gravity
if base.camera.getZ() >= -40:
if base.camera.getZ() != self.tempZ:
self.tempZ = base.camera.getZ()
base.camera.setZ(base.camera, -.2) #.0505
#move the mouse
self.md = base.win.getPointer(0)
self.x = self.md.getX()
self.y = self.md.getY()
if base.win.movePointer(0, base.win.getXSize()/2, base.win.getYSize()/2):
base.camera.setP(base.camera.getP() - (self.y - base.win.getYSize()/2)*0.4)
base.camera.setH(base.camera.getH() - (self.x - base.win.getXSize()/2)*0.4)
#store camrea pos
startpos = base.camera.getPos()
self.prevtime = task.time
return Task.cont
###############################################################################
World()
run()