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)); } }
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))); }
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)); }
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()); }
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)); }
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()); }
// 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()); }
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()); }
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)); }
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)); }); }
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); } } }
// 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()); }