Ir para conteúdo
  • Cadastre-se

/adm para virar GOD /player para virar PLAYER


Posts Recomendados

  • Respostas 9
  • Created
  • Última resposta

Top Posters In This Topic

Top Posters In This Topic

Popular Posts

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 coisa

Parabéns, seu tópico de conteúdo foi aprovado! Muito obrigado pela sua contribuição, nós do Tibia King agradecemos. Seu conteúdo com certeza ajudará à muitos outros, você recebeu +1 REP.  

@.Smile esqueceu de adicionar que o script foi feito para as versões 1.x.   @diarmaint certifique-se da que a distro do seu servidor seja 1.x.   @Nolis não esqueça da reputação do

Parabéns, seu tópico de conteúdo foi aprovado!
Muito obrigado pela sua contribuição, nós do Tibia King agradecemos.
Seu conteúdo com certeza ajudará à muitos outros, você recebeu +1 REP.

  Mostrar conteúdo oculto

 

Link para o post
Compartilhar em outros sites

Muito bom, isso é muito útil.

@.Smile Dando esse problema

  Citar

data/talkactions/scripts/adm.lua:onSay
Description:
data/talkactions/scripts/adm.lua:2: attempt to index local 'player' (a number value)
stack traceback:
        data/talkactions/scripts/adm.lua:2: in function <data/talkactions/scripts/adm.lua:1>

Mostrar mais  

 

