Beispiel #1
0
        public unsafe bool Unequip(MsgItemPosition position)
        {
            if (_owner.Inventory.Count == 40)
            {
                return(false);
            }

            if (TryRemove(position, out var item))
            {
                _owner.Inventory.AddOrUpdate(item.UniqueId, item);
                (_owner as Player)?.ForceSend(new MsgItemInformation(item, MsgItemPosition.Inventory), (ushort)sizeof(MsgItemInformation));
                ScreenSystem.Send(_owner, MsgSpawn.Create(_owner as Player));
                EntityLogic.Recalculate(_owner);
            }
            return(true);
        }
Beispiel #2
0
        private static void PhysicalAttack(YiObj attacker, ref MsgInteract packet)
        {
            if (attacker.HasFlag(StatusEffect.Invisibility))
            {
                attacker.RemoveStatusEffect(StatusEffect.Invisibility);
            }
            if (attacker.HasFlag(StatusEffect.SpawnProtection))
            {
                attacker.RemoveStatusEffect(StatusEffect.SpawnProtection);
            }

            if (!GameWorld.Maps[attacker.MapId].Find(packet.TargetUniqueId, out YiObj currentTarget))
            {
                return;
            }

            attacker.CurrentTarget = currentTarget;
            packet.Value           = Physical.PhysicalAttack(attacker, packet.Type);

            attacker.Equipment.RemoveDura(MsgItemPosition.LeftWeapon);
            attacker.Equipment.RemoveDura(MsgItemPosition.RightWeapon);
            attacker.Equipment.RemoveDura(MsgItemPosition.Ring);
            attacker.AddWeaponProf(MsgItemPosition.LeftWeapon, (uint)packet.Value);
            attacker.AddWeaponProf(MsgItemPosition.RightWeapon, (uint)packet.Value);

            if (packet.Type == MsgInteractType.Archer)
            {
                packet.Value = packet.Value / 2;
            }

            if (packet.Value == -1)
            {
                return;
            }

            if (attacker.ActivatePassiveSkill(attacker, ref packet.Value, out var skill) && skill.HasValue)
            {
                attacker.CurrentSkill = skill.Value;
                Magic.ExecuteAttack((Player)attacker, attacker.Location);
                return;
            }

            ScreenSystem.Send(attacker, packet, true);
            currentTarget.GetHit(attacker, packet.Type == MsgInteractType.Archer? packet.Value * 2: packet.Value);
        }
Beispiel #3
0
        public virtual void KilledFrom(YiObject attacker)
        {
            if (HasFlag(StatusEffect.SuperMan) || HasFlag(StatusEffect.Cyclone))
            {
                (attacker as Player)?.Send(MsgInteract.Create(attacker, this, MsgInteractType.Death, 0xFFFF * attacker.XpKills));
            }
            else
            {
                ScreenSystem.Send(this, MsgInteract.Die(attacker, this), true);
            }

            var human = attacker;

            if (human != null)
            {
                human.PkPoints++;
            }
        }
Beispiel #4
0
        private static void PetJump(Player player, ref MsgAction packet)
        {
            var r = Position.GetDirection(player.Location.X, player.Location.Y, (ushort)packet.Param, (ushort)(packet.Param >> 16));
            var x = (ushort)packet.Param;
            var y = (ushort)(packet.Param >> 16);

            if (player.Pet != null)
            {
                player.Pet.Location.X = x;
                player.Pet.Location.Y = y;
                player.Pet.Direction  = r;

                if (!ScreenSystem.SendJump(player, ref packet))
                {
                    ScreenSystem.Send(player, packet, false, true, packet.Size);
                }
                ScreenSystem.Update(player);
            }
        }
