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
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")
if ( <= 0)

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? 
So What About Animating A Model? 
Hello everybody,

Has Aberrant's question (#612 & #614) been eventually answered?
I would be eager to achieve such a thing to put some RPG sequences in my own project (which is actually for Hexen II) the way Heretic II does.

That is:

1. the view switches to a third person view thanks to a camera_remote (a handy thing we have in H2 which does basically the same as the intermission view, but triggerable mid-map)

2. the view represents the player facing a monster and they interact by talking (with centerprints) or doing something (like one killing the other or running away) by triggering the corresponding animations on the models.

3. the view returns to the player and the adventure goes on.

Has everyone ever tried to do that? Succeeded? How?

Thank you in advance for your insights! :-) 
Portal of Praevus has an intro scene that it possibly a demo file. Maybe you can look into it and see how it's done? But playing intermission demos would require saving-loading or a way to save state so you can reset back to. 
this really sounds like it requires QuakeC, not map hacks 
@kalango Indeed the PoP intro scene involves a demo file. How such files actually work is a mystery to me... Obviously they are not just video files standing alone on their own since an actual map exists corresponding to that intro scene, full of extremely complex settings involving more than 50 trigger_relay and almost 20 of those camera_remote things travelling along path_corners... So which part is "demo" stuff, which part is scene scripting through entities inside the map... ? I confess I am puzzled.

@metlslime You may be right. If so, since I don't want to pollute this topic I'll start a new dedicated topic. :) 
Unthinking Custom Monsters 
monster_zombie with nextthink -1 allowing to set the use function and do some funkiness

"classname" "monster_zombie" // zombo
"nextthink" "-1" // disabled on spawn
"frame" "174" // lie frozen on ground frame
"use" "zombie_cruc1" // pop into crucified state
"touch" "zombie_run1" // hunt enemy on touch/damage
"flags" "544" // needed flags
"yaw_speed" "20" // turn as normal
"targetname" "bob" //
"takedamage" "2" // damageable

'use' can even be from another monster, for ex. dog_leap1..
Some useful use keys would be puttin him to the ground with zombie_paine11 or on the cross with zombie_cruc1. Maybe use SUB_CalcMoveDone + finaldest for some awkward teleporting?

Thought this was worth sharing, since I don't think I've seen it used. Maybe has potential for more useful set ups. 
Thanks For All The Replies And It's Been Awhile. 
I ended up finding everything I needed at preaches site. And I was trying to trigger existing monster animation sequences. It did work quite like I needed, but I learned a lot by doing it. I did notice that if I killed the zombie and then retriggered him, his head would start draging around chasing you. But that is in a megatf mod I am working on whatever you're on might react differntly. If you are wanting to animate mdls the bast way is to just setup a mdl with an animation sequcnce that just loops, can then call it with whatever ent you use to spawn mdls and it'll keep looping. Like the candles in arcane dimensions. Using info_notnull can call the mdl too, but I never found a way to kill them and bring them back. Currently i'd love a way to make a info_notnull solid wihout getting the non bsp_model error. I took a tank Xage made and added things to it and it never crashes being solid. Normally, fireing rockets at it will crash everything, but this one doesn't. 
Post That Tank Map Ent In It's Own Area. 
"angles" "0 0 0"
"classname" "info_notnull"
"enemy" "1"
"health" "9999999"
"model" "self.model"
"modelindex" "4"
"movetype" "7"
"origin" "44 -3 289"
"solid" "4"
"takedamage" "2"

The tank sit perfectly at 0 0 0 on the map.
I'm sure this has been posted before, this was just my way of getting it to work. Getting it to fire is something else entirely. When I trigger a notnull that uses a monsters attack frame that contains ai_face and it fires it will crash with non bsp_model error. Not from my fire like the rest. 
Self-Aware Map Hack (Anti-Savescumming) 
BIG discovery here! :D Previously this was thought impossible without rewriting the Quake engine at its core.

