216 lines
7.3 KiB
Ucode
216 lines
7.3 KiB
Ucode
class NiceSingle extends NiceWeapon;
|
|
var bool bIsDual;
|
|
var int otherMagazine;
|
|
var class<NiceDualies> DualClass;
|
|
replication{
|
|
reliable if(Role < ROLE_Authority)
|
|
ServerSwitchToOtherSingle, ServerSwitchToDual;
|
|
reliable if(Role == ROLE_Authority)
|
|
bIsDual, otherMagazine;
|
|
}
|
|
function bool HandlePickupQuery(Pickup Item){
|
|
local float AddWeight;
|
|
if(Item.InventoryType == class){
|
|
AddWeight = Weight;
|
|
if(DualClass != none)
|
|
AddWeight = dualClass.default.Weight - AddWeight;
|
|
if(bIsDual || KFHumanPawn(Owner) != none && !KFHumanPawn(Owner).CanCarry(AddWeight)){
|
|
PlayerController(Instigator.Controller).ReceiveLocalizedMessage(Class'KFMainMessages', 2);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
return super.HandlePickupQuery(Item);
|
|
}
|
|
simulated function bool AltFireCanForceInterruptReload(){
|
|
return true;
|
|
}
|
|
simulated function Fire(float F){
|
|
if(!bIsReloading && GetMagazineAmmo() <= 0 && otherMagazine > 0)
|
|
ServerSwitchToOtherSingle();
|
|
else
|
|
super.Fire(F);
|
|
}
|
|
simulated function AltFire(float F){
|
|
if(bIsDual && NicePlayerController(Instigator.Controller) != none)
|
|
ClientForceInterruptReload(CANCEL_PASSIVESWITCH);
|
|
if(!bIsReloading && bIsDual)
|
|
ServerSwitchToDual();
|
|
else
|
|
super.AltFire(F);
|
|
}
|
|
function ServerSwitchToOtherSingle(){
|
|
local int swap;
|
|
local NiceHumanPawn nicePawn;
|
|
nicePawn = NiceHumanPawn(Instigator);
|
|
if(!bIsDual || nicePawn == none || nicePawn.Health <= 0)
|
|
return;
|
|
Ammo[0].AmmoAmount += otherMagazine - MagAmmoRemaining;
|
|
swap = MagAmmoRemaining;
|
|
MagAmmoRemaining = otherMagazine;
|
|
otherMagazine = swap;
|
|
ClientSetMagSize(MagAmmoRemaining, bRoundInChamber);
|
|
nicePawn.ClientChangeWeapon(self);
|
|
}
|
|
function ServerSwitchToDual(){
|
|
local int m;
|
|
local int origAmmo;
|
|
local NiceHumanPawn nicePawn;
|
|
local NiceDualies dualPistols;
|
|
local NicePlainData.Data transferData;
|
|
nicePawn = NiceHumanPawn(Instigator);
|
|
if(!bIsDual || DualClass == none || nicePawn == none || nicePawn.Health <= 0)
|
|
return;
|
|
nicePawn.CurrentWeight -= Weight;
|
|
Weight = 0;
|
|
origAmmo = AmmoAmount(0);
|
|
for(m = 0; m < NUM_FIRE_MODES;m ++)
|
|
if(FireMode[m].bIsFiring)
|
|
StopFire(m);
|
|
DetachFromPawn(nicePawn);
|
|
dualPistols = nicePawn.Spawn(DualClass);
|
|
if(dualPistols != none){
|
|
dualPistols.DemoReplacement = class;
|
|
transferData = GetNiceData();
|
|
dualPistols.GiveTo(nicePawn);
|
|
dualPistols.SetNiceData(transferData, nicePawn);
|
|
dualPistols.MagAmmoRemRight = MagAmmoRemaining;
|
|
dualPistols.MagAmmoRemLeft = otherMagazine;
|
|
dualPistols.MagAmmoRemaining = dualPistols.MagAmmoRemLeft + dualPistols.MagAmmoRemRight;
|
|
dualPistols.SellValue = SellValue;
|
|
dualPistols.Ammo[0].AmmoAmount = origAmmo + otherMagazine;
|
|
dualPistols.ClientSetDualMagSize(dualPistols.MagAmmoRemLeft, dualPistols.MagAmmoRemRight);
|
|
//nicePawn.ClientChangeWeapon(dualPistols);
|
|
//nicePawn.ServerChangedWeapon(self, dualPistols);
|
|
}
|
|
Destroy();
|
|
}
|
|
function DropFrom(vector StartLocation){
|
|
local int m;
|
|
local int magKeep, magGive;
|
|
local KFWeaponPickup weapPickup;
|
|
local int weightBeforeThrow;
|
|
local int AmmoThrown, OtherAmmo;
|
|
local NiceHumanPawn nicePawn;
|
|
nicePawn = NiceHumanPawn(Instigator);
|
|
if(nicePawn == none)
|
|
return;
|
|
if(!bIsDual){
|
|
super.DropFrom(StartLocation);
|
|
return;
|
|
}
|
|
weightBeforeThrow = nicePawn.CurrentWeight;
|
|
magKeep = otherMagazine;
|
|
magGive = MagAmmoRemaining;
|
|
OtherAmmo = AmmoAmount(0) - magKeep;
|
|
ClientWeaponThrown();
|
|
for(m = 0; m < NUM_FIRE_MODES;m ++)
|
|
if(FireMode[m].bIsFiring)
|
|
StopFire(m);
|
|
if(nicePawn != none)
|
|
DetachFromPawn(nicePawn);
|
|
AmmoThrown = OtherAmmo / 2;
|
|
OtherAmmo = OtherAmmo - AmmoThrown;
|
|
Ammo[0].AmmoAmount = OtherAmmo + magKeep;
|
|
MagAmmoRemaining = magKeep;
|
|
ClientSetMagSize(MagAmmoRemaining, bRoundInChamber);
|
|
weapPickup = KFWeaponPickup(nicePawn.Spawn(default.PickupClass,,, StartLocation));
|
|
if(weapPickup != none){
|
|
weapPickup.InitDroppedPickupFor(self);
|
|
weapPickup.Velocity = Velocity;
|
|
weapPickup.AmmoAmount[0] = AmmoThrown + magGive;
|
|
weapPickup.SellValue = SellValue * 0.5;
|
|
SellValue *= 0.5;
|
|
weapPickup.MagAmmoRemaining = magGive;
|
|
if(nicePawn.Health > 0)
|
|
weapPickup.bThrown = true;
|
|
nicePawn.ClientChangeWeapon(self);
|
|
}
|
|
RemoveDual(weightBeforeThrow);
|
|
}
|
|
function RemoveDual(int pawnWeight){
|
|
local NiceHumanPawn nicePawn;
|
|
nicePawn = NiceHumanPawn(Instigator);
|
|
if(!bIsDual || nicePawn == none)
|
|
return;
|
|
bIsDual = false;
|
|
DemoReplacement = none;
|
|
nicePawn.CurrentWeight = pawnWeight - (Weight - default.Weight);
|
|
Weight = default.Weight;
|
|
otherMagazine = 0;
|
|
}
|
|
//SellValue
|
|
function GiveTo(Pawn other, optional Pickup Pickup){
|
|
local int m;
|
|
local int initAmmo, initMag;
|
|
local bool bDestroy;
|
|
local NiceSingle nicePistol;
|
|
local NiceDualies niceDual;
|
|
if(other != none){
|
|
nicePistol = NiceSingle(other.FindInventoryType(class));
|
|
niceDual = NiceDualies(other.FindInventoryType(DualClass));
|
|
}
|
|
bDestroy = false;
|
|
if(nicePistol == none || (niceDual != none && niceDual.bSwitching))
|
|
super.GiveTo(other, Pickup);
|
|
else if((nicePistol != none && nicePistol.bIsDual) || niceDual != none)
|
|
bDestroy = true;
|
|
else{
|
|
nicePistol.UpdateMagCapacity(other.PlayerReplicationInfo);
|
|
initAmmo = nicePistol.FireMode[0].AmmoClass.default.InitialAmount;
|
|
initMag = nicePistol.MagCapacity;
|
|
initMag = Min(initMag, initAmmo);
|
|
initAmmo -= initMag;
|
|
if(nicePistol.Ammo[0] != none){
|
|
nicePistol.Ammo[0].AmmoAmount += initAmmo;
|
|
nicePistol.Ammo[0].AmmoAmount = Min(nicePistol.Ammo[0].AmmoAmount, nicePistol.Ammo[0].MaxAmmo);
|
|
}
|
|
nicePistol.bIsDual = true;
|
|
nicePistol.otherMagazine = initMag;
|
|
nicePistol.SellValue = 2 * min(SellValue, nicePistol.SellValue);
|
|
nicePistol.ServerSwitchToDual();
|
|
bDestroy = true;
|
|
}
|
|
if(bDestroy){
|
|
for(m = 0; m < NUM_FIRE_MODES;m ++)
|
|
Ammo[m] = none;
|
|
Destroy();
|
|
}
|
|
}
|
|
|
|
defaultproperties
|
|
{
|
|
DualClass=Class'NicePack.NiceDualies'
|
|
bHasChargePhase=False
|
|
FirstPersonFlashlightOffset=(X=-20.000000,Y=-22.000000,Z=8.000000)
|
|
MagCapacity=15
|
|
ReloadRate=2.000000
|
|
ReloadAnim="Reload"
|
|
ReloadAnimRate=1.000000
|
|
WeaponReloadAnim="Reload_Single9mm"
|
|
ModeSwitchAnim="LightOn"
|
|
Weight=0.000000
|
|
bHasAimingMode=True
|
|
IdleAimAnim="Idle_Iron"
|
|
StandardDisplayFOV=70.000000
|
|
TraderInfoTexture=Texture'KillingFloorHUD.Trader_Weapon_Images.Trader_9mm'
|
|
ZoomedDisplayFOV=65.000000
|
|
FireModeClass(0)=Class'NicePack.NiceSingleFire'
|
|
FireModeClass(1)=Class'KFMod.NoFire'
|
|
PutDownAnim="PutDown"
|
|
AIRating=0.250000
|
|
CurrentRating=0.250000
|
|
bShowChargingBar=True
|
|
Description="A 9mm Pistol"
|
|
DisplayFOV=70.000000
|
|
Priority=60
|
|
InventoryGroup=2
|
|
GroupOffset=1
|
|
PickupClass=Class'NicePack.NiceSinglePickup'
|
|
PlayerViewOffset=(X=20.000000,Y=25.000000,Z=-10.000000)
|
|
BobDamping=6.000000
|
|
AttachmentClass=Class'NicePack.NiceSingleAttachment'
|
|
IconCoords=(X1=434,Y1=253,X2=506,Y2=292)
|
|
ItemName="Just a single pistol"
|
|
}
|