예제 #1
0
    private void BehaviorChanged(Behavior behavior)
    {
        ServerPlayer[] playerInRange = SpatialPartitioning.GetEntitiesInRadius <ServerPlayer>(transform.position);

        SendDirtyMemoryVar(playerInRange);
        SendChangeBehavior(playerInRange, behavior);
    }
예제 #2
0
 private void OnSendingInitData()
 {
     if (previousState != null)
     {
         ServerPlayer[] playerInRange = SpatialPartitioning.GetEntitiesInRadius <ServerPlayer>(transform.position);
         Server.Send(previousState, playerInRange.Select(e => e.EntityId));
     }
 }
예제 #3
0
    //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);
        }
    }
예제 #4
0
    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));
    }