Advertisement
expired6978

Untitled

Dec 20th, 2019
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.54 KB | None | 0 0
  1. struct BSContainer
  2. {
  3.     enum ForEachResult
  4.     {
  5.         kAbort = 0,
  6.         kContinue
  7.     };
  8. };
  9.  
  10. class ActiveEffect;
  11. class Character;
  12. // 18
  13. class MagicTarget
  14. {
  15. public:
  16.     virtual ~MagicTarget();
  17.  
  18.     virtual UInt8                   Unk_01(int);
  19.     virtual Character               * Unk_02(void);
  20.     virtual UInt8                   Unk_03(void);
  21.     virtual bool                    Unk_04(void);
  22.     virtual int                     Unk_05(int);
  23.     virtual bool                    Unk_06(void); // pure   030
  24.     virtual void                    GetActiveEffects(void); // This changed to return BSLocklessSimpleList<ActiveEffect *>, instead we will implement the Visitor and let the game do the work for traversal
  25.     virtual int                     Unk_08(int);
  26.     virtual void                    Unk_09(int);
  27.     virtual double                  Unk_0A(int, int, int);
  28.     virtual UInt8                   Unk_0B(int, int, int);
  29.  
  30. //  void    ** _vtbl;   // 00
  31.     UInt64 unk04;       // 08
  32.     UInt64 unk08;       // 10
  33.  
  34.     class ForEachActiveEffectVisitor
  35.     {
  36.     public:
  37.         virtual ~ForEachActiveEffectVisitor() { };
  38.  
  39.         virtual BSContainer::ForEachResult Visit(ActiveEffect* effect) = 0;
  40.     };
  41.  
  42.     class GetEffectCount : public MagicTarget::ForEachActiveEffectVisitor
  43.     {
  44.     public:
  45.         GetEffectCount() : m_count(0) { }
  46.  
  47.         virtual BSContainer::ForEachResult Visit(ActiveEffect* effect) override
  48.         {
  49.             m_count++;
  50.             return BSContainer::ForEachResult::kContinue;
  51.         }
  52.  
  53.         UInt32 GetCount() const { return m_count; }
  54.     private:
  55.         UInt32 m_count;
  56.     };
  57.  
  58.     class GetNthEffect : public MagicTarget::ForEachActiveEffectVisitor
  59.     {
  60.     public:
  61.         GetNthEffect(UInt32 n) : m_result(nullptr), m_n(n), m_count(0) { }
  62.  
  63.         virtual BSContainer::ForEachResult Visit(ActiveEffect* effect) override
  64.         {
  65.             if (m_count == m_n)
  66.             {
  67.                 m_result = effect;
  68.                 return BSContainer::ForEachResult::kAbort;
  69.             }
  70.             m_count++;
  71.             return BSContainer::ForEachResult::kContinue;
  72.         }
  73.  
  74.         ActiveEffect* GetResult() { return m_result; }
  75.     private:
  76.         ActiveEffect* m_result;
  77.         UInt32 m_n;
  78.         UInt32 m_count;
  79.     };
  80.  
  81.     class EffectVisitor : public MagicTarget::ForEachActiveEffectVisitor
  82.     {
  83.     public:
  84.         EffectVisitor(std::function<BSContainer::ForEachResult(ActiveEffect*)> func) : m_functor(func) { }
  85.  
  86.         virtual BSContainer::ForEachResult Visit(ActiveEffect* effect) override
  87.         {
  88.             return m_functor(effect);
  89.         }
  90.  
  91.     protected:
  92.         std::function<BSContainer::ForEachResult(ActiveEffect*)> m_functor;
  93.     };
  94.  
  95.     void VisitActiveEffects(std::function<BSContainer::ForEachResult(ActiveEffect*)> func)
  96.     {
  97.         ForEachActiveEffect(EffectVisitor(func));
  98.     }
  99.  
  100.     DEFINE_MEMBER_FN_1(ForEachActiveEffect, void, 0x00558580, MagicTarget::ForEachActiveEffectVisitor& visitor);
  101. };
  102. STATIC_ASSERT(sizeof(MagicTarget) == 0x18);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement