Пример #1
0
        private async Task ActionLook()
        {
            // 通知周围creature entity看着玩家
            EntityWorldPos    entityPos = AttachedObject.GetValue(EntityWorldPositionComponent.EntityWorldPositionProperty);
            ChunkWorldPos     chunkPos  = entityPos.ToChunkWorldPos();
            IChunkTrackingHub tracker   = GrainFactory.GetGrain <IChunkTrackingHub>(AttachedObject.GetAddressByPartitionKey());
            var list = await tracker.GetTrackedPlayers();

            // TODO 多位玩家的话只看一位
            foreach (IPlayer each in list)
            {
                EntityWorldPos playerPosition = await each.GetPosition();

                // 三格内玩家
                if (EntityWorldPos.Distance(playerPosition, entityPos) < 3)
                {
                    (var yaw, var pitch) = VectorToYawAndPitch(entityPos, playerPosition);

                    await AttachedObject.SetLocalValue(EntityLookComponent.YawProperty, yaw);

                    await AttachedObject.SetLocalValue(EntityLookComponent.HeadYawProperty, yaw);

                    await AttachedObject.SetLocalValue(EntityLookComponent.PitchProperty, pitch);

                    break;
                }
            }
        }
Пример #2
0
        private async Task GenerateEvent()
        {
            // get state
            var state     = AiType.State;
            var nextEvent = CreatureEvent.Nothing;

            // player approaching event
            if (state == CreatureState.Stop)
            {
                IChunkTrackingHub tracker = GrainFactory.GetGrain <IChunkTrackingHub>(AttachedObject.GetAddressByPartitionKey());
                var list = await tracker.GetTrackedPlayers();

                if (list.Count != 0)
                {
                    nextEvent = CreatureEvent.PlayerApproaching;
                }
            }

            // random walk
            if (state == CreatureState.Stop && random.Next(10) == 0)
            {
                nextEvent = CreatureEvent.RandomWalk;
            }

            // stop
            if (state == CreatureState.Walk && random.Next(30) == 0)
            {
                nextEvent = CreatureEvent.Stop;
            }
            else if (state == CreatureState.Look && random.Next(10) == 0)
            {
                nextEvent = CreatureEvent.Stop;
            }

            await AiType.FireAsync(nextEvent);
        }