//WvsGame::NpcPool-------------------------------------------------------------------------------------------- public static COutPacket NpcEnterField(CNpc npc) { var p = new COutPacket(SendOps.LP_NpcEnterField); p.Encode4(npc.dwNpcId); p.Encode4(npc.Id); //CNpc::Init p.Encode2((short)npc.X); //m_ptPosPrev.x p.Encode2((short)npc.Cy); //m_ptPosPrev.y p.Encode1(0); // & 1 | 2 * 2); //m_nMoveAction | life.getF() == 1 ? 0 : 1 p.Encode2((short)npc.Foothold); //dwSN Foothold p.Encode2((short)npc.Rx0); //m_ptPosPrev.x p.Encode2((short)npc.Rx1); //m_ptPosPrev.y p.Encode1(true); //I hope this works lol | //mplew.write((show && !life.isHidden()) ? 1 : 0); return(p); }
/// <summary> /// Sets an NPC controller to the given character. /// Sends proper notification packets to new and previous characters /// </summary> /// <param name="pUser"></param> /// <param name="pNpc"></param> public void ChangeNpcController(Character pUser, CNpc pNpc) { var pOldUser = pNpc.Controller; if (pUser is null) { pUser = Users.Random(); if (pUser is null) { return; // no chars in map } } if (pOldUser?.dwId != pUser.dwId) //TODO: Confirm this doesnt glitch { pOldUser?.SendPacket(CPacket.NpcChangeController(pNpc, 0)); byte nLevel = 1; pNpc.SetController(pUser); pUser.SendPacket(CPacket.NpcChangeController(pNpc, nLevel)); } }
protected override void InitMobs() { var mobcount = 30; const int npc = 1012119; switch (DungeonFieldIndex) { case 1: { var mobs = new int[2] { 9200009, 9500123 }; var y = new int[5] { 295, 206, 46, -55, -249 }; var x = new int[2][] { new int[5] { -20, 275, 290, 310, 310 }, // low range new int[5] { 1250, 1100, 980, 740, 730 }, // high range }; execute(mobs, y, x); makenpc(-340, 298, 21); } break; case 2: { var mobs = new int[2] { 9500123, 9300387 }; var y = new int[5] { 300, 105, 11, -80, -260 }; var x = new int[2][] { new int[5] { -115, 136, 130, 232, 243 }, // low range new int[5] { 1166, 830, 735, 670, 662 }, // high range }; execute(mobs, y, x); makenpc(-340, 298, 4); } break; case 3: { var mobs = new int[2] { 9300387, 9500149 }; var y = new int[5] { 178, 84, -94, -187, -367 }; var x = new int[2][] { new int[5] { 97, 623, 659, 766, 859 }, // low range new int[5] { 1386, 1656, 1465, 1372, 1290 }, // high range }; execute(mobs, y, x); makenpc(-170, -180, 21); } break; case 4: { var mobs = new int[2] { 9500149, 9500150 }; // 3k hp * 10 var y = new int[9] { 175, 76, 48, 34, 0, -97, -127, -240, -368 }; var x = new int[2][] { new int[9] { 380, 498, 1202, 93, 930, 125, 1069, 235, 762 }, // low range new int[9] { 1725, 920, 1590, 480, 1360, 930, 1500, 630, 1130 }, // high range }; execute(mobs, y, x); makenpc(1260, -420, 14); } break; case 5: { MobHpMultiplier = 60; var mobs = new int[3] { 8220009, 8220009, 8220009 }; var y = new int[3] { 1967, 1606, 1373 }; var x = new int[2][] { new int[3] { 0, 113, 210 }, new int[3] { 470, 400, 445 }, }; for (var i = 0; i < mobs.Length; i++) { Mobs.CreateMob(mobs[i], null, Constants.Rand.Next(x[0][i], x[1][i]), y[i], 0, 0, 0, 0, MobType.Normal, null); //var mob = new CMob(mobs[i]) //{ // m_nSummonType = 0xFE, // Position = new CMovePath // { // Y = (short)y[i], // X = (short)Constants.Rand.Next(x[0][i], x[1][i]), // }, //}; //Mobs.CreateMob(mob); } execute( new int[] { 9500106, 9500105, 9400622, 9000002, 9000301 }, new int[] { 1967, 1793, 1652, 1619, 1480, 1379 }, new int[][] { new int[] { -374, -88, 207, -12, 94, 125 }, new int[] { 914, 637, 569, 391, 500, 456, } }); makenpc(-345, 1800, 36); } break; } void execute(int[] mobs, int[] y, int[][] x) { while (mobcount > 0) { var level = Constants.Rand.Next(0, y.Length); var spawnY = y[level]; var spawnX_L = x[0][level]; var spawnX_R = x[1][level]; var spawnX = Constants.Rand.Next(spawnX_L, spawnX_R); Mobs.CreateMob(mobs.Random(), null, spawnX, spawnY, 0, 0, 0, 0, MobType.Normal, null); //var mob = new CMob(mobs.Random()) //{ // m_nSummonType = 0xFE, // Position = new CMovePath // { // Y = (short)spawnY, // X = (short)spawnX, // }, //}; //Mobs.CreateMob(mob); mobcount -= 1; } } void makenpc(short x, short y, short fh) { var entry = new CNpc(npc) { Rx0 = x, Rx1 = y, X = x, Y = y, Cy = y, F = true, Foothold = fh }; Npcs.Add(entry); Broadcast(entry.MakeEnterFieldPacket()); } }