Líderes
Conteúdo Popular
Exibindo conteúdo com a maior reputação em 02/18/16 em todas áreas
-
[Download] Algumas Remakes-pxg e pokestorm
Imperatriz e um outro reagiu a kaleudd por um tópico no fórum
2 pontos -
[Download] Remake Venonat by kaleudd
Developer Berg e um outro reagiu a kaleudd por um tópico no fórum
2 pontos -
function onUse(cid, item, fp, itemEx, toPosition) local posi = { [{x = fp.x, y = fp.y + 1, z = fp.z}] = {x = fp.x, y = fp.y - 1, z = fp.z}, [{x = fp.x, y = fp.y - 1, z = fp.z}] = {x = fp.x, y = fp.y + 1, z = fp.z}, [{x = fp.x - 1, y = fp.y, z = fp.z}] = {x = fp.x + 1, y = fp.y, z = fp.z}, [{x = fp.x + 1, y = fp.y, z = fp.z}] = {x = fp.x - 1, y = fp.y, z = fp.z}, } local trainerTile = 407 doTransformItem(item.uid, item.itemid == 1945 and 1946 or 1945) for posout, pos in pairs(posi) do if getTileItemById(pos, trainerTile).itemid == trainerTile then if getTopCreature(pos).uid == cid then doTeleportThing(cid, posout) return true end if isCreature(getTopCreature(pos).uid) then doPlayerSendCancel(cid, "Esse trainer esta ocupado.") doSendMagicEffect(toPosition, CONST_ME_POFF) else doTeleportThing(cid, pos) break end end end return true end <action actionid="1234" event="script" value="arquivo.lua"/> Só precisa mudar a variável trainerTile, pro id do tile que fica dentro do trainer. actionid coloca na alavanca.2 pontos
-
Fiz isso com a idéia de permitir aos players construir casas no meio do mato e salvar essas casas e tal Não consegui fazer salvar towns ainda (temple positions), daí você teria que editar o otbm e adicionar elas depois Como eu fiz? Peguei o saveMap do remere (que é open source) e modifiquei um pouco, adaptando ao que o otserver tem. Testei e funcionou em theforgottenserver 0.2rc9 Bom, vamos ao código luascript.h: static int32_t luaSaveMap(lua_State* L); luascript.cpp, dentro de registerFunctions(): //saveMap() lua_register(m_luaState, "saveMap", LuaScriptInterface::luaSaveMap); luascript.cpp: int32_t LuaScriptInterface::luaSaveMap(lua_State* L) { //saveMap() g_game.saveMapzord(); } game.h(public): void saveMapzord(){map->saveMapzord();} map.h, embaixo de bool saveMap();: bool saveMapzord(); map.cpp: bool Map::saveMapzord() { IOMap* loader = new IOMap(); bool saved = false; for(uint32_t tries = 0; tries < 3; tries++) { if(loader->saveMap(this, "eai.otbm", false)) { saved = true; break; } } return saved; } iomap.h: bool saveMap(Map* map, const std::string& identifier, bool showdialog); iomap.cpp: bool IOMap::saveMap(Map* map, const std::string& identifier, bool showdialog) { /* STOP! * Before you even think about modifying this, please reconsider. * while adding stuff to the binary format may be "cool", you'll * inevitably make it incompatible with any future releases of * the map editor, meaning you cannot reuse your map. Before you * try to modify this, PLEASE consider using an external file * like spawns.xml or houses.xml, as that will be MUCH easier * to port to newer versions of the editor than a custom binary * format. */ /*if(Items::dwMajorVersion < 3) { version = 0; } else { version = 1; }*/ FileLoader f; f.openFile(identifier.c_str(), true, false); f.startNode(0); { f.addU32(0); // Version f.addU16((uint16_t)map->mapWidth); f.addU16((uint16_t)map->mapHeight); f.addU32(Items::dwMajorVersion); f.addU32(Items::dwMinorVersion); f.startNode(OTBM_MAP_DATA); { f.addByte(OTBM_ATTR_DESCRIPTION); // Neither SimOne's nor OpenTibia cares for additional description tags f.addString("Saved with Remere's Map Editor "); f.addU8(OTBM_ATTR_DESCRIPTION); f.addString("Esse mapa é maneiro."); /*f.addU8(OTBM_ATTR_EXT_SPAWN_FILE); FileName fn(wxstr(map->spawnfile)); f.addString(std::string((const char*)fn.GetFullName().mb_str(wxConvUTF8))); if(gui.GetCurrentVersion() > CLIENT_VERSION_760) { f.addU8(OTBM_ATTR_EXT_HOUSE_FILE); fn.Assign(wxstr(map->housefile)); f.addString(std::string((const char*)fn.GetFullName().mb_str(wxConvUTF8))); }*/ // Start writing tiles //uint64_t tiles_saved = 0; bool first = true; int local_x = -1, local_y = -1, local_z = -1; for (uint64_t z=0; z<=15; ++z) for (uint64_t xi = 0; xi<map->mapWidth; xi+=256) for (uint64_t yi = 0; yi<map->mapHeight; yi+=256) for (uint64_t x = xi; x<xi+256; x++) for (uint64_t y = yi; y<yi+256; y++){ //MapIterator map_iterator = map.begin(); //while(map_iterator != map.end()) { // Update progressbar //++tiles_saved; //if(showdialog && tiles_saved % 8192 == 0) { //gui.SetLoadDone(int(tiles_saved / double(map.getTileCount()) * 100.0)); //} // Get tile Tile* save_tile = map->getTile(x,y,z); //Tile* save_tile = *map_iterator; if (!save_tile) continue; const Position& pos = save_tile->getPosition(); /*// Is it an empty tile that we can skip? (Leftovers...) if(save_tile->size() == 0) { ++map_iterator; continue; }*/ // Decide if new node should be created if(pos.x < local_x || pos.x >= local_x + 256 || pos.y < local_y || pos.y >= local_y + 256 || pos.z != local_z) { // End last node if(!first) { f.endNode(); } first = false; // Start new node f.startNode(OTBM_TILE_AREA); f.addU16(local_x = pos.x & 0xFF00); f.addU16(local_y = pos.y & 0xFF00); f.addU8( local_z = pos.z); } //HouseTile* houseTile = dynamic_cast<HouseTile*>(save_tile); f.startNode(/*houseTile? OTBM_HOUSETILE : */OTBM_TILE); f.addU8(pos.x & 0xFF); f.addU8(pos.y & 0xFF); /*if(houseTile) { f.addU32(houseTile->getHouse()->getHouseId()); }*/ /*if(save_tile->getMapFlags()) { f.addByte(OTBM_ATTR_TILE_FLAGS); f.addU32(save_tile->getMapFlags()); }*/ if(save_tile->ground) { Item* ground = save_tile->ground; /*if(ground->hasBorderEquivalent()) { bool found = false; for(ItemVector::iterator it = save_tile->items.begin(); it != save_tile->items.end(); ++it) { if((*it)->getGroundEquivalent() == ground->getID()) { // Do nothing // Found equivalent found = true; break; } } if(found == false) { ground->serializeItemNode_OTBM(*this, f); } } else*/ if(ground->isComplex()) { ground->serializeItemNode_OTBM(f); } else { f.addByte(OTBM_ATTR_ITEM); ground->serializeItemCompact_OTBM(f); } } for(ItemVector::reverse_iterator it = save_tile->downItems.rbegin(); it != save_tile->downItems.rend(); ++it) { //if(!(*it)->isMetaItem()) { (*it)->serializeItemNode_OTBM(f); //} } for(ItemVector::iterator it = save_tile->topItems.begin(); it != save_tile->topItems.end(); ++it) { //if(!(*it)->isMetaItem()) { (*it)->serializeItemNode_OTBM(f); //} } f.endNode(); //++map_iterator; } // Only close the last node if one has actually been created if(!first) { f.endNode(); } f.startNode(OTBM_TOWNS); { //for(TownMap::const_iterator it = townMap.begin(); it != townMap.end(); ++it) { for(TownMap::const_iterator it = Towns::getInstance().getFirstTown(); it != Towns::getInstance().getLastTown(); ++it){ Town* town = it->second; f.startNode(OTBM_TOWN); f.addU32(town->getTownID()); f.addString(town->getName()); f.addU16(town->getTemplePosition().x); f.addU16(town->getTemplePosition().y); f.addU8 (town->getTemplePosition().z); f.endNode(); } } f.endNode(); } f.endNode(); //std::cout << tiles_saved << std::endl; } f.endNode(); /*if(showdialog) gui.SetLoadDone(100, wxT("Saving spawns...")); saveSpawns(map, identifier); if(gui.GetCurrentVersion() > CLIENT_VERSION_760) { if(showdialog) gui.SetLoadDone(100, wxT("Saving houses...")); saveHouses(map, identifier); }*/ return true; } item.h, public da class Item: //map-saving virtual bool serializeItemNode_OTBM(FileLoader& f) const; // Will write this item to the stream supplied in the argument virtual void serializeItemCompact_OTBM(FileLoader& f) const; virtual void serializeItemAttributes_OTBM(FileLoader& f) const; item.h, public da class ItemAttributes: virtual bool isComplex() const {return (15 & m_attributes) != 0;} item.cpp: bool Item::serializeItemNode_OTBM(FileLoader& f) const { f.startNode(OTBM_ITEM); f.addU16(id); //if(maphandle.version == 0) { /*const ItemType& iType = items[id]; if(iType.stackable || iType.isSplash() || iType.isFluidContainer()){ f.addU8(getSubType()); }*/ //} serializeItemAttributes_OTBM(f); f.endNode(); return true; } void Item::serializeItemAttributes_OTBM(FileLoader& stream) const { //if(maphandle.version > 0) { const ItemType& iType = items[id]; if(iType.stackable || iType.isSplash() || iType.isFluidContainer()){ //stream.addU8(OTBM_ATTR_COUNT); stream.addU8(getItemCountOrSubtype()); } //}*/ /* if(items.dwMinorVersion >= CLIENT_VERSION_820 && isCharged()) { stream.addU8(OTBM_ATTR_CHARGES); stream.addU16(getSubtype()); }*/ if(getActionId()) { stream.addU8(OTBM_ATTR_ACTION_ID); stream.addU16(getActionId()); } if(getUniqueId()) { stream.addU8(OTBM_ATTR_UNIQUE_ID); stream.addU16(getUniqueId()); } if(getText().length() > 0) { stream.addU8(OTBM_ATTR_TEXT); stream.addString(getText()); } if(getSpecialDescription().length() > 0) { stream.addU8(OTBM_ATTR_DESC); stream.addString(getSpecialDescription()); } } void Item::serializeItemCompact_OTBM(FileLoader& stream) const { stream.addU16(id); /* This is impossible const ItemType& iType = item_db[id]; if(iType.stackable || iType.isSplash() || iType.isFluidContainer()){ stream.addU8(getSubtype()); } */ } fileloader.cpp: troca as funções addU8 e addU16 por essas(ou o mapa gerado vai tá corrompido, aconteceu comigo): bool FileLoader::addU8(uint8_t u8) { writeData(&u8, sizeof(u8), true); //unescape=true, or else some FEsomething itemid might be recognized as the start of a node return m_lastError == ERROR_NONE; } bool FileLoader::addU16(uint16_t u16) { writeData(reinterpret_cast<uint8_t*>(&u16), sizeof(u16), true); return m_lastError == ERROR_NONE; } Como usa isso? Só colocar saveMap() em algum script, mas olha que vai lagar. Dá pra facilmente criar um npc que salva o mapa de x em x horas, e se você for reiniciar o server por algum motivo é só kickar todo mundo e usar uma talkaction que salve.1 ponto
-
Otpokemon {Open Source} v2.0 [REUPLOAD]
robsonsiilva reagiu a JairKevick por um tópico no fórum
• Menu: ├ Informações; ├ Ediçoes; ├ Erros; ├ Prints; ├ Preview; ├ Source; ├ Download; ├ Scan; ├ Creditos └ Desculpas. • Informações • •Senha do god: kevick/123mudar. --- Versão 1.0 --- • Boat System 100%, com a seguinte rota: De Pallet town a cinnabat city. • Perfect icon system 95%. 110 icons -- Removido tinha muitos bug, e influenciava a nurse a não hela alguns pokemon, quem sabe eu coloco na proxima versão 2.1 • Life do jogador aumenta quando come comidas ou sucos. --- Versão 1.1 --- • Passivas - "Psyduck" e "Golduck" - "Pikachu", "Raichu", "Shiny Raichu" > Electric charges - "Alakazam", "Tentacruel", "Gengar" - Blast mind e Scary face - "Scyther", "Scizor", "Shiny Scyther", "Hitmontop", "Shiny Hitmontop", "Pineco", "Forretress" > Counter helix • Dark Eye funcionando perfeitamente. • Shiny(Monstros ajeitados) •nenhum xD • Shinys aparecem aleatoriamente, pelo mapa. Por centagem de dar um: 2% de chance • Ditto system funcionando 100%. • !cd aprimorado, ele informa quanto tempo falta para dar Teleport com pokemons psychicos. • Ditto não pode transformar-se em pokemons de GINASIOS e o player tem que ter o level do pokemon que quer transformar. • Bug, quando morria a pokebola ficava em use. <:- Retirado -:> • Nova arvore colada no jogo, caminho (RAW/OTHERS) ou 12198, bonitinha. • Novo potion adicionado, só players, com level 10 ou mais, podem usar. --- Versão 1.2 --- • "Spray level up" adicionado, ele upa um level do player, não importando qual. --- Versão 2.0--- • removido todos os bug do jogo 90% sem bug 1 geração 100% • moves refeitos agora estao todos 100% -- primeira geração • 2 geração não testada • erro no fly concertado, quando o player dava order em cima do fly dava bug no distro -- fixed • Colocado barra de Pokebar no servidor OTC BPO necessario configurar • Erro no pvp fuchsia dava debug e erro no Distro fixed • Boost System tava com uns problema mais agora esta funcionando por enquanto • Nurse helando todos os pokemons em todas as Balls • Tile para entra na central de trocas arrumado Dava debug • Debug ao entra no ginazio arrumado • Removida ilha de gelo é muito grande , removendo ela melhora o desempenho do servidor , carai o bagui era um continente • Adicionado algumas areas premium account • Removido icon system Tinha muito bug , e bugava os pokemons iniciais • iniciais, Charmander,Squirtle e Bulbasaur -- sem bug • Npc Carlos compra iniciais por 25 Dollars • Pokemons passivos Não atacam o Player B para nossa alegria XD funcionava assim quando o player A atacava um pokemon o pokemon ia atacar o player B e C • Adicionado CORRER Agora o player pode correr, esse não é acumulativo exemplo se o player falasse correr 2x seguida a speed dobrava agora não dobra mais • Gate of expertise não funcionava o player bugava e nao passava pela porta, agora esta arrumado basta por action 1025,1050,1055~~~~ para player lvl 25,50,55 passar • Todas as houses foram reconfiguradas e foram refeitas, avia house que items desapareciam agora estão todas 100% para uso • Box não funcionava Dava debug, eo pokemon vinha bugado, Agora Fixed xD • Debug na praia de Cerulean -fixed • Nurse Agora heala os pokemons Shiny! • Avia muitos lugares com Debug Decidir colocar OTC • Gengar, Gastly e Haunter não ficavam invisivel • Bug no stun spore sleep powder, e posion powder, arrumados por enquanto esta em observação • Bug de cowndown , as vezes dava bug e o player podiam usar quantas vezes quiser o mesmo move - fixed • Iniciais agora estão funcionando corretamente • Stones de evolução estavam bugadas nada grave mais concertado • IP 127.0.0.1 Client a mesma coisa (client peguei de outro serve :b) •Order 100%. • As ID town foram arrumadas • Fly/ride/Teleport para premium • Comando /additem do god, ele pode dar items para tosos os players online Exemplo: /additem 2160, 10 • Erros Do Distro • Na distro nenhum por enquanto Crash -- 1x motivo nunca de reload em movements huehue • Bugs• --mecher no lick move 1 - nao fixo lick nao deixa o inimigo lento e não pode dar muito dano -- Falta OPCODE nas Source -- meganium -- maior parte dos bug estao no move 7 -- Algumas spells de pokemoins estao trocadas -- nao mechi em pokemons da segunda geração -- não mechi nos shinys -- Debug em algumas skills Eletricas -- Nurse as vezes nao hela pokemon e da erro na distro -- Shinys estão desconfigurado [23/07/2014 17:19:44] [Error - Spell Interface] [23/07/2014 17:19:44] In a timer event called from: [23/07/2014 17:19:44] data/spells/scripts/poke/nightshade.lua:onCastSpell [23/07/2014 17:19:44] Description: [23/07/2014 17:19:44] (luaDoCombat) Creature not found • PrintScreen • • Preview • Versão 2.1 Remoção de mais bugs Remakes de pokemons novas Outfit Refazer as cidades com os novos items ilha de gelo Free player vip com 25% de exp Chat VIP readicionar drop em todos os pokemons. Configurar chance dos drops additem que falta no loot mais npc de quest mais quest add quest de Boxs substituir alguns respawn e colocar pokemon da segundageração com remake Novas cidades e o que aparecer a mais na cabeça • Sources BUGs Corrigidos • ~Otpokemon v2.0 TFS 0.3.6 •Removido bug de clonagem com o elfbot •Resolvido alguns bug de crash agora a chance de crash sera reduzida •resolvido bug que o pokemon desaparecia ao se distanciar do player, •resolvido bug nas source do npc que fazia dar lag erros loucos no Distro • Outros • Catch 100% Fly 100% Flash 100% Surf 100% Ride 100% Rock Smash 100% Cut 100% Teleport 100% (!h pra ver os lugares e !h nomedacidade para ir ate a cidade) Control Mind 99.9% Order 100% Catch 100% Goback 100% Portrait 100% Pokedex 100% m1~m12 100% Hold position 100%(para o pokemon fikar parado vc diz .h pra ele se mover dnovo vc diz .h =D) !lg para mudar a linguagem (English-Português) Talkactions 100% NIck System 100% Efeito ao upar level • Download's • Server+Source OtClient OldClient • PATCH'S: • CREDITOS: Valakinhas pela dash v6 open source usada como base Kevick- editar mapa, adicionar sistemas e remakes e refazer o mapa1 ponto -
Bird Hunt - Atire no pássaro.
Yan Liima reagiu a Night Wolf por um tópico no fórum
Fala galera, vim compartilhar com vcs um dos sistemas que eu fiz baseado no jogo Bird Hunt e que foi imbutido em alguns servidores famosos, sendo o Korelin um deles. Obs: Testado em TFS 0.3.6 mas deve funcionar em TFS 0.4 sem problema aqui tem uma pequena imagem demonstrando o sistema sendo utilizado: Bom, antes de tudo eu vou ensinar vocês a criar um mapa apropriado pois isso é 90% das dificuldades que os players enfrentam quando tentam adicionar o sistema. Inicialmente vc vai precisar criar uma area no seu mapa editor +- parecida com a que eu fiz na imagem abaixo: Feito isso vc deverá colocar uniqueid 16480 na porta e actionid 14874 em todos os lugares que o player pode percorrer (da placa pra \/ todos os quadrados verdes deverão conter esse actionid) Colocado os ids, vc deverá fazer a sala à prova de bugs, para isso você terá que seguir essas especificações: Note que em verde são os lugares que vc deverá colocar protect zone e em roxo os locais onde vc deve colocar no logout zone. Agora perceba que nas posições onde o player irá andar, você vai colocar tanto no logout zone como protect zone, isso pra evitar ele de matar o bixo com spells e pra evitar que ele deslogue durante o mini game. Essa contagem de sqms eu vou explicar mais tarde na configuração do script, mas tenham ela em mente. Agora vamos aos scripts: Comece criando em data/lib um arquivo chamado 045- Bird Hunt Lib.lua e colocando isso dentro dele: Feito isso vá em data/actions/scripts e adicione um arquivo chamado seagul.lua que deverá conter: e adicione em actions.xml: <action uniqueid="16480" event="script" value="seagul.lua"/> Agora vá em data/movements/scripts e crie um arquivo chamado seagulmove.lua com o seguinte conteúdo: E adicione as tags em movements.xml: <movevent type="StepIn" actionid="14872" event="script" value="seagulmove.lua"/> <movevent type="StepOut" actionid="14872" event="script" value="seagulmove.lua"/> Agora, pra deixar nosso sistema mais real e difícil, altere a velocidade do seagul de 200 pra 300 na pasta data/monsters/Birds/seagull.xml eu alterei tb a quantidade de vida q ele começa a fugir pra vida atual dele e fiz outras alterações pra tornar mais difícil, mas isso é com vcs. A maioria das coisas tá bem compreensível, com exceção das duas primeiras linhas de actions: rangecima = {x = -8, y = -4}, -- distancia em x e y da topos (ate a pos de cima) rangebaixo = {x = 0, y = 4}, -- distancia em x e y da topos (ate a pos de baixo) é aqui que entra aquela imagem, vc vai considerar a porta (o ponto cinza) como sendo nossa origem, ou seja, o ponto (0,0) rangecima é a distancia que eu tenho que percorrer em x e y pra chegar até a ponta de cima < e rangebaixo é a distancia que eu tenho que percorrer em x e y pra chegar até a ponta de baixo. Se vcs mudarem o tamanho da sala, fiquem ligados nisso. Obs: algumas pessoas fazem a sala virada pra direita também, nesse caso vc mantém a actions (pode usar inclusive o mesmo arquivo), só tem que alterar o movements pois lá vc define se é direita ou esquerda. É isso, espero que tenham gostado. O jogo é só por diversão mas vc pode alterar a função de atirar pra ganhar dinheiro por cada acerto ou então criar um npc que vc te dá X premio dependendo do seu recorde.. podendo esse premio inclusive ser uma key pra uma quest. Usem a imaginação e espero que aproveitem esse sistema. Abraços do Lobo.1 ponto -
Fala galera, vivo fazendo sisteminhas com base em ideias que tenho. Resolvi criar esse post e começar a por tudo aqui. Depois vou colocando os que ja postei em outros topicos aqui. Por hora, fica essas duas gifs do novo sistema que eu estou fazendo. Batizei de Mouse Cast, infelizmente não da para ver o cursor do mouse nesse gif editor que eu tenho, mas já que eu expliquei da pra entender a ideia. Teste inicial direita e esquerda: Versão 8 dir: Relevem o exori con de terra, eu usei ele de base e como é só teste de implementação tanto faz. Mais para frente farei coisas legais com isso. Vou viajar 2 semanas, mas quando voltar vou postar os anteriores e tentar manter atualizado isso aqui. Não vou divulgar o script agora pois estou sem tempo, mas vou postar os scripts do sistema assim que der (provavelmente quando ele estiver mais maduro e útil). Dessa vez tive que mexer na source e criar um module no OTC para tornar isso possivel. Obrigado @@Aberos @@BananaFight pela paciência e ao @@Night Wolf e o @@Daniel por sempre apoiarem as minhas ideias mirabolantes. xD Espero que gostem. Abraços, Outro exemplo de como pode ser usado o mouse cast:1 ponto
-
Fala galera, tudo bem? Venho trazer pra vocês uma nova magia que fiz. Ela é basicamente um puxão que da um pouco de dano. Gif Em spells.xml coloque essa tag: <instant name="Energy Grab" words="exori grab vis" needtarget="1" lvl="40" mana="20" prem="1" range="5" blockwalls="1" exhaustion="2000" groups="1,2000" icon="122" needlearn="0" event="script" value="attack/energy grab.lua"> <vocation id="3"/> <vocation id="7"/> </instant> Em scripts/attack crie um arquivo chamado energy grab.lua e coloque o conteúdo abaixo: local grab_time = 350 local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_ENERGYAREA) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGYBALL) setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -1, -10, -1, -20, 5, 5, 1.4, 2.1) function onTargetCreature(cid, target) addEvent(executeGrab, grab_time, cid, target) end setCombatCallback(combat, CALLBACK_PARAM_TARGETCREATURE, "onTargetCreature") function executeGrab(cid, target, param) d = param or -1 if not isPlayer(cid) then return false end if not isCreature(target) then return false end local cpos, ppos = getCreaturePosition(target), getCreaturePosition(cid) local dir = getDirectionTo2(cpos, ppos) if d == -1 then doSendDistanceShoot(cpos, ppos, CONST_ANI_ENERGYBALL) end if getDistanceBetween(cpos, ppos) > 1 then doMoveCreature(target, dir) end if (d > 1 or d == -1) then addEvent(executeGrab, 30, cid, target, getDistanceBetween(cpos, ppos)) end return true end function performCombat(cid, combat, var) return doCombat(cid, combat, var) end function onCastSpell(cid, var) return doCombat(cid, combat, setSpellTarget(cid, var)) end Para funcionar corretamente, isso é puxando quem estiver na frente da magia e nao o target inicial é necessário que você utilize o sistema disponibilizado por mim neste tópico: http://www.xtibia.com/forum/topic/239458-spells-checando-interferencias-na-trajetoria/ Caso contrário, troque a linha return doCombat(cid, combat, setSpellTarget(cid, var)) por return doCombat(cid, combat, var). Bom, é isso. Espero que gostem. Abraços,1 ponto
-
Vou fazer muita coisa legal, depois vou abrir um topico de sugestão de magias diferentes. Mas agora vou focar nos sistemas que tem que acabar, xD. Abraços, Versao final do elevation, ja com a configuracao permitindo ate 3 andares de elevacao e configuracao do delay entre os andares:1 ponto
-
Trainer Ocupado
Marco Oliveira reagiu a Caronte por uma questão
Se não quiser que ela abra ou feche, é só tirar essa parte e usar: doTransformItem(item.uid, item.itemid == 1945 and 1946 or 1945) você pode usar qualquer item, basta ter o piso de dentro diferente dos outros, e colocar o id dele na variável..1 ponto -
Trainer Ocupado
Furabio reagiu a Marco Oliveira por uma questão
Seria possível adaptar pra usar ele em uma porta ?1 ponto -
vou tentar ser mais claro no que eu disse pois não entendi nd do que vc escreveu também haha. seguinte, existem servidores que os primeiros items do personagem são dados por um script "Firstitems" e servidores que os personagens nascem com os itens semelhantes aos do account manager. CASO seu servidor seja o que opta pelo script FIRSTITEMS, é possivel RETIRAR o Coins Case de la, deixando assim esse slot vazio. (para que vc use seus revives, potions, poke bolas e etc). SOBRE A BIKE o slot que vc deseja colocar ela está associado ao SLOT 9 (CONST_SLOT_RING) em servidores normais. A ideia é a mesma porem no seu servidor derivado deve ter outro nome. siga o raciocinio: Este é o Anel do Casamento : </item> <item id="2121" article="a" name="wedding ring"> <attribute key="weight" value="40" /> <attribute key="slotType" value="ring" /> a tag que torna possivel equipa-lo em aneis(SLOT 9) é <attribute key="slotType" value="ring" /> você só precisa tornar sua bike apta a ser equipada no slot 9. se não houve nenhuma edição relativa a isso nas sourcers do seu servidor, essa edição basta. porém, não entendo nada de servidores derivados, o pouco conhecimento que possuo para compartilhar com você finda aqui. Boa Sorte.1 ponto
-
Erro em script (sem erro no distro)
Darkraus reagiu a Night Wolf por uma questão
sim, e vc tem que criar a condition venom tb.. da mesma forma q vc cria em spells1 ponto -
Valeu cara! Vou precisar de um cara que saiba client e design logo logo, se o projeto for pra frente. Se animar e manjar, te dou ideia quando isso acontecer! ^^ Possivel precisar de um mapper tb. @Topic Mais uma ideiazinha que saiu do atoismo: "Joga o player pro alto, vamos beber.. opa, não, pera."1 ponto
-
pera, li tudo completamente errado... vou ler dnv e ver aqui... hahaha este item que precisa deve estar equipado (um shield, um armor) ou deve estar na mochila do jogador? local soulcost = xxxx function onCastSpell(cid, var) if getPlayerItemCount(cid, soulcost) >= 1 then doPlayerAddSoul(cid, 1) doPlayerRemoveItem(cid, soulcost) doCreatureSay(cid, Souls, 180) else return false end end se a função getPlayerItemCount funcionar como eu penso que funciona... o script deve funcionar. ou não '-' mas já é uma base haha.1 ponto
-
Tópico Movido Este tópico foi movido de "OTServ → Scripting → Suporte Scripting" para "OTServ → Scripting → Suporte Scripting → Pedidos e dúvidas resolvidos - Scripting".1 ponto
-
O seu player tem Town? acho que esse erro acontece quando ele não tem town, aí em vez de retornar a posição, retorna falso. Tente mudar essa parte: local posicao = getTownTemplePosition(getPlayerTown(cid)) markFlyingPos(cid, posicao) por: local posicao = getTownTemplePosition(getPlayerTown(cid)) if posicao then markFlyingPos(cid, posicao) end1 ponto
-
se você quizer falar sem aparescer o seu nome é só digitar /bc . Ola Pessoal !! o comando /bc tem distintas funçoes q pode ser usado pra falar em uma cor por ejemplo /bc white ola pessoal /bc red ola pessoal /bc warning ola pessoal etc etc1 ponto
-
Criando page de RESET Personagem.
Thillys Alves reagiu a Furabio por uma questão
Pronto... primeiro vá na pasta classes do seu servidor, abra o arquivo player.php e troque por esse : Agora troque seu accountmanagement.php por esse: Ps : Já está configurado com todos os níveis de reset, de acordo com o site da RadBr.1 ponto -
Provavelmente um problema de driver de impressora. Tente atualizar o driver da impressora para a versão mais recente no site do fabricante e verifique o cabo da impressora está conectado corretamente e é diretamente para a impressora. Em seguida, reinstale a versão mais recente do Acrobat (você tem que baixar, instalar e, em seguida, verificar se há atualizações, graças ao Adobe para ser tão estranho para não dar os patches mais recentes para o download) e tente novamente. Se você ainda enfrentar o problema pode tartar Recovery ToolBox for PDF https://pdf.recoverytoolbox.com/pt/1 ponto
-
Anti-afk nos trainers
Spring Trap reagiu a Yan Liima por uma questão
Vá na pasta do seu OT \data\creaturescripts\creaturescript.xml e adiciona essa tag: <event type="think" name="Idle" event="script" value="idle.lua"/> Agora em \data\creaturescripts\scripts crie um arquivo chamado idle.lua e cole isto dentro: local config = { idleWarning = getConfigValue('idleWarningTime'), idleKick = getConfigValue('idleKickTime') } function onThink(cid, interval) if(getTileInfo(getCreaturePosition(cid)).nologout or getCreatureNoMove(cid) or getPlayerCustomFlagValue(cid, PlayerCustomFlag_AllowIdle)) then return true end local idleTime = getPlayerIdleTime(cid) + interval doPlayerSetIdleTime(cid, idleTime) if(config.idleKick > 0 and idleTime > config.idleKick) then doRemoveCreature(cid) elseif(config.idleWarning > 0 and idleTime == config.idleWarning) then local message = "You have been idle for " .. math.ceil(config.idleWarning / 60000) .. " minutes" if(config.idleKick > 0) then message = message .. ", you will be disconnected in " local diff = math.ceil((config.idleWarning - config.idleKick) / 60000) if(diff > 1) then message = message .. diff .. " minutes" else message = message .. "one minute" end message = message .. " if you are still idle" end doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, message .. ".") end return true end Para finalizar, agora vai em \data\creaturescripts\scripts\login.lua e adicione isto: registerCreatureEvent(cid, "Idle") Para você alterar o tempo do exit, basta você abrir o config.lua e adicionar isto, caso já tenha é so configurar: idleWarningTime = 9 * 60 * 1000 idleKickTime = 10 * 60 * 10001 ponto -
Adicionar tempo para uso
Spring Trap reagiu a Yan Liima por uma questão
Cara so acho que você deveria organizar mais o tópico e a script para facilitar kkkk Bom estou meio com pressa aqui, então editei a script aqui para você rapidão. Teste ai... --[[script By Vodkart]]--function onSay(cid, words, param)if getPlayerStorageValue(cid, 212193) > os.time() then return doPlayerSendCancel(cid, "Espere " .. getPlayerStorageValue(cid, 212193) - os.time() .. " segundos.") endlocal config = {pz = False, -- players precisam estar em protection zone para usar? (true or false)battle = true, -- players deve estar sem battle (true or false)custo = true, -- se os teleport irão custa (true or false)need_level = true, -- se os teleport irão precisar de level (true or false)premium = true -- se precisa ser premium account (true or false)}--[[ Config lugares]]--local lugar = {["depot"] = { -- nome do lugarpos = {x=129, y=54, z=6},level = 5,price = 1000},["templo"] = { -- nome do lugarpos = {x=160, y=54, z=7},level = 10, price = 2000},["arena"] = { -- nome do lugarpos = {x=125, y=351, z=9},level = 15,price = 3000},["area vip"] ={ -- nome do lugarpos = {x=280, y=87, z=4},level = 20,price = 4000}}--[[ Lista de Viagem (Não mexa) ]]--if (param == "lista") thenlocal str = ""str = str .. "lista de viagem :\n\n"for name, pos in pairs(lugar) dostr = str..name.."\n"endstr = str .. ""doShowTextDialog(cid, 6579, str)return TRUEendlocal a = lugar[param]if not(a) thendoPlayerSendTextMessage(cid, 22, "desculpe,este lugar não existe")doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF)return TRUEelseif config.pz == true and getTilePzInfo(getCreaturePosition(cid)) == FALSE thendoPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT,"você precisa estar em protection zone pra poder teleportar.")return TRUEelseif config.premium == true and not isPremium(cid) thendoPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT, "Apenas players com premium account podem teleportar.")return TRUEelseif config.battle == true and getCreatureCondition(cid, CONDITION_INFIGHT) == TRUE thendoPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT, "Você precisa estar sem battler pra poder teleportar.")return TRUEelseif config.need_level == true and getPlayerLevel(cid) < a.level thendoPlayerSendTextMessage(cid, 22, "Desculpe,Voce não tem level. voce precisa "..a.level.." level ou mais para ser teleportado.")doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF)return TRUEelseif config.custo == true and doPlayerRemoveMoney(cid, a.price) == FALSE thendoPlayerSendTextMessage(cid, 22, "Desculpe,voce nao tem dinheiro suficiente. Voce precisa "..a.price.." gp para ser teleportado.")doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF)return TRUEenddoTeleportThing(cid, a.pos)doSendMagicEffect(a.pos, CONST_ME_TELEPORT)doPlayerSendTextMessage(cid, 22, "" .. getPlayerName(cid) .. " foi teleportado para: \n " .. param .. ".")setPlayerStorageValue(cid, 212193, os.time() + 30) -- tempo em segundos.return TRUEend1 ponto -
Vida e mana por porcentagem tfs 1.2
Spring Trap reagiu a Yan Liima por uma questão
Tive olhando aqui e parece que é diferente certo? Em tfs 1.2 é assim? msg.add<uint16_t>(std::min<int32_t>(player->getHealth(), std::numeric_limits<uint16_t>::max())); msg.add<uint16_t>(std::min<int32_t>(player->getPlayerInfo(PLAYERINFO_MAXHEALTH), std::numeric_limits<uint16_t>::max())); se for tente assim... Em protocolgame.cpp troque: msg.add<uint16_t>(std::min<int32_t>(player->getHealth(), std::numeric_limits<uint16_t>::max())); msg.add<uint16_t>(std::min<int32_t>(player->getPlayerInfo(PLAYERINFO_MAXHEALTH), std::numeric_limits<uint16_t>::max())); Por: if (player->getPlayerInfo(PLAYERINFO_MAXHEALTH) > 0) { msg.add<uint16_t>(player->getHealth() * 100 / player->getPlayerInfo(PLAYERINFO_MAXHEALTH)); msg.add<uint16_t>(100); } else { msg.add<uint16_t>(0); msg.add<uint16_t>(0); } Troque: msg.add<uint16_t>(std::min<int32_t>(player->getMana(), std::numeric_limits<uint16_t>::max())); msg.add<uint16_t>(std::min<int32_t>(player->getPlayerInfo(PLAYERINFO_MAXMANA), std::numeric_limits<uint16_t>::max())); Por: if (player->getPlayerInfo(PLAYERINFO_MAXMANA) > 0) { msg.add<uint16_t>(player->getMana() * 100 / player->getPlayerInfo(PLAYERINFO_MAXMANA)); msg.add<uint16_t>(100); } else { msg.add<uint16_t>(0); msg.add<uint16_t>(0); } E recompile tudo, tomara que de certo Estou torcendo por você amigo. xD1 ponto