搜索
热搜: 活动 交友 discuz
查看: 54507|回复: 73

[代码] Dota2编辑器入门指南-单位制作和刷怪

[复制链接]

43

主题

430

帖子

2855

积分

大魔导师

UID
1731
金币
3664
精华
5
节操
-46

黑科技玩的6我是鸽手隐修议员扛把子教程大师创世者开拓者

QQ
发表于 2014-10-23 18:39:55 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 裸奔的代码 于 2014-12-24 12:38 编辑

首先说明一点,等会会用到监听事件
所以没学过监听事件的同学就要去学习咯

下面附上链接,这个是提取Dota2内部的文件
现在学习的是单位设置,查看里面的npc_units.txt即可
http://pan.baidu.com/s/1jG87cIq

先看看单位的基本设置
[mw_shl_code=actionscript3,true]Units: Base
{
        "BaseClass"                                        "npc_dota_base"            // 单位继承的类,这个类有很多,一般我们用npc_dota_creature
        "Model"                                                "models/development/invisiblebox.mdl"        // 模型
        "SoundSet"                                        "hero_Crystal"                // 音效,
        "Level"                                                "1"                                        // 单位等级
        "IsAncient"                                        "0"                                        // 是否是远古生物,0代表不是
        "IsNeutralUnitType"                        "0"                                        // 是否是中立单位
        "SelectionGroup"                        ""                                        // 这个貌似是切换单位组用的,不必管
        "SelectOnSpawn"                                "0"                                        // 创建出来之后是否立即选择
        "CanBeDominated"                        "1"                                        // 可否被支配
        "IgnoreAddSummonedToSelection" "0"                                // 是否忽略左上角图标
        "AutoAttacksByDefault"                "1"                                        // 是否自动攻击
       
        // Abilities
        //----------------------------------------------------------------
        "AbilityLayout"                                ""                        // 技能槽数量,最低4个,最高为6个,技能不多默认即可
        "Ability1"                                        ""                        // 技能 1.
        "Ability2"                                        ""                        // 技能 2.
        "Ability3"                                        ""                        // 技能 3.
        "Ability4"                                        ""                        // 技能 4.
        "Ability5"                                        ""                        // 技能 5.
        "Ability6"                                        ""                        // 技能 6
        "Ability7"                                        ""                        // 技能 7 -最高就显示6个技能,后面添加的技能将不显示
        "Ability8"                                        ""                        // 技能 8 -最高就显示6个技能,后面添加的技能将不显示

        // Armor
        //----------------------------------------------------------------
        "ArmorPhysical"                                "0"                        // 基础护甲
        "MagicalResistance"                        "0"                        // 基础魔抗

        // Attack
        //----------------------------------------------------------------
        "AttackCapabilities"                "DOTA_UNIT_CAP_NO_ATTACK"  //攻击类型
        "AttackDamageMin"                        "1"                                                        // 最小伤害
        "AttackDamageMax"                        "1"                                                        // 最大伤害
        "AttackDamageType"                        "DAMAGE_TYPE_ArmorPhysical"
        "AttackRate"                                "1.7"                                                // 攻击间隔
        "AttackAnimationPoint"                "0.75"                                                // 攻击前摇
        "AttackAcquisitionRange"        "800"                                                // 警戒范围
        "AttackRange"                                "600"                                                // 攻击范围
        "AttackRangeBuffer"                        "250"                                                // 攻击缓冲范围
        "ProjectileModel"                        ""                                                         // 投射物,填写特效路径,只有投射物特效才行
        "ProjectileSpeed"                        "900"                                                // 投射速率

        // Attributes
        //----------------------------------------------------------------
        "AttributePrimary"                        "DOTA_ATTRIBUTE_STRENGTH"  //属性类型,对于单位就没必要了
        "AttributeBaseStrength"                "0"                        // 力量
        "AttributeStrengthGain"                "0"                        // 每升一级力量加成
        "AttributeBaseIntelligence"        "0"                        // 智力
        "AttributeIntelligenceGain"        "0"                        // 每升一级智力加成
        "AttributeBaseAgility"                "0"                        // 敏捷
        "AttributeAgilityGain"                "0"                        // 每升一级敏捷加成

        // 打死这个单位所获得的奖励
        //----------------------------------------------------------------
        "BountyXP"                                        "0"                        // 经验奖励
        "BountyGoldMin"                                "0"                        // 最小金钱奖励
        "BountyGoldMax"                                "0"                        // 最大金钱奖励

        // Bounds
        //----------------------------------------------------------------
        "BoundsHullName"                        "DOTA_HULL_SIZE_HERO"        // 碰撞类型
        "RingRadius"                                "50"                                        // 选择圈范围
        "HealthBarOffset"                        "-1"                                        // 血条偏移量(Z轴)

        // Movement
        //----------------------------------------------------------------
        "MovementCapabilities"                "DOTA_UNIT_CAP_MOVE_NONE"         // 移动类型
        "MovementSpeed"                                "300"                                                // 移动速度
        "MovementTurnRate"                        "0.5"                                                // 转身速度
        "HasAggressiveStance"                "0"                                                        //
        "FollowRange"                                "100"                                                // 最低跟随范围

        // Status
        //----------------------------------------------------------------
        "StatusHealth"                                "150"                // 基础生命值
        "StatusHealthRegen"                        "0"                        // 生命恢复速度
        "StatusMana"                                "0"                        // 基础魔法值
        "StatusManaRegen"                        "0"                        // 魔法恢复速度
        "StatusStartingMana"                "-1"                // 创建出来就是满血

        // Team
        //----------------------------------------------------------------
        "TeamName"                                        "DOTA_TEAM_NEUTRALS"                                // 所属队伍,关系不大
        "CombatClassAttack"                        "DOTA_COMBAT_CLASS_ATTACK_HERO"                // 攻击的伤害类型
        "CombatClassDefend"                        "DOTA_COMBAT_CLASS_DEFEND_HERO"                // 护甲类型
        "UnitRelationshipClass"                "DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT"        //单位关系类
       
        // Vision
        //----------------------------------------------------------------
        "VisionDaytimeRange"                "575"                // 白天视野范围
        "VisionNighttimeRange"                "575"                // 夜晚视野范围
       
        // Bots
        //----------------------------------------------------------------
        "AttackDesire"                                "1.0"                // 攻击欲望,AI的

        //Inventory
        "HasInventory"                                "0"                        // 是否有物品栏
       
        "WakesNeutrals"                                "1"                        // 是否会引起中立注意

        "IdleSoundLoop"                                ""                        // 单位空闲时音效循环

        "vscript"                                        "scripts/vscripts/AI.lua"        //AI就是这样实现的
}[/mw_shl_code]
注意:这里面的某些设置是不必要的,通过对比官方单位的设置可以看出来
某些设置没填写会按照默认

