-
Total de itens
1347 -
Registro em
-
Última visita
-
Dias Ganhos
36
Tudo que Oneshot postou
-
pedido function onCombat , me ajuda a fazer isso aqui?
pergunta respondeu ao tonynamoral de Oneshot em Scripts
Faz direto no script da wand. -
Coloque o script com o nome sellall.lua em data/talkactions/scripts. E no talkactions.xml, adicione a linha abaixo: <talkaction words="!sellall" event="script" value="sellall.lua"/>
-
dúvida [Encerrado] É possível adicionar mais de um actionID no mesmo TILE?
tópico respondeu ao juliok80 de Oneshot em Tópicos Sem Resposta
Não. Você pode fazer um StepIn e um StepOut com o mesmo actionid, colocar um actionid e um uniqueid em um tile, mas infelizmente não pode colocar 2 actionids em algo. -
Você tem que editar o weapon.cpp com um IDE de sua preferência, como o Dev-Cpp ou Code::Blocks.
-
Meu rapaz, o arquivo 101-compat não influencia praticamente em nada, ele apenas serve como um arquivo de compatibilidade, para que aqueles que ainda usam nomes e parâmetros antigos de funções, possam programar seus scripts sem dar erros. O erro é seu, por querer criar um servidor Frankenstein, com executável de um e libs de outro. Abraços.
-
Não adianta só mudar o distro e esperar milagres. Cada distro tem várias diferenças de compatibilidade entre si. Você teria que arrumar todos e quaisquer bugs de funções que já não existem e etcétera. Se por o acaso você fez um downgrade do 0.4 para o 0.3.6pl1 ou 0.3.7, fique sabendo que no 0.4, os intervalos dos globalevents são em milissegundos e no 0.3.6+, os intervalos são em segundos. Ou seja, o que antes era 900000 no 0.4, passa a ser 900 apenas no 0.3.6pl1. Abraços.
-
local sellTable = { [2498] = 40000, [2475] = 6000, [2497] = 9000, [2491] = 5000, [2462] = 4000, [2663] = 500, [2458] = 35, [2459] = 30, [2645] = 400000, [2195] = 40000, [2646] = 100000, [2472] = 100000, [2492] = 60000, [2494] = 90000, [2466] = 30000, [2487] = 20000, [2476] = 5000, [2656] = 15000, [2500] = 2500, [2463] = 400, [2465] = 200, [2464] = 100, [2470] = 80000, [2488] = 15000, [2477] = 6000, [2647] = 500, [2487] = 100, [2514] = 80000, [2520] = 40000, [2523] = 150000, [2522] = 100000, [2534] = 25000, [2536] = 8000, [2537] = 4000, [2519] = 5000, [2528] = 4000, [2515] = 200, [2518] = 1500, [2525] = 100, [2390] = 150000, [2408] = 100000, [2400] = 90000, [2393] = 10000, [2407] = 6000, [2396] = 4000, [2392] = 3000, [2409] = 1500, [2383] = 800, [2377] = 400, [2413] = 70, [2406] = 30, [2376] = 25, [2414] = 10000, [2431] = 90000, [2427] = 7500, [2432] = 10000, [2430] = 2000, [2387] = 200, [2381] = 200, [2378] = 100, [2388] = 20, [2391] = 6000, [2421] = 90000, [2436] = 1000, [2434] = 2000, [2423] = 200, [2417] = 60, [2398] = 30, } function on_search_container(cid, uid) local size = getContainerCap(uid) for slot = (size - 1), 0, -1 do local item = getContainerItem(uid, slot) if item.uid > 0 then if sellTable[item.itemid] then doPlayerAddMoney(cid, sellTable[item.itemid]) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Sold ".. getItemNameById(item.itemid) .." for ".. sellTable[item.itemid] .." gold.") doRemoveItem(item.uid, 1) elseif isContainer(item.uid) then on_search_container(cid, item.uid) end end end end function onSay(cid, words, param, channel) on_search_container(cid, getPlayerSlotItem(cid, CONST_SLOT_BACKPACK).uid) return true end Toma aí.
-
Qual é a coisa mais importante em um código? E por que é a elegância?
tópico respondeu ao Skyen de Oneshot em Lixeira Pública
Nossa, na boa, Raposa. Que tutorial foda, meu velho. Acho que as duas únicas coisas que ainda não sigo do modo Raposa de programar Lua, é o modo em como declaro nomes de funções e variáveis e o espaçamento que, não consigo evitar, dou entre variáveis em uma tabela. Realmente, fica melhor assim? {x=100, y=100, z=7} O IPB tem um bug sério quanto identação, TAB não é reconhecido aqui, apenas espaços, e por isso quando você cola seus códigos aqui, eles acabam ficando sem identação. Eu uso Notepad++ para programar, e depois de terminar um código, uso a opção TAB para Espaço dele, é bem útil pois contorna o "bug" do fórum -
dúvida Como passar um servidor tfs 3.6.0 para tfs 4.0?
pergunta respondeu ao WireLessLG de Oneshot em Resolvidos
Não, não há um modo fácil de fazer essa troca de versão do distro. Exige bastante trabalho, pois você tem que reparar vários scripts, trocar libs, items.otb e etcétera. Como o tópico está a mais de 7 dias inativo, estou trancando. Abraços. -
Ah, puts. Acho que a falha foi minha em esquecer de avisar que o modo acima era para cinco itens diferentes num mesmo tile. Haha. Movido. Abraços.
-
Não. O tutorial é apenas pra quem quer colocar o onMove no servidor, siga apenas as últimas explicações passadas no tópico.
-
Não é flood, ele está falando uma coisa séria, até. Bom, cara, não importa a versão. Você está fazendo algo errado aí, pois testei na rev3884 e funcionou muito bem. Delete a pasta obj/ antes de compilar algo novo. Abraços.
-
pedido Script de Teleport quando o monstro na area "x" a "y" estiver mortos.
pergunta respondeu ao markim1986 de Oneshot em Scripts
Eu testei aqui, está funcionando normal, copie o script corretamente do post acima. -
Como eu acho que a função getSpectators é um pouco complicadinha de mexer, pois precisa de vários parâmetros, digamos, complicados, fiz ela um pouco mais versátil, precisando apenas da posição superior-esquerda e da posição inferior-direita. function getSpectatorsFromArea(fromPosition, toPosition, multifloor) local lenght = ((math.max(fromPosition.x, toPosition.x) - math.min(fromPosition.x, toPosition.x)) * 0.5) + 1 local width = ((math.max(fromPosition.y, toPosition.y) - math.min(fromPosition.y, toPosition.y)) * 0.5) + 1 if multifloor == true then local ret = {} for f = math.min(fromPosition.z, toPosition.z), math.max(fromPosition.z, toPosition.z) do local tmp = getSpectators({x = math.min(fromPosition.x, toPosition.x) + lenght, y = math.min(fromPosition.y, toPosition.y) + width, z = f}, lenght, width, false) for k = 1, #tmp do table.insert(ret, tmp[k]) end end return ret end return getSpectators({x = math.min(fromPosition.x, toPosition.x) + lenght, y = math.min(fromPosition.y, toPosition.y) + width, z = fromPosition.z}, lenght, width, false) end Caso você use a opção multifloor, a função retorna uma tabela com todos os spectators do intervalo dos floors das posições. getSpectators({x = 100, y = 100, z = 7}, {x = 200, y = 200, z = 11}, true) No caso acima retornaria todos os spectators do floor 7 ao floor 11 Abraços.
-
E agora ficará assim. Nada te impede de fazer um novo pedido lá na área de Pedidos e Dúvidas. Abraços.
-
pedido Script de Teleport quando o monstro na area "x" a "y" estiver mortos.
pergunta respondeu ao markim1986 de Oneshot em Scripts
local areas = { [1] = { fromPosition = {x = 93, y = 125, z = 7}, -- upper-left sqm toPosition = {x = 95, y = 127, z = 7}, -- lower-right sqm creatureName = {"Rat", "Cave Rat"} } } function onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor) local pass = true for _, area in ipairs(areas) do local x = {min = math.min(area.fromPosition.x, area.toPosition.x), max = math.max(area.fromPosition.x, area.toPosition.x)} local y = {min = math.min(area.fromPosition.y, area.toPosition.y), max = math.max(area.fromPosition.y, area.toPosition.y)} local width = ((x.max - x.min) / 2) + 1 local lenght = ((y.max - y.min) / 2) + 1 local center = {x = x.min + width, y = y.min + lenght, z = area.fromPosition.z} local specs = getSpectators(center, width, lenght, false) if specs then for _, cn in ipairs(specs) do if (type(area.creatureName) == "table" and isInArray(area.creatureName, getCreatureName(cn))) or getCreatureName(cn):lower() == area.creatureName:lower() then pass = false break end end end end if pass == false then doPlayerSendCancel(cid, "Sorry, you need to kill all the monsters in the area to pass.") doTeleportThing(cid, fromPosition, true) end return true end -
pedido Script de Teleport quando o monstro na area "x" a "y" estiver mortos.
pergunta respondeu ao markim1986 de Oneshot em Scripts
local areas = { [1] = { fromPosition = {x = 100, y = 100, z = 7} -- upper-left sqm toPosition = {x = 100, y = 100, z = 7} -- lower-right sqm creatureName = {"Rat", "Cave Rat"} } } function onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor) local pass = true for _, area in ipairs(areas) do local x = {} x.min = math.min(area.fromPosition.x, area.toPosition.x) x.max = math.max(area.fromPosition.x, area.toPosition.x) local y = {} y.min = math.min(area.fromPosition.y, area.toPosition.y) y.max = math.max(area.fromPosition.y, area.toPosition.y) local width = ((x.max - x.min) / 2) + 1 local lenght = ((y.max - y.min) / 2) + 1 local center = {x = x.min + width, y = y.min + lenght, z = area.fromPosition.z} for _, creature in ipairs(getSpectators(center, width, lenght, false)) do if (type(area.creatureName) == "table" and isInArray(area.creatureName, getCreatureName(creature):lower())) or getCreatureName(creature):lower == area:creatureName:lower() then pass = false break end end end if pass == false then doPlayerSendCancel(cid, "Sorry, you need to kill all the monsters in the area to pass.") doTeleportThing(cid, fromPosition, true) return false end return true end -
No caso, acho que fica subentendido isso, né...
-
Obrigado, valeu aê.
-
pedido Script de Teleport quando o monstro na area "x" a "y" estiver mortos.
pergunta respondeu ao markim1986 de Oneshot em Scripts
Esqueci de colocar return false local areas = { [1] = { fromPosition = {x = 93, y = 125, z = 7}, -- upper-left sqm toPosition = {x = 95, y = 127, z = 7}, -- lower-right sqm creatureName = "Rat" } } function onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor) local pass = true for _, area in ipairs(areas) do local x = {min = math.min(area.fromPosition.x, area.toPosition.x), max = math.max(area.fromPosition.x, area.toPosition.x)} local y = {min = math.min(area.fromPosition.y, area.toPosition.y), max = math.max(area.fromPosition.y, area.toPosition.y)} local width = ((x.max - x.min) / 2) + 1 local lenght = ((y.max - y.min) / 2) + 1 local center = {x = x.min + width, y = y.min + lenght, z = area.fromPosition.z} local specs = getSpectators(center, width, lenght, false) if specs then for _, cn in ipairs(specs) do if getCreatureName(cn):lower() == area.creatureName:lower() then pass = false break end end end end if pass == false then doPlayerSendCancel(cid, "Sorry, you need to kill all the monsters in the area to pass.") doTeleportThing(cid, fromPosition, true) return false end return true end -
Arquivo game.cpp, procure pela linha bool Game::playerMoveItem(uint32_t playerId, const Position& fromPos, uint16_t spriteId, int16_t fromStackpos, const Position& toPos, uint8_t count) Dentro da função, procure por: Cylinder* toCylinder = internalGetCylinder(player, toPos); Adicione logo abaixo: if(toCylinder->getTile()->getItemCount() > 5) { player->sendCancelMessage(RET_NOTPOSSIBLE); return false; } Abraços.
-
Cara, é bastante simples. Só procurar pelas funções que geram o dano da arma e adicionar um bônus pelo nível de Fist Fighting do jogador, por exemplo: int32_t WeaponMelee::getWeaponDamage(const Player* player, const Creature* target, const Item* item, bool maxDamage /*= false*/) const { int32_t attackSkill = player->getWeaponSkill(item); int32_t attackValue = std::max((int32_t)0, (int32_t(item->getAttack() + item->getExtraAttack()) - elementDamage)); float attackFactor = player->getAttackFactor(); double maxValue = Weapons::getMaxWeaponDamage(player->getLevel(), attackSkill, attackValue, attackFactor); if(random_range(1, 100) <= g_config.getNumber(ConfigManager::CRITICAL_HIT_CHANCE)) { maxValue = std::pow(maxValue, g_config.getDouble(ConfigManager::CRITICAL_HIT_MUL)); player->sendCritical(); } Vocation* vocation = player->getVocation(); if(vocation && vocation->getMultiplier(MULTIPLIER_MELEE) != 1.0) maxValue *= vocation->getMultiplier(MULTIPLIER_MELEE); int32_t ret = (int32_t)std::floor(maxValue); if(maxDamage) return -ret; return -random_range(0, ret, DISTRO_NORMAL); } Essa função acima é responsável por definir o dano aleatório das armas corpo-a-corpo, basta então adicionar um cálculo extra no retorno da função: return -(ret + player->getSkill(SKILL_FIST, SKILL_LEVEL) * 20); return -(random_range(0, ret, DISTRO_NORMAL) + player->getSkill(SKILL_FIST, SKILL_LEVEL) * 20; No caso acima, adicionaria 20 (vinte) a mais de dano por nível da skill Fist Fighting na função de dano corpo-a-corpo.
-
Eu até pensei no creaturescript onStatsChange, mas é totalmente inviável, pois você precisaria registrar em todos os monstros do servidor. Ou seja, só editando as fórmulas de dano. Abraços.
-
pedido Script de Teleport quando o monstro na area "x" a "y" estiver mortos.
pergunta respondeu ao markim1986 de Oneshot em Scripts
local areas = { [1] = { fromPosition = {x = 93, y = 125, z = 7}, -- upper-left sqm toPosition = {x = 95, y = 127, z = 7}, -- lower-right sqm creatureName = "Rat" } } function onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor) local pass = true for _, area in ipairs(areas) do local x = {min = math.min(area.fromPosition.x, area.toPosition.x), max = math.max(area.fromPosition.x, area.toPosition.x)} local y = {min = math.min(area.fromPosition.y, area.toPosition.y), max = math.max(area.fromPosition.y, area.toPosition.y)} local width = ((x.max - x.min) / 2) + 1 local lenght = ((y.max - y.min) / 2) + 1 local center = {x = x.min + width, y = y.min + lenght, z = area.fromPosition.z} local specs = getSpectators(center, width, lenght, false) if specs then for _, cn in ipairs(specs) do if getCreatureName(cn):lower() == area.creatureName:lower() then pass = false break end end end end if pass == false then doPlayerSendCancel(cid, "Sorry, you need to kill all the monsters in the area to pass.") doTeleportThing(cid, fromPosition, true) end return true end É um movement, no caso, estou considerando que o teleport já existe com um actionid no mapa. <movevent type="StepIn" actionid="20000" event="script" value="nome_do_arquivo.lua"/> Abraços.
-
Quem Está Navegando 0 membros estão online
- Nenhum usuário registrado visualizando esta página.