Example #1
0
        private void ConsumeResources(ResponseHandle <Resources.Commands.ConsumeResources, ConsumptionRequest, ConsumptionResponse> responseHandle)
        {
            Evolution.Material             consumed    = responseHandle.Request.consumed;
            Evolution.Material             produced    = responseHandle.Request.produced;
            Map <Evolution.Material, uint> toxicLimits = responseHandle.Request.toxicLimits;

            var resources = ResourcesWriter.Data.resources;

            uint toxicity = 0;

            foreach (KeyValuePair <Evolution.Material, uint> resource in resources)
            {
                if (resource.Value > toxicLimits[resource.Key])
                {
                    toxicity += 1;
                }
            }

            if (resources[consumed] > 0)
            {
                resources[consumed] -= 1;
                resources[produced] += 1;
                ResourcesWriter.Send(new Resources.Update().SetResources(resources));

                responseHandle.Respond(new ConsumptionResponse(false, toxicity));
            }
            else
            {
                responseHandle.Respond(new ConsumptionResponse(true, toxicity));
            }
        }
Example #2
0
        private void OnCreatePlayer(ResponseHandle <PlayerCreation.Commands.CreatePlayer, CreatePlayerRequest, CreatePlayerResponse> responseHandle)
        {
            var clientWorkerId       = responseHandle.CallerInfo.CallerWorkerId;
            var playerEntityTemplate = EntityTemplateFactory.CreatePlayerTemplate(clientWorkerId);

            SpatialOS.Commands.CreateEntity(PlayerCreationWriter, playerEntityTemplate)
            .OnSuccess(_ => responseHandle.Respond(new CreatePlayerResponse((int)StatusCode.Success)))
            .OnFailure(failure => responseHandle.Respond(new CreatePlayerResponse((int)failure.StatusCode)));
        }
Example #3
0
        private void OnCreatePlayer(ResponseHandle <PlayerCreation.Commands.CreatePlayer, CreatePlayerRequest, CreatePlayerResponse> responseHandle)
        {
            var     clientWorkerId       = responseHandle.CallerInfo.CallerWorkerId;
            Vector3 initialPosition      = new Vector3((Random.Range(-1f, 1f) * 0.5f) * Random.Range(-200f, 200f), -5f, (Random.Range(-1f, 1f) * 0.5f) * Random.Range(-200f, 200f));
            var     playerEntityTemplate = EntityTemplateFactory.CreatePlayerTemplate(clientWorkerId, initialPosition);

            SpatialOS.Commands.CreateEntity(PlayerCreationWriter, playerEntityTemplate)
            .OnSuccess(_ => responseHandle.Respond(new CreatePlayerResponse((int)StatusCode.Success)))
            .OnFailure(failure => responseHandle.Respond(new CreatePlayerResponse((int)failure.StatusCode)));
        }
        private void OnHarvest(ResponseHandle <Harvestable.Commands.Harvest, HarvestRequest, HarvestResponse> request)
        {
            var resourcesToGive = Mathf.Min(SimulationSettings.HarvestReturnQuantity, health.Data.currentHealth);

            health.AddCurrentHealthDelta(-resourcesToGive);
            request.Respond(new HarvestResponse(resourcesToGive));
        }
Example #5
0
        private void RequestEnded(ResponseHandle <PlayerCreation.Commands.CreatePlayer, CreatePlayerRequest, CreatePlayerResponse> responseHandle,
                                  ResponseCode responseCode, Option <StatusCode> failureCode = new Option <StatusCode>())
        {
            Option <int> intFailureCode = failureCode.HasValue ? (int)failureCode.Value : new Option <int>();

            inFlightClientRequests.Remove(responseHandle.CallerInfo.CallerWorkerId);
            responseHandle.Respond(new CreatePlayerResponse(responseCode, intFailureCode));
        }
        private void HandleSendChat(ResponseHandle <Chat.Commands.SendChat, ChatMessage, Nothing> request)
        {
            var message = request.Request.message;
            var update  = new Chat.Update();

            update.AddChatSent(new ChatMessage(message.Substring(0, Mathf.Min(15, message.Length))));
            chat.Send(update);
            request.Respond(new Nothing());
        }
