mirror of
https://github.com/ddnet/ddnet.git
synced 2024-11-10 10:08:18 +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);
|
||||
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
|
||||
CNetMsg_Sv_KillMsg Msg;
|
||||
|
|
|
@ -11,14 +11,14 @@
|
|||
|
||||
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)
|
||||
{
|
||||
m_Pos = Pos;
|
||||
m_Strength = Strength;
|
||||
m_EvalTick = Server()->Tick();
|
||||
m_NW = NW;
|
||||
|
||||
m_CatchedTeam = CatchedTeam;
|
||||
GameWorld()->InsertEntity(this);
|
||||
}
|
||||
|
||||
|
@ -27,22 +27,19 @@ void CDragger::Move()
|
|||
if (m_Target)
|
||||
return;
|
||||
CCharacter *Ents[16];
|
||||
int Num = -1;
|
||||
Num = GameServer()->m_World.FindEntities(m_Pos,LENGTH, (CEntity**)Ents, 16, NETOBJTYPE_CHARACTER);
|
||||
int Num = GameServer()->m_World.FindEntities(m_Pos,LENGTH, (CEntity**)Ents, 16, NETOBJTYPE_CHARACTER);
|
||||
int Id=-1;
|
||||
int MinLen=0;
|
||||
for (int i = 0; i < Num; i++)
|
||||
{
|
||||
m_Target = Ents[i];
|
||||
int Res=0;
|
||||
if (!m_NW)
|
||||
Res = 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(m_Target->Team() != m_CatchedTeam) continue;
|
||||
int Res = m_NW ? GameServer()->Collision()->IntersectNoLaserNW(m_Pos, m_Target->m_Pos, 0, 0) :
|
||||
GameServer()->Collision()->IntersectNoLaser(m_Pos, m_Target->m_Pos, 0, 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)
|
||||
{
|
||||
MinLen=Len;
|
||||
|
@ -50,14 +47,7 @@ void CDragger::Move()
|
|||
}
|
||||
}
|
||||
}
|
||||
if (Id!=-1)
|
||||
{
|
||||
m_Target = Ents[Id];
|
||||
}
|
||||
else
|
||||
{
|
||||
m_Target=0;
|
||||
}
|
||||
m_Target = Id != -1 ? Ents[Id] : 0;
|
||||
}
|
||||
|
||||
void CDragger::Drag()
|
||||
|
@ -127,7 +117,9 @@ void CDragger::Snap(int SnappingClient)
|
|||
return;
|
||||
|
||||
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)));
|
||||
|
||||
|
@ -152,5 +144,15 @@ void CDragger::Snap(int SnappingClient)
|
|||
StartTick = Server()->Tick();
|
||||
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
|
||||
|
||||
#include <game/server/entity.h>
|
||||
|
||||
class CCharacter;
|
||||
|
||||
class CDragger : public CEntity
|
||||
|
@ -16,14 +15,24 @@ class CDragger : public CEntity
|
|||
void Drag();
|
||||
CCharacter * m_Target;
|
||||
bool m_NW;
|
||||
int m_CatchedTeam;
|
||||
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 Tick();
|
||||
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
|
||||
|
|
|
@ -95,20 +95,23 @@ void CProjectile::Tick()
|
|||
if(m_LifeSpan > -1)
|
||||
m_LifeSpan--;
|
||||
|
||||
int TeamMask = -1;
|
||||
bool isWeaponCollide = false;
|
||||
if(OwnerChar && TargetChr
|
||||
&& 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(m_Explosive/*??*/ && (!TargetChr || (TargetChr && !m_Freeze)))
|
||||
{
|
||||
GameServer()->CreateExplosion(ColPos, m_Owner, m_Weapon, (m_Owner == -1)?true:false,
|
||||
(m_Owner != -1)? OwnerChar->Teams()->TeamMask(OwnerChar->Team()) : -1);
|
||||
GameServer()->CreateExplosion(ColPos, m_Owner, m_Weapon, m_Owner == -1,
|
||||
(m_Owner != -1)? TeamMask : -1);
|
||||
GameServer()->CreateSound(ColPos, m_SoundImpact,
|
||||
(m_Owner != -1)? OwnerChar->Teams()->TeamMask(OwnerChar->Team()) : -1);
|
||||
(m_Owner != -1)? TeamMask : -1);
|
||||
}
|
||||
else if(TargetChr && m_Freeze)
|
||||
TargetChr->Freeze(Server()->TickSpeed()*3);
|
||||
|
@ -125,7 +128,7 @@ void CProjectile::Tick()
|
|||
else if (m_Weapon == WEAPON_GUN)
|
||||
{
|
||||
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);
|
||||
}
|
||||
else
|
||||
|
@ -156,7 +159,7 @@ void CProjectile::Snap(int SnappingClient)
|
|||
return;
|
||||
CCharacter * Char = GameServer()->GetPlayerChar(SnappingClient);
|
||||
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)));
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
|
|
|
@ -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) {
|
||||
bool NoOneInOldTeam = true;
|
||||
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) {
|
||||
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) {
|
||||
|
|
|
@ -41,6 +41,9 @@ public:
|
|||
int TeamMask(int Team);
|
||||
|
||||
void SendAllInfo(int Cid);
|
||||
|
||||
//need to be very carefull using this method
|
||||
void SetForceCharacterTeam(int id, int Team);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue