jeson_fxd 2 дней назад
Родитель
Сommit
e0987d5676

+ 13 - 1
apollo_60000/serverlist.json

@@ -3,12 +3,24 @@
     "id": 1,
     "index": 0,
     "name": "fxd测试",
-    "address": "192.168.0.85:18081",
+    "address": "192.168.0.85:19821",
     "state": 1,
     "is_open": true,
     "capacity": 2000,
     "serverid": 1,
     "groupid": 1,
     "note": "local"
+  },
+  {
+    "id": 2,
+    "index": 1,
+    "name": "测试服",
+    "address": "43.226.57.217:19821",
+    "state": 1,
+    "is_open": true,
+    "capacity": 2000,
+    "serverid": 2,
+    "groupid": 2,
+    "note": "测试服"
   }
 ]

+ 0 - 137
server/serverlist.json

@@ -1,137 +0,0 @@
-[
-  {
-    "id": 1,
-    "name": "1区",
-    "address": "10.246.95.175:19821",
-    "state": 1,
-    "serverid": 1,
-    "groupid": 1,
-    "note": "dev"
-  },
-  {
-    "id": 2,
-    "name": "2区",
-    "address": "10.246.105.60:19821",
-    "state": 1,
-    "serverid": 2,
-    "groupid": 1,
-    "note": "xuxuan"
-  },
-  {
-    "id": 3,
-    "name": "3区",
-    "address": "10.246.105.122:19821",
-    "state": 1,
-    "serverid": 3,
-    "groupid": 1,
-    "note": "yangchangwei"
-  },
-  {
-    "id": 4,
-    "name": "4区",
-    "address": "10.246.95.175:19829",
-    "state": 1,
-    "serverid": 4,
-    "groupid": 1,
-    "note": "jinliang"
-  },
-  {
-    "id": 5,
-    "name": "5区",
-    "address": "10.246.93.37:19821",
-    "state": 1,
-    "serverid": 5,
-    "groupid": 1,
-    "note": "zhangsong"
-  },
-  {
-    "id": 6,
-    "name": "6区",
-    "address": "10.246.105.159:19821",
-    "state": 1,
-    "serverid": 6,
-    "groupid": 1,
-    "note": "大爷进来玩"
-  },
-  {
-    "id": 7,
-    "name": "7区",
-    "address": "10.246.105.182:19821",
-    "state": 1,
-    "serverid": 7,
-    "groupid": 1,
-    "note": "小仙女"
-  },
-  {
-    "id": 8,
-    "name": "8区",
-    "address": "10.246.105.161:19821",
-    "state": 1,
-    "serverid": 8,
-    "groupid": 1,
-    "note": "谌杰伟"
-  },
-  {
-    "id": 9,
-    "name": "9区",
-    "address": "10.246.105.156:19821",
-    "state": 1,
-    "serverid": 9,
-    "groupid": 1,
-    "note": "MBW"
-  },
-  {
-    "id": 10,
-    "name": "10区",
-    "address": "10.246.105.76:19821",
-    "state": 1,
-    "serverid": 10,
-    "groupid": 1,
-    "note": "guoxiangyu"
-  },
-  {
-    "id": 11,
-    "name": "11区",
-    "address": "10.246.105.125:19821",
-    "state": 1,
-    "serverid": 11,
-    "groupid": 1,
-    "note": "志开"
-  },
-  {
-    "id": 12,
-    "name": "12区",
-    "address": "10.246.105.139:19821",
-    "state": 1,
-    "serverid": 12,
-    "groupid": 1,
-    "note": "文湃"
-  },
-  {
-    "id": 13,
-    "name": "13区",
-    "address": "10.246.105.42:19821",
-    "state": 1,
-    "serverid": 13,
-    "groupid": 1,
-    "note": "jinliangLocal"
-  },
-  {
-    "id": 14,
-    "name": "14区",
-    "address": "10.246.105.185:19821",
-    "state": 1,
-    "serverid": 14,
-    "groupid": 1,
-    "note": "xiaoshuai"
-  },
-  {
-    "id": 100,
-    "name": "QA区",
-    "address": "10.246.95.175:19921",
-    "state": 1,
-    "serverid": 100,
-    "groupid": 1,
-    "note": "QA"
-  }
-]

