找回密码
 register

QQ登录

只需一步,快速开始

查看: 1671|回复: 0

[系统函数] LuaFnDelAvailableItem 扣除指定数量物品函数 删除道具

[复制链接]

[系统函数] LuaFnDelAvailableItem 扣除指定数量物品函数 删除道具

[复制链接]
  • 打卡等级:热心大叔
  • 打卡总天数:94
  • 打卡月天数:17
  • 打卡总奖励:94
  • 最近打卡:2025-01-18 01:28:20
Waylee

主题

0

回帖

1万

积分

仙帝

积分
11929
Waylee 2021-1-12 22:50 | 显示全部楼层 |阅读模式

马上注册,查看网站隐藏内容!!

您需要 登录 才可以下载或查看,没有账号?register

×

***付费内容***
IDA伪代码(地址:828FD20):

int __cdecl LuaFnTbl::LuaFnDelAvailableItem(lua_State *L)
{
    int i; // 用于循环检查参数的索引
    unsigned int v2; // 存储玩家ID
    Scene_3 *Scene; // 场景对象
    Obj_Human *v4; // 玩家对象
    _ITEM_ATTR_ENUM *ItemAttr; // 物品属性
    int j; // 用于循环遍历物品属性
    int k; // 用于循环遍历物品参数
    SceneManager_1 *const v9; // 场景管理器
    double v10; // 存储操作结果
    signed int nDelCount; // 删除数量
    UINT itemIndex; // 物品索引
    ITEM_LOG_PARAM_0 ItemLogParam; // 物品日志参数
    CHAR msg[1048]; // 错误消息缓存

    // 循环检查前四个Lua参数是否是数字类型
    for ( i = 1; i <= 4; ++i )
    {
        if ( L )
        {
            if ( lua_isnumber((lua_State_0 *)L, i) == 1 )
                continue; // 如果是数字,继续检查下一个参数
            sub_804AC20(msg, 512, "ERROR: [%s]Param %d is illegal!", "LuaFnDelAvailableItem", i); // 参数类型错误
        }
        else
        {
            sub_804AC20(msg, 512, "ERROR: [%s] Lua_State==NULL!", "LuaFnDelAvailableItem"); // Lua_State为空
        }
        CacheLog(3, msg); // 记录错误日志
    }

    // 获取Lua中的参数值
    lua_tonumber((lua_State_0 *)L, 1);
    v2 = (int)lua_tonumber((lua_State_0 *)L, 2); // 玩家ID
    itemIndex = (int)lua_tonumber((lua_State_0 *)L, 3); // 物品索引
    nDelCount = (int)lua_tonumber((lua_State_0 *)L, 4); // 删除数量

    // 获取场景对象
    Scene = SceneManager::GetScene(v9, SceneID);
    if ( !Scene )
        __assertex__(
            "./Script/LuaFnTbl_Attr.h",
            0x10FBu,
            "int LuaFnTbl::LuaFnDelAvailableItem(lua_State*)",
            "pScene",
            "Scene ID ErrorLuaFnDelAvailableItem"); // 场景无效,断言

    // 检查当前线程ID是否与场景线程ID匹配
    if ( ThreadValueManager::GetCurrentThreadID() != Scene->m_ThreadID )
        __assertex__(
            "./Script/LuaFnTbl_Attr.h",
            0x10FBu,
            "int LuaFnTbl::LuaFnDelAvailableItem(lua_State*)",
            "ThreadValueManager::GetCurrentThreadID()==pScene->m_ThreadID",
            "ThreadValueManager::GetCurrentThreadID()==pScene->m_ThreadIDLuaFnDelAvailableItem"); // 线程ID不匹配,断言

    // 检查玩家对象是否有效
    if ( v2 > 0x752F || (v4 = (Obj_Human *)Scene->m_pObjManager->m_pObj[v2]) == 0 )
        __assertex__(
            "./Script/LuaFnTbl_Attr.h",
            0x10FBu,
            "int LuaFnTbl::LuaFnDelAvailableItem(lua_State*)",
            "pObj",
            "selfId ErrorLuaFnDelAvailableItem"); // 玩家无效,断言

    // 检查玩家是否可以执行逻辑操作
    if ( (*((int (__cdecl **)(Obj_Human *))v4->_vptr_Obj + 2))(v4) == 1 )
    {
        if ( !Obj_Human::IsCanLogic(v4) )
            __assertex__(
                "./Script/LuaFnTbl_Attr.h",
                0x10FBu,
                "int LuaFnTbl::LuaFnDelAvailableItem(lua_State*)",
                "pHuman->IsCanLogic()",
                "IsCanLogic() test return falseLuaFnDelAvailableItem"); // 玩家逻辑不可执行,断言

        // 设置物品日志参数的初始值
        ItemLogParam.XPos = 0.0;
        ItemLogParam.ZPos = 0.0;
        ItemLogParam.ItemGuid.m_Serial = 0;
        ItemLogParam.ItemGuid.m_Server = 0;
        ItemLogParam.ItemGuid.m_World = 0;
        ItemLogParam.CharGUID = -1;
        ItemLogParam.TargetGUID = -1;
        ItemLogParam.OpType = ITEM_OP_TYPE::ITEM_OP_UNKNOW;
        ItemLogParam.SecOpType = ITEM_OP_TYPE::ITEM_OP_UNKNOW;
        ItemLogParam.BagPos = -1;
        ItemLogParam.Count = 1;
        ItemLogParam.SceneID = -1;
        ItemLogParam.NpcType = -1;
        ItemLogParam.ShopGUID = -1;
        ItemLogParam.GemMax = 0;

        // 初始化物品属性
        ItemAttr = ItemLogParam.ItemAttr;
        for ( j = 5; j >= 0; --j )
            *ItemAttr++ = 0;

        // 初始化其他日志参数
        for ( k = 0; k <= 2; ++k )
            ItemLogParam.Param[k] = 0;
        ItemLogParam.bBind = 0;
        ItemLogParam.bMark = 0;
        ItemLogParam.bPWLock = 0;
        ItemLogParam.OpType = ITEM_OP_TYPE::ITEM_SCRIPT_DELETE; // 操作类型设置为删除

        // 执行物品删除操作
        if ( nDelCount <= 0 || HumanItemLogic::EraseUnLockItem((ITEM_LOG_PARAM *)&ItemLogParam, v4, itemIndex, nDelCount) )
            HIDWORD(v10) = 1072693248; // 删除成功,设置返回值
        else
            HIDWORD(v10) = 0; // 删除失败,设置返回值
        LODWORD(v10) = 0;
        lua_pushnumber((lua_State_0 *)L, v10); // 将结果返回给Lua
    }
    else
    {
        lua_pushnumber((lua_State_0 *)L, -1.0); // 玩家无法执行操作,返回失败
    }

    return 1; // 返回一个结果给Lua
}
付费看帖
剩余 7% 内容需要支付 1.00 金币 后可完整阅读
支持付费阅读,激励作者创作更好的作品。
您需要登录后才可以回帖 登录 | register

本版积分规则

雪舞知识库 | 浙ICP备15015590号-1 | 萌ICP备20232229号|浙公网安备33048102000118号 |天天打卡

GMT+8, 2025-1-18 15:41 , Processed in 0.114762 second(s), 8 queries , Redis On.

Powered by XueWu Licensed

Copyright © Tencent Cloud.

快速回复 返回顶部 返回列表