- UID
- 137702
- 閱讀權限
- 20
- 主題
- 44
- 回帖
- 34
- 精華
- 1
- A幣
- 333
- 在線時間
- 125 小時
- 最後登錄
- 2026-8-1
初窺門道
- 主題
- 44
- 回帖
- 34
- 精華
- 1
- 綜合社群主題發文量
- 0
- 電玩社群主題發文量
- 0
- 娛樂社群主題發文量
- 0
- 技術社群主題發文量
- 44
- 閱讀權限
- 20
- 註冊時間
- 2021-11-15
TA的每日心情 | 奮鬥 2024-1-28 13:17 |
|---|
簽到天數: 1 天 連續簽到: 1 天 [LV.1]初來乍到
|
public class MapleMonster extends AbstractLoadedMapleLife {
private MapleMonsterStats stats;
private ChangeableStats ostats = null;
private long hp;
private long nextKill = 0;
private long lastDropTime = 0;
private int mp;
private byte carnivalTeam = -1;
private int owner = -1; //怪物专属权
############################################################
public int getOwner() {
return owner;
}
public void setOwner(int owner) {
this.owner = owner;
}
############################################################
/*
怪物控制权相关
*/
public void controlMonster(MapleMonster monster, boolean aggro) {
if (monster == null) {
return;
}
monster.setController(this);
controlledLock.writeLock().lock();
try {
controlled.add(monster);
} finally {
controlledLock.writeLock().unlock();
}
if (monster.getOwner() == -1 || monster.getOwner() == this.getId()) { //怪物专属权
client.getSession().write(MobPacket.controlMonster(monster, false, aggro));
}
monster.sendStatus(client);
}
############################################################
public void sendSpawnData(MapleClient client) {
if (!isAlive() || owner >= 0 && owner != client.getPlayer().getId()) { //怪物专属权
return;
}
client.getSession().write(MobPacket.spawnMonster(this, fake && linkCID <= 0 ? -4 : -1, 0));
sendStatus(client);
if (map != null && !stats.isEscort() && client.getPlayer() != null && client.getPlayer().getTruePosition().distanceSq(getTruePosition()) <= GameConstants.maxViewRangeSq_Half()) {
map.updateMonsterController(this);
}
}
############################################################
BOSS技能
case 200: //召唤怪物
if (monster == null) {
return;
}
for (Integer mobId : getSummons()) {
MapleMonster toSpawn = null;
try {
//toSpawn = MapleLifeFactory.getMonster(GameConstants.getCustomSpawnID(monster.getId(), mobId));
toSpawn = MapleLifeFactory.getMonster(mobId);
} catch (RuntimeException e) {
continue;
}
if (skillLevel == 221) {
toSpawn = MapleLifeFactory.getMonster(getSummons().get(Randomizer.rand(0, 4)));
}
if (toSpawn == null) {
continue;
}
if (monster.getOwner() != -1) { //衍生的怪物专属权
toSpawn.setOwner(monster.getOwner());
}
############################################################
/*
召唤怪物专属权
*/
public void spawnLinkMob(int id, int x, int y) {
MapleMonster m = MapleLifeFactory.getMonster(id);
m.setHp((long) (m.getStats().getHp()));
m.getStats().setHp((long) (m.getStats().getHp()));
m.setOwner(client.getPlayer().getId());
client.getPlayer().getMap().spawnMonsterOnGroundBelow(m, new Point(x, y));
}
############################################################
public class MapleNPC extends AbstractLoadedMapleLife {
private String name = "MISSINGNO";
private boolean custom = false;
private int owner = -1; //NPC专属权
############################################################
public int getOwner() { //NPC专属权
return owner;
}
public void setOwner(int owner) {
this.owner = owner;
}
############################################################
@Override
public void sendSpawnData(MapleClient client) {
if (getId() > 9901000 || owner >= 0 && owner != client.getPlayer().getId()) { //NPC专属权
return;
}
client.getSession().write(MaplePacketCreator.spawnNPC(this, true));
client.getSession().write(MaplePacketCreator.spawnNPCRequestController(this, true));
}
############################################################
/*
召唤NPC专属权
*/
public void spawnLinkNPC(int npcid, int x, int y, int f) {
MapleNPC npc;
npc = MapleLifeFactory.getNPC(npcid);
if (npc == null) {
return;
}
npc.setPosition(new Point(x, y));
npc.setCy(y);
npc.setRx0(x - 50);
npc.setRx1(x + 50);
npc.setF(f);
npc.setFh(getMap().getFootholds().findBelow(new Point(x, y)).getId());
npc.setCustom(true);
npc.setObjectId(npcid);
npc.setOwner(client.getPlayer().getId());
client.getPlayer().getMap().addMapObject(npc);
client.getSession().write(MaplePacketCreator.spawnNPC(npc, true));
client.getSession().write(MaplePacketCreator.spawnNPCRequestController(npc, true));
}
}
############################################################
private void spawnAndAddRangedMapObject(MapleMapObject mapobject, DelayedPacketCreation packetbakery) {
addMapObject(mapobject);
charactersLock.readLock().lock();
try {
final Iterator<MapleCharacter> itr = characters.iterator();
MapleCharacter chr;
while (itr.hasNext()) {
chr = itr.next();
if ((mapobject.getType() == MapleMapObjectType.MIST || chr.getTruePosition().distanceSq(mapobject.getTruePosition()) <= GameConstants.maxViewRangeSq())) {
if (mapobject.getType() == MapleMapObjectType.MONSTER) {
MapleMonster mob = (MapleMonster) mapobject;
if (mob.getOwner() != -1) {
if (mob.getOwner() == chr.getId()) { //怪物专属权
packetbakery.sendPackets(chr.getClient());
}
} else {
packetbakery.sendPackets(chr.getClient());
}
} else if (mapobject.getType() == MapleMapObjectType.NPC) {
MapleNPC npc = (MapleNPC) mapobject;
if (npc.getOwner() != -1) {
if (npc.getOwner() == chr.getId()) { //NPC专属权
packetbakery.sendPackets(chr.getClient());
}
} else {
packetbakery.sendPackets(chr.getClient());
}
} else {
packetbakery.sendPackets(chr.getClient());
}
chr.addVisibleMapObject(mapobject);
}
}
} finally {
charactersLock.readLock().unlock();
}
}
############################################################
/*
离开地图移除角色设置
*/
public void removePlayer(MapleCharacter chr) {
if (everlast) {
returnEverLastItem(chr);
}
charactersLock.writeLock().lock();
try {
characters.remove(chr);
} finally {
charactersLock.writeLock().unlock();
}
removeMapObject(chr);
chr.checkFollow();
chr.removeExtractor();
//chr.cancelEffectFromBuffStat(MapleBuffStat.SIDEKICK_PASSIVE);
for (Item item : chr.getInventory(MapleInventoryType.EQUIPPED).list()) {
if (GameConstants.isEffectRing(item.getItemId())) {
broadcastMessage(MaplePacketCreator.updateCharLook(chr)); //更新玩家外观,去除戒指特效遗留
}
}
broadcastMessage(MaplePacketCreator.removePlayerFromMap(chr.getId()));
List<MapleSummon> toCancel = new ArrayList();
List<MapleSummon> ss = chr.getSummonsReadLock();
try {
for (MapleSummon summon : ss) {
broadcastMessage(MaplePacketCreator.removeSummon(summon, true));
removeMapObject(summon);
if (summon.getMovementType() == SummonMovementType.STATIONARY || summon.getMovementType() == SummonMovementType.CIRCLE_STATIONARY || summon.getMovementType() == SummonMovementType.WALK_STATIONARY) {
toCancel.add(summon);
} else {
summon.setChangedMap(true);
}
}
} finally {
chr.unlockSummonsReadLock();
}
for (MapleSummon summon : toCancel) {
chr.removeSummon(summon);
chr.dispelSkill(summon.getSkill());
}
checkStates(chr.getName());
if (mapid == 109020001) {
chr.canTalk(true);
}
for (MapleMonster m : chr.getMap().getAllMonster()) { //角色离开地图时,清除专属权怪物
if (m.getOwner() == chr.getId()) {
m.setHp(0);
broadcastMessage(MobPacket.killMonster(m.getObjectId(), 0));
removeMapObject(m);
m.killed();
spawnedMonstersOnMap.decrementAndGet();
}
}
for (MapleNPC n : chr.getMap().getAllNPCs()) { //角色离开地图时,清除专属权NPC
if (n.getOwner() == chr.getId()) {
chr.getClient().getSession().write(MaplePacketCreator.removeNPCController(n.getObjectId()));
chr.getClient().getSession().write(MaplePacketCreator.removeNPC(n.getObjectId()));
removeMapObject(n);
}
}
if (this.getFly() && chr.getStatForBuff(MapleBuffStat.骑兽技能) != null) { //离开飞行地图
chr.cancelEffectFromBuffStat(MapleBuffStat.骑兽技能);
}
chr.leaveMap(this);
}
|
|