From 6677af13c59e6b643d561dcb17a45230e3b514fb Mon Sep 17 00:00:00 2001 From: skotlex Date: Fri, 24 Mar 2006 21:02:44 +0000 Subject: - 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) git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@5738 54d463be-8e91-2dee-dedb-b68131a5f0ec --- src/map/script.c | 47 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 11 deletions(-) (limited to 'src/map/script.c') diff --git a/src/map/script.c b/src/map/script.c index 70941e7ea..5a9b08b91 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; } -- cgit v1.2.3-70-g09d2