血戮魔动冰 发表于 2009-9-14 21:35:07

位面消隐正式v1.0版!(附超长的移植/注意事项手册)

………………
正式版的介绍:

因为kook大人的鼎力相助,所以现在终于完成了联机测试
…………居然不可思议的一次通过了………………我的天哪…………

相比v0.01更改了两个方面(其实根本没什么大不了的):
物品不再显示血条。
嗯……某个小小的Bug。

移植手册…………天哪………………等等…………我写写…………

使用WE:WEHelper(在论坛里有的那个http://bbs.islga.org/read-htm-tid-15253-keyword-WEHelper.html)

此系统的效果:
在一个“位面”里的玩家和在另一个“位面”里的玩家看到的东西是不一样的。
比如位面1里,玩家1看到的是Footman在互砍,而位面2里则可能是一堆食人魔(在同一坐标上)…………

最多支持玩家数:6个(演示里是玩家1-6)。
最多支持位面数量:8190(演示中只有2个)个。
最多支持单位/物品/Effect......数量:8190个。

这只是简述效果。
具体的可以参见此贴:
好久没办了~~那么综合与系统区第N届官方活动——位面消隐技术~~

截图4张:



血戮魔动冰 发表于 2009-9-14 21:36:00

总的基础:
输入管理器的majia.mdx直接输入到你的地图里的对应路径里去。
最好把我所有的技能什么的全部copy进去。
在System里的触发一个不能丢
地图头文件也需要复制过去。

常量的设置:
StructUnit中的
Const_TempItemSlotAbility
设置为item temp的ID。
UnitMissile中的
Const_MissileUnitId
设置为UsableUnit的ID(注意……没有其他字符)
StructItem中的
Const_ItemSeerId改为
UsableUnit(PlayerSeeItem的ID)
以及Const_ItemBuff改为
魔法效果“物品”的ID
“影子权杖”的魔法效果也要改为这个“物品”
StructDestructable Terrain
中的Const_Destructable_UsableUnitId
改为UsableUnit(Desturctable)的ID
其他的暂时无需更改。
无伤大雅。

===================================

单位的设置:
(在原先基础上更改)
单位编辑器部分:
原单位A:
装甲类型为“没有”(按Shift,输入【_】)即可
投射物图像为“没有”
武器声音为“没有”

如果单位没有物品栏,或者物品栏技能被限制。
在【技能-普通】增加一个物品栏技能“item temp”
这个演示叫这个名字,其实你可以改。
就是一个英雄物品栏,只不过个数为1而已。

视野范围全部改为0(白天和夜晚)

然后copy一个原单位。新的单位类型B。(我称其为“尸体单位”)
在已改完的原单位基础上,更改:
阴影图像:没有
阴影图像-宽度/高度/X轴偏移/Y轴偏移:0(这个貌似可改可不改)
深水区有阴影:false

然后,按照单位A原先的视野,从
UsableUnit (See_XXXX_YYYY)(XXXX为白天视野,YYYY为晚上视野,如果单位A原先的视野为这个数的话,那么不用注册新的UsableUnit,这个UsableUnit直接视为视野马甲C)
中copy一个。
将其视野调整为单位A原先的视野,改名字(这个不是必需的…………),符合上面的格式。

这样,我们得到3个单位类型…………于是……下面的工作麻烦了…………
(以下内容,如果关于UnitC的已经在编辑器里有了,则不用理会)
-----------------------------------------------------------------
翻到技能的页面。
需要以下技能:
burrow <UnitAId> 01(从burrow XXXX 01中复制一个)
将普通形态单位和变化形态单位全部变成<UnitAId>。
burrow <UnitAId> 02(从burrow XXXX 02中复制一个)
将普通形态单位和变化形态单位全部变成<UnitAId>。(这是物品技能,别和上边混了)

接下来:
burrow <UnitAId> deadbody <UnitBId> 01(从burrow XXXX deadbody YYYY 01中复制一个)
将普通形态单位和变化形态单位全部变成<UnitBId>。
burrow <UnitAId> deadbody <UnitBId> 02(从burrow XXXX deadbody YYYY 02中复制一个)
将普通形态单位和变化形态单位全部变成<UnitBId>。(这是物品技能,别和上边混了)

Usable单位:
burrow UsableUnit <UnitCId> 01(从burrow UsableUnit XXXX 01中复制一个)
将普通形态单位和变化形态单位全部变成<UnitAId>。
burrow UsableUnit <UnitCId> 02(从burrow UsableUnit XXXX 02中复制一个)
将普通形态单位和变化形态单位全部变成<UnitCId>。(这是物品技能,别和上边混了)

翻到物品。
------------------------------------------------------------------
需要
burrow <UnitAId>(从 burrow XXXX中复制)
将技能改为burrow <UnitAId> 02
burrow <UnitAId> deadbody <UnitBId>(从 burrow XXXX deadbody YYYY中复制)
将技能改为burrow <UnitAId> deadbody <UnitBId> 02
burrow UsableUnit <UnitCId>(从 burrow UsableUnit XXXX中复制)
将技能改为burrow UsableUnit <UnitCId> 02

好了……准备工作完成了额…………
接下来还有呢…………
翻到触发:
RegisterTypeData
里面有以下函数:

function RegisterUnitTypeData_Missile takes integer id, string missileart, real missilespeed, boolean missileHoming, real missilek returns nothing
function RegisterUnitTypeData_MissileHeight takes integer id, real attack, real attacked returns nothing
function RegisterUnitTypeData_Attack takes integer id, real beforeattack, string attacksound, string attackedsound returns nothing
function RegisterUnitTypeData_Usable takes integer id returns nothing
function RegisterUnitTypeData_SeerId takes integer id, integer seerid returns nothing
function RegisterUnitTypeData_Burrow takes integer id, integer id_01, integer id_02_it returns nothing
function RegisterUnitTypeData_DeadBody takes integer id, integer db_id, boolean havedecay returns nothing
function RegisterUnitTypeData_Collision takes integer id, real collision returns nothing
function RegisterUnitTypeData_Null takes integer id returns nothing
function RegisterUnitTypeData_Destructable takes integer id returns nothing

(*^__^*) 嘻嘻……

先看范例:

    call RegisterUnitTypeData_Burrow( 'hwt2', 'A00C', 'I002' )
    call RegisterUnitTypeData_Missile( 'hwt2', "Abilities\\\\Weapons\\\\WaterElementalMissile\\\\WaterElementalMissile.mdl", 1300.0, true, 0.3 )
    call RegisterUnitTypeData_Attack( 'hwt2', 0.4, "WaterElementalMissile\\\\WaterElementalMissile", "Flesh" )
    call RegisterUnitTypeData_MissileHeight( 'hwt2', 120.0, 60.0 )
    call RegisterUnitTypeData_SeerId( 'hwt2', 'h002' )
    call RegisterUnitTypeData_DeadBody( 'hwt2', 'h005', false )
    call RegisterUnitTypeData_Burrow( 'h005', 'A00K', 'I008' )
    call RegisterUnitTypeData_Collision( 'hwt2', 32.0 )
    //hwt2

首先是Burrow()
第一个是UnitAId,第二个是burrow <UnitAId> 01(技能),第三个是burrow <UnitAId>(物品)
Missile()是关于投射物的。近战单位就不用这个了。
第一个是UnitAId,第二个是原投射物的路径,第三个投射物速率,第四个是否追踪目标,第五个为弧度(和魔兽默认的不一样……应该是*2吧……)
Attack()是关于攻击和攻击音效的。
第一个是UnitAId,第二个是攻击伤害点(前摇),第三个是音效路径(远程在声音编辑器里找,截取和范例一样的路径部分copy过来),第四个是原装甲类型。
MissileHeight()是关于投射物高度的。
第一个是UnitAId,第二个是投射物的初高度(近战单位不用这个),第三个是投射物以此单位为目标时的末高度。这两个可以参考“射弹碰撞偏移——Z”和“射弹偏移——Z”
SeerId()是关于视野马甲的。
第一个是UnitAId,第二个是UnitCId。
DeadBody()是关于尸体的。
第一个是UnitAId,第二个是UnitBId,第三个是是否有腐化。
与第一个Burrow不同的是,下面的Burrow是注册的是UnitBId的东西。
第一个是UnitBId,第二个是burrow <UnitAId> deadbody <UnitBId> 01(技能),第三个是burrow <UnitAId> deadbody <UnitBId>(物品)
Collision()这是关于碰撞的。
第一个是UnitAId,第二个是碰撞体积。

然后就完事了…………
这还只是一个单位类型UnitA…………O(∩_∩)O哈哈~
要把全地图的单位全都注册一遍……哦哈哈~

==================================
关于如何创建/切换位面。
创建位面:
World.create( force Players )
返回一个位面,在这个位面中Players中的玩家会被视为在这个位面存在。
切换位面:
GetUser( Player ).change( World ToWorld )
这个玩家会被转移到ToWorld这个位面里。

==================================
关于物品:
首先将原物品的模型改为“.mdl”,即空模型。
再copy一个新的“卡嘉长笛 (ItemTest)”(单位-建筑里的)
将名字改为物品的名字。
模型改为物品的模型。
然后翻到RegisterEffectTextTag......这个触发里。
按照我的样子
注册(物品本身,物品马甲单位的ID,所属的世界)
(PS:演示中的世界是这样的:
玩家1和玩家4的世界是先创建的,所以编号为1,而另一个世界的编号为2)

==================================
创建(可以在任何时候创建/删除)请使用RegisterXXXXX(......)
删除的话,call <struct>.Delete()+RemoveEffect/.......即可。
关于在RegisterEffectTextTag...这个触发里的其他struct的说明:
Effect:
function RegisterEffect takes real x, real y, widget target, string attach returns Effect
如果是绑定单位的话,那么直接设置后两个参数。
如果是绑定点的话,设置前两个参数。
当4个参数全部存在时,优先取后两个参数。
不同步的部分:
Register_EffectModels
这个。在对应的位面的序号-1的位置(比如在世界1里是“A”,那么set RegisterEffectModels = "A"这样),设置这个Effect在这个位面的下的model的路径。

texttag
weather
fog
这三个全部都是用Register_XXXXXShow来决定
在对应的位面的序号-1的位置,设置这个XXXXX在这个位面的下能否显示。
function RegisterTextTag takes texttag t returns TextTag
function RegisterWeather takes weathereffect t returns Weather
function RegisterFogModifier takes fogmodifier t returns FogModifier
这三个类型的注册函数就不解释了吧………………(就是被注册的对象本身……)

lightning
function RegisterLightning takes lightning t returns Lightning
不解释了。
用这个Register_LightningAlphas(位面对应的index不变)
来决定在各个位面下lightning的alpha值(255为不透明,0为完全透明)
---------------------------------
关于在RegisterTerrain...这个触发里的其他struct的说明:
destructable
function RegisterDestructable takes real x, real y, real z, real sizex, real sizey, real sizez, integer red, integer green, integer blue, integer alpha, real facing, boolean IsRemove returns Destructable
挺长的……但是我相信应该都能看懂的(IsRemove,是指在切换位面时,是否直接RemoveMajia, RecreateMajia,来达到没有effect死亡延迟的效果)。
同Effect_Models的一样。
用Register_DestructableModels来决定在各个位面下的model的路径。

terrain(地形纹理)
terrainXXXXX
.........
TerrainHeight是指地形高度。
其他的自己想去吧…………
这些struct的注册函数我就不说了,自己看看吧。
Terrain用Register_TerrainIds
来确定在不同位面下的Terrain的纹理。
(貌似以下使用Flush来进行删除动作)
TerrainHeight用
Register_TerrainDeformRadiuss
Register_TerrainDeformDepths
TerrainCrater用
Register_TerrainDeformRadiuss
Register_TerrainDeformDepths
TerrainRipple用
Register_TerrainDeformStartRadiuss
Register_TerrainDeformEndRadiuss
Register_TerrainDeformPeriods
Register_TerrainDeformWidths
Register_TerrainDeformDepths
TerrainWave用:
Register_TerrainDeformToXs
Register_TerrainDeformToYs
Register_TerrainDeformTrailDelays
Register_TerrainDeformRadiuss
Register_TerrainDeformDepths
TerrainRandom用:
Register_TerrainDeformMinDeltas
Register_TerrainDeformMaxDeltas
Register_TerrainDeformUpdateIntervals
Register_TerrainDeformRadiuss

==================================
这样就是现在能实现的东西了…………感觉其实还是很少的说………………

关于在游戏进行中能够更改的数据:

单位方面:
GetUnitUnit( unit ),可以获得我的单位数据类

    string                     MissileArt//投射物图像
    real                         MissileSpeed//投射物速度
    real                         MissileHeight//投射物初高度
    boolean                      MissileHoming//投射物是否跟踪
    real                         MissileAttackedHeight//投射物末高度
    real                         MissileBefore//攻击前摇
    real                         MissileK//投射物弧度
    string                     AttackS//攻击音效
    string                     AttackedS//被攻击音效(只对被近战攻击有效)

如果要更改,
set GetUnitUnit( unit ).MissileArt = "XXXX"
(仅仅举例而已)
这样既可。

如果要把一个单位转成另一个玩家手里,
call User.Change( theunit, toplayer, changecolor )

更改单位的坐标:
call GetUnitUnit( unit ).SetX( x )
call GetUnitUnit( unit ).SetY( y )
call GetUnitUnit( unit ).SetPosition( x, y )//这个的效果和SetUnitPosition的效果一样……
另一种方法是,在你设置了单位的坐标后,
call GetUnitUnit( unit ).updateXY()

禁止事项:
关于一切隐身和钻地什么的……在我明确使用方法之前绝对不能动。
SetUnitPathing()最好别用。因为很可能失效
攻击不能用弹射和溅射。
所有技能全部用模拟的。
…………好吧……很恶心的东西对不?
貌似就没有了…………

------------------------------------

物品方面:
GetItemItem( item )获得Item数据类
如果要直接转换到另一个位面:
call GetItemItem( item ).updateWorld( newworld )

更改物品的坐标:
call GetItemItem( item ).SetPosition( x, y )
另一种方法是,在你设置了物品的坐标后,
call GetItemItem( item ).updateXY()

Effect、TextTag、 Weather:
call Effect/TextTag/Weather.updateModel/Show( World target, model/show )
这里的Target是指要对于这个Effect/...要改变的对应的位面下的数据。

Destructable
Terrain
Terrain.....
这些都有对应的更改数据的method:
updateId
updateModel
updateRadius
updateDepth
……………………

对于玩家转换位面,有两个method:
call GetUser( player ).change( toworld )
call GetUser( player ).change_Wait( toworld )
上面那个是直接转换。
下面的是有timer的0.0秒延迟的转换,可以不考虑触发执行字节数的影响。

World是终端,无法改变数据。



----------------------
判断两个单位在同一位面里:
IsUnitsInSameWorld( u1, u2 )
两个玩家在同一位面里:
GetUser( player1 ).Place == GetUser( player2 ).Place
一个单位一个玩家在同一位面里:
GetUnitUnit( unit ).GetPlace == GetUser( player ).Place

血戮魔动冰 发表于 2009-9-14 21:42:19

连接:
位面消隐——无聊的研究文章

活宝 发表于 2009-9-14 22:26:19

膜拜啊……
可惜我是1.24b的,进不去……

alexries 发表于 2009-9-14 22:28:00

加精罢。
终于看到正品了,非常好非常好。小血辛苦了。

番茄酱 发表于 2009-9-14 22:28:11

膜拜……

疯人¢衰人 发表于 2009-9-14 23:07:34

实际上我一直没有搞明白为什么要设置0视野……

血戮魔动冰 发表于 2009-9-15 06:27:43

…………………………(*^__^*) 嘻嘻……
因为看到隐身单位需要视野而已~

疯人¢衰人 发表于 2009-9-15 07:19:58

单位自己有视野不行么?

血戮魔动冰 发表于 2009-9-15 18:01:17

……………………那就是你自己去想为什么啦~

疯人¢衰人 发表于 2009-9-15 18:02:33

呜呜……
最近大脑混乱了
什么也不知道……

runespirit 发表于 2009-9-15 18:02:45

哇,苦工……抱走……

evenxn007 发表于 2009-9-15 19:36:59

都是看不懂的东西

血戮魔动冰 发表于 2009-9-15 19:49:19

………………学了VJ就知道了………………
当然还得知道原理…………

℃S⒉8 发表于 2009-9-15 22:02:42

借位置传个东西

血戮魔动冰 发表于 2009-9-16 06:18:06

……………………我真想砍掉LS………………太郁闷了………………投到水区就是这下场吗?
被歪楼了…………
下面的不许歪楼。
全部无视14L。

alexries 发表于 2009-9-16 08:29:08

拿来存图的确让人很不爽。
我打算拿这个系统做个图如何。

linzefei 发表于 2009-9-16 08:57:34

先留个言 预存下帖子 起床后再来看

hunluan89 发表于 2009-9-16 09:47:03

话说原理 我上次问你 你说太麻烦 牵扯太多... 没告诉来着
操作手册好长啊 打算移植到地图里当个BOSS玩

alexries 发表于 2009-9-16 09:57:37

阿对,比如阿瓦隆之类的boss。
页: [1] 2 3
查看完整版本: 位面消隐正式v1.0版!(附超长的移植/注意事项手册)