Cleanup/Housekeeping (#242)
This commit is contained in:
parent
90ede0659f
commit
741e8d8300
228 changed files with 6292 additions and 2690 deletions
|
|
@ -1,23 +1,3 @@
|
|||
/***************************************************************************
|
||||
* EncodedPacketHandler.cs
|
||||
* -------------------
|
||||
* begin : May 1, 2002
|
||||
* copyright : (C) The RunUO Software Team
|
||||
* email : info@runuo.com
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
namespace Server.Network
|
||||
{
|
||||
public delegate void OnEncodedPacketReceive(NetState state, IEntity ent, EncodedReader pvSrc);
|
||||
|
|
|
|||
|
|
@ -1,23 +1,3 @@
|
|||
/***************************************************************************
|
||||
* EncodedReader.cs
|
||||
* -------------------
|
||||
* begin : May 1, 2002
|
||||
* copyright : (C) The RunUO Software Team
|
||||
* email : info@runuo.com
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
namespace Server.Network
|
||||
{
|
||||
public ref struct EncodedReader
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*************************************************************************
|
||||
* ModernUO *
|
||||
* Copyright (C) 2019-2020 - ModernUO Development Team *
|
||||
* Copyright 2019-2020 - ModernUO Development Team *
|
||||
* Email: hi@modernuo.com *
|
||||
* File: MessagePumpService.cs *
|
||||
* *
|
||||
|
|
|
|||
|
|
@ -1,23 +1,3 @@
|
|||
/***************************************************************************
|
||||
* NetState.cs
|
||||
* -------------------
|
||||
* begin : May 1, 2002
|
||||
* copyright : (C) The RunUO Software Team
|
||||
* email : info@runuo.com
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
|
|
|
|||
|
|
@ -1,23 +1,3 @@
|
|||
/***************************************************************************
|
||||
* Compression.cs
|
||||
* -------------------
|
||||
* begin : May 1, 2002
|
||||
* copyright : (C) The RunUO Software Team
|
||||
* email : info@runuo.com
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
using System;
|
||||
|
||||
namespace Server.Network
|
||||
|
|
@ -84,15 +64,32 @@ namespace Server.Network
|
|||
ReadOnlySpan<byte> input, int offset, int count, Span<byte> output, out int length
|
||||
)
|
||||
{
|
||||
if (input == null) throw new ArgumentNullException(nameof(input));
|
||||
if (input == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(input));
|
||||
}
|
||||
|
||||
if (offset < 0 || offset >= input.Length) throw new ArgumentOutOfRangeException(nameof(offset));
|
||||
if (count < 0 || count > input.Length) throw new ArgumentOutOfRangeException(nameof(count));
|
||||
if (input.Length - offset < count) throw new ArgumentOutOfRangeException(nameof(offset));
|
||||
if (offset < 0 || offset >= input.Length)
|
||||
{
|
||||
throw new ArgumentOutOfRangeException(nameof(offset));
|
||||
}
|
||||
|
||||
if (count < 0 || count > input.Length)
|
||||
{
|
||||
throw new ArgumentOutOfRangeException(nameof(count));
|
||||
}
|
||||
|
||||
if (input.Length - offset < count)
|
||||
{
|
||||
throw new ArgumentOutOfRangeException(nameof(offset));
|
||||
}
|
||||
|
||||
length = 0;
|
||||
|
||||
if (count > DefiniteOverflow) return;
|
||||
if (count > DefiniteOverflow)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var bitCount = 0;
|
||||
var bitValue = 0;
|
||||
|
|
|
|||
|
|
@ -1,23 +1,3 @@
|
|||
/***************************************************************************
|
||||
* Packet.cs
|
||||
* -------------------
|
||||
* begin : August 2, 2019
|
||||
* copyright : (C) The RunUO Software Team
|
||||
* email : info@runuo.com
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Buffers;
|
||||
using System.Diagnostics;
|
||||
|
|
@ -112,16 +92,22 @@ namespace Server.Network
|
|||
Core.Set(); // Is this still needed if this is done async?
|
||||
|
||||
if ((m_State & (State.Acquired | State.Static)) == 0)
|
||||
{
|
||||
Free();
|
||||
}
|
||||
}
|
||||
|
||||
private void Free()
|
||||
{
|
||||
if (m_CompiledBuffer == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if ((m_State & State.Buffered) != 0)
|
||||
{
|
||||
ArrayPool<byte>.Shared.Return(m_CompiledBuffer);
|
||||
}
|
||||
|
||||
m_State &= ~(State.Static | State.Acquired | State.Buffered);
|
||||
|
||||
|
|
@ -131,7 +117,9 @@ namespace Server.Network
|
|||
public void Release()
|
||||
{
|
||||
if ((m_State & State.Acquired) != 0)
|
||||
{
|
||||
Free();
|
||||
}
|
||||
}
|
||||
|
||||
public byte[] Compile(bool compress, out int length)
|
||||
|
|
|
|||
|
|
@ -1,23 +1,3 @@
|
|||
/***************************************************************************
|
||||
* PacketHandler.cs
|
||||
* -------------------
|
||||
* begin : May 1, 2002
|
||||
* copyright : (C) The RunUO Software Team
|
||||
* email : info@runuo.com
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
using System;
|
||||
|
||||
namespace Server.Network
|
||||
|
|
|
|||
|
|
@ -1,23 +1,3 @@
|
|||
/***************************************************************************
|
||||
* PacketHandlers.cs
|
||||
* -------------------
|
||||
* begin : May 1, 2002
|
||||
* copyright : (C) The RunUO Software Team
|
||||
* email : info@runuo.com
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Buffers;
|
||||
using System.Collections.Generic;
|
||||
|
|
@ -209,15 +189,21 @@ namespace Server.Network
|
|||
public static void RegisterExtended(int packetID, bool ingame, OnPacketReceive onReceive)
|
||||
{
|
||||
if (packetID >= 0 && packetID < 0x100)
|
||||
{
|
||||
m_ExtendedHandlersLow[packetID] = new PacketHandler(packetID, 0, ingame, onReceive);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_ExtendedHandlersHigh[packetID] = new PacketHandler(packetID, 0, ingame, onReceive);
|
||||
}
|
||||
}
|
||||
|
||||
public static PacketHandler GetExtendedHandler(int packetID)
|
||||
{
|
||||
if (packetID >= 0 && packetID < 0x100)
|
||||
{
|
||||
return m_ExtendedHandlersLow[packetID];
|
||||
}
|
||||
|
||||
m_ExtendedHandlersHigh.TryGetValue(packetID, out var handler);
|
||||
return handler;
|
||||
|
|
@ -226,23 +212,33 @@ namespace Server.Network
|
|||
public static void RemoveExtendedHandler(int packetID)
|
||||
{
|
||||
if (packetID >= 0 && packetID < 0x100)
|
||||
{
|
||||
m_ExtendedHandlersLow[packetID] = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_ExtendedHandlersHigh.Remove(packetID);
|
||||
}
|
||||
}
|
||||
|
||||
public static void RegisterEncoded(int packetID, bool ingame, OnEncodedPacketReceive onReceive)
|
||||
{
|
||||
if (packetID >= 0 && packetID < 0x100)
|
||||
{
|
||||
m_EncodedHandlersLow[packetID] = new EncodedPacketHandler(packetID, ingame, onReceive);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_EncodedHandlersHigh[packetID] = new EncodedPacketHandler(packetID, ingame, onReceive);
|
||||
}
|
||||
}
|
||||
|
||||
public static EncodedPacketHandler GetEncodedHandler(int packetID)
|
||||
{
|
||||
if (packetID >= 0 && packetID < 0x100)
|
||||
{
|
||||
return m_EncodedHandlersLow[packetID];
|
||||
}
|
||||
|
||||
m_EncodedHandlersHigh.TryGetValue(packetID, out var handler);
|
||||
return handler;
|
||||
|
|
@ -251,9 +247,13 @@ namespace Server.Network
|
|||
public static void RemoveEncodedHandler(int packetID)
|
||||
{
|
||||
if (packetID >= 0 && packetID < 0x100)
|
||||
{
|
||||
m_EncodedHandlersLow[packetID] = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_EncodedHandlersHigh.Remove(packetID);
|
||||
}
|
||||
}
|
||||
|
||||
public static void RegisterThrottler(int packetID, ThrottlePacketCallback t)
|
||||
|
|
@ -261,12 +261,16 @@ namespace Server.Network
|
|||
var ph = GetHandler(packetID);
|
||||
|
||||
if (ph != null)
|
||||
{
|
||||
ph.ThrottleCallback = t;
|
||||
}
|
||||
|
||||
ph = Get6017Handler(packetID);
|
||||
|
||||
if (ph != null)
|
||||
{
|
||||
ph.ThrottleCallback = t;
|
||||
}
|
||||
}
|
||||
|
||||
public static int ProcessPacket(IMessagePumpService pump, NetState ns, in ReadOnlySequence<byte> seq)
|
||||
|
|
@ -332,7 +336,9 @@ namespace Server.Network
|
|||
}
|
||||
|
||||
if (r.Length < packetLength)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (handler.Ingame && ns.Mobile?.Deleted != false)
|
||||
{
|
||||
|
|
@ -348,7 +354,9 @@ namespace Server.Network
|
|||
var throttled = handler.ThrottleCallback?.Invoke(ns) ?? TimeSpan.Zero;
|
||||
|
||||
if (throttled > TimeSpan.Zero)
|
||||
{
|
||||
ns.ThrottledUntil = DateTime.UtcNow + throttled;
|
||||
}
|
||||
|
||||
var packet = seq.Slice(r.Position);
|
||||
var length = (int)packet.Length;
|
||||
|
|
@ -424,7 +432,9 @@ namespace Server.Network
|
|||
var targ = World.FindMobile(pvSrc.ReadUInt32());
|
||||
|
||||
if (targ != null)
|
||||
EventSink.InvokeRenameRequest(from, targ, pvSrc.ReadStringSafe());
|
||||
{
|
||||
EventSink.InvokeRenameRequest(@from, targ, pvSrc.ReadStringSafe());
|
||||
}
|
||||
}
|
||||
|
||||
public static void ChatRequest(NetState state, PacketReader pvSrc)
|
||||
|
|
@ -442,7 +452,9 @@ namespace Server.Network
|
|||
|
||||
if (World.FindItem(serial) is SecureTradeContainer cont && cont.Trade != null &&
|
||||
(cont.Trade.From.Mobile == state.Mobile || cont.Trade.To.Mobile == state.Mobile))
|
||||
{
|
||||
cont.Trade.Cancel();
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
|
@ -507,7 +519,10 @@ namespace Server.Network
|
|||
var vendor = World.FindMobile(pvSrc.ReadUInt32());
|
||||
var flag = pvSrc.ReadByte();
|
||||
|
||||
if (vendor == null) return;
|
||||
if (vendor == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (vendor.Deleted || !Utility.RangeCheck(vendor.Location, state.Mobile.Location, 10))
|
||||
{
|
||||
|
|
@ -520,7 +535,9 @@ namespace Server.Network
|
|||
var msgSize = (int)pvSrc.Remaining;
|
||||
|
||||
if (msgSize / 7 > 100)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var buyList = new List<BuyItemResponse>(msgSize / 7);
|
||||
while (msgSize > 0)
|
||||
|
|
@ -534,7 +551,9 @@ namespace Server.Network
|
|||
}
|
||||
|
||||
if (buyList.Count > 0 && vendor is IVendor v && v.OnBuyItems(state.Mobile, buyList))
|
||||
{
|
||||
state.Send(new EndVendorBuy(vendor));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -547,7 +566,10 @@ namespace Server.Network
|
|||
Serial serial = pvSrc.ReadUInt32();
|
||||
var vendor = World.FindMobile(serial);
|
||||
|
||||
if (vendor == null) return;
|
||||
if (vendor == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (vendor.Deleted || !Utility.RangeCheck(vendor.Location, state.Mobile.Location, 10))
|
||||
{
|
||||
|
|
@ -558,7 +580,9 @@ namespace Server.Network
|
|||
int count = pvSrc.ReadUInt16();
|
||||
|
||||
if (count >= 100 || pvSrc.Remaining != count * 6)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var sellList = new List<SellItemResponse>(count);
|
||||
|
||||
|
|
@ -568,11 +592,15 @@ namespace Server.Network
|
|||
int amount = pvSrc.ReadInt16();
|
||||
|
||||
if (item != null && amount > 0)
|
||||
{
|
||||
sellList.Add(new SellItemResponse(item, amount));
|
||||
}
|
||||
}
|
||||
|
||||
if (sellList.Count > 0 && vendor is IVendor v && v.OnSellItems(state.Mobile, sellList))
|
||||
{
|
||||
state.Send(new EndVendorSell(vendor));
|
||||
}
|
||||
}
|
||||
|
||||
public static void DeleteCharacter(NetState state, PacketReader pvSrc)
|
||||
|
|
@ -602,14 +630,18 @@ namespace Server.Network
|
|||
|
||||
if (item != null && from.Map == item.Map && Utility.InUpdateRange(item.GetWorldLocation(), from.Location) &&
|
||||
from.CanSee(item))
|
||||
item.OnHelpRequest(from);
|
||||
{
|
||||
item.OnHelpRequest(@from);
|
||||
}
|
||||
}
|
||||
else if (serial.IsMobile)
|
||||
{
|
||||
var m = World.FindMobile(serial);
|
||||
|
||||
if (m != null && from.Map == m.Map && Utility.InUpdateRange(m.Location, from.Location) && from.CanSee(m))
|
||||
{
|
||||
m.OnHelpRequest(m);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -618,7 +650,9 @@ namespace Server.Network
|
|||
var m = World.FindMobile(pvSrc.ReadUInt32());
|
||||
|
||||
if (m != null && Utility.InUpdateRange(state.Mobile, m) && state.Mobile.CanSee(m))
|
||||
{
|
||||
state.Send(new MobileName(m));
|
||||
}
|
||||
}
|
||||
|
||||
public static void RequestScrollWindow(NetState state, PacketReader pvSrc)
|
||||
|
|
@ -633,7 +667,9 @@ namespace Server.Network
|
|||
var m = World.FindMobile(pvSrc.ReadUInt32());
|
||||
|
||||
if (m != null)
|
||||
from.Attack(m);
|
||||
{
|
||||
@from.Attack(m);
|
||||
}
|
||||
}
|
||||
|
||||
public static void HuePickerResponse(NetState state, PacketReader pvSrc)
|
||||
|
|
@ -645,6 +681,7 @@ namespace Server.Network
|
|||
hue = Utility.ClipDyedHue(hue);
|
||||
|
||||
foreach (var huePicker in state.HuePickers)
|
||||
{
|
||||
if (huePicker.Serial == serial)
|
||||
{
|
||||
state.RemoveHuePicker(huePicker);
|
||||
|
|
@ -653,6 +690,7 @@ namespace Server.Network
|
|||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void SystemInfo(NetState state, PacketReader pvSrc)
|
||||
|
|
@ -693,7 +731,9 @@ namespace Server.Network
|
|||
case 0x24: // Use skill
|
||||
{
|
||||
if (!int.TryParse(command.Split(' ')[0], out var skillIndex))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
Skills.UseSkill(m, skillIndex);
|
||||
|
||||
|
|
@ -702,7 +742,9 @@ namespace Server.Network
|
|||
case 0x43: // Open spellbook
|
||||
{
|
||||
if (!int.TryParse(command, out var booktype))
|
||||
{
|
||||
booktype = 1;
|
||||
}
|
||||
|
||||
EventSink.InvokeOpenSpellbookRequest(m, booktype);
|
||||
|
||||
|
|
@ -772,7 +814,9 @@ namespace Server.Network
|
|||
var text = pvSrc.ReadStringSafe();
|
||||
|
||||
if (text.Length > 128)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var from = state.Mobile;
|
||||
var p = from.Prompt;
|
||||
|
|
@ -782,9 +826,13 @@ namespace Server.Network
|
|||
from.Prompt = null;
|
||||
|
||||
if (type == 0)
|
||||
p.OnCancel(from);
|
||||
{
|
||||
p.OnCancel(@from);
|
||||
}
|
||||
else
|
||||
p.OnResponse(from, text);
|
||||
{
|
||||
p.OnResponse(@from, text);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -797,7 +845,9 @@ namespace Server.Network
|
|||
var text = pvSrc.ReadUnicodeStringLESafe();
|
||||
|
||||
if (text.Length > 128)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var from = state.Mobile;
|
||||
var p = from.Prompt;
|
||||
|
|
@ -807,9 +857,13 @@ namespace Server.Network
|
|||
from.Prompt = null;
|
||||
|
||||
if (type == 0)
|
||||
p.OnCancel(from);
|
||||
{
|
||||
p.OnCancel(@from);
|
||||
}
|
||||
else
|
||||
p.OnResponse(from, text);
|
||||
{
|
||||
p.OnResponse(@from, text);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -824,17 +878,23 @@ namespace Server.Network
|
|||
index -= 1; // convert from 1-based to 0-based
|
||||
|
||||
foreach (var menu in state.Menus)
|
||||
{
|
||||
if (menu.Serial == serial)
|
||||
{
|
||||
state.RemoveMenu(menu);
|
||||
|
||||
if (index >= 0 && index < menu.EntryLength)
|
||||
{
|
||||
menu.OnResponse(state, index);
|
||||
}
|
||||
else
|
||||
{
|
||||
menu.OnCancel(state);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void ProfileReq(NetState state, PacketReader pvSrc)
|
||||
|
|
@ -845,7 +905,10 @@ namespace Server.Network
|
|||
var beholder = state.Mobile;
|
||||
var beheld = World.FindMobile(serial);
|
||||
|
||||
if (beheld == null) return;
|
||||
if (beheld == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
switch (type)
|
||||
{
|
||||
|
|
@ -861,7 +924,9 @@ namespace Server.Network
|
|||
int length = pvSrc.ReadUInt16();
|
||||
|
||||
if (length > 511)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var text = pvSrc.ReadUnicodeString(length);
|
||||
|
||||
|
|
@ -895,13 +960,18 @@ namespace Server.Network
|
|||
|
||||
from.Holding = null;
|
||||
|
||||
if (!valid) return;
|
||||
if (!valid)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
pvSrc.Seek(5, SeekOrigin.Current);
|
||||
var to = World.FindMobile(pvSrc.ReadUInt32()) ?? from;
|
||||
|
||||
if (!to.AllowEquipFrom(from) || !to.EquipItem(item))
|
||||
item.Bounce(from);
|
||||
{
|
||||
item.Bounce(@from);
|
||||
}
|
||||
|
||||
item.ClearBounce();
|
||||
}
|
||||
|
|
@ -1012,13 +1082,18 @@ namespace Server.Network
|
|||
int graphic = pvSrc.ReadUInt16();
|
||||
|
||||
if (targetID == unchecked((int)0xDEADBEEF))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var from = state.Mobile;
|
||||
|
||||
var t = from.Target;
|
||||
|
||||
if (t == null) return;
|
||||
if (t == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var prof = TargetProfile.Acquire(t.GetType());
|
||||
prof?.Start();
|
||||
|
|
@ -1062,12 +1137,19 @@ namespace Server.Network
|
|||
if (state.HighSeas)
|
||||
{
|
||||
var id = TileData.ItemTable[graphic & TileData.MaxItemValue];
|
||||
if (id.Surface) z -= id.Height;
|
||||
if (id.Surface)
|
||||
{
|
||||
z -= id.Height;
|
||||
}
|
||||
}
|
||||
|
||||
for (var i = 0; !valid && i < tiles.Length; ++i)
|
||||
{
|
||||
if (tiles[i].Z == z && tiles[i].ID == graphic)
|
||||
{
|
||||
valid = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!valid)
|
||||
{
|
||||
|
|
@ -1113,10 +1195,14 @@ namespace Server.Network
|
|||
foreach (var gump in state.Gumps)
|
||||
{
|
||||
if (gump.Serial != serial || gump.TypeID != typeID)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var buttonExists = buttonID == 0; // 0 is always 'close'
|
||||
|
||||
if (!buttonExists)
|
||||
{
|
||||
foreach (var e in gump.Entries)
|
||||
{
|
||||
if (e is GumpButton button && button.ButtonID == buttonID)
|
||||
|
|
@ -1131,6 +1217,7 @@ namespace Server.Network
|
|||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!buttonExists)
|
||||
{
|
||||
|
|
@ -1151,7 +1238,9 @@ namespace Server.Network
|
|||
var switches = new int[switchCount];
|
||||
|
||||
for (var j = 0; j < switches.Length; ++j)
|
||||
{
|
||||
switches[j] = pvSrc.ReadInt32();
|
||||
}
|
||||
|
||||
var textCount = pvSrc.ReadInt32();
|
||||
|
||||
|
|
@ -1203,14 +1292,18 @@ namespace Server.Network
|
|||
var beheld = World.FindMobile(pvSrc.ReadUInt32());
|
||||
|
||||
if (beheld != null)
|
||||
{
|
||||
EventSink.InvokeVirtueGumpRequest(state.Mobile, beheld);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var beheld = World.FindMobile(serial);
|
||||
|
||||
if (beheld != null)
|
||||
{
|
||||
EventSink.InvokeVirtueItemRequest(state.Mobile, beheld, buttonID);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1225,9 +1318,13 @@ namespace Server.Network
|
|||
var m = state.Mobile;
|
||||
|
||||
if (state.StygianAbyss)
|
||||
{
|
||||
state.Send(new MobileUpdate(m));
|
||||
}
|
||||
else
|
||||
{
|
||||
state.Send(new MobileUpdateOld(m));
|
||||
}
|
||||
|
||||
state.Send(MobileIncoming.Create(state, m, m));
|
||||
|
||||
|
|
@ -1248,10 +1345,14 @@ namespace Server.Network
|
|||
var text = pvSrc.ReadStringSafe().Trim();
|
||||
|
||||
if (text.Length <= 0 || text.Length > 128)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (!Enum.IsDefined(typeof(MessageType), type))
|
||||
{
|
||||
type = MessageType.Regular;
|
||||
}
|
||||
|
||||
from.DoSpeech(text, m_EmptyInts, type, Utility.ClipDyedHue(hue));
|
||||
}
|
||||
|
|
@ -1276,7 +1377,9 @@ namespace Server.Network
|
|||
var hold = value & 0xF;
|
||||
|
||||
if (count < 0 || count > 50)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var keyList = m_KeywordList;
|
||||
|
||||
|
|
@ -1299,7 +1402,9 @@ namespace Server.Network
|
|||
}
|
||||
|
||||
if (!keyList.Contains(speechID))
|
||||
{
|
||||
keyList.Add(speechID);
|
||||
}
|
||||
}
|
||||
|
||||
text = pvSrc.ReadUTF8StringSafe();
|
||||
|
|
@ -1316,12 +1421,16 @@ namespace Server.Network
|
|||
text = text.Trim();
|
||||
|
||||
if (text.Length <= 0 || text.Length > 128)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
type &= ~MessageType.Encoded;
|
||||
|
||||
if (!Enum.IsDefined(typeof(MessageType), type))
|
||||
{
|
||||
type = MessageType.Regular;
|
||||
}
|
||||
|
||||
from.Language = lang;
|
||||
from.DoSpeech(text, keywords, type, Utility.ClipDyedHue(hue));
|
||||
|
|
@ -1348,14 +1457,18 @@ namespace Server.Network
|
|||
var m = World.FindMobile(s);
|
||||
|
||||
if (m?.Deleted == false)
|
||||
from.Use(m);
|
||||
{
|
||||
@from.Use(m);
|
||||
}
|
||||
}
|
||||
else if (s.IsItem)
|
||||
{
|
||||
var item = World.FindItem(s);
|
||||
|
||||
if (item?.Deleted == false)
|
||||
from.Use(item);
|
||||
{
|
||||
@from.Use(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1386,7 +1499,9 @@ namespace Server.Network
|
|||
else
|
||||
{
|
||||
if (from.Region.OnSingleClick(from, m))
|
||||
m.OnSingleClick(from);
|
||||
{
|
||||
m.OnSingleClick(@from);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1404,7 +1519,9 @@ namespace Server.Network
|
|||
else if (from.Region.OnSingleClick(from, item))
|
||||
{
|
||||
if (item.Parent is Item parentItem)
|
||||
parentItem.OnSingleClickContained(from, item);
|
||||
{
|
||||
parentItem.OnSingleClickContained(@from, item);
|
||||
}
|
||||
|
||||
item.OnSingleClick(from);
|
||||
}
|
||||
|
|
@ -1442,7 +1559,9 @@ namespace Server.Network
|
|||
++seq;
|
||||
|
||||
if (seq == 256)
|
||||
{
|
||||
seq = 1;
|
||||
}
|
||||
|
||||
state.Sequence = seq;
|
||||
}
|
||||
|
|
@ -1456,10 +1575,14 @@ namespace Server.Network
|
|||
var ok = false;
|
||||
|
||||
for (var i = 0; !ok && i < ValidAnimations.Length; ++i)
|
||||
{
|
||||
ok = action == ValidAnimations[i];
|
||||
}
|
||||
|
||||
if (from != null && ok && from.Alive && from.Body.IsHuman && !from.Mounted)
|
||||
from.Animate(action, 7, 1, true, false, 0);
|
||||
{
|
||||
@from.Animate(action, 7, 1, true, false, 0);
|
||||
}
|
||||
}
|
||||
|
||||
public static void QuestArrow(NetState state, PacketReader pvSrc)
|
||||
|
|
@ -1485,11 +1608,14 @@ namespace Server.Network
|
|||
if (ph.Ingame && state.Mobile?.Deleted != false)
|
||||
{
|
||||
if (state.Mobile == null)
|
||||
{
|
||||
Console.WriteLine(
|
||||
"Client: {0}: Sent in-game packet (0xBFx{1:X2}) before having been attached to a mobile",
|
||||
state,
|
||||
packetID
|
||||
);
|
||||
}
|
||||
|
||||
state.Dispose();
|
||||
}
|
||||
else
|
||||
|
|
@ -1503,12 +1629,16 @@ namespace Server.Network
|
|||
var from = state.Mobile;
|
||||
|
||||
if (from == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Item spellbook = null;
|
||||
|
||||
if (pvSrc.ReadInt16() == 1)
|
||||
{
|
||||
spellbook = World.FindItem(pvSrc.ReadUInt32());
|
||||
}
|
||||
|
||||
var spellID = pvSrc.ReadInt16() - 1;
|
||||
|
||||
|
|
@ -1520,19 +1650,25 @@ namespace Server.Network
|
|||
var from = state.Mobile;
|
||||
|
||||
if (from == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (from.AccessLevel >= AccessLevel.Counselor || Core.TickCount - from.NextActionTime >= 0)
|
||||
{
|
||||
var bandage = World.FindItem(pvSrc.ReadUInt32());
|
||||
|
||||
if (bandage == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var target = World.FindMobile(pvSrc.ReadUInt32());
|
||||
|
||||
if (target == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
EventSink.InvokeBandageTargetRequest(from, bandage, target);
|
||||
|
||||
|
|
@ -1552,14 +1688,18 @@ namespace Server.Network
|
|||
public static void BatchQueryProperties(NetState state, PacketReader pvSrc)
|
||||
{
|
||||
if (!ObjectPropertyList.Enabled)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var from = state.Mobile;
|
||||
|
||||
var length = pvSrc.Remaining;
|
||||
|
||||
if (length % 4 != 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
while (pvSrc.Remaining > 0)
|
||||
{
|
||||
|
|
@ -1570,7 +1710,9 @@ namespace Server.Network
|
|||
var m = World.FindMobile(s);
|
||||
|
||||
if (m != null && from.CanSee(m) && Utility.InUpdateRange(from, m))
|
||||
m.SendPropertiesTo(from);
|
||||
{
|
||||
m.SendPropertiesTo(@from);
|
||||
}
|
||||
}
|
||||
else if (s.IsItem)
|
||||
{
|
||||
|
|
@ -1578,7 +1720,9 @@ namespace Server.Network
|
|||
|
||||
if (item?.Deleted == false && from.CanSee(item) &&
|
||||
Utility.InUpdateRange(from.Location, item.GetWorldLocation()))
|
||||
item.SendPropertiesTo(from);
|
||||
{
|
||||
item.SendPropertiesTo(@from);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1586,7 +1730,9 @@ namespace Server.Network
|
|||
public static void QueryProperties(NetState state, PacketReader pvSrc)
|
||||
{
|
||||
if (!ObjectPropertyList.Enabled)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var from = state.Mobile;
|
||||
|
||||
|
|
@ -1597,7 +1743,9 @@ namespace Server.Network
|
|||
var m = World.FindMobile(s);
|
||||
|
||||
if (m != null && from.CanSee(m) && Utility.InUpdateRange(from, m))
|
||||
m.SendPropertiesTo(from);
|
||||
{
|
||||
m.SendPropertiesTo(@from);
|
||||
}
|
||||
}
|
||||
else if (s.IsItem)
|
||||
{
|
||||
|
|
@ -1605,14 +1753,18 @@ namespace Server.Network
|
|||
|
||||
if (item?.Deleted == false && from.CanSee(item) &&
|
||||
Utility.InUpdateRange(from.Location, item.GetWorldLocation()))
|
||||
item.SendPropertiesTo(from);
|
||||
{
|
||||
item.SendPropertiesTo(@from);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void PartyMessage(NetState state, PacketReader pvSrc)
|
||||
{
|
||||
if (state.Mobile == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
switch (pvSrc.ReadByte())
|
||||
{
|
||||
|
|
@ -1697,11 +1849,15 @@ namespace Server.Network
|
|||
int stat = pvSrc.ReadByte();
|
||||
int lockValue = pvSrc.ReadByte();
|
||||
|
||||
if (lockValue > 2) lockValue = 0;
|
||||
if (lockValue > 2)
|
||||
{
|
||||
lockValue = 0;
|
||||
}
|
||||
|
||||
var m = state.Mobile;
|
||||
|
||||
if (m != null)
|
||||
{
|
||||
switch (stat)
|
||||
{
|
||||
case 0:
|
||||
|
|
@ -1714,6 +1870,7 @@ namespace Server.Network
|
|||
m.IntLock = (StatLockType)lockValue;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void ScreenSize(NetState state, PacketReader pvSrc)
|
||||
|
|
@ -1726,7 +1883,10 @@ namespace Server.Network
|
|||
{
|
||||
var from = state.Mobile;
|
||||
|
||||
if (from == null) return;
|
||||
if (from == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var menu = from.ContextMenu;
|
||||
|
||||
|
|
@ -1741,11 +1901,17 @@ namespace Server.Network
|
|||
Point3D p;
|
||||
|
||||
if (entity is Mobile)
|
||||
{
|
||||
p = entity.Location;
|
||||
}
|
||||
else if (entity is Item item)
|
||||
{
|
||||
p = item.GetWorldLocation();
|
||||
}
|
||||
else
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
int index = pvSrc.ReadUInt16();
|
||||
|
||||
|
|
@ -1756,10 +1922,14 @@ namespace Server.Network
|
|||
var range = e.Range;
|
||||
|
||||
if (range == -1)
|
||||
{
|
||||
range = 18;
|
||||
}
|
||||
|
||||
if (e.Enabled && from.InRange(p, range))
|
||||
{
|
||||
e.OnClick();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1773,24 +1943,36 @@ namespace Server.Network
|
|||
if (from != null && target != null && from.Map == target.Map && from.CanSee(target))
|
||||
{
|
||||
if (target is Mobile && !Utility.InUpdateRange(from.Location, target.Location))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var item = target as Item;
|
||||
|
||||
if (item != null && !Utility.InUpdateRange(from.Location, item.GetWorldLocation()))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (!from.CheckContextMenuDisplay(target))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var c = new ContextMenu(from, target);
|
||||
|
||||
if (c.Entries.Length > 0)
|
||||
{
|
||||
if (item?.RootParent is Mobile mobile && mobile != from && mobile.AccessLevel >= from.AccessLevel)
|
||||
{
|
||||
for (var i = 0; i < c.Entries.Length; ++i)
|
||||
{
|
||||
if (!c.Entries[i].NonLocalUse)
|
||||
{
|
||||
c.Entries[i].Enabled = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
from.ContextMenu = c;
|
||||
}
|
||||
|
|
@ -1807,7 +1989,9 @@ namespace Server.Network
|
|||
var lang = pvSrc.ReadString(4);
|
||||
|
||||
if (state.Mobile != null)
|
||||
{
|
||||
state.Mobile.Language = lang;
|
||||
}
|
||||
}
|
||||
|
||||
public static void AssistVersion(NetState state, PacketReader pvSrc)
|
||||
|
|
@ -1842,16 +2026,17 @@ namespace Server.Network
|
|||
var m = World.FindMobile(pvSrc.ReadUInt32());
|
||||
|
||||
if (m != null)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case 0x04: // Stats
|
||||
{
|
||||
m.OnStatsQuery(from);
|
||||
m.OnStatsQuery(@from);
|
||||
break;
|
||||
}
|
||||
case 0x05:
|
||||
{
|
||||
m.OnSkillsQuery(from);
|
||||
m.OnSkillsQuery(@from);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
|
@ -1860,6 +2045,7 @@ namespace Server.Network
|
|||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void PlayCharacter(NetState state, PacketReader pvSrc)
|
||||
|
|
@ -1934,10 +2120,14 @@ namespace Server.Network
|
|||
state.Send(new LoginConfirm(m));
|
||||
|
||||
if (m.Map != null)
|
||||
{
|
||||
state.Send(new MapChange(m.Map));
|
||||
}
|
||||
|
||||
if (!Core.SE && state.ProtocolChanges < ProtocolChanges.Version6000)
|
||||
{
|
||||
state.Send(new MapPatches());
|
||||
}
|
||||
|
||||
state.Send(SeasonChange.Instantiate(m.GetSeason(), true));
|
||||
|
||||
|
|
@ -2019,7 +2209,9 @@ namespace Server.Network
|
|||
state.Send(new CurrentTime());
|
||||
state.Send(SeasonChange.Instantiate(m.GetSeason(), true));
|
||||
if (m.Map != null)
|
||||
{
|
||||
state.Send(new MapChange(m.Map));
|
||||
}
|
||||
|
||||
EventSink.InvokeLogin(m);
|
||||
|
||||
|
|
@ -2066,7 +2258,7 @@ namespace Server.Network
|
|||
Pre-7.0.0.0:
|
||||
0x00, 0x01 -> Human Male, Human Female
|
||||
0x02, 0x03 -> Elf Male, Elf Female
|
||||
|
||||
|
||||
Post-7.0.0.0:
|
||||
0x00, 0x01
|
||||
0x02, 0x03 -> Human Male, Human Female
|
||||
|
|
@ -2296,11 +2488,13 @@ namespace Server.Network
|
|||
var oldest = DateTime.MaxValue;
|
||||
|
||||
foreach (var kvp in m_AuthIDWindow)
|
||||
{
|
||||
if (kvp.Value.Age < oldest)
|
||||
{
|
||||
oldestID = kvp.Key;
|
||||
oldest = kvp.Value.Age;
|
||||
}
|
||||
}
|
||||
|
||||
m_AuthIDWindow.Remove(oldestID);
|
||||
}
|
||||
|
|
@ -2312,7 +2506,9 @@ namespace Server.Network
|
|||
authID = Utility.Random(1, int.MaxValue - 1);
|
||||
|
||||
if (Utility.RandomBool())
|
||||
{
|
||||
authID |= 1 << 31;
|
||||
}
|
||||
} while (m_AuthIDWindow.ContainsKey(authID));
|
||||
|
||||
m_AuthIDWindow[authID] = new AuthIDPersistence(state.Version);
|
||||
|
|
@ -2374,9 +2570,13 @@ namespace Server.Network
|
|||
state.Send(SupportedFeatures.Instantiate(state));
|
||||
|
||||
if (state.NewCharacterList)
|
||||
{
|
||||
state.Send(new CharacterList(state.Account, state.CityInfo));
|
||||
}
|
||||
else
|
||||
{
|
||||
state.Send(new CharacterListOld(state.Account, state.CityInfo));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -2477,9 +2677,13 @@ namespace Server.Network
|
|||
EventSink.InvokeAccountLogin(e);
|
||||
|
||||
if (e.Accepted)
|
||||
{
|
||||
AccountLogin_ReplyAck(state);
|
||||
}
|
||||
else
|
||||
{
|
||||
AccountLogin_ReplyRej(state, e.RejectReason);
|
||||
}
|
||||
}
|
||||
|
||||
public static void AccountLogin_ReplyAck(NetState state)
|
||||
|
|
@ -2514,7 +2718,9 @@ namespace Server.Network
|
|||
int count = pvSrc.ReadByte();
|
||||
var serialList = new List<Serial>(count);
|
||||
for (var i = 0; i < count; ++i)
|
||||
{
|
||||
serialList.Add(pvSrc.ReadUInt32());
|
||||
}
|
||||
|
||||
EventSink.InvokeEquipMacro(ns.Mobile, serialList);
|
||||
}
|
||||
|
|
@ -2524,7 +2730,9 @@ namespace Server.Network
|
|||
int count = pvSrc.ReadByte();
|
||||
var layers = new List<Layer>(count);
|
||||
for (var i = 0; i < count; ++i)
|
||||
{
|
||||
layers.Add((Layer)pvSrc.ReadUInt16());
|
||||
}
|
||||
|
||||
EventSink.InvokeUnequipMacro(ns.Mobile, layers);
|
||||
}
|
||||
|
|
@ -2547,7 +2755,10 @@ namespace Server.Network
|
|||
{
|
||||
Serial serial = pvSrc.ReadUInt32();
|
||||
|
||||
if (serial.IsItem) EventSink.InvokeTargetByResourceMacro(ns.Mobile, World.FindItem(serial), pvSrc.ReadInt16());
|
||||
if (serial.IsItem)
|
||||
{
|
||||
EventSink.InvokeTargetByResourceMacro(ns.Mobile, World.FindItem(serial), pvSrc.ReadInt16());
|
||||
}
|
||||
}
|
||||
|
||||
private class LoginTimer : Timer
|
||||
|
|
|
|||
|
|
@ -1,23 +1,3 @@
|
|||
/***************************************************************************
|
||||
* PacketReader.cs
|
||||
* -------------------
|
||||
* begin : May 1, 2002
|
||||
* copyright : (C) The RunUO Software Team
|
||||
* email : info@runuo.com
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Buffers;
|
||||
using System.IO;
|
||||
|
|
@ -46,7 +26,9 @@ namespace Server.Network
|
|||
var buffer = m_Reader.Sequence.ToArray();
|
||||
|
||||
if (buffer.Length > 0)
|
||||
{
|
||||
sw.WriteLine("Client: {0}: Unhandled packet 0x{1:X2}", state, buffer[0]);
|
||||
}
|
||||
|
||||
using (var ms = new MemoryStream(buffer))
|
||||
{
|
||||
|
|
@ -68,22 +50,37 @@ namespace Server.Network
|
|||
{
|
||||
case SeekOrigin.Begin:
|
||||
if (offset < m_Reader.Consumed)
|
||||
{
|
||||
m_Reader.Rewind(m_Reader.Consumed - Math.Max(offset, 0L));
|
||||
}
|
||||
else
|
||||
{
|
||||
m_Reader.Advance(offset - m_Reader.Consumed);
|
||||
}
|
||||
|
||||
break;
|
||||
case SeekOrigin.Current:
|
||||
if (offset < 0)
|
||||
{
|
||||
m_Reader.Rewind(Math.Min(m_Reader.Consumed, offset * -1));
|
||||
}
|
||||
else
|
||||
{
|
||||
m_Reader.Advance(Math.Min(m_Reader.Remaining, offset));
|
||||
}
|
||||
|
||||
break;
|
||||
case SeekOrigin.End:
|
||||
var count = m_Reader.Remaining - offset;
|
||||
if (count < 0)
|
||||
{
|
||||
m_Reader.Rewind(count * -1);
|
||||
}
|
||||
else if (count > 0)
|
||||
{
|
||||
m_Reader.Advance(count);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -111,7 +108,9 @@ namespace Server.Network
|
|||
var sb = new StringBuilder();
|
||||
|
||||
while (m_Reader.TryReadLittleEndian(out short c) && c != 0)
|
||||
{
|
||||
sb.Append((char)c);
|
||||
}
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
|
|
@ -121,10 +120,14 @@ namespace Server.Network
|
|||
var sb = new StringBuilder();
|
||||
|
||||
while (fixedLength-- > 0 && m_Reader.TryReadLittleEndian(out short c) && c != 0)
|
||||
{
|
||||
sb.Append((char)c);
|
||||
}
|
||||
|
||||
if (fixedLength > 0)
|
||||
{
|
||||
m_Reader.Advance(fixedLength);
|
||||
}
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
|
|
@ -134,11 +137,17 @@ namespace Server.Network
|
|||
var sb = new StringBuilder();
|
||||
|
||||
while (fixedLength-- > 0 && m_Reader.TryReadLittleEndian(out short c) && c != 0)
|
||||
{
|
||||
if (IsSafeChar(c))
|
||||
{
|
||||
sb.Append((char)c);
|
||||
}
|
||||
}
|
||||
|
||||
if (fixedLength > 0)
|
||||
{
|
||||
m_Reader.Advance(fixedLength * 2);
|
||||
}
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
|
|
@ -148,8 +157,12 @@ namespace Server.Network
|
|||
var sb = new StringBuilder();
|
||||
|
||||
while (m_Reader.TryReadLittleEndian(out short c) && c != 0)
|
||||
{
|
||||
if (IsSafeChar(c))
|
||||
{
|
||||
sb.Append((char)c);
|
||||
}
|
||||
}
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
|
|
@ -159,8 +172,12 @@ namespace Server.Network
|
|||
var sb = new StringBuilder();
|
||||
|
||||
while (m_Reader.TryReadBigEndian(out short c) && c != 0)
|
||||
{
|
||||
if (IsSafeChar(c))
|
||||
{
|
||||
sb.Append((char)c);
|
||||
}
|
||||
}
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
|
|
@ -170,7 +187,9 @@ namespace Server.Network
|
|||
var sb = new StringBuilder();
|
||||
|
||||
while (m_Reader.TryReadBigEndian(out short c) && c != 0)
|
||||
{
|
||||
sb.Append((char)c);
|
||||
}
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
|
|
@ -195,8 +214,12 @@ namespace Server.Network
|
|||
var sb = new StringBuilder(s.Length);
|
||||
|
||||
for (var i = 0; i < s.Length; ++i)
|
||||
{
|
||||
if (IsSafeChar(s[i]))
|
||||
{
|
||||
sb.Append(s[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
|
|
@ -218,8 +241,12 @@ namespace Server.Network
|
|||
var sb = new StringBuilder(s.Length);
|
||||
|
||||
for (var i = 0; i < s.Length; ++i)
|
||||
{
|
||||
if (IsSafeChar(s[i]))
|
||||
{
|
||||
sb.Append(s[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
|
|
@ -236,7 +263,9 @@ namespace Server.Network
|
|||
var sb = new StringBuilder();
|
||||
|
||||
while (m_Reader.TryRead(out var c))
|
||||
{
|
||||
sb.Append((char)c);
|
||||
}
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
|
|
@ -246,8 +275,12 @@ namespace Server.Network
|
|||
var sb = new StringBuilder();
|
||||
|
||||
while (m_Reader.TryRead(out var c))
|
||||
{
|
||||
if (IsSafeChar(c))
|
||||
{
|
||||
sb.Append((char)c);
|
||||
}
|
||||
}
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
|
|
@ -257,11 +290,17 @@ namespace Server.Network
|
|||
var sb = new StringBuilder();
|
||||
|
||||
while (fixedLength-- > 0 && m_Reader.TryReadBigEndian(out short c) && c != 0)
|
||||
{
|
||||
if (IsSafeChar(c))
|
||||
{
|
||||
sb.Append((char)c);
|
||||
}
|
||||
}
|
||||
|
||||
if (fixedLength > 0)
|
||||
{
|
||||
m_Reader.Advance(fixedLength * 2);
|
||||
}
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
|
|
@ -271,10 +310,14 @@ namespace Server.Network
|
|||
var sb = new StringBuilder();
|
||||
|
||||
while (fixedLength-- > 0 && m_Reader.TryReadBigEndian(out short c) && c != 0)
|
||||
{
|
||||
sb.Append((char)c);
|
||||
}
|
||||
|
||||
if (fixedLength > 0)
|
||||
{
|
||||
m_Reader.Advance(fixedLength * 2);
|
||||
}
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
|
|
@ -284,11 +327,17 @@ namespace Server.Network
|
|||
var sb = new StringBuilder();
|
||||
|
||||
while (fixedLength-- > 0 && m_Reader.TryRead(out var c) && c != 0)
|
||||
{
|
||||
if (IsSafeChar(c))
|
||||
{
|
||||
sb.Append((char)c);
|
||||
}
|
||||
}
|
||||
|
||||
if (fixedLength > 0)
|
||||
{
|
||||
m_Reader.Advance(fixedLength);
|
||||
}
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
|
|
@ -298,10 +347,14 @@ namespace Server.Network
|
|||
var sb = new StringBuilder();
|
||||
|
||||
while (fixedLength-- > 0 && m_Reader.TryRead(out var c) && c != 0)
|
||||
{
|
||||
sb.Append((char)c);
|
||||
}
|
||||
|
||||
if (fixedLength > 0)
|
||||
{
|
||||
m_Reader.Advance(fixedLength);
|
||||
}
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,23 +1,3 @@
|
|||
/***************************************************************************
|
||||
* PacketWriter.cs
|
||||
* -------------------
|
||||
* begin : May 1, 2002
|
||||
* copyright : (C) The RunUO Software Team
|
||||
* email : info@runuo.com
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Collections.Concurrent;
|
||||
using System.IO;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*************************************************************************
|
||||
* ModernUO *
|
||||
* Copyright (C) 2019-2020 - ModernUO Development Team *
|
||||
* Copyright 2019-2020 - ModernUO Development Team *
|
||||
* Email: hi@modernuo.com *
|
||||
* File: AccountPackets.cs *
|
||||
* *
|
||||
|
|
@ -56,21 +56,30 @@ namespace Server.Network
|
|||
var count = 0;
|
||||
|
||||
for (var i = 0; i < a.Length; ++i)
|
||||
{
|
||||
if (a[i] != null)
|
||||
{
|
||||
++count;
|
||||
}
|
||||
}
|
||||
|
||||
Stream.Write((byte)count);
|
||||
Stream.Write((byte)0);
|
||||
|
||||
for (var i = 0; i < a.Length; ++i)
|
||||
{
|
||||
if (a[i] != null)
|
||||
{
|
||||
var name = a[i].Name;
|
||||
|
||||
if (name == null)
|
||||
{
|
||||
name = "-null-";
|
||||
}
|
||||
else if ((name = name.Trim()).Length == 0)
|
||||
{
|
||||
name = "-empty-";
|
||||
}
|
||||
|
||||
Stream.WriteAsciiFixed(name, 30);
|
||||
Stream.Fill(30); // password
|
||||
|
|
@ -79,6 +88,7 @@ namespace Server.Network
|
|||
{
|
||||
Stream.Fill(60);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -123,15 +133,23 @@ namespace Server.Network
|
|||
flags &= ~FeatureFlags.UOTD;
|
||||
|
||||
if (ns.Account.Limit > 6)
|
||||
{
|
||||
flags |= FeatureFlags.SeventhCharacterSlot;
|
||||
}
|
||||
else
|
||||
{
|
||||
flags |= FeatureFlags.SixthCharacterSlot;
|
||||
}
|
||||
}
|
||||
|
||||
if (ns.ExtendedSupportedFeatures)
|
||||
{
|
||||
Stream.Write((uint)flags);
|
||||
}
|
||||
else
|
||||
{
|
||||
Stream.Write((ushort)flags);
|
||||
}
|
||||
}
|
||||
|
||||
public static FeatureFlags Value { get; set; }
|
||||
|
|
@ -156,7 +174,9 @@ namespace Server.Network
|
|||
var map = m.Map;
|
||||
|
||||
if (map == null || map == Map.Internal)
|
||||
{
|
||||
map = m.LogoutMap;
|
||||
}
|
||||
|
||||
Stream.Write((short)0);
|
||||
Stream.Write((short)0);
|
||||
|
|
@ -185,8 +205,12 @@ namespace Server.Network
|
|||
var highSlot = -1;
|
||||
|
||||
for (var i = 0; i < a.Length; ++i)
|
||||
{
|
||||
if (a[i] != null)
|
||||
{
|
||||
highSlot = i;
|
||||
}
|
||||
}
|
||||
|
||||
var count = Math.Max(Math.Max(highSlot + 1, a.Limit), 5);
|
||||
|
||||
|
|
@ -218,14 +242,19 @@ namespace Server.Network
|
|||
var highSlot = -1;
|
||||
|
||||
for (var i = 0; i < a.Length; ++i)
|
||||
{
|
||||
if (a[i] != null)
|
||||
{
|
||||
highSlot = i;
|
||||
}
|
||||
}
|
||||
|
||||
var count = Math.Max(Math.Max(highSlot + 1, a.Limit), 5);
|
||||
|
||||
Stream.Write((byte)count);
|
||||
|
||||
for (var i = 0; i < count; ++i)
|
||||
{
|
||||
if (a[i] != null)
|
||||
{
|
||||
Stream.WriteAsciiFixed(a[i].Name, 30);
|
||||
|
|
@ -235,6 +264,7 @@ namespace Server.Network
|
|||
{
|
||||
Stream.Fill(60);
|
||||
}
|
||||
}
|
||||
|
||||
Stream.Write((byte)info.Length);
|
||||
|
||||
|
|
@ -256,13 +286,19 @@ namespace Server.Network
|
|||
var flags = ExpansionInfo.CoreExpansion.CharacterListFlags;
|
||||
|
||||
if (count > 6)
|
||||
{
|
||||
flags |= CharacterListFlags.SeventhCharacterSlot |
|
||||
CharacterListFlags.SixthCharacterSlot; // 7th Character Slot - TODO: Is SixthCharacterSlot Required?
|
||||
}
|
||||
else if (count == 6)
|
||||
{
|
||||
flags |= CharacterListFlags.SixthCharacterSlot; // 6th Character Slot
|
||||
}
|
||||
else if (a.Limit == 1)
|
||||
{
|
||||
flags |= CharacterListFlags.SlotLimit &
|
||||
CharacterListFlags.OneCharacterSlot; // Limit Characters & One Character
|
||||
}
|
||||
|
||||
Stream.Write((int)(flags | AdditionalFlags)); // Additional Flags
|
||||
|
||||
|
|
@ -281,14 +317,19 @@ namespace Server.Network
|
|||
var highSlot = -1;
|
||||
|
||||
for (var i = 0; i < a.Length; ++i)
|
||||
{
|
||||
if (a[i] != null)
|
||||
{
|
||||
highSlot = i;
|
||||
}
|
||||
}
|
||||
|
||||
var count = Math.Max(Math.Max(highSlot + 1, a.Limit), 5);
|
||||
|
||||
Stream.Write((byte)count);
|
||||
|
||||
for (var i = 0; i < count; ++i)
|
||||
{
|
||||
if (a[i] != null)
|
||||
{
|
||||
Stream.WriteAsciiFixed(a[i].Name, 30);
|
||||
|
|
@ -298,6 +339,7 @@ namespace Server.Network
|
|||
{
|
||||
Stream.Fill(60);
|
||||
}
|
||||
}
|
||||
|
||||
Stream.Write((byte)info.Length);
|
||||
|
||||
|
|
@ -313,13 +355,19 @@ namespace Server.Network
|
|||
var flags = ExpansionInfo.CoreExpansion.CharacterListFlags;
|
||||
|
||||
if (count > 6)
|
||||
{
|
||||
flags |= CharacterListFlags.SeventhCharacterSlot |
|
||||
CharacterListFlags.SixthCharacterSlot; // 7th Character Slot - TODO: Is SixthCharacterSlot Required?
|
||||
}
|
||||
else if (count == 6)
|
||||
{
|
||||
flags |= CharacterListFlags.SixthCharacterSlot; // 6th Character Slot
|
||||
}
|
||||
else if (a.Limit == 1)
|
||||
{
|
||||
flags |= CharacterListFlags.SlotLimit &
|
||||
CharacterListFlags.OneCharacterSlot; // Limit Characters & One Character
|
||||
}
|
||||
|
||||
Stream.Write((int)(flags | CharacterList.AdditionalFlags)); // Additional Flags
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*************************************************************************
|
||||
* ModernUO *
|
||||
* Copyright (C) 2019-2020 - ModernUO Development Team *
|
||||
* Copyright 2019-2020 - ModernUO Development Team *
|
||||
* Email: hi@modernuo.com *
|
||||
* File: ArrowPackets.cs *
|
||||
* *
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*************************************************************************
|
||||
* ModernUO *
|
||||
* Copyright (C) 2019-2020 - ModernUO Development Team *
|
||||
* Copyright 2019-2020 - ModernUO Development Team *
|
||||
* Email: hi@modernuo.com *
|
||||
* File: AttributeNormalizer.cs *
|
||||
* *
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*************************************************************************
|
||||
* ModernUO *
|
||||
* Copyright (C) 2019-2020 - ModernUO Development Team *
|
||||
* Copyright 2019-2020 - ModernUO Development Team *
|
||||
* Email: hi@modernuo.com *
|
||||
* File: CombatPackets.cs *
|
||||
* *
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*************************************************************************
|
||||
* ModernUO *
|
||||
* Copyright (C) 2019-2020 - ModernUO Development Team *
|
||||
* Copyright 2019-2020 - ModernUO Development Team *
|
||||
* Email: hi@modernuo.com *
|
||||
* File: DamagePackets.cs *
|
||||
* *
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*************************************************************************
|
||||
* ModernUO *
|
||||
* Copyright (C) 2019-2020 - ModernUO Development Team *
|
||||
* Copyright 2019-2020 - ModernUO Development Team *
|
||||
* Email: hi@modernuo.com *
|
||||
* File: DisplayHuePicker.cs *
|
||||
* *
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*************************************************************************
|
||||
* ModernUO *
|
||||
* Copyright (C) 2019-2020 - ModernUO Development Team *
|
||||
* Copyright 2019-2020 - ModernUO Development Team *
|
||||
* Email: hi@modernuo.com *
|
||||
* File: EffectPackets.cs *
|
||||
* *
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*************************************************************************
|
||||
* ModernUO *
|
||||
* Copyright (C) 2019-2020 - ModernUO Development Team *
|
||||
* Copyright 2019-2020 - ModernUO Development Team *
|
||||
* Email: hi@modernuo.com *
|
||||
* File: EquipmentPackets.cs *
|
||||
* *
|
||||
|
|
@ -83,7 +83,10 @@ namespace Server.Network
|
|||
}
|
||||
}
|
||||
|
||||
if (info.Unidentified) Stream.Write(-4);
|
||||
if (info.Unidentified)
|
||||
{
|
||||
Stream.Write(-4);
|
||||
}
|
||||
|
||||
for (var i = 0; i < attrs.Length; ++i)
|
||||
{
|
||||
|
|
@ -109,7 +112,9 @@ namespace Server.Network
|
|||
parentSerial = parent.Serial;
|
||||
|
||||
if (parent.SolidHueOverride >= 0)
|
||||
{
|
||||
hue = parent.SolidHueOverride;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*************************************************************************
|
||||
* ModernUO *
|
||||
* Copyright (C) 2019-2020 - ModernUO Development Team *
|
||||
* Copyright 2019-2020 - ModernUO Development Team *
|
||||
* Email: hi@modernuo.com *
|
||||
* File: GumpPackets.cs *
|
||||
* *
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*************************************************************************
|
||||
* ModernUO *
|
||||
* Copyright (C) 2019-2020 - ModernUO Development Team *
|
||||
* Copyright 2019-2020 - ModernUO Development Team *
|
||||
* Email: hi@modernuo.com *
|
||||
* File: ItemPackets.cs *
|
||||
* *
|
||||
|
|
@ -41,43 +41,69 @@ namespace Server.Network
|
|||
var direction = (int)item.Direction;
|
||||
|
||||
if (amount != 0)
|
||||
{
|
||||
serial |= 0x80000000;
|
||||
}
|
||||
else
|
||||
{
|
||||
serial &= 0x7FFFFFFF;
|
||||
}
|
||||
|
||||
Stream.Write(serial);
|
||||
|
||||
if (item is BaseMulti)
|
||||
{
|
||||
Stream.Write((short)(itemID | 0x4000));
|
||||
}
|
||||
else
|
||||
{
|
||||
Stream.Write((short)itemID);
|
||||
}
|
||||
|
||||
if (amount != 0) Stream.Write((short)amount);
|
||||
if (amount != 0)
|
||||
{
|
||||
Stream.Write((short)amount);
|
||||
}
|
||||
|
||||
x &= 0x7FFF;
|
||||
|
||||
if (direction != 0) x |= 0x8000;
|
||||
if (direction != 0)
|
||||
{
|
||||
x |= 0x8000;
|
||||
}
|
||||
|
||||
Stream.Write((short)x);
|
||||
|
||||
y &= 0x3FFF;
|
||||
|
||||
if (hue != 0) y |= 0x8000;
|
||||
if (hue != 0)
|
||||
{
|
||||
y |= 0x8000;
|
||||
}
|
||||
|
||||
if (flags != 0) y |= 0x4000;
|
||||
if (flags != 0)
|
||||
{
|
||||
y |= 0x4000;
|
||||
}
|
||||
|
||||
Stream.Write((short)y);
|
||||
|
||||
if (direction != 0)
|
||||
{
|
||||
Stream.Write((byte)direction);
|
||||
}
|
||||
|
||||
Stream.Write((sbyte)loc.m_Z);
|
||||
|
||||
if (hue != 0)
|
||||
{
|
||||
Stream.Write((ushort)hue);
|
||||
}
|
||||
|
||||
if (flags != 0)
|
||||
{
|
||||
Stream.Write((byte)flags);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -212,7 +238,9 @@ namespace Server.Network
|
|||
Stream.Write((short)offset);
|
||||
|
||||
for (var i = 0; i < 8; ++i)
|
||||
{
|
||||
Stream.Write((byte)(content >> (i * 8)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -229,6 +257,7 @@ namespace Server.Network
|
|||
ulong mask = 1;
|
||||
|
||||
for (var i = 0; i < 64; ++i, mask <<= 1)
|
||||
{
|
||||
if ((content & mask) != 0)
|
||||
{
|
||||
Stream.Write(0x7FFFFFFF - i);
|
||||
|
|
@ -242,6 +271,7 @@ namespace Server.Network
|
|||
|
||||
++written;
|
||||
}
|
||||
}
|
||||
|
||||
Stream.Seek(3, SeekOrigin.Begin);
|
||||
Stream.Write((ushort)written);
|
||||
|
|
@ -261,6 +291,7 @@ namespace Server.Network
|
|||
ulong mask = 1;
|
||||
|
||||
for (var i = 0; i < 64; ++i, mask <<= 1)
|
||||
{
|
||||
if ((content & mask) != 0)
|
||||
{
|
||||
Stream.Write(0x7FFFFFFF - i);
|
||||
|
|
@ -275,6 +306,7 @@ namespace Server.Network
|
|||
|
||||
++written;
|
||||
}
|
||||
}
|
||||
|
||||
Stream.Seek(3, SeekOrigin.Begin);
|
||||
Stream.Write((ushort)written);
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*************************************************************************
|
||||
* ModernUO *
|
||||
* Copyright (C) 2019-2020 - ModernUO Development Team *
|
||||
* Copyright 2019-2020 - ModernUO Development Team *
|
||||
* Email: hi@modernuo.com *
|
||||
* File: LightPackets.cs *
|
||||
* *
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*************************************************************************
|
||||
* ModernUO *
|
||||
* Copyright (C) 2019-2020 - ModernUO Development Team *
|
||||
* Copyright 2019-2020 - ModernUO Development Team *
|
||||
* Email: hi@modernuo.com *
|
||||
* File: MapPackets.cs *
|
||||
* *
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*************************************************************************
|
||||
* ModernUO *
|
||||
* Copyright (C) 2019-2020 - ModernUO Development Team *
|
||||
* Copyright 2019-2020 - ModernUO Development Team *
|
||||
* Email: hi@modernuo.com *
|
||||
* File: MenuPackets.cs *
|
||||
* *
|
||||
|
|
@ -166,11 +166,15 @@ namespace Server.Network
|
|||
var range = e.Range;
|
||||
|
||||
if (range == -1)
|
||||
{
|
||||
range = 18;
|
||||
}
|
||||
|
||||
var flags = e.Flags;
|
||||
if (!(e.Enabled && menu.From.InRange(p, range)))
|
||||
{
|
||||
flags |= CMEFlags.Disabled;
|
||||
}
|
||||
|
||||
Stream.Write((short)flags);
|
||||
}
|
||||
|
|
@ -213,21 +217,29 @@ namespace Server.Network
|
|||
var range = e.Range;
|
||||
|
||||
if (range == -1)
|
||||
{
|
||||
range = 18;
|
||||
}
|
||||
|
||||
var flags = e.Flags;
|
||||
if (!(e.Enabled && menu.From.InRange(p, range)))
|
||||
{
|
||||
flags |= CMEFlags.Disabled;
|
||||
}
|
||||
|
||||
var color = e.Color & 0xFFFF;
|
||||
|
||||
if (color != 0xFFFF)
|
||||
{
|
||||
flags |= CMEFlags.Colored;
|
||||
}
|
||||
|
||||
Stream.Write((short)flags);
|
||||
|
||||
if ((flags & CMEFlags.Colored) != 0)
|
||||
{
|
||||
Stream.Write((short)color);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*************************************************************************
|
||||
* ModernUO *
|
||||
* Copyright (C) 2019-2020 - ModernUO Development Team *
|
||||
* Copyright 2019-2020 - ModernUO Development Team *
|
||||
* Email: hi@modernuo.com *
|
||||
* File: MessagePackets.cs *
|
||||
* *
|
||||
|
|
@ -40,7 +40,9 @@ namespace Server.Network
|
|||
args ??= "";
|
||||
|
||||
if (hue == 0)
|
||||
{
|
||||
hue = 0x3B2;
|
||||
}
|
||||
|
||||
EnsureCapacity(50 + args.Length * 2);
|
||||
|
||||
|
|
@ -117,7 +119,9 @@ namespace Server.Network
|
|||
args ??= "";
|
||||
|
||||
if (hue == 0)
|
||||
{
|
||||
hue = 0x3B2;
|
||||
}
|
||||
|
||||
EnsureCapacity(52 + affix.Length + args.Length * 2);
|
||||
|
||||
|
|
@ -144,7 +148,9 @@ namespace Server.Network
|
|||
text ??= "";
|
||||
|
||||
if (hue == 0)
|
||||
{
|
||||
hue = 0x3B2;
|
||||
}
|
||||
|
||||
EnsureCapacity(45 + text.Length);
|
||||
|
||||
|
|
@ -165,12 +171,18 @@ namespace Server.Network
|
|||
string text
|
||||
) : base(0xAE)
|
||||
{
|
||||
if (string.IsNullOrEmpty(lang)) lang = "ENU";
|
||||
if (string.IsNullOrEmpty(lang))
|
||||
{
|
||||
lang = "ENU";
|
||||
}
|
||||
|
||||
name ??= "";
|
||||
text ??= "";
|
||||
|
||||
if (hue == 0)
|
||||
{
|
||||
hue = 0x3B2;
|
||||
}
|
||||
|
||||
EnsureCapacity(50 + text.Length * 2);
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*************************************************************************
|
||||
* ModernUO *
|
||||
* Copyright (C) 2019-2020 - ModernUO Development Team *
|
||||
* Copyright 2019-2020 - ModernUO Development Team *
|
||||
* Email: hi@modernuo.com *
|
||||
* File: MobilePackets.cs *
|
||||
* *
|
||||
|
|
@ -49,7 +49,9 @@ namespace Server.Network
|
|||
var hue = m.Hue;
|
||||
|
||||
if (m.SolidHueOverride >= 0)
|
||||
{
|
||||
hue = m.SolidHueOverride;
|
||||
}
|
||||
|
||||
Stream.Write(m.Serial);
|
||||
Stream.Write((short)m.Body);
|
||||
|
|
@ -72,7 +74,9 @@ namespace Server.Network
|
|||
var hue = m.Hue;
|
||||
|
||||
if (m.SolidHueOverride >= 0)
|
||||
{
|
||||
hue = m.SolidHueOverride;
|
||||
}
|
||||
|
||||
Stream.Write(m.Serial);
|
||||
Stream.Write((short)m.Body);
|
||||
|
|
@ -319,8 +323,12 @@ namespace Server.Network
|
|||
}
|
||||
|
||||
if (type >= 6)
|
||||
{
|
||||
for (var i = 0; i < 15; ++i)
|
||||
{
|
||||
Stream.Write((short)m.GetAOSStatus(i));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -362,16 +370,22 @@ namespace Server.Network
|
|||
Stream.WriteAsciiFixed(name, 30);
|
||||
|
||||
if (beholder == beheld)
|
||||
{
|
||||
WriteAttr(beheld.Hits, beheld.HitsMax);
|
||||
}
|
||||
else
|
||||
{
|
||||
WriteAttrNorm(beheld.Hits, beheld.HitsMax);
|
||||
}
|
||||
|
||||
Stream.Write(beheld.CanBeRenamedBy(beholder));
|
||||
|
||||
Stream.Write((byte)type);
|
||||
|
||||
if (type <= 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Stream.Write(beheld.Female);
|
||||
|
||||
|
|
@ -423,8 +437,12 @@ namespace Server.Network
|
|||
}
|
||||
|
||||
if (type >= 6)
|
||||
{
|
||||
for (var i = 0; i < 15; ++i)
|
||||
{
|
||||
Stream.Write((short)beheld.GetAOSStatus(i));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void WriteAttr(int current, int maximum)
|
||||
|
|
@ -453,9 +471,13 @@ namespace Server.Network
|
|||
var p = m.Poison;
|
||||
|
||||
if (p != null)
|
||||
{
|
||||
Stream.Write((byte)(p.Level + 1));
|
||||
}
|
||||
else
|
||||
{
|
||||
Stream.Write((byte)0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -471,9 +493,13 @@ namespace Server.Network
|
|||
Stream.Write((short)2);
|
||||
|
||||
if (m.Blessed || m.YellowHealthbar)
|
||||
{
|
||||
Stream.Write((byte)1);
|
||||
}
|
||||
else
|
||||
{
|
||||
Stream.Write((byte)0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -484,7 +510,9 @@ namespace Server.Network
|
|||
var hue = m.Hue;
|
||||
|
||||
if (m.SolidHueOverride >= 0)
|
||||
{
|
||||
hue = m.SolidHueOverride;
|
||||
}
|
||||
|
||||
Stream.Write(m.Serial);
|
||||
Stream.Write((short)m.Body);
|
||||
|
|
@ -507,7 +535,9 @@ namespace Server.Network
|
|||
var hue = m.Hue;
|
||||
|
||||
if (m.SolidHueOverride >= 0)
|
||||
{
|
||||
hue = m.SolidHueOverride;
|
||||
}
|
||||
|
||||
Stream.Write(m.Serial);
|
||||
Stream.Write((short)m.Body);
|
||||
|
|
@ -536,16 +566,23 @@ namespace Server.Network
|
|||
var count = eq.Count;
|
||||
|
||||
if (beheld.HairItemID > 0)
|
||||
{
|
||||
count++;
|
||||
}
|
||||
|
||||
if (beheld.FacialHairItemID > 0)
|
||||
{
|
||||
count++;
|
||||
}
|
||||
|
||||
EnsureCapacity(23 + count * 9);
|
||||
|
||||
var hue = beheld.Hue;
|
||||
|
||||
if (beheld.SolidHueOverride >= 0)
|
||||
{
|
||||
hue = beheld.SolidHueOverride;
|
||||
}
|
||||
|
||||
Stream.Write(beheld.Serial);
|
||||
Stream.Write((short)beheld.Body);
|
||||
|
|
@ -570,7 +607,9 @@ namespace Server.Network
|
|||
hue = item.Hue;
|
||||
|
||||
if (beheld.SolidHueOverride >= 0)
|
||||
{
|
||||
hue = beheld.SolidHueOverride;
|
||||
}
|
||||
|
||||
var itemID = item.ItemID & 0xFFFF;
|
||||
|
||||
|
|
@ -583,13 +622,16 @@ namespace Server.Network
|
|||
}
|
||||
|
||||
if (beheld.HairItemID > 0)
|
||||
{
|
||||
if (m_DupedLayers[(int)Layer.Hair] != m_Version)
|
||||
{
|
||||
m_DupedLayers[(int)Layer.Hair] = m_Version;
|
||||
hue = beheld.HairHue;
|
||||
|
||||
if (beheld.SolidHueOverride >= 0)
|
||||
{
|
||||
hue = beheld.SolidHueOverride;
|
||||
}
|
||||
|
||||
var itemID = beheld.HairItemID & 0xFFFF;
|
||||
|
||||
|
|
@ -599,15 +641,19 @@ namespace Server.Network
|
|||
|
||||
Stream.Write((short)hue);
|
||||
}
|
||||
}
|
||||
|
||||
if (beheld.FacialHairItemID > 0)
|
||||
{
|
||||
if (m_DupedLayers[(int)Layer.FacialHair] != m_Version)
|
||||
{
|
||||
m_DupedLayers[(int)Layer.FacialHair] = m_Version;
|
||||
hue = beheld.FacialHairHue;
|
||||
|
||||
if (beheld.SolidHueOverride >= 0)
|
||||
{
|
||||
hue = beheld.SolidHueOverride;
|
||||
}
|
||||
|
||||
var itemID = beheld.FacialHairItemID & 0xFFFF;
|
||||
|
||||
|
|
@ -617,6 +663,7 @@ namespace Server.Network
|
|||
|
||||
Stream.Write((short)hue);
|
||||
}
|
||||
}
|
||||
|
||||
Stream.Write(0); // terminate
|
||||
}
|
||||
|
|
@ -624,9 +671,15 @@ namespace Server.Network
|
|||
public static Packet Create(NetState ns, Mobile beholder, Mobile beheld)
|
||||
{
|
||||
if (ns.NewMobileIncoming)
|
||||
{
|
||||
return new MobileIncoming(beholder, beheld);
|
||||
}
|
||||
|
||||
if (ns.StygianAbyss)
|
||||
{
|
||||
return new MobileIncomingSA(beholder, beheld);
|
||||
}
|
||||
|
||||
return new MobileIncomingOld(beholder, beheld);
|
||||
}
|
||||
}
|
||||
|
|
@ -645,16 +698,23 @@ namespace Server.Network
|
|||
var count = eq.Count;
|
||||
|
||||
if (beheld.HairItemID > 0)
|
||||
{
|
||||
count++;
|
||||
}
|
||||
|
||||
if (beheld.FacialHairItemID > 0)
|
||||
{
|
||||
count++;
|
||||
}
|
||||
|
||||
EnsureCapacity(23 + count * 9);
|
||||
|
||||
var hue = beheld.Hue;
|
||||
|
||||
if (beheld.SolidHueOverride >= 0)
|
||||
{
|
||||
hue = beheld.SolidHueOverride;
|
||||
}
|
||||
|
||||
Stream.Write(beheld.Serial);
|
||||
Stream.Write((short)beheld.Body);
|
||||
|
|
@ -679,70 +739,92 @@ namespace Server.Network
|
|||
hue = item.Hue;
|
||||
|
||||
if (beheld.SolidHueOverride >= 0)
|
||||
{
|
||||
hue = beheld.SolidHueOverride;
|
||||
}
|
||||
|
||||
var itemID = item.ItemID & 0x7FFF;
|
||||
var writeHue = hue != 0;
|
||||
|
||||
if (writeHue)
|
||||
{
|
||||
itemID |= 0x8000;
|
||||
}
|
||||
|
||||
Stream.Write(item.Serial);
|
||||
Stream.Write((ushort)itemID);
|
||||
Stream.Write(layer);
|
||||
|
||||
if (writeHue)
|
||||
{
|
||||
Stream.Write((short)hue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (beheld.HairItemID > 0)
|
||||
{
|
||||
if (m_DupedLayers[(int)Layer.Hair] != m_Version)
|
||||
{
|
||||
m_DupedLayers[(int)Layer.Hair] = m_Version;
|
||||
hue = beheld.HairHue;
|
||||
|
||||
if (beheld.SolidHueOverride >= 0)
|
||||
{
|
||||
hue = beheld.SolidHueOverride;
|
||||
}
|
||||
|
||||
var itemID = beheld.HairItemID & 0x7FFF;
|
||||
|
||||
var writeHue = hue != 0;
|
||||
|
||||
if (writeHue)
|
||||
{
|
||||
itemID |= 0x8000;
|
||||
}
|
||||
|
||||
Stream.Write(HairInfo.FakeSerial(beheld));
|
||||
Stream.Write((ushort)itemID);
|
||||
Stream.Write((byte)Layer.Hair);
|
||||
|
||||
if (writeHue)
|
||||
{
|
||||
Stream.Write((short)hue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (beheld.FacialHairItemID > 0)
|
||||
{
|
||||
if (m_DupedLayers[(int)Layer.FacialHair] != m_Version)
|
||||
{
|
||||
m_DupedLayers[(int)Layer.FacialHair] = m_Version;
|
||||
hue = beheld.FacialHairHue;
|
||||
|
||||
if (beheld.SolidHueOverride >= 0)
|
||||
{
|
||||
hue = beheld.SolidHueOverride;
|
||||
}
|
||||
|
||||
var itemID = beheld.FacialHairItemID & 0x7FFF;
|
||||
|
||||
var writeHue = hue != 0;
|
||||
|
||||
if (writeHue)
|
||||
{
|
||||
itemID |= 0x8000;
|
||||
}
|
||||
|
||||
Stream.Write(FacialHairInfo.FakeSerial(beheld));
|
||||
Stream.Write((ushort)itemID);
|
||||
Stream.Write((byte)Layer.FacialHair);
|
||||
|
||||
if (writeHue)
|
||||
{
|
||||
Stream.Write((short)hue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Stream.Write(0); // terminate
|
||||
}
|
||||
|
|
@ -763,16 +845,23 @@ namespace Server.Network
|
|||
var count = eq.Count;
|
||||
|
||||
if (beheld.HairItemID > 0)
|
||||
{
|
||||
count++;
|
||||
}
|
||||
|
||||
if (beheld.FacialHairItemID > 0)
|
||||
{
|
||||
count++;
|
||||
}
|
||||
|
||||
EnsureCapacity(23 + count * 9);
|
||||
|
||||
var hue = beheld.Hue;
|
||||
|
||||
if (beheld.SolidHueOverride >= 0)
|
||||
{
|
||||
hue = beheld.SolidHueOverride;
|
||||
}
|
||||
|
||||
Stream.Write(beheld.Serial);
|
||||
Stream.Write((short)beheld.Body);
|
||||
|
|
@ -797,70 +886,92 @@ namespace Server.Network
|
|||
hue = item.Hue;
|
||||
|
||||
if (beheld.SolidHueOverride >= 0)
|
||||
{
|
||||
hue = beheld.SolidHueOverride;
|
||||
}
|
||||
|
||||
var itemID = item.ItemID & 0x7FFF;
|
||||
var writeHue = hue != 0;
|
||||
|
||||
if (writeHue)
|
||||
{
|
||||
itemID |= 0x8000;
|
||||
}
|
||||
|
||||
Stream.Write(item.Serial);
|
||||
Stream.Write((ushort)itemID);
|
||||
Stream.Write(layer);
|
||||
|
||||
if (writeHue)
|
||||
{
|
||||
Stream.Write((short)hue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (beheld.HairItemID > 0)
|
||||
{
|
||||
if (m_DupedLayers[(int)Layer.Hair] != m_Version)
|
||||
{
|
||||
m_DupedLayers[(int)Layer.Hair] = m_Version;
|
||||
hue = beheld.HairHue;
|
||||
|
||||
if (beheld.SolidHueOverride >= 0)
|
||||
{
|
||||
hue = beheld.SolidHueOverride;
|
||||
}
|
||||
|
||||
var itemID = beheld.HairItemID & 0x7FFF;
|
||||
|
||||
var writeHue = hue != 0;
|
||||
|
||||
if (writeHue)
|
||||
{
|
||||
itemID |= 0x8000;
|
||||
}
|
||||
|
||||
Stream.Write(HairInfo.FakeSerial(beheld));
|
||||
Stream.Write((ushort)itemID);
|
||||
Stream.Write((byte)Layer.Hair);
|
||||
|
||||
if (writeHue)
|
||||
{
|
||||
Stream.Write((short)hue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (beheld.FacialHairItemID > 0)
|
||||
{
|
||||
if (m_DupedLayers[(int)Layer.FacialHair] != m_Version)
|
||||
{
|
||||
m_DupedLayers[(int)Layer.FacialHair] = m_Version;
|
||||
hue = beheld.FacialHairHue;
|
||||
|
||||
if (beheld.SolidHueOverride >= 0)
|
||||
{
|
||||
hue = beheld.SolidHueOverride;
|
||||
}
|
||||
|
||||
var itemID = beheld.FacialHairItemID & 0x7FFF;
|
||||
|
||||
var writeHue = hue != 0;
|
||||
|
||||
if (writeHue)
|
||||
{
|
||||
itemID |= 0x8000;
|
||||
}
|
||||
|
||||
Stream.Write(FacialHairInfo.FakeSerial(beheld));
|
||||
Stream.Write((ushort)itemID);
|
||||
Stream.Write((byte)Layer.FacialHair);
|
||||
|
||||
if (writeHue)
|
||||
{
|
||||
Stream.Write((short)hue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Stream.Write(0); // terminate
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*************************************************************************
|
||||
* ModernUO *
|
||||
* Copyright (C) 2019-2020 - ModernUO Development Team *
|
||||
* Copyright 2019-2020 - ModernUO Development Team *
|
||||
* Email: hi@modernuo.com *
|
||||
* File: MovementPackets.cs *
|
||||
* *
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*************************************************************************
|
||||
* ModernUO *
|
||||
* Copyright (C) 2019-2020 - ModernUO Development Team *
|
||||
* Copyright 2019-2020 - ModernUO Development Team *
|
||||
* Email: hi@modernuo.com *
|
||||
* File: ObjectHelpResponsePackets.cs *
|
||||
* *
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*************************************************************************
|
||||
* ModernUO *
|
||||
* Copyright (C) 2019-2020 - ModernUO Development Team *
|
||||
* Copyright 2019-2020 - ModernUO Development Team *
|
||||
* Email: hi@modernuo.com *
|
||||
* File: PlayerPackets.cs *
|
||||
* *
|
||||
|
|
@ -290,10 +290,14 @@ namespace Server.Network
|
|||
byte flags = 0x00;
|
||||
|
||||
if (warmode)
|
||||
{
|
||||
flags |= 0x01;
|
||||
}
|
||||
|
||||
if (canLift)
|
||||
{
|
||||
flags |= 0x02;
|
||||
}
|
||||
|
||||
Stream.Write(m);
|
||||
Stream.WriteAsciiFixed(title, 60);
|
||||
|
|
@ -328,7 +332,9 @@ namespace Server.Network
|
|||
public static Packet GetInstance(MusicName name)
|
||||
{
|
||||
if (name == MusicName.Invalid)
|
||||
{
|
||||
return InvalidInstance;
|
||||
}
|
||||
|
||||
var v = (int)name;
|
||||
Packet p;
|
||||
|
|
@ -338,7 +344,9 @@ namespace Server.Network
|
|||
p = m_Instances[v];
|
||||
|
||||
if (p == null)
|
||||
{
|
||||
m_Instances[v] = p = SetStatic(new PlayMusic(name));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*************************************************************************
|
||||
* ModernUO *
|
||||
* Copyright (C) 2019-2020 - ModernUO Development Team *
|
||||
* Copyright 2019-2020 - ModernUO Development Team *
|
||||
* Email: hi@modernuo.com *
|
||||
* File: SecureTradePackets.cs *
|
||||
* *
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*************************************************************************
|
||||
* ModernUO *
|
||||
* Copyright (C) 2019-2020 - ModernUO Development Team *
|
||||
* Copyright 2019-2020 - ModernUO Development Team *
|
||||
* Email: hi@modernuo.com *
|
||||
* File: TargetPackets.cs *
|
||||
* *
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*************************************************************************
|
||||
* ModernUO *
|
||||
* Copyright (C) 2019-2020 - ModernUO Development Team *
|
||||
* Copyright 2019-2020 - ModernUO Development Team *
|
||||
* Email: hi@modernuo.com *
|
||||
* File: UnicodePromptPackets.cs *
|
||||
* *
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*************************************************************************
|
||||
* ModernUO *
|
||||
* Copyright (C) 2019-2020 - ModernUO Development Team *
|
||||
* Copyright 2019-2020 - ModernUO Development Team *
|
||||
* Email: hi@modernuo.com *
|
||||
* File: VendorBuyPackets.cs *
|
||||
* *
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*************************************************************************
|
||||
* ModernUO *
|
||||
* Copyright (C) 2019-2020 - ModernUO Development Team *
|
||||
* Copyright 2019-2020 - ModernUO Development Team *
|
||||
* Email: hi@modernuo.com *
|
||||
* File: VendorSellPackets.cs *
|
||||
* *
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*************************************************************************
|
||||
* ModernUO *
|
||||
* Copyright (C) 2019-2020 - ModernUO Development Team *
|
||||
* Copyright 2019-2020 - ModernUO Development Team *
|
||||
* Email: hi@modernuo.com *
|
||||
* File: ServerConnectionHandler.cs *
|
||||
* *
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*************************************************************************
|
||||
* ModernUO *
|
||||
* Copyright (C) 2019-2020 - ModernUO Development Team *
|
||||
* Copyright 2019-2020 - ModernUO Development Team *
|
||||
* Email: hi@modernuo.com *
|
||||
* File: ServerInfo.cs *
|
||||
* *
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*************************************************************************
|
||||
* ModernUO *
|
||||
* Copyright (C) 2019-2020 - ModernUO Development Team *
|
||||
* Copyright 2019-2020 - ModernUO Development Team *
|
||||
* Email: hi@modernuo.com *
|
||||
* File: ServerStartup.cs *
|
||||
* *
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*************************************************************************
|
||||
* ModernUO *
|
||||
* Copyright (C) 2019-2020 - ModernUO Development Team *
|
||||
* Copyright 2019-2020 - ModernUO Development Team *
|
||||
* Email: hi@modernuo.com *
|
||||
* File: StaticPacketHandlers.cs *
|
||||
* *
|
||||
|
|
@ -50,7 +50,9 @@ namespace Server.Network
|
|||
public static OPLInfo FreeOPLInfoPacket(IPropertyListObject obj)
|
||||
{
|
||||
if (OPLInfoPackets.TryRemove(obj, out var p))
|
||||
{
|
||||
Packet.Release(p);
|
||||
}
|
||||
|
||||
return p;
|
||||
}
|
||||
|
|
@ -71,7 +73,9 @@ namespace Server.Network
|
|||
public static void FreeRemoveItemPacket(IEntity entity)
|
||||
{
|
||||
if (RemoveEntityPackets.TryRemove(entity, out var p))
|
||||
{
|
||||
Packet.Release(p);
|
||||
}
|
||||
}
|
||||
|
||||
public static WorldItem GetWorldItemPacket(Item item)
|
||||
|
|
@ -116,13 +120,19 @@ namespace Server.Network
|
|||
public static void FreeWorldItemPackets(Item item)
|
||||
{
|
||||
if (WorldItemPackets.TryRemove(item, out var wi))
|
||||
{
|
||||
Packet.Release(wi);
|
||||
}
|
||||
|
||||
if (WorldItemSAPackets.TryRemove(item, out var wisa))
|
||||
{
|
||||
Packet.Release(wisa);
|
||||
}
|
||||
|
||||
if (WorldItemHSPackets.TryRemove(item, out var wihs))
|
||||
{
|
||||
Packet.Release(wihs);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*************************************************************************
|
||||
* ModernUO *
|
||||
* Copyright (C) 2019-2020 - ModernUO Development Team *
|
||||
* Copyright 2019-2020 - ModernUO Development Team *
|
||||
* Email: hi@modernuo.com *
|
||||
* File: TcpServer.cs *
|
||||
* *
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue