【CLEO编写指南】CLEO爱好者的圣经指南
本帖最后由 为主的祥助 于 2013-9-7 17:55 编辑作者:GTAF ZAZ
原地址:http://www.gtaforums.com/index.php?showtopic=403594
翻译参与人员:为主的祥助 幸运克苏鲁
部分地方会在原文基础加上点自己的理解
未经许可 谢绝转载
更多教程欢迎访问:计算机/游戏/数码/生活图文解说
【CLEO编写指南】 一:认识Sanny Builder
CLEO编写一般需要用到Sanny Builder(以下简称SB)
第一步:下载最新版本的Sanny Builder: http://sannybuilder.com/
或者下载【下载】SB汉化版+最小启动包 有汉化版SB下载地址:http://game.55660.net/thread-138-1-1.html
安装SB,选择游戏目录和INI目录(INI目录为Sanny
Builder/Data/sa/SASCM.INI)
打开Sanny Builder,点击菜单栏-文件-新建,打开一个新的空白页面
复制如下脚本源码
并把它插入到新的页面
代码如下
复制代码
{$CLEO .cs}
:DEMOTEXT
03A4: name_thread "DEMO"
wait 1000
:DEMOTEXT_1
wait 0
if
0256: player $PLAYER_CHAR defined
004D: jump_if_false @DEMOTEXT_1
if
00E1: key_pressed 0 17
004D: jump_if_false @DEMOTEXT_1
00BA: text_styled 'FEM_OK' 1000 ms 1
0A93: end_custom_thread
把他们粘贴到空白文本页面。
编译这个脚本
汇编F5:打开一个已有的CS文件并反编译为TXT文件
编译F6:编译写好的CS文件
编译+复制F7: 编译并且把生成的CS文件复制到游戏目录/CLEO目录下
运行圣安地列斯:运行游戏
{$CLEO .cs} = Cleo 指令会被编译为 以*.cs为后缀的格式文件
而DEMOTEXT.txt 会被保存 并且编译为 DEMOTEXT.cs
如果CLEO运行库没有安装,在SB的右下角处会有红色的安装提示.点击此处SB会快速安装完成
也可以前往http://cleo.sannybuilder.com下载最新版CLEO主程序安装器
安装最新版CLEO4主程序,勾选更新Sanny Builder的Opcode库,更新运行库。
______________________________________________________________________________________
如果编译成功完成,你会看到如下提示框
显示相关信息
最下面的部分 Largest Script显示的是脚本文件大小
其他的部分属于Main.scm的编译信息
进入游戏测试此脚本,点击0键或Ctrl键按键来显示TEXT的文本信息
使用Opcode:
所有条目以Opcode显示
Opcode是脚本功能的程序编码
他们看起来就像是命令指令
比如
复制代码
023C: load_special_actor 'PLAYER1' as 1 // models 290-299
023C就是opcode,基本上每一句语句都带有一个opcode
不使用Opcode
简写越多,脚本更加小, 可能更加清晰
特别是004D: jump_if_false 可以简写为jf
但并不是所有Opcode都可以简写. 更多编码会被广泛的使用以此运行相应的功能
比如:
jf @CARSL_6535
你使用还是不使用Opcode并不会有什么影响
SB还是会正常编译
一个不使用Opcode汇编的特殊方法是把Opcode Based命令翻译为
Classes 和 Keywords
详情参阅Sannybuilder-帮助主题文件: Coding >> Classes
下面是使用Opcode编译的代码:
00AB: put_car 22@ at -1577.942 52.6333 40.0
此句不使用Opcode就如下显示:
Car.PutAt(22@, -1577.942, 52.6333, 40.0)
编码的意义 by the class entries
Car= class-name
PutAt= class-member
name and member are combined with a dot in the middle
22@ = class-owner
SB可以使用Keywords(关键词)来替代Opcode
Opcode = Keyword
_____________
0001: = wait
00d6: = if
004d: = else_jump
004d: = jf
0002: = jump
0051: = return
0050: = gosub
016a: = fade
01B6: = set_weather
03a4: = thread
04BB: = select_interior
0417: = start_mission
00d8: = mission_cleanup
0317: = increment_mission_attempts
004D: jump_if_false @MAIN_6
可以写为
jf @MAIN_6
或者else_jump @MAIN_6
你还可以合并为
004D: jf @MAIN_6 【CLEO编写指南】 二:数据类型简介
CLEO中经常可以看到@等字符
@ 有2种不同功能:
一: 跳转到相应的标签接入口
004D: jump_if_false @SAVE_5
0050: gosub @SAVE_14
0002: jump @SAVE_1
2.链接局部变量
游戏中的物件需要 一个类似身份登记的办法 来处理执行
这个身份登记可以理解为变量
局部变量由@和数字组合而成
0@, 1@, ... 30@ 从
0@ 到 31@ 是允许的 , 32@ 和33@ 用于计时器,cs 文件中最多只能用到33@
如下
1@ 定义 一个车辆的创建产生
复制代码
014B: 1@ = init_parked_car_generator #PCJ600 0 17 1 alarm 0 door_lock 0 0 10000 at 2490.0 -1682.0 13.5 angle 90.0
1@ 这样就可以用于局部变量中了(此处指代替这辆车)
复制代码
014C: set_parked_car_generator 1@ cars_to_generate_to 10
$ 用来链接全局变量
游戏中的物件需要 一个类似身份登记的办法 来处理执行,这个身份登记可以理解为变量。
全局变量是以$ 为标志和一些单词,数字之类组成的。在CLEO脚本中使用全局变量可能会导致游戏BUG和崩溃
只有 $PLAYER_CHAR, $PLAYER_ACTOR, $ONMISSION 才会正常运行
全局, 局部, 何解?
全局变量运用于Mani.scm中以此在不同游戏线程中相互连接
局部变量同样也是运用于main.scm中但是他们不能在不同游戏线程中相互连接
你可以在线程中用局部变量创建一辆汽车标记为1@同时在main.scm的其他线程中使用1@
1@ = create_car
你有2种不同的车辆,存在于不同的线程命令中
你可以在一个线程中使用全局变量创建一辆汽车但是不能够在其他线程中再次使用同一个全局变量来创建这辆汽车
$mycar5 = create_car
但是你可以从main.scm的其他线程中调用这辆汽车
全局变量是可储存的,而局部变量则不行
但是在CLEO脚本中使用全局变量会导致游戏BUG和崩溃
只有 $PLAYER_CHAR, $PLAYER_ACTOR, $ONMISSION 才不会
简单来说,全局变量在任何线程中都能够使用,局部变量只能用于单个线程中,需要预先定义。
#作为加载模型名称的接入口标志
复制代码
0247: load_model #BMYCG
0247: load_model #HMYCM
0247: load_model #SWATVAN
0247: load_model #M4
0247: load_model #COLT45
CLEO只能调用已经定义存储于vehicles.ide, peds.ide or default.ide的内容
其他的模型需要使用他们的ID编号
'...' 短型字符串是用来插入字母或编号 就像GTX entrynames 或者 特殊 IPL entries的名称
复制代码
03A4: name_thread 'MAIN'
0917: audio_zone 'BEACH' enable_sound 0
00BA: show_text_styled GXT 'INTRO_1' time 1000 style 2
0299: activate_garage 'MODLAST'
07FB: set_interior 'GYM1' access 1 // Ganton Gym
0390: load_txd_dictionary 'LD_BEAT'
076C: set_zone 'GAN1' gang 1 density_to 25
"..."长型字符串是用来插入字母或编号比如动作- IFP 文件名称, 身体部位名称, particel 名称
复制代码
087B: set_player $PLAYER_CHAR clothes_texture "PLAYER_FACE" model "HEAD" body_part 1
038F: load_texture "DOWN" as 1 // Load dictionary with 0390 first
0605: actor -1 perform_animation_sequence "DAN_LOOP_A" IFP_file "DANCING" 4.0 loop 1 0 0 0 time -1 // versionA
0674: set_car_model #GREENWOO numberplate "GROVE4L_"
0245: set_actor 5@ walk_style_to "GANG2"
064B: 25@ = create_particle "EXPLOSION_MOLOTOV" at 2010.0 -1610.0 16.5 type 1
@s - local-string-variable(局部线程变量)
复制代码
05AA: 5@s = 'FEM_OK'
00BC: show_text_highpriority GXT 5@s time 10000 flag 1
s$ - global-string-variable(全局线程变量)
注意在CLEO脚本中使用全局变量 会导致游戏BUG或者崩溃
复制代码
05A9: s$Actor_Speech_GXT_Reference = 'CATX_UA' // ~z~Carl, you are a f*cking idiota!
00BC: show_text_highpriority GXT s$Actor_Speech_GXT_Reference time 10000 flag 1
05AA: 5@s = s$Actor_Speech_GXT_Reference
00BC: show_text_highpriority GXT 5@s time 10000 flag 1
@v - local-long-string-variable(局部长型线程变量)
复制代码
06D2: 28@v = "LAPDAN1" // @v = string
0812: AS_actor $PLAYER_ACTOR perform_animation "LAPDAN_P" IFP_file 28@v 1000.0 loopA 0 lockX 0 lockY 0 lockF 1 time -1
v$ - global-long string-variable(全局长型变量)
注意在CLEO脚本中使用全局变量 会导致游戏BUG或者崩溃
复制代码
06D1: v$1225 = "Bat_block"// 16-byte strings
0605: actor $PLAYER_ACTOR perform_animation_sequence v$1225 from_file "BASEBALL" 4.0 1 0 0 0 -1 ms 本帖最后由 为主的祥助 于 2013-9-7 17:45 编辑
【 CLEO编写指南】 三:创建线程
在游戏中运行的脚本叫做线程
他们用create_thread命令或者一个定义任务的脚本定义于Main.scm中作为线程
CLEO主程序会扫描CLEO目录是否存在CS文件,如果存在,游戏就会加载这个CLEO脚本。
首先,在开头,会以CLEO指令开始
[*]{$CLEO .cs}
循环标签:
[*]:Akt
然后给线程定义一个名称
[*]03A4: name_thread 'AKT'
现在写入一个代码然后用end_custom_thread 结束线程
一切OK后进游戏测试
[*]{$CLEO .cs}
[*]:Akt
[*]03A4: name_thread 'AKT'
[*]08B2: toggle_thermal_vision 1
[*]0A93: end_custom_thread
脚本会以opcode 0A93: end_custom_thread结束
这个脚本会在每次加载存档运行或者开启新游戏后运行
脚本会以opcode 0A93: end_custom_thread结束脚本会以opcode 0A93: end_custom_thread结束
【 CLEO编写指南】 四:Sanny builder界面说明 ---由幸运克苏鲁提供
下面所涉及的工具都可以在Sanny Builder的菜单栏找到http://www.gtabbs.com/attachment/Mon_1208/145_401645_7ad0fad36ffd477.png?4
Sanny Builder可以编译CS CM或SCM三种文件,当编译时自动生成txt文件
{$CLEO .cs}表示当编译时生成xxx.cs文件
{$CLEO .cm}表示当编译时生成xxx.cm文件
SB自带工具
Coords Manager打开方式 菜单栏 >>工具>>IDE Tools>>Coords Manager
这个工具可以标出你在游戏中的XYZ的坐标位置
Opcode Search打开方式 菜单栏 >>工具>>IDE Tools>>Opcode Search
这个是Opcode 的搜索工具,如果你不知道怎样使用Opcode 语句,那么你可以使用这个工来进行搜索你需要的Opcode
http://www.gtabbs.com/attachment/Mon_1208/145_401645_a2e9cb8a34848de.jpg?137
Sanny Builder自带帮助文件
这个不用多说了吧,自带帮助文件,很有用的东西,很多东西都可以在这里面找到。
http://www.gtabbs.com/attachment/Mon_1208/145_401645_19aeb03e6deb264.jpg?81
在菜单栏的设置可以改变很多东西,这个就不做详细介绍了。http://www.gtabbs.com/images/post/smile/qq/QQ_f_wx2.gif.pagespeed.ce.Vr1pf9rB3j.gif
本帖最后由 为主的祥助 于 2013-9-7 17:49 编辑
【CLEO编写指南】 五:使用条件检测
一个环境条件检查需要最少3个Opcode
1. IF 条件:if
2. 检测条件:按键XXX
3. 反向跳转设置:否则跳转回
我们再次使用先前的脚本,但是现在我们想要切换到正常模式。因此我们使用一个环境检查,建立一个循环。
"Loop-adress"循环意味着一个跳转命令可以传达信息到先前的地址 ,我把它叫做循环地址(Loop-adress)
在这样一个循环跳转后必须等待XXX毫秒
跳转指令可以是反向跳转或者正向跳转004D: jump_if_false @akt_01
或者
0002: jump @akt_01
对于如下脚本的按键环境检查是通过按Backspace键执行的:
{$CLEO .cs}
:Akt
03A4: name_thread 'AKT'
08B2: toggle_thermal_vision 1
:Akt_01//----------------------------Loop adresse
0001: wait 0 ms
if
0AB0: key_pressed 8
004D: jump_if_false @Akt_01//--------jump instruction by negation
[*]
08B2: toggle_thermal_vision 0
0A93: end_custom_thread
【CLEO编写指南】 六:IF的使用
复制代码
[*]if
[*]00FF: actor $PLAYER_ACTOR 1 (in-sphere)near_point_on_foot 2493.5 -1682.5 13.35 radius 1.0 1.0 1.0
[*]004D: jump_if_false @Teleport_2
在条件设置中多设置几个可以判断的条件
单个条件使用 if
多个条件使用ifand
复制代码
[*]if and
[*]00DF: actor $PLAYER_ACTOR driving
[*]8119: NOT car 0@ wrecked
[*]004D: jump_if_false @AD_5
复制代码
[*]if or
[*]00E1: key_pressed 0 0
[*]00E1: key_pressed 0 1
[*]00E1: key_pressed 0 14
[*]00E1: key_pressed 0 18
[*]004D: jump_if_false @AD_7
复制代码
[*]if or
[*]8118: NOT actor 7@ dead
[*]8118: NOT actor 8@ dead
[*]004D: jump_if_false @AD_25
[*]0002: jump @AD_12
反向设置条件就是通过把Opcode 码的第一位 0 改为8,在语句前面加上not
例如:
复制代码
[*]00E1: key_pressed 0 10
和
复制代码
[*]80E1: NOT key_pressed 0 11
【CLEO编写指南】 七:逻辑线性结构
先前的脚本以opcode 0A93: end_custom_thread而结束运行,我们可以使用跳转到第一循环节取而代之,
这样整个脚本就会建立一个循环。
复制代码
[*]0002: jump @Akt_01
现在我们在循环节后加入一个常用的语句:
复制代码
[*]if
[*]0256: player $PLAYER_CHAR defined
[*]004D: jump_if_false @Akt_01
这样可以防止主角死亡或者被捕 游戏崩溃
这句检查主角状态的语句(就是判断主角处于未死亡 未被逮捕 可操控等状态)必须位于循环开始的第一部分
脚本开始部分常用的组织结构:
-Script head脚本标签开头
-循环标签
等待指令
检查主角状态判断
条件检查
游戏事件
跳转到开头
复制代码
[*]{$CLEO .cs}
[*]:Akt
[*]03A4: name_thread 'AKT'
[*]
[*]:Akt_01
[*]0001: wait 0 ms
[*]if
[*]0256: player $PLAYER_CHAR defined
[*]004D: jump_if_false @Akt_01
[*]if
[*]0AB0: key_pressed 8//-----------------key = Backspace
[*]004D: jump_if_false @Akt_01
[*]08B2: toggle_thermal_vision 1
[*]0001: wait 3000 ms
[*]08B2: toggle_thermal_vision 0
[*]0002: jump @Akt_01//--------Normal jump instruction to 1.LoopAdress
【CLEO编写指南】 八:编写结构扩展
使用我们的脚本开始一个新的事件会改变游戏状态和条件,这就需要引导读取过程来防止同样编码被再次读取。
因此我们在脚本中加入二次循环
循环一 事件开始前
循环二 事件结束后
使用如下循环编写结构扩展:
脚本开头
循环地址一
等待指令
判断主角状态
条件检测
事件
循环地址二
等待指令
判断主角状态
条件检测
跳转回循环地址一
复制代码
[*]{$CLEO .cs}
[*]:akt03A4: name_thread 'AKT'
[*]:akt01//----------------------------1.Loop Adress
[*]0001: wait 0 ms
[*]if
[*]0256: player $PLAYER_CHAR defined
[*]004D: jump_if_false @akt01if
[*]00DF: actor $PLAYER_ACTOR driving
[*]004D: jump_if_false @akt01
[*]03C0: 1@ = actor $PLAYER_ACTOR car
[*]0229: set_car 1@ color_to 17 0 02AC: set_car 1@ immunities BP 1 FP 1 EP 1 CP 1 MP 1
[*]053F: set_car 1@ tires_vulnerability 0
复制代码
[*]:akt03//----------------------------2.Loop Adress
[*]0001: wait 0 ms
[*]if
[*]0256: player $PLAYER_CHAR defined
[*]004D: jump_if_false @akt03
[*]if
[*]80DF: not actor $PLAYER_ACTOR driving
[*]004D: jump_if_false @akt03
[*]01C3: remove_references_to_car 1@
[*]0002: jump @akt01//--------Normal jump instruction to 1.LoopAdress
这个脚本的作用是使得车辆从人物进入车辆起就不可破坏
因此我们用1@定义主角所乘坐的车辆
03C0: 1@ = actor
$PLAYER_ACTOR car
然后我们可以使用变量来定义车辆全防
最好不要被所列举的循环所限制思维
而且还有其他脚本结构,要学会发散思维
但是我建议如果没有什么经验的话还是使用如上结构
http://dl.opengta.com/attachment/Mon_1208/145_382378_2ab97e12a5f4236.jpg?92
例子:
这个是通过按键调整游戏慢速度和正常速度而触发脚本
设置游戏速度为 0.3来使游戏速度和读取进度变慢
复制代码
[*]{$CLEO .cs}
[*]:slow_0
[*]03A4: name_thread 'SLW'
[*]
[*]:slow_1
[*]0001: wait 0 ms
[*]if
[*]0AB0: key_pressed 8//-----------------key = Backspace
[*]004D: jump_if_false @slow_1
[*]015D: set_gamespeed .3
[*]0001: wait 50 ms
[*]
[*]:slow_2
[*]0001: wait 0 ms
[*]if
[*]0AB0: key_pressed 8//-----------------key = Backspace
[*]004D: jump_if_false @slow_2
[*]015D: set_gamespeed 1.0
[*]0001: wait 1000 ms
[*]0002: jump @slow_1
[ 此帖被游骑兵帝国在2012-08-16 10:55重新编
【CLEO编写指南】 九:关于Sphere的创建-由幸运克苏鲁提供
简单举一个例子:把CJ瞬移到他家房顶上去,我就不用翻译下面的代码了吧,大家自己看吧,很简单的,游戏定义玩家进入Sphere就瞬移到某地。
复制代码
[*]{$CLEO .cs}
[*]:Teleport_103A4: name_thread 'TELE'
[*]:Teleport_2
[*]wait 0
[*]if
[*]0256: player $PLAYER_CHAR defined
[*]jf @Teleport_2
[*]if
[*]00FF: actor $PLAYER_ACTOR sphere 1 in_sphere 2493.5 -1682.5 13.35 radius 1.0 1.0 1.0 on_foot
[*]jf @Teleport_2
[*]00A1: put_actor $PLAYER_ACTOR at 2524.5-1677.519.95jump @Teleport_2
00FF就是红色标志的opcode 1表示显示红球0则不显示红球(但是有其效果)
复制代码
[*]wait 10
[*]now the sphere won't be shown
Sanny builder的自动帮助里面也有关于创建红球的介绍
下面是一些显示红球的opcode
直接创建一个红球复制代码
[*]03BC: 1@ = create_sphere_at 2493.5-1682.513.35 radius 1.0
[*]//eventual needs to remove the sphere at any time
[*]03BD: destroy_sphere 1@
在红球上做标记
复制代码
[*]02A7: 0@ = create_icon_marker_and_sphere 35 at 2493.5-1682.513.35
[*]//as well as
[*]0570: 1@ = create_asset_radar_marker_with_icon35 at -2007.8 189.1 27.5
[*]//eventual needs to remove the marker at any time
[*]0164: disable_marker 0@
[*]0164: disable_marker 1@
以玩家定义
复制代码
[*]00FE: actor $PLAYER_ACTOR sphere 1 in_sphere 2493.5-1682.513.35 radius 15.0 15.0 15.0
[*]00FF: actor $PLAYER_ACTOR sphere 1 in_sphere 2493.5-1682.513.35 radius 1.0 1.0 2.0 on_foot
[*]0100: actor $PLAYER_ACTOR in_sphere 2493.5-1682.513.35 radius 4.0 4.0 4.0 sphere 1 in_car
[*]0101: actor $PLAYER_ACTOR in_sphere 2493.5-1682.513.35 radius 5.0 5.0 3.0 sphere 1 stopped
[*]0102: actor $PLAYER_ACTOR in_sphere 2493.5-1682.513.35 radius 1.2 1.2 3.0 sphere 1 stopped_on_foot
[*]0103: actor $PLAYER_ACTOR in_sphere 2493.5-1682.513.35 radius 4.0 4.0 6.0 sphere 1 stopped_in_car
[*]
[*]0104: actor $PLAYER_ACTOR near_actor 1@ radius 15.0 15.0 15.0 sphere 1
[*]0105: actor $PLAYER_ACTOR near_actor 1@ radius 5.0 5.0 2.0 sphere 1 on_foot
以汽车定义
复制代码
[*]01AE: car 1@ sphere 1 near_point 2493.5-1682.5 radius 3.0 3.0 stopped
[*]01AF: car 1@ sphere 1 in_sphere 2493.5-1682.5 radius 0.2 0.2 1.0
[*]01B0: car 1@ sphere 1 in_sphere 2493.5-1682.513.35 radius 4.0 4.0 4.0 stopped
现在我们可以从上面的脚步中扩展或者修改新的脚本了,这就是CLEO,看似很难,其实很简单,只要知道一种opcode的用法就可以无限扩展CLEO,很多情况下一个看似很难很神奇的CLEO或许就是这样一步一步修改、扩展而来的。
复制代码
[*]{$CLEO .cs}
[*]:Teleport_1
[*]03A4: name_thread 'TELE'
[*]
[*]:Teleport_2
[*]wait 0
[*]if
[*]0256: player $PLAYER_CHAR defined
[*]jf @Teleport_2
[*]if
[*]00FF: actor $PLAYER_ACTOR sphere 1 in_sphere 2493.5 -1682.5 13.35 radius 1.0 1.0 1.0 on_foot
[*]jf @Teleport_3
[*]00A1: put_actor $PLAYER_ACTOR at 2524.5-1677.519.95
[*]jump @Teleport_2
[*]
[*]:Teleport_3
[*]if
[*]00FF: actor $PLAYER_ACTOR sphere 1 in_sphere 2530.5 -1678.5 19.95 radius 1.0 1.0 1.0 on_foot
[*]jf @Teleport_4
[*]00A1: put_actor $PLAYER_ACTOR at 2512.5-1670.513.5
[*]jump @Teleport_2
[*]
[*]:Teleport_4
[*]if
[*]00FF: actor $PLAYER_ACTOR sphere 1 in_sphere 2507.5 -1673.5 13.4 radius 1.0 1.0 1.0 on_foot
[*]jf @Teleport_5
[*]00A1: put_actor $PLAYER_ACTOR at 2490.5-1717.518.6
[*]jump @Teleport_2
[*]
[*]:Teleport_5
[*]if
[*]00FF: actor $PLAYER_ACTOR sphere 1 in_sphere 2504.5 -1719.5 18.6 radius 1.0 1.0 1.0 on_foot
[*]jf @Teleport_2
[*]00A1: put_actor $PLAYER_ACTOR at 2497.5-1681.513.4
[*]jump @Teleport_2
天涯。。。你发错位置了吧。这玩意应该是SA子版块教材区 【CLEO编写指南】 十:加载3D模型
一:加载模型复制代码
[*]0247: request_model #INFERNUS
二:通过载入模型检测循环判断是否载入模型
复制代码
[*]:Load_Model_Check
[*]0001: wait 0 ms
[*]00D6: if
[*]0248: model #INFERNUS available
[*]004D: jump_if_false @Load_Model_Check
三:相关文件加载成功并定义为变量
复制代码
[*]00A5: 1@ = create_car #INFERNUS at 2487.5 -1660.5 13.35
[*]0175: set_car 1@ z_angle_to 90.0
四:一旦模型不再需要就移除模型
复制代码
[*]0249: release_model #INFERNUS
五:相应脚本完成任务后就从脚本移除定义的项目,脚本就可以跳回初始循环复制代码
[*]01C3: remove_references_to_car 1@ // Like turning a car into any random car
通过使用01C3: remove_references_to_car来移除脚本定义的车辆
车辆此时还是存在于游戏中但是不能再次被我们的脚本调用
移除车辆的另一方法是完全删除车辆
复制代码
[*]00A6: destroy_car 1@
这两种移除车辆 人物 物品的方法都有对应的Opcode
复制代码
[*]{$CLEO .cs}
[*]:3dModels_1
[*]03A4: name_thread 'MODL'
[*]:3dModels_2
[*]0001: wait 0 ms
[*]00D6: if 0
[*]0256: player $PLAYER_CHAR defined
[*]004D: jump_if_false @3dModels_2
[*]00D6: if
[*]00FF: actor $PLAYER_ACTOR 1 (in-sphere)near_point_on_foot 2491.5 -1667.5 13.35 radius 1.0 1.0 1.0
[*]004D: jump_if_false @3dModels_2
[*]0247: request_model #INFERNUS
[*]
[*]:Load_Model_Check
[*]0001: wait 0 ms
[*]00D6: if
[*]0248: model #INFERNUS available
[*]004D: jump_if_false @Load_Model_Check
复制代码
[*]00A5: 1@ = create_car #INFERNUS at 2487.5 -1660.5 13.35
[*]0175: set_car 1@ z_angle_to 90.0
[*]0249: release_model #INFERNUS
[*]
[*]:3dModels_3
[*]0001: wait 0 ms
[*]00D6: if
[*]0256: player $PLAYER_CHAR defined
[*]004D: jump_if_false @3dModels_3
[*]00D6: if
[*]80FF: NOT actor $PLAYER_ACTOR 0 ()near_point_on_foot 2491.5 -1667.5 13.35 radius 2.0 2.0 2.0
[*]004D: jump_if_false @3dModels_3
[*]01C3: remove_references_to_car 1@ // Like turning a car into any random car
复制代码
[*]0002: jump @3dModels_2
当CJ 靠近葛洛夫街的红圈处就创建车辆infernus
如果CJ 离开了这个位置脚本就会移除车辆脚本会跳转回循环节一
#作为刷出模型的接入口标志
其他的模型需要使用他们的ID
编号
比如刷出物品1655就会调用data/maps/generic/multiobj.ide路径的数据55
复制代码
[*]{$CLEO .cs}
[*]:JumpR0003A4: name_thread 'JPR'
[*]:JumpR010001
[*]: wait 0 ms
[*]00D6: if
[*]0256: player $PLAYER_CHAR defined
[*]004D: jump_if_false @JumpR01
[*]00D6: if 000E1: key_pressed 0 10//--------- No key
[*]004D: jump_if_false @JumpR010247: request_model 1655
复制代码
[*]:JumpR02
[*]0001: wait 0 ms
[*]00D6: if
[*]0248: model 1655 available
[*]004D: jump_if_false @JumpR02
[*]0172: 2@ = actor $PLAYER_ACTOR z_angle
[*]04C4: create_coordinate 11@ 12@ 13@ from_actor $PLAYER_ACTOR offset 0.0 14.5 -1.8
[*]0107: 1@ = create_object 1655 at 11@ 12@ 13@
[*]0177: set_object 1@ z_angle_to 2@
[*]0001: wait 0 ms
[*]0249: release_model 1655
[*]0001: wait 1000 ms
[*]01C4: remove_references_to_object 1@ // This object will now disappear when the player looks away
[*]0002: jump @JumpR01
你也可以使用ID 编号来刷出物品 人物和车辆
复制代码
[*]{$CLEO .cs}
[*]:Actor_1
[*]03A4: name_thread 'Actor'
[*]
[*]:Actor_2
[*]0001: wait 0 ms
[*]00D6: if
[*]0256: player $PLAYER_CHAR defined
[*]004D: jump_if_false @Actor_2
[*]00D6: if
[*]00FF: actor $PLAYER_ACTOR 1 (in-sphere)near_point_on_foot 2491.5 -1667.5 13.35 radius 1.0 1.0 1.0
[*]004D: jump_if_false @Actor_2
[*]0247: request_model 120
[*]0247: request_model #AK47
[*]
[*]:Load_models_check
[*]0001: wait 0 ms
[*]00D6: if and
[*]0248: model 120 available
[*]0248: model #AK47 available
[*]004D: jump_if_false @Load_models_check
[*]009A: 1@ = create_actor 24 120 at 2486.5 -1664.5 13.45
[*]0173: set_actor 1@ z_angle_to 180.0
[*]01B2: give_actor 1@ weapon 30 ammo 99999 // Load the weapon model before using this
[*]02E2: set_actor 1@ weapon_accuracy_to 100
[*]0223: set_actor 1@ health_to 1000‘05E2: AS_actor 1@ kill_actor $PLAYER_ACTOR
[*]0249: release_model 120
[*]
[*]:Loop_1
[*]0001: wait 0 ms
[*]00D6: if
[*]8118: NOT actor 1@ dead
[*]004D: jump_if_false @Cleanup_1
[*]00D6: if
[*]0104: actor $PLAYER_ACTOR near_actor 1@ radius 80.0 80.0 10.0 sphere 0
[*]004D: jump_if_false @Cleanup_10002
[*]: jump @Loop_1
[*]
[*]:Cleanup_1
[*]01C2: remove_references_to_actor 1@ // Like turning an actor into a random pedestrian
[*]0002: jump @Actor_2
这个是在葛洛夫街创建一个携带武器的NPC 的脚本
果CJ 离开这个地方半径80单位的位置或者CJ
死亡
创建的人物会从脚本移除并且脚本跳转回循环一
赋予人物武器必须先加载武器模型
如果想要让武器位于人物手中就得插入一个特殊的武器编号(无法在游戏文件里查询)
你可以在SB
帮助文本SCM Documentation >> GTA SA >> Weapon
numbers找到对应的武器编号
赋予人物武器的方式不像其他模型的方式
所以最后不需要移除模型
创建人物的行为方式已经预先定义于创建人物opcode的语句之内.
我们可以在SB
帮助文本 SCM Documentation >> GTA SA >> PedTypes下获取帮助
009A: 1@ = create_actor 8 #TRIBOSS at 2486.5 -1664.5 13.45
这个类型(type 7)的人物会具有敌对帮派人物一样的攻击性
009A: 1@ = create_actor 7 #TRIBOSS at 2486.5 -1664.5 13.45
kami 发表于 2013-9-7 17:51
天涯。。。你发错位置了吧。这玩意应该是SA子版块教材区
新论坛不知道咋用...你帮我转移帖子吧 通过创建车辆停泊点来创建车辆
初始化车辆停泊点需要使用如下OPCODE
我们可以在如下路径找到相关帮助
这个车辆停泊点创建车辆的方法所定义的变量不能用在其他交通工具创建上因为他指代车辆停泊点而不代表实际的车辆
r因为她是定义车辆创建而不是指车辆
复制代码
[*]{$CLEO .cs}:
[*]PaCar_1
[*]03A4: name_thread "PACR"
[*]0001: wait 1000 ms0A95: enable_thread_saving
[*]014B: 1@ = init_parked_car_generator #BANSHEE -1 -1 1 alarm 0 door_lock 0 0 10000 at 920.1994 2020.546 11.79 angle 100.0
[*]014C: set_parked_car_generator 1@ cars_to_generate_to 101
[*]032B: 2@ = create_weapon_pickup #MINIGUN 15 ammo 5000 at 2113.373 1520.674 10.82
[*]0A93: end_custom_thread
以上脚本通过添加一个parked_car_generator来刷新车辆Banshee,并且添加了武器MINIGUN
generate_to 101指车辆会重复刷新
generate_to 0 指停用车辆重复刷新选项
模型名称后面的2个变量-1 -1 定义着车辆的基本颜色和扩展颜色,游戏中车辆会随机刷新颜色。
通过设定 0 17这2个颜色数据来定义车辆颜色
0代表黑色 ,设定基本颜色
17代表红色,设定扩展颜色
alarm 0 可以在0-100间取值,代表着警报器触发的概率
0表示关闭 100表示打开 0-100间的数值表示警报器触发的概率
door_lock 0 可以在0-100间取值,代表着车门上锁的概率
0表示关闭 100表示打开 0-100间的数值表示车门关闭的概率
2个不同Opcode带有的拾取点对应不同的武器拾取方式
0213:肉搏武器和对象(比如GUN_PARA和1242, bodyarmour)
模型名称后面的参数是武器拾取方式
Typ 15 是重复刷新的拾取点
Typ 3是只刷新一次的拾取点
暂时到这里了,后面的建议去外网看原帖,翻译太累了
骨骼位置的编码代号
0 Torso 躯干
1 Head (haircuts)头 包括头发
2 Legs 腿
3 Shoes 鞋
4 Lower left arm 左手手臂下面那截
5 Upper left arm左手手臂上面那截
6 Upper right arm 右手手臂上面那截
7 Lower right arm 右手手臂下面那截
8 Back top 后背的上面?
9 Left chest 左胸
10 Right chest 右胸
11 Stomach 腹
12 Lower back 背
13 Necklace 项链
14 Bracelet/Watch 手表
15 Glasses 眼睛
16 Hats 帽子
来自GTA TSJ提供
页:
[1]
2