Ir para conteúdo
  • Cadastre-se

Posts Recomendados

Tópico aprovado e movido a área correta, obrigado por compartilhar.

Você recebeu um REP pela contribuição.

Link para o post
Compartilhar em outros sites

Bom é que são 33 visualizações e tirando o post de aprovação não há nada mais.. a gente procura algo mais completo, informativo.. Duvido que um ou dois não tenham testado e nada.. o conteúdo pode não ser meu mas não custa agradecer se ajudou em algo, que não seja com rep mas pelo menos um comentário né..

 

Pessoal quer só 'ganhar' na facilidade.. ir procurar em fórum gringo, editar o post deixar de boa pro pessoal entender melhor não conta... pffff 

 

Depois pessoal reclama que não tem, ou ficam pedindo em um monte de post para fazer algo parecido.. até para quem não tem e quer piso para premmy se usar de lógica consegue pegar o piso vip que tem aqui, particularmente achei bem simples) e mudar para premmy.. (vi a poucos dias alguém pedindo piso premmy igual a ponte de rook no tibia)

Enfim.. 

Link para o post
Compartilhar em outros sites
  • 2 weeks later...

Legal, mas prefiro o que eu fiz .. se tiver tempo dá uma olhada: http://www.tibiaking.com/forum/topic/49770-tfs-1x-vip-system-by-luanluciano93/

 

Eu havia visto antes de postar esse aqui, havia até testado mas não havia funcionado e também no seu não explica como adicionar o resto das coisas.. havia até um rapaz perguntando se dava para colocar ilimitado e tal.. e você só informou qual parametro usar..

 

Ai por não ter funcionado aqui no meu e por não ter outras informações que eu acho indispensáveis, como query pra db e um help para quem realmente não sabe fazer tile, porta, item e comandos, procurei e postei esse.. não gosto de ficar 'perturbando' quando eu posso procurar .. normalmente quando pergunto ou post algum tópico pedindo ajuda é que realmente não achei uma solução sozinho.. :P

 

Mas não cheguei a testar novamente e não me lembro o que ocorreu mas enfim :D quanto mais opções melhor né! :D

Link para o post
Compartilhar em outros sites
  • 1 month later...

Qual a storage deste sistema?

amera_banner.gif.29bbf8f5ce75868cb628288e527ef273.gif

www.Amera-Global.com - Rádio Amera ATS • TeamSpeak 3 • Cliente 10.99 e 11.00

Link para o post
Compartilhar em outros sites
  • 7 months later...

Ola gostei muito, testei e esta funcionando, so tem um porem que nao estou entendendo, o Vip esta indo para todos os personagens da conta, queria que fosse so para o que usasse o item de ganhar o Vip

 

Link para o post
Compartilhar em outros sites
  • 2 weeks later...

Como faço pra adicionar no gesior show VIP Status com esse seu sistema? seria interessante voce adicionar isso ao topico. Obs: TFS 1.2

Link para o post
Compartilhar em outros sites
  • 4 weeks later...

Boa noite, eu tenho uma pergunta, quando meus dias vip chegar a zero, eu vou para o meu personagem # 1, que é teletransportado para o templo, mas quando eu entrar no meu caráter # 2, esse personagem fica na área VIP. Pode me ajudar a resolver esse erro?

Link para o post
Compartilhar em outros sites

^^ entendi nada nesse toutorial -> Global.lua em menhum ot server existe 

e no 3º 

3° na pasta data\ crie um arquivo chamado vipsystem.lua e adicione o seguinte

data / o que ? 

essa explicação tá foda cara :p 

Link para o post
Compartilhar em outros sites

Folder Data/vipsystem.lua

http://prntscr.com/b9dxng

10 hours ago, helix758 said:

^^ entendi nada nesse toutorial -> Global.lua em menhum ot server existe 

e no 3º 

3° na pasta data\ crie um arquivo chamado vipsystem.lua e adicione o seguinte

data / o que ? 

essa explicação tá foda cara :p 

otserver/data/

 

http://prntscr.com/b9dxng

Link para o post
Compartilhar em outros sites
13 horas atrás, Gaaryy disse:

Folder Data/vipsystem.lua

http://prntscr.com/b9dxng

otserver/data/

 

http://prntscr.com/b9dxng

que loucura cara, nem sabia que dava pra por aí , algumas pessoas me falaram que o global era globalevents

Link para o post
Compartilhar em outros sites
  • 2 months later...
Em 19/07/2015 ás 23:50, DkAngel83 disse:

Bem procurei aqui na comunidade um VIP System mais informativo e nada, além de ter tido problema com os que estão aqui e acabei achando em outro lugar um que funcionou perfeitamente para mim.

 

