Jump to content
The Dark Mod Forums

Obsttorte

Active Developer
  • Posts

    6522
  • Joined

  • Last visited

  • Days Won

    111

Everything posted by Obsttorte

  1. You may put your screenies into spoiler tags, sir.
  2. Are these your christmas wishes? I only have a rough understanding of the topic, but I'm at least interrested in your questions. So if you still like to, ask.
  3. I will The 'advantage' was in reference to the method described in the wiki. The setup is much easier then the one described there. Of course you can use the prefab. I'm not sure how important the AI support is as it seems to me that this wasn't implemented in any FM so far. However, the above described setup also works for other moving things. I used it for something else in my contest FM, but don't want to spoiler it here. In the end it's just another way of doing it. EDIT: I may add that i didn't know about the prefab. Of course it is always easier to use such an existing prefab. But if you have to completely do it for yourself, I think my way is the easier one.
  4. My first wiki article: http://wiki.thedarkmod.com/index.php?title=Multistate_elevator It describes the elevator as in my first post here. Any criticism is appreciated .
  5. The readable itself you must place where you want it to appear in the game. In the objectives menue there is a field "completion target". In this field put in the name of a trigger_count entity you've created. Do this for all objectives you want to be counted. On the trigger_count entity you have to set the spawnarg "count" IIRC to the number of objectives you want to be completed before the specific object should appear. This entity will then trigger its targets once it has been triggered by enough objectives. Let the trigger_count entity trigger a target_call_script_function. Set the spawnarg "call" "functionname" and insert the following script to your mymapname.script void functionname() { $readablename.show(); } where readablename is the name of your readable (surprise, surprise). In the main function of your script file place the line $readablename.hide(); Remember: Everything in the main routine will be executed upon map start. In this case the book or whatever will be hidden (this means not just that it is invisible, it is not in game). The above described function let the object appear in game. Note: I did this with the on my FM. If you're unsure you can also look there.
  6. For a full list of script functions you can check here: http://wiki.thedarkmod.com/index.php?title=TDM_Script_Reference I'm not sure that I understood what you want to achieve. Do you want to have a door that is partially opened but else works as normal or do you want something like a trapdoor for a cellar for example? As for the rotation. If you set rotate to something like what you've mentioned, the door will rotate around all three axes what looks strange. The rotate spawnarg on doors is a bit strange, as something like "90 0 0" does not mean that it rotates 90° around the x-axis. You have to check to see which setting works. For partiall opened doors check here: http://wiki.thedarkmod.com/index.php?title=Func_darkmod_door#Open.2C_Partially_Open.2C_or_Closed_Door_at_Game_Start
  7. Thank you for that tip. As it does the same it is more for shortening the code, but that's also something useful. There are some things that I was told to add to the wiki. But I don't have write access and have no idea how to get it. If anybody knows please teel me. Else I will post helpful stuff in this thread.
  8. I did check it with a two-state elevator and it worked perfect so far. Elevators with more stages should also work as the only thing that changes would be an additional button and a path_corner entity. You may be aware of the fact that the above described function is called for every kind of state change. So even when the button closes again. The hole setup interprets the button more like a general mover moving from one state to another then as a button. You could use the same function on a door for example.
  9. So, as everybody seems to have his own mapping thread, I thought about starting my own. I'm currently working on my map for the "unusual gameplay contest" and just set up a nice working elevator. I took a look one the multi-level elevator tutorial on the wiki and I think that my approach is much more easy to implement, so I thought I could describe it here. The elevator consists out of three parts: - a func_mover entity that will be our elevator-platform - the buttons that will control the elevator - a couple of waypoints, one for each floor what else do we need: a really short script, I'll go to explain further down The first step is to create an elevator-platform. This is your part . If your done with it change its classname to func mover (under entities/func/movers). Rename it to platform. (The names are for referance. Of course you can choose them as you like). The next step is to create some path_corner entities and place them, where you want your platform to stop. Be aware that the origin of the platform entity will move to the center of the bottom face of the pink block representing the path_corner. Let the platform target the path_corners. Make sure you start with "target0", then "target1" and so one. Start with the lowest path_corner and move upwards level by level. Create buttons for every floor on one of the levels. For the other you can just copy them around when we've set them up. On the buttons, you have to set three spawnargs. - target: let the buttons target the platform (so you have to insert its name here) - state_change_callback: set this to "movePlat". This is the name of the function we'll use to move the elevator - moveDir: set this to "0" for the lowest button, "1" for the next one and so one. This spawnarg controls which path_corner the platform should move to When you're done, copy the buttons to where else you'll need them. Ok, that's the setup in Dark Radiant. Now everything that's is needed is a script. And here it is. void movePlat(entity button,boolean bOpen,boolean bLocked,boolean bInterrupted) { entity mover = button.getEntityKey("target"); entity target = mover.getEntityKey("target"+button.getKey("moveDir")); mover.moveTo(target); } The "state_change_callback" is called everytime when the state of the specific object was changed, for example if a button is pressed. The function receives four arguments, of which we will only need the first one. The entity that we get here is the one who has called the script. In this case, the button we have pressed. Now what does the code do. The first line brings us the entity targeted by the button. This is our platform. We need to know this as we want to make it move The second line gives us the path_corner the platform should move to. Here you can see why you should start targeting them from 0 upwards and what the "moveDir" spawnarg is used for. An example: If you push a button whichs "moveDir" spawnarg is "1", than the platform targeted by the button will move to the path_corner targeted by the platform via the spawnarg "target1". The last line is quite self-explaining. It tells the platform to move to the designated path_corner. That's it. Pro's: - short code that is used for every elevator in the map (in fact you can use it for everything that translates) - fast setup Con's: - As I didn't tested it very much I don't know any if you find some please report here What is missing: - there are no sounds set up yet (will add them as soos as possible) - AI's should not yet be able to use the elevator (dido)
  10. Just asking: Has this been taking place? Is the problem solved?
  11. Well I used them But I must say that I don't use them very often in general, as it seems to me that "loud" surfaces don't make as much noise as they did in the original thief games. At least that's my impression, maybe I'm only too good
  12. What we were trying to say is that you did not "suggest", you did complain. If you had said for example that it is an unlucky design choice, if the mapper raises higher expectation in the mission then he is planning to fulfill and therefore unnecessary lowers the quality of his work, it would have been something else. It is no problem if you criticise, but criticism should always be constructive. You should also try to criticise what may not be good in general, instead of bothering about what you don't like or what is "not your cup of tea". However...nevermind.
  13. Or you build the hole from patches and/or brushes so it's square-limited, and then put it as a func_static into a square brushhole. This way you can use a rectangular visportal, which will more probably work.
  14. Amazed to hear that. I think yellow is a good choice for the color of the eyes, as it would look relatively natural (instead of red, blue or pink ...hmmm....)
  15. As for the point to not make him look to wolfish (is this a word ), I wouldn't say that he needs claws, but maybe just some long nails or so. The feets are large enough IMO, but you could slightly increase the amount of muscles on his upper legs. Doesn't this make him even more scary? As he is a man transformed into a beast it seems a bit strange to me that he has lots of hair over his body but no hair left on his head. (Or was he bald before ) As for his eyes: It would be a cool feature if his eyes would glow a bit in the dark and/or reflect light. I just imagine the player going around a corner in a very dark area and then he suddenly make out two yellow points just a few steps before him, starring at him while deep breathing can be heard. However, I'm no modeller, so I can't tell how complicated it would be to make such an effect. I agree to what you've previously said: It's better to get it finished instead of trying to make it perfect and never get it done.
  16. Don't know if you may already know this, but you can copy and paste textures. If you've put a texture on a face, select it and use copy shader. Paste shader is done by ctrl+middle mouse click on the surfaces you want the texture on. If you've already textured your map and just want to replace them you may wanna work with the map file directly. If you for exaple want to replace texture A with B, you just have to search for the paths (seen in media tab) and run a replace all in the map file using a simple text editor. That's maybe faster then doing it all by hand.
  17. The only spawnarg you place one worlspawn is "target" IMO. Worldspawn triggers all it's targets on map start, which is a nice way to start scripted things upon map start (like playing a melody or something like that). I used it in my FM to kill a couple of rats on map start
  18. This is a problem caused by the conversion. EDIT: The right formula was posted by Tels first. I only explained why the original code wasn'T so good.
  19. Cutting holes with CSG substract isn't necessarily bad. If you for example want to cut out a cube for a door or something like that. It only gets problematic if you want to cut out more complex geomtries. I would suggest that you use patches to model the latter. Tutorials on how to use them can be found on the wiki.
  20. There have been a couple of issues with this script. A (hopefully) fixed version can be found here http://bugs.angua.at/view.php?id=3058 It's the file ase_export.py. The changes also allow you to keep the origin on export if you only export one func_static. This is handy if you want to make models that should be used for rotating things, such as shields, levers, doors and so one. Under linux the file goes to usr/lib/darkradiant/scripts/commands
  21. If you want to add a new function that does the trick you don't need this matrix stuff there. It should be enough to pass the translation vector (that is the func_static's origin) to it as an extra argument.
  22. If you only apply the translation any normalization of the normal vector is unnecessary as it won't change anyways. Well, I study maths. For the implementation something like Plane3 Matrix4::transform(Plane3 plane) { Plane3 transformed; transformed.normal().x() = plane.normal().x(); transformed.normal().y() = plane.normal().y(); transformed.normal().z() = plane.normal().z(); transformed.dist() = plane.dist() - ( m[12]*transformed.normal().x() + m[13]*transformed.normal().y() + m[14]*transformed.normal().z() ); return transformed; } This code is correct if the func_static only gets translated.
×
×
  • Create New...