DarkSheep个人小站 - 太阳编辑器
type: channel
link: https://darksheep.vip/tag/%E5%A4%AA%E9%98%B3%E7%BC%96%E8%BE%91%E5%99%A8/
items: DarkSheep的魔兽汉化工具_下载（20250524最近发布）
items: 2025年太阳编辑器_V6.35学思笔记6：太阳编辑器框架介绍
items: 2025年太阳编辑器_V6.35学思笔记3：TypeScript函数
items: 2025年太阳编辑器_V6.35学思笔记5：TypeScript模块
items: 2025年太阳编辑器_V6.35学思笔记4：TypeScript类、对象
items: 2025年太阳编辑器_V6.35学思笔记2：TypeScript运算符、条件语句、循环语句
items: 2025年太阳编辑器_V6.35学思笔记1：TypeScript变量声明
items: 2022年太阳编辑器_v4.81学思笔记6：太阳自定义值、太阳中心事件
items: 2022年太阳编辑器_v4.81学思笔记5：单位组、计时器
items: 2022年太阳编辑器_v4.81学思笔记4：条件、循环
items: 2022年太阳编辑器_v4.81学思笔记3：数组、触发

DarkSheep的魔兽汉化工具_下载（20250524最近发布）
type: item
date: 2025-05-24T00:31:00+08:00
description: 我用Lily快速启动器将我平时常用的一些魔兽工具做了整合。整个工具箱分为常用工具和非常用工具。常用工具常用工具是我平时汉化时，使用频率非常高的一类工具。下载解压，双击运行Lily.exe后就能看到这些工具。如下图：我从上到下从左到右一一做个简单的介绍Jass编辑4.2软件原名：EverEdit主要作用：汉化完war3map.j文件后，用这个软件菜单栏-Jass下的2个工具校验下，就知道哪里的jass语法有问题。很是方便。其他作用：使用Jass语法高亮修改war3map.j。火龙拆图2.05软件原名：HkeW3mModifier主要作用：能解压和替换90%的外国地图。但是有一些韩图加密就无能为力了。地图信息修改0.8软件原名：ShadowEditor主要作用：修改房间列表的地图名称，以及载入图时的信息模型查看1.05软件原名：War3ModelEditor（俗称绿苹果）主要作用：有时俄语有写生僻词，光看翻译完全不知道是个啥，那就用这个软件去查看单位模型或者物品图标，就能知道大概造个什么名字字符串转哈希值这个我用的多，新手可能用的不是太多。用途就是字面意思。SLK优化软件原名：w3x2lni主要作用：当你有源图时，或者有完整的文件列表时，你就可以用这个软件把地图优化为slk。这样地图的加载速度就会变快。MPQEditor主要作用：把地图丢进去，通过这个软件启动魔兽分析地图，有时可以获取到完整的文件列表。这样就可以执行slk优化了。魔兽分析2.5主要作用：一些头部信息加密的地图，如果用火龙解压或者修改，地图体积会从几兆变成几百兆。那么就可以用这个软件重建，再用火龙解压替换。下载地址回复可见：(抱歉，隐藏内容评论后可见)如果以上链接点击无效，可以访问下载页：(抱歉，隐藏内容评论后可见)下载注意事项：1、安装了杀毒软件的小伙伴，解压完后务必将解压后的文件件加入杀毒软件信任区。不加入的多半火龙会误报有毒。2、Lily快速启动器完全免费，无联网，无自动更新，纯绿色，设置开机自启动后不写注册表。一些你们使用频率低的软件也可以新建一个标签再拖进去。可以有效让桌面干净整洁。不常用工具<未完待续>

