public async Task <Unit> Handle(FightWithNpcCommand command, CancellationToken cancellationToken) { var playerId = command.PlayerId; var player = await _playerDomainService.Get(playerId); if (player == null) { return(Unit.Value); } var npcId = command.NpcId; var npc = await _npcDomainService.Get(npcId); if (npc == null) { return(Unit.Value); } if (!npc.CanFight) { await _bus.RaiseEvent(new DomainNotification($"你不能与[{npc.Name}]切磋!")); return(Unit.Value); } if (player.RoomId != npc.RoomId) { await _bus.RaiseEvent(new DomainNotification($"[{npc.Name}]已经离开此地,无法发起切磋!")); return(Unit.Value); } if (npc.IsDead) { await _bus.RaiseEvent(new DomainNotification($"[{npc.Name}]已经死了,无法发起切磋!")); return(Unit.Value); } var npcFightingPlayerId = await _redisDb.StringGet <int>(string.Format(RedisKey.NpcFighting, npc.Id)); if (npcFightingPlayerId > 0 && npcFightingPlayerId != playerId) { await _bus.RaiseEvent(new DomainNotification($"[{npc.Name}]拒绝了你的切磋请求!")); return(Unit.Value); } var hasChangedStatus = await BeginChangeStatus(new PlayerStatusModel { PlayerId = playerId, Status = PlayerStatusEnum.切磋, TargetType = TargetTypeEnum.Npc, TargetId = npcId }); if (hasChangedStatus) { await _mudProvider.ShowMessage(playerId, $"【切磋】你对着[{npc.Name}]说道:在下[{player.Name}],领教壮士的高招!"); await _mudProvider.ShowMessage(playerId, $"【切磋】[{npc.Name}]说道:「既然小兄弟赐教,在下只好奉陪,我们点到为止。」"); await _redisDb.StringSet(string.Format(RedisKey.NpcFighting, npc.Id), playerId, DateTime.Now.AddSeconds(20)); int minDelay = npc.Speed; int maxDelay = minDelay + 1000; var actionPoint = await _redisDb.StringGet <int>(string.Format(RedisKey.ActionPoint, playerId)); await _mudProvider.ShowActionPoint(playerId, actionPoint); await _recurringQueue.Publish($"npc_{npc.Id}", new NpcStatusModel { NpcId = npc.Id, Status = NpcStatusEnum.切磋, TargetId = playerId, TargetType = TargetTypeEnum.玩家 }, minDelay, maxDelay); await _mudProvider.ShowBox(playerId, new { boxName = "fighting" }); } return(Unit.Value); }
public async Task <Unit> Handle(StopActionCommand command, CancellationToken cancellationToken) { //await _bus.RaiseEvent(new DomainNotification("功能暂时未实现")); var playerId = command.PlayerId; var player = await _playerDomainService.Get(playerId); if (player == null) { await _bus.RaiseEvent(new DomainNotification($"角色不存在!")); return(Unit.Value); } var status = player.Status; if (status == PlayerStatusEnum.空闲) { return(Unit.Value); } player.Status = PlayerStatusEnum.空闲; await _playerDomainService.Update(player); switch (status) { case PlayerStatusEnum.打坐: await _mudProvider.ShowMessage(playerId, "你停止了打坐。。。"); break; case PlayerStatusEnum.打工: await _mudProvider.ShowMessage(playerId, "你停止了打工。。。"); break; case PlayerStatusEnum.伐木: await _mudProvider.ShowMessage(playerId, "你停止了伐木。。。"); break; case PlayerStatusEnum.打猎: await _mudProvider.ShowMessage(playerId, "你停止了打猎。。。"); break; case PlayerStatusEnum.挖矿: await _mudProvider.ShowMessage(playerId, "你停止了挖矿。。。"); break; case PlayerStatusEnum.疗伤: await _mudProvider.ShowMessage(playerId, "你停止了疗伤。。。"); break; case PlayerStatusEnum.采药: await _mudProvider.ShowMessage(playerId, "你停止了采药。。。"); break; case PlayerStatusEnum.钓鱼: await _mudProvider.ShowMessage(playerId, "你停止了钓鱼。。。"); break; default: await _mudProvider.ShowMessage(playerId, $"你停止了{status}。。。"); break; } await _recurringQueue.Remove <PlayerStatusModel>($"player_{playerId}"); await _mudProvider.ShowBox(playerId, new { boxName = "" }); if (await Commit()) { await _bus.RaiseEvent(new PlayerStatusChangedEvent(player)).ConfigureAwait(false); } return(Unit.Value); }