ACMD(do_restart)
{
if (false == ch->IsDead())
{
ch->ChatPacket(CHAT_TYPE_COMMAND, "CloseRestartWindow");
ch->StartRecoveryEvent();
return;
}
if (NULL == ch->m_pkDeadEvent)
return;
int iTimeToDead = (event_time(ch->m_pkDeadEvent) / passes_per_sec);
if (subcmd != SCMD_RESTART_TOWN && (!ch->GetWarMap() || ch->GetWarMap()->GetType() == GUILD_WAR_TYPE_FLAG))
{
if (!test_server)
{
if (ch->IsHack())
{
//성지 맵일경우에는 체크 하지 않는다.
if (false == CThreeWayWar::instance().IsSungZiMapIndex(ch->GetMapIndex()))
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("아직 재시작 할 수 없습니다. (%d초 남음)"), iTimeToDead - (180 - g_nPortalLimitTime));
return;
}
}
#define eFRS_HERESEC 170
if (iTimeToDead > eFRS_HERESEC)
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("아직 재시작 할 수 없습니다. (%d초 남음)"), iTimeToDead - eFRS_HERESEC);
return;
}
}
}
//PREVENT_HACK
//DESC : 창고, 교환 창 후 포탈을 사용하는 버그에 이용될수 있어서
// 쿨타임을 추가
if (subcmd == SCMD_RESTART_TOWN)
{
if (ch->IsHack())
{
//길드맵, 성지맵에서는 체크 하지 않는다.
if ((!ch->GetWarMap() || ch->GetWarMap()->GetType() == GUILD_WAR_TYPE_FLAG) ||
false == CThreeWayWar::instance().IsSungZiMapIndex(ch->GetMapIndex()))
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("아직 재시작 할 수 없습니다. (%d초 남음)"), iTimeToDead - (180 - g_nPortalLimitTime));
return;
}
}
#define eFRS_TOWNSEC 173
if (iTimeToDead > eFRS_TOWNSEC)
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("아직 마을에서 재시작 할 수 없습니다. (%d 초 남음)"), iTimeToDead - eFRS_TOWNSEC);
return;
}
}
//END_PREVENT_HACK
ch->ChatPacket(CHAT_TYPE_COMMAND, "CloseRestartWindow");
ch->GetDesc()->SetPhase(PHASE_GAME);
ch->SetPosition(POS_STANDING);
ch->StartRecoveryEvent();
//FORKED_LOAD
//DESC: 삼거리 전투시 부활을 할경우 맵의 입구가 아닌 삼거리 전투의 시작지점으로 이동하게 된다.
if (1 == quest::CQuestManager::instance().GetEventFlag("threeway_war"))
{
if (subcmd == SCMD_RESTART_TOWN || subcmd == SCMD_RESTART_HERE)
{
if (true == CThreeWayWar::instance().IsThreeWayWarMapIndex(ch->GetMapIndex()) &&
false == CThreeWayWar::instance().IsSungZiMapIndex(ch->GetMapIndex()))
{
ch->GoHome();
ch->ReviveInvisible(5);
ch->PointChange(POINT_HP, ch->GetMaxHP() - ch->GetHP());
ch->PointChange(POINT_SP, ch->GetMaxSP() - ch->GetSP());
return;
}
//성지
if (true == CThreeWayWar::instance().IsSungZiMapIndex(ch->GetMapIndex()))
{
if (CThreeWayWar::instance().GetReviveTokenForPlayer(ch->GetPlayerID()) <= 0)
{
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("성지에서 부활 기회를 모두 잃었습니다! 마을로 이동합니다!"));
ch->GoHome();
}
else
{
ch->Show(ch->GetMapIndex(), GetSungziStartX(ch->GetEmpire()), GetSungziStartY(ch->GetEmpire()));
}
ch->PointChange(POINT_HP, ch->GetMaxHP() - ch->GetHP());
ch->PointChange(POINT_SP, ch->GetMaxSP() - ch->GetSP());
ch->ReviveInvisible(5);
return;
}
}
}
//END_FORKED_LOAD
if (ch->GetDungeon())
ch->GetDungeon()->UseRevive(ch);
if (ch->GetWarMap() && !ch->IsObserverMode())
{
CWarMap* pMap = ch->GetWarMap();
DWORD dwGuildOpponent = pMap ? pMap->GetGuildOpponent(ch) : 0;
if (dwGuildOpponent)
{
switch (subcmd)
{
case SCMD_RESTART_TOWN:
sys_log(0, "do_restart: restart town");
PIXEL_POSITION pos;
if (CWarMapManager::instance().GetStartPosition(ch->GetMapIndex(), ch->GetGuild()->GetID() < dwGuildOpponent ? 0 : 1, pos))
ch->Show(ch->GetMapIndex(), pos.x, pos.y);
else
ch->ExitToSavedLocation();
ch->PointChange(POINT_HP, ch->GetMaxHP() - ch->GetHP());
ch->PointChange(POINT_SP, ch->GetMaxSP() - ch->GetSP());
ch->ReviveInvisible(5);
#ifdef ENABLE_MOUNT_COSTUME_SYSTEM
ch->CheckMount();
#endif
break;
case SCMD_RESTART_HERE:
sys_log(0, "do_restart: restart here");
ch->RestartAtSamePos();
//ch->Show(ch->GetMapIndex(), ch->GetX(), ch->GetY());
ch->PointChange(POINT_HP, ch->GetMaxHP() - ch->GetHP());
ch->PointChange(POINT_SP, ch->GetMaxSP() - ch->GetSP());
ch->ReviveInvisible(5);
#ifdef ENABLE_MOUNT_COSTUME_SYSTEM
ch->CheckMount();
#endif
break;
}
return;
}
}
switch (subcmd)
{
case SCMD_RESTART_TOWN:
sys_log(0, "do_restart: restart town");
PIXEL_POSITION pos;
if (SECTREE_MANAGER::instance().GetRecallPositionByEmpire(ch->GetMapIndex(), ch->GetEmpire(), pos))
ch->WarpSet(pos.x, pos.y);
else
ch->GoHome();
ch->PointChange(POINT_HP, 50 - ch->GetHP());
ch->DeathPenalty(1);
break;
case SCMD_RESTART_HERE:
sys_log(0, "do_restart: restart here");
ch->RestartAtSamePos();
//ch->Show(ch->GetMapIndex(), ch->GetX(), ch->GetY());
ch->PointChange(POINT_HP, 50 - ch->GetHP());
ch->DeathPenalty(0);
ch->ReviveInvisible(5);
#ifdef ENABLE_MOUNT_COSTUME_SYSTEM
ch->CheckMount();
#endif
break;
}
}