public bool Run(object[] args) { NWCreature self = (NWCreature)args[0]; if (_enmity.IsEnmityTableEmpty(self)) { return(false); } float aggroRange = self.GetLocalFloat("AGGRO_RANGE"); if (aggroRange <= 0.0f) { aggroRange = 10.0f; } int nth = 1; NWCreature creature = _.GetNearestObject(OBJECT_TYPE_CREATURE, self, nth); var target = _enmity.GetEnmityTable(self).OrderByDescending(x => x.Value).First().Value.TargetObject; while (creature.IsValid) { if (creature.IsPlayer == false && _.GetIsEnemy(creature, self) == FALSE && !_enmity.IsOnEnmityTable(creature, target) && _.GetDistanceBetween(self, creature) <= aggroRange && self.RacialType == creature.RacialType) { _enmity.AdjustEnmity(creature, target, 0, 1); } nth++; creature = _.GetNearestObject(OBJECT_TYPE_CREATURE, self, nth); } return(true); }
private void ApplyEnmity(NWPlayer pc, NWCreature target, Data.Entities.Perk perk) { switch ((EnmityAdjustmentRuleType)perk.EnmityAdjustmentRuleID) { case EnmityAdjustmentRuleType.AllTaggedTargets: _enmity.AdjustEnmityOnAllTaggedCreatures(pc, perk.Enmity); break; case EnmityAdjustmentRuleType.TargetOnly: if (target.IsValid) { _enmity.AdjustEnmity(target, pc, perk.Enmity); } break; case EnmityAdjustmentRuleType.Custom: IPerk perkAction = App.ResolveByInterface <IPerk>("Perk." + perk.JavaScriptName); perkAction?.OnCustomEnmityRule(pc, perk.Enmity); break; } }
public void OnImpact(NWPlayer player, NWObject target, int perkLevel) { NWCreature npc = (target.Object); Effect vfx = _.EffectVisualEffect(NWScript.VFX_IMP_CHARM); _.ApplyEffectToObject(NWScript.DURATION_TYPE_INSTANT, vfx, target.Object); player.AssignCommand(() => { _.ActionPlayAnimation(NWScript.ANIMATION_FIREFORGET_TAUNT, 1f, 1f); }); _enmity.AdjustEnmity(npc, player, 120); }
private void HandleApplySneakAttackDamage() { DamageData data = _nwnxDamage.GetDamageEventData(); if (data.Total <= 0) { return; } NWObject damager = data.Damager; int sneakAttackType = damager.GetLocalInt("SNEAK_ATTACK_ACTIVE"); if (damager.IsPlayer && sneakAttackType > 0) { NWPlayer player = damager.Object; NWCreature target = Object.OBJECT_SELF; int perkRank = _perk.GetPCPerkByID(damager.GlobalID, (int)PerkType.SneakAttack).PerkLevel; int perkBonus = 1; // Rank 4 increases damage bonus by 2x (total: 3x) if (perkRank == 4) { perkBonus = 2; } float perkRate; if (sneakAttackType == 1) // Player is behind target. { perkRate = 1.0f * perkBonus; } else // Player is anywhere else. { perkRate = 0.5f * perkBonus; } var effectiveStats = _playerStat.GetPlayerItemEffectiveStats(player); float damageRate = 1.0f + perkRate + effectiveStats.SneakAttack * 0.05f; data.Base = (int)(data.Base * damageRate); if (target.IsNPC) { _enmity.AdjustEnmity(target, player, 5 * data.Base); } _nwnxDamage.SetDamageEventData(data); } damager.DeleteLocalInt("SNEAK_ATTACK_ACTIVE"); }
public BehaviourTreeBuilder Build(BehaviourTreeBuilder builder, params object[] args) { return(builder.Do("AggroTargetBySight", t => { NWCreature self = (NWCreature)args[0]; if (self.IsInCombat) { return BehaviourTreeStatus.Failure; } float aggroRange = self.GetLocalFloat("AGGRO_RANGE"); if (aggroRange <= 0.0f) { aggroRange = 10.0f; } Location targetLocation = _.Location( self.Area.Object, _biowarePos.GetChangedPosition(self.Position, aggroRange, self.Facing), self.Facing + 180.0f); NWCreature creature = NWCreature.Wrap(_.GetFirstObjectInShape(NWScript.SHAPE_SPELLCYLINDER, aggroRange, targetLocation, NWScript.TRUE, NWScript.OBJECT_TYPE_CREATURE, self.Position)); while (creature.IsValid) { if (_.GetIsEnemy(creature.Object, self.Object) == NWScript.TRUE && !_enmity.IsOnEnmityTable(self, creature) && _.GetDistanceBetween(self.Object, creature.Object) <= aggroRange && !creature.HasAnyEffect(NWScript.EFFECT_TYPE_INVISIBILITY, NWScript.EFFECT_TYPE_SANCTUARY)) { _enmity.AdjustEnmity(self, creature, 0, 1); } creature = NWCreature.Wrap(_.GetNextObjectInShape(NWScript.SHAPE_SPELLCYLINDER, aggroRange, targetLocation, NWScript.TRUE, NWScript.OBJECT_TYPE_CREATURE, self.Position)); } return BehaviourTreeStatus.Running; })); }
public BehaviourTreeBuilder Build(BehaviourTreeBuilder builder, params object[] args) { return(builder.Do("AggroTargetBySound", t => { NWCreature self = (NWCreature)args[0]; if (self.IsInCombat) { return BehaviourTreeStatus.Failure; } float aggroRange = self.GetLocalFloat("AGGRO_RANGE"); if (aggroRange <= 0.0f) { aggroRange = 5.0f; } int nth = 1; NWCreature creature = NWCreature.Wrap(_.GetNearestObject(NWScript.OBJECT_TYPE_CREATURE, self.Object, nth)); while (creature.IsValid) { if (_.GetIsEnemy(creature.Object, self.Object) == NWScript.TRUE && !_enmity.IsOnEnmityTable(self, creature) && !creature.HasAnyEffect(NWScript.EFFECT_TYPE_SANCTUARY) && _.GetDistanceBetween(self.Object, creature.Object) <= aggroRange && _.LineOfSightObject(self.Object, creature.Object) == NWScript.TRUE) { _enmity.AdjustEnmity(self, creature, 0, 1); } nth++; creature = NWCreature.Wrap(_.GetNearestObject(NWScript.OBJECT_TYPE_CREATURE, self.Object, nth)); } return BehaviourTreeStatus.Running; })); }
public void OnImpact(NWPlayer oPC, NWObject oTarget) { NWCreature npc = NWCreature.Wrap(oTarget.Object); Effect vfx = _.EffectVisualEffect(VFX_IMP_CHARM); _.ApplyEffectToObject(DURATION_TYPE_INSTANT, vfx, oTarget.Object); oPC.AssignCommand(() => { _.ActionPlayAnimation(ANIMATION_FIREFORGET_TAUNT, 1f, 1f); }); _enmity.AdjustEnmity(npc, oPC, 120); // todo debugging EnmityTable table = _enmity.GetEnmityTable(npc); foreach (var x in table.Values) { Console.WriteLine(npc.Name + ", " + x.TargetObject.Name + ": Volatile = " + x.VolatileAmount + ", Cumulative: " + x.CumulativeAmount); } // todo end debugging }
public bool Run(object[] args) { NWCreature self = (NWCreature)args[0]; if (self.IsInCombat) { return(false); } float aggroRange = self.GetLocalFloat("AGGRO_RANGE"); if (aggroRange <= 0.0f) { aggroRange = 10.0f; } Location targetLocation = _.Location( self.Area.Object, _biowarePos.GetChangedPosition(self.Position, aggroRange, self.Facing), self.Facing + 180.0f); NWCreature creature = _.GetFirstObjectInShape(SHAPE_SPELLCYLINDER, aggroRange, targetLocation, TRUE, OBJECT_TYPE_CREATURE, self.Position); while (creature.IsValid) { if (_.GetIsEnemy(creature.Object, self.Object) == TRUE && !_enmity.IsOnEnmityTable(self, creature) && _.GetDistanceBetween(self.Object, creature.Object) <= aggroRange && !creature.HasAnyEffect(EFFECT_TYPE_INVISIBILITY, EFFECT_TYPE_SANCTUARY)) { _enmity.AdjustEnmity(self, creature, 0, 1); } creature = _.GetNextObjectInShape(SHAPE_SPELLCYLINDER, aggroRange, targetLocation, TRUE, OBJECT_TYPE_CREATURE, self.Position); } return(true); }
public bool Run(object[] args) { NWCreature self = (NWCreature)args[0]; if (self.IsInCombat) { return(false); } float aggroRange = self.GetLocalFloat("AGGRO_RANGE"); if (aggroRange <= 0.0f) { aggroRange = 10.0f; } int nth = 1; NWCreature creature = _.GetNearestObject(OBJECT_TYPE_CREATURE, self.Object, nth); while (creature.IsValid) { if (_.GetIsEnemy(creature.Object, self.Object) == TRUE && !_enmity.IsOnEnmityTable(self, creature) && !creature.HasAnyEffect(EFFECT_TYPE_SANCTUARY) && _.GetDistanceBetween(self.Object, creature.Object) <= aggroRange && _.LineOfSightObject(self.Object, creature.Object) == TRUE) { _enmity.AdjustEnmity(self, creature, 0, 1); } nth++; creature = _.GetNearestObject(OBJECT_TYPE_CREATURE, self.Object, nth); } return(true); }