+ 0 - 5
server/src/server/OpenCards.Server.Core/Table/Table_Market.cs

@@ -674,11 +674,6 @@ namespace OpenCards.Server.Core.Table
         /// 是否支持代币购买 0=不支持 1=支持
         /// </summary>
         public int TokenEnable;
-
-        /// <summary>
-        /// 是否触发累充VIP等充值统计 0=不触发 1=触发
-        /// </summary>
-        public int VipChargeEnable;
     }
 
 

+ 21 - 0
server/src/server/OpenCards.Server.Core/Utils/TimeUtils.cs

@@ -1,4 +1,5 @@
 using System;
+using System.Runtime.Serialization;
 
 namespace OpenCards.Server.Core.Utils
 {
@@ -489,5 +490,25 @@ namespace OpenCards.Server.Core.Utils
             }
             return utcTime;
         }
+
+        private static readonly TimeZoneInfo GameTimeZone = TimeZoneInfo.FindSystemTimeZoneById("China Standard Time");
+        public static DateTime GetGameNow()
+        {
+            // 若需兼容 GM 调时:DateTime.UtcNow + TimeUtils.timeOffset 再转时区
+            // 若彻底不用 TimeUtils:只用 DateTime.UtcNow
+            return TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, GameTimeZone);
+        }
+        public static long ToUnixMs(DateTime gameLocalTime)
+        {
+            // gameLocalTime 是UTF8时间
+            var unspecified  = DateTime.SpecifyKind(gameLocalTime, DateTimeKind.Unspecified);
+            var utc = TimeZoneInfo.ConvertTimeToUtc(unspecified, GameTimeZone);
+            return new DateTimeOffset(utc).ToUnixTimeMilliseconds();
+        }
+        public static DateTime FromUnixMs(long unixMs)
+        {
+            var utc = DateTimeOffset.FromUnixTimeMilliseconds(unixMs).UtcDateTime;
+            return TimeZoneInfo.ConvertTimeFromUtc(utc, GameTimeZone);
+        }
     }
 }

+ 13 - 18
server/src/server/OpenCards.Server.Logic/Module/MarketModule.cs

@@ -36,7 +36,7 @@ namespace OpenCards.Server.Logic.Module
             Charge,
             Ticket,
             GMSend,
-            Token,    //  代币/绑定代币购买
+            Token,    //  代币购买
         }
 
         [InitOnLoad]
@@ -312,16 +312,16 @@ namespace OpenCards.Server.Logic.Module
             }
             else if (c2s_type == (int)MarketSubType.Supervalu)
             {
-                s2c_id = ConstantConfig.SupervalueGiftId;
-                var gift = Table_MarketGiftManager.GetByID(s2c_id);
-                if (gift != null)
-                {
-                    var sub = Table_MarketSubTabManager.GetByID(gift.GiftGroup);
-                    if (sub != null)
-                    {
-                        s2c_stock = CheckGiftPurchase(sub.ChildFlagType, gift);
-                    }
-                }
+                //s2c_id = ConstantConfig.SupervalueGiftId;
+                //var gift = Table_MarketGiftManager.GetByID(s2c_id);
+                //if (gift != null)
+                //{
+                //    var sub = Table_MarketSubTabManager.GetByID(gift.GiftGroup);
+                //    if (sub != null)
+                //    {
+                //        s2c_stock = CheckGiftPurchase(sub.ChildFlagType, gift);
+                //    }
+                //}
                 s2c_timeStamp = Convert.ToInt64(mRoleFlag.GetFlag(FlagDefines.SupervalueTime, Flag.MapType.EPersist));
             }
             else if (c2s_type == (int)MarketSubType.SetSail)
@@ -3200,11 +3200,6 @@ namespace OpenCards.Server.Logic.Module
                 return rsp;
             }
 
