This commit is contained in:
raa-eruanna 2016-10-04 23:26:50 -04:00
commit 3f020e686f
2 changed files with 24 additions and 5 deletions

View file

@ -138,10 +138,10 @@ void GLSprite::CalculateVertices(FVector3 *v)
mat.Rotate(0, 1, 0, - actor->Angles.Roll.Degrees); mat.Rotate(0, 1, 0, - actor->Angles.Roll.Degrees);
mat.Translate(-x, -z, -y); mat.Translate(-x, -z, -y);
} }
v[0] = mat * FVector3(x1, z, y2); v[0] = mat * FVector3(x2, z, y2);
v[1] = mat * FVector3(x2, z, y2); v[1] = mat * FVector3(x1, z, y2);
v[2] = mat * FVector3(x1, z, y1); v[2] = mat * FVector3(x2, z, y1);
v[3] = mat * FVector3(x2, z, y1); v[3] = mat * FVector3(x1, z, y1);
return; return;
} }

View file

@ -4956,6 +4956,25 @@ FxExpression *FxRuntimeStateIndex::Resolve(FCompileContext &ctx)
return this; return this;
} }
static bool VerifyJumpTarget(AActor *stateowner, FStateParamInfo *stateinfo, int index)
{
PClassActor *cls = stateowner->GetClass();
while (cls != RUNTIME_CLASS(AActor))
{
// both calling and target state need to belong to the same class.
if (cls->OwnsState(stateinfo->mCallingState))
{
return cls->OwnsState(stateinfo->mCallingState + index);
}
// We can safely assume the ParentClass is of type PClassActor
// since we stop when we see the Actor base class.
cls = static_cast<PClassActor *>(cls->ParentClass);
}
return false;
}
static int DecoHandleRuntimeState(VMFrameStack *stack, VMValue *param, int numparam, VMReturn *ret, int numret) static int DecoHandleRuntimeState(VMFrameStack *stack, VMValue *param, int numparam, VMReturn *ret, int numret)
{ {
PARAM_PROLOGUE; PARAM_PROLOGUE;
@ -4963,7 +4982,7 @@ static int DecoHandleRuntimeState(VMFrameStack *stack, VMValue *param, int numpa
PARAM_POINTER(stateinfo, FStateParamInfo); PARAM_POINTER(stateinfo, FStateParamInfo);
PARAM_INT(index); PARAM_INT(index);
if (index == 0 || !stateowner->GetClass()->OwnsState(stateinfo->mCallingState + index)) if (index == 0 || !VerifyJumpTarget(stateowner, stateinfo, index))
{ {
// Null is returned if the location was invalid which means that no jump will be performed // Null is returned if the location was invalid which means that no jump will be performed
// if used as return value // if used as return value