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;
}

 

posted @ 2017-12-26 21:36  方东信  阅读(325)  评论(0编辑  收藏  举报