2025年太阳编辑器_V6.35学思笔记6：太阳编辑器框架介绍
type: item
date: 2024-12-31T19:04:00+08:00
description: 想要使用太阳编辑器制作魔兽地图，在粗略掌握TS语言基础语法之后，必须了解太阳编辑器的框架有哪些功能。太阳编辑器框架是一个专门为魔兽地图开发设计的完整解决方案，它通过提供各种标准化的模块和工具，大大简化了地图开发的复杂度，提高了开发效率，同时保证了代码质量和游戏性能。框架的主要优势降低开发难度提供高层封装简化复杂操作标准化的接口提高开发效率丰富的工具类现成的功能模块可复用的组件代码质量保证统一的编码规范类型安全(TypeScript)模块化设计游戏性能优化统一的资源管理优化的数据结构性能监控机制扩展性与维护性松耦合设计插件化架构易于扩展太阳编辑器框架(Solar Framework)结构介绍1. Actor(演员)系统这是框架的核心系统之一,位于 solar/solar-common/actor/ 目录下:- Actor.ts - 基础演员类,是所有演员类型的父类 - ActorAbility.ts - 技能演员 - ActorBuff.ts - Buff演员 - ActorItem.ts - 物品演员 - ActorUnit.ts - 单位演员演员系统提供了一个统一的数据结构来模拟游戏中的各种对象(单位、物品、技能、buff等)。主要优点是:统一的数据结构和接口方便对象之间的转换(如物品可以转化为buff)提供标准的事件系统2. 状态(State)系统位于 solar/solar-common/actor/state/ 目录:- SolarActorState.ts - 演员系统的状态管理 - SolarActorBuffState.ts - Buff状态管理 - SolarActorFrameState.ts - UI框架状态管理 - SolarActorItemState.ts - 物品状态管理 - SolarActorUnitState.ts - 单位状态管理状态系统负责管理各种游戏对象的状态变化,处理状态之间的转换和同步。3. 工具(Util)类位于 solar/solar-common/actor/util/ 目录:- ActorUtil.ts - 通用演员工具类 - ActorAbilityUtil.ts - 技能工具类 - ActorBuffUtil.ts - Buff工具类 - ActorItemUtil.ts - 物品工具类 - ActorUnitUtil.ts - 单位工具类 - ActorFrameUtil.ts - UI框架工具类提供了各种辅助方法来操作演员对象。4. 属性(Attribute)系统位于 solar/solar-common/attribute/ 目录:- BigAttributeCompatibleState.ts - 大数值属性兼容 - BigAttributeUICompatibleState.ts - 大数值UI显示兼容 - ItemAttributeState.ts - 物品属性系统属性系统负责:管理游戏对象的各种属性(攻击、防御、生命等)处理属性的叠加、消除支持大数值模式处理UI显示主要特点模块化设计各个系统之间相对独立便于维护和扩展统一的接口使用演员系统统一各种游戏对象提供标准的事件系统完善的工具类提供丰富的工具方法简化开发流程灵活的属性系统支持复杂的属性计算支持大数值模式这个框架的设计理念是提供一个统一的、易于使用的接口来处理游戏中的各种对象,同时保持足够的灵活性以适应不同的游戏需求。Actor(演员)系统详细介绍1. 基本概念Actor(演员)系统是一个统一的数据结构,用来模拟游戏中的各种对象:单位(ActorUnit)物品(ActorItem)技能(ActorAbility)Buff(ActorBuff)2. 主要类型// 基础演员类型 interface AppActorType { id: string; // 演员类型ID name?: string; // 名称 icon?: string; // 图标 describe?: string; // 描述 class?: string; // 分类 // ... 其他基础属性 } // 物品演员类型 interface AppActorItemType extends AppActorType { pawnable?: boolean; // 是否可抵押 droppable?: boolean; // 是否可丢弃 uses?: number; // 使用次数 stackMax?: number; // 最大堆叠数 } // 技能演员类型 interface AppActorAbilityType extends AppActorType { lumberCost?: number; // 魔法消耗 // ... …

2025年太阳编辑器_V6.35学思笔记3：TypeScript函数
type: item
date: 2024-12-30T19:53:00+08:00
description: TypeScript 的函数基本函数定义// 普通函数 function createHero(player: player, x: number, y: number): unit { return CreateUnit(player, HERO_ID, x, y, 0); } // 带有多个参数的函数 function dealDamage(source: unit, target: unit, amount: number): void { let finalDamage = amount; if (IsUnitType(target, UNIT_TYPE_HERO)) { finalDamage *= 0.8; // 英雄受到的伤害降低 } UnitDamageTarget(source, target, finalDamage, true); }构造函数class Hero { unit: unit; level: number; items: item[]; // 构造函数 constructor(player: player, heroId: number, x: number, y: number) { // 创建英雄单位 this.unit = CreateUnit(player, heroId, x, y, 0); this.level = 1; this.items = []; // 初始化英雄属性 this.initializeHero(); } private initializeHero(): void { // 设置初始属性 SetHeroLevel(this.unit, 1, false); SetUnitState(this.unit, UNIT_STATE_MANA, 100); } } // 使用构造函数创建英雄 let myHero = new Hero(Player(0), PALADIN_ID, 0, 0);箭头函数// 基础箭头函数 let calculateDamage = (base: number, multiplier: number): number => { return base * multiplier; }; // 简写形式（单行返回） let getUnitHealth = (unit: unit): number => GetUnitState(unit, UNIT_STATE_LIFE); // 在事件回调中使用箭头函数 let trigger = CreateTrigger(); TriggerAddAction(trigger, () => { let unit = GetTriggerUnit(); let damage = calculateDamage(100, 1.5); dealDamage(unit, GetTriggerUnit(), damage); });函数作为参数class BuffSystem { // 函数类型定义 type BuffEffect = (unit: unit) => void; // 使用函数作为参数 applyBuff(target: unit, duration: number, effect: BuffEffect): void { // 立即应用效果 effect(target); // 设置定时器移除效果 TimerStart(CreateTimer(), duration, false, () => { effect(target); DestroyTimer(GetExpiredTimer()); }); } } // 使用示例 let buffSystem = new BuffSystem(); buffSystem.applyBuff(hero, 10, (unit) => { // 增加移动速度 SetUnitMoveSpeed(unit, GetUnitMoveSpeed(unit) * 1.5); });方法函数（类中的函数）class ItemSystem { private items: Map<number, item>; constructor() { this.items = new Map(); } // 实例方法 addItem(itemId: number, x: number, y: number): item { let newItem = CreateItem(itemId, x, y); this.items.set(GetHandleId(newItem), newItem); return newItem; } // 静态方法 static isValidIte…

2025年太阳编辑器_V6.35学思笔记5：TypeScript模块
type: item
date: 2024-12-31T18:36:00+08:00
description: TypeScript 中的模块系统1. 模块基础概念模块是一种组织和复用代码的方式，可以把相关的代码组织在一起，并控制其访问范围。// 文件: src/systems/HeroSystem.ts export class HeroSystem { createHero() { /* ... */ } levelUp() { /* ... */ } } // 文件: src/App.ts import { HeroSystem } from "./systems/HeroSystem"; let heroSystem = new HeroSystem();2. 导出（Export）有几种不同的导出方式：// 1. 默认导出 (src/systems/ItemSystem.ts) export default class ItemSystem { createItem() { /* ... */ } removeItem() { /* ... */ } } // 2. 命名导出 (src/config/GameConfig.ts) export const HERO_STATS = { baseHealth: 500, baseMana: 300 }; export function calculateDamage() { // ... } // 3. 多个导出 (src/utils/GameUtils.ts) export class MathUtils { static random(min: number, max: number) { /* ... */ } } export class StringUtils { static format(text: string, ...args: any[]) { /* ... */ } }3. 导入（Import）对应的导入方式：// 1. 导入默认导出 import ItemSystem from "./systems/ItemSystem"; // 2. 导入命名导出 import { HERO_STATS, calculateDamage } from "./config/GameConfig"; // 3. 导入多个内容 import { MathUtils, StringUtils } from "./utils/GameUtils"; // 4. 重命名导入 import { HERO_STATS as HeroConfig } from "./config/GameConfig"; // 5. 导入所有内容 import * as Utils from "./utils/GameUtils";4. 实际项目示例让我们看看这个项目中的一些实际例子：// src/solar/common/GlobalVars.ts export default class GlobalVars { static isDebug: boolean; static init(debug: boolean) { this.isDebug = debug; } } // src/systems/AbilitySystem.ts import GlobalVars from "../solar/common/GlobalVars"; import { DamageUtils } from "../utils/CombatUtils"; export class AbilitySystem { castSpell(caster: unit, target: unit) { // 使用导入的工具 if (GlobalVars.isDebug) { console.log("施放技能"); } let damage = DamageUtils.calculateSpellDamage(caster, target); // ... } }5. 模块组织示例// src/config/index.ts // 集中导出配置 export * from "./HeroConfig"; export * from "./ItemConfig"; export * from "./SpellConfig"; // src/systems/index.ts // 集中导出系统 export * from "./HeroSystem"; export * from "./ItemSystem"; export * from "./CombatSystem"; // src/App.ts // 统一导入 import { HeroSystem, ItemSystem, CombatSystem } from "./s…

