Example #1
0
 public static void FreeSafe(ServerToClientMessage msg)
 {
     if (msg.IsAllocatedFromPool)
     {
         msg.IsAllocatedFromPool = false;
         safePool.Free(msg);
     }
 }
Example #2
0
        public static void CreateChatMessage(ChatType type, string message, ServerToClientMessage wm)
        {
            if (wm.Sender == null)
                throw (new Exception("wm.Sender can't be NULL on outgoing messages."));

            wm.MessageType = MessageType.S2C_ChatMessage;
            wm.Code = (int)type;
            wm.DeliveryMethod = NetDeliveryMethod.ReliableOrdered;
            wm.DeliveryChannel = 0;
            wm.Data = message;
        }
Example #3
0
        /// <summary>
        /// Formats the ServerToClientMessage with entity data.
        /// Data holds colon separated entity data.
        /// Buffer holds 8 bytes for Id(4), TypeId(4)
        /// </summary>
        /// <param name="e">The entity instance to read data from.</param>
        /// <param name="wm">The ServerToClientMessage instance that will hold the data.</param>
        public static void CreateAddEntityToZoneMessage(Entity e, ServerToClientMessage wm)
        {
            wm.MessageType = MessageType.S2C_ZoneMessage;
            wm.Buffer = new byte[8];
            wm.Code = (int)PlayerAction.AddEntity;
            wm.DeliveryMethod = NetDeliveryMethod.ReliableOrdered;
            wm.DeliveryChannel = 1;

            BitConverter.GetBytes(e.Id).CopyTo(wm.Buffer, 0); // 4b: 0-3 entity Id
            BitConverter.GetBytes(e.TypeId).CopyTo(wm.Buffer, 4); // 1=character, 2=structure, so on,

            wm.Data = GenerateEntityFormat(e);
        }
Example #4
0
        public static void CreateDamageEntityMessage(Entity to, Entity from, int amount, ServerToClientMessage wm)
        {
            wm.MessageType = MessageType.S2C_ZoneMessage;
            wm.Buffer = BitConverter.GetBytes(to.Id);
            wm.Code = (int)PlayerAction.Damage;
            wm.DeliveryMethod = NetDeliveryMethod.ReliableUnordered;
            wm.DeliveryChannel = 0;

            string data = amount.ToString();
            if (from != null)
                data = String.Format("{0}:{1}", amount, from.Id);

            wm.Data = data;
        }
Example #5
0
        public static ServerToClientMessage Copy(ServerToClientMessage a, NetConnection sender)
        {
            ServerToClientMessage wm = safePool.Get();
            Debug.Assert(!wm.IsAllocatedFromPool, "Allocated ServerToClientMessage from pool which is in use!");

            wm.IsAllocatedFromPool = true;
            wm.Sender = sender;
            wm.MessageType = a.MessageType;
            wm.Buffer = a.Buffer;
            wm.Data = a.Data;
            wm.Code = a.Code;
            wm.TurnNumber = a.TurnNumber;
            wm.DeliveryMethod = a.DeliveryMethod;
            wm.DeliveryChannel = a.DeliveryChannel;

            return wm;
        }
Example #6
0
        /// <summary>
        /// Formats a ServerToClientMessage with logout message data.
        /// </summary>
        /// <param name="mpr">Player record of the player logging out.</param>
        /// <param name="turnNumber">Current turn number.</param>
        /// <param name="wm"></param>
        public static void CreateCharacterLogoutMessage(MasterPlayerRecord mpr, int turnNumber, ServerToClientMessage wm)
        {
            if (wm.Sender == null)
                throw (new Exception("Character has null sender, this will crash the MessageSender!"));

            if (mpr.State != ClientState.InWorld)
                wm.MessageType = mpr.LogoutCharacterGranted ? MessageType.S2C_PlayerLoggedOut : MessageType.S2C_LogoutDenied;
            else
                wm.MessageType = mpr.LogoutCharacterGranted ? MessageType.S2C_CharacterLoggedOut : MessageType.S2C_LogoutDenied;

            wm.Code = (int)PlayerAction.RemoveEntity;
            wm.Data = mpr.LogoutCharacterGranted ? "Logout OK" : "Logout denied";
            wm.TurnNumber = turnNumber;
            wm.Buffer = BitConverter.GetBytes(mpr.CharacterId);
            wm.DeliveryChannel = 0;
            wm.DeliveryMethod = NetDeliveryMethod.ReliableUnordered;
        }
