private void BehaviorChanged(Behavior behavior) { ServerPlayer[] playerInRange = SpatialPartitioning.GetEntitiesInRadius <ServerPlayer>(transform.position); SendDirtyMemoryVar(playerInRange); SendChangeBehavior(playerInRange, behavior); }
private void OnSendingInitData() { if (previousState != null) { ServerPlayer[] playerInRange = SpatialPartitioning.GetEntitiesInRadius <ServerPlayer>(transform.position); Server.Send(previousState, playerInRange.Select(e => e.EntityId)); } }
//TODO: Split this up, as it is doing 2 things: //Updating nearby entities //Updating the position public void UpdateNearbyEntities() { // TODO: Hysteresis // We'll need to have a way to look up an entity by its id nearbyEntitiesCount = SpatialPartitioning.GetEntitiesInRadius(ref nearbyEntities, Position); for (int i = 0; i < nearbyEntitiesCount; i++) { var entity = nearbyEntities[i]; if (entity == this || entity == null) { continue; } // Assume we haven't seen this entity before int frameIdLastUpdated = NetworkConstants.BeforeStartOfGameFrameId; // If we have seen this entity before... if (trackedEntityIds.Contains(entity.EntityId)) { // TODO : Store the actual last frame we updated them, but for the moment // we update them every frame, so we saw them last frame frameIdLastUpdated = Server.FrameID - 1; } entity.SendState(this, frameIdLastUpdated); trackedEntityIds.Remove(entity.EntityId); } // These have all now disappered foreach (var entityId in trackedEntityIds) { // Tell the client to remove that entity EntityDestroyPacket destroyPacket = (EntityDestroyPacket)IntrepidSerialize.TakeFromPool(PacketType.EntityDestroy); destroyPacket.entityId = entityId; Server.Send(destroyPacket, EntityId.SingleItemAsEnumerable()); } // Create the new list of tracked entities trackedEntityIds.Clear(); for (int i = 0; i < nearbyEntitiesCount; i++) { var entity = nearbyEntities[i]; if (entity == this || entity == null) { continue; } trackedEntityIds.Add(entity.EntityId); } }
private void AttackRequestPacket(Combat_AttackRequest packet) { // TODO: Validate attack. Combat_AttackOriginate ao = (Combat_AttackOriginate)IntrepidSerialize.TakeFromPool(PacketType.Combat_AttackOriginate); ao.attackerId = EntityId; ao.frameId = Server.FrameID; ao.abilityId = packet.abilityId; ao.targetId = packet.targetId; ao.position = packet.position; // keep in mind threading things /*int nearbyPlayersCount = */ SpatialPartitioning.GetEntitiesInRadius(ref nearbyPlayers, Position); Server.Send(ao, nearbyPlayers.Select(e => e.EntityId)); }