Jump to content

Recommended Posts

Eae galera, estava vendo alguns tópicos aqui do fórum e vi muita gente procurando issoe eu também procurei e não achei, então resolvi procurar,e  achei na OTLand e estou trazendo para cá, EU APENAS TRADUZI, NÃO TENHO NENHUM CRÉDITO POR ISSO.
 
Se eu não poder fazer isso por favor me avisem aqui no tópico que eu retiro.
 
Créditos SOMENTE do: cbrm (OTLand)
 
Tested on TFS 1.2, 10.77/78
Based on
 http://www.tibia.com/news/?subtopic=newsarchive&id=2486
219xauf.png
 
20p537s.gifOque tem?
Spoiler

*Custom depot como reward chest para armazenar o loot que não foi pego dos bosses.
*Recompensa individual para cada jogador que da hit no boss.
*Chance de loot determinado por % do dano causado ao boss.
*O player pode "pegar" seu reward container diretamente do corpo do boss.
*Recompensas não reclamadas são enviadas para os reward chests dos players online e offline quando o corpo apodrecer.
*Loot que não for pego sera apagados após sete dias de ser armazenado
*Os items apenas podem ser retirados do reward chest, e não pode colocar items lá dentro.
*Reward chests dos players são armazenados codificados, serialized tables on database
*Limite de exhaustion para abrir o reward chest, a fim de evitar o spam em sql queries.

 

 

20p537s.gifTo-do

Spoiler

*Dano recebido pelo boss leva a uma queda de % do loot.
*Quantidade de healers dada a boss slayers leva a uma queda de % do loot.
*Abrir reward chest com um inner depot.
*Definir os corpos dos bosses como um depot para torná-los mais realistar.

 

 
20p537s.gifChangelog
Spoiler

(0.1) lançamento inicial
(0.2) base64 coding para recompensas serializados
(0.3) correção com bosses com corpses infinitos
(0.4) correçao para os bosses com nomes minúsculos

 

 

20p537s.gifComentários

Spoiler

Esse é um sistema que eu fui contratado a escrever um ano atrás, Agora foi lançado com o consentimento do cliente. É parecido com o Tibia's Boss Reward recurso que permite que todos os jogadores que participaram de matar o boss pegue parte do seu loot. Ele ainda está muito longe da criação original, mas pelo menos é algo que muitos donos de OTS desejam. Eu convido todos os desenvolvedores, programadores e criadores de scripts que desejam melhorar este código, para que isso possa ficar mais perto da perfeição.

 

 
 
20p537s.gifAgradecimentos especiais para
Spoiler

@Dalkon, por dicas em C++
@gugahoa, pelas funções do loot
@Colandus and @Cykotitan, pelo string.diff function
@Printer, por atualizar as exhaustion functions

 

20p537s.gifInstruções de instalação

Execute a query na database

 

CREATE TABLE IF NOT EXISTS `player_rewardchest` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `player_id` int(11) NOT NULL,
    `reward` text NOT NULL,
    `date` bigint(20) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  FOREIGN KEY (`player_id`) REFERENCES `players` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;

src/const.h
Abaixo...

ITEM_MARKET = 14405

...Adicione:

ITEM_REWARD_CHEST = 21584,
REWARD_CHEST_DEPOT = 99,

src/depotchest.h
Abaixo...

explicit DepotChest(uint16_t _type);

 

...Adicione:

uint32_t getDepotId() const {
    return depotId;
}

void setDepotId(uint32_t id) {
    depotId = id;
}

 

Abaixo...

uint32_t maxDepotItems;

...Adicione:

uint32_t depotId;

src/depotchest.cpp
Abaixo...

maxDepotItems = 1500;

...Adicione:

depotId = 0;

Acima...

return Container::queryAdd(index, thing, count, flags, actor);

...Adicione:

if (actor != nullptr && getDepotId() == REWARD_CHEST_DEPOT) {
    return RETURNVALUE_NOTPOSSIBLE;
}

src/depotlocker.h
Acima...

//cylinder implementations

...Adicione:

void setMaxLockerItems(uint32_t maxitems) {
    maxSize = maxitems;
}

src/luascript.h
Acima...

static int luaContainerGetSize(lua_State* L);

...Adicione:

static int luaContainerGetContentDescription(lua_State* L);

src/luascript.cpp
Acima...

registerMethod("Container", "getSize", LuaScriptInterface::luaContainerGetSize);

...Adicione:

registerMethod("Container", "getContentDescription", LuaScriptInterface::luaContainerGetContentDescription);

Acima...

int LuaScriptInterface::luaContainerGetSize(lua_State* L)

...Adicione:

int LuaScriptInterface::luaContainerGetContentDescription(lua_State* L)
{
    // container:getContentDescription()
    Container* container = getUserdata<Container>(L, 1);
    if (container) {
        std::ostringstream ss;
        ss << container->getContentDescription();
        pushString(L, ss.str());
    } else {
        lua_pushnil(L);
    }
    return 1;
}

src/actions.cpp
Troque:

//depot container
if (DepotLocker* depot = container->getDepotLocker()) {
    DepotLocker* myDepotLocker = player->getDepotLocker(depot->getDepotId());
    myDepotLocker->setParent(depot->getParent()->getTile());
    openContainer = myDepotLocker;
    player->setLastDepotId(depot->getDepotId());
} else {
    openContainer = container;
}

Por:

//reward chest and depot container
if (item->getID() == ITEM_REWARD_CHEST) {
    DepotLocker* myRewardChest = player->getRewardChest();
    myRewardChest->setParent(item->getTile());
    openContainer = myRewardChest;
    player->setLastDepotId(REWARD_CHEST_DEPOT);
} else if (DepotLocker* depot = container->getDepotLocker()) {
    DepotLocker* myDepotLocker = player->getDepotLocker(depot->getDepotId());
    myDepotLocker->setParent(depot->getParent()->getTile());
    openContainer = myDepotLocker;
    player->setLastDepotId(depot->getDepotId());
} else {
    openContainer = container;
}

src/player.h
Abaixo...

DepotLocker* getDepotLocker(uint32_t depotId);

...Adicione:

DepotLocker* getRewardChest();

src/player.cpp
Abaixo...

DepotChest* depotChest = new DepotChest(ITEM_DEPOT);

...Adicione:

depotChest->setDepotId(depotId);

Acima...

void Player::sendCancelMessage(ReturnValue message) const

...Adicione:

DepotLocker* Player::getRewardChest()
{
    auto it = depotLockerMap.find(REWARD_CHEST_DEPOT);
    if (it != depotLockerMap.end()) {
        inbox->setParent(it->second);
        return it->second;
    }

    DepotLocker* rewardChest = new DepotLocker(ITEM_LOCKER1);
    rewardChest->setDepotId(REWARD_CHEST_DEPOT);
    rewardChest->setMaxLockerItems(1);
    rewardChest->internalAddThing(getDepotChest(REWARD_CHEST_DEPOT, true));
    depotLockerMap[REWARD_CHEST_DEPOT] = rewardChest;
    return rewardChest;
}

On player.cpp, container.cpp, inbox.cpp

Change:

