c - eAthena - 在数据包末尾添加 4 个字节

标签 c emulation

我正在努力重写 eAthena 的一些源代码。我需要在数据包末尾添加 4 个字节。我正在尝试了解如何进行。 WFIFOL(sd->fd, len) = 0 不会增加 4 个字节吗?我需要对此进行 SWAP32 吗?还在学习谢谢。

int clif_sendadditem(USER *sd, int num) {
    char buf[128];
    char buf2[128];
    char *name = NULL;
    char* owner = NULL;
    int namelen;
    int len;
    int id;

    //if(!sd->status.inventory[num].custom) {
        id=sd->status.inventory[num].id;
    //} else {
    //  id=sd->status.inventory[num].custom;
    //}

    if (id > 0 && !strcmpi(itemdb_name(id), "??")) {
        memset(&sd->status.inventory[num], 0, sizeof(sd->status.inventory[num]));
        return 0;
    }

    if (strlen(sd->status.inventory[num].real_name)) {
        name = sd->status.inventory[num].real_name;
    } else {
        //if(!sd->status.inventory[num].custom) {
            name = itemdb_name(id);
        //} else {
        //  name = itemdb_namec(id);
        //}
    }

    if (sd->status.inventory[num].amount > 1) {
        sprintf(buf, "%s (%d)", name, sd->status.inventory[num].amount);
    } else if(itemdb_type(sd->status.inventory[num].id)==ITM_SMOKE) {
        //if(!sd->status.inventory[num].custom) {
            sprintf(buf, "%s [%d %s]",name,sd->status.inventory[num].dura,itemdb_text(sd->status.inventory[num].id));
        //} else {
        //  sprintf(buf, "%s [%d %s]",name,sd->status.inventory[num].dura,itemdb_textc(sd->status.inventory[num].custom));
        //}
    } else {
        strcpy(buf, name);
    }

    namelen = strlen(buf);

    if (!session[sd->fd])
    {
        session[sd->fd]->eof = 8;
        return 0;
    }

    WFIFOHEAD(sd->fd, 255);
    WFIFOB(sd->fd, 0) = 0xAA;
    WFIFOB(sd->fd, 3) = 0x0F;
    //WFIFOB(sd->fd, 4) = 0x03;
    WFIFOB(sd->fd, 5) = num+1;

    //if(!sd->status.inventory[num].custom) {
        WFIFOW(sd->fd, 6) = SWAP16(itemdb_icon(id));
        WFIFOB(sd->fd, 8) = itemdb_iconcolor(id);
    //} else {
    //  WFIFOW(sd->fd, 6) = SWAP16(itemdb_iconc(id));
    //  WFIFOB(sd->fd, 8) = itemdb_iconcolorc(id);
    //}

    WFIFOB(sd->fd, 9) = namelen;
    memcpy(WFIFOP(sd->fd, 10), buf, namelen);
    len=namelen+1;

    //if(!sd->status.inventory[num].custom) {
        WFIFOB(sd->fd,len+9)=strlen(itemdb_name(id));
        strcpy(WFIFOP(sd->fd,len+10),itemdb_name(id));
        len+=strlen(itemdb_name(id))+1;
    //} else {
    //  WFIFOB(sd->fd,len+9)=strlen(itemdb_namec(id));
    //  strcpy(WFIFOP(sd->fd,len+10),itemdb_namec(id));
    //  len+=strlen(itemdb_namec(id))+1;
    //}

    WFIFOL(sd->fd,len+9)=SWAP32(sd->status.inventory[num].amount);
    len+=4;

    if((itemdb_type(id)<3) || (itemdb_type(id)>17)) {
        WFIFOB(sd->fd,len+9)=1;
        WFIFOL(sd->fd,len+10)=0;
        WFIFOB(sd->fd, len + 14) = 0;
        len+=6;
    } else {
        WFIFOB(sd->fd,len+9)=0;
        WFIFOL(sd->fd,len+10)=SWAP32(sd->status.inventory[num].dura);
        WFIFOB(sd->fd, len + 14) = 0; //REPLACE WITH PROTECTED
        len+=6;
    }
    if(sd->status.inventory[num].owner_id) {
        owner=map_id2name(sd->status.inventory[num].owner_id);
        WFIFOB(sd->fd,len+9)=strlen(owner);
        strcpy(WFIFOP(sd->fd,len+10),owner);
        len+=strlen(owner)+1;
        FREE(owner);
    } else {
        WFIFOB(sd->fd,len+9)=0; //len of owner
        len+=1;

    }


    //WFIFOW(sd->fd, len + 9) = SWAP16(0);
    WFIFOW(sd->fd, 1) = SWAP16(len + 6);
    WFIFOSET(sd->fd, encrypt(sd->fd));


    return 0;
}

最佳答案

我数错了,更改了评论

//WFIFOW(sd->fd, len + 9) = SWAP16(0);

WFIFOL(sd->fd, len + 9) = SWAP32(0);

最后改为len+10

关于c - eAthena - 在数据包末尾添加 4 个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44100624/

相关文章:

c - 将字符串分配给 C 中的结构成员(指针)

android - 带有 Visual Studio 的 Android 模拟器上的奇怪解决方案

embedded - 通过 USB 模拟 UART

android - takePicture回调数据为null

c - 警告 : implicit declaration of function '__gmpz_out_str' is invalid in C99

c++ - 将 C/C++ dll 头文件转换为 Delphi 的最佳资源?

c - 使用 5 个或以上参数调用 moscat() 时出现段错误

c++ - C/C++实现并传递代码

node.js - 如何在Node.js中处理同步浏览器仿真

Android Multitouch - 可以在模拟器中测试吗?