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; } } }
Task IHandle <PlayerLoggedIn> .Handle(PlayerLoggedIn message) { CompleteSpawn(); AttachedObject.QueueOperation(() => { return(GrainFactory.GetGrain <IWorldPartition>(AttachedObject.GetAddressByPartitionKey()).Enter(AttachedObject)); }); return(Task.CompletedTask); }
async Task IHandle <SpawnEntity> .Handle(SpawnEntity message) { var pos = message.Position; var bb = BoundingBox.Item(); var box = new Cuboid(new Point3d(pos.X, pos.Z, pos.Y), new Size(bb.X, bb.Y, bb.Z)); await AttachedObject.SetLocalValue(ColliderComponent.ColliderShapeProperty, box); Logger.LogInformation($"Pickup spawn, key: {AttachedObject.GetAddressByPartitionKey()}"); }
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); }
public ClientPlayPacketGenerator GetGenerator() { return(new ClientPlayPacketGenerator(GrainFactory.GetGrain <IChunkTrackingHub>(AttachedObject.GetAddressByPartitionKey()))); }