Автовыкидывание оружия при несовпадении условий Автовыкидывание оружия при несовпадении условий Мутатор выкидывания оружия, если игрок не отвечает определённым критериям. Например, выкидывание оружия чужого перка или выкидывание спец пушек, для которых надо обладат...
#1
Отправлено:
Автовыкидывание оружия при несовпадении условий
Мутатор выкидывания оружия, если игрок не отвечает определённым критериям.
Например, выкидывание оружия чужого перка или выкидывание спец пушек, для которых надо обладать определённым уровнем и/или перка.
Оружие выкидывается перед игроком на определённом расстоянии.
Настройки в ini файле:
WeaponInfoList=(Perk="SRVetBerserker",Level=4,Weapon="KFMod.Katana") - элемент основного массива
Weapon - код пушки (полный - пакет.оружие)
Perk - перк обладателю которого позволено владеть данной пушкой (если написать Perk="", то важен только уровень - перк любой)
Level - уровень начиная с которого можно владеть оружием
То есть если мы хотим, чтобы катана у всех перков кроме берсеркера 4+ уровня выпадала - пишем то, что написано выше
Если мы хотим чтобы все перки до 6 выкидывали катану - пишем
WeaponInfoList=(Perk="",Level=6,Weapon="KFMod.Katana")
Если же мы хотим, чтобы катаной могли владеть берс начиная с 4 уровня и медик начиная с 8 уровня, то создаём ещё один элемента массива:
WeaponInfoList=(Perk="SRVetFieldMedic",Level=8,Weapon="KFMod.Katana")
При такой настройке катана будет у 4+ берса и 8+ медика, у остальных она будет выпадать
Ну вроде самое сложное отписал. Если что непонятно - спрашивайте в комментариях.
Остальные настройки:
ExceptionList=76561198044444444 - массив игроков на которых мутатор не действует
bAdminInExceptionList=false - принадлежат ли админы к исключениям? если true, то на всех кто сейчас находится под админкой мутатор не действует
TimerPeriod=2.000000 - период таймера в секундах, который осуществляет проверку легитимности)
bDestroy=True - некоторые пушки нельзя выкинуть, если значение этого параметра true - значит такие пушки просто будут уничтожаться
ThrowDistance=100 - расстояние на которое выбрасываются пушки впереди игрока
bSendInfoMessage=True - пишем ли мы сообщение игроку о выбрасывании пушки
MSG_Drop=Your perk and/or level is not good enough to possess - само сообщение. в конце данного сообщения автоматически добавляется название пушки (Weapon.ItemName)
Мутатор:
class DropWeaponsMut extends Mutator config(DropWeaponsMut);
// Мутатор выкидывает упомянутое в ini оружие, если не выполнены условия по уровню и/или перку.
struct WeaponInfoStruct
{
var() globalconfig string Perk;
var() globalconfig int Level;
var() globalconfig string Weapon;
};
var() globalconfig array<WeaponInfoStruct> WeaponInfoList;
var() globalconfig array<string> ExceptionList;
var() globalconfig bool bAdminInExceptionList;
var() globalconfig float TimerPeriod;
var() globalconfig bool bDestroy;
var() globalconfig int ThrowDistance;
var() globalconfig bool bSendInfoMessage;
var() globalconfig string MSG_Drop;
function PostBeginPlay()
{
SaveConfig();
SetTimer(TimerPeriod, true);
}
function Timer()
{
local Controller C;
for (C = Level.ControllerList; C != None; C = C.NextController)
{
if (C.IsA('PlayerController') && C.Pawn != None)
ModifyPawn(C.Pawn);
}
}
// Клиент: не оставить игрока без оружия после выброса.
simulated function Tick(float Delta)
{
local PlayerController PC;
PC = Level.GetLocalPlayerController();
if (PC != None && PC.Pawn != None && PC.Pawn.Weapon == None)
PC.SwitchToBestWeapon();
}
function ModifyPawn(Pawn Other)
{
local Inventory Inv;
if (Other == None || Other.Inventory == None)
return;
for (Inv = Other.Inventory; Inv != None; Inv = Inv.Inventory)
{
if (InDropList(Inv, Other) && !InExceptionList(Other.Controller))
DropOrDestroy(Inv, Other);
}
}
function bool InDropList(Inventory Inv, Pawn Other)
{
local int i;
local int cLevel;
local string Veterancy;
local int InList, ReturnTrue;
local KFPlayerReplicationInfo KFPRI;
KFPRI = KFPlayerReplicationInfo(Other.PlayerReplicationInfo);
if (KFPRI != None)
{
cLevel = KFPRI.ClientVeteranSkillLevel;
Veterancy = string(KFPRI.ClientVeteranSkill.Name);
}
for (i = 0; i < WeaponInfoList.Length; i++)
{
if (string(Inv.Class) ~= WeaponInfoList[i].Weapon)
{
InList++;
if (
(WeaponInfoList[i].Perk != "" && Veterancy != WeaponInfoList[i].Perk)
|| cLevel < WeaponInfoList[i].Level)
{
ReturnTrue++;
}
}
}
if (InList > 0 && ReturnTrue == InList)
return true;
return false;
}
function DropOrDestroy(Inventory Inv, Pawn Other)
{
if (KFWeapon(Inv) == None)
return;
if (!KFWeapon(Inv).bKFNeverThrow)
{
if (PlayerController(Other.Controller) != None && bSendInfoMessage)
PlayerController(Other.Controller).ClientMessage(MSG_Drop @ Inv.ItemName);
Inv.DropFrom(Other.Location + vector(Other.Rotation) * ThrowDistance);
}
else if (bDestroy)
{
if (PlayerController(Other.Controller) != None && bSendInfoMessage)
PlayerController(Other.Controller).ClientMessage(MSG_Drop @ Inv.ItemName);
Inv.Destroy();
}
}
function bool InExceptionList(Controller C)
{
local PlayerController PC;
local int i;
local string Hash;
PC = PlayerController(C);
if (PC == None)
return true;
if (bAdminInExceptionList && C.PlayerReplicationInfo.bAdmin)
return true;
Hash = PC.GetPlayerIDHash();
for (i = 0; i < ExceptionList.Length; i++)
{
if (ExceptionList[i] ~= Hash)
return true;
}
return false;
}
defaultproperties
{
ExceptionList(0)="76561198044444444"
WeaponInfoList(0)=(Weapon="KFMod.Katana",Perk="SRVetBerserker",Level=4)
WeaponInfoList(1)=(Weapon="KFMod.Deagle",Perk="SRVetSharpshooter",Level=4)
WeaponInfoList(2)=(Weapon="KFMod.Katana",Perk="SRVetFieldMedic",Level=8)
bSendInfoMessage=true
MSG_Drop="Your perk and/or level is not good enough to possess"
bDestroy=true
bAdminInExceptionList=false
TimerPeriod=2.0
ThrowDistance=100
bAddToServerPackages=True
GroupName="KF-DropWeapons"
FriendlyName="DropWeapons"
Description="DropWeapons"
bAlwaysRelevant=True
RemoteRole=ROLE_SimulatedProxy
}
Путь к мутатору:
DropWeaponsMut.DropWeaponsMut
Скомпилированная версия: https://yadi.sk/d/PdqXk-b_dpfCo
Написал я этот мутатор и подумал
А ведь тому, кто меня просил небось просто нужен был мутатор, который выкидывает пушки чужого перка
Он же задерётся вбивать все пушки в инишник)
И сделал урезанную версию того же самого мутатора без всяких списков. Тупо проверяющую индекс перка и индекс пушки
Итак, мутатор выкидывает пушки принадлежащие чужому перку
Настройки в ini файле:
ExceptionList=76561198044444444 - массив игроков на которых мутатор не действует
bAdminInExceptionList=false - принадлежат ли админы к исключениям? если true, то на всех кто сейчас находится под админкой мутатор не действует
TimerPeriod=1.000000 - период таймера в секундах, который осуществляет проверку легитимности)
bDestroy=True - некоторые пушки нельзя выкинуть, если значение этого параметра true - значит такие пушки просто будут уничтожаться
ThrowDistance=100 - расстояние на которое выбрасываются пушки впереди игрока
bSendInfoMessage=True - пишем ли мы сообщение игроку о выбрасывании пушки
MSG_Drop=You have wrong perk to possess - само сообщение. в конце данного сообщения автоматически добавляется название пушки (Weapon.ItemName)
Мутатор:
class DropNonPerkWeaponsMut extends Mutator config(DropNonPerkWeaponsMut);
// Мутатор выкидывает оружие других перков (упрощённая схема по индексу перка).
var() globalconfig array<string> ExceptionList;
var() globalconfig bool bAdminInExceptionList;
var() globalconfig float TimerPeriod;
var() globalconfig bool bDestroy;
var() globalconfig int ThrowDistance;
var() globalconfig bool bSendInfoMessage;
var() globalconfig string MSG_Drop;
function PostBeginPlay()
{
SaveConfig();
SetTimer(TimerPeriod, true);
}
function Timer()
{
local Controller C;
for (C = Level.ControllerList; C != None; C = C.NextController)
{
if (C.IsA('PlayerController') && C.Pawn != None)
ModifyPawn(C.Pawn);
}
}
simulated function Tick(float Delta)
{
local PlayerController PC;
PC = Level.GetLocalPlayerController();
if (PC != None && PC.Pawn != None && PC.Pawn.Weapon == None)
PC.SwitchToBestWeapon();
}
function ModifyPawn(Pawn Other)
{
local Inventory Inv;
if (Other == None || Other.Inventory == None)
return;
for (Inv = Other.Inventory; Inv != None; Inv = Inv.Inventory)
{
if (InDropList(Inv, Other) && !InExceptionList(Other.Controller))
DropOrDestroy(Inv, Other);
}
}
function bool InDropList(Inventory Inv, Pawn Other)
{
local int cLevel;
local string Veterancy;
local KFPlayerReplicationInfo KFPRI;
local int PerkIndex;
if (KFWeapon(Inv) == None)
return false;
KFPRI = KFPlayerReplicationInfo(Other.PlayerReplicationInfo);
if (KFPRI != None)
{
cLevel = KFPRI.ClientVeteranSkillLevel;
Veterancy = string(KFPRI.ClientVeteranSkill.Name);
PerkIndex = KFPRI.ClientVeteranSkill.default.PerkIndex;
}
if (PerkIndex != class<KFWeaponPickup>(KFWeapon(Inv).PickupClass).default.CorrespondingPerkIndex)
return true;
return false;
}
function DropOrDestroy(Inventory Inv, Pawn Other)
{
if (KFWeapon(Inv) == None)
return;
if (!KFWeapon(Inv).bKFNeverThrow)
{
if (PlayerController(Other.Controller) != None && bSendInfoMessage)
PlayerController(Other.Controller).ClientMessage(MSG_Drop @ Inv.ItemName);
Inv.DropFrom(Other.Location + vector(Other.Rotation) * ThrowDistance);
}
else if (bDestroy)
{
if (PlayerController(Other.Controller) != None && bSendInfoMessage)
PlayerController(Other.Controller).ClientMessage(MSG_Drop @ Inv.ItemName);
Inv.Destroy();
}
}
function bool InExceptionList(Controller C)
{
local PlayerController PC;
local int i;
local string Hash;
PC = PlayerController(C);
if (PC == None)
return true;
if (bAdminInExceptionList && C.PlayerReplicationInfo.bAdmin)
return true;
Hash = PC.GetPlayerIDHash();
for (i = 0; i < ExceptionList.Length; i++)
{
if (ExceptionList[i] ~= Hash)
return true;
}
return false;
}
defaultproperties
{
ExceptionList(0)="76561198044444444"
bSendInfoMessage=true
MSG_Drop="You have wrong perk to possess"
bDestroy=false
bAdminInExceptionList=false
TimerPeriod=1.0
ThrowDistance=150
bAddToServerPackages=True
GroupName="KF-DropNonPerkWeapons"
FriendlyName="DropNonPerkWeaponsMut"
Description="DropNonPerkWeaponsMut"
bAlwaysRelevant=True
RemoteRole=ROLE_SimulatedProxy
}
Путь к мутатору:
DropNonPerkWeaponsMut.DropNonPerkWeaponsMut
Скомпилированная версия: https://yadi.sk/d/FzmWo6KNdpfUH
P.S.
Оба мутатора чуток спамят в лог при выкидывании пушек. Потом поправлю.
Warning: DropWeaponsMut KF-Meow-NewYearFix.DropWeaponsMut (Function DropWeaponsMut.DropWeaponsMut.ModifyPawn:008A) Accessed None 'Inv'
Автор: Flame