1 | /* |
1 | /* |
2 | * static char *rcsid_init_c = |
2 | * static char *rcsid_init_c = |
3 | * "$Id: request.c,v 1.1 2006/02/03 07:14:46 root Exp $"; |
3 | * "$Id: request.c,v 1.2 2006/04/15 22:38:31 root Exp $"; |
4 | */ |
4 | */ |
5 | |
5 | |
6 | /* |
6 | /* |
7 | CrossFire, A Multiplayer game for X-windows |
7 | CrossFire, A Multiplayer game for X-windows |
8 | |
8 | |
… | |
… | |
104 | -1, /* Internal */ |
104 | -1, /* Internal */ |
105 | -1, /* life stealing */ |
105 | -1, /* life stealing */ |
106 | -1 /* Disease - not fully done yet */ |
106 | -1 /* Disease - not fully done yet */ |
107 | }; |
107 | }; |
108 | |
108 | |
|
|
109 | /** check for map change and send new map data */ |
|
|
110 | static void |
|
|
111 | check_map_change (player *pl) |
|
|
112 | { |
|
|
113 | char buf[MAX_BUF]; /* eauugggh */ |
|
|
114 | |
|
|
115 | object *ob = pl->ob; |
|
|
116 | |
|
|
117 | if (!pl->socket.mapinfocmd) |
|
|
118 | return; |
|
|
119 | |
|
|
120 | if (pl->socket.current_map != ob->map) |
|
|
121 | { |
|
|
122 | pl->socket.current_map = ob->map; |
|
|
123 | |
|
|
124 | if (ob->map && ob->map->path [0]) |
|
|
125 | snprintf (buf, MAX_BUF, "mapinfo current %d %d %d %d %s", |
|
|
126 | ob->x, ob->y, |
|
|
127 | ob->map->width, ob->map->height, ob->map->path); |
|
|
128 | else |
|
|
129 | snprintf (buf, MAX_BUF, "mapinfo current"); |
|
|
130 | |
|
|
131 | Write_String_To_Socket (&pl->socket, buf, strlen (buf)); |
|
|
132 | } |
|
|
133 | } |
|
|
134 | |
109 | /** This is the Setup cmd - easy first implementation */ |
135 | /** This is the Setup cmd - easy first implementation */ |
110 | void SetUp(char *buf, int len, NewSocket *ns) |
136 | void SetUp(char *buf, int len, NewSocket *ns) |
111 | { |
137 | { |
112 | int s; |
138 | int s, slen; |
113 | char *cmd, *param, cmdback[HUGE_BUF]; |
139 | char *cmd, *param, cmdback[HUGE_BUF]; |
114 | |
140 | |
115 | /* run through the cmds of setup |
141 | /* run through the cmds of setup |
116 | * syntax is setup <cmdname1> <parameter> <cmdname2> <parameter> ... |
142 | * syntax is setup <cmdname1> <parameter> <cmdname2> <parameter> ... |
117 | * |
143 | * |
… | |
… | |
137 | |
163 | |
138 | for(;buf[s] && buf[s] != ' ';s++) ; |
164 | for(;buf[s] && buf[s] != ' ';s++) ; |
139 | buf[s++]=0; |
165 | buf[s++]=0; |
140 | while (buf[s] == ' ') s++; |
166 | while (buf[s] == ' ') s++; |
141 | |
167 | |
142 | strcat(cmdback, " "); |
168 | slen = strlen(cmdback); |
143 | strcat(cmdback, cmd); |
169 | safe_strcat(cmdback, " ", &slen, HUGE_BUF); |
144 | strcat(cmdback, " "); |
170 | safe_strcat(cmdback, cmd, &slen, HUGE_BUF); |
145 | |
171 | safe_strcat(cmdback, " ", &slen, HUGE_BUF); |
146 | |
172 | |
147 | if (!strcmp(cmd,"sound")) { |
173 | if (!strcmp(cmd,"sound")) { |
148 | ns->sound = atoi(param); |
174 | ns->sound = atoi(param); |
149 | strcat(cmdback, param); |
175 | safe_strcat(cmdback, param, &slen, HUGE_BUF); |
150 | } |
176 | } |
151 | else if (!strcmp(cmd,"exp64")) { |
177 | else if (!strcmp(cmd,"exp64")) { |
152 | ns->exp64 = atoi(param); |
178 | ns->exp64 = atoi(param); |
153 | strcat(cmdback, param); |
179 | safe_strcat(cmdback, param, &slen, HUGE_BUF); |
154 | } else if (!strcmp(cmd, "spellmon")) { |
180 | } else if (!strcmp(cmd, "spellmon")) { |
155 | ns->monitor_spells = atoi(param); |
181 | ns->monitor_spells = atoi(param); |
156 | strcat(cmdback, param); |
182 | safe_strcat(cmdback, param, &slen, HUGE_BUF); |
157 | } else if (!strcmp(cmd,"darkness")) { |
183 | } else if (!strcmp(cmd,"darkness")) { |
158 | ns->darkness = atoi(param); |
184 | ns->darkness = atoi(param); |
159 | strcat(cmdback, param); |
185 | safe_strcat(cmdback, param, &slen, HUGE_BUF); |
160 | } else if (!strcmp(cmd,"map1cmd")) { |
186 | } else if (!strcmp(cmd,"map1cmd")) { |
161 | if (atoi(param)) ns->mapmode = Map1Cmd; |
187 | if (atoi(param)) ns->mapmode = Map1Cmd; |
162 | /* if beyond this size, need to use map1cmd no matter what */ |
188 | /* if beyond this size, need to use map1cmd no matter what */ |
163 | if (ns->mapx>11 || ns->mapy>11) ns->mapmode = Map1Cmd; |
189 | if (ns->mapx>11 || ns->mapy>11) ns->mapmode = Map1Cmd; |
164 | strcat(cmdback, ns->mapmode == Map1Cmd?"1":"0"); |
190 | safe_strcat(cmdback, ns->mapmode == Map1Cmd?"1":"0", &slen, HUGE_BUF); |
165 | } else if (!strcmp(cmd,"map1acmd")) { |
191 | } else if (!strcmp(cmd,"map1acmd")) { |
166 | if (atoi(param)) ns->mapmode = Map1aCmd; |
192 | if (atoi(param)) ns->mapmode = Map1aCmd; |
167 | /* if beyond this size, need to use map1acmd no matter what */ |
193 | /* if beyond this size, need to use map1acmd no matter what */ |
168 | if (ns->mapx>11 || ns->mapy>11) ns->mapmode = Map1aCmd; |
194 | if (ns->mapx>11 || ns->mapy>11) ns->mapmode = Map1aCmd; |
169 | strcat(cmdback, ns->mapmode == Map1aCmd?"1":"0"); |
195 | safe_strcat(cmdback, ns->mapmode == Map1aCmd?"1":"0", &slen, HUGE_BUF); |
170 | } else if (!strcmp(cmd,"newmapcmd")) { |
196 | } else if (!strcmp(cmd,"newmapcmd")) { |
171 | ns->newmapcmd= atoi(param); |
197 | ns->newmapcmd= atoi(param); |
172 | strcat(cmdback, param); |
198 | safe_strcat(cmdback, param, &slen, HUGE_BUF); |
|
|
199 | // } else if (!strcmp(cmd,"plugincmd")) { |
|
|
200 | // ns->plugincmd = atoi(param); |
|
|
201 | // safe_strcat(cmdback, param, &slen, HUGE_BUF); |
|
|
202 | } else if (!strcmp(cmd,"mapinfocmd")) { |
|
|
203 | ns->mapinfocmd = atoi(param); |
|
|
204 | safe_strcat(cmdback, param, &slen, HUGE_BUF); |
173 | } else if (!strcmp(cmd,"facecache")) { |
205 | } else if (!strcmp(cmd,"facecache")) { |
174 | ns->facecache = atoi(param); |
206 | ns->facecache = atoi(param); |
175 | strcat(cmdback, param); |
207 | safe_strcat(cmdback, param, &slen, HUGE_BUF); |
176 | } else if (!strcmp(cmd,"faceset")) { |
208 | } else if (!strcmp(cmd,"faceset")) { |
177 | char tmpbuf[20]; |
209 | char tmpbuf[20]; |
178 | int q = atoi(param); |
210 | int q = atoi(param); |
179 | |
211 | |
180 | if (is_valid_faceset(q)) |
212 | if (is_valid_faceset(q)) |
181 | ns->faceset=q; |
213 | ns->faceset=q; |
182 | sprintf(tmpbuf,"%d", ns->faceset); |
214 | sprintf(tmpbuf,"%d", ns->faceset); |
183 | strcat(cmdback, tmpbuf); |
215 | safe_strcat(cmdback, tmpbuf, &slen, HUGE_BUF); |
184 | /* if the client is using faceset, it knows about image2 command */ |
216 | /* if the client is using faceset, it knows about image2 command */ |
185 | ns->image2=1; |
217 | ns->image2=1; |
186 | } else if (!strcmp(cmd,"itemcmd")) { |
218 | } else if (!strcmp(cmd,"itemcmd")) { |
187 | /* Version of the item protocol command to use. Currently, |
219 | /* Version of the item protocol command to use. Currently, |
188 | * only supported versions are 1 and 2. Using a numeric |
220 | * only supported versions are 1 and 2. Using a numeric |
… | |
… | |
194 | strcpy(tmpbuf,"FALSE"); |
226 | strcpy(tmpbuf,"FALSE"); |
195 | } else { |
227 | } else { |
196 | ns->itemcmd = q; |
228 | ns->itemcmd = q; |
197 | sprintf(tmpbuf,"%d", ns->itemcmd); |
229 | sprintf(tmpbuf,"%d", ns->itemcmd); |
198 | } |
230 | } |
199 | strcat(cmdback, tmpbuf); |
231 | safe_strcat(cmdback, tmpbuf, &slen, HUGE_BUF); |
200 | } else if (!strcmp(cmd,"mapsize")) { |
232 | } else if (!strcmp(cmd,"mapsize")) { |
201 | int x, y=0; |
233 | int x, y=0; |
202 | char tmpbuf[MAX_BUF], *cp; |
234 | char tmpbuf[MAX_BUF], *cp; |
203 | |
235 | |
204 | x = atoi(param); |
236 | x = atoi(param); |
… | |
… | |
207 | y = atoi(cp+1); |
239 | y = atoi(cp+1); |
208 | break; |
240 | break; |
209 | } |
241 | } |
210 | if (x < 9 || y < 9 || x>MAP_CLIENT_X || y > MAP_CLIENT_Y) { |
242 | if (x < 9 || y < 9 || x>MAP_CLIENT_X || y > MAP_CLIENT_Y) { |
211 | sprintf(tmpbuf," %dx%d", MAP_CLIENT_X, MAP_CLIENT_Y); |
243 | sprintf(tmpbuf," %dx%d", MAP_CLIENT_X, MAP_CLIENT_Y); |
212 | strcat(cmdback, tmpbuf); |
244 | safe_strcat(cmdback, tmpbuf, &slen, HUGE_BUF); |
213 | } else { |
245 | } else { |
214 | ns->mapx = x; |
246 | ns->mapx = x; |
215 | ns->mapy = y; |
247 | ns->mapy = y; |
216 | /* better to send back what we are really using and not the |
248 | /* better to send back what we are really using and not the |
217 | * param as given to us in case it gets parsed differently. |
249 | * param as given to us in case it gets parsed differently. |
218 | */ |
250 | */ |
219 | sprintf(tmpbuf,"%dx%d", x,y); |
251 | sprintf(tmpbuf,"%dx%d", x,y); |
220 | strcat(cmdback, tmpbuf); |
252 | safe_strcat(cmdback, tmpbuf, &slen, HUGE_BUF); |
221 | /* If beyond this size and still using orig map command, need to |
253 | /* If beyond this size and still using orig map command, need to |
222 | * go to map1cmd. |
254 | * go to map1cmd. |
223 | */ |
255 | */ |
224 | if ((x>11 || y>11) && ns->mapmode == Map0Cmd) ns->mapmode = Map1Cmd; |
256 | if ((x>11 || y>11) && ns->mapmode == Map0Cmd) ns->mapmode = Map1Cmd; |
225 | } |
257 | } |
226 | } else if (!strcmp(cmd,"extendedMapInfos")) { |
258 | } else if (!strcmp(cmd,"extendedMapInfos")) { |
227 | /* Added by tchize |
259 | /* Added by tchize |
228 | * prepare to use the mapextended command |
260 | * prepare to use the mapextended command |
229 | */ |
261 | */ |
230 | char tmpbuf[20]; |
262 | char tmpbuf[20]; |
231 | ns->ext_mapinfos = (atoi(param)); |
263 | ns->ext_mapinfos = (atoi(param)); |
232 | sprintf(tmpbuf,"%d", ns->ext_mapinfos); |
264 | sprintf(tmpbuf,"%d", ns->ext_mapinfos); |
233 | strcat(cmdback, tmpbuf); |
265 | safe_strcat(cmdback, tmpbuf, &slen, HUGE_BUF); |
234 | } else if (!strcmp(cmd,"extendedTextInfos")) { |
266 | } else if (!strcmp(cmd,"extendedTextInfos")) { |
235 | /* Added by tchize |
267 | /* Added by tchize |
236 | * prepare to use the extended text commands |
268 | * prepare to use the extended text commands |
237 | * Client toggle this to non zero to get exttext |
269 | * Client toggle this to non zero to get exttext |
238 | */ |
270 | */ |
239 | char tmpbuf[20]; |
271 | char tmpbuf[20]; |
|
|
272 | |
240 | ns->has_readable_type = (atoi(param)); |
273 | ns->has_readable_type = (atoi(param)); |
241 | sprintf(tmpbuf,"%d", ns->has_readable_type); |
274 | sprintf(tmpbuf,"%d", ns->has_readable_type); |
242 | strcat(cmdback, tmpbuf); |
275 | safe_strcat(cmdback, tmpbuf, &slen, HUGE_BUF); |
243 | } else { |
276 | } else { |
244 | /* Didn't get a setup command we understood - |
277 | /* Didn't get a setup command we understood - |
245 | * report a failure to the client. |
278 | * report a failure to the client. |
246 | */ |
279 | */ |
247 | strcat(cmdback, "FALSE"); |
280 | safe_strcat(cmdback, "FALSE", &slen, HUGE_BUF); |
248 | } |
281 | } |
249 | } /* for processing all the setup commands */ |
282 | } /* for processing all the setup commands */ |
250 | LOG(llevInfo,"SendBack SetupCmd:: %s\n", cmdback); |
283 | LOG(llevInfo,"SendBack SetupCmd:: %s\n", cmdback); |
251 | Write_String_To_Socket(ns, cmdback, strlen(cmdback)); |
284 | Write_String_To_Socket(ns, cmdback, strlen(cmdback)); |
252 | } |
285 | } |
… | |
… | |
362 | * Basically, it makes no sense to wait for the client to request a |
395 | * Basically, it makes no sense to wait for the client to request a |
363 | * a piece of data from us that we know the client wants. So |
396 | * a piece of data from us that we know the client wants. So |
364 | * if we know the client wants it, might as well push it to the |
397 | * if we know the client wants it, might as well push it to the |
365 | * client. |
398 | * client. |
366 | */ |
399 | */ |
367 | void SendSmooth(NewSocket *ns, uint16 face) { |
400 | static void SendSmooth(NewSocket *ns, uint16 face) { |
368 | uint16 smoothface; |
401 | uint16 smoothface; |
369 | uint8 reply[MAX_BUF]; |
402 | uint8 reply[MAX_BUF]; |
370 | SockList sl; |
403 | SockList sl; |
371 | |
404 | |
372 | /* If we can't find a face, return and set it so we won't try to send this |
405 | /* If we can't find a face, return and set it so we won't try to send this |
… | |
… | |
617 | LOG(llevDebug, "CS: scversion mismatch (%d,%d)\n",VERSION_SC,ns->sc_version); |
650 | LOG(llevDebug, "CS: scversion mismatch (%d,%d)\n",VERSION_SC,ns->sc_version); |
618 | #endif |
651 | #endif |
619 | } |
652 | } |
620 | cp = strchr(cp+1, ' '); |
653 | cp = strchr(cp+1, ' '); |
621 | if (cp) { |
654 | if (cp) { |
622 | LOG(llevDebug,"CS: connection from client of type <%s>\n", cp); |
655 | LOG(llevDebug,"CS: connection from client of type <%s>, ip %s\n", cp, ns->host); |
623 | |
656 | |
624 | /* This is first implementation - i skip all beta DX clients with it |
657 | /* This is first implementation - i skip all beta DX clients with it |
625 | * Add later stuff here for other clients |
658 | * Add later stuff here for other clients |
626 | */ |
659 | */ |
627 | |
660 | |
… | |
… | |
669 | { |
702 | { |
670 | if( pl->socket.newmapcmd == 1) { |
703 | if( pl->socket.newmapcmd == 1) { |
671 | memset(&pl->socket.lastmap, 0, sizeof(pl->socket.lastmap)); |
704 | memset(&pl->socket.lastmap, 0, sizeof(pl->socket.lastmap)); |
672 | Write_String_To_Socket( &pl->socket, "newmap", 6); |
705 | Write_String_To_Socket( &pl->socket, "newmap", 6); |
673 | } |
706 | } |
|
|
707 | check_map_change (pl); |
674 | } |
708 | } |
675 | |
709 | |
676 | |
710 | |
677 | |
711 | |
678 | /** |
712 | /** |
… | |
… | |
1433 | uint16 mask,emask; |
1467 | uint16 mask,emask; |
1434 | uint8 eentrysize; |
1468 | uint8 eentrysize; |
1435 | uint16 ewhatstart,ewhatflag; |
1469 | uint16 ewhatstart,ewhatflag; |
1436 | uint8 extendedinfos; |
1470 | uint8 extendedinfos; |
1437 | mapstruct *m; |
1471 | mapstruct *m; |
|
|
1472 | |
|
|
1473 | check_map_change (pl->contr); |
1438 | |
1474 | |
1439 | sl.buf=malloc(MAXSOCKBUF); |
1475 | sl.buf=malloc(MAXSOCKBUF); |
1440 | if (pl->contr->socket.mapmode == Map1Cmd) |
1476 | if (pl->contr->socket.mapmode == Map1Cmd) |
1441 | strcpy((char*)sl.buf,"map1 "); |
1477 | strcpy((char*)sl.buf,"map1 "); |
1442 | else |
1478 | else |
… | |
… | |
1736 | sint16 ax, ay, nx, ny;/* ax and ay goes from 0 to max-size of arrays */ |
1772 | sint16 ax, ay, nx, ny;/* ax and ay goes from 0 to max-size of arrays */ |
1737 | New_Face *face,*floor; |
1773 | New_Face *face,*floor; |
1738 | New_Face *floor2; |
1774 | New_Face *floor2; |
1739 | int d, mflags; |
1775 | int d, mflags; |
1740 | struct Map newmap; |
1776 | struct Map newmap; |
1741 | mapstruct *m; |
1777 | mapstruct *m, *pm; |
1742 | |
1778 | |
1743 | if (pl->type != PLAYER) { |
1779 | if (pl->type != PLAYER) { |
1744 | LOG(llevError,"draw_client_map called with non player/non eric-server\n"); |
1780 | LOG(llevError,"draw_client_map called with non player/non eric-server\n"); |
1745 | return; |
1781 | return; |
1746 | } |
1782 | } |
1747 | |
1783 | |
|
|
1784 | if (pl->contr->transport) { |
|
|
1785 | pm = pl->contr->transport->map; |
|
|
1786 | } |
|
|
1787 | else |
|
|
1788 | pm = pl->map; |
|
|
1789 | |
1748 | /* IF player is just joining the game, he isn't here yet, so the map |
1790 | /* If player is just joining the game, he isn't here yet, so the map |
1749 | * can get swapped out. If so, don't try to send them a map. All will |
1791 | * can get swapped out. If so, don't try to send them a map. All will |
1750 | * be OK once they really log in. |
1792 | * be OK once they really log in. |
1751 | */ |
1793 | */ |
1752 | if (pl->map==NULL || pl->map->in_memory!=MAP_IN_MEMORY) return; |
1794 | if (pm==NULL || pm->in_memory!=MAP_IN_MEMORY) return; |
1753 | |
1795 | |
1754 | memset(&newmap, 0, sizeof(struct Map)); |
1796 | memset(&newmap, 0, sizeof(struct Map)); |
1755 | |
1797 | |
1756 | for(j = (pl->y - pl->contr->socket.mapy/2) ; j < (pl->y + (pl->contr->socket.mapy+1)/2); j++) { |
1798 | for(j = (pl->y - pl->contr->socket.mapy/2) ; j < (pl->y + (pl->contr->socket.mapy+1)/2); j++) { |
1757 | for(i = (pl->x - pl->contr->socket.mapx/2) ; i < (pl->x + (pl->contr->socket.mapx+1)/2); i++) { |
1799 | for(i = (pl->x - pl->contr->socket.mapx/2) ; i < (pl->x + (pl->contr->socket.mapx+1)/2); i++) { |
1758 | ax=i; |
1800 | ax=i; |
1759 | ay=j; |
1801 | ay=j; |
1760 | m = pl->map; |
1802 | m = pm; |
1761 | mflags = get_map_flags(m, &m, ax, ay, &ax, &ay); |
1803 | mflags = get_map_flags(m, &m, ax, ay, &ax, &ay); |
1762 | if (mflags & P_OUT_OF_MAP) |
1804 | if (mflags & P_OUT_OF_MAP) |
1763 | continue; |
1805 | continue; |
1764 | if (mflags & P_NEED_UPDATE) |
1806 | if (mflags & P_NEED_UPDATE) |
1765 | update_position(m, ax, ay); |
1807 | update_position(m, ax, ay); |
… | |
… | |
1807 | /* note the out_of_map and d>3 checks are both within the same |
1849 | /* note the out_of_map and d>3 checks are both within the same |
1808 | * negation check. |
1850 | * negation check. |
1809 | */ |
1851 | */ |
1810 | nx = i; |
1852 | nx = i; |
1811 | ny = j; |
1853 | ny = j; |
1812 | m = get_map_from_coord(pl->map, &nx, &ny); |
1854 | m = get_map_from_coord(pm, &nx, &ny); |
1813 | if (m && d<4) { |
1855 | if (m && d<4) { |
1814 | face = GET_MAP_FACE(m, nx, ny,0); |
1856 | face = GET_MAP_FACE(m, nx, ny,0); |
1815 | floor2 = GET_MAP_FACE(m, nx, ny,1); |
1857 | floor2 = GET_MAP_FACE(m, nx, ny,1); |
1816 | floor = GET_MAP_FACE(m, nx, ny,2); |
1858 | floor = GET_MAP_FACE(m, nx, ny,2); |
1817 | |
1859 | |
… | |
… | |
1917 | { |
1959 | { |
1918 | SockList sl; |
1960 | SockList sl; |
1919 | int i; |
1961 | int i; |
1920 | |
1962 | |
1921 | sl.buf = malloc(MAXSOCKBUF); |
1963 | sl.buf = malloc(MAXSOCKBUF); |
1922 | strcpy(sl.buf,"replyinfo skill_info\n"); |
1964 | strcpy((char*)sl.buf,"replyinfo skill_info\n"); |
1923 | for (i=1; i< NUM_SKILLS; i++) { |
1965 | for (i=1; i< NUM_SKILLS; i++) { |
1924 | sprintf(sl.buf + strlen(sl.buf), "%d:%s\n", i + CS_STAT_SKILLINFO, |
1966 | sprintf((char*)sl.buf + strlen((char*)sl.buf), "%d:%s\n", i + CS_STAT_SKILLINFO, |
1925 | skill_names[i]); |
1967 | skill_names[i]); |
1926 | } |
1968 | } |
1927 | sl.len = strlen(sl.buf); |
1969 | sl.len = strlen((char*)sl.buf); |
1928 | if (sl.len > MAXSOCKBUF) { |
1970 | if (sl.len > MAXSOCKBUF) { |
1929 | LOG(llevError,"Buffer overflow in send_skill_info!\n"); |
1971 | LOG(llevError,"Buffer overflow in send_skill_info!\n"); |
1930 | fatal(0); |
1972 | fatal(0); |
1931 | } |
1973 | } |
1932 | Send_With_Handling(ns, &sl); |
1974 | Send_With_Handling(ns, &sl); |
… | |
… | |
1940 | void send_spell_paths (NewSocket *ns, char *params) { |
1982 | void send_spell_paths (NewSocket *ns, char *params) { |
1941 | SockList sl; |
1983 | SockList sl; |
1942 | int i; |
1984 | int i; |
1943 | |
1985 | |
1944 | sl.buf = malloc(MAXSOCKBUF); |
1986 | sl.buf = malloc(MAXSOCKBUF); |
1945 | strcpy(sl.buf,"replyinfo spell_paths\n"); |
1987 | strcpy((char*)sl.buf,"replyinfo spell_paths\n"); |
1946 | for(i=0; i<NRSPELLPATHS; i++) |
1988 | for(i=0; i<NRSPELLPATHS; i++) |
1947 | sprintf(sl.buf + strlen(sl.buf), "%d:%s\n", 1<<i, spellpathnames[i]); |
1989 | sprintf((char*)sl.buf + strlen((char*)sl.buf), "%d:%s\n", 1<<i, spellpathnames[i]); |
1948 | sl.len = strlen(sl.buf); |
1990 | sl.len = strlen((char*)sl.buf); |
1949 | if (sl.len > MAXSOCKBUF) { |
1991 | if (sl.len > MAXSOCKBUF) { |
1950 | LOG(llevError,"Buffer overflow in send_spell_paths!\n"); |
1992 | LOG(llevError,"Buffer overflow in send_spell_paths!\n"); |
1951 | fatal(0); |
1993 | fatal(0); |
1952 | } |
1994 | } |
1953 | Send_With_Handling(ns, &sl); |
1995 | Send_With_Handling(ns, &sl); |
… | |
… | |
1978 | spell->last_eat = spell->stats.dam+SP_level_dam_adjust(pl->ob, spell); |
2020 | spell->last_eat = spell->stats.dam+SP_level_dam_adjust(pl->ob, spell); |
1979 | flags |= UPD_SP_DAMAGE; |
2021 | flags |= UPD_SP_DAMAGE; |
1980 | } |
2022 | } |
1981 | if (flags !=0) { |
2023 | if (flags !=0) { |
1982 | sl.buf = malloc(MAXSOCKBUF); |
2024 | sl.buf = malloc(MAXSOCKBUF); |
1983 | strcpy(sl.buf,"updspell "); |
2025 | strcpy((char*)sl.buf,"updspell "); |
1984 | sl.len=strlen((char*)sl.buf); |
2026 | sl.len=strlen((char*)sl.buf); |
1985 | SockList_AddChar(&sl, flags); |
2027 | SockList_AddChar(&sl, flags); |
1986 | SockList_AddInt(&sl, spell->count); |
2028 | SockList_AddInt(&sl, spell->count); |
1987 | if (flags & UPD_SP_MANA) SockList_AddShort(&sl, spell->last_sp); |
2029 | if (flags & UPD_SP_MANA) SockList_AddShort(&sl, spell->last_sp); |
1988 | if (flags & UPD_SP_GRACE) SockList_AddShort(&sl, spell->last_grace); |
2030 | if (flags & UPD_SP_GRACE) SockList_AddShort(&sl, spell->last_grace); |
… | |
… | |
2002 | if (!pl || !spell || spell->env != pl->ob) { |
2044 | if (!pl || !spell || spell->env != pl->ob) { |
2003 | LOG(llevError, "Invalid call to esrv_remove_spell"); |
2045 | LOG(llevError, "Invalid call to esrv_remove_spell"); |
2004 | return; |
2046 | return; |
2005 | } |
2047 | } |
2006 | sl.buf = malloc(MAXSOCKBUF); |
2048 | sl.buf = malloc(MAXSOCKBUF); |
2007 | strcpy(sl.buf,"delspell "); |
2049 | strcpy((char*)sl.buf,"delspell "); |
2008 | sl.len=strlen((char*)sl.buf); |
2050 | sl.len=strlen((char*)sl.buf); |
2009 | SockList_AddInt(&sl, spell->count); |
2051 | SockList_AddInt(&sl, spell->count); |
2010 | Send_With_Handling(&pl->socket, &sl); |
2052 | Send_With_Handling(&pl->socket, &sl); |
2011 | free(sl.buf); |
2053 | free(sl.buf); |
2012 | } |
2054 | } |
2013 | |
2055 | |
2014 | /* appends the spell *spell to the Socklist we will send the data to. */ |
2056 | /* appends the spell *spell to the Socklist we will send the data to. */ |
2015 | static void append_spell (player *pl, SockList *sl, object *spell) { |
2057 | static void append_spell (player *pl, SockList *sl, object *spell) { |
2016 | int len, i, skill=0; |
2058 | int len, i, skill=0; |
2017 | |
2059 | |
2018 | if (!(spell->name)) { |
2060 | if (!(spell->name)) { |
2019 | LOG(llevError, "item number %d is a spell with no name.\n", spell->count); |
2061 | LOG(llevError, "item number %d is a spell with no name.\n", spell->count); |
2020 | return; |
2062 | return; |
2021 | } |
2063 | } |
… | |
… | |
2029 | /* send the current values */ |
2071 | /* send the current values */ |
2030 | SockList_AddShort(sl, spell->last_sp); |
2072 | SockList_AddShort(sl, spell->last_sp); |
2031 | SockList_AddShort(sl, spell->last_grace); |
2073 | SockList_AddShort(sl, spell->last_grace); |
2032 | SockList_AddShort(sl, spell->last_eat); |
2074 | SockList_AddShort(sl, spell->last_eat); |
2033 | |
2075 | |
2034 | /* figure out which skill it uses */ |
2076 | /* figure out which skill it uses, if it uses one */ |
|
|
2077 | if (spell->skill) { |
2035 | for (i=1; i< NUM_SKILLS; i++) |
2078 | for (i=1; i< NUM_SKILLS; i++) |
2036 | if (!strcmp(spell->skill, skill_names[i])) { |
2079 | if (!strcmp(spell->skill, skill_names[i])) { |
2037 | skill = i+CS_STAT_SKILLINFO; |
2080 | skill = i+CS_STAT_SKILLINFO; |
2038 | break; |
2081 | break; |
2039 | } |
2082 | } |
2040 | skill = i+CS_STAT_SKILLINFO; |
2083 | } |
2041 | SockList_AddChar(sl, skill); |
2084 | SockList_AddChar(sl, skill); |
2042 | |
2085 | |
2043 | SockList_AddInt(sl, spell->path_attuned); |
2086 | SockList_AddInt(sl, spell->path_attuned); |
2044 | SockList_AddInt(sl, (spell->face)?spell->face->number:0); |
2087 | SockList_AddInt(sl, (spell->face)?spell->face->number:0); |
2045 | |
2088 | |
… | |
… | |
2069 | LOG(llevError, "esrv_add_spells, tried to add a spell to a NULL player"); |
2112 | LOG(llevError, "esrv_add_spells, tried to add a spell to a NULL player"); |
2070 | return; |
2113 | return; |
2071 | } |
2114 | } |
2072 | if (!pl->socket.monitor_spells) return; |
2115 | if (!pl->socket.monitor_spells) return; |
2073 | sl.buf = malloc(MAXSOCKBUF); |
2116 | sl.buf = malloc(MAXSOCKBUF); |
2074 | strcpy(sl.buf,"addspell "); |
2117 | strcpy((char*)sl.buf,"addspell "); |
2075 | sl.len=strlen((char*)sl.buf); |
2118 | sl.len=strlen((char*)sl.buf); |
2076 | if (!spell) { |
2119 | if (!spell) { |
2077 | for (spell=pl->ob->inv; spell!=NULL; spell=spell->below) { |
2120 | for (spell=pl->ob->inv; spell!=NULL; spell=spell->below) { |
2078 | /* were we to simply keep appending data here, we could exceed |
2121 | /* were we to simply keep appending data here, we could exceed |
2079 | * MAXSOCKBUF if the player has enough spells to add, we know that |
2122 | * MAXSOCKBUF if the player has enough spells to add, we know that |
… | |
… | |
2090 | */ |
2133 | */ |
2091 | if (spell->type != SPELL) continue; |
2134 | if (spell->type != SPELL) continue; |
2092 | if (sl.len > (MAXSOCKBUF - (26 + strlen(spell->name) + |
2135 | if (sl.len > (MAXSOCKBUF - (26 + strlen(spell->name) + |
2093 | (spell->msg?strlen(spell->msg):0)))) { |
2136 | (spell->msg?strlen(spell->msg):0)))) { |
2094 | Send_With_Handling(&pl->socket, &sl); |
2137 | Send_With_Handling(&pl->socket, &sl); |
2095 | strcpy(sl.buf,"addspell "); |
2138 | strcpy((char*)sl.buf,"addspell "); |
2096 | sl.len=strlen((char*)sl.buf); |
2139 | sl.len=strlen((char*)sl.buf); |
2097 | } |
2140 | } |
2098 | append_spell(pl, &sl, spell); |
2141 | append_spell(pl, &sl, spell); |
2099 | } |
2142 | } |
2100 | } |
2143 | } |