Updated "skilleffect" script command (#8505)

* Added an optional parameter to "skilleffect" script command to display the given skill effect on the specified ID (default : attached player).
This commit is contained in:
Atemo 2024-08-02 14:11:38 +02:00 committed by GitHub
parent aacca52eec
commit effd55d1ce
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 40 additions and 27 deletions

View File

@ -6124,11 +6124,12 @@ will always return 0.
---------------------------------------
*skilleffect <skill id>,<number>;
*skilleffect "<skill name>",<number>;
*skilleffect <skill id>,<number>{,<game ID>};
*skilleffect "<skill name>",<number>{,<game ID>};
This command displays visual and aural effects of given skill on currently
attached character. The number parameter is for skill whose visual effect
attached character or, when defined, on any unit with the given ID.
The number parameter is for skill whose visual effect
involves displaying of a number (healing or damaging). Note, that this command
will not actually use the skill, it is intended for scripts, which simulate
skill usage by the NPC, such as buffs, by setting appropriate status and

View File

@ -15337,18 +15337,16 @@ 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);
static inline void script_skill_effect( block_list& bl, uint16 skill_id, uint16 skill_lv, int16 x, int16 y ) {
switch (skill_get_casttype(skill_id)) {
case CAST_GROUND:
clif_skill_poseffect(bl, skill_id, skill_lv, x, y, gettick());
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);
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));
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;
}
}
@ -15356,32 +15354,46 @@ static inline void script_skill_effect(block_list *bl, uint16 skill_id, uint16 s
/*==========================================
* Scripted skill effects [Celest]
*------------------------------------------*/
/// skilleffect <skill id>,<level>
/// skilleffect "<skill name>",<level>
/// skilleffect <skill id>,<level>{,<game id>}
/// skilleffect "<skill name>",<level>{,<game id>}
BUILDIN_FUNC(skilleffect)
{
TBL_PC *sd;
uint16 skill_id, skill_lv;
if( !script_rid2sd(sd) )
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);
block_list* bl;
map_session_data* sd;
if (script_hasdata(st, 4)) {
if (!script_rid2bl(4, bl))
return SCRIPT_CMD_SUCCESS;
}
else {
// target is the character attached (default)
if (!script_rid2sd(sd))
return SCRIPT_CMD_SUCCESS;
bl = &sd->bl;
}
uint16 skill_id = ( script_isstring(st, 2) ? skill_name2id(script_getstr(st, 2)) : script_getnum(st, 2) );
if (skill_db.find(skill_id) == nullptr) {
ShowError("buildin_skilleffect: Invalid skill defined (%s)!\n", script_getstr(st, 2));
return SCRIPT_CMD_FAILURE;
}
/* 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) ) {
skill_sit(sd, 0);
clif_standing(&sd->bl);
uint16 skill_lv = script_getnum(st, 3);
if (bl->type == BL_PC) {
/* 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. */
sd = reinterpret_cast<map_session_data*>( bl );
if (pc_issit(sd) && pc_setstand(sd, false)) {
skill_sit(sd, 0);
clif_standing(&sd->bl);
}
}
script_skill_effect(&sd->bl, skill_id, skill_lv, sd->bl.x, sd->bl.y);
script_skill_effect( *bl, skill_id, skill_lv, bl->x, bl->y );
return SCRIPT_CMD_SUCCESS;
}
@ -15413,7 +15425,7 @@ BUILDIN_FUNC(npcskilleffect)
return SCRIPT_CMD_FAILURE;
}
script_skill_effect(bl, skill_id, skill_lv, bl->x, bl->y);
script_skill_effect( *bl, skill_id, skill_lv, bl->x, bl->y );
return SCRIPT_CMD_SUCCESS;
}
@ -27727,7 +27739,7 @@ struct script_function buildin_func[] = {
BUILDIN_DEF(petskillattack,"viii"), // [Skotlex]
BUILDIN_DEF(petskillattack2,"viiii"), // [Valaris]
BUILDIN_DEF(petskillsupport,"viiii"), // [Skotlex]
BUILDIN_DEF(skilleffect,"vi"), // skill effect [Celest]
BUILDIN_DEF(skilleffect,"vi?"), // skill effect [Celest]
BUILDIN_DEF(npcskilleffect,"viii"), // npc skill effect [Valaris]
BUILDIN_DEF(specialeffect,"i??"), // npc skill effect [Valaris]
BUILDIN_DEF(specialeffect2,"i??"), // skill effect on players[Valaris]