-
Total de itens
75 -
Registro em
-
Última visita
Histórico de Curtidas
-
Yota recebeu reputação de Wakon em [C ]Level System in monster [0.3.6]
Boa noite, venho compartilhar o código feito por @Oneshot/ @Garou, com adaptação para tfs 0.3.6 (854) por mim. Bem, ele postou para atfs 0.4 (860), dai eu só mexi em umas linhas parar funcionar no tfs 0.3.6(854), dai vou compartilhar com vocês.
Com o monster level system, o monstro passa a ter level e ganha mais HP, dá mais dano, tem mais defesa, dependendo dele. monsters.h
procure por:
bool isSummonable, isIllusionable, isConvinceable, isAttackable, isHostile, isLureable, isWalkable, canPushItems, canPushCreatures, pushable, hideName, hideHealth; Substitua por:
bool isSummonable, isIllusionable, isConvinceable, isAttackable, isHostile, isLureable, isWalkable, canPushItems, canPushCreatures, pushable, hideName, hideHealth, hideLevel; Procure por:
int32_t defense, armor, health, healthMax, baseSpeed, lookCorpse, corpseUnique, corpseAction, maxSummons, targetDistance, runAwayHealth, conditionImmunities, damageImmunities, lightLevel, lightColor, changeTargetSpeed, changeTargetChance; Substitua por:
int32_t defense, armor, health, healthMax, baseSpeed, lookCorpse, corpseUnique, corpseAction, maxSummons, targetDistance, runAwayHealth, conditionImmunities, damageImmunities, lightLevel, lightColor, changeTargetSpeed, changeTargetChance, levelMin, levelMax; monsters.cpp
Procure por:
canPushItems = canPushCreatures = isSummonable = isIllusionable = isConvinceable = isLureable = isWalkable = hideName = hideHealth = false; Substitua por:
canPushItems = canPushCreatures = isSummonable = isIllusionable = isConvinceable = isLureable = isWalkable = hideName = hideHealth = hideLevel = false; Procure por:
baseSpeed = 200; Logo abaixo, adicione:
levelMin = levelMax = 1; Localize:
if(readXMLInteger(p, "max", intValue)) mType->healthMax = intValue; else { SHOW_XML_ERROR("Missing health.max"); monsterLoad = false; } } abaixo adicione:
else if(!xmlStrcmp(p->name, (const xmlChar*)"level")) { if(!readXMLInteger(p, "max", intValue)) mType->levelMax = 1; else mType->levelMax = intValue; if(!readXMLInteger(p, "min", intValue)) mType->levelMin = mType->levelMax; else mType->levelMin = intValue; } procure por:
if(readXMLString(tmpNode, "shield", strValue)) mType->partyShield = getPartyShield(strValue); logo baixo adicione:
if(readXMLString(tmpNode, "hidelevel", strValue)) mType->hideLevel = booleanString(strValue); Monster.h
Procure:
virtual ~Monster(); std::string name, nameDescription; abaixo adicione:
std::string name, nameDescription; int32_t level; double bonusAttack, bonusDefense; Procure:
virtual const std::string& getName() const {return mType->name;} virtual const std::string& getNameDescription() const {return mType->nameDescription;} virtual std::string getDescription(int32_t) const {return mType->nameDescription + ".";} Substitua por:
virtual const std::string& getName() const {return name;} virtual const std::string& getNameDescription() const {return nameDescription;} virtual std::string getDescription(int32_t) const {return nameDescription + ".";} Monster.cpp
Logo abaixo de:
isIdle = true; Adicione:
name = _mType->name; nameDescription = _mType->nameDescription; level = (int32_t)random_range(_mType->levelMin, _mType->levelMax, DISTRO_NORMAL); bonusAttack = 1.0; bonusDefense = 1.0; Procure por está função:
Monster::onCreatureAppear Apague e coloque está função:
void Monster::onCreatureAppear(const Creature* creature) { Creature::onCreatureAppear(creature); if(creature == this) { //We just spawned lets look around to see who is there. if(isSummon()) { std::string value; // this->master->getStorage((uint32_t)"1996", value); this->master->getStorage((uint32_t)"1996", value); uint8_t intValue = atoi(value.c_str()); if(intValue || value == "0") level = intValue; else level = 1; isMasterInRange = canSee(master->getPosition()); } if(g_config.getBool(ConfigManager::MONSTER_HAS_LEVEL)) { this->healthMax = std::floor(this->getMaxHealth() * (1. + (0.1 * (level - 1)))); this->health = this->healthMax; this->bonusAttack += (0.01 * (level - 1)); this->bonusDefense += (0.005 * (level - 1)); } updateTargetList(); updateIdleStatus(); } else onCreatureEnter(const_cast<Creature*>(creature)); } Substitua todos:
g_config.getDouble(ConfigManager::RATE_MONSTER_DEFENSE) Por:
g_config.getDouble(ConfigManager::RATE_MONSTER_DEFENSE) * bonusDefense Substitua todos:
g_config.getDouble(ConfigManager::RATE_MONSTER_ATTACK) Por:
g_config.getDouble(ConfigManager::RATE_MONSTER_ATTACK) * bonusAttack Map.cpp
Procure por:
#include "game.h" Adicione em baixo:
#include "configmanager.h" Procure por:
extern Game g_game; Adicione em baixo:
extern ConfigManager g_config; Procure por está função:
bool Map::placeCreature(const Position& centerPos, Creature* creature, bool extendedPos /*= false*/, bool forced /*= false*/) { Abaixo do " { " adicione:
Monster* monster = creature->getMonster(); if(monster && g_config.getBool(ConfigManager::MONSTER_HAS_LEVEL)) { uint8_t level; if(!monster->getMonsterType()->hideLevel) { if(monster->isSummon()) { std::string value; // monster->getMaster()->getStorage((uint32_t)"1996", value); monster->getMaster()->getStorage((uint32_t)"1996", value); uint8_t intValue = atoi(value.c_str()); if(intValue || value == "0") level = intValue; else level = 1; } else level = monster->level; char buffer [10]; monster->name = monster->getName() + " [" + itoa(level, buffer, 10) + "]"; } } configmanager.h
Procure por:
ADDONS_PREMIUM, e abaixo adicione logo em baixo:
MONSTER_HAS_LEVEL, configmanager.cpp
procure por:
m_confBool[ADDONS_PREMIUM] = getGlobalBool("addonsOnlyPremium", true); e logo em baixo adicione:
m_confBool[MONSTER_HAS_LEVEL] = getGlobalBool("monsterHasLevel", true); no Config.lua adicione:
monsterHasLevel = true -- true para monstros nascerem com level, false para não nascerem com level São muitas modificações para fazer, mas o resultado é garantido e é uma funcionalidade a mais para seu servidor.
Como está programado, a cada level, monstros ganham 10% de HP, 1% de dano e 0.5% de defesa.
Para configurar level mínimo e máximo, é só adicionar no XML do monstro:
<level min="1" max="10"/> -- level minimo, level maximo E alterar a seu gosto.
Se você fizer certo irá ficar assim:
Créditos:
@Oneshot
-
Yota recebeu reputação de bamb00 em [C ]Level System in monster [0.3.6]
Boa noite, venho compartilhar o código feito por @Oneshot/ @Garou, com adaptação para tfs 0.3.6 (854) por mim. Bem, ele postou para atfs 0.4 (860), dai eu só mexi em umas linhas parar funcionar no tfs 0.3.6(854), dai vou compartilhar com vocês.
Com o monster level system, o monstro passa a ter level e ganha mais HP, dá mais dano, tem mais defesa, dependendo dele. monsters.h
procure por:
bool isSummonable, isIllusionable, isConvinceable, isAttackable, isHostile, isLureable, isWalkable, canPushItems, canPushCreatures, pushable, hideName, hideHealth; Substitua por:
bool isSummonable, isIllusionable, isConvinceable, isAttackable, isHostile, isLureable, isWalkable, canPushItems, canPushCreatures, pushable, hideName, hideHealth, hideLevel; Procure por:
int32_t defense, armor, health, healthMax, baseSpeed, lookCorpse, corpseUnique, corpseAction, maxSummons, targetDistance, runAwayHealth, conditionImmunities, damageImmunities, lightLevel, lightColor, changeTargetSpeed, changeTargetChance; Substitua por:
int32_t defense, armor, health, healthMax, baseSpeed, lookCorpse, corpseUnique, corpseAction, maxSummons, targetDistance, runAwayHealth, conditionImmunities, damageImmunities, lightLevel, lightColor, changeTargetSpeed, changeTargetChance, levelMin, levelMax; monsters.cpp
Procure por:
canPushItems = canPushCreatures = isSummonable = isIllusionable = isConvinceable = isLureable = isWalkable = hideName = hideHealth = false; Substitua por:
canPushItems = canPushCreatures = isSummonable = isIllusionable = isConvinceable = isLureable = isWalkable = hideName = hideHealth = hideLevel = false; Procure por:
baseSpeed = 200; Logo abaixo, adicione:
levelMin = levelMax = 1; Localize:
if(readXMLInteger(p, "max", intValue)) mType->healthMax = intValue; else { SHOW_XML_ERROR("Missing health.max"); monsterLoad = false; } } abaixo adicione:
else if(!xmlStrcmp(p->name, (const xmlChar*)"level")) { if(!readXMLInteger(p, "max", intValue)) mType->levelMax = 1; else mType->levelMax = intValue; if(!readXMLInteger(p, "min", intValue)) mType->levelMin = mType->levelMax; else mType->levelMin = intValue; } procure por:
if(readXMLString(tmpNode, "shield", strValue)) mType->partyShield = getPartyShield(strValue); logo baixo adicione:
if(readXMLString(tmpNode, "hidelevel", strValue)) mType->hideLevel = booleanString(strValue); Monster.h
Procure:
virtual ~Monster(); std::string name, nameDescription; abaixo adicione:
std::string name, nameDescription; int32_t level; double bonusAttack, bonusDefense; Procure:
virtual const std::string& getName() const {return mType->name;} virtual const std::string& getNameDescription() const {return mType->nameDescription;} virtual std::string getDescription(int32_t) const {return mType->nameDescription + ".";} Substitua por:
virtual const std::string& getName() const {return name;} virtual const std::string& getNameDescription() const {return nameDescription;} virtual std::string getDescription(int32_t) const {return nameDescription + ".";} Monster.cpp
Logo abaixo de:
isIdle = true; Adicione:
name = _mType->name; nameDescription = _mType->nameDescription; level = (int32_t)random_range(_mType->levelMin, _mType->levelMax, DISTRO_NORMAL); bonusAttack = 1.0; bonusDefense = 1.0; Procure por está função:
Monster::onCreatureAppear Apague e coloque está função:
void Monster::onCreatureAppear(const Creature* creature) { Creature::onCreatureAppear(creature); if(creature == this) { //We just spawned lets look around to see who is there. if(isSummon()) { std::string value; // this->master->getStorage((uint32_t)"1996", value); this->master->getStorage((uint32_t)"1996", value); uint8_t intValue = atoi(value.c_str()); if(intValue || value == "0") level = intValue; else level = 1; isMasterInRange = canSee(master->getPosition()); } if(g_config.getBool(ConfigManager::MONSTER_HAS_LEVEL)) { this->healthMax = std::floor(this->getMaxHealth() * (1. + (0.1 * (level - 1)))); this->health = this->healthMax; this->bonusAttack += (0.01 * (level - 1)); this->bonusDefense += (0.005 * (level - 1)); } updateTargetList(); updateIdleStatus(); } else onCreatureEnter(const_cast<Creature*>(creature)); } Substitua todos:
g_config.getDouble(ConfigManager::RATE_MONSTER_DEFENSE) Por:
g_config.getDouble(ConfigManager::RATE_MONSTER_DEFENSE) * bonusDefense Substitua todos:
g_config.getDouble(ConfigManager::RATE_MONSTER_ATTACK) Por:
g_config.getDouble(ConfigManager::RATE_MONSTER_ATTACK) * bonusAttack Map.cpp
Procure por:
#include "game.h" Adicione em baixo:
#include "configmanager.h" Procure por:
extern Game g_game; Adicione em baixo:
extern ConfigManager g_config; Procure por está função:
bool Map::placeCreature(const Position& centerPos, Creature* creature, bool extendedPos /*= false*/, bool forced /*= false*/) { Abaixo do " { " adicione:
Monster* monster = creature->getMonster(); if(monster && g_config.getBool(ConfigManager::MONSTER_HAS_LEVEL)) { uint8_t level; if(!monster->getMonsterType()->hideLevel) { if(monster->isSummon()) { std::string value; // monster->getMaster()->getStorage((uint32_t)"1996", value); monster->getMaster()->getStorage((uint32_t)"1996", value); uint8_t intValue = atoi(value.c_str()); if(intValue || value == "0") level = intValue; else level = 1; } else level = monster->level; char buffer [10]; monster->name = monster->getName() + " [" + itoa(level, buffer, 10) + "]"; } } configmanager.h
Procure por:
ADDONS_PREMIUM, e abaixo adicione logo em baixo:
MONSTER_HAS_LEVEL, configmanager.cpp
procure por:
m_confBool[ADDONS_PREMIUM] = getGlobalBool("addonsOnlyPremium", true); e logo em baixo adicione:
m_confBool[MONSTER_HAS_LEVEL] = getGlobalBool("monsterHasLevel", true); no Config.lua adicione:
monsterHasLevel = true -- true para monstros nascerem com level, false para não nascerem com level São muitas modificações para fazer, mas o resultado é garantido e é uma funcionalidade a mais para seu servidor.
Como está programado, a cada level, monstros ganham 10% de HP, 1% de dano e 0.5% de defesa.
Para configurar level mínimo e máximo, é só adicionar no XML do monstro:
<level min="1" max="10"/> -- level minimo, level maximo E alterar a seu gosto.
Se você fizer certo irá ficar assim:
Créditos:
@Oneshot
-
-
Yota recebeu reputação de Mark Ackerman em (Resolvido)Adaptar script de baú para ganhar 3 items
nessa linha:
é só adicionar outra lina do mesmo jeito
doPlayerAddItem(cid, id, quantidade) -- recompensa --
-
-
Yota recebeu reputação de Samuel Cstr em [RESOLVIDO] Não parece password apenas monte de códigos
vai no config,lua e procura por sha1, e troca por plain
-
Yota recebeu reputação de DarkRed em SCRIPT de colocar No nomes dos pokes Shinys "Shiny"
aqui, usa este:
-
Yota recebeu reputação de DarkRed em SCRIPT de colocar No nomes dos pokes Shinys "Shiny"
Hei de está errado jovem!
Amigo, posta pra mim o seu spawn.xml, fica em creaturescript/script.
PS: è pra ficar shiny só no nome dos monstros? Ou é pra ficar em players também?
-
-
Yota recebeu reputação de Gustavo Ntos em [Pedido] Source
Você baixou a source? Ela tem tudo, e está só no jeito de compilar.
-
Yota recebeu reputação de extefania em [C ]Level System in monster [0.3.6]
Boa noite, venho compartilhar o código feito por @Oneshot/ @Garou, com adaptação para tfs 0.3.6 (854) por mim. Bem, ele postou para atfs 0.4 (860), dai eu só mexi em umas linhas parar funcionar no tfs 0.3.6(854), dai vou compartilhar com vocês.
Com o monster level system, o monstro passa a ter level e ganha mais HP, dá mais dano, tem mais defesa, dependendo dele. monsters.h
procure por:
bool isSummonable, isIllusionable, isConvinceable, isAttackable, isHostile, isLureable, isWalkable, canPushItems, canPushCreatures, pushable, hideName, hideHealth; Substitua por:
bool isSummonable, isIllusionable, isConvinceable, isAttackable, isHostile, isLureable, isWalkable, canPushItems, canPushCreatures, pushable, hideName, hideHealth, hideLevel; Procure por:
int32_t defense, armor, health, healthMax, baseSpeed, lookCorpse, corpseUnique, corpseAction, maxSummons, targetDistance, runAwayHealth, conditionImmunities, damageImmunities, lightLevel, lightColor, changeTargetSpeed, changeTargetChance; Substitua por:
int32_t defense, armor, health, healthMax, baseSpeed, lookCorpse, corpseUnique, corpseAction, maxSummons, targetDistance, runAwayHealth, conditionImmunities, damageImmunities, lightLevel, lightColor, changeTargetSpeed, changeTargetChance, levelMin, levelMax; monsters.cpp
Procure por:
canPushItems = canPushCreatures = isSummonable = isIllusionable = isConvinceable = isLureable = isWalkable = hideName = hideHealth = false; Substitua por:
canPushItems = canPushCreatures = isSummonable = isIllusionable = isConvinceable = isLureable = isWalkable = hideName = hideHealth = hideLevel = false; Procure por:
baseSpeed = 200; Logo abaixo, adicione:
levelMin = levelMax = 1; Localize:
if(readXMLInteger(p, "max", intValue)) mType->healthMax = intValue; else { SHOW_XML_ERROR("Missing health.max"); monsterLoad = false; } } abaixo adicione:
else if(!xmlStrcmp(p->name, (const xmlChar*)"level")) { if(!readXMLInteger(p, "max", intValue)) mType->levelMax = 1; else mType->levelMax = intValue; if(!readXMLInteger(p, "min", intValue)) mType->levelMin = mType->levelMax; else mType->levelMin = intValue; } procure por:
if(readXMLString(tmpNode, "shield", strValue)) mType->partyShield = getPartyShield(strValue); logo baixo adicione:
if(readXMLString(tmpNode, "hidelevel", strValue)) mType->hideLevel = booleanString(strValue); Monster.h
Procure:
virtual ~Monster(); std::string name, nameDescription; abaixo adicione:
std::string name, nameDescription; int32_t level; double bonusAttack, bonusDefense; Procure:
virtual const std::string& getName() const {return mType->name;} virtual const std::string& getNameDescription() const {return mType->nameDescription;} virtual std::string getDescription(int32_t) const {return mType->nameDescription + ".";} Substitua por:
virtual const std::string& getName() const {return name;} virtual const std::string& getNameDescription() const {return nameDescription;} virtual std::string getDescription(int32_t) const {return nameDescription + ".";} Monster.cpp
Logo abaixo de:
isIdle = true; Adicione:
name = _mType->name; nameDescription = _mType->nameDescription; level = (int32_t)random_range(_mType->levelMin, _mType->levelMax, DISTRO_NORMAL); bonusAttack = 1.0; bonusDefense = 1.0; Procure por está função:
Monster::onCreatureAppear Apague e coloque está função:
void Monster::onCreatureAppear(const Creature* creature) { Creature::onCreatureAppear(creature); if(creature == this) { //We just spawned lets look around to see who is there. if(isSummon()) { std::string value; // this->master->getStorage((uint32_t)"1996", value); this->master->getStorage((uint32_t)"1996", value); uint8_t intValue = atoi(value.c_str()); if(intValue || value == "0") level = intValue; else level = 1; isMasterInRange = canSee(master->getPosition()); } if(g_config.getBool(ConfigManager::MONSTER_HAS_LEVEL)) { this->healthMax = std::floor(this->getMaxHealth() * (1. + (0.1 * (level - 1)))); this->health = this->healthMax; this->bonusAttack += (0.01 * (level - 1)); this->bonusDefense += (0.005 * (level - 1)); } updateTargetList(); updateIdleStatus(); } else onCreatureEnter(const_cast<Creature*>(creature)); } Substitua todos:
g_config.getDouble(ConfigManager::RATE_MONSTER_DEFENSE) Por:
g_config.getDouble(ConfigManager::RATE_MONSTER_DEFENSE) * bonusDefense Substitua todos:
g_config.getDouble(ConfigManager::RATE_MONSTER_ATTACK) Por:
g_config.getDouble(ConfigManager::RATE_MONSTER_ATTACK) * bonusAttack Map.cpp
Procure por:
#include "game.h" Adicione em baixo:
#include "configmanager.h" Procure por:
extern Game g_game; Adicione em baixo:
extern ConfigManager g_config; Procure por está função:
bool Map::placeCreature(const Position& centerPos, Creature* creature, bool extendedPos /*= false*/, bool forced /*= false*/) { Abaixo do " { " adicione:
Monster* monster = creature->getMonster(); if(monster && g_config.getBool(ConfigManager::MONSTER_HAS_LEVEL)) { uint8_t level; if(!monster->getMonsterType()->hideLevel) { if(monster->isSummon()) { std::string value; // monster->getMaster()->getStorage((uint32_t)"1996", value); monster->getMaster()->getStorage((uint32_t)"1996", value); uint8_t intValue = atoi(value.c_str()); if(intValue || value == "0") level = intValue; else level = 1; } else level = monster->level; char buffer [10]; monster->name = monster->getName() + " [" + itoa(level, buffer, 10) + "]"; } } configmanager.h
Procure por:
ADDONS_PREMIUM, e abaixo adicione logo em baixo:
MONSTER_HAS_LEVEL, configmanager.cpp
procure por:
m_confBool[ADDONS_PREMIUM] = getGlobalBool("addonsOnlyPremium", true); e logo em baixo adicione:
m_confBool[MONSTER_HAS_LEVEL] = getGlobalBool("monsterHasLevel", true); no Config.lua adicione:
monsterHasLevel = true -- true para monstros nascerem com level, false para não nascerem com level São muitas modificações para fazer, mas o resultado é garantido e é uma funcionalidade a mais para seu servidor.
Como está programado, a cada level, monstros ganham 10% de HP, 1% de dano e 0.5% de defesa.
Para configurar level mínimo e máximo, é só adicionar no XML do monstro:
<level min="1" max="10"/> -- level minimo, level maximo E alterar a seu gosto.
Se você fizer certo irá ficar assim:
Créditos:
@Oneshot
-
Yota recebeu reputação de Weslley Kiyo em [C ]Level System in monster [0.3.6]
Boa noite, venho compartilhar o código feito por @Oneshot/ @Garou, com adaptação para tfs 0.3.6 (854) por mim. Bem, ele postou para atfs 0.4 (860), dai eu só mexi em umas linhas parar funcionar no tfs 0.3.6(854), dai vou compartilhar com vocês.
Com o monster level system, o monstro passa a ter level e ganha mais HP, dá mais dano, tem mais defesa, dependendo dele. monsters.h
procure por:
bool isSummonable, isIllusionable, isConvinceable, isAttackable, isHostile, isLureable, isWalkable, canPushItems, canPushCreatures, pushable, hideName, hideHealth; Substitua por:
bool isSummonable, isIllusionable, isConvinceable, isAttackable, isHostile, isLureable, isWalkable, canPushItems, canPushCreatures, pushable, hideName, hideHealth, hideLevel; Procure por:
int32_t defense, armor, health, healthMax, baseSpeed, lookCorpse, corpseUnique, corpseAction, maxSummons, targetDistance, runAwayHealth, conditionImmunities, damageImmunities, lightLevel, lightColor, changeTargetSpeed, changeTargetChance; Substitua por:
int32_t defense, armor, health, healthMax, baseSpeed, lookCorpse, corpseUnique, corpseAction, maxSummons, targetDistance, runAwayHealth, conditionImmunities, damageImmunities, lightLevel, lightColor, changeTargetSpeed, changeTargetChance, levelMin, levelMax; monsters.cpp
Procure por:
canPushItems = canPushCreatures = isSummonable = isIllusionable = isConvinceable = isLureable = isWalkable = hideName = hideHealth = false; Substitua por:
canPushItems = canPushCreatures = isSummonable = isIllusionable = isConvinceable = isLureable = isWalkable = hideName = hideHealth = hideLevel = false; Procure por:
baseSpeed = 200; Logo abaixo, adicione:
levelMin = levelMax = 1; Localize:
if(readXMLInteger(p, "max", intValue)) mType->healthMax = intValue; else { SHOW_XML_ERROR("Missing health.max"); monsterLoad = false; } } abaixo adicione:
else if(!xmlStrcmp(p->name, (const xmlChar*)"level")) { if(!readXMLInteger(p, "max", intValue)) mType->levelMax = 1; else mType->levelMax = intValue; if(!readXMLInteger(p, "min", intValue)) mType->levelMin = mType->levelMax; else mType->levelMin = intValue; } procure por:
if(readXMLString(tmpNode, "shield", strValue)) mType->partyShield = getPartyShield(strValue); logo baixo adicione:
if(readXMLString(tmpNode, "hidelevel", strValue)) mType->hideLevel = booleanString(strValue); Monster.h
Procure:
virtual ~Monster(); std::string name, nameDescription; abaixo adicione:
std::string name, nameDescription; int32_t level; double bonusAttack, bonusDefense; Procure:
virtual const std::string& getName() const {return mType->name;} virtual const std::string& getNameDescription() const {return mType->nameDescription;} virtual std::string getDescription(int32_t) const {return mType->nameDescription + ".";} Substitua por:
virtual const std::string& getName() const {return name;} virtual const std::string& getNameDescription() const {return nameDescription;} virtual std::string getDescription(int32_t) const {return nameDescription + ".";} Monster.cpp
Logo abaixo de:
isIdle = true; Adicione:
name = _mType->name; nameDescription = _mType->nameDescription; level = (int32_t)random_range(_mType->levelMin, _mType->levelMax, DISTRO_NORMAL); bonusAttack = 1.0; bonusDefense = 1.0; Procure por está função:
Monster::onCreatureAppear Apague e coloque está função:
void Monster::onCreatureAppear(const Creature* creature) { Creature::onCreatureAppear(creature); if(creature == this) { //We just spawned lets look around to see who is there. if(isSummon()) { std::string value; // this->master->getStorage((uint32_t)"1996", value); this->master->getStorage((uint32_t)"1996", value); uint8_t intValue = atoi(value.c_str()); if(intValue || value == "0") level = intValue; else level = 1; isMasterInRange = canSee(master->getPosition()); } if(g_config.getBool(ConfigManager::MONSTER_HAS_LEVEL)) { this->healthMax = std::floor(this->getMaxHealth() * (1. + (0.1 * (level - 1)))); this->health = this->healthMax; this->bonusAttack += (0.01 * (level - 1)); this->bonusDefense += (0.005 * (level - 1)); } updateTargetList(); updateIdleStatus(); } else onCreatureEnter(const_cast<Creature*>(creature)); } Substitua todos:
g_config.getDouble(ConfigManager::RATE_MONSTER_DEFENSE) Por:
g_config.getDouble(ConfigManager::RATE_MONSTER_DEFENSE) * bonusDefense Substitua todos:
g_config.getDouble(ConfigManager::RATE_MONSTER_ATTACK) Por:
g_config.getDouble(ConfigManager::RATE_MONSTER_ATTACK) * bonusAttack Map.cpp
Procure por:
#include "game.h" Adicione em baixo:
#include "configmanager.h" Procure por:
extern Game g_game; Adicione em baixo:
extern ConfigManager g_config; Procure por está função:
bool Map::placeCreature(const Position& centerPos, Creature* creature, bool extendedPos /*= false*/, bool forced /*= false*/) { Abaixo do " { " adicione:
Monster* monster = creature->getMonster(); if(monster && g_config.getBool(ConfigManager::MONSTER_HAS_LEVEL)) { uint8_t level; if(!monster->getMonsterType()->hideLevel) { if(monster->isSummon()) { std::string value; // monster->getMaster()->getStorage((uint32_t)"1996", value); monster->getMaster()->getStorage((uint32_t)"1996", value); uint8_t intValue = atoi(value.c_str()); if(intValue || value == "0") level = intValue; else level = 1; } else level = monster->level; char buffer [10]; monster->name = monster->getName() + " [" + itoa(level, buffer, 10) + "]"; } } configmanager.h
Procure por:
ADDONS_PREMIUM, e abaixo adicione logo em baixo:
MONSTER_HAS_LEVEL, configmanager.cpp
procure por:
m_confBool[ADDONS_PREMIUM] = getGlobalBool("addonsOnlyPremium", true); e logo em baixo adicione:
m_confBool[MONSTER_HAS_LEVEL] = getGlobalBool("monsterHasLevel", true); no Config.lua adicione:
monsterHasLevel = true -- true para monstros nascerem com level, false para não nascerem com level São muitas modificações para fazer, mas o resultado é garantido e é uma funcionalidade a mais para seu servidor.
Como está programado, a cada level, monstros ganham 10% de HP, 1% de dano e 0.5% de defesa.
Para configurar level mínimo e máximo, é só adicionar no XML do monstro:
<level min="1" max="10"/> -- level minimo, level maximo E alterar a seu gosto.
Se você fizer certo irá ficar assim:
Créditos:
@Oneshot
-
Yota recebeu reputação de Vodkart em [C ]Level System in monster [0.3.6]
Boa noite, venho compartilhar o código feito por @Oneshot/ @Garou, com adaptação para tfs 0.3.6 (854) por mim. Bem, ele postou para atfs 0.4 (860), dai eu só mexi em umas linhas parar funcionar no tfs 0.3.6(854), dai vou compartilhar com vocês.
Com o monster level system, o monstro passa a ter level e ganha mais HP, dá mais dano, tem mais defesa, dependendo dele. monsters.h
procure por:
bool isSummonable, isIllusionable, isConvinceable, isAttackable, isHostile, isLureable, isWalkable, canPushItems, canPushCreatures, pushable, hideName, hideHealth; Substitua por:
bool isSummonable, isIllusionable, isConvinceable, isAttackable, isHostile, isLureable, isWalkable, canPushItems, canPushCreatures, pushable, hideName, hideHealth, hideLevel; Procure por:
int32_t defense, armor, health, healthMax, baseSpeed, lookCorpse, corpseUnique, corpseAction, maxSummons, targetDistance, runAwayHealth, conditionImmunities, damageImmunities, lightLevel, lightColor, changeTargetSpeed, changeTargetChance; Substitua por:
int32_t defense, armor, health, healthMax, baseSpeed, lookCorpse, corpseUnique, corpseAction, maxSummons, targetDistance, runAwayHealth, conditionImmunities, damageImmunities, lightLevel, lightColor, changeTargetSpeed, changeTargetChance, levelMin, levelMax; monsters.cpp
Procure por:
canPushItems = canPushCreatures = isSummonable = isIllusionable = isConvinceable = isLureable = isWalkable = hideName = hideHealth = false; Substitua por:
canPushItems = canPushCreatures = isSummonable = isIllusionable = isConvinceable = isLureable = isWalkable = hideName = hideHealth = hideLevel = false; Procure por:
baseSpeed = 200; Logo abaixo, adicione:
levelMin = levelMax = 1; Localize:
if(readXMLInteger(p, "max", intValue)) mType->healthMax = intValue; else { SHOW_XML_ERROR("Missing health.max"); monsterLoad = false; } } abaixo adicione:
else if(!xmlStrcmp(p->name, (const xmlChar*)"level")) { if(!readXMLInteger(p, "max", intValue)) mType->levelMax = 1; else mType->levelMax = intValue; if(!readXMLInteger(p, "min", intValue)) mType->levelMin = mType->levelMax; else mType->levelMin = intValue; } procure por:
if(readXMLString(tmpNode, "shield", strValue)) mType->partyShield = getPartyShield(strValue); logo baixo adicione:
if(readXMLString(tmpNode, "hidelevel", strValue)) mType->hideLevel = booleanString(strValue); Monster.h
Procure:
virtual ~Monster(); std::string name, nameDescription; abaixo adicione:
std::string name, nameDescription; int32_t level; double bonusAttack, bonusDefense; Procure:
virtual const std::string& getName() const {return mType->name;} virtual const std::string& getNameDescription() const {return mType->nameDescription;} virtual std::string getDescription(int32_t) const {return mType->nameDescription + ".";} Substitua por:
virtual const std::string& getName() const {return name;} virtual const std::string& getNameDescription() const {return nameDescription;} virtual std::string getDescription(int32_t) const {return nameDescription + ".";} Monster.cpp
Logo abaixo de:
isIdle = true; Adicione:
name = _mType->name; nameDescription = _mType->nameDescription; level = (int32_t)random_range(_mType->levelMin, _mType->levelMax, DISTRO_NORMAL); bonusAttack = 1.0; bonusDefense = 1.0; Procure por está função:
Monster::onCreatureAppear Apague e coloque está função:
void Monster::onCreatureAppear(const Creature* creature) { Creature::onCreatureAppear(creature); if(creature == this) { //We just spawned lets look around to see who is there. if(isSummon()) { std::string value; // this->master->getStorage((uint32_t)"1996", value); this->master->getStorage((uint32_t)"1996", value); uint8_t intValue = atoi(value.c_str()); if(intValue || value == "0") level = intValue; else level = 1; isMasterInRange = canSee(master->getPosition()); } if(g_config.getBool(ConfigManager::MONSTER_HAS_LEVEL)) { this->healthMax = std::floor(this->getMaxHealth() * (1. + (0.1 * (level - 1)))); this->health = this->healthMax; this->bonusAttack += (0.01 * (level - 1)); this->bonusDefense += (0.005 * (level - 1)); } updateTargetList(); updateIdleStatus(); } else onCreatureEnter(const_cast<Creature*>(creature)); } Substitua todos:
g_config.getDouble(ConfigManager::RATE_MONSTER_DEFENSE) Por:
g_config.getDouble(ConfigManager::RATE_MONSTER_DEFENSE) * bonusDefense Substitua todos:
g_config.getDouble(ConfigManager::RATE_MONSTER_ATTACK) Por:
g_config.getDouble(ConfigManager::RATE_MONSTER_ATTACK) * bonusAttack Map.cpp
Procure por:
#include "game.h" Adicione em baixo:
#include "configmanager.h" Procure por:
extern Game g_game; Adicione em baixo:
extern ConfigManager g_config; Procure por está função:
bool Map::placeCreature(const Position& centerPos, Creature* creature, bool extendedPos /*= false*/, bool forced /*= false*/) { Abaixo do " { " adicione:
Monster* monster = creature->getMonster(); if(monster && g_config.getBool(ConfigManager::MONSTER_HAS_LEVEL)) { uint8_t level; if(!monster->getMonsterType()->hideLevel) { if(monster->isSummon()) { std::string value; // monster->getMaster()->getStorage((uint32_t)"1996", value); monster->getMaster()->getStorage((uint32_t)"1996", value); uint8_t intValue = atoi(value.c_str()); if(intValue || value == "0") level = intValue; else level = 1; } else level = monster->level; char buffer [10]; monster->name = monster->getName() + " [" + itoa(level, buffer, 10) + "]"; } } configmanager.h
Procure por:
ADDONS_PREMIUM, e abaixo adicione logo em baixo:
MONSTER_HAS_LEVEL, configmanager.cpp
procure por:
m_confBool[ADDONS_PREMIUM] = getGlobalBool("addonsOnlyPremium", true); e logo em baixo adicione:
m_confBool[MONSTER_HAS_LEVEL] = getGlobalBool("monsterHasLevel", true); no Config.lua adicione:
monsterHasLevel = true -- true para monstros nascerem com level, false para não nascerem com level São muitas modificações para fazer, mas o resultado é garantido e é uma funcionalidade a mais para seu servidor.
Como está programado, a cada level, monstros ganham 10% de HP, 1% de dano e 0.5% de defesa.
Para configurar level mínimo e máximo, é só adicionar no XML do monstro:
<level min="1" max="10"/> -- level minimo, level maximo E alterar a seu gosto.
Se você fizer certo irá ficar assim:
Créditos:
@Oneshot
-
Yota deu reputação a Vodkart em [C ]Level System in monster [0.3.6]
Parabéns, seu tópico de conteúdo foi aprovado!
Muito obrigado pela sua contribuição, nós do Tibia King agradecemos.
Seu conteúdo com certeza ajudará à muitos outros, você recebeu +1 REP.
-
Yota recebeu reputação de extefania em [C++] Level Monster
Eu fiz uma versão 8.54. se quiser, posso postar.
-
Yota recebeu reputação de Weekend em Shinobi Online - 忍 オン ラ イ ン
Boa tarde galera.
Ideia inicial:
Bem, eu sou muito fã de Anime/Mangá de Naruto. Então, já que tinha por ai, um spr e dat com um gráfico, eu resolvi fazer um servidor basado no mundo de Naruto. Mas com ideias e plataforma diferente(não é tão diferente, porque existem 2 servidores atualmente com uma grande equipe, que podem fazer um ótimo game.) que os servidores de hoje em dia oferecem.
Sobre o nome do projeto ser Shinobi Online, irei explicar o motivo.
Bem, minha ideia inicial para o servidor é: O jogador, será um Shinobi/Ninja normal, e não um dos protagonistas do anime. Mas calma lá. O jogador poderá escolher seus pais e aldeia.(lembrado que cada pais tem sua aldeia, e toda aldeia possui seu clã.) entrando no clã escolhido por o jogador, ele poderá aprender os jutsus que quiser, de acordo com o elemento/kekkei genkai que ele vai herdar ao entrar no clã escolhido,
E bem, sobre o nome Shinobi Online, eu não pensei em outro. O jogador será um Shinobi, e o jogo será um MMORPG. Então, eu deixei o mais obvio, Shinobi Online, e sim, eu posso usar, a menos que alguém registre essa marca. Não é uma copia, e também não tem nada a ver com o antigo Shinobi Online, a não ser a logo, que eu gostei, e mandei um amigo refazer para mim.
Sobre o Game:
Graduações:
Missões:
Jutsus:
Imagens:
Bem galera, eu tenho varias coisas listadas para que o Shinobi Online possa cumprir seu papel como um Game diferenciado!
Podem comentar suas duvidas, criticas, e até sugestões.
Fã page: https://www.facebook.com/ShinobiOnline/?fref=ts
Video:
Vejam este video que acabei de fazer e postar. Está básico, mas é não está terminado ainda.
Video
[Readygo]Video 2016-09-20 13-22-59.mp4
-
Yota recebeu reputação de eliasferro em Shinobi Online - 忍 オン ラ イ ン
Boa tarde galera.
Ideia inicial:
Bem, eu sou muito fã de Anime/Mangá de Naruto. Então, já que tinha por ai, um spr e dat com um gráfico, eu resolvi fazer um servidor basado no mundo de Naruto. Mas com ideias e plataforma diferente(não é tão diferente, porque existem 2 servidores atualmente com uma grande equipe, que podem fazer um ótimo game.) que os servidores de hoje em dia oferecem.
Sobre o nome do projeto ser Shinobi Online, irei explicar o motivo.
Bem, minha ideia inicial para o servidor é: O jogador, será um Shinobi/Ninja normal, e não um dos protagonistas do anime. Mas calma lá. O jogador poderá escolher seus pais e aldeia.(lembrado que cada pais tem sua aldeia, e toda aldeia possui seu clã.) entrando no clã escolhido por o jogador, ele poderá aprender os jutsus que quiser, de acordo com o elemento/kekkei genkai que ele vai herdar ao entrar no clã escolhido,
E bem, sobre o nome Shinobi Online, eu não pensei em outro. O jogador será um Shinobi, e o jogo será um MMORPG. Então, eu deixei o mais obvio, Shinobi Online, e sim, eu posso usar, a menos que alguém registre essa marca. Não é uma copia, e também não tem nada a ver com o antigo Shinobi Online, a não ser a logo, que eu gostei, e mandei um amigo refazer para mim.
Sobre o Game:
Graduações:
Missões:
Jutsus:
Imagens:
Bem galera, eu tenho varias coisas listadas para que o Shinobi Online possa cumprir seu papel como um Game diferenciado!
Podem comentar suas duvidas, criticas, e até sugestões.
Fã page: https://www.facebook.com/ShinobiOnline/?fref=ts
Video:
Vejam este video que acabei de fazer e postar. Está básico, mas é não está terminado ainda.
Video
[Readygo]Video 2016-09-20 13-22-59.mp4
-
Yota recebeu reputação de JonatasLucasf em Shinobi Online - 忍 オン ラ イ ン
Boa tarde galera.
Ideia inicial:
Bem, eu sou muito fã de Anime/Mangá de Naruto. Então, já que tinha por ai, um spr e dat com um gráfico, eu resolvi fazer um servidor basado no mundo de Naruto. Mas com ideias e plataforma diferente(não é tão diferente, porque existem 2 servidores atualmente com uma grande equipe, que podem fazer um ótimo game.) que os servidores de hoje em dia oferecem.
Sobre o nome do projeto ser Shinobi Online, irei explicar o motivo.
Bem, minha ideia inicial para o servidor é: O jogador, será um Shinobi/Ninja normal, e não um dos protagonistas do anime. Mas calma lá. O jogador poderá escolher seus pais e aldeia.(lembrado que cada pais tem sua aldeia, e toda aldeia possui seu clã.) entrando no clã escolhido por o jogador, ele poderá aprender os jutsus que quiser, de acordo com o elemento/kekkei genkai que ele vai herdar ao entrar no clã escolhido,
E bem, sobre o nome Shinobi Online, eu não pensei em outro. O jogador será um Shinobi, e o jogo será um MMORPG. Então, eu deixei o mais obvio, Shinobi Online, e sim, eu posso usar, a menos que alguém registre essa marca. Não é uma copia, e também não tem nada a ver com o antigo Shinobi Online, a não ser a logo, que eu gostei, e mandei um amigo refazer para mim.
Sobre o Game:
Graduações:
Missões:
Jutsus:
Imagens:
Bem galera, eu tenho varias coisas listadas para que o Shinobi Online possa cumprir seu papel como um Game diferenciado!
Podem comentar suas duvidas, criticas, e até sugestões.
Fã page: https://www.facebook.com/ShinobiOnline/?fref=ts
Video:
Vejam este video que acabei de fazer e postar. Está básico, mas é não está terminado ainda.
Video
[Readygo]Video 2016-09-20 13-22-59.mp4
-
Yota recebeu reputação de Arthur leandrohh em Error - CreatureScript Interface
Isso acontece quando você erra em alguma função na lib, ou coloca uma virgula a mais. Faz com que a lib buge.
-
Yota recebeu reputação de Love Tibia em Shinobi Online - 忍 オン ラ イ ン
Boa tarde galera.
Ideia inicial:
Bem, eu sou muito fã de Anime/Mangá de Naruto. Então, já que tinha por ai, um spr e dat com um gráfico, eu resolvi fazer um servidor basado no mundo de Naruto. Mas com ideias e plataforma diferente(não é tão diferente, porque existem 2 servidores atualmente com uma grande equipe, que podem fazer um ótimo game.) que os servidores de hoje em dia oferecem.
Sobre o nome do projeto ser Shinobi Online, irei explicar o motivo.
Bem, minha ideia inicial para o servidor é: O jogador, será um Shinobi/Ninja normal, e não um dos protagonistas do anime. Mas calma lá. O jogador poderá escolher seus pais e aldeia.(lembrado que cada pais tem sua aldeia, e toda aldeia possui seu clã.) entrando no clã escolhido por o jogador, ele poderá aprender os jutsus que quiser, de acordo com o elemento/kekkei genkai que ele vai herdar ao entrar no clã escolhido,
E bem, sobre o nome Shinobi Online, eu não pensei em outro. O jogador será um Shinobi, e o jogo será um MMORPG. Então, eu deixei o mais obvio, Shinobi Online, e sim, eu posso usar, a menos que alguém registre essa marca. Não é uma copia, e também não tem nada a ver com o antigo Shinobi Online, a não ser a logo, que eu gostei, e mandei um amigo refazer para mim.
Sobre o Game:
Graduações:
Missões:
Jutsus:
Imagens:
Bem galera, eu tenho varias coisas listadas para que o Shinobi Online possa cumprir seu papel como um Game diferenciado!
Podem comentar suas duvidas, criticas, e até sugestões.
Fã page: https://www.facebook.com/ShinobiOnline/?fref=ts
Video:
Vejam este video que acabei de fazer e postar. Está básico, mas é não está terminado ainda.
Video
[Readygo]Video 2016-09-20 13-22-59.mp4
-
Yota recebeu reputação de Ivens Pontes em Shinobi Online - 忍 オン ラ イ ン
Boa tarde galera.
Ideia inicial:
Bem, eu sou muito fã de Anime/Mangá de Naruto. Então, já que tinha por ai, um spr e dat com um gráfico, eu resolvi fazer um servidor basado no mundo de Naruto. Mas com ideias e plataforma diferente(não é tão diferente, porque existem 2 servidores atualmente com uma grande equipe, que podem fazer um ótimo game.) que os servidores de hoje em dia oferecem.
Sobre o nome do projeto ser Shinobi Online, irei explicar o motivo.
Bem, minha ideia inicial para o servidor é: O jogador, será um Shinobi/Ninja normal, e não um dos protagonistas do anime. Mas calma lá. O jogador poderá escolher seus pais e aldeia.(lembrado que cada pais tem sua aldeia, e toda aldeia possui seu clã.) entrando no clã escolhido por o jogador, ele poderá aprender os jutsus que quiser, de acordo com o elemento/kekkei genkai que ele vai herdar ao entrar no clã escolhido,
E bem, sobre o nome Shinobi Online, eu não pensei em outro. O jogador será um Shinobi, e o jogo será um MMORPG. Então, eu deixei o mais obvio, Shinobi Online, e sim, eu posso usar, a menos que alguém registre essa marca. Não é uma copia, e também não tem nada a ver com o antigo Shinobi Online, a não ser a logo, que eu gostei, e mandei um amigo refazer para mim.
Sobre o Game:
Graduações:
Missões:
Jutsus:
Imagens:
Bem galera, eu tenho varias coisas listadas para que o Shinobi Online possa cumprir seu papel como um Game diferenciado!
Podem comentar suas duvidas, criticas, e até sugestões.
Fã page: https://www.facebook.com/ShinobiOnline/?fref=ts
Video:
Vejam este video que acabei de fazer e postar. Está básico, mas é não está terminado ainda.
Video
[Readygo]Video 2016-09-20 13-22-59.mp4
-
Yota recebeu reputação de Bruna marques em Shinobi Online - 忍 オン ラ イ ン
Boa tarde galera.
Ideia inicial:
Bem, eu sou muito fã de Anime/Mangá de Naruto. Então, já que tinha por ai, um spr e dat com um gráfico, eu resolvi fazer um servidor basado no mundo de Naruto. Mas com ideias e plataforma diferente(não é tão diferente, porque existem 2 servidores atualmente com uma grande equipe, que podem fazer um ótimo game.) que os servidores de hoje em dia oferecem.
Sobre o nome do projeto ser Shinobi Online, irei explicar o motivo.
Bem, minha ideia inicial para o servidor é: O jogador, será um Shinobi/Ninja normal, e não um dos protagonistas do anime. Mas calma lá. O jogador poderá escolher seus pais e aldeia.(lembrado que cada pais tem sua aldeia, e toda aldeia possui seu clã.) entrando no clã escolhido por o jogador, ele poderá aprender os jutsus que quiser, de acordo com o elemento/kekkei genkai que ele vai herdar ao entrar no clã escolhido,
E bem, sobre o nome Shinobi Online, eu não pensei em outro. O jogador será um Shinobi, e o jogo será um MMORPG. Então, eu deixei o mais obvio, Shinobi Online, e sim, eu posso usar, a menos que alguém registre essa marca. Não é uma copia, e também não tem nada a ver com o antigo Shinobi Online, a não ser a logo, que eu gostei, e mandei um amigo refazer para mim.
Sobre o Game:
Graduações:
Missões:
Jutsus:
Imagens:
Bem galera, eu tenho varias coisas listadas para que o Shinobi Online possa cumprir seu papel como um Game diferenciado!
Podem comentar suas duvidas, criticas, e até sugestões.
Fã page: https://www.facebook.com/ShinobiOnline/?fref=ts
Video:
Vejam este video que acabei de fazer e postar. Está básico, mas é não está terminado ainda.
Video
[Readygo]Video 2016-09-20 13-22-59.mp4
-
Yota recebeu reputação de chora boy em script nao funciona
<action actionid="1353" event="script" value="earthstone.lua"/> Aqui você está usando actionid, no caso, tem que ir no mapa e colocar está actionID no item.. Mas, eu tenho certeza que você queria fazer assim:
no action.xml troque sua linha por esta:
<action itemid="1353" event="script" value="earthstone.lua"/>
-
Yota recebeu reputação de Viny 13 em Shinobi Online - 忍 オン ラ イ ン
Boa tarde galera.
Ideia inicial:
Bem, eu sou muito fã de Anime/Mangá de Naruto. Então, já que tinha por ai, um spr e dat com um gráfico, eu resolvi fazer um servidor basado no mundo de Naruto. Mas com ideias e plataforma diferente(não é tão diferente, porque existem 2 servidores atualmente com uma grande equipe, que podem fazer um ótimo game.) que os servidores de hoje em dia oferecem.
Sobre o nome do projeto ser Shinobi Online, irei explicar o motivo.
Bem, minha ideia inicial para o servidor é: O jogador, será um Shinobi/Ninja normal, e não um dos protagonistas do anime. Mas calma lá. O jogador poderá escolher seus pais e aldeia.(lembrado que cada pais tem sua aldeia, e toda aldeia possui seu clã.) entrando no clã escolhido por o jogador, ele poderá aprender os jutsus que quiser, de acordo com o elemento/kekkei genkai que ele vai herdar ao entrar no clã escolhido,
E bem, sobre o nome Shinobi Online, eu não pensei em outro. O jogador será um Shinobi, e o jogo será um MMORPG. Então, eu deixei o mais obvio, Shinobi Online, e sim, eu posso usar, a menos que alguém registre essa marca. Não é uma copia, e também não tem nada a ver com o antigo Shinobi Online, a não ser a logo, que eu gostei, e mandei um amigo refazer para mim.
Sobre o Game:
Graduações:
Missões:
Jutsus:
Imagens:
Bem galera, eu tenho varias coisas listadas para que o Shinobi Online possa cumprir seu papel como um Game diferenciado!
Podem comentar suas duvidas, criticas, e até sugestões.
Fã page: https://www.facebook.com/ShinobiOnline/?fref=ts
Video:
Vejam este video que acabei de fazer e postar. Está básico, mas é não está terminado ainda.
Video
[Readygo]Video 2016-09-20 13-22-59.mp4
-