Usando tfs disponibilizado neste tópico http://www.tibiaking.com/forum/topic/53099-1078-tfs-12-cast-system-novos-outfits-mounts/

 

Só estou trazendo o conteúdo e por não conhecer bem não posso dar suporte mas do jeito que está é só 'instalar' e vai funcionar.

 

Creditos.: Summ

 

Sistema Vip

 

 

 

Conteúdo Oculto

 

 

Talkaction !checkvip para todos os players

 

 

 

Conteúdo Oculto

 

 

Talkaction /vip para membros da staff


- /vip adddays, NomedoPlayer, 5
--> Adiciona 5 dias vip para o Player.
- /vip removedays, NomedoPlayer, 5
--> Remove 5 dias vip do Player.
- /vip remove, PlayerName
--> Remove todos os dias vip do Player.
- /vip check, NomedoPlayer
--> Checa quantos dias vip o Player tem.
- /vip addinfinite, NomedoPlayer
--> Adiciona tempo vip infinito para o Player.

 

 

Conteúdo Oculto

 

 

Tiles VIP

 

 

Conteúdo Oculto

 

 

Portas VIP / Actions

 

 

Conteúdo Oculto

 

 

Items que adicionam dias VIP


ItemId 10135 adiciona 10 dias vip.
ItemId 10134 adiciona 30 dias vip.
ItemId 10133 adiciona 90 dias vip.

 

 

Conteúdo Oculto

 

 

Imagens

 

Comando !checkvip mas sem ter vip

 

 

Conteúdo Oculto

 

 

Comando /vip adddays, dracoknight, 5

 

 

Conteúdo Oculto

 

 

Comando !checkvip após adicionar 5 dias

 

 

Conteúdo Oculto

 

 

Comando /vip addinfinite, dracoknight

 

 

Conteúdo Oculto

 

 

Comando !checkvip após usar infinite 

 

 

Conteúdo Oculto

 

 

Comando /vip remove, dracoknight

 

 

Conteúdo Oculto

 

 

Amigo falta a exp vip... 20% pra quem tiver vip donate.

Link para o post
Compartilhar em outros sites
  • 1 month later...
  • 4 weeks later...
  • 1 year later...
Em 19/07/2015 em 23:50, DkAngel83 disse:

Bem procurei aqui na comunidade um VIP System mais informativo e nada, além de ter tido problema com os que estão aqui e acabei achando em outro lugar um que funcionou perfeitamente para mim.

 

Usando tfs disponibilizado neste tópico http://www.tibiaking.com/forum/topic/53099-1078-tfs-12-cast-system-novos-outfits-mounts/

 

Só estou trazendo o conteúdo e por não conhecer bem não posso dar suporte mas do jeito que está é só 'instalar' e vai funcionar.

 

Creditos.: Summ

 

Sistema Vip

 

 

 

Conteúdo Oculto

 

 

Talkaction !checkvip para todos os players

 

 

 

Conteúdo Oculto

 

 

Talkaction /vip para membros da staff


- /vip adddays, NomedoPlayer, 5
--> Adiciona 5 dias vip para o Player.
- /vip removedays, NomedoPlayer, 5
--> Remove 5 dias vip do Player.
- /vip remove, PlayerName
--> Remove todos os dias vip do Player.
- /vip check, NomedoPlayer
--> Checa quantos dias vip o Player tem.
- /vip addinfinite, NomedoPlayer
--> Adiciona tempo vip infinito para o Player.

 

 

Conteúdo Oculto

 

 

Tiles VIP

 

 

Conteúdo Oculto

 

 

Portas VIP / Actions

 

 

Conteúdo Oculto

 

 

Items que adicionam dias VIP


ItemId 10135 adiciona 10 dias vip.
ItemId 10134 adiciona 30 dias vip.
ItemId 10133 adiciona 90 dias vip.

 

 

Conteúdo Oculto

 

 

Imagens

 

Comando !checkvip mas sem ter vip

 

 

Conteúdo Oculto

 

 

Comando /vip adddays, dracoknight, 5

 

 

Conteúdo Oculto

 

 

Comando !checkvip após adicionar 5 dias

 

 

Conteúdo Oculto

 

 

Comando /vip addinfinite, dracoknight

 

 

Conteúdo Oculto

 

 

Comando !checkvip após usar infinite 

 

 

Conteúdo Oculto

 

 

Comando /vip remove, dracoknight

 

 

Conteúdo Oculto

Em 19/07/2015 em 23:50, DkAngel83 disse:

