- Minor cleanups

- Adjusted menu-based skills so you can't reuse the same skill until you've dealt with the menu.
- Adjust autospells so that removing an autospell works when the script of the card that removes the autospell is triggered before the script that adds the spell.
- The "requested name of gm-hidden char" warning will not be displayed when the object in question is an NPC (since you can use Intravision to do this).
- Corrected the header format for invisible npcs.
- Venom Knife no longer takes into accounts cards or EDP.


git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@9905 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
skotlex 2007-02-23 18:41:56 +00:00
parent 13ceb43962
commit cf8685131d
9 changed files with 47 additions and 18 deletions

View File

@ -3,6 +3,16 @@ Date Added
AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK. AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK.
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK. IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
2007/02/24
* Adjusted menu-based skills so you can't reuse the same skill until you've
dealt with the menu.
* Adjust autospells so that removing an autospell works when the script of
the card that removes the autospell is triggered before the script that
adds the spell.
* The "requested name of gm-hidden char" warning will not be displayed when
the object in question is an NPC (since you can use Intravision to do
this).
* Venom Knife no longer takes into accounts cards or EDP.
2007/02/23 2007/02/23
* Guild expulsion now will fail when the character to be kicked is in a * Guild expulsion now will fail when the character to be kicked is in a
guild castle (rather than checking for the character doing the expulsion) guild castle (rather than checking for the character doing the expulsion)

View File

@ -329,7 +329,7 @@ moment - if you need that, try it and tell us of the results.
** Define a 'floating' NPC object. ** Define a 'floating' NPC object.
-%TAB%script%TAB%-1,{<code>} -%TAB%script%TAB%<NPC Name>%TAB%-1,{<code>}
This will define an NPC object not triggerable by normal means. This would This will define an NPC object not triggerable by normal means. This would
normally mean it's pointless since it can't do anything, but there are normally mean it's pointless since it can't do anything, but there are

View File

@ -3031,7 +3031,7 @@ int parse_admin(int fd) {
int lan_subnetcheck(long *p) { int lan_subnetcheck(long *p) {
int i; int i;
unsigned char *sbn, *msk, *src = (unsigned char *)p; unsigned char *sbn, *msk/*, *src = (unsigned char *)p*/;
for(i=0; i<subnet_count; i++) { for(i=0; i<subnet_count; i++) {

View File

@ -1377,6 +1377,9 @@ static struct Damage battle_calc_weapon_attack(
case AS_SONICBLOW: case AS_SONICBLOW:
skillratio += -50+5*skill_lv; skillratio += -50+5*skill_lv;
break; break;
case AS_VENOMKNIFE:
flag.cardfix = 0;
break;
case TF_SPRINKLESAND: case TF_SPRINKLESAND:
skillratio += 30; skillratio += 30;
break; break;
@ -1639,7 +1642,8 @@ static struct Damage battle_calc_weapon_attack(
if(sc->data[SC_EDP].timer != -1 && if(sc->data[SC_EDP].timer != -1 &&
skill_num != ASC_BREAKER && skill_num != ASC_BREAKER &&
skill_num != ASC_METEORASSAULT) skill_num != ASC_METEORASSAULT &&
skill_num != AS_VENOMKNIFE)
ATK_ADDRATE(sc->data[SC_EDP].val3); ATK_ADDRATE(sc->data[SC_EDP].val3);
} }

View File

@ -8489,8 +8489,10 @@ void clif_parse_GetCharNameRequest(int fd, struct map_session_data *sd) {
if (!bl) return; if (!bl) return;
sc = status_get_sc(bl); sc = status_get_sc(bl);
if (sc && sc->option&OPTION_INVISIBLE && !disguised(bl) && pc_isGM(sd) < battle_config.hack_info_GM_level) if (sc && sc->option&OPTION_INVISIBLE && !disguised(bl) &&
{ bl->type != BL_NPC && //Skip hidden NPCs which can be seen using Maya Purple
pc_isGM(sd) < battle_config.hack_info_GM_level
) {
//GM characters (with client side GM enabled are able to see invisible stuff) [Lance] //GM characters (with client side GM enabled are able to see invisible stuff) [Lance]
//Asked name of invisible player, this shouldn't be possible! //Asked name of invisible player, this shouldn't be possible!
//Possible bot? Thanks to veider and qspirit //Possible bot? Thanks to veider and qspirit
@ -9703,14 +9705,17 @@ void clif_parse_UseSkillToId(int fd, struct map_session_data *sd) {
if(target_id<0 && -target_id == sd->bl.id) // for disguises [Valaris] if(target_id<0 && -target_id == sd->bl.id) // for disguises [Valaris]
target_id = sd->bl.id; target_id = sd->bl.id;
if(sd->menuskill_id)
return; //Can't use skills while a menu is open.
if (sd->skillitem == skillnum) { if (sd->skillitem == skillnum) {
if (skilllv != sd->skillitemlv) if (skilllv != sd->skillitemlv)
skilllv = sd->skillitemlv; skilllv = sd->skillitemlv;
unit_skilluse_id(&sd->bl, target_id, skillnum, skilllv); unit_skilluse_id(&sd->bl, target_id, skillnum, skilllv);
return; return;
} }
sd->skillitem = sd->skillitemlv = 0; sd->skillitem = sd->skillitemlv = 0;
if (skillnum == MO_EXTREMITYFIST) { if (skillnum == MO_EXTREMITYFIST) {
if ((sd->sc.data[SC_COMBO].timer == -1 || if ((sd->sc.data[SC_COMBO].timer == -1 ||
@ -9801,7 +9806,11 @@ void clif_parse_UseSkillToPosSub(int fd, struct map_session_data *sd, int skilll
if(sd->sc.option&(OPTION_WEDDING|OPTION_XMAS)) if(sd->sc.option&(OPTION_WEDDING|OPTION_XMAS))
return; return;
if(sd->menuskill_id)
return; //Can't use skills while a menu is open.
pc_delinvincibletimer(sd); pc_delinvincibletimer(sd);
if (sd->skillitem == skillnum) { if (sd->skillitem == skillnum) {
if (skilllv != sd->skillitemlv) if (skilllv != sd->skillitemlv)
skilllv = sd->skillitemlv; skilllv = sd->skillitemlv;
@ -9864,6 +9873,9 @@ void clif_parse_UseSkillMap(int fd,struct map_session_data *sd)
if(sd->sc.option&(OPTION_WEDDING|OPTION_XMAS)) if(sd->sc.option&(OPTION_WEDDING|OPTION_XMAS))
return; return;
if(sd->menuskill_id && sd->menuskill_id != RFIFOW(fd,2))
return; //Can't use skills while a menu is open.
pc_delinvincibletimer(sd); pc_delinvincibletimer(sd);
skill_castend_map(sd,RFIFOW(fd,2),(char*)RFIFOP(fd,4)); skill_castend_map(sd,RFIFOW(fd,2),(char*)RFIFOP(fd,4));

View File

@ -1193,7 +1193,7 @@ static int pc_bonus_autospell_del(struct s_autospell *spell, int max, short id,
if (i<0) return 0; //Nothing to substract from. if (i<0) return 0; //Nothing to substract from.
j = i; j = i;
for(; i>=0 && rate > 0; i--) for(; i>=0 && rate>0; i--)
{ {
if (spell[i].id != id || spell[i].lv != lv) continue; if (spell[i].id != id || spell[i].lv != lv) continue;
if (rate >= spell[i].rate) { if (rate >= spell[i].rate) {
@ -1207,6 +1207,13 @@ static int pc_bonus_autospell_del(struct s_autospell *spell, int max, short id,
rate = 0; rate = 0;
} }
} }
if (rate > 0 && ++j < max)
{ //Tag this as "pending" autospell to remove.
spell[j].id = id;
spell[j].lv = lv;
spell[j].rate = -rate;
spell[j].card_id = 0;
}
return rate; return rate;
} }
@ -1216,12 +1223,13 @@ static int pc_bonus_autospell(struct s_autospell *spell, int max, short id, shor
pc_bonus_autospell_del(spell, max, id, lv, -rate, card_id); pc_bonus_autospell_del(spell, max, id, lv, -rate, card_id);
for (i = 0; i < max && spell[i].id; i++) { for (i = 0; i < max && spell[i].id; i++) {
if (spell[i].card_id == card_id && if ((spell[i].card_id == card_id || !spell[i].card_id) &&
spell[i].id == id && spell[i].lv == lv) spell[i].id == id && spell[i].lv == lv)
{ {
if (!battle_config.autospell_stacking) if (!battle_config.autospell_stacking && spell[i].rate > 0)
return 0; return 0;
rate += spell[i].rate; rate += spell[i].rate;
if (rate < 0) card_id = 0; //Reduced from debted autospell.
break; break;
} }
} }

View File

@ -12936,16 +12936,13 @@ BUILDIN_FUNC(getvariableofnpc)
st->state = END; st->state = END;
return 1; return 1;
} }
else if( nd == NULL || nd->bl.subtype != SCRIPT || nd->u.scr.script == NULL ) if( nd == NULL || nd->bl.subtype != SCRIPT || nd->u.scr.script == NULL )
{// NPC not found or has no script {// NPC not found or has no script
ShowError("script: getvariableofnpc: can't find npc %s\n", npc_name); ShowError("script: getvariableofnpc: can't find npc %s\n", npc_name);
st->state = END; st->state = END;
return 1; return 1;
} }
else push_val2(st->stack, C_NAME, num, &nd->u.scr.script->script_vars );
{// push variable reference
push_val2(st->stack, C_NAME, num, &nd->u.scr.script->script_vars );
}
} }
return 0; return 0;
} }

View File

@ -851,9 +851,6 @@ int skillnotok (int skillid, struct map_session_data *sd)
if (battle_config.gm_skilluncond && pc_isGM(sd) >= battle_config.gm_skilluncond) if (battle_config.gm_skilluncond && pc_isGM(sd) >= battle_config.gm_skilluncond)
return 0; // gm's can do anything damn thing they want return 0; // gm's can do anything damn thing they want
if(sd->menuskill_id && skillid != sd->menuskill_id)
return 1; //Can't use skills while a menu is open.
// Check skill restrictions [Celest] // Check skill restrictions [Celest]
if(!map_flag_vs(m) && skill_get_nocast (skillid) & 1) if(!map_flag_vs(m) && skill_get_nocast (skillid) & 1)
return 1; return 1;

View File

@ -809,6 +809,7 @@ int unit_skilluse_id2(struct block_list *src, int target_id, int skill_num, int
//Target_id checking. //Target_id checking.
if(skillnotok(skill_num, sd)) // [MouseJstr] if(skillnotok(skill_num, sd)) // [MouseJstr]
return 0; return 0;
switch(skill_num) switch(skill_num)
{ //Check for skills that auto-select target { //Check for skills that auto-select target
case MO_CHAINCOMBO: case MO_CHAINCOMBO: