Skip to content

Commit

Permalink
* Adjusted @speed so it is no longer reset when a player's status is …
Browse files Browse the repository at this point in the history
…recalculated. Log out or use @speed -1 to reset to default. (bugreport:7306)

> Follow up to r17220:
* Added an extra check if a player does not have a homunculus for 'hommutate' and 'morphembryo'

git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@17236 54d463be-8e91-2dee-dedb-b68131a5f0ec
  • Loading branch information
aleos authored and shennetsind committed Apr 11, 2013
1 parent 20bf5d1 commit 13d907b
Show file tree
Hide file tree
Showing 5 changed files with 16 additions and 3 deletions.
8 changes: 7 additions & 1 deletion src/map/atcommand.c
Original file line number Diff line number Diff line change
Expand Up @@ -850,7 +850,13 @@ ACMD_FUNC(speed)
return -1;
}

sd->base_status.speed = cap_value(speed, MIN_WALK_SPEED, MAX_WALK_SPEED);
if (speed < 0) {
sd->base_status.speed = DEFAULT_WALK_SPEED;
sd->state.permanent_speed = 0; // Remove lock when set back to default speed.
} else {
sd->base_status.speed = cap_value(speed, MIN_WALK_SPEED, MAX_WALK_SPEED);
sd->state.permanent_speed = 1; // Set lock when set to non-default speed.
}
status_calc_bl(&sd->bl, SCB_SPEED);
clif->message(fd, msg_txt(8)); // Speed changed.
return 0;
Expand Down
2 changes: 2 additions & 0 deletions src/map/map.c
Original file line number Diff line number Diff line change
Expand Up @@ -1692,6 +1692,8 @@ int map_quit(struct map_session_data *sd) {

if( sd->state.storage_flag == 1 ) sd->state.storage_flag = 0; // No need to Double Save Storage on Quit.

if (sd->state.permanent_speed == 1) sd->state.permanent_speed = 0; // Remove lock so speed is set back to normal at login.

if( sd->ed ) {
elemental_clean_effect(sd->ed);
unit_remove_map(&sd->ed->bl,CLR_TELEPORT);
Expand Down
1 change: 1 addition & 0 deletions src/map/pc.h
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,7 @@ struct map_session_data {
struct guild *gmaster_flag;
unsigned int prevend : 1;//used to flag wheather you've spent 40sp to open the vending or not.
unsigned int warping : 1;//states whether you're in the middle of a warp processing
unsigned int permanent_speed : 1; // When 1, speed cannot be changed through status_calc_pc().
} state;
struct {
unsigned char no_weapon_damage, no_magic_damage, no_misc_damage;
Expand Down
2 changes: 1 addition & 1 deletion src/map/script.c
Original file line number Diff line number Diff line change
Expand Up @@ -10152,7 +10152,7 @@ BUILDIN_FUNC(homunculus_mutate)
TBL_PC *sd;

sd = script_rid2sd(st);
if( sd == NULL )
if( sd == NULL || sd->hd == NULL )
return 0;

if(script_hasdata(st,2))
Expand Down
6 changes: 5 additions & 1 deletion src/map/status.c
Original file line number Diff line number Diff line change
Expand Up @@ -2335,7 +2335,8 @@ int status_calc_pc_(struct map_session_data* sd, bool first)
memset(&status->max_hp, 0, sizeof(struct status_data)-(sizeof(status->hp)+sizeof(status->sp)));

//FIXME: Most of these stuff should be calculated once, but how do I fix the memset above to do that? [Skotlex]
status->speed = DEFAULT_WALK_SPEED;
if (!pc->state.permanent_speed)
status->speed = DEFAULT_WALK_SPEED;
//Give them all modes except these (useful for clones)
status->mode = MD_MASK&~(MD_BOSS|MD_PLANT|MD_DETECTOR|MD_ANGRY|MD_TARGETWEAK);

Expand Down Expand Up @@ -4988,6 +4989,9 @@ static unsigned short status_calc_speed(struct block_list *bl, struct status_cha
if( sc == NULL )
return cap_value(speed,10,USHRT_MAX);

if (sd && sd->state.permanent_speed)
return (short)cap_value(speed,10,USHRT_MAX);

if( sd && sd->ud.skilltimer != INVALID_TIMER && (pc_checkskill(sd,SA_FREECAST) > 0 || sd->ud.skill_id == LG_EXEEDBREAK) )
{
if( sd->ud.skill_id == LG_EXEEDBREAK )
Expand Down

0 comments on commit 13d907b

Please sign in to comment.