Bem procurei aqui na comunidade um VIP System mais informativo e nada, além de ter tido problema com os que estão aqui e acabei achando em outro lugar um que funcionou perfeitamente para mim.

 

Usando tfs disponibilizado neste tópico http://www.tibiaking.com/forum/topic/53099-1078-tfs-12-cast-system-novos-outfits-mounts/

 

Só estou trazendo o conteúdo e por não conhecer bem não posso dar suporte mas do jeito que está é só 'instalar' e vai funcionar.

 

Creditos.: Summ

 

Sistema Vip

 

 

 

Conteúdo Oculto

 

 

Talkaction !checkvip para todos os players

 

 

 

Conteúdo Oculto

 

 

Talkaction /vip para membros da staff



- /vip adddays, NomedoPlayer, 5
--> Adiciona 5 dias vip para o Player.
- /vip removedays, NomedoPlayer, 5
--> Remove 5 dias vip do Player.
- /vip remove, PlayerName
--> Remove todos os dias vip do Player.
- /vip check, NomedoPlayer
--> Checa quantos dias vip o Player tem.
- /vip addinfinite, NomedoPlayer
--> Adiciona tempo vip infinito para o Player.

 

 

Conteúdo Oculto

 

 

Tiles VIP

 

 

Conteúdo Oculto

 

 

Portas VIP / Actions

 

 

Conteúdo Oculto

 

 

Items que adicionam dias VIP



ItemId 10135 adiciona 10 dias vip.
ItemId 10134 adiciona 30 dias vip.
ItemId 10133 adiciona 90 dias vip.

 

 

Conteúdo Oculto

 

 

Imagens

 

Comando !checkvip mas sem ter vip

 

 

Conteúdo Oculto

 

 

Comando /vip adddays, dracoknight, 5

 

 

Conteúdo Oculto

 

 

Comando !checkvip após adicionar 5 dias

 

 

Conteúdo Oculto

 

 

Comando /vip addinfinite, dracoknight

 

 

Conteúdo Oculto

 

 

Comando !checkvip após usar infinite 

 

 

Conteúdo Oculto

 

 

Comando /vip remove, dracoknight

 

 

Conteúdo Oculto

 

AMIGO.. DEU ESSE ERRO AU EXECUTAR O SERVIDOR. [Warning - MoveEvents::addEvent] Duplicate move event found: 1500. OQ É ISSO?

 

não entendi a parte do TILE VIP. e PORTAS VIP.. PRA Q SERVE ISSO... O RESTO FUNCIONOU.. OQ EU FAÇO COM ISSO??? EU CRIEI OS ID NO MAPA. APARECEU FOGO POSION E ENERGIA

 

NO ID DAS PORTAS. FIZ ALGO DE ERRADO?

Link para o post
Compartilhar em outros sites
  • 11 months later...
Em 19/07/2015 em 23:50, DkAngel83 disse:

Bem procurei aqui na comunidade um VIP System mais informativo e nada, além de ter tido problema com os que estão aqui e acabei achando em outro lugar um que funcionou perfeitamente para mim.

 

Usando tfs disponibilizado neste tópico http://www.tibiaking.com/forum/topic/53099-1078-tfs-12-cast-system-novos-outfits-mounts/

 

Só estou trazendo o conteúdo e por não conhecer bem não posso dar suporte mas do jeito que está é só 'instalar' e vai funcionar.

 

Creditos.: Summ

 

Sistema Vip

 

 

 

Conteúdo Oculto

 

 

Talkaction !checkvip para todos os players

 

 

 

Conteúdo Oculto

 

 

Talkaction /vip para membros da staff


- /vip adddays, NomedoPlayer, 5
--> Adiciona 5 dias vip para o Player.
- /vip removedays, NomedoPlayer, 5
--> Remove 5 dias vip do Player.
- /vip remove, PlayerName
--> Remove todos os dias vip do Player.
- /vip check, NomedoPlayer
--> Checa quantos dias vip o Player tem.
- /vip addinfinite, NomedoPlayer
--> Adiciona tempo vip infinito para o Player.

 

 

Conteúdo Oculto

 

 

Tiles VIP

 

 

Conteúdo Oculto

 

 

Portas VIP / Actions

 

 

Conteúdo Oculto

 

 

Items que adicionam dias VIP


ItemId 10135 adiciona 10 dias vip.
ItemId 10134 adiciona 30 dias vip.
ItemId 10133 adiciona 90 dias vip.

 

 

Conteúdo Oculto

 

 

Imagens

 

Comando !checkvip mas sem ter vip

 

 

Conteúdo Oculto

 

 

Comando /vip adddays, dracoknight, 5

 

 

