Jump to content


  • Content count

  • Joined

  • Last visited

  • Days Won


Everything posted by Gefferz

  1. UAS2 Progress

    Hello all. It's been a while since I posted. I am still working on things, but a few real life things have kept me busy elsewhere for while. Yes, mobs are going to be a problem in many ways. I took out code that autospawned monsters, and I am trying to get an annoying piece of code to work that removes creatures when landblocks are out of focus. There have been all sorts of problems going in and out of dungeons, with portals disappearing. At the moment, you manually spawn a creature (in a dungeon) it follows you rather relentlessly. It has a limitation of its travel, after which it returns "home". But it's rather more tenacious than the original game. No stuck in corners running pointlessly - it navigates around, follows you upstairs, leaps down if you jump down - very amusing. I stopped short of allowing them to follow you into portals.. that would be very amusing but I must resist! Creatures (like skeletons) randomly are equipped with appropriate weapons and shields, but sometimes not, and perform the right animation depending. I think I have all the idle animations defined too, I had to do a lot of experimentation. When I've got bored trying to fix bugs, I went on to do other things. I made jewellery have enchantments on them, and had to a dozen other things to make them assess properly. This led to all sorts of realizations about various assess functions not working correctly, and I had to persist spells and all that kind of jazz. Since gems are not far different from jewelry, I put code in for those too, at least inasmuch as you can spawn a gem, and it has random spells on it (only one so far) including minor or major traits, and you can click them and the spell activates and counts down. Code for mana stones and charging of them onto items is more or less correct - that was very tricky too because mana stones have to be declared in a certain way to make the warning about destroying the item come up or not come up. In the meantime I have wasted enormous amounts of time on various memory corruption issues. And I thought I'd share one of the culprits. Not my code, I hasten to add, but I thought I'd share. time(&NextCleanTime + DELAY); Innocuous looking line of code, but of course very nasty. It puts the current time into the variable's address plus the delay, which is some random other place. I've been putting in _CrtCheckMemory() commands to work out where the memory fault occurs. I had already fixed one of those elsewhere, but I suppose I'll have to look for similar other occurrences. It should be time(&NextCleanTime); NextCleanTime+= DELAY. There was another terrible bug in various places - a precedence problem throughout if (flags & 0x00000008 == 0x00000008) Yes - I might have once myself made that kind of mistake, but I tend to throw parenths around everything these days because I am paranoid about such things. So if ((flags & 0x00000008) == 0x00000008) This kind of thing can create quite baffling problems,not crashing but just wrong packets going out, so objects not appearing perhaps. The & has lower priority so the pointless 8 = 8 part is done first.
  2. UAS2 Progress

    Hello all. I've not written in a while, because I've met some hairy obstacles to overcome. In short, it's the thorny problem of collision detection, monster movement, and dungeons, as in my last post. But I think I'm getting there now. I realised I needed a bit of a rethink. I've ended up with a bit of a cheat, but one that seems to work quite well. The basic problem just to clarify is that UAS2 in its original form has no knowledge at all about the objects in the world. It can create a monster and tell it where to go. The client then tries to make that motion happen. But what if there's a wall in the way? One of two things can happen, first the monster can effectively ignore the wall (a set position command is sent), secondly, it can run towards the given target, and not reach that target because .. duh, there's a wall in the way. The first looks stupid, because monsters aren't expected to just waltz through solid objects. The second is a problem because it can't be detected on the server. The server can allow enough time in a measured way and put the monster into combat mode when it thinks it should be in front of the player, but it can't know if the critter had got obstructed. The original game of course was not very good with collisions, but at least it knew when creatures were on the other side of a wall. How to solve... Ideally, the server would have a map in front of it of all obstacles, and be able to navigate around them After a few weeks messing around with the cell.dat data, I realised I could partly solve the problem with information in cell.dat, but the overall collision would still be a problem without doing enormous work. What I ended up with was a system where monsters could navigate to an enemy by staying to the middle coordinates of a cell, which are always 10x10. This nearly always works, but is not enough on its own. My cheating solution is quite fun. I keep track of all clients last 256 positions, whenever the X and Y change by a whole unit or more in a wrap-around buffer. Then when a monster detects an enemy, it logs that position and heads for it using the centre-cell method. Once there, it goes into a sort of breadcrumbs mode. Since the player's progress must have been througoh genuine positions that exist, the monster can follow the same coordinates and landblock cells. On the way, it can try to shortcut those routes, and so if the player dilly-dallies, it will skip those points. It also breadcrumbs its own route back "home", so something like a long piece of elastic, it can wind itself back, again checking points which it's already covered, so it doesn't blindly go round in circles. And the advantage of this is it will work outside dungeons too (but at the moment there's a few hard-coded bits that will make this not work). I also managed to get monsters have weapons and shields. This was a variation of the code I used to equip weapons and shields for the player, and was actually quite easy. I added a field called WeaponsGroup and ShieldsGroup, a new database that defines which belong to which group. I made a new tool to make it easy to set these up. So there's a pile of options that say a skeleton can have, with a few types of shield and a few types of weapon (or none at all), and it randomly picks them out when the creature spawns. Another thing I've played with was the problem of human type monsters. For reasons I am still not sure about, creatures like Bandits, and Mercenaries (any human species) were coming out naked. This is weird because they were captured with their palette and textures saved. But replicating those isn't enough in UAS2 for them to show up. So I took a step sideways... I made it save the packet data it generates when the player makes a costume change, and then fed that back into the capture software (with a few changes). So it was a case of playing dress-up - making myself look like the Bandit etc. Then, exiting, and renaming the capture log data file. A bit of database jiggery pokery to assign the new captured data to the old entry, and bingo, one correct(ish) looking Bandit. I added some randomising to the outfits, and created a small tool to assist in setting them up in the database. So far have done about 5, more to do. Hopefully I can finalise some of the dungeon code this week, and make the combat correct. Then I can happily ditch all the old code that used to handle combat!
  3. UAS2 Progress

    Hello people. Haven't posted for a couple of weeks, because I've hit a bit of a problem, and I've been working through it. It's all down to collision detection, and how monsters move. When I dug into the code, I found that my preconceptions were totally wrong. Monster fighting would have only ever worked out in the open without this work. This has led to a week of working out how cell.dat works, and writing tools that creates new tables for navigation. I can now edit cell.dat (in place editing), which is kind of fun, so I was able to raise Arwic entirely 6 feet up into the air, and bring it back down afterwards (not in game!) I can't say I completely understand it, but enough to parse out the data I need. Effectively there will be two different methods for the world, and for dungeons. Along the way, I populated all the dungeons I could find in the capture data, cross referencing to the ones that exist in the old game (something like 500 or more, though some aren't exactly dungeons, just places that are treated the same). I think I'm getting there, but I've stripped apart the monster movement code entirely and am rewriting, and there's a few problems to iron out.
  4. UAS2 Progress

    Thanks for the positive comments. Of course I will share in due course. Hit a bit of a problem in the last week with palettes. It all started when I realised I had no Tumeroks, the capture had rejected them. Looking into it, I found the 3d model for Tumeroks must have changed from the old days. The new model number wasn't in the original portal.dat This led me to ascertain which models were not being used, and by forcing them onto creatures with a similar build, searched for the Tumeroks, and other extinct creatures. Many seemed to be variations on zombies and skeletons, and I found the Tumerok model. Then when I started looking closely at the values for the palettes, to see why the Tumerok types all looked the same, I realised that the new capture data referenced palettes that didn't exist in the old portal.dat file. I then took a step backwards, and looked closely at the capture data for palettes and realised that the original UAS2 and its companion capturing program were in error, but that a workaround somehow made it work. The original capture program did a weird thing when it loaded up the palettes, and made a field called Unknown-1 which it stored and presented when it was time to show that creature (or item). Each palette where it exists consists of a palette file number (in the portal file) and an offset and length, which overlay into the working palette. The values captured looked weird... I realised that the offset, length pairs were in fact actually palette file numbers misplaced in the data, so 6D for length of F was really palette file F6D. Because of the botched way UAS2 used the palette values, these somehow still came out correctly in most cases. In fact there is no need for an "unknown1" field. If a palette is present, it has a count of at least 1. What follows the counts of palette, texture and model is something that looks like a base palette, or a palette for part of the 3d model. This does not have an offset and length value, but is immediately followed by sets of palette overlays that do. These are often a value, and offset and length of 0. The length of 0 means 256. I played around for ages with a drudge ravener's palette. It seems some of the palette values come from that first palette, so it's not entirely that the subsequent palette(s) just overlay. So I have gone back to the original data, and applied various fixes to the data. We now have at least a correct set of data, and unknown-1 is replaced with BasePalette. I am now writing similar code for items. Of course I had to go through and put the base palette code into every class that presented palettes rather than the unknown_1 field. The big digression was trying to match the TOD palettes to the old palettes. This was like the old days for me, doing colour matching algorithms. And I think the results are pretty good.... but haven't helped me get Tumeroks looking correct! It seems that the old Tumerok model does not use the palette at all. The only thing I can do is make them slightly bigger or smaller! So onwards.. and then I need to get back to what I was doing last week.
  5. UAS2 Progress

    Here's a video of where I'm at today. A few problems note the empty slot - some kind of duff item is in the database, or something I've overlooked. Sorry low quality video, capturing video is not working properly with 3D mode on. Nice to see doors working, isn't it? Little things like that are pleasing.
  6. UAS2 Progress

    Now adding monsters into my data capture program. It's hugely faster than the old buggy capture program. Runs against the large capture files that were previously taking hours, and takes a few minutes to do a whole folderfull. But it's only doing items or monsters... so that's partly why. Found it was adding NPCs, but can be eliminated by ignoring records with dwUnknown_V2 = 32. Was pleased to see my first Tusker Guard, and mite scion. Fixed nasty bug in generating bogus corpse item that show up with a black square. It needs to animate bending over when looting, and it's also not updating weight. I added healing kits as a treasure item. Something horrendous is wrong with level gaining. It tells me that I need 4 billion experience to get to the next level, at level 12, I guess it's calculating -1 or something as a DWORD, but I've not even looked at that code yet. I need to find a way to share the Exe and database. But I don't want a cease and desist order on me from WB!
  7. UAS2 Progress

    Looking at the monsters tables today. Monsters_type defines critters that can be spawned. It had the wrong linker value, was the ID of monsters_templates records, not dwLinker. Knocked up some quick C++ to fix, and zeroed records that weren't there. Now there are 100's of creatures that can be spawned, hurray.
  8. UAS2 Progress

    This week I was very happy to find and fix a horrible bug in UAS2. In case anyone doing the modern emulators needs to know what it is, I will describe. Some armor was coming up as corrupted, it basically made the entire avatar black. I traced through a routine that loaded data from portal.dat, "LoadItem". This routine assumed that each palette entry occurred only once. When it poked in the palette code, using the colour set, it used the index of the set of colours (xIndex) which was 0, then 1 for the first four palette values (offset and lengths) and the last three palette values. This meant it poked in colour codes for indexes 0 and 1 only, and left the remaining 5 zero. The one that was poked into index 1 is meant for palettes at index 4, 5 and 6. The index needs to be saved and the palette codes stored in a little loop so that the new index keeps match with the one that is used in storing the offsets and lengths. There's also another bug, more an oversight, in the coverage code. This meant, when I eventually worked it out, that the order of items in the inventory, that is the order in the items-Instance-Inventory, changed how clothes and armour overlaid each other. After mucking around with all sorts of ideas, I realised that the trick is to sort the inventory first, in a temporary array of objects, in order of coverage. A second problem with this code is that then the palettes are not right. A higher coverage item might have an overlapping palette range, because say the palette codes for arms are included in the palette codes for coats. The correct way is a bit fiddly. (I have code if anyone needs). You need to make an array of 100 entries, one for each palette slot. This is populated as each item's palette offset and length is dealt with. As the items are now sorted in coverage order, the later items will overlay the palette slots as needed. When all items equipped are done, the array is read through to determine a master palette list, that is of offset and length values, where the array is not zero. Armour and underwear now correctly appear, irregardless of inventory order. The method faster because it no longer does a zillion matches against each inventory item to work out coverage. Oh and you can spawn items with colour. Colour is only partially implemented, but I can do SpawnItem NN,Colour. My item grabber code makes a list of what colours are possible (I made a table of each item code, against each colour, and icon). This is complicated! Generating an item of a particular colour, if that colour exists, makes it change the icon for that item. I had to make the colour get stored against the inventory. A load more stuff needs to be stored too per item. It should also have a shading value, which is a number between 0 and 1. This works like this - when an item's palette is loaded, it finds a palette file. This palette file can contain many palettes for that given colour, say if it's 20, the shading value is timed by that count, so a shade of .25 would make it pick colour index 5. I had some fun putting weight into the game. UAS already had burden in per object. Sometimes it was called weight. It just meant keeping track of the weight of items picked up and dropped and feeding out the right message. Making shields and weapons stay wielded when logging out and in was a major headache. I fairly easily had it restoring that state, but they would not show up in the slots. I created a wielded flag per item... I made a lot of changes to get this to work and I still have to do the same for bows and wands. I created a primitive loot system. Now you can kill monsters and their corpses include random loot. I revised this a bit, especially as the very first set of loot included a focussing stone - and made it give more emphasis to junk rather than top notch armour. At this stage, armour and other things are still not randomised - they are just direct copies of the templates. It amused me to make it drop random pyreals, although there's a 100 things wrong with how those are handled (stacking etc). And gems aren't working for me, they don't appear at all. So now you can hunt, find weapons and armour and equip those items, and they all appear and work, sort of. Except all melee attacks are currently reported as bludgeoning! Doing all this made me realise I've a lot wrong with the items as they've been acquired and due to a fault in my own capture program, I'm missing many types of things, jewellery for instance. On the other hand I've changed the items grabbing code to check for duplicates properly.. so I've not filled the database with duplicate stuff - but more work to do there, and that's what I'm doing next. Then it's back to the monsters to work out why only some of them work.
  9. UAS2 Progress

    I can now spawn items of armour and clothing, and wear them! I modified "spawn item" to take a comma, colour value. It needs to know the colour when loading the model. All sorts of stuff needed to make it load and save things properly. There are two nasty bugs in the code that caused the toon to mess up on equipping and unequipping. For the record they are in DatFile.cpp and Avatar.cpp - DatFile.cpp first - the object's palette change count was never being reset. So there's a new line void cPortalDat::LoadItemModel( cObject *pcObject, DWORD dwModelID, DWORD dwColorID, double dblColorValue ) { cItemModels *pcModel = cItemModels::FindModel(( pcObject )->GetItemModelID()); //pcModel - Item model instantiation; used to fetch item variables //dwModelID - 0x00000001 = male; 0x0000004E = female; other //dwColorID - color ID number; determines the CLUT list looked-up //dwColorValue - the particlar CLUT from the clut list if (!pcModel->m_clothingModelLoaded || dwColorID != NULL) { if (dwModelID == 0x02000001 || dwModelID == 0x0200004E) { pcModel->m_bWearPaletteChange = 0; pcModel->m_bWearTextureChange = 0; pcModel->m_bWearModelChange = 0; pcObject->m_bWearPaletteChange = 0; // WAS NOT IN THIS CODE.. every time it loads, it goes up by more and more } And I think this was causing things to be wrong when the avatar first loads - in Avatar.CPP close to the beginning of CreatePacket - the equip flag test should be done AFTER loading the model, or equipping the item will make things go awry. int paletteChange = m_bBasicPaletteChange; int textureChange = m_bBasicTextureChange; //Loop through the palettes and textures of currently equipped items //Check whether they contribute palettes and textures to the character model for ( iterObject_lst itObject = m_lstInventory.begin( ); itObject != m_lstInventory.end( ); ++itObject ) { cItemModels *pcItemInv = cItemModels::FindModel(( *itObject )->GetItemModelID()); if (pcItemInv->m_PortalLinker != 0) { if (this->m_wGender == 0) cPortalDat::LoadItemModel(( *itObject ), 0x0200004E, ( *itObject )->m_intColor); else cPortalDat::LoadItemModel(( *itObject ), 0x02000001, ( *itObject )->m_intColor); } if ( ( *itObject )->m_fEquipped == 2 ) { // by the time you've messed about testing for 0 through // half a dozen indirect pointers, you might as well // have just addded it! // if ( ( *itObject )->m_bWearPaletteChange != 0) paletteChange += ( *itObject )->m_bWearPaletteChange; // if ( pcItemInv->m_bWearTextureChange != 0) textureChange += pcItemInv->m_bWearTextureChange; } }
  10. UAS2 Progress

    I was determined to try to work out why clothing and armour is so messed up. Using a modified version of the data capture, I've been tentatively adding bits and pieces of armour and clothing in. But it never seemed to work, the items never equip properly. I went back to first principles, and tried to understand what did work. I tore the code apart where it's doing inventory equip. Then I realised why the few inbuilt startup items of clothing worked - they were linking into data from portal.dat and not from the database vectors, textures and palettes. Looking closely at things, I realised that the index values captured from pCap files were all out of kilter, for some reason they are the wrong index values (and the data itself is wrong). So I realise that I do have a way to do this. And it's through the icon number that's in the capture data. The strategy is, ignore the captured texture, model and palette data. Instead search portal.dat 0x10 files for the icon number, it's an 0x06 number that can be parsed out. When the file is found, the PortalLinker field in items-template can be set - this is enough to make UAS2 load the models, textures and palettes without needing the linked model/texture/palette files. What's more, since the 0x10 files contain multiple definitions for each colour, I can generate an items-templates record for each colour... but since this is a template file, the colour loading can be done later (it's a choice). I've written a portal.dat examiner - it came in handy for this, but I need to make it save off the files now, then those files can be used by the data extractor, so that's what I'm doing next.Then it's back to the data extractor to parse through them to find the icon number. It's all good fun!
  11. UAS2 Progress

    Well it's been a week since my last post. I spent a lot of time trying to solve the crashing bug. In the end after messing around with the packet handling code, it seemed to go away. It also didn't seem to happen when I connected a second machine. I've realised a few problems that have created wrong data in the items database. The capture tool is writing to the wrong table for starters, and the fields are not all correct. I almost had some new boots working, imported from a capture file, they showed up in inventory and ground, but could not be equipped because all the flags were wrong. Incidentally, if anyone is playing with the databases as MySQL, I recommend heartily a free tool called Heidi, which is just incredibly better than MySQL toolbox, so easy to show and edit data. I added code to do the right combat animation according to low/medium/high. I also checked to see if you had no weapon, and switched to the unarmed kicks. I added code that reduces stamina, then realised there's code to do this, which is for some reason broken, another thing to look at! I added combat noises in a very limited way. I found code that was executed when a new landblock is entered. To this I added code that made creatures spawn. I got bored just spawning drudge robbers, so worked out creatures which were fully defined (some have bogus database models) and then made a list of them. So running around Dereth now spawns random creatures in your path, and they head for you and attack if they are in range. All in all, it made a kind of playable single player game: edited highlights: [url]https://www.youtube.com/watch?v=i8Y-OoI2oRE[/url] Creatures death animation was not working, so I looked at that too, it almost drove me mad, but eventually it worked. Healing animation was broken too, or worked sometimes. In the end I copied some other animation in, and changed it to heal, and it worked. Player death causes all sorts of state problems that need sorting, so you need to go in and out of combat because the stance is wrong. I wanted to look at the portals.dat file. I found the ACDat explorer tool, or whatever it's called, only works with ToD portal.dat file. I spent a few days and built a new tool so I can see the data, and find if there was some kind of items repository that could be used to generate items. I think there kind of is - I found an area that had model/palette/texture IDs as one lump, but I can't quite find all the necessary information. I'll make this available somewhere, sometime. It works with the old-school portal.dat file, or the new one. So far it only displays and searches ID's. I found some very old tools with helped with this, in VB. They had a bug or two, and seemed very complicated for what is quite a simple file structure. A few brief words about portal.dat for those interested. For each object there is at least a set of files for 3D model, Textures, and Palettes. In the old portal.dat, these are respectively 0x01 files, 0x05 files and 0x04 files. To a large extent, the contents of these files match between old and new portal.dat files, notwithstanding the variations in how the dat files are stored. "Files" with the portal.dats have names which are this ID and an incrementing number, these are tied to an offset in the file, always on a 1K boundary, via a directory. Directories can have subdirectories of up to 61 entries. The Tod Portal.dat file does not seem to have the textures stored in the same way. I think these are stored indirectly, but still internally numbered the same, for the most part. So the 0x05 files are all very short in ToD. This week, once I've corrected the capture tool, or perhaps rewritten in it in part, I hope to be able to add loads of basic armour and other items. It needs some work because at the moment, it fills up with crazy stuff like housing junk, and random corpses!
  12. UAS2 Progress

    Well, I know people are working on other things. But UAS is a bit more like my dinosaur-way of programming than this modern .NET/C# stuff people are heading towards. I've been trying to get some understanding of how things hang together, and it's a lot of fun, especially as I can now melee fight things. So I thought I would create one thread with changes and observations about UAS2 and the capture program, and perhaps these might be useful if anyone's still playing with it. I don't feel I've made enough progress to upload a whole new version. Firstly, the capture program has a number of bugs, at least the one I had. It has "vetors" instead of "vectors", and its bad way of building an insert line means that it often creates dud lines. Actually there's a dozen or more other problems with it, with the fields it captures But I've put this to one side. For one thing, it's generating too many records, and this slows down the server launch time. I've had to create a few scripts like ones to remove duplicates. I also created a file splitter on pcap files. The capture program already can deal with a whole folder, so this means instead of reading one file, and often skipping through and missing half the stuff, it deals with the individual thousands of packets, and this generates more data. One problem and this is me understanding things wrong is that you cannot run the capture program without then applying the SQL straight away. If you run two captures, the second one will have duplicate Linker numbers, which will screw up the database. One problem which was annoying me was that the inventory wasn't being saved. Yet there's code there to do it... it turns out the inventory is being saved, but not loaded back. Actually to be precise it's more the announcement back to the client of the inventory, it happens as far as I can see too early. I added a function to delete the inventory (an internal store of objects), and a delayed second calling of create inventory in WorldServer: thus# int DelayedInventory = 0; (at top) [Before switch ( m_bWorldState )] if (DelayedInventory > 0) { DelayedInventory--; if (DelayedInventory <= 0) { // erase the last botched attempt.... m_pcAvatar->DeleteInventory(); cMasterServer::CreateInventory( this ); //Send create packets for inventory contents } } switch ( m_bWorldState ) { case 0: //First login ------------------ and this is set up here if ( pcRecvPacket->GetFlags( ) == 0x400 ) //400 message acknowledged { m_bWorldState = 4; DelayedInventory = 3; cMasterServer::CreateInventory( this ); //Send create packets for inventory contents cMasterServer::SendLoginData( this ); //Send login data (uses CreateInventory information) ---------------- and in avatar void cAvatar::DeleteInventory() { while ( !m_lstInventory.empty( ) ) { SAFEDELETE( m_lstInventory.front( ) ) m_lstInventory.pop_front( ); } return; } defined in avatar.h function prototype void DeleteInventory(); ------------------------- In TreasureGen.cpp there's a line needed for each CreateXXXXX( function) at the end something like cDatabase::AddToInventoryDB(who->m_pcAvatar->GetGUID(), aWand); or whatever the aXXXX is I made spawnitem take a name as a parameter, which makes it easier to spawn things I added a random distance to monster spawning. This was necessary as monsters attack now! MonsterServer needs quite a bit of work, but now a creature sees nearby enemies and goes for them. It also returns to base after. It's more or less right. Combat animation for melee wasn't working at all, and it was driving me nuts. In the end I went back to the earlier UAS1 and found it did work there, so I stole the "combat animation" code, and somehow that worked! But it's hardcoded for one attack. It needs to do low/medium/high. It's possible I mucked this up myself earlier. But I mention this in passing. Here's a question someone might know. I found a good many of the animations (by modifying !animation to default to the last number++ and working through) - the attack ones are 98-106 - but I didn't find ALL of them. In particular I can't find a stabbing animation, just more of a sweeping one. I'll make a list some time. For instance 106 is low kick. And another question: where are the female sounds? Ugh's and Arghs, etc? Looking at the way certain things are loaded - like monster spawns, NPCs, and permanent objects - I think it would be better to either load things up in a non-database way. Or a second program might do the load, and can just sit there in the background, and use shared-memory to supply whatever is needed. Oh and various hard-coded Maximum are too low once you start loading in captured objects. One big problem I can't get to the bottom of is a CLIENT crash that occurs once in a while. When it happens, the client restarted won't then connect to the server, so it's something the server has done to cause the client to crash. I might have to put some kind of a debug in that I can trap on demand in some way. The XP level code caused me to suddenly go from level 1 to level 126! I can't make sense of this line, so I fed in the XP table into a bit of code, it needs to be written properly, but it works now. Here's the line that was there - how was that ever supposed to work? 6 Xor 5? What's that all about? int level = floor( ( pow( (double)(9 * m_dwTotalXP + 6^5),(double)(1 / 5.0) ) - 6) + 1 ); That's all for now. Will post again.
  13. Thank you so much for your efforts with all this. It was a surprise when I was running around in Eastham in UAS2 and found the portal to Asheron's island actually worked!
  14. (UAS) Sound effects definitions

  15. Packet splitter for the capture tool

    I found the pcap capture tool was missing quite a lot of data, the bogus stuff was making it skip past great lumps of data. It was also crashing a lot with array bounds errors. I can't wrap my brain around the C# code in order to fix this sensibly. So instead I knocked up a tool to split up any cap file into one file per AC packet. Then you can feed a whole directory of these captures (numbered sequentially), and boom this processes every one of them. I had to knock the exception message box on the head right at the end of the code. This is now making large amounts of SQL against the various captures people have kindly made available. There are errors in this SQL.. which I guess needs sorting too. But anyone, here's the tool for anyone who needs it. It's fast, but it might appear to lock up because it's doing so many files. Use a simple output folder for ease of use, like c:\1 It might make it easier for people to look for particular packets. I knocked it up in an hour and a half so don't expect too much! It's old school, so it's fast and small. http://home.btconnect.com/geffers/ac/SplitFile.zip