Advertisement
Guest User

Untitled

a guest
Sep 26th, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 18.32 KB | None | 0 0
  1. #as this is multi-threaded, it currently must be exited by closing your terminal/resetting IDLE.
  2.  
  3. from direct.showbase.ShowBase import ShowBase
  4. import os, sys, string
  5. import PyCEGUI
  6. import PyCEGUIOpenGLRenderer
  7. from panda3d.core import PythonCallbackObject, CallbackNode, DataNode, loadPrcFileData
  8. from pandac.PandaModules import *
  9. import Queue
  10. from twisted.internet import reactor,protocol
  11. from twisted.protocols.basic import Int32StringReceiver, StatefulStringProtocol
  12. from twisted.words.protocols import irc
  13. import threading
  14.  
  15. queue=Queue.Queue(-1)
  16. prot = None
  17. chatProtocol=None
  18. user=None
  19. started=False
  20. msg=None
  21. username=None
  22. password=None
  23. boxItems=[]
  24. loadPrcFileData('', 'win-size 1280 768') #this size may not work for everyone. If it doesn't, feel free to change it, don't worry about changing it back.
  25. loadPrcFileData('', 'undecorated 1')
  26. loadPrcFileData('', 'win-origin 0 0')
  27. loadPrcFileData('', 'show-frame-rate-meter #t')
  28. loadPrcFileData('', 'sync-video #f')
  29. x=1
  30. logged=False
  31.  
  32. def loginClicked(user, password):
  33.     global prot
  34.     prot.sendString('Login:')
  35.     prot.sendString(str(user))
  36.     print user
  37.     prot.sendString(str(password))
  38.     print password
  39.    
  40. def gotProtocol(proto):
  41.     global prot
  42.     prot = proto
  43.    
  44. def chatProtocol(proto):
  45.     global chatProtocol
  46.     chatProtocol=proto
  47.    
  48. def loggedin():
  49.     global queue
  50.     global logged
  51.     logged=True
  52.     queue.put(lambda: PyCEGUI.WindowManager.getSingleton().destroyWindow("Root"))
  53.    
  54. def start():
  55.     global chatProtocol
  56.     global username
  57.     user=str(username)
  58.     global password
  59.     irc.IRCClient.setNick(chatProtocol, user)
  60.     chatProtocol.join("#spiritsword")
  61.     print "joined"
  62.  
  63. def messageSender():
  64.     global msg
  65.     global chatProtocol
  66.     msg=str(msg)
  67.     chatProtocol.msg("#spiritsword", msg)
  68.    
  69. def messageReceived():
  70.     global msg
  71.     global user
  72.     global queue
  73.     msg=user+": "+msg
  74.     queue.put(lambda: addMessage())
  75.    
  76. def addMessage():
  77.     global msg
  78.     global boxItems
  79.     listboxitem = PyCEGUI.ListboxTextItem(msg)
  80.     listboxitem.AutoDeleted = False
  81.     chatbox=PyCEGUI.WindowManager.getSingleton().getWindow("Root/Chatbox")
  82.     chatbox.addItem(listboxitem)
  83.     boxItems.append(listboxitem)
  84.    
  85. def inv():
  86.     global queue
  87.     queue.put(lambda: PyCEGUI.WindowManager.getSingleton().getWindow("Root/Login/Incorrect").setProperty("Visible", "True"))
  88.  
  89. class PandaCEGUI(object):
  90.     buttons = {
  91.         'mouse1': PyCEGUI.MouseButton.LeftButton,
  92.         'mouse2': PyCEGUI.MouseButton.RightButton,
  93.         'mouse3': PyCEGUI.MouseButton.MiddleButton,
  94.         'mouse1-up': PyCEGUI.MouseButton.LeftButton,
  95.         'mouse2-up': PyCEGUI.MouseButton.RightButton,
  96.         'mouse3-up': PyCEGUI.MouseButton.MiddleButton,
  97.         'wheel_up': PyCEGUI.MouseButton.NoButton,
  98.         'wheel_down': PyCEGUI.MouseButton.NoButton,
  99.     }
  100.    
  101.     keys = {
  102.         'a': (PyCEGUI.Key.Scan.A, 'a', 'A'),
  103.         'b': (PyCEGUI.Key.Scan.B, 'b', 'B'),
  104.         'c': (PyCEGUI.Key.Scan.C, 'c', 'C'),
  105.         'd': (PyCEGUI.Key.Scan.D, 'd', 'D'),
  106.         'e': (PyCEGUI.Key.Scan.E, 'e', 'E'),
  107.         'f': (PyCEGUI.Key.Scan.F, 'f', 'F'),
  108.         'g': (PyCEGUI.Key.Scan.G, 'g', 'G'),
  109.         'h': (PyCEGUI.Key.Scan.H, 'h', 'H'),
  110.         'i': (PyCEGUI.Key.Scan.I, 'i', 'I'),
  111.         'j': (PyCEGUI.Key.Scan.J, 'j', 'J'),
  112.         'k': (PyCEGUI.Key.Scan.K, 'k', 'K'),
  113.         'l': (PyCEGUI.Key.Scan.L, 'l', 'L'),
  114.         'm': (PyCEGUI.Key.Scan.M, 'm', 'M'),
  115.         'n': (PyCEGUI.Key.Scan.N, 'n', 'N'),
  116.         'o': (PyCEGUI.Key.Scan.O, 'o', 'O'),
  117.         'p': (PyCEGUI.Key.Scan.P, 'p', 'P'),
  118.         'q': (PyCEGUI.Key.Scan.Q, 'q', 'Q'),
  119.         'r': (PyCEGUI.Key.Scan.R, 'r', 'R'),
  120.         's': (PyCEGUI.Key.Scan.S, 's', 'S'),
  121.         't': (PyCEGUI.Key.Scan.T, 't', 'T'),
  122.         'u': (PyCEGUI.Key.Scan.U, 'u', 'U'),
  123.         'v': (PyCEGUI.Key.Scan.V, 'v', 'V'),
  124.         'w': (PyCEGUI.Key.Scan.W, 'w', 'W'),
  125.         'x': (PyCEGUI.Key.Scan.X, 'x', 'X'),
  126.         'y': (PyCEGUI.Key.Scan.Y, 'y', 'Y'),
  127.         'z': (PyCEGUI.Key.Scan.Z, 'z', 'Z'),
  128.  
  129.         '`': (PyCEGUI.Key.Scan.Grave, '`', '~'),
  130.         '0': (PyCEGUI.Key.Scan.Zero, '0', ')'),
  131.         '1': (PyCEGUI.Key.Scan.One, '1', '!'),
  132.         '2': (PyCEGUI.Key.Scan.Two, '2', '@'),
  133.         '3': (PyCEGUI.Key.Scan.Three, '3', '#'),
  134.         '4': (PyCEGUI.Key.Scan.Four, '4', '$'),
  135.         '5': (PyCEGUI.Key.Scan.Five, '5', '%'),
  136.         '6': (PyCEGUI.Key.Scan.Six, '6', '^'),
  137.         '7': (PyCEGUI.Key.Scan.Seven, '7', '&'),
  138.         '8': (PyCEGUI.Key.Scan.Eight, '8', '*'),
  139.         '9': (PyCEGUI.Key.Scan.Nine, '9', '('),
  140.         '-': (PyCEGUI.Key.Scan.Minus, '-', '_'),
  141.         '=': (PyCEGUI.Key.Scan.Equals, '=', '+'),
  142.  
  143.  
  144.         '[': (PyCEGUI.Key.Scan.LeftBracket, '[', '{'),
  145.         ']': (PyCEGUI.Key.Scan.RightBracket, ']', '}'),
  146.         '\\': (PyCEGUI.Key.Scan.Backslash, '\\', '|'),
  147.         ';': (PyCEGUI.Key.Scan.Semicolon, ';', ':'),
  148.  
  149.         "'": (PyCEGUI.Key.Scan.Apostrophe, "'", '"'),
  150.         ',': (PyCEGUI.Key.Scan.Comma, ',', '<'),
  151.         '.': (PyCEGUI.Key.Scan.Period, '.', '>'),
  152.         '/': (PyCEGUI.Key.Scan.Slash, '/', '?'),
  153.  
  154.         'f1': (PyCEGUI.Key.Scan.F1, '', ''),
  155.         'f2': (PyCEGUI.Key.Scan.F3, '', ''),
  156.         'f3': (PyCEGUI.Key.Scan.F3, '', ''),
  157.         'f4': (PyCEGUI.Key.Scan.F4, '', ''),
  158.         'f5': (PyCEGUI.Key.Scan.F5, '', ''),
  159.         'f6': (PyCEGUI.Key.Scan.F6, '', ''),
  160.         'f7': (PyCEGUI.Key.Scan.F7, '', ''),
  161.         'f8': (PyCEGUI.Key.Scan.F8, '', ''),
  162.         'f9': (PyCEGUI.Key.Scan.F9, '', ''),
  163.         'f10': (PyCEGUI.Key.Scan.F10, '', ''),
  164.         'f11': (PyCEGUI.Key.Scan.F11, '', ''),
  165.         'f12': (PyCEGUI.Key.Scan.F12, '', ''),
  166.  
  167.         'enter': (PyCEGUI.Key.Scan.Return, '\r', '\r'),
  168.         'tab': (PyCEGUI.Key.Scan.Tab, '\t', '\t'),
  169.         'space': (PyCEGUI.Key.Scan.Space, ' ', ' '),
  170.  
  171.         'escape': (PyCEGUI.Key.Scan.Escape, '', ''),
  172.         'backspace': (PyCEGUI.Key.Scan.Backspace, '', ''),
  173.  
  174.         'insert': (PyCEGUI.Key.Scan.Insert, '', ''),
  175.         'delete': (PyCEGUI.Key.Scan.Delete, '', ''),
  176.  
  177.         'home': (PyCEGUI.Key.Scan.Home, '', ''),
  178.         'end': (PyCEGUI.Key.Scan.End, '', ''),
  179.         'page_up': (PyCEGUI.Key.Scan.PageUp, '', ''),
  180.         'page_down': (PyCEGUI.Key.Scan.PageDown, '', ''),
  181.  
  182.         'arrow_left': (PyCEGUI.Key.Scan.ArrowLeft, '', ''),
  183.         'arrow_up': (PyCEGUI.Key.Scan.ArrowUp, '', ''),
  184.         'arrow_down': (PyCEGUI.Key.Scan.ArrowDown, '', ''),
  185.         'arrow_right': (PyCEGUI.Key.Scan.ArrowRight, '', ''),
  186.  
  187.         'num_lock': (PyCEGUI.Key.Scan.NumLock, '', ''),
  188.         'caps_lock': (PyCEGUI.Key.Scan.Capital, '', ''),
  189.         'scroll_lock': (PyCEGUI.Key.Scan.ScrollLock, '', ''),
  190.  
  191.         'lshift': (PyCEGUI.Key.Scan.LeftShift, '', ''),
  192.         'rshift': (PyCEGUI.Key.Scan.RightShift, '', ''),
  193.         'lcontrol': (PyCEGUI.Key.Scan.LeftControl, '', ''),
  194.         'rcontrol': (PyCEGUI.Key.Scan.RightControl, '', ''),
  195.         'lalt': (PyCEGUI.Key.Scan.LeftAlt, '', ''),
  196.         'ralt': (PyCEGUI.Key.Scan.RightAlt, '', ''),
  197.         }
  198.     hideSystemCursor = True
  199.     _renderingEnabled = True
  200.     _capsLock = False
  201.     _shiftCount = 0
  202.    
  203.     def __init__(self):
  204.         ceguiCB = PythonCallbackObject(self.renderCallback)
  205.         self.cbNode = CallbackNode("CEGUI")
  206.         self.cbNode.setDrawCallback(ceguiCB)
  207.         render2d.attachNewNode(self.cbNode)
  208.         base.accept('window-event', self.windowEvent)
  209.         PyCEGUIOpenGLRenderer.OpenGLRenderer.bootstrapSystem()
  210.         self.props = WindowProperties()
  211.         self.System = PyCEGUI.System.getSingleton()
  212.         self.WindowManager = PyCEGUI.WindowManager.getSingleton()
  213.         self.SchemeManager = PyCEGUI.SchemeManager.getSingleton()
  214.         self.FontManager = PyCEGUI.FontManager.getSingleton()
  215.  
  216.     def __del__(self):
  217.         PyCEGUIOpenGLRenderer.OpenGLRenderer.destroySystem()
  218.  
  219.     def initializeResources(self, resourcePath):
  220.         rp = self.System.getResourceProvider()
  221.         rp.setResourceGroupDirectory("schemes", resourcePath)
  222.         rp.setResourceGroupDirectory("imagesets", resourcePath)
  223.         rp.setResourceGroupDirectory("fonts", resourcePath)
  224.         rp.setResourceGroupDirectory("layouts", resourcePath)
  225.         rp.setResourceGroupDirectory("looknfeels", resourcePath)
  226.         rp.setResourceGroupDirectory("schemas", resourcePath)
  227.         PyCEGUI.Imageset.setDefaultResourceGroup("imagesets")
  228.         PyCEGUI.Font.setDefaultResourceGroup("fonts")
  229.         PyCEGUI.Scheme.setDefaultResourceGroup("schemes")
  230.         PyCEGUI.WidgetLookManager.setDefaultResourceGroup("looknfeels")
  231.         PyCEGUI.WindowManager.setDefaultResourceGroup("layouts")
  232.         parser = self.System.getXMLParser()
  233.         if parser.isPropertyPresent("SchemaDefaultResourceGroup"):
  234.             parser.setProperty("SchemaDefaultResourceGroup", "schemas")
  235.  
  236.     def enableInputHandling(self):
  237.         for button, cegui_name in self.buttons.iteritems():
  238.             base.accept(button, self.captureButton, [button, cegui_name])
  239.         base.mouseWatcherNode.setModifierButtons(ModifierButtons())
  240.         base.buttonThrowers[0].node().setModifierButtons(ModifierButtons())
  241.         for key, keyTuple in self.keys.iteritems():
  242.             base.accept(key, self.captureKeys, [key, keyTuple])
  243.             base.accept(key + '-up', self.captureKeys, [key + '-up', keyTuple])
  244.             base.accept(key + '-repeat', self.captureKeys, [key, keyTuple])
  245.         if (self.hideSystemCursor):
  246.             self.props.setCursorHidden(True)
  247.             base.win.requestProperties(self.props)
  248.  
  249.     def disableInputHandling(self):
  250.         for button, name in self.buttons.iteritems():
  251.             base.ignore(button)
  252.         for key, keyTuple in self.keys.iteritems():
  253.             base.ignore(key)
  254.             base.ignore(key + '-up')
  255.             base.ignore(key + '-repeat')
  256.         if (self.hideSystemCursor):
  257.             self.props.setCursorHidden(False)
  258.             base.win.requestProperties(self.props)
  259.  
  260.     def enable(self):
  261.         self.enableInputHandling()
  262.         _renderingEnabled = True
  263.  
  264.     def disable(self):
  265.         self.disableInputHandling()
  266.         _renderingEnabled = False
  267.    
  268.     def captureKeys(self, key, keyTuple):
  269.         cegui_key = keyTuple[0]
  270.         key_ascii = keyTuple[1]
  271.         key_shift = keyTuple[2]
  272.         if key.find('shift') > 0:
  273.             if key.endswith('-up'):
  274.                 if self._shiftCount > 0:
  275.                     self._shiftCount -= 1
  276.             else:
  277.                 self._shiftCount += 1
  278.         elif key == 'caps_lock':
  279.             self._capsLock = not self._capsLock
  280.  
  281.         elif key.endswith('-up'):
  282.             self.System.injectKeyUp(cegui_key)
  283.         else:
  284.             self.System.injectKeyDown(cegui_key)
  285.             if key_ascii != '':
  286.                 if self._shiftCount > 0:
  287.                     if self._capsLock and key_ascii in string.lowercase:
  288.                         self.System.injectChar(ord(key_ascii))
  289.                     else:
  290.                         self.System.injectChar(ord(key_shift))
  291.                 elif self._capsLock and key_ascii in string.lowercase:
  292.                     self.System.injectChar(ord(key_shift))
  293.                 else:
  294.                     self.System.injectChar(ord(key_ascii))
  295.  
  296.     def captureButton(self, button, name):
  297.         if button == 'wheel_up':
  298.             self.System.injectMouseWheelChange(1)
  299.         elif button == 'wheel_down':
  300.             self.System.injectMouseWheelChange(-1)
  301.         elif button.endswith('-up'):
  302.             self.System.injectMouseButtonUp(self.buttons[button])
  303.         else:
  304.             self.System.injectMouseButtonDown(self.buttons[button])
  305.  
  306.     def windowEvent(self, window):
  307.         self.System.notifyDisplaySizeChanged(PyCEGUI.Size(window.getXSize(), window.getYSize()))
  308.  
  309.     def renderCallback(self, data):
  310.         if self._renderingEnabled:
  311.             dt = globalClock.getDt()
  312.             self.System.injectTimePulse(dt)
  313.             if base.mouseWatcherNode.hasMouse():
  314.                 x = base.win.getXSize() * (1 + base.mouseWatcherNode.getMouseX()) / 2
  315.                 y = base.win.getYSize() * (1 - base.mouseWatcherNode.getMouseY()) / 2
  316.                 self.System.injectMousePosition(x, y)
  317.             self.System.renderGUI()
  318.            
  319.     def play(self, args):
  320.         PyCEGUI.WindowManager.getSingleton().destroyWindow("Root")
  321.         layout=PyCEGUI.WindowManager.getSingleton().loadWindowLayout("interface.layout")
  322.         PyCEGUI.System.getSingleton().setGUISheet(layout)
  323.         self.send=PyCEGUI.WindowManager.getSingleton().getWindow("Root/Send")
  324.         self.send.subscribeEvent(PyCEGUI.PushButton.EventClicked, self, 'sendMessage')
  325.         self.message=PyCEGUI.WindowManager.getSingleton().getWindow("Root/Message")
  326.         self.chatbox=PyCEGUI.WindowManager.getSingleton().getWindow("Root/Chatbox")
  327.         reactor.callFromThread(start)
  328.         global started
  329.         started=True
  330.        
  331.     def sendMessage(self, args):
  332.         global msg
  333.         global username
  334.         msg=self.message.getText()
  335.         self.message.setProperty("Text", "")
  336.         reactor.callInThread(messageSender)
  337.         msg=username+": "+msg
  338.         addMessage()
  339.  
  340. class MyApp(ShowBase, object):
  341.  
  342.     def __init__(self):
  343.         ShowBase.__init__(self)
  344.         self.CEGUI = PandaCEGUI()
  345.         self.CEGUI.initializeResources('./datafiles')
  346.         self.setupUI()
  347.         self.CEGUI.enable()
  348.  
  349.     def setupUI(self):
  350.         PyCEGUI.SchemeManager.getSingleton().create("VanillaSkin.scheme")
  351.         PyCEGUI.System.getSingleton().setDefaultFont("AnkeCalligraph")
  352.         PyCEGUI.System.getSingleton().setDefaultMouseCursor("Vanilla-Images", "MouseArrow")
  353.         layout=PyCEGUI.WindowManager.getSingleton().loadWindowLayout("characters.layout")
  354.         PyCEGUI.System.getSingleton().setGUISheet(layout)
  355.         self.create=PyCEGUI.WindowManager.getSingleton().getWindow("Root/Create")
  356.         self.start=PyCEGUI.WindowManager.getSingleton().getWindow("Root/Start")
  357.         self.create.subscribeEvent(PyCEGUI.PushButton.EventClicked, self, 'createCharacter')
  358.         self.start.subscribeEvent(PyCEGUI.PushButton.EventClicked, self, 'play')
  359.     #############################################################
  360.         self.human=self.loader.loadModel('./models/Human.x')
  361.         self.human.reparentTo(self.render)
  362.         self.human.setScale(9, 9, 9)
  363.         self.human.setPos(-2, 50, 0)
  364.         self.sword=self.loader.loadModel('./models/Sword.x')
  365.         self.sword.reparentTo(self.human)
  366.         self.sword.setScale(.03, .05, .05)
  367.         self.sword.setPos(-.36, -.2, .57)
  368.         self.sword.setHpr(-90,0,90)
  369.         plight=PointLight('plight')
  370.         plight.setColor(VBase4(1,1,1,1))
  371.         plnp=self.render.attachNewNode(plight)
  372.         plnp.setPos(7, 10, -2)
  373.         render.setLight(plnp)
  374.         ambientLight = AmbientLight('ambientLight')
  375.         ambientLight.setColor(Vec4(0.2, 0.2, 0.2, 1))
  376.         ambientLightNP = render.attachNewNode(ambientLight)
  377.         render.setLight(ambientLightNP)
  378.     ####################################
  379.  
  380.     def login(self, args):
  381.         self.username=self.username.getText()
  382.         if self.username=="":
  383.             self.noUsername.setProperty("Visible", "True")
  384.         else:
  385.             self.password=self.password.getText()
  386.             if password=="":
  387.                 self.noPassword.setProperty("Visible", "True")
  388.             else:
  389.                 global username
  390.                 username=self.username
  391.                 global x
  392.                 x=0
  393.                 global password
  394.                 password=self.password
  395.                
  396.     def noUsernameOkClicked(self,args):
  397.         self.noUsername.setProperty("Visible", "False")
  398.        
  399.     def noPasswordOkClicked(self,args):
  400.         self.noPassword.setProperty("Visible", "False")
  401.        
  402.     def incorrectOkClicked(self,args):
  403.         self.Incorrect.setProperty("Visible", "False")
  404.        
  405.     def createCharacter(self, args):
  406.         print "create"
  407.         PyCEGUI.WindowManager.getSingleton().destroyWindow("Root")
  408.        
  409.     def play(self, args):
  410.         PyCEGUI.WindowManager.getSingleton().destroyWindow("Root")
  411.         layout=PyCEGUI.WindowManager.getSingleton().loadWindowLayout("interface.layout")
  412.         PyCEGUI.System.getSingleton().setGUISheet(layout)
  413.         self.send=PyCEGUI.WindowManager.getSingleton().getWindow("Root/Send")
  414.         self.send.subscribeEvent(PyCEGUI.PushButton.EventClicked, self, 'sendMessage')
  415.         self.message=PyCEGUI.WindowManager.getSingleton().getWindow("Root/Message")
  416.         self.chatbox=PyCEGUI.WindowManager.getSingleton().getWindow("Root/Chatbox")
  417.         reactor.callFromThread(start)
  418.         global started
  419.         started=True
  420.        
  421.     def sendMessage(self, args):
  422.         global msg
  423.         global username
  424.         msg=self.message.getText()
  425.         self.message.setProperty("Text", "")
  426.         reactor.callInThread(messageSender)
  427.         msg=username+": "+msg
  428.         addMessage()
  429.                
  430. class EchoClient(StatefulStringProtocol,Int32StringReceiver):
  431.     def connectionMade(self):
  432.         print "connected"
  433.  
  434.     def proto_init(self, data):
  435.         if data=="inv":
  436.             reactor.callInThread(inv)
  437.            
  438.         if data=="logged in":
  439.             reactor.callInThread(loggedin)
  440.         return 'init'
  441.  
  442.     def connectionLost(self, reason):
  443.         print "connection lost"
  444.        
  445. class chat(irc.IRCClient, protocol.ClientFactory):
  446.     def connectionMade(self):
  447.         irc.IRCClient.connectionMade(self)
  448.         print "connected"
  449.        
  450.     def connectionLost(self, reason):
  451.         pass
  452.        
  453.     def signedOn(self):
  454.         print "signed on"
  455.        
  456.     def joined(self, channel):
  457.         pass
  458.        
  459.     def privmsg(self, username, channel, message):
  460.         username = username.split('!', 1)[0]
  461.         global msg
  462.         global user
  463.         msg=message
  464.         user=username
  465.         reactor.callInThread(messageReceived)
  466.        
  467. class twistedThread(threading.Thread):
  468.     def run(self):
  469.         print "twisted thread"
  470.         creator = protocol.ClientCreator(reactor, EchoClient)
  471.         d = creator.connectTCP("localhost", 5000)
  472.         d.addCallback(gotProtocol)
  473.         e=protocol.ClientCreator(reactor, chat)
  474.         f= e.connectTCP("irc.mibbit.net", 6667)
  475.         f.addCallback(chatProtocol)
  476.         reactor.run(False)
  477.        
  478. twistedThread().start()
  479. app = MyApp()
  480. app.run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement