Skip to content

Commit d61257c

Browse files
committed
Custom game texture per character
1 parent 1095c40 commit d61257c

9 files changed

Lines changed: 54 additions & 20 deletions

File tree

datasrc/network.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,10 @@
301301
NetIntAny("m_Vol"),
302302
NetIntAny("m_Offset"),
303303
]),
304+
305+
NetObjectEx("CharacterGameTexture", "character-game-texture@netobj.teeworlds.wiki", [
306+
NetRawDataFixedSnapshot("m_Uuid", "sizeof(Uuid)"),
307+
]),
304308
]
305309

306310
Messages = [
@@ -521,11 +525,13 @@
521525
NetEnum("m_Type", Resources),
522526
NetStringStrict("m_Name"),
523527
NetIntAny("m_Crc"),
528+
NetIntRange("m_ChunkPerRequest", 0, 'max_int'),
524529
NetIntRange("m_Size", 0, 'max_int'),
525530
NetRawDataFixed("m_Sha256", "sizeof(SHA256_DIGEST)"),
526531
]),
527532
NetMessageEx("Sv_CustomResourceData", "custom-resource-data@netmsg.teeworlds.wiki", [
528533
NetRawDataFixed("m_Uuid", "sizeof(Uuid)"),
534+
NetIntRange("m_ChunkIndex", 0, 'max_int'),
529535
NetRawData("m_Data"),
530536
]),
531537
NetMessageEx("Cl_ReqeustCustomResource", "request-custom-resource@netmsg.teeworlds.wiki", [

src/game/client/components/players.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ void CPlayers::RenderHook(
4545
// draw hook
4646
if(Prev.m_HookState > 0 && Player.m_HookState > 0)
4747
{
48-
Graphics()->TextureSet(g_pData->m_aImages[IMAGE_GAME].m_Id);
48+
Graphics()->TextureSet(m_pClient->m_Snap.m_aCharacters[ClientID].m_GameTexture);
4949
Graphics()->QuadsBegin();
5050

5151
vec2 HookPos;
@@ -195,7 +195,7 @@ void CPlayers::RenderPlayer(
195195
// draw gun
196196
if(Player.m_Weapon >= 0)
197197
{
198-
Graphics()->TextureSet(g_pData->m_aImages[IMAGE_GAME].m_Id);
198+
Graphics()->TextureSet(m_pClient->m_Snap.m_aCharacters[ClientID].m_GameTexture);
199199
Graphics()->QuadsBegin();
200200
Graphics()->QuadsSetRotation(State.GetAttach()->m_Angle * pi * 2 + Angle);
201201

src/game/client/components/resource.cpp

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ void CClientResManager::OnMessage(int MsgType, void *pRawMsg)
142142
Resource.m_Sample = ISound::CSampleHandle();
143143
Resource.m_Texture = IGraphics::CTextureHandle();
144144
Resource.m_Type = pMsg->m_Type;
145+
Resource.m_ChunkPerRequest = pMsg->m_ChunkPerRequest;
145146
mem_copy(&Resource.m_Sha256, pMsg->m_Sha256, sizeof(SHA256_DIGEST));
146147
FormatResourcePath(Resource.m_aPath, sizeof(Resource.m_aPath), Resource.m_aName, false, &Resource.m_Sha256, &Resource.m_Crc);
147148
FormatResourcePath(Resource.m_aTempPath, sizeof(Resource.m_aTempPath), Resource.m_aName, true, &Resource.m_Sha256, &Resource.m_Crc);
@@ -191,11 +192,34 @@ void CClientResManager::OnMessage(int MsgType, void *pRawMsg)
191192
return; // invalid!
192193
}
193194
}
194-
else
195+
else if((pMsg->m_ChunkIndex + 1) % Resource.m_ChunkPerRequest == 0)
195196
RequestDownload(&TargetResource);
196197
}
197198
}
198199

200+
void CClientResManager::OnStateChange(int NewState, int OldState)
201+
{
202+
if(NewState == IClient::STATE_OFFLINE)
203+
{
204+
if(OldState >= IClient::STATE_CONNECTING && NewState <= IClient::STATE_ONLINE)
205+
{
206+
for(int i = 0; i < m_lResources.size(); i++)
207+
{
208+
if(m_lResources[i].m_Sample.IsValid())
209+
m_pClient->m_pSounds->UnloadSample(&m_lResources[i].m_Sample);
210+
if(m_lResources[i].m_Texture.IsValid())
211+
Graphics()->UnloadTexture(&m_lResources[i].m_Texture);
212+
if(m_lResources[i].m_DownloadTemp)
213+
{
214+
io_close(m_lResources[i].m_DownloadTemp);
215+
Storage()->RemoveFile(m_lResources[i].m_aTempPath, IStorage::TYPE_SAVE);
216+
}
217+
}
218+
m_lResources.clear();
219+
}
220+
}
221+
}
222+
199223
bool CClientResManager::IsResourceSound(Uuid ResID)
200224
{
201225
CClientResource Res;

src/game/client/components/resource.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ class CClientResManager : public CComponent
1515
char m_aPath[IO_MAX_PATH_LENGTH];
1616
char m_aTempPath[IO_MAX_PATH_LENGTH];
1717
int m_DownloadedSize;
18+
int m_ChunkPerRequest;
1819
ISound::CSampleHandle m_Sample;
1920
IGraphics::CTextureHandle m_Texture;
2021
IOHANDLE m_DownloadTemp;
@@ -30,6 +31,7 @@ class CClientResManager : public CComponent
3031
virtual void OnMapLoad();
3132
virtual void OnRender();
3233
virtual void OnMessage(int MsgType, void *pRawMsg);
34+
virtual void OnStateChange(int NewState, int OldState);
3335

3436
bool IsResourceSound(Uuid ResID);
3537
bool IsResourceImage(Uuid ResID);

src/game/client/gameclient.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1337,6 +1337,17 @@ void CGameClient::OnNewSnapshot()
13371337
}
13381338
}
13391339
}
1340+
else if(Item.m_Type == NETOBJTYPE_CHARACTERGAMETEXTURE)
1341+
{
1342+
if(Item.m_ID < MAX_CLIENTS)
1343+
{
1344+
CSnapState::CCharacterInfo *pCharInfo = &m_Snap.m_aCharacters[Item.m_ID];
1345+
Uuid GameTextureID;
1346+
mem_copy(&GameTextureID, ((const CNetObj_CharacterGameTexture *) pData)->m_Uuid, sizeof(Uuid));
1347+
pCharInfo->m_UseCustomGameTexture = true;
1348+
pCharInfo->m_GameTexture = m_pResourceManager->GetResourceTexture(GameTextureID);
1349+
}
1350+
}
13401351
else if(Item.m_Type == NETOBJTYPE_SPECTATORINFO)
13411352
{
13421353
m_Snap.m_pSpectatorInfo = (const CNetObj_SpectatorInfo *) pData;
@@ -1472,6 +1483,8 @@ void CGameClient::OnNewSnapshot()
14721483
EvolveCharacter(&m_Snap.m_aCharacters[i].m_Prev, EvolvePrevTick);
14731484
if(m_Snap.m_aCharacters[i].m_Cur.m_Tick)
14741485
EvolveCharacter(&m_Snap.m_aCharacters[i].m_Cur, EvolveCurTick);
1486+
if(!m_Snap.m_aCharacters[i].m_UseCustomGameTexture || !m_Snap.m_aCharacters[i].m_GameTexture.IsValid())
1487+
m_Snap.m_aCharacters[i].m_GameTexture = g_pData->m_aImages[IMAGE_GAME].m_Id;
14751488

14761489
m_aClients[i].m_Evolved = m_Snap.m_aCharacters[i].m_Cur;
14771490
if(i != m_LocalClientID || !Config()->m_ClPredict || Client()->State() == IClient::STATE_DEMOPLAYBACK || !GameDataPredictInput() || !GameDataPredictEvent())

src/game/client/gameclient.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,8 @@ class CGameClient : public IGameClient
192192

193193
// interpolated position
194194
vec2 m_Position;
195+
bool m_UseCustomGameTexture;
196+
IGraphics::CTextureHandle m_GameTexture;
195197
};
196198

