//=============================================================================
// KFCarryableObject_Collectible
//=============================================================================
// A carried object that forces the player to equip it and prevents the player
// from switching to a different inventory item, though it can be dropped.
//=============================================================================
// Killing Floor 2
// Copyright (C) 2018 Tripwire Interactive LLC
//=============================================================================
class KFCarryableObject_Collectible extends KFCarryableObject
	abstract;

var KFObjectiveCollectActor ParentCollectActor;

var float StartingOverrideGroundSpeed;
var float StartingOverrideSprintSpeed;

simulated state Inactive
{
	simulated function BeginState(name PreviousStateName)
	{
		super.BeginState(PreviousStateName);
		SetTimer(1.0f, true, nameof(NotifyRemovedPending));
	}

	simulated function EndState(Name NextStateName)
	{
		super.EndState(NextStateName);
		ClearTimer(nameof(NotifyRemovedPending));
	}
}

simulated event PreBeginPlay()
{
	Super.PreBeginPlay();

	UpdateSpeedOverride();
}

// when the weapon was pending equip and then overriden by another pending equip
simulated function NotifyRemovedPending()
{
	if (Instigator.Weapon != none && Instigator.Weapon != self)
	{
		TossIfInactive();
	}
}

simulated function UpdateSpeedOverride()
{
	local KFPawn_Human KFPH;

	KFPH = KFPawn_Human(Instigator);
	if (KFPH != none)
	{
		if (KFGameReplicationInfo(WorldInfo.GRI).GetNumPlayersAlive() <= 1)
		{
			OverrideGroundSpeed = -1;
			OverrideSprintSpeed = -1;
		}
		else
		{
			OverrideGroundSpeed = StartingOverrideGroundSpeed;
			OverrideSprintSpeed = StartingOverrideSprintSpeed;
		}

		KFPH.UpdateGroundSpeed();
	}
}

simulated function TossIfInactive()
{
	local KFWeap_HealerBase QuickHealWeapon;

	if (Role == ROLE_Authority)
	{
		// unless the player is just temporarily quick healing
		QuickHealWeapon = KFWeap_HealerBase(Instigator.Weapon);
		if (QuickHealWeapon == none || (!QuickHealWeapon.IsInState('WeaponQuickHeal') && !QuickHealWeapon.IsInState('Inactive')))
		{
			Instigator.TossInventory(self);
		}
	}
}

simulated function UpdateReplicationInfo(bool bCarried)
{
	local KFPawn_Human KFPH;
	local KFPlayerReplicationInfo KFPRI;
	local KFPlayerController KFPC;

	KFPH = KFPawn_Human(Owner);
	KFPC = KFPlayerController(KFPH.Controller);
	KFPRI = KFPlayerReplicationInfo(KFPC.PlayerReplicationInfo);
	KFPRI.bCarryingCollectible = bCarried;
}

simulated function NotifyPickedUp()
{
	UpdateReplicationInfo(true);

	if (ParentCollectActor != none)
	{
		ParentCollectActor.SetCollectibleState(ECollectibleState_Carried);
	}

	UpdateSpeedOverride();

	super.NotifyPickedUp();
}

function DropFrom(vector StartLocation, vector StartVelocity)
{
	UpdateReplicationInfo(false);

	if (ParentCollectActor != none)
	{
		ParentCollectActor.OnCarryableDropped();
	}
	
	Super.DropFrom(StartLocation, StartVelocity);
}

function SetupDroppedPickup(out DroppedPickup P, vector StartVelocity)
{
	local KFDroppedPickup_Carryable pickup;

	pickup = KFDroppedPickup_Carryable(P);
	if (pickup != none)
	{
		pickup.ParentCollectActor = ParentCollectActor;
	}

	super.SetupDroppedPickup(P, StartVelocity);
}

function SetOriginalValuesFromPickup(KFWeapon PickedUpWeapon)
{
	local KFCarryableObject_Collectible PickedUpCollectible;

	PickedUpCollectible = KFCarryableObject_Collectible(PickedUpWeapon);
	if (PickedUpCollectible != none)
	{
		ParentCollectActor = PickedUpCollectible.ParentCollectActor;
	}

	super.SetOriginalValuesFromPickup(PickedUpWeapon);
}

defaultproperties
{

	FireModeIconPaths(DEFAULT_FIREMODE) = Texture2D'ui_firemodes_tex.UI_FireModeSelect_BluntMelee'
	FiringStatesArray(DEFAULT_FIREMODE) = MeleeAttackBasic
	WeaponFireTypes(DEFAULT_FIREMODE) = EWFT_Custom
	InstantHitMomentum(DEFAULT_FIREMODE) = 30000.f
	InstantHitDamage(DEFAULT_FIREMODE) = 100.0
	InstantHitDamageTypes(DEFAULT_FIREMODE) = class'KFDT_Bludgeon_Carryable'
	AmmoCost(DEFAULT_FIREMODE) = 0

	FiringStatesArray(BASH_FIREMODE) = MeleeAttackBasic
	WeaponFireTypes(BASH_FIREMODE) = EWFT_Custom
	InstantHitMomentum(BASH_FIREMODE) = 30000.f
	InstantHitDamage(BASH_FIREMODE) = 100.0
	InstantHitDamageTypes(BASH_FIREMODE) = class'KFDT_Bludgeon_Carryable'
	AmmoCost(BASH_FIREMODE) = 0

	FiringStatesArray(HEAVY_ATK_FIREMODE) = MeleeAttackBasic
	WeaponFireTypes(HEAVY_ATK_FIREMODE) = EWFT_Custom
	InstantHitMomentum(HEAVY_ATK_FIREMODE) = 30000.f
	InstantHitDamage(HEAVY_ATK_FIREMODE) = 100.0
	InstantHitDamageTypes(HEAVY_ATK_FIREMODE) = class'KFDT_Bludgeon_Carryable'
	AmmoCost(HEAVY_ATK_FIREMODE) = 0

	DroppedPickupClass=class'KFDroppedPickup_Carryable'
	InventoryGroup=IG_Equipment
	GroupPriority=100

	// Defensive
	ParryStrength=4
	ParryDamageMitigationPercent=0.50
	BlockDamageMitigation=0.60

	StartingOverrideGroundSpeed=203.f; //192
	StartingOverrideSprintSpeed=280.f; //230
}