Example #7
0
        private void OnYieldHarvest(ResponseHandle <Harvestable.Commands.YieldHarvest, YieldHarvestRequest, HarvestResponse> request)
        {
            var resourcesToGive = Mathf.Min(SimulationSettings.HarvestReturnQuantity, remainingResources);

            remainingResources = Mathf.Max(harvestable.Data.resources - resourcesToGive, 0);

            harvestable.Send(new Harvestable.Update().SetResources(remainingResources));
            request.Respond(new HarvestResponse(resourcesToGive));
        }
Example #8
0
 private void OnPlayerCreation(ResponseHandle <PlayerLifeCycle.Commands.SpawnPlayer, SpawnPlayerRequest, SpawnPlayerResponse> responseHandle, ICommandCallbackResponse <EntityId> response)
 {
     if (response.StatusCode != StatusCode.Success)
     {
         Debug.LogError("player spawner failed to create entity: " + response.ErrorMessage);
         return;
     }
     playerEntityIds.Add(responseHandle.CallerInfo.CallerWorkerId, response.Response.Value);
     responseHandle.Respond(new SpawnPlayerResponse(response.Response.Value));
 }
        private void OnSpawnPlayer(ResponseHandle <PlayerLifeCycle.Commands.SpawnPlayer, SpawnPlayerRequest, Nothing> responseHandle)
        {
            // Check if we already have a player, or request for a player
            if (playerEntityIds.ContainsKey(responseHandle.CallerInfo.CallerWorkerId))
            {
                responseHandle.Respond(new Nothing());
                return;
            }

            // Mark as requested
            playerEntityIds.Add(responseHandle.CallerInfo.CallerWorkerId, EntityId.InvalidEntityId);

            // Request Id
            RequestPlayerEntityId(responseHandle.CallerInfo.CallerWorkerId);

            // Respond
            SendMapUpdate();
            responseHandle.Respond(new Nothing());
        }
Example #10
0
 // Command callback for handling heartbeats from clients indicating client is connect and missed heartbeat counter should be reset
 private void OnHeartbeat(ResponseHandle <PlayerLifecycle.Commands.Heartbeat, HeartbeatRequest, HeartbeatResponse> responseHandle)
 {
     // Heartbeats are issued by clients authoritative over the player entity and should only be sending heartbeats for themselves
     if (responseHandle.Request.senderEntityId == thisEntityId)
     {
         // Reset missed heartbeat counter to avoid entity being deleted
         PlayerLifecycleWriter.Send(new PlayerLifecycle.Update().SetCurrentMissedHeartbeats(0));
     }
     // Acknowledge command receipt
     responseHandle.Respond(new HeartbeatResponse());
 }
Example #11
0
 private void CommandReceiver_OnTakeControl(ResponseHandle <Controllable.Commands.TakeControl, ControlRequest, Nothing> obj)
 {
     Debug.LogWarning("RECEIVED COMMAND " + obj.Request.action);
     if (obj.Request.action == "release")
     {
         ReleaseControl(ControllableWriter.EntityId);
     }
     else
     {
         GainControl(ControllableWriter.EntityId, obj.CallerInfo.CallerWorkerId);
     }
     obj.Respond(new Nothing());
 }
Example #12
0
        private void OnSpawnPlayer(ResponseHandle <PlayerLifeCycle.Commands.SpawnPlayer, SpawnPlayerRequest, SpawnPlayerResponse> responseHandle)
        {
            if (playerEntityIds.ContainsKey(responseHandle.CallerInfo.CallerWorkerId))
            {
                responseHandle.Respond(new SpawnPlayerResponse(playerEntityIds[responseHandle.CallerInfo.CallerWorkerId]));
                return;
            }
            var assignedTeamId  = (nextAvailableTeamId++) % (uint)SimulationSettings.TeamCount;
            var spawningOffset  = new Vector3(Random.value - 0.5f, 0f, Random.value - 0.5f) * SimulationSettings.PlayerSpawnOffsetFactor;
            var hqPos           = SimulationSettings.TeamHQLocations[assignedTeamId].ToVector3();
            var initialPosition = hqPos + spawningOffset;

            var playerEntityTemplate = EntityTemplateFactory.CreatePlayerEntityTemplate(responseHandle.CallerInfo.CallerWorkerId, initialPosition.ToCoordinates(), assignedTeamId);

            SpatialOS.Commands.CreateEntity(playerLifeCycle, SimulationSettings.PlayerPrefabName, playerEntityTemplate, response => OnPlayerCreation(responseHandle, response));
        }
Example #13
0
 private void OnDeletePlayer(ResponseHandle <PlayerLifeCycle.Commands.DeletePlayer, DeletePlayerRequest, Nothing> responseHandle)
 {
     if (playerEntityIds.ContainsKey(responseHandle.CallerInfo.CallerWorkerId))
     {
         var entityId = playerEntityIds[responseHandle.CallerInfo.CallerWorkerId];
         SpatialOS.Commands.DeleteEntity(playerLifeCycle, entityId, result =>
         {
             if (result.StatusCode != StatusCode.Success)
             {
                 Debug.LogErrorFormat("failed to delete inactive entity {0} with error message: {1}", entityId, result.ErrorMessage);
                 return;
             }
         });
         playerEntityIds.Remove(responseHandle.CallerInfo.CallerWorkerId);
     }
     responseHandle.Respond(new Nothing());
 }
        // Command callback for requests by new clients for a new player to be spawned
        private void OnSpawnPlayer(
            ResponseHandle <Spawner.Commands.SpawnPlayer, SpawnPlayerRequest, SpawnPlayerResponse> Handle)
        {
            var playerEntityTemplate = PlayerEntityTemplate.GeneratePlayerEntityTemplate(Handle.CallerInfo.CallerWorkerId,
                                                                                         Handle.Request.initialPosition);

            SpatialOS.Commands.CreateEntity(SpawnerWriter, "PlayerVR", playerEntityTemplate, result =>
            {
                if (result.StatusCode != StatusCode.Success)
                {
                    Debug.LogError("PlayerSpawnManager failed to create entity: " + result.ErrorMessage);
                    return;
                }
                var createdEntityId = result.Response.Value;
                Debug.Log("PlayerSpawnManager created player entity with entity ID: " + createdEntityId);

                // Acknowledge command receipt and provide client with ID for newly created entity
                Handle.Respond(new SpawnPlayerResponse(createdEntityId));
            });
        }
Example #15
0
        private void OnCreatePlayer(ResponseHandle <PlayerCreation.Commands.CreatePlayer, CreatePlayerRequest, CreatePlayerResponse> responseHandle)
        {
            var clientWorkerId = responseHandle.CallerInfo.CallerWorkerId;

            if (inFlightClientRequests.Contains(clientWorkerId))
            {
                responseHandle.Respond(new CreatePlayerResponse(ResponseCode.ExistingRequestInProgress, null));
            }
            else
            {
                RequestStarted(responseHandle);

                EntityId playerEntityId;
                if (ClientEntityStoreWriter.Data.playerEntities.TryGetValue(clientWorkerId, out playerEntityId))
                {
                    CheckPlayerEntityExists(playerEntityId, (entityExists) =>
                    {
                        if (entityExists)
                        {
                            RequestEnded(responseHandle, ResponseCode.EntityForPlayerExists);
                        }
                        else
                        {
                            CreatePlayerEntity(clientWorkerId, responseHandle);
                        }
                    }, (statusCode) =>
                    {
                        RequestEnded(responseHandle, ResponseCode.Failure, statusCode);
                    });
                }
                else
                {
                    CreatePlayerEntity(clientWorkerId, responseHandle);
                }
            }
        }
Example #16
0
 // Command callback for requests for this entity to be deleted from the simulation
 private void OnDeletePlayer(ResponseHandle <PlayerLifecycle.Commands.DeletePlayer, DeletePlayerRequest, DeletePlayerResponse> responseHandle)
 {
     DeletePlayer();
     responseHandle.Respond(new DeletePlayerResponse());
 }
 private void OnIgnite(ResponseHandle <Flammable.Commands.Ignite, Nothing, Nothing> request)
 {
     Ignite();
     request.Respond(new Nothing());
 }
 private void OnSetCanBeIgnited(ResponseHandle <Flammable.Commands.SetCanBeIgnited, SetCanBeIgnitedRequest, Nothing> request)
 {
     SetCanBeIgnited(request.Request.canBeIgnited);
     request.Respond(new Nothing());
 }
 private void OnExtinguish(ResponseHandle <Flammable.Commands.Extinguish, ExtinguishRequest, Nothing> request)
 {
     Extinguish(request.Request.canBeIgnited);
     request.Respond(new Nothing());
 }