Making custom chests with controlled drops

Making custom chests with controlled drops

Description: by Xenast

Categories: Tutorials (1.1x) - Unit Mechanics


Introduction


Ok, for this tutorial I will go over the steps required to make simulated chests. This is done by making monsters that appear as chests. When we are done the only way to open the chest will be via physical attacks (missles such as arrows will not work).





These chests will function exactly like D2 chests, and aside from a slight string display difference, will be exactly the same as a regular chest in game, except you can fully customize the drop of these chests.





This tutorial will be a little longer then others, but that is because I will add notes on all the changes for those interested. I also take some extra steps other may not, but everythings in the details, so its best to do things properly.


You will also need some basic mod knowledge to make this work (know how to edit strings, basic drop editing, ect).





Here is a screenshot of a chest that has been opened, as well as 2 others beside it:


*Screenshot*


As you can see the only difference between this and a real chest is the red background behind the name, other then that they are exactly the same.





Part I: Extracting/Converting the Chest Animations





First thing we must do is extract the chest Animations, rename them, and place them in their new directory. You can use any chest animation you want, however for the purpose of this tutorial I used the act 2 horadric item chest animation, which is code 'xk'.





Now open d2data.mpq and extract the following files:


data/global/objects/xk/tr/xktrlitnuhth.dcc


data/global/objects/xk/tr/xktrlitonhth.dcc


data/global/objects/xk/tr/xktrlitophth.dcc


data/global/objects/xk/cof/xkNUHTH.cof


data/global/objects/xk/cof/xkNONTH.cof


data/global/objects/xk/cof/xkNOPTH.cof





To figure out what token each chest animation uses, extract and open objects.txt and look at the 'token' column for each chest type








Now, go to your mod directory and make the following folder:


data/global/monsters/!C/tr





'!C' will be our new animation token for the monster, you must make sure no other monsters use this token in monstats.txt (no existing entries use special characters, such as ! and #).





Copy xktrlitnuhth.dcc, xktrlitonhth.dcc, and xktrlitophth.dcc to this folder. Rename them to the following:





xktrlitnuhth.dcc renamed to !ctrlitnuhth.dcc


xktrlitonhth.dcc renamed to !ctrlitddhth.dcc


xktrlitophth.dcc renamed to !ctrlitdthth.dcc





I highligthed the changes in bold to make it easier to read.





NU is the monsters Neutral animation, used when it is no moving. DD is the monsters corpse animation. DT is the animation the monster plays as it dies.


If you use cv52 with the dcc addon you can open the three dcc's and see why we assigned each monster animation the file we did.








Now in the mod directory add the following folder:


data/global/monsters/!C/cof





Now copy xkNUHTH.cof, xkNONTH.cof, and xkNOPTH.cof to the folder. rneame them to the following:


xkNUHTH.cof renamed to !CNUHTH.cof


xkNONTH.cof renamed to !CDDHTH.cof


xkNOPTH.cof renamed to !CDTHTH.cof





Note: It is very important you do this step right. If you make any typos, place files in the wrong place, the animation won't work properly.





Part II: Adding animdata.d2 lines





Next, extract animdata.d2 from d2exp.mpq. Use animdata_edit to convert the file to a txt file, and open it. Find the following lines:


XKNUHTH


XKONHTH


XKOPHTH





Now, create three new rows at the end of the file. Copy the above lines into these rows and rename the first column as follows:


XKNUHTH renamed to !CNUHTH


XKONHTH renamed to !CDDHTH


XKOPHTH renamed to !CDTHTH





As with renaming the animation files, if you make a mistake here, it will also cause animation errors. Be careful and take your time.





Part III: Monstats.txt Entries





Ok, if you made it this far, your done the most tedious part. Now, go to the end of monstats.txt and add a new row. Give it the following entries (If I don't mention a column, leave it blank):





Id: Chest1


hcidx: 704 (or if you have added new lines before use the next avilable value)


Baseid: Chest1


NameStr: Chest1 Your string id, don't forget to add it to your string file after


MonStatsEx: Chest1


MonProp: chest1


AI: Idle This AI allows the chest to be idle, as well as prevents hirelings from targeting the chest


Code: !C Make sure this matches the code you used for the animation/animdata.d2 files


Enabled: 1


MinGrp: 1


MaxGrp: 1


Velocity: 0


Run: 0


Rarity: 1If left blank chests will not spawn. Higher values will increase the number of chests spawned.


Level: 1 (same for all difficulty settings)


monsound: chest1


Umonsound: chest1


Threat: 1 This will make sure minions/hirlings dont attack the chest unless your literally standing on top of it


isSpawn: 1


Boss: 1 This will make the chest immune to curses as well as a few other unimportant unseen effects


killable: 1


noAura: 1 This will prevent the chest from receiving auras fro monsters, which would look out of place


petIgnore: 1 Apparently disabled in 1.10, it is supposed to make hirelings/minions ignore the monster


Noratio: 1 If left blank elemental damage immunities will not work properly


minHP:1 (same for all difficulty settings)


maxHP:1 (same for all difficulty settings)


Ac: 1 (same for all difficulty settings)


Treasureclass columns: Whatever you want, heres how you get your custom drop


Eol: 0





We did not use the immunity columns here because they will display under the chest name, which won't look right. Instead we add damage immunitues with monprop later in the tutorial.








Part IV: Monstats2.txt Entries


Ok, same deal as the monstats.txt explanation:





Id: Chest1


Height: 3


OverlayHeight: 3


pixHeight: 96


SizeX: 1


SizeY: 1 Take values from the same columns for the chest you converted in objects.txt


MeleeRng: 0


BaseW: hth


HitClass: 3


TRv: lit


TR: 1


TotalPeices: 1


mDT: 1


mNU: 1


mDD: 1


dDT though dRN: 8 in each column


Restore: 1


noOvly: 1 Only set if noaura is set to 1 in monstats.txt, prevents visual glitches


isSel: 1


isAtt: 1


deadCol: 1


unflatDead: 1 alone this column does nothing, but with the deadCol it makes it so players can't alk on the corpse, which is another detail to making the chest appear real


Shadow: 1


light-r: 255


light-b: 255


light-g: 255


Heart: xxx


BodyPart: xxx


Infernolen: 1


RessurectMode: NU


Eol: 0





Part V: Testing


Ok, now spawn the chest via levels.txt to see if it working right (you should be able to walk up and 'kill' it, and the whole process should look like you opened a chest).


Many of you will probably find animation errors (no 'corpse', chest doesn't appear at all). This is 99.9999% caused by messing up steps 1 and 2. I confused the files myself the first time I tried this and spent hours fixing and testing typos. The above will work if you have done everything right.





Anyway, once you confirm you have the above done right, there is a few more steps, outlined below.





Part VI: Sound Effects


Time to make the chest play that nice little sound effect when you open it. Open monsounds.txt and make a new row, give it the following entries:





id: chest1 This entry much match your monstats.txt 'monsound' and 'Umonsound' entries


DeathSound: object_chest_small


Eol: 0





Thats it, run the game and open your chest, it should now have sound.


There is also 2 more chest noises, 'object_chest_large' and 'object_chest_special', use whichever suits you best. Also, the names to put in the 'Deathsound' column are referenced from sounds.txt for those of you wondering





Part VII: Properties.txt


What does this have to do with anything you ask? Well, before we give our chest its elemental immunities, we need to add one more property. We are going to also make our chest immune to missles, primarily useful for preventing arrows from opening the chest.





This actually quite simple, open properties.txt and make a new row with the following entries:





code: missim


*done: 1


func1: 1


stat1: passive_avoid This stat already exists in itemstatcost.txt


Eol: 0





What passive_avoid actually does is give the player a chance to avoid missle attacks while standign still, but we will make it simmulate immunity by granting 100% chance to avoid.


You can also add a string entry to the *desc column and use this as an item stat also if you wish.






Part VIII: Giving the chest elemental immunitues


Ok, we are at the last required step. Here we will use monprop to make our chest immune to all elemental damage, as well as apply our missle immunity.





Id: chest1


prop1: missim This is our missle immunity property we created earlier


min1: 100


max1: 100


prop2: res-all


min2: 200


max2: 200


prop3: res-mag The res-all stat does not cover Magic Damage, hence why we added mag-res on its own


min3: 200


max3: 200


Eol: 0





IMPORTANT: You must add the above entries for each difficulty column, or else your chest will only have immunities on Normal Difficulty.





Part IX: Final Test, Check List


Ok, congrats, you now know how to make your own custom chests. Below is a final list of things to check:


~Animations work properly


~Monster auras do not affect chest


~Player cannot walk through chest


~Player cannot walk through chest after its been opened


~Posion, Magic, Cold, Lightning, Fire damage do not damage chest


~Curses cannot be applied to chest


~Missles such as arrows will not open the chest





Part X: Spawning the chest


Its best to spawn the chest as an object and later insert it into a ds1 of choice, I won't cover how to do so here, as a tutorial already exists for that.


Adding ANY Monsters and ANY Objects to a DS1 (by Paul Siramy)





Part XI: Optional Touches


Yup, even when you think your done, theres more. The following is some examples of just how versatile these chests are.





Automap


Remember how quest related chests have their own automap? The same can be done with our chests.





Open monstats2.txt, and add the following column entries:


automapcel: 318


noMap:1





Thats it, now go in the game, and your chest will have an automap.





Trapped Chests


Since we have already added a monprop row for the chest, we can add a death-skill, which can essentialy make a very customized trapped chest.





Open monprop.txt and add the following:


prop4: death-skill


par4: skill id from skills.txt that you wish to use for the trap


min4: minimum skill level


max4: maximum skill level





Extra Display


You can also add a small message under the chest name by editing the following in monstats.txt (this text would go in the same size/place immunities are usually listed at for monsters in-game):





DescStr: add the string for your extra txt message





Concepts


1. Since the chest is immune to elemental damage, you can place it near a monster that has an aura that grants physical immunity, thus making the chest unable to be opened before the monster is killed. Just make sure if you do this you go back to monstats.txt and make 'noaura' column blank.





2. For advanced modders, you can also make the chest immune to physical damage, and create a new damage type that only effects this chest. Then, you place the new damage type on a 'key', thus making soft-coded locked chests.


Discussion of softcoded new damage types can be found here





3. The above technique can also be applied to other objects. For example, you could make a simulated shrine that applies a benificial curse to you when it 'dies'.





Part XII: Credits


librarian, Nefarius and onyx for corrections/improvements. See This thread for more information.

Link to this article: Select all

[url=https://d2mods.info/forum/kb/viewarticle?a=446&sid=ade01d2aee2bba6fa86ed077bd0587ef]Knowledge Base - Making custom chests with controlled drops[/url]