public void SetAttackVisibility(ParamData.AtkParam atk, bool visible, NewChrAsm asm, int dummyPolyOverride, ParamData.AtkParam.DummyPolySource defaultDummyPolySource) { if (dummyPolyOverride >= 0) { var fakeHitRadius = atk.Hits[0].Radius; var fakeHitType = atk.Hits[0].HitType; var fakeHit = new ParamData.AtkParam.Hit() { DmyPoly1 = (short)dummyPolyOverride, DmyPoly2 = -1, Radius = fakeHitRadius, HitType = fakeHitType, }; ShowAttackOnDummyPoly(atk, dummyPolyOverride); SetHitVisibility(fakeHit, visible); } else { bool isFirstValidDmyPoly = true; for (int i = 0; i < atk.Hits.Length; i++) { int dmyPoly1 = atk.Hits[i].DmyPoly1; if (dmyPoly1 == -1) { continue; } var dmyPolySrcToUse = defaultDummyPolySource; if (atk.HitSourceType == 1) { dmyPolySrcToUse = ParamData.AtkParam.DummyPolySource.Body; } if (visible && isFirstValidDmyPoly && dmyPoly1 != -1) { if (asm != null) { var dummyPolySrcOfAtk = atk.Hits[i].GetDmyPoly1SpawnPlace(asm, dmyPolySrcToUse); dummyPolySrcOfAtk.ShowAttackOnDummyPoly(atk, dmyPoly1 % 1000); } else { ShowAttackOnDummyPoly(atk, dmyPoly1); } isFirstValidDmyPoly = false; } var actualHit = atk.Hits[i]; actualHit.DummyPolySourceSpawnedOn = dmyPolySrcToUse; SetHitVisibility(actualHit, visible); } } }
private void CreateHitboxPrimitive(ParamData.AtkParam atkParam, ParamData.AtkParam.Hit hit, Color c, string primText, bool showText) { lock (_lock_hitboxes) { if (!HitboxPrimitiveInfos.ContainsKey(atkParam)) { HitboxPrimitiveInfos.Add(atkParam, new HitboxPrimInfo()); } //if (MODEL.IS_PLAYER) //{ // hit.ShiftDmyPolyIDIntoPlayerWpnDmyPolyID(HitboxPrimitiveInfos[atkParam].IsLeftHandAtk || IsViewingLeftHandHit); //} //if (hit.DmyPoly1 == -1 && hit.DmyPoly2 == -1) // return; if (hit.IsCapsule) { var capsule = new DbgPrimWireCapsule(12, c) { Category = DbgPrimCategory.DummyPolyHelper, EnableDraw = false, OverrideColor = c, Name = showText ? primText : "", EnableNameDraw = false, NameColor = c, }; MODEL.DbgPrimDrawer.AddPrimitive(capsule); HitboxPrimitiveInfos[atkParam].Primitives.Add(capsule); } else { var sphere = new DbgPrimWireSphere(Transform.Default, 1, 12, 12, Color.White) { Category = DbgPrimCategory.DummyPolyHelper, EnableDraw = false, OverrideColor = c, Name = showText ? primText : "", EnableNameDraw = false, NameColor = c, }; MODEL.DbgPrimDrawer.AddPrimitive(sphere); HitboxPrimitiveInfos[atkParam].Primitives.Add(sphere); } } }
public void ShowAttackOnDummyPoly(ParamData.AtkParam atk, int dummyPolyID) { if (!DummyPolyByRefID.ContainsKey(dummyPolyID)) { return; } foreach (var dmy in DummyPolyByRefID[dummyPolyID]) { dmy.ShowAttack = atk; if (!CurrentShowAttackQueueForClearAll.Contains(dmy)) { CurrentShowAttackQueueForClearAll.Enqueue(dmy); } } }
public void DeactivateHitbox(ParamData.AtkParam attack) { lock (_lock_hitboxes) { if (HitboxPrimitiveInfos.ContainsKey(attack)) { HitboxPrimitiveInfos[attack].Deactivate(); } } //if (MODEL.ChrAsm != null) //{ // if (MODEL.ChrAsm.RightWeaponModel != null) // MODEL.ChrAsm.RightWeaponModel.DummyPolyMan.DeactivateHitbox(attack); // if (MODEL.ChrAsm.LeftWeaponModel != null) // MODEL.ChrAsm.LeftWeaponModel.DummyPolyMan.DeactivateHitbox(attack); //} }
public void SetAttackVisibility(ParamData.AtkParam atk, bool visible, ParamData.AtkParam.DummyPolySource dmyFilter) { bool isFirstValidDmyPoly = true; for (int i = 0; i < atk.Hits.Length; i++) { int dmyPoly1 = atk.Hits[i].GetFilteredDmyPoly1(dmyFilter); if (dmyPoly1 == -1) { continue; } if (visible && isFirstValidDmyPoly && dmyPoly1 != -1 && DummyPolyByRefID.ContainsKey(dmyPoly1)) { ShowAttackOnDummyPoly(atk, dmyPoly1); isFirstValidDmyPoly = false; } SetHitVisibility(atk.Hits[i], visible, dmyFilter); } }
private void UpdateHitboxPrimitive(ParamData.AtkParam atkParam) { if (!HitboxPrimitiveInfos.ContainsKey(atkParam)) { return; } for (int i = 0; i < atkParam.Hits.Length; i++) { if (i >= HitboxPrimitiveInfos[atkParam].Primitives.Count) { break; } if (!HitboxPrimitiveInfos[atkParam].Primitives[i].EnableDraw) { continue; } //if (MODEL.IS_PLAYER) // atkParam.Hits[i].ShiftDmyPolyIDIntoPlayerWpnDmyPolyID(HitboxPrimitiveInfos[atkParam].IsLeftHandAtk); if (HitboxPrimitiveInfos[atkParam].Primitives[i] is DbgPrimWireCapsule capsulePrim) { //if (atkParam.Hits[i].DmyPoly1 == -1) // continue; var a = GetDummyPolyAbsolutePosition(atkParam.Hits[i].DmyPoly1, HitboxPrimitiveInfos[atkParam].IsLeftHandAtk); var b = GetDummyPolyAbsolutePosition(atkParam.Hits[i].DmyPoly2, HitboxPrimitiveInfos[atkParam].IsLeftHandAtk); //if (a == null || b == null) //{ // a = MODEL.ParentModelForChrAsm?.DummyPolyMan?.GetDummyPolyAbsolutePosition(atkParam.Hits[i].DmyPoly1); // b = MODEL.ParentModelForChrAsm?.DummyPolyMan?.GetDummyPolyAbsolutePosition(atkParam.Hits[i].DmyPoly2); //} if (a != null && b != null) { capsulePrim.UpdateCapsuleEndPoints(a.Value, b.Value, atkParam.Hits[i].Radius); } else { capsulePrim.UpdateCapsuleEndPoints(Vector3.Zero, Vector3.Zero, 0); } } else if (HitboxPrimitiveInfos[atkParam].Primitives[i] is DbgPrimWireSphere spherePrim) { //if (atkParam.Hits[i].DmyPoly1 == -1) // continue; var dmyPos = GetDummyPolyAbsolutePosition(atkParam.Hits[i].DmyPoly1, HitboxPrimitiveInfos[atkParam].IsLeftHandAtk); var dmyMatrix = GetDummyPolyAbsoluteMatrix(atkParam.Hits[i].DmyPoly1, HitboxPrimitiveInfos[atkParam].IsLeftHandAtk); //if (dmyPos == null || dmyMatrix == null) //{ // dmyPos = MODEL.ParentModelForChrAsm?.DummyPolyMan?.GetDummyPolyAbsolutePosition(atkParam.Hits[i].DmyPoly1); // dmyMatrix = MODEL.ParentModelForChrAsm?.DummyPolyMan?.GetDummyPolyAbsoluteMatrix(atkParam.Hits[i].DmyPoly1); //} if (dmyPos != null && dmyMatrix != null) { var dmyRot = Quaternion.CreateFromRotationMatrix(dmyMatrix.Value); dmyRot.Normalize(); spherePrim.Transform = new Transform(//Matrix.CreateRotationX(MathHelper.PiOver2) * Matrix.CreateScale(atkParam.Hits[i].Radius) * Matrix.CreateFromQuaternion(dmyRot) * Matrix.CreateTranslation(dmyPos.Value)); } else { spherePrim.Transform = new Transform(Vector3.Zero, Vector3.Zero, Vector3.Zero); } } } }