作者jeffffliu (女子 食我 口阿)
看板Minecraft
标题[情报][1.4.2] Spawn-(1)生物随机生成与消失
时间Mon Nov 5 20:36:26 2012
之前看板上也有说明如何生怪的文章
文章代码(AID):
#1GExqq6U (Minecraft) [ptt.cc] [闲聊] 暗房生怪
或是参考Wiki:
http://www.minecraftwiki.net/wiki/Spawn
这一篇主要是要说明:
[1]怪物如何消失
/* 因为这最好说明 */
[2]哪些气候会生成哪些生物
/* 先把生成条件说一说大家比较关心 */
[3]各种生物生成条件
/* 因为如何生成并不是最重要 */
[4]系统如何随机生成生物
/* 如果你想知道详细是如何生成 */
[5]地图在产生时候生成生物
/* 再继续看下去因为很枯燥? */
/*[6]生怪砖生成生物 ['n']<ssssSSSS *Boom* */
/* 这个跟3D空间有关 建议参考http://www.nicovideo.jp/watch/sm16687934 */
/* 记得要带入生成条件 */
这篇只说明如何生成,并不说明生成之後是生成怎样的东西(不同颜色羊之类)
资料来源 net.minecraft.*
/* ---------------SSSSssss>['n']分隔线['n']<ssssSSSS------------- */
[1]怪物如何消失
首先先把会不会消失的生物列出来如下:
会消失的 不会消失
Monster 怪物 Animal 动物(牛 羊 猪 鸡 香菇牛)
Bat 蝙蝠 Golem 魔像(雪人 铁魔像)
Squid 乌贼 Villager 村民
Ocelot 豹猫 Cat 猫
AngryWolf 生气的狼 Wolf 野生或驯服的狼
捡过装备的(凋零)骷髅或是殭屍(猪人) [这样才能回收装备]
另外Dragon、Witcher这两只Boss是在讨论范围外
因为他们的消失函式并不会让他们消失
Bug:Witcher在和平模式会消失,1.4.3有修正
消失演算法
寻找最接近的玩家
(1)距离>128 && 生物能消失
生物消失
(2)寿命>600tick(30秒) && 距离>32 && 1/800机率 && 生物能消失
生物消失
(3)距离<32
寿命=0
结论(好像跟上面差不多)
距离 0~32 32~128 128~
结果 不会消失 存活30秒後 马上消失
有机会消失
/* ---------------SSSSssss>['n']分隔线['n']<ssssSSSS------------- */
[2]哪些气候会生成哪些生物
生物生成清单分成四种 生成上限参数 特性
Monster 怪物 75 敌对
//计算时不含Dragon
Creature 动物 15 友善、动物
//包含Ocelot
Ambient 环境 15 友善
//蝙蝠
WaterCreature 水生动物 5 友善
//乌贼
生成上限 = 参数 * 所有玩家为中心17x17的chunk数总和 / 256
实际上会生怪的chunk是玩家为中心15x15的chunk
动物因为地图创造的时候也会生成外加不消失,基本都是超出上限
Golem和Villager不在计算范围内,也不会随机生成
接下来列出不同气候的生成清单
[生成权重]生物名称(生成只数)
不过生成只数只有在地图创造时同时生成动物的时候才会使用到
其他如怪物、乌贼、蝙蝠并不会使用到
随机生成 除了Ghast最多生成1只 Wolf最多生成8只以外 都是最多生成4只
Biome Creature Monster WaterCreature Ambient
-------------------------------------------------------------------------
Base [12]Sheep(4) [10]Spider
(4) [10]Squid
(4) [10]Bat
(10)
Hills [10]Pig(4) [10]Zombie
(4)
Plains [10]Chicken(4) [10]Skeleton
(4)
Snow [ 8]Cow(4) [10]Creeper
(4)
[10]Slime
(4)
[ 1]Enderman
(4)
-------------------------------------------------------------------------
Beach 无 Base Base Base
Desert
Ocean
River
-------------------------------------------------------------------------
Base再追加 Base再追加 Base Base
Forest [ 5]Wolf(4)
Taiga [ 8]Wolf(4)
Jungle [10]Chicken(4) [ 2]Ocelot
(1)
Swamp [ 1]Slime
(1)
--------------------------------------------------------------------------
Mushroomland[8]Mushroom(4~8)无
(你没看错不生怪跟乌贼)无 Base
--------------------------------------------------------------------------
Hell 无 [ 50]Ghast
(4) 无 无
[100]PigZombie
(4)
[ 1]MagmaCube
(4)
--------------------------------------------------------------------------
End 无 [10]Enderman
(4) 无 无
--------------------------------------------------------------------------
SwampHut (7x5x9区域) [ 1]Witch
(1)
NetherBrige [10]Blaze
(2~3)
[ 5]PigZombie
(4)
[ 3]MagmaCube
(4)
[10]Skeleton
(4) 4/5是WitherSkeleton
1/5是Skeleton
当生成点在这两种建筑物之中而且是要生成怪物的时候会替换成此清单
必须是
系统生成过的建筑,人造不行
结论:沼泽小屋生成跟沙漠神庙、丛林神庙是同类型生成(不同气候生成不同种)
沼泽小屋少之又少随机生成Witch的小屋又那麽小
Witch根本很难遇到(除了一开始生成小屋附赠的那只)
/* ---------------SSSSssss>['n']分隔线['n']<ssssSSSS------------- */
[3]各种生物生成条件
最基础的生成条件(随机生成跟地图创造时生成)
1. 生成位置
距离24内不可以有玩家
2. (1)水生生物
上方位置:不能有实心方块
生成位置:必须是
水
(2)非水生生物
上方位置:不能有实心方块
生成位置:不可以有实心方块以及液体(水、岩浆)
下方位置:必须是
实心方块,但不能是
基岩、可以是
上半砖or上半楼梯
不生怪的实心方块:Bedrock
不实心方块[不会生怪]:Ice GlowStone Leaves TNT EndPortalFrame
半砖楼梯是不实心方块,但是特别追加条件上半砖or楼梯是会生怪
接下来是各种生物的生怪条件(随机生成、地图创造生成、生怪砖生成)
Living (共通除了水生生物)
检查生物即将生成"体积"区域
无其他生物、
无方块、
无液体阻挡
Monstar(地面怪物:不含(烈焰)史来姆、殭屍猪、烈焰怪、※鱼)
亮度 <= (0~7)随机
//结果是越暗生成机率越高
Blaze
亮度是 0~11(hell)
0~12 (real/end)//如果有人在这两个区域弄出自订的生怪砖
Sliverfish
生成位置距离5以内不能有玩家
(1)如果下方位置是
石头则会生成
(2)如果不是石头,则检查亮度是0~12(real
/end) 0~11(hell) //同Blaze
Animal (动物不含猫)
下方位置是
草砖 && 亮度>8
Ocelot (豹猫)
2/3机率 && y>=63 && 下方位置是
草砖或
树叶
Slime (生成大小随机)
(1)如果是超平模式3/4会生成失败
(2)沼泽气候 && 70>y>50 && 亮度<=(0~7)随机
//越暗生成机率越高
(3)特定chunk && y<40 && 1/10
PigZombie、MagmaCube(生成大小随机)
只检查Living 条件
Ghast
1/20机率会生成,其他检查Living条件
Bat
(1)y<63
(2)10/20~11/3
//万圣节大量产生(?)
亮度<=(0~6)随机
//越暗生成机率越高
(3)其他日期
亮度<=(0~3)随机
//越暗生成机率越高
Squid
检查生物即将生成"体积"区域
无其他生物阻挡
//因为只能生在水中
63>y>45
//该位置不会是其他方块
/* ---------------SSSSssss>['n']分隔线['n']<ssssSSSS------------- */
[4]系统如何随机生成生物 /* 现在开始就很枯燥了 */
1 检查设定:能够生成敌对生物 或 能够生成友善生物 才继续做
2 根据所有玩家位置
纪录所有以玩家中心17x17个chunk
然後记住只有以玩家中心15x15个chunk能够生怪
3 for(四种类型生物各执行一次)
4 检查该种类型的生物能否生成
//根据设定:能生成敌对或友善
时间能被400 ticks整除
//即每20秒才能生成一次
检查该类型生物是否高过生成上限
//在[2]有提到
5 while(每个能生成的chunk都做一组生成)
//每个chunk都会对各类型生物
6 如果这个chunk能够生成
//各作一次生成
就从这个chunk随机挑出一个位置
7 如果该位置不是实心方块 && 该位置是能生成的材质
//水or空气
接下来会从该位置开始从41x41水平区域进行3x4次生成尝试,选择方式如下
while(3次)
8 纪录下选定位置
while(4次)
9 将上次的位置稍微移动一下该座标
x : (0~5)随机 - (0~5)随机
// -5 ~ +5 不是平均分布
y : (0~0)随机 - (0~0)随机
// 没变
z : (0~5)随机 - (0~5)随机
// -5 ~ +5
每次都会从上次移动的开始下一次移动
平均来说分布机率会是这样
http://i.imgur.com/iWBpV.png
九成会分布在距离中心8.5
http://i.imgur.com/rf8A7.png
10 检查基础的生成条件
//在[3]有提到
距离24内不部能有玩家
距离重生点24距离也不会生成
该位置跟上方位置要有空间
下风空间要是实体方块(乌贼不检查这个)
11 从该位置气候该种类生成清单
依据权重选择一种生物
//12次尝试都是同种生物
进行该种生物的生成条件检查
//都在[3]里面
如果符合条件就生成生物
12 如果成功生成次数以达单次最多生成次数就换下一个chunk
Ghast 1只 Wolf 8只 其他 4只
/* ---------------SSSSssss>['n']分隔线['n']<ssssSSSS------------- */
[5]地图在产生时候生成生物
1 取得该chunk 特定位置的气候的动物生成清单
2 while(1/10机率)
// 10% 进行一次生成 1%进行第二次生成 ...
3 依据权重从清单里面选择一种生物
生成只数为[2]里面提到的生成只数
//不含Ocelot
x z 为 16x16随机一点
//除了香菇牛是4~8只以外
y 为该点最上层为该位置最上面的位置
//其他动物都是4只
4 for(根据生成只数)
for(尝试四次生成以确保能够生成)
5 检查基础的生成条件
//在[3]有提到
符合就生成一只生物,然後进行下只生成
6 如果生成失败就 随机移动 x,z : (0~5)随机 - (0~5)随机
如果跑出chunk外则继续随机移动
y则是该位置最上层位置进行下次尝试
/* ---------------SSSSssss>['n']分隔线['n']<ssssSSSS------------- */
/*[6]生怪砖生成生物*/
/* ---------------SSSSssss>['n']分隔线['n']<ssssSSSS------------- */
To Be Continued...
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 1.173.219.139
1F:推 CP64:缩排 (惊 11/05 20:45
※ 编辑: jeffffliu 来自: 1.173.219.139 (11/05 20:50)
2F:推 shin2190:用手机版看排版超整齐的 好像在看code… 11/05 21:06
※ 编辑: jeffffliu 来自: 1.173.219.139 (11/05 21:10)
3F:→ jeffffliu:因为本来就是code 11/05 21:11
※ 编辑: jeffffliu 来自: 1.173.219.139 (11/05 21:14)
4F:推 nadoka:蠹鱼? 11/05 21:30
5F:推 becca945:OuOb 11/05 21:31
6F:→ Nuaaukw:这根本职业病了 XDDDDDD 地震!!! 11/05 21:41
7F:推 jeffc815731:['n'] 你在code什麽啦sssSSSSS 11/05 21:52
8F:推 gh0987:推推 11/05 21:52
9F:→ jeffffliu:原本只是想知道Witch会不会生成不知不觉越看越多(汗 11/05 21:56
10F:→ tsuyoshi0307:看不懂... 11/05 22:23
11F:推 olys:code XDDDD 11/05 22:53
12F:推 m339606:推!所以这部分能够自己手动更改伺服器设定吗? 11/06 00:06
13F:推 tw00177843:快推!!免得被发现看不懂!! 11/06 00:20
14F:→ jeffffliu:改了就变mod了(?) 11/06 00:32
15F:→ jeffffliu:看不懂很正常 比较需要知道是 哪些区域会生 跟生成条件 11/06 00:33
※ 编辑: jeffffliu 来自: 1.173.214.84 (11/09 16:14)
※ 编辑: jeffffliu 来自: 1.173.214.84 (11/09 22:34)
※ 编辑: jeffffliu 来自: 1.173.214.84 (11/09 22:36)
16F:→ jeffffliu:补充几个不会生怪的方块 11/09 22:36
※ 编辑: jeffffliu 来自: 1.173.214.84 (11/11 16:00)
17F:→ jeffffliu:蘑菇岛气候的好处就是不生怪 11/15 12:36
※ 编辑: jeffffliu 来自: 1.173.216.71 (12/14 20:44)
※ 编辑: jeffffliu 来自: 114.39.144.101 (12/22 12:24)