Jump to content

bWolfie

Members
  • Content Count

    848
  • Joined

  • Last visited

  • Days Won

    34

Posts posted by bWolfie


  1. Edit: I fixed nonnull and HPMHooking warnings by updating GCC to v7 (previously using default 4.8).

    The enumeration value warning is a bit annoying. Using 'default' no longer suppresses the warning, so I have to manually input every enum value into each switch I use.

     

    I recently updated my Hercules to 2022.12.07 and now I am receiving these warning messages when compiling.

     

    How do I disable/fix them?

    If I update to a later version will they automatically be fixed?

    In file included from storage.c:37:0:
    ../common/memmgr.h:79:2: warning: returns_nonnull attribute directive ignored [-Wattributes]
      void* (*malloc)(size_t size, const char *file, int line, const char *func) __attribute__ ((alloc_size (1))) GCCATTR ((returns_nonnull));
    
    atcommand.c: In function atcommand_go’:
    atcommand.c:124:3: warning: enumeration value BL_ITEM not handled in switch [-Wswitch-enum]
       switch (sd->who_hit) {
       ^
    atcommand.c:124:3: warning: enumeration value BL_SKILL not handled in switch [-Wswitch-enum]
      
      In file included from HPMHooking.c:238:0:
    HPMHooking/HPMHooking_map.Hooks.inc: In function HP_showmsg_showMessageV’:
    HPMHooking/HPMHooking_map.Hooks.inc:81222:3: warning: function might be possible candidate for gnu_printf format attribute [-Wsuggest-attribute=format]
       retVal___ = HPMHooks.source.showmsg.showMessageV(string, ap___copy);
       ^

     


  2. Hello,

     

    I created a custom skill RK_MOUNT for Rune Knight. I added it to the appropriate place in skillinfoz\skilltreeview.lub, but for some reason it shows in 2nd job tab.

     

    Hoping someone can help me get it on 3rd job tab.

     

    image.png.38b695cb5d4f5ea6486730baf760e120.png

      [JOBID.JT_RUNE_KNIGHT] = {
        [1] = SKID.RK_RUNEMASTERY,
        [3] = SKID.RK_PHANTOMTHRUST,
        [4] = SKID.RK_DRAGONTRAINING,
        [8] = SKID.RK_ENCHANTBLADE,
        [10] = SKID.RK_HUNDREDSPEAR,
        [11] = SKID.RK_DRAGONHOWLING,
        [12] = SKID.RK_DRAGONBREATH,
        [14] = SKID.RK_DEATHBOUND,
        [15] = SKID.RK_SONICWAVE,
        [16] = SKID.RK_WINDCUTTER,
        [18] = SKID.RK_MOUNT,
        [19] = SKID.RK_DRAGONBREATH_WATER,
        [23] = SKID.RK_IGNITIONBREAK,
        [41] = SKID.ALL_FULL_THROTTLE
      },

  3. Thanks for the responses. I don't know why I use memcpy, not so advanced on coding. I just copied an existing structure I found in source code.

     

    I used safestrncpy in new version and no leaks.

    	char item_name[ITEM_NAME_LENGTH], output[100];
    	safestrncpy(item_name, i_data->jname, ITEM_NAME_LENGTH);
    	sprintf(output, "Retrieved %d '%s' from storage.", i, item_name);

     


  4. I made this command to retrieve all of an item from storage.

     

    This line char *item_name =(char *)aMalloc(ITEM_NAME_LENGTH*sizeof(char)); causes memory leak. How to fix it?

     

    
    	struct item_data *i_data = itemdb->exists(nameid);
    
    	if (i_data == NULL) {
    		clif->message(fd, "Invalid Item ID.");
    		return false;
    	}
    
    	char *item_name =(char *)aMalloc(ITEM_NAME_LENGTH*sizeof(char));
    	memcpy(item_name, i_data->jname, ITEM_NAME_LENGTH);
    
    	char output[100];
    	sprintf(output, "Retrieved %d '%s' from storage.", i, item_name);

     

     


  5. How do you define CUSTOM_SKILL_RANGES? Can't work it out. No documentation available still.

     

    Whenever I make changes to skill_idx_ranges[] it causes everything from { GD_APPROVAL, GD_DEVELOPMENT }, to break.

     

    Edit: It seems that the skill id must be listed in order. I was using skill id below 10000, but listed after. This means all custom skill must be of more than GD_DEVELOPMENT, otherwise CUSTOM_SKILL_RANGES will cause issues.


  6. @meko

     

    Do you know how to create a function similar to sort/rsort, but it won't move a certain nth array?

     

    E.g. #1, I have this array

    setarray(.@Array,
    	4000, 3,
    	4001, 7,
    	4002, 1,
    	4003, 10,
    	4004, 0,
    	4005, 2);

    Then I want to sort it so the left numbers (4000-4005) change position with the right no.

     

    E.g. #2, now going to sort in ascending order.

    4004, 0,
    4002, 1,
    4005, 2,
    4000, 3,
    4001, 7,
    4003, 10,

    As you can see, it only sorted every 2nd array, but it moved the preceding array with it.

     

    Idk how to explain this. I think "anchor" would be the correct term. Value n determines how many values are anchored to the first array index before we sort by a new anchor. 

    Hope it makes sense and hoping you can help me out.

     

    Thanks.


  7. So I have a NPC script which uses disablenpc() on a timer. Players are able to interact with the NPC while it is active. The NPC uses mes().

     

    If a player is talking to the NPC while the disablenpc() is triggered, the will become stuck on the mes() screen, and will need to logout or warp away using @load or something similar to get out of it.

     

    My query: When disablenpc() is triggered, how can I send close() to everyone currently talking to that NPC?

    (sorry haven't updated my source for a bit, this may already exist in new versions)


  8. 3 minutes ago, Caspian said:

    Yes we have, what I meant to say was if it is possible to convert those old battleground scripts (Tierra, KVM and Flavius) into your ExtendedBG, with @joinbg and all the features from your plugin... instead of using the original NPCs to join the battleground... It sucks to use the chatroom to wait for players for the battleground  to start...

    Yes it's possible but takes some work to configure. I have them configured with Kubix's BG release from 2016. I'm not familiar with eBG so I can't help you.

    1 minute ago, fiction said:

    Would be nice if we can have another type of BG, for example Silvershard Mines or a command that make the players vote for a BG to play

    That's quite hard cause firstly you need a mapper who has played the mode before and secondly a scripter who knows the ins and outs of it too.


  9. 11 hours ago, Naruto said:

    I guess its not something I should be concerned about

     

     

    Im gonna have to check into this VPN nonsense for login nodes maybe...

     

    Thanks 

    Been around for some years now. I first saw it on one of those Russian servers. Never seen any piece of code or the like regarding it, so personally have no idea how it works.

    From my experience, they were all terrible. Logging in regularly and not using one of "proxy server"s as they are known always proved best for me. But it may have also had something to do with the fact I live in New Zealand and the destination server was in Russia. This was also 4-5 years ago, so technology probably improved in that time.

    IMO, until proven otherwise, they are vanity features and are only good as marketing tools. They may help a niche group though.


  10. What's ROM?

    Best way to do this is very long and not simple. Change all MvP spawns into individual scripts. Then you can use getnpctimer() to get the time left. Example:

    moc_pryd04,0,0,0	script	Osiris_Spawn	FAKE_NPC,{
    OnMyMobDead:
    	.GID = 0;
    	initnpctimer();
    	end;
    
    OnTimer3600000: // wait 60 mins
    	sleep(rand(600000)); // add 0~10 mins
    OnInit:
    	.GID = monster("moc_pryd04", 0, 0, "--en--", OSIRIS, 1, sprintf("%s::OnMyMobDead", strnpcinfo(NPC_NAME)));
    	stopnpctimer();
    	end;
    }

    Then make another script with the atcommand to check getnpctimer(0, "Osiris_Spawn")


  11. Requires source edit. Go to src/map/skill.c, find static int can_copy().

    Anywhere after nullpo_ret(sd); you can put your conditions.

        if (skill_id == WZ_WATERBALL)
            return 0;
    

    If you want to carryover skill_lv, you need to edit 2 lines.

    Change 1, find line:

    can_copy(tsd,copy_skill,bl)) // Split all the check into their own function [Aru]


    Change to:

    can_copy(tsd, copy_skill, skill_lv, bl)) // Split all the check into their own function [Aru]

    Change 2, find line:

    static int can_copy(struct map_session_data *sd, uint16 skill_id, struct block_list *bl)


    Change to:

    static int can_copy(struct map_session_data *sd, uint16 skill_id, uint16 skill_lv, struct block_list *bl)


  12. In my opinion, best thing to do is to save all data as char_reg variables, e.g.
    WoE_Kill += 1; 

    And then once WoE is finished, run a SQL query to copy data from char_reg_num_db and char_reg_str_db to your custom table. E.g.

    OnAgitEnd:
        query_sql("TRUNCATE TABLE `woe_rank`;"); // clear old data. this table is only used to hold temporary values for displaying elsewhere
        .@count = query_sql("SELECT `char_id`, `value` FROM `char_reg_num_db` WHERE `key` = 'WoE_Kill';", .@CID, .@WoE_Kill);
        for (.@i = 0; .@i < .@count; .@i++) {
            query_sql(sprintf("INSERT INTO `woe_rank`(`char_id`, `kills`) VALUES(%d, %d);", .@CID, .@WoE_Kill));
            sleep(50); // don't perform too many queries at once (20 per second)
        }
        end;
    

    So then the query_sql() command is only being run under controlled circumstances, and only used once.


  13. like Xross said, likely using older SQL database which is incompatible with the current Hercules revision. When you start the login server, it should say which files you need to add.

    In any case, you can usually fix this by doing the following.

    1. Backup current database using mysqldump (unsure how to dump other ways)
      mysqldump database > ~/database-backup.sql
    2. Drop database, then recreate.
      DROP DATABASE database;
      CREATE DATABASE database;
    3. Create new table structures using Hercules SQL.
      mysql .... < sql-files/main.sql
    4. Then add your backed up database on top of that...
      mysql .... < ~/database-backup.sql
×
×
  • Create New...

Important Information

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