This is a read-only archive of the old Scratch 1.x Forums.
Try searching the current Scratch discussion forums.

#251 2012-02-15 19:16:53

Dinoclor
Scratcher
Registered: 2010-06-10
Posts: 1000+

Re: FireMMO: The Ultimate MMO Development Kit (previously MMO Project)

I'll be downloading the new version as soon as I can use my other computer.


This is a temporary signature. It will exist until I think of something witty.

Offline

 

#252 2012-02-15 19:26:54

bobbybee
Scratcher
Registered: 2009-10-18
Posts: 1000+

Re: FireMMO: The Ultimate MMO Development Kit (previously MMO Project)

@Dinoclor
Thanks. Just to keep in mind, I still have to release the Python mirror. I can give you the source code for it, but I don't have a binary ready. Also, there is documentation for the newest supported version of FireMMO being written, but it isn't completely finished--it hasn't been perfected enough to be useful. In the mean time, you can ask me how to use the new version of FireMMO.

Thanks for interest in FireMMO,
-bobbybee (FireMMO Founder, FireMMO Owner, and FireMMO Lead Programmer)


I support the Free Software Foundation. Protect our digital rights!

Offline

 

#253 2012-02-15 23:23:56

Magnie
Scratcher
Registered: 2007-12-12
Posts: 1000+

Re: FireMMO: The Ultimate MMO Development Kit (previously MMO Project)

http://www.py2exe.org/ - I'm not sure about an .app one though.

Offline

 

#254 2012-02-16 06:22:14

bobbybee
Scratcher
Registered: 2009-10-18
Posts: 1000+

Re: FireMMO: The Ultimate MMO Development Kit (previously MMO Project)

Alright. I'll try that.


I support the Free Software Foundation. Protect our digital rights!

Offline

 

#255 2012-02-17 16:12:11

bobbybee
Scratcher
Registered: 2009-10-18
Posts: 1000+

Re: FireMMO: The Ultimate MMO Development Kit (previously MMO Project)

By the way Magnie, can you test out my mirror. Here's the current source code (no errors):

Code:

# Scratch Mirror
# Version 1.5.0
# Originally by: Magnie. Modified by bobbybee for use in FireMMO

import socket # Network base
import time # For delaying purposes mostly.
import threading # So it can send and receive at the same time anytime.
import array

# ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### #
# CHOST is the IP Scratch is running on, if you are running it    #
# on this computer, then the IP is 127.0.0.1                      #
# Theoretically you could run this Mirror on another computer.    #
# ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### #
# CPOST is the port Scratch is listening on, the default is       #
# 42001. Usually this is only change by a Scratcher who knows a   #
# about Squeak and networking with sockets.                       #
# ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### #
CHOST = '127.0.0.1'
CPORT = 42001

# ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### #
# SHOST is the IP the server is running on.                       #
# ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### #
# SPORT is the port that the server is using. 42002 is the        #
# unofficial port for Scratch Servers. The host will need to make #
# sure to port-forward the port so people can connect from the    #
# internet.                                                       #
# ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### #
SHOST = '127.0.0.1'
SPORT = 7070

# ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### #
# Some extra settings that are more for advanced users are below. #
# ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### #

# Time between checking the threads for broken ones.
THREADCHECK = 5



