User:Thebigh/Sandbox: Difference between revisions

From The DarkMod Wiki
Jump to navigationJump to search
Thebigh (talk | contribs)
→‎The script: -done for now
Thebigh (talk | contribs)
m →‎The light: -wording tweak
Line 10: Line 10:
* Give it a fairly low brightness; again, I have got good results with rgb(10,10,10). It should be neutral in colour though.
* Give it a fairly low brightness; again, I have got good results with rgb(10,10,10). It should be neutral in colour though.
* Set its <tt>ai_see</tt> spawnarg to 0. This will prevent it from affecting your light gem.
* Set its <tt>ai_see</tt> spawnarg to 0. This will prevent it from affecting your light gem.
* Set its <tt>noshadows</tt> spawnarg to 1. That will improve performance slightly as well as stopping the darkvision light from casting shadows; see what happens if you leave it out and then lean around a corner to understand why this matters.
* Set its <tt>noshadows</tt> spawnarg to 1. That will improve performance slightly as well as stopping the darkvision light from casting shadows; see what happens if you leave the shadows on and then lean around a corner to understand why this matters.


==The trigger timer==
==The trigger timer==

Revision as of 11:33, 6 September 2021

Deciding on the best level of Ambient Light can be tricky. If you make it too bright, the mission can take on a flat, washed-out feel and useful shadows can be difficult to distinguish from their surroundings. Too dark, and it is often hard to see your immediate vicinity. The dark vision technique allows you to light up nearby objects while leaving distant areas dark.

Essentially, we are going to attach a point light to the thief's head and have it follow him around like a faint lantern.

The light

Put a light anywhere. This will be the dark vision light itself. Later we will use a script to attach it to the player's head, but for now place it in your "blue room".

  • Give it a modest radius; I find 300 to 500 units gives good results (7 - 11.5 m).
  • Name it "darkvision"
  • Give it a fairly low brightness; again, I have got good results with rgb(10,10,10). It should be neutral in colour though.
  • Set its ai_see spawnarg to 0. This will prevent it from affecting your light gem.
  • Set its noshadows spawnarg to 1. That will improve performance slightly as well as stopping the darkvision light from casting shadows; see what happens if you leave the shadows on and then lean around a corner to understand why this matters.

The trigger timer

Place a trigger_timer entity somewhere in your blue room. This object repeatedly triggers whatever its target is, over and over and over. We'll use this to continually activate the script that positions the light.

  • Give it a target spawnarg called "update_darkvision".
  • Give it a wait spawnarg of 0.1. This means the position of the darkvision will be updated ten times a second.
  • Give it a start_on spawnarg of 1.

The callscriptfunction entity

Put a atdm:target_callscriptfunction entity somewhere near the trigger timer. This object has one purpose: to run a specified script whenever something triggers it. In this case it will be activated by the trigger timer at regular intervals and run the script that actually moves the light.

  • Name it "update_darkvision" so the trigger timer knows what to trigger.
  • Give it a call spawnarg of update_darkvision_function. This is going to be the name of the script.

The script

Outside DarkRadiant, go into the folder containing your mission and navigate to the maps folder. Start a new text file called mapname.script, where "mapname" is the name of your mission. Add the following code to this new file:

void update_darkvision_function() {
    vector player_head;
    player_head = $player1.getOrigin() + '0 0 64';
    $darkvision.setOrigin( player_head );
    return;
}

For those unfamiliar with scripting, this is what the above code means, line-by-line:

  • We are defining a function called update_darkvision_function, which requires no information (the empty brackets) and returns no information (void).
  • Inside the function we define a vector variable called player_head
  • We set that variable to the player's position, and then add a vertical offset of 64 units, which is about head height.
  • The darkvision entity (the light we created earlier) gets repositioned to player_head.
  • Exit the function. Really, the return command isn't necessary as the function will exit when it gets to the end, but it is a good habit to get into for later when you start writing functions that return information to their caller.