mirror of
https://github.com/Winded/RagdollMover.git
synced 2025-03-04 03:13:36 -05:00
Merge pull request #32 from penolakushari/rus_local
Russian localization, couple of bug fixes
This commit is contained in:
commit
d844bc7830
@ -24,11 +24,11 @@ function ENT:GetLinePositions(width)
|
||||
end
|
||||
|
||||
local COLOR_YELLOW = Color(255, 255, 0, 255)
|
||||
local pl, parent
|
||||
local pl
|
||||
|
||||
function ENT:DrawLines(yellow, scale, width)
|
||||
if not pl then pl = LocalPlayer() end
|
||||
if not parent then parent = self:GetParent() end
|
||||
local parent = self:GetParent()
|
||||
local toscreen = {}
|
||||
local linetable = self:GetLinePositions(width)
|
||||
local eyepos = pl:EyePos()
|
||||
|
@ -56,21 +56,22 @@ end
|
||||
local function rgmSendPhysBones(ent)
|
||||
local num = ent:GetPhysicsObjectCount()
|
||||
|
||||
net.WriteUInt(num, 10)
|
||||
net.WriteUInt(num, 6)
|
||||
|
||||
for i = 0, num do
|
||||
for i = 0, num - 1 do
|
||||
net.WriteUInt(ent:TranslatePhysBoneToBone(i), 10)
|
||||
|
||||
local parent = rgm.GetPhysBoneParent(ent, i)
|
||||
parent = not parent and 1023 or ent:TranslatePhysBoneToBone(parent) -- 512 should be the absolute maximum bone amount, with those .dmx that sfm has
|
||||
parent = parent and ent:TranslatePhysBoneToBone(parent) or 1023
|
||||
net.WriteUInt(parent, 10)
|
||||
end
|
||||
end
|
||||
|
||||
local function rgmReceivePhysBones()
|
||||
local bones = {}
|
||||
local num = net.ReadUInt(6)
|
||||
|
||||
for i = 0, net.ReadUInt(10) do
|
||||
for i = 0, num - 1 do
|
||||
bones[net.ReadUInt(10)] = net.ReadUInt(10)
|
||||
end
|
||||
|
||||
@ -392,14 +393,14 @@ local function ChainSaver(cpanel)
|
||||
end
|
||||
|
||||
main.save = vgui.Create("DButton", main)
|
||||
main.save:SetText("Save")
|
||||
main.save:SetText("#tool.ragmover_ikchains.save")
|
||||
main.save.DoClick = function()
|
||||
net.Start("rgmikRequestSave")
|
||||
net.SendToServer()
|
||||
end
|
||||
|
||||
main.load = vgui.Create("DButton", main)
|
||||
main.load:SetText("Load")
|
||||
main.load:SetText("#tool.ragmover_ikchains.load")
|
||||
main.load.DoClick = function()
|
||||
if not SelectedEnt then return end
|
||||
|
||||
@ -446,7 +447,7 @@ local function ChainSaver(cpanel)
|
||||
end
|
||||
|
||||
main.SetText = function(self, text)
|
||||
self.label:SetText("Selected ragdoll: " .. text)
|
||||
self.label:SetText(language.GetPhrase("#tool.ragmover_ikchains.selectedragdoll") .. " " .. text)
|
||||
self.label:SizeToContents()
|
||||
end
|
||||
|
||||
@ -531,13 +532,16 @@ function TOOL.BuildCPanel(CPanel)
|
||||
|
||||
end
|
||||
|
||||
local PrevEnt = nil
|
||||
local COLOR_GREEN = Color(0, 200, 0, 255)
|
||||
|
||||
function TOOL:DrawHUD()
|
||||
|
||||
local pl = LocalPlayer()
|
||||
|
||||
local aimedent = pl:GetEyeTrace().Entity
|
||||
|
||||
if IsValid(aimedent) and (aimedent:GetClass() == "prop_ragdoll") then
|
||||
if aimedent == PrevEnt and IsValid(aimedent) and (aimedent:GetClass() == "prop_ragdoll") then
|
||||
|
||||
if pl.ragdollmoverik_aimedskeleton then
|
||||
for bone, pbone in pairs(pl.ragdollmoverik_aimedskeleton) do
|
||||
@ -551,7 +555,7 @@ function TOOL:DrawHUD()
|
||||
surface.DrawLine(ppos.x, ppos.y, pos.x, pos.y)
|
||||
end
|
||||
|
||||
surface.DrawCircle(pos.x, pos.y, 2.5, Color(0, 200, 0, 255))
|
||||
surface.DrawCircle(pos.x, pos.y, 2.5, COLOR_GREEN)
|
||||
end
|
||||
end
|
||||
|
||||
@ -562,6 +566,8 @@ function TOOL:DrawHUD()
|
||||
rgm.DrawBoneName(aimedent, aimedbone)
|
||||
end
|
||||
|
||||
else
|
||||
PrevEnt = aimedent
|
||||
end
|
||||
|
||||
local iktype = self:GetClientNumber("type", 1)
|
||||
|
@ -11,14 +11,14 @@ tool.ragdollmover.right_gizmomode=Set offset to coordinate center of the object
|
||||
tool.ragdollmover.reload_gizmomode=Cancel set offset mode
|
||||
|
||||
tool.ragdollmover.gizmopanel=Gizmo
|
||||
tool.ragdollmover.localpos=Localized position gizmo
|
||||
tool.ragdollmover.localang=Localized angle gizmo
|
||||
tool.ragdollmover.localpos=Local position gizmo
|
||||
tool.ragdollmover.localang=Local angle gizmo
|
||||
tool.ragdollmover.scale=Scale
|
||||
tool.ragdollmover.width=Width
|
||||
tool.ragdollmover.fulldisc=Fully visible discs
|
||||
|
||||
tool.ragdollmover.gizmooffsetpanel=Gizmo Offset
|
||||
tool.ragdollmover.gizmolocaloffset=Localized offset
|
||||
tool.ragdollmover.gizmolocaloffset=Local offset
|
||||
tool.ragdollmover.gizmorelativerotate=Rotate relative to gizmo
|
||||
tool.ragdollmover.xoffset=X Offset
|
||||
tool.ragdollmover.yoffset=Y Offset
|
||||
@ -92,12 +92,12 @@ tool.ragdollmover.lockbone=Lock to this Bone
|
||||
tool.ragdollmover.unlockbone=Unlock this Bone
|
||||
tool.ragdollmover.freezebone=Freeze/Unfreeze this Bone
|
||||
|
||||
tool.ragdollmover.message0=Can't lock bone to its parent bone, how would that even work?
|
||||
tool.ragdollmover.message0=Can't lock bone to its children bone!
|
||||
tool.ragdollmover.message1=Bone locked successfully!
|
||||
tool.ragdollmover.message2=Can't lock nonphysical bones! Good luck calculating rotations of those!
|
||||
tool.ragdollmover.message2=Can't lock nonphysical bones to other bones!
|
||||
tool.ragdollmover.message3=Can't lock bone to itself, that would be weird!
|
||||
tool.ragdollmover.message4=Can't lock entity to nonphysical bones!
|
||||
tool.ragdollmover.message5=Entity locking is not allowed here!
|
||||
tool.ragdollmover.message5=Entity locking is not allowed on this server! (sv_ragdollmover_allow_constrained_locking 1)
|
||||
tool.ragdollmover.message6=Entity locked successfully!
|
||||
tool.ragdollmover.message7=Bone frozen!
|
||||
tool.ragdollmover.message8=Bone unfrozen!
|
||||
@ -119,7 +119,7 @@ tool.ragdollmover.lockedscale=Locked Scale Bone
|
||||
tool.ragdollmover.nonphysbone=Nonphysical Bone
|
||||
tool.ragdollmover.proceduralbone=Procedural Bone
|
||||
tool.ragdollmover.parentedbone=Parented Bone
|
||||
tool.ragdollmover.bonetolock=Left click on any physical bone on this list to lock it to this bone.
|
||||
tool.ragdollmover.bonetolock=Left click on any physical bone on this list to lock it to this bone
|
||||
tool.ragdollmover.lockedbonetobone=Physical Bone locked to another bone
|
||||
tool.ragdollmover.entlock=Select a physical bone from bone list to lock this entity to
|
||||
tool.ragdollmover.entselect=Select this entity
|
||||
@ -141,6 +141,10 @@ tool.ragmover_ikchains.message5=Save successful!
|
||||
tool.ragmover_ikchains.message6=Save failed. Make sure you have a ragdoll with existing IK chains selected!
|
||||
tool.ragmover_ikchains.message7=IK Chain loaded!
|
||||
|
||||
tool.ragmover_ikchains.save=Save
|
||||
tool.ragmover_ikchains.load=Load
|
||||
tool.ragmover_ikchains.selectedragdoll=Selected ragdoll:
|
||||
|
||||
tool.ragmover_ikchains.ik1=Left Leg
|
||||
tool.ragmover_ikchains.ik2=Right Leg
|
||||
tool.ragmover_ikchains.ik3=Left Arm
|
||||
@ -167,12 +171,12 @@ tool.ragmover_propragdoll.desc=Create a "Ragdoll" out of props for Ragdoll Mover
|
||||
tool.ragmover_propragdoll.left=Add a prop to be a Prop Ragdoll bone (Make sure it is from the currently selected entities set)
|
||||
tool.ragmover_propragdoll.left_use=Add a prop to a Prop Ragdoll and select it in the Prop Ragdoll tab
|
||||
tool.ragmover_propragdoll.right=Select physics props and their constrained props
|
||||
tool.ragmover_propragdoll.reload=Remove Prop Ragdoll Data
|
||||
tool.ragmover_propragdoll.reload=Remove Prop Ragdoll
|
||||
|
||||
tool.ragmover_propragdoll.treeinfo=Drag nodes from Constrained Entities tab into Prop Ragdoll tab to create skeleton for your prop ragdoll and then apply it. This tool can not read Prop Ragdoll skeleton data from existing Prop Ragdolls
|
||||
tool.ragmover_propragdoll.treeinfo=Drag nodes from "Constrained Entities" tab into "Prop Ragdoll" tab to create skeleton for your prop ragdoll and then click "Apply" button. This tool can not read Prop Ragdoll skeleton data from existing Prop Ragdolls
|
||||
tool.ragmover_propragdoll.conents=Constrained Entities
|
||||
tool.ragmover_propragdoll.propragdoll=Prop Ragdoll
|
||||
tool.ragmover_propragdoll.apply=Apply Skeleton
|
||||
tool.ragmover_propragdoll.apply=Apply
|
||||
|
||||
tool.ragmover_propragdoll.message0=Entities selected!
|
||||
tool.ragmover_propragdoll.message1=Selection cleared!
|
||||
|
190
resource/localization/ru/ragdollmover_tools.properties
Normal file
190
resource/localization/ru/ragdollmover_tools.properties
Normal file
@ -0,0 +1,190 @@
|
||||
|
||||
tool.ragdollmover.name=Ragdoll Mover
|
||||
tool.ragdollmover.desc=Продвинутое позирование рэгдолов!
|
||||
|
||||
tool.ragdollmover.left_default=Выбрать и передвигать кости
|
||||
tool.ragdollmover.info_default=Меняйте режим между передвижением/вращением/масштабированием через кнопки заданными в меню инструмента (По умолчанию: Средняя и правая кнопки мыши)
|
||||
tool.ragdollmover.reload_default=Выбрать корневую кость рэгдола
|
||||
|
||||
tool.ragdollmover.left_gizmomode=Задать сдвиг гизмо
|
||||
tool.ragdollmover.right_gizmomode=Задать сдвиг гизмо в координатный центр объекта
|
||||
tool.ragdollmover.reload_gizmomode=Отменить режим задания сдвига гизмо
|
||||
|
||||
tool.ragdollmover.gizmopanel=Гизмо
|
||||
tool.ragdollmover.localpos=Перемещение относительно кости
|
||||
tool.ragdollmover.localang=Вращение относительно кости
|
||||
tool.ragdollmover.scale=Размер
|
||||
tool.ragdollmover.width=Ширина
|
||||
tool.ragdollmover.fulldisc=Отображать диски целиком
|
||||
|
||||
tool.ragdollmover.gizmooffsetpanel=Смещение гизмо
|
||||
tool.ragdollmover.gizmolocaloffset=Относительно кости
|
||||
tool.ragdollmover.gizmorelativerotate=Вращение относительно гизмо
|
||||
tool.ragdollmover.xoffset=Смещение по X
|
||||
tool.ragdollmover.yoffset=Смещение по Y
|
||||
tool.ragdollmover.zoffset=Смещение по Z
|
||||
tool.ragdollmover.resetoffset=Сбросить смещение
|
||||
tool.ragdollmover.setoffset=Установить смещение при помощи тулгана
|
||||
|
||||
tool.ragdollmover.ikpanel=Инверсивная кинематика
|
||||
tool.ragdollmover.ik3=Левая рука
|
||||
tool.ragdollmover.ik4=Правая рука
|
||||
tool.ragdollmover.ik1=Левая нога
|
||||
tool.ragdollmover.ik2=Правая нога
|
||||
tool.ragdollmover.ikchain=Цепь
|
||||
tool.ragdollmover.ikall=Включить/выключить все
|
||||
tool.ragdollmover.additional=Дополнительные цепи
|
||||
|
||||
tool.ragdollmover.miscpanel=Дополнительно
|
||||
tool.ragdollmover.unfreeze=Разморозка при отпускании
|
||||
tool.ragdollmover.unfreezetip=Разморозить кости которые были заморожены перетаскиванием рэгдола
|
||||
tool.ragdollmover.disablefilter=Выключить фильтр энтитей
|
||||
tool.ragdollmover.disablefiltertip=Позволяет выбрать ЛЮБУЮ энтити на карте. ВНИМАНИЕ - может вызывать баги
|
||||
tool.ragdollmover.drawskeleton=Отображать скелет
|
||||
tool.ragdollmover.updaterate=Частота обновлений
|
||||
tool.ragdollmover.lockselected=Отключить выделение энтитей
|
||||
|
||||
tool.ragdollmover.bindrot=Режим вращения
|
||||
tool.ragdollmover.bindscale=Режим масштабирования
|
||||
|
||||
tool.ragdollmover.bonemanpanel=Манипуляции с костями
|
||||
tool.ragdollmover.bonemanip=Точные манипуляции с нефизическими костями
|
||||
|
||||
tool.ragdollmover.pos1=Смещение по X
|
||||
tool.ragdollmover.pos2=Смещение по Y
|
||||
tool.ragdollmover.pos3=Смещение по Z
|
||||
tool.ragdollmover.rot1=Pitch
|
||||
tool.ragdollmover.rot2=Yaw
|
||||
tool.ragdollmover.rot3=Roll
|
||||
tool.ragdollmover.scale1=Размер X
|
||||
tool.ragdollmover.scale2=Размер Y
|
||||
tool.ragdollmover.scale3=Размер Z
|
||||
|
||||
tool.ragdollmover.resetallbones=Сбросить все кости
|
||||
|
||||
tool.ragdollmover.scalechildren=Масштабировать дочерние кости
|
||||
tool.ragdollmover.smovechildren=Двигать дочерние кости с изменением масштаба
|
||||
tool.ragdollmover.physmove=Нефизические кости двигают физические кости
|
||||
tool.ragdollmover.physmovetip=Манипулирование нефизическими костями при помощи гизмо будет также двигать дочерние физические кости. Для более лучших результатов используйте инструменты Ragdoll Stretch и Ragdoll Weight с воркшопа
|
||||
tool.ragdollmover.snapenable=Включить пошаговый поворот
|
||||
tool.ragdollmover.snapamount=Шаг поворота
|
||||
|
||||
tool.ragdollmover.resetmenu=Сброс
|
||||
tool.ragdollmover.resetpos=Сброс позиции
|
||||
tool.ragdollmover.resetrot=Сброс вращения
|
||||
tool.ragdollmover.resetscale=Сброс масштабирования
|
||||
tool.ragdollmover.reset=Сброс всего
|
||||
tool.ragdollmover.resetposchildren=+Сброс позиции потомка
|
||||
tool.ragdollmover.resetrotchildren=+Сброс вращения потомка
|
||||
tool.ragdollmover.resetscalechildren=+Сброс масштабирования потомка
|
||||
tool.ragdollmover.resetchildren=+Сброс потомка
|
||||
tool.ragdollmover.scalezero=Установить нулевой размер
|
||||
tool.ragdollmover.bone=Кость
|
||||
tool.ragdollmover.bonechildren=Кость + Потомок
|
||||
|
||||
tool.ragdollmover.lockpos=Заблокировать позицию
|
||||
tool.ragdollmover.unlockpos=Разблокировать позицию
|
||||
tool.ragdollmover.lockang=Заблокировать поворот
|
||||
tool.ragdollmover.unlockang=Разблокировать поворот
|
||||
tool.ragdollmover.lockscale=Заблокировать масштабирование
|
||||
tool.ragdollmover.unlockscale=Разблокировать масштабирование
|
||||
tool.ragdollmover.lockbone=Привязать к этой кости
|
||||
tool.ragdollmover.unlockbone=Разблокировать кость
|
||||
tool.ragdollmover.freezebone=Заморозить/разморозить кость
|
||||
|
||||
tool.ragdollmover.message0=Невозможно привязать кость к её дочерней кости!
|
||||
tool.ragdollmover.message1=Кость зафиксирована успешно!
|
||||
tool.ragdollmover.message2=Невозможно привязать кость к нефизической кости!
|
||||
tool.ragdollmover.message3=Невозможно привязать кость к самой себе!
|
||||
tool.ragdollmover.message4=Невозможно привязать энтити к нефизической кости!
|
||||
tool.ragdollmover.message5=Привязка энтитей запрещена на сервере (sv_ragdollmover_allow_constrained_locking 1)!
|
||||
tool.ragdollmover.message6=Энтити зафиксирована успешно!
|
||||
tool.ragdollmover.message7=Кость заморожена!
|
||||
tool.ragdollmover.message8=Кость разморожена!
|
||||
tool.ragdollmover.message20=Выбор энтитей запрещена опцией "Отключить выделение энтитей"!
|
||||
|
||||
tool.ragdollmover.putgizmopos=Сместить гизмо сюда
|
||||
|
||||
tool.ragdollmover.bonelist=Список костей
|
||||
tool.ragdollmover.listshowall=Все
|
||||
tool.ragdollmover.listshowphys=Физические
|
||||
tool.ragdollmover.listshownonphys=Нефизические
|
||||
tool.ragdollmover.entchildren=Дочерние энтити
|
||||
tool.ragdollmover.conents=Прикреплённые энтити
|
||||
tool.ragdollmover.conentshelp=Здесь перечислены энтити, присоединённые к выделенной энтити.\nЕсли выделенная энтити является рэгдолом, вы должны уточнить (через список костей) к какой именно кости вы хотите присоединить.
|
||||
|
||||
tool.ragdollmover.physbone=Физическая кость
|
||||
tool.ragdollmover.lockedbone=Зафиксированная физическая кость
|
||||
tool.ragdollmover.lockedscale=Кость фиксированного размера
|
||||
tool.ragdollmover.nonphysbone=Нефизическая кость
|
||||
tool.ragdollmover.proceduralbone=Процедурная кость
|
||||
tool.ragdollmover.parentedbone=Кость привязанная к родительской кости
|
||||
tool.ragdollmover.bonetolock=ЛКМ по физической кости в этом списке для привязки к этой кости
|
||||
tool.ragdollmover.lockedbonetobone=Эта физическая кость прикреплена к другой кости
|
||||
tool.ragdollmover.entlock=Выберите физическую кость из списка, чтобы привязать эту энтити к ней
|
||||
tool.ragdollmover.entselect=Выбрать эту энтити
|
||||
|
||||
|
||||
tool.ragmover_ikchains.name=Ragdoll Mover - IK Chains
|
||||
tool.ragmover_ikchains.name2=Rag Mover - IK Chains
|
||||
tool.ragmover_ikchains.desc=Инструмент для создания ИК цепей из костей скелета, которые могут быть использованы Ragdoll Mover.
|
||||
tool.ragmover_ikchains.0=Используйте ЛКМ для выбора кости бедра/плеча. ПКМ для выбора рэгдолов для сохранения/загрузки ИК цепей.
|
||||
tool.ragmover_ikchains.1=Используйте ЛКМ ещё раз для выбора кости колена/локтя.
|
||||
tool.ragmover_ikchains.2=Теперь используйте ЛКМ ещё раз для выбора костей ступни/кисти.
|
||||
|
||||
tool.ragmover_ikchains.message0=Неправильный порядок костей, сброс процесса подготовки
|
||||
tool.ragmover_ikchains.message1=Эта цепь уже выбрана в качестве другой части ИК
|
||||
tool.ragmover_ikchains.message2=ИК цепь установлена!
|
||||
tool.ragmover_ikchains.message3=ИК цепь создана!
|
||||
tool.ragmover_ikchains.message4=Энтити выбрана!
|
||||
tool.ragmover_ikchains.message5=Успешно сохранено!
|
||||
tool.ragmover_ikchains.message6=Сохранение не удалось. Убедитесь что у вас есть рэгдол с ИК цепями!
|
||||
tool.ragmover_ikchains.message7=ИК цепи загружены!
|
||||
|
||||
tool.ragmover_ikchains.save=Сохранить
|
||||
tool.ragmover_ikchains.load=Загрузить
|
||||
tool.ragmover_ikchains.selectedragdoll=Выбранный рэгдолл:
|
||||
|
||||
tool.ragmover_ikchains.ik1=Левая нога
|
||||
tool.ragmover_ikchains.ik2=Правая нога
|
||||
tool.ragmover_ikchains.ik3=Левая рука
|
||||
tool.ragmover_ikchains.ik4=Правая рука
|
||||
tool.ragmover_ikchains.ik5=Дополнительный слот 1
|
||||
tool.ragmover_ikchains.ik6=Дополнительный слот 2
|
||||
tool.ragmover_ikchains.ik7=Дополнительный слот 3
|
||||
tool.ragmover_ikchains.ik8=Дополнительный слот 4
|
||||
tool.ragmover_ikchains.ik9=Дополнительный слот 5
|
||||
tool.ragmover_ikchains.ik10=Дополнительный слот 6
|
||||
|
||||
tool.ragmover_ikchains.ikslot=Слот ИК:
|
||||
|
||||
tool.ragmover_ikchains.hip=Бедро
|
||||
tool.ragmover_ikchains.upperarm=Верхнее плечо
|
||||
tool.ragmover_ikchains.knee=Колено
|
||||
tool.ragmover_ikchains.elbow=Локоть
|
||||
|
||||
|
||||
tool.ragmover_propragdoll.name=Ragdoll Mover - Prop Ragdoll
|
||||
tool.ragmover_propragdoll.name2=Rag Mover - Prop Ragdoll
|
||||
tool.ragmover_propragdoll.desc=Инструмент для создания рэгдолов из пропов, с которым может работать Ragdoll Mover
|
||||
|
||||
tool.ragmover_propragdoll.left=Добавить проп как кость Prop Ragdoll (убедитесь, что он находится в текущем выбранном наборе сущностей)
|
||||
tool.ragmover_propragdoll.left_use=Добавить проп к Prop Ragdoll выделить его во вкладке Prop Ragdoll
|
||||
tool.ragmover_propragdoll.right=Выделить физические кости и прикреплённые к ним пропы
|
||||
tool.ragmover_propragdoll.reload=Удалить Prop Ragdoll
|
||||
|
||||
tool.ragmover_propragdoll.treeinfo=Перетащите энтити из вкладки "Прикреплённые энтити" на вкладку "Prop Ragdoll" чтобы создать скелет, после чего нажмите "Применить". Этот инструмент не может прочитать данные о Prop Ragdoll из уже существующих Prop Ragdoll
|
||||
tool.ragmover_propragdoll.conents=Прикреплённые энтити
|
||||
tool.ragmover_propragdoll.propragdoll=Prop Ragdoll
|
||||
tool.ragmover_propragdoll.apply=Применить
|
||||
|
||||
tool.ragmover_propragdoll.message0=Энтити выбраны!
|
||||
tool.ragmover_propragdoll.message1=Выделение сброшено!
|
||||
tool.ragmover_propragdoll.message2=Создан скелет Prop Ragdoll!
|
||||
tool.ragmover_propragdoll.message3=Скелет Prop Ragdoll не может быть создан. Что-то не так с пропами.
|
||||
tool.ragmover_propragdoll.message4=Слишком много пропов в одном скелете!
|
||||
tool.ragmover_propragdoll.message5=Prop Ragdoll skeleton удалён!
|
||||
tool.ragmover_propragdoll.message6=Выбранный проп не прикреплён к остальным!
|
||||
|
||||
tool.ragmover_propragdoll.setroot=Выбранный проп установлен в качестве корневой кости!
|
||||
tool.ragmover_propragdoll.attach=Выбранный проп установлен как дочерний к пропу
|
Loading…
Reference in New Issue
Block a user