diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt index fb11eeb41d..15dac6cec2 100644 --- a/Changelog-Trunk.txt +++ b/Changelog-Trunk.txt @@ -5,6 +5,10 @@ IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK. EV GOES INTO TRUNK AND WILL BE MERGED INTO STABLE BY VALARIS AND WIZPUTER. -- VALARIS 2006/03/24 + * Modified script commands atcommand/charcommand to execute even if there + isn't a player attached. They'll use a dummy player data with the same + position/name as the script's owner (usually an npc). Be careful when using + this as the result of some @/# commands may be unexpected! [Skotlex] * Some cleaning around the return to egg code. Pets should stop duplicating now. [Skotlex] * Some cleaning of the egg hatching routine to prevent spawning the pet if diff --git a/src/map/script.c b/src/map/script.c index 70941e7eaa..5a9b08b914 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -8423,28 +8423,53 @@ int buildin_nude(struct script_state *st) int buildin_atcommand(struct script_state *st) { - struct map_session_data *sd; + struct map_session_data *sd=NULL; char *cmd; - sd = script_rid2sd(st); - if (!sd) - return 0; cmd = conv_str(st,& (st->stack->stack_data[st->start+2])); - is_atcommand(sd->fd, sd, cmd, 99); + if (st->rid) + sd = script_rid2sd(st); + + if (sd) is_atcommand(sd->fd, sd, cmd, 99); + else { //Use a dummy character. + struct map_session_data dummy_sd; + struct block_list *bl = NULL; + memset(&dummy_sd, 0, sizeof(struct map_session_data)); + if (st->oid) bl = map_id2bl(st->oid); + if (bl) { + memcpy(&dummy_sd.bl, bl, sizeof(struct block_list)); + if (bl->type == BL_NPC) + strncpy(dummy_sd.status.name, ((TBL_NPC*)bl)->name, NAME_LENGTH); + } + is_atcommand(0, &dummy_sd, cmd, 99); + } return 0; } int buildin_charcommand(struct script_state *st) { - struct map_session_data *sd; + struct map_session_data *sd=NULL; char *cmd; - - sd = script_rid2sd(st); - if (!sd) - return 0; + cmd = conv_str(st,& (st->stack->stack_data[st->start+2])); - is_charcommand(sd->fd, sd, cmd, 99); + + if (st->rid) + sd = script_rid2sd(st); + + if (sd) is_charcommand(sd->fd, sd, cmd, 99); + else { //Use a dummy character. + struct map_session_data dummy_sd; + struct block_list *bl = NULL; + memset(&dummy_sd, 0, sizeof(struct map_session_data)); + if (st->oid) bl = map_id2bl(st->oid); + if (bl) { + memcpy(&dummy_sd.bl, bl, sizeof(struct block_list)); + if (bl->type == BL_NPC) + strncpy(dummy_sd.status.name, ((TBL_NPC*)bl)->name, NAME_LENGTH); + } + is_charcommand(0, &dummy_sd, cmd, 99); + } return 0; }