2025年太阳编辑器_V6.35学思笔记4：TypeScript类、对象
type: item
date: 2024-12-31T13:15:00+08:00
description: TypeScript 的类1. 基本类的定义和使用// 定义一个基础的英雄类 class Hero { // 属性定义 private unit: unit; // 英雄单位 private name: string; // 英雄名称 private level: number; // 英雄等级 private experience: number; // 经验值 // 构造函数 constructor(player: player, heroId: number, x: number, y: number) { // 创建英雄单位 this.unit = CreateUnit(player, heroId, x, y, 0); this.name = GetUnitName(this.unit); this.level = 1; this.experience = 0; // 初始化英雄 this.initialize(); } // 私有方法：初始化 private initialize(): void { // 设置初始属性 SetHeroLevel(this.unit, this.level, false); SetUnitState(this.unit, UNIT_STATE_MANA, 100); } // 公共方法：获取经验值 public gainExperience(amount: number): void { this.experience += amount; // 检查是否可以升级 this.checkLevelUp(); } // 私有方法：检查升级 private checkLevelUp(): void { let expNeeded = this.level * 100; // 简单的升级经验计算 if (this.experience >= expNeeded) { this.levelUp(); } } // 私有方法：升级 private levelUp(): void { this.level++; this.experience = 0; SetHeroLevel(this.unit, this.level, true); // 显示升级特效 let effect = AddSpecialEffect("Abilities\\Spells\\Other\\LevelUp\\LevelUpTarget.mdl", GetUnitX(this.unit), GetUnitY(this.unit)); DestroyEffect(effect); } }2. 继承和多态// 基础英雄类 abstract class BaseHero { protected unit: unit; protected mana: number = 100; // 抽象方法：每个英雄都必须实现的技能 abstract castSpell(target: unit): void; // 共享方法：所有英雄都可以使用的方法 protected consumeMana(cost: number): boolean { if (this.mana >= cost) { this.mana -= cost; return true; } return false; } } // 战士英雄类 class WarriorHero extends BaseHero { // 实现战士的技能 public castSpell(target: unit): void { if (this.consumeMana(50)) { // 战士的旋风斩 let damage = 150; let effect = AddSpecialEffect("Abilities\\Spells\\Human\\Whirlwind\\WhirlwindTarget.mdl", GetUnitX(target), GetUnitY(target)); UnitDamageTarget(this.unit, target, damage, true); DestroyEffect(effect); } } } // 法师英雄类 class MageHero extends BaseHero { // 实现法师的技能 public castSpell(target: unit): void { if (this.consumeMana(80)) { // 法师的火球术 let damage = 200; let effect = AddSpecialEffect("Abilities\\Spells\\Other\\Incinerate\\FireLor…

2025年太阳编辑器_V6.35学思笔记2：TypeScript运算符、条件语句、循环语句
type: item
date: 2024-12-30T19:47:00+08:00
description: TypeScript 的运算符算术运算符// 基础运算 let damage: number = 50 + 25; // 加法: 75 let totalGold: number = 1000 - 100; // 减法: 900 let critDamage: number = damage * 2; // 乘法: 100 let splitGold: number = 1000 / 4; // 除法: 250 let remainder: number = 100 % 30; // 取余: 10 // 在游戏中的实际应用 let heroHealth: number = 1000; heroHealth = heroHealth - damage; // 扣血 let expNeeded: number = level * 100; // 计算升级所需经验 let bonusDamage: number = baseDamage * 1.5; // 计算暴击伤害赋值运算符// 基础赋值 let gold: number = 100; // 基本赋值 gold += 50; // 等同于 gold = gold + 50 gold -= 30; // 等同于 gold = gold - 30 gold *= 2; // 等同于 gold = gold * 2 gold /= 4; // 等同于 gold = gold / 4 // 在游戏中的应用 let mana: number = 100; mana -= 40; // 使用技能消耗魔法值 exp += killExp; // 获得经验值 attackSpeed *= 1.3; // 提升攻击速度比较运算符// 基础比较 let isMaxLevel: boolean = (level >= 25); // 大于等于 let canBuyItem: boolean = (gold >= 500); // 大于等于 let isDead: boolean = (health <= 0); // 小于等于 let isHero: boolean = (unitType === 'hero'); // 严格相等 let isNotFull: boolean = (hp !== maxHp); // 不相等 // 在游戏中的应用 if (heroLevel >= 6) { // 英雄达到6级可以学习大招 EnableUltimateSkill(); } if (currentGold < itemCost) { // 金币不足无法购买物品 DisplayError("金币不足"); }逻辑运算符// 与运算 && let canCastUltimate: boolean = (mana >= 100 && skillCooldown <= 0); // 或运算 || let shouldRetreat: boolean = (health <= 100 || isStunned); // 非运算 ! let isNotStunned: boolean = !isStunned; // 在游戏中的实际应用 if (health > 0 && mana >= skillCost && !isStunned) { // 单位存活、有足够魔法值且未被眩晕时可以施放技能 CastSpell(); } if (health <= 0 || isRemoved) { // 单位死亡或被移除时执行 RemoveUnit(); }三元运算符// 基础用法 let message: string = (gold >= itemCost) ? "可以购买" : "金币不足"; // 在游戏中的应用 let damageText: string = isDead ? "致命一击" : damage.toString(); let healAmount: number = isHero ? 100 : 50; // 英雄回复更多生命值位运算符// 在游戏中通常用于标志位 const BUFF_STUN: number = 1 << 0; // 眩晕: 1 const BUFF_SILENCE: number = 1 << 1; // 沉默: 2 const BUFF_DISARM: number = 1 << 2; // 缴械: 4 // 检查状态 let unitState: number = GetUnitState(unit); let isStunned: boolean = (unitState & BUFF_STUN) !== 0;字符串运算符// 字符串连接 let playerName: s…

