summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog-Trunk.txt7
-rw-r--r--src/char/char.c57
-rw-r--r--src/char_sql/char.c53
-rw-r--r--src/map/script.c63
-rw-r--r--src/map/status.c18
-rw-r--r--src/map/trade.c9
6 files changed, 84 insertions, 123 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt
index 6900159fe..250d86250 100644
--- a/Changelog-Trunk.txt
+++ b/Changelog-Trunk.txt
@@ -4,6 +4,13 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
2006/10/11
+ * Cleaned up the char-server code when the last point of a player is not
+ found. First it'll check if there's any mapserver online, and then, if
+ there is, it'll look for the major cities. If this fails, then the player
+ will be told server is closed instead of trying to send him to a "random
+ map". Will fix the char-server printing the misleading message "map
+ server not found, sending to major city" when in reality there just
+ aren't any map servers connected. [Skotlex]
* Corrected the mob damagelog structure so that you can't exploit it by
switching characters. [Skotlex]
2006/10/09
diff --git a/src/char/char.c b/src/char/char.c
index 691dcf2a4..c581629c0 100644
--- a/src/char/char.c
+++ b/src/char/char.c
@@ -3484,51 +3484,46 @@ int parse_char(int fd) {
// if map is not found, we check major cities
if (i < 0) {
unsigned short j;
- ShowWarning("Unable to find map-server for '%s', resorting to sending to a major city.\n", mapindex_id2name(cd->last_point.map));
+ //First check that there's actually a map server online.
+ for(j = 0; j < MAX_MAP_SERVERS; j++)
+ if (server_fd[j] >= 0 && server[j].map[0])
+ break;
+ if (j == MAX_MAP_SERVERS) {
+ ShowInfo("Connection Closed. No map servers available.\n");
+ WFIFOHEAD(fd, 3);
+ WFIFOW(fd,0) = 0x81;
+ WFIFOB(fd,2) = 1; // 01 = Server closed
+ WFIFOSET(fd,3);
+ break;
+ }
if ((i = search_mapserver((j=mapindex_name2id(MAP_PRONTERA)),-1,-1)) >= 0) {
- cd->last_point.map = j;
- cd->last_point.x = 273; // savepoint coordinates
+ cd->last_point.x = 273;
cd->last_point.y = 354;
} else if ((i = search_mapserver((j=mapindex_name2id(MAP_GEFFEN)),-1,-1)) >= 0) {
- cd->last_point.map = j;
- cd->last_point.x = 120; // savepoint coordinates
+ cd->last_point.x = 120;
cd->last_point.y = 100;
} else if ((i = search_mapserver((j=mapindex_name2id(MAP_MORROC)),-1,-1)) >= 0) {
- cd->last_point.map = j;
- cd->last_point.x = 160; // savepoint coordinates
+ cd->last_point.x = 160;
cd->last_point.y = 94;
} else if ((i = search_mapserver((j=mapindex_name2id(MAP_ALBERTA)),-1,-1)) >= 0) {
- cd->last_point.map = j;
- cd->last_point.x = 116; // savepoint coordinates
+ cd->last_point.x = 116;
cd->last_point.y = 57;
} else if ((i = search_mapserver((j=mapindex_name2id(MAP_PAYON)),-1,-1)) >= 0) {
- cd->last_point.map = j;
- cd->last_point.x = 87; // savepoint coordinates
+ cd->last_point.x = 87;
cd->last_point.y = 117;
} else if ((i = search_mapserver((j=mapindex_name2id(MAP_IZLUDE)),-1,-1)) >= 0) {
- cd->last_point.map = j;
- cd->last_point.x = 94; // savepoint coordinates
+ cd->last_point.x = 94;
cd->last_point.y = 103;
} else {
- // get first online server (with a map)
- i = 0;
- for(j = 0; j < MAX_MAP_SERVERS; j++)
- if (server_fd[j] >= 0 && server[j].map[0]) { // change save point to one of map found on the server (the first)
- i = j;
- cd->last_point.map = server[j].map[0];
- ShowInfo("Map-server #%d found with a map: '%s'.\n", j, mapindex_id2name(server[j].map[0]));
- // coordinates are unknown
- break;
- }
- // if no map-server is connected, we send: server closed
- if (j == MAX_MAP_SERVERS) {
- WFIFOHEAD(fd, 3);
- WFIFOW(fd,0) = 0x81;
- WFIFOB(fd,2) = 1; // 01 = Server closed
- WFIFOSET(fd,3);
- break;
- }
+ ShowInfo("Connection Closed. No map server available that has a major city, and unable to find map-server for '%s'.\n", mapindex_id2name(cd->last_point.map));
+ WFIFOHEAD(fd, 3);
+ WFIFOW(fd,0) = 0x81;
+ WFIFOB(fd,2) = 1; // 01 = Server closed
+ WFIFOSET(fd,3);
+ break;
}
+ ShowWarning("Unable to find map-server for '%s', sending to major city '%s'.\n", mapindex_id2name(cd->last_point.map), mapindex_id2name(j));
+ cd->last_point.map = j;
}
WFIFOHEAD(fd, 28);
WFIFOW(fd,0) = 0x71;
diff --git a/src/char_sql/char.c b/src/char_sql/char.c
index 629bbade8..b0c90be7a 100644
--- a/src/char_sql/char.c
+++ b/src/char_sql/char.c
@@ -3279,48 +3279,45 @@ int parse_char(int fd) {
// if map is not found, we check major cities
if (i < 0) {
unsigned short j;
- ShowWarning("Unable to find map-server for '%s', resorting to sending to a major city.\n", mapindex_id2name(char_dat.last_point.map));
+ //First check that there's actually a map server online.
+ for(j = 0; j < MAX_MAP_SERVERS; j++)
+ if (server_fd[j] >= 0 && server[j].map[0])
+ break;
+ if (j == MAX_MAP_SERVERS) {
+ ShowInfo("Connection Closed. No map servers available.\n");
+ WFIFOHEAD(fd, 3);
+ WFIFOW(fd,0) = 0x81;
+ WFIFOB(fd,2) = 1; // 01 = Server closed
+ WFIFOSET(fd,3);
+ break;
+ }
if ((i = search_mapserver((j=mapindex_name2id(MAP_PRONTERA)),-1,-1)) >= 0) {
- char_dat.last_point.map = j;
- char_dat.last_point.x = 273; // savepoint coordinates
+ char_dat.last_point.x = 273;
char_dat.last_point.y = 354;
} else if ((i = search_mapserver((j=mapindex_name2id(MAP_GEFFEN)),-1,-1)) >= 0) {
- char_dat.last_point.map = j;
- char_dat.last_point.x = 120; // savepoint coordinates
+ char_dat.last_point.x = 120;
char_dat.last_point.y = 100;
} else if ((i = search_mapserver((j=mapindex_name2id(MAP_MORROC)),-1,-1)) >= 0) {
- char_dat.last_point.map = j;
- char_dat.last_point.x = 160; // savepoint coordinates
+ char_dat.last_point.x = 160;
char_dat.last_point.y = 94;
} else if ((i = search_mapserver((j=mapindex_name2id(MAP_ALBERTA)),-1,-1)) >= 0) {
- char_dat.last_point.map = j;
- char_dat.last_point.x = 116; // savepoint coordinates
+ char_dat.last_point.x = 116;
char_dat.last_point.y = 57;
} else if ((i = search_mapserver((j=mapindex_name2id(MAP_PAYON)),-1,-1)) >= 0) {
- char_dat.last_point.map = j;
- char_dat.last_point.x = 87; // savepoint coordinates
+ char_dat.last_point.x = 87;
char_dat.last_point.y = 117;
} else if ((i = search_mapserver((j=mapindex_name2id(MAP_IZLUDE)),-1,-1)) >= 0) {
- char_dat.last_point.map = j;
- char_dat.last_point.x = 94; // savepoint coordinates
+ char_dat.last_point.x = 94;
char_dat.last_point.y = 103;
} else {
- // get first online server
- i = 0;
- for(j = 0; j < MAX_MAP_SERVERS; j++)
- if (server_fd[j] > 0 && server[j].map[0]) {
- i = j;
- ShowDebug("Map-server #%d found with a map: '%s'.\n", j, mapindex_id2name(server[j].map[0]));
- break;
- }
- // if no map-servers are connected, we send: server closed
- if (j == MAX_MAP_SERVERS) {
- WFIFOW(fd,0) = 0x81;
- WFIFOB(fd,2) = 1; // 01 = Server closed
- WFIFOSET(fd,3);
- break;
- }
+ ShowInfo("Connection Closed. No map server available that has a major city, and unable to find map-server for '%s'.\n", mapindex_id2name(char_dat.last_point.map));
+ WFIFOW(fd,0) = 0x81;
+ WFIFOB(fd,2) = 1; // 01 = Server closed
+ WFIFOSET(fd,3);
+ break;
}
+ ShowWarning("Unable to find map-server for '%s', sending to major city '%s'.\n", mapindex_id2name(char_dat.last_point.map), mapindex_id2name(j));
+ char_dat.last_point.map = j;
}
WFIFOW(fd, 0) =0x71;
WFIFOL(fd, 2) =char_dat.char_id;
diff --git a/src/map/script.c b/src/map/script.c
index 707e87b16..c8319fb4b 100644
--- a/src/map/script.c
+++ b/src/map/script.c
@@ -12114,13 +12114,18 @@ int buildin_unitattack(struct script_state *st) {
tbl = &sd->bl;
if((bl = map_id2bl(id))){
- if (bl->type == BL_MOB) {
- ((TBL_MOB *)bl)->state.killer = 1;
- ((TBL_MOB *)bl)->target_id = tbl->id;
- } else if(bl->type == BL_PC){
+ switch (bl->type) {
+ case BL_PC:
clif_parse_ActionRequest_sub(((TBL_PC *)bl), actiontype > 0?0x07:0x00, tbl->id, gettick());
push_val(st->stack,C_INT,1);
return 0;
+ case BL_MOB:
+ ((TBL_MOB *)bl)->state.killer = 1;
+ ((TBL_MOB *)bl)->target_id = tbl->id;
+ break;
+ case BL_PET:
+ ((TBL_PET *)bl)->target_id = tbl->id;
+ break;
}
push_val(st->stack,C_INT,unit_walktobl(bl, tbl, 65025, 2));
} else {
@@ -12160,28 +12165,7 @@ int buildin_unittalk(struct script_state *st)
bl = map_id2bl(id);
if(bl) {
- switch(bl->type){
- case BL_MOB:
- memcpy(message, ((TBL_MOB *)bl)->name, NAME_LENGTH);
- break;
- case BL_PC:
- if(strlen(((TBL_PC *)bl)->fakename)>0)
- memcpy(message, ((TBL_PC *)bl)->fakename, NAME_LENGTH);
- else
- memcpy(message, ((TBL_PC *)bl)->status.name, NAME_LENGTH);
- break;
- case BL_NPC:
- memcpy(message, ((TBL_NPC *)bl)->name, NAME_LENGTH);
- break;
- case BL_HOM:
- memcpy(message, ((TBL_HOM *)bl)->master->homunculus.name, NAME_LENGTH);
- break;
- case BL_PET:
- memcpy(message, ((TBL_PET *)bl)->pet.name, NAME_LENGTH);
- break;
- default:
- strcpy(message, "Unknown");
- }
+ memcpy(message, status_get_name(bl), NAME_LENGTH);
strcat(message," : ");
strncat(message,str, 228); //Prevent overflow possibility. [Skotlex]
clif_message(bl, message);
@@ -12210,27 +12194,12 @@ int buildin_unitdeadsit(struct script_state *st){
if((bl = map_id2bl(id))){
if(action > -1 && action < 4){
unsigned char buf[61] = "";
- switch(bl->type){
- case BL_MOB:
- ((TBL_MOB *)bl)->vd->dead_sit = action;
- break;
- case BL_PC:
- ((TBL_PC *)bl)->vd.dead_sit = action;
- break;
- case BL_NPC:
- ((TBL_NPC *)bl)->vd->dead_sit = action;
- break;
- case BL_HOM:
- ((TBL_HOM *)bl)->vd->dead_sit = action;
- break;
- case BL_PET:
- ((TBL_PET *)bl)->vd.dead_sit = action;
- break;
- WBUFW(buf, 0) = 0x8a;
- WBUFL(buf, 2) = bl->id;
- WBUFB(buf,26) = (unsigned char)action;
- clif_send(buf, 61, bl, AREA);
- }
+ struct view_data *vd = status_get_viewdata(bl);
+ if (vd) vd->dead_sit = action;
+ WBUFW(buf, 0) = 0x8a;
+ WBUFL(buf, 2) = bl->id;
+ WBUFB(buf,26) = (unsigned char)action;
+ clif_send(buf, 61, bl, AREA);
}else {
ShowError("buildin_unitdeadsit: Invalid action.\n");
report_src(st);
diff --git a/src/map/status.c b/src/map/status.c
index 7a3d2c4eb..73bddae64 100644
--- a/src/map/status.c
+++ b/src/map/status.c
@@ -302,7 +302,6 @@ void initChangeTables(void) {
set_sc(ST_CHASEWALK, SC_CHASEWALK, SI_BLANK, SCB_SPEED);
set_sc(ST_REJECTSWORD, SC_REJECTSWORD, SI_REJECTSWORD, SCB_NONE);
add_sc(ST_REJECTSWORD, SC_AUTOCOUNTER);
-// set_sc(CG_MOONLIT, SC_MOONLIT, SI_MOONLIT, SCB_NONE);
set_sc(CG_MARIONETTE, SC_MARIONETTE, SI_MARIONETTE, SCB_STR|SCB_AGI|SCB_VIT|SCB_INT|SCB_DEX|SCB_LUK);
set_sc(CG_MARIONETTE, SC_MARIONETTE2, SI_MARIONETTE2, SCB_STR|SCB_AGI|SCB_VIT|SCB_INT|SCB_DEX|SCB_LUK);
add_sc(LK_SPIRALPIERCE, SC_STOP);
@@ -3915,18 +3914,21 @@ const char * status_get_name(struct block_list *bl)
nullpo_retr(0, bl);
switch (bl->type) {
case BL_MOB:
- return ((struct mob_data *)bl)->name;
+ return ((TBL_MOB*)bl)->name;
case BL_PC:
- return ((struct map_session_data *)bl)->status.name;
+ if(strlen(((TBL_PC *)bl)->fakename)>0)
+ return ((TBL_PC*)bl)->fakename;
+ return ((TBL_PC*)bl)->status.name;
case BL_PET:
- return ((struct pet_data *)bl)->pet.name;
+ return ((TBL_PET*)bl)->pet.name;
case BL_HOM:
- return ((struct homun_data *)bl)->master->homunculus.name;
+ if (((TBL_HOM*)bl)->master)
+ return ((TBL_HOM*)bl)->master->homunculus.name;
+ break;
case BL_NPC:
- return ((struct npc_data*)bl)->name;
- default:
- return "Unknown";
+ return ((TBL_NPC*)bl)->name;
}
+ return "Unknown";
}
/*==========================================
diff --git a/src/map/trade.c b/src/map/trade.c
index 4d8f4200d..442566e49 100644
--- a/src/map/trade.c
+++ b/src/map/trade.c
@@ -230,9 +230,6 @@ int trade_check(struct map_session_data *sd, struct map_session_data *tsd) {
return 0;
inventory2[i].amount += amount;
inventory[n].amount -= amount;
- //let's not make room, as pc_additem is done before pc_delitem, so it could lead to problems depending on order.
-// if (!inventory[n].amount)
-// malloc_set(&inventory[n], 0, sizeof(struct item));
break;
}
}
@@ -244,8 +241,6 @@ int trade_check(struct map_session_data *sd, struct map_session_data *tsd) {
memcpy(&inventory2[i], &inventory[n], sizeof(struct item));
inventory2[i].amount = amount;
inventory[n].amount -= amount;
-// if (!inventory[n].amount)
-// malloc_set(&inventory[n], 0, sizeof(struct item));
}
}
amount = tsd->deal.item[trade_i].amount;
@@ -266,8 +261,6 @@ int trade_check(struct map_session_data *sd, struct map_session_data *tsd) {
return 0;
inventory[i].amount += amount;
inventory2[n].amount -= amount;
-// if (!inventory2[n].amount)
-// malloc_set(&inventory2[n], 0, sizeof(struct item));
break;
}
}
@@ -278,8 +271,6 @@ int trade_check(struct map_session_data *sd, struct map_session_data *tsd) {
memcpy(&inventory[i], &inventory2[n], sizeof(struct item));
inventory[i].amount = amount;
inventory2[n].amount -= amount;
-// if (!inventory2[n].amount)
-// malloc_set(&inventory2[n], 0, sizeof(struct item));
}
}