DOTA2中如何实现法伤? 其实还是比较容易的
警告:我实在是懒得再打一遍基础部分鸟~SO,如果你发现以下部分看不懂,不过还是想做RPG的话,请先去阅读:《LUA程序设计第二版》,并看完官方的dota_ugc\dota_addons\holdout_example文件夹下所有内容。
此外:这些代码没有经过测试xD~ 只是提供思路~
首先,我们先确定一个制作目标:制作一个技能,指定一个目标,对它造成200(+0.8法伤等级)的伤害。
既然如此,我们先制作一下这个技能的基础部分:
"fashang_test"//技能的名字
{
"BaseClass" “ability_datadriven”//定义技能的基础是ability_datadriven基本上,所有的自定义技能都是ability_datadriven的
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET"//指定这个技能是对目标施放的
"AbilityUnitTargetTeam""DOTA_UNIT_TARGET_TEAM_ENEMY"//指定这个技能对敌方目标施放
"AbilityUnitTargetType""DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" //指定这个目标能对英雄和基础对象(小兵,召唤物什么的)施放
"MaxLevel" "1"//指定这个技能最多升级一级,当然可以更多,这里就简单一些
"AbilityManaCost" "24" //蓝耗
"AbilityCastRange""500" //施法距离
"AbilityCastPoint""0.2" //施法前摇
"AbilityCooldown" "10.0" //冷却时间
}
之后呢,我们要让他对目标造成法伤伤害:
我们在里面接着写
"AbilityCooldown" "10.0" //冷却时间
“OnSpellStart”//当技能被释放的时候
{
“RunScript"//执行程序内容
{
"ScriptFile" "scripts/vscripts/ap.lua"//程序文件
"Function" "OnAPDamage"//函数名
"DamageBase" "200"//基础伤害
"DamageAP" "0.8"//AP加成
}
}
}
之后呢,我们在scripts/vscripts/ap.lua里面写上这样的内容
function OnAPDamage(keys)
-- 获取施法者
local caster = keys.caster
-- 获取伤害目标
local target = keys.target_entities[1]
-- 设定伤害值,伤害对象,伤害类型等等
local damage = {
attacker = caster, -- 伤害来源
victim = target, -- 伤害目标
damage = keys.DamageBase + keys.DamageAP * GetAP(caster), -- 计算伤害值,基础伤害 + AP加成 * AP值(AP值函数我后面写)
damage_type = DAMAGE_TYPE_MAGICAL, -- 造成魔法伤害
damage_flags = 1 -- 伤害检测,这就是一般,也就是说不能对魔免单位生效啦什么的
}
-- 造成伤害并获取伤害值
local damage_dealt = ApplyDamage(damage)
-- 打印伤害信息
print("已经造成AP伤害,伤害值"..damage_dealt )
end
为了获取玩家身上物品的AP,我们可以有很多种方法实现,最简单(也效率最低)的方法是,每次都去玩家身上所有物品搜索一遍,获取AP设定值~
function GetAP(hero)
-- 初始化AP返回值
local AP = 0
-- 在所有物品格子中循环
for i = 0,5 do
-- 获取物品
local item = hero:GetItemInSlot(i)
-- 找到物品并搜索他的AP加成设定值
if item then ap = item:GetSpecialValueFor("ap_bonus")
-- 累加AP返回值
if ap then AP = AP + ap
end
-- 返回AP值
return AP
end
揍是这样~当然,这个方法不完美,比如说没法处理身上的状态什么的~
比较推荐的是用几个函数,然后给英雄绑定一个自定义的参数值,就像这样:
-- 增加AP加成的函数,参数:英雄,增加值
function AddAP(hero,value)
-- 先获取已经有的加成,没有返回0
local value_old = tonumber(hero:GetContext("ap_bonus") or 0)
-- 计算新值
local value_new = value_old + value
-- 重新设定参数值
hero:SetContext("ap_bonus",value_new,0)
end
-- 移除AP加成的函数,参数:英雄,减少值
function RemoveAP(hero,value)
-- 先获取已经有的加成,没有返回0
local value_old = tonumber(hero:GetContext("ap_bonus") or 0)
-- 计算新值
local value_new = value_old - value
-- 重新设定参数值
hero:SetContext("ap_bonus",value_new,0)
end
-- 获取AP的函数,参数:英雄,无AP加成返回0
function GetAP(hero)
return tonumber(hero:GetContext("ap_bonus") or 0)
end
其实不单单AP加成可以这么做,一切自定义的加成都可以这么做,比如要加什么身法啊,魅力啊,法术精通啊,都是大同小异的方法
我所制作的一个小模式,[疯狂足球,Crazy Soccer],希望大家支持
http://steamcommunity.com/sharedfiles/filedetails/stats/301669869
来自:AMHC.Xavier
群号: 311840015
警告:我实在是懒得再打一遍基础部分鸟~SO,如果你发现以下部分看不懂,不过还是想做RPG的话,请先去阅读:《LUA程序设计第二版》,并看完官方的dota_ugc\dota_addons\holdout_example文件夹下所有内容。
此外:这些代码没有经过测试xD~ 只是提供思路~
首先,我们先确定一个制作目标:制作一个技能,指定一个目标,对它造成200(+0.8法伤等级)的伤害。
既然如此,我们先制作一下这个技能的基础部分:
"fashang_test"//技能的名字
{
"BaseClass" “ability_datadriven”//定义技能的基础是ability_datadriven基本上,所有的自定义技能都是ability_datadriven的
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET"//指定这个技能是对目标施放的
"AbilityUnitTargetTeam""DOTA_UNIT_TARGET_TEAM_ENEMY"//指定这个技能对敌方目标施放
"AbilityUnitTargetType""DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" //指定这个目标能对英雄和基础对象(小兵,召唤物什么的)施放
"MaxLevel" "1"//指定这个技能最多升级一级,当然可以更多,这里就简单一些
"AbilityManaCost" "24" //蓝耗
"AbilityCastRange""500" //施法距离
"AbilityCastPoint""0.2" //施法前摇
"AbilityCooldown" "10.0" //冷却时间
}
之后呢,我们要让他对目标造成法伤伤害:
我们在里面接着写
"AbilityCooldown" "10.0" //冷却时间
“OnSpellStart”//当技能被释放的时候
{
“RunScript"//执行程序内容
{
"ScriptFile" "scripts/vscripts/ap.lua"//程序文件
"Function" "OnAPDamage"//函数名
"DamageBase" "200"//基础伤害
"DamageAP" "0.8"//AP加成
}
}
}
之后呢,我们在scripts/vscripts/ap.lua里面写上这样的内容
function OnAPDamage(keys)
-- 获取施法者
local caster = keys.caster
-- 获取伤害目标
local target = keys.target_entities[1]
-- 设定伤害值,伤害对象,伤害类型等等
local damage = {
attacker = caster, -- 伤害来源
victim = target, -- 伤害目标
damage = keys.DamageBase + keys.DamageAP * GetAP(caster), -- 计算伤害值,基础伤害 + AP加成 * AP值(AP值函数我后面写)
damage_type = DAMAGE_TYPE_MAGICAL, -- 造成魔法伤害
damage_flags = 1 -- 伤害检测,这就是一般,也就是说不能对魔免单位生效啦什么的
}
-- 造成伤害并获取伤害值
local damage_dealt = ApplyDamage(damage)
-- 打印伤害信息
print("已经造成AP伤害,伤害值"..damage_dealt )
end
为了获取玩家身上物品的AP,我们可以有很多种方法实现,最简单(也效率最低)的方法是,每次都去玩家身上所有物品搜索一遍,获取AP设定值~
function GetAP(hero)
-- 初始化AP返回值
local AP = 0
-- 在所有物品格子中循环
for i = 0,5 do
-- 获取物品
local item = hero:GetItemInSlot(i)
-- 找到物品并搜索他的AP加成设定值
if item then ap = item:GetSpecialValueFor("ap_bonus")
-- 累加AP返回值
if ap then AP = AP + ap
end
-- 返回AP值
return AP
end
揍是这样~当然,这个方法不完美,比如说没法处理身上的状态什么的~
比较推荐的是用几个函数,然后给英雄绑定一个自定义的参数值,就像这样:
-- 增加AP加成的函数,参数:英雄,增加值
function AddAP(hero,value)
-- 先获取已经有的加成,没有返回0
local value_old = tonumber(hero:GetContext("ap_bonus") or 0)
-- 计算新值
local value_new = value_old + value
-- 重新设定参数值
hero:SetContext("ap_bonus",value_new,0)
end
-- 移除AP加成的函数,参数:英雄,减少值
function RemoveAP(hero,value)
-- 先获取已经有的加成,没有返回0
local value_old = tonumber(hero:GetContext("ap_bonus") or 0)
-- 计算新值
local value_new = value_old - value
-- 重新设定参数值
hero:SetContext("ap_bonus",value_new,0)
end
-- 获取AP的函数,参数:英雄,无AP加成返回0
function GetAP(hero)
return tonumber(hero:GetContext("ap_bonus") or 0)
end
其实不单单AP加成可以这么做,一切自定义的加成都可以这么做,比如要加什么身法啊,魅力啊,法术精通啊,都是大同小异的方法
我所制作的一个小模式,[疯狂足球,Crazy Soccer],希望大家支持
http://steamcommunity.com/sharedfiles/filedetails/stats/301669869
来自:AMHC.Xavier
群号: 311840015