会员登录

自动登录   |    忘记密码 新会员注册

库存功能SE

作者:Kalivore
发布:kyron2013
发布日期:2019-08-07 08:53:33
更新时间:2019-08-07 08:53:33
头像
1251
352 人收藏
2556 次下载
9567 次浏览
0.06.00
上古卷轴5:重置版
本地下载 高速下载 需要优先下载下载器,50%提速

这是优秀的'库存功能'SKSE插件的更新,最初由Quad2Core为32位天际编写,可在此处找到。


我首先为最终的32位SKSE更新了这个(谢天谢地,Q2C包含了一个源文件,并且还允许重新使用该插件 - 我联系了一个Nexus管理员,他们确认我接受它是可以接受的更新版本)。随着SKSE64的(alpha)发布,我已经更新并重新编译了这个,并且假设原始权限仍然存在,我在这里为64位用户托管它。


这是脚本中当前的内容:




集装箱库存功能




; Q2C的原始功能,针对SKSE64进行了更新

int函数GetNumItemsWithKeyword(ObjectReference akObjRef,关键字akKeyword)

表单函数GetNthFormWithKeyword(ObjectReference akObjRef,Keyword akKeyword,int aiItemIndex)


;由Kalivore添加 - 类型是SKSE itemType(例如26为盔甲,或46为药水)

; http://www.creationkit.com/index.php?title=GetType_-_Form上的完整列表

int函数GetNumItemsOfType(ObjectReference akObjRef,int aiType)

表单函数GetNthFormOfType(ObjectReference akObjRef,int aiType,int aiItemIndex)


;获取容器中项目的基本黄金值的总和

; 'base'表示忽略对项目的附魔/改进的额外价值

int函数GetTotalBaseGoldValue(ObjectReference akObjRef)





毒药功能




; Q2C的原始毒药功能,针对SKSE64进行了更新

;请注意Q2C原始32位插件的格式略有变化:

; Worn_PoisonWeapon已成为WornObjectSetPoison,

; Worn_GetPoison已成为WornObjectGetPoisonCharges等


;有效的手槽:

; 0  - 左

; 1  - 对


;这已经由SKSE完成,所以只需转发到该版本

药水功能WornObjectGetPoison(演员akActor,int aiHandSlot,int aiSlotMask)


int Function WornObjectSetPoison(Actor akActor,int aiHandSlot,int aiSlotMask,Potion akPoison,int aiCharges = 1)

{

将akPoison应用于aiHandSlot中的武器。注意该项必须是武器,否则函数将失败并返回-1

返回:武器现在拥有的毒药数量(应与aiCharges相同)

如果不成功,则返回-1

}


函数WornObjectRemovePoison(Actor akActor,int aiHandSlot,int aiSlotMask)

{

从aiHandSlot中的武器中移除毒药

}


int Function WornObjectGetPoisonCharges(Actor akActor,int aiHandSlot,int aiSlotMask)

{

获取aiHandSlot中武器上的毒药数量

返回:费用数,如果因任何原因不成功,则返回-1

(例如,该物品不是武器,或者没有毒药)

}


int FunctionWornObjectSetPoisonCharges(Actor akActor,int aiHandSlot,int aiSlotMask,int aiCharges = 1)

{

在aiHandSlot中设置武器上的毒药数量

返回:aiHandSlot中武器上现在的毒药数量(应与aiCharges相同)

或-1如果因任何原因不成功(例如该物品不是武器,或者没有施加毒药)

}


;这已经由SKSE完成,所以只需转发到该版本

药水功能GetPoison(ObjectReference akObjRef)


int Function SetPoison(ObjectReference akObjRef,Potion akPoison,int aiCharges = 1)

{

将akPoison应用于akObjRef。注意该项必须是武器,否则函数将失败并返回-1

返回:武器现在拥有的毒药数量(应与aiCharges相同)

如果不成功,则返回-1

}


函数RemovePoison(ObjectReference akObjRef)

{

从武器akObjRef中移除毒药

}


int函数GetPoisonCharges(ObjectReference akObjRef)

{

获取akObjRef上的毒药数量

返回:费用数,如果因任何原因不成功,则返回-1

(例如,该物品不是武器,或者没有毒药)

}


int FunctionSetPoisonCharges(ObjectReference akObjRef,int aiCharges = 1)

{

设置akObjRef上的毒药数量

返回:aiHandSlot中武器上现在的毒药数量(应与aiCharges相同)

或-1如果因任何原因不成功(例如该物品不是武器,或者没有施加毒药)

}



;这些只是上面完整的WornObject版本的快捷方式,将aiSlotMask发送为0

Potion FunctionWornGetPoison(演员akActor,int aiHandSlot)

int Function WornSetPoison(演员akActor,int aiHandSlot,Potion poison,int aiCharges = 1)

FunctionWornRemovePoison(演员akActor,int aiHandSlot)

int Function WornGetPoisonCharges(Actor akActor,int aiHandSlot)

int Function WornSetPoisonCharges(Actor akActor,int aiHandSlot,int aiCharges = 1)






弹药功能




;好吧,并不是特别关注库存,但我需要这些用于我的另一个模块,它们在当前的SKSE中不存在

功能SetIsBolt(Ammo akAmmo,bool abIsBolt)

{

设置此弹药是否为螺栓

}


功能设备弹(Ammo akAmmo,Projectile akProjectile)

{

设置与此弹药相关的射弹

 - 警告!!  - 非常未经测试! >:$

}


函数SetDamage(Ammo akAmmo,float afDamage)

{

设置此弹药的基本伤害

}

拼写库存功能



此处与法术相关的功能仅列出显式法术(即在创作工具包中具有法术类型“法术”的项目)。这意味着他们将忽略标记为能力的魔法,就像Perks添加的那样。

(非常感谢用户irswat帮助我调查并意识到这些之间的区别)。因此,如果您在没有特定条件的情况下调用它们,则会返回完整的法术列表。



;一些与这些函数一起使用的与法术相关的常量(全部为Global,所以你可以将它们称为_Q2C_Functions.SpellSchoolAny())


;有效拼写学校价值观

string函数SpellSchoolAny()

{返回一个空字符串“”}

字符串函数SpellSchoolAlteration()

{return“Alteration”}

string函数SpellSchoolConjuration()

{返回“Conjuration”}

字符串函数SpellSchoolDestruction()

{返回“毁灭”}

string函数SpellSchoolIllusion()

{返回“幻觉”}

字符串函数SpellSchoolRestoration()

{返回“恢复”}


;有用的预设法术等级值

int函数SpellLevelAny()

{return -1}

int函数SpellLevelNovice()

{返回0(我找到的所有新手法术都是0级)}

int函数SpellLevelApprentice()

{返回25}

int函数SpellLevelAdept()

{返回50}

int函数SpellLevelExpert()

{return 75}

int函数SpellLevelMaster()

{返回100}


;有效级别比较值(仅在aiLevel> = 0时应用):

int函数SpellLevelComparisonLt()

{返回-2。意味着拼写等级必须低于指定的aiLevel才能计算}

int函数SpellLevelComparisonLtEq()

{返回-1。意味着法术等级必须小于或等于指定的aiLevel才能被计算出来}

int函数SpellLevelComparisonEq()

{返回0.表示拼写等级必须等于指定的aiLevel才能计算}

int函数SpellLevelComparisonGtEq()

{返回1.意味着拼写等级必须等于或大于指定的aiLevel才能被计算}

int函数SpellLevelComparisonGt()

{返回2.意味着拼写等级必须大于指定的aiLevel才能计算}




Spell []函数ActorGetSpells(Actor akActor,Keyword akKeyword = None,string asSchool =“”,int aiLevel = -1,int aiLevelComparison = 1,bool abSearchBase = true)

{

扫描Actor的法术的MagicEffects,如果MagicEffect符合条件,则将Spell添加到返回的数组。

使用默认值忽略该条件(例如,将asSchool称为“”表示任何学校的'')

注意:仅发送akActor(或发送所有其他参数作为其默认值)将返回Actor知道的所有法术

也可以通过相关的ActorBase(更有可能是法术的那个)进行检查

}


Spell []函数ActorBaseGetSpells(ActorBase akActorBase,Keyword akKeyword = None,string asSchool =“”,int aiLevel = -1,int aiLevelComparison = 1)

{

扫描Actor的法术的MagicEffects,如果MagicEffect符合条件,则将Spell添加到返回的数组。

使用默认值忽略该条件(例如,将asSchool称为“”表示任何学校的'')

注意:仅发送akActorBase(或发送所有其他参数作为其默认值)将返回在ActorBase上设置的所有法术

}


Shout []函数ActorBaseGetShouts(ActorBase akActorBase,Keyword akKeyword = None)

{

返回与指定的关键字匹配的Shouts数组。

}



;额外的拼写检查功能

;这些都是为了方便起见。他们使用与上述拼写列表功能相同的标准

; (实际上,他们所做的只是调用相应的函数,如果结果数组至少有一个条目,则返回true)


bool函数ActorHasSpell(Actor akActor,Keyword akKeyword = None,string asSchool =“”,int aiLevel = -1,int aiLevelComparison = 1,bool abSearchBase = true)

{

扫描Actor的法术的MagicEffects,在匹配任何提供的标准的第一个上返回true。

注意:如果演员有任何咒语,只发送akActor(或发送所有其他参数作为默认值)将返回TRUE

也可以通过相关的ActorBase(更有可能是法术的那个)进行检查

}


bool函数ActorBaseHasSpell(ActorBase akActorBase,Keyword akKeyword = None,string asSchool =“”,int aiLevel = -1,int aiLevelComparison = 1)

{

扫描ActorBase法术的MagicEffects,在匹配任何提供的标准的第一个上返回true。

注意:如果ActorBase有任何咒语,只发送akActorBase(或发送所有其他参数作为其默认值)将返回TRUE

}


bool函数ActorBaseHasShout(ActorBase akActorBase,Keyword akKeyword)

{

扫描ActorBase的喊叫,在匹配指定关键字的第一个回复时返回true。

}

关于检查拼写等级的注意事项


如果你为这些函数提供一个Level参数(例如25为学徒级法术),插件只会为每个法术检查第一个魔法效果。此外,如果测试0级(新手),则魔术效果必须将分配给它的学校计算在内。


说明:

剧透:显示



一些示例代码用法 - 第一个函数直接从原始mod页面获取:



import _Q2C_Functions


ObjectReference属性PlayerRef自动

关键字Property VendorItemPotion Auto


功能ReWeightPotions()

  int PotionIndex = GetNumItemsWithKeyword(PlayerRef,VendorItemPotion)

  而(PotionIndex> 0)

    PotionIndex  -  = 1

    Form potion = GetNthFormWithKeyword(PlayerRef,VendorItemPotion,PotionIndex)

    potion.SetWeight(0.0)

  ENDWHILE

endfunction下面




演员财产SomeEnemy Auto

关键字属性MagicDamageFire Auto


功能CheckEnemyHasFireSpell()

  ;只需发送关键字参数,并将所有其他参数保留为默认值

  bool hasFire = ActorHasSpell(SomeEnemy,MagicDamageFire)

  if(hasFire)

    Debug.Trace(“敌人至少有一个火焰法术”)

  其他

    Debug.Trace(“至少他们不会让我们着火......”)

  万一

endfunction下面




演员属性SomeAlly Auto


功能CheckAllyHasRestorationSpell()

  ;将关键字参数设置为无(表示“不匹配关键字”),指定学校,并将所有其他参数保留为默认值

  bool hasRestorationSpell = ActorHasSpell(SomeAlly,None,“Restoration”)

  if(hasRestorationSpell)

    Debug.Trace(“恢复是一个非常有效的魔法学校”)

  其他

    Debug.Trace(“猜猜我们的盟友不会做任何治疗......”)

  万一

endfunction下面




演员属性PlayerRef Auto


函数ListPlayerSpells()

  ;只需发送Actor参数,并将所有其他参数保留为默认值,即可获得演员知道的完整拼写列表

  Spell [] actorAllSpells = ActorGetSpells(PlayerRef)

  int spellIndex = 0

  报告(“玩家有”+ actorAllSpells.Length +“任何类型的法术”)

  while(spellIndex <actorAllSpells.Length)

    拼写currentSpell = actorAllSpells [spellIndex]

    Debug.Trace(“Spell”+ spellIndex +“:”+ currentSpell.GetName())

    spellIndex + = 1

  ENDWHILE

endfunction下面




[color =#1e84cc]我只是原创作品的更新者 - 原始功能(以及我的灵感)的所有功劳归功于Quad2Core。


按照他们原来的意愿:

随意将此插件与您自己的mods打包并将其用于您自己的项目。

请在某处的脚注中提及我(即Quad2Core)。


所有积分都将转到SKSE团队!



我希望其他人能像我一样找到最好的用途!哦 - 去给Quad2Core一些荣誉吧! :)

