专有名词解释

营养价值:指食物本身所能恢复的饥饿值和饱和度,是一个相对值,所有食物在未被食用过的情况下营养价值都是满的。营养价值会随着同一食物的食用次数变多而降低,营养价值越低,食物所能恢复的饥饿值和饱和度越低

膳食记录:指玩家所食用过的食物,默认只记录玩家最近12次食用过的食物

初始食用阈值 (new.player.food.eaten.threshold):指一个新出生的玩家在食用食物多少次后,mod开始生效


本教程为方便读者观看删除了所有英文注释,如有需要可以自行下载mod对照查看

关于食物黑名单添加和FoodGroups的内容,请参考另一篇教程

" main " {
    # 若为false,将使整个模组无效化
    B:food.modifier.enabled=true
}

client {
    # 若为true,对空气按左键将会开启食物容器(如午餐盒)
    B:left.click.opens.food.containers=false
}


#所有对此项的修改都会在重启游戏时被清空
#(foodgroups的相关设置请查看/config/SpiceOfLife/example-food-group.json,并在/config/SpiceOfLife/目录下进行)
foodgroups {
}


server {
    # 若为true,食物恢复的饥饿值将会受营养价值影响
    B:affect.food.hunger.values=true

    # 若为true,食物恢复的饱和度将会受营养价值影响
    B:affect.food.saturation.modifiers=false

    # 注:
    # 当hunger.values为true & saturation.modifiers为false时,饱和度将会自动随着饥饿值的减少而减少(默认)
    # 当hunger.values为true & saturation.modifiers为true时,饱和度将会不成比例的进一步减少
    # 当hunger.values为false & saturation.modifiers为true时,营养价值将只会影响饱和度
    # 当hunger.values为false & saturation.modifiers为false时,营养价值将不会影响饥饿值和饱和度



    # 若为true,恢复饥饿值为负数的食物将会随着营养价值的减少而进一步减少
    # (affect.food.hunger.values必须为true才能生效)
    B:affect.negative.food.hunger.values=false

    # 若为true,恢复饱和度为负数的食物将会随着营养价值的减少而进一步减少
    # (affect.food.saturation.modifiers为true才能生效)
    B:affect.negative.food.saturation.modifiers=false

    # 若为true,玩家在超过初始食用阈值后,膳食记录将被清空
    B:clear.history.after.food.eaten.threshold.reached=false

    # 此项未设计完成,暂时被作者无效化
    D:food.containers.chance.to.drop.food=0.25

    # 食物容器内每个格子最多可以堆叠的物品数量
    I:food.containers.max.stacksize=2

    # 食用食物的最长时间上限
    # 默认最长食用时间为32.设置该项为0将会取消食用时间上限
    # (如果该项为0且food.eating.speed.modifier>0,一个营养价值为0%的食物食用时间将会变为几乎无限长)
    I:food.eating.duration.max=0

    # 若设置值大于0,则食物的食用速度将会受营养价值的影响(营养价值越低,食物食用速度越慢)
    # 食用时间计算公式 (eating_duration / (nutritional_value^eating_speed_modifier))
    D:food.eating.speed.modifier=1.0

    # 玩家膳食记录的记录上限
    I:food.history.length=12

    # 若为true,玩家每次死亡后膳食记录将不会被重置
    B:food.history.persists.through.death=false

    # 食物恢复饥饿值时,小数点的舍入计算模式
    # 可选模式: 'round'(四舍五入), 'floor'(向下取整), 'ceiling'(向上取整)
    S:food.hunger.rounding.mode=round

    # 此处为营养价值计算式
    # 使用EvalEx表达式解析器
    # 参考 https://github.com/uklimaschewski/EvalEx 获取 语法/函数 文档
    # 
    # 可用变量:
    #   count : 膳食记录内,食物的食用次数
    #   hunger_count : 膳食记录内,食物恢复的总饥饿值(1饥饿值=1/2鸡腿)
    #   saturation_count : 膳食记录内,食物恢复的总饱和度
    #   max_history_length : 玩家膳食记录的记录上限
    #   cur_history_length : 当前玩家膳食记录的记录数
    #   food_hunger_value : 食物默认恢复的饥饿值
    #   food_saturation_mod : 食物默认恢复的饱和度
    #   cur_hunger : 玩家当前饥饿值
    #   cur_saturation : 玩家当前饱和度
    #   total_food_eaten : 玩家食用食物的总次数
    #   food_group_count : 该食物一共属于几个FoodGroups
    #   distinct_food_groups_eaten : 玩家当前膳食记录内,不同FoodGroups的数量
    #   total_food_groups : 有效的FoodGroups的总数
    #   exact_count : 被膳食记录记录过的,玩家食用食物的总次数
    # 
    S:food.modifier.formula=MAX(0, (1 - count/12))^MIN(8, food_hunger_value)

    # 若为true,将会在每个玩家出生时给予一本膳食记录书
    B:give.food.journal.as.starting.item=false

    # 若为true,将会在每个玩家超过初始食用阈值时给予一本膳食记录书
    # (若give.food.journal.as.starting.item为true则不会再额外给予)
    B:give.food.journal.on.dimishing.returns.start=false


    # 一个新玩家食用食物多少次后,mod开始生效
    I:new.player.food.eaten.threshold=6

    # 若为true,任何不在foodgroups内的食物都将不受mod影响
    # (foodgroups相关请参考/config/SpiceOfLife/example-food-group.json)
    B:use.food.groups.as.whitelists=false

    # 若为true,膳食记录上限(food.history.length)将会由"恢复饥饿值总值"而非"食用次数"决定
    # 举例: 若膳食记录上限为12,在开启此项后,食用2个6饥饿值食物 或 食用3个4饥饿值食物 或 食用 12个1饥饿值食物都会更新膳食记录
    # (此处1饥饿值=1/2个鸡腿)
    B:use.hunger.restored.for.food.history.length=false

    # 若为true,膳食记录上限(food.history.length)将会由"玩家时间"而非"食用次数"决定
    # 举例: 若膳食记录上限为12,在开启此项后,每过12个游戏日都会更新膳食记录
    # (use.hunger.restored.for.food.history.length为false才能生效)
    # (此处的"时间"为客户端时间而非服务器时间,即只有玩家在线时才会计算时间)
    B:use.time.for.food.history.length=false

    # 若为true,膳食记录上限(food.history.length)将会由"服务器时间"而非"食用次数"决定
    # (use.hunger.restored.for.food.history.length为false才能生效)
    # (use.time.for.food.history.length must为true时才会生效)
    # (此处的"时间"为服务器时间,即玩家离线时也会计算时间)
    B:use.time.progress.time.while.logged.off=false
}