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
Drew 
1/ Export all files as bmp..
2/ Convert all bmp to Quake palette
3/ Ensure bmp file format is 16x16 multiple, and if not: resize
4/ Create a new .wad file
5/ Import all bmp
6/ Save you .wad file

Done :P 
 
3.5/ Make sure there are no unwanted fullbright pixels 
Basestarter 
me grewly out of crunching the last bites out of my scrutinized wrenched up map made me decide to finally screw it up better by straigthing it out from scratch made me looz the last fiftheen months spilling time that could have been spent much better if I only kept brushes on grid and it had never left me with this totally peace of big heap...

it is not your only worst fear, trinca. 
Good 
I remapped it, fullvis 37m, and 1 warning.
And most of all, I don't need a large fitbox! 
MadFox 
AAAAAaaaaaaaaahhhhhh... you finally discovered the clean way of mapping ;) 
TexMex 
can open WAD3 format but only save WAD2.
Besides, lol at telling someone to extract and convert some 3000 textures.

No idea how to get it running with WC33, there should a tool somewhere. In the meantime, maybe just make a smaller selection and convert that (working with so many textures at once is counterproductive anyway). 
Negke 
It can be spedd up using scripts you know...

:P 
MadFox 
Congrats! 
MadFox Congrats! 
glad u took our advices!!!

:)=

is a pain in the ass but it worth it! 
WC3.3 Method Is Very Easy 
but you have to manually re-size any textures which are too big, or remove them from wad.

1: Install Bakers Quakeadapter.

2: Put your Quake1 WAD files in c:\program files\worldcraft\TEXTURES\

3: Start WC3.3 !

The util will open a win32 log window, saying which textures are too big and need to be re-sized.

The output HLWAD is left in the same directiry as your Quake tools, and has the same filename, just with the HLWAD extension!

I have had to do this quite a lot!

Good luck... 
Grrrr..... 
"Quake tools" = "Quake WADS" 
Both Photoshop And Gimp 
can open WAD3 format but only save WAD2.
Besides, lol at telling someone to extract and convert some 3000 textures.


have auto execution tools, so it is not really a big deal to do that before you stick them all back into a WAD. 
 
Madfox a map with no leaks runs much faster! :)

no leaks and no warning!!!

http://trinca.quaddicted.com/tchak.jpg 
Yea 
A leak disorders and quits the compiler,
so whatever it was, it was crap.
Warnings are more violent on the background,
and can cheat much harder in the end.
(like well compiling and for ever vising) 
 
huge map you're exploring. 
 
not as much as warpc but is big yes 
Trigger Enabling 
I have a small problem: I'm mapping for Quoth2, and I would like to know if it is possible to activate a trigger_once using another trigger/button/whatever event...
I would like to make the triggers reacting to player only after a certain event. So is it possible to enable a trigger_once using its target field as example ? 
I Used Invisible Buttons 
using newskip.exe 
Trigger Hack 
info_notnull (brush)
use trigger_once
touch SUB_Null
targetname
target

See progs.dat thread. 
Yeah 
Negke describes the only way to do it in the current version. It's not actually a bad way of doing it, the only thing that I feel is slightly dodgy about it is that the entity never ends up with the correct classname, but it's unavoidable. A more sophisticated method of doing this kind of thing(activating triggers /entities when other events fire) will be in the next version of Quoth, but that's a long way off.

I was hoping to be able to finish this with a short snippet of code to add to a clear quake source, which would make the "simplest way" work with all triggers. Sadly this isn't really possible, the only function which is called on all triggers is InitTrigger, but you can't do enough with it. It doesn't know what function calls it, so you'd need to hide all the possibly relevant fields like touch/use/health/etc, and create a use function
which restores all of these values. But even then you get ruined by trigger_teleport, which overwrites the "use" field after the call to InitTrigger. Bah! 
RickyT23 / Negke / Preach 
RickyT23: I'm using metlslime skip for glasses, and I'm not sure it will help me with my issue :P

OKnegke: I'm not sure to clearly understand, well, I'll give it a try, and I will have a look in te progs.dat thread in anyway..

Preach: Thanks for the infos... ;)

So globally except the method negke described, there's no other way to do what I would like... or I will have to wait for Quoth3 :P

Anyway, thanks alot for the help: you rock ! 
On How It Works (the Nth In A Series Of Overly Long Posts By Preach) 
I think it's about time there was a good post on why that particular info_notnull trick works, because it's a bit complicated why you move the classname to the use field to make it work.

What is a classname?

The classname field is a qc field which stores a string. From the point of view of the QC, it isn't any different to the message field. There is only one thing which is special about classname, which happens when the map starts.

When the engine loads a map, one of the last things it does is load the list of entities, which looks a little like this:

...
{
"classname" "misc_fireball"
"delay" "15"
"target" "drawtrap"
"targetname" "draw"
"origin" "-352 -1168 160"
"use" "trigger_once"
"model" "*2"
}
...

You can see that all the fields you enter are stored as pairs of keys and values. What the quake engine does for each one of those entries is:
1. Creates a new entity with all of it's fields set to 0.
2. Fills in any of the fields listed in between the {...} with the value given.
3. Sets the "self" entity in the QC code to be this newly formed entity.
4. (this is the important bit) Searches for a function in the qc code with the same name as the classname of the entity, and then runs that function.

The function with the same name as an entity's classname is usually called the class "spawn function". There is technically nothing special about the QC in a "spawn function" - any valid function name is allowed as a classname. But usually "spawn functions" are designed to do important things to "self", like making it solid, giving it an appropriate model, and starting the ai functions in the case of a monster.

What is the use field?
In the example misc_fireball entity above we see the use key has been added. It looks like the use key follows the same format as the classname key, but this is misleading. In QC, use describes a function, not a string. When the quake engine carries out step 2 on the use key, it looks for a function whose name matches that string. Once it finds that function, it stores the function location for the QC and discards the string.

In the (very contrived) example entity I have invented above, use is set to "trigger_once". We are used to trigger_once being a classname, but as we learnt above classnames are always the name of a function. So when we trigger the event "draw", the QC finds every entity with a targetname of "draw". It then calls the function stored in use.

In this case, this gives the entity all the properties of a trigger_once, on top of whatever fields were filled out when it became a misc_fireball.

The thing to remember is that running the function doesn't change it's classname to trigger_once. Sometimes the classname matters (see http://www.celephais.net/board/view_thread.php?id=4&start=6068&end=6068 for the classic example). However, I can assure you that trigger_once is not like that, the classname is never checked once the entity is spawned. So the hack is in fact safe.


What is an info_notnull?
So why are all the hacks obsessed with info_notnull? Well, it's because info_notnull is an entirely empty "spawn function", it does nothing to the entity at all. One of the challenges of making entity hacks is finding a function which does just enough. If you make the classname "trigger_multiple" then it does all the work of making a trigger for you. But that function also overwrites any custom value for use or th_die(a function like use, but called when you kill an entity). Sometimes doing nothing is exactly what you want, in which case you choose info_notnull.

Bringing it all back home
So using all that knowledge, we create a brush based entity with these fields:
{
"classname" "info_notnull" //do nothing on spawn
"use" "trigger_once" //do what the spawn function for trigger once does once we fire the event
"target" "spawn01" //the event which makes use happen
"targetname" "newevent" //what the trigger sets off
}


Hope that was enlightening.

ps: The difference between classname and use is why mutliple-spawning entities in hipnotic/quoth/quake-mods always have two fields you need to fill out: spawnclassname and spawnfunction. The former is a string which is copied to classname, the latter is a function field which is called to replicate the engine function of looking up the classname function. You could of course mess with the program by setting the spawnfunction to monster_ogre and the spawnclassname to monster_shambler

Extra Credit Assignment: describe what you would see if you did set "spawnfunction" "monster_ogre" and "spawnclassname" "monster_shambler". Creating a test map to find out is cheating... 
 
"Hope that was enlightening. "

It really, really was. Thanks a ton for those overly long posts, Preach. They are ridiculously enlightening and useful. 
I'll Hazard A Guess 
The monster will function as an ogre, except that it will infight with orges and not infight with shamblers. It will also take half damage from explosions, which is probably just as well, as it will be somewhat careless about how he shoots his grenades... 
Ok, Just Tried It 
And I forgot something... 
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.