I don't need to test my programs. I have an error-correcting modem.
Legacy:El Muerte/Journal History 1
Contents
UTelAdSE[edit]
ConsoleCommand issues[edit]
Console commands are great, but why does it work how it works. I want to get server access to a console as powerfull as the players console (ExtendedConsole), but requires to use Interactions.
The only accessable consolecommands (Level.ConsoleCommand and PlayerController.ConsoleCommand) only have some basic working commands, and no feedback if a consolecommand exists.
How can I use interactions on a server, I don't have a viewport (Player instance) and spawning a PlayerController doesn't give me a viewport.
Trying to create ExtendedConsole and InteractionMaster instances on a custom PlayerController resulted in a server crash when I called ConsoleCommand. I nullified all code in my new interaction classes, and still I get an error.
Is there an other way to call console commands ?
Dma: All Actor and Interaction subclasses have consolecommand. However, the Interaction one returns a bool instead of a string. There are other differences as well. The console command is executed in the context of the actor, but this rarely makes a difference.
El Muerte TDS: Well the ConsoleCommand method in Interaction has more power then the one in Actor (as I said above). I want a white-box ConsoleCommand.
Edit gametype settings[edit]
How can I implement this best ? The WebAdmin and xAdmin use Game PlayInfo classes. Using PlayInfo is the best solution because this would allow you to set mutator settings as well (when they are loaded) (available in the nest UT2003 version (2136+)). I think it's best to implement it sort of the same way as the MapList editor, to use an option flag `-gametype` to set a value for the specific game type. Changes should be saved when submitted in order to support more admins at the same time.
/gametype <list>
Default properties and config[edit]
I came to an intresting discoverry when I released the first version of UTelAdSE.
You can use the default properties to define the default value of a configurable variable. When this option is not configured it will use the default variable. This doesn't work the same way with dynamic arrays, instead dynamic arrays will sometimes be initialised als null.
Let say you have the following:
var config string astring; var config array<string> stringlist; defaulproperties { astring="not empty" stringlist(0)="zero" stringlist(1)="one" stringlist(2)="two" }
ini configuration | initial values | notes |
empty | astring="not empty" stringlist(0)="zero" stringlist(1)="one" stringlist(2)="two" |
|
astring="new value" stringlist="0" stringlist="1" stringlist="2" |
astring="new value" stringlist(0)="0" stringlist(1)="1" stringlist(2)="2" |
|
astring="something" | astring="something" stringlist(0)=null stringlist(1)=null stringlist(2)=null |
As you can see when you don't define the value of a dynamic array, but do configure an other variable the dynamic array will be initialised as null |
stringlist="new" stringlist="newer" |
astring="not empty" stringlist(0)="new" stringlist(1)="newer" stringlist(2)=null |
Telnet Protocol[edit]
Telnet is very simple, it's just 7bit ASCII and nothing more. But there's a litte bit more, Telnet Commands, these can be used for special actions like turning on/off local echo, or retreive the terminal size. The only thing is, for some commands you need binary read/write methods because the NULL char is used in some occasions.
Well no real problem, just switch to Binary mode for the negotiation. But binary support is limited to manual reading because the events are broken. Manual reading doesn't work very well since you never know if there's something to read, you can't just poll if there's data because the Data pending methods/vars are broken too.
I've now made a terrible method for doing this using some loops and stuff.
19-01-2003 well binary events are fixed in UT2003 version 2175 and up, so now I'm able to improve the code. Ofcourse I need to keep backward compatibility with older versions so the old code is still there and used when the version is below 2175.
Bugs[edit]
Bugs are a pain in the ass. But things that works ok on one system, but totaly works wrong on a other system are just ridiculous. UTelAdSE works perfectly on my test system, but a friend reported that local echo was not disabled on his client when he uses UTelAdSE on his server. The weird thing is, the client works correctly. After the login prompt is received by the client nothing should happen. But on his system telnet control negotiation happens after the prompt enabling local echo. This is just plain stupid because UTelAdSE doesn't send any control sequences to the client at that point.
Bug was solved with v101, but I didn't do anything diffirent afaik.
Documentation[edit]
Good documentation is required, even if people don't read it. Writing documentation is just plain boring. Also formatting the documentation correctly so it will be usefull and clear. Usualy this isn't realy a problem since most text is straight forward. But what to do when you have to document a lot of pretty advanced builtin commands.
For example you have a command that can do the following:
/maplist list /maplist add CTF-Map.ut2 ... /maplist del CTF-Othermap.ut2 /maplist move 1 2 /maplist view /maplist -gametype BR list ...
First I have to give the full commandline possible, so something like:
/maplist [-gametype type] <list|view|move x y|add maps ...|del maps ...>
Then I have to explain the stuff. And that for a lot of commands. It's better that somebody else writes documentation :)
ladder/profile editing[edit]
Objective: keep a list of predefined game settings
Need to ask Evolution about this.
Evo's Ladder is a shit load of non linear code (just like UT2003), damn it takes a lot of time to go through it, I bet people get the same idea when they check out the UTelAdSE code.
Thanks to the additional WebQueryHandler Evo provided with Ladder coding the UTelAdSE plugin for this is pretty easy, this way I don't have to find out everything myself. But still it's a lot of work. I'm no stuck at the Profile editing and Profile management, it's a lot of pretty "dumb" work, most of the time it's just copy paste and adjust. I prefer inventing stuff.
Coding block[edit]
19-01-2003 it sucks, plain as that. There are quite some TODO points left (Evo's Ladder), but I just don't feel like implementing it. Simply because it's not a real challange. I don't realy have to come up with new things, all I have to do is somewhat copy part of the gametype editing code and use it with the ladders. You can't realy force yourself to start working, so in result you just don't do shit. Besides I also have to do other stuff (yeah right).
TitanIRCd[edit]
26-01-2003 UnrealIRCD is a subclass of the UTelAdSE system, instead of followng the telnet standard it will talk IRC. This will add some limitations since the client side does all the output rendering, for example the hangman game would not be possible. But this would also introduce some usefull features for the clients connecting to it, like a channal for the chatting and real time player management (kicking/banning/chatting), auto reconnect (by the irc client), etc...
It should be quite easy to extend the current system to talk a diffirent TCP protocol, some changes have to be made in the connection accepting class tho, but that would be it.
UnrealIRCD would be a straight forward IRC server with ofcourse not all IRC feature implemented, just the one's realy needed by the server. But a possibility for the future would be an actual relay chat server (with netsplits on every map change ;))
27-01-2003 pff, implementing an IRCd is a real pain, the IRC RFC is written from the client perspective. But with the RFC and packet sniffing I've come a long way. Ok the current set up is: two windows, one for chatting and one for the actual administrating. The admin commands have to be send via messages because it's easier to use, otherwise people need to /quote all the commands. The chat window would be pretty nice because using /whois you could retreive the user info like: host (duh), player ID, CD Key Hash, etc.. Also the /kick command should.
Admins will get a @ prefix (duh), real player will get a voice, and bots won't get anything (because they don't realy have a voice). The WebAdmin sepectator (and UTelAdSE, BullShit, etc...) will also show up in the list.
There are however a couple of normal IRC commands/features that should not work: JOIN, PART, BAN (could be possible tho), private messaging, channel mode changes, user mode changes, notices, ...
28-01-2003 changed the name to TitanIRCd which is short for Trivial Interactive Text Administration Network . Heh.. ok it's just a name. Also found the IRCd RFC (IRC server RFC) http://rfc.sunsite.dk/rfc/rfc2813.html that would help me on my journey.
28-01-2003 development is going pretty well, but now I walked into a wall, sort of. I need to keep track of all users in a general place, I only get join messages of real players not all sorts of other players. So I need to keep track when a unknown person speaks it should join the server. But I also also add his info record in a general place, this means I also need to keep track of the IRC clients to forward the join messages. But anyway, I have had an actualy IRC conversation on the server today :)
31-01-2003 well development is coming a long very well, I've almost implemented all functionality. The admin channel works like it should (I think). Player joins/parts are reported. Only name changes of players are not reported, looks like I don't receive that gamemessage. There are just a few things I have to implement for the first beta release. Maybe tomorrow.
10-3-2003 No this one isn't dead yet, just not so active. Added a couple of function to replace the usage of tabs, tabs a evil since they tend to screw up a lot. Also tabs don't work with most IRC clients. Thus I implemented AlignLeft\Right\Center, soon to be added to WUtils
DJPaul: Hope you don't mind greatly me writing here, but: UnrealIRCd is, indeed, an actual IRCd. The same name would confuse people. See http://www.unrealircd.com/. If i'm reading this right, WHY does UT need a IRCd? If you just want IRC<->UT talk, you can use http://serverdev.beyondunreal.com/. Yes, you could handle players/chat via IRC...
Mychaeel: I suppose to allow server administration via IRC. I could imagine that'd appeal to many people more than telnet administration (though that's pretty neat too)...
El Muerte TDS: oh damn, ok.. guess I need a new name for it
TODO[edit]
- ofcourse check for any security issues
- add ladder/profile editing
- documentation
BruteForce[edit]
BruteForce is a small programming language written in UnrealScript. Don't ask why, just because.
The source code and specifications are available from my CVS, and accessable via
http://el-muerte.student.utwente.nl/cgi-bin/cvsweb/UT2003/BruteForce/
The language is case insensitive and type complete.
The ENBF specification is not complete.
I may need to switch to actually seperate compiling and executing. Otherwise it's notpossible to do a while loop without very ugly statements, even worse that my if-then-else solution.
Note: BruteForce has a very usefull Tokenizer, you may want to take a look at it when you need to do parsing of text.
16-4-2003 rewrote my previous grammar, and started on a new compiler to create an AST so I can actually execute the code after compiling it. On the fly execution just doesn't work.
17-4-2003 add support for function declarations, I think I now have all the functionality I want in the grammar (except for some builtin functions, but those don't matter much). I really should start to figure out how I can implement the AST.
This could be a solution:
struct Node { var tokenType token; var string value; var array<int> children; } array<Node> Tree;
Ofcourse I need to filter out the useless tokens and convert identifiers to keywords.
oi nutter, changing infix to prefix notation is difficult when you are using a recursive decended parser. I need to switch tree nodes around or something, but I also have to track the depth... Argh, need to get my mind of this for a while.
18-4-2003 finished the AST and implemented an interpreter. The AST is not complete since the function declarations are not passed on, I need to think of a good way to do this since I want to be able to store the functions, I don't want them executed everything the main code is executed. Also the interpreter is not complete, the operators only work for INT types at the moment and the type conversion isn't implemented yet. But for the rest it works like a charm. I've also added a print(), argc() and argv() function. To implement the function calls I had to make my grammar LL(2) :( There's no other way to do that except for a special token for a function call, and that simply sucks.
a = doSomething(a); // nice a = call doSomething(a); // ugly
21-4-2003 fixed the type completeness, there are only some wierd things, like wtf does "string"-"string" do !? So I left that blank. Also fixed the execution order, 1-2+3 would be executed as 1-(2+3). To test everything I converted the timestamp function from wutils to BruteForce and it works , woohoo... Now to add support of functions and then my current specification is complete.
Yes... working function calls, the solution was quite easy all I had to do is add a new declaration type Function and jump to the tree node where the function code is. The input variables can just be read from the refering node. Also added AND, OR and MOD operators.
22-4-2003 Help, it's slow ;) Takes about 2 seconds to calculate 100 easter dates. And I think most of the time is used by the Scope class to lookup declarations, not sure tho, there's no good way to calculate the time used by the Scope, or is there ?
Anyway, current state is pretty usefull. Maybe I need to add output variables to the main program block.