mirror of
https://github.com/1dot13/source.git
synced 2026-09-16 14:47:17 +02:00
Externalized some hardcoded grid numbers to "Mod_options.ini" (by DepressivesBrot)
- There is a new "Mod_options.ini" file located in the "Data" MOD folder - Only modders should make changes to the file. git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@5352 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
@@ -61,6 +61,9 @@
|
|||||||
// HEADROCK HAM 4: This file contains all the settings required to tweak the new Shooting Mechanism. There's lots of them.
|
// HEADROCK HAM 4: This file contains all the settings required to tweak the new Shooting Mechanism. There's lots of them.
|
||||||
#define CTH_COEFFICIENTS_FILE "CTHConstants.ini"
|
#define CTH_COEFFICIENTS_FILE "CTHConstants.ini"
|
||||||
|
|
||||||
|
//DBrot: Settings for a mod that don't really fit in the Options file. This means GridNos for now.
|
||||||
|
#define MOD_SETTINGS_FILE "Mod_Settings.ini"
|
||||||
|
|
||||||
#define CD_ROOT_DIR "DATA\\"
|
#define CD_ROOT_DIR "DATA\\"
|
||||||
|
|
||||||
GAME_SETTINGS gGameSettings;
|
GAME_SETTINGS gGameSettings;
|
||||||
@@ -70,6 +73,8 @@ GAME_EXTERNAL_OPTIONS gGameExternalOptions;
|
|||||||
SKILL_TRAIT_VALUES gSkillTraitValues; // SANDRO - added this one
|
SKILL_TRAIT_VALUES gSkillTraitValues; // SANDRO - added this one
|
||||||
CTH_CONSTANTS gGameCTHConstants; // HEADROCK HAM 4: CTH constants
|
CTH_CONSTANTS gGameCTHConstants; // HEADROCK HAM 4: CTH constants
|
||||||
|
|
||||||
|
MOD_SETTINGS gModSettings; //DBrot: mod specific settings
|
||||||
|
|
||||||
extern SGPFILENAME gCheckFilenames[];
|
extern SGPFILENAME gCheckFilenames[];
|
||||||
extern CHAR8 gzErrorMsg[256];
|
extern CHAR8 gzErrorMsg[256];
|
||||||
extern INT16 APBPConstants[TOTAL_APBP_VALUES];
|
extern INT16 APBPConstants[TOTAL_APBP_VALUES];
|
||||||
@@ -2058,8 +2063,48 @@ void LoadSkillTraitsExternalSettings()
|
|||||||
gSkillTraitValues.fSCThrowMessageIfAmbushPrevented = iniReader.ReadBoolean("Scouting","SHOW_MESSAGE_IF_AMBUSH_PREVENTED", TRUE);
|
gSkillTraitValues.fSCThrowMessageIfAmbushPrevented = iniReader.ReadBoolean("Scouting","SHOW_MESSAGE_IF_AMBUSH_PREVENTED", TRUE);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
//DBrot: Grids
|
||||||
|
void LoadModSettings(){
|
||||||
|
CIniReader iniReader(MOD_SETTINGS_FILE);
|
||||||
|
gModSettings.ubHideoutSectorX = iniReader.ReadInteger("Rebel Hideout", "HIDEOUT_SECTOR_X", 10, 1, 16);
|
||||||
|
gModSettings.ubHideoutSectorY = iniReader.ReadInteger("Rebel Hideout", "HIDEOUT_SECTOR_Y", 1, 1, 16);
|
||||||
|
gModSettings.ubHideoutSectorZ = iniReader.ReadInteger("Rebel Hideout", "HIDEOUT_SECTOR_Z", 1, 0, 3);
|
||||||
|
gModSettings.iHideoutExitGrid = iniReader.ReadInteger("Rebel Hideout", "HIDEOUT_EXIT", 12722);
|
||||||
|
|
||||||
|
gModSettings.ubHideoutSurfaceX = iniReader.ReadInteger("Rebel Hideout", "HIDEOUT_SURFACE_X", 10, 1, 16);
|
||||||
|
gModSettings.ubHideoutSurfaceY = iniReader.ReadInteger("Rebel Hideout", "HIDEOUT_SURFACE_Y", 1, 1, 16);
|
||||||
|
gModSettings.ubHideoutSurfaceZ = iniReader.ReadInteger("Rebel Hideout", "HIDEOUT_SURFACE_Z", 0, 0, 3);
|
||||||
|
gModSettings.iHideoutEntryGrid = iniReader.ReadInteger("Rebel Hideout", "HIDEOUT_ENTRY", 7887);
|
||||||
|
|
||||||
|
gModSettings.iBasementEntry[0] = iniReader.ReadInteger("Rebel Hideout", "BASEMENT_ENTRY_1", 13362);
|
||||||
|
gModSettings.iBasementEntry[1] = iniReader.ReadInteger("Rebel Hideout", "BASEMENT_ENTRY_2", 13363);
|
||||||
|
gModSettings.iBasementEntry[2] = iniReader.ReadInteger("Rebel Hideout", "BASEMENT_ENTRY_3", 13364);
|
||||||
|
gModSettings.iBasementEntry[3] = iniReader.ReadInteger("Rebel Hideout", "BASEMENT_ENTRY_4", 13365);
|
||||||
|
gModSettings.iBasementEntry[4] = iniReader.ReadInteger("Rebel Hideout", "BASEMENT_ENTRY_5", 13325);
|
||||||
|
gModSettings.iBasementEntry[5] = iniReader.ReadInteger("Rebel Hideout", "BASEMENT_ENTRY_6", 13324);
|
||||||
|
gModSettings.iBasementEntry[6] = iniReader.ReadInteger("Rebel Hideout", "BASEMENT_ENTRY_7", 0);
|
||||||
|
gModSettings.iBasementEntry[7] = iniReader.ReadInteger("Rebel Hideout", "BASEMENT_ENTRY_8", 0);
|
||||||
|
gModSettings.iBasementEntry[8] = iniReader.ReadInteger("Rebel Hideout", "BASEMENT_ENTRY_9", 0);
|
||||||
|
gModSettings.iBasementEntry[9] = iniReader.ReadInteger("Rebel Hideout", "BASEMENT_ENTRY_10", 0);
|
||||||
|
|
||||||
|
gModSettings.iBasementExit[0] = iniReader.ReadInteger("Rebel Hideout", "BASEMENT_EXIT_1", 8047);
|
||||||
|
gModSettings.iBasementExit[1] = iniReader.ReadInteger("Rebel Hideout", "BASEMENT_EXIT_2", 8207);
|
||||||
|
gModSettings.iBasementExit[2] = iniReader.ReadInteger("Rebel Hideout", "BASEMENT_EXIT_3", 8208);
|
||||||
|
gModSettings.iBasementExit[3] = iniReader.ReadInteger("Rebel Hideout", "BASEMENT_EXIT_4", 8048);
|
||||||
|
gModSettings.iBasementExit[4] = iniReader.ReadInteger("Rebel Hideout", "BASEMENT_EXIT_5", 7888);
|
||||||
|
gModSettings.iBasementExit[5] = iniReader.ReadInteger("Rebel Hideout", "BASEMENT_EXIT_6", 7728);
|
||||||
|
gModSettings.iBasementExit[6] = iniReader.ReadInteger("Rebel Hideout", "BASEMENT_EXIT_7", 7727);
|
||||||
|
gModSettings.iBasementExit[7] = iniReader.ReadInteger("Rebel Hideout", "BASEMENT_EXIT_8", 7567);
|
||||||
|
gModSettings.iBasementExit[8] = iniReader.ReadInteger("Rebel Hideout", "BASEMENT_EXIT_9", 0);
|
||||||
|
gModSettings.iBasementExit[9] = iniReader.ReadInteger("Rebel Hideout", "BASEMENT_EXIT_10", 0);
|
||||||
|
gModSettings.iBasementExit[10] = iniReader.ReadInteger("Rebel Hideout", "BASEMENT_EXIT_11", 0);
|
||||||
|
gModSettings.iBasementExit[11] = iniReader.ReadInteger("Rebel Hideout", "BASEMENT_EXIT_12", 0);
|
||||||
|
|
||||||
|
gModSettings.iFinalCrateGrid = iniReader.ReadInteger("Rebel Hideout", "FINAL_CRATE_GRID", 8207);
|
||||||
|
gModSettings.usCrateTileDef = iniReader.ReadInteger("Rebel Hideout", "CRATE_TILE_DEF", 411);
|
||||||
|
gModSettings.usTrapdoorTileDef = iniReader.ReadInteger("Rebel Hideout", "TRAPDOOR_TILE_DEF", 2041);
|
||||||
|
|
||||||
|
}
|
||||||
INT16 DynamicAdjustAPConstants(INT16 iniReadValue, INT16 iniDefaultValue, BOOLEAN reverse)
|
INT16 DynamicAdjustAPConstants(INT16 iniReadValue, INT16 iniDefaultValue, BOOLEAN reverse)
|
||||||
{
|
{
|
||||||
//CHRISL: This function will dynamically adjust all the APBPConstant values based on the AP_MAXIMUM value. This way
|
//CHRISL: This function will dynamically adjust all the APBPConstant values based on the AP_MAXIMUM value. This way
|
||||||
|
|||||||
@@ -1475,6 +1475,34 @@ typedef struct
|
|||||||
BOOLEAN MAX_EFFECTIVE_USE_GRADIENT;
|
BOOLEAN MAX_EFFECTIVE_USE_GRADIENT;
|
||||||
|
|
||||||
} CTH_CONSTANTS;
|
} CTH_CONSTANTS;
|
||||||
|
//DBrot: Grids
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
//defines the basement and the bottom of the stairs
|
||||||
|
UINT8 ubHideoutSectorX;
|
||||||
|
UINT8 ubHideoutSectorY;
|
||||||
|
UINT8 ubHideoutSectorZ;
|
||||||
|
INT32 iHideoutExitGrid;
|
||||||
|
//defines the surface and the top of the stairs
|
||||||
|
UINT8 ubHideoutSurfaceX;
|
||||||
|
UINT8 ubHideoutSurfaceY;
|
||||||
|
UINT8 ubHideoutSurfaceZ;
|
||||||
|
INT32 iHideoutEntryGrid;
|
||||||
|
//where your mercs land when entering the basement, added some for 10 man squads
|
||||||
|
INT32 iBasementEntry[10];
|
||||||
|
|
||||||
|
//where your mercs land when leaving the basement, again added some
|
||||||
|
INT32 iBasementExit[12];
|
||||||
|
|
||||||
|
//this moves the crate to reveal the entrance
|
||||||
|
INT32 iFinalCrateGrid;
|
||||||
|
UINT16 usCrateTileDef;
|
||||||
|
UINT16 usTrapdoorTileDef;
|
||||||
|
|
||||||
|
|
||||||
|
}MOD_SETTINGS;
|
||||||
|
|
||||||
|
extern MOD_SETTINGS gModSettings;
|
||||||
|
|
||||||
//This structure will contain general Ja2 settings NOT individual game settings.
|
//This structure will contain general Ja2 settings NOT individual game settings.
|
||||||
extern GAME_SETTINGS gGameSettings;
|
extern GAME_SETTINGS gGameSettings;
|
||||||
@@ -1498,6 +1526,7 @@ BOOLEAN LoadGameSettings();
|
|||||||
// Snap: Read options from an INI file in the default of custom Data directory
|
// Snap: Read options from an INI file in the default of custom Data directory
|
||||||
void LoadGameExternalOptions();
|
void LoadGameExternalOptions();
|
||||||
void LoadSkillTraitsExternalSettings(); // SANDRO - added this one
|
void LoadSkillTraitsExternalSettings(); // SANDRO - added this one
|
||||||
|
void LoadModSettings();
|
||||||
void LoadGameAPBPConstants();
|
void LoadGameAPBPConstants();
|
||||||
// HEADROCK HAM 4: Read CTH/Shooting coefficients from file
|
// HEADROCK HAM 4: Read CTH/Shooting coefficients from file
|
||||||
void LoadCTHConstants();
|
void LoadCTHConstants();
|
||||||
|
|||||||
@@ -102,9 +102,9 @@
|
|||||||
class OBJECTTYPE;
|
class OBJECTTYPE;
|
||||||
class SOLDIERTYPE;
|
class SOLDIERTYPE;
|
||||||
|
|
||||||
|
//DBrot: not needed anymore, got an option for those
|
||||||
INT32 sBasementEnterGridNos[ ] = { 13362, 13363, 13364, 13365, 13525, 13524 };
|
//INT32 sBasementEnterGridNos[ ] = { 13362, 13363, 13364, 13365, 13525, 13524 };
|
||||||
INT32 sBasementExitGridNos[ ] = { 8047, 8207, 8208, 8048, 7888, 7728, 7727, 7567 };
|
//INT32 sBasementExitGridNos[ ] = { 8047, 8207, 8208, 8048, 7888, 7728, 7727, 7567 };
|
||||||
|
|
||||||
extern UINT8 gubWaitingForAllMercsToExitCode;
|
extern UINT8 gubWaitingForAllMercsToExitCode;
|
||||||
extern BOOLEAN fFoundTixa;
|
extern BOOLEAN fFoundTixa;
|
||||||
@@ -1850,14 +1850,14 @@ void HandleNPCDoAction( UINT8 ubTargetNPC, UINT16 usActionCode, UINT8 ubQuoteNum
|
|||||||
// OK, we want to goto the basement level!
|
// OK, we want to goto the basement level!
|
||||||
|
|
||||||
//DEF: First thing, Add the exit grid to the map temps file
|
//DEF: First thing, Add the exit grid to the map temps file
|
||||||
|
//DBrot: Grids
|
||||||
ExitGrid.ubGotoSectorX = 10;
|
ExitGrid.ubGotoSectorX = gModSettings.ubHideoutSectorX;
|
||||||
ExitGrid.ubGotoSectorY = 1;
|
ExitGrid.ubGotoSectorY = gModSettings.ubHideoutSectorY;
|
||||||
ExitGrid.ubGotoSectorZ = 1;
|
ExitGrid.ubGotoSectorZ = gModSettings.ubHideoutSectorZ;
|
||||||
ExitGrid.usGridNo = 12722; //dnl!!!
|
ExitGrid.usGridNo = gModSettings.iHideoutExitGrid; //dnl!!!
|
||||||
|
|
||||||
ApplyMapChangesToMapTempFile( TRUE );
|
ApplyMapChangesToMapTempFile( TRUE );
|
||||||
AddExitGridToWorld( 7887, &ExitGrid );
|
AddExitGridToWorld( gModSettings.iHideoutEntryGrid, &ExitGrid );
|
||||||
ApplyMapChangesToMapTempFile( FALSE );
|
ApplyMapChangesToMapTempFile( FALSE );
|
||||||
|
|
||||||
// For one, loop through our current squad and move them over
|
// For one, loop through our current squad and move them over
|
||||||
@@ -1873,19 +1873,21 @@ void HandleNPCDoAction( UINT8 ubTargetNPC, UINT16 usActionCode, UINT8 ubQuoteNum
|
|||||||
if ( pSoldier->bActive && pSoldier->stats.bLife >= OKLIFE && pSoldier->bInSector && pSoldier->bAssignment == CurrentSquad( ) )
|
if ( pSoldier->bActive && pSoldier->stats.bLife >= OKLIFE && pSoldier->bInSector && pSoldier->bAssignment == CurrentSquad( ) )
|
||||||
{
|
{
|
||||||
gfTacticalTraversal = TRUE;
|
gfTacticalTraversal = TRUE;
|
||||||
SetGroupSectorValue( 10, 1, 1, pSoldier->ubGroupID );
|
SetGroupSectorValue( gModSettings.ubHideoutSectorX, gModSettings.ubHideoutSectorY, gModSettings.ubHideoutSectorZ, pSoldier->ubGroupID );
|
||||||
|
|
||||||
// Set insertion gridno
|
// Set insertion gridno
|
||||||
if ( bNumDone < 6 )
|
if ( bNumDone < 6 )
|
||||||
{
|
{
|
||||||
// Set next sectore
|
// Set next sectore
|
||||||
pSoldier->sSectorX = 10;
|
//DBrot: Grids
|
||||||
pSoldier->sSectorY = 1;
|
pSoldier->sSectorX = gModSettings.ubHideoutSectorX;
|
||||||
pSoldier->bSectorZ = 1;
|
pSoldier->sSectorY = gModSettings.ubHideoutSectorY;
|
||||||
|
pSoldier->bSectorZ = gModSettings.ubHideoutSectorZ;
|
||||||
|
|
||||||
// Set gridno
|
// Set gridno
|
||||||
pSoldier->ubStrategicInsertionCode = INSERTION_CODE_GRIDNO;
|
pSoldier->ubStrategicInsertionCode = INSERTION_CODE_GRIDNO;
|
||||||
pSoldier->usStrategicInsertionData = sBasementEnterGridNos[ bNumDone ];
|
//pSoldier->usStrategicInsertionData = sBasementEnterGridNos[ bNumDone ];
|
||||||
|
pSoldier->usStrategicInsertionData = gModSettings.iBasementEntry[ bNumDone ];
|
||||||
}
|
}
|
||||||
bNumDone++;
|
bNumDone++;
|
||||||
}
|
}
|
||||||
@@ -1897,14 +1899,14 @@ void HandleNPCDoAction( UINT8 ubTargetNPC, UINT16 usActionCode, UINT8 ubQuoteNum
|
|||||||
gMercProfiles[ 101 ].sSectorY = 1;
|
gMercProfiles[ 101 ].sSectorY = 1;
|
||||||
gMercProfiles[ 101 ].bSectorZ = 1;
|
gMercProfiles[ 101 ].bSectorZ = 1;
|
||||||
*/
|
*/
|
||||||
ChangeNpcToDifferentSector( FATIMA, 10, 1, 1 );
|
ChangeNpcToDifferentSector( FATIMA, gModSettings.ubHideoutSectorX, gModSettings.ubHideoutSectorY, gModSettings.ubHideoutSectorZ);
|
||||||
|
|
||||||
// Dimitri
|
// Dimitri
|
||||||
/* gMercProfiles[ 60 ].sSectorX = 10;
|
/* gMercProfiles[ 60 ].sSectorX = 10;
|
||||||
gMercProfiles[ 60 ].sSectorY = 1;
|
gMercProfiles[ 60 ].sSectorY = 1;
|
||||||
gMercProfiles[ 60 ].bSectorZ = 1;
|
gMercProfiles[ 60 ].bSectorZ = 1;
|
||||||
*/
|
*/
|
||||||
ChangeNpcToDifferentSector( DIMITRI, 10, 1, 1 );
|
ChangeNpcToDifferentSector( DIMITRI, gModSettings.ubHideoutSectorX, gModSettings.ubHideoutSectorY, gModSettings.ubHideoutSectorZ);
|
||||||
|
|
||||||
gFadeOutDoneCallback = DoneFadeOutActionBasement;
|
gFadeOutDoneCallback = DoneFadeOutActionBasement;
|
||||||
|
|
||||||
@@ -2161,19 +2163,21 @@ void HandleNPCDoAction( UINT8 ubTargetNPC, UINT16 usActionCode, UINT8 ubQuoteNum
|
|||||||
if ( pSoldier->bActive && pSoldier->stats.bLife >= OKLIFE && pSoldier->bInSector )
|
if ( pSoldier->bActive && pSoldier->stats.bLife >= OKLIFE && pSoldier->bInSector )
|
||||||
{
|
{
|
||||||
gfTacticalTraversal = TRUE;
|
gfTacticalTraversal = TRUE;
|
||||||
SetGroupSectorValue( 10, 1, 0, pSoldier->ubGroupID );
|
//DBrot: Grids
|
||||||
|
SetGroupSectorValue( gModSettings.ubHideoutSurfaceX, gModSettings.ubHideoutSurfaceY, gModSettings.ubHideoutSurfaceZ, pSoldier->ubGroupID );
|
||||||
|
|
||||||
// Set insertion gridno
|
// Set insertion gridno
|
||||||
if ( bNumDone < 8 )
|
if ( bNumDone < 8 )
|
||||||
{
|
{
|
||||||
// Set next sectore
|
// Set next sectore
|
||||||
pSoldier->sSectorX = 10;
|
pSoldier->sSectorX = gModSettings.ubHideoutSurfaceX;
|
||||||
pSoldier->sSectorY = 1;
|
pSoldier->sSectorY = gModSettings.ubHideoutSurfaceY;
|
||||||
pSoldier->bSectorZ = 0;
|
pSoldier->bSectorZ = gModSettings.ubHideoutSurfaceZ;
|
||||||
|
|
||||||
// Set gridno
|
// Set gridno
|
||||||
pSoldier->ubStrategicInsertionCode = INSERTION_CODE_GRIDNO;
|
pSoldier->ubStrategicInsertionCode = INSERTION_CODE_GRIDNO;
|
||||||
pSoldier->usStrategicInsertionData = sBasementExitGridNos[ bNumDone ];
|
//pSoldier->usStrategicInsertionData = sBasementExitGridNos[ bNumDone ];
|
||||||
|
pSoldier->usStrategicInsertionData = gModSettings.iBasementExit[ bNumDone ];
|
||||||
}
|
}
|
||||||
bNumDone++;
|
bNumDone++;
|
||||||
}
|
}
|
||||||
@@ -4918,7 +4922,8 @@ void DialogueMessageBoxCallBack( UINT8 ubExitValue )
|
|||||||
void DoneFadeOutActionBasement( )
|
void DoneFadeOutActionBasement( )
|
||||||
{
|
{
|
||||||
// OK, insertion data found, enter sector!
|
// OK, insertion data found, enter sector!
|
||||||
SetCurrentWorldSector( 10, 1, 1 );
|
//DBrot: Grids
|
||||||
|
SetCurrentWorldSector( gModSettings.ubHideoutSectorX, gModSettings.ubHideoutSectorY, gModSettings.ubHideoutSectorZ );
|
||||||
|
|
||||||
// OK, once down here, adjust the above map with crate info....
|
// OK, once down here, adjust the above map with crate info....
|
||||||
gfTacticalTraversal = FALSE;
|
gfTacticalTraversal = FALSE;
|
||||||
@@ -4926,12 +4931,12 @@ void DoneFadeOutActionBasement( )
|
|||||||
gpTacticalTraversalChosenSoldier = NULL;
|
gpTacticalTraversalChosenSoldier = NULL;
|
||||||
|
|
||||||
// Remove crate
|
// Remove crate
|
||||||
RemoveStructFromUnLoadedMapTempFile( 7887, SECONDOSTRUCT1, 10, 1, 0 );
|
RemoveStructFromUnLoadedMapTempFile( gModSettings.iHideoutEntryGrid, gModSettings.usCrateTileDef, gModSettings.ubHideoutSurfaceX, gModSettings.ubHideoutSurfaceY, gModSettings.ubHideoutSurfaceZ );
|
||||||
// Add crate
|
// Add crate
|
||||||
AddStructToUnLoadedMapTempFile( 8207, SECONDOSTRUCT1, 10, 1, 0 );
|
AddStructToUnLoadedMapTempFile( gModSettings.iFinalCrateGrid, gModSettings.usCrateTileDef, gModSettings.ubHideoutSurfaceX, gModSettings.ubHideoutSurfaceY, gModSettings.ubHideoutSurfaceZ );
|
||||||
|
|
||||||
// Add trapdoor
|
// Add trapdoor
|
||||||
AddStructToUnLoadedMapTempFile( 7887, DEBRIS2MISC1, 10, 1, 0 );
|
AddStructToUnLoadedMapTempFile( gModSettings.iHideoutEntryGrid, gModSettings.usTrapdoorTileDef, gModSettings.ubHideoutSurfaceX, gModSettings.ubHideoutSurfaceY, gModSettings.ubHideoutSurfaceZ );
|
||||||
|
|
||||||
|
|
||||||
gFadeInDoneCallback = DoneFadeInActionBasement;
|
gFadeInDoneCallback = DoneFadeInActionBasement;
|
||||||
|
|||||||
@@ -134,6 +134,8 @@ BOOLEAN InitializeGame(void)
|
|||||||
|
|
||||||
// HEADROCK HAM 4: Read CTH values
|
// HEADROCK HAM 4: Read CTH values
|
||||||
LoadCTHConstants();
|
LoadCTHConstants();
|
||||||
|
//DBrot: load mod settings
|
||||||
|
LoadModSettings();
|
||||||
|
|
||||||
#ifdef JA2UB
|
#ifdef JA2UB
|
||||||
LoadGameUBOptions(); // JA25 UB
|
LoadGameUBOptions(); // JA25 UB
|
||||||
|
|||||||
Reference in New Issue
Block a user