So while working my kaizo Quake episode (Quake Guy Must Die) on stream I came across a bug in the Quake engine that is actually a really powerful feature in my eyes. Since in my later maps I wanted to prevent saving and loading from working (or you'd die upon load) and I felt that was a nice thematic touch to a finale.

Anyways, the way you do it is this:

Make a SUB_Null brush entity and these keys:
touch: trigger_push_touch
use: InitTrigger
speed: 100
angles: whatever you want tbh

What I noticed in testing is that the direction it attempts to push you is INCORRECT and NOT updated if you don't save or load prior to encountering it. It only corrects its push angle if you load AFTER its creation (aka the use function of InitTrigger being called).

This now means that you can have a map that is self-aware if you have saved and loaded, and you don't even need to rewrite engine code, which previously, was the only known way of stopping savescumming.

Enjoy everyone! You can use this in so many ways, including have the map punish/confuse the player with every monster being replaced by shamblers, changing the map layout entirely, or just flat out killing them like I plan on using it for. :) 
Galaxy brain. 
Moving Lightning/laser Hack 
Hi I'm back again with another juicy map hack ;) I was recently inspired to make a map inspired by air exchange (a scrapped HL2 chapter whose maps were found in the old 2003 beta leak from before the games release) and in my map I want something like those balls of lightning that move up and down like in one of the later rooms (or at least they're there in "airex mod" which is a fixed and completed version of the maps) but I didnt know how to do it, well now I do and I want to share it since it could be useful for other people too. I'd say it's a bit more complicated then my turret hack from before unfortunately. Basically how you do it is you need 3 info_notnulls, ome to fire the lightning 1 to be the target and 1 to trigger the lightning (since normal triggers can't be used with it directly in this case because if you add a targetname to the lightning one it will mess it up and cause it to not move). The first 2 need to be setup similarly for the most part, more specifically they need to be set up kind of like how func_trains are set up in their spawn function since they will move with func_train stuff. So in both of them put these values:

cnt: 1
movetype: 7
nextthink: 0.1
noise: misc/null.wav
noise1: misc/null.wav
solid: 0
sounds: 0
speed: whatever you want
target: name of some path_corner
think: func_train_fin

In the one that will trigger the lightning just put this:

enemy: edict ID of the lightning notnull
targetname: whatever you want
use: CastLightning

Then in the one that you want to actually fire the lightning change the "solid" to 3 and add these:

enemy: edict ID of the other moving info_notnull
health: 9999999999
maxs: 3 values, put whatever you want but ideally it should pretty small like 4 4 4
mins; the exact same as maxs but negative
size: 2*maxs (I'm not 100% sure if you need to actually set maxs mins and size but in my test map it didnt work correctly unless I did so I'm just going to assume you do)
takedamage: 2
th_pain: CastLghtning

You can play around with the mins maxs and size to change the hitbox size of the notnull (at least I'm pretty sure that's what its doing? That's what I gather from reading some quakec references at least) Note that from my testing if the player touches either of the moving notnulls it will cause a map crash (in quakespasm at least) presumably because the game tries to do some bsp collision stuff because it thinks it's a func_train and has a bmpdel and well, it isnt, so it throws a SOLID_BSP with non BSP model error. So you should make the size small if it will come close to the player so they dont inadvertently wind up hitting it.

With the entities themselves set up now you need to set up the paths. This is pretty normal and you need to take into account the normal func_train stuff, with the exception being that the notnull that will fire the lightning needs to have its path 40 units below the other one, because CastLightning raises the entities origin by 40 before casting the lightning because it was made for the shambler.
After the paths are set up then just set up some trigger that targets the notnull that will fire at the one that is moving and make sure it repeats at a constant rate like 60fps for example, if everything is set up correctly you should see lightning arcing between the 2 points as they move from one point on the path to another, you can do a lot of stuff with this like making the vertical moving lightning balls I mentioned at the start or make rotating lines of lightning or make a half life like func_laser, there are lots of possibilities :) 
I posted a little demo map in the quake mapping discord if anyone is interested in seeing it in action 
Hm my rotating turret hack uses ai_face in its use function with no issue, it's how it rotates to face the player. What could you be doing that would cause it to not work? What is your setup? 
Monster Activated Triggers 
Had a brainwave recently, and cracked one of those oft-requested hacks: a trigger which also activates when monsters touch it. And it took less than 25 years to get there!

There might be some follow-ups to this article, for instance creating a setup which triggers for monsters but NOT players. I can see a way of doing it but it's inelegant, and I'm hoping with a bit more thought I can replace or refine it. 
Nice to see a new post! 
Did Anyone Get #630 To Work? 
A few weeks ago I played around with #630. Couldn't get it to work...
Nothing happened. Saved, loaded just fine.
Today I started from scratch, gave it another try. Same result.

Was anyone successful? If so, what did you do? 
I don't know if this is the right place to ask, but i have some questions about parms (specifically "SetNewParms" from client.qc)...

In my mod you start the game with a flashlight. It will consumes armor energy if you turn it on, so i give the player the green armor with 50 points of energy when he starts a map:

On SetNewParms i made these changes:

parm1 = IT_SHOTGUN | IT_AXE| IT_LANTERN| IT_ARMOR1; //it_lantern is the flashlight and it_armor1 is the green armor

parm3 = 50; //this is the armor points/value

parm9 = self.armortype = 0.3; //this is the green armor type

(I also made some changes on the "SetChangeParms" code, but that doesn't matter here because the problem is with the SetNewParms code)

My code works perfectly when i load start.bsp, but today i played "Escape from Quakertraz", a custom map that has its own start map called "efq_start.bsp". The map refused to load and the console gave me this:

Address 28(self)entity 0 174(armortype).armortype 4341(?)
client.qc: SetNewParms
(no function)
assignment to world entity

So i made an exception on my "SetNewParms" for this map (changing parm9 back to 0 again, like it was in the original code):

if (world.model == "maps/efq_start.bsp")
parm9 = 0;

And now i can load the map perfectly...

My questions are:
1- Why is this map having a problem with "SetNewParms" if this code is supposed to be called only by the original "start.bsp" and not by some custom start map with another name? :P

2-Why the original start.bsp works fine with "parm9 = self.armortype = 0.3" and this custom map only works with "parm9 = 0"??

It makes no sense to me! 
So, the best place to ask this is in the <q href="">Coding Help</a> thread, I'll reply there. 
also. laugh at my failure to make a hyperlink. 
Thank you!!! 
First | Previous | Next | Last
You must be logged in to post in this thread.
Website copyright © 2002-2024 John Fitzgibbons. All posts are copyright their respective authors.