-
Total de itens
750 -
Registro em
-
Última visita
-
Dias Ganhos
8
Tudo que dalvorsn postou
-
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
-
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
-
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
-
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
-
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
-
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
-
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
-
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) )
-
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
-
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
-
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
-
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
-
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
-
A função doCreatureRemoveHealth não existe no seu servidor. Use doCreatureAddHealth(cid, health)
-
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
-
Posta como ficou seu script e o erro completo
-
Pode ser, inclusive seria mais facil que meu metodo, so atentar aos tamanhos das variaveis local damage_table = { --[[ [skill_value] = damage; ]] [10] = 500; [20] = 1000; [50] = 10000; -- ...... } 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) Proximo disso
-
Entendi tua ideia, da para fazer sim, mas nao aconselho onThink, usa o onStartup() Porem, podem ser varios tiles né, então se for usar storage, lembre-se que storages tem apenas 255 caracteres disponiveis, dependendo da quantidade de tiles alterados, pode dar problema na hora de salvar Leitura no hd é um pouco mais lento que database, mas te daria um controle melhor, pode-se usar uma estrutura binaria para executar esse save, algo assim: [2] -- dois bytes(uint16): player id [2] -- dois bytes(uint16): que salvaria o numero de tiles modificados [2] -- dois bytes(uint16): posição x [2] -- dois bytes(uint16): posição y [2] -- dois bytes(uint16): posição z [1] -- um byte(uint8): stackpos [2] -- dois bytes(uint16): itemid ao qual será transformado Ou seja, para cada tile alterado, tu usaria 11 bytes + os 2 do player_id + 2 do numero de tiles [ 2 + 2 + 11 * numero de tiles alterados ] a leitura faria algo assim: local customTileHouse = {} local player_id = file:getU16 local number_of_tiles = file:getU16 customTileHouse[player_id] = {} local tiles = customTileHouse[player_id] local insert = table.insert for tile = 1, number_of_tiles do local x = file:getU16 local y = file:getU16 local z = file:getU16 local stackPos = file:getU8 local itemTransform = file:getU16 insert(tiles, { pos = {x = x, y = y, z = z, stackPos = stackPos}, itemTransform = itemTransform}) end Obs.: sei que não tem os metodos getU16 e etc em lua, mas ja fiz algo semelhante nesse script: http://www.xtibia.com/forum/topic/186169-spr-extractor/?hl=%2Bspr+%2Bextractor A lib so carrega o que esta escrito nos arquivos, ela nao faz save da memoria dinamica Teria que escrever em algum arquivo de la para ser lido no startup
-
Sim, consome, mas e porque ele faz o save no mapa inteiro, se fizer so das houses nao vai ser tanta nao brow
-
Ahh sim, entendi, o ground em si continua o mesmo, poxa provavelmente voce vai ter que alterar o otbm mesmo, acredito que seja umas das formas mais faceis, e ainda assim e complicado Mas acho que ja vi algo semelhante, do capa verde um script que ele fez baseado nas sources do rme Porem não foi postado nesse forum http://forums.#####/showthread.php?190780-Salvar-Mapa-In-Game-cria-um-novo-otbm
-
O tile da house e salvo junto com o serverSave, antes de fechar de um save e pronto
-
Flags são permissões/restrições, elas estão declaradas no seu 000-constant.lua Algo semelhante a isso: Para calcular é facil, basta pegar as flags que quer que o grupo possua, colocar na base 2 e elevar ao expoente do valor correspondente a ela, ou seja: para as flags PLAYERFLAG_CANNOTATTACKPLAYER = 1 PLAYERFLAG_CANNOTATTACKMONSTER = 2 PLAYERFLAG_CANNOTBEATTACKED = 3 PLAYERFLAG_CANCONVINCEALL = 4 PLAYERFLAG_CANSUMMONALL = 5 PLAYERFLAG_CANILLUSIONALL = 6 PLAYERFLAG_CANSENSEINVISIBILITY = 7 o valor será calculado assim:flags = 2^1 +2^2 +2^3 +2^4 +2^5 +2^6 +2^7
-
omg, nem notei que coloquei errado kkk ;D
-
Vou dar um exemplo: Como ficaria o numero 10.25 na memoria: Primeiro voce converte ele para binario, fica: 1010.01 Apos isso faz a normatização do mesmo, que consiste basicamente em levar todos os valores para direita da virgula por meio de notação cientifica, ficando: 0.101001*2^4 Pronto, agora temos tudo para montar o valor na memoria. a parte fracionaria é chamada de mantissa, correspondente a 101001 no exemplo [1 bit sinal expoente] [1 bit sinal do numero] [4 bits expoente] [10 bits mantissa] 0 0 0100 0000101001 (0 pois é positivo) (0 pois é positivo) (4 em binário) (parte fracionaria) Sendo assim a representação na memoria fica: 0000100000101001
-
Na memoria o numero negativo o que muda é um bit só São dois byte(16 bits) 1 bit para o sinal do número 1 bit para o sinal do expoente 4 bits para o expoente 10 bits para a mantissa Quanto a fazer uma função geral, a parte inteira é bem facil, e fica ate pequeno, porem a decimal, nossa, da uma trabalheira kk, teria que fazer uma seria de elseifs para fazer a parte decimal e cada um com sua regra, mas é possivel de fazer sim
-
Quem Está Navegando 0 membros estão online
- Nenhum usuário registrado visualizando esta página.