Sorry to bump this topic but I have something to share.
Quoting POTS:
P2stateno
There's this elusive Mugen bug where if a helper (or possibly player 3/4) hits you in the exact same moment you connect with a throw, your character will be hit out of it but your target will still be sent to custom states and (usually) get stuck there. To solve this simply forget that the p2stateno Hitdef parameter exists and get used to TargetState instead.
To achieve the same effect as P2stateno in throws, you can keep using P1stateno then use TargetState when the character starts throwing.
This happens because many creators are lazy (including me sometimes, hehe). The make this works well requires that you pay attention with some things you probabily make in another way.
I will explain why:
- When you use TargetBind you should especify a time that this bind will still occour, many creators just ignore this.
[State 0, TargetBind]
type = TargetBind
trigger1 = AnimElem = 2 ; <-change for what suits you
time = 10 ;<- THIS
...
Lets take this animation as an example:
[Begin Action 1]
Clsn2Default: 1
Clsn2[0] = -1, -79, 21, -47
0,0, 0,0, 3,
0,1, 0,0, 10,
0,2, 0,0, 3,
0,3, 0,0, 3,
Pay attention at the 2nd element of the anim above. It last 10 ticks.
So, if p2 will be bound at the same position during the 2nd element, it needs to be bound at the same place for the same ammount of time.
Most of times, on the 3rd elem, the target will be bound in another position. If you still need the p2 bound at the same position at the 3rd elem (taking the anim above as example), you will need to change the time to the duration of the 2nd and 3rd elements - 13 ticks.
Maybe you're thiking that this is useless, but try to use a char without this bindtime on stages which the ground moves up and down - POTS Skies over Aengmore is a good example. You will notice that the p2 doesn't get bound to the right position, because it doesn't "follow" your char. To see it fully, you need a char which binds p2 at the same position for a good amount of time, you will won't notice very much.
Then, doing this, you simply use a single trigger on the custom state, which many creators forgets even that it exists:
IsBound
[State 820, 2]
type = SelfState
trigger1 = !gethitvar(isbound) ;<- THIS
value = 5050
isbound: True if the player is the subject of an attacker's
TargetBind controller. Useful to prevent being stuck in
thrown states. (int)
Using this, if you put p2 on a custom state but you're hitted at the same time, that trigger will make p2 fall and to not get stuck.
What bindtime and isbound has in common?
Its simple: if p2 is on a custom state for a time greater than normal (for example, when p1 is hitted while grab), p2 will fall on the ground.
And if don't put the bindtime and use the isbound trigger, p2 will fall at the next tick you hit him, because the bindtime default is 1 and, on the next tick (2), it isn't bound anymore, so the grab will fail.
I hope that people can understand my poor english