コード例 #1
0
        private static void SpawnEntity(Player player, ref MsgAction packet)
        {
            if (!GameWorld.Find(packet.Param, out YiObj found))
            {
                return;
            }
            player.Send(packet);

            switch (found)
            {
            case Monster monster:
                player.Send(MsgSpawn.Create(monster)); break;

            case Player playerFound:
                player.Send(MsgSpawn.Create(playerFound)); break;
            }
        }
コード例 #2
0
ファイル: MsgDialog.cs プロジェクト: Pircs/Yi
        private static void Process(int npcIdoverride = 0)
        {
            if (Control == 255 && Player.Online)
            {
                Player.CurrentNpcId = 0;
            }

            if (Player.CurrentNpcId == 0)
            {
                return;
            }

            var id = Player.CurrentNpcId;

            if (npcIdoverride != 0)
            {
                id = npcIdoverride;
            }

            switch (id)
            {
            case 1337:
            {
                switch (Control)
                {
                case 255:
                    Player.CurrentNpcId = 1337;
                    using (var packet = new NpcDialog(10))
                    {
                        packet

                        .Text("Select Char")
                        .Link("Next", 1)
                        .Link("Select", 10)
                        .Link("New", 100)
                        .Finish();

                        Player.Send(packet);
                    }
                    break;

                case 1:
                    var players = SelectorSystem.GetPlayersFor(Player.AccountId).ToList();

                    var index = players.IndexOf(Player);
                    if (index + 1 > players.Count - 1)
                    {
                        index = 0;
                    }
                    else
                    {
                        index++;
                    }

                    Player = SelectorSystem.SwapCharacter(Player, players[index]);
                    Player.Send(LegacyPackets.CharacterInformation(Player));
                    Player.Send(MsgAction.MapShowPacket(Player));
                    Player.AddStatusEffect(StatusEffect.Frozen);
                    ScreenSystem.Create(Player);
                    ScreenSystem.Update(Player);
                    break;

                case 10:
                    Player.RemoveStatusEffect(StatusEffect.Frozen);
                    ScreenSystem.Create(Player);
                    Player.AddSpawnProtection();
                    Player.IncrementXp();

                    foreach (var kvp in Player.Skills)
                    {
                        Player.Send(MsgSkill.Create(kvp.Value));
                    }
                    foreach (var prof in Player.Profs)
                    {
                        Player.Send(MsgProf.Create(prof.Value));
                    }

                    EntityLogic.Recalculate(Player);
                    Player.CurrentHp = Player.MaximumHp;
                    Player.CurrentMp = Player.MaximumMp;
                    GameWorld.Maps[Player.MapId].Enter(Player);

                    Player.Send(MsgAction.Create(Player, (int)Player.PkMode, MsgActionType.ChangePkMode));
                    Player.Send(MsgUpdate.Create(Player, Player.Stamina, MsgUpdateType.Stamina));
                    Player.Send(MsgUpdate.Create(Player, Player.Class, MsgUpdateType.Class));
                    Player.Online = true;

                    if (Player.HasFlag(StatusEffect.SuperMan))
                    {
                        BuffSystem.Create(Player);
                        BuffSystem.AddBuff(Player, new Buff(Player, SkillId.Superman, TimeSpan.FromSeconds(10)));
                    }
                    if (Player.HasFlag(StatusEffect.Cyclone))
                    {
                        BuffSystem.Create(Player);
                        BuffSystem.AddBuff(Player, new Buff(Player, SkillId.Cyclone, TimeSpan.FromSeconds(10)));
                    }

                    if (Player.PkPoints > 1)
                    {
                        Player.PkPJob = new Job(TimeSpan.FromSeconds(15), () => Player.PkPoints--);
                        YiScheduler.Instance.Do(Player.PkPJob);
                    }
                    ScreenSystem.Send(Player, MsgAction.Create(Player, Player.UniqueId, MsgActionType.EntityRemove));
                    ScreenSystem.Send(Player, MsgSpawn.Create(Player));
                    break;

                case 100:
                    SelectorSystem.CreateNewCharacterFor(Player.AccountId);
                    Player.Disconnect();
                    break;
                }
                break;
            }

            default:
            {
                if (ScriptEngine.Scripts.TryGetValue(ScriptType.NpcDialog, out var sc) && !sc.Execute(Player, id, Control))
                {
                    Message.SendTo(Player, $"[{Player.CurrentNpcId}] Npc has no script.", MsgTextType.Talk);
                }
                break;
            }
            }
        }