class Client(threading.Thread): # This class listens for messages sent from Scratch and sends it to the Server.
    def parse_message(self, message):
        if message:
            sensors = {}
            broadcasts = []

            commands = []
            i = 0
            while True:
                length = ord(message[i]) + ord(message[i+1]) + ord(message[i+2]) + ord(message[i+3])
            
                command = message[i + 4:i + length + 4]
                commands.append(command)
                if (i + length + 4) < len(message):
                    i = (i+4) + length
                else:
                    del command
                    break
            
            for command in commands:
                if command[0] == 'b':
                    command = command.split('"')
                    command.pop(0)
                    broadcasts.append(command[0])
                
                elif command[0] == 's':
                    command = command.split('"')
                    command.pop(0)
                    command.remove(' ')
                    #command.remove('')
                    sensors[command[0]] = command[1]
        
            return dict([('sensor-update', sensors), ('broadcast', broadcasts)])
        else: 
            return None
    def sendScratchCommand(self, cmd):
        n = len(cmd)
        a = array('c')
        a.append(chr((n >> 24) & 0xFF))
        a.append(chr((n >> 16) & 0xFF))
        a.append(chr((n >>  8) & 0xFF))
        a.append(chr(n & 0xFF))
        server.sock.send(a.tostring() + cmd)
    
    def __init__(self, CHOST, CPORT):
        threading.Thread.__init__(self) # Initialize it, basically just separate it from the main thread.
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Defines the type of connection ( UPD, TCP on IPv4 or IPv6 )
        print("Connecting to Scratch...")
        self.sock.connect((CHOST, CPORT)) # Connect to Scratch
        print("Connected to Scratch!")
        
    def run(self):
        global running
        print "Listening for Scratch messages."
        while running:
            data = self.sock.recv(1024) # Wait for something to be sent to the mirror
            
            data = self.parse_message(data)
            for sensor in data['sensor-update']:
                if sensor == "packet":
                    self.send(data['sensor-update'][sensor])

    
    def send(self, message):
        server.sock.send(message) # Send the data to the server.

class Server(threading.Thread): # This class listens for messages from the Server and sends it to Scratch.
    def sendScratchCommand(self, cmd):
        n = len(cmd)
        a = []
        a.append(chr((n >> 24) & 0xFF))
        a.append(chr((n >> 16) & 0xFF))
        a.append(chr((n >>  8) & 0xFF))
        a.append(chr(n & 0xFF))
        scratch.sock.send(''.join(a) + cmd)
    def __init__(self, SHOST, SPORT):
        threading.Thread.__init__(self) # Initialize it, basically just separate it from the main thread.
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Defines the type of connection ( UPD, TCP on IPv4 or IPv6 )
        print("Connecting to Scratch Server...")
        self.sock.connect((SHOST, SPORT)) # Connect to the Server.
        print("Connected to Server!")
        
    def run(self):   
        global running
        print "Listening for Server messages."
        while running:    
            data = self.sock.recv(1024) # Listens for messages sent from the Server.
            self.sendScratchCommand("sensor-update packet \""+data+"\"");
            self.sendScratchCommand("broadcast dataready")
    
    def send(self, message):
        scratch.sock.send(message) # Sends messages to Scratch.

running = 1
scratch = Client(CHOST, CPORT) # Start up the class for Scratch
scratch.start() # This starts the 'run' function.

server = Server(SHOST, SPORT) # Start up the class for Server
server.start() # This starts the 'run' function on the class as well.

while running:
    time.sleep(THREADCHECK) # The longer the wait time, the less CPU is used I think.
    try: # Check if the either thread died ( or exists anymore ).
        if scratch: pass
        if server: pass
    except: # If either are dead, end the program.
        running = 0
        print "Finished running."

I support the Free Software Foundation. Protect our digital rights!

Offline

 

#256 2012-02-18 10:27:06

bobbybee
Scratcher
Registered: 2009-10-18
Posts: 1000+

Re: FireMMO: The Ultimate MMO Development Kit (previously MMO Project)

By the way, I set up a small FireMMO website with an actual builder. (I used weebly) You can access it here. firemmo.tk


I support the Free Software Foundation. Protect our digital rights!

Offline

 

#257 2012-02-19 17:35:26

bobbybee
Scratcher
Registered: 2009-10-18
Posts: 1000+

Re: FireMMO: The Ultimate MMO Development Kit (previously MMO Project)

This is a useful script:

set [i] to [1]
set [j] to [1]
delete [all] of [split]
add [] to split
repeat until <(i) > (length of (inpacket))>
if <letter (i) of (inpacket) = [/]>
change [j] by [1]
add [] to split
else
replace (item (j) of [split]) with (join item (j) of [split])
end
change [i] by [1]
end

