Ir para conteúdo

Featured Replies

Postado

┌──────────────────────────────────────────────────┐

Nome: Sign of Zodiac
Versão do script: 1.0.0
Tipo do script: Sistema (Creature Script, Talkaction e Lib)
Servidor Testado: The Forgotten Server 0.4.0 Doomed Elderberry
Autor: Lwkass
└──────────────────────────────────────────────────┘
 
- Características:

 

~ Bônus em experiencia (Todos recebem 10% a mais)
~ Bônus na defesa contra elemento (Todos absorvem 5%)
~ Cada signo possui um elemento (Fire, Ice, Lighting ou Earth)
~ Signos de Fogo: Aries, Leo e Sagittarius
~ Signos da Terra: Taurus, Virgo e Capricorn
~ Signos da Eletricidade (Ar): Gemini, Libra e Aquarius
~ Signos de Agua: Cancer, Scorpio e Pisces
 

 

- Explicando:
Para escolher o signo o player deve colocar o dia e o mês do aniversário e o sistema automaticamente coloca o signo, comando:
 

 

!zodiac dia/mês
 

 

Só para deixar claro como o sistema funciona, usando de exemplo o signo de Leão (Leo) que é do elemento Fire:
* Se receber um dano do elemento Fire, absorve 5% (modificável) do dano total, ou seja, o dano seria igual a 95% do que seria (dano absorvido indicado por animatedText).
* Se matar um monstro que tenha uma defesa contra Fire maior que 0% ganha bônus de 10% (modificável) da exp total, ou seja, ganha-se 110% (exp extra indicada por animatedText).

Se o signo fosse do elemento Earth, então seria a mesma coisa só que com o elemento Earth, se fosse Ice ou Lighting a mesma coisa.

Pode-se usar o comando !zodiac info para informações.



- Script:
Primeiro, na pasta data/lib (caso a pasta não exista, crie) do seu servidor crie um arquivo Lua com o nome zodiac-Lib.lua (Lib com maiúscula) e salve com isso dentro:
 
--[[

	Sign of Zodiac System
						v1.0.0
	by: Lwkass ([email protected])
	
]]


Zodiac = {
	constant = {
		OPTION_PERCENT_BLOCK = 5, -- In Percent
		OPTION_EXTRA_EXP_RATE = 10, -- In Percent
		STORAGE_SIGN = 16161,
		elements = { 
			["Fire"] = { combat = COMBAT_FIREDAMAGE, color = COLOR_ORANGE },
			["Earth"] = { combat = COMBAT_EARTHDAMAGE, color = COLOR_LIGHTGREEN },
			["Lighting"] = { combat = COMBAT_ENERGYDAMAGE, color = COLOR_TEAL },
			["Ice"] = { combat = COMBAT_ICEDAMAGE, color = COLOR_LIGHTBLUE }
		}
	},
	signs = {
		["Aries"] = {
			date = {"21/03", "20/04"}, 
			element = "Fire"
		},
		["Taurus"] = {
			date = {"21/04", "20/05"}, 
			element = "Earth"
		},
		["Gemini"] = {
			date = {"21/05", "20/06"}, 
			element = "Lighting"
		},
		["Cancer"] = {
			date = {"21/06", "21/07"}, 
			element = "Ice"
		},
		["Leo"] = {
			date = {"22/07", "22/08"}, 
			element = "Fire"
		},
		["Virgo"] =  {
			date = {"23/08", "22/09"}, 
			element = "Earth"
		},
		["Libra"] = {
			date = {"23/09", "22/10"}, 
			element = "Lighting"
		},
		["Scorpio"] = {
			date = {"23/10", "21/11"}, 
			element = "Ice"
		},
		["Sagittarius"] = {
			date = {"22/11", "21/12"}, 
			element = "Fire"
		},
		["Capricorn"] = {
			date = {"22/12", "20/01"}, 
			element = "Earth"
		},
		["Aquarius"] = {
			date = {"21/01", "19/02"}, 
			element = "Lighting"
		},
		["Pisces"] = {
			date = {"20/02", "20/03"}, 
			element = "Ice"
		}
	},

	getSignInfo = function (signName)
		return Zodiac.signs[signName]
	end,
	
	set = function (cid, signName)
		setPlayerStorageValue(cid, Zodiac.constant.STORAGE_SIGN, signName)
	end,
	
	get = function (cid)
		return getPlayerStorageValue(cid, Zodiac.constant.STORAGE_SIGN), Zodiac.getSignInfo(getPlayerStorageValue(cid, Zodiac.constant.STORAGE_SIGN)) or 0
	end,
	
	getElement = function (cid)
		return Zodiac.getSignInfo(getPlayerStorageValue(cid, Zodiac.constant.STORAGE_SIGN)).element
	end,
	
	getSign = function (cid, day, month)
		for sign, info in pairs(Zodiac.signs) do
			_, _, beginDay, beginMonth = info.date[1]:find("(%d+)/(%d+)")
			_, _, endDay, endMonth = info.date[2]:find("(%d+)/(%d+)")
			beginDay, beginMonth, endDay, endMonth = tonumber(beginDay), tonumber(beginMonth), tonumber(endDay), tonumber(endMonth)
			
			if ((month == beginMonth and day >= beginDay) or (month == endMonth and day <= endDay)) then
				return sign, info
			end
		end
	end
}

Agora na pasta data/creaturescripts/scripts:

No arquivo login.lua adicione isso antes do return:
 
-- Zodiac
	registerCreatureEvent(cid, "zodiacKill")
	registerCreatureEvent(cid, "zodiacStats")
	
	if (getPlayerLastLogin(cid) <= 0 or getPlayerStorageValue(cid, 16160) == 1) then
		doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Please, when is your birthday date ? (Example: !zodiac day/month = !zodiac 1/2, !zodiac 23/7,...)")
		setPlayerStorageValue(cid, 16160, 1) -- Talk state
	else
		doPlayerSetSpecialDescription(cid, ", sign of " .. getPlayerStorageValue(cid, 16161))
	end

E crie esses arquivos:

zodiacKill.lua
 
dofile('data/lib/zodiac-Lib.lua')

function getMonsterPath(monstername)
	f = io.open ("data/monster/monsters.xml", 'r')
	
	for line in f:lines() do
		_, _, name, path, file_name = string.find(line, '<monster name="(.+)" file="(.+)/(.+).xml"/>')
		if (name and path and file_name and name:lower() == monstername:lower()) then
			f:close()
			return path .. "/" .. file_name .. ".xml"
		end
	end
end

function getMonsterElementDefense(monstername, element)
	f = io.open ("data/monster/" .. getMonsterPath(monstername), 'r')
	
	for line in f:lines() do
		if (string.find(line, '</elements>')) then break end
		_, _, n = string.find(line, '<element '.. element:lower() ..'Percent="([-%d]+)"/>')
		if (n) then
			f:close()
			return tonumber(n)
		end
	end
	
	f:close()
	return 0
end

-------

function onKill(cid, target, lastHit)
	if (isMonster(target) and getMonsterElementDefense(getCreatureName(target), (Zodiac.getElement(cid) == "Lighting" and "Energy" or Zodiac.getElement(cid))) > 0) then
		local exp_bonus = math.ceil(getMonsterInfo(getCreatureName(target)).experience * (Zodiac.constant.OPTION_EXTRA_EXP_RATE/100))
		doSendAnimatedText(getThingPos(cid), exp_bonus, COLOR_GREY)
		doPlayerAddExperience(cid, exp_bonus)
	end
	return true
end

 zodiacStats.lua

dofile('data/lib/zodiac-Lib.lua')

function onStatsChange(cid, attacker, type, combat, value)
	playerSign = Zodiac.get(cid)
	
	if (combat == Zodiac.constant.elements[Zodiac.getElement(cid)].combat) then
		valuem = math.ceil(value*(Zodiac.constant.OPTION_PERCENT_BLOCK/100))
		doCreatureAddHealth(cid, valuem)
		doSendAnimatedText(getThingPos(cid), "+"..valuem, Zodiac.constant.elements[Zodiac.getElement(cid)].color)
	end
	return true
end

Certo, agora no arquivo data/creaturescripts/creaturescripts.xml, adicione isso:

 

  <event type="statschange" name="zodiacStats" event="script" value="zodiacStats.lua"/>
    <event type="kill" name="zodiacKill" event="script" value="zodiacKill.lua"/>  

Na pasta data/talkactions/scripts, adicione um arquivo Lua com o nome de zodiacTalk.lua:

 

dofile('data/lib/zodiac-Lib.lua')

function onSay(cid, words, param, channel)
	if (param:len() == 0) then
		doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You can use '!zodiac day/month' or '!zodiac info'")
		return true
	end

	playerSign, Info = Zodiac.get(cid) 
	
	if (type(playerSign) == "string" and param:lower() == "info") then
		doPlayerPopupFYI(cid, [[      Zodiac Informations ~   
-------------------------------
  * Sign: ]] .. playerSign .. [[ 
  * Element: ]] .. Info.element .. [[
 
 
  * Bonus:
    +]] .. Zodiac.constant.OPTION_EXTRA_EXP_RATE .. [[% experience of ]] .. Zodiac.getElement(cid) ..  [[ monsters 
    +]] .. Zodiac.constant.OPTION_PERCENT_BLOCK .. [[% of defense in attacks with ]] .. Zodiac.getElement(cid) ..  [[ element ]])
	
	elseif (getPlayerStorageValue(cid, 16160) == 1) then
		_, _, day, month = string.find(param, "(%d+)/(%d+)")
		day, month = tonumber(day), tonumber(month)
		if (day and month and day > 0 and day <= 31 and month > 0 and month <= 12) then
			Zodiac.set(cid, Zodiac.getSign(cid, day, month))
			playerSign = Zodiac.get(cid)
			doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, param)
			doSendMagicEffect(getThingPos(cid), math.random(28, 30))
			doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "You sign of zodiac is " .. playerSign .. " which is of element " .. Zodiac.getElement(cid) .. " !")
			doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "You can see more information saying '!zodiac info', remember this...")
			setPlayerStorageValue(cid, 16160, -1)
		else
			doPlayerSendCancel(cid, "You put a invalid date.")
		end
	end
	
	return true
end

Coloque essa tag no arquivo data/talkactions/talkactions.xml

 

 <talkaction words="!zodiac" event="script" value="zodiacTalk.lua"/>  

 

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

  • Respostas 12
  • Visualizações 1.5k
  • Created
  • Última resposta

Top Posters In This Topic

Posted Images

Participe da conversa

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

Visitante
Responder

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.6k

Informação Importante

Confirmação de Termo