Jump to content

GmOcean

Community Contributors
  • Content Count

    371
  • Joined

  • Last visited

  • Days Won

    8

Everything posted by GmOcean

  1. GmOcean

    NPC Buy/Sell

    Here you go D:, I don't have time to make a video atm. But I'll try and get 1 up soon.
  2. There already programs / bots that can answer reCaptcha successfully 100% of the time. All openkore needs to do is borrow that code or hook into those programs. Very easily done for a group of people dedicated to making these bots work.
  3. GmOcean

    NPC Buy/Sell

    Okay, I added the patch file to my first post D: now to dive into my next idea... add overflow zeny from vending directly into Client's integrated bank feature.
  4. D: Well, usually I just click... Download Zip >.>; and go from there lmao. But, I guess I should get it through tortisegit, it would allow me to update to newer versions hassle free. *sigh* time to transfer scripts and shiz over...
  5. Patch file.... I must learn 1 new thing at a time. Googles (how to make patch file). XD
  6. Oh? I like the sound of this. I never really used this because it was limited to ratio drop rate. But with a fixed rate option that'd be useful, I could remove the use of the scripts I use to simulate it. But, I feel that this would still be missing 1 more optional field: Mapname. So that we can specify What Item, and what rate, that rate, the monster, and the map that it should only affect. To use the same example of above: 909,0,100,1002 // Jellopies from ALL Porings will drop with a 1x ratio drop rate. 909,1,100,1002, pay_fild04 // Jellopies from Porings on the map pay_fild04 will drop with a 0.1% fixed drop rate.
  7. GmOcean

    NPC Buy/Sell

    Okay, what it does is this: 1. Any items you sell to an NPC ( A normal NPC doesn't support NPCs used through CallShop ), will get added to a SQL table. 2. When you use CallShop npc_name, 3; it will give those items back to you with an expiration date and bind them to your player. 3. It will then open a Sell window (sadly buy windows don't support detailed items) and then create a list of items based off of those that are both BOUND to your character and have an expiration time. ( Currently not possible unless you use my command ). 4. After that, you just choose the items you want to buy, and click SELL ( yeah lol, I know T.T ), and it'll give you those items back at the cost of the zeny. 5. The items you don't buy, will expire. And the items you did buy will be removed from the SQL table OR updated to show the new amount. Lastly, the items you buy will be a permanent version, unbound and with no expiration time. If you use the sample script and leave the logout_clear, then it will delete all records of that character from the SQL table. ( Most MMO's do this so I like it xD ). Edit: I'll post back with ScreenShots when I get time... For now DINNER !!
  8. You could edit: /// Response to the death/system menu (CZ_RESTART)./// 00b2 <type>.B/// type:/// 0 = restart (respawn)/// 1 = char-select (disconnect)void clif_parse_Restart(int fd, struct map_session_data *sd) { switch(RFIFOB(fd,2)) { case 0x00: pc->respawn(sd,CLR_OUTSIGHT); break; case 0x01: /* Rovert's Prevent logout option - Fixed [Valaris] */ if( !sd->sc.data[SC_CLOAKING] && !sd->sc.data[SC_HIDING] && !sd->sc.data[SC_CHASEWALK] && !sd->sc.data[SC_CLOAKINGEXCEED] && !sd->sc.data[SC__INVISIBILITY] && (!battle_config.prevent_logout || DIFF_TICK(timer->gettick(), sd->canlog_tick) > battle_config.prevent_logout) ) { //Send to char-server for character selection. chrif->charselectreq(sd, session[fd]->client_addr); } else { clif->disconnect_ack(sd, 1); } break; }} To just not work in BG's or resurrect you at that spot. void clif_parse_Restart(int fd, struct map_session_data *sd) { switch(RFIFOB(fd,2)) { case 0x00: if( sd->bg_id ) { if( !pc_isdead(sd) ) return; status->revive(&sd->bl, 100, 100); clif->skill_nodamage(&sd->bl,&sd->bl,ALL_RESURRECTION,4,1); break; } else { pc->respawn(sd,CLR_OUTSIGHT); break; } case 0x01: /* Rovert's Prevent logout option - Fixed [Valaris] */ if( !sd->sc.data[SC_CLOAKING] && !sd->sc.data[SC_HIDING] && !sd->sc.data[SC_CHASEWALK] && !sd->sc.data[SC_CLOAKINGEXCEED] && !sd->sc.data[SC__INVISIBILITY] && (!battle_config.prevent_logout || DIFF_TICK(timer->gettick(), sd->canlog_tick) > battle_config.prevent_logout) ) { //Send to char-server for character selection. chrif->charselectreq(sd, session[fd]->client_addr); } else { clif->disconnect_ack(sd, 1); } break; }} You just gotta add the 10second timer there so if they do CLICK the button, it'll need to wait 10seconds D:
  9. GmOcean

    NPC Buy/Sell

    Okay, this is officially done. Unless of course you see something else that needs to get done or should be changed? At any rate, thank you for all your help Annieruru @.@; I absolutely could not have done this without your help. And definitely not within the time that I did do this in, despite how long it took lmao. Though, since this seems like a rigged patch to make something work, I don't think I'll be making an official src release for it. Perhaps I'll just let the src code sit here D: Especially since there are a few hiccups that need to be fixed. Such as the issues you ran into when you tried a few years ago: Inventory space, weight, drop item on floor... etc... But these can all be handled through the script side.
  10. GmOcean

    NPC Buy/Sell

    See the First post to get the patch file. *Hiding this post in spoiler since patch is uploaded. But gonna keep this information here*
  11. GmOcean

    NPC Buy/Sell

    Wait, what? How does the src code for your modified waiting room help me? I understand, that it goes to SRC then SRC tells it to go back to script, which will then run w/e, but i'm trying to eliminate the need of an npc script as much as possible. I was thinking maybe instead of running the Query everytime an item is sold for each and every item, maybe I could just run a smaller query for just the last 10 items. int npc_selllist(struct map_session_data* sd, int n, unsigned short* item_list) { double z; int i,skill_t, skill_idx = skill->get_index(MC_OVERCHARGE); struct npc_data *nd; int w, new_; //BuyBack Feature uint64 last_sold; //BuyBack Feature nullpo_retr(1, sd); nullpo_retr(1, item_list); if( ( nd = npc->checknear(sd, map->id2bl(sd->npc_shopid)) ) == NULL ) { return 1; } if( nd->subtype != SHOP ) { if( !(nd->subtype == SCRIPT && nd->u.scr.shop && nd->u.scr.shop->type == NST_ZENY) ) return 1; } if( pc_readglobalreg( sd, script->add_str( "buyback" ) ) ) { w = 0; new_ = 0; } z = 0; // verify the sell list for( i = 0; i < n; i++ ) { int nameid, amount, idx, value; idx = item_list[i*2]-2; amount = item_list[i*2+1]; if( idx >= MAX_INVENTORY || idx < 0 || amount < 0 ) { return 1; } nameid = sd->status.inventory[idx].nameid; if( !nameid || !sd->inventory_data[idx] || sd->status.inventory[idx].amount < amount ) { return 1; } if( !pc_readglobalreg( sd, script->add_str( "buyback" ) ) ) { //Buyback feature doesn't support script-controlled shops. if( nd->master_nd ) {// Script-controlled shops decide by themselves, what can be sold and at what price. continue; } } if( pc_readglobalreg( sd, script->add_str( "buyback" ) ) ) { //BuyBack Feature value = sd->inventory_data[idx]->value_buy; //No Discount when buying back. w+= itemdb_weight(nameid) * amount; } else { value = pc->modifysellvalue(sd, sd->inventory_data[idx]->value_sell); } z+= (double)value*amount; } if( !pc_readglobalreg( sd, script->add_str( "buyback" ) ) ) { //Only works if NOT BuyBack Feature. (Currently not supported until official works). if( nd->master_nd ) { // Script-controlled shops return npc->selllist_sub(sd, n, item_list, nd->master_nd); } } if( pc_readglobalreg( sd, script->add_str( "buyback" ) ) ) { //BuyBack Feature if( z > (double)sd->status.zeny ) return 1; // Not Enough Zeny if( w + sd->weight > sd->max_weight ) return 2; // Too heavy if( pc->inventoryblank(sd) < new_ ) return 3; // Not enough space to store items pc->payzeny(sd,(int)z,LOG_TYPE_NPC, NULL); // add items for( i = 0; i < n; i++ ) { int amount, idx; struct item it; idx = item_list[i*2]-2; amount = item_list[i*2+1]; it.nameid = sd->status.inventory[idx].nameid; it.amount = sd->status.inventory[idx].amount; it.equip = 0; //Don't equip. it.identify = sd->status.inventory[idx].identify; it.refine = sd->status.inventory[idx].refine; it.attribute = sd->status.inventory[idx].attribute; it.card[0] = sd->status.inventory[idx].card[0]; it.card[1] = sd->status.inventory[idx].card[1]; it.card[2] = sd->status.inventory[idx].card[2]; it.card[3] = sd->status.inventory[idx].card[3]; it.expire_time = sd->status.inventory[idx].expire_time; // Normally can't sell Rental Items. it.bound = sd->status.inventory[idx].bound; // Normally can't sell Bound Items. //Do the below so player has enough inventory space. (Probably not needed since we do the check above). pc->delitem(sd, idx, amount, 0, 6, LOG_TYPE_NPC); //Delete the Item With Expiration & Bound first. if( SQL->Query( map->mysql_handle, "DELETE FROM buyback WHERE char_id = %d AND nameid = %d AND amount = %d AND identify = %d AND refine = %d AND attribute = %d AND card1 = %d AND card2 = %d AND card3 = %d AND card4 = %d AND bound = %d AND expire_time = %d", sd->status.char_id, sd->status.inventory[idx].nameid, sd->status.inventory[idx].amount, sd->status.inventory[idx].identify, sd->status.inventory[idx].refine, sd->status.inventory[idx].attribute, sd->status.inventory[idx].card[0], sd->status.inventory[idx].card[1], sd->status.inventory[idx].card[2], sd->status.inventory[idx].card[3], sd->status.inventory[idx].bound, sd->status.inventory[idx].expire_time ) == SQL_ERROR ) { Sql_ShowDebug( map->mysql_handle ); } it.expire_time = it.bound = 0; //Set Expiration and Bound to 0 pc->additem(sd, &it, amount, LOG_TYPE_NPC); // Add the item to inventory without Expiration and Bound } } else { //Run SQL->Query to obtain number of rows player has, then we adjust id to +1 and then to 1 if above 10. if( SQL->Query( map->mysql_handle, "SELECT * FROM buyback WHERE char_id = %d", sd->status.char_id ) == SQL_ERROR ) { Sql_ShowDebug( map->mysql_handle ); } else { last_sold = SQL->NumRows( map->mysql_handle ); //Set ID to number of rows pulled from SQL. } // delete items for( i = 0; i < n; i++ ) { int amount, idx; idx = item_list[i*2]-2; amount = item_list[i*2+1]; last_sold++; // +1 From the information gathered above. if( last_sold > 10 ){ last_sold = 1; } //Reset to 1 to keep buyback items to 10. if( sd->inventory_data[idx]->type == IT_PETEGG && sd->status.inventory[idx].card[0] == CARD0_PET ) { if( pet->search_petDB_index(sd->status.inventory[idx].nameid, PET_EGG) >= 0 ) { intif->delete_petdata(MakeDWord(sd->status.inventory[idx].card[1], sd->status.inventory[idx].card[2])); } } // Attempt to delete the previous information if it exists, and then insert the new information in its place. if( SQL->Query( map->mysql_handle, "DELETE FROM buyback WHERE char_id = %d AND last_sold = %d", sd->status.char_id, last_sold ) == SQL_ERROR ) continue; //Store the Item into a SQL Table for SQL to use. (Need to figure out how to limit to last 10). if( SQL->Query( map->mysql_handle, "INSERT INTO buyback (char_id, nameid, amount, identify, refine, attribute, card1, card2, card3, card4, bound, expire_time, last_sold) VALUES ( %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d )", sd->status.char_id, sd->status.inventory[idx].nameid, sd->status.inventory[idx].amount, sd->status.inventory[idx].identify, sd->status.inventory[idx].refine, sd->status.inventory[idx].attribute, sd->status.inventory[idx].card[1], sd->status.inventory[idx].card[2], sd->status.inventory[idx].card[3], sd->status.inventory[idx].card[4], sd->status.inventory[idx].bound, sd->status.inventory[idx].expire_time, last_sold ) == SQL_ERROR ) { Sql_ShowDebug( map->mysql_handle ); } else { pc->delitem(sd, idx, amount, 0, 6, LOG_TYPE_NPC); } } if( z > MAX_ZENY ) z = MAX_ZENY; pc->getzeny(sd, (int)z, LOG_TYPE_NPC, NULL); if( !pc_readglobalreg( sd, script->add_str( "buyback" ) ) ) { //BuyBack feature doesn't support shop EXP gain of any kind. This is an intended feature. // custom merchant shop exp bonus if( battle_config.shop_exp > 0 && z > 0 && ( skill_t = pc->checkskill2(sd,skill_idx) ) > 0) { if( sd->status.skill[skill_idx].flag >= SKILL_FLAG_REPLACED_LV_0 ) skill_t = sd->status.skill[skill_idx].flag - SKILL_FLAG_REPLACED_LV_0; if( skill_t > 0 ) { z = z * (double)skill_t * (double)battle_config.shop_exp/10000.; if( z < 1 ) z = 1; pc->gainexp(sd, NULL, 0, (int)z, false); } } } } pc->setregistry(sd, script->add_str( "buyback" ), 0); // Set buyback player variable to 0 to reset whether or not they are using a buyback shop return 0;} That's what I have so far. Don't mind the sql query right before pc->additem, i'm still trying to get that one to work... Can't figure out why it won't work OR a more effective method. So would it be possible to take the sql query section of this and make it run for only the last 10 items? for( i = 0; i < n; i++ ) { int amount, idx; idx = item_list[i*2]-2; amount = item_list[i*2+1]; last_sold++; // +1 From the information gathered above. if( last_sold > 10 ){ last_sold = 1; } //Reset to 1 to keep buyback items to 10. // Attempt to delete the previous information if it exists, and then insert the new information in its place. if( SQL->Query( map->mysql_handle, "DELETE FROM buyback WHERE char_id = %d AND last_sold = %d", sd->status.char_id, last_sold ) == SQL_ERROR ) continue; //Store the Item into a SQL Table for SQL to use. (Need to figure out how to limit to last 10). if( SQL->Query( map->mysql_handle, "INSERT INTO buyback (char_id, nameid, amount, identify, refine, attribute, card1, card2, card3, card4, bound, expire_time, last_sold) VALUES ( %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d )", sd->status.char_id, sd->status.inventory[idx].nameid, sd->status.inventory[idx].amount, sd->status.inventory[idx].identify, sd->status.inventory[idx].refine, sd->status.inventory[idx].attribute, sd->status.inventory[idx].card[1], sd->status.inventory[idx].card[2], sd->status.inventory[idx].card[3], sd->status.inventory[idx].card[4], sd->status.inventory[idx].bound, sd->status.inventory[idx].expire_time, last_sold ) == SQL_ERROR ) { Sql_ShowDebug( map->mysql_handle ); } else { continue; } } Obviously, I would need to get the final result of the loop run on the delete, but I wouldn't know where that is, because of how the loop is. for( i = 0; i < n; i++ ) i guess I should say, I don't know what the Value of n is. I can't seem to find it anywhere other than it's an int. Does that give it an inherent value of 32758 (or the number thats close to that lol)?
  12. GmOcean

    NPC Buy/Sell

    Okay, I made a few changes to it and it works, but it seems like whenever a player sells the items to the shop, which is then updated/inserted to the sql table from within the source that individual player lags anywhere from 1-5seconds depending on the amount of items they are selling. On average 100 separate items results in 3-5second delay. However this delay only applies to the character taking action, everything else will update as normal. Obviously it's because I'm running 2 queries per item, since update on duplicate key won't work for my particular situation. (it does now indeed work though). Is there anyway I can have the source code run the sql script as if it were being run in the background, like how npc scripts do?
  13. This topic is getting further and further away from Script Requests but w/e. You can't just apply a patch to a client as easily as you might think. Your best options have been presented before you. Your going to have to pick one or none at all.
  14. GmOcean

    NPC Buy/Sell

    Well, I've managed to make this come a far way, but I'm having a slight issue with SQL atm, and I don't know why it's doing this. Heres the code i'm currently using: // Attempt to delete the previous information if it exists, and then insert the new information in its place. if( SQL->Query( map->mysql_handle, "DELETE FROM buyback WHERE id = %d AND char_id = %d", id, sd->status.char_id ) == SQL_ERROR ) continue; //Store the Item into a SQL Table for SQL to use. (Need to figure out how to limit to last 10). if( SQL->Query( map->mysql_handle, "INSERT INTO buyback (id, char_id, nameid, amount, identify, refine, attribute, card1, card2, card3, card4, bound, expire_time) VALUES ( %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d )", id, //ID used to limit last sold to 10 items. (Can be modified below). sd->status.char_id, sd->status.inventory[idx].nameid, sd->status.inventory[idx].amount, sd->status.inventory[idx].identify, sd->status.inventory[idx].refine, sd->status.inventory[idx].attribute, sd->status.inventory[idx].card[1], sd->status.inventory[idx].card[2], sd->status.inventory[idx].card[3], sd->status.inventory[idx].card[4], sd->status.inventory[idx].bound, sd->status.inventory[idx].expire_time ) == SQL_ERROR ) { Sql_ShowDebug( map->mysql_handle ); } You'll see that in the above, I delete a row if it already exists, and then insert new information back in. I do it this way, because it seems that Herc doesn't support " ON DUPLICATE KEY UPDATE X = %d ", atleast all my attempts were fails with that. But the issue I'm having is that it's not updating the information in the correct columns. Namely it SKIPS the char_id column, and adds all the information 1 column over as you'll see below. id, char_id, nameid, amount, identify, refine, attribute, card1, card2, card3, card4, bound, expire_time'1', '0', '150001', '511', '1', '1', '0', '0', '0', '0', '0', '0', '0' It's completely beyond my reasoning atm. It was working fine BEFORE I added in the DELETE query, but now it's acting weird... any solutions?
  15. If they are giving you 000000000000000 mac address, then chances are they are running the client program through a sand box. Doing so will create a virtual machine that cannot be detected by 90% of client programs that try to prevent dual clienting. In fact, I've personally used sandboxing to dual client on servers that don't support it, using the client they give. But, this is a rare situation as most players of RO wouldn't think of it unless they've heard of it before.
  16. @ShogS - This has already been explained. While IP address would work in most situations, a group of computers who use the same router will have the same IP address. Therefore they'd be excluded even if they were legitimate players on separate comps. Which is why a unique MacAddress would be ideal. So, your only bet here is to either disable the use of dual clients OR allow multiple users through IP address. Sorry, no real work around on this. Edit: Turns out a src edit was made to allow the grabbing of MacAddress. I don't know if it still works though. http://herc.ws/board/topic/4643-mac-ip-address/
  17. HWID? Hardware ID? Even if the client did transfer this information, you'd have to use a seperate patcher client to gather the information send it to a SQL database like FluxCP that your server would then be able to access. But on top of all that, it's not reliable. HWID is changed every few days (10 i think) and after every reboot of the computer. While they may be unique to each instance one is created, they get changed far too frequently to be of much use. Besides, I wouldn't even be able to begin explaining how to obtain a person's HWID through a program without the user's consent. I believe that would be a direct violation of Microsoft's Terms & Conditions D: best we not travel that road.
  18. So is it only that part? COMMON_OBJ = $(addprefix obj_all/, $(COMMON_SHARED_OBJ) console.o core.o malloc.o socket.o harmonycore.o) Or does the map/makein file fail as well? MAP_C = atcommand.c battle.c battleground.c buyingstore.c chat.c chrif.c clif.c date.c duel.c elemental.c guild.c harmony.c homunculus.c HPMmap.c instance.c intif.c irc-bot.c itemdb.c log.c mail.c map.c mapreg_sql.c mercenary.c mob.c npc.c npc_chat.c party.c path.c pc.c pc_groups.c pet.c quest.c script.c searchstore.c skill.c status.c storage.c /////// MAP_H = atcommand.h battle.h battleground.h buyingstore.h chat.h chrif.h clif.h date.h duel.h elemental.h guild.h harmony.h homunculus.h HPMmap.h instance.h intif.h irc-bot.h itemdb.h log.h mail.h map.h mapreg.h mercenary.h mob.h npc.h packets.h packets_struct.h party.h path.h pc.h pc_groups.h pet.h quest.h script.h searchstore.h skill.h If everything works as it is, then perhaps the patch only works for Hercules as it was back in May 2014, when this patch was released.
  19. GmOcean

    claw game

    While the initial idea seems fun, there isn't much room for interaction. You'd probably be better off giving them 4 movements, and each one having a less success chance then the other. e.g: First move = 100% Success Second Move = 70% Success Third Move = 50% Success Fourth Move = 20% Success. Then if all 4 moves are successful, give them the prize, otherwise fail. Perhaps even add a small animation for when it does grab something, and when it fails to grab something. I'm not going to write this one though, it doesn't " appeal " to my interests enough D:, but those are my thoughts on the script.
  20. Well, I didn't add it because I wasn't sure how the event took place or not. Whether it registered people or something, so I left it very bland and basic so it could be added to an existing script if thats what it was inteded to do :/ but you are right, I should have added them all logged so only a better could receive the prize.
  21. Do you have the rest of the files needed? Because that patch only works if you actually OWN a copy of harmony already.
  22. Right now, the plugin doesn't work. You'll have to use the patch until, Annieruru's suggestion for the plugin system gets added in.
  23. The patch already has those inside, + if ( !map->list[sd->bl.m].flag.town ) {+ clif->message( fd, "You can only use @market in a town.");+ return false;+ }+ if ( map->getcell( sd->bl.m, sd->bl.x, sd->bl.y, CELL_CHKNOCHAT ) ) {+ clif->message( fd, "You cannot use @market in this area.");+ return false;+ }+ if ( pc_isdead(sd) ) {+ clif->message( fd, "You can't create a Market clone while you are dead." );+ return false;+ }+ if ( npc->isnear( &sd->bl ) ) {+ clif->message( fd, "You can't create a Market clone too near to an npc." );+ return false;+ }
  24. GmOcean

    NPC Buy/Sell

    Lol, yeah. I'm using C++ 2010 @.@; As for, memset, I don't actually mind setting all the information myself, since this makes it easier for me to understand lol. I may not have been able to complete this with a successful creation ( set my first src creation too high xD ). But I did learn quite a bit, sadly I kept hitting an unbreakable client wall >.>; Edit: Okay, so I've decided to go with a small work around that IS working for now. Again this is the code block I'm currently using: However, currently I'm stuck at an issue, where the code block in npc.c replaces the original. I've tried creating my own block, but can't find the src where it points to it. For now I'm assuming that clicking the SELL button in a shop will always default to: npc_selllist So I decided to try checking for a variable the player may have set, but I don't think i'm doing it right, here's my code with the changes: Lastly the final problems i've arrived at is this: 1. I don't know how to set the variable to 0 from within the src code. I've tried looking at *set in script.c but I don't think I can apply those methods here. 2. As of right now, I have a script that gives players an item for 5seconds. However, if they don't " buy " those items before they expire, then it'll disappear from the shop window when attempting to interact with it. My guess is this is because it no longer exists in your inventory so the shop says it no longer exists. But I think this can be fixed if I can store that information in a separate array. Just I don't know how to make one in src. 3. If #2 isn't fixed with a separate array, then I need to do proper clean up, by increasing the expiration time and deleting the items should they click cancel. So, how do I tell if a player clicked cancel or not? I'd assume it'd be like *close or *close2 but I can't find it at all. Edit 2: Okay, i've got MOST of this all done now, i'd say I'm about 75-80% completely done with adding this in. I just need to know how to check to see if the player is currently using the shop. The reason is because, inorder to access the buyback feature, a variable is set to 1 " from an NPC ". Should the player complete the transaction by buying something, the src sets it to 0. BUT should they click cancel or close the shop from any other means then the variable is set to 1 still. I need to put the NPC on a loop, to check if they are using the NPC or not. Then thusly set to 0 when they aren't.
  25. GmOcean

    NPC Buy/Sell

    Okay, thank you Annieruru, that worked. At least I would go as far to say that I was able to finally make it give me the items displayed in the list. Now to tackle the issue of whether or not shops can indeed display data from a sql table. Here's the code block I used so far: Edit: Okay, I couldn't figure out how to make it work with SQL. Mainly because of what you said before Annieruru regarding WFIFOW(fd,4+c*10)=i+2; calling from inventory. I can't seem to overwrite that data to sql even if I were to manually set the data, the client still tries to pull inventory information. Regarding this, I know that MAX_INVENTORY is 100 ( by default ), I was thinking maybe there is a way to create a hidden 10+ slots that we can set ourselves, and actually give the players items in those slots only and then have the client only pull data from those last 10 slots since it would be inventory space. But, I came to the realization that it would be where you ended up... too many remaining issues, about whether or not a player closes shop, drops/deletes item, sells/buys, stores in cart etc.... Edit 2: However, your @marketclone & Your post here got me thinking. This all maybe possible using vending. If an NPC can have a chat window, then surely it must be able to have a vending window and a cart, the only real issue I can come across with this is, limiting what player can access that vending window.
×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.