——————————————————————————————————————————————————————

This is an update of the excellent 'Inventory Functions' SKSE plugin, originally written by Quad2Core for 32-bit Skyrim, and found here.

I first updated this for the final 32-bit SKSE (thankfully Q2C included a source file, and also gave permission for the plugin to be re-used - I contacted a Nexus admin, and they confirmed it would be considered acceptable for me to host the updated version). With the (alpha) release of SKSE64, I've updated and recompiled this again, and on the assumption the original permission still holds, am hosting it here for 64-bit users.

Here's what is currently in the script:



Container Inventory Functions




; Q2C's original functions, updated for SKSE64
int Function  GetNumItemsWithKeyword(ObjectReference akObjRef, Keyword akKeyword)
Form Function GetNthFormWithKeyword(ObjectReference akObjRef, Keyword akKeyword, int aiItemIndex)

; added by Kalivore - type is the SKSE itemType (eg 26 for armour, or 46 for potion)
; full list at http://www.creationkit.com/index.php?title=GetType_-_Form
int Function  GetNumItemsOfType(ObjectReference akObjRef, int aiType)
Form Function GetNthFormOfType(ObjectReference akObjRef, int aiType, int aiItemIndex)

; get total of the base gold values of items in container
; 'base' means the extra value of enchantments/improvements on items is ignored
int Function  GetTotalBaseGoldValue(ObjectReference akObjRef)




Poison Functions




; Q2C's original poison functions, updated for SKSE64
; Note a slight change in format from Q2C's original 32-bit plugin:
; Worn_PoisonWeapon has become WornObjectSetPoison,
; Worn_GetPoison has become WornObjectGetPoisonCharges etc

; Valid Hand Slot:
; 0 - Left
; 1 - Right

; this is already done by SKSE, so just forward on to that version
Potion Function WornObjectGetPoison(Actor akActor, int aiHandSlot, int aiSlotMask)

int Function WornObjectSetPoison(Actor akActor, int aiHandSlot, int aiSlotMask, Potion akPoison, int aiCharges = 1)
{
Applies akPoison to weapon in aiHandSlot. Note the item MUST be a weapon, or the function will fail and return -1
Returns: The number of poison charges the weapon now has (which should be the same as aiCharges)
or -1 if unsuccessful
}

Function WornObjectRemovePoison(Actor akActor, int aiHandSlot, int aiSlotMask)
{
Remove the poison from the weapon in aiHandSlot
}

int Function WornObjectGetPoisonCharges(Actor akActor, int aiHandSlot, int aiSlotMask)
{
Get the number of poison charges on the weapon in aiHandSlot
Returns: The number of charges, or -1 if unsuccessful for any reason
(eg the item is not a weapon, or no poison applied)
}

int FunctionWornObjectSetPoisonCharges(Actor akActor, int aiHandSlot, int aiSlotMask, int aiCharges = 1)
{
Set the number of poison charges on the weapon in aiHandSlot
Returns: The number of poison charges now on the weapon in aiHandSlot (which should be the same as aiCharges)
or -1 if unsuccessful for any reason (eg the item is not a weapon, or no poison applied)
}

; this is already done by SKSE, so just forward on to that version
Potion Function GetPoison(ObjectReference akObjRef)

int Function SetPoison(ObjectReference akObjRef, Potion akPoison, int aiCharges = 1)
{
Applies akPoison to akObjRef. Note the item MUST be a weapon, or the function will fail and return -1
Returns: The number of poison charges the weapon now has (which should be the same as aiCharges)
or -1 if unsuccessful
}

Function RemovePoison(ObjectReference akObjRef)
{
Remove the poison from the weapon akObjRef
}

int Function GetPoisonCharges(ObjectReference akObjRef)
{
Get the number of poison charges on akObjRef
Returns: The number of charges, or -1 if unsuccessful for any reason
(eg the item is not a weapon, or no poison applied)
}

int FunctionSetPoisonCharges(ObjectReference akObjRef, int aiCharges = 1)
{
Set the number of poison charges on akObjRef
Returns: The number of poison charges now on the weapon in aiHandSlot (which should be the same as aiCharges)
or -1 if unsuccessful for any reason (eg the item is not a weapon, or no poison applied)
}


