126 lines
4.1 KiB
Plaintext
Raw Permalink Normal View History

//::///////////////////////////////////////////////
//:: gz_inc_onact
//:: gz_inc_onact.nss
//:: Copyright (c) 2001 Dom Queron
//:://////////////////////////////////////////////
/*
On Activate Scripts...
*/
//Removes a rope between oTarget and oTarget2
void RemoveRope(object oTarget, object oTarget2);
// This should be put in the OnActivate Code of your module it will handle all checks regarding the rope.
// If it returns true you can end the OnActivate Script using a return statement - DomQ
int CheckRopeTarget();
/*------------------------------------------------------------------*/
void RemoveRope(object oTarget, object oTarget2)
{
effect eEff = GetFirstEffect(oTarget);
while (GetIsEffectValid(eEff))
{
if (GetEffectType(eEff) == EFFECT_TYPE_BEAM)
RemoveEffect(oTarget,eEff);
eEff = GetNextEffect(oTarget);
}
//CreateObject(OBJECT_TYPE_ITEM,"gz_it_rope", GetLocation(oTarget));
DestroyObject(oTarget2);
if (GetLocalInt(oTarget,"T1_OBJECT_KILLSELF") == TRUE)
{
DestroyObject(oTarget);
} else
DeleteLocalObject(oTarget,"T1_TARGET_OBJECT");
}
int CheckRopeTarget()
{
/* Rope Config Area - If you change anything, dont forget to BUILD you module!*/
float CFG_ROPE_ATTACH_TIMEOUT = 30.0f; // How much time the rope stays attached default: 30 secs
/* End Rope Config */
object oRope = GetItemActivated();
if (GetTag(oRope) != "gz_it_rope" )
return FALSE;
object oTarget = GetItemActivatedTarget();
if (oTarget == OBJECT_INVALID)
{
location lLoc = GetItemActivatedTargetLocation();
oTarget = GetFirstObjectInShape(SHAPE_SPHERE, 5.0f,lLoc,FALSE,OBJECT_TYPE_PLACEABLE);
int bFound = FALSE;
while (oTarget != OBJECT_INVALID && !bFound)
{
// our string starts with "gz_rhook_" thus it is a ledge where the rope can be attached
if (FindSubString(GetStringLowerCase(GetTag(oTarget)), "gz_rhook_") == 0 )
bFound = TRUE;
else
oTarget = GetNextObjectInShape(SHAPE_SPHERE, 5.0f,lLoc,FALSE,OBJECT_TYPE_PLACEABLE);
}
if (!bFound)
oTarget =OBJECT_INVALID;
else
{
oTarget = CreateObject(OBJECT_TYPE_PLACEABLE,"gz_obj_ropecont",GetItemActivatedTargetLocation());
SetLocalInt(oTarget,"T1_OBJECT_KILLSELF",TRUE);
}
}
if (GetLocalObject(oTarget,"T1_TARGET_OBJECT") != OBJECT_INVALID)
{
AssignCommand (GetItemActivator(),ActionSpeakString("I can't have two ropes at the same spot"));
}
if (oTarget != OBJECT_INVALID && GetObjectType(oTarget) == OBJECT_TYPE_PLACEABLE) // we have a target
{
effect eBeam;
/* This branch runs when the rope is not attached somewhere */
if (!FindSubString(GetStringLowerCase(GetTag(oTarget)), "gz_rhook_") == 0)
{
// we need a valid rope hook to attach the object to!
AssignCommand (GetItemActivator(),ActionSpeakString("I cannot attach a rope there!"));
return TRUE;
}
object oTarget2 = CreateObject(OBJECT_TYPE_PLACEABLE,"gz_obj_ropecont",GetLocation(GetItemActivator()));
if (oTarget2 != OBJECT_INVALID)
{
FloatingTextStringOnCreature("Grappling Hook Hit!",GetItemActivator());
eBeam = EffectBeam(VFX_BEAM_MIND,oTarget2,BODY_NODE_CHEST);
ApplyEffectToObject(DURATION_TYPE_PERMANENT,eBeam,oTarget);
WriteTimestampedLogEntry("Rope attached");
DelayCommand(CFG_ROPE_ATTACH_TIMEOUT,RemoveRope(oTarget,oTarget2));
AssignCommand(oTarget,ActionTakeItem(oRope,GetItemPossessor(oRope) ));
SetLocalObject(oTarget2,"T1_TARGET_OBJECT",oTarget);
SetLocalObject(oTarget,"T1_TARGET_OBJECT",oTarget2);
return TRUE;
} else
{
AssignCommand (GetItemActivator(),ActionSpeakString("The grappling hook won't work there!"));
return TRUE;
}
} else
{
AssignCommand (GetItemActivator(),ActionSpeakString("The grappling hook won't work there!"));
return TRUE;
}
return TRUE;
}