Jump to content
  1. lokokokokoko

    lokokokokoko

  2. vitinhoericas2

    vitinhoericas2

  • Recently Browsing   0 members

    No registered users viewing this page.


  • Similar Content

    • By L3K0T
      TUTORIAL BY L3K0T
       
      EXPLICAÇÃO/RESUMO:
      Bom galera esse sistema foi fixado por mim e resolvi trazer pra vocês o UPDATE contendo 2 moveitem pra funcionar perfeitamente ao seu jogo, esses sistemas tem a obrigação de parar players que jogam lixo na porta da sua casa, em cima do seu depot, em teleportes, e aonde você não queira. "somente dono, sub, e convidados podem jogar lixo ou mover items da sua casa" é um pacotão completo e revisado que vai evitar engraçadinhos bugar seu server.
       
      lixo no dp vídeo spoiler;;
       
      lixo house vídeo  spoiler;;
       
       
      Tutorial:
      1° abra seu creatureevents.cpp com o editor de sua preferencia. "eu uso notepad++"
       
      Ache o TERCEIRO CREATURE_EVENT_PREPAREDEATH; 
      case CREATURE_EVENT_PREPAREDEATH: return "cid, deathList"; em baixo coloca:
      case CREATURE_EVENT_MOVEITEM: return "moveItem, frompos, topos, cid"; case CREATURE_EVENT_MOVEITEM2: return "cid, item, count, toContainer, fromContainer, fromPos, toPos"; ache o SEGUNDO CREATURE_EVENT_PREPAREDEATH:
      case CREATURE_EVENT_PREPAREDEATH: return "onPrepareDeath"; em baixo coloca:
      case CREATURE_EVENT_MOVEITEM: return "onMoveItem"; case CREATURE_EVENT_MOVEITEM2: return "onMoveItem2"; ache o PRIMEIRO CREATURE_EVENT_PREPAREDEATH:
      else if(tmpStr == "preparedeath") m_type = CREATURE_EVENT_PREPAREDEATH; em baixo coloca:
      else if(tmpStr == "moveitem") m_type = CREATURE_EVENT_MOVEITEM; else if(tmpStr == "moveitem2") m_type = CREATURE_EVENT_MOVEITEM2; ache:
      bool CreatureEvents::playerLogout(Player* player, bool forceLogout) { //fire global event if is registered bool result = true; for(CreatureEventList::iterator it = m_creatureEvents.begin(); it != m_creatureEvents.end(); ++it) { if((*it)->getEventType() == CREATURE_EVENT_LOGOUT && (*it)->isLoaded() && !(*it)->executeLogout(player, forceLogout) && result) result = false; } return result; } em baixo coloca: ATENÇÃO PRA TFS 0.4 USE ESSE ABAIXO
      uint32_t CreatureEvent::executeMoveItem2(Player* player, Item* item, uint8_t count, const Position& fromPos, const Position& toPos, Item* toContainer, Item* fromContainer, int16_t fstack) { //onMoveItem(cid, item, count, toContainer, fromContainer, fromPos, toPos) if(m_interface->reserveEnv()) { ScriptEnviroment* env = m_interface->getEnv(); if(m_scripted == EVENT_SCRIPT_BUFFER) { env->setRealPos(player->getPosition()); std::stringstream scriptstream; scriptstream << "local cid = " << env->addThing(player) << std::endl; env->streamThing(scriptstream, "item", item, env->addThing(item)); scriptstream << "local count = " << count << std::endl; env->streamThing(scriptstream, "toContainer", toContainer, env->addThing(toContainer)); env->streamThing(scriptstream, "fromContainer", fromContainer, env->addThing(fromContainer)); env->streamPosition(scriptstream, "fromPos", fromPos, fstack); env->streamPosition(scriptstream, "toPos", toPos, 0); scriptstream << m_scriptData; bool result = true; if(m_interface->loadBuffer(scriptstream.str())) { lua_State* L = m_interface->getState(); result = m_interface->getGlobalBool(L, "_result", true); } m_interface->releaseEnv(); return result; } else { #ifdef __DEBUG_LUASCRIPTS__ char desc[30]; sprintf(desc, "%s", player->getName().c_str()); env->setEvent(desc); #endif env->setScriptId(m_scriptId, m_interface); env->setRealPos(player->getPosition()); lua_State* L = m_interface->getState(); m_interface->pushFunction(m_scriptId); lua_pushnumber(L, env->addThing(player)); LuaInterface::pushThing(L, item, env->addThing(item)); lua_pushnumber(L, count); LuaInterface::pushThing(L, toContainer, env->addThing(toContainer)); LuaInterface::pushThing(L, fromContainer, env->addThing(fromContainer)); LuaInterface::pushPosition(L, fromPos, fstack); LuaInterface::pushPosition(L, toPos, 0); bool result = m_interface->callFunction(7); m_interface->releaseEnv(); return result; } } else { std::clog << "[Error - CreatureEvent::executeMoveItem] Call stack overflow." << std::endl; return 0; } } uint32_t CreatureEvents::executeMoveItems(Creature* actor, Item* item, const Position& frompos, const Position& pos) { for(CreatureEventList::iterator it = m_creatureEvents.begin(); it != m_creatureEvents.end(); ++it) { if((*it)->getEventType() == CREATURE_EVENT_MOVEITEM) { if(!(*it)->executeMoveItem(actor, item, frompos, pos)) return 0; } } return 1; } uint32_t CreatureEvent::executeMoveItem(Creature* actor, Item* item, const Position& frompos, const Position& pos) { if(m_interface->reserveEnv()) { ScriptEnviroment* env = m_interface->getEnv(); if(m_scripted == EVENT_SCRIPT_BUFFER) { env->setRealPos(pos); std::stringstream scriptstream; env->streamThing(scriptstream, "moveItem", item, env->addThing(item)); env->streamPosition(scriptstream, "position", frompos, 0); env->streamPosition(scriptstream, "position", pos, 0); scriptstream << "local cid = " << env->addThing(actor) << std::endl; scriptstream << m_scriptData; bool result = true; if(m_interface->loadBuffer(scriptstream.str())) { lua_State* L = m_interface->getState(); result = m_interface->getGlobalBool(L, "_result", true); } m_interface->releaseEnv(); return result; } else { #ifdef __DEBUG_LUASCRIPTS__ char desc[35]; sprintf(desc, "%s", player->getName().c_str()); env->setEventDesc(desc); #endif env->setScriptId(m_scriptId, m_interface); env->setRealPos(pos); lua_State* L = m_interface->getState(); m_interface->pushFunction(m_scriptId); LuaInterface::pushThing(L, item, env->addThing(item)); LuaInterface::pushPosition(L, frompos, 0); LuaInterface::pushPosition(L, pos, 0); lua_pushnumber(L, env->addThing(actor)); bool result = m_interface->callFunction(4); m_interface->releaseEnv(); return result; } } else { std::clog << "[Error - CreatureEvent::executeMoveItem] Call stack overflow." << std::endl; return 0; } }  
       
      ATENÇÃO PRA TFS 0.3.6 USE ESSE ABAIXO
      uint32_t CreatureEvent::executeMoveItem2(Player* player, Item* item, uint8_t count, const Position& fromPos, const Position& toPos, Item* toContainer, Item* fromContainer, int16_t fstack) { //onMoveItem(cid, item, count, toContainer, fromContainer, fromPos, toPos) if(m_interface->reserveEnv()) { ScriptEnviroment* env = m_interface->getEnv(); if(m_scripted == EVENT_SCRIPT_BUFFER) { env->setRealPos(player->getPosition()); std::stringstream scriptstream; scriptstream << "local cid = " << env->addThing(player) << std::endl; env->streamThing(scriptstream, "item", item, env->addThing(item)); scriptstream << "local count = " << count << std::endl; env->streamThing(scriptstream, "toContainer", toContainer, env->addThing(toContainer)); env->streamThing(scriptstream, "fromContainer", fromContainer, env->addThing(fromContainer)); env->streamPosition(scriptstream, "fromPos", fromPos, fstack); env->streamPosition(scriptstream, "toPos", toPos, 0); scriptstream << m_scriptData; bool result = true; if(m_interface->loadBuffer(scriptstream.str())) { lua_State* L = m_interface->getState(); result = m_interface->getGlobalBool(L, "_result", true); } m_interface->releaseEnv(); return result; } else { #ifdef __DEBUG_LUASCRIPTS__ char desc[30]; sprintf(desc, "%s", player->getName().c_str()); env->setEvent(desc); #endif env->setScriptId(m_scriptId, m_interface); env->setRealPos(player->getPosition()); lua_State* L = m_interface->getState(); m_interface->pushFunction(m_scriptId); lua_pushnumber(L, env->addThing(player)); LuaScriptInterface::pushThing(L, item, env->addThing(item)); lua_pushnumber(L, count); LuaScriptInterface::pushThing(L, toContainer, env->addThing(toContainer)); LuaScriptInterface::pushThing(L, fromContainer, env->addThing(fromContainer)); LuaScriptInterface::pushPosition(L, fromPos, fstack); LuaScriptInterface::pushPosition(L, toPos, 0); bool result = m_interface->callFunction(7); m_interface->releaseEnv(); return result; } } else { std::clog << "[Error - CreatureEvent::executeMoveItem] Call stack overflow." << std::endl; return 0; } } uint32_t CreatureEvents::executeMoveItems(Creature* actor, Item* item, const Position& frompos, const Position& pos) { // fire global event if is registered for(CreatureEventList::iterator it = m_creatureEvents.begin(); it != m_creatureEvents.end(); ++it) { if(it->second->getEventType() == CREATURE_EVENT_MOVEITEM){ if(!it->second->executeMoveItem(actor,item,frompos,pos)) return 0; } } return 1; } uint32_t CreatureEvent::executeMoveItem(Creature* actor, Item* item, const Position& frompos, const Position& pos) { if(m_interface->reserveEnv()) { ScriptEnviroment* env = m_interface->getEnv(); if(m_scripted == EVENT_SCRIPT_BUFFER) { env->setRealPos(pos); std::stringstream scriptstream; env->streamThing(scriptstream, "moveItem", item, env->addThing(item)); env->streamPosition(scriptstream, "position", frompos, 0); env->streamPosition(scriptstream, "position", pos, 0); scriptstream << "local cid = " << env->addThing(actor) << std::endl; scriptstream << m_scriptData; bool result = true; if(m_interface->loadBuffer(scriptstream.str())) { lua_State* L = m_interface->getState(); result = m_interface->getGlobalBool(L, "_result", true); } m_interface->releaseEnv(); return result; } else { #ifdef __DEBUG_LUASCRIPTS__ char desc[35]; sprintf(desc, "%s", player->getName().c_str()); env->setEventDesc(desc); #endif env->setScriptId(m_scriptId, m_interface); env->setRealPos(pos); lua_State* L = m_interface->getState(); m_interface->pushFunction(m_scriptId); LuaScriptInterface::pushThing(L, item, env->addThing(item)); LuaScriptInterface::pushPosition(L, frompos, 0); LuaScriptInterface::pushPosition(L, pos, 0); lua_pushnumber(L, env->addThing(actor)); bool result = m_interface->callFunction(4); m_interface->releaseEnv(); return result; } } else { std::clog << "[Error - CreatureEvent::executeMoveItem] Call stack overflow." << std::endl; return 0; } } 2°  agora em creatureevetns.h
       
      Ache:
      CREATURE_EVENT_PREPAREDEATH, em baixo coloca:
      CREATURE_EVENT_MOVEITEM, CREATURE_EVENT_MOVEITEM2, ache:
      uint32_t executePrepareDeath(Creature* creature, DeathList deathList); em baixo coloca:
      uint32_t executeMoveItem(Creature* actor, Item* item, const Position& frompos, const Position& pos); uint32_t executeMoveItem2(Player* player, Item* item, uint8_t count, const Position& fromPos, const Position& toPos, Item* toContainer, Item* fromContainer, int16_t fstack); ache:
      bool playerLogout(Player* player, bool forceLogout); em baixo coloca:
      uint32_t executeMoveItems(Creature* actor, Item* item, const Position& frompos, const Position& pos);  
      3° agora em game.cpp
       
      ache:
      if(!canThrowObjectTo(mapFromPos, mapToPos) && !player->hasCustomFlag(PlayerCustomFlag_CanThrowAnywhere)) { player->sendCancelMessage(RET_CANNOTTHROW); return false; } ReturnValue ret = internalMoveItem(player, fromCylinder, toCylinder, toIndex, item, count, NULL); if(ret == RET_NOERROR) return true; player->sendCancelMessage(ret); return false; } troque por:
      if(!canThrowObjectTo(mapFromPos, mapToPos) && !player->hasCustomFlag(PlayerCustomFlag_CanThrowAnywhere)) { player->sendCancelMessage(RET_CANNOTTHROW); return false; } bool success = true; CreatureEventList moveitemEvents = player->getCreatureEvents(CREATURE_EVENT_MOVEITEM2); for(CreatureEventList::iterator it = moveitemEvents.begin(); it != moveitemEvents.end(); ++it) { Item* toContainer = toCylinder->getItem(); Item* fromContainer = fromCylinder->getItem(); if(!(*it)->executeMoveItem2(player, item, count, fromPos, toPos, (toContainer ? toContainer : 0), (fromContainer ? fromContainer : 0), fromStackpos) && success) success = false; } if(!success) return false; if(!g_creatureEvents->executeMoveItems(player, item, mapFromPos, mapToPos)) return false; ReturnValue ret = internalMoveItem(player, fromCylinder, toCylinder, toIndex, item, count, NULL); if(ret == RET_NOERROR) return true; player->sendCancelMessage(ret); return false; } Feito isso é só compilar sua source no modo REDUILD pra que as funções funcione.
       
       
      NO SERVIDOR:
       
      Agora no seu otserv vai em creturescripts, vai no arquivo login.lua e registra e event:
      registerCreatureEvent(cid, "MoveItem") registerCreatureEvent(cid, "MoveItem2") em creaturescript .xml
      <event type="moveitem" name="MoveItem" event="script" value="houseprotecao.lua"/> <event type="moveitem2" name="MoveItem2" event="script" value="moveitem2.lua"/> script do houseprotecao.lua "move item1
       
      function onMoveItem(moveItem, frompos, position, cid) if position.x == CONTAINER_POSITION then return true end local house = getHouseFromPos(frompos) or getHouseFromPos(position) --correção 100% if type(house) == "number" then local owner = getHouseOwner(house) if owner == 0 then return false, doPlayerSendCancel(cid, "Isso não é Possível.") end if owner ~= getPlayerGUID(cid) then local sub = getHouseAccessList(house, 0x101):explode("\n") local guest = getHouseAccessList(house, 0x100):explode("\n") local isInvited = false if (#sub > 0) and isInArray(sub, getCreatureName(cid)) then isInvited = true end if (#guest > 0) and isInArray(guest, getCreatureName(cid)) then isInvited = true end if not isInvited then return false, doPlayerSendCancel(cid, "Desculpe, você não está invitado.") end end end return true end script do moveitem2.lua "moveitem2
      local depottiles = {} --piso pra n jogar local depots = {2589} --id dos dps local group = 3 --id dos group 6 é todos. local function checkIfThrow(pos,topos) if topos.x == 0xffff then return false end local thing = getThingFromPos(pos) if isInArray(depottiles,thing.itemid) then if not isInArea(topos,{x=pos.x-1,y=pos.y-1,z=pos.z},{x=pos.x+1,y=pos.y+1, z=pos.z}) then return true end else for i = 1, #depots do if depots[i] == getTileItemById(topos,depots[i]).itemid or getTileInfo(topos).actionid == 7483 then return true end end end return false end function onMoveItem2(cid, item, count, toContainer, fromContainer, fromPos, toPos) if isPlayer(cid) then local pos = getThingPos(cid) if getPlayerGroupId(cid) > group then return true end if checkIfThrow({x=pos.x,y=pos.y,z=pos.z,stackpos=0},toPos) then doPlayerSendCancel(cid,"Não jogue item ai!!") doSendMagicEffect(getThingPos(cid),CONST_ME_POFF) return false end end return true end  
      OUTROS:
      bloquear item usando moveitem2
      if moveItem.itemid == IDDOITEM then doPlayerSendTextMessage(cid,25,'você bloqueou um item para não move no jogo!') return false end  
      ajudei?? REP+
       
      CRÉDITOS:
      @L3K0T
      Fir3element
      Summ
      Wise
      GOD Wille
       
       
      BUGs mesmo adicionado está jogando item em cima do depot, solta o puff de efeito mais não barra, bom isso pode ocorrer por questão de ter coisas adicionadas no game.cpp como o "push delay item" por exemplo e para resolver isso, tive que deixar assim.
       
       
      if(!canThrowObjectTo(mapFromPos, mapToPos) && !player->hasCustomFlag(PlayerCustomFlag_CanThrowAnywhere)) { player->sendCancelMessage(RET_CANNOTTHROW); return false; } // Anti-Push feature Prevention System by Xampy // /* Corrigido ElfBot Anti-Push (Anti-Crash) */ if(g_config.getBool(ConfigManager::ANTI_PUSH)){ //included by Yan Liima std::string antiPushItems = g_config.getString(ConfigManager::ANTI_PUSH_ITEMS); IntegerVec tmpVec = vectorAtoi(explodeString(antiPushItems, ",")); if(tmpVec[0] != 0){ for(IntegerVec::iterator it = tmpVec.begin(); it != tmpVec.end(); ++it){ if(item->getID() == uint32_t(*it) && player->hasCondition(CONDITION_EXHAUST, 1)){ player->sendTextMessage(MSG_STATUS_SMALL, "Please wait a few seconds to move this item."); return false; } } } } int32_t delay = g_config.getNumber(ConfigManager::ANTI_PUSH_DELAY); //by Yan Liima if(Condition* condition = Condition::createCondition(CONDITIONID_DEFAULT, CONDITION_EXHAUST, delay, 0, false, 1)) player->addCondition(condition); /* end */ bool success = true; CreatureEventList moveitemEvents = player->getCreatureEvents(CREATURE_EVENT_MOVEITEM2); for(CreatureEventList::iterator it = moveitemEvents.begin(); it != moveitemEvents.end(); ++it) { Item* toContainer = toCylinder->getItem(); Item* fromContainer = fromCylinder->getItem(); if(!(*it)->executeMoveItem2(player, item, count, fromPos, toPos, (toContainer ? toContainer : 0), (fromContainer ? fromContainer : 0), fromStackpos) && success) success = false; } if(!success) return false; if(!g_creatureEvents->executeMoveItems(player, item, mapFromPos, mapToPos)) return false; ReturnValue ret = internalMoveItem(player, fromCylinder, toCylinder, toIndex, item, count, NULL); if(ret == RET_NOERROR) return true; player->setNextAction(OTSYS_TIME() + g_config.getNumber(ConfigManager::ACTIONS_DELAY_INTERVAL) - 10); return true; player->sendCancelMessage(ret); return false; } // Anti-Push feature Prevention System by Xampy //  
    • By Tio Dootserv
      Preciso de ajuda. Na minha base o player não pode empurrar enquanto targeta. Eu quero que ele continue targetando, e empurre o alvo. Agradeço desde já.
      game.cpp
    • By FeeTads
      SALVE rapaziada do TK, esses dias vim pensando em novos scripts pro meu OT, e em um deles eu precisava que determinada area não contasse frag pro player que matasse outros, PORÉM eu precisava que os players que morressem nessa area ainda assim tivessem as penalidades da sua morte, procurei por ai, achei alguns scripts que apenas tiravam o SKULL e não realmente o FRAG do player, então decidi ir fuçar na source kkkkkkkkkkk, achei algumas coisas e montei um código funcional que NÃO conta frag em determinada area, com todas certeza esse script pode ser melhorado, pois peguei algumas funções do PathMatching pra ele funcionar 100%.
      vou disponibilizar o code aqui, e o que fazer pra determinada area não contar frag.

      SOURCE OTX 2, não sei se funciona em TFS.

      vá na pasta da sua source e procure pelo arquivo player.cpp

      procure pela função 
       
      bool Player::onKilledCreature(Creature* target, DeathEntry& entry)
      e abaixo de: (caso queira que warsystem de guilds não contem frag, cole acima de: )

       
      War_t enemy; if(targetPlayer->getEnemy(this, enemy)) { if(entry.isLast()) IOGuild::getInstance()->updateWar(enemy); entry.setWar(enemy); }
      cole o código:

       
      Position posi = target->getPosition(); AStarNodes nodes(posi.x, posi.y); int x1 = //POSIÇÃO X SUPERIOR ESQUERDA int y1 = //POSIÇÃO Y SUPERIOR ESQUERDA int x2 = //POSIÇÃO X INFERIOR DIREITA int y2 = //POSIÇÃO Y INFERIOR DIREITA //essas 4 posições formam o quadrado int z = //POS EM Z; for(int i = x1; i <= x2; i++){ for(int j = y1; j <= y2; j++){ if (posi.x == i && posi.y == j && posi.z == z){ return true; } } }
      após isso vá até a função:
       
      bool Player::addUnjustifiedKill(const Player* attacked, bool countNow)
      ABAIXO DE: 
       
      if(!g_config.getBool(ConfigManager::USE_FRAG_HANDLER) || hasFlag( PlayerFlag_NotGainInFight) || g_game.getWorldType() != WORLDTYPE_OPEN || hasCustomFlag(PlayerCustomFlag_NotGainUnjustified) || hasCustomFlag( PlayerCustomFlag_NotGainSkull) || attacked == this) return false;
      e cole o código quase parecido só que com UMA mudança.
       
      Position posi = attacked->getPosition(); //aki vai ser attacked-> em vez de target-> AStarNodes nodes(posi.x, posi.y); int x1 = //POSIÇÃO X SUPERIOR ESQUERDA int y1 = //POSIÇÃO Y SUPERIOR ESQUERDA int x2 = //POSIÇÃO X INFERIOR DIREITA int y2 = //POSIÇÃO Y INFERIOR DIREITA //essas 4 posições formam o quadrado int z = //POS EM Z; for(int i = x1; i <= x2; i++){ for(int j = y1; j <= y2; j++){ if (posi.x == i && posi.y == j && posi.z == z){ return true; } } }
      e pronto, só compilar a source novamente e não vai mais contar frag nessa area, porém todo o resto, como frag list, deathlist, warsystem etc... vai contar frag, porém frag pra redSkull e etc.. não irá contar.

      caso queira adicionar mais posições, por exemplo, castle24h, castelo 48h, basta duplicar o for com as posições corretas.

      TODO O SCRIPT é feito no arquivo player.cpp e nada mais.

      **Eu fiz sozinho as alterações e o simples código por isso vim disponibilizar sem algum crédito**
      100% funcional e testado por mim kkkk
    • By joaozinhocabal
      Procuro spriter freelancer pra desenvolver sprites de tibia alternativo (outfits).
      Discord: Abr#1119
       
    • By marcelolhenrique
      A Breed Worlds precisa - se de :
       
       
      1 Programador :
      1 Spriter :
      1 Mapper :
      Entra em contato 62 983113992 ou Marcelol090#1030 no discord
       
×
×
  • Create New...

Important Information

Confirmação de Termo