public void Handle(Character talker, Packet iPacket) { if (talker.LastNpc == null) { return; } NpcMessageType lastMessageType = (NpcMessageType)iPacket.ReadByte(); byte action = iPacket.ReadByte(); // TODO: Validate last message type. int selection = -1; byte endTalkByte; switch (lastMessageType) { case NpcMessageType.RequestText: case NpcMessageType.RequestNumber: case NpcMessageType.RequestStyle: case NpcMessageType.Choice: endTalkByte = 0; break; default: endTalkByte = byte.MaxValue; break; } if (action != endTalkByte) { if (iPacket.Remaining >= 4) { selection = iPacket.ReadInt(); } else if (iPacket.Remaining > 0) { selection = iPacket.ReadByte(); } if (lastMessageType == NpcMessageType.RequestStyle) { //selection = this.StyleSelectionHelpers[talker][selection]; } if (selection != -1) { this.Scripts[talker].SetResult(selection); } else { this.Scripts[talker].SetResult(action); } } else { talker.LastNpc = null; } }
public Packet GetDialogPacket(string text, NpcMessageType messageType, params byte[] footer) { Packet oPacket = new Packet(ServerOperationCode.ScriptMessage); oPacket .WriteByte(4) // NOTE: Unknown. .WriteInt(this.MapleID) .WriteByte((byte)messageType) .WriteByte() // NOTE: Speaker. .WriteString(text) .WriteBytes(footer); return(oPacket); }
private void SendDialog(Character talker, string text, NpcMessageType messageType, byte speaker, int speakerNpc, params byte[] footer) { using (Packet outPacket = new Packet(MapleServerOperationCode.NpcTalk)) { outPacket.WriteByte(4); // UNK outPacket.WriteInt(this.MapleID); outPacket.WriteByte((byte)messageType); outPacket.WriteByte(speaker); if (speaker > 3) { outPacket.WriteInt(speakerNpc); } outPacket.WriteString(Npc.Format(text)); outPacket.WriteBytes(footer); talker.Client.Send(outPacket); } }
public void HandleResult(Character talker, Packet inPacket) { NpcMessageType lastMessageType = (NpcMessageType)inPacket.ReadByte(); byte action = inPacket.ReadByte(); int selection = -1; byte endTalkByte; switch (lastMessageType) { case NpcMessageType.RequestText: case NpcMessageType.RequestNumber: case NpcMessageType.RequestStyle: case NpcMessageType.Choice: endTalkByte = 0; break; default: endTalkByte = byte.MaxValue; break; } if (action != endTalkByte) { if (lastMessageType == NpcMessageType.RequestText) { string text = inPacket.ReadString(); foreach (KeyValuePair <Character, NpcTextEventHandler> loopPair in this.TextCallbacks) { if (loopPair.Key == talker) { loopPair.Value(talker, new NpcTextEventArgs(action, selection, text)); break; } } } else { if (inPacket.Remaining >= 4) { selection = inPacket.ReadInt(); } else if (inPacket.Remaining > 0) { selection = inPacket.ReadByte(); } if (lastMessageType == NpcMessageType.RequestStyle) { selection = this.StyleSelectionHelpers[talker][selection]; } foreach (KeyValuePair <Character, NpcEventHandler> loopPair in this.Callbacks) { if (loopPair.Key == talker) { loopPair.Value(talker, new NpcEventArgs(action, selection)); break; } } } } else { talker.LastNpc = null; } }