int LuaSyncedMoveCtrl::SetHeading(lua_State* L) { CScriptMoveType* moveType = ParseMoveType(L, __FUNCTION__, 1); if (moveType == NULL) { return 0; } const short heading = (short)luaL_checknumber(L, 2); ASSERT_SYNCED((short)heading); moveType->SetHeading(heading); return 0; }
int LuaSyncedMoveCtrl::SetPhysics(lua_State* L) { CScriptMoveType* moveType = ParseMoveType(L, __FUNCTION__, 1); if (moveType == NULL) { return 0; } const float3 pos(luaL_checkfloat(L, 2), luaL_checkfloat(L, 3), luaL_checkfloat(L, 4)); const float3 vel(luaL_checkfloat(L, 5), luaL_checkfloat(L, 6), luaL_checkfloat(L, 7)); const float3 rot(luaL_checkfloat(L, 8), luaL_checkfloat(L, 9), luaL_checkfloat(L, 10)); ASSERT_SYNCED(pos); ASSERT_SYNCED(vel); ASSERT_SYNCED(rot); moveType->SetPhysics(pos, vel, rot); return 0; }
CWeaponProjectile::CWeaponProjectile(const float3& pos, const float3& speed, CUnit* owner, CUnit* target, const float3 &targetPos, const WeaponDef* weaponDef, CWeaponProjectile* interceptTarget, int ttl): CProjectile(pos, speed, owner, true, true, false), targeted(false), weaponDef(weaponDef), weaponDefName(weaponDef? weaponDef->name: std::string("")), target(target), targetPos(targetPos), cegTag(weaponDef? weaponDef->cegTag: std::string("")), cegID(-1U), colorTeam(0), startpos(pos), ttl(ttl), bounces(0), keepBouncing(true), interceptTarget(interceptTarget) { projectileType = WEAPON_BASE_PROJECTILE; if (owner) { colorTeam = owner->team; } if (target) { AddDeathDependence(target, DEPENDENCE_WEAPONTARGET); } if (interceptTarget) { interceptTarget->targeted = true; AddDeathDependence(interceptTarget, DEPENDENCE_INTERCEPTTARGET); } assert(weaponDef != NULL); alwaysVisible = weaponDef->visuals.alwaysVisible; ignoreWater = weaponDef->waterweapon; model = weaponDef->LoadModel(); collisionFlags = weaponDef->collisionFlags; ph->AddProjectile(this); ASSERT_SYNCED(id); if (weaponDef->interceptedByShieldType) { // this needs a valid projectile id set assert(id >= 0); interceptHandler.AddShieldInterceptableProjectile(this); } }
int LuaSyncedMoveCtrl::SetRotationVelocity(lua_State* L) { CScriptMoveType* moveType = ParseMoveType(L, __FUNCTION__, 1); if (moveType == NULL) { return 0; } const float3 rotVel(luaL_checkfloat(L, 2), luaL_checkfloat(L, 3), luaL_checkfloat(L, 4)); ASSERT_SYNCED(rotVel); moveType->SetRotationVelocity(rotVel); return 0; }
int LuaSyncedMoveCtrl::SetPosition(lua_State* L) { CScriptMoveType* moveType = ParseMoveType(L, __FUNCTION__, 1); if (moveType == NULL) { return 0; } const float3 pos(luaL_checkfloat(L, 2), luaL_checkfloat(L, 3), luaL_checkfloat(L, 4)); ASSERT_SYNCED(pos); moveType->SetPosition(pos); return 0; }
bool Execute(const SyncedAction& action) const { ASSERT_SYNCED(gu->myPlayerNum * 123.0f); ASSERT_SYNCED(gu->myPlayerNum * 123); ASSERT_SYNCED((short)(gu->myPlayerNum * 123 + 123)); //ASSERT_SYNCED(float3(gu->myPlayerNum, gu->myPlayerNum, gu->myPlayerNum)); for (int i = unitHandler->MaxUnits() - 1; i >= 0; --i) { if (unitHandler->units[i]) { if (action.GetPlayerID() == gu->myPlayerNum) { ++unitHandler->units[i]->midPos.x; // and desync... ++unitHandler->units[i]->midPos.x; } else { // execute the same amount of flops on any other player, // but do not desync (it is a NOP) ++unitHandler->units[i]->midPos.x; --unitHandler->units[i]->midPos.x; } break; } } LOG_L(L_ERROR, "Desyncing in frame %d.", gs->frameNum); return true; }
CWeaponProjectile::CWeaponProjectile(const ProjectileParams& params) : CProjectile(params.pos, params.speed, params.owner, true, true, false, false) , damages(nullptr) , weaponDef(params.weaponDef) , target(params.target) , ttl(params.ttl) , bounces(0) , targeted(false) , startPos(params.pos) , targetPos(params.end) { projectileType = WEAPON_BASE_PROJECTILE; assert(weaponDef != nullptr); if (weaponDef->IsHitScanWeapon()) { hitscan = true; // the else-case (default) is handled in CProjectile::Init // // ray projectiles must all set this to false because their collision // detection is handled by the weapons firing them, ProjectileHandler // will skip any tests for these checkCol = false; // type has not yet been set by derived ctor's at this point // useAirLos = (projectileType != WEAPON_LIGHTNING_PROJECTILE); useAirLos = true; // NOTE: // {BeamLaser, Lightning}Projectile's do NOT actually move (their // speed is never added to pos) and never alter their speed either // they additionally override our ::Update (so CProjectile::Update // is also never called) which means assigning speed a non-zerovec // value should have no side-effects SetPosition(startPos); SetVelocityAndSpeed(targetPos - startPos); // ProjectileDrawer vis-culls by pos == startPos, but we // want to see the beam even if camera is near targetPos // --> use full distance for drawRadius SetRadiusAndHeight((targetPos - startPos).Length(), 0.0f); } collisionFlags = weaponDef->collisionFlags; weaponNum = params.weaponNum; alwaysVisible = weaponDef->visuals.alwaysVisible; ignoreWater = weaponDef->waterweapon; CSolidObject* so = NULL; CWeaponProjectile* po = NULL; if ((so = dynamic_cast<CSolidObject*>(target)) != NULL) { AddDeathDependence(so, DEPENDENCE_WEAPONTARGET); } if ((po = dynamic_cast<CWeaponProjectile*>(target)) != NULL) { po->SetBeingIntercepted(po->IsBeingIntercepted() || weaponDef->interceptSolo); AddDeathDependence(po, DEPENDENCE_INTERCEPTTARGET); } if (params.model != NULL) { model = params.model; } else { model = weaponDef->LoadModel(); } if (params.owner == NULL) { // the else-case (default) is handled in CProjectile::Init ownerID = params.ownerID; teamID = params.teamID; allyteamID = teamHandler->IsValidTeam(teamID)? teamHandler->AllyTeam(teamID): -1; } if (ownerID != -1u && weaponNum != -1u) { const CUnit* owner = unitHandler->GetUnit(ownerID); if (owner != nullptr && weaponNum < owner->weapons.size()) { damages = DynDamageArray::IncRef(owner->weapons[weaponNum]->damages); } } if (damages == nullptr) damages = DynDamageArray::IncRef(&weaponDef->damages); if (params.cegID != -1u) { cegID = params.cegID; } else { cegID = weaponDef->ptrailExplosionGeneratorID; } // must happen after setting position and velocity projectileHandler->AddProjectile(this); quadField->AddProjectile(this); ASSERT_SYNCED(id); if (weaponDef->targetable) { interceptHandler.AddInterceptTarget(this, targetPos); } }