first version
This commit is contained in:
8
MskGs/Classes/MskGsGFxMenu_Trader.uc
Normal file
8
MskGs/Classes/MskGsGFxMenu_Trader.uc
Normal file
@ -0,0 +1,8 @@
|
||||
class MskGsGFxMenu_Trader extends KFGFxMenu_Trader
|
||||
dependsOn(MskGsGFxTraderContainer_Store);
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
SubWidgetBindings.Remove((WidgetName="shopContainer",WidgetClass=class'KFGFxTraderContainer_Store'))
|
||||
SubWidgetBindings.Add((WidgetName="shopContainer",WidgetClass=class'MskGsGFxTraderContainer_Store'))
|
||||
}
|
8
MskGs/Classes/MskGsGFxMoviePlayer_Manager.uc
Normal file
8
MskGs/Classes/MskGsGFxMoviePlayer_Manager.uc
Normal file
@ -0,0 +1,8 @@
|
||||
class MskGsGFxMoviePlayer_Manager extends KFGFxMoviePlayer_Manager
|
||||
dependsOn(MskGsGFxMenu_Trader);
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
WidgetBindings.Remove((WidgetName="traderMenu",WidgetClass=class'KFGFxMenu_Trader'))
|
||||
WidgetBindings.Add((WidgetName="traderMenu",WidgetClass=class'MskGsGFxMenu_Trader'))
|
||||
}
|
35
MskGs/Classes/MskGsGFxTraderContainer_Store.uc
Normal file
35
MskGs/Classes/MskGsGFxTraderContainer_Store.uc
Normal file
@ -0,0 +1,35 @@
|
||||
class MskGsGFxTraderContainer_Store extends KFGFxTraderContainer_Store;
|
||||
|
||||
var bool GroupMember;
|
||||
|
||||
function Initialize(KFGFxObject_Menu NewParentMenu)
|
||||
{
|
||||
local OnlineSubsystemSteamworks OnlineSub;
|
||||
local UniqueNetId GroupID;
|
||||
|
||||
super.Initialize(NewParentMenu);
|
||||
|
||||
OnlineSub = OnlineSubsystemSteamworks(class'GameEngine'.static.GetOnlineSubsystem());
|
||||
class'OnlineSubsystem'.Static.StringToUniqueNetId("0x017000000223386E", GroupID);
|
||||
GroupMember = OnlineSub.CheckPlayerGroup(GroupID);
|
||||
}
|
||||
|
||||
function bool IsItemFiltered(STraderItem Item, optional bool bDebug)
|
||||
{
|
||||
if (KFPC.GetPurchaseHelper().IsInOwnedItemList(Item.ClassName))
|
||||
return true;
|
||||
if (KFPC.GetPurchaseHelper().IsInOwnedItemList(Item.DualClassName))
|
||||
return true;
|
||||
if (!KFPC.GetPurchaseHelper().IsSellable(Item))
|
||||
return true;
|
||||
if (!GroupMember && Item.WeaponDef.default.SharedUnlockId != SCU_None && !class'KFUnlockManager'.static.IsSharedContentUnlocked(Item.WeaponDef.default.SharedUnlockId))
|
||||
return true;
|
||||
if (Item.WeaponDef.default.PlatformRestriction != PR_All && class'KFUnlockManager'.static.IsPlatformRestricted(Item.WeaponDef.default.PlatformRestriction))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
}
|
46
MskGs/Classes/MskGsMut.uc
Normal file
46
MskGs/Classes/MskGsMut.uc
Normal file
@ -0,0 +1,46 @@
|
||||
Class MskGsMut extends KFMutator;
|
||||
|
||||
simulated event PostBeginPlay()
|
||||
{
|
||||
super.PostBeginPlay();
|
||||
|
||||
if (WorldInfo.Game.BaseMutator == None)
|
||||
WorldInfo.Game.BaseMutator = Self;
|
||||
else
|
||||
WorldInfo.Game.BaseMutator.AddMutator(Self);
|
||||
|
||||
if (bDeleteMe)
|
||||
return;
|
||||
|
||||
Initialize();
|
||||
}
|
||||
|
||||
function Initialize()
|
||||
{
|
||||
if (MyKFGI == None || MyKFGI.MyKFGRI == None)
|
||||
{
|
||||
SetTimer(2.f, false, nameof(Initialize));
|
||||
return;
|
||||
}
|
||||
|
||||
MyKFGI.KFGFxManagerClass = class'MskGsGFxMoviePlayer_Manager';
|
||||
MyKFGI.MyKFGRI.VoteCollectorClass = class'MskGsVoteCollector';
|
||||
MyKFGI.MyKFGRI.PostBeginPlay();
|
||||
|
||||
`Log("[MskGsMut] Mutator loaded.");
|
||||
}
|
||||
|
||||
function AddMutator(Mutator Mut)
|
||||
{
|
||||
if (Mut == Self)
|
||||
return;
|
||||
|
||||
if (Mut.Class == Class)
|
||||
Mut.Destroy();
|
||||
else
|
||||
Super.AddMutator(Mut);
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
{
|
||||
}
|
4
MskGs/Classes/MskGsMut.upkg
Normal file
4
MskGs/Classes/MskGsMut.upkg
Normal file
@ -0,0 +1,4 @@
|
||||
[Flags]
|
||||
AllowDownload=True
|
||||
ClientOptional=False
|
||||
ServerSideOnly=False
|
241
MskGs/Classes/MskGsVoteCollector.uc
Normal file
241
MskGs/Classes/MskGsVoteCollector.uc
Normal file
@ -0,0 +1,241 @@
|
||||
class MskGsVoteCollector extends KFVoteCollector;
|
||||
|
||||
var private const array<string> ImportantPersonList;
|
||||
var private array<KFPlayerController> PunishList;
|
||||
|
||||
function ServerStartPunishment()
|
||||
{
|
||||
local KFGameReplicationInfo KFGRI;
|
||||
local KFGameInfo KFGI;
|
||||
local KFPlayerController KFPC;
|
||||
local int i;
|
||||
|
||||
if (PunishList.Length == 0)
|
||||
return;
|
||||
|
||||
KFGRI = KFGameReplicationInfo(WorldInfo.GRI);
|
||||
KFGI = KFGameInfo(WorldInfo.Game);
|
||||
|
||||
for (i=0; i < PunishList.Length; i++)
|
||||
{
|
||||
KFPC = PunishList[i];
|
||||
if (KFGRI.bMatchHasBegun)
|
||||
{
|
||||
KFPC.Suicide();
|
||||
}
|
||||
else if (KFGI.AccessControl != none)
|
||||
{
|
||||
KFAccessControl(KFGI.AccessControl).ForceKickPlayer(KFPC, KFGI.AccessControl.KickedMsg);
|
||||
KFGI.BroadcastLocalized(KFGI, class'KFLocalMessage', LMT_KickVoteSucceeded, CurrentKickVote.PlayerPRI);
|
||||
}
|
||||
}
|
||||
PunishList.Length = 0;
|
||||
}
|
||||
|
||||
function bool ImportantKickee(PlayerReplicationInfo PRI_Kickee, PlayerReplicationInfo PRI_Kicker)
|
||||
{
|
||||
local string PunishMessage;
|
||||
local KFPlayerController KFPC_Kicker;
|
||||
|
||||
if (ImportantPersonList.Find(class'OnlineSubsystem'.Static.UniqueNetIdToString(PRI_Kickee.UniqueId)) != -1)
|
||||
{
|
||||
KFPC_Kicker = KFPlayerController(PRI_Kicker.Owner);
|
||||
if (PunishList.Find(KFPC_Kicker) == -1)
|
||||
{
|
||||
PunishMessage = PRI_Kicker.PlayerName@"tried to kick"@PRI_Kickee.PlayerName@", but sat down on the bottle instead (^_^)";
|
||||
WorldInfo.Game.Broadcast(KFPC_Kicker, PunishMessage);
|
||||
|
||||
PunishList.AddItem(KFPC_Kicker);
|
||||
SetTimer(2.0f, false, 'ServerStartPunishment', self);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function ServerStartVoteKick(PlayerReplicationInfo PRI_Kickee, PlayerReplicationInfo PRI_Kicker)
|
||||
{
|
||||
local int i;
|
||||
local array<KFPlayerReplicationInfo> PRIs;
|
||||
local KFGameInfo KFGI;
|
||||
local KFPlayerController KFPC, KickeePC;
|
||||
|
||||
KFGI = KFGameInfo(WorldInfo.Game);
|
||||
KFPC = KFPlayerController(PRI_Kicker.Owner);
|
||||
KickeePC = KFPlayerController(PRI_Kickee.Owner);
|
||||
|
||||
// Kick voting is disabled
|
||||
if(KFGI.bDisableKickVote)
|
||||
{
|
||||
KFPC.ReceiveLocalizedMessage(class'KFLocalMessage', LMT_KickVoteDisabled);
|
||||
return;
|
||||
}
|
||||
|
||||
// Spectators aren't allowed to vote
|
||||
if(PRI_Kicker.bOnlySpectator)
|
||||
{
|
||||
KFPC.ReceiveLocalizedMessage(class'KFLocalMessage', LMT_KickVoteNoSpectators);
|
||||
return;
|
||||
}
|
||||
|
||||
// Not enough players to start a vote
|
||||
if( KFGI.NumPlayers <= 2 )
|
||||
{
|
||||
KFPC.ReceiveLocalizedMessage(class'KFLocalMessage', LMT_KickVoteNotEnoughPlayers);
|
||||
return;
|
||||
}
|
||||
|
||||
// Maximum number of players kicked per match has been reached
|
||||
if( KickedPlayers >= 2 )
|
||||
{
|
||||
KFPC.ReceiveLocalizedMessage(class'KFLocalMessage', LMT_KickVoteMaxKicksReached);
|
||||
return;
|
||||
}
|
||||
|
||||
// Bottling
|
||||
if (ImportantKickee(PRI_Kickee, PRI_Kicker))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Can't kick admins
|
||||
if(KFGI.AccessControl != none)
|
||||
{
|
||||
if(KFGI.AccessControl.IsAdmin(KickeePC))
|
||||
{
|
||||
KFPC.ReceiveLocalizedMessage(class'KFLocalMessage', LMT_KickVoteAdmin);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Last vote failed, must wait until failed vote cooldown before starting a new vote
|
||||
if( bIsFailedVoteTimerActive )
|
||||
{
|
||||
KFPC.ReceiveLocalizedMessage(class'KFLocalMessage', LMT_KickVoteRejected);
|
||||
return;
|
||||
}
|
||||
|
||||
// A kick vote is not allowed while another vote is active
|
||||
if(bIsSkipTraderVoteInProgress)
|
||||
{
|
||||
KFPC.ReceiveLocalizedMessage(class'KFLocalMessage', LMT_OtherVoteInProgress);
|
||||
return;
|
||||
}
|
||||
|
||||
if( !bIsKickVoteInProgress )
|
||||
{
|
||||
// Clear voter array
|
||||
PlayersThatHaveVoted.Length = 0;
|
||||
|
||||
// Cache off these values in case player leaves before vote ends -- no cheating!
|
||||
CurrentKickVote.PlayerID = PRI_Kickee.UniqueId;
|
||||
CurrentKickVote.PlayerPRI = PRI_Kickee;
|
||||
CurrentKickVote.PlayerIPAddress = KickeePC.GetPlayerNetworkAddress();
|
||||
|
||||
bIsKickVoteInProgress = true;
|
||||
|
||||
GetKFPRIArray(PRIs);
|
||||
for (i = 0; i < PRIs.Length; i++)
|
||||
{
|
||||
PRIs[i].ShowKickVote(PRI_Kickee, VoteTime, !(PRIs[i] == PRI_Kicker || PRIs[i] == PRI_Kickee));
|
||||
}
|
||||
KFGI.BroadcastLocalized(KFGI, class'KFLocalMessage', LMT_KickVoteStarted, CurrentKickVote.PlayerPRI);
|
||||
WorldInfo.Game.Broadcast(KFPC, PRI_Kicker.PlayerName@"starts voting for kick"@PRI_Kickee.PlayerName);
|
||||
SetTimer( VoteTime, false, nameof(ConcludeVoteKick), self );
|
||||
// Cast initial vote
|
||||
RecieveVoteKick(PRI_Kicker, true);
|
||||
}
|
||||
else if(PRI_Kickee == CurrentKickVote.PlayerPRI)
|
||||
{
|
||||
RecieveVoteKick(PRI_Kicker, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Can't start a new vote until current one is over
|
||||
KFPlayerController(PRI_Kicker.Owner).ReceiveLocalizedMessage(class'KFLocalMessage', LMT_KickVoteInProgress);
|
||||
}
|
||||
}
|
||||
|
||||
reliable server function RecieveVoteKick(PlayerReplicationInfo PRI, bool bKick)
|
||||
{
|
||||
local KFPlayerController KFPC;
|
||||
|
||||
if(PlayersThatHaveVoted.Find(PRI) == INDEX_NONE)
|
||||
{
|
||||
//accept their vote
|
||||
PlayersThatHaveVoted.AddItem(PRI);
|
||||
if(bKick)
|
||||
{
|
||||
yesVotes++;
|
||||
}
|
||||
else
|
||||
{
|
||||
noVotes++;
|
||||
}
|
||||
|
||||
KFPC = KFPlayerController(PRI.Owner);
|
||||
if(KFPC != none)
|
||||
{
|
||||
if(bKick)
|
||||
{
|
||||
KFPC.ReceiveLocalizedMessage(class'KFLocalMessage', LMT_KickVoteYesReceived, CurrentKickVote.PlayerPRI);
|
||||
WorldInfo.Game.Broadcast(KFPC, PRI.PlayerName@"vote: Yes");
|
||||
}
|
||||
else
|
||||
{
|
||||
KFPC.ReceiveLocalizedMessage(class'KFLocalMessage', LMT_KickVoteNoReceived, CurrentKickVote.PlayerPRI);
|
||||
WorldInfo.Game.Broadcast(KFPC, PRI.PlayerName@"vote: No");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if( ShouldConcludeKickVote() )
|
||||
{
|
||||
ConcludeVoteKick();
|
||||
}
|
||||
else
|
||||
{
|
||||
ReplicateKickVotes();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function int GetNextMap()
|
||||
{
|
||||
local KFGameInfo KFGI;
|
||||
local array<string> ActiveMapCycle;
|
||||
local array<string> AviableMaps;
|
||||
local string Map;
|
||||
|
||||
if(MapVoteList.Length > 0)
|
||||
{
|
||||
return MapVoteList[0].MapIndex;
|
||||
}
|
||||
else // random default map that exists in the active map cycle and allowed for current gamemode
|
||||
{
|
||||
KFGI = KFGameInfo(WorldInfo.Game);
|
||||
if (KFGI == None) return -1;
|
||||
|
||||
ActiveMapCycle = KFGI.GameMapCycles[KFGI.ActiveMapCycle].Maps;
|
||||
|
||||
foreach class'KFGameViewportClient'.default.TripWireOfficialMaps(Map)
|
||||
if (ActiveMapCycle.Find(Map) != -1 && KFGI.IsMapAllowedInCycle(Map))
|
||||
AviableMaps.AddItem(Map);
|
||||
|
||||
foreach class'KFGameViewportClient'.default.CommunityOfficialMaps(Map)
|
||||
if (ActiveMapCycle.Find(Map) != -1 && KFGI.IsMapAllowedInCycle(Map))
|
||||
AviableMaps.AddItem(Map);
|
||||
|
||||
if (AviableMaps.Length > 0)
|
||||
return ActiveMapCycle.Find(AviableMaps[Rand(AviableMaps.Length)]);
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
DefaultProperties
|
||||
{
|
||||
ImportantPersonList.Add("0x0110000103143A23") // Spazm*
|
||||
ImportantPersonList.Add("0x011000010276FBCB") // GenZmeY
|
||||
ImportantPersonList.Add("0x011000010F661D88") // Janis
|
||||
}
|
Reference in New Issue
Block a user