summaryrefslogtreecommitdiff
path: root/src/map/script.c
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/script.c
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/script.c')
-rw-r--r--src/map/script.c105
1 files changed, 67 insertions, 38 deletions
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;