接下来是一些常量,例如攻击的伤害类型,护甲类型等

AttackCapabilities    //攻击类型
DOTA_UNIT_CAP_MELEE_ATTACK 近战攻击
DOTA_UNIT_CAP_RANGED_ATTACK 远程攻击
DOTA_UNIT_CAP_NO_ATTACK 无攻击


MovementCapabilities    //移动类型
DOTA_UNIT_CAP_MOVE_GROUND 地面
DOTA_UNIT_CAP_MOVE_FLY 飞行
DOTA_UNIT_CAP_MOVE_NONE


AttributePrimary    //属性类型
DOTA_ATTRIBUTE_AGILITY 敏捷
DOTA_ATTRIBUTE_INTELLECT 智力
DOTA_ATTRIBUTE_STRENGTH 力量

BoundsHullName    //碰撞类型
DOTA_HULL_SIZE_BARRACKS 兵营
DOTA_HULL_SIZE_BUILDING 建筑
DOTA_HULL_SIZE_FILLER 就是高地上那个没用的建筑
DOTA_HULL_SIZE_HERO 英雄
DOTA_HULL_SIZE_HUGE 大型
DOTA_HULL_SIZE_REGULAR 普通
DOTA_HULL_SIZE_SIEGE 城堡
DOTA_HULL_SIZE_SMALL 小型
DOTA_HULL_SIZE_TOWER 塔                                 


CombatClassAttack    //攻击的伤害类型
DOTA_COMBAT_CLASS_ATTACK_BASIC 普通
DOTA_COMBAT_CLASS_ATTACK_HERO 英雄
DOTA_COMBAT_CLASS_ATTACK_LIGHT 混乱
DOTA_COMBAT_CLASS_ATTACK_PIERCE 穿刺
DOTA_COMBAT_CLASS_ATTACK_SIEGE 攻城


CombatClassDefend    //护甲类型
DOTA_COMBAT_CLASS_DEFEND_BASIC 普通
DOTA_COMBAT_CLASS_DEFEND_HERO 英雄
DOTA_COMBAT_CLASS_DEFEND_SOFT 轻型
DOTA_COMBAT_CLASS_DEFEND_STRONG 重型
DOTA_COMBAT_CLASS_DEFEND_STRUCTURE 建筑
DOTA_COMBAT_CLASS_DEFEND_WEAK 脆弱


UnitRelationshipClass    //单位关系
DOTA_NPC_UNIT_RELATIONSHIP_TYPE_BARRACKS兵营
DOTA_NPC_UNIT_RELATIONSHIP_TYPE_BUILDING 建筑
DOTA_NPC_UNIT_RELATIONSHIP_TYPE_COURIER 信使
DOTA_NPC_UNIT_RELATIONSHIP_TYPE_DEFAULT 守护
DOTA_NPC_UNIT_RELATIONSHIP_TYPE_HERO 英雄
DOTA_NPC_UNIT_RELATIONSHIP_TYPE_SIEGE 主城
DOTA_NPC_UNIT_RELATIONSHIP_TYPE_WARD

二楼是刷怪教程

回复

使用道具 举报

55

主题

356

帖子

3942

积分

大摸导师

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

UID
12
金币
3943
精华
4
节操
-233

黑科技玩的6扛把子我是鸽手隐修议员教程大师创世者开拓者幸运儿!

发表于 2014-12-2 10:58:41 | 显示全部楼层
本帖最后由 Xavier 于 2014-12-2 11:02 编辑

贡献一波刷怪的代码,是在真三RPG中使用的,基本原理毫无二致,以供参考

[mw_shl_code=golang,true]-- 初始化刷怪器·真三
if ZSSpawner == nil then
    ZSSpawner = class( { })
end

