Bom, ai vai um código para quem quer ou pretende utilizar muitos shotEffects em seu servidor. Após o tutorial o seu novo limite será de 65.534 shotEffects.
No TFS 0.3.6
Vá em Protocolgame.cpp e procure por:
void ProtocolGamesendDistanceShoot(const Position& from, const Position& to, uint8_t type)
substitua por:
void ProtocolGamesendDistanceShoot(const Position& from, const Position& to, uint16_t type)
Ainda em Protocolgame.cpp procure a função:
void ProtocolGameAddDistanceShoot(NetworkMessage_ptr msg, const Position& from, const Position& to, uint8_t type){ msg->AddByte(0x85); msg->AddPosition(from); msg->AddPosition(to); msg->AddByte(type + 1);}
E substitua por:
void ProtocolGameAddDistanceShoot(NetworkMessage_ptr msg, const Position& from, const Position& to, uint16_t type){ msg->AddByte(0x85); msg->AddPosition(from); msg->AddPosition(to); msg->AddU16(type + 1);}
Agora em Protocolgame.h procure por:
void AddDistanceShoot(NetworkMessage_ptr msg, const Position& from, const Position& to, uint8_t type);
E substitua por:
void AddDistanceShoot(NetworkMessage_ptr msg, const Position& from, const Position& to, uint16_t type);
Depois procure por:
void sendDistanceShoot(const Position& from, const Position& to, uint8_t type);
E substitua por:
void sendDistanceShoot(const Position& from, const Position& to, uint16_t type);
Agora vamos em Game.cpp
Procure por:
void GameaddDistanceEffect(const Position& fromPos, const Position& toPos, uint8_t effect)
E substitua por:
void GameaddDistanceEffect(const Position& fromPos, const Position& toPos, uint16_t effect)
Agora procure por:
void GameaddDistanceEffect(const SpectatorVec& list, const Position& fromPos, const Position& toPos, uint8_t effect)
E substitua por:
void GameaddDistanceEffect(const SpectatorVec& list, const Position& fromPos, const Position& toPos, uint16_t effect)
Agora vamos em Game.h
Procure por:
void addDistanceEffect(const SpectatorVec& list, const Position& fromPos, const Position& toPos, uint8_t effect);
E substitua por:
void addDistanceEffect(const SpectatorVec& list, const Position& fromPos, const Position& toPos, uint16_t effect);
Agora procure por:
void addDistanceEffect(const Position& fromPos, const Position& toPos, uint8_t effect);
E substitua por:
void addDistanceEffect(const Position& fromPos, const Position& toPos, uint16_t effect);
Agora vamos em Player.h
Procure por:
void sendDistanceShoot(const Position& from, const Position& to, uint8_t type) const
E substitua por:
void sendDistanceShoot(const Position& from, const Position& to, uint16_t type) const
Agora vamos até Const.h
Procure por:
enum ShootEffect_t
E lá depois do ultimo ShotEffect adicione:
SHOOT_EFFECT_SEMFIM = 0xFFFE, //65534
E altere o SHOT_EFFECT_LAST dessa forma:
SHOOT_EFFECT_LAST = SHOOT_EFFECT_SEMFIM,
Agora vamos em Tools.cpp
Procure por:
ShootTypeNames shootTypeNames[] =
E lá depois de:
{"cake", SHOOT_EFFECT_CAKE}
Vocês adicionam:
{"semfim", SHOOT_EFFECT_SEMFIM}
Ficando assim:
{"cake", SHOOT_EFFECT_CAKE}, {"semfim", SHOOT_EFFECT_SEMFIM}
Compile e agora vamos no seu servidor
data/lib/000-constant.lua
Antes de:
CONST_ANI_WEAPONTYPE
Vocês adicionam:
CONST_ANI_SEMFIM = 65534
Depois procure por:
CONST_ANI_NONE
E mudem para:
CONST_ANI_NONE = 65534
Agora ache:
CONST_ANI_LAST
E deixe assim:
CONST_ANI_LAST = CONST_ANI_SEMFIM
Pronto, a parte do código de fonte/servidor está concluída.
"Ah, então já posso usar inúmeros shotEffects.."
NÃO!
Vamos agora as modificações no nosso OTclient.
Apenas uma observação:
FFFE em decimal é 65534, ou seja, seu servidor irá ler shot Effects do 0 até o 65534, evitando trabalho de vocês adicionarem 1 à 1.
Abra a source do seu OTclient com Microsoft Visual Studio ou CodeBlocks e vamos lá:
Vá em Protocolgameparse.cpp
Procure a função:
void ProtocolGameparseDistanceMissile(const InputMessagePtr& msg){ Position fromPos = getPosition(msg); Position toPos = getPosition(msg); int shotId = msg->getU8(); if(!g_things.isValidDatId(shotId, ThingCategoryMissile)) { g_logger.traceError(stdextformat("invalid missile id %d", shotId)); return; } MissilePtr missile = MissilePtr(new Missile()); missile->setId(shotId); missile->setPath(fromPos, toPos); g_map.addThing(missile, fromPos);}
Substitua por:
void ProtocolGameparseDistanceMissile(const InputMessagePtr& msg){ Position fromPos = getPosition(msg); Position toPos = getPosition(msg); int shotId = msg->getU16(); if(!g_things.isValidDatId(shotId, ThingCategoryMissile)) { g_logger.traceError(stdextformat("invalid missile id %d", shotId)); return; } MissilePtr missile = MissilePtr(new Missile()); missile->setId(shotId); missile->setPath(fromPos, toPos); g_map.addThing(missile, fromPos);}
Ainda na source do seu OTclient vá em Const.h
Procure por:
LastGameFeature = 101
E adicione antes:
GameDistanceMissileU16 = 67,
DETALHE: Observe o número anterior, o meu é 66, por isso o novo que usei foi 67.
Feito isso, compile seu OTclient. Depois vão em OTclient/modules/things/things.lua
E dentro da função:
function load()
Adicione a feature:
g_game.enableFeature(GameDistanceMissileU16)
Salvem e pronto, felicidades com seus 65534 ShotEffects.
Atenciosamente, Douglas!
Créditos
Douglas (Lordbaxx) - Trabalhei no OTclient para fazer com que o código funcionasse sem estorva.
KotZletY - Consegui entender mais sobre, graças á ele.