/* Thor Server 2.0 Project - Codenamed "Stockholm" Copyright 2008 - 2009 Joe Hegarty This file is part of The Thor Server 2.0 Project - Codenamed "Stockholm". The Thor Server 2.0 Project - Codenamed "Stockholm" is free software: you can redistribute it and/or modify it under the terms of the Microsoft Public License The Thor Server Project is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Microsoft Public License for more details. You should have received a copy of the Microsoft Public License along with The Thor Server Project. If not, see http://www.opensource.org/licenses/ms-pl.html */ using System; using System.Collections.Generic; using StockholmLibrary.Net; using StockholmLibrary.Util; namespace StockholmLibrary.Game.Packets.Server { //------------------------------------ public class CreatureStatus { //------------------------------------ public class ExtraStatus { } //------------------------------------ public class MovementStatus : ExtraStatus { public IsometricPoint Position = new IsometricPoint(); } public int CreatureID; public IsometricPoint Position = new IsometricPoint(); public int Orientation; public int HeadOrientation = -1; public List ExtraStatuses = new List(); } //------------------------------------ public class StatusPacket : ServerPacket { List _statusList; //********************************************** public StatusPacket() { _packetType = EServerPacket.STATUS; } //********************************************** public StatusPacket(CreatureStatus status) { _packetType = EServerPacket.STATUS; _statusList = new List(); _statusList.Add(status); } //********************************************** public StatusPacket(List statuses) { _packetType = EServerPacket.STATUS; _statusList = statuses; } //********************************************** protected override void SerialiseBody() { if (_statusList != null) { foreach (var status in _statusList) { SerialiseStatus(status); WriteByte(0xD); // Chr13 } } } //********************************************** private void SerialiseStatus(CreatureStatus status) { WriteStringInt(status.CreatureID); WriteByteRaw(0x20); // Space WriteStringInt(status.Position.X); WriteByteRaw(0x2C); // Comma WriteStringInt(status.Position.Y); WriteByteRaw(0x2C); // Comma WriteStringFloat(status.Position.Z); WriteByteRaw(0x2C); // Comma // TODO: Remove this workaround once head orientations are sorted if (status.HeadOrientation == -1) { WriteStringInt(status.Orientation); } else { WriteStringInt(status.HeadOrientation); } WriteByteRaw(0x2C); // Comma WriteStringInt(status.Orientation); SerialiseExtraStatuses(status); } //********************************************** private void SerialiseExtraStatuses(CreatureStatus status) { if (status.ExtraStatuses != null) { foreach (var extra in status.ExtraStatuses) { WriteByte(0x2F); // / if (extra is CreatureStatus.MovementStatus) SerialiseMovementStatus((CreatureStatus.MovementStatus)extra); } } } //********************************************** private void SerialiseMovementStatus(CreatureStatus.MovementStatus status) { WriteStringRaw("mv"); WriteByteRaw(0x20); // Space WriteStringInt(status.Position.X); WriteByteRaw(0x2C); // Comma WriteStringInt(status.Position.Y); WriteByteRaw(0x2C); // Comma WriteStringFloat(status.Position.Z); } } }