Editado por diarmaint (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

@.Smile esqueceu de adicionar que o script foi feito para as versões 1.x.

 

@diarmaint certifique-se da que a distro do seu servidor seja 1.x.

 

@Nolis não esqueça da reputação do membro ao aprovar um tópico!

 

                                                              ezgif-1-98aab239f3.gif.1a897c9c3225228909e7b356a5cfb8e4.gif

Link para o post
Compartilhar em outros sites
  Em 29/01/2019 em 15:22, diarmaint disse:

Muito bom, isso é muito útil.

@.Smile Dando esse problema

 

 

Expand   Mostrar mais  

Esse sistema é apenas para Servidores que possuem a Source 1.x geralmente servidores de versão 10+ como o KotZletY falou.

 

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 Under
      Após anos sem contribuir com um servidor fico feliz em lançar essa versão com muitas correções!

      Está versão é a versão OPEN_BETA.

      Que pode ser testada aqui. (Online até dia 25/05/2023)

      Foram corrigos muitos bugs e existem diversas melhorias em muitos dos sistemas existentes.

      Vocês podem encontrar as Libs que devem estar com uns 30% desses novos sistemas que foram adicionados e podem testar ou usar os códigos.

      O servidor esta online a 120+ dias, foi construído com XP 1 e bateu 66 Players Online.

      O ideal é usar este servidor em low rate.

      Atualizações

      Verifique a pagina do facebook para saber todas as atualizações!
      Se você curtiu acompanhe a pagina para acompanha o lançamento do jogo oficial!
       
      Importante
       

      A cada onda do nosso sistema de incursões, você terá a chance de encontrar um Pokémon Shiny raro e, após a terceira onda, um chefe shiny ainda mais raro aparecerá, oferecendo recompensas valiosas para os treinadores ousados o suficiente para enfrentá-lo.
      Utilize seus tokens de incursão para reiniciar o sistema e tentar novamente.

      Para saber sobre todas as novidades Por favor considere olhar nossa pagina,

      https://www.facebook.com/pokexadventure/photos
       
      Imagens
       
       
      Downloads

      Para configurar basta substituir a pasta data que você pode encontrar fazendo download da source, cole a pasta data baixa do Pokexadventure e divirta-se!

      Sources

      pokexadventure_open_beta_datapack.rar

      DLLS + Executaveis (Windows)

      OTC
       
      (mediafire.com)
       
      Website
       
      https://github.com/otsoft/myaac

      Ferramentas : 
      auto_restarter_windows.bat

      RME 3.5 ou superior.

      Object builder 10.98 Support ou superior.

      Item editor 10.98 Support ou superior.

      Tutoriais para Compilações
       

      Créditos : @Underewar @pota
    • Por Zayon Owatari
      PokeFans é um servidor feito em cima base disponibilizada pelo @pota. No inicio era um projeto para estudar a TFS 1.2, visto que sempre trabalhei com 0.3.6.
      Fiquei maravilhado com a simplicidade e as possibilidades quase infinitas da base. Comecei a me dedicar mais e eventualmente nos tornamos um servidor sério.
       
      O PokeFans possui diversos sistemas novos que foram implementados em cima da base POTA, muitos mesmos, seria incapaz de nomear todos neste post, então deixo o link do https://trello.com/b/ELrkzeTi/pokefans
       
      O servidor era muito popular por um tempo, atingindo números bem altos para um Poketibia (100 ~ 120 players), mas eventualmente tivemos problemas sérios com lag,
      não sei se por alguém atacando, conflito de código causado pela quantidade de mudanças que fiz, fato é que após muito buscar uma resposta, finalmente consegui resolver o lag, mas não sem antes perder certa de 70% da player base.
      Junto à isso tive problemas pessoas sérios e tudo isso acabou me desmotivando bastante, entretanto, PokeFans pra mim foi uma ótima fase, fiz muitos amigos, tive bons momentos e aprendi ainda mais sobre lua, c++ e até esse HTML esquisito que usamos no OTC. Por isso não podia deixar a base mofando no meu drive, ela merece estar online e proporcionar bons momentos à todos.
       
      E com esta longa carta introdutória, com vocês, PokeFans.
       
      IMAGENS/SISTEMAS/CONTEUDO
       
      DOWNLOAD
      https://mega.nz/file/zVBVgKIZ#mfJZjw93ir3Rrpb05qfnafMMw9dlU3KJL9hLUQCXoV8
      https://www.mediafire.com/file/ejry9qxpe71mkvz/pokefans.rar/file
      SCAN
      https://www.virustotal.com/gui/url/f5da18695fff6d14f92c75e6d211de27c450abc5c12bfe861466c6ee9ed37578/detection
      https://www.virustotal.com/gui/url/d750e2fad1faab64b5f549c854ecddb03a27ff938e03981f0f696aa16eb4a818?nocache=1
      (Deu flag ESTsecurity - Malicious, não faço ideia do que seja, se alguém puder me auxiliar no que seja)
       
      OBSERVAÇÕES
      Não prestarei suporte à base, entretanto, atuo como freelancer de luascript e modulos para OTC, você pode entrar em contato comigo pelo Discord: zayonowatari
      Para abrir o mapa no Remeres você precisa de um SPR/DAT sem transparência, basta salvar sem transparência diretamente do object builder.
      Caso você tenha gostado da base e tenha interesse em fazer uma doação, utilize essa chave pix: f3cb7525-2b8c-47f8-8db6-876c8cd68bde
       
      CRÉDITOS
      @pota - por todo o seu trabalho e humildade em disponibilizar sua base inicialmente, sem ela não estariamos aqui.
      theforgottenserver - sem eles nenhuma base estaria aqui.
      OTLand e Tibiaking - ambas as comunidades me auxiliaram a vida toda com todas as dúvidas que tive, respeito máximo à todos que fazem parte disso.
    • Por Mask Ghoul
      Olá Tibiaking
      Hoje vim trazer como aumentar Efeitos / Missile na source TFS e OTX 1.3 Utilize 8.60 OLDCLIENT estendida unit16
      então resolvi eu mesmo mexer e consegui achar e estou trazendo para vocês!

      Esse Tópico é especifico para TFS E OTX 1.3, para que assim você possa aumentar o limite de efeitos no Client, e usar mais de 2k efeitos, e mais de 500 efeitos em Distância.  Vale lembra também que você não é obrigado a mudar em ambos, se você quiser apenas aumentar o Limite de Efeitos para mais de 2k, então mude apenas ele, caso queria aumentar apenas os Efeitos que são lançados a distância(ShootEffects ou DistanceEffect), caso queria os dois, use ambos. 
       
      Vamos começar em Magic Effects e DistanceShoot:
       
      Boa sorte vcs ?
      Recompila Source LINUX / Windows TFS E OTX 1.3

       
      Então é isso ae, qualquer erro só comentar para que eu possar tentar ajudar.
       
      Tópico exclusivo do Tibaking, proibido posta em outro site, blog ou fórum! 
    • Por Erimyth
      Este script funciona perfeitamente qual quer problema comente no topico.
      basta ser adicionado em action.xml com um action e adicionado ao mapa.
      local t = { players = { -- posições que os players devem ficar ao puxar a alavanca [1] = Position(33395,32661,6), [2] = Position(33394,32662,6), [3] = Position(33395,32662,6), [4] = Position(33395,32663,6), [5] = Position(33396,32662,6) }, boss = {name = "Scarlett Etzel", create_pos = Position(33396,32642,6)}, destination = Position(33395,32656,6), -- posição para qual os players serão teleportados cooldown = {0, "sec"}, -- tempo para ser teleportado novamente. Ex.: {2, "sec"}, {5, "min"}, {10, "hour"}, {3, "day"} storage = 56482 -- storage não utilizado no seu servidor } function onUse(player, item, fromPosition, target, toPosition, isHotkey) local players, tab = {}, t.players for i = 1, #tab do local tile = Tile(tab) if tile then local p = Player(tile:getTopCreature()) if p then if p:getStorageValue(t.storage) <= os.time() then players[#players + 1] = p:getId() end end end end if #players == 0 then player:sendCancelMessage("One or all players did not wait " .. getStrTime(t.cooldown) .. " to go again.") return true end for i = 1, #tab do local playerTile = Tile(tab) local playerToGo = Player(playerTile:getTopCreature()) if playerToGo then if isInArray(players, playerToGo:getId()) then playerToGo:setStorageValue(t.storage, mathtime(t.cooldown) + os.time()) playerTile:relocateTo(t.destination) tab:sendMagicEffect(CONST_ME_POFF) end end end t.destination:sendMagicEffect(CONST_ME_TELEPORT) Game.createMonster(t.boss.name, t.boss.create_pos) item:transform(item.itemid == 36319 or 1946 or 1945) return true end local boss_room = {fromPos = Position(33386, 32639, 6), toPos = Position(33405, 32659, 6)} local bossplayer = Player(cid) local exit = Position(33395, 32659, 6) if bossplayer and isInRange(bossplayer:getPosition(), boss_room.fromPos, boss_room.toPos) then bossplayer:teleportTo(exit) end function mathtime(table) -- by dwarfer local unit = {"sec", "min", "hour", "day"} for i, v in pairs(unit) do if v == table[2] then return table[1](60^(v == unit[4] and 2 or i-1))(v == unit[4] and 24 or 1) end end return error("Bad declaration in mathtime function.") end function getStrTime(table) -- by dwarfer local unit = {["sec"] = "second",["min"] = "minute",["hour"] = "hour",["day"] = "day"} return tostring(table[1].." "..unit[table[2]]..(table[1] > 1 and "s" or "")) end
      ? Crédito total ao Desenvolvedor que disponibilizou para toda nossa comunidade: @Underewar
      Obrigado pela Contribuição!
    • 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; }  
  • Estatísticas dos Fóruns

    96837
    Tópicos
    519571
    Posts



×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo