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; //} }