public override void AoiEntry(VisibleObject obj) { if (Script != null) { Script.ExecuteScriptableFunction("OnEntry", new HybrasylWorldObject(obj)); } }
public override void AoiDeparture(VisibleObject obj) { if (Script != null) { Script.ExecuteScriptableFunction("OnLeave", new HybrasylWorldObject(obj)); } }
public void ShowTo(User invoker, VisibleObject target = null, bool runCheck = true) { // Either we must have an associate already known to us, one must be passed, or we must have a script defined if (Associate == null && target == null && Script == null) { Logger.ErrorFormat("DialogSequence {0} has no known associate or script...?", Name); // Need better error handling here return; } if (PreDisplayCallback != null && runCheck) { var invocation = new ScriptInvocation(); invocation.Function = PreDisplayCallback; invocation.Invoker = invoker; invocation.Associate = target == null ? Associate : target; if (Script != null) invocation.Script = Script; if (invocation.Execute()) Dialogs.First().ShowTo(invoker, target); } else { Dialogs.First().ShowTo(invoker, target); } }
public override void ShowTo(User invoker, VisibleObject invokee) { var dialogPacket = base.GenerateBasePacket(invoker, invokee); if (Options.Count > 0) { dialogPacket.WriteByte((byte)Options.Count); foreach (var option in Options) { dialogPacket.WriteString8(option.OptionText); } invoker.Enqueue(dialogPacket); RunCallback(invoker, invokee); } }
public override void ShowTo(User invoker, VisibleObject invokee) { return; }
public ServerPacket GenerateBasePacket(User invoker, VisibleObject invokee) { byte color = 0; ushort sprite = 0; byte objType = 0; var dialogPacket = new ServerPacket(0x30); dialogPacket.WriteByte((byte)(DialogType)); if (invokee is Creature) { var creature = (Creature) invokee; sprite = (ushort) (0x4000 + creature.Sprite); objType = 1; } else if (invokee is Item) { var item = (Item) invokee; objType = 2; sprite = (ushort)(0x8000 + item.Sprite); color = item.Color; } else if (invokee is Reactor) { objType = 4; } if (DisplaySprite != 0) sprite = DisplaySprite; dialogPacket.WriteByte(objType); dialogPacket.WriteUInt32(invokee.Id); dialogPacket.WriteByte(0); // Unknown value Logger.DebugFormat("Sprite is {0}", sprite); dialogPacket.WriteUInt16(sprite); dialogPacket.WriteByte(color); dialogPacket.WriteByte(0); // Unknown value dialogPacket.WriteUInt16(sprite); dialogPacket.WriteByte(color); Logger.DebugFormat("Dialog group id {0}, index {1}", Sequence.Id, Index); dialogPacket.WriteUInt16((ushort)Sequence.Id); dialogPacket.WriteUInt16((ushort)Index); dialogPacket.WriteBoolean(HasPrevDialog()); dialogPacket.WriteBoolean(HasNextDialog()); dialogPacket.WriteByte(0); dialogPacket.WriteString8(invokee.Name); if (DisplayText != null) { dialogPacket.WriteString16(DisplayText); } return dialogPacket; }
public bool IsInViewport(VisibleObject obj) { return Map.EntityTree.GetObjects(GetViewport()).Contains(obj); }
public void AoiDeparture(VisibleObject obj, int transmitDelay) { Logger.DebugFormat("Removing item with ID {0}", obj.Id); var removePacket = new ServerPacket(0x0E); removePacket.TransmitDelay = transmitDelay; removePacket.WriteUInt32(obj.Id); Enqueue(removePacket); }
public override void ShowTo(VisibleObject obj) { if (obj is User) { var user = obj as User; SendUpdateToUser(user.Client); } else if (obj is Item) { var item = obj as Item; SendVisibleItem(item); } }
public override void ShowTo(VisibleObject obj) { if (obj is User) { var user = obj as User; user.SendDoorUpdate(X, Y, Closed, IsLeftRight); } }
public virtual void AoiDeparture(VisibleObject obj) { }
public virtual void AoiEntry(VisibleObject obj) { }
public override void ShowTo(VisibleObject obj) { if (obj is User) { var user = obj as User; user.SendVisibleItem(this); } }
public void RunCallback(User target, VisibleObject associate) { ActiveDialog.RunCallback(target, associate); }
public virtual void ShowTo(VisibleObject obj) { }
public virtual void HideFrom(VisibleObject obj) { }
public override void ShowTo(VisibleObject obj) { if (obj is User) { var user = obj as User; var npcPacket = new ServerPacket(0x07); npcPacket.WriteUInt16(0x01); // Number of mobs in this packet npcPacket.WriteUInt16(X); npcPacket.WriteUInt16(Y); npcPacket.WriteUInt32(Id); npcPacket.WriteUInt16((ushort)(Sprite + 0x4000)); npcPacket.WriteByte(0); npcPacket.WriteByte(0); npcPacket.WriteByte(0); npcPacket.WriteByte(0); npcPacket.WriteByte((byte)Direction); npcPacket.WriteByte(0); npcPacket.WriteByte(2); // Dot color. 0 = monster, 1 = nonsolid monster, 2=NPC npcPacket.WriteString8(Name); user.Enqueue(npcPacket); } }
public virtual int Distance(VisibleObject obj) { return(Point.Distance(obj.X, obj.Y, X, Y)); }
public override void AoiDeparture(VisibleObject obj) { Logger.DebugFormat("Removing item with ID {0}", obj.Id); var removePacket = new ServerPacket(0x0E); removePacket.WriteUInt32(obj.Id); Enqueue(removePacket); }
public void Insert(VisibleObject obj, byte x, byte y, bool updateClient = true) { if (Objects.Add(obj)) { obj.Map = this; obj.X = x; obj.Y = y; EntityTree.Add(obj); var user = obj as User; if (user != null) { if (updateClient) { obj.SendMapInfo(); obj.SendLocation(); } Users.Add(user.Name, user); } var value = obj as Objects.Reactor; if (value != null) { Reactors.Add(new Tuple<byte, byte>((byte)x,(byte)y), value); } var affectedObjects = EntityTree.GetObjects(obj.GetViewport()); foreach (var target in affectedObjects) { target.AoiEntry(obj); obj.AoiEntry(target); } } }
public override void AoiEntry(VisibleObject obj) { Logger.DebugFormat("Showing {0} to {1}", Name, obj.Name); obj.ShowTo(this); }
public void Remove(VisibleObject obj) { if (Objects.Remove(obj)) { EntityTree.Remove(obj); if (obj is User) { var user = obj as User; Users.Remove(user.Name); if (user.ActiveExchange != null) user.ActiveExchange.CancelExchange(user); } var affectedObjects = EntityTree.GetObjects(obj.GetViewport()); foreach (var target in affectedObjects) { // If the target of a Remove is a player, we insert a 250ms delay to allow the animation // frame to complete. if (target is User) ((User)target).AoiDeparture(obj, 250); else target.AoiDeparture(obj); obj.AoiDeparture(target); } obj.Map = null; obj.X = 0; obj.Y = 0; } }
public void RunCallback(User target, VisibleObject associateOverride = null) { if (CallbackFunction != null) { VisibleObject associate = associateOverride == null ? Sequence.Associate as VisibleObject : associateOverride; var invocation = new ScriptInvocation(); invocation.Invoker = target; invocation.Associate = associate; invocation.Function = CallbackFunction; associate.Script.ExecuteFunction(invocation); } }
public void NotifyNearbyAoiEntry(VisibleObject objectToAdd) { foreach (var obj in EntityTree.GetObjects(objectToAdd.GetViewport())) { if (obj is User) { Logger.DebugFormat("Notifying {0} of item {1} at {2},{3} with sprite {4}", obj.Name, objectToAdd.Name, objectToAdd.X, objectToAdd.Y, objectToAdd.Sprite); var user = obj as User; user.AoiEntry(objectToAdd); } } }
public virtual void ShowTo(User invoker, VisibleObject invokee) { }
public void NotifyNearbyAoiDeparture(VisibleObject objectToRemove) { foreach (var obj in EntityTree.GetObjects(objectToRemove.GetViewport())) { if (obj is User) { var user = obj as User; user.AoiDeparture(objectToRemove); } } }
public override void ShowTo(User invoker, VisibleObject invokee) { var dialogPacket = base.GenerateBasePacket(invoker, invokee); invoker.Enqueue(dialogPacket); RunCallback(invoker, invokee); }
public static int Distance(VisibleObject obj1, VisibleObject obj2) { return Distance(obj1.X, obj1.Y, obj2.X, obj2.Y); }
public override void ShowTo(User invoker, VisibleObject invokee) { Logger.DebugFormat("active for input dialog: {0}, {1}, {2}", TopCaption, InputLength, BottomCaption); var dialogPacket = base.GenerateBasePacket(invoker, invokee); dialogPacket.WriteString8(TopCaption); dialogPacket.WriteByte((byte)InputLength); dialogPacket.WriteString8(BottomCaption); invoker.Enqueue(dialogPacket); RunCallback(invoker, invokee); }
public static int Distance(VisibleObject obj, int x, int y) { return Distance(obj.X, obj.Y, x, y); }
/// <summary> /// Start a dialog sequence. The player must not already be in a dialog or in /// any other state. /// </summary> /// <param name="target"></param> /// <param name="dialogStart"></param> /// <returns></returns> public bool StartDialog(VisibleObject target, DialogSequence dialogStart) { if (dialogStart.Id == null) { Logger.ErrorFormat("Can't start a dialog with a null dialog ID: {0}", dialogStart.Name); return false; } if (!InDialog) { Associate = target; ActiveDialogSequence = dialogStart; ActiveDialog = dialogStart.Dialogs.First(); return true; } return false; }
public override void AoiEntry(VisibleObject obj) { ShowTo(obj); }
/// <summary> /// Set the index of a current dialog session. This dialog should be either the previous or next dialog /// from the last one (index wise) and the player must be in a dialog. /// </summary> /// /// <param name="target">The target merchant.</param> /// <param name="pursuitId">A dialog sequence (pursuit) ID.</param> /// <param name="newIndex">The index to which we are navigating.</param> /// <returns></returns> public bool SetDialogIndex(VisibleObject target, int pursuitId, int newIndex) { // Sanity checking if (target != Associate || pursuitId != CurrentPursuitId || target.Map.Id != User.Map.Id || !InDialog) { Logger.DebugFormat("{0}: Failed check", User.Name); return false; } if (newIndex == (ActiveDialog.Index + 1) && newIndex != ActiveDialogSequence.Dialogs.Count() && newIndex < (ActiveDialogSequence.Dialogs.Count())) { // Next Logger.DebugFormat("Advancing one dialog"); ActiveDialog = ActiveDialogSequence.Dialogs[ActiveDialog.Index + 1]; Logger.DebugFormat("Active dialog is type {0}", ActiveDialog.GetType()); return true; } else if (newIndex == (ActiveDialog.Index - 1) && newIndex >= 0) { // Previous Logger.DebugFormat("Rewinding one dialog"); ActiveDialog = ActiveDialogSequence.Dialogs[ActiveDialog.Index - 1]; return true; } return false; }