posInterval and Dictionaries--Mess of Problems

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;

  1. network seems to be to slow
  2. even the delete when offline doesnt work lol.
  3. dictionaring seems to be mess up, taking the wrong ip
  4. chat wont go away once started
  5. 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()