-
Total de itens
338 -
Registro em
-
Última visita
Posts postados por Nostradamus
-
-
A pedido de lucasbro, desenvolvi um sistema de casamento que consiste no seguinte:
Ao casar, você recebe um anel que possui uma mensagem única no mesmo, e fica então oficialmente casado.
Ao divorciar, você perde o anel e poderá então casar novamente.
Essas funções devem ser usadas em NPCs por usarem a função selfSay. Então vamos lá as funções:
STORAGE_MARY_SYSTEM = 2225 function Mary(cid, name) if getPlayerSex(cid) == 0 then partner = 'him' else partner = 'her' end if getPlayerStorageValue(cid,STORAGE_MARY_SYSTEM) == 1 then -- CASADO selfSay('Sorry ' .. getPlayerName(cid) .. ', but you are already married.') else -- SOLTEIRO setPlayerStorageValue(cid,STORAGE_MARY_SYSTEM,1) ring = doPlayerAddItem(cid,2121,1) doSetSpecialDescription(ring,'This ring sybomlizes the pure and true love with ' .. getPlayerName(cid) .. ' and ' .. name .. '.') selfSay('So i declare you and ' .. name .. ' husband and wife! You can kiss ' .. partner .. '.') end end function Divorce(cid) if getPlayerSex(cid) = 0 then partner = 'wife' else partner = 'husband' end if getPlayerStorageValue(cid,STORAGE_MARY_SYSTEM) == 1 then setPlayerStorageValue(cid,STORAGE_MARY_SYSTEM) == 0 doPlayerRemoveItem(cid,2121,1) selfSay('Too bad, you and your ' .. partner .. ' wants to divorce? Ok, and good look in your life.') end else selfSay('You are not married to get divorce!') end end
Espero que gostem
-
Recebi uma mensagem pessoal do usuário Tonin que seria mais ou menos assim:
@NostradamusSei que você e 1 cara meio ocupado e uma sugestao sou 1 apreciador do seu trabalho, e isso era algo que eu queria em 1 ot se achar nobice desconsidere,
por exemploo 1 ot que se vc tem 1 frag vc nao fala com1 npc ou red nao viaja de barco , tipo 1 sistema de honra tem em alguns jogos e eu acho legal... acho que e so add a funçaoo pra chega os frags nos npcs ne?
brigadao xd
Como eu estava sem idéias, resolvi atender o pedido dele.
Antes de mais nada quero avisar, que o script não foi testado.
Vamos as funções:
function setHonor(cid, value) local storage = 999 local stor_value = getPlayerStorageValue(cid,storage) if value < 0 then if value >= stor_value then doPlayerSendTextMessage(cid,22,'Your cannot set the values that can turn the honor negative values.') else setPlayerStorageValue(cid,storage,stor_value + (value)) doPlayerSendTextMessage(cid,22,'Your honor was decreased by ' .. result .. '.') end elseif value >= 1 then setPlayerStorageValue(cid,storage,stor_value + value) result = value - stor_value doPlayerSendTextMessage(cid,22,'Your honor was increased by ' .. result .. '.') else debugPrint("[Honor] ERROR: value returned LUA_ERROR or LUA_NULL. returning.") return LUA_ERROR end end function getHonor(cid) local storage = 999 local stor_value = getPlayerStorageValue(cid,storage) if stor_value <= 0 then debugPrint("[Honor] ERROR: stor_value returned LUA_ERROR or LUA_NULL. returning.") return LUA_ERROR elseif stor_value < 10 then honor = 'guardian' elseif stor_value > 10 and stor_value < 20 then honor = 'noble' elseif stor_value > 20 and stor_value < 30 then honor = 'lord' else honor = 'master' end doPlayerSendTextMessage(cid,22,'Your honor is ' .. stor_value .. ' this means that you\'re a ' .. honor .. '.') end
Como não tive muito tempo, não saiu como eu esperava, mas creio que assim já é uma boa forma.
Tenham bom proveito das funções.
-
Venho observado que a maioria dos bankers são feitos usando as funções io.open e etc, não gostei muito disso, por isso, resolvi fazer um sistema diferente. Eis as funções:
function balance(cid) local storage = 666 local value = getPlayerStorageValue(cid, storage) if value > 0 then selfSay('Your account balance is '..value..' gold.') else selfSay('You don\'t have money in your bank account.') end end function withdraw(cid, value) -- value pode ser %a para assim pegar a mensagem do player... local storage = 666 local balance = getPlayerStorageValue(cid, storage) if value < 0 then selfSay('You cannot withdraw negative values.') elseif balance < value then selfSay('There is not enough gold on your account.') else selfSay('Here you are, '..value..' gold. Please let me know if there is something else I can do for you.') setPlayerStorageValue(cid, storage, balance-value) doPlayerAddMoney(cid,value) end end function deposit(cid, value) -- value pode ser %a para assim pegar a mensagem do player... local storage = 666 local balance = getPlayerStorageValue(cid, storage) if value < 0 then selfSay('You cannot deposit negative values.') elseif doPlayerGetMoney(cid) < value then selfSay('You do not have enough gold.') elseif balance >= 0 and doPlayerGetMoney(cid) >= value then selfSay('Alright, we have added the amount of '..value..' gold to your balance. You can withdraw your money anytime you want to.') setPlayerStorageValue(cid, storage, balance + value) pay(cid,value) elseif balance < 0 and doPlayerGetMoney(cid) >= value then selfSay('Alright, we have added the amount of '..value..' gold to your balance. You can withdraw your money anytime you want to.') setPlayerStorageValue(cid, storage, balance + value+1) pay(cid,value) end end
Tenham bom proveito dessas funções.
Observações
Para usar a mesma, vocês devem ter a função doPlayerGetMoney, para quem não ter ela, vocês podem pegar aqui:
function doPlayerGetMoney(cid) local gold = getPlayerItemCount(cid,2148) local platinum = getPlayerItemCount(cid,2152) local crystal = getPlayerItemCount(cid,2160) local total = gold + (platinum*100) + (crystal*10000) return total end
-
@lucasbro
Nunca postei versão do DevLand aqui no XTibia, você deve usar o NTS StarterKit.
-
Adorei a idéia, se quiser posso ajudar a programar o game.
Mas com isso algumas coisas teriam que ser mudadas.
-
@Koti
Eu melhorei seu script, se quiser, acesse meu site (assinatura)
-
Sinceramente quem fez esse script é bem ruim. Optmizei ele para deixá-lo melhor:
function onUse(cid, item, frompos, item2, topos) if item2.itemid == 490 or item2.itemid == 491 or item2.itemid == 492 or item2.itemid == 618 or item2.itemid == 619 or item2.itemid == 620 or item2.itemid == 622 or item2.itemid == 623 or item2.itemid == 624 or item2.itemid == 625 or item2.itemid == 626 or item2.itemid == 627 or item2.itemid == 628 or item2.itemid == 629 or item2.itemid == 4611 or item2.itemid == 4613 or item2.itemid == 4614 or item2.itemid == 4617 or item2.itemid == 7236 or item2.itemid == 7237 then skill_level = getPlayerSkill(cid,6) random_number = math.random(1,(100+skill_level/10)) doSendMagicEffect(topos,1) if random_number<=skill_level then doPlayerAddItem(cid,2667,1) end doPlayerAddSkillTry(cid,6,1) else return 0 end return 1 end
Sobre a segunda parte de deletar tudo, isso faria com que o resto do escopo que ali estava, parasse de funcionar, por isso não é bom fazer isso.
-
Você poderia mudar o título para "NPCs baseados no Jiddo NPC System, já que tais NPCs só funcionam com tal sistema. Além do mais, esses NPCs funcionam para outras versões também.
-
Não seria por doRemoveItem e sim por doCOMBAT, existe um parameter específico para isso.
-
Golden Helmet era loot de demon bem no início de Tibia.
Lighbreak e Arieswar (antigos tops 1 e 2 respectivamente de Antica) tem uma backpack cheia deles.
-
@Rafix
Quem te garante?
@Tópico
Para quem não sabe, xinn é criador do TheCrims, um jogo bem famoso. Por essa eu não esperava, SQL Injection de um programador assim como ele? Sei não em...
-
Olá ta4e, irei melhorar seu script e fazer o que você falou que faria em breve:
--function by ta4e modified by Nostradamus-- function onSay(cid, words, param) templo = {x=1000, y=1001, z=7} --coordenadas do templo dinheiro = 50 -- dinheiro que será cobrado fromplayer = getPlayerPosition(cid) -- para 8.0 -> getCreaturePosition(cid) level = 100 -- level para poder usar access = 5 -- acesso para poder usar if getPlayerLevel(cid) > 100 or getPlayerLevel(cid) = 100 and getPlayerAccess(cid) > access then if doPlayerRemoveMoney(cid,dinheiro) == 1 then if doTeleportThing(cid,templo) == 0 then doSendMagicEffect(fromplayer,10) doSendMagicEffect(templo,10) else end else end else doPlayerSendCancel(cid,'You need ' .. dinheiro .. ' gps to teleport.') doSendMagicEffect(fromplayer,2) end end return 1 end
Quero lembrar que não foi testado, mas acho que deve funcionar sim.
-
Vou lhe dar uma dica cara, em vez de você ficar criando 4 arquivos, ponha tudo em um apenas. Vou lhe dar um exemplo fazendo isso com seu script:
function onUse(cid, item, frompos, item2, topos) if item.itemid == 7441 then doTransformItem(item.uid,7442) elseif item.itemid == 7442 then doTransformItem(item.uid,7444) elseif item.itemid == 7444 then doTransformItem(item.uid,7445) elseif item.itemid == 7445 then doTransformItem(item.uid,7446) else return 0 end return 1 end
-
Tópico movido.
Destino: Informática -> Dúvidas.
-
Seria bom que você desse a sintaxe e a descrição de cada uma também.
-
@thiagosh
Não estava não
-
Introdução
Estava observando que em 99,9 % dos casos de sites, a maioria apenas troca de layout. Pois hoje ensinarei a criar um website simples em PHP na garra!
Requerimentos
- Conheçimento básico de HTML
- Um pouco de lógica, para saber o que é possível e o que não é dentro do PHP
- Dedicação
- Editor de textos (Bloco de notas, notepad++, entre outros)
Lógica estruturada
Primeiramente, antes de entrar em qualquer linguagem, vamos planejar como o site será.
Formulário para account, senha, nome do char, vocação, sexo
- Inclur arquivo de configuração do site
- Pegar dados informados
- Verificar caso campos em branco
- Verificar se a account é numérica
- Verificar o número de dígitos da account e da senha
- Verificar se não foi usado caracteres especiais (*, /, \, !, @, #, $, %, entre outros)
- Verificar se a account existe
- Verificar se o char existe
- Criar a conta com os dados informados
Arquivo de configuração do site
- Configuração de diretório do servidor
- Configurar nome do servidor
- Configurar life, mana, level, skills, entre outros dos jogadores a serem criados
Rápida explicação
Para entender o que iremos fazer em PHP é fácil vamos trabalhar com isso no código:
-
Variavel - Toda variável no PHP é seguida de um $ (ex: $variavel)
-
Condições - A sintaxe das condições no PHP é: if(condição) { // executar algo }
-
Inicialização de código - No PHP indicamos o início de um código pelas "tags": <?php e no final por ?>
-
Comentários - No PHP indicamos um comentário simples por // texto livre ou um comentário multi-linha por /* texto
simples */
Usaremos algumas funções nativas do PHP, são elas:
-
file_exists('dir/arquivo.xml') - Função que checa se um arquivo existe
-
fopen('dir/arquivo.xml', 'w') - Função para abrir/criar arquivos, nesse caso usamos "w" então criaremos um arquivo.
-
fwrite('texto', 'dir/arquivo.xml') - Função para escrevermos num arquivo
-
fclose('dir/arquivo.xml') - Função para fechar um arquivo
-
is_numeric($variavel) - Função para verificar se algo é numérico
-
IsSet($variavel) - Função para verificar se algo foi setado ou mesmo usado
-
echo - Função para imprimir uma mensagem na tela
-
strlen - Função para verificar o número de caracteres de uma palavra (string)
Mãos na massa!
Primeiramente, criemos uma variável e damos a ela um valor de um diretório, o diretório da pasta data:
$dir = "C:/otserv/data"; // não coloque o "/" no final
Agora, vamos fazer um formulário em HTML, irei fazer um bem simples para o fácil entendimento:
<form method="post">Account <br />
<input type="text" name="account" /> <br />
Password <br />
<input type="text" name="password" /> <br />
Nome <br />
<input type="text" name="nick" /> <br />
Sexo <br />
<select name="sex">
<option value="0">Feminino</option>
<option value="1">Masculino</option>
</select> <br />
Vocação <br />
<select name="voc">
<option value="1">Sorcerer</option>
<option value="2">Druid</option>
<option value="3">Paladin</option>
<option value="4">Knight</option>
</select> <br />
<input type="submit" name="make" value="Criar" /> <br />
</form>
Vejamos agora o texto em negrito:
Podemos observar que demos nomes para os campos para texto e botões, podemos dar o nome disso de identificação. Usaremos isso para saber quais valores correspondem a tais lugares. Pois sem isso, como saberíamos os dados informados?
Observe que usamos o método (method) post para pegar os dados, que no PHP é "chamado" por $_POST['campo'];
Vejamos como pegamos a account, senha, nome, e dados do player com POST:
$account = $_POST['account']; $password = $_POST['password']; $name = $_POST['nick']; $sex = $_POST['sex']; $voc = $_POST['voc'];
Depois de tudo pronto, está na hora de por a mão na massa começando a fazer as condições de criação. Primeiramente vamos ver quais faremos:
- Caso a account não seja numérica, exibir mensagem de erro
- Caso a account senha maior ou menor que 7, exibir mensagem de erro
- Caso a senha seja maior que 20 ou menor que 3, exibir mensagem de erro
- Caso o nome não ser letras, exibir mensagem de erro
- Caso a account exista
- Caso o char exista
Vamos fazer pela ordem então:
1) Caso a account não seja numérica, exibir mensagem de erro
if(!is_numeric($account)) { echo "Account não numérica"; }
2) Caso a account senha maior ou menor que 7, exibir mensagem de erro
if(strlen($account) != 7) { echo "Account deve conter 7 números"; }
3) Caso a senha seja maior que 20 ou menor que 3, exibir mensagem de erro
if(strlen($password) > 20 or strlen($password) < 3) { echo "Senha deve ser entre 3 a 20 dígitos"; }
4) Caso o nome não ser letras, exibir mensagem de erro
5) Caso a account exista
if(file_exists("$dir/accounts/$account.xml") { echo "A account já existe em nosso banco de dados"; }
6) Caso o char exista
if(file_exists("$dir/players/$name.xml") { echo "O jogador já existe em nosso banco de dados"; }
Agora depois de todas as condições, faremos a parte de criação da account:
$arquivo = fopen("$dir/account/$account.xml"); fwrite($arquivo, ' <?xml version="1.0"?> <account pass="'.$password.'" premDays="0" premEnd="0"> <characters> <character name="'.$name.'"/> </characters> </account> '); fclose($arquivo);
OBS: Lembrando que estou me baseando no Evolutions.
Agora vamos fazer a criação do player:
$arquivoII = fopen($dir/players/$name.xml");fwrite($arquivoII, '
<?xml version="1.0" encoding="UTF-8"?>
<player name="'.$name.'" account="'.$account.'" sex="'.$sex.'" lookdir="2" exp="3200" voc="'.$voc.'" level="8" access="1" cap="300" maglevel="0" soul="100" maxdepotitems="1000" lastlogin="0">
<spawn x="300" y="300" z="7"/>
<temple x="300" y="300" z="7"/>
<health now="100" max="100" food="0"/>
<mana now="0" max="0" spent="0"/>
<skull redskulltime="0" redskull="0"/>
<look type="128" head="20" body="30" legs="40" feet="50" addons="0"/>
<skills>
<skill skillid="0" level="10" tries="0"/>
<skill skillid="1" level="10" tries="0"/>
<skill skillid="2" level="10" tries="0"/>
<skill skillid="3" level="10" tries="0"/>
<skill skillid="4" level="10" tries="0"/>
<skill skillid="5" level="10" tries="0"/>
<skill skillid="6" level="10" tries="0"/>
</skills>
<addons/>
<deaths>
</deaths>
<blessings>
<blessings/>
<spells>
</spells>
<inventory>
<slot slotid="5">
<item id="2431"/>
</slot>
<slot slotid="6">
<item id="2160" count="99"/>
</slot>
<slot slotid="10">
<item id="2152" count="48"/>
</slot>
</inventory>
<depots>
<depot depotid="1">
<item id="2590">
<inside>
<item id="2594">
<inside>
<item id="2152" count="50"/>
</inside> </item>
</inside>
</item>
</depot>
</depots>
<storage/>
</player>
');
fclose($arquivoII);
OBS: Eu apenas peguei o player padrão que vem no servidor do Evolutions, caso queira modificar, é simples.
Agora, vamos para a última parte: iremos juntar tudo que foi feito.
<form method="post">Account <br />
<input type="text" name="account" /> <br />
Password <br />
<input type="text" name="password" /> <br />
Nome <br />
<input type="text" name="nick" /> <br />
Sexo <br />
<select name="sex">
<option value="0">Feminino</option>
<option value="1">Masculino</option>
</select> <br />
Vocação <br />
<select name="voc">
<option value="1">Sorcerer</option>
<option value="2">Druid</option>
<option value="3">Paladin</option>
<option value="4">Knight</option>
</select> <br />
<input type="submit" name="make" value="Criar" /> <br />
</form>
<?php
$dir = "C:/otserv/data";
if(IsSet($_POST['make'])) {
$account = $_POST['account'];
$password = $_POST['password'];
$name = $_POST['nick'];
$sex = $_POST['sex'];
$voc = $_POST['voc'];
if(!is_numeric($account)) {
echo "Account não numérica";
}
else if(strlen($account) != 7) {
echo "Account deve conter 7 números";
}
else if(strlen($password) > 20 or strlen($password) < 3) {
echo "Senha deve ser entre 3 a 20 dígitos";
}
else if(file_exists("$dir/accounts/$account.xml") {
echo "A account já existe em nosso banco de dados";
}
else if(file_exists("$dir/players/$name.xml") {
echo "O jogador já existe em nosso banco de dados";
}
else {
$arquivo = fopen("$dir/account/$account.xml");
fwrite($arquivo, '
<?xml version="1.0"?>
<account pass="'.$password.'" premDays="0" premEnd="0">
<characters>
<character name="'.$name.'"/>
</characters>
</account>
');
fclose($arquivo);
$arquivoII = fopen($dir/players/$name.xml");
fwrite($arquivoII, '
<?xml version="1.0" encoding="UTF-8"?>
<player name="'.$name.'" account="'.$account.'" sex="'.$sex.'" lookdir="2" exp="3200" voc="'.$voc.'" level="8" access="1" cap="300" maglevel="0" soul="100" maxdepotitems="1000" lastlogin="0">
<spawn x="300" y="300" z="7"/>
<temple x="300" y="300" z="7"/>
<health now="100" max="100" food="0"/>
<mana now="0" max="0" spent="0"/>
<skull redskulltime="0" redskull="0"/>
<look type="128" head="20" body="30" legs="40" feet="50" addons="0"/>
<skills>
<skill skillid="0" level="10" tries="0"/>
<skill skillid="1" level="10" tries="0"/>
<skill skillid="2" level="10" tries="0"/>
<skill skillid="3" level="10" tries="0"/>
<skill skillid="4" level="10" tries="0"/>
<skill skillid="5" level="10" tries="0"/>
<skill skillid="6" level="10" tries="0"/>
</skills>
<addons/>
<deaths>
</deaths>
<blessings>
<blessings/>
<spells>
</spells>
<inventory>
<slot slotid="5">
<item id="2431"/>
</slot>
<slot slotid="6">
<item id="2160" count="99"/>
</slot>
<slot slotid="10">
<item id="2152" count="48"/>
</slot>
</inventory>
<depots>
<depot depotid="1">
<item id="2590">
<inside>
<item id="2594">
<inside>
<item id="2152" count="50"/>
</inside>
</item>
</inside>
</item>
</depot>
</depots>
<storage/>
</player>
');
fclose($arquivoII);
// Para não perder tempo, usaremos minha função de adicionar itens ao players.xml
function players_xml(&$nick) {
if(!file_exists("$dir/players/players.xml") {
$fp = fopen("$dir/players/players.xml", "w");
fwrite($fp, '
<?xml version="1.0"?>
<players>
</players>
');
fclose($fp);
}
else {
$xml = new SimpleXMLElement(file_get_contents("$dir/players/players.xml"));
$xml->players->addChild('player');
$player = end($xml->xpath('/players/player'));
$nextGuid = (int) $player['guid'] + 1;
$newPlayer = end($xml->xpath('/players'))->addChild('player');
$newPlayer->addAttribute('guid', $nextGuid);
$newPlayer->addAttribute('name', $nick);
$xml->asXML("$dir/players/players.xml");
}
}
players_xml($name);
echo "Char criado com sucesso";
}
}
?>
OBS: O fórum acabou com minha estruturação do código.
E chegamos ao fim de mais um tutorial, qualquer dúvida, é só postar aqui.
- Conheçimento básico de HTML
-
@Ta4e
A lógica da condição é sim, mas não precisa estar necessáriamente nessa ordem.
-
Você se esqueçeu de por function onUse....
-
Para quem não sabe, está sendo criado uma versão de OT para TibIAME, o nome é OTME.
-
@GunsWebMaster
Folgado você né?
Se você se auto-entitula "Webmaster" faça você ao invés de usar códigos de terceiros.
-
@FLuzX
É óbvio que dá para se fazer sites em HTML, mas não sistemas em. O que você fez foi apenas uma página estática.
@maca_vi
Não dá para fazer sites em HTML, dá para se fazer em várias tais como Perl, PHP, ASP, Javascript (não é muito recomendado), JAVA, Ruby e muitos outros.
-
Para que você repetiu a tag:
<attack name="melee" interval="2000" min="0" max="0" />
várias vezes? Não há necessidades...
-
Local errado, o certo seria em Programação Open-Tibia -> Actions
-
Quem Está Navegando 0 membros estão online
- Nenhum usuário registrado visualizando esta página.
Mary And Divorce Functions
em Actions e Talkactions
Postado
@lucasbro
Preciso praticar né?
Eu comecei a programar LUA em menos de 1 dia.