better network send checks minor
This commit is contained in:
parent
d3a620bb55
commit
58d33d9569
4 changed files with 209 additions and 84 deletions
|
@ -936,6 +936,7 @@ CSEv_PlayerBuyWeapon_TS_end_( void ) {
|
|||
player pl = (player)self;
|
||||
|
||||
printfline("CSEv_PlayerBuyWeapon_TS_end_");
|
||||
pl.completeInventorySend = TRUE;
|
||||
playerEquipIdeal(pl);
|
||||
}
|
||||
|
||||
|
|
|
@ -438,6 +438,7 @@ void removeWeaponFromInventory(player pl, int arg_removeIndex){
|
|||
//reduced.
|
||||
PLAYER_INVENTORY_GENERIC_MAX--;
|
||||
|
||||
pl.completeInventorySend = TRUE;
|
||||
}//removeWeaponFromInventory
|
||||
|
||||
|
||||
|
@ -1453,7 +1454,7 @@ BOOL attemptBuyWeapon(player pl, int arg_weaponID, int arg_iBitsUpgrade, int iCo
|
|||
// printfline("WEAPON %i - %i", i, PLAYER_INVENTORY_GENERIC[i].weaponID);
|
||||
//}
|
||||
|
||||
|
||||
pl.completeInventorySend = TRUE;
|
||||
return TRUE;
|
||||
}//END OF attemptBuyWeapon
|
||||
#endif
|
||||
|
@ -1835,6 +1836,7 @@ Full Load: X times the buy price, where "X" is max capacity (throwing knives or
|
|||
}
|
||||
*/
|
||||
|
||||
pl.completeInventorySend = TRUE;
|
||||
return matchStart; // we need to tell the caller what spot we put the weapon in, in the player's inventory.
|
||||
}//END OF addWeaponToInventory
|
||||
#endif
|
||||
|
|
|
@ -50,6 +50,9 @@ class player:base_player
|
|||
// On death, set this to 2.5. If it is less than 1.5,
|
||||
float deathCameraChangeTime;
|
||||
|
||||
BOOL completeInventorySend;
|
||||
|
||||
|
||||
|
||||
//TAGGG - I'm not messing around with that memory issue from last time.
|
||||
// But try again with this removed whenever it turns out ok, see if this is needed
|
||||
|
@ -98,7 +101,6 @@ class player:base_player
|
|||
float maxspeed_raw;
|
||||
|
||||
|
||||
|
||||
#ifdef CLIENT
|
||||
//TAGGG - related to how to handle FOV changes.
|
||||
float flCurrentZoom;
|
||||
|
@ -541,11 +543,15 @@ class player:base_player
|
|||
virtual float() predraw;
|
||||
virtual void(void) postdraw;
|
||||
virtual void(float,float) ReceiveEntity;
|
||||
// NEW
|
||||
virtual void(int i) ReceiveEntity_ary_myWeapons;
|
||||
virtual void(void) PredictPreFrame;
|
||||
virtual void(void) PredictPostFrame;
|
||||
#else
|
||||
virtual void(void) EvaluateEntity;
|
||||
virtual float(entity, float) SendEntity;
|
||||
// NEW
|
||||
virtual void(int i) SendEntity_ary_myWeapons;
|
||||
#endif
|
||||
|
||||
};
|
||||
|
|
|
@ -208,47 +208,39 @@ player::ReceiveEntity(float new, float fl)
|
|||
|
||||
currentZoomChoice = readbyte() - 1;
|
||||
|
||||
// TODO: IDEA. Only send updates for the currently equipped weapon, maybe the previously equipped one
|
||||
// a few frames too? Unsure.
|
||||
ary_myWeapons_softMax = readbyte();
|
||||
for(i = 0; i < ary_myWeapons_softMax; i++){
|
||||
ary_myWeapons[i].weaponID = readbyte();
|
||||
ary_myWeapons[i].weaponTypeID = readbyte();
|
||||
ary_myWeapons[i].iBitsUpgrade = readbyte();
|
||||
ary_myWeapons[i].iCount = readbyte();
|
||||
//ary_myWeapons[i].iPrice = readbyte();
|
||||
//ary_myWeapons[i].iSlots = readbyte();
|
||||
ary_myWeapons[i].iClipLeft = readbyte();
|
||||
ary_myWeapons[i].iClipAkimboLeft = readbyte();
|
||||
ary_myWeapons[i].iBitsUpgrade_on = readbyte();
|
||||
|
||||
int newFir = readbyte();
|
||||
|
||||
#if defined(FIREMODE_PREDICTION_TEST)
|
||||
if(i == this.inventoryEquippedIndex && ary_myWeapons[i].iFireMode != newFir){
|
||||
printfline("!!! player::ReceiveEntity, iFireMode update, changed firemode, WAS: %i NOW: %i", ary_myWeapons[i].iFireMode, newFir);
|
||||
}
|
||||
if(time >= this.ignoreFiremodeReceiveTime){
|
||||
printfline("X Change blocked, too soon");
|
||||
ary_myWeapons[i].iFireMode = newFir;
|
||||
}
|
||||
#else
|
||||
ary_myWeapons[i].iFireMode = newFir;
|
||||
#endif
|
||||
|
||||
ary_myWeapons[i].iFireModeAkimbo = readbyte();
|
||||
ary_myWeapons[i].iIronSight = readbyte();
|
||||
ary_myWeapons[i].forceBodygroup1Submodel = readbyte();
|
||||
}
|
||||
|
||||
//UNNECESSARY. This array is of fixed length, so known at all times.
|
||||
//WriteByte(MSG_ENTITY, ary_ammoTotal_softMax);
|
||||
for(i = 0; i < AMMO_ID::LAST_ID; i++){
|
||||
// See serverside equivalent, too much info was lost from some pools being over 255
|
||||
// (well I guess that's all there is to it)
|
||||
ary_ammoTotal[i] = readlong();
|
||||
}
|
||||
|
||||
ary_myWeapons_softMax = readbyte();
|
||||
|
||||
|
||||
this.completeInventorySend = readbyte();
|
||||
|
||||
if(this.completeInventorySend){
|
||||
for(i = 0; i < ary_myWeapons_softMax; i++){
|
||||
ReceiveEntity_ary_myWeapons(i);
|
||||
}
|
||||
for(i = 0; i < AMMO_ID::LAST_ID; i++){
|
||||
ary_ammoTotal[i] = readlong();
|
||||
}
|
||||
}else if(fl & PLAYER_UNUSED1){
|
||||
|
||||
i = inventoryEquippedIndex;
|
||||
/// could this ever be -1?
|
||||
if(i != -1){
|
||||
ReceiveEntity_ary_myWeapons(i);
|
||||
|
||||
int myAmmoType = getAmmoTypeOfWeapon(this.activeweapon);
|
||||
if(myAmmoType != -1){
|
||||
i = myAmmoType;
|
||||
//UNNECESSARY. This array is of fixed length, so known at all times.
|
||||
//WriteByte(MSG_ENTITY, ary_ammoTotal_softMax);
|
||||
//for(i = 0; i < AMMO_ID::LAST_ID; i++){
|
||||
// See serverside equivalent, too much info was lost from some pools being over 255
|
||||
// (well I guess that's all there is to it)
|
||||
ary_ammoTotal[i] = readlong();
|
||||
//}
|
||||
}
|
||||
}
|
||||
}
|
||||
/////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
@ -261,6 +253,44 @@ player::ReceiveEntity(float new, float fl)
|
|||
setorigin(this, origin);
|
||||
}
|
||||
|
||||
void player::ReceiveEntity_ary_myWeapons(int i){
|
||||
|
||||
// TODO: IDEA. Only send updates for the currently equipped weapon, maybe the previously equipped one
|
||||
// a few frames too? Unsure.
|
||||
ary_myWeapons[i].weaponID = readbyte();
|
||||
ary_myWeapons[i].weaponTypeID = readbyte();
|
||||
ary_myWeapons[i].iBitsUpgrade = readbyte();
|
||||
ary_myWeapons[i].iCount = readbyte();
|
||||
//ary_myWeapons[i].iPrice = readbyte();
|
||||
//ary_myWeapons[i].iSlots = readbyte();
|
||||
ary_myWeapons[i].iClipLeft = readbyte();
|
||||
ary_myWeapons[i].iClipAkimboLeft = readbyte();
|
||||
ary_myWeapons[i].iBitsUpgrade_on = readbyte();
|
||||
|
||||
int newFir = readbyte();
|
||||
|
||||
#if defined(FIREMODE_PREDICTION_TEST)
|
||||
if(i == this.inventoryEquippedIndex && ary_myWeapons[i].iFireMode != newFir){
|
||||
printfline("!!! player::ReceiveEntity, iFireMode update, changed firemode, WAS: %i NOW: %i", ary_myWeapons[i].iFireMode, newFir);
|
||||
}
|
||||
if(time >= this.ignoreFiremodeReceiveTime){
|
||||
printfline("X Change blocked, too soon");
|
||||
ary_myWeapons[i].iFireMode = newFir;
|
||||
}
|
||||
#else
|
||||
ary_myWeapons[i].iFireMode = newFir;
|
||||
#endif
|
||||
|
||||
ary_myWeapons[i].iFireModeAkimbo = readbyte();
|
||||
ary_myWeapons[i].iIronSight = readbyte();
|
||||
ary_myWeapons[i].forceBodygroup1Submodel = readbyte();
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
=================
|
||||
player::PredictPreFrame
|
||||
|
@ -467,6 +497,8 @@ player::EvaluateEntity(void)
|
|||
{
|
||||
/* the generic client attributes */
|
||||
base_player::EvaluateEntity();
|
||||
|
||||
int i;
|
||||
|
||||
/* animation */
|
||||
if (ATTR_CHANGED(anim_bottom) || ATTR_CHANGED(anim_bottom_time))
|
||||
|
@ -550,6 +582,48 @@ player::EvaluateEntity(void)
|
|||
SAVE_STATE(mode_tempstate);
|
||||
*/
|
||||
|
||||
|
||||
// IDEA: do a full-send, all weapons stats on executing a buyconfig order?
|
||||
// set some flag to convey that?
|
||||
|
||||
|
||||
SAVE_STATE(ary_myWeapons_softMax);
|
||||
|
||||
|
||||
i = inventoryEquippedIndex;
|
||||
if(i != -1){
|
||||
//for(i = 0; i < ary_myWeapons_softMax; i++){
|
||||
if(ATTR_CHANGED(ary_myWeapons[i].weaponID)) SendFlags |= PLAYER_UNUSED1;
|
||||
if(ATTR_CHANGED(ary_myWeapons[i].weaponTypeID)) SendFlags |= PLAYER_UNUSED1;
|
||||
if(ATTR_CHANGED(ary_myWeapons[i].iBitsUpgrade))SendFlags |= PLAYER_UNUSED1;
|
||||
if(ATTR_CHANGED(ary_myWeapons[i].iCount)) SendFlags |= PLAYER_UNUSED1;
|
||||
//SAVE_STATE(ary_myWeapons[i].iPrice));
|
||||
//SAVE_STATE(ary_myWeapons[i].iSlots));
|
||||
if(ATTR_CHANGED(ary_myWeapons[i].iClipLeft)) SendFlags |= PLAYER_UNUSED1;
|
||||
if(ATTR_CHANGED(ary_myWeapons[i].iClipAkimboLeft)) SendFlags |= PLAYER_UNUSED1;
|
||||
if(ATTR_CHANGED(ary_myWeapons[i].iBitsUpgrade_on)) SendFlags |= PLAYER_UNUSED1;
|
||||
if(ATTR_CHANGED(ary_myWeapons[i].iFireMode)) SendFlags |= PLAYER_UNUSED1;
|
||||
if(ATTR_CHANGED(ary_myWeapons[i].iFireModeAkimbo)) SendFlags |= PLAYER_UNUSED1;
|
||||
if(ATTR_CHANGED(ary_myWeapons[i].iIronSight)) SendFlags |= PLAYER_UNUSED1;
|
||||
if(ATTR_CHANGED(ary_myWeapons[i].forceBodygroup1Submodel)) SendFlags |= PLAYER_UNUSED1;
|
||||
//}
|
||||
int myAmmoType = getAmmoTypeOfWeapon(this.activeweapon);
|
||||
if(myAmmoType != -1){
|
||||
i = myAmmoType;
|
||||
//UNNECESSARY. This array is of fixed length, so known at all times.
|
||||
//WriteByte(MSG_ENTITY, ary_ammoTotal_softMax);
|
||||
//for(i = 0; i < AMMO_ID::LAST_ID; i++){
|
||||
// See serverside equivalent, too much info was lost from some pools being over 255
|
||||
// (well I guess that's all there is to it)
|
||||
if(ATTR_CHANGED_ARY(ary_ammoTotal, i)) SendFlags |= PLAYER_UNUSED1;
|
||||
//}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
SAVE_STATE(anim_top);
|
||||
SAVE_STATE(anim_top_delay);
|
||||
SAVE_STATE(anim_top_time);
|
||||
|
@ -581,28 +655,38 @@ player::EvaluateEntity(void)
|
|||
|
||||
|
||||
SAVE_STATE(ary_myWeapons_softMax);
|
||||
for(int i = 0; i < ary_myWeapons_softMax; i++){
|
||||
SAVE_STATE(ary_myWeapons[i].weaponID);
|
||||
SAVE_STATE(ary_myWeapons[i].weaponTypeID);
|
||||
SAVE_STATE(ary_myWeapons[i].iBitsUpgrade);
|
||||
SAVE_STATE(ary_myWeapons[i].iCount);
|
||||
//SAVE_STATE(ary_myWeapons[i].iPrice);
|
||||
//SAVE_STATE(ary_myWeapons[i].iSlots);
|
||||
SAVE_STATE(ary_myWeapons[i].iClipLeft);
|
||||
SAVE_STATE(ary_myWeapons[i].iClipAkimboLeft);
|
||||
SAVE_STATE(ary_myWeapons[i].iBitsUpgrade_on);
|
||||
SAVE_STATE(ary_myWeapons[i].iFireMode);
|
||||
SAVE_STATE(ary_myWeapons[i].iFireModeAkimbo);
|
||||
SAVE_STATE(ary_myWeapons[i].iIronSight);
|
||||
SAVE_STATE(ary_myWeapons[i].forceBodygroup1Submodel);
|
||||
}
|
||||
|
||||
|
||||
i = inventoryEquippedIndex;
|
||||
if(i != -1){
|
||||
//for(i = 0; i < ary_myWeapons_softMax; i++){
|
||||
SAVE_STATE(ary_myWeapons[i].weaponID);
|
||||
SAVE_STATE(ary_myWeapons[i].weaponTypeID);
|
||||
SAVE_STATE(ary_myWeapons[i].iBitsUpgrade);
|
||||
SAVE_STATE(ary_myWeapons[i].iCount);
|
||||
//SAVE_STATE(ary_myWeapons[i].iPrice);
|
||||
//SAVE_STATE(ary_myWeapons[i].iSlots);
|
||||
SAVE_STATE(ary_myWeapons[i].iClipLeft);
|
||||
SAVE_STATE(ary_myWeapons[i].iClipAkimboLeft);
|
||||
SAVE_STATE(ary_myWeapons[i].iBitsUpgrade_on);
|
||||
SAVE_STATE(ary_myWeapons[i].iFireMode);
|
||||
SAVE_STATE(ary_myWeapons[i].iFireModeAkimbo);
|
||||
SAVE_STATE(ary_myWeapons[i].iIronSight);
|
||||
SAVE_STATE(ary_myWeapons[i].forceBodygroup1Submodel);
|
||||
//}
|
||||
|
||||
//UNNECESSARY. This array is of fixed length, so known at all times.
|
||||
//WriteByte(MSG_ENTITY, ary_ammoTotal_softMax);
|
||||
for(int i = 0; i < AMMO_ID::LAST_ID; i++){
|
||||
// See serverside equivalent, too much info was lost from some pools being over 255
|
||||
// (well I guess that's all there is to it)
|
||||
SAVE_STATE_ARY(ary_ammoTotal, i);
|
||||
|
||||
int myAmmoType = getAmmoTypeOfWeapon(this.activeweapon);
|
||||
if(myAmmoType != -1){
|
||||
i = myAmmoType;
|
||||
//UNNECESSARY. This array is of fixed length, so known at all times.
|
||||
//WriteByte(MSG_ENTITY, ary_ammoTotal_softMax);
|
||||
//for(i = 0; i < AMMO_ID::LAST_ID; i++){
|
||||
// See serverside equivalent, too much info was lost from some pools being over 255
|
||||
// (well I guess that's all there is to it)
|
||||
SAVE_STATE_ARY(ary_ammoTotal, i);
|
||||
//}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -748,38 +832,69 @@ player::SendEntity(entity ePEnt, float fChanged)
|
|||
|
||||
//weapondynamic_t ary_myWeapons[ary_myWeapons_length];
|
||||
WriteByte(MSG_ENTITY, ary_myWeapons_softMax );
|
||||
for(i = 0; i < ary_myWeapons_softMax; i++){
|
||||
WriteByte(MSG_ENTITY, ary_myWeapons[i].weaponID );
|
||||
WriteByte(MSG_ENTITY, ary_myWeapons[i].weaponTypeID );
|
||||
WriteByte(MSG_ENTITY, ary_myWeapons[i].iBitsUpgrade );
|
||||
WriteByte(MSG_ENTITY, ary_myWeapons[i].iCount );
|
||||
//WriteByte(MSG_ENTITY, ary_myWeapons[i].iPrice );
|
||||
//WriteByte(MSG_ENTITY, ary_myWeapons[i].iSlots );
|
||||
WriteByte(MSG_ENTITY, ary_myWeapons[i].iClipLeft );
|
||||
WriteByte(MSG_ENTITY, ary_myWeapons[i].iClipAkimboLeft );
|
||||
WriteByte(MSG_ENTITY, ary_myWeapons[i].iBitsUpgrade_on );
|
||||
WriteByte(MSG_ENTITY, ary_myWeapons[i].iFireMode );
|
||||
WriteByte(MSG_ENTITY, ary_myWeapons[i].iFireModeAkimbo );
|
||||
WriteByte(MSG_ENTITY, ary_myWeapons[i].iIronSight );
|
||||
WriteByte(MSG_ENTITY, ary_myWeapons[i].forceBodygroup1Submodel);
|
||||
|
||||
|
||||
|
||||
WriteByte(MSG_ENTITY, this.completeInventorySend );
|
||||
|
||||
if(this.completeInventorySend){
|
||||
for(i = 0; i < ary_myWeapons_softMax; i++){
|
||||
SendEntity_ary_myWeapons(i);
|
||||
}
|
||||
for(i = 0; i < AMMO_ID::LAST_ID; i++){
|
||||
WriteLong(MSG_ENTITY, ary_ammoTotal[i] );
|
||||
}
|
||||
}else if(fChanged & PLAYER_UNUSED1){
|
||||
|
||||
i = inventoryEquippedIndex;
|
||||
/// could this ever be -1?
|
||||
if(i != -1){
|
||||
SendEntity_ary_myWeapons(i);
|
||||
|
||||
int myAmmoType = getAmmoTypeOfWeapon(this.activeweapon);
|
||||
if(myAmmoType != -1){
|
||||
i = myAmmoType;
|
||||
//UNNECESSARY. This array is of fixed length, so known at all times.
|
||||
//WriteByte(MSG_ENTITY, ary_ammoTotal_softMax);
|
||||
//for(i = 0; i < AMMO_ID::LAST_ID; i++){
|
||||
// using 'WriteLong' instead of 'WriteByte', because SOME AMMO POOL just had to
|
||||
// exceed 255, didn't it.
|
||||
WriteLong(MSG_ENTITY, ary_ammoTotal[i] );
|
||||
//}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//UNNECESSARY. This array is of fixed length, so known at all times.
|
||||
//WriteByte(MSG_ENTITY, ary_ammoTotal_softMax);
|
||||
for(i = 0; i < AMMO_ID::LAST_ID; i++){
|
||||
// using 'WriteLong' instead of 'WriteByte', because SOME AMMO POOL just had to
|
||||
// exceed 255, didn't it.
|
||||
WriteLong(MSG_ENTITY, ary_ammoTotal[i] );
|
||||
}
|
||||
// no need to send again until this flag is set freshly.
|
||||
this.completeInventorySend = FALSE;
|
||||
|
||||
|
||||
|
||||
return (1);
|
||||
}
|
||||
|
||||
void player::SendEntity_ary_myWeapons(int i){
|
||||
WriteByte(MSG_ENTITY, ary_myWeapons[i].weaponID );
|
||||
WriteByte(MSG_ENTITY, ary_myWeapons[i].weaponTypeID );
|
||||
WriteByte(MSG_ENTITY, ary_myWeapons[i].iBitsUpgrade );
|
||||
WriteByte(MSG_ENTITY, ary_myWeapons[i].iCount );
|
||||
//WriteByte(MSG_ENTITY, ary_myWeapons[i].iPrice );
|
||||
//WriteByte(MSG_ENTITY, ary_myWeapons[i].iSlots );
|
||||
WriteByte(MSG_ENTITY, ary_myWeapons[i].iClipLeft );
|
||||
WriteByte(MSG_ENTITY, ary_myWeapons[i].iClipAkimboLeft );
|
||||
WriteByte(MSG_ENTITY, ary_myWeapons[i].iBitsUpgrade_on );
|
||||
WriteByte(MSG_ENTITY, ary_myWeapons[i].iFireMode );
|
||||
WriteByte(MSG_ENTITY, ary_myWeapons[i].iFireModeAkimbo );
|
||||
WriteByte(MSG_ENTITY, ary_myWeapons[i].iIronSight );
|
||||
WriteByte(MSG_ENTITY, ary_myWeapons[i].forceBodygroup1Submodel);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void
|
||||
player::player(void){
|
||||
printfline("CONSTRUCTOR: player, called");
|
||||
|
@ -789,6 +904,7 @@ player::player(void){
|
|||
|
||||
// reasonable default?
|
||||
iState = PLAYER_STATE::NOCLIP;
|
||||
completeInventorySend = FALSE;
|
||||
|
||||
#ifdef FIREMODE_PREDICTION_TEST
|
||||
ignoreFiremodeReceiveTime = -1;
|
||||
|
|
Loading…
Reference in a new issue