Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 01/24/19 in all areas

  1. 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 Corp  
    1 point
  2. Didn't you you wanted that. prontera,150,150,4 script Stylist 4_F_NYDHOG,{ if(!(eaclass() & EAJ_SUMMONER)) { setarray .@max[1], getbattleflag("max_hair_style"), getbattleflag("max_hair_color"), ((!getlook(LOOK_BODY2))? getbattleflag("max_cloth_color") : .max[4]); } else { copyarray .@max[1],.max[1],3; } setarray .@min[1], 1, // Hair style 0 crashed my client last time I tested. 0, 0; setarray .@s[1], LOOK_HAIR, LOOK_HAIR_COLOR, LOOK_CLOTHES_COLOR; .@size = getarraysize(.blacklist$); .@n$ = "^3227cd[Stylist]^000000"; mes .@n$; mes "Hello "+strcharinfo(0)+"."; mes "Current hairstyle: ^00457f"+getlook(LOOK_HAIR)+"^000000."; mes "Current haircolor: ^215d90"+getlook(LOOK_HAIR_COLOR)+"^000000."; mes "Current clothcolor: ^4c9fe5"+getlook(LOOK_CLOTHES_COLOR)+"^000000."; mes "Do you want to change something?"; while(playerattached()) { next; .@sty = select("^911b1bExit.^000000","Hairstyle.","Haircolor.","Clothes color.") - 1; mes .@n$; if(!.@sty) { mes "Have a nice day."; close; } .@o = getlook(.@s[.@sty]); mes "Where do you want to start from?"; next; .@s = select("From the beggining.","From my current style.","Specific style.","Random style."); mes .@n$; if(.@s == 3) { mes "Input the number you'd like to start from."; mes "("+.@min[.@sty]+" - "+.@max[.@sty]+")"; mes "Your current style is: ^e83333"+.@o+"^000000."; input .@num; if(.@num > .@max[.@sty] || .@num < .@min[.@sty]) .@num = rand(.@min[.@sty],.@max[.@sty]); } else { .@num = ((.@s == 1)? .@min[.@sty] : ((.@s == 2)? .@o : ((.@s == 4)? rand(.@min[.@sty],.@max[.@sty]) : .@min[.@sty]))); } if(!.@opt) { stand; getmapxy .@m$,.@x,.@y,UNITTYPE_PC; unitwalk getcharid(3),.@x,.@y - 1; } mes "Great, we can start now."; next; do { mes .@n$; if(.@s[.@sty] == LOOK_CLOTHES_COLOR) { for(.@i = 0;.@i < .@size && !.@blacklist;.@i++) { if(compare(.blacklist$[.@i],"-")) { explode .@bl$,.blacklist$[.@i],"-"; .@min = atoi(.@bl$[0]); .@max = atoi(.@bl$[1]); if(.@num >= .@min && .@num <= .@max) { if(!.@revert) .@num = .@max + 1; else .@num = .@min - 1; } } else { if(.@num == atoi(.blacklist$[.@i])) .@num+= pow(-1,.@revert); } } } mes "Style n°^e83333"+.@num+"^000000."; setlook .@s[.@sty],.@num; if(!.@random) { .@sty_1$ = ((.@revert)? "Previous [^e83c00"+((.@num - 1 < .@min[.@sty])? .@max[.@sty] : .@num - 1)+"^000000]" : "Next [^e83c00"+((.@num + 1 > .@max[.@sty])? .@min[.@sty] : .@num + 1) +"^000000]"); .@sty_2$ = ((.@revert)? "Next [^e83c00"+((.@num + 1 > .@max[.@sty])?.@min[.@sty] : .@num + 1)+"^000000]" : "Previous [^e83c00"+((.@num - 1 < .@min[.@sty])? .@max[.@sty] : .@num - 1) +"^000000]"); .@opt = select(.@sty_1$,.@sty_2$,"^911b1bI want this one.^000000","Jump to a number ("+.@min[.@sty]+"-"+.@max[.@sty]+").","Jump to a random number.","Revert changes.","^614c9cRandom mode^000000 [^e81600off^000000]"); if(.@opt + .@revert == 2) .@num--; else if(.@opt + .@revert == 1) .@num++; if(.@num < .@min[.@sty]) .@num = .@max[.@sty]; else if(.@num > .@max[.@sty]) .@num = .@min[.@sty]; if(.@opt == 2) .@revert = !.@revert; } else { .@opt = select("Next.","^911b1bI want this one.^000000","Jump to a number ("+.@min[.@sty]+"-"+.@max[.@sty]+").","Revert changes.","^614c9cRandom mode^000000 [^50bf19on^000000]"); if(.@opt > 2) .@opt++; if(.@opt > 4) .@opt++; } if(.@opt == 4) { input .@num; if(.@num > .@max[.@sty] || .@num < .@min[.@sty]) .@num = rand(.@min[.@sty],.@max[.@sty]); } else if(.@opt == 5 || (.@random && .@opt == 1)) { .@num = rand(.@min[.@sty],.@max[.@sty]); } else if(.@opt == 6) { .@num = .@o; } else if(.@opt == 7) { .@random = !.@random; } clear; } while(.@opt != (3 - .@random)); next; mes .@n$; mes "Do you want to change something else?"; .@num = 0; .@revert = false; .@random = false; } OnInit: //==============Settings:=============================================== setarray .max[1], 6, // Max summoner hairstyle. 10, // Max summoner hair color. 10, // Max summoner clothes color. 553; // Alternative outfist clothes color. setarray .blacklist$[0],"30-200","999"; // Blacklist for cloth color. //====================================================================== }
    1 point
  3. Try this. pc.cpp Change: /*========================================== * Append a card to an item ? *------------------------------------------*/ int pc_insert_card(struct map_session_data* sd, int idx_card, int idx_equip) { int i; unsigned short nameid; nullpo_ret(sd); if( idx_equip < 0 || idx_equip >= MAX_INVENTORY || sd->inventory_data[idx_equip] == NULL ) return 0; //Invalid item index. if( idx_card < 0 || idx_card >= MAX_INVENTORY || sd->inventory_data[idx_card] == NULL ) return 0; //Invalid card index. if( sd->inventory.u.items_inventory[idx_equip].nameid <= 0 || sd->inventory.u.items_inventory[idx_equip].amount < 1 ) return 0; // target item missing if( sd->inventory.u.items_inventory[idx_card].nameid <= 0 || sd->inventory.u.items_inventory[idx_card].amount < 1 ) return 0; // target card missing if( sd->inventory_data[idx_equip]->type != IT_WEAPON && sd->inventory_data[idx_equip]->type != IT_ARMOR ) return 0; // only weapons and armor are allowed if( sd->inventory_data[idx_card]->type != IT_CARD ) return 0; // must be a card if( sd->inventory.u.items_inventory[idx_equip].identify == 0 ) return 0; // target must be identified if( itemdb_isspecial(sd->inventory.u.items_inventory[idx_equip].card[0]) ) return 0; // card slots reserved for other purposes if( (sd->inventory_data[idx_equip]->equip & sd->inventory_data[idx_card]->equip) == 0 ) return 0; // card cannot be compounded on this item type if( sd->inventory_data[idx_equip]->type == IT_WEAPON && sd->inventory_data[idx_card]->equip == EQP_SHIELD ) return 0; // attempted to place shield card on left-hand weapon. if( sd->inventory.u.items_inventory[idx_equip].equip != 0 ) return 0; // item must be unequipped ARR_FIND( 0, sd->inventory_data[idx_equip]->slot, i, sd->inventory.u.items_inventory[idx_equip].card[i] == 0 ); if( i == sd->inventory_data[idx_equip]->slot ) return 0; // no free slots // remember the card id to insert nameid = sd->inventory.u.items_inventory[idx_card].nameid; if( pc_delitem(sd,idx_card,1,1,0,LOG_TYPE_OTHER) == 1 ) {// failed clif_insert_card(sd,idx_equip,idx_card,1); } else {// success log_pick_pc(sd, LOG_TYPE_OTHER, -1, &sd->inventory.u.items_inventory[idx_equip]); sd->inventory.u.items_inventory[idx_equip].card[i] = nameid; log_pick_pc(sd, LOG_TYPE_OTHER, 1, &sd->inventory.u.items_inventory[idx_equip]); clif_insert_card(sd,idx_equip,idx_card,0); } return 0; } to: /*========================================== * Append a card to an item ? *------------------------------------------*/ int pc_insert_card(struct map_session_data* sd, int idx_card, int idx_equip) { int i; unsigned short nameid; nullpo_ret(sd); if( idx_equip < 0 || idx_equip >= MAX_INVENTORY || sd->inventory_data[idx_equip] == NULL ) return 0; //Invalid item index. if( idx_card < 0 || idx_card >= MAX_INVENTORY || sd->inventory_data[idx_card] == NULL ) return 0; //Invalid card index. if( sd->inventory.u.items_inventory[idx_equip].nameid <= 0 || sd->inventory.u.items_inventory[idx_equip].amount < 1 ) return 0; // target item missing if( sd->inventory.u.items_inventory[idx_card].nameid <= 0 || sd->inventory.u.items_inventory[idx_card].amount < 1 ) return 0; // target card missing if( sd->inventory_data[idx_equip]->type != IT_WEAPON && sd->inventory_data[idx_equip]->type != IT_ARMOR ) return 0; // only weapons and armor are allowed if( sd->inventory_data[idx_card]->type != IT_CARD ) return 0; // must be a card if( sd->inventory.u.items_inventory[idx_equip].identify == 0 ) return 0; // target must be identified if( itemdb_isspecial(sd->inventory.u.items_inventory[idx_equip].card[0]) ) return 0; // card slots reserved for other purposes if( (sd->inventory_data[idx_equip]->equip & sd->inventory_data[idx_card]->equip) == 0 ) return 0; // card cannot be compounded on this item type if( sd->inventory_data[idx_equip]->type == IT_WEAPON && sd->inventory_data[idx_card]->equip == EQP_SHIELD ) return 0; // attempted to place shield card on left-hand weapon. if( sd->inventory.u.items_inventory[idx_equip].equip != 0 ) return 0; // item must be unequipped ARR_FIND( 0, sd->inventory_data[idx_equip]->slot, i, sd->inventory.u.items_inventory[idx_equip].card[i] == 0 ); if( i == sd->inventory_data[idx_equip]->slot ) return 0; // no free slots struct item_data* data; data = itemdb_search(item->nameid); if(data->stack.inventory) { int count; for(i = 0; i < sd->inventory_data[idx_equip]->slot; i++) { if(sd->inventory.u.items_inventory[idx_equip].card[i] == nameid) count++; } if(count >= data->stack.amount) { char output[255]; sprintf(output, "This card cannot be stacked %d times or more.", data->stack.amount); clif_messagecolor(&sd->bl, color_table[COLOR_RED], output, false, SELF); return 0; } } // remember the card id to insert nameid = sd->inventory.u.items_inventory[idx_card].nameid; if( pc_delitem(sd,idx_card,1,1,0,LOG_TYPE_OTHER) == 1 ) {// failed clif_insert_card(sd,idx_equip,idx_card,1); } else {// success log_pick_pc(sd, LOG_TYPE_OTHER, -1, &sd->inventory.u.items_inventory[idx_equip]); sd->inventory.u.items_inventory[idx_equip].card[i] = nameid; log_pick_pc(sd, LOG_TYPE_OTHER, 1, &sd->inventory.u.items_inventory[idx_equip]); clif_insert_card(sd,idx_equip,idx_card,0); } return 0; } And change: /*========================================== * Checking if we have enough place on inventory for new item * Make sure to take 30k as limit (for client I guess) * @param sd * @param nameid * @param amount * @return e_chkitem_result *------------------------------------------*/ char pc_checkadditem(struct map_session_data *sd, unsigned short nameid, int amount) { int i; struct item_data* data; nullpo_ret(sd); if(amount > MAX_AMOUNT) return CHKADDITEM_OVERAMOUNT; data = itemdb_search(nameid); if(!itemdb_isstackable2(data)) return CHKADDITEM_NEW; if( data->stack.inventory && amount > data->stack.amount ) return CHKADDITEM_OVERAMOUNT; for(i=0;i<MAX_INVENTORY;i++){ // FIXME: This does not consider the checked item's cards, thus could check a wrong slot for stackability. if(sd->inventory.u.items_inventory[i].nameid == nameid){ if( amount > MAX_AMOUNT - sd->inventory.u.items_inventory[i].amount || ( data->stack.inventory && amount > data->stack.amount - sd->inventory.u.items_inventory[i].amount ) ) return CHKADDITEM_OVERAMOUNT; return CHKADDITEM_EXIST; } } return CHKADDITEM_NEW; } to: /*========================================== * Checking if we have enough place on inventory for new item * Make sure to take 30k as limit (for client I guess) * @param sd * @param nameid * @param amount * @return e_chkitem_result *------------------------------------------*/ char pc_checkadditem(struct map_session_data *sd, unsigned short nameid, int amount) { int i; struct item_data* data; nullpo_ret(sd); if(amount > MAX_AMOUNT) return CHKADDITEM_OVERAMOUNT; data = itemdb_search(nameid); if(!itemdb_isstackable2(data)) return CHKADDITEM_NEW; if(itemdb_type(nameid) == IT_CARD) return CHKADDITEM_NEW; if( data->stack.inventory && amount > data->stack.amount ) return CHKADDITEM_OVERAMOUNT; for(i=0;i<MAX_INVENTORY;i++){ // FIXME: This does not consider the checked item's cards, thus could check a wrong slot for stackability. if(sd->inventory.u.items_inventory[i].nameid == nameid){ if( amount > MAX_AMOUNT - sd->inventory.u.items_inventory[i].amount || ( data->stack.inventory && amount > data->stack.amount - sd->inventory.u.items_inventory[i].amount ) ) return CHKADDITEM_OVERAMOUNT; return CHKADDITEM_EXIST; } } return CHKADDITEM_NEW; } Then you add the cards in item_stack.txt 4001,1,1 // Poring Card This way you can't insert the card more than X times. It's better than having a division or nullifying the effects since the player doesn't waste cards.
    1 point
  4. Version 1.0.1

    2960 downloads

    This NPC let your players change their appearance to other classes in their class line plus their jRO costume at a price. For example, a sniper can change his/her appearance to hunter and ranger (plus jRO ranger costume).
    Free
    1 point
  5. Version 2.2.0

    37166 downloads

    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!
    Free
    1 point
×
×
  • Create New...