GmOcean
Community Contributors-
Content Count
371 -
Joined
-
Last visited
-
Days Won
8
Content Type
Profiles
Forums
Downloads
Staff Applications
Calendar
Everything posted by GmOcean
-
Well, i'm assuming you meant, how to make it so only party leader can run the warp. Since there was a line of code having to deal with @leader and such. prontera,192,176,5 script Çöó½Ã¾ÆÀÇ Àü·É 4_M_SAKRAYROYAL,{ if (getareausers("prontera",197,178,207,167) < 2) {// if (getareausers("prontera",197,178,207,167) < 2) { mes "[ºí·¹µå]"; mes "Àü Çöó½Ã¾ÆÀÇ Àü·ÉÀ¸·Î"; mes "¿ëÀÇ ´øÀü Åä¹ú´ë¸¦ ¸ðÁý ÇÏ°í ÀÖ½À´Ï´Ù."; mes "Çöó½Ã¾ÆÀÇ ±àÁö·Î"; mes "4´ë ¿ëµéÀ» ¹°¸®ÃÄ ÁֽʽÿÀ."; next; menu "Åä¹ú´ë ±¸¼º ¹× Ãâ¹ß",D_go,"Ãë¼Ò",Cancel;Cancel: mes "[ºí·¹µå]"; mes "¾î¿¼ö ¾ø±º¿ä."; close; D_go: mes "[ºí·¹µå]"; mes "µå·¡°ï µÕÁö·Î °¡±âÀ§Çؼ´Â 20¸í ÀÌ»óÀÇ Åä¹ú´ë°¡ ÀÖ¾î¾ß ÇÕ´Ï´Ù."; mes "ÇöÀç ½ÅÀü¿¡ "+getareausers("prontera",197,178,207,167)+ " ¸íÀÌ ´ë±âÁßÀ̱º¿ä.."; next; mes "[ºí·¹µå]"; mes "ÀοøÀ» ´õ ¸ðÁý ÇϽðųª"; mes "½ÅÀüÀ¸·Î ÀοøÀ» ¸ð¾Æ ÁֽʽÿÀ."; close; } mes "[ºí·¹µå]"; mes "Ãâ¹ß ÇϽðڽÀ´Ï±î?"; next; switch(select("Ãâ¹ß ÇÏ°Ú½À´Ï´Ù.:Ãë¼Ò")) { case 1: mes "[ºí·¹µå]"; mes "¹«¿îÀ» º÷´Ï´Ù."; close2; if( getpartyleader(getcharid(3),1) == -1){ mes "Only party leader can use this."; close; } areawarp "prontera",197,178,207,167,"1@eom",95,123,101,117; warp "1@eom",93,120; case 2: close; } }}
-
Creating a pearl expression to identify upper/lowercase/numbers/symbols is hard, atleast I didn't wanna bother with it. That's why my disguise event accepts lowercase or all upper case when giving the answer.
-
- script autocart -1,{OnPCLoginEvent:if( !checkcart() ) { setcart 1;}end;} This just gives them a cart, can't really say which one. Also, I'm against this sort of thing, because what if the player doesn't wanna wear a cart for looks D: *Note - Documentation says this wont work for class' besides merchant class ( unless they have MC_PUSHCART skill ), so should be fine without checks *
-
[Request] New PVP Idea + League Of Legends Type
GmOcean replied to Jezu's question in Script Requests
If you're not getting any points, then it's highly likely I got the killerrid and killedrid backwards. If that is the simply add this after OnPCKillEvent: attachrid( killedrid ) ; -
[Request] New PVP Idea + League Of Legends Type
GmOcean replied to Jezu's question in Script Requests
Well, this is a very basic script, doing just the bare minimum of what you requested. Just the bones, no flesh =P prontera,160,180,4 script PVP ROOMS 123,{mes "Welcome, what PVP room do you want to enter?";switch( select("Normal PVP Room [ Unranked ]"+ (lolpvprank?":["+ .ranknames$[lolpvprank] +"] PVP Room:No Division Limit":"::") +":Close") ) { case 1: explode( .@w$, .warplocations$[0], ":" ); warp .@w$[0], atoi( .@w$[1] ), atoi( .@w$[2] ); end; case 2: explode( .@w$, .warplocations$[lolpvprank], ":" ); warp .@w$[0], atoi( .@w$[1] ), atoi( .@w$[2] ); end; case 3: explode( .@w$, .warplocations$[getarraysize(.warplocations$)], ":" ); warp .@w$[0], atoi( .@w$[1] ), atoi( .@w$[2] ); end; case 4: close;}OnPCKillEvent:for( .@i = 0; .@i< getarraysize( .warplocations ); .@i++ ) { explode( .@w$, .warplocations$[.@i], ":" ); if( strcharinfo(3) == .@w$[0] ) { .@a = 1; }}if( !.@a ) { end; } // Only Count Kills from maps in Ranked/Non-Ranked PVP rooms.lolpvpkills--; // Minus Points on death, even if it was a suicide.if( lolpvpkills == -1 ){ lolpvprank--; lolpvpkills = .lolpvpkillsrank[lolpvprank] - 1; // De-rank players and set them to 1 kill away from promotion again. announce "Ouch~! You've been deranked, back to "+ .ranknames$[lolpvprank] +"~!",bc_self | bc_blue;}if( killedrid == killerrid ){ end; } // Was a suicide so end.attachrid( killerrid );if( lolpvprank == ( getarraysize( .lolpvpkillsrank ) - 1 ) ){ end; } // Reached Max Rank already.lolpvpkills++;if( lolpvpkills >= .lolpvpkillsrank[lolpvprank +1] && .lolpvpkillsrank[lolpvprank+2] >= lolpvpkills ) { lolpvprank++; announce "Congratulations~! You are now "+ .ranknames$[lolpvprank] +"~!",bc_self | bc_blue; lolpvpkills = 0;}end;OnInit:// Warp Locations// eg: "prontera:150:180", <--- Will warp you to Prontera 150,180.setarray .warplocations$[0],"MapName:X:Y", // Unranked Warp Location ( Always make this one first ). "MapName:X:Y", // Bronze V "MapName:X:Y", // Bronze IV "MapName:X:Y", // Bronze III "MapName:X:Y", // Bronze II "MapName:X:Y", // Bronze I "MapName:X:Y", // Silver V "MapName:X:Y", // Silver IV "MapName:X:Y", // Silver III "MapName:X:Y", // Silver II "MapName:X:Y", // Silver I "MapName:X:Y", // Gold V "MapName:X:Y", // Gold IV "MapName:X:Y", // Gold III "MapName:X:Y", // Gold II "MapName:X:Y", // Gold I "MapName:X:Y", // Platinum V "MapName:X:Y", // Platinum IV "MapName:X:Y", // Platinum III "MapName:X:Y", // Platinum II "MapName:X:Y", // Platinum I "MapName:X:Y", // Challenger V "MapName:X:Y", // Challenger IV "MapName:X:Y", // Challenger III "MapName:X:Y", // Challenger II "MapName:X:Y", // Challenger I "MapName:X:Y"; // No Division Limit ( Always keep this one last ).setarray .ranknames$[0],"Unranked", "Bronze V", "Bronze IV", "Bronze III", "Bronze II", "Bronze I", "Silver V", "Silver IV", "Silver III", "Silver II", "Silver I", "Gold V", "Gold IV", "Gold III", "Gold II", "Gold I", "Platinum V", "Platinum IV", "Platinum III", "Platinum II", "Platinum I", "Diamond V", "Diamond IV", "Diamond III", "Diamond II", "Diamond I", "Challenger V", "Challenger IV", "Challenger III", "Challenger II", "Challenger I";setarray .lolpvpkillsrank[0],00, // Unranked 10,10,15,20,25, // Bronze 30,35,40,45,50, // Silver 55,60,65,70,75, // Gold 80,85,90,95,100, // Platinum 105,110,115,120,125, // Diamond 130,135,140,145,150; // Challengerend;} -
What controls "water" in skill_require_db.txt
GmOcean replied to Zirius's question in General Server Support
Well, incases like WZ_Waterball, it checks to see if the cell type your standing on is water type. if( src->type != BL_PC || map->getcell(src->m,x,y,CELL_CHKWATER) ) // non-players bypass the water requirement count++; // natural water cell else if( (su = map->find_skill_unit_oncell(src,x,y,SA_DELUGE,NULL,1)) != NULL || (su = map->find_skill_unit_oncell(src,x,y,NJ_SUITON,NULL,1)) != NULL ) { count++; // skill-induced water cell skill->delunit(su); // consume cell } However, with AL_HOLYWATER and AB_ANCILLA, there isn't a check atleast, not one directly correlated with it's titles. It just says to produce them at 100%. case AL_HOLYWATER: /** * Arch Bishop **/ case AB_ANCILLA: make_per = 100000; //100% success break; There isn't a check in skill.c for water type, it might be else where but I don't know where to look. -
It'd probably just be better to create a " third " storage for characters. Much like we did for guildstorage. Although, that would take up alot of storage space on server's since, now there'd be a storage for every character, account and guild. On average thats about: Every 20 accounts = 1 Guild storage Every 1 Account = 1 Account Storage Every 1 Account = 3-9 Character Storage. It'll be alot of data added in but better in the long run. Also, an alternative would be to store the ID inside of a data space which we add it items. So instead of it saying item.bound = 1->4. We can have it check against character ID / Account id if not then bound type. if( item.bound == 2 ){ guild bound; } else if( item.bound == 3 ){ party bound; } else if( item.bound >= 150000 && item.bound <= 1999999 ) { char bound; } else if( item.bound >= 2000000 ){ account bound; } else { not bound; } But, thats meh. Just my thoughts.
-
I"d write a plugin for it if I could but I'm not that skilled at src lol. But yeah, I understand what the bound types do, it's just I think in some cases servers bind items to indivisual characters so as to make the quest or process of aquiring that item, not a 1 time thing. Making them have to redo it to gear out their other characters. I myself use this sort of tactic to add replay value for my players.
-
Currently, no one knows how to change that. It's a client limitation until we can find the proper hex code and make a diff for it. For now people will just have to drag the corner of the window to increase it's size or maximize it :/
-
Yes it would but i'd have to look up the storage info to see how it's blocked first. Edit: Okay it seems that the clif_storageitemadded to add items, doesn't support bound item types in it's packet. However, I can't seem to find that actual code that limits or performs the check on whether or not a bound item can be placed or not. Edit2: Okay I found it, but understand that without further modifications you'd be able to effectively: store a bound item into storage -> grab it on a different character and then equip it. Making Character Bound type items useless. Your going to need to modify the way bound items work as whole. Because you see currently all bound items check is for a number 0->4. If it's 1->4 it's bound, 0 it's not. Each number determines what TYPE of bound item it is. But nothing is stored to check WHO the item is bound to. We just decided it'd be simpler to just say, " hey your item is character bound, you can't remove it from your inventory.". At anyrate here is the code that deals with storage. Find it and then comment out the section regarding bound items. /*========================================== * Internal add-item function. *------------------------------------------*/int storage_additem(struct map_session_data* sd, struct item* item_data, int amount) { struct storage_data* stor = &sd->status.storage; struct item_data *data; int i; if( item_data->nameid <= 0 || amount <= 0 ) return 1; data = itemdb->search(item_data->nameid); if( data->stack.storage && amount > data->stack.amount ) {// item stack limitation return 1; } if( !itemdb_canstore(item_data, pc_get_group_level(sd)) ) { //Check if item is storable. [Skotlex] clif->message (sd->fd, msg_txt(264)); return 1; } if( item_data->bound > IBT_ACCOUNT && !pc_can_give_bound_items(sd) ) { clif->message(sd->fd, msg_txt(294)); return 1; } if( itemdb->isstackable2(data) ) {//Stackable for( i = 0; i < MAX_STORAGE; i++ ) { if( compare_item(&stor->items[i], item_data) ) {// existing items found, stack them if( amount > MAX_AMOUNT - stor->items[i].amount || ( data->stack.storage && amount > data->stack.amount - stor->items[i].amount ) ) return 1; stor->items[i].amount += amount; clif->storageitemadded(sd,&stor->items[i],i,amount); return 0; } } } // find free slot ARR_FIND( 0, MAX_STORAGE, i, stor->items[i].nameid == 0 ); if( i >= MAX_STORAGE ) return 1; // add item to slot memcpy(&stor->items[i],item_data,sizeof(stor->items[0])); stor->storage_amount++; stor->items[i].amount = amount; clif->storageitemadded(sd,&stor->items[i],i,amount); clif->updatestorageamount(sd, stor->storage_amount, MAX_STORAGE); return 0;} Comment out this section: // if( item_data->bound > IBT_ACCOUNT && !pc_can_give_bound_items(sd) ) {// clif->message(sd->fd, msg_txt(294));// return 1;// }
-
Maybe not -1 sprite, but you could go with the ( i think 111? or 139 *think this is the hidden warp portal* ). But the difference would be your hiding it to ALL players by just simply changing the sprite. With the masking it'd be only certain players. But yes, it would be possible to simulate this effect somewhat using sprite id 111 and variable check to just end the script. Edit: Oh lol, i see your asking about using the sprite in combination with the plugin (you just didn't install it yet -.-; feel like an idiot now lol !!) but the same methods should still apply by simply using 111 as the sprite id if -1 doesn't work.
-
If you mean from the { script }, { OnEquip Script }, { UnEquip Script } part of an item, then currently no. Atleast not without the use of a custom command to return those as a string you can compare against. This also applies to whether or not your checking to see if a person can equip it based on Class or required level. For the latter 2 you could just do something like: if( equip(itemid) ) { unequip(itemid); do this; do that; end;} else { you can't wear this item. close;}
-
Oh this would be very useful for quest type scripts where a player completes a certain phase and such. Like also making a player have access to a shop based on whether or not the did X or Y. Instead of just having the NPC be unresponsive or say something like you can't use this. Nice work.
-
I thought about it. But decided to save it for a future version just to see how this and my monster search sits well with users D: these 2 scripts were mainly just a test of the hyperlink uses anyways lol. Along with some experimental looping for future scripts =p. Learned a few things too, like apparently even if the loop isn't technically an infinite loop, it'll still throw an error if it's somewhere around 1000+ so. Thats why you see freeloop() being used.
-
File Name: Item Search File Submitter: GmOcean File Submitted: 13 Oct 2014 File Category: Utility ============================================================= Description ============================================================= This script will allow users to search information about an item in-game. Supports both renewal/non-renewal items. It will show the exact item if using the search directory function. If however using the input method, this script will will run a broadened search, or pull up the exact item if an item ID is given instead of a name. ============================================================= Features ============================================================= Choose between what website you want your server to use. Or simply leave that upto your players by enabling all sites. ============================================================= NOTE - Requires a client from 2011-10-10aRagexe.exe onwards. NOTE2 - RateMyServer Link does not support custom items. ============================================================= Click here to download this file
-
Version v0.7
340 downloads
============================================================= Description ============================================================= This script will allow users to search information about an item in-game. Supports both renewal/non-renewal items. It will show the exact item if using the search directory function. If however using the input method, this script will will run a broadened search, or pull up the exact item if an item ID is given instead of a name. ============================================================= Features ============================================================= Choose between what website you want your server to use. Or simply leave that upto your players by enabling all sites. ============================================================= NOTE - Requires a client from 2011-10-10aRagexe.exe onwards. NOTE2 - RateMyServer Link does not support custom items. ============================================================= -
Well, then you need a custom command. So your going to need to edit src code.
-
Script Error : script:set_reg: failed to set param 'Zeny' to -100.
GmOcean replied to Dolphincute's question in Script Support
I can't reproduce your problem. Something else must be going on. Also it seems your original script was charging the owner zeny even if they were just changing the settings. This included collecting zeny. Resulting in getting 1 payment less. I cleaned that issue up. prontera,155,181,5 script Healer#rent 757,{ // item to rent NPC .@item_id = 7539; // rent NPC for how many days .@rent_day = 30; .@aid = getcharid(3); if ( getd(".rent_aid"+strnpcinfo(3)+"") && getd(".rent_duration"+strnpcinfo(3)+"") > gettimetick(2) ) { if ( getd(".rent_aid"+strnpcinfo(3)+"") == .@aid ) { if ( select( "Continue","Set Healer Cost","Collect Zeny" ) == 2 ) { input .@rental_cost; setd ".rental_cost"+strnpcinfo(3)+"", .@rental_cost; } else if ( @menu == 3 ) { Zeny += getd(".rental_accumulate"+strnpcinfo(3)+""); dispbottom "Collected "+getd(".rental_accumulate"+strnpcinfo(3)+"")+" Zeny"; setd ".rental_accumulate"+strnpcinfo(3)+"", 0; close; } } if ( getd(".rental_cost"+strnpcinfo(3)+"") ) { dispbottom "Healing Cost: "+getd(".rental_cost"+strnpcinfo(3)+"")+" Zeny"; if ( Zeny < getd(".rental_cost"+strnpcinfo(3)+"") ) close; Zeny -= getd(".rental_cost"+strnpcinfo(3)+""); setd ".rental_accumulate"+strnpcinfo(3)+"", getd(".rental_accumulate"+strnpcinfo(3)+"") + getd(".rental_cost"+strnpcinfo(3)+""); } percentheal 100,100; // your desired buff heres } else if ( countitem( .@item_id ) ) { mes "Rent Healer NPC ?"; mes "Rental Cost: 1 x "+getitemname( .@item_id ); if ( select( "Yes","No" ) == 1 ) { delitem .@item_id,1; setd ".rent_aid"+strnpcinfo(3)+"", .@aid; setd ".rent_duration"+strnpcinfo(3)+"", gettimetick(2) + ( .@rent_day * 86400 ); mes "NPC belong to you."; } } else { mes "NPC isnt available."; mes "Rental Cost: 1 x "+getitemname( .@item_id ); } close;}prontera,155,181,5 duplicate(rent) Healer#rent1 757 As for duplicates check the bottom of the script for the syntax. -
Infinityloop... must mean theres too much being requested at one time. I'll add a fix.... Edit: This should fix it. Just added freeloop(1) at the begining and freeloop(0) at the end. - script at_sameip -1,{OnInit:bindatcmd "sameip",strnpcinfo(3)+"::OnAtSameIP";//,99,99,0; // 0 = No log, 1 = Log usageend;OnAtSameIP:freeloop(1);.@size = query_sql("SELECT `account_id` FROM `char` WHERE `online` = '1' AND `last_map` = '"+ strcharinfo(3) +"'",.@acct_id);.@size2 = query_sql("SELECT `account_id`, `last_ip` FROM `login` WHERE `account_id` != '1'", .@aid, .@ip$);while( .@a < .@size ) { for( .@i = 0; .@i < getarraysize(.@aid); .@i++ ) { if( .@aid[.@i] == .@acct_id[.@a] ) { .@tempaid$[.@a] = ""+ .@aid[.@i] +""; .@tempaip$[.@a] = .@ip$[.@i]; } } .@a++;}.@size3 = getarraysize(.@tempaid$);while( .@c != .@size3 ) { for( .@i = 0; .@i < getarraysize( .@usedaids$ ); .@i++ ) { if( .@usedaids$[.@i] == .@tempaid$[.@c] ) { //Account ID already in array. .@used = 1; } } if( !.@used ) { .@usedaids$[( getarraysize( .@usedaids$ ) + 1 )] = .@tempaid$[.@c]; .@duplicateaid$[.@c] = "Account IDs: "+ .@tempaid$[.@c] +""; .@duplicaterid2name$[.@c] = "Character Names: "+ rid2name( atoi( .@tempaid$[.@c] ) ) +""; .@duplicateaip$[.@c] = "IP Address: "+ .@tempaip$[.@c] +""; for( .@i = 0; .@i < getarraysize( .@tempaid$ ); .@i++ ) { if( .@tempaip$[.@c] == .@tempaip$[.@i] && .@tempaid$[.@c] != .@tempaid$[.@i] ) { .@duplicateaid$[.@c] = .@duplicateaid$[.@c] +", "+ .@tempaid$[.@i] +""; .@duplicaterid2name$[.@c] = .@duplicaterid2name$[.@c] +", "+ rid2name( atoi( .@tempaid$[.@i] ) ) +""; .@usedaids$[( getarraysize( .@usedaids$ ) + 1 )] = .@tempaid$[.@i]; } } } .@used = 0; .@c++; }dispbottom "---------------- List of Same IP User ----------------";dispbottom "---------------------- "+ setchar( strcharinfo(3), strtoupper(charat(strcharinfo(3),0)), 0 ) +" ----------------------";for( .@i = 0; .@i < getarraysize(.@duplicateaid$); .@i++ ) { if( .@duplicateaid$[.@i] != "" ) { dispbottom " "; dispbottom .@duplicateaip$[.@i]; dispbottom .@duplicateaid$[.@i]; dispbottom .@duplicaterid2name$[.@i]; } }freeloop(0);end;}
-
Script Error : script:set_reg: failed to set param 'Zeny' to -100.
GmOcean replied to Dolphincute's question in Script Support
prontera,155,181,5 script Healer#rent 757,{ // item to rent NPC .@item_id = 7539; // rent NPC for how many days .@rent_day = 30; .@aid = getcharid(3); if ( getd(".rent_aid"+strnpcinfo(3)+"") && getd(".rent_duration"+strnpcinfo(3)+"") > gettimetick(2) ) { if ( getd(".rent_aid"+strnpcinfo(3)+"") == .@aid ) { if ( select( "Continue","Set Healer Cost","Collect Zeny" ) == 2 ) { input .@rental_cost; setd ".rental_cost"+strnpcinfo(3)+"", .@rental_cost; } else if ( @menu == 3 ) { Zeny += getd(".rental_accumulate"+strnpcinfo(3)+""); dispbottom "Collected "+getd(".rental_accumulate"+strnpcinfo(3)+"")+" Zeny"; setd ".rental_accumulate"+strnpcinfo(3)+"", 0; } } if ( getd(".rental_cost"+strnpcinfo(3)+"") ) { dispbottom "Healing Cost: "+getd(".rental_cost"+strnpcinfo(3)+"")+" Zeny"; if ( Zeny < getd(".rental_cost"+strnpcinfo(3)+"") ) close; Zeny -= getd(".rental_cost"+strnpcinfo(3)+""); $rental_accumulate += getd(".rental_cost"+strnpcinfo(3)+""); } percentheal 100,100; // your desired buff heres } else if ( countitem( .@item_id ) ) { mes "Rent Healer NPC ?"; mes "Rental Cost: 1 x "+getitemname( .@item_id ); if ( select( "Yes","No" ) == 1 ) { delitem .@item_id,1; setd ".rent_aid"+strnpcinfo(3)+"", .@aid; setd ".rent_duration"+strnpcinfo(3)+"", gettimetick(2) + ( .@rent_day * 86400 ); mes "NPC belong to you."; } } else { mes "NPC isnt available."; mes "Rental Cost: 1 x "+getitemname( .@item_id ); } close;} -
Version v0.8
243 downloads
============================================================= Description ============================================================= This script will allow users to search information about a monster in-game, and then open up a page to that exact mob on ratemyserver.net. Works for both re/non-re monsters. ============================================================= Features ============================================================= Choose between what website you want your server to use. Or simply leave that upto your players by enabling all sites. ============================================================= NOTE - Requires a client from 2011-10-10aRagexe.exe onwards. NOTE2 - RateMyServer Link does not support custom mobs. ============================================================= -
Requires a src edit. Open CLIF.C & find: /// Presents list of items, that can be sold to an NPC shop (ZC_PC_SELL_ITEMLIST)./// 00c7 <packet len>.W { <index>.W <price>.L <overcharge price>.L }*void clif_selllist(struct map_session_data *sd){ int fd,i,c=0,val; nullpo_retv(sd); fd=sd->fd; WFIFOHEAD(fd, MAX_INVENTORY * 10 + 4); WFIFOW(fd,0)=0xc7; for( i = 0; i < MAX_INVENTORY; i++ ) { if( sd->status.inventory[i].nameid > 0 && sd->inventory_data[i] ) { if( !itemdb_cansell(&sd->status.inventory[i], pc_get_group_level(sd)) ) continue; if( sd->status.inventory[i].expire_time ) continue; // Cannot Sell Rental Items if( sd->status.inventory[i].bound && !pc_can_give_bound_items(sd)) continue; // Don't allow sale of bound items val=sd->inventory_data[i]->value_sell; if( val < 0 ) continue; WFIFOW(fd,4+c*10)=i+2; WFIFOL(fd,6+c*10)=val; WFIFOL(fd,10+c*10)=pc->modifysellvalue(sd,val); c++; } } WFIFOW(fd,2)=c*10+4; WFIFOSET(fd,WFIFOW(fd,2));} Comment out these lines: ( e.g: // This is commented. if( sd->status.inventory[i].bound && !pc_can_give_bound_items(sd)) continue; // Don't allow sale of bound items Should look like this: /// Presents list of items, that can be sold to an NPC shop (ZC_PC_SELL_ITEMLIST)./// 00c7 <packet len>.W { <index>.W <price>.L <overcharge price>.L }*void clif_selllist(struct map_session_data *sd){ int fd,i,c=0,val; nullpo_retv(sd); fd=sd->fd; WFIFOHEAD(fd, MAX_INVENTORY * 10 + 4); WFIFOW(fd,0)=0xc7; for( i = 0; i < MAX_INVENTORY; i++ ) { if( sd->status.inventory[i].nameid > 0 && sd->inventory_data[i] ) { if( !itemdb_cansell(&sd->status.inventory[i], pc_get_group_level(sd)) ) continue; if( sd->status.inventory[i].expire_time ) continue; // Cannot Sell Rental Items // if( sd->status.inventory[i].bound && !pc_can_give_bound_items(sd))// continue; // Don't allow sale of bound items val=sd->inventory_data[i]->value_sell; if( val < 0 ) continue; WFIFOW(fd,4+c*10)=i+2; WFIFOL(fd,6+c*10)=val; WFIFOL(fd,10+c*10)=pc->modifysellvalue(sd,val); c++; } } WFIFOW(fd,2)=c*10+4; WFIFOSET(fd,WFIFOW(fd,2));} Save and Recompile. All done. you can now sell bound items.
-
Script Error : script:set_reg: failed to set param 'Zeny' to -100.
GmOcean replied to Dolphincute's question in Script Support
Find this: if ( Zeny < $rent_cost ) close; Change to: if ( Zeny < $rental_cost ) close; Was just a small typo. It was checking to see if your Zeny was less than the variable, if so do nothing. However, the variable it was checking was 0. So it'd say you had enough zeny and then attempted to subtract some. Easy mistake, easy fix. -
You mean this? in battle/skill.conf // Grandcross Settings (Don't mess with these)// If set to no, hit interval is increased based on the amount of mobs standing on the same cell// (means that when there's stacked mobs in the same cell, they won't receive all hits)gx_allhit: no// Grandcross display type (Default 1)// 0: Yellow character// 1: White charactergx_disptype: 1 ??