Histórico de Curtidas
-
RigBy deu reputação a Toruk em Registra weapon tfs 1.3Você verificou se não há 2 revscripts rodando? Pq senão será carregado apenas o ultimo q a distro ler.
Acredito que esse sv é customizado pra ter uma “fire magiclong sword”, então é bom ver isso.
-
RigBy deu reputação a Toruk em Como adicionar libPrecisa registrar o arquivo adicionado no arquivo lib.lua (SERVER/data/lib/lib.lua).
-
RigBy recebeu reputação de Lodus em Realistic Eternal Mangekyou Sharingan (Madara)Gostei mano, fiz um remake, saio meio paia mas ta ai
-
RigBy deu reputação a Artt em Realistic Eternal Mangekyou Sharingan (Madara)Ficou foda pra caramba
-
RigBy deu reputação a Lodus em Realistic Eternal Mangekyou Sharingan (Madara)ola, trago uma sprite (64x64)
feita por mim.
OBS: preste atenção nos olhos não na "pele".
Deixe Seu Gostei !!!
-
RigBy deu reputação a MarceLoko em Monstros PassivosBoa noite!
Requerido
TFS 1.x
http://www.tibiaking.com/forum/topic/60768-monster-onselecttargetself-target/
Segue dois códigos de monstro passivo:
Monstro que ataca ao ser atacado:
function onSelectTarget(self, target) if target:getTarget() == self then return true end return false end
Monstro que só atacam jogadores fortes:
function onSelectTarget(self, target) if target:getLevel() >= 100 then return true end return false end Coloque um desses códigos em um arquivo lua em data/monster/scripts
Abra o xml do monstro e insira após manacost:
script="arquivo.lua"
Abraço!
-
RigBy deu reputação a MarceLoko em [TFS 1.2] Monster onSelectTarget(self, target)Boa noite!
Este código torna possível incluir algum script quando o monstro escolhe um alvo.
Testado em TFS 1.2
monster.cpp
ache:
bool Monster::selectTarget(Creature* creature)
substitua:
bool Monster::selectTarget(Creature* creature) { if (!isTarget(creature)) { return false; } auto it = std::find(targetList.begin(), targetList.end(), creature); if (it == targetList.end()) { //Target not found in our target list. return false; } if (isHostile() || isSummon()) { if (executeOnSelectTarget(creature) == 1){ if (setAttackedCreature(creature) && !isSummon()) { g_dispatcher.addTask(createTask(std::bind(&Game::checkCreatureAttack, &g_game, getID()))); } } else return false; } return setFollowCreature(creature); } bool Monster::executeOnSelectTarget(Creature* creature){ // onSelectTarget(self, target) if (mType->targetEvent != -1) { LuaScriptInterface* scriptInterface = mType->scriptInterface; if (!scriptInterface->reserveScriptEnv()) { std::cout << "[Error - Monster::onSelectTarget] Call stack overflow" << std::endl; return true; } ScriptEnvironment* env = scriptInterface->getScriptEnv(); env->setScriptId(mType->targetEvent, scriptInterface); lua_State* L = scriptInterface->getLuaState(); scriptInterface->pushFunction(mType->targetEvent); LuaScriptInterface::pushUserdata<Monster>(L, this); LuaScriptInterface::setMetatable(L, -1, "Monster"); LuaScriptInterface::pushUserdata(L, creature); LuaScriptInterface::setCreatureMetatable(L, -1, creature); return (scriptInterface->callFunction(2)); } return true; } monster.hache:
bool selectTarget(Creature* creature);
inclua:
bool executeOnSelectTarget(Creature* creature);
monsters.cpp:
ache:
scriptInterface = nullptr; creatureAppearEvent = -1; creatureDisappearEvent = -1; creatureMoveEvent = -1; creatureSayEvent = -1; thinkEvent = -1; inclua:targetEvent = -1;
ache:
mType->thinkEvent = scriptInterface->getEvent("onThink");
inclua:
mType->targetEvent = scriptInterface->getEvent("onSelectTarget");
Em breve:
Player onSelectTarget
-
RigBy deu reputação a Vodkart em [Função] getPlayersInAreafunction getPlayersInArea(fromPos, toPos) local players = {} for _, pid in ipairs(getPlayersOnline()) do if isInRange(getPlayerPosition(pid), fromPos, toPos) then table.insert(players, pid) end end return players end
-
RigBy deu reputação a Orochi Elf em [OTC] Launcher Creator v0.3[OTCodes] Launcher Creator v0.3
Olá pessoal, o Launcher Creator passou por mais um update!
Vou trazendo pra vocês o que foi feito na versão 0.3
LOG
-Adicionado as propriedades de (Icone e Background) no Screen.
-Adicionado mais dois componentes (ProgressBar e Play Button)
-Mais propriedades adicionadas no componente (News)
-Todas as propriedades dos componentes, organizadas.
-Alterado a função de "Debugger" para "Preview", assim visualizando no mesmo tempo de atualização.
Fiz um vídeo demonstrativo da versão 0.3
https://www.youtube.com/watch?v=epOK4SUbjzQ&feature=youtu.be
Bom.. ainda falta bastante coisa galera, porém estamos caminhando.. que no meu ver, é o importante.
Próximas edições para nova atualização. 0.4
- Adicionar os demais componentes (Site Button e Close Button)
- Criar as funções (Open, Save e Compile)
Créditos:
Tony Araújo (OrochiElf)
-
RigBy deu reputação a xWhiteWolf em Dodge System (Por Item)Fala galera do TK, hoje vim trazer pra vocês à pedidos do grande @azzouks uma versão do meu Dodge System por equips.
Explicação: É um sistema onde vc pode colocar uma % de esquiva nos itens e ao usá-los você ganha a chance de desviar dos ataques e levar somente metade do dano.
Qualquer semelhança com esse > http://www.tibiaking.com/forum/topic/8223-mod-reflect-system-01/ < mod do @Aluccard não é mera coincidência, eu usei o mod dele como base pra fazer o meu *-*
Sem mais delongas vamos ao script:
Vá na pasta do seu server e abra uma pasta chamada "mods".. lá dentro crie um arquivo com o nome que vc quiser (sério) de extensão.xml e adicione o seguinte nele:
Configurando:
Se você não manja de script então eu sugiro que vcs só alterem essa parte aqui:
em vermelho é o máximo que uma pessoa pode ter de dodge: se ela tiver usando um full set que deixe ela com um total de 99% de dodge ela só vai poder aproveitar 50%. Isso foi feito pra evitar um bug.. vocês podem se sentir livres pra alterar esse numero mas não coloquem nada muito grande pra evitar que seus servers explodam.
em verde é a porcentagem do dano que vocês vao tomar ao desviar.. nesse caso os ataques que eu der dodge darão 50% do dano (0.5)
em azul é a porcentagem inicial que todos os players vão ter. Por padrão está 0 mas se vc quiser que todos os players do seu server tenham 20% e que cada item dê 5% também é possível editando esse 0 pra 20.
Feito isso vá em data\lib\function.lua e adicione essas linhas
function getItemDodgePercent(itemuid) return getItemAttribute(itemuid, "dodgePercent") end function doPlayerAddDodgeItem(cid, itemid, percent) local item = doPlayerAddItem(cid, itemid) doItemSetAttribute(item, "description", "[Dodge: "..percent.."%]") doItemSetAttribute(item, "dodgePercent", percent) end Agora é só aproveitar no seu server.. toda vez que vc for usar num script vc poderá utilizar as funções getItemDodgePercent(item)
e a doPlayerAddDodgeItem(cid, itemid, percent).
Pra finalizar aqui tem um exemplo de uma quest que dá uma plate armor com 0.8% de dodge:
Espero que gostem!
EDITADO:
Fiz um script de action pra ser uma pedra que vai dar dodge nos items. Ele tem muito que melhorar mas por ora ele tá 99% pronto pra ser colocado em algum server que utilize esse dodge system.
function isHandItem(uid) -- NW based on Mock uid = uid or 0 if isInArray({1,2,3,4,5,6}, getItemWeaponType(uid)) then return true end return false end function getItemDodgePercent(itemuid) return getItemAttribute(itemuid, "dodgePercent") or 0 end function setItemDodgePercent(uid, percent) doItemSetAttribute(uid, "description", "[Dodge: "..percent.."%]") doItemSetAttribute(uid, "dodgePercent", percent) end function onUse(cid, item, fromPosition, itemEx, toPosition) level = 0 local upgrade = { [1] = {min = 1, max = 5, chance = 100}, [2] = {min = 5, max = 10, chance = 80}, [3] = {min = 10, max = 20, chance = 60}, [4] = {min = 20, max = 40, chance = 40}, [5] = {min = 40, max = 50, chance = 20} } function isWearing(uid) -- NW based on Mock uid = uid or 0 if isInArray({uid}, getPlayerSlotItem(cid, 1).uid) or isInArray({uid}, getPlayerSlotItem(cid, 4).uid) or isInArray({uid}, getPlayerSlotItem(cid, 7).uid) or isInArray({uid}, getPlayerSlotItem(cid, 8).uid) then return true end return false end if isHandItem(itemEx.uid) or isWearing(itemEx.uid) then local name = getItemName(itemEx.uid) local atual = math.floor(getItemDodgePercent(itemEx.uid)*10)/10 for i = 1, #upgrade do if string.find(tostring(name),"+".. i .."") then level = i end end if level >= #upgrade then doPlayerSendTextMessage(cid,MESSAGE_STATUS_CONSOLE_BLUE,"Your item is already on max level, you can't upgrade it any further.") return true end if math.random(0,100) <= upgrade[level + 1].chance then doRemoveItem(item.uid, 1) doPlayerSendTextMessage(cid,MESSAGE_STATUS_CONSOLE_BLUE,"You leveled your "..getItemNameById(itemEx.itemid).." to ".. level+1 ..".") setItemDodgePercent(itemEx.uid, atual + (math.random(upgrade[level+1].min,upgrade[level+1].max))/10) doItemSetAttribute(itemEx.uid,'name', getItemNameById(itemEx.itemid)..' +'..(level+1)) doSendMagicEffect(toPosition, math.random(28,30)) else doRemoveItem(itemEx.uid, 1) doRemoveItem(item.uid, 1) doPlayerSendTextMessage(cid,MESSAGE_STATUS_CONSOLE_BLUE,"Your "..getItemNameById(item.itemid).." has failed and destroyed your "..getItemNameById(itemEx.itemid).." in the process") doSendMagicEffect(toPosition, 4) end else doPlayerSendTextMessage(cid, 24,"You cant refine this item.") end return true end
Note que pra colocar dodge num item ele tem que: Estar equipado se for qualquer tipo de armadura (legs, boots, helmet, armor) ou livremente (se for weapon/shield).. Necklaces, rings e pendants não são possíveis de colocar dodge.. se vc quiser que seja edita essa função dentro do script pros slots de ring e necklace mas eu não aconselharia a fazer isso.
e no xml coloque:
<action itemid="8306" script=upgraderock.lua"/> -
RigBy deu reputação a grafit em [C++] onDropLoot(cid, item)Event droploot acontece quando um monstro ou player dropa 1 item.
Em creatureevent.cpp procure:
bool CreatureEvents::playerLogin(Player* player) { //fire global event if is registered bool result = true; for(CreatureEventList::iterator it = m_creatureEvents.begin(); it != m_creatureEvents.end(); ++it) { if(it->second->getEventType() == CREATURE_EVENT_LOGIN && !it->second->executeLogin(player) && result) result = false; } return result; Adicione abaixo:
bool CreatureEvents::dropLoot(Creature* creature, Item* item) { bool result = true; for(CreatureEventList::iterator it = m_creatureEvents.begin(); it != m_creatureEvents.end(); ++it) { if(it->second->getEventType() == CREATURE_EVENT_DROPLOOT && !it->second->executeDropLoot(creature, item)) result = false; } return result; } Ainda em creatureevents.cpp procure:
else if(tmpStr == "preparedeath") m_type = CREATURE_EVENT_PREPAREDEATH; Adicione abaixo:
else if(tmpStr == "droploot") m_type = CREATURE_EVENT_DROPLOOT; Procure:
case CREATURE_EVENT_PREPAREDEATH: return "onPrepareDeath"; Adicione abaixo:
case CREATURE_EVENT_DROPLOOT: return "onDropLoot"; Procure:
case CREATURE_EVENT_PREPAREDEATH: return "cid, deathList"; Adicione abaixo:
case CREATURE_EVENT_DROPLOOT: return "cid, item"; Procure:
uint32_t CreatureEvent::executeLogout(Player* player, bool forceLogout) { //onLogout(cid, forceLogout) if(m_interface->reserveEnv()) { ScriptEnviroment* env = m_interface->getEnv(); if(m_scripted == EVENT_SCRIPT_BUFFER) { env->setRealPos(player->getPosition()); std::stringstream scriptstream; scriptstream << "local cid = " << env->addThing(player) << std::endl; scriptstream << "local forceLogout = " << (forceLogout ? "true" : "false") << std::endl; scriptstream << m_scriptData; bool result = true; if(m_interface->loadBuffer(scriptstream.str())) { lua_State* L = m_interface->getState(); result = m_interface->getGlobalBool(L, "_result", true); } m_interface->releaseEnv(); return result; } else { #ifdef __DEBUG_LUASCRIPTS__ char desc[35]; sprintf(desc, "%s", player->getName().c_str()); env->setEventDesc(desc); #endif env->setScriptId(m_scriptId, m_interface); env->setRealPos(player->getPosition()); lua_State* L = m_interface->getState(); m_interface->pushFunction(m_scriptId); lua_pushnumber(L, env->addThing(player)); lua_pushboolean(L, forceLogout); bool result = m_interface->callFunction(2); m_interface->releaseEnv(); return result; } } else { std::cout << "[Error - CreatureEvent::executeLogout] Call stack overflow." << std::endl; return 0; } } Adicione abaixo:
uint32_t CreatureEvent::executeDropLoot(Creature* creature, Item* item) { //onDropLoot(cid, item) if(m_interface->reserveEnv()) { ScriptEnviroment* env = m_interface->getEnv(); if(m_scripted == EVENT_SCRIPT_BUFFER) { env->setRealPos(creature->getPosition()); std::stringstream scriptstream; scriptstream << "local cid = " << env->addThing(creature) << std::endl; env->streamThing(scriptstream, "item", item, env->addThing(item)); scriptstream << m_scriptData; bool result = true; if(m_interface->loadBuffer(scriptstream.str())) { lua_State* L = m_interface->getState(); result = m_interface->getGlobalBool(L, "_result", true); } m_interface->releaseEnv(); return result; } else { #ifdef __DEBUG_LUASCRIPTS__ char desc[35]; sprintf(desc, "%s", player->getName().c_str()); env->setEventDesc(desc); #endif env->setScriptId(m_scriptId, m_interface); env->setRealPos(creature->getPosition()); lua_State* L = m_interface->getState(); m_interface->pushFunction(m_scriptId); lua_pushnumber(L, env->addThing(creature)); LuaScriptInterface::pushThing(L, item, env->addThing(item)); bool result = m_interface->callFunction(2); m_interface->releaseEnv(); return result; } } else { std::cout << "[Error - CreatureEvent::executeDropLoot] Call stack overflow." << std::endl; return 0; } } Em creatureevent.h procure:
CREATURE_EVENT_PREPAREDEATH, Adicione abaixo:
CREATURE_EVENT_DROPLOOT Procure:
uint32_t executeTarget(Creature* creature, Creature* target); Adicione abaixo:
uint32_t executeDropLoot(Creature* creature, Item* item); Agora em player.h procure a função:
void Player::dropLoot(Container* corpse) Troque por:
void Player::dropLoot(Container* corpse) { if(!corpse || lootDrop != LOOT_DROP_FULL) return; uint32_t start = g_config.getNumber(ConfigManager::BLESS_REDUCTION_BASE), loss = lossPercent[LOSS_CONTAINERS], bless = getBlessings(); while(bless > 0 && loss > 0) { loss -= start; start -= g_config.getNumber(ConfigManager::BLESS_REDUCTION_DECREAMENT); bless--; } uint32_t itemLoss = (uint32_t)std::floor((5. + loss) * lossPercent[LOSS_ITEMS] / 1000.); for(int32_t i = SLOT_FIRST; i < SLOT_LAST; ++i) { Item* item = inventory[i]; if(!item) continue; Creature* creature = NULL; bool deny = false;item creature = g_game.getCreatureByID(getID()); CreatureEventList droploot = getCreatureEvents(CREATURE_EVENT_DROPLOOT); for(CreatureEventList::iterator it = droploot.begin(); it != droploot.end(); ++it) { if(!(*it)->executeDropLoot(this, item)) deny = true; } if(!deny) { uint32_t rand = random_range(1, 100); if(skull > SKULL_WHITE || (item->getContainer() && rand < loss) || (!item->getContainer() && rand < itemLoss)) { g_game.internalMoveItem(NULL, this, corpse, INDEX_WHEREEVER, item, item->getItemCount(), 0); sendRemoveInventoryItem((slots_t)i, inventory[(slots_t)i]); } } } } Em monster.cpp procure:
void MonsterType::dropLoot(Container* corpse) { if(corpse && lootDrop == LOOT_DROP_FULL) mType->dropLoot(corpse); } Troque por:
void MonsterType::dropLoot(Container* corpse) { Item* tmpItem = NULL; for(LootItems::const_iterator it = lootItems.begin(); it != lootItems.end() && !corpse->full(); ++it) { uint32_t owner = corpse->getCorpseOwner(); Creature* creature = g_game.getCreatureByID(owner); if((tmpItem = createLoot(*it)) && g_creatureEvents->dropLoot(creature, tmpItem)) { if(Container* container = tmpItem->getContainer()) { if(createChildLoot(container, (*it))) corpse->__internalAddThing(tmpItem); else delete container; } else corpse->__internalAddThing(tmpItem); } } corpse->__startDecaying(); uint32_t ownerId = corpse->getCorpseOwner(); if(!ownerId) return; Player* owner = g_game.getPlayerByID(ownerId); if(!owner) return; LootMessage_t message = lootMessage; if(message == LOOTMSG_IGNORE) message = (LootMessage_t)g_config.getNumber(ConfigManager::LOOT_MESSAGE); if(message < LOOTMSG_PLAYER) return; std::stringstream ss; ss << "Loot of " << nameDescription << ": " << corpse->getContentDescription() << "."; if(owner->getParty() && message > LOOTMSG_PLAYER) owner->getParty()->broadcastMessage((MessageClasses)g_config.getNumber(ConfigManager::LOOT_MESSAGE_TYPE), ss.str()); else if(message == LOOTMSG_PLAYER || message == LOOTMSG_BOTH) owner->sendTextMessage((MessageClasses)g_config.getNumber(ConfigManager::LOOT_MESSAGE_TYPE), ss.str()); } Exemplo de uso da função:
function onDropLoot(cid, item) local block = {2221, 1221, 2922} for i=1, #block do if item.itemid == block[i] then return false end end return true end Créditos: Caotic
-
RigBy deu reputação a zipter98 em NPC "Pather" (não sou bom com nomes)ANTES DE TUDO: Você deve instalar a função getCreaturePathTo no seu servidor, disponibilizada pelo elwyn. ------------------------------------------------------------------------------------------------------------------------------------------- Oi, o código consiste num NPC que, a troco de dinheiro (configurável), caminha até determinado lugar (escolhido pelo jogador durante o diálogo). Tais lugares, assim como a mensagem que os representa, são configuráveis. Ao chegar no destino, o NPC fica parado durante alguns segundos. Depois, ele volta andando até sua posição de origem. Fiz alguns testes e não encontrei bug algum. Caso você ache, reporte aqui no tópico (ou resolva você mesmo). E se algum jogador/monstro/summon ficar no caminho do NPC, ele passará "por cima" da criatura. Well, em data/npc, crie um arquivo com extensão .XML, nomeie-o Pather, e coloque o seguinte conteúdo: <?xml version="1.0" encoding="UTF-8"?> <npc name="Jonathan" script="path.lua" walkinterval="350000" floorchange="0" speed="0"> <health now="150" max="150"/> <look type="134" head="39" body="113" legs="38" feet="0" addons="3" corpse="2212"/> <parameters> <parameter key="message_greet" value="Hello, wanna see the path of some place?"/> </parameters> </npc> Depois, em data/npc/scripts, crie um arquivo com extensão .lua, nomeie-o path, e coloque o seguinte conteúdo: local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end local place = nil function creatureSayCallback(cid, type, msg) if not npcHandler:isFocused(cid) then return false end local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid local config = { price = 1000, --Preço. backTime = 5, --Tempo para voltar, em segundos. places = { --["message"] = {to_position}, ["rat"] = {x = 1058, y = 912, z = 7}, ["troll"] = {x = 1059, y = 915, z = 7}, ["goblin"] = {x = 1060, y = 915, z = 7}, }, } local isWalking = getPlayerStorageValue(getNpcCid(), 8013) > -1 and true or false if not isWalking then if talkState[talkUser] == 1 then if config.places[msg:lower()] then selfSay("It will cost you "..config.price.." dollars. Are you sure?", cid) talkState[talkUser] = 2 place = msg:lower() return true else selfSay("I can't go to this place.", cid) return true end elseif msgcontains(msg:lower(), "yes") and talkState[talkUser] == 2 then if doPlayerRemoveMoney(cid, config.price) then selfSay("OK, let's go!", cid) local path = getCreaturePathTo(getNpcCid(), config.places[place], 50) setPlayerStorageValue(getNpcCid(), 8013, 1) local npc = getNpcCid() local npcPos = getNpcPos() for i = 1, #path do addEvent(function() doMoveCreature(npc, path[i]) if i == #path then doCreatureSay(npc, "And here we are!", TALKTYPE_SAY) addEvent(function() doCreatureSay(npc, "Well, I'm going back.", TALKTYPE_SAY) path = getCreaturePathTo(npc, npcPos, 50) for j = 1, #path do addEvent(function() doMoveCreature(npc, path[j]) if j == #path then setPlayerStorageValue(npc, 8013, -1) end end, j * 900) end end, config.backTime * 1000) end end, i * 900) end else selfSay("You do not have enough money.", cid) talkState[talkUser] = 0 return true end elseif msgcontains(msg:lower(), "no") and talkState[talkUser] == 2 then selfSay("Ok, then...", cid) talkState[talkUser] = 0 return true elseif msgcontains(msg:lower(), "yes") then local str = "" local z = {} for _, b in pairs(config.places) do table.insert(z, _) end for d = 1, #z do if str == "" then str = z[d] else str = str..(d == #z and " and " or ", ")..z[d] end end selfSay("I can show you the path for the following places: {"..str.."}. Which path do you wanna see?", cid) talkState[talkUser] = 1 return true elseif msgcontains(msg:lower(), "no") then selfSay("Ok, bye.") talkState[talkUser] = 0 return true end end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) No momento estou de saída, logo não posso gravar um vídeo, tirar alguma screenshot ou fazer um gif. Caso esteja curioso, instale o código e teste-o. Até breve.
-
RigBy deu reputação a Summ em A diferença entre: Um Cara Que Programa e Um ProgramadorPrimeiramente o artigo não é meu só achei interessante e pensei em compartilhar com vocês, o autor se chama William Bruno.
Link Original : http://wbruno.com.br/opiniao/diferenca-entre-cara-programa-um-programador/
O ato de escrever códigos te faz ser um cara que programa, mas não necessariamente um programador.
Okay, eu “inventei” agora a diferença entre esses termos.
Digamos que ambos cumprem o papel e resolvem o problema.
A diferença está na forma de pensar deles.
Existem diversas maneiras de se chegar a um mesmo resultado. Umas mais claras, diretas, outras mais bonitas, elegantes, as vezes nebulosas, cheias de voltas e emaranhados, boas ou ruins. Apesar do peso de subjetividade que esses termos carregam.
Na minha opinião, um bom código é aquele que, chega onde deve chegar, sendo este legível aos envolvidos, e aqueles que não sabem do que se trata.
-> Bom em performance;
-> Sem rotinas confusas ou desnecessárias(as famosas gorduras);
-> Bem indentado e organizado.
Apenas isso. Simples e objetivo. Toda a comunidade, conhece ou deveria conhecer os conceitos que citei. (Keep It Simple, Faça o Simples que Funcione, Você não vai precisar disso, Don’t Repeat Yourself…)
Não quero me alongar sobre cada um deles. O meu ponto é: “Um CQP [Cara Que Programa], não leva ou nem sempre leva em consideração estas ‘máximas’.”
Já um VP [Verdadeiro Programador], possui esses conceitos incorporados a ele. Na forma de pensar, na maneira de codificar. Para um Programador, é natural, para o CQP, ainda não é.
Todos sofremos pressão, temos prazos apertados, situações difíceis… Este é o nosso mundo. A agência ou empresa, pode lhe dizer que é tranquilo, que são pacientes, que os prazos são legais, e tudo mais.. Porém faz parte da arte de programar. Cedo ou tarde, mais ou menos vezes, nos deparamos com algo urgente e impossível, para ontem.
Um programador resolve da melhor forma possível, enxergando na frente, o outro faz apenas para se ver livre, e entregar logo. O erro aqui, é que depois aquele monstrinho volta, e nem sempre podemos ou temos tempo de refazer ou corrigir.
Dai surgem as cabeças dos nossos monstros. Duas, Três, Sete… a tendência é piorar. Começou errado, por preguiça, falta de conhecimento, mal planejamento, ego…
Um CQP, acha que sabe tudo, ou não se importa de não saber, e nem tenta. Um VP, tenta saber, sempre busca melhorar, aceita analisando as críticas recebidas, e gosta do que faz.
Fazer bem feito lhe deixa feliz, o contrário lhe incomoda.
O melhor programador não é aquele que complica mais. Códigos de linguagens alto nível, devem ser escritos por humanos e para humanos. As máquinas entendem, tanto códigos bem escritos, quanto códigos ruins, mas e você no futuro ? e o outro programador ?
Acho que todos nós já demos continuidade no trabalho de alguém. Já vimos scripts porcos, e outros bem feitos.
Quando alguém pegar um trabalho nosso, vamos tentar ser aquele que não será xingado, e nem fez o outro programador perder horas e horas, entendendo as loucuras que fizemos.
Se faça essa pergunta. O que você é? Qual dos dois?
-
RigBy deu reputação a xWhiteWolf em Tibia está zerado + preview [GPS SYSTEM]Graças ao nosso marvilhoso colega Elwyn o tibia foi zerado hoje dia 09/03/2015 haha. Ele lançou uma função crucial pra fazer qualquer script relacionado à movimentação ao combinar o algoritmo de pathFinding da source à uma função Lua.
Sei que muita gente não frequenta a seção de programming OU não entendeu nada doque eu falei mas pqp, deem uma rápida olhada noque dá pra criar:
Isso é um GIF de um sistema que eu to tentando fazer desde novembro de 2014 e que agora eu finalmente consegui terminar graças à genialidade desse mito. Trata-se de uma talkaction que vc digita !Lugarquevcquerir e o personagem vai andando automaticamente até o local e quando chega ele manda uma msg avisando que vc chegou ao destino, semelhante a um GPS!!!!!11111
Fora que com isso podemos controlar os movimentos do NPCS!!!!111 Dá pra fazer uma fucking quest que vc tem que seguir o npc até um altar secreto e seilá, ele é um npc normal que vende backpack/rope/shovel mas qnd dá 18h de um certo dia ele visita a tumba e volta pra cidade (e vc tem que seguir ele pra descobrir isso). SUCH RPG!!!!!
Sei lá, eu animei demais com isso >.<
As possibilidades são tantas que eu não consigo nem me conter AUHIEUHIUHI dá pra fazer MUITA coisa cara, inclusive vou tentar trazer os scripts relacionados à essa função pra vocês.
Se você gostou das idéias, sério, não clica em gostei no meu tópico, vai lá no tópico do elwyn e clica... ele é o verdadeiro mito que resolveu isso.
-
RigBy deu reputação a Elwyn em getCreaturePathToPara TFS 0.4/0.3.6 e OTX2
Em luascript.h depois de:
static int32_t luaGetCreatureName(lua_State* L); Adicionar:
static int32_t luaGetCreaturePathTo(lua_State* L); Em luascript.cpp depois de:
//getCreatureName(cid) lua_register(m_luaState, "getCreatureName", LuaInterface::luaGetCreatureName); Adicionar:
//getCreaturePathTo(cid, pos, maxSearchDist) lua_register(m_luaState, "getCreaturePathTo", LuaInterface::luaGetCreaturePathTo); Depois de:
int32_t LuaInterface::luaGetCreatureName(lua_State* L) { //getCreatureName(cid) ScriptEnviroment* env = getEnv(); if(Creature* creature = env->getCreatureByUID(popNumber(L))) lua_pushstring(L, creature->getName().c_str()); else { errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND)); lua_pushboolean(L, false); } return 1; } Adicionar:
int32_t LuaInterface::luaGetCreaturePathTo(lua_State* L) { //getCreaturePathTo(cid, pos, maxSearchDist) ScriptEnviroment* env = getEnv(); int32_t maxSearchDist = popNumber(L); PositionEx position; popPosition(L, position); Creature* creature = env->getCreatureByUID(popNumber(L)); if (!creature) { lua_pushnil(L); return 1; } std::list<Direction> dirList; lua_newtable(L); if (g_game.getPathTo(creature, position, dirList, maxSearchDist)) { std::list<Direction>::const_iterator it = dirList.begin(); for (int32_t index = 1; it != dirList.end(); ++it, ++index) { lua_pushnumber(L, index); lua_pushnumber(L, (*it)); pushTable(L); } } else { lua_pushboolean(L, false); } return 1; } E sejam felizes!
getCreaturePathTo(cid, position, maxSearchDist) retornará uma tabela com as direções que o jogador deve seguir para chegar no ponto position. Não contem as posições que ele deve passar por. maxSearchDist é o valor máximo de passos que ele vai dar em direção à essa position e na via das dúvidas coloque o maior valor de distancia entre as duas posições.
-
RigBy deu reputação a vyctor17 em Advanced SoundEai galera, pra quem conhece meu tópico de showoff já sabe oque eu estou postando . mas pra quem não conhece oque é o Advanced Sound segue o ctrl+v.
é um MOD para o OTC, que permite ao OTC reproduzir diversas tipos de mídia como (.MP3, .WAV, .OGG, .MOD, .IT, .S3D, .XM).
Além disso esse MOD conta com uma biblioteca de áudio 3D, e a melhor parte é que não necessita de alteração na source por parte do OTC,só no serverside se o desenvolvedor quiser ativar alguns recursos como áudio nas falas das criaturas. a parte do áudio nas criaturas não esta inclusa no download. e também não conta com áudio 3d configurado em script mais as funções estão na biblioteca se quiser é só fazer .
Algumas aplicações por exemplo em servidores de pokemon ao jogar a pokebola mandar um som para o client ao capturar outro som ou falhar na captura, assim como som de batalhas, som ambiente, o limite é sua imaginação!
Lista de funções
pauseAll isPlaying isFinished getSoundPlayLen getSoundPlayPosition setSndPlayPos setSoundMinDistance setListenerPosition setSound3DPosition setVolume getVolume setPaused isPaused playMusic deleteSnd setReverbEnabled setEchoEnabled setDistortionEnabled Exemplo de uso em lua servidor:
local colors = { TEXTCOLOR_BLUE, TEXTCOLOR_LIGHTBLUE, TEXTCOLOR_LIGHTGREEN, TEXTCOLOR_TEAL, TEXTCOLOR_PURPLE, TEXTCOLOR_PLATINUMBLUE, TEXTCOLOR_LIGHTGREY, TEXTCOLOR_DARKRED, TEXTCOLOR_RED, TEXTCOLOR_ORANGE, TEXTCOLOR_YELLOW, TEXTCOLOR_WHITE_EXP } function onSay(cid, words, param) local playerpos = getPlayerPosition(cid) local random = math.random(1, #colors) if math.max(math.abs(playerpos.x-23), math.abs(playerpos.y-30)) < 9999 then doSendAnimatedText(playerpos, "GoGoGo!", colors[random]) sendScreanSound(cid, "com_go.wav") end return true end
Criaturas Falantes C++ ServerSide:
Em game.cpp, procure por:
bool Game::internalCreatureSay(Creature* creature, SpeakClasses type, const std::string& text, bool ghostMode, SpectatorVec* spectators/* = NULL*/, Position* pos/* = NULL*/) E abaixo de:
if(!ghostMode || tmpPlayer->canSeeCreature(creature)) tmpPlayer->sendCreatureSay(creature, type, text, &destPos); Adicione:
if(type == SPEAK_MONSTER_YELL or type == SPEAK_MONSTER_SAY){ tmpPlayer->sendExtendedOpcode(85, text + ".mp3|false"); } Dai é só adicionar os som a pasta e colocar o nome dele igual a fala nesse metodo só ta pra rodar mp3, tem jeito melhor de fazer isso adicionando um nova tag no .xml do monstro mais acabei ficando com preguiça e fiz assim kk'
Download
não autorizo o re-post em qualquer outro fórum sem minha autorização.
vyctor17 - Waki-V LTDA ©
-
RigBy deu reputação a xWhiteWolf em TauntTaunt é uma magia bem simples que eu fiz me baseando na New Library, pra magia funcionar no seu servidor você vai precisar ter a New Lib instalada (veja esse tópico http://www.tibiaking.com/forum/topic/46015-new-library-v-10/)
A magia em si não tira dano, ela apenas provoca um inimigo fazendo ele andar até a sua direção mas ela possui uns efeitos bem legais e acho que vai ser ótima pra um servidor com bastante foco em RPG;
Aqui tem um pequeno GIF mostrando como a magia funciona.
Bom, dito isso vamos para o código da spell.. como a função taunt já existe na new lib tudo que vc vai precisar adicionar no script da spell é isso daqui:
local config = { walks = 4, -- qnts passos ele vai dar delay = 750, -- de qnts em qnts milisegundos ele dá cada passo speed = 100 -- velocidade que ele vai ficar enquanto estiver sob efeito do taunt } function onCastSpell(cid, var) Taunt(cid, variantToNumber(var), config.delay, config.walks) doChangeSpeed(variantToNumber(var), (config.speed - getCreatureBaseSpeed(variantToNumber(var)))) addEvent(function() if isCreature(variantToNumber(var)) then doChangeSpeed(variantToNumber(var), (-config.speed + getCreatureBaseSpeed(variantToNumber(var)))) end end, config.delay * (config.walks + 1)) return true end
e você configura ali no 300 que é o tempo em milisegundos entre cada passo e 4 é o número de passos que o monstro/player vai andar na sua direção.
Agora é só adicionar isso daqui no spells.xml:
<instant name="TK" words="taunt" lvl="8" mana="35" prem="0" exhaustion="1500" range="4" needtarget="1" needlearn="0" event="script" value="taunt.lua"> </instant> Espero que vocês gostem da spell e façam um bom proveito!
Edit: Deixei o efeito do taunt mais bonito, espero que tenham gostado
-
RigBy deu reputação a xWhiteWolf em New Library v. 1.2Fala galera, hoje vim trazer pra vocês uma nova biblioteca de funções que eu venho desenvolvendo, pretendo ir atualizando esse tópico constantemente sempre adicionando funções novas e explicando a utilização delas. Algumas funções que eu coloquei aqui estão presentes na OTAL também, porém algumas eu fiz pequenas correções de forma que essa lib poderia facilmente substituir a OTAL sem grandes problemas (pelo menos se você utilizava apenas as funções básicas da otal)
Todas as funções que não tem -- nome do autor do lado dela foram feitas por mim, xWhiteWolf ou Night Wolf (NW). O restante delas são créditos dos devidos autores, apenas coloquei pois considero funções vitais no server de cada um. Crie um arquivo em data/lib chamado 075 - White Wolf Functions.lua e coloque o seguinte código dentro:
Agora eu vou explicar oque cada função faz porque de nada adianta lançar uma lib e não explicar oque ela faz não é mesmo? hahaha
Obs inicial: quando uma função tiver em seus parametros um [] significa que oque está dentro do colchetes não é um parâmetro obrigatório.
Como usar: doShowTimeByPos(cid, getCreaturePosition(cid), 20, 20)
Irá fazer uma contagem regressiva na posição que o player se encontra começando de 20 e mandando a mensagem na mesma cor da fala dos monstros.
Essa função é bem útil em actions/spells para fazer contagem de tempo em runas como a magic wall e ver quanto tempo falta pra magic wall sumir)
Obs: Espero que ajude bastante pessoas a entender sobre funções, eu utilizei cid como o principal uid das funções nos exemplos mas você pode muito bem utilizar outros uids, fica a critério seu.
Qualquer dúvida comentem abaixo que eu vou tentar ajudar da melhor maneira.
Ahhh, isso daí foi testado em 8.54 mas deve funcionar em quase todas as versões que tenham as funções básicas do TFS.
EDIT: Pessoal, agora é sério, essa lib tem fácil umas 600 linhas, das quais umas 500 eu devo ter codado sozinho (na mão, linha por linha). Eu tive todo o trabalho de testar cada uma delas e oque eu peço é o mínimo de gratidão e respeito. Se eu te ajudei clique em Gostei, se você tiver alguma dúvida eu to me colocando a disposição de responder qualquer coisa relacionada ao tópico, mesmo que você não saiba nem oque é uma lib apenas venha aqui e escreva sua dúvida.
EDIT 2: Duas novas funções adicionas, espero que gostem!
EDIT 3: Três novas funções adicionadas juntamente com suas respectivas explicações.
-
RigBy deu reputação a Danves em (Resolvido)Dano equivalente ao seu life atuallocal combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TARGETCASTERORTOPMOST, true) setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_FIREATTACK) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE) local storage = 10002 local tempo = 2 local mana = 12 local ClearMind = 10000 function onCastSpell(cid, var) if getPlayerStorageValue(cid, storage) < os.time() then if getPlayerStorageValue(cid, ClearMind) == -1 then if getCreatureMana(cid) >= mana then doCombat(cid, combat, var) setPlayerStorageValue(cid, storage, os.time() + tempo) doCreatureAddMana(cid, -mana) else doPlayerSendCancel(cid, "É preciso de "..mana.." para usar a magia.") return false end elseif getCreatureMana(cid) >= (mana/2) then health = getCreatureHealth(cid)/10 health = math.ceil(health) doTargetCombatHealth(cid, variantToNumber(var), COMBAT_FIREDAMAGE, -health, -health, -1) doCombat(cid, combat, var) doCreatureAddMana(cid, -mana/2) setPlayerStorageValue(cid, storage, os.time() + tempo) else doPlayerSendCancel(cid, "É preciso de "..mana.." para usar a magia.") return false end else doPlayerSendCancel(cid, "Você tem que esperar "..getPlayerStorageValue(cid, storage) - os.time().." segundos para usar a magia novamente.") return false end return true end
-
RigBy deu reputação a Simon Here em [8.6X - > 10.5X] SIMON HERE GALLERYOlá a todos em minha galeria
Meu nome é Simon, sou polonês mas eu vivo na França há alguns anos.
Nesta galeria vão estar meus trabalhos recentes..
Então, vamos começar
[1.]
[2.]
[3.]
[4.]
[5.]
[6.]
[7.]
[8.]
[9.]
[10.]
[11.]
[12.]
[13.]
[14.]
[15.]
[16.]
[17.]
[18.]
[19.]
[20.]
[21.]
[22.]
[23.]
-
RigBy deu reputação a Adriano SwaTT em (Resolvido)Magia de área que muda a storage.Que bom cara, fiz meio que correndo.
Boa sorte aí, faça bom aproveito.
-
RigBy deu reputação a Adriano SwaTT em (Resolvido)Magia de área que muda a storage.Boa tarde.
Desculpe-me a demora, pois tive que fazer uns ajustes e meio que umas apelações brasileiras para funcionar, pois sou iniciante também.
Enfim..
Testei e funcionou perfeitamente.
Na pasta "Talkactions / Scripts" crie o arquivo "nome.lua" e adicione este código dentro.
Agora registre em talkactions.xml a tag abaixo:
<talkaction words="!strg" event="script" value="nome.lua" /> Lembre-se de mudar a "palavra mágica" que adicionará o script e o nome do arquivo do script.
Testado e funcionou perfeitamente.
Boa sorte.
-
RigBy deu reputação a Adriano SwaTT em (Resolvido)Magia de área que muda a storage.Estou criando o 1º script, mas tive que sair.
Depois termino e lhe passo..
-
RigBy deu reputação a MaTTch em (Resolvido)Como fazer para Npc aceita acentosConverta o script do NPC para ANSI com o notepad ou outro programa da sua preferencia.