|
@@ -321,9 +321,16 @@ static int clif_send_sub(struct block_list *bl, va_list ap)
|
|
|
break;
|
|
|
case AREA_WOSC:
|
|
|
{
|
|
|
- struct map_session_data *ssd = (struct map_session_data *)src_bl;
|
|
|
- if (ssd && (src_bl->type == BL_PC) && sd->chatID && (sd->chatID == ssd->chatID))
|
|
|
+ if(src_bl->type == BL_PC){
|
|
|
+ struct map_session_data *ssd = (struct map_session_data *)src_bl;
|
|
|
+ if (ssd && sd->chatID && (sd->chatID == ssd->chatID))
|
|
|
return 0;
|
|
|
+ }
|
|
|
+ else if(src_bl->type == BL_NPC) {
|
|
|
+ struct npc_data *nd = (struct npc_data *)src_bl;
|
|
|
+ if (nd && sd->chatID && (sd->chatID == nd->chat_id))
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
@@ -3512,7 +3519,7 @@ void clif_dispchat(struct chat_data* cd, int fd)
|
|
|
WBUFL(buf, 4) = cd->owner->id;
|
|
|
WBUFL(buf, 8) = cd->bl.id;
|
|
|
WBUFW(buf,12) = cd->limit;
|
|
|
- WBUFW(buf,14) = cd->users;
|
|
|
+ WBUFW(buf,14) = (cd->owner->type == BL_NPC) ? cd->users+1 : cd->users;
|
|
|
WBUFB(buf,16) = type;
|
|
|
memcpy((char*)WBUFP(buf,17), cd->title, strlen(cd->title)); // not zero-terminated
|
|
|
|
|
@@ -3550,7 +3557,7 @@ void clif_changechatstatus(struct chat_data* cd)
|
|
|
WBUFL(buf, 4) = cd->owner->id;
|
|
|
WBUFL(buf, 8) = cd->bl.id;
|
|
|
WBUFW(buf,12) = cd->limit;
|
|
|
- WBUFW(buf,14) = cd->users;
|
|
|
+ WBUFW(buf,14) = (cd->owner->type == BL_NPC) ? cd->users+1 : cd->users;
|
|
|
WBUFB(buf,16) = type;
|
|
|
memcpy((char*)WBUFP(buf,17), cd->title, strlen(cd->title)); // not zero-terminated
|
|
|
|
|
@@ -3612,7 +3619,7 @@ void clif_joinchatfail(struct map_session_data *sd,int flag)
|
|
|
void clif_joinchatok(struct map_session_data *sd,struct chat_data* cd)
|
|
|
{
|
|
|
int fd;
|
|
|
- int i;
|
|
|
+ int i,t;
|
|
|
|
|
|
nullpo_retv(sd);
|
|
|
nullpo_retv(cd);
|
|
@@ -3620,13 +3627,24 @@ void clif_joinchatok(struct map_session_data *sd,struct chat_data* cd)
|
|
|
fd = sd->fd;
|
|
|
if (!session_isActive(fd))
|
|
|
return;
|
|
|
- WFIFOHEAD(fd, 8 + (28*cd->users));
|
|
|
+ t = (int)(cd->owner->type == BL_NPC);
|
|
|
+ WFIFOHEAD(fd, 8 + (28*(cd->users+t)));
|
|
|
WFIFOW(fd, 0) = 0xdb;
|
|
|
- WFIFOW(fd, 2) = 8 + (28*cd->users);
|
|
|
+ WFIFOW(fd, 2) = 8 + (28*(cd->users+t));
|
|
|
WFIFOL(fd, 4) = cd->bl.id;
|
|
|
+
|
|
|
+ if(cd->owner->type == BL_NPC){
|
|
|
+ WFIFOL(fd, 30) = 1;
|
|
|
+ WFIFOL(fd, 8) = 0;
|
|
|
+ memcpy(WFIFOP(fd, 12), ((struct npc_data *)cd->owner)->name, NAME_LENGTH);
|
|
|
+ for (i = 0; i < cd->users; i++) {
|
|
|
+ WFIFOL(fd, 8+(i+1)*28) = 1;
|
|
|
+ memcpy(WFIFOP(fd, 8+(i+t)*28+4), cd->usersd[i]->status.name, NAME_LENGTH);
|
|
|
+ }
|
|
|
+ } else
|
|
|
for (i = 0; i < cd->users; i++) {
|
|
|
WFIFOL(fd, 8+i*28) = (i != 0 || cd->owner->type == BL_NPC);
|
|
|
- memcpy(WFIFOP(fd, 8+i*28+4), cd->usersd[i]->status.name, NAME_LENGTH);
|
|
|
+ memcpy(WFIFOP(fd, 8+(i+t)*28+4), cd->usersd[i]->status.name, NAME_LENGTH);
|
|
|
}
|
|
|
WFIFOSET(fd, WFIFOW(fd, 2));
|
|
|
}
|