News | Forum | People | FAQ | Links | Search | Register | Log in
Mapping Help
This is the place to ask about mapping problems, techniques, and bug fixing, and pretty much anything else you want to do in the level editor.

For questions about coding, check out the Coding Help thread: https://www.celephais.net/board/view_thread.php?id=60097
First | Previous | Next | Last
Yup 
I use the clip tool all of the time. I used to use the carve tool, i.e make a brush in the shape of the part I wanted to clip off, then carve it into the brush I was wanting to shape. But the clip tool is really great when you realize what it does.

I thought I was gonna hit marksurfaces first. But ive got 275## of those, and more clipnodes.

I have trouble understanding what these things actually are. I know I can reduce marksurfaces by lifting things 1 unit off the ground, or 1 unit away from walls.

And I know that the world model is made up ultimately of triangles:

Is one triangle one marksurface?
Is a clipnode part of the model, part of the mesh?

Im guessing "not" for the latter of the two questions in the above sentance, as czg, you say its more to do with the way you shape your brushes using the clip tool.

Confusing. 
Lol 
 
Stop Listening To Me You Crazy-ass Cracker 
 
 
Awesome. 
Ahh - Well Thanks For The Info... 
Somebody Must Know What A Clipnode Is... ? 
After all of these years........ 
 
In looking around the web, I found this:

struct clipnode
{
// Index into planes lump
unsigned int plane_idx;
// If > 0, then indices into clipnodes; otherwise, contents enum
unsigned short children[2];
};

So, it would seem, a clipnode is a split in the BSP that either results in a list of more splits or a content leaf.

To reduce them I guess you would use less brushes or do whatever you could to reduce cuts. 
To Make Up, An Infographic 
This is GROSSLY oversimplified and I probably got it half wrong, but the gist of it and how it works in practice is this:
http://czg.leveldesign.org/stuff/clipnodes.png

