zoukankan      html  css  js  c++  java
  • find_player 不查找已经晕到玩家的问题

    问题场景:

    游戏中出现个BUG,是关于登陆后出现分身的问题。 查找当前登陆者的身份 是否之前存在相同的角色实例,当玩家昏迷状态时 使用 find_player是找不到这个玩家的,所以 玩家利用角色昏迷的时候 重新登陆相同的账号 绕过登陆检查,出现游戏中存在多个相同的角色实例


    查了OS代码,发现 find_player 最终会调用 find_living_object函数。
    游戏中,实现玩家昏迷的效果是关闭了玩家的指令IO
    相关设定 O_ENABLE_COMMANDS

    解决办法 通过users函数直接查找在线玩家

     

    object_t *find_living_object P2(char *, str, int, user)
    {
        object_t **obp, *tmp;
        object_t **hl;
    
        if (!str)
        return 0;
        num_searches++;
        hl = &hashed_living[hash_living_name(str)];
        for (obp = hl; *obp; obp = &(*obp)->next_hashed_living) {
        search_length++;
        if ((*obp)->flags & O_HIDDEN) {
            if (!valid_hide(current_object))
            continue;
        }
        if (user && !((*obp)->flags & O_ONCE_INTERACTIVE))
            continue;
        if (!((*obp)->flags & O_ENABLE_COMMANDS))
            continue;
        if (strcmp((*obp)->living_name, str) == 0)
            break;
        }
        if (*obp == 0)
        return 0;
        /* Move the found ob first. */
        if (obp == hl)
        return *obp;
        tmp = *obp;
        *obp = tmp->next_hashed_living;
        tmp->next_hashed_living = *hl;
        *hl = tmp;
        return tmp;
    }
  • 相关阅读:
    Python 参数设置
    python日志模块logging
    推荐一种快速提高英语口语的方法
    Windows 远程桌面文件传输的方法
    敏捷术语
    Timeout watchdog using a standby thread
    ZFS -世界上最高级的文件系统之一
    Linux下创建和删除用户
    linux 学习之路
    Difference between a Hard Link and Soft (Symbolic) Link
  • 原文地址:https://www.cnblogs.com/cfas/p/8120130.html
Copyright © 2011-2022 走看看