Files
dsrc/sku.0/sys.server/compiled/game/script/ai/soldier.script
T
2013-09-10 23:17:15 -07:00

174 lines
4.1 KiB
Plaintext

include ai.ai_aggro;
include ai.ai_combat;
include library.ai_lib;
include library.attrib;
include library.factions;
include library.pet_lib;
include library.utils;
const string ACTION_ALERT = "alert";
const string ACTION_THREATEN = "threaten";
trigger OnAttach()
{
if ( !hasObjVar( self, "ai.diction") )
setObjVar( self, "ai.diction", "military" );
setAttributeAttained(self, attrib.GUARD);
setAttributeInterested(self, attrib.THUG);
setAttributeInterested(self, attrib.HERBIVORE);
setAttributeInterested(self, attrib.CARNIVORE);
if ( getConfigSetting("GameServer", "disableAITriggerVolumes") == null )
createTriggerVolume( ai_lib.ALERT_VOLUME_NAME, ai_lib.aiGetApproachTriggerRange( self ), true );
setObjVar( self, "ai.rangedOnly", true );
if ( !hasObjVar( self, "ai.grenadeType" ))
{
setObjVar( self, "ai.grenadeType", "object/weapon/ranged/grenade/grenade_fragmentation" );
}
return SCRIPT_CONTINUE;
}
trigger OnTriggerVolumeEntered( string volumeName, obj_id breacher )
{
if (ai_lib.isInCombat(self))
return SCRIPT_CONTINUE;
if (breacher == self)
return SCRIPT_CONTINUE;
if (isIncapacitated(self))
return SCRIPT_CONTINUE;
if (!isMob( breacher))
return SCRIPT_CONTINUE;
if (ai_lib.isMonster(breacher))
return SCRIPT_CONTINUE;
if (hasObjVar( self, "ai.inFormation" ))
return SCRIPT_CONTINUE;
if (volumeName == ai_lib.ALERT_VOLUME_NAME)
{
const int reaction = factions.getFactionReaction( self, breacher );
switch ( reaction )
{
case factions.REACTION_NEGATIVE :
if (!hasObjVar( self, "ai.inFormation" ))
ai_lib.barkString( self, "hi_mean" );
break;
case factions.REACTION_POSITIVE:
if (!hasObjVar( self, "ai.inFormation" ))
ai_lib.barkString( self, "hi_nice" );
break;
default:
if (!hasObjVar( self, "ai.inFormation" ))
ai_lib.barkString( self, "hi_mid" );
break;
}
}
return SCRIPT_CONTINUE;
}
trigger OnTriggerVolumeExited( string volumeName, obj_id breacher )
{
if (ai_lib.isAiDead(self))
return SCRIPT_OVERRIDE;
if ( volumeName == ai_lib.ALERT_VOLUME_NAME && ( isMob( breacher)
&& !ai_lib.isMonster( breacher) ) && !ai_lib.isInCombat( self )
&& !ai_lib.isAiDead( breacher ) && !hasObjVar( self, "ai.inFormation" )
)
{
int reaction = factions.getFactionReaction( self, breacher );
switch ( reaction )
{
case factions.REACTION_NEGATIVE :
ai_lib.barkString( self, "bye_mean" );
break;
case factions.REACTION_POSITIVE:
ai_lib.barkString( self, "bye_nice" );
break;
default:
ai_lib.barkString( self, "bye_mid" );
break;
}
}
return SCRIPT_CONTINUE;
}
trigger OnBehaviorChange( int newBehavior, int oldBehavior, int[] changeFlags )
{
if ( ai_lib.isAiDead( self ) )
return SCRIPT_OVERRIDE;
if ( ai_lib.isInCombat( self ))
return SCRIPT_OVERRIDE;
if ( newBehavior > oldBehavior )
{
if ( newBehavior >= BEHAVIOR_THREATEN && newBehavior < BEHAVIOR_ATTACK )
{
doAgitateBehavior( self, newBehavior );
return SCRIPT_OVERRIDE;//don't do the default AI thing
}
return SCRIPT_CONTINUE;
}
else if ( newBehavior == BEHAVIOR_CALM )
{
//debugSpeakMsg( self, "I AM CALM AGAIN" );
ai_lib.barkString( self, "calm" );
return SCRIPT_CONTINUE;
}
//do default behavior stuff:
return SCRIPT_CONTINUE;
}
void doAgitateBehavior( obj_id npc, int behavior )
{
if ( isInvulnerable( npc ) )
return;
if ( getConfigSetting("GameServer", "disableAICombat")!=null )
return;
//debugSpeakMsg( npc, "doing custom thing" );
//obj_id threat = ai_lib.getBehaviorTarget( npc, behavior );
//if ( threat == null )
// return;
//else
// setObjVar( npc, "ai.threat", threat );
//
//switch ( behavior )
//{
// case BEHAVIOR_ALERT:
// stop( npc );
// ai_lib.setMood( npc, ai_lib.MOOD_NERVOUS );
// break;
// case BEHAVIOR_THREATEN:
// //debugSpeakMsg( npc, "Grrr!");
// faceTo( npc, threat );
// doAnimationAction( npc, ACTION_THREATEN );
// ai_lib.setMood( npc, ai_lib.MOOD_THREATEN );
// break;
// case BEHAVIOR_FLEE:
// startCombat(npc, threat);
// break;
// case BEHAVIOR_PANIC:
// startCombat(npc, threat);
// break;
// default :
// //debugSpeakMsg( npc, "default: " + behavior );
// break;
//}
}