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