Leaderboard
Popular Content
Showing content with the highest reputation on 06/09/19 in all areas
-
View File Third Job Costumes & New Classes: Corrected Third Job Costumes + New Classes The Correction With the advent of jRO releasing new Job Costumes, and also, the new classes from the Taekwon branch, many of server owners want to replace the vanilla sprites or even, implement the bodystyle system. But, there's a catch! Originally jRO, and now, even kRO spriters, have made it completely off of the default pattern of palette. In a classic example, you can notice the pattern of the RO palettes. What matters is the position of the colours, as an example, for all jobs, the white-ish tones will be always on the same row, so we can use it to create custom palettes. See how it works: But jRO didn't follow the classic pattern, making it incompatible with custom palettes (@Kamishi ones included). So, I edited frame by frame of each job sprite, of each gender, mounted or not, correcting them, converting them in a way so many of the previously created palettes will work. This package includes: Alternate Outfits: Alternate Royal Guard M/F + Gryffon Battlemount + Lion Mount Alternate Ranger M/F + Warg Battlemount + Ostrich Mount Alternate Minstrel/Wanderer + Ostrich Mount Alternate ArchBishop M/F + Alpaca Mount Alternate Warlock M/F + Fox Mount Alternate Mechanic M/F + Savage Mount Alternate Genetic M/F + Savage Mount Alternate Guillotine Cross M/F + Hyena Mount Alternate Shadow Chaser M/F + Hyena Mount Alternate Sorcerer M/F + Fox Mount Alternate Sura M/F + Alpaca Mount Alternate Rune Knight M/F + Dragon Battlemount + Lion Mount New Classes Star Emperor M/F + Wolf Mount Soul Reaper M/F + Wolf Mount As requested by @Emistry, I also added an extra, making it more compatible to default palettes: Kagerou/Oboro + Frog Mount Following the another @Emistry's request, all files are now already on GRFs. The previous version had no Cashmount palette included, this one fixes the issue. Only the already released costumes are supported at this moment. The Rune Knight seems to be the last of them, it's over a year from the first release! As a final part of the package, I'm including Classic Palettes for all Alternate Costumes. Enjoy the final product! Submitter Haziel Submitted 02/24/2016 Category Job Sprites Content Author Gravity Corp1 point
-
Thanks buddy, I will try this There finally working, I was using the same diff before. But I think I have missed a line when I implemented it. Thanks for a better and clearer copy1 point
-
diff --git a/conf/battle/battle.conf b/conf/battle/battle.conf index 593d4e92f4..30251a4834 100644 --- a/conf/battle/battle.conf +++ b/conf/battle/battle.conf @@ -158,3 +158,9 @@ warg_can_falcon: no // Should the target be able of dodging damage by snapping away to the edge of the screen? // Official behavior is "no" snap_dodge: no + +// **************************************** +// Reserved Costume ID's +// **************************************** +// Reserved Char ID for costume converted items. +reserved_costume_id: 999998 \ No newline at end of file diff --git a/doc/script_commands.txt b/doc/script_commands.txt index 70113c4145..d769b4364d 100644 --- a/doc/script_commands.txt +++ b/doc/script_commands.txt @@ -9633,6 +9633,25 @@ solution rather than sending the map and the monster_id. --------------------------------------- +*costume <equipment position>; + +Converts equipment in <equipment position> to costume version that has no stats. + +Applicable positions are: + EQI_HEAD_TOP - Top Headgear + EQI_HEAD_MID - Middle Headgear + EQI_HEAD_LOW - Lower Headgear + EQI_GARMENT - Garment + +--------------------------------------- + +*getcostumeitem <item id>; +*getcostumeitem <"item name">; + +Spawn a costume version of an <item id> or <"item name"> in attached player's inventory. + +--------------------------------------- + *hateffect(<Hat Effect ID>,<State>); This will set a Hat Effect onto the player. The state field allows you to diff --git a/src/map/atcommand.cpp b/src/map/atcommand.cpp index 43d6ad4d7d..e2897a48b5 100644 --- a/src/map/atcommand.cpp +++ b/src/map/atcommand.cpp @@ -1218,7 +1218,7 @@ ACMD_FUNC(heal) ACMD_FUNC(item) { char item_name[100]; - int number = 0, bound = BOUND_NONE; + int number = 0, bound = BOUND_NONE, costume = 0; char flag = 0; struct item item_tmp; struct item_data *item_data[10]; @@ -1267,6 +1267,27 @@ ACMD_FUNC(item) for(j--; j>=0; j--){ //produce items in list unsigned short item_id = item_data[j]->nameid; + if (!strcmpi(command + 1, "costumeitem")) + { + if (!battle_config.reserved_costume_id) + { + clif_displaymessage(fd, "Costume convertion is disable. Set a value for reserved_cosutme_id on your battle.conf file."); + return -1; + } + if (!(item_data[j]->equip&EQP_HEAD_LOW) && + !(item_data[j]->equip&EQP_HEAD_MID) && + !(item_data[j]->equip&EQP_HEAD_TOP) && + !(item_data[j]->equip&EQP_COSTUME_HEAD_LOW) && + !(item_data[j]->equip&EQP_COSTUME_HEAD_MID) && + !(item_data[j]->equip&EQP_COSTUME_HEAD_TOP) && + !(item_data[j]->equip&EQP_GARMENT) && + !(item_data[j]->equip&EQP_COSTUME_GARMENT)) + { + clif_displaymessage(fd, "You cannot costume this item. Costume only work for headgears."); + return -1; + } + costume = 1; + } //Check if it's stackable. if (!itemdb_isstackable2(item_data[j])) get_count = 1; @@ -1277,6 +1298,11 @@ ACMD_FUNC(item) memset(&item_tmp, 0, sizeof(item_tmp)); item_tmp.nameid = item_id; item_tmp.identify = 1; + if (costume == 1) { // Costume item + item_tmp.card[0] = CARD0_CREATE; + item_tmp.card[2] = GetWord(battle_config.reserved_costume_id, 0); + item_tmp.card[3] = GetWord(battle_config.reserved_costume_id, 1); + } item_tmp.bound = bound; if ((flag = pc_additem(sd, &item_tmp, get_count, LOG_TYPE_COMMAND))) clif_additem(sd, 0, 0, flag); @@ -10282,6 +10308,7 @@ void atcommand_basecommands(void) { ACMD_DEF(clonestat), ACMD_DEF(bodystyle), ACMD_DEF(adopt), + ACMD_DEF2("costumeitem", item), ACMD_DEF(agitstart3), ACMD_DEF(agitend3), }; diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 839cfb5620..d28c5f0182 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -8482,6 +8482,7 @@ static const struct _battle_data { { "exp_cost_inspiration", &battle_config.exp_cost_inspiration, 1, 0, 100, }, { "mvp_exp_reward_message", &battle_config.mvp_exp_reward_message, 0, 0, 1, }, { "can_damage_skill", &battle_config.can_damage_skill, 1, 0, BL_ALL, }, + { "reserved_costume_id", &battle_config.reserved_costume_id, 999998, 0, INT_MAX, }, { "atcommand_levelup_events", &battle_config.atcommand_levelup_events, 0, 0, 1, }, { "block_account_in_same_party", &battle_config.block_account_in_same_party, 1, 0, 1, }, { "tarotcard_equal_chance", &battle_config.tarotcard_equal_chance, 0, 0, 1, }, diff --git a/src/map/battle.hpp b/src/map/battle.hpp index ad13f69d53..b8f36aaf00 100644 --- a/src/map/battle.hpp +++ b/src/map/battle.hpp @@ -618,6 +618,7 @@ struct Battle_Config int exp_cost_inspiration; int mvp_exp_reward_message; int can_damage_skill; //Which BL types can damage traps + int reserved_costume_id; int atcommand_levelup_events; int block_account_in_same_party; int tarotcard_equal_chance; //Official or equal chance for each card diff --git a/src/map/map.cpp b/src/map/map.cpp index 8b70459939..3b06cd032c 100644 --- a/src/map/map.cpp +++ b/src/map/map.cpp @@ -1865,6 +1865,12 @@ void map_reqnickdb(struct map_session_data * sd, int charid) nullpo_retv(sd); + if (battle_config.reserved_costume_id && battle_config.reserved_costume_id == charid) + { + clif_solved_charname(sd->fd, charid, "Costume"); + return; + } + tsd = map_charid2sd(charid); if( tsd ) { diff --git a/src/map/pc.cpp b/src/map/pc.cpp index c0126b1597..015381e857 100755 --- a/src/map/pc.cpp +++ b/src/map/pc.cpp @@ -746,6 +746,7 @@ int pc_equippoint_sub(struct map_session_data *sd,struct item_data* id){ return EQP_SHADOW_ARMS; } } + return ep; } @@ -757,7 +758,18 @@ int pc_equippoint_sub(struct map_session_data *sd,struct item_data* id){ int pc_equippoint(struct map_session_data *sd,int n){ nullpo_ret(sd); - return pc_equippoint_sub(sd,sd->inventory_data[n]); + int ep = pc_equippoint_sub(sd, sd->inventory_data[n]); + + if (battle_config.reserved_costume_id && + sd->inventory.u.items_inventory[n].card[0] == CARD0_CREATE && + MakeDWord(sd->inventory.u.items_inventory[n].card[2], sd->inventory.u.items_inventory[n].card[3]) == battle_config.reserved_costume_id) + { // Costume Item - Converted + if (ep&EQP_HEAD_TOP) { ep &= ~EQP_HEAD_TOP; ep |= EQP_COSTUME_HEAD_TOP; } + if (ep&EQP_HEAD_LOW) { ep &= ~EQP_HEAD_LOW; ep |= EQP_COSTUME_HEAD_LOW; } + if (ep&EQP_HEAD_MID) { ep &= ~EQP_HEAD_MID; ep |= EQP_COSTUME_HEAD_MID; } + if (ep&EQP_GARMENT) { ep &= ~EQP_GARMENT; ep |= EQP_COSTUME_GARMENT; } + } + return ep; } /** diff --git a/src/map/script.cpp b/src/map/script.cpp index 0b2386c32d..70127734b0 100644 --- a/src/map/script.cpp +++ b/src/map/script.cpp @@ -22601,6 +22601,114 @@ BUILDIN_FUNC(getexp2) { return SCRIPT_CMD_SUCCESS; } +/*========================================== +* Costume Items +*------------------------------------------*/ +BUILDIN_FUNC(costume) +{ + int i = -1, num, ep; + TBL_PC *sd; + + num = script_getnum(st, 2); // Equip Slot + + if (!script_rid2sd(sd)) + return SCRIPT_CMD_FAILURE; + + if (equip_index_check(num)) + i = pc_checkequip(sd, equip_bitmask[num]); + if (i < 0) + return SCRIPT_CMD_FAILURE; + + ep = sd->inventory.u.items_inventory[i].equip; + if (!(ep&EQP_HEAD_LOW) && !(ep&EQP_HEAD_MID) && !(ep&EQP_HEAD_TOP) && !(ep&EQP_GARMENT)) { + ShowError("buildin_costume: Attempted to convert non-cosmetic item to costume."); + return SCRIPT_CMD_FAILURE; + } + log_pick_pc(sd, LOG_TYPE_SCRIPT, -1, &sd->inventory.u.items_inventory[i]); + pc_unequipitem(sd, i, 2); + clif_delitem(sd, i, 1, 3); + // -------------------------------------------------------------------- + sd->inventory.u.items_inventory[i].refine = 0; + sd->inventory.u.items_inventory[i].attribute = 0; + sd->inventory.u.items_inventory[i].card[0] = CARD0_CREATE; + sd->inventory.u.items_inventory[i].card[1] = 0; + sd->inventory.u.items_inventory[i].card[2] = GetWord(battle_config.reserved_costume_id, 0); + sd->inventory.u.items_inventory[i].card[3] = GetWord(battle_config.reserved_costume_id, 1); + + if (ep&EQP_HEAD_TOP) { ep &= ~EQP_HEAD_TOP; ep |= EQP_COSTUME_HEAD_TOP; } + if (ep&EQP_HEAD_LOW) { ep &= ~EQP_HEAD_LOW; ep |= EQP_COSTUME_HEAD_LOW; } + if (ep&EQP_HEAD_MID) { ep &= ~EQP_HEAD_MID; ep |= EQP_COSTUME_HEAD_MID; } + if (ep&EQP_GARMENT) { ep &= EQP_GARMENT; ep |= EQP_COSTUME_GARMENT; } + // -------------------------------------------------------------------- + log_pick_pc(sd, LOG_TYPE_SCRIPT, 1, &sd->inventory.u.items_inventory[i]); + + clif_additem(sd, i, 1, 0); + pc_equipitem(sd, i, ep); + clif_misceffect(&sd->bl, 3); + + return SCRIPT_CMD_SUCCESS; +} + +/*=============================== + * getcostumeitem <item id>; + * getcostumeitem <"item name">; + *===============================*/ +BUILDIN_FUNC(getcostumeitem) +{ + unsigned short nameid; + struct item item_tmp; + TBL_PC *sd; + struct script_data *data; + + if (!script_rid2sd(sd)) + { // No player attached. + script_pushint(st, 0); + return SCRIPT_CMD_SUCCESS; + } + + data = script_getdata(st, 2); + get_val(st, data); + if (data_isstring(data)) { + int ep; + const char *name = conv_str(st, data); + struct item_data *item_data = itemdb_searchname(name); + if (item_data == NULL) + { //Failed + script_pushint(st, 0); + return SCRIPT_CMD_SUCCESS; + } + ep = item_data->equip; + if (!(ep&EQP_HEAD_LOW) && !(ep&EQP_HEAD_MID) && !(ep&EQP_HEAD_TOP) && !(ep&EQP_GARMENT)){ + ShowError("buildin_getcostumeitem: Attempted to convert non-cosmetic item to costume."); + return SCRIPT_CMD_FAILURE; + } + nameid = item_data->nameid; + } + else + nameid = conv_num(st, data); + + if (!itemdb_exists(nameid)) + { // Item does not exist. + script_pushint(st, 0); + return SCRIPT_CMD_SUCCESS; + } + + memset(&item_tmp, 0, sizeof(item_tmp)); + item_tmp.nameid = nameid; + item_tmp.amount = 1; + item_tmp.identify = 1; + item_tmp.card[0] = CARD0_CREATE; + item_tmp.card[2] = GetWord(battle_config.reserved_costume_id, 0); + item_tmp.card[3] = GetWord(battle_config.reserved_costume_id, 1); + if (pc_additem(sd, &item_tmp, 1, LOG_TYPE_SCRIPT)) { + script_pushint(st, 0); + return SCRIPT_CMD_SUCCESS; //Failed to add item, we will not drop if they don't fit + } + + script_pushint(st, 1); + return SCRIPT_CMD_SUCCESS; +} + /** * Force stat recalculation of sd * recalculatestat; @@ -24343,6 +24451,8 @@ struct script_function buildin_func[] = { BUILDIN_DEF(getguildalliance,"ii"), BUILDIN_DEF(adopt,"vv"), BUILDIN_DEF(getexp2,"ii?"), + BUILDIN_DEF(costume, "i"), + BUILDIN_DEF(getcostumeitem, "v"), BUILDIN_DEF(recalculatestat,""), BUILDIN_DEF(hateffect,"ii"), BUILDIN_DEF(getrandomoptinfo, "i"), diff --git a/src/map/status.cpp b/src/map/status.cpp index af4c3afb00..a296f7b89e 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -3492,6 +3492,8 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt) continue; if (!sd->inventory_data[index]) continue; + if (sd->inventory.u.items_inventory[current_equip_item_index].card[0] == CARD0_CREATE && MakeDWord(sd->inventory.u.items_inventory[current_equip_item_index].card[2], sd->inventory.u.items_inventory[current_equip_item_index].card[3]) == battle_config.reserved_costume_id) + continue; base_status->def += sd->inventory_data[index]->def; From Secret Try this1 point
-
You can change color by using any Hex editor. search bytes: CA DF FB 00 C6 86 C4 RED channel - CA GREEN channel - DF BLUE channel - FB For example, we want to change it by red color. We need to modify bytes to: FF 00 00 00 C6 86 C41 point
-
May Digest 2019 The following digest covers the month of May 2019 Staff Changes: None Development Highlights: CORE: Fixed potential race-condition possibility in cart item transaction (7f772c32) Fixed some bonuses getting capped (69843289) Additional fixes for cart exploit (7ad1b32d) Login Server console command issue (b9fb0d5a) Fixed maintenance and gm_allow_group config (317146c0) Fixed getareaunits coordinates (ddb7d903) Updated viewpoint command (a3fc44ef) Changed renewal start coordinates (eb4b4625) DATABASE: Renewal item database update (9a7b1780, e9297658) Gigantic Bow supposed to subtract HIT instead of add (656bcf31) Updated KRO Class-Shadow costume (097ed5eb) Autobonus correction (f8a1427d) Added shadow items - ID range 24320~24424 (164dc9a6) Corrected Twin Pompom By JB item bonus (1bd524a7) Updated Death Fire (ID 13192) and Rolling Thunder (ID 13193) (47ef1ea0) Updated new items weight from kRO (13db834c) Corrected new hats (0b9d7603) Corrected Rice_Cake_Soup (ID 669) item script (e48c1495) SCRIPT: None OTHERS: None List of Contributors: @aleos89, @AnnieRuru, @Atemo, @attackjom, @AzarthMZintos, @Badarosk0, @crazystorm2017, @CyberDevil75, @cydh, @flamefury, @lChyztl, @mazvi, @Normynator, @sader1992, @schickrazor, @secretdataz. @SeravySensei, @teededung, @tkporreta, @RagVision Show your support to rAthena by submitting your Issue or Pull Requests!1 point