Page 189 of 391

Re: Ask a simple question, get a simple answer

Posted: Wed Feb 01, 2017 11:42 pm
by Mysterious
Hi all.

I am using md_npc monsters in my mod which is cool. Is there a way to stop the damage the party does to them? EG: If the party attacks or cast spells at the monster the damage stuff happens and I don't want that.

Is the a hook or something I can add to the Monster Code. I mean if the monster is attacked nothing happens no blood etc....

I still want the Interact, Set Route, Ongive etc.. to work just not the damage to the monsters. Thanks in advance.

Re: Ask a simple question, get a simple answer

Posted: Thu Feb 02, 2017 12:48 am
by Isaac
Mysterious wrote:Hi all.

I am using md_npc monsters in my mod which is cool. Is there a way to stop the damage the party does to them? EG: If the party attacks or cast spells at the monster the damage stuff happens and I don't want that.

Is the a hook or something I can add to the Monster Code. I mean if the monster is attacked nothing happens no blood etc....

I still want the Interact, Set Route, Ongive etc.. to work just not the damage to the monsters. Thanks in advance.
monster_id.monster:setMonsterFlag("Invulnerable",true)

Attacks may still happen, but show zero damage.

Re: Ask a simple question, get a simple answer

Posted: Thu Feb 02, 2017 1:07 am
by MrChoke
THOM wrote: I know I can do this inside the monster-definition. But what I want to do is to have a monster that behaves like a normal monster and at a certain moment it starts to go to a certain point of the map. So I think I have to add this behaviour during the game to the brain. Or something like that.

BTW the goTo command also understands names of objects, not only items. It works in my dungeon already like this.
Ok, yeah I guess it does make sense that goTo() could be for any object. I guess I never tried anything else. It does have serious limitations though. Of course it will only go after objects on the same level. But even then, if the object is too far or the path too complicated to get to it, the game will ignore the request and not "goTo" anything. It's limitations is one of the main reasons I had to write my own path finding AI.

So here is the easiest way to make a monster do a goTo() on certain condition. Let's say if a floor trigger is activated, he will do the goTo. Here is code that would have to be found in a script called "script_entity_1" on a normal mob: herder_1

Code: Select all

function customThinkFN(brain)
	if floor_trigger_1.floortrigger:isActivated() then
		brain:goTo("dungeon_door_1")
	end
end

function initMonster()
	herder_1.brain:addConnector("onThink", "script_entity_1", "customThinkFN")
end
The way onThink() works is if you do not give a specific brain command, rather you simply return from the function, the default brain behavior will be performed. But as long as that floor trigger is activated, he will not do anything else except goTo that door.

Re: Ask a simple question, get a simple answer

Posted: Thu Feb 02, 2017 1:25 am
by THOM
thanx! works perfect!

Re: Ask a simple question, get a simple answer

Posted: Thu Feb 02, 2017 1:34 pm
by PedroMoniz
Hello,

First I want to say thanks for the ui question, I was looking for the graphics component on the class list and not objects and classes category.

Second, I have a question regarding something I already asked about the traits because it has come up again.

Because I have a usableItem and not an Item, I cannot use item functions such as hasTrait or even have access to itemHooks such as onEquipItem.
I was thinking of creating an itemClone and then use this itemClone for the usableItem that i will have on my scene, thus giving me access to the hook functions.

Is this the best way to proceed in regards to usableItems?

Code: Select all


cloneObject{
	name = "Potion_Energy_IC",
	baseObject = "potion_energy",
    components = {
      {
        class = "Item",
	      uiName = "Potion of energy",
        onEquipItem = function(item, champion, slot) 
            print("yo")
            hooks.script.item_OnEquipItem(item, champion, {"magic"})
        end,

         onUnequipItem = function(item, champion, slot) 
            print("yo")
            hooks.script.item_OnEquipItem(item, champion, {"magic"})
        end
      }
   },
}

cloneObject{
	name = "Potion_Energy",
	baseObject = "Potion_Energy_IC",
    components = {
      {
        class = "UsableItem",
	      uiName = "Potion of energy",
	      onUseItem = function(item, champion)
          hooks.script.item_OnUsePotion(item, champion, {"magic"})
        end,
      }
   },
}

Re: Ask a simple question, get a simple answer

Posted: Thu Feb 02, 2017 2:19 pm
by zimberzimber
UsableItem and Item are defined together for usable items.
Example from the asset pack:

Code: Select all

defineObject{
	name = "potion_energy",
	baseObject = "base_item",
	components = {
		{
			class = "Model",
			model = "assets/models/items/flask.fbx",
		},
		{
			class = "Item",
			uiName = "Energy Potion",
			gfxIndex = 145,
			weight = 0.3,
			stackable = true,
			traits = { "potion" },
		},
		{
			class = "UsableItem",
			--emptyItem = "flask",
			sound = "consume_potion",
			onUseItem = function(self, champion)
				champion:regainEnergy(75)
				champion:playHealingIndicator()
			end,
		},
	},
}
You can use all defined hooks for these components and they will interact fine.
Components usually have no interactions between each other can be used together.

Re: Ask a simple question, get a simple answer

Posted: Thu Feb 02, 2017 2:20 pm
by zimberzimber
Question - Can someone please explain to me the point of the 'cloneObject' add-on when you can just define an object from a base one?

Re: Ask a simple question, get a simple answer

Posted: Thu Feb 02, 2017 2:25 pm
by PedroMoniz
Thank you, did not realise the components worked like that. Does make a lot of sense and it is helpfull.

However, i still have one problem.

Code: Select all

cloneObject{
	name = "Potion_Energy",
	baseObject = "potion_energy",
    components = {
      {
        class = "UsableItem",
	      onUseItem = function(item, champion)
          print(item:getWeight())
        end,
      },
      {
        class = "Item",
        onEquipItem = function(item, champion, slot) 
          print(item:getWeight())
        end,
      }
   },
}
I cannot do something as simple as a getWeigtht although the item has weight.
Any work around?

Re: Ask a simple question, get a simple answer

Posted: Thu Feb 02, 2017 3:02 pm
by zimberzimber
This has to do with references.

I suggest you start using 'self' instead of 'item', would make understanding easier.
The first variable indexes the component that calls the hook.
The UsableItem function's 'item' variable is the equivalent of objectID.usableitem
The Item function's 'item' variable is the equivalent of objectID.item
Since UsableItem doesn't have a getWeight() function, which is why it crashes.
To check the weight of the item through the UsableItem components functions, you'll have to use this:

Code: Select all

onUseItem = function(self, champion)
	print(self.go.item:getWeight())
end

self.go
is called from a components function, and references to the game object holding the component that called self.go
self.go.item:getWeight() from a component = objectID.item:getWeight()

Re: Ask a simple question, get a simple answer

Posted: Thu Feb 02, 2017 8:12 pm
by PedroMoniz
thank you,

A question, is it possible to get the traits? There is an add and a has function, but is there any work around to find the traits?