Place clip brushes over places the player can't get to. For instance if you have built some fancy brushwork up in a ceiling somewhere with lots of beams and trims and shit, block it away with a clip brush unless you need to player to rocketjump up there for some reason. 
Or Isn't Also One Help 
to make details that stick out of walls be func_illusionary... (They don't clip) 
 
in my experience, that's how i've reduced clipnodes as well.

interestingly enough, in early versions (and probably still now?) of aguire's glquake, you could load maps with >32768 max clipnodes, but some areas would be non-solid. :P 
Actually 
with newer versions of aguiRe's enhanced glquake, you can play maps up to 65536 clipnodes with no non-solid areas. Anything beyond that though, and the map will start to freak out. 
 
With regular engines, clipnodes can be exceeded by roughly 10k before problems occur (e.g. monsters slipping through floors, being trapped on the outside). At least this was true for my qte2m6 - it may vary depending on the structure of the map.

Func_illusionary and other func entities don't reduce clipnodes, they add to them, especially if they are made of complicated brushwork or multiple brushes with spaces between each other (e.g. spikes in a tunnel). 
 
Func_illusionary and other func entities don't reduce clipnodes, they add to them, especially if they are made of complicated brushwork or multiple brushes with spaces between each other (e.g. spikes in a tunnel).

Hmm, but i bet the same clip brush trick works on funcs as well... you could put an entire func_illusionary inside a cube clip brush, and then that model would have very few nodes
...

anyone know if that's true? :) 
Sources Of Information 
http://user.tninet.se/~xir870k/tooltips.txt
http://user.tninet.se/~xir870k/readmegl.txt

Hint: Search for "clipnode" ...

Clipnodes are only generated in hulls 1/2 (the clipping hulls), since they specify what entities "clip" (i.e. collide) against.

If you have a leak in either of these hulls or order qbsp not to fill them, the clipnodes will increase a lot.

I don't think illusionaries generate clipnodes as nothing collide against them, but all normal brush entities do. 
Aguirre... 
but the compilers don't know how the func_illusionary is going to be used; it doesn't know anything about the quakec code. So it should be treated the same as any other brushmodel. 
Well, Thanks For The Information People!!! 
I think I do know what a clipnode is. I've probably got so many because of my rock-work. And archways. Maybe I can block some parts off or something...

I might just tune my map so it hugs the limit. Its not at the limit yet. 
Hm 
I always assumed illusionaries didn't add to clipnodes, so the infamous spiky pit automatically became one (the spikes).

If this is wrong then does it mean that a door creates clipnodes from its starting position, even though it will move? I'm thinking of multi-part doors that could potentially produce alot of nodes. Also func-trains - only their starting position? 
 
I think brush models are their own BSP trees inside the the master one, aren't they? In that case they would have their own set of clipnodes inside of them, independent of the rest of the level. 
QuakeC Question 
Does anyone know how to get the SVC_FINALE message to accept more than one string at a time? I changed the signature for centerprint and others to accept multiple strings like this:

void(entity client, string s, ...) centerprint = #73;

However, that doesn't seem to work for the WriteString function. I want to customize the text that gets displayed at the end of a game of Qonquer but I don't see how to do it. It only ever displays the first string when I do this sort of thing:

WriteByte (MSG_ALL, SVC_FINALE);
WriteString (MSG_ALL, "[qonquer]\n\nfinal stats:\n", "blargh" );

Or:

WriteByte (MSG_ALL, SVC_FINALE);
WriteString (MSG_ALL, "[qonquer]\n\nfinal stats:\n" );
WriteString (MSG_ALL, "blargh" );

The first example just plain doesn't work and the second example causes Quake to crash with an "illegible message" error or something.

Help? 
 
Sorry, I mean the first example displays the first string but not the second. It doesn't totally fail or anything like that. 
Clipnodes 
Just wanted to say thanks for the info.
I know I already said thanks, but I was pondering what has been explained and realized that I can probably reduce my clipnode count by changing some func_walls to func_illusionaries! I have some pipes and bars with 12 sided cylinders func_walls where they touch walls/floors. So in theory if I turn them into illusionaries than they wont clip. I will test this l8R!

PS sorry Willem that you might have thought I was Preach. I dont know how to program C. People who do seem very clever to me!! ;P

PPS while your hot, why not knock me up a blood splat progs? I'll love you for ever!!! Also sod Quoth2 if you do, Ill put my map out with standard Quake + blood splat progs!!!! 
Yeah 
Only some of the QC functions can be overloaded like that, it all depends on how they were coded in the engine. I did exactly the same thing yesterday as a test to see if it could be done. In the first example WriteString just ignores additional string parameters, so you only get the first one. In the second case, your first string is null terminated, so the game thinks the command is over. It then reads the first character of your next string as a byte, assuming that it will be the start of a new message type. Unfortunately, "b" = 98 as a byte, and there is no SVC message with that number, so it causes an error.

So what can you do? Well, if you're willing to do a lot of messing about then the way forward is to send each character of your message as a BYTE rather than as one big string. So for instance, to send a finale print saying "killed n" where n is replaced by the number of monsters killed, you would send the following bytes:
31 //the SVC_FINALE code
107,105,108,108,101,100,12 //the codes for the characters 'k' 'i' 'l' 'l' 'e' 'd', ' '
floor(n/100) + 48//the code for the hundreds digit - assuming the number is between 100 and 999
floor( {n - 100 * floor(n/100)} / 10) + 48//subtract off the 100 column and work out the index for the 10s digit.

I'll leave how to get the units column for you to figure out. I've uploaded a mod that will let you test out what numbers correspond to which characters:
http://people.pwf.cam.ac.uk/~ajd70/char.zip
Bind 9 to "impulse 9", 0 to "impulse 10" and p to "impulse 16". Then simply type a number between 1 and 254 to get that character.

Special characters worth knowing:
0: null terminates the string, ending that command
1: 'Chat message', makes text red and chat sound play
2: Sets red text without chat sound - possibly a toggle
10: New line character
48-57: digits 0 - 9
65-90: uppercase A-Z
97-122: lowercase a-z

On the other hand, you might feel this is a lot of effort to go just to make things work with the finale text. It'd probably be alright once you've got a function that automatically takes an input number and converts that to the stream of digits required. 
 
Oh dear god. I'll give that a try once I've worked up the emotional fortitude.

Thanks for the info, Preach! Informative as hell, as always. 
 
Is there a complete list of byte values and what they mean to Quake somewhere? If I had that, I might be able to work up a small utility program to save me tears in the future. 
 
Wouldn't it be easier to find/hack a compiler that has string concatenation in it? 
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.