Jump to content

Bruce The Fighter - O NPC Lutador


Omega

Recommended Posts

Informações

  • Bruce The Fighter é um NPC, mas também pode lutar contra outros jogadores, servindo como um ótimo boss de quests;
  • A luta é inicada com um diálogo;
  • Ele tem duas formas: normal e evoluída, mudando da primeira pra segunda quando chegar a uma porcentagem de vida configurável;
  • Quando ele é derrotado, adiciona um storage (para ser usado como você quiser), itens, dinheiro e experiência;
  • Também pode ser configurado se ele irá lutar novamente com o mesmo jogador, tendo também uma opção de exhaust;
  • Quase totalmente configurável;
  • São vários arquivos, então acompanhe atentamente o passo-a-passo da configuração/instalação.

Códigos

  • creaturescripts/scripts/monster1.lua

 

 

local percentToChange = 5
function onStatsChange(cid, attacker, type, combat, value)
	if type ~= 1 then
		return true
	end
	if getCreatureHealth(cid) - value <= getCreatureMaxHealth(cid) * percentToChange / 100 then
		local lookdir = getCreatureLookDirection(cid)
		local pos = getThingPos(cid)
		local name = getCreatureName(cid)
		doRemoveCreature(cid)
		local newMonster = doCreateMonster(name.."_evolved", pos)
		doCreatureSetLookDirection(newMonster, lookdir)
		doCreatureAddHealth(newMonster, (100 - percentToChange) / 100 * getCreatureMaxHealth(newMonster) * -1)
		doCreatureSay(newMonster, "Achou mesmo que poderia me derrotar?", 1)
		return false
	end
	return true
end

 

 

  • creaturescripts/scripts/monster2.lua

 

 

local exp = 80000
local money = 20000
local item, count = 1550, 1
-- Tempo de exhaust até poder lutar com Bruce novamente depois de derrotá-lo (em segundos)
local exhaust = 30 * 60 -- 30 minutos nesse exemplo

function onStatsChange(cid, attacker, type, combat, value)
	if type == 1 then
		if getCreatureHealth(cid) - value <= 0 and (isPlayer(attacker) or isPlayer(getCreatureMaster(attacker))) then
			if isPlayer(getCreatureMaster(attacker)) then
				attacker = getCreatureMaster(attacker)
			end
			local pos = getThingPos(cid)
			local name = getCreatureName(cid)
			local lookdir = getCreatureLookDirection(cid)
			doCreatureSay(cid, "Ok, ok, voce venceu!", 1, false, attacker)
			doRemoveCreature(cid)
			local npc = doCreateNpc(name, pos)
			doCreatureSetLookDirection(npc, lookdir)
			setPlayerStorageValue(attacker, 69507, getPlayerStorageValue(attacker, 69507) + 1)
			setPlayerStorageValue(attacker, 69508, os.time() + exhaust)
			doPlayerAddExperience(attacker, exp)
			doPlayerAddMoney(attacker, money)
			doPlayerAddItem(attacker, item, count)
			return false
		end
	end
	return true
end

 

 

  • npcs/Bruce The Fighter.xml

 

 

<?xml version="1.0" encoding="UTF-8"?>
<npc name="Bruce The Fighter" script="data/npc/scripts/challenger.lua" walkinterval="3000" floorchange="0">
	<health now="100" max="100"/>
	<look type="367" head="0" body="38" legs="114" feet="94" addons="0"/>
	<parameters>
		<parameter key="message_greet" value="Eu nao falo com inuteis como voce... a menos que voce queira um {desafio}."/>
		<parameter key="message_farewell" value="Va embora logo!"/>
		<parameter key="message_walkaway" value="Que bons ventos o levem!"/>
	</parameters>
</npc>

 

 

  • npcs/scripts/challenger.lua

 

 

local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
local talkState = {}

function onCreatureAppear(cid)				npcHandler:onCreatureAppear(cid)			end
function onCreatureDisappear(cid)			npcHandler:onCreatureDisappear(cid)			end
function onCreatureSay(cid, type, msg)			npcHandler:onCreatureSay(cid, type, msg)		end
function onThink()					npcHandler:onThink()					end


function creatureSayCallback(cid, type, msg)
	if(not npcHandler:isFocused(cid)) then
		return false
	end

	local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid
	
	-- Bruce lutará novamente o jogador que o derrotar? [true/false]
	local fight_again = true	
	
	if msgcontains(msg, "desafio") then
		if fight_again and getPlayerStorageValue(cid, 69508) < os.time() then
			selfSay("Então você quer me desafiar para um duelo? HA, prepare-se para morrer!")
			local pos = getThingPos(getNpcCid())
			local summonName = getCreatureName(getNpcCid())
			local lookdir = getCreatureLookDirection(cid)
			doRemoveCreature(getNpcCid())
			local summonCid = doCreateMonster(summonName, pos)
			doCreatureSetLookDirection(summonCid, lookdir)
			addEvent(checkForBruce, 5000, summonName)
		else
			selfSay("Ah, sinto muito, mas não estou pronto para uma nova luta com você.", cid)
		end
	end
	return true	