Last edited by bobbybee (2012-02-20 06:21:24)


I support the Free Software Foundation. Protect our digital rights!

Offline

 

#258 2012-02-20 02:42:19

Zeusking19
Scratcher
Registered: 2011-07-10
Posts: 1000+

Re: FireMMO: The Ultimate MMO Development Kit (previously MMO Project)

I can make a website for you.  smile

(I handcode fresh HTML, PHP and CSS.)


http://i49.tinypic.com/2w7e1jm.pnghttp://dragcave.net/image/eFGFz.gifhttp://dragcave.net/image/9hE5q.gif

Offline

 

#259 2012-02-20 05:59:57

bobbybee
Scratcher
Registered: 2009-10-18
Posts: 1000+

Re: FireMMO: The Ultimate MMO Development Kit (previously MMO Project)

If you want to use the stuff I put on a website above, tell me. If it looks good enough I'll call it the real website. Else, I'll just stick to an editor.


I support the Free Software Foundation. Protect our digital rights!

Offline

 

#260 2012-02-20 08:22:41

bobbybee
Scratcher
Registered: 2009-10-18
Posts: 1000+

Re: FireMMO: The Ultimate MMO Development Kit (previously MMO Project)

I'm getting this error (hopefully this is the last one)

Exception in thread Thread-1:
Traceback (most recent call last):
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/threading.py", line 522, in __bootstrap_inner
    self.run()
  File "mirror.py", line 99, in run
    data = self.parse_message(data)
  File "mirror.py", line 70, in parse_message
    command.remove(' ')
ValueError: list.remove(x): x not in list


Code:

# Scratch Mirror
# Version 1.5.0
# Originally by: Magnie. Modified by bobbybee for use in FireMMO

import socket # Network base
import time # For delaying purposes mostly.
import threading # So it can send and receive at the same time anytime.
import array

# ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### #
# CHOST is the IP Scratch is running on, if you are running it    #
# on this computer, then the IP is 127.0.0.1                      #
# Theoretically you could run this Mirror on another computer.    #
# ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### #
# CPOST is the port Scratch is listening on, the default is       #
# 42001. Usually this is only change by a Scratcher who knows a   #
# about Squeak and networking with sockets.                       #
# ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### #
CHOST = '127.0.0.1'
CPORT = 42001

# ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### #
# SHOST is the IP the server is running on.                       #
# ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### #
# SPORT is the port that the server is using. 42002 is the        #
# unofficial port for Scratch Servers. The host will need to make #
# sure to port-forward the port so people can connect from the    #
# internet.                                                       #
# ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### #
SHOST = '127.0.0.1'
SPORT = 7070

# ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### #
# Some extra settings that are more for advanced users are below. #
# ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### #

# Time between checking the threads for broken ones.
THREADCHECK = 5



class Client(threading.Thread): # This class listens for messages sent from Scratch and sends it to the Server.
    def parse_message(self, message):
        if message:
            sensors = {}
            broadcasts = []

            commands = []
            i = 0
            while True:
                length = ord(message[i]) + ord(message[i+1]) + ord(message[i+2]) + ord(message[i+3])
            
                command = message[i + 4:i + length + 4]
                commands.append(command)
                if (i + length + 4) < len(message):
                    i = (i+4) + length
                else:
                    del command
                    break
            
            for command in commands:
                if command[0] == 'b':
                    command = command.split('"')
                    command.pop(0)
                    broadcasts.append(command[0])
                
                elif command[0] == 's':
                    command = command.split('"')
                    command.pop(0)
                    command.remove(' ')
                    #command.remove('')
                    sensors[command[0]] = command[1]
        
            return dict([('sensor-update', sensors), ('broadcast', broadcasts)])
        else: 
            return None
    def sendScratchCommand(self, cmd):
        n = len(cmd)
        a = array('c')
        a.append(chr((n >> 24) & 0xFF))
        a.append(chr((n >> 16) & 0xFF))
        a.append(chr((n >>  8) & 0xFF))
        a.append(chr(n & 0xFF))
        server.sock.send(a.tostring() + cmd)
    
    def __init__(self, CHOST, CPORT):
        threading.Thread.__init__(self) # Initialize it, basically just separate it from the main thread.
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Defines the type of connection ( UPD, TCP on IPv4 or IPv6 )
        print("Connecting to Scratch...")
        self.sock.connect((CHOST, CPORT)) # Connect to Scratch
        print("Connected to Scratch!")
        
    def run(self):
        global running
        print "Listening for Scratch messages."
        while running:
            data = self.sock.recv(1024) # Wait for something to be sent to the mirror
            
            data = self.parse_message(data)
            for sensor in data['sensor-update']:
                if sensor == "packet":
                    self.send(data['sensor-update'][sensor])

    
    def send(self, message):
        server.sock.send(message) # Send the data to the server.

