Announcement

Collapse
No announcement yet.

Small Mod compilation

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Seven
    replied
    Hello Lightning Hunter,


    Originally posted by Lightning_Hunter View Post
    Ah, so your solution is to exclude the flying monster cloning in E4M3? I should have mentioned that I saw this bug at least 2 other times while playing through Quake, but E4M3 was simply the easiest map to reproduce the bug in! I guess I can always just exclude Wizards from being cloned altogether if I keep encountering the bug. That would be a bit of a shame, but necessary in the end.
    I told you my thoughts about it in previous post and how I would approach.
    You have to decide, if you want to enable this feature by default in your mod.
    It will make all maps brutally hard, as the monster count will be at least doubled.

    Be careful with this decision, as this will affect the gameplay/difficulty significantly.
    The creators of maps have decided and finetuned the monster, ammo, armor, weapons placements during their creation and playtesting.
    Most of the time, they added 4 different difficulties to choose from.
    By changing this, the map will be totally different.

    For example:
    Ammo, armor and so on will be much less to kill the double amount of monsters in the map.
    Playing with this powerful feature should be considered and decided by each player individually.
    That is why it is and always will be disabled by default in the SMC.

    And as explained before, the culprit for your experienced bug in my opionion is not the code.
    Time to move on to your next point





    Originally posted by Lightning_Hunter View Post
    On another topic, I've been improving all the pain skins. I never liked how the existing pain skins were added to the existing skin (blendfunc add) rather than blending with it (blendfunc blend). I don't blame you for setting it up this way of course, since a blended skin looks bad if there isn't a unique pain skin for each individual monster. As such, I am creating a unique pain skin for each monster. I also discovered a bug along the way that I believe I have fixed (hopefully without causing other bugs). In this following code, I noticed the pain skin is only supposed to appear when the monster's health is halfway depleted, but instead the pain skin was showing up after firing the very first shot. I think the culprit was with the "else" command halfway through the "pain_skin_entity_think" function. I added a comment in the code below to my fix. Let me know if you think this might create more bugs, although so far the pain skins now work as they should!
    You write:
    the pain skins now work as they should!

    Please excuse me, but I think you did not understand how the painskins are coded and work.
    There is no bug in the code.
    And the way you wanted to edit the code shows me, that you still are not 100% sure what you are doing (and understanding QuakeC).

    But thats fine. We are here to help.
    Let me tell you how the code works and hopefully it will be clearer in the end:



    First, the code checks if the monster is wounded (it doesnt matter how much).
    If thats the case, it will go deeper into the function.
    That is done by this line:
    if (self.owner.health < self.owner.health_initial)

    OK, now we know, that the monster is wounded.
    Now, we want to know how much it is wounded, because we have 2 painskins !
    1 painskin for lightly wounded monsters and 1 for heavily wounded monsters.

    That is why I check how much the monster is wounded with this line:
    if (self.owner.health < (0.5 * self.owner.health_initial))

    If this is the case (monster lost more than half of his health), it is heavily wounded and will use its painskin: 3
    Painskin 3 is the one with the many wound textures (you can find it inside the pk3)



    Now to the part, that you didnt understand:
    We know until now, that the monster is wounded. We also know that we did the code for heavily wounded monsters already.
    Now whats left to do is the part for the lightly wounded monsters.

    That is why we only need an: else
    We do not need an additional if check anymore, because we are already done with the checking.
    So, we can tell the monster to use its painskin: 2

    We are done with the painskin code.



    Regarding your line, that you wanted to edit the function with:
    This is an exact copy of the line we already used at the beginning.
    You should never use the same comparism twice in a function.


    It would mean something like this (example):
    You are checking if an apple is green.
    Your first check: If its green you will eat it.
    Your second check: If its green you will eat it.

    As you see, you will always eat it
    That makes no sense.



    If you didnt notice, that the SMC has 2 painskins, then you didnt understand the code itself (also all the scripts, that handles the different monster/pain skins).
    Because I would not need to check how much the monster is wounded in the first place.
    That is what I meant when I mentioned above: 100% understanding the code (QuakeC).

    Please, be sure first, that you fully understand a function before you edit it.

    But that is fine, as we all have a learning curve.






    Regarding your textures:

    Very good job on the soldiers.
    They look really good !

    The Afrit shows some lines/areas where the texture does not fully match the model geometry/edges.
    Examples his hands. Some parts are "smooth" while other are "rough" on the same surface.
    But you are on a good way.

    Yakman looks good too.


    I see, that textureing is your world.
    Knowing you from earlier years, were you spend lots of time in Quake and also Unreal (with a complete texture pack).
    You are very talented and made great content already for this community.


    Keep up the good work,
    Seven

    Leave a comment:


  • Lightning_Hunter
    replied
    Originally posted by Seven View Post
    Hello Lightning Hunter,

    My suggestion to fix this:

    Replace in wizard.qc:

    with:


    That should stop it.

    Ah, so your solution is to exclude the flying monster cloning in E4M3? I should have mentioned that I saw this bug at least 2 other times while playing through Quake, but E4M3 was simply the easiest map to reproduce the bug in! I guess I can always just exclude Wizards from being cloned altogether if I keep encountering the bug. That would be a bit of a shame, but necessary in the end.

    On another topic, I've been improving all the pain skins. I never liked how the existing pain skins were added to the existing skin (blendfunc add) rather than blending with it (blendfunc blend). I don't blame you for setting it up this way of course, since a blended skin looks bad if there isn't a unique pain skin for each individual monster. As such, I am creating a unique pain skin for each monster. I also discovered a bug along the way that I believe I have fixed (hopefully without causing other bugs). In this following code, I noticed the pain skin is only supposed to appear when the monster's health is halfway depleted, but instead the pain skin was showing up after firing the very first shot. I think the culprit was with the "else" command halfway through the "pain_skin_entity_think" function. I added a comment in the code below to my fix. Let me know if you think this might create more bugs, although so far the pain skins now work as they should!

    Code:
    if (self.owner.health < self.owner.health_initial)
    {
    if (self.owner.health < (0.5 * self.owner.health_initial))
    {
    if (self.owner.painskin_helper == 2) // "2" is regular spider (it has 8 used skins)
    self.skin = 9;
    else if (self.owner.painskin_helper == 3) // "3" is yakman (he has 5 used skins)
    {
    self.skin = 6;
    if ((self.owner.skin == 1)||(self.owner.skin == 2))
    self.alpha = autocvar_painskin_transparency - 0.1; // on dark skins painskin is stronger
    }
    else if (self.owner.painskin_helper == 4) // "4" is necromancer (he has 3 used skins)
    {
    self.skin = 4;
    self.alpha = autocvar_painskin_transparency - 0.1; // on dark skins painskin is stronger
    }
    else
    self.skin = 3;
    }
    
    else //I believe this is where the bug is. I changed it to else if (self.owner.health < (0.5 * self.owner.health_initial))
    
    {
    if (self.owner.painskin_helper == 2) // "2" is regular spider (it has 8 used skins)
    self.skin = 8;
    else if (self.owner.painskin_helper == 3) // "3" is yakman (he has 5 used skins)
    {
    self.skin = 5;
    if ((self.owner.skin == 1)||(self.owner.skin == 2))
    self.alpha = autocvar_painskin_transparency - 0.1; // on dark skins painskin is stronger
    }
    else if (self.owner.painskin_helper == 4) // "4" is necromancer (he has 3 used skins)
    {
    self.skin = 3;
    self.alpha = autocvar_painskin_transparency - 0.1; // on dark skins painskin is stronger
    }
    else
    self.skin = 2;
    }
    }

    And for fun, here are some screenshots of the new pain skins and other HD skins ​to show what I've been up to. I took these screenshots without any Darkplaces lighting effects, because I wanted to show the skin quality without any fancy effects. I always feel a skin should look great without lighting, but sadly, many skins out there look terrible when you take away the in-game lighting. This is probably only about 3% of the HD content I have done in the last month. Haha.

    Updated soldier showcasing the pain skin (the Grenade launcher is a redone PrimEvil skin):


    New soldier with some variants behind him (parts of the soldier such as the face borrowed from Reforged; Armor of the variants borrowed from the PrimEvil player skin; 90% of the rest done by me):


    New Nailgun Grunt variants. The shirt/armor borrowed from PrimeEvil player skins, touched up by me. The Nailgun is a redone PrimEvil skin:


    New Reiver variant with pain skin done by me:


    New HD Yakman skin done entirely by me (also with the new pain skin applied):



    And here is a comparison of the old Wyvern skin with my new Wyvern skin, done entirely by scratch from me. I downsized it to 2k for the purpose of uploading it here, but the version I have is 4k.



    Last edited by Lightning_Hunter; 09-23-2023, 02:47 PM.

    Leave a comment:


  • Seven
    replied
    Hello Lightning Hunter,

    As far as I can tell, the Clone Code works robust.
    What you describe is Quake´s teleport/telefrag mechanic, that cannot handle the amount of entities at once.

    You will most probably never see a bug with the clone feature in any map, when the entity (=monster) is spawned at map start.
    That shows us, that the bug is related to teleporting monsters into map positions. Just as you experience it.

    The map developer did not have this amount of monsters in mind when creating the map.
    That is where you would have to start fixing it.


    My suggestion to fix this:

    Replace in wizard.qc:
    do_the_cloning__fly_swim ();
    with:
    if (world.model != "maps/e4m3.bsp")
    do_the_cloning__fly_swim ();
    That should stop it.


    If it still happens, it is due to increasing monsters count in that trap via SMC´s monster_support feature.
    You can do the exact same as shown above to the wizards (or whichever monster you want to edit) support functions:
    add_reiver_support_fly ()
    add_afrit_support_fly ()
    etc.

    Best wishes and enjoy your weekend,
    Seven


    Leave a comment:


  • Lightning_Hunter
    replied
    Thanks for the response, Seven. After some tinkering around, it appears that the bug is related to the monster cloning code. If I turn off cloning, it no longer happens. I don't believe I've ever seen this bug with a walking monster, so it must be related to flying monsters only. One thing I noticed is that Wizards appear to be spawning nearly on top of each other in some cases. Isn't the cloning code supposed to prevent that? I noticed that walking monsters will briefly appear on top of each other at the start of a level before one disappears to prevent overlapping. As you can see in this screenshot with the E4M3 wizard trap, there are lots of wizards piled on top of each other. It is with this trap that the bug will happen 90% of the time.



    Perhaps you can point me to some code that might be to blame for this? Even just a few pointers you might have. If you point me to the code that prevents monsters from overlapping, then I could start there (if that is in fact the cause).

    This is the cloning code for the flying monsters I believe, found in clone_monsters.qc:
    Code:
    void() Clone_fly_swim =
    {
    local entity clone, head;
    local float done, c, proceed;
    local vector ang, pos;
    
    done = 0;
    c = 0;
    ang = self.angles;
    while (done == 0)
    {
    makevectors(ang);
    pos = self.origin + (60 * v_forward) + (crandom() * 33 *v_right) + (crandom() * 25 *v_up); // randomize the spawn position !!
    head = findradius(pos, 35);
    proceed = 1;
    while (head)
    {
    if ((head.health > 0) && (head.flags & (FL_MONSTER | FL_CLIENT)))
    proceed = 0;
    head = head.chain;
    }
    traceline(self.origin,pos,FALSE,self);
    if (trace_fraction == 1 && (proceed == 1))
    {
    traceline(self.origin,(pos-'40 40 0'),FALSE,self);
    if (trace_fraction == 1)
    {
    traceline(self.origin,(pos+'40 40 0'),FALSE,self);
    if (trace_fraction == 1)
    {
    done = 1;
    }
    }
    }
    if (done == 0)
    {
    ang_y = ang_y + 36;
    c = c + 1;
    if (c==10)
    {
    return;
    }
    }
    }
    clone = spawn();
    copyentity (self,clone);
    total_monsters = total_monsters + 1;
    setorigin(clone, pos);
    
    // randomly transform skin and model of cloned monster, if multimodel/multiskin feature is used !
    
    local float zufall;
    if (clone.multiskin == 1) // multiskin = 1 means: use 2 different skins for (ID1) model
    {
    if (random() >= 0.5)
    clone.skin = 0;
    else
    clone.skin = 1;
    }
    else if (clone.multiskin == 2) // multiskin = 2 means: use 2 models with 1 skin each
    {
    if (random() >= 0.5) // use model 0 for clone
    {
    if (clone.monstermodel == 0) // no need to change anything, clone uses already correct model
    return;
    else // change to model 0, precache and set new models
    {
    if (clone.classname == "monster_fish")
    {
    setmodel (clone, "progs/fish.mdl");
    setsize (clone, '-16 -16 -24', '16 16 24');
    }
    else if (clone.classname == "monster_wizard")
    {
    setmodel (clone, "progs/wizard.mdl");
    setsize (clone, '-16 -16 -24', '16 16 40');
    }
    else
    return; // unknown monster-type, better jump out of this function
    clone.monstermodel = 0;
    }
    }
    else // use model 1 for clone
    {
    if (clone.monstermodel == 1) // no need to change anything, clone uses already correct model
    return;
    else // change to model 1, precache and set new models
    {
    if (clone.classname == "monster_fish")
    {
    setmodel (clone, "progs/fish1.mdl");
    setsize (clone, '-16 -16 -24', '16 16 24');
    }
    else if (clone.classname == "monster_wizard")
    {
    setmodel (clone, "progs/wizard1.mdl");
    setsize (clone, '-16 -16 -24', '16 16 40');
    }
    else
    return; // unknown monster-type, better jump out of this function
    clone.monstermodel = 1;
    }
    }
    }
    else if (clone.multiskin == 3) // multiskin = 3 means: use 2 skins for model 0 and 1 skin for model 1
    {
    zufall = random();
    if (zufall > 0.66) // use model 0 and skin 0 for clone
    {
    if ((clone.monstermodel == 0) && (clone.skin == 0)) // no need to change anything, clone uses already correct model and skin
    return;
    else if (clone.monstermodel == 0) // model is correct already, only change skin
    {
    clone.skin = 0;
    return;
    }
    else // change to model 0, precache and set new models
    {
    if (clone.classname == "monster_fish")
    {
    setmodel (clone, "progs/fish.mdl");
    setsize (clone, '-16 -16 -24', '16 16 24');
    }
    else if (clone.classname == "monster_wizard")
    {
    setmodel (clone, "progs/wizard.mdl");
    setsize (clone, '-16 -16 -24', '16 16 40');
    }
    else
    return; // unknown monster-type, better jump out of this function
    clone.monstermodel = 0;
    }
    }
    else if (zufall < 0.34) // use model 0 and skin 1 for clone
    {
    if ((clone.monstermodel == 0) && (clone.skin == 1)) // no need to change anything, clone uses already correct model and skin
    return;
    else if (clone.monstermodel == 0) // model is correct already, only change skin
    {
    clone.skin = 1;
    return;
    }
    else // change to model 0 + skin 1, precache and set new models
    {
    if (clone.classname == "monster_fish")
    {
    setmodel (clone, "progs/fish.mdl");
    setsize (clone, '-16 -16 -24', '16 16 24');
    }
    else if (clone.classname == "monster_wizard")
    {
    setmodel (clone, "progs/wizard.mdl");
    setsize (clone, '-16 -16 -24', '16 16 40');
    }
    else
    return; // unknown monster-type, better jump out of this function
    clone.monstermodel = 0;
    clone.skin = 1;
    }
    }
    else // use model 1 and skin 0 for clone
    {
    if ((clone.monstermodel == 1) && (clone.skin == 0)) // no need to change anything, clone uses already correct model and skin
    return;
    else // change to model 1 + skin 0, precache and set new models
    {
    if (clone.classname == "monster_fish")
    {
    setmodel (clone, "progs/fish1.mdl");
    setsize (clone, '-16 -16 -24', '16 16 24');
    }
    else if (clone.classname == "monster_wizard")
    {
    setmodel (clone, "progs/wizard1.mdl");
    setsize (clone, '-16 -16 -24', '16 16 40');
    }
    else
    return; // unknown monster-type, better jump out of this function
    clone.monstermodel = 1;
    clone.skin = 0;
    }
    }
    }
    else if (clone.multiskin == 4) // multiskin = 4 means: use 2 models with 2 skins each
    {
    zufall = random();
    if (zufall > 0.75) // use model 0 and skin 0 for clone
    {
    if ((clone.monstermodel == 0) && (clone.skin == 0)) // no need to change anything, clone uses already correct model and skin
    return;
    else if (clone.monstermodel == 0) // model is correct already, only change skin
    {
    clone.skin = 0;
    return;
    }
    else // change to model 0 + skin 0, precache and set new models
    {
    if (clone.classname == "monster_fish")
    {
    setmodel (clone, "progs/fish.mdl");
    setsize (clone, '-16 -16 -24', '16 16 24');
    }
    else if (clone.classname == "monster_wizard")
    {
    setmodel (clone, "progs/wizard.mdl");
    setsize (clone, '-16 -16 -24', '16 16 40');
    }
    else
    return; // unknown monster-type, better jump out of this function
    clone.monstermodel = 0;
    clone.skin = 0;
    }
    }
    else if (zufall > 0.5 && zufall <= 0.75) // use model 0 and skin 1 for clone
    {
    if ((clone.monstermodel == 0) && (clone.skin == 1)) // no need to change anything, clone uses already correct model and skin
    return;
    else if (clone.monstermodel == 0) // model is correct already, only change skin
    {
    clone.skin = 1;
    return;
    }
    else // change to model 0 + skin 1, precache and set new models
    {
    if (clone.classname == "monster_fish")
    {
    setmodel (clone, "progs/fish.mdl");
    setsize (clone, '-16 -16 -24', '16 16 24');
    }
    else if (clone.classname == "monster_wizard")
    {
    setmodel (clone, "progs/wizard.mdl");
    setsize (clone, '-16 -16 -24', '16 16 40');
    }
    else
    return; // unknown monster-type, better jump out of this function
    clone.monstermodel = 0;
    clone.skin = 1;
    }
    }
    else if (zufall > 0.25 && zufall <= 0.5) // use model 1 and skin 0 for clone
    {
    if ((clone.monstermodel == 1) && (clone.skin == 0)) // no need to change anything, clone uses already correct model and skin
    return;
    else if (clone.monstermodel == 1) // model is correct already, only change skin
    {
    clone.skin = 0;
    return;
    }
    else // change to model 1 + skin 0, precache and set new models
    {
    if (clone.classname == "monster_fish")
    {
    setmodel (clone, "progs/fish1.mdl");
    setsize (clone, '-16 -16 -24', '16 16 24');
    }
    else if (clone.classname == "monster_wizard")
    {
    setmodel (clone, "progs/wizard1.mdl");
    setsize (clone, '-16 -16 -24', '16 16 40');
    }
    else
    return; // unknown monster-type, better jump out of this function
    clone.monstermodel = 1;
    clone.skin = 0;
    }
    }
    else // use model 1 and skin 1 for clone
    {
    if ((clone.monstermodel == 1) && (clone.skin == 1)) // no need to change anything, clone uses already correct model and skin
    return;
    else if (clone.monstermodel == 1) // model is correct already, only change skin
    {
    clone.skin = 1;
    return;
    }
    else // change to model 1 + skin 1, precache and set new models
    {
    if (clone.classname == "monster_fish")
    {
    setmodel (clone, "progs/fish1.mdl");
    setsize (clone, '-16 -16 -24', '16 16 24');
    }
    else if (clone.classname == "monster_wizard")
    {
    setmodel (clone, "progs/wizard1.mdl");
    setsize (clone, '-16 -16 -24', '16 16 40');
    }
    else
    return; // unknown monster-type, better jump out of this function
    clone.monstermodel = 1;
    clone.skin = 1;
    }
    }
    }
    else // no multiskin used !
    {
    // clone is identical to original
    }
    };
    
    
    void() do_the_cloning__fly_swim = // for flying and swimming monsters
    {
    if (autocvar_clonemonsters <= self.clone_me)
    return;
    else
    Clone_fly_swim();
    
    self.clone_me = self.clone_me + 1;
    do_the_cloning__fly_swim ();
    };

    Leave a comment:


  • Seven
    replied
    Hello Lightning Hunter,

    I am glad you found it yourself.
    Yes, there are many skins involved in the SMC (multiskins, painskins, etc).
    You have to add them depending on the format the model has.
    Ancient ones (like .mdl) need it in the model itself while newer ones can add them via script.
    You wil find many examples in the included file called: Starter Kit - multiskin+multimodel ID1 Monsters Seven V5.50.pk3

    Also weapons are affected (yes, they do magical things as well in the SMC ), you will find them in the files called: Weapon-Pack-Example-for-new-powerup-effect.pk3

    Its good to see, that you have fun and are passionate in coding. I am sure, everything will work well and end up on a nice mod compilation.
    I am sorry that I cannot help you with your mentioned Wizard issue. I did not encounter that one. Neither anyone else, who used the SMC (as far as I can say, as I never received anything in this regards).
    Maybe it was introduced in v5.6 beta ? Did you try v5.5 ?

    To fix it, you have to follow the way through all involved .qc files after a telefrag is started (those are several. As you know, function calls are .qc files independent and reach all at once).
    Especially pay attention to think times, as they are most probably interfering with world time and entity time when it becomes/transforms into a body (corpse), which are no longer interactive/killable.
    Searching for code bits, that switch monsters properties from beeing vulnerable/killable to somehtign else (I even forgot how it was called in QC. Its been too long).
    Or disable several SMC features that plays with death of monsters and see if that helps.
    I think you now get the picture and hopefully can start from here.
    I do not know any other coder, but I am sure you can figure it out, when you have found a scene in a map where it tends to happen to do tests.




    Hello webangel,

    Thank you very much for your mirrors.
    It is a nice website, that you started.


    Have a great weekend everybody!
    Seven

    Leave a comment:


  • Lightning_Hunter
    replied
    Hey Seven, made a LOT more progress here. I got the bug fixed with the Wyvern, and I basically imported ALL SMC features with the new monsters, minus the vengeance death (that one looked like too much work to implement). This includes slowmo, death randomness, size scaling, influenced health based on size scaling, animation speed factor, and more.

    I also implemented some other features. Here is a list of stuff I've added:

    1) New option to set the percentage chance of monsters infighting. I figured since there are so many new monster variations, it's important to be able to reduce the chances of them fighting each other (or turn it off entirely).
    2) 3 new monsters: Wyvern, Snakeman, and Willy the Spider with nearly all SMC features
    3) 3 new Grunt variants: Nailgun Grunt, SNG Grunt, and SSG grunt also with nearly all SMC features
    4) 2 new Enforcer variants (they use the Quoth model with new color skins): Rocket Enforcer, and Grenade Enforcer (shoots only grenades, unlike the defender).
    5) Option for normal grunts to start with a single grenade they can randomly fire in addition to their normal attack (or drop in a backpack if they don't fire it).
    6) Option for weapons to be reset at the start of every map (and not just start.bsp). This will be useful for my map compilation when weapons should not carry over.

    Everything is going well, but there is ONE thing that is kicking my rear-end: PAIN SKINS. I have tried adding painskins to my new monsters, but no matter what I try, they are completely messed up. There doesn't seem to be any rhyme or reason. I set up scripts like they are with the other monsters, but random stuff will happen, including: monster skins changing to another multi-skin instead of the painskin being applied, the painskin not appearing at all, or the painskin becoming the skin itself instead of an overlay skin. It's very buggy. I either have the code in the .QC file set up wrong, or the script wrong, or a combination. I've stared at this code for hours on end, and am about to call it quits. Do you have any way I can chat with you live just briefly, like discord? I am sure you could help me solve this bug in a matter of minutes by just giving me a slight understanding of how they work.

    Edit: Oh my gosh, I figured it out as soon as I made this post! I needed to edit the .mdl file and add 4 skins total instead of just the default 1 skin. This was also the issue with the Wyvern skin randomly changing, but for some reason I didn't put 2 and 2 together and connect it with painskins... Now painskins work as they should! Seven, if you read these posts, the only bug I would like fixed still is the Wizard sometimes not dying like it should and the head being alive and immortal (and attacking you). This bug is pretty bad since the Wyvern can also have this bug and is much more lethal than the Wizard. Do you know any good coders that might be able to help me fix this if you can't?
    Last edited by Lightning_Hunter; 09-21-2023, 06:19 PM.

    Leave a comment:


  • webangel
    replied
    I made a mirror of all smc-packs with source code:

    https://webangel.me/forum/topic/smal...ion/#postid-10

    If somebody want to share uake related stuff I can upload it on my webspace!
    Last edited by webangel; 09-19-2023, 10:06 AM.

    Leave a comment:


  • Lightning_Hunter
    replied
    Thanks for the response, Seven!

    Originally posted by Seven View Post
    @ Lightning_Hunter
    Yes, its the first step to copy paste code blocks and mix sources into QC.
    Its really fun and it can get addictive in the end
    Just be sure to completely understand how monster calls (yes, also death calls) work before editing.
    Its best to study with clean and easy original Quake source code 1.06 (its included in my uploads as reference).
    Otherwise you might implement issues, that are not seen in the first place.
    Yes, I have been studying the code in great detail these last 3 days! For the 3 new monsters, I've managed to implement multi-skins, burnable corpses, gibbable corpses, monster replacement, and health scaling. The fancy deaths might come later. There is one mysterious bug I can't figure out. On my custom Wyvern, when the multi-skin #2 ( self.skin = 1 ) and model #2 ( self.monstermodel = 1 ) are set, the monster suddenly has a brighter skin when it dies and lands on the ground. This doesn't happen with the other 3 skins. I have pain skins and the color skins disabled. I triple checked the code and found no errors (it was copied from other monsters that work fine). I can't think of what would cause it.

    Speaking of bugs, there is a much worse bug in the original SMC 5.6 (unmodified): sometimes when a Wizard teleports into a room via a trap and gets telefragged, the head is still alive and will "attack" you. The worst part of the bug is the head being immortal; there is no way to kill it. You can reproduce this bug in the first window trap room after the quad area in E4M3. Turn on clone monsters and let lots of wizards spawn, and you will eventually see the bug. I attached a screenshot of the window trap I'm referring to. Any idea what code/setting I might adjust to fix this?

    For fun, I also attached a screenshot of the Wyvern HD skin I've created (one of the 4 HD skins)! Ignore the invalid models and low-quality stuff in the screenshot. I was just testing them out.
    Attached Files

    Leave a comment:


  • Seven
    replied
    @ Lightning_Hunter

    If you follow the link in my previous post (and scroll up a little) you will see more downloads from famous episodes/maps with enhancements.
    The format of that post is a little buggie since new forum update (its all white), but if you mark it, it becomes readable + clickable (at least you can copy/paste the links out of the post).

    Yes, its the first step to copy paste code blocks and mix sources into QC.
    Its really fun and it can get addictive in the end
    Just be sure to completely understand how monster calls (yes, also death calls) work before editing.
    Its best to study with clean and easy original Quake source code 1.06 (its included in my uploads as reference).
    Otherwise you might implement issues, that are not seen in the first place.

    And that is also the root cause for the warnings you mentioned.
    They are there since the beginning of the world. Do not worry too much about these (also the Gyro and dpextensions warnings. They can be ignored. The compiler reads through all the functions, even if they are not used/called at all).
    I used fteqccgui.exe by the way.


    One day you can post the monster skins that you mentioned.
    I just realized that there is no download link for the Warlord you showed.
    But of course no hurry.




    @ Webangel, gdiddy and Mr. Burns,

    Very good to see you still around.
    When I write this very post and see the brown backgroud color of the forum, its like a memory flashback.
    This brown followed me many many years...
    I still love it.

    Good that all of you help to keep files and mods available.
    Yes, Quaketastic is the most safe place that I am aware of.
    Its there since almost the beginning. Hosted by a very passionate person.


    Have a great time everybody.
    We will talk again ...

    All the best,
    Seven

    Leave a comment:


  • Lightning_Hunter
    replied
    This is a great conversation. I'm glad to see people still interested in tracking down these files! I may also be contributing some things myself (with permission from Seven and others). Currently, I'm compiling a pack of classic maps that work with the Small Mod Compilation. I am starting with maps made from 1996-1997 rated above 3.0 on Quaddicted that replace all 4 episodes of levels. I may create more packs after this that continue into the rest of the 90s and beyond, but we will see when I burn out. In the process, I have also incorporated the Snakeman and Willy the Spider into the SMC mod to support even more usermade maps. More monsters may come depending on the levels I decide to include in the pack. For the new monsters, I incorporated gibbable and/or burnable corpses along with gib multipliers. I might not add all the other death effects since it looks like a lot of work. I might add health scaling and size scaling depending on how complex it is. At this time I have no plans to have a "replace monster" variable for the new monsters, but I am considering adding some of these monsters randomly to various user map ENT files. I believe I will also manually add a few other SMC monsters to ENT files such as the Necromancer, since I feel the Necromancer is incredibly weak when given the health of a replacement wizard. Placing them manually allows them to have about 150-200 health and be far more menacing.

    Edit: So I managed to figure out how the monster replacement code works. It's much simpler than I realized! As such, I've added 3 new classic 90s monsters to the SMC with enhancements: Willy the Spider, Snakeman, and the Wyvern. Each of these monsters can replace other monsters in the game just like in the SMC. The Wyvern is a great custom Quake monster that I discovered 20 years ago that is pretty much unheard of. I always liked it a lot, but unfortunately it's not used in any maps that I know of. Screenshots will maybe come soon, although I want to make an HD skin for the Wyvern first...
    Last edited by Lightning_Hunter; 09-11-2023, 12:57 PM.

    Leave a comment:


  • Mr.Burns
    replied
    Hello all
    Just to echo some of the other comments, I try and keep a small collection of quake files that interested me ranging back to 1996 so although I didn't have Zerstorer I will try and help if I can. Maybe if someone opens a central "Quake files repository" thread in the Quake help section that might be a good start? Of course there is always Quaketastic.com which would be a good first place to check before asking

    P.S Its great to see you back Seven, even if it is just a flying visit.


    Kind regards
    Monty

    Leave a comment:


  • gdiddy62
    replied
    Seven,
    Yes, the party was wild and free for a long time, but please check in once in a while. I would like to believe that you and so many others might still have a bit of imagination and magic that you can add to our great Quake game! Thanks to webangel and Talisa for trying to keep the files archived. I have many myself so please ask and I will look to see if I have anything that you may be missing. Kindest regards to all!
    gdiddy62

    Leave a comment:


  • webangel
    replied
    Hello Seven,
    thank you very much.

    I have some webspace (~100GB) without bandwidth limitation...
    Just to say if anyone is interessted.

    Again Thank you!


    Leave a comment:


  • Lightning_Hunter
    replied
    Sorry for the double post, but I have another question for you, Seven. Which compiler do you use for the SMC code? I'm getting a lot of warnings compiling the code, but that may be normal. I see three compilers that come with the source: fteqccgui.exe, fteqccgui 2015-06-17.exe, and fteqcc.exe.

    I managed to combine SMC 5.6 with Beyond Belief by adding the mortal Chthon code to the SMC code (that's all the new code Beyond Belief had). I might tackle a few other SP campaigns in the same manner once I have verified the correct compiler. I even thought about putting together an individual map compilation of classic maps that work with the SMC. If I did this, I might have each level exit to another custom level and reset the weapons each time. I could then set music tracks and have monsters like the Necromancer replace a few wizards here and there using the ent file (so they have more health than a standard wizard). Just some fun thoughts!

    Leave a comment:


  • Lightning_Hunter
    replied
    Thank you for re-uploading those files, Seven! It's too bad I missed the party, but I get it. None of us are getting any younger. Also thanks for the Zerstorer link. Do you happen to have your Rapture fixes around? I'm also trying to track down the Zerstorer HD Reforged pack, but I can probably always create my own if it's no longer in existence!

    Thank you for the compliment on the Warlord skin. I actually made HD skins for every SMC monster minus the Carnivean I think. I will try to upload them somewhere for all who are interested.

    Edit: I just realized that link you gave me to the Zerstorer patch also has Rapture! Great. Now I just need the Zerstorer HD reforged, or I can try to create it myself (I don't believe there are many new textures in Zerstorer).
    Last edited by Lightning_Hunter; 09-07-2023, 08:23 PM.

    Leave a comment:

Working...
X