mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-18 11:25:42 +00:00
fix(DB/Script): Eastvale Logging Camp, Elywnn Forest (#10036)
* fix(DB/Script): Eastvale Logging Camp, Elywnn Forest * Update rev_1641426458023302944.sql * Update zone_elwynn_forest.cpp
This commit is contained in:
121
data/sql/updates/pending_db_world/rev_1641426458023302944.sql
Normal file
121
data/sql/updates/pending_db_world/rev_1641426458023302944.sql
Normal file
@@ -0,0 +1,121 @@
|
||||
INSERT INTO `version_db_world` (`sql_rev`) VALUES ('1641426458023302944');
|
||||
|
||||
-- Add scriptnames
|
||||
UPDATE `creature_template` SET `ScriptName` = "npc_eastvale_peasent" WHERE `entry` IN (11328);
|
||||
UPDATE `creature_template` SET `ScriptName` = "npc_supervisor_raelen" WHERE `entry` IN (10616);
|
||||
|
||||
-- Update Eastvale Peasants
|
||||
UPDATE `creature` SET `wander_distance`=0,`MovementType`=0 WHERE `id`=11328;
|
||||
UPDATE `creature_template_addon` SET `emote`=234 WHERE `entry`= 11328;
|
||||
UPDATE `creature` SET `position_x`=-9523.21,`position_y`=-1290.2489,`position_z`=44.11742, `orientation`=5.238773 WHERE `guid`=81249;
|
||||
UPDATE `creature` SET `position_x`=-9536.207,`position_y`=-1273.0508,`position_z`=43.418743, `orientation`=2.936915 WHERE `guid`=81250;
|
||||
UPDATE `creature` SET `position_x`=-9535.653,`position_y`=-1329.8119,`position_z`=47.341866, `orientation`=1.939004 WHERE `guid`=81349;
|
||||
|
||||
-- Update Eastvale Lumberjacks
|
||||
UPDATE `creature` SET `wander_distance`=2 WHERE `guid` IN (81259,81345);
|
||||
|
||||
-- Update James Clark
|
||||
UPDATE `creature` SET `wander_distance`=1,`MovementType`=1,`position_x`=-9493.731,`position_y`=-1193.5862,`position_z`=49.64713, `orientation`=3.89947509765625 WHERE `guid`=81247;
|
||||
|
||||
-- Pathing for Eastvale Lumberjack Entry: 1975
|
||||
SET @NPC := 81257;
|
||||
SET @PATH := @NPC * 10;
|
||||
UPDATE `creature` SET `wander_distance`=0,`MovementType`=2 WHERE `guid`=@NPC;
|
||||
DELETE FROM `creature_addon` WHERE `guid`=@NPC;
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`visibilityDistanceType`,`auras`) VALUES (@NPC,@PATH,0,0,1,0,0, '');
|
||||
DELETE FROM `waypoint_data` WHERE `id`=@PATH;
|
||||
INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
|
||||
(@PATH,1,-9400.745,-1336.9156,50.027412,0,15000,0,0,100,0),
|
||||
(@PATH,2,-9404.866,-1339.135,50.027412,0,0,0,0,100,0),
|
||||
(@PATH,3,-9409.12,-1338.372,50.027412,0,0,0,0,100,0),
|
||||
(@PATH,4,-9411.633,-1336.6923,50.74399,0,0,0,0,100,0),
|
||||
(@PATH,5,-9416.485,-1331.1586,51.441143,0,0,0,0,100,0),
|
||||
(@PATH,6,-9421.154,-1326.5717,51.46511,0,0,0,0,100,0),
|
||||
(@PATH,7,-9426.076,-1323.9713,51.4651,0,15000,0,0,100,0),
|
||||
(@PATH,8,-9417.531,-1330.5028,51.441174,0,0,0,0,100,0),
|
||||
(@PATH,9,-9412.813,-1334.5887,51.52948,0,0,0,0,100,0),
|
||||
(@PATH,10,-9408.221,-1337.9055,50.027412,0,0,0,0,100,0);
|
||||
|
||||
-- Pathing for Eastvale Peasant Entry: 11328
|
||||
SET @NPC := 81348;
|
||||
SET @PATH := @NPC * 10;
|
||||
DELETE FROM `creature_addon` WHERE `guid`=@NPC;
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`visibilityDistanceType`,`auras`) VALUES (@NPC,0,0,0,1,234,0, '');
|
||||
DELETE FROM `waypoint_data` WHERE `id` IN (@PATH,@PATH+1,@PATH+2);
|
||||
INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
|
||||
(@PATH,1,-9517.114,-1333.8582,45.9155,0,0,0,0,100,0),
|
||||
(@PATH,2,-9494.799,-1322.8846,41.20464,0,0,0,0,100,0),
|
||||
(@PATH,3,-9466.731,-1296.875,41.543285,0,0,0,0,100,0),
|
||||
(@PATH+1,1,-9471.852,-1292.7347,41.054028,0,0,0,0,100,0),
|
||||
(@PATH+1,2,-9471.444,-1289.9312,41.134594,0,0,0,0,100,0),
|
||||
(@PATH+2,1,-9496.343,-1322.3462,41.325,0,0,0,0,100,0),
|
||||
(@PATH+2,2,-9516.777,-1333.658,45.834446,0,0,0,0,100,0),
|
||||
(@PATH+2,3,-9526.894,-1324.7913,45.84667,0,0,0,0,100,0),
|
||||
(@PATH+2,4,-9529.32,-1323.672,45.950916,0,0,0,0,100,0);
|
||||
|
||||
-- Pathing for Eastvale Peasant Entry: 11328
|
||||
SET @NPC := 81252;
|
||||
SET @PATH := @NPC * 10;
|
||||
DELETE FROM `creature_addon` WHERE `guid`=@NPC;
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`visibilityDistanceType`,`auras`) VALUES (@NPC,0,0,0,1,234,0, '');
|
||||
DELETE FROM `waypoint_data` WHERE `id` IN (@PATH,@PATH+1,@PATH+2);
|
||||
INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
|
||||
(@PATH,1,-9524.052,-1283.8728,43.82079,0,0,0,0,100,0),
|
||||
(@PATH,2,-9500.586,-1283.8563,43.402332,0,0,0,0,100,0),
|
||||
(@PATH,3,-9469.168,-1298.1064,41.57429,0,0,0,0,100,0),
|
||||
(@PATH,4,-9466.686,-1296.875,41.549145,0,0,0,0,100,0),
|
||||
(@PATH+1,1,-9472.049,-1293.2257,41.030346,0,0,0,0,100,0),
|
||||
(@PATH+1,2,-9471.718,-1289.9913,41.12727,0,0,0,0,100,0),
|
||||
(@PATH+2,1,-9500.046,-1283.9575,43.255604,0,0,0,0,100,0),
|
||||
(@PATH+2,2,-9525.792,-1284.0898,43.640614,0,0,0,0,100,0),
|
||||
(@PATH+2,3,-9536.142,-1303.3818,44.576973,0,0,0,0,100,0),
|
||||
(@PATH+2,4,-9535.299,-1304.701,44.701973,0,0,0,0,100,0);
|
||||
|
||||
-- Pathing for Eastvale Peasant Entry: 11328
|
||||
SET @NPC := 81349;
|
||||
SET @PATH := @NPC * 10;
|
||||
DELETE FROM `creature_addon` WHERE `guid`=@NPC;
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`visibilityDistanceType`,`auras`) VALUES (@NPC,0,0,0,1,234,0, '');
|
||||
DELETE FROM `waypoint_data` WHERE `id` IN (@PATH,@PATH+1,@PATH+2);
|
||||
INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
|
||||
(@PATH,1,-9506.966,-1333.8741,44.104954,0,0,0,0,100,0),
|
||||
(@PATH,2,-9475.493,-1304.2109,42.403614,0,0,0,0,100,0),
|
||||
(@PATH,3,-9466.71,-1296.875,41.546215,0,0,0,0,100,0),
|
||||
(@PATH+1,1,-9471.955,-1292.7456,40.988842,0,0,0,0,100,0),
|
||||
(@PATH+1,2,-9471.373,-1289.8252,41.14729,0,0,0,0,100,0),
|
||||
(@PATH+2,1,-9498.48,-1327.6045,42.092823,0,0,0,0,100,0),
|
||||
(@PATH+2,2,-9524.156,-1335.9268,47.01755,0,0,0,0,100,0),
|
||||
(@PATH+2,3,-9534.49,-1332.8064,47.652657,0,0,0,0,100,0),
|
||||
(@PATH+2,4,-9535.653,-1329.8119,47.341866,0,0,0,0,100,0);
|
||||
|
||||
-- Pathing for Eastvale Peasant Entry: 11328
|
||||
SET @NPC := 81250;
|
||||
SET @PATH := @NPC * 10;
|
||||
DELETE FROM `creature_addon` WHERE `guid`=@NPC;
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`visibilityDistanceType`,`auras`) VALUES (@NPC,0,0,0,1,234,0, '');
|
||||
DELETE FROM `waypoint_data` WHERE `id` IN (@PATH,@PATH+1,@PATH+2);
|
||||
INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
|
||||
(@PATH,1,-9501.6,-1282.86,43.637928,0,0,0,0,100,0),
|
||||
(@PATH,2,-9469.226,-1297.9215,41.552074,0,0,0,0,100,0),
|
||||
(@PATH,3,-9466.679,-1296.875,41.549877,0,0,0,0,100,0),
|
||||
(@PATH+1,1,-9471.516,-1293.1033,41.09431,0,0,0,0,100,0),
|
||||
(@PATH+1,2,-9471.361,-1289.7982,41.150463,0,0,0,0,100,0),
|
||||
(@PATH+2,1,-9505.872,-1279.3485,44.435535,0,0,0,0,100,0),
|
||||
(@PATH+2,2,-9536.207,-1273.0508,43.418743,0,0,0,0,100,0);
|
||||
|
||||
-- Pathing for Eastvale Peasant Entry: 11328
|
||||
SET @NPC := 81249;
|
||||
SET @PATH := @NPC * 10;
|
||||
DELETE FROM `creature_addon` WHERE `guid`=@NPC;
|
||||
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`visibilityDistanceType`,`auras`) VALUES (@NPC,0,0,0,1,234,0, '');
|
||||
DELETE FROM `waypoint_data` WHERE `id` IN (@PATH,@PATH+1,@PATH+2);
|
||||
INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
|
||||
(@PATH,1,-9520.802,-1284.2855,44.085926,0,0,0,0,100,0),
|
||||
(@PATH,2,-9501.877,-1282.7637,43.644764,0,0,0,0,100,0),
|
||||
(@PATH,3,-9468.622,-1298.6906,41.752514,0,0,0,0,100,0),
|
||||
(@PATH,4,-9466.68,-1296.875,41.549633,0,0,0,0,100,0),
|
||||
(@PATH+1,1,-9471.81,-1293.9409,41.05891,0,0,0,0,100,0),
|
||||
(@PATH+1,2,-9471.407,-1290.0531,41.119946,0,0,0,0,100,0),
|
||||
(@PATH+2,1,-9517.359,-1283.467,44.269764,0,0,0,0,100,0),
|
||||
(@PATH+2,2,-9524.299,-1288.3755,43.83373,0,0,0,0,100,0),
|
||||
(@PATH+2,3,-9523.21,-1290.2489,44.11742,0,0,0,0,100,0);
|
||||
@@ -256,8 +256,265 @@ private:
|
||||
GuidVector _childrenGUIDs;
|
||||
};
|
||||
|
||||
/*######
|
||||
## npc_supervisor_raelen
|
||||
######*/
|
||||
|
||||
enum SupervisorRaelen
|
||||
{
|
||||
EVENT_FIND_PEASENTS = 8,
|
||||
EVENT_NEXT_PEASENT = 9,
|
||||
NPC_EASTVALE_PEASENT = 11328
|
||||
};
|
||||
|
||||
struct npc_supervisor_raelen : public ScriptedAI
|
||||
{
|
||||
npc_supervisor_raelen(Creature* creature) : ScriptedAI(creature) {}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
_PeasentId = 0;
|
||||
peasentGUIDs.clear();
|
||||
_events.ScheduleEvent(EVENT_FIND_PEASENTS, 4000);
|
||||
}
|
||||
|
||||
void SetData(uint32 /*type*/, uint32 data) override
|
||||
{
|
||||
if (data == 1)
|
||||
{
|
||||
++_PeasentId;
|
||||
if (_PeasentId == 5) _PeasentId = 0;
|
||||
_events.ScheduleEvent(EVENT_NEXT_PEASENT, urand(2000, 6000));
|
||||
}
|
||||
}
|
||||
|
||||
void CallPeasent()
|
||||
{
|
||||
if (Creature* peasent = ObjectAccessor::GetCreature(*me, peasentGUIDs[_PeasentId]))
|
||||
peasent->AI()->SetData(1, 1);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
_events.Update(diff);
|
||||
|
||||
if (uint32 eventId = _events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_FIND_PEASENTS:
|
||||
{
|
||||
GuidVector tempGUIDs;
|
||||
std::list<Creature*> peasents;
|
||||
GetCreatureListWithEntryInGrid(peasents, me, NPC_EASTVALE_PEASENT, 100.f);
|
||||
for (Creature* peasent : peasents)
|
||||
{
|
||||
tempGUIDs.push_back(peasent->GetGUID());
|
||||
}
|
||||
peasentGUIDs.push_back(tempGUIDs[2]);
|
||||
peasentGUIDs.push_back(tempGUIDs[3]);
|
||||
peasentGUIDs.push_back(tempGUIDs[0]);
|
||||
peasentGUIDs.push_back(tempGUIDs[1]);
|
||||
peasentGUIDs.push_back(tempGUIDs[4]);
|
||||
_events.ScheduleEvent(EVENT_NEXT_PEASENT, 1000);
|
||||
break;
|
||||
}
|
||||
case EVENT_NEXT_PEASENT:
|
||||
CallPeasent();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
private:
|
||||
EventMap _events;
|
||||
uint8 _PeasentId;
|
||||
GuidVector peasentGUIDs;
|
||||
};
|
||||
|
||||
/*######
|
||||
## npc_eastvale_peasent
|
||||
######*/
|
||||
|
||||
enum EastvalePeasent
|
||||
{
|
||||
EVENT_MOVETORAELEN = 10,
|
||||
EVENT_TALKTORAELEN1 = 11,
|
||||
EVENT_TALKTORAELEN2 = 12,
|
||||
EVENT_RAELENTALK = 13,
|
||||
EVENT_TALKTORAELEN3 = 14,
|
||||
EVENT_TALKTORAELEN4 = 15,
|
||||
EVENT_PATHBACK = 16,
|
||||
NPC_SUPERVISOR_RAELEN = 10616,
|
||||
PATH_PEASENT_0 = 813490,
|
||||
PATH_PEASENT_1 = 813480,
|
||||
PATH_PEASENT_2 = 812520,
|
||||
PATH_PEASENT_3 = 812490,
|
||||
PATH_PEASENT_4 = 812500,
|
||||
SAY_RAELEN = 0,
|
||||
SOUND_PEASENT_GREETING_1 = 6289,
|
||||
SOUND_PEASENT_GREETING_2 = 6288,
|
||||
SOUND_PEASENT_GREETING_3 = 6290,
|
||||
SOUND_PEASENT_LEAVING_1 = 6242,
|
||||
SOUND_PEASENT_LEAVING_2 = 6282,
|
||||
SOUND_PEASENT_LEAVING_3 = 6284,
|
||||
SOUND_PEASENT_LEAVING_4 = 6285,
|
||||
SOUND_PEASENT_LEAVING_5 = 6286,
|
||||
SPELL_TRANSFORM_PEASENT_WITH_WOOD = 9127
|
||||
};
|
||||
|
||||
struct npc_eastvale_peasent : public ScriptedAI
|
||||
{
|
||||
npc_eastvale_peasent(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
_path = me->GetSpawnId() * 10;
|
||||
}
|
||||
|
||||
void Reset() override {}
|
||||
|
||||
void SetData(uint32 /*type*/, uint32 data) override
|
||||
{
|
||||
if (data == 1)
|
||||
{
|
||||
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE);
|
||||
me->CastSpell(me, SPELL_TRANSFORM_PEASENT_WITH_WOOD);
|
||||
me->SetSpeed(MOVE_WALK, 1.0f);
|
||||
me->GetMotionMaster()->MovePath(_path, false);
|
||||
}
|
||||
}
|
||||
|
||||
void PathEndReached(uint32 pathId) override
|
||||
{
|
||||
if (pathId == _path)
|
||||
{
|
||||
CreatureTemplate const* cinfo = sObjectMgr->GetCreatureTemplate(me->GetEntry());
|
||||
me->SetSpeed(MOVE_WALK, cinfo->speed_walk);
|
||||
me->RemoveAura(SPELL_TRANSFORM_PEASENT_WITH_WOOD);
|
||||
_events.ScheduleEvent(EVENT_MOVETORAELEN, 3000);
|
||||
}
|
||||
else if (pathId == _path + 1)
|
||||
{
|
||||
_events.ScheduleEvent(EVENT_TALKTORAELEN1, 1000);
|
||||
}
|
||||
else if (pathId == _path + 2)
|
||||
{
|
||||
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_WORK_CHOPWOOD);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
_events.Update(diff);
|
||||
|
||||
if (uint32 eventId = _events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_MOVETORAELEN:
|
||||
me->GetMotionMaster()->MovePath(_path + 1, false);
|
||||
break;
|
||||
case EVENT_TALKTORAELEN1:
|
||||
if (Creature* realen = me->FindNearestCreature(NPC_SUPERVISOR_RAELEN, 2.0f, true))
|
||||
{
|
||||
_realenGUID = realen->GetGUID();
|
||||
me->SetFacingToObject(realen);
|
||||
|
||||
switch (_path)
|
||||
{
|
||||
case PATH_PEASENT_0:
|
||||
me->PlayDirectSound(SOUND_PEASENT_GREETING_1);
|
||||
_events.ScheduleEvent(EVENT_TALKTORAELEN2, 2000);
|
||||
break;
|
||||
case PATH_PEASENT_1:
|
||||
case PATH_PEASENT_3:
|
||||
me->PlayDirectSound(SOUND_PEASENT_GREETING_3);
|
||||
_events.ScheduleEvent(EVENT_RAELENTALK, 2000);
|
||||
break;
|
||||
case PATH_PEASENT_2:
|
||||
case PATH_PEASENT_4:
|
||||
me->PlayDirectSound(SOUND_PEASENT_GREETING_2);
|
||||
_events.ScheduleEvent(EVENT_RAELENTALK, 2000);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Path back if realen cannot be found alive
|
||||
_events.ScheduleEvent(EVENT_PATHBACK, 2000);
|
||||
}
|
||||
break;
|
||||
case EVENT_TALKTORAELEN2:
|
||||
me->PlayDirectSound(SOUND_PEASENT_GREETING_2);
|
||||
_events.ScheduleEvent(EVENT_RAELENTALK, 2000);
|
||||
break;
|
||||
case EVENT_RAELENTALK:
|
||||
if (Creature* realen = ObjectAccessor::GetCreature(*me, _realenGUID))
|
||||
{
|
||||
realen->AI()->Talk(SAY_RAELEN);
|
||||
_events.ScheduleEvent(EVENT_TALKTORAELEN3, 5000);
|
||||
}
|
||||
break;
|
||||
case EVENT_TALKTORAELEN3:
|
||||
{
|
||||
switch (_path)
|
||||
{
|
||||
case PATH_PEASENT_0:
|
||||
me->PlayDirectSound(SOUND_PEASENT_LEAVING_1);
|
||||
_events.ScheduleEvent(EVENT_PATHBACK, 2000);
|
||||
break;
|
||||
case PATH_PEASENT_1:
|
||||
case PATH_PEASENT_3:
|
||||
me->PlayDirectSound(SOUND_PEASENT_LEAVING_4);
|
||||
_events.ScheduleEvent(EVENT_TALKTORAELEN4, 2000);
|
||||
break;
|
||||
case PATH_PEASENT_2:
|
||||
me->PlayDirectSound(SOUND_PEASENT_LEAVING_3);
|
||||
_events.ScheduleEvent(EVENT_PATHBACK, 2000);
|
||||
break;
|
||||
case PATH_PEASENT_4:
|
||||
me->PlayDirectSound(SOUND_PEASENT_LEAVING_2);
|
||||
_events.ScheduleEvent(EVENT_PATHBACK, 2000);
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case EVENT_TALKTORAELEN4:
|
||||
me->PlayDirectSound(SOUND_PEASENT_LEAVING_5);
|
||||
_events.ScheduleEvent(EVENT_PATHBACK, 2000);
|
||||
break;
|
||||
case EVENT_PATHBACK:
|
||||
if (Creature* realen = ObjectAccessor::GetCreature(*me, _realenGUID))
|
||||
realen->AI()->SetData(1, 1);
|
||||
me->GetMotionMaster()->MovePath(_path + 2, false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
EventMap _events;
|
||||
ObjectGuid _realenGUID;
|
||||
uint32 _path;
|
||||
};
|
||||
|
||||
void AddSC_elwynn_forest()
|
||||
{
|
||||
RegisterCreatureAI(npc_cameron);
|
||||
RegisterCreatureAI(npc_supervisor_raelen);
|
||||
RegisterCreatureAI(npc_eastvale_peasent);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user