@@ -195,9 +195,9 @@ void ContentFeatures::reset()
195
195
groups[" dig_immediate" ] = 2 ;
196
196
drawtype = NDT_NORMAL;
197
197
visual_scale = 1.0 ;
198
- for (u32 i= 0 ; i< 6 ; i++)
198
+ for (u32 i = 0 ; i < 6 ; i++)
199
199
tiledef[i] = TileDef ();
200
- for (u16 j= 0 ; j< CF_SPECIAL_COUNT; j++)
200
+ for (u16 j = 0 ; j < CF_SPECIAL_COUNT; j++)
201
201
tiledef_special[j] = TileDef ();
202
202
alpha = 255 ;
203
203
post_effect_color = video::SColor (0 , 0 , 0 , 0 );
@@ -235,12 +235,12 @@ void ContentFeatures::reset()
235
235
236
236
void ContentFeatures::serialize (std::ostream &os, u16 protocol_version)
237
237
{
238
- if (protocol_version < 14 ){
238
+ if (protocol_version < 24 ){
239
239
serializeOld (os, protocol_version);
240
240
return ;
241
241
}
242
242
243
- writeU8 (os, 6 ); // version
243
+ writeU8 (os, 7 ); // version
244
244
os<<serializeString (name);
245
245
writeU16 (os, groups.size ());
246
246
for (ItemGroupList::const_iterator
@@ -251,10 +251,10 @@ void ContentFeatures::serialize(std::ostream &os, u16 protocol_version)
251
251
writeU8 (os, drawtype);
252
252
writeF1000 (os, visual_scale);
253
253
writeU8 (os, 6 );
254
- for (u32 i= 0 ; i< 6 ; i++)
254
+ for (u32 i = 0 ; i < 6 ; i++)
255
255
tiledef[i].serialize (os, protocol_version);
256
256
writeU8 (os, CF_SPECIAL_COUNT);
257
- for (u32 i= 0 ; i< CF_SPECIAL_COUNT; i++){
257
+ for (u32 i = 0 ; i < CF_SPECIAL_COUNT; i++){
258
258
tiledef_special[i].serialize (os, protocol_version);
259
259
}
260
260
writeU8 (os, alpha);
@@ -291,23 +291,23 @@ void ContentFeatures::serialize(std::ostream &os, u16 protocol_version)
291
291
writeU8 (os, drowning);
292
292
writeU8 (os, leveled);
293
293
writeU8 (os, liquid_range);
294
+ writeU8 (os, waving);
294
295
// Stuff below should be moved to correct place in a version that otherwise changes
295
296
// the protocol version
296
- writeU8 (os, waving);
297
297
}
298
298
299
299
void ContentFeatures::deSerialize (std::istream &is)
300
300
{
301
301
int version = readU8 (is);
302
- if (version != 6 ){
302
+ if (version != 7 ){
303
303
deSerializeOld (is, version);
304
304
return ;
305
305
}
306
306
307
307
name = deSerializeString (is);
308
308
groups.clear ();
309
309
u32 groups_size = readU16 (is);
310
- for (u32 i= 0 ; i< groups_size; i++){
310
+ for (u32 i = 0 ; i < groups_size; i++){
311
311
std::string name = deSerializeString (is);
312
312
int value = readS16 (is);
313
313
groups[name] = value;
@@ -316,11 +316,11 @@ void ContentFeatures::deSerialize(std::istream &is)
316
316
visual_scale = readF1000 (is);
317
317
if (readU8 (is) != 6 )
318
318
throw SerializationError (" unsupported tile count" );
319
- for (u32 i= 0 ; i< 6 ; i++)
319
+ for (u32 i = 0 ; i < 6 ; i++)
320
320
tiledef[i].deSerialize (is);
321
321
if (readU8 (is) != CF_SPECIAL_COUNT)
322
322
throw SerializationError (" unsupported CF_SPECIAL_COUNT" );
323
- for (u32 i= 0 ; i< CF_SPECIAL_COUNT; i++)
323
+ for (u32 i = 0 ; i < CF_SPECIAL_COUNT; i++)
324
324
tiledef_special[i].deSerialize (is);
325
325
alpha = readU8 (is);
326
326
post_effect_color.setAlpha (readU8 (is));
@@ -356,12 +356,12 @@ void ContentFeatures::deSerialize(std::istream &is)
356
356
drowning = readU8 (is);
357
357
leveled = readU8 (is);
358
358
liquid_range = readU8 (is);
359
+ waving = readU8 (is);
359
360
// If you add anything here, insert it primarily inside the try-catch
360
361
// block to not need to increase the version.
361
362
try {
362
363
// Stuff below should be moved to correct place in a version that
363
364
// otherwise changes the protocol version
364
- waving = readU8 (is);
365
365
}catch (SerializationError &e) {};
366
366
}
367
367
@@ -617,7 +617,7 @@ class CNodeDefManager: public IWritableNodeDefManager
617
617
618
618
// Figure out the actual tiles to use
619
619
TileDef tiledef[6 ];
620
- for (u32 j= 0 ; j< 6 ; j++)
620
+ for (u32 j = 0 ; j < 6 ; j++)
621
621
{
622
622
tiledef[j] = f->tiledef [j];
623
623
if (tiledef[j].name == " " )
@@ -712,7 +712,7 @@ class CNodeDefManager: public IWritableNodeDefManager
712
712
tile_shader[0 ] = shdsrc->getShader (" water_surface_shader" ,material_type, f->drawtype );
713
713
714
714
// Tiles (fill in f->tiles[])
715
- for (u16 j= 0 ; j< 6 ; j++){
715
+ for (u16 j = 0 ; j < 6 ; j++){
716
716
// Shader
717
717
f->tiles [j].shader_id = tile_shader[j];
718
718
// Texture
@@ -821,7 +821,7 @@ class CNodeDefManager: public IWritableNodeDefManager
821
821
writeU8 (os, 1 ); // version
822
822
u16 count = 0 ;
823
823
std::ostringstream os2 (std::ios::binary);
824
- for (u32 i= 0 ; i< m_content_features.size (); i++)
824
+ for (u32 i = 0 ; i < m_content_features.size (); i++)
825
825
{
826
826
if (i == CONTENT_IGNORE || i == CONTENT_AIR
827
827
|| i == CONTENT_UNKNOWN)
@@ -851,7 +851,7 @@ class CNodeDefManager: public IWritableNodeDefManager
851
851
u16 count = readU16 (is);
852
852
std::istringstream is2 (deSerializeLongString (is), std::ios::binary);
853
853
ContentFeatures f;
854
- for (u16 n= 0 ; n< count; n++){
854
+ for (u16 n = 0 ; n < count; n++){
855
855
u16 i = readU16 (is2);
856
856
857
857
// Read it from the string wrapper
@@ -936,10 +936,11 @@ void ContentFeatures::serializeOld(std::ostream &os, u16 protocol_version)
936
936
writeU8 (os, drawtype);
937
937
writeF1000 (os, visual_scale);
938
938
writeU8 (os, 6 );
939
- for (u32 i= 0 ; i< 6 ; i++)
939
+ for (u32 i = 0 ; i < 6 ; i++)
940
940
tiledef[i].serialize (os, protocol_version);
941
- writeU8 (os, CF_SPECIAL_COUNT);
942
- for (u32 i=0 ; i<CF_SPECIAL_COUNT; i++){
941
+ // CF_SPECIAL_COUNT = 2 before cf ver. 7 and protocol ver. 24
942
+ writeU8 (os, 2 );
943
+ for (u32 i = 0 ; i < 2 ; i++){
943
944
tiledef_special[i].serialize (os, protocol_version);
944
945
}
945
946
writeU8 (os, alpha);
@@ -972,10 +973,61 @@ void ContentFeatures::serializeOld(std::ostream &os, u16 protocol_version)
972
973
serializeSimpleSoundSpec (sound_dig, os);
973
974
serializeSimpleSoundSpec (sound_dug, os);
974
975
}
975
- else
976
- {
976
+ else if (protocol_version > 13 && protocol_version < 24 ) {
977
+ writeU8 (os, 6 ); // version
978
+ os<<serializeString (name);
979
+ writeU16 (os, groups.size ());
980
+ for (ItemGroupList::const_iterator
981
+ i = groups.begin (); i != groups.end (); i++){
982
+ os<<serializeString (i->first );
983
+ writeS16 (os, i->second );
984
+ }
985
+ writeU8 (os, drawtype);
986
+ writeF1000 (os, visual_scale);
987
+ writeU8 (os, 6 );
988
+ for (u32 i = 0 ; i < 6 ; i++)
989
+ tiledef[i].serialize (os, protocol_version);
990
+ // CF_SPECIAL_COUNT = 2 before cf ver. 7 and protocol ver. 24
991
+ writeU8 (os, 2 );
992
+ for (u32 i = 0 ; i < 2 ; i++){
993
+ tiledef_special[i].serialize (os, protocol_version);
994
+ }
995
+ writeU8 (os, alpha);
996
+ writeU8 (os, post_effect_color.getAlpha ());
997
+ writeU8 (os, post_effect_color.getRed ());
998
+ writeU8 (os, post_effect_color.getGreen ());
999
+ writeU8 (os, post_effect_color.getBlue ());
1000
+ writeU8 (os, param_type);
1001
+ writeU8 (os, param_type_2);
1002
+ writeU8 (os, is_ground_content);
1003
+ writeU8 (os, light_propagates);
1004
+ writeU8 (os, sunlight_propagates);
1005
+ writeU8 (os, walkable);
1006
+ writeU8 (os, pointable);
1007
+ writeU8 (os, diggable);
1008
+ writeU8 (os, climbable);
1009
+ writeU8 (os, buildable_to);
1010
+ os<<serializeString (" " ); // legacy: used to be metadata_name
1011
+ writeU8 (os, liquid_type);
1012
+ os<<serializeString (liquid_alternative_flowing);
1013
+ os<<serializeString (liquid_alternative_source);
1014
+ writeU8 (os, liquid_viscosity);
1015
+ writeU8 (os, liquid_renewable);
1016
+ writeU8 (os, light_source);
1017
+ writeU32 (os, damage_per_second);
1018
+ node_box.serialize (os, protocol_version);
1019
+ selection_box.serialize (os, protocol_version);
1020
+ writeU8 (os, legacy_facedir_simple);
1021
+ writeU8 (os, legacy_wallmounted);
1022
+ serializeSimpleSoundSpec (sound_footstep, os);
1023
+ serializeSimpleSoundSpec (sound_dig, os);
1024
+ serializeSimpleSoundSpec (sound_dug, os);
1025
+ writeU8 (os, rightclickable);
1026
+ writeU8 (os, drowning);
1027
+ writeU8 (os, leveled);
1028
+ writeU8 (os, liquid_range);
1029
+ } else
977
1030
throw SerializationError (" ContentFeatures::serialize(): Unsupported version requested" );
978
- }
979
1031
}
980
1032
981
1033
void ContentFeatures::deSerializeOld (std::istream &is, int version)
@@ -1029,9 +1081,60 @@ void ContentFeatures::deSerializeOld(std::istream &is, int version)
1029
1081
deSerializeSimpleSoundSpec (sound_footstep, is);
1030
1082
deSerializeSimpleSoundSpec (sound_dig, is);
1031
1083
deSerializeSimpleSoundSpec (sound_dug, is);
1032
- }
1033
- else
1034
- {
1084
+ } else if (version == 6 ) {
1085
+ name = deSerializeString (is);
1086
+ groups.clear ();
1087
+ u32 groups_size = readU16 (is);
1088
+ for (u32 i=0 ; i<groups_size; i++){
1089
+ std::string name = deSerializeString (is);
1090
+ int value = readS16 (is);
1091
+ groups[name] = value;
1092
+ }
1093
+ drawtype = (enum NodeDrawType)readU8 (is);
1094
+ visual_scale = readF1000 (is);
1095
+ if (readU8 (is) != 6 )
1096
+ throw SerializationError (" unsupported tile count" );
1097
+ for (u32 i=0 ; i<6 ; i++)
1098
+ tiledef[i].deSerialize (is);
1099
+ // CF_SPECIAL_COUNT in version 6 = 2
1100
+ if (readU8 (is) != 2 )
1101
+ throw SerializationError (" unsupported CF_SPECIAL_COUNT" );
1102
+ for (u32 i=0 ; i<2 ; i++)
1103
+ tiledef_special[i].deSerialize (is);
1104
+ alpha = readU8 (is);
1105
+ post_effect_color.setAlpha (readU8 (is));
1106
+ post_effect_color.setRed (readU8 (is));
1107
+ post_effect_color.setGreen (readU8 (is));
1108
+ post_effect_color.setBlue (readU8 (is));
1109
+ param_type = (enum ContentParamType)readU8 (is);
1110
+ param_type_2 = (enum ContentParamType2)readU8 (is);
1111
+ is_ground_content = readU8 (is);
1112
+ light_propagates = readU8 (is);
1113
+ sunlight_propagates = readU8 (is);
1114
+ walkable = readU8 (is);
1115
+ pointable = readU8 (is);
1116
+ diggable = readU8 (is);
1117
+ climbable = readU8 (is);
1118
+ buildable_to = readU8 (is);
1119
+ deSerializeString (is); // legacy: used to be metadata_name
1120
+ liquid_type = (enum LiquidType)readU8 (is);
1121
+ liquid_alternative_flowing = deSerializeString (is);
1122
+ liquid_alternative_source = deSerializeString (is);
1123
+ liquid_viscosity = readU8 (is);
1124
+ liquid_renewable = readU8 (is);
1125
+ light_source = readU8 (is);
1126
+ damage_per_second = readU32 (is);
1127
+ node_box.deSerialize (is);
1128
+ selection_box.deSerialize (is);
1129
+ legacy_facedir_simple = readU8 (is);
1130
+ legacy_wallmounted = readU8 (is);
1131
+ deSerializeSimpleSoundSpec (sound_footstep, is);
1132
+ deSerializeSimpleSoundSpec (sound_dig, is);
1133
+ deSerializeSimpleSoundSpec (sound_dug, is);
1134
+ rightclickable = readU8 (is);
1135
+ drowning = readU8 (is);
1136
+ leveled = readU8 (is);
1137
+ liquid_range = readU8 (is);
1138
+ } else
1035
1139
throw SerializationError (" unsupported ContentFeatures version" );
1036
- }
1037
1140
}
0 commit comments