Explorar o código

- 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.
- Optimized/simplified the code now that the previous config options were removed.


git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@11859 54d463be-8e91-2dee-dedb-b68131a5f0ec

skotlex %!s(int64=17) %!d(string=hai) anos
pai
achega
fc7b4eaef0
Modificáronse 12 ficheiros con 78 adicións e 222 borrados
  1. 10 0
      Changelog-Trunk.txt
  2. 0 36
      conf/script_athena.conf
  3. 19 7
      doc/script_commands.txt
  4. 1 4
      src/map/clif.c
  5. 1 2
      src/map/map.c
  6. 1 10
      src/map/map.h
  7. 1 1
      src/map/mob.c
  8. 15 37
      src/map/npc.c
  9. 2 2
      src/map/npc.h
  10. 7 49
      src/map/pc.c
  11. 13 64
      src/map/script.c
  12. 8 10
      src/map/script.h

+ 10 - 0
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]

+ 0 - 36
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

+ 19 - 7
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:
 

+ 1 - 4
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]

+ 1 - 2
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);

+ 1 - 10
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;

+ 1 - 1
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]
 	}

+ 15 - 37
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);
 	}
 }
 

+ 2 - 2
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;
 

+ 7 - 49
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) {

+ 13 - 64
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;

+ 8 - 10
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 {