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); }
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); }
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++; } }
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); } }
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); } }
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); } }
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); }
public void Countdown(int number) => ScreenSystem.Send(this, LegacyPackets.Effect(this, "downnumber" + number));
private static void Mine(YiObj player, ref MsgAction packet) { player.Mining = true; ScreenSystem.Send(player, packet, true); }
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); }
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); }
private static void DoEmote(YiObj player, ref MsgAction packet) { player.Emote = (Emote)packet.X; ScreenSystem.Send(player, packet, true); }
private static void ChangeDirection(YiObj player, ref MsgAction packet) { player.Direction = (Direction)packet.Direction; ScreenSystem.Send(player, packet, true); }
public void Destroy() { ScreenSystem.Send(this, MsgFloorItem.Create(this, MsgFloorItemType.Delete)); FloorItemSystem.FloorItems.TryRemove(UniqueId); GameWorld.Maps[MapId].Leave(this); }
private static void AddItemToShop(Player player, ref MsgItem packet) { BoothSystem.Add(player, packet.UnqiueId, packet.Param); ScreenSystem.Send(player, packet, true); }
public void RemoveStatusEffect(StatusEffect flag) { StatusEffects &= ~flag; ScreenSystem.Send(this, MsgUpdate.Create(this, (ulong)StatusEffects, MsgUpdateType.StatusEffect), true); }
public Monster() { Brain = new BasicBrain(this); DespawnJob = new Job(3000, () => ScreenSystem.Send(this, MsgAction.Create(this, 0, MsgActionType.EntityRemove))); }
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; } } }
private static void RemoveItemFromShop(Player player, ref MsgItem packet) { BoothSystem.Remove(player, packet.UnqiueId); ScreenSystem.Send(player, packet, true); }