class Server(threading.Thread): # This class listens for messages from the Server and sends it to Scratch.
    def sendScratchCommand(self, cmd):
        n = len(cmd)
        a = []
        a.append(chr((n >> 24) & 0xFF))
        a.append(chr((n >> 16) & 0xFF))
        a.append(chr((n >>  8) & 0xFF))
        a.append(chr(n & 0xFF))
        scratch.sock.send(''.join(a) + cmd)
    def __init__(self, SHOST, SPORT):
        threading.Thread.__init__(self) # Initialize it, basically just separate it from the main thread.
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Defines the type of connection ( UPD, TCP on IPv4 or IPv6 )
        print("Connecting to Scratch Server...")
        self.sock.connect((SHOST, SPORT)) # Connect to the Server.
        print("Connected to Server!")
        
    def run(self):   
        global running
        print "Listening for Server messages."
        while running:    
            data = self.sock.recv(1024) # Listens for messages sent from the Server.
            self.sendScratchCommand("sensor-update packet \""+data+"\"");
            self.sendScratchCommand("broadcast dataready")
    
    def send(self, message):
        scratch.sock.send(message) # Sends messages to Scratch.

running = 1
scratch = Client(CHOST, CPORT) # Start up the class for Scratch
scratch.start() # This starts the 'run' function.

server = Server(SHOST, SPORT) # Start up the class for Server
server.start() # This starts the 'run' function on the class as well.

while running:
    time.sleep(THREADCHECK) # The longer the wait time, the less CPU is used I think.
    try: # Check if the either thread died ( or exists anymore ).
        if scratch: pass
        if server: pass
    except: # If either are dead, end the program.
        running = 0
        print "Finished running."

I support the Free Software Foundation. Protect our digital rights!

Offline

 

#261 2012-02-20 11:12:46

Magnie
Scratcher
Registered: 2007-12-12
Posts: 1000+

Re: FireMMO: The Ultimate MMO Development Kit (previously MMO Project)

Write a print statement after the command.pop(0) that prints the contents of command. Cause apparently ' ' doesn't exist in the command list.

Offline

 

#262 2012-02-20 15:18:57

bobbybee
Scratcher
Registered: 2009-10-18
Posts: 1000+

Re: FireMMO: The Ultimate MMO Development Kit (previously MMO Project)

['inpacket', ' ', 'Fxt/m/bobbybee/Hello, World!/Fxt/m/bobbybee/Hello, World!/Fxt/m/bobbybee']
['inpacket', ' ', 'Fxt/m/bobbybee/Hello, World!/Fxt/m/bobbybee/Hello, World!/Fxt/m/bobbybee/Hello, World!/Fxt/m/bobbybee']
[]
Exception in thread Thread-1:
Traceback (most recent call last):
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/threading.py", line 522, in __bootstrap_inner
    self.run()
  File "mirror.py", line 100, in run
    data = self.parse_message(data)
  File "mirror.py", line 71, in parse_message
    command.remove(' ')
ValueError: list.remove(x): x not in list


I support the Free Software Foundation. Protect our digital rights!

Offline

 

#263 2012-02-20 16:12:22

Magnie
Scratcher
Registered: 2007-12-12
Posts: 1000+

Re: FireMMO: The Ultimate MMO Development Kit (previously MMO Project)

bobbybee wrote:

['inpacket', ' ', 'Fxt/m/bobbybee/Hello, World!/Fxt/m/bobbybee/Hello, World!/Fxt/m/bobbybee']
['inpacket', ' ', 'Fxt/m/bobbybee/Hello, World!/Fxt/m/bobbybee/Hello, World!/Fxt/m/bobbybee/Hello, World!/Fxt/m/bobbybee']
[]
Exception in thread Thread-1:
Traceback (most recent call last):
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/threading.py", line 522, in __bootstrap_inner
    self.run()
  File "mirror.py", line 100, in run
    data = self.parse_message(data)
  File "mirror.py", line 71, in parse_message
    command.remove(' ')
ValueError: list.remove(x): x not in list

Yeah you are trying to to delete ' ' instead of ''. So try commenting out that line then remove the comment for command.remove('').

Offline

 

#264 2012-02-20 16:17:54

bobbybee
Scratcher
Registered: 2009-10-18
Posts: 1000+

Re: FireMMO: The Ultimate MMO Development Kit (previously MMO Project)

Okay.


I support the Free Software Foundation. Protect our digital rights!

Offline

 

#265 2012-02-20 16:21:21

bobbybee
Scratcher
Registered: 2009-10-18
Posts: 1000+

Re: FireMMO: The Ultimate MMO Development Kit (previously MMO Project)

Connecting to Scratch...
Connected to Scratch!
Listening for Scratch messages.
Connecting to Scratch Server...
Connected to Server!
Listening for Server messages.
['g', ' 0 ', 'i', ' 769 ', 'inpacket', ' ', 'b/hello/Fxt/m/bobbybee/hello/Fxt/m/bobbybee/hello/Fxt/m/bobbybee/hello/Fxt/m/bobbybee/hello/Fxt/m/bobbybee/hell']
Exception in thread Thread-1:
Traceback (most recent call last):
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/threading.py", line 522, in __bootstrap_inner
    self.run()
  File "mirror.py", line 100, in run
    data = self.parse_message(data)
  File "mirror.py", line 72, in parse_message
    command.remove('')
ValueError: list.remove(x): x not in list


I support the Free Software Foundation. Protect our digital rights!

Offline

 

#266 2012-02-21 10:55:46

bobbybee
Scratcher
Registered: 2009-10-18
Posts: 1000+

Re: FireMMO: The Ultimate MMO Development Kit (previously MMO Project)

bump.


I support the Free Software Foundation. Protect our digital rights!

Offline

 

#267 2012-02-21 11:30:14

Magnie
Scratcher
Registered: 2007-12-12
Posts: 1000+

Re: FireMMO: The Ultimate MMO Development Kit (previously MMO Project)

Hmm, I'm not sure. I guess you just put try: except: around them, like so:

Code:

try:
    command.remove(' ')
except ValueError:
    pass

Offline

 

#268 2012-02-21 12:30:42

bobbybee
Scratcher
Registered: 2009-10-18
Posts: 1000+

Re: FireMMO: The Ultimate MMO Development Kit (previously MMO Project)

It worked, but I still got a error in the process:


Connecting to Scratch...
Connected to Scratch!
Listening for Scratch messages.
Connecting to Scratch Server...
Connected to Server!
Listening for Server messages.
['g', ' 1 ', 'i', ' 1 ', 'inpacket', ' ', '', ' ', 'j', ' 1 ', 'message', ' ', 'What do you no about telnet?e', ' ', 'name', ' ', 'bobbybee', ' ', 'packet', ' ', 'Fxt/m/bobbybee/Hello, World!/', ' ']
['packet', ' ', 'Fxt/m/bobbybee/dataready/', ' ']
['g', ' 2 ', 'i', ' 2 ', 'inpacket', ' ', 'Fxt/m/']
Exception in thread Thread-1:
Traceback (most recent call last):
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/threading.py", line 522, in __bootstrap_inner
    self.run()
  File "mirror.py", line 102, in run
    data = self.parse_message(data)
  File "mirror.py", line 65, in parse_message
    broadcasts.append(command[0])
IndexError: list index out of range


I have a feeling it has to do with the list/array initialization.


I support the Free Software Foundation. Protect our digital rights!

Offline

 

#269 2012-02-21 12:34:32

roijac
Scratcher
Registered: 2010-01-19
Posts: 1000+

Re: FireMMO: The Ultimate MMO Development Kit (previously MMO Project)

it tried to access an empty list, did you press enter without writing anything?

Offline

 

#270 2012-02-21 12:50:50

bobbybee
Scratcher
Registered: 2009-10-18
Posts: 1000+

Re: FireMMO: The Ultimate MMO Development Kit (previously MMO Project)

No...


I support the Free Software Foundation. Protect our digital rights!

Offline

 

#271 2012-02-21 13:00:01

joefarebrother
Scratcher
Registered: 2011-04-08
Posts: 1000+

Re: FireMMO: The Ultimate MMO Development Kit (previously MMO Project)

i'm good at scratch and GML


My latest project is called http://tinyurl.com/d2m8hne! It has http://tinyurl.com/d395ygk views, http://tinyurl.com/cnasmt7 love-its, and http://tinyurl.com/bwjy8xs comments.
http://tinyurl.com/756anbk   http://tinyurl.com/iplaychess

Offline

 

#272 2012-02-21 13:04:27

bobbybee
Scratcher
Registered: 2009-10-18
Posts: 1000+

Re: FireMMO: The Ultimate MMO Development Kit (previously MMO Project)

GameMaker won't really help you, but you can help make Scratch stuff. I'll be releasing a little chat project soon.


I support the Free Software Foundation. Protect our digital rights!

Offline

 

#273 2012-02-21 13:10:18

Magnie
Scratcher
Registered: 2007-12-12
Posts: 1000+

Re: FireMMO: The Ultimate MMO Development Kit (previously MMO Project)

bobbybee wrote:

It worked, but I still got a error in the process:


Connecting to Scratch...
Connected to Scratch!
Listening for Scratch messages.
Connecting to Scratch Server...
Connected to Server!
Listening for Server messages.
['g', ' 1 ', 'i', ' 1 ', 'inpacket', ' ', '', ' ', 'j', ' 1 ', 'message', ' ', 'What do you no about telnet?e', ' ', 'name', ' ', 'bobbybee', ' ', 'packet', ' ', 'Fxt/m/bobbybee/Hello, World!/', ' ']
['packet', ' ', 'Fxt/m/bobbybee/dataready/', ' ']
['g', ' 2 ', 'i', ' 2 ', 'inpacket', ' ', 'Fxt/m/']
Exception in thread Thread-1:
Traceback (most recent call last):
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/threading.py", line 522, in __bootstrap_inner
    self.run()
  File "mirror.py", line 102, in run
    data = self.parse_message(data)
  File "mirror.py", line 65, in parse_message
    broadcasts.append(command[0])
IndexError: list index out of range


I have a feeling it has to do with the list/array initialization.

Yeah, there was a blank broadcast or something. I'd probably have to see the entire commands list.

Offline

 

#274 2012-02-21 13:12:28

bobbybee
Scratcher
Registered: 2009-10-18
Posts: 1000+

Re: FireMMO: The Ultimate MMO Development Kit (previously MMO Project)

What should I change to prevent this issue, then? Or how should I dump the commands list?


I support the Free Software Foundation. Protect our digital rights!

Offline

 

#275 2012-02-21 13:17:21

roijac
Scratcher
Registered: 2010-01-19
Posts: 1000+

Re: FireMMO: The Ultimate MMO Development Kit (previously MMO Project)

don't have the code, you better ask magnie  smile

Offline

 

Board footer