2025年太阳编辑器_V6.35学思笔记1：TypeScript变量声明
type: item
date: 2024-12-30T19:43:00+08:00
description: 使用 let 声明变量// 基础变量声明 let playerName: string = "玩家1"; // 声明字符串变量 let goldCount: number = 100; // 声明数字变量 let isHeroAlive: boolean = true; // 声明布尔变量 // 魔兽相关变量声明 let myHero: unit; // 声明单位变量 let currentPlayer: player; // 声明玩家变量 let weapon: item; // 声明物品变量 // 不指定初始值的变量声明 let damage: number; // 稍后会赋值的伤害值 let targetUnit: unit; // 稍后会赋值的目标单位使用 const 声明常量// 基础常量声明 const MAX_LEVEL: number = 25; // 最大等级 const GAME_VERSION: string = "1.0.0"; // 游戏版本号 // 魔兽相关常量声明 const HERO_INIT_X: number = 0; // 英雄初始X坐标 const HERO_INIT_Y: number = 0; // 英雄初始Y坐标 // 从项目中实际的例子: const ORIGIN_FRAME_GAME_UI: number; // 游戏UI框架常量 const FRAMEEVENT_CONTROL_CLICK: number; // 框架点击事件常量数组变量声明// 简单数组 let heroList: unit[] = []; // 英雄单位数组 let itemArray: item[] = []; // 物品数组 let damageValues: number[] = [100, 200, 300]; // 伤害值数组 // 从项目中的实际例子: let idAndNum: string[]; // 用于存储ID和数量的数组对象变量声明// 从项目中的对象类型声明 let unitConfig: uobj = { Art: "units/human/footman/footman.mdl", Name: "步兵", HP: "100", spd: "270", armor: "2" }; let itemConfig: iobj = { Art: "ReplaceableTextures/CommandButtons/BTNSteelMelee", Name: "铁剑", goldcost: "500", Description: "基础武器" };类型推断的变量声明// TypeScript 可以自动推断类型 let gold = 100; // 自动推断为 number let name = "圣骑士"; // 自动推断为 string let alive = true; // 自动推断为 boolean复杂类型的变量声明// 函数类型变量 let damageCallback: (source: unit, target: unit) => number; // 对象类型变量 let playerData: { name: string; hero: unit; level: number; items: item[]; }; // 从项目中的实际例子: let frameEventCallback: () => void; // UI框架事件回调特殊变量声明// 可选属性 let heroStats: { strength: number; agility: number; intelligence: number; armor?: number; // 可选的护甲属性 }; // 联合类型 let resourceType: "gold" | "lumber"; // 只能是这两个字符串之一 let value: number | string; // 可以是数字或字符串全局变量声明// 在类型定义文件中声明全局变量 declare let isDebug: boolean; // 全局调试标志 declare let tempGroup: group; // 全局临时单位组使用变量的一些最佳实践:选择合适的声明方式// 对于不会改变的值使用 const const MAX_PLAYERS: number = 12; // 对于会改变的值使用 let let currentGold: number = 0;明确的类型声明// 虽然可以类型推断，但在重要变量上最好明确声明类型 let mainHero: unit; let playerGold: number = 0;有意义的变…

