| 16 | } |
| 17 | |
| 18 | CProjectileData ExtractProjectileInfo(int NetObjType, const void *pData, CGameWorld *pGameWorld, const CNetObj_EntityEx *pEntEx) |
| 19 | { |
| 20 | CNetObj_Projectile *pProj = (CNetObj_Projectile *)pData; |
| 21 | |
| 22 | if(NetObjType == NETOBJTYPE_DDNETPROJECTILE) |
| 23 | { |
| 24 | return ExtractProjectileInfoDDNet((CNetObj_DDNetProjectile *)pData); |
| 25 | } |
| 26 | else if(NetObjType == NETOBJTYPE_DDRACEPROJECTILE || (NetObjType == NETOBJTYPE_PROJECTILE && UseProjectileExtraInfo(pProj))) |
| 27 | { |
| 28 | return ExtractProjectileInfoDDRace((CNetObj_DDRaceProjectile *)pData, pGameWorld, pEntEx); |
| 29 | } |
| 30 | |
| 31 | CProjectileData Result = {vec2(0, 0)}; |
| 32 | Result.m_StartPos.x = pProj->m_X; |
| 33 | Result.m_StartPos.y = pProj->m_Y; |
| 34 | Result.m_StartVel.x = pProj->m_VelX / 100.0f; |
| 35 | Result.m_StartVel.y = pProj->m_VelY / 100.0f; |
| 36 | Result.m_Type = pProj->m_Type; |
| 37 | Result.m_StartTick = pProj->m_StartTick; |
| 38 | Result.m_ExtraInfo = false; |
| 39 | Result.m_Owner = -1; |
| 40 | Result.m_TuneZone = pGameWorld && pGameWorld->m_WorldConfig.m_UseTuneZones ? pGameWorld->Collision()->IsTune(pGameWorld->Collision()->GetMapIndex(Result.m_StartPos)) : 0; |
| 41 | Result.m_SwitchNumber = pEntEx ? pEntEx->m_SwitchNumber : 0; |
| 42 | return Result; |
| 43 | } |
| 44 | |
| 45 | CProjectileData ExtractProjectileInfoDDRace(const CNetObj_DDRaceProjectile *pProj, CGameWorld *pGameWorld, const CNetObj_EntityEx *pEntEx) |
| 46 | { |
no test coverage detected