游戏达人
  
- 贡献度
- 80
- 金元
- 19062
- 积分
- 2236
- 精华
- 1
- 注册时间
- 2010-11-27
|
本帖最后由 yzzn2009 于 2014-1-15 12:23 编辑
授人以渔:详解“高尔夫球”的全部语句
高尔夫球(用蜗牛壳碎片种高尔夫球,锤子作球杆,将球打进兔子洞吧)
用记事本打开游戏目录\data\scripts\prefabs\slurtle_shellpieces.lua文件,在inst:AddComponent("inventoryitem")的下一行插入以下内容:
local function OnDeploy (inst, pt) 部署标签deployable调用的function,其中inst为物品自己,在slurtle_shellpieces(蜗牛壳)文件中,指的就是蜗牛壳。pt为位置坐标
local golf = SpawnPrefab("slurtle_shellpieces") 声明golf(我自己取的名字,是高尔夫球的英文)是生一个蜗牛壳
golf.Transform:SetPosition(pt.x, pt.y, pt.z) 高尔夫球的位置为pt.x, pt.y, pt.z,其中pt.x是蜗牛壳的横坐标,pt.y是蜗牛壳的高坐标,pt.z是蜗牛壳的纵深坐标
golf.AnimState:SetBank("bulb") 设定高尔夫球使用荧光果模型
golf.AnimState:SetBuild("bulb") 设定高尔夫球使用荧光果贴图
golf.AnimState:PlayAnimation("idle") 高尔夫球播放闲置(idle)动画,注意许多物品都需要播放动画才会显示
golf.Transform:SetScale(0.8, 0.8, 0.8) 高尔夫球的大小为宽、高、厚度都是荧光果模型的0.8倍
golf.components.inventoryitem.canbepickedup = false 这是让高尔夫球使用inventoryitem标签的参数,作用是不可被拿起,因为蜗牛壳原来就加入了inventoryitem标签,所以直接可以调用参数,否则如果只有参数,没有加入标签,游戏会跳出
MakeSmallBurnable(golf) 高尔夫球可以被烧掉,会显示小火效果
golf:AddComponent("perishable") 高尔夫球加入腐烂标签(perishable)
golf.components.perishable:SetPerishTime(TUNING.PERISH_ONE_DAY) 高尔夫球腐烂时间为1天
golf.components.perishable:StartPerishing() 高尔夫球开始腐烂计时
golf.components.perishable.onperishreplacement = "ash" 高尔夫球腐烂后变成灰烬(ash)
golf:AddComponent("workable") 高尔夫球加入可工作标签(workable)
golf.components.workable:SetWorkAction(ACTIONS.HAMMER) 高尔夫球被工作的方式是锤子砸
golf.components.workable:SetWorkLeft(10) 高尔夫球被砸10次后消失
golf.components.workable:SetOnFinishCallback(function(golf) 高尔夫球被砸毁后运行一个function,声明主语为golf
SpawnPrefab("ground_chunks_breaking").Transform:SetPosition(golf.Transform:GetWorldPosition()) 生破碎效果在高尔夫的位置上
golf:Remove() 删除高尔夫球
end ) 结束高尔夫球被砸毁后运行的function
golf.components.workable:SetOnWorkCallback(function(golf) 高尔夫球被工作时运行一个function,声明主语为golf
local pt2 = Vector3(golf.Transform:GetWorldPosition()) 声明pt2为环绕golf的位置
local pos = Vector3(GetPlayer().Transform:GetWorldPosition()) 声明pos为环绕主角(GetPlayer())的位置
golf.Physics:SetMotorVelOverride((pt2.x-pos.x)*13,0,(pt2.z-pos.z)*13) 高尔夫球加入马达,具体方向为,横坐标是高尔夫球的横坐标减主角的横坐标再乘13,竖坐标为0,也就是贴这地,纵深坐标为高尔夫球的纵深坐标减主角的纵深坐标再乘13,这样做的结果是,让高尔夫球被打击后,向主角的相反位置移动
golf:DoTaskInTime(0.2, function() golf.Physics:ClearMotorVelOverride() end ) 高尔夫球0.2秒后运行一个function,清除高尔夫球的马达,也就是让它停止运行
GetPlayer().components.sanity:DoDelta(5) 主角加5点脑
end ) 结束高尔夫球被工作时运行的function
golf:DoPeriodicTask(.05, function(golf) 高尔夫球每0.05秒运行一次function,声明主语为golf
local pos2 = Vector3(golf.Transform:GetWorldPosition()) 声明pos2为环绕高尔夫球的位置
local ents = TheSim:FindEntities(pos2.x,pos2.y,pos2.z, 0.5) 声明范围是寻找环绕高尔夫球的位置0.5的区域
for k,v in pairs(ents) do 这是代迭器,可以搜索范围内的所有物品,这里是搜索上一句的范围
if v.prefab == "rabbithole" then 如果目标的物品(v.prefab)等于兔子洞
GetPlayer().SoundEmitter:PlaySound("dontstarve/wilson/use_axe_tree") 主角播放砍树的声音,这是为高尔夫球掉在洞里配的音效
golf:Remove() 高尔夫球被删除
GetPlayer().components.sanity:DoDelta(50) 主角加50点脑
end 结束如果目标的物品(v.prefab)等于兔子洞这段
end 结束代迭器
end ) 结束高尔夫球每0.05秒运行一次的function
golf:AddTag("golfs") 高尔夫球加golfs标签,这个名称是我起的,为了在读档时让它区别于原有的蜗牛壳,打上的标记
inst.components.stackable:Get():Remove() 删除一堆蜗牛壳中的一个
end 结束部署标签deployable调用的function
inst:AddComponent("deployable") 蜗牛壳加入部署标签deployable
inst.components.deployable.ondeploy = OnDeploy 蜗牛壳部署时调用名为OnDeploy的function
local function onsave(inst, data) 当存档时运行的function,声明的主语中,inst是蜗牛壳本身,data为存档
if inst:HasTag("golfs") then 如果蜗牛壳有golfs标签
data.golfs = true 存档中golfs标签等于真实
end 结束如果蜗牛壳有golfs标签这段
end 结束当存档时运行的function
local function onload(inst, data) 当读档时运行的function,声明的主语中,inst是蜗牛壳本身,data为存档
if data and data.golfs then 如果有存档且存档有golfs标签
inst.AnimState:SetBank("bulb") 设定蜗牛壳使用荧光果模型,以下都与开始部分的内容基本一致,只是主语不同,用在读档时把蜗牛壳变成高尔夫球
inst.AnimState:SetBuild("bulb") 设定蜗牛壳使用荧光果贴图
inst.AnimState:PlayAnimation("idle") 蜗牛壳播放闲置(idle)动画
inst.Transform:SetScale(0.8, 0.8, 0.8) 蜗牛壳的大小为宽、高、厚度都是荧光果模型的0.8倍
inst.components.inventoryitem.canbepickedup = false 蜗牛壳不可被拿起
MakeSmallBurnable(inst) 蜗牛壳可以被烧掉,会显示小火效果
inst:AddComponent("perishable") 蜗牛壳加入腐烂标签(perishable)
inst.components.perishable:SetPerishTime(TUNING.PERISH_ONE_DAY) 蜗牛壳腐烂时间为1天
inst.components.perishable:StartPerishing() 蜗牛壳开始腐烂计时
inst.components.perishable.onperishreplacement = "ash" 蜗牛壳腐烂后变成灰烬(ash)
inst:AddComponent("workable") 蜗牛壳加入可工作标签(workable)
inst.components.workable:SetWorkAction(ACTIONS.HAMMER) 蜗牛壳被工作的方式是锤子砸
inst.components.workable:SetWorkLeft(10) 蜗牛壳被砸10次后消失
inst.components.workable:SetOnFinishCallback(function(inst) 蜗牛壳被砸毁后运行一个function,声明主语为golf
SpawnPrefab("ground_chunks_breaking").Transform:SetPosition(inst.Transform:GetWorldPosition()) 生破碎效果在高尔夫的位置上
inst:Remove() 删除蜗牛壳
end ) 结束蜗牛壳被砸毁后运行的function
inst.components.workable:SetOnWorkCallback(function(inst) 蜗牛壳被工作时运行一个function,声明主语为golf
local pt2 = Vector3(inst.Transform:GetWorldPosition()) 声明pt2为环绕golf的位置
local pos = Vector3(GetPlayer().Transform:GetWorldPosition()) 声明pos为环绕主角(GetPlayer())的位置
inst.Physics:SetMotorVelOverride((pt2.x-pos.x)*13,0,(pt2.z-pos.z)*13) 蜗牛壳加入马达,具体方向为,横坐标是蜗牛壳的横坐标减主角的横坐标再乘13,竖坐标为0,也就是贴这地,纵深坐标为蜗牛壳的纵深坐标减主角的纵深坐标再乘13
inst:DoTaskInTime(0.2, function() inst.Physics:ClearMotorVelOverride() end ) 蜗牛壳0.2秒后运行一个function,清除蜗牛壳的马达,也就是让它停止运行
GetPlayer().components.sanity:DoDelta(5) 主角加5点脑
end ) 结束蜗牛壳被工作时运行的function
inst:DoPeriodicTask(.05, function(inst) 蜗牛壳每0.05秒运行一次function,声明主语为golf
local pos2 = Vector3(inst.Transform:GetWorldPosition()) 声明pos2为环绕蜗牛壳的位置
local ents = TheSim:FindEntities(pos2.x,pos2.y,pos2.z, 0.5) 声明范围是寻找环绕蜗牛壳的位置0.5的区域
for k,v in pairs(ents) do 这是代迭器,可以搜索范围内的所有物品,这里是搜索上一句的范围
if v.prefab == "rabbithole" then 如果目标的物品(v.prefab)等于兔子洞
GetPlayer().SoundEmitter:PlaySound("dontstarve/wilson/use_axe_tree") 主角播放砍树的声音,这是为蜗牛壳掉在洞里配的音效
inst:Remove() 蜗牛壳被删除
GetPlayer().components.sanity:DoDelta(50) 主角加50点脑
end 结束如果目标的物品(v.prefab)等于兔子洞这段
end 结束代迭器
end ) 结束蜗牛壳每0.05秒运行一次的function
inst:AddTag("golfs") 蜗牛壳加golfs标签
end 结束如果有存档且存档有golfs标签这段
end 结束当读档时运行的function
inst.OnSave = onsave 蜗牛壳存档运行名为的function
inst.OnLoad = onload 蜗牛壳读档运行名为的function
“高尔夫球”修改代码的全部语句及解释就在上面,我设计这段代码的思路是,当拿1个蜗牛壳种在地上时,删除这个蜗牛壳,生一个新的蜗牛壳,将它的外形变成0.8倍大小的荧光果,并为这个变种的蜗牛壳赋予一系列功能,比如用锤子砸时会移动;比如1天后会烂(找不到高尔夫球时不会长期占内存);比如自动搜索身边有没有兔子洞,如果有就消失等。这样就可以用蜗牛壳种出高尔夫球了,但存档退出再读档后,高尔夫球将再次变回蜗牛壳,所以要为蜗牛壳写存读档运行的function,让蜗牛壳读档时,如果发现它带有golfs的标签,则再次将外形、功能加入,变成高尔夫球,就可以完美运行了。
以上内容是“授人以渔”的第二期,比第一期的解释原文件语句更深入一些了。“高尔夫球”用的是我称为“变种技术”的方法制作的,近期修改技巧中大量运用了“变种技术”,优点是可以生出原游戏没有的物品,而且不影响原物品使用;缺点是一段代码需要写两遍,只是主语不同,比较浪费时间,而且作者的思路要清晰,否则容易混淆。如果你能看懂以上内容,则会在自主修改的路上大幅迈进一步,如果看不懂也没关系,因为个别语句放在一些地方也会起到作用(比如主角加脑的语句)。我唯一的建议是:不要怕试错,没有人一口气写出来的代码是完全没有问题的,都是一遍遍出错,最终试出正确路线的,只要备份好原文件和存档就可以了
|
|