News | Forum | People | FAQ | Links | Search | Register | Log in
Teaching Old Progs.dat New Tricks.
You know about the info_notnull explosion hack. You know about making monsters drop weapons or alternate ammo using the .weapon and .ammo_whatever hacks. You know about making items float in the air by spawning them on a temporary platform. Let's have a thread where we talk about new ways to use existing behavior and get novel gameplay. If you're a "retired" mapper, this is a great time to do some armchair level design and suggest ideas you'll never have a chance to use yourself.
First | Previous | Next | Last
@rekta 
Holy shit, you got it working and working well to boot. Hell of a write up and a tricksy workaround with the th_pain bit, almost surprised you didn't find some evil way to make it rotate vertically as well as the usual horizontal rotation. 
Cool Turret 
Another impressive hack, well done. It's also inspired me to finish off an article I've been working on for a while. It's an ode to the oft mentioned function while hacking: SUB_CalcMoveDone

https://tomeofpreach.wordpress.com/2018/07/21/in-praise-of-sub_calcmovedone/

If you want to know the best way to make a gib fountain, or what the "Duke of York" hack is all about, come have a read... 
@Preach 
I am just getting started "cutting and pasting" QuakeC. I followed your recently revised tutorial on monster spawning here:

https://tomeofpreach.wordpress.com/2017/10/08/teleporting-monsters-flag/

I'd like to add a small random delay automatically to each teleporting monster as you can do in Quoth. Reason is I am using custents multiple triggers to trigger these delays spawns. As in Quoth it would be nice to have a little variation on the timing if the monsters all share a targetname.

Would this be as simple as modifying this:


self.think1();
//override the random delay some go functions apply
self.nextthink = time + 0.1;
spawn_tfog (self.origin);
spawn_tdeath(self.origin, self);
}


to this:


self.think1();
//override the random delay some go functions apply
self.nextthink = self.nextthink + random()*0.5;
spawn_tfog (self.origin);
spawn_tdeath(self.origin, self);
}
 
Update 
I was finally able to try this last night. Does do it. Any hints would be appreciated. 
Typo Above 
Doesn't do it. 
No Expert Here But... 
Should it be

self.nextthink = time + random()*0.5 
@Esrael 
I tried that as well. It's going to be a bit more complex I think. 
Don't Have The Source Files On This Computer 
What values does the random function give? Anything between 0 and 1? Does the function require parameters? Like random(5) giving values between and 0 and 5? 
Nevermind 
Just googled the answer myself. 
QuakeC Questions 
would be better discussed in the Coding Help thread. 
@metlslime 
Apologies. I associate this thread with Preach and forgot it was more of a hacks thread. 
 
See my suggestion in Coding Help 
Very Interesting Stuff All This Is, But I Have A Question. 
First off I mostly play a form of teamfortress, regtf, custom, and megatf. I've noticed a lot of maps use trigger_hurts to simulate mine fields and things of similar sort. I wanted real exploasion, real particles, and I used the infomation here in this to do just that. It's targetable or touchable however you need it, but it only fires once. Nothing I have done will make it work again. Is there a way to reset an info_notnull? 
 
You probably tried the barrel_explode hack which indeed only works once. The only way I could imagine for this to work without custom code is using a W_FireRocket hack that shoots a rocket right into the ground. It can the used multiple times because you can set its ammo count to a very high value. Of course there'll be the rocket launch sound, but that's probably acceptable. Read above to see how it's done. 
I See, So It's Relying On The Ammo In Needs. 
{
"classname" "info_notnull"
"use" "GrenadeExplode"
"enemy" "1"
"group_no" "1001"
"health" "1"
"targetname" "proxi1"
"nextthink" "0"
"origin" "-264 -90 -352"
}

I'll try adding this to it and see if that helps.
"no_grenades_1" "200"

thanks btw. 
Well My Way Doesn't Quite Work. 
I could perhaps use the rocket like you said, however, I was hoping more to use effects from something not a trap already. Like triggering detpacks, or airstrikes. So far the only thing that keeps firing are monster attacks. Now consider these mods are stripped down, there are no monsters so none of their effects can be used. I'm starting to think I've gone about this wrong, and theres a better hack, but I only noticed this a week ago. I am at a huge loss right now, I'm quite ignorant. 
@aberrant 
You should take a look at MechTech's progref.

There are several examples of what can be done within the commen progs.dat.
It's just a way of placing map entities with the right statements.
The first example is a trigger_multiple for lavaballs. I think it is easy to change it to GrenadeExplosion. 
Thanks Madfox 
I will surely look right now. 
Reading, Reading And More Reading, But 
The more I try things the better it gets, so far I have managed to find a repeating explosion. However, it always targets 0 0 0. Is there anyway I can simulate a players perspective to get a fixed point other than 0 0 0. That's what the code is calling for, someone to paint a target. 
 
Which funtion name are you using? W_FireGrenade? 
Not Quite 
I know you all recommend using standard quake progs, I am using the tf mod. It's not going to be updated. I used airstrike_target. I cannot use monster skills, well there are some but limited to zombie, grunt, dog, and fish. The rest of the code was stripped down to make room for the tf classes and abilities. I'm having to go through the qc and find function names. Trial and error for me at this point. 
Multiple Explosions 
The difficulty with a hack that lets an entity repeatedly explode is the explosion sprite. Typically the entity that explodes gets turned into the sprite, and the last command in the sprite animation sequence is deleting yourself.

I think you could pull something off though, using SUB_CalcMoveDone as a use function to cancel the removal on the sprite just before it happens. You'd need a second field like th_pain to be setting off the explosion I guess, not tried to build all this but it sound feasible... 
Dolphins 
place a spawn and a scrag in the map

place the spawn somewhere else because we only want him for the precaches

give the scrag a touch key, set the value to tbaby_jump1

run up and bump into the scrag
there will be error messages, but shit is hilarious. 
Works Spookily Well 
o_O 
 
Dang if only I werent at work 
Lightning Without Event_lightning 
Hi.
I'm working on a gate where flashes should light to a central point. I've tried event_lightning with gate_logic and read everything about it. This does not seam to work because it's not continouse and also not continouse triggable.
I thought about using a lightgun to direct it to an info_null.
Has someone an idea or solution to this? 
 
See post number 11 on this page. Click the thread name to load all posts. Not sure how to bookmark a post 
 
Extra Trick 
@Qmaster 
Thanks. Will check it out. 
Metal Gear Solid Map (question For The "progs Whisperer Preach) 
Hey Preach, I'm a really good friend of Shamblernaut and a lot of the guys at the Quake speedrunning scene/Discord. I've been making Kaizo (insanely hard and novel) maps for an episode. I'm starting the 6th map and wanted it's theme to be, stealth. Now sure invis rings are great for this, but I want parts of the map to require you to dodge pathcorner monsters without invisibility using swift movement and other tricks. However, I want it so that if 1 monster is aggro'd (by seeing you, you shooting them, etc.) that ALL specified monsters in a group/unit are aggro'd as well immediately. Not just upon said monster's death. I've tried all manner of map hacks and the closest I got was using the touch function in conjunction with SUB_UseTargets. But obviously that won't suffice. I want a group of monsters to aggro as one unit, REGARDLESS Of line of sight if any of them are aggro'd. Is this at all possible? Thank you so much in advance. <3 
 
Hm well it could be doable but you might need to design your map in a specific way. My first instinct would be to have the monster set up to where its path comes near several triggers or maybe is even completely bordered by triggers, said triggers would be what aggros the other monsters if one spots you and deviates from its path, now the obvious problem with that is that the player could trigger it too, im not sure if setting the owner to 1 (the entity number of the player in SP games) would help prevent the player from triggering it or not since I haven't tried that before but I guess its worth a try? 
Not A New Trick... 
Just noticed in the id QC, if you "use" a func_wall it toggles its animated texture sequence.

I can't recall ever seeing this in action in the original maps - was it ever used? 
 
I don't think so, but it's relatively well-known and is listed in most documentation you can find online. Sort of the opposite scenario of something like directional trigger volumes, which are used in the start map but rarely mentioned anywhere when looking for information. 
Yowsers 
directional trigger volumes

Holy shit i'd forgotten about those.

Seems we need some kind of resource of "things quake is designed to do but no-one knows about". Sort of the slightly more straight-edge, but still cool, cousin of this thread. 
Twofer 
Kinn said:
Just noticed in the id QC, if you "use" a func_wall it toggles its animated texture sequence.

This is actually surprisingly annoying from the point of view of hacks, because it means you can't set the use function on a func_wall in a hack - in fact it's nearly impossible to set a custom use function on any solid brush entity. It is used in the high framerate animation hack though, so not a complete loss.

FODDER said:
...However, I want it so that if 1 monster is aggro'd (by seeing you, you shooting them, etc.) that ALL specified monsters in a group/unit are aggro'd as well immediately...

I've come up with a new hack, that's pretty interesting, but doesn't quite do what you want yet. I think it would suffice for static monsters, but would be nearly impossible to use for patrolling monsters without some false positives (which is of course the worst possible thing imaginable for stealth gameplay).

I'll keep playing with it a while to see if I can work around that somehow. If not, I'll write up what I found and share it anyway. I think the functions which the hack uses are the ones you'd need to modify the QC to get the desired effect - so it might prove useful in a roundabout manner anyway. 
New Year, New Hack 
Here's the idea I came up with over the weekend - Security Cameras!

https://tomeofpreach.wordpress.com/2019/01/01/security-cameras/

You can train a security camera on a static monster and it'll always notice if that monster has been alerted (with a bit of fiddling you can also ensure that it never sets off by itself, even if the monster is killed under its nose). The problem is that this doesn't generalise to a moving monster, so it doesn't quite do what FODDER was after. Still, I think it's a pretty cool idea in its own right. 
Progdefs.h Is Out Of Date 
I'm trying to change some things about a the swinging hook mod that require it to be recompiled. I can get the code to compile and have no problems when changing the game over to the mod. When I try to load a map or start a new game VkQuake gives the error:

Host_Error: progs.dat system vars have been modified, progdefs.h is out of date

I'm new to Quake C so any help would be nice.
If its helpful this is the progs.src

./progs.dat

defs.qc
subs.qc
combat.qc
items.qc
hook.qc
weapons.qc
world.qc
client.qc
spectate.qc
player.qc
doors.qc
buttons.qc
triggers.qc
plats.qc
misc.qc
server.qc 
#606 
I am pretty new to this myself but it's very important to not change certain things in defs.qc.

If you change anything above line 220 (give or take) you are asking for trouble. The rule of thumb is don't change anything above

//================================================
void end_sys_fields; // flag for structure dumping
//================================================


Not sure if this is your issue but good info nevertheless. 
 
new to QuakeC, and yet your progs.src is lacking monsters?
Sounds like you're trying to compile a QuakeWorld mod instead of a (Net)Quake one.
The two are similar but mutually incompatible (primarily but not exclusively due to changes above end_sys_fields).

If you truely want to run a QuakeWorld mod then use a QuakeWorld engine (eg: FTE, ezQuake, or MVDSV). (Net)Quake engines like VkQuake, QuakeSpasm, or even DarkPlaces cannot run QuakeWorld gamecode. 
Thanks 
Its probably the quakeworld thing since I have not touched defs.qc. I'll try that, thanks. 
That Was The Problem 
Thanks for the help. It works now. 
TY Preach 
I appreciate that new map hack idea a lot Preach <3 even if it isn't exactly/fully what I needed (since I had ideas for patrolling monsters) I still will definitely look into it. I'm putting off my Metal Gear Solid map for now until my 2nd Kaizo Quake episode now since, as you can imagine after making this hack, getting what I want is virtually impossible in vanilla Quake sadly. :[ 
Controllable Models 
I'm needing a way to control a mdl with an entity. So when I target it it will start frame group 2 and it's series of animation. I tried using an info_notnull, and I must have gotten close but the server shutdown with non bsp model error. 
Custom Model 
Hi Aberrant. I think there's little chance of that being possible with a map hack. I'm unaware of any hack in vanilla quake that allows inclusion of a custom model the way that misc_model entities allow in some mods.

Quoth's equivalent does come with the ability to toggle between two framegroups, but you need to set the model up so that those two framegroups are frame 0 and frame 1. See full details at
https://tomeofpreach.wordpress.com/quoth/tutorial/mapobject_custom/ 
@Preach 
If my guess is correct, Aberrant isn't looking to load totally custom models, but to use existing ingame models and animate them when activated; e.g. using an info_notnull to display a monster's model, and then make the 'fake monster' display one of its animations (run, shoot, die, etc) when the notnull is triggered by something else. 
 
Does QuakeSpasm, QSS, FTEQW or Darkplaces support custom (QC-defined) interpolation timing for MDL frame animations?

Makaqu supports this through self.frame_interval, but I'm not aware of any hardware-accelerated engine that does. 
 
Fitzquake variants have it in the protocol but it’s not directly controllable from qc — it uses the nextthink field to decide how to set it and caps it at 1 second 
 
Ok, thanks.

By the way, what are the known engine-independent methods for fixing the problem of the player sliding over the heads of the monsters when he jumps on them?

I've tried setting a .touch function on the player, to detect when the player touches a monster, but it's not working. 
 
Good question ... I fixed it in-engine in early builds of fitzquake but then removed the fix later once i realized it's a bad idea to make bug fixes that change gameplay. In my readme I said "this bug can be fixed in quakec also" but I have no memory of how. Maybe setting the .solid of monsters to a different value? SOLID_BSP? 
 
Needs to be a monster touch function
Also works if you set it on exploboxes

void() monster_touch =
{
if (other.classname != "player")
return;
if (other.health <= 0)
return;

if ((!other.flags & FL_ONGROUND) && (other.absmin_z >= self.absmax_z - 2))
other.flags = other.flags + FL_ONGROUND;
}; 
 
That worked, thanks c0burn. 
 
also this stuff should be in Coding Help thread. 
 
I had forgotten about Coding Help; can that thread go to the Permanent Threads section? 
First | Previous | Next | Last
Post A Reply:
Name:
Title:
Body:
message
question
exclamation
idea
flame
noflame
error
skull
beer
moon
pent
rocket
sheep
pacman
pig
cheese
worldcraft
gauntlet
crate
pitfall
pimp
smile
cool
sad
frown
oi
yay
tongue
evil
wink
neutral
q1
q2
q3
ut
hl
cs
doom
dkt
serious
cube
Website copyright © 2002-2019 John Fitzgibbons. All posts are copyright their respective authors.