end

npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

function checkForBruce(name)
	local Bruce = isCreature(getCreatureByName("Bruce The Fighter")) and getCreatureByName("Bruce The Fighter") or false
	if isNpc(Bruce) then
		return false
	end
	if not Bruce then
		Bruce = isCreature(getCreatureByName("Bruce The Fighter_evolved")) and getCreatureByName("Bruce The Fighter_evolved") or Bruce
	end
	if isCreature(getCreatureTarget(Bruce)) then
		addEvent(checkForBruce, 5000, name)
		return true
	else
		local pos = getThingPos(Bruce)
		doRemoveCreature(Bruce)
		doCreateNpc(name, pos)
	end
end

 

 

  • monsters/challenger.xml

 

 

<?xml version="1.0" encoding="UTF-8"?>
<monster name="Bruce The Fighter" nameDescription="a challenger" race="blood" experience="1800" speed="320" manacost="0">
  <health now="1600" max="1600"/>
  <look type="367" head="0" body="38" legs="114" feet="94" addons="0" corpse="6080"/>
  <targetchange interval="5000" chance="20"/>
  <strategy attack="100" defense="0"/>
  <flags>
    <flag summonable="0"/>
    <flag attackable="1"/>
    <flag hostile="1"/>
    <flag illusionable="0"/>
    <flag convinceable="0"/>
    <flag pushable="0"/>
    <flag canpushitems="1"/>
    <flag canpushcreatures="1"/>
    <flag targetdistance="1"/>
    <flag staticattack="90"/>
    <flag runonhealth="0"/>
  </flags>
  <script>
		<event name="Monster1"/>
  </script>
  <attacks>
    <attack name="melee" interval="2000" skill="80" attack="70"/>
    <attack name="physical" interval="2000" chance="50" range="7" min="-45" max="-105">
      <attribute key="shootEffect" value="spear"/>
    </attack>
<attack name="melee" interval="2000" chance="15" range="7" radius="3" target="0" min="-50" max="-105">
  <attribute key="areaEffect" value="blackspark"/>
</attack>
  </attacks>

  <defenses armor="30" defense="30">
    <defense name="healing" interval="2000" chance="30" min="30" max="50">
      <attribute key="areaEffect" value="blueshimmer"/>
    </defense>

    </defenses>

    <elements>
	<element firePercent="0"/>
	<element energyPercent="10"/>
	<element deathPercent="25"/>
	<element physicalPercent="25"/>
	<element holyPercent="-20"/>
	</elements>
  <immunities>
    <immunity physical="0"/>
    <immunity energy="0"/>
    <immunity fire="1"/>
    <immunity poison="0"/>
    <immunity lifedrain="0"/>
    <immunity paralyze="1"/>
    <immunity outfit="1"/>
    <immunity drunk="1"/>
    <immunity invisible="1"/>
  </immunities>
  <voices>
  </voices>
  <loot>
  </loot>
</monster>

 

 

  • monsters/challenger_evolved.xml

 

 

<?xml version="1.0" encoding="UTF-8"?>
<monster name="Bruce The Fighter" nameDescription="a challenger" race="blood" experience="1800" speed="320" manacost="0">
  <health now="16000" max="16000"/>
  <look type="235" head="20" corpse="6348"/>
  <targetchange interval="5000" chance="20"/>
  <strategy attack="100" defense="0"/>
  <flags>
    <flag summonable="0"/>
    <flag attackable="1"/>
    <flag hostile="1"/>
    <flag illusionable="0"/>
    <flag convinceable="0"/>
    <flag pushable="0"/>
    <flag canpushitems="1"/>
    <flag canpushcreatures="1"/>
    <flag targetdistance="1"/>
    <flag staticattack="90"/>
    <flag runonhealth="0"/>
  </flags>
   <script>
		<event name="Monster2"/>
  </script>
  <attacks>
    <attack name="melee" interval="2000" skill="80" attack="70"/>
    <attack name="physical" interval="2000" chance="50" range="7" min="-45" max="-105">
      <attribute key="shootEffect" value="spear"/>
    </attack>
<attack name="melee" interval="2000" chance="15" range="7" radius="3" target="0" min="-50" max="-105">
  <attribute key="areaEffect" value="blackspark"/>
