All pastes #819646 Raw Edit

RUCCUS' Wrapper

public text v1 · immutable
#819646 ·published 2007-12-17 02:53 UTC
rendered paste body
`````````````````````````````````````````````````````````````````````````````
`///////////////////////////////////////////////////////////////////////////`
`/                                                                         /`
`/  888b      88  88888888888  888888888888  88           88  88888888ba   /`
`/  8888b     88  88                88       88           88  88      "8b  /`
`/  88 `8b    88  88                88       88               88      ,8P  /`
`/  88  `8b   88  88aaaaa           88       88   v2.0    88  88aaaaaa8P'  /`
`/  88   `8b  88  88"""""           88       88           88  88""""""8b,  /`
`/  88    `8b 88  88                88       88           88  88      `8b  /`
`/  88     `8888  88                88       88           88  88      a8P  /`
`/  88      `888  88888888888       88       88888888888  88  88888888P"   /`                                                                                                                                     
`/                                                                         /`
`///////////////////////////////////////////////////////////////////////////`
`/`````````````````````````````````````````````````````````````````````````/`
`/ By Adam "RUCCUS" Eisfeld                                                /`
`/ Updated: Dec 2nd, 2007. 12:51 PM EST                                    /`
`/ Requires: Multisync V1.0, DBP V5.4                                      /`
`///////////////////////////////////////////////////////////////////////////`
`/`````````````````````````````````````````````````````````````````````````/`
`/ Instructions:                                                           /`
`/ 1. Include network library in project                                   /`
`/ 2. Call net_start() to run the default connection wizard, or call       /`
`/    net_connect() to manually connect.                                   /`
`/ 3. Call net_recieve(), net_send(), and net_update constantly each loop. /`
`/    Or call net_handle each loop.                                        /`
`///////////////////////////////////////////////////////////////////////////`
`/`````````````````````````````````````````````````````````````````````````/`
`/ Usage:                                                                  /`
`/ - Place any important init / login data in the LOGIN PACKET sent to     /`
`/   connecting clients in the net_recieve function.                       /`
`/ - Place any data that must constantly be sent each loop in the net_send /`
`/   function.                                                             /`                                           /`
`/ - Any processing code that the host does on user-recieved data can be   /`
`/   placed in a net_process()                                             /`
`/   function that goes between the net_recieve() and net_send() functions /`
`/   in the main loop.                                                     /`
`///////////////////////////////////////////////////////////////////////////`
`/`````````````````````````````````````````````````````````````````````````/`
`/ Network Variables:                                                      /`
`/ -     players: Current number of connected (logged-in) players (players /`
`/                merging with network are excluded)                       /`
`/ -  maxplayers: Maximum number of players allowed to connect to the      /`
`/                session                                                  /`
`/ - packetdelay: Delay in seconds between data transfer. (Recommended     /`
`/                at least 0.05s).                                         /`
`/ -       debug: Set this manually via the UDT to 1.                      /`
`/                See the Debug section below or the help files            /`
`/                at the bottom of the page for more information.          /`
`///////////////////////////////////////////////////////////////////////////`
`/`````````````````````````````````````````````````````````````````````````/`
`/ Network Connection Constants:                                           /`
`/ - IS_DISCONNECTED : The user isn't in the current game. Users with a    /`
`/                     connection of this type are automatically removed   /`
`/                     from the players list in the next loop.             /`
`/ - IS_CONNECTED    : The user is connected to the game, but has not      /`
`/                     logged in yet. (Awaiting merge)                     /`
`/ - IS_LOGGED_IN    : The user is included in the players list, and has   /`
`/                     successfully logged into the session.               /`
`/ - NOTE            : To kick a user, set their connection to             /`
`/                     IS_DISCONNECTED on the server-side, or call the     /`
`/                     net_kick() function, with the user's ID number.     /`
`///////////////////////////////////////////////////////////////////////////`
`/`````````````````````````````````````````````````````````````````````````/`
`/ Packets:                                                                /`   
`/ - There are 5 default packet types that should work for most if not all /`
`/   possible packet requirements. They are described below:               /`
`/                                                                         /`
`/    1. PACKET_LOGIN: This packet is sent from a connecting client        /`
`/                     to the server containing any initial client         /`
`/                     information (user name, character choice, etc.)     /`
`/                                                                         /`
`/    2. PACKET_SETUP: This packet is sent from the server back to the     /`
`/                     connecting client that previously sent the          /`
`/                     PACKET_LOGIN packet. It contains any initial        /`
`/                     network data the client requires to log in with     /`
`/                     (game settings, current player kills, etc).         /`
`/                                                                         /`
`/     3. PACKET_DATA: This packet is sent between the client and server.  /`
`/                     Each client sends the packet to the server          /`
`/                     individually, the server recieves the packet, and   /`
`/                     passes it on to the other clients. Place any        /`
`/                     information that all clients need in this packet    /`
`/                     (chat messages, a client's current weapon, etc. )   /`
`/                                                                         /`
`/    4 . PACKET_INFO: This packet contains data obtained by the host,     /`
`/                     that all clients require. Things like player IP's,  /`
`/                     updated positions if you're processing positions    /`
`/                     based on key-presses on the server-side, etc.       /`
`/                                                                         /`
`/  5. PACKET_PROCESS: This packet holds any data obtained by the client,  /`
`/                     that the host needs to process and send back out    /`
`/                     via PACKET_INFO. (For example, clients could send   /`
`/                     a byte of data representing their current key       /`
`/                     being pressed. The host recieves the process packet,/`  
`/                     checks if the key is the upkey, and if so           /`      
`/                     moves the client's object forward. The host then    /`
`/                     sends the player's updated position back out to the /`
`/                     other clients via packet_info.                      /`
`///////////////////////////////////////////////////////////////////////////`
`/`````````````````````````````````````````````````````````````````````````/`
`/ Debugging:                                                              /`
`/                                                                         /`
`/    Set net.debug to 1 to active the debugger, and back to 0 to deactive./`  
`/    When activated, all net events are recorded in a dynamic             /`
`/    array called debug() as strings of text, in                          /`
`/    chronological order. The events are in a UDT in the array            /`
`/    called event$. debug_output() is a helper function that              /`
`/    can be called anywhere to print the debug information                /`
`/    to the screen as it occurs. This function also takes                 /`
`/    care of activating the debugger so setting net.debug to              /`
`/    1 is not required. 2 other debug functions are provided;             /`
`/    debug_getEvent() and debug_clearEvents                               /` 
`/                                                                         /`
`/    Calling debug_save() will export the current debug array             /`
`/    as a .debug file in the specified directory, with the specified name /`
`/    (defaults to appname_xx.debug in the current directory). These files /`
`/    can be opened in Notepad or any text editor, and read back in with   /`
`/    the file commands.                                                   /`
`/                                                                         /`
`/    One other command the debug functions use on their own;              /`
`/    debug_addEvent(), can also be called manually to add events to the   /`
`/    debug list. This commands allows you to use the debug command-set    /`
`/    for any future projects.                                             /`
`/                                                                         /`
`/    Finally, debug_clearFiles() can be called at any time to delete all  /`
`/    files in the specified directory that have a .debug extension.       /`
`///////////////////////////////////////////////////////////////////////////`
`/`````````````````````````````````````````````````````````````````````````/`
`/ Help Files:                                                             /`
`/                                                                         /`
`/ A complete list of all functions in this library can be found at the    /`
`/ bottom of this page, where an explanation along with syntax, example    /`
`/ usage, and more, is given for each function.                            /`
`/                                                                         /`
`///////////////////////////////////////////////////////////////////////////`

````````````````````````````````````````
``````CONSTANTS`````````````````````````
````````````````````````````````````````
   #CONSTANT PACKET_LOGIN = 1
   #CONSTANT PACKET_SETUP = 2
   #CONSTANT PACKET_DATA = 3
   #CONSTANT PACKET_INFO = 4
   #CONSTANT PACKET_PROCESS = 5
   #CONSTANT IS_DISCONNECTED = -1   
   #CONSTANT IS_CONNECTED = 1
   #CONSTANT IS_LOGGED_IN = 2
   
````````````````````````````````````````
``````UDT's / VARIABLES`````````````````
````````````````````````````````````````
   TYPE net
      players, maxplayers
      packettime#, packetdelay#
      debug
   ENDTYPE
   GLOBAL net AS net
   
   TYPE players
      ID, connection
      msg$, IP$
   ENDTYPE
   
   TYPE usr
      ID, connection
      status$, msg$
   ENDTYPE
   GLOBAL usr AS usr
   
   TYPE debug
      event$
   ENDTYPE

````````````````````````````````````````
``````FUNCTIONS`````````````````````````
````````````````````````````````````````

`````````````````````````
```````````net_``````````
`````````````````````````

``Net Start: Gathers user input and begins network connection
FUNCTION net_start()
   SET WINDOW ON
   PRINT ""
   PRINT "NETLIB 2.0 - By Adam 'RUCCUS' Eisfeld"
   PRINT ""
   INPUT "Host or Client (H/C): ",usr.status$
   INPUT "IP Address: ",IP$
   usr.status$ = UPPER$(usr.status$)
   IF usr.status$ = "H" THEN INPUT "Max Players: ", net.maxplayers
   net_connect(IP$,usr.status$,net.maxplayers)
ENDFUNCTION

``Net Init: Initializes Network Data
FUNCTION net_init()
   net.packetdelay# = 0.05
   DIM players(0) AS players
   DIM debug(0) AS debug
ENDFUNCTION

``Net Enable: Enables application from Windows Firewall
FUNCTION net_enable()
   debug_addEvent("Enabling Firewall...")
   IF NET FIREWALL ENABLED()
      debug_addEvent("Windows Firewall -- Enabled")
      IF NOT NET FIREWALL APPLICATION ENABLED(APPNAME$())
         IF NET FIREWALL ENABLE APPLICATION(APPNAME$(),APPNAME$())
            debug_addEvent("Application -- Enabled")
         ELSE
            debug_addEvent("Application -- Failed")
         ENDIF
      ELSE
         debug_addEvent("Application -- Previously Enabled")
      ENDIF
   ELSE
      debug_addEvent("Windows Firewall -- Disabled")
   ENDIF
ENDFUNCTION

``Net Connect: Attempts to connect to or host the application.
FUNCTION net_connect(IP$,status$,maxplayers)
   net_init()
   net_enable()
   debug_addEvent("Attemping to connect... ")
   IF status$ = "C"
      connected = NET CONNECT(IP$)
      IF NOT connected THEN debug_addEvent("Failed to join server: "+NET GET ERROR()):WAIT KEY:END
      debug_addEvent("Merging with network...")
      net_merge()
   ELSE
      connected = NET HOST(net.maxplayers)
      plr_create(1)
      usr.connection = IS_LOGGED_IN
      players(1).connection = IS_LOGGED_IN
      IF NOT connected THEN debug_addEvent("Failed to host server: "+NET GET ERROR()):WAIT KEY:END
   ENDIF
   debug_addEvent("Connection Established.")
ENDFUNCTION

``Net Merge: Gathers all initial information for the connecting client before letting the client into the main loop.
FUNCTION net_merge()
   NET PUT BYTE PACKET_LOGIN
   NET SEND 1 
   REPEAT
      net_recieve()
   UNTIL usr.connection = IS_LOGGED_IN
   debug_addEvent("Merge Complete.")
ENDFUNCTION

``Net Recieve: Recieves any information.
FUNCTION net_recieve()
   WHILE NET GET MESSAGE()
      SELECT NET GET BYTE()
         IF usr.connection = IS_LOGGED_IN
            CASE PACKET_DATA:
               WHILE NET GET MESSAGE REMAINDER()
                  ID = NET GET BYTE()
                  IF plr_exist(ID)
                     index = plr_IDtoIndex(ID)
                     players(index).connection = NET GET BYTE()
                     players(index).msg$ = NET GET STRING()
                  ENDIF
               ENDWHILE
            ENDCASE
            CASE PACKET_INFO:
               ID = NET GET BYTE()
               index = plr_IDtoIndex(ID)
               players(index).IP$ = NET GET STRING()
            ENDCASE
            CASE PACKET_PROCESS:
               ID = NET GET BYTE()
               index = plr_IDtoIndex(ID)
            ENDCASE
         ENDIF      
         CASE PACKET_LOGIN:
            ID = NET MESSAGE FROM()
            NET PUT BYTE PACKET_SETUP
            NET PUT BYTE ID
            FOR p = 1 TO net.players
               NET PUT BYTE players(p).ID
            NEXT p
            NET SEND ID
            plr_create(ID)
         ENDCASE
         CASE PACKET_SETUP:
            usr.ID = NET GET BYTE()
            WHILE NET GET MESSAGE REMAINDER()
               plr_create(NET GET BYTE())
            ENDWHILE
            plr_create(usr.ID)
            usr.connection = IS_LOGGED_IN
         ENDCASE         
      ENDSELECT
   ENDWHILE  
ENDFUNCTION

``Net Process: Process / Evaluate user-recieved data on the server-side and client-side.
FUNCTION net_process()
   FOR p = 1 TO net.players
      IF usr.status$ = "H"
         //edit player information here, server-side.
      ELSE
         //edit player information here, client-side.
      ENDIF
      //edit player information here, client / server - side.
   NEXT p
ENDFUNCTION

``Net Send: Sends all relevant data to the host and clients.
FUNCTION net_send()
   IF (TIMER()-net.packettime#) / 1000 >= net.packetdelay#
      net.packettime# = TIMER()
      IF net.players > 1
         IF usr.status$ = "H"   
            FOR p = 1 TO net.players
               //Put all data that needs to be sent from clients, through the host, 
               //to the other clients, in packet data.
               //Things like chat messages.
               NET PUT BYTE PACKET_DATA
               NET PUT BYTE players(p).ID
               NET PUT BYTE players(p).connection
               NET PUT STRING players(p).msg$
               NET SEND ALL
               //Put all data that is obtained by the host that the clients require,
               //in packet info. (Updated positions, health, kill stats, IP addresses,
               // etc.)
               NET PUT BYTE PACKET_INFO
               NET PUT BYTE players(p).ID
               NET SEND ALL
            NEXT p
         ELSE
            NET PUT BYTE PACKET_DATA
            NET PUT BYTE usr.ID
            NET PUT BYTE players(usr.ID).connection
            NET PUT STRING usr.msg$
            NET SEND
            //Put all data that clients send to the host to be processed, but not sent
            //directly back, in packet process.
            NET PUT BYTE PACKET_PROCESS
            NET PUT BYTE usr.ID
            NET SEND
         ENDIF
      ENDIF
   ENDIF
ENDFUNCTION

``Net Send All Except: Sends the last pushed data to all users except ID.
FUNCTION net_sendallexcept(ID)
   FOR p = 1 TO net.players
      IF p <> ID THEN NET SEND p
   NEXT p
ENDFUNCTION

``Net Update: Updates any relevant information, clears buffers, removes disconnected players, etc.
FUNCTION net_update()
   IF usr.status$ = "H"
      in = NET PLAYER JOINED()
      out = NET PLAYER LEFT()
      IF in
         debug_addEvent("Player joined session.")
      ENDIF
      IF out
         debug_addEvent("Player left session.")
         plr_delete(out)
      ENDIF  
   ELSE
      IF NET CONNECTED() = 0
         debug_addEvent("Connection lost: " + NET GET ERROR())
      ENDIF   
   ENDIF
   IF usr.connection = IS_LOGGED_IN THEN plr_cleanup()
ENDFUNCTION

``Net Handle: Handles the 4 main net functions.
FUNCTION net_handle()
   net_recieve()
   net_process()
   net_send()
   net_update()
ENDFUNCTION

``Net Kick: Removes player from the game
FUNCTION net_kick(ID)
   NET KICK ID
ENDFUNCTION

`````````````````````````
```````````plr_``````````
`````````````````````````

``Plr Create: Adds the player's ID to the player array, and updates net.players.
FUNCTION plr_create(ID)
   INC net.players
   ARRAY INSERT AT BOTTOM players(0)
   players(net.players).ID = ID
ENDFUNCTION

``Plr Delete: Removes the player ID from the player list.
FUNCTION plr_delete(ID)
   index = plr_IDtoIndex(ID)
   players(index).connection = IS_DISCONNECTED
ENDFUNCTION

``Plr CleanUp: Removes any disconnected players from the players array
FUNCTION plr_cleanup()
   FOR p = 1 TO net.players
      IF net.players = ARRAY COUNT(players(0))
         IF players(p).connection = IS_DISCONNECTED
            ARRAY DELETE ELEMENT players(0),p
            p = 0
            INC total
         ENDIF
      ENDIF
   NEXT p
   DEC net.players, total
ENDFUNCTION

``Plr Exist: Returns 1 if the player's ID exists
FUNCTION plr_exist(ID)
   FOR p = 1 TO net.players
      IF players(p).ID = ID
         retval = 1
         EXIT
      ENDIF
   NEXT p
ENDFUNCTION retval

``Plr IDtoIndex: Converts an ID to an array index for the players array
FUNCTION plr_IDtoIndex(ID)
   FOR p = 1 TO net.players
      IF players(p).ID = ID
         retval = p
         EXIT
      ENDIF
   NEXT p
ENDFUNCTION retval

`````````````````````````
```````````debug_````````
`````````````````````````

``Debug Output: Outputs debug array to screen via print. Set removeWhenDisplayed
`               to 1 to remove the event from the debug array after printing it.
FUNCTION debug_output(removeWhenDisplayed)
   FOR e = 1 TO ARRAY COUNT(debug())
      PRINT debug_getOldestEvent(removeWhenDisplayed)
      e = 1
   NEXT e
ENDFUNCTION

``Debug Add Event: Adds event$ to the debug array.
FUNCTION debug_addEvent(event$)
   ARRAY INSERT AT BOTTOM debug()
   index = ARRAY COUNT(debug())
   debug(index).event$ = event$
ENDFUNCTION

``Debug Get Last Event: Gets the most recent event, set removeWhenGiven to 1 to delete
`                       the event from the debug array after returning it.
FUNCTION debug_getLastEvent(removeWhenGiven)
   ret$ = debug(ARRAY COUNT(debug())).event$
   IF removeWhenGiven THEN ARRAY DELETE ELEMENT debug(), ARRAY COUNT(debug())
ENDFUNCTION ret$

``Debug Get Oldest Event: Gets the oldest event, set removeWhenGiven to 1 to
`                         delete the event from the debug array after returning it.
FUNCTION debug_getOldestEvent(removeWhenGiven)
   ret$ = debug(1).event$
   IF removeWhenGiven THEN ARRAY DELETE ELEMENT debug(), 1
ENDFUNCTION ret$

``Debug Clear Events: Clears the debug array.
FUNCTION debug_clearEvents()
   UNDIM debug()
   DIM debug(0) AS debug
ENDFUNCTION

``Debug Save: Saves the debug array to the specified file.
FUNCTION debug_save(prefix$, directory$, file)
   IF prefix$ = "" THEN prefix$ = APPNAME$()
   currentDir$ = GET DIR$()
   IF directory$ <> "" THEN SET DIR directory$
   REPEAT
      INC suffix
   UNTIL FILE EXIST(prefix$ + STR$(suffix) + ".debug") = 0
   name$ = prefix$ + STR$(suffix) + ".debug"
   OPEN TO WRITE file, name$
      WRITE STRING file, APPNAME$() + " Debug Log: "
      WRITE STRING file, GET DATE$() + " | " + GET TIME$()
      events = ARRAY COUNT(debug())
      FOR e = 1 TO events
         WRITE STRING file, debug(e).event$
      NEXT e
      WRITE STRING file, "-- Debug End --"
   CLOSE FILE file
   SET DIR currentDir$  
ENDFUNCTION

``Debug Clear Files: Deletes all files with .debug extension in the specified directory.
FUNCTION debug_clearFiles(directory$)
   FIND FIRST
   REPEAT
      file$ = GET FILE NAME$()
      IF RIGHT$(file$,6) = ".debug"
         DELETE FILE file$
      ENDIF
      FIND NEXT
   UNTIL file$ = ""
ENDFUNCTION

`````````````````````````````````````````````````````````````````````````````
`///////////////////////////////////////////////////////////////////////////`
`/ Help Files :                                                            /`
`/                                                                         /`
`/`````````````````````````````````````````````````````````````````````````/`
`/ NET CONNECT                                                             /`
`/                                                                         /`
`/ Description: Attempt to connect to / host a server. The IP$ address is  /`
`/              the IP of the host's computer. Status is either a 0 for    /`
`/              client (connecting to a server), or 1 for host (creating a /`
`/              server). Maxplayers is only needed for the host, and       /`
`/              sets the maximum number of clients allowed in the game     /`
`/              before it is automatically closed (limited by the max      /` 
`/              number of ports allowed open and how fast the CPU runs).   /`
`/                                                                         /`
`/ Syntax: net_connect( IP$, status$, maxplayers )                         /`
`/                                                                         /`
`/`````````````````````````````````````````````````````````````````````````/`
`/ NET ENABLE                                                              /`
`/                                                                         /`
`/ Description: Adds the current program to Windows Firewall's "Allow"     /`
`/              list.                                                      /`
`/                                                                         /`
`/ Syntax: net_enable()                                                    /`
`/                                                                         /`
`/`````````````````````````````````````````````````````````````````````````/`
`/ NET INIT                                                                /`
`/                                                                         /`
`/ Description: Initializes any important network data.                    /`  
`/                                                                         /`
`/ Syntax: net_init()                                                      /`
`/                                                                         /`
`/`````````````````````````````````````````````````````````````````````````/`
`/ NET KICK                                                                /`
`/                                                                         /`
`/ Description: Kicks the player with the specified ID from                /`
`/              the game.                                                  /`  
`/                                                                         /`
`/ Syntax: net_kick( ID )                                                  /`
`/                                                                         /`
`/`````````````````````````````````````````````````````````````````````````/`
`/ NET MERGE                                                               /`
`/                                                                         /`
`/ Description: Called when a client has successfully connected to a       /`
`/              server. This stops the client from continuing into the     /`
`/              main loop until they recieve PACKET_SETUP from the host,   /`
`/              at which point their connection is set to IS_LOGGED_IN.    /`  
`/              Place any relevant authentication / setup data in the      /`
`/              PACKET_SETUP packet that the client requires from the host /`
`/              to join the game. Place any relevant auth / setup data     /`
`/              in the PACKET_LOGIN packet that the host requires from the /`
`/              client to add them to the player's list of logged in       /`
`/              players.                                                   /`
`/                                                                         /`
`/ Syntax: net_merge()                                                     /`
`/                                                                         /`
`/`````````````````````````````````````````````````````````````````````````/`
`/ NET PROCESS                                                             /`
`/                                                                         /`
`/ Description: This should be called in the main game loop, after         /`
`/              net_recieve() and before net_send(). Any processing the    /`
`/              host or clients need to do on recieved data before sending /`
`/              it back out should go here. (For example, if the host      /`
`/              recieves a value indicating if a client is attempting to   /`
`/              move forward, the host would then calculate the client's   /`
`/              new position, and then possibly check for collision, in    /`
`/              this function. Then the host would send out this position  /`
`/              to all other clients in the net_send() function inside of  /`
`/              the PACKET_INFO.                                           /`  
`/                                                                         /`
`/ Syntax: net_process()                                                   /`
`/                                                                         /`
`/`````````````````````````````````````````````````````````````````````````/`
`/ NET RECIEVE                                                             /`
`/                                                                         /`
`/ Description: Checks if any new packets have arrived. If one is found,   /`
`/              it figures out which type of packet it is (based on the    /`
`/              packet protocol used - all packets have a byte representing/`
`/              which packet they are (check the packet information        /`
`/              at the top of the page for more info). Once the packet     /`
`/              is determined, the message is stored in the appropriate    /`
`/              manner, and another check is made for a new packet.        /`
`/                                                                         /`
`/ NOTE: Its very important to calibrate your net.packetdelay#             /`
`/       value with the frame rate of the clients. If a                    /`
`/       client's frame rate is low, its a good idea to send               /`
`/       packets less often, otherwise a large qeue of packets             /`
`/       will build up, and the clients wont be able to leave              /`
`/       the net recieve function's while-loop.                            /`
`/                                                                         /`          
`/ Syntax: net_recieve()                                                   /`
`/                                                                         /`
`/`````````````````````````````````````````````````````````````````````````/`
`/ NET SEND                                                                /`
`/                                                                         /`
`/ Description: Checks if the time since the last data send is at least    /`
`/              equal to the net.packetdelay# variable. If so,             /`
`/              all necessary packets are sent out (to the host if         /`
`/              the user is a client, otherwise to all clients if          /`
`/              the user is a host). See the packet information            /`
`/              at the top of the page for more info.                      /`
`/                                                                         /`  
`/ NOTE: Its very important to calibrate your net.packetdelay#             /`
`/       value with the frame rate of the clients. If a                    /`
`/       client's frame rate is low, its a good idea to send               /`
`/       packets less often, otherwise a large qeue of packets             /`
`/       will build up, and the clients wont be able to leave              /`
`/       the net recieve function's while-loop.                            /`
`/                                                                         /`
`/ Syntax: net_send()                                                      /`
`/                                                                         /`
`/`````````````````````````````````````````````````````````````````````````/`
`/ NET SEND ALL EXCEPT                                                     /`
`/                                                                         /`
`/ Description: Will send the current message to all users except for      /`
`/              the specified ID.                                          /`  
`/                                                                         /`
`/ Syntax: net_sendallexcept( ID )                                                      /`
`/                                                                         /`
`/`````````````````````````````````````````````````````````````````````````/`
`/ NET START                                                               /`
`/                                                                         /`
`/ Description: This is an example command provided for a quick game setup./`
`/              It prompts the user for their status, IP$, and maxplayers, /`
`/              via the input / print commands, and then calls             /`
`/              net connect.                                               /`
`/                                                                         /`
`/ Syntax: net_start()                                                     /`
`/                                                                         /`
`/`````````````````````````````````````````````````````````````````````````/` 
`/ NET UPDATE                                                              /`
`/                                                                         /`
`/ Description: Updates any variables / calls any functions that the       /`
`/              library requires to work. Also checks if any players have  /`
`/              left or joined (required by Multisync), or if the current  /`
`/              user has lost their connection.                            /`
`/                                                                         /`
`/ NOTE: Should be called after net_recieve, net_handle, and net_send.     /`  
`/                                                                         /`
`/ Syntax: net_update()                                                    /`
`/                                                                         /`
`/`````````````````````````````````````````````````````````````````````````/`
`/ PLR CLEANUP                                                             /`
`/                                                                         /`
`/ Description: Cycles through all players, checking if any have been      /`
`/              disconnected. If so, they are removed from the players     /`
`/              array, and net.players is updated accordingly.             /`  
`/                                                                         /`
`/ Syntax: plr_cleanup()                                                   /`
`/                                                                         /`
`/`````````````````````````````````````````````````````````````````````````/`
`/ PLR CREATE                                                              /`
`/                                                                         /`
`/ Description: Adds a new player to the players array, with the ID        /`
`/              specified. Also updates net.players. It's recommend you    /`
`/              call any player creation commands from this function       /`
`/              (loading their character for example).                     /`  
`/                                                                         /`
`/ Syntax: plr_create( ID )                                                /`
`/                                                                         /`
`/`````````````````````````````````````````````````````````````````````````/`
`/ PLR DELETE                                                              /`
`/                                                                         /`
`/ Description: This command will set the player's connection status to    /`
`/              -1 (IS_DISCONNECTED). It will NOT remove them from the     /`
`/              players list. That is done by plr_cleanup. The reason for  /`
`/              this is so the host can send out the player's connection   /`
`/              status to all other players first, allowing them to set    /`
`/              the player's connection status to IS_DISCONNECTED as well, /`
`/              at which time plr_cleanup will be called soon after,       /` 
`/              perfmanently removing them from the players array.         /`  
`/                                                                         /`
`/ Syntax: plr_delete( ID )                                                /`
`/                                                                         /`
`/`````````````````````````````````````````````````````````````````````````/`
`/ PLR EXIST                                                               /`
`/                                                                         /`
`/ Description: Checks if the specified ID exists in the players
`/              array.                                                     /`  
`/                                                                         /`
`/ Syntax: plr_exist( ID )                                                 /`
`/                                                                         /`
`/`````````````````````````````````````````````````````````````````````````/`
`/ PLR ID TO INDEX                                                         /`
`/                                                                         /`
`/ Description: Converts an ID number to an array index number in the      /`
`/              players array.                                             /`  
`/                                                                         /`
`/ Syntax: plr_IDtoIndex( ID )                                             /`
`/                                                                         /`
`/`````````````````````````````````````````````````````````````````````````/`
`/ DEBUG ADD EVENT                                                         /`
`/                                                                         /`
`/ Description: Adds the string event$ to the debug array.                 /`  
`/                                                                         /`
`/ Syntax: debug_addEvent( event$ )                                        /`
`/                                                                         /`
`/`````````````````````````````````````````````````````````````````````````/`
`/ DEBUG CLEAR EVENTS                                                      /`
`/                                                                         /`
`/ Description: Clears all events from the debug array                     /`  
`/                                                                         /`
`/ Syntax: debug_clearEvents()                                             /`
`/                                                                         /`
`/`````````````````````````````````````````````````````````````````````````/`
`/ DEBUG CLEAR FILES                                                       /`
`/                                                                         /`
`/ Description: Deletes all files with an extension of .debug from the     /`
`               specified directory$.                                      /`  
`/                                                                         /`
`/ Syntax: net_clearFiles()                                                /`
`/                                                                         /`
`/`````````````````````````````````````````````````````````````````````````/`
`/ DEBUG GET LAST EVENT                                                    /`
`/                                                                         /`
`/ Description: Returns the last event to be recorded. Setting             /`
`/              removeWhenGiven to 1 will delete the event from the array  /`
`/              after returning it.                                        /`  
`/                                                                         /`
`/ Syntax: debug_getLastEvent( removeWhenGiven )                           /`
`/                                                                         /`
`/`````````````````````````````````````````````````````````````````````````/`
`/ DEBUG GET OLDEST EVENT                                                  /`
`/                                                                         /`
`/ Description: Returns the oldest event to be recorded. Setting           /`
`/              removeWhenGiven to 1 will delete the event from the array  /`
`/              after returning it.                                        /`  
`/                                                                         /`
`/ Syntax: debug_getOldestEvent( removeWhenGiven )                         /`
`/                                                                         /`
`/`````````````````````````````````````````````````````````````````````````/`
`/ DEBUG OUTPUT                                                            /`
`/                                                                         /`
`/ Description: Prints all of the events recorded in the debug() array     /`
`/              in order of oldest to most recent. Set removeWhenDisplayed /`
`/              to 1 to delete the events as they are printed.             /`
`/                                                                         /`
`/ Syntax: debug_output( removeWhenDisplayed )                             /`
`/                                                                         /`
`/`````````````````````````````````````````````````````````````````````````/`
`/ DEBUG SAVE                                                              /`
`/                                                                         /`
`/ Description: Saves the entire debug array to a file. prefix$ is the     /`
`/              name of the file, and defaults to the application's name   /`
`/              if empty quotes are given. Directory$ is where the file is /`
`/              to be saved to, and defaults to the current working        /`
`/              directory if empty quotes are given. File is a free file   /`
`/              number to use for the file creation.                       /`
`/              All debug files are saved with a .debug prefix. A check    /`
`/              is made when the debug_save() command is called to see     /`
`/              how many files exist in the directory with the prefix      /`
`/              specified. All debug files have numbers at the end. This   /`
`/              allows you to use the same prefix file name as many times  /`
`/              as you want, and the files will be created with a numbered /`
`/              suffix (eg; mygame1.debug, mygame2.debug, mygame3.debug).  /`
`/                                                                         /`
`/ Syntax: debug_save( prefix$, directory$, file )                         /`
`/                                                                         /`
`///////////////////////////////////////////////////////////////////////////`
`````````````````````````````````````````````````````````````````````````````