Ir para conteúdo
Pzyxho

[Encerrado] Problema ao adicionar novo slot no servidor

Posts Recomendados

Bom, vou ser o mais direto possível:

Estou tentando adicionar um novo slot no servidor, de versão 8.54 e TFS 0.4, mudei nas sources e já as compilei com sucesso, segue abaixo no spoiler as alterações feitas na mesma:

 

 

items.h

#define ITEMS 13000
#define SLOTP_WHEREEVER 0xFFFFFFFF
#define SLOTP_HEAD 1 << 0
#define SLOTP_NECKLACE 1 << 1
#define SLOTP_BACKPACK 1 << 2
#define SLOTP_ARMOR 1 << 3
#define SLOTP_RIGHT 1 << 4
#define SLOTP_LEFT 1 << 5
#define SLOTP_LEGS 1 << 6
#define SLOTP_FEET 1 << 7
#define SLOTP_RING 1 << 8
#define SLOTP_AMMO 1 << 9
#define SLOTP_DEPOT 1 << 10
#define SLOTP_TWO_HAND 1 << 11
#define SLOTP_EYE 1 << 15
#define SLOTP_HAND SLOTP_LEFT | SLOTP_RIGHT

 

 

items.cpp

else if(tmpStrValue == "eye")
{
      it.slotPosition |= SLOTP_EYE;
      it.wieldPosition = SLOT_EYE;
}

 

 

movement.cpp

else if(tmpStrValue == "eye")
      slot = SLOTP_EYE;

 

case SLOT_EYE:
       slotp = SLOTP_EYE;
       break;

 

player.cpp

if((item->getSlotPosition() & SLOTP_HEAD) || (item->getSlotPosition() & SLOTP_NECKLACE) ||
	(item->getSlotPosition() & SLOTP_BACKPACK) || (item->getSlotPosition() & SLOTP_ARMOR) ||
	(item->getSlotPosition() & SLOTP_LEGS) || (item->getSlotPosition() & SLOTP_FEET) ||
	(item->getSlotPosition() & SLOTP_RING) || (item->getSlotPosition() & SLOTP_EYE))
	ret = RET_CANNOTBEDRESSED;

 

case SLOT_EYE:
        if(item->getSlotPosition() & SLOTP_EYE)
                ret = RET_NOERROR;
        break;

 

creature.h

enum slots_t
{
    SLOT_PRE_FIRST = 0,
    SLOT_WHEREEVER = SLOT_PRE_FIRST,
    SLOT_FIRST = 1,
    SLOT_HEAD = SLOT_FIRST,
    SLOT_NECKLACE = 2,
    SLOT_BACKPACK = 3,
    SLOT_ARMOR = 4,
    SLOT_RIGHT = 5,
    SLOT_LEFT = 6,
    SLOT_LEGS = 7,
    SLOT_FEET = 8,
    SLOT_RING = 9,
    SLOT_AMMO = 10,
    SLOT_DEPOT = 11,
    SLOT_LAST = SLOT_DEPOT,
    SLOT_HAND = 12,
    SLOT_EYE = 15,
    SLOT_TWO_HAND = SLOT_HAND
};

 

enums.h

enum ConditionId_t
{
    CONDITIONID_DEFAULT = -1,
    CONDITIONID_COMBAT = 0,
    CONDITIONID_HEAD,
    CONDITIONID_NECKLACE,
    CONDITIONID_BACKPACK,
    CONDITIONID_ARMOR,
    CONDITIONID_RIGHT,
    CONDITIONID_LEFT,
    CONDITIONID_LEGS,
    CONDITIONID_FEET,
    CONDITIONID_RING,
    CONDITIONID_EYE,
    CONDITIONID_AMMO,
    CONDITIONID_OUTFIT
};

 

Após as sources, o único local em que encontrei nos scripts em lua, foi no 'data/lib/000-constant.lua' e deixei assim:

CONST_SLOT_FIRST = 1
CONST_SLOT_HEAD = CONST_SLOT_FIRST
CONST_SLOT_NECKLACE = 2
CONST_SLOT_BACKPACK = 3
CONST_SLOT_ARMOR = 4
CONST_SLOT_RIGHT = 5
CONST_SLOT_LEFT = 6
CONST_SLOT_LEGS = 7
CONST_SLOT_FEET = 8
CONST_SLOT_RING = 9
CONST_SLOT_AMMO = 10
CONST_SLOT_EYE = 15
CONST_SLOT_LAST = CONST_SLOT_AMMO

