summaryrefslogtreecommitdiff
path: root/src/map
diff options
context:
space:
mode:
authorskotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec>2007-09-17 19:13:58 +0000
committerskotlex <skotlex@54d463be-8e91-2dee-dedb-b68131a5f0ec>2007-09-17 19:13:58 +0000
commita0a05f00e2177f52903b7f9a55c8852a9e56d3d5 (patch)
tree2b0409dc827996af1e61a1b7461e662413e96642 /src/map
parentd5766e3e2601c290e71fab04aa12756af36f3954 (diff)
downloadhercules-a0a05f00e2177f52903b7f9a55c8852a9e56d3d5.tar.gz
hercules-a0a05f00e2177f52903b7f9a55c8852a9e56d3d5.tar.bz2
hercules-a0a05f00e2177f52903b7f9a55c8852a9e56d3d5.tar.xz
hercules-a0a05f00e2177f52903b7f9a55c8852a9e56d3d5.zip
- Applied various crash-protections to script commands that deal with the equip-position array.
- Corrected and simplified the skill_magic_reflect function. Fixed damage reflection being based on the caster rather than the target. - Potions are now usable inside Gospel by the casting Paladin (as per Aegis tests done by AuronX) - The unequip script command now takes a position from 1 to 10 rather than 0 to 9 (to make it consistant with all the other equip position related script commands) - Added the EQI_* constants to db/const.txt in a format usable by the equip-position related script commands. - Updated some items to use the new EQI constants. - Also updated doc/script_commands.txt to refer to the EQI list. git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@11230 54d463be-8e91-2dee-dedb-b68131a5f0ec
Diffstat (limited to 'src/map')
-rw-r--r--src/map/pc.c2
-rw-r--r--src/map/script.c105
-rw-r--r--src/map/skill.c16
3 files changed, 75 insertions, 48 deletions
diff --git a/src/map/pc.c b/src/map/pc.c
index 00662e91c..3dd2289c3 100644
--- a/src/map/pc.c
+++ b/src/map/pc.c
@@ -3071,8 +3071,6 @@ int pc_useitem(struct map_session_data *sd,int n)
sd->sc.data[SC_BERSERK].timer!=-1 ||
sd->sc.data[SC_MARIONETTE].timer!=-1 ||
(sd->sc.data[SC_GRAVITATION].timer!=-1 && sd->sc.data[SC_GRAVITATION].val3 == BCT_SELF) ||
- //Cannot use Potions/Healing items while under Gospel.
- (sd->sc.data[SC_GOSPEL].timer!=-1 && sd->sc.data[SC_GOSPEL].val4 == BCT_SELF && sd->inventory_data[n]->type == IT_HEALING) ||
sd->sc.data[SC_TRICKDEAD].timer != -1 ||
sd->sc.data[SC_BLADESTOP].timer != -1 ||
(sd->sc.data[SC_NOCHAT].timer!=-1 && sd->sc.data[SC_NOCHAT].val1&MANNER_NOITEM)
diff --git a/src/map/script.c b/src/map/script.c
index a754aca14..d423d433e 100644
--- a/src/map/script.c
+++ b/src/map/script.c
@@ -6776,7 +6776,7 @@ unsigned int equip[10]={EQP_HEAD_TOP,EQP_ARMOR,EQP_HAND_L,EQP_HAND_R,EQP_GARMENT
*------------------------------------------*/
BUILDIN_FUNC(getequipid)
{
- int i,num;
+ int i=-1,num;
TBL_PC *sd;
struct item_data* item;
@@ -6787,7 +6787,8 @@ BUILDIN_FUNC(getequipid)
return 0;
}
num=script_getnum(st,2);
- i=pc_checkequip(sd,equip[num-1]);
+ if (num > 0 && num <= ARRAYLENGTH(equip))
+ i=pc_checkequip(sd,equip[num-1]);
if(i >= 0){
item=sd->inventory_data[i];
if(item)
@@ -6805,7 +6806,7 @@ BUILDIN_FUNC(getequipid)
*------------------------------------------*/
BUILDIN_FUNC(getequipname)
{
- int i,num;
+ int i=-1,num;
TBL_PC *sd;
struct item_data* item;
char *buf;
@@ -6815,7 +6816,8 @@ BUILDIN_FUNC(getequipname)
buf=(char *)aMallocA(64*sizeof(char));
sd=script_rid2sd(st);
num=script_getnum(st,2);
- i=pc_checkequip(sd,equip[num-1]);
+ if (num > 0 && num <= ARRAYLENGTH(equip))
+ i=pc_checkequip(sd,equip[num-1]);
if(i >= 0){
item=sd->inventory_data[i];
if(item)
@@ -6890,22 +6892,19 @@ BUILDIN_FUNC(repair)
*------------------------------------------*/
BUILDIN_FUNC(getequipisequiped)
{
- int i,num;
+ int i=-1,num;
TBL_PC *sd;
num=script_getnum(st,2);
sd=script_rid2sd(st);
- if ((num - 1) >= (sizeof(equip) / sizeof(equip[0])))
- i = -1;
- else
+ if (num > 0 && num <= ARRAYLENGTH(equip))
i=pc_checkequip(sd,equip[num-1]);
- if(i >= 0)
- script_pushint(st,1);
- else
- script_pushint(st,0);
-
+ if(i >= 0)
+ script_pushint(st,1);
+ else
+ script_pushint(st,0);
return 0;
}
@@ -6914,12 +6913,13 @@ BUILDIN_FUNC(getequipisequiped)
*------------------------------------------*/
BUILDIN_FUNC(getequipisenableref)
{
- int i,num;
+ int i=-1,num;
TBL_PC *sd;
num=script_getnum(st,2);
sd=script_rid2sd(st);
- i=pc_checkequip(sd,equip[num-1]);
+ if (num > 0 && num <= ARRAYLENGTH(equip))
+ i=pc_checkequip(sd,equip[num-1]);
if(i >= 0 && sd->inventory_data[i] && !sd->inventory_data[i]->flag.no_refine)
{
script_pushint(st,1);
@@ -6935,12 +6935,13 @@ BUILDIN_FUNC(getequipisenableref)
*------------------------------------------*/
BUILDIN_FUNC(getequipisidentify)
{
- int i,num;
+ int i=-1,num;
TBL_PC *sd;
num=script_getnum(st,2);
sd=script_rid2sd(st);
- i=pc_checkequip(sd,equip[num-1]);
+ if (num > 0 && num <= ARRAYLENGTH(equip))
+ i=pc_checkequip(sd,equip[num-1]);
if(i >= 0)
script_pushint(st,sd->status.inventory[i].identify);
else
@@ -6954,12 +6955,13 @@ BUILDIN_FUNC(getequipisidentify)
*------------------------------------------*/
BUILDIN_FUNC(getequiprefinerycnt)
{
- int i,num;
+ int i=-1,num;
TBL_PC *sd;
num=script_getnum(st,2);
sd=script_rid2sd(st);
- i=pc_checkequip(sd,equip[num-1]);
+ if (num > 0 && num <= ARRAYLENGTH(equip))
+ i=pc_checkequip(sd,equip[num-1]);
if(i >= 0)
script_pushint(st,sd->status.inventory[i].refine);
else
@@ -6973,12 +6975,13 @@ BUILDIN_FUNC(getequiprefinerycnt)
*------------------------------------------*/
BUILDIN_FUNC(getequipweaponlv)
{
- int i,num;
+ int i=-1,num;
TBL_PC *sd;
num=script_getnum(st,2);
sd=script_rid2sd(st);
- i=pc_checkequip(sd,equip[num-1]);
+ if (num > 0 && num <= ARRAYLENGTH(equip))
+ i=pc_checkequip(sd,equip[num-1]);
if(i >= 0 && sd->inventory_data[i])
script_pushint(st,sd->inventory_data[i]->wlv);
else
@@ -6992,12 +6995,13 @@ BUILDIN_FUNC(getequipweaponlv)
*------------------------------------------*/
BUILDIN_FUNC(getequippercentrefinery)
{
- int i,num;
+ int i=-1,num;
TBL_PC *sd;
num=script_getnum(st,2);
sd=script_rid2sd(st);
- i=pc_checkequip(sd,equip[num-1]);
+ if (num > 0 && num <= ARRAYLENGTH(equip))
+ i=pc_checkequip(sd,equip[num-1]);
if(i >= 0 && sd->status.inventory[i].nameid && sd->status.inventory[i].refine < MAX_REFINE)
script_pushint(st,percentrefinery[itemdb_wlv(sd->status.inventory[i].nameid)][(int)sd->status.inventory[i].refine]);
else
@@ -7011,12 +7015,13 @@ BUILDIN_FUNC(getequippercentrefinery)
*------------------------------------------*/
BUILDIN_FUNC(successrefitem)
{
- int i,num,ep;
+ int i=-1,num,ep;
TBL_PC *sd;
num=script_getnum(st,2);
sd=script_rid2sd(st);
- i=pc_checkequip(sd,equip[num-1]);
+ if (num > 0 && num <= ARRAYLENGTH(equip))
+ i=pc_checkequip(sd,equip[num-1]);
if(i >= 0) {
ep=sd->status.inventory[i].equip;
@@ -7063,12 +7068,13 @@ BUILDIN_FUNC(successrefitem)
*------------------------------------------*/
BUILDIN_FUNC(failedrefitem)
{
- int i,num;
+ int i=-1,num;
TBL_PC *sd;
num=script_getnum(st,2);
sd=script_rid2sd(st);
- i=pc_checkequip(sd,equip[num-1]);
+ if (num > 0 && num <= ARRAYLENGTH(equip))
+ i=pc_checkequip(sd,equip[num-1]);
if(i >= 0) {
//Logs items, got from (N)PC scripts [Lupus]
if(log_config.enable_logs&0x40)
@@ -9749,13 +9755,20 @@ BUILDIN_FUNC(requestguildinfo)
* ---------------------------------------------------------------------*/
BUILDIN_FUNC(getequipcardcnt)
{
- int i,num;
+ int i=-1,num;
TBL_PC *sd;
int c=MAX_SLOTS;
num=script_getnum(st,2);
sd=script_rid2sd(st);
- i=pc_checkequip(sd,equip[num-1]);
+ if (num > 0 && num <= ARRAYLENGTH(equip))
+ i=pc_checkequip(sd,equip[num-1]);
+
+ if (i < 0) {
+ script_pushint(st,0);
+ return 0;
+ }
+
if(itemdb_isspecial(sd->status.inventory[i].card[0]))
{
script_pushint(st,0);
@@ -9777,14 +9790,21 @@ BUILDIN_FUNC(getequipcardcnt)
* ----------------------------------------------------------------*/
BUILDIN_FUNC(successremovecards)
{
- int i,j,num,cardflag=0,flag;
+ int i=-1,j,num,cardflag=0,flag;
TBL_PC *sd;
struct item item_tmp;
int c=MAX_SLOTS;
num=script_getnum(st,2);
sd=script_rid2sd(st);
- i=pc_checkequip(sd,equip[num-1]);
+ if (num > 0 && num <= ARRAYLENGTH(equip))
+ i=pc_checkequip(sd,equip[num-1]);
+
+ if (i < 0) {
+ script_pushint(st,0);
+ return 0;
+ }
+
if(itemdb_isspecial(sd->status.inventory[i].card[0]))
return 0;
@@ -9844,7 +9864,7 @@ BUILDIN_FUNC(successremovecards)
* ----------------------------------------------------------------*/
BUILDIN_FUNC(failedremovecards)
{
- int i,j,num,cardflag=0,flag,typefail;
+ int i=-1,j,num,cardflag=0,flag,typefail;
TBL_PC *sd;
struct item item_tmp;
int c=MAX_SLOTS;
@@ -9852,7 +9872,14 @@ BUILDIN_FUNC(failedremovecards)
num=script_getnum(st,2);
typefail=script_getnum(st,3);
sd=script_rid2sd(st);
- i=pc_checkequip(sd,equip[num-1]);
+ if (num > 0 && num <= ARRAYLENGTH(equip))
+ i=pc_checkequip(sd,equip[num-1]);
+
+ if (i < 0) {
+ script_pushint(st,0);
+ return 0;
+ }
+
if(itemdb_isspecial(sd->status.inventory[i].card[0]))
return 0;
@@ -10403,13 +10430,14 @@ BUILDIN_FUNC(setiteminfo)
*------------------------------------------*/
BUILDIN_FUNC(getequipcardid)
{
- int i,num,slot;
+ int i=-1,num,slot;
TBL_PC *sd;
num=script_getnum(st,2);
slot=script_getnum(st,3);
sd=script_rid2sd(st);
- i=pc_checkequip(sd,equip[num-1]);
+ if (num > 0 && num <= ARRAYLENGTH(equip))
+ i=pc_checkequip(sd,equip[num-1]);
if(i >= 0 && slot>=0 && slot<4)
script_pushint(st,sd->status.inventory[i].card[slot]);
else
@@ -11893,10 +11921,11 @@ BUILDIN_FUNC(unequip)
num = script_getnum(st,2) - 1;
sd=script_rid2sd(st);
- if(sd!=NULL && num<10)
+ if(sd!=NULL && num > 0 && num <= ARRAYLENGTH(equip))
{
- i=pc_checkequip(sd,equip[num]);
- pc_unequipitem(sd,i,2);
+ i=pc_checkequip(sd,equip[num-1]);
+ if (i >= 0)
+ pc_unequipitem(sd,i,2);
return 0;
}
return 0;
diff --git a/src/map/skill.c b/src/map/skill.c
index c81aa3aaf..f3464be83 100644
--- a/src/map/skill.c
+++ b/src/map/skill.c
@@ -1890,13 +1890,13 @@ int skill_blown(struct block_list* src, struct block_list* target, int count, in
}
-//Checks if there should be magic reflection.
+//Checks if bl should reflect back a spell.
//type is the type of magic attack: 0: indirect (aoe), 1: direct (targetted)
-static int skill_magic_reflect(struct block_list *src, struct block_list *target, int type)
+static int skill_magic_reflect(struct block_list *bl, int type)
{
- struct status_change *sc = status_get_sc(target);
+ struct status_change *sc = status_get_sc(bl);
struct map_session_data *sd;
- BL_CAST(BL_PC, src, sd);
+ BL_CAST(BL_PC, bl, sd);
if(sd && sd->magic_damage_return && type && rand()%100 < sd->magic_damage_return)
return 1;
@@ -1906,11 +1906,11 @@ static int skill_magic_reflect(struct block_list *src, struct block_list *target
if(sc->data[SC_MAGICMIRROR].timer != -1 && rand()%100 < sc->data[SC_MAGICMIRROR].val2)
return 1;
- if(sc->data[SC_KAITE].timer != -1 && (sd || status_get_lv(src) <= 80))
+ if(sc->data[SC_KAITE].timer != -1 && (sd || status_get_lv(bl) <= 80))
{ //Works on players or mobs with level under 80.
- clif_specialeffect(target, 438, AREA);
+ clif_specialeffect(bl, 438, AREA);
if (--sc->data[SC_KAITE].val2 <= 0)
- status_change_end(target, SC_KAITE, -1);
+ status_change_end(bl, SC_KAITE, -1);
return 1;
}
}
@@ -1994,7 +1994,7 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds
if (attack_type&BF_MAGIC) {
if (!(sstatus->mode&MD_BOSS) && (dmg.damage || dmg.damage2) &&
- skill_magic_reflect(src, bl, src==dsrc))
+ skill_magic_reflect(bl, src==dsrc))
{ //Magic reflection, switch caster/target
struct block_list *tbl = bl;
bl = src;