197199
CCharacterInfo m_aCharacters[MAX_CLIENTS];

src/game/server/gamemodes/infection/reinfected.cpp

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -216,8 +216,6 @@ CGameControllerReinfected::CGameControllerReinfected(CGameContext *pGameServer)
216216
{
217217
m_pGameType = "Reinfected";
218218
m_pHelper = new CReinfectedHelper(this);
219-
220-
GameServer()->ResourceManager()->AddResource("mapres/sun.png", "sun", calculate_uuid("sun"));
221219
}
222220

223221
CGameControllerReinfected::~CGameControllerReinfected()
@@ -419,21 +417,6 @@ void CGameControllerReinfected::Tick()
419417
void CGameControllerReinfected::Snap(int SnappingClient)
420418
{
421419
IGameController::Snap(SnappingClient);
422-
423-
CCharacter *pChr = GameServer()->GetPlayerChar(SnappingClient);
424-
if(!pChr)
425-
return;
426-
427-
CNetObj_CustomImageEntity *pEntity = static_cast<CNetObj_CustomImageEntity *>(Server()->SnapNewItem(NETOBJTYPE_CUSTOMIMAGEENTITY, 0, sizeof(CNetObj_CustomImageEntity)));
428-
if(!pEntity)
429-
return;
430-
Uuid UuidSun = calculate_uuid("sun");
431-
mem_copy(pEntity->m_Uuid, &UuidSun, sizeof(pEntity->m_Uuid));
432-
pEntity->m_X = round_to_int(pChr->GetPos().x);
433-
pEntity->m_Y = round_to_int(pChr->GetPos().y) - 64;
434-
pEntity->m_Width = 64;
435-
pEntity->m_Height = 64;
436-
pEntity->m_Angle = round_to_int(fmod(Server()->Tick() / 50.0f, pi * 2) * 256.0f);
437420
}
438421

