DAZZLE'S UPGRADE PACK

If you haven't already done so, upgrade your game by downloading Dazzle's all-in-one upgrade pack. It comes with everything you need for today's servers. Does your blue bar freeze when joining servers? Do you lag in games? Do you get an annoying siren in Phobik's Servers? This is what you need. CLICK HERE TO DOWNLOAD.

New TT Admin Script? AND/OR TT Community Stat Tracker

Modding questions, answers, help.....

Moderators: Warfare, Admin, Moderator

User avatar
ishbuu
New Brainjar
New Brainjar
Posts: 14
Joined: Fri Feb 16, 2007 7:27 pm

New TT Admin Script? AND/OR TT Community Stat Tracker

Post by ishbuu »

Anybody out there who wants (and is able to) clean up a nightmarishly large amount of code I've written? I'll release it publicly later, but I've been up since yesterday 6AM and I need bed. Also someone who could help me would be greatly appreciated.

BTW: For all of those who it matters to: All the admin stuff needs overhauling, in particular anything that handles new FileObjects and stuff, you are, in fact, supposed to delete those when you're done. :P I have an rewritten admin base that in theory works but is probably buggy as hell too, being as I wrote that at 3AM after being up for 21 hours.

Poke me on IMs or pms, or slap me around here, till then.

ishy

EDIT: New server topic, since i hijacked my own topic. :)
Last edited by ishbuu on Mon Feb 19, 2007 2:19 am, edited 1 time in total.
Image
User avatar
ishbuu
New Brainjar
New Brainjar
Posts: 14
Joined: Fri Feb 16, 2007 7:27 pm

Post by ishbuu »

Good of you all to answer so fast. Anyway. I ripped out most of my specific features and proper functionality and hacked together some stuff. This a very basic and very broken version of my admin system, I've ripped out all my little treats (they're mostly useful to me only i would imagine, anybody who needs something like that can probably hack em back in in minutes. Do NOT try to use this for your server if you are not a good scripter, hell even if you are you're better off with a more fleshy one. This one DOES on the other hand have a bunch of my little tricks, including proper use of TCP and FileObjects (fekin delete them when you're done o.O) Includes writing new files and synching time with a global server. The time system is very rigid and not very clean, but hell. You could use it for some neat things, like making the map dynamicly change its sky and lighting and such at different times of realtime day. The logging system is very unclean, it would be best to split it up into new functions, like logServerAction and logChat and logChatAction. Its only set up to log what i thought relevent, but it works very similarly to Warfare's script (call logAction(text);) I'd like to see what people can do with these tricks. Cheers.

http://premium1.uploadit.org/Ishbuu//ishyTestStuff.zip

Don't download unless you think you can work with it, I only have so much bandwidth ;)

// ishy
Image
NUTS!
Veteran Light
Veteran Light
Posts: 1187
Joined: Wed Dec 27, 2006 9:18 pm
Location: Wisconsin

Post by NUTS! »

Cool thanks. I gave it a quick once over look nice. Don't think anyone would like to play "nightime" and/or dark server though. However, it would be interesting to synce the servers. I like it that it that its small. Most the time I just hack out everything but the /ban and banlist(and stuff related to that). Could you elaborate on the TCP functions, or point me in the right direction. I have acces to most GG forums so if you know anything there please shoot me over.

I see were the codes are, cept for admin login..
User avatar
ishbuu
New Brainjar
New Brainjar
Posts: 14
Joined: Fri Feb 16, 2007 7:27 pm

Post by ishbuu »

99% chance I ripped it out by mistake ^_^

You'll need to know a bit about how the internet works. I am NOT explaining ports. I'm not going to explain most of the commands I do unless its some internet hackery that you don't need to know as a game server admin.

Writing it in is as simple as a check back against your thing and set the client's admin flag to true, stealth admin-ing is also useless imo, you can see I'm finicky ;) I didn't write in all dash's little bells and whistles, mainly because I see them as useless. I really do hate excess, makes the code sloppy (i hope you can tell i try to keep my code neat, or at least what i think is neat)

RANT: I hate it when people use tabs HATE IT HATE IT HATE IT screws up formatting for those who use a proper hit space 3 times (torque standard, and one I always use, even in my C++ code) plus it screws up sooo much when you're trying to format things properly in tribalIDE growl.[/rant]
Anyway, on to TCPObjects...

The basic TCPObject stuff is chatted about in the script tcpobject.cs, i don't wanna really check if i left everything there so...

The basic console functions are....

Code: Select all

connect( addr )

Purpose:
Use the connect method to request a connection to a remote agent at the address addr.

Syntax
addr – A string containing an address of the form: “A.B.C.D:Port”, where A .. B are standard IP numbers between 0 and 255 and Port can be between 1000 and 65536.

Returns
No return value.

Code: Select all

disconnect()

Purpose
Use the disconnect method to close a previously opened connetion without destroying the requesting TCPOpbject.

Returns
No return value.

Notes
This will close any open connection, but not destroy this object. Thus, the object can be used to open a new connection.

Code: Select all

listen( port )

Purpose
Use the listen method to allow this TCPObject to accept connections on the specified port.

Syntax
port – A value between 1000 and 65536.

Returns
No return value.

Code: Select all

send( ... )

Purpose
Use the send method to send any number of parameters, as strings, one at a time to the agent at the other end of the connection.

Syntax
... – Any number of arguments, as strings. Each string is sent separately. i.e. The arguments are not concatenated.

Returns
No return value.
Simple enough.

the basic functions you can code for are as follows:

Code: Select all

function TCPObject::onDNSResolved(%this) { }
function TCPObject::onDNSFailed(%this) { }
function TCPObject::onConnected(%this) { }
function TCPObject::onConnectFailed(%this) { }
function TCPObject::onDisconnect(%this) { }
function TCPObject::onLine(%this, %line) { }
function TCPObject::onConnectRequest(%this,%address,%tag) { }
I expanded the onDisconnect to automatically delete the object, avoid excess cleanup, as if i ever disconnect i'll probably nuke the object, since I never used it for connecting to anything other than the server. I could leave the tcpobject, name it, and use it over and over and delete it if i was done. An example use of this would be reading across a registry that was sorted by a bunch of servers. Instead of rapidly creating and deleting, you could connect to different ips through the same tcpobject as you progressed. but since I'm not doing anything very complex like that (it'd be far more efficient to use some external program for this anyway) i just delete it on disconnect....

Now say instead of my default blank online i set it to echo %line, i could do something fancy liiike...

Code: Select all

new tcpobject(tcpobj);
tcpobj.connect("www.microsoft.com:80");
This should give you two messages. The first being “DNS Resolved” and the second message should be the “Connected” message. You may also receive “DNS Failed” followed by “Connection Failed”. These four functions can be used to expand the capabilities of your project by automating connection retries, and handling successful connections.

You should get the echo “Connected”, this will be useful for automatically performing commands on connection such as security handshakes or to make a request for information. I used the domain name, but you can manually input an IP addy if you please. ( IP addresses bypass the DNS stuff, just internet stuff)

Once we have, a connection the fifth function (online) will handle information received from the server. To see how it works we need to send something to the server to get a response to display. Since we are connected to the Microsoft web server, let us see what will happen when we request the root page by sending an HTTP GET command with the TCP Object send function.

Code: Select all

tcpobj.send("GET / \r\n");
The GET / just requests the main page (http://www.microsoft.com/) - the \r\n though is absolutely key. That is how one calls the Carriage Return, Line Feed pair to the server. That will make the server you are connected to execute the command you just sent. On your screen, you should have seen a lot of text scroll by prefixed by “TCP:” those lines are the html text for the default webpage. Our current functions just echo the lines out prefixed by “TCP:” we could just as easily saved the lines to a file, or parsed each line looking for information, like a net browser would.

Now for the time hackery. My code is a very a simple example of a common TCP connection. It works with the Daytime Protocol on TCP port 13. More specifically, it works with the NIST (National Institute of Standards and Technology - http://www.boulder.nist.gov) version of this protocol. The NIST code is returned in this format:

JJJJJ YR-MO-DA HH:MM:SS TT L H msADV UTC(NIST) OTM
  • - JJJJJ is the Modified Julian Date (MJD). The MJD is the last five digits of the Julian Date, which is simply a count of the number of days since January 1, 4713 B.C. To get the Julian Date, add 2.4 million to the MJD.

    - YR-MO-DA is the date. It shows the last two digits of the year, the month, and the current day of month.

    - HH:MM:SS is the time in hours, minutes, and seconds. The time is always sent as Coordinated Universal Time (UTC). An offset needs to be applied to UTC to obtain local time. For example, Mountain Time in the U. S. is 7 hours behind UTC during Standard Time, and 6 hours behind UTC during Daylight Saving Time.

    - TT is a two digit code (00 to 99) that indicates whether the United States is on Standard Time (ST) or Daylight Saving Time (DST). It also indicates when ST or DST is approaching. This code is set to 00 when ST is in effect, or to 50 when DST is in effect. During the month in which the time change actually occurs, this number will decrement every day until the change occurs. For example, during the month of October, the U.S. changes from DST to ST. On October 1, the number will change from 50 to the actual number of days until the time change. It will decrement by 1 every day until the change occurs at 2 a.m. local time when the value is 1. Likewise, the spring change is at 2 a.m. local time when the value reaches 51.

    - L is a one-digit code that indicates whether a leap second will be added or subtracted at midnight on the last day of the current month. If the code is 0, no leap second will occur this month. If the code is 1, a positive leap second will be added at the end of the month. This means that the last minute of the month will contain 61 seconds instead of 60. If the code is 2, a second will be deleted on the last day of the month. Leap seconds occur at a rate of about one per year. They are used to correct for irregularity in the earth's rotation. The correction is made just before midnight UTC (not local time).

    - H is a health digit that indicates the health of the server. If H=0, the server is healthly. If H=1, then the server is operating properly but its time may be in error by up to 5 seconds. This state should change to fully healthy within 10 minutes. If H=2, then the server is operating properly but its time is known to be wrong by more than 5 seconds. If H=4, then a hardware or software failure has occurred and the amount of the time error is unknown.

    - msADV displays the number of milliseconds that NIST advances the time code to partially compensate for network delays. The advance is currently set to 50.0 milliseconds.

    - The label UTC(NIST) is contained in every time code. It indicates that you are receiving Coordinated Universal Time (UTC) from the National Institute of Standards and Technology (NIST).

    - OTM (on-time marker) is an asterisk (*). The time values sent by the time code refer to the arrival time of the OTM. In other words, if the time code says it is 12:45:45, this means it is 12:45:45 when the OTM arrives.
I don't compensate for most of this, it may be needed for keeping say a computers internal clock proper, but its possible to do most conversions in your head, and I didn't bother with anything more. You could in theory synch it to a local server, but i'm not even going to touch that.

Its also very possible to expand it to access a POP3 mailbox, again useless in practical purposes.

For those of you still reading (congrats) here's some on FileObject.

First FileI/O functions

Code: Select all

expandFilename( filename )

Purpose
Use the expandFilename function to convert a relative path name to a full path name.

Syntax
filename – A string containing the relative or full path and file name of an existing or new file.

Returns
Returns a string containing the expanded path to the specified file.

expandFilename("~/data/sound/testing.wav");

Code: Select all

fileBase( filename )

Purpose
Use the fileBase function to get the name of a file from a relative or full path, not including the file extension.

Syntax
filename – A string containing the relative or full path and file name of an existing or new file.

Returns
Returns an unadorned file name without a path or file extension.

fileBase(“egt/main.cs”); // will return “main”

Code: Select all

fileExt( filename )

Purpose
Use the fileExt function to get the extension of a file from a relative or full path, not including the file extension.

Syntax
filename – A string containing the relative or full path and file name of an existing or new file.

Returns
Returns a file extension, including the dot (.).

Notes
If asterisks are present in an extension, as passed in filename, they will not be expanded in the return value.

fileExt(“script.cs”); // will return “.cs”

Code: Select all

fileName( filename )

Purpose
Use the fileName function to get the filename and extension of a file from a relative or full path, not including the file extension.

Syntax
filename – A string containing the relative or full path and file name of an existing or new file.

Returns
Returns a string containing the full name of a file less any path before the name.

Notes
If asterisks are present in an file name, as passed in filename, they will not be expanded in the return value.

fileName(“egt/main.cs”); // will return “main.cs”

Code: Select all

filePath( filename )

Purpose
Use the fileBase function to get all parts of a path up to, but not including the last slash (/).

Syntax
filename – A string containing the relative or full path and file name of an existing or new file.

Returns
Returns a string containing the relative or full path portion of filename.

Notes
If asterisks are present in any part of the path, as passed in filename, they will not be expanded in the return value.

filePath(“common/ui/defaultProfiles.cs”); // Will return “common/ui”

Code: Select all

findFirstFile ( pattern )

Purpose
Use the findFirstFile function to find the first file matching pattern.

Syntax
pattern – A full or partial path, followed by a full or partial filename, or any combination of these two elements.

Returns
Returns a full path to the first file name matching pattern. Returns a NULL string, when no matches are found.

Notes
This function will search all directories in the modpath, as created by setModPaths. Each time this function is called it will reset an internal variable tracking the current position in the file list. So, multiple routines calling this in an overlapping fashion will clobber each other.

findFirstFile(“*.cs”);

Code: Select all

findNextFile ( pattern )

Purpose
Use the findNextFile function to find the next file matching pattern.

Syntax
pattern – A full or partial path, followed by a full or partial filename, or any combination of these two elements.

Returns
Returns a full path to the next file name matching pattern. Returns a NULL string, when no matches are found.

Notes
This function will search all directories in the modpath, as created by a call to setModPaths. Also, this function requires that findNextFile be called at least with the same pattern, some time prior to calling this function.

findNextFile( “*.cs” );

Code: Select all

getFileCount ( pattern )

Purpose
Use the getFileCount function to determine how many files exist in modpaths that match the specified pattern.

Syntax
pattern – A full or partial path, followed by a full or partial filename, or any combination of these two elements.

Returns
Returns a zero if no matches are found, or a positive integer value specifying how many matches there were.

getFileCount(“*.cs”);

Code: Select all

getFileCRC( filename )

Purpose
Use the getFileCRC function to calculate the Cyclic-Redundancy-Check (CRC) value for a file as specified by the partial or full path in filename.

Syntax
filename – A string containing the relative or full path and file name of an existing or new file.

Returns
Returns a non-zero positive integer value corresponding to this file's CRC.

Notes
CRC values are useful for checking to see if two same named files are actually the same. If a client file of the same path and name as a file on the server has a differnt CRC from the server version, then the files are NOT the same, otherwise they highly likely to be the same. Although it is theoretically possible for two non-matching files to have matching CRCs, the odds are very much against it.

getFileCRC(“/fps/client/scripts/script/cs”);

Code: Select all

isFile( filename )

Purpose
Use the isFile function to determine whether the value in filename is in fact an existing file.

Syntax
filename – A string containing the relative or full path and file name of an existing file.

Returns
Returns true if the file exists, false otherwise.

See Also
isWriteableFileName

isFile(“/fps/client/scripts/script.cs”);

Code: Select all

isWriteableFileName( filename )

Purpose
Use the isWriteableFileName function to determine whether the value in filename is in fact an existing file and it can be written to.

Syntax
filename – A string containing the relative or full path and file name of an existing file.

Returns
Returns true if the file exists and can be written to, false otherwise.

isWriteableFileName(“/fps/client/scripts/script.cs”);
Using FileObject:

To begin we will look at how we can create a new FileObject

Code: Select all

%file = new FileObject();
Seems simple enough doesn’t it. But let’s go over each part of the line to ensure we know what is there.
First we have a local variable named %file. This will hold the object reference to the FileObject we create. By using a local variable we limit the scope of our interaction with the FileObject to the current function we are in. The FileObject itself could be accessed globally, if you know the object reference.
Next we have the “new” statement. This tells the game engine to create a new instance of the object type that follows this command; in our case this is the FileObject. The FileObject has parenthesis following the name, this doesn’t mean this is a function, instead it allows you to give you specific instance of a FileObject a name that could be used in place of the object reference.
For example, we could use a global variable, as well as give our FileObject a name for easy reference.

Code: Select all

$file = new FileObject(“myFile”);
Using the FileObject
Now that we have our FileObject created. Let’s write some information to the file.

Code: Select all

%file = new FileObject();
%file.OpenForWrite(“game/test.txt”);
%file.writeline(“This is the test file.”);
OK we’ve just seen two new methods the OpenForWrite method and the writeline method. OpenForWrite will open a file if it exists or it will create a new file if it doesn’t. If the file you name already has content, it will be erased. The writeline method does what it says. It writes a single line of text to a file.
If we wish to open an existing file and add to it we will use the OpenForAppend method. This works the same as the OpenForWrite, but doesn’t erase the existing content of a file.

Code: Select all

%file = new FileObject();
%file.OpenForAppend(“game/test.txt”);
%file.writeline(“This is the test file.”);
Next, we may wish to read data from a file. To do so we will use the OpenForRead method. Paired with the OpenForRead method we use the readline method.

Code: Select all

%file = new FileObject();
%file.OpenForRead(“game/test.txt”);
%line = %file.readline();
You will see that we added a new variable named %line, we use this to store the return value from the FileObject method readline, which is the current line of the file.
Input Control

Now that we are reading in the file, we want to make sure we don’t try to read past the end of the file. So we use another method named isEOF, which returns a True value if we are at the end of the file.

Code: Select all

%file = new FileObject();
%file.OpenForRead(“game/test.txt”);
while( !%file.isEOF() )
{
   %line = %file.readline();
   echo(%line);
}
Keeping things neat:

Now that we have seen how to open, write, append and read a file… we need to learn what to do when we are done with a file. There are two things you can do. The first is to use the close method.

Code: Select all

%file = new FileObject();
%file.OpenForWrite(“game/test.txt”);
%file.writeline(“This is the test file.”);
%file.close();
Once you have closed the file, you could reuse the FileObject to open a new file in a with a new method. The other option is to destroy the FileObject using the delete method.

Code: Select all

%file = new FileObject();
%file.OpenForWrite(“game/test.txt”);
%file.writeline(“This is the test file.”);
%file.close();
%file.delete();
Covers just bout it all. Gratz if you read it all.

// ishy
Image
User avatar
ishbuu
New Brainjar
New Brainjar
Posts: 14
Joined: Fri Feb 16, 2007 7:27 pm

Post by ishbuu »

New post, different topic entirely :)

With a good php hacker it could be very possible to put up some kind of global tracker for participating TT servers/admins. Could even have commands ingame like /rank, have the server query the main database, and then have it return the players kills, deaths, k/dr, points, flag caps, seconds in the hill, whatever's relevant at the time. Seeing some kind of community co-ordination in something like this would be very cool. It would be greatly appreciated if someone could clean up my admin script for every day use, a new base would be nice to have, its certainly cleaner than dash's, and without the big tcpobject secrets that Art hid in his (<3 you too art).

If someone (hint hint) could get it functional ingame I may just have to have some fun with it and expand it for actual public use. My code was ridden with things like the ClientManager, the ScoreManager, and the NIGHTMARISH CommandManager. Several hundred lines of files spanning several files, its a marvel that it even works at all without it.

It would be very cool to do this if it ended up in something.

Back to the original topic though... The PHP main server is very possible, and I'd love to pursue it if there was ample community interest. You could make this discussion wherever it matters... though maybe I'm just being too excitable :P

// ishy
Last edited by ishbuu on Mon Feb 19, 2007 6:51 am, edited 2 times in total.
Image
NUTS!
Veteran Light
Veteran Light
Posts: 1187
Joined: Wed Dec 27, 2006 9:18 pm
Location: Wisconsin

Post by NUTS! »

Wow very informative, never knew one could do that in TT. As for a global tracker I bet Dr. Sawbones would be interested. If I understand what your saying though one and all would have to use this and all would have to use, and/or go through a different master server to collect all the information. Or would this work by a script that could send the scores and all relevent information to a "Global Tacker" location? So then all server that wnated to help compile the information would need these scripts/files.

All very cool stuff. I am helping out with Josh Ritters MMOWorkshop, talk about a network setup. Wish I knew enough about python to get twisted intergrated in TT, but I probably need the freaking source for that too.

I see the time script is kicking off every second. Not using any resource or bandwidth though. Yes amzing what you can see with trace on and a network sniffer. I am not to in favor of programs/scripts that don't allow you to turn it on (trace that is) :tankermad:

#edit
Oh snap just started looking through your "admin" folder. Now I see what you mean about the log files, slick, very slick.
User avatar
ishbuu
New Brainjar
New Brainjar
Posts: 14
Joined: Fri Feb 16, 2007 7:27 pm

Post by ishbuu »

Where the magic really happens is the global tracker to server interaction. Need to properly parse the statements sent by the server and register them on the server, then do all the voodoo on the tracker. The real load is put on the server, and would need one helluva hacker to get running.

The time system actually was a bit cleaner, but there was a bunch of sloppy code in there, so I just made it query the nist server again on a new day, as opposed to doing all the month stuff manually. Though looking back it will make quite a nasty network situation while all the numbers are being thrown around due to some *tinybit* of lag on the TT side, that needs to be redone, also it would need to know leap years so it could figure out when to not mess up in... whenever.... even though i DOUBT the server will ever touch a leapyear, i'm a perfectionist.

I know about transferring data over the net, but next to nothing with servers so its pretty pointless to even try to have me work up how to work on that, but databases are always nice. Could do something like synch it to the server via a thing like the iRC NickServ, register your name on the server, then upon joining just type /nickserv IDENTIFY -password- to login to the global server to cue stats logging. it'd be easier to make it an under the hood commandToServer/client dealie, and then have that as a backup in case the user doesn't have the mod installed client side.

Damn I make long posts >.<

// ishy

Edit: Hah, yeah its a cool little something. The logging system is the only reason I ever went through the trouble of working up the time server, interesting you're toying with something so experimental. I like you ;)
Image
NUTS!
Veteran Light
Veteran Light
Posts: 1187
Joined: Wed Dec 27, 2006 9:18 pm
Location: Wisconsin

Post by NUTS! »

Heh, I like people who make me think and teach me things. :)

The reason I like python and was thinking along the same lines as you was because of this http://cheeseshop.python.org/pypi/PyQStat/1.0 Not 100% sure how it works put it looks like it can pull in the vast majority of the information you want. I was looking at it to show Dr. Sawbones, but havn't had to much free time to do so. Just thought it would be nice to have a page linking off of here like on old PTT that would show not only the servers but the players. I believe this would show the players, scores, ping, etc. Would be kinda of intersting to have the most "killed/been killed" stats for bm. How many times you have been on the winning team etc.
User avatar
ishbuu
New Brainjar
New Brainjar
Posts: 14
Joined: Fri Feb 16, 2007 7:27 pm

Post by ishbuu »

Could also be extended to time with scrum, goals, steals (with a bit of approximation), many possibilities :) That link looks interesting, although I haven't checked how it works, but if it can register details according to a message sent it should be possible to interact with that. Though it will require some level of secrecy on our part, make sure we trust the server admins before we give them the files, as if the keys used were public then it would be all too easy to hack it. I like the idea of having a tracker in the style you posted, it is a very neat idea. The limit i think is the server side. If it can be done on the tracker then I most probably can hook it into some ingame script. Could even work up a leaderboard for scrum, team scrum, bm, tbm, and overall on registered servers. Interesting possibilities.

