tz1717025

Lv.1 初心者
專屬會員
註冊
2023-03-16
文章
13
評分
0
聲望
0

  1. 193741w0pp9jp1e30xxbel.jpg.thumb.jpg

    hqdefault.jpg (34.84 KB, 下載次數: 1)
    下載附件 保存到相冊
    2021-8-11 19:37 上傳


    輪迴 各自寫法不同 有興趣可以研究看看 自行調用 僅供參考!
    新增MobConstants.java
    1. /**
    2. * 怪物輪迴
    3. */
    4. public class MobConstants {

    5. // 輪迴怪物 代碼
    6. public static int[] REINCARNATION_MOB = new int[]{8641020, 2}; // 怪物代碼, 倍率
    7. public static int isMonsterSpawn(MapleMap map) { // 回傳生怪數量倍率
    8. int addition = 1;
    9. if (MapConstants.isBossMap(map.getId()) || MapConstants.isEventMap(map.getId())) { // 判斷是否為特殊地圖
    10. return 1;
    11. }
    12. for (MapleMapObject obj : map.getAllMonstersThreadsafe()) { // 判斷地圖有boss 回傳倍率1
    13. final MapleMonster mob = (MapleMonster) obj;
    14. if (mob.getStats().isBoss() && !isReincarnationMob(mob.getId())) {
    15. return 1;
    16. }
    17. }
    18. if (map.getMonsterById(REINCARNATION_MOB[0]) != null) { // 判斷是否有輪迴
    19. addition *= REINCARNATION_MOB[1];
    20. }
    21. return addition;
    22. }

    23. public static boolean isReincarnationMob(int mobid) {
    24. if (REINCARNATION_MOB[0] == mobid) {
    25. return true;
    26. }
    27. return false;
    28. }

    29. public static boolean isSpawnSpeed(MapleMap map) {
    30. if (WorldConstants.輪迴開關 && map.getMonsterById(REINCARNATION_MOB[0]) != null) {
    31. return true;
    32. }
    33. return false;
    34. }

    35. }

    每個端不同 自己研究一下~
    1. public final static boolean is宇宙船(int skillid) { // 當作輪迴技能
    2. switch (skillid) {
    3. case 1013:
    4. case 10001014:
    5. case 20011046:
    6. case 20021013:
    7. case 30011013:
    8. case 30001013:
    9. return true;
    10. }
    11. return false;
    12. }
    13. public final static boolean is雪吉拉騎士(int skillid) { // 當作輪迴技能
    14. switch (skillid){
    15. case 1017:
    16. case 10001019:
    17. case 20001019:
    18. return true;
    19. }
    20. return false;
    21. }



    每個端不同 自己研究一下~
    1. public static boolean 輪迴開關 = false;
    2. public static int 輪迴代碼 = 0;


    3. --------------------分隔線--------------------

    4. 輪迴開關 = ServerProperties.getProperty("server.settings.Reincarnation.Enable", 輪迴開關);
    5. 輪迴代碼 = ServerProperties.getProperty("server.settings.Reincarnation.ItemID", 輪迴代碼);


    找到 if (skillid != 5221006) {
    c.sendPacket(MaplePacketCreator.skillCooldown(skillid, effect.getCooldown()));
    chr.addCooldown(skillid, System.currentTimeMillis(), effect.getCooldown() * 1000);
    }
    }
    在以下新增:
    1. // 怪物輪迴 施放技能
    2. if (SkillConstants.is宇宙船(skillid) || SkillConstants.is雪吉拉騎士(skillid)) {
    3. if (WorldConstants.輪迴開關) {
    4. if (chr.getItemQuantity(WorldConstants.輪迴代碼, false) > 0) {
    5. if (chr.getMap().countMonsterById(MobConstants.REINCARNATION_MOB[0]) == 0) {
    6. MapleMonster onemob = MapleLifeFactory.getMonster(MobConstants.REINCARNATION_MOB[0]);
    7. chr.getMap().spawnMonsterOnGroundBelow(onemob, chr.getPosition());
    8. } else {
    9. chr.dropMessage("地圖上已有輪迴碑石!");
    10. }
    11. } else {
    12. chr.dropMessage(1, "你沒有輪迴碑石!");
    13. }
    14. }
    15. c.sendPacket(MaplePacketCreator.enableActions());
    16. return;
    17. }

    MapleMap.java
    1. public void respawn(final boolean force) {
    2. lastSpawnTime = System.currentTimeMillis();
    3. if (force) {
    4. final int numShouldSpawn = monsterSpawn.size() * MobConstants.isMonsterSpawn(this) - spawnedMonstersOnMap.get(); // 輪迴倍率
    5. // final int numShouldSpawn = monsterSpawn.size() - spawnedMonstersOnMap.get();
    6. if (numShouldSpawn > 0) {
    7. int spawned = 0;
    8. for (Spawns spawnPoint : monsterSpawn) {
    9. spawnPoint.spawnMonster(this);
    10. spawned++;
    11. if (spawned >= numShouldSpawn) {
    12. break;
    13. }
    14. }
    15. }
    16. } else if (GameConstants.isCarnivalMaps(mapid)) {
    17. final List<Spawns> randomSpawn = new ArrayList(monsterSpawn);
    18. int team0NumShouldSpawn = 0;
    19. int team1NumShouldSpawn = 0;
    20. int numShouldSpawn = 0;
    21. for (Spawns spawnPoint : randomSpawn) {
    22. switch (spawnPoint.getCarnivalTeam()) {
    23. case 0:
    24. team0NumShouldSpawn++;
    25. break;
    26. case 1:
    27. team1NumShouldSpawn++;
    28. break;
    29. case -1:
    30. numShouldSpawn++;
    31. break;
    32. default:
    33. break;
    34. }
    35. }
    36. List<MapleMapObject> monsters = getMapObjects(Arrays.asList(MapleMapObjectType.MONSTER));
    37. for (MapleMapObject mmo : monsters) {
    38. if (!(mmo instanceof MapleMonster)) {
    39. continue;
    40. }
    41. MapleMonster monster = (MapleMonster) mmo;
    42. switch (monster.getCarnivalTeam()) {
    43. case 0:
    44. team0NumShouldSpawn--;
    45. break;
    46. case 1:
    47. team1NumShouldSpawn--;
    48. break;
    49. default:
    50. numShouldSpawn--;
    51. break;
    52. }
    53. }
    54. if (numShouldSpawn > 0 || team0NumShouldSpawn > 0 || team1NumShouldSpawn > 0 || GameConstants.isForceRespawn(mapid)) {
    55. int team0Spawned = 0;
    56. int team1Spawned = 0;
    57. int spawned = 0;
    58. Collections.shuffle(randomSpawn);
    59. for (Spawns spawnPoint : randomSpawn) {
    60. if (spawnPoint.shouldSpawn() || GameConstants.isForceRespawn(mapid)) {
    61. if (spawnPoint.getCarnivalTeam() == 0 && team0NumShouldSpawn > 0) {
    62. spawnPoint.spawnMonster(this);
    63. team0Spawned++;
    64. } else if (spawnPoint.getCarnivalTeam() == 1 && team1NumShouldSpawn > 0) {
    65. spawnPoint.spawnMonster(this);
    66. team1Spawned++;
    67. } else if (spawnPoint.getCarnivalTeam() == -1 && numShouldSpawn > 0) {
    68. spawnPoint.spawnMonster(this);
    69. spawned++;
    70. }
    71. }
    72. if (team0Spawned >= team0NumShouldSpawn && team1Spawned >= team1NumShouldSpawn && spawned >= numShouldSpawn) {
    73. break;
    74. }
    75. }
    76. }
    77. } else {
    78. final int numShouldSpawn = maxRegularSpawn * MobConstants.isMonsterSpawn(this) - spawnedMonstersOnMap.get(); // 乘輪迴倍率
    79. // final int numShouldSpawn = maxRegularSpawn - spawnedMonstersOnMap.get();
    80. if (numShouldSpawn > 0 || GameConstants.isForceRespawn(mapid)) {
    81. int spawned = 0;
    82. final List<Spawns> randomSpawn = new ArrayList<>(monsterSpawn);
    83. Collections.shuffle(randomSpawn);
    84. for (Spawns spawnPoint : randomSpawn) {
    85. if (spawnPoint.shouldSpawn() || GameConstants.isForceRespawn(mapid)) {
    86. spawnPoint.spawnMonster(this);
    87. spawned++;
    88. }
    89. if (spawned >= numShouldSpawn) {
    90. break;
    91. }
    92. }
    93. }
    94. }
    95. }


    MapleMap.java
    1. public final boolean canSpawn() {
    2. createMobInterval = (short) (MobConstants.isSpawnSpeed(this) ? 0 : 9000); // 怪物輪迴 生怪速度
    3. return lastSpawnTime > 0 && isSpawns && lastSpawnTime + createMobInterval < System.currentTimeMillis();
    4. }

    #文章轉自AICL