From fa591ce1099fc9c7abb267412ecf7e7be89ef9eb Mon Sep 17 00:00:00 2001 From: skotlex Date: Sat, 29 Jul 2006 03:32:43 +0000 Subject: [PATCH] - Added A_* constants to identify ammo types. - Added Ishizu's code to check ammo type on attack. No more using Grenade rounds with Guns. git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@7959 54d463be-8e91-2dee-dedb-b68131a5f0ec --- Changelog-Trunk.txt | 2 ++ src/map/battle.c | 40 +++++++++++++++++++++++++++++++++++++--- src/map/pc.h | 9 +++++++++ 3 files changed, 48 insertions(+), 3 deletions(-) diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt index 3f95c7728b..c47403ead1 100644 --- a/Changelog-Trunk.txt +++ b/Changelog-Trunk.txt @@ -4,6 +4,8 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK. 2006/07/28 + * Added Ishizu's code to check ammo type on attack. No more using Grenade + rounds with Guns. [Skotlex] * offensive heal/sanctuary will only happen when the source of the heal is a player, mob/pet casted heal will now always heal regardless of target. [Skotlex] diff --git a/src/map/battle.c b/src/map/battle.c index 14d2f6b0e7..707cb139b9 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -2854,9 +2854,43 @@ int battle_weapon_attack( struct block_list *src,struct block_list *target, if (sd) { sd->state.arrow_atk = (sd->status.weapon == W_BOW || (sd->status.weapon >= W_REVOLVER && sd->status.weapon <= W_GRENADE)); - if (sd->state.arrow_atk && sd->equip_index[10]<0) { - clif_arrow_fail(sd,0); - return 0; + if (sd->state.arrow_atk) + { //Recycled damage variable to store index. + damage = sd->equip_index[EQI_AMMO]; + if (damage<0) { + clif_arrow_fail(sd,0); + return 0; + } + //Ammo check by Ishizu-chan + if (sd->inventory_data[damage]) + switch (sd->status.weapon) { + case W_BOW: + if (sd->inventory_data[damage]->look != A_ARROW) { + clif_arrow_fail(sd,0); + return 0; + } + break; + case W_REVOLVER: + case W_RIFLE: + case W_GATLING: + if (sd->inventory_data[damage]->look != A_BULLET) { + clif_arrow_fail(sd,0); + return 0; + } + break; + case W_SHOTGUN: + if (sd->inventory_data[damage]->look != A_SHELL) { + clif_arrow_fail(sd,0); + return 0; + } + break; + case W_GRENADE: + if (sd->inventory_data[damage]->look != A_GRENADE) { + clif_arrow_fail(sd,0); + return 0; + } + break; + } } } diff --git a/src/map/pc.h b/src/map/pc.h index 056aeb401b..a8435508b5 100644 --- a/src/map/pc.h +++ b/src/map/pc.h @@ -40,6 +40,15 @@ enum { MAX_WEAPON_TYPE } weapon_type; +enum { + A_ARROW = 1, + A_DAGGER, //2 + A_BULLET, //3 + A_SHELL, //4 + A_GRENADE, //5 + A_SHURIKEN, //6 + A_KUNAI //7 +} ammo_type; //Equip position constants enum { EQP_HEAD_LOW = 0x0001,