mirror of
https://github.com/zeldaret/ss
synced 2026-08-05 17:43:38 -04:00
JPAEmitterManager OK
This commit is contained in:
@@ -53,8 +53,8 @@ struct JPABaseShapeAlphaArg {
|
||||
*/
|
||||
struct JPABaseShape {
|
||||
public:
|
||||
/* 8027A6DC */ JPABaseShape(u8 const*, EGG::Heap*);
|
||||
/* 8027A7E8 */ void setGX(JPAEmitterWorkData*) const;
|
||||
JPABaseShape(u8 const*, EGG::Heap*);
|
||||
void setGX(JPAEmitterWorkData*) const;
|
||||
|
||||
static GXBlendMode st_bm[3];
|
||||
static GXBlendFactor st_bf[10];
|
||||
|
||||
@@ -43,7 +43,7 @@ struct JPAChildShapeData {
|
||||
*/
|
||||
class JPAChildShape {
|
||||
public:
|
||||
/* 8027B038 */ JPAChildShape(u8 const*);
|
||||
JPAChildShape(u8 const*);
|
||||
|
||||
f32 getPosRndm() const { return mpData->mPosRndm; }
|
||||
f32 getBaseVel() const { return mpData->mBaseVel; }
|
||||
|
||||
@@ -62,9 +62,9 @@ enum {
|
||||
*/
|
||||
class JPADynamicsBlock {
|
||||
public:
|
||||
/* 8027BB18 */ JPADynamicsBlock(u8 const*);
|
||||
/* 8027BB4C */ void init();
|
||||
/* 8027BBE8 */ void create(JPAEmitterWorkData*);
|
||||
JPADynamicsBlock(u8 const*);
|
||||
void init();
|
||||
void create(JPAEmitterWorkData*);
|
||||
|
||||
void calc(JPAEmitterWorkData* work) { mpCalcVolumeFunc(work); }
|
||||
|
||||
|
||||
@@ -75,12 +75,12 @@ struct JPAEmitterWorkData {
|
||||
class JPAEmitterCallBack {
|
||||
public:
|
||||
virtual ~JPAEmitterCallBack() = 0;
|
||||
/* 80050368 */ virtual void execute(JPABaseEmitter*) {}
|
||||
/* 80050374 */ virtual void executeAfter(JPABaseEmitter*) {}
|
||||
/* 8005036C */ virtual void draw(JPABaseEmitter*) {}
|
||||
/* 80050370 */ virtual void drawAfter(JPABaseEmitter*) {}
|
||||
|
||||
/* 8027E6A4 */ //~JPAEmitterCallBack();
|
||||
virtual void execute(JPABaseEmitter*) {}
|
||||
virtual void executeAfter(JPABaseEmitter*) {}
|
||||
virtual void draw(JPABaseEmitter*) {}
|
||||
virtual void drawAfter(JPABaseEmitter*) {}
|
||||
|
||||
//~JPAEmitterCallBack();
|
||||
};
|
||||
|
||||
enum {
|
||||
@@ -100,18 +100,18 @@ enum {
|
||||
*/
|
||||
class JPABaseEmitter {
|
||||
public:
|
||||
/* 8027E5EC */ ~JPABaseEmitter() {}
|
||||
/* 8027E64C */ JPABaseEmitter() : mLink(this), mRndm(0) {}
|
||||
/* 8027E6EC */ void init(JPAEmitterManager*, JPAResource*);
|
||||
/* 8027EDD4 */ bool processTillStartFrame();
|
||||
/* 8027EE14 */ bool processTermination();
|
||||
/* 8027EEB0 */ void calcEmitterGlobalPosition(EGG::Vector3f*) const;
|
||||
/* 8027EC60 */ void deleteAllParticle();
|
||||
/* 8027EB60 */ JPABaseParticle* createChild(JPABaseParticle*);
|
||||
/* 8027EA40 */ JPABaseParticle* createParticle();
|
||||
/* 8027EF30 */ u32 getCurrentCreateNumber() const;
|
||||
/* 8027EF40 */ u8 getDrawCount() const;
|
||||
/* 8027EF50 */ bool loadTexture(u8, GXTexMapID);
|
||||
~JPABaseEmitter() {}
|
||||
JPABaseEmitter() : mLink(this), mRndm(0) {}
|
||||
void init(JPAEmitterManager*, JPAResource*);
|
||||
bool processTillStartFrame();
|
||||
bool processTermination();
|
||||
void calcEmitterGlobalPosition(EGG::Vector3f*) const;
|
||||
void deleteAllParticle();
|
||||
JPABaseParticle* createChild(JPABaseParticle*);
|
||||
JPABaseParticle* createParticle();
|
||||
u32 getCurrentCreateNumber() const;
|
||||
u8 getDrawCount() const;
|
||||
bool loadTexture(u8, GXTexMapID);
|
||||
|
||||
void initStatus(u32 status) { mStatus = status; }
|
||||
void setStatus(u32 status) { mStatus |= status; }
|
||||
|
||||
@@ -21,17 +21,21 @@ struct JPAEmitterWorkData;
|
||||
*/
|
||||
class JPAEmitterManager {
|
||||
public:
|
||||
/* 8027DCA0 */ JPAEmitterManager(u32, u32, EGG::Heap*, u8, u8);
|
||||
/* 8027DEBC */ JPABaseEmitter* createSimpleEmitterID(EGG::Vector3f const&, u16, u8, u8,
|
||||
JPAEmitterManager(u32, u32, EGG::Heap*, u8, u8);
|
||||
JPABaseEmitter* createSimpleEmitterID(EGG::Vector3f const&, u16, u8, u8,
|
||||
JPAEmitterCallBack*, JPAParticleCallBack*);
|
||||
/* 8027DFA0 */ void calc(u8);
|
||||
/* 8027E028 */ void draw(JPADrawInfo const*, u8);
|
||||
/* 8027E220 */ void forceDeleteAllEmitter();
|
||||
/* 8027E278 */ void forceDeleteGroupEmitter(u8);
|
||||
/* 8027E2D8 */ void forceDeleteEmitter(JPABaseEmitter*);
|
||||
/* 8027E344 */ void entryResourceManager(JPAResourceManager*, u8);
|
||||
/* 8027E354 */ void clearResourceManager(u8);
|
||||
/* 8027E3F4 */ void calcYBBCam();
|
||||
|
||||
~JPAEmitterManager() {}
|
||||
|
||||
void fn_80320E20(u8, f32, f32); // SS addition
|
||||
void calc(u8);
|
||||
void draw(JPADrawInfo const*, u8);
|
||||
void forceDeleteAllEmitter();
|
||||
void forceDeleteGroupEmitter(u8);
|
||||
void forceDeleteEmitter(JPABaseEmitter*);
|
||||
void entryResourceManager(JPAResourceManager*, u8);
|
||||
void clearResourceManager(u8);
|
||||
void calcYBBCam();
|
||||
JPAResourceManager* getResourceManager(u16 idx) { return pResMgrAry[idx]; }
|
||||
|
||||
public:
|
||||
|
||||
@@ -27,7 +27,7 @@ struct JPAExTexShapeData {
|
||||
*/
|
||||
class JPAExTexShape {
|
||||
public:
|
||||
/* 8027B13C */ JPAExTexShape(u8 const*);
|
||||
JPAExTexShape(u8 const*);
|
||||
|
||||
const f32* getIndTexMtx() const { return &mpData->mIndTexMtx[0][0]; }
|
||||
s8 getExpScale() const { return mpData->mExpScale; }
|
||||
|
||||
@@ -46,8 +46,8 @@ struct JPAExtraShapeData {
|
||||
*/
|
||||
class JPAExtraShape {
|
||||
public:
|
||||
/* 8027AD88 */ JPAExtraShape(u8 const*);
|
||||
/* 8027ADBC */ void init();
|
||||
JPAExtraShape(u8 const*);
|
||||
void init();
|
||||
|
||||
f32 getScaleInTiming() const { return mpData->mScaleInTiming; }
|
||||
f32 getScaleOutTiming() const { return mpData->mScaleOutTiming; }
|
||||
|
||||
@@ -11,92 +11,92 @@ class JPAFieldBlock;
|
||||
|
||||
class JPAFieldBase {
|
||||
public:
|
||||
/* 8027BDEC */ void calcAffect(JPAFieldBlock*, JPABaseParticle*);
|
||||
/* 8027BF18 */ f32 calcFadeAffect(JPAFieldBlock*, f32) const;
|
||||
void calcAffect(JPAFieldBlock*, JPABaseParticle*);
|
||||
f32 calcFadeAffect(JPAFieldBlock*, f32) const;
|
||||
|
||||
/* 8027D3AC */ virtual ~JPAFieldBase() {}
|
||||
/* 80276A8C */ virtual void prepare(JPAEmitterWorkData*, JPAFieldBlock*) {}
|
||||
virtual ~JPAFieldBase() {}
|
||||
virtual void prepare(JPAEmitterWorkData*, JPAFieldBlock*) {}
|
||||
virtual void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*) = 0;
|
||||
|
||||
/* 0x04 */ EGG::Vector3f mAccel;
|
||||
};
|
||||
|
||||
class JPAFieldGravity : public JPAFieldBase {
|
||||
public:
|
||||
void prepare(JPAEmitterWorkData*, JPAFieldBlock*);
|
||||
void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*);
|
||||
~JPAFieldGravity() {}
|
||||
};
|
||||
|
||||
class JPAFieldAir : public JPAFieldBase {
|
||||
public:
|
||||
void prepare(JPAEmitterWorkData*, JPAFieldBlock*);
|
||||
void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*);
|
||||
~JPAFieldAir() {}
|
||||
};
|
||||
|
||||
class JPAFieldMagnet : public JPAFieldBase {
|
||||
public:
|
||||
void prepare(JPAEmitterWorkData*, JPAFieldBlock*);
|
||||
void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*);
|
||||
~JPAFieldMagnet() {}
|
||||
|
||||
/* 0x10 */ EGG::Vector3f mDir;
|
||||
};
|
||||
|
||||
class JPAFieldNewton : public JPAFieldBase {
|
||||
public:
|
||||
void prepare(JPAEmitterWorkData*, JPAFieldBlock*);
|
||||
void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*);
|
||||
~JPAFieldNewton() {}
|
||||
|
||||
/* 0x10 */ EGG::Vector3f mDir;
|
||||
/* 0x1C */ f32 mCutoff;
|
||||
};
|
||||
|
||||
class JPAFieldVortex : public JPAFieldBase {
|
||||
public:
|
||||
/* 8027C56C */ void prepare(JPAEmitterWorkData*, JPAFieldBlock*);
|
||||
/* 8027C674 */ void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*);
|
||||
/* 8027D564 */ ~JPAFieldVortex() {}
|
||||
void prepare(JPAEmitterWorkData*, JPAFieldBlock*);
|
||||
void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*);
|
||||
~JPAFieldVortex() {}
|
||||
|
||||
/* 0x10 */ EGG::Vector3f field_0x10;
|
||||
/* 0x1C */ f32 field_0x1c;
|
||||
/* 0x20 */ f32 field_0x20;
|
||||
};
|
||||
|
||||
class JPAFieldSpin : public JPAFieldBase {
|
||||
public:
|
||||
/* 8027CE64 */ void prepare(JPAEmitterWorkData*, JPAFieldBlock*);
|
||||
/* 8027CFA8 */ void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*);
|
||||
/* 8027D3F4 */ ~JPAFieldSpin() {}
|
||||
|
||||
/* 0x10 */ EGG::Vector3f field_0x10;
|
||||
/* 0x1C */ EGG::Vector3f field_0x1c;
|
||||
/* 0x28 */ EGG::Vector3f field_0x28;
|
||||
};
|
||||
|
||||
class JPAFieldRandom : public JPAFieldBase {
|
||||
public:
|
||||
/* 8027CCCC */ void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*);
|
||||
/* 8027D4AC */ ~JPAFieldRandom() {}
|
||||
};
|
||||
|
||||
class JPAFieldNewton : public JPAFieldBase {
|
||||
public:
|
||||
/* 8027C36C */ void prepare(JPAEmitterWorkData*, JPAFieldBlock*);
|
||||
/* 8027C3E0 */ void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*);
|
||||
/* 8027D5C0 */ ~JPAFieldNewton() {}
|
||||
|
||||
/* 0x10 */ EGG::Vector3f mDir;
|
||||
/* 0x1C */ f32 mCutoff;
|
||||
};
|
||||
|
||||
class JPAFieldMagnet : public JPAFieldBase {
|
||||
public:
|
||||
/* 8027C24C */ void prepare(JPAEmitterWorkData*, JPAFieldBlock*);
|
||||
/* 8027C29C */ void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*);
|
||||
/* 8027D61C */ ~JPAFieldMagnet() {}
|
||||
|
||||
/* 0x10 */ EGG::Vector3f mDir;
|
||||
};
|
||||
|
||||
class JPAFieldGravity : public JPAFieldBase {
|
||||
public:
|
||||
/* 8027BFB4 */ void prepare(JPAEmitterWorkData*, JPAFieldBlock*);
|
||||
/* 8027C054 */ void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*);
|
||||
/* 8027D6D4 */ ~JPAFieldGravity() {}
|
||||
void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*);
|
||||
~JPAFieldRandom() {}
|
||||
};
|
||||
|
||||
class JPAFieldDrag : public JPAFieldBase {
|
||||
public:
|
||||
/* 8027CDE4 */ void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*);
|
||||
/* 8027D450 */ ~JPAFieldDrag() {}
|
||||
void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*);
|
||||
~JPAFieldDrag() {}
|
||||
};
|
||||
|
||||
class JPAFieldConvection : public JPAFieldBase {
|
||||
public:
|
||||
/* 8027C814 */ void prepare(JPAEmitterWorkData*, JPAFieldBlock*);
|
||||
/* 8027CA94 */ void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*);
|
||||
/* 8027D508 */ ~JPAFieldConvection() {}
|
||||
void prepare(JPAEmitterWorkData*, JPAFieldBlock*);
|
||||
void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*);
|
||||
~JPAFieldConvection() {}
|
||||
|
||||
/* 0x10 */ EGG::Vector3f field_0x10;
|
||||
/* 0x1C */ EGG::Vector3f field_0x1c;
|
||||
/* 0x28 */ EGG::Vector3f field_0x28;
|
||||
};
|
||||
|
||||
class JPAFieldAir : public JPAFieldBase {
|
||||
class JPAFieldSpin : public JPAFieldBase {
|
||||
public:
|
||||
/* 8027C07C */ void prepare(JPAEmitterWorkData*, JPAFieldBlock*);
|
||||
/* 8027C1B8 */ void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*);
|
||||
/* 8027D678 */ ~JPAFieldAir() {}
|
||||
void prepare(JPAEmitterWorkData*, JPAFieldBlock*);
|
||||
void calc(JPAEmitterWorkData*, JPAFieldBlock*, JPABaseParticle*);
|
||||
~JPAFieldSpin() {}
|
||||
|
||||
/* 0x10 */ EGG::Vector3f field_0x10;
|
||||
/* 0x1C */ EGG::Vector3f field_0x1c;
|
||||
/* 0x28 */ EGG::Vector3f field_0x28;
|
||||
};
|
||||
|
||||
// unknown name
|
||||
@@ -119,8 +119,8 @@ public:
|
||||
|
||||
class JPAFieldBlock {
|
||||
public:
|
||||
/* 8027D088 */ JPAFieldBlock(u8 const*, EGG::Heap*);
|
||||
/* 8027D0C0 */ void init(EGG::Heap*);
|
||||
JPAFieldBlock(u8 const*, EGG::Heap*);
|
||||
void init(EGG::Heap*);
|
||||
|
||||
u32 getType() { return mpData->mFlags & 0xF; }
|
||||
u32 getAddType() { return (mpData->mFlags >> 8) & 3; }
|
||||
|
||||
@@ -8,8 +8,8 @@
|
||||
*
|
||||
*/
|
||||
struct JPAKeyBlock {
|
||||
/* 8027D730 */ JPAKeyBlock(u8 const*);
|
||||
/* 8027D740 */ f32 calc(f32);
|
||||
JPAKeyBlock(u8 const*);
|
||||
f32 calc(f32);
|
||||
|
||||
u8 getID() { return mDataStart[8]; }
|
||||
|
||||
|
||||
@@ -20,13 +20,13 @@ struct JPAEmitterWorkData;
|
||||
class JPABaseParticle {
|
||||
public:
|
||||
~JPABaseParticle() {}
|
||||
/* 8027EFEC */ void init_p(JPAEmitterWorkData*);
|
||||
/* 8027F8C8 */ void init_c(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
/* 8027FFD0 */ bool calc_p(JPAEmitterWorkData*);
|
||||
/* 80280260 */ bool calc_c(JPAEmitterWorkData*);
|
||||
/* 802804C8 */ bool canCreateChild(JPAEmitterWorkData*);
|
||||
/* 80280548 */ f32 getWidth(JPABaseEmitter const*) const;
|
||||
/* 80280568 */ f32 getHeight(JPABaseEmitter const*) const;
|
||||
void init_p(JPAEmitterWorkData*);
|
||||
void init_c(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
bool calc_p(JPAEmitterWorkData*);
|
||||
bool calc_c(JPAEmitterWorkData*);
|
||||
bool canCreateChild(JPAEmitterWorkData*);
|
||||
f32 getWidth(JPABaseEmitter const*) const;
|
||||
f32 getHeight(JPABaseEmitter const*) const;
|
||||
int getAge() { return mAge; }
|
||||
void setOffsetPosition(const EGG::Vector3f& pos) { mOffsetPosition.set(pos); }
|
||||
void setOffsetPosition(f32 x, f32 y, f32 z) { mOffsetPosition.set(x, y, z); }
|
||||
|
||||
@@ -22,20 +22,20 @@ class JPAKeyBlock;
|
||||
*/
|
||||
class JPAResource {
|
||||
public:
|
||||
/* 80274010 */ JPAResource();
|
||||
/* 80274080 */ void init(EGG::Heap*);
|
||||
/* 802755E8 */ bool calc(JPAEmitterWorkData*, JPABaseEmitter*);
|
||||
/* 80275A94 */ void draw(JPAEmitterWorkData*, JPABaseEmitter*);
|
||||
/* 80275B74 */ void drawP(JPAEmitterWorkData*);
|
||||
/* 80275EB0 */ void drawC(JPAEmitterWorkData*);
|
||||
/* 802761A8 */ void setPTev();
|
||||
/* 8027642C */ void setCTev(JPAEmitterWorkData*);
|
||||
/* 8027658C */ void calc_p(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
/* 80276608 */ void calc_c(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
/* 80276684 */ void calcField(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
/* 80276700 */ void calcKey(JPAEmitterWorkData*);
|
||||
/* 80276840 */ void calcWorkData_c(JPAEmitterWorkData*);
|
||||
/* 80276A0C */ void calcWorkData_d(JPAEmitterWorkData*);
|
||||
JPAResource();
|
||||
void init(EGG::Heap*);
|
||||
bool calc(JPAEmitterWorkData*, JPABaseEmitter*);
|
||||
void draw(JPAEmitterWorkData*, JPABaseEmitter*);
|
||||
void drawP(JPAEmitterWorkData*);
|
||||
void drawC(JPAEmitterWorkData*);
|
||||
void setPTev();
|
||||
void setCTev(JPAEmitterWorkData*);
|
||||
void calc_p(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void calc_c(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void calcField(JPAEmitterWorkData*, JPABaseParticle*);
|
||||
void calcKey(JPAEmitterWorkData*);
|
||||
void calcWorkData_c(JPAEmitterWorkData*);
|
||||
void calcWorkData_d(JPAEmitterWorkData*);
|
||||
|
||||
JPABaseShape* getBsp() const { return mpBaseShape; }
|
||||
JPAExtraShape* getEsp() const { return mpExtraShape; }
|
||||
|
||||
@@ -7,8 +7,8 @@ class JPAResourceManager;
|
||||
|
||||
class JPAResourceLoader {
|
||||
public:
|
||||
/* 8027D8A0 */ JPAResourceLoader(u8 const*, JPAResourceManager*);
|
||||
/* 8027D8E0 */ void load_jpc(u8 const*, JPAResourceManager*);
|
||||
JPAResourceLoader(u8 const*, JPAResourceManager*);
|
||||
void load_jpc(u8 const*, JPAResourceManager*);
|
||||
};
|
||||
|
||||
#endif /* JPARESOURCELOADER_H */
|
||||
|
||||
@@ -14,13 +14,13 @@ class JPAResource;
|
||||
*/
|
||||
class JPAResourceManager {
|
||||
public:
|
||||
/* 80273E10 */ JPAResourceManager(void const*, EGG::Heap*);
|
||||
/* 80273E68 */ JPAResource* getResource(u16) const;
|
||||
/* 80273EA8 */ bool checkUserIndexDuplication(u16) const;
|
||||
/* 80273EEC */ const EGG::ResTIMG* swapTexture(EGG::ResTIMG const*, char const*);
|
||||
/* 80273F8C */ void registRes(JPAResource*);
|
||||
/* 80273FAC */ void registTex(JPATexture*);
|
||||
/* 80273FCC */ u32 getResUserWork(u16) const;
|
||||
JPAResourceManager(void const*, EGG::Heap*);
|
||||
JPAResource* getResource(u16) const;
|
||||
bool checkUserIndexDuplication(u16) const;
|
||||
const EGG::ResTIMG* swapTexture(EGG::ResTIMG const*, char const*);
|
||||
void registRes(JPAResource*);
|
||||
void registTex(JPATexture*);
|
||||
u32 getResUserWork(u16) const;
|
||||
|
||||
void load(u16 idx, GXTexMapID texMapID) { mpTexArr[idx]->load(texMapID); }
|
||||
|
||||
|
||||
@@ -44,12 +44,12 @@
|
||||
#endif
|
||||
|
||||
namespace JUTAssertion {
|
||||
/* 802E495C */ void create();
|
||||
/* 802E4960 */ u32 flush_subroutine();
|
||||
/* 802E499C */ void flushMessage();
|
||||
/* 802E4A54 */ void flushMessage_dbPrint();
|
||||
/* 802E4C34 */ void setVisible(bool);
|
||||
/* 802E4C3C */ void setMessageCount(int);
|
||||
void create();
|
||||
u32 flush_subroutine();
|
||||
void flushMessage();
|
||||
void flushMessage_dbPrint();
|
||||
void setVisible(bool);
|
||||
void setMessageCount(int);
|
||||
|
||||
u32 getSDevice();
|
||||
void showAssert(u32 device, const char * file, int line, const char * assertion);
|
||||
|
||||
@@ -48,7 +48,7 @@ struct Vector3f : public nw4r::math::VEC3 {
|
||||
return Vector3f(-x, -y, -z);
|
||||
}
|
||||
|
||||
Vector3f operator-(const Vector3f &v) {
|
||||
Vector3f operator-(const Vector3f &v) const {
|
||||
return Vector3f(x - v.x, y - v.y, z - v.z);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user