-- API : 开始刷怪
function ZSSpawner:Start()

    -- 初始刷近战3个,远程1个
    self.__melee_count = 3
    self.__range_count = 1

    -- 记录开始刷兵时间
    self.__spawn_start_time = GameRules:GetGameTime()

    -- 记录小兵升级
    self.__creature_levelup = 0

    -- 寻找刷怪点
    self:CollectSpawners()

    -- 刷第一波怪
    self:Spawn()

    -- 之后每30秒刷一波兵
    GameRules:GetGameModeEntity():SetContextThink(DoUniqueString("shua_bing"),
    function()
        -- 确保游戏正在进行中(游戏结束后在面板不再刷怪)
        if GameRules:State_Get() >= DOTA_GAMERULES_STATE_GAME_IN_PROGRESS then
            -- 获取当前游戏事件,来判断是否需要增加小兵个数和对小兵进行升级
            local now = GameRules:GetGameTime()

            -- 当游戏时间逝去1000秒,近战兵为4个
            if now - self.__spawn_start_time >= 1000 and self.__melee_count <= 3 then
                self.__melee_count = 4
            end

            -- 当游戏时间逝去1300秒,远程兵为2个
            if now - self.__spawn_start_time >= 1300 and self.__range_count <= 1 then
                self.__range_count = 2
            end

            -- 每550秒小兵等级增加1级,增加40血量和7攻击,550秒要加上英雄选择的12秒和出兵的48秒。
            local upgrade_level = math.floor((now - self.__spawn_start_time + 60) / 550)
            if upgrade_level > self.__creature_levelup then self.__creature_levelup = upgrade_level end


            -- 循环刷近战和远程兵
            print("DO SPAWN")
            for i = 1, self.__melee_count do
                self:DoSpawn(self.__spawners["wei_top"]:GetOrigin() + RandomVector(30), "npc_zs_creep_wei_melee", self.__target["wei_top"], DOTA_TEAM_BADGUYS, self.__creature_levelup)
                self:DoSpawn(self.__spawners["wei_mid"]:GetOrigin() + RandomVector(30), "npc_zs_creep_wei_melee", self.__target["wei_mid"], DOTA_TEAM_BADGUYS, self.__creature_levelup)
                self:DoSpawn(self.__spawners["wei_bot"]:GetOrigin() + RandomVector(30), "npc_zs_creep_wei_melee", self.__target["wei_bot"], DOTA_TEAM_BADGUYS, self.__creature_levelup)
                self:DoSpawn(self.__spawners["shu_top"]:GetOrigin() + RandomVector(30), "npc_zs_creep_shu_melee", self.__target["shu_top"], DOTA_TEAM_GOODGUYS, self.__creature_levelup)
                self:DoSpawn(self.__spawners["shu_mid"]:GetOrigin() + RandomVector(30), "npc_zs_creep_shu_melee", self.__target["shu_mid"], DOTA_TEAM_GOODGUYS, self.__creature_levelup)
                self:DoSpawn(self.__spawners["shu_bot"]:GetOrigin() + RandomVector(30), "npc_zs_creep_shu_melee", self.__target["shu_bot"], DOTA_TEAM_GOODGUYS, self.__creature_levelup)
            end
            for i = 1, self.__range_count do
                --                                                    确保远程兵刷在最后一个。-- 或者说是尽量刷在最后一个吧
                self:DoSpawn(self.__spawners["wei_top"]:GetOrigin() + Vector(50, 0, 0), "npc_zs_creep_wei_range", self.__target["wei_top"], DOTA_TEAM_BADGUYS, self.__creature_levelup)
                self:DoSpawn(self.__spawners["wei_mid"]:GetOrigin() + Vector(30, 30, 0), "npc_zs_creep_wei_range", self.__target["wei_mid"], DOTA_TEAM_BADGUYS, self.__creature_levelup)
                self:DoSpawn(self.__spawners["wei_bot"]:GetOrigin() + Vector(0, 50, 0), "npc_zs_creep_wei_range", self.__target["wei_bot"], DOTA_TEAM_BADGUYS, self.__creature_levelup)
                self:DoSpawn(self.__spawners["shu_top"]:GetOrigin() + Vector(0, -50, 0), "npc_zs_creep_shu_range", self.__target["shu_top"], DOTA_TEAM_GOODGUYS, self.__creature_levelup)
                self:DoSpawn(self.__spawners["shu_mid"]:GetOrigin() + Vector(-30, -30, 0), "npc_zs_creep_shu_range", self.__target["shu_mid"], DOTA_TEAM_GOODGUYS, self.__creature_levelup)
                self:DoSpawn(self.__spawners["shu_bot"]:GetOrigin() + Vector(-50, 0, 0), "npc_zs_creep_shu_range", self.__target["shu_bot"], DOTA_TEAM_GOODGUYS, self.__creature_levelup)
            end
            -- 如果游戏正在进行中,则继续30秒刷一波
            if GameRules:State_Get() == DOTA_GAMERULES_STATE_GAME_IN_PROGRESS then
                return 30
            else
                return nil
            end
        end
    end ,
    30)
end