2022年太阳编辑器_v4.81学思笔记6：太阳自定义值、太阳中心事件
type: item
date: 2022-10-14T12:45:00+08:00
description: 一、前言今天主要学习太阳编辑器TS框架架构。solar //太阳TS框架 都包括在此目录下atrribute //属性系统（阅读优先级5）common //游戏基础 ，如：全局变量、玩家基础属性、多面板、胜利失败等（阅读优先级2，重点DataBase.ts）constant //常量（阅读优先级1，重点）lib //第三方库tool //类对象型 工具（阅读优先级3，重点）types //类型声明util //类静态方法型 工具（阅读优先级4，重点）w3ts //基础框架 里面封装了各个handle类型的对象形式（阅读优先级6）二、太阳自定义值YDWE的逆天自定义值，让我们能以一种简单直观的方式给单位、物品等任何类型的物体数据设置自定义值，自定义值可以理解为给它贴上了某种类型的标签。 我们都知道逆天局部变量只在当前触发生效，且不用销毁，那么逆天自定义值就是方便我们在其他触发器中调用。 实例1：初始化时设置太阳自定义值，然后在其他触发里打印它。1、在太阳编辑器的入口文件App.ts的constructor里写上一段太阳自定义值DataBase.getUnitTypeSolarData('Hamg').名字 = '狗蛋'; db.getItemTypeSolarData('rat3 ').攻击力 = 10000;2、新建Zi_Dy.ts文件，写上： import DataBase from "solar/common/DataBase"; import PlayerUtil from "solar/util/game/PlayerUtil"; import { Trigger } from "solar/w3ts/handles/trigger"; export default class Zi_Dy { constructor() { let trigger = new Trigger() trigger.registerTimerEvent(1, false) trigger.addAction(this.action) } action(this: void) { PlayerUtil.text(Player(0), DataBase.getUnitTypeSolarData('Hamg').名字, 5, 0, 0) PlayerUtil.text(Player(0), db.getItemTypeSolarData('rat3 ').攻击力, 20, 0, 0) } }3、运行效果： **知识点： 1、getUnitTypeSolarData是设置单位类型的自定义值，getItemTypeSolarData是设置物品类型的自定义值，其他类型的可以访问太阳编辑器框架"solar/common/DataBase"查看。 2、db是DataBase的缩写。 3、PlayerUtil.text = DisplayTextToPlayer，它是来自太阳编辑器框架的玩家工具，路径："solar/util/game/PlayerUtil"。**三、太阳中心事件逆天触发器可以在同一个触发的触发动作中新建逆天触发器，逆天触发器可以设置参数，参数属于局部变量，可以避免变量冲突。有人形象的说：逆天触发器，其实就是让不会JASS的T使用者用T来写JASS。 实例：Zi_Dy.ts文件的触发动作里用太阳中心事件，实现单位死亡事件——山丘Kill大法师，提示死亡单位名字。SetHeroStr(gg\_unit\_Hmkg\_0000, 1000, true) se.unitDeath((du, ku) => { if (du == gg\_unit\_Hamg\_0004 && ku == gg\_unit\_Hmkg\_0000){ PlayerUtil.text(Player(0), '死亡单位:' + GetUnitName(du), 20, 0, 0) return true; } return false; })**知识点： 1、SetHeroStr是设置英雄的力量属性。了解更多可以访问太阳编辑器框架：“\solar\atrribute\BigAttributeCompatibleState.ts” 2、se是指太阳中心事件，了解更多可以访问太阳编辑器框架：“solar\common\SolarEvent.ts”** 太阳中心事件关键词玩家输入聊天信息playerChat任意单位伤害事件unitDamaged单位进入区域enterRect任意单位事件 - 获得物品unitPickupItem任意单位事件 - 获得物品onUnitPickupItem任意单位事件 - 丢弃物品unitDropItem任意单位事件 - 丢弃物品onUnitDro…

