aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/SynchedEntityData.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Minecraft.World/SynchedEntityData.cpp')
-rw-r--r--Minecraft.World/SynchedEntityData.cpp168
1 files changed, 118 insertions, 50 deletions
diff --git a/Minecraft.World/SynchedEntityData.cpp b/Minecraft.World/SynchedEntityData.cpp
index 9f1aa1f7..e6bb9ec7 100644
--- a/Minecraft.World/SynchedEntityData.cpp
+++ b/Minecraft.World/SynchedEntityData.cpp
@@ -47,6 +47,17 @@ void SynchedEntityData::define(int id, short value)
m_isEmpty = false;
}
+void SynchedEntityData::define(int id, float value)
+{
+ MemSect(17);
+ checkId(id);
+ int type = TYPE_FLOAT;
+ shared_ptr<DataItem> dataItem = shared_ptr<DataItem>( new DataItem(type, id, value) );
+ itemsById[id] = dataItem;
+ MemSect(0);
+ m_isEmpty = false;
+}
+
void SynchedEntityData::define(int id, const wstring& value)
{
MemSect(17);
@@ -100,8 +111,7 @@ int SynchedEntityData::getInteger(int id)
float SynchedEntityData::getFloat(int id)
{
- assert(false); // 4J - not currently implemented
- return 0;
+ return itemsById[id]->getValue_float();
}
wstring SynchedEntityData::getString(int id)
@@ -160,6 +170,19 @@ void SynchedEntityData::set(int id, short value)
}
}
+void SynchedEntityData::set(int id, float value)
+{
+ shared_ptr<DataItem> dataItem = itemsById[id];
+
+ // update the value if it has changed
+ if (value != dataItem->getValue_float())
+ {
+ dataItem->setValue(value);
+ dataItem->setDirty(true);
+ m_isDirty = true;
+ }
+}
+
void SynchedEntityData::set(int id, const wstring& value)
{
shared_ptr<DataItem> dataItem = itemsById[id];
@@ -188,7 +211,7 @@ void SynchedEntityData::set(int id, shared_ptr<ItemInstance> value)
void SynchedEntityData::markDirty(int id)
{
- (*itemsById.find(id)).second->dirty = true;
+ itemsById[id]->dirty = true;
m_isDirty = true;
}
@@ -221,11 +244,10 @@ vector<shared_ptr<SynchedEntityData::DataItem> > *SynchedEntityData::packDirty()
if (m_isDirty)
{
- AUTO_VAR(itEnd, itemsById.end());
- for ( AUTO_VAR(it, itemsById.begin()); it != itEnd; it++ )
+ for( int i = 0; i <= MAX_ID_VALUE; i++ )
{
- shared_ptr<DataItem> dataItem = (*it).second;
- if (dataItem->isDirty())
+ shared_ptr<DataItem> dataItem = itemsById[i];
+ if ((dataItem != NULL) && dataItem->isDirty())
{
dataItem->setDirty(false);
@@ -244,11 +266,13 @@ vector<shared_ptr<SynchedEntityData::DataItem> > *SynchedEntityData::packDirty()
void SynchedEntityData::packAll(DataOutputStream *output) // throws IOException
{
- AUTO_VAR(itEnd, itemsById.end());
- for (AUTO_VAR(it, itemsById.begin()); it != itEnd; it++ )
+ for( int i = 0; i <= MAX_ID_VALUE; i++ )
{
- shared_ptr<DataItem> dataItem = (*it).second;
- writeDataItem(output, dataItem);
+ shared_ptr<DataItem> dataItem = itemsById[i];
+ if(dataItem != NULL)
+ {
+ writeDataItem(output, dataItem);
+ }
}
// add an eof
@@ -259,15 +283,17 @@ vector<shared_ptr<SynchedEntityData::DataItem> > *SynchedEntityData::getAll()
{
vector<shared_ptr<DataItem> > *result = NULL;
- AUTO_VAR(itEnd, itemsById.end());
- for (AUTO_VAR(it, itemsById.begin()); it != itEnd; it++ )
+ for( int i = 0; i <= MAX_ID_VALUE; i++ )
{
- if (result == NULL)
+ shared_ptr<DataItem> dataItem = itemsById[i];
+ if(dataItem != NULL)
{
- result = new vector<shared_ptr<DataItem> >();
+ if (result == NULL)
+ {
+ result = new vector<shared_ptr<DataItem> >();
+ }
+ result->push_back(dataItem);
}
- shared_ptr<DataItem> dataItem = (*it).second;
- result->push_back(dataItem);
}
return result;
@@ -292,6 +318,9 @@ void SynchedEntityData::writeDataItem(DataOutputStream *output, shared_ptr<DataI
case TYPE_SHORT:
output->writeShort( dataItem->getValue_short());
break;
+ case TYPE_FLOAT:
+ output->writeFloat( dataItem->getValue_float());
+ break;
case TYPE_STRING:
Packet::writeUtf(dataItem->getValue_wstring(), output);
break;
@@ -348,6 +377,13 @@ vector<shared_ptr<SynchedEntityData::DataItem> > *SynchedEntityData::unpack(Data
item = shared_ptr<DataItem>( new DataItem(itemType, itemId, dataRead) );
}
break;
+ case TYPE_FLOAT:
+ {
+ float dataRead = input->readFloat();
+ item = shared_ptr<DataItem>( new DataItem(itemType, itemId, dataRead) );
+
+ }
+ break;
case TYPE_STRING:
item = shared_ptr<DataItem>( new DataItem(itemType, itemId, Packet::readUtf(input, MAX_STRING_DATA_LENGTH)) );
break;
@@ -382,25 +418,29 @@ void SynchedEntityData::assignValues(vector<shared_ptr<DataItem> > *items)
for (AUTO_VAR(it, items->begin()); it != itEnd; it++)
{
shared_ptr<DataItem> item = *it;
- AUTO_VAR(itemFromId, itemsById.find(item->getId()));
- if (itemFromId != itemsById.end() )
+
+ shared_ptr<DataItem> itemFromId = itemsById[item->getId()];
+ if( itemFromId != NULL )
{
switch(item->getType())
{
case TYPE_BYTE:
- itemFromId->second->setValue(item->getValue_byte());
+ itemFromId->setValue(item->getValue_byte());
break;
case TYPE_SHORT:
- itemFromId->second->setValue(item->getValue_short());
+ itemFromId->setValue(item->getValue_short());
break;
case TYPE_INT:
- itemFromId->second->setValue(item->getValue_int());
+ itemFromId->setValue(item->getValue_int());
+ break;
+ case TYPE_FLOAT:
+ itemFromId->setValue(item->getValue_float());
break;
case TYPE_STRING:
- itemFromId->second->setValue(item->getValue_wstring());
+ itemFromId->setValue(item->getValue_wstring());
break;
case TYPE_ITEMINSTANCE:
- itemFromId->second->setValue(item->getValue_itemInstance());
+ itemFromId->setValue(item->getValue_itemInstance());
break;
default:
assert(false); // 4J - not implemented
@@ -408,6 +448,9 @@ void SynchedEntityData::assignValues(vector<shared_ptr<DataItem> > *items)
}
}
}
+
+ // client-side dirty
+ m_isDirty = true;
}
bool SynchedEntityData::isEmpty()
@@ -415,38 +458,47 @@ bool SynchedEntityData::isEmpty()
return m_isEmpty;
}
+void SynchedEntityData::clearDirty()
+{
+ m_isDirty = false;
+}
+
int SynchedEntityData::getSizeInBytes()
{
int size = 1;
-
- AUTO_VAR(itEnd, itemsById.end());
- for (AUTO_VAR(it, itemsById.begin()); it != itEnd; it++ )
- {
- shared_ptr<DataItem> dataItem = (*it).second;
- size += 1;
-
- // write value
- switch (dataItem->getType())
+ for( int i = 0; i <= MAX_ID_VALUE; i++ )
+ {
+ shared_ptr<DataItem> dataItem = itemsById[i];
+ if(dataItem != NULL)
{
- case TYPE_BYTE:
size += 1;
- break;
- case TYPE_SHORT:
- size += 2;
- break;
- case TYPE_INT:
- size += 4;
- break;
- case TYPE_STRING:
- size += (int)dataItem->getValue_wstring().length() + 2; // Estimate, assuming all ascii chars
- break;
- case TYPE_ITEMINSTANCE:
- // short + byte + short
- size += 2 + 1 + 2; // Estimate, assuming all ascii chars
- break;
- default:
- break;
+
+ // write value
+ switch (dataItem->getType())
+ {
+ case TYPE_BYTE:
+ size += 1;
+ break;
+ case TYPE_SHORT:
+ size += 2;
+ break;
+ case TYPE_INT:
+ size += 4;
+ break;
+ case TYPE_FLOAT:
+ size += 4;
+ break;
+ case TYPE_STRING:
+ size += (int)dataItem->getValue_wstring().length() + 2; // Estimate, assuming all ascii chars
+ break;
+ case TYPE_ITEMINSTANCE:
+ // short + byte + short
+ size += 2 + 1 + 2; // Estimate, assuming all ascii chars
+ break;
+ default:
+ break;
+ }
}
}
return size;
@@ -475,6 +527,12 @@ SynchedEntityData::DataItem::DataItem(int type, int id, short value) : type( typ
this->dirty = true;
}
+SynchedEntityData::DataItem::DataItem(int type, int id, float value) : type( type ), id( id )
+{
+ this->value_float = value;
+ this->dirty = true;
+}
+
SynchedEntityData::DataItem::DataItem(int type, int id, const wstring& value) : type( type ), id( id )
{
this->value_wstring = value;
@@ -507,6 +565,11 @@ void SynchedEntityData::DataItem::setValue(short value)
this->value_short = value;
}
+void SynchedEntityData::DataItem::setValue(float value)
+{
+ this->value_float = value;
+}
+
void SynchedEntityData::DataItem::setValue(const wstring& value)
{
this->value_wstring = value;
@@ -527,6 +590,11 @@ short SynchedEntityData::DataItem::getValue_short()
return value_short;
}
+float SynchedEntityData::DataItem::getValue_float()
+{
+ return value_float;
+}
+
byte SynchedEntityData::DataItem::getValue_byte()
{
return value_byte;