Ir para conteúdo

Pesquisar na Comunidade

Mostrando resultados para as tags ''lua''.



Mais opções de pesquisa

  • Pesquisar por Tags

    Digite tags separadas por vírgulas
  • Pesquisar por Autor

Tipo de Conteúdo


Fóruns

  • xTibia - Notícias e Suporte
    • Regras
    • Noticias
    • Soluções
    • Tutoriais para Iniciantes
    • Imprensa
  • OTServ
    • Notícias e Debates
    • OTServlist
    • Recursos
    • Suporte
    • Pedidos
    • Downloads
  • OFF-Topic
    • Barzinho do Éks
    • Design
    • Informática

Categorias

Não há resultados


Encontrar resultados em...

Encontrar resultados que contenham...


Data de Criação

  • Início

    FIM


Data de Atualização

  • Início

    FIM


Filtrar pelo número de...

Data de Registro

  • Início

    FIM


Grupo


Sou

Encontrado 63 registros

  1. Olá, comecei meus estudos em Otclient, porem tenho muitas duvidas!. Oque ser isso? variaveis? porque todas nil? @onLoad: init() ? @onUnload: terminate() ? Variaveis com local sem o nil? oque isso muda? porque g_game? g_game.IsOnine ? isso é uma função do otclient? como posso tirar essa função da sourcer? Como se inicia um modulo? com local Nome ou Local Nome = nil? ou só a variavel = nil? todas ela tem que tem function init()? function onGameConnectionError(message, code) ? de onde saiu onGameConnection? sourcer? function CharacterList.terminate() ? if charactersWindow then -- se for charactersWindow entao characterList = nil -- lista de char = nil? charactersWindow:destroy() -- :destroy a lista de char ok! charactersWindow = nil -- nil novamente? end function CharacterList.doLogin() ? de onde tira isso? das funçoes da sourcer?
  2. Emooooo

    erro record.lua

    [01/04/2019 20:22:33] [Error - GlobalEvent Interface] [01/04/2019 20:22:33] data/globalevents/scripts/record.lua:onRecord [01/04/2019 20:22:33] Description: [01/04/2019 20:22:33] data/globalevents/scripts/record.lua:2: attempt to call field 'executeQuery' (a nil value) [01/04/2019 20:22:33] stack traceback: [01/04/2019 20:22:33] data/globalevents/scripts/record.lua:2: in function <data/globalevents/scripts/record.lua:1> ALGUÉM AJUDA AE ! PLIS +REP
  3. boa rapeize, alguem pode ajudar, como faço uma spell, que ela sejá apenas para o knight, ou vocation 4 - 8... eu não quero escrever ela e ativar, quero que ela seja propria do personagem sem escrever nada sem ativar... bom seguinte, quando o knight tiver com vida menor que 30% do total da vida dele... ele ganha + 20 de skill, axe sword e club... tem como alguém ajudar ? lembrando, eu não quero ativar ela igual utito tempo, e não quero que tenha um tempo determinado, quero que seja do personagem... ta com -30% de life ele ganha skill... agradeço desde já !
  4. Então eu tinha esse script de carpet em transform_to a bastante tempo desde 2016, mais simples Então então estou postando hoje Vamos ao Assunto. vai em data "datapack"/actions/scripts Crie um arquivo chamado carpet.lua coloque isso Volte na pasta actions abra o actions.xml Coloque Carpet fechado Carpet aberto DONO: PokemonZbr ( Online ) DONO: OtPokemonTvZ ( Offline ) Links do meu jogo https://pokemonzbr.com/ (Online) http://otpokemontvz.com/ (Offline) Eu sou: Scripter: 5% Mapper: 30% Programador: 4% Website : 50%
  5. #Introdução Bom hoje estarei trazendo aqui o sistema de Ping feito pelo Mock, com uma pequena adaptação feita por mim para funcionar em TFS 0.4(talvez podendo funcionar em outras) Pois o que ele disponibilizou foi apenas para TFS 0.3.6 e nem foi muito utilizado pela comunidade. Muitos servidores daqui para download tem script no talk mas a lib está totalmente errada e não tem o code nas sources. Esse sistema tem varias utilizades, podendo usar o comando !ping para verificar seu ms ou até mesmo você por para kikar jogadores com ms muito alto... Se você não sabe o cliente já tem um sistema de ping, e getOtsystime é como os.time () + os.clock (), você tem ano, mês, dia, hora, minutos, segundos, milisegundos... Enfim chega de enrolação e vamos lá! Code para TFS 0.4 e OTX: Code para TFS 0.3.6 LIB: Prontinho, agora seu servidor está pronto para utilizar as funções de Ping. Seja criativo! Ahh você é daqueles que quer tudo na mão né? Aqui vai um talkactions para ver o ping. Em talkactions/scripts crie um arquivo chamado playerping.lua, cole isto dentro: -- Script by Yan Liima(Night for xtibia.com) function onSay(cid, words, param, channel) local ms = ping.CheckPing(cid) doPlayerSendTextMessage(cid,22,"Ping aproximado --> ["..ms.."].") return true end Em talkactions.xml <talkaction words="!ping" event="script" value="playerping.lua"/>
  6. Eu criei esse sistema de look at attack porquê eu acho ridículo quando o character fica atacando o oponente sem estar "olhando" para ele. O que ele faz? Ele volta o character que esteja atacando um oponente para o oponente. Ele não impede de andar ou de mudar de direção, porém ele vai ficar mantendo a direção voltada ao oponente. Vamos adicionar o sistema. Em: creaturescript/creaturescript.xml, adicione essa tag: Agora em: creaturescript/scripts, crie um arquivo lua e adicione isso: Dentro do mesmo diretório, abra o arquivo login.lua e adicione isso a ele onde existe outros semelhantes. Pronto. Instalado o seus sistema de look at attack. Agora quando o player atacar algum oponente, ele ficará "olhando" para ele.
  7. Olá, xTibianos. Hoje venho lhes trazer umas listas com todas (teoricamente, pois não pude conferir) as funções padrões dos TFS 0.3 e 0.4. Source functions - Funções feitas na source getCreatureHealth(cid) getCreatureMaxHealth(cid[, ignoreModifiers = false]) getCreatureMana(cid) getCreatureMaxMana(cid[, ignoreModifiers = false]) getCreatureHideHealth(cid) doCreatureSetHideHealth(cid, hide) getCreatureSpeakType(cid) doCreatureSetSpeakType(cid, type) getCreatureLookDirection(cid) getPlayerLevel(cid) getPlayerExperience(cid) getPlayerMagLevel(cid[, ignoreModifiers = false]) getPlayerSpentMana(cid) getPlayerFood(cid) getPlayerAccess(cid) getPlayerGhostAccess(cid) getPlayerSkillLevel(cid, skill[, ignoreModifiers = false]) getPlayerSkillTries(cid, skill) getPlayerTown(cid) getPlayerVocation(cid) getPlayerIp(cid) getPlayerRequiredMana(cid, magicLevel) getPlayerRequiredSkillTries(cid, skillId, skillLevel) getPlayerItemCount(cid, itemid[, subType = -1]) getPlayerMoney(cid) getPlayerSoul(cid[, ignoreModifiers = false]) getPlayerFreeCap(cid) getPlayerLight(cid) getPlayerSlotItem(cid, slot) getPlayerWeapon(cid[, ignoreAmmo = false]) getPlayerItemById(cid, deepSearch, itemId[, subType = -1]) getPlayerDepotItems(cid, depotid) getPlayerGuildId(cid) getPlayerGuildName(cid) getPlayerGuildRankId(cid) getPlayerGuildRank(cid) getPlayerGuildNick(cid) getPlayerGuildLevel(cid) getPlayerGUID(cid) getPlayerNameDescription(cid) doPlayerSetNameDescription(cid, desc) getPlayerSpecialDescription(cid) doPlayerSetSpecialDescription(cid, desc) getPlayerAccountId(cid) getPlayerAccount(cid) getPlayerFlagValue(cid, flag) getPlayerCustomFlagValue(cid, flag) getPlayerPromotionLevel(cid) doPlayerSetPromotionLevel(cid, level) getPlayerGroupId(cid) doPlayerSetGroupId(cid, newGroupId) doPlayerSendOutfitWindow(cid) doPlayerLearnInstantSpell(cid, name) doPlayerUnlearnInstantSpell(cid, name) getPlayerLearnedInstantSpell(cid, name) getPlayerInstantSpellCount(cid) getPlayerInstantSpellInfo(cid, index) getInstantSpellInfo(cid, name) getCreatureStorageList(cid) getCreatureStorage(uid, key) doCreatureSetStorage(uid, key, value) getStorageList() getStorage(key) doSetStorage(key, value) getChannelUsers(channelId) getPlayersOnline() getTileInfo(pos) getThingFromPos(pos[, displayError = true]) getThing(uid[, recursive = RECURSE _FIRST]) doTileQueryAdd(uid, pos[, flags[, displayError = true]]) doItemRaidUnref(uid) getThingPosition(uid) getTileItemById(pos, itemId[, subType = -1]) getTileItemByType(pos, type) getTileThingByPos(pos) getTopCreature(pos) doRemoveItem(uid[, count = -1]) doPlayerFeed(cid, food) doPlayerSendCancel(cid, text) doPlayerSendDefaultCancel(cid, ReturnValue) getSearchString(fromPosition, toPosition[, fromIsCreature = false[, toIsCreature = false]]) getClosestFreeTile(cid, targetpos[, extended = false[, ignoreHouse = true]]) doTeleportThing(cid, newpos[, pushmove = true[, fullTeleport = true]]) doTransformItem(uid, newId[, count/subType]) doCreatureSay(uid, text[, type = SPEAK _SAY[, ghost = false[, cid = 0[, pos]]]]) doSendCreatureSquare(cid, color[, player]) doSendMagicEffect(pos, type[, player]) doSendDistanceShoot(fromPos, toPos, type[, player]) doSendAnimatedText(pos, text, color[, player]) doPlayerAddSkillTry(cid, skillid, n[, useMultiplier = true]) doCreatureAddHealth(cid, health[, hitEffect[, hitColor[, force]]]) doCreatureAddMana(cid, mana) setCreatureMaxHealth(cid, health) setCreatureMaxMana(cid, mana) doPlayerSetMaxCapacity(cid, cap) doPlayerAddSpentMana(cid, amount[, useMultiplier = true]) doPlayerAddSoul(cid, amount) doPlayerAddItem(cid, itemid[, count/subtype = 1[, canDropOnMap = true[, slot = 0]]]) doPlayerAddItem(cid, itemid[, count = 1[, canDropOnMap = true[, subtype = 1[, slot = 0]]]]) doPlayerAddItemEx(cid, uid[, canDropOnMap = false[, slot = 0]]) doPlayerSendTextMessage(cid, MessageClasses, message) doPlayerSendChannelMessage(cid, author, message, SpeakClasses, channel) doPlayerSendToChannel(cid, targetId, SpeakClasses, message, channel[, time]) doPlayerOpenChannel(cid, channelId) doPlayerAddMoney(cid, money) doPlayerRemoveMoney(cid, money) doPlayerTransferMoneyTo(cid, target, money) doShowTextDialog(cid, itemid, text) doDecayItem(uid) doCreateItem(itemid[, type/count], pos) doCreateItemEx(itemid[, count/subType = -1]) doTileAddItemEx(pos, uid) doAddContainerItemEx(uid, virtuid) doRelocate(pos, posTo[, creatures = true[, unmovable = true]]) doCleanTile(pos[, forceMapLoaded = false]) doCreateTeleport(itemid, topos, createpos) doCreateMonster(name, pos[, extend = false[, force = false[, displayError = true]]]) doCreateNpc(name, pos[, displayError = true]) doSummonMonster(cid, name) doConvinceCreature(cid, target) getMonsterTargetList(cid) getMonsterFriendList(cid) doMonsterSetTarget(cid, target) doMonsterChangeTarget(cid) getMonsterInfo(name) doAddCondition(cid, condition) doRemoveCondition(cid, type[, subId]) doRemoveConditions(cid[, onlyPersistent]) doRemoveCreature(cid[, forceLogout = true]) doMoveCreature(cid, direction[, flag = FLAG _NOLIMIT]) doSteerCreature(cid, position) doPlayerSetPzLocked(cid, locked) doPlayerSetTown(cid, townid) doPlayerSetVocation(cid,voc) doPlayerRemoveItem(cid, itemid[, count[, subType = -1]]) doPlayerAddExperience(cid, amount) doPlayerSetGuildId(cid, id) doPlayerSetGuildLevel(cid, level[, rank]) doPlayerSetGuildNick(cid, nick) doPlayerAddOutfit(cid, looktype, addon) doPlayerRemoveOutfit(cid, looktype[, addon = 0]) doPlayerAddOutfitId(cid, outfitId, addon) doPlayerRemoveOutfitId(cid, outfitId[, addon = 0]) canPlayerWearOutfit(cid, looktype[, addon = 0]) canPlayerWearOutfitId(cid, outfitId[, addon = 0]) getCreatureCondition(cid, condition[, subId = 0]) doCreatureSetDropLoot(cid, doDrop) getPlayerLossPercent(cid, lossType) doPlayerSetLossPercent(cid, lossType, newPercent) doPlayerSetLossSkill(cid, doLose) getPlayerLossSkill(cid) doPlayerSwitchSaving(cid) doPlayerSave(cid[, shallow = false]) isPlayerPzLocked(cid) isPlayerSaving(cid) isCreature(cid) isMovable(uid) getCreatureByName(name) getPlayerByGUID(guid) getPlayerByNameWildcard(name~[, ret = false]) getPlayerGUIDByName(name[, multiworld = false]) getPlayerNameByGUID(guid[, multiworld = false[, displayError = true]]) doPlayerChangeName(guid, oldName, newName) registerCreatureEvent(uid, eventName) unregisterCreatureEvent(uid, eventName) getContainerSize(uid) getContainerCap(uid) getContainerItem(uid, slot) doAddContainerItem(uid, itemid[, count/subType = 1]) getHouseInfo(houseId[, displayError = true]) getHouseAccessList(houseid, listId) getHouseByPlayerGUID(playerGUID) getHouseFromPos(pos) setHouseAccessList(houseid, listid, listtext) setHouseOwner(houseId, owner[, clean]) getWorldType() setWorldType(type) getWorldTime() getWorldLight() getWorldCreatures(type) getWorldUpTime() getGuildId(guildName) getGuildMotd(guildId) getPlayerSex(cid[, full = false]) doPlayerSetSex(cid, newSex) createCombatArea({area}[, {extArea}]) createConditionObject(type[, ticks[, buff[, subId]]]) setCombatArea(combat, area) setCombatCondition(combat, condition) setCombatParam(combat, key, value) setConditionParam(condition, key, value) addDamageCondition(condition, rounds, time, value) addOutfitCondition(condition, outfit) setCombatCallBack(combat, key, function_name) setCombatFormula(combat, type, mina, minb, maxa, maxb[, minl, maxl[, minm, maxm[, minc[, maxc]]]]) setConditionFormula(combat, mina, minb, maxa, maxb) doCombat(cid, combat, param) createCombatObject() doCombatAreaHealth(cid, type, pos, area, min, max, effect) doTargetCombatHealth(cid, target, type, min, max, effect) doCombatAreaMana(cid, pos, area, min, max, effect) doTargetCombatMana(cid, target, min, max, effect) doCombatAreaCondition(cid, pos, area, condition, effect) doTargetCombatCondition(cid, target, condition, effect) doCombatAreaDispel(cid, pos, area, type, effect) doTargetCombatDispel(cid, target, type, effect) doChallengeCreature(cid, target) numberToVariant(number) stringToVariant(string) positionToVariant(pos) targetPositionToVariant(pos) variantToNumber(var) variantToString(var) variantToPosition(var) doChangeSpeed(cid, delta) doCreatureChangeOutfit(cid, outfit) doSetMonsterOutfit(cid, name[, time = -1]) doSetItemOutfit(cid, item[, time = -1]) doSetCreatureOutfit(cid, outfit[, time = -1]) getCreatureOutfit(cid) getCreatureLastPosition(cid) getCreatureName(cid) getCreatureSpeed(cid) getCreatureBaseSpeed(cid) getCreatureTarget(cid) isSightClear(fromPos, toPos, floorCheck) isInArray(array, value[, caseSensitive = false]) addEvent(callback, delay, ...) stopEvent(eventid) getPlayersByAccountId(accId) getAccountIdByName(name) getAccountByName(name) getAccountIdByAccount(accName) getAccountByAccountId(accId) getIpByName(name) getPlayersByIp(ip[, mask = 0xFFFFFFFF]) doPlayerPopupFYI(cid, message) doPlayerSendTutorial(cid, id) doPlayerSendMailByName(name, item[, town[, actor]]) doPlayerAddMapMark(cid, pos, type[, description]) doPlayerAddPremiumDays(cid, days) getPlayerPremiumDays(cid) doCreatureSetLookDirection(cid, dir) getCreatureGuildEmblem(cid[, target]) doCreatureSetGuildEmblem(cid, emblem) getCreaturePartyShield(cid[, target]) doCreatureSetPartyShield(cid, shield) getCreatureSkullType(cid[, target]) doCreatureSetSkullType(cid, skull) getPlayerSkullEnd(cid) doPlayerSetSkullEnd(cid, time, type) getPlayerBlessing(cid, blessing) doPlayerAddBlessing(cid, blessing) getPlayerStamina(cid) doPlayerSetStamina(cid, minutes) getPlayerBalance(cid) doPlayerSetBalance(cid, balance) getCreatureNoMove(cid) doCreatureSetNoMove(cid, block) getPlayerIdleTime(cid) doPlayerSetIdleTime(cid, amount) getPlayerLastLoad(cid) getPlayerLastLogin(cid) getPlayerAccountManager(cid) getPlayerTradeState(cid) getPlayerModes(cid) getPlayerRates(cid) doPlayerSetRate(cid, type, value) getPlayerPartner(cid) doPlayerSetPartner(cid, guid) doPlayerFollowCreature(cid, target) getPlayerParty(cid) doPlayerJoinParty(cid, lid) doPlayerLeaveParty(cid[, forced = false]) doPlayerAddMount(cid, mountId) doPlayerRemoveMount(cid, mountId) getPlayerMount(cid, mountId) doPlayerSetMount(cid, mountId) doPlayerSetMountStatus(cid, mounted) getMountInfo([mountId]) getPartyMembers(lid) getCreatureMaster(cid) getCreatureSummons(cid) getTownId(townName) getTownName(townId) getTownTemplePosition(townId) getTownHouses(townId) getSpectators(centerPos, rangex, rangey[, multifloor = false]) getVocationInfo(id) getGroupInfo(id[, premium = false]) getVocationList() getGroupList() getChannelList() getTownList() getWaypointList() getTalkActionList() getExperienceStageList() getItemIdByName(name[, displayError = true]) getItemInfo(itemid) getItemAttribute(uid, key) doItemSetAttribute(uid, key, value) doItemEraseAttribute(uid, key) getItemWeight(uid[, precise = true]) getItemParent(uid) hasItemProperty(uid, prop) hasPlayerClient(cid) isIpBanished(ip[, mask]) isPlayerBanished(name/guid, type) isAccountBanished(accountId[, playerId]) doAddIpBanishment(...) doAddPlayerBanishment(...) doAddAccountBanishment(...) doAddNotation(...) doAddStatement(...) doRemoveIpBanishment(ip[, mask]) doRemovePlayerBanishment(name/guid, type) doRemoveAccountBanishment(accountId[, playerId]) doRemoveNotations(accountId[, playerId]) doRemoveStatements(name/guid[, channelId]) getNotationsCount(accountId[, playerId]) getStatementsCount(name/guid[, channelId]) getBanData(value[, type[, param]]) getBanReason(id) getBanAction(id[, ipBanishment = false]) getBanList(type[, value[, param]]) getExperienceStage(level) getDataDir() getLogsDir() getConfigFile() getConfigValue(key) getModList() getHighscoreString(skillId) getWaypointPosition(name) doWaypointAddTemporial(name, pos) getGameState() doSetGameState(id) doExecuteRaid(name) doCreatureExecuteTalkAction(cid, text[, ignoreAccess = false[, channelId = CHANNEL _DEFAULT]]) doReloadInfo(id[, cid]) doSaveServer([shallow = false]) doCleanHouse(houseId) doCleanMap() doRefreshMap() doGuildAddEnemy(guild, enemy, war, type) doGuildRemoveEnemy(guild, enemy) doUpdateHouseAuctions() loadmodlib(lib) domodlib(lib) dodirectory(dir[, recursively = false])getCreatureHealth(cid) getCreatureMaxHealth(cid[, ignoreModifiers = false]) getCreatureMana(cid) getCreatureMaxMana(cid[, ignoreModifiers = false]) getCreatureHideHealth(cid) doCreatureSetHideHealth(cid, hide) getCreatureSpeakType(cid) doCreatureSetSpeakType(cid, type) getCreatureLookDirection(cid) getPlayerLevel(cid) getPlayerExperience(cid) getPlayerMagLevel(cid[, ignoreModifiers = false]) getPlayerSpentMana(cid) getPlayerFood(cid) getPlayerAccess(cid) getPlayerGhostAccess(cid) getPlayerSkillLevel(cid, skill[, ignoreModifiers = false]) getPlayerSkillTries(cid, skill) getPlayerTown(cid) getPlayerVocation(cid) getPlayerIp(cid) getPlayerRequiredMana(cid, magicLevel) getPlayerRequiredSkillTries(cid, skillId, skillLevel) getPlayerItemCount(cid, itemid[, subType = -1]) getPlayerMoney(cid) getPlayerSoul(cid[, ignoreModifiers = false]) getPlayerFreeCap(cid) getPlayerLight(cid) getPlayerSlotItem(cid, slot) getPlayerWeapon(cid[, ignoreAmmo = false]) getPlayerItemById(cid, deepSearch, itemId[, subType = -1]) getPlayerDepotItems(cid, depotid) getPlayerGuildId(cid) getPlayerGuildName(cid) getPlayerGuildRankId(cid) getPlayerGuildRank(cid) getPlayerGuildNick(cid) getPlayerGuildLevel(cid) getPlayerGUID(cid) getPlayerNameDescription(cid) doPlayerSetNameDescription(cid, desc) getPlayerSpecialDescription(cid) doPlayerSetSpecialDescription(cid, desc) getPlayerAccountId(cid) getPlayerAccount(cid) getPlayerFlagValue(cid, flag) getPlayerCustomFlagValue(cid, flag) getPlayerPromotionLevel(cid) doPlayerSetPromotionLevel(cid, level) getPlayerGroupId(cid) doPlayerSetGroupId(cid, newGroupId) doPlayerSendOutfitWindow(cid) doPlayerLearnInstantSpell(cid, name) doPlayerUnlearnInstantSpell(cid, name) getPlayerLearnedInstantSpell(cid, name) getPlayerInstantSpellCount(cid) getPlayerInstantSpellInfo(cid, index) getInstantSpellInfo(cid, name) getCreatureStorageList(cid) getCreatureStorage(uid, key) doCreatureSetStorage(uid, key, value) getStorageList() getStorage(key) doSetStorage(key, value) getChannelUsers(channelId) getPlayersOnline() getTileInfo(pos) getThingFromPos(pos[, displayError = true]) getThing(uid[, recursive = RECURSE _FIRST]) doTileQueryAdd(uid, pos[, flags[, displayError = true]]) doItemRaidUnref(uid) getThingPosition(uid) getTileItemById(pos, itemId[, subType = -1]) getTileItemByType(pos, type) getTileThingByPos(pos) getTopCreature(pos) doRemoveItem(uid[, count = -1]) doPlayerFeed(cid, food) doPlayerSendCancel(cid, text) doPlayerSendDefaultCancel(cid, ReturnValue) getSearchString(fromPosition, toPosition[, fromIsCreature = false[, toIsCreature = false]]) getClosestFreeTile(cid, targetpos[, extended = false[, ignoreHouse = true]]) doTeleportThing(cid, newpos[, pushmove = true[, fullTeleport = true]]) doTransformItem(uid, newId[, count/subType]) doCreatureSay(uid, text[, type = SPEAK _SAY[, ghost = false[, cid = 0[, pos]]]]) doSendCreatureSquare(cid, color[, player]) doSendMagicEffect(pos, type[, player]) doSendDistanceShoot(fromPos, toPos, type[, player]) doSendAnimatedText(pos, text, color[, player]) doPlayerAddSkillTry(cid, skillid, n[, useMultiplier = true]) doCreatureAddHealth(cid, health[, hitEffect[, hitColor[, force]]]) doCreatureAddMana(cid, mana) setCreatureMaxHealth(cid, health) setCreatureMaxMana(cid, mana) doPlayerSetMaxCapacity(cid, cap) doPlayerAddSpentMana(cid, amount[, useMultiplier = true]) doPlayerAddSoul(cid, amount) doPlayerAddItem(cid, itemid[, count/subtype = 1[, canDropOnMap = true[, slot = 0]]]) doPlayerAddItem(cid, itemid[, count = 1[, canDropOnMap = true[, subtype = 1[, slot = 0]]]]) doPlayerAddItemEx(cid, uid[, canDropOnMap = false[, slot = 0]]) doPlayerSendTextMessage(cid, MessageClasses, message) doPlayerSendChannelMessage(cid, author, message, SpeakClasses, channel) doPlayerSendToChannel(cid, targetId, SpeakClasses, message, channel[, time]) doPlayerOpenChannel(cid, channelId) doPlayerAddMoney(cid, money) doPlayerRemoveMoney(cid, money) doPlayerTransferMoneyTo(cid, target, money) doShowTextDialog(cid, itemid, text) doDecayItem(uid) doCreateItem(itemid[, type/count], pos) doCreateItemEx(itemid[, count/subType = -1]) doTileAddItemEx(pos, uid) doAddContainerItemEx(uid, virtuid) doRelocate(pos, posTo[, creatures = true[, unmovable = true]]) doCleanTile(pos[, forceMapLoaded = false]) doCreateTeleport(itemid, topos, createpos) doCreateMonster(name, pos[, extend = false[, force = false[, displayError = true]]]) doCreateNpc(name, pos[, displayError = true]) doSummonMonster(cid, name) doConvinceCreature(cid, target) getMonsterTargetList(cid) getMonsterFriendList(cid) doMonsterSetTarget(cid, target) doMonsterChangeTarget(cid) getMonsterInfo(name) doAddCondition(cid, condition) doRemoveCondition(cid, type[, subId]) doRemoveConditions(cid[, onlyPersistent]) doRemoveCreature(cid[, forceLogout = true]) doMoveCreature(cid, direction[, flag = FLAG _NOLIMIT]) doSteerCreature(cid, position) doPlayerSetPzLocked(cid, locked) doPlayerSetTown(cid, townid) doPlayerSetVocation(cid,voc) doPlayerRemoveItem(cid, itemid[, count[, subType = -1]]) doPlayerAddExperience(cid, amount) doPlayerSetGuildId(cid, id) doPlayerSetGuildLevel(cid, level[, rank]) doPlayerSetGuildNick(cid, nick) doPlayerAddOutfit(cid, looktype, addon) doPlayerRemoveOutfit(cid, looktype[, addon = 0]) doPlayerAddOutfitId(cid, outfitId, addon) doPlayerRemoveOutfitId(cid, outfitId[, addon = 0]) canPlayerWearOutfit(cid, looktype[, addon = 0]) canPlayerWearOutfitId(cid, outfitId[, addon = 0]) getCreatureCondition(cid, condition[, subId = 0]) doCreatureSetDropLoot(cid, doDrop) getPlayerLossPercent(cid, lossType) doPlayerSetLossPercent(cid, lossType, newPercent) doPlayerSetLossSkill(cid, doLose) getPlayerLossSkill(cid) doPlayerSwitchSaving(cid) doPlayerSave(cid[, shallow = false]) isPlayerPzLocked(cid) isPlayerSaving(cid) isCreature(cid) isMovable(uid) getCreatureByName(name) getPlayerByGUID(guid) getPlayerByNameWildcard(name~[, ret = false]) getPlayerGUIDByName(name[, multiworld = false]) getPlayerNameByGUID(guid[, multiworld = false[, displayError = true]]) doPlayerChangeName(guid, oldName, newName) registerCreatureEvent(uid, eventName) unregisterCreatureEvent(uid, eventName) getContainerSize(uid) getContainerCap(uid) getContainerItem(uid, slot) doAddContainerItem(uid, itemid[, count/subType = 1]) getHouseInfo(houseId[, displayError = true]) getHouseAccessList(houseid, listId) getHouseByPlayerGUID(playerGUID) getHouseFromPos(pos) setHouseAccessList(houseid, listid, listtext) setHouseOwner(houseId, owner[, clean]) getWorldType() setWorldType(type) getWorldTime() getWorldLight() getWorldCreatures(type) getWorldUpTime() getGuildId(guildName) getGuildMotd(guildId) getPlayerSex(cid[, full = false]) doPlayerSetSex(cid, newSex) createCombatArea({area}[, {extArea}]) createConditionObject(type[, ticks[, buff[, subId]]]) setCombatArea(combat, area) setCombatCondition(combat, condition) setCombatParam(combat, key, value) setConditionParam(condition, key, value) addDamageCondition(condition, rounds, time, value) addOutfitCondition(condition, outfit) setCombatCallBack(combat, key, function_name) setCombatFormula(combat, type, mina, minb, maxa, maxb[, minl, maxl[, minm, maxm[, minc[, maxc]]]]) setConditionFormula(combat, mina, minb, maxa, maxb) doCombat(cid, combat, param) createCombatObject() doCombatAreaHealth(cid, type, pos, area, min, max, effect) doTargetCombatHealth(cid, target, type, min, max, effect) doCombatAreaMana(cid, pos, area, min, max, effect) doTargetCombatMana(cid, target, min, max, effect) doCombatAreaCondition(cid, pos, area, condition, effect) doTargetCombatCondition(cid, target, condition, effect) doCombatAreaDispel(cid, pos, area, type, effect) doTargetCombatDispel(cid, target, type, effect) doChallengeCreature(cid, target) numberToVariant(number) stringToVariant(string) positionToVariant(pos) targetPositionToVariant(pos) variantToNumber(var) variantToString(var) variantToPosition(var) doChangeSpeed(cid, delta) doCreatureChangeOutfit(cid, outfit) doSetMonsterOutfit(cid, name[, time = -1]) doSetItemOutfit(cid, item[, time = -1]) doSetCreatureOutfit(cid, outfit[, time = -1]) getCreatureOutfit(cid) getCreatureLastPosition(cid) getCreatureName(cid) getCreatureSpeed(cid) getCreatureBaseSpeed(cid) getCreatureTarget(cid) isSightClear(fromPos, toPos, floorCheck) isInArray(array, value[, caseSensitive = false]) addEvent(callback, delay, ...) stopEvent(eventid) getPlayersByAccountId(accId) getAccountIdByName(name) getAccountByName(name) getAccountIdByAccount(accName) getAccountByAccountId(accId) getIpByName(name) getPlayersByIp(ip[, mask = 0xFFFFFFFF]) doPlayerPopupFYI(cid, message) doPlayerSendTutorial(cid, id) doPlayerSendMailByName(name, item[, town[, actor]]) doPlayerAddMapMark(cid, pos, type[, description]) doPlayerAddPremiumDays(cid, days) getPlayerPremiumDays(cid) doCreatureSetLookDirection(cid, dir) getCreatureGuildEmblem(cid[, target]) doCreatureSetGuildEmblem(cid, emblem) getCreaturePartyShield(cid[, target]) doCreatureSetPartyShield(cid, shield) getCreatureSkullType(cid[, target]) doCreatureSetSkullType(cid, skull) getPlayerSkullEnd(cid) doPlayerSetSkullEnd(cid, time, type) getPlayerBlessing(cid, blessing) doPlayerAddBlessing(cid, blessing) getPlayerStamina(cid) doPlayerSetStamina(cid, minutes) getPlayerBalance(cid) doPlayerSetBalance(cid, balance) getCreatureNoMove(cid) doCreatureSetNoMove(cid, block) getPlayerIdleTime(cid) doPlayerSetIdleTime(cid, amount) getPlayerLastLoad(cid) getPlayerLastLogin(cid) getPlayerAccountManager(cid) getPlayerTradeState(cid) getPlayerModes(cid) getPlayerRates(cid) doPlayerSetRate(cid, type, value) getPlayerPartner(cid) doPlayerSetPartner(cid, guid) doPlayerFollowCreature(cid, target) getPlayerParty(cid) doPlayerJoinParty(cid, lid) doPlayerLeaveParty(cid[, forced = false]) doPlayerAddMount(cid, mountId) doPlayerRemoveMount(cid, mountId) getPlayerMount(cid, mountId) doPlayerSetMount(cid, mountId) doPlayerSetMountStatus(cid, mounted) getMountInfo([mountId]) getPartyMembers(lid) getCreatureMaster(cid) getCreatureSummons(cid) getTownId(townName) getTownName(townId) getTownTemplePosition(townId) getTownHouses(townId) getSpectators(centerPos, rangex, rangey[, multifloor = false]) getVocationInfo(id) getGroupInfo(id[, premium = false]) getVocationList() getGroupList() getChannelList() getTownList() getWaypointList() getTalkActionList() getExperienceStageList() getItemIdByName(name[, displayError = true]) getItemInfo(itemid) getItemAttribute(uid, key) doItemSetAttribute(uid, key, value) doItemEraseAttribute(uid, key) getItemWeight(uid[, precise = true]) getItemParent(uid) hasItemProperty(uid, prop) hasPlayerClient(cid) isIpBanished(ip[, mask]) isPlayerBanished(name/guid, type) isAccountBanished(accountId[, playerId]) doAddIpBanishment(...) doAddPlayerBanishment(...) doAddAccountBanishment(...) doAddNotation(...) doAddStatement(...) doRemoveIpBanishment(ip[, mask]) doRemovePlayerBanishment(name/guid, type) doRemoveAccountBanishment(accountId[, playerId]) doRemoveNotations(accountId[, playerId]) doRemoveStatements(name/guid[, channelId]) getNotationsCount(accountId[, playerId]) getStatementsCount(name/guid[, channelId]) getBanData(value[, type[, param]]) getBanReason(id) getBanAction(id[, ipBanishment = false]) getBanList(type[, value[, param]]) getExperienceStage(level) getDataDir() getLogsDir() getConfigFile() getConfigValue(key) getModList() getHighscoreString(skillId) getWaypointPosition(name) doWaypointAddTemporial(name, pos) getGameState() doSetGameState(id) doExecuteRaid(name) doCreatureExecuteTalkAction(cid, text[, ignoreAccess = false[, channelId = CHANNEL _DEFAULT]]) doReloadInfo(id[, cid]) doSaveServer([shallow = false]) doCleanHouse(houseId) doCleanMap() doRefreshMap() doGuildAddEnemy(guild, enemy, war, type) doGuildRemoveEnemy(guild, enemy) doUpdateHouseAuctions() loadmodlib(lib) domodlib(lib) dodirectory(dir[, recursively = false]) Lua made functions - Funções feitas em lua (data/lib) doPlayerGiveItem(cid, itemid, amount, subType) doPlayerGiveItemContainer(cid, containerid, itemid, amount, subType) doPlayerTakeItem(cid, itemid, amount) doPlayerBuyItem(cid, itemid, count, cost, charges) doPlayerBuyItemContainer(cid, containerid, itemid, count, cost, charges) doPlayerSellItem(cid, itemid, count, cost) doPlayerWithdrawMoney(cid, amount) doPlayerDepositMoney(cid, amount) doPlayerAddStamina(cid, minutes) isPremium(cid) getMonthDayEnding(day) getMonthString(m) getArticle(str) isNumeric(str) doNumberFormat(i) doPlayerAddAddons(cid, addon) doPlayerWithdrawAllMoney(cid) doPlayerDepositAllMoney(cid) doPlayerTransferAllMoneyTo(cid, target) playerExists(name) getTibiaTime() doWriteLogFile(file, text) getExperienceForLevel(lv) doMutePlayer(cid, time) getPlayerGroupName(cid) getPlayerVocationName(cid) getPromotedVocation(vid) doPlayerRemovePremiumDays(cid, days) getPlayerMasterPos(cid) getHouseOwner(houseId) getHouseName(houseId) getHouseEntry(houseId) getHouseRent(houseId) getHousePrice(houseId) getHouseTown(houseId) getHouseDoorsCount(houseId) getHouseBedsCount(houseId) getHouseTilesCount(houseId) getItemNameById(itemid) getItemPluralNameById(itemid) getItemArticleById(itemid) getItemName(uid) getItemPluralName(uid) getItemArticle(uid) getItemText(uid) getItemSpecialDescription(uid) getItemWriter(uid) getItemDate(uid) getTilePzInfo(pos) getTileZoneInfo(pos) doShutdown() doSummonCreature(name, pos, displayError) getOnlinePlayers() getPlayerByName(name) isPlayer(cid) isPlayerGhost(cid) isMonster(cid) isNpc(cid) doPlayerSetExperienceRate(cid, value) doPlayerSetMagicRate(cid, value) doPlayerAddLevel(cid, amount, round) doPlayerAddMagLevel(cid, amount) doPlayerAddSkill(cid, skill, amount, round) getPartyLeader(cid) isInParty(cid) isPrivateChannel(channelId) doPlayerResetIdleTime(cid) doBroadcastMessage(text, class) doPlayerBroadcastMessage(cid, text, class, checkFlag, ghost) getBooleanFromString(input) doCopyItem(item, attributes) doRemoveThing(uid) setAttackFormula(combat, type, minl, maxl, minm, maxm, min, max) setHealingFormula(combat, type, minl, maxl, minm, maxm, min, max) doChangeTypeItem(uid, subtype) doSetItemText(uid, text, writer, date) doItemSetActionId(uid, aid) getFluidSourceType(itemid) getDepotId(uid) getItemDescriptions(uid) getItemWeightById(itemid, count, precision) getItemWeaponType(uid) getItemRWInfo(uid) getItemLevelDoor(itemid) isContainer(uid) isItemStackable(itemid) isItemRune(itemid) isItemDoor(itemid) isItemContainer(itemid) isItemFluidContainer(itemid) isItemMovable(itemid) isCorpse(uid) getContainerCapById(itemid) getMonsterAttackSpells(name) getMonsterHealingSpells(name) getMonsterLootList(name) getMonsterSummonList(name) choose(...) exhaustion.check(cid, storage) exhaustion.get(cid, storage) exhaustion.set(cid, storage, time) exhaustion.make(cid, storage, time) doConvertIntegerToIp(int, mask) doConvertIpToInteger(str) doRevertIp(str) isInRange(position, fromPosition, toPosition) getDistanceBetween(fromPosition, toPosition) getDirectionTo(pos1, pos2) getCreatureLookPosition(cid) getPositionByDirection(position, direction, size) doComparePositions(position, positionEx) getArea(position, x, y) Position(x, y, z, stackpos) isValidPosition(position) isSorcerer(cid) isDruid(cid) isPaladin(cid) isKnight(cid) isRookie(cid) string.split(str) string.trim(str) string.explode(str, sep, limit) string.expand(str) string.timediff(diff) Compats (data/lib/100-compat.lua) doSetCreatureDropLoot = doCreatureSetDropLoot doPlayerSay = doCreatureSay doPlayerAddMana = doCreatureAddMana playerLearnInstantSpell = doPlayerLearnInstantSpell doPlayerRemOutfit = doPlayerRemoveOutfit pay = doPlayerRemoveMoney broadcastMessage = doBroadcastMessage getPlayerName = getCreatureName getCreaturePosition = getThingPosition getPlayerPosition = getCreaturePosition getCreaturePos = getCreaturePosition creatureGetPosition = getCreaturePosition getPlayerMana = getCreatureMana getPlayerMaxMana = getCreatureMaxMana hasCondition = hasCreatureCondition getCreatureCondition = hasCreatureCondition isMoveable = isMovable isItemMoveable = isItemMovable saveData = saveServer savePlayers = saveServer getPlayerSkill = getPlayerSkillLevel getPlayerSkullType = getCreatureSkullType getCreatureSkull = getCreatureSkullType getAccountNumberByName = getAccountIdByName getIPByName = getIpByName getPlayersByIP = getPlayersByIp getThingFromPos = getThingFromPosition getThingfromPos = getThingFromPos getHouseFromPos = getHouseFromPosition getPlayersByAccountNumber = getPlayersByAccountId getIPByPlayerName = getIpByName getPlayersByIPNumber = getPlayersByIp getAccountNumberByPlayerName = getAccountIdByName convertIntToIP = doConvertIntegerToIp convertIPToInt = doConvertIpToInteger queryTileAddThing = doTileQueryAdd getTileHouseInfo = getHouseFromPos executeRaid = doExecuteRaid saveServer = doSaveServer cleanHouse = doCleanHouse cleanMap = doCleanMap shutdown = doShutdown mayNotMove = doCreatureSetNoMove getTileItemsByType = getTileItemByType doPlayerSetNoMove = doCreatureSetNoMove getPlayerNoMove = getCreatureNoMove getConfigInfo = getConfigValue doPlayerAddExp = doPlayerAddExperience isInArea = isInRange doPlayerSetSkillRate = doPlayerSetRate getCreatureLookDir = getCreatureLookDirection getPlayerLookDir = getCreatureLookDirection getPlayerLookDirection = getCreatureLookDirection doCreatureSetLookDir = doCreatureSetLookDirection getPlayerLookPos = getCreatureLookPosition setPlayerStamina = doPlayerSetStamina setPlayerPromotionLevel = doPlayerSetPromotionLevel setPlayerGroupId = doPlayerSetGroupId setPlayerPartner = doPlayerSetPartner doPlayerSetStorageValue = doCreatureSetStorage setPlayerStorageValue = doPlayerSetStorageValue getPlayerStorageValue = getCreatureStorage getGlobalStorageValue = getStorage setGlobalStorageValue = doSetStorage getPlayerMount = canPlayerRideMount setPlayerBalance = doPlayerSetBalance doAddMapMark = doPlayerAddMapMark doSendTutorial = doPlayerSendTutorial getWaypointsList = getWaypointList getPlayerLastLoginSaved = getPlayerLastLogin getThingPos = getThingPosition doAreaCombatHealth = doCombatAreaHealth doAreaCombatMana = doCombatAreaMana doAreaCombatCondition = doCombatAreaCondition doAreaCombatDispel = doCombatAreaDispel getItemDescriptionsById = getItemInfo hasProperty = hasItemProperty hasClient = hasPlayerClient print = std.cout getPosByDir = getPositionByDirection isNumber = isNumeric doSetItemActionId = doItemSetActionId getOnlinePlayers = getPlayersOnlineEx addDialog = doPlayerAddDialog doSendPlayerExtendedOpcode = doPlayerSendExtendedOpcode Créditos: Zonnebloem
  8. Palavras e caracteres reservados Link da aula anterior, caso não tenha lido. Palavras reservadas que será usado nessa aula: if, else, elseif, then, end, and, or, not Estrutura de controle (if) O if serve para criar uma condição; ele está precedido de outra palavra que finaliza a condição, que se chama “then”, e também de outra palavra para fechar o if, que se chama “end”. Caso a condição seja verdadeira, o bloco criado por if será executado, caso não seja verdadeira, ele passa para a próxima instrução. Exemplo: if (condição) then -- caso a condição seja verdadeira, executa as instruções abaixo. print(“condição verdadeira”) return true end -- finaliza o if. E se precisarmos de mais condições? Podemos usar dentro do if a palavra “and” que diz ao sistema que há mais condições para ser analisadas. if (condição) and (condição) then -- abertura do bloco. print(“as duas condições são verdadeiras”) -- evento dentro do bloco criado por then. end -- finaliza o if. Podemos também usar a palavra “or” que diz ao sistema que caso uma condição não seja verdadeira, ele tem que verificar se a próxima condição é verdadeira. if (condição) or (condição) then -- abertura do bloco. print(“uma, ou as duas condições é, são verdadeira\’s”) – evento dentro do bloco criado por then. end -- finaliza o if. O “elseif” faz a mesma coisa do “if”, ele cria uma nova condição e um novo bloco, e nela, podemos inserir instruções distintas para cada ocasião. valordaconta = 100 if valordaconta > 100 then print(“não temos essa quantia”) elseif valordaconta <= 100 and valordaconta > 0 then print(“pague a conta”) elseif valordaconta <= 0 then print(“conta não tem valor, portanto não precisa paga-la”) end -- fecha o if. Não é necessário fechar os elseif’s, pois eles fazem parte do if. Existe outra palavra reservada que ajuda muito quando determinamos diversas condições, mas não são validas; O “else” é a ultima possibilidade de se criar um bloco de instruções caso nenhuma condição anterior seja valida. cor = “azul” if cor == “vermelha” then print(“sinal de pare”) elseif cor == “amarela” then print(“sinal de atenção”) elseif cor == “verde” then print(“sinal de liberado”) else -- executa o bloco, desde que as demais condições acima não sejam validas. print(“cor desconhecida”) end A palavra reservado “not” serve para inverte o valor da condição; caso a condição seja verdadeira, ao usar a palavra not, ela se torna falsa e assim vice-versa. if not 1+1 ~= 2 then -- 1+1 não é diferente de 2, portanto é uma condição falsa. print(“mesmo 1+1 não sendo diferente de 2, esse bloco foi executado porquê a palavra \“not\” inverteu o valor da condição de \“false\” para \”true\”.”) end Agora no código que vocês criaram nas aulas anteriores, acrescentem estruturas de controles com condições a eles. Inté a próxima aula.
  9. Palavras e caracteres reservados Essa é a primeira aula do modulo palavras e caracteres reservados. Link da aula anterior, caso tu não tenha lido. Para que todo programa funcione, ele tem que ter algumas palavras e caracteres reservados para saber o que o código quer que faça. Eu vou me ater na linguagem de programação lua que é a mais usada em otserver e é o proposito de nosso estudo. Vou deixar escrito aqui algumas palavras e caracteres, e darei uma breve explicação sobre cada uma: < <= > >= == ~= true false nil ‘’ “” [[ ]] nil não tem valor algum, ele simplesmente é declarado como nulo, ou seja, algo que não existe. true é um boolean para a condição verdadeira. Se algo é verdade, ele é representado por “true”. false é um boolean para a condição falsa. Se algo é falso, ele é representado por “false”. Como se cria uma condição? De diversos modos. Um deles é comparando algo com outro algo. Alguns exemplos de operadores lógicos que podem ser usados. Caracteres lógicos < menor que: 10 < 100 | 10 é menor que 100, logo é uma condição true. <= menor ou igual: 10 <= 10 | 10 é igual a 10, logo é uma condição true. > maior que: 10 > 100 | 10 não é maior que 100, logo é uma condição false. >= maior ou igual: 10 >= 100 | 10 não é maior e nem igual a 100, logo é uma condição false. ~= diferente: 10 ~= 100 | 10 é diferente de 100, logo é uma condição true. == igualdade: 10 == 100 | 10 não é igual a 100, logo é uma condição false. Caracteres matemáticos + sinal de adição 1+1 = 2 - sinal de subtração 1-1 = 0 * sinal de multiplicação 2*2 = 4 / sinal de divisão 2/2 = 1 ^ sinal de potenciação 2^3 = 8 % isso não é sinal de porcentagem e sim um modulo. A função de tal módulo é tentar chegar ao valor 0 (zero) do numero declarado, seja ele positivo ou negativo. Ele retorna o valor restante ou 0 (zero). Strings Vamos tratar sobre os métodos mais comuns de criação de cadeia de caracteres conhecido como strings. Uma string é uma cadeia de caracteres delimitada por aspas simples (‘ ‘) ou aspas duplas (“ ”) das quais operam em apenas uma linha; já o sistema de cadeia de caracteres usando colchetes duplos ([[ ]]) pode aceitar formatação sem uso de caracteres de escape além de não validar as ações dos mesmo usando colchetes. Alguns caracteres de escape: caractere função caractere função \n Quebra de linha. \r Demarca o ponto de retorno da string. \t Tabulação horizontal. \\ O próprio caractere \ \v Tabulação vertical. \’ Quote simples. \” Quote duplo. “esse é um texto em uma string com aspas duplas” ‘esse é um texto em uma string com aspas simples’ [[ esse é um texto em uma string com colchetes duplos ]] A diferença entre as aspas simples e duplas para os colchetes é que os colchetes aceitam formatação, já nas aspas só poderá se fazer do uso de formatação com a utilização de caracteres de escape: “quebra de texto\n agora uma tabulação\t \’um texto em quote\’.” Exemplos: Uma string de caractere usando aspas simples, sem caracteres de escape: ‘isso é uma string de caracteres sem formatação’ Agora o mesmo exemplo só que com o uso de caracteres de escape: ‘isso é\numa \’string\’ de caracteres\n\t com formatação’ Se fosse impressa essa string, ela ficaria dessa forma: isso é uma ‘string’ de caracteres com formatação O mesmo se vale para a cadeia de caracteres com aspas duplas: “isso é\ruma \”string\” de caracteres\n\tcom formatação.” Caso fosse impressa, ficaria dessa forma: isso é uma “string” de caracteres com formatação. Agora no caso do uso da cadeia de caractere com colchetes duplos, esses caracteres de escape ficam inválidos e serão impressos como sendo meros caracteres de string. O uso do colchete duplo serve para que se possa criar uma formatação sem o uso dos caracteres de escape. Abre-se a cadeia usando os colchetes duplos [[ e finalizando com colchetes duplos invertidos ]]; também é valido o uso do caractere de atribuição para que também os colchetes duplos sejam ignorados. Alguns exemplos de uso: [[ Isso é uma\n string \tNa qual os caracteres \r de escape são ignorados \rFormatada ]] Se fosse impresso essa string, ela ficaria assim: Isso é uma\n string \tNa qual os caracteres \r de escape são ignorados \rFormatada Agora o mesmo exemplo ignorando os colchetes duplos: [=[ Isso é uma string. [[ isso é uma string com colchetes duplos dentro de uma string com colchetes duplos ]] Fim da string ]=] Caso fosse impresso tal string, ficaria assim: Isso é uma string. [[ isso é uma string com colchetes duplos dentro de uma string com colchetes duplos ]] Fim da string O processo de uso do caractere de atribuição para ignorar os colchetes, também é valido para ignorar eles mesmo usando uma maior sequencia de caracteres de atribuição. Exemplo: [==[ String de colchetes duplos com duplos caracteres de atribuição. [=[ String de colchetes duplos com um caractere de atribuição. ]=] Fim da string primaria. ]==] Se fosse impresso tal, seria: String de colchetes duplos com duplos caracteres de atribuição. [=[ String de colchetes duplos com um caractere de atribuição. ]=] Fim da string primaria. Podemos também concatenar (unir) strings para que se tornem uma só string usando o caractere de ponto final duas vezes seguidas. "oi "..'mundo '..[[ da... Lua!!! ]] Se fosse impresso, ficaria assim: oi mundo da... Lua!!! Criem condições e insiram textos ao código criado por vocês nas aulas passadas. Inté a próxima aula.
  10. Logica de Programação Eu sei que vocês estão cansados de saber disso, mas se faz muito necessário que tenham isso em mente. Para se criar um programa de computador, tem que imaginar como será o programa, qual o objetivo do mesmo, O que é necessário para que ele funcione, Quais são os passos que terei que dar para fazê-lo... São perguntas que tem que ser feitas e postas para podermos traçar um caminho que nos leve ao objetivo do programa. Vamos entender um pouco sobre cada passo necessário para a criação de um programa. LOGICA DE PROGRAMAÇÃO: Logica de programação é a técnica de encadear pensamentos para atingir determinado objetivo. Em outras palavras, tu tens que pensar em como a coisa vai ter que funcionar; O que é preciso para que ele funcione; qual é o proposito dele. Exemplo: Um carro caiu em um barranco; qual seria a melhor maneira de prestar socorro aos ocupantes do veiculo? Retirar o veiculo? Com cordas? Não! com cabo de aço; puxando ou içando-o? Enviando uma equipe para lá? São perguntas necessárias para se desenvolver a melhor maneira de resolver o problema; é nesse sentido que tem que pensar em logica de programação. SEQUÊNCIA LOGICA: Sequência logica são os passos executados até atingir um objetivo ou solução de um problema. Os eventos seguem uma logica na qual um fator depende do outro. Não posso fazer um ovo mexido sem antes quebrar o ovo; primeiro quebra o ovo, põe na frigideira ao fogo com óleo, depois mexe; Pronto, saiu um ovo mexido. INSTRUÇÕES. Instruções é um conjunto de regras ou normas definidas para a realização ou emprego de algo. Em informática, é o que indica a um computador uma ação elementar a executar. Dando um exemplo hipotético para descrever o que seja instruções: Ir à padaria; saia pela rua x vá em frente, vire a direita na venda do seu zé, ande por 200 metros e a sua esquerda estará a padaria. Todos estes conceitos podem ser descritos como um algoritmo, que devem ser seguidas para se cumprir uma determinada tarefa. ALGORITMO: Um algoritmo é formalmente uma sequencia finita de passos que levam a execução de uma tarefa. Podemos pensar em algoritmo como uma receita, uma sequencia de instruções que dão cabo de uma meta especifica. Estas tarefas não podem ser redundantes nem subjetivas na sua definição, devem ser claras e precisas. PROGRAMA: Programa é uma sequência, uma lista na qual fica marcado todos os eventos do que se deve fazer. Em outras palavras... Se tu queres fazer algo, tu deve seguir uma lista de afazeres para que esse algo seja feito. Vamos criar uma lista de um evento hipotético: >> Vá à lanchonete. >> Peça um Xburger. >> Pague. >> Volte para casa. As instruções são claras: ir a uma lanchonete comprar um lanche especifico e voltar pra casa. Mas por trás existe uma serie de algoritmos, instruções, sequência e lógica de programação que são necessários para executar esse programa. Descrevo aqui passo a passo como eu faço quando estou a desenvolver um código de programa: Passo 1: Idealizar o código. Por em minha mente o funcionamento dele por completo. Passo2: Dividir o código idealizado em partes; partes essa que se divide em requisitos e eventos. Passo 3: Traçar a melhor metodologia para confecção do script. Vamos a um exemplo hipotético de criação de código. Vamos criar um script para uma quest hipotética. Primeiro vamos idealizar como seria essa quest: O jogador terá que entrar em uma sala e enfrentar um monstro sozinho. Opa, aparti daí nós já temos um requisito que seria impedir de outros entrarem na sala. Esse requisito já vai para o passo dois no bloco de requisitos. Pode haver outros requisitos à medida que vamos idealizando como seria tal quest. Agora vamos imaginar os eventos que ocorrerão nessa quest: Se já tiver alguém na sala, então impede dele entrar na sala e envia uma mensagem. Não pode sair da sala. Tem tempo para terminar a sala. E etc... Então chegamos a esse resultado: Requisitos [ir sozinho a sala; ter level 100 ou mais; ser um druid, ...] Eventos [impedir múltiplos jogadores na sala, impedir dele sair da sala, retira-lo da sala após 10 minutos, ...] Agora tu escreves o código usando uma linguagem de programação, como lua que é o foco do nosso estudo, e cria o código para tal quest ou outra coisa que seja teu foco. Tarefa: Escrevam os eventos de um programa hipotético na qual o objetivo seja construir algo. Inté a próxima aula e bons estudos.
  11. Hail Xtibianos. Eu fiz esse sistema como pedido de um membro há um bom tempo, mas nunca tinha postado ele e diversos sistemas que uso no meu ot server; agora resolvi postá-los. Esse é o sistema que impede dos players da mesma party se atacarem ou, também dos membros da mesma guild. Em config.lua adicione: noDamageToGuildMates = false noDamageToPartyMembers = true Em creaturescripts.xml adicione: <event type="combat" name="combat" script="combat.lua"/> Em creaturescripts/scripts/login.lua adicione: registerCreatureEvent(cid, "combat") Na mesma pasta, crie um arquivo lua chamado combat e adicione isso nele: --[[> Marcryzius <]]--function onCombat(cid, target) if(isPlayer(cid) and isPlayer(target)) then if(getConfigValue("noDamageToGuildMates") and getPlayerGuildId(cid) > 0 and getPlayerGuildId(cid) == getPlayerGuildId(target)) then return false elseif(getConfigValue("noDamageToPartyMembers") and isInParty(target) and getPartyLeader(target) == getPartyLeader(cid)) then return false end end return trueend Qualquer duvida ou erro deixe nos comentários.
  12. Hail Xtibianos. Eu criei esse sistema, não lembro se foi a pedido de um membro ou não, para que seja interessante sempre matar o toplvl do otserver devido ao premio recebido por isso. Em config.lua adicione: huntedTopLevel = 100 -- "false" inibe o sistema; numero é o level minimo necessario para dar hunted ao toplvl.priceForEachLevelTohuntedTopLevel = 100 -- preço pago por cada lvl do toplvl ao mata-lo. Em creaturescripts.xml adicione: <event type="death" name="toplvl" script="toplvl.lua"/> Em creaturescripts/scripts/config.lua adicione: registerCreatureEvent(cid, "toplvl") Na mesma pasta, crie um arquivo lua com o nome toplvl e adicione: function onDeath(cid, corpse, deathList)local top,price = getConfigInfo("huntedTopLevel"),getConfigInfo("priceForEachLevelTohuntedTopLevel") if(isPlayer(cid))then -- hunted top level local _,level = getTopLevel() if(tonumber(level) and top and tonumber(level) >= top and tonumber(level) <= getPlayerLevel(cid))then for _,player in pairs(deathList) do if(isPlayer(player))then doPlayerAddMoney(player, getPlayerLevel(cid)*price) end end end end return trueend Agora abra o arquivo lib/050-functions.lua e adicione: function getTopLevel() --[[( Marcryzius )]]--local target,name,level = db.getResult("SELECT `name`, `level` FROM `players` WHERE `group_id` <= 2 ORDER BY 'level' DESC;"),"",0 if(target:getID() ~= -1) then repeat local glevel = target:getDataInt("level") if(level < glevel)then name,level = target:getDataString("name"), glevel end until not(target:next()) end target:free() return name,levelend No config.lua tu coloca o valor minimo requerido do toplvl para poder ser caçado. Duvidas, erros e qualquer outra coisa, deixe nos comentários.
  13. Bom, vou ser o mais direto possível: Estou tentando adicionar um novo slot no servidor, de versão 8.54 e TFS 0.4, mudei nas sources e já as compilei com sucesso, segue abaixo no spoiler as alterações feitas na mesma: items.h #define ITEMS 13000 #define SLOTP_WHEREEVER 0xFFFFFFFF #define SLOTP_HEAD 1 << 0 #define SLOTP_NECKLACE 1 << 1 #define SLOTP_BACKPACK 1 << 2 #define SLOTP_ARMOR 1 << 3 #define SLOTP_RIGHT 1 << 4 #define SLOTP_LEFT 1 << 5 #define SLOTP_LEGS 1 << 6 #define SLOTP_FEET 1 << 7 #define SLOTP_RING 1 << 8 #define SLOTP_AMMO 1 << 9 #define SLOTP_DEPOT 1 << 10 #define SLOTP_TWO_HAND 1 << 11 #define SLOTP_EYE 1 << 15 #define SLOTP_HAND SLOTP_LEFT | SLOTP_RIGHT items.cpp else if(tmpStrValue == "eye") { it.slotPosition |= SLOTP_EYE; it.wieldPosition = SLOT_EYE; } movement.cpp else if(tmpStrValue == "eye") slot = SLOTP_EYE; case SLOT_EYE: slotp = SLOTP_EYE; break; player.cpp if((item->getSlotPosition() & SLOTP_HEAD) || (item->getSlotPosition() & SLOTP_NECKLACE) || (item->getSlotPosition() & SLOTP_BACKPACK) || (item->getSlotPosition() & SLOTP_ARMOR) || (item->getSlotPosition() & SLOTP_LEGS) || (item->getSlotPosition() & SLOTP_FEET) || (item->getSlotPosition() & SLOTP_RING) || (item->getSlotPosition() & SLOTP_EYE)) ret = RET_CANNOTBEDRESSED; case SLOT_EYE: if(item->getSlotPosition() & SLOTP_EYE) ret = RET_NOERROR; break; creature.h enum slots_t { SLOT_PRE_FIRST = 0, SLOT_WHEREEVER = SLOT_PRE_FIRST, SLOT_FIRST = 1, SLOT_HEAD = SLOT_FIRST, SLOT_NECKLACE = 2, SLOT_BACKPACK = 3, SLOT_ARMOR = 4, SLOT_RIGHT = 5, SLOT_LEFT = 6, SLOT_LEGS = 7, SLOT_FEET = 8, SLOT_RING = 9, SLOT_AMMO = 10, SLOT_DEPOT = 11, SLOT_LAST = SLOT_DEPOT, SLOT_HAND = 12, SLOT_EYE = 15, SLOT_TWO_HAND = SLOT_HAND }; enums.h enum ConditionId_t { CONDITIONID_DEFAULT = -1, CONDITIONID_COMBAT = 0, CONDITIONID_HEAD, CONDITIONID_NECKLACE, CONDITIONID_BACKPACK, CONDITIONID_ARMOR, CONDITIONID_RIGHT, CONDITIONID_LEFT, CONDITIONID_LEGS, CONDITIONID_FEET, CONDITIONID_RING, CONDITIONID_EYE, CONDITIONID_AMMO, CONDITIONID_OUTFIT }; Após as sources, o único local em que encontrei nos scripts em lua, foi no 'data/lib/000-constant.lua' e deixei assim: CONST_SLOT_FIRST = 1 CONST_SLOT_HEAD = CONST_SLOT_FIRST CONST_SLOT_NECKLACE = 2 CONST_SLOT_BACKPACK = 3 CONST_SLOT_ARMOR = 4 CONST_SLOT_RIGHT = 5 CONST_SLOT_LEFT = 6 CONST_SLOT_LEGS = 7 CONST_SLOT_FEET = 8 CONST_SLOT_RING = 9 CONST_SLOT_AMMO = 10 CONST_SLOT_EYE = 15 CONST_SLOT_LAST = CONST_SLOT_AMMO Deixei um item no 'data/items/items.xml' com o slotType="eye" que foi criado, e fiz as seguintes alterações no OTClient: modules/game_inventory/inventory.lua InventorySlotStyles = { [InventorySlotHead] = "HeadSlot", [InventorySlotNeck] = "NeckSlot", [InventorySlotBack] = "BackSlot", [InventorySlotBody] = "BodySlot", [InventorySlotRight] = "RightSlot", [InventorySlotLeft] = "LeftSlot", [InventorySlotLeg] = "LegSlot", [InventorySlotFeet] = "FeetSlot", [InventorySlotFinger] = "FingerSlot", [InventorySlotAmmo] = "AmmoSlot", [InventorySlotEye] = "EyeSlot" } modules/game_inventory/inventory.otui EyeSlot < InventoryItem id: slot15 image-source: /images/game/slots/eye &position: {x=65535, y=14, z=0} e MiniWindow id: inventoryWindow !text: tr('Inventory') icon: /images/topbuttons/inventory height: 175 @onClose: modules.game_inventory.onMiniWindowClose() &save: true MiniWindowContents HeadSlot anchors.top: parent.top anchors.horizontalCenter: parent.horizontalCenter margin-top: 3 BodySlot anchors.top: prev.bottom anchors.horizontalCenter: prev.horizontalCenter margin-top: 3 LegSlot anchors.top: prev.bottom anchors.horizontalCenter: prev.horizontalCenter margin-top: 3 FeetSlot anchors.top: prev.bottom anchors.horizontalCenter: prev.horizontalCenter margin-top: 3 NeckSlot anchors.top: slot1.top anchors.right: slot1.left margin-top: 10 margin-right: 5 LeftSlot anchors.top: prev.bottom anchors.horizontalCenter: prev.horizontalCenter margin-top: 3 FingerSlot anchors.top: prev.bottom anchors.horizontalCenter: prev.horizontalCenter margin-top: 3 BackSlot anchors.top: slot1.top anchors.left: slot1.right margin-top: 10 margin-left: 5 RightSlot anchors.top: prev.bottom anchors.horizontalCenter: prev.horizontalCenter margin-top: 3 AmmoSlot anchors.top: prev.bottom anchors.horizontalCenter: prev.horizontalCenter margin-top: 3 EyeSlot anchors.top: prev.bottom anchors.horizontalCenter: prev.horizontalCenter margin-top: 3 PurseButton margin-top: 3 anchors.top: prev.bottom anchors.horizontalCenter: prev.horizontalCenter modules/gamelib/player.lua InventorySlotOther = 0 InventorySlotHead = 1 InventorySlotNeck = 2 InventorySlotBack = 3 InventorySlotBody = 4 InventorySlotRight = 5 InventorySlotLeft = 6 InventorySlotLeg = 7 InventorySlotFeet = 8 InventorySlotFinger = 9 InventorySlotAmmo = 10 InventorySlotPurse = 11 InventorySlotEye = 15 InventorySlotFirst = 1 InventorySlotLast = 10 Com todas estas alterações, o que foi feito: O slot foi adicionado com sucesso no OTClient, aparecendo sem erros, com imagem e posicionado; O console não encontrou erro ao debugar o items.xml (testei um tipo aleatório, e dá erro o erro padrão das sources, então o tipo "eye" está correto nas sources); Dei /i em um item do tipo "eye" pra ver se o mesmo iria para o slot, mesmo caso não existisse graficamente, ele deveria ficar salvo nos dados do personagem no banco de dados, e isto não ocorreu, logo o problema está entre as sources e o client; Enfim, nas sources o tipo "eye" foi criado, mas ainda não é reconhecido verdadeiramente, espero que alguém possa me ajudar, segue em anexo as sources e todos os arquivos que citei ter editado: help.rar
  14. Poccnn

    #8 - Aula de Scripting Lua - Loops

    Estruturas de controle Palavras reservadas que será usado nessa aula: for, do, while, repeat, until, not, end, in Iremos tratar nesta aula sobre loops. Tomem muito cuidados ao usar loops, pois eles são a maior causa de travamento de sistemas. Será ensinado sobre as estruturas de controle: for, while e repeat. Iniciaremos pelo loop for: O loop for é composto por uma expressão de controle na qual a primeira expressão é uma variável interna e a segunda são suas atribuições que podem ser feitas para percorrer uma sequencia numérica ou uma iteração de tabela, por exemplo. Estrutura do for: for varName = primeiroValor,ultimoValor[,atribuição] do -- bloco end varName: seria o nome da variável, ou variáveis, que vai à receber a atribuição dos valores secundários. primeiroValor: seria o número que irá começar a percorrer a sequência; essa sequência tanto pode ser positiva quanto negativa. ultimoValor: seria o último valor a percorrer na sequência numérica. [,atribuição]: esse é um valor que pode ser omitido, mas quando não for, serve como atribuição de valor ao percorrer a sequência numérica; quando o loop está percorrendo a sequência numérica, esse valor é atribuído ao valor anterior da sequência; essa atribuição faz com que o loop “pule” alguns valores da sequência numérica. Por padrão, esse valor é 1 (positivo), caso esteja percorrendo valores negativos, terá que declarar como atribuição um valor negativo também. Exemplo de loop for usado para percorrer uma sequência numérica: for x = -1,-10,-2 do print(x) end >> -1 >> -3 >> -5 >> -7 >> -9 Veja que ele “pulou” os números: -2,-4,-6 e -8; Por quê? Porquê ao atribuir o valor ao valor anterior, ele deixa de seguir a sequência comum e passa a seguir segundo a atribuição. Lembrando que o valor da atribuição pode ser omitido e que ele vale +1 (um positivo). for x = 1,4 do print(x) end >> 1 >> 2 >> 3 >> 4 Outra expressão muito usada no for é o uso de funções, principalmente funções iteradoras. Como toda função pode retornar mais de um valor, na expressão da variável interna, podem-se declarar mais palavras que irão pegar os múltiplos valores retornados pela função, ou omiti-las como já foi demonstrado na aula sobre variáveis. Enquanto a expressão for verdadeira, ele continuará executando o bloco até que a expressão se torne falsa ou ele seja terminado pelo uso da palavra break ou por um return. Exemplo de um for com uma função iteradora: O loop while: Estrutura do loop while: while expressão do --bloco end Tu poderás usar qualquer tipo de expressão válida em lua. A maior diferença entre esse loop e o for é a falta da variável interna que consta no loop for. Enquanto a expressão for verdadeira, ele continuará executando o bloco até que a expressão se torne falsa ou ele seja terminado pelo uso da palavra break ou por um return. Exemplo de uso de um loop while: local ttm = 0 while (ttm < 60) do ttm = ttm + 1 end Uma pratica em programação é não por expressão no loop while, mas por algo que seja verdadeiro no lugar, forçando assim que tu tenhas que parar o loop dentro do bloco. local x = 0 while true do -- loop infinito if x > 9 then break end -- controle para parar o loop x = x + 1 end O loop repeat: O loop repeat segue o conceito oposto dos demais. Ao invés dele continuar executando enquanto a expressão for verdadeira, ele só continua executando enquanto a expressão for falsa e parando quando ela for verdadeira; ou caso seja finalizada pelo uso da palavra break ou return. A estrutura do loop repeat: repeat --bloco until expressão O loop repeat cria o bloco e sua expressão de controle fica após a palavra until que serve como “end” dos demais loops. Exemplo de uso do loop repeat: local x = 0 repeat print(x) x = x + 1 until not (x < 10) No código criado por vocês nas aulas anteriores, adicionem loops dos três tipos. Inté a próxima aula.
  15. Hail Xtibianos. Eu estava/estou atualizando alguns scripts meus bem antigos, então resolvi compartilhar para vocês que priorizam um jogo mais ao estilo: segunda vida na idade média. Bom... tu terás que fazer uma sala parecida como essa e com esses ids (pois já foram implementados no código). Agora vamos implementar os códigos: Vá em data/actions.xml e insira essas tags: Em data/actions/scripts/tools; insira todos esses códigos cada um com seus respectivos nomes: ferreiro.lua bellow.lua wood: Pronto. Instalados os scripts; agora irei explicar como funciona o sistema. Para acender o crucible, você precisa usar o fire bug (5468) no crucible (8642) até ele acender. Agora você põe a arma em cima da bancada e clica no bellow para ele 'aquecer' a arma para forja. Depois de 'esquentar' a arma, voce forja ela no anvil (bigorna de id 2555) por um tempo (tempo esse determinado pelo uso do crucible). Se o crucible 'apagar', voce clica no bellow até ele voltar a 'acender', mas isso só pode ser feito algumas vezes. Se você clicar muitas vezes e ele não 'acender', então tu terás que usar o fire bug de novo no crucible. Novo sistema de forja adicionado. Agora tu poderás adicionar materiais a forja para obter outros items. Explicação desse novo sistema: Primeiro tu põe a arma base para adição de novos compostos na mesa. adicione o item em cima da arma. Clique no bellow e o item de adição desaparecera. Leve o item "aquecido" para a bigorna. Use a marreta nele até sair um efeito verde. Caso ele peça para por de volta na fornalha a arma, não adicione outro item, apenas aqueça-o. Faça esse mesmo procedimento adicionando compostos até que o item seja criado. aqui um manual de forja feito a parti da tabela forja no script ferreiro.lua Tu poderás adicionar mais compostos para obter outros items a seu critério. Nova atualização! Agora a sala de forja ficou assim: Agora é possível forjar/fundir items: Adicione os compostos necessário para forja um por um (desde que ele não seja agrupaveis) na bancada do crucible e clique no bellow até ele sumir. adicione todos os items necessários e ao final clique no crucible: Resultado ao clicar no crucible com os compostos: Resultado da forja com os compostos: Onde edito ou ponho novos compostos no script? No script bellow.lua existe a lista de compostos e suas respectivas forjas. É só copiar uma nova instrução e editar os valores para novos items que possam ser forjados. ATENÇÃO! Todos os compostos precisam ser exatos para a receita funcionar, nem mais nem menos. Função requerida: É isso pessoal, depois posto mais scripts atualizados meu; espero que gostem; qualquer erro ou dúvida deixem no comentário abaixo. Um vídeo explicando como fazer objetos de fundição:
  16. Hail xtibianos! Gostaria de saber se vocês se interessam em ter aulas de scripting lua. Já temos cerca de oito aulas prontas para o primeiro módulo,. As aulas são compostas de teoria e prática, métodos e tarefas para fixar o conhecimento aos alunos. Serão disponibilizados aulas em três módulos: conceito e aplicações básicas, técnicas e conceitos intermediarios, spoo lua; disponibilizado em uma gama de aulas que serão postas todos os sábados até o final do módulo vigente. Ao final, pretendemos dar uma "pip" de scripting lua para todos os alunos que completarem o(s) módulo(s). Dependendo da quantidade de interessados, poderemos iniciar as aulas em princípios do mês subsequente. Deixem nos comentários seu aval ou sua queixa. Esperamos que tenham bastante participantes. Obrigado.
  17. Fala XTibianos! Vim disponibilizar e ensinar como usar a livraria xml em lua, desenvolvida por mim. Ela foi desenvolvida para substituir a livraria padrão disponibilizada por lua para trabalhar com dados xml. Essa livraria não requer a dll-xml necessária para a livraria padrão lua. Aqui tem o tutorial criado por mim para demonstrar as funções e suas implementações da livraria luaxml. Tutorial lua lib xml padrão Vamos lá. Primeiro, a livraria: Vou ensinar como usar ela. Vou usar como exemplo uma parte do arquivo vocations.xml: Primeiro, carregar o arquivo. Ele vai retornar um objeto para ser usado pelos metametodos ou uma string para outros fins como "print". Buscar a tag desejada. Ele vai retornar uma tabela contendo todos os parametros que foram lidos no arquivo. O primeiro argumento da função, é o nome da tag requerida. exemplo: <tagNome ....>, tagNome seria o primeiro argumento da função. O segundo elemento é usado para diferenciar um bloco de outro como no caso do arquivo vocations que contem varias vocations, mas apenas uma é a requerida. O terceiro elemento é o que diferencia um bloco de outro similar. seguindo o exemplo do arquivo vocations, existe varias vocações, mas apenas uma delas tem o id de numero 2. Imprime o que foi lido no arquivo. a saida seria essa, nesse caso. Mas, ela tambem é uma tabela, por isso, voce pode pegar os elementos dentro dela dessa forma. As tags existentes dentro do bloco "vocation", tambem é uma tabela com indice numerico; portanto é valido pegar os dados dela dessa forma. Cada tag que exista dentro do bloco, vem como uma tabela com indicie numerico. Criando objetos para xml: O argumento inserido , seria o nome do bloco. Ex -> <novo> </novo> Adiciona tag's dentro do corpo do bloco. Pode ser adicionado quantas tags quiser. Cria uma tagbloco ou bloco dentro do bloco principal. Ex -> <tagBloco inserido="primer" ordem="2" face="not"> </tagBloco> Essa função retorna um objeto para ser usado pelos metametodos ou uma string para outros fins como "print". Dessa forma que foi declarada sem uma tabela contendo os parametros da tag, ela é criada como um bloco. Ex -> <newBloco> </newBloco> Adiciona tag's ao corpo do novo bloco/tagbloco criado pela função append. E por fim, salva os dados em um arquivo. Nessa função, existe o argumento unico que é o destino do arquivo e seu nome, que nesse caso foi ocultado. Esse é os dados dentro do arquivo gerador pelo script. Devido as novas atualizações feitas a lib, agora podeis usar caracteres especial de busca e inserção de maiores informações para busca. Vou usar como exemplo essa parte do arquivo items.xml e movements.xml para explicar essas mudanças. items movements Na versão anterior da lib ela não poderia buscar informações no arquivo items.xml devido a um erro na ora de selecionar o bloco buscado. O problema residia em que: ao encontrar uma tag ela busca o seu fechamento, sendo que, no exemplo da parte do arquivo items que postei acima, ela pegava todo esse bloco, dessa forma anulando o verdadeiro id buscado. Isso foi resolvido. agora ela filtra o bloco encontrado antes de fazer a analise de que seja o dado requisitado. Outro problema era quando se desejava buscar uma informação mais precisa, como no caso do arquivo movements.xml que existe duas tags com os mesmo ids equip e deequip; se eu colocasse o id de qualquer item ele me retornaria a primeira sentença encontrada que na maioria das vezes não era a que eu queria. isso também foi corrigido; agora podeis usar mais informações para melhorar a precisão da busca. Veja esse exemplo: Obs. Os codigos estão codificados em utf8, converta para ansi antes de usa-los. É isso ae pessoal, espero que gostem; qualquer erro ou sugestão serão bem vindas. obrigado.
  18. Hail Xtibianos. Esse script eu criei a pedido de um membro do fórum e resolvi posta-lo para vocês. Ele serve para que ao matarem um determinado monstros, somente os players que tiverem uma certa quantidade de participação (em porcentagem) na morte do monstro é que receberam algo (configurável). Em creaturescripts.xml adicione: <event type="statschange" name="stats" script="statsMonster.lua"/><event type="death" name="deathMonster" script="deathMonster.lua"/> Em creaturescripts/scripts crie um arquivo lua com o nome statsMonster e adicione: M = {}function getDamageInMonster(monster,cid) local monster,cid,m_life,p_dano = tonumber(monster),tonumber(cid),0,0if not(monster or cid)then return 0,error('function getDamageInMonster(): monster or cid, not number') endif not(isCreature(monster))then return 0,error('function getDamageInMonster(): variavel monster nao e monstro.') end for k,v in pairs(M[monster]) do if(k == cid)then p_dano = v end m_life = m_life + v end return math.floor(p_dano/(m_life/100))endfunction onStatsChange(cid, attacker, tipo, combat, value)if not(M[cid])then M[cid] = {} endif not(tipo == 1)then return true end if(isPlayer(attacker))then if not(M[cid][attacker])then M[cid][attacker] = 0 end M[cid][attacker] = M[cid][attacker] + value elseif(isMonster(attacker))then -- caso seja um monstro o atacante local get = getCreatureMaster(attacker) -- averigua se não é um summon que está atacando if(tonumber(get) and isPlayer(get))then -- caso o summon seja de um player, adiciona o dano como se fosse o player if not(M[cid][get])then M[cid][get] = 0 end M[cid][get] = M[cid][get] + value end end return trueend Agora crie outro arquivo lua na mesma pasta e nomeie para deathMonster e adicione: function onDeath(cid, corpse, deathList) --[[> Marcryzius <]]-- if(isCreature(cid))then for _,player in pairs(deathList) do local player = isCreature(player) and getCreatureMaster(player) or player if(isPlayer(player) and isPlayerOn(player))then if(getDamageInMonster(cid,player) >= 50)then --[[ recompensa dada ao jogador Dar um item ao player, enviar ele a algum lugar, setar store etc... ]]-- end if(M[player])then table.remove(M,player) end end end end return trueend No monstro que tu queira usar esse sistema, adicione no xml dele essas duas tags: <script> <event name = "stats"/> <event name = "deathMonster"/> </script> Pronto. Qualquer duvida, erro e etc, deixe nos comentários.
  19. Hail Xtibianos. Eu criei esse sistema para impedir que mages usem magias sem estarem usando o livro. Cada livro libera uma certa quantidade de magias, logo, os mages terão que ter o livro para usarem determinadas magias mesmo eles tendo o level requerido por ela. Tu irás a precisar usar essa livraria para poder usar esse sistema: Em movements.xml adicione: Em movements/scripts crie um arquivo lua chamado spellbooks e adicione: Aconselho substituir o código do spellbook em actions por esse: Em actions.xml verifique se existe todos essas tags, caso não, adicione: Em actions/scripts/other/spellbooks.lua apague o seu conteúdo e adicione este: Mais realidade para o verdadeiro tibia. Qualquer duvida, erro e etc, deixe nos comentários.
  20. MALLEUS MALEFICARUM O Martelo das Bruxas ou O Martelo das Feiticeiras é um livro que foi escrito e publicado em 1486 ou 1487 pelos dominicanos Heinrich Kraemer (também conhecido por Heinrich Institoris) e James Sprenger, na Alemanha, em cumprimento à bula papal Summis Desiderantis Affectibus de Inocêncio VIII, que os autorizava criar um manual de combate aos praticantes de heresias - e que veio a se tornar o guia dos inquisidores pelo restante do século XV e seguintes; embora outros manuais tenham sido escritos no período, este é dos mais "perversos e cruéis", verdadeiro "manual de ódio, de tortura e morte". Devido a heresia cometidas pelas pessoas que renegaram a fé um dia obtida e pactuando sua vida com o diabo, trouxeram para si a ira de Deus. Negaram a fé, negaram a igreja, negaram Deus e prestaram culto ao diabo. A ARTE DO PENTAGRAMA As Bruxas são mulheres que praticam culto ao diabo e se satisfazem de seu poder para suas feitiçarias, encantos e adivinhações. Devido a suas capacidade de conhecerem as artes da magia negra, os Bruxos conseguem causar pânico por onde passam e onde atuam. O pentagrama é o simbolo chave para a Bruxaria; é dele que dizem que as forças do mal emanam e os Bruxos o usam para suas artes malignas. Não era para ser uma quest esse sistema, mas eu adaptei para poder publica-lo. Inicialmente foi desenvolvido apenas como forma de punição pela sentença dada pela inquisição aos acusados de bruxaria; agora ele se tornou uma quest. Adicionando o sistema. data/movements/movements.xml data/movements/scripts/quests crie um arquivo com extensão .lua e nomeio para malleus; adicione esse código ao arquivo: Coloque apenas as posições requisitadas na tabela config. Adicione o respawn nas outras áreas, exceto na sala de tortura e no pentagrama. Nessa área, seria bom por esses monstros, como mostra a imagem: adicione na posição central, exatamente onde está a arvore morta, esse monstro: Nessa outra área, adicione na posição central, exatamente onde está a arvore, esse monstro: mapa: clean.rar clean.rar
  21. Esta dando esse probleminha aqui agora , e também não consigo atacar mais ninguém.
  22. Poccnn

    Funções úteis

    Hail Xtibianos. Trago a vós uma serie de funções que eu uso no meu servidor e que pode ser úteis ao seu. Lembrando que algumas funções podem fazer uso de uma livraria xml criado por mim e posta nesse tópico. Essa função tem por objetivo criar uma data formatada (00:00:00) de um intervalo de tempo. function intervalClockFormat(ini,fim) --[[( Marcryzius )]]--local ini,fim = tonumber(ini),tonumber(fim)if not(ini or fim)then return "error",print('function intervalClock erro: type de variaveis invalidas') endlocal tienpo = fim-ini-- existe o parametro de dia, mas não está sendo retornado (usado).local day,hour,minu,seco = tienpo/60/60/23%30,math.floor(tienpo/60/60%23), math.floor(tienpo/60%60),math.floor(tienpo%60) return (hour < 10 and "0"..hour or hour)..":"..(minu < 10 and "0"..minu or minu)..":"..(seco < 10 and "0"..seco or seco)endEx: print(intervalClockFormat(os.time(),os.time()+98)) >> 00:01:38print(intervalClockFormat(os.time(),os.time()+6598)) >> 01:49:58 Essas funções tem por objetivo salvar as informações de uma determinada quest e saber se o player tem essa quest salva em seu histórico. function saveQuestsInfor(uid,name,cid,other) --[[( Marcryzius )]]----[[ uid = Item.uid usado no bau(entre outros) para receber o item da Quest name = nome do item dado ao player ou nome da quest cid = identificacao do player other = informacoes adicionais para serem salvas junto a quest]]--if not(db.executeQuery("SELECT * FROM `server_quests`;"))then -- caso a table não exista, será criada db.executeQuery("CREATE TABLE `server_quests` (`uid` INTEGER, `name` VARCHAR(255), `name_player` VARCHAR(255), `pos` VARCHAR(255), `other` TEXT);")end-- caso o parametro uid seja numero, se pega a posição do item ou, caso não, se pega a posição do player.local other,pos2 = other or '',''local pos = type(uid) == 'number' and getThingPos(uid) or getCreaturePosition(cid) pos2 = 'x='..pos.x..', y='..pos.y..', z='..pos.z -- verifica se tudo está correto. if not(type(name) == 'string') or not(tonumber(cid))then return false, print('Funcao requer parametros: name,cid') end -- salva as informações na database. db.executeQuery("INSERT INTO `server_quests` (`uid`, `name`, `name_player`,`pos`,`other`) VALUES ("..(uid or tonumber(pos.x..''..pos.y..''..pos.z))..",'"..name.."', '"..getCreatureName(cid).."','"..pos2.."','"..other.."');") return trueendfunction getSaveQuestsInfor(uid,cid) --[[( Marcryzius )]]--local str = false if(tonumber(uid))then str = db.getResult("SELECT * FROM `server_quests` WHERE `uid` = '"..uid.."' AND `name_player` = ".. db.escapeString(getCreatureName(cid))..";") elseif(type(uid) == 'string')then str = db.getResult("SELECT * FROM `server_quests` WHERE `name_player` = " ..db.escapeString(getCreatureName(cid)).. " AND `name` = '"..uid.."';") else return false,print('getSaveQuestInfor: tipo de uid invalido > '..tostring(type(uid))) end return (str:getID() == -1) and true or false end Essa função serve para por a primeira letra de cada palavra da 'msg' em maiúscula. function upperPrimer(msg) --[[( Marcryzius )]]--local txt = '' for k in string.gmatch(msg,'%a+') do if(#k > 1)then txt = txt..' '..k:gsub("^%a", function(s) return s:upper() end) else txt = txt..' '..k end end return txt:sub(2,-1)endEx:print(upperPrimer("toda primeira letra de cada palavra desse texto foi colocada em maiusculo")) >> Toda Primeira Letra De Cada Palavra Desse Texto Foi Colocada Em Maiusculo Função criada para determinar o valor inteiro mais próximo de uma fração. function math.proxInteger(value) --[[( Marcryzius )]]-- local value = tonumber(value) if not(value)then return 0,print('Function error: math.proxInteger() > valor => '..type(value)) end return value-math.floor(value) < 0.5 and math.floor(value) or math.ceil(value)end Essa função converte a 'string' em números e devolve a soma de todos os números. function getStoreString(str) --[[( Marcryzius )]]--local store = 0 if(type(str) == 'string')then for pos = 1,#str do store = store+str:sub(pos,pos):byte() end elseif(type(str) == 'number')then return str else print('function getStoreString adverte: tipo de parametro invalido. ('..type(str)..')') end return storeendEx:print(getStoreString("lua")) >> 322 Pega o level necessário para usar a arma dentro do arquivo weapons.xml function getLevelNeedToWeaponById(itemid) --[[( Marcryzius )]]--local xfile = xml:load("data/weapons/weapons.xml"):find('%a+','id',itemid) return tonumber(xfile and xfile.level) or 0end Essa função faz uma verificação se há um town em uma determinada área. function getTownInArea(pos, ranger) --[[( Marcryzius )]]--local ranger,townid,bloked = ranger or 200,1,{getTownId('Gods Island'),getTownId('Isle of Destiny')} -- towns suprimidos while getTownName(townid) do local get = getTownTemplePosition(townid) if not(isInArray(bloked,townid)) and ((pos.x >= get.x-ranger and pos.x <= get.x+ranger)and(pos.y >= get.y-ranger and pos.y <= get.y+ranger))then return townid else townid = townid+1 end end return 0 --retorna 0 (zero) para servir como condição.end Pega o nome e o level do top function getTopLevel() --[[( Marcryzius )]]--local target,name,level = db.getResult("SELECT `name`, `level` FROM `players` WHERE `group_id` <= 2 ORDER BY 'level' DESC;"),"",0 if(target:getID() ~= -1) then repeat local glevel = target:getDataInt("level") if(level < glevel)then name,level = target:getDataString("name"), glevel end until not(target:next()) end target:free() return name,levelend Verifica se existe o nome de um player mesmo ele estando offline. function playerExistName(nome) --[[( Marcryzius )]]--local db = db.getResult("SELECT `name` FROM `players` WHERE `id` = " ..getPlayerGUIDByName(nome).. ";") if not(db:getID() == -1) then return db:getDataString("name") end return falseend Retorna o tempo vigente apenas em segundos function HorasParaSegundos() --[[( Marcryzius )]]-- local hour,minu,second = tostring(os.date("%H:%M:%S")):match('(%d+)%d+)%d+)') return ((tonumber(hour) or 0)*3600)+((tonumber(minu) or 0)*60)+secondend
  23. As Livrarias de Lua A livraria OS (operation system – sistema operacional). os.execute(cmd) Executa um comando através de uma string de comando cmd. os.exit( ) Termina um programa e retorna code (default = success). os.remove(fn) Apaga o arquivo fn; em caso de erro, retorna nil e uma descrição do erro. os.rename(of,nf) Renomeia o arquivo of para nf; em caso de erro retorna nil e uma descrição do erro. os.tmpname() Retorna o nome do arquivo criado por io.tmpfile(). os.clock() Retorna a quantidade de tempo em segundos usado da CPU pelo programa. os.time([tt]) Retorna um numero em segundos que depende do sistema usado e esse numero pode receber uma tabela contendo uma data especifica: year,month,day,hour,minu,sec. os.date([fmt[,t]]) Retorna uma string contendo a data atual formatada; ou pode ser formatada a data atual ou uma data inserida (t) usando uma formatação (fmt) com elementos validos. os.difftime(t2,t1) Retorna a diferença entre os dois valores de um tempo gerado por os.time(). Nem todas as funções serão possíveis ou necessárias mostrar exemplos. Exemplos os.execute(cmd): os.execute(“luac.exe”) obs: Não darei mais exemplos sobre a função execute devido a minha ignorância sobre comandos cmd. os.tmpname(): dir = os.tmpname() io.write(dir,"Valores inseridos") io.write(dir,"novo valor") io.write(dir,"linha final") print(dir) >> \sdu8.Valores inseridos\sdu8.novo valor\sdu8.linha final\sdu8. os.time([tt]): print(os.time({year=2017,month=4,day=29,hour=18,min=30,sec=0})) >> 1493501400 << valor especificado print(os.time()) >> 1493509967 << valor atual os.date([fmt[,t]]): Caracteres usados na formatação (fmt) da função os.date. %a – Abreviação do nome do dia vigente da semana em inglês. %A – Nome completo do dia vigente da semana em inglês. %b – Abreviação do nome do mês vigente. %B – Nome do mês vigente. %c – Representação formatada da data e horário vigente. %d – Dia do mês vigente. %H – Hora em formato de 24h (00-23) %I – Hora em formato 12h (01-12) %j – Dia do ano (001-366) %m – Mês do ano decimal (01-12) %M – Minuto (00-59) %p – Formato local do indicador de horas (am/pm) %S – Segundos (00-59) %U – Número da semana do ano, sendo que o domingo é o primeiro dia da semana (00-53) %w – Número do dia da semana (0-6; domingo é 0) %W – Número da semana do ano, sendo que segunda-feira seja o primeiro dia da semana (00-53) %x – Representação da data no formato local %X – Representação do tempo no formato local %y – Formato abreviado do ano no século vigente (00-99) %Y – Formato completo do ano milenar (ex: 2017) Se usar o formato: “*t” será retornado uma tabela contendo: sec(0-59) min(0-59) hour(0-23) day(1-31) month(1-12) year(aparti de 1900) wday(domingo é dia 1, segunda é 2 e etc) yday(dia do ano) Exemplos: print(os.date("%a")) >> sun print(os.date(“%A”)) >> Sunday print(os.date(“%b”)) >> apr print(os.date(“%B”)) >> april print(os.date(“%c”)) >> 04/30/17 19:32:09 print(os.date(“%d”)) >> 30 print(os.date(“%H”)) >> 19 print(os.date(“%I”)) >> 7 print(os.date(“%j”)) >> 120 print(os.date(“%m”)) >> 4 print(os.date(“%M”)) >> 32 print(os.date(“%p”)) >> pm print(os.date(“%S”)) >> 09 print(os.date(“%U”)) >> 18 print(os.date(“%w”)) >> 0 print(os.date(“%W”)) >> 17 print(os.date(“%x”)) >> 04/30/17 print(os.date(“%X”)) >> 19:32:09 print(os.date(“%y”)) >> 17 print(os.date(“%Y”)) >> 2017 -- Com uso do tempo (t) print(os.date(“%d/%m/%y %H:%M:%S”,os.time())) >> 30/04/17 19:32:09 print(os.date(“%d/%m/%y %H:%M:%S”, 1493591529)) >> 30/04/17 19:32:09 t = os.date(“*t”) print((t.hour)..’:’..(t.minu)..’:’..(t.sec)) >> 19:32:09 print((t.day)..”/”..(t.month)..”/”..(t.year)) >> 30/04/17 print((t.wday)..”/”..(t.yday)) >> 120
  24. Poccnn

    tfs 0.3 Tutorial Coroutine Lua

    Fala Xtibianos. Nesse tutorial, gostaria de explicar um pouco sobre coroutine e seu uso. Irei começar com uma lista de funções da coroutine. Irei começa falando sobre a principal função da coroutine. No corpo dessa função, voce precisa declarar pontos para "suspender" a execução da coroutine. Ao criar a coroutine, ela se encontra no estado "suspended", ou seja, parada/pausada. para iniciar a coroutine, voce precisa ativar ela usando a função: Além de ativar/reativar a coroutine, você passa valores para a função da coroutine. A primeira ativação da coroutine, os argumentos passados não poderão ser modificados, ficam estáticos nos parâmetros da função. Veja que o resultado da segunda chamada não coincidem com os valores passados. Isso se dá devido aos parâmetros da função impregada na coroutine, não modificar seus valores. uma vez declarados os valores, eles não poderão ser modificados. uma chamada de coroutine a mais da quantidade de yield's existente na coroutine. Como demonstrado acima, ao exceder a quantidade de yield's, ela retorna essa mensagem (sem disparar erro no console). Agora você deva estar se perguntando: Então como fazer para pegar os valores que são passados em cada ativação? Vou explicar agora: a função yield pega os valores fornecidos e retorna-os; então você pode pegar esses valores usando variaveis para armazena-los. Mas, no corpo da função criada para a coroutine, você pode fazer chamadas a funções, pegar valores de variaveis globais, etc; sempre usando a função yield para "suspender" a coroutine. Agora só falta comentar sobre a função: Assim como coroutine.create, a função auxiliar coroutine.wrap cria uma nova co-rotina, mas ao invés de retornar uma referência para a co-rotina, retorna uma função que, quando chamada, (re)invoca a co- rotina. De forma geral, a função coroutine.wrap oferece uma maior conveniência que coroutine.create; ela provê exatamente o que é usualmente necessario: uma função para reativar uma co-rotina. Por outro lado, o uso das funções coroutine.create e coroutine.resume permite o gerenciamento de erros (funções estas que não podem ser usada por wrap). A função retornada por coroutine.wrap não captura erros; qualquer erro provocado pela execução da co-rotina é propagado a seu chamador. É isso ai pessoal, espero que tenham gostado. qualquer duvida, sugestão ou critica, deixem nos comentários.
×
×
  • Criar Novo...