Jump to content
schibuola

Pedido [pedido] teleport que da e retira level do player

Recommended Posts

.Qual servidor ou website você utiliza como base?  Otserv Global 12x

 

Qual o motivo deste tópico? 

 

Olá pessoas, vim aqui pedir ajuda a vocês.

Eu não sou programador e não entendo nada de programar, apenas sei alterar uns scripts ou outros. 

Tendo isso em mente, eu fui atras de um script que fosse possivel dar level quando o player entrasse num tp, e quando ele saísse ele voltava pro level que ele tava antes de entrar no tp.

Basicamente assim : Antes do player pular no tp, ele vai estar level 300. Dai quando ele entrar no tp, ele vai passar do 300 pro 600. E quando ele for sair dessa area, ele volta do 600 pro 300.


Tentei procurar algo parecido com isso nos forum, mas n soube pesquisar direito ou então realmente n encontrei nada parecido com isso.

O ot que estou usando é versão 12x. Creio q seja TFS 1.3

Grato desde já

Share this post


Link to post
Share on other sites

Cara, inicialmente você precisa montar um script de movements, que seria os dois teleportes (ida e volta).
Segundo você grava a experiencia que adicionar para o novo level em uma storage quando ele entrar no primeiro teleporte.

Terceiro, a volta do teleporte, você retira a experiencia que adicionou (o valor salvo na storage).

 

Funções que você pode usar:

local function getExpForLevel(level)
	level = level - 1
	return ((50 * level * level * level) - (150 * level * level) + (400 * level)) / 3
end

player:getExperience()

player:addExperience()

player:getLevel()

 


[OTX3 - 8.60] Projeto STYLLER 2019 (Download)

[TFS 1.3 - 10.98] Projeto ALUNIA 2017 - Styller/Yourots Custom (Download)

 

Share this post


Link to post
Share on other sites
5 horas atrás, luanluciano93 disse:

Cara, inicialmente você precisa montar um script de movements, que seria os dois teleportes (ida e volta).
Segundo você grava a experiencia que adicionar para o novo level em uma storage quando ele entrar no primeiro teleporte.

Terceiro, a volta do teleporte, você retira a experiencia que adicionou (o valor salvo na storage).

 

Funções que você pode usar:


local function getExpForLevel(level)
	level = level - 1
	return ((50 * level * level * level) - (150 * level * level) + (400 * level)) / 3
end

player:getExperience()

player:addExperience()

player:getLevel()

 

Então, teria como dar uma luz ai ? eu realmente n entendo de programação kk

N sei fazer um script desses.

Eu consigo editar um script no maximo.

 

E essas paradas de storage eu tb nao tenho conhecimento.

 

Enqt o movement eu pretendo usar esse script

Spoiler

local config = {
    [xxxxx] = Position(xxxx, xxxx, x),
    [xxxxx] = Position(xxxx, xxxx, x),
}

function onStepIn(creature, item, position, fromPosition)
    local player = creature:getPlayer()
    if not player then
        return false
    end

    local teleport = config[item.actionid]
    if teleport then
        player:teleportTo(teleport)
        fromPosition:sendMagicEffect(CONST_ME_TELEPORT)
        teleport:sendMagicEffect(CONST_ME_TELEPORT)
    end
end

 

Share this post


Link to post
Share on other sites
Agora, luanluciano93 disse:

Primeiro aprenda o que é storage

 

Então, eu dei uma olhada e acho que entendi oq é storage.

Basicamente é um valor unico que vai salvar algo no banco de dados pra dar "acesso" ao player quando ele tiver esse valor. (pelo oq eu pude entender foi isso)

 

Mas ainda n sei ao certo como eu deveria aplicar isso em um script.

O codigo seria esse getPlayerStorageValue(uid, chave), certo ?

Mas oq viria depois ? onde eu aplico ele ? seria no script de movements ?

Share this post


Link to post
Share on other sites

Aqui você acha todas as funções do TFS atual: https://github.com/otland/forgottenserver/wiki/Script-Interface

Se clica em players nesse link irá ter as funções usadas nos players: https://github.com/otland/forgottenserver/wiki/Metatable%3APlayer

Se estudar um pouco de lógica de programação e algoritmos irá perceber que no TFS (e na maioria das coisas na programação) as funções são basicamente escritas em inglês, e no TFS você verifica no início delas o que ela faz: GET (puxa um valor da database), SET (muda algo na database), ADD (adiciona algo na database) e etc.

No link que te passei se você procurar por storage vai achar a função que puxa o valor database e a que muda o valor na database ... 

A tabela da storage na database é formada basicamente pelo chave da storage e pelo valor dela, tudo indicando para determinado player, POR EXEMPLO:
O player de ID 1 fez uma quest, você programou para quando ele clicar na quest mudar o valor da chave 2000 para 1, então a chave 2000 terá valor 1 para o PLAYER de ID 1.

Se você entender a lógica vai ver que dá para fazer milhares de coisas ... 

getStorageValue(key)

setStorageValue(key, value)

Edited by luanluciano93 (see edit history)

[OTX3 - 8.60] Projeto STYLLER 2019 (Download)

[TFS 1.3 - 10.98] Projeto ALUNIA 2017 - Styller/Yourots Custom (Download)

 

Share this post


Link to post
Share on other sites
Em 28/06/2020 em 20:38, Npc Bugado disse:

@schibuola 

 

Eu estou no celular e não pude testar, mas veja se lhe agrada e me reporte qualquer bug, usei como base o sistema de teleport do membro lordzetros, dito isso, vamos lá:

Em data/movements/scripts/ crie um arquivo chamado mov_janela_hunts.lua e adicione dentro:


-- Devidos créditos  pelo uso da base: lordzetros 

local config = {
	titulo = "BEM VINDO(A) A JANELA DE HUNTS!", -- Título da Janela
	mensagem = "Selecione qual hunt voce deseja ir:", -- Mensagem abaixo do título da janela
}

CONFIG_TPS_JANELA = {
	[19090] = { -- ID do action que ficará no portal da hunt
		{nome = "Demon 01", pos = {x = 98, y = 139, z = 7}}, -- Segue padrão, nome da cave e posição que o player será teleportado
		{nome = "Demon 02", pos = {x = 93, y = 144, z = 7}},
		{nome = "Demon 03", pos = {x = 91, y = 140, z = 7}},
		{nome = "Demon 04", pos = {x = 94, y = 138, z = 7}},
		{nome = "Demon 05", pos = {x = 95, y = 136, z = 7}},
	},
	[19091] = { 
		{nome = "Frost 01", pos = {x = 98, y = 140, z = 7}},
		{nome = "Frost 02", pos = {x = 93, y = 145, z = 7}},
		{nome = "Frost 03", pos = {x = 91, y = 141, z = 7}},
		{nome = "Frost 04", pos = {x = 94, y = 139, z = 7}},
		{nome = "Frost 05", pos = {x = 95, y = 137, z = 7}},
	},
}

function onStepIn(creature, item, pos, fromPosition)
	if ((CONFIG_TPS_JANELA[item:getActionId()]) and creature:isPlayer()) then
		JANELA_TP_ACTION = item:getActionId()
		creature:teleportTo(fromPosition, true)
		creature:registerEvent("janela hunts")
		local janela = ModalWindow(1000, config.titulo, config.mensagem)
		
		for i, v in ipairs(CONFIG_TPS_JANELA[JANELA_TP_ACTION]) do
			janela:addChoice(i, v.nome)
      		doPlayerAddExp(cid,500000)
			doPlayerSay(cid,"Eu ganhei esse exp ai de cima até passar pelo portal novamente :)",1)
		end
		
		janela:addButton(100, "Confirmar")
		janela:addButton(101, "Fechar")
		janela:setDefaultEnterButton(100)
		janela:setDefaultEscapeButton(101)
		janela:sendToPlayer(creature)
	end
	return true
end

 

Em data/movements/movements.xml adicione o seguinte código abaixo de um semelhante:


<movevent event="StepIn" itemid="5023" script="mov_janela_hunts.lua" />

 

Agora em data/creaturescripts/scripts/ crie um arquivo chamado creature_janela_hunts.lua e adicione dentro:


function onModalWindow(player, modalWindowId, buttonId, choiceId)
	player:unregisterEvent("janela hunts")
	if (modalWindowId == 1000) then
		if (buttonId == 100) then
			local tele_pos = CONFIG_TPS_JANELA[JANELA_TP_ACTION][choiceId].pos
			player:teleportTo(tele_pos)
			local pos_t = Position(tele_pos)
			pos_t:sendMagicEffect(CONST_ME_MAGIC_BLUE)
		end
	end
	return true
end

 

Em data/creaturescripts/creaturescripts.xml adicione o seguinte código abaixo de um semelhante:


<event type="ModalWindow" name="janela hunts" script="creature_janela_hunts.lua"/>

* Configuração *

    Bom, apesar de que não seja difícil de configurar, é necessário uma explicação, vamos lá...

1 - 


[19090] = { -- ID do action que ficará no portal da hunt
		{nome = "Demon 01", pos = {x = 98, y = 139, z = 7}}, -- Segue padrão, nome da cave e posição que o player será teleportado
		{nome = "Demon 02", pos = {x = 93, y = 144, z = 7}},
		{nome = "Demon 03", pos = {x = 91, y = 140, z = 7}},
		{nome = "Demon 04", pos = {x = 94, y = 138, z = 7}},
		{nome = "Demon 05", pos = {x = 95, y = 136, z = 7}},
	},

