MythOpus/ReloadingWeaponBindAnim
Okay... so this is code I need help with. (the reloading code and reload bind is by whoever made the Reloading Weapons page. Anyways... I've made my gun that shoots and has a need to reload. To reload, I first made an alt fire and made it reload that way... but i wanted a secondary fire mode so I made the reload bind instead. It's in the game and it works. When you reload with the alt-fire however it plays the reload anim but with the ReloadBind, it reloads but without an anim.... can someone help me ?
00001 class ReloadingWeapon extends Weapon 00002 abstract; 00003 00004 var() int ClipCount; //What's that you say? Clip is not a technically correct term? Do I care? 00005 var() float ReloadRate; //Time it takes to insert one bullet. 00006 var float ReloadTimer; 00007 00008 var() sound ReloadBeginSound, ReloadSound, ReloadEndSound; //Sounds played when start to reload, on insertion of each bullet, and when reloading has ended. 00009 var() name ReloadAnim; //Animation to play when reloading is started. 00010 var() float ReloadAnimRate; 00011 00012 var bool bIsReloading, bReloadEffectDone; 00013 00014 replication 00015 { 00016 reliable if(Role == ROLE_Authority) 00017 ClipCount; 00018 00019 //Functions called on the server from the client. 00020 reliable if(Role < ROLE_Authority) 00021 ReloadMeNow, FinishReloading; 00022 00023 //Functions called on the client from the server. 00024 reliable if(Role == ROLE_Authority) 00025 ClientReload, ClientFinishReloading, ClientReloadEffects; 00026 } 00027 00028 //So reloading can be bound to a key. Exec functions in weapons can only be called for the currently held weapon, which is perfect for this purpose. 00029 exec function ReloadMeNow() 00030 { 00031 if(!AllowReload()) 00032 return; 00033 00034 bIsReloading = true; 00035 ReloadTimer = Level.TimeSeconds; 00036 PlaySound(ReloadBeginSound, SLOT_Misc, TransientSoundVolume,,,, false); 00037 ClientReload(); 00038 } 00039 00040 //Called on the client when reloading starts. 00041 simulated function ClientReload() 00042 { 00043 bIsReloading = true; 00044 PlayAnim(ReloadAnim, ReloadAnimRate, 0.1); 00045 } 00046 00047 //For effects during reloading, like smoke or shells ejected from the breech. 00048 simulated function ClientReloadEffects(){} 00049 00050 //Reloading ends when the key is released. 00051 exec function FinishReloading() 00052 { 00053 if(!bIsReloading) 00054 return; 00055 00056 PlaySound(ReloadEndSound, SLOT_Misc, TransientSoundVolume,,,, false); 00057 ClientFinishReloading(); 00058 bIsReloading = false; 00059 bReloadEffectDone = false; 00060 } 00061 00062 //Called on the client when reloading ends. 00063 simulated function ClientFinishReloading() 00064 { 00065 bIsReloading = false; 00066 PlayIdle(); 00067 00068 if(Instigator.PendingWeapon != None && Instigator.PendingWeapon != self) 00069 Instigator.Controller.ClientSwitchToBestWeapon(); 00070 } 00071 00072 function bool AllowReload() 00073 { 00074 //Can't reload whilst firing. 00075 if(FireMode[0].IsFiring() || FireMode[1].IsFiring()) 00076 return false; 00077 //Can't reload if already reloading. 00078 else if(bIsReloading) 00079 return false; 00080 //Can't reload if already full. 00081 else if(ClipCount >= Default.ClipCount) 00082 return false; 00083 //Can't reload if not enough ammo. 00084 else if(Ammo[0] == None || Ammo[0].AmmoAmount <= ClipCount) 00085 return false; 00086 00087 return true; 00088 } 00089 00090 //Don't allow weapon switching whilst reloading. 00091 simulated function bool PutDown() 00092 { 00093 if(bIsReloading) 00094 return false; 00095 00096 return Super.PutDown(); 00097 } 00098 00099 simulated function BringUp(optional Weapon PrevWeapon) 00100 { 00101 Super.BringUp(PrevWeapon); 00102 bIsReloading = false; 00103 } 00104 00105 //Reduce ClipCount every time a bullet is fired. 00106 function ConsumeAmmo(int Mode, float load) 00107 { 00108 if(Ammo[Mode] != None) 00109 { 00110 if(Ammo[Mode].UseAmmo(int(load)) && load > 0) 00111 ClipCount--; 00112 } 00113 } 00114 00115 simulated function bool HasAmmo() 00116 { 00117 //Ignore FireMode[1] which doesn't use any ammo. 00118 return (Ammo[0] != None && FireMode[0] != None && Ammo[0].AmmoAmount >= FireMode[0].AmmoPerFire); 00119 } 00120 00121 event WeaponTick(float dt) 00122 { 00123 if(!bIsReloading) 00124 { 00125 //Stupid bots like to run around with an empty weapon, so force them to reload when appropriate. 00126 if(!Instigator.IsHumanControlled()) 00127 { 00128 if(Level.TimeSeconds - Instigator.Controller.LastSeenTime > ClipCount) 00129 ReloadMeNow(); 00130 } 00131 } 00132 else 00133 { 00134 //Add one bullet at a time as long as reloading key is held down. 00135 if(Level.TimeSeconds - ReloadTimer >= ReloadRate) 00136 { 00137 if(ClipCount >= Default.ClipCount) //Full. 00138 { 00139 ClipCount = Default.ClipCount; 00140 FinishReloading(); 00141 } 00142 else if(Ammo[0].AmmoAmount <= ClipCount) //Out of ammo. 00143 { 00144 ClipCount = Ammo[0].AmmoAmount; 00145 FinishReloading(); 00146 } 00147 else //Add another bullet. 00148 { 00149 PlaySound(ReloadSound, SLOT_Misc, TransientSoundVolume,,,, false); 00150 InsertBullet(); 00151 00152 if(ClipCount >= Default.ClipCount) 00153 { 00154 ReloadTimer = Level.TimeSeconds - (ReloadRate / 2); 00155 } 00156 else 00157 ReloadTimer = Level.TimeSeconds; 00158 } 00159 } 00160 else if(!bReloadEffectDone && Level.TimeSeconds - ReloadTimer >= ReloadRate / 2) 00161 { 00162 bReloadEffectDone = true; 00163 ClientReloadEffects(); 00164 } 00165 } 00166 } 00167 00168 //Can play animations for inserting individual bullets here, or other effects. Server-side only, so should call a replicated function here and play animations in it, rather than in this function itself. 00169 function InsertBullet() 00170 { 00171 ClipCount = Default.ClipCount; 00172 } 00173 00174 //Show how many bullets left until reload. 00175 simulated function float ChargeBar() 00176 { 00177 local float CurrentClip, MaxClip; 00178 00179 //Store the int values as floats to avoid rounding errors. 00180 CurrentClip = ClipCount; 00181 MaxClip = Default.ClipCount; 00182 00183 return FMin(1, CurrentClip/MaxClip); 00184 } 00185 00186 function byte BestMode() 00187 { 00188 if(ClipCount > 0) 00189 return 0; 00190 00191 return 1; 00192 } 00193 00194 defaultproperties 00195 { 00196 ClipCount=30 00197 ReloadRate=1.0 00198 ReloadAnim=Reload 00199 ReloadAnimRate=1.0 00200 00201 bShowChargingBar=True 00202 }
And thne this is the Bind code...
class ReloadBinding extends GUIUserKeyBinding; defaultproperties { KeyData(0)=(KeyLabel="Reloading Weapon",bIsSection=True) KeyData(1)=(Alias="ReloadMeNow | OnRelease FinishReloading",KeyLabel="Reload") }
Foxpaw: It looks like it should work, though the netcode looks a bit flaky. That exec function is going to run on the client, get replicated to the server, then run the clientreload stuff. A few milliseconds later the server will have sent back the results from IT's replicated "reloadmenow" and you will have the client animations attempt to play twice. I wouldn't think that that would cause a problem though in botplay.
MythOpus: Well i have noticed that the relaod anim plays far too often. After you run out of ammo, it plays it, when you click on the reloading secondfire button and when you release it. It also does it when you stop firing.
MythOpus: I still haven't figured tihs out and its bugging me so much lol...
Mr Evil: Hmmm, I'm not sure what's going wrong. That code works perfectly well where I'm using it. If you wait a while you will be able to see the code in use in the LawDogs mod - maybe a 'real' example will help you solve the problem. FoxPaw: The exec function is only run on the server, then ClientReload is run only on the client. Check it with some logs if you want to see for yourself.
MythOpus: Hmmm, yes, I shall be waiting....
Foxpaw: Yowza, I thought exec functions were automatically simulated as well.