439422
bool CGameControllerReinfected::DoWincheckMatch()

src/game/server/resource.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ CServerResManager::~CServerResManager()
2323
void CServerResManager::Init(CGameContext *pGameContext)
2424
{
2525
m_pGameContext = pGameContext;
26+
m_ChunksPerRequest = Config()->m_SvResDownloadSpeed;
2627
}
2728

2829
void CServerResManager::SendResourceData(int ClientID, const Uuid RequestUuid)
@@ -53,6 +54,7 @@ void CServerResManager::SendResourceData(int ClientID, const Uuid RequestUuid)
5354

5455
CNetMsg_Sv_CustomResourceData Msg;
5556
Msg.m_Uuid = &pTarget->m_Uuid;
57+
Msg.m_ChunkIndex = Chunk;
5658
Msg.m_Data = &pTarget->m_pData[Offset];
5759
Msg.m_DataSize = ChunkSize;
5860
Server()->SendPackMsg(&Msg, MSGFLAG_VITAL | MSGFLAG_FLUSH | MSGFLAG_NORECORD, ClientID);
@@ -112,6 +114,7 @@ void CServerResManager::OnClientEnter(int ClientID)
112114
Resource.m_Crc = m_lResources[i].m_Crc;
113115
Resource.m_Sha256 = &m_lResources[i].m_Sha256;
114116
Resource.m_Size = m_lResources[i].m_DataSize;
117+
Resource.m_ChunkPerRequest = m_ChunksPerRequest;
115118
Server()->SendPackMsg(&Resource, MSGFLAG_VITAL | MSGFLAG_FLUSH | MSGFLAG_NORECORD, ClientID);
116119

117120
m_lResources[i].m_aDownloadChunks[ClientID] = 0;

src/game/server/resource.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ class CServerResManager
1919
};
2020

2121
sorted_array<CServerResource> m_lResources;
22+
int m_ChunksPerRequest;
2223
public:
2324
CServerResManager();
2425
~CServerResManager();

0 commit comments

Comments
 (0)