Beispiel #5
0
        public static void Handle(Player player, byte[] buffer)
        {
            try
            {
                fixed(byte *p = buffer)
                {
                    var packet = *(MsgWalk *)p;

                    BufferPool.RecycleBuffer(buffer);

                    if (player.UniqueId == packet.UniqueId)
                    {
                        player.CurrentTarget = null;
                        player.RemoveSpawnProtection();
                        player.Direction = (Direction)((byte)packet.Direction % 8);

                        player.Location.X += (ushort)Constants.DeltaX[(sbyte)player.Direction];
                        player.Location.Y += (ushort)Constants.DeltaY[(sbyte)player.Direction];
                        player.Emote       = Emote.Stand;
                        ScreenSystem.Send(player, packet, true, true, packet.Size);
                        ScreenSystem.Update(player);
                        if (TeamSystem.Teams.ContainsKey(player.UniqueId))
                        {
                            TeamSystem.Teams[player.UniqueId].UpdateLeaderPosition(player);
                        }
                    }
                    else if (packet.UniqueId == player.Pet?.UniqueId)
                    {
                        player.Pet.Direction = (Direction)((byte)packet.Direction % 8);

                        player.Pet.Location.X += (ushort)Constants.DeltaX[(sbyte)player.Direction];
                        player.Pet.Location.Y += (ushort)Constants.DeltaY[(sbyte)player.Direction];
                        ScreenSystem.Send(player.Pet, packet, false, true, packet.Size);
                        ScreenSystem.Update(player.Pet);
                    }
                }
            }
            catch (Exception e)
            {
                Output.WriteLine(e);
            }
        }
Beispiel #6
0
Datei: Magic.cs Projekt: Pircs/Yi
        public static void ExecuteAttack(Player player, Vector2 targetLocation)
        {
            if (!CostCovered(player))
            {
                return;
            }
            var targets = GetTargets(player, targetLocation, player.CurrentSkill.Info.Type).ToArray();

            foreach (var kvp in targets)
            {
                switch (MagicTypeHelper.Convert(player.CurrentSkill.Info.Type))
                {
                case UseType.Damage:
                    kvp.Item1.GetHit(player, kvp.Item2);
                    break;

                case UseType.Heal:
                    kvp.Item1.GetHealed(player, kvp.Item2);
                    break;

                case UseType.Buff:
                    //if (!ScriptEngine.Scripts.TryGetValue(ScriptType.SkillUsage, out var script))
                    //    continue;
                    //if (script.Execute(kvp.Item1, player.CurrentSkill))
                    //    kvp.Item1.GetBuffed(player, 0);
                    //else
                    //    Output.WriteLine($"Unknown Skill: {player.CurrentSkill.Id} | Lv: {player.CurrentSkill.Info.Level}");
                    break;

                default:
                    Message.SendTo(player, $"Magic Attack Fail: {player.CurrentSkill.Info.Type} -> {MagicTypeHelper.Convert(player.CurrentSkill.Info.Type)}",
                                   MsgTextType.Talk);
                    break;
                }
            }

            foreach (var packet in MsgMagicEffect.Create(player, targets))
            {
                ScreenSystem.Send(player, packet, true);
            }
        }
Beispiel #7
0
        public unsafe bool Equip(Item item, MsgItemPosition position)
        {
            if (!_owner.Inventory.TryRemove(item.UniqueId, out item))
            {
                return(false);
            }

            if (item.ItemId / 10000 == 105)
            {
                position = MsgItemPosition.LeftWeapon;
            }

            (_owner as Player)?.Send(MsgItem.Create(item.UniqueId, 0, 0, MsgItemType.RemoveInventory));
            if (Unequip(position))
            {
                (_owner as Player)?.ForceSend(new MsgItemInformation(item, position), (ushort)sizeof(MsgItemInformation));
                AddOrUpdate(position, item);
                ScreenSystem.Send(_owner, MsgSpawn.Create(_owner as Player));
                EntityLogic.Recalculate(_owner);
            }
            return(true);
        }
Beispiel #8
0
 public void Countdown(int number) => ScreenSystem.Send(this, LegacyPackets.Effect(this, "downnumber" + number));
Beispiel #9
0
 private static void Mine(YiObj player, ref MsgAction packet)
 {
     player.Mining = true;
     ScreenSystem.Send(player, packet, true);
 }
