Ir para conteúdo

Oneshot

Marquês
  • Total de itens

    1347
  • Registro em

  • Última visita

  • Dias Ganhos

    36

Tudo que Oneshot postou

  1. @Roksas Não é isso que o dono do tópico quer. Ele quer uma maneira de parar aqueles que usam Elfbot para acelerar os ataques ao máximo. @knightkunn void Player::doAttacking(uint32_t) { if(!lastAttack) lastAttack = OTSYS_TIME() - getAttackSpeed() - 1; else if((OTSYS_TIME() - lastAttack) < getAttackSpeed()) return; if(hasCondition(CONDITION_PACIFIED) && !hasCustomFlag(PlayerCustomFlag_IgnorePacification)) { lastAttack = OTSYS_TIME(); return; } Item* item = getWeapon(false); if(const Weapon* _weapon = g_weapons->getWeapon(item)) { if(_weapon->interruptSwing() && !canDoAction()) { SchedulerTask* task = createSchedulerTask(getNextActionTime(), boost::bind(&Game::checkCreatureAttack, &g_game, getID())); setNextActionTask(task); } else { if((!_weapon->hasExhaustion() || !hasCondition(CONDITION_EXHAUST)) && _weapon->useWeapon(this, item, attackedCreature)) lastAttack = OTSYS_TIME(); updateWeapon(); } } else if(Weapon::useFist(this, attackedCreature)) lastAttack = OTSYS_TIME(); } Isto acima, é um exemplo da parte responsável por administrar os ataques dos jogadores no código-fonte do servidor, é ela que controla o intervalo de tempo entre um ataque e outro. Uma maneira simples de parar o fast attack, é criar uma variável que controle os intervalos de tempo e identifique jogadores que estejam atacando muitas vezes em um curto intervalo. Sendo possível com isso, banir tais jogadores. Abraços.
  2. function hasItems(position, rangex, rangey, ...) local fromPosition = {x = position.x - rangex, y = position.y - rangey, z = position.z} local toPosition = {x = position.x + rangex, y = position.y + rangey, z = position.z} local items = {...} local match = false for x = fromPosition.x, toPosition.x do for y = fromPosition.y, toPosition.y do local p = {x = x, y = y, z = fromPosition.z} for _, item in ipairs(items) do local w = getTileItemById(p, item) if w.uid > 0 then match = true end end end end return match end Acabou de sair do forno. Utilização: hasItems(getThingPosition(cid), 1, 1, 2112, 2160, 2152, 2148) Irá procurar em uma área de 3X3 ao redor do jogador pelos quatro itens especificados na função, caso ache qualquer um dos quatro, irá retornar true.
  3. local combat1 = createCombatObject() setCombatParam(combat1, COMBAT_PARAM_CREATEITEM, 6139) local area1 = createCombatArea({ {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 2, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 1} }) setCombatArea(combat1, area1) local combat2 = createCombatObject() setCombatParam(combat2, COMBAT_PARAM_CREATEITEM, 6140) local area2 = createCombatArea({ {0, 1, 1, 1, 0}, {0, 0, 0, 0, 0}, {0, 0, 2, 0, 0}, {0, 0, 0, 0, 0}, {1, 1, 1, 1, 0} }) setCombatArea(combat2, area2) local combat3 = createCombatObject() setCombatParam(combat3, COMBAT_PARAM_CREATEITEM, 6142) local area3 = createCombatArea({ {0, 0, 0, 0, 1}, {1, 0, 0, 0, 1}, {1, 0, 2, 0, 1}, {1, 0, 0, 0, 1}, {0, 0, 0, 0, 0} }) setCombatArea(combat3, area3) local combat4 = createCombatObject() setCombatParam(combat4, COMBAT_PARAM_CREATEITEM, 6141) local area4 = createCombatArea({ {1, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 2, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0} }) setCombatArea(combat4, area4) local function clean_wood(position) local fromPosition = {x = position.x - 5, y = position.y - 5, z = position.z} local toPosition = {x = position.x + 5, y = position.y + 5, z = position.z} for x = fromPosition.x, toPosition.x do for y = fromPosition.y, toPosition.y do local tile = {x = x, y = y, z = fromPosition.z} for itemid = 6139, 6142 do local wood = getTileItemById(tile, itemid) if wood.uid > 0 then doRemoveItem(wood.uid, 1) doSendMagicEffect(tile, CONST_ME_POFF) end end end end end function onCastSpell(cid, var) doCombat(cid, combat1, var) doCombat(cid, combat2, var) doCombat(cid, combat3, var) doCombat(cid, combat4, var) addEvent(clean_wood, 10 * 1000, getThingPosition(cid)) return true end
  4. Estarei atualizando o sistema com alguns fixes como o da possibilidade de refinar itens agrupáveis e adicionando esta possibilidade de criar uma pedra para cada atributo. Abraços.
  5. Pede-se pelo menos boa gramática no cargo de Moderação. Versões
  6. É que depende muito de quais são os parâmetros funcionais do seu servidor nesta função: doAddPlayerBanishment(getPlayerGUID(cid), 3, (os.time() + (24 * 60 * 60)), 12, 2, "[sISTEMA ANTI-BOT]") Testei em duas revisões do The Forgotten Server 0.4.0, uma de 8.62 e outra de 8.71 e obtive total funcionalidade. Se você estiver usando um servidor diferente daqueles que testei, poste aqui, posso descobrir os parâmetros corretos nas sources, mas preciso delas. Abraços.
  7. function onUse(cid, item, fromPosition, itemEx, toPosition) local combate = COMBAT_PHYSICALDAMAGE -- tipo de dano p = fromPosition local a0 = {x=p.x, y=p.y-1, z=p.z} local a1 = {x=p.x, y=p.y-2, z=p.z} local a2 = {x=p.x, y=p.y-3, z=p.z} local a3 = {x=p.x, y=p.y-4, z=p.z} local a4 = {x=p.x, y=p.y-5, z=p.z} local end1 = {x=p.x, y=p.y-6, z=p.z} local storage = 3425 -- Nao mexer local MIN_DAMAGE = 100 -- Dano minimo local MAX_DAMAGE = 500 -- Dano maximo local level = 10 -- Level necessario local UID = 1121 -- UniqueId do item local chance = 10 if getPlayerStorageValue(cid,storage) == 1 then doPlayerSendCancel(cid,"You are exhausted.") end if getPlayerLevel(cid) < level then doPlayerSendCancel(cid,"You must be level "..level..".") end if getPlayerLevel(cid) >= level and item.uid == UID and getPlayerStorageValue(cid,storage) == -1 then setPlayerStorageValue(cid,storage,1) addEvent(setPlayerStorageValue,5000,cid,storage,-1) addEvent(doSendDistanceShoot,100,fromPosition, a4, 9) addEvent(doAreaCombatHealth,100,a0, combate, a0, 0, -MIN_DAMAGE, -MAX_DAMAGE, 2) addEvent(doAreaCombatHealth,200,a1, combate, a1, 0, -MIN_DAMAGE, -MAX_DAMAGE, 2) addEvent(doAreaCombatHealth,300,a2, combate, a2, 0, -MIN_DAMAGE, -MAX_DAMAGE, 2) addEvent(doAreaCombatHealth,400,a3, combate, a3, 0, -MIN_DAMAGE, -MAX_DAMAGE, 2) addEvent(doAreaCombatHealth,500,a4, combate, a4, 0, -MIN_DAMAGE, -MAX_DAMAGE, 2) addEvent(doCreateItem,600,1294,1,end1) if math.random(1, 100) > chance then doCreateItem(1294, end1) end addEvent(doSendMagicEffect,600,end1,44) end return TRUE end
  8. É isso que devia ser feito, usar esse filtro apenas para idiotas que usassem Caps Lock em tudo no titulo do tópico.
  9. Bugs corrigidos e broadcast adicionado. Abraços.
  10. Pronto, achei o problema, estava na função mesmo. local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_BLOCKARMOR, 1) setCombatParam(combat, COMBAT_PARAM_BLOCKSHIELD, 1) setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_FIREAREA) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_BURSTARROW) setCombatFormula(combat, COMBAT_FORMULA_SKILL, 1, 0, 1, 0) local area = createCombatArea({ {1, 1, 1}, {1, 3, 1}, {1, 1, 1} }) setCombatArea(combat, area) local function getPlayerWeaponId(cid) -- By Oneshot local ret = 0 for slot = 6, 5, -1 do local item = getPlayerSlotItem(cid, slot) if item.itemid > 0 and isInArray({1, 2, 3, 5}, getItemInfo(item.itemid).weaponType) then ret = item.itemid break end end return ret end function onUseWeapon(cid, var) if getPlayerWeaponId(cid) == 7438 then doCombat(cid, combat, var) return true end doPlayerSendCancel(cid, "You cannot use this arrow with this ordinary bow.") return false end Sobre o consumo da munição mesmo com a arma incorreta, só com alterações nas sources para ficar legal. Ou você pode colocar para adicionar o item, logo abaixo da mensagem de erro. doPlayerAddItem(cid, 2546, 1) Mas aí só ficaria legal mesmo com um autostack, senão a munição seria removida e o item pararia na mochila ou no chão por exemplo.
  11. Bom tutorial, espero que a sequência de aulas continue. Gostei da tirinha também. Mas aproveita e esculhamba o título logo: Aulas Básicas com o Senhorito iuniX. Abraços.
  12. Então, cara, tenho apenas uma mínima ideia de qual possa ser o problema. O problema pode ser qualquer função interna usada na composição da minha função getPlayerWeaponId(cid) e para resolver, eu preciso do nome correto do servidor global que você usa para ver como ele funciona e porque ele não está retornando um itemid correto.
  13. A linha que eu passei acima tem que ser retirada. Por curiosidade, que servidor você usa?
  14. No caso, você tirou a linha do ID 2432 do weapons.xml, parecida com essa? <melee id="2432" level="35" unproperly="1" event="function" value="default"/> Mas não deixe de tentar com outro tipo de item que seja bow.
  15. Isso que dá copiar um script apenas para ganhar reputação. Não sabe explicar como instalar o script com eficiência para funcionar corretamente. Do jeito que o Darkhaos fez, só é possível usar o sistema com MySQL. Abraços.
  16. Não é possível, esses tipos de atributos só podem ser configurados no items.xml,não é possível criar um item que modifique eles. Só criando um atributo falso e um script que se baseie nele, como o Aluccard fez. Mas se você usar vários itens com reflexão, a taxa acumula sim.
  17. Não agora que estou um tanto ocupado, mas se você quiser, você pode criar itens que refletem coisas pelo items.xml sem precisar de scripts secundários. Por exemplo, vou pegar a magic plate armor, de ID 2472. <item id="2472" article="a" name="magic plate armor"> <attribute key="description" value="An enchanted gem glows on the plate armor." /> <attribute key="weight" value="8500" /> <attribute key="armor" value="17" /> <attribute key="slotType" value="body" /> </item> Supondo que eu quero que ela reflita 10% de todos os tipos de dano, faço isso: <item id="2472" article="a" name="magic plate armor"> <attribute key="description" value="An enchanted gem glows on the plate armor." /> <attribute key="weight" value="8500" /> <attribute key="armor" value="17" /> <attribute key="reflectpercentall" value="10"/> <attribute key="reflectchanceall" value="100"/> <attribute key="slotType" value="body" /> </item> Assim ela terá 100% de chance de refletir 10% de todos os tipos de dano. Lembrando que só funciona se estiver registrado no movements.xml. Abraços.
  18. Bom, não tenho ideia do que seja então, aqui ele adiciona normal a quantidade de skill configurada. Creio que os freezes são normais, principalmente se você não tiver grande quantidade de RAM e um processador rápido. Tente com um personagem de teste, novo, criado do zero. Abraços.
  19. Posta para mim, o Item ID 2432 do seu items.xml.
  20. É só agora notei que seu erro tem nada a ver com o que eu fiz. No caso o servidor acusa que a função não existe. Vou tentar criar um sistema parecido sem usar mods, pois eu odeio eles. Abraços.
  21. Essa função está errada function getItemReflectPercent(itemid) return getItemAttribute(itemid, "reflectPercent") end Como ela está, ela retorna apenas atributos únicos de itens, e caso eles não existam, retorna nil. Fiz algumas modificações nela e no script: function getItemReflectPercent(item) local reflectPercent = getItemAttribute(item.uid) or getItemInfo(item.itemid).reflectPercent return reflectPercent or 0 end <?xml version="1.0" encoding="UTF-8"?> <mod name="Reflect System" version="0.1" author="Aluccard" contact="" enabled="yes"> <description> Script que funciona para refletir danos para as creatures que o atacar. </description> <event type="login" name="regReflectDamage" event="script"><![CDATA[ function onLogin(cid) registerCreatureEvent(cid,"ReflectDamage") return true end ]]></event> <event type="statschange" name="ReflectDamage" event="script"><![CDATA[ local slotPos = {CONST_SLOT_NECKLACE, CONST_SLOT_FEET, CONST_SLOT_HEAD} function onStatsChange(cid, attacker, type, combat, value) local reflectPercent = 0 local dmg = value local playerPos = getCreaturePosition(cid) local attackerPos = getCreaturePosition(attacker) for i = 1, #slotPos do if getPlayerSlotItem(cid, slotPos[i]).uid > 1 then if getItemReflectPercent(getPlayerSlotItem(cid, slotPos[i])) then reflectPercent = reflectPercent + getItemReflectPercent(getPlayerSlotItem(cid, slotPos[i])) end end end if reflectPercent > 0 then dmg = math.ceil(-value*((100-reflectPercent)/100)) if (dmg < 0) then doCreatureAddHealth(cid, dmg) doSendAnimatedText(playerPos, -dmg, COLOR_RED) doSendMagicEffect(playerPos, 0) else doSendMagicEffect(playerPos, 3) end dmg = math.ceil(-value*(reflectPercent/100)) if (dmg < 0) then doCreatureAddHealth(attacker, dmg) doSendAnimatedText(attackerPos, -dmg, COLOR_RED) doSendDistanceShoot(playerPos, attackerPos, CONST_ANI_SMALLHOLY) end else return true end end]]></event> </mod> Não estou certo se irá funcionar. Abraços.
  22. Nessa linha: doPlayerAddSkill(cid, config.skillName, config.skillAmount, true) Troque o true por false. Abraços.
  • Quem Está Navegando   0 membros estão online

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