the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
1#include "stdafx.h"
2
3#include "net.minecraft.world.entity.ai.attributes.h"
4#include "PacketListener.h"
5#include "UpdateAttributesPacket.h"
6
7UpdateAttributesPacket::UpdateAttributesPacket()
8{
9 entityId = 0;
10}
11
12UpdateAttributesPacket::UpdateAttributesPacket(int entityId, unordered_set<AttributeInstance *> *values)
13{
14 this->entityId = entityId;
15
16 for (AUTO_VAR(it,values->begin()); it != values->end(); ++it)
17 {
18 AttributeInstance *value = *it;
19 unordered_set<AttributeModifier*> mods;
20 value->getModifiers(mods);
21 attributes.insert(new AttributeSnapshot(value->getAttribute()->getId(), value->getBaseValue(), &mods));
22 }
23}
24
25UpdateAttributesPacket::~UpdateAttributesPacket()
26{
27 // Delete modifiers - these are always copies, either on construction or on read
28 for(AUTO_VAR(it,attributes.begin()); it != attributes.end(); ++it)
29 {
30 delete (*it);
31 }
32}
33
34void UpdateAttributesPacket::read(DataInputStream *dis)
35{
36 entityId = dis->readInt();
37
38 int attributeCount = dis->readInt();
39 for (int i = 0; i < attributeCount; i++)
40 {
41 eATTRIBUTE_ID id = static_cast<eATTRIBUTE_ID>(dis->readShort());
42 double base = dis->readDouble();
43 unordered_set<AttributeModifier *> modifiers = unordered_set<AttributeModifier *>();
44 int modifierCount = dis->readShort();
45
46 for (int j = 0; j < modifierCount; j++)
47 {
48 eMODIFIER_ID id = static_cast<eMODIFIER_ID>(dis->readInt());
49 double amount = dis->readDouble();
50 byte operation = dis->readByte();
51 modifiers.insert(new AttributeModifier(id, /*L"Unknown synced attribute modifier",*/ amount, operation));
52 }
53
54 attributes.insert(new AttributeSnapshot(id, base, &modifiers));
55
56 // modifiers is copied in AttributeSnapshot ctor so delete contents
57 for(AUTO_VAR(it, modifiers.begin()); it != modifiers.end(); ++it)
58 {
59 delete *it;
60 }
61 }
62}
63
64void UpdateAttributesPacket::write(DataOutputStream *dos)
65{
66 dos->writeInt(entityId);
67 dos->writeInt(attributes.size());
68
69 for(AUTO_VAR(it, attributes.begin()); it != attributes.end(); ++it)
70 {
71 AttributeSnapshot *attribute = (*it);
72
73 unordered_set<AttributeModifier *> *modifiers = attribute->getModifiers();
74
75 dos->writeShort(attribute->getId());
76 dos->writeDouble(attribute->getBase());
77 dos->writeShort(modifiers->size());
78
79 for (AUTO_VAR(it2, modifiers->begin()); it2 != modifiers->end(); ++it2)
80 {
81 AttributeModifier *modifier = (*it2);
82 dos->writeInt(modifier->getId());
83 dos->writeDouble(modifier->getAmount());
84 dos->writeByte(modifier->getOperation());
85 }
86 }
87}
88
89void UpdateAttributesPacket::handle(PacketListener *listener)
90{
91 listener->handleUpdateAttributes(shared_from_this());
92}
93
94int UpdateAttributesPacket::getEstimatedSize()
95{
96 return 4 + 4 + attributes.size() * (8 + 8 + 8);
97}
98
99int UpdateAttributesPacket::getEntityId()
100{
101 return entityId;
102}
103
104unordered_set<UpdateAttributesPacket::AttributeSnapshot *> UpdateAttributesPacket::getValues()
105{
106 return attributes;
107}
108
109UpdateAttributesPacket::AttributeSnapshot::AttributeSnapshot(eATTRIBUTE_ID id, double base, unordered_set<AttributeModifier *> *modifiers)
110{
111 this->id = id;
112 this->base = base;
113
114 for(AUTO_VAR(it,modifiers->begin()); it != modifiers->end(); ++it)
115 {
116 this->modifiers.insert( new AttributeModifier((*it)->getId(), (*it)->getAmount(), (*it)->getOperation()));
117 }
118}
119
120UpdateAttributesPacket::AttributeSnapshot::~AttributeSnapshot()
121{
122 for(AUTO_VAR(it, modifiers.begin()); it != modifiers.end(); ++it)
123 {
124 delete (*it);
125 }
126}
127
128eATTRIBUTE_ID UpdateAttributesPacket::AttributeSnapshot::getId()
129{
130 return id;
131}
132
133double UpdateAttributesPacket::AttributeSnapshot::getBase()
134{
135 return base;
136}
137
138unordered_set<AttributeModifier *> *UpdateAttributesPacket::AttributeSnapshot::getModifiers()
139{
140 return &modifiers;
141}