Esempio n. 1
0
        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);
        }
Esempio n. 5
0
        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);
                }
            }
        }
Esempio n. 6
0
        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);
        }
Esempio n. 7
0
        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);
            }
        }
Esempio n. 9
0
 public virtual void stop()
 {
     mNPC.getAI().FightStates.RemoveFirst();
 }
Esempio n. 10
0
 protected virtual void stopState()
 {
     mNPC.getAI().removeFirstState();
 }
Esempio n. 11
0
 public static void AI_SETWALKTYPE(this NPCProto proto, WalkTypes wt)
 {
     AIStates.AI_SETWALKTYPE g = new AIStates.AI_SETWALKTYPE(proto, wt);
     proto.getAI().addState(g);
 }
Esempio n. 12
0
 public static void AI_PLAYANIMATION(this NPCProto proto, String anim)
 {
     AIStates.AI_PLAYANIMATION g = new AIStates.AI_PLAYANIMATION(proto, anim);
     proto.getAI().addState(g);
 }
Esempio n. 13
0
 public static void AI_ALIGNTOWP(this NPCProto proto, String waypoint)
 {
     AIStates.AI_ALIGNTOWP g = new AIStates.AI_ALIGNTOWP(proto, waypoint);
     proto.getAI().addState(g);
 }
Esempio n. 14
0
 public static void OnAssessEnemy(NPCProto npc, NPCProto target)
 {
     npc.getAI().addEnemy(target);
 }
Esempio n. 15
0
 public static void setGuild(this NPCProto proto, Guilds guild)
 {
     proto.getAI().Guild = guild;
 }
Esempio n. 16
0
 public static void ResetAIStates(this NPCProto proto)
 {
     proto.getAI().clearStateList();
 }
Esempio n. 17
0
 public static Guilds getGuild(this NPCProto proto)
 {
     return(proto.getAI().Guild);
 }