-
-            // TODO:  临时参数、代码测试
-            //req.c2s_useToken = 1;
-            //giftConfig.TokenEnable = 1;
-
             // 代币购买商品
             /// 扣款优先级(服务端最终裁决)
             ///1. 计算 tokenCost = CNY * 100
@@ -3224,7 +3219,7 @@ namespace OpenCards.Server.Logic.Module
                 long tokenCount = GetItemCount(ItemDefines.TokenItemId);
                 
                 //检查代币是否足够
-                if (boundCount + tokenCount < tokenCount)
+                if (boundCount + tokenCount < tokenCost)
                 {
                     rsp.s2c_code = ClientGetRechargeOrderResponse.CODE_TOKEN_NOT_ENOUGH;
                     return rsp;
@@ -3237,7 +3232,7 @@ namespace OpenCards.Server.Logic.Module
                 }
 
                 await OnPaySuccess(req.c2s_giftId, req.c2s_pushId, TimeUtils.Now.ToString(), TimeUtils.Now.ToString(),
-                    req.c2s_uiType,ChargeType.Token /*, triggerVip: giftConfig.VipChargeEnable == 1*/ );
+                    req.c2s_uiType,ChargeType.Token);
 
                 await RecordChargeToken(iap.CNY);
 

+ 2 - 2
server/src/server/OpenCards.Server.Logic/Module/RoleModule.cs

@@ -1461,8 +1461,8 @@ namespace OpenCards.Server.Logic.Module
                     code.value = ClientHandleGMResponse.CODE_INVALID_PARAM;
                     return;
                 }
-                DispatchEvent(EventDefines.EventAddItem, ItemDefines.TokenItemId, num,
-                AddItemReason.TokenExchangeBuy, 0, LogicUtils.FileLine);
+                DispatchEvent(EventDefines.EventAddItem, ItemDefines.TokenItemInstanceId, num,
+                AddItemReason.GM, 0, LogicUtils.FileLine);
 
                 code.value = Response.CODE_OK;
                 return;

+ 3 - 21
server/src/server/OpenCards.Server.Logic/Module/TokenExchange/TokenExchangeModule.cs

@@ -56,24 +56,12 @@ namespace OpenCards.Server.Logic.Module.TokenExchange
         {
             await this.LoadRoleMappingData(roleMapping, RoleMappingDataDefines.TokenExchangeRoleData);
 
-            //await globalMapping.LoadDataAsync();
-            //await globalMapping.LoadOrCreateDataAsync(() => new TokenExchangeGlobalData
-            //{
-            //    UnitPrice = 2.00f,
-            //    LastAdjustTime = TimeUtils.CurrentTimeMs,
-            //    NextAdjustTime = CalcNextAdjustTime(TimeUtils.CurrentTimeMs),
-            //    PeriodBuyCount = 0,
-            //    PeriodSellCount = 0,
-            //});
-
             mRoleFlag = GetModule<TLRoleFlagModule>();
         }
 
         public override async Task OnStartedAsync()
         {
             mCenterService = await RpcUtils.GetCenterService(service.Provider, service.serverID);
-            //await base.OnStartedAsync();
-            //return;
         }
 
         public override void OnSaveData(IObjectTransaction trans, StringBuilder sb, bool fullData)
@@ -84,18 +72,15 @@ namespace OpenCards.Server.Logic.Module.TokenExchange
                 if (fullData)
                 {
                     roleMapping?.BatchSaveData(trans);
-                    //globalMapping?.BatchSaveData(trans);
                 }
                 else
                 {
                     roleMapping?.BatchFlush(trans);
-                    //globalMapping?.BatchFlush(trans);
                 }
             }
             else
             {
                 sb.AppendLine(roleMapping.Data.GetType().Name + ":" + LogicUtils.ToJson(roleMapping.Data));
-                //sb.AppendLine(globalMapping.Data.GetType().Name + ":" + LogicUtils.ToJson(globalMapping.Data));
             }
         }
 
@@ -103,7 +88,6 @@ namespace OpenCards.Server.Logic.Module.TokenExchange
         {
             mAdjustTimer?.Dispose();
             roleMapping?.Dispose();
-            //globalMapping?.Dispose();
         }
 
         private async Task<GetTokenExchangeGlobalResponse> FetchGlobalAsync()
