Skulls 331 Postado Março 31, 2016 Share Postado Março 31, 2016 (editado) Boa noite pessoal, tudo bem? Introdução Venho até vocês hoje postar um sistema que desenvolvi para customização de ataques básicos. Basicamente ele permite que você defina as características visuais do ataque básico de um player qualquer: efeito, tipo de dano e range. As modificações de itens ainda se sobrepõe ao mesmo, seguindo as regras: 1. A range do item só sobrepõe a range base do jogador se, e somente SE, esta for última for menor do que a primeira. 2. O efeito e o tipo de dano do item se sobrepõem ao base sempre que estes existirem. Códigos: 1. Definição da função lua responsável por chamar a alteração O primeiro passo é definir a função lua que será responsável pela alteração do ataque basico: player:setFistConditions(range, combatType, distanceEffect) Abra o arquivo luascript.h e cole isso dentro dos métodos protegidos de LuaScriptInterface: static int luaPlayerSetFistConditions(lua_State* L); Em seguida, abra luascript.cpp para configurarmos a implementação do método. Junto aos demais registros do tipo player cole este: registerMethod("Player", "setFistConditions", LuaScriptInterface::luaPlayerSetFistConditions); Junto às demais funções do metadata "Player" coloque: int LuaScriptInterface::luaPlayerSetFistConditions(lua_State* L) { // player:setFistConditions(range, combatType, distanceEffect) Player* player = getUserdata<Player>(L, 1); if (player) { player->setFistConditions(getNumber<uint8_t>(L, 2), getNumber<CombatType_t>(L, 3), getNumber<ShootType_t>(L, 4)); } else { lua_pushnil(L); } return 1; } Pronto, a sua função lua está configurada. 2. Configurar os atributos que definem o novo ataque base do player Nessa etapa vamos alterar a classe "Player" para receber os atributos referentes ao range, tipo de combate e efefeito do ataque base, bem como funções para definí-los e recebê-los (getters and setters). Em player.h, dentro de variáveis protegidas (protected:), cole: ShootType_t fistDistanceEffect; uint8_t fistRange; CombatType_t fistCombatType; Na parte publica (public:) defina os getters and setters: void setFistConditions(uint8_t range, CombatType_t combatType, ShootType_t distanceEffect) { fistRange = range; fistCombatType = combatType; fistDistanceEffect = distanceEffect; } uint8_t getFistRange() { return fistRange; } CombatType_t getFistCombatType() { return fistCombatType; } ShootType_t getFistDistanceEffect() { return fistDistanceEffect; } Agora, em player.cpp, dentro do construtor (Player::Player(ProtocolGame_ptr p) : Creature(), inventory(), client(p), varSkills(), varStats(), inventoryAbilities()) coloque: fistDistanceEffect = ShootType_t::CONST_ANI_NONE; fistRange = 1; fistCombatType = CombatType_t::COMBAT_PHYSICALDAMAGE; Pronto, mais uma etapa concluída. A sua classe player está pronta para receber as variáveis referentes à customização do ataque básico. 3. Configuração da Classe Weapon e suas subClasses Chegou a hora de configurar a classe Weapon e suas subClasses, responsáveis pela execução do dano base. Primeiramente, abra o arquivo Weapons.h e, dentro do public da classe Weapons coloque: virtual void Weapon::setFistDistanceParams(Player* player, CombatParams& params) const Em Weapons.cpp, vá até o método Weapons::useFist(Player* player, Creature* target) e substitua: if (!Position::areInRange<1, 1>(player->getPosition(), target->getPosition())) { return false; } Por: Position playerPos = player->getPosition(); Position targetPos = target->getPosition(); if (playerPos.z != targetPos.z) { return false; } if (std::max<uint32_t>(Position::getDistanceX(playerPos, targetPos), Position::getDistanceY(playerPos, targetPos)) > player->getFistRange()) { return false; } Após params.blockedByShield = true; cole: params.distanceEffect = player->getFistDistanceEffect(); params.combatType = player->getFistCombatType(); Pronto o script já é funcional. Isto é, seu ataque base tem efeito, dano e range customizáveis. Porém, qualquer item que for equipado irá sobrepor seu ataque base. Se você quer assim, pare por aqui. Caso você queira que a sobreposição do item sobre a sua customização tenha regras faça o próximo passo. 4. Criando regras Bom, já estamos quase concluindo o tutorial. Agora vamos definir as regras de sobreposição dos itens sobre o ataque base. Volte a Weapons.cpp e defina o método que dita as regras de efeito e tipo do ataque: void Weapon::setFistDistanceParams(Player* player, CombatParams& params) const { params.distanceEffect = params.distanceEffect != ShootType_t::CONST_ANI_NONE ? params.distanceEffect : player->getFistDistanceEffect(); params.combatType = params.combatType != CombatType_t::COMBAT_NONE ? params.combatType : player->getFistCombatType(); } Explicando: Aqui você determina quando o parâmetro final de dano vai ter as caracteríticas da sua arma e quando vai ter de ataque básico. No nosso caso, vai sobrescrever sempre que a arma tiver um efeito e um tipo de dano próprio, isto é, for diferente de CONST_ANI_NONE e COMBAT_NONE. Fique a vontade para modificar este método ao seu gosto. Exemplo: sobrescrever o tipo de dano somente se ele for do tipo físico; sobrescrever o efeito somente se ele ainda não existe; etc, use a criatividade. Bom, para essas configurações de regras valerem, temos agora que substituir o método Weapon::internalUseWeapon por: void Weapon::internalUseWeapon(Player* player, Item* item, Creature* target, int32_t damageModifier) const { if (scripted) { LuaVariant var; var.type = VARIANT_NUMBER; var.number = target->getID(); executeUseWeapon(player, var); } else { CombatDamage damage; WeaponType_t weaponType = item->getWeaponType(); if (weaponType == WEAPON_AMMO || weaponType == WEAPON_DISTANCE) { damage.origin = ORIGIN_RANGED; } else { damage.origin = ORIGIN_MELEE; } CombatParams paramsCheck = params.copyParams(); setFistDistanceParams(player, paramsCheck); damage.primary.type = paramsCheck.combatType; damage.primary.value = (getWeaponDamage(player, target, item) * damageModifier) / 100; damage.secondary.type = getElementType(); damage.secondary.value = getElementDamage(player, target, item); Combat::doCombatHealth(player, target, damage, paramsCheck); } onUsedWeapon(player, item, target->getTile()); } Além disso, devemos ir em combat.h e, dentro da struct CombatParams, criar o seguinte 'método': CombatParams CombatParams::copyParams() const { CombatParams newParams; newParams.dispelType = dispelType; newParams.combatType = combatType; newParams.blockedByArmor = blockedByArmor; newParams.blockedByShield = blockedByShield; newParams.targetCasterOrTopMost = targetCasterOrTopMost; newParams.aggressive = aggressive; newParams.itemId = itemId; newParams.impactEffect = impactEffect; newParams.distanceEffect = distanceEffect; newParams.useCharges = useCharges; newParams.origin = origin; return newParams; } A última modificação é a definição da regra de range. De volta ao Weapons.cpp e no método Weapon::playerWeaponCheck logo após: if (playerPos.z != targetPos.z) { return 0; } Cole: shootRange = player->getFistRange() <= shootRange ? shootRange : player->getFistRange(); No caso, a regra é para substituir a range base pela range do item SE esta for menor que a primeira. Outro exemplo seria só substituir a range base pela do item SE a range base for maior que 1 (para que knights não possam usar ranged itens, por exemplo). Enfim pessoal, isso é tudo. Espero que gostem. Abraços e boa noite. Editado: Criado um tópico em scripting ilustrando a utilização do sistema: Exemplificando Customização de Ataque Editado Março 31, 2016 por Skulls Link para o comentário https://xtibia.com/forum/topic/240113-personalizando-ataques-b%C3%A1sicos/ Compartilhar em outros sites More sharing options...
Beeki 284 Postado Abril 1, 2016 Share Postado Abril 1, 2016 Gostei, parabéns mestre! Ta fazendo um ótimo trabalho. Link para o comentário https://xtibia.com/forum/topic/240113-personalizando-ataques-b%C3%A1sicos/#findComment-1689778 Compartilhar em outros sites More sharing options...
Deadpool 862 Postado Abril 1, 2016 Share Postado Abril 1, 2016 Eu realmente concordo contigo beki. Haha. Desde que esse carinha chegou aqui(se estava mal tenho visto) Esse carinha tá fazendo um excelente trabalho no fórum. @topic, eu gostei. Link para o comentário https://xtibia.com/forum/topic/240113-personalizando-ataques-b%C3%A1sicos/#findComment-1689780 Compartilhar em outros sites More sharing options...
Skulls 331 Postado Abril 1, 2016 Autor Share Postado Abril 1, 2016 Gostei, parabéns mestre! Ta fazendo um ótimo trabalho. Eu realmente concordo contigo beki. Haha. Desde que esse carinha chegou aqui(se estava mal tenho visto) Esse carinha tá fazendo um excelente trabalho no fórum. @topic, eu gostei. O galerinha, gratificante ler elogios assim. Esse carinha aqui agradece! O intuito é sempre somar, em contrapartida tenho aprendido bastante. Basta observar o amadurecimento dos sistemas. Obrigado pelos comentários, tava triste com essa area abandonada do cpp. Abraços, Link para o comentário https://xtibia.com/forum/topic/240113-personalizando-ataques-b%C3%A1sicos/#findComment-1689786 Compartilhar em outros sites More sharing options...
Deadpool 862 Postado Abril 1, 2016 Share Postado Abril 1, 2016 A melhor recompensa é o reconhecimento. Hah. Continue assim, o/ tmj Link para o comentário https://xtibia.com/forum/topic/240113-personalizando-ataques-b%C3%A1sicos/#findComment-1689787 Compartilhar em outros sites More sharing options...
Skulls 331 Postado Abril 2, 2016 Autor Share Postado Abril 2, 2016 A melhor recompensa é o reconhecimento. Hah. Continue assim, o/ tmj E o aprendizado. Valeu! Link para o comentário https://xtibia.com/forum/topic/240113-personalizando-ataques-b%C3%A1sicos/#findComment-1689890 Compartilhar em outros sites More sharing options...
deadkiller 2 Postado Outubro 12, 2016 Share Postado Outubro 12, 2016 Queria Tanto pro 0.3.6 Hahaha Mas boa! <3 Link para o comentário https://xtibia.com/forum/topic/240113-personalizando-ataques-b%C3%A1sicos/#findComment-1706139 Compartilhar em outros sites More sharing options...
CoehManeh 0 Postado Junho 5, 2018 Share Postado Junho 5, 2018 Fiz tudo direitinho e deu 306 erros. Mas parabéns pelo empenho. Link para o comentário https://xtibia.com/forum/topic/240113-personalizando-ataques-b%C3%A1sicos/#findComment-1741151 Compartilhar em outros sites More sharing options...
Posts Recomendados