-- 刷怪函数
function ZSSpawner:Spawn()
    -- 循环近战小兵个数和远程小兵个数次,分别在六个刷怪点刷对应个数的怪。
    for i = 1, self.__melee_count do
        self:DoSpawn(self.__spawners["wei_top"]:GetOrigin() + RandomVector(30), "npc_zs_creep_wei_melee", self.__target["wei_top"], DOTA_TEAM_BADGUYS, self.__creature_levelup)
        self:DoSpawn(self.__spawners["wei_mid"]:GetOrigin() + RandomVector(30), "npc_zs_creep_wei_melee", self.__target["wei_mid"], DOTA_TEAM_BADGUYS, self.__creature_levelup)
        self:DoSpawn(self.__spawners["wei_bot"]:GetOrigin() + RandomVector(30), "npc_zs_creep_wei_melee", self.__target["wei_bot"], DOTA_TEAM_BADGUYS, self.__creature_levelup)
        self:DoSpawn(self.__spawners["shu_top"]:GetOrigin() + RandomVector(30), "npc_zs_creep_shu_melee", self.__target["shu_top"], DOTA_TEAM_GOODGUYS, self.__creature_levelup)
        self:DoSpawn(self.__spawners["shu_mid"]:GetOrigin() + RandomVector(30), "npc_zs_creep_shu_melee", self.__target["shu_mid"], DOTA_TEAM_GOODGUYS, self.__creature_levelup)
        self:DoSpawn(self.__spawners["shu_bot"]:GetOrigin() + RandomVector(30), "npc_zs_creep_shu_melee", self.__target["shu_bot"], DOTA_TEAM_GOODGUYS, self.__creature_levelup)
    end
    for i = 1, self.__range_count do
        self:DoSpawn(self.__spawners["wei_top"]:GetOrigin() + Vector(80, 0, 0), "npc_zs_creep_wei_range", self.__target["wei_top"], DOTA_TEAM_BADGUYS, self.__creature_levelup)
        self:DoSpawn(self.__spawners["wei_mid"]:GetOrigin() + Vector(50, 50, 0), "npc_zs_creep_wei_range", self.__target["wei_mid"], DOTA_TEAM_BADGUYS, self.__creature_levelup)
        self:DoSpawn(self.__spawners["wei_bot"]:GetOrigin() + Vector(0, 80, 0), "npc_zs_creep_wei_range", self.__target["wei_bot"], DOTA_TEAM_BADGUYS, self.__creature_levelup)
        self:DoSpawn(self.__spawners["shu_top"]:GetOrigin() + Vector(0, -80, 0), "npc_zs_creep_shu_range", self.__target["shu_top"], DOTA_TEAM_GOODGUYS, self.__creature_levelup)
        self:DoSpawn(self.__spawners["shu_mid"]:GetOrigin() + Vector(-50, -50, 0), "npc_zs_creep_shu_range", self.__target["shu_mid"], DOTA_TEAM_GOODGUYS, self.__creature_levelup)
        self:DoSpawn(self.__spawners["shu_bot"]:GetOrigin() + Vector(-80, 0, 0), "npc_zs_creep_shu_range", self.__target["shu_bot"], DOTA_TEAM_GOODGUYS, self.__creature_levelup)
    end
end

-- [Comment]
-- 刷一个小兵的函数,在其他地方也可以调用
-- spawn_location: 刷怪地点
-- unit_name: 刷怪名称
-- initial_target: 初始目标
-- team: 队伍
-- level: 等级,要升级为几级,就设置为几级
function ZSSpawner:DoSpawn(spawn_location, unit_name, initial_target, team, level)
    local creep = CreateUnitByName(unit_name, spawn_location, true, nil, nil, team)

    -- 如果是兵线上的小兵,为其设置等级
    if creep:GetClassname() == 'npc_dota_creep_lane' then
        self:CreepLevelUp(creep, level)
    end
    -- 如果可以应用CreatureLevelUp,则为其升级
    if creep.CreatureLevelUp and level > 1 then
        print('creature level up enabled, leveling')
        creep:CreatureLevelUp(level - 1)
    end

    creep:SetMustReachEachGoalEntity(true)
    creep:SetInitialGoalEntity(initial_target)
end

-- 为小兵升级的特殊函数,血量+40,攻击力+7
function ZSSpawner:CreepLevelUp(creep, level)
    local health = creep:GetHealth() + 40 * level
    creep:SetMaxHealth(health)
    creep:SetHealth(health)
    creep:SetBaseDamageMin(creep:GetBaseDamageMin() + 7 * level)
    creep:SetBaseDamageMax(creep:GetBaseDamageMax() + 7 * level)
end

-- 循环在地图上查找刷怪位置实体
function ZSSpawner:CollectSpawners()
    self.__spawners = { }
    self.__target = { }

    local spawner_wei_top = Entities:FindByName(nil, 'wei_spawner_top')
    local spawner_wei_mid = Entities:FindByName(nil, 'wei_spawner_mid')
    local spawner_wei_bot = Entities:FindByName(nil, 'wei_spawner_bot')

    local target_wei_top = Entities:FindByName(nil, "wei_top_1")
    local target_wei_mid = Entities:FindByName(nil, "wei_mid_01")
    local target_wei_bot = Entities:FindByName(nil, "wei_bot_1")

    if spawner_wei_top then
        self.__spawners["wei_top"] = spawner_wei_top
    else
        print("SPAWNER WEI TOP NOT FOUND!!!!!!!!!!!!!")
    end
    if spawner_wei_mid then
        self.__spawners["wei_mid"] = spawner_wei_mid
    else
        print("SPAWNER WEI MID NOT FOUND!!!!!!!!!!!!!")
    end
    if spawner_wei_bot then
        self.__spawners["wei_bot"] = spawner_wei_bot
    else
        print("SPAWNER WEI BOT NOT FOUND!!!!!!!!!!!!!")
    end

    if target_wei_top then
        self.__target["wei_top"] = target_wei_top
    else
        print("target WEI TOP NOT FOUND!!!!!!!!!!!!!")
    end
    if target_wei_mid then
        self.__target["wei_mid"] = target_wei_mid
    else
        print("target WEI MID NOT FOUND!!!!!!!!!!!!!")
    end
    if target_wei_bot then
        self.__target["wei_bot"] = target_wei_bot
    else
        print("target WEI BOT NOT FOUND!!!!!!!!!!!!!")
    end

    local spawner_shu_top = Entities:FindByName(nil, 'shu_spawner_top')
    local spawner_shu_mid = Entities:FindByName(nil, 'shu_spawner_mid')
    local spawner_shu_bot = Entities:FindByName(nil, 'shu_spawner_bot')

    local target_shu_top = Entities:FindByName(nil, "shu_top_1")
    local target_shu_mid = Entities:FindByName(nil, "shu_mid_1")
    local target_shu_bot = Entities:FindByName(nil, "shu_bot_1")

    if spawner_shu_top then
        self.__spawners["shu_top"] = spawner_shu_top
    else
        print("SPAWNER shu TOP NOT FOUND!!!!!!!!!!!!!")
    end
    if spawner_shu_mid then
        self.__spawners["shu_mid"] = spawner_shu_mid
    else
        print("SPAWNER shu MID NOT FOUND!!!!!!!!!!!!!")
    end
    if spawner_shu_bot then
        self.__spawners["shu_bot"] = spawner_shu_bot
    else
        print("SPAWNER shu BOT NOT FOUND!!!!!!!!!!!!!")
    end

    if target_shu_top then
        self.__target["shu_top"] = target_shu_top
    else
        print("target shu TOP NOT FOUND!!!!!!!!!!!!!")
    end
    if target_shu_mid then
        self.__target["shu_mid"] = target_shu_mid
    else
        print("target shu MID NOT FOUND!!!!!!!!!!!!!")
    end
    if target_shu_bot then
        self.__target["shu_bot"] = target_shu_bot
    else
        print("target shu BOT NOT FOUND!!!!!!!!!!!!!")
    end
end[/mw_shl_code]
回复 支持 5 反对 0

使用道具 举报

43

主题

430

帖子

2855

积分

大魔导师

UID
1731
金币
3664
精华
5
节操
-46

黑科技玩的6我是鸽手隐修议员扛把子教程大师创世者开拓者

QQ
 楼主| 发表于 2014-10-23 19:23:00 | 显示全部楼层
本帖最后由 裸奔的代码 于 2014-10-24 01:40 编辑

项目就用编辑器概览那篇创建的zhuzai
我们会用到事件监听,系统自带的实体

首先,打开地图,我就打开默认的template_map.vmap
先选择左边的工具栏里面有个灯泡一样的按钮,点击,
出现如下图所示,如果Entity Class右边,没有出现那个向下的箭头
就像图中所说的那样把窗口扩大一些就行
然后点击那个向下的小箭头会出现列表,找到path_corner


接着在地图中点击鼠标就可以创建实体了
如下图所示


接下来重点
如图中所示,依次把三个实体的名字命名成ShuaGuai_1, ShuaGuai_2, ShuaGuai_3
输入完毕的时候回车就可以了,然后Name那里的颜色就会改变,代表修改了

这个名字是随意的,我就不卖弄英语了,直接拼音

瞧瞧下图,把两个实体连接起来

依次类推,把ShuaGuai_2连接到ShuaGuai_3


接下来打开项目中的script\vscript文件夹,打开addon_game_mode.lua
先说一下,下面就简单的演示一下刷怪,入门指南里面实例那一块有个easy项目实例,里面就有刷怪实例
敲入如下代码,要根据自己的情况修改
[mw_shl_code=golang,true]function CZhuZaiGameMode:InitGameMode()
        print( "ZhuZai addon is loaded." )

        --设置游戏准备时间
        GameRules:SetPreGameTime( 10.0)
       
        --监听游戏进度
        ListenToGameEvent("game_rules_state_change", Dynamic_Wrap(CZhuZaiGameMode,"OnGameRulesStateChange"), self)
end

function CZhuZaiGameMode:OnGameRulesStateChange( keys )
        print("OnGameRulesStateChange")

        --获取游戏进度
        local newState = GameRules:State_Get()

        --游戏开始
        if newState==DOTA_GAMERULES_STATE_GAME_IN_PROGRESS then
                ShuaGuai()
        end
end

function ShuaGuai( )
       
        for i=1,3 do
                --获取ShuaGuai_1这个实体
                local ShuaGuai_entity = Entities:FindByName(nil,"ShuaGuai_1")

                --创建单位
                local ShuaGuai = CreateUnitByName("npc_dota_neutral_alpha_wolf",ShuaGuai_entity:GetOrigin(),false,nil,nil,DOTA_TEAM_GOODGUYS)

                --禁止单位寻找最短路径
                ShuaGuai:SetMustReachEachGoalEntity(true)

                --让单位沿着设置好的路线开始行动
                ShuaGuai:SetInitialGoalEntity(ShuaGuai_entity)

                --添加相位移动的modifier,持续时间0.1秒
                --当相位移动的modifier消失,系统会自动计算碰撞,这样就避免了卡位
                ShuaGuai:AddNewModifier(nil, nil, "modifier_phased", {duration=0.1})
        end
end[/mw_shl_code]

效果如下

本帖子中包含更多资源

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

x
回复 支持 3 反对 0

使用道具 举报

20

主题

118

帖子

844

积分

魔导师

UID
2311
金币
932
精华
0
节操
-58

隐修议员幸运儿!

发表于 2014-11-7 16:33:53 | 显示全部楼层
代码君,ShuaGuai_1按住shift拉出一个新的,他自动就是ShuaGuai_2,下个路径都已经设置好的哦。
回复 支持 2 反对 0

使用道具 举报

76

主题

697

帖子

3047

积分

大摸导师

