Ir para conteúdo
  • Cadastre-se

(Resolvido)Attack msm q no bixo


Ir para solução Resolvido por xWhiteWolf,

Posts Recomendados

no meu ot o attack e o msm q quando eu ataco 1 bixo 

ex

eu ranko 10k no bixo ,ai eu tb ranko 10k no player quando eu ataco ele

se alguem souber como arrumar .

Link para o post
Compartilhar em outros sites

O tópico foi movido para a área correta, preste mais atenção da próxima vez!

Leia as regras do fórum: http://tibiaking.com/forum/topic/1281-regras-gerais/?p=7680

Este tópico foi movido:

De: "OTServScriptingGeral"

Para: "OTServSuporte OTServSuporte de Scripts"

Link para o post
Compartilhar em outros sites

especifique mais gafanhoto, attack melee mesmo, distance, wand ou spells? Ou Todos??

Todos os meus trabalhos importantes estão na seção "Sobre mim" no meu perfil; Dá uma passada lá!

"Há três caminhos para o fracasso: não ensinar o que se sabe, não praticar o que se ensina, e não perguntar o que se ignora." - São Beda

I7Pm6ih.png

(obg ao @Beeny por fazer essa linda sign <3)

Link para o post
Compartilhar em outros sites

especifique mais gafanhoto, attack melee mesmo, distance, wand ou spells? Ou Todos??

malz é q eu sou novo nisso,blz vo tenta explicar melhor.

o meu ot é wodbo 8.54,quando eu uso uma magia vamo supor Death ball,ela ranka em 1 bixo comum uns 40k ai quando eu uso a msm magia

no player ela ranka 40k tb,eu queria q quando atacasse o player hitasse tipo uns 5k ou 10k sla.

Link para o post
Compartilhar em outros sites

todas as magias estão assim ou somente essa magia? Posta o script dela por favor pra eu dar uma olhada

Todos os meus trabalhos importantes estão na seção "Sobre mim" no meu perfil; Dá uma passada lá!

"Há três caminhos para o fracasso: não ensinar o que se sabe, não praticar o que se ensina, e não perguntar o que se ignora." - São Beda

I7Pm6ih.png

(obg ao @Beeny por fazer essa linda sign <3)

Link para o post
Compartilhar em outros sites

todas as magias estão assim ou somente essa magia? Posta o script dela por favor pra eu dar uma olhada

todas estao assim,vo mostra 1

 

local combat1 = createCombatObject()
setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
setCombatParam(combat1, COMBAT_PARAM_EFFECT, 4)
setCombatParam(combat1, COMBAT_PARAM_DISTANCEEFFECT, 30)
setCombatFormula(combat1, COMBAT_FORMULA_LEVELMAGIC, -1.3, 0, -1.5, 0)
 
local combat2 = createCombatObject()
setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
setCombatParam(combat2, COMBAT_PARAM_EFFECT, 65)
setCombatParam(combat2, COMBAT_PARAM_DISTANCEEFFECT, 30)
setCombatFormula(combat2, COMBAT_FORMULA_LEVELMAGIC, -1.3, 0, -1.5, 0)
 
local combat3 = createCombatObject()
setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
setCombatParam(combat2, COMBAT_PARAM_EFFECT, 65)
setCombatParam(combat2, COMBAT_PARAM_DISTANCEEFFECT, 30)
setCombatFormula(combat2, COMBAT_FORMULA_LEVELMAGIC, -1.3, 0, -1.5, 0)
 
local combat3 = createCombatObject()
setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
setCombatParam(combat2, COMBAT_PARAM_EFFECT, 65)
setCombatParam(combat2, COMBAT_PARAM_DISTANCEEFFECT, 30)
setCombatFormula(combat2, COMBAT_FORMULA_LEVELMAGIC, -1.3, 0, -1.5, 0)
 
local function onCastSpell1(parameters)
doCombat(parameters.cid, parameters.combat1, parameters.var)
end
 
local function onCastSpell2(parameters)
doCombat(parameters.cid, parameters.combat2, parameters.var)
end
 
local function onCastSpell3(parameters)
doCombat(parameters.cid, parameters.combat3, parameters.var)
end
 
local function onCastSpell3(parameters)
doCombat(parameters.cid, parameters.combat3, parameters.var)
end
 
function onCastSpell(cid, var)
if exhaustion.get(cid,61260) == false then
local parameters = { cid = cid, var = var, combat1 = combat1, combat2 = combat2, combat2 = combat2, }
addEvent(onCastSpell1, 0, parameters) 
addEvent(onCastSpell2, 300, parameters)
addEvent(onCastSpell2, 600, parameters)
addEvent(onCastSpell2, 900, parameters) 
exhaustion.set(cid,61260,1)
else
doPlayerSendCancel(cid, "You are exhausted")
end
return true
end
Editado por cesarfilho55 (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

ela tá por fórmula tb, que estranho.. posta seu vocations.xml aí pra mim dar uma olhada. Não consigo imaginar oque esteja causando isso :/

Todos os meus trabalhos importantes estão na seção "Sobre mim" no meu perfil; Dá uma passada lá!

"Há três caminhos para o fracasso: não ensinar o que se sabe, não praticar o que se ensina, e não perguntar o que se ignora." - São Beda

I7Pm6ih.png

(obg ao @Beeny por fazer essa linda sign <3)

Link para o post
Compartilhar em outros sites
esse é 1 vocaçao, q no caso é Tsuful.
 
 
 
<vocation id="165" name="Tsuful" description="a tsuful" needpremium="0" gaincap="70" gainhp="270" gainmana="230" gainhpticks="3.5" gainhpamount="300" gainmanaticks="3" gainmanaamount="400" manamultiplier="1.1" attackspeed="1800" soulmax="100" gainsoulticks="120" fromvoc="165">
 <formula meleeDamage="8.0" distDamage="8.0" wandDamage="3.0" magDamage="3.5" magHealingDamage="7.0" defense="1.1" magdefense="1.3" armor="50.0"/>
 <skill fist="1.1" club="1.1" sword="1.0" axe="1.2" distance="1.1" shielding="1.1" fishing="1.1" experience="1.0"/>
</vocation>
<vocation id="166" name="Tsuful 2" description="a tsuful" needpremium="0" gaincap="70" gainhp="270" gainmana="230" gainhpticks="3.0" gainhpamount="600" gainmanaticks="3" gainmanaamount="700" manamultiplier="1.1" attackspeed="1500" soulmax="100" gainsoulticks="120" fromvoc="165">
 <formula meleeDamage="15.0" distDamage="15.0" wandDamage="5.0" magDamage="6.5" magHealingDamage="16.0" defense="1.1" magdefense="1.3" armor="50.0"/>
 <skill fist="1.1" club="1.1" sword="1.0" axe="1.2" distance="1.1" shielding="1.1" fishing="1.1" experience="1.0"/>
</vocation>
<vocation id="167" name="Tsuful 3" description="a tsuful" needpremium="0" gaincap="70" gainhp="270" gainmana="230" gainhpticks="3.0" gainhpamount="1100" gainmanaticks="3" gainmanaamount="900" manamultiplier="1.1" attackspeed="1200" soulmax="100" gainsoulticks="120" fromvoc="165">
 <formula meleeDamage="22.0" distDamage="22.0" wandDamage="8.0" magDamage="9.0" magHealingDamage="23.0" defense="1.1" magdefense="1.3" armor="50.0"/>
 <skill fist="1.1" club="1.1" sword="1.0" axe="1.2" distance="1.1" shielding="1.1" fishing="1.1" experience="1.0"/>
</vocation>
<vocation id="168" name="Tsuful 4" description="a tsuful" needpremium="0" gaincap="70" gainhp="270" gainmana="230" gainhpticks="3.0" gainhpamount="1700" gainmanaticks="3" gainmanaamount="1150" manamultiplier="1.1" attackspeed="900" soulmax="100" gainsoulticks="120" fromvoc="165">
 <formula meleeDamage="29.0" distDamage="29.0" wandDamage="12.0" magDamage="13.5" magHealingDamage="30.0" defense="1.1" magdefense="1.3" armor="50.0"/>
 <skill fist="1.1" club="1.1" sword="1.0" axe="1.2" distance="1.1" shielding="1.1" fishing="1.1" experience="1.0"/>
</vocation>
<vocation id="169" name="Tsuful 5" description="a tsuful" needpremium="0" gaincap="70" gainhp="270" gainmana="230" gainhpticks="3.0" gainhpamount="2300" gainmanaticks="3" gainmanaamount="1400" manamultiplier="1.1" attackspeed="600" soulmax="100" gainsoulticks="120" fromvoc="165">
 <formula meleeDamage="37.0" distDamage="37.0" wandDamage="16.0" magDamage="22.5" magHealingDamage="35.5" defense="1.1" magdefense="1.3" armor="50.0"/>
 <skill fist="1.1" club="1.1" sword="1.0" axe="1.2" distance="1.1" shielding="1.1" fishing="1.1" experience="1.0"/>
</vocation>
<vocation id="170" name="Tsuful 6" description="a tsuful" needpremium="0" gaincap="70" gainhp="270" gainmana="230" gainhpticks="3.0" gainhpamount="2900" gainmanaticks="3" gainmanaamount="1800" manamultiplier="1.1" attackspeed="300" soulmax="100" gainsoulticks="120" fromvoc="165">
 <formula meleeDamage="45.0" distDamage="45.0" wandDamage="20.0" magDamage="25.0" magHealingDamage="42.5" defense="1.1" magdefense="1.3" armor="50.0"/>
 <skill fist="1.1" club="1.1" sword="1.0" axe="1.2" distance="1.1" shielding="1.1" fishing="1.1" experience="1.0"/>
</vocation>
<vocation id="171" name="Tsuful 7" description="a tsuful" needpremium="0" gaincap="70" gainhp="270" gainmana="230" gainhpticks="3.0" gainhpamount="4200" gainmanaticks="3" gainmanaamount="2500" manamultiplier="1.1" attackspeed="100" soulmax="100" gainsoulticks="120" fromvoc="165">
 <formula meleeDamage="50.0" distDamage="58.0" wandDamage="28.0" magDamage="28.5" magHealingDamage="47.0" defense="1.1" magdefense="1.3" armor="50.0"/>
 <skill fist="1.1" club="1.1" sword="1.0" axe="1.2" distance="1.1" shielding="1.1" fishing="1.1" experience="1.0"/>
</vocation>
 
<vocation id="172" name="Tsuful Reborn 1" description="a tsuful" needpremium="0" gaincap="50" gainhp="270" gainmana="230" gainhpticks="3.0" gainhpamount="2000" gainmanaticks="3" gainmanaamount="900" manamultiplier="1.1" attackspeed="1200" soulmax="200" gainsoulticks="120" fromvoc="172">
 <formula meleeDamage="27.5" distDamage="25.0" wandDamage="12.0" magDamage="13.0" magHealingDamage="30.0" defense="1.1" magdefense="1.3" armor="50.0"/>
 <skill fist="1.1" club="1.1" sword="1.0" axe="1.2" distance="1.1" shielding="1.1" fishing="1.1" experience="1.0"/>
</vocation>
<vocation id="173" name="Tsuful Reborn 2" description="a tsuful" needpremium="0" gaincap="50" gainhp="270" gainmana="230" gainhpticks="3.0" gainhpamount="2700" gainmanaticks="3" gainmanaamount="1150" manamultiplier="1.1" attackspeed="900" soulmax="200" gainsoulticks="120" fromvoc="172">
 <formula meleeDamage="35.0" distDamage="36.0" wandDamage="17.0" magDamage="22.5" magHealingDamage="38.0" defense="1.1" magdefense="1.3" armor="50.0"/>
 <skill fist="1.1" club="1.1" sword="1.0" axe="1.2" distance="1.1" shielding="1.1" fishing="1.1" experience="1.0"/>
</vocation>
<vocation id="174" name="Tsuful Reborn 3" description="a tsuful" needpremium="0" gaincap="50" gainhp="270" gainmana="230" gainhpticks="3.0" gainhpamount="3600" gainmanaticks="3" gainmanaamount="1400" manamultiplier="1.1" attackspeed="600" soulmax="200" gainsoulticks="120" fromvoc="172">
 <formula meleeDamage="41.0" distDamage="41.0" wandDamage="19.0" magDamage="25.5" magHealingDamage="44.0" defense="1.1" magdefense="1.3" armor="50.0"/>
 <skill fist="1.1" club="1.1" sword="1.0" axe="1.2" distance="1.1" shielding="1.1" fishing="1.1" experience="1.0"/>
</vocation>
<vocation id="175" name="Tsuful Reborn 4" description="a tsuful" needpremium="0" gaincap="50" gainhp="270" gainmana="230" gainhpticks="3.0" gainhpamount="4200" gainmanaticks="3" gainmanaamount="1800" manamultiplier="1.1" attackspeed="300" soulmax="200" gainsoulticks="120" fromvoc="172">
 <formula meleeDamage="49.0" distDamage="48.0" wandDamage="23.0" magDamage="28.5" magHealingDamage="51.0" defense="1.1" magdefense="1.3" armor="50.0"/>
 <skill fist="1.1" club="1.1" sword="1.0" axe="1.2" distance="1.1" shielding="1.1" fishing="1.1" experience="1.0"/>
</vocation>
<vocation id="176" name="Tsuful Reborn 5" description="a tsuful" needpremium="0" gaincap="50" gainhp="270" gainmana="230" gainhpticks="3.0" gainhpamount="5000" gainmanaticks="3" gainmanaamount="2500" manamultiplier="1.1" attackspeed="300" soulmax="200" gainsoulticks="120" fromvoc="172">
 <formula meleeDamage="55.0" distDamage="55.0" wandDamage="31.0" magDamage="34.0" magHealingDamage="55.0" defense="1.1" magdefense="1.3" armor="50.0"/>
 <skill fist="1.1" club="1.1" sword="1.0" axe="1.2" distance="1.1" shielding="1.1" fishing="1.1" experience="1.0"/>
</vocation>
Editado por cesarfilho55 (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

acho q o problema foi que vc deixou um numero muito alto no multiplicador de dano e deixou um numero mt pequeno no multiplicador de defesa:

<formula meleeDamage="8.0" distDamage="8.0" wandDamage="3.0" magDamage="3.5" magHealingDamage="7.0" defense="1.1" magdefense="1.3" armor="50.0"/>

aumenta o defense, magdefense e o armor.. isso pra cada classe!

Editado por xWhiteWolf (veja o histórico de edições)

Todos os meus trabalhos importantes estão na seção "Sobre mim" no meu perfil; Dá uma passada lá!

"Há três caminhos para o fracasso: não ensinar o que se sabe, não praticar o que se ensina, e não perguntar o que se ignora." - São Beda

I7Pm6ih.png

(obg ao @Beeny por fazer essa linda sign <3)

Link para o post
Compartilhar em outros sites

acho q o problema foi que vc deixou um numero muito alto no multiplicador de dano e deixou um numero mt pequeno no multiplicador de defesa:

<formula meleeDamage="8.0" distDamage="8.0" wandDamage="3.0" magDamage="3.5" magHealingDamage="7.0" defense="1.1" magdefense="1.3" armor="50.0"/>

aumenta o defense, magdefense e o armor.. isso pra cada classe!

vo baixar para ve se funciona,so q eu to ocupado com a escola ai pode demora uns dias.

Link para o post
Compartilhar em outros sites

vo baixar para ve se funciona,so q eu to ocupado com a escola ai pode demora uns dias.

Bom o problema foi resolvido,pode colocar o topico como resolvido vlw Rep + ^^

Link para o post
Compartilhar em outros sites
  • Solução

você que tem que colocar como resolvido, para isso clique em "Melhor Resposta" na resposta que eu te dei e o tópico ficará como [RESOLVIDO]

Todos os meus trabalhos importantes estão na seção "Sobre mim" no meu perfil; Dá uma passada lá!

"Há três caminhos para o fracasso: não ensinar o que se sabe, não praticar o que se ensina, e não perguntar o que se ignora." - São Beda

I7Pm6ih.png

(obg ao @Beeny por fazer essa linda sign <3)

Link para o post
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.


  • Conteúdo Similar

    • Por chateadoagr
      Bem-vindo ao Genesis Online Tibia (GOT), um mundo onde a civilização foi devastada por um apocalipse zumbi. Inspirado em referências como The Walking Dead e Resident Evil, o GOT desafia você a sobreviver em meio ao caos, enfrentando hordas de mortos-vivos, explorando ruínas perigosas e formando alianças estratégicas. Embarque nesta jornada épica de sobrevivência e descoberta, onde cada escolha molda seu destino em um cenário hostil repleto de desafios e perigos iminentes.
       
       
      Adentre o universo de Genesis Online Tibia (GOT), um jogo repleto de sistemas inovadores e emocionantes. Equipe-se com um vasto arsenal de armas para enfrentar as ameaças do apocalipse zumbi, enquanto o sistema autoloot simplifica suas conquistas. Desenvolva seu personagem através de um sistema de upgrade único, aprimorando habilidades e atributos para enfrentar desafios cada vez mais formidáveis.
       
      Explore um mundo imersivo onde o som desempenha um papel crucial, criando uma atmosfera envolvente e realista. Vasculhe cada canto em busca de recursos vitais, desvendando segredos e tesouros ocultos. Siga uma cativante história através de missões que expandem o enredo, revelando os mistérios por trás do apocalipse e oferecendo recompensas valiosas.
       
      Em Genesis Online Tibia, a jornada pela sobrevivência é repleta de ação, estratégia e emoção, convidando você a se aventurar em um mundo onde cada decisão molda seu destino e determina sua capacidade de enfrentar os desafios que aguardam.

      Em breve imagens do servidor!
       
       
    • Por Imperius
      O propósito é criar uma nova função em creaturescripts que será acionada toda vez que um novo report (CTRL + R) for aberto.
       
      Eu implementei para enviar uma notificação no grupo do Telegram, contendo os dados do report.
       
      Isso garantirá que os GMs tenham acesso aos reports dos jogadores mesmo quando não estiverem logados, e também evitará que algum report seja perdido caso o jogador saia do servidor.
      A parte do Telegram é apenas um exemplo. Você pode ajustar o script para executar outras ações desejadas.
       
      creatureevent.cpp:
      Dentro deste arquivo, localize a função:
       
      uint32_t CreatureEvent::executeChannelLeave(Player* player, uint16_t channelId, UsersMap usersMap)  
      abaixo dela, adicione:
       
      uint32_t CreatureEvent::executeOpenRuleViolation(Player* player, std::string message) { if (!m_interface->reserveEnv()) { std::clog << "[Error - CreatureEvent::executeOpenRuleViolation] Call stack overflow." << std::endl; return 0; } ScriptEnviroment* env = m_interface->getEnv(); env->setScriptId(m_scriptId, m_interface); lua_State* L = m_interface->getState(); m_interface->pushFunction(m_scriptId); lua_pushnumber(L, env->addThing(player)); lua_pushstring(L, message.c_str()); bool result = m_interface->callFunction(2); m_interface->releaseEnv(); return result; }  
      Após, procure por:
       
      std::string CreatureEvent::getScriptEventName() const  
      abaixo de:
       
      case CREATURE_EVENT_CHANNEL_LEAVE: return "onLeaveChannel";  
      adicione:
       
      case CREATURE_EVENT_OPEN_RULE_VIOLATION: return "onOpenRuleViolation";  
      Agora, procure por:
       
      std::string CreatureEvent::getScriptEventParams() const  
      abaixo de:
       
      case CREATURE_EVENT_CHANNEL_LEAVE: return "cid, channel, users";  
      adicione:
       
      case CREATURE_EVENT_OPEN_RULE_VIOLATION: return "cid, message";  
      Procure por:
       
      bool CreatureEvent::configureEvent(xmlNodePtr p)  
      abaixo de:
       
      else if(tmpStr == "leavechannel") m_type = CREATURE_EVENT_CHANNEL_LEAVE;  
      adicione:
       
      else if(tmpStr == "openruleviolation") m_type = CREATURE_EVENT_OPEN_RULE_VIOLATION;  
       
      creatureevent.h:
      Dentro deste arquivo, localize:
       
      enum CreatureEventType_t  
      adicione "CREATURE_EVENT_OPEN_RULE_VIOLATION" como o último item de enum CreatureEventType_t
       
      Exemplo:
       
      enum CreatureEventType_t { // ... CREATURE_EVENT_OPEN_RULE_VIOLATION };  
      Agora, procure por:
       
      uint32_t executeChannelLeave(Player* player, uint16_t channelId, UsersMap usersMap);  
      abaixo dela, adicione:
       
      uint32_t executeOpenRuleViolation(Player* player, std::string message);  
      game.cpp:
      Dentro deste arquivo, localize:
       
      bool Game::playerReportRuleViolation(Player* player, const std::string& text)  
      e substitua por:
       
      bool Game::playerReportRuleViolation(Player* player, const std::string& text) { //Do not allow reports on multiclones worlds since reports are name-based if(g_config.getNumber(ConfigManager::ALLOW_CLONES)) { player->sendTextMessage(MSG_INFO_DESCR, "Rule violation reports are disabled."); return false; } cancelRuleViolation(player); boost::shared_ptr<RuleViolation> rvr(new RuleViolation(player, text, time(NULL))); ruleViolations[player->getID()] = rvr; ChatChannel* channel = g_chat.getChannelById(CHANNEL_RVR); if(!channel) return false; for(UsersMap::const_iterator it = channel->getUsers().begin(); it != channel->getUsers().end(); ++it) it->second->sendToChannel(player, SPEAK_RVR_CHANNEL, text, CHANNEL_RVR, rvr->time); CreatureEventList joinEvents = player->getCreatureEvents(CREATURE_EVENT_OPEN_RULE_VIOLATION); for(CreatureEventList::iterator it = joinEvents.begin(); it != joinEvents.end(); ++it) (*it)->executeOpenRuleViolation(player, text); return true; }  
      Agora é só compilar a source.
       
      depois em "data > creaturescripts > creaturescripts.xml", adicione:
       
      <event type="login" name="loginNotifyRuleViolation" script="notifyRuleViolation.lua"/> <event type="openruleviolation" name="openNotifyRuleViolation" script="notifyRuleViolation.lua"/>  
      em "data > creaturescripts > scripts", crie um arquivo notifyRuleViolation.lua e adicione:
       
      function onOpenRuleViolation(cid, message) local config = { token = "", -- Token do seu BOT no Telegram chatId = "" -- ID do chat do Telegram que será enviado a notificação. } local message = "Player: "..getCreatureName(cid).."\n\nReport:\n"..message.."" message = string.gsub(message, "\n", "%%0A") local url = "https://api.telegram.org/bot"..config.token.."/sendMessage" local data = "chat_id="..config.chatId.."&text="..message.."" local curl = io.popen('curl -d "'..data..'" "'..url..'"'):read("*a") return true end function onLogin(cid) registerCreatureEvent(cid, "openNotifyRuleViolation") return true end  
       
      Demonstração:
      1. Jogador abre um novo report (CTRL + R)

      2. notifyRuleViolation.lua, definido em creaturescripts.xml, é acionado para enviar uma notificação ao grupo do Telegram.
       

       
    • Por sirmagna
      Procuro equipe interessada em desenvolver um projeto de "Tibia HunterxHunter"
      Tenho um projeto pré-montado que estou criando sozinho
      estarei disponibilizando uma previa 
      das minhas sprites 
      preciso de uma equipe com boas ideias e criativa
      para concluir o ot e deixar online para todos desfrutarem dessa obra prima
       
      *******ate o momento o projeto contem sprites do Killua Zoldyck/Hisoka Morow/Gon Freecss/Chrollo Lucilfer/Kurapika
      >>>Previa:



      OTClient_2024-02-09_19-29-45.mp4
×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo