Announcements

Join the ongoing conversation on Discord: https://discord.gg/w6Tpkp2

Please read the current update for instructions on downloading the latest update. Players with Mac versions of the game will not be affected, but you will have a slightly longer wait for your version of the new maps. Please make a copy of your character folder before running the new update, just to make sure you don't lose any of your custom work.

It looks like we can give everyone a list of minimum specs for running City of Titans. Please keep in mind that this is 'for now' until we are able to add more graphics and other system refinements. Currently you will need :
Windows 10 or later required; no Intel integrated graphics like UHD, must have AMD or NVIDIA card or discrete chipset with 4Gb or more of VRAM
At least 16GB of main DRAM.
These stats may change as we continue to test.

To purchase your copy of the City of Titans Launcher, visit our store at https://store.missingworldsmedia.com/ A purchase of $50 or more will give you a link to download the Launcher for Windows or Mac based machines.

Do not lock characters to servers

9 posts / 0 new
Last post
kdx7214
Offline
Last seen: 4 years 6 months ago
kickstarter
Joined: 11/03/2013 - 20:08
Do not lock characters to servers

I posted this in another thread (what did CoX do wrong) but will repeat it here as I felt it deserved a bit of attention.

Why not just make characters and then when you log the character in, choose what server you play on? With some foresight and planning, this means that if you don't want to play on a heavy traffic server (i.e. Virtue a.k.a. lag city) you could for one session play elsewhere.

Yes, this does mean that things like SG bases and the like would need to be cross shard (or maybe separate instances). Check out how Rift does things like this.

If the data tables are setup properly and all characters have a unique ID across all servers (i.e. all servers/shards share one common character db) then the ID conflict problem CoH had would never exist.

As for how it would work, I can envision having a "Character Select" screen (along with maybe a friends list) and then after you pick a character pick which server. I personally think this would allow the flexibility of still having shards, while allowing people to pick how much lag they have to put up with due to number of players. Of course a single massive shard might work too, but it would need to be impressive hardware to pull it off (or maybe amazing cluster design since shards are usually clusters of machines).

Just a thought.

Lothic
Lothic's picture
Offline
Last seen: 3 months 2 weeks ago
kickstarter11th Anniversary Badge
Joined: 10/02/2013 - 00:27
For what it's worth I'm

For what it's worth I'm pretty sure the Devs are going to try to make this game a "single-server" game.

CoH player from April 25, 2004 to November 30, 2012
[IMG=400x225]https://i.imgur.com/NHUthWM.jpeg[/IMG]

ravonos
Offline
Last seen: 5 months 4 days ago
kickstarter11th Anniversary Badge
Joined: 10/04/2013 - 02:24
"Most MMOs just have

"Most MMOs just have different servers, sometimes called shards, that each handle a parallel version of the same exact world. While this manages to share the work of hosting the players, it does in such a way that people can't really interact with the people on other servers. With most games, you have to find out which server they are on in advance, or else you'll probably end up on the wrong one and you won't be able to play with each other.

We look to avoid that. We are all in this together, and we want to keep it that way."

Quote from update #13. There (more than likely) won't be separate servers, so this is a non-issue.

Amerikatt
Amerikatt's picture
Offline
Last seen: 3 years 6 months ago
11th Anniversary Badge
Joined: 09/27/2013 - 08:54
Sorry, kdx7214, but your

Sorry, kdx7214, but your character in particular has already been chained and padlocked to the server. Only Dr. Tyche has the key -- hidden *somewhere* in his beard! *sage nod*

[center][color=purple][size=16][b][I][url=https://www.youtube.com/watch?v=78N2SP6JFaI]Just a cat from another star![/url][/I][/b][/size][/color][/center]

TBK
TBK's picture
Offline
Last seen: 5 months 5 days ago
kickstarter
Joined: 10/02/2013 - 12:53
Ravonos is correct, if you're

Ravonos is correct, if you're interested in reading more info about our server plans you can check out update 13 [url=http://www.kickstarter.com/projects/missingworldsmedia/the-phoenix-project-city-of-titans/posts/626654]here[/url].

[color=#ff0000]Gameplay And Content Team[/color]

[IMG]http://i40.tinypic.com/24ypdt0.png[/IMG]

Izzy
Izzy's picture
Offline
Last seen: 6 years 6 months ago
kickstarter11th Anniversary Badge
Joined: 10/09/2013 - 11:09
Cool.

Cool.

As long as our characters have a Master Lookup table thats Indexed. :) And lets not Drop/Delete row entries until low load times, just set a flag for it to be dropped later. Hate the time it takes to reindex. Of course we can also use Constraints and have multiple Index tables, and just UNION them with the Constrain field(s). Some Database engines will know from the costraint which lookup table it should query for the Characters Info. I'm not sure if the Databse Engine will me MySQL or some other. As long as its not HP's NON-Stop SQL MP/MX/etc...

...and that Lookup table can point to other linked Servers/Databases that have an equal, or close to equal, number of Characters on each for load balancing reasons.

ex:
[img]http://img268.imageshack.us/img268/5742/x85a.png[/img]

So, if we want to add support for even more Characters/Databases, no worries. ;)

