public static void FightRoutine(NPCProto npc) { //Draw Weapon: NPCAI ai = npc.getAI(); NPCProto enemy = ai.EnemyList.First.Value; npc.readyBestWeapon(enemy); if (enemy.HP == 0) { ai.EnemyList.Remove(enemy); npc.standAnim(); npc.unreadyWeapon(); return; } else if ((enemy.Position - npc.Position).Length > 3000)//Stop running! { ai.EnemyList.Remove(enemy); npc.standAnim(); npc.unreadyWeapon(); return; } if (npc.getAI().FightStates.First != null) { npc.getAI().FightStates.First.Value.update(); return; } npc.turnToPosition(enemy.Position); if (rand.NextDouble() > 0.5) { npc.getAI().FightStates.AddLast(new AnimState(npc, "T_FISTPARADEJUMPB")); npc.getAI().FightStates.AddLast(new WaitState(npc, 10000 * 100)); } if (npc.Position.getDistance(enemy.Position) > npc.getAttackRange()) { npc.getAI().FightStates.AddLast(new GotoState(npc, enemy, npc.getAttackRange())); } else { npc.getAI().FightStates.AddLast(new AnimState(npc, npc.getFightRunAnimation())); npc.getAI().FightStates.AddLast(new DamageState(npc, enemy)); npc.getAI().FightStates.AddLast(new WaitState(npc, 10000 * 200)); } //if (npc.gotoPosition(enemy.Position, 200)) //{ // npc.standAnim(); // npc.playAnimation(npc.getFightAnimation()); //} }
public static bool gotoPosition(this NPCProto proto, Vec3f position, float minDistance) { if (proto is NPC) { NPC p = (NPC)proto; if (p.NPCController == null)//set the position! { if (proto.getAI().lastPosUpdate == 0) { proto.getAI().lastPosUpdate = DateTime.Now.Ticks; } else { long now = DateTime.Now.Ticks; long time = now - proto.getAI().lastPosUpdate; float speed = (5 * 100) * (int)(time / 1000.0); Vec3f direction = position - proto.Position; if (direction.Length < speed) { proto.Position = position; } else { direction = direction.normalise(); direction *= speed; proto.Position = proto.Position + direction; } proto.getAI().lastPosUpdate = now; } } else { proto.getAI().lastPosUpdate = 0; } } if (proto.Position.getDistance(position) < minDistance) { return(true); } else { Vec3f p = position - proto.Position; p.Y = 0; proto.setDirection(p); proto.playAnimation(proto.getRunAnimation()); return(false); } }
public static String getRunAnimation(this NPCProto proto) { String anim = "S_WALKL"; if (proto.WeaponMode == 1) { anim = "S_FISTWALKL"; } if (proto.getAI().WalkType == Enumeration.WalkTypes.Run) { if (proto.WeaponMode == 0) { anim = "S_RUNL"; } else if (proto.WeaponMode == 1) { anim = "S_FISTRUNL"; } else if (proto.WeaponMode == 2) { anim = "S_1HRUNL"; } } return(anim); }
public static bool RTN_ACTIVE(this NPCProto proto, int startHour, int startMinute, int endHour, int endMinute) { int day, hour, minute; World.getTime(out day, out hour, out minute); if (endHour == 24 && endMinute == 0) { endHour = 23; endMinute = 59; } int _endHour = endHour; int _hournow = hour; if (endHour < startHour || (endHour == startHour && endMinute < startMinute)) { endHour += 24; day += 1; if (startHour > hour) { hour += 24; } } if (startHour > hour || (startHour == hour && startMinute > minute)) { return(false); } if (endHour < hour || (endHour == hour && endMinute <= minute)) { return(false); } if (proto.getAI().lastRTNDay == day && proto.getAI().lastRTNHour >= _endHour && proto.getAI().lastRTNMinute >= endMinute) { return(false); } proto.getAI().lastRTNDay = day; proto.getAI().lastRTNHour = _endHour; proto.getAI().lastRTNMinute = endMinute; return(true); }
public static void OnDamage(NPCProto victim, NPCProto attacker, int damage, bool dropUnconscious, bool dropDead) { if (victim.getAI().AssessDamageRoutine != null) { victim.getAI().AssessDamageRoutine(victim, victim, attacker, damage, dropUnconscious, dropDead); } foreach (KeyValuePair <NPCProto, NPCProto> npcPair in victim.getAI().TargetList) { NPCProto npc = npcPair.Key; if (npc.getAI().AssessOtherDamageRoutine != null) { npc.getAI().AssessOtherDamageRoutine(npc, victim, attacker, damage, dropUnconscious, dropDead); } } }
public static void OnDamage(NPCProto npc, NPCProto victim, NPCProto attacker, int damage, bool dropUnconscious, bool dropDead) { NPCAI ai = victim.getAI(); if (victim.HP == 0) { victim.standAnim(); victim.playAnimation("S_DEADB"); return; } if (attacker == null) { return; } ai.addEnemy(attacker); }
public static void OnAssessTarget(NPCProto npc, NPCProto target) { NPCAI ai = npc.getAI(); //Check if target is Enemy and call AssessEnemy: if (npc.getAttitudeToGuild(target.getGuild()) == Enumeration.GuildsAttitude.HOSTILE && target.HP != 0 && !target.isUnconscious && ai.AssessEnemyRoutine != null) { if (ai.AssessWarnRoutine != null) { } else { ai.AssessEnemyRoutine(npc, target); } } if (target.HP == 0 && ai.AssessBodyRoutine != null) { ai.AssessBodyRoutine(npc, target); } }
public static void OnDamage(NPCProto npc, NPCProto victim, NPCProto attacker, int damage, bool dropUnconscious, bool dropDead) { NPCAI ai = npc.getAI(); if (victim.HP != 0) { if (npc.getAttitudeToGuild(victim.getGuild()) == Enumeration.GuildsAttitude.FRIENDLY && npc.getAttitudeToGuild(attacker.getGuild()) != Enumeration.GuildsAttitude.FRIENDLY) { ai.addEnemy(attacker); } else if (npc.getAttitudeToGuild(attacker.getGuild()) == Enumeration.GuildsAttitude.FRIENDLY && npc.getAttitudeToGuild(victim.getGuild()) != Enumeration.GuildsAttitude.FRIENDLY) { ai.addEnemy(victim); } } else if (ai.AssessBodyRoutine != null) { ai.AssessBodyRoutine(npc, victim); } }
public virtual void stop() { mNPC.getAI().FightStates.RemoveFirst(); }
protected virtual void stopState() { mNPC.getAI().removeFirstState(); }
public static void AI_SETWALKTYPE(this NPCProto proto, WalkTypes wt) { AIStates.AI_SETWALKTYPE g = new AIStates.AI_SETWALKTYPE(proto, wt); proto.getAI().addState(g); }
public static void AI_PLAYANIMATION(this NPCProto proto, String anim) { AIStates.AI_PLAYANIMATION g = new AIStates.AI_PLAYANIMATION(proto, anim); proto.getAI().addState(g); }
public static void AI_ALIGNTOWP(this NPCProto proto, String waypoint) { AIStates.AI_ALIGNTOWP g = new AIStates.AI_ALIGNTOWP(proto, waypoint); proto.getAI().addState(g); }
public static void OnAssessEnemy(NPCProto npc, NPCProto target) { npc.getAI().addEnemy(target); }
public static void setGuild(this NPCProto proto, Guilds guild) { proto.getAI().Guild = guild; }
public static void ResetAIStates(this NPCProto proto) { proto.getAI().clearStateList(); }
public static Guilds getGuild(this NPCProto proto) { return(proto.getAI().Guild); }