Jump to content

MrUnzO

Members
  • Posts

    24
  • Joined

  • Last visited

Posts posted by MrUnzO

  1. Akkarin is right. You have to understand all of roBrowser code and understand how it works but I can point somethings to you, @simplyniceweb.

    The packets that i gave to you is for handle an outgoing to the server (that why you server accept the login) and after that server will replay an information to the client (roBrowser in this case) and the client need to understand the packets that its received from the server. in your picture I see the packet incoming is 0xac4 its a AC_ACCEPT_LOGIN3 (how I knew it? I just search that packet in rathena src folder and understand the structure of it) after i understand the packet structure I need to implement it in roBrowser like this.

    in the PacketStructure.js3

    // 0xac4
    	PACKET.AC.ACCEPT_LOGIN3 = function PACKET_AC_ACCEPT_LOGIN3(fp, end) {
    		this.AuthCode = fp.readLong();
    		this.AID = fp.readULong();
    		this.userLevel = fp.readULong();
    		this.lastLoginIP = fp.readULong();
    		this.lastLoginTime = fp.readBinaryString(26);
    		this.Sex = fp.readUChar();
    		var dummy = fp.readBinaryString(17);
    		this.ServerList = (function() {
    			var i, count=(end-fp.tell())/160|0, out=new Array(count);
    			for (i = 0; i < count; ++i) {
    				out[i] = {};
    				out[i].ip = fp.readULong();
    				out[i].port = fp.readUShort();
    				out[i].name = fp.readString(20);
    				out[i].usercount = fp.readUShort();
    				out[i].state = fp.readUShort();
    				out[i].property = fp.readUShort();
    				var dummy = fp.readBinaryString(128);
    			}
    			return out;
    		})();
    	};
    	PACKET.AC.ACCEPT_LOGIN3.size = -1;

    after I implemented in the PacketStructure.js so I need to use it as a parse when roBrowser received the packet (how to know where to use it?, just search 'ACCEPT_LOGIN') and I found the place where to use it, LoginEngine.js 

    just hook this PacketStructure (function) to the Function that handle the information
     

    Network.hookPacket( PACKET.AC.ACCEPT_LOGIN3,   onConnectionAccepted );

     

    hope you get some point.

    I just need ppl to revive this great work that Keyworld started. I'm in. how about you guys?

    I will opensource mind in soon let's revive this great work together!

    ps. sorry for my bad english ?

  2. On 4/26/2020 at 12:28 PM, simplyniceweb said:

     

    How can we get the packets like above for a specific client like 2017-06-14, is there any way @Akkarin?

     

    Hello good sir, may i know how did you get those packets for 2018-06-20 to be supported by roBrowser? can you help me with the 2017-06-14 client? Have a good day!

    Here is my 2017-06-14 i made before

     

    20170614: [
    			
    			[PACKET.CZ.ITEM_THROW,0x0367,6,2,4], //packet(0x0367,6,clif_parse_DropItem,2,4);
    			[PACKET.CZ.REQUEST_MOVE,0x0361,5,2], //packet(0x0361,5,clif_parse_WalkToXY,2);
    			[PACKET.CZ.ACK_STORE_PASSWORD,0x0437,36,0], //packet(0x0437,36,clif_parse_StoragePassword,0);
    			[PACKET.CZ.USE_SKILL_TOGROUND,0x0838,10,2,4,6,8], //packet(0x0838,10,clif_parse_UseSkillToPos,2,4,6,8);
    			[PACKET.CZ.REQUEST_ACT,0x083C,7,2,6], //packet(0x083C,7,clif_parse_ActionRequest,2,6);
    			[PACKET.CZ.REQ_CLICK_TO_BUYING_STORE,0x0860,6,2], //packet(0x0860,6,clif_parse_ReqClickBuyingStore,2);
    			[PACKET.CZ.ADD_FRIENDS,0x0867,26,2], //packet(0x0867,26,clif_parse_FriendsListAdd,2);
    			[PACKET.CZ.REQ_CLOSE_BUYING_STORE,0x086B,2,0], //packet(0x086B,2,clif_parse_ReqCloseBuyingStore,0);
    			[PACKET.CZ.SEARCH_STORE_INFO,0x086C,-1,2,4,5,9,13,14,15], //packet(0x086C,-1,clif_parse_SearchStoreInfo,2,4,5,9,13,14,15);
    			[PACKET.CZ.PARTY_BOOKING_REQ_REGISTER,0x0877,18,2,4], //packet(0x0877,18,clif_parse_PartyBookingRegisterReq,2,4);
    			[PACKET.CZ.CHANGE_DIRECTION,0x087E,5,2,4], //packet(0x087E,5,clif_parse_ChangeDir,2,4);
    			[PACKET.CZ.USE_SKILL_TOGROUNDMoreInfo,0x0889,90,2,4,6,8,10], //packet(0x0889,90,clif_parse_UseSkillToPosMoreInfo,2,4,6,8,10);
    			[PACKET.CZ.REQ_JOIN_GROUP,0x0899,26,2], //packet(0x0899,26,clif_parse_PartyInvite2,2);
    			[PACKET.CZ.REQ_TRADE_BUYING_STORE,0x089D,-1,2,4,8,12],
    			[PACKET.CZ.REQ_OPEN_BUYING_STORE,0x08A2,-1,2,4,8,9,89], //packet(0x08A2,-1,clif_parse_ReqOpenBuyingStore,2,4,8,9,89);
    			[PACKET.CZ.ITEM_PICKUP,0x08AD,6,2], //packet(0x08AD,6,clif_parse_TakeItem,2);
    			[PACKET.CZ.REQ_TRADE_BUYING_STORE,0x092F,-1,2,4,8,12], //packet(0x092F,-1,clif_parse_ReqTradeBuyingStore,2,4,8,12);
    			[PACKET.CZ.USE_SKILL,0x091B,10,2,4,6], //packet(0x091B,10,clif_parse_UseSkillToId,2,4,6);
    			//packet(0x0928,2,clif_parse_SearchStoreInfoNextPage,0);
    			[PACKET.CZ.REQNAME,0x0936,6,2], //packet(0x0936,6,clif_parse_GetCharNameRequest,2);
    			[PACKET.CZ.ENTER,0x0944,19,2,6,10,14,18], //packet(0x0944,19,clif_parse_WantToConnection,2,6,10,14,18);
    			[PACKET.CZ.MOVE_ITEM_FROM_BODY_TO_STORE,0x0879,8,2,4],
    			[PACKET.CZ.MOVE_ITEM_FROM_STORE_TO_BODY,0x023B,8,2,4],
    			
    			/*
    			// 2017-06-14bRagexeRE
    			packet(0x0364,5,clif_parse_HomMenu,2,4);
    			//packet(0x0865,4,NULL,0); // CZ_GANGSI_RANK
    			packet(0x0866,6,clif_parse_TickSend,2);
    			packet(0x087D,6,clif_parse_SolveCharName,2);
    			//packet(0x0957,8,NULL,0); // CZ_JOIN_BATTLE_FIELD
    			packet(0x0963,12,clif_parse_SearchStoreInfoListItemClick,2,6,10);
    			*/
    		],

    I can't remember, but there is some PacketRegister to register more and implement PacketStructure for support incoming packet need to figure out 

  3. On 4/15/2018 at 10:46 AM, Jhedzkie said:

    Why is that?
    Wouldn't adding specific random option group per slot take a lot more lines to cover for all items you want to have random options?

    I am currently using my own implementation based on the existing item_random_option_group db file and this is how it looks like. It still follows the same structure,but the point is that it does not define what will be the random options available to that certain type of item, instead, it defines what are the available random options that item type can have.
     

    
    // <randopt_groupid>,<rate>,<randopt_id1>,<randopt_value1>,<randopt_param1>{,<randopt_id2>,<randopt_value2>,<randopt_param2>,<randopt_id3>,<randopt_value3>,<randopt_param3>,<randopt_id4>,<randopt_value4>,<randopt_param4>,<randopt_id5>,<randopt_value5>,<randopt_param5>} and so on and so forth. just how many do you like this line to have. lmfao.


    image.thumb.png.0fdb9682b906aae658cc647cdcacb12b.png

    See I only had up to line 196 and i covered all of the equip types dagger to 2-h staves and armor to accessories each with different set of random options. and in my case, I only made small changes to the source so that the group that will be randomized will not reflect as is/whereis, instead, will just randomly pick which number of options (1-5) will reflect to the equip. 

    For example, a Clip[1].

    Using my random option group for accessory.

    
    RDMOPTG_ACCESSORY,25,RDMOPT_VAR_STRAMOUNT, 5,0,RDMOPT_VAR_AGIAMOUNT, 5,0,RDMOPT_VAR_VITAMOUNT, 5,0,RDMOPT_VAR_INTAMOUNT, 5,0,RDMOPT_VAR_DEXAMOUNT, 5,0,RDMOPT_VAR_LUKAMOUNT, 5,0,RDMOPT_VAR_HPACCELERATION, 5,0,RDMOPT_VAR_SPACCELERATION, 5,0,RDMOPT_VAR_PLUSASPD,1,0,RDMOPT_VAR_PLUSASPDPERCENT, 5,0,RDMOPT_VAR_CRITICALSUCCESSVALUE, 2,0,RDMOPT_HEAL_VALUE, 2,0,RDMOPT_HEAL_MODIFY_PERCENT, 2,0,RDMOPT_DEC_SPELL_CAST_TIME, 2,0,RDMOPT_DEC_SPELL_DELAY_TIME, 2,0
    RDMOPTG_ACCESSORY,20,RDMOPT_VAR_STRAMOUNT, 8,0,RDMOPT_VAR_AGIAMOUNT, 8,0,RDMOPT_VAR_VITAMOUNT, 8,0,RDMOPT_VAR_INTAMOUNT, 8,0,RDMOPT_VAR_DEXAMOUNT, 8,0,RDMOPT_VAR_LUKAMOUNT, 8,0,RDMOPT_VAR_HPACCELERATION, 8,0,RDMOPT_VAR_SPACCELERATION, 8,0,RDMOPT_VAR_PLUSASPD,2,0,RDMOPT_VAR_PLUSASPDPERCENT, 8,0,RDMOPT_VAR_CRITICALSUCCESSVALUE, 4,0,RDMOPT_HEAL_VALUE, 4,0,RDMOPT_HEAL_MODIFY_PERCENT, 4,0,RDMOPT_DEC_SPELL_CAST_TIME, 5,0,RDMOPT_DEC_SPELL_DELAY_TIME, 5,0
    RDMOPTG_ACCESSORY,10,RDMOPT_VAR_STRAMOUNT,12,0,RDMOPT_VAR_AGIAMOUNT,12,0,RDMOPT_VAR_VITAMOUNT,12,0,RDMOPT_VAR_INTAMOUNT,12,0,RDMOPT_VAR_DEXAMOUNT,12,0,RDMOPT_VAR_LUKAMOUNT,12,0,RDMOPT_VAR_HPACCELERATION,12,0,RDMOPT_VAR_SPACCELERATION,12,0,RDMOPT_VAR_PLUSASPD,3,0,RDMOPT_VAR_PLUSASPDPERCENT,12,0,RDMOPT_VAR_CRITICALSUCCESSVALUE, 7,0,RDMOPT_HEAL_VALUE, 7,0,RDMOPT_HEAL_MODIFY_PERCENT, 7,0,RDMOPT_DEC_SPELL_CAST_TIME,10,0,RDMOPT_DEC_SPELL_DELAY_TIME,10,0
    RDMOPTG_ACCESSORY, 5,RDMOPT_VAR_STRAMOUNT,15,0,RDMOPT_VAR_AGIAMOUNT,15,0,RDMOPT_VAR_VITAMOUNT,15,0,RDMOPT_VAR_INTAMOUNT,15,0,RDMOPT_VAR_DEXAMOUNT,15,0,RDMOPT_VAR_LUKAMOUNT,15,0,RDMOPT_VAR_HPACCELERATION,15,0,RDMOPT_VAR_SPACCELERATION,15,0,RDMOPT_VAR_PLUSASPD,4,0,RDMOPT_VAR_PLUSASPDPERCENT,15,0,RDMOPT_VAR_CRITICALSUCCESSVALUE,10,0,RDMOPT_HEAL_VALUE,10,0,RDMOPT_HEAL_MODIFY_PERCENT,10,0,RDMOPT_DEC_SPELL_CAST_TIME,15,0,RDMOPT_DEC_SPELL_DELAY_TIME,15,0
    RDMOPTG_ACCESSORY, 2,RDMOPT_VAR_STRAMOUNT,18,0,RDMOPT_VAR_AGIAMOUNT,18,0,RDMOPT_VAR_VITAMOUNT,18,0,RDMOPT_VAR_INTAMOUNT,18,0,RDMOPT_VAR_DEXAMOUNT,18,0,RDMOPT_VAR_LUKAMOUNT,18,0,RDMOPT_VAR_HPACCELERATION,18,0,RDMOPT_VAR_SPACCELERATION,18,0,RDMOPT_VAR_PLUSASPD,5,0,RDMOPT_VAR_PLUSASPDPERCENT,18,0,RDMOPT_VAR_CRITICALSUCCESSVALUE,12,0,RDMOPT_HEAL_VALUE,12,0,RDMOPT_HEAL_MODIFY_PERCENT,12,0,RDMOPT_DEC_SPELL_CAST_TIME,20,0,RDMOPT_DEC_SPELL_DELAY_TIME,20,0
    RDMOPTG_ACCESSORY, 1,RDMOPT_VAR_STRAMOUNT,25,0,RDMOPT_VAR_AGIAMOUNT,25,0,RDMOPT_VAR_VITAMOUNT,25,0,RDMOPT_VAR_INTAMOUNT,25,0,RDMOPT_VAR_DEXAMOUNT,25,0,RDMOPT_VAR_LUKAMOUNT,25,0,RDMOPT_VAR_HPACCELERATION,25,0,RDMOPT_VAR_SPACCELERATION,25,0,RDMOPT_VAR_PLUSASPD,7,0,RDMOPT_VAR_PLUSASPDPERCENT,25,0,RDMOPT_VAR_CRITICALSUCCESSVALUE,15,0,RDMOPT_HEAL_VALUE,15,0,RDMOPT_HEAL_MODIFY_PERCENT,15,0,RDMOPT_DEC_SPELL_CAST_TIME,25,0,RDMOPT_DEC_SPELL_DELAY_TIME,25,0

    So it has,
    STR, AGI, VIT, INT, DEX, LUK, HP Regen, SP Regen, ASPD, ASPDRate, CritRate, Healing, HealingRate, Reduce Cast, Reduce Delay

    So the rate is based on the 2nd value in the group definition right? So saying that you got the 25% so you got the first line. From there, my code is to randomize how many slots or how many random options will be awarded to the item. Lets say, it randomized to 3.
    It will then lookup the rest of the line and randomly pick which 3 would reflect to the item. For example, it randomed INT, SP Acceleration, and Healing Rate. It will then reflect to the Clip[1] INT+5, Increase SP Regen by 5%,  and Healing Power +2%.
    image.png.c9b207ea346e1ea6ec7e48dae7eadcbb.png

    Well, if you really want to modify the current db structure, the best way to go is to just add min and max value so that it can be randomed source side. make the structure like

    
    // <randopt_groupid>,<rate>,<randopt_id1>,<randopt_value_min1>,<randopt_value_max1>,<randopt_param1>{,<randopt_id2>,<randopt_value_min2>,<randopt_value_max2>,...}


    That should solve your problem, right?

    I don't know if I understood it well, but this is just my take on it.

     

    Hi, sorry for reviving this dead post but can i ask you for src to find how many random options will be awarded to item? 

  4. 14 hours ago, Waken said:

    @Akkarin There's a lot of effort to do if you want to complete all the effects that are missing from robrowser, and you know... make robrowser reach the official behavior in all expects, that's something i would love to see in the future, i respect closed-projects but since robrowser was created to be open-sourced that's not cool at all.
    @MrUnzOThe Electron implementation is quite simple, at least to have a prototype, the hard part i guess is to make it secure.

    That's why i use NWJS, in case your case compile your sourcecode to V8 binary and get better performance. I am success with NWJS its playable and running smooth. I also modified the sourcecode to make it read the local grf files that in the same root directory like an official does ?

  5. 35 minutes ago, Akkarin said:

    If XPRO is web-based (with apparent apk files for mobile) though pretty-much built on roBrowser's source, but you have to pay for a license to use it. roBrowser has always been intended to be open-source. Vykimo could've just continued work on roBrowser instead of being money hungry. There are other roBrowser continuations where many of the newer features have been added in separate forks. I myself use rAthena and roBrowser in a completely different context and host an online gardening game with it. If you understand javascript, it's actually not that difficult to implement the features that are missing.

    could you please link that gardening game? I need to check it ?

    I also implement some features and already merged on @MrAntares repo ? 

  6.  

    This is AWESOME!! I'm looking for mod this client to something like a new game!!

     

    Yes, this is what i'm doing too!

     

    Wow this is great can you please show us? 

     

    I'm stuck at sprite rendering can you suggest me about this?

    Keyworld, he made a good work for optimizing and this make code so complex for me  /oops

×
×
  • Create New...