Deixei um item no 'data/items/items.xml' com o slotType="eye" que foi criado, e fiz as seguintes alterações no OTClient:


modules/game_inventory/inventory.lua

InventorySlotStyles = {
  [InventorySlotHead] = "HeadSlot",
  [InventorySlotNeck] = "NeckSlot",
  [InventorySlotBack] = "BackSlot",
  [InventorySlotBody] = "BodySlot",
  [InventorySlotRight] = "RightSlot",
  [InventorySlotLeft] = "LeftSlot",
  [InventorySlotLeg] = "LegSlot",
  [InventorySlotFeet] = "FeetSlot",
  [InventorySlotFinger] = "FingerSlot",
  [InventorySlotAmmo] = "AmmoSlot",
  [InventorySlotEye] = "EyeSlot"
}

 

modules/game_inventory/inventory.otui

EyeSlot < InventoryItem
  id: slot15
  image-source: /images/game/slots/eye
  &position: {x=65535, y=14, z=0}

e

MiniWindow
  id: inventoryWindow
  !text: tr('Inventory')
  icon: /images/topbuttons/inventory
  height: 175
  @onClose: modules.game_inventory.onMiniWindowClose()
  &save: true
  MiniWindowContents
    HeadSlot
      anchors.top: parent.top
      anchors.horizontalCenter: parent.horizontalCenter
      margin-top: 3
    BodySlot
      anchors.top: prev.bottom
      anchors.horizontalCenter: prev.horizontalCenter
      margin-top: 3
    LegSlot
      anchors.top: prev.bottom
      anchors.horizontalCenter: prev.horizontalCenter
      margin-top: 3
    FeetSlot
      anchors.top: prev.bottom
      anchors.horizontalCenter: prev.horizontalCenter
      margin-top: 3
    NeckSlot
      anchors.top: slot1.top
      anchors.right: slot1.left
      margin-top: 10
      margin-right: 5
    LeftSlot
      anchors.top: prev.bottom
      anchors.horizontalCenter: prev.horizontalCenter
      margin-top: 3
    FingerSlot
      anchors.top: prev.bottom
      anchors.horizontalCenter: prev.horizontalCenter
      margin-top: 3
    BackSlot
      anchors.top: slot1.top
      anchors.left: slot1.right
      margin-top: 10
      margin-left: 5
    RightSlot
      anchors.top: prev.bottom
      anchors.horizontalCenter: prev.horizontalCenter
      margin-top: 3
    AmmoSlot
      anchors.top: prev.bottom
      anchors.horizontalCenter: prev.horizontalCenter
      margin-top: 3
    EyeSlot
      anchors.top: prev.bottom
      anchors.horizontalCenter: prev.horizontalCenter
      margin-top: 3
    PurseButton
      margin-top: 3
      anchors.top: prev.bottom
      anchors.horizontalCenter: prev.horizontalCenter

 

modules/gamelib/player.lua

InventorySlotOther = 0
InventorySlotHead = 1
InventorySlotNeck = 2
InventorySlotBack = 3
InventorySlotBody = 4
InventorySlotRight = 5
InventorySlotLeft = 6
InventorySlotLeg = 7
InventorySlotFeet = 8
InventorySlotFinger = 9
InventorySlotAmmo = 10
InventorySlotPurse = 11
InventorySlotEye = 15

InventorySlotFirst = 1
InventorySlotLast = 10

 

 

Com todas estas alterações, o que foi feito:

  • O slot foi adicionado com sucesso no OTClient, aparecendo sem erros, com imagem e posicionado;
  • O console não encontrou erro ao debugar o items.xml (testei um tipo aleatório, e dá erro o erro padrão das sources, então o tipo "eye" está correto nas sources);
  • Dei /i em um item do tipo "eye" pra ver se o mesmo iria para o slot, mesmo caso não existisse graficamente, ele deveria ficar salvo nos dados do personagem no banco de dados, e isto não ocorreu, logo o problema está entre as sources e o client;

 

Enfim, nas sources o tipo "eye" foi criado, mas ainda não é reconhecido verdadeiramente, espero que alguém possa me ajudar, segue em anexo as sources e todos os arquivos que citei ter editado:

Please login or register to see this attachment.

Compartilhar este post


Link para o post
Compartilhar em outros sites
A questão neste tópico de suporte foi encerrada por falta de respostas. Este tópico está fechado e foi movido para

Please login or register to see this link.

.

