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 id>,<number>{,<game ID>};
*skilleffect "<skill name>",<number>; *skilleffect "<skill name>",<number>{,<game ID>};
This command displays visual and aural effects of given skill on currently 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 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 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 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; return SCRIPT_CMD_SUCCESS;
} }
static inline void script_skill_effect(block_list *bl, uint16 skill_id, uint16 skill_lv, int16 x, int16 y) { 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)) { switch (skill_get_casttype(skill_id)) {
case CAST_GROUND: 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; break;
case CAST_NODAMAGE: case CAST_NODAMAGE:
clif_skill_nodamage(bl, bl, skill_id, skill_lv, 1); clif_skill_nodamage(&bl, &bl, skill_id, skill_lv, 1);
break; break;
case CAST_DAMAGE: 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; break;
} }
} }
@ -15356,32 +15354,46 @@ static inline void script_skill_effect(block_list *bl, uint16 skill_id, uint16 s
/*========================================== /*==========================================
* Scripted skill effects [Celest] * Scripted skill effects [Celest]
*------------------------------------------*/ *------------------------------------------*/
/// skilleffect <skill id>,<level> /// skilleffect <skill id>,<level>{,<game id>}
/// skilleffect "<skill name>",<level> /// skilleffect "<skill name>",<level>{,<game id>}
BUILDIN_FUNC(skilleffect) BUILDIN_FUNC(skilleffect)
{ {
TBL_PC *sd; block_list* bl;
uint16 skill_id, skill_lv; 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)) if (!script_rid2sd(sd))
return SCRIPT_CMD_FAILURE; return SCRIPT_CMD_SUCCESS;
skill_id = ( script_isstring(st, 2) ? skill_name2id(script_getstr(st,2)) : script_getnum(st,2) ); bl = &sd->bl;
skill_lv = script_getnum(st,3); }
uint16 skill_id = ( script_isstring(st, 2) ? skill_name2id(script_getstr(st, 2)) : script_getnum(st, 2) );
if (skill_db.find(skill_id) == nullptr) { if (skill_db.find(skill_id) == nullptr) {
ShowError("buildin_skilleffect: Invalid skill defined (%s)!\n", script_getstr(st, 2)); ShowError("buildin_skilleffect: Invalid skill defined (%s)!\n", script_getstr(st, 2));
return SCRIPT_CMD_FAILURE; return SCRIPT_CMD_FAILURE;
} }
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, /* 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. */ * which leaves the server thinking it still is sitting. */
sd = reinterpret_cast<map_session_data*>( bl );
if (pc_issit(sd) && pc_setstand(sd, false)) { if (pc_issit(sd) && pc_setstand(sd, false)) {
skill_sit(sd, 0); skill_sit(sd, 0);
clif_standing(&sd->bl); 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; return SCRIPT_CMD_SUCCESS;
} }
@ -15413,7 +15425,7 @@ BUILDIN_FUNC(npcskilleffect)
return SCRIPT_CMD_FAILURE; 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; return SCRIPT_CMD_SUCCESS;
} }
@ -27727,7 +27739,7 @@ struct script_function buildin_func[] = {
BUILDIN_DEF(petskillattack,"viii"), // [Skotlex] BUILDIN_DEF(petskillattack,"viii"), // [Skotlex]
BUILDIN_DEF(petskillattack2,"viiii"), // [Valaris] BUILDIN_DEF(petskillattack2,"viiii"), // [Valaris]
BUILDIN_DEF(petskillsupport,"viiii"), // [Skotlex] 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(npcskilleffect,"viii"), // npc skill effect [Valaris]
BUILDIN_DEF(specialeffect,"i??"), // npc skill effect [Valaris] BUILDIN_DEF(specialeffect,"i??"), // npc skill effect [Valaris]
BUILDIN_DEF(specialeffect2,"i??"), // skill effect on players[Valaris] BUILDIN_DEF(specialeffect2,"i??"), // skill effect on players[Valaris]