/**
* Full Commands bindatcmd && unbindatcmd && useatcmd for Scripts
* Diff by Envolvents (Wellington Ferraz)
* Date: 16/12/2013 21:50
* @commands (script based)
**/
BUILDIN(bindatcmd) {
const char* atcmd;
const char* eventName;
int i, group_lv = 0, group_lv_char = 99;
bool log = false;
bool create = false;
atcmd = script_getstr(st,2);
eventName = script_getstr(st,3);
if( *atcmd == atcommand->at_symbol || *atcmd == atcommand->char_symbol )
atcmd++;
if( script_hasdata(st,4) ) group_lv = script_getnum(st,4);
if( script_hasdata(st,5) ) group_lv_char = script_getnum(st,5);
if( script_hasdata(st,6) ) log = script_getnum(st,6) ? true : false;
if( atcommand->binding_count == 0 ) {
CREATE(atcommand->binding,struct atcmd_binding_data*,1);
create = true;
} else {
ARR_FIND(0, atcommand->binding_count, i, strcmp(atcommand->binding[i]->command,atcmd) == 0);
if( i < atcommand->binding_count ) {/* update existent entry */
safestrncpy(atcommand->binding[i]->npc_event, eventName, ATCOMMAND_LENGTH);
atcommand->binding[i]->group_lv = group_lv;
atcommand->binding[i]->group_lv_char = group_lv_char;
atcommand->binding[i]->log = log;
} else
create = true;
}
if( create ) {
i = atcommand->binding_count;
if( atcommand->binding_count++ != 0 )
RECREATE(atcommand->binding,struct atcmd_binding_data*,atcommand->binding_count);
CREATE(atcommand->binding[i],struct atcmd_binding_data,1);
safestrncpy(atcommand->binding[i]->command, atcmd, 50);
safestrncpy(atcommand->binding[i]->npc_event, eventName, 50);
atcommand->binding[i]->group_lv = group_lv;
atcommand->binding[i]->group_lv_char = group_lv_char;
atcommand->binding[i]->log = log;
}
return true;
}
BUILDIN(unbindatcmd) {
const char* atcmd;
int i = 0;
atcmd = script_getstr(st, 2);
if( *atcmd == atcommand->at_symbol || *atcmd == atcommand->char_symbol )
atcmd++;
if( atcommand->binding_count == 0 ) {
script_pushint(st, 0);
return true;
}
ARR_FIND(0, atcommand->binding_count, i, strcmp(atcommand->binding[i]->command, atcmd) == 0);
if( i < atcommand->binding_count ) {
int cursor = 0;
aFree(atcommand->binding[i]);
atcommand->binding[i] = NULL;
/* compact the list now that we freed a slot somewhere */
for( i = 0, cursor = 0; i < atcommand->binding_count; i++ ) {
if( atcommand->binding[i] == NULL )
continue;
if( cursor != i ) {
memmove(&atcommand->binding[cursor], &atcommand->binding[i], sizeof(struct atcmd_binding_data*));
}
cursor++;
}
if( (atcommand->binding_count = cursor) == 0 )
aFree(atcommand->binding);
script_pushint(st, 1);
} else
script_pushint(st, 0);/* not found */
return true;
}
BUILDIN(useatcmd) {
TBL_PC *sd, *dummy_sd = NULL;
int fd;
const char* cmd;
cmd = script_getstr(st,2);
if( st->rid ) {
sd = script->rid2sd(st);
fd = sd->fd;
} else {
// Use a dummy character.
sd = dummy_sd = pc->get_dummy_sd();
fd = 0;
if( st->oid ) {
struct block_list* bl = map->id2bl(st->oid);
memcpy(&sd->bl, bl, sizeof(struct block_list));
if( bl->type == BL_NPC )
safestrncpy(sd->status.name, ((TBL_NPC*)bl)->name, NAME_LENGTH);
}
}
// compatibility with previous implementation (deprecated!)
if( cmd[0] != atcommand->at_symbol ) {
cmd += strlen(sd->status.name);
while( *cmd != atcommand->at_symbol && *cmd != 0 )
cmd++;
}
atcommand->parse(fd, sd, cmd, 1);
if (dummy_sd) aFree(dummy_sd);
return true;
}