diff --git a/assets/entities.json b/assets/entities.json index ee0d47063..20e9f7655 100644 --- a/assets/entities.json +++ b/assets/entities.json @@ -5,6 +5,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -24,6 +25,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -44,6 +46,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "CREATURE", "can_spawn_far_from_player": true, @@ -67,6 +70,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": true, "category": "MISC", "can_spawn_far_from_player": true, @@ -87,6 +91,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "CREATURE", "can_spawn_far_from_player": true, @@ -111,6 +116,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -134,6 +140,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -154,6 +161,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "AXOLOTLS", "can_spawn_far_from_player": false, @@ -177,6 +185,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -196,6 +205,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -216,6 +226,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "AMBIENT", "can_spawn_far_from_player": false, @@ -240,6 +251,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "CREATURE", "can_spawn_far_from_player": true, @@ -263,6 +275,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -282,6 +295,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -302,6 +316,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": true, "category": "MONSTER", "can_spawn_far_from_player": false, @@ -362,6 +377,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -382,6 +398,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MONSTER", "can_spawn_far_from_player": false, @@ -508,6 +525,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MONSTER", "can_spawn_far_from_player": false, @@ -568,6 +586,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -588,6 +607,7 @@ "mob": true, "limit_per_chunk": 6, "summonable": true, + "saveable": true, "fire_immune": false, "category": "CREATURE", "can_spawn_far_from_player": true, @@ -612,6 +632,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "CREATURE", "can_spawn_far_from_player": true, @@ -659,6 +680,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MONSTER", "can_spawn_far_from_player": false, @@ -749,6 +771,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -768,6 +791,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -787,6 +811,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -807,6 +832,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "CREATURE", "can_spawn_far_from_player": true, @@ -920,6 +946,7 @@ "mob": true, "limit_per_chunk": 8, "summonable": true, + "saveable": true, "fire_immune": false, "category": "WATER_AMBIENT", "can_spawn_far_from_player": false, @@ -1009,6 +1036,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -1029,6 +1057,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "CREATURE", "can_spawn_far_from_player": true, @@ -1151,6 +1180,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MONSTER", "can_spawn_far_from_player": false, @@ -1175,6 +1205,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MONSTER", "can_spawn_far_from_player": false, @@ -1250,6 +1281,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -1269,6 +1301,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -1289,6 +1322,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "WATER_CREATURE", "can_spawn_far_from_player": false, @@ -1381,6 +1415,7 @@ "mob": true, "limit_per_chunk": 6, "summonable": true, + "saveable": true, "fire_immune": false, "category": "CREATURE", "can_spawn_far_from_player": true, @@ -1436,6 +1471,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -1456,6 +1492,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MONSTER", "can_spawn_far_from_player": false, @@ -1536,6 +1573,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -1556,6 +1594,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MONSTER", "can_spawn_far_from_player": false, @@ -1781,6 +1820,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MONSTER", "can_spawn_far_from_player": false, @@ -1837,6 +1877,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MONSTER", "can_spawn_far_from_player": false, @@ -1861,6 +1902,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": true, "category": "MONSTER", "can_spawn_far_from_player": false, @@ -1884,6 +1926,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -1903,6 +1946,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": true, "category": "MISC", "can_spawn_far_from_player": true, @@ -1923,6 +1967,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MONSTER", "can_spawn_far_from_player": false, @@ -1993,6 +2038,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -2012,6 +2058,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -2031,6 +2078,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -2050,6 +2098,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -2069,6 +2118,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -2088,6 +2138,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -2107,6 +2158,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -2127,6 +2179,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "CREATURE", "can_spawn_far_from_player": true, @@ -2151,6 +2204,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "CREATURE", "can_spawn_far_from_player": true, @@ -2174,6 +2228,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -2194,6 +2249,7 @@ "mob": true, "limit_per_chunk": 1, "summonable": true, + "saveable": true, "fire_immune": true, "category": "MONSTER", "can_spawn_far_from_player": false, @@ -2316,6 +2372,7 @@ "mob": true, "limit_per_chunk": 1, "summonable": true, + "saveable": true, "fire_immune": false, "category": "CREATURE", "can_spawn_far_from_player": true, @@ -2340,6 +2397,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MONSTER", "can_spawn_far_from_player": false, @@ -2363,6 +2421,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -2383,6 +2442,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "UNDERGROUND_WATER_CREATURE", "can_spawn_far_from_player": false, @@ -2439,6 +2499,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "CREATURE", "can_spawn_far_from_player": true, @@ -2463,6 +2524,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MONSTER", "can_spawn_far_from_player": false, @@ -2659,6 +2721,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MONSTER", "can_spawn_far_from_player": false, @@ -2780,6 +2843,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -2800,6 +2864,7 @@ "mob": true, "limit_per_chunk": 6, "summonable": true, + "saveable": true, "fire_immune": false, "category": "CREATURE", "can_spawn_far_from_player": true, @@ -2856,6 +2921,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MONSTER", "can_spawn_far_from_player": false, @@ -2983,6 +3049,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MONSTER", "can_spawn_far_from_player": false, @@ -3006,6 +3073,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -3026,6 +3094,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -3093,6 +3162,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -3112,6 +3182,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -3131,6 +3202,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -3150,6 +3222,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -3169,6 +3242,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -3188,6 +3262,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": false, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -3207,6 +3282,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": false, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -3227,6 +3303,7 @@ "mob": true, "limit_per_chunk": 6, "summonable": true, + "saveable": true, "fire_immune": false, "category": "CREATURE", "can_spawn_far_from_player": true, @@ -3282,6 +3359,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -3302,6 +3380,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": true, "category": "MONSTER", "can_spawn_far_from_player": false, @@ -3454,6 +3533,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -3473,6 +3553,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -3492,6 +3573,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -3511,6 +3593,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -3531,6 +3614,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "CREATURE", "can_spawn_far_from_player": true, @@ -3653,6 +3737,7 @@ "mob": true, "limit_per_chunk": 6, "summonable": true, + "saveable": true, "fire_immune": false, "category": "CREATURE", "can_spawn_far_from_player": true, @@ -3708,6 +3793,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -3727,6 +3813,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -3747,6 +3834,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "CREATURE", "can_spawn_far_from_player": true, @@ -3770,6 +3858,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -3789,6 +3878,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -3808,6 +3898,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -3827,6 +3918,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -3847,6 +3939,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "CREATURE", "can_spawn_far_from_player": true, @@ -3890,6 +3983,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "CREATURE", "can_spawn_far_from_player": true, @@ -3946,6 +4040,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MONSTER", "can_spawn_far_from_player": false, @@ -4007,6 +4102,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "CREATURE", "can_spawn_far_from_player": true, @@ -4099,6 +4195,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MONSTER", "can_spawn_far_from_player": false, @@ -4123,6 +4220,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MONSTER", "can_spawn_far_from_player": false, @@ -4147,6 +4245,7 @@ "mob": true, "limit_per_chunk": 1, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MONSTER", "can_spawn_far_from_player": true, @@ -4210,6 +4309,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "CREATURE", "can_spawn_far_from_player": true, @@ -4362,6 +4462,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -4381,6 +4482,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -4401,6 +4503,7 @@ "mob": true, "limit_per_chunk": 8, "summonable": true, + "saveable": true, "fire_immune": false, "category": "WATER_AMBIENT", "can_spawn_far_from_player": false, @@ -4460,6 +4563,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "CREATURE", "can_spawn_far_from_player": true, @@ -4603,6 +4707,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MONSTER", "can_spawn_far_from_player": false, @@ -4646,6 +4751,7 @@ "mob": true, "limit_per_chunk": 5, "summonable": true, + "saveable": true, "fire_immune": false, "category": "WATER_AMBIENT", "can_spawn_far_from_player": false, @@ -4736,6 +4842,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "CREATURE", "can_spawn_far_from_player": true, @@ -5143,6 +5250,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": true, "category": "MONSTER", "can_spawn_far_from_player": true, @@ -5190,6 +5298,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -5210,6 +5319,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MONSTER", "can_spawn_far_from_player": false, @@ -5234,6 +5344,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MONSTER", "can_spawn_far_from_player": false, @@ -5320,6 +5431,7 @@ "mob": true, "limit_per_chunk": 6, "summonable": true, + "saveable": true, "fire_immune": false, "category": "CREATURE", "can_spawn_far_from_player": true, @@ -5376,6 +5488,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MONSTER", "can_spawn_far_from_player": false, @@ -5477,6 +5590,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -5497,6 +5611,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "CREATURE", "can_spawn_far_from_player": true, @@ -5520,6 +5635,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -5540,6 +5656,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -5586,6 +5703,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -5605,6 +5723,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -5625,6 +5744,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MONSTER", "can_spawn_far_from_player": false, @@ -5715,6 +5835,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -5734,6 +5855,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -5754,6 +5876,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "WATER_CREATURE", "can_spawn_far_from_player": false, @@ -5810,6 +5933,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MONSTER", "can_spawn_far_from_player": false, @@ -5936,6 +6060,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": true, "category": "CREATURE", "can_spawn_far_from_player": true, @@ -5992,6 +6117,7 @@ "mob": true, "limit_per_chunk": 8, "summonable": true, + "saveable": true, "fire_immune": false, "category": "CREATURE", "can_spawn_far_from_player": true, @@ -6015,6 +6141,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -6034,6 +6161,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": true, "category": "MISC", "can_spawn_far_from_player": true, @@ -6053,6 +6181,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -6073,6 +6202,7 @@ "mob": true, "limit_per_chunk": 6, "summonable": true, + "saveable": true, "fire_immune": false, "category": "CREATURE", "can_spawn_far_from_player": true, @@ -6128,6 +6258,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -6148,6 +6279,7 @@ "mob": true, "limit_per_chunk": 8, "summonable": true, + "saveable": true, "fire_immune": false, "category": "WATER_AMBIENT", "can_spawn_far_from_player": false, @@ -6207,6 +6339,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "CREATURE", "can_spawn_far_from_player": true, @@ -6287,6 +6420,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": true, "category": "MONSTER", "can_spawn_far_from_player": false, @@ -6311,6 +6445,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -6335,6 +6470,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MONSTER", "can_spawn_far_from_player": false, @@ -6396,6 +6532,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "CREATURE", "can_spawn_far_from_player": true, @@ -6420,6 +6557,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": true, "category": "MONSTER", "can_spawn_far_from_player": false, @@ -6455,6 +6593,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -6475,6 +6614,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MONSTER", "can_spawn_far_from_player": false, @@ -6686,6 +6826,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": true, "category": "MONSTER", "can_spawn_far_from_player": false, @@ -6710,6 +6851,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": true, "category": "MONSTER", "can_spawn_far_from_player": false, @@ -6820,6 +6962,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -6840,6 +6983,7 @@ "mob": true, "limit_per_chunk": 8, "summonable": true, + "saveable": true, "fire_immune": false, "category": "CREATURE", "can_spawn_far_from_player": true, @@ -6864,6 +7008,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": true, "category": "MONSTER", "can_spawn_far_from_player": false, @@ -6920,6 +7065,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MONSTER", "can_spawn_far_from_player": false, @@ -7074,6 +7220,7 @@ "mob": true, "limit_per_chunk": 6, "summonable": true, + "saveable": true, "fire_immune": false, "category": "CREATURE", "can_spawn_far_from_player": true, @@ -7130,6 +7277,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": false, "category": "MONSTER", "can_spawn_far_from_player": false, @@ -7257,6 +7405,7 @@ "mob": true, "limit_per_chunk": 4, "summonable": true, + "saveable": true, "fire_immune": true, "category": "MONSTER", "can_spawn_far_from_player": false, @@ -7364,6 +7513,7 @@ "player": { "id": 149, "summonable": false, + "saveable": false, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, @@ -7387,6 +7537,7 @@ "mob": false, "limit_per_chunk": 0, "summonable": false, + "saveable": false, "fire_immune": false, "category": "MISC", "can_spawn_far_from_player": true, diff --git a/pumpkin-data/build/entity_type.rs b/pumpkin-data/build/entity_type.rs index 39b39a654..b3d1b981d 100644 --- a/pumpkin-data/build/entity_type.rs +++ b/pumpkin-data/build/entity_type.rs @@ -18,6 +18,7 @@ pub struct EntityType { pub loot_table: Option, pub summonable: bool, pub fire_immune: bool, + pub saveable: bool, pub category: MobCategory, pub can_spawn_far_from_player: bool, pub dimension: [f32; 2], @@ -106,6 +107,7 @@ impl ToTokens for NamedEntityType<'_> { MobCategory::MISC => quote! { MobCategory::MISC }, }; + let saveable = entity.saveable; let summonable = entity.summonable; let fire_immune = entity.fire_immune; let eye_height = entity.eye_height; @@ -136,6 +138,7 @@ impl ToTokens for NamedEntityType<'_> { max_health: #max_health, attackable: #attackable, mob: #mob, + saveable: #saveable, limit_per_chunk: #limit_per_chunk, summonable: #summonable, fire_immune: #fire_immune, @@ -192,6 +195,7 @@ pub(crate) fn build() -> TokenStream { pub max_health: Option, pub attackable: Option, pub mob: bool, + pub saveable: bool, pub limit_per_chunk: i32, pub summonable: bool, pub fire_immune: bool, diff --git a/pumpkin-data/src/data_component_impl.rs b/pumpkin-data/src/data_component_impl.rs index 20ec73065..d8bcf2127 100644 --- a/pumpkin-data/src/data_component_impl.rs +++ b/pumpkin-data/src/data_component_impl.rs @@ -151,7 +151,13 @@ impl DataComponentImpl for DamageImpl { #[derive(Clone, Debug, Hash, PartialEq)] pub struct UnbreakableImpl; #[derive(Clone, Debug, Hash, PartialEq)] -pub struct CustomNameImpl; +pub struct CustomNameImpl { + // TODO make TextComponent const + pub name: &'static str, +} +impl DataComponentImpl for CustomNameImpl { + default_impl!(CustomName); +} #[derive(Clone, Debug, Hash, PartialEq)] pub struct ItemNameImpl { // TODO make TextComponent const diff --git a/pumpkin/src/entity/mod.rs b/pumpkin/src/entity/mod.rs index 4af21143d..a54c45ee9 100644 --- a/pumpkin/src/entity/mod.rs +++ b/pumpkin/src/entity/mod.rs @@ -405,6 +405,16 @@ impl Entity { self.send_velocity().await; } + /// Sets a custom name for the entity, typically used with nametags + pub async fn set_custon_name(&self, name: TextComponent) { + self.send_meta_data(&[Metadata::new( + 2, + MetaDataType::OptionalTextComponent, + Some(name), + )]) + .await; + } + pub async fn send_velocity(&self) { let velocity = self.velocity.load(); self.world diff --git a/pumpkin/src/entity/projectile/mod.rs b/pumpkin/src/entity/projectile/mod.rs index 15087b56b..4cc455cb5 100644 --- a/pumpkin/src/entity/projectile/mod.rs +++ b/pumpkin/src/entity/projectile/mod.rs @@ -91,4 +91,8 @@ impl EntityBase for ThrownItemEntity { fn as_nbt_storage(&self) -> &dyn NBTStorage { self } + + fn get_gravity(&self) -> f64 { + 0.03 + } } diff --git a/pumpkin/src/item/items/hoe.rs b/pumpkin/src/item/items/hoe.rs index 6dc9c7566..63cc3765b 100644 --- a/pumpkin/src/item/items/hoe.rs +++ b/pumpkin/src/item/items/hoe.rs @@ -85,7 +85,7 @@ impl ItemBehaviour for HoeItem { Uuid::new_v4(), world.clone(), location, - &EntityType::SNOWBALL, + &EntityType::ITEM, false, ); // TODO: Merge stacks together diff --git a/pumpkin/src/item/items/mod.rs b/pumpkin/src/item/items/mod.rs index 824b5cc36..8a55b96fd 100644 --- a/pumpkin/src/item/items/mod.rs +++ b/pumpkin/src/item/items/mod.rs @@ -11,6 +11,7 @@ pub mod ignite; pub mod ink_sac; pub mod mace; pub mod minecart; +pub mod name_tag; pub mod shovel; pub mod snowball; pub mod swords; @@ -18,6 +19,7 @@ pub mod trident; use crate::item::items::end_crystal::EndCrystalItem; use crate::item::items::minecart::MinecartItem; +use crate::item::items::name_tag::NameTagItem; use super::registry::ItemRegistry; use axe::AxeItem; @@ -56,6 +58,7 @@ pub fn default_registry() -> Arc { manager.register(EndCrystalItem); manager.register(MinecartItem); manager.register(HoneyCombItem); + manager.register(NameTagItem); manager.register(EnderEyeItem); manager.register(FireChargeItem); manager.register(DyeItem); diff --git a/pumpkin/src/item/items/name_tag.rs b/pumpkin/src/item/items/name_tag.rs new file mode 100644 index 000000000..585ba9017 --- /dev/null +++ b/pumpkin/src/item/items/name_tag.rs @@ -0,0 +1,40 @@ +use std::sync::Arc; + +use crate::entity::EntityBase; +use crate::entity::player::Player; +use crate::item::{ItemBehaviour, ItemMetadata}; +use async_trait::async_trait; +use pumpkin_data::data_component_impl::CustomNameImpl; +use pumpkin_data::item::Item; +use pumpkin_util::text::TextComponent; +use pumpkin_world::item::ItemStack; + +pub struct NameTagItem; + +impl ItemMetadata for NameTagItem { + fn ids() -> Box<[u16]> { + [Item::NAME_TAG.id].into() + } +} + +#[async_trait] +impl ItemBehaviour for NameTagItem { + async fn use_on_entity( + &self, + item: &mut ItemStack, + player: &Player, + entity: Arc, + ) { + let entity = entity.get_entity(); + if entity.entity_type.saveable + && let Some(name) = item.get_data_component::() + { + // TODO + entity.set_custon_name(TextComponent::text(name.name)).await; + item.decrement_unless_creative(player.gamemode.load(), 1); + } + } + fn as_any(&self) -> &dyn std::any::Any { + self + } +} diff --git a/pumpkin/src/item/mod.rs b/pumpkin/src/item/mod.rs index 882a8eba3..84a54d4d9 100644 --- a/pumpkin/src/item/mod.rs +++ b/pumpkin/src/item/mod.rs @@ -2,7 +2,9 @@ pub mod items; pub mod registry; use std::any::Any; +use std::sync::Arc; +use crate::entity::EntityBase; use crate::entity::player::Player; use crate::server::Server; use async_trait::async_trait; @@ -32,6 +34,14 @@ pub trait ItemBehaviour: Send + Sync { ) { } + async fn use_on_entity( + &self, + _item: &mut ItemStack, + _player: &Player, + _entity: Arc, + ) { + } + fn can_mine(&self, _player: &Player) -> bool { true } diff --git a/pumpkin/src/item/registry.rs b/pumpkin/src/item/registry.rs index b75e4dc7d..ab8b22e94 100644 --- a/pumpkin/src/item/registry.rs +++ b/pumpkin/src/item/registry.rs @@ -1,3 +1,4 @@ +use crate::entity::EntityBase; use crate::entity::player::Player; use crate::server::Server; use pumpkin_data::Block; @@ -48,6 +49,18 @@ impl ItemRegistry { } } + pub async fn use_on_entity( + &self, + stack: &mut ItemStack, + player: &Player, + entity: Arc, + ) { + let pumpkin_item = self.get_pumpkin_item(stack.item); + if let Some(pumpkin_item) = pumpkin_item { + pumpkin_item.use_on_entity(stack, player, entity).await; + } + } + pub fn can_mine(&self, item: &Item, player: &Player) -> bool { let pumpkin_block = self.get_pumpkin_item(item); if let Some(pumpkin_block) = pumpkin_block { diff --git a/pumpkin/src/net/java/mod.rs b/pumpkin/src/net/java/mod.rs index 616bfe61d..039a5c453 100644 --- a/pumpkin/src/net/java/mod.rs +++ b/pumpkin/src/net/java/mod.rs @@ -571,7 +571,7 @@ impl JavaClient { .await; } SInteract::PACKET_ID => { - self.handle_interact(player, SInteract::read(payload)?) + self.handle_interact(player, SInteract::read(payload)?, server) .await; } SKeepAlive::PACKET_ID => { diff --git a/pumpkin/src/net/java/play.rs b/pumpkin/src/net/java/play.rs index 984417a25..e4c71d403 100644 --- a/pumpkin/src/net/java/play.rs +++ b/pumpkin/src/net/java/play.rs @@ -1065,15 +1065,21 @@ impl JavaClient { } } - pub async fn handle_interact(&self, player: &Player, interact: SInteract) { + pub async fn handle_interact( + &self, + player: &Player, + interact: SInteract, + server: &Arc, + ) { if !player.has_client_loaded() { return; } + let entity_id = interact.entity_id; let sneaking = interact.sneaking; - let entity = &player.living_entity.entity; - if entity.sneaking.load(Ordering::Relaxed) != sneaking { - entity.set_sneaking(sneaking).await; + let player_entity = &player.living_entity.entity; + if player_entity.sneaking.load(Ordering::Relaxed) != sneaking { + player_entity.set_sneaking(sneaking).await; } let Ok(action) = ActionType::try_from(interact.r#type.0) else { self.kick(TextComponent::text("Invalid action type")).await; @@ -1082,7 +1088,6 @@ impl JavaClient { match action { ActionType::Attack => { - let entity_id = interact.entity_id; let config = &advanced_config().pvp; // TODO: do validation and stuff if !config.enabled { @@ -1091,7 +1096,7 @@ impl JavaClient { // TODO: set as camera entity when spectator - let world = &entity.world; + let world = &player_entity.world; let player_victim = world.get_player_by_id(entity_id.0).await; if entity_id.0 == player.entity_id() { // This can't be triggered from a non-modded client. @@ -1137,7 +1142,16 @@ impl JavaClient { } } ActionType::Interact | ActionType::InteractAt => { - log::debug!("todo"); + // TODO: split this up + let entity = player.world().get_player_by_id(entity_id.0).await; + if let Some(entity) = entity { + let held = player.inventory.held_item(); + let mut stack = held.lock().await; + server + .item_registry + .use_on_entity(&mut stack, player, entity) + .await; + } } } } @@ -1425,14 +1439,14 @@ impl JavaClient { return Ok(()); } } + let mut stack = item.lock().await; - if item.lock().await.is_empty() { + if stack.is_empty() { // TODO item cool down // If the hand is empty we stop here return Ok(()); } - let mut stack = item.lock().await; server .item_registry .use_on_block(&mut stack, player, position, face, block, server)