; These are all just shortcuts to the full WornObject versions above, sending aiSlotMask as 0
Potion FunctionWornGetPoison(Actor akActor, int aiHandSlot)
int Function WornSetPoison(Actor akActor, int aiHandSlot, Potion poison, int aiCharges = 1)
FunctionWornRemovePoison(Actor akActor, int aiHandSlot)
int Function WornGetPoisonCharges(Actor akActor, int aiHandSlot)
int Function WornSetPoisonCharges(Actor akActor, int aiHandSlot, int aiCharges = 1)





Ammo Functions




; OK, not really specifically to do with Inventories, but I needed these for another mod of mine and they don't exist in current SKSE
Function SetIsBolt(Ammo akAmmo, bool abIsBolt)
{
Sets whether this ammo is a bolt
}

Function SetProjectile(Ammo akAmmo, Projectile akProjectile)
{
Sets the projectile associated with this ammo
--WARNING!!-- Highly untested! >:$
}

Function SetDamage(Ammo akAmmo, float afDamage)
{
Sets the base damage of this ammo
}




Spell inventory Functions



The Spell-related functions in here will only list explicit Spells (ie items which have a Spell Type of "Spell" in the Creation Kit).  This means they will ignore magic marked as Abilities, like those added by Perks.
(Many thanks to user irswat for helping me to investigate and realise the difference between these).  As a result, if you call them with no specific criteria, these will return a full list of Spells.


; Some spell-related Constants for use with these functions (all Global, so you can call them as _Q2C_Functions.SpellSchoolAny() )

; Valid spell School values
string Function SpellSchoolAny()
{returns an empty string ""}
string Function SpellSchoolAlteration()
{returns "Alteration"}
string Function SpellSchoolConjuration()
{returns "Conjuration"}
string Function SpellSchoolDestruction()
{returns "Destruction"}
string Function SpellSchoolIllusion()
{returns "Illusion"}
string Function SpellSchoolRestoration()
{returns "Restoration"}

; useful preset spell Level values
int Function SpellLevelAny()
{returns -1}
int Function SpellLevelNovice()
{returns 0 (all Novice spells I found were level 0)}
int Function SpellLevelApprentice()
{returns 25}
int Function SpellLevelAdept()
{returns 50}
int Function SpellLevelExpert()
{returns 75}
int Function SpellLevelMaster()
{returns 100}

; Valid Level Comparison values (only applied if aiLevel >= 0):
int Function SpellLevelComparisonLt()
{returns -2. Means spell level must be lower than specified aiLevel to be counted}
int Function SpellLevelComparisonLtEq()
{returns -1. Means spell level must be less than or equal to specified aiLevel to be counted}
int Function SpellLevelComparisonEq()
{returns 0. Means spell level must be equal to specified aiLevel to be counted}
int Function SpellLevelComparisonGtEq()
{returns 1. Means spell level must be equal to or greater than specified aiLevel to be counted}
int Function SpellLevelComparisonGt()
{returns 2. Means spell level must be greater than specified aiLevel to be counted}



Spell[] Function ActorGetSpells(Actor akActor, Keyword akKeyword = None, string asSchool = "", int aiLevel = -1, int aiLevelComparison = 1, bool abSearchBase = true)
{
Scans the MagicEffects of the Actor's spells, adding the Spell to the returned array if the MagicEffect matches the criteria.
Use the default values to ignore that condition (eg sending asSchool as "" means 'of any School')
NOTE: sending just the akActor (or sending all additional arguments as their default values) will return ALL spells the Actor knows
Optionally will also check through the relevant ActorBase (which is more likely to be the one with the spells)
}

Spell[] Function ActorBaseGetSpells(ActorBase akActorBase, Keyword akKeyword = None, string asSchool = "", int aiLevel = -1, int aiLevelComparison = 1)
{
Scans the MagicEffects of the Actor's spells, adding the Spell to the returned array if the MagicEffect matches the criteria.
Use the default values to ignore that condition (eg sending asSchool as "" means 'of any School')
NOTE: sending just the akActorBase (or sending all additional arguments as their default values) will return ALL spells set on the ActorBase
}

Shout[] Function ActorBaseGetShouts(ActorBase akActorBase, Keyword akKeyword = None)
{
Returns an array of Shouts that match the specified Keyword.
}