热爱让我们并肩

UID
4
金币
3554
精华
0
节操
-233

隐修议员

QQ
发表于 2015-7-22 14:49:21 | 显示全部楼层
aircircle 发表于 2015-7-22 13:31
大神求指点,我完全按照这个步骤,但是进游戏之后刷不出怪啊
我看到控制台里貌似有三条是报错信息,应该是 ...

不要太伸手,这里只是提供一个思路,更多需要你自己去写。模型报错可能是你没有预载入,最好贴上报错信息的截图。
首先你要有这个wolf单位(确定单位写了吗?),然后单位的模型还需要预载入不然会error
代码是可以直接复制后加以修改的,替换也只是替换相同模块下的代码。
如果一个人尽可能做好能做的事情,那这个世界就一定会因为这件事情而变得更美好一点。
回复 支持 1 反对 1

使用道具 举报

0

主题

1

帖子

6

积分

Lv:1 隐谧贤者

UID
4835
金币
21
精华
0
节操
0
发表于 2015-7-22 13:31:40 | 显示全部楼层
大神求指点,我完全按照这个步骤,但是进游戏之后刷不出怪啊
我看到控制台里貌似有三条是报错信息,应该是找不到wolf这个模型,这个模型应该是放在哪里的呢?我用文件搜索也搜不到这个模型
还有,你给的那个代码,是要放在原来lua代码的后面,还是把之前的代码替换掉?
回复 支持 1 反对 1

使用道具 举报

43

主题

430

帖子

2855

积分

大魔导师

UID
1731
金币
3664
精华
5
节操
-46

黑科技玩的6我是鸽手隐修议员扛把子教程大师创世者开拓者

QQ
 楼主| 发表于 2015-10-7 01:01:20 | 显示全部楼层
