테스트

aion-server 4.8

Gitteol
최고관리자 · 1 · 💬 0 클론/새로받기
 4.8 61f661d · 1 commits 새로받기(Pull)
game-server/src/com/aionemu/gameserver/spawnengine/TemporarySpawnEngine.java
package com.aionemu.gameserver.spawnengine;

import java.util.*;
import java.util.stream.Collectors;

import com.aionemu.gameserver.model.gameobjects.Npc;
import com.aionemu.gameserver.model.gameobjects.VisibleObject;
import com.aionemu.gameserver.model.templates.event.EventTemplate;
import com.aionemu.gameserver.model.templates.spawns.SpawnGroup;
import com.aionemu.gameserver.model.templates.spawns.SpawnTemplate;
import com.aionemu.gameserver.world.WorldMapInstance;

/**
 * @author xTz, Neon
 */
public class TemporarySpawnEngine {

	private static final Map<SpawnGroup, Set<Integer>> spawnGroups = new HashMap<>();
	private static final Set<VisibleObject> spawnedObjects = new HashSet<>();

	public static synchronized void onHourChange() {
		despawn();
		spawn();
	}

	private static void despawn() {
		List<VisibleObject> remainingObjects = new ArrayList<>(spawnedObjects.size());
		spawnedObjects.forEach(object -> {
			if (object.getSpawn().getTemporarySpawn().canDespawn()) {
				if (object instanceof Npc npc && !npc.isDead() && object.getSpawn().hasPool())
					object.getSpawn().setUse(npc.getInstanceId(), false);
				object.getController().deleteIfAliveOrCancelRespawn();
			} else {
				remainingObjects.add(object);
			}
		});
		spawnedObjects.retainAll(remainingObjects);
	}

	private static void spawn() {
		Map<SpawnGroup, List<VisibleObject>> spawnedBySpawnGroup = spawnedObjects.stream().collect(Collectors.groupingBy(o -> o.getSpawn().getGroup()));
		spawnGroups.forEach((spawn, instanceIds) -> {
			if (instanceIds.isEmpty())
				return;
			List<VisibleObject> spawned = spawnedBySpawnGroup.getOrDefault(spawn, Collections.emptyList());
			if (spawn.hasPool()) {
				if (!spawn.getTemporarySpawn().canSpawn())
					return;
				Set<Integer> spawnableInstanceIds = new HashSet<>(instanceIds);
				spawned.forEach(o -> spawnableInstanceIds.remove(o.getInstanceId()));
				for (Integer instanceId : spawnableInstanceIds) {
					spawn.resetTemplates(instanceId);
					for (int pool = 0; pool < spawn.getPool(); pool++) {
						SpawnTemplate template = spawn.getRndTemplate(instanceId);
						SpawnEngine.spawnObject(template, instanceId);
					}
				}
			} else {
				for (SpawnTemplate template : spawn.getSpawnTemplates()) {
					if (!template.getTemporarySpawn().canSpawn())
						continue;
					Set<Integer> spawnableInstanceIds = new HashSet<>(instanceIds);
					spawned.stream().filter(o -> o.getSpawn().equals(template)).forEach(o -> spawnableInstanceIds.remove(o.getInstanceId()));
					spawnableInstanceIds.forEach(instanceId -> SpawnEngine.spawnObject(template, instanceId));
				}
			}
		});
	}

	public static synchronized void registerSpawned(VisibleObject object) {
		spawnedObjects.add(object);
	}

	public static synchronized void unregisterSpawned(int objectId) {
		spawnedObjects.removeIf(o -> o.getObjectId() == objectId);
	}

	public static synchronized void addSpawnGroup(SpawnGroup spawnGroup, int instanceId) {
		spawnGroups.computeIfAbsent(spawnGroup, k -> new HashSet<>()).add(instanceId);
	}

	public static synchronized void unregister(EventTemplate eventTemplate) {
		spawnedObjects.removeIf(o -> o.getSpawn().getEventTemplate() == eventTemplate);
		spawnGroups.keySet().removeIf(s -> s.getEventTemplate() == eventTemplate);
	}

	public static synchronized void onInstanceDestroy(WorldMapInstance instance) {
		spawnedObjects.removeIf(o -> instance.equals(o.getWorldMapInstance()));
		spawnGroups.forEach((spawnGroup, instanceIds) -> {
			if (spawnGroup.getWorldId() == instance.getMapId())
				instanceIds.remove(instance.getInstanceId());
		});
	}
}

📎 첨부파일

댓글 작성 권한이 없습니다.
🏆 포인트 랭킹 TOP 10
순위 닉네임 포인트
1 no_profile 타키야겐지쪽지보내기 자기소개 아이디로 검색 전체게시물 102,949
2 no_profile 동가리쪽지보내기 자기소개 아이디로 검색 전체게시물 63,733
3 no_profile 라프텔쪽지보내기 자기소개 아이디로 검색 전체게시물 51,771
4 no_profile 불멸의행복쪽지보내기 자기소개 아이디로 검색 전체게시물 36,923
5 서번트쪽지보내기 자기소개 아이디로 검색 전체게시물 35,011
6 no_profile 닥터스쪽지보내기 자기소개 아이디로 검색 전체게시물 29,470
7 no_profile 검은고양이쪽지보내기 자기소개 아이디로 검색 전체게시물 29,077
8 no_profile Revolution쪽지보내기 자기소개 아이디로 검색 전체게시물 28,199
9 no_profile 보거스쪽지보내기 자기소개 아이디로 검색 전체게시물 26,731
10 no_profile 호롤롤로쪽지보내기 자기소개 아이디로 검색 전체게시물 17,020
알림 0