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); }
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]))); } } }