From 8e1eacf3a87a0cee39c8c27c3846828c12e73f9d Mon Sep 17 00:00:00 2001
From: Perttu Ahola <celeron55@gmail.com>
Date: Sat, 30 Jul 2011 23:33:57 +0300
Subject: [PATCH] Fixed handling of inventory in creative mode (normal
 inventory is not trashed anymore), fixed mese pick speed, added some
 forgotten stuff

---
 data/cooked_rat.png     | Bin 0 -> 239 bytes
 data/nc_back.png        | Bin 0 -> 303 bytes
 data/nc_front.png       | Bin 0 -> 410 bytes
 data/nc_rb.png          | Bin 0 -> 203 bytes
 data/nc_side.png        | Bin 0 -> 260 bytes
 data/scorched_stuff.png | Bin 0 -> 233 bytes
 src/content_mapnode.cpp |  19 ++++++++++++++++-
 src/content_mapnode.h   |   2 ++
 src/mapgen.cpp          |  45 ++++++++++++++++++++++++++++++++++++++++
 src/mapnode.h           |   3 +++
 src/player.cpp          |  11 ++++++++--
 src/player.h            |   2 ++
 src/server.cpp          |  10 +++++++++
 13 files changed, 89 insertions(+), 3 deletions(-)
 create mode 100644 data/cooked_rat.png
 create mode 100644 data/nc_back.png
 create mode 100644 data/nc_front.png
 create mode 100644 data/nc_rb.png
 create mode 100644 data/nc_side.png
 create mode 100644 data/scorched_stuff.png

diff --git a/data/cooked_rat.png b/data/cooked_rat.png
new file mode 100644
index 0000000000000000000000000000000000000000..daad3be0d19a741831bd9e1123846c19b580ca78
GIT binary patch
literal 239
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf<Z~8yL>4nJ
z@ErkR#;MwT(m=t9o-U3d7QJVKqInM}2xzBh2{bVBBry0_96G?0kifLzpxuewC&!W%
zBRADeeR3;XpJ9LF<rCVwdOHFe0#6u<$_Webb<Av35xSh~a_4sCs?!bI3K!4pTq7To
z6H?j#?(&-(w_kmKz9)zGlS@n3q<2&2x-H`>HJ!I)wt|enSA|Z?Hqo?4;cQcy?k98J
gQ(9m5^L+tRu)W@od+PaZK*uq7y85}Sb4q9e0K#%s{r~^~

literal 0
HcmV?d00001