</attack>
  </attacks>

  <defenses armor="30" defense="30">
    <defense name="healing" interval="2000" chance="30" min="30" max="50">
      <attribute key="areaEffect" value="blueshimmer"/>
    </defense>

    </defenses>

    <elements>
	<element firePercent="0"/>
	<element energyPercent="10"/>
	<element deathPercent="25"/>
	<element physicalPercent="25"/>
	<element holyPercent="-20"/>
	</elements>
  <immunities>
    <immunity physical="0"/>
    <immunity energy="0"/>
    <immunity fire="1"/>
    <immunity poison="0"/>
    <immunity lifedrain="0"/>
    <immunity paralyze="1"/>
    <immunity outfit="1"/>
    <immunity drunk="1"/>
    <immunity invisible="1"/>
  </immunities>
  <voices interval="5000" chance="20">
    <voice sentence="I shall take your soul!" yell="1"/>
    <voice sentence="Hail the Dark Brotherhood!" yell="1"/>
    <voice sentence="Come my Dark Breathren!"/>
    <voice sentence="I will take us both to hell!"/>
  </voices>
  <loot>
  </loot>
</monster>

 



TAGs

  • creaturescripts.xml
<event type="statschange" name="Monster1" event="script" value="monster1.lua"/>
<event type="statschange" name="Monster2" event="script" value="monster2.lua"/>
  • monsters/monsters.xml
<monster name="Bruce The Fighter" file="Meus Monstros/challenger.xml"/>
<monster name="Bruce The Fighter_evolved" file="Meus Monstros/challenger_evolved.xml"/>


Configuração/Instalação

  • Na parte dos códigos, está indicado o lugar e o nome que o arquivo deverá ter. Não troque;
  • No arquivo monsters1.lua, você pode decidir a porcentagem da vida na qual o Bruce trocará para a forma evoluída. A forma evoluída virá com essa mesma porcentagem de vida;
  • No arquivo monsters2.lua, configure a experiência (exp), o dinheiro (money), o item e a quantidade (count) desse item que o jogador ganhará quando derrotar o Bruce. Também deve-se configurar o tempo de exhaust, como indicado no arquivo;
  • Em Bruce The Fighter.xml, você pode definir as falas, o nome e a aparência inicial do Bruce (se mudar, não esqueça de trocar nos monstros também);
  • No arquivo challenger.lua, escolha se o Bruce irá duelar novamente com o mesmo jogador;
  • Nos arquivos challenger.xml e challenger_evolved.xml você definirá a força, vida e muitas outras coisas do Bruce (se tiver mudado a aparência ou o nome, deve mudar aqui também). Caso não saiba mexer nos monstros, procure um tutorial na seção de tutoriais de scripting;
  • Ao mudar algo do Bruce, verifique o padrão e preste bastante atenção para não esquecer nenhuma parte;
  • O storage que será mudado ao derrotá-lo é 69507, tendo valor inicial -1 (não derrotou nenhuma vez) e aumentando +1 para cada vez que o Bruce é derrotado (0, 1, 2, ...).

Recomendo que o Bruce esteja em uma sala onde somente um jogador de cada vez possa entrar.

Edited by omega blueheaven
Link to comment
Share on other sites

 

Quando ele é derrotado, adiciona um storage (para ser usado como você quiser), itens, dinheiro e experiência.

como eu coloco pra o player so poder usa um item com essa storage?????

 

REP+

Edited by Zaruss
Link to comment
Share on other sites

  • 4 weeks later...

"No arquivo monsters2.lua, configure a experiência (exp), o dinheiro (money), o item e a quantidade (count) desse item que o jogador ganhará quando derrotar o Bruce. Também deve-se configurar o tempo de exhaust, como indicado no arquivo;"

 

Nessa parte ele da erro n entrega a xp e nem os items mais o npc retorna e n ganha nada quando o player mata o monstro.

 

* oque pode ser ?

* Meu server e o TFS 0.3.6pl1.r83

 

Vlw e mais REP pelo NPC.

Edited by garep
Link to comment
Share on other sites

"No arquivo monsters2.lua, configure a experiência (exp), o dinheiro (money), o item e a quantidade (count) desse item que o jogador ganhará quando derrotar o Bruce. Também deve-se configurar o tempo de exhaust, como indicado no arquivo;"

 

Nessa parte ele da erro n entrega a xp e nem os items mais o npc retorna e n ganha nada quando o player mata o monstro.

 

* oque pode ser ?

* Meu server e o TFS 0.3.6pl1.r83

 

Vlw e mais REP pelo NPC.

 

Cara, o NPC aparece, mas ele não dá os itens? Aparece algum erro no executável?

Link to comment
Share on other sites

  • 2 years later...

Estou com esse problema..

 

[Warning - Monsters::loadMonster] Missing voices.speed. (data/monster/novos/bruce/challenger.xml)
[Warning - Monsters::loadMonster] Missing voices.chance. (data/monster/novos/bruce/challenger.xml)

 

Link to comment
Share on other sites

×
×
  • Create New...