Frictional Games Forum (read-only)
[solved] LanternLit function only inside a room? - Printable Version

+- Frictional Games Forum (read-only) (https://www.frictionalgames.com/forum)
+-- Forum: Amnesia: The Dark Descent (https://www.frictionalgames.com/forum/forum-6.html)
+--- Forum: Custom Stories, TCs & Mods - Development (https://www.frictionalgames.com/forum/forum-38.html)
+---- Forum: Development Support (https://www.frictionalgames.com/forum/forum-39.html)
+---- Thread: [solved] LanternLit function only inside a room? (/thread-11484.html)



[solved] LanternLit function only inside a room? - Dobbydoo - 11-24-2011

I'm trying to make a room with explosive gas, so that you can't use the lantern in there, but I can't find any way to delete my explode function when I'm outside the room after I've been inside it. Is it even possible to do? And in that case, how would I do it?



RE: [need help] LanternLit function only inside a room? - Apjjm - 11-24-2011

I am assuming you want to "explode" the player IF he uses the lantern in the room. If you just want to disable the lantern, check out the wiki on the following function:
Code:
SetLanternDisabled(bool abX);

Create a "script area" in the room with the explosive gas. For now we shall call this area "explodeArea_1" This script area will be used to check whether or not the player should be exploded if the lantern turns on, so make sure it covers all the places the player could be in the room with the gas! (Note: if one area is not enough due to the shape of the room a tweak is discussed later on to get around this).

You would then set you lantern lit callback as normal
Code:
void OnStart()
{  
SetLanternLitCallback("cbLampLit");
}
In the lantern lit callback code we will check whether or not the player is touching the area:
Code:
void cbLampLit(bool abLit)
{
   //If the player is touching the explosion area and the lamp was turned on.
   if(GetEntitiesCollide("Player","explodeArea_1") && abLit) onExplosion();
}

void onExplosion()
{
//Explosion code here
}
This, of course, doesn't take into consideration the problem of the player walking into the area with the lantern out, only turning the lantern on inside the area. This can be rectified with the following code:
Code:
void OnStart()
{
  SetLanternLitCallback("cbLampLit");
  AddEntityCollideCallback("Player","explodeArea_1","cbExplodeAreaPlayerCollision",false,1)
}

//Called when the player enters the explosive area
void cbExplodeAreaPlayerCollision(string &in asParent, string &in asChild, int alState)
{
  //Lantern is on - explode!
  if(GetLanternActive) onExplosion();
}

So what happens if we need more than ONE explosive area? Assuming you have named you areas "explodeArea_1", "explodeArea_2" etc, the completed code will look like:

Code:
void OnStart()
{
   //Player uses lantern (turns on/off)
   SetLanternLitCallback("cbLampLit");
   //For each explosive area, add the player entry callback
   for(int i = 1; GetEntityExists("explodeArea_"+i); i++)
     AddEntityCollideCallback("Player","explodeArea_"+i,"cbExplodeAreaPlayerCollision",false,1)
}

//Called when the player enters the explosive area
void cbExplodeAreaPlayerCollision(string &in asParent, string &in asChild, int alState)
{
  //Lantern is on - explode!
  if(GetLanternActive) onExplosion();
}

//Called when lantern is toggled
void cbLampLit(bool abLit)
{
   //If the lantern isn't on, ignore.
   if(!abLit) return;
   //For each area, If the player is touching the explosion area and the lamp was turned on.
   for(int i = 1; GetEntityExists("explodeArea_"+i); i++)
     if(GetEntitiesCollide("Player","explodeArea_"+i)) onExplosion();
}

Note that this code is untested currently, so I cannot guarantee it will work, however I am fairly confident it should.


RE: [need help] LanternLit function only inside a room? - Dobbydoo - 11-25-2011

I get it working when I enter the room, but not when I'm actually inside the room. By that I mean that I can walk into the area with my lantern lit, and explode, but if I go inside the area with my lantern unlit and light it inside the room, nothing happens.
Here's my script.
Code:
void OnStart()

{
AddEntityCollideCallback("Player", "PoisonArea_1", "cbExplodeAreaPlayerCollision", false, 1);
SetLanternLitCallback("LanternLit");
}

//Explosion Death

void LanternLit(bool abLit)
{
   if(GetEntitiesCollide("PoisonArea_1","Player") && abLit) Explosion();
}

void cbExplodeAreaPlayerCollision(string &in asParent, string &in asChild, int alState)
{
  if(GetLanternActive()) Explosion();
}

void Explosion()
{
//StartScreenShake(1, 5, 0, 13);
AddPlayerBodyForce(0, 0, -50000, true);
//SetPlayerActive(false);
SetPlayerCrouching(true);
GivePlayerDamage(90000000000000000000000000.0f, "BloodSplat", true, true);
PlaySoundAtEntity("explosion", "explosion_rock_large.snt", "Player", 5, true);
PlaySoundAtEntity("explosion", "explosion_rock_large.snt", "Player", 5, true);
PlaySoundAtEntity("explosion", "explosion_rock_large.snt", "Player", 5, true);
FadeRadialBlurTo(1, 1);
StartEffectFlash(0, 1, 1);
}

And where should I post when I need help? I've gotten my posts moved twice, but I don't know where they where moved to... And also, thanks for helping me Smile



RE: [need help] LanternLit function only inside a room? - Apjjm - 11-25-2011

Quote:And where should I post when I need help? I've gotten my posts moved twice, but I don't know where they where moved to... And also, thanks for helping me
No worries Smile. This topic was just moved to a sub-forum of where you posted - called "Development Support" in the "Custom Stories, TCs & Mods - Development" forum. This sub-forum is pretty much for any queries about how to do something in Amnesia.

With regards to the problem with your explosion effect: It may be to do with the where the function "GetEntitiesCollide" expects the "Player" parameter. You could try the following:
Code:
//Explosion Death
void LanternLit(bool abLit)
{
   if(GetEntitiesCollide("Player","PoisonArea_1") && abLit) Explosion();
}
If that fails to work, the following will work (it's just a little harder to see what's happening in the script):
Code:
void OnStart()
{
//The following code will now trigger the even on both entering and leaving the explosive area
AddEntityCollideCallback("Player", "PoisonArea_1", "cbExplodeAreaPlayerCollision", false, 0);
//Same as before
SetLanternLitCallback("LanternLit");
}

//Explosion Death

void LanternLit(bool abLit)
{
//If we are in at least one explosive areas and the lantern is lit, explode.
if(GetLocalVarInt("ExplosionAreasCount")>0 && abLit) Explosion();
}

void cbExplodeAreaPlayerCollision(string &in asParent, string &in asChild, int alState)
{
  //If entering an explosive area, add 1 to explosive area count, else remove 1.
  AddLocalVarInt("ExplosionAreasCount",alState);
  //If entering an explosive area with the lantern out, explode.
  if(GetLanternActive() && alState == 1) Explosion();
}

void Explosion()
{
//StartScreenShake(1, 5, 0, 13);
AddPlayerBodyForce(0, 0, -50000, true);
//SetPlayerActive(false);
SetPlayerCrouching(true);
GivePlayerDamage(100.0f, "BloodSplat", true, true); //The player's maximum health is 100.
PlaySoundAtEntity("explosion", "explosion_rock_large.snt", "Player", 5, true);
PlaySoundAtEntity("explosion", "explosion_rock_large.snt", "Player", 5, true);
PlaySoundAtEntity("explosion", "explosion_rock_large.snt", "Player", 5, true);
FadeRadialBlurTo(1, 1);
StartEffectFlash(0, 1, 1);
}




RE: [need help] LanternLit function only inside a room? - Dobbydoo - 11-26-2011

Thank you very much, it works perfectly now! Smile
The reason for having such a high number as explosion damage is because I have set my health very high for testing.