Example #7
0
        private void HandleDamage(ServerToClientMessage wm)
        {
            int entityId = BitConverter.ToInt32(wm.Buffer, 0);
            Entity entity = zoneManager.GetEntity(entityId);
            Entity from = null;
            if (entity != null)
            {
                string[] damageData = wm.Data.Split(':');
                int fromId = -1;
                int damageAmount = int.Parse(damageData[0]);
                if (damageData.Length > 1)
                {
                    fromId = int.Parse(damageData[1]);
                    from = zoneManager.GetEntity(fromId);
                    if (from != null)
                        context.WorldManager.FireShot(from, entity);
                }

                Logger.Output(this, "HandleDamage() Doing {0} damage to entity ID {1}", damageAmount, entityId);
            }
            else
                Logger.Output(this, "HandleDamage() failed to damage entity ID {0}, doesn't exist.", entityId);
        }
Example #8
0
        public static void CreateTeleportMessage(Zone newZone, ServerToClientMessage wm)
        {
            if (wm.Sender == null)
                throw (new Exception("wm.Sender can't be NULL on outgoing messages."));

            wm.MessageType = MessageType.S2C_ZoneMessage;
            wm.Buffer = null;
            wm.Code = (int)PlayerAction.Teleport;
            wm.DeliveryMethod = NetDeliveryMethod.ReliableOrdered;
            wm.DeliveryChannel = 0;

            StringBuilder sb = new StringBuilder();
            sb.Append("#Z");
            sb.Append(newZone.Id);
            sb.Append(":");
            sb.Append(newZone.Name);
            sb.Append(":");
            sb.Append(newZone.Width);
            sb.Append(":");
            sb.Append(newZone.Height);

            foreach (Entity entity in newZone.AllEntities)
            {
                if (entity is Character)
                {
                    sb.Append("#C");
                    sb.Append(((Character)entity).ToFormatString());
                }
                else
                {
                    sb.Append("#E");
                    sb.Append(entity.TypeId);
                    sb.Append("|");
                    sb.Append(GenerateEntityFormat(entity));
                }
            }
            wm.Data = sb.ToString();
        }
Example #9
0
        /// <summary>
        /// Formats the ServerToClientMessage with zone data.
        /// Data holds colon separated entity data.
        /// </summary>
        /// <param name="zones">The zone instance(s) to read data from.</param>
        /// <param name="wm">The ServerToClientMessage instance that will hold the data.</param>
        public static void CreateZoneSyncMessage(IEnumerable<Zone> zones, ServerToClientMessage wm)
        {
            if (wm.Sender == null)
                throw (new Exception("wm.Sender can't be NULL on outgoing messages."));

            wm.MessageType = MessageType.S2C_ZoneMessage;
            wm.Buffer = null;
            wm.Code = (int)PlayerAction.AddZone;
            wm.DeliveryMethod = NetDeliveryMethod.ReliableOrdered;
            wm.DeliveryChannel = 1;

            const string ZONE_DELIMITER = "#Z";
            const string CHARACTER_DELIMITER = "#C";
            const string ENTITY_DELIMITER = "#E";

            StringBuilder sb = new StringBuilder();

            // Build a list of entities in zones.
            foreach (Zone zone in zones)
            {
                sb.Append(ZONE_DELIMITER);
                sb.Append(zone.Id);
                sb.Append(":");
                sb.Append(zone.Name);
                sb.Append(":");
                sb.Append(zone.Width);
                sb.Append(":");
                sb.Append(zone.Height);

                foreach (Entity entity in zone.AllEntities)
                {
                    if (entity is Character)
                    {
                        sb.Append(CHARACTER_DELIMITER);
                        sb.Append(((Character)entity).ToFormatString());
                    }
                    else
                    {
                        sb.Append(ENTITY_DELIMITER);
                        sb.Append(entity.TypeId);
                        sb.Append("|");
                        sb.Append(GenerateEntityFormat(entity));
                    }
                }
            }
            wm.Data = sb.ToString();
        }
Example #10
0
 /// <summary>
 /// Formats a RemoveEntity zone message.
 /// </summary>
 /// <param name="entity">The entity to be removed.</param>
 /// <param name="wm">The ServerToClientMessage instance that will hold the data.</param>
 public static void CreateRemoveEntityFromZoneMessage(Entity entity, ServerToClientMessage wm)
 {
     wm.MessageType = MessageType.S2C_ZoneMessage;
     wm.Buffer = BitConverter.GetBytes(entity.Id);
     wm.Code = (int)PlayerAction.RemoveEntity;
     wm.DeliveryMethod = NetDeliveryMethod.ReliableUnordered;
     wm.DeliveryChannel = 0;
     wm.Data = null;
 }
