diff options
author | shennetsind <ind@henn.et> | 2013-11-08 16:31:26 -0200 |
---|---|---|
committer | shennetsind <ind@henn.et> | 2013-11-08 16:31:26 -0200 |
commit | 7803b4e0d437681aa09113b5240363d03d85a1b8 (patch) | |
tree | 67e270856f941ab9672eda516be1625981150ab0 | |
parent | 4858233f3aebe920417eaa9531fa298bc2763c04 (diff) | |
download | hercules-7803b4e0d437681aa09113b5240363d03d85a1b8.tar.gz hercules-7803b4e0d437681aa09113b5240363d03d85a1b8.tar.bz2 hercules-7803b4e0d437681aa09113b5240363d03d85a1b8.tar.xz hercules-7803b4e0d437681aa09113b5240363d03d85a1b8.zip |
Fixed 5 Homun Bugs
1. Homun cooldowns are no longer reset upon being vaporized.
2. Call Homun now displays the skill title above the char upon success.
3. Homuns that have been out of owners sight for over 3 seconds will now be teleport back to master.
4. pc_jobchange now correctly vaporizes the homun.
5. New homunculus now spawn with full health.
Special Thanks to kyeme/Beret for all the information and official server testing.
Signed-off-by: shennetsind <ind@henn.et>
-rw-r--r-- | conf/battle/homunc.conf | 2 | ||||
-rw-r--r-- | src/map/homunculus.c | 4 | ||||
-rw-r--r-- | src/map/homunculus.h | 2 | ||||
-rw-r--r-- | src/map/pc.c | 2 | ||||
-rw-r--r-- | src/map/skill.c | 8 | ||||
-rw-r--r-- | src/map/unit.c | 35 |
6 files changed, 33 insertions, 20 deletions
diff --git a/conf/battle/homunc.conf b/conf/battle/homunc.conf index 5e1b1c9d2..92c4b5fe8 100644 --- a/conf/battle/homunc.conf +++ b/conf/battle/homunc.conf @@ -18,7 +18,7 @@ // stat window (by default they don't crit) // 0x020: Their Min-Matk is always the same as their max // 0x040: Skill re-use delay is reset when they are vaporized. -hom_setting: 0xFFFF +hom_setting: 0x3D // The rate a homunculus will get friendly by feeding it. (Note 2) homunculus_friendly_rate: 100 diff --git a/src/map/homunculus.c b/src/map/homunculus.c index 0a162958a..7ab471b9d 100644 --- a/src/map/homunculus.c +++ b/src/map/homunculus.c @@ -755,9 +755,11 @@ bool homunculus_create(struct map_session_data *sd, struct s_homunculus *hom) { unit->calc_pos(&hd->bl, sd->bl.x, sd->bl.y, sd->ud.dir); hd->bl.x = hd->ud.to_x; hd->bl.y = hd->ud.to_y; - + hd->masterteleport_timer = 0; + map->addiddb(&hd->bl); status_calc_homunculus(hd,SCO_FIRST); + status_percent_heal(&hd->bl, 100, 100); hd->hungry_timer = INVALID_TIMER; return true; diff --git a/src/map/homunculus.h b/src/map/homunculus.h index bf1de6171..b7906d4c8 100644 --- a/src/map/homunculus.h +++ b/src/map/homunculus.h @@ -64,6 +64,8 @@ struct homun_data { int hungry_timer; //[orn] unsigned int exp_next; char blockskill[MAX_SKILL]; // [orn] + + int64 masterteleport_timer; }; struct homun_skill_tree_entry { diff --git a/src/map/pc.c b/src/map/pc.c index 07fba6e57..a11d5a8d9 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -6580,7 +6580,7 @@ int pc_resetskill(struct map_session_data* sd, int flag) pc->setoption(sd, i); if( homun_alive(sd->hd) && pc->checkskill(sd, AM_CALLHOMUN) ) - homun->vaporize(sd, HOM_ST_ACTIVE); + homun->vaporize(sd, HOM_ST_REST); } for( i = 1; i < MAX_SKILL; i++ ) { diff --git a/src/map/skill.c b/src/map/skill.c index c16ab832c..f468b5364 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -7541,8 +7541,12 @@ int skill_castend_nodamage_id(struct block_list *src, struct block_list *bl, uin break; case AM_CALLHOMUN: //[orn] - if (sd && homun->call(sd)) - clif->skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); + if( sd ) { + if (homun->call(sd)) + clif->skill_nodamage(src, bl, skill_id, skill_lv, 1); + else + clif->skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); + } break; case AM_REST: diff --git a/src/map/unit.c b/src/map/unit.c index b1240def2..0d5b0d8d3 100644 --- a/src/map/unit.c +++ b/src/map/unit.c @@ -204,23 +204,28 @@ int unit_walktoxy_timer(int tid, int64 tick, int id, intptr_t data) { } else sd->areanpc_id=0; - if( sd->md && !check_distance_bl(&sd->bl, &sd->md->bl, MAX_MER_DISTANCE) ) - { - // mercenary should be warped after being 3 seconds too far from the master [greenbox] - if (sd->md->masterteleport_timer == 0) - { - sd->md->masterteleport_timer = timer->gettick(); - } - else if (DIFF_TICK(timer->gettick(), sd->md->masterteleport_timer) > 3000) - { + if( sd->md ) { // mercenary should be warped after being 3 seconds too far from the master [greenbox] + if( !check_distance_bl(&sd->bl, &sd->md->bl, MAX_MER_DISTANCE) ) { + if (sd->md->masterteleport_timer == 0) + sd->md->masterteleport_timer = timer->gettick(); + else if (DIFF_TICK(timer->gettick(), sd->md->masterteleport_timer) > 3000) { + sd->md->masterteleport_timer = 0; + unit->warp( &sd->md->bl, sd->bl.m, sd->bl.x, sd->bl.y, CLR_TELEPORT ); + } + } else // reset the tick, he is not far anymore sd->md->masterteleport_timer = 0; - unit->warp( &sd->md->bl, sd->bl.m, sd->bl.x, sd->bl.y, CLR_TELEPORT ); - } + } - else if( sd->md ) - { - // reset the tick, he is not far anymore - sd->md->masterteleport_timer = 0; + if( sd->hd ) { + if( homun_alive(sd->hd) && !check_distance_bl(&sd->bl, &sd->hd->bl, MAX_MER_DISTANCE) ) { + if (sd->hd->masterteleport_timer == 0) + sd->hd->masterteleport_timer = timer->gettick(); + else if (DIFF_TICK(timer->gettick(), sd->hd->masterteleport_timer) > 3000) { + sd->hd->masterteleport_timer = 0; + unit->warp( &sd->hd->bl, sd->bl.m, sd->bl.x, sd->bl.y, CLR_TELEPORT ); + } + } else + sd->hd->masterteleport_timer = 0; } } else if (md) { if( map->getcell(bl->m,x,y,CELL_CHKNPC) ) { |