Jump to content

Playtester

Developer
  • Posts

    765
  • Joined

  • Last visited

  • Days Won

    19

Posts posted by Playtester

  1. It's normal that Stone Curse (from the Stone Curse spell) has an incubation time of 5 seconds. During this time you can still walk but not use skills.

    Blessing on Stone Curse should be working, but you need to cast it after the incubation time (Blessing will then not be applied and instead it heals the stone status).

    Status Recovery on frozen works for me.

  2. Adding the flag as qtdan described is the easiest solution.

    If this is a bug in the emulator and it should not make targets immune to GTB, then that's usually more an indication of that it shouldn't be a magic spell in the first place (maybe misc?). Though changing the damage type often requires to also move the skill's code to another function (might not be needed for no-damage skills though).

  3. Yeah basically you need to edit skill.cpp, but the change should be minimal if you have a different skill that works similar already.

    Basically open skill.cpp in Visual Studio and make Ctrl+F, make sure you select to search only in this document so you don't get too many results.

    Then you first search for the skill you want to change to understand how it works. You don't want to change anything about its effects, you just want to change how often it calls "skill_attack" (you want to call it once for each enemy in the area instead of just the target).

    So if you search for AM_ACIDTERROR in skill.cpp and check where it calls skill_attack you will find it in a long lists of single target skills:

    [...]
    	case AC_CHARGEARROW:
    	case MA_CHARGEARROW:
    	case RG_INTIMIDATE:
    	case AM_ACIDTERROR:
    	case BA_MUSICALSTRIKE:
    	case DC_THROWARROW:
    	case BA_DISSONANCE:
    	case CR_HOLYCROSS:
    [...]

    You will want to remove it here.

    Now you search for a skill that you want it to behave like. For example MG_FIREBALL. Then you find a larger list of skills, it's even commented as "Splash skills":

    	//Splash attack skills.
    	case AS_GRIMTOOTH:
    	case MC_CARTREVOLUTION:
    	case NPC_SPLASHATTACK:
    		flag |= SD_PREAMBLE; // a fake packet will be sent for the first target to be hit
    	case AS_SPLASHER:
    	case HT_BLITZBEAT:
    	case AC_SHOWER:
    	case MA_SHOWER:
    	case MG_NAPALMBEAT:
    	case MG_FIREBALL:
    	case RG_RAID:
    #ifdef RENEWAL
    	case SN_SHARPSHOOTING:
    #endif
    	case HW_NAPALMVULCAN:
    	case NJ_HUUMA:
    	case ASC_METEORASSAULT:

    You just need to add your skill here ("case AM_ACIDTERROR:").

    Now it works like a splash skill. The code below looks a bit scary because devs put way too many exceptions in there, but you can just ignore this unless you want your skill to have a unique handling unlike normal splash skills.

    Most of the other things you can just define in the skill_db.yml

    If you wonder how this section works, basically it will first be called without a flag:

            if( flag&1 ) {//Recursive invocation

    So this will be false and it goes into the else:

            } else {

    In the else it then calls a sub function for all units in the area:

                // recursive invocation of skill_castend_damage_id() with flag|1
                map_foreachinrange(skill_area_sub, bl, splash_size, starget, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id);

    This will in the end loop back to the same function again for each valid target, except now it has "flag&1" and will just call skill_attack for that target instead.

    • MVP 1
  4. Not familiar with that diff (you're better off asking on WARP Discord), but I can tell you that you cannot just use any executable, first of all you need one that's not encrypted, so you kind of rely it being provided by the Nemo/Warp project, because Gravity now encrypts their executables. Second, if you take a too modern executable, some of its feature might not be supported in rAthena yet. Using older ones should be fine though as long as you adapt PACKETVER in packets.hpp.

  5. You can use Status.yml to define special properties of status changes:

      - Status: Steelbody
        Icon: EFST_STEELBODY
        DurationLookup: MO_STEELBODY
        States:
          NoCast: true
        CalcFlags:
          Def: true
          Mdef: true
          Aspd: true
          Speed: true
        Opt3:
          SteelBody: true

    For example you can use the flag "NoSave", so that a status change is removed on logout, similar to how it is defined for Devotion:

      - Status: Devotion
        Icon: EFST_DEVOTION
        DurationLookup: CR_DEVOTION
        Flags:
          NoSave: true
          RemoveOnChangeMap: true
          OverlapIgnoreLevel: true

    Note: Endow is not remove on logout on official servers so that's correct. However, I can confirm that Steel Body should be removed, but isn't.

  6. There's one more thing, right now the transition from SC_STONEWAIT to SC_STONE can also be resisted. That also needs to be fixed by making it unavoidable.

    We are also checking an issue in renewal right now. I recommend you just wait for the next update though otherwise you'll run into merge conflicts.

  7. I assume this "Shadow Cross" is a new 4th job class? Your file doesn't contain this class at all, so it uses the official values from the emulator. You will need to expand your job_status.yml with the new jobs.

    • Like 1
  8. It's a small error in the rework on the Stone SC.

    In status.cpp this part:

    		case SC_STONE:
    		case SC_FREEZE:
    			// Undead are immune to Freeze/Stone
    			if (undead_flag && !(flag&SCSTART_NOAVOID))
    				return 0;
    			break;

    Needs to be changes to:

    		case SC_STONE:
    		case SC_STONEWAIT:
    		case SC_FREEZE:
    			// Undead are immune to Freeze/Stone
    			if (undead_flag && !(flag&SCSTART_NOAVOID))
    				return 0;
    			break;

    I'll forward this to Aleos so he can fix this directly on the emulator.

    • Upvote 1
  9. @funtwocrasher

    I strongly recommend that you set up your server in a way you can always update rAthena without merging trouble. That way you can always stay up-to-date on all the fixes without much effort.

    For conf/db changes, you only need to make sure to use the import folder for your changes instead of the files themselves. Those folders are set to be ignored by git so your changes are safe there.

    SRC/NPC changes are part of the git repository, it's a bit more tricky there, it depends a little bit on how you apply your customization. If you are like me and just edit the files directly, but not check them in at all, not even locally (kinda risky), then you need to call "Stash changes" (I'm using Tortoise Git) first, this will remove all your custom changes temporarily and put them into a stash. Then you can just call "Pull" which will update your base files to the latest rAthena (assuming you are still on the master branch). Afterwards just call "Stash pop" that puts your custom changes back in. Sometimes if you changed something that was also updated on rAthena you will have to do a merge and decide what changes to keep / adjust.

    If you commit your changes into your local respository then as far as I know you can just call Pull directly and it will automatically merge it. If you have your own branch you need to select yourself that you want to merge master into your branch. Not too familiar with that process though.

    If are really scared of losing your changes, you could also just copy your whole rathena folder as a backup before you pull. Then you can restore lost changes by moving files from the backup back into the main folder. Or to keep a better overview, just backup the files you actually changed.

    Hope this helps.

  10. There was an update to system and it now uses groups.yml instead of groups.conf, might be related to your issue.

    If you had customized the original source file you might have a merge error?

    The code you quoted doesn't even include "const s_pcg_permission_name". From the error message I'd say you have the same const in the array appear twice.

    Look for this code:

    static const struct s_pcg_permission_name {
    	const char *name;
    	enum e_pc_permission permission;
    } pc_g_permission_name[PC_PERM_MAX] = {
    	{ "can_trade", PC_PERM_TRADE },
    	{ "can_party", PC_PERM_PARTY },
    	{ "all_skill", PC_PERM_ALL_SKILL },
    	{ "all_equipment", PC_PERM_USE_ALL_EQUIPMENT },
    	{ "skill_unconditional", PC_PERM_SKILL_UNCONDITIONAL },
    	{ "join_chat", PC_PERM_JOIN_ALL_CHAT },
    	{ "kick_chat", PC_PERM_NO_CHAT_KICK },
    	{ "hide_session", PC_PERM_HIDE_SESSION },
    	{ "who_display_aid", PC_PERM_WHO_DISPLAY_AID },
    	{ "hack_info", PC_PERM_RECEIVE_HACK_INFO },
    	{ "any_warp", PC_PERM_WARP_ANYWHERE },
    	{ "view_hpmeter", PC_PERM_VIEW_HPMETER },
    	{ "view_equipment", PC_PERM_VIEW_EQUIPMENT },
    	{ "use_check", PC_PERM_USE_CHECK },
    	{ "use_changemaptype", PC_PERM_USE_CHANGEMAPTYPE },
    	{ "all_commands", PC_PERM_USE_ALL_COMMANDS },
    	{ "receive_requests", PC_PERM_RECEIVE_REQUESTS },
    	{ "show_bossmobs", PC_PERM_SHOW_BOSS },
    	{ "disable_pvm", PC_PERM_DISABLE_PVM },
    	{ "disable_pvp", PC_PERM_DISABLE_PVP },
    	{ "disable_commands_when_dead", PC_PERM_DISABLE_CMD_DEAD },
    	{ "channel_admin", PC_PERM_CHANNEL_ADMIN },
    	{ "can_trade_bounded", PC_PERM_TRADE_BOUNDED },
    	{ "item_unconditional", PC_PERM_ITEM_UNCONDITIONAL },
    	{ "command_enable",PC_PERM_ENABLE_COMMAND },
    	{ "bypass_stat_onclone",PC_PERM_BYPASS_STAT_ONCLONE },
    	{ "bypass_max_stat",PC_PERM_BYPASS_MAX_STAT },
    	{ "attendance",PC_PERM_ATTENDANCE },
    };

     

×
×
  • Create New...

Important Information

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