import { Collider2D, Vec3 } from 'cc'; import { _decorator, Component, Node } from 'cc'; import { UmUtil } from '../../../../cc-common/cc-util/UmUtil'; import { ColliderObject } from '../../base/ColliderObject'; import { UmLog } from '../../../../cc-common/cc-util/UmLog'; import { GameDefine, EPHYSIC_GROUP, EACTIVE_SKILL_TYPE, ENEMY_TYPE, EMOVE_MODE, EATTACK_TYPE } from '../../config/GameDefine'; import { BulletBase } from '../bullet/BulletBase'; import { LayoutManager } from '../LayoutManager'; import { Sprite } from 'cc'; import { Color } from 'cc'; import { ShootingBase } from '../bullet/ShootingBase'; import { GameGlobalData } from '../../global/GameGlobalData'; import { EnemyDataInfo } from '../../global/GameInterface'; import { ActiveSkillBase } from '../hero/ActiveSkillBase'; import { HPBar } from '../../game_ui/HPBar'; import { CreepMove } from './CreepMove'; import { UmClientEvent } from '../../../../cc-common/cc-util/UmOneToMultiListener'; import { EnemyBase } from '../enemy/EnemyBase'; const { ccclass, property } = _decorator; @ccclass('CreepBase') export class CreepBase extends EnemyBase { @property(HPBar) hpBar: HPBar = null!; @property(CreepMove) creepMove: CreepMove = null!; start(): void { super.start(); this.isShootEnable = false; } setEnemyData(data) { super.setEnemyData(data); this.hpBar.setMaxHPBar(this.hp); this.creepMove.setMoveData(data, this.enemyType, this.attackType); } protected registerColliderContact() { this.colliderObject.registerBeginContact(this.onBeginContact.bind(this), true); this.colliderObject.registerEndContact(this.onEndContact.bind(this), true); } onBeginContact(a: Collider2D, b: Collider2D) { //override var bGroup = b.group; UmLog.log("CREEP | Contact Begin = " + GameDefine.getPhysicGroupName(a.group), " vs ", GameDefine.getPhysicGroupName(bGroup)); if (bGroup == Number(EPHYSIC_GROUP.ENEMY) || bGroup == Number(EPHYSIC_GROUP.OBSTACLE) || bGroup == Number(EPHYSIC_GROUP.DEFAULT)) { this.creepMove?.setIsContactObstacle(true); return; } if (bGroup == Number(EPHYSIC_GROUP.BULLET_HERO)) { this.onBulletContact(b.node); return; } if (bGroup == Number(EPHYSIC_GROUP.ACTIVE_SKILL)) { this.onHeroActiveSkillContact(b.node); return; } if (bGroup == Number(EPHYSIC_GROUP.HERO)) { this.creepMove.setIsContactHero(true); return; } } onEndContact(a: Collider2D, b: Collider2D) { //override var bGroup = b.group; if (bGroup == Number(EPHYSIC_GROUP.ENEMY) || bGroup == Number(EPHYSIC_GROUP.OBSTACLE) || bGroup == Number(EPHYSIC_GROUP.DEFAULT)) { this.creepMove?.setIsContactObstacle(false); return; } if (bGroup == Number(EPHYSIC_GROUP.HERO)) { this.creepMove.setIsContactHero(false); return; } } onSensorBegin(a: Collider2D, b: Collider2D) { //override var bGroup = b.group; // UmLog.log("BOSS |onSensor Begin = " + GameDefine.getPhysicGroupName(a.group), " vs ", GameDefine.getPhysicGroupName(b.group)); if (bGroup != EPHYSIC_GROUP.HERO) return; this.heroTarget = b.node; this.creepMove.setIsSensorHero(true, this.heroTarget); this.checkEnableShoot(true); // this.creepMove.changeMode(EMOVE_MODE.TARGET); } onSensorEnd(a: Collider2D, b: Collider2D) { //override var bGroup = b.group; // UmLog.log("BOSS | onSensor End = " + GameDefine.getPhysicGroupName(a.group), " vs ", GameDefine.getPhysicGroupName(b.group)); GameDefine.getPhysicGroupName(bGroup); if (bGroup != EPHYSIC_GROUP.HERO) return; this.heroTarget = null; this.creepMove.setIsSensorHero(false, this.heroTarget); this.checkEnableShoot(false); } checkEnableShoot(isSensorHero) { this.isShootEnable = isSensorHero && this.attackType == EATTACK_TYPE.RANGE; } hitDamage(damage: number) { this.hpBar?.decreaseHP(damage); this.runHitEffect(); if (this.hpBar && this.hpBar.currentHP <= 0) { this.checkWin(); this?.destroyNode(); } } checkWin() { if (this.isCheckedWin) return; this.isCheckedWin = true; UmClientEvent.dispatchEvent(GameDefine.EVENT_CHECK_WIN, GameDefine.ENEMY_CREEP, this.dataConfig?.Exp); } protected update(dt: number): void { if (!GameGlobalData.Instance.isStatePlay()) return; if (!this.isShootEnable) return; var targetShoot = this.findShootTargetNode(); if (!targetShoot) return; this.shooting.shooting(this.node, targetShoot, this.ShootingDataConfig); } }