Page 253 of 396
Re: Ask a simple question, get a simple answer
Posted: Mon Sep 03, 2018 11:08 am
by Khollik
An alternate solution would be to position the two objects at the same location and enable/disable models when needed, for instance:
Code: Select all
function switchcandle()
candle1.model:enable()
candle2.model:disable()
candle1.light:enable()
candle2.light:disable()
end
function switchback()
candle1.model:disable()
candle2.model:enable()
etc.
end
It's maybe not very elegant but it helped me sometimes not messing around with setWorldPosition
K.
Re: Ask a simple question, get a simple answer
Posted: Mon Sep 03, 2018 3:16 pm
by Pompidom
That's it. It's perfect!
Re: Ask a simple question, get a simple answer
Posted: Mon Sep 03, 2018 6:07 pm
by Isaac
If those candles can be picked up, you might want to ensure that their item information matches their appearance when they are inspected in inventory.
Re: Ask a simple question, get a simple answer
Posted: Sun Sep 09, 2018 5:31 pm
by Huff
I'm attempting to replicate the attack functionality for hitting monsters in the onHitMonster hook for weapons. My goal is to be able to use custom damage formulas that change protection to a percentage based 0 to 100% instead of flat addition and subtraction.
Here's what I've got so far:
Code: Select all
function hitMonster(self, attack, monster, tside, damage, champion)
local damageType = attack:getDamageType()
if damageType == "physical" or not damageType then
local dmg = damage
local pierce = attack:getPierce()
local protection = monster:getProtection()
if pierce then
protection = protection - pierce
end
if protection > 0 and protection < 100 then
dmg = math.max(1, math.floor(dmg * (1 - (protection * .01))))
elseif protection >= 100 then
dmg = 1
else -- protection <= 0
-- do nothing
end
local dmgText = ""..dmg
monster:setHealth(monster:getHealth() - dmg)
monster:showDamageText(dmgText, "FFFFFF")
playSoundAt(monster:getHitSound(), monster.go.level, monster.go.x, monster.go.y)
if monster:getHealth() <= 0 then
monster:die()
else
if monster:getHitEffect() then
local particle = spawn("particle_system", monster.go.level, monster.go.x, monster.go.y, monster.go.facing, monster.go.elevation)
particle.particle:setParticleSystem(monster:getHitEffect())
particle:setWorldPositionY(monster:getCapsuleHeight())
end
if not monster:getCurrentAction() and not monster:isPerformingAction("damaged") then
if tside == 0 then
if champion == party.party:getChampion(1) or champion == party.party:getChampion(3) then
monster.go.animation:play("getHitFrontRight")
else
monster.go.animation:play("getHitFrontLeft")
end
elseif tside == 1 then
monster.go.animation:play("getHitRight")
elseif tside == 2 then
monster.go.animation:play("getHitBack")
elseif tside == 3 then
monster.go.animation:play("getHitLeft")
end
end
end
end
end
Everything here works except for the monster's interrupted state. Currently, this just plays the animation of getting hit, but doesn't actually put them in the "damaged" action state which stops them from attacking, moving, etc.
One thing I have tried is disabling the monster's brain class temporarily with use of delayedCall, but it has mixed results since the number of frames on getHit animations varies. I think it may also break scripted monsters too.
I'm wondering if there's some built-in function I'm not seeing like monster:performAction("damagedFrontRight").
Re: Ask a simple question, get a simple answer
Posted: Tue Sep 11, 2018 11:20 am
by akroma222
Huff wrote: ↑Sun Sep 09, 2018 5:31 pm
I'm attempting to replicate the attack functionality for hitting monsters in the onHitMonster hook for weapons. My goal is to be able to use custom damage formulas that change protection to a percentage based 0 to 100% instead of flat addition and subtraction.
Everything here works except for the monster's interrupted state. Currently, this just plays the animation of getting hit, but doesn't actually put them in the "damaged" action state which stops them from attacking, moving, etc.
One thing I have tried is disabling the monster's brain class temporarily with use of delayedCall, but it has mixed results since the number of frames on getHit animations varies. I think it may also break scripted monsters too.
I'm wondering if there's some built-in function I'm not seeing like monster:performAction("damagedFrontRight").
Hey Huff!
in order to get knockbacks happening cleanly (even while the monster is doing something at the time) .... minmay posted this:
Code: Select all
onHitMonster = function(self, monster)
if monster:isAlive() and not monster:isFalling() and monster:getCurrentAction() ~= "knockback" then
monster.go:setPosition(monster.go.x,monster.go.y,monster.go.facing,monster.go.elevation,monster.go.level)
monster:knockback(party.facing)
end
end,
... with the explanation:
Setting a monster's position is the easiest way to interrupt monster actions.
Perhaps this can help??
Also, not sure if you know... afaik, when a monster is hit and damaged, a component called 'damaged' is created and attached to the monster game object. This component has a field called 'animation' and it is = to the current (or last) animation used when the monster was hit / needed to perform the 'damaged' action. Unsure if this component is destroyed and recreated when the monster is hit again or whether the animation field is just updated.
Also, how do you plan on handling Firearm weapons - as they do not have an onHitMonster() hook.... ??
(I ask because thats what I am stuck on, working on the same thing....)
Akroma
Re: Ask a simple question, get a simple answer
Posted: Thu Sep 13, 2018 1:56 am
by Huff
Setting the monster's position is a great way to interrupt them, but the "damaged" action state is different as it locks the monster in place for the duration of their getHit animation. I think there may be a way to pull it off using a custom MonsterAction component.
Firearm attacks actually do have an onHitMonster hook inherited from the MeleeAttack component by the way!
Re: Ask a simple question, get a simple answer
Posted: Thu Sep 13, 2018 6:08 am
by minmay
Said "damaged" component is just a plain MonsterActionComponent without any special frills. This would be the code for recreating that behaviour:
Code: Select all
function monsterDamageAnimation(monster, anim)
if monster:getCurrentAction() == nil then
if not monster.go.damaged then
monster.go:createComponent("MonsterAction","damaged")
end
monster.go.damaged:setAnimation(anim)
monster:performAction("damaged")
end
Call this every time a monster gets hit for more than 0 damage by something with the DamageFlags.Impact flag. The
monster parameter should be the MonsterComponent and the
anim parameter should be the name of the animation to play ("getHitBack", "getHitFrontLeft", "getHitFrontRight", "getHitLeft", or "getHitRight").
If you wish to interrupt the current action, then you could use that setPosition hack I described first, but keep in mind that this would be undesirable for a lot of actions (such as moving).
Re: Ask a simple question, get a simple answer
Posted: Thu Sep 13, 2018 6:08 pm
by akroma222
Huff wrote: ↑Thu Sep 13, 2018 1:56 am
Firearm attacks actually do have an onHitMonster hook inherited from the MeleeAttack component by the way!
Ahhh this is good news indeed!
I sorted a work around but it was messy (and unnecessary lol)
minmay wrote: ↑Thu Sep 13, 2018 6:08 am
Said "damaged" component is just a plain MonsterActionComponent without any special frills. This would be the code for recreating that behaviour:
Code: Select all
function monsterDamageAnimation(monster, anim)
if monster:getCurrentAction() == nil then
if not monster.go.damaged then
monster.go:createComponent("MonsterAction","damaged")
end
monster.go.damaged:setAnimation(anim)
monster:performAction("damaged")
end
Call this every time a monster gets hit for more than 0 damage by something with the DamageFlags.Impact flag. The monster parameter should be the MonsterComponent and the anim parameter should be the name of the animation to play ("getHitBack", "getHitFrontLeft", "getHitFrontRight", "getHitLeft", or "getHitRight").
If you wish to interrupt the current action, then you could use that setPosition hack I described first, but keep in mind that this would be undesirable for a lot of actions (such as moving).
This is also all very good news!
Thanks for clearing that up minmay, that really is golden
Re: Ask a simple question, get a simple answer
Posted: Thu Sep 13, 2018 7:17 pm
by tantalan
Hi, I haven't played Grimrock for a while - I completed both games and I am really sad, that there is not going to be a Grimrock 3. Why? Because the second part was better than first, that is really uncommon in video, games industry so third part would be the best I guess.
My question.
Have someone played all (most of) of these mods and by players created dungeons and could you recommend me "Grimrock like" game - I mean custom dungeon mod that would the most remind Grimrock like adventure (riddles, balance of items etc. I dont mean exactly the same dungeon as Grimrock). I have played several dungeons and they are pretty not well balanced - I receive superior armor in the beginning etc. Please recommend me - relatively long, but well balanced dungeon, but if possible not very hard in the beginning, so i can go through easily.
Ragards Tantalan - Czech republic, Prague
Re: Ask a simple question, get a simple answer
Posted: Thu Sep 13, 2018 8:20 pm
by kelly1111
my personal favorites:
labyrinth of lies
tomb of zarthos
the mine of malan vael