Training Offline


Bom galera, hoje venho vos trazer um script que saiu no tão famoso e fodastico Offline Training.
Créditos:
* Gesior.pl [otland]
Bom, primeiro tenho que dizer, que este bar, é a barra que mostra o tempo de treino, apenas nos clientes 8.6 por isso em diversas partes você irá encontrar algo como bar, que será respectivamente algo a ver com essa barra das 12 horas.
Pelo que li na otland está escrito isso:
Offline training, with bar in-game- show time left on 'bar' [9.6 client]
- use skill and mlvl rate from config.lua
- use vocations.xml config to:
- - calculate magic level [food mana regen of vocation]
- - calculate club/axe/sword/distance gain speed [attackSpeed of vocation]
Code tested on TFS 0.4, 9.6 (one of newest revisions). LUA scripts should work on most of TFSes (0.3.6 - 0.4), but only on 9.6 is 'bar' that show time left and RL tibia items to 'click' to select type of training. Script is designed to make it possible to start training other way then clicking on 'statue'.
How does it calculate skills/mlvl?
- sword, axe, club, distance: it uses multiplier from config.lua, it check attackSpeed of player vocation and 'attack' as fast he can
- shield: it uses multiplier from config.lua, it add one 'hit' per one offline second [like when you train with 2 Monks]
- magic level: it uses multiplier from config.lua, it adds as much 'mana spent' [mag level] as player could regenerate if he eat some food
Traduzindo:
Treinamento offline, com barra no jogo (barrinha 12:00)
- Mostra as horas de treino a direita no 'bar' (cliente 9.6)
- Usar a habilidade e velocidade de mlvl config.lua
- Configure o vocations.xml para:
* Calcular o nivel da magia [comida, mana, regeneração da vocação]
* Calcular club, axe, sword, speed distance, [attackspeed da vocação]
Código testado em TFS 0.4 Versão 9.60 (uma das mais recentes versoes). Script lua deve trabalhar em TFSes (0.3.5 - 0.4), mas apenas em 9.6 é o 'bar', que mostra o tempo de treino offline. Script é projetado para torná-lo possível iniciar outro treinamento depois clicando na estátua.
Como ele calcula as habilidades?
- Sword, axe, club, distance: Ele usa o multiplicador do config.lua, ele verifica attackSpeed da vocação do jogador e 'atacar' o mais rápido que puder.
- Escudo: Ele usa o mutiplicador do config.lua, ele adiciona um 'hit' por um segundo offline (como quando você treina com 2 monks).
- Nivel de magia: Ele usa o multiplicador do config.lua acrescenta tanto 'mana gasto' [nivel ml] como jogador pode regenerar se ele comer alguma comida.
No início do 'lib' você tem configuração básica, aqui você pode reduzir / aumentar a habilidade / mlvl, 100 = 100% do normal [descrita acima]:
Lua Code:
-- config, in percent of normal training with 2 trainers and player vocation mana regeneration [by food]
OfflineTraining_rates = {
[sKILL_CLUB] = 100,
[sKILL_SWORD] = 100,
[sKILL_AXE] = 100,
[sKILL_DISTANCE] = 100,
[sKILL_SHIELD] = 100,
[sKILL__MAGLEVEL] = 100
}
(abaixo de configuração são funções que podem ser modificadas para se você quiser fazê-lo iniciar com outra ação, em seguida, "clique na estátua", exemplo: se o jogador início trainging sair em alguma área)
First LUA scripts:
../data/lib/103-offline-training.lua
Lua Code:
-- config, in percent of normal training with 2 trainers and player vocation mana regeneration [by food]
OfflineTraining_rates = {
[sKILL_CLUB] = 100,
[sKILL_SWORD] = 100,
[sKILL_AXE] = 100,
[sKILL_DISTANCE] = 100,
[sKILL_SHIELD] = 100,
[sKILL__MAGLEVEL] = 100
}
-- function that you should edit to make it add other skill etc.
function OfflineTraining_canStartTraining(cid) -- return bool
return getCreatureStorage(cid, 62669) > 0
end
function OfflineTraining_onStartTraining(cid)
-- maybe someone will need
-- to save your time, this: doPlayerPopupFYI(cid, "You started offline training.")
-- NOT WORK
end
function OfflineTraining_onEndTraining(cid)
doCreatureSetStorage(cid, 62669, 0)
end
function OfflineTraining_addTrainedSkills(cid, trainTime) -- time in minutes!
local timeInSeconds = trainTime * 60
local vocInfo = getVocationInfo(getPlayerVocation(cid))
if(getCreatureStorage(cid, 62669) == SKILL_SWORD) then
doPlayerAddSkillTry(cid, SKILL_SWORD, ((timeInSeconds * 1000) / vocInfo["attackSpeed"]) * OfflineTraining_rates[sKILL_SWORD] / 100, true)
elseif(getCreatureStorage(cid, 62669) == SKILL_AXE) then
doPlayerAddSkillTry(cid, SKILL_AXE, ((timeInSeconds * 1000) / vocInfo["attackSpeed"]) * OfflineTraining_rates[sKILL_AXE] / 100, true)
elseif(getCreatureStorage(cid, 62669) == SKILL__MAGLEVEL) then
doPlayerAddSpentMana(cid, ((timeInSeconds / vocInfo["manaGainTicks"]) * vocInfo["manaGain"]) * OfflineTraining_rates[sKILL__MAGLEVEL] / 100, true)
elseif(getCreatureStorage(cid, 62669) == SKILL_CLUB) then
doPlayerAddSkillTry(cid, SKILL_CLUB, ((timeInSeconds * 1000) / vocInfo["attackSpeed"]) * OfflineTraining_rates[sKILL_CLUB] / 100, true)
elseif(getCreatureStorage(cid, 62669) == SKILL_DISTANCE) then
doPlayerAddSkillTry(cid, SKILL_DISTANCE, ((timeInSeconds * 1000) / vocInfo["attackSpeed"]) * OfflineTraining_rates[sKILL_DISTANCE] / 100, true)
end
doPlayerAddSkillTry(cid, SKILL_SHIELD, timeInSeconds * OfflineTraining_rates[sKILL_SHIELD] / 100, true)
end
-- 4 functions to show right values on 'bar' in Tibia 9.6
function OfflineTraining_getTime(cid)
return getCreatureStorage(cid, 62666)
end
function OfflineTraining_setTime(cid, newTime)
-- set values only between 0 - 720 [12 hours]
doCreatureSetStorage(cid, 62666, math.max(0, math.min(newTime, 720)))
-- now code to force server to send 'PlayerStats' (including Offline Time)
-- we must change any stat: hp,mana,stamina,cap,soul,exp,level
doPlayerAddSoul(cid, 1)
doPlayerAddSoul(cid, -1)
end
function OfflineTraining_addTime(cid, addTime)
OfflineTraining_setTime(cid, OfflineTraining_getTime(cid) + addTime)
end
function OfflineTraining_removeTime(cid, removeTime)
OfflineTraining_setTime(cid, OfflineTraining_getTime(cid) - removeTime)
end
-- functions for library to add skills/mlvl
function OfflineTraining_initialize(cid)
if(OfflineTraining_getTime(cid) == -1) then
OfflineTraining_setTime(cid, 720)
OfflineTraining_setLogoutTime(cid) -- block problem with first login 'add time'
end
end
function OfflineTraining_isTraining(cid)
return (getCreatureStorage(cid, 62667) > 0)
end
function OfflineTraining_turnOnTraining(cid)
doCreatureSetStorage(cid, 62667, 1)
end
function OfflineTraining_turnOffTraining(cid)
doCreatureSetStorage(cid, 62667, 0)
end
function OfflineTraining_getOfflineTime(cid)
return math.floor((os.time() - getCreatureStorage(cid, 62668)) / 60)
end
function OfflineTraining_setLogoutTime(cid)
return doCreatureSetStorage(cid, 62668, os.time())
end
../data/actions/actions.xml
XML Code:
<action itemid="18492" script="offtrain_statue.lua"/>
<action itemid="18491" script="offtrain_statue.lua"/>
<action itemid="18490" script="offtrain_statue.lua"/>
<action itemid="18489" script="offtrain_statue.lua"/>
<action itemid="18488" script="offtrain_statue.lua"/>
../data/actions/scripts/offtrain_statue.lua
Lua Code:
-- example 'action' when you click on statue:
function onUse(cid, item, fromPosition, itemEx, toPosition)
if(item.itemid == 18488) then -- sword
doCreatureSetStorage(cid, 62669, SKILL_SWORD)
elseif(item.itemid == 18489) then -- axe
doCreatureSetStorage(cid, 62669, SKILL_AXE)
elseif(item.itemid == 18492) then -- mlvl
doCreatureSetStorage(cid, 62669, SKILL__MAGLEVEL)
elseif(item.itemid == 18490) then -- club
doCreatureSetStorage(cid, 62669, SKILL_CLUB)
elseif(item.itemid == 18491) then -- distannce
doCreatureSetStorage(cid, 62669, SKILL_DISTANCE)
end
-- we remove player, so it will execute onLogout(cid) function and save time of training start
doRemoveCreature(cid)
end
../data/creaturescripts/creaturescripts.xml
XML Code:
<event type="login" name="offtrain_PlayerLogin" event="script" value="offtrain_login.lua"/>
<event type="logout" name="offtrain_PlayerLogout" event="script" value="offtrain_logout.lua"/>
../data/creaturescripts/scripts/offtrain_login.lua
Lua Code:
-- 0.4 - offline training - login.lua
function onLogin(cid)
OfflineTraining_initialize(cid)
if(OfflineTraining_isTraining(cid)) then
OfflineTraining_turnOffTraining(cid)
-- we add skill/mlvl, we select lower value: time that player was offline OR offline training time [bar in game - 9.6]
OfflineTraining_addTrainedSkills(cid, math.min(OfflineTraining_getTime(cid), OfflineTraining_getOfflineTime(cid)))
-- we remove offline training time [bar in game - 9.6],
-- if player was offline longer then his 'offline training time' it will add him time [like on RL tibia]
-- got '3 hours offline training time', stay logged off for 8 hours, you get skills for 3 hours and on login you got '5 hours offline training time'
OfflineTraining_setTime(cid, math.abs(OfflineTraining_getTime(cid) - OfflineTraining_getOfflineTime(cid)))
OfflineTraining_onEndTraining(cid)
else
-- offline training time also regenerate when you are offline, but NOT train
OfflineTraining_setTime(cid, OfflineTraining_getTime(cid) + OfflineTraining_getOfflineTime(cid))
end
return true
end
../data/creaturescripts/scripts/offtrain_logout.lua
Lua Code:
-- 0.4 - offline training - logout.lua
function onLogout(cid)
if(OfflineTraining_canStartTraining(cid)) then
OfflineTraining_turnOnTraining(cid)
OfflineTraining_onStartTraining(cid)
end
OfflineTraining_setLogoutTime(cid)
return true
end
../data/globalevents/globalevents.xml
XML Code:
<globalevent name="offtrain_add_minutes" interval="60000" event="script" value="offtrain_addMinutes.lua"/>
Caso versões antigas, trocar o intervalo pra 60
../data/globalevents/scripts/offtrain_addMinutes.lua
Lua Code:
function onThink(interval) -- run it with interval 60 seconds
for _, cid in pairs(getPlayersOnline()) do
OfflineTraining_addTime(cid, 1)
end
return true
end
Código C++ para TFS 0.4, versão 9.60 pra mostrar o tempo do treino na barrinha la.
In file protocolgame.cpp
Find:
C Code:
msg->put<uint16_t>(720);
e substituir por:
C Code:
// offline training minutesstd::string strValue;
if(!player->getStorage("62666", strValue))
{
// no storage
msg->put<uint16_t>(0);
}
else
{
msg->put<uint16_t>((uint16_t) atoi(strValue.c_str()));
}
Isso irá mostrar o valor (storage: 62666) no bar > 0 = 0:00, 720 = 12:00 [12 horas tempo total] - em minutos.