# 在场景中加入事件
前面已经学会了如何在大地图中加入新的场景地图。有了场景地图当然是在场景地图中加入事件,认加入的场景融入金庸世界,SO接下来就是学习如何在场景中加入新的事件。黑山群侠传的事件是采用CEvent模式,而龙的传人是直接使用的UPedit中的事件编辑器。两者有点区别,对于开发者来说就是使用不同的方式增加,修改,删除事件。黑山中加入事件过程如下。
## 学学已经有的事件
黑山群侠传的事件文件为Lua脚本,存放位置是游戏主目录/SCRIPT/CEvent/目录下,打开此目录可以看到有8651个事件。所以如果你要新加事件就可以从8652开始,我为了做一个区分从10000开始加事件。可以查看其它事件,学习如何加入新事件,每个场景地图中都会有很多事件,比如jymain.lua中非杨过玩家创建角色后就显示的通过`CallCEvent(691)`调用的SCRIPT/CEvent/691.lua,打开691.lua可以看下做了什么。
```bash
--OEVENTLUA[691] = function()
--instruct_66(42)
-- 设定小村事件0事件属性
instruct_3(-2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
-- 设定当前人物在子场景位置, 也就是主角在小村中的位置
instruct_19(16, 31)
-- 设定人物向左上移动
instruct_40(2)
instruct_0()
-- 从一个位置移动到另外一个位置
instruct_30(16, 31, 9, 31)
instruct_0()
-- 黑屏
instruct_14()
-- 更改小村62号事件位置显示人物,8250为北丑,这里的贴图编号需要除以2才是实际的
场景图号
instruct_3(-2, 62, 0, 0, 0, 0, 0, 8250, 8250, 8250, -2, -2, -2)
instruct_3(-2, 4, 0, 0, 0, 0, 0, 0, 0, 0, -2, -2, -2)
instruct_0()
instruct_3(-2, 2, 1, 0, 690, 0, 0, 6086, 6086, 6086, -2, -2, -2)
instruct_0()
-- 添加物品
instruct_32(174, 400)
instruct_0()
instruct_32(234, 1)
instruct_0()
instruct_32(182, 1)
instruct_0()
-- 设置2个位置显示人物,南贤与北丑
instruct_3(-2, 4, 1, 0, 695, 0, 0, 8250, 8250, 8250, -2, -2, -2)
instruct_3(-2, 3, 1, 0, 694, 0, 0, 5098, 5098, 5098, -2, -2, -2)
instruct_3(-2, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
instruct_3(-2, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
-- 一些场景设置不能进入
instruct_39(19)
instruct_39(101)
instruct_39(36)
instruct_39(28)
instruct_39(93)
instruct_0()
instruct_13()
--end
```
上面都是通过调用各种命令函数实现某种功能,其中出现最多的就`instruct_0()`清除对话显示,`instruct_3()`更改场景地图中特定事件属性(比如特定位置贴图,是否可进行事件等),`instruct_39()`关闭场景进入功能。这些命令都是在jymain.lua中实现的,具体函数也都有注释,注释不清楚的猜一下也一般都知道在干什么。
## 依葫芦画瓢
1. 先来个最简单的事件。在SCRIPT/CEvent.lua下面加入一个新文件10000.lua。在10000.lua中加入下面代码。
```bash
TalkEx("你好!!", 1, 0)
TalkEx("你是谁?", 0, 1)
do return end
```
2. 场景地图中加入事件:打开UPedit,打开自己新加的场景地图或要加入事件的场景地图,操作层选择事件层。指定位置点击鼠标右键加入事件,设置事件属性。能否通过表示能否激活,事件编号可以不改,事件1填10000就是上面创建的脚本事件,这里使用静态贴图,因此开始贴图/结束贴图/开始贴图都填写同一个数字就可以了,这个数字就是贴图查看中查到的贴图编号 * 2。注意这里贴图编号需要 * 2,因为底层C会将这个数字除以2再去找贴图编号。完成后保存,注意新创建一个新存档确定新加入的事件是否成功添加到场景地图上。
3. 我按上面步骤添加事件后,事件是添加成功了,显示的文字不是我脚本中加入的文字,因此又出现了一个脚本中文字编码问题。使用记事本打开10000.lua发现编码格式是utf8,需要另存为ANSI游戏中就可以完美显示了。
4. 前面的对话发现人物是胡斐,这里的对话人物又是如何选择的拉。用UPedit查看就可以看到胡斐的编号是1,换一个张三丰编号5或灭绝编号6可以试试,人物就会做相应改变。
## 下面再学习下其它事件
1. 宝箱获取物品
```bash
instruct_2(112, 1) --得到一本罗汉拳
Cls() --清屏
instruct_3(-2, -2,0,0,0,0,0,2492,2492,2492,-2,-2,-2) --箱子打开且不能再得到物品
do return end
```
2. 请求张三丰加入
```bash
if instruct_9() then --要求加入
Cls() --清屏
TalkEx("我正在寻找一些书,要在江湖上到处走动,张真人如果不嫌弃,不妨与小弟同行,也为你无聊人生添加一些乐趣。", 0, 5) --对话
Cls() --清屏
TalkEx("好吧,反正生活无趣。", 5, 0) --对话
Cls() --清屏
if instruct_20() then --判断队伍是否已满
Cls() --清屏
TalkEx("你的队伍已满,我就直接去小村吧。", 5, 0) --对话
Cls() --清屏
instruct_3(-2, -2,0,0,0,0,0,0,0,0,0,-2,-2) --修改场景事件
instruct_3(70, 107,1,0,10002,0,0,5380,5380,5380,-2,-2,-2) --修改场景事件
Cls() --清屏
do return end --无条件结束事件
end
instruct_10(5) --加入队伍
Cls() --清屏
instruct_14() --场景变黑
instruct_3(-2, -2,0,0,0,0,0,0,0,0,0,-2,-2) --修改场景事件
Cls() --清屏
instruct_13() --场景变亮
Cls() --清屏
do return end --无条件结束事件
end
TalkEx("你太厉害了,在下告辞。", 0, 5) --对话
Cls() --清屏
instruct_3(-2, -2,-2,-2,2,-2,-2,-2,-2,-2,-2,-2,-2) --修改场景事件
do return end
```
3. 商店买东西
```bash
instruct_64() --小宝买东西
Cls() --清屏
do return end
-- 进入instruct_64()看看具体细节
--无酒不欢:商店数据
function instruct_64()
-- 商家头像编号
local headid = 223
local id = -1
-- 找到当前是那家客栈
for i = 0, JY.ShopNum - 1 do
if CC.ShopScene[i].sceneid == JY.SubScene then
id = i
end
end
if id < 0 then
return
end
TalkEx("这位小哥,看看有什么需要的,小店卖的东西价钱绝对公道。", headid, 0,"商家")
-- 获取当前商家物品信息
local menu = {}
for i = 1, 6 do
local thingid = JY.Shop[id]["物品" .. i]
if thingid ~= -1 then
menu[i] = {}
menu[i][1] = string.format("%-12s %5d", JY.Thing[thingid]["名称"], JY.Shop[id]["物品价格" .. i])
menu[i][2] = nil
if JY.Shop[id]["物品数量" .. i] > 0 then
menu[i][3] = 1
else
menu[i][3] = 0
end
end
end
--3书以前没有混元
if JY.Base["天书数量"] < 3 and id == 0 then
menu[5][3] = 0
end
-- 准备绘制商品显示界面
local x1 = (CC.ScreenW - 9 * CC.DefaultFont - 2 * CC.MenuBorderPixel) / 2
local y1 = (CC.ScreenH - 5 * CC.DefaultFont - 4 * CC.RowPixel - 2 * CC.MenuBorderPixel) / 2
-- 返回选择物品序号
local r = ShowMenu(menu, #menu, 0, x1, y1, 0, 0, 1, 1, CC.DefaultFont, C_ORANGE, C_WHITE)
-- 下面数据已经没有使用了
--[[
local itemJC = {}
itemJC[0] = {38, 12, 28, 14, 68, -1, 400, 100, 80, 500, 6000, -1}
itemJC[1] = {48, 0, 29, 15, 90, -1, 400, 100, 100, 500, 1000, -1}
itemJC[2] = {54, 3, 32, 16, 159, -1, 400, 100, 100, 600, 600, -1}
itemJC[3] = {63, 7, 33, 17, 175, -1, 400, 200, 120, 600, 800, -1}
itemJC[4] = {27, 9, 34, 22, 69, -1, 2000, 50, 130, 400, 8000, -1}]]
if r > 0 then
-- 穷逼没钱
if instruct_31(JY.Shop[id]["物品价格" .. r]) == false then
TalkEx("非常抱歉,你身上的钱似乎不够。", headid, 0,"商家")
-- 买东西成功
else
JY.Shop[id]["物品数量" .. r] = JY.Shop[id]["物品数量" .. r] - 1
instruct_32(CC.MoneyID, -JY.Shop[id]["物品价格" .. r])
instruct_32(JY.Shop[id]["物品" .. r], 1)
TalkEx(JY.Person[0]["外号"].."买了小店的东西,保证绝不后悔。", headid, 0,"商家")
end
end
-- 这里的d_leave我也还没有猜出来是干什么的
for i,v in ipairs(CC.ShopScene[id].d_leave) do
instruct_3(-2, v, 0, -2, -1, -1, 939, -1, -1, -1, -2, -2, -2)
end
```
## 看一条完整的天书事件线
1. UPedit找到65唐诗山洞,点击事件层,点击编号为1的事件,确定相关脚本为39.lua,打开看看
```bash
-- 可以看到对话还可以以instruct_1(179, 0, 1)方式进行,其中179是UPedit中的对话事件编辑器中的对话引用,179对话内容是:你是谁,在这做什么
instruct_1(179,0,1); -- 1(1):[AAA]说: 你是谁,在这做什么?
instruct_0(); -- 和前面的Cls()一样
say() -- 以故事形式显示文字
-- 教程说要70道德才能加入,但看代码没有对道德进行判断的地方
-- 这里的instruct_9()带参数,但实际上jymain.lua中的instruct_9()不带参数,应当是旧版本需要参数,后面的instruct_20也是不需要参数的
-- 这里还有个加道德的命令instruct_37()
if instruct_9(0,93) ==true then -- 9(9):是否要求加入?否则跳转到:Label0
instruct_1(191,0,1); -- 1(1):[AAA]说: 看你也无家可归,和我一起走吧,路上也
照应。
instruct_0(); -- 0(0)::空语句(清屏)
if instruct_20(32,0) ==false then -- 20(14):队伍是否满?是则跳转到:Label2 instruct_37(2); -- 37(25):增加道德2
instruct_1(192,37,0); -- 1(1):[狄云]说: 好吧!如果你不怕被我这个不幸之人连
话。
instruct_3(-2,-2,0,0,0,0,0,0,0,0,0,0,0); -- 3(3):修改事件定义:当前场景
场景事件编号
instruct_3(104,81,1,0,956,0,0,7232,7232,7232,-2,-2,-2); -- 3(3):修改事
义:场景[钓鱼岛]:场景事件编号 [81]
instruct_10(37); -- 10(A):加入人物[狄云]
instruct_0(); -- 0(0)::空语句(清屏)
-- 接下来的埋葬丁典事件8012开启
instruct_3(62,13,1,0,0,0,0,6700,6700,6700,0,0,0); --修改破庙事件
instruct_3(62,12,1,0,8012,0,0,6696,6696,6696,0,0,0); --修改破庙事件
do return end
end
instruct_37(2); -- 37(25):增加道德2
say("你的队伍已满,我就直接去小村吧。",37,0);
instruct_3(-2,-2,0,0,0,0,0,0,0,0,0,0,0); -- 3(3):修改事件定义:当前场景:当前场>景事件编号
instruct_3(104,81,1,0,956,0,0,7232,7232,7232,-2,-2,-2); -- 3(3):修改事件定义:>场景[钓鱼岛]:场景事件编号 [81]
instruct_3(70, 7,1,0,125,0,0,5090,5090,5090,-2,-2,-2) --修改场景事件
instruct_3(70, 8,1,0,125,0,0,5092,5092,5092,-2,-2,-2) --修改场景事件
instruct_0(); -- 0(0)::空语句(清屏)
-- 队伍满了,狄云去小村还是会开启埋葬丁典事件
instruct_3(62,13,1,0,0,0,0,6700,6700,6700,0,0,0); --修改破庙事件
instruct_3(62,12,1,0,8012,0,0,6696,6696,6696,0,0,0); --修改破庙事件
do return end
end
```
2. 看了上面的发现加狄云没有道德要求,那么看下加萧中慧有没有道德限制。找到河洛客栈加萧中慧事件脚本200.lua,关键看下要求加入部分,可以明显看到60道德判断。这里队伍如果已经满了,萧中慧只会吐槽一句不会自己去小村,估计是因为如果带她去小村会触发种树事件,如果她自己去小村了,就容易出BUG了。看了这里完全可以给狄云加入条件加上70道德判断。200.lua开始还判断也队伍中有没有小田田,有小田田会调戏萧咪咪,还会打一架。打架也简单,`WarMain(132, 0)`。UPedit中找到战斗数据编辑中的132,就是和小田田打萧中慧。旁边还会显示战斗地图。
```bash
if instruct_9() then --是否要求加入
TalkEx("得红颜相伴,闯荡江湖,真*乃平生快事啊。", 0, 1) --对话
Cls() --清屏
if instruct_28(0,60,200) then --判断品德是否在范围之内
instruct_26(1,3,1,0,0) --修改场景事件
instruct_26(1,4,1,0,0) --修改场景事件
instruct_26(1,5,1,0,0) --修改场景事件
instruct_3(104, 64,1,0,978,0,0,7248,7248,7248,-2,-2,-2) --修改场景事件
instruct_37(1) --增加品德
if instruct_20() == false then --判断队伍是否已满
instruct_14() --场景变黑
instruct_3(-2, -2,0,0,0,0,0,0,0,0,0,0,0) --修改场景事件
Cls() --清屏
instruct_13() --场景变亮
JY.Person[77]["资质"] = JY.Person[0]["资质"]
--萧中慧选择内力属性
local r = JYMsgBox("请选择", "请选择萧中慧的内力属性", {"阴内","阳内","调和"}, 3, 77)
if r == 1 then
instruct_49(77, 0)
Cls() --清屏
elseif r == 2 then
instruct_49(77, 1)
Cls() --清屏
elseif r == 3 then
instruct_49(77, 2)
Cls() --清屏
end
instruct_2(162, 1)
Cls() --清屏
instruct_10(77) --加入队伍
do return end --无条件结束事件
end
TalkEx("你的队伍满了啊,真没有诚意。", 77, 0) --对话
Cls() --清屏
do return end --无条件结束事件
end
TalkEx("哎呀,不行,我爸爸说了,*闯荡江湖要和正人君子在一*起,你……,还是算了吧。", 77, 0) --对话
Cls() --清屏
do return end --无条件结束事件
end
Cls() --清屏
```
|