Exemplo n.º 1
0
        // Deserialize
        public override Belief generateBelief(byte[] serial)
        {
            // New belief that we will return
            Belief b;

//			Log.debug("Received a message with " + serial.Length + " bytes");

            // Break string into header and body
            MessageType headerType = (MessageType)serial[0];

            Byte[] body = new Byte[serial.Length - 1];
            System.Buffer.BlockCopy(serial, 1, body, 0, serial.Length - 1);

            // Initialize based on type of belief
            switch (headerType)
            {
            case MessageType.ACTOR:
            {         // Actor
                Gpb_Actor proto = Gpb_Actor.CreateBuilder().MergeFrom(body).Build();
                b = new Belief_Actor(
                    proto.UniqueId,
                    proto.Affiliation,
                    proto.Type,
                    proto.IsAlive,
                    proto.NumStorageSlots,
                    proto.NumCasualtiesStored,
                    proto.NumSuppliesStored,
                    proto.NumCiviliansStored,
                    proto.IsWeaponized,
                    proto.HasJammer,
                    proto.FuelRemaining,
                    proto.PosX,
                    proto.PosY,
                    proto.PosZ,
                    proto.HasVelocityX,
                    proto.VelocityX,
                    proto.HasVelocityY,
                    proto.VelocityY,
                    proto.HasVelocityZ,
                    proto.VelocityZ);
                // Add on belief time
                b.setBeliefTime(proto.BeliefTime);
                break;
            }

            case MessageType.BASE:
            {         // Base
                Gpb_Base        proto = Gpb_Base.CreateBuilder().MergeFrom(body).Build();
                List <GridCell> cells = new List <GridCell>(proto.CellsCount);
                for (int i = 0; i < proto.CellsCount; i++)
                {
                    cells.Add(new GridCell(proto.CellsList[i].Row, proto.CellsList[i].Col));
                }
                b = new Belief_Base(
                    proto.Id,
                    cells,
                    proto.Supplies);
                // Add on belief time
                b.setBeliefTime(proto.BeliefTime);
                break;
            }

            case MessageType.CASUALTY_DELIVERY:
            {         // Casualty delivery
                Gpb_CasualtyDelivery proto = Gpb_CasualtyDelivery.CreateBuilder().MergeFrom(body).Build();
                b = new Belief_Casualty_Delivery(
                    proto.RequestTime,
                    proto.ActorId,
                    proto.Greedy,
                    proto.Multiplicity);
                // Add on belief time
                b.setBeliefTime(proto.BeliefTime);
                break;
            }

            case MessageType.CASUALTY_PICKUP:
            {         // Casualty pickup
                Gpb_CasualtyPickup proto = Gpb_CasualtyPickup.CreateBuilder().MergeFrom(body).Build();
                int[] ids = new int[proto.IdsCount];
                for (int i = 0; i < proto.IdsCount; i++)
                {
                    ids[i] = proto.IdsList[i];
                }
                int[] multiplicity = new int[proto.MultiplicityCount];
                for (int i = 0; i < proto.MultiplicityCount; i++)
                {
                    multiplicity[i] = proto.MultiplicityList[i];
                }
                b = new Belief_Casualty_Pickup(
                    proto.RequestTime,
                    proto.ActorId,
                    proto.Greedy,
                    ids,
                    multiplicity);
                // Add on belief time
                b.setBeliefTime(proto.BeliefTime);
                break;
            }

            case MessageType.GRIDSPEC:
            {         // Grid Specification
                Gpb_GridSpec proto = Gpb_GridSpec.CreateBuilder().MergeFrom(body).Build();
                b = new Belief_GridSpec(
                    proto.Width,
                    proto.Height,
                    proto.GridOriginX,
                    proto.GridOriginZ,
                    proto.GridToWorldScale);
                // Add on belief time
                b.setBeliefTime(proto.BeliefTime);
                break;
            }

            case MessageType.MODE_COMMAND:
            {         // Mode Command
                Gpb_Mode_Command proto = Gpb_Mode_Command.CreateBuilder().MergeFrom(body).Build();
                b = new Belief_Mode_Command(
                    proto.RequestTime,
                    proto.ActorId,
                    proto.ModeId);
                // Add on belief time
                b.setBeliefTime(proto.BeliefTime);
                break;
            }

            case MessageType.NGOSITE:
            {         // NGO Site
                Gpb_NGOSite     proto = Gpb_NGOSite.CreateBuilder().MergeFrom(body).Build();
                List <GridCell> cells = new List <GridCell>(proto.CellsCount);
                for (int i = 0; i < proto.CellsCount; i++)
                {
                    cells.Add(new GridCell(proto.CellsList[i].Row, proto.CellsList[i].Col));
                }
                b = new Belief_NGOSite(
                    proto.Id,
                    cells,
                    proto.Supplies,
                    proto.Casualties,
                    proto.Civilians);
                // Add on belief time
                b.setBeliefTime(proto.BeliefTime);
                break;
            }

            case MessageType.ROADCELL:
            {         // Road Cell
                Gpb_RoadCell proto = Gpb_RoadCell.CreateBuilder().MergeFrom(body).Build();
                b = new Belief_RoadCell(
                    proto.IsRoadEnd,
                    new GridCell(proto.Cell.Row, proto.Cell.Col));
                // Add on belief time
                b.setBeliefTime(proto.BeliefTime);
                break;
            }

            case MessageType.SPOI:
            {         // SPOI
                Gpb_SPOI proto = Gpb_SPOI.CreateBuilder().MergeFrom(body).Build();
                b = new Belief_SPOI(
                    proto.RequestTime,
                    proto.ActorId,
                    proto.PosX,
                    proto.PosY,
                    proto.PosZ);
                // Add on belief time
                b.setBeliefTime(proto.BeliefTime);
                break;
            }

            case MessageType.SUPPLY_DELIVERY:
            {         // Supply delivery
                Gpb_SupplyDelivery proto = Gpb_SupplyDelivery.CreateBuilder().MergeFrom(body).Build();
                int[] ids = new int[proto.IdsCount];
                for (int i = 0; i < proto.IdsCount; i++)
                {
                    ids[i] = proto.IdsList[i];
                }
                int[] multiplicity = new int[proto.MultiplicityCount];
                for (int i = 0; i < proto.MultiplicityCount; i++)
                {
                    multiplicity[i] = proto.MultiplicityList[i];
                }
                b = new Belief_Supply_Delivery(
                    proto.RequestTime,
                    proto.ActorId,
                    proto.Greedy,
                    ids,
                    multiplicity);
                // Add on belief time
                b.setBeliefTime(proto.BeliefTime);
                break;
            }

            case MessageType.SUPPLY_PICKUP:
            {         // Supply pickup
                Gpb_SupplyPickup proto = Gpb_SupplyPickup.CreateBuilder().MergeFrom(body).Build();
                b = new Belief_Supply_Pickup(
                    proto.RequestTime,
                    proto.ActorId,
                    proto.Greedy,
                    proto.Multiplicity);
                // Add on belief time
                b.setBeliefTime(proto.BeliefTime);
                break;
            }

            case MessageType.TERRAIN:
            {         // Terrain
                Gpb_Terrain     proto = Gpb_Terrain.CreateBuilder().MergeFrom(body).Build();
                List <GridCell> cells = new List <GridCell>(proto.CellsCount);
                for (int i = 0; i < proto.CellsCount; i++)
                {
                    cells.Add(new GridCell(proto.CellsList[i].Row, proto.CellsList[i].Col));
                }
                b = new Belief_Terrain(
                    proto.Type,
                    cells);
                // Add on belief time
                b.setBeliefTime(proto.BeliefTime);
                break;
            }

            case MessageType.TIME:
            {         // Time
                Gpb_Time proto = Gpb_Time.CreateBuilder().MergeFrom(body).Build();
                b = new Belief_Time(
                    proto.Time);
                // Add on belief time
                b.setBeliefTime(proto.BeliefTime);
                break;
            }

            case MessageType.VILLAGE:
            {         // Village
                Gpb_Village     proto = Gpb_Village.CreateBuilder().MergeFrom(body).Build();
                List <GridCell> cells = new List <GridCell>(proto.CellsCount);
                for (int i = 0; i < proto.CellsCount; i++)
                {
                    cells.Add(new GridCell(proto.CellsList[i].Row, proto.CellsList[i].Col));
                }
                b = new Belief_Village(
                    proto.Id,
                    cells,
                    proto.Supplies,
                    proto.Casualties);
                // Add on belief time
                b.setBeliefTime(proto.BeliefTime);
                break;
            }

            case MessageType.WAYPOINT:
            {         // Waypoint
                Gpb_Waypoint proto = Gpb_Waypoint.CreateBuilder().MergeFrom(body).Build();
                b = new Belief_Waypoint(
                    proto.RequestTime,
                    proto.ActorId,
                    proto.PosX,
                    proto.PosY,
                    proto.PosZ);
                // Add on belief time
                b.setBeliefTime(proto.BeliefTime);
                break;
            }

            case MessageType.WAYPOINT_OVERRIDE:
            {         // Waypoint Override
                Gpb_Waypoint_Override proto = Gpb_Waypoint_Override.CreateBuilder().MergeFrom(body).Build();
                b = new Belief_Waypoint_Override(
                    proto.RequestTime,
                    proto.ActorId,
                    proto.PosX,
                    proto.PosY,
                    proto.PosZ);
                // Add on belief time
                b.setBeliefTime(proto.BeliefTime);
                break;
            }

            case MessageType.WAYPOINT_PATH:
            {
                Gpb_WaypointPath proto     = Gpb_WaypointPath.CreateBuilder().MergeFrom(body).Build();
                List <Waypoint>  waypoints = new List <Waypoint>();
                for (int i = 0; i < proto.WaypointsCount; ++i)
                {
                    Gpb_SingleWaypoint protoPoint = proto.WaypointsList[i];
                    Waypoint           waypoint   = new Waypoint();
                    waypoint.x       = protoPoint.X;
                    waypoint.y       = protoPoint.Y;
                    waypoint.z       = protoPoint.Z;
                    waypoint.heading = protoPoint.Heading;
                    waypoint.visited = protoPoint.Visited;
                    waypoints.Add(waypoint);
                }

                b = new Belief_WaypointPath(proto.RequestTime, proto.ActorId, waypoints);
                b.setBeliefTime(proto.BeliefTime);
                break;
            }

            case MessageType.CUSTOM:
            {         // Time
                Gpb_Custom proto = Gpb_Custom.CreateBuilder().MergeFrom(body).Build();
                b = new Belief_Custom(
                    proto.CustomType,
                    proto.ActorId,
                    proto.Data.ToByteArray());
                // Add on belief time
                b.setBeliefTime(proto.BeliefTime);
                break;
            }

            default:
                // Unrecognized type
                Log.debug("ProtobufSerializer.generateBelief(): Unrecognized header type " + headerType);
                // Don't create a new belief object and return to caller
                return(null);
            }

            // Return the created belief object
            return(b);
        }
