上古卷轴5papyrusutil不能调用papyrus脚本怎么办

这个log如何分析?看了教程还是不太懂。_上古卷轴吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:431,560贴子:
这个log如何分析?看了教程还是不太懂。
[01/08/2015 - 09:55:42PM] Error: Property MGRitual04 on script uskpretroactive131script attached to USKPRetroactive131 (0201906F) cannot be bound because MGRitual04 (000CD987) is not the right type[01/08/2015 - 09:56:04PM] Loading game...[01/08/2015 - 09:56:04PM] VM is thawing...[01/08/2015 - 09:56:04PM] EFF Notification: SKSE Loaded.[01/08/2015 - 09:56:04PM] EFF Notification: SKSE Callback functions Loaded.[01/08/2015 - 09:56:04PM] EFF Notification: Dawnguard loaded.[01/08/2015 - 09:56:04PM] EFF Notification: Menu system loaded.[01/08/2015 - 09:56:04PM] EFF Notification: Actor panel loaded.[01/08/2015 - 09:56:05PM] =======================================[ VioLens - A Killmove Mod: Start ]========================================[01/08/2015 - 09:56:05PM]
[01/08/2015 - 09:56:05PM]
VioLens is now performing a compatibility check. Papyrus warnings about missing or
[01/08/2015 - 09:56:05PM]
unloaded files may follow. This is normal and should be ignored.
[01/08/2015 - 09:56:05PM]
[01/08/2015 - 09:56:05PM] =======================================[ VioLens - A Killmove Mod: Start ]========================================[01/08/2015 - 09:56:05PM] ========================================[ VioLens - A Killmove Mod: End ]=========================================[01/08/2015 - 09:56:05PM]
[01/08/2015 - 09:56:05PM]
VioLens compatibility check complete.
Combat Drama Overhaul Installed.
[01/08/2015 - 09:56:05PM]
[01/08/2015 - 09:56:05PM] ========================================[ VioLens - A Killmove Mod: End ]=========================================[01/08/2015 - 09:56:05PM] InitWidgetLoader()[01/08/2015 - 09:56:07PM] [sic_configmenuscript &SIC_ConfigMenuQuest (300C4C3A)&]: Loaded user settings. [01/08/2015 - 09:56:16PM] VM is freezing...[01/08/2015 - 09:56:16PM] VM is frozen[01/08/2015 - 09:56:17PM] Saving game...[01/08/2015 - 09:56:17PM] VM is thawing...[01/08/2015 - 09:56:20PM] VM is freezing...[01/08/2015 - 09:56:20PM] VM is frozen[01/08/2015 - 09:56:21PM] Saving game...[01/08/2015 - 09:56:21PM] VM is thawing...主要一进雪漫、紫衫镇便跳出。
说实话,挺废纸的。。。...
谢谢大神相助
晓梦镇楼!
2016必玩网游「不败传说」今日内测!登录100%领32Q币!万元红包天天送!一切装备靠打!第三代国战网游,无经验升级,同城速配,社稷美人尽收怀中!领取千元礼包,开启你的霸业!
我只看见第一列后面跟了个“错误”,然后就看不下去了,反正下面没见着“error”。
你的log没什么恶性抛出。没猜错的话有两个可能,1是你雪漫存在美化冲突材质调用崩溃,2是你东西装多了爆内存。
测试n次,n>5,全部ctd了说明是文件等级ctd。有某次没跳说明是配置问题。文件等级就是某文件有错误或者兼容性堪忧。一般是骨骼,身形。   --未来月工资2000元的程序猴子路过,实习期没过就被开除了,我需要安慰.....
一般来说解决难度是硬件<文件<脚本。唔。。。我说的是有足够钱的情况   --未来月工资2000元的程序猴子路过,实习期没过就被开除了,我需要安慰.....
全程监控:内存、显存、CPU、硬盘使用率都绰绰有余。换了个4K映射贴图搭配SMIM便没事了。应该不是硬件问题。介于卸掉TPC后便再无跳出,所以总结为TPC与雪漫美化的冲突造成该CTD。
看大神们谈笑风生,我懂个卵子
贴吧热议榜
使用签名档&&
保存至快速回贴|  
|  
|  
|  
|  
只需一步,快速开始
查看: 3045|回复: 89
Papyrus 脚本语言完全解析 ---------(上古卷轴5+辐射4)
主题帖子积分
本帖最后由 Bee9999 于
12:51 编辑
Papyrus脚本语言完全解析 (TES5,Fallout4)
Bee9999 presents
什么是Papyrus
Papyrus是一种简单,易上手的脚本语言,本质上也是一种程序,但是有别于底层的程序,它通过自有的编译器编译成一种中间语言,在Runtime通过解释器与底层框架进行通信,通常来说,它只能执行底层框架暴露的接口(API)由于是一种解释性语言,执行效率相对较低,通常只用在较为简单的GamePlay逻辑,并不适合做大量的运算
Papyrus可以做的事很多,通常用在魔法效果,任务进程,物品添加与移除等等,Creation kit编辑器本身很健壮,提供了很多简单的逻辑判断,可以完成较为简单的需求,但要进行更复杂的Gameplay逻辑时,Papyrus就派上用场了
就使用范围来说,Papyrus使用范围很窄,但并不代表学习它毫无意义,如果你是一个Gameplay策划或者立志做一个Gameplay策划,学习它可以更快的通过Creantion kit去印证自己的想法,并带到实际工作中或者是未来的工作内容中来.实际编程中,重要的不是用哪个语言,而是编程思路
Papyarus按照通用的语言标准来进行设计,尽管与其他程序语言有很多相异之处,由于它的易用性,不失为是一个编程入门的好工具.
学习编程是枯燥的,很多语言学习时只能对着单调的控制台,感谢Bethesda提供了一个环境,让我们编写完自己的papyrus脚本后可以立即在游戏中看到运行的结果,这对学习编程是很有帮助的.
变量与基本数据类型
2.基本数据类型
& && &&&用于在内存中存储数据.
2.变量的语法
& && &&&例:int Property InteriorFleeRadius = 0 A变量类型 /属性关键字 /变量名(可直接在声明变量时对变量进行赋值) /填充方法
3.变量的使用规则
& && &&&先声明,后赋值,再使用.
4.变量的命名规则
& && &&&①必须以字母开头,不能以数字开头
& && &&&②后面可以跟任意的 字母 数字 下划线
5.变量的命名注意事项
& && &&&①在Papyrus中,大小写是不敏感的
& && &&&②同一个变量名不允许重复定义
6.变量的命名规范
& && &&&尽管Papyrus对大小写不敏感,但尽量在声明时规范的命名
& && &&&通常使用的变量命名方法:驼峰命名法 [Camel]
& && &&&要求变量名首单词的首字母要小写,其余的每个单词的首字母要大写
& && &&&例如: time, playerName, vipLevel
2.基本数据类型
1.int 类型
& && &&&整数类型,只能存储整数,不能存储小数。
& && &&&取值范围:-2,147,483,648 到 2,147,483,647
2.float 类型
& && &&&单精度小数类型, 既能存储整数,又能存储小数
& && &&&取值范围:小数点后面的位数是 7 位;
3.bool 类型
& && &&&bool 类型,用来描述对或错,bool 类型的值只有两个:true false。
4.string 类型(?)
& && &&&字符串类型,用来存储文本,也可以存储空,字符串类型的值需要用双引号引起来;
& && &&&&Hello World&
5.Objects&&无类型,可以引用所有物体
<font color="#.Arrays
&&数组类型,储存数组
运算符与表达式
1.“=”号与“+”号
& && &&&表示赋值的意思,表示把等号右边的值,赋值给等号左边的变量。
int laserChargeTime = 15
& && &&&在Papyrus中“+”号有两个作用:
& && &&&①连接【当“+”号两边有一边是字符串的时候,“+”号就起到连接的作用】
& && &&&Debug.Trace(&ammo is& + selfRef.GetItemCount(AmmoAssaultron) + & on combat&)
& && &&&②相加【当“+”号两边都是数字的时候,“+”号就起到相加的作用】
& &&&& &laserState = laserState + 1 //这个表达式可以简写为laserState++;
2.算数运算符
& && &&&加减乘除,四则运算。
& && &&&优先级:先乘除,后加减,有括号先算括号里的,相同级别的从左至右运算。
& && &&&取模(取余数)
& && &&&例:15 % 4 = 3;
3.“++”与“--”
1.前++ 后++
& && &&&如果单独使用,不管是前++还是后++,最终的结果都是给这个变量加 1。
& && &&&例:itemcount++ , ++itemcount
& && &&&如果是和表达式配合使用:
& && &&&前++,先给这个变量自身加 1,然后带着这个加 1 后的值去参与运算。
& && &&&后++,则先拿原值参与运算,运算完毕后,再将这个变量自身加 1。
& && &&&例:sum = ++ sum = itemcount++;
2.前&--& 后&--& 同上。
3.复合赋值运算符
& && &&&+= ;加等于
& && && &-= ;减等于
& && && &*= ;乘等于
& && && &/= ;除等于
& && && &%= ;取余等于
laserState += 5&&等同于
laserState = laserState + 5 laserState -= 5&&等同于
laserState = laserState - 5
laserState *= 5&&等同于
laserState = laserState * 5
laserState /= 5&&等同于
laserState = laserState / 5
laserState %= 5&&等同于
laserState = laserState % 5
1.关系运算符
& && &&&&, &, &= ,&= ,== ,!=
& && &&&概念:关系运算符是用来描述两个事物之间的关系。
& && &&&由关系运算符连接的表达式称之为“关系表达式”。
& && &&&关系表达式的运算结果是 bool 类型。
& && &&&例 5 & 4 = 10 & 15 =
2.逻辑运算符
& && &&&1.&& 逻辑与
& && &&&&& 两边的表达式结果都为 true 的时候,这个逻辑与表达式的结果就为 true;
& && &&&两边的表达式结果只要一个是 false,那么整个逻辑与表达式的结果就是 false。
& && &&&例:10 & 5 && 10 & 20
& && &&&2.|| 逻辑或
& && &&&|| 两边的表达式结果只要有一边为 true,整个逻辑或表达式的结果就为 true;
& && &&&两边的表达式的结果都为 false,整个逻辑或表达式的结果才为 false。
& && &&&例:5 & 3 || 3 & 10
& && &&&3.! 逻辑非
& && &&&!真的变假的,假的变真的。
& && &&&例:!(9 & 4)
Papyrus关键字
1.const 常量
& && &&&一个不能变化的量,常量一旦声明,就不可以再重新赋值。
Spell Property Arena_PacifyCombatant const auto
& && &&&含有native关键字说明该方法(在程序语言中,函数一般称为方法)不是Papyrus实现的,而是底层语言实现的,Creation引擎底层语言是C++,说明这个方法是由C++实现的,(C++全称:C Plus Plus,简称C++);
Function QuitGame() native global
& && &&&含有global关键字的方法说明改方法可以在所有的脚本中使用这个方法,不需要继承
Papyrus脚本命名
& && &&&例:Scriptname BirdSpawnerScript extends ObjectReference
& && &&&格式: 脚本头 / 脚本名 / 扩展关键字 / 基类
& && &&&papyrus没有类的概念,但仍要继承一个基础类型来对脚本进行扩展,这样脚本才能对目标类型执行脚本逻辑
& && &&&如果想引用其他脚本的方法,使用import 关键字
& && &&&例:import mylib
这样可以继承自定义的脚本库
分支结构之 if 语句
& && &&&if( 判断条件 )
& && &&&要执行的代码;
& && &&&endif
int Property number = 1 Auto
Event OnLoad()
& && &&&if number == 1
& && && && && & Debug.MessageBox(&Hello World!&)
& && &&&EndIf
注:“判断条件”一般为关系表达式或者 bool 类型的值。运算符必须为关系表达符( &, &, &= ,&= ,== ,!= )
2.执行过程
& && &&&程序运行到 if 处,首先判断 if 后面的判断条件,如果条件成立,也就
& && &&&是返回 true,则执行 if 下的代码,如果判断条件不成立,也就是
& && &&&返回 false,则跳过 if 结构,继续向下执行
& && &&&先判断,再执行,有可能一行代码都不执行。
& && &&&用于一种情况的判断。
2.if-else 语句
& && &&&if( 判断条件 )
& && &&&要执行的代码;
& && &&&else
& && &&&要执行的代码;
& && &&&endif
2.执行过程
& && &&&程序执行到 if 处,首先判断 if 所带的判断条件是否成立,
& && &&&如果成立,也就是返回一个 true,则执行 if 下的代码,执行完毕
& && &&&后,跳出 if-else 结构;
& && &&&如果不成立,也就是返回一个 false,则跳过 if 语句,执行 else 下的代码,执行完毕后,同样跳出 if-else 结构
int Property number = 1 Auto
Event OnLoad()
& && &&&if number == 1
& && && && && & Debug.MessageBox(&Hello World!&)
& && &&&else
& && && && && & Debug.MessageBox(&Hey guy&)
& && &&&EndIf
& && &&&先判断,再执行,最少都要执行一条代码。
& && &&&用于两种情况的判断。
分支结构之 switch 语句
1.if else-if 语句
& && &&&if(判断条件)
& && &&&要执行的代码;
& && &&&else if(判断条件)
& && &&&要执行的代码;
& && &&&....... else
& && &&&要执行的代码;
& && &&&endif
(有多少个if,就要有多少个endif结尾)
&&& && & if aiTimerID == iTimer_PlayerGoToCorner && FightState == Arena_FightWaiting.value
& && && && && && && && &if IsCombatant1Player && PlayerRef.GetDistance(Corner1.GetReference()) & 150
& && && && && && && && && && &&&setObjectiveCompleted(objPlayerGoToCorner)
& && && && && && && && &elseif IsCombatant2Player && PlayerRef.GetDistance(Corner2.GetReference()) & 150
& && && && && && && && && && &&&setObjectiveCompleted(objPlayerGoToCorner)
& && && && && && && && &endif
& && && && && && && && &startTimer(iInterval_PlayerGoToCorner, iTimer_PlayerGoToCorner)
& && && && && & endif
2.执行过程
& && &&&①程序首先判断第一个 if 所带的判断条件,如果条件成立,也就是
& && &&&返回一个 true,则执行该 if 所带的代码,执行完成后,立即跳出 if
& && &&&else-if 结构。
& && &&&②如果第一个 if 所带的判断条件不成立,也就是返回一个 false,则继续向下进
& && &&&行判断,依次的判断每一个 if 的判断条件,如果成立,就执行该 if 所带的代码,如果不成立,则继续向下判断。
& && &&&③如果每个 if 所带的判断条件都不成立,就看当前这个 if else-if 结构中是否存
& && &&&在 else,如果有 else,则执行 else 中所带的代码,如果没有 else,则整个 if
& && &&&else-if 就神马都不做。
& && &&&④else 可以省略。
& && &&&用来处理多条件(条件&2 个)的区间判断。
& && &&&例:龙吼获取条件,任务执行条件,电浆枪攻击目标判断
循环结构之 while 语句
1.while 语句
while(循环条件)//当括号内条件为真时,执行循环体
循环条件:一般为关系表达式或者一个 bool 类型的值。
循环体:要重复执行的代码。
2.执行过程
程序运行到 while 处,首先判断 while 所带的小括号内的循环条件是否成立,
如果成立的话,也就是返回 true,则执行循环体;
执行完一遍循环体后,再次回到循环条件进行判断,如果依然成立,则继续执行
循环体,如果不成立,则跳出 while 循环。
在 while 循环当中,一般总会有那么一行代码,能够改变循环条件,使之终有
一天不再成立,如果没有那么一行代码能够改变循环条件,也就是循环条件永远
都成立,我们称这种循环叫做死循环。
例:1加到100(1+2+3+4...+100)
int Function DoWhile(int i)
& && && && && & int number =
& && && && && & int j = 0;
& && && && && & while (j &= 100)
& && && && && && && && &if(j == 50)
& && && && && && && && &Debug.MessageBox(&Number is & + j);
& && && && && && && && &number +=
& && && && && && && && &j++;
& && && && && & endwhile& && && && && &EndFunction
在其他地方调用DoWhile()
Event OnInit()
& && &&&k = DoWhile(0)
& && &&&Debug.MessageBox(k);
则会弹出两个对话框
Number is 50
游戏中应用:循环持续刷新一定数量敌人,批量对NPC执行某些动作等等
目前来说,Papyrus通常只用到if语句与while语句,switch,for很少会用到,就不讨论了
函数(方法)之基本语法
1.函数的概念
& && &&&一段特定功能的代码,有自己的名字,通过名字可以重复调用这段代码来帮我们
& && &&&完成特定的事情。& && &&&Papyrus允许自定义函数,所以我们可以自定义一个函数库,以便在多个脚本中使用,通常来说,动作类的MOD都会自定义一个函数库,例如臭名远扬的SL.
2.函数的声明与调用
1.Pascal 命名法
& && &&&帕斯卡命名规范,要求每个单词的首字母都要大写,其余字母小写。
& && &&&用途:多用于给脚本名或者函数(方法)命名。
& && &&&例如:OnActivate,RegisterForDeletionEvent,OnTriggerEnter,OnTriggerLeave
2.函数的声明(语法)
int Function DoMyThing(Actor myActor = None)
格式:返回类型 / 声明函数关键字 / 函数名 / (函数参数)
int:说明返回类型是整数类型,一个函数执行完毕后返回一个数据,在其他脚本或函数中调用,可以返回多种类型,但一次只能返回一种类型,一个数据
返回值类型:如果不需要返回值则不写
Function关键字声明这个语句块是一个函数
函数参数,需要用小括号括起来,做为函数的一个输入值,在函数中进行调用
&&& && &int Function SayMyThing(Actor myActor = None)
& && && && && & if CustomTopicKeyword && myActor
& && && && && && && && &debug.trace(self + &Actor will say Topic Subtype & + CustomTopicKeyword)
& && && && && && && && &myActor.SayCustom(CustomTopicKeyword)
& && && && && & endif
& && && && && &
& && && && && & RETURN 1 ;returning a value for possible extendability needs
& && &&&EndFunction
在这个函数中,函数返回类型是int整数型,函数参数为myActor并且默认赋值为空
执行函数后判断条件,判断条件:如果存在关键字,并且myActor存在,则执行debug.trace(),myActor.SayCustom(),并且返回一个值,值为1
3.函数的调用
& && &&&函数名([实际参数]);
& && &&&注意:
& && &&&如果函数只声明不调用,则函数中的代码不会被执行。
3.函数的参数与返回值
1.形参与实参
& && &&&形参:形式参数,在定义函数的时候,在参数列表中定义的参数。
& && &&&OnActivate(ObjectReference akActionRef)
& && &&&实参:实际参数,在调用函数的时候,传递给函数的具体参数。
& && &&&debug.trace(self + &Actor will say Topic Subtype & + CustomTopicKeyword)
& && &&&关键字 return
& && &&&作用:
& && &&&①在函数中返回要返回的值;
& && &&&②立即结束函数;
事件是skyrim - papyrus里很重要的组成部分,绝大部分的游戏逻辑由事件完成,以下是可用事件列表
Event OnSomething()
OnActivate - ObjectReference \\在激活时
OnAnimationEvent - ActiveMagicEffect \\在播放动画时
OnAnimationEvent - Alias \\在播放动画时
OnAnimationEvent - Form \\在播放动画时
OnAnimationEventUnregistered - ActiveMagicEffect \\在动画事件结束
OnAnimationEventUnregistered - Alias \\在动画事件结束
OnAnimationEventUnregistered - Form \\在动画事件结束
OnAttachedToCell - ObjectReference
OnBeginState \\初始化时
OnCellAttach - ObjectReference
OnCellDetach - ObjectReference
OnCellLoad - ObjectReference
OnClose - ObjectReference \\在关闭时(柜子,箱子等等)
OnCombatStateChanged - Actor \\在战斗状态改变时(正常,潜行,战斗,警戒)
OnContainerChanged - ObjectReference \\在物品改变容器时(拿取物品,丢弃物品,放入箱子)
OnDeath - Actor \\在角色死亡时
OnDestructionStageChanged - ObjectReference
OnDetachedFromCell - ObjectReference
OnDying - Actor \\在角色正在死亡时
OnEffectFinish - ActiveMagicEffect \\在魔法效果结束时(附加脚本效果)
OnEffectStart - ActiveMagicEffect \\在魔法效果开始时(附加脚本效果)
OnEndState
OnEnterBleedout - Actor
OnEquipped - ObjectReference
OnGainLOS - ActiveMagicEffect
OnGainLOS - Alias
OnGainLOS - Form
OnGetUp - Actor
OnGrab - ObjectReference
OnHit - ObjectReference \\在受到攻击时
OnInit \\在初始化时
OnItemAdded - ObjectReference \\在添加物品时
OnItemRemoved - ObjectReference \\在移除物品时
OnLoad - ObjectReference
OnLocationChange - Actor
OnLockStateChanged - ObjectReference
OnLostLOS - ActiveMagicEffect
OnLostLOS - Alias
OnLostLOS - Form
OnMagicEffectApply - ObjectReference
OnObjectEquipped - Actor
OnObjectUnequipped - Actor
OnOpen - ObjectReference
OnPackageChange - Actor
OnPackageEnd - Actor
OnPackageStart - Actor
OnPlayerBowShot - Actor
OnPlayerLoadGame - Actor
OnRaceSwitchComplete - Actor
OnRead - ObjectReference
OnRelease - ObjectReference
OnReset - Alias
OnReset - ObjectReference
OnReset - Quest
OnSell - ObjectReference
OnSit - Actor
OnSleepStart - Form
OnSleepStop - Form \\在睡眠结束时(兄弟会任务触发)
OnSpellCast - ObjectReference
OnStoryActivateActor - Quest
OnStoryAddToPlayer - Quest
OnStoryArrest - Quest
OnStoryAssaultActor - Quest
OnStoryBribeNPC - Quest
OnStoryCastMagic - Quest
OnStoryChangeLocation - Quest
OnStoryCraftItem - Quest
OnStoryCrimeGold - Quest
OnStoryCure - Quest
OnStoryDialogue - Quest
OnStoryDiscoverDeadBody - Quest
OnStoryEscapeJail - Quest
OnStoryFlatterNPC - Quest
OnStoryHello - Quest
OnStoryIncreaseLevel - Quest
OnStoryIncreaseSkill - Quest
OnStoryInfection - Quest
OnStoryIntimidateNPC - Quest
OnStoryJail - Quest
OnStoryKillActor - Quest
OnStoryNewVoicePower - Quest
OnStoryPayFine - Quest
OnStoryPickLock - Quest
OnStoryPlayerGetsFavor - Quest
OnStoryRelationshipChange - Quest
OnStoryRemoveFromPlayer - Quest
OnStoryScript - Quest
OnStoryServedTime - Quest
OnStoryTrespass - Quest
OnTrackedStatsEvent - Form
OnTranslationAlmostComplete - ObjectReference
OnTranslationComplete - ObjectReference
OnTranslationFailed - ObjectReference
OnTrapHit - ObjectReference
OnTrapHitStart - ObjectReference
OnTrapHitStop - ObjectReference
OnTrigger - ObjectReference
OnTriggerEnter - ObjectReference
OnTriggerLeave - ObjectReference
OnUnequipped - ObjectReference
OnUnload - ObjectReference
OnUpdate - ActiveMagicEffect
OnUpdate - Alias
OnUpdate - Form
OnUpdateGameTime - Form
OnWardHit - ObjectReference
Event OnAnimationEvent(ObjectReference source, string eventName)
& & if ((eventName == BloodbugFeedEventName) && (sacState == 0) && (Self.GetValue(AvailableCondition2) & 0))
& && &&&Debug.Trace(Self + & received Event: & + eventName)
& && &&&if (Self.GetCombatTarget() != None && Self.GetCombatTarget().HasKeyword(ActorTypeIrradiated))
& && && && &Self.AddItem(AmmoBloodbug, 4 - Self.GetItemCount(AmmoBloodbug)) ;Give Blood Ammo
& && && && &Self.EquipItem(AmmoBloodbug)& && && && && && && && && && && && &;Force equip it.
& && && && &sacState = 2& && && && && && && && && && && && && && && && && & ;Record that we're filled w/ Green Blood
& && && && &Self.SetValue(AvailableCondition1, 1)& && &&&;Reduce sac health to 1.
& && && && &Self.playSubgraphAnimation(&FillGreen&)& &&&;Fill w/ Green Blood
& && && && &Self.EvaluatePackage()
& && && && &;Debug.Trace(&BLOODBUG: Sac State Updated&)
& && && && &DrinkBloodSpell.Cast(self)
& && &&&else
& && && && &Self.AddItem(AmmoBloodbug, 4 - Self.GetItemCount(AmmoBloodbug)) ;Give Blood Ammo
& && && && &Self.EquipItem(AmmoBloodbug)& && && && && & ;Force equip.
& && && && &sacState = 1& && && && && && && && && && &&&;Record that we're filled w/ Red Blood
& && && && &Self.SetValue(AvailableCondition1, 1)& && &&&;Reduce sac health to 1.
& && && && &Self.playSubgraphAnimation(&FillRed&)& && & ;Fill w/ Red Blood
& && && && &Self.EvaluatePackage()
& && && && &;Debug.Trace(&BLOODBUG: Sac State Updated&)
& && && && &DrinkBloodSpell.Cast(self)
& && &&&endif
& & if ((eventName == BloodbugSpitEventName) && (sacState != 0))
& && &&&Self.playSubgraphAnimation(&emptyRed&)
& && &&&sacState = 0
& && && && &Self.EvaluatePackage()
& && &&&;Debug.Trace(&BLOODBUG: Sac State Updated&)
标示(flag)
标示作为脚本的扩展关键字,可以对脚本进行一些特殊操作
Hidden:当一些脚本你不希望出现在脚本列表里时,使用这个关键字
Scriptname BloodbugScript extends Actor Hidden
Conditional:旗本脚本作为可视的条件系统。创建工具包将不会让您在同一个对象上附加一个条件脚本。
属性标示(property)
Auto:自动赋值
MiscObject property BloodbugSacFilledRed auto
AutoReadOnly:自动赋值,并且数值只读
Hidden:在Creation kit中隐藏显示数值,但其他脚本可以改变这个数值
String property BloodbugFeedEventName = &FillingRed& auto hidden const
Conditional:按条件显示数值,脚本标示必须同时有Conditional
贡献度 +19
这,这么强的技术贴,这才是真的精华.
主题帖子积分
本帖最后由 Bee9999 于
12:45 编辑
触发器(Trigger)触发游戏事件
先看以下事件
;绑定该脚本的物体并且含有该事件,在读取进入内存时触发,可以作为初始化的方法,例如触发过后离开一段时间重置触发器
Event onLoad()
& && &&&if targetRef == None
& && && && && & targetRef = game.getPlayer()
& && &&&endif
;绑定该脚本的物体并且含有该事件,在角色第一次进入触发器时触发,任何角色都可以触发,可以加入if语句进行判断哪些角色可以触发这个触发器
Event onTriggerEnter(objectReference triggerRef)
& && &&&if(triggerRef == targetRef)
& && && && && & ;target has entered the trigger
& && && && && & SetTargetInTrigger(true)
;& && && && && &&&debug.trace(self + & target has entered the trigger&)
& && &&&endif
;绑定该脚本的物体并且含有该事件,在角色离开触发器时触发,任何角色都可以触发,可以加入if语句进行判断哪些角色可以触发这个触发器Event onTriggerLeave(objectReference triggerRef)
& && &&&if (triggerRef == targetRef)
& && && && && & ;target has left the trigger
& && && && && & SetTargetInTrigger(false)
;& && && && && &&&debug.trace(self + & target has left the trigger&)
& && &&&endif
接下来我们做一个触发器,当玩家进入触发器时,开启一个任务,并且把任务阶段设为10
scriptname QuestSetStageTrigSCRIPT extends objectReference
引用game引用debug
quest property myQuest auto& && &&&;任务变量引用需要设置的任务
int property stage auto ;整数变量,设为需要设为的任务阶段
bool property doOnce = True auto ;布尔值,是否只执行一次
int property prereqStageOPT = -1 auto ;预置任务阶段,可作为触发条件,默认为NULL
bool property disableWhenDone = true auto ;触发后是否disable触发器
;变量声明部分显示了这个脚本需要用到的数据,大多数时候,声明的变量只用在自我脚本中,变量的声明体现了整个脚本或程序的数据结构与编程思想,有经验的编程者只需看声明的变量便可以知道这个脚本有什么作用,所以变量声明部分非常重要;对声明的变量尽量考虑周全,既按需求声明足够的变量类型,又没有多余的变量,因为声明的变量是需要占用内存的
auto STATE waitingForPlayer ;STATE是Papyrus的特色,它可以使脚本分不同阶段执行& && &&&EVENT onTriggerEnter(objectReference triggerRef)
;当进入触发器时& && && && && & if triggerRef == getPlayer() as actor ;判断是否是玩家进入了触发器& && && && && && && && &if prereqStageOPT == -1 || MyQuest.getStageDone(prereqStageOPT) == 1 ;判断预置任务阶段是否是-1或者预置任务阶段是否完成& && && && && && && && && && &&&if myQuest.isRunning() == FALSE ;判断如果任务没有运行& && && && && && && && && && && && && & bool check = myQuest.start() ;检查任务是否可以运行& && && && && && && && && && && && && & if !check ;如果不可运行;& && && && && && && && && && && && && && && && & debug.trace(&ERROR: &+myQuest+& not started by &+self) ;输出一个错误提示& && && && && && && && && && && && && & endif& && && && && && && && && && &&&endif& && && && && && && && && && &&&& && && && && && && && && && &&&& && && && && && && && && && &&&myQuest.setStage(stage) ;设置任务阶段& && && && && && && && && && &&&if doOnce ;如果 doOnce = true& && && && && && && && && && && && && & gotoState(&hasBeenTriggered&) ;去往阶段&被触发过&,一般是空阶段,使脚本睡眠& && && && && && && && && && &&&endif& && && && && && && && && && &&&if disableWhenD如果 disableWhenDone = true& && && && && && && && && && && && && & Disable() ;disable触发器& && && && && && && && && && &&&endif& && && && && && && && &endif& && && && && & endif& && &&&endEVENTendSTATE
;如果 doOnce = true,进入这个阶段STATE hasBeenTriggered & && &&&; this is an empty state.endSTATE
很简单的脚本,我们就完成了一个使用触发器来触发任务的功能,一般在地牢门口,城市门口等地方摆放触发器,这样当我们进入这些区域时,就自动运行某些任务,这在制作自己的剧情时非常有用脚本的变量需要到Creation kit 中进行赋值,并且把脚本绑定到触发器上,这个脚本才可以运行,以上代码可以直接复制到你的脚本中,保存并编译
主题帖子积分
主题帖子积分
游戏达人, 积分 2438, 距离下一级还需 1062 积分
游戏达人, 积分 2438, 距离下一级还需 1062 积分
看起来好高端
主题帖子积分
高级玩家, 积分 485, 距离下一级还需 115 积分
高级玩家, 积分 485, 距离下一级还需 115 积分
我在3dm学编程!!!
主题帖子积分
君子循理,故常舒泰~小人役于物,故多忧戚
游戏达人, 积分 3015, 距离下一级还需 485 积分
游戏达人, 积分 3015, 距离下一级还需 485 积分
从头看到尾还是一脸茫然
主题帖子积分
中级玩家, 积分 122, 距离下一级还需 128 积分
中级玩家, 积分 122, 距离下一级还需 128 积分
没多少东西
主题帖子积分
贡献度1982
金元226938
支持Bee9999大神
主题帖子积分
游戏狂人, 积分 1246, 距离下一级还需 754 积分
游戏狂人, 积分 1246, 距离下一级还需 754 积分
小白看不懂,路过膜拜一下大神
主题帖子积分
游戏精英, 积分 3503, 距离下一级还需 5497 积分
游戏精英, 积分 3503, 距离下一级还需 5497 积分
编程教学第一期开始了,大家赶快报名,学费打到我的账户就好了。
主题帖子积分
今天你的心情美丽吗?
金元165052
前排啊!!!
主题帖子积分
高级玩家, 积分 448, 距离下一级还需 152 积分
高级玩家, 积分 448, 距离下一级还需 152 积分
天书写的太好了!
主题帖子积分
Someone may call them junk. Me
游戏狂人, 积分 1596, 距离下一级还需 404 积分
游戏狂人, 积分 1596, 距离下一级还需 404 积分
支持支持啊
主题帖子积分
为什么不放下?因为以直报怨 以德报德
支持啊 感觉好深奥
主题帖子积分
金元291747
主题帖子积分
贡献度2484
金元186355
前。。。。前排
主题帖子积分
高级玩家, 积分 262, 距离下一级还需 338 积分
高级玩家, 积分 262, 距离下一级还需 338 积分
好吧!好厉害的样子!!
主题帖子积分
喵了个咪,头像四个版本,可惜只能用穿的最多的女帝
好深奥的样子
主题帖子积分
喜欢北方的都是好人~
主题帖子积分
山窮水盡出高手,九死一生見功夫
其實Programing我OK,但沒教學我也不知怎樣插入去寫。
會有天手把手的教學嗎
主题帖子积分
其實Programing我OK,但沒教學我也不知怎樣插入去寫。
會有天手把手的教學嗎 ...
会有实例进行讲解的,papyrus本身不难,相对其他语言简直简单得像一个玩具语言,所以更重要的是如何使用它来实现一些有趣的GamePlay
主题帖子积分
打不死的风骚伸手党
我只是路过的,膜拜
主题帖子积分
游戏狂人, 积分 1061, 距离下一级还需 939 积分
游戏狂人, 积分 1061, 距离下一级还需 939 积分
在3dm老滚5区学编程
主题帖子积分
高级玩家, 积分 414, 距离下一级还需 186 积分
高级玩家, 积分 414, 距离下一级还需 186 积分
纯支持,这么深奥的内容好废脑细胞
主题帖子积分
Ash nazg durbatul?k
贡献度125056
金元540359
比在wiki上查方便多了
主题帖子积分
游戏狂人, 积分 1861, 距离下一级还需 139 积分
游戏狂人, 积分 1861, 距离下一级还需 139 积分
大神的技术贴,看得一头雾水膜拜
主题帖子积分
游戏达人, 积分 2000, 距离下一级还需 1500 积分
游戏达人, 积分 2000, 距离下一级还需 1500 积分
参军~~~~~~~~~~
主题帖子积分
游戏达人, 积分 3293, 距离下一级还需 207 积分
游戏达人, 积分 3293, 距离下一级还需 207 积分
不说别的......先膜拜先...........
主题帖子积分
高级玩家, 积分 427, 距离下一级还需 173 积分
高级玩家, 积分 427, 距离下一级还需 173 积分
我不是来玩游戏的么,怎么又开始学习了呀
主题帖子积分
游戏达人, 积分 2742, 距离下一级还需 758 积分
游戏达人, 积分 2742, 距离下一级还需 758 积分
超强教材。。感谢。
有效期三个月,3DM优秀Modder,或对版块有特殊贡献,对3DM感情深厚的会员
中秋活动勋章
终身荣誉勋章
由管理员直接授予,历史上对3DM论坛做出过巨大贡献,会员最高荣誉
3DM死忠专属勋章
论坛热心人士
注册时间3个月以上,发帖量高于1000,且在最近3个月内,于论坛中积极活跃,热心解答会员各种疑难问题,并获得版主认可
3DM页游玩家
3DM页游玩家专属,沉迷于页游中不可自拔,堕落的3DM勋章
魔幻守护者
上古卷轴系列专属魔幻守护者
魔幻守护者
龙腾世纪、上古卷轴、哥特王朝、崛起等欧美RPG类游戏
潜行的混沌
疯狂页游玩家1级
初步踏入3DM自运营页游领域的充值VIP玩家
3DM总监狂热粉丝
终极刁民,看不了直播就要死了
化成灰也要玩的玩家
天王级的玩家
你开心就好
你开心就好
3DM页游玩家
3DM页游玩家专属,沉迷于页游中不可自拔,堕落的3DM-MKII勋章
端午小水呱
端午節獲得的特殊活動勳章
第一枚购买勋章,售价1800金元。注意购买行为不可撤销.积分将影响帐户用户组等级。
L·Lawliet
第二枚购买勋章,售价1800金元。注意购买行为不可撤销.积分将影响帐户用户组等级。
第三枚购买勋章,售价1800金元哟。注意购买行为不可撤销.积分将影响帐户用户组等级。
萌之委员会(永久)
萌之委员会
科比金币勋章
2K系列纪念勋章
3DM优秀特囧兵
3DM优秀特囧兵荣誉勋章
上古卷轴系列,湮灭的印记
潜行的混沌
艾丝华伦斯坦剑姬
3DM独立游戏汉化组核心成员专属勋章
圣人级的玩家
3DM硬件资讯组
3DM硬件资讯组成员专属
大型活动中大奖两次以上
疯狂页游玩家2级
喜爱3DM页游,钱包已开始减肥的充值VIP玩家
Powered by}

我要回帖

更多关于 上古卷轴5脚本冲突 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信