using Google.Protobuf; using Google.Protobuf.WellKnownTypes; using ServerCore; using ServerBase; using ServerCommon; using ServerCommon.BusinessLogDomain; using MetaAssets; namespace GameServer.PacketHandler; [PacketHandler("allgameserver", typeof(ServerMessage.Types.GS2GS_NTF_MODIFY_BUILDING_PROFIT), typeof(NtfModifyBuildingProfitMQPacketHandler), typeof(RabbitMQ4Game))] internal class NtfModifyBuildingProfitMQPacketHandler : PacketRecvHandler { public override async Task onProcessPacket(ISession session, IMessage recvMessage) { var result = new Result(); var err_msg = string.Empty; var server_logic = GameServerApp.getServerLogic(); var message = recvMessage as ServerMessage; ArgumentNullException.ThrowIfNull(message, $"message is null !!!"); var ntf_modify_building_profit = message.NtfModifyBuildingProfit; if (ntf_modify_building_profit.ExceptServerName == server_logic.getServerName()) return result; Log.getLogger().info($"NtfModifyBuildingProfit"); var building_manager = server_logic.getBuildingManager(); if (!building_manager.tryGetBuilding(ntf_modify_building_profit.BuildingMetaId, out var building)) { err_msg = $"Failed to tryGetBuilding() !!! : buildingMetaId:{ntf_modify_building_profit.BuildingMetaId}"; result.setFail(ServerErrorCode.BuildingNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return result; } var building_profit_agent_action = building.getEntityAction(); NullReferenceCheckHelper.throwIfNull(building_profit_agent_action, () => $"building_profit_agent_action is null !!!"); using (building_profit_agent_action.getAsyncLock().Lock()) { foreach (var (floor, floor_profit_info) in ntf_modify_building_profit.FloorProfits) { if (!building_profit_agent_action.tryGetBuildingProfit(floor, out var building_profit)) { var currency_type = (CurrencyType)floor_profit_info.Profits.First().Key; (result, building_profit, _) = await BuildingProfitHelper.tryMakeBuildingProfit(building, ntf_modify_building_profit.BuildingMetaId, floor, currency_type, 0); if (result.isFail()) { err_msg = $"Failed to tryMakeBuildingProfit() !!! : {result.toBasicString()}"; Log.getLogger().error(err_msg); return result; } NullReferenceCheckHelper.throwIfNull(building_profit, () => $"building_profit is null !!!"); building_profit_agent_action.addBuildingProfit(floor, building_profit); } var building_profit_action = building_profit.getEntityAction(); NullReferenceCheckHelper.throwIfNull(building_profit_action, () => $"building_profit_action is null !!!"); foreach (var (currency_type, money) in floor_profit_info.Profits) { building_profit_action.modifyProfit((CurrencyType)currency_type, money.Amount); } } } await Task.CompletedTask; return result; } }