Since i'm not sure what all the high level fields will be in the Master Lookup table, i'll just use the players unique Global Handle as the CHECK Constraint and possibly use the 1st 2 or 3 (more or less, will see) characters from the Global Handle to determine which table to Insert all of the player Characters high level info into.
A stored procedure would actually do that, you would just pass in the players Global Handle name.

Example:
exec Characters_AddNew( 'DelightMan', etc... )

.... that SP would look at the Global Handle name 'DelightMan' and take the 1st three characters and insert the high level details into a table named something like 'tblCharacters_DEL', which would have a CHECK Constraint in the CHARS_GLOBAL_HANDLE field, that checks the 1st 3 characters in the Global Hadle string to see that it really starts with 'DEL'.

It stands to reason that on the Character Select Screen, the player will be able to switch between characters allot faster... by keeping high level details of that Global Handles characters in the accessed table thats already in memory of the Database Engine.

If some Master Lookup Tables start getting large (Global Handles names that start with a 'The'), those tables can be split into multiple tables using 4 or more characters in the CHECK Constraint. There would be a Stored Procedures (or user functions) that would actually do that. Get Coding NAOOOWW on that Stored Procedure! ;)
The SP could be run when the loadtime is low, or it can be scheduled, so its automated. (We need to have it automated as much as possible, so maintenance downtime isnt 2 hours, but 10 to 15 minutes)

The SP that would do the nightly / low load times maintenance tasks, would also be responsible for rebuilding any Stored Procedures that used the 'tblCharacters_*' tables.

Example:
exec Characters_GetAll('DelightMan')

Or even better, instead of rebuilding each SP, rebuild the TableView 'tvCharacters' which all the Stored Procedures would use in queries.

'tvCharacters' would have a query that would UNION all the different 'tblCharacters_*' tables. When you do a query like:

Select * from tvCharacters Where CHARS_GLOBAL_HANDLE = UPPER('DelightMan'), the Databse Engine is smart enough to realize that you are actually just quering the table 'tblCharacters_DEL', and not bother reading the other gazzilion other tblCharacters_* tables. ;)

Inserting New Characters should be done through the SP, like Characters_AddNew(), since the Stored Procedure will need to look up the proper table first. The nightly maintenace SP would also change another lookup table which will contain a row for each 'tblCharacters_*' table and it would have fields populated with the CHECK Constraint characters used and other info too.

Or, try Insert Into tvCharacters using an ‘Instead of trigger’. (ref: http://www.codeproject.com/Articles/236425/How-to-insert-data-using-SQL-Views-created-using-m) but i've never used it, so cant say it will work. :/

Lin Chiao Feng
Lin Chiao Feng's picture
Offline
Last seen: 1 week 5 days ago
Developerkickstarter11th Anniversary Badge
Joined: 11/02/2013 - 09:27
Izzy, they're not nearly far

Izzy, they're not nearly far enough along to be cranking out sprocs. A couple of devs have indirectly addressed this here:

Shard wrote:

don't assume SQL.

and here:

DeathSheepFromHell wrote:

Perhaps now would be a good time to point out that the assumption that the servers are speaking SQL directly is quite probably a flawed one. The details aren't nailed down yet, no, but trying to address most of these issues in the server code is, frankly, a terrible place to do it.

[i]Has anyone seen my mind? It was right here...[/i]

Izzy
Izzy's picture
Offline
Last seen: 6 years 6 months ago
kickstarter11th Anniversary Badge
Joined: 10/09/2013 - 11:09
well, maybe someday. ;)

well, maybe someday. ;)

XMPP, haven used it.
XML based? I always liked JSON more! ;D

Article on How an MMO Works: http://electronics.howstuffworks.com/mmorpg8.htm

What kind of MMO Server will CoT run on? Googling I came across one here: http://www.smartfoxserver.com/
and some White papers on How To do it right: http://docs2x.smartfoxserver.com/Overview/white-papers

Even if CoT wont be reading data from a SQL server for direct TCP/UDP transmissions, i gather it would make more sense to have a central location where you can Update Mass amounts of data in a few query statements instead of traversing any type of Folder structure to update files individually. That sounds horrible.
If a Folder/File structure is what CoT wants, it can be done, but done in a Cached manner prebuilt from the DB.

Ex:
When a Characher's (lets call him Alex) costume, or other data changes, the DB is updated, and a JSON (or XML) representation is generated and Encrypted/Zipped just Once (until the player makes a change again) to a Chache Folder for that particular character (Alex).

When Alex comes across John in the Game World, instead of sending TCP/UDP packets to John from the Database (from a SQL Query), or even from Limited Memory (how much is enough memory?), it does so from the hard disk from the pre-generated details for Alex (which doesnt need to be Encrypted/Compressed yet again). Of course, the Cache Folder would contain things that arent hapening in realtime (Costume,Biography,etc.. things that you would normally use the TCP protocol for). And, Non-realtime Character details doesnt have to take up memory for the span of the instance for that Charcter, the JSON encrypted/compressed character info can be accessed from the Solid State Chache drive almost as fast as if it was already residing in memory and sent right away.

The other player would get Alex'es Character Details and it would stay cached on his local hard drive until the next time when this players comes across Alex. So, as long as the Cache size hasnt grown bigger than... err a Gigabyte on the local players machine (older Character Cached details can be deleted to make room), and the timestamp and the CRC Checksum match, there wont be a need to TCP Alex'es Character details again. Just need to check the CRC Checksum and timestamp once Alex comes into the same Instance (or channel, or shard, or what have you). I know CRC Checksums arent 100% reliable, but it will discurage allot of would be mod'ers.

And use UDP for other things that can change from one second to the next (like players location, Health, Endurance, maybe even powers being used if multiple sends are used with some progression meter of cast time or something to denote progression so other players games can catch up).

Of course, since a UDP packet doesnt have to be received in the same order it was sent, any UDP packets that has a Past progression stamp than the Last one, will be ignored. and the Animation power will start to play using the Last progression stamp point on the other users end. And yes, we can use a Globaly Unique genereated ID for Alexes power when he casts it, which will be included in the UDP Power Cast details, but might be overkill. ;)

Doing this will prevent Lag Jumps you see in some games, where the player's running in front of you, an for a second is right beside you, and then jumps back to where he was, running in front of you again. And yes... i have considered, a sort of Torrent download approach (from others in the same Instance that have the Character Detailes cached), since the Character Details can be checked via CRC and a timestamp which others would get from the Server, but i havent considered it much. Not sure... I'm worried about other players connections, as far as uploads speeds are concerned. If slow, some things about Alex will be there, and not othere aspects.

And, its possible you wont need as many virtual machines, well.. much less. Since i dont know the OS in question and the number of Sockets Available. :)

On some 64bit Linux distros, some say 65k open sockets with 128k rmem and wmem buffers take 8.3GB of RAM. Some say FreeBSD might be able to handle 100K open sockets.

Also came across this, The C10K problem: http://www.kegel.com/c10k.html
I read that some async IO/socket creation calls will freez until it return an open file/connection, but calling it from a separate thread doesnt freez. Sounds like a Thread Pool might come in handy, that return a unused thread, opens the connection and on completion returns the thread back to the Thread Pool for reuse. This always makes me think of how iPhones handle large scrolling lists, reusing the same 3d hardware planes as soon as they scroll out of view and repositioning them at the begining/or end (off screen) for reuse. Even though the dynamic material/texture for that 3d plane cant update so fast, they still show the generic material/texture until the display can catch up for it to redwa the material/texture in that 3d plane (List Item).

Just plop it on a Server like this one: http://www.newegg.com/Product/Product.aspx?Item=N82E16816101676
I dont know servers that well, but others seem to like that one. ;)

Lothic
Lothic's picture
Offline
Last seen: 3 months 2 weeks ago
kickstarter11th Anniversary Badge
Joined: 10/02/2013 - 00:27
The differences between a

The differences between a "physical server" and a "virtual server" are pretty much gone in modern computer hardware environments.

It's no longer unusual for server hardware to spawn off dozens of virtual server instances in an instant whenever user load changes. I'm not just talking about new "shard" instances inside a computer game - I'm talking about complete virtual machines with their own dedicated portions of memory, IO, CPU cycles, etc.

So even though the physical hardware involved may contain hundreds of processors and database systems distributed across the world from a user's point of view it all acts like a "single server" as I mentioned in my last post.

CoH player from April 25, 2004 to November 30, 2012
[IMG=400x225]https://i.imgur.com/NHUthWM.jpeg[/IMG]