Преглед на файлове

Merge branch 'dev' into tap

wanggangzero преди 4 месеца
родител
ревизия
7e0d72fcab
променени са 52 файла, в които са добавени 910 реда и са изтрити 332 реда
  1. 5 4
      Gameserver/App/Services/AppServer.php
  2. 10 0
      Gameserver/App/base/CmdCode.php
  3. 54 34
      Gameserver/App/base/ErrCode.php
  4. 0 3
      Gameserver/App/base/Req.php
  5. 34 2
      Gameserver/App/configs/GameConfig.php
  6. 2 1
      Gameserver/App/index.php
  7. 33 1
      Gameserver/App/model/Const/GameConfig.php
  8. 1 1
      Gameserver/App/model/Const/sm_activeTask.php
  9. 1 1
      Gameserver/App/model/Const/sm_activeTask_type.php
  10. 1 1
      Gameserver/App/model/Const/sm_activity_day7.php
  11. 1 1
      Gameserver/App/model/Const/sm_announcement.php
  12. 1 6
      Gameserver/App/model/Const/sm_equip.php
  13. 1 1
      Gameserver/App/model/Const/sm_equip_levelupgrade.php
  14. 42 0
      Gameserver/App/model/Const/sm_equip_power.php
  15. 1 1
      Gameserver/App/model/Const/sm_errmsg.php
  16. 1 1
      Gameserver/App/model/Const/sm_evolve.php
  17. 1 1
      Gameserver/App/model/Const/sm_fun_unlock.php
  18. 21 1
      Gameserver/App/model/Const/sm_gate.php
  19. 6 1
      Gameserver/App/model/Const/sm_gate_unlock.php
  20. 21 1
      Gameserver/App/model/Const/sm_glc2.php
  21. 4 4
      Gameserver/App/model/Const/sm_globalsettings.php
  22. 90 0
      Gameserver/App/model/Const/sm_guide.php
  23. 2 2
      Gameserver/App/model/Const/sm_hero.php
  24. 2 2
      Gameserver/App/model/Const/sm_heroType_typeId.php
  25. 3 2
      Gameserver/App/model/Const/sm_item.php
  26. 1 1
      Gameserver/App/model/Const/sm_player_level.php
  27. 1 1
      Gameserver/App/model/Const/sm_predicate.php
  28. 1 1
      Gameserver/App/model/Const/sm_shop.php
  29. 1 1
      Gameserver/App/model/Const/sm_shop_cash.php
  30. 1 1
      Gameserver/App/model/Const/sm_skills.php
  31. 1 1
      Gameserver/App/model/Const/sm_sysmail.php
  32. 1 1
      Gameserver/App/model/Const/sm_waveItem.php
  33. 1 1
      Gameserver/App/model/Const/sm_waves.php
  34. 88 0
      Gameserver/App/model/User/E_PredicateActionType.php
  35. 7 0
      Gameserver/App/model/User/Info_PrivateState.php
  36. 18 0
      Gameserver/App/model/User/Info_UserBase.php
  37. 18 18
      Gameserver/App/model/User/Ins_GateInfo.php
  38. 4 0
      Gameserver/App/process/ActiveProc.php
  39. 231 0
      Gameserver/App/process/FightPower_Calculate.php
  40. 50 3
      Gameserver/App/process/FightProc.php
  41. 3 0
      Gameserver/App/process/HeroProc.php
  42. 21 149
      Gameserver/App/process/PayProc.php
  43. 12 4
      Gameserver/App/process/StoreProc.php
  44. 2 0
      Gameserver/App/process/TaskProc.php
  45. 41 7
      Gameserver/App/process/UserProc.php
  46. 42 37
      Gameserver/App/service_call/pay/Mo/payRequest.php
  47. 3 1
      Gameserver/App/service_call/pay/official/alipay/notify.php
  48. 8 8
      Gameserver/App/service_call/pay/official/pay_op.php
  49. 3 1
      Gameserver/App/service_call/pay/official/wxpay/notify.php
  50. 4 13
      Gameserver/App/test.php
  51. 2 3
      Gameserver/App/util/tapdb/TapDBUtil.php
  52. 7 8
      Gameserver/App/util/tapdb/TapDB_config.php

+ 5 - 4
Gameserver/App/Services/AppServer.php

