public static ICharacter InstantiateMobSpawn(
            DBMobSpawn mob,
            DBMobSpawnStat[] stats,
            IController npccontroller,
            IPlayfield playfield)
        {
            if (playfield != null)
            {
                Identity mobId = new Identity()
                {
                    Type = IdentityType.CanbeAffected, Instance = mob.Id
                };
                if (Pool.Instance.GetObject(playfield.Identity, mobId) != null)
                {
                    throw new Exception("Object " + mobId.ToString() + " already exists!!");
                }
                Character cmob = new Character(playfield.Identity, mobId, npccontroller);
                cmob.Read();
                cmob.Playfield = playfield;
                cmob.Coordinates(new Coordinate()
                {
                    x = mob.X, y = mob.Y, z = mob.Z
                });
                cmob.RawHeading = new Quaternion(mob.HeadingX, mob.HeadingY, mob.HeadingZ, mob.HeadingW);
                cmob.Name       = mob.Name;
                cmob.FirstName  = "";
                cmob.LastName   = "";
                foreach (DBMobSpawnStat stat in stats)
                {
                    cmob.Stats.SetBaseValueWithoutTriggering(stat.Stat, (uint)stat.Value);
                }

                cmob.Stats.SetBaseValueWithoutTriggering((int)StatIds.visualprofession, cmob.Stats[StatIds.profession].BaseValue);
                // initiate affected stats calculation
                int temp = cmob.Stats[StatIds.level].Value;
                temp = cmob.Stats[StatIds.agility].Value;
                temp = cmob.Stats[StatIds.headmesh].Value;
                cmob.MeshLayer.AddMesh(0, cmob.Stats[StatIds.headmesh].Value, 0, 4);
                cmob.SocialMeshLayer.AddMesh(0, cmob.Stats[StatIds.headmesh].Value, 0, 4);
                List <MobSpawnWaypoint> waypoints =
                    MessagePackZip.DeserializeData <MobSpawnWaypoint>(mob.Waypoints.ToArray());
                foreach (MobSpawnWaypoint wp in waypoints)
                {
                    Waypoint mobwp = new Waypoint();
                    mobwp.Position.x = wp.X;
                    mobwp.Position.y = wp.Y;
                    mobwp.Position.z = wp.Z;
                    mobwp.Running    = wp.WalkMode == 1;
                    cmob.Waypoints.Add(mobwp);
                }
                npccontroller.Character = cmob;
                if (cmob.Waypoints.Count > 2)
                {
                    cmob.Controller.State = CharacterState.Patrolling;
                }
                cmob.DoNotDoTimers = false;
                return(cmob);
            }
            return(null);
        }
Exemple #2
0
        public override void ExecuteCommand(ICharacter character, Identity target, string[] args)
        {
            if (args[1].ToLower() == "save")
            {
                Character mob = Pool.Instance.GetObject <Character>(character.Playfield.Identity, target);
                if (mob == null)
                {
                    character.Playfield.Publish(ChatTextMessageHandler.Default.CreateIM(character, "Not a NPC?"));
                    return;
                }

                if (!(mob.Controller is NPCController))
                {
                    character.Playfield.Publish(
                        ChatTextMessageHandler.Default.CreateIM(
                            character,
                            "Don't try to remove/save other players please."));
                }

                DBMobSpawn mobdbo = new DBMobSpawn();
                mobdbo.Id        = mob.Identity.Instance;
                mobdbo.Name      = mob.Name;
                mobdbo.Textures0 = 0;
                mobdbo.Textures1 = 0;
                mobdbo.Textures2 = 0;
                mobdbo.Textures3 = 0;
                mobdbo.Textures4 = 0;
                mobdbo.Playfield = mob.Playfield.Identity.Instance;
                Coordinate tempCoordinate = mob.Coordinates();
                mobdbo.X        = tempCoordinate.x;
                mobdbo.Y        = tempCoordinate.y;
                mobdbo.Z        = tempCoordinate.z;
                mobdbo.HeadingW = mob.Heading.wf;
                mobdbo.HeadingX = mob.Heading.xf;
                mobdbo.HeadingY = mob.Heading.yf;
                mobdbo.HeadingZ = mob.Heading.zf;
                if (mob.Waypoints.Count > 0)
                {
                    List <MobSpawnWaypoint> temp = this.GetMobWaypoints(mob);
                    mobdbo.Waypoints = new Binary(MessagePackZip.SerializeData(temp));
                }

                if (MobSpawnDao.Instance.Exists(mobdbo.Id))
                {
                    MobSpawnDao.Instance.Delete(mobdbo.Id);
                }

                MobSpawnDao.Instance.Add(mobdbo);

                // Clear remnants first
                MobSpawnStatDao.Instance.Delete(new { mobdbo.Id, mobdbo.Playfield });
                Dictionary <int, uint> statsToSave = mob.Stats.GetStatValues();
                foreach (KeyValuePair <int, uint> kv in statsToSave)
                {
                    MobSpawnStatDao.Instance.Add(
                        new DBMobSpawnStat()
                    {
                        Id        = mob.Identity.Instance,
                        Playfield = mob.Playfield.Identity.Instance,
                        Stat      = kv.Key,
                        Value     = (int)kv.Value
                    });
                }
            }
            if (args[1].ToLower() == "remove")
            {
                MobSpawnDao.Instance.Delete(target.Instance);
            }

            if (args[1].ToLower() == "knubot")
            {
                ICharacter cmob = Pool.Instance.GetObject <ICharacter>(character.Playfield.Identity, target);
                if (cmob == null)
                {
                    character.Playfield.Publish(
                        ChatTextMessageHandler.Default.CreateIM(
                            character,
                            string.Format("Target {0} is no npc.", target.ToString(true))));
                    return;
                }

                string scriptname = args[2];
                scriptname = ScriptCompiler.Instance.ClassExists(scriptname);
                if (scriptname != "")
                {
                    DBMobSpawn mob = MobSpawnDao.Instance.Get(target.Instance);
                    if (mob == null)
                    {
                        character.Playfield.Publish(
                            ChatTextMessageHandler.Default.CreateIM(
                                character,
                                string.Format(
                                    "Target npc {0} is not yet saved to mobspawn table.",
                                    target.ToString(true))));
                    }
                    else
                    {
                        mob.KnuBotScriptName = scriptname;
                        MobSpawnDao.Instance.Save(mob);
                        character.Playfield.Publish(
                            ChatTextMessageHandler.Default.CreateIM(
                                character,
                                string.Format(
                                    "Saved initialization script '{0}' for spawn {1}.",
                                    args[2],
                                    target.ToString(true))));
                        ((NPCController)cmob.Controller).SetKnuBot(
                            ScriptCompiler.Instance.CreateKnuBot(scriptname, cmob.Identity));
                    }
                }
                else
                {
                    character.Playfield.Publish(
                        ChatTextMessageHandler.Default.CreateIM(
                            character,
                            string.Format("Script '{0}' does not exist.", args[2])));
                }
            }
        }