if (!item->isPickupable()) {

 Por:

if (item->getID() != 21518 && !item->isPickupable()) {

Adicione em @ data/actions/actions.xml

<!-- Reward Chest System -->
<action itemid="21584" script="reward_chest.lua"/>
<action actionid="21584" script="reward_chest.lua"/>

Crie @ data/actions/scripts/reward_chest.lua

function onUse(player, item, fromPosition, target, toPosition, isHotkey)
    --Reward Chest
    if item:getId() == 21584 then
        if player:getExhaustion(REWARD_CHEST.STORAGE) > 0 then
            return player:sendCancelMessage('You need to wait ' .. string.diff(player:getStorageValue(REWARD_CHEST.STORAGE)-os.time()) .. ' before using this chest again.')
        end
        player:updateRewardChest()
    --Boss Corpse
    elseif item:getActionId() == 21584 then
        local reward = REWARD_CHEST.LOOT[tonumber(item:getAttribute('text'))][player:getGuid()]
        if reward ~= nil then
            local rewardBag = Container(doCreateItemEx(REWARD_CHEST.CONTAINER, 1))
            addContainerItems(rewardBag, reward)
            if player:getCapacity() < rewardBag:getCapacity() then
                return player:sendCancelMessage(RETURNVALUE_NOTENOUGHCAPACITY)
            end
            if player:addItemEx(rewardBag, false) == RETURNVALUE_NOERROR then
                REWARD_CHEST.LOOT[tonumber(item:getAttribute('text'))][player:getGuid()] = nil
                player:sendCancelMessage('You have picked up a reward container.')
            else
                player:sendCancelMessage(RETURNVALUE_NOTENOUGHROOM)
                return true
            end
        end
    end
    return false
end

Adicione @ data/creaturescripts/creaturescripts.xml

<event type="kill" name="RewardChest" script="reward_chest.lua"/>

Registre em @data/creaturescripts/scripts/login.lua

player:registerEvent("RewardChest")

Adicione @ data/items/items.xml

<item id="21518" article="a" name="reward container">
    <attribute key="weight" value="1800" />
    <attribute key="containersize" value="24" />
    <attribute key="slotType" value="backpack" />
</item>
<item id="21584" article="a" name="reward chest">
    <attribute key="type" value="depot" />
    <attribute key="containerSize" value="1" />
    <attribute key="description" value="This chest contains your rewards earned in battles." />
</item>

Add @ data/lib/core/player.lua

function Player.setExhaustion(self, value, time)
    return self:setStorageValue(value, time + os.time())
end

function Player.getExhaustion(self, value)
    local storage = self:getStorageValue(value)
    if storage <= 0 then
        return 0
    end
    return storage - os.time()
end

Crie em @ data/creaturescripts/scripts/reward_chest.lua

(download anexado nesse post)

 

Download

 

RELEMBRANDO CRÉDITOS APENAS DO CBRM DA OTLAND

Edited by kk4444
*Adicionar Imagens e Link de Download (see edit history)
Link to post
Share on other sites

  • 1 month later...
  • 3 weeks later...
  • 2 weeks later...
  • 5 weeks later...

MMHUCMQ.png  Esta é uma mensagem automática, este tópico foi movido para a área correta.
  Regras do fórum: http://www.tibiaking.com/forum/topic/1281-regras-gerais/#comment-7680

Este tópico foi movido:
De: Scripting OTServ > OTServ > Geral
Para: Scripting OTServ > OTServ > Sistemas e MODs

Marque a melhor resposta, deixando assim o tópico resolvido e ajudando outros membros a identificar a solução do problema.
Não dou suporte via PM, não insista. ✉

  wakon.here@gmail.com ★

 

Regras | Seções OTServ | Seções BOT

Link to post
Share on other sites

  • 2 months later...
  • 5 months later...
  • 3 weeks later...
  • 1 year later...
Em 20/01/2016 em 08:18, robi123 disse:

em que lugar que fica o bau ?

 

Você vai no arquivo que ele deixo disponível para baixar, abra ele e la você vera os seguintes campos:

BOSSES = {"bibby bloodbath", "chizzoron the distorter", "ferumbras",
            "furyosa", "gaz'haragoth", "ghazbaran", "hirintror",
            "jaul", "mad mage", "mawhawk", "morgaroth", "obujos",
            "ocyakao", "omrafir", "orshabaal", "raging mage",
            "tanjis", "the mutated pumpkin", "the pale count",
            "the welter", "tyrn", "white pale", "zulazza the corruptor",
            "zushuka"},

    LOOT = {"Platinum Coins","Crystal Coins"},            
    DECAY = {},

 

Onde esta em Vermelho você configura quais os monstros que terão esse sistema ativado ao morrer!

Onde esta em Azul você configura qual o loot que ficara disponivel apos o monstro morrer! (Obs: Não sei se do modo que eu coloquei vai funcionar, pois ainda não testei mais fica ai a dica.)

 

Em 22/04/2016 em 20:27, YeiB disse:

é normal que o que deve ir na rewardchest vem no corpo da criatura?

a reward chest vai vazia

reward.jpg

 

 

Sim é normal pois como foi explicado no link que o cara deixou disponível, apos o monstro morrer você e quem te ajudou a mata-lo poderão abrir esse loot e cada um terá um loot referente a quanto você ajudou a matar o mesmo.

Para configurar o loot só fazer da forma que expliquei acima para o @robi123

 

@nortonsky faça da forma que eu expliquei acima ;)  Se ajudei REP+ !!!

Em 26/10/2016 em 18:51, Matheus Junior disse:

Boa noite galera, Alguem que fez este sistema, poderia me ajudar, em como fazer mais detalhado pois ja li e reli...
estou iniciando agora e isto e um objetivo que estou atras e so achei este... obg desde ja

 

Tente fazer da forma que eu expliquei ai acima, se funcionar avise aqui! 

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 Marlon3
      Opa galera blz?  Então, estou precisando do script de Double Exp para tfs 1.1, 1.2. 
      Pra quem não sabe é um item que você da use e fica com o dobro de xp por um certo tempo
    • By Cat
      Atenção! Os arquivos disponibilizados abaixo são da versão 12.51!
      Para obter otserv 12.60 atualizado com novas áreas e novos gráficos acesse o github oficial do projeto: https://github.com/opentibiabr/otservbr-global
       
       
      ◄DATAPACK + DLLS►
      » OTX OtservBR Global 12.51 MediaFire (Scan)
                             » OtservBR Dlls & Executável (Windows 64x) MediaFire (Scan)
      »Correções e Atualizações Constantes GitHub

       
       
      ◄CLIENTS►
      » Tibia Client 12.51 MediaFire (Scan)
      (Para conectar ao cliente 12 (localhost), acesse usando 127.0.0.1_client.exe, localizado na pasta bin.)

       
       
      ◄WEB►
      » [GesiorAAC] Login.php para Tibia 12.51 MediaFire (Scan)
      (Salve o arquivo login.php na pasta do GesiorAAC e ws_login.php dentro na pasta pages.)
       
      » [MyAAC] Login.php para Tibia 12.51 MediaFire (Scan)
      (No Painel de Adm. do MyAAC, selecione Plugins e myaac-tibia12-login-v1.7.zip e clique em upload.
       
      » Tibia Store Images para 12.51
      https://tibiaking.com/topic/101207-gesioraac-znoteaac-myaac-tibia-store-1251/

       
      ◄IMAGENS►

       

       

       


       
      ◄INFORMAÇÕES►
       
       
       
      ◄Créditos►
      Desenvolvedores TFS
      Desenvolvedores OTX (Martyx)
      Desenvolvedores OTSERVBR
      Majesty
      GPedro
      Costallat
      Eduardo Dantas
      Gabriel Pedro
      Mateus
      Ibaah
      FakeShinoda
      marcosvf132
      HeberPcL
      Raphaellb
      Debone
      AndersonFaaria
      Oualid6496
      EPuncker
      Granoob
      Westwol
      Olimpotibia
      Newacc12
      Hygorrasec
      Fear Lucien
      Slavi Dodo
       
    • By luanluciano93
      Olá pessoal, resolvi criar um sistema de recompensa parecido com o sistema do tibia global para a versão 8.60, mas tie que fazer varias "gambiarras" para ele funcionar nesta versão.

      Para quem não conhece: http://www.tibiawiki.com.br/wiki/Loot#Sistema_de_Recompensas

      Basicamente meu sistema funciona da seguinte forma:
      • você determina as criaturas que irão funcionar com esse sistema (normalmente bosses).
      • durante a batalha com a criatura o sistema conta pontos aos jogadores por ataque, bloqueio e suporte ("healar" quem esta na batalha).
      • quando a criatura é morta o sistema cria um "loot" de acordo com os pontos e envia-o ao depot do jogador em uma bag determinada nas configurações.

      Primeiramente vamos criar o arquivo das configurações gerais, crie uma pasta dentro do "data" com o nome de sistemas e dentro cria um arquivo rewardchest.lua: 

      Depois em creaturescript crie dois arquivos:
      rewardchest_boss.lua:

      e rewardchest_pontos.lua: 

      Lembrando que em todas as criaturas que forem adicionadas ao sistema além de coloca-las no rewarchest.lua você deve add isso no xml do monstro: 
      <script> <event name="RewardChestDeath"/> <event name="RewardChestMonster"/> </script> E isso no creaturescript.xml: 
      <!-- Sistema de recompensa criado por luanluciano93 --> <event type="login" name="RewardChestLogin" event="script" value="rewardchest_pontos.lua"/> <event type="statschange" name="RewardChestStats" event="script" value="rewardchest_pontos.lua"/> <event type="death" name="RewardChestDeath" event="script" value="rewardchest_boss.lua"/> <event type="statschange" name="RewardChestMonster" event="script" value="rewardchest_boss.lua"/>
      Basicamente é isso, qualquer dúvida postem aqui ... abraços!

      LINK DO SCRIPT NO GITHUB: https://github.com/luanluciano93/ESTUDOS/tree/master/LUA/REWARD_SYSTEM_860
    • By BielZet
      Tudo bem Galerinha do TIBIAKING? 
      Bom eu tava com um projeto (Global 10.90) mais ai desisti (Pois Não teria tempo pra poder ta mexendo no servidor)
      Bom vamos la
      Antes de mais nada vou começar dizendo que o servidor ele e 100% (Lembrando que ta com todas as Mission)
      Bom oque o servidor contem ?
      --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
       •Pythius The Rotten Quest 100%
       •Task system, com bosses e (Com ranks)
       •Bank System (Funcionando)
       •Monstros 100% 
       •Trainer Offline 100%
       •Todas montarias; (Incluindo Montaria 10.82 e 10.90)
       •aming system funcionando 100%
       •Wrath of Emperor Quest
       •War System 100% (Só- Precisa ativar)
       •Market System 100%
       •War Anti-Entrosa (So Precisa Configurar)
       •POI 100%
       •Roshamull Completa100% 
       •Varios bugs de mapas removidos
       •Blood Herb Quest 100%
       • Npc Addoner
       •Chayenne Realm Quest
       •Warzone 1, 2 e 3
       •NPC dos Barcos (Cobrando Igual do global)
       •Lembrando que Todas as Quest ta funcionando
       •Todas as mission ta funcionando... (Quem não Gostar das mission, e só arrancar)
       •Adicionei Recompensa por Level (Só começa ganhar depois do level 30)
       (Cidades)
       •Ankrahmun (100%)
       •Ab'Dendriel (100%)
       •Carlin (100%)
       •Cormaya (100%)
       •Darashia (100%)
       •Edron (100%)
       •Farmine (100%)
       •Fibula (100%)
       •Greenshore (100%)
       •Kazordoon (100%)
       •Liberty Bay (100%)
       •Meluna (100%)
      •Mintwallin(100%)
       •Northport (100%)
       •Orc Land (Orc Fortress) (100%)
       •Outlaw Camp (100%)
       •Port Hope (100%)
       •Plains of Havoc (100%)
       •Rookgaard (100%)
       •Shadowthorn (Elven Village) (100%)
       •Svargrond (100%)
       •Thais (100%)
       •Venore(100%)
       •Yalahar(100%)
      •Gray Beach(100%)
      •Zao (100%)
      •Oramond Full(100%)
            •Entre varias outras que estão 100%•
       
      Bom aqui vai umas Imagem do Servidor
      Bom assim que você Complete RookGaard (Vai la no Oracle ele vai te manda)
      Aqui (Quem não gostar basta mudar no NPC - Oracle, para da a vocação e levar para cidade que bem quiser)

       

       
      Essa Mount so adicionei no servidor, Por adicionar então quem quiser restirar, e não souber como retira me diz que eu ajudo. 

      Bom proveito !
      Download
       
      Creditos
      Servidor ta em LINUX! Não esta compilado pra WIN
      Gostou da um REP+ AI
    • By rodolfoaugusto
      Olá pessoal, essa é a primeira versão do "Exercise Weapons",
       
      Sinta-se livre para sugerir modificações e ajudar a melhorá-lo!
      Caso você não tenha as sprites, pode usar outras, como a "Training Dummy" e outros items correspondentes.


       


      Crie o arquivo exercise_training.lua
      local skills = { [26397] = {id=SKILL_SWORD,voc=4}, [26398] = {id=SKILL_AXE,voc=4}, [26399] = {id=SKILL_CLUB,voc=4}, [26400] = {id=SKILL_DISTANCE,voc=3,range=CONST_ANI_SIMPLEARROW}, [26401] = {id=SKILL_MAGLEVEL,voc=2,range=CONST_ANI_ENERGY}, [26402] = {id=SKILL_MAGLEVEL,voc=1,range=CONST_ANI_FIRE}, } ------- CONFIG -----// local dummies = {26403,26404} local skill_gain = 1 -- per hit local gain_stamina = 60 local function start_train(pid,start_pos,itemid,fpos) local player = Player(pid) if player ~= nil then local pos_n = player:getPosition() if start_pos:getDistance(pos_n) == 0 and getTilePzInfo(pos_n) then if player:getItemCount(itemid) >= 1 then local exercise = player:getItemById(itemid,true) if exercise:isItem() then if exercise:hasAttribute(ITEM_ATTRIBUTE_CHARGES) then local charges_n = exercise:getAttribute(ITEM_ATTRIBUTE_CHARGES) if charges_n >= 1 then exercise:setAttribute(ITEM_ATTRIBUTE_CHARGES, (charges_n-1)) local required = 0 local currently = 0 local voc = player:getVocation() if skills[itemid].id == SKILL_MAGLEVEL then required = voc:getRequiredManaSpent(player:getBaseMagicLevel() + 1)/skill_gain currently = player:getManaSpent() player:addManaSpent(required - currently) else required = voc:getRequiredSkillTries(skills[itemid].id, player:getSkillLevel(skills[itemid].id)+1)/skill_gain currently = player:getSkillTries(skills[itemid].id) player:addSkillTries(skills[itemid].id, (required - currently)) end fpos:sendMagicEffect(CONST_ME_HITAREA) if skills[itemid].range then pos_n:sendDistanceEffect(fpos, skills[itemid].range) end player:setStamina(player:getStamina() + 60) if charges_n == 1 then exercise:remove(1) return true end local training = addEvent(start_train, voc:getAttackSpeed(), pid,start_pos,itemid,fpos) else exercise:remove(1) stopEvent(training) end end end end else stopEvent(training) end else stopEvent(training) end return true end function onUse(player, item, fromPosition, target, toPosition, isHotkey) local start_pos = player:getPosition() if target:isItem() then if isInArray(dummies,target:getId()) then if not skills[item.itemid].range and (start_pos:getDistance(target:getPosition()) > 1) then stopEvent(training) return false end if not player:getVocation():getId() == skills[item.itemid].voc or not player:getVocation():getId() == (skills[item.itemid].voc+4) then stopEvent(training) return false end player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "You started training.") start_train(player:getId(),start_pos,item.itemid,target:getPosition()) end end return true end  
      Adicione essa linha em actions.xml
       <!-- Training -->     <action fromid="26397" toid="26402" script="exercise_training.lua" allowfaruse="1"/>  
      Em events.xml 

      - Você vai alterar a parte (enable="0" para "1")
      <event class="Player" method="onTradeRequest" enabled="1" />  
      Em /events/scripts/player.lua
      Adicione essa linha no início do arquivo
      local exercise_ids = {26397,26398,26399,26400,26401,26402}
      - Agora vá até a função function PlayerMoveItem e adicione abaixo:
        -- Exercise Weapons     if isInArray(exercise_ids,item.itemid) then         self:sendCancelMessage('You cannot move this item outside this container.')         return false     end
      - Na função function PlayerOnTradeRequest adicione essa linha abaixo:
        if isInArray(exercise_ids,item.itemid) then         return false     end  
       
      Espero que gostem e seja útil.
  • Recently Browsing   0 members

    No registered users viewing this page.


×
×
  • Create New...

Important Information

Confirmação de Termo