Road Map for 0.9.0 Release
-- These are the things that should get done before we consider a 0.5.0 release of PRISM.
Debug, debug, debug. 0.9.x will take as many releases as it needs until it becomes fully stable in prep for 1.0.0.
Road Map for 0.7.0 Release
-- These are the things that should get done before we consider a 0.7.0 release of PRISM.
All strings in all instances are to be localized aware, clients can pick their language and PRISM will talk to them in their language. This includes the In Game, Telnet and HTTP interfaces.
Road Map for 0.5.0 Release
-- These are the things that should get done before we consider a 0.5.0 release of PRISM.
Refactor all modules that use packets, so that they don't require an intrinsic handlePacket functions. Also making it easier for 3rd party module developers to add functionality to PRISM. Also make sure any of this modules support autoloading. Requires a public static or read-only (pseudo static (via __get()) public variable called $callbacks with the array of methods that wish to have each packet. Support for sub classes or helper class being able to get packets via this mechanism is also a must.
A self update system for the core PRISM files, modules, and plugins. Uses github as the source repo for these file updates. Assigned to filur.
Road Map for 0.4.0 Release
Finish timers. -- Assigned to Dygear.
Road Map for 0.3.0 Release
-- These are the things that should get done before we consider a 0.3.0 release of PRISM.
Don't start Prism through the construct of PHPInSimMod class, but later on, so that $PRISM can be globalled elsewhere for easy access to all handlers (see next item). Assigned to Victor (done)
Restructure the sections that make up PHPInSimMod class. Split up into ConfigHandler, UserHandler, PluginHandler, HostHandler and HttpHandler. - Assigned to Victor (done)
Implement admin interface. - Assigned to Dygear (half done?)
Change users.ini format to follow same style as other ini files. - assigned to Victor (done)
Add interactive startup for user accounts. - assigned to Victor (half done)
Update the ADMIN defines to correspond with users.ini state.
Implement global admins. (Cross Server Admins - Admins on any server PRISM connects too.)
Implement local admins. (Local Server Admins)
Implement admin commands.
`prism kick <client>`
`prism ban <client> <time>`
`prism spec <player/client>`
`prism pit <player/client>`
Implement admin functions
plugin::isAdmin();
plugin::isAdminGlobal();
plugin::isAdminImmune();
plugin::isAdminLocal();
Reliable http server for web admin pages - Assigned to Victor.
Do proper tests! If the above features all work well, then 0.3.0 will be a good foundation for the stuff that's still to come. - Assigned to all
Road Map for 0.2.0 Release
-- These are the things that should get done before we consider a 0.2.0 release of PRISM.
After ISP_ISI for each connection, a TINY_NCN, TINY_NPL & a TINY_RES packet should be sent to the server. This ensure we have all information on all clients, players and results. (In the case of a mid race join of PRIMS.) - Assigned to Victor.
In the PHPInSimMod::inspectPacket function impalement the PHPInSimMod::$clients & PHPInSimMod::$players arrays. These arrays will be sub divided into their hosts, so plugins can get information on the client or players at any time. This will be used as a data cache for when the plugin programmer needs information on the client or player but they only have the UCID or PLID. - Scraped until further notice.
Make the PHPInSimMod::$clients & PHPInSimMod::$players arrays available to plugins via public functions. PHPInSimMod::getClients & PHPInSimMod::getPlayers respectfully would return the sub array for what ever host is getting attention at that time.
All packets that have a string should be updated with their own pack function as so to optimize their size. - Assigned to GeForz.
Cherry pick GeForz updates. - Assigned to Dygear.
Implement admin interface. - Assigned to Dygear
Implement users.ini.
Update the ADMIN defines to correspondent with users.ini state.
Implement global admins. (Cross Server Admins - Admins on any server PRISM connects too.)
Implement local admins. (Local Server Admins)
Implement admin commands.
`prism kick <client>`
`prism ban <client> <time>`
`prism spec <player/client>`
`prism pit <player/client>`
Implement admin functions
plugin::isAdmin();
plugin::isAdminGlobal();
plugin::isAdminImmune();
plugin::isAdminLocal();
Finish the packets module so that all packets can be packed and unpacked. - Assigned to GeForz (If he choose to accept).
His date works for Red Hat, who hired a coach for her, too. He advised her to "Rent lots of movies like Hitch. Guys love those."
Sorry guys, my girlfriend slept over this weekend, so I got very little work done. As she left around 12 hours ago, I manged to get to work and have some time to review some of the changes from 0.2.0 to 0.3.0.
I already posted my bug fix for the Prefix command problem. And I'd like to take some time to explain this again here.
The registerSayCommand function is setup in a very specific way. The first argument is the command ($cmd), it expects the string that should be given without the prefix character. This is very important for the prefix agnostic nature of InSim. Admins can setup the prefix character to be anything (within ISI->Prefix & via cvars.ini within prism.) so we have to support all ways. With that in mind, you should never define your command with a prefix character, it destroys cross platform portability.
And now I'm going to go over my todo list, point by point. Yeah, this is going to take some time.
Implement admin interface. - Assigned to Me! (Not even close to being done.)
This is not even close to being done due to the points below having to get done first. (And there's a lot of them).
Change users.ini format to follow same style as other ini files. - assigned to Victor (done)
Add interactive startup for user accounts. - assigned to Victor (half done)
Update the ADMIN defines to correspond with users.ini state.
I think I did this already, check my repo.
Implement global admins. (Cross Server Admins - Admins on any server PRISM connects too.)
We are going to need to have a discussion on this, because of the changes to the users.ini file I need to know what you have in mind to see if it's better then my current framework idea. (That to be honest, I'm not crazy about.)
Implement local admins. (Local Server Admins)
Again, we are going to have to talk about this before I can implement.
Implement admin commands.
This is quite a bit tricker then it seems. Because it's a huge leap forward for the admin system as a whole. The commands I have in mind are not by any means basic. A command like `prism kick <client>` will have a very powerful engine behind it when I'm done. This gives great power to the admins of the server, and the users of PRISM. Basicly what I need to do is have a clients list and a players list for these commands to work 100% correctly. While this may not seem like a big deal, it also means that we have to implement a clients and players object for each client we have on the server. And here we come into some things that should be discussed before implemented. Should the players object be a property of the clients object, because you can't have a player that's not attached to the client. Or should they be separate structures with references to each other? Once that is done we can get into the targeting system of PRISM. It is my intentsion to give the admin control to be able to run `prism kick @(EAGLE)` to allow the admin to kick all people with the (EAGLE) tag in their name. You could also run with the targeting system `prism kick @XFR` to kick all of the people in XFRs. How about `prism pit @FO8` to send everyone who is driving FO8s to the pits to change their car as you'll be changin cars for the next race. Even better then that ... `prism pit @!FOX` to pit everyone who is not in a FOX. So there's that to talk about, and program.
`prism kick <client>`
`prism ban <client> <time>`
`prism spec <player/client>`
`prism pit <player/client>`
Implement admin functions
Hard to do right now, because I'm not quite up to speed with the current state of the users.ini. Once me and Vic get to talk about that, I should be ready to start theses.
I personally always settle for two separate lists. One 'connections' list (UCID) and one 'players' list (PLID). Entries in the latter store their 'parent' UCID value so you know which connection the player belongs to, though you could try referencing to the connection entry directly. I don't do that personally. It's already very easy to get to a connections object, if you have the UCID. And if you have a PLID, you can easily get there too, having a separate array. Otherwise if it'd be a property of the connection object, you'd _always_ have to know both the UCID and the PLID. not sure that's the case. Well, you could loop through the whole list, but you'd rather not, if you can go straight to the entry you are looking for. (you use UCID and PLID as indexes for the connections and players arrays).
So, do not make the players object a property of the clients (connections) object. That won't work. You want a separate list for both connections and players. One reason for this is that a connection can have multiple players.
It may be helpful to plugin writers, especially, if the core were to have a cross reference between the two.
i.e. connection object has a variable and methods to get the player id, or player object and vice versa.
Could be a bit of a pain in the bum to keep in sync sometimes (takeovers for example), but it is very easy to use and determine if a connection is an active player...
Or possibly PRISM abstracts the concept of player and connections totally. Not entirely sure on where I'm going with this as I'm just off to bed and its just popped into my head as I'm typing this, but there could be something very elegant hiding away, if its even remotely sane (which is entirely tenuous given the time and the day I've had so far)
It does, and I went for the both route. I'm also going to add some look up tables for the common ways of referring to clients and players. (Via, UName, PName, UCID & PLID). This should allow for a pretty comprehensive targeting system, and really fast lookups. It's context sensitive, right now I'm writing all of the low level code for what these functions will be built off.
But first I have to make sure I don't break the relay, because I think I'm sending some packets that are no, no's on a relay'ed host. So I'll read over the manual first the fix that part. Everything is coming together quite nicely tho. 0.3.0 will be a vast improvement over what 0.2.0 is, is both usability and functionality. I'm scared to think of the list of new features that have been added by victor in this release. HTTP & Telnet being the hugest things (Telnet working on windows, WITH COLORS IN THE WINDOWS COMMAND CONSOLE!).
That is the only thing I have left to do. I'm having a problem with the variable pass-though on return by reference type on some of the functions I'm using that's slowing me down. That and I hurt my finger at work, so it hurts a little to type.
It should be noted that <target> is a special type, that could mean UCID, PLID, Username or Playername. Providing any of these are unique to one player you can kick them based on this information, and it would also allow you to kick users based on just apart of their name, so long as it's unique to that client. (Eg, if I'm the only one who is on the server with the name starting Dy then you could do `!prism kick Dy` and it would kick me from the server.
Yeah, I'm slowing everything down. I'm pretty sure Victor sent me a message about a week ago telling me he was done on his end so it's just me. As for my excues on why this is not out yet. I've been doing 48 hours of work a week, plus Paramedic school, and I have what I think is a cold but it kinda feels more like the Black Death, so I've been taking it easy and doing things like refactoring how we make and augment packets.
<?php $MTC = new IS_MTC; $MTC->UCID(0)->Msg('What a douche! He still has not released 0.3.0 yet.'); ?>
Is now perfectly valid code.
Working on making this valid code as well.
<?php $PRISM->SendPacket(new IS_MTC::UCID(0)::Msg('I know, and the excuses are crap too.'); ?>
Ah, method chaining. That's a brilliant idea! I'm kind of annoyed I didn't think of that myself, seeing as how much I work with LINQ. You could do code like this:
Yes, it's called the __call() & __callStatic() magic methods. That's exactly what I implemented in the Struct class so it automagicly filters down to all of the InSim packets that I've defined (as they are extend the struct class and there by get access to it's functions.).
I'm pretty sure I was not the first to do this for InSim packets, I'm pretty sure that honor goes to filur with his lurLFSd system, but as I don't have any of his code any more I really can't be 100% sure. I mean, I do remember he made a static function called emit that allows him to send packets stright away that I might also use, or I might call it send as that's slightly less ambiguous a name for the function. But I also have to find out the function's order of succession in this case. What function is called first? The outside one, or the inside one? I'll find out later.
Don't recall But yeah what i have in my current branch is good to go for 0.3. Have also done a clean test run and fixed the problems that glared at me.
It came from C++. In C++ new means something specific. In PHP it doesn't do anything, it's just syntax noise. In fairness C# and Java also needlessly copied it. I blame Java.