Tudo que DukeeH postou
-
HELP AJUDA SCRIPT!!!
Se o problema está quando compra a promotion do npc já tendo a promotion, precisamos do script do npc.
-
[Tutorial] Push de longe sem exausted
Da mesma forma, vai ter que editar as sources e recompilar.
- Critical Skill System
-
Adicionando vida maxima por script de Movements
@Zazeros Cara, acho que seria algo assim: local magia = "DOOM" -- nome da magia local bonushp = 500 function onEquip(cid, item, slot) setCreatureMaxHealth(cid, (getCreatureMaxHealth(cid)+bonushp) return doPlayerLearnInstantSpell(cid, magia) end function onDeEquip(cid, item, slot) if getPlayerLearnedInstantSpell(cid, magia) then doPlayerUnlearnInstantSpell(cid, magia) end setCreatureMaxHealth(cid, (getCreatureMaxHealth(cid)-bonushp)) return TRUE end to bem enferrujado, mas qualquer coisa me avisa. #edit, arrumei um negócio
-
Safe Mod
Na ultima pagina tem 2 links da otland pra deixar como você quer. Só precisa colocar as funções na source e usar o script de la.
-
Safe Mod
Cara, teria que ser alguém que intende de otclient, eu nunca nem usei nem fiz nada para otclient. Então não vou conseguir ajudar, o script deve ter que ser feito tanto no ot quanto no otclient. Abraço Edit. Da uma olhada nas ultimas respostas.
-
Safe Mod
É qual versão e distro? Acho que o servidor não recebe qual opção de maozinha o jogador escolheu para poder efetuar o script baseado nisso. Vou procurar sobre, mas nunca vi, acho que isso é do cliente, que apenas libera/cancela o ataque a quem não tiver skull.
-
(AJUDA)RANK POR TOWN
@bibioliveira Podia ficar um pouco melhor, tipo "!rank 4, sword" mas estou meio sem tempo. Fiz um comando novo, ai você coloca algo como preferir (!rank2, !ranktown4...) Cria um novo comando no talkactions.xml e cria o arquivo em scripts e coloca isso: function getPlayerNameByGUID2(n) local c = db.getResult("SELECT `name` FROM `players` WHERE `id` = "..n..";") if c:getID() == -1 then return "SQL_ERROR["..n.."]" end return c:getDataString("name") end function onSay(cid, words, param) local max = 100 local letters_to_next = 20 local skills = { ['fist'] = 0, ['club'] = 1, ['sword'] = 2, ['axe'] = 3, ['distance'] = 4, ['shielding'] = 5, ['fishing'] = 6, ['dist'] = 4, ['shield'] = 5, ['fish'] = 6, } local name_now local name = "Highscore for level\n" local rkn = 0 local no_break = 0 param = string.lower(param) dofile('config.lua') if param == "" or param == "level" and ( param ~= "magic" and param == "ml") and skills[param] == nil then name = name.."\n" name = name.."Rank Level - Nome do Jogador\n" local v = db.getResult("SELECT `name`, `level`, `experience` FROM `players` WHERE `group_id` <= 2 AND `town_id` = 4 ORDER BY `experience` DESC LIMIT 0,"..(max)..";") repeat no_break = no_break +1 if v:getID() == -1 then break end rkn = rkn+1 name_now, l = v:getDataString("name"), string.len(v:getDataString("name")) space = "" for i=1, letters_to_next-l do space = space.." " end name = name..rkn..". "..v:getDataInt("level") .." - "..name_now..space.." ".."\n" if no_break >= 20 then break end until v:next() == false elseif param == "magic" or param == "ml" then name = name.."\n" name = name.."Rank Magic - Nome do Jogador\n" local v = db.getResult("SELECT `name`, `level`, `maglevel` FROM `players` WHERE `group_id` <= 2 AND `town_id` = 4 ORDER BY `maglevel` DESC LIMIT 0,"..(max)..";") repeat if v:getID() == -1 then break end rkn = rkn+1 name_now, l = v:getDataString("name"), string.len(v:getDataString("name")) space = "" for i=1, letters_to_next-l do space = space.." " end name = name..rkn..". "..v:getDataInt("maglevel").." - "..name_now..space.." ".." ".."".."\n" until v:next() == false elseif param == "mana" or param == "MANA" then name = name.."\n" name = name.."Rank Mana - Nome do Jogador\n" local v = db.getResult("SELECT `name`, `level`, `manamax` FROM `players` WHERE `group_id` <= 2 AND `town_id` = 4 ORDER BY `manamax` DESC LIMIT 0,"..(max)..";") repeat if v:getID() == -1 then break end rkn = rkn+1 name_now, l = v:getDataString("name"), string.len(v:getDataString("name")) space = "" for i=1, letters_to_next-l do space = space.." " end name = name..rkn..". "..v:getDataInt("manamax").." - "..name_now..space.." ".." ".."".."\n" until v:next() == false elseif param == "health" or param == "hp" then name = name.."\n" name = name.."Rank Health - Nome do Jogador\n" local v = db.getResult("SELECT `name`, `level`, `healthmax` FROM `players` WHERE `group_id` <= 2 AND `town_id` = 4 ORDER BY `healthmax` DESC LIMIT 0,"..(max)..";") repeat if v:getID() == -1 then break end rkn = rkn+1 name_now, l = v:getDataString("name"), string.len(v:getDataString("name")) space = "" for i=1, letters_to_next-l do space = space.." " end name = name..rkn..". "..v:getDataInt("healthmax").." - "..name_now..space.." ".." ".."".."\n" until v:next() == false elseif param == "resets" then name = name.."Rank Resets - Nome do Jogador\n" local v = db.getResult("SELECT `player_id`, `value` FROM `player_storage` WHERE `key` = 1020 AND `player_id` IN (SELECT `id` FROM `players` WHERE `town_id` = 4) ORDER BY `value` DESC LIMIT 0,"..(max)..";") local kk = 0 repeat if kk == max or v:getID() == -1 then break end kk = kk+1 name_now, l = getPlayerNameByGUID2(v:getDataInt("player_id")), string.len(getPlayerNameByGUID2(v:getDataInt("player_id"))) space = "" for i=1, letters_to_next-l do space = space.." " end if name_now == nil then name_now = 'sql error['..v:getDataInt("player_id")..']' end name = name..kk..". "..v:getDataInt("value").." - "..name_now..space.." ".." ".."".."\n" until v:next() == false elseif skills[param] ~= nil then name = name.."\n" name = name.."Rank "..param.." fighting - Nome do Jogador\n" local v = db.getResult("SELECT `player_id`, `value` FROM `player_skills` WHERE `skillid` = "..skills[param].." AND `player_id` IN (SELECT `id` FROM `players` WHERE `town_id` = 4) ORDER BY `value` DESC;" local kk = 0 repeat if kk == max or v:getID() == -1 then break end kk = kk+1 name_now, l = getPlayerNameByGUID2(v:getDataInt("player_id")), string.len(getPlayerNameByGUID2(v:getDataInt("player_id"))) space = "" for i=1, letters_to_next-l do space = space.." " end if name_now == nil then name_now = 'sql error['..v:getDataInt("player_id")..']' end name = name..kk..". "..v:getDataInt("value").." - "..name_now..space.." \n" until v:next() == false end if name ~= "Highscore\n" then doShowTextDialog(cid, 6500, name) end return true end
-
(AJUDA)RANK POR TOWN
Mande seu !rank ou fale qual servidor você usa. É dificil adivinhar qual versão e distro para fazer o script.
-
MUDAR O TFS
Tenta seguir esse ai e só tirar a parte do console.
-
MUDAR O TFS
Na hora de compilar, em vez de console tem que colocar como GUI. Lembro que no 0.3.6 eu usava o Dev cpp do Stian, ai chegava uma hora que tinha que por "-D__CONSOLE__" Caso não colocasse ele sairia como GUI em vez de console. Não lembro se tem que alterar em mais algum lugar, mas é na hora de compilar mesmo, não precisa nenhuma alteração nas sources nem nada.
-
Erro Weapon
É sem duvidas a melhor forma, lua (pelo menos em versões antigas) e meio enjambrado pra alterar danos. Não consegui compilar pra ti porque estou no trabalho e não roda o Visual Studio. Abraço.
-
Erro Weapon
Brother, você sabe compilar? Abre combat.cpp nas sources, procura por CombatHealthFunc. Essa função e a de baixo (CombatManaFunc) Troca as duas por isso: bool Combat::CombatHealthFunc(Creature* caster, Creature* target, const CombatParams& params, void* data) { int32_t change = 0; if(Combat2Var* var = (Combat2Var*)data) { change = var->change; if(!change) change = random_range(var->minChange, var->maxChange, DISTRO_NORMAL); } if(g_game.combatBlockHit(params.combatType, caster, target, change, params.blockedByShield, params.blockedByArmor)) return false; if(change < 0 && caster && caster->getPlayer() && target->getPlayer() && target->getPlayer()->getSkull() == SKULL_BLACK) change = change*2; if(change < 0 && caster && caster->getPlayer() && target->getPlayer() && target->getPlayer()->getSkull() != SKULL_BLACK) change = change; if(!g_game.combatChangeHealth(params.combatType, caster, target, change, params.effects.hit, params.effects.color)) return false; CombatConditionFunc(caster, target, params, NULL); CombatDispelFunc(caster, target, params, NULL); return true; } bool Combat::CombatManaFunc(Creature* caster, Creature* target, const CombatParams& params, void* data) { int32_t change = 0; if(Combat2Var* var = (Combat2Var*)data) { change = var->change; if(!change) change = random_range(var->minChange, var->maxChange, DISTRO_NORMAL); } if(change < 0 && caster && caster->getPlayer() && target->getPlayer() && target->getPlayer()->getSkull() == SKULL_BLACK) change = change*2; if(change < 0 && caster && caster->getPlayer() && target->getPlayer() && target->getPlayer()->getSkull() != SKULL_BLACK) change = change; if(!g_game.combatChangeMana(caster, target, change)) return false; CombatConditionFunc(caster, target, params, NULL); CombatDispelFunc(caster, target, params, NULL); return true; } Ai compila e testa sem o creaturescript, por ser uma versão das mais antigas, acho melhor manipular os danos por sources mesmo, ai acho que o *2 seria o valor correto (dobro).
-
Erro Weapon
O problema do "um pouquinho menos" é porque nas versões mais velhas, essa função onStatsChange tem um problema: Você hita 200 do player, (descontando defesas) Essa função entra, pega o 200, multiplica por 2. Esse valor (400) passa de novo pela defesa. Estranho você colocar 0.9 e ele bater mais, isso ai era pra reduzir o dano em 10%. Quanto mais ali mais dano vai dar, vai tentando adequar a como ficar melhor. Pesado eu não diria, porque lua é bem leve. Mas pelas questões que falei a cima o melhor mesmo seria nas sources, ainda não tirar um tempo pra procurar. Mas em algum lugar das sources ele declara que os danos em player (seja magia ou ataque) são divididos pela metade dos causados em monstros. Se retirar isso ficaria igual e de forma mais limpa que em lua.
-
script critical bug
@JcA Faltou essa parte do topico que mandou. em creaturescripts\scripts\login.lua adicione isso antes do ultimo return true: if getPlayerStorageValue(cid, 48903) == -1 then setPlayerStorageValue(cid, 48903, 0) end Explicação: Os storages começam em -1, então a primeira pedra está levando pro 0. Colocando aquilo que mandei no login.lua, se o cara entrar e o storage do critical for -1, ele vai colocar 0. Assim a proxima pedra vai pro 1.
-
Erro Weapon
Testa algo assim: local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_BLOCKARMOR, 1) setCombatParam(combat, COMBAT_PARAM_BLOCKSHIELD, 1) setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) function onGetFormulaValues(cid, weapon, sword, level) min = -(((weapon*2.0) + (((sword/5)*16.0)) + (level*6.0))) max = -(((weapon*2.0) + (((sword/5)*16.0)) + (level*6.0))) local dobromin = min local dobromax = max return min, max end setCombatCallback(combat, CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues") function onTargetCreature(cid, target) if(isPlayer(target)) then doTargetCombatHealth(cid, target, COMBAT_PHYSICALDAMAGE, dobromin, dobromax, CONST_ME_NONE) end return true end function onUseWeapon(cid, var) return doCombat(cid, combat, var) end Ele vê se o alvo é player e dobra o dano, mas se quiser em todas as armas e tal, o melhor seria sources. Vou procurar sobre. Edit. Outra idéia seria fazer um creaturescript pra cada dano que um jogador recebe, se for de outro jogador, multiplicar por 2. Funcionaria para ataque e magia e não precisaria editar tudo. creaturescripts/creaturescripts.xml <event type="statschange" name="danoplayers" event="script" value="danoplayers.lua"/> creaturescripts/scripts/danoplayers.lua function onStatsChange(cid, attacker, type, combat, value) if isPlayer(attacker) and isPlayer(cid) and type == STATSCHANGE_HEALTHLOSS or type == STATSCHANGE_MANALOSS then doTargetCombatHealth(attacker, cid, combat, -value*2, -value*2, 255) end return true end creaturescripts/scripts/login.lua registerCreatureEvent(cid, "danoplayers")
-
Erro Weapon
Normal, qualquer magia/arma bate menos em jogadores, mesmo sem itens. Em todos os servidores/distros... Provavelmente isso consta nas sources, mas não sei exatamente onde, posso procurar.
-
(Resolvido)Correção em um script action
manda o erro completo.
-
(Resolvido)Seria possível criar um sistema de "redeem code" via talkaction ?
Perfeito, só uma dica é adicionar a linha: math.randomseed(os.time()) Em cima dessa linha que está usando o math.random, porque o "random" de um computador, não é aleatório, sempre que reiniciar o server ele vai gerar a mesma ordem, assim vai ficar aleatório porque ele vai usar a hora atual como base no random. Testa o redeem e me fala se deu tudo certo.
-
(Resolvido)Correção em um script action
Só registrar o item em actions.lua usando o id dele, não precisa alterar nada no script. @Sekk Acho que o problema ocorreu porque você usou uma variável com o nome de item quando já tem essa variavel vindo na função onUse, também não é necessário declarar o item porque ele já vai estar declarado nas actions. local s = 19000 local pos = getPlayerPosition(cid) function onUse(cid, item, itemEx, toPosition, fromPosition) if getPlayerStorageValue(cid, s) <= 0 then setPlayerStorageValue(cid, s, 1) doPlayerSendTextMessage(cid, 22, "Parabéns! Você ganhou um novo outfit.") doSendMagicEffect(pos, CONST_ME_FIREWORK_BLUE) doRemoveItem(cid, item.uid, 1) if getPlayerSex(cid) == 0 then doPlayerAddOutfit(cid, 264, 1) else doPlayerAddOutfit(cid, 255, 1) end else doPlayerSendCancel(cid, "Você já tem esse outfit.") end return true end
-
(Resolvido)Seria possível criar um sistema de "redeem code" via talkaction ?
function onSay(cid, words, param, channel) local paramm = string.upper(param) if (param == '') then doPlayerSendCancel(cid, "Você deve adicionar um code.") doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF) else local resultado = db.getResult("SELECT * FROM redeemcodes WHERE `code` = '" .. paramm .. "';") if(resultado:getID() ~= -1) then doPlayerSendTextMessage(cid,MESSAGE_STATUS_WARNING, "Você resgatou com sucesso o código: " .. paramm ..".") doPlayerAddItem(cid, ID, QUANTIDADE) db.query("DELETE FROM `redeemcodes` WHERE `code` = '" .. paramm .. "';") else doPlayerSendCancel(cid, "Código invalido.") doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF) end end end Mesma coisa do outro... Agora vai.
-
(Resolvido)Seria possível criar um sistema de "redeem code" via talkaction ?
Arrumado acho, me perco nas aspas. function onSay(cid, words, param, channel) local paramm = string.upper(param) if (param == '') then doPlayerSendCancel(cid, "Você deve preencher o code para ser adicionado.") doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF) else db.executeQuery("INSERT INTO `redeemcodes` (`id`, `code`) VALUES (NULL, '" .. paramm .. "');") doPlayerSendTextMessage(cid,MESSAGE_STATUS_WARNING, "Você adicionou o código: " .. paramm .." para ser validado.") end end
-
(Resolvido)Seria possível criar um sistema de "redeem code" via talkaction ?
sorry. (: function onSay(cid, words, param, channel) local paramm = string.upper(param) if (param == '') then doPlayerSendCancel(cid, "Você deve adicionar um code.") doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF) else local resultado = db.getResult("SELECT * FROM redeemcodes WHERE `code` = " .. paramm .. ";") if(resultado:getID() ~= -1) then doPlayerSendTextMessage(cid,MESSAGE_STATUS_WARNING, "Você resgatou com sucesso o código: " .. paramm ..".") doPlayerAddItem(cid, ID, QUANTIDADE) db.query("DELETE FROM `redeemcodes` WHERE `code` = " .. paramm .. ";") else doPlayerSendCancel(cid, "Código invalido.") doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF) end end end function onSay(cid, words, param, channel) local paramm = string.upper(param) if (param == '') then doPlayerSendCancel(cid, "Você deve preencher o code para ser adicionado.") doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF) else db.executeQuery("INSERT INTO `redeemcodes` (`id`, `code`) VALUES (NULL, " .. paramm .. ");") doPlayerSendTextMessage(cid,MESSAGE_STATUS_WARNING, "Você adicionou o código: " .. paramm .." para ser validado.") end end
-
(Resolvido)Seria possível criar um sistema de "redeem code" via talkaction ?
function onSay(cid, words, param, channel) local paramm = string.upper(param) if (param == '') then doPlayerSendCancel(cid, "Você deve adicionar um code.") doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF) else local resultado = db.getResult("SELECT * FROM redeemcodes WHERE `code` = " .. paramm .. ";") if(result_plr:getID() ~= -1) then doPlayerSendTextMessage(cid,MESSAGE_STATUS_WARNING, "Você resgatou com sucesso o código: " .. paramm ..".") doPlayerAddItem(cid, ID, QUANTIDADE) db.query("DELETE FROM `redeemcodes` WHERE `code` = " .. paramm .. ";") else doPlayerSendCancel(cid, "Código invalido.") doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF) end end end Só editar ali em ID e QUANTIDADE. Se quiser mais itens, copia a linha e cola embaixo e coloque mais coisas.
-
(Resolvido)Seria possível criar um sistema de "redeem code" via talkaction ?
Isso, aquele código do mysql vai criar a aba reedemcode com as colunas id e code. O erro foi porque você não editou o script, eu coloquei o seguinte: " .... O que você quiser adicionar ao jogador." Ali tem que colocar o que você quer que o cara ganhe, se quiser me falar eu edito pra você. Pode ser premium points, item, dinheiro, level...