2022年太阳编辑器_v4.81学思笔记5：单位组、计时器
type: item
date: 2022-10-11T00:03:00+08:00
description: 一、单位组实例1：事件：玩家输入dwz 动作： 创建1个牧师添加进单位组danweizu 创建1个女巫添加进单位组danweizu 创建1个魔法破坏者添加进单位组danweizu 选取单位组的所有单位做动作：移动到地图区域的随机点（一）被弃用的ForGroup/ForGroupBJ老规矩，先上JASS转TS的写法：import BianLiang from 'BianLiang'; export default class Dan_Weizu { constructor() { let t = CreateTrigger(); TriggerRegisterPlayerChatEvent(t, Player(0), "dwz", true); TriggerAddAction(t, Dan_Weizu.action); } static action(this: void) { let g: group; let u: unit; GroupAddUnitSimple(CreateUnitAtLoc(Player(0), FourCC('hmpr'), GetRectCenter(GetPlayableMapRect()), 0), BianLiang.danweizu); GroupAddUnitSimple(CreateUnitAtLoc(Player(0), FourCC('hsor'), GetRectCenter(GetPlayableMapRect()), 0), BianLiang.danweizu); GroupAddUnitSimple(CreateUnitAtLoc(Player(0), FourCC('hspt'), GetRectCenter(GetPlayableMapRect()), 0), BianLiang.danweizu); ForGroupBJ(BianLiang.danweizu, Dan_Weizu.action1); GroupClear(BianLiang.danweizu); g = null; u = null; } static action1(this: void): void { IssuePointOrderLoc(GetEnumUnit(), "move", GetRandomLocInRect(GetPlayableMapRect())); } }[success]知识点：1、我们在BianLiang.ts里定义了danweizu，所以直接import BianLiang from 'BianLiang';后引用它。2、在太阳编辑器中ForGroup和ForGroupBJ已经被弃用了！作者推荐我们使用GroupUnit.for3、运行上面的代码并不会执行单位组内的单位移动到地图随机点的动作，原因：《太阳编辑器学思笔记2：全局变量》最后我们提到，单位组类型的变量声明后要初始化，即新建空的单位组。否则无法将单位添加进一个不存在的、具体的单位组中。[/success]（二）GroupUnit.for太阳编辑器目前推荐的单位组语法表达，实例如下：import GroupUtil from 'solar/util/unit/GroupUtil'; import { MapPlayer } from 'solar/w3ts/handles/player'; import { Trigger } from 'solar/w3ts/handles/trigger'; export default class Dan_Weizu { constructor() { let t = new Trigger(); t.registerPlayerChatEvent(MapPlayer.fromIndex(0), 'dwz', true) t.addAction(this.action); } action(this: void) { let g = CreateGroup(); GroupAddUnitSimple(CreateUnitAtLoc(Player(0), FourCC('hmpr'), GetRectCenter(GetPlayableMapRect()), 0), g); GroupAddUnitSimple(CreateUnitAtLoc(Player(0), FourCC('hsor'), GetRectCenter(GetPlayableMapRect()), 0), g); GroupAddUnitSimple(CreateUnitAtLoc(Player(0), FourCC('hspt'), GetRectCenter(GetPlayableMapRect()…

2022年太阳编辑器_v4.81学思笔记4：条件、循环
type: item
date: 2022-10-09T13:01:00+08:00
description: 一、条件实例：事件：玩家输入任意数字 动作：如果大于100，则显示“V我50！”，如果不足100，则显示“金钱不足！”。（一）if语句JASS转TS语法表达如下：export default class Gold { constructor() { let t = CreateTrigger(); TriggerRegisterPlayerChatEvent(t, Player(0), "", true); TriggerAddAction(t, Gold.action); } static action(this: void) { if ((S2I(GetEventPlayerChatString()) = 100)) DisplayTextToPlayer(Player(0), 0, 0, "V我50疯狂星期四！"); if ((S2I(GetEventPlayerChatString()) < 100)) DisplayTextToPlayer(Player(0), 0, 0, "金钱不足！"); } }太阳编辑器框架语法表达：import { MapPlayer } from "solar/w3ts/handles/player" import { Trigger } from "solar/w3ts/handles/trigger" export default class Gold { constructor() { let t = new Trigger() t.registerPlayerChatEvent(MapPlayer.fromIndex(0), '', false) t.addAction(this.action) } action(this: void) { if (S2I(GetEventPlayerChatString()) = 100) DisplayTextToPlayer(Player(0), 0, 0, 'V我50疯狂星期四！') if (S2I(GetEventPlayerChatString()) < 100) DisplayTextToPlayer(Player(0), 0, 0, '金钱不足！') } }[info]知识点：使用太阳编辑器的registerPlayerChatEvent的第一个参数是MapPlayer类型，而这个类型需要从"solar/w3ts/handles/player"中导入。我们Ctrl+鼠标左键这个相对地址，查看player.ts文件会发现MapPlayer是Handle<player的子类。进一步查找会发现类似JASS转TS的Player(0)对应的是fromIndex。由于我们刚开始用太阳编辑器，代码还不太熟悉，相信将来能熟能生巧！[/info]（二）if……else语句import { MapPlayer } from "solar/w3ts/handles/player" import { Trigger } from "solar/w3ts/handles/trigger" export default class Gold { constructor() { let t = new Trigger() t.registerPlayerChatEvent(MapPlayer.fromIndex(0), '', false) t.addAction(this.action) } action(this: void) { if (S2I(GetEventPlayerChatString()) = 100) DisplayTextToPlayer(Player(0), 0, 0, 'V我50疯狂星期四！') else DisplayTextToPlayer(Player(0), 0, 0, '金钱不足！') } }二、循环实例：事件：玩家输入数字xh 动作：循环12次创建1个步兵单位。（一）for循环老规矩，我们先来看看JASS转TS语法表达如下：export default class Gold { constructor() { let t = CreateTrigger(); TriggerRegisterPlayerChatEvent(t, Player(0), "xh", true); TriggerAddAction(t, Gold.action); } static action(this: void) { bj_forLoopAIndex = 1; bj_forLoopAIndexEnd = 12; while (true) { if (bj_forLoopAIndex bj_forLoopAIndexEnd) break; Crea…

2022年太阳编辑器_v4.81学思笔记3：数组、触发
type: item
date: 2022-10-06T23:42:00+08:00
description: 一、数组这玩意其实没什么讲的，因为在大部分编程语言里意义是一样的：使用单独的变量名来存储一系列的值。 1、我们接着之前的演示图，在BianLiang.ts里自定义一个字符串数组。保存BianLiang.ts。static mingzi:string[] = [];2、我们在Move.ts里添加一些触发动作。保存Move.ts。BianLiang.mingzi[0]='张三'; BianLiang.mingzi[1]='李四'; BianLiang.mingzi[2]='王麻子'; DisplayTextToPlayer(Player(0), 0, 0,BianLiang.mingzi[0]); DisplayTextToPlayer(Player(0), 0, 0,BianLiang.mingzi[1]); DisplayTextToPlayer(Player(0), 0, 0,BianLiang.mingzi[2]);3、运行查看效果。[danger]注意事项：数组变量在获取属性前要加上对空值判断！[/danger]二、触发（一）太阳编辑器的触发语法其实我们在《太阳编辑器学思笔记2：全局变量》三、太阳编辑器调用war3map.d.ts中的全局变量中已经学习过一次。我们再温习一次。export default class 类名 { constructor() { let trigger = new Trigger() trigger.registerTimerEvent(1, false) trigger.addAction(this.action) } action(this: void) { } }export default class 类名 //创建1个名为Move的类并导出constructor() { } //构造函数【为什么使用构造函数的扩展阅读可以访问《太阳编辑器学思笔记1：TypeScript编程语言》】let trigger = new Trigger()//新建触发trigger.registerTimerEvent(1, false) //触发事件.注册计时器事件(秒,是否循环)，registerTimerEvent是TS的表达方式，相当于JASS的TriggerRegisterTimerEvent。 //【扩展阅读可以访问左侧树形栏的solar/w3ts/handles/trigger】trigger.addAction(this.action) //添加触发器动作，addAction是TS的表达方式，相当于JASS的TriggerAddActionaction(this: void) { } //执行触发动作。所以触发动作是写这里面。（二）太阳编辑器的触发事件上面我们解释了trigger.registerTimerEvent是注册计时器事件，那么其他触发事件怎么写呢？ 答：查看太阳编辑器的触发框架：位于solar/w3ts/handles/trigger 如果你是用VScode打开的实例Move2.ts，那么右键点击文件内容上方的导入模块代码“import {Trigger} from "solar/w3ts/handles/trigger";”，选择“转到定义”，可以快速跳转到trigger.ts 下面我们来用个实例说明下： [info]实例目标：新建一个Move3.ts并改写其中的触发模块，触发事件：单位进入区域[R]，触发条件：判断触发单位是否为蒸汽车，触发动作：摧毁神秘宝藏室[/info] 有了前两章的学习，我们省略如何新建Move3.ts，如何在App.ts里调用Move3.ts，直接上触发代码：import { Trigger } from "solar/w3ts/handles/trigger"; export default class Move3 { constructor() { let t = new Trigger() t.registerEnterRect(gg_rct_jihe) t.addCondition(Condition(this.condition)) t.addAction(this.action) } condition(this: void) { return (IsUnit(GetTriggerUnit(), gg_unit_hmtt_0002) == true) } action(this: void) { KillUnit(gg_unit_hvlt_0001); DisplayTextToPlayer(Player(0), 0, 0, '神秘宝藏室被摧毁1') } }上面是太阳编辑器的写法，导入了一个trigger的框架，从而语法更加的简洁。下面是J…