@@ -124,7 +108,6 @@ namespace OpenCards.Server.Logic.Module.TokenExchange
             RegisterMessageHandler<LogicService.MsgClientTokenExchangeSellRequest>(HandleTokenExchangeSellReq);
             RegisterMessageHandler<LogicService.MsgClientTokenExchangeLogRequest>(HandleTokenExchangeLogReq);
             roleMapping = new TokenExchangeRoleDataMapping(PersistenceConstants.TYPE_TOKEN_EXCHANGE_ROLE, service.roleID, service);
-            //globalMapping = new TokenExchangeGlobalDataMapping(PersistenceConstants.TYPE_TOKEN_EXCHANGE_GLOBAL, service.serverID, service);
         }
 
         private int HandleTokenExchangeLogReq(int c2s_tradeType, ref List<TokenExchangeLogEntry> s2c_buyLogs, ref List<TokenExchangeLogEntry> s2c_sellLogs)
@@ -167,7 +150,6 @@ namespace OpenCards.Server.Logic.Module.TokenExchange
         private async Task<ClientTokenExchangeSellResponse> HandleTokenExchangeSellReq(ClientTokenExchangeSellRequest req)
         {
             var rsp = new ClientTokenExchangeSellResponse();
-            //var globalData = globalMapping.Data;
             int amount = req.c2s_tokenAmount;
             long tokenCount = GetTokenCount();
 
@@ -235,7 +217,7 @@ namespace OpenCards.Server.Logic.Module.TokenExchange
             {
                 recordId = GenRecordId(),
                 TradeType = TradeTypeSell,
-                TradeTime = TimeUtils.CurrentTimeMs,
+                TradeTime = DateTime.Now.Ticks,
                 UnitPrice = unitPrice,
                 TokenAmount = amount,
                 TearStoneAmount = netSearStone,
@@ -316,12 +298,12 @@ namespace OpenCards.Server.Logic.Module.TokenExchange
                 log.Error($"{service.ErrorBaseInfo} TokenExchange buy report failed. code={reportRsp.s2c_code}");
             }
 
-            // 日志是每个服每个玩家独保存
+            // 日志每个玩家独保存
             AppendExchangeLog(roleMapping.Data.BuyLogs, new TokenExchangeRecord()
             {
                 recordId = GenRecordId(),
                 TradeType = TradeTypeBuy,
-                TradeTime = TimeUtils.CurrentTimeMs,
+                TradeTime = DateTime.Now.Ticks,
                 UnitPrice = unitPrice,
                 TokenAmount = amount,
                 TearStoneAmount = tearStoneCost,

+ 22 - 31
server/src/server/OpenCards.Service.Center/Model/TokenExchangeHandler.cs

@@ -21,15 +21,16 @@ namespace OpenCards.Service.Center
 
         private async Task OnTokenExchangeStartAsync()
         {
+            DateTime gameNow = TimeUtils.GetGameNow();
+
             _tokenExchangeGlobalMapping = new TokenExchangeGlobalDataMapping(PersistenceConstants.TYPE_TOKEN_EXCHANGE_GLOBAL, serverID, this);
             await _tokenExchangeGlobalMapping.LoadOrCreateDataAsync(() => new TokenExchangeGlobalData()
             {
                 UnitPrice = 2.00f,
-                LastAdjustTime = TimeUtils.CurrentTimeMs,
-                NextAdjustTime = CalcNextAdjustTime(TimeUtils.CurrentTimeMs),
+                LastAdjustTime = TimeUtils.ToUnixMs(gameNow),
+                NextAdjustTime = TimeUtils.ToUnixMs(CalcNextAdjustTime(gameNow)),
                 PeriodBuyCount = 0,
                 PeriodSellCount = 0,
-
             });
 
             _tokenExchangeAdjustTime = this.Provider.CreateTimer(
@@ -75,8 +76,7 @@ namespace OpenCards.Service.Center
                 rsp.s2c_code = Response.CODE_ERROR;
                 return rsp;
             }
-            //await _tokenExchangeLock.WaitAsync();
-
+            await _tokenExchangeLock.WaitAsync();
             try
             {
                 var global = _tokenExchangeGlobalMapping.Data;
@@ -115,7 +115,7 @@ namespace OpenCards.Service.Center
                 rsp.s2c_code = Response.CODE_ERROR;
                 return rsp;
             }
-            //await _tokenExchangeLock.WaitAsync();
+            await _tokenExchangeLock.WaitAsync();
             try
             {
                 var global = _tokenExchangeGlobalMapping.Data;
@@ -145,10 +145,8 @@ namespace OpenCards.Service.Center
             {
                 _tokenExchangeLock.Release();
             }
-
         }
 
-
         private bool ValidateServerId(string reqServerId)
         {
             return string.IsNullOrEmpty(reqServerId) || reqServerId == this.serverID;
@@ -157,24 +155,20 @@ namespace OpenCards.Service.Center
         /// <summary>
         /// 返回下一个调价时间点, 当日12点或者次日00:00 (当天24点)
         /// </summary>
-        /// <param name="nowMs"></param>
+        /// <param name="nowTicks"></param>
         /// <returns></returns>
-        private long CalcNextAdjustTime(long nowMs)
+        private DateTime CalcNextAdjustTime(DateTime gameNow)
         {
-            var now = TimeUtils.TimeStampToDateTime(nowMs);
-            var dayStart = now.GetDayStart();
+            var dayStart = gameNow.Date;
             var noon = dayStart.AddHours(12);
             var midnight = dayStart.AddDays(1);
 
-            long noonMs = (long)(noon - TimeUtils.GetUTCStartTime()).TotalMilliseconds;
-            long midnightMs = (long)(midnight - TimeUtils.GetUTCStartTime()).TotalMilliseconds;
-
-            if (nowMs < noonMs)
-                return noonMs;
-            if (nowMs < midnightMs)
-                return midnightMs;
+            if (gameNow < noon)
+                return noon;
+            if (gameNow < midnight)
+                return midnight;
 
-            return noonMs + TimeUtils.OndDayTimeMs;
+            return dayStart.AddDays(1).AddHours(12);
         }
 
         private async Task OnTokenExchangeAdjustTime(object state)
@@ -186,15 +180,18 @@ namespace OpenCards.Service.Center
                 if (global == null)
                     return;
 
-                long now = TimeUtils.CurrentTimeMs;
-                if (now < global.NextAdjustTime)
+                DateTime gameNow = TimeUtils.GetGameNow();
+                long nowMs = TimeUtils.ToUnixMs(gameNow);
+
+                DateTime nextAdjustTime = TimeUtils.FromUnixMs(global.NextAdjustTime);
+                if (gameNow < nextAdjustTime)
                     return;
 
                 float newPrice = CalcAdjustedUnitPrice(global.UnitPrice, global.PeriodBuyCount, global.PeriodSellCount);
 
                 global.UnitPrice = newPrice;
-                global.LastAdjustTime = now;
-                global.NextAdjustTime = CalcNextAdjustTime(now);
+                global.LastAdjustTime = nowMs;
+                global.NextAdjustTime = TimeUtils.ToUnixMs(CalcNextAdjustTime(gameNow));
                 global.PeriodBuyCount = 0;
                 global.PeriodSellCount = 0;
 
@@ -203,7 +200,7 @@ namespace OpenCards.Service.Center
             }
             finally
             {
-
+                _tokenExchangeLock.Release();
             }
         }
 
@@ -241,12 +238,6 @@ namespace OpenCards.Service.Center
                 == Math.Round(serverPrice, 2, MidpointRounding.AwayFromZero);
         }
 
-        //[RpcHandler(typeof(GetTokenExchangeGlobalRequest), typeof(GetTokenExchangeGlobalResponse))]
-        //public Task<GetTokenExchangeGlobalResponse> rpc_Handle(GetTokenExchangeGlobalRequest req)
-        //{
-        //    return OnGetTokenExchangeGlobalRequest(req);
-        //}
-
     }
 
 }