public static void Add(YiObj obj, YiObj target) { if (!Entities.ContainsKey(obj.UniqueId)) { Create(obj); } if (target.UniqueId == obj.UniqueId || Entities[obj.UniqueId].Contains(target.UniqueId)) { return; } Entities[obj.UniqueId].Add(target.UniqueId); Add(target, obj); switch (target) { case Bot botTarget: //(obj as Player)?.Send(MsgSpawn.Create(botTarget)); break; case Player playerTarget: (obj as Player)?.Send(MsgSpawn.Create(playerTarget)); break; case Monster monsterTarget: monsterTarget.Brain.PlayersInSight++; (obj as Player)?.Send(MsgSpawn.Create(monsterTarget)); break; case Npc npcTarget: (obj as Player)?.Send(MsgNpcSpawn.Create(npcTarget)); if (npcTarget.BoothId != 0) { (obj as Player)?.Send(LegacyPackets.SpawnCarpet(npcTarget, npcTarget.BoothId)); } break; case DynamicNpc dynNpcTarget: (obj as Player)?.Send(MsgDynNpcSpawn.Create(dynNpcTarget)); break; case FloorItem floorItemTarget: (obj as Player)?.Send(MsgFloorItem.Create(floorItemTarget, MsgFloorItemType.Create)); break; case Portal portal: break; case null: Debugger.Break(); break; default: Debugger.Break(); break; } }
private static void QueueDrop(FloorItem drop) { YiScheduler.Instance.Do(SchedulerPriority.Medium, () => { for (var i = 0; i < 10; i++) { if (!GameWorld.Maps[drop.MapId].ItemValid(drop.Location.X, drop.Location.Y)) { drop.Location.X += (ushort)YiCore.Random.Next(-1, 2); drop.Location.Y += (ushort)YiCore.Random.Next(-1, 2); } else { AddCountdown(drop); ScheduleDestruction(drop); ScheduleOwnerRemove(drop); ScreenSystem.Create(drop); FloorItems.AddOrUpdate(drop.UniqueId, drop); GameWorld.Maps[drop.MapId].Enter(drop); if (drop.Original != null && drop.Owner is Player player) { var packet = MsgItem.Create(drop.Original.UniqueId, drop.Original.UniqueId, drop.Original.UniqueId, MsgItemType.RemoveInventory); player.Send(packet); } ScreenSystem.Send(drop, MsgFloorItem.Create(drop, MsgFloorItemType.Create), true); drop.AddStatusEffect(StatusEffect.SuperMan); return; } } if (drop.Original != null && drop.Owner is Player owner) { owner.Inventory.AddOrUpdate(drop.Original.UniqueId, drop.Original); owner.Send(new MsgItemInformation(drop.Original, MsgItemPosition.Inventory)); } else { drop.Owner.Money += drop.Amount; } }); }
public void Destroy() { ScreenSystem.Send(this, MsgFloorItem.Create(this, MsgFloorItemType.Delete)); FloorItemSystem.FloorItems.TryRemove(UniqueId); GameWorld.Maps[MapId].Leave(this); }