Exemplo n.º 2
0
        // Serialize a Belief object into a byte array using Google Protobuf + 1 header byte
        public override byte[] serializeBelief(Belief belief)
        {
            // Variables to hold serialized message
            byte header;

            byte[] body, message;

            // Initialize based on type of belief
            switch (belief.getBeliefType())
            {
            case Belief.BeliefType.ACTOR:
            {         // Actor
                Gpb_Actor.Builder proto = Gpb_Actor.CreateBuilder();
                Belief_Actor      b     = (Belief_Actor)belief;
                proto.SetUniqueId(b.getUnique_id());
                proto.SetAffiliation(b.getAffiliation());
                proto.SetType(b.getType());
                proto.SetIsAlive(b.getIsAlive());
                proto.SetNumStorageSlots(b.getNumStorageSlots());
                proto.SetNumCasualtiesStored(b.getNumCasualtiesStored());
                proto.SetNumSuppliesStored(b.getNumSuppliesStored());
                proto.SetNumCiviliansStored(b.getNumCiviliansStored());
                proto.SetIsWeaponized(b.getIsWeaponized());
                proto.SetHasJammer(b.getHasJammer());
                proto.SetFuelRemaining(b.getFuelRemaining());
                proto.SetPosX(b.getPos_x());
                proto.SetPosY(b.getPos_y());
                proto.SetPosZ(b.getPos_z());
                // Optional fields
                if (b.getVelocity_x_valid())
                {
                    proto.SetVelocityX(b.getVelocity_x());
                }
                if (b.getVelocity_y_valid())
                {
                    proto.SetVelocityY(b.getVelocity_y());
                }
                if (b.getVelocity_z_valid())
                {
                    proto.SetVelocityZ(b.getVelocity_z());
                }
                // Add on belief time
                proto.SetBeliefTime(b.getBeliefTime());
                // Form header + serialized message
                header = (byte)MessageType.ACTOR;
                body   = proto.Build().ToByteArray();
                break;
            }

            case Belief.BeliefType.BASE:
            {         // Base
                Gpb_Base.Builder proto = Gpb_Base.CreateBuilder();
                Belief_Base      b     = (Belief_Base)belief;
                proto.SetId(b.getId());
                proto.SetSupplies(b.getSupplies());
                // Copy contents of cell list
                List <GridCell> cells = b.getCells();
                for (int i = 0; i < cells.Count; i++)
                {
                    Gpb_GridCell.Builder g = Gpb_GridCell.CreateBuilder();
                    g.SetRow(cells[i].getRow());
                    g.SetCol(cells[i].getCol());
                    proto.AddCells(g.Build());
                }
                // Add on belief time
                proto.SetBeliefTime(b.getBeliefTime());
                // Form header + serialized message
                header = (byte)MessageType.BASE;
                body   = proto.Build().ToByteArray();
                break;
            }

            case Belief.BeliefType.CASUALTY_DELIVERY:
            {         // Casualty Delivery
                Gpb_CasualtyDelivery.Builder proto = Gpb_CasualtyDelivery.CreateBuilder();
                Belief_Casualty_Delivery     b     = (Belief_Casualty_Delivery)belief;
                proto.SetRequestTime(b.getRequest_time());
                proto.SetActorId(b.getActor_id());
                proto.SetGreedy(b.getGreedy());
                proto.SetMultiplicity(b.getMultiplicity());
                // Add on belief time
                proto.SetBeliefTime(b.getBeliefTime());
                // Form header + serialized message
                header = (byte)MessageType.CASUALTY_DELIVERY;
                body   = proto.Build().ToByteArray();
                break;
            }

            case Belief.BeliefType.CASUALTY_PICKUP:
            {         // Casualty Pickup
                Gpb_CasualtyPickup.Builder proto = Gpb_CasualtyPickup.CreateBuilder();
                Belief_Casualty_Pickup     b     = (Belief_Casualty_Pickup)belief;
                proto.SetRequestTime(b.getRequest_time());
                proto.SetActorId(b.getActor_id());
                proto.SetGreedy(b.getGreedy());
                // Copy contents of id list
                int[] ids = b.getIds();
                for (int i = 0; i < ids.Length; i++)
                {
                    proto.AddIds(ids[i]);
                }
                // Copy contents of multiplicity list
                int[] multiplicity = b.getMultiplicity();
                for (int i = 0; i < multiplicity.Length; i++)
                {
                    proto.AddMultiplicity(multiplicity[i]);
                }
                // Add on belief time
                proto.SetBeliefTime(b.getBeliefTime());
                // Form header + serialized message
                header = (byte)MessageType.CASUALTY_PICKUP;
                body   = proto.Build().ToByteArray();
                break;
            }

            case Belief.BeliefType.GRIDSPEC:
            {         // Grid Specification
                Gpb_GridSpec.Builder proto = Gpb_GridSpec.CreateBuilder();
                Belief_GridSpec      b     = (Belief_GridSpec)belief;
                proto.SetWidth(b.getWidth());
                proto.SetHeight(b.getHeight());
                proto.SetGridOriginX(b.getGridOrigin_x());
                proto.SetGridOriginZ(b.getGridOrigin_z());
                proto.SetGridToWorldScale(b.getGridToWorldScale());
                // Add on belief time
                proto.SetBeliefTime(b.getBeliefTime());
                // Form header + serialized message
                header = (byte)MessageType.GRIDSPEC;
                body   = proto.Build().ToByteArray();
                break;
            }

            case Belief.BeliefType.MODE_COMMAND:
            {         // Mode Command
                Gpb_Mode_Command.Builder proto = Gpb_Mode_Command.CreateBuilder();
                Belief_Mode_Command      b     = (Belief_Mode_Command)belief;
                proto.SetRequestTime(b.getRequest_time());
                proto.SetActorId(b.getActor_id());
                proto.SetModeId(b.getMode_id());
                // Add on belief time
                proto.SetBeliefTime(b.getBeliefTime());
                // Form header + serialized message
                header = (byte)MessageType.MODE_COMMAND;
                body   = proto.Build().ToByteArray();
                break;
            }

            case Belief.BeliefType.NGOSITE:
            {         // NGO Site
                Gpb_NGOSite.Builder proto = Gpb_NGOSite.CreateBuilder();
                Belief_NGOSite      b     = (Belief_NGOSite)belief;
                proto.SetId(b.getId());
                proto.SetSupplies(b.getSupplies());
                proto.SetCasualties(b.getCasualties());
                proto.SetCivilians(b.getCivilians());
                // Copy contents of cell list
                List <GridCell> cells = b.getCells();
                for (int i = 0; i < cells.Count; i++)
                {
                    Gpb_GridCell.Builder g = Gpb_GridCell.CreateBuilder();
                    g.SetRow(cells[i].getRow());
                    g.SetCol(cells[i].getCol());
                    proto.AddCells(g.Build());
                }
                // Add on belief time
                proto.SetBeliefTime(b.getBeliefTime());
                // Form header + serialized message
                header = (byte)MessageType.NGOSITE;
                body   = proto.Build().ToByteArray();
                break;
            }

            case Belief.BeliefType.ROADCELL:
            {         // Road Cell
                Gpb_RoadCell.Builder proto = Gpb_RoadCell.CreateBuilder();
                Belief_RoadCell      b     = (Belief_RoadCell)belief;
                proto.SetIsRoadEnd(b.getIsRoadEnd());
                // Copy contents of cell
                GridCell             cell = b.getCell();
                Gpb_GridCell.Builder g    = Gpb_GridCell.CreateBuilder();
                g.SetRow(cell.getRow());
                g.SetCol(cell.getCol());
                proto.SetCell(g.Build());
                // Add on belief time
                proto.SetBeliefTime(b.getBeliefTime());
                // Form header + serialized message
                header = (byte)MessageType.ROADCELL;
                body   = proto.Build().ToByteArray();
                break;
            }

            case Belief.BeliefType.SPOI:
            {         // SPOI
                Gpb_SPOI.Builder proto = Gpb_SPOI.CreateBuilder();
                Belief_SPOI      b     = (Belief_SPOI)belief;
                proto.SetRequestTime(b.getRequest_time());
                proto.SetActorId(b.getActor_id());
                proto.SetPosX(b.getPos_x());
                proto.SetPosY(b.getPos_y());
                proto.SetPosZ(b.getPos_z());
                // Add on belief time
                proto.SetBeliefTime(b.getBeliefTime());
                // Form header + serialized message
                header = (byte)MessageType.SPOI;
                body   = proto.Build().ToByteArray();
                break;
            }

            case Belief.BeliefType.SUPPLY_DELIVERY:
            {         // Supply Delivery
                Gpb_SupplyDelivery.Builder proto = Gpb_SupplyDelivery.CreateBuilder();
                Belief_Supply_Delivery     b     = (Belief_Supply_Delivery)belief;
                proto.SetRequestTime(b.getRequest_time());
                proto.SetActorId(b.getActor_id());
                proto.SetGreedy(b.getGreedy());
                // Copy contents of id list
                int[] ids = b.getIds();
                for (int i = 0; i < ids.Length; i++)
                {
                    proto.AddIds(ids[i]);
                }
                // Copy contents of multiplicity list
                int[] multiplicity = b.getMultiplicity();
                for (int i = 0; i < multiplicity.Length; i++)
                {
                    proto.AddMultiplicity(multiplicity[i]);
                }
                // Add on belief time
                proto.SetBeliefTime(b.getBeliefTime());
                // Form header + serialized message
                header = (byte)MessageType.SUPPLY_DELIVERY;
                body   = proto.Build().ToByteArray();
                break;
            }

            case Belief.BeliefType.SUPPLY_PICKUP:
            {         // Supply Pickup
                Gpb_SupplyPickup.Builder proto = Gpb_SupplyPickup.CreateBuilder();
                Belief_Supply_Pickup     b     = (Belief_Supply_Pickup)belief;
                proto.SetRequestTime(b.getRequest_time());
                proto.SetActorId(b.getActor_id());
                proto.SetGreedy(b.getGreedy());
                proto.SetMultiplicity(b.getMultiplicity());
                // Add on belief time
                proto.SetBeliefTime(b.getBeliefTime());
                // Form header + serialized message
                header = (byte)MessageType.SUPPLY_PICKUP;
                body   = proto.Build().ToByteArray();
                break;
            }

            case Belief.BeliefType.TERRAIN:
            {         // Terrain
                Gpb_Terrain.Builder proto = Gpb_Terrain.CreateBuilder();
                Belief_Terrain      b     = (Belief_Terrain)belief;
                proto.SetType(b.getType());
                // Copy contents of cell list
                List <GridCell> cells = b.getCells();
                for (int i = 0; i < cells.Count; i++)
                {
                    Gpb_GridCell.Builder g = Gpb_GridCell.CreateBuilder();
                    g.SetRow(cells[i].getRow());
                    g.SetCol(cells[i].getCol());
                    proto.AddCells(g.Build());
                }
                // Add on belief time
                proto.SetBeliefTime(b.getBeliefTime());
                // Form header + serialized message
                header = (byte)MessageType.TERRAIN;
                body   = proto.Build().ToByteArray();
                break;
            }

            case Belief.BeliefType.TIME:
            {         // Time
                Gpb_Time.Builder proto = Gpb_Time.CreateBuilder();
                Belief_Time      b     = (Belief_Time)belief;
                proto.SetTime(b.getTime());
                // Add on belief time
                proto.SetBeliefTime(b.getBeliefTime());
                // Form header + serialized message
                header = (byte)MessageType.TIME;
                body   = proto.Build().ToByteArray();
                break;
            }

            case Belief.BeliefType.VILLAGE:
            {         // Village
                Gpb_Village.Builder proto = Gpb_Village.CreateBuilder();
                Belief_Village      b     = (Belief_Village)belief;
                proto.SetId(b.getId());
                proto.SetSupplies(b.getSupplies());
                proto.SetCasualties(b.getCasualties());
                // Copy contents of cell list
                List <GridCell> cells = b.getCells();
                for (int i = 0; i < cells.Count; i++)
                {
                    Gpb_GridCell.Builder g = Gpb_GridCell.CreateBuilder();
                    g.SetRow(cells[i].getRow());
                    g.SetCol(cells[i].getCol());
                    proto.AddCells(g.Build());
                }
                // Add on belief time
                proto.SetBeliefTime(b.getBeliefTime());
                // Form header + serialized message
                header = (byte)MessageType.VILLAGE;
                body   = proto.Build().ToByteArray();
                break;
            }

            case Belief.BeliefType.WAYPOINT:
            {         // Waypoint
                Gpb_Waypoint.Builder proto = Gpb_Waypoint.CreateBuilder();
                Belief_Waypoint      b     = (Belief_Waypoint)belief;
                proto.SetRequestTime(b.getRequest_time());
                proto.SetActorId(b.getActor_id());
                proto.SetPosX(b.getPos_x());
                proto.SetPosY(b.getPos_y());
                proto.SetPosZ(b.getPos_z());
                proto.SetSpeed(b.getSpeed());
                // Add on belief time
                proto.SetBeliefTime(b.getBeliefTime());
                // Form header + serialized message
                header = (byte)MessageType.WAYPOINT;
                body   = proto.Build().ToByteArray();
                break;
            }

            case Belief.BeliefType.WAYPOINT_OVERRIDE:
            {         // Waypoint Override
                Gpb_Waypoint_Override.Builder proto = Gpb_Waypoint_Override.CreateBuilder();
                Belief_Waypoint_Override      b     = (Belief_Waypoint_Override)belief;
                proto.SetRequestTime(b.getRequest_time());
                proto.SetActorId(b.getActor_id());
                proto.SetPosX(b.getPos_x());
                proto.SetPosY(b.getPos_y());
                proto.SetPosZ(b.getPos_z());
                // Add on belief time
                proto.SetBeliefTime(b.getBeliefTime());
                // Form header + serialized message
                header = (byte)MessageType.WAYPOINT_OVERRIDE;
                body   = proto.Build().ToByteArray();
                break;
            }

            case Belief.BeliefType.WAYPOINT_PATH:
            {
                Gpb_WaypointPath.Builder proto = Gpb_WaypointPath.CreateBuilder();
                Belief_WaypointPath      b     = (Belief_WaypointPath)belief;
                proto.SetActorId(b.getId());
                proto.SetBeliefTime(b.getBeliefTime());
                proto.SetRequestTime(b.getRequestTime());

                foreach (Waypoint point in b.getWaypoints())
                {
                    Gpb_SingleWaypoint.Builder pointBuilder = Gpb_SingleWaypoint.CreateBuilder();
                    pointBuilder.SetX(point.x);
                    pointBuilder.SetY(point.y);
                    pointBuilder.SetZ(point.z);
                    pointBuilder.SetHeading(point.heading);
                    pointBuilder.SetVisited(point.visited);
                    pointBuilder.SetSpeed(point.speed);
                    proto.AddWaypoints(pointBuilder.Build());
                }

                header = (byte)MessageType.WAYPOINT_PATH;
                body   = proto.Build().ToByteArray();

                break;
            }

            case Belief.BeliefType.CUSTOM:
            {         // Custom
                Gpb_Custom.Builder proto = Gpb_Custom.CreateBuilder();
                Belief_Custom      b     = (Belief_Custom)belief;
                proto.SetData(Google.ProtocolBuffers.ByteString.CopyFrom(b.getData()));
                // Add on belief time
                proto.SetCustomType(b.getCustomType());
                proto.SetActorId(b.getId());
                proto.SetBeliefTime(b.getBeliefTime());

                // Form header + serialized message
                header = (byte)MessageType.CUSTOM;
                body   = proto.Build().ToByteArray();
                break;
            }

            default:
                // Unrecognized type, return empty array
                Log.debug("ProtobufSerializer.serializeBelief(): Unrecognized Belief type");
                return(new byte[0]);
            }

            // Return serialized message (header + body)
            message    = new Byte[body.Length + 1];
            message[0] = header;
            System.Buffer.BlockCopy(body, 0, message, 1, body.Length);
            return(message);
        }