Bug Title: amplifier unlimited stats
Bug Description: remove amps stats after switch or use a ticket in same region , unlimited stats time if player login after real ticks finished
example : used nana for 10 min , if player logged out then logged after 11min or more nana will be 15999998 seconds
Status: Closed
Author: mkhzaleh
this will save real time and stop ticks when player logout
inside Character.cpp
search for
void CCharacter::SwitchMap(SubMap *pCSrcMap, cChar *szTarMapName, Long lTarX, Long lTarY, bool bNeedOutSrcMap, Char chSwitchType, Long lTMapCpyNO)
replace with
void CCharacter::SwitchMap(SubMap *pCSrcMap, cChar *szTarMapName, Long lTarX, Long lTarY, bool bNeedOutSrcMap, Char chSwitchType, Long lTMapCpyNO)
{T_B
if (!pCSrcMap)
return;
BreakAction();
if( IsPlayerCha() )
{
SetSubMap( pCSrcMap );
GetPlayer()->MisGooutMap();
SetSubMap( NULL );
}
if (bNeedOutSrcMap && pCSrcMap)
pCSrcMap->GoOut(this);
if (!strcmp(pCSrcMap->GetName(), szTarMapName)) // 同地图间切换
{
if (GetPlayer())
//LG("enter_map", "SwitchMap(同地图切换,控制角色名 %s[主角色名 %s],地图名 %s)--------\n", GetLogName(), GetPlyMainCha()->GetLogName(), szTarMapName);
LG("enter_map", "SwitchMap(the same map switch,control player name %s[mainplayer %s],mapname %s)--------\n", GetLogName(), GetPlyMainCha()->GetLogName(), szTarMapName);
if (m_SMoveRedu.ulStartTick == 0xffffffff)
m_SMoveRedu.ulStartTick = GetTickCount();
if(!IsPlayerCha()) // 非玩家角色,则在自己的出生点重生
{
m_SFightInit.chTarType = 0;
m_CChaAttr.Init(GetCat());
Square SSrcShape = GetShape();
Square STarShape = {{lTarX, lTarY}, GetRadius()};
if (!pCSrcMap->Enter(&STarShape, this))
pCSrcMap->Enter(&SSrcShape, this);
}
else
{
SStateData2String(this, g_skillstate, 1024);
//PStateData2String(this, g_skillstate, 1024);
if (IsBoat())
g_strChaState[1] = g_skillstate;
else
g_strChaState[0] = g_skillstate;
Square SSrcShape = GetShape();
Square STarShape = {{lTarX, lTarY}, SSrcShape.radius};
if (!pCSrcMap->EnsurePos(&STarShape, this)) // 进入失败
{
lTarX = SSrcShape.centre.x;
lTarY = SSrcShape.centre.y;
}
GetPlayer()->GetMainCha()->Cmd_EnterMap(szTarMapName, lTMapCpyNO, lTarX, lTarY);
// 角色护送NPC同步地图切换
GetPlayer()->MisEnterMap();
}
SetExistState(enumEXISTS_WAITING);
return;
}
else
{
bool bVolunteer = false;
SubMap *pCBackM = GetSubMap();
SetSubMap(pCSrcMap);
pCSrcMap->BeforePlyOutMap(this);
//LG("enter_map", "SwitchMap(不同Server地图切换,控制角色名 %s[主角色名 %s],原地图 %s,目标地图 %s)--------\n", GetLogName(), GetPlyMainCha()->GetLogName(), pCSrcMap->GetName(), szTarMapName);
LG("enter_map", "SwitchMap(differ Server map switch,control player name %s[mainplayer %s],formerly map %s,aimmap %s)--------\n", GetLogName(), GetPlyMainCha()->GetLogName(), pCSrcMap->GetName(), szTarMapName);
if (GetSubMap())
//LG("enter_map", "角色地图名 %s\n", GetSubMap()->GetName());
LG("enter_map", "character map name %s\n", GetSubMap()->GetName());
// 资料写数据库
CPlayer *pPlayer = GetPlayer();
if(!pPlayer)
return;
//组队面板修改
if(GetPlyMainCha()->IsVolunteer())
{
bVolunteer = true;
GetPlyMainCha()->Cmd_DelVolunteer();
}
game_db.SavePlayer(pPlayer, enumSAVE_TYPE_SWITCH);
//LG("enter_map", "保存数据成功\n");
LG("enter_map", "save data succeed\n");
// 角色护送NPC同步地图切换
pPlayer->MisLogout();
SetSubMap(pCBackM);
// 发送协议
WPACKET l_wpk =GETWPACKET();
WRITE_CMD(l_wpk, CMD_MT_SWITCHMAP);
WRITE_STRING(l_wpk, pCSrcMap->GetName());
WRITE_LONG(l_wpk, pCSrcMap->GetCopyNO());
WRITE_LONG(l_wpk, GetShape().centre.x);
WRITE_LONG(l_wpk, GetShape().centre.y);
WRITE_STRING(l_wpk, szTarMapName);
WRITE_LONG(l_wpk, lTMapCpyNO);
WRITE_LONG(l_wpk, lTarX);
WRITE_LONG(l_wpk, lTarY);
if (chSwitchType == enumSWITCHMAP_DIE) // 死亡导致的地图切换(如果目标地图不可达,则gate强制玩家下线,不会返回源地图)
WRITE_CHAR(l_wpk, 1);
else
WRITE_CHAR(l_wpk, 0);
ReflectINFof(this,l_wpk);
g_pGameApp->DelPlayerIdx(pPlayer->GetDBChaId());
g_pGameApp->m_dwPlayerCnt--;
pPlayer->Free();
// 删除gate server对应的维护信息
pPlayer->OnLogoff();
DELPLAYER(pPlayer);
//LG("enter_map", "结束进入地图\n\n");
LG("enter_map", "finish enter map\n\n");
}
T_E}
inside GameDB.cpp
search for
PStateData2String(pCha, g_skillstate, defSSTATE_DATE_STRING_LIN);
replace with
SStateData2String(pCha, g_skillstate, defSSTATE_DATE_STRING_LIN);