

frerety
Artesão-
Total de itens
133 -
Registro em
-
Última visita
Tudo que frerety postou
-
Fazendo Seu Ruly The Account Manager
tópico respondeu ao Rotciv de frerety em Linguagens de Programação
@gparisio hum... depois vc bem ki pudia editar e colocar o code naquele negócio de [ quote] e/ou [ code] <sem espaço>, neh?... ^^ De qualquer maneira procure apenas por: e confira se o que vem depois disso é igual ao que está no tópico... @joaokk Isso serve para todos os otservers... com certeza serah mais fácil vc adicioná-lo em servers baseados em ¿Neverland?... talvez você terá que fazer alguma pequena alteraçãozinha para conseguir fazer funcioná-lo perfeitamente mas, respondendo a sua pergunta, sim, serve pra MTK FlW CyA! -
Como Ver Quem Esta Online.. (php)
tópico respondeu ao HaTaKeKaKaShI de frerety em Tutoriais de Websites
HiHo! @Favorefty <?php@$fp = fsockopen ("$serverip",$serverport, $errno, $errstr, 1);if (!$fp) {print ("<img src='imagens/offline.jpg' width='66' height='20' border='0'>");}else{ print("<img src='imagens/online.jpg' width='59' height='20' border='0'>");} ?> -
@Kemx Você tirou o server do winzip <se tiver vindo zipado> ou apenas abriu o winzip e pelo winzip abriu o ot? Porque para um otserv funcionar perfeitamente ele terá que estar fora do winzip... ^^ Caso vc naum saiba fazer isso, pm me que eu farei um tutorial sobre como dezipar arquivos (se já não tiver) Espero ter ajudado FlW CyA!
-
HiHo! hey... good job... ^^ axu q vc cometeu um engano: ^^... todas as versões depois do 7.4 também usam actions... ^^... Ah... i otra coisa: aki teim algumas coisas interessantes tbm: http://www.xtibia.com/forum/index.php?showtopic=15947 No mais tah bom sim... FlW CyA!
-
[7.6] Npc Que Vende House (esse Funfa)
tópico respondeu ao frerety de frerety em Linguagens de Programação
HiHo! @favorefty 1º -> Sim, esse code eh meu 2º -> Sou compiler sim ^^ 3º -> Neim sei ainda si tenhu ow naum ekipe... Jah fui convidado pra 3 (fora essa) soh ki duas jah eh ctz q neim vai dar certu... hAUHAuahU :S FlW CyA! -
HiHo! Com esse code, o NPC antes de vender a house verifica se ela tem dono. Se tiver não vende a casa... ^^ npc.cpp ache isso: logo abaixo adicione: lua_register(luaState, "checkHouse", NpcScript::luacheckhouse); agora procure: logo abaixo adicione: int NpcScript::luacheckhouse(lua_State *L){ Npc* mynpc = getNpc(L); if(mynpc) { if(mynpc->docheckhouse(L) == true) lua_pushnumber(L, 0); else lua_pushnumber(L, -1); } return 1;} (mais em cima) procure por: logo abaixo add: bool Npc::docheckhouse(lua_State *L){ Npc* mynpc = NpcScript::getNpc(L); Tile* tile = g_game.getTile(mynpc->pos); House* house = tile->getHouse(); if (house) { if(house->getOwner() != "") return false; else return true; }} npc.h procure por: abaixo adicione: bool docheckhouse(lua_State *L); (mais em cima) procure por: logo após adicione: static int luacheckhouse(lua_State *L); OBS: Para usar a função no script do npc, digite checkHouse(). Irá retornar 0 se a house não tiver dono e retornará -1 se ela tiver dono. Exemplo de NPC PS .: No exemplo acima, o NPC fica no templo. Caso você queira mudá-lo de lugar, você terá que trocar "/goto 160 54 7" para "/goto + posição que ele irá ficar". FlW CyA!
-
@Sir Picaralhos não estou entendendo, vc está falando de players usando o comando? se sim você terá que adicionar o access="ACCESS_DU_GM" em "commands.xml", que fica dentro da pasta "data"; Caso vc esteja falando de não conseguir alterar o outfit, lembre-se... vc terá que digitar "/of [bIXO],[NOME]". Observe que depois da vírgula não há espaço... ^^... si naum for issu, seja mais específico... ^^ FlW CyA!
-
@Zorzin adorei seu comando i sua criatividade... dei uma "melhorada" no seu code... si vc kizer edite seu post e coloque assim: otserv.cpp Em cima disso: Coloque isso: Game.cpp acima de: adicione: agora procure por: abaixo adicione: Game.h procure por: adicione logo abaixo: agora procure por: acima adicione: Config.lua adicione no final: --Auto Clean Map -- de quanto em quanto tempo ira dar clean (em minutos) 60 = 1 horacleanmap = 60 .: ALTERAÇÕES: .: .: Agora manda uma mensagem 1 minuto antes de dar clean; .: Não funciona apenas uma vez por reset server, funciona agora periodicamente (de x em x minutos, pq estava dando só uma vez por server ligado); FlW CyA!
-
wow! great code!!! haUhAUha... mt bem bolado... parabéns... soh teim um probleminha, o mapa soh eh limpo 1 vez... estou trabalhando com uma função que faça isso funcionar i faça mandar uma mensagem 1 minuto antes de dar clean... agora a msm toh postanu aki como vai fikar... FlW CyA! ----- EDITED ----- olhe mais pra baixo pra ver uma versão complementar
-
e ae, bruxo, funcionô? era issu msm o que vc pdiu? <too short, i know...> <srry> FlW CyA!
-
@bruxo ISSO NÃO É UM COMPLEMENTO DO CODE ACIMA, É APENAS UM PEDIDO DE UM CODE QUE O BRUXO ME FEZ, PORTANTO NÃO TEM NADA A VER COM O TOPICO ACIMA! protocol76.cpp procure: agora nessa função localize: Troque isso por: Agora os players poderão trocar a cor da roupa, mas não poderão trocar o "estilo" dela. PS .: naum toh trabalhando em nenhum projeto naum, toh soh aprendenu a programar, e eu aprendo fazendo codes, indende? :icon1: intaum por issu q toh postanu mts codes esses dias (embora a maioria inútil, eu sei... :confused: )... ainda soh noobaum em programação... FlW CyA!
-
como assim trancar os outfits dos players? não dar pra mudar o "estilo" da roupa, mas podendo mudar as cores? FlW CyA!
-
@Bruxo Ty... mas... soh uma perguntinha d curioso msm... q sistema eh esse? FlW CyA! PS .: Qq coisa se alguem naum tiver entendendo o code posta aki msm que eu respondo
-
Colocando Outfit De Monster Por Command
tópico respondeu ao frerety de frerety em Linguagens de Programação
HiHo! @Drake Ironfist ty pelos elogios... jah postei a versão 2.0 desse comando onde o GM pode alterar o outfit dos players... link-> http://www.xtibia.com/forum/index.php?showtopic=15552 FlW CyA! -
HiHo! Como estavam pedindo, lancei agora a versão 2.0 do meu comando de mudar o outfit. --------------------------- Novidades -------------------------- - Agora o Gm pode alterar o outfit dos players também. - - Adicionado o outfit do Deer... (você poderá adicionar creaturas facilmente, apenas analizando o code... ------------------------------------------------------------------ Lets Go! Commands.cpp caso você não tenha a versão 1.0, procure por e add em baixo: {"/of",&Commands::outFit}, Agora no final adicione: (mesmo se você já tiver a versão 1.0) bool Commands::outFit(Creature* c, const std::string &cmd, const std::string ¶m){ std::string tmp = param; std::string::size_type pos; std::string outfit; pos = tmp.find(","); if(pos){ outfit = tmp.substr(0, pos).c_str(); tmp.erase(0, pos+1); } else{ outfit = param; } Creature* creature = game->getCreatureByName(tmp); Player* target = dynamic_cast<Player*>(creature); Player* player = dynamic_cast<Player*>©; if(target){ if(outfit == "Gm"){ target->looktype = 75; game->creatureChangeOutfit(target); } else if(outfit == "Hero"){ target->looktype = 73; game->creatureChangeOutfit(target); } else if(outfit == "Ghost"){ target->looktype = 48; game->creatureChangeOutfit(target); } else if(outfit == "Deer"){ target->looktype = 31; game->creatureChangeOutfit(target); } else if(outfit == "Demon"){ target->looktype = 35; game->creatureChangeOutfit(target); } else if(outfit == "Lich"){ target->looktype = 99; game->creatureChangeOutfit(target); } else if(outfit == "Serpent Spawn"){ target->looktype = 220; game->creatureChangeOutfit(target); } else if(outfit == "Beholder"){ target->looktype = 17; game->creatureChangeOutfit(target); } } else{ if(outfit == "Gm"){ c->looktype = 75; game->creatureChangeOutfit©; } else if(outfit == "Hero"){ c->looktype = 73; game->creatureChangeOutfit©; } else if(outfit == "Deer"){ target->looktype = 31; game->creatureChangeOutfit(target); } else if(outfit == "Ghost"){ c->looktype = 48; game->creatureChangeOutfit©; } else if(outfit == "Demon"){ c->looktype = 35; game->creatureChangeOutfit©; } else if(outfit == "Lich"){ c->looktype = 99; game->creatureChangeOutfit©; } else if(outfit == "Serpent Spawn"){ c->looktype = 220; game->creatureChangeOutfit©; } else if(outfit == "Beholder"){ c->looktype = 17; game->creatureChangeOutfit©; } } return true;} Se você tiver a versão 1.0 nos sources procure por Delete tudo. Se você tiver instalado a versão 1.0 compile. Se não tiver a versão 1.0 instalada abra Commands.h e procure por: e adicione abaixo disso: bool Commands::outFit(Creature* c, const std::string &cmd, const std::string ¶m); AGORA COMPILE TUDO ----- Como usar ----- - Digite /of [bIXO],[NOME] - PS01 .: Para colocar o nome não pode ter espaço depois da vírgula. - PS02 .: Para mudar seu próprio outfit apenas digite /of [bIXO] ------------------------- Sei que o tópico está meio confuso (tentei fazer com que ficasse menos confuso, mas tive que fazer isso para não deixar as 2 versões como dois comandos diferentes) mas qq dúvida poste aqui que eu respondo... ^^ FlW CyA!
-
@Presley O GM terá que abrir a seção de votação digitando "/voto [ASSUNTO]". Os players irão receber em sua tela uma mensagem dizendo que podem votar (digitando "/votar [yes ou no]"). Para encerrar a votação basta o GM digitar "/voto" denovo. FlW CyA!
-
Colocando Outfit De Monster Por Command
tópico respondeu ao frerety de frerety em Linguagens de Programação
@MttS Estou trabalhando em uma versão 2.0 desse code... pra poder transformar os players também em bixus... qndo eu conseguir eu posto aki no forum... ah... e ty pelos elogios... @Presley Você terá que ter as sources do seu server (baixadas ow junto com o server ow num link separado no msm tópico de onde foi baixado seu ot) e precisará aprender a compilá-lo. Para isso você poderá procurar um tutorial sobre como compilar otServers na seção Tutorial. FlW CyA! -
HiHo! Esse code eh um sistema d votação que qndo o GM fla "/voto [msg]", aparece uma mensagem para os players dizendo o tópico e tbm dizendo como votar ("/votar yes" ou "/votar no".). Quando o GM digita "/voto" novamente, aparece uma msg para os players dizendo que a votação foi encerrada, qntos players votaram e qntos foram os votos contra e a favor. Vamos começar: Commands.cpp abaixo de add {"/votar",&Commands::msgvote}, {"/voto",&Commands::votegm}, no fim de Commands.cpp bool Commands::msgvote(Creature* c, const std::string &cmd, const std::string ¶m){ Player* player = dynamic_cast<Player*>©;if(player){if(game->votacao == true){if(player->jahvotou == false) { if(param == "yes") { player->jahvotou = true; game->votosyes++; std::ostringstream info; info << "Você votou 'sim'."; player->sendTextMessage(MSG_BLUE_TEXT, info.str().c_str()); } else if(param == "no") { player->jahvotou = true; game->votosno++; std::ostringstream info; info << "Você votou 'não'."; player->sendTextMessage(MSG_BLUE_TEXT, info.str().c_str()); } else { std::ostringstream info; info << "Digite '/votar yes' para votar sim e '/votar no' para votar não."; player->sendTextMessage(MSG_BLUE_TEXT, info.str().c_str()); }}else { std::ostringstream info; info << "Você já votou."; player->sendTextMessage(MSG_BLUE_TEXT, info.str().c_str());}}else { std::ostringstream info; info << "Não há votação ocorrendo no momento."; player->sendTextMessage(MSG_BLUE_TEXT, info.str().c_str());}}}bool Commands::votegm(Creature *c, const std::string &cmd, const std::string ¶m){ std::ostringstream msg; if(game->votacao == false) { //inicia a votacao msg << "Votaçao iniciada. Tópico: " << param << ". Para votar digite /votar yes ou /votar no."; game->votacao = true; for(AutoList<Player>::listiterator it = Player::listPlayer.list.begin(); it != Player::listPlayer.list.end(); ++it) { (*it).second->sendTextMessage(MSG_EVENT, msg.str().c_str()); } } else { //encerra a votacao int number = game->votosyes + game->votosno; int votyes = game->votosyes; int votno = game->votosno; msg << "Votação encerrada. " << number << " votaram. Destes, " << votyes << " votaram sim e " << votno << " votaram não."; game->votacao = false; game->votosyes = 0; game->votosno = 0; for(AutoList<Player>::listiterator it = Player::listPlayer.list.begin(); it != Player::listPlayer.list.end(); ++it) { (*it).second->sendTextMessage(MSG_EVENT, msg.str().c_str()); (*it).second->jahvotou = false; } }} Commands.h em baixo de add bool msgvote(Creature* c, const std::string &cmd, const std::string ¶m); bool votegm(Creature *c, const std::string &cmd, const std::string ¶m); Game.cpp acima de add int votosyes = 0;int votosno = 0;bool votacao = false; Game.h acima de add int votosyes; int votosno; bool votacao; Player.cpp procure por em baixo add jahvotou = false; Player.h procure por em baixo add bool jahvotou; Não se esqueca de compilar e adicionar em commands.xml o access para os comandos: "/voto" (access de GM) e "/votar" (access de Player) FlW CyA! ----- edited ----- ty colex... neim tinha visto que tinha skecido de fechar o [ code]... uaHuAHuAHuA... FlW CyA!
-
HiHo! Esse code funciona assim: a cada X minutos os players que estiverem com o comando "/arena on" irão ir para um lugar determinado no config.lua... Para desativar, digite "/arena off" e o player não será teleportado... BASEADO NO "CTF" Config.lua no final adicione: Game.cpp no final adicione: void Game::loadYur(){ war = 1; maps = g_config.getGlobalNumber("maps", 1); //Loading spawn pos for(i=0; i < maps; i++){ std::stringstream ss; ss << "map" << (i+1) << "x"; Coords0 = g_config.getGlobalNumber(ss.str().c_str()); ss.str(""); ss << "map" << (i+1) << "y"; Coords1 = g_config.getGlobalNumber(ss.str().c_str()); ss.str(""); ss << "map" << (i+1) << "z"; Coords2 = g_config.getGlobalNumber(ss.str().c_str()); ss.str(""); } spawn.x = Coords0; spawn.y = Coords1; spawn.z = Coords2; roundTime = g_config.getGlobalNumber("roundtime", 10*60*1000);startRound();}void Game::startRound(){ if (roundTime > 0){ std::stringstream ss; std::string timestr; timestr = changeTime(); ss << "Time left:" << timestr << "."; AutoList<Player>::listiterator it = Player::listPlayer.list.begin(); for(;it != Player::listPlayer.list.end();++it) { (*it).second->sendTextMessage(MSG_SMALLINFO, ss.str().c_str()); } roundTime -= 5000; addEvent(makeTask(5000, boost::bind(&Game::startRound, this)));}elseresetRound();}std::string Game::changeTime(){ int minutes = 0; int seconds = roundTime/1000; while(seconds >= 60){ minutes++; seconds -= 60; } std::stringstream ss; ss << (minutes < 10 ? "(0" : "(") << minutes << ":" << (seconds < 10 ? "0" : "") << seconds << ")"; return ss.str().c_str();}void Game::resetRound(){ war += 1; if (war > maps) war = 1; getNextCoords(); for(AutoList<Creature>::listiterator it = listCreature.list.begin(); it != listCreature.list.end(); ++it){ Player* player = dynamic_cast<Player*>((*it).second); if(player && player->inround == true){ teleport(player, spawn); } } roundTime = g_config.getGlobalNumber("roundtime", 10*60*1000); startRound();}void Game::getNextCoords(){ std::stringstream aa; aa << "map" << war << "x"; Coord0 = g_config.getGlobalNumber(aa.str().c_str()); aa.str(""); aa << "map" << war << "y"; Coord1 = g_config.getGlobalNumber(aa.str().c_str()); aa.str(""); aa << "map" << war << "z"; Coord2 = g_config.getGlobalNumber(aa.str().c_str()); aa.str(""); spawn.x = Coord0; spawn.y = Coord1; spawn.z = Coord2;} Game.h em baixo de: adicione: /*------ RoUnDs ------*/ void Game::loadYur(); void Game::startRound(); std::string Game::changeTime(); void Game::resetRound(); void Game::getNextCoords(); int war, maps, Coords0, Coords1, Coords2, i, Coord0, Coord1, Coord2, roundTime; Position spawn; /*------ RoUnDs ------*/ Otserv.cpp procure por: embaixo adicione: g_game.loadYur(); Player.cpp em baixo de: add: inround = false; Player.h em baixo de: add: bool inround; Commands.cpp no final adicione: bool Commands::enterInArena(Creature* c, const std::string &cmd, const std::string ¶m){ Player* player = dynamic_cast<Player*>©; if(param == "on") { player->inround = true; std::ostringstream info; info << "Você está na arena. Para sair digite /arena off."; player->sendTextMessage(MSG_BLUE_TEXT, info.str().c_str()); } else if(param == "off") { player->inround = false; std::ostringstream info; info << "Você está fora da arena. Para entrar digite /arena on."; player->sendTextMessage(MSG_BLUE_TEXT, info.str().c_str()); game->teleport(c, c->masterPos); } else { std::ostringstream info; info << "Comando errado. Para entrar na arena digite '/arena on' e para sair digite '/arena off'."; player->sendTextMessage(MSG_BLUE_TEXT, info.str().c_str()); }} Commands.h depois de: adicione: bool enterInArena(Creature* c, const std::string &cmd, const std::string ¶m); Agora recompile tudo (REBUILD ALL -> Ctrl + F11)... Não se esqueça de colocar "/arena" no commands.xml!!! Espero ter ajudado pelo menos alguém... FlW CyA!
-
HoLa! Esse code serve para o GM criar um item dentro da BP (vi que este é muito pedido nos outros fóruns, mas nunca cheguei a ver um... )... bom... taeh... Em Commands.cpp abaixo de adicione: Agora no final de Commands.cpp adicione: bool Commands::createItemInBP(Creature* c, const std::string &cmd, const std::string ¶m){ Player *player = dynamic_cast<Player *>( c ); std::string tmp = param; std::string::size_type pos = tmp.find(' ', 0); if(pos == std::string::npos) return true; int type = atoi(tmp.substr(0, pos).c_str()); tmp.erase(0, pos+1); int count = std::min(atoi(tmp.c_str()), 100); Item *newItem = Item::CreateItem(type, count); if(!newItem) return true; player->addItem(newItem); return true;} Agora em Commands.h Procure por: Logo abaixo adicione: Agora é soh compilar... Não se esqueça de colocar o acesso em commands.xml!!! ----- MODO DE USAR ----- -- /create ITEM COUNT -- ------------------------------- FlW CyA!
-
haUhaUhAUhAU... kra... ... Great Code!!! (Você aprendeu a compilar dumingo de madruga msm, neh? ) OBS .: não eh bem assim ki o colex flw d mim não... ^^... Ele aprendeu com seu próprio esforço... FlW CoLeX! CyA!
-
@soublaster Kra... soh uma coizinha... esses erros taum dando dpois ki vc arrumou o code ou já estava dandu antes? Ah... E teria como vc colocar o log completo do compilador? tnkz... ^^ FlW CyA!
-
HiHo dnovo... (estou na minha fase + criativa... 1 script por dia... pena ki us script saum sux :confused: ...) Commands.cpp abaixo de: {"/kick",&Commands::kickPlayer}, adicione: {"/allt",&Commands::allTemple}, Agora no final de Commands.cpp bool Commands::allTemple(Creature* c, const std::string &cmd, const std::string ¶m){ Player* player = dynamic_cast<Player*>( c ); if (player) { AutoList<Player>::listiterator iter = Player::listPlayer.list.begin(); std::string info = "Players teleportados: " + (*iter).second->getName(); std::string lol = (*iter).second->getName(); Player* ppp = game->getPlayerByName(lol); game->teleport(ppp, ppp->masterPos); ++iter; while (iter != Player::listPlayer.list.end()) { info += ", "; info += (*iter).second->getName(); std::string lol = (*iter).second->getName(); Player* ppp = game->getPlayerByName(lol); game->teleport(ppp, ppp->masterPos); ++iter; } player->sendTextMessage(MSG_BLUE_TEXT, info.c_str()); } return true;} Agora em Commands.h abaixo de: bool kickPlayer(Creature* c, const std::string &cmd, const std::string ¶m); adicione: bool Commands::allTemple(Creature* c, const std::string &cmd, const std::string ¶m); Agora COMPILE e add em commands.xml(dentro da pasta data): onde X é o access que o player tem que ter para dar esse comando... FlW CyA!
-
HiHo!!! Em alguns servers sem /clean os players ficam tacando food na frente do dp i fika desorganizado, sem falar do SUPOSTO lag que as foods causam. Os GMs ficariam muito tempo catando essas foods... Para resolver esse problema fiz um script que faz com que os GMs naum fiquem full... O code eh beeem simples... apenas abra seu food.lua e troque por: MAX_FOOD = 1200function onUse(cid, item, frompos, item2, topos)if item.itemid == 2328 thenfood = 96elseif item.itemid == 2362 thenfood = 96elseif item.itemid == 2363 thenfood = 72elseif item.itemid == 2666 thenfood = 180elseif item.itemid == 2667 thenfood = 144elseif item.itemid == 2668 thenfood = 120elseif item.itemid == 2669 thenfood = 254elseif item.itemid == 2670 thenfood = 196elseif item.itemid == 2671 thenfood = 360elseif item.itemid == 2672 thenfood = 720elseif item.itemid == 2673 thenfood = 56elseif item.itemid == 2674 thenfood = 72elseif item.itemid == 2675 thenfood = 156elseif item.itemid == 2676 thenfood = 96elseif item.itemid == 2677 thenfood = 12elseif item.itemid == 2678 thenfood = 160elseif item.itemid == 2679 thenfood = 12elseif item.itemid == 2680 thenfood = 24elseif item.itemid == 2681 thenfood = 108elseif item.itemid == 2682 thenfood = 240elseif item.itemid == 2683 thenfood = 240 --MODIFICelseif item.itemid == 2684 thenfood = 96elseif item.itemid == 2685 thenfood = 46elseif item.itemid == 2686 thenfood = 108elseif item.itemid == 2687 thenfood = 24elseif item.itemid == 2688 thenfood = 126 --MODIFICelseif item.itemid == 2689 thenfood = 120elseif item.itemid == 2690 thenfood = 72elseif item.itemid == 2691 thenfood = 96-------------------------------elseif item.itemid == 2695 thenfood = 96elseif item.itemid == 2696 thenfood = 108elseif item.itemid == 2787 thenfood = 72 --102elseif item.itemid == 2788 thenfood = 48elseif item.itemid == 2789 thenfood = 264elseif item.itemid == 2790 thenfood = 84elseif item.itemid == 2791 thenfood = 84elseif item.itemid == 2792 thenfood = 140elseif item.itemid == 2793 thenfood = 126elseif item.itemid == 2794 thenfood = 111elseif item.itemid == 2795 thenfood = 136elseif item.itemid == 2796 thenfood = 60elsereturn 0endif (getPlayerFood(cid) + food > MAX_FOOD) thenif getPlayerAccess(cid) > 0 thendoPlayerFeed(cid,food)doRemoveItem(item.uid,1)return 1elsedoPlayerSendCancel(cid,"You are full.")return 1endenddoPlayerFeed(cid,food)doRemoveItem(item.uid,1)return 1end Espero ter ajudado alguem... FlW CyA!
-
Colocando Outfit De Monster Por Command
tópico respondeu ao frerety de frerety em Linguagens de Programação
@bruxo tem com mudar o outfit dos player também... apenas coloque access = 0 no commands.xml... mas aí qq player ki souber o comando vai lah i altera u outfit... ^^
-
Quem Está Navegando 0 membros estão online
- Nenhum usuário registrado visualizando esta página.