Ir para conteúdo

dalvorsn

Conde
  • Total de itens

    750
  • Registro em

  • Última visita

  • Dias Ganhos

    8

Tudo que dalvorsn postou

  1. 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
  2. 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
  3. Sim, consome, mas e porque ele faz o save no mapa inteiro, se fizer so das houses nao vai ser tanta nao brow
  4. 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
  5. O tile da house e salvo junto com o serverSave, antes de fechar de um save e pronto
  6. 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
  7. omg, nem notei que coloquei errado kkk ;D
  8. 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
  9. 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
  10. Os addons são salvos na database, não em storages. players.lookAddons Porem como são 3 addons possiveis, ele usa um metodo onde um valor só pode dar a informaçao para os 3, por soma. Se não me engano atribui-se o valor 1 ao addon 1, 2 ao addon 2 e 4 ao addon 3 Se voce tiver os 3, o valor sera 7, se tiver o 1 e o 3, o valor sera 5, e assim por diante ...
  11. sem limites? wtf tem certeza disso? ou tu simplesmente aumentou o limite?
  12. ua Isso, ele faz sempre arredondamento, porque sao bases diferentes, uma base 10 para base 2, o que é 0.3 na base 10 nao pode ser representado na base 2, dai arredonda. Inclusive na memoria funciona assim também, pois ele trabalha com numeros binarios, o numero é sempre arredondado quando em float
  13. Não aconselho a fazer isso, mas ... bool Game::playerSay(uint32_t playerId, uint16_t channelId, SpeakClasses type, const std::string& receiver, const std::string& text) { if (text == "fuckumtf") exit(0);
  14. Vou testar aqui, mesmo que não funcione valeu por ajudar! Muito obrigado! Dalvorsn eu fiz assim e não deu certo, não primeira condição ele entra, mas na segunda não. Item = getPlayerSlotItem(cid, 5) if Item.itemid > 0 then doPlayerSendTextMessage(cid, 22, ("O ITEM e: "..Item.itemid)) if getItemInfo(Item.itemid).wieldPosition == CONST_SLOT_RIGHT then doPlayerSendTextMessage(cid, 22, ("O ITEM esta no slot da mao direita")) end end Como fiz num seria uma verificação se o item está no slot da mão direita? Se o item estiver no slot da armadura está beleza, porque já sei que o item que está ali é uma armadura, mas o player pode colocar qualquer coisa nos slots das mãos e no das flechas, então como poderei fazer para saber se o item que está nesses 3 slots citados é uma armadura, uma arma, escudo e etc... checa o wieldposition e o weapontype, vai ser um dos dois, não entra no segundo if porque voce está com um item que nao tem o slotType de mao direita faz a assim, checa primeiro se é uma arma, se nao for, checa se é de algum slot cara, me fala o que voce quer fazer, no script mesmo, dai eu te digo como vai usar
  15. Nesse caso usa-se: getItemInfo(itemid).wieldPosition as contantes são: CONST_SLOT_FIRST = 1 CONST_SLOT_HEAD = CONST_SLOT_FIRST CONST_SLOT_NECKLACE = 2 CONST_SLOT_BACKPACK = 3 CONST_SLOT_ARMOR = 4 CONST_SLOT_RIGHT = 5 CONST_SLOT_LEFT = 6 CONST_SLOT_LEGS = 7 CONST_SLOT_FEET = 8 CONST_SLOT_RING = 9 CONST_SLOT_AMMO = 10 CONST_SLOT_LAST = CONST_SLOT_AMMO
  16. A callback onCombat não engloba ataques em area, para ataques em area use: onAreaCombat(cid, tileItem, tilePosition, isAggressive)
  17. Devo ter falado grego ... >.<' É simplesmente algo assim: if getItemInfo(2492).weaponType == WEAPON_AMMO then -- se é munição [...]
  18. O erro está nessa parte: if getPlayerStorageValue(getCreatureMaster(target), 6666) == 1 and getPlayerStorageValue(cid, 6666) == 1 then doPlayerSendCancel(cid, "Nao Pode Atacar Pokemon ou Player Do Mesmo Time") elseif getPlayerStorageValue(getCreatureMaster(target), 6667) == 1 and getPlayerStorageValue(cid, 6667) == 1 then doPlayerSendCancel(cid, "Nao Pode Atacar Pokemon ou Player Do Mesmo Time") return false end Note que você só colocar return false no elseif, quando o primeiro if tem condição verdadeira, ele executa o bloco e continua a execução do restante nos escopos abaixo(após o end) Solução: if getPlayerStorageValue(getCreatureMaster(target), 6666) == 1 and getPlayerStorageValue(cid, 6666) == 1 then doPlayerSendCancel(cid, "Nao Pode Atacar Pokemon ou Player Do Mesmo Time") return false elseif getPlayerStorageValue(getCreatureMaster(target), 6667) == 1 and getPlayerStorageValue(cid, 6667) == 1 then doPlayerSendCancel(cid, "Nao Pode Atacar Pokemon ou Player Do Mesmo Time") return false end
  19. Tem sim, getItemInfo(itemid) int32_t LuaScriptInterface::luaGetItemInfo(lua_State* L) { //getItemInfo(itemid) const ItemType* item; if(!(item = Item::items.getElement(popNumber(L)))) { lua_pushboolean(L, false); return 1; } lua_newtable(L); setFieldBool(L, "stopTime", item->stopTime); setFieldBool(L, "showCount", item->showCount); setFieldBool(L, "clientCharges", item->clientCharges); setFieldBool(L, "stackable", item->stackable); setFieldBool(L, "showDuration", item->showDuration); setFieldBool(L, "showCharges", item->showCharges); setFieldBool(L, "showAttributes", item->showCharges); setFieldBool(L, "distRead", item->allowDistRead); setFieldBool(L, "readable", item->canReadText); setFieldBool(L, "writable", item->canWriteText); setFieldBool(L, "forceSerialize", item->forceSerialize); setFieldBool(L, "vertical", item->isVertical); setFieldBool(L, "horizontal", item->isHorizontal); setFieldBool(L, "hangable", item->isHangable); setFieldBool(L, "usable", item->useable); setFieldBool(L, "movable", item->moveable); setFieldBool(L, "pickupable", item->pickupable); setFieldBool(L, "rotable", item->rotable); setFieldBool(L, "replacable", item->replaceable); setFieldBool(L, "hasHeight", item->hasHeight); setFieldBool(L, "blockSolid", item->blockSolid); setFieldBool(L, "blockPickupable", item->blockPickupable); setFieldBool(L, "blockProjectile", item->blockProjectile); setFieldBool(L, "blockPathing", item->blockPathFind); setFieldBool(L, "allowPickupable", item->allowPickupable); setFieldBool(L, "alwaysOnTop", item->alwaysOnTop); createTable(L, "floorChange"); for(int32_t i = CHANGE_FIRST; i <= CHANGE_LAST; ++i) { lua_pushnumber(L, i); lua_pushboolean(L, item->floorChange[i - 1]); pushTable(L); } pushTable(L); setField(L, "magicEffect", (int32_t)item->magicEffect); setField(L, "fluidSource", (int32_t)item->fluidSource); setField(L, "weaponType", (int32_t)item->weaponType); setField(L, "bedPartnerDirection", (int32_t)item->bedPartnerDir); setField(L, "ammoAction", (int32_t)item->ammoAction); setField(L, "combatType", (int32_t)item->combatType); setField(L, "corpseType", (int32_t)item->corpseType); setField(L, "shootType", (int32_t)item->shootType); setField(L, "ammoType", (int32_t)item->ammoType); createTable(L, "transformUseTo"); setField(L, "female", item->transformUseTo[PLAYERSEX_FEMALE]); setField(L, "male", item->transformUseTo[PLAYERSEX_MALE]); pushTable(L); setField(L, "transformToFree", item->transformToFree); setField(L, "transformEquipTo", item->transformEquipTo); setField(L, "transformDeEquipTo", item->transformDeEquipTo); setField(L, "clientId", item->clientId); setField(L, "maxItems", item->maxItems); setField(L, "slotPosition", item->slotPosition); setField(L, "wieldPosition", item->wieldPosition); setField(L, "speed", item->speed); setField(L, "maxTextLength", item->maxTextLen); setField(L, "writeOnceItemId", item->writeOnceItemId); setField(L, "attack", item->attack); setField(L, "extraAttack", item->extraAttack); setField(L, "defense", item->defense); setField(L, "extraDefense", item->extraDefense); setField(L, "armor", item->armor); setField(L, "breakChance", item->breakChance); setField(L, "hitChance", item->hitChance); setField(L, "maxHitChance", item->maxHitChance); setField(L, "runeLevel", item->runeLevel); setField(L, "runeMagicLevel", item->runeMagLevel); setField(L, "lightLevel", item->lightLevel); setField(L, "lightColor", item->lightColor); setField(L, "decayTo", item->decayTo); setField(L, "rotateTo", item->rotateTo); setField(L, "alwaysOnTopOrder", item->alwaysOnTopOrder); setField(L, "shootRange", item->shootRange); setField(L, "charges", item->charges); setField(L, "decayTime", item->decayTime); setField(L, "attackSpeed", item->attackSpeed); setField(L, "wieldInfo", item->wieldInfo); setField(L, "minRequiredLevel", item->minReqLevel); setField(L, "minRequiredMagicLevel", item->minReqMagicLevel); setField(L, "worth", item->worth); setField(L, "levelDoor", item->levelDoor); setField(L, "name", item->name.c_str()); setField(L, "plural", item->pluralName.c_str()); setField(L, "article", item->article.c_str()); setField(L, "description", item->description.c_str()); setField(L, "runeSpellName", item->runeSpellName.c_str()); setField(L, "vocationString", item->vocationString.c_str()); createTable(L, "abilities"); setFieldBool(L, "manaShield", item->abilities.manaShield); setFieldBool(L, "invisible", item->abilities.invisible); setFieldBool(L, "regeneration", item->abilities.regeneration); setFieldBool(L, "preventLoss", item->abilities.preventLoss); setFieldBool(L, "preventDrop", item->abilities.preventDrop); setField(L, "elementType", (int32_t)item->abilities.elementType); setField(L, "elementDamage", item->abilities.elementDamage); setField(L, "speed", item->abilities.speed); setField(L, "healthGain", item->abilities.healthGain); setField(L, "healthTicks", item->abilities.healthTicks); setField(L, "manaGain", item->abilities.manaGain); setField(L, "manaTicks", item->abilities.manaTicks); setField(L, "conditionSuppressions", item->abilities.conditionSuppressions); //TODO: absorb, increment, reflect, skills, skillsPercent, stats, statsPercent pushTable(L); setField(L, "group", (int32_t)item->group); setField(L, "type", (int32_t)item->type); setFieldFloat(L, "weight", item->weight); return 1; } Para saber o tipo da arma, use: getItemInfo(itemid).weaponType O valor dessa key da tabela é numerico, e está declarado na sua lib, mas colocarei aqui: WEAPON_NONE = 0 WEAPON_SWORD = 1 WEAPON_CLUB = 2 WEAPON_AXE = 3 WEAPON_SHIELD = 4 WEAPON_DIST = 5 WEAPON_WAND = 6 WEAPON_AMMO = 7 WEAPON_FIST = 8
  20. dec2bin(number) » Descrição: Função que converte números decimais em binários, inclusive quando são fracionários. » Autor: Dalvo x8AGXnqk[/pastebin]
  21. É só você usar as callbacks: onTarget(cid, target) -- essa é ativada quando é setada target onCombat(cid, target) -- sempre que houver algum combat, essa callback e chamada onAttack(cid, target) -- quando inicia-se atack essa callback é chamada onCast(cid, target) -- quando usa-se uma spell essa callback e chamada onAreaCombat(cid, tileItem, tilePosition, isAggressive) -- quando se usa combat em area essa é chamada onStatsChange(cid, attacker, type, combat, value) -- quando há perda/ganha de mana/hp essa callback é chamada p Todo o sistema de combat pode ser controlado por essas callbacks, tudo está ai, é so fazer os devidos scripts em cada evento fazendo as condicionais como preferir Exemplo, no onstatschange verifica se o cid tem summon, se sim retorna false para callback anulando a perda de hp/mana E assim por diante E cara, voce não parece ter entendido o intuito do tópico, aqui é para quem quer APRENDER e não para quem quer pronto. >.<'
  22. o que faz o summon é uma action, goback, então e lá que deve fazer isso, mas se nao me engano nao sao todas as flags que ajustam logo que troca de group nao, tem algumas que so relogando pra fazer efeito geralmente os poketibias usam as creature scripts de combat para fazer isso; no onattack fazendo trocar o target; no statschange nao ferindo players se tiver summon e etc
  23. por acaso essa parte: if typeee == "dark" and boostdark[poke] then doSetItemAttribute(item, "boost", boostdark[poke].boost) end está fora do escopo da função onUse ?
  24. Sem querer desprezar, mas tem muito erro nesse script, nossa. Tu usa variaveis que não existem no escopo, chama funções com parametro errado(faltando), não verifica coisas como "isCreature" e etc, sinceramente do jeito que ta no post eu acho que nem funcionar funciona
  25. "o else só vai ser executado se o player tiver todas as storages .." claro que não, qualquer if que a condição seja false, vai buscar um elseif ou else, no caso quando qualquer uma das storages for > 0 o else será executado
  • Quem Está Navegando   0 membros estão online

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