Jump to content

Shakto

Members
  • Posts

    394
  • Joined

  • Last visited

  • Days Won

    3

Posts posted by Shakto

  1. Reputation UI


    Reputation UI

    Video : https://youtu.be/NDn7b1zdOe0

    Version Server side and client side :
    PACKETVER_MAIN_NUM >= 20201104
    ou PACKETVER_RE_NUM >= 20211103
    ou PACKETVER_ZERO_NUM >= 20201118

    Reputation UI is the new button in menu that lead to the reputation windows.

    You can set client side the menu list (reputation group), the list of reputation (name, max points, visibility etc…).

    You will find here a NPC script sample to read reputation points, set reputation points or open the UI without without colored reputation.
    Also there is a command @reput to add or remove point on a specific reputation ID


     

  2. Adventurer’s Agency – New UI – Register / Search a party


    Adventurer’s Agency – New UI

    Register a party as a party leader.
    Search a party as a player.

    Client version needed : 2018-01-03bRagexeRE
    Server need : Web server : https://github.com/rathena/rathena/pull/5731
    You can add it on your host with this command : git pull origin refs/pull/5731/head


    • Submitter
    • Submitted
      03/27/2022
    • Category
    • Video
      https://www.youtube.com/watch?v=mfC91R53dKM&ab_channel=RagnarokInception
    • Content Author
      Shakto

     

    • Love 1
  3. On 1/18/2022 at 6:06 AM, WhiteEagle said:

    Hey, first of all thanks for your work.
    Does this include the changes for FluxCP to list all accounts under one email?

    Do you have a launcher like OriginsRO that works with the master account system?
    If so, it would be great if you could offer this as a sale as well. (seperate)

    Hello,
    It include only the rAthena part, not fluxCP's one but I can help you if needed to support it.

    You just need to have a "master account" system in FluxCp first then link both. I found something like this as a first step :

    https://github.com/acelabini/FluxCP-MasterAccount

    I don't get what you mean with OriginsRO, do you have some samples to provide ?

  4. 10 hours ago, acaciomilk said:
    Good night. This modification does not work. What will be done to solve this problem?

    Hello,

    The best to have an active support is to pm me with your issue or join me on Discord Shakto#2940
    I guess it should be related with your rAthena version.

  5.  

    On 3/8/2022 at 1:55 PM, M a p l e said:

    Wouldn't that be wrong? Sell a project that has been released for free on Herc. and without the author's permission.

    https://github.com/HerculesWS/Hercules/commit/e8b978711444ff0eff15c8a22a80029e356dc405

    It has been entirely rework to work with rathena.

    Things like database handling (rathena does YML) , packet handling, differences of function between hercules and rathena (timer, clif, vector ...).

    If you prefer, that's the price of it, but you're right to have a personal opinion on it

     

    On 3/8/2022 at 6:35 AM, Redao said:

    Does it support installation? Is it working correctly in rAthena and without bugs?

    it's working with the last version of rathena, I can help for installation yes.

  6. Anti-bot - Captcha images from server


    Get a discount price of 30% by sending me a private message before buying it.

    Thanks to @Asheraf for implementing it first on Hercules

    This feature allows you to have a totally captcha system to prevent from automation system (Openkore bot, Blue eye macro, AHK...).

    • /macro_register : It allows authorized players to add directly a captcha in the server when it's started.
    • /macro_preview <id> :  it allows to preview a captcha by its id
    • /macro_detector It allows authorized players to ask to one or several players (like a batch system) to challenge a captch

     

    • macro database : You can add captcha images directly in your server and load them when the server start by using the db/captcha_db.yml

    It only works with client version 20160330 or more recent.
    For server side, you need to have yml database version at least and cpp files.

    N.B : Only for those who want to hot upload image when the server is already started and not using the macro database system By default the client expects a 16 bit BMP image when receiving the images but the macro register ui can only read 24 bit images, therefore in order for this system to work the client needs to be patched with the correct CAPTCHA_BMP_SIZE a Nemo patch for doing so is now available at http://nemo.herc.ws/patches/ChangeCaptchaImageDecompressionSize/.


     

  7. @ping command - Works on windows & linux


    Get a discount price of 30% by sending me a private message before buying it.

    @ping command

     It show in ms in game the result of a ping command.

    Compilation works on windows and linux.

    On linux, the server needs special authorisation because icmp use raw packet, basically there is 2 options to handle it :

    • Each time you lauch the server, do it with sudo
    • Do this once sudo setcap 'cap_net_raw+ep' ./map-server

     

  8. MVP Spawn - Restore MVPs state like it was before server restart


    Get a discount price of 30% by sending me a private message before buying it.

    MVP Spawn

    When a MVP is killed, it saves all the information in database (date, killer, status, position)

    When your server restart (intended reload or crash), it will check if the MVP should be dead or alive before spawning it. 
    - If it should be alive, it will spawn it
    - If it should be dead, the MVPs don't spawn. If tombstone is enabled, it will appear with all his information at the position it was before the restart. The MVP will naturally appear when it should have appeared if the server had not restarted.

    ---------------------

    You don't have to worry about a restart of your server, crash, @reload script anymore that can cause abuses from players.

    You don't have to add any tables, columns on your SQL, it uses all features already set up.

    The Convex Mirrors will continue to perform fully.


     

    • Upvote 1
    • Love 1
    • MVP 1
  9. @nolootid - Prevent dropping chosen items with autoloot


    @nolootid command

    To add an item to the list, use '@nolootid +<item name or ID>'. 
    To remove an item, use '@nolootid -<item name or ID>'.
    '@nolootid reset' will clear your noloot item list.
    '@nolootid status' will show you the commands list and current items in your nolootid list.


     

  10. On 2/13/2022 at 6:28 AM, chadness said:

    its only a online peak not the online players count that time the player is only 1 but it showing 2 

    Change the SQL request then :

    Number of players online (with shops)

     SELECT COUNT(*) as online FROM `char` WHERE `online` = 1;

    Number of players online (without shops)
    SELECT COUNT(*) as online FROM `char` WHERE `online` = 1 and `char`.`char_id` NOT IN (select vendings.char_id FROM `vendings` INNER JOIN `char` ON `char`.`char_id` = `vendings`.`char_id`)

    Number of shops online
    SELECT COUNT(*) as online FROM `char` WHERE `online` = 1 and `char`.`char_id` IN (select vendings.char_id FROM `vendings` INNER JOIN `char` ON `char`.`char_id` = `vendings`.`char_id`)

     

  11. Check if the packet is in src/map/packets.hpp

    #if PACKETVER_MAIN_NUM >= 20181212 || PACKETVER_RE_NUM >= 20181212 ||  PACKETVER_ZERO_NUM >= 20190130
    struct PACKET_ZC_USESKILL_ACK {
    	int16 packetType;
    	uint32 srcId;
    	uint32 dstId;
    	uint16 x;
    	uint16 y;
    	uint16 skillId;
    	uint32 element;
    	uint32 delayTime;
    	uint8 disposable;
    	uint32 unknown;
    } __attribute__((packed));
    DEFINE_PACKET_HEADER(ZC_USESKILL_ACK, 0x0b1a);
    #elif PACKETVER_MAIN_NUM >= 20091124 || PACKETVER_RE_NUM >= 20091124 || defined(PACKETVER_ZERO)
    struct PACKET_ZC_USESKILL_ACK {
    	int16 packetType;
    	uint32 srcId;
    	uint32 dstId;
    	uint16 x;
    	uint16 y;
    	uint16 skillId;
    	uint32 element;
    	uint32 delayTime;
    	uint8 disposable;
    } __attribute__((packed));
    DEFINE_PACKET_HEADER(ZC_USESKILL_ACK, 0x07fb);
    #elif PACKETVER_MAIN_NUM >= 20090406 || PACKETVER_SAK_NUM >= 20080618 || PACKETVER_RE_NUM >= 20080827 || defined(PACKETVER_ZERO)
    struct PACKET_ZC_USESKILL_ACK {
    	int16 packetType;
    	uint32 srcId;
    	uint32 dstId;
    	uint16 x;
    	uint16 y;
    	uint16 skillId;
    	uint32 element;
    	uint32 delayTime;
    } __attribute__((packed));
    DEFINE_PACKET_HEADER(ZC_USESKILL_ACK, 0x013e);
    #endif

     

  12. /*==========================================
    * @jumptosell - warps to the cheapest shop.
    * Made by Vengence
    * Make it work for latest [Shakto]
    *------------------------------------------*/
    ACMD_FUNC(jumptosell)
    {
    	char item_name[100];
    	int item_id = 0, j, count = 0, sat_num = 0;
    	int s_type = 1; // search bitmask: 0-name,1-id, 2-card, 4-refine
    	int refine = 0,card_id = 0;
    	struct map_session_data* pl_sd;
    	struct map_session_data* pl_sd2;
    	struct s_mapiterator* iter;
    	unsigned int MinPrice = battle_config.vending_max_value, MaxPrice = 0;
    	nullpo_retr(-1, sd);
    
    	if (!message || !*message) {
    		clif_displaymessage(fd, "Use: @jumptosell (<+refine> )(<item_id>)(<[card_id]>) or @jumptosell <name>");
    		return -1;
    	}
    
    	if (sscanf(message, "+%d %d[%d]", &refine, &item_id, &card_id) == 3){
    		s_type = 1+2+4;
    	} else if (sscanf(message, "+%d %d", &refine, &item_id) == 2){
    		s_type = 1+4;
    	} else if (sscanf(message, "+%d [%d]", &refine, &card_id) == 2){
    		s_type = 2+4;
    	} else if (sscanf(message, "%d[%d]", &item_id, &card_id) == 2){
    		s_type = 1+2;
    	} else if (sscanf(message, "[%d]", &card_id) == 1){
    		s_type = 2;
    	} else if (sscanf(message, "+%d", &refine) == 1){
    		s_type = 4;
    	} else if (sscanf(message, "%d", &item_id) == 1 && item_id == atoi(message)){
    		s_type = 1;
    	} else if (sscanf(message, "%99[^\n]", item_name) == 1){
    		s_type = 1;
    		std::shared_ptr<item_data> id = item_db.searchname( item_name );
    
    		if( id == nullptr ){
    			clif_displaymessage(fd, "No item found with this name");
    			return -1;
    		}
    
    		item_id = id->nameid;
    	} else {
    		clif_displaymessage(fd, "Use: @jumptosell (<+refine> )(<item_id>)(<[card_id]>) or @jumptosell <name>");
    		return -1;
    	}
        
    	struct item_data *item_data;
    
    	//check card
    	if(s_type & 2 && ((item_data = itemdb_exists(card_id)) == NULL || item_data->type != IT_CARD)){
    		clif_displaymessage(fd, "Not found a card with than ID");
    		return -1;
    	}
    	//check item
    	if(s_type & 1 && (item_data = itemdb_exists(item_id)) == NULL){
    		clif_displaymessage(fd, "Not found an item with than ID");
    		return -1;
    	}
    	//check refine
    	if(s_type & 4){
    		if (refine<0 || refine>10){
    			clif_displaymessage(fd, "Refine out of bounds: 0 - 10");
    			return -1;
    		}
    		/*if(item_data->type != IT_WEAPON && item_data->type != IT_ARMOR){
    			clif_displaymessage(fd, "Use refine only with weapon or armor");
    			return -1;
    		}*/
    	}
    	iter = mapit_getallusers();
    	
    	for( pl_sd = (TBL_PC*)mapit_first(iter); mapit_exists(iter); pl_sd = (TBL_PC*)mapit_next(iter) )
    	{
    		if( pl_sd->vender_id ) //check if player is vending
    		{
    			for (j = 0; j < pl_sd->vend_num; j++) 
    			{
    				if((item_data = itemdb_exists(pl_sd->cart.u.items_cart[pl_sd->vending[j].index].nameid)) == NULL)
    					continue;
    				if(s_type & 1 && pl_sd->cart.u.items_cart[pl_sd->vending[j].index].nameid != item_id)
    					continue;
    				if(s_type & 2 && ((item_data->type != IT_ARMOR && item_data->type != IT_WEAPON) ||
    						(pl_sd->cart.u.items_cart[pl_sd->vending[j].index].card[0] != card_id &&
    						pl_sd->cart.u.items_cart[pl_sd->vending[j].index].card[1] != card_id &&
    						pl_sd->cart.u.items_cart[pl_sd->vending[j].index].card[2] != card_id &&
    						pl_sd->cart.u.items_cart[pl_sd->vending[j].index].card[3] != card_id)))
    					continue;
    				if(s_type & 4 && ((item_data->type != IT_ARMOR && item_data->type != IT_WEAPON) || pl_sd->cart.u.items_cart[pl_sd->vending[j].index].refine != refine))
    					continue;
    				if(pl_sd->vending[j].value < MinPrice){ 
    					MinPrice = pl_sd->vending[j].value;
    					pl_sd2 = pl_sd;
    				}
    				count++;
    			}
    		}
    	}
    	mapit_free(iter);
    
    	if(count > 0) {
    		pc_setpos(sd, pl_sd2->mapindex, pl_sd2->bl.x, pl_sd2->bl.y, CLR_TELEPORT);
    	} else
    		clif_displaymessage(fd, "Nobody is selling it now.");
    
    return 0;
    }

     

    • Upvote 1
    • Love 1
  13. @killcounter - Follow the number of monsters killed


    Count the number of monsters you killed during a session.

    You can choose the number of slot that you want to allow to the players (default is 5 slots). It allows you to follow a counter for more than only one monster at the same time.

    The counter is auto save for your char that means if a player disconnect and reconnect later, the counter will be restored.

    @killcounter : activate / disactivate the count
    @killcounter reset : reset all counter
    @killcounter reset <position> : reset the counter on the position
    @killcounter <mobID / mobname> <position> : start to count kill on the chosen position
    @killcounter status :  show the number of monsters killed in all your position


     

  14. @session - Count the experience you win by minute


    Count the experience (base and job) you win by minute or the total of experience you made during a session of experience.

    Ex :

    Session : Enabled. You got 12000 base exp and 9000 job xp for 3 mins.

    That means you did 4000 base exp / min and 3000 job exp per min.

     

    @session : Give the status, total exp, xp per min in the current session
    @session reset : Reset the counter
    @session on :  Turn on the counter for the current session
    @session off :  Turn off the counter for the current session
    @session help :  Give you details on the command in game

     

    You can stop the session for a while and turn it on again without being reset.

    The counter is being reset on reconnection.


     

    • Upvote 1
  15. Master Storage - Shared Storage between accounts


    The master storage allow you to have a shared storage between one and several accounts.

    It adds a master_id in the login SQL table automatically that allow you to links accounts.

    It contains verifications to disable any kind of possible dupe items.


     

  16. @noress - Prevent for being ressurected if you don't want it


    A command @noress that give to a player the possibility to accept or deny ressurections.
    It can be useful in case of griefing behaviors where players are ressurected in a loop to the goal of make him loose percents of xp.


     

    • Love 1
    • Like 1
×
×
  • Create New...

Important Information

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