On a side note, it would be greatly appreciated if you could get my admin system to work, I'm terrible at beta testing and patching up my own stuff for some reason. I would love to expand it, mainly implementing timezones (GMT -x). Also will clean up the logger code (hate the day hack I've written in, thats the first to go) to support multiple things, mebbe re-synch it once in a while. I'll get to work on the revised CommandManager now if you think it'd be worth it, though its most useful for a minimalist server admin (read: me :roll: ) Also the logging hooks could be quite fun to work with, though it'll require some toying around if the client leaves, perhaps roll up their stats in a SimSet, and when they leave then you can kill off the set after sending all data to the server.

The simset system should be nice, expandable. I'm most worried about how the server to tracker interface works though, that'll be some strange voodoo indeed. If we could settle on the tracker/server interface then it would be a very short jump to getting the TT side of this working.

// ishy

EDIT: Found a very cruel bug with my logging system (ow)
Previously was hacking up the code using the following

Code: Select all

   if(%hours < 10)
      %hours = "0"@%hours;
      
   if(%mins < 10)
      %mins = "0"@%mins;
      
   if(%secs < 10)
      %secs = "0"@%secs;
Truely fek'd up. And creates very harsh problems.
new code

Code: Select all

   if(strlen(%hours)!=2)
      %hours = "0"@%hours;
      
   if(strlen(%mins)!=2)
      %mins = "0"@%mins;
      
   if(strlen(%secs)!=2)
      %secs = "0"@%secs;