Em [19090] este número de dentro é o actionID que ficará no portal. Com ele será identificado de qual monstro se trata, bastando apenas configurar este número e o nome das opções de monstros que você quer aparecendo na janela, em seguida, a posição na qual o jogador será teleportado, seguindo a ordem. Segue imagem de como deve ficar o seu portal:

Screenshot_71.png.d5bd967d26e4cd1b17c63f4a82e38a5d.png

 

 

OBS²: VOCÊ EDITA O ACTIONID NO SEU EDITOR DE MAPA COLOCANDO NO ID DO ITEM DE TELEPORTE.

OBS³: PARA ADICIONAR NOVAS HUNTS NO SCRIPT, BASTA SEGUIR O PADRÃO QUE ESTÁ NO CÓDIGO, DO 19090 PARA O 19091.

 

2 - (por fim)

Em data/movements/movements.xml

 


<movevent event="StepIn" itemid="5023" script="mov_janela_hunts.lua" />

itemID = Id do item que o player andará para abrir a janela de hunt

Está como 5023 por conta que o magic forcefield é 5023, no qual utilizei para teste, aconselho você deixar da mesma forma (caso seja o mesmo id no seu servidor), ou mude, mas cuidado para não cometer algum erro.

 

Olá,

    Primeiramente obrigado pela ajuda.

 

eu fiz os passos que vc descreveu ai e qnd eu tento pular no tp, o boneco apenas anda pra tras do tp como se estivesse sendo empurrado, e nada acontece.

 

Fui olhar a distro e ta dando esse error lá

Spoiler

Lua Script Error: [MoveEvents Interface]
data/movements/scripts/others/mov_janela_hunts.lua:onStepIn
data/movements/scripts/others/mov_janela_hunts.lua:35: attempt to call global 'doPlayerSay' <a nil value>
stack traceback:
    [C]: in function 'doPlayerSay'
    data/movements/scripts/others/mov_janela_hunts.lua:35: in function <data/movements/scripts/others/mov_janela_hunts.lua:25>