diff --git a/data/nc_back.png b/data/nc_back.png
new file mode 100644
index 0000000000000000000000000000000000000000..f09f41658330f559dddc804e0f48fe94637d7e11
GIT binary patch
literal 303
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf<Z~8yL>4nJ
z@ErkR#;MwT(m=tBo-U3d7QJ(W5Aq%|5csS*S0l)L!D5F5W-Crx3C_+=g=db9*^?cv
zPX2V_r1<SF{ufnD5#_t)F*WqxmdrlYE-Q7r;QHG|2d~8KGv1om$<+BN_eFrpER720
zr)3SR>f{y)b^Kl=HN8~pz$77t0;M3wzKW|Wr%E;|&*U|nBar-OEsOsDbx$6x@7?&$
z?}5vti`G{zF7<Lz{^FXZwfvrL=Rs4>el5nsn%j+cr(14V6B1T^lX>Od1MPR!9X`iz
wIJjx|Wc7<v&erTTJ6_{^R6i>H=9e0#pEpvA<P3{NfSzOUboFyt=akR{0I`&JHvj+t

literal 0
HcmV?d00001

diff --git a/data/nc_front.png b/data/nc_front.png
new file mode 100644
index 0000000000000000000000000000000000000000..cad9edab1b5176172d3c2f03876e3b3b0424eaac
GIT binary patch
literal 410
zcmV;L0cHM)P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW
zd<bNS00009a7bBm000ie000ie0hKEb8vp<SJV``BR5*>DlR;9$FbqZCx66gvE6|Iu
zu)_`LMTiy7R8G`dEaHTibQlKBcw^~*Ju4BMFAn_goG&iG@1GO#IDjhm>%?ynj|qTT
zlQ=AwWg4MI;xXao55>xnQVNn*qp&7DAUS4+vL1+q*@)EV4qcH%trasPWZ|oSWtt}3
z_hg6NO^ad%RHP@MJ`}g6ax3rP0T;OY4)Z4^%yl_ug1dtvwbACB8HVAZIHg2NslyKt
zIy^}`+{JL)-QBqb&GlpXATx^$0ReIA1Y6_O{552PJR&M>0A0uBor^f<{7u))#Vl=8
z?~!qDpR%qwv$4(U_1ob7IT23-R>lrhR8Z_^q9=y*!fpF21Kh8L!)b#^K-3v;J5$Yj
zz*@BlcgJjGvJp||E)HgfwI}YE?fGrLriy=BXFXs13k7}4h*nSCQ~&?~07*qoM6N<$
Ef`X^5s{jB1

literal 0
HcmV?d00001

diff --git a/data/nc_rb.png b/data/nc_rb.png
new file mode 100644
index 0000000000000000000000000000000000000000..7ebc9930d42866f70bba6e07a6f7c4affd0bc3da
GIT binary patch
literal 203
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf<Z~8yL>4nJ
z@ErkR#;MwT(m=snPZ!4!i{7P|14SDY1Y9mknobN`&^4oxsqBJJnqgCRbFIAf{sXBG
z8t%HS5U3C0I+J^a;nXAT`2y?=TbOena6EV4@i~!A;hxg|Bkt=MZ#aZ6IdE+uBjb$)
u>n#foTRSjFUr4`oe=}RavQtT(zZf4Ts++F4S*!-Mn8DN4&t;ucLK6U8heQhi

literal 0
HcmV?d00001

diff --git a/data/nc_side.png b/data/nc_side.png
new file mode 100644
index 0000000000000000000000000000000000000000..f954045fbd9ce5fbc95a8da665575ed0574d4eb5
GIT binary patch
literal 260
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf<Z~8yL>4nJ
z@ErkR#;MwT(m=swo-U3d7QJ(WZ}T2D;IJuBTXltZQs6I%h4)l)-MX%HN?o2Gw$x0`
z&u>$Uz;os!jLsqqzwZgOGMxBSlfZxIVUM4Bg`KJ3<-%WuF`sHpl4DPwSm-%@wXF6O
z`4BE&Mg||3*&I6=x;y-ftX?r}Fg^N8LVnMT11=}S)|D=q$l@b(ZEC4qeA1zy_ZNfC
zO@A>-=BfU_JsZAG;nsg4o$p?+o$Iym<hd*EmCPCILc7IOi>?A)%;4$j=d#Wzp$P!f
C^<Fdp

literal 0
HcmV?d00001

diff --git a/data/scorched_stuff.png b/data/scorched_stuff.png
new file mode 100644
index 0000000000000000000000000000000000000000..9ced2fbe89e84a0abf5ca13f71c10a0b3b11170a
GIT binary patch
literal 233
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf<Z~8yL>4nJ
z@ErkR#;MwT(m=s(PZ!4!i{7(Aw|N^Bc=kx8CrU3%m7ccJUaVj2!iQ90r^Y+Y%n!~l
zom|)Ll3BBU4pYMIlOi=fAyZ{}=IGoMZIBXd{JTfxa{^CC8{e+VMfdi0Tv)gvX{GPZ
z)z$Y4E=g@Wwjk*7F5x9tOqZ+M98qYlWvJS;YO{IJ(;$YV{|-G*blK-~%Cl78x&8Ie
aRy{$3__d~{M>YYS#o+1c=d#Wzp$Py!<5X<`

literal 0
HcmV?d00001

diff --git a/src/content_mapnode.cpp b/src/content_mapnode.cpp
index db036ebd9..b6b7a6e53 100644
--- a/src/content_mapnode.cpp
+++ b/src/content_mapnode.cpp
@@ -474,13 +474,30 @@ void content_mapnode_init()
 	f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
 	setStoneLikeDiggingProperties(f->digging_properties, 5.0);
 	
+	i = CONTENT_NC;
+	f = &content_features(i);
+	f->param_type = CPT_FACEDIR_SIMPLE;
+	f->setAllTextures("nc_side.png");
+	f->setTexture(5, "nc_front.png"); // Z-
+	f->setTexture(4, "nc_back.png"); // Z+
+	f->setInventoryTexture("nc_front.png");
+	f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+	setStoneLikeDiggingProperties(f->digging_properties, 3.0);
+	
+	i = CONTENT_NC_RB;
+	f = &content_features(i);
+	f->setAllTextures("nc_rb.png");
+	f->setInventoryTexture("nc_rb.png");
+	f->dug_item = std::string("MaterialItem ")+itos(i)+" 1";
+	setStoneLikeDiggingProperties(f->digging_properties, 3.0);
+	
 	// NOTE: Remember to add frequently used stuff to the texture atlas in tile.cpp
 	
 
 	/*
 		Add MesePick to everything
 	*/
-	for(u16 i=0; i<256; i++)
+	for(u16 i=0; i<=MAX_CONTENT; i++)
 	{
 		content_features(i).digging_properties.set("MesePick",
 				DiggingProperties(true, 0.0, 65535./1337));
diff --git a/src/content_mapnode.h b/src/content_mapnode.h
index 5fdbf45f3..7be26518f 100644
--- a/src/content_mapnode.h
+++ b/src/content_mapnode.h
@@ -70,6 +70,8 @@ MapNode mapnode_translate_to_internal(MapNode n_from, u8 version);
 #define CONTENT_BOOKSHELF 0x814 //29
 #define CONTENT_JUNGLETREE 0x815
 #define CONTENT_JUNGLEGRASS 0x816
+#define CONTENT_NC 0x817
+#define CONTENT_NC_RB 0x818
 
 
 #endif
diff --git a/src/mapgen.cpp b/src/mapgen.cpp
index 0ba7f91ab..5dec7d843 100644
--- a/src/mapgen.cpp
+++ b/src/mapgen.cpp
@@ -976,6 +976,40 @@ static void make_dungeon1(VoxelManipulator &vmanip, PseudoRandom &random)
 	}
 }
 
