Jump to content

Playtester

Developer
  • Posts

    905
  • Joined

  • Last visited

  • Days Won

    26

Posts posted by Playtester

  1. Es gibt keine episodischen files, aber wenn du alte eAthena files willst kannst du jederzeit über das Githup Repository gehen. Die älteste sinnvolle Version die du da findest ist von Januar 2006:

    https://github.com/eathena/eathena/tree/382230bc611dbd2b335db4a65e6f42af64c2affc

    Das enthält schon ein paar spätere Episoden, aber die meisten Informationen entsprechen noch dem Episode 9 stand (z.B. die Monster Exp Werte von alten Monstern sind noch von Episode 9).

    Aegis Files sind wohl für immer verloren, da das ASB Sakray Board vor nem Jahr geschlossen hat. Jemand hatte mal alle Dateien auf "Mega" hochgeladen, aber der Link dahin war auf dem Board...

    Hab nur noch ne Episode 7 Aegis Mob DB die ich mal ins rAthena Format konvertiert hatte (ist aber nicht mehr auf dem aktuellen rAthena stand, würde also so nicht funktionieren, müsste man erst mob mode konvertieren glaub ich).

    mob_db_7.txt

  2. In battle.cpp find this:

    		case MO_EXTREMITYFIST:
    			skillratio += 100 * (7 + sstatus->sp / 10);
    			skillratio = min(500000,skillratio); //We stop at roughly 50k SP for overflow protection
    			break;

    And change it to:

    		case MO_EXTREMITYFIST:
    			skillratio += skill_lv * 20 * (7 + sstatus->sp / 10);
    			skillratio = min(500000,skillratio); //We stop at roughly 50k SP for overflow protection
    			break;

     

  3. 1. skill.cpp -> skill_calc_heal -> adjust as needed

    2. Not as trivial, but it's all in status.cpp (if you search for status_calc_aspd you find most relevant locations)

    3. Not too familiar with it, but I suggest taking a look at the fame point system for crafting or even just TK mission and try to replicate it somehow, probably requires database changes to store the value too. It's also mostly in skill.cpp but pc.cpp handles storing those values.

    4. You'll need to recode the skill, take a look at how AoE skills work and how single target skills work in skill.cpp.

    5. Not sure. Could just be DB not allowing the class to equip the item if it works as thief and not as assassin.

    6. That's pretty easy, but it can be at different locations. If you want to adjust damage check battle.cpp (search e.g. for AM_AXEMASTERY and you immediately find the location). To adjust other values you might want to do that in status.cpp at the location where the corresponding stat is calculated like KN_CAVALIERMASTERY.

     

    • Upvote 1
  4. For some reason this reply displayed for me today. Maybe some bug with the year?

    Anyway, if you still want the answer - I honestly don't understand how you can even reach that conclusion. When adding hexadecimals there's no number over flow. You just add per digit.

    Take a look at the second digit from the right, you will have:

    0 + 1 + 2 + 8 + 0 + 0 + 0 + 0 + 0 +0 = 11

    11 in hexidecimal is a B. So the result for the second digit from the right is B. You do the same for every digit.

    • MVP 1
  5. There's also that invincible spell:

    1929,Great Demon Baphomet@NPC_INVINCIBLE,idle,685,1,10000,1000,60000,no,self,always,0,,,,,,,19
    1929,Great Demon Baphomet@NPC_INVINCIBLE,chase,685,1,10000,1000,60000,no,self,always,0,,,,,,,19
    1929,Great Demon Baphomet@NPC_INVINCIBLE,attack,685,1,10000,1000,60000,no,self,always,0,,,,,,,19
    

    Or just make the monster cast NPC_ALLHEAL when wounded.

    Usually plant mode (all the MD_IGNORE bitsets) and sufficient HP should really do the trick though. That's how they do it on official servers too.

  6. Basically developers bored and crazy enough to work for no money whatsoever recoded the whole server engine of the Ragnarok Online MMORPG, mainly due to legal reasons and to be able to easily add customization.

    Then that project split up into many different projects because people who are not getting paid have the tendency to get into pointless fights about how to approach certain things. And language barrier. 

  7. Just because the code compiles doesn't mean it makes any sense. What you're doing is casting mob_id to a pointer (memory address) and then make the sd pointer point to that address.

    I explained to you how you can get sd -> by fetching all the players in visible range of the monster.

    • Upvote 1
  8. sd will just get garbage data like that (it will point to whatever memory that mob_id value is saved on and behind that).

    sd is only for players not for monsters.

    Monsters are not human beings, there's no point showing them a label.

    • Upvote 1
  9. An event is player-specific, but here you are in a mob-specific function, so how should that work?

    You need to put it in a place that is player-specific.

    Technically, if you want to get from the monster to a list of player, you would do something like "For all players in view range of the monster", but that's fairly complex, nothing I can write down for you. You can search for "map_foreach" in mob.cpp to see similar applications. For example this part:

    
    	// Scan area for targets
    	if (!tbl && can_move && mode&MD_LOOTER && md->lootitems && DIFF_TICK(tick, md->ud.canact_tick) > 0 &&
    		(md->lootitem_count < LOOTITEM_SIZE || battle_config.monster_loot_type != 1))
    	{	// Scan area for items to loot, avoid trying to loot if the mob is full and can't consume the items.
    		map_foreachinshootrange (mob_ai_sub_hard_lootsearch, &md->bl, view_range, BL_ITEM, md, &tbl);
    	}
    
    	if ((!tbl && mode&MD_AGGRESSIVE) || md->state.skillstate == MSS_FOLLOW)
    	{
    		map_foreachinallrange (mob_ai_sub_hard_activesearch, &md->bl, view_range, DEFAULT_ENEMY_TYPE(md), md, &tbl, mode);
    	}
    	else
    	if (mode&MD_CHANGECHASE && (md->state.skillstate == MSS_RUSH || md->state.skillstate == MSS_FOLLOW))
    	{
    		int search_size;
    		search_size = view_range<md->status.rhw.range ? view_range:md->status.rhw.range;
    		map_foreachinallrange (mob_ai_sub_hard_changechase, &md->bl, search_size, DEFAULT_ENEMY_TYPE(md), md, &tbl);
    	}

    Here is search for all targets in range and calls a function per target found. In that underlying function you will have "bl" of the player from which you can fetch sd.

    You basically want something similar: "For all players in range -> call new function (you need to define it) -> get sd from bl in new function and then do your function call"

    • Upvote 1
  10. Refer to this document if you are looking for item bonuses: https://github.com/rathena/rathena/blob/master/doc/item_bonus.txt

    Cast time/delay
    ---------------
    bonus bCastrate,n;             		Skill cast time rate + n%. (If RENEWAL_CAST is defined, this bonus is equal to bVariableCastrate)
    bonus2 bCastrate,sk,n;         		Adjust casting time of skill sk by n%.(If RENEWAL_CAST is defined, this bonus is equal to bVariableCastrate)
    
    bonus bFixedCastrate,n;        		Increases fixed cast time of all skills by n% (has effect in RENEWAL_CAST only)
    bonus2 bFixedCastrate,sk,n;    		Increases fixed cast time of skill sk by n% (has effect in RENEWAL_CAST only)
    bonus bVariableCastrate,n;     		Increases variable cast time of all skills by n%. (If RENEWAL_CAST is NOT defined, this bonus is equal to bCastrate)
    bonus2 bVariableCastrate,sk,n; 		Increases variable cast time of skill sk by n% (If RENEWAL_CAST is NOT defined, this bonus is equal to bCastrate)
    
    bonus bFixedCast,t;            		Increases fixed cast time of all skills by t milliseconds (has effect in RENEWAL_CAST only)
    bonus2 bSkillFixedCast,sk,t;   		Increases fixed cast time of skill sk by t milliseconds (has effect in RENEWAL_CAST only)
    bonus bVariableCast,t;         		Increases variable cast time of all skills by t milliseconds (has effect in RENEWAL_CAST only)
    bonus2 bSkillVariableCast,sk,t;		Increases variable cast time of skill sk by t milliseconds (has effect in RENEWAL_CAST only)
    
    bonus bNoCastCancel,n; 			Prevents casting from being interrupted when hit (does not work in GvG | n is meaningless)
    bonus bNoCastCancel2,n;			Prevents casting from being interrupted when hit (works even in GvG | n is meaningless)
    
    bonus bDelayrate,n;        		Increases skill delay by n%
    bonus2 bSkillCooldown,sk,t; Increases cooldown of skill sk by t milliseconds

     

  11. Could be a bug looking at all the sources that say weapon attack of instruments and whips should depend on dex.

    But currently it's implemented to use STR for all attack with range of 3 or lower. Anything with range 4 or higher uses DEX to calc watk.

    #ifdef RENEWAL
    /**
     * Weapon attack value calculated for Players
     * @param wa: Weapon attack
     * @param status: Player status
     * @return weapon attack
     */
    unsigned int status_weapon_atk(struct weapon_atk wa, struct map_session_data *sd)
    {
    	float str = sd->base_status.str;
    	int weapon_atk_bonus = 0;
    
    	if (wa.range > 3 && !pc_checkskill(sd, SU_SOULATTACK))
    		str = sd->base_status.dex;
    	if (sd->bonus.weapon_atk_rate)
    		weapon_atk_bonus = wa.atk * sd->bonus.weapon_atk_rate / 100;
    	// wa.atk2 = refinement, wa.atk = base equip atk, wa.atk*str/200 = bonus str
    	return wa.atk + wa.atk2 + (int)(wa.atk * (str/200) + weapon_atk_bonus);
    }
    #endif

     

    • Upvote 1
  12. 22 hours ago, skymia said:

    how to make this only for 4-5 secs

    Well the resist does not affect the base duration which is different for each skill. But if you want 12 seconds to be reduced to 4-5 seconds then try:

    		case SC_FREEZE:
    			sc_def = status->mdef*100;
    			sc_def2 = status->luk*10 + status_get_lv(bl)*10 - status_get_lv(src)*10;
    			tick_def = 6000 + status->mdef*40;
    			tick_def2 = status_src->luk*-10; // Caster can increase final duration with luk
    			break;

     

    • Upvote 1
  13. I'm not sure why you would want that. Freeze would be useless if it only lasted 2 seconds and also makes spells like Storm Gust abusable, BUT if you really insist then find this in status.cpp:

    		case SC_FREEZE:
    			sc_def = status->mdef*100;
    			sc_def2 = status->luk*10 + status_get_lv(bl)*10 - status_get_lv(src)*10;
    			tick_def2 = status_src->luk*-10; // Caster can increase final duration with luk
    			break;

    And change it to:

    		case SC_FREEZE:
    			sc_def = status->mdef*100;
    			sc_def2 = status->luk*10 + status_get_lv(bl)*10 - status_get_lv(src)*10;
    			tick_def = 8000 + status->mdef*20;
    			tick_def2 = status_src->luk*-10; // Caster can increase final duration with luk
    			break;

    That way all Freeze durations are reduced by 5 times, but you still maintain same immunity and other behavior.

    • Upvote 1
×
×
  • Create New...