Pelo oq eu pude observar, foi o unico error q deu.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Similar Content

    • By alun0n0v0
      Boa tarde galera, Não sei se aqui é o lugar para pedir isso mas vamos la. Se alguém estiver o tópico ensinado a criar um e puder deixar o link para mim esta criando para meu servidor que estou desenvolvendo agradeço  vcs.
    • By Babiloniaoz
      Estou com um erro quando tento abrir a pagina de guilds no gesior. atualizado uso TFS 1.3
      Erro A baixo
       
      Codigo databaselist.php
      <?php
      if(!defined('INITIALIZED'))
          exit;
      class DatabaseList extends DatabaseHandler implements Iterator, Countable
      {
          public $data;
          public $iterator = 0;
          public $class;
          public $table;
          public $tables = array();
          public $fields = array();
          public $extraFields = array();
          public $filter;
          public $orders = array();
          public $limit;
          public $offset = 0;
          public function __construct($class = null)
          {
              if($class !== null)
                  $this->setClass($class);
          }
          public function load()
          {
              $fieldsArray = array();
              if(count($this->fields) > 0)
                  foreach($this->fields as $fieldName)
                          $fieldsArray[$fieldName] = $this->getDatabaseHandler()->tableName($this->table) . '.' . $this->getDatabaseHandler()->fieldName($fieldName);
              if(count($this->extraFields) > 0)
                  foreach($this->extraFields as $field)
                      if(!$field->hasAlias())
                          $fieldsArray[] = $this->getDatabaseHandler()->tableName($field->getTable()) . '.' . $this->getDatabaseHandler()->fieldName($field->getName());
                      else
                          $fieldsArray[] = $this->getDatabaseHandler()->tableName($field->getTable()) . '.' . $this->getDatabaseHandler()->fieldName($field->getName()) . ' AS ' . $this->getDatabaseHandler()->fieldName($field->getAlias());
              $tables = array();
              foreach($this->tables as $table)
                  $tables[] = $this->getDatabaseHandler()->tableName($table);
              $filter = '';
              if($this->filter !== null)
                  $filter = ' WHERE ' .$this->filter->__toString();
              $order = '';
              $orders = array();
              if(count($this->orders) > 0)
              {
                  foreach($this->orders as $_tmp_order)
                      $orders[] = $_tmp_order->__toString();
                  if(count($orders) > 0)
                      $order = ' ORDER BY ' . implode(', ', $orders);
              }
              $limit = '';
              if($this->limit !== null)
                  $limit = ' LIMIT ' . (int) $this->limit;
              $offset = '';
              if($this->offset > 0)
                  $offset = ' OFFSET ' . (int) $this->offset;
              $query = 'SELECT ' . implode(', ', $fieldsArray) . ' FROM ' . implode(', ', $tables) . $filter . $order . $limit . $offset;
              $this->data = $this->getDatabaseHandler()->query($query)->fetchAll();
          }
          public function getResult($id)
          {
              if(!isset($this->data))
                  $this->load();
              if(isset($this->data[$id]))
              {
                  if(!is_object($this->data[$id]))
                  {
                      $reflect = new ReflectionClass($this->class);
                      $_tmp = $reflect->newInstanceArgs(array());
                      $_tmp->loadData($this->data[$id]);
                      return $_tmp;
                  }
                  else
                      return $this->data[$id];
              }
              else
                  return false;
          }
          public function addExtraField($field)
          {
              $this->extraFields[] = $field;
              $this->addTables($field->getTable());
          }
          public function addOrder($order)
          {
              $this->orders[] = $order;
          }
          public function setClass($class)
          {
              $this->class = $class;
              $instance = new ReflectionClass($this->class);
              $properties = $instance->getStaticProperties();
              $this->fields = $properties['fields'];
              if(isset($properties['extraFields']))
              {
                  $extraFields = $properties['extraFields'];
                  if(isset($extraFields))
                      foreach($extraFields as $extraField)
                      {
                          if(!isset($extraField[2]))
                              $this->extraFields[] = new SQL_Field($extraField[0], $extraField[1]);
                          else
                              $this->extraFields[] = new SQL_Field($extraField[0], $extraField[1], $extraField[2]);
                          $this->tables[$extraField[1]] = $extraField[1];
                      }
              }
              $this->table = $properties['table'];
              $this->tables[$this->table] = $this->table;
          }
          public function setFilter($filter)
          {
              $this->addTables($filter->getTables());
              $this->filter = $filter;
          }
          public function setLimit($limit)
          {
              $this->limit = $limit;
          }
          public function setOffset($offset)
          {
              $this->offset = $offset;
          }
          public function addTables($tables)
          {
              if(is_array($tables))
              {
                  foreach($tables as $table)
                      if($table != '' && !in_array($table, $this->tables))
                          $this->tables[$table] = $table;
              }
              elseif($tables != '' && !in_array($tables, $this->tables))
                  $this->tables[$tables] = $tables;
          }
          public function current()
          {
              return $this->getResult($this->iterator);
          }
          public function rewind()
          {
              if(!isset($this->data))
                  $this->load();
              $this->iterator = 0;
          }
          public function next()
          {
              ++$this->iterator;
          }
          public function key()
          {
              return $this->iterator;
          }
          public function valid()
          {
              return isset($this->data[$this->iterator]);
          }
          public function count()
          {
              if(!isset($this->data))
                  $this->load();
              return count($this->data);
          }
      }
       
      Você tem alguma imagem que possa auxiliar no problema? Se sim, coloque-a aqui. 
       
    • By Chikorito
      Salve galera, vou tentar ser bem direto,

      Estou a procura de algum servidor de qualquer coisa, Naruto, DBZ, One Piece, qualquer coisa desse tipo mas que venha com OTC, já vi alguns aí que estao rodando e uns que já rodaram mas não to conseguindo encontrar, o único que tenho aqui é o do antigo Shinobi Online mas to sem a source, se não, gostaria de indicações de qual melhor base pra começar um projeto com algum desses temas, mesmo que seja com old client, pra um projeto que estou fazendo sozinho na calma e bem minuciosamente, agradeço desde já!
       
    • By Mecianosz
      Olá. Estou fazendo um server enforced 8.60 e preciso de uma distro 0.4 .. Encontrei várias na internet, mas as melhores estão configuradas para MySQL (site) e meu OT é Account Manager apenas. Não sei compilar distro, estou aprendendo, por isso gostaria de pedir alguma indicação. Alguém pode me indicar ou VENDER uma distro ?
    • By Reloaded
      Ola a todos, alguem poderia me ajuda com o as scripts para ativar a duble exp?
      achei algunas no forum mas infelismente nao funcionaram para o tfs 1.3
       
      tipo o script funcionaria quando o GOD ativa-se !Duble Exp e os players ganhariam 2 horas de duble
      desculpe-me caso ja tenha um topico desses, eu agradeço a todos que me ajudarem
  • Recently Browsing   0 members

    No registered users viewing this page.


Open Tibia Server

Quer aprender a criar seu próprio servidor de Tibia? Então está no lugar certo, aqui você encontrará milhares de tutorias, scripts, códigos, mapas e utilitários para que você possa fazer o seu próprio servidor de Tibia começando do zero.

Redes Sociais

Anuncie no Tibia King

Precisa de mais visibilidade em seus projetos? Quer fazer um plano publicitário para o seu servidor? Anuncie no Tibia King e faça sua divulgação, possuímos centenas de acessos simultâneos e milhares diários, com certeza será a sua solução!

×
×
  • Create New...