搜索
热搜: 活动 交友 discuz
查看: 471|回复: 4

[讨论] wiki有没有监听英雄移动的事件

[复制链接]

2

主题

5

帖子

21

积分

Lv:1 隐谧贤者

UID
14897
金币
44
精华
0
节操
0
发表于 2019-9-4 00:45:54 | 显示全部楼层 |阅读模式

前方高能预警!非战斗人员请尽快登录!

您需要 登录 才可以下载或查看,没有帐号?注册账号

x
想让小鸡一直跟随英雄,但是没找到监听移动的事件,难道要写个定时器循环让小鸡往英雄身上移动?
回复

使用道具 举报

0

主题

8

帖子

225

积分

Lv:2 长袍法师

UID
14780
金币
93
精华
0
节操
0
发表于 2019-9-4 16:09:29 | 显示全部楼层
本帖最后由 cowboyfan 于 2019-9-4 17:16 编辑

监听英雄位置,对比小鸡位置,超出一个范围就让小鸡move。7、CalcDistanceBetweenEntityOBB  

原型:float CalcDistanceBetweenEntityOBB(handle handle_1, handle handle_2)
功能:取得实体handle_1的OBB盒与实体handle_2的OBB盒上最近两点间的距离
距离:local dist = CalDistanceBetweenEntityOBB(u1,u2)
说明:令dist等于单位u1和单位u2的OBB盒上最近两个点的距离


验证:
在地面距离1000的两个点上创建两个单位,利用上述API取得OBB盒上的最近2点距离,与1000值做比较。

local p1 = Vector(0,0,0)
local p2 = Vector(1000,0,0)
local u1 = CreateUnitByName("npc_dota_hero_lina",p1,true,nil,nil,DOTA_TEAM_GOODGUYS)
local u2 = CreateUnitByName("npc_dota_hero_lina",p2,true,nil,nil,DOTA_TEAM_GOODGUYS)
local dist = CalcDistanceBetweenEntityOBB(u1,u2)
print(dist)    ->934.1
回复 支持 反对

使用道具 举报

2

主题

5

帖子

21

积分

Lv:1 隐谧贤者

UID
14897
金币
44
精华
0
节操
0
 楼主| 发表于 2019-9-4 23:08:49 | 显示全部楼层
cowboyfan 发表于 2019-9-4 16:09
监听英雄位置,对比小鸡位置,超出一个范围就让小鸡move。7、CalcDistanceBetweenEntityOBB  

原型:flo ...

CalcDistanceBetweenEntityOBB计算两个实体的距离是理解了,但是重点还是在于你说的监听英雄位置,我在api里面也没找到能实时监听英雄位置的功能。依然只能写个think定时器实时取得英雄和小鸡两个两个实体的位置,然后判断距离,再让小鸡移动
回复 支持 反对

使用道具 举报

0

主题

10

帖子

750

积分

Lv:4 虚灵先知

UID
12961
金币
224
精华
0
节操
0
发表于 2019-10-13 01:01:26 | 显示全部楼层
可以参考下,我用的是定时检测,因为是做的宠物跟随,所以移动有随机性就没用移动的事件
API上跟移动相关的事件大概有两个,一个是MODIFIER_EVENT_ON_UNIT_MOVED,一个是MODIFIER_EVENT_ON_ORDER,你可以试试前者的事件

-- Project Name:         Siltbreaker Hard Mode

modifier_pet_follow = class({})

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

function modifier_pet_follow:IsHidden()
        return false
end

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

function modifier_pet_follow:IsPurgable()
        return false
end

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

function modifier_pet_follow:GetPriority()
        return MODIFIER_PRIORITY_ULTRA
end

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

function modifier_pet_follow:OnCreated( kv )
        self:StartIntervalThink(1.5)
end

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

function modifier_pet_follow:DeclareFunctions()
        local funcs =
        {
        }

        return funcs
end

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

function modifier_pet_follow:OnIntervalThink()
        if IsServer() then
                local owner = self:GetParent().PetOwner
                --print("Owner: "..owner:GetUnitName())
                if owner == nil then return 1 end
                if owner:IsNull() then
                        self:StartIntervalThink(-1)
                        UTIL_Remove(self:GetParent())
                        return 0
                end
                if owner.PetIsCollecting == true then return 0 end
                local transport_distance = 1400
                --local fly_distance = 1200
                local walk_distance = 625
                local walk_radius = 250
                local distance = (owner:GetOrigin() - self:GetParent():GetOrigin()):Length2D()
                --print("Pet Follow : Distance "..distance)
               
                if distance > transport_distance then
                        FindClearSpaceForUnit( self:GetParent(), owner:GetOrigin() + RandomVector( RandomFloat(-walk_distance, walk_distance) ), false )
                end
                -- Fly
                --if distance > fly_distance then
                        --self:GetParent():SetMoveCapability(DOTA_UNIT_CAP_MOVE_FLY)
                        --print("Pet Follow : Flying")
                --else
                        --self:GetParent():SetMoveCapability(DOTA_UNIT_CAP_MOVE_GROUND)
                        --print("Pet Follow : Walking")               
                --end
               
                -- Walk
                --if distance > walk_distance then
                        local owner_pos = owner:GetAbsOrigin()
                        local new_pos = owner_pos + RandomVector( RandomFloat(-walk_radius, walk_radius) )
                        self:GetParent():Interrupt()
                        self:GetParent():MoveToPosition(new_pos)
                        --print("Pet Follow : Walk To "..new_pos)
                --end
        end
end
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|AMHC!dota2rpg~ ( 闽ICP备14009209 )

GMT+8, 2019-11-12 19:36 , Processed in 0.060806 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc. Theme.Yeei

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