public override void DoAction(IEventArgs args) { FreeRuleEventArgs fr = (FreeRuleEventArgs)args; PlayerEntity player = (PlayerEntity)fr.GetEntity(target); if (player != null) { if (player.gamePlay.IsDead()) { return; } PlayerEntity sourcePlayer = null; UnitPosition up = null; try { if (!string.IsNullOrEmpty(source)) { sourcePlayer = (PlayerEntity)fr.GetEntity(source); } if (string.IsNullOrEmpty(part)) { part = ((int)EBodyPart.Chest).ToString(); } if (pos != null) { up = pos.Select(args); } } catch (Exception e) { Logger.Error("PlayerHurtAction handle error" + e.Message); } PlayerDamageInfo damageInfo = new PlayerDamageInfo(FreeUtil.ReplaceFloat(damage, args), FreeUtil.ReplaceInt(type, args), FreeUtil.ReplaceInt(part, args), 0, false, false, FreeUtil.ReplaceBool(dead, args), up != null ? player.position.Value : Vector3.zero, up != null ? player.position.Value - up.Vector3 : Vector3.zero); BulletPlayerUtil.DoProcessPlayerHealthDamage(args.GameContext, (IGameRule)fr.Rule, sourcePlayer, player, damageInfo); } }
public void OnDisconnect(INetworkChannel channel, int messageType, object messageBody) { PlayerEntity player = GetPlayerEntity(channel); if (player != null) { try { logger.InfoFormat("player disconnected id {0}", player.entityKey); if (hallRoom != null && hallRoom.AllowReConnect) { logger.InfoFormat("player AllowReConnect id {0}", player.entityKey); player.stage.Value = EPlayerLoginStage.Offline; player.RemoveNetwork(); player.RemoveUpdateMessagePool(); } else { BulletPlayerUtil.DoProcessPlayerHealthDamage(ContextsWrapper.contexts, ContextsWrapper.FreeArgs.Rule as IGameRule, null, player, new PlayerDamageInfo(0, (int)EUIDeadType.NoHelp, 0, 0, false, false, true)); player.isFlagDestroy = true; if (player.hasFreeData) { if (player.isInitialized) { logger.InfoFormat("player PlayerLeave id {0}", player.entityKey); rule.PlayerLeave(ContextsWrapper.contexts, player); player.isInitialized = false; } } else { logger.ErrorFormat("Leave Player {0} Id {1} without Free Data ", player.playerInfo.PlayerName, player.playerInfo.PlayerId); } if (hallRoom != null) { logger.InfoFormat("player PlayerLeaveRoom id {0}", player.entityKey); hallRoom.PlayerLeaveRoom(player.playerInfo.PlayerId); } } } catch (Exception e) { logger.ErrorFormat("player disconnected error: {0} \n {1}", e.Message, e.StackTrace); } finally { int channelToPlayerCount = channelToPlayer.Count; try { channel.MessageReceived -= ChannelOnMessageReceived; channel.Disconnected -= ChannelOnDisonnected; channelToPlayer.Remove(channel); channel.Dispose(); } catch (Exception e) { logger.ErrorFormat("player Remove error: {0} \n {1}", e.Message, e.StackTrace); } finally { channelToPlayerCount--; } if (channelToPlayerCount == 0) { if (hallRoom == null && hallRoom.AllowReConnect) { logger.ErrorFormat("AllowReConnect"); } else { GameOver(true, RoomState.RGameOver); } } } } else { logger.ErrorFormat("illegal ChannelOnDisonnected event received {0}", channel); } }