|
@@ -13,11 +13,13 @@
|
|
|
#include "map.h"
|
|
|
#include "log.h"
|
|
|
#include "clif.h"
|
|
|
+#include "date.h" // days of week enum
|
|
|
#include "intif.h"
|
|
|
#include "pc.h"
|
|
|
#include "pet.h"
|
|
|
#include "instance.h"
|
|
|
#include "chat.h"
|
|
|
+#include "script.h" // script_config
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
#include <errno.h>
|
|
@@ -162,7 +164,7 @@ int npc_ontouch_event(struct map_session_data *sd, struct npc_data *nd)
|
|
|
if( pc_ishiding(sd) )
|
|
|
return 1; // Can't trigger 'OnTouch_'. try 'OnTouch' later.
|
|
|
|
|
|
- snprintf(name, ARRAYLENGTH(name), "%s::%s", nd->exname, script_config.ontouch_name);
|
|
|
+ safesnprintf(name, ARRAYLENGTH(name), "%s::%s", nd->exname, script_config.ontouch_event_name);
|
|
|
return npc_event(sd,name,1);
|
|
|
}
|
|
|
|
|
@@ -173,7 +175,7 @@ int npc_ontouch2_event(struct map_session_data *sd, struct npc_data *nd)
|
|
|
if( sd->areanpc_id == nd->bl.id )
|
|
|
return 0;
|
|
|
|
|
|
- snprintf(name, ARRAYLENGTH(name), "%s::%s", nd->exname, script_config.ontouch2_name);
|
|
|
+ safesnprintf(name, ARRAYLENGTH(name), "%s::%s", nd->exname, script_config.ontouch2_event_name);
|
|
|
return npc_event(sd,name,2);
|
|
|
}
|
|
|
|
|
@@ -434,6 +436,11 @@ int npc_event_doall(const char* name)
|
|
|
return npc_event_doall_id(name, 0);
|
|
|
}
|
|
|
|
|
|
+// runs the specified event(global only) and reports call count
|
|
|
+void npc_event_runall( const char* eventname ){
|
|
|
+ ShowStatus( "Event '"CL_WHITE"%s"CL_RESET"' executed with '"CL_WHITE"%d"CL_RESET"' NPCs.\n", eventname, npc_event_doall( eventname ) );
|
|
|
+}
|
|
|
+
|
|
|
// runs the specified event, with a RID attached (global only)
|
|
|
int npc_event_doall_id(const char* name, int rid)
|
|
|
{
|
|
@@ -460,36 +467,37 @@ int npc_event_do_clock(int tid, unsigned int tick, int id, intptr_t data)
|
|
|
t = localtime(&timer);
|
|
|
|
|
|
if (t->tm_min != ev_tm_b.tm_min ) {
|
|
|
- char* day;
|
|
|
-
|
|
|
- switch (t->tm_wday) {
|
|
|
- case 0: day = "Sun"; break;
|
|
|
- case 1: day = "Mon"; break;
|
|
|
- case 2: day = "Tue"; break;
|
|
|
- case 3: day = "Wed"; break;
|
|
|
- case 4: day = "Thu"; break;
|
|
|
- case 5: day = "Fri"; break;
|
|
|
- case 6: day = "Sat"; break;
|
|
|
- default:day = ""; break;
|
|
|
- }
|
|
|
+ const char* day = NULL;
|
|
|
|
|
|
- sprintf(buf,"OnMinute%02d",t->tm_min);
|
|
|
+ safesnprintf(buf,EVENT_NAME_LENGTH,"%s%02d",script_config.timer_minute_event_name,t->tm_min);
|
|
|
c += npc_event_doall(buf);
|
|
|
|
|
|
- sprintf(buf,"OnClock%02d%02d",t->tm_hour,t->tm_min);
|
|
|
+ safesnprintf(buf,EVENT_NAME_LENGTH,"%s%02d%02d",script_config.timer_clock_event_name,t->tm_hour,t->tm_min);
|
|
|
c += npc_event_doall(buf);
|
|
|
|
|
|
- sprintf(buf,"On%s%02d%02d",day,t->tm_hour,t->tm_min);
|
|
|
- c += npc_event_doall(buf);
|
|
|
+ switch (t->tm_wday) {
|
|
|
+ case SUNDAY: day = script_config.timer_sunday_event_name; break;
|
|
|
+ case MONDAY: day = script_config.timer_monday_event_name; break;
|
|
|
+ case TUESDAY: day = script_config.timer_tuesday_event_name; break;
|
|
|
+ case WEDNESDAY: day = script_config.timer_wednesday_event_name; break;
|
|
|
+ case THURSDAY: day = script_config.timer_thursday_event_name; break;
|
|
|
+ case FRIDAY: day = script_config.timer_friday_event_name; break;
|
|
|
+ case SATURDAY: day = script_config.timer_saturday_event_name; break;
|
|
|
+ }
|
|
|
+
|
|
|
+ if( day != NULL ){
|
|
|
+ safesnprintf(buf,EVENT_NAME_LENGTH,"%s%02d%02d",day,t->tm_hour,t->tm_min);
|
|
|
+ c += npc_event_doall(buf);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
if (t->tm_hour != ev_tm_b.tm_hour) {
|
|
|
- sprintf(buf,"OnHour%02d",t->tm_hour);
|
|
|
+ safesnprintf(buf,EVENT_NAME_LENGTH,"%s%02d",script_config.timer_hour_event_name,t->tm_hour);
|
|
|
c += npc_event_doall(buf);
|
|
|
}
|
|
|
|
|
|
if (t->tm_mday != ev_tm_b.tm_mday) {
|
|
|
- sprintf(buf,"OnDay%02d%02d",t->tm_mon+1,t->tm_mday);
|
|
|
+ safesnprintf(buf,EVENT_NAME_LENGTH,"%s%02d%02d",script_config.timer_day_event_name,t->tm_mon+1,t->tm_mday);
|
|
|
c += npc_event_doall(buf);
|
|
|
}
|
|
|
|
|
@@ -502,7 +510,7 @@ int npc_event_do_clock(int tid, unsigned int tick, int id, intptr_t data)
|
|
|
*------------------------------------------*/
|
|
|
void npc_event_do_oninit(void)
|
|
|
{
|
|
|
- ShowStatus("Event '"CL_WHITE"OnInit"CL_RESET"' executed with '"CL_WHITE"%d"CL_RESET"' NPCs."CL_CLL"\n", npc_event_doall("OnInit"));
|
|
|
+ npc_event_runall(script_config.init_event_name);
|
|
|
|
|
|
add_timer_interval(gettick()+100,npc_event_do_clock,0,0,1000);
|
|
|
}
|
|
@@ -516,7 +524,10 @@ int npc_timerevent_export(struct npc_data *nd, int i)
|
|
|
int t = 0, k = 0;
|
|
|
char *lname = nd->u.scr.label_list[i].name;
|
|
|
int pos = nd->u.scr.label_list[i].pos;
|
|
|
- if (sscanf(lname, "OnTimer%11d%n", &t, &k) == 1 && lname[k] == '\0') {
|
|
|
+ size_t len = strlen(script_config.timer_event_name);
|
|
|
+
|
|
|
+ // Check if the label name starts with OnTimer(default) and then parse the seconds right after it
|
|
|
+ if ( !strncmp(lname,script_config.timer_event_name,len) && sscanf( (lname += len), "%11d%n", &t, &k) == 1 && lname[k] == '\0') {
|
|
|
// Timer event
|
|
|
struct npc_timerevent_list *te = nd->u.scr.timer_event;
|
|
|
int j, k2 = nd->u.scr.timeramount;
|
|
@@ -928,7 +939,7 @@ int npc_touchnext_areanpc(struct map_session_data* sd, bool leavemap)
|
|
|
char name[EVENT_NAME_LENGTH];
|
|
|
|
|
|
nd->touching_id = sd->touching_id = 0;
|
|
|
- snprintf(name, ARRAYLENGTH(name), "%s::%s", nd->exname, script_config.ontouch_name);
|
|
|
+ safesnprintf(name, ARRAYLENGTH(name), "%s::%s", nd->exname, script_config.ontouch_event_name);
|
|
|
map_forcountinarea(npc_touch_areanpc_sub,nd->bl.m,nd->bl.x - xs,nd->bl.y - ys,nd->bl.x + xs,nd->bl.y + ys,1,BL_PC,sd->bl.id,name);
|
|
|
}
|
|
|
return 0;
|
|
@@ -1072,7 +1083,7 @@ int npc_touch_areanpc2(struct mob_data *md)
|
|
|
case NPCTYPE_SCRIPT:
|
|
|
if( map[m].npc[i]->bl.id == md->areanpc_id )
|
|
|
break; // Already touch this NPC
|
|
|
- snprintf(eventname, ARRAYLENGTH(eventname), "%s::OnTouchNPC", map[m].npc[i]->exname);
|
|
|
+ safesnprintf(eventname, ARRAYLENGTH(eventname), "%s::%s", map[m].npc[i]->exname, script_config.ontouchnpc_event_name);
|
|
|
if( (ev = (struct event_data*)strdb_get(ev_db, eventname)) == NULL || ev->nd == NULL )
|
|
|
break; // No OnTouchNPC Event
|
|
|
md->areanpc_id = map[m].npc[i]->bl.id;
|
|
@@ -3256,7 +3267,20 @@ int npc_instanceinit(struct npc_data* nd)
|
|
|
struct event_data *ev;
|
|
|
char evname[EVENT_NAME_LENGTH];
|
|
|
|
|
|
- snprintf(evname, ARRAYLENGTH(evname), "%s::OnInstanceInit", nd->exname);
|
|
|
+ snprintf(evname, ARRAYLENGTH(evname), "%s::%s", nd->exname, script_config.instance_init_event_name);
|
|
|
+
|
|
|
+ if( ( ev = (struct event_data*)strdb_get(ev_db, evname) ) )
|
|
|
+ run_script(nd->u.scr.script,ev->pos,0,nd->bl.id);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+int npc_instancedestroy(struct npc_data* nd)
|
|
|
+{
|
|
|
+ struct event_data *ev;
|
|
|
+ char evname[EVENT_NAME_LENGTH];
|
|
|
+
|
|
|
+ snprintf(evname, ARRAYLENGTH(evname), "%s::%s", nd->exname, script_config.instance_destroy_event_name);
|
|
|
|
|
|
if( ( ev = (struct event_data*)strdb_get(ev_db, evname) ) )
|
|
|
run_script(nd->u.scr.script,ev->pos,0,nd->bl.id);
|
|
@@ -4538,18 +4562,18 @@ int npc_reload(void) {
|
|
|
npc_read_event_script();
|
|
|
|
|
|
/* refresh guild castle flags on both woe setups */
|
|
|
- npc_event_doall("OnAgitInit");
|
|
|
- npc_event_doall("OnAgitInit2");
|
|
|
- npc_event_doall("OnAgitInit3");
|
|
|
+ npc_event_doall( script_config.agit_init_event_name );
|
|
|
+ npc_event_doall( script_config.agit_init2_event_name );
|
|
|
+ npc_event_doall( script_config.agit_init3_event_name );
|
|
|
|
|
|
//Execute the OnInit event for freshly loaded npcs. [Skotlex]
|
|
|
- ShowStatus("Event '"CL_WHITE"OnInit"CL_RESET"' executed with '"CL_WHITE"%d"CL_RESET"' NPCs.\n",npc_event_doall("OnInit"));
|
|
|
+ npc_event_runall(script_config.init_event_name);
|
|
|
|
|
|
do_reload_instance();
|
|
|
|
|
|
// Execute rest of the startup events if connected to char-server. [Lance]
|
|
|
if(!CheckForCharServer()){
|
|
|
- ShowStatus("Event '"CL_WHITE"OnInterIfInit"CL_RESET"' executed with '"CL_WHITE"%d"CL_RESET"' NPCs.\n", npc_event_doall("OnInterIfInit"));
|
|
|
+ npc_event_runall(script_config.inter_init_event_name);
|
|
|
}
|
|
|
|
|
|
#if PACKETVER >= 20131223
|