-
Total de itens
859 -
Registro em
-
Última visita
-
Dias Ganhos
22
Posts postados por Skulls
-
-
Caraca brother, burrice minha!
Na hora de extrair, iam duas pastas com o mesmo nome, por isso nunca ia funcionar! kkkkkkkkkk
Desculpa e obrigado, se não fosse essa conversa eu não conseguiria arrumar! kkkk
PS: É, tem alguns que dão erro.
hahahahah acontece! O que tiver erro cria um topico que galera ajuda.
Abraços!
-
Piores erros de se diagnosticar é os que não acontecem nada =/
-
Ah sim, agora eu entendi, parabéns cara!
Saberia me dizer por que os mods que baixo, nenhum funciona? Apenas um "funcionou", mas tem um erro e por isso não funcionou.
Bom, tem N fatores que podem fazer o mod não funcionar. É muito dificil dizer, ainda mais cada mod comportando de um jeito diferente. Apresentam algum erro ou algum comportamento diferente ou simplesmente não dão sinal de vida?
-
O que isso faz? Tem alguma imagem?
Não, pois na verdade é só um bug fix. Existe uma função no TFS chamada creatureHideHealth que faz com que a vida da criatura não apareça e que funciona bem para cipclient. Porém, o OTC para de responder quando usado com ela e só volta quando a vida da criatura voltar a aparecer. Isso pq ele considera que o player estava morto e, portanto, não responde a suas ações. Esse tópico resolve esse problema e torna o hidehealth funcional para otc.
-
Tópico movido para dúvidas / pedidos resolvidos.
-
Ele vem fazendo um ótimo trabalho com o xtibia mesmo. Vamos em frente. Valeu pelos votos de boa sorteDaniel nunca decepciona com as novidades. A nova equipe de fato parece bem promissora, principalmente com a adição do Wolf. Boa sorte ao pessoal!
-
E o aprendizado. Valeu!A melhor recompensa é o reconhecimento. Hah.
Continue assim, o/ tmj
-
Hahaha quando o projeto tiver mais concreto voces ficarão sabendo.Ah sim, deveria da aula em tempo dela, uma totalmente direcionada a tibia hahah.
Sobre o moba, já tô ate ansioso kkk já pensei em fazer um moba antes kkk
Nao entendi o que disse sobre a aula.
-
Cara, possível é. Eu não tenho tempo para fazer isso, porém basicamente você precisaria das imagens (rofl) e um mod com uma função para mostrar/esconder o painel da image (similar a de quando você clica em um botão). Esse painel seria desenhado por cima do jogo e os controles de jogo ficariam travados ate o painel sair. A funcao seria chamada por um callback que você teria que criar, tipo um onLoadNextScreen. ou algo asism.
Daria um trabalho bom, não sei se compensa. -
Preciso aderir a esssa moda ahushaush, pena que meu pc não colabora para eu ficar compilando toda vez.
Quando você altera só arquivos .cpp recompila só esse arquivo. Quando você altera cabeçalhos ai ele recompila todos os arquivos ligados aquele cabeçalho. Só quando a edição é muito extensa que há recompilação total. xD
-
É muito útil mesmo, mas nao compensa fazer em lua. 2 linhas vc faz no cpp kkk.Seria bem legal. Pra fazer um servidor derivado, tipo o league of legends. E até mesmo StarCraft kkkk
Muito bom, pena eu não ter rep por hoje haha
E o servidor de moba está em desenvolvimento xD
-
Faltou o fumin.
-
Acho lamentável alguém com tamanhos poderes/responsabilidades ser tão seletivo, excluindo muito conteúdo de qualidade.
-
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,
-
Foi-se o tempo que eu curtia sobrecarregar o lua e fazer gambiarras. Cpp abriu meus olhos hahahaha
-
Muito obrigado pela oportunidade, meu amigo. Xtibia com você tem tudo para voltar as era áureas.
Você confundiu minha área e do summ.
Abraços, sucesso a comunidade!
-
Muito legal, e por clique ou por seta?
-
Muito bom, eu gostei haha! rep+.
# Pelo menos alguem ainda se interessa em ajudar a comunidade, coisa rara de hoje em dia..
Hahaha muito obrigado!
Pois é, na medida do possível eu tento.
Uma pena a sessão de cpp estar morta
Abraços!
-
Excelente script @@Skulls
É muito bom ver você se empenhando nessa área, da pra fazer coisas incríveis.
Obrigado Daniel! Achei mt útil fazer algo do tipo no meu contexto, uma vez que vou ressuscitar o fist fight como a base do dano básico do player.
Sim, as vezes eu mesmo me surpreendo com as possibilidades.
Grande abraço.
-
Crianças, não tem o que fazer e não tem senso crítico para perceber o papel ridículo e desnecessário que fazem. Chega a ser cômico.
-
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
-
Bom dia galera, tudo bem?
Decidi fazer uma talkaction para ilustrar o sistema que criei de customização de ataque básico: Personalizando Ataques Básicos
Óbviamente, ela não é a melhor forma de usar o sistema (afinal assim o player poderia definir qualquer range / tipo de combate/ efeito que ele quiser), mas serve para ilustrar como o sistema funciona.
Sem mais delongas, vá em talkactions.xml e cole a tag abaixo:<talkaction words="/cbh" separator=" " script="changeBasicHit.lua" />
Em talkactions/scripts crie um arquivo chamado changeBasicHit.lua e cole o script abaixo nele:
local combats = { ["physical"] = COMBAT_PHYSICALDAMAGE, ["energy"] = COMBAT_ENERGYDAMAGE, ["earth"] = COMBAT_EARTHDAMAGE, ["fire"] = COMBAT_FIREDAMAGE, ["undefined"] = COMBAT_UNDEFINEDDAMAGE, ["life_drain"] = COMBAT_LIFEDRAIN, ["mana_drain"] = COMBAT_MANADRAIN, ["healing"] = COMBAT_HEALING, ["drown"] = COMBAT_DROWNDAMAGE, ["ice"] = COMBAT_ICEDAMAGE, ["holy"] = COMBAT_HOLYDAMAGE, ["death"] = COMBAT_DEATHDAMAGE}local distanceEffects = { ["spear"] = CONST_ANI_SPEAR, ["bolt"] = CONST_ANI_BOLT, ["arrow"] = CONST_ANI_ARROW, ["fire"] = CONST_ANI_FIRE, ["energy"] = CONST_ANI_ENERGY, ["poison_arrow"] = CONST_ANI_POISONARROW, ["burst_arrow"] = CONST_ANI_BURSTARROW, ["throwing_star"] = CONST_ANI_THROWINGSTAR, ["throwing_knife"] = CONST_ANI_THROWINGKNIFE, ["smallstone"] = CONST_ANI_SMALLSTONE, ["death"] = CONST_ANI_DEATH, ["large_rock"] = CONST_ANI_LARGEROCK, ["snowball"] = CONST_ANI_SNOWBALL, ["power_bolt"] = CONST_ANI_POWERBOLT, ["poison"] = CONST_ANI_POISON, ["infernal_bolt"] = CONST_ANI_INFERNALBOLT, ["hunting_spear"] = CONST_ANI_HUNTINGSPEAR, ["enchanted_spear"] = CONST_ANI_ENCHANTEDSPEAR, ["red_star"] = CONST_ANI_REDSTAR, ["green_star"] = CONST_ANI_GREENSTAR, ["royal_spear"] = CONST_ANI_ROYALSPEAR, ["sniper_arrow"] = CONST_ANI_SNIPERARROW, ["onyx_arrow"] = CONST_ANI_ONYXARROW, ["piercing_bolt"] = CONST_ANI_PIERCINGBOLT, ["sword"] = CONST_ANI_WHIRLWINDSWORD, ["axe"] = CONST_ANI_WHIRLWINDAXE, ["club"] = CONST_ANI_WHIRLWINDCLUB, ["ethereal_spear"] = CONST_ANI_ETHEREALSPEAR, ["ice"] = CONST_ANI_ICE, ["earth"] = CONST_ANI_EARTH, ["holy"] = CONST_ANI_HOLY, ["sudden_death"] = CONST_ANI_SUDDENDEATH, ["flash_arrow"] = CONST_ANI_FLASHARROW, ["flamming_arrow"] = CONST_ANI_FLAMMINGARROW, ["shiver_arrow"] = CONST_ANI_SHIVERARROW, ["energy_ball"] = CONST_ANI_ENERGYBALL, ["small_ice"] = CONST_ANI_SMALLICE, ["small_holy"] = CONST_ANI_SMALLHOLY, ["small_earth"] = CONST_ANI_SMALLEARTH, ["earth_arrow"] = CONST_ANI_EARTHARROW, ["explosion"] = CONST_ANI_EXPLOSION, ["cake"] = CONST_ANI_CAKE, ["tarsal_arrow"] = CONST_ANI_TARSALARROW, ["vortex_bolt"] = CONST_ANI_VORTEXBOLT, ["prismatic_bolt"] = CONST_ANI_PRISMATICBOLT, ["crystalline_arrow"] = CONST_ANI_CRYSTALLINEARROW, ["drill_bolt"] = CONST_ANI_DRILLBOLT, ["envenomed_arrow"] = CONST_ANI_ENVENOMEDARROW, ["physical"] = CONST_ANI_GLOOTHSPEAR, ["simple_arrow"] = CONST_ANI_SIMPLEARROW,}function onSay(player, words, param) local config = string.split(param, " ") if #config ~= 3 then doPlayerSendCancel(player, "Invalid params number. You must specify three params: range combat type effect!") doSendMagicEffect(getCreaturePosition(player), CONST_ME_POFF) return false end if not tonumber(config[1]) then doPlayerSendCancel(player, "Pay attention: 1. Params order is: range combat effect. 2. Range must be a number.") doSendMagicEffect(getCreaturePosition(player), CONST_ME_MAGIC_BLUE) return false end player:setFistConditions(config[1], combats[config[2]] or COMBAT_PHYSICALDAMAGE, distanceEffects[config[3]] or config[1] == 1 and CONST_ANI_NONE or CONST_ANI_SNOWBALL) doSendMagicEffect(getCreaturePosition(player), CONST_ME_MAGIC_BLUE)end
Imagem:
Enfim, espero que gostem.
Abraços, -
Muito bom!
-
Acho difícil estar incompleto, afinal ele eh o 10.4 adaptado (o que eu usava). Enfim, não sei onde baixei.
-
Quem Está Navegando 0 membros estão online
- Nenhum usuário registrado visualizando esta página.
Npc que dá storage e historia
em Scripts
Postado
Tópico movido para dúvidas / pedidos resolvidos.