+ Caso a dúvida não tenha sido resolvida você poderá criar outro tópico solicitando ajuda.
* Lembre-se que é permitido dar UP no tópico a cada 24 horas para assim o destacar e manter movimentado.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante
Este tópico está impedido de receber novos posts.

  • Conteúdo Similar

    • Por Sphynx
      Olá galera, vocês conhecem as lendas dos Trolls que de baixo de uma ponte? Eles estão sempre na espreita, aguardando alguém para roubar, assassinar, estuprar e comer suas almas (as últimas partes são brincadeira). Me baseando nessa lenda eu fiz esse simples script, é um dos primeiros códigos que consigo desenvolver sozinho(tive ajuda), eu espero que ajude alguém em algum lugar do tempoespaço, é um script ótimo se você assim como eu gosta de pontes e também sempre teve a vontade de incrementar alguns de seus mapas com scripts.


      Please login or register to see this attachment.


      Please login or register to see this attachment.

        1º. Acesse a pasta raiz do seu servidor, logo após siga o seguinte caminho: data/movements e abra o arquivo movements.xml. O código que você devera adicionar dentro deste arquivo está listado abaixo.
      <movevent type="StepIn" actionid="DigiteONumeroDeUmaActionAqui" event="script" value="ponte.lua"/>  
      2º. Dentro de data/movements abra a pasta 'scripts' e crie um arquivo .lua nomeado de 'ponte', dentro deste adicione o seguinte código.
      function onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor) local configuration = { monstrosTime = 1*5*1000, -- tempo até a criatura aparecer tempoDeStorage = 1*20*1000, -- em quanto tempo será removido a storage e se tornará possivel as criaturas resurgirem storage = 987459, -- numero da storage monsters = { [1] = {name = "Troll Champion", pos = {x = 1001, y = 1110, z = 9}}, -- Nome, quantidade e posição dos monstros, altere a vontade [2] = {name = "Troll", pos = {x = 1000, y = 1107, z = 9}}, [3] = {name = "Troll", pos = {x = 1007, y = 1109, z = 9}} } } if isPlayer(cid) == true then if getPlayerStorageValue(cid, configuration.storage) < 1 then doCreatureSay(cid, "A ponte não parece segura e quando você dá o primeiro passo ouve um grunhido e nota a presença de um ser estranho.", TALKTYPE_ORANGE_1) -- MSG que você quer exibir addEvent(function() for k, v in pairs(configuration.monsters) do doCreateMonster(v.name, v.pos) end end, configuration.monstrosTime) setPlayerStorageValue(cid, configuration.storage, 1) addEvent(function() setPlayerStorageValue(cid, configuration.storage, 0) end, configuration.tempoDeStorage) end end return true end  
      3º. Inicie o seu servidor e adicione o número da 'ActionID' que você inseriu em 'movements.xml' a algum piso de sua preferência, no caso eu adicionei no meio da ponte. Seja criativo.
    • Por Emooooo
      [01/04/2019 20:22:33] [Error - GlobalEvent Interface] 
      [01/04/2019 20:22:33] data/globalevents/scripts/record.lua:onRecord
      [01/04/2019 20:22:33] Description: 
      [01/04/2019 20:22:33] data/globalevents/scripts/record.lua:2: attempt to call field 'executeQuery' (a nil value)
      [01/04/2019 20:22:33] stack traceback:
      [01/04/2019 20:22:33]     data/globalevents/scripts/record.lua:2: in function <data/globalevents/scripts/record.lua:1>
       
       
      ALGUÉM AJUDA AE ! PLIS 
      +REP
    • Por JulianoZN
      Então eu tinha esse script de carpet em transform_to a bastante tempo desde 2016, mais simples
      Então então estou postando hoje
       
      Vamos ao Assunto.
       
      vai em data "datapack"/actions/scripts
      Crie um arquivo chamado carpet.lua
      coloque isso
      Please login or register to see this spoiler.
       
      Carpet fechado

       
      Carpet aberto

       
       
       
      DONO: PokemonZbr  ( Online )
      DONO: OtPokemonTvZ  ( Offline ) 
       
      Links do meu jogo

      Please login or register to see this link.
       (Online)  

      Please login or register to see this link.
       (Offline)  
      Eu sou:
      Scripter: 5%
      Mapper: 30%
      Programador: 4%
      Website : 50%
    • Por wizav01
      Versão do Servidor: TFS - 0.4 Tipo de Script: spell Código: Please login or register to see this spoiler.
      boa rapeize, alguem pode ajudar, como faço uma spell, que ela sejá apenas para o knight, ou vocation 4 - 8...
      eu não quero escrever ela e ativar, quero que ela seja propria do personagem sem escrever nada sem ativar...

      bom seguinte, quando o knight tiver com vida menor que 30% do total da vida dele... ele ganha + 20 de skill, axe sword e club... tem como alguém ajudar ? 
      lembrando, eu não quero ativar ela igual utito tempo, e não quero que tenha um tempo determinado, quero que seja do personagem... ta com -30% de life ele ganha skill... 
      agradeço desde já !
    • Por underewarr
      Em ioaccountsql.cpp nós mudamos.
      Procure por  .
      Account IOAccountSQL::loadAccount(uint32_t accno) E Substitua toda a função por essa (OBS LEMBRE-SE DE CONFIGURAR OS MUNDOS.).
      Account IOAccountSQL::loadAccount(uint32_t accno) { Account acc; Database* mysql = Database::instance(); DBQuery query; DBResult result; query << "SELECT id,password FROM accounts WHERE id=" << accno; if(mysql->connect() && mysql->storeQuery(query, result)){ acc.accnumber = result.getDataInt("id"); acc.password = result.getDataString("password"); #ifndef __ROGIER_MULTIWORLD__ query << "SELECT name FROM players WHERE account_id=" << accno; #else //__ROGIER_MULTIWORLD__ query << "SELECT name,worldid FROM players WHERE account_id=" << accno; #endif //__ROGIER_MULTIWORLD__ if(mysql->storeQuery(query, result)){ for(uint32_t i = 0; i < result.getNumRows(); ++i){ std::string ss = result.getDataString("name", i); #ifndef __ROGIER_MULTIWORLD__ acc.charList.push_back(ss.c_str()); #else //__ROGIER_MULTIWORLD__ int worldid = result.getDataInt("worldid", i); query.reset(); result.clear(); query << "SELECT * FROM worlds WHERE worldid=" << worldid; mysql->storeQuery(query, result); struct CharInfo info; info.worldName = result.getDataString("worldname", i); info.worldIp = result.getDataString("worldip", i); info.worldPort = result.getDataInt("worldport", i); acc.charList[ss] = info; #endif //__ROGIER_MULTIWORLD__ } #ifndef __ROGIER_MULTIWORLD__ acc.charList.sort(); #endif //__ROGIER_MULTIWORLD__ } } return acc; } Agora no protocollogin.cpp na função parsefirstpacket nós mudamos.
      Procure por.
      std::list<std::string>::iterator it; for(it = account.charList.begin(); it != account.charList.end(); it++){ output->AddString((*it)); output->AddString(g_config.getString(ConfigManager::WORLD _NAME)); output->AddU32(serverip); output->AddU16(g_config.getNumber(ConfigManager::PORT)) ; } Substitua por.
      #ifndef __ROGIER_MULTIWORLD__ std::list<std::string>::iterator it; for(it = account.charList.begin(); it != account.charList.end(); it++){ output->AddString((*it)); output->AddString(g_config.getString(ConfigManager::WORLD _NAME)); output->AddU32(serverip); output->AddU16(g_config.getNumber(ConfigManager::PORT)) ; } #else //__ROGIER_MULTIWORLD__ std::map<std::string, CharInfo>::iterator it; for(it = account.charList.begin(); it != account.charList.end(); it++){ output->AddString(it->first); output->AddString(it->second.worldName); output->AddU32(inet_addr(it->second.worldIp.c_str())); output->AddU16(it->second.worldPort); } #endif //__ROGIER_MULTIWORLD__ Agora Em account.h.
      procure.
      class Account adicione logo a baixo.
      #ifdef __ROGIER_MULTIWORLD__ #include <map> struct CharInfo { std::string worldIp; std::string worldName; short worldPort; }; #endif //__ROGIER_MULTIWORLD__ Novamente em account.h nós mudamos:
      Procure
      std::list<std::string> charList; Substitua
      #ifdef __ROGIER_MULTIWORLD__ std::list<std::string> charList; #else //__ROGIER_MULTIWORLD__ std::map<std::string, CharInfo> charList; #endif //__ROGIER_MULTIWORLD__ Adicione como parametro o seguinte seguimento para que a compilação encontre todas as alterações a cima
      -D__ROGIER_MULTIWORLD_
      (Igual o mysql/sqlite,console,gui é adicionado)
       
      E AGORA OQUE EU FAÇO?
      Please login or register to see this spoiler.
×
×
  • Criar Novo...