Beispiel #10
0
        private static void MapShow(Player player, ref MsgAction packet)
        {
            player.ForceSend(MapShowPacket(player), (ushort)sizeof(MsgAction));
            player.ForceSend(MsgStatus.Create(player.MapId, 0), (ushort)sizeof(MsgStatus));

            if (player.Inventory.Items == null)
            {
                player.Inventory = new Inventory(player);
            }
            else
            {
                player.Inventory.SetOwner(player);
            }
            if (player.Equipment.Items == null)
            {
                player.Equipment = new Equipment(player);
            }
            else
            {
                player.Equipment.SetOwner(player);
            }
            foreach (var kvp in player.Equipment)
            {
                player.Send(new MsgItemInformation(kvp.Value, kvp.Key));
            }

            foreach (var kvp in player.Inventory)
            {
                player.Send(new MsgItemInformation(kvp.Value, MsgItemPosition.Inventory));
            }

            foreach (var kvp in player.Profs)
            {
                player.Send(MsgProf.Create(kvp.Value));
            }

            foreach (var kvp in player.Skills)
            {
                player.Send(MsgSkill.Create(kvp.Value));
            }

            EntityLogic.Recalculate(player);

            if (player.Online)
            {
                return;
            }
            player.AddStatusEffect(StatusEffect.Frozen);
            player.CurrentNpcId = 1337;
            player.Send(LegacyPackets.NpcSay("Select Char."));
            player.Send(LegacyPackets.NpcLink("Next", 1));
            player.Send(LegacyPackets.NpcLink("Select", 10));
            player.Send(LegacyPackets.NpcLink("New", 100));
            player.Send(LegacyPackets.NpcFace(10));
            player.Send(LegacyPackets.NpcFinish());

            ScreenSystem.Create(player);
            ScreenSystem.Update(player);

            ScreenSystem.Send(player, Create(player, player.UniqueId, MsgActionType.SpawnEffect), true);
        }
Beispiel #11
0
 public Monster()
 {
     Brain      = new BasicBrain(this);
     DespawnJob = new Job(3000, () => ScreenSystem.Send(this, MsgAction.Create(this, 0, MsgActionType.EntityRemove)));
     RespawnJob = new Job(Collections.Spawns[SpawnId].RespawnDelay * 1000 * 30, Respawn);
 }
Beispiel #12
0
 private static void DoEmote(YiObj player, ref MsgAction packet)
 {
     player.Emote = (Emote)packet.X;
     ScreenSystem.Send(player, packet, true);
 }
Beispiel #13
0
 private static void ChangeDirection(YiObj player, ref MsgAction packet)
 {
     player.Direction = (Direction)packet.Direction;
     ScreenSystem.Send(player, packet, true);
 }
Beispiel #14
0
 public void Destroy()
 {
     ScreenSystem.Send(this, MsgFloorItem.Create(this, MsgFloorItemType.Delete));
     FloorItemSystem.FloorItems.TryRemove(UniqueId);
     GameWorld.Maps[MapId].Leave(this);
 }
Beispiel #15
0
 private static void AddItemToShop(Player player, ref MsgItem packet)
 {
     BoothSystem.Add(player, packet.UnqiueId, packet.Param);
     ScreenSystem.Send(player, packet, true);
 }
Beispiel #16
0
 public void RemoveStatusEffect(StatusEffect flag)
 {
     StatusEffects &= ~flag;
     ScreenSystem.Send(this, MsgUpdate.Create(this, (ulong)StatusEffects, MsgUpdateType.StatusEffect), true);
 }
Beispiel #17
0
 public Monster()
 {
     Brain      = new BasicBrain(this);
     DespawnJob = new Job(3000, () => ScreenSystem.Send(this, MsgAction.Create(this, 0, MsgActionType.EntityRemove)));
 }
Beispiel #18
0
        private static async void Process(Player player, 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 (!await ScriptEngine.ActivateNpc(player, NpcId, (byte)Control, Input))
                {
                    if (GameWorld.Find(NpcId, out Npc npc) && Control == 0)
                    {
                        ConquerActionProcessor.ExecuteAction(npc, player, Control);
                    }
                    //Message.SendTo(player, $"[{player.CurrentNpcId}] Npc has no script.", MsgTextType.Talk);
                }
                break;
            }
            }
        }
Beispiel #19
0
 private static void RemoveItemFromShop(Player player, ref MsgItem packet)
 {
     BoothSystem.Remove(player, packet.UnqiueId);
     ScreenSystem.Send(player, packet, true);
 }