private bool HandleGump(Func <Gump> instantiateGump) { var nextGumpNotVisible = false; Gump gump; lock (gumpLock) { gump = instantiateGump(); CurrentGump = gump; if (!showNextAwaitedGump) { currentGumpVisible = false; nextGumpNotVisible = true; showNextAwaitedGump = true; } else { currentGumpVisible = true; } } eventSource.Publish(new GumpReceivedEvent(gump)); gumpReceivedEvent.Set(); if (nextGumpNotVisible) { return(true); } return(false); }
private Packet?FilterServerPackets(Packet rawPacket) { if (rawPacket.Id == PacketDefinitions.OpenDialogBox.Id) { var packet = packetRegistry.Materialize <OpenDialogBoxPacket>(rawPacket); var dialogBox = new DialogBox(packet.DialogId, packet.MenuId, packet.Question, packet.Responses); CurrentDialogBox = dialogBox; bool showDialogBox = ShowDialogBox; bool block = false; lock (blockedQuestionLock) { if (!string.IsNullOrEmpty(blockedQuestion) && dialogBox.Question.IndexOf(blockedQuestion, StringComparison.Ordinal) >= 0) { blockedQuestion = null; block = true; } } eventJournalSource.Publish(new DialogBoxOpenedEvent(dialogBox)); DialogBoxOpened?.Invoke(dialogBox); if (!showDialogBox || block) { return(null); } } return(rawPacket); }
private void HanldeServerTargetCursorPacket(TargetCursorPacket packet) { targetFromServerReceivedEvent.Set(); lastCursorId = packet.CursorId; lastTargetCursorPacketTime = DateTime.UtcNow; eventSource.Publish(new ServerRequestedTargetEvent(packet.CursorId)); }
private Packet?FilterSendGumpMenuDialog(Packet rawPacket) { if (rawPacket.Id == PacketDefinitions.GeneralInformationPacket.Id && rawPacket.Payload[4] == 4) { var packet = new CloseGenericGumpPacket(); packet.Deserialize(rawPacket); eventSource.Publish(new ServerRequestedGumpCloseEvent(packet.GumpTypeId)); } if (rawPacket.Id == PacketDefinitions.SendGumpMenuDialog.Id) { var nextGumpNotVisible = false; lock (gumpLock) { var packet = PacketDefinitionRegistry.Materialize <SendGumpMenuDialogPacket>(rawPacket); var gump = new Gump(packet.GumpId, packet.GumpTypeId, packet.Commands, packet.TextLines); CurrentGump = gump; eventSource.Publish(new GumpReceivedEvent(gump)); if (!showNextAwaitedGump) { currentGumpVisible = false; nextGumpNotVisible = true; showNextAwaitedGump = true; } else { currentGumpVisible = true; } } gumpReceivedEvent.Set(); if (nextGumpNotVisible) { return(null); } } return(rawPacket); }
private void HandleRequestSkills(SkillRequest packet) { if (packet.Skill.HasValue) { eventJournalSource.Publish(new SkillRequestedEvent(packet.Skill.Value)); } }
public ItemsObservers(GameObjectCollection gameObjects, IServerPacketSubject serverPacketSubject, IClientPacketSubject clientPacketSubject, Legacy legacyApi, EventJournalSource eventJournalSource) { this.eventJournal = new EventJournal(eventJournalSource); this.waitForItemDraggedJournal = new EventJournal(eventJournalSource); this.gameObjects = gameObjects; this.gameObjects.MobileLeftView += (sender, mobile) => { eventJournalSource.Publish(new MobileLeftViewEvent(mobile)); }; this.gameObjects.MobileDeleted += (sender, mobile) => { eventJournalSource.Publish(new MobileLeftViewEvent(mobile)); }; this.legacyApi = legacyApi; this.eventJournalSource = eventJournalSource; serverPacketSubject.Subscribe(PacketDefinitions.AddMultipleItemsInContainer, HandleAddMultipleItemsInContainer); serverPacketSubject.Subscribe(PacketDefinitions.AddItemToContainer, HandleAddItemToContainer); serverPacketSubject.Subscribe(PacketDefinitions.DeleteObject, HandleDeleteObjectPacket); serverPacketSubject.Subscribe(PacketDefinitions.ObjectInfo, HandleObjectInfoPacket); serverPacketSubject.Subscribe(PacketDefinitions.SecondAgeObjectInformation7090, HandleSecondAgeObjectInfoPacket); serverPacketSubject.Subscribe(PacketDefinitions.DrawObject, HandleDrawObjectPacket); serverPacketSubject.Subscribe(PacketDefinitions.UpdatePlayer, HandleUpdatePlayerPacket); serverPacketSubject.Subscribe(PacketDefinitions.UpdateCurrentHealth, HandleUpdateCurrentHealthPacket); serverPacketSubject.Subscribe(PacketDefinitions.WornItem, HandleWornItemPacket); serverPacketSubject.Subscribe(PacketDefinitions.RejectMoveItemRequest, HandleRejectMoveItemRequestPacket); serverPacketSubject.Subscribe(PacketDefinitions.DrawContainer, HandleDrawContainer); serverPacketSubject.Subscribe(PacketDefinitions.PauseClient, HandlePauseClient); serverPacketSubject.Subscribe(PacketDefinitions.SendSpeech, HandleSendSpeechPacket); serverPacketSubject.Subscribe(PacketDefinitions.StatusBarInfo, HandleStatusBarInfo); serverPacketSubject.Subscribe(PacketDefinitions.GraphicalEffect, HandleGraphicalEffect); clientPacketSubject.Subscribe(PacketDefinitions.DoubleClick, HandleDoubleClick); serverPacketSubject.RegisterOutputFilter(FilterServerPackets); }
internal Legacy(Configuration configuration, CommandHandler commandHandler, UltimaServer ultimaServer, UltimaClient ultimaClient, ILogger logger) { Trace = new GlobalTrace(logger); cancellation = new Cancellation(() => CancellationToken); eventJournalSource = new EventJournalSource(); Me = new Player(() => GameObjects.OfType <Item>().OnLayer(Layer.Mount).FirstOrDefault() != null, ultimaServer, this, eventJournalSource); gumpObservers = new GumpObservers(ultimaServer, ultimaClient, eventJournalSource, cancellation); GameObjects = new GameObjectCollection(Me); Items = new ItemCollection(GameObjects); Mobiles = new MobileCollection(GameObjects); Corpses = new CorpseCollection(GameObjects); itemsObserver = new ItemsObservers(GameObjects, ultimaServer, ultimaClient, this, eventJournalSource); Me.LocationChanged += itemsObserver.OnPlayerPositionChanged; journalSource = new SpeechJournalSource(); journalSource.NewMessageReceived += (sender, entry) => eventJournalSource.Publish(new SpeechReceivedEvent(entry)); Journal = new SpeechJournal(journalSource, cancellation, () => DefaultTimeout, Trace.JournalTrace); journalObservers = new JournalObservers(journalSource, ultimaServer); targeting = new Targeting(ultimaServer, ultimaClient, cancellation, eventJournalSource); blockedPacketsFilters = new BlockedClientPacketsFilters(ultimaClient); lightObserver = new LightObserver(ultimaServer, ultimaClient, Me, this); weatherObserver = new WeatherObserver(ultimaServer, ultimaClient, this); soundObserver = new SoundObserver(ultimaServer, eventJournalSource); questArrowObserver = new QuestArrowObserver(ultimaServer, eventJournalSource); shapeShifter = new ShapeshiftingFilter(ultimaServer, ultimaClient); var speechRequestObserver = new SpeechRequestObserver(ultimaClient, commandHandler, eventJournalSource, logger); var staminaFilter = new StaminaFilter(ultimaServer, ultimaClient); dialogBoxObervers = new DialogBoxObservers(ultimaServer, eventJournalSource); playerObservers = new PlayerObservers(Me, ultimaClient, ultimaServer, logger, this, GameObjects, eventJournalSource); playerObservers.WalkRequestDequeued += Me.OnWalkRequestDequeued; this.logger = logger; Server = ultimaServer; Client = ultimaClient; CommandHandler = commandHandler; CommandHandler.CancellationTokenCreated += (sender, token) => CancellationToken = token; Configuration = configuration; legacyEventJournal = CreateEventJournal(); ClientFilters = new LegacyFilters(staminaFilter, lightObserver, weatherObserver, soundObserver, shapeShifter); RegisterDefaultCommands(); }
private Packet?FilterServerPackets(Packet rawPacket) { if (rawPacket.Id == PacketDefinitions.OpenDialogBox.Id) { var packet = PacketDefinitionRegistry.Materialize <OpenDialogBoxPacket>(rawPacket); var dialogBox = new DialogBox(packet.DialogId, packet.MenuId, packet.Question, packet.Responses); CurrentDialogBox = dialogBox; eventJournalSource.Publish(new DialogBoxOpenedEvent(dialogBox)); if (!ShowDialogBox) { return(null); } } return(rawPacket); }
private void HandleGraphicalEffect(GraphicalEffectPacket packet) { eventJournalSource.Publish(new GraphicalEffectStartedEvent(packet.DirectionType, packet.CharacterId, packet.TargetId, packet.Type, packet.Location, packet.TargetLocation)); }