So I took a decent break from this, but I've been back at it the last month here. I have basically added support for all custom made maps from 1997 to 2002 that have over 3 stars on Quaddicted (I imported custom monsters, hipnotic/rogue functions along with other major custom code that is available online, which most maps of this era use). However, I have encountered a problem. FTEQCC refuses to compile anymore with the error "Too many types". I've read this is a limitation of older compilers, so I downloaded the latest version of FTEQCC. It does indeed work without giving me that error, but it also seems to interpret some code different. In particular, the monster death effects with the randomness command no longer works. The Demon no longer has the vengeance death, for example. Have you encountered this before Seven, and do you know a way to fix it?
Edit: So it does seem that the version of FTEQCC named "fteqccgui 2015-06-17.exe" that comes with SMC will compile. But, it still compiles some stuff different. If I set demonrandomness to "100" and "demon" to "3", the demons will only have the vengeance effect about 25% of the time. If I use the original compiler, they have it 100% of the time as they should. I'm not sure why this block of code is being compiled in a different manner.
Announcement
Collapse
No announcement yet.
Small Mod compilation
Collapse
X
-
I think I might have resolved the invisible monster bug. I moved the "precache_model ("progs/sword1.mdl");" etc. lines from Invis_sw.qc under the MultiSkin section to world.qc instead. So far I haven't seen an invisible monster since. I don't know why that would cause issues since all the new monsters have their second model precached under the MultiSkin section, but in this case it seemed to fix the problem (or I just haven't seen it yet).
I haven't found the source of the "shooting corpse" bug, yet. I can't consistently replicate the bug at all. I just know that when it happens, a nail or casing will be replaced by a corpse that has a painskin for a skin. When the corpse disappears along with the other nails/casings, I can then shoot another corpse. It only allows me to shoot one at a time. Very odd bug.
Leave a comment:
-
Thanks for the response, Seven! I went back and looked through all the code changes I made (by comparing to the original SMC code in a compare text edtior). I found nothing that stood out in the way of self, owner, or other properties. Of course, I could have missed something and this could still be the issue. Whenever I added something to the mod, I was pretty careful to use the same language you used in your existing code.
I am starting to wonder if the bug is related to something with save games. I played through a larger singleplayer map in my compilation, and it seemed to be getting more bugged as I played. There were also invisible monsters toward the end of the level. I'm not sure what would cause that.
I noticed in this comment in all your new monster files before precache:
Code:// all files precached in worldspawn() due to savegame-bug
Code:if ((world.model != "maps/start.bsp") || ((autocvar_wyvern_replace_wizard)||(autocvar_wyver n_replace_hknight)||(autocvar_wyvern_replace_demon )||(autocvar_wyvern_replace_ogre))) { precache_model ("progs/wyvern.mdl"); precache_model ("progs/h_wyvern.mdl"); precache_model ("progs/wyvflame.mdl"); precache_model ("progs/fball.mdl"); //precache_model ("progs/wyvern1.mdl"); //precache_model ("progs/h_wyvern1.mdl"); precache_sound ("wyvern/wyv_sight.wav"); precache_sound ("wyvern/wyv_sting.wav"); precache_sound ("wyvern/wyv_pain.wav"); precache_sound ("wyvern/growl3.wav"); precache_sound ("wyvern/growl2.wav"); precache_sound ("wyvern/growl1.wav"); precache_sound ("wyvern/flapup.wav"); precache_sound ("wyvern/flapdown.wav"); precache_sound ("wyvern/wyv_fire.wav"); precache_sound ("wyvern/wyv_death.wav"); precache_sound ("demon/dhit2.wav"); precache_sound ("wizard/hit.wav"); }
The corpse bug definitely appears when I fire a gun for the first time. It seems to replace rockets, nails, or ejecting casings. When the corpse disappears, the gun will fire another corpse. It's almost always a corpse with a painskin applied to it.
Leave a comment:
-
Hello Lightning Hunter,
I hope you had a good start into 2024.
I see you are still very active working on Quake and creating beautiful things.
To try to answer your last post:
One thing can be, that if you load a save game with a different/new progs.dat, these things will happen.
Be sure to only load save games that has been created with the current progs.dat, that you are using.
Maybe this is old news for you but I wanted to at least mention it.
Other thing are these little words: "owner", "other", "self", etc.
One mistake here and you are changing the properties from the wrong entity in the game.
That seems to be what happened in your described case.
Example: When 2 entities collide/touch in game, "other" is the one, that is touched from "self".
In this situation you can change "other" to whatever you like.
And "owner" is always bind to who created it (if I remember correctly, nails and shells or done that way).
So changing the "other" in "owner"s code can lead to this as well.
You could even change "owner"īs property in functions that handle "other", beeing touched from "self".
If you cannot find the root cause, you can always use the big hammer:
Set the entities model in a function that is called regularly. This will fix this issue in a blink of a second and the player will not notice it.
(for example in the think function of shells)
I hope this will help you a tiny little bit.
Best wishes,
Seven
Leave a comment:
-
Hey Seven, I've been playtesting the map compilations I put together (most of the hard work is done now). I sometimes encounter a strange bug that I cannot track down. I'm sure it's related to bad coding on my behalf. Sometimes after playing for a while, my weapons will shoot a corpse instead of a bullet after killing a monster. Any idea where I should start looking to get to the root cause of this? I'm wondering if it's the pain skins, or lack of a corpse being deleted as it should, but I'm not entirely sure. Even just a few ideas might help me track it down.
Thanks!
Leave a comment:
-
Sorry for double post (I'm sure everyone is tired of hearing from me), but I just thought I'd update saying that I solved the Necromancer summon pain skin bug. It was actually easier than expected. I just added "clone.delete_painskin = 1;" under the support_fly section of each monster, and that prevents the painskin from showing up (except on the corpse, which is ok since it's not bugged). I realized I don't mind if the painskin is disabled for a summoned monster anyway.
In other news, I imported several Mission Pack monsters into the SMC that can replace other monsters in the default Quake/custom maps. The Wrath now has an option to replace the Wizard, and the invisible swordsman has an option to replace the Knight or Hell Knight. As for the Centroid/Scourge, I made a "lesser" version of it that is smaller that can replace any Enforcer or Soldier (without size issues).
The lesser version of the Centroid, which I have called the "Skorpoid", has less health than the full size version and fires lasers instead of nails. It also has some altered sound effects and skins:
The Wrath has been given modified multiskins. I also noticed an unused "head" gib with the Super Wrath/Overlord in Rogue that I have altered and used for the Wrath. It's actually kind of a body gib instead of head, but that makes sense for the Wrath. Some screenshots:
Finally, the invisible swordsman has two versions. The version that replaces the Knight is pretty much unaltered (minus some gib/blood stuff imported from SMC 5.6), but the Hell Knight version can fire projectiles just like the Hell Knight can, has more health, and a different skin:
I've also imported the Overlord (Super Wrath) into the SMC to be manually placed in some of the custom levels. While I was at it, I gave the Overlord proper gibs with blood extensions effects and all from SMC 5.6. I also added a head gib just like I did wit the Wrath. Also also also, the Overlord has been given it's own, more menacing sound effects (I hated that it had the regular wrath sounds in Rogue).
I still haven't figured out the Rogue painskin issue. It's completely baffling since I've looked through the code a few dozen times, but nothing sticks out. I have decided to leave out painskins for Rogue. Maybe a solution will present itself down the road. At least I got them into Hipnotic!
Leave a comment:
-
Originally posted by Seven View PostHello Webangel,
Hello Lightning Hunter,
I always include the original QCīs in the uploads. So you can better compare what was done and what was left.
Please compare the original source from ID1 and Rogue to see what happened and why.
The demon did not change between ID1 and Rogue as far as I know.
To pin down the issue, you should work with simplified mods.
That means, take the original source, that Imentioned above and add only the 1 feature and see yourself.
You can imagine how difficult it is to combine the many many SMC features for each monster and do not lose the overview.
Almost all features interfere with each other...
So, you have to use _helper variables.
Like I did it with the one that regulates, that no additional added monster can produce another additional monster.
You surely noticed that.
Try it the same way to prevent the painskin entities to spawn when the main entity (monster) produces a clone.
You have to switch order to first check the clone probability and THEN add painskin entities to original monster.
So that the clone will not inherit the painskin from original monster and you can add a unique painskin to the clone later.
Thanks.
Edit: I looked at the Rogue painskin code again. Everything is literally identical in Demon.qc, and I verified 10 times that all the painskin code was copied over the same in Rogue as it is with Hipnotic/default SMC in Custom_Effects.QC, World.QC, and Combat.QC. The only thing that looks out of place is this bit of commented out code in World.QC of Rogue. I have no clue what this code does, but perhaps it's a clue?
Code://bodyque_head.skin = ent.skin; // edited out (this does not exist in QC 1.06) ?????
Code:void(entity ent, float hp, string headmdl) CopyToBodyQue = { // PGM - support for new deathmatch skins on corpses too! //bodyque_head.skin = ent.skin; // edited out (this does not exist in QC 1.06) ????? bodyque_head.i_am_a_corpse = 1; bodyque_head.sizediff = self.sizediff; bodyque_head.painskin_helper = self.painskin_helper; bodyque_head.baked = self.baked; if (headmdl == "statueknight") // ask if call comes from statue knight bodyque_head.skin = 1; // then set skin to 1 else if (headmdl == "statuehknight") // ask if call comes from statue hellknight bodyque_head.skin = 1; // then set skin to 1 else if (headmdl == "ogreboss") // ask if call comes from ogreboss (multigrenade ogre) bodyque_head.skin = 1; // then set skin to 1 else bodyque_head.skin = self.skin; // to set the correct skin on corpse (was necessary due to multiskin-support) bodyque_head.colormod = self.colormod; // to keep the visual settings from living monster on dead monster (when killed in lava/slime) bodyque_head.traileffectnum = self.traileffectnum; bodyque_head.spawnflags = self.spawnflags; // needed for Hellknight + Knight statues bodyque_head.burnable_corpse = self.burnable_corpse; bodyque_head.original_frame = self.frame; // needed for ragdoll bodyque_head.enemy = self.enemy; bodyque_head.scale = self.scale; // needed for random monster size feature if (random() < 0.5) bodyque_head.spin_direction = 0; // corpse will spin counter-clockwise when shot else bodyque_head.spin_direction = 1; // corpse will spin clockwise when shot bodyque_head.angles = ent.angles; bodyque_head.model = ent.model; bodyque_head.modelindex = ent.modelindex; bodyque_head.frame = ent.frame; bodyque_head.colormap = ent.colormap; // bodyque_head.movetype = ent.movetype; bodyque_head.velocity = ent.velocity; bodyque_head.flags = 0; setorigin (bodyque_head, ent.origin); // Gibbable Corpses: make bodyqueue damagable // enforce a minimum size for the corpse, so there's something to shoot local vector minsiz, maxsiz; minsiz = ent.mins; maxsiz = ent.maxs; if (bodyque_head.baked != 1) // only baked monster will stand tall/straight, regular killed monsters are lying on the floor ! { // so we ignore the bbox -z reduction for baked monsters minsiz_z = ent.mins_z; maxsiz_z = ent.mins_z + 17; // set this to how tall you want the corpse hitbox (was +15 in smc V3.1) } setsize (bodyque_head, minsiz, maxsiz); //// GYRO code below Gyro_Object_ClearPhysics(self); Gyro_Object_ClearPhysics(bodyque_head); var float autocvar_gyroset = 2; // set cvar 'gyroset' default to 2 if (autocvar_gyroset > 0) // if 'gyroset' is set to '0', Gyro is not enabled { var float autocvar_corpsemass = 2700; Gyro_Object_Activate (bodyque_head, autocvar_corpsemass); } bodyque_head.health = hp; if(hp == 0) // If HP is set via cvar 'corpsehealth' to "0", corpses are not gibbable { bodyque_head.takedamage = DAMAGE_NO; bodyque_head.solid = SOLID_NOT; } else { bodyque_head.takedamage = DAMAGE_AIM; bodyque_head.solid = SOLID_SLIDEBOX; } if (bodyque_head.baked == 1) { bodyque_head.th_die = baked_explode; DropBackpack(); bodyque_head.nextthink = time + autocvar_coaled_monster_lifetime; bodyque_head.think = baked_explode; } else bodyque_head.th_die = corpse_die; if (autocvar_painskin_transparency) { entity pain_skin_entity; pain_skin_entity = spawn(); pain_skin_entity.solid = SOLID_NOT; pain_skin_entity.movetype = MOVETYPE_NOCLIP; pain_skin_entity.owner = bodyque_head; setmodel (pain_skin_entity,bodyque_head.model); setsize (pain_skin_entity, VEC_HULL2_MIN - bodyque_head.sizediff, VEC_HULL2_MAX - bodyque_head.sizediff); setorigin (pain_skin_entity, '0 0 0'); // pain_skin_entity.scale = bodyque_head.scale; pain_skin_entity.skin = bodyque_head.skin; pain_skin_entity.colormod_x = bodyque_head.colormod_x; pain_skin_entity.colormod_y = bodyque_head.colormod_y; pain_skin_entity.colormod_z = bodyque_head.colormod_z; pain_skin_entity.frame = bodyque_head.frame; pain_skin_entity.painskin_helper = bodyque_head.painskin_helper; pain_skin_entity.alpha = autocvar_painskin_transparency; pain_skin_entity.think = pain_skin_entity_corpse_think; pain_skin_entity.nextthink = time; setattachment(pain_skin_entity, bodyque_head, "test"); } bodyque_head.th_pain = corpse_pain; bodyque_head.semisolid = "y"; bodyque_head.movetype = MOVETYPE_TOSS; bodyque_head.netname = headmdl; bodyque_head = bodyque_head.owner; };
Last edited by Lightning_Hunter; 12-07-2023, 01:27 PM.
Leave a comment:
-
Hello Webangel,
and I love to see the sweet puppies too
Hello Lightning Hunter,
I always include the original QCīs in the uploads. So you can better compare what was done and what was left.
Please compare the original source from ID1 and Rogue to see what happened and why.
I highly/strongly recommend to use diff tools when you code and create mods.
It would be impossible for me to learned and understand QC magic without it.
There are free diff tools: Winmerge
I myself am using Beyond Copmare v3.0
The demon did not change between ID1 and Rogue as far as I know.
To pin down the issue, you should work with simplified mods.
That means, take the original source, that Imentioned above and add only the 1 feature and see yourself.
You can imagine how difficult it is to combine the many many SMC features for each monster and do not lose the overview.
Almost all features interfere with each other...
In theory, the demon should work just as robust in Rogue as it does in ID1.
Double check your code to be sure.
Regarding the bug that you mentioned:
The SMC uses the same painskins for all monsters, so it never was an issue and never was noticable due to overlapping transparent skins/textures of the same type.
Now, that you add different ones for each, it may become an issue, yes. If that is the issue you mean.
Unfortunately you cannot delete one sub_entitiy from another sub_entitieīs code.
So, you have to use _helper variables.
Like I did it with the one that regulates, that no additional added monster can produce another additional monster.
You surely noticed that.
Try it the same way to prevent the painskin entities to spawn when the main entity (monster) produces a clone.
You have to switch order to first check the clone probability and THEN add painskin entities to original monster.
So that the clone will not inherit the painskin from original monster and you can add a unique painskin to the clone later.
That should work.
Best wishes,
Seven
Leave a comment:
-
Hey Seven, do you know if there is something in the code of Rogue that differs with skin handling when compared to normal Quake? I successfully implemented Painskins into Hipnotic with ease, but Rogue is kicking my butt. For example, when I set up the Demon in Rogue exactly the same way I did in Hipnotic, the Demon changes its skin when it dies. I already verified that the Demon.mdl has 4 skins along with Demon1.mdl. I also verified that the scripts are set up correctly (I'm using all the same files between Hipnotic and Rogue). The Hipnotic pain skins work great, while the Rogue pain skins do not. There must be some changes to the skin handling in Rogue, but I can't find what it is. Any ideas?
I know that the Knight/Hell Knight statue will cause painskins to work a bit different. I also know the Ogre has the Ogre Boss skin. But why won't the Demon work? I couldn't find any differences with the Demon. It also appears the Shambler does not work properly, among other monsters.
Edit: I discovered another painskin issue, and I think it's a bug with the original SMC 5.6: when Necromancers spawn a Wizard or Afrit, the painskins are incorrect. When you shoot the summoned wizard/Afrit, the skin changes to the incorrect skin. This issue does not happen when a Wizard/Afrit is placed at the start of the level. I'm thinking this can be fixed by simply forcing the default skin when a Necromancer summons a Wizard/Afrit, but I'm unsure where/how to do this. Perhaps the model and skin can be set to '0' in this code?
Code:////////////////////////////////////////////////////////////////////////////////////// // Code for adding ADDITIONAL Wizard monster into a map to support FLYING monsters // Wizard will be spawned near the flying monster ////////////////////////////////////////////////////////////////////////////////////// void() add_wizard_support_fly = { 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() * 30 *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); setorigin(clone, pos); WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); WriteByte (MSG_BROADCAST, TE_TELEPORT); WriteCoord (MSG_BROADCAST, pos_x); WriteCoord (MSG_BROADCAST, pos_y); WriteCoord (MSG_BROADCAST, pos_z); clone.enemy = world; clone.do_not_replace_me = 1; clone.owner = self; local vector dir; dir = normalize (self.enemy.origin - self.origin); clone.angles = vectoangles (dir * 20); // always face the enemy clone.angles_x = 0; // monsters can only look straight ( _x is looking up/down) clone.think = monster_wizard; clone.nextthink = time + 0.0001; };
Last edited by Lightning_Hunter; 12-05-2023, 01:48 PM.
Leave a comment:
-
Hello Lightning Hunter,
Good to hear, you still have fuel in the tank and are active
Yes, I always make notes where I find stuff. And If I implement them in the SMC, to be able to give proper credit.
The model, that you are looking for is a rip out of an still available commercial game, so I cannot upload files.
But I can guide you to the place where I downloaded it from back then:
Model can be found here:
https://gamebanana.com/mods/198635
https://gamebanana.com/mods/204314
Textures can be found here:
https://gamebanana.com/mods/204305
https://gamebanana.com/mods/204312
Have fun,
Seven
Leave a comment:
-
Just a heads up that I am still working on this compilation, although just a bit slower with work getting busier. By the way Seven, do you still have that TF2 Rocket Launcher sitting around? I couldn't find a download link to it. It's in your video here:
https://www.youtube.com/watch?v=-Qp8W2ORPqk
Leave a comment:
-
Originally posted by Seven View PostHello Lightning Hunter,
The Situation with Mission Packs and base Quake is a little different with the SMC.
The SMC is clearly focused on base Quake and therefore the version numbers have not been released simultaneously with Mission Pack builds.
Reason behind it is clear, as with Quake SMC you can play hundreds of maps and episodes. While with Mission pack SMC only a very few.
That means, Quake SMC was always developed further and further.
While Mission Pack SMCs was taken care of a lot later. And not to the full feature content.
If you want to make SMC v5.6 for the Mission Packs you HAVE to start and compare: Quake SMC 5.6 with Mission Pack SMC 5.02 source.
And bit by bit port all the features.
Oh dear, be careful, because Mission Packs handle things different and is filled with extra stuff...
There is not even a Quake SMC v5.02 every released. That version number only exists for Mission Pack SMCs as explained above.
At the time when Mission Pack SMC v5.02 was released, Quake SMC was around v5.30 (so you get a picture)
So, in other words, its not an easy task.
Otherwise I would have done it long time ago...
But you are of course encouraged to give it a try.
Best wishes,
Seven
Thanks for the response, Seven! I completely understand what you are saying. I have decided to import only the missing monsters, but not all the features. I will probably leave out a few dozen effects (like film grain, motion blur, blood splats, etc.) and instead focus on just the new monsters. I would like to see the Necromancer, Yakman, and my new monster conversions in the mission packs. I will keep it simple!
Leave a comment:
-
Hello Lightning Hunter,
The Situation with Mission Packs and base Quake is a little different with the SMC.
The SMC is clearly focused on base Quake and therefore the version numbers have not been released simultaneously with Mission Pack builds.
Reason behind it is clear, as with Quake SMC you can play hundreds of maps and episodes. While with Mission pack SMC only a very few.
That means, Quake SMC was always developed further and further.
While Mission Pack SMCs was taken care of a lot later. And not to the full feature content.
If you want to make SMC v5.6 for the Mission Packs you HAVE to start and compare: Quake SMC 5.6 with Mission Pack SMC 5.02 source.
And bit by bit port all the features.
Oh dear, be careful, because Mission Packs handle things different and is filled with extra stuff...
There is not even a Quake SMC v5.02 every released. That version number only exists for Mission Pack SMCs as explained above.
At the time when Mission Pack SMC v5.02 was released, Quake SMC was around v5.30 (so you get a picture)
So, in other words, its not an easy task.
Otherwise I would have done it long time ago...
But you are of course encouraged to give it a try.
Best wishes,
Seven
Leave a comment:
-
Hey Seven, do you have the source for SMC 5.02? I thought I would attempt to merge Hipnotic SMC with the newest version 5.6, but it would really help if I could compare the changes of Hipnotic 5.02 to the SMC 5.02 code. It's easier than reverse engineering the entire thing!
Leave a comment:
Leave a comment: