2021/08 21

마크 플러그인 만들기 (#2)

RPG 직업들은 현재 기획한 것으로는 파이터, 머스킷티어, 버서커, 마법사, 암살자로 직업들은 각각 액티브형 능력 하나와 패시브형 능력 하나를 구현할 것입니다. 현재 버서커의 광전사 능력(패시브)과 암살자의 도주 능력(패시브)는 krapoi의 티스토리를 확인하여 코드와 더불어 어떤 형식으로 작동하는 지를 확인할 수 있습니다. 제가 구현한 기능들은 마법사의 라이트닝(액티브)능력과 머스킷티어의 헤드샷(패시브)를 구현하였습니다. 먼저 마법사의 라이트닝입니다. Wizard라는 클래스를 만들고 플러그인에 사용될 클래스들은 대부분은 Listener를 사용하여 이벤트를 받습니다. implements Listener를 하고, 받을 이벤트를 @EventHandler를 합니다. 마법사는 현재 개발해나가는 과정이기에 막대기..

마크 플러그인 만들기 (#1)

마크 버전은 작성일 기준 최신 버전은 1.17.1를 사용할 것이고, spigot 1.17.1를 사용할 것입니다. 외부라이브러리로 spigot 1.17.1 .jar를 설정합니다. 자바 버전은 16 버전의 자바로 하였습니다. (16.0.2) ※자바 버전을 16버전의 JDK를 설치하여야 서버가 열릴 겁니다. 먼저 src에 Main.java 를 추가하여 메인 클래스를 만듭니다. Main에 extends JavaPlugin과 implements Listener를 추가합니다. public class Main extends JavaPlugin implements Listener { } 플러그인을 실행하였을 때에 콘솔창에서 나올 텍스트를 추가하기위해 ConsoleCommandSender consol = Bukkit.g..

마크 플러그인 만들기 (#0)

※본 글은 마인크래프트 플러그인을 개발하고자 작성하는 글이다. 학교 친구인 krapoi와 함께 마인크래프트 플러그인을 함께 개발하고자합니다. 이전에 같이 만들어본 경험이 있긴하나, 완성을 다 못했을 뿐만 아니라 완성도가 많이 떨어저 다시 한 번 더 만들어보고자 합니다. krapoi의 깃허브, krapoi의 티스토리 마인크래프트 최신 버전인 1.17.1을 기준으로 개발할 예정이며, 에디터는 Intellij를 사용할 예정입니다. 만들고자하는 플러그인은 넣고싶은 기능들을 다 때려 박아 넣을 수 있는 RPG플러그인을 개발하고자 합니다. 안타깝지만 개발을 하며 commit하는 깃허브는 private으로 할 것이지만, 필자의 티스토리와 krapoi의 티스토리를 확인해주길 바랍니다. 티스토리에는 진행 상황 및 저희가..

압생트(Absinthe)봇 만들기 (#11)

방학이 끝나버려 더 이상 압생트 봇을 만들지 못하게 되었습니다. 그래도 나름대로 열심히 개발하고자 하였고, 지금 당장은 이번 글이 마지막이겠으나, 다음 방학인 겨울방학에 다시 개발을 하도록 하겠습니다. 이번이 마지막인 만큼 최대한 많은 것을 추가 및 구현하고자 하였습니다.먼저 시간 증폭입니다.현재 인공 제어소에서 차원관문을 업그레이드를 진행하고 있는 중이라면 시간 증폭을 인공 제어소에 사용하고그렇지 않지만, 수정탑이 건설 진행이거나 이미 완료된 적이 1번이라도 있다면 시간 증폭을 연결체에 사용하도록 하였습니다. async def chrono(self): if self.structures(UnitTypeId.PYLON): nexus = self.townhalls.ready.random if nexus.en..

압생트(Absinthe)봇 만들기 (#10)

이번에 구현하고자 하는 것은 영역 확장입니다. python_sc2에 이미 영역 확장하는 코드가 존재하기에 빠르게 마무리하고 이어서 공격에 관련하여 코드를 추가하도록 하겠습니다. python_sc2에 존재하는 파이썬 파일들 중 "bot_ai"라는 파일에서 expand_now라는 메소드에 이미 작성해야할 코드가 존재하기에 이를 메소드를 사용할 것입니다. 영역을 확장하는 데에 자원이 굉장히 많이 투자되고 그비용만큼 유닛을 생산하지 못하여 패배하는 경우가 있기에 적절한 영역확장이 필요합니다. 개인적으로 연결체는 3개 미만이고 자원이 충분할때에만 영역을 확장하도록 하였습니다. async def expand(self): if self.units(UnitTypeId.NEXUS).amount < 3 and self.c..

압생트(Absinthe)봇 만들기 (#9)

이번 글이 아마 스타크래프트 2 프로토스의 가장 기초적인 기능을 수행하도록 하는 데 있어 도움을 주는 글 중 마지막일 듯합니다. 여태까지 한 것을 요약하자면 1) 세팅 및 일꾼 생산 2) 수정탑 건설 3) 관문 건설 4) 융화소 건설 및 가스 채취 5) 인공 제어소 건설 6) 추적자 생산 7) 시간 증폭 사용 8) 차원관문 업그레이드 9) 공격 10) 차원관문 사용 11) 유닛 컨트롤 이번에 구현하고자 하는 기능은 10번과 11번입니다. 물론 아직도 남은 기능들은 굉장히 많으니 그건 나중에 진행하면서 천천히 설명드리겠습니다. 먼저 차원관문 사용입니다. 준비된 모든 차원관문들을 for-each를 하여, 해당 차원관문이 현재 당장 사용할 수 있는 능력을 확인합니다. (차원관문은 능력을 사용하여 유닛을 생산하..

압생트(Absinthe)봇 만들기 (#8)

드디어 공격을 구현하고자합니다. 공격은 단순하게 상대 진영을 공격하게 만드는 것으로 마무리할 것입니다. 먼저 저 같은 경우에는 추적자만을 사용하였기때문에 추적자만 관리하여 공격을 하면 됩니다. 추적자가 최소 4마리이상은 되야 공격을 가도록 하였습니다. async def attack(self): stalker_count = self.units(UnitTypeId.STALKER).amount stalkers = self.units(UnitTypeId.STALKER).ready.idle if stalker_count < 4: return for stalker in stalkers: stalker.attack(self.enemy_start_locations[0]) 이렇게만 구현 및 추가하더라도 정예까지는 매우 ..

압생트(Absinthe)봇 만들기 (#7)

이번에 구현하고자 하는 것은 차원관문 업그레이드입니다. 차원관문은 스2에서만 존재하는 특별한 기능 중 하나입니다.관문을 통하여 생산하는 유닛이고, 동력이 통하는 곳이라면 어디서든지 생산이 가능하게 만드는 기능입니다.또, 생산속도 역시 빨라집니다. 차원관문을 업그레이드 중이 아니고 인공제어소가 있다면 업그레이드하도록 하는 것이 로직입니다. async def warpgate_research(self): if ( self.structures(UnitTypeId.CYBERNETICSCORE).ready and self.can_afford(AbilityId.RESEARCH_WARPGATE) and self.already_pending_upgrade(UpgradeId.WARPGATERESEARCH) == 0 ): ..

압생트(Absinthe)봇 만들기 (#6)

이번에 구현하고자 하는 것은 시간 증폭입니다. 시간증폭은 건물에 적용하여 일정시간동안 빠르게 가동시키는 능력으로연결체에서 사용가능합니다.에너지는 50이 사용되지만 약 20초(보통 시간 기준으로는 28초입니다)정도 시간을 빠르게 흐르게 하는 능력입니다.초반에는 탐사정을 더욱 빠르게 생산가능하므로 연결체에게 사용하도록 하였습니다.추후 코드는 충분히 변경될 수 있습니다.(업그레이드등을 하여야할 때에는 빠르게 진행하는 것이 중요하기 때문입니다.) async def chrono(self): if self.structures(UnitTypeId.PYLON): nexus = self.townhalls.ready.random if ( self.structures(UnitTypeId.PYLON).amount > 0 ):..

압생트(Absinthe)봇 만들기 (#5)

이번에 구현하고자 하는 것은 유닛 생산입니다. 사실 유닛 생산하는 것과 공격하는 것까지 구현했다면 스타크래프트에서는 반은 완성했다고 생각하면 됩니다. 개인적으로 광전사들을 뽑기를 생각하였으나, 난이도 어려움을 이기기에서 광전사들로 만 하여 이기는 것은 꽤 어려움이 있을 것이라고 판단하였습니다.(물론 광전사의 돌진과 컨트롤들을 만들면 안 될 거야 없긴 하지만 귀찮으니까요) 그래서 어떤 유닛을 생산할지를 고민하다가 가장 적절한 유닛이 떠올랐습니다. 추적자입니다. 원거리 유닛이고 중장갑한테도 나름 큰 피해를 줄 수 있기 때문에 추적자만을 뽑도록 하였습니다.(귀차니즘이 위험한 이유) 로직도 대충 생각하는 데로 적어도 작동하는 데에는 큰 문제가 없습니다. 게이트가 있고, 게이트가 아무것도 생산 중이 아니라면 추적..