Conteúdo Oculto

 

 

Comando !checkvip após adicionar 5 dias

 

 

Conteúdo Oculto

 

 

Comando /vip addinfinite, dracoknight

 

 

Conteúdo Oculto

 

 

Comando !checkvip após usar infinite 

 

 

Conteúdo Oculto

 

 

Comando /vip remove, dracoknight

 

 

Conteúdo Oculto

 

 

O MEU LOGIN.LUA NÃO FICA NA PASTA SCRIPT. AINDA TEM OUTRA PASTA CHAMADA: OTHERS. Alguém me ajuda.  POR FAVOR. Não sei onde mudar para que possa buscar o destindo do meu arquivo login.lua

Link para o post
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

  • Conteúdo Similar

    • Por luanluciano93
      Olá pessoal, estou desenvolvendo esse sistema vip para TFS 1.x, se precisarem de alguma função nova é só comentar, criei para usar em um servidor meu e resolvi postar, bom proveito a todos.
       
      É só ir no arquivo data/lib/core/player.lua e adicionar esse código no começo do script:
      -- ALTER TABLE `accounts` ADD `vip_time` BIGINT(20) NOT NULL DEFAULT 0; -- player:getVipTime() function Player.getVipTime(self) local resultId = db.storeQuery("SELECT `vip_time` FROM `accounts` WHERE `id` = '".. self:getAccountId() .."';") local time = resultId ~= false and result.getNumber(resultId, "vip_time") or 0 result.free(resultId) return time end -- player:isVip() function Player.isVip(self) return self:getVipTime() > os.time() and true or false end -- player:addVipDays(days) function Player.addVipDays(self, days) return(self:isVip() and tonumber((days * 86400))) and db.query("UPDATE `accounts` SET `vip_time` = '".. (self:getVipTime() + (days * 86400)) .."' WHERE `id` ='".. self:getAccountId() .."' LIMIT 1 ;") or db.query("UPDATE `accounts` SET `vip_time` = '".. (os.time() + (days * 86400)) .."' WHERE `id` ='".. self:getAccountId() .."' LIMIT 1 ;") end -- player:removeVipDays(days) function Player.removeVipDays(self, days) return(self:isVip() and tonumber((days * 86400))) and db.query("UPDATE `accounts` SET `vip_time` = '".. (self:getVipTime() - (days * 86400)) .."' WHERE `id` ='".. self:getAccountId() .."' LIMIT 1 ;") or db.query("UPDATE `accounts` SET `vip_time` = '".. (os.time() - (days * 86400)) .."' WHERE `id` ='".. self:getAccountId() .."' LIMIT 1 ;") end -- player:setVipDays(days) function Player.setVipDays(self, days) return db.query("UPDATE `accounts` SET `vip_time` = '".. (os.time() - (days * 86400)) .."' WHERE `id` ='".. self:getAccountId() .."' LIMIT 1 ;") end -- player:removeVip() function Player.removeVip(self) db.query("UPDATE `accounts` SET `vip_time` = '0' WHERE `id` ='".. self:getAccountId() .."' LIMIT 1 ;") end -- player:sendVipDaysMessage() function Player.sendVipDaysMessage(self) if self:isVip() then local vipTime = self:getVipTime() - os.time() local vipDays = 1 + (math.floor(vipTime / 86400)) return self:getVipTime() ~= false and self:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, 'You have '.. vipDays .. ' vip day(s) in your account.') end end -- player:checkVipLogin() function Player.checkVipLogin(self) if self:getVipTime() > 0 and not self:isVip() then return self:removeVip() and self:teleportTo(self:getTown():getTemplePosition()) end end  
       
      As funções são:
      • player:getVipTime() - Retorna o valor da tabela vip_time (igual esta na database).
      • player:isVip() - Retorna se o player é vip ou não.
      • player:addVipDays(days) - Usa-se em algum script para para adicionar dias de vip ao player (parâmetro de entrada "days").
      • player:removeVipDays(days) - Usa-se em algum script para para remover dias de vip do player (parâmetro de entrada "days").
      • player:setVipDays(days) - Usa-se em algum script para para mudar os dias de vip do player (parâmetro de entrada "days").
      • player:removeVip() - Usa-se em algum script para para remover todo tempo de vip do player.
      • player:sendVipDaysMessage() - Retorna uma mensagem no player mostrando os dias de vip que ainda restam ao player.
      • player:checkVipLogin() - Checa se a vip do player acabou, se sim teleporta ele para o templo.
       

      Qualquer dúvida ou erro/bug poste aqui.
    • Por Codex NG
      Sorry I don't speak spanish so you will have to bare with me.
       
      This is a new way for people to create npc's which use different types of currency, rather than a coming up with different items to trade with the npc or trying to edit the npc modules this method simplifies everything by providing the npc with a npc currency id.
       
      All this npc currency id is, is a storage value.. pretty simple eh?
      If the npc doesn't have a currency id then it will use the normal currency e.g. gold, plat, cc etc..
       
      I originally posted this on otland, but fuck them xD
       
      Using Lailene here you can see she has a currency attribute with id of 123456
      <?xml version="1.0" encoding="UTF-8"?> <npc name="Lailene" currency="123456" script="lailene.lua" walkinterval="2000" floorchange="0" speechbubble="2"> <health now="100" max="100"/> <look type="279" head="114" body="94" legs="113" feet="114" addons="0"/> </npc>  
      Now any player who has a storage value of 123456 can purchase things from her shop provided they have enough value stored within the storage, similar to having money in the bank.
      The money or in this case the storage value is added and removed from the player in real time.
       
      Lets get to the code
       
      game.cpp
      Find this
      bool Game::removeMoney(Cylinder* cylinder, uint64_t money, uint32_t flags /*= 0*/) Replace the whole function with this.
      bool Game::removeMoney(Cylinder* cylinder, uint64_t money, uint32_t flags /*= 0*/) { if (cylinder == nullptr) { return false; } if (money == 0) { return true; } uint32_t currencyId = 0; Player* player; if (Creature* creature = cylinder->getCreature()) { if (Player* p = creature->getPlayer()) { currencyId = p->getNpcCurrencyId(); player = p; } } if (!currencyId) { std::vector<Container*> containers; std::multimap<uint32_t, Item*> moneyMap; uint64_t moneyCount = 0; for (size_t i = cylinder->getFirstIndex(), j = cylinder->getLastIndex(); i < j; ++i) { Thing* thing = cylinder->getThing(i); if (!thing) { continue; } Item* item = thing->getItem(); if (!item) { continue; } Container* container = item->getContainer(); if (container) { containers.push_back(container); } else { const uint32_t worth = item->getWorth(); if (worth != 0) { moneyCount += worth; moneyMap.emplace(worth, item); } } } size_t i = 0; while (i < containers.size()) { Container* container = containers[i++]; for (Item* item : container->getItemList()) { Container* tmpContainer = item->getContainer(); if (tmpContainer) { containers.push_back(tmpContainer); } else { const uint32_t worth = item->getWorth(); if (worth != 0) { moneyCount += worth; moneyMap.emplace(worth, item); } } } } if (moneyCount < money) { return false; } for (const auto& moneyEntry : moneyMap) { Item* item = moneyEntry.second; if (moneyEntry.first < money) { internalRemoveItem(item); money -= moneyEntry.first; } else if (moneyEntry.first > money) { const uint32_t worth = moneyEntry.first / item->getItemCount(); const uint32_t removeCount = (money / worth) + 1; addMoney(cylinder, (worth * removeCount) - money, flags); internalRemoveItem(item, removeCount); break; } else { internalRemoveItem(item); break; } } } else { int32_t value; player->getStorageValue(currencyId, value); if (value < money) { return false; } player->addStorageValue(currencyId, value - money); } return true; } Next find this
      void Game::addMoney(Cylinder* cylinder, uint64_t money, uint32_t flags /*= 0*/) Replace the whole function with this
      void Game::addMoney(Cylinder* cylinder, uint64_t money, uint32_t flags /*= 0*/) { if (money == 0) { return; } if (Creature* creature = cylinder->getCreature()) { if (Player* player = creature->getPlayer()) { if(uint32_t currencyId = player->getNpcCurrencyId()){ int32_t value; player->getStorageValue(currencyId, value); player->addStorageValue(currencyId, value + money); return; } } } uint32_t crystalCoins = money / 10000; money -= crystalCoins * 10000; while (crystalCoins > 0) { const uint16_t count = std::min<uint32_t>(100, crystalCoins); Item* remaindItem = Item::CreateItem(ITEM_CRYSTAL_COIN, count); ReturnValue ret = internalAddItem(cylinder, remaindItem, INDEX_WHEREEVER, flags); if (ret != RETURNVALUE_NOERROR) { internalAddItem(cylinder->getTile(), remaindItem, INDEX_WHEREEVER, FLAG_NOLIMIT); } crystalCoins -= count; } uint16_t platinumCoins = money / 100; if (platinumCoins != 0) { Item* remaindItem = Item::CreateItem(ITEM_PLATINUM_COIN, platinumCoins); ReturnValue ret = internalAddItem(cylinder, remaindItem, INDEX_WHEREEVER, flags); if (ret != RETURNVALUE_NOERROR) { internalAddItem(cylinder->getTile(), remaindItem, INDEX_WHEREEVER, FLAG_NOLIMIT); } money -= platinumCoins * 100; } if (money != 0) { Item* remaindItem = Item::CreateItem(ITEM_GOLD_COIN, money); ReturnValue ret = internalAddItem(cylinder, remaindItem, INDEX_WHEREEVER, flags); if (ret != RETURNVALUE_NOERROR) { internalAddItem(cylinder->getTile(), remaindItem, INDEX_WHEREEVER, FLAG_NOLIMIT); } } }  
      npc.cpp
      Look for this
      pugi::xml_attribute attr; if ((attr = npcNode.attribute("speed"))) { baseSpeed = pugi::cast<uint32_t>(attr.value()); } else { baseSpeed = 100; } Right underneath that you are going to place this.
      if ((attr = npcNode.attribute("currency"))) { currency = pugi::cast<uint32_t>(attr.value()); }  
      npc.h
      Look for this
      bool isPushable() const final { return walkTicks > 0; } Place this right underneath
      uint32_t getCurrencyId() const { return currency; } Look for this
      uint32_t walkTicks; Place this right underneath
      uint32_t currency;  
      player.cpp
      Find this
      void Player::openShopWindow(Npc* npc, const std::list<ShopInfo>& shop) Replace that function with this
      void Player::openShopWindow(Npc* npc, const std::list<ShopInfo>& shop) { shopItemList = shop; sendShop(npc); sendSaleItemList(npc); } Next find this
      bool Player::updateSaleShopList(const Item* item) Replace that function with this
      bool Player::updateSaleShopList(const Item* item) { uint16_t itemId = item->getID(); if (itemId != ITEM_GOLD_COIN && itemId != ITEM_PLATINUM_COIN && itemId != ITEM_CRYSTAL_COIN) { auto it = std::find_if(shopItemList.begin(), shopItemList.end(), [itemId](const ShopInfo& shopInfo) { return shopInfo.itemId == itemId && shopInfo.sellPrice != 0; }); if (it == shopItemList.end()) { const Container* container = item->getContainer(); if (!container) { return false; } const auto& items = container->getItemList(); return std::any_of(items.begin(), items.end(), [this](const Item* containerItem) { return updateSaleShopList(containerItem); }); } } if (client) { client->sendSaleItemList(shopOwner, shopItemList); } return true; } Next you are going to look for
      uint64_t Player::getMoney() const Now right underneath that function you are going to place these.
      uint64_t Player::getMoney(Npc* npc) const { uint64_t cash; setNpcCurrencyId(npc); uint32_t currencyId = getNpcCurrencyId(); if (currencyId) { int32_t value; getStorageValue(currencyId, value); cash = (uint64_t)value; } else { cash = getMoney(); } return cash; } void Player::setNpcCurrencyId(Npc* npc) const{ currencyId = npc->getCurrencyId(); } uint32_t Player::getNpcCurrencyId() const { return currencyId; }  
      player.h
      Look for this
      uint64_t getMoney() const; Place this right underneath
      uint64_t getMoney(Npc*) const; void setNpcCurrencyId(Npc*) const; uint32_t getNpcCurrencyId() const; Find this
      void sendShop(Npc* npc) const { if (client) { client->sendShop(npc, shopItemList); } } Place this right underneath
      void sendSaleItemList(Npc* npc) const { if (client) { client->sendSaleItemList(npc, shopItemList); } } Find this
      uint32_t manaMax; Place this right underneath
      mutable uint32_t currencyId;  
      protocolgame.cpp
      Now find this function
      void ProtocolGame::sendSaleItemList(const std::list<ShopInfo>& shop) Place this right underneath
      void ProtocolGame::sendSaleItemList(Npc* npc, const std::list<ShopInfo>& shop) { NetworkMessage msg; msg.addByte(0x7B); msg.add<uint64_t>(player->getMoney(npc)); std::map<uint16_t, uint32_t> saleMap; if (shop.size() <= 5) { // For very small shops it's not worth it to create the complete map for (const ShopInfo& shopInfo : shop) { if (shopInfo.sellPrice == 0) { continue; } int8_t subtype = -1; const ItemType& itemType = Item::items[shopInfo.itemId]; if (itemType.hasSubType() && !itemType.stackable) { subtype = (shopInfo.subType == 0 ? -1 : shopInfo.subType); } uint32_t count = player->getItemTypeCount(shopInfo.itemId, subtype); if (count > 0) { saleMap[shopInfo.itemId] = count; } } } else { // Large shop, it's better to get a cached map of all item counts and use it // We need a temporary map since the finished map should only contain items // available in the shop std::map<uint32_t, uint32_t> tempSaleMap; player->getAllItemTypeCount(tempSaleMap); // We must still check manually for the special items that require subtype matches // (That is, fluids such as potions etc., actually these items are very few since // health potions now use their own ID) for (const ShopInfo& shopInfo : shop) { if (shopInfo.sellPrice == 0) { continue; } int8_t subtype = -1; const ItemType& itemType = Item::items[shopInfo.itemId]; if (itemType.hasSubType() && !itemType.stackable) { subtype = (shopInfo.subType == 0 ? -1 : shopInfo.subType); } if (subtype != -1) { uint32_t count; if (!itemType.isFluidContainer() && !itemType.isSplash()) { count = player->getItemTypeCount(shopInfo.itemId, subtype); // This shop item requires extra checks } else { count = subtype; } if (count > 0) { saleMap[shopInfo.itemId] = count; } } else { std::map<uint32_t, uint32_t>::const_iterator findIt = tempSaleMap.find(shopInfo.itemId); if (findIt != tempSaleMap.end() && findIt->second > 0) { saleMap[shopInfo.itemId] = findIt->second; } } } } uint8_t itemsToSend = std::min<size_t>(saleMap.size(), std::numeric_limits<uint8_t>::max()); msg.addByte(itemsToSend); uint8_t i = 0; for (std::map<uint16_t, uint32_t>::const_iterator it = saleMap.begin(); i < itemsToSend; ++it, ++i) { msg.addItemId(it->first); msg.addByte(std::min<uint32_t>(it->second, std::numeric_limits<uint8_t>::max())); } writeToOutputBuffer(msg); }  
      protocolgame.h
      Find this
      void sendSaleItemList(const std::list<ShopInfo>& shop); Place this right underneath
      void sendSaleItemList(Npc* npc, const std::list<ShopInfo>& shop);  
      luascript.cpp
      Find
      int LuaScriptInterface::luaPlayerAddMoney(lua_State* L) Replace that whole function with this
      int LuaScriptInterface::luaPlayerAddMoney(lua_State* L) { // player:addMoney(money[, currencyId]) uint64_t money = getNumber<uint64_t>(L, 2); uint32_t currencyId = getNumber<uint32_t>(L, 3); Player* player = getUserdata<Player>(L, 1); if (player) { if (currencyId) { int32_t value; player->getStorageValue(currencyId, value); player->addStorageValue(currencyId, value + money); } else { g_game.addMoney(player, money); } pushBoolean(L, true); } else { lua_pushnil(L); } return 1; } Next find this function which should be right below it.
      int LuaScriptInterface::luaPlayerRemoveMoney(lua_State* L) Replace that whole function with this
      int LuaScriptInterface::luaPlayerRemoveMoney(lua_State* L) { // player:removeMoney(money[, currencyId]) Player* player = getUserdata<Player>(L, 1); if (player) { uint64_t money = getNumber<uint64_t>(L, 2); uint32_t currencyId = getNumber<uint32_t>(L, 3); if (currencyId) { int32_t value; player->getStorageValue(currencyId, value); if (value < money) { pushBoolean(L, false); return 1; } player->addStorageValue(currencyId, value - money); pushBoolean(L, true); } else { pushBoolean(L, g_game.removeMoney(player, money)); } } else { lua_pushnil(L); } return 1; }  
    • Por Diego767
      Boa tarde, nao sei se estou no lugar certo para fazer a pergunta, mas vamos tentar...
      Meu ot esta rodando bem, porem os itens e monstros mais novos nao tem (cobra sword, terra helmet, e nem os monstros que dropam isso)
      O que eu poderia fazer para add eles, os itens e os monstros? 
    • Por .Smile
      Olá a todos, atualmente estou aprendendo programação e desenvolvendo um Servidor, uma das coisas chatas a se fazer era ficar alternando entre um Personagem PLAYER e outro GOD para testar algumas coisas, com esses 2 scripts eu resolvi esse problema.

      É um script simples que eu pretendo futuramente melhorá-lo.

      What does the command do?
      /adm - Transforma seu personagem em GOD e kika ele
      /player - Transforma seu personagem em PLAYER e kika ele
       
      LEMBRANDO QUE: Não é qualquer que consegue usar esse comando, você precisa ter dado a sua conta o acesso de god, assim podendo ter esse comando num Servidor Online com outros jogadores sem que os mesmos possam usar.

      \data\talkactions
      talkactions.xml
      Code: <talkaction words="/player" script="player.lua" /> <talkaction words="/adm" script="adm.lua" /> \data\talkactions\scripts 
      adm.lua
      Code: function onSay(player, words, param) if player:getAccountType() < ACCOUNT_TYPE_GOD then return false end local position = player:getPosition() player:setGroup(Group(3)) position:sendMagicEffect(14) player:remove() return false end \data\talkactions\scripts
      player.lua
      function onSay(player, words, param) if player:getAccountType() < ACCOUNT_TYPE_GOD then return false end local position = player:getPosition() player:setGroup(Group(1)) position:sendMagicEffect(13) player:remove() return false end  
    • Por EddyHavoc
      Resumo
      A maneira atual para implementar Modal Window é um pouco complicada. Atualmente precisamos cria-la em algum lugar, registrar o evento, adicionar os botões em uma ordem específica, definir o ID da janela, dos botões e da escolha. Isso não é o ideal, então esta biblioteca foi criada pelo Non Sequitur para ajudar nisso. E eu estou trazendo para a OtServBrasil.

      Exemplo/ Tutorial Usando Modal Window
       
      Instalando
      Adicionar em data/lib/lib.lua dofile('data/lib/modalwindow.lua') Crie o arquivo modalwindow.lua com o seguinte conteúdo em data/lib if not modalWindows then modalWindows = { modalWindowConstructor = ModalWindow, nextFreeId = 500, windows = {} } end local MT = {} MT.__index = MT function ModalWindow(...) local args = {...} if type(args[1]) == 'table' then local self = setmetatable(args[1], MT) local id = modalWindows.nextFreeId self.id = id self.buttons = {} self.choices = {} self.players = {} self.created = false modalWindows.nextFreeId = id + 1 table.insert(modalWindows.windows, self) return self end return modalWindows.modalWindowConstructor(...) end function MT:setDefaultCallback(callback) self.defaultCallback = callback end function MT:addButton(text, callback) local button = {text = tostring(text), callback = callback} table.insert(self.buttons, button) return button end function MT:addButtons(...) for _, text in ipairs({...}) do table.insert(self.buttons, {text = tostring(text)}) end end function MT:addChoice(text) local choice = {text = tostring(text)} table.insert(self.choices, choice) return choice end function MT:addChoices(...) for _, text in ipairs({...}) do table.insert(self.choices, {text = tostring(text)}) end end function MT:setDefaultEnterButton(text) self.defaultEnterButton = text end function MT:setDefaultEscapeButton(text) self.defaultEscapeButton = text end function MT:setTitle(title) self.title = tostring(title) end function MT:setMessage(message) self.message = tostring(message) end local buttonOrder = { [4] = {3, 4, 2, 1}, [3] = {2, 3, 1}, [2] = {1, 2}, [1] = {1} } function MT:create() local modalWindow = modalWindows.modalWindowConstructor(self.id, self.title, self.message) local order = buttonOrder[math.min(#self.buttons, 4)] if order then for _, i in ipairs(order) do local button = self.buttons[i] modalWindow:addButton(i, button.text) button.id = i if button.text == self.defaultEnterButton then modalWindow:setDefaultEnterButton(i) elseif button.text == self.defaultEscapeButton then modalWindow:setDefaultEscapeButton(i) end end end for _, choice in ipairs(self.choices) do modalWindow:addChoice(_, choice.text) choice.id = _ end self.modalWindow = modalWindow end function MT:sendToPlayer(player) if not self.modalWindow then self:create() end player:registerEvent('ModalWindowHelper') self.players[player:getId()] = true return self.modalWindow:sendToPlayer(player) end Adicionar em data/creaturescripts/craturescripts.xml <event type="modalwindow" name="ModalWindowHelper" script="modalwindowhelper.lua" /> Crie o arquivo modalwindowhelper.lua com o seguinte conteúdo em data/creaturescripts/scripts/ function onModalWindow(player, modalWindowId, buttonId, choiceId) local modalWindow for _, window in ipairs(modalWindows.windows) do if window.id == modalWindowId then modalWindow = window break end end if not modalWindow then return true end local playerId = player:getId() if not modalWindow.players[playerId] then return true end modalWindow.players[playerId] = nil local choice = modalWindow.choices[choiceId] for _, button in ipairs(modalWindow.buttons) do if button.id == buttonId then local callback = button.callback or modalWindow.defaultCallback if callback then callback(button, choice) break end end end return true end  
      Pronto!
       
      Espero que gostem. Posteriormente irei postar um tutorial de como usar/ aplicar e alguns scripts utilizando a Biblioteca.
×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo