
Tudo que WooX postou
- Classic-Yurots [8.60] - Push Cruzado + Cast com Setas
-
Zombie Event [DIFERENCIADO]
@LeandroRissa Eita, não precisa se estressar não, pronto coloquei seus créditos.
-
Yutae - Cidade + Hunts
Impecável como sempre.
-
Informações e Seleção de Conteúdos
- Algumas funções Lua
Os créditos não são meus, infelizmente eu já nem lembro mais onde encontrei essa função, realmente está bem feita.- Hati New AAC
Ta ficando muito top, tu é brabo Chuck.- Trade Offline V2.0
Realmente há esse problema, devo ter ignorado a page e tomado como verdade somente a mensagem de erro enquanto fazia os testes, script atualizado. Os items são entregues no depot da cidade em que o jogador é morador, se ele for morador da cidade de town id 1, então os items serão entregues no depot dela.- Trade Offline V2.0
O valor é inserido no do banco do vendedor. Altera a função getItemDefaultDuration por essa: function getItemDefaultDuration(itemID) if getItemInfo(itemID).decayTime <= 0 then if getItemInfo(itemID).transformUseTo then if getItemInfo(itemID).transformUseTo.male > 0 then return getItemInfo(getItemInfo(itemID).transformUseTo.male).decayTime elseif getItemInfo(itemID).transformUseTo.female > 0 then return getItemInfo(getItemInfo(itemID).transformUseTo.female).decayTime end elseif getItemInfo(itemID).transformEquipTo > 0 then return getItemInfo(getItemInfo(itemID).transformEquipTo).decayTime end else return getItemInfo(itemID).decayTime end return 0 end- Zombie Event [DIFERENCIADO]
Zombie Event Zombie Event é um evento já muito conhecido em que os participantes são jogados em uma arena e zombies são invocados até que reste apenas um jogador, quando um jogador é tocado por um zombie ele é teleportado para o templo, o ultimo jogador a ficar na arena é definido como vencedor e o evento é finalizado ai. Já faz um bom tempo que tive a ideia de mudar o funcionamento deste tradicional evento e finalmente decidi por a mão na massa, irei explicar melhor o que foi alterado abaixo. Sobre o sistema O sistema foi testado apenas em OTX2, mas provavelmente também funcione em TFS 0.4 Pra quem quiser esse evento funcional para TFS 1.x, o @Movie se comprometeu a fazer a adaptação, então podem mandar mensagem privada pra ele cobrando que ele gosta. Quem é familiar com filmes e séries de zombies sabe que quando um zombie morde alguém a pessoa que foi mordida não simplesmente morre, mas ela se torna um zombie, é isso que torna a ideia de um apocalipse zombie tão aterrorizante. Pensando nisso eu tive a ideia de alterar o sistema pra que quando algum player fosse pego por um zombie ele também se transformasse em um e não fosse simplesmente teleportado para o templo. Essa alteração deixa a interação entre os jogadores no evento mais dinâmica pois eventualmente se torna um jogo de Player vs Player ao invés de Player vs Maquina, embora no fim continue sendo uma batalha entre vivos e mortos. Irei listar abaixo mais algumas características do evento. É possivel configurar para que seja permitido ou não o uso de MCs. Todos os jogadores ao entrar na arena ficam com a mesma velocidade. Para tornar mais competitivo e divertido, não é permitido utilizar a função Follow dentro do evento. O jogador que foi transformado em zombie que mais contaminar outros jogadores também recebe uma recompensa. Os jogadores que forem transformados em zombies podem subir de rank conforme forem contaminando outros jogadores, alterando assim sua aparência e velocidade na arena. Vídeozinho Instalação Este sistema utiliza de funções contidas na lib do link abaixo, então antes de mais nada é necessário adicionar esta lib no servidor. Todos os arquivos necessários para instalação do evento estão anexados no tópico, irei apenas mostrar como deve ser configurado. Toda configuração do sistema se encontra na lib do mesmo, segue abaixo explicação de como configurar. startTime: configuração de horários para inicio do evento a depender do dia da semana (para cada horário diferente definido aqui um registro extra é necessário no globalevents.xml) announcement: mensagem a ser exibida quando o teleporte para o evento for aberto. startEvent: mensagem a ser exibida quando o teleporte para o evento for fechado e o evento iniciado. playerBitten: mensagem a ser exibida quando um jogador for mordido por um zombie. endEvent: mensagem a ser exibida quando o evento for finalizado. notEnoughPlayers: mensagem a ser exibida quando não houver players suficiente para o evento. zombiesRant: falas que serão randomicamente selecionadas para um jogador que foi transformado em zombie falar. minOnlinePlayers: define a quantidade minima de jogadores online para o teleporte do evento ser aberto. minPlayers: define a quantidade minima de jogadores na arena para o evento ser iniciado. closeTeleportTime: tempo para fechar o teleporte após o anuncio (o valor deve ser definido em minutos). countDownTime: tempo para iniciar o evento após o fechamento do teleporte (o valor deve ser definido em segundos). zombieRatio: define a quantidade inicial de zombies baseado na quantidade de jogadores participando do evento. playerSpeed: define a velocidade que o jogador terá durante o evento (valido apenas para jogadores que não foram transformados em zombies). delayToTransform: define o intervalo para um jogador que foi mordido se transformar em um zombie (o valor deve ser definido em segundos). allowMultiClient: pode ser definido como true ou false, se definido como falso não irá permitir a entrada de jogadores com o mesmo IP no evento. rewards: define as recompensas a serem entregues tanto para o ultimo sobrevivente na arena como para o zombie que mais contaminar outros jogadores. zombiesRank: define os ranks dos zombies, a quantidade de pontos necessária para avançar de rank, aparência e velocidade (valido apenas para jogadores que foram transformados em zombies). area: define a área onde ocorrerá o evento, deve ser preenchido as coordenadas do ponto superior-esquerdo, ponto inferior-direito e o andar do local. teleportAid: define a actionID a ser adicionado no teleporte de entrada do evento (este valor deve ser o mesmo a ser registrado na tag XML do script de movements). teleportPos: define as coordenadas onde deve ser criado o teleporte de entrada para o evento. Créditos @LeandroRissa por testar todo o sistema. event zombie.xml lib_zombie.lua zombieEvent.lua zombieEvent_creature.lua zombieEvent_movement.lua- Trade Offline V2.0
- Trade Offline V2.0
- Trade Offline V2.0
- Trade Offline V2.0
- Trade Offline V2.0
- Tradeoff Novo
@Lurk @DiigooMix- Trade Offline V2.0
Trade Offline V2.0 Esse sistema me foi pedido a alguns meses atrás e hoje tirei um tempinho pra trazer aqui. O sistema consiste em permitir que jogadores negociem sem contato direto entre comprador e vendedor. Mas como assim? O vendedor pode criar um anuncio de venda informando item, valores ou até mesmo items que ele queira em troca, após feito o anuncio todas essas informações ficam armazenadas no banco de dados do servidor, permitindo assim serem exibidas em uma página no site para interessados, junto de todas informações fornecidas pelo vendedor é exibido um comando para que os interessados possam adquirir a oferta exibida na página. Sobre o sistema O sistema foi testado apenas em OTX2, mas provavelmente também funcione em TFS 0.4 Versão para TFS 1.x adaptada pelo @luanluciano93 Como mencionado acima, o sistema funciona de forma semelhante ao Market System das versões atuais porem sem exibição gráfica das ofertas in-game, para isso o sistema vai acompanhado de uma página para o Gesior AAC. Este sistema existe no fórum há um bom tempo e já é familiar pra muitos jogadores, essa versão trás consigo algumas melhorias e diferenças que irei listar abaixo. Sistema Agora é possivel vender um item exigindo outro item em troca ao invés de dinheiro. Containers com um conjunto de items dentro agora podem ser anunciados. Agora o sistema verifica as cargas e durações dos items antes de criar uma oferta. Novo parâmetro adicionado para verificar informações de ofertas in-game. Agora todo valor recebido vai diretamente para o banco do vendedor. Página A depender da quantidade de ofertas existentes no servidor, a página agora irá separa-las por páginas. Agora além do valor é exibido também imagem da moeda a depender do valor da oferta. Agora é possivel ver as características tanto dos items ofertados como dos items exigidos pelo vendedor. Adicionado filtros para exibir somente ofertas de items vip, containers ou trocas. Adicionado barras de pesquisas para filtrar as ofertas por items ou nome do jogador. Algumas imagens Instalação Antes de mais nada é necessário citar os requisitos necessários para o funcionamento correto do sistema, ele utiliza de algumas funções que não estão no script principal e portanto é necessário a instalação de uma lib extra, também é necessário instalar as funções doItemSetDuration e getItemDurationTime na source do servidor, ambos os links se encontram abaixo. Todos os arquivos necessários para a instalação estão anexados no tópico, irei apenas dizer onde instalar e como deve ser configurado. Primeiramente importe o arquivo schema.sql no banco de dados, ou se preferir pode executar as queries a seguir. CREATE TABLE IF NOT EXISTS `trade_off_offers` ( `id` int(11) NOT NULL auto_increment, `player_id` int(11) NOT NULL, `type` int(1) NOT NULL DEFAULT '0', `item_id` int(11), `item_count` int(11) NOT NULL DEFAULT '1', `item_charges` int(11) NULL, `item_duration` int(11) NULL, `item_name` varchar(255), `item_trade` tinyint(1) NOT NULL DEFAULT '0', `cost` bigint(20) UNSIGNED NOT NULL, `cost_count` int(11) NOT NULL DEFAULT '1', `date` bigint(20), PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1; CREATE TABLE IF NOT EXISTS `trade_off_container_items` ( `offer_id` int(11) NOT NULL, `item_id` int(11), `item_charges` int(11) NULL, `item_duration` int(11) NULL, `count` int(11) DEFAULT '1' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1; ALTER TABLE `trade_off_container_items` ADD KEY `offer_id` (`offer_id`); ALTER TABLE `trade_off_container_items` ADD CONSTRAINT `offer_id_fk` FOREIGN KEY (`offer_id`) REFERENCES `trade_off_offers`(`id`) ON DELETE CASCADE; Configuração no arquivo tradeoff.lua: -- Trade Offline 2.0 by WooX -- local config = { priceLimit = 2000000000, -- 2kkk offerLimit = 3, offerLimitStor = 86420, infoOnPopUp = true, infoMsgType = MESSAGE_STATUS_CONSOLE_BLUE, errorMsgType = MESSAGE_STATUS_CONSOLE_RED, successMsgType = MESSAGE_INFO_DESCR, helpMsg = "Enter the parameters (add, remove, active, buy, info).", goldItems = {2148, 2152, 2160}, itemsVIP = {4540, 4545, 4560}, } priceLimit: define o valor máximo de uma oferta. offerLimit: define o valor máximo de ofertas que um jogador pode adicionar. offerLimitStor: storage que irá armazenar quantas ofertas ativas o jogador possui. infoOnPopUp: pode ser definido como true ou false, se definido como falso irá enviar os detalhes da oferta no default ao invés de como é mostrado nas imagens acima. infoMsgType: define como será exibido uma mensagem de informação ao jogador (não recomendo mexer a menos que saiba o que está fazendo). errorMsgType: define como será exibido uma mensagem de erro ao jogador (não recomendo mexer a menos que saiba o que está fazendo). successMsgType: define como será exibido uma mensagem de ação sucedida ao jogador (não recomendo mexer a menos que saiba o que está fazendo). helpMsg: mensagem que será enviada para o jogador caso ele erre os parâmetros do comando. goldItems: nesta tabela deve ser preenchido todos os IDs de moedas no servidor como gold coins, platinum coins, etc. itemsVIP: nesta tabela deve ser preenchido os IDs dos items vips existentes no servidor. Agora para a instalação da página, no arquivo mysql_db.php deve ser preenchido os dados para conexão no banco de dados do servidor. /** * Host do banco de dados * @var string */ private static $DB_HOST = 'localhost'; /** * Usuario de conexao ao banco de dados * @var string */ private static $DB_USER = 'root'; /** * Senha de conexao ao banco de dados * @var string */ private static $DB_PASS = 'SUA_SENHA'; /** * Nome do banco de dados * @var string */ private static $DB_NAME = 'NOME_BANCO'; Após feito isso, o arquivo paginationClass.php em conjunto do arquivo mysql_db.php devem ser adicionados no seguinte diretório do Gesior AAC. classes/ Finalizado isto, basta jogar o arquivo tradeoff.php dentro do diretório informado abaixo e o sistema estará pronto para uso. pages/ Avisos Eu escrevi somente o sistema, não sou o autor da página para o Gesior AAC portanto não estarei dando suporte em relação a página que não seja sobre a instalação da mesma no Gesior AAC 2012, e embora esteja funcional, eu não recomendo o uso da página devido a falta do uso de cache para leitura do items.xml. Foram mais de 600 linhas de código sem contar funções extras e alterações na source, além de muitas horas de testes para garantir que tudo estava funcionando corretamente, tudo que peço em troca é que não removam os créditos no arquivo quando forem usar. Créditos @MatheusDuarte pela página do Gesior AAC. schema.sql tradeoff.lua tradeoff.php mysql_db.php paginationClass.php- Baiak-PvP [8.60] - Watch System + Cast Look
- Storage Atualizando Só Quando Desloga
Isso é normal, essas informações só vão pro banco de dados quando o jogador é salvo, até então elas ficam armazenadas na memória. O que você pode fazer é salvar o jogador sempre que ele avançar ou regredir no rank.- [TFS 0.x] Funções doItemSetDuration(uid, duration) & getItemDurationTime(uid)
doItemSetDuration(uid, duration) getItemDurationTime(uid) A primeira função adiciona ou altera a duração de um item, a segunda retorna o valor em segundos da duração de um item. Instalação No arquivo luascript.cpp da source procure por: //getItemWeight(uid[, precise = true]) lua_register(m_luaState, "getItemWeight", LuaInterface::luaGetItemWeight); Acima adicione: //doItemSetDuration(uid, duration) lua_register(m_luaState, "doItemSetDuration", LuaInterface::luaDoItemSetDuration); //getItemDurationTime(uid) lua_register(m_luaState, "getItemDurationTime", LuaInterface::luaGetItemDurationTime); Depois procure por: int32_t LuaInterface::luaGetItemWeight(lua_State* L) E adicione acima: int32_t LuaInterface::luaDoItemSetDuration(lua_State* L) { //doItemSetDuration(uid, duration) uint32_t duration = (popNumber(L) * 1000); ScriptEnviroment* env = getEnv(); Item* item = env->getItemByUID(popNumber(L)); if(!item) { errorEx(getError(LUA_ERROR_ITEM_NOT_FOUND)); lua_pushboolean(L, false); return 1; } item->setDuration(duration); return 1; } int32_t LuaInterface::luaGetItemDurationTime(lua_State* L) { //getItemDurationTime(uid) ScriptEnviroment* env = getEnv(); Item* item = env->getItemByUID(popNumber(L)); if(!item) { errorEx(getError(LUA_ERROR_ITEM_NOT_FOUND)); lua_pushboolean(L, false); return 1; } uint32_t duration = (item->getDuration() / 1000); lua_pushnumber(L, duration); return 1; } Agora no arquivo luascript.h da source procure por: static int32_t luaGetItemWeight(lua_State* L); E adicione acima: static int32_t luaDoItemSetDuration(lua_State* L); static int32_t luaGetItemDurationTime(lua_State* L); Pronto, agora basta compilar e ambas as funções irão estar prontas para serem usadas.- SPELL QUE BLOQUEIA MAGIAS DO TARGET
https://github.com/mattyx14/otxserver/commit/3b10aedeac0a49e5538a3343873d52967b97835a- SPELL QUE BLOQUEIA MAGIAS DO TARGET
Não testado. --<event type="cast" name="blockSpell" event="script" value="block_spell.lua"/> function onCast(cid) if isPlayer(cid) and getPlayerStorageValue(cid, 4570) > os.time() then return false end return true end --[[ <instant name="Block Spell" words="petrificus totalus" lvl="50" mana="200" range="3" blockwalls="1" needtarget="1" exhaustion="2000" needlearn="0" event="script" value="block_spell.lua"> <vocation id="1"/> <vocation id="2"/> </instant> ]] local blockTime = 5 -- Segundos local function unregisterEvent(target) if isPlayer(target) then if getPlayerStorageValue(target, 4570) < os.time() then unregisterCreatureEvent(target, "blockSpell") else addEvent(unregisterEvent, (getPlayerStorageValue(cid, 4570) - os.time()) * 1000, target) end end end local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_FIREATTACK) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE) function onCastSpell(cid, var) local target = isPlayer(var.number) and var.number or getCreatureTarget(cid) if not isPlayer(target) then doPlayerSendCancel(cid, "Somente jogadores sao afetados por essa spell.") return true end setPlayerStorageValue(target, 4570, os.time() + blockTime) registerCreatureEvent(target, "blockSpell") addEvent(unregisterEvent, blockTime * 1000, target) return doCombat(cid, combat, var) end- Spell que bloqueia o target do player
- Spell que bloqueia o target do player
A spell está configurada pra não afetar aliados (jogadores na mesma party ou da mesma guild), e também ira apenas remover o target, para realizar o bloqueio do target ainda é necessário utilizar em conjunto a spell o creaturescript postado pelo @Lurk, eu testei a spell novamente e está funcional.- Spell que bloqueia o target do player
Certifique-se de que possui a função instalada na source. Ao realizar o teste, deixe uma arma no char que deve perder o target para ter certeza de que o ataque foi interrompido. Dependendo do client que estiver utilizando a marca do target não vai ser removida, essa parte é client-side.- Spell que bloqueia o target do player
- Algumas funções Lua
Informação Importante
Confirmação de Termo