예제 #1
0
                private static int GetFilteredDmyPolyID(ParamData.AtkParam.DummyPolySource dmyFilter, int id)
                {
                    if (id < 0)
                    {
                        return(-1);
                    }

                    int check = id / 1000;

                    id = id % 1000;

                    if (dmyFilter == DummyPolySource.None)
                    {
                        return(-1);
                    }
                    else if (dmyFilter == DummyPolySource.Body)
                    {
                        return((check < 10) ? id : -1);
                    }
                    else if (dmyFilter == DummyPolySource.RightWeapon)
                    {
                        return((check == 10 || check == 12) ? id : -1);
                    }
                    else if (dmyFilter == DummyPolySource.LeftWeapon)
                    {
                        return((check == 11 || check == 13 || check == 20) ? id : -1);
                    }

                    return(-1);
                }
예제 #2
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);
                }
            }
        }
예제 #3
0
 public DummyPolyBladeSFX(int ffxid, int startDummyPolyID, int endDummyPolyID,
                          ParamData.AtkParam.DummyPolySource dmySource, Func <bool> checkIfAliveFunc)
 {
     FFXID            = ffxid;
     StartDummyPolyID = startDummyPolyID;
     EndDummyPolyID   = endDummyPolyID;
     DmyPolySource    = dmySource;
     CheckIfAliveFunc = checkIfAliveFunc;
 }
예제 #4
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);
                }
            }
        }
예제 #5
0
 public void SetHitVisibility(ParamData.AtkParam.Hit hit, bool visible, ParamData.AtkParam.DummyPolySource dmyFilter)
 {
     lock (_lock_everything_monkaS)
     {
         if (HitPrims.ContainsKey(hit))
         {
             foreach (var prim in HitPrims[hit])
             {
                 prim.EnableDraw = visible;
             }
         }
         else
         {
             AddNewHitPrim(hit, dmyFilter, visible);
         }
         if (visible && !VisibleHitsToHideForHideAll.Contains(hit))
         {
             VisibleHitsToHideForHideAll.Enqueue(hit);
         }
     }
 }
예제 #6
0
        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);
            }
        }
예제 #7
0
 public int GetFilteredDmyPoly2(ParamData.AtkParam.DummyPolySource dmyFilter)
 {
     return(GetFilteredDmyPolyID(dmyFilter, DmyPoly2));
 }