public static Character SpawnMobFromTemplate( string hash, Identity playfieldIdentity, Coordinate coord, Quaternion heading, IController controller, int desiredLevel = -1) { Character mobCharacter = null; DBMobTemplate mob = MobTemplateDao.Instance.GetMobTemplateByHash(hash); if (mob != null) { int level = desiredLevel; if (level == -1) { // Get random inside level range Random rnd = new Random(); level = mob.MinLvl + rnd.Next(mob.MaxLvl - mob.MinLvl); } else { // Put it inside level range level = (level < mob.MinLvl ? mob.MinLvl : level); level = level > mob.MaxLvl ? mob.MaxLvl : level; } mobCharacter = CreateMob(mob, playfieldIdentity, coord, heading, controller, level); } return(mobCharacter); }
public void SpawnRandomMob(ICharacter character) { Coordinate coord = character.Coordinates(); DBMobTemplate[] templates = MobTemplateDao.Instance.GetAll().ToArray(); Random rnd = new Random(Environment.TickCount); int mobNumber = rnd.Next(templates.Length); DBMobTemplate template = templates[mobNumber]; NPCController npcController = new NPCController(); Character mobCharacter = NonPlayerCharacterHandler.SpawnMobFromTemplate( template.Hash, character.Playfield.Identity, character.Coordinates(), character.RawHeading, npcController); mobCharacter.Playfield = character.Playfield; SimpleCharFullUpdateMessage mess = SimpleCharFullUpdate.ConstructMessage(mobCharacter); character.Playfield.Announce(mess); AppearanceUpdateMessageHandler.Default.Send(mobCharacter); Vector3 v = new Vector3(coord.x, coord.y, coord.z + 5); mobCharacter.AddWaypoint(v, false); v.x += 10 - rnd.Next(20); v.z -= 10 - rnd.Next(20); mobCharacter.AddWaypoint(v, false); v.x += 10 - rnd.Next(20); v.z -= 10 - rnd.Next(20); mobCharacter.AddWaypoint(v, false); v.x += 10 - rnd.Next(20); v.z -= 10 - rnd.Next(20); mobCharacter.AddWaypoint(v, false); mobCharacter.Stats[StatIds.health].Value = 10000; mobCharacter.DoNotDoTimers = false; }
private static Character CreateMob( DBMobTemplate mob, Identity playfieldIdentity, Coordinate coord, Quaternion heading, IController controller, int level) { IPlayfield playfield = Pool.Instance.GetObject <IPlayfield>(Identity.None, playfieldIdentity); if (playfield != null) { int newInstanceId = Pool.Instance.GetFreeInstance <Character>(1000000, IdentityType.CanbeAffected); Identity newIdentity = new Identity() { Type = IdentityType.CanbeAffected, Instance = newInstanceId }; Character mobCharacter = new Character(playfield.Identity, newIdentity, controller); mobCharacter.Read(); mobCharacter.Coordinates(coord); mobCharacter.Playfield = Pool.Instance.GetObject <IPlayfield>(Identity.None, playfieldIdentity); mobCharacter.RawHeading = new Quaternion(heading.xf, heading.yf, heading.zf, heading.wf); mobCharacter.Stats.SetBaseValueWithoutTriggering((int)StatIds.life, (uint)mob.Health); mobCharacter.Stats.SetBaseValueWithoutTriggering((int)StatIds.level, (uint)level); mobCharacter.Stats.SetBaseValueWithoutTriggering((int)StatIds.npcfamily, (uint)mob.NPCFamily); mobCharacter.Stats.SetBaseValueWithoutTriggering((int)StatIds.side, (uint)mob.Side); mobCharacter.Stats.SetBaseValueWithoutTriggering((int)StatIds.fatness, (uint)mob.Fatness); mobCharacter.Stats.SetBaseValueWithoutTriggering((int)StatIds.breed, (uint)mob.Breed); mobCharacter.Stats.SetBaseValueWithoutTriggering((int)StatIds.sex, (uint)mob.Sex); mobCharacter.Stats.SetBaseValueWithoutTriggering((int)StatIds.race, (uint)mob.Race); mobCharacter.Stats.SetBaseValueWithoutTriggering((int)StatIds.flags, (uint)mob.Flags); mobCharacter.Stats.SetBaseValueWithoutTriggering((int)StatIds.monsterdata, (uint)mob.MonsterData); mobCharacter.Stats.SetBaseValueWithoutTriggering((int)StatIds.monsterscale, (uint)mob.MonsterScale); mobCharacter.Stats.SetBaseValueWithoutTriggering((int)StatIds.profession, 15); mobCharacter.Stats.SetBaseValueWithoutTriggering((int)StatIds.accountflags, 0); mobCharacter.Stats.SetBaseValueWithoutTriggering((int)StatIds.expansion, 0); mobCharacter.Stats.SetBaseValueWithoutTriggering((int)StatIds.runspeed, 513); mobCharacter.Stats[StatIds.headmesh].BaseValue = (uint)mob.HeadMesh; mobCharacter.Stats.SetBaseValueWithoutTriggering((int)StatIds.losheight, 15); mobCharacter.Stats.SetBaseValueWithoutTriggering((int)StatIds.visualprofession, 15); /* * // For testing only, blue trousers and a helmet * IItem trousers = new Item(1, ItemLoader.ItemList[27350].GetLowId(1),ItemLoader.ItemList[27350].GetLowId(1)); * IItem helmet = new Item(1, ItemLoader.ItemList[85534].GetLowId(1), ItemLoader.ItemList[85534].GetHighId(1)); * mobCharacter.BaseInventory.Pages[(int)IdentityType.ArmorPage].Add((int)ArmorSlots.Legs + mobCharacter.BaseInventory.Pages[(int)IdentityType.ArmorPage].FirstSlotNumber, trousers); * mobCharacter.BaseInventory.Pages[(int)IdentityType.ArmorPage].Add((int)ArmorSlots.Head + mobCharacter.BaseInventory.Pages[(int)IdentityType.ArmorPage].FirstSlotNumber, helmet); */ // Set the MeshLayers correctly ( Head mesh!! ) /!\ // TODO: This needs to be in StatHeadmesh.cs (somehow) mobCharacter.MeshLayer.AddMesh(0, mob.HeadMesh, 0, 4); mobCharacter.SocialMeshLayer.AddMesh(0, mob.HeadMesh, 0, 4); mobCharacter.Name = mob.Name; mobCharacter.FirstName = ""; mobCharacter.LastName = ""; controller.Character = mobCharacter; return(mobCharacter); } return(null); }