aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/SetPlayerTeamPacket.cpp
blob: fe36bfff54564548b6922df6e3bc1590c57904ad (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include "stdafx.h"
#include "net.minecraft.world.scores.h"
#include "net.minecraft.world.entity.player.h"
#include "PacketListener.h"
#include "SetPlayerTeamPacket.h"

SetPlayerTeamPacket::SetPlayerTeamPacket()
{
	name = L"";
	displayName = L"";
	prefix = L"";
	suffix = L"";
	method = 0;
	options = 0;
}

SetPlayerTeamPacket::SetPlayerTeamPacket(PlayerTeam *team, int method)
{
	name = team->getName();
	this->method = method;

	if (method == METHOD_ADD || method == METHOD_CHANGE)
	{
		displayName = team->getDisplayName();
		prefix = team->getPrefix();
		suffix = team->getSuffix();
		options = team->packOptions();
	}
	if (method == METHOD_ADD)
	{
		unordered_set<wstring> *playerNames = team->getPlayers();
		players.insert(players.end(), playerNames->begin(), playerNames->end());
	}
}

SetPlayerTeamPacket::SetPlayerTeamPacket(PlayerTeam *team, vector<wstring> *playerNames, int method)
{
	if (method != METHOD_JOIN && method != METHOD_LEAVE)
	{
		app.DebugPrintf("Method must be join or leave for player constructor");
#ifndef _CONTENT_PACKAGE
		__debugbreak();
#endif
	}
	if (playerNames == NULL || playerNames->empty())
	{
		app.DebugPrintf("Players cannot be null/empty");
#ifndef _CONTENT_PACKAGE
		__debugbreak();
#endif
	}

	this->method = method;
	name = team->getName();
	this->players.insert(players.end(), playerNames->begin(), playerNames->end());
}

void SetPlayerTeamPacket::read(DataInputStream *dis)
{
	name = readUtf(dis, Objective::MAX_NAME_LENGTH);
	method = dis->readByte();

	if (method == METHOD_ADD || method == METHOD_CHANGE)
	{
		displayName = readUtf(dis, PlayerTeam::MAX_DISPLAY_NAME_LENGTH);
		prefix = readUtf(dis, PlayerTeam::MAX_PREFIX_LENGTH);
		suffix = readUtf(dis, PlayerTeam::MAX_SUFFIX_LENGTH);
		options = dis->readByte();
	}

	if (method == METHOD_ADD || method == METHOD_JOIN || method == METHOD_LEAVE)
	{
		int count = dis->readShort();

		for (int i = 0; i < count; i++)
		{
			players.push_back(readUtf(dis, Player::MAX_NAME_LENGTH));
		}
	}
}

void SetPlayerTeamPacket::write(DataOutputStream *dos)
{
	writeUtf(name, dos);
	dos->writeByte(method);

	if (method == METHOD_ADD || method == METHOD_CHANGE)
	{
		writeUtf(displayName, dos);
		writeUtf(prefix, dos);
		writeUtf(suffix, dos);
		dos->writeByte(options);
	}

	if (method == METHOD_ADD || method == METHOD_JOIN || method == METHOD_LEAVE)
	{
		dos->writeShort(players.size());

		for (auto& player : players)
		{
			writeUtf(player, dos);
		}
	}
}

void SetPlayerTeamPacket::handle(PacketListener *listener)
{
	listener->handleSetPlayerTeamPacket(shared_from_this());
}

int SetPlayerTeamPacket::getEstimatedSize()
{
	return 1 + 2 + name.length();
}