3DMGAME 3DM首页 新闻中心 前瞻 | 评测 游戏库 热门 | 最新 攻略中心 攻略 | 秘籍 下载中心 游戏 | 汉化 购买正版 论坛

注册 登录

QQ登录

只需一步,快速开始

楼主: newalbert
打印 上一主题 下一主题

[分享] 上古4脚本学习 (2010.01.04 68楼增加第三课:mod基础概念和流控)

 关闭 [复制链接]

5

主题

1262

帖子

1776

积分

游戏狂人

Rank: 6Rank: 6

贡献度
248
金元
7843
积分
1776
精华
0
注册时间
2007-2-8
跳转到指定楼层
主题
发表于 2009-12-9 13:22 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
一个月前才开始玩上古,被这个游戏异常开放的引擎所吸引,最近开始研究脚本,学习之余,想写一些中文化的教程之类,就是不知道是否游戏快过气了而没人响应,呵呵。。。不管吧,有兴趣的同学接着往后看。


总论:
上古4的脚本并非完整的语言
有别于魔兽使用的Lua,Lua是一门完整的自适应的精巧的编程语言,但上古使用的只是一些规则化的描述,甚至连循环语句都没有,写script的人只是使用这些简单的规则将上古开放的N多小功能块组织起来(当然,还包括obse增加的若干功能),完成想法。


要求:
1,有一定的逻辑思维能力
2,英语还算凑合过得去
3,记忆力大于等于常人
写上古4的script,要求最高的就是记忆力,并不需要太多编程技巧,基础的就行。为了搞懂每个功能怎么使用,一般的英文能力也是需要的。
为了简单明了,我会略去很多细节,这样比较方便新人学习,由于我也是最近才开始接触上古4的script,肯定会有一些错漏,各位发现请指正。

完整的上古4脚本教程请参考上古4的wiki:
http://cs.elderscrolls.com/constwiki/index.php/Main_Page


好了,我们开始!!!


一:字符和注释
1,空白字符都会被上古4的脚本引擎略掉,你可以写一个空格,为了排版,你也可以写N多空格
当然,你不能把一个英文单词拆开。。。

2,脚本引擎发现“;”时,会略去此分号后面直到行末的任何信息,所以,尽可能用“;”来增加注释,注意,此分号为英文分号!

3,有条件嵌套时,尽可能在前面使用tab键来进行缩进排版,我不知道老滚的脚本引擎是否会像Python一样强制要求tab键缩进,但为了符合规矩,请大家一律使用tab进行缩进,不要用空格代替。

4,所有字符大小写不敏感,也就是ABC和abc是一个意思,类似windows

二:变量和语法
1,上古只有4种基础变量类型
short            用于比较小的整数
long             用于比较大的整数
float            浮点,也就是小数
ref              其它对象的参考,或者引用,总而言之代表任何一个东东

2,当你需要保存一些状态,标志等信息的时候,就可以定义一个变量,然后把信息存储进去。使用方法:
short   svalue        ;一个短整形
long    lvalue        ;一个长整形
float   fvalue        ;一个浮点数
ref     this_is_ref   ;一个引用

3,变量赋值
上古4的变量赋值跟一般语言不同,是强制使用set命令来置值,语法:
set <某变量> to <某值>

变量在set之前必须先定义,范例:

float fvalue
set fvalue to 0.2
set fvalue to 0

ref a_ref
set a_ref to player   ;player代表玩家,也就是你的角色

4,全局or局部
上古4定义了一堆全局变量,这些变量可以在任何时候访问,你也可以增加全局变量,但绝大多数情况下,没必要这么干,全局变量的使用还有一些细节,这里略过。

在你的脚本文件中,你使用上述方法定义的变量,全部都会被当成闭包变量处理,老滚在这一点上做的非常优秀。

什么是闭包变量呢?
有编程基础的同学都知道,定义一个局部变量后,如果程序离开定义块,这个变量将失效。
闭包变量,简而言之就是对于你来说,这个变量是全局的,每次进入到你的脚本中,这个变量的值都不会失效,上次进入你的脚本,你把某值设置成了1,那么下次进入,这个值还会是1。
而对于老滚的引擎来说,这个值它是看不见的,也就是你不需要担心你定义的变量是否会跟其它人定义的变量名字相同而冲突。

一个特殊变量:fQuestDelayTime
它的值代表你想让你的脚本执行的频率多高,设置成1就是每秒执行1次,0.5就是每秒执行2次,但最快也就是1帧1次。
set fQuestDelayTime to 0.001            ;这样你的脚本将会在生效期内每0.001秒执行一次,但不会超过每帧1次