@@ -61,7 +61,7 @@ class AppServer {
      * 后处理逻辑
      * @param Resp $resp
      */
-    private static function AfterProc(&$resp) {
+    static function AfterProc(&$resp) {
         if (req()->cmd != CmdCode::cmd_user_delUserUid) {
             if (req()->userInfoChanged || (null != ctx() && ctx()->NeedSave())) {   # 回写玩家数据
                 if (!UserProc::setUserInfo(ctx())) {                                # 失败, 改写返回值
@@ -70,8 +70,9 @@ class AppServer {
             }
         }
 
-        $resp->AfterProc();
-
+        if (null != $resp) {                                                    # resp后处理
+            $resp->AfterProc();
+        }
         self::LogCmdMongo($resp);                                               # 向MongoDB写入操作日志
 //        CLog::flush();                                                          # flush日志
         return true;
@@ -155,7 +156,7 @@ class AppServer {
             return ErrCode::clientversionlow_err;
         }
 
-        $limit_Ver = "1.0.1";                                                   # 限制客户端最低版本
+        $limit_Ver = "1.0.3";                                                   # 限制客户端最低版本
         $clientArr = CommUtil::split(req()->CV, ".");
         $serverArr = CommUtil::split($limit_Ver, ".");
         $client = $clientArr[0] * 1000 * 1000 + $clientArr[1] * 1000 + $clientArr[2];

+ 10 - 0
Gameserver/App/base/CmdCode.php

@@ -123,6 +123,16 @@ class CmdCode {
      * 改名
      */
     const user_rename = 6010;
+    
+    /**
+     * 提交新手引导步骤
+     */
+    const cmd_user_completeNewbieGuide = 6011;
+    
+    /**
+     * 重置启灵 坊市的引导记录
+     */
+    const cmd_user_clearGuideInfo = 6012;
 
 // </editor-fold>
 // <editor-fold defaultstate="collapsed" desc="活动操作码 - 61xx">

+ 54 - 34
Gameserver/App/base/ErrCode.php

@@ -205,7 +205,7 @@ class ErrCode {
     const pay_order_no = 8812;
 
     /**
-     * 充值 - 付款状态不正确 正在重新查询...
+     * 充值 - 付款状态尚未同步 请稍后重新查询...
      */
     const pay_order_paystatus = 8813;
 
@@ -220,19 +220,19 @@ class ErrCode {
     const pay_order_uid = 8815;
 
     /**
-     * 神秘商城 - 免费刷新时间未到
+     * 订单号错误
      */
-    const pay_secretshopt_freeRefresh_Time = 8816;
+    const pay_order_id = 8816;
 
     /**
-     * 订单号为null无法支付
+     * 订单 - 道具id错误
      */
     const pay_order_product_id = 8817;
 
     /**
-     * 支付失败
+     * 支付失败(无发货逻辑)
      */
-    const pay_fail = 8818;
+    const pay_fail_nologic = 8818;
 
     /**
      * 不能重复购买
@@ -243,17 +243,32 @@ class ErrCode {
      * 充值奖励重复领取
      */
     const pay_repeatReceive = 8820;
-    
+
     /**
      * 没有到充值奖励领取时间
      */
     const pay_rewardReceive_ts_limit = 8821;
-    
+
     /**
      * 累计元宝数量不足无法领取奖励
      */
     const pay_accumulateYuanBaoNotEnough = 8822;
-    
+
+    /**
+     * 神秘商城 - 免费刷新时间未到
+     */
+    const pay_secretshopt_freeRefresh_Time = 8823;
+
+    /**
+     * 支付失败(发货逻辑)
+     */
+    const pay_fail_logic = 8824;
+
+    /**
+     * 支付失败(数据库写入)
+     */
+    const pay_fail_db = 8825;
+
 // </editor-fold>
 //
 // <editor-fold defaultstate="collapsed" desc="    not enough 系列    ">
@@ -418,7 +433,7 @@ class ErrCode {
      * 没有达到解锁等级
      */
     const evolve_canotUnlock_levelLimit = 3215;
-    
+
     /**
      * 关卡没有被胜利通关
      */
@@ -471,51 +486,56 @@ class ErrCode {
      * 没有找到对应词条信息
      */
     const user_store_NoFindPredicate = 3309;
-    
+
     /**
      * 装备等级已经达到最大值
      */
     const user_store_equipLevelLimit = 3310;
-    
+
     /**
      * 不存在该装备
      */
-    const user_store_NotExistEquip = 3311; 
-    
+    const user_store_NotExistEquip = 3311;
+
     /**
      * 装备部位与宝石部位不匹配
      */
-    const user_store_PositionNotFit = 3312; 
-    
+    const user_store_PositionNotFit = 3312;
+
     /**
      * 装备材料类型错误
      */
-    const user_store_equipMaterialTypeErr = 3313; 
-    
+    const user_store_equipMaterialTypeErr = 3313;
+
     /**
      * 装备材料品阶错误
      */
-    const user_store_equipMaterialQualErr = 3314; 
-    
+    const user_store_equipMaterialQualErr = 3314;
+
     /**
      * 装备材料数量错误
      */
-    const user_store_equipMaterialNumErr = 3315; 
-    
+    const user_store_equipMaterialNumErr = 3315;
+
     /**
      * 装备已经在最低等级
      */
-    const user_store_equip_minlevel = 3316; 
-    
+    const user_store_equip_minlevel = 3316;
+
     /**
      * 装备已经在最低品阶
      */
-    const user_store_equip_minQual = 3317; 
-    
+    const user_store_equip_minQual = 3317;
+
     /**
      * 装备合成材料不能参与此次合成
      */
-    const user_store_equip_composeMaterialErr = 3318; 
+    const user_store_equip_composeMaterialErr = 3318;
+    
+    /**
+     * 该装备已达最高品阶
+     */
+    const user_store_equip_qualMaxLimit = 3319;
 // </editor-fold>
 //
 //   // <editor-fold defaultstate="collapsed" desc="    shop 3400    ">
@@ -607,37 +627,37 @@ class ErrCode {
      * 抽奖次数非法
      */
     const active_lotteryNumErr = 3509;
-    
+
     /**
      * 抽奖次数已经用完
      */
     const active_lotteryNumLimit = 3510;
-    
+
     /*
      * 抽奖券数据错误
      */
     const active_lotteryCostErr = 3511;
-    
+
     /**
      * 寻宝券数量充足不需要兑换
      */
     const active_lottery_unwantedExchange = 3512;
-    
+
     /**
      * 抽奖次数不足
      */
     const active_lotteryNumNotEnough = 3513;
-    
+
     /**
      * 兑换次数已经用完无法再次兑换
      */
     const active_lotteryExchangeNumLimit = 3514;
-    
+
     /**
      * 消耗体力值不足
      */
     const active_costTiliNotEnough = 3515;
-    
+
     /**
      * 活跃点数量不足
      */

+ 0 - 3
Gameserver/App/base/Req.php

@@ -82,9 +82,6 @@ class Req extends Object_ext {
         if ($this->CV == "unityEditor") {                                       # 对特殊CV做下处理
             $this->CV = "999.999.999";
         }
-        if ($this->CV == "unity") {
-            $this->CV = "1.1.11";
-        }
         self::$_req = $this;                                                    // ---赋值---
         switch ($this->cmd) {
             case CmdCode::cmd_user_getzonelist:                                 # 下载分区列表

+ 34 - 2
Gameserver/App/configs/GameConfig.php

@@ -3,7 +3,7 @@
  // 由CodeGenerator创建。
  // Copyright (C) gwang (wanggangzero@qq.com), Loyalsoft@sjz Inc
  // author: gwang 
- // 日期: 2024-12-17 10:12:28
+ // 日期: 2024-12-31 17:04:22
 ////////////////////
 
 namespace loyalsoft;
@@ -1040,7 +1040,7 @@ class GameConfig {
     }
     /**
     * 全局参数2
-    * @return \sm_glc2
+    * @return \glc2
     */
     public static function glc2()
     { 
@@ -1048,6 +1048,38 @@ class GameConfig {
         return self::initValue($a, 'glc2');
     }
     /**
+    * 战力公式: 装备系数表
+    * @return \equip_power
+    */
+    public static function equip_power()
+    { 
+        static $a = null; 
+        return self::initValue($a, 'equip_power');
+    }
+    /**
+    * @return \sm_equip_power equip_power item数据 
+    */
+    public static function equip_power_getItem($rarity, $qual, $position)
+    { 
+        return self::get_hash_item('equip_power', "$rarity-$qual-$position");
+    }
+    /**
+    * 新手引导表
+    * @return \guide
+    */
+    public static function guide()
+    { 
+        static $a = null; 
+        return self::initValue($a, 'guide');
+    }
+    /**
+    * @return \sm_guide guide item数据 
+    */
+    public static function guide_getItem($type, $stepId)
+    { 
+        return self::get_hash_item('guide', "$type-$stepId");
+    }
+    /**
     * 当前版本(时间戳)
     * @return \ver
     */

+ 2 - 1
Gameserver/App/index.php

@@ -142,7 +142,8 @@ class Index {
             $err = ErrCode::err_innerfault;
         }
         $resp = Resp::err($err, $msg);
-        $resp->AfterProc();
+//        $resp->AfterProc();
+        AppServer::AfterProc($resp);                                            # 后处理
         exit(Index::OverPass($resp));                                           # 直接返回错误信息
     }
 }

+ 33 - 1
Gameserver/App/model/Const/GameConfig.php

@@ -3,7 +3,7 @@
  // 由CodeGenerator创建。
  // Copyright (C) gwang (wanggangzero@qq.com), Loyalsoft@sjz Inc
  // author: gwang 
- // 日期: 2024-12-17 17:52:35
+ // 日期: 2025-01-07 17:30:01
 ////////////////////
 
 /**
@@ -1046,6 +1046,38 @@ class GameConfig {
         return self::initValue($a, 'glc2');
     }
     /**
+    * 战力公式: 装备系数表
+    * @return \equip_power
+    */
+    public static function equip_power()
+    { 
+        static $a = null; 
+        return self::initValue($a, 'equip_power');
+    }
+    /**
+    * @return \sm_equip_power equip_power item数据 
+    */
+    public static function equip_power_getItem($rarity, $qual, $position)
+    { 
+        return self::get_hash_item('equip_power', "$rarity-$qual-$position");
+    }
+    /**
+    * 新手引导表
+    * @return \guide
+    */
+    public static function guide()
+    { 
+        static $a = null; 
+        return self::initValue($a, 'guide');
+    }
+    /**
+    * @return \sm_guide guide item数据 
+    */
+    public static function guide_getItem($id, $stepId)
+    { 
+        return self::get_hash_item('guide', "$id-$stepId");
+    }
+    /**
     * 当前版本(时间戳)
     * @return \ver
     */

+ 1 - 1
Gameserver/App/model/Const/sm_activeTask.php

@@ -3,7 +3,7 @@
  // 由CodeGenerator创建。
  // Copyright (C) gwang (wanggangzero@qq.com), Loyalsoft@sjz Inc
  // author: gwang 
- // 日期: 2024-12-16 10:05:55
+ // 日期: 2025-01-07 16:10:32
 ////////////////////
 
 

+ 1 - 1
Gameserver/App/model/Const/sm_activeTask_type.php

@@ -3,7 +3,7 @@
  // 由CodeGenerator创建。
  // Copyright (C) gwang (wanggangzero@qq.com), Loyalsoft@sjz Inc
  // author: gwang 
- // 日期: 2024-12-16 10:05:55
+ // 日期: 2025-01-07 16:10:32
 ////////////////////
 
 

+ 1 - 1
Gameserver/App/model/Const/sm_activity_day7.php

@@ -3,7 +3,7 @@
  // 由CodeGenerator创建。
  // Copyright (C) gwang (wanggangzero@qq.com), Loyalsoft@sjz Inc
  // author: gwang 
- // 日期: 2024-11-22 16:05:54
+ // 日期: 2024-12-19 16:53:06
 ////////////////////
 
 

+ 1 - 1
Gameserver/App/model/Const/sm_announcement.php

@@ -3,7 +3,7 @@
  // 由CodeGenerator创建。
  // Copyright (C) gwang (wanggangzero@qq.com), Loyalsoft@sjz Inc
  // author: gwang 
- // 日期: 2024-09-30 09:35:51
+ // 日期: 2024-12-19 17:35:55
 ////////////////////
 
 

+ 1 - 6
Gameserver/App/model/Const/sm_equip.php

@@ -3,7 +3,7 @@
  // 由CodeGenerator创建。
  // Copyright (C) gwang (wanggangzero@qq.com), Loyalsoft@sjz Inc
  // author: gwang 
- // 日期: 2024-12-16 09:37:06
+ // 日期: 2024-12-26 15:31:05
 ////////////////////
 
 
@@ -73,10 +73,5 @@ class sm_equip
     */
     public $suitId;
 
-    /**
-    * @var Int32 战斗力公式计算: 装备系数 default(1) 
-    */
-    public $mulFightPower;
-
 }
 

+ 1 - 1
Gameserver/App/model/Const/sm_equip_levelupgrade.php

@@ -3,7 +3,7 @@
  // 由CodeGenerator创建。
  // Copyright (C) gwang (wanggangzero@qq.com), Loyalsoft@sjz Inc
  // author: gwang 
- // 日期: 2024-11-14 11:27:49
+ // 日期: 2024-12-24 14:26:34
 ////////////////////
 
 

+ 42 - 0
Gameserver/App/model/Const/sm_equip_power.php

@@ -0,0 +1,42 @@
+<?php
+////////////////////
+ // 由CodeGenerator创建。
+ // Copyright (C) gwang (wanggangzero@qq.com), Loyalsoft@sjz Inc
+ // author: gwang 
+ // 日期: 2024-12-26 15:18:38
+////////////////////
+
+
+/**
+ * Static Model equip_power 战力公式: 装备系数表
+ */
+class sm_equip_power
+{
+
+    /**
+    * @var Int32 用途未知!!请到数据库中添加字段注释。  
+    */
+    public $id;
+
+    /**
+    * @var Int32 装备稀有度:1:普通;2:S级  
+    */
+    public $rarity;
+
+    /**
+    * @var Int32 部位: 1 武器, 2 护甲, 3 项链, 4 腰带, 5 手套, 6 靴子  
+    */
+    public $position;
+
+    /**
+    * @var Int32 品阶: 白,绿,蓝,紫,紫+1,紫+2.....  
+    */
+    public $qual;
+
+    /**
+    * @var Single 装备战力系数  
+    */
+    public $power;
+
+}
+

+ 1 - 1
Gameserver/App/model/Const/sm_errmsg.php

@@ -3,7 +3,7 @@
  // 由CodeGenerator创建。
  // Copyright (C) gwang (wanggangzero@qq.com), Loyalsoft@sjz Inc
  // author: gwang 
- // 日期: 2024-10-09 18:05:52
+ // 日期: 2025-01-03 10:47:29
 ////////////////////
 
 

+ 1 - 1
Gameserver/App/model/Const/sm_evolve.php

@@ -3,7 +3,7 @@
  // 由CodeGenerator创建。
  // Copyright (C) gwang (wanggangzero@qq.com), Loyalsoft@sjz Inc
  // author: gwang 
- // 日期: 2024-12-17 15:05:55
+ // 日期: 2025-01-06 16:42:30
 ////////////////////
 
 

+ 1 - 1
Gameserver/App/model/Const/sm_fun_unlock.php

@@ -3,7 +3,7 @@
  // 由CodeGenerator创建。
  // Copyright (C) gwang (wanggangzero@qq.com), Loyalsoft@sjz Inc
  // author: gwang 
- // 日期: 2024-12-17 17:35:55
+ // 日期: 2024-12-31 15:20:27
 ////////////////////
 
 

+ 21 - 1
Gameserver/App/model/Const/sm_gate.php

@@ -3,7 +3,7 @@
  // 由CodeGenerator创建。
  // Copyright (C) gwang (wanggangzero@qq.com), Loyalsoft@sjz Inc
  // author: gwang 
- // 日期: 2024-12-12 21:02:39
+ // 日期: 2025-01-07 17:20:51
 ////////////////////
 
 
@@ -21,6 +21,11 @@ class sm_gate
     */
     public $gateId;
 
+    /**
+    * @var Int32 地图资源类型: (第一位: 1四方连续 2上下连续 3固定 4左右连续) default(0) 
+    */
+    public $mapRes;
+
     /**
     * @var String 地图上的装饰物: id,num;id,num;....(最多6种)  
     */
@@ -31,6 +36,16 @@ class sm_gate
     */
     public $weather;
 
+    /**
+    * @var Int32 【废弃2024.7.23】关卡难度:主线难度:1,挑战难度:1,2,3...  
+    */
+    public $gateDifficult;
+
+    /**
+    * @var Int32 关卡序号  
+    */
+    public $gateNum;
+
     /**
     * @var String 名称  
     */
@@ -195,5 +210,10 @@ class sm_gate
     */
     public $tz_reward3;
 
+    /**
+    * @var Int32 0:没有关卡预告 1:该关有预告 default(0) 
+    */
+    public $preview;
+
 }
 

+ 6 - 1
Gameserver/App/model/Const/sm_gate_unlock.php

@@ -3,7 +3,7 @@
  // 由CodeGenerator创建。
  // Copyright (C) gwang (wanggangzero@qq.com), Loyalsoft@sjz Inc
  // author: gwang 
- // 日期: 2024-12-12 21:02:39
+ // 日期: 2025-01-07 17:20:51
 ////////////////////
 
 
@@ -61,5 +61,10 @@ class sm_gate_unlock
     */
     public $tz_reward3;
 
+    /**
+    * @var Int32 0:没有关卡预告 1:该关有预告 default(0) 
+    */
+    public $preview;
+
 }
 

+ 21 - 1
Gameserver/App/model/Const/sm_glc2.php

@@ -3,7 +3,7 @@
  // 由CodeGenerator创建。
  // Copyright (C) gwang (wanggangzero@qq.com), Loyalsoft@sjz Inc
  // author: gwang 
- // 日期: 2024-12-17 09:33:54
+ // 日期: 2025-01-03 16:14:23
 ////////////////////
 
 
@@ -18,6 +18,11 @@ class sm_glc2
     */
     public $activity_lottery_FreeNum;
 
+    /**
+    * @var Single 暴击系数  
+    */
+    public $fightPower_bitHitParas;
+
     /**
     * @var Int32 仙树抽奖广告  
     */
@@ -28,5 +33,20 @@ class sm_glc2
     */
     public $activity_lottery_GuanggaoDownTs;
 
+    /**
+    * @var Int32 通关第二关并领取第二关的第一个章节宝箱后 触发装备升级 降级   
+    */
+    public $guide_equipLevel_triggerGateId;
+
+    /**
+    * @var Int32 通关第二关并领取第二关的第一个章节宝箱后  
+    */
+    public $guide_equipLevel_triggerGateBoxIndex;
+
+    /**
+    * @var String 引导阶段必出的技能列表,逗号分隔(每次三选一出一个)  
+    */
+    public $guide_skillids;
+
 }
 

+ 4 - 4
Gameserver/App/model/Const/sm_globalsettings.php

@@ -3,7 +3,7 @@
  // 由CodeGenerator创建。
  // Copyright (C) gwang (wanggangzero@qq.com), Loyalsoft@sjz Inc
  // author: gwang 
- // 日期: 2024-12-17 14:34:30
+ // 日期: 2025-01-06 10:33:25
 ////////////////////
 
 
@@ -149,7 +149,7 @@ class sm_globalsettings
     public $sweep_cost_tili;
 
     /**
-    * @var Int32 解锁挑战模块所需的关卡id  
+    * @var Int32 解锁挑战模块所需的关卡id(废除)  
     */
     public $unlock_Challenge_need_gateId;
 
@@ -169,7 +169,7 @@ class sm_globalsettings
     public $tower_refreshCost;
 
     /**
-    * @var Int32 战斗力计算公式: 生命系数  
+    * @var Single 战斗力计算公式: 生命系数  
     */
     public $fightPower_MulHp;
 
@@ -324,7 +324,7 @@ class sm_globalsettings
     public $equipQual_NotDownGrading;
 
     /**
-    * @var Int32 战力公式: 攻击力系数  
+    * @var Single 战力公式: 攻击力系数  
     */
     public $fightPower_MulAtk;
 

+ 90 - 0
Gameserver/App/model/Const/sm_guide.php

@@ -0,0 +1,90 @@
+<?php
+////////////////////
+ // 由CodeGenerator创建。
+ // Copyright (C) gwang (wanggangzero@qq.com), Loyalsoft@sjz Inc
+ // author: gwang 
+ // 日期: 2024-12-31 16:36:04
+////////////////////
+
+
+/**
+ * Static Model guide 新手引导表
+ */
+class sm_guide
+{
+
+    /**
+    * @var Int32 1:启灵,坊市
+    *  2:装备
+    *  3:战斗引导,主动技能
+    *  4:战斗引导,被动技能
+    *  5:装备的升级,降品,套装属性说明  
+    */
+    public $id;
+
+    /**
+    * @var Int32 引导模块类型
+    *  (0普通点击 1指定技能)  
+    */
+    public $type;
+
+    /**
+    * @var Int32 步骤Id default(0) 
+    */
+    public $stepId;
+
+    /**
+    * @var String 按钮路径  
+    */
+    public $btnPath;
+
+    /**
+    * @var String 箭头坐标偏移;默认坐标(0, 100)  
+    */
+    public $arrOffsetPos;
+
+    /**
+    * @var String 提示坐标偏移;默认坐标(0, 400)  
+    */
+    public $tipsOffsetPos;
+
+    /**
+    * @var String 提示文字  
+    */
+    public $tips;
+
+    /**
+    * @var Single 箭头角度 default(0) 
+    */
+    public $arrAngle;
+
+    /**
+    * @var String 引导的参数  
+    */
+    public $guidParameter;
+
+    /**
+    * @var Int32 是否强制储存 意思是:跳过本次引导【回存的时候记得把本次引导的最后一步记录下来】  
+    *  1:强制存储  default(0) 
+    */
+    public $forceSave;
+
+    /**
+    * @var Single 延迟时间 default(0) 
+    */
+    public $delayTime;
+
+    /**
+    * @var Int32 没有,是否继续
+    *  1:继续 0:不继续
+    *   default(0) 
+    */
+    public $notGoOn;
+
+    /**
+    * @var String 高亮路径  
+    */
+    public $lightPath;
+
+}
+

+ 2 - 2
Gameserver/App/model/Const/sm_hero.php

@@ -3,7 +3,7 @@
  // 由CodeGenerator创建。
  // Copyright (C) gwang (wanggangzero@qq.com), Loyalsoft@sjz Inc
  // author: gwang 
- // 日期: 2024-12-16 16:05:55
+ // 日期: 2025-01-07 16:51:58
 ////////////////////
 
 
@@ -215,7 +215,7 @@ class sm_hero
     public $roleCard;
 
     /**
-    * @var Int32 战斗力计算公式: 角色系数 default(1) 
+    * @var Single 战斗力计算公式: 角色系数 default(1) 
     */
     public $mulFightPower;
 

+ 2 - 2
Gameserver/App/model/Const/sm_heroType_typeId.php

@@ -3,7 +3,7 @@
  // 由CodeGenerator创建。
  // Copyright (C) gwang (wanggangzero@qq.com), Loyalsoft@sjz Inc
  // author: gwang 
- // 日期: 2024-12-16 16:05:55
+ // 日期: 2025-01-07 16:51:58
 ////////////////////
 
 
@@ -215,7 +215,7 @@ class sm_heroType_typeId
     public $roleCard;
 
     /**
-    * @var Int32 战斗力计算公式: 角色系数 default(1) 
+    * @var Single 战斗力计算公式: 角色系数 default(1) 
     */
     public $mulFightPower;
 

+ 3 - 2
Gameserver/App/model/Const/sm_item.php

@@ -3,7 +3,7 @@
  // 由CodeGenerator创建。
  // Copyright (C) gwang (wanggangzero@qq.com), Loyalsoft@sjz Inc
  // author: gwang 
- // 日期: 2024-12-17 15:03:37
+ // 日期: 2025-01-06 14:28:01
 ////////////////////
 
 
@@ -58,7 +58,8 @@ class sm_item
     public $pileNum;
 
     /**
-    * @var Int32 品质/稀有度 1白2绿3蓝 default(1) 
+    * @var Int32 道具品质/稀有度 1白2绿3蓝4紫5橙色6红色7金
+    *  装备品质颜色对应装备品阶数据:1白2绿3蓝4紫7橙11红16金 default(1) 
     */
     public $quality;
 

+ 1 - 1
Gameserver/App/model/Const/sm_player_level.php

@@ -3,7 +3,7 @@
  // 由CodeGenerator创建。
  // Copyright (C) gwang (wanggangzero@qq.com), Loyalsoft@sjz Inc
  // author: gwang 
- // 日期: 2024-12-16 10:23:40
+ // 日期: 2024-12-30 14:53:34
 ////////////////////
 
 

+ 1 - 1
Gameserver/App/model/Const/sm_predicate.php

@@ -3,7 +3,7 @@
  // 由CodeGenerator创建。
  // Copyright (C) gwang (wanggangzero@qq.com), Loyalsoft@sjz Inc
  // author: gwang 
- // 日期: 2024-12-17 15:38:46
+ // 日期: 2025-01-07 14:57:57
 ////////////////////
 
 

+ 1 - 1
Gameserver/App/model/Const/sm_shop.php

@@ -3,7 +3,7 @@
  // 由CodeGenerator创建。
  // Copyright (C) gwang (wanggangzero@qq.com), Loyalsoft@sjz Inc
  // author: gwang 
- // 日期: 2024-12-12 17:58:23
+ // 日期: 2024-12-18 18:10:09
 ////////////////////
 
 

+ 1 - 1
Gameserver/App/model/Const/sm_shop_cash.php

@@ -3,7 +3,7 @@
  // 由CodeGenerator创建。
  // Copyright (C) gwang (wanggangzero@qq.com), Loyalsoft@sjz Inc
  // author: gwang 
- // 日期: 2024-06-07 18:24:33
+ // 日期: 2024-12-18 18:09:27
 ////////////////////
 
 

+ 1 - 1
Gameserver/App/model/Const/sm_skills.php

@@ -3,7 +3,7 @@
  // 由CodeGenerator创建。
  // Copyright (C) gwang (wanggangzero@qq.com), Loyalsoft@sjz Inc
  // author: gwang 
- // 日期: 2024-12-10 10:35:55
+ // 日期: 2025-01-06 11:21:58
 ////////////////////
 
 

+ 1 - 1
Gameserver/App/model/Const/sm_sysmail.php

@@ -3,7 +3,7 @@
  // 由CodeGenerator创建。
  // Copyright (C) gwang (wanggangzero@qq.com), Loyalsoft@sjz Inc
  // author: gwang 
- // 日期: 2024-09-30 11:05:09
+ // 日期: 2024-12-23 15:21:05
 ////////////////////
 
 

+ 1 - 1
Gameserver/App/model/Const/sm_waveItem.php

@@ -3,7 +3,7 @@
  // 由CodeGenerator创建。
  // Copyright (C) gwang (wanggangzero@qq.com), Loyalsoft@sjz Inc
  // author: gwang 
- // 日期: 2024-12-17 17:10:09
+ // 日期: 2025-01-07 17:01:29
 ////////////////////
 
 

+ 1 - 1
Gameserver/App/model/Const/sm_waves.php

@@ -3,7 +3,7 @@
  // 由CodeGenerator创建。
  // Copyright (C) gwang (wanggangzero@qq.com), Loyalsoft@sjz Inc
  // author: gwang 
- // 日期: 2024-12-17 17:10:09
+ // 日期: 2025-01-07 17:01:29
 ////////////////////
 
 

+ 88 - 0
Gameserver/App/model/User/E_PredicateActionType.php

@@ -0,0 +1,88 @@
+<?php
+
+/* 
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+namespace loyalsoft;
+
+/**
+ * 词条
+ *
+ * @author c'y'zhao
+ */
+class E_PredicateActionType {
+    
+    /**
+     * 攻击力增加X actionParam1
+     */
+    const addDamage = "addDamage";
+    
+    /**
+     * 攻击力额外增加X% actionParam1
+     */
+    const mulDamage = "mulDamage";
+    
+    /**
+     * 所有装备基础属性+5%----基础攻击力/生命 攻击力取actionParam1 生命actionParam2
+     */
+    const mulEquipBasicProps = "mulEquipBasicProps";
+    
+    /**
+     * 生命增加X  actionParam1
+     */    
+    const addHp = "addHp";
+    
+    /**
+     * 生命值额外增加X% actionParam1
+     */
+    const mulHp = "mulHp";
+    
+    /**
+     * 暴击率增加3% actionParam1
+     */
+    const addBigHitRate = "addBigHitRate";
+    
+    /**
+     * 增加X%暴击率且增加Y%暴击伤害 actionParam1 X  actionParam1 Y
+     */
+    const addBigHitRateAndVal = "addBigHitRateAndVal";
+    
+    /**
+     * 暴击伤害增加50%  actionParam1
+     */
+    const addBigHitVal = "addBigHitVal";
+    
+    /**
+     * 肉食恢复+10  actionParam1
+     */
+    const addEatFood = "addEatFood";
+    
+    /**
+     * 肉食恢复效果增加10%  actionParam1
+     */
+    const mulEatFood = "mulEatFood";
+    
+    /**
+     * 减伤+1 受到伤害减少X actionParam1
+     */
+    const addDecDamage = "addDecDamage";
+    
+    /**
+     * 伤害减免+20%  actionParam1
+     */
+    const mulDecDamage = "mulDecDamage";
+    
+    /**
+     * 所有装备基础属性+5%----等级的基础攻击力/生命 攻击力取actionParam1 
+     */
+    const mulEquipBasicProps_damage = "mulEquipBasicProps_damage";
+    
+    /**
+     * 所有装备基础属性+5%----等级的基础攻击力/生命 攻击力取actionParam1  生命actionParam2
+     */
+    const mulEquipBasicProps_hp = "mulEquipBasicProps_hp";
+    
+}

+ 7 - 0
Gameserver/App/model/User/Info_PrivateState.php

@@ -247,6 +247,13 @@ class Info_PrivateState extends Object_ext {
      */
     #[ArrayType]
     public $funUnlockRecord_2 = array();
+    
+    /**
+     * 为启灵 坊市的引导 用的 
+     * @var type
+     */
+    #[ArrayType]
+    public $funUnlockRecord_3 = array();
 
     /**
      * 解锁的技能记录

+ 18 - 0
Gameserver/App/model/User/Info_UserBase.php

@@ -114,6 +114,24 @@ class Info_UserBase extends Object_ext {
      */
     public $fRechargePriceReceived = 0;
     
+    /**
+     * 引导步骤记录
+     * @var type
+     */
+    public $guide = 0;
+    
+    /**
+     * 引导模块
+     * @var type
+     */
+    public $guide_type = 0;
+
+    /**
+     * 引导模块 1:结束标志 
+     * @var type
+     */
+    public $guide_type_forceSave = 0;
+
     public function initialize() {
 //        my_Assert(GameConfig::primordial_data(), "找不到账号初始化数据");         # 防御
         $this->gold = glc()->Init_Player_gold;

+ 18 - 18
Gameserver/App/model/User/Ins_GateInfo.php

@@ -88,23 +88,22 @@ class Ins_GateInfo extends Object_ext {
         return Ints::Slice($gateId, 0, 1);
     }
 
-    /**
-     * 从gateId中提取关卡地图资源类型(前端用)
-     * @param type $gateId  1 无限地图 2 上下地图 3 有限地图
-     * @return int 0..999
-     */
-    public static function GateMapRes($gateId) {
-        return Ints::Slice($gateId, 1, 4);
-    }
-
-    /**
-     * 从gateId中提取关卡难度(挑战关卡分1,2,3)
-     * @param type $gateId
-     * @return int
-     */
-    public static function GateDifficultyFromId($gateId) {
-        return Ints::Slice($gateId, 5, 1);
-    }
+//    /**
+//     * 从gateId中提取关卡地图资源类型(前端用)
+//     * @param type $gateId  1 无限地图 2 上下地图 3 有限地图
+//     * @return int 0..999
+//     */
+//    public static function GateMapRes($gateId) {
+//        return Ints::Slice($gateId, 1, 4);
+//    }
+//    /**
+//     * 从gateId中提取关卡难度(挑战关卡分1,2,3)
+//     * @param type $gateId
+//     * @return int
+//     */
+//    public static function GateDifficultyFromId($gateId) {
+//        return Ints::Slice($gateId, 5, 1);
+//    }
 
     /**
      * 关卡序号(最大999)
@@ -112,6 +111,7 @@ class Ins_GateInfo extends Object_ext {
      * @return int
      */
     public static function gateNum($gateId) {
-        return Ints::Slice($gateId, 6, 3);
+        return $gateId % 1000;
+//        return Ints::Slice($gateId, 6, 3);
     }
 }

+ 4 - 0
Gameserver/App/process/ActiveProc.php

@@ -84,6 +84,8 @@ class ActiveProc {
                     'cash' => ctx()->baseInfo->cash,
                     'gold' => ctx()->baseInfo->gold,
                     'reward' => StoreProc::$reward,
+                    'reward_Gem' => StoreProc::$reward_Gem,
+                    'reward_equip' => StoreProc::$reward_equip,            
         ));
     }
 
@@ -107,6 +109,8 @@ class ActiveProc {
                     "store" => ctx()->store,
                     'cash' => ctx()->baseInfo->cash,
                     'reward' => StoreProc::$reward,
+                    'reward_Gem' => StoreProc::$reward_Gem,
+                    'reward_equip' => StoreProc::$reward_equip,          
         ));
     }
 

+ 231 - 0
Gameserver/App/process/FightPower_Calculate.php

@@ -0,0 +1,231 @@
+<?php
+
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+namespace loyalsoft;
+
+/**
+ * 【四舍五入】
+ * 战力 = (基础攻击力 * 攻击力系数 + 基础生命值 * 生命值系数 + (1+暴击率) * (1+暴击伤害) * 攻击力系数 + 肉食恢复加成 * (1+肉食恢复效果)*生命值系数+伤害减免值 * (1+伤害减免效果)* 生命值系数)*(1+装备系数+角色系数)
+ */
+class FightPower_Calculate {
+    
+
+    public static function GetFightPower() {       
+        $file = __NAMESPACE__ . '\\'  . 'E_PredicateActionType';       
+        $reflectionClass = new \ReflectionClass($file);
+        $constants = $reflectionClass->getConstants();
+
+        $dic = new \stdClass();
+        foreach ($constants as $name => $predicateActionType) {
+            $dic->$predicateActionType = 0;
+        }
+                      
+        $CurrentHeroId = ctx()->heros->CurrentHeroId;
+        $mo = GameConfig::hero_getItem($CurrentHeroId);
+        my_Assert($mo != null, ErrCode::err_const_no);
+        
+//【1.当前英雄表里的基础攻击 2.装备品质解锁的攻击力 3.装备里镶嵌的宝石攻击力 4.组成套装的攻击力5.启灵攻击力 6.英雄自带词条】 7.装备等级带来的攻击力/生命
+        //英雄带的                       
+        $hero_special_predicate = explode(',', $mo->special_predicate);           
+        foreach ($hero_special_predicate as $hero_predicateId) {
+            self::predicateActionParamVal($hero_predicateId,$dic);        
+        }
+        
+        //装备
+        $attck = 0;
+        $hp = 0;
+        $equipDic = ctx()->store->equipLocation;
+             
+        $suitDic = new \stdClass();              
+        $equipParam = 0;
+        foreach ($equipDic as $index => $equipUid) {
+            //等级
+            $ins_Equip = new Ins_Equip(ctx()->store->equip->$equipUid);
+            $equipParam += GameConfig::equip_power_getItem($ins_Equip->mo()->rarity, $ins_Equip->qual, $ins_Equip->mo()->position)->power;
+            if ($ins_Equip->mo()->position % 2 == 1) {
+                $attck += GameConfig::equip_levelupgrade_getItem($ins_Equip->mo()->rarity, $ins_Equip->qual, $ins_Equip->mo()->position, $ins_Equip->level)->attckNum;
+            } elseif ($ins_Equip->mo()->position % 2 == 0) {
+                $hp += GameConfig::equip_levelupgrade_getItem($ins_Equip->mo()->rarity, $ins_Equip->qual, $ins_Equip->mo()->position, $ins_Equip->level)->hpNum;
+            }
+            //品阶解锁
+            $str = explode(';', $ins_Equip->mo()->qual_predicateId);
+            foreach ($str as $val) {
+                $str2 = explode(',', $val);
+                if($ins_Equip->qual >= $str2[0]){
+                    self::predicateActionParamVal($str2[1],$dic);                
+                }                          
+            }
+            
+            //套装
+            $suitId = $ins_Equip->mo()->suitId;
+            if(StlUtil::dictHasProperty($suitDic, $suitId)){
+                $suitDic->$suitId += 1;
+            } else {
+                $suitDic->$suitId = 1;
+            }
+            
+            //宝石
+            if($ins_Equip->qual >=4 && $ins_Equip->gemSetSlot != null){
+                foreach ($ins_Equip->gemSetSlot as $index => $gemUid) {
+                    if($gemUid != 0){
+                        $gem_predicateId = ctx()->store->gemStore->$gemUid->predicateId;
+                        self::predicateActionParamVal($gem_predicateId,$dic);                    
+                    }
+                }               
+            }
+        }
+        
+        foreach ($suitDic as $suitId => $num) {
+            $suitMo = GameConfig::equip_suit_getItem($suitId);
+            my_Assert($suitMo != null, ErrCode::err_const_no);
+            if($num >= $suitMo->num){
+                self::predicateActionParamVal($suitMo->effect,$dic);             
+            }
+        }
+        
+        $arr = GameConfig::evolve();
+        $evolveMaxId_left = ctx()->gates->evolveMaxId_left;
+        $evolveMaxId_right = ctx()->gates->evolveMaxId_right;
+        foreach ($arr as $key => $value) {
+            isEditor() and $value = new \sm_evolve();
+            if ($key <= $evolveMaxId_left) {             
+                self::predicateActionParamVal($value->predicateId,$dic);
+                //continue;             
+            }
+            
+            if($value->specificEvolveId >0 && $value->specificEvolveId <= $evolveMaxId_right){
+                self::predicateActionParamVal($value->specificPredicateId,$dic);
+                //continue;
+            }
+              
+        }
+        
+        //战力 = (基础攻击力 * 攻击力系数 + 基础生命值 * 生命值系数 + (1+暴击率) * (1+暴击伤害) * 攻击力系数 + 肉食恢复加成 * (1+肉食恢复效果)*生命值系数+伤害减免值 * (1+伤害减免效果)* 生命值系数) * (1+装备系数+角色系数)       
+        $attackParas = glc()->fightPower_MulAtk;
+        $hpParas = glc()->fightPower_MulHp;
+        $fightPower_bitHitParas = GameConfig::glc2()->fightPower_bitHitParas;
+        
+        $addDamage_ActionKey = E_PredicateActionType::addDamage;
+        $dic->$addDamage_ActionKey += $mo->attack;
+        $dic->$addDamage_ActionKey +=$attck;     
+        $base_addDamage = $dic->$addDamage_ActionKey;//基础攻击      
+        
+        
+        $addHp_ActionKey = E_PredicateActionType::addHp;
+        $dic->$addHp_ActionKey += $mo->hp; 
+        $dic->$addHp_ActionKey +=$hp; 
+        $base_addHp = $dic->$addHp_ActionKey;//基础生命值
+        
+        
+        $addBigHitRate_ActionKey = E_PredicateActionType::addBigHitRate;
+        $dic->$addBigHitRate_ActionKey += $mo->bigHit_rate; 
+        $baojilv = $dic->$addBigHitRate_ActionKey;//暴击率
+        
+        $addBigHitVal_ActionKey = E_PredicateActionType::addBigHitVal;                          
+        $dic->$addBigHitVal_ActionKey += $mo->bigHit_Val;
+        $baojishanghai = $dic->$addBigHitVal_ActionKey;//暴击伤害
+                                 
+        
+        $mulDamage_ActionKey = E_PredicateActionType::mulDamage;
+        $mulDamageVal = $dic->$mulDamage_ActionKey;//攻击里加成百分比
+        
+        $mulHp_ActionKey = E_PredicateActionType::mulHp;
+        $mulHpVal = $dic->$mulHp_ActionKey;//生命额外加成
+                                   
+        $addEatFood_ActionKey = E_PredicateActionType::addEatFood;
+        $roushihuifu = $dic->$addEatFood_ActionKey;
+        $mulEatFood_ActionKey = E_PredicateActionType::mulEatFood;
+        $roushihuifu_xiaoguo = $dic->$mulEatFood_ActionKey;
+        $addDecDamage_ActionKey = E_PredicateActionType::addDecDamage;
+        $shanghaijianmian = $dic->$addDecDamage_ActionKey;
+        $mulDecDamage_ActionKey = E_PredicateActionType::mulDecDamage;
+        $shanghaijianmian_xiaoguo = $dic->$mulDecDamage_ActionKey;
+        
+        $mulEquipBasicProps_damage_ActionKey = E_PredicateActionType::mulEquipBasicProps_damage;
+        $mulEquipBasicProps_damage_val = $dic->$mulEquipBasicProps_damage_ActionKey;
+        $mulEquipBasicProps_hp_ActionKey = E_PredicateActionType::mulEquipBasicProps_hp;
+        $mulEquipBasicProps_hp_val = $dic->$mulEquipBasicProps_hp_ActionKey;
+
+        
+        $gongji = round($base_addDamage*(1+$mulDamageVal+$mulEquipBasicProps_damage_val),0);
+        $shengming = round($base_addHp*(1+$mulHpVal+$mulEquipBasicProps_hp_val),0);
+        
+        $fightPower = ($gongji*$attackParas + $shengming*$hpParas + (1+$baojilv)*(1+$baojishanghai)*$attackParas*$fightPower_bitHitParas + $roushihuifu*(1+$roushihuifu_xiaoguo)*$hpParas + $shanghaijianmian*(1+$shanghaijianmian_xiaoguo)* $hpParas)*(1 + $equipParam + $mo->mulFightPower);
+       
+//        var_dump('---base_addDamage攻击-------------------'.$base_addDamage);
+//        var_dump('攻击里加成百分比---------------'.$mulDamageVal);
+//        var_dump('mulEquipBasicProps_damage_val----'.$mulEquipBasicProps_damage_val);                     
+//        var_dump('---攻击最后值-------------------'.$gongji);
+//        var_dump('---攻击系数-------------------'.$attackParas);
+//        
+//        
+//        var_dump('---base_addHp-------------------'.$base_addHp);
+//        var_dump('---生命额外加成-------------------'.$mulHpVal);
+//        var_dump('---启灵加成-------------------'.$mulEquipBasicProps_hp_val);
+//        var_dump('---生命最后值-------------------'.$shengming);
+//        
+//        var_dump('---生命系数-------------------'.$hpParas);
+//        
+//        var_dump('---baojilv-------------------'.$baojilv);
+//        var_dump('---baojishanghai------------------'.$baojishanghai);
+//        var_dump('---roushihuifu-------------------'.$roushihuifu);
+//        var_dump('---roushihuifu_xiaoguo-------------------'.$roushihuifu_xiaoguo);
+//        var_dump('---shanghaijianmian-------------------'.$shanghaijianmian);
+//        var_dump('---shanghaijianmian_xiaoguo-------------------'.$shanghaijianmian_xiaoguo);
+//        var_dump('---equipParam-------------------'.$equipParam);
+//        
+//        var_dump('shanghaijianmian_xiaoguo_val----'.$mulEquipBasicProps_hp_val);
+//        
+//               
+        return round($fightPower,0);
+    }
+    
+    
+    /**
+     * 获取词条对应的参数值
+     * @param type $predicateId
+     */
+    public static function predicateActionParamVal($predicateId,&$dic) {        
+        $predicateMo = GameConfig::predicate_getItem($predicateId);
+        my_Assert(null != $predicateMo, ErrCode::err_const_no);
+        switch ($predicateMo->actionType) {
+            case E_PredicateActionType::mulEquipBasicProps://所有装备基础属性+5%---基础攻击力/生命 攻击力取actionParam1 生命actionParam2            
+                if ($predicateMo->actionParam1 != null) {
+                    $actionKey = E_PredicateActionType::mulEquipBasicProps_damage;
+                    $actionVal = $predicateMo->actionParam1;
+                    $dic->$actionKey += $actionVal;                   
+                }
+
+                if ($predicateMo->actionParam2 != null) {
+                    $actionKey = E_PredicateActionType::mulEquipBasicProps_hp;
+                    $actionVal = $predicateMo->actionParam2;
+                    $dic->$actionKey += $actionVal;                 
+                }
+
+                break;
+            case E_PredicateActionType::addBigHitRateAndVal://增加X%暴击率且增加Y%暴击伤害 actionParam1 X  actionParam1 Y
+                $actionKey1 = E_PredicateActionType::addBigHitRate;
+                $actionKey2 = E_PredicateActionType::addBigHitVal;
+                $actionVal1 = $predicateMo->actionParam1;
+                $actionVal2 = $predicateMo->actionParam2;
+
+                $dic->$actionKey1 += $actionVal1;
+                $dic->$actionKey2 += $actionVal2;                          
+                break;
+            default:                             
+                $actionKey = $predicateMo->actionType;
+                $actionVal = $predicateMo->actionParam1;                     
+                                              
+                if(StlUtil::dictHasProperty($dic, $actionKey)){
+                    $dic->$actionKey += $actionVal;                  
+                }                                                         
+                break;
+        }
+    }
+
+}

+ 50 - 3
Gameserver/App/process/FightProc.php

@@ -237,7 +237,7 @@ class FightProc {
             ctx()->gates->evolveMaxId_right = $id;
             TaskProc::OnCompleteNumSpecialQiLing();
         }
-
+        FightProc::Ranking_FightPower();
         UserProc::updateUserInfo();
         $ret = array(
             'task' => ctx()->task,
@@ -638,6 +638,10 @@ class FightProc {
         if ($tag) {
             my_Assert(!in_array($mask, $gateInfo->FirstReward), ErrCode::gate_GatePriceHasReceive);
             $gateInfo->FirstReward[] = $mask;
+            if ($gateId == GameConfig::glc2()->guide_equipLevel_triggerGateId && $index == GameConfig::glc2()->guide_equipLevel_triggerGateBoxIndex) {
+                ctx()->privateData(true)->funUnlockRecord_3[] = 5;
+            }
+
             StoreProc::AddMultiItemInStore($prize);
         }
         ctx()->gates->GateList->$gateId = $gateInfo;
@@ -655,6 +659,7 @@ class FightProc {
             'reward_equip' => StoreProc::$reward_equip,
             'funUnlockRecord' => ctx()->privateState->funUnlockRecord,
             'funUnlockRecord_2' => ctx()->privateState->funUnlockRecord_2,
+            'funUnlockRecord_3' => ctx()->privateState->funUnlockRecord_3,
         );
         return Resp::ok($ret);
     }
@@ -875,11 +880,38 @@ class FightProc {
                 if ($tag && !in_array($id, ctx()->privateState->funUnlockRecord_2)) {
                     ctx()->privateData(true)->funUnlockRecord[] = $id;
                     ctx()->privateData(true)->funUnlockRecord_2[] = $id;
+                    if ($id == 13 || $id == 16 || $id == 14) {
+                        self::unlockGuideType($id);
+                        //ctx()->privateData(true)->funUnlockRecord_3[] = 
+                    }
                     self::SubFunDateInit_FunUnlock($id);
                 }
             }
         }
     }
+    
+    public static function unlockGuideType($id) {
+        $type = 0;
+        switch ($id) {
+            case 13://坊市
+                $type = 1;
+                break;
+            case 16://启灵
+                $type = 1;
+                break;
+            case 14://装备
+                $type = 2;
+                break;                     
+            default:
+                break;
+        }
+        
+        if($type >0 && !in_array($type,ctx()->privateData(true)->funUnlockRecord_3)){
+            ctx()->privateData(true)->funUnlockRecord_3[] = $type;
+        }
+        
+        //return $type;
+    }
 
     /**
      *  初次得到装备 功能解锁
@@ -901,6 +933,11 @@ class FightProc {
             if ($tag && !in_array($id, ctx()->privateState->funUnlockRecord_2)) {
                 ctx()->privateData(true)->funUnlockRecord[] = $id;
                 ctx()->privateData(true)->funUnlockRecord_2[] = $id;
+
+                if ($id == 13 || $id == 16 || $id == 14) {
+                    self::unlockGuideType($id);
+                    //ctx()->privateData(true)->funUnlockRecord_3[] = 
+                }
                 self::SubFunDateInit_FunUnlock($id);
             }
         }
@@ -925,6 +962,10 @@ class FightProc {
             if ($tag && !in_array($id, ctx()->privateState->funUnlockRecord_2)) {
                 ctx()->privateData(true)->funUnlockRecord[] = $id;
                 ctx()->privateData(true)->funUnlockRecord_2[] = $id;
+                if ($id == 13 || $id == 16 || $id == 14) {
+                    self::unlockGuideType($id);
+                    //ctx()->privateData(true)->funUnlockRecord_3[] = self::unlockGuideType($id);
+                }
                 self::SubFunDateInit_FunUnlock($id);
             }
         }
@@ -961,6 +1002,10 @@ class FightProc {
             if ($tag && !in_array($id, ctx()->privateState->funUnlockRecord_2)) {
                 ctx()->privateData(true)->funUnlockRecord[] = $id;
                 ctx()->privateData(true)->funUnlockRecord_2[] = $id;
+                if ($id == 13 || $id == 16 || $id == 14) {
+                    self::unlockGuideType($id);
+                    //ctx()->privateData(true)->funUnlockRecord_3[] = self::unlockGuideType($id);
+                }
                 self::SubFunDateInit_FunUnlock($id);
             }
         }
@@ -1252,7 +1297,8 @@ class FightProc {
         $uid = req()->uid;
 
         $score = self::GetRankScoreUid($uid, 2);
-        $power = self::countUserFightPower();
+        //$power = self::countUserFightPower();
+        $power = FightPower_Calculate::GetFightPower();
         if ($power > $score) {
             $arr = array();
             $arr["$uid"] = self::createScore($power);
@@ -1300,7 +1346,8 @@ class FightProc {
             $isExistFinishReward_other = self::isExistNoDrawed_FightPower();
         } else {
             $list = gMem()->zrevrange(MemKey_GameRun::Rank_FightPower_Zone_zset(req()->zoneid), 0, glc()->Rank_FightPower_OnListRank, true);
-            $selfExtraInfo = self::countUserFightPower();
+            //$selfExtraInfo = self::countUserFightPower();
+            $selfExtraInfo = FightPower_Calculate::GetFightPower();
 
             $isExistFinishReward = self::isExistNoDrawed_FightPower();
             $isExistFinishReward_other = self::isExistNoDrawed_MainGate();

+ 3 - 0
Gameserver/App/process/HeroProc.php

@@ -88,6 +88,7 @@ class HeroProc {
         }
         StlUtil::dictRemove(ctx()->heros->Dic, $heroId);
 
+        FightProc::Ranking_FightPower();
         UserProc::updateUserInfo();
         return Resp::ok(array(
                     'store' => ctx()->store,
@@ -202,6 +203,8 @@ class HeroProc {
         list($newHeroId) = req()->paras;                                        # 切换英雄id
         my_Assert(CommUtil::isPropertyExists(ctx()->heros->Dic, $newHeroId), "尚未获得此英雄!");
         ctx()->heros->CurrentHeroId = $newHeroId;
+        
+        FightProc::Ranking_FightPower();
         return Resp::ok();
     }
 

+ 21 - 149
Gameserver/App/process/PayProc.php

@@ -20,7 +20,7 @@ require_once __DIR__ . '/../service_call/pay/official/pay_op.php';
  */
 class PayProc {
 
-    const orderTab = 'tpl_order_tab';
+    const orderTab = 'tab_order_tab';
 
     /**
      * 逻辑分发
@@ -334,7 +334,7 @@ class PayProc {
 
         $result = pay_op::CheckAndDrawOrder(req()->uid, $cpOrderId, array(new PayProc, 'distributePayGoods'));
         CLog::pay($result);
-        my_Assert($result->err == 0, ErrCode::pay_fail);
+        my_Assert($result->err == 0, $result->err);                             # 发货失败
 
         $user = ctx();
         NormalEventProc::OnPaySuccess();
@@ -398,106 +398,6 @@ class PayProc {
             }
         }
 
-        // <editor-fold defaultstate="collapsed" desc="已废弃逻辑">
-//        else if ($order->product_id == 1) {
-//            $user->base(true)->Add_Cash($order->product_count);
-//            self::$retArr[] = "2," . $order->product_count;
-//        } else if ($order->product_id >= 6 && $order->product_id <= 1000) {//充值表
-//            $mo = GameConfig::recharge_getItem($order->product_id);
-//            my_Assert($mo != null, ErrCode::err_const_no);
-//
-//            if (!StlUtil::dictHasProperty($user->shopdata, 'rechargeRecordList')) {
-//                $user->shopdata->rechargeRecordList = array();
-//            }
-//
-//            $cash = $mo->rmd * 10;
-//            if (!in_array($order->product_id, $user->shopdata->rechargeRecordList)) {
-//                $cash = $mo->rmd * 10 * $mo->firstDouble;
-//                $user->shopdata->rechargeRecordList[] = $order->product_id;
-//            }
-//            $user->base(true)->Add_Cash($cash);
-//            self::$retArr[] = "2," . $cash;
-//        } elseif ($order->product_id >= 801001 && $order->product_id <= 803999) {//限购
-//            self::checklimitBuyRecharge($order->product_id);
-//
-//            $mo = GameConfig::shop_limit_getItem($order->product_id);
-//            if ($mo->subType == 1) {
-//                $user->shopdata->dayRechargeAmt += $order->amount;
-//            } else if ($mo->subType == 2) {
-//                $user->shopdata->weekRechargeAmt += $order->amount;
-//            }
-//        } elseif ($order->product_id >= 804001 && $order->product_id <= 804999) {//每日特惠
-//            $mo = GameConfig::shop_limit_getItem($order->product_id);
-//            my_Assert($mo != null, ErrCode::err_const_no);
-//            if ($mo->price == 60) {
-//                $user->shopdata->daliySpecial_ts = now();
-//            } else {
-//                $itemid = explode(',', $mo->reward)[0];
-//                $itemMO = GameConfig::item_package_getItem($itemid);
-//                my_Assert(null != $itemMO, ErrCode::err_const_no);
-//                StoreProc::AddMultiItemInStore($itemMO->contents);
-//                $user->shopdata->daliySpecialPackages[] = $mo->typeId;
-//                self::$retArr[] = $itemMO->contents;
-//            }
-//        } elseif ($order->product_id >= 805001 && $order->product_id <= 805999) {//限时
-//            $mo = GameConfig::shop_limit_getItem($order->product_id);
-//            my_Assert($mo != null, ErrCode::err_const_no);
-//            my_Assert(!in_array($order->product_id, $user->shopdata->limitTsActiveRewardsList), ErrCode::err_const_no);
-//
-//            $user->shopdata->limitTsActiveRewardsList[] = $mo->typeId;
-//            $itemid = explode(',', $mo->reward)[0];
-//            $itemMO = GameConfig::item_package_getItem($itemid);
-//            my_Assert(null != $itemMO, ErrCode::err_const_no);
-//            StoreProc::AddMultiItemInStore($itemMO->contents); //领取奖励
-//            self::$retArr[] = $itemMO->contents;
-//        } elseif ($order->product_id >= 806001 && $order->product_id <= 806999) {//首充【2022-10-19新的首充功能】
-//            $mo = GameConfig::shop_accumulating_getItem($order->product_id);
-//            my_Assert($mo != null, ErrCode::err_const_no);
-//            $shopdata = new Info_UserShop(ctx()->shopdata);
-//            $amount = $mo->amount;
-//            if (!StlUtil::dictHasProperty($shopdata->fRechargeTime, $amount)) {
-//                $shopdata->fRechargeTime->$amount = TimeUtil::tsDay();
-//            }
-//            $cost = 0;
-//            $dic = GameConfig::shop_accumulating();
-//            foreach ($dic as $k => $item) {
-//                if ($cost <= $item->amount) {
-//                    $cost = $item->amount;
-//                }
-//            }
-//            if ($cost <= $amount && $shopdata->suitGiftStartTs == 0) {
-//                $shopdata->suitGiftStartTs = now();
-//            }
-//            ctx()->shopdata = $shopdata;
-//            //self::$retArr[] = $mo->goods;
-//        } elseif ($order->product_id >= 807001 && $order->product_id <= 807999) {//终身礼包
-//            self::checklimitBuyRecharge($order->product_id);
-//        } elseif ($order->product_id >= 808001 && $order->product_id <= 808999) {//套装礼包
-//            self::checklimitBuyRecharge($order->product_id);
-//        } elseif ($order->product_id >= 901001 && $order->product_id <= 999999) {//月卡
-//            $shopdata = new Info_UserShop(ctx()->shopdata);
-//            $packageCfg = GameConfig::shop_monthVIP_getItem($order->product_id);
-//            my_Assert(null != $packageCfg, ErrCode::err_const_no);
-//            if ($packageCfg->subType == 4) {
-//                my_Assert($shopdata->monthlyVIP1_ts + $packageCfg->ExpireTs * 3600 * 24 < now(), ErrCode::shop_monthlyvip_buyed);
-//            } elseif ($packageCfg->subType == 5) {
-//                my_Assert($shopdata->monthlyVIP2_ts + $packageCfg->ExpireTs * 3600 * 24 < now(), ErrCode::shop_monthlyvip_buyed);
-//            }
-//            $err = StoreProc::AddMultiItemInStore($packageCfg->pri_reward);     # 发放一次性奖励
-//            self::$retArr[] = $packageCfg->pri_reward;
-//            my_Assert(ErrCode::ok == $err, $err);
-//            if ($packageCfg->subType == 4) {
-//                $shopdata->monthlyVIP1_ts = 3600 * 24 * (totalDays() + 1) - 1;
-//            } elseif ($packageCfg->subType == 5) {
-//                $shopdata->monthlyVIP2_ts = 3600 * 24 * (totalDays() + 1) - 1;
-//            }
-//
-//            EmailProc::SendMonthlyVIPDailyReward(req()->zoneid, req()->uid, $packageCfg->name, $packageCfg->daily_reward);
-//
-//            ctx()->shopdata = $shopdata;
-//        }
-// </editor-fold>
-
         $user->baseInfo->charge_amt += $order->amount;                          # 统计下累充金额
 
         if ($order->amount > 0) {
@@ -580,8 +480,7 @@ class PayProc {
      */
     static function GetPayRecoreds() {
         $uid = req()->uid;
-        $table = "tpl_order_tab";
-        $arr = daoInst()->select(" cpOrderId as '订单' ,product_name as '道具',amount as '金额' ,from_unixtime(order_ts) as '时间' ")->from($table)
+        $arr = daoInst()->select(" cpOrderId as '订单' ,product_name as '道具',amount as '金额' ,from_unixtime(order_ts) as '时间' ")->from(self::orderTab)
                 ->where("uid")->eq($uid)
                 ->andWhere("status")->eq(1)
                 ->fetchall();
@@ -593,6 +492,7 @@ class PayProc {
 
     /**
      *  刷新充值订单(领取充值结果)
+     * @deprecated since version 2024.12.20
      */
     public static function m_refreshChargeOrders() {
 # 客户端参数解析
@@ -694,65 +594,37 @@ class PayProc {
     }
 
     /**
-     * 检查异常订单, 补发道具
+     * [8811] 检查异常订单, 补发道具
      */
     public static function selfhelpCheckOrders() {
         $uid = req()->uid;
         $orders = daoInst()->select()
-                ->from('tpl_order_tab')
+                ->from(self::orderTab)
                 ->where('uid')->eq($uid)
                 ->andWhere('status')->eq(1)
                 ->andWhere('drawed_ts')->le(0)
                 ->fetchAll();
         if (count($orders) > 0) {
             foreach ($orders as $order) {
-                // 准备补发
-                $product_id = $order->product_id;
-                $product_count = $order->product_count;
-                $typid = substr("$product_id", 0, 3);                           # 提取商品编号前缀
-                $goods = '';
-                switch ($typid) {
-                    case '802':                                                 # 神秘商城物品
-                        $item = GameConfig::secretshop_typeId_getItem($product_id);
-                        break;
-                    case '801':                                                 # 商城物品
-                        $item = GameConfig::shop_getItem($product_id);
-                        break;
-                    default :
-                        return Resp::err(ErrCode::pay_systembusy_err);
-                }
-                if (!$item) {
-                    return Resp::err(ErrCode::pay_shopItem_cosnt_goods_err);
-                }
-                if ($item->pricetype != 0) {                                    # 并非人民币定价
-                    CLog::pay(" 道具付费类型异常:" . $product_id);
-                    return Resp::err(ErrCode::pay_m_type_err);
-                }
-                for ($i = 0; $i < $product_count; $i++) {                       # 默认为1,还没有设计为n的情况
-                    StoreProc::AddMultiItemInStore($item->goods, 5);      # 发货
-                }
-                $goods .= $item->goods;
-                $n = daoInst()->update(self::orderTab)                          # 更新订单状态
-                        ->data(array('drawed_ts' => now()))
-                        ->where('cpOrderId')->eq($order->cpOrderId)
-                        ->exec();
-                if (!$n) {                                                      # 影响条数应为1
-                    CLog::pay(req()->uid . ' 登录补发订单失败 ' . $order->cpOrderId);
-                    return Resp::err(ErrCode::err_db);              # 数据库操作失败
-                }
-                ctx()->baseInfo->charge_amt += $order->amount;             # 历史充值记录(单位分)
+                $result = pay_op::CheckAndDrawOrder(req()->uid, $order->cpOrderId, array(new PayProc, 'distributePayGoods'));
+                CLog::pay($result);
+                my_Assert($result->err == 0, $result->err);                             # 发货失败
+
                 UserProc::updateUserInfo();                                 # 回写玩家数据
                 CLog::pay(req()->uid . ' 登录补发订单 ' . $order->cpOrderId);
             }
-            return Resp::ok(# 返回
-                            array('cash' => ctx()->baseInfo->cash, #       # 直接将游戏币的最新值返回给客户端
-                                'store' => ctx()->store, #               # 背包
-                                'goods' => $goods, #                                    # 发货内容
-                                'count' => count($orders), #                            # 发货数量
-                                'msg' => "找到并处理" . count($orders) . "条未发货订单."
-            ));
         }
-        return Resp::ok('ok');                                      # everything is ok!
+        return Resp::ok(array(
+                    "ret" => self::$retArr, #                                   # 奖励串
+                    "mod" => '', #                                              # 商品刷新模块名
+                    "baseInfo" => ctx()->baseInfo,
+//                    "shopdata" => $user->shopdata,
+                    "store" => ctx()->store,
+                    'task' => ctx()->task,
+                    'heros' => ctx()->heros,
+                    'privateState' => ctx()->privateState,
+        ));
+//        return Resp::ok('ok');                                      # everything is ok!
     }
 
 // </editor-fold>

+ 12 - 4
Gameserver/App/process/StoreProc.php

@@ -92,7 +92,7 @@ class StoreProc {
         }
 
         ctx()->store->equip->$uid = $ins_equip;
-
+        FightProc::Ranking_FightPower();
         UserProc::updateUserInfo();
         return Resp::ok(array(
                     'gold' => ctx()->baseInfo->gold,
@@ -162,6 +162,8 @@ class StoreProc {
 
         $ins_equip->level = 1;
         ctx()->store->equip->$uid = $ins_equip;
+        
+        FightProc::Ranking_FightPower();
         UserProc::updateUserInfo();
         return Resp::ok(array(
                     'gold' => ctx()->baseInfo->gold,
@@ -180,6 +182,7 @@ class StoreProc {
         my_Assert(StlUtil::dictHasProperty($equipDic, $uid), ErrCode::user_store_NotExistEquip);
         $ins_equip = new Ins_Equip($equipDic->$uid);
 
+        my_Assert($ins_equip->qual<16, ErrCode::user_store_equip_qualMaxLimit);
         $composeMo = GameConfig::equip_compose_getItem($ins_equip->qual);
         my_Assert(null != $composeMo, ErrCode::err_const_no);
         $arr = explode(',', $composeMo->compose_condition);
@@ -242,6 +245,8 @@ class StoreProc {
         }
 
         TaskProc::OnEquipComposeNum();
+        FightProc::Ranking_FightPower();
+        
         UserProc::updateUserInfo();
         return Resp::ok(array(
                     'gold' => ctx()->baseInfo->gold,
@@ -354,7 +359,7 @@ class StoreProc {
         }
         
         TaskProc::OnEquipComposeNum();
-        
+        FightProc::Ranking_FightPower();
         UserProc::updateUserInfo();                                             # 回存玩家数据
         return Resp::ok(array(#                                                 # 返回给客户端的数据
                     'gold' => ctx()->baseInfo->gold,
@@ -507,7 +512,7 @@ class StoreProc {
         $ins_equip = new Ins_Equip($equipDic->$uid);
         $posId = $ins_equip->mo()->position;
         ctx()->store(true)->equipLocation->$posId = $uid;
-
+        FightProc::Ranking_FightPower();
         UserProc::updateUserInfo();
         return Resp::ok(array());
     }
@@ -525,6 +530,7 @@ class StoreProc {
         $posId = $ins_equip->mo()->position;
         StlUtil::dictRemove(ctx()->store(true)->equipLocation, $posId);
 
+        FightProc::Ranking_FightPower();
         UserProc::updateUserInfo();
         return Resp::ok(array());
     }
@@ -580,6 +586,7 @@ class StoreProc {
             $xilianStoneNum = ctx()->store->items->$xilianStoneId;
         }
 
+        FightProc::Ranking_FightPower();
         UserProc::updateUserInfo();
         return Resp::ok(array(
                     'xilianStoneId' => $xilianStoneId,
@@ -922,7 +929,8 @@ class StoreProc {
                 $gemSetSlotDic->$replaceUId = $uid;
                 break;
             case 3://手动
-                my_Assert(count((array) $gemSetSlotDic) >= $mo->initNum_slot + $mo->buyNum_slot, ErrCode::user_store_GemCanotSet);
+                //my_Assert(count((array) $gemSetSlotDic) >= $mo->initNum_slot + $mo->buyNum_slot, ErrCode::user_store_GemCanotSet);
+                my_Assert(StlUtil::dictHasProperty($gemSetSlotDic, $replaceUId), ErrCode::user_store_NoExistGemReplace);
                 $gUid = $gemSetSlotDic->$replaceUId;
                 my_Assert(StlUtil::dictHasProperty($gemSetSlotDic, $replaceUId), ErrCode::user_store_NoExistGemReplace);
                 $replace_ins_Gem = new Ins_Gem(ctx()->store->gemStore->$gUid);

+ 2 - 0
Gameserver/App/process/TaskProc.php

@@ -248,6 +248,8 @@ class TaskProc {
                     'cash' => ctx()->baseInfo->cash,
                     'heros' => ctx()->heros,
                     'battlePass_taskPoint' => ctx()->privateData()->battlePass_taskPoint,
+                    'tili_ts'=> ctx()->baseInfo->tili_ts,
+                    "tili" => ctx()->baseInfo->tili,
         ));
     }
 

+ 41 - 7
Gameserver/App/process/UserProc.php

@@ -41,10 +41,44 @@ class UserProc {
 
             case CmdCode::user_rename:                                          # 6010 改名
                 return self::ReName();
+            case CmdCode::cmd_user_completeNewbieGuide:                         # 6011 新手引导更新
+                return self::completeNewbieGuide();    
+            case CmdCode::cmd_user_clearGuideInfo:                              # 6012 清理引导记录
+                return self::clearGuideInfo();
             default:
                 Err(ErrCode::cmd_err);
         }
     }
+    
+    public static function clearGuideInfo(){
+        list($id) = req()->paras;                                               # 参数:引导模块
+                                      
+//        if(in_array($id,ctx()->privateState->funUnlockRecord_3)){
+//            StlUtil::arrayRemove(ctx()->privateState->funUnlockRecord_3, $id); 
+//        }
+                   
+        UserProc::updateUserInfo();                                             # 回写数据
+        return Resp::ok(array());
+    }
+    
+    /**
+     * 更新新手引导阶段步骤   
+     */
+    public static function completeNewbieGuide() {
+        list($guideType,$guide_type_forceSave) = req()->paras;                                       # 参数: 新手引导步骤
+                                        
+        ctx()->base(true)->guide_type = $guideType;
+        
+        $forceSave = $guide_type_forceSave == true?1:0;
+        ctx()->base(true)->guide_type_forceSave = $forceSave;
+               
+        if(in_array($guideType,ctx()->privateState->funUnlockRecord_3) && $guide_type_forceSave==true){
+            StlUtil::arrayRemove(ctx()->privateState->funUnlockRecord_3, $guideType); 
+        }
+        
+        UserProc::updateUserInfo();                                             # 回写数据
+        return Resp::ok(array());
+    }
 
     /**
      * 6010 玩家改名
@@ -66,8 +100,8 @@ class UserProc {
             self::updateUserInfo();                                                 # 回存数据
             FightProc::UpdateRankUserName(req()->uid, $newName);                    # 刷新排行榜上的昵称
             TaskProc::OnReName();
-            
-            return Resp::ok(array("task"=> ctx()->task));
+
+            return Resp::ok(array("task" => ctx()->task));
         }
         return Resp::err(ErrCode::err_db);
     }
@@ -361,7 +395,8 @@ class UserProc {
             $game->base(true)->Reset_tilits();                                      # 修正体力ts
             UserProc::checkContidays();                                         # 连续登录,状态检查
             //PayProc::m_refreshChargeOrders();                                   # 刷新订单, 多平台版本
-            //PayProc::checkDeltest();                                            # 检查内侧充值记录(函数内部会只检查一次)
+            PayProc::selfhelpCheckOrders();
+            PayProc::checkDeltest();                                            # 检查内侧充值记录(函数内部会只检查一次)
             //self::checkMissOrder();                                             #校验是否有漏单
             $game->RegenNewToken();
             UserProc::updateUserInfo();                                         # 这一步回存操作只有在 userInfo正常存在的情况下才进行
@@ -500,7 +535,7 @@ class UserProc {
         if (ctx()->privateState->nextDayLogin > 0 && $curDay - $nextDay >= $day) {
             ActiveProc::ResetLimitTsBuy();
         }
-        
+
         $activePoint_BattlePassMo = GameConfig::subfun_unlock_getItem(Enum_SubFunType::ActivePoint_BattlePass);
         $activePoint_BattlePass_day = $activePoint_BattlePassMo->ts;
         $activePoint_refersh_tsDay = TimeUtil::totalDays(ctx()->privateState->battlePass_activePoint_refersh_ts);
@@ -510,17 +545,16 @@ class UserProc {
             ctx()->privateData(true)->battlePass_taskPoint = 0;
             ActiveProc::ResetBattlePassReward(Enum_SubFunType::ActivePoint_BattlePass);
         }
-        
+
         $tili_BattleBassMo = GameConfig::subfun_unlock_getItem(Enum_SubFunType::Tili_BattleBass);
         $tili_BattleBass_day = $tili_BattleBassMo->ts;
         $tili_BattleBass_refershDay = TimeUtil::totalDays(ctx()->privateState->battlePass_tili_refersh_ts);
         if (ctx()->privateState->battlePass_tili_refersh_ts > 0 && $curDay - $tili_BattleBass_refershDay >= $tili_BattleBass_day) {
-            ctx()->privateState->battlePass_tili_refersh_ts = TimeUtil::getNextDayTs($tili_BattleBassMo->startTs, $tili_BattleBass_day);                              
+            ctx()->privateState->battlePass_tili_refersh_ts = TimeUtil::getNextDayTs($tili_BattleBassMo->startTs, $tili_BattleBass_day);
             ctx()->privateData(true)->battlePass_tili_cost_ts = 0;
             ctx()->privateData(true)->battlePass_tili = 0;
             ActiveProc::ResetBattlePassReward(Enum_SubFunType::Tili_BattleBass);
         }
-            
     }
 
     static function OnLogin_DateDeal() {

+ 42 - 37
Gameserver/App/service_call/pay/Mo/payRequest.php

@@ -106,6 +106,11 @@ class PayRequest extends loyalsoft\Object_ext {
      */
     public $sign;
 
+    /**
+     * @var string 客户端版本号
+     */
+    public $clientVer;
+
     /**
      * @var int 订单编号
      */
@@ -129,6 +134,7 @@ class PayRequest extends loyalsoft\Object_ext {
         unset($arr['order_id']);
         unset($arr['ageRange']);
         unset($arr['product_desc']);
+        unset($arr['clientVer']);
         $n = loyalsoft\daoInst()->update(self::orderTab)
                 ->data($arr)
                 ->where('id')->eq($this->order_id)
@@ -200,20 +206,20 @@ class PayRequest extends loyalsoft\Object_ext {
         $infoArr = array();
         \loyalsoft\CLog::pay($params);
         $callbackInfo = $params['developerPayload'];
-        $infos = explode(',', $callbackInfo);                                                                                                                                     # uid,zoneid,cpOrderId,productId
+        $infos = explode(',', $callbackInfo);                                                                          # uid,zoneid,cpOrderId,productId
 
         $infoArr['orderId'] = $params['orderId'];
-        $infoArr['accountId'] = $infos[0];                                                                                                                                         # uid
-        $infoArr['amount'] = number_format($params['price'] / 100, 2, '.', ''); # 分转元                                                                                                                               # 华为给过来是分, 这里先转换为元, 入库时再统一以分为单位
-        $infoArr['currency'] = $params['currency'];                                                                                                                         # 如果是海外会有不同的货币类型
+        $infoArr['accountId'] = $infos[0];                                                                             # uid
+        $infoArr['amount'] = number_format($params['price'] / 100, 2, '.', ''); # 分转元                               # 华为给过来是分, 这里先转换为元, 入库时再统一以分为单位
+        $infoArr['currency'] = $params['currency'];                                                                    # 如果是海外会有不同的货币类型
         $infoArr['product_id'] = $params['productId'];
         $infoArr['product_count'] = 1;
-        $infoArr['channel'] = "huawei";                                                                                                                                            # 华为
-        $infoArr['zoneid'] = (int) $infos[1];                                                                                                                                       # 分区信息
+        $infoArr['channel'] = "huawei";                                                                                # 华为
+        $infoArr['zoneid'] = (int) $infos[1];                                                                          # 分区信息
         $infoArr['callbackInfo'] = $callbackInfo;
 
         $o = new payRequest($infoArr);
-        $o->cpOrderId = $infos[2];                                                                                                                                                  # 重新修订下cpOrderId
+        $o->cpOrderId = $infos[2];                                                                                     # 重新修订下cpOrderId
         return $o;
     }
 
@@ -225,32 +231,31 @@ class PayRequest extends loyalsoft\Object_ext {
         }
         $this->callbackInfo = $this->accountId . "," . $this->zoneid;
         if (self::isTest) {
-            $this->amount *= 0.01;  // 也可以改成固定值 0.01, 更省钱些.
+            $this->amount *= 0.01;                                 // 也可以改成固定值 0.01, 更省钱些.
         }
-//        if ($this->channel == "mi") {
-//            $this->amount = 1;
-//        }
+
         if (!self::isTest and $this->amount) {
-//            $this->amount = number_format($this->amount, 2, '.', '');
-//            if ('soft' == $this->channel) {                                     # 2018年1月15号以前固定为1分钱测试
-//                $this->amount = number_format(0.01, 2, '.', '');
-//                $this->product_price = 0.01;
-//            } else  //
-//            if ($this->amount != loyalsoft\GameConfig::shop_getItem($this->product_id)->price) {
-//                \loyalsoft\CLog::pay($this->product_id);
+            new loyalsoft\Req(null);                                            # 初始化
+            \loyalsoft\req()->CV = $this->clientVer;                            # 设定配置数据版本号(2024.12增补)
+//            var_dump(loyalsoft\req()->CV);
+            $itemMo = loyalsoft\GameConfig::shop_getItem($this->product_id);
+
+            if (null != $itemMo && $this->amount != $itemMo->price) {
+                \loyalsoft\CLog::pay($this->product_id);
 //                \loyalsoft\CLog::pay(var_export(loyalsoft\gMem()));
-//                \loyalsoft\CLog::pay(loyalsoft\GameConfig::shop_getItem($this->product_id)->price);
-//                \loyalsoft\CLog::pay('金额不符' . $this->amount . " ");
-//                exit('{"err":1,"msg":"金额不符!"}');
-//            }
+                \loyalsoft\CLog::pay(loyalsoft\GameConfig::shop_getItem($this->product_id)->price);
+
+                \loyalsoft\CLog::pay('金额不符: ' . $this->amount . " <=> " . $itemMo->price);
+                exit('{"err":1,"msg":"金额不符!"}');
+            }
         }
-        loyalsoft\daoInst()->insert(self::orderTab)                                                                                                                          # 创建一个新的订单
+        loyalsoft\daoInst()->insert(self::orderTab)                                                                 # 创建一个新的订单
                 ->data(array('order_ts' => loyalsoft\now()))
                 ->exec();
-        $this->order_id = loyalsoft\daoInst()->select('last_insert_id() as id')->fetch('id');                                                           # 取刚才创建的订单的自增id
-        $this->cpOrderId = LoyalsoftAPPID . \date('ymdHi') . substr(sprintf("%1$06d", $this->order_id), -6);                          # 商户唯一id(尾部附加自增id后6位数)
-        $this->callbackInfo .= "," . $this->cpOrderId;                                                                                                                     # 将cpOrderId追加到透传参数中
-        $this->notifyUrl = $this::get_notify_url();                                                                                                                              # 自动提取支付回调地址
+        $this->order_id = loyalsoft\daoInst()->select('last_insert_id() as id')->fetch('id');                       # 取刚才创建的订单的自增id
+        $this->cpOrderId = LoyalsoftAPPID . \date('ymdHi') . substr(sprintf("%1$06d", $this->order_id), -6);        # 商户唯一id(尾部附加自增id后6位数)
+        $this->callbackInfo .= "," . $this->cpOrderId;                                                              # 将cpOrderId追加到透传参数中
+        $this->notifyUrl = $this::get_notify_url();                                                                 # 自动提取支付回调地址
     }
 
     /**
@@ -281,24 +286,24 @@ class PayRequest extends loyalsoft\Object_ext {
         $amt = $this->amount;
 
         if (isset($uid) && isset($ageRange)) {
-            $monthTS = loyalsoft\TimeUtil::tsMonthBegin();                                                             # 本月初起始时间戳
-            $dayTS = loyalsoft\TimeUtil::tsDayBegin();                                                                       # 当天起始时间戳
+            $monthTS = loyalsoft\TimeUtil::tsMonthBegin();                                                           # 本月初起始时间戳
+            $dayTS = loyalsoft\TimeUtil::tsDayBegin();                                                               # 当天起始时间戳
             $monthTotal = loyalsoft\daoInst()
-                    ->select("sum(`amount`)/100 as total")                                                                         # 总金额(单位:分转元)
+                    ->select("sum(`amount`)/100 as total")                                                           # 总金额(单位:分转元)
                     ->from(self::orderTab)
-                    ->where("uid")->eq($uid)                                                                                               # 该玩家
-                    ->andWhere("status")->eq(1)                                                                                         # 成交订单
-                    ->andWhere("order_ts")->ge($monthTS)                                                                      # 本月
+                    ->where("uid")->eq($uid)                                                                         # 该玩家
+                    ->andWhere("status")->eq(1)                                                                      # 成交订单
+                    ->andWhere("order_ts")->ge($monthTS)                                                             # 本月
                     ->fetch('total');
             if (!is_numeric($monthTotal)) {
                 $monthTotal = 0;
             }
             $dayTotal = loyalsoft\daoInst()
-                    ->select("sum(`amount`)/100 as total")                                                                         # 总金额(单位:分转元)
+                    ->select("sum(`amount`)/100 as total")                                                           # 总金额(单位:分转元)
                     ->from(self::orderTab)
-                    ->where("uid")->eq($uid)                                                                                               # 该玩家
-                    ->andWhere("status")->eq(1)                                                                                        # 成交订单
-                    ->andWhere("order_ts")->ge($dayTS)                                                                           # 今日
+                    ->where("uid")->eq($uid)                                                                         # 该玩家
+                    ->andWhere("status")->eq(1)                                                                      # 成交订单
+                    ->andWhere("order_ts")->ge($dayTS)                                                               # 今日
                     ->fetch('total');
             if (!is_numeric($dayTotal)) {
                 $dayTotal = 0;

+ 3 - 1
Gameserver/App/service_call/pay/official/alipay/notify.php

@@ -25,7 +25,9 @@ if ($flag) {
         if ($order->Check()) {                                                  # 订单校验, 1代表支付成功
             if ($order->status == 1) {                                          # 订单状态是成功
                 $order->UpdateOrderStatus();                                    # 更新订单状态,->已付款
-//                loyalsoft\TapDBUtil::PushPayEvent($order, 'alipay');            # 向tapdb推送充值记录
+//                if (PLAT == 'tap') {
+                loyalsoft\TapDBUtil::PushPayEvent($order, 'alipay');        # 向tapdb推送充值记录
+//                }
                 CLog::pay("[notify.zfb] [发货] " . $order->cpOrderId . " >>> " . $order->amount);
             } else if ($order->status == 2) {                                   # status为2(failed)的情况
                 $order->UpdateOrderStatus();                                    # 直接更新订单状态,->支付失败

+ 8 - 8
Gameserver/App/service_call/pay/official/pay_op.php

@@ -41,38 +41,38 @@ class pay_op {
      */
     static function CheckAndDrawOrder($uid, $cpOrderId, $deliverFunc) {
         if (!$uid || strlen($cpOrderId) != 19) {                                # 订单编号长19位
-            return Resp::err(1, "参数错误");
+            return Resp::err(ErrCode::pay_order_id, "参数错误");
         }
         $order = daoInst()->select()->from(self::orderTab)                      # 取订单数据
                         ->where('cpOrderId')->eq($cpOrderId)
                         ->limit(1)->fetch();
         if (!$order) {
             CLog::pay(' 订单不存在! ' . $cpOrderId);
-            return Resp::err(2, "订单不存在");
+            return Resp::err(ErrCode::pay_order_no, "订单不存在");
         }
         if (false === strpos($uid, $order->uid)) {                              # UID不符
-            return Resp::err(3, "UID不符");
+            return Resp::err(ErrCode::pay_order_uid, "UID不符");
         }
 
         if ($order->channel != "imitate" #                                      # 校验是否已支付的代码, -- imitate的不校验
                 && $order->status != 1) {                                       # 订单状态
             CLog::pay(' 订单尚未完成支付!');
-            return Resp::err(4, "订单尚未完成支付");
+            return Resp::err(ErrCode::pay_order_paystatus, "订单尚未完成支付");
         }
 
         if ($order->drawed_ts > 0) {                                            # 定单已经发过货了
             CLog::pay(' 订单重复请求发货!' . $cpOrderId);
-            return Resp::err(5, "订单重复请求发货");
+            return Resp::err(ErrCode::pay_order_drawed, "订单重复请求发货");
         }
         if (!is_callable($deliverFunc)) {                                       # 校验回调函数是否可执行
             CLog::pay('发货回调函数不是可执行对象!' . $cpOrderId);
-            return Resp::err(6, "发货函数不可调用!");
+            return Resp::err(ErrCode::pay_fail_nologic, "发货函数不可调用!");
         }
 
         [$bOk, $mod] = call_user_func($deliverFunc, $order);                    # 调用游戏发货逻辑, 要求游戏逻辑返回true/false, $mod
         if (!$bOk) {
             CLog::pay("订单发货失败: $cpOrderId");
-            return Resp::err(7, "游戏发货逻辑执行失败");
+            return Resp::err(ErrCode::pay_fail_logic, "游戏发货逻辑执行失败");
         }
         $n = daoInst()->update(self::orderTab)                                  # 更新订单状态
                 ->data(array('drawed_ts' => now()))
@@ -80,7 +80,7 @@ class pay_op {
                 ->exec();
         if (!$n) {
             CLog::pay("数据库更新订单状态失败: $cpOrderId");
-            return Resp::err(8, "更新订单状态,数据库操作失败");                   # 数据库操作失败
+            return Resp::err(ErrCode::pay_fail_db, "更新订单状态,数据库操作失败");                   # 数据库操作失败
         }
 
         CLog::pay("订单发货成功: $cpOrderId  ( $mod )");

+ 3 - 1
Gameserver/App/service_call/pay/official/wxpay/notify.php

@@ -63,7 +63,9 @@ class PayNotifyCallBack extends WxPayNotify {
         }
         if ($order->status == 1) {                                              # 订单状态是成功 1代表支付成功
             $order->UpdateOrderStatus();                                        # [数据库操作]更新订单状态,->已付款
-//            loyalsoft\TapDBUtil::PushPayEvent($order, 'wxpay');                 # 向tapdb推送充值记录
+//            if (PLAT == 'tap') {
+            loyalsoft\TapDBUtil::PushPayEvent($order, 'wxpay');                 # 向tapdb推送充值记录
+//            }
             CLog::pay("[notify.wx] [发货] " . $order->cpOrderId . " >>> " . $order->amount);
             $msg = "success";
             return true;

+ 4 - 13
Gameserver/App/test.php

@@ -23,18 +23,9 @@ SelfChecker::checkModules();
 //\loyalsoft\TapDBUtil::TestPay();
 //\loyalsoft\CLog::err("wg");
 //$a = new \sm_activity_tiligift();
-$s = '{"uid":"639743559740E0681F7E0EBBFE60B5C8","cmd":6000,"paras":[false],"ts":1716347687,"zoneid":1,"SN":1,"TK":"","CV":"unityEditor"}';
-new Req($s);
+//$s = '{"uid":"639743559740E0681F7E0EBBFE60B5C8","cmd":6000,"paras":[false],"ts":1716347687,"zoneid":1,"SN":1,"TK":"","CV":"unityEditor"}';
+new Req(null);
 req()->CV = "999.999.999";
-//$arr = GameConfig::waves_getItemArray(FightProc::TowerGateId);
-//var_dump($arr);
+$arr = GameConfig::shop_getItem(8001);
+var_dump($arr);
 
-$bytes = \msgpack_pack(array('age' => 35, 'name' => 'wg'));
-var_dump($bytes);
-$data = file_get_contents('R:/Client');
-
-$obj = \msgpack_unpack($data);
-//var_dump($obj);
-//var_dump(nameof());
-$t =new MsgpackUtil();
-$t->Test();

+ 2 - 3
Gameserver/App/util/tapdb/TapDBUtil.php

@@ -47,8 +47,8 @@ class TapDBUtil {
 
     public static function TestPay() {
         $args = [];
-        $args['openid'] = 'oEW_p0gt1shMJMY4S2KiUSaLxNp0_yyb'; // openid                                    # 玩家uid(不带_yyb)
-        $args['amt'] = 600;                                              # 支付金额, 游戏后台统一单位是分
+        $args['openid'] = 'oEW_p0gt1shMJMY4S2KiUSaLxNp0_yyb'; // openid         # 玩家uid(不带_yyb)
+        $args['amt'] = 600;                                                     # 支付金额, 游戏后台统一单位是分
         $args['appmeta'] = 'oEW_p0gt1shMJMY4S2KiUSaLxNp0_yyb,1,1022304201408000815*qbqd*wechat';
         $order = pay\OrderNotice::Parse_ysdkOrder($args);
         self::PushPayEvent($order, 'yyb');
@@ -109,5 +109,4 @@ class TapDBUtil {
 
         return $ok;
     }
-
 }

+ 7 - 8
Gameserver/App/util/tapdb/TapDB_config.php

@@ -28,16 +28,15 @@ class TapDB_config {
     }
 
     private function __construct() {
-        $arr = [Enum_Plat::Online, Enum_Plat::Online_yyb, Enum_Plat::Online_hw];
+        $arr = [Enum_Plat::Online_tap];
         if (in_array(PLAT, $arr)) {                                                    // 正式
-            $this->gameClientId = "zof26AtQDfSoOUjMeY";                         // appid
-            $this->gameToken = "InclpY9ioQeKSt40yZNjcp1uPOJ8lqCHPgmaZTUb";      // 客户端接口秘钥
-            $this->serverToken = "lSFgVNpsYbxGlV4MRfhdyS8rEeusd2j4";            // 服务端接口秘钥
+            $this->gameClientId = "ltbfeedazslnjfqnfy";                         // appid
+            $this->gameToken = "TQ2IectpHd5PnTS9XVlNsytSTaVrFUagXzHURYAE";      // 客户端接口秘钥
+            $this->serverToken = "lNSO2E41b7zjTVcHbTxzs2KBGjjFpwj8";            // 服务端接口秘钥
         } else {                                                                // 测试
-            $this->gameClientId = "TNFmYW7SBavcZk5lU2";                         // appid
-            $this->gameToken = "x2jdwJFyH48hAIl47c7swZTIA49Dq5MQoglAUYb5";      // 客户端接口秘钥
-            $this->serverToken = "ptVLcjXr1YiW2dL4J2llRHKlisA5GgUg";            // 服务端接口秘钥
+            $this->gameClientId = "ltbfeedazslnjfqnfy";                         // appid
+            $this->gameToken = "TQ2IectpHd5PnTS9XVlNsytSTaVrFUagXzHURYAE";      // 客户端接口秘钥
+            $this->serverToken = "lNSO2E41b7zjTVcHbTxzs2KBGjjFpwj8";            // 服务端接口秘钥
         }
     }
-
 }