Finished PRC8 integration. Moved creature abilities to top hak. Setup tooling. Created release archive
688 lines
18 KiB
Plaintext
688 lines
18 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: Custom User Defined Event
|
|
//:: FileName
|
|
//:: Copyright (c) 2001 Bioware Corp.
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By:
|
|
//:: Created On:
|
|
//:://////////////////////////////////////////////
|
|
|
|
#include "NW_I0_GENERIC"
|
|
#include "jw_custom_spells"
|
|
#include "prc_inc_spells"
|
|
|
|
string sPlace="PLACE_"+GetTag(OBJECT_SELF);
|
|
// waypoints should be called WALK_tag1 to WALK_tag6
|
|
string sWalk="WALK_"+GetTag(OBJECT_SELF);
|
|
int LOOKING=1;
|
|
int STEALING=2;
|
|
int RUNNING=3;
|
|
object oHome=GetWaypointByTag(sPlace);
|
|
object oPotion=GetItemPossessedBy(OBJECT_SELF,"NW_IT_MPOTION004");
|
|
|
|
// standard on combat round end
|
|
void standardcbr();
|
|
// standard on damaged
|
|
void standarddam();
|
|
// standard heartbeat
|
|
void standardhb();
|
|
// standard on perceive
|
|
void standardperc();
|
|
// standard on attacked
|
|
void standardattack();
|
|
// set the state the thief is in - LOOKING, STEALING or RUNNING
|
|
void setstate (int nState);
|
|
// get the state the thief is in - LOOKING, STEALING OR RUNNING
|
|
int getstate ();
|
|
// The PC becomes the theif's mark - he won't try to steal from anyone else while the mark is in his sights
|
|
void setmark (object oPC);
|
|
// returns TRUE if the theif is at home, otherwise returns FALSE
|
|
int ishome();
|
|
// returns TRUE if the theif is very close to their home, otherwise returns FALSE
|
|
int rightathome();
|
|
// Get the theif's mark
|
|
object getmark ();
|
|
// Thief runs home, or if he is at home he sets his state to looking
|
|
void runaway ();
|
|
// Thief sets the PC he has just seen as his mark and steals from him, before running away
|
|
void stealing (object oPC);
|
|
// Thief leaves his home and walks his waypoints looking for a mark
|
|
void looking();
|
|
// Thief chooses a waypoint at random to walk to, and if he is already there he chooses another
|
|
void waypointwalk();
|
|
// returns TRUE if the thief is at his waypoint, or FALSE if he is not.
|
|
int isatwaypoint();
|
|
|
|
void main()
|
|
{
|
|
ExecuteScript("prc_npc_userdef", OBJECT_SELF);
|
|
|
|
int nUser = GetUserDefinedEventNumber();
|
|
|
|
if(nUser == 1001) //HEARTBEAT
|
|
{
|
|
|
|
if (ishome()&&GetIsInCombat(OBJECT_SELF))
|
|
{
|
|
standardhb();
|
|
return;
|
|
}
|
|
|
|
|
|
if (getstate()==LOOKING)
|
|
{
|
|
looking();
|
|
}
|
|
else if (getstate()==RUNNING)
|
|
{
|
|
runaway();
|
|
}
|
|
else if (getstate()==STEALING)
|
|
{
|
|
if (!GetObjectSeen(getmark(),OBJECT_SELF))
|
|
{
|
|
// SpeakString("My mark has vanished so I will walk waypoints");
|
|
waypointwalk();
|
|
setstate(LOOKING);
|
|
}
|
|
else
|
|
{
|
|
// SpeakString("I am half way through stealing and will not change my action until I am done");
|
|
// no action
|
|
}
|
|
}
|
|
else
|
|
{
|
|
setstate(LOOKING);
|
|
looking();
|
|
}
|
|
|
|
}
|
|
else if(nUser == 1002) // PERCEIVE
|
|
{
|
|
object oPC=GetLastPerceived();
|
|
if (!ishome()&&getstate()==LOOKING)
|
|
{
|
|
if ((GetIsPC(oPC))&&(!GetIsDM(oPC))&&(MyPRCGetRacialType(oPC)!=RACIAL_TYPE_HALFLING))
|
|
{
|
|
setstate(STEALING);
|
|
stealing (oPC);
|
|
}
|
|
}
|
|
|
|
else if (ishome())
|
|
{
|
|
standardperc();
|
|
}
|
|
|
|
}
|
|
else if(nUser == 1003) // END OF COMBAT
|
|
{
|
|
if (!ishome())
|
|
{
|
|
|
|
|
|
|
|
setstate(RUNNING);
|
|
runaway();
|
|
}
|
|
else
|
|
{
|
|
standardcbr();
|
|
}
|
|
|
|
}
|
|
else if(nUser == 1004) // ON DIALOGUE
|
|
{
|
|
// if (!ishome())
|
|
// {
|
|
|
|
// if (GetStealthMode(OBJECT_SELF)==STEALTH_MODE_ACTIVATED)
|
|
// {
|
|
// ActionUseSkill(SKILL_HIDE,OBJECT_SELF);
|
|
// }
|
|
// if (GetIsObjectValid(oPotion))
|
|
// {
|
|
// talent tUse = GetCreatureTalentBest(TALENT_CATEGORY_BENEFICIAL_ENHANCEMENT_POTION, 20);
|
|
// if(GetIsTalentValid(tUse))
|
|
// {
|
|
// ActionUseTalentOnObject(tUse, OBJECT_SELF);
|
|
// }
|
|
// }
|
|
// ActionDoCommand(SpeakString("someine trying to talk to me, this can't be good - setting state from stealing to running"));
|
|
// setstate(RUNNING);
|
|
// runaway();
|
|
// }
|
|
|
|
}
|
|
else if(nUser == 1005) // ATTACKED
|
|
{
|
|
if (!ishome())
|
|
{
|
|
|
|
if (GetStealthMode(OBJECT_SELF)==STEALTH_MODE_ACTIVATED)
|
|
{
|
|
ActionUseSkill(SKILL_HIDE,OBJECT_SELF);
|
|
//SpeakOneLinerConversation("jw_thief_con");
|
|
}
|
|
setstate(RUNNING);
|
|
runaway();
|
|
}
|
|
else
|
|
{
|
|
standardattack();
|
|
}
|
|
}
|
|
else if(nUser == 1006) // DAMAGED
|
|
{
|
|
if (GetLocalInt(OBJECT_SELF,"donegarrote")!=1)
|
|
{
|
|
object oDamager=GetLastDamager();
|
|
SetFacingPoint(GetPosition(oDamager));
|
|
int nHD=GetHitDice(OBJECT_SELF)/4;
|
|
if (nHD<1)
|
|
{
|
|
nHD=1;
|
|
}
|
|
if (nHD>4)
|
|
{
|
|
nHD=4;
|
|
}
|
|
garrote(oDamager, nHD);
|
|
SetLocalInt(OBJECT_SELF,"donegarrote",1);
|
|
}
|
|
|
|
|
|
if (!ishome())
|
|
{
|
|
|
|
if (GetStealthMode(OBJECT_SELF)==STEALTH_MODE_ACTIVATED)
|
|
{
|
|
ActionUseSkill(SKILL_HIDE,OBJECT_SELF);
|
|
//SpeakOneLinerConversation("jw_thief_con");
|
|
}
|
|
setstate(RUNNING);
|
|
runaway();
|
|
}
|
|
else
|
|
{
|
|
standarddam();
|
|
}
|
|
}
|
|
else if(nUser == 1007) // DEATH
|
|
{
|
|
|
|
}
|
|
else if(nUser == 1008) // DISTURBED
|
|
{
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
void standardcbr()
|
|
{
|
|
|
|
if(GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL))
|
|
{
|
|
DetermineSpecialBehavior();
|
|
}
|
|
else if(!GetSpawnInCondition(NW_FLAG_SET_WARNINGS))
|
|
{
|
|
DetermineCombatRound();
|
|
}
|
|
|
|
}
|
|
|
|
void standarddam()
|
|
|
|
{
|
|
object oMemory=GetAttackTarget();
|
|
if(!GetFleeToExit())
|
|
{
|
|
if(!GetSpawnInCondition(NW_FLAG_SET_WARNINGS))
|
|
{
|
|
if(!GetIsObjectValid(GetAttemptedAttackTarget()) && !GetIsObjectValid(GetAttemptedSpellTarget()))
|
|
{
|
|
if(GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL))
|
|
{
|
|
DetermineSpecialBehavior(GetLastDamager());
|
|
}
|
|
else if(GetIsObjectValid(GetLastDamager()))
|
|
{
|
|
DetermineCombatRound();
|
|
if(!GetIsFighting(OBJECT_SELF))
|
|
{
|
|
object oTarget = GetLastDamager();
|
|
if ((GetAbilityScore(OBJECT_SELF,ABILITY_INTELLIGENCE)>11)&&(GetIsObjectValid(GetMaster(oTarget))))
|
|
{
|
|
if (GetObjectSeen(GetMaster(oTarget)))
|
|
{oTarget=GetMaster(oTarget);}
|
|
}
|
|
if(!GetObjectSeen(oTarget) && GetArea(OBJECT_SELF) == GetArea(oTarget))
|
|
{
|
|
ActionMoveToLocation(GetLocation(oTarget), TRUE);
|
|
ActionDoCommand(DetermineCombatRound());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if (!GetIsObjectValid(GetAttemptedSpellTarget()))
|
|
{
|
|
object oTarget = GetAttackTarget();
|
|
if ((GetAbilityScore(OBJECT_SELF,ABILITY_INTELLIGENCE)>11)&&(GetIsObjectValid(GetMaster(oTarget))))
|
|
{
|
|
if (GetObjectSeen(GetMaster(oTarget)))
|
|
{oTarget=GetMaster(oTarget);}
|
|
}
|
|
if(!GetIsObjectValid(oTarget))
|
|
{
|
|
oTarget = GetAttemptedAttackTarget();
|
|
}
|
|
object oAttacker = GetLastHostileActor();
|
|
if ((GetAbilityScore(OBJECT_SELF,ABILITY_INTELLIGENCE)>11)&&(GetIsObjectValid(GetMaster(oAttacker))))
|
|
{
|
|
if (GetObjectSeen(GetMaster(oAttacker)))
|
|
{oAttacker=GetMaster(oAttacker);}
|
|
}
|
|
if (GetIsObjectValid(oAttacker) && oTarget != oAttacker && GetIsEnemy(oAttacker) &&
|
|
(GetTotalDamageDealt() > (GetMaxHitPoints(OBJECT_SELF) / 4) ||
|
|
(GetHitDice(oAttacker) - 2) > GetHitDice(oTarget) ) )
|
|
{
|
|
DetermineCombatRound(oAttacker);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void standardhb()
|
|
{
|
|
if(GetSpawnInCondition(NW_FLAG_FAST_BUFF_ENEMY))
|
|
{
|
|
if(TalentAdvancedBuff(40.0))
|
|
{
|
|
SetSpawnInCondition(NW_FLAG_FAST_BUFF_ENEMY, FALSE);
|
|
return;
|
|
}
|
|
}
|
|
|
|
if(GetSpawnInCondition(NW_FLAG_DAY_NIGHT_POSTING))
|
|
{
|
|
int nDay = FALSE;
|
|
if(GetIsDay() || GetIsDawn())
|
|
{
|
|
nDay = TRUE;
|
|
}
|
|
if(GetLocalInt(OBJECT_SELF, "NW_GENERIC_DAY_NIGHT") != nDay)
|
|
{
|
|
if(nDay == TRUE)
|
|
{
|
|
SetLocalInt(OBJECT_SELF, "NW_GENERIC_DAY_NIGHT", TRUE);
|
|
}
|
|
else
|
|
{
|
|
SetLocalInt(OBJECT_SELF, "NW_GENERIC_DAY_NIGHT", FALSE);
|
|
}
|
|
WalkWayPoints();
|
|
}
|
|
}
|
|
|
|
if(!PRCGetHasEffect(EFFECT_TYPE_SLEEP))
|
|
{
|
|
if(!GetIsPostOrWalking())
|
|
{
|
|
if(!GetIsObjectValid(GetAttemptedAttackTarget()) && !GetIsObjectValid(GetAttemptedSpellTarget()))
|
|
{
|
|
if(!GetIsObjectValid(GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY, OBJECT_SELF, 1, CREATURE_TYPE_PERCEPTION, PERCEPTION_SEEN)))
|
|
{
|
|
if(!GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL) && !IsInConversation(OBJECT_SELF))
|
|
{
|
|
if(GetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS) || GetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS_AVIAN))
|
|
{
|
|
PlayMobileAmbientAnimations();
|
|
}
|
|
else if(GetIsEncounterCreature() && (GetLocalInt(OBJECT_SELF,"norw")!=1) &&
|
|
!GetIsObjectValid(GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY, OBJECT_SELF, 1, CREATURE_TYPE_PERCEPTION, PERCEPTION_SEEN)))
|
|
{
|
|
PlayMobileAmbientAnimations();
|
|
}
|
|
else if(GetSpawnInCondition(NW_FLAG_IMMOBILE_AMBIENT_ANIMATIONS) &&
|
|
!GetIsObjectValid(GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY, OBJECT_SELF, 1, CREATURE_TYPE_PERCEPTION, PERCEPTION_SEEN)))
|
|
{
|
|
PlayImmobileAmbientAnimations();
|
|
}
|
|
else if (GetLocalInt(OBJECT_SELF,"norw")==2)
|
|
{
|
|
PlayMobileAmbientAnimations();
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
DetermineSpecialBehavior();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//DetermineCombatRound();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(GetSpawnInCondition(NW_FLAG_SLEEPING_AT_NIGHT))
|
|
{
|
|
effect eVis = EffectVisualEffect(VFX_IMP_SLEEP);
|
|
if(d10() > 6)
|
|
{
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void standardperc()
|
|
|
|
{
|
|
//This is the equivalent of a force conversation bubble, should only be used if you want an NPC
|
|
//to say something while he is already engaged in combat.
|
|
if(GetSpawnInCondition(NW_FLAG_SPECIAL_COMBAT_CONVERSATION) && GetIsPC(GetLastPerceived()) && GetLastPerceptionSeen())
|
|
{
|
|
SpeakOneLinerConversation();
|
|
}
|
|
//If the last perception event was hearing based or if someone vanished then go to search mode
|
|
if ((GetLastPerceptionVanished()) && GetIsEnemy(GetLastPerceived()))
|
|
{
|
|
object oGone = GetLastPerceived();
|
|
if((GetAttemptedAttackTarget() == GetLastPerceived() ||
|
|
GetAttemptedSpellTarget() == GetLastPerceived() ||
|
|
GetAttackTarget() == GetLastPerceived()) && GetArea(GetLastPerceived()) != GetArea(OBJECT_SELF))
|
|
{
|
|
ClearAllActions();
|
|
DetermineCombatRound();
|
|
}
|
|
}
|
|
//Do not bother checking the last target seen if already fighting
|
|
else if(!GetIsObjectValid(GetAttemptedAttackTarget()) && !GetIsObjectValid(GetAttemptedSpellTarget()))
|
|
{
|
|
//Check if the last percieved creature was actually seen
|
|
if(GetLastPerceptionSeen())
|
|
{
|
|
if(GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL))
|
|
{
|
|
DetermineSpecialBehavior();
|
|
}
|
|
else if(GetIsEnemy(GetLastPerceived()))
|
|
{
|
|
if(!PRCGetHasEffect(EFFECT_TYPE_SLEEP))
|
|
{
|
|
SetFacingPoint(GetPosition(GetLastPerceived()));
|
|
SpeakString("NW_I_WAS_ATTACKED", TALKVOLUME_SILENT_TALK);
|
|
DetermineCombatRound();
|
|
}
|
|
}
|
|
//Linked up to the special conversation check to initiate a special one-off conversation
|
|
//to get the PCs attention
|
|
else if(GetSpawnInCondition(NW_FLAG_SPECIAL_CONVERSATION) && GetIsPC(GetLastPerceived()))
|
|
{
|
|
ActionStartConversation(OBJECT_SELF);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void standardattack()
|
|
{
|
|
object oTarget=GetLastAttacker();
|
|
object oMemory=GetAttackTarget();
|
|
|
|
//Shout Attack my target, only works with the On Spawn In setup
|
|
SpeakString("NW_ATTACK_MY_TARGET", TALKVOLUME_SILENT_TALK);
|
|
//Shout that I was attacked
|
|
SpeakString("NW_I_WAS_ATTACKED", TALKVOLUME_SILENT_TALK);
|
|
|
|
if ((GetAbilityScore(OBJECT_SELF,ABILITY_INTELLIGENCE)>11)&&(GetIsObjectValid(GetMaster(oTarget))))
|
|
{
|
|
if (GetObjectSeen(GetMaster(oTarget)))
|
|
{oTarget=GetMaster(oTarget);}
|
|
}
|
|
|
|
if(!GetFleeToExit())
|
|
{
|
|
if(!GetSpawnInCondition(NW_FLAG_SET_WARNINGS))
|
|
{
|
|
if(!GetIsObjectValid(GetAttemptedAttackTarget()) && !GetIsObjectValid(GetAttemptedSpellTarget()) )
|
|
{
|
|
if (GetIsObjectValid(oMemory)&&!GetIsDead(oMemory)&&GetObjectSeen(oMemory) &&GetIsInCombat(OBJECT_SELF))
|
|
{
|
|
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if(GetIsObjectValid(GetLastAttacker()))
|
|
{
|
|
if(GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL))
|
|
{
|
|
//AdjustReputation(GetLastAttacker(), OBJECT_SELF, -100);
|
|
SetSummonHelpIfAttacked();
|
|
|
|
DetermineSpecialBehavior(oTarget);
|
|
}
|
|
else
|
|
{
|
|
if(GetArea(GetLastAttacker()) == GetArea(OBJECT_SELF))
|
|
{
|
|
SetSummonHelpIfAttacked();
|
|
DetermineCombatRound();
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//Put a check in to see if this attacker was the last attacker
|
|
//Possibly change the GetNPCWarning function to make the check
|
|
SetSpawnInCondition(NW_FLAG_SET_WARNINGS, FALSE);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ActivateFleeToExit();
|
|
}
|
|
}
|
|
|
|
void setstate (int nState)
|
|
{
|
|
SetLocalInt(OBJECT_SELF,"thiefstate",nState);
|
|
}
|
|
|
|
int getstate ()
|
|
{
|
|
int nState=GetLocalInt(OBJECT_SELF,"thiefstate");
|
|
return (nState);
|
|
}
|
|
|
|
void setmark (object oPC)
|
|
{
|
|
SetLocalObject(OBJECT_SELF,"oMark",oPC);
|
|
}
|
|
|
|
int ishome()
|
|
{
|
|
int nHome;
|
|
if (GetDistanceToObject(oHome)>14.0)
|
|
{
|
|
nHome=0;
|
|
}
|
|
else
|
|
{
|
|
nHome=1;
|
|
}
|
|
return (nHome);
|
|
}
|
|
|
|
int rightathome()
|
|
{
|
|
int nHome;
|
|
if (GetDistanceToObject(oHome)>1.5)
|
|
{
|
|
nHome=0;
|
|
}
|
|
else
|
|
{
|
|
nHome=1;
|
|
}
|
|
return (nHome);
|
|
}
|
|
|
|
object getmark ()
|
|
{
|
|
object oMark=GetLocalObject(OBJECT_SELF,"oMark");
|
|
return (oMark);
|
|
}
|
|
|
|
void runaway ()
|
|
{
|
|
//SpeakString("runaway command");
|
|
|
|
if (!rightathome())
|
|
{
|
|
ClearAllActions();
|
|
|
|
ActionMoveToObject(oHome,TRUE);
|
|
//SpeakString("not at home so going home");
|
|
}
|
|
else
|
|
{
|
|
setstate(LOOKING);
|
|
WalkWayPoints();
|
|
//SpeakString("at home so setting state to looking and doing wwp again");
|
|
}
|
|
}
|
|
|
|
void stealing (object oPC)
|
|
{
|
|
// SpeakString("stealing command");
|
|
setmark (oPC);
|
|
ClearAllActions();
|
|
ActionUseSkill(SKILL_PICK_POCKET,oPC);
|
|
//ActionDoCommand(SpeakString("debug running away cos I just stole something"));
|
|
// ActionDoCommand(SpeakString("setting state from stealing to running"));
|
|
ActionDoCommand(setstate(RUNNING));
|
|
ActionDoCommand(runaway());
|
|
}
|
|
|
|
|
|
void looking()
|
|
|
|
{
|
|
|
|
|
|
|
|
//SpeakString("looking command");
|
|
|
|
object oPC=GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR,PLAYER_CHAR_IS_PC);
|
|
if ((!GetIsObjectValid(oPC))&&(GetStealthMode(OBJECT_SELF)==STEALTH_MODE_DISABLED))
|
|
{
|
|
|
|
ActionUseSkill(SKILL_HIDE,OBJECT_SELF);
|
|
//SpeakString("debug hiding cos no PCs around");
|
|
setstate(LOOKING);
|
|
waypointwalk();
|
|
}
|
|
else if ((!GetObjectSeen(OBJECT_SELF,oPC))&&(GetStealthMode(OBJECT_SELF)==STEALTH_MODE_DISABLED)&&(!GetIsDM(oPC)))
|
|
{
|
|
ActionUseSkill(SKILL_HIDE,OBJECT_SELF);
|
|
//SpeakString("debug hiding cos nearest PC cant see me");
|
|
setstate(LOOKING);
|
|
waypointwalk();
|
|
}
|
|
else if ((GetIsObjectValid(oPC))&&(GetObjectSeen(OBJECT_SELF,oPC))&&(!GetIsDM(oPC)))
|
|
{
|
|
//SpeakString("been seen so setting state from looking to running");
|
|
setstate(RUNNING);
|
|
// run away
|
|
}
|
|
|
|
// if the NPC is at home then run the standard heartbeat scrip which includes the
|
|
// possibility of attacking an hostile PC
|
|
|
|
if (ishome())
|
|
{
|
|
//SpeakString("I am at home and I am doing the standard HB script");
|
|
standardhb();
|
|
waypointwalk();
|
|
}
|
|
// else simply walk waypoints
|
|
else
|
|
{
|
|
// SpeakString("I am not at home so I should be walking waypoints unless something has gone wrong");
|
|
waypointwalk();
|
|
}
|
|
}
|
|
|
|
void waypointwalk()
|
|
{
|
|
if (GetIsInCombat(OBJECT_SELF))
|
|
{
|
|
return;
|
|
}
|
|
int nDestination=GetLocalInt(OBJECT_SELF,"destination");
|
|
if (nDestination==0)
|
|
{
|
|
nDestination=d6();
|
|
SetLocalInt(OBJECT_SELF,"destination",nDestination);
|
|
}
|
|
|
|
string sDest=sWalk+IntToString(nDestination);
|
|
|
|
if (!isatwaypoint())
|
|
{
|
|
ClearAllActions();
|
|
ActionMoveToObject(GetWaypointByTag(sDest));
|
|
}
|
|
else
|
|
{
|
|
nDestination=d6();
|
|
SetLocalInt(OBJECT_SELF,"destination",nDestination);
|
|
}
|
|
|
|
}
|
|
|
|
int isatwaypoint()
|
|
{
|
|
int nIsthere;
|
|
int nDestination=GetLocalInt(OBJECT_SELF,"destination");
|
|
string sDest=sWalk+IntToString(nDestination);
|
|
object oDest=GetWaypointByTag(sDest);
|
|
|
|
if (GetDistanceToObject(oDest)>3.0)
|
|
{
|
|
nIsthere=0;
|
|
}
|
|
else
|
|
{
|
|
nIsthere=1;
|
|
}
|
|
|
|
return (nIsthere);
|
|
}
|
|
|