+static void make_nc(VoxelManipulator &vmanip, PseudoRandom &random)
+{
+	v3s16 dir;
+	u8 facedir_i = 0;
+	s32 r = random.range(0, 3);
+	if(r == 0){
+		dir = v3s16( 1, 0, 0);
+		facedir_i = 3;
+	}
+	if(r == 1){
+		dir = v3s16(-1, 0, 0);
+		facedir_i = 1;
+	}
+	if(r == 2){
+		dir = v3s16( 0, 0, 1);
+		facedir_i = 2;
+	}
+	if(r == 3){
+		dir = v3s16( 0, 0,-1);
+		facedir_i = 0;
+	}
+	v3s16 p = vmanip.m_area.MinEdge + v3s16(
+			16+random.range(0,15),
+			16+random.range(0,15),
+			16+random.range(0,15));
+	vmanip.m_data[vmanip.m_area.index(p)] = MapNode(CONTENT_NC, facedir_i);
+	u32 length = random.range(3,15);
+	for(u32 j=0; j<length; j++)
+	{
+		p -= dir;
+		vmanip.m_data[vmanip.m_area.index(p)] = MapNode(CONTENT_NC_RB);
+	}
+}
+
 /*
 	Noise functions. Make sure seed is mangled differently in each one.
 */
@@ -1871,6 +1905,17 @@ void make_block(BlockMakeData *data)
 			}
 		}
 	}
+
+	/*
+		Add NC
+	*/
+	{
+		PseudoRandom ncrandom(blockseed+9324342);
+		if(ncrandom.range(0, 1000) == 0 && blockpos.Y <= -3)
+		{
+			make_nc(vmanip, ncrandom);
+		}
+	}
 	
 	/*
 		Add top and bottom side of water to transforming_liquid queue
diff --git a/src/mapnode.h b/src/mapnode.h
index 956de6852..aeb72c97a 100644
--- a/src/mapnode.h
+++ b/src/mapnode.h
@@ -391,6 +391,9 @@ inline v3s16 unpackDir(u8 b)
 	facedir: CPT_FACEDIR_SIMPLE param1 value
 	dir: The face for which stuff is wanted
 	return value: The face from which the stuff is actually found
+
+	NOTE: Currently this uses 2 bits for Z-,X-,Z+,X+, should there be Y+
+	      and Y- too?
 */
 v3s16 facedir_rotate(u8 facedir, v3s16 dir);
 
diff --git a/src/player.cpp b/src/player.cpp
index d52d6b88f..c43276ef1 100644
--- a/src/player.cpp
+++ b/src/player.cpp
@@ -29,6 +29,7 @@ Player::Player():
 	in_water(false),
 	in_water_stable(false),
 	swimming_up(false),
+	inventory_backup(NULL),
 	craftresult_is_preview(true),
 	hp(20),
 	peer_id(PEER_ID_INEXISTENT),
@@ -43,6 +44,7 @@ Player::Player():
 
 Player::~Player()
 {
+	delete inventory_backup;
 }
 
 void Player::resetInventory()
@@ -106,8 +108,13 @@ void Player::serialize(std::ostream &os)
 	args.writeLines(os);
 
 	os<<"PlayerArgsEnd\n";
-
-	inventory.serialize(os);
+	
+	// If actual inventory is backed up due to creative mode, save it
+	// instead of the dummy creative mode inventory
+	if(inventory_backup)
+		inventory_backup->serialize(os);
+	else
+		inventory.serialize(os);
 }
 
 void Player::deSerialize(std::istream &is)
diff --git a/src/player.h b/src/player.h
index a7a2433ce..29460e1e1 100644
--- a/src/player.h
+++ b/src/player.h
@@ -121,6 +121,8 @@ class Player
 	bool swimming_up;
 	
 	Inventory inventory;
+	// Actual inventory is backed up here when creative mode is used
+	Inventory *inventory_backup;
 
 	bool craftresult_is_preview;
 
diff --git a/src/server.cpp b/src/server.cpp
index 07f9875c4..503d60b84 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -4130,6 +4130,11 @@ Player *Server::emergePlayer(const char *name, const char *password, u16 peer_id
 		// Reset inventory to creative if in creative mode
 		if(g_settings.getBool("creative_mode"))
 		{
+			// Warning: double code below
+			// Backup actual inventory
+			player->inventory_backup = new Inventory();
+			*(player->inventory_backup) = player->inventory;
+			// Set creative inventory
 			craft_set_creative_inventory(player);
 		}
 
@@ -4183,6 +4188,11 @@ Player *Server::emergePlayer(const char *name, const char *password, u16 peer_id
 		
 		if(g_settings.getBool("creative_mode"))
 		{
+			// Warning: double code above
+			// Backup actual inventory
+			player->inventory_backup = new Inventory();
+			*(player->inventory_backup) = player->inventory;
+			// Set creative inventory
 			craft_set_creative_inventory(player);
 		}
 		else if(g_settings.getBool("give_initial_stuff"))
-- 
GitLab