5,操作符
+:加
-:减
*:乘
/:除
%:取模
这些都不用解释了吧,注意:*和/的优先级高于+和-。%的优先级高于+和-但是低于*和/,所以在你不清楚优先级时,尽量多使用小括号()来确保你的意图。

&&:两个条件与,也就是这个符号左右的条件需要同时满足
||:两个条件或,也就是这个符号左右的条件满足任意一个即可
注意:||的优先级小于&&,所以,请多用()
还有一些比较高级数学操作,比如DR里面就使用了很多对数和三角函数。

6,条件
这是上古4的脚本中唯一的分支语句,语法:
if (条件)
  你想干的事
endif

if (条件)
  条件满足你想干的事
else
  条件不满足你想干的事
endif

if (条件1)
  条件1满足你想干的事
elseif (条件2)
  条件2满足你想干的事
else
  都不满足你想干的事
endif
这个也没什么好说的,任何一个语言都会有条件分支语句,条件中,你可以把N多条件使用&&和||放在一起,注意多用()保证意图就行。

三:执行块
begin <执行定义>
...
...
end

记得把你的所有变量定义放在begin的前面
而在begin和end中间放置你的所有执行语句
执行语句中可以使用return强行退出执行

执行定义:
游戏定义了很多执行定义,就是你脚本执行的触发时机,我们先了解最简单的一个:gamemode
意思是在所有非暂停(比如说你打开道具栏时)情况下,你的脚本将会每帧都执行,当然,受限于全局变量fQuestDelayTime
是的,每帧都执行!所以,请保证你的代码尽可能的快,在条件不满足时尽可能的早结束,如果太慢,影响FPS的程度可是很明显的哦!

好了,我们先了解这么多吧,下面是一个简单的定时器小例子,wiki上有原文。

我们要做一个简单的定时器,从游戏load后开始计时,5秒后在屏幕上打印一行信息,嗯,就这么简单,脚本如下:

scn timerTestScript
float timer
float fQuestDelayTime
short doOnce
begin gamemode
     set fQuestDelayTime to 0.001
     if ( doOnce == 0 )
         set timer to 5   ; Initialize the timer variable
         set doOnce to 1
     endif
     
     if ( timer > 0 )                                                
         set timer to timer - getSecondsPassed        
     else                                                               
         Message "Your 5 seconds are up"
     endif  
end
说明:
1,第一行scn timerTestScript
scn是引擎内定关键字,意思是脚本名称,timerTestScript就是我们这个小例子的名称。
所有脚本都要把这行放在最前面。

2,使用了begin gamemode执行块,这样从游戏load开始,在非菜单模式下,我们的脚本将每帧都执行

3,使用了特殊变量fQuestDelayTime,我们设置成0.001,这样,保证我们的脚本每帧肯定都会执行

4,if ( doOnce == 0 )
   我们这次执行是第一次,那么,我们初始化一个定时器变量timer,设置成5,然后把doOnce设置成1,表示我们已经初始化过了

5,if ( timer > 0 )                                                
         set timer to timer - getSecondsPassed
   如果timer的值目前大于0,也就是还没到5秒,我们更新这个定时器,把剩余时间设置成timer - getSecondsPassed。
   getSecondsPassed是内建函数,它会返回当前时间和上一次执行我们脚本的时间差,以小数计量的秒值。

6,else                                                               
         Message "Your 5 seconds are up"
   时间到,使用Message函数打印一行信息到屏幕上

很简单是吧,呵呵。。。其实老滚的脚本并不难,关键在于细心。

经常在混战中一不小心把自己的同伴MM给斩首了,哪怕设为皇冠也无用,异常郁闷。。。
理论不如实践,稍微改了一下DR5,增加了对皇冠人物的判断,现在攻击皇冠人物应该不会进入子弹时间模式了
注意:
1,我只是改了子弹时间的判断,一些魔法和非子弹时间的死亡攻击仍然有可能发生!
2,我改的是原版DR5,没有增加任何我自己的奇怪代码
3,我自己测试了一下,貌似是木有问题,但不保证一定不会对皇冠人物进行死亡攻击,各位同学不要肆无忌惮。

覆盖Data下的原esp即可,注意自行备份!!!!!!!!

DeadlyReflex 5 - Combat Moves.rar

138.02 KB, 下载次数: 83

rar

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|3DMGAME ( 京ICP备14006952号-1  沪公网安备 31011202006753号

GMT+8, 2026-4-8 04:12 , Processed in 0.030452 second(s), 20 queries , Memcached On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表