mirror of
https://github.com/ddnet/ddnet.git
synced 2024-09-20 09:34:19 +00:00
Merge branch 'master' of http://github.com/btd/DDRace
Conflicts: src/game/server/entities/dragger.cpp src/game/server/entities/dragger.h
This commit is contained in:
commit
7f6db8212e
|
@ -1223,7 +1223,7 @@ void CCharacter::Die(int Killer, int Weapon)
|
||||||
m_pPlayer->GetCID(), Server()->ClientName(m_pPlayer->GetCID()), Weapon, ModeSpecial);
|
m_pPlayer->GetCID(), Server()->ClientName(m_pPlayer->GetCID()), Weapon, ModeSpecial);
|
||||||
GameServer()->Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", aBuf);
|
GameServer()->Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", aBuf);
|
||||||
|
|
||||||
Controller->m_Teams.m_Core.Team(m_pPlayer->GetCID(), 0);
|
Controller->m_Teams.SetForceCharacterTeam(m_pPlayer->GetCID(), 0);
|
||||||
|
|
||||||
// send the kill message
|
// send the kill message
|
||||||
CNetMsg_Sv_KillMsg Msg;
|
CNetMsg_Sv_KillMsg Msg;
|
||||||
|
|
|
@ -11,14 +11,14 @@
|
||||||
|
|
||||||
const int LENGTH=700;
|
const int LENGTH=700;
|
||||||
|
|
||||||
CDragger::CDragger(CGameWorld *pGameWorld, vec2 Pos, float Strength, bool NW)
|
CDragger::CDragger(CGameWorld *pGameWorld, vec2 Pos, float Strength, bool NW, int CatchedTeam)
|
||||||
: CEntity(pGameWorld, NETOBJTYPE_LASER)
|
: CEntity(pGameWorld, NETOBJTYPE_LASER)
|
||||||
{
|
{
|
||||||
m_Pos = Pos;
|
m_Pos = Pos;
|
||||||
m_Strength = Strength;
|
m_Strength = Strength;
|
||||||
m_EvalTick = Server()->Tick();
|
m_EvalTick = Server()->Tick();
|
||||||
m_NW = NW;
|
m_NW = NW;
|
||||||
|
m_CatchedTeam = CatchedTeam;
|
||||||
GameWorld()->InsertEntity(this);
|
GameWorld()->InsertEntity(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,22 +27,19 @@ void CDragger::Move()
|
||||||
if (m_Target)
|
if (m_Target)
|
||||||
return;
|
return;
|
||||||
CCharacter *Ents[16];
|
CCharacter *Ents[16];
|
||||||
int Num = -1;
|
int Num = GameServer()->m_World.FindEntities(m_Pos,LENGTH, (CEntity**)Ents, 16, NETOBJTYPE_CHARACTER);
|
||||||
Num = GameServer()->m_World.FindEntities(m_Pos,LENGTH, (CEntity**)Ents, 16, NETOBJTYPE_CHARACTER);
|
|
||||||
int Id=-1;
|
int Id=-1;
|
||||||
int MinLen=0;
|
int MinLen=0;
|
||||||
for (int i = 0; i < Num; i++)
|
for (int i = 0; i < Num; i++)
|
||||||
{
|
{
|
||||||
m_Target = Ents[i];
|
m_Target = Ents[i];
|
||||||
int Res=0;
|
if(m_Target->Team() != m_CatchedTeam) continue;
|
||||||
if (!m_NW)
|
int Res = m_NW ? GameServer()->Collision()->IntersectNoLaserNW(m_Pos, m_Target->m_Pos, 0, 0) :
|
||||||
Res = GameServer()->Collision()->IntersectNoLaser(m_Pos, m_Target->m_Pos, 0, 0);
|
GameServer()->Collision()->IntersectNoLaser(m_Pos, m_Target->m_Pos, 0, 0);
|
||||||
else
|
|
||||||
Res = GameServer()->Collision()->IntersectNoLaserNW(m_Pos, m_Target->m_Pos, 0, 0);
|
|
||||||
|
|
||||||
if (Res==0)
|
if (Res==0)
|
||||||
{
|
{
|
||||||
int Len=length(Ents[i]->m_Pos - m_Pos);
|
int Len=length(m_Target->m_Pos - m_Pos);
|
||||||
if (MinLen==0 || MinLen>Len)
|
if (MinLen==0 || MinLen>Len)
|
||||||
{
|
{
|
||||||
MinLen=Len;
|
MinLen=Len;
|
||||||
|
@ -50,14 +47,7 @@ void CDragger::Move()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (Id!=-1)
|
m_Target = Id != -1 ? Ents[Id] : 0;
|
||||||
{
|
|
||||||
m_Target = Ents[Id];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_Target=0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDragger::Drag()
|
void CDragger::Drag()
|
||||||
|
@ -127,7 +117,9 @@ void CDragger::Snap(int SnappingClient)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
CCharacter * Char = GameServer()->GetPlayerChar(SnappingClient);
|
CCharacter * Char = GameServer()->GetPlayerChar(SnappingClient);
|
||||||
if(Char && m_Target && !Char->GetPlayer()->m_ShowOthers && Char->Team() != m_Target->Team()) return;
|
if(Char && m_Target
|
||||||
|
&& !Char->GetPlayer()->m_ShowOthers
|
||||||
|
&& Char->Team() != m_Target->Team()) return;
|
||||||
|
|
||||||
CNetObj_Laser *obj = static_cast<CNetObj_Laser *>(Server()->SnapNewItem(NETOBJTYPE_LASER, m_Id, sizeof(CNetObj_Laser)));
|
CNetObj_Laser *obj = static_cast<CNetObj_Laser *>(Server()->SnapNewItem(NETOBJTYPE_LASER, m_Id, sizeof(CNetObj_Laser)));
|
||||||
|
|
||||||
|
@ -152,5 +144,15 @@ void CDragger::Snap(int SnappingClient)
|
||||||
StartTick = Server()->Tick();
|
StartTick = Server()->Tick();
|
||||||
obj->m_StartTick = StartTick;
|
obj->m_StartTick = StartTick;
|
||||||
}
|
}
|
||||||
//ÿ òóò áûë
|
|
||||||
//ÿ òîæå
|
CDraggerTeam::CDraggerTeam(CGameWorld *pGameWorld, vec2 Pos, float Strength, bool NW) {
|
||||||
|
for(int i = 0; i < MAX_CLIENTS; ++i) {
|
||||||
|
m_Draggers[i] = new CDragger(pGameWorld, Pos, Strength, NW, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//CDraggerTeam::~CDraggerTeam() {
|
||||||
|
//for(int i = 0; i < MAX_CLIENTS; ++i) {
|
||||||
|
// delete m_Draggers[i];
|
||||||
|
//}
|
||||||
|
//}
|
||||||
|
|
|
@ -4,7 +4,6 @@
|
||||||
#define GAME_SERVER_ENTITY_DRAGGER_H
|
#define GAME_SERVER_ENTITY_DRAGGER_H
|
||||||
|
|
||||||
#include <game/server/entity.h>
|
#include <game/server/entity.h>
|
||||||
|
|
||||||
class CCharacter;
|
class CCharacter;
|
||||||
|
|
||||||
class CDragger : public CEntity
|
class CDragger : public CEntity
|
||||||
|
@ -16,14 +15,24 @@ class CDragger : public CEntity
|
||||||
void Drag();
|
void Drag();
|
||||||
CCharacter * m_Target;
|
CCharacter * m_Target;
|
||||||
bool m_NW;
|
bool m_NW;
|
||||||
|
int m_CatchedTeam;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
|
||||||
CDragger(CGameWorld *pGameWorld, vec2 Pos, float Strength, bool NW=false);
|
CDragger(CGameWorld *pGameWorld, vec2 Pos, float Strength, bool NW, int CatchedTeam);
|
||||||
|
|
||||||
virtual void Reset();
|
virtual void Reset();
|
||||||
virtual void Tick();
|
virtual void Tick();
|
||||||
virtual void Snap(int snapping_client);
|
virtual void Snap(int snapping_client);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class CDraggerTeam {
|
||||||
|
CDragger * m_Draggers[MAX_CLIENTS];
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
CDraggerTeam(CGameWorld *pGameWorld, vec2 Pos, float Strength, bool NW=false);
|
||||||
|
//~CDraggerTeam();
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -95,20 +95,23 @@ void CProjectile::Tick()
|
||||||
if(m_LifeSpan > -1)
|
if(m_LifeSpan > -1)
|
||||||
m_LifeSpan--;
|
m_LifeSpan--;
|
||||||
|
|
||||||
|
int TeamMask = -1;
|
||||||
bool isWeaponCollide = false;
|
bool isWeaponCollide = false;
|
||||||
if(OwnerChar && TargetChr
|
if(OwnerChar && TargetChr
|
||||||
&& OwnerChar->m_Alive && TargetChr->m_Alive
|
&& OwnerChar->m_Alive && TargetChr->m_Alive
|
||||||
&& !TargetChr->CanCollide(m_Owner)) isWeaponCollide = true;
|
&& !TargetChr->CanCollide(m_Owner)) {
|
||||||
|
isWeaponCollide = true;
|
||||||
|
TeamMask = OwnerChar->Teams()->TeamMask( OwnerChar->Team());
|
||||||
|
}
|
||||||
if( ((TargetChr && (g_Config.m_SvHit || m_Owner == -1 || TargetChr == OwnerChar)) || Collide) && !isWeaponCollide)//TODO:TEAM
|
if( ((TargetChr && (g_Config.m_SvHit || m_Owner == -1 || TargetChr == OwnerChar)) || Collide) && !isWeaponCollide)//TODO:TEAM
|
||||||
{
|
{
|
||||||
|
|
||||||
if(m_Explosive/*??*/ && (!TargetChr || (TargetChr && !m_Freeze)))
|
if(m_Explosive/*??*/ && (!TargetChr || (TargetChr && !m_Freeze)))
|
||||||
{
|
{
|
||||||
GameServer()->CreateExplosion(ColPos, m_Owner, m_Weapon, (m_Owner == -1)?true:false,
|
GameServer()->CreateExplosion(ColPos, m_Owner, m_Weapon, m_Owner == -1,
|
||||||
(m_Owner != -1)? OwnerChar->Teams()->TeamMask(OwnerChar->Team()) : -1);
|
(m_Owner != -1)? TeamMask : -1);
|
||||||
GameServer()->CreateSound(ColPos, m_SoundImpact,
|
GameServer()->CreateSound(ColPos, m_SoundImpact,
|
||||||
(m_Owner != -1)? OwnerChar->Teams()->TeamMask(OwnerChar->Team()) : -1);
|
(m_Owner != -1)? TeamMask : -1);
|
||||||
}
|
}
|
||||||
else if(TargetChr && m_Freeze)
|
else if(TargetChr && m_Freeze)
|
||||||
TargetChr->Freeze(Server()->TickSpeed()*3);
|
TargetChr->Freeze(Server()->TickSpeed()*3);
|
||||||
|
@ -125,7 +128,7 @@ void CProjectile::Tick()
|
||||||
else if (m_Weapon == WEAPON_GUN)
|
else if (m_Weapon == WEAPON_GUN)
|
||||||
{
|
{
|
||||||
GameServer()->CreateDamageInd(CurPos, -atan2(m_Direction.x, m_Direction.y), 10,
|
GameServer()->CreateDamageInd(CurPos, -atan2(m_Direction.x, m_Direction.y), 10,
|
||||||
(m_Owner != -1)? OwnerChar->Teams()->TeamMask(OwnerChar->Team()) : -1);
|
(m_Owner != -1)? TeamMask : -1);
|
||||||
GameServer()->m_World.DestroyEntity(this);
|
GameServer()->m_World.DestroyEntity(this);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -156,7 +159,7 @@ void CProjectile::Snap(int SnappingClient)
|
||||||
return;
|
return;
|
||||||
CCharacter * Char = GameServer()->GetPlayerChar(SnappingClient);
|
CCharacter * Char = GameServer()->GetPlayerChar(SnappingClient);
|
||||||
if(Char && m_Owner != -1 && !Char->GetPlayer()->m_ShowOthers &&
|
if(Char && m_Owner != -1 && !Char->GetPlayer()->m_ShowOthers &&
|
||||||
Char->Team() != GameServer()->GetPlayerChar(m_Owner)->Team()) return;
|
Char->CanCollide(m_Owner)) return;
|
||||||
CNetObj_Projectile *pProj = static_cast<CNetObj_Projectile *>(Server()->SnapNewItem(NETOBJTYPE_PROJECTILE, m_Id, sizeof(CNetObj_Projectile)));
|
CNetObj_Projectile *pProj = static_cast<CNetObj_Projectile *>(Server()->SnapNewItem(NETOBJTYPE_PROJECTILE, m_Id, sizeof(CNetObj_Projectile)));
|
||||||
FillInfo(pProj);
|
FillInfo(pProj);
|
||||||
}
|
}
|
||||||
|
|
|
@ -289,11 +289,11 @@ bool IGameController::OnEntity(int Index, vec2 Pos, bool Front)
|
||||||
}
|
}
|
||||||
else if(Index>=ENTITY_DRAGGER_WEAK && Index <=ENTITY_DRAGGER_STRONG)
|
else if(Index>=ENTITY_DRAGGER_WEAK && Index <=ENTITY_DRAGGER_STRONG)
|
||||||
{
|
{
|
||||||
new CDragger(&GameServer()->m_World,Pos,Index-ENTITY_DRAGGER_WEAK+1);
|
new CDraggerTeam(&GameServer()->m_World,Pos,Index-ENTITY_DRAGGER_WEAK+1, false);
|
||||||
}
|
}
|
||||||
else if(Index>=ENTITY_DRAGGER_WEAK_NW && Index <=ENTITY_DRAGGER_STRONG_NW)
|
else if(Index>=ENTITY_DRAGGER_WEAK_NW && Index <=ENTITY_DRAGGER_STRONG_NW)
|
||||||
{
|
{
|
||||||
new CDragger(&GameServer()->m_World, Pos,Index-ENTITY_DRAGGER_WEAK_NW+1,true);
|
new CDraggerTeam(&GameServer()->m_World, Pos,Index-ENTITY_DRAGGER_WEAK_NW+1,true);
|
||||||
}
|
}
|
||||||
else if(Index==ENTITY_PLASMAE)
|
else if(Index==ENTITY_PLASMAE)
|
||||||
{
|
{
|
||||||
|
|
|
@ -81,6 +81,23 @@ bool CGameTeams::SetCharacterTeam(int id, int Team) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
SetForceCharacterTeam(id, Team);
|
||||||
|
char aBuf[512];
|
||||||
|
str_format(aBuf, sizeof(aBuf), "Id = %d Team = %d", id, Team);
|
||||||
|
dbg_msg("Teams", aBuf);
|
||||||
|
//GameServer()->CreatePlayerSpawn(Character(id)->m_Core.m_Pos, TeamMask());
|
||||||
|
if(Character(id)->GetPlayer()->m_IsUsingRaceClient)
|
||||||
|
{
|
||||||
|
CNetMsg_Sv_PlayerTeam Msg;
|
||||||
|
Msg.m_Team = Team;
|
||||||
|
Msg.m_Cid = id;
|
||||||
|
Server()->SendPackMsg(&Msg, MSGFLAG_VITAL, -1);
|
||||||
|
//dbg_msg("Teams", "Sended all");
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGameTeams::SetForceCharacterTeam(int id, int Team) {
|
||||||
if(m_Core.Team(id) != TEAM_FLOCK && m_Core.Team(id) != TEAM_SUPER && m_TeamState[m_Core.Team(id)] != EMPTY) {
|
if(m_Core.Team(id) != TEAM_FLOCK && m_Core.Team(id) != TEAM_SUPER && m_TeamState[m_Core.Team(id)] != EMPTY) {
|
||||||
bool NoOneInOldTeam = true;
|
bool NoOneInOldTeam = true;
|
||||||
for(int i = 0; i < MAX_CLIENTS; ++i) {
|
for(int i = 0; i < MAX_CLIENTS; ++i) {
|
||||||
|
@ -97,19 +114,6 @@ bool CGameTeams::SetCharacterTeam(int id, int Team) {
|
||||||
if(Team != TEAM_SUPER && m_TeamState[Team] == EMPTY) {
|
if(Team != TEAM_SUPER && m_TeamState[Team] == EMPTY) {
|
||||||
ChangeTeamState(Team, OPEN);
|
ChangeTeamState(Team, OPEN);
|
||||||
}
|
}
|
||||||
char aBuf[512];
|
|
||||||
str_format(aBuf, sizeof(aBuf), "Id = %d Team = %d", id, Team);
|
|
||||||
dbg_msg("Teams", aBuf);
|
|
||||||
//GameServer()->CreatePlayerSpawn(Character(id)->m_Core.m_Pos, TeamMask());
|
|
||||||
if(Character(id)->GetPlayer()->m_IsUsingRaceClient)
|
|
||||||
{
|
|
||||||
CNetMsg_Sv_PlayerTeam Msg;
|
|
||||||
Msg.m_Team = Team;
|
|
||||||
Msg.m_Cid = id;
|
|
||||||
Server()->SendPackMsg(&Msg, MSGFLAG_VITAL, -1);
|
|
||||||
//dbg_msg("Teams", "Sended all");
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGameTeams::ChangeTeamState(int Team, int State) {
|
void CGameTeams::ChangeTeamState(int Team, int State) {
|
||||||
|
|
|
@ -41,6 +41,9 @@ public:
|
||||||
int TeamMask(int Team);
|
int TeamMask(int Team);
|
||||||
|
|
||||||
void SendAllInfo(int Cid);
|
void SendAllInfo(int Cid);
|
||||||
|
|
||||||
|
//need to be very carefull using this method
|
||||||
|
void SetForceCharacterTeam(int id, int Team);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue