Ir para conteúdo

dalvorsn

Conde
  • Total de itens

    750
  • Registro em

  • Última visita

  • Dias Ganhos

    8

Tudo que dalvorsn postou

  1. http://otland.net/threads/compiling-msvc-compiling-tfs-under-windows-easy-way.125178/ é para 2010, mas acho que deve dar na mesma
  2. Ah, entao deixa porque ele e pra versoes acima de 10x
  3. Nao sei dizer, mas pode ser que sim porque as sources sao bem antigas, talvez na epoca que fizeram, os conceitos basicos tenha sido feitos com base nessa versao Nao sei como ta seu projeto, mas se tiver começando agora, sugiro que faça uso do tfs 1.0, o codigo dele ta muito limpo, bem estavel e atualizado
  4. Na otland tu acha as libs pra compilar, e quanto ao boost cara, eu nao vou saber te explicar, ele e uma coisa tao ampla que e complicado, mas resumindo de maneira bem pobre ele e uma biblioteca do c++ que tem como principal meta deixar o codigo mais eficiente e maleavel. Quanto a compilaçao, qual o problema? Nao tem o projeto pronto e isso?
  5. Os dois, porque a limitação é no tipo da variável. Para effects o tipo é uint8_t, vai de 0 a 255 pois é um byte apenas. Porem como o protocol trabalha com bytes, se trocar o tipo no servidor, tem que trocar no cliente, e isso pode ser bem problematico por ter que trabalhar em assembly
  6. Sim perfeito, assim daria. E o bom de fazer assim e que os dados ja ficariam salvos attributes do proprio item, ai ja facilita tudo.
  7. e so tu ver la, tem varios parecidos, mas e basicamente pegar o number da pilha do lua_State L e instanciar como player por esse numero int32_t LuaInterface::luaSetPlayerMultiplier(lua_State* L) { //setPlayerMultiplier(cid, type, value) float value = popFloatNumber(L); int type = popNumber(L); ScriptEnviroment* env = getEnv(); if(Player* player = env->getPlayerByUID(popNumber(L))){ ///...
  8. Ue, tu declara o metodo na classe, através de uma instancia dela chama. Exemplo, declaro em player.h a seguinte função( em public ): void faznada() { std::cout << "executando faz nada"<< std::endl; } Dai a partir do momento que declarou ela em na classe, tu ja pode chamar pelas instancias. int32_t WeaponWand::getWeaponDamage(const Player* player, const Creature*, const Item*, bool maxDamage /* = false*/) const { player->faznada(); /// resto do code
  9. Sim e exatamente isso, nao precisa ter medo de mecher nas sources, faça so um backup por segurança e pronto. Ou trabalhe com subversions tipo github e etc, o qt creator tem suporte a isso no proprio pc, e bom tambem. Bem, sem alterar as sources o unico modo que vejo e no onStatsChange da creaturescritps, mas nao e bem o que tu queria tu pegaria o damage final ja, alteraria ele, faria o dano manual no script e retornaria false para callback.
  10. Do modo que foi feito nao da, ele nao salva quem esta na party, somente o numero A unica hora que ele salva um creatureId em storage é quando está enviando convite Linha 66: setPlayerStorageValue(pid, 9155, getCreatureName(cid) Um modo de salvar sem ocupar muito espaço seria por meio de string, e salvando o guid. function removePartner(name) local listPartner = getOfflinePlayerStorageValue(name, listPartnerStorage) if listPartner == -1 then return false end local guid = getPlayerGUIDByName(name) listPartner = listPartner:gsub(string.format("%d|", guid), "") setOfflinePlayerStorageValue(name, listPartnerStorage, listPartner) return true end function addPartner(name) local listPartner = getOfflinePlayerStorageValue(name, listPartnerStorage) if listPartner == -1 then listPartner = "" end local guid = getPlayerGUIDByName(name) if not (listPartner:match(string.format("%d|", guid))) then listPartner = listPartner .. string.format("%d|", guid) setOfflinePlayerStorageValue(name, listPartnerStorage, listPartner) return true end return false end function getPartners(name) local players = {} local listPartner = getOfflinePlayerStorageValue(name, listPartnerStorage) if listPartner == -1 then return players end for guid in listPartner:gmatch("(%d+)|") do table.insert(players, guid) end return players end Dai tu implementa isso no code
  11. Nao tem funçao lua que alteram as variaveis que guardam esses dados, sendo assim para fazer o que quer ou deve fazer diretamente nas sources, mais precisamente na classe Vocation. # vocation.h float getMultiplier(multiplier_t type) const {return formulaMultipliers[type];} void setMultiplier(multiplier_t type, float v) {formulaMultipliers[type] = v;} Porém cuidado, se alterar a variavel, ela será alterada para todos os players cuja vocation seja a mesma de quem tu alterou. Pois esse multiplicador não é do player, como tu disse e sim da vocação. O damage da wand por exemplo é definido aqui: # weapons.cpp int32_t WeaponWand::getWeaponDamage(const Player* player, const Creature*, const Item*, bool maxDamage /* = false*/) const { float multiplier = 1.0f; if(Vocation* vocation = player->getVocation()) multiplier = vocation->getMultiplier(MULTIPLIER_WAND); int32_t maxValue = (int32_t)(maxChange * multiplier); if(maxDamage) { player->sendCritical(); return -maxValue; } int32_t minValue = (int32_t)(minChange * multiplier); return random_range(-minValue, -maxValue, DISTRO_NORMAL); } Ele calcula baseado na vocação, se alterar isso vai alterar pra todas as vocações, então o que te sugiro é o seguinte, crie um multipliers na classe player, onde lá sim você pode alterá-lo a vontade, pois será individual de cada player. O que precisa fazer é praticamente só copiar o que está no vocations referente ao multipliers para o player, dai essa função acima ficaria assim: int32_t WeaponWand::getWeaponDamage(const Player* player, const Creature*, const Item*, bool maxDamage /* = false*/) const { float baseMultiplier = 1.0f; if(Vocation* vocation = player->getVocation()) baseMultiplier = vocation->getMultiplier(MULTIPLIER_WAND); float multiplier = baseMultiplier * player->getMultiplier(MULTIPLIER_WAND); int32_t maxValue = (int32_t)(maxChange * multiplier); if(maxDamage) { player->sendCritical(); return -maxValue; } int32_t minValue = (int32_t)(minChange * multiplier); return random_range(-minValue, -maxValue, DISTRO_NORMAL); } Isso se quiser continuar usando também o multipliers base da vocação, que me pareceu sua intenção
  12. Fiz um tutorial a muito tempo atras sobre isso, mas como nao postei nesse forum nao queria colocar o link aqui, mas enfim dane-se http://forums.#####/showthread.php?184407-Flags-e-customFlags
  13. Pode ser algum script com um loop grande, que está travando, na realidade pode ser uma infinidade de coisas. Quando se tem um erro tão generico assim, o ideal é rodar o servidor com debugger tipo dbg, dai da um breakpoint na ação que mais se aproxima do travamento, começe pelo login já que é nele que começa a demora, depois no walk caso e assim por diante, não tem como advinhar, se não da erros no console nem nada assim, o jeito é debuggar
  14. Essa função te atende bem http://www.xtibia.com/forum/topic/191971-tutorial-colocando-a-funcao-docreatecustommonster-no-c/ Só não serve para o loot, os demais serve, mas acredito que seja facil implementar já que ele cria um mType
  15. Entao provavelmente o sistema pega o peso pelo id, ai so nas sources mesmo, ver como e feito e alterar, mas tem que balancear se vale a pena ser feito
  16. addEvent(func, time, ...) 'func' >> função a ser executada 'time' >> tempo em miliseconds ate a execução '...' >> parametros da função 'func' Exemplo addEvent(doCombat, 1000, cid, combat1, numberToVariant(cid)) Porém, quando usa funções que dependem de cid, nãoo é bom executá-las direto, pois caso a criatura morra ou deslogue, esse cid perde referencia e da erro na função faça sempre uso de uma função auxiliar function aux(...) if isCreature( ({...})[1] ) then doCombat(...) end end addEvent(aux, time, cid, combat1, numberToVariant(cid)) Obs.: Acho que acabei te complicando na aux, enfim ela de um modo mais simples: function aux(cid, combat, variant) if isCreature( cid ) then doCombat(cid, combat, variant) end end O primeiro modo consome menos memoria, mas é menos claro, mas use o que preferir
  17. a função setCombatCallback e doCombat, tu tem que duplicar também, nao pode colocar como parametro setCombatCallback(combat1, CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues") setCombatCallback(combat2, CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues") doCombat( cid, combat1, numberToVariant(cid) ) doCombat( cid, combat2, numberToVariant(cid) )
  18. 1 doCreateItem(itemid, type/count, pos) Cria 'count' item(s) de id 'itemid' na posição 'pos' 2 doCreateItemEx(itemid[, count/subtype]) Cria um item virtual de id 'itemid' e quantidade 'count', essa função retorna um thing do item criado caso seja bem sucedida Em relação a uso, bem a primeira é bem obvio, a segunda tu usa quando quer editar os atributos do item, ou adicionar ele a algum outro lugar, por exemplo se eu quero criar um machado, mas quero alterar o attack dele, eu não preciso criar ele numa posição, pega-lo pela posição criada e depois alterá-lo, eu posso criá-lo virtualmente, alterar o que quero e só depois adicioná-lo na posição Porem para adicioná-lo são necessario funçoes especificas: doAddContainerItemEx(uid, virtuid) -- para adicionar em containers doTileAddItemEx(pos, uid) -- em tiles doPlayerAddItemEx(cid, uid[, canDropOnMap = false]) -- em players
  19. Nao, porque provavelmente essa funçao tier depende do cid(creatureid) e ele so existe dentro do escopo da callback(onCastSpell) Pode tentar duas coisas, usar o setAttackFormula dentro do onCastSpell, mas nao acredito que funcione, ou entao usar o callback onGetFormulaValues local atributos = { [1] = {atk = 15, heal = 20}, [2] = {atk = 20, heal = 30} } local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_ICEAREA) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ICE) function onGetFormulaValues(cid, level, skill, attack, factor) local tier = gettierfunction() return -atributos[tier].atk end setCombatCallback(combat, CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues") function onCastSpell(cid, var) return doCombat(cid, combat, var) end A segunda area necessita de um segundo combat, a condition basta setar o parametro pro combat
  20. tu pode pegar o tier por lua? se sim, so vai precisar de fazer alguns ifs ou fors para trabalhar com cada tipo eu nao conheço muito de tibia em si, mas por exemplo esse exevo pan faz food ne? ai o tier evoluiria o tipos de food correto? tu faz a mesma coisa local foods = { --[tier] = {possiblefoods} } local tier = getTierfunction() local possibleFoods = foods[tier] local sortedFood = possibleFoods[math.random(#possibleFoods)] -- obs.: isso e um pseudo-code Simples assim
  21. Mas nao precisa de duas oras, ja que a magia e a mesma coisa, so muda os valores, faça um script onde o dano e configurado de acordo com uma tabela onde o index e referenciado pelo tier
  22. Peso é um atributo, para atributos se usam as funções: doItemSetAttribute(uid, key, value) getItemAttribute(uid, key) A key é "weight" Quanto a sua sugestão, eu discordo completamente, um tutorial generalizado ficaria enorme, alem de trabalhoso para se fazer ainda teria pouca aceitação, é melhor duvidas pois você sabe que o que está explicando é do interesse do usuario De mais a mais, tem diversos topicos espalhados com tutorial, scripts pronto(da pra aprender vendo como sao feitos) e etc
  23. A função doCreatureRemoveHealth não existe no seu servidor. Use doCreatureAddHealth(cid, health)
  24. Veja bem, teu erro é bem comum para os que estão iniciando. Você está usando funções dependentes da variavel 'cid'(creatureId) fora do escopo da callback onCastSpell O que não for dependente dessa variavel pode ficar do lado de fora do escopo, mas o que depende, precisa ficar no escopo. Ficaria assim: local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_HITAREA) local damage_table = { --[[ [skill_value] = damage; ]] [5] = 10; [10] = 15; [15] = 20; [30] = 30; } function onCastSpell(cid, var) local final_damage = 0; local skill = getPlayerSkill(cid, 2) for skill_value, damage in pairs(damage_table) do if (skill >= skill_value) and (damage > final_damage) then final_damage = damage; end end doCreatureRemoveHealth(target, final_damage) return doCombat(cid, combat, var) end
  25. Posta como ficou seu script e o erro completo
  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...