; Additional spell-checking Functions
; These are included for convenience. They use the same criteria as the spell-listing functions above
; (and actually, all they do is just call the corresponding function, and return true if the resulting array has at least one entry)

bool Function ActorHasSpell(Actor akActor, Keyword akKeyword = None, string asSchool = "", int aiLevel = -1, int aiLevelComparison = 1, bool abSearchBase = true)
{
Scans the MagicEffects of the Actor's spells, returning true at the first one that matches any of the supplied criteria.
NOTE: sending just the akActor (or sending all additional arguments as their default values) will return TRUE if the actor has any spell at all
Optionally will also check through the relevant ActorBase (which is more likely to be the one with the spells)
}

bool Function ActorBaseHasSpell(ActorBase akActorBase, Keyword akKeyword = None, string asSchool = "", int aiLevel = -1, int aiLevelComparison = 1)
{
Scans the MagicEffects of the ActorBase's spells, returning true at the first one that matches any of the supplied criteria.
NOTE: sending just the akActorBase (or sending all additional arguments as their default values) will return TRUE if the ActorBase has any spell at all
}

bool Function ActorBaseHasShout(ActorBase akActorBase, Keyword akKeyword)
{
Scans the ActorBase's shouts, returning true at the first one that matches the specified Keyword.
}



A Note about checking Spell Levels

If you supply a Level argument to the functions (eg 25 for Apprentice-level spells), the plugin will only check the FIRST Magic Effect on each spell for this. Additionally, if testing for level 0 (Novice), the Magic Effect must have a School assigned to it to be counted.

Explanation:

Spoiler:  

Show




Some example code for usage - the first function is taken directly from the original mod page:


import _Q2C_Functions

ObjectReference Property PlayerRef Auto
Keyword Property VendorItemPotion Auto

Function ReWeightPotions()
  int PotionIndex = GetNumItemsWithKeyword(PlayerRef, VendorItemPotion)
  While(PotionIndex > 0)
    PotionIndex -= 1
    Form potion = GetNthFormWithKeyword(PlayerRef, VendorItemPotion, PotionIndex)
    potion.SetWeight(0.0)
  endWhile
endFunction



Actor Property SomeEnemy Auto
Keyword Property MagicDamageFire Auto

Function CheckEnemyHasFireSpell()
  ; just send the Keyword argument, and leave all others at default
  bool hasFire = ActorHasSpell(SomeEnemy, MagicDamageFire)
  if (hasFire)
    Debug.Trace("The enemy has at least one Fire spell")
  else
    Debug.Trace("Well at least they won't set us on fire...")
  endIf
endFunction



Actor Property SomeAlly Auto

Function CheckAllyHasRestorationSpell()
  ; set Keyword argument to None (meaning 'don't match Keywords'), specify the School, and leave all others at default
  bool hasRestorationSpell = ActorHasSpell(SomeAlly, None, "Restoration")
  if (hasRestorationSpell)
    Debug.Trace("Restoration IS a perfectly valid school of magic")
  else
    Debug.Trace("Guess our ally won't be doing any healing...")
  endIf
endFunction



Actor Property PlayerRef Auto

Function ListPlayerSpells()
  ; just send the Actor argument, and leave all others at defaults, to get a full list of spells the actor knows
  Spell[] actorAllSpells = ActorGetSpells(PlayerRef)
  int spellIndex = 0
  Report("Player has " + actorAllSpells.Length + " spells of any sort")
  while (spellIndex < actorAllSpells.Length)
    Spell currentSpell = actorAllSpells[spellIndex]
    Debug.Trace("Spell " + spellIndex + ": " + currentSpell.GetName())
    spellIndex += 1
  endWhile
endFunction



[color=#1e84cc]I am just the updater of the original work - all credit for the original functions (and my inspiration) is due to Quad2Core.


As per their original wishes:
Feel free to package this plugin with your own mods and use it for your own projects.
Please just mention me (ie Quad2Core) in a footnote somewhere.

All Credits are going to the SKSE Team!

I hope other people can find as much excellent use for these as I have!  Oh - and go give Quad2Core some kudos! :)


原贴地址
1.版本号: 0.06.00   更新时间: 2019-08-07 09:12:37

评论
暂未开放,敬请期待
ta的精品
logo

库存功能SE


Mod大小:81.4 KB
上传时间:2019-08-07 08:53:33

Mod简介:

暂无更多介绍


closeAD