summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog-Trunk.txt10
-rw-r--r--conf/script_athena.conf36
-rw-r--r--doc/script_commands.txt26
-rw-r--r--src/map/clif.c5
-rw-r--r--src/map/map.c3
-rw-r--r--src/map/map.h11
-rw-r--r--src/map/mob.c2
-rw-r--r--src/map/npc.c52
-rw-r--r--src/map/npc.h4
-rw-r--r--src/map/pc.c56
-rw-r--r--src/map/script.c77
-rw-r--r--src/map/script.h18
12 files changed, 78 insertions, 222 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt
index 143cf80f1..355fa5695 100644
--- a/Changelog-Trunk.txt
+++ b/Changelog-Trunk.txt
@@ -3,6 +3,16 @@ Date Added
AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK.
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
+2007/12/06
+ * The default event script behaviour is to trigger on labels rather than
+ NPCs now.
+ * Removed several script config options which break NPC compatibility when
+ you mess with them (event_script_type, event_requires_trigger,
+ die_event_name, kill_pc_event_name, kill_mob_event_name, logout_event_name,
+ login_event_name, loadmap_event_name, baselvup_event_name,
+ joblvup_event_name)
+ * LoadMap events no longer set the variable "@maploaded$" to the name of
+ the new map. [Skotlex]
2007/12/03
* Fixed a bug on Mail System. Removed the possibility to lost the attachment on
a Map - Char server disconnection. [Zephyrus]
diff --git a/conf/script_athena.conf b/conf/script_athena.conf
index 40d2237a3..726786f00 100644
--- a/conf/script_athena.conf
+++ b/conf/script_athena.conf
@@ -21,40 +21,4 @@ check_cmdcount: 655360
check_gotocount: 2048
-
-//---- Custom script functions ----
-
-// 0 - Event script is defined as an NPC by itself
-// 1 - Event script can be called by script label
-event_script_type: 0
-
-// For events to be activated do we require
-// a 'set [EventName],1;' to be called first?
-event_requires_trigger: no
-
-// Name of event when a player has died
-die_event_name: OnPCDieEvent
-
-// Name of event when a player kills a player
-kill_pc_event_name: OnPCKillEvent
-
-// Name of event when a player kills a monster
-kill_mob_event_name: OnNPCKillEvent
-
-// Name of event when a player logs out
-logout_event_name: OnPCLogoutEvent
-
-// Name of event when a player logs in
-login_event_name: OnPCLoginEvent
-
-// Name of event when a player changes map
-// NOTE: This event will only trigger on maps with the "loadevent" flag active.
-loadmap_event_name: OnPCLoadMapEvent
-
-// Name of event when a player levels up (base lv)
-baselvup_event_name: OnPCBaseLvUpEvent
-
-// Name of event when a player levels up (job lv)
-joblvup_event_name: OnPCJobLvUpEvent
-
import: conf/import/script_conf.txt
diff --git a/doc/script_commands.txt b/doc/script_commands.txt
index 35b1958f5..40c8e9224 100644
--- a/doc/script_commands.txt
+++ b/doc/script_commands.txt
@@ -868,16 +868,28 @@ This label will be executed if a trigger area is defined for the NPC object it's
in. If it isn't present, the execution will start from the beginning of the NPC
code. The RID of the triggering character object will be attached.
+OnPCLoginEvent:
+OnPCLogoutEvent:
+OnPCBaseLvUpEvent:
+OnPCJobLvUpEvent:
+
+It's pretty obvious when these four special labels will be invoked. For more
+information, see 'npc/sample/PCLoginEvent.txt'
+
OnPCDieEvent:
+
+This special label triggers when a player dies. The variable 'killerrid' is
+set to the ID of the killer.
+
OnPCKillEvent:
-OnPCLogoutEvent:
-OnPCLoginEvent:
-These four special labels will be invoked if you have set 'event_script_type'
-value in your 'script_athena.conf' to 1, and you can change their names by
-altering the configuration options in 'script_athena.conf'. It's pretty obvious
-when those will get triggered. For more information, see
-'npc/sample/PCLoginEvent.txt'
+This special label triggers when a player kills another player. The variable
+'killedrid' is set to the ID of the player killed.
+
+OnNPCKillEvent:
+
+This special label triggers when a player kills a monster. The variable
+'killedrid' is set to the Class of the monster killed.
OnPCLoadMapEvent:
diff --git a/src/map/clif.c b/src/map/clif.c
index 54b696db3..9ebf50600 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -7913,11 +7913,8 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
npc_event_dequeue(sd);
}
- // Lance
- if(sd->state.event_loadmap && map[sd->bl.m].flag.loadevent){
- pc_setregstr(sd, add_str("@maploaded$"), map[sd->bl.m].name);
+ if(map[sd->bl.m].flag.loadevent) // Lance
npc_script_event(sd, NPCE_LOADMAP);
- }
if (pc_checkskill(sd, SG_DEVIL) && !pc_nextjobexp(sd))
clif_status_load(&sd->bl, SI_DEVIL, 1); //blindness [Komurka]
diff --git a/src/map/map.c b/src/map/map.c
index d113e8a6d..7a8520061 100644
--- a/src/map/map.c
+++ b/src/map/map.c
@@ -1683,9 +1683,8 @@ int map_quit(struct map_session_data *sd)
if(!sd->state.waitingdisconnect) {
if (sd->npc_timer_id != -1) //Cancel the event timer.
npc_timerevent_quit(sd);
- if (sd->state.event_disconnect)
- npc_script_event(sd, NPCE_LOGOUT);
+ npc_script_event(sd, NPCE_LOGOUT);
sd->state.waitingdisconnect = 1;
if (sd->pd) unit_free(&sd->pd->bl,0);
if (sd->hd) unit_free(&sd->hd->bl,0);
diff --git a/src/map/map.h b/src/map/map.h
index 2608cee05..7a3e6ae02 100644
--- a/src/map/map.h
+++ b/src/map/map.h
@@ -531,16 +531,7 @@ struct map_session_data {
unsigned storage_flag : 2; //0: closed, 1: Normal Storage open, 2: guild storage open [Skotlex]
unsigned snovice_call_flag : 2; //Summon Angel (stage 1~3)
unsigned snovice_dead_flag : 2; //Explosion spirits on death: 0 off, 1 active, 2 used.
- // originally by Qamera, adapted by celest
- unsigned event_death : 1;
- unsigned event_kill_pc : 1;
- unsigned event_disconnect : 1;
- unsigned event_kill_mob : 1;
- unsigned event_baselvup : 1;
- unsigned event_joblvup : 1;
- unsigned event_loadmap : 1;
- // Abracadabra bugfix by Aru
- unsigned abra_flag : 1;
+ unsigned abra_flag : 1; // Abracadabra bugfix by Aru
unsigned autotrade : 1; //By Fantik
unsigned reg_dirty : 3; //By Skotlex (marks whether registry variables have been saved or not yet)
unsigned showdelay :1;
diff --git a/src/map/mob.c b/src/map/mob.c
index 7f4aa8ee1..2d0eb04b9 100644
--- a/src/map/mob.c
+++ b/src/map/mob.c
@@ -2218,7 +2218,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
npc_event(mvp_sd,md->npc_event,0);
}
md->status.hp = 1;
- } else if (mvp_sd && mvp_sd->state.event_kill_mob) { //lordalfa
+ } else if (mvp_sd) { //lordalfa
pc_setglobalreg(mvp_sd,"killedrid",md->class_);
npc_script_event(mvp_sd, NPCE_KILLNPC); // PCKillNPC [Lance]
}
diff --git a/src/map/npc.c b/src/map/npc.c
index 7b44c4afa..26ce12757 100644
--- a/src/map/npc.c
+++ b/src/map/npc.c
@@ -67,7 +67,6 @@ static struct view_data npc_viewdb[MAX_NPC_CLASS];
static struct script_event_s
{ //Holds pointers to the commonly executed scripts for speedup. [Skotlex]
- struct npc_data *nd;
struct event_data *event[UCHAR_MAX];
const char *event_name[UCHAR_MAX];
uint8 event_count;
@@ -2688,26 +2687,18 @@ void npc_parsesrcfile(const char* filepath)
return;
}
-int npc_script_event(struct map_session_data* sd, int type)
+int npc_script_event(struct map_session_data* sd, enum npce_event type)
{
int i;
- if (type < 0 || type >= NPCE_MAX)
+ if (type == NPCE_MAX)
return 0;
if (!sd) {
ShowError("npc_script_event: NULL sd. Event Type %d\n", type);
return 0;
}
- if (script_event[type].nd) {
- TBL_NPC *nd = script_event[type].nd;
- run_script(nd->u.scr.script,0,sd->bl.id,nd->bl.id);
- return 1;
- } else if (script_event[type].event_count) {
- for (i = 0; i<script_event[type].event_count; i++) {
- npc_event_sub(sd,script_event[type].event[i],script_event[type].event_name[i]);
- }
- return i;
- }
- return 0;
+ for (i = 0; i<script_event[type].event_count; i++)
+ npc_event_sub(sd,script_event[type].event[i],script_event[type].event_name[i]);
+ return i;
}
static int npc_read_event_script_sub(DBKey key, void* data, va_list ap)
@@ -2735,7 +2726,7 @@ void npc_read_event_script(void)
int i;
struct {
char *name;
- char *event_name;
+ const char *event_name;
} config[] = {
{"Login Event",script_config.login_event_name},
{"Logout Event",script_config.logout_event_name},
@@ -2748,32 +2739,19 @@ void npc_read_event_script(void)
};
for (i = 0; i < NPCE_MAX; i++) {
- script_event[i].nd = NULL;
+ char buf[64]="::";
script_event[i].event_count = 0;
- if (!script_config.event_script_type) {
- //Use a single NPC as event source.
- script_event[i].nd = npc_name2id(config[i].event_name);
- } else {
- //Use an array of Events
- char buf[64]="::";
- strncpy(buf+2,config[i].event_name,62);
- ev_db->foreach(ev_db,npc_read_event_script_sub,buf,
- &script_event[i].event,
- &script_event[i].event_name,
- &script_event[i].event_count);
- }
+ //Use an array of Events
+ strncpy(buf+2,config[i].event_name,62);
+ ev_db->foreach(ev_db,npc_read_event_script_sub,buf,
+ &script_event[i].event,
+ &script_event[i].event_name,
+ &script_event[i].event_count);
}
if (battle_config.etc_log) {
//Print summary.
- for (i = 0; i < NPCE_MAX; i++) {
- if(!script_config.event_script_type) {
- if (script_event[i].nd)
- ShowInfo("%s: Using NPC named '%s'.\n", config[i].name, config[i].event_name);
- else
- ShowInfo("%s: No NPC found with name '%s'.\n", config[i].name, config[i].event_name);
- } else
- ShowInfo("%s: %d '%s' events.\n", config[i].name, script_event[i].event_count, config[i].event_name);
- }
+ for (i = 0; i < NPCE_MAX; i++)
+ ShowInfo("%s: %d '%s' events.\n", config[i].name, script_event[i].event_count, config[i].event_name);
}
}
diff --git a/src/map/npc.h b/src/map/npc.h
index 2d203fdb5..6580e4f21 100644
--- a/src/map/npc.h
+++ b/src/map/npc.h
@@ -27,7 +27,7 @@ int mob_chat_sub(struct block_list* bl, va_list ap);
#endif
//Script NPC events.
-enum {
+enum npce_event {
NPCE_LOGIN,
NPCE_LOGOUT,
NPCE_LOADMAP,
@@ -88,7 +88,7 @@ void npc_unload_duplicates (struct npc_data* nd);
int npc_unload(struct npc_data* nd);
int npc_reload(void);
void npc_read_event_script(void);
-int npc_script_event(struct map_session_data* sd, int type);
+int npc_script_event(struct map_session_data* sd, enum npce_event type);
extern struct npc_data* fake_nd;
diff --git a/src/map/pc.c b/src/map/pc.c
index 368f355f0..7d8a44e2e 100644
--- a/src/map/pc.c
+++ b/src/map/pc.c
@@ -727,11 +727,6 @@ int pc_authok(struct map_session_data *sd, int login_id2, time_t connect_until_t
//Prevent S. Novices from getting the no-death bonus just yet. [Skotlex]
sd->die_counter=-1;
- //Until the reg values arrive, set them to not require trigger...
- sd->state.event_death = 1;
- sd->state.event_kill_pc = 1;
- sd->state.event_disconnect = 1;
- sd->state.event_kill_mob = 1;
{ //Add IP field
uint32 ip = session[sd->fd]->client_addr;
@@ -867,25 +862,6 @@ int pc_reg_received(struct map_session_data *sd)
}
}
- // Automated script events
- if (script_config.event_requires_trigger) {
- sd->state.event_death = pc_readglobalreg(sd, script_config.die_event_name);
- sd->state.event_kill_pc = pc_readglobalreg(sd, script_config.kill_pc_event_name);
- sd->state.event_kill_mob = pc_readglobalreg(sd, script_config.kill_mob_event_name);
- sd->state.event_disconnect = pc_readglobalreg(sd, script_config.logout_event_name);
- sd->state.event_baselvup = pc_readglobalreg(sd, script_config.baselvup_event_name);
- sd->state.event_joblvup = pc_readglobalreg(sd, script_config.joblvup_event_name);
- sd->state.event_loadmap = pc_readglobalreg(sd, script_config.loadmap_event_name);
- // if script triggers are not required
- } else {
- sd->state.event_death = 1;
- sd->state.event_kill_pc = 1;
- sd->state.event_disconnect = 1;
- sd->state.event_kill_mob = 1;
- sd->state.event_baselvup = 1;
- sd->state.event_joblvup = 1;
- sd->state.event_loadmap = 1;
- }
//Weird... maybe registries were reloaded?
if (sd->state.auth)
return 0;
@@ -4150,9 +4126,7 @@ int pc_checkbaselevelup(struct map_session_data *sd)
sc_start(&sd->bl,SkillStatusChangeTable(AL_BLESSING),100,10,600000);
}
clif_misceffect(&sd->bl,0);
- //LORDALFA - LVLUPEVENT
- if(sd->state.event_baselvup)
- npc_script_event(sd, NPCE_BASELVUP);
+ npc_script_event(sd, NPCE_BASELVUP); //LORDALFA - LVLUPEVENT
if(sd->status.party_id)
party_send_levelup(sd);
@@ -4186,8 +4160,7 @@ int pc_checkjoblevelup(struct map_session_data *sd)
if (pc_checkskill(sd, SG_DEVIL) && !pc_nextjobexp(sd))
clif_status_change(&sd->bl,SI_DEVIL, 1); //Permanent blind effect from SG_DEVIL.
- if(sd->state.event_joblvup)
- npc_script_event(sd, NPCE_JOBLVUP);
+ npc_script_event(sd, NPCE_JOBLVUP);
return 1;
}
@@ -4973,14 +4946,8 @@ int pc_dead(struct map_session_data *sd,struct block_list *src)
sd->hp_loss.tick = sd->sp_loss.tick = sd->hp_regen.tick = sd->sp_regen.tick = 0;
pc_setglobalreg(sd,"PC_DIE_COUNTER",++sd->die_counter);
-
- if (sd->state.event_death){
- if(!src)
- pc_setglobalreg(sd, "killerrid", 0);
- else
- pc_setglobalreg(sd,"killerrid",src->id);
- npc_script_event(sd,NPCE_DIE);
- }
+ pc_setglobalreg(sd,"killerrid",src?src->id:0);
+ npc_script_event(sd,NPCE_DIE);
if ( sd && sd->spiritball && (sd->class_&MAPID_BASEMASK)==MAPID_GUNSLINGER ) // maybe also monks' spiritballs ?
pc_delspiritball(sd,sd->spiritball,0);
@@ -5008,10 +4975,9 @@ int pc_dead(struct map_session_data *sd,struct block_list *src)
case BL_PC:
{
struct map_session_data *ssd = (struct map_session_data *)src;
- if (ssd->state.event_kill_pc) {
- pc_setglobalreg(ssd, "killedrid", sd->bl.id);
- npc_script_event(ssd, NPCE_KILLPC);
- }
+ pc_setglobalreg(ssd, "killedrid", sd->bl.id);
+ npc_script_event(ssd, NPCE_KILLPC);
+
if (battle_config.pk_mode&2) {
ssd->status.manner -= 5;
if(ssd->status.manner < 0)
@@ -6082,14 +6048,6 @@ int pc_setregistry(struct map_session_data *sd,const char *reg,int val,int type)
i = (!sd->die_counter && (sd->class_&MAPID_UPPERMASK) == MAPID_SUPER_NOVICE);
sd->die_counter = val;
if (i) status_calc_pc(sd,0); //Lost the bonus.
- } else if(strcmp(reg,script_config.die_event_name) == 0){
- sd->state.event_death = val;
- } else if(strcmp(reg,script_config.kill_pc_event_name) == 0){
- sd->state.event_kill_pc = val;
- } else if(strcmp(reg,script_config.kill_mob_event_name) == 0){
- sd->state.event_kill_mob = val;
- } else if(strcmp(reg,script_config.logout_event_name) == 0){
- sd->state.event_disconnect = val;
}
}
switch (type) {
diff --git a/src/map/script.c b/src/map/script.c
index bf8b3ea93..8a479bac6 100644
--- a/src/map/script.c
+++ b/src/map/script.c
@@ -182,7 +182,17 @@ static int parse_options=0;
DBMap* script_get_label_db(){ return scriptlabel_db; }
DBMap* script_get_userfunc_db(){ return userfunc_db; }
-struct Script_Config script_config;
+struct Script_Config script_config = {
+ 1, 65535, 2048, //warn_func_mismatch_paramnum/check_cmdcount/check_gotocount
+ "OnPCDieEvent", //die_event_name
+ "OnPCKillEvent", //kill_pc_event_name
+ "OnNPCKillEvent", //kill_mob_event_name
+ "OnPCLoginEvent", //login_event_name
+ "OnPCLogoutEvent", //logout_event_name
+ "OnPCLoadMapEvent", //loadmap_event_name
+ "OnPCBaseLvUpEvent", //baselvup_event_name
+ "OnPCJobLvUpEvent" //joblvup_event_name
+};
static jmp_buf error_jump;
static char* error_msg;
@@ -3449,7 +3459,7 @@ static int script_autosave_mapreg(int tid,unsigned int tick,int id,int data)
return 0;
}
-int script_config_read_sub(char *cfgName)
+int script_config_read(char *cfgName)
{
int i;
char line[1024],w1[1024],w2[1024];
@@ -3478,54 +3488,8 @@ int script_config_read_sub(char *cfgName)
else if(strcmpi(w1,"check_gotocount")==0) {
script_config.check_gotocount = config_switch(w2);
}
- else if(strcmpi(w1,"event_script_type")==0) {
- script_config.event_script_type = config_switch(w2);
- }
- else if(strcmpi(w1,"event_requires_trigger")==0) {
- script_config.event_requires_trigger = config_switch(w2);
- }
- else if(strcmpi(w1,"die_event_name")==0) {
- strncpy(script_config.die_event_name, w2, NAME_LENGTH-1);
- if (strlen(script_config.die_event_name) != strlen(w2))
- ShowWarning("script_config_read: Event label truncated (max length is 23 chars): %d\n", script_config.die_event_name);
- }
- else if(strcmpi(w1,"kill_pc_event_name")==0) {
- strncpy(script_config.kill_pc_event_name, w2, NAME_LENGTH-1);
- if (strlen(script_config.kill_pc_event_name) != strlen(w2))
- ShowWarning("script_config_read: Event label truncated (max length is 23 chars): %d\n", script_config.kill_pc_event_name);
- }
- else if(strcmpi(w1,"kill_mob_event_name")==0) {
- strncpy(script_config.kill_mob_event_name, w2, NAME_LENGTH-1);
- if (strlen(script_config.kill_mob_event_name) != strlen(w2))
- ShowWarning("script_config_read: Event label truncated (max length is 23 chars): %d\n", script_config.kill_mob_event_name);
- }
- else if(strcmpi(w1,"login_event_name")==0) {
- strncpy(script_config.login_event_name, w2, NAME_LENGTH-1);
- if (strlen(script_config.login_event_name) != strlen(w2))
- ShowWarning("script_config_read: Event label truncated (max length is 23 chars): %d\n", script_config.login_event_name);
- }
- else if(strcmpi(w1,"logout_event_name")==0) {
- strncpy(script_config.logout_event_name, w2, NAME_LENGTH-1);
- if (strlen(script_config.logout_event_name) != strlen(w2))
- ShowWarning("script_config_read: Event label truncated (max length is 23 chars): %d\n", script_config.logout_event_name);
- }
- else if(strcmpi(w1,"loadmap_event_name")==0) {
- strncpy(script_config.loadmap_event_name, w2, NAME_LENGTH-1);
- if (strlen(script_config.loadmap_event_name) != strlen(w2))
- ShowWarning("script_config_read: Event label truncated (max length is 23 chars): %d\n", script_config.loadmap_event_name);
- }
- else if(strcmpi(w1,"baselvup_event_name")==0) {
- strncpy(script_config.baselvup_event_name, w2, NAME_LENGTH-1);
- if (strlen(script_config.baselvup_event_name) != strlen(w2))
- ShowWarning("script_config_read: Event label truncated (max length is 23 chars): %d\n", script_config.baselvup_event_name);
- }
- else if(strcmpi(w1,"joblvup_event_name")==0) {
- strncpy(script_config.joblvup_event_name, w2, NAME_LENGTH-1);
- if (strlen(script_config.joblvup_event_name) != strlen(w2))
- ShowWarning("script_config_read: Event label truncated (max length is 23 chars): %d\n", script_config.joblvup_event_name);
- }
else if(strcmpi(w1,"import")==0){
- script_config_read_sub(w2);
+ script_config_read(w2);
}
}
fclose(fp);
@@ -3533,21 +3497,6 @@ int script_config_read_sub(char *cfgName)
return 0;
}
-int script_config_read(char *cfgName)
-{ //Script related variables should be initialized once! [Skotlex]
-
- memset (&script_config, 0, sizeof(script_config));
- script_config.warn_func_mismatch_paramnum = 1;
- script_config.check_cmdcount = 65535;
- script_config.check_gotocount = 2048;
-
- script_config.event_script_type = 0;
- script_config.event_requires_trigger = 1;
-
- return script_config_read_sub(cfgName);
-}
-
-
static int do_final_userfunc_sub (DBKey key,void *data,va_list ap)
{
struct script_code *code = (struct script_code *)data;
diff --git a/src/map/script.h b/src/map/script.h
index 2769a3163..e879854f4 100644
--- a/src/map/script.h
+++ b/src/map/script.h
@@ -13,16 +13,14 @@ extern struct Script_Config {
int check_cmdcount;
int check_gotocount;
- unsigned event_script_type : 1;
- unsigned event_requires_trigger : 1;
- char die_event_name[NAME_LENGTH];
- char kill_pc_event_name[NAME_LENGTH];
- char kill_mob_event_name[NAME_LENGTH];
- char login_event_name[NAME_LENGTH];
- char logout_event_name[NAME_LENGTH];
- char loadmap_event_name[NAME_LENGTH];
- char baselvup_event_name[NAME_LENGTH];
- char joblvup_event_name[NAME_LENGTH];
+ const char *die_event_name;
+ const char *kill_pc_event_name;
+ const char *kill_mob_event_name;
+ const char *login_event_name;
+ const char *logout_event_name;
+ const char *loadmap_event_name;
+ const char *baselvup_event_name;
+ const char *joblvup_event_name;
} script_config;
enum c_op {