Yes, I am also looking to download SMC 5.6 again, but all links are down. In particular, I need the source code that comes with the download.
Announcement
Collapse
No announcement yet.
Small Mod compilation
Collapse
X
-
Hello Webangel,
Thank you for reaching out for me in these dark days.
I received your mail and found some PMs and posts in this forum.
I am sorry to not visit this forum on a regular basis anymore.
The party was big and loud as long as it lasted (hell, we had a lot of fun) but it is clearly over.
Of course I will help as good as I can by finding lost artifacts, files and source codes
Lets start with the Zerstorer v1.2, that Lightning_Hunter requested some days ago:
Please find it here: https://quakeone.com/forum/quake-hel...657#post282657
Now, the SMC files:
Well, they lasted and have been online quite some time/years.... I do not know what happend to the link recently. Maybe a hostile takeover
All the screenshots have been vanished as well from the OP.
I will try to gather them again.
In the meantime, please find the SMC packs here:
DOWNLOAD
Have fun with our "old" but beautiful baby
@ Lightning_Hunter
Very nice work on the Warlord skin!
He was one of the most difficult enemies I implemented into Quake.
Only surpassed by the Reiver.
These 2 enemies have double or even triple the features (attack and defense options/styles) from regular Quake minions.
Unfortunately almost unnoticed by most people, as they are only "replacement monsters".
Best Wishes,
Seven
- 1 like
Comment
-
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.
Comment
-
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!
Comment
-
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
Comment
-
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
MontyMr.Burns
"Helping to keep this community friendly, helpful, and clean of spammers since 2006"
WWW: Quake Terminus , QuakeVoid You Tube: QuakeVoid
Servers: Quake.shmack.net, damage.servequake.com
News: JCR's excellent ctsj_jcr map is being ported to OOT
Comment
-
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.
Comment
-
@ 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
- 1 like
Comment
-
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.
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
Comment
-
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.
Comment
-
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
- 1 like
Comment
-
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 (); };
Comment
-
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 ();
if (world.model != "maps/e4m3.bsp")
do_the_cloning__fly_swim ();
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
- 1 like
Comment
Comment