Ir para conteúdo

Inari

Campones
  • Total de itens

    4
  • Registro em

  • Última visita

Sobre Inari

Informações

  • Forma que conheci o xTibia
    Sites de Busca
  • Sou
    OT-Admin

Últimos Visitantes

416 visualizações

Inari's Achievements

  1. @Yan Liima Acabei de testar e funciona perfeitamente, MUITO OBRIGADO! só tive que modificar as funções leftProntera e leftAlberta de acordo também. function leftProntera() for _, cid in pairs(getPlayersOnline()) do if isInRange(getPlayerPosition(cid), config.area[1], config.area[2]) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "O aeroplano partiu. Proximo destino: Alberta.") end end end function leftAlberta() for _, cid in pairs(getPlayersOnline()) do if isInRange(getPlayerPosition(cid), config.area[1], config.area[2]) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "O aeroplano partiu. Proximo destino: Prontera.") end end end Reputado, podem fechar o tópico
  2. e como eu determino essa área? é oq eu precisava saber tbm
  3. Oi, tudo bom pessoal? Bom, estou desenvolvendo um event, mas falta nele algo essencial que não sei como fazer ainda... Queria poder usar o doBroadcastMessage(message, type), mas que não fosse pro servidor inteiro, já q o intervalo seria de 2 em 2 minutos, e ia encher o saco de muita gente. Tem que ser apenas para os players que estiverem em uma determinada área, parecido com a função getSpectators(centerPos, rangex, rangey[, multifloor = false]) que eu encontrei, mas não precisa ser essa. Vou deixar meu código aqui pra terem uma ideia melhor. (obs: não manjo mt de c++, então se tiver algo errado e quiser corrigir, agradeço se o fizer e tbm explicar porque ta errado) globalevents.xml <!-- Airplane Schedule --> <globalevent name="airplane" interval="120000" event="script" value="schedule.lua"/> schedule.lua local config = { city = 1, -- Agenda: [1] Prontera, [2] Alberta landing1 = {x=1644,y=1570,z=0}, -- Local de desembarque do aeroplano landing2 = {x=1645,y=1570,z=0}, -- Local de desembarque do aeroplano toProntera1 = {x=1486,y=1525,z=7}, -- Coordenadas de Prontera toProntera2 = {x=1486,y=1526,z=7}, -- Coordenadas de Prontera toAlberta1 = {x=1492,y=1522,z=7}, -- Coordenadas de Alberta toAlberta2 = {x=1492,y=1523,z=7}, -- Coordenadas de Alberta } function onThink(cid, interval, lastExecution) -- Talvez não seja a função correta (?) if (config.city == 1) then -- Cria o portal para Prontera doCreateTeleport(1387, config.toProntera1, config.landing1) doCreateTeleport(1387, config.toProntera2, config.landing2) doBroadcastMessage("O aeroplano pousou na cidade de Prontera, mas partira novamente em 20 segundos.") addEvent(deleteTp, 20000) -- Remove o portal em 20 segundos addEvent(leftProntera, 20000) config.city = config.city + 1 -- Avança a agenda elseif (config.city == 2) then -- Cria o portal para Alberta doCreateTeleport(1387, config.toAlberta1, config.landing1) doCreateTeleport(1387, config.toAlberta2, config.landing2) doBroadcastMessage("O aeroplano pousou na cidade de Alberta, mas partira novamente em 20 segundos.") addEvent(deleteTp, 20000) -- Remove o portal em 20 segundos addEvent(leftAlberta, 20000) config.city = 1 -- Retorna a agenda para o início end return true end function deleteTp() local delete1 = getTileItemById(config.landing1, 1387) local delete2 = getTileItemById(config.landing2, 1387) doRemoveItem(delete1.uid, 1) doRemoveItem(delete2.uid, 1) doSendMagicEffect(config.landing1, CONST_ME_TELEPORT) doSendMagicEffect(config.landing2, CONST_ME_TELEPORT) end function leftProntera() doBroadcastMessage("O aeroplano partiu. Proximo destino: Alberta") end function leftAlberta() doBroadcastMessage("O aeroplano partiu. Proximo destino: Prontera") end
  4. Primeiramente, desculpe se essa for a área errada. Agora o problema: Ao dividir a experiência em grupo, a quantidade está correta caso 1 jogador dê conta de causar 100% do dano no monstro, mas caso outro membro do grupo ataque o mesmo monstro a experiência se divide de forma esquisita, como se levasse KS do próprio grupo, a experiência total é reduzida para todos. (Checar as Screenshots) Para ficar mais fácil de visualizar o problema, vou identificar algumas coisas: A Experiência do Troll no servidor é 360 (Total sem modificador [RateStage: 13x]). O Troll tem 50 Hp (como todos devem saber), logo, ele da 7.2 Exp por 1 Hp (referente a Exp acima). A personagem Flandre já está em outro Stage de Exp, então para facilitar, pense que ela recebe a mesma quantidade de exp dos outros 2 personagens mais fracos. O grupo receberá um bônus de experiência conforme a quantidade de jogadores no grupo, fazendo com que a experiência seja maior do que a base(360 no caso do Troll), compensando sempre caçar em grupos para aumentar a Rate imposta pelo servidor (13x), além de ser favorável também àqueles que têm de dividir o mesmo respawn. Vale notar também que a quantidade de Experiência dividida varia conforme o dano causado de cada jogador, mas ele é sempre dividido em números iguais para todos. Quanto mais igualado for a quantidade de dano causado por todos os membros, menor será a experiência recebida, é como receber KS da própria party. -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Agora que o problema foi explicado, vamos a parte dos códigos: * Lembrete: Tenho noção de programação, mas tenho pouca experiência com os códigos do Tibia, provavelmente meu método possa ser mais efetivo de outra forma, mas ainda estou aprendendo. * A seguir o código em sources/party.cpp: void Party::shareExperience(double experience, bool fromMonster, bool multiplied) { double shareExperience = experience; if(experience >= (double)g_config.getNumber(ConfigManager::EXTRA_PARTY_LIMIT)) shareExperience = experience * ((memberList.size() + 1) * (0.8 + 0.2 * (memberList.size() + 1))); // shareExperience += (experience * ((double)g_config.getNumber(ConfigManager::EXTRA_PARTY_PERCENT) / 100)); shareExperience /= memberList.size() + 1; double tmpExperience = shareExperience; //we need this, as onGainSharedExperience increases the value leader->onGainSharedExperience(tmpExperience, fromMonster, multiplied); for(PlayerVector::iterator it = memberList.begin(); it != memberList.end(); ++it) { tmpExperience = shareExperience; (*it)->onGainSharedExperience(tmpExperience, fromMonster, multiplied); } } A modificação está na linha 5, a versão original está como comentário em caso de backup. O que ela faz: Para cada jogador na party, é adicionado um bônus de 20% na experiência total recebida. Ex.: Monstro A da 1000 pontos de experiência. Caso a party possua 2 jogadores, cada um receberá 1200 de Exp. Caso a party possua 5 jogadores, cada um receberá 1800 de Exp. Etc... Na fórmula: shareExperience = experience * ((memberList.size() + 1) * (0.8 + 0.2 * (memberList.size() + 1))) Ex.: Troll = 360 Exp, 3 membros na party. (Assim como nas Screenshots) shareExperience = 360 * ( 3 * ( 0.8 + 0.2 * 3 ) ) shareExperience = 360 * ( 3 * 1.4 ) shareExperience = 360 * 4.2 shareExperience = 1512 A seguir ocorre a fórmula: shareExperience /= memberList.size() + 1; shareExperience = 1512 / 3 shareExperience = 504 (Assim como na primeira Screenshot) Logo depois vem: double tmpExperience = shareExperience; e os seguintes códigos que acredito eu, sejam para adicionar de fato a experiência aos personagens (me corrija se tiver errado). ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Conclusão: Não sei o motivo realmente, fiquei quase 7 horas procurando em diversos arquivos a solução (google also) e ainda não sei porque a experiência recebida muda caso outro player do grupo ataque o mesmo monstro. Por favor, se alguém puder me dizer onde eu posso ter errado ou que função poderia ter adicionado para essa funcionalidade, ou ainda se teria uma forma mais simples de ter feito o que eu fiz, ficaria muito agradecido, já que esse é um servidor No-Pvp, é realmente importante que a divisão de experiência funcione corretamente. TL;DR: Preciso de um Script que faça com que os personagens dentro de uma party recebam a quantidade correta de experiência mesmo atacando o mesmo monstro, assim como no Tibia Global.
  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...