Sorry bout the screw that creates. Just noticed this while checking how my logs worked and found a very long string of zeros in front of my output data :D Anyway back to whatever i was thinking about doing.

EDIT2:
If ANYBODY touches my code *please* do not modify time.cs or logger.cs, as your changes will probably be void soon, as I'm moving a lot of commands around. I'm MUCH more awake then when I removed all my code, and the code is like looking at what you did while drunk when sober. Very, very many "what the HELL was I thinking" moments ;)
Image
NUTS!
Veteran Light
Veteran Light
Posts: 1187
Joined: Wed Dec 27, 2006 9:18 pm
Location: Wisconsin

Post by NUTS! »

sure, love to see if I can help get it together. I am not much of a scripter, though. However, I do have acces to most the forums on GG (TGB, TGE and TGEA) and have a few admin codes to look at. My strong suit/passion is in the server/connectivity area, I despise lag. Which is why I was interested in the whole TCP information. I think ping is a good judge of lag, but not always true. Having a function that would check someone's packets would be better. If the server is sending X amount but only 50% are making it then the client may have an issue. Heck, could be the server has an issue if you notice that a lot of the data is getting lost coming in/out. I think the servers can handle high ping well, its when there is data loss that you really start to feel it. I know the information is already there its a matter of accessing it and interprting thats the issue.

Who is online

Users browsing this forum: ClaudeBot [Bot], Google [Bot] and 0 guests