Advertisement
Guest User

Clif.c_Error

a guest
Feb 13th, 2015
234
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.35 KB | None | 0 0
  1. /*==========================================
  2. * Packet Delegation (called on all packets that require data to be sent to more than one client)
  3. * functions that are sent solely to one use whose ID it posses use WFIFOSET
  4. *------------------------------------------*/
  5. int clif_send(const uint8* buf, int len, struct block_list* bl, enum send_target type)
  6. {
  7. int i;
  8. struct map_session_data *sd, *tsd;
  9. struct party_data *p = NULL;
  10. struct guild *g = NULL;
  11. struct battleground_data *bg = NULL;
  12. int x0 = 0, x1 = 0, y0 = 0, y1 = 0, fd;
  13. struct s_mapiterator* iter;
  14.  
  15. if( type != ALL_CLIENT && type != BG_LISTEN )
  16. nullpo_ret(bl);
  17.  
  18. if( type == ALL_REGION && map[bl->m].region_id < 1 )
  19. return 0; // Not on a Region
  20.  
  21. sd = BL_CAST(BL_PC, bl);
  22.  
  23. switch(type) {
  24.  
  25. case ALL_CLIENT: //All player clients.
  26. case BG_LISTEN:
  27. iter = mapit_getallusers();
  28. while( (tsd = (TBL_PC*)mapit_next(iter)) != NULL )
  29. {
  30. if( type == BG_LISTEN && !(tsd->state.bg_listen || tsd->qd) )
  31. continue;
  32.  
  33. if( packet_db[tsd->packet_ver][RBUFW(buf,0)].len )
  34. { // packet must exist for the client version
  35. WFIFOHEAD(tsd->fd, len);
  36. memcpy(WFIFOP(tsd->fd,0), buf, len);
  37. WFIFOSET(tsd->fd,len);
  38. }
  39. }
  40. mapit_free(iter);
  41. break;
  42.  
  43. case ALL_SAMEMAP: //All players on the same map
  44. case ALL_REGION: // All players on the same region
  45. iter = mapit_getallusers();
  46. while( (tsd = (TBL_PC*)mapit_next(iter)) != NULL )
  47. {
  48. if( ((type == ALL_SAMEMAP && tsd->bl.m == bl->m) || (type == ALL_REGION && map[tsd->bl.m].region_id == map[bl->m].region_id)) && packet_db[tsd->packet_ver][RBUFW(buf,0)].len )
  49. { // packet must exist for the client version
  50. WFIFOHEAD(tsd->fd, len);
  51. memcpy(WFIFOP(tsd->fd,0), buf, len);
  52. WFIFOSET(tsd->fd,len);
  53. }
  54. }
  55. mapit_free(iter);
  56. break;
  57.  
  58. case AREA:
  59. case AREA_WOSC:
  60. if (sd && bl->prev == NULL) //Otherwise source misses the packet.[Skotlex]
  61. clif_send (buf, len, bl, SELF);
  62. case AREA_WOC:
  63. case AREA_WOS:
  64. map_foreachinarea(clif_send_sub, bl->m, bl->x-AREA_SIZE, bl->y-AREA_SIZE, bl->x+AREA_SIZE, bl->y+AREA_SIZE,
  65. BL_PC, buf, len, bl, type);
  66. break;
  67. case AREA_CHAT_WOC:
  68. map_foreachinarea(clif_send_sub, bl->m, bl->x-(AREA_SIZE-5), bl->y-(AREA_SIZE-5),
  69. bl->x+(AREA_SIZE-5), bl->y+(AREA_SIZE-5), BL_PC, buf, len, bl, AREA_WOC);
  70. break;
  71. case LANG_AREA_CHAT_WOC:
  72. case OTHER_LANG_AREA_CHAT_WOC:
  73. case FACTION_AREA_CHAT_WOC:
  74. case OTHER_FACTION_AREA_CHAT_WOC:
  75. case FACTION_LANG_AREA_CHAT_WOC:
  76. case FACTION_OTHER_LANG_AREA_CHAT_WOC:
  77. case OTHER_FACTION_LANG_AREA_CHAT_WOC:
  78. case OTHER_FACTION_OTHER_LANG_AREA_CHAT_WOC:
  79. if( !sd ) break;
  80. map_foreachinarea(clif_send_sub, bl->m, bl->x-(AREA_SIZE-5), bl->y-(AREA_SIZE-5),
  81. bl->x+(AREA_SIZE-5), bl->y+(AREA_SIZE-5), BL_PC, buf, len, bl, type, sd->status.faction_id, sd->lang_id);
  82. break;
  83. case FACTION_AREA_WOS:
  84. map_foreachinarea(clif_send_sub, bl->m, bl->x-AREA_SIZE, bl->y-AREA_SIZE, bl->x+AREA_SIZE, bl->y+AREA_SIZE,
  85. BL_PC, buf, len, bl, type);
  86. break;
  87.  
  88. case AREA_IWS:
  89. case AREA_IWOS:
  90. case AREA_WOI:
  91. map_foreachinarea(clif_send_sub, bl->m, bl->x-AREA_SIZE, bl->y-AREA_SIZE, bl->x+AREA_SIZE, bl->y+AREA_SIZE,
  92. BL_PC, buf, len, bl, type);
  93. break;
  94.  
  95. case CHAT:
  96. case CHAT_WOS:
  97. case LANG_CHAT_WOS:
  98. case OTHER_LANG_CHAT_WOS:
  99. {
  100. struct chat_data *cd;
  101. if (sd) {
  102. cd = (struct chat_data*)map_id2bl(sd->chatID);
  103. } else if (bl->type == BL_CHAT) {
  104. cd = (struct chat_data*)bl;
  105. } else break;
  106. if (cd == NULL)
  107. break;
  108. for(i = 0; i < cd->users; i++) {
  109. if( cd->usersd[i] == sd && (type == CHAT_WOS || type == LANG_CHAT_WOS || type == OTHER_LANG_CHAT_WOS) )
  110. continue;
  111. if( sd && (type == LANG_CHAT_WOS || type == OTHER_LANG_CHAT_WOS) )
  112. {
  113. struct faction_data* fd = NULL;
  114. bool known;
  115.  
  116. if( cd->usersd[i]->status.faction_id ) fd = faction_search(cd->usersd[i]->status.faction_id);
  117. known = (cd->usersd[i]->lang_id == sd->lang_id || (cd->usersd[i]->lang_mastery&lang_pow[sd->lang_id-1]) || (fd && fd->lang_id == sd->lang_id));
  118.  
  119. if( type == LANG_CHAT_WOS && !known )
  120. continue;
  121. if( type == OTHER_LANG_CHAT_WOS && known )
  122. continue;
  123. }
  124. if (packet_db[cd->usersd[i]->packet_ver][RBUFW(buf,0)].len) { // packet must exist for the client version
  125. if ((fd=cd->usersd[i]->fd) >0 && session[fd]) // Added check to see if session exists [PoW]
  126. {
  127. WFIFOHEAD(fd,len);
  128. memcpy(WFIFOP(fd,0), buf, len);
  129. WFIFOSET(fd,len);
  130. }
  131. }
  132. }
  133. }
  134. break;
  135. case PARTY_AREA:
  136. case PARTY_AREA_WOS:
  137. x0 = bl->x - AREA_SIZE;
  138. y0 = bl->y - AREA_SIZE;
  139. x1 = bl->x + AREA_SIZE;
  140. y1 = bl->y + AREA_SIZE;
  141. case PARTY:
  142. case PARTY_WOS:
  143. case PARTY_SAMEMAP:
  144. case PARTY_SAMEMAP_WOS:
  145. if (sd && sd->status.party_id)
  146. p = party_search(sd->status.party_id);
  147.  
  148. if (p) {
  149. for(i=0;i<MAX_PARTY;i++){
  150. if( (sd = p->data[i].sd) == NULL )
  151. continue;
  152.  
  153. if( !(fd=sd->fd) )
  154. continue;
  155.  
  156. if( sd->bl.id == bl->id && (type == PARTY_WOS || type == PARTY_SAMEMAP_WOS || type == PARTY_AREA_WOS) )
  157. continue;
  158.  
  159. if( type != PARTY && type != PARTY_WOS && bl->m != sd->bl.m )
  160. continue;
  161.  
  162. if( (type == PARTY_AREA || type == PARTY_AREA_WOS) && (sd->bl.x < x0 || sd->bl.y < y0 || sd->bl.x > x1 || sd->bl.y > y1) )
  163. continue;
  164.  
  165. if( packet_db[sd->packet_ver][RBUFW(buf,0)].len )
  166. { // packet must exist for the client version
  167. WFIFOHEAD(fd,len);
  168. memcpy(WFIFOP(fd,0), buf, len);
  169. WFIFOSET(fd,len);
  170. }
  171. }
  172. if (!enable_spy) //Skip unnecessary parsing. [Skotlex]
  173. break;
  174.  
  175. iter = mapit_getallusers();
  176. while( (tsd = (TBL_PC*)mapit_next(iter)) != NULL )
  177. {
  178. if( tsd->partyspy == p->party.party_id && packet_db[tsd->packet_ver][RBUFW(buf,0)].len )
  179. { // packet must exist for the client version
  180. WFIFOHEAD(tsd->fd, len);
  181. memcpy(WFIFOP(tsd->fd,0), buf, len);
  182. WFIFOSET(tsd->fd,len);
  183. }
  184. }
  185. mapit_free(iter);
  186. }
  187. break;
  188.  
  189. case DUEL:
  190. case DUEL_WOS:
  191. if (!sd || !sd->duel_group) break; //Invalid usage.
  192.  
  193. iter = mapit_getallusers();
  194. while( (tsd = (TBL_PC*)mapit_next(iter)) != NULL )
  195. {
  196. if( type == DUEL_WOS && bl->id == tsd->bl.id )
  197. continue;
  198. if( sd->duel_group == tsd->duel_group && packet_db[tsd->packet_ver][RBUFW(buf,0)].len )
  199. { // packet must exist for the client version
  200. WFIFOHEAD(tsd->fd, len);
  201. memcpy(WFIFOP(tsd->fd,0), buf, len);
  202. WFIFOSET(tsd->fd,len);
  203. }
  204. }
  205. mapit_free(iter);
  206. break;
  207.  
  208. case SELF:
  209. if (sd && (fd=sd->fd) && packet_db[sd->packet_ver][RBUFW(buf,0)].len) { // packet must exist for the client version
  210. WFIFOHEAD(fd,len);
  211. memcpy(WFIFOP(fd,0), buf, len);
  212. WFIFOSET(fd,len);
  213. }
  214. break;
  215.  
  216. // New definitions for guilds [Valaris] - Cleaned up and reorganized by [Skotlex]
  217. case GUILD_AREA:
  218. case GUILD_AREA_WOS:
  219. x0 = bl->x - AREA_SIZE;
  220. y0 = bl->y - AREA_SIZE;
  221. x1 = bl->x + AREA_SIZE;
  222. y1 = bl->y + AREA_SIZE;
  223. case GUILD_SAMEMAP:
  224. case GUILD_SAMEMAP_WOS:
  225. case GUILD:
  226. case GUILD_WOS:
  227. case GUILD_NOBG:
  228. if (sd && sd->status.guild_id)
  229. g = sd->guild;
  230.  
  231. if (g) {
  232. for(i = 0; i < g->max_member; i++) {
  233. if( (sd = g->member[i].sd) != NULL )
  234. {
  235. if( !(fd=sd->fd) )
  236. continue;
  237.  
  238. if( type == GUILD_NOBG && sd->bg_id )
  239. continue;
  240.  
  241. if( sd->bl.id == bl->id && (type == GUILD_WOS || type == GUILD_SAMEMAP_WOS || type == GUILD_AREA_WOS) )
  242. continue;
  243.  
  244. if( type != GUILD && type != GUILD_NOBG && type != GUILD_WOS && sd->bl.m != bl->m )
  245. continue;
  246.  
  247. if( (type == GUILD_AREA || type == GUILD_AREA_WOS) && (sd->bl.x < x0 || sd->bl.y < y0 || sd->bl.x > x1 || sd->bl.y > y1) )
  248. continue;
  249.  
  250. if( packet_db[sd->packet_ver][RBUFW(buf,0)].len )
  251. { // packet must exist for the client version
  252. WFIFOHEAD(fd,len);
  253. memcpy(WFIFOP(fd,0), buf, len);
  254. WFIFOSET(fd,len);
  255. }
  256. }
  257. }
  258. if (!enable_spy) //Skip unnecessary parsing. [Skotlex]
  259. break;
  260.  
  261. iter = mapit_getallusers();
  262. while( (tsd = (TBL_PC*)mapit_next(iter)) != NULL )
  263. {
  264. if( tsd->guildspy == g->guild_id && packet_db[tsd->packet_ver][RBUFW(buf,0)].len )
  265. { // packet must exist for the client version
  266. WFIFOHEAD(tsd->fd, len); //This is line 818
  267. memcpy(WFIFOP(tsd->fd,0), buf, len);
  268. WFIFOSET(tsd->fd,len);
  269. }
  270. }
  271. mapit_free(iter);
  272. }
  273. break;
  274.  
  275. case BG_AREA:
  276. case BG_AREA_WOS:
  277. x0 = bl->x - AREA_SIZE;
  278. y0 = bl->y - AREA_SIZE;
  279. x1 = bl->x + AREA_SIZE;
  280. y1 = bl->y + AREA_SIZE;
  281. case BG_SAMEMAP:
  282. case BG_SAMEMAP_WOS:
  283. case BG:
  284. case BG_WOS:
  285. if( sd && sd->bg_id && (bg = bg_team_search(sd->bg_id)) != NULL )
  286. {
  287. for( i = 0; i < MAX_BG_MEMBERS; i++ )
  288. {
  289. if( (sd = bg->members[i].sd) == NULL || !(fd = sd->fd) )
  290. continue;
  291. if( sd->bl.id == bl->id && (type == BG_WOS || type == BG_SAMEMAP_WOS || type == BG_AREA_WOS) )
  292. continue;
  293. if( type != BG && type != BG_WOS && sd->bl.m != bl->m )
  294. continue;
  295. if( (type == BG_AREA || type == BG_AREA_WOS) && (sd->bl.x < x0 || sd->bl.y < y0 || sd->bl.x > x1 || sd->bl.y > y1) )
  296. continue;
  297. if( packet_db[sd->packet_ver][RBUFW(buf,0)].len )
  298. { // packet must exist for the client version
  299. WFIFOHEAD(fd,len);
  300. memcpy(WFIFOP(fd,0), buf, len);
  301. WFIFOSET(fd,len);
  302. }
  303. }
  304. }
  305. break;
  306.  
  307. default:
  308. ShowError("clif_send: Unrecognized type %d\n",type);
  309. return -1;
  310. }
  311.  
  312. return 0;
  313. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement