void CProjectile::Tick() { float Pt = (Server()->Tick()-m_StartTick-1)/(float)Server()->TickSpeed(); float Ct = (Server()->Tick()-m_StartTick)/(float)Server()->TickSpeed(); vec2 PrevPos = GetPos(Pt); vec2 CurPos = GetPos(Ct); int Collide = GameServer()->Collision()->IntersectLine(PrevPos, CurPos, &CurPos, 0); CCharacter *OwnerChar = GameServer()->GetPlayerChar(m_Owner); CCharacter *TargetChr = GameServer()->m_World.IntersectCharacter(PrevPos, CurPos, 6.0f, CurPos, OwnerChar); m_LifeSpan--; if(TargetChr || Collide || m_LifeSpan < 0 || GameLayerClipped(CurPos)) { if(m_LifeSpan >= 0 || m_Weapon == WEAPON_GRENADE) GameServer()->CreateSound(CurPos, m_SoundImpact); if(m_Explosive) GameServer()->CreateExplosion(CurPos, m_Owner, m_Weapon, false); else if(TargetChr) TargetChr->TakeDamage(m_Direction * max(0.001f, m_Force), m_Damage, m_Owner, m_Weapon); GameServer()->m_World.DestroyEntity(this); } }
void CCharacter::Tick() { if(m_pPlayer->m_ForceBalanced) { char Buf[128]; str_format(Buf, sizeof(Buf), "You were moved to %s due to team balancing", GameServer()->m_pController->GetTeamName(m_pPlayer->GetTeam())); GameServer()->SendBroadcast(Buf, m_pPlayer->GetCID()); m_pPlayer->m_ForceBalanced = false; } m_Core.m_Input = m_Input; m_Core.Tick(true); int Col = GameServer()->Collision()->GetCollisionAt(m_Pos.x, m_Pos.y); if((Col <= 7 && Col&CCollision::COLFLAG_DEATH) || GameLayerClipped(m_Pos)) //seriously. { // handle death-tiles and leaving gamelayer m_Core.m_Frozen = 0; //we just unfreeze so it never counts as a sacrifice Die(m_pPlayer->GetCID(), WEAPON_WORLD); } if (m_Core.m_Frozen) { if (m_ActiveWeapon != WEAPON_NINJA) GiveNinja(true); else if (m_Ninja.m_ActivationTick + 5 * Server()->TickSpeed() < Server()->Tick()) m_Ninja.m_ActivationTick = Server()->Tick(); // this should fix the end-of-ninja missprediction bug //openfng handles this in mod gamectl //if ((m_Core.m_Frozen+1) % Server()->TickSpeed() == 0) // GameServer()->CreateDamageInd(m_Pos, 0, (m_Core.m_Frozen+1) / Server()->TickSpeed()); m_MoltenBy = -1; m_MoltenAt = -1; } else { if (m_ActiveWeapon == WEAPON_NINJA) { TakeNinja(); m_MoltenAt = Server()->Tick(); } m_FrozenBy = -1; } if (m_BloodTicks > 0) { if (m_BloodTicks % g_Config.m_SvBloodInterval == 0) GameServer()->CreateDeath(m_Core.m_Pos, m_pPlayer->GetCID()); --m_BloodTicks; } // handle Weapons HandleWeapons(); // Previnput m_PrevInput = m_Input; return; }
void CCharacter::Tick() { if(m_pPlayer->m_ForceBalanced) { char Buf[128]; str_format(Buf, sizeof(Buf), "You were moved to %s due to team balancing", GameServer()->m_pController->GetTeamName(m_pPlayer->GetTeam())); GameServer()->SendBroadcast(Buf, m_pPlayer->GetCID()); m_pPlayer->m_ForceBalanced = false; } m_Core.m_Input = m_Input; m_Core.Tick(true); // handle death-tiles and leaving gamelayer if(GameServer()->Collision()->GetCollisionAt(m_Pos.x+m_ProximityRadius/3.f, m_Pos.y-m_ProximityRadius/3.f)&CCollision::COLFLAG_DEATH || GameServer()->Collision()->GetCollisionAt(m_Pos.x+m_ProximityRadius/3.f, m_Pos.y+m_ProximityRadius/3.f)&CCollision::COLFLAG_DEATH || GameServer()->Collision()->GetCollisionAt(m_Pos.x-m_ProximityRadius/3.f, m_Pos.y-m_ProximityRadius/3.f)&CCollision::COLFLAG_DEATH || GameServer()->Collision()->GetCollisionAt(m_Pos.x-m_ProximityRadius/3.f, m_Pos.y+m_ProximityRadius/3.f)&CCollision::COLFLAG_DEATH || GameLayerClipped(m_Pos)) { Die(m_pPlayer->GetCID(), WEAPON_WORLD); } // handle Weapons HandleWeapons(); // Previnput m_PrevInput = m_Input; return; }
void CProjectile::Tick() { float Pt = (Server()->Tick()-m_StartTick-1)/(float)Server()->TickSpeed(); float Ct = (Server()->Tick()-m_StartTick)/(float)Server()->TickSpeed(); vec2 PrevPos = GetPos(Pt); vec2 CurPos = GetPos(Ct); int Collide = GameServer()->Collision()->IntersectLine(PrevPos, CurPos, &CurPos, 0); CCharacter *OwnerChar = GameServer()->GetPlayerChar(m_Owner); CCharacter *TargetChr = GameServer()->m_World.IntersectCharacter(PrevPos, CurPos, 6.0f, CurPos, OwnerChar); m_LifeSpan--; if(TargetChr || Collide || m_LifeSpan < 0 || GameLayerClipped(CurPos)) { if(m_LifeSpan >= 0 || m_Weapon == WEAPON_GRENADE) GameServer()->CreateSound(CurPos, m_SoundImpact); if(m_Explosive) GameServer()->CreateExplosion(CurPos, m_Owner, m_Weapon, false); else if(TargetChr) TargetChr->TakeDamage(m_Direction * max(0.001f, m_Force), m_Damage, m_Owner, m_Weapon); GameServer()->m_World.DestroyEntity(this); } int tileId = GameServer()->Collision()->GetCollisionIdAt(CurPos.x, CurPos.y); if(g_Config.m_SvTeleport && g_Config.m_SvTeleportGrenade && m_Weapon == WEAPON_GRENADE && tileId>=CCollision::COLID_TELEPORT_BEGIN&&tileId<=CCollision::COLID_TELEPORT_END && (tileId-CCollision::COLID_TELEPORT_BEGIN)%2==1) { m_Pos = GameServer()->Collision()->GetTeleportDestination((tileId-CCollision::COLID_TELEPORT_BEGIN)/2); m_StartTick=Server()->Tick(); } }
void CMercenaryGrenade::Tick() { float Pt = (Server()->Tick()-m_StartTick-1)/(float)Server()->TickSpeed(); float Ct = (Server()->Tick()-m_StartTick)/(float)Server()->TickSpeed(); vec2 PrevPos = GetPos(Pt); vec2 CurPos = GetPos(Ct); m_ActualPos = CurPos; m_ActualDir = normalize(CurPos - PrevPos); if(GameLayerClipped(CurPos)) { GameServer()->m_World.DestroyEntity(this); return; } vec2 LastPos; int Collide = GameServer()->Collision()->IntersectLine(PrevPos, CurPos, NULL, &LastPos); if(Collide) { //Thanks to TeeBall 0.6 vec2 CollisionPos; CollisionPos.x = LastPos.x; CollisionPos.y = CurPos.y; int CollideY = GameServer()->Collision()->IntersectLine(PrevPos, CollisionPos, NULL, NULL); CollisionPos.x = CurPos.x; CollisionPos.y = LastPos.y; int CollideX = GameServer()->Collision()->IntersectLine(PrevPos, CollisionPos, NULL, NULL); m_Pos = LastPos; m_ActualPos = m_Pos; vec2 vel; vel.x = m_Direction.x; vel.y = m_Direction.y + 2*GameServer()->Tuning()->m_GrenadeCurvature/10000*Ct*GameServer()->Tuning()->m_GrenadeSpeed; if (CollideX && !CollideY) { m_Direction.x = -vel.x; m_Direction.y = vel.y; } else if (!CollideX && CollideY) { m_Direction.x = vel.x; m_Direction.y = -vel.y; } else { m_Direction.x = -vel.x; m_Direction.y = -vel.y; } m_Direction.x *= (100 - 50) / 100.0; m_Direction.y *= (100 - 50) / 100.0; m_StartTick = Server()->Tick(); m_ActualDir = normalize(m_Direction); } }
void CProjectile::Tick() { float Pt = (Server()->Tick()-m_StartTick-1)/(float)Server()->TickSpeed(); float Ct = (Server()->Tick()-m_StartTick)/(float)Server()->TickSpeed(); vec2 PrevPos = GetPos(Pt); vec2 CurPos = GetPos(Ct); int Collide = GameServer()->Collision()->IntersectLine(PrevPos, CurPos, &CurPos, 0); CCharacter *OwnerChar = GameServer()->GetPlayerChar(m_Owner); CCharacter *TargetChr = GameServer()->m_World.IntersectCharacter(PrevPos, CurPos, 6.0f, CurPos, OwnerChar); m_LifeSpan--; if(TargetChr || Collide || m_LifeSpan < 0 || GameLayerClipped(CurPos)) { if(m_LifeSpan >= 0 || m_Weapon == WEAPON_GRENADE) GameServer()->CreateSound(CurPos, m_SoundImpact); if(m_Explosive) { if (m_ExtraInfo == MEGAROCKETS) { /*GameServer()->CreateExplosion(CurPos+vec2(-32, -32), m_Owner, m_Weapon, false); GameServer()->CreateExplosion(CurPos+vec2(+32, -32), m_Owner, m_Weapon, false); GameServer()->CreateExplosion(CurPos+vec2(+32, +32), m_Owner, m_Weapon, false); GameServer()->CreateExplosion(CurPos+vec2(-32, +32), m_Owner, m_Weapon, false);*/ CSuperexplosion *S = new CSuperexplosion(&GameServer()->m_World, CurPos, m_Owner, m_Weapon, 1); GameServer()->m_World.InsertEntity(S); } else if (m_ExtraInfo == DOOMROCKETS) { CSuperexplosion *S = new CSuperexplosion(&GameServer()->m_World, CurPos, m_Owner, m_Weapon, 2); GameServer()->m_World.InsertEntity(S); } else GameServer()->CreateExplosion(CurPos, m_Owner, m_Weapon, false); } else if(TargetChr) { // apply sleep effect if (TargetChr->GetPlayer()->m_pAI && OwnerChar) { //if (OwnerChar->GetPlayer()->HasWeaponUpgrade(m_Weapon, UPG_SLEEPEFFECT)) // TargetChr->GetPlayer()->m_pAI->Zzz(40); } TargetChr->TakeDamage(m_Direction * max(0.001f, m_Force), m_Damage, m_Owner, m_Weapon); } GameServer()->m_World.DestroyEntity(this); } }
void CProjectile::Tick() { float Pt = (Server()->Tick()-m_StartTick-1)/(float)Server()->TickSpeed(); float Ct = (Server()->Tick()-m_StartTick)/(float)Server()->TickSpeed(); vec2 PrevPos = GetPos(Pt); vec2 CurPos = GetPos(Ct); int Collide = GameServer()->Collision()->IntersectLine(PrevPos, CurPos, &CurPos, 0); CCharacter *OwnerChar = GameServer()->GetPlayerChar(m_Owner); CCharacter *TargetChr = GameServer()->m_World.IntersectCharacter(PrevPos, CurPos, 6.0f, CurPos, OwnerChar); m_LifeSpan--; if(TargetChr || Collide || m_LifeSpan < 0 || GameLayerClipped(CurPos)) { int EventID = GameServer()->m_pLua->m_pEventListener->CreateEventStack(); GameServer()->m_pLua->m_pEventListener->GetParameters(EventID)->FindFree()->Set(m_Owner); GameServer()->m_pLua->m_pEventListener->GetParameters(EventID)->FindFree()->Set(m_Weapon); GameServer()->m_pLua->m_pEventListener->GetParameters(EventID)->FindFree()->Set(CurPos.x); GameServer()->m_pLua->m_pEventListener->GetParameters(EventID)->FindFree()->Set(CurPos.y); GameServer()->m_pLua->m_pEventListener->GetParameters(EventID)->FindFree()->Set(m_StartTick); GameServer()->m_pLua->m_pEventListener->GetParameters(EventID)->FindFree()->Set(m_Direction.x); GameServer()->m_pLua->m_pEventListener->GetParameters(EventID)->FindFree()->Set(m_Direction.y); if (TargetChr) GameServer()->m_pLua->m_pEventListener->GetParameters(EventID)->FindFree()->Set(TargetChr->GetPlayer()->GetCID()); else GameServer()->m_pLua->m_pEventListener->GetParameters(EventID)->FindFree()->Set(-1); GameServer()->m_pLua->m_pEventListener->GetParameters(EventID)->FindFree()->Set(Collide); GameServer()->m_pLua->m_pEventListener->GetParameters(EventID)->FindFree()->Set(m_ID); GameServer()->m_pLua->m_pEventListener->OnEvent("OnProjectileDestroy"); if (GameServer()->m_pLua->m_pEventListener->GetReturns(EventID)->m_aVars[0].IsNumeric() && GameServer()->m_pLua->m_pEventListener->GetReturns(EventID)->m_aVars[0].GetInteger() == 1) return; if(m_LifeSpan >= 0 || m_Weapon == WEAPON_GRENADE) GameServer()->CreateSound(CurPos, m_SoundImpact); if(m_Explosive && GameServer()->m_pLua->m_pEventListener->GetReturns(EventID)->m_aVars[1].GetInteger() == 0) GameServer()->CreateExplosion(CurPos, m_Owner, m_Weapon, false); else if(TargetChr) TargetChr->TakeDamage(m_Direction * max(0.001f, m_Force), m_Damage, m_Owner, m_Weapon); GameServer()->m_World.DestroyEntity(this); } }
void CCharacter::Tick() { m_Core.m_Input = m_Input; m_Core.Tick(true); // handle death-tiles and leaving gamelayer if(GameServer()->Collision()->GetCollisionAt(m_Pos.x+m_ProximityRadius/3.f, m_Pos.y-m_ProximityRadius/3.f)&CCollision::COLFLAG_DEATH || GameServer()->Collision()->GetCollisionAt(m_Pos.x+m_ProximityRadius/3.f, m_Pos.y+m_ProximityRadius/3.f)&CCollision::COLFLAG_DEATH || GameServer()->Collision()->GetCollisionAt(m_Pos.x-m_ProximityRadius/3.f, m_Pos.y-m_ProximityRadius/3.f)&CCollision::COLFLAG_DEATH || GameServer()->Collision()->GetCollisionAt(m_Pos.x-m_ProximityRadius/3.f, m_Pos.y+m_ProximityRadius/3.f)&CCollision::COLFLAG_DEATH || GameLayerClipped(m_Pos)) { Die(m_pPlayer->GetCID(), WEAPON_WORLD); } // handle Weapons HandleWeapons(); }
void CRocket::Tick() { float Pt = (Server()->Tick()-m_StartTick-1)/(float)Server()->TickSpeed(); float Ct = (Server()->Tick()-m_StartTick)/(float)Server()->TickSpeed(); vec2 PrevPos = GetPos(Pt); vec2 CurPos = GetPos(Ct); float Speed = (GameServer()->Tuning()->m_GrenadeSpeed * m_SpeedScaler); m_PrivatePos.x = m_Pos.x + m_Direction.x*Pt*Speed; m_PrivatePos.y = m_Pos.y + m_Direction.y*Pt*Speed; if(m_LastTick < (Server()->Tick() + Server()->TickSpeed() / 2)) { GameServer()->CreateExplosion(m_PrivatePos, m_Owner, WEAPON_GRENADE, true); m_LastTick = Server()->Tick(); } int Collide = GameServer()->Collision()->IntersectLine(PrevPos, CurPos, &CurPos, 0); CCharacter *OwnerChar = GameServer()->GetPlayerChar(m_Owner); CCharacter *TargetChr = GameServer()->m_World.IntersectCharacter(PrevPos, CurPos, 6.0f, CurPos, OwnerChar); m_LifeSpan--; if(TargetChr || Collide || m_LifeSpan < 0 || GameLayerClipped(CurPos)) { if(m_LifeSpan >= 0 || m_Weapon == WEAPON_GRENADE) GameServer()->CreateSound(CurPos, m_SoundImpact); if(m_Explosive) GameServer()->CreateExplosion(CurPos, m_Owner, m_Weapon, false); else if(TargetChr) TargetChr->TakeDamage(m_Direction * max(0.001f, m_Force), m_Damage, m_Owner, m_Weapon); GameServer()->m_World.DestroyEntity(this); } }
void CCharacter::Tick() { if(m_pPlayer->m_ForceBalanced) { char Buf[128]; str_format(Buf, sizeof(Buf), "You were moved to %s due to team balancing", GameServer()->m_pController->GetTeamName(m_pPlayer->GetTeam())); GameServer()->SendBroadcast(Buf, m_pPlayer->GetCID()); m_pPlayer->m_ForceBalanced = false; } m_Core.m_Input = m_Input; m_Core.Tick(true); // handle death-tiles and leaving gamelayer if(GameServer()->Collision()->GetCollisionAt(m_Pos.x+m_ProximityRadius/3.f, m_Pos.y-m_ProximityRadius/3.f)&CCollision::COLFLAG_DEATH || GameServer()->Collision()->GetCollisionAt(m_Pos.x+m_ProximityRadius/3.f, m_Pos.y+m_ProximityRadius/3.f)&CCollision::COLFLAG_DEATH || GameServer()->Collision()->GetCollisionAt(m_Pos.x-m_ProximityRadius/3.f, m_Pos.y-m_ProximityRadius/3.f)&CCollision::COLFLAG_DEATH || GameServer()->Collision()->GetCollisionAt(m_Pos.x-m_ProximityRadius/3.f, m_Pos.y+m_ProximityRadius/3.f)&CCollision::COLFLAG_DEATH || GameLayerClipped(m_Pos)) { Die(m_pPlayer->GetCID(), WEAPON_WORLD); } // handle Weapons HandleWeapons(); /* INFECTION MODIFICATION START ***************************************/ if(GetClass() == PLAYERCLASS_HUNTER) { if(IsGrounded()) m_AirJumpCounter = 0; if(m_Core.m_TriggeredEvents&COREEVENT_AIR_JUMP && m_AirJumpCounter < 1) { m_Core.m_Jumped &= ~2; m_AirJumpCounter++; } } if(m_pClassChooser) { if(GetClass() != PLAYERCLASS_NONE) { GameServer()->m_World.DestroyEntity(m_pClassChooser); m_pClassChooser = 0; } else { m_pClassChooser->m_Pos = m_Pos; m_pClassChooser->SetCursor(vec2(m_Input.m_TargetX, m_Input.m_TargetY)); if(m_Input.m_Fire&1) { int ccRes = m_pClassChooser->SelectClass(); if(ccRes) { GameServer()->m_World.DestroyEntity(m_pClassChooser); m_pClassChooser = 0; m_pPlayer->SetClass(ccRes); } } } } /* INFECTION MODIFICATION END *****************************************/ // Previnput m_PrevInput = m_Input; return; }
void CRocket::Tick() { int64_t TeamMask = -1LL; const bool Collide = GameServer()->Collision()->CheckPoint(m_Pos); CCharacter *pOwnerChar = 0; CCharacter *apEnts[MAX_CLIENTS]; if(m_Owner >= 0) pOwnerChar = GameServer()->GetPlayerChar(m_Owner); if(pOwnerChar && pOwnerChar->IsAlive()) TeamMask = pOwnerChar->Teams()->TeamMask(pOwnerChar->Team(), -1, m_Owner); if (!pOwnerChar) return; float Radius = 1000.0f; m_Pos += m_Direction * 15; /* Rocket Speed */ int Num = GameServer()->m_World.FindEntities(m_Pos, Radius, (CEntity**)apEnts, MAX_CLIENTS, CGameWorld::ENTTYPE_CHARACTER); for (int i = 0; i < Num; i++) { if (apEnts[i] && ((CGameControllerDDRace*)GameServer()->m_pController)->m_Teams.m_Core.Team(apEnts[i]->GetPlayer()->GetCID()) != ((CGameControllerDDRace*)GameServer()->m_pController)->m_Teams.m_Core.Team(m_Owner)) /* Check Team */ continue; if (apEnts[i] && GameServer()->Collision()->IntersectLine(m_Pos, apEnts[i]->m_Pos, 0x0, 0)) continue; if (!apEnts[i]) continue; if (apEnts[i] != pOwnerChar) { if (length(m_Pos - apEnts[i]->m_Pos) < Radius) /* Check Distance */ { vec2 Temp = apEnts[i]->m_Core.m_Vel + (normalize(m_Pos - apEnts[i]->m_Pos)*GameServer()->Tuning()->m_Gravity) * 4; /* Gravity Power */ apEnts[i]->m_Core.m_Vel = Temp; m_Gravity = true; m_Freeze = true; } else if (length(m_Pos - apEnts[i]->m_Pos) > Radius) { m_Gravity = false; m_Freeze = false; } if (m_Freeze) { if (length(m_Pos - apEnts[i]->m_Pos) < 50) /* Check Distance */ apEnts[i]->Freeze(); } } } m_LifeSpan--; if(Collide || m_LifeSpan < 0 || GameLayerClipped(m_Pos)) { GameServer()->CreateSound(m_Pos, SOUND_GRENADE_EXPLODE, (m_Owner != -1)? TeamMask : -1LL); Reset(); return; } GameServer()->CreateExplosion(m_Pos, m_Owner, -1, true, (!pOwnerChar ? -1 : pOwnerChar->Team()), (m_Owner != -1)? TeamMask : -1LL); }
void CBuilding::Tick() { // handle death-tiles and leaving gamelayer if(GameServer()->Collision()->GetCollisionAt(m_Pos.x+m_ProximityRadius/2.f, m_Pos.y-m_ProximityRadius/2.f)&CCollision::COLFLAG_DEATH || GameServer()->Collision()->GetCollisionAt(m_Pos.x+m_ProximityRadius/2.f, m_Pos.y+m_ProximityRadius/2.f)&CCollision::COLFLAG_DEATH || GameServer()->Collision()->GetCollisionAt(m_Pos.x-m_ProximityRadius/2.f, m_Pos.y-m_ProximityRadius/2.f)&CCollision::COLFLAG_DEATH || GameServer()->Collision()->GetCollisionAt(m_Pos.x-m_ProximityRadius/2.f, m_Pos.y+m_ProximityRadius/2.f)&CCollision::COLFLAG_DEATH || GameLayerClipped(m_Pos)) { Die(-1, WEAPON_WORLD); return; } if(!IsGrounded()) { Die(-1, WEAPON_WORLD); return; } if(Server()->Tick() % 5 == 0 && m_Decon) { if( ((CGameControllerNODES*)GameServer()->m_pController)->Spawns[m_Team] <= 0) { m_Decon = false; } else { TakeDamage(vec2(0,0), 1, -1, WEAPON_SELF); } } if(m_Decay > 0) m_Decay--; if(m_AnimDecay > 0) m_AnimDecay--; if(m_SpawnanimDecay > 0) m_SpawnanimDecay--; m_Power = Powered(); if(!m_Power && (m_Type == B_REPEATER || m_Type == B_TELEPORT)) m_Anim = 0; if(!m_Power) m_Hit = 0; if(!m_Power && m_Type == B_TELEPORT) m_Anim = 0; if(!m_Alive || (!m_Power && m_Type != B_SHIELD)) return; if(Server()->Tick() % 100 == 0 && m_Health < m_Maxhealth/4) { GameServer()->CreateExplosion(pos, -1, -1, true); } switch(m_Type) { case B_REACTOR: { if(m_AnimDecay == 0) { m_Anim++; if(m_Anim > 3) { m_Anim = 0; m_AnimDecay = 100; } else m_AnimDecay = 10; } } break; case B_REPEATER: { if(!m_Power) { m_Anim = 0; } else { if(m_AnimDecay == 0) { m_Anim++; if(m_Anim > 1) { m_Anim = 0; m_AnimDecay = 100; } else m_AnimDecay = 10; } } } break; case B_SPAWN: { m_Anim = m_Anim & 0xF; if(m_AnimDecay == 0) { m_Anim++; if(m_Anim > 6) m_Anim = 0; m_AnimDecay = 35; } if(m_Spawnanim > 0 && m_SpawnanimDecay == 0) { m_Spawnanim--; m_SpawnanimDecay = 4; } m_Anim = (m_Spawnanim << 4) | m_Anim; } break; case B_AMMO1: case B_AMMO2: case B_AMMO3: { CCharacter *c = GetNearest(ms_PhysSize, m_Team); if(c) { if(m_Anim < 3 && m_AnimDecay == 0) { m_Anim++; m_AnimDecay = 4; } if(m_Decay == 0 && m_Anim == 3) { m_Decay = 50; int weapon = -1; if(m_Type == B_AMMO1) weapon = WEAPON_SHOTGUN; else if(m_Type == B_AMMO2) weapon = WEAPON_GRENADE; else if(m_Type == B_AMMO3) weapon = WEAPON_RIFLE; if(!c->m_Weapons[weapon].m_Got) { c->m_Weapons[weapon].m_Got = 1; c->m_ActiveWeapon = weapon; GameServer()->CreateSound(m_Pos, SOUND_PICKUP_SHOTGUN); } else { GameServer()->CreateSound(m_Pos, SOUND_PICKUP_GRENADE); } c->m_Weapons[weapon].m_Ammo = 10; } } else { if(m_Anim > 0 && m_AnimDecay == 0) { m_Anim--; m_AnimDecay = 4; } } } break; case B_TURRET1: { vec2 realpos = vec2(m_Pos.x, m_Pos.y-74); vec2 tmppos = m_Pos; m_Pos = realpos; CCharacter *c = GetNearest(700, m_Team^1); m_Pos = tmppos; if(c) { m_Angle = GetAngle(normalize(c->m_Pos - realpos)); if(m_Decay == 0) { m_Decay = 12; float a = m_Angle; a+=frandom()*0.20f -0.10f; CProjectile *pProj = new CProjectile(WEAPON_GUN, -1, realpos, vec2(cosf(a), sinf(a)), (int)(Server()->TickSpeed()*GameServer()->Tuning()->m_GunLifetime), 1, 0, 0, -1, WEAPON_GUN, false); GameServer()->CreateSound(realpos, SOUND_GUN_FIRE); } } } break; case B_TURRET2: { vec2 realpos = vec2(m_Pos.x, m_Pos.y-66); vec2 tmppos = m_Pos; m_Pos = realpos; CCharacter *c = GetNearest(500, m_Team^1); m_Pos = tmppos; if(c) { m_Angle = GetAngle(normalize(c->m_Pos-realpos)); if(m_Decay == 0) { m_Decay = 30; int shotspread = 2; for(int i = -shotspread; i <= shotspread; i++) { float spreading[] = {-0.185f, -0.070f, 0, 0.070f, 0.185f}; float a = m_Angle; a += spreading[i+2]; float v = 1-(abs(i)/(float)shotspread); float speed = mix((float)tuning.shotgun_speeddiff, 1.0f, v); CProjectile *pProj = new CProjectile(WEAPON_SHOTGUN, -2, realpos, vec2(cosf(a), sinf(a))*speed, (int)(Server()->TickSpeed()*GameServer()->Tuning()->m_ShotgunLifetime), 1, 0, 0, -1, WEAPON_SHOTGUN, false); } game.create_sound(realpos, SOUND_SHOTGUN_FIRE); } } } break; case B_HEALTH: case B_ARMOR: { CCharacter *c = GetNearest(ms_PhysSize, m_Team); if(c) { if(m_Decay == 0) { //wait for open first if(m_AnimDecay == 0 && m_Decay == 0 && m_Anim < 4) { m_AnimDecay = 3; m_Anim++; } else if(m_AnimDecay == 0) { if(m_Type == B_HEALTH && c->m_Health < 10) { m_Decay = 150; c->IncreaseHealth(3); GameServer()->CreateSound(m_Pos, SOUND_PICKUP_HEALTH); c->m_Ill = false; } else if(m_Type == B_HEALTH) { c->m_Ill = false; } else if(m_Type == B_ARMOR && c->m_Armor < 10) { m_Decay = 150; c->IncreaseArmor(3); GameServer()->CreateSound(m_Pos, SOUND_PICKUP_ARMOR); } } } } else { if(m_AnimDecay == 0 && m_Decay == 0 && m_Anim > 0) { m_AnimDecay = 3; m_Anim--; } } } break; case B_SHIELD: { if(Server()->Tick() % 50 == 0 && m_Power) { if(m_Armor < 30) m_Armor++; //game.create_damageind(pos, 3.141592, armor > 0 ? (int)(10.0f*armor/30) : 0); } if(Server()->Tick() % 5 == 0) { if(m_Hit > 0) m_Hit--; if(m_Power && m_Armor > 0) { CProjectile *pProj[128]; int num = GameServer()->m_World.FindEntities(m_Pos, 250.0f, (CEntity**)pProj, 128, CGameWorld::ENTTYPE_PROJECTILE); for(int i = 0; i < num && m_Armor > 0; i++) { if(pProj[i]->m_Bounce) continue; if((pProj[i]->m_Owner >= 0) && GameServer()->m_apPlayers[pProj[i]->m_Owner] && GameServer()->m_apPlayers[pProj[i]->m_Owner]->m_Team == m_Team) continue; if(pProj[i]->m_Owner < 0) continue; pProj[i]->m_Initpos = pProj[i]->m_Pos; pProj[i]->m_StartTick = Server()->Tick(); pProj[i]->m_Direction = normalize(pProj[i]->m_Pos-m_Pos); pProj[i]->m_Bounce = 1; m_Hit = 3; //game.create_shieldhit(m_Pos, 0); m_Armor = clamp(m_Armor-(pProj[i]->m_Weapon == WEAPON_GRENADE ? 4 : 2), 0, 30); if(m_Armor == 0) { m_Armor = -4; } } } } m_Anim = (m_Armor > 0 ? (int)(9.0f*m_Armor/30.0f) : 0) | (m_Hit << 4); } break; //NODESTODO: COUNTINUE! case B_TELEPORT: { if(m_Decay == 0) { //find other teleport... D= CBuilding *other = 0; for(int i = 0; i < ((CGameControllerNODES*)GameServer()->m_pController)->BuildingsCount[m_Team]; i++) { CBuilding *b = ((CGameControllerNODES*)GameServer()->m_pController)->Buildings[m_Team][i]; if( b != this && b->m_Type == B_TELEPORT && b->m_Alive && b->m_Power) { other = b; } } if(other) { bool is_enemy = false; CCharacter *c = GetNearest(ms_PhysSize-4.0f, m_Team); if(!c && m_Anim == 8) {//once opened, port enemies as well c = GetNearest(ms_PhysSize-4.0f, m_Team^1); is_enemy = true; } if(c) { if(m_Anim < 8 && m_AnimDecay == 0 && !is_enemy) { m_Anim++; m_AnimDecay = 2; other->m_Anim = m_Anim; other->m_AnimDecay = m_AnimDecay+1; other->m_Decay =m_AnimDecay+1; } else if(anim == 8 && m_AnimDecay == 0) { if(!c->m_pPlayer->m_Ported) { //dbg_msg("nodes", "yay"); float ill_prob = min((distance(other->m_Pos, m_Pos))/8000.0f * 0.2f, 0.2f); for(int i = 0; i < MAX_CLIENTS; i++) { if(game.players[i] && game.players[i]->get_character() && (game.players[i]->get_character()->core.hooked_player == c->player->client_id || c->core.hooked_player == game.players[i]->client_id)) { CCharacter *hc = game.players[i]->get_character(); hc->m_Pos = vec2(other->m_Pos.x, other->m_Pos.y-1); hc->core.m_Pos = vec2(other->m_Pos.x, other->m_Pos.y-1); hc->player->ported = true; hc->core.hook_state = -1; hc->core.hooked_player = -1; if(frandom() <= ill_prob) { if(!hc->ill) { hc->ill = true; hc->infecter = -1; } } } } //dbg_msg("nodes", "porting %d from (%d,%d) to (%d,%d)", c->player->client_id, (int)pos.x, (int)pos.y, (int)other->pos.x, (int)other->pos.y); c->pos = vec2(other->pos.x, other->pos.y-1); c->core.pos = vec2(other->pos.x, other->pos.y-1); c->player->ported = true; c->core.hook_state = -1; c->core.hooked_player = -1; if(frandom() <= ill_prob) { if(!c->ill) { c->ill = true; c->infecter = -1; } } decay = 50; other->decay = 50; anim = 1; other->anim = 1; game.create_playerspawn(other->pos); game.create_sound(pos, SOUND_TELEPORT); game.create_death(pos, c->player->client_id); game.create_sound(other->pos, SOUND_TELEPORT); } else { anim = 0; } } } else { if(anim > 0 && anim_decay == 0) { anim++; if(anim == 9) anim = 0; anim_decay = 2; other->anim = anim; other->anim_decay = anim_decay+1; other->decay =anim_decay+1; } } } } else { if(anim_decay == 0 && anim > 0) { anim_decay = 2; anim++; if(anim == 9) anim = 0; } } } break; } return; }
void CPlasma::Tick() { if(m_Energy < 0 || GameLayerClipped(m_Pos)) { if (GameServer()->m_apPlayers[m_Owner] && m_Limit) GameServer()->m_apPlayers[m_Owner]->m_Mine -= GameServer()->m_apPlayers[m_Owner]->m_Mine > 0 ? 1 : 0; GameServer()->m_World.DestroyEntity(this); return; } vec2 To = m_Pos + (m_Dir * m_Vel); m_Energy -= distance(m_Pos, To); if ( !GameServer()->m_pEventsGame->IsActualEvent(WEAPON_SLOW) ) m_Vel += 0.5f; else m_Vel += 0.01f; vec2 At; CTeleporter *pTeleporter = (CTeleporter *)GameServer()->m_World.IntersectEntity(m_Pos, To, 12.0f, At, CGameWorld::ENTTYPE_TELEPORTER); if (pTeleporter && pTeleporter->GetNext()) { if(!HitCharacter(m_Pos, To)) m_Pos = pTeleporter->GetNext()->m_Pos + (m_Dir * 20.0f); } else if(!GameServer()->m_pEventsGame->IsActualEvent(BULLET_PIERCING) && !GameServer()->m_pEventsGame->IsActualEvent(BULLET_GLUE) && GameServer()->Collision()->IntersectLine(m_Pos, To, 0x0, &To)) { if(!HitCharacter(m_Pos, To)) { // intersected m_Pos = To; vec2 TempPos = m_Pos; vec2 TempDir = m_Dir * 4.0f; GameServer()->Collision()->MovePoint(&TempPos, &TempDir, 1.0f, 0); m_Pos = TempPos; m_Dir = normalize(TempDir); m_Bounces++; m_Energy -= GameServer()->Tuning()->m_LaserBounceCost; if(m_Bounces > GameServer()->Tuning()->m_LaserBounceNum) m_Energy = -1; GameServer()->CreateSound(m_Pos, SOUND_RIFLE_BOUNCE); GameServer()->CreateExplosion(m_Pos, m_Owner, WEAPON_RIFLE, false, false); } } else if (GameServer()->m_pEventsGame->IsActualEvent(BULLET_GLUE) && GameServer()->Collision()->IntersectLine(m_Pos, To, 0x0, &To)) { if(!HitCharacter(m_Pos, To)) { m_Pos = To; GameServer()->CreateSound(m_Pos, SOUND_RIFLE_BOUNCE); GameServer()->CreateExplosion(m_Pos, m_Owner, WEAPON_RIFLE, false, false); } } else { if(!HitCharacter(m_Pos, To)) { m_Pos = To; } } }
void CProjectile::Tick() { float Pt = (Server()->Tick()-m_StartTick-1)/(float)Server()->TickSpeed(); float Ct = (Server()->Tick()-m_StartTick)/(float)Server()->TickSpeed(); vec2 PrevPos = GetPos(Pt); vec2 CurPos = GetPos(Ct); vec2 ColPos; vec2 NewPos; int Collide = GameServer()->Collision()->IntersectLine(PrevPos, CurPos, &ColPos, &NewPos, false); CCharacter *pOwnerChar = 0; if(m_Owner >= 0) pOwnerChar = GameServer()->GetPlayerChar(m_Owner); CCharacter *pTargetChr = GameServer()->m_World.IntersectCharacter(PrevPos, ColPos, m_Freeze ? 1.0f : 6.0f, ColPos, pOwnerChar); if(m_LifeSpan > -1) m_LifeSpan--; int TeamMask = -1; bool isWeaponCollide = false; if ( pOwnerChar && pTargetChr && pOwnerChar->IsAlive() && pTargetChr->IsAlive() && !pTargetChr->CanCollide(m_Owner) ) { isWeaponCollide = true; //TeamMask = OwnerChar->Teams()->TeamMask( OwnerChar->Team()); } if (pOwnerChar && pOwnerChar->IsAlive()) { TeamMask = pOwnerChar->Teams()->TeamMask(pOwnerChar->Team(), -1, m_Owner); } if( ((pTargetChr && (pOwnerChar ? !(pOwnerChar->m_Hit&CCharacter::DISABLE_HIT_GRENADE) : g_Config.m_SvHit || m_Owner == -1 || pTargetChr == pOwnerChar)) || Collide || GameLayerClipped(CurPos)) && !isWeaponCollide) { if(m_Explosive/*??*/ && (!pTargetChr || (pTargetChr && !m_Freeze))) { GameServer()->CreateExplosion(ColPos, m_Owner, m_Weapon, m_Owner == -1, (!pTargetChr ? -1 : pTargetChr->Team()), (m_Owner != -1)? TeamMask : -1); GameServer()->CreateSound(ColPos, m_SoundImpact, (m_Owner != -1)? TeamMask : -1); } else if(pTargetChr && m_Freeze && ((m_Layer == LAYER_SWITCH && GameServer()->Collision()->m_pSwitchers[m_Number].m_Status[pTargetChr->Team()]) || m_Layer != LAYER_SWITCH)) pTargetChr->Freeze(); if(Collide && m_Bouncing != 0) { m_StartTick = Server()->Tick(); m_Pos = NewPos+(-(m_Direction*4)); if (m_Bouncing == 1) m_Direction.x = -m_Direction.x; else if(m_Bouncing == 2) m_Direction.y =- m_Direction.y; if (fabs(m_Direction.x) < 1e-6) m_Direction.x = 0; if (fabs(m_Direction.y) < 1e-6) m_Direction.y = 0; m_Pos += m_Direction; } else if (m_Weapon == WEAPON_GUN) { GameServer()->CreateDamageInd(CurPos, -atan2(m_Direction.x, m_Direction.y), 10, (m_Owner != -1)? TeamMask : -1); GameServer()->m_World.DestroyEntity(this); } else if (!m_Freeze) GameServer()->m_World.DestroyEntity(this); } if(m_LifeSpan == -1) { GameServer()->m_World.DestroyEntity(this); } }