示例#1
0
        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);
                }
            }
        }
示例#2
0
        private void AddNewHitPrim(ParamData.AtkParam.Hit hit, ParamData.AtkParam.DummyPolySource dmyFilter, bool visible = false, bool dontUpdate = false)
        {
            if (!HitPrims.ContainsKey(hit))
            {
                HitPrims.Add(hit, new List <IDbgPrim>());
            }

            if (!HitFilters.ContainsKey(hit))
            {
                HitFilters.Add(hit, dmyFilter);
            }
            else
            {
                HitFilters[hit] = dmyFilter;
            }

            if (hit.IsCapsule)
            {
                HitPrims[hit].Add(new DbgPrimWireCapsule(hit.GetColor())
                {
                    EnableDraw = visible,
                    Category   = DbgPrimCategory.DummyPolyHelper,
                    //OverrideColor = hit.GetColor(),
                });
            }
            else
            {
                if (DummyPolyByRefID.ContainsKey(hit.DmyPoly1))
                {
                    foreach (var dmy in DummyPolyByRefID[hit.DmyPoly1])
                    {
                        HitPrims[hit].Add(new DbgPrimWireSphere(new Transform(Matrix.CreateScale(hit.Radius) *
                                                                              dmy.ReferenceMatrix), Color.White)
                        {
                            EnableDraw    = visible,
                            Category      = DbgPrimCategory.DummyPolyHelper,
                            OverrideColor = hit.GetColor(),
                        });
                    }
                }
            }

            lock (_lock_everything_monkaS)
            {
                if (visible && !VisibleHitsToHideForHideAll.Contains(hit))
                {
                    VisibleHitsToHideForHideAll.Enqueue(hit);
                }

                if (!dontUpdate)
                {
                    UpdateHitPrim(hit);
                }
            }
        }
示例#3
0
        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);
                }
            }
        }
示例#4
0
 public void SetHitVisibility(ParamData.AtkParam.Hit hit, bool visible)
 {
     lock (_lock_everything_monkaS)
     {
         if (HitPrims.ContainsKey(hit))
         {
             foreach (var prim in HitPrims[hit])
             {
                 prim.EnableDraw = visible;
             }
         }
         else
         {
             AddNewHitPrim(hit, visible);
         }
         if (visible && !VisibleHitsToHideForHideAll.Contains(hit))
         {
             VisibleHitsToHideForHideAll.Enqueue(hit);
         }
     }
 }
示例#5
0
        //private Dictionary<ParamData.AtkParam.Hit, ParamData.AtkParam.DummyPolySource> HitFilters
        //    = new Dictionary<ParamData.AtkParam.Hit, ParamData.AtkParam.DummyPolySource>();

        //private Dictionary<DummyPolyBladeSFX, ParamData.AtkParam.DummyPolySource> BladeSfxHitFilters
        //    = new Dictionary<DummyPolyBladeSFX, ParamData.AtkParam.DummyPolySource>();

        private void UpdateHitPrim(ParamData.AtkParam.Hit hit)
        {
            lock (_lock_everything_monkaS)
            {
                var dmyA = hit.GetDmyPoly1Locations(MODEL, hit.DummyPolySourceSpawnedOn);
                var dmyB = hit.GetDmyPoly2Locations(MODEL, hit.DummyPolySourceSpawnedOn);



                if (hit.IsCapsule)
                {
                    ((DbgPrimWireCapsule)HitPrims[hit][0]).UpdateCapsuleEndPoints(Vector3.Transform(Vector3.Zero, dmyA[0]), Vector3.Transform(Vector3.Zero, dmyB[0]), hit.Radius);
                }
                else
                {
                    if (dmyA.Count > HitPrims[hit].Count)
                    {
                        AddNewHitPrim(hit, dontUpdate: true);
                    }

                    for (int i = 0; i < Math.Min(HitPrims[hit].Count, dmyA.Count); i++)
                    {
                        Matrix     m  = dmyA[i];
                        Quaternion q  = Quaternion.CreateFromRotationMatrix(m);
                        Matrix     rm = Matrix.CreateFromQuaternion(Quaternion.Normalize(q));
                        Matrix     tm = Matrix.CreateTranslation(Vector3.Transform(Vector3.Zero, m));
                        HitPrims[hit][i].Transform = new Transform(Matrix.CreateScale(hit.Radius) * rm * tm);
                    }
                }

                for (int i = 0; i < HitPrims[hit].Count; i++)
                {
                    HitPrims[hit][i].OverrideColor = hit.GetColor();
                }
            }
        }
示例#6
0
        private void UpdateHitPrim(ParamData.AtkParam.Hit hit)
        {
            lock (_lock_everything_monkaS)
            {
                int dmyPoly1 = hit.DmyPoly1;
                int dmyPoly2 = hit.DmyPoly2;

                var filter = ParamData.AtkParam.DummyPolySource.Body;

                if (HitFilters.ContainsKey(hit))
                {
                    dmyPoly1 = hit.GetFilteredDmyPoly1(HitFilters[hit]);
                    dmyPoly2 = hit.GetFilteredDmyPoly2(HitFilters[hit]);
                    filter   = HitFilters[hit];
                }

                if (hit.IsCapsule)
                {
                    if (DummyPolyByRefID.ContainsKey(dmyPoly1) && DummyPolyByRefID.ContainsKey(dmyPoly2))
                    {
                        Vector3 pointA = Vector3.Transform(Vector3.Zero, DummyPolyByRefID[dmyPoly1][0].CurrentMatrix);
                        Vector3 pointB = Vector3.Transform(Vector3.Zero, DummyPolyByRefID[dmyPoly2][0].CurrentMatrix);

                        ((DbgPrimWireCapsule)HitPrims[hit][0]).UpdateCapsuleEndPoints(pointA, pointB, hit.Radius);
                    }
                    else
                    {
                        ((DbgPrimWireCapsule)HitPrims[hit][0]).UpdateCapsuleEndPoints(Vector3.Zero, Vector3.Zero, hit.Radius);
                    }
                }
                else
                {
                    if (dmyPoly1 == -1 || hit.Radius == 0)
                    {
                        for (int i = 0; i < HitPrims[hit].Count; i++)
                        {
                            HitPrims[hit][i].Transform = new Transform(Matrix.CreateScale(hit.Radius));
                        }
                    }
                    else if (DummyPolyByRefID.ContainsKey(dmyPoly1))
                    {
                        if (DummyPolyByRefID[dmyPoly1].Count != HitPrims[hit].Count)
                        {
                            AddNewHitPrim(hit, filter, false, dontUpdate: true);
                        }

                        for (int i = 0; i < Math.Min(HitPrims[hit].Count, DummyPolyByRefID[dmyPoly1].Count); i++)
                        {
                            Matrix     m  = DummyPolyByRefID[dmyPoly1][i].CurrentMatrix;
                            Quaternion q  = Quaternion.CreateFromRotationMatrix(m);
                            Matrix     rm = Matrix.CreateFromQuaternion(q);
                            Matrix     tm = Matrix.CreateTranslation(Vector3.Transform(Vector3.Zero, m));
                            HitPrims[hit][i].Transform = new Transform(Matrix.CreateScale(hit.Radius) * rm * tm);
                        }
                    }
                    else
                    {
                        for (int i = 0; i < HitPrims[hit].Count; i++)
                        {
                            HitPrims[hit][i].Transform = new Transform(Matrix.CreateScale(hit.Radius));
                        }
                    }
                }
            }
        }