Zatarita

Moderator
  • Content count

    299
  • Joined

  • Last visited

Everything posted by Zatarita

  1. This is part two in an ongoing series explaining how to mod halo cea. See part one here: In this tutorial we will go over our modding tools and learn how to use them by making a small mod. commands: invader-bludgeon --all -T invalid-indices -T invalid-enums -T out-of-range invader-refactor -M no-move -c model gbxmodel invader-strip --all invader-build -g mcc-retail -c -n levels/test/bloodgulch/bloodgulch links: Reclaimers Library: https://c20.reclaimers.net/ tutorial competition: https://opencarnage.net/index.php?/topic/8261-oc-tutorial-contest/
  2. Conservancy is a bat file I threw together to streamline the steps required to port a classic map to anniversary using invader and the anniversary HEK. This requires invader: https://invader.opencarnage.net/builds/nightly/download-latest.html Usage is simple. First extract invader and Conservancy into your Chelan_1 folder. Then you place all the maps you want converted into the "classic maps" folder The bat file will process each of the entries inside of the classic maps folder and use invader-extract to extract the data from the map. After each map has been extracted, it will run invader-bludgeon, and invader-strip on all the tags. Once this is done, it will extract the scenario name from the map using invader-info, and rebuild the cache file using tool. Once all of this has been finished, all the successful conversions will be built into your maps folder. This is practically the same process as the tutorial I made in the tutorials subforum, just automated with a bat file. Do note it is slightly inefficient bludgeoning, and stripping EVERY tag every time; however, for sake of automation the process has been simplified; that is a sacrifice needed to be made for ease of use. Do note if there were any issues with extraction/stripping/bludgeoning a manual approach may be required, to which I recommend following the tutorial here: Please post any issues. I have tested on multiple maps, and it seems to run as expected c: Happy modding! Conservancy.zip
  3. Hopefully we've all had a chance to familiarize ourselves with the maps c: Voting is officially open. Sorry for the delay :c Voting Rules You may vote for yourself. Voting closes on the 22nd @11:59pm GMT Prizes 1st Place: $100 via PayPal 2nd Place: $50 via PayPal 3rd Place: 10 Raffle Tickets Entries We appreciate all the people who have submitted an entry!
  4. Due Date: June 7th, 2022 Voting Opens: June 14th, 2022 Welcome! So happy to have you here this fine Friday. @Takka has reached out to me with a fun opportunity. Like what they have done in the past, we're bringing you a mapping contest. The prizes sit at $100 for first, $50 for second, and 5 Raffle Tickets for third. Also first place ( Like our wonderful donors c: ) gets an exclusive badge next to their name they can use to brag to all their friends c; FAQ Q: What is it? A: All you need to do is create a custom map (not yet released), and submit a forum post about it before the deadline. This time our Halo overlords have blessed us with the editing kits for later games; so we felt it might be fun to expand our scope to allow any game from MCC. We've gotten some feed back from the community as well about previous mapping competitions and we hope this year we can fine tune things a bit better to the community. We will have a slightly extended submission duration at a month and a half from today. We wanted to keep the duration manageable, without incentivizing procrastination. This should also give some extra time to debug any issues we might have with the quirks of the newer editing kits. Submissions will be voted for 1 week, beginning a week after closing date. This will allow the community time to get acquainted with the new maps and form opinions. We are only going to allow one submission per person. Q: Can I work with a team? A: You are more than welcome to work in teams; however, this is not required. If you do work in a team though, you cannot submit individually. We request still that there is only one submission per person. This is to hopefully drive users to quality over quantity. In the case that you do work with a team, one user must be the designated liaison who will be responsible for receiving potential prize money and distributing it amongst the members. OC will not responsible for the distribution to individual members. This individual will also be in charge of hosting the map and creating the submission post. Q: How will I be contacted if I win something? A: In the event that you win a monetary prize, a moderator will reach out to you through the DM system on this website, and prize money will be paid out through PayPal. In the case you win tickets, the OC ticketing system will send you a notification on this website. Winnings 1st Place: $100 via PayPal 2nd Place: $50 via PayPal 3rd Place: 10 Raffle Tickets Additional Means of Reward Share the Knowledge: Tutorials based on an element of your submission will earn you 10 Raffle Tickets. Developer Commentary: Create a Work in Progress topic exceeding 100 words for your map, and you'll be awarded 2 Raffle Tickets per post per day, with a limit of 10 total tickets. Promotion: Share any link to Open Carnage, prove it, and earn 8 Raffle Tickets. Rules Maps must be submitted to our MCC Map Releases section. Only one submission per person or team. Voting begins 1 week after submissions close. Teams must have a designated liaison responsible for managing the release, and any winnings received. Happy modding!
  5. you are correct. Yours is included, it just didn't make it on the list, we'll update the list to reflect that. Thank you for reaching out c: we apologize for the mix up
  6. Indeed! Voting begins in a week. Let's take this time is to familiarize ourselfs with the maps c: If you like check out the discord, you can find some players to make a server. After getting a few grunts in a row I'll be back here to post more detail on our voting will be done. Thank you all for the submissions! I look forward to playing them
  7. I appreciate the feed back, I’m unaware of a16r16g16b16_f; however, i do have the other in the table. They’re primarily used for light maps iirc. These are usually in the individual levels folder though. FThe table does have a list of known formats that work with the saber engine, so it’s possible I might have missed a few. I’ve managed do decompile all them to dds though and don’t recall that format
  8. Introduction Hello! My name is Zatarita! Today, we look at Texture files found inside of S3dpaks. On the Xbox release of CEA. The S3dpak is the primary file type used for storing game asset data. This means for the Xbox version the S3dpaks had to contain the textures used by the assets in scene. There are a few different files that work together to allow the engine to load and index textures when needed. For example TexturesMips64, and TexturesInfo. For more information on these the appendix. Depending on when you read this, there may be dedicated pages explaining them and how they work together. By the time you are done reading this tutorial. You should feel confident in your ability to navigate through a texture file. I will also show you a few techniques to extract the textures manually from the file; given you ever find your self with the need to do so. One thing to keep in mind is there are two different flavors of Texture. The ones in the pac_stream.s3dpak are different from the ones inside of the level s3dpaks. I'm assuming it was done this was so that s3dpak could stream the texture pre-formatted right into memory without any other processing. These streamed textures use the same format number as the non-streamed variants ( 0x6 ) inside the s3dpaks. So there is no easy way to tell which texture type you have without inspecting the data. These style textures are not going to be covered as I sadly don't have enough time at the moment, and requires a more nuanced explanation. I will cover these textures in their own post to give them the needed attention they require. DISCLAIMER I will periodically review this post to add updated information as new discoveries are made; however, all information present here is correct to my current understanding. Some things may be proven incorrect. Texture The Texture file utilizes a common system used by a lot of different saber files. Each 'structure' of data is assigned a sentinel value. Following this sentinel value is the end of block pointer. This end of block pointer points to the start of the next sentinel value. Everything in-between is data that belongs to the structure of data. The "structure" can be anything, sometimes even just one property of the data. For example, we can see in the picture above the sentinel "0F 00" in blue with the end of block value "0A 00 00 00" following it in pink. The value "0F 00" in this context denotes that the data is a signature. In green we can see the value of the data "TCIP" which denotes that the superseding data should be interpreted as texture data. Following this we have "02 01" and another end of block value. With an understanding of the sentinel system; I can explain the data in relationship to that system. It will make more sense. F0 00 - Signature ("TCIP") 02 01 - Dimensions Width, Height, Depth, Faces (0x400, 0x400, 0x1, 0x1) F2 00 - Format (0xC) F9 00 - Mipmap Count (0x1) FF 00 - Pixel Data ( ... ) 01 00 - End Of Data ( ) Additional Reading Format Formatting follows a similar system to the other files like TexturesInfo, TexturesMips64, and the Ipak. I have laid out on a table the supported textures for the Saber engine. Out of all of the options, only a handful are used by MCC, and they are highlighted in green. This table can be used to reference which format number is which dds format. As seen above in pink, the format of that texture is 0xC. Which corresponds to the value OXT1 on the table. For more information on the table see TexturesInfo in appendix. Extraction Now we get to the fun part. We're going to use the information we extracted from the data above to extract a DDS file from the Texture. For this we're going to need a few prerequisites. RawTex will help us generate us a DDS header for our data. Also, In order for rawtex to show us a preview it requires texconv to be installed in the same directory as rawtex. Once we've done this we can open rawtex, and drag a texture into the window. Briefly I will go over the UI. On the top left there is a textbox labeled 0xOFFSET which is how we tell rawtex where to find the pixel data. On the column to the left, and row on the top, there are height and width selection options, Plus text boxes where you can manually type it in. Also, on the column on the left, we have a few options for format. Following this is the "Try and Convert" button. There are a few other things; however, for our purposes this should be enough. The best way to figure it out is to play around with it. It's one of my go-to "Reverse Engineers Toolkit" items. Moving on, we're going to extract a texture using the above information. I grabbed a random texture and dragged it into a newly opened rawtex window. When we do that, we see this beautiful creation. We have to update the information to the correct properties using the data from the hex. The important data is the height, width, and format. For my case the data is 256, 256, OXT1. Once the correct values are inputted. We are shown the texture, and a .png copy of the texture is saved to the same directory as the original file once you click "Try and Convert". Conclusion The xbox version of the game utilizes s3dpaks as it's primary format for storing data. Because of this, they need to be able to support textures which can be utilized by assets on scene. They manage this with the "Textures" format. There are a few variants to the Texture format, and in this tutorial I introduced you to the non-streamed variant. In this brief spec I attempted to present to you enough information about the format to be able to navigate it's contents with some level of confidence. Thank you again for stopping in. PS Currently I'm unsure if there is a tool out there that can extract from Xbox s3dpaks; however, in the s3dpak specification I go over how you can manually extract data if needed. It's not too complicated. Appendix s3dpak TexturesInfo ipak / imeta
  9. Yo! So unfortunately the internet was killed by the guardians :c after a really long respawn timer (wasn't able to find a safe place :/ unfair) were back cooking with steam. To help balance things back out though, were extending things equal to the duration of that respawn timer. Essentially we were down ~2 weeks; thusly, we'll be adjusting the submission to Jun 7th, and voting will end on the 14th We're sorry about the interruption, we look forward to your submissions! c: Happy modding!
  10. Can you throw a performance monitor on network traffic and then check system logs around the time the network drops? I'm curious if maybe there are ddos protections that are set too low
  11. We are currently aware of the issue, sadly atm need to wait and see how long this remains an issue. If they fix it in a week/two, we may consider just extending the a bit. If it's an issue through the whole duration of the competition though we will have to come up with a more solid solution. Essentially we will accommodate for this as best we can. We hope for the best; however, we are preparing for the worst. I do apologize for the inconvenience though
  12. Spent an embarrassingly long time writing a rubiks cube random scramble generator. I didn't realize there would be so many hoops to jump through. Had to account for coaxial movements to skip redundant moves, and set up xamarin forums and stuff. 100% new to me, and c# is confusing coming from years of c++.
  13. Birfday
  14. I love this ccc:
  15. A bit late to the party, but to anyone else curious in the future you should be able to extract and rebuild with invader as well c: This is a more modern solution, that also allows you to specify other targets (such as xbox, or MCC) as well c:
  16. Similar to the Tools Shortlist, you can find many of the most useful MCC tutorials listed here. MCC Compression Formats Detailed information on compression formats used by various files. Running MCC Modding Tools on Linux With Wine Tips on configuring wine for the MCC mod tools. Porting CE Maps To MCC Tips on how to port existing CE maps to MCC. Working With GBXModels Creating and working with models used by the engine. Editing Thumbnails and Loading Screen Map Names Modifying the main menu elements for MCC. S3dpaks Detailed information on the s3dpak and some of its contained files. Tutorials making it to this list earn 8 Raffle Tickets!
  17. This song is lit
  18. Ordered a new speed cube \(◎o◎)/ It has mag lev ._. we live in the future Edit: It has arrived! https://cdn.discordapp.com/attachments/252461260560400384/933379847617671249/IMG_3257.mov
  19. Welcome! Recently I've been keeping pretty busy. I started going back to school, and the holidays have kept me going; however, I found some free time and I wanted to do something modding related. I read a lot of questions about custom models on some of the discords I frequent. I felt this would be an awesome opportunity to expand our knowledge base on OC. C20 has a lot of extremely useful information, but my hope is to teach you a deeper understanding of how the engine handles creating and managing a model presented in a scene. A GBXModel is the pc variant for the tag used to define a model used as an asset for Halo. A GBXModel isn't just "a model" but instead it is a collection of models. These models define the objects state for a given instance or condition. These models can be broken down into Regions and assigned Permutations for some variation, defined Levels of Detail for proper optimization, bound to Nodes for animation, and assigned Markers for special effects. In order to create a GBXModel we need to use tool's Model command to compile the raw model (jms) into a GBXModel. Tool will take all of our different models and compile them all into the collection of models discussed above. Of course this is an oversimplification for the introduction to the concepts, there's a bit more that goes into it. I will discuss each of these ideas later in the post. Table Of Contents 1. Nodes 1-1: Summary 1-2: Example Hierarchy of Nodes 1-3: Creating a Node Newer Versions Of Max Older Versions Of Max 1-4: Other Node Information 1-5: Common Node Issues Tool Ghost JMS Exporter 2. Regions 2-1: Summary 2-2: Example Region Variations (Permutations) 2-3: Creating a Region Blitzkreig & Ghost JMS Exporter FBX-to-jms 2-4: Creating a Permutation 3. Markers 3-1: Summary 3-2: Example Markers 3-3: Creating a Marker 4. LODs 4-1: Summary 4-2: Example LODs 4-3: Creating LODs 5. Creating GBXModels 5-1: Exporting FBX-to-jms Ghost JMS Exporter 5-2: Compiling a Model Additional Information PLEASE If I missed anything, or could make anything more clear lemme know c: I would like for this to be as accurate and complete as possible. It took me 8 hours to write this up, I want to make sure it wasn't for waste! Happy modding Updates: 12/22/21 Markers : TY Galap/Mata for the suggestion to clarify markers aren't required to be spheres, and reemphasize that orientation matters. Regions : Updated network sync details 12/25/21 Markers : included example LODs : Wrote introduction 01/06/22 LODs: Wrote "Creating LODs" Formatting: Adjusted nodes to its own post setup TOC. 01/11/22 Formatting: Finished To Do Once I have time to update: Discuss GBXModel Importer by ghost
  20. Creating GBXModels creating a GBXModel requires us to export our data from 3ds max in a format tool can utilize. This format is called .jms and to get a model in that format we have a few options: Ghost JMS Exporter, Blitzkrieg, and FBX using H1A-EK's tool. For this tutorial I will touch on Ghosts JMS Exporter, and tool's fbx-to-jms converter which are the more popular of the options. All jms files are expected to be inside of a folder named "models" and this folder is expected to be found inside your "data" directory. Beyond this it is up to you how you wish to organize your folders. Tool will mirror the naming convention you used with the "data" folder in your "tags" folder for compiled files. If you save your models in "data\scenery\new_thing\models" tool will compile your GBXModel to "tags\scenery\new_thing\new_thing.gbxmodel" and create the necessary folders to facilitate that. Exporting Compiling a Model:
  21. Levels Of Detail (LODs) LODs are (optional, but highly recommended) optimized versions of permutations that are chosen based off distance the object is from the camera. Your first instinct might be "My computer was built almost 20 years after this game has been made. It can handle high poly counts, let's crank up the detail."; however, I would like to temper your expectations. There are two main reasons for this: 1) High poly counts does not necessarily mean better detail (It may just be poorly optimized). It's better to say more with less. Not everyone has a high end system. We can't forget this is a game and people may wish to play competitively against each other. a versatile asset uses only the amount of detail necessary to say what it needs to say. 2) Something I call "Detail Dissonance"; When your mesh has more detail than surrounding meshes it contrasts more with the scene. Artistically this draws someone's eye more to that object. This this could be a good or bad thing depending on your desired outcome. It is in my opinion that high poly model surrounded by low poly models can break the cohesion, and unbalance a scene if not done properly. Using LODs will help prevent this for far away objects. Halo allows you to define 5 optional stages of LODs: super-high high medium low super-low Tool will remind you when compiling GBXModels to set the LOD cutoffs. These are set inside guerilla and determine the threshold where one switches to the other. (see below "Creating LODs") Something to note about LODs and markers and nodes. You still require all of the nodes to be in each LOD version; however, markers are only read from the Super-high LOD. This means if your mesh doesn't utilize a Super-high LOD your markers aren't going to be included. If you don't use any LODs the default option will be super-high, so this may not be an issue. Though, do keep it in mind. Example LODs: Creating LODs:
  22. Markers Markers are points relative to the mesh that can be used to define a position (and rotation) used for things like spawning special effects or attaching an object to another. For example we could have a marker at the end of a gun that emits smoke, or a marker used to attach the pipe to the Keyes' hand. Markers are created similar to nodes; however their names must start with a #. They are represented with a scene object, such as a sphere or other primitive. The object is just a handle used to adjust position and orientation of the marker relative to a node. None of it's mesh data will be included once we export. When creating tags that utilize the gbxmodel we can define the effects that spawn at the markers, or in scripts we can reference the marker names directly. Any markers that happen to have the same name will have the effect applied to both positions at once. For example if you have two marker called "#steam_emitter" and you attach a steam emitting effect to that marker name, both markers will emit steam. It's also worth noting that markers are owned by the permutation. This means that unlike nodes there don't have to be the same amount markers for all permutations. You can have a permutation that has two steam emitters, a perm that has one steam emitter, and a perm that has none if you like. There are a few special case markers as well. Halo uses these for certain functionality like head position so AI knows where to look, or hand locations. For more information on this check out the c20 page on markers; They do a great job explaining this, and I don't want to reinvent the wheel. Example Markers: Creating a Marker:
  23. Regions Regions are named sections of a model. This allows you to create different versions for that section of model that can be selected randomly or assigned with scripting. These variations are called Permutations. There are other uses for regions; however, they are covered more in the collision_geometry section of the tutorial. Because these permutations can be selected randomly the region needs to be mapped to the same bones as the base mesh. Which means they require the same amount of nodes even if the vertices that those nodes bind to doesn't exist in this permutation. There are special case regions used by the engine when specific conditions are met: ~damaged : Gets chosen when the object's health reaches a certain threashold. ~shield_off : Gets chosen when the object's shields run out ( If it has shields ) ~primary_blur : Chosen when a weapon reaches a firing speed threshold with primary trigger pressed. ~secondary_blur : Chosen when a weapon reaches a firing speed threshold with secondary trigger pressed. ~blur : Chosen when vehicle reaches a speed threshold specified in a vehicle tag. These special permutations are completely optional; however, they add a lot of life to a object. They will make a bit more sense when we get to collision models, I will hold off on explaining them until I get around to making that tutorial. Something to notice is that these names all start with a "~" which is a special character used to tell the engine that this region isn't one that we want to get randomly chosen. We can use this naming convention for our own purposes if we like; however, the only way we can utilize a permutation like that is through scripting. For people making campaign/coop missions this may be desirable. Also any permutation selected randomly will not synchronize over a network. This means in order to use permutations as variations for objects online, and have each player see the same one, you MUST select it with a script at start up. If not each player can have a different random permutation set. For some scenery objects this is not that big a deal. For example halo 3 uses this concept to change the position of stickers on a barrel. For other objects though you need to be careful as it may cause inconsistencies between clients. My general rule of thumb for this is "if the collision stays the same it's ok". A random pile of papers on a table, or different labels on a barrel won't impact game play; though, a soda machine being there for some people and not others can be game breaking. Having permutations can add some variety to your maps, but try to keep it to smaller details for multiplayer, or force the permutation with a script for all clients. (optionally you can also create LODs once you're done creating regions and permutations) Example Region Variations (Permutations): Creating A Region: Creating a Permutation:
  24. Nodes Nodes are anchor points for our 3d models. They are called nodes because they determine the object hierarchy like a graph. Every model requires at minimum a root node. This node must be prefixed with "frame" or "bip01". Beyond that nodes act like "bones". You anchor a portion of the mesh to a node, and when we animate; it's the nodes that we are animating. Each part of a mesh that moves during animation needs to be assigned to a node. It's worth noting that each vertex can only be influenced by up to two nodes in the case of a rigged model. There are other uses for nodes as well; however, I will cover those later in the collision_model. Nodes don't have any mesh data themselves, they represent a point in a hierarchy with a 3d coordinate and orientation. We typically represent them as a scene object such as a sphere; however, this is only used to interact with the node in the scene. Once we export the models to jms the 3d position, orientation, and position in the hierarchy are the only bits of information passed through to the GBXModel. It's also important to remember nodes need to remain consistent between permutations. (discussed later) Example Hierarchy of Nodes: Creating a Node: Other Node Information: Common Node Issues
  25. I like it c: not only is it "a single line" it's also branchless which is more efficient c: Mark it down as an optimization to make it sound fancy c; Not completely sure how the scripting language works, I'm assuming you're trying to toggle a value. but if you could xor you could theoretically avoid the comparisons as well by just xoring it against true If the state is false xor true -> true If the state is true xor true -> false I like the thought behind the move c: branchless programming can be pretty powerful. Awesome work