0-7 发表于 2015-10-6 11:59
说下我遇到的问题。
1.local ShuaGuai = CreateUnitByName("npc_dota_neutral_alpha_wolf",ShuaGuai_entit ...

GetOrigin也可以,把false改成true就可以了
回复 支持 0 反对 1

使用道具 举报

54

主题

539

帖子

3421

积分

魔导师

UID
2370
金币
3456
精华
0
节操
-363

创世者隐修议员扛把子脑洞大开教程大师开拓者我是鸽手黑科技玩的6平妖侠士

发表于 2014-10-24 06:23:44 | 显示全部楼层
我没找到警戒范围 就是多少范围内碰到敌人就走过去自动攻击
回复 支持 反对

使用道具 举报

10

主题

101

帖子

368

积分

Lv:3 空明术士

UID
2883
金币
643
精华
0
节操
-16

幸运儿!

发表于 2014-10-24 09:11:11 | 显示全部楼层
终于可以打怪物了,能不能设置成刷多久停止?或者随着时间推移刷的怪物会变厉害?(笨蛋,当然可以了。怎么实现呢?)
回复 支持 反对

使用道具 举报

43

主题

430

帖子

2855

积分

大魔导师

UID
1731
金币
3664
精华
5
节操
-46

黑科技玩的6我是鸽手隐修议员扛把子教程大师创世者开拓者

QQ
 楼主| 发表于 2014-10-24 13:03:31 | 显示全部楼层
Crane 发表于 2014-10-24 09:11
终于可以打怪物了,能不能设置成刷多久停止?或者随着时间推移刷的怪物会变厉害?(笨蛋,当然可以了。怎么 ...

这当然可以,不过需要你对API有些熟悉
回复 支持 反对

使用道具 举报

0

主题

2

帖子

2

积分

Lv:1 隐谧贤者

UID
2925
金币
16
精华
0
节操
0
发表于 2014-10-28 23:47:55 | 显示全部楼层
怎么打开地图,我双击直接进入地图编辑的那个功能里去了
回复 支持 反对

使用道具 举报

43

主题

430

帖子

2855

积分

大魔导师

UID
1731
金币
3664
精华
5
节操
-46

黑科技玩的6我是鸽手隐修议员扛把子教程大师创世者开拓者

QQ
 楼主| 发表于 2014-10-29 18:32:26 | 显示全部楼层
暴力小田鼠 发表于 2014-10-28 23:47
怎么打开地图,我双击直接进入地图编辑的那个功能里去了

什么意思,你该不会直接看这个吧
回复 支持 反对

使用道具 举报

0

主题

2

帖子

2

积分

Lv:1 隐谧贤者

UID
2962
金币
6
精华
0
节操
0
发表于 2014-11-7 15:27:22 | 显示全部楼层
正式版和中文版 明年能出来么~~~
回复 支持 反对

使用道具 举报

43

主题

430

帖子

2855

积分

大魔导师

UID
1731
金币
3664
精华
5
节操
-46

黑科技玩的6我是鸽手隐修议员扛把子教程大师创世者开拓者

QQ
 楼主| 发表于 2014-11-7 15:31:22 | 显示全部楼层
阿扎西 发表于 2014-11-7 15:27
正式版和中文版 明年能出来么~~~

V社是说要明年出,大概是年初,至于会不会跳票不知道了
应该是不会,你想想Dota2的万圣节都没出,精力都花在上面了
回复 支持 反对

使用道具 举报

43

主题

430

帖子

2855

积分

大魔导师

UID
1731
金币
3664
精华
5
节操
-46

黑科技玩的6我是鸽手隐修议员扛把子教程大师创世者开拓者

QQ
 楼主| 发表于 2014-11-7 16:53:24 | 显示全部楼层
求大神教我做图 发表于 2014-11-7 16:33
代码君,ShuaGuai_1按住shift拉出一个新的,他自动就是ShuaGuai_2,下个路径都已经设置好的哦。

还有这种快捷键,( ̄︶ ̄)↗ 涨见识了
回复 支持 反对

使用道具 举报

17

主题

37

帖子

113

积分

Lv:1 隐谧贤者

UID
1999
金币
596
精华
0
节操
-12

幸运儿!

发表于 2014-11-25 09:46:30 | 显示全部楼层
你设置的shuaiguai1在左边,为什么怪物在shuaguai3的位置出现了呀?还有怪物的种类如何添加的呀。看你没有注明呀
回复 支持 反对

使用道具 举报

17

主题

37

帖子

113

积分

Lv:1 隐谧贤者

UID
1999
金币
596
精华
0
节操
-12

幸运儿!

发表于 2014-11-25 09:47:33 | 显示全部楼层
鼠标获取点一下,就触发了?不懂呀
回复 支持 反对

使用道具 举报

43

主题

430

帖子

2855

积分

大魔导师

UID
1731
金币
3664
精华
5
节操
-46

黑科技玩的6我是鸽手隐修议员扛把子教程大师创世者开拓者

QQ
 楼主| 发表于 2014-11-25 13:06:49 | 显示全部楼层
307665114 发表于 2014-11-25 09:46
你设置的shuaiguai1在左边,为什么怪物在shuaguai3的位置出现了呀?还有怪物的种类如何添加的呀。看你没有 ...

是因为在编辑器里面镜头刚好跟游戏的镜头相反了,所以才导致的这种结果
sorry,也没注意到这一点
回复 支持 反对

使用道具 举报

43

主题

430

帖子

2855

积分

大魔导师

UID
1731
金币
3664
精华
5
节操
-46

黑科技玩的6我是鸽手隐修议员扛把子教程大师创世者开拓者

QQ
 楼主| 发表于 2014-11-25 13:08:05 | 显示全部楼层
307665114 发表于 2014-11-25 09:47
鼠标获取点一下,就触发了?不懂呀

- -!我也不太懂你说的意思
回复 支持 反对

使用道具 举报

17

主题

37

帖子

113

积分

Lv:1 隐谧贤者

UID
1999
金币
596
精华
0
节操
-12

幸运儿!

发表于 2014-12-1 13:45:28 | 显示全部楼层
裸奔的代码 发表于 2014-11-25 13:08
- -!我也不太懂你说的意思

你鼠标点了一下,怪物就出现了?

什么情况,怪物才出现呀,到时间了?还是走到某一个区域?
回复 支持 反对

使用道具 举报

17

主题

37

帖子

113

积分

Lv:1 隐谧贤者

UID
1999
金币
596
精华
0
节操
-12

幸运儿!

发表于 2014-12-1 13:48:11 | 显示全部楼层
裸奔的代码 发表于 2014-11-25 13:06
是因为在编辑器里面镜头刚好跟游戏的镜头相反了,所以才导致的这种结果
sorry,也没注意到这一点

相反呀。
我智商低,学的慢。。
你还给我绕圈子,哈哈\
谢谢了
回复 支持 反对

使用道具 举报

43

主题

430

帖子

2855

积分

大魔导师

UID
1731
金币
3664
精华
5
节操
-46

黑科技玩的6我是鸽手隐修议员扛把子教程大师创世者开拓者

QQ
 楼主| 发表于 2014-12-1 21:02:47 | 显示全部楼层
307665114 发表于 2014-12-1 13:45
你鼠标点了一下,怪物就出现了?

什么情况,怪物才出现呀,到时间了?还是走到某一个区域?

选择英雄之后不是有个准备阶段吗
准备阶段的计时结束了就刷怪
回复 支持 反对

使用道具 举报

7

主题

29

帖子

157

积分

Lv:2 长袍法师

UID
2960
金币
116
精华
0
节操
-1
发表于 2014-12-1 22:42:12 | 显示全部楼层
本帖最后由 fooltomb 于 2014-12-1 22:44 编辑

计时器怎么弄啊?
我想每半分钟运行一次shuaguai()
[mw_shl_code=golang,true]--监听游戏进度
function Ctkt1GameMode:InitGameMode()
        print( "Template addon is loaded." )
    ListenToGameEvent("game_rules_state_change",Dynamic_Wrap(Ctkt1GameMode,"OnGameRulesStateChange"),self)
   
end
time=0 --初始刷兵时间

if CTRoundThinker==nil then
CTRoundThinker=class({})
end

function Ctkt1GameMode:OnThink()
        if GameRules:State_Get() == DOTA_GAMERULES_STATE_GAME_IN_PROGRESS then
                --print( "Template addon script is running." )
                CTRoundThinker:Think()
        elseif GameRules:State_Get() >= DOTA_GAMERULES_STATE_POST_GAME then
                return nil
        end
        return 1
end


--获取游戏进度

function Ctkt1GameMode:OnGameRulesStateChange(keys)
    newState=GameRules:State_Get()

end
--判断是否是刷兵时间
function CTRoundThinker:Think()
             if GameRules:GetGameTime()>=time then
                shuabing()
                time=time+30
                print(time)
                end

end
--刷兵函数
function Shuabing()
     for i=1,5 do
                local Shuabing_shiti=Entities:FindByName(nil,"Szhonglubing0")
                local Shuabing=CreateUnitByName("Sxiaobingjinzhan",Shuabing_shiti:GetAbsOrigin(),false,nil,nil,DOTA_TEAM_GOODGUYS)

                          Shuabing:SetMustReachEachGoalEntity(true)

                  Shuabing:SetInitialGoalEntity(Shuabing_shiti)

                          Shuabing:AddNewModifier(nil,nil,"modifier_phased",{duration=0.1})
         end

end
[/mw_shl_code]
哪位大神帮我看下哪里写错了

点评

问哪错的时候把错误信息发上来和道歉时要露出胸部一样是常识  发表于 2014-12-1 23:05
回复 支持 反对

使用道具 举报

7

主题

29

帖子

157

积分

Lv:2 长袍法师

UID
2960
金币
116
精华
0
节操
-1
发表于 2014-12-2 10:26:23 | 显示全部楼层
错误信息哪里看啊
回复 支持 反对

使用道具 举报

1

主题

89

帖子

256

积分

Lv:2 长袍法师

UID
2908
金币
190
精华
0
节操
1
发表于 2014-12-2 15:46:40 | 显示全部楼层
代码哥,好久不见!

我想生成一个敌方的英雄单位,给我的技能做测试,
我用你的方法,在shuaguai1的地方放的不是狼,而是JUGG,F9之后,发现在生成的是error,为什么哦?谢谢
回复 支持 反对

使用道具 举报

1

主题

89

帖子

256

积分

Lv:2 长袍法师

UID
2908
金币
190
精华
0
节操
1
发表于 2014-12-2 15:49:19 | 显示全部楼层
徐胜 发表于 2014-12-2 15:46
代码哥,好久不见!

我想生成一个敌方的英雄单位,给我的技能做测试,

不是JUGG的模型    是一个小小的 error
回复 支持 反对

使用道具 举报

76

主题

697

帖子

3047

积分

大摸导师

热爱让我们并肩

UID
4
金币
3554
精华
0
节操
-233

隐修议员

QQ
发表于 2014-12-2 16:31:49 | 显示全部楼层
徐胜 发表于 2014-12-2 15:46
代码哥,好久不见!

我想生成一个敌方的英雄单位,给我的技能做测试,

需要预载入这个模型  在你的 scripts/vscripts/addon_game_mode.lua 里

PrecacheModel("JUGG的路径",context)
如果一个人尽可能做好能做的事情,那这个世界就一定会因为这件事情而变得更美好一点。
回复 支持 反对

使用道具 举报

7

主题

29

帖子

157

积分

Lv:2 长袍法师

UID
2960
金币
116
精华
0
节操
-1
发表于 2014-12-2 22:59:09 | 显示全部楼层
本帖最后由 fooltomb 于 2014-12-3 17:53 编辑
Xavier 发表于 2014-12-2 10:58
贡献一波刷怪的代码,是在真三RPG中使用的,基本原理毫无二致,以供参考

[mw_shl_code=golang,true]--  ...

133行开始是判断兵营是否被摧毁的么?
回复 支持 反对

使用道具 举报

55

主题

356

帖子

3942

积分

大摸导师

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

UID
12
金币
3943
精华
4
节操
-233

黑科技玩的6扛把子我是鸽手隐修议员教程大师创世者开拓者幸运儿!

发表于 2014-12-4 10:22:38 | 显示全部楼层
fooltomb 发表于 2014-12-2 22:59
133行开始是判断兵营是否被摧毁的么?

不是,是限制刷出来的单位必须按照路径点移动,而不能跳过某个路径点直接寻找最短路径。 再下一行就是设置一个初始路径点,这个主贴有说了
回复 支持 反对

使用道具 举报

1

主题

10

帖子

109

积分

Lv:1 隐谧贤者

不吐槽会死星人

UID
3101
金币
131
精华
0
节操
5
QQ
发表于 2014-12-11 11:09:15 | 显示全部楼层
简直炫酷 = = 完全看不懂 = =
回复 支持 反对

使用道具 举报

2

主题

3

帖子

52

积分

Lv:1 隐谧贤者

UID
2632
金币
59
精华
0
节操
0
发表于 2014-12-14 20:29:07 | 显示全部楼层
fooltomb 发表于 2014-12-1 22:42
计时器怎么弄啊?
我想每半分钟运行一次shuaguai()
[mw_shl_code=golang,true]--监听游戏进度

使用协同程序coroutine这个,类似于线程
回复 支持 反对

使用道具 举报

76

主题

697

帖子

3047

积分

大摸导师

热爱让我们并肩

UID
4
金币
3554
精华
0
节操
-233

隐修议员

QQ
发表于 2014-12-19 23:47:29 | 显示全部楼层
   "IgnoreAddSummonedToSelection" "0"              // 是否忽略左上角图标

此条是给选择英雄时 上方英雄浏览用的…… 准确的说是忽略选择英雄时显示图标?
如果一个人尽可能做好能做的事情,那这个世界就一定会因为这件事情而变得更美好一点。
回复 支持 反对

使用道具 举报

43

主题

430

帖子

2855

积分

大魔导师

UID
1731
金币
3664
精华
5
节操
-46

黑科技玩的6我是鸽手隐修议员扛把子教程大师创世者开拓者

QQ
 楼主| 发表于 2014-12-20 00:27:59 | 显示全部楼层
无双 发表于 2014-12-19 23:47
"IgnoreAddSummonedToSelection" "0"              // 是否忽略左上角图标

此条是给选择英雄时 上方 ...

测试一下不就知道了
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2023-11-29 13:12 , Processed in 0.184247 second(s), 29 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc. Theme.Yeei

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