summaryrefslogtreecommitdiff
path: root/src/map/script.c
diff options
context:
space:
mode:
authorzephyrus <zephyrus@54d463be-8e91-2dee-dedb-b68131a5f0ec>2009-08-12 21:44:02 +0000
committerzephyrus <zephyrus@54d463be-8e91-2dee-dedb-b68131a5f0ec>2009-08-12 21:44:02 +0000
commit09e154b0687a2ba69d5ce6f2456c61db86bc4dec (patch)
tree6be18bd056964352e036afef8c36c860c0ff52af /src/map/script.c
parent653c88c4f1bf019f61132324fd7146ae2f858cec (diff)
downloadhercules-09e154b0687a2ba69d5ce6f2456c61db86bc4dec.tar.gz
hercules-09e154b0687a2ba69d5ce6f2456c61db86bc4dec.tar.bz2
hercules-09e154b0687a2ba69d5ce6f2456c61db86bc4dec.tar.xz
hercules-09e154b0687a2ba69d5ce6f2456c61db86bc4dec.zip
- Optimization to instance system.
* Removed the crc feature to generate instance npc names. The instance npc name will be "dup_" + instanceid + "_" + srcnpcid. * Removed the big array under map structure and coded in a different way. It was only used to generate map names, but i just used the instance_id + "origin map name". * Moved all instance features to separated files. * Moved the npc duplication for instances into npc.c as Ultramage says (removed npcname_db from npc.h). * Added recomendations for scripts commands by Saithis. - Testing required, i will prepare Endless Tower script soon. I hope this do almost anything in bugreport 3276. git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@14003 54d463be-8e91-2dee-dedb-b68131a5f0ec
Diffstat (limited to 'src/map/script.c')
-rw-r--r--src/map/script.c266
1 files changed, 132 insertions, 134 deletions
diff --git a/src/map/script.c b/src/map/script.c
index 3a74c5d00..ac4c34860 100644
--- a/src/map/script.c
+++ b/src/map/script.c
@@ -30,6 +30,7 @@
#include "pet.h"
#include "mapreg.h"
#include "homunculus.h"
+#include "instance.h"
#include "mercenary.h"
#include "intif.h"
#include "skill.h"
@@ -71,10 +72,6 @@
// - remove GETVALUE / SETVALUE
// - clean up the set_reg / set_val / setd_sub mess
-void crc32_init();
-
-
-
//
// struct script_state* st;
//
@@ -3447,7 +3444,6 @@ int do_final_script()
*------------------------------------------*/
int do_init_script()
{
- crc32_init();
userfunc_db=strdb_alloc(DB_OPT_DUP_KEY,0);
scriptlabel_db=strdb_alloc((DBOptions)(DB_OPT_DUP_KEY|DB_OPT_ALLOW_NULL_DATA),50);
@@ -7474,10 +7470,9 @@ BUILDIN_FUNC(monster)
else
{
m = map_mapname2mapid(mapn);
- if( map[m].instance_map[0] && map[m].instance_id == 0 && st->instance_id )
- {
- m = map_instance_mapid2imapid(m, st->instance_id);
- if( m < 0 )
+ if( map[m].flag.src4instance && st->instance_id )
+ { // Try to redirect to the instance map, not the src map
+ if( (m = instance_mapid2imapid(m, st->instance_id)) < 0 )
{
ShowError("buildin_monster: Trying to spawn monster (%d) on instance map (%s) without instance attached.\n", class_, mapn);
return 1;
@@ -7555,10 +7550,9 @@ BUILDIN_FUNC(areamonster)
else
{
m = map_mapname2mapid(mapn);
- if( map[m].instance_map[0] && map[m].instance_id == 0 && st->instance_id )
- {
- m = map_instance_mapid2imapid(m, st->instance_id);
- if( m < 0 )
+ if( map[m].flag.src4instance && st->instance_id )
+ { // Try to redirect to the instance map, not the src map
+ if( (m = instance_mapid2imapid(m, st->instance_id)) < 0 )
{
ShowError("buildin_areamonster: Trying to spawn monster (%d) on instance map (%s) without instance attached.\n", class_, mapn);
return 1;
@@ -7619,9 +7613,9 @@ BUILDIN_FUNC(killmonster)
if( (m=map_mapname2mapid(mapname))<0 )
return 0;
- if( map[m].instance_map[0] && map[m].instance_id == 0 && st->instance_id && (m=map_instance_mapid2imapid(m, st->instance_id)) < 0 )
+ if( map[m].flag.src4instance && st->instance_id && (m = instance_mapid2imapid(m, st->instance_id)) < 0 )
return 0;
-
+
if( script_hasdata(st,4) ) {
if ( script_getnum(st,4) == 1 ) {
map_foreachinmap(buildin_killmonster_sub, m, BL_MOB, event ,allflag);
@@ -7657,10 +7651,10 @@ BUILDIN_FUNC(killmonsterall)
int m;
mapname=script_getstr(st,2);
- if( (m=map_mapname2mapid(mapname))<0 )
+ if( (m = map_mapname2mapid(mapname))<0 )
return 0;
-
- if( map[m].instance_map[0] && map[m].instance_id == 0 && st->instance_id && (m=map_instance_mapid2imapid(m, st->instance_id)) < 0 )
+
+ if( map[m].flag.src4instance && st->instance_id && (m = instance_mapid2imapid(m, st->instance_id)) < 0 )
return 0;
if( script_hasdata(st,3) ) {
@@ -9915,12 +9909,12 @@ BUILDIN_FUNC(mobcount) // Added by RoVeRT
event=script_getstr(st,3);
check_event(st, event);
- if( (m=map_mapname2mapid(mapname))<0 ) {
+ if( (m = map_mapname2mapid(mapname)) < 0 ) {
script_pushint(st,-1);
return 0;
}
- if( map[m].instance_map[0] && map[m].instance_id == 0 && st->instance_id && (m=map_instance_mapid2imapid(m, st->instance_id)) < 0 )
+ if( map[m].flag.src4instance && map[m].instance_id == 0 && st->instance_id && (m = instance_mapid2imapid(m, st->instance_id)) < 0 )
{
script_pushint(st,-1);
return 0;
@@ -13727,15 +13721,12 @@ BUILDIN_FUNC(bg_get_data)
BUILDIN_FUNC(instance_create)
{
const char *name;
- int party_id, name_id;
- int res;
+ int party_id, res;
name = script_getstr(st, 2);
party_id = script_getnum(st, 3);
- name_id = script_getnum(st, 4);
-
- res = map_instance_create(party_id, name_id, name);
+ res = instance_create(party_id, name);
if( res == -4 ) // Already exists
{
script_pushint(st, -1);
@@ -13763,19 +13754,24 @@ BUILDIN_FUNC(instance_create)
BUILDIN_FUNC(instance_destroy)
{
int instance_id;
-
+ struct map_session_data *sd;
+ struct party_data *p;
+
if( script_hasdata(st, 2) )
instance_id = script_getnum(st, 2);
- else
+ else if( st->instance_id )
instance_id = st->instance_id;
-
+ else if( (sd = script_rid2sd(st)) != NULL && sd->status.party_id && (p = party_search(sd->status.party_id)) != NULL && p->instance_id )
+ instance_id = p->instance_id;
+ else return 0;
+
if( instance_id <= 0 || instance_id >= MAX_INSTANCE )
{
ShowError("buildin_instance_destroy: Trying to destroy invalid instance %d.\n", instance_id);
return 0;
}
-
- map_instance_destroy(instance_id);
+
+ instance_destroy(instance_id);
return 0;
}
@@ -13785,18 +13781,14 @@ BUILDIN_FUNC(instance_attachmap)
int m;
int instance_id;
- instance_id = script_getnum(st, 2);
- name = script_getstr(st, 3);
-
- m = map_instance_map(name, instance_id);
-
- if( m < 0 )
+ name = script_getstr(st, 2);
+ instance_id = script_getnum(st, 3);
+ if( (m = instance_add_map(name, instance_id)) < 0 )
{
ShowError("buildin_instance_attachmap: instance creation failed (%s): %d\n", name, m);
script_pushconststr(st, "");
return 0;
}
-
script_pushconststr(st, map[m].name);
return 0;
@@ -13804,19 +13796,27 @@ BUILDIN_FUNC(instance_attachmap)
BUILDIN_FUNC(instance_detachmap)
{
- const char *name;
- int m;
-
- name = script_getstr(st, 2);
-
- m = map_mapname2mapid(name);
- if( m < 0 )
- {
- ShowError("buildin_instance_detachmap: Trying to detach invalid map %s\n", name);
- return 0;
- }
- map_instance_del(m);
-
+ struct map_session_data *sd;
+ struct party_data *p;
+ const char *str;
+ int m, instance_id;
+
+ str = script_getstr(st, 2);
+ if( script_hasdata(st, 3) )
+ instance_id = script_getnum(st, 3);
+ else if( st->instance_id )
+ instance_id = st->instance_id;
+ else if( (sd = script_rid2sd(st)) != NULL && sd->status.party_id && (p = party_search(sd->status.party_id)) != NULL && p->instance_id )
+ instance_id = p->instance_id;
+ else return 0;
+
+ if( (m = map_mapname2mapid(str)) < 0 || (m = instance_map2imap(m,instance_id,0)) < 0 )
+ {
+ ShowError("buildin_instance_detachmap: Trying to detach invalid map %s\n", str);
+ return 0;
+ }
+
+ instance_del_map(m);
return 0;
}
@@ -13835,7 +13835,7 @@ BUILDIN_FUNC(instance_attach)
BUILDIN_FUNC(instance_id)
{
int type, instance_id;
- struct map_session_data *sd = script_rid2sd(st);
+ struct map_session_data *sd;
struct party_data *p;
if( script_hasdata(st, 2) )
@@ -13843,13 +13843,14 @@ BUILDIN_FUNC(instance_id)
type = script_getnum(st, 2);
if( type == 0 )
instance_id = st->instance_id;
- else if( type == 1 && sd && sd->status.party_id && (p = party_search(sd->status.party_id)) != NULL )
+ else if( type == 1 && (sd = script_rid2sd(st)) != NULL && sd->status.party_id && (p = party_search(sd->status.party_id)) != NULL )
instance_id = p->instance_id;
else
instance_id = 0;
}
else
instance_id = st->instance_id;
+
script_pushint(st, instance_id);
return 0;
}
@@ -13858,29 +13859,30 @@ BUILDIN_FUNC(instance_set_timeout)
{
int progress_timeout, idle_timeout;
int instance_id;
+ struct map_session_data *sd;
+ struct party_data *p;
progress_timeout = script_getnum(st, 2);
idle_timeout = script_getnum(st, 3);
-
+
if( script_hasdata(st, 4) )
instance_id = script_getnum(st, 4);
- else
+ else if( st->instance_id )
instance_id = st->instance_id;
-
+ else if( (sd = script_rid2sd(st)) != NULL && sd->status.party_id && (p = party_search(sd->status.party_id)) != NULL && p->instance_id )
+ instance_id = p->instance_id;
+ else return 0;
+
if( instance_id > 0 )
- map_instance_set_timeout(instance_id, progress_timeout, idle_timeout);
+ instance_set_timeout(instance_id, progress_timeout, idle_timeout);
return 0;
}
BUILDIN_FUNC(instance_init)
{
- int instance_id;
-
- instance_id = script_getnum(st, 2);
-
- map_instance_init(instance_id);
-
+ int instance_id = script_getnum(st, 2);
+ instance_init(instance_id);
return 0;
}
@@ -13888,78 +13890,105 @@ BUILDIN_FUNC(instance_announce)
{
const char *str, *color=NULL;
int flag,instance_id,i;
+ struct map_session_data *sd;
+ struct party_data *p;
- instance_id=script_getnum(st,2);
- str=script_getstr(st,3);
- flag=script_getnum(st,4);
- if (script_hasdata(st,5))
- color=script_getstr(st,5);
-
+ instance_id = script_getnum(st,2);
+ str = script_getstr(st,3);
+ flag = script_getnum(st,4);
+ if( script_hasdata(st,5) )
+ color = script_getstr(st,5);
+
if( instance_id == 0 )
- instance_id = st->instance_id;
-
+ {
+ if( st->instance_id )
+ instance_id = st->instance_id;
+ else if( (sd = script_rid2sd(st)) != NULL && sd->status.party_id && (p = party_search(sd->status.party_id)) != NULL && p->instance_id )
+ instance_id = p->instance_id;
+ else return 0;
+ }
+
if( instance_id <= 0 || instance_id >= MAX_INSTANCE )
return 0;
- for(i=0; i<instance[instance_id].num_map; i++)
- map_foreachinmap(buildin_mapannounce_sub, instance[instance_id].map[i], BL_PC, str,strlen(str)+1,flag&0x10, color);
+ for( i = 0; i < instance[instance_id].num_map; i++ )
+ map_foreachinmap(buildin_mapannounce_sub, instance[instance_id].map[i], BL_PC, str, strlen(str) + 1, flag&0x10, color);
+
return 0;
}
BUILDIN_FUNC(instance_npcname)
{
const char *str;
- struct npc_data *nd = map_id2nd(st->oid);
int instance_id;
+
+ struct map_session_data *sd;
+ struct party_data *p;
+ struct npc_data *nd;
str = script_getstr(st, 2);
if( script_hasdata(st, 3) )
instance_id = script_getnum(st, 3);
- else
+ else if( st->instance_id )
instance_id = st->instance_id;
-
- script_pushconststr(st, map_instance_npcname((char*)str, instance_id));
+ else if( (sd = script_rid2sd(st)) != NULL && sd->status.party_id && (p = party_search(sd->status.party_id)) != NULL && p->instance_id )
+ instance_id = p->instance_id;
+ else return 0;
+
+ if( (nd = npc_name2id(str)) != NULL )
+ {
+ char npcname[NAME_LENGTH];
+ snprintf(npcname, ARRAYLENGTH(npcname), "dup_%d_%d", instance_id, nd->bl.id);
+ script_pushconststr(st,npcname);
+ }
+ else
+ script_pushconststr(st,"");
+
return 0;
}
BUILDIN_FUNC(has_instance)
{
- TBL_PC* sd = script_rid2sd(st);
+ struct map_session_data *sd = script_rid2sd(st);
const char *str;
int m;
-
+
str = script_getstr(st, 2);
- if( (m = map_mapname2mapid(str)) < 0 || (m = map_instance_map2imap(m,sd,0)) < 0 )
+ if( !sd || (m = map_mapname2mapid(str)) < 0 || (m = instance_map2imap(m, sd->status.party_id, 0)) < 0 )
{
script_pushconststr(st, "");
return 0;
}
-
+
script_pushconststr(st, map[m].name);
return 0;
}
BUILDIN_FUNC(instance_warpall)
{
- TBL_PC *pl_sd;
- int m, i;
+ struct map_session_data *pl_sd;
+ int m, i, instance_id;
const char *mapn;
int x, y;
unsigned short mapindex;
struct party_data *p = NULL;
-
- if( !st->instance_id )
- return 0;
-
- mapn = script_getstr(st, 2);
- x = script_getnum(st, 3);
- y = script_getnum(st, 4);
-
- if( (m=map_mapname2mapid(mapn)) < 0 || (map[m].instance_map[0] && (m=map_instance_mapid2imapid(m,st->instance_id)) < 0) )
+
+ mapn = script_getstr(st,2);
+ x = script_getnum(st,3);
+ y = script_getnum(st,4);
+ if( script_hasdata(st,5) )
+ instance_id = script_getnum(st,5);
+ else if( st->instance_id )
+ instance_id = st->instance_id;
+ else if( (pl_sd = script_rid2sd(st)) != NULL && pl_sd->status.party_id && (p = party_search(pl_sd->status.party_id)) != NULL && p->instance_id )
+ instance_id = p->instance_id;
+ else return 0;
+
+ if( (m = map_mapname2mapid(mapn)) < 0 || (map[m].flag.src4instance && (m = instance_mapid2imapid(m, instance_id)) < 0) )
return 0;
-
- if( !(p = party_search(instance[st->instance_id].party_id)) )
+
+ if( !(p = party_search(instance[instance_id].party_id)) )
return 0;
mapindex = map_id2index(m);
@@ -13969,39 +13998,6 @@ BUILDIN_FUNC(instance_warpall)
return 0;
}
-void crc32_init()
-{
- uint32 crc, poly;
- uint32 i, c;
-
- poly = 0xEDB88320;
-
- for( i = 0; i < 256; i++ )
- {
- crc = i;
- for( c = 8; c; c-- )
- {
- if( crc & 1 )
- crc = (crc >> 1) ^ poly;
- else
- crc >>= 1;
- }
-
- crctab[i] = crc;
- }
-}
-
-uint32 crc32(char *dat, int len)
-{
- uint32 crc, i;
-
- crc = 0xFFFFFFFF;
- for( i=0; i<len; i++ )
- crc = ((crc >> 8 ) & 0x00FFFFFF) ^ crctab[(crc ^ *dat++) & 0xFF];
-
- return (crc ^ 0xFFFFFFFF);
-}
-
/*==========================================
* Custom Fonts
*------------------------------------------*/
@@ -14074,7 +14070,7 @@ BUILDIN_FUNC(areamobuseskill)
return 0;
}
- if( map[m].instance_map[0] && map[m].instance_id == 0 && st->instance_id && (m=map_instance_mapid2imapid(m, st->instance_id)) < 0 )
+ if( map[m].flag.src4instance && st->instance_id && (m = instance_mapid2imapid(m, st->instance_id)) < 0 )
return 0;
center.m = m;
@@ -14467,19 +14463,21 @@ struct script_function buildin_func[] = {
BUILDIN_DEF(bg_get_data,"ii"),
BUILDIN_DEF(bg_getareausers,"isiiii"),
BUILDIN_DEF(bg_updatescore,"sii"),
+
// Instancing
- BUILDIN_DEF(instance_create,"sii?"),
+ BUILDIN_DEF(instance_create,"si"),
BUILDIN_DEF(instance_destroy,"?"),
- BUILDIN_DEF(instance_attachmap,"is"),
- BUILDIN_DEF(instance_detachmap,"is"),
+ BUILDIN_DEF(instance_attachmap,"si"),
+ BUILDIN_DEF(instance_detachmap,"s?"),
+ BUILDIN_DEF(instance_attach,"i"),
+ BUILDIN_DEF(instance_id,"?"),
+ BUILDIN_DEF(instance_set_timeout,"ii?"),
BUILDIN_DEF(instance_init,"i"),
BUILDIN_DEF(instance_announce,"isi*"),
- BUILDIN_DEF(instance_attach,"i"),
BUILDIN_DEF(instance_npcname,"s?"),
BUILDIN_DEF(has_instance,"s"),
- BUILDIN_DEF(instance_id,"?"),
- BUILDIN_DEF(instance_warpall,"sii"),
- BUILDIN_DEF(instance_set_timeout,"ii?"),
+ BUILDIN_DEF(instance_warpall,"sii?"),
+
//Quest Log System [Inkfish]
BUILDIN_DEF(setquest, "i"),
BUILDIN_DEF(erasequest, "i"),