예제 #1
0
        //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);
        }
예제 #2
0
        /// <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());
            }
        }