Revert "Updates Packets & Randomizer (#43)" (#61)

This reverts commit 179cb50557.
This commit is contained in:
Kamron Batman 2019-11-11 08:46:11 -08:00 • committed by GitHub
parent 179cb50557
commit c2ecc76457
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
588 changed files with 16260 additions and 10926 deletions

View file

@ -26,6 +26,7 @@ using Server.Accounting;
using Server.ContextMenus;
using Server.Diagnostics;
using Server.Gumps;
using Server.HuePickers;
using Server.Items;
using Server.Menus;
using Server.Prompts;
@ -55,6 +56,11 @@ namespace Server.Network
public static class PacketHandlers
{
public delegate void PlayCharCallback(NetState state, bool val);
private const int BadFood = unchecked((int)0xBAADF00D);
private const int BadUOTD = unchecked((int)0xFFCEFFCE);
private const int m_AuthIDWindowSize = 128;
private static PacketHandler[] m_6017Handlers;
@ -103,32 +109,43 @@ namespace Server.Network
Register(0x01, 5, false, Disconnect);
Register(0x02, 7, true, MovementReq);
Register(0x03, 0, true, AsciiSpeech);
Register(0x04, 2, true, GodModeRequest);
Register(0x05, 5, true, AttackReq);
Register(0x06, 5, true, UseReq);
Register(0x07, 7, true, LiftReq);
Register(0x08, 14, true, DropReq);
Register(0x09, 5, true, LookReq);
Register(0x0A, 11, true, Edit);
Register(0x12, 0, true, TextCommand);
Register(0x13, 10, true, EquipReq);
Register(0x14, 6, true, ChangeZ);
Register(0x22, 3, true, Resynchronize);
Register(0x2C, 2, true, DeathStatusResponse);
Register(0x34, 10, true, MobileQuery);
Register(0x3A, 0, true, ChangeSkillLock);
Register(0x3B, 0, true, VendorBuyReply);
Register(0x47, 11, true, NewTerrain);
Register(0x48, 73, true, NewAnimData);
Register(0x58, 106, true, NewRegion);
Register(0x5D, 73, false, PlayCharacter);
Register(0x61, 9, true, DeleteStatic);
Register(0x6C, 19, true, TargetResponse);
Register(0x6F, 0, true, SecureTrade);
Register(0x72, 5, true, SetWarMode);
Register(0x73, 2, false, PingReq);
Register(0x75, 35, true, RenameRequest);
Register(0x79, 9, true, ResourceQuery);
Register(0x7E, 2, true, GodviewQuery);
Register(0x7D, 13, true, MenuResponse);
Register(0x80, 62, false, AccountLogin);
Register(0x83, 39, false, DeleteCharacter);
Register(0x91, 65, false, GameLogin);
Register(0x95, 9, true, HuePickerResponse);
Register(0x96, 0, true, GameCentralMoniter);
Register(0x98, 0, true, MobileNameRequest);
Register(0x9A, 0, true, AsciiPromptResponse);
Register(0x9B, 258, true, HelpRequest);
Register(0x9D, 51, true, GMSingle);
Register(0x9F, 0, true, VendorSellReply);
Register(0xA0, 3, false, PlayServer);
Register(0xA4, 149, false, SystemInfo);
@ -144,6 +161,8 @@ namespace Server.Network
Register(0xBF, 0, true, ExtendedCommand);
Register(0xC2, 0, true, UnicodePromptResponse);
Register(0xC8, 2, true, SetUpdateRange);
Register(0xC9, 6, true, TripTime);
Register(0xCA, 6, true, UTripTime);
Register(0xCF, 0, false, AccountLogin);
Register(0xD0, 0, true, ConfigurationFile);
Register(0xD1, 2, true, LogoutReq);
@ -195,7 +214,9 @@ namespace Server.Network
public static void Register(int packetID, int length, bool ingame, OnPacketReceive onReceive)
{
Handlers[packetID] = new PacketHandler(packetID, length, ingame, onReceive);
m_6017Handlers[packetID] ??= new PacketHandler(packetID, length, ingame, onReceive);
if (m_6017Handlers[packetID] == null)
m_6017Handlers[packetID] = new PacketHandler(packetID, length, ingame, onReceive);
}
public static PacketHandler GetHandler(int packetID) => Handlers[packetID];
@ -321,8 +342,6 @@ namespace Server.Network
return -1;
}
// Console.WriteLine("Packet Handler {0:X}", handler.PacketID);
long packetLength = handler.Length;
if (handler.Length <= 0 && r.Length >= 3)
{
@ -394,9 +413,9 @@ namespace Server.Network
public static void EncodedCommand(NetState state, PacketReader pvSrc)
{
IEntity e = World.FindEntity(pvSrc.ReadUInt32());
int packetId = pvSrc.ReadUInt16();
int packetID = pvSrc.ReadUInt16();
EncodedPacketHandler ph = GetEncodedHandler(packetId);
EncodedPacketHandler ph = GetEncodedHandler(packetID);
if (ph != null)
{
@ -404,7 +423,7 @@ namespace Server.Network
{
Console.WriteLine(
"Client: {0}: Sent ingame packet (0xD7x{1:X2}) before having been attached to a mobile", state,
packetId);
packetID);
state.Dispose();
}
else if (ph.Ingame && state.Mobile.Deleted)
@ -517,30 +536,37 @@ namespace Server.Network
if (vendor == null)
return;
if (vendor.Deleted || !Utility.RangeCheck(vendor.Location, state.Mobile.Location, 10) || flag != 0x02)
if (vendor.Deleted || !Utility.RangeCheck(vendor.Location, state.Mobile.Location, 10))
{
Packets.SendEndVendorBuyOrSell(state, vendor.Serial);
state.Send(new EndVendorBuy(vendor));
return;
}
msgSize -= 1 + 2 + 4 + 1;
if (msgSize / 7 > 100)
return;
List<BuyItemResponse> buyList = new List<BuyItemResponse>(msgSize / 7);
while (msgSize > 0)
if (flag == 0x02)
{
pvSrc.ReadByte(); // layer
Serial serial = pvSrc.ReadUInt32();
int amount = pvSrc.ReadInt16();
msgSize -= 1 + 2 + 4 + 1;
buyList.Add(new BuyItemResponse(serial, amount));
msgSize -= 7;
if (msgSize / 7 > 100)
return;
List<BuyItemResponse> buyList = new List<BuyItemResponse>(msgSize / 7);
while (msgSize > 0)
{
byte layer = pvSrc.ReadByte();
Serial serial = pvSrc.ReadUInt32();
int amount = pvSrc.ReadInt16();
buyList.Add(new BuyItemResponse(serial, amount));
msgSize -= 7;
}
if (buyList.Count > 0 && vendor is IVendor v && v.OnBuyItems(state.Mobile, buyList))
state.Send(new EndVendorBuy(vendor));
}
else
{
state.Send(new EndVendorBuy(vendor));
}
if (buyList.Count > 0 && vendor is IVendor v && v.OnBuyItems(state.Mobile, buyList))
Packets.SendEndVendorBuyOrSell(state, vendor.Serial);
}
public static void VendorSellReply(NetState state, PacketReader pvSrc)
@ -552,7 +578,7 @@ namespace Server.Network
if (vendor.Deleted || !Utility.RangeCheck(vendor.Location, state.Mobile.Location, 10))
{
Packets.SendEndVendorBuyOrSell(state, vendor.Serial);
state.Send(new EndVendorSell(vendor));
return;
}
@ -564,14 +590,14 @@ namespace Server.Network
for (int i = 0; i < count; i++)
{
Item item = World.FindItem(pvSrc.ReadUInt32());
int amount = pvSrc.ReadInt16();
int Amount = pvSrc.ReadInt16();
if (item != null && amount > 0)
sellList.Add(new SellItemResponse(item, amount));
if (item != null && Amount > 0)
sellList.Add(new SellItemResponse(item, Amount));
}
if (sellList.Count > 0 && vendor is IVendor v && v.OnSellItems(state.Mobile, sellList))
Packets.SendEndVendorBuyOrSell(state, vendor.Serial);
state.Send(new EndVendorSell(vendor));
}
}
@ -583,6 +609,39 @@ namespace Server.Network
EventSink.InvokeDeleteRequest(new DeleteRequestEventArgs(state, index));
}
public static void ResourceQuery(NetState state, PacketReader pvSrc)
{
if (VerifyGC(state))
{
}
}
public static void GameCentralMoniter(NetState state, PacketReader pvSrc)
{
if (VerifyGC(state))
{
int type = pvSrc.ReadByte();
int num1 = pvSrc.ReadInt32();
Console.WriteLine("God Client: {0}: Game central moniter", state);
Console.WriteLine(" - Type: {0}", type);
Console.WriteLine(" - Number: {0}", num1);
pvSrc.Trace(state);
}
}
public static void GodviewQuery(NetState state, PacketReader pvSrc)
{
if (VerifyGC(state)) Console.WriteLine("God Client: {0}: Godview query 0x{1:X}", state, pvSrc.ReadByte());
}
public static void GMSingle(NetState state, PacketReader pvSrc)
{
if (VerifyGC(state))
pvSrc.Trace(state);
}
public static void DeathStatusResponse(NetState state, PacketReader pvSrc)
{
// Ignored
@ -618,7 +677,7 @@ namespace Server.Network
Mobile m = World.FindMobile(pvSrc.ReadUInt32());
if (m != null && Utility.InUpdateRange(state.Mobile, m) && state.Mobile.CanSee(m))
Packets.SendMobileName(state, m);
state.Send(new MobileName(m));
}
public static void RequestScrollWindow(NetState state, PacketReader pvSrc)
@ -655,6 +714,34 @@ namespace Server.Network
}
}
public static void TripTime(NetState state, PacketReader pvSrc)
{
int unk1 = pvSrc.ReadByte();
int unk2 = pvSrc.ReadInt32();
state.Send(new TripTimeResponse(unk1));
}
public static void UTripTime(NetState state, PacketReader pvSrc)
{
int unk1 = pvSrc.ReadByte();
int unk2 = pvSrc.ReadInt32();
state.Send(new UTripTimeResponse(unk1));
}
public static void ChangeZ(NetState state, PacketReader pvSrc)
{
if (VerifyGC(state))
{
int x = pvSrc.ReadInt16();
int y = pvSrc.ReadInt16();
int z = pvSrc.ReadSByte();
Console.WriteLine("God Client: {0}: Change Z ({1}, {2}, {3})", state, x, y, z);
}
}
public static void SystemInfo(NetState state, PacketReader pvSrc)
{
int v1 = pvSrc.ReadByte();
@ -671,6 +758,83 @@ namespace Server.Network
int v8 = pvSrc.ReadInt32();
}
public static void Edit(NetState state, PacketReader pvSrc)
{
if (VerifyGC(state))
{
int type = pvSrc.ReadByte(); // 10 = static, 7 = npc, 4 = dynamic
int x = pvSrc.ReadInt16();
int y = pvSrc.ReadInt16();
int id = pvSrc.ReadInt16();
int z = pvSrc.ReadSByte();
int hue = pvSrc.ReadUInt16();
Console.WriteLine("God Client: {0}: Edit {6} ({1}, {2}, {3}) 0x{4:X} (0x{5:X})", state, x, y, z, id, hue,
type);
}
}
public static void DeleteStatic(NetState state, PacketReader pvSrc)
{
if (VerifyGC(state))
{
int x = pvSrc.ReadInt16();
int y = pvSrc.ReadInt16();
int z = pvSrc.ReadInt16();
int id = pvSrc.ReadUInt16();
Console.WriteLine("God Client: {0}: Delete Static ({1}, {2}, {3}) 0x{4:X}", state, x, y, z, id);
}
}
public static void NewAnimData(NetState state, PacketReader pvSrc)
{
if (VerifyGC(state))
{
Console.WriteLine("God Client: {0}: New tile animation", state);
pvSrc.Trace(state);
}
}
public static void NewTerrain(NetState state, PacketReader pvSrc)
{
if (VerifyGC(state))
{
int x = pvSrc.ReadInt16();
int y = pvSrc.ReadInt16();
int id = pvSrc.ReadUInt16();
int width = pvSrc.ReadInt16();
int height = pvSrc.ReadInt16();
Console.WriteLine("God Client: {0}: New Terrain ({1}, {2})+({3}, {4}) 0x{5:X4}", state, x, y, width, height,
id);
}
}
public static void NewRegion(NetState state, PacketReader pvSrc)
{
if (VerifyGC(state))
{
string name = pvSrc.ReadString(40);
int unk = pvSrc.ReadInt32();
int x = pvSrc.ReadInt16();
int y = pvSrc.ReadInt16();
int width = pvSrc.ReadInt16();
int height = pvSrc.ReadInt16();
int zStart = pvSrc.ReadInt16();
int zEnd = pvSrc.ReadInt16();
string desc = pvSrc.ReadString(40);
int soundFX = pvSrc.ReadInt16();
int music = pvSrc.ReadInt16();
int nightFX = pvSrc.ReadInt16();
int dungeon = pvSrc.ReadByte();
int light = pvSrc.ReadInt16();
Console.WriteLine("God Client: {0}: New Region '{1}' ('{2}')", state, name, desc);
}
}
public static void AccountID(NetState state, PacketReader pvSrc)
{
}
@ -806,6 +970,12 @@ namespace Server.Network
}
}
public static void GodModeRequest(NetState state, PacketReader pvSrc)
{
if (VerifyGC(state))
state.Send(new GodModeReply(pvSrc.ReadBoolean()));
}
public static void AsciiPromptResponse(NetState state, PacketReader pvSrc)
{
uint serial = pvSrc.ReadUInt32();
@ -1030,12 +1200,14 @@ namespace Server.Network
public static void LogoutReq(NetState state, PacketReader pvSrc)
{
Packets.SendLogoutAck(state);
state.Send(new LogoutAck());
}
public static void ChangeSkillLock(NetState state, PacketReader pvSrc)
{
state.Mobile.Skills[pvSrc.ReadInt16()]?.SetLockNoRelay((SkillLock)pvSrc.ReadByte());
Skill s = state.Mobile.Skills[pvSrc.ReadInt16()];
s?.SetLockNoRelay((SkillLock)pvSrc.ReadByte());
}
public static void HelpRequest(NetState state, PacketReader pvSrc)
@ -1046,13 +1218,13 @@ namespace Server.Network
public static void TargetResponse(NetState state, PacketReader pvSrc)
{
int type = pvSrc.ReadByte();
int targetId = pvSrc.ReadInt32();
int targetID = pvSrc.ReadInt32();
int flags = pvSrc.ReadByte();
Serial serial = pvSrc.ReadUInt32();
int x = pvSrc.ReadInt16(), y = pvSrc.ReadInt16(), z = pvSrc.ReadInt16();
int graphic = pvSrc.ReadUInt16();
if (targetId == unchecked((int)0xDEADBEEF))
if (targetID == unchecked((int)0xDEADBEEF))
return;
Mobile from = state.Mobile;
@ -1072,7 +1244,7 @@ namespace Server.Network
// User pressed escape
t.Cancel(from, TargetCancelType.Canceled);
}
else if (t.TargetID != targetId)
else if (t.TargetID != targetID)
{
// Sanity, prevent fake target
}
@ -1095,28 +1267,42 @@ namespace Server.Network
t.Cancel(from, TargetCancelType.Canceled);
return;
}
StaticTile[] tiles = map.Tiles.GetStaticTiles(x, y, !t.DisallowMultis);
if (state.HighSeas)
else
{
ItemData id = TileData.ItemTable[graphic & TileData.MaxItemValue];
if (id.Surface) z -= id.Height;
}
StaticTile[] tiles = map.Tiles.GetStaticTiles(x, y, !t.DisallowMultis);
if (tiles.All(tile => tile.Z != z || tile.ID != graphic))
{
t.Cancel(from, TargetCancelType.Canceled);
return;
}
bool valid = false;
toTarget = new StaticTarget(new Point3D(x, y, z), graphic);
if (state.HighSeas)
{
ItemData id = TileData.ItemTable[graphic & TileData.MaxItemValue];
if (id.Surface) z -= id.Height;
}
for (int i = 0; !valid && i < tiles.Length; ++i)
if (tiles[i].Z == z && tiles[i].ID == graphic)
valid = true;
if (!valid)
{
t.Cancel(from, TargetCancelType.Canceled);
return;
}
else
{
toTarget = new StaticTarget(new Point3D(x, y, z), graphic);
}
}
}
}
else if (serial.IsMobile)
{
toTarget = World.FindMobile(serial);
}
else if (serial.IsItem)
{
toTarget = World.FindItem(serial);
}
else
{
t.Cancel(from, TargetCancelType.Canceled);
@ -1252,8 +1438,13 @@ namespace Server.Network
{
Mobile m = state.Mobile;
Packets.SendMobileUpdate(state, m);
Packets.SendMobileIncoming(state, m, m);
if (state.StygianAbyss)
state.Send(new MobileUpdate(m));
else
state.Send(new MobileUpdateOld(m));
state.Send(MobileIncoming.Create(state, m, m));
m.SendEverything();
state.Sequence = 0;
@ -1305,24 +1496,24 @@ namespace Server.Network
for (int i = 0; i < count; ++i)
{
int speechId;
int speechID;
if ((i & 1) == 0)
{
hold <<= 8;
hold |= pvSrc.ReadByte();
speechId = hold;
speechID = hold;
hold = 0;
}
else
{
value = pvSrc.ReadInt16();
speechId = (value & 0xFFF0) >> 4;
speechID = (value & 0xFFF0) >> 4;
hold = value & 0xF;
}
if (!keyList.Contains(speechId))
keyList.Add(speechId);
if (!keyList.Contains(speechID))
keyList.Add(speechID);
}
text = pvSrc.ReadUTF8StringSafe();
@ -1359,7 +1550,9 @@ namespace Server.Network
uint value = pvSrc.ReadUInt32();
if ((value & ~0x7FFFFFFF) != 0)
{
from.OnPaperdollRequest();
}
else
{
Serial s = value;
@ -1383,7 +1576,9 @@ namespace Server.Network
from.NextActionTime = Core.TickCount + Mobile.ActionDelay;
}
else
{
from.SendActionMessage();
}
}
public static void LookReq(NetState state, PacketReader pvSrc)
@ -1399,7 +1594,9 @@ namespace Server.Network
if (m != null && from.CanSee(m) && Utility.InUpdateRange(from, m))
{
if (SingleClickProps)
{
m.OnAosSingleClick(from);
}
else
{
if (from.Region.OnSingleClick(from, m))
@ -1415,7 +1612,9 @@ namespace Server.Network
Utility.InUpdateRange(from.Location, item.GetWorldLocation()))
{
if (SingleClickProps)
{
item.OnAosSingleClick(from);
}
else if (from.Region.OnSingleClick(from, item))
{
if (item.Parent is Item item1)
@ -1429,25 +1628,25 @@ namespace Server.Network
public static void PingReq(NetState state, PacketReader pvSrc)
{
Packets.SendPingAck(state, pvSrc.ReadByte());
state.Send(PingAck.Instantiate(pvSrc.ReadByte()));
}
public static void SetUpdateRange(NetState state, PacketReader pvSrc)
{
Packets.SendChangeUpdateRange(state);
state.Send(ChangeUpdateRange.Instantiate(18));
}
public static void MovementReq(NetState state, PacketReader pvSrc)
{
Direction dir = (Direction)pvSrc.ReadByte();
byte seq = pvSrc.ReadByte();
pvSrc.ReadInt32(); // key
int seq = pvSrc.ReadByte();
int key = pvSrc.ReadInt32();
Mobile m = state.Mobile;
if (state.Sequence == 0 && seq != 0 || !m.Move(dir))
{
Packets.SendMovementRej(state, seq, m);
state.Send(new MovementRej(seq, m));
state.Sequence = 0;
m.ClearFastwalkStack();
@ -1456,7 +1655,7 @@ namespace Server.Network
{
++seq;
if (seq == 0)
if (seq == 256)
seq = 1;
state.Sequence = seq;
@ -1489,7 +1688,7 @@ namespace Server.Network
{
int packetID = pvSrc.ReadUInt16();
// Console.WriteLine("Extended Packet: {0:X}", packetID);
Console.WriteLine("Extended Packet: {0:X}", packetID);
PacketHandler ph = GetExtendedHandler(packetID);
if (ph == null)
@ -1863,6 +2062,13 @@ namespace Server.Network
if (m != null)
switch (type)
{
case 0x00: // Unknown, sent by godclient
{
if (VerifyGC(state))
Console.WriteLine("God Client: {0}: Query 0x{1:X2} on {2} '{3}'", state, type, m.Serial, m.Name);
break;
}
case 0x04: // Stats
{
m.OnStatsQuery(from);
@ -1887,17 +2093,47 @@ namespace Server.Network
string name = pvSrc.ReadString(30);
pvSrc.ReadInt16(); // Unknown
pvSrc.Seek(2, SeekOrigin.Current);
int flags = pvSrc.ReadInt32();
pvSrc.Seek(24, SeekOrigin.Current);
/* if (FeatureProtection.DisabledFeatures != 0 && ThirdPartyAuthCallback != null)
{
bool authOK = false;
ulong razorFeatures = ((ulong)pvSrc.ReadUInt32() << 32) | pvSrc.ReadUInt32();
if (razorFeatures == (ulong)FeatureProtection.DisabledFeatures)
{
bool doesNotMatch = false;
for (int i = 0; !doesNotMatch && i < m_ThirdPartyAuthKey.Length; i++)
doesNotMatch = pvSrc.ReadByte() != m_ThirdPartyAuthKey[i];
if (!doesNotMatch)
authOK = true;
}
else
{
pvSrc.Seek(16, SeekOrigin.Current);
}
ThirdPartyAuthCallback(state, authOK);
}*/
/* else
{*/
pvSrc.Seek(24, SeekOrigin.Current);
/* }*/
/* if (ThirdPartyHackedCallback != null)
{
pvSrc.Seek(-2, SeekOrigin.Current);
if (pvSrc.ReadUInt16() == 0xDEAD)
ThirdPartyHackedCallback(state, true);
}*/
if (!state.Running)
return;
int charSlot = pvSrc.ReadInt32();
// TODO: Handle IP address.
int clientIP = pvSrc.ReadInt32();
IAccount a = state.Account;
@ -1916,7 +2152,7 @@ namespace Server.Network
if (check != null && check.Map != Map.Internal && check != m)
{
Console.WriteLine("Login: {0}: Account in use", state);
Packets.SendPopupMessage(state, PMMessage.CharInWorld);
state.Send(new PopupMessage(PMMessage.CharInWorld));
return;
}
}
@ -1931,9 +2167,11 @@ namespace Server.Network
// TODO: Make this wait one tick so we don't have to call it unnecessarily
NetState.ProcessDisposedQueue();
Packets.SendClientVersionReq(state);
state.Send(new ClientVersionReq());
state.BlockAllPackets = true;
state.Flags = (ClientFlags)flags;
state.Mobile = m;
@ -1945,38 +2183,93 @@ namespace Server.Network
public static void DoLogin(NetState state, Mobile m)
{
Packets.SendLoginConfirm(state, m);
state.Send(new LoginConfirm(m));
if (m.Map != null)
Packets.SendMapChange(state, m.Map);
state.Send(new MapChange(m));
Packets.SendMapPatches(state);
Packets.SendSeasonChange(state, m.GetSeason(), 1);
Packets.SendSupportedFeatures(state);
state.Send(new MapPatches());
state.Send(SeasonChange.Instantiate(m.GetSeason(), true));
state.Send(SupportedFeatures.Instantiate(state));
state.Sequence = 0;
// TODO: Verify if we need this twice
Packets.SendMobileUpdate(state, m);
m.CheckLightLevels(true);
Packets.SendMobileUpdate(state, m);
if (state.NewMobileIncoming)
{
state.Send(new MobileUpdate(m));
state.Send(new MobileUpdate(m));
Packets.SendMobileIncoming(state, m, m);
Packets.SendMobileStatus(state, m, m);
Packets.SendSetWarMode(state, m.Warmode);
m.CheckLightLevels(true);
m.SendEverything();
state.Send(new MobileUpdate(m));
Packets.SendSupportedFeatures(state);
Packets.SendMobileUpdate(state, m);
Packets.SendMobileStatus(state, m, m);
Packets.SendSetWarMode(state, m.Warmode);
Packets.SendMobileIncoming(state, m, m);
state.Send(new MobileIncoming(m, m));
//state.Send( new MobileAttributes( m ) );
state.Send(new MobileStatus(m, m));
state.Send(Network.SetWarMode.Instantiate(m.Warmode));
Packets.SendLoginComplete(state);
Packets.SendCurrentTime(state);
Packets.SendMapChange(state, m.Map);
Packets.SendSeasonChange(state, m.GetSeason(), 1);
m.SendEverything();
state.Send(SupportedFeatures.Instantiate(state));
state.Send(new MobileUpdate(m));
//state.Send( new MobileAttributes( m ) );
state.Send(new MobileStatus(m, m));
state.Send(Network.SetWarMode.Instantiate(m.Warmode));
state.Send(new MobileIncoming(m, m));
}
else if (state.StygianAbyss)
{
state.Send(new MobileUpdate(m));
state.Send(new MobileUpdate(m));
m.CheckLightLevels(true);
state.Send(new MobileUpdate(m));
state.Send(new MobileIncomingSA(m, m));
//state.Send( new MobileAttributes( m ) );
state.Send(new MobileStatus(m, m));
state.Send(Network.SetWarMode.Instantiate(m.Warmode));
m.SendEverything();
state.Send(SupportedFeatures.Instantiate(state));
state.Send(new MobileUpdate(m));
//state.Send( new MobileAttributes( m ) );
state.Send(new MobileStatus(m, m));
state.Send(Network.SetWarMode.Instantiate(m.Warmode));
state.Send(new MobileIncomingSA(m, m));
}
else
{
state.Send(new MobileUpdateOld(m));
state.Send(new MobileUpdateOld(m));
m.CheckLightLevels(true);
state.Send(new MobileUpdateOld(m));
state.Send(new MobileIncomingOld(m, m));
//state.Send( new MobileAttributes( m ) );
state.Send(new MobileStatus(m, m));
state.Send(Network.SetWarMode.Instantiate(m.Warmode));
m.SendEverything();
state.Send(SupportedFeatures.Instantiate(state));
state.Send(new MobileUpdateOld(m));
//state.Send( new MobileAttributes( m ) );
state.Send(new MobileStatus(m, m));
state.Send(Network.SetWarMode.Instantiate(m.Warmode));
state.Send(new MobileIncomingOld(m, m));
}
state.Send(LoginComplete.Instance);
state.Send(new CurrentTime());
state.Send(SeasonChange.Instantiate(m.GetSeason(), true));
state.Send(new MapChange(m));
EventSink.InvokeLogin(new LoginEventArgs(m));
@ -2041,14 +2334,20 @@ namespace Server.Network
race = Race.Races[raceID];
}
else
{
race = Race.Races[(byte)(genderRace / 2)];
}
if (race == null)
race = Race.DefaultRace;
race ??= Race.DefaultRace;
CityInfo[] info = state.CityInfo;
IAccount a = state.Account;
if (info == null || a == null || cityIndex < 0 || cityIndex >= info.Length)
{
state.Dispose();
}
else
{
// Check if anyone is using this account
@ -2059,7 +2358,7 @@ namespace Server.Network
if (check != null && check.Map != Map.Internal)
{
Console.WriteLine("Login: {0}: Account in use", state);
Packets.SendPopupMessage(state, PMMessage.CharInWorld);
state.Send(new PopupMessage(PMMessage.CharInWorld));
return;
}
}
@ -2084,7 +2383,7 @@ namespace Server.Network
race
);
Packets.SendClientVersionReq(state);
state.Send(new ClientVersionReq());
state.BlockAllPackets = true;
@ -2154,8 +2453,10 @@ namespace Server.Network
bool female = genderRace % 2 != 0;
byte raceId = (byte)(genderRace < 4 ? 0 : genderRace / 2 - 1);
Race race = Race.Races[raceId] ?? Race.DefaultRace;
Race race;
byte raceID = (byte)(genderRace < 4 ? 0 : genderRace / 2 - 1);
race = Race.Races[raceID] ?? Race.DefaultRace;
CityInfo[] info = state.CityInfo;
IAccount a = state.Account;
@ -2174,7 +2475,7 @@ namespace Server.Network
if (check != null && check.Map != Map.Internal)
{
Console.WriteLine("Login: {0}: Account in use", state);
Packets.SendPopupMessage(state, PMMessage.CharInWorld);
state.Send(new PopupMessage(PMMessage.CharInWorld));
return;
}
}
@ -2200,20 +2501,25 @@ namespace Server.Network
race
);
Packets.SendClientVersionReq(state);
state.Send(new ClientVersionReq());
state.BlockAllPackets = true;
EventSink.InvokeCharacterCreated(args);
Mobile m = args.Mobile;
if (m != null)
{
state.BlockAllPackets = true;
state.Mobile = m;
m.NetState = state;
new LoginTimer(state, m).Start();
}
else
{
state.BlockAllPackets = false;
state.Dispose();
}
}
}
@ -2224,11 +2530,11 @@ namespace Server.Network
int oldestID = 0;
DateTime oldest = DateTime.MaxValue;
foreach (var (key, value) in m_AuthIDWindow)
if (value.Age < oldest)
foreach (KeyValuePair<int, AuthIDPersistence> kvp in m_AuthIDWindow)
if (kvp.Value.Age < oldest)
{
oldestID = key;
oldest = value.Age;
oldestID = kvp.Key;
oldest = kvp.Value.Age;
}
m_AuthIDWindow.Remove(oldestID);
@ -2258,13 +2564,13 @@ namespace Server.Network
}
state.SentFirstPacket = true;
state.UseCompression = true;
int authID = pvSrc.ReadInt32();
if (m_AuthIDWindow.TryGetValue(authID, out AuthIDPersistence ap))
{
m_AuthIDWindow.Remove(authID);
state.Version = ap.Version;
}
else if (ClientVerification)
@ -2298,12 +2604,19 @@ namespace Server.Network
if (e.Accepted)
{
state.CityInfo = e.CityInfo;
state.CompressionEnabled = true;
Packets.SendSupportedFeatures(state);
Packets.SendCharacterList(state, state.CityInfo);
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
{
state.Dispose();
}
}
public static void PlayServer(NetState state, PacketReader pvSrc)
@ -2313,15 +2626,17 @@ namespace Server.Network
IAccount a = state.Account;
if (info == null || a == null || index < 0 || index >= info.Length)
{
state.Dispose();
}
else
{
ServerInfo si = info[index];
state.m_AuthID = GenerateAuthID(state);
state.m_AuthID = PlayServerAck.m_AuthID = GenerateAuthID(state);
state.SentFirstPacket = false;
Packets.SendPlayServerAck(state, si);
state.Send(new PlayServerAck(si));
}
}
@ -2419,13 +2734,13 @@ namespace Server.Network
state.ServerInfo = info;
Packets.SendAccountLoginAck(state, info);
state.Send(new AccountLoginAck(info));
}
}
public static void AccountLogin_ReplyRej(NetState state, ALRReason reason)
{
Packets.SendAccountLoginRej(state, reason);
state.Send(new AccountLoginRej(reason));
state.Dispose();
}
@ -2443,10 +2758,7 @@ namespace Server.Network
protected override void OnTick()
{
if (m_State == null)
{
Stop();
return;
}
if (m_State.Version != null)
{