//--------------------------------------------------------- bool CWeapon::OnActionReload(EntityId actorId, const ActionId& actionId, int activationMode, float value) { bool playerCanStartReload = false; if (activationMode == eAAM_OnPress && (CheckPickupInteraction(this) == false)) playerCanStartReload = true; // this condition results from the interaction between reload and item pickups. If on front on an item and press reload/pick button but not for long enought, // then the player should still reload the weapon instead of picking up the item. else if(activationMode == eAAM_OnRelease && CheckPickupInteraction(this) == true) playerCanStartReload = true; float currentTime = gEnv->pTimer->GetCurrTime(); if (!playerCanStartReload && activationMode == eAAM_OnPress) m_reloadButtonTimeStamp = currentTime; else if (activationMode == eAAM_OnRelease && playerCanStartReload && currentTime > m_reloadButtonTimeStamp+g_pGameCVars->pl_useItemHoldTime) playerCanStartReload = false; if (!playerCanStartReload) return true; if (!IsBusy() && !AreAnyItemFlagsSet(eIF_Modifying)) { ReloadWeapon(); } else if (!IsReloading() && activationMode == eAAM_OnPress) { SetInputFlag(eWeaponAction_Reload); } return true; }
//------------------------------------------------------ void CWeapon::ForcePendingActions(uint8 blockedActions) { CItem::ForcePendingActions(blockedActions); CActor* pOwner = GetOwnerActor(); if(!pOwner || !pOwner->IsClient() || s_lockActionRequests) return; //--- Lock action requests to ensure that we don't recurse back into this function but also //--- block any recursive action requests to ensure we don't repeat the actions next frame s_lockActionRequests = true; //Force start firing, if needed and possible if(IsInputFlagSet(eWeaponAction_Fire) && !(blockedActions&eWeaponAction_Fire)) { ClearInputFlag(eWeaponAction_Fire); if(IsTargetOn() || (m_fm && !m_fm->AllowZoom())) { s_lockActionRequests = false; return; } OnAction(GetOwnerId(),CCryName("attack1"),eAAM_OnHold,0.0f); } //Force zoom in if needed if(IsInputFlagSet(eWeaponAction_Zoom) && !(blockedActions&eWeaponAction_Zoom)) { if(!IsZoomed() && !IsZoomingInOrOut()) OnActionZoom(GetOwnerId(), CCryName("zoom"), eAAM_OnPress, 0.0f); ClearInputFlag(eWeaponAction_Zoom); } if(IsInputFlagSet(eWeaponAction_Reload) && !(blockedActions&eWeaponAction_Reload)) { if (!IsBusy()) ReloadWeapon(); ClearInputFlag(eWeaponAction_Reload); } s_lockActionRequests = false; }
/* ================ ClientEvents Events will be passed on to the clients for presentation, but any server game effects are handled here ================ */ void ClientEvents(gentity_t * ent, int oldEventSequence) { int i, j; int event; gclient_t *client; int damage; // vec3_t dir; vec3_t origin, angles; gitem_t *item; gentity_t *drop; client = ent->client; if (oldEventSequence < client->ps.eventSequence - MAX_PS_EVENTS) { oldEventSequence = client->ps.eventSequence - MAX_PS_EVENTS; } for (i = oldEventSequence; i < client->ps.eventSequence; i++) { event = client->ps.events[i & (MAX_PS_EVENTS - 1)]; switch (event) { case EV_FALL_MEDIUM: case EV_FALL_FAR: if (ent->s.eType != ET_PLAYER) { break; // not in the player model } if (g_dmflags.integer & DF_NO_FALLING) { break; } // JBravo: fix falling pain during lca if (g_gametype.integer >= GT_TEAM && level.lights_camera_action) { break; } damage = ent->client->ps.stats[STAT_FALLDAMAGE]; // VectorSet(dir, 0, 0, 1); ent->pain_debounce_time = level.time + 200; // no normal pain sound //Elder: added so we can trigger AQ2 pain blends ent->client->ps.damageEvent++; ent->client->ps.damageCount += damage; if (ent->client->lasthurt_mod != 0) { //Blaze: Print out some debug info if (&g_entities[ent->client->lasthurt_client] == NULL) G_Printf("Ln 0748\n"); G_Damage(ent, &g_entities[ent->client->lasthurt_client], &g_entities[ent->client->lasthurt_client], NULL, NULL, damage, 0, MOD_FALLING); } else { G_Damage(ent, NULL, NULL, NULL, NULL, damage, 0, MOD_FALLING); } break; case EV_FALL_FAR_NOSOUND: if (ent->s.eType != ET_PLAYER) { break; // not in the player model } if (g_dmflags.integer & DF_NO_FALLING) { break; } // JBravo: fix falling pain during lca again if (g_gametype.integer >= GT_TEAM && level.lights_camera_action) { break; } damage = ent->client->ps.stats[STAT_FALLDAMAGE]; // VectorSet(dir, 0, 0, 1); ent->pain_debounce_time = level.time + 200; // no normal pain sound //Elder: added so we can trigger AQ2 pain blends ent->client->ps.damageEvent++; ent->client->ps.damageCount += damage; if (ent->client->lasthurt_mod != 0) { //Blaze: Print out some debug info if (&g_entities[ent->client->lasthurt_client] == NULL) G_Printf("Ln 0779\n"); G_Damage(ent, &g_entities[ent->client->lasthurt_client], &g_entities[ent->client->lasthurt_client], NULL, NULL, damage, 0, MOD_FALLING); } else { G_Damage(ent, NULL, NULL, NULL, NULL, damage, 0, MOD_FALLING); } break; case EV_FIRE_WEAPON: FireWeapon(ent); break; case EV_RELOAD_WEAPON1: ReloadWeapon(ent, 1); break; case EV_RELOAD_WEAPON2: ReloadWeapon(ent, 2); break; case EV_CHANGE_WEAPON: //Elder: not a good place to put stuff break; case EV_USE_ITEM1: // teleporter // drop flags in CTF item = NULL; j = 0; if (ent->client->ps.powerups[PW_REDFLAG]) { item = BG_FindItemForPowerup(PW_REDFLAG); j = PW_REDFLAG; } else if (ent->client->ps.powerups[PW_BLUEFLAG]) { item = BG_FindItemForPowerup(PW_BLUEFLAG); j = PW_BLUEFLAG; } else if (ent->client->ps.powerups[PW_NEUTRALFLAG]) { item = BG_FindItemForPowerup(PW_NEUTRALFLAG); j = PW_NEUTRALFLAG; } if (item) { drop = Drop_Item(ent, item, 0); // decide how many seconds it has left drop->count = (ent->client->ps.powerups[j] - level.time) / 1000; if (drop->count < 1) { drop->count = 1; } ent->client->ps.powerups[j] = 0; } SelectSpawnPoint(ent->client->ps.origin, origin, angles); TeleportPlayer(ent, origin, angles); break; case EV_USE_ITEM2: // medkit ent->health = 125; //ent->client->ps.stats[STAT_MAX_HEALTH] + 25; break; default: break; } } }
void Unit::Update(float DeltaTime, Terrain* TerrainInstance) { if ( IsAlive() && gHealth.first <= 0 ) { SetWeaponState( Hold ); DropWeapon(); Kill(); StopAllAnimations(); PlayAnimation("Death"); PlayAnimationAfter("Death", "Dead"); SoundManager::GetInstance()->Play( gDeathSound, SFX, false ); if (!PlayingAnimation("Death")) { SetState( Dead ); return; } } GameObject::Update(DeltaTime, TerrainInstance); if ( GetState() == Dying ) return; XMVECTOR vel = XMLoadFloat3(&GetFloat3Value( Velocity )); if (!XMVector3Equal(vel, XMVectorZero())) { XMVECTOR dir = XMLoadFloat3(&GetFloat3Value( Direction )); XMVECTOR angleV = XMVector3AngleBetweenVectors(dir, vel); float angle; XMStoreFloat(&angle, angleV); XMVECTOR crossV = XMVector3Cross(dir, vel); if (XMVectorGetY(crossV) < 0) angle *= -1; //cout << 180 * angle / PI << endl; if (fabs(angle) <= PI * 0.25f) gMoveDirection = Forward; else if (fabs(angle) > PI * 0.75f) gMoveDirection = Back; else if (angle < 0) gMoveDirection = Left; else if (angle > 0) gMoveDirection = Right; XMVECTOR L = XMVector3Length(vel); float speed; XMStoreFloat(&speed, L); speed /= UnitsPerMeter; switch (gMoveDirection) { case Forward: if (speed > 1.05f * gWalkSpeed) { SetMoveState(Run); SetAnimationSpeed("Run", speed); SetAnimationSpeed(GetAnimation("UpperRun"), speed); } else { SetMoveState(Walk); SetAnimationSpeed("Walk", speed); } break; case Back: SetMoveState(Walk); SetAnimationSpeed("Back", speed); break; case Right: SetMoveState(Walk); SetAnimationSpeed("SideStepRight", speed); break; case Left: SetMoveState(Walk); SetAnimationSpeed("SideStepLeft", speed); break; } } else { gMoveDirection = None; if (!Crouching()) SetMoveState(Stand); } if ( gCurrentWeapon ) { XMFLOAT3 handPos; XMFLOAT4 handRot; XMVECTOR pos = XMLoadFloat3(&GetFloat3Value( Position )); XMVECTOR dir = XMLoadFloat3(&GetFloat3Value( Direction )); XMVECTOR lv = XMVector3Length(dir); bool gotJointPos = false; bool gotJointRot = false; if (m_ModelInstance) { gotJointPos = GetJointPosition("RightHand", handPos); gotJointRot = GetJointRotation("RightHand", handRot); } if (!gotJointPos) { pos += dir * (GetRadius() - 10); XMStoreFloat3(&handPos, pos); } if (gCurrentWeapon->NeedReload()) { ReloadWeapon(); } //gWeapon->Update(DeltaTime); //gWeapon->MoveTo( position ); gCurrentWeapon->MoveTo( handPos ); XMFLOAT3 weaponPos; if (gCurrentWeapon->GetJointPosition("RightHand", weaponPos)) { XMStoreFloat3(&handPos, XMLoadFloat3(&handPos) + (XMLoadFloat3(&handPos) - XMLoadFloat3(&weaponPos))); gCurrentWeapon->MoveTo( handPos ); } if (gotJointRot) { gCurrentWeapon->SetRotation( handRot ); } else gCurrentWeapon->SetRotation( GetQuaternation() ); } /* else { LoopAnimation("PistolUpperWalk"); } */ }