Adjusts npcskilleffect and skilleffect (#5270)

* Fixes #2156.
* Adjusts the two script commands to take into account the type of skill being used.
* Adjusts documentation to reflect.
* Verify skill and skill level.
Thanks to @Yuchinin and @Lemongrass3110!
This commit is contained in:
Aleos 2020-08-03 20:57:09 -04:00 committed by GitHub
parent 1a5fc6a67b
commit eccf5ab20c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 57 additions and 8 deletions

View File

@ -5808,9 +5808,9 @@ Increase AGI Lv 5, and display appropriate effects.
*npcskilleffect <skill id>,<number>,<x>,<y>;
*npcskilleffect "<skill name>",<number>,<x>,<y>;
This command behaves identically to 'skilleffect', however, the effect will not
be centered on the invoking character's sprite, nor on the NPC sprite, if any,
but will be centered at map coordinates given on the same map as the invoking
This command behaves identically to 'skilleffect', however, ground type skill
effects will be centered at the map coordinates given on the same map as the
attached character and all other skill types will be centered on the attached
character.
---------------------------------------

View File

@ -14547,6 +14547,22 @@ BUILDIN_FUNC(petskillsupport)
return SCRIPT_CMD_SUCCESS;
}
static inline void script_skill_effect(block_list *bl, uint16 skill_id, uint16 skill_lv, int16 x, int16 y) {
nullpo_retv(bl);
switch (skill_get_casttype(skill_id)) {
case CAST_GROUND:
clif_skill_poseffect(bl, skill_id, skill_lv, x, y, gettick());
break;
case CAST_NODAMAGE:
clif_skill_nodamage(bl, bl, skill_id, skill_lv, 1);
break;
case CAST_DAMAGE:
clif_skill_damage(bl, bl, gettick(), status_get_amotion(bl), status_get_dmotion(bl), 0, 1, skill_id, skill_lv, skill_get_hit(skill_id));
break;
}
}
/*==========================================
* Scripted skill effects [Celest]
*------------------------------------------*/
@ -14558,11 +14574,24 @@ BUILDIN_FUNC(skilleffect)
uint16 skill_id, skill_lv;
if( !script_rid2sd(sd) )
return SCRIPT_CMD_SUCCESS;
return SCRIPT_CMD_FAILURE;
skill_id = ( script_isstring(st, 2) ? skill_name2id(script_getstr(st,2)) : script_getnum(st,2) );
skill_lv = script_getnum(st,3);
if (skill_db.find(skill_id) == nullptr) {
ShowError("buildin_skilleffect: Invalid skill defined (%s)!\n", script_getstr(st, 2));
return SCRIPT_CMD_FAILURE;
}
uint16 skill_lv_cap = cap_value(skill_lv, 1, skill_get_max(skill_id));
if (skill_lv != skill_lv_cap) {
ShowWarning("buildin_skilleffect: Invalid skill level %d, capping to %d.\n", skill_lv, skill_lv_cap);
skill_lv = skill_lv_cap;
script_reportsrc(st);
}
/* Ensure we're standing because the following packet causes the client to virtually set the char to stand,
* which leaves the server thinking it still is sitting. */
if( pc_issit(sd) && pc_setstand(sd, false) ) {
@ -14570,7 +14599,8 @@ BUILDIN_FUNC(skilleffect)
clif_standing(&sd->bl);
}
clif_skill_nodamage(&sd->bl,&sd->bl,skill_id,skill_lv,1);
script_skill_effect(&sd->bl, skill_id, skill_lv, sd->bl.x, sd->bl.y);
return SCRIPT_CMD_SUCCESS;
}
@ -14582,16 +14612,35 @@ BUILDIN_FUNC(skilleffect)
BUILDIN_FUNC(npcskilleffect)
{
struct block_list *bl= map_id2bl(st->oid);
if (bl == nullptr) {
ShowError("buildin_npcskilleffect: Invalid object attached to NPC.");
return SCRIPT_CMD_FAILURE;
}
uint16 skill_id, skill_lv;
int x, y;
int16 x, y;
skill_id=( script_isstring(st, 2) ? skill_name2id(script_getstr(st,2)) : script_getnum(st,2) );
skill_lv=script_getnum(st,3);
x=script_getnum(st,4);
y=script_getnum(st,5);
if (bl)
clif_skill_poseffect(bl,skill_id,skill_lv,x,y,gettick());
if (skill_db.find(skill_id) == nullptr) {
ShowError("buildin_npcskilleffect: Invalid skill defined (%s)!\n", script_getstr(st, 2));
return SCRIPT_CMD_FAILURE;
}
uint16 skill_lv_cap = cap_value(skill_lv, 1, skill_get_max(skill_id));
if (skill_lv != skill_lv_cap) {
ShowWarning("buildin_npcskilleffect: Invalid skill level %d, capping to %d.\n", skill_lv, skill_lv_cap);
skill_lv = skill_lv_cap;
script_reportsrc(st);
}
script_skill_effect(bl, skill_id, skill_lv, bl->x, bl->y);
return SCRIPT_CMD_SUCCESS;
}