Example #11
0
        /// <summary>
        /// Formats a RemoveZone message.
        /// </summary>
        /// <param name="zones">The zone instance(s) to be removed from the client.</param>
        /// <param name="wm">The ServerToClientMessage instance that willhold the data.</param>
        public static void CreateRemoveZoneMessage(IEnumerable<Zone> zones, ServerToClientMessage wm)
        {
            if (wm.Sender == null)
                throw (new Exception("wm.Sender can't be NULL on outgoing messages."));

            wm.MessageType = MessageType.S2C_ZoneMessage;
            wm.Buffer = null;
            wm.Code = (int)PlayerAction.RemoveZone;
            wm.DeliveryMethod = NetDeliveryMethod.ReliableUnordered;
            wm.DeliveryChannel = 0;

            StringBuilder sb = new StringBuilder();
            foreach (Zone zone in zones)
            {
                sb.Append(zone.Id);
                sb.Append(":");
            }
            wm.Data = sb.ToString();
        }
Example #12
0
 private void HandleMoveEntity(ServerToClientMessage wm)
 {
 }
Example #13
0
        private void HandleRemoveZone(ServerToClientMessage wm)
        {
            string[] zones = wm.Data.Split(':');
            for (int i = 0; i < zones.Length; i++)
            {
                // Make sure it's an actual ID
                if (string.IsNullOrWhiteSpace(zones[i]))
                    continue;

                // Make sure the zone exists.
                Zone zone = zoneManager.GetZone(Convert.ToInt32(zones[i]));
                if (zone == null)
                    continue;

                // Finally remove the zone.
                zoneManager.RemoveZone(zone.Id);
            }
        }
Example #14
0
        private void SendChannelMessage(int channel, ServerToClientMessage wm)
        {
            LinkedNode<MasterPlayerRecord> node = context.Mpt.First;
            while (node != null)
            {
                Character c = (Character)node.Value.pCharacter;
                if (c.Channels.Contains(channel))
                    c.MessageBuffer.Add(ServerToClientMessage.Copy(wm, c.Sender));

                node = node.Next;
            }
        }
Example #15
0
        private void HandleZoneMessage(ServerToClientMessage wm)
        {
            Entity e;

            // Check action and act
            PlayerAction a = (PlayerAction)wm.Code;
            switch (a)
            {
                case PlayerAction.AddEntity:
                case PlayerAction.MoveEntity:
                case PlayerAction.RemoveEntity:

                case PlayerAction.AddZone:
                case PlayerAction.RemoveZone:

                case PlayerAction.Attack:
                case PlayerAction.Damage:
                case PlayerAction.Move:
                case PlayerAction.Pickup:
                case PlayerAction.Drop:
                case PlayerAction.Use:
                case PlayerAction.EquipmentChange:
                case PlayerAction.EquipmentSync:
                case PlayerAction.Teleport:
                case PlayerAction.PlayerDied:
                case PlayerAction.InventoryChange:
                case PlayerAction.InventorySync:

                case PlayerAction.InvalidAction:
                case PlayerAction.InvalidMove:
                case PlayerAction.InvalidTarget:
                    break;
            }
            Logger.Output(this, "HandleZoneMessage() type {0}", a);
        }
Example #16
0
        private void ProcessZoneMessage(ServerToClientMessage wm)
        {
            // Check action and act
            PlayerAction a = (PlayerAction)wm.Code;
            switch (a)
            {
                case PlayerAction.AddEntity:
                    HandleAddEntity(wm);
                    break;

                case PlayerAction.MoveEntity:
                    HandleMoveEntity(wm);
                    break;

                case PlayerAction.RemoveEntity:
                    HandleRemoveEntity(wm);
                    break;

                case PlayerAction.Damage:
                    HandleDamage(wm);
                    break;

                case PlayerAction.AddZone:
                    HandleAddZone(wm);
                    break;

                case PlayerAction.RemoveZone:
                    HandleRemoveZone(wm);
                    break;

                case PlayerAction.Teleport:
                    HandleTeleport(wm);
                    break;

                case PlayerAction.InvalidAction:
                    break;
            }
            Logger.Output(this, "HandleZoneMessage() type {0}", a);
        }
Example #17
0
 private void ProcessChatMessage(ServerToClientMessage wm)
 {
     int channel = wm.Code;
     string message = wm.Data;
     context.Gui.AddMessage(2, message);
 }
Example #18
0
        private void HandleTeleport(ServerToClientMessage wm)
        {
            string[] data = wm.Data.Remove(0, 1).Split('#');
            for (int i = 0; i < data.Length; i++)
            {
                string key = data[i].Substring(0, 1);
                string value = data[i].Substring(1, data[i].Length - 1);
                if (key == "Z")
                {
                    // id:name:width:height
                    string[] zoneInfo = value.Split(':');
                    int id = Convert.ToInt32(zoneInfo[0]);

                    if (zoneManager.ZoneExists(id))
                    {
                        Logger.Output(this, "HandleTeleport() Removing existing zone {0}.", id);
                        zoneManager.RemoveZone(id);
                    }

                    int width = Convert.ToInt32(zoneInfo[2]);
                    int height = Convert.ToInt32(zoneInfo[3]);
                    Zone zone = new Zone();
                    zone.Initialize(id, zoneInfo[1], width, height);
                    zoneManager.AddZone(zone);

                    int oldZone = playerCharacter.Zone;
                    zoneManager.MoveEntity(playerCharacter, zone);
                    zoneManager.RemoveZone(oldZone);
                    Logger.Output(this, "HandleTeleport() Zone (Id:{0}, Name:{1}, Size:{2}x{3}", id, zoneInfo[1], width, height);
                }
                else if (key == "C")
                {
                    Character character = new Character(value);
                    zoneManager.AddEntity(character);
                    Logger.Output(this, "HandleTeleport() Character (Id:{0}, Name:{1}, Pos:{2}", character.Id, character.Name, character.Position);
                }
                else if (key == "E")
                {
                    int typeId = int.Parse(value.Split('|')[0]);
                    string entityData = value.Split('|')[1];
                    AddEntityFromFormat(typeId, entityData);
                    Logger.Output(this, "HandleTeleport() Entity sent to parser.");
                }
            }
        }
Example #19
0
        private void HandleAddEntity(ServerToClientMessage wm)
        {
            int entityId = BitConverter.ToInt32(wm.Buffer, 0);
            int typeId = BitConverter.ToInt32(wm.Buffer, 4);

            // Entity already exists. maybe we should delete it instead of return..
            if (zoneManager.GetEntity(entityId) != null)
                return;

            // Format and add entity based on type.
            AddEntityFromFormat(typeId, wm.Data);
        }
Example #20
0
        /// <summary>
        /// Formats a ServerToClientMessage with InvalidAction message data.
        /// Data contains a textual description which is a GP implementation detail.
        /// Buffer contains 4 bytes for the player action.
        /// </summary>
        /// <param name="action"></param>
        /// <param name="message"></param>
        /// <param name="wm"></param>
        public static void CreateInvalidActionMessage(PlayerAction action, string message, ServerToClientMessage wm)
        {
            if (wm.Sender == null)
                throw (new Exception("wm.Sender can't be NULL on outgoing messages."));

            wm.MessageType = MessageType.S2C_ZoneMessage;
            wm.Code = (int)PlayerAction.InvalidAction;
            wm.Buffer = new byte[4];
            wm.DeliveryMethod = NetDeliveryMethod.ReliableOrdered;
            wm.DeliveryChannel = 0;
            wm.Data = message;
            BitConverter.GetBytes((int)action).CopyTo(wm.Buffer, 0); // 4b: 0-3 player action.
        }
Example #21
0
        /// <summary>
        /// Just dumps the messages into the list.
        /// </summary>
        /// <param name="wm"></param>
        private void DisplayWorldMessage(ServerToClientMessage wm)
        {
            if (this.InvokeRequired)
            {
                this.Invoke(displayMessage, wm);
            }
            else
            {
                try
                {
                    switch (wm.MessageType)
                    {
                        case MessageType.S2C_ZoneMessage:
                            PlayerAction action = (PlayerAction)wm.Code;
                            switch (action)
                            {
                                case PlayerAction.InvalidMove:
                                    Logger.Output(this, "InvalidMove Id: {0}", BitConverter.ToInt32(wm.Buffer, 0));
                                    break;

                                default:
                                    Logger.Output(this, "ZoneMessage action: {0}", action);
                                    break;
                            }
                            break;

                        default:
                            Logger.Output(this, "Unhandled message type: {0}, code: {1}, data: '{2}'", wm.MessageType, wm.Code, wm.Data);
                            break;
                    }

                    UpdateCharacterStats();
                }
                catch (Exception ex)
                {
                    Debug.WriteLine(String.Format("DisplayWorldMessag Exception: {0}", ex.Message));
                }
            }
        }
Example #22
0
 private void HandleRemoveEntity(ServerToClientMessage wm)
 {
     int entityId = BitConverter.ToInt32(wm.Buffer, 0);
     if (zoneManager.GetEntity(entityId) != null)
     {
         zoneManager.RemoveEntity(entityId);
         Logger.Output(this, "HandleRemoveEntity() removing entity ID {0}.", entityId);
     }
     else
         Logger.Output(this, "HandleRemoveEntity() failed to remove entity ID {0}, doesn't exist.", entityId);
 }