Compare commits

..

45 Commits

Author SHA1 Message Date
vstumpf
fd1e582156 It kinda works! 2024-07-05 09:07:17 +00:00
vstumpf
920b6a78c5 Merge branch 'refactor/cmake' into refactor/skills 2024-07-05 08:26:47 +00:00
vstumpf
34bdb49db9 Merge remote-tracking branch 'origin/refactor/cmake' into refactor/cmake 2024-07-05 01:02:10 +00:00
vstumpf
f54a204a7d Merge branch 'master' into refactor/cmake 2024-07-05 01:01:11 +00:00
Vincent Stumpf
b1a2d74b54 Merge pull request #4 from secretdataz/refactor/cmake
Added some Windows fixes, Added MAXXCON option to CMake
2024-05-09 00:10:14 -07:00
Jittapan Pluemsumran
d16dccf994 Added some Windows fixes, Added MAXXCON option to CMake 2024-05-04 19:47:01 +07:00
vstumpf
2e69ccedea Merge branch 'master' into refactor/cmake 2024-04-21 05:23:58 +00:00
Vincent Stumpf
b01e7da68d Merge branch 'master' into refactor/cmake 2024-02-17 01:50:56 +00:00
Vincent Stumpf
008d25cfb2 Merge remote-tracking branch 'upstream/master' into refactor/cmake 2023-12-24 00:26:14 +00:00
Vincent Stumpf
f4c9ed691c Merge remote-tracking branch 'upstream/master' into refactor/cmake 2023-12-12 07:43:50 +00:00
Vincent Stumpf
cc397167ab Enable configurable multi-threaded compilation 2023-12-12 07:43:19 +00:00
Vincent Stumpf
8f15bc2117 Merge remote-tracking branch 'upstream/master' into refactor/cmake 2023-11-26 05:45:27 +00:00
Vincent Stumpf
bf36dd4b1f Merge remote-tracking branch 'upstream/master' into refactor/cmake 2023-11-05 01:13:39 +00:00
Vincent Stumpf
fc242d0472 remove commented code 2023-08-06 06:24:33 +00:00
Vincent Stumpf
f41a80ca59 Remove redundant ubuntu-latest build 2023-07-20 03:34:32 +00:00
Vincent Stumpf
eadff3366d Fix cmake arg order 2023-07-12 03:27:56 +00:00
Vincent Stumpf
9636aa020d Remove deprecated builds 2023-07-12 03:23:48 +00:00
Vincent Stumpf
5c2718de03 Add concurrency and dependency on CMakeLists.txt 2023-07-12 03:22:52 +00:00
Vincent Stumpf
1b3357611b Merge remote-tracking branch 'upstream/master' into refactor/cmake 2023-07-03 07:44:30 +00:00
Vincent Stumpf
b3f6ad41ba Merge branch 'master' of github.com:rathena/rathena into refactor/cmake 2023-06-19 05:44:33 +00:00
Vincent Stumpf
c789cdbadd Merge remote-tracking branch 'upstream/master' into refactor/cmake 2023-06-18 22:28:19 +00:00
Vincent Stumpf
98ac59a940 change to oop 2023-06-17 02:00:01 +00:00
Vincent Stumpf
f73e6658ca Add deprecation notice in rAthena.sln 2023-06-15 03:01:39 +00:00
Vincent Stumpf
d98166383c Add .sh filetype to athena-start 2023-06-14 07:19:05 +00:00
Vincent Stumpf
b1520ea969 Add new line after tools 2023-06-14 07:10:48 +00:00
Vincent Stumpf
ee456d8af6 Add HAVE_STRNLEN and HAVE_SETRLIMIT 2023-06-14 07:08:14 +00:00
Vincent Stumpf
1545d483c0 Build tools in cmake workflow 2023-06-14 04:57:28 +00:00
Vincent Stumpf
b6ce15af00 Don't need to copy the configure files, they're being replaced by cmake 2023-06-13 07:34:08 +00:00
Vincent Stumpf
1f474a62cf enable PCRE for mapserver 2023-06-11 07:22:21 +00:00
Vincent Stumpf
9024cc7ef8 Change most github workflows to cmake 2023-06-11 06:41:37 +00:00
Vincent Stumpf
026c014eb2 Add ENABLE_VIP option to cmake 2023-06-11 06:39:36 +00:00
Vincent Stumpf
26dee6891b Fix windows cmake 2023-06-11 05:03:44 +00:00
Vincent Stumpf
258a8e6be0 Let's add windows to the cmake ci 2023-06-11 03:07:36 +00:00
Vincent Stumpf
48b0b082b6 Whoops, let's leave the configure script in, and the linux scripts too for now 2023-06-11 02:33:46 +00:00
Vincent Stumpf
6ae46a7bf8 Add custom 'server' target 2023-06-11 02:29:17 +00:00
Vincent Stumpf
855cf12007 Move scripts to tools 2023-06-11 02:29:17 +00:00
Vincent Stumpf
ae862453bd Move extra cmake files to tools/cmake 2023-06-11 02:29:17 +00:00
Vincent Stumpf
c11d73d6a8 Add epoll support 2023-06-11 02:29:17 +00:00
Vincent Stumpf
ff86c7b9d1 Maybe make scripts work? 2023-06-11 02:29:17 +00:00
Vincent Stumpf
e1b9b0d9b3 Add support for import files
This will check and copy import files whenever we regenerate the build system
2023-06-11 02:29:17 +00:00
Vincent Stumpf
b3c47f043e Remove cmakelistsold (oops) and clean up httplib 2023-06-11 02:29:17 +00:00
Vincent Stumpf
c69587c2e7 Refactor CMake to be nicer, more modern, easier to understand 2023-06-11 02:29:15 +00:00
Vincent Stumpf
95ee5d04e6 Double visitor? 2023-06-10 06:41:25 +00:00
Vincent Stumpf
28383ee332 Initial commit of skills 2023-06-04 05:45:11 +00:00
Vincent Stumpf
857f335729 Fix cmake stuff 2023-05-26 01:58:55 +00:00
107 changed files with 9145 additions and 11590 deletions

View File

@@ -18,6 +18,8 @@ on:
# This workflow should run when a file in a source directory has been modified.
- 'src/**'
- '3rdparty/**'
# This workflow should run whenever a CMake related file has been modified
- '**/CMakeLists.txt'
jobs:
analyze:
@@ -31,8 +33,6 @@ jobs:
# The ubuntu-latest label currently points to ubuntu-20.04.
# Available: ubuntu-22.04, ubuntu-20.04
os: [ubuntu-latest]
# Older versions of GCC are not available via unaltered aptitude repo lists.
gcc: ['10']
# We run build checks for both Renewal and PRE-Renewal
mode: ['PRE','RE']
@@ -64,10 +64,10 @@ jobs:
- name: Update & Install packages
# Ubuntu runners already have most of the packages rAthena requires to build.
# https://github.com/actions/virtual-environments/blob/main/images/linux/Ubuntu2004-Readme.md
# https://github.com/actions/virtual-environments/blob/main/images/linux/Ubuntu2204-Readme.md
run: |
sudo apt update
sudo apt install zlib1g-dev libpcre3-dev gcc-${{ matrix.gcc }} g++-${{ matrix.gcc }}
sudo apt install zlib1g-dev libpcre3-dev
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
@@ -77,16 +77,16 @@ jobs:
# ?? If the Autobuild fails above, remove it and uncomment the following
# three lines and modify them (or add more) to build your code if your
# project uses a compiled language
- name: Command - configure
env:
CONFIGURE_FLAGS: 'CC=gcc-${{ matrix.gcc }} CXX=g++-${{ matrix.gcc }} --enable-prere=${{ env.PRERE }} --enable-buildbot=yes'
run: ./configure $CONFIGURE_FLAGS
- name: Create build directory
run: cmake -E make_directory ${{github.workspace}}/build
- name: Command - make clean
run: make clean
- name: Configure CMake
working-directory: ${{github.workspace}}/build
run: cmake .. -DENABLE_PRERENEWAL=${{env.PRERE}} -DENABLE_EXTRA_BUILDBOT_CODE=ON
- name: Command - make server
run: make server
- name: Build
working-directory: ${{github.workspace}}/build
run: cmake --build . -j2 --target server
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3

View File

@@ -1,54 +0,0 @@
name: Build servers with Clang
# build_servers_clang.yml
concurrency:
group: ${{ github.repository }}-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
on:
workflow_dispatch:
push:
branches:
- master
pull_request:
paths:
# Always trigger all Github Actions if an action or something CI related was changed
- '.github/workflows/**'
- 'tools/ci/**'
# This workflow should run when a file in a source directory has been modified.
- 'src/**'
- '3rdparty/**'
jobs:
build:
# Github Actions checks for '[ci skip]', '[skip ci]', '[no ci]', '[skip actions]', or '[actions skip]' but not a hyphenated version.
# It's a catch-all incase a Pull Request has been opened and someone is on auto-pilot.
if: "!contains(github.event.head_commit.message, 'ci-skip')"
runs-on: ${{ matrix.os }}
strategy:
matrix:
# The ubuntu-latest label currently points to ubuntu-22.04.
# Available: ubuntu-22.04, ubuntu-20.04
os: [ubuntu-20.04]
# Version list can be found on https://github.com/marketplace/actions/install-clang
clang: ['6.0', '7', '8', '9', '10', '11'] #, '12', '13']
steps:
- uses: actions/checkout@v4
- name: Set up Clang
uses: egor-tensin/setup-clang@v1
with:
version: ${{ matrix.clang }}
platform: x64
- name: Command - configure
env:
CONFIGURE_FLAGS: 'CC=clang-${{ matrix.clang }} CXX=clang++-${{ matrix.clang }} --enable-buildbot=yes'
run: ./configure $CONFIGURE_FLAGS
- name: Command - make clean
run: make clean
- name: Command - make all
run: make all

View File

@@ -1,61 +0,0 @@
name: Build servers with GCC
# build_servers_gcc.yml
concurrency:
group: ${{ github.repository }}-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
on:
workflow_dispatch:
push:
branches:
- master
pull_request:
paths:
# Always trigger all Github Actions if an action or something CI related was changed
- '.github/workflows/**'
- 'tools/ci/**'
# This workflow should run when a file in a source directory has been modified.
- 'src/**'
- '3rdparty/**'
jobs:
build:
# Github Actions checks for '[ci skip]', '[skip ci]', '[no ci]', '[skip actions]', or '[actions skip]' but not a hyphenated version.
# It's a catch-all incase a Pull Request has been opened and someone is on auto-pilot.
if: "!contains(github.event.head_commit.message, 'ci-skip')"
runs-on: ${{ matrix.os }}
strategy:
matrix:
# The ubuntu-latest label currently points to ubuntu-22.04.
# Available: ubuntu-22.04, ubuntu-20.04
os: [ubuntu-latest]
# Older versions of GCC are not available via unaltered aptitude repo lists.
gcc: ['9', '10', '11', '12']
# GCC 13 was removed from 22.04, include it as a separate job
include:
- os: ubuntu-24.04
gcc: 13
steps:
- uses: actions/checkout@v4
- name: Update & Install packages
# Ubuntu runners already have most of the packages rAthena requires to build.
# https://github.com/actions/virtual-environments/blob/main/images/linux/Ubuntu2004-Readme.md
run: |
sudo apt update
sudo apt install zlib1g-dev libpcre3-dev gcc-${{ matrix.gcc }} g++-${{ matrix.gcc }}
- name: Command - configure
env:
CONFIGURE_FLAGS: 'CC=gcc-${{ matrix.gcc }} CXX=g++-${{ matrix.gcc }}'
# -Werror: to treat all warnings as errors
# -Wno-error=builtin-declaration-mismatch: otherwise ./configure checks fail
run: ./configure $CONFIGURE_FLAGS --enable-buildbot=yes CXXFLAGS='-Werror -Wno-error=builtin-declaration-mismatch'
- name: Command - make clean
run: make clean
- name: Command - make all
run: make all

View File

@@ -18,6 +18,8 @@ on:
# This workflow should run when a file in a source directory has been modified.
- 'src/**'
- '3rdparty/**'
# This workflow should run whenever a CMake related file has been modified
- '**/CMakeLists.txt'
jobs:
build:
@@ -30,8 +32,6 @@ jobs:
# The ubuntu-latest label currently points to ubuntu-22.04.
# Available: ubuntu-22.04, ubuntu-20.04
os: [ubuntu-latest]
# Older versions of GCC are not available via unaltered aptitude repo lists.
gcc: ['11']
# We run build checks for both Renewal and PRE-Renewal
mode: ['PRE','RE']
@@ -42,18 +42,18 @@ jobs:
- name: Variable Parsing - PRE
if: ${{ matrix.mode == 'PRE' }}
run: |
echo "PRERE=yes" >> $GITHUB_ENV
echo "PRERE=ON" >> $GITHUB_ENV
- name: Variable Parsing - RE
if: ${{ matrix.mode == 'RE' }}
run: |
echo "PRERE=no" >> $GITHUB_ENV
echo "PRERE=OFF" >> $GITHUB_ENV
- name: Update & Install packages
# Ubuntu runners already have most of the packages rAthena requires to build.
# https://github.com/actions/virtual-environments/blob/main/images/linux/Ubuntu2004-Readme.md
# https://github.com/actions/virtual-environments/blob/main/images/linux/Ubuntu2204-Readme.md
run: |
sudo apt update
sudo apt install zlib1g-dev libpcre3-dev gcc-${{ matrix.gcc }} g++-${{ matrix.gcc }}
sudo apt install zlib1g-dev libpcre3-dev
- name: Start MySQL
run: sudo systemctl start mysql.service
@@ -61,16 +61,16 @@ jobs:
- name: Setup Database and import table data
run: ./tools/ci/sql.sh
- name: Command - configure
env:
CONFIGURE_FLAGS: 'CC=gcc-${{ matrix.gcc }} CXX=g++-${{ matrix.gcc }} --enable-prere=${{ env.PRERE }} --enable-buildbot=yes'
run: ./configure $CONFIGURE_FLAGS
- name: Create build directory
run: cmake -E make_directory ${{github.workspace}}/build
- name: Command - make clean
run: make clean
- name: Configure CMake
working-directory: ${{github.workspace}}/build
run: cmake .. -DENABLE_PRERENEWAL=${{env.PRERE}} -DENABLE_EXTRA_BUILDBOT_CODE=ON
- name: Command - make server
run: make server
- name: Build
working-directory: ${{github.workspace}}/build
run: cmake --build . -j2 --target server
- name: Run Once - login-server
run: ./login-server --run-once

View File

@@ -1,48 +0,0 @@
name: Build servers with MSVS
# build_servers_msbuild.yml
concurrency:
group: ${{ github.repository }}-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
on:
workflow_dispatch:
push:
branches:
- master
pull_request:
paths:
# Always trigger all Github Actions if an action or something CI related was changed
- '.github/workflows/**'
- 'tools/ci/**'
# This workflow should run when a file in a source directory has been modified.
- 'src/**'
- '3rdparty/**'
jobs:
build:
# Github Actions checks for '[ci skip]', '[skip ci]', '[no ci]', '[skip actions]', or '[actions skip]' but not a hyphenated version.
# It's a catch-all incase a Pull Request has been opened and someone is on auto-pilot.
if: "!contains(github.event.head_commit.message, 'ci-skip')"
runs-on: ${{ matrix.os }}
strategy:
matrix:
# The windows-latest label currently points to windows-2019.
# Available: windows-2016, windows-2019 and windows-2022
os: [windows-latest]
# We run build checks for both Renewal and PRE-Renewal
mode: ['PRE', 'RE']
steps:
- uses: actions/checkout@v4
- name: Add msbuild to PATH
uses: microsoft/setup-msbuild@v2
- name: Build solution in Debug
if: ${{ matrix.mode == 'PRE' }}
run: msbuild rAthena.sln -t:rebuild -property:Configuration=Debug /p:DefineConstants="BUILDBOT%3BPRERE" /warnaserror
- name: Build solution in Debug
if: ${{ matrix.mode == 'RE' }}
run: msbuild rAthena.sln -t:rebuild -property:Configuration=Debug /p:DefineConstants="BUILDBOT" /warnaserror

View File

@@ -18,6 +18,8 @@ on:
# This workflow should run when a file in a source directory has been modified.
- 'src/**'
- '3rdparty/**'
# This workflow should run whenever a CMake related file has been modified
- '**/CMakeLists.txt'
jobs:
build:
@@ -30,8 +32,6 @@ jobs:
# The ubuntu-latest label currently points to ubuntu-22.04.
# Available: ubuntu-22.04, ubuntu-20.04
os: [ubuntu-latest]
# Older versions of GCC are not available via unaltered aptitude repo lists.
gcc: ['11']
# We run build checks for both Renewal and PRE-Renewal
mode: ['PRE','RE']
# Check build success for different packet-versions
@@ -44,18 +44,18 @@ jobs:
- name: Variable Parsing - PRE
if: ${{ matrix.mode == 'PRE' }}
run: |
echo "PRERE=yes" >> $GITHUB_ENV
echo "PRERE=ON" >> $GITHUB_ENV
- name: Variable Parsing - RE
if: ${{ matrix.mode == 'RE' }}
run: |
echo "PRERE=no" >> $GITHUB_ENV
echo "PRERE=OFF" >> $GITHUB_ENV
- name: Update & Install packages
# Ubuntu runners already have most of the packages rAthena requires to build.
# https://github.com/actions/virtual-environments/blob/main/images/linux/Ubuntu2004-Readme.md
run: |
sudo apt update
sudo apt install zlib1g-dev libpcre3-dev gcc-${{ matrix.gcc }} g++-${{ matrix.gcc }}
sudo apt install zlib1g-dev libpcre3-dev
- name: Start MySQL
run: sudo systemctl start mysql.service
@@ -63,13 +63,13 @@ jobs:
- name: Setup Database and import table data
run: ./tools/ci/sql.sh
- name: Command - configure
env:
CONFIGURE_FLAGS: 'CC=gcc-${{ matrix.gcc }} CXX=g++-${{ matrix.gcc }} --enable-prere=${{ env.PRERE }} --enable-packetver=${{ matrix.packetver }} --enable-buildbot=yes'
run: ./configure $CONFIGURE_FLAGS
- name: Create build directory
run: cmake -E make_directory ${{github.workspace}}/build
- name: Command - make clean
run: make clean
- name: Configure CMake
working-directory: ${{github.workspace}}/build
run: cmake .. -DENABLE_PRERENEWAL=${{env.PRERE}} -DPACKETVER=${{matrix.packetver}} -DENABLE_EXTRA_BUILDBOT_CODE=ON
- name: Command - make all
run: make all
- name: Build
working-directory: ${{github.workspace}}/build
run: cmake --build . -j2

View File

@@ -18,6 +18,8 @@ on:
# This workflow should run when a file in a source directory has been modified.
- 'src/**'
- '3rdparty/**'
# This workflow should run whenever a CMake related file has been modified
- '**/CMakeLists.txt'
jobs:
build:
@@ -30,8 +32,6 @@ jobs:
# The ubuntu-latest label currently points to ubuntu-22.04.
# Available: ubuntu-22.04, ubuntu-20.04
os: [ubuntu-latest]
# Older versions of GCC are not available via unaltered aptitude repo lists.
gcc: ['11']
# We run build checks for both Renewal and PRE-Renewal
mode: ['PRE', 'RE']
@@ -42,18 +42,18 @@ jobs:
- name: Variable Parsing - PRE
if: ${{ matrix.mode == 'PRE' }}
run: |
echo "PRERE=yes" >> $GITHUB_ENV
echo "PRERE=ON" >> $GITHUB_ENV
- name: Variable Parsing - RE
if: ${{ matrix.mode == 'RE' }}
run: |
echo "PRERE=no" >> $GITHUB_ENV
echo "PRERE=OFF" >> $GITHUB_ENV
- name: Update & Install packages
# Ubuntu runners already have most of the packages rAthena requires to build.
# https://github.com/actions/virtual-environments/blob/main/images/linux/Ubuntu2004-Readme.md
run: |
sudo apt update
sudo apt install zlib1g-dev libpcre3-dev gcc-${{ matrix.gcc }} g++-${{ matrix.gcc }}
sudo apt install zlib1g-dev libpcre3-dev
- name: Start MySQL
run: sudo systemctl start mysql.service
@@ -61,16 +61,16 @@ jobs:
- name: Setup Database and import table data
run: ./tools/ci/sql.sh
- name: Command - configure
env:
CONFIGURE_FLAGS: 'CC=gcc-${{ matrix.gcc }} CXX=g++-${{ matrix.gcc }} --enable-prere=${{ env.PRERE }} --enable-buildbot=yes --enable-vip=yes'
run: ./configure $CONFIGURE_FLAGS
- name: Command - make clean
run: make clean
- name: Create build directory
run: cmake -E make_directory ${{github.workspace}}/build
- name: Command - make server
run: make server
- name: Configure CMake
working-directory: ${{github.workspace}}/build
run: cmake .. -DENABLE_PRERENEWAL=${{env.PRERE}} -DENABLE_EXTRA_BUILDBOT_CODE=ON -DENABLE_VIP=ON
- name: Build
working-directory: ${{github.workspace}}/build
run: cmake --build . -j2 --target server
- name: Run Once - login-server
run: ./login-server --run-once

View File

@@ -1,5 +1,5 @@
name: Build servers with CMake
# build_servers_cmake.yml
name: Build servers on Windows
# build_servers_windows.yml
concurrency:
group: ${{ github.repository }}-${{ github.workflow }}-${{ github.ref }}
@@ -29,25 +29,19 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
# The ubuntu-latest label currently points to ubuntu-22.04.
# Available: ubuntu-22.04, ubuntu-20.04
os: [ubuntu-latest]
os: [windows-latest]
steps:
- uses: actions/checkout@v4
# Install latest CMake.
- uses: lukka/get-cmake@latest
- name: Create build directory
run: mkdir cbuild
run: cmake -E make_directory ${{github.workspace}}/build
- name: Create Unix Makefiles
run: |
cd cbuild
cmake -G "Unix Makefiles" ..
- name: Configure CMake
working-directory: ${{github.workspace}}/build
run: cmake ..
- name: Command - make
run: |
cd cbuild
make
- name: Build
working-directory: ${{github.workspace}}/build
# Execute the build. You can specify a specific target with "--target <NAME>"
run: cmake --build . -j2 --target server tools

View File

@@ -21,6 +21,8 @@ on:
# This workflow should run when a file in either the db/ or npc/ directory has been modified.
- 'db/**'
- 'npc/**'
# This workflow should run whenever a CMake related file has been modified
- '**/CMakeLists.txt'
jobs:
build:
@@ -33,8 +35,6 @@ jobs:
# The ubuntu-latest label currently points to ubuntu-22.04.
# Available: ubuntu-22.04, ubuntu-20.04
os: [ubuntu-latest]
# Only a single version of GCC is required for validating NPC scripts and database changes.
gcc: ['11']
# We run build checks for both Renewal and PRE-Renewal
mode: ['PRE', 'RE']
@@ -43,45 +43,41 @@ jobs:
# A simple 'yes' and 'no' can be confusing, so we use names to display in the current job then convert them for use in the compiler.
- name: Variable Parsing - PRE
if: ${{ matrix.mode == 'PRE' }}
if: ${{ matrix.mode == 'PRE' }}
run: |
echo "PRERE=yes" >> $GITHUB_ENV
echo "PRERE=ON" >> $GITHUB_ENV
- name: Variable Parsing - RE
if: ${{ matrix.mode == 'RE' }}
if: ${{ matrix.mode == 'RE' }}
run: |
echo "PRERE=no" >> $GITHUB_ENV
echo "PRERE=OFF" >> $GITHUB_ENV
- name: Update & Install packages
# Ubuntu runners already have most of the packages rAthena requires to build.
# https://github.com/actions/virtual-environments/blob/main/images/linux/Ubuntu2004-Readme.md
# https://github.com/actions/virtual-environments/blob/main/images/linux/Ubuntu2204-Readme.md
run: |
sudo apt update
sudo apt install zlib1g-dev libpcre3-dev gcc-${{ matrix.gcc }} g++-${{ matrix.gcc }}
sudo apt install zlib1g-dev libpcre3-dev
- name: Start MySQL
run: sudo systemctl start mysql.service
- name: Setup Database and import table data
run: ./tools/ci/sql.sh
- name: Command - configure
env:
CONFIGURE_FLAGS: 'CC=gcc-${{ matrix.gcc }} CXX=g++-${{ matrix.gcc }} --enable-prere=${{ env.PRERE }} --enable-buildbot=yes'
run: ./configure $CONFIGURE_FLAGS
- name: Create build directory
run: cmake -E make_directory ${{github.workspace}}/build
- name: Configure CMake
working-directory: ${{github.workspace}}/build
run: cmake .. -DENABLE_PRERENEWAL=${{env.PRERE}} -DENABLE_EXTRA_BUILDBOT_CODE=ON
- name: Build
working-directory: ${{github.workspace}}/build
run: cmake --build . -j2 --target map-server
# npc.sh enables all NPC scripts in the custom and test folders.
- name: Enable All NPCs for Testing
run: ./tools/ci/npc.sh
- name: Command - make clean
run: make clean
# Create import directories
- name: Command - make import
run: make import
- name: Command - make map
run: make map
- name: Run Once - map-server
run: ./map-server --run-once

6
.gitignore vendored
View File

@@ -139,6 +139,12 @@ Thumbs.db
/yamlupgrade.bat
/navigenerator.bat
# Linux script tools
/athena-start.sh
# /function.sh
# /install.sh
# /uninstall.sh
# dlls
/libmysql.dll
/pcre8.dll

View File

@@ -1,38 +1,18 @@
cmake_minimum_required(VERSION 2.8)
add_library(httplib STATIC)
if ( NOT ENABLE_WEB_SERVER )
return()
endif( NOT ENABLE_WEB_SERVER )
target_sources(httplib PRIVATE "httplib.cc")
SET (this_target httplib)
PROJECT(${this_target})
target_include_directories(httplib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
find_path ( HTTPLIB_INCLUDE_DIRS "httplib.h"
PATHS "${CMAKE_CURRENT_SOURCE_DIR}"
NO_DEFAULT_PATH )
find_path ( HTTPLIB_SOURCE_DIR "httplib.cc"
PATHS "${CMAKE_CURRENT_SOURCE_DIR}"
NO_DEFAULT_PATH )
mark_as_advanced( HTTPLIB_INCLUDE_DIRS )
mark_as_advanced( HTTPLIB_SOURCE_DIR )
set ( HTTPLIB_HEADERS
"${HTTPLIB_INCLUDE_DIRS}/httplib.h"
CACHE INTERNAL "httplib headers" )
set ( HTTPLIB_SOURCES
"${HTTPLIB_SOURCE_DIR}/httplib.cc"
CACHE INTERNAL "httplib sources" )
set ( HTTPLIB_DEFINITIONS
"-std=c++11"
CACHE INTERNAL "http definitions" )
include_directories( ${HTTPLIB_INCLUDE_DIRS} ${HTTPLIB_SOURCE_DIR} )
ADD_LIBRARY( ${this_target} STATIC ${HTTPLIB_SOURCES} )
if (NOT WIN32)
target_compile_definitions(${this_target} PUBLIC "CPPHTTPLIB_SEND_FLAGS=MSG_NOSIGNAL")
if(NOT WIN32)
target_compile_definitions(httplib PUBLIC "CPPHTTPLIB_SEND_FLAGS=MSG_NOSIGNAL")
endif()
if(WIN32)
target_sources(httplib PRIVATE "httplib.h")
set_target_properties(httplib PROPERTIES FOLDER "3rdparty")
endif()
if(NOT ENABLE_WEB_SERVER)
set_target_properties(httplib PROPERTIES EXCLUDE_FROM_ALL TRUE)
endif()

View File

@@ -1,7 +1,3 @@
cmake_minimum_required(VERSION 2.8)
add_library(json INTERFACE)
set (JSON_INCLUDE_DIRS
"${CMAKE_CURRENT_SOURCE_DIR}/include"
CACHE INTERNAL "json include dir" )
mark_as_advanced( JSON_INCLUDE_DIRS )
target_include_directories(json INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/include")

View File

@@ -1,29 +1,27 @@
find_path( LIBCONFIG_INCLUDE_DIRS "libconfig.h"
PATHS "${CMAKE_CURRENT_SOURCE_DIR}"
NO_DEFAULT_PATH )
find_path( LIBCONFIG_SOURCE_DIR "libconfig.c"
PATHS "${CMAKE_CURRENT_SOURCE_DIR}"
NO_DEFAULT_PATH )
mark_as_advanced( LIBCONFIG_INCLUDE_DIRS )
mark_as_advanced( LIBCONFIG_SOURCE_DIR )
add_library(libconfig STATIC)
set( LIBCONFIG_HEADERS
"${CMAKE_CURRENT_SOURCE_DIR}/grammar.h"
"${CMAKE_CURRENT_SOURCE_DIR}/libconfig.h"
"${CMAKE_CURRENT_SOURCE_DIR}/parsectx.h"
"${CMAKE_CURRENT_SOURCE_DIR}/scanctx.h"
"${CMAKE_CURRENT_SOURCE_DIR}/scanner.h"
"${CMAKE_CURRENT_SOURCE_DIR}/strbuf.h"
"${CMAKE_CURRENT_SOURCE_DIR}/wincompat.h"
CACHE INTERNAL "libconfig headers" )
set( LIBCONFIG_SOURCES
"${CMAKE_CURRENT_SOURCE_DIR}/grammar.c"
"${CMAKE_CURRENT_SOURCE_DIR}/libconfig.c"
"${CMAKE_CURRENT_SOURCE_DIR}/scanctx.c"
"${CMAKE_CURRENT_SOURCE_DIR}/scanner.c"
"${CMAKE_CURRENT_SOURCE_DIR}/strbuf.c"
CACHE INTERNAL "libconfig sources" )
set( LIBCONFIG_DEFINITIONS
"-DLIBCONFIG_STATIC"
CACHE INTERNAL "libconfig definitions" )
target_sources(libconfig PRIVATE
"grammar.c"
"libconfig.c"
"scanctx.c"
"scanner.c"
"strbuf.c"
)
target_include_directories(libconfig PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}")
target_compile_definitions(libconfig PUBLIC "-DLIBCONFIG_STATIC")
if(WIN32)
target_sources(libconfig PRIVATE
"grammar.h"
"libconfig.h"
"parsectx.h"
"scanctx.h"
"scanner.h"
"strbuf.h"
"wincompat.h"
)
set_target_properties(libconfig PROPERTIES FOLDER "3rdparty")
endif()

View File

@@ -95,6 +95,7 @@ endif()
c4_add_dev_targets()
add_custom_target(ryml-uninstall
"${CMAKE_COMMAND}" -P "${PROJECT_SOURCE_DIR}/cmake/uninstall.cmake"
)
# rathena
if(WIN32)
set_target_properties(ryml PROPERTIES FOLDER "3rdparty")
endif()

View File

@@ -78,13 +78,6 @@ endif()
set(C4CORE_AMALGAMATED ${C4CORE_SRC_DIR}/../src_singleheader/c4/c4core_all.hpp)
list(TRANSFORM C4CORE_SRC_FILES PREPEND "${C4CORE_SRC_DIR}/" OUTPUT_VARIABLE C4CORE_SRC_FILES_FULL)
add_custom_target(c4core-amalgamate
python ${CMAKE_CURRENT_LIST_DIR}/tools/amalgamate.py ${C4CORE_AMALGAMATED}
COMMENT "${CMAKE_CURRENT_LIST_DIR}/tools/amalgamate.py ${C4CORE_AMALGAMATED}"
BYPRODUCTS ${C4CORE_AMALGAMATED}
DEPENDS ${C4CORE_SRC_FILES_FULL}
)
c4_add_library(c4core
INC_DIRS
$<BUILD_INTERFACE:${C4CORE_SRC_DIR}> $<INSTALL_INTERFACE:include>
@@ -105,3 +98,8 @@ c4_install_exports()
c4_add_dev_targets()
c4_pack_project(TYPE LIBRARY)
# rathena
if(WIN32)
set_target_properties(c4core PROPERTIES FOLDER "3rdparty")
endif()

View File

@@ -1,87 +1,78 @@
cmake_minimum_required(VERSION 2.8)
set(YAML_HEADERS
"yaml.h"
"traits.h"
"stlemitter.h"
"parser.h"
"ostream_wrapper.h"
"null.h"
"noncopyable.h"
"noexcept.h"
"mark.h"
"exceptions.h"
"eventhandler.h"
"emitterstyle.h"
"emittermanip.h"
"emitter.h"
"emitterdef.h"
"emitfromevents.h"
"dll.h"
"depthguard.h"
"binary.h"
"anchor.h"
"node/type.h"
"node/ptr.h"
"node/parse.h"
"node/node.h"
"node/iterator.h"
"node/impl.h"
"node/emit.h"
"node/convert.h"
"contrib/graphbuilder.h"
"contrib/anchordict.h"
)
list(TRANSFORM YAML_HEADERS PREPEND "include/yaml-cpp/")
## start setting
SET (this_target yaml-cpp)
PROJECT(${this_target})
set(YAML_SOURCES
"binary.cpp"
"convert.cpp"
"depthguard.cpp"
"directives.cpp"
"emit.cpp"
"emitfromevents.cpp"
"emitter.cpp"
"emitterstate.cpp"
"emitterutils.cpp"
"exceptions.cpp"
"exp.cpp"
"memory.cpp"
"nodebuilder.cpp"
"node.cpp"
"node_data.cpp"
"nodeevents.cpp"
"null.cpp"
"ostream_wrapper.cpp"
"parse.cpp"
"parser.cpp"
"regex_yaml.cpp"
"scanner.cpp"
"scanscalar.cpp"
"scantag.cpp"
"scantoken.cpp"
"simplekey.cpp"
"singledocparser.cpp"
"stream.cpp"
"tag.cpp"
"contrib/graphbuilderadapter.cpp"
"contrib/graphbuilder.cpp"
)
list(TRANSFORM YAML_SOURCES PREPEND "src/")
find_path( YAML_INCLUDE_DIRS "yaml-cpp/yaml.h"
PATHS "${CMAKE_CURRENT_SOURCE_DIR}/include"
NO_DEFAULT_PATH )
find_path( YAML_SOURCE_DIR "regex_yaml.cpp"
PATHS "${CMAKE_CURRENT_SOURCE_DIR}/src"
NO_DEFAULT_PATH )
mark_as_advanced( YAML_INCLUDE_DIRS )
mark_as_advanced( YAML_SOURCE_DIR )
add_library(yaml-cpp STATIC EXCLUDE_FROM_ALL ${YAML_SOURCES})
set( YAML_HEADERS
"${YAML_INCLUDE_DIRS}/yaml-cpp/yaml.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/traits.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/stlemitter.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/parser.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/ostream_wrapper.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/null.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/noncopyable.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/noexcept.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/mark.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/exceptions.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/eventhandler.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/emitterstyle.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/emittermanip.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/emitter.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/emitterdef.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/emitfromevents.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/dll.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/depthguard.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/binary.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/anchor.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/node/type.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/node/ptr.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/node/parse.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/node/node.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/node/iterator.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/node/impl.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/node/emit.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/node/convert.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/contrib/graphbuilder.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/contrib/anchordict.h"
CACHE INTERNAL "yaml headers" )
set( YAML_SOURCES
"${YAML_SOURCE_DIR}/binary.cpp"
"${YAML_SOURCE_DIR}/convert.cpp"
"${YAML_SOURCE_DIR}/depthguard.cpp"
"${YAML_SOURCE_DIR}/directives.cpp"
"${YAML_SOURCE_DIR}/emit.cpp"
"${YAML_SOURCE_DIR}/emitfromevents.cpp"
"${YAML_SOURCE_DIR}/emitter.cpp"
"${YAML_SOURCE_DIR}/emitterstate.cpp"
"${YAML_SOURCE_DIR}/emitterutils.cpp"
"${YAML_SOURCE_DIR}/exceptions.cpp"
"${YAML_SOURCE_DIR}/exp.cpp"
"${YAML_SOURCE_DIR}/memory.cpp"
"${YAML_SOURCE_DIR}/nodebuilder.cpp"
"${YAML_SOURCE_DIR}/node.cpp"
"${YAML_SOURCE_DIR}/node_data.cpp"
"${YAML_SOURCE_DIR}/nodeevents.cpp"
"${YAML_SOURCE_DIR}/null.cpp"
"${YAML_SOURCE_DIR}/ostream_wrapper.cpp"
"${YAML_SOURCE_DIR}/parse.cpp"
"${YAML_SOURCE_DIR}/parser.cpp"
"${YAML_SOURCE_DIR}/regex_yaml.cpp"
"${YAML_SOURCE_DIR}/scanner.cpp"
"${YAML_SOURCE_DIR}/scanscalar.cpp"
"${YAML_SOURCE_DIR}/scantag.cpp"
"${YAML_SOURCE_DIR}/scantoken.cpp"
"${YAML_SOURCE_DIR}/simplekey.cpp"
"${YAML_SOURCE_DIR}/singledocparser.cpp"
"${YAML_SOURCE_DIR}/stream.cpp"
"${YAML_SOURCE_DIR}/tag.cpp"
"${YAML_SOURCE_DIR}/contrib/graphbuilderadapter.cpp"
"${YAML_SOURCE_DIR}/contrib/graphbuilder.cpp"
CACHE INTERNAL "yaml sources" )
set( YAML_DEFINITIONS
"-std=c++11"
CACHE INTERNAL "yaml definitions" )
include_directories(${YAML_INCLUDE_DIRS} ${YAML_SOURCE_DIR})
#message(STATUS "YAML_INCLUDE_DIRS : ${YAML_INCLUDE_DIRS}, YAML_SOURCE_DIR=${YAML_SOURCE_DIR}")
ADD_LIBRARY(${this_target} STATIC ${YAML_SOURCES} )
target_compile_definitions(${this_target} PUBLIC "-DYAML_CPP_STATIC_DEFINE")
target_include_directories(yaml-cpp PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include")
target_compile_definitions(yaml-cpp PUBLIC "-DYAML_CPP_STATIC_DEFINE")
if(WIN32)
set_target_properties(yaml-cpp PROPERTIES FOLDER "3rdparty")
endif()

View File

@@ -1,630 +1,105 @@
#####################################################################
#
# "Getting Started with CMake", a tutorial video by Eric Wing.
# Part 1 of 6: http://www.youtube.com/watch?v=CLvZTyji_Uw
# Part 2 of 6: http://www.youtube.com/watch?v=gUW-RrRQjEg
# Part 3 of 6: http://www.youtube.com/watch?v=sz6cPhbuTk4
# Part 4 of 6: http://www.youtube.com/watch?v=JICZOkyNXbg
# Part 5 of 6: http://www.youtube.com/watch?v=lAiuLHy4dCk
# Part 6 of 6: http://www.youtube.com/watch?v=fAtJNzDZdH8
#
# You can use notepad++ for syntax highlighting.
# Naming conventions:
# WITH_* : option to use an external package or not
# ENABLE_* : option to use an internal feature/code or not
# HAVE_* : internal variable indicating if we have and are using something
#
# Maintainers: Flavio J. Saraiva (feel free to send complaints or suggestions)
# flaviojs @ rAthena forum/irc
# flaviojs2005 \A-T/ gmail <D.o,T> com
# lightaisme \A-T/ gmail <D.o,T> com
#
#####################################################################
cmake_minimum_required(VERSION 3.11)
project(rAthena)
# Configure CMake Modules
list(APPEND CMAKE_MODULE_PATH
"${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/cmake"
"${CMAKE_CURRENT_SOURCE_DIR}/tools/cmake")
#cmake_minimum_required( VERSION 2.8.4 )
# Functional changes from 2.8.3 to 2.8.4:
# string(SUBSTRING) works with length -1 as "rest of string"
# changes to some CPack generators
# CYGWIN no longer defines WIN32
# CMP0017: Prefer files from the CMake module directory when including from there.
# Update to 3.1 for CMAKE_CXX_STANDARD cross support definition
set( CMAKE_LEGACY_CYGWIN_WIN32 0 )
cmake_minimum_required( VERSION 3.1 )
project( rAthena )
if( CYGWIN )
unset( WIN32 )
endif()
set(CMAKE_CXX_STANDARD 17) # C++17...
set(CMAKE_CXX_STANDARD_REQUIRED ON) #...is required...
#set(CMAKE_CXX_EXTENSIONS OFF) #...without compiler extensions like gnu++11
# options
set(PACKETVER 20211103 CACHE STRING "Sets the PACKETVER define of the servers (see src/common/mmo.hpp)")
set(MAXCONN CACHE STRING "Sets the MAXCONN define of the servers. (see src/common/socket.hpp)")
option(ENABLE_PRERENEWAL "Whether or not to enable Pre-renewal (default=OFF)" OFF)
option(ENABLE_WEB_SERVER "Build web-server (default=ON)" ON)
option(ENABLE_RDTSC "Enable RDTSC instruction as a timing source (default=OFF)" OFF)
option(ENABLE_EXTRA_DEBUG_CODE "Enable extra debug code (default=OFF)" OFF)
option(ENABLE_MEMMGR "Enable memory manager (default=ON)" ON)
# TODO(vstumpf): If no one uses this, we can just remove it
# set(ENABLE_MEMORY "system" CACHE STRING "Enable memory library (default=system)")
option(ENABLE_PROFILER "Enable profiler (default=OFF)" OFF)
option(ENABLE_EXTRA_BUILDBOT_CODE "Enable extra buildbot code (default=OFF)" OFF)
option(ENABLE_EPOLL "Use epoll instead of select (default=OFF)" OFF)
option(ENABLE_VIP "Enable VIP system (default=OFF)" OFF)
#actually this might be misleading for arm...
if( CMAKE_SIZEOF_VOID_P EQUAL 4 )
set(architecture x86)
elseif( CMAKE_SIZEOF_VOID_P EQUAL 8 )
set(architecture x64)
else()
message( FATAL_ERROR "unexpected architecture (CMAKE_SIZEOF_VOID_P is ${CMAKE_SIZEOF_VOID_P})" )
endif()
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/lib/${suffixInstallStr})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/lib/${suffixInstallStr})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
set(CMAKE_C_CREATE_SHARED_LIBRARY)
set(CMAKE_CXX_CREATE_SHARED_LIBRARY)
set(CMAKE_DEBUG_POSTFIX "d")
set(CMAKE_RELEASE_POSTFIX "r")
# Set a default build type if none was specified
set(default_build_type "Release")
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
message(STATUS "Setting build type to '${default_build_type}' as none was specified.")
set(CMAKE_BUILD_TYPE "${default_build_type}" CACHE
STRING "Choose the type of build." FORCE)
# Set the possible values of build type for cmake-gui
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
"Debug" "Release" "MinSizeRel" "RelWithDebInfo")
set(CMAKE_BUILD_TYPE "${default_build_type}" CACHE
STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel" FORCE)
message(STATUS "Setting build type to '${default_build_type}' as none was specified.")
endif()
if(CMAKE_GENERATOR MATCHES "Visual Studio")
set(ENABLE_MSVC_PARALLEL ON CACHE STRING "\
Enables /MP flag for parallel builds using MSVC. Specify an integer value to control \
the number of threads used (Only works on versions of Visual Studio). Setting to ON \
lets the toolchain decide how many threads to use. Set to OFF to disable /MP completely." )
if(ENABLE_MSVC_PARALLEL)
if(ENABLE_MSVC_PARALLEL GREATER 0)
string(APPEND CMAKE_C_FLAGS " /MP${ENABLE_MSVC_PARALLEL}")
string(APPEND CMAKE_CXX_FLAGS " /MP${ENABLE_MSVC_PARALLEL}")
else()
string(APPEND CMAKE_C_FLAGS " /MP")
string(APPEND CMAKE_CXX_FLAGS " /MP")
endif()
endif()
endif()
#
# Prevent building in the source directory by default
#
option( ALLOW_SAME_DIRECTORY "Allow CMake to build in the source directory." OFF )
if( ALLOW_SAME_DIRECTORY )
elseif( "${CMAKE_CURRENT_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}" )
message( FATAL_ERROR
"Do not use the source directory to build your files, instead delete CMakeCache.txt, create a separate folder and build there.\n"
"Example: (build in subdir 'build' and install to source dir)\n"
" rm -f CMakeCache.txt\n"
" mkdir build\n"
" cd build\n"
" cmake -G\"Unix Makefiles\" -DINSTALL_TO_SOURCE=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo ..\n"
" make install\n"
" cd ..\n"
" rm -rf build\n"
"To skip this check, set ALLOW_SAME_DIRECTORY to ON (-DALLOW_SAME_DIRECTORY=ON)" )
if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR)
message( FATAL_ERROR
"Do not use the source directory to build your files, instead delete CMakeCache.txt, create a separate folder and build there.\n"
"Example: (build in subdir 'build' and install to source dir)\n"
" rm -f CMakeCache.txt\n"
" mkdir build\n"
" cd build\n"
" cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo ..\n"
" make install\n"
" cd ..\n"
" rm -rf build\n")
endif()
#
# Global stuff
#
set( GLOBAL_LIBRARIES ${LINK_LIBRARIES} CACHE INTERNAL "" )# list (comma separated values)
set( GLOBAL_INCLUDE_DIRS ${INCLUDE_DIRECTORIES} CACHE INTERNAL "" )# list (comma separated values)
set( GLOBAL_DEFINITIONS ${COMPILE_DEFINITIONS} CACHE INTERNAL "" )# string (space separated values -DFOO=bar)
mark_as_advanced( GLOBAL_LIBRARIES GLOBAL_INCLUDE_DIRS GLOBAL_DEFINITIONS )
if( WIN32 )
set_property( CACHE GLOBAL_DEFINITIONS PROPERTY VALUE "${GLOBAL_DEFINITIONS} -DFD_SETSIZE=4096" )
endif()
if( MSVC )
set_property( CACHE GLOBAL_LIBRARIES PROPERTY VALUE ${GLOBAL_LIBRARIES} "oldnames.lib" "ws2_32.lib" )
set_property( CACHE GLOBAL_DEFINITIONS PROPERTY VALUE "${GLOBAL_DEFINITIONS} -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE" )
endif()
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_GNUCC)
set_property( CACHE GLOBAL_DEFINITIONS PROPERTY VALUE "${GLOBAL_DEFINITIONS} -fno-strict-aliasing" )
#set_property( CACHE GLOBAL_DEFINITIONS PROPERTY VALUE "${GLOBAL_DEFINITIONS} -O2" ); #need more test to enable this
if(WIN32)
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
endif()
#
# 3rd party
#
set( CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/cmake CACHE INTERNAL "" )
include( CheckCSourceCompiles )
include( CheckCSourceRuns )
include( CheckIncludeFile )
include( CheckFunctionExists )
include( FindFunctionLibrary )
include( TestBigEndian )
# Configure C++ Standard
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
#
# PACKETVER
#
set( PACKETVER CACHE STRING "Sets the PACKETVER define of the servers. (see src/common/mmo.h)" )
if( PACKETVER )
list( APPEND GLOBAL_DEFINITIONS PACKETVER=${PACKETVER} )
# Set build directories
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/lib/${suffixInstallStr})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/lib/${suffixInstallStr})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
if(WIN32)
set(RuntimeOutputDir "${CMAKE_BINARY_DIR}/..")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${RuntimeOutputDir})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL ${RuntimeOutputDir})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${RuntimeOutputDir})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${RuntimeOutputDir})
if (MSVC AND NOT MSVC_VERSION VERSION_LESS 142)
add_link_options($<$<CONFIG:Debug>:/INCREMENTAL>)
add_compile_options($<$<CONFIG:Debug>:/ZI>)
endif()
add_compile_definitions($<$<CONFIG:DEBUG>:_ITERATOR_DEBUG_LEVEL=0>)
endif()
add_subdirectory(db)
add_subdirectory(conf)
add_subdirectory(3rdparty)
add_subdirectory(src)
add_subdirectory(tools)
#
# Find git
#
message( STATUS "Detecting git" )
find_package(Git)
if(GIT_FOUND)
if(GIT_VERSION_STRING)
message(STATUS "Found git : ${GIT_EXECUTABLE} version (${GIT_VERSION_STRING})")
else()
message(STATUS "Found git : ${GIT_EXECUTABLE}")
endif()
endif()
include(GetGitVersion)
get_git_version()
#include(GetSvnVersion)
#get_svn_version(SVN_VERSION)
#message( STATUS "SVN_VERSION: ${SVN_VERSION}" )
#
# threads
#
message( STATUS "Detecting threads library" )
set( CMAKE_THREAD_PREFER_PTHREAD 1 )
find_package(Threads REQUIRED)
if( CMAKE_THREAD_LIBS_INIT )
message( STATUS "Adding global library: ${CMAKE_THREAD_LIBS_INIT}" )
set_property( CACHE GLOBAL_LIBRARIES PROPERTY VALUE ${GLOBAL_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} )
endif()
message( STATUS "Detecting threads library - done" )
message( STATUS "Check if supporting Thread local storage (TLS)" )
file( READ "${CMAKE_SOURCE_DIR}/3rdparty/cmake/tests/HAVE_TLS.c" _SOURCE )
CHECK_C_SOURCE_RUNS( "${_SOURCE}" HAVE_TLS )
if( HAVE_TLS )
message( STATUS "Check for TLS- yes" )
set_property( CACHE GLOBAL_DEFINITIONS PROPERTY VALUE "${GLOBAL_DEFINITIONS} -DHAVE_TLS" )
else()
message( STATUS "Check for TLS - no" )
endif()
#
# math library (FreeBSD/Linux/Solaris)
#
if( NOT WIN32 )
message( STATUS "Detecting math library (m)" )
CHECK_INCLUDE_FILE( math.h HAVE_MATH_H )
if( NOT HAVE_MATH_H )
message( FATAL_ERROR "math.h not found" )
endif()
set( CMAKE_REQUIRED_LIBRARIES ${GLOBAL_LIBRARIES} )
find_function_library( floor FUNCTION_FLOOR_LIBRARIES m )
if( FUNCTION_FLOOR_LIBRARIES )
message( STATUS "Adding global library: ${FUNCTION_FLOOR_LIBRARIES}" )
set_property( CACHE GLOBAL_LIBRARIES PROPERTY VALUE ${GLOBAL_LIBRARIES} ${FUNCTION_FLOOR_LIBRARIES} )
endif()
message( STATUS "Detecting math library (m) - done" )
endif()
#
# dynamic loading library (Linux)
#
if( NOT WIN32 )
message( STATUS "Detecting dynamic loading library (dl)" )
set( CMAKE_REQUIRED_LIBRARIES ${GLOBAL_LIBRARIES} )
find_function_library( dlopen FUNCTION_DLOPEN_LIBRARIES dl )
if( FUNCTION_DLOPEN_LIBRARIES )
message( STATUS "Adding global library: ${FUNCTION_DLOPEN_LIBRARIES}" )
set_property( CACHE GLOBAL_LIBRARIES PROPERTY VALUE ${GLOBAL_LIBRARIES} ${FUNCTION_DLOPEN_LIBRARIES} )
endif()
message( STATUS "Detecting dynamic loading library (dl) - done" )
endif()
#
# networking library (Solaris/MinGW)
#
if( NOT MSVC )
message( STATUS "Detecting networking library (socket/nsl/ws2_32)" )
#set( CMAKE_REQUIRED_LIBRARIES ${GLOBAL_LIBRARIES} )
#find_function_library( bind FUNCTION_BIND_LIBRARIES socket ws2_32 )
#if( FUNCTION_BIND_LIBRARIES )
# message( STATUS "Adding global library: ${FUNCTION_BIND_LIBRARIES}" )
# set_property( CACHE GLOBAL_LIBRARIES PROPERTY VALUE ${GLOBAL_LIBRARIES} ${FUNCTION_BIND_LIBRARIES} )
#endif()
set( CMAKE_REQUIRED_LIBRARIES ${GLOBAL_LIBRARIES} )
find_function_library( gethostbyname FUNCTION_GETHOSTBYNAME_LIBRARIES nsl )
if( FUNCTION_GETHOSTBYNAME_LIBRARIES )
message( STATUS "Adding global library: ${FUNCTION_GETHOSTBYNAME_LIBRARIES}" )
set_property( CACHE GLOBAL_LIBRARIES PROPERTY VALUE ${GLOBAL_LIBRARIES} ${FUNCTION_GETHOSTBYNAME_LIBRARIES} )
endif()
message( STATUS "Detecting networking library (socket/nsl/ws2_32) - done" )
endif()
#
# enable web server?
#
option( ENABLE_WEB_SERVER "Build web-server (default=ON)" ON )
#
# Test for big endian
#
TEST_BIG_ENDIAN( BIG_ENDIAN )
if( NOT DEFINED BIG_ENDIAN )
message( WARNING "unable to determine endianness, only LITTLE ENDIAN is supported" )
elseif( BIG_ENDIAN )
message( FATAL_ERROR "bigendian is not supported" )
endif()
#
# Test monotonic clock
#
# CLOCK_MONOTONIC clock for clock_gettime
# Normally defines _POSIX_TIMERS > 0 and _POSIX_MONOTONIC_CLOCK (for posix
# compliant systems) and __FreeBSD_cc_version >= 500005 (for FreeBSD
# >= 5.1.0, which does not have the posix defines (ref. r11983)) would be
# checked but some systems define them even when they do not support it
# (ref. bugreport:1003).
#
message( STATUS "Check for monotonic clock" )
find_library( RT_LIBRARY rt )# (optional, rt on Debian)
mark_as_advanced( RT_LIBRARY )
set( CMAKE_REQUIRED_LIBRARIES ${GLOBAL_LIBRARIES} ${RT_LIBRARY} )
file( READ "${CMAKE_SOURCE_DIR}/3rdparty/cmake/tests/HAVE_MONOTONIC_CLOCK.c" _SOURCE )
CHECK_C_SOURCE_RUNS( "${_SOURCE}" HAVE_MONOTONIC_CLOCK )
if( HAVE_MONOTONIC_CLOCK )
message( STATUS "Check for monotonic clock - yes" )
set_property( CACHE GLOBAL_LIBRARIES PROPERTY VALUE ${GLOBAL_LIBRARIES} ${RT_LIBRARY} )
set_property( CACHE GLOBAL_DEFINITIONS PROPERTY VALUE "${GLOBAL_DEFINITIONS} -DHAVE_MONOTONIC_CLOCK" )
else()
message( STATUS "Check for monotonic clock - no" )
endif()
#
# Test if function exists:
# setrlimit - used to set the socket limit
# strnlen - string length with upper scan bound
# getpid - process id
# gettid - thread id
#
CHECK_FUNCTION_EXISTS( setrlimit HAVE_SETRLIMIT )
CHECK_FUNCTION_EXISTS( strnlen HAVE_STRNLEN )
CHECK_FUNCTION_EXISTS( getpid HAVE_GETPID )
CHECK_FUNCTION_EXISTS( gettid HAVE_GETTID )
foreach( define HAVE_SETRLIMIT HAVE_STRNLEN HAVE_GETPID HAVE_GETTID )
if( ${define} )
set_property( CACHE GLOBAL_DEFINITIONS PROPERTY VALUE "${GLOBAL_DEFINITIONS} -D${define}" )
endif()
endforeach()
#
# Use RDTSC instruction as a timing source (time stamp counter on x86 since Pentium) (default=OFF)
#
# Enable it when you've timing issues. (ex: in conjunction with XEN or Other Virtualization mechanisms)
# Please ensure that you've disabled dynamic CPU-Frequencys, such as power saving options.
# (On the most modern Dedicated Servers cpufreq is preconfigured, see your distribution's manual how to disable it)
#
option( ENABLE_RDTSC "use RDTSC instruction as a timing source (default=OFF)" OFF )
if( ENABLE_RDTSC )
set_property( CACHE GLOBAL_DEFINITIONS PROPERTY VALUE "${GLOBAL_DEFINITIONS} -DENABLE_RDTSC" )
message( STATUS "Enabled RDTSC as a timing source" )
endif()
#
# Enable extra debug code (default=OFF)
#
option( ENABLE_EXTRA_DEBUG_CODE "enable extra debug code (default=OFF)" OFF )
if( ENABLE_EXTRA_DEBUG_CODE )
set_property( CACHE GLOBAL_DEFINITIONS PROPERTY VALUE "${GLOBAL_DEFINITIONS} -DDEBUG" )
message( STATUS "Enabled extra DEBUG code" )
endif()
#
# Enable EPOLL (default=OFF)
# Only for Linux
#
option( ENABLE_EXTRA_SOCKET_POLL "enable SOCKET_EPOLL (default=OFF)" OFF )
if( ENABLE_EXTRA_SOCKET_POLL )
set_property( CACHE GLOBAL_DEFINITIONS PROPERTY VALUE "${GLOBAL_DEFINITIONS} -DSOCKET_EPOLL" )
message( STATUS "Enabled SOCKET_EPOLL" )
endif()
#
# Enable builtin memory manager (default=default)
#
set( MEMMGR_OPTIONS "default;yes;no" )
set( ENABLE_MEMMGR "default" CACHE STRING "enable builtin memory manager: ${MEMMGR_OPTIONS} (default=default)" )
set_property( CACHE ENABLE_MEMMGR PROPERTY STRINGS ${MEMMGR_OPTIONS} )
if( ENABLE_MEMMGR STREQUAL "default" )
# use source code default
elseif( ENABLE_MEMMGR STREQUAL "yes" )
set_property( CACHE GLOBAL_DEFINITIONS PROPERTY VALUE "${GLOBAL_DEFINITIONS} -DUSE_MEMMGR" )
message( STATUS "Enabled the builtin memory manager" )
elseif( ENABLE_MEMMGR STREQUAL "no" )
set_property( CACHE GLOBAL_DEFINITIONS PROPERTY VALUE "${GLOBAL_DEFINITIONS} -DNO_MEMMGR" )
message( STATUS "Disabled the builtin memory manager" )
else()
message( FATAL_ERROR "invalid option ENABLE_MEMMGR=${ENABLE_MEMMGR} (valid options: ${MEMMGR_OPTIONS})" )
endif()
#
# Enable memory library (default=system)
#
set( MEMORY_OPTIONS "system;memwatch;dmalloc;gcollect" )
set( ENABLE_MEMORY "system" CACHE STRING "enable memory library: ${MEMORY_OPTIONS} (default=system)" )
set_property( CACHE ENABLE_MEMORY PROPERTY STRINGS ${MEMORY_OPTIONS} )
if( ENABLE_MEMORY STREQUAL "system" )
# use system functions
elseif( ENABLE_MEMORY STREQUAL "memwatch" )
CHECK_INCLUDE_FILE( memwatch.h HAVE_MEMWATCH_H )
find_library( MEMWATCH_LIBRARY memwatch )
mark_as_advanced( MEMWATCH_LIBRARY )
if( HAVE_MEMWATCH_H AND MEMWATCH_LIBRARY )
message( STATUS "Adding global library: ${MEMWATCH_LIBRARY}" )
set_property( CACHE GLOBAL_LIBRARIES PROPERTY VALUE ${GLOBAL_LIBRARIES} ${MEMWATCH_LIBRARY} )
set_property( CACHE GLOBAL_DEFINITIONS PROPERTY VALUE "${GLOBAL_DEFINITIONS} -DMEMWATCH" )
message( STATUS "Enabled the memory library memwatch" )
else()
message( FATAL_ERROR "Failed to enable the memory library memwatch" )
endif()
elseif( ENABLE_MEMORY STREQUAL "dmalloc" )
CHECK_INCLUDE_FILE( dmalloc.h HAVE_DMALLOC_H )
find_library( DMALLOC_LIBRARY dmalloc )
mark_as_advanced( DMALLOC_LIBRARY )
if( HAVE_DMALLOC_H AND DMALLOC_LIBRARY )
message( STATUS "Adding global library: ${DMALLOC_LIBRARY}" )
set_property( CACHE GLOBAL_LIBRARIES PROPERTY VALUE ${GLOBAL_LIBRARIES} ${DMALLOC_LIBRARY} )
set_property( CACHE GLOBAL_DEFINITIONS PROPERTY VALUE "${GLOBAL_DEFINITIONS} -DDMALLOC -DDMALLOC_FUNC_CHECK" )
message( STATUS "Enabled the memory library dmalloc" )
else()
message( FATAL_ERROR "Failed to enable the memory library dmalloc" )
endif()
elseif( ENABLE_MEMORY STREQUAL "gcollect" )
CHECK_INCLUDE_FILE( gc.h HAVE_GC_H )
find_library( GC_LIBRARY gc )
mark_as_advanced( GC_LIBRARY )
if( HAVE_GC_H AND GC_LIBRARY )
message( STATUS "Adding global library: ${GC_LIBRARY}" )
set_property( CACHE GLOBAL_LIBRARIES PROPERTY VALUE ${GLOBAL_LIBRARIES} ${GC_LIBRARY} )
set_property( CACHE GLOBAL_DEFINITIONS PROPERTY VALUE "${GLOBAL_DEFINITIONS} -DGCOLLECT" )
message( STATUS "Enabled the memory library gcollect" )
else()
message( FATAL_ERROR "Failed to enable the memory library gcollect" )
endif()
else()
message( FATAL_ERROR "invalid option ENABLE_MEMORY=${ENABLE_MEMORY} (valid options: ${MEMORY_OPTIONS})" )
endif()
#
# Enable profiler (default=none)
#
set( PROFILER_OPTIONS "none;gprof" )
set( ENABLE_PROFILER "none" CACHE STRING "enable profiler: ${PROFILER_OPTIONS} (default=none)" )
set_property( CACHE ENABLE_PROFILER PROPERTY STRINGS ${PROFILER_OPTIONS} )
if( ENABLE_PROFILER STREQUAL "none" )
# no profiler
elseif( ENABLE_PROFILER STREQUAL "gprof" )
if( CMAKE_C_COMPILER_ID STREQUAL "GNU" )
if( NOT HAVE_GPROF_FLAGS )
set_property( CACHE CMAKE_C_FLAGS PROPERTY VALUE "${CMAKE_C_FLAGS} -pg" )
set_property( CACHE CMAKE_EXE_LINKER_FLAGS PROPERTY VALUE "${CMAKE_EXE_LINKER_FLAGS} -pg" )
set( HAVE_GPROF_FLAGS ON CACHE INTERNAL "" )
endif()
message( STATUS "Enabled the profiler gprof" )
else()
message( FATAL_ERROR "Failed to enable the profiler gprof - not GNU" )
endif()
else()
message( FATAL_ERROR "invalid option ENABLE_PROFILER=${ENABLE_PROFILER} (valid options: ${PROFILER_OPTIONS})" )
endif()
#
# Enable extra buildbot code (default=OFF)
#
option( ENABLE_EXTRA_BUILDBOT_CODE "enable extra buildbot code (default=OFF)" OFF )
if( ENABLE_EXTRA_BUILDBOT_CODE )
set_property( CACHE GLOBAL_DEFINITIONS PROPERTY VALUE "${GLOBAL_DEFINITIONS} -DBUILDBOT" )
message( STATUS "Enabled extra BUILDBOT code" )
endif()
#####################################################################
# package stuff
#
set( CPACK_PACKAGE_NAME "rAthena" )
set( CPACK_PACKAGE_DESCRIPTION_SUMMARY "MMORPG server package" )
set( CPACK_PACKAGE_VERSION ${SVNVERSION} )
set( CPACK_RESOURCE_FILE_LICENSE ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE )
#set( CPACK_MONOLITHIC_INSTALL ON )
include( CPACK OPTIONAL RESULT_VARIABLE HAVE_CPACK )
if( HAVE_CPACK )
option( WITH_CPACK "enable building packages with CPack ('package' target)" ON )
endif()
if( NOT WITH_CPACK )
# empty replacements
macro( cpack_add_component_group )
endmacro()
macro( cpack_add_component )
endmacro()
message( STATUS "Disabled package creation" )
endif()
set( Runtime "Runtime files" CACHE INTERNAL "" )
set( Runtime_base "configurations, dbs, npcs, docs, ..." CACHE INTERNAL "" )
set( Runtime_templates "conf/import and save (generated from conf/import-tmpl and save-tmpl)" CACHE INTERNAL "" )
cpack_add_component_group( Runtime DESCRIPTION ${Runtime} DISPLAY_NAME "Runtime" )
cpack_add_component( Runtime_base DESCRIPTION ${Runtime_base} DISPLAY_NAME "Base files" GROUP Runtime )
cpack_add_component( Runtime_templates DESCRIPTION ${Runtime_templates} DISPLAY_NAME "Base templates" GROUP Runtime )
set( Development "Development files" CACHE INTERNAL "" )
set( Development_base "projects, 3rdparty, sources, templates" CACHE INTERNAL "" )
cpack_add_component_group( Development DESCRIPTION ${Development} DISPLAY_NAME "Development" )
cpack_add_component( Development_base DESCRIPTION ${Development_base} DISPLAY_NAME "Base files" GROUP Development )
#
# install stuff
#
option( INSTALL_COMPONENT_RUNTIME "install/package files needed to run the project" ON )
option( INSTALL_COMPONENT_DEVELOPMENT "install/package files needed to build the project" OFF )
option( INSTALL_TO_PATH "copy files to INSTALL_PATH" OFF )
option( INSTALL_TO_SOURCE "copy files to source directory, skips what is already there (${CMAKE_CURRENT_SOURCE_DIR})" OFF )
option( INSTALL_TO_SUBDIR "copy files to subdirectory (${CMAKE_CURRENT_BINARY_DIR}/install)" OFF )
set( INSTALL_PATH "${CMAKE_INSTALL_PREFIX}" CACHE STRING "install path (only used when INSTALL_TO_PATH is set)" )
mark_as_advanced( CMAKE_INSTALL_PREFIX )
if( INSTALL_TO_PATH AND NOT ("${INSTALL_TO}" STREQUAL "path") )# changed to path
set_property( CACHE INSTALL_TO_SOURCE INSTALL_TO_SUBDIR PROPERTY VALUE OFF )
elseif( INSTALL_TO_SOURCE AND NOT ("${INSTALL_TO}" STREQUAL "source") )# changed to source
set_property( CACHE INSTALL_TO_PATH INSTALL_TO_SUBDIR PROPERTY VALUE OFF )
elseif( INSTALL_TO_SUBDIR AND NOT ("${INSTALL_TO}" STREQUAL "subdir") )# changed to subdir
set_property( CACHE INSTALL_TO_PATH INSTALL_TO_SOURCE PROPERTY VALUE OFF )
elseif( NOT INSTALL_TO_PATH AND NOT INSTALL_TO_SOURCE AND NOT INSTALL_TO_SUBDIR )# default
set_property( CACHE INSTALL_TO_SUBDIR PROPERTY VALUE ON )
endif()
if( INSTALL_TO_PATH )
set( INSTALL_TO "path" CACHE INTERNAL "" )
set_property( CACHE CMAKE_INSTALL_PREFIX PROPERTY VALUE "${INSTALL_PATH}" )
elseif( INSTALL_TO_SOURCE )
set( INSTALL_TO "source" CACHE INTERNAL "" )
set_property( CACHE CMAKE_INSTALL_PREFIX PROPERTY VALUE "${CMAKE_CURRENT_SOURCE_DIR}" )
elseif( INSTALL_TO_SUBDIR )
set( INSTALL_TO "subdir" CACHE INTERNAL "" )
set_property( CACHE CMAKE_INSTALL_PREFIX PROPERTY VALUE "${CMAKE_CURRENT_BINARY_DIR}/install" )
endif()
set( SVN_FOLDER_PATTERN "[\\.]svn" CACHE STRING "pattern of svn folder that we exclude from instalations" )
mark_as_advanced( SVN_FOLDER_PATTERN )
set( DEVELOPMENT_FILES
"${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt"
"${CMAKE_CURRENT_SOURCE_DIR}/configure"
"${CMAKE_CURRENT_SOURCE_DIR}/configure.in"
"${CMAKE_CURRENT_SOURCE_DIR}/rAthena.sln"
)
set( DEVELOPMENT_DIRECTORIES
"3rdparty"
"conf/import-tmpl"
"conf/msg_conf/import-tmpl"
"db/import-tmpl"
"src"
)
set( RUNTIME_FILES
"${CMAKE_CURRENT_SOURCE_DIR}/athena-start"
"${CMAKE_CURRENT_SOURCE_DIR}/LICENSE"
"${CMAKE_CURRENT_SOURCE_DIR}/README.md"
)
if (WIN32)
set (RUNTIME_FILES
${RUNTIME_FILES}
"${CMAKE_CURRENT_SOURCE_DIR}/dbghelp.dll"
"${CMAKE_CURRENT_SOURCE_DIR}/libmysql.dll"
"${CMAKE_CURRENT_SOURCE_DIR}/pcre3.dll"
"${CMAKE_CURRENT_SOURCE_DIR}/zlib1.dll"
"${CMAKE_CURRENT_SOURCE_DIR}/tools/charserv.bat"
"${CMAKE_CURRENT_SOURCE_DIR}/tools/logserv.bat"
"${CMAKE_CURRENT_SOURCE_DIR}/tools/mapserv.bat"
"${CMAKE_CURRENT_SOURCE_DIR}/tools/runserver.bat"
"${CMAKE_CURRENT_SOURCE_DIR}/tools/serv.bat"
)
endif(WIN32)
set( RUNTIME_DIRECTORIES
"conf"
"db"
"doc"
"log"
"npc"
"sql-files"
"tools"
)
if( INSTALL_TO_SOURCE )# skip, already in the source dir
else()
if( INSTALL_COMPONENT_RUNTIME )
install( FILES ${RUNTIME_FILES}
DESTINATION "."
COMPONENT Runtime_base )
foreach( DIR IN ITEMS ${RUNTIME_DIRECTORIES} )
if( EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${DIR}/" )
install( DIRECTORY "${DIR}/"
DESTINATION "${DIR}"
COMPONENT Runtime_base
PATTERN ${SVN_FOLDER_PATTERN} EXCLUDE
PATTERN "conf/import-tmpl" EXCLUDE )
else()
# create empty directory
install( CODE "file(MAKE_DIRECTORY \"\${ENV}\${CMAKE_INSTALL_PREFIX}/${DIR}\")"
COMPONENT Runtime_base )
endif()
endforeach()
endif( INSTALL_COMPONENT_RUNTIME )
if( INSTALL_COMPONENT_DEVELOPMENT )
install( FILES ${DEVELOPMENT_FILES}
DESTINATION "."
COMPONENT Development_base )
foreach( DIR IN ITEMS ${DEVELOPMENT_DIRECTORIES} )
install( DIRECTORY "${DIR}/"
DESTINATION "${DIR}"
COMPONENT Development_base
PATTERN ${SVN_FOLDER_PATTERN} EXCLUDE )
endforeach()
endif( INSTALL_COMPONENT_DEVELOPMENT )
endif()
if( INSTALL_COMPONENT_RUNTIME )
# templates
set( _TEMPLATES
"conf/import-tmpl" "conf/import"
"conf/msg_conf/import-tmpl" "conf/msg_conf/import"
"db/import-tmpl" "db/import"
)
set( INSTALL_TEMPLATES_FILE "${CMAKE_CURRENT_BINARY_DIR}/InstallTemplates.cmake" )
file( WRITE "${INSTALL_TEMPLATES_FILE}"
"macro( INSTALL_TEMPLATE _SRC _DST )\n"
" set( SRC \"${CMAKE_CURRENT_SOURCE_DIR}/\${_SRC}\" )\n"
" set( DST \"\${CMAKE_INSTALL_PREFIX}/\${_DST}\" )\n"
" if( EXISTS \"\${DST}\" )\n"
" message( \"-- Already exists: \${DST}\" )\n"
" else()\n"
" message( \"-- Installing template: \${DST}\" )\n"
" execute_process( COMMAND \"${CMAKE_COMMAND}\" -E copy \"\${SRC}\" \"\${DST}\" )\n"
" endif()\n"
"endmacro()\n"
)
while( _TEMPLATES )
list( GET _TEMPLATES 0 _SRC )
list( GET _TEMPLATES 1 _DST )
list( REMOVE_AT _TEMPLATES 0 1 )
if( IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${_SRC}" )
file( GLOB _PATHS "${CMAKE_CURRENT_SOURCE_DIR}/${_SRC}/*" )
foreach( _PATH IN ITEMS ${_PATHS} )
string( REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/${_SRC}/" "" _PATH "${_PATH}" )
if( NOT "${_PATH}" MATCHES "${SVN_FOLDER_PATTERN}" )
list( APPEND _TEMPLATES "${_SRC}/${_PATH}" "${_DST}/${_PATH}" )
endif()
endforeach()
else()
file( APPEND "${INSTALL_TEMPLATES_FILE}" "INSTALL_TEMPLATE( \"${_SRC}\" \"${_DST}\" )\n" )
endif()
endwhile()
install( SCRIPT "${INSTALL_TEMPLATES_FILE}"
COMPONENT Runtime_templates )
endif( INSTALL_COMPONENT_RUNTIME )
#
# sources
#
set( TARGET_LIST CACHE INTERNAL "" )
add_subdirectory( 3rdparty )
add_subdirectory( src )
#####################################################################
# final checks and warnings
#
list( LENGTH TARGET_LIST _LEN )
if( _LEN EQUAL 0 )
message( FATAL_ERROR "no targets available" )
endif()
message( STATUS "Available targets:" )
foreach( _TARGET IN ITEMS ${TARGET_LIST} )
message( STATUS "\t${_TARGET}" )
endforeach()
add_custom_target(server
DEPENDS login-server char-server map-server web-server scripts
)

View File

@@ -224,4 +224,5 @@ case $1 in
;;
esac
echo "Using the configure scripts and ./athena-start is deprecated. Use CMake and ./athena-start.sh" 1>&2
exit 1

35
conf/CMakeLists.txt Normal file
View File

@@ -0,0 +1,35 @@
include(CopyImportFiles)
set(CONF_FILES_TO_IMPORT
"atcommands.yml"
"battle_conf.txt"
"char_conf.txt"
"groups.yml"
"inter_conf.txt"
"inter_server.yml"
"log_conf.txt"
"login_conf.txt"
"map_conf.txt"
"packet_conf.txt"
"script_conf.txt"
"web_conf.txt")
copy_import_files(${CMAKE_CURRENT_SOURCE_DIR}/import-tmpl/
${CMAKE_CURRENT_SOURCE_DIR}/import
"${CONF_FILES_TO_IMPORT}")
set(MSG_FILES_TO_IMPORT
"map_msg_chn_conf.txt"
"map_msg_eng_conf.txt"
"map_msg_frn_conf.txt"
"map_msg_grm_conf.txt"
"map_msg_idn_conf.txt"
"map_msg_mal_conf.txt"
"map_msg_por_conf.txt"
"map_msg_rus_conf.txt"
"map_msg_spn_conf.txt"
"map_msg_tha_conf.txt")
copy_import_files(${CMAKE_CURRENT_SOURCE_DIR}/msg_conf/import-tmpl/
${CMAKE_CURRENT_SOURCE_DIR}/msg_conf/import
"${MSG_FILES_TO_IMPORT}")

View File

@@ -12,10 +12,8 @@
// The highest value at which an item can be sold via the merchant vend skill. (in zeny)
vending_max_value: 1000000000
// Whether to allow placing items on a vending store when the player's zeny plus the total price
// of the items exceeds the maximum zeny allowed. (Note 1)
// If set to "yes", the items will be placed in the store but other players will not be able to buy them.
// Official behavior is "yes", but on some official servers the client doesn't allow this.
// Whether to allow buying from vending chars that are at their max. zeny limit.
// If set to yes, the rest of the zeny above the char's capacity will disappear.
vending_over_max: yes
// Tax to apply to all vending transactions (eg: 10000 = 100%, 50 = 0.50%)

72
db/CMakeLists.txt Normal file
View File

@@ -0,0 +1,72 @@
include(CopyImportFiles)
# Why do we list all the files instead of using glob?
# This way, if we add a new file, the build system will know to regenerate
# and the new file will be copied over.
set(DB_FILES_TO_IMPORT
"abra_db.yml"
"achievement_db.yml"
"achievement_level_db.yml"
"attendance.yml"
"attr_fix.yml"
"battleground_db.yml"
"captcha_db.yml"
"castle_db.yml"
"const.yml"
"create_arrow_db.yml"
"elemental_db.yml"
"enchantgrade.yml"
"exp_guild.yml"
"exp_homun.yml"
"guild_skill_tree.yml"
"homunculus_db.yml"
"instance_db.yml"
"item_cash.yml"
"item_combos.yml"
"item_db.yml"
"item_enchant.yml"
"item_group_db.yml"
"item_noequip.txt"
"item_packages.yml"
"item_randomopt_db.yml"
"item_randomopt_group.yml"
"item_reform.yml"
"job_noenter_map.txt"
"job_stats.yml"
"laphine_synthesis.yml"
"laphine_upgrade.yml"
"level_penalty.yml"
"magicmushroom_db.yml"
"map_cache.dat"
"map_drops.yml"
"map_index.txt"
"mercenary_db.yml"
"mob_avail.yml"
"mob_chat_db.yml"
"mob_db.yml"
"mob_item_ratio.yml"
"mob_skill_db.txt"
"mob_summon.yml"
"pet_db.yml"
"produce_db.txt"
"quest_db.yml"
"refine.yml"
"reputation_group.yml"
"reputation.yml"
"size_fix.yml"
"skill_changematerial_db.txt"
"skill_damage_db.txt"
"skill_db.yml"
"skill_nocast_db.txt"
"skill_tree.yml"
"spellbook_db.yml"
"statpoint.yml"
"status_disabled.txt"
"status.yml"
"stylist.yml"
)
copy_import_files(${CMAKE_CURRENT_SOURCE_DIR}/import-tmpl/
${CMAKE_CURRENT_SOURCE_DIR}/import
"${DB_FILES_TO_IMPORT}")

View File

@@ -33,24 +33,3 @@ Header:
Type: MOB_SUMMONABLE_DB
Version: 1
#Body:
# Pre-re Brasilis
#=============================================================
# - Group: BLOODY_DEAD_BRANCH
# Summon:
# - Mob: BOITATA
# Rate: 1000000
# - Group: Branch_Of_Dead_Tree
# Summon:
# - Mob: IARA
# Rate: 71428
# - Mob: PIRANHA
# Rate: 71428
# - Mob: HEADLESS_MULE
# Rate: 71428
# - Mob: JAGUAR
# Rate: 71428
# - Mob: TOUCAN
# Rate: 71428
# - Mob: CURUPIRA
# Rate: 71428

View File

@@ -866,14 +866,3 @@ Body:
bonus2 bSubEle,Ele_Fire,2;
bonus2 bAddEle,Ele_Fire,2;
}
- Mob: E_HYDRA
TameItem: Leaf_Cat_Ball
EggItem: Mystic_Leaf_Cat_Ball
Fullness: 0
HungryDelay: 0
IntimacyStart: 0
IntimacyFed: 0
IntimacyOverfed: 0
IntimacyOwnerDie: 0
CaptureRate: 50
SpecialPerformance: false

View File

@@ -205,137 +205,3 @@ Body:
- Index: 7
Item: S_Turtle_Is_Box_IL
Rate: 150
- Map: prt_mz03_i
SpecificDrops:
- Monster: ILL_BAPHOMET
Drops:
- Index: 0
Item: Bazerald_IL
Rate: 5000
RandomOptionGroup: ILL_MAGIC_BOSS
- Index: 1
Item: Butcher_IL
Rate: 5000
RandomOptionGroup: ILL_PHYSIC_BOSS
- Index: 2
Item: Gold_Lux_IL
Rate: 5000
RandomOptionGroup: ILL_PHYSIC_BOSS
- Index: 3
Item: Morpheus_Armlet_IL
Rate: 5000
- Index: 4
Item: Morpheus_Hood_IL
Rate: 5000
- Index: 5
Item: Morpheus_Ring_IL
Rate: 5000
- Index: 6
Item: Morpheus_Shawl_IL
Rate: 5000
- Index: 7
Item: IllusionStone
Rate: 15000
- Index: 8
Item: Taegoolyeon_IL
Rate: 5000
RandomOptionGroup: ILL_PHYSIC_BOSS
- Index: 9
Item: S_Teddy_Labyrinth_IL
Rate: 150
- Monster: ILL_BAPHOMET_J
Drops:
- Index: 0
Item: Gold_Lux_IL
Rate: 25
RandomOptionGroup: ILL_PHYSIC_NORMAL
- Index: 1
Item: IllusionStone
Rate: 10
- Index: 2
Item: Labyrinth_Box_IL
Rate: 5
- Monster: ILL_SIDE_WINDER
Drops:
- Index: 0
Item: Bazerald_IL
Rate: 25
RandomOptionGroup: ILL_MAGIC_NORMAL
- Index: 1
Item: IllusionStone
Rate: 10
- Index: 2
Item: Labyrinth_Box_IL
Rate: 5
- Monster: ILL_HUNTER_FLY
Drops:
- Index: 0
Item: IllusionStone
Rate: 10
- Index: 1
Item: Taegoolyeon_IL
Rate: 25
RandomOptionGroup: ILL_PHYSIC_NORMAL
- Index: 2
Item: Labyrinth_Box_IL
Rate: 5
- Monster: ILL_MANTIS
Drops:
- Index: 0
Item: Butcher_IL
Rate: 25
RandomOptionGroup: ILL_PHYSIC_NORMAL
- Index: 1
Item: IllusionStone
Rate: 10
- Index: 2
Item: Labyrinth_Box_IL
Rate: 5
- Monster: ILL_GHOSTRING
Drops:
- Index: 0
Item: IllusionStone
Rate: 10
- Index: 1
Item: Taegoolyeon_IL
Rate: 25
RandomOptionGroup: ILL_PHYSIC_NORMAL
- Index: 2
Item: Labyrinth_Box_IL
Rate: 5
- Monster: ILL_KILLER_MANTIS
Drops:
- Index: 0
Item: Butcher_IL
Rate: 25
RandomOptionGroup: ILL_PHYSIC_NORMAL
- Index: 1
Item: IllusionStone
Rate: 10
- Index: 2
Item: Labyrinth_Box_IL
Rate: 5
- Monster: ILL_POPORING
Drops:
- Index: 0
Item: Bazerald_IL
Rate: 25
RandomOptionGroup: ILL_MAGIC_NORMAL
- Index: 1
Item: IllusionStone
Rate: 10
- Index: 2
Item: Labyrinth_Box_IL
Rate: 5
- Monster: ILL_STEM_WORM
Drops:
- Index: 0
Item: Gold_Lux_IL
Rate: 25
RandomOptionGroup: ILL_PHYSIC_NORMAL
- Index: 1
Item: IllusionStone
Rate: 10
- Index: 2
Item: Labyrinth_Box_IL
Rate: 5

View File

@@ -99586,625 +99586,34 @@ Body:
# AegisName: E_MD_LUDE
# - Id: 20519
# AegisName: E_MD_JACK_GAINT
- Id: 20520
AegisName: ILL_BAPHOMET
Name: Chaos Baphomet
Level: 178
Hp: 21278744
BaseExp: 4255749
JobExp: 2979024
#MvpExp:
Attack: 6141
Attack2: 3168
Defense: 343
MagicDefense: 122
Str: 276
Agi: 188
Vit: 55
Int: 267
Dex: 244
Luk: 99
AttackRange: 2
SkillRange: 10
ChaseRange: 12
Size: Large
Race: Demon
Element: Dark
ElementLevel: 3
WalkSpeed: 100
AttackDelay: 768
AttackMotion: 576
DamageMotion: 768
Ai: 21
Class: Boss
MvpDrops:
- Item: Old_Violet_Box
Rate: 3000
- Item: Old_Card_Album
Rate: 4000
- Item: Magic_Card_Album
Rate: 5000
Drops:
- Item: Bapho_Doll
Rate: 1000
- Item: Crescent_Scythe
Rate: 150
- Item: Essence_Of_Demon
Rate: 5000
- Item: Tae_Goo_Lyeon
Rate: 100
- Item: Evil_Horn
Rate: 3500
- Item: Bazerald
Rate: 200
- Item: Apple
Rate: 1
- Item: Chaos_Baphomet_Card
Rate: 1
StealProtected: true
- Id: 20521
AegisName: ILL_ANDREA
Name: Chaotic Andrea
Level: 177
Hp: 1057547
BaseExp: 96141
JobExp: 67298
Attack: 4248
Attack2: 1337
Defense: 330
MagicDefense: 110
Str: 192
Agi: 122
Vit: 51
Int: 175
Dex: 188
Luk: 68
AttackRange: 2
SkillRange: 10
ChaseRange: 12
Size: Medium
Race: Demihuman
Element: Neutral
ElementLevel: 3
WalkSpeed: 130
AttackDelay: 576
AttackMotion: 432
DamageMotion: 288
Ai: 04
Drops:
- Item: Brigan
Rate: 5000
- Item: Fragment_Of_Crystal
Rate: 2500
- Item: Morpheus's_Ring
Rate: 100
- Item: Yggdrasilberry
Rate: 50
- Item: Seed_Of_Yggdrasil
Rate: 50
- Item: Chaos_Acolyte_Card
Rate: 1
StealProtected: true
- Id: 20522
AegisName: ILL_ANES
Name: Chaotic Anes
Level: 177
Hp: 1057444
BaseExp: 96131
JobExp: 67292
Attack: 4314
Attack2: 1369
Defense: 327
MagicDefense: 110
Str: 195
Agi: 122
Vit: 50
Int: 174
Dex: 178
Luk: 61
AttackRange: 2
SkillRange: 10
ChaseRange: 12
Size: Medium
Race: Demihuman
Element: Neutral
ElementLevel: 3
WalkSpeed: 130
AttackDelay: 567
AttackMotion: 432
DamageMotion: 288
Ai: 04
Drops:
- Item: Brigan
Rate: 5000
- Item: Fragment_Of_Crystal
Rate: 3500
- Item: Morpheus's_Hood
Rate: 100
- Item: Seed_Of_Yggdrasil
Rate: 50
- Item: Yggdrasilberry
Rate: 50
- Item: Chaos_Acolyte_Card
Rate: 1
StealProtected: true
- Id: 20523
AegisName: ILL_SILVANO
Name: Chaotic Silvano
Level: 177
Hp: 1057650
BaseExp: 96150
JobExp: 67305
Attack: 4292
Attack2: 1385
Defense: 333
MagicDefense: 111
Str: 194
Agi: 122
Vit: 52
Int: 176
Dex: 184
Luk: 57
AttackRange: 2
SkillRange: 10
ChaseRange: 12
Size: Medium
Race: Demihuman
Element: Neutral
ElementLevel: 3
WalkSpeed: 130
AttackDelay: 576
AttackMotion: 432
DamageMotion: 288
Ai: 04
Drops:
- Item: Brigan
Rate: 5000
- Item: Fragment_Of_Crystal
Rate: 3500
- Item: Yggdrasilberry
Rate: 50
- Item: Seed_Of_Yggdrasil
Rate: 50
- Item: Morpheus's_Shawl
Rate: 100
- Item: Chaos_Acolyte_Card
Rate: 1
StealProtected: true
- Id: 20524
AegisName: ILL_CECILIA
Name: Chaotic Cecilia
Level: 177
Hp: 1056411
BaseExp: 96037
JobExp: 67226
Attack: 4359
Attack2: 1392
Defense: 297
MagicDefense: 111
Str: 197
Agi: 122
Vit: 40
Int: 177
Dex: 186
Luk: 61
AttackRange: 2
SkillRange: 10
ChaseRange: 12
Size: Medium
Race: Demihuman
Element: Neutral
ElementLevel: 3
WalkSpeed: 130
AttackDelay: 576
AttackMotion: 432
DamageMotion: 288
Ai: 04
Drops:
- Item: Brigan
Rate: 5000
- Item: Fragment_Of_Crystal
Rate: 3500
- Item: Yggdrasilberry
Rate: 50
- Item: Seed_Of_Yggdrasil
Rate: 50
- Item: Morpheus's_Armlet
Rate: 100
- Item: Chaos_Acolyte_Card
Rate: 1
StealProtected: true
- Id: 20525
AegisName: ILL_BAPHOMET_J
Name: Chaos Baphomet Jr.
Level: 177
Hp: 1057444
BaseExp: 173089
JobExp: 121125
Attack: 4093
Attack2: 847
Defense: 327
MagicDefense: 108
Str: 185
Agi: 101
Vit: 50
Int: 158
Dex: 178
Luk: 77
AttackRange: 1
SkillRange: 10
ChaseRange: 12
Size: Small
Race: Formless
Element: Dark
ElementLevel: 1
WalkSpeed: 100
AttackDelay: 868
AttackMotion: 480
DamageMotion: 120
Ai: 04
Drops:
- Item: Brigan
Rate: 2500
- Item: Evil_Horn
Rate: 1750
- Item: Yellow_Herb
Rate: 1750
- Item: Oridecon
Rate: 100
- Item: Short_Rope
Rate: 1250
- Item: Gold_Lux
Rate: 25
- Item: Chaos_Ba_Jr_Card
Rate: 1
StealProtected: true
- Id: 20526
AegisName: ILL_SIDE_WINDER
Name: Chaos Side Winder
Level: 176
Hp: 1051983
BaseExp: 172143
JobExp: 120499
Attack: 4026
Attack2: 832
Defense: 341
MagicDefense: 108
Str: 183
Agi: 94
Vit: 55
Int: 156
Dex: 177
Luk: 70
AttackRange: 1
SkillRange: 10
ChaseRange: 12
Size: Medium
Race: Brute
Element: Poison
ElementLevel: 1
WalkSpeed: 200
AttackDelay: 1576
AttackMotion: 576
DamageMotion: 576
Ai: 04
Drops:
- Item: Scale_Of_Snakes
Rate: 2500
- Item: Posionous_Canine
Rate: 1750
- Item: Karvodailnirol
Rate: 5
- Item: Tsurugi
Rate: 25
- Item: White_Herb
Rate: 700
- Item: Snake_Deadly_Poison
Rate: 1250
- Item: Chaos_S_Winder_Card
Rate: 1
StealProtected: true
- Id: 20527
AegisName: ILL_HUNTER_FLY
Name: Chaos Hunter Fly
Level: 175
Hp: 1045087
BaseExp: 171014
JobExp: 119710
Attack: 3916
Attack2: 817
Defense: 313
MagicDefense: 107
Str: 179
Agi: 115
Vit: 46
Int: 154
Dex: 189
Luk: 66
AttackRange: 1
SkillRange: 10
ChaseRange: 12
Size: Small
Race: Formless
Element: Wind
ElementLevel: 2
WalkSpeed: 150
AttackDelay: 676
AttackMotion: 576
DamageMotion: 480
Ai: 04
Drops:
- Item: Solid_Shell
Rate: 2500
- Item: Steel
Rate: 50
- Item: Zargon
Rate: 1750
- Item: Oridecon_Stone
Rate: 70
- Item: Delicious_Juice
Rate: 1250
- Item: Rough_Wind
Rate: 20
- Item: Chaos_H_Fly_Card
Rate: 1
StealProtected: true
- Id: 20528
AegisName: ILL_MANTIS
Name: Chaos Mantis
Level: 174
Hp: 1039216
BaseExp: 170053
JobExp: 119037
Attack: 3937
Attack2: 817
Defense: 315
MagicDefense: 71
Str: 181
Agi: 96
Vit: 47
Int: 155
Dex: 184
Luk: 67
AttackRange: 1
SkillRange: 10
ChaseRange: 12
Size: Medium
Race: Insect
Element: Earth
ElementLevel: 1
WalkSpeed: 200
AttackDelay: 1528
AttackMotion: 660
DamageMotion: 432
Ai: 04
Modes:
Detector: true
Drops:
- Item: Limb_Of_Mantis
Rate: 2250
- Item: Yellow_Live
Rate: 60
- Item: Solid_Shell
Rate: 1000
- Item: Mantis_Flower
Rate: 1250
- Item: Azure_Jewel
Rate: 10
- Item: Red_Herb
Rate: 500
- Item: Chaos_Mantis_Card
Rate: 1
StealProtected: true
- Id: 20529
AegisName: ILL_GHOSTRING
Name: Chaos Ghostring
Level: 173
Hp: 1033446
BaseExp: 169110
JobExp: 118377
Attack: 3979
Attack2: 834
Defense: 320
MagicDefense: 71
Str: 184
Agi: 87
Vit: 49
Int: 159
Dex: 182
Luk: 61
AttackRange: 1
SkillRange: 10
ChaseRange: 12
Size: Medium
Race: Demon
Element: Ghost
ElementLevel: 2
WalkSpeed: 300
AttackDelay: 1220
AttackMotion: 1080
DamageMotion: 648
Ai: 04
Modes:
Detector: true
Drops:
- Item: Transparent_Cloth
Rate: 2500
- Item: Soft_Silk_Cloth
Rate: 1750
- Item: Scell
Rate: 1000
- Item: Fragment_Of_Crystal
Rate: 1750
- Item: Soft_Scarf
Rate: 1250
- Item: Chaos_Goring_Card
Rate: 1
StealProtected: true
- Id: 20530
AegisName: ILL_KILLER_MANTIS
Name: Chaos Killer Mantis
Level: 177
Hp: 1058167
BaseExp: 173154
JobExp: 121280
Attack: 4027
Attack2: 842
Defense: 348
MagicDefense: 72
Str: 182
Agi: 105
Vit: 57
Int: 157
Dex: 194
Luk: 47
AttackRange: 1
SkillRange: 10
ChaseRange: 12
Size: Medium
Race: Insect
Element: Earth
ElementLevel: 1
WalkSpeed: 175
AttackDelay: 1528
AttackMotion: 660
DamageMotion: 432
Ai: 04
Modes:
Detector: true
Drops:
- Item: Limb_Of_Mantis
Rate: 2500
- Item: Solid_Shell
Rate: 1250
- Item: Yggdrasilberry
Rate: 15
- Item: Yellow_Live
Rate: 70
- Item: Butcher
Rate: 25
- Item: Purple_Solid_Shell
Rate: 1250
- Item: Chaos_K_Mantis_Card
Rate: 1
StealProtected: true
- Id: 20531
AegisName: ILL_POPORING
Name: Chaos Poporing
Level: 173
Hp: 1032638
BaseExp: 168976
JobExp: 118283
Attack: 3828
Attack2: 797
Defense: 296
MagicDefense: 70
Str: 177
Agi: 85
Vit: 41
Int: 152
Dex: 172
Luk: 29
AttackRange: 1
SkillRange: 10
ChaseRange: 12
Size: Medium
Race: Plant
Element: Poison
ElementLevel: 3
WalkSpeed: 300
AttackDelay: 1672
AttackMotion: 672
DamageMotion: 480
Ai: 02
Drops:
- Item: Sticky_Mucus
Rate: 2500
- Item: Green_Herb
Rate: 1000
- Item: Seed_Of_Yggdrasil
Rate: 20
- Item: Fragment_Of_Crystal
Rate: 1750
- Item: Brilliant_Jelly
Rate: 1250
- Item: Elunium
Rate: 50
- Item: Chaos_Poporing_Card
Rate: 1
StealProtected: true
- Id: 20532
AegisName: ILL_STEM_WORM
Name: Chaotic Stem Worm
Level: 172
Hp: 1027071
BaseExp: 168066
JobExp: 117646
Attack: 3917
Attack2: 804
Defense: 307
MagicDefense: 70
Str: 180
Agi: 95
Vit: 45
Int: 156
Dex: 187
Luk: 69
AttackRange: 1
SkillRange: 10
ChaseRange: 12
Size: Medium
Race: Plant
Element: Wind
ElementLevel: 1
WalkSpeed: 300
AttackDelay: 1956
AttackMotion: 756
DamageMotion: 528
Ai: 04
Drops:
- Item: Tough_Scalelike_Stem
Rate: 2500
- Item: White_Herb
Rate: 1000
- Item: Oridecon
Rate: 100
- Item: Great_Nature
Rate: 20
- Item: Suspicious_Sap
Rate: 1250
- Item: Seed_Of_Yggdrasil
Rate: 20
- Item: Chaos_Stem_W_Card
Rate: 1
StealProtected: true
- Id: 20533
AegisName: G_ILL_BAPHOMET_J
Name: Chaos Baphomet Jr.
Level: 177
Hp: 105744
Attack: 4093
Attack2: 847
Defense: 327
MagicDefense: 108
Str: 185
Agi: 101
Vit: 50
Int: 158
Dex: 178
Luk: 77
AttackRange: 1
SkillRange: 10
ChaseRange: 12
Size: Small
Race: Formless
Element: Dark
ElementLevel: 1
WalkSpeed: 100
AttackDelay: 868
AttackMotion: 481
DamageMotion: 120
Ai: 24
# - Id: 20520
# AegisName: ILL_BAPHOMET
# - Id: 20521
# AegisName: ILL_ANDREA
# - Id: 20522
# AegisName: ILL_ANES
# - Id: 20523
# AegisName: ILL_SILVANO
# - Id: 20524
# AegisName: ILL_CECILIA
# - Id: 20525
# AegisName: ILL_BAPHOMET_J
# - Id: 20526
# AegisName: ILL_SIDE_WINDER
# - Id: 20527
# AegisName: ILL_HUNTER_FLY
# - Id: 20528
# AegisName: ILL_MANTIS
# - Id: 20529
# AegisName: ILL_GHOSTRING
# - Id: 20530
# AegisName: ILL_KILLER_MANTIS
# - Id: 20531
# AegisName: ILL_POPORING
# - Id: 20532
# AegisName: ILL_STEM_WORM
# - Id: 20533
# AegisName: G_ILL_BAPHOMET_J
# - Id: 20534
# AegisName: G_REGINLEIF
# - Id: 20535

View File

@@ -14164,165 +14164,6 @@
20603,ABYSSMAN@NPC_COMBOATTACK,attack,171,2,2000,500,5000,no,target,always,0,,,,,,,
20603,ABYSSMAN@NPC_BLOODDRAIN,attack,199,1,500,0,5000,yes,target,always,0,,,,,,29,
// Illusion of Labyrinth
20520,ILL_BAPHOMET@NPC_DARKSTRIKE,chase,340,10,2000,0,1000,yes,target,always,0,,,,,,,
20520,ILL_BAPHOMET@AL_TELEPORT,idle,26,1,10000,0,0,yes,self,rudeattacked,0,,,,,,,
20520,ILL_BAPHOMET@AL_TELEPORT,walk,26,1,5000,0,5000,yes,self,rudeattacked,0,,,,,,,
20520,ILL_BAPHOMET@KN_BRANDISHSPEAR,attack,57,10,2000,500,5000,no,target,always,0,,,,,,29,
20520,ILL_BAPHOMET@NPC_EARTHQUAKE,chase,653,5,10000,1500,30000,no,self,myhpltmaxrate,80,,,,,,6,
20520,ILL_BAPHOMET@NPC_EARTHQUAKE,attack,653,5,10000,1500,30000,no,self,myhpltmaxrate,80,,,,,,6,
// 20520,ILL_BAPHOMET@NPC_EARTHQUAKE_K,chase,750,5,10000,1500,30000,no,self,myhpltmaxrate,80,,,,,,6,
// 20520,ILL_BAPHOMET@NPC_EARTHQUAKE_K,attack,750,5,10000,1500,30000,no,self,myhpltmaxrate,80,,,,,,6,
20520,ILL_BAPHOMET@NPC_POWERUP,attack,349,5,10000,0,30000,yes,self,myhpltmaxrate,30,,,,,,6,
20520,ILL_BAPHOMET@NPC_CALLSLAVE,attack,352,1,10000,0,30000,yes,self,always,0,,,,,,,
20520,ILL_BAPHOMET@NPC_CALLSLAVE,idle,352,1,10000,0,30000,yes,self,always,0,,,,,,,
20520,ILL_BAPHOMET@NPC_HELLJUDGEMENT2,chase,768,5,10000,800,10000,no,target,always,0,,,,,,6,
20520,ILL_BAPHOMET@NPC_HELLJUDGEMENT2,attack,768,5,10000,800,10000,no,target,always,0,,,,,,6,
20520,ILL_BAPHOMET@NPC_DARKBREATH,attack,202,5,2000,800,5000,no,target,always,0,,,,,,29,
20520,ILL_BAPHOMET@NPC_ARMORBRAKE,attack,344,10,2000,0,5000,no,target,always,0,,,,,,,
20520,ILL_BAPHOMET@NPC_GUIDEDATTACK,attack,172,5,500,0,20000,no,target,always,0,,,,,,,
20520,ILL_BAPHOMET@NPC_SUMMONSLAVE,attack,196,1,10000,700,10000,no,self,slavele,3,20533,,,,,,
20520,ILL_BAPHOMET@NPC_SUMMONSLAVE,idle,196,1,10000,700,10000,no,self,slavele,3,20533,,,,,,
20520,ILL_BAPHOMET@WZ_VERMILION,attack,85,21,2000,500,2000,no,target,always,0,,,,,,29,
20520,ILL_BAPHOMET@WZ_VERMILION,chase,85,21,5000,500,2000,no,target,skillused,18,,,,,,29,
20520,ILL_BAPHOMET@WZ_VERMILION,chase,85,21,2000,500,2000,no,target,always,0,,,,,,29,
20520,ILL_BAPHOMET@AL_HEAL,idle,28,11,10000,0,5000,yes,friend,myhpltmaxrate,50,,,,,,,
20520,ILL_BAPHOMET@NPC_CRITICALWOUND,attack,673,3,500,0,5000,yes,target,always,0,,,,,,,
20520,ILL_BAPHOMET@NPC_BLEEDING2,attack,764,3,500,0,5000,yes,target,always,0,,,,,,,
20520,ILL_BAPHOMET@NPC_GRADUAL_GRAVITY,attack,752,3,3000,0,5000,yes,target,myhpltmaxrate,20,,,,,,,
20520,ILL_BAPHOMET@NPC_DAMAGE_HEAL,attack,753,1,10000,1500,60000,no,target,myhpltmaxrate,10,,,,,,,
20521,ILL_ANDREA@AL_PNEUMA,idle,25,1,5000,0,10000,yes,target,longrangeattacked,0,,,,,,22,
20521,ILL_ANDREA@NPC_CHEAL,attack,729,5,5000,500,5000,no,self,friendhpltmaxrate,60,,,,,,3,
20521,ILL_ANDREA@AL_HEAL,attack,28,11,5000,500,5000,no,friend,myhpltmaxrate,30,,,,,,3,
20521,ILL_ANDREA@NPC_CHEAL,idle,729,5,10000,500,5000,yes,self,friendhpltmaxrate,60,,,,,,3,
20521,ILL_ANDREA@AL_HEAL,idle,28,11,10000,500,5000,yes,friend,myhpltmaxrate,30,,,,,,3,
20521,ILL_ANDREA@NPC_CHEAL,chase,729,5,10000,500,5000,no,self,friendhpltmaxrate,60,,,,,,3,
20521,ILL_ANDREA@AL_HEAL,chase,28,11,10000,500,5000,no,friend,myhpltmaxrate,30,,,,,,3,
20521,ILL_ANDREA@NPC_HOLYATTACK,attack,189,5,500,0,5000,yes,target,always,0,,,,,,,
20521,ILL_ANDREA@NPC_BLINDATTACK,attack,177,5,1000,700,5000,no,target,always,0,,,,,,,
20521,ILL_ANDREA@AL_DECAGI,attack,30,48,500,1000,5000,no,target,always,0,,,,,,29,
20521,ILL_ANDREA@CR_HOLYCROSS,attack,253,5,1000,0,5000,yes,target,always,0,,,,,,,
20521,ILL_ANDREA@AL_DECAGI,chase,30,1,2000,1000,20000,no,target,always,0,,,,,,29,
20521,ILL_ANDREA@AL_TELEPORT,idle,26,1,10000,0,0,yes,self,rudeattacked,0,,,,,,,
20521,ILL_ANDREA@AL_DECAGI,chase,30,48,2000,1000,20000,no,target,always,0,,,,,,29,
20521,ILL_ANDREA@SM_BASH,attack,5,10,500,0,5000,yes,target,always,0,,,,,,,
20522,ILL_ANES@AL_PNEUMA,idle,25,1,5000,0,10000,yes,target,longrangeattacked,0,,,,,,22,
20522,ILL_ANES@NPC_CHEAL,attack,729,5,10000,500,5000,no,self,friendhpltmaxrate,60,,,,,,3,
20522,ILL_ANES@AL_HEAL,attack,28,11,10000,500,5000,no,friend,myhpltmaxrate,30,,,,,,3,
20522,ILL_ANES@NPC_CHEAL,idle,729,5,10000,500,5000,yes,self,friendhpltmaxrate,60,,,,,,3,
20522,ILL_ANES@AL_HEAL,idle,28,11,10000,500,5000,yes,friend,myhpltmaxrate,30,,,,,,3,
20522,ILL_ANES@NPC_CHEAL,chase,729,5,10000,500,5000,no,self,friendhpltmaxrate,60,,,,,,3,
20522,ILL_ANES@AL_HEAL,chase,28,11,10000,500,5000,no,friend,myhpltmaxrate,30,,,,,,3,
20522,ILL_ANES@NPC_HOLYATTACK,attack,189,5,500,0,5000,yes,target,always,0,,,,,,,
20522,ILL_ANES@NPC_SILENCEATTACK,attack,178,5,1000,700,5000,no,target,always,0,,,,,,,
20522,ILL_ANES@AL_DECAGI,attack,30,48,500,1000,5000,no,target,always,0,,,,,,29,
20522,ILL_ANES@MG_SAFETYWALL,attack,12,10,500,1000,5000,no,target,always,0,,,,,,29,
20522,ILL_ANES@AL_DECAGI,chase,30,48,2000,1000,20000,no,target,always,0,,,,,,29,
20522,ILL_ANES@AL_TELEPORT,idle,26,1,10000,0,0,yes,self,rudeattacked,0,,,,,,,
20522,ILL_ANES@SM_BASH,attack,5,10,500,0,5000,yes,target,always,0,,,,,,29,
20523,ILL_SILVANO@AL_PNEUMA,idle,25,1,5000,0,10000,yes,target,longrangeattacked,0,,,,,,22,
20523,ILL_SILVANO@NPC_CHEAL,attack,729,5,10000,500,5000,no,self,friendhpltmaxrate,60,,,,,,3,
20523,ILL_SILVANO@AL_HEAL,attack,28,11,10000,500,5000,no,friend,myhpltmaxrate,30,,,,,,3,
20523,ILL_SILVANO@NPC_CHEAL,idle,729,5,10000,500,5000,yes,self,friendhpltmaxrate,60,,,,,,3,
20523,ILL_SILVANO@AL_HEAL,idle,28,11,10000,500,5000,yes,friend,myhpltmaxrate,30,,,,,,3,
20523,ILL_SILVANO@NPC_CHEAL,chase,729,5,10000,500,5000,no,self,friendhpltmaxrate,0,,,,,,3,
20523,ILL_SILVANO@AL_HEAL,chase,28,11,10000,500,5000,no,friend,myhpltmaxrate,30,,,,,,3,
20523,ILL_SILVANO@NPC_HOLYATTACK,attack,189,5,500,0,5000,yes,target,always,0,,,,,,,
20523,ILL_SILVANO@NPC_STUNATTACK,attack,179,5,1000,700,5000,no,target,always,0,,,,,,,
20523,ILL_SILVANO@CR_GRANDCROSS,attack,254,5,500,1000,5000,no,self,always,0,,,,,,,
20523,ILL_SILVANO@AL_DECAGI,attack,30,48,500,1000,5000,no,target,always,0,,,,,,29,
20523,ILL_SILVANO@AL_DECAGI,chase,30,48,2000,1000,20000,no,target,always,0,,,,,,29,
20523,ILL_SILVANO@AL_TELEPORT,idle,26,1,10000,0,0,yes,self,rudeattacked,0,,,,,,,
20523,ILL_SILVANO@SM_BASH,attack,5,10,500,0,5000,yes,target,always,0,,,,,,29,
20524,ILL_CECILIA@AL_PNEUMA,idle,25,1,5000,0,10000,yes,target,longrangeattacked,0,,,,,,22,
20524,ILL_CECILIA@NPC_CHEAL,attack,729,5,10000,500,5000,no,self,friendhpltmaxrate,60,,,,,,3,
20524,ILL_CECILIA@AL_HEAL,attack,28,11,10000,500,5000,no,friend,myhpltmaxrate,30,,,,,,3,
20524,ILL_CECILIA@NPC_CHEAL,idle,729,5,10000,500,5000,yes,self,friendhpltmaxrate,60,,,,,,3,
20524,ILL_CECILIA@AL_HEAL,idle,28,11,10000,500,5000,yes,friend,myhpltmaxrate,30,,,,,,3,
20524,ILL_CECILIA@NPC_CHEAL,chase,729,5,10000,500,5000,no,self,friendhpltmaxrate,60,,,,,,3,
20524,ILL_CECILIA@AL_HEAL,chase,28,11,10000,500,5000,no,friend,myhpltmaxrate,30,,,,,,3,
20524,ILL_CECILIA@NPC_HOLYATTACK,attack,189,5,500,0,5000,yes,target,always,0,,,,,,,
20524,ILL_CECILIA@NPC_CURSEATTACK,attack,181,5,1000,700,5000,no,target,always,0,,,,,,,
20524,ILL_CECILIA@NPC_LEX_AETERNA,attack,727,3,1000,0,5000,yes,target,always,0,,,,,,,
20524,ILL_CECILIA@AL_DECAGI,attack,30,48,500,1000,5000,no,target,always,0,,,,,,29,
20524,ILL_CECILIA@AL_DECAGI,chase,30,48,2000,1000,20000,no,target,always,0,,,,,,29,
20524,ILL_CECILIA@AL_TELEPORT,idle,26,1,10000,0,0,yes,self,rudeattacked,0,,,,,,,
20524,ILL_CECILIA@SM_BASH,attack,5,10,500,0,5000,yes,target,always,0,,,,,,29,
20525,ILL_BAPHOMET_J@AL_TELEPORT,idle,26,1,10000,0,0,yes,self,rudeattacked,0,,,,,,,
20525,ILL_BAPHOMET_J@NPC_CURSEATTACK,attack,181,3,1000,800,5000,no,target,always,0,,,,,,29,
20525,ILL_BAPHOMET_J@NPC_DARKNESSATTACK,attack,190,3,1000,500,5000,no,target,always,0,,,,,,6,
20525,ILL_BAPHOMET_J@NPC_EMOTION,walk,197,1,2000,0,5000,yes,self,always,0,,,,,,2,
20525,ILL_BAPHOMET_J@NPC_HALLUCINATION,attack,207,1,300,500,5000,yes,target,always,0,,,,,,29,
20525,ILL_BAPHOMET_J@NPC_HALLUCINATION,chase,207,1,300,500,5000,yes,target,always,0,,,,,,29,
20525,ILL_BAPHOMET_J@NPC_FIREATTACK,chase,186,3,1000,0,5000,yes,target,always,0,,,,,,19,
20525,ILL_BAPHOMET_J@NPC_DARKSTRIKE,chase,340,4,1500,500,5000,no,target,always,0,,,,,,,
20525,ILL_BAPHOMET_J@NPC_DARKCROSS,attack,338,3,300,0,5000,yes,target,always,0,,,,,,,
20526,ILL_SIDE_WINDER@AL_TELEPORT,idle,26,1,10000,0,5000,yes,self,rudeattacked,0,,,,,,,
20526,ILL_SIDE_WINDER@NPC_POISONATTACK,chase,188,5,3000,0,5000,yes,target,always,0,,,,,,,
20526,ILL_SIDE_WINDER@KN_PIERCE,attack,56,5,500,700,5000,no,target,always,0,,,,,,,
20526,ILL_SIDE_WINDER@NPC_POISON,attack,176,3,500,800,5000,no,target,always,0,,,,,,,
20526,ILL_SIDE_WINDER@NPC_POISONATTACK,attack,188,3,500,500,5000,no,target,always,0,,,,,,,
20526,ILL_SIDE_WINDER@NPC_COMBOATTACK,attack,171,1,500,0,5000,yes,target,always,0,,,,,,,
20526,ILL_SIDE_WINDER@CR_AUTOGUARD,attack,249,10,500,0,300000,yes,self,always,0,,,,,,,
20526,ILL_SIDE_WINDER@NPC_CRITICALSLASH,attack,170,1,500,0,5000,yes,target,always,0,,,,,,,
20527,ILL_HUNTER_FLY@AL_TELEPORT,idle,26,1,500,0,5000,yes,self,always,0,,,,,,,
20527,ILL_HUNTER_FLY@AL_TELEPORT,idle,26,1,10000,0,5000,yes,self,rudeattacked,0,,,,,,,
20527,ILL_HUNTER_FLY@MG_LIGHTNINGBOLT,chase,20,9,3000,0,5000,yes,target,always,0,,,,,,,
20527,ILL_HUNTER_FLY@NPC_BLOODDRAIN,attack,199,1,500,0,5000,yes,target,always,0,,,,,,2,
20527,ILL_HUNTER_FLY@NPC_COMBOATTACK,attack,171,1,500,0,5000,yes,target,always,0,,,,,,6,
20527,ILL_HUNTER_FLY@NPC_WINDATTACK,attack,187,3,2000,0,5000,yes,target,always,0,,,,,,,
20527,ILL_HUNTER_FLY@NPC_CRITICALSLASH,attack,170,1,500,0,5000,yes,target,always,0,,,,,,,
20527,ILL_HUNTER_FLY@MG_LIGHTNINGBOLT,attack,20,9,500,0,5000,yes,target,always,0,,,,,,,
20527,ILL_HUNTER_FLY@NPC_GUIDEDATTACK,attack,172,5,500,0,60000,yes,target,always,0,,,,,,,
20528,ILL_MANTIS@AL_TELEPORT,idle,26,1,10000,0,5000,yes,self,rudeattacked,0,,,,,,,
20528,ILL_MANTIS@NPC_COMBOATTACK,attack,171,1,500,700,5000,no,target,always,0,,,,,,6,
20528,ILL_MANTIS@NPC_GROUNDATTACK,attack,185,3,500,500,5000,no,target,always,0,,,,,,6,
20528,ILL_MANTIS@NPC_EMOTION,chase,197,1,200,0,5000,yes,self,always,0,0x0081,,,,,19,
20528,ILL_MANTIS@NPC_EMOTION,idle,197,1,2000,0,5000,yes,self,always,0,0x3095,,,,,9,
20529,ILL_GHOSTRING@AL_TELEPORT,idle,26,1,10000,0,5000,yes,self,rudeattacked,0,,,,,,28,
20529,ILL_GHOSTRING@NPC_CHEAL,idle,729,5,3000,500,5000,no,self,friendhpltmaxrate,60,,,,,,3,
20529,ILL_GHOSTRING@AL_HEAL,idle,28,11,3000,500,5000,no,friend,myhpltmaxrate,60,,,,,,3,
20529,ILL_GHOSTRING@NPC_INVISIBLE,attack,353,1,2000,200,5000,yes,self,always,0,,,,,,,
20529,ILL_GHOSTRING@NPC_INVISIBLE,idle,353,1,2000,200,5000,yes,self,always,0,,,,,,,
20529,ILL_GHOSTRING@NPC_INVISIBLE,chase,353,1,2000,200,5000,yes,self,always,0,,,,,,,
20529,ILL_GHOSTRING@MG_SOULSTRIKE,chase,13,4,2000,500,1000,yes,target,always,0,,,,,,,
20529,ILL_GHOSTRING@NPC_DARKBREATH,attack,202,4,500,800,5000,no,target,always,0,,,,,,28,
20529,ILL_GHOSTRING@NPC_TELEKINESISATTACK,attack,191,5,500,0,5000,yes,target,always,0,,,,,,28,
20529,ILL_GHOSTRING@NPC_DARKSTRIKE,chase,340,4,2000,500,1000,yes,target,always,0,,,,,,,
20530,ILL_KILLER_MANTIS@AL_TELEPORT,idle,26,1,10000,0,0,yes,self,rudeattacked,0,,,,,,,
20530,ILL_KILLER_MANTIS@NPC_COMBOATTACK,attack,171,1,500,0,5000,yes,target,always,0,,,,,,,
20530,ILL_KILLER_MANTIS@NPC_CRITICALSLASH,attack,170,1,500,0,5000,yes,target,always,0,,,,,,6,
20530,ILL_KILLER_MANTIS@NPC_GROUNDATTACK,attack,185,3,500,0,5000,yes,target,always,0,,,,,,6,
20530,ILL_KILLER_MANTIS@WZ_EARTHSPIKE,attack,90,3,500,500,5000,no,target,always,0,,,,,,,
20530,ILL_KILLER_MANTIS@WZ_EARTHSPIKE,chase,90,3,1000,500,5000,no,target,always,0,,,,,,,
20530,ILL_KILLER_MANTIS@WZ_HEAVENDRIVE,attack,91,3,500,800,5000,no,target,always,0,,,,,,,
20531,ILL_POPORING@NPC_AGIUP,loot,350,1,1000,0,10000,yes,self,always,0,,,,,,2,
20531,ILL_POPORING@NPC_AGIUP,idle,350,1,0,0,10000,yes,self,always,0,,,,,,,
20531,ILL_POPORING@AL_TELEPORT,idle,26,1,10000,0,5000,yes,self,rudeattacked,0,,,,,,,
20531,ILL_POPORING@NPC_POISON,attack,176,3,500,800,5000,no,target,always,0,,,,,,,
20531,ILL_POPORING@NPC_POISONATTACK,attack,188,3,2000,0,5000,yes,target,always,0,,,,,,,
20531,ILL_POPORING@SM_MAGNUM,attack,7,5,500,0,10000,yes,self,always,0,,,,,,,
20531,ILL_POPORING@NPC_VENOMIMPRESS,attack,738,2,5000,0,30000,yes,target,always,0,,,,,,,
20532,ILL_STEM_WORM@AL_TELEPORT,idle,26,1,10000,0,5000,yes,self,rudeattacked,0,,,,,,,
20532,ILL_STEM_WORM@NPC_GUIDEDATTACK,attack,172,5,500,0,20000,yes,target,always,0,,,,,,,
20532,ILL_STEM_WORM@NPC_WINDATTACK,attack,187,3,500,0,5000,yes,target,always,0,,,,,,6,
20532,ILL_STEM_WORM@NPC_GROUNDATTACK,attack,185,3,500,0,5000,yes,target,always,0,,,,,,6,
20532,ILL_STEM_WORM@KN_TWOHANDQUICKEN,chase,60,30,3000,0,120000,yes,self,always,0,,,,,,,
20532,ILL_STEM_WORM@NPC_DEFENDER,chase,205,1,1500,0,300000,yes,self,longrangeattacked,0,,,,,,,
20532,ILL_STEM_WORM@AS_SONICBLOW,attack,136,5,500,0,5000,yes,target,always,0,,,,,,,
20532,ILL_STEM_WORM@NPC_DEFENDER,attack,205,1,1000,0,300000,yes,self,longrangeattacked,0,,,,,,,
20532,ILL_STEM_WORM@NPC_CHEAL,idle,729,5,3000,500,5000,no,self,friendhpltmaxrate,60,,,,,,3,
20532,ILL_STEM_WORM@AL_HEAL,idle,28,11,3000,500,5000,no,friend,myhpltmaxrate,60,,,,,,3,
20532,ILL_STEM_WORM@NPC_CHEAL,chase,729,5,3000,500,5000,no,self,friendhpltmaxrate,60,,,,,,3,
20532,ILL_STEM_WORM@AL_HEAL,chase,28,11,3000,500,5000,no,friend,myhpltmaxrate,60,,,,,,3,
20533,G_ILL_BAPHOMET_J@NPC_CURSEATTACK,attack,181,3,1000,800,5000,no,target,always,0,,,,,,29,
20533,G_ILL_BAPHOMET_J@NPC_DARKNESSATTACK,attack,190,3,1000,500,5000,no,target,always,0,,,,,,6,
20533,G_ILL_BAPHOMET_J@NPC_HALLUCINATION,attack,207,1,300,500,5000,yes,target,always,0,,,,,,29,
20533,G_ILL_BAPHOMET_J@NPC_HALLUCINATION,chase,207,1,300,500,5000,yes,target,always,0,,,,,,29,
20533,G_ILL_BAPHOMET_J@NPC_FIREATTACK,chase,186,3,1000,0,5000,yes,target,always,0,,,,,,19,
20533,G_ILL_BAPHOMET_J@NPC_DARKSTRIKE,chase,340,4,1500,500,5000,no,target,always,0,,,,,,,
20533,G_ILL_BAPHOMET_J@NPC_DARKCROSS,attack,338,3,300,0,5000,yes,target,always,0,,,,,,,
// Meister ABR's (Automated Battle Robot)
20834,ABR_BATTLE_WARIOR@ABR_BATTLE_BUSTER,chase,8601,1,10000,500,5000,yes,target,always,0,,,,,,,
20834,ABR_BATTLE_WARIOR@ABR_BATTLE_BUSTER,attack,8601,1,10000,500,5000,yes,target,always,0,,,,,,,

View File

@@ -1459,21 +1459,21 @@ Body:
TimeLimit: 4h
- Id: 3464
Title: Illusion Investigation Team - Terrian
- Id: 3465
Title: Illusion of Labyrinth 100 Kills
Targets:
- Id: 1
Count: 100
Location: prt_mz03_i
MapMobTargets:
ILL_STEM_WORM: true
ILL_GHOSTRING: true
ILL_POPORING: true
ILL_MANTIS: true
ILL_HUNTER_FLY: true
ILL_SIDE_WINDER: true
ILL_BAPHOMET_J: true
ILL_KILLER_MANTIS: true
# - Id: 3465
# Title: Illusion of Labyrinth 100 Kills
# Targets:
# - Id: 1
# Count: 100
# Location: prt_mz03_i
# MapMobTargets:
# ILL_STEM_WORM: true
# ILL_GHOSTRING: true
# ILL_POPORING: true
# ILL_MANTIS: true
# ILL_HUNTER_FLY: true
# ILL_SIDE_WINDER: true
# ILL_BAPHOMET_J: true
# ILL_KILLER_MANTIS: true
- Id: 3466
Title: Illusion of Labyrinth 100 Kills - Standby
TimeLimit: 4h
@@ -9307,90 +9307,9 @@ Body:
- Id: 12461
Title: The aftereffects of powerful death
TimeLimit: 3d 4h
- Id: 12470
Title: "[Daily] Andrea's Revenge I"
Targets:
- Mob: ILL_BAPHOMET_J
Count: 5
- Id: 12471
Title: "[Daily] Andrea's Revenge II"
Targets:
- Mob: ILL_GHOSTRING
Count: 2
- Id: 12472
Title: "[Daily] Anes' Revenge I"
Targets:
- Mob: ILL_HUNTER_FLY
Count: 5
- Id: 12473
Title: "[Daily] Anes' Revenge II"
Targets:
- Mob: ILL_KILLER_MANTIS
Count: 5
- Id: 12474
Title: "[Daily] Silvano's Revenge I"
Targets:
- Mob: ILL_MANTIS
Count: 5
- Id: 12475
Title: "[Daily] Silvano's Revenge II"
Targets:
- Mob: ILL_POPORING
Count: 5
- Id: 12476
Title: "[Daily] Cecilia's Revenge I"
Targets:
- Mob: ILL_SIDE_WINDER
Count: 5
- Id: 12477
Title: "[Daily] Cecilia's Revenge II"
Targets:
- Mob: ILL_STEM_WORM
Count: 3
- Id: 12478
Title: "[Weekly] Soul Purification - Andrea"
Targets:
- Mob: ILL_ANDREA
Count: 1
- Id: 12479
Title: "[Weekly] Soul Purification - Anes"
Targets:
- Mob: ILL_ANES
Count: 1
- Id: 12480
Title: "[Weekly] Soul Purification - Silvano"
Targets:
- Mob: ILL_SILVANO
Count: 1
- Id: 12481
Title: "[Weekly] Soul Purification - Cecilia"
Targets:
- Mob: ILL_CECILIA
Count: 1
- Id: 12482
Title: Disappearance of a Colleague
- Id: 12483
Title: Follow Up
- Id: 12484
Title: Searching for Traces - Andrea
- Id: 12485
Title: Searching for Traces - Anes
- Id: 12486
Title: Searching for Traces - Silvano
- Id: 12487
Title: Searching for Traces - Cecilia
- Id: 12488
Title: Search Result
- Id: 12489
Title: Guest Guild Member
- Id: 12490
Title: "[Cooldown] Daily Mission"
Title: Receive today's mission
TimeLimit: 4h
- Id: 12491
Title: "[Cooldown] Weekly Mission"
TimeLimit: Monday 4h
- Id: 12492
Title: Esmeralda
- Id: 12493
Title: The aftereffect of the challenge
TimeLimit: 3d 4h

View File

@@ -110,18 +110,7 @@ function Pick {
Go(.@map$,.@x,.@y);
}
function Restrict {
.@type$ = getarg(0);
if (.@type$ == "Brasilis") {
// If the official warper to Brasilis is enabled, meaning is either
// Renewal mode or Pre-renewal Brasilis is enabled, we lift the restriction
if (getnpcid(0, "Crewman_bra2"))
return;
// Otherwise we apply the renewal restriction
.@type$ = "RE";
}
if ((.@type$ == "RE" && !checkre(0)) || (.@type$ == "Pre-RE" && checkre(0))) {
if ((getarg(0) == "RE" && !checkre(0)) || (getarg(0) == "Pre-RE" && checkre(0))) {
if (getarg(1,0)) {
set @warp_block,0;
for (set .@i,1; .@i<getargcount(); set .@i,.@i+1)
@@ -152,7 +141,7 @@ T2: Go("alberta",28,234);
T3: Go("aldebaran",140,131);
T4: Go("amatsu",198,84);
T5: Go("ayothaya",208,166);
T6: Restrict("Brasilis");
T6: Restrict("RE");
Go("brasilis",196,217);
T7: Go("comodo",209,143);
T8: Restrict("RE");
@@ -229,7 +218,7 @@ F2: setarray @c[2],173,134,212,150;
F3: Restrict("RE");
setarray @c[2],193,220,220,187;
Disp("Bifrost Field",1,2); Pick("bif_fild");
F4: Restrict("Brasilis");
F4: Restrict("RE");
setarray @c[2],74,32;
Disp("Brasilis Field",1,1); Pick("bra_fild");
F5: Restrict("Pre-RE",5);
@@ -354,7 +343,7 @@ D7: Restrict("RE");
D8: Restrict("RE",4,5);
setarray @c[2],150,288,150,18,140,134,244,52,100,202;
Disp("Bio Lab 1:Bio Lab 2:Bio Lab 3:Bio Lab 4:Tomb of the Fallen"); Pick("","lhz_dun01","lhz_dun02","lhz_dun03","lhz_dun04","lhz_dun_n");
D9: Restrict("Brasilis");
D9: Restrict("RE");
setarray @c[2],87,47,262,262;
Disp("Brasilis Dungeon",1,2); Pick("bra_dun");
D10: Restrict("RE",6);

View File

@@ -687,12 +687,3 @@ alb2trea,59,69,5 script Kafra Employee::kaf_alb2trea 117,{
savepoint "alb2trea",92,64,1,1;
callfunc "F_KafEnd",0,1,"at Sunken Ship";
}
// Brasilis
//============================================================
brasilis,197,221,4 script Kafra Employee::kaf_bra 4_F_KAFRA1,{
cutin "kafra_01",2;
callfunc "F_Kafra",0,3,0,80,700;
savepoint "brasilis",195,259,1,1;
callfunc "F_KafEnd",0,1,"in the city of Brasilis";
}

View File

@@ -298,12 +298,6 @@ man_fild02 mapflag nightenabled
splendide mapflag nightenabled
spl_fild01 mapflag nightenabled
//============================================================
// Brasilis
//============================================================
brasilis mapflag nightenabled
bra_fild01 mapflag nightenabled
//============================================================
// Events
//============================================================

View File

@@ -371,12 +371,6 @@ splendide mapflag nobranch
spl_in01 mapflag nobranch
spl_in02 mapflag nobranch
//============================================================
// Brasilis
//============================================================
brasilis mapflag nobranch
bra_in01 mapflag nobranch
//============================================================
// RWC
//============================================================

View File

@@ -731,13 +731,6 @@ spl_fild01 mapflag nomemo
spl_in01 mapflag nomemo
spl_in02 mapflag nomemo
//============================================================
// Brasilis
//============================================================
bra_in01 mapflag nomemo
bra_dun01 mapflag nomemo
bra_dun02 mapflag nomemo
//evt_zombie mapflag nomemo
//============================================================

View File

@@ -25,8 +25,6 @@ ama_in01 mapflag nopenalty
ama_in02 mapflag nopenalty
ama_test mapflag nopenalty
arena_room mapflag nopenalty
brasilis mapflag nopenalty
bra_in01 mapflag nopenalty
comodo mapflag nopenalty
cmd_in01 mapflag nopenalty
cmd_in02 mapflag nopenalty

View File

@@ -58,8 +58,6 @@ aldebaran mapflag pvp off
ama_in01 mapflag pvp off
ama_in02 mapflag pvp off
amatsu mapflag pvp off
brasilis mapflag pvp off
bra_in01 mapflag pvp off
cmd_in01 mapflag pvp off
cmd_in02 mapflag pvp off
comodo mapflag pvp off

View File

@@ -426,7 +426,7 @@ bat_a01 mapflag noteleport
bat_a02 mapflag noteleport
//============================================================
// Episode 13.2
// Episode 13
//============================================================
mid_campin mapflag noteleport
moc_fild22b mapflag noteleport
@@ -438,11 +438,6 @@ man_in01 mapflag noteleport
spl_in01 mapflag noteleport
spl_in02 mapflag noteleport
//============================================================
// Brasilis
//============================================================
bra_in01 mapflag noteleport
//============================================================
// Orc's Memory
//============================================================

View File

@@ -14,7 +14,6 @@ alberta mapflag reset
aldebaran mapflag reset
amatsu mapflag reset
ayothaya mapflag reset
brasilis mapflag reset
comodo mapflag reset
einbroch mapflag reset
einbech mapflag reset

View File

@@ -28,4 +28,3 @@ louyang mapflag town
hugel mapflag town
rachel mapflag town
veins mapflag town
brasilis mapflag town

View File

@@ -203,47 +203,6 @@ ve_in,157,219,5 script Inn Master#Receptionist 709,{
}
}
//======================== Brasilis =================================
bra_in01,27,24,3 script Hotel Keeper#bra1 478,{
mes "[Hotel Keeper]";
mes "Welcome to the beautiful Brasilis Hotel.";
next;
switch(select("Save:Rest -5000 zeny:Cancel")) {
case 1:
mes "[Hotel Keeper]";
mes "Do you want to save here at the Brasilis Hotel?";
next;
switch(select("No thank you.:Absolutely.")) {
case 1:
mes "[Hotel Keeper]";
mes "Ok then, enjoy your stay.";
close;
case 2:
mes "[Hotel Keeper]";
mes "Your respawn has been saved here at the hotel. I hope that you enjoy your stay here in Brasilis.";
savepoint "bra_in01",144,69,1,1;
close;
}
end;
case 2:
if (Zeny > 4999) {
mes "[Hotel Keeper]";
mes "I will show you a great room.";
close2;
if (Zeny < 5000)
end;
Zeny -= 5000;
percentheal 100,100;
warp "bra_in01",144,69;
end;
}
mes "[Hotel Keeper]";
mes "I'm sorry, but the service charge is 5,000 zeny per night.";
case 3:
close;
}
}
//======================= Inn Function ==============================
function script F_InnMaid {
.@npc_name$ = getarg(0);

View File

@@ -1,20 +0,0 @@
//===== rAthena Script =======================================
//= Brasilis Town Pre-Renewal
//===== Description: =========================================
//= [Official Conversion based on bRO & jRO servers]
//= Brasilis town NPCs.
//
// Note:
// - Brasilis was introduced in Pre-Renewal only for bRO and
// jRO official servers with differences in monster stats,
// spawns and quests.
// It was added in Renewal for every other official server.
// Since we follow kRO this is disabled by default.
// You can enable it on npc/pre-re/scripts_athena.conf
//===== Changelog: ===========================================
//= 1.0 First Version [Daegaladh]
//============================================================
// Brasilis Transportation :: brasilis_trans
//============================================================
alberta,247,115,3 duplicate(Crewman_bra2) Crewman#bra2 100

View File

@@ -1,77 +0,0 @@
//===== rAthena Script =======================================
//= Brasilis Guide
//===== Description: =========================================
//= [Official Conversion based on bRO & jRO servers]
//= Guide for the city of Brasilis.
//
// Note:
// - Brasilis was introduced in Pre-Renewal only for bRO and
// jRO official servers with differences in monster stats,
// spawns and quests.
// It was added in Renewal for every other official server.
// Since we follow kRO this is disabled by default.
// You can enable it on npc/pre-re/scripts_athena.conf
//===== Changelog: ===========================================
//= 1.0 First Version [Daegaladh]
//============================================================
brasilis,219,97,3 script Brasilis Guide 478,{
mes "[Brasilis Guide]";
mes "Welcome to ^8B4513Brasilis^000000, a country as passionate as the sun.";
mes "If you have any questions, please ask me.";
next;
switch(select("Ask about locations:Remove Marks from Mini-Map:Cancel")) {
case 1:
mes "[Brasilis Guide]";
mes "Where can I guide you?";
next;
switch(select("[ Hotel ]:[ Jungle Cable ]:[ Art Museum ]:[ Market ]:[ Verass Monument ]")) {
case 1:
mes "[Brasilis Guide]";
mes "The Brasilis Hotel is located just above, ^FF3355+^000000.";
mes "Is there anything else I can do for you?";
viewpoint 1,274,151,2,0xFF3355;
close;
case 2:
mes "[Brasilis Guide]";
mes "Do you want to go through the rough jungle? You can take a ";
mes "Jungle Cable here ^CE6300+^000000.";
mes "Is there anything else I can do for you?";
viewpoint 1,308,335,3,0xCE6300;
close;
case 3:
mes "[Brasilis Guide]";
mes "The pride of Brasilis, the world scale Art Museum is at ^A5BAAD+^000000.";
mes "Is there anything else I can do for you?";
viewpoint 1,137,167,4,0x00FF00;
close;
case 4:
mes "[Brasilis Guide]";
mes "You can buy items for hunting at the Market here ^55FF33+^000000.";
mes "Is there anything else I can do for you?";
viewpoint 1,254,248,5,0x55FF33;
close;
case 5:
mes "[Brasilis Guide]";
mes "The iconic monument of Brasilis, the Verass Monument stands at ^3355FF+^000000.";
mes "Is there anything else I can do for you?";
viewpoint 1,195,235,6,0x3355FF;
close;
}
end;
case 2:
mes "[Brasilis Guide]";
mes "I'll remove all marks from your mini-map.";
mes "Is there anything else I can do for you?";
viewpoint 0,274,151,2,0x00FF00;
viewpoint 0,308,335,3,0x00FF00;
viewpoint 0,137,167,4,0x00FF00;
viewpoint 0,254,248,5,0x00FF00;
viewpoint 0,195,235,6,0x00FF00;
close;
case 3:
mes "[Brasilis Guide]";
mes "Wandering on your own is always the best way to explore. Anyway, take care.";
close;
}
}

View File

@@ -1,64 +0,0 @@
//===== rAthena Script =======================================
//= Brasilis Dungeon Monster Spawn Script
//===== Description: =========================================
//= [Official Conversion based on bRO & jRO servers]
//
// Note:
// - Brasilis was introduced in Pre-Renewal only for bRO and
// jRO official servers with differences in monster stats,
// spawns and quests.
// It was added in Renewal for every other official server.
// Since we follow kRO this is disabled by default.
// You can enable it on npc/pre-re/scripts_athena.conf
//===== Changelog: ===========================================
//= 1.0 First Version [Playtester]
//============================================================
//bRO Pre-Renewal spawns
//==================================================
// bra_dun01 - Behind the Waterfall
//==================================================
bra_dun01 monster Iara 2069,60,5000
bra_dun01 monster Piranha 2070,100,5000
bra_dun01 monster Hydra 1068,10,5000
bra_dun01 monster Plankton 1161,10,5000
bra_dun01 monster Marina 1141,10,5000
bra_dun01 monster Black Mushroom 1084,10,180000,90000
//==================================================
// bra_dun02 - Behind the Waterfall
//==================================================
bra_dun02 monster Iara 2069,120,5000
bra_dun02 monster Piranha 2070,80,5000
bra_dun02 monster Hydra 1068,20,5000
bra_dun02 monster Plankton 1161,20,5000
bra_dun02 monster Marina 1141,10,5000
bra_dun02 monster Black Mushroom 1084,10,180000,90000
bra_dun02 boss_monster Boitata 2068,1,7200000,600000,1
//jRO Pre-Renewal spawns
//==================================================
// bra_dun01 - Behind the Waterfall
//==================================================
//bra_dun01 monster Kukre 1070,40,5000
//bra_dun01 monster Hydra 1068,60,5000
//bra_dun01 monster Marina 1141,5,5000
//bra_dun01 monster Thara Frog 1034,40,5000
//bra_dun01 monster Piranha 2070,50,5000
//bra_dun01 monster Iara 2069,30,5000
//bra_dun01 monster Headless Mule 2071,10,5000
//bra_dun01 monster Black Mushroom 1084,5,120000,60000
//==================================================
// bra_dun02 - Behind the Waterfall
//==================================================
//bra_dun02 monster Hydra 1068,20,5000
//bra_dun02 monster Piranha 2070,60,5000
//bra_dun02 monster Iara 2069,40,5000
//bra_dun02 monster Headless Mule 2071,40,5000
//bra_dun02 monster Shining Plant 1083,1,1800000,900000
//bra_dun02 monster Red Mushroom 1084,5,120000,60000
//bra_dun02 boss_monster Boitata 2068,1,7200000,600000,1

View File

@@ -1,48 +0,0 @@
//===== rAthena Script =======================================
//= Brasilis Fields Monster Spawn Script
//===== Description: =========================================
//= [Official Conversion based on bRO & jRO servers]
//
// Note:
// - Brasilis was introduced in Pre-Renewal only for bRO and
// jRO official servers with differences in monster stats,
// spawns and quests.
// It was added in Renewal for every other official server.
// Since we follow kRO this is disabled by default.
// You can enable it on npc/pre-re/scripts_athena.conf
//===== Changelog: ===========================================
//= 1.0 First Version [Playtester]
//============================================================
//==================================================
// Brasilis, Strange Hydras
//==================================================
brasilis,283,88,6,6 monster Strange Hydra 2081,5,30000
brasilis,284,104,6,6 monster Strange Hydra 2081,4,30000
brasilis,215,80,6,6 monster Strange Hydra 2081,4,30000
brasilis,96,50,8,8 monster Strange Hydra 2081,5,30000
//bRO Pre-Renewal spawns
//==================================================
// bra_fild01 - Brasilis Field
//==================================================
bra_fild01 monster Headless Mule 2071,40,5000
bra_fild01 monster Curupira 2074,80,5000
bra_fild01 monster Dokebi 1110,20,5000
bra_fild01 monster Jaguar 2072,10,5000
bra_fild01 monster Savage 1166,20,5000
bra_fild01 monster Toucan 2073,10,5000
bra_fild01 monster Red Mushroom 1085,3,360000,180000
//jRO Pre-Renewal spawns
//==================================================
// bra_fild01
//==================================================
//bra_fild01 monster Savage 1166,10,5000
//bra_fild01 monster Dokebi 1110,20,5000
//bra_fild01 monster Curupira 2074,50,5000
//bra_fild01 monster Jaguar 2072,35,5000
//bra_fild01 monster Toucan 2073,40,5000
//bra_fild01 monster Red Mushroom 1085,5,120000,60000

View File

@@ -98,34 +98,3 @@ npc: npc/pre-re/quests/quests_nameless.txt
npc: npc/pre-re/quests/quests_niflheim.txt
npc: npc/pre-re/quests/the_sign_quest.txt
npc: npc/pre-re/quests/quests_veins.txt
// - Disable Brasilis by default --------------------------------
// DO NOT COMMENT!!!
// Instead, follow the instructions below.
// --------------------------------------------------------------
delnpc: npc/cities/brasilis.txt
delnpc: npc/quests/quests_brasilis.txt
delnpc: npc/warps/cities/brasilis.txt
delnpc: npc/warps/dungeons/bra_dun.txt
delnpc: npc/warps/fields/bra_fild.txt
// -------------------- Pre-Renewal Brasilis --------------------
// Brasilis was introduced in Pre-Renewal only for bRO and
// jRO official servers with differences in monster stats,
// spawns and quests.
// It was added in Renewal for every other official server.
// Since we follow kRO this is disabled by default.
//
// Uncomment the following NPC scripts to enable bRO/jRO's
// Pre-Renewal version of Brasilis.
// You also need to uncomment the data from file
// mob_summon.yml in /db/import/ folder
//npc: npc/cities/brasilis.txt
//npc: npc/quests/quests_brasilis.txt
//npc: npc/warps/cities/brasilis.txt
//npc: npc/warps/dungeons/bra_dun.txt
//npc: npc/warps/fields/bra_fild.txt
//npc: npc/pre-re/cities/brasilis.txt
//npc: npc/pre-re/guides/guides_brasilis.txt
//npc: npc/pre-re/mobs/dungeons/bra_dun.txt
//npc: npc/pre-re/mobs/fields/brasilis.txt

View File

@@ -21,10 +21,6 @@ alberta,246,74,3 duplicate(Sea_Captain_amatsu) Sea Captain#ama1 709
//============================================================
alberta,246,29,3 duplicate(Aibakthing_ayothaya) Aibakthing#ayo 843
// cities/brasilis.txt
//============================================================
alberta,246,82,3 duplicate(Crewman_bra2) Crewman#bra2 100
// cities/gonryun.txt
//============================================================
alberta,246,62,3 duplicate(Kunlun_Envoy_gonryun) Kunlun Envoy#gon 776

View File

@@ -1,19 +1,26 @@
//===== rAthena Script =======================================
//===== rAthena Script =======================================
//= Brasilis Town
//===== Description: =========================================
//===== By: ==================================================
//= L0ne_W0lf
//===== Current Version: =====================================
//= 1.4
//===== Compatible With: =====================================
//= rAthena Project
//===== Description: =========================================
//= [Official Conversion]
//= Brasilis Town Script
//===== Changelog: ===========================================
//= 1.0 First version. Transportation and Basic NPCs. [L0ne_W0lf]
//===== Additional Comments: =================================
//= 1.0 First version. Transportation and Basic NPCs.
//= 1.1 Fixed Zeny not being removed for payment. [Kisuka]
//= 1.2 Updated dialog, added Ice Cream Maker. [L0ne_W0lf]
//= 1.3 Moved Alberta NPC to pre-re/re paths. [Euphy]
//= 1.4 Added VIP features. [Euphy]
//============================================================
//============================================================
// Brasilis Transportation :: brasilis_trans
//============================================================
- script ::Crewman_bra2 -1,{
/* Pre-Renewal coordinates: alberta,247,115,3 */
alberta,246,82,3 script Crewman#bra2 100,{
mes "[Crewman]";
mes "Hey, have you heard of a place called Brasilis?";
mes "It's a tropical city that's hot like the desert but also rainy. It is a very mysterious place.";

View File

@@ -1,13 +1,19 @@
//===== rAthena Script =======================================
//===== rAthena Script =======================================
//= Brasilis Guide
//===== Description: =========================================
//= [Official Conversion based on bRO & jRO servers]
//===== By: ==================================================
//= L0ne_W0lf
//===== Current Version: =====================================
//= 1.2
//===== Compatible With: =====================================
//= rAthena Project
//===== Description: =========================================
//= [Official Conversion]
//= Guide for the city of Brasilis.
//===== Changelog: ===========================================
//= 1.0 First Version, Renewal guide. [L0ne_W0lf]
//= 1.1 Added a missing close. [L0ne_W0lf]
//===== Additional Comments: =================================
//= 1.0 First Version, Renewal guide.
//= 1.1 Added a missing close.
//= 1.2 Navigation system update. [Euphy]
//============================================================
//============================================================
brasilis,219,97,3 script Brasilis Guide 478,{
mes "[Brasilis Guide]";
@@ -53,7 +59,6 @@ brasilis,219,97,3 script Brasilis Guide 478,{
viewpoint 1,195,235,6,0x3355FF;
close;
}
end;
case 2:
mes "[Brasilis Guide]";
mes "I'll remove all marks from your mini-map.";

View File

@@ -29,6 +29,15 @@
//= 1.7 Added Rock Ridge Kafra. [Capuche]
//============================================================
// Brasilis
//============================================================
brasilis,197,221,4 script Kafra Employee::kaf_bra 4_F_KAFRA1,{
cutin "kafra_01",2;
callfunc "F_Kafra",0,3,0,80,700;
savepoint "brasilis",195,259,1,1;
callfunc "F_KafEnd",0,1,"in the city of Brasilis";
}
// Dewata
//============================================================
dewata,202,184,6 script Kafra Employee::kaf_dewata 4_F_KAFRA1,{

View File

@@ -8,8 +8,10 @@
//============================================================
//============================================================
// Episode 13.3
// Episode 13
//============================================================
brasilis mapflag nightenabled
bra_fild01 mapflag nightenabled
dicastes01 mapflag nightenabled
dicastes02 mapflag nightenabled
dic_fild01 mapflag nightenabled

View File

@@ -42,6 +42,12 @@ job3_war01 mapflag nobranch
job3_war02 mapflag nobranch
jupe_core2 mapflag nobranch
//============================================================
// Brasilis
//============================================================
brasilis mapflag nobranch
bra_in01 mapflag nobranch
//============================================================
// Episode 13.3
//============================================================

View File

@@ -18,7 +18,7 @@
paramk mapflag nomemo
//============================================================
// Episode 13.3
// Episode 13
//============================================================
job3_arch01 mapflag nomemo
job3_arch02 mapflag nomemo
@@ -37,6 +37,9 @@ job3_gen01 mapflag nomemo
job3_sha01 mapflag nomemo
jupe_core2 mapflag nomemo
s_atelier mapflag nomemo
bra_in01 mapflag nomemo
bra_dun01 mapflag nomemo
bra_dun02 mapflag nomemo
dicastes01 mapflag nomemo
dicastes02 mapflag nomemo
dic_in01 mapflag nomemo

View File

@@ -16,6 +16,8 @@ paramk mapflag nopenalty
//============================================================
// Municipality (Cities/Towns/Villages)
//============================================================
brasilis mapflag nopenalty
bra_in01 mapflag nopenalty
dicastes01 mapflag nopenalty
dicastes02 mapflag nopenalty
dic_in01 mapflag nopenalty

View File

@@ -85,6 +85,8 @@ paramk mapflag pvp off
// Municipality (Cities/Towns/Villages)
//============================================================
moc_para01 mapflag pvp off
brasilis mapflag pvp off
bra_in01 mapflag pvp off
dicastes01 mapflag pvp off
dicastes02 mapflag pvp off
dic_in01 mapflag pvp off

View File

@@ -26,9 +26,10 @@ paramk mapflag noteleport
moc_para01 mapflag noteleport
//============================================================
// Episode 13.3
// Episode 13
//============================================================
s_atelier mapflag noteleport
bra_in01 mapflag noteleport
dic_in01 mapflag noteleport
job3_gen01 mapflag noteleport
job3_sha01 mapflag noteleport

View File

@@ -7,6 +7,7 @@
//= 1.1 Added Izlude duplicates. [Euphy]
//============================================================
brasilis mapflag reset
dewata mapflag reset
dicastes01 mapflag reset
dicastes02 mapflag reset

View File

@@ -247,6 +247,7 @@ lhz_d_n2 mapflag restricted 6
//============================================================
// Municipality (Cities/Towns/Villages)
//============================================================
brasilis mapflag restricted 7
dewata mapflag restricted 7
dicastes01 mapflag restricted 7
eclage mapflag restricted 7

View File

@@ -7,6 +7,7 @@
//= 1.1 Added Izlude duplicates. [Euphy]
//============================================================
brasilis mapflag town
dewata mapflag town
dicastes01 mapflag town
eclage mapflag town

View File

@@ -945,117 +945,3 @@ Body:
- Index: 4
Item: Clay_Doll
Amount: 5
- Name: barter_ill_labyrinth
Items:
- Index: 0
Item: Morpheus_Hood_IL
RequiredItems:
- Index: 0
Item: Morpheus's_Hood
Refine: 9
- Index: 1
Item: IllusionStone
Amount: 100
- Index: 2
Item: Soft_Scarf
Amount: 100
- Index: 3
Item: Cold_Holy_Water
Amount: 50
- Index: 1
Item: Morpheus_Shawl_IL
RequiredItems:
- Index: 0
Item: Morpheus's_Shawl
Refine: 9
- Index: 1
Item: IllusionStone
Amount: 100
- Index: 2
Item: Brilliant_Jelly
Amount: 100
- Index: 3
Item: Medicinal_Stuff
Amount: 50
- Index: 2
Item: Morpheus_Ring_IL
RequiredItems:
- Index: 0
Item: Morpheus's_Ring
- Index: 1
Item: IllusionStone
Amount: 100
- Index: 2
Item: Purple_Solid_Shell
Amount: 100
- Index: 3
Item: Little_Lovely_Candle
Amount: 50
- Index: 4
Item: Essence_Of_Demon
Amount: 15
- Index: 3
Item: Morpheus_Armlet_IL
RequiredItems:
- Index: 0
Item: Morpheus's_Armlet
- Index: 1
Item: IllusionStone
Amount: 100
- Index: 2
Item: Suspicious_Sap
Amount: 100
- Index: 3
Item: Small_Flashlight
Amount: 50
- Index: 4
Item: Essence_Of_Demon
Amount: 15
- Index: 4
Item: Butcher_IL
RequiredItems:
- Index: 0
Item: Butcher_
Refine: 9
- Index: 1
Item: IllusionStone
Amount: 120
- Index: 2
Item: Delicious_Juice
Amount: 150
- Index: 5
Item: Taegoolyeon_IL
RequiredItems:
- Index: 0
Item: Tae_Goo_Lyeon
Refine: 9
- Index: 1
Item: IllusionStone
Amount: 120
- Index: 2
Item: Short_Rope
Amount: 150
- Index: 6
Item: Gold_Lux_IL
RequiredItems:
- Index: 0
Item: Gold_Lux
Refine: 9
- Index: 1
Item: IllusionStone
Amount: 120
- Index: 2
Item: Snake_Deadly_Poison
Amount: 150
- Index: 7
Item: Bazerald_IL
RequiredItems:
- Index: 0
Item: Bazerald
Refine: 9
- Index: 1
Item: IllusionStone
Amount: 120
- Index: 2
Item: Mantis_Flower
Amount: 150

View File

@@ -16,7 +16,6 @@
//= 1.7 Added Illusion of Twins enchanter [Capuche]
//= 1.8 Added Illusion Merchant [Haydrich]
//= 1.9 Added Illusion of Teddy Bear exchange [Atemo]
//= 1.10 Added Illusion of Labyrinth enchanter [Atemo]
//============================================================
//============================================================
@@ -936,86 +935,3 @@ ein_d02_i,177,158,3 script Bear Wanting Illusion Stone#ITB 4_NASARIAN,{
}
end;
}
//============================================================
//= Illusion of Labyrinth
//============================================================
prt_fild01,137,365,0 script #iol005 HIDDEN_WARP_NPC,4,4,{
end;
OnTouch:
if (ill_laby == 6) {
cloakoffnpcself( "Esmeralda#5" );
end;
}
end;
}
prt_fild01,141,367,3 script(CLOAKED) Esmeralda#5 4_GEFFEN_09,{
if (checkweight(1201,3) == 0) {
mes "You seem to have too many types or weights of items. Please clean up your inventory.";
close;
}
if (ill_laby < 6)
end;
if (isbegin_quest(12492) == 0) {
mes "[Esmeralda]";
mes "Oh, I thought we parted ways without even saying goodbye, but I guess you decided to work as a guest guild member for us?";
next;
select( "It happened to be like that", "I don't think it's any harm" );
mes "[Esmeralda]";
mes "It's a good choice. We will be of great help to each other.";
next;
select( "Why don't you send other guild members?" );
mes "[Esmeralda]";
mes "There is a reason for that.";
mes "Those guys didn't make a contract with the Guardian Relic. So, there is no insurance whatsoever. If I send other members to perform exorcism, those lost souls will be gone forever.";
next;
mes "[Esmeralda]";
mes "I thought it would be safer to stay here for the time being, so I gave instructions to keep myself hidden and only appear to you who helped me.";
next;
mes "[Esmeralda]";
mes "First of all, since the guild has very little funds, it will likely take quite some time for them to be fully revived. So, I'm thinking of stopping running the guild for a while and starting a business here.";
next;
select( "What kind of business are you planning on doing?" );
mes "[Esmeralda]";
mes "As you know, items called Illusion Stone appear in unknown dungeons all over the continent these days. That... is a very valuable item in this world.";
next;
mes "[Esmeralda]";
mes "I heard that there is a guild that started exploring this dungeon first. And I also received information that Illusion Stone was also found.";
next;
mes "[Esmeralda]";
mes "I'm thinking of doing something like equipment upgrade service near the entrance. Of course, you will receive Illusion Stone and various materials as payment.";
next;
mes "[Esmeralda]";
mes "I think that if I work hard for a few months, I will soon have enough money to revive my guild members.";
mes "This is probably the best for now.";
next;
select( "Is that all it is?" );
mes "[Esmeralda]";
mes "Well... there are countless other places to put money. I will skip explaining it in detail.";
next;
mes "[Esmeralda]";
mes "Anyway, next time I come, will I see you as a customer and vendor? Please continue to take good care of me.";
close2;
setquest 12492;
completequest 12492;
end;
}
mes "[Esmeralda]";
mes "If you have the equipment listed below, you can upgrade it with items obtained from the Illusion of Labyrinth.";
next;
if (select( "Cancel", "View illusion upgrade equipment." ) == 1) {
mes "[Esmeralda]";
mes "All right. Please stop by again next time.";
close;
}
mes "[Esmeralda]";
mes "Please note that if the equipment you wish to upgrade contains the effects of a card or enchantment, it will be ^ff0000destroyed when used as a material^000000.";
close2;
callshop( "barter_ill_labyrinth" );
end;
OnInit:
setunittitle( getnpcid(0), "<Priest Guild Leader>" );
end;
}

54
npc/re/merchants/inn.txt Normal file
View File

@@ -0,0 +1,54 @@
//===== rAthena Script =======================================
//= Inn Npcs
//===== By: ==================================================
//= c, L0ne_W0lf
//===== Current Version: =====================================
//= 1.1
//===== Compatible With: =====================================
//= rAthena Project
//===== Description: =========================================
//= Inn Npcs, Save and Heal
//===== Additional Comments: =================================
//= 1.0 Added Brasilis inn receptionist. [c]
//= 1.1 Updated dialog for Brasilis inn. [L0ne_W0lf]
//============================================================
// Brasilis
//============================================================
bra_in01,27,24,3 script Hotel Keeper#bra1 478,{
mes "[Hotel Keeper]";
mes "Welcome to the beautiful Brasilis Hotel.";
next;
switch(select("Save:Rest -5000 zeny")) {
case 1:
mes "[Hotel Keeper]";
mes "Do you want to save here at the Brasilis Hotel?";
next;
switch(select("No thank you.:Absolutely.")) {
case 1:
mes "[Hotel Keeper]";
mes "Ok then, enjoy your stay.";
close;
case 2:
mes "[Hotel Keeper]";
mes "Your respawn has been saved here at the hotel. I hope that you enjoy your stay here in Brasilis.";
savepoint "bra_in01",144,69,1,1;
close;
}
case 2:
if (Zeny > 4999) {
mes "[Hotel Keeper]";
mes "I will show you a great room.";
close2;
set Zeny, Zeny-5000;
percentheal 100,100;
warp "bra_in01",144,69;
end;
}
else {
mes "[Hotel Keeper]";
mes "I'm sorry, but the service charge is 5,000 zeny per night.";
close;
}
}
}

View File

@@ -1,29 +1,37 @@
//===== rAthena Script =======================================
//= Brasilis Dungeon Monster Spawn Script
//===== Changelog: ===========================================
//===== By: ==================================================
//= Kisuka
//===== Current Version: =====================================
//= 1.0
//===== Compatible With: =====================================
//= rAthena Project
//===== Description: =========================================
//= Official monster spawns in Brasilis Dungeon.
//===== Additional Comments: =================================
//= 1.0 Official spawns from Aegis [Kisuka]
//============================================================
//==================================================
// bra_dun01 - Behind the Waterfall
//==================================================
bra_dun01 monster Piranha 2070,80,5000
bra_dun01 monster Iara 2069,30,5000
bra_dun01 monster Black Mushroom 1084,5,180000,90000
bra_dun01 monster Marina 1141,20,5000
bra_dun01 monster Kukre 1070,10,5000
bra_dun01 monster Plankton 1161,10,5000
bra_dun01 monster Hydra 1068,15,5000
bra_dun01,0,0 monster Piranha 2070,80,5000
bra_dun01,0,0 monster Iara 2069,30,5000
bra_dun01,0,0 monster Black Mushroom 1084,5,180000,90000
bra_dun01,0,0 monster Marina 1141,20,5000
bra_dun01,0,0 monster Kukre 1070,10,5000
bra_dun01,0,0 monster Plankton 1161,10,5000
bra_dun01,0,0 monster Hydra 1068,15,5000
//==================================================
// bra_dun02 - Behind the Waterfall
//==================================================
bra_dun02 monster Piranha 2070,60,5000
bra_dun02 monster Iara 2069,110,5000
bra_dun02 monster Marina 1141,10,5000
bra_dun02 monster Kukre 1070,10,5000
bra_dun02 monster Plankton 1161,10,5000
bra_dun02 monster Hydra 1068,15,5000
bra_dun02 monster Shining Plant 1083,2,5000
bra_dun02 monster Black Mushroom 1084,5,5000
bra_dun02 boss_monster Boitata 2068,1,7200000,600000,1
bra_dun02,0,0 monster Piranha 2070,60,5000
bra_dun02,0,0 monster Iara 2069,110,5000
bra_dun02,0,0 monster Marina 1141,10,5000
bra_dun02,0,0 monster Kukre 1070,10,5000
bra_dun02,0,0 monster Plankton 1161,10,5000
bra_dun02,0,0 monster Hydra 1068,15,5000
bra_dun02,0,0 monster Shining Plant 1083,2,5000
bra_dun02,0,0 monster Black Mushroom 1084,5,5000
bra_dun02,0,0,0,0 boss_monster Boitata 2068,1,7200000,600000,1

View File

@@ -11,7 +11,6 @@
//= 1.3 Some small fixes [Playtester]
//= 1.4 Corrected MVP spawn variance. [L0ne_W0lf]
//= 1.5 Correct Spawn by Navigation's mob data. [attackjom]
//= 1.6 Added Illusion of Labyrinth. [Atemo]
//============================================================
//==================================================
@@ -102,56 +101,3 @@ prt_maze03,99,21,10,10 monster Black Mushroom 1084,3,180000,90000
prt_maze03,54,15,10,10 monster Black Mushroom 1084,3,180000,90000
prt_maze03,171,180,3,3 monster Red Mushroom 1085,2,180000,90000
prt_maze03,174,187,3,3 monster Red Mushroom 1085,3,180000,90000
//==================================================
// Added Illusion of Labyrinth
//==================================================
prt_mz03_i monster Chaos Poporing 20531,10,5000
prt_mz03_i monster Chaos Side Winder 20526,10,5000
prt_mz03_i monster Chaos Hunter Fly 20527,10,5000
prt_mz03_i monster Chaos Ghostring 20529,4,5000
prt_mz03_i monster Chaos Killer Mantis 20530,10,5000
prt_mz03_i monster Chaos Mantis 20528,10,5000
prt_mz03_i monster Chaos Baphomet Jr. 20525,10,5000
prt_mz03_i monster Chaotic Stem Worm 20532,6,5000
prt_mz03_i monster Chaotic Andrea 20521,1,3600000,0,"prt_mz03_i_boss::OnMobDead"
prt_mz03_i monster Chaotic Anes 20522,1,3600000,0,"prt_mz03_i_boss::OnMobDead"
prt_mz03_i monster Chaotic Silvano 20523,1,3600000,0,"prt_mz03_i_boss::OnMobDead"
prt_mz03_i monster Chaotic Cecilia 20524,1,3600000,0,"prt_mz03_i_boss::OnMobDead"
- script prt_mz03_i_boss -1,{
end;
OnMobDead:
if (playerattached() < 1)
end;
if (.boss_spawn || .cooldown || .count[killedrid] == 1)
end;
.count[killedrid] = 1;
if (.count[20521] == 1 && .count[20522] == 1 && .count[20523] == 1 && .count[20524] == 1) {
.boss_spawn = true;
.count[20521] = 0;
.count[20522] = 0;
.count[20523] = 0;
.count[20524] = 0;
killmonster "prt_mz03_i", "prt_mz03_i_boss::OnBossDeath";
mapannounce "prt_mz03_i", "A terrible presence has descended from beyond the chaos of the deep abyss.", bc_map, 0x70dbdb;
getunitdata( killedgid, .@data );
monster "prt_mz03_i", .@data[UMOB_X], .@data[UMOB_Y], "--ja--", 20520,1, "prt_mz03_i_boss::OnBossDeath"; // ILL_BAPHOMET
end;
}
end;
OnBossDeath:
mapannounce "prt_mz03_i", "The Invincible state of Chaos Baphomet has been lifted.", bc_map, 0x70dbdb;
killmonster "prt_mz03_i", "prt_mz03_i_boss::OnBossDeath";
.boss_spawn = false;
.cooldown = true;
initnpctimer;
end;
OnTimer7200000:
.cooldown = false;
stopnpctimer;
end;
}

View File

@@ -1,16 +1,22 @@
//===== rAthena Script =======================================
//= Brasilis Fields Monster Spawn Script
//===== Changelog: ===========================================
//===== By: ==================================================
//= Kisuka
//===== Current Version: =====================================
//= 1.0
//===== Compatible With: =====================================
//= rAthena Project
//===== Additional Comments: =================================
//= 1.0 Official spawns from Aegis [Kisuka]
//============================================================
//==================================================
// bra_fild01 - Brasilis Field
//==================================================
bra_fild01 monster Curupira 2074,50,5000
bra_fild01 monster Dokebi 1110,10,5000
bra_fild01 monster Savage 1166,5,5000
bra_fild01 monster Headless Mule 2071,40,5000
bra_fild01 monster Red Mushroom 1085,5,5000
bra_fild01 monster Jaguar 2072,55,5000
bra_fild01 monster Toucan 2073,60,5000
bra_fild01,0,0 monster Curupira 2074,50,5000
bra_fild01,0,0 monster Dokebi 1110,10,5000
bra_fild01,0,0 monster Savage 1166,5,5000
bra_fild01,0,0 monster Headless Mule 2071,40,5000
bra_fild01,0,0 monster Red Mushroom 1085,5,5000
bra_fild01,0,0 monster Jaguar 2072,55,5000
bra_fild01,0,0 monster Toucan 2073,60,5000

View File

@@ -48,40 +48,21 @@ function script F_22507 {// ShabbyOldScroll
// 2 : All the quests are completed
function script F_queststatus {
.@type = getarg(0);
.@status = checkquest(getarg(1),.@type);
switch( .@status ) {
case -1:
.@status = 0;
break;
case 0:
case 1:
.@status = 1;
break;
case 2:
.@status = 2;
break;
}
.@base = checkquest(getarg(1),.@type);
.@size = getargcount();
for ( .@i = 2; .@i < .@size; ++.@i ) {
.@next_status = checkquest(getarg(.@i),.@type);
switch( .@next_status ) {
case -1:
.@next_status = 0;
break;
case 0:
case 1:
.@next_status = 1;
break;
case 2:
.@next_status = 2;
break;
}
if (.@next_status != .@status)
if (checkquest(getarg(.@i),.@type) != .@base)
return -1;
}
return .@status;
switch( .@base ) {
case -1:
return 0;
case 0:
case 1:
return 1;
case 2:
return 2;
}
end;
}

View File

@@ -1226,22 +1226,8 @@ OnInit:
end;
}
prt_mz03_i,97,31,5 script Terrian#terian 4W_M_02,{
mes "[Therian]";
mes "Are there any difficulties in carrying out the mission?";
mes "If you want to get out of the Twisted Labyrinth, I can guide you.";
next;
if (select( "Let's continue talking about the investigation.", "I want to go out." ) == 2) {
mes "[Therian]";
mes "I will guide you to where the entrance to the Twisted Labyrinth was.";
close2;
warp "prt_maze01",99,29;
end;
}
mes "[Therian]";
mes "I understand.";
mes "Then let's talk about the investigation.";
next;
/*
prt_fild01,131,364,5 script Terrian#terian 4W_M_02,{
if (BaseLevel < 170) {
mes "[Terrian]";
mes "It's nice weather.";
@@ -1275,9 +1261,9 @@ prt_mz03_i,97,31,5 script Terrian#terian 4W_M_02,{
mes "If you don't mind, please apply for membership with the Commander <NAVI>[Joel]<INFO>prt_in,136,34,</INFO></NAVI> in Prontera.";
close;
}
if (isbegin_quest(3464) == 0) {
if (isbegin_quest(3467) == 0) {
mes "[Terrian]";
mes "The weather is nice.";
mes "The weather is nice";
next;
mes "[Terrian]";
mes "I'm a Terrian from the Illusion Investigation Corps.";
@@ -1295,7 +1281,7 @@ prt_mz03_i,97,31,5 script Terrian#terian 4W_M_02,{
mes "After the flowers wither in winter, they will bloom again in spring. They always bloom in the place where the flowers withered and fell off.";
next;
mes "[Terrian]";
mes "It's the same with animals, the appearance of each of which varies innumerable, but for hundreds of years it has been discovered that there has always been a completely identical appearance.";
mes "It's the same with animals, the appearance of each of which varies innumerable, but for hundreds of years it has been discovered that there has always been a completely identical appearance";
next;
mes "[Terrian]";
mes "This is the core of the theory of reincarnation, and it takes a very long time to observe and investigate it.";
@@ -1318,7 +1304,7 @@ prt_mz03_i,97,31,5 script Terrian#terian 4W_M_02,{
close;
}
mes "[Terrian]";
mes "Thank you.";
mes "Thank you";
next;
mes "[Terrian]";
mes "In order to determine the individual recovery rate, we need to reduce the number of monsters as quickly as possible.";
@@ -1366,7 +1352,7 @@ prt_mz03_i,97,31,5 script Terrian#terian 4W_M_02,{
close;
}
mes "[Terrian]";
mes "Thank you.";
mes "Thank you";
next;
mes "[Terrian]";
mes "In order to determine the individual recovery rate, we need to reduce the number of monsters as quickly as possible.";
@@ -1403,11 +1389,10 @@ OnInit:
questinfo( QTYPE_QUEST2, QMARK_YELLOW, "checkquest(3465,HUNTING) == 2" );
questinfo( QTYPE_DAILYQUEST, QMARK_YELLOW, "isbegin_quest(3464) == 2 && checkquest(3466,PLAYTIME) == -1 && checkquest(3465,HUNTING) == -1" );
// No questinfo when expired
// questinfo( QTYPE_DAILYQUEST, QMARK_YELLOW, "checkquest(3466,PLAYTIME) == 2" );
questinfo( QTYPE_DAILYQUEST, QMARK_YELLOW, "checkquest(3466,PLAYTIME) == 2" );
end;
}
*/
iz_d04_i,127,224,5 script Lister#ristar 4_F_01,{
if (BaseLevel < 180) {

View File

@@ -1,6 +1,12 @@
//===== rAthena Script =======================================
//= Brasilis Quests
//===== Description: =========================================
//===== By ===================================================
//= L0ne_W0lf
//===== Version ==============================================
//= 1.3
//===== Compatible With ======================================
//= rAthena Project
//===== Description ==========================================
//= [Official Conversion]
//= Lost Puppies (Repeatable, 24 hours.)
//= Suspicious Beach (Repeatable, 24 hours. iRO/cRO version.)
@@ -8,14 +14,13 @@
//= Brasilis Water Lily Quest
//= Brasilis Dungeon Access Quest
//= Iara (Buff reward. Repeatable, 24 hours.)
//===== Changelog: ===========================================
//= 1.0 First version. [L0ne_W0lf]
//= 1.1 Hydra Ball (12408). [og2]
//===== Comments =============================================
//= 1.0 First version.
//= 1.1 Hydra Ball (12408)
//= 1.2 Optimization. [Euphy]
//= 1.2a Added 'consumeitem' command. [Euphy]
//= 1.3 Added VIP features and fixed some EXP values. [Euphy]
//= 1.3a Clean-up. [Capuche]
//= 1.4 Added pre-renewal differences [Daegaladh]
//============================================================
// Lost Puppies :: dogdog.sc
@@ -54,12 +59,10 @@ brasilis,297,307,5 script Angelo#br 1_M_04,{
erasequest 9031;
setquest 9032;
specialeffect2 EF_ASSUMPTIO;
if (checkre(0)) {
consumeitem 607; //Yggdrasilberry
.@rand = rand(1,10);
if (.@rand > 4 && .@rand < 9) getitem 504,2; //White_Potion
else if (.@rand > 8) getitem 608,1; //Seed_Of_Yggdrasil
}
consumeitem 607; //Yggdrasilberry
.@rand = rand(1,10);
if (.@rand > 4 && .@rand < 9) getitem 504,2; //White_Potion
else if (.@rand > 8) getitem 608,1; //Seed_Of_Yggdrasil
close;
}
mes "[Angelo]";
@@ -226,15 +229,11 @@ brasilis,192,133,6 script Lucia#brasilis 4_F_BRZ_WOMAN,{
//recall_completequest 9029;
if (.@nQState2 > -1) erasequest 9029;
setquest 9029;
if (checkre(0))
consumeitem 607; //Yggdrasilberry
consumeitem 607; //Yggdrasilberry
consumeitem 12070; //Luk_Dish05
consumeitem 12055; //Vit_Dish05
consumeitem 12065; //Dex_Dish05
if (checkre(0))
getitem 11502,3; //Light_Blue_Pot
else
getitem 505,5; //Blue_Potion
getitem 11502,3; //Light_Blue_Pot
close;
}
else {
@@ -411,12 +410,10 @@ brasilis,187,162,5 script Candy Maker 4_M_BRZ_MAN1,{
brazil_gua = 11;
completequest 2200;
getitem 12414,1; //Guarana_Candy
if (checkre(0)) {
if (VIP_SCRIPT && vip_status(VIP_STATUS_ACTIVE))
getexp 105000,15000;
else
getexp 70000,10000;
}
if (VIP_SCRIPT && vip_status(VIP_STATUS_ACTIVE))
getexp 105000,15000;
else
getexp 70000,10000;
close;
}
else if (brazil_gua == 11) {
@@ -1033,9 +1030,9 @@ brasilis,203,286,3 script Botanist Karmen#bra 4_F_HUWOMAN,{
brazil_regia = 10;
completequest 2207;
if (VIP_SCRIPT && vip_status(VIP_STATUS_ACTIVE))
getexp 75000, checkre(0)?15000:0;
getexp 75000,15000;
else
getexp 50000, checkre(0)?10000:0;
getexp 50000,10000;
close;
}
else {
@@ -2858,13 +2855,9 @@ bra_dun02,157,74,5 script Iara#nk 4_F_BRZ_WOMAN,2,2,{
mes "But... I think that the curse has been with me too long.";
mes "Get away from me quickly.";
delitem 11517,1; //Puri_Potion
if (checkre(0)) {
percentheal 100,100;
sc_start SC_INCFLEE,3600000,20;
sc_start SC_INCCRI,3600000,10;
}
else
sc_start SC_INCCRI,3600000,7;
percentheal 100,100;
sc_start SC_INCFLEE,3600000,20;
sc_start SC_INCCRI,3600000,10;
consumeitem 12043; //Str_Dish03
consumeitem 12063; //Dex_Dish03
consumeitem 12058; //Agi_Dish03

View File

@@ -15,7 +15,6 @@
//= 1.6 Added Illusion of Underwater [Capuche]
//= 1.7 Added Illusion of Twins [Capuche]
//= 1.8 Added Illusion of Teddy Bear [Atemo]
//= 1.9 Added Illusion of Labyrinth [Atemo]
//============================================================
//============================================================
@@ -12806,738 +12805,3 @@ ein_d02_i,169,244,1 script Sirumsireum Teddy Bear#ITBz02 4_TEDDY_BEAR_B_L,{
npctalk "Teddy Bear: What have you done to me...", "", bc_self;
end;
}
//============================================================
//= Illusion of Labyrinth
//============================================================
prt_maze01,99,27,0 script #iol000 HIDDEN_WARP_NPC,4,4,{
end;
OnTouch:
if (BaseLevel < 170)
end;
.@npc_name$ = "Twisted Crack#1";
removespecialeffect EF_GROUNDSAMPLE, AREA, .@npc_name$;
removespecialeffect EF_ICEWALL, AREA, .@npc_name$;
specialeffect EF_GROUNDSAMPLE, AREA, .@npc_name$;
specialeffect EF_ICEWALL, AREA, .@npc_name$;
cloakoffnpcself( .@npc_name$ );
if (ill_laby < 2) {
cloakoffnpcself( "Irene#1" );
end;
}
if (ill_laby == 2) {
cloakoffnpcself( "Irene#1" );
cloakoffnpcself( "Esmeralda#1" );
end;
}
if (ill_laby < 5) {
cloakoffnpcself( "Esmeralda#1" );
end;
}
cloakoffnpcself( "Andrea#1" );
cloakoffnpcself( "Anes#1" );
cloakoffnpcself( "Silvano#1" );
cloakoffnpcself( "Cecilia#1" );
end;
}
prt_maze01,97,21,7 script(CLOAKED) Andrea#1 4_M_ANDREA,{
if (ill_laby < 5)
end;
if (ill_laby == 5) {
mes "[Andrea]";
mes "I heard the story from the guild leader Esmeralda. You are the one who saved us.";
next;
select( "It's not like I did anything particularly grand." );
mes "[Andrea]";
mes "What humble words these are. I almost couldn't come back to life even as a soul. Thank you so much.";
next;
select( "Where did Esmeralda go?" );
mes "[Andrea]";
mes "Oh, the guild leader said she had a few things to prepare and end;ed to the guild base for a moment. She said she would end; straight to the entrance of the labyrinth.";
next;
mes "[Andrea]";
mes "Also, she asked me whether " + strcharinfo(0) + " wants to join us as guest member of the guild.";
next;
mes "[Andrea]";
mes "We don't have the manpower to raise funds for the guild revival. So, we are in a situation where even one hand is lacking.";
next;
mes "[Andrea]";
mes "If we can conquer this newly revealed twisted labyrinth, it will be a spark that can revive our guild. The only person around guild who can do that is " + strcharinfo(0) + ".";
next;
mes "[Andrea]";
mes "" + strcharinfo(0) + ", would you be able to work as a guest guild member for our guild?";
next;
if (select( "I guess that's too much.", "What are the benefits of being one?" ) == 1) {
mes "[Andrea]";
mes "Ah... right, I think it was a bit of an unreasonable request.";
close;
}
mes "[Andrea]";
mes "Even though we are only souls, we have a lot of knowledge gained while wandering through this twisted labyrinth.";
next;
mes "[Andrea]";
mes "We will give you several requests and provide you with appropriate compensation. Would you like to work as a guest guild member?";
next;
if (select( "I think I'll pass", "Yes for compensation!" ) == 1) {
mes "[Andrea]";
mes "Ah... right, I think it was a bit of an unreasonable request.";
close;
}
mes "[Andrea]";
mes "Thank you. Now, on behalf of the guild, we would like to ask " + strcharinfo(0) + " a request related to this twisted labyrinth.";
ill_laby = 6;
completequest 12489;
close;
}
switch( checkquest(12490,PLAYTIME) ) {
case -1:
break;
case 0:
case 1:
mes "[Andrea]";
mes "It's not time to make a new request yet. For now, please complete the previous request first.";
close;
case 2:
erasequest 12490;
break;
}
mes "[Andrea]";
if (F_queststatus(HAVEQUEST,12470,12471,12472,12473,12474,12475,12476,12477) != 0)
mes "You still have quests you couldn't complete yesterday. ^ff0000If you accept a new quest now, the quest you couldn't complete yesterday will be continued today.^000000 Do you want to accept all today's quests?";
else
mes "" + strcharinfo(0) + ", I have a lot of requests for you. Do you want to accept all requests?";
next;
if (select( "Not now", "Accept all" ) == 1) {
mes "[Andrea]";
mes "Please come back when you are ready to receive another request.";
close;
}
setquest 12490;
for ( .@quest_id = 12470; .@quest_id <= 12477; ++.@quest_id ) {
if (isbegin_quest(.@quest_id) == 0)
setquest .@quest_id;
}
mes "[Andrea]";
mes "Please work hard today as well.";
mes "Thank you always.";
close;
OnInit:
setunittitle( getnpcid(0), "<Priest Guild New Member>" );
// Main quest
questinfo( QTYPE_QUEST2, QMARK_YELLOW, "isbegin_quest(12489) == 1" );
// Daily quest
questinfo( QTYPE_DAILYQUEST, QMARK_YELLOW, "ill_laby == 6 && checkquest(12490,PLAYTIME) == -1" ); // note: no questinfo when playtime == 2
end;
}
prt_maze01,101,25,3 script(CLOAKED) Silvano#1 4_M_SILVANO,{
if (checkweight(1201,3) == 0) {
mes "You seem to have too many types or weights of items. Please clean up your inventory.";
close;
}
removespecialeffect 1090;
if (ill_laby < 6) {
mes "[Silvano]";
mes "Thank you for your help, " + strcharinfo(0) + ". Guild leader left a message through ^0000ffAndrea^000000.";
close;
}
mes "[Silvano]";
mes "If you have completed a quest, you can receive a reward. Would you like to receive it now?";
next;
if (select( "Not now", "Yes, please" ) == 1) {
mes "[Silvano]";
mes "I'll wait as long as I can.";
close;
}
.@quest_12470 = checkquest(12470,HUNTING);
.@quest_12471 = checkquest(12471,HUNTING);
.@quest_12472 = checkquest(12472,HUNTING);
.@quest_12473 = checkquest(12473,HUNTING);
.@quest_12474 = checkquest(12474,HUNTING);
.@quest_12475 = checkquest(12475,HUNTING);
.@quest_12476 = checkquest(12476,HUNTING);
.@quest_12477 = checkquest(12477,HUNTING);
.@quest_12478 = checkquest(12478,HUNTING);
.@quest_12479 = checkquest(12479,HUNTING);
.@quest_12480 = checkquest(12480,HUNTING);
.@quest_12481 = checkquest(12481,HUNTING);
if (.@quest_12470 != 2 && .@quest_12471 != 2 && .@quest_12472 != 2 && .@quest_12473 != 2 && .@quest_12474 != 2 && .@quest_12475 != 2 && .@quest_12476 != 2 && .@quest_12477 != 2 && .@quest_12478 != 2 && .@quest_12479 != 2 && .@quest_12480 != 2 && .@quest_12481 != 2) { // no daily quest done
mes "[Silvano]";
mes "There are no completed quests. Please come back to me after completing at least one request.";
close;
}
if (.@quest_12470 == 2) {
getexp 1750000,1137500;
getitem 25271,1; // IllusionStone
erasequest 12470;
mes "^0000ff[Daily] Andrea's Revenge I^000000 completed";
next;
}
if (.@quest_12471 == 2) {
getexp 1750000,1137500;
getitem 25271,1; // IllusionStone
erasequest 12471;
mes "^0000ff[Daily] Andrea's Revenge II^000000 completed";
next;
}
if (.@quest_12472 == 2) {
getexp 1750000,1137500;
getitem 25271,1; // IllusionStone
erasequest 12472;
mes "^0000ff[Daily] Anes' Revenge I^000000 completed";
next;
}
if (.@quest_12473 == 2) {
getexp 1750000,1137500;
getitem 25271,1; // IllusionStone
erasequest 12473;
mes "^0000ff[Daily] Anes' Revenge II^000000 completed";
next;
}
if (.@quest_12474 == 2) {
getexp 1750000,1137500;
getitem 25781,1; // Little_Lovely_Candle
erasequest 12474;
mes "^0000ff[Daily] Silvano's Revenge I^000000 completed";
next;
}
if (.@quest_12475 == 2) {
getexp 1750000,1137500;
getitem 25782,1; // Medicinal_Stuff
erasequest 12475;
mes "^0000ff[Daily] Silvano's Revenge II^000000 completed";
next;
}
if (.@quest_12476 == 2) {
getexp 1750000,1137500;
getitem 25783,1; // Cold_Holy_Water
erasequest 12476;
mes "^0000ff[Daily] Cecilia's Revenge I^000000 completed";
next;
}
if (.@quest_12477 == 2) {
getexp 1750000,1137500;
getitem 25784,1; // Small_Flashlight
erasequest 12477;
mes "^0000ff[Daily] Cecilia's Revenge II^000000 completed";
next;
}
if (.@quest_12478 == 2) {
getexp 2500000,1625000;
getitem 25781,3;
erasequest 12478;
mes "^0000ff[Weekly] Soul Purification - Andrea^000000 completed";
next;
}
if (.@quest_12479 == 2) {
getexp 2500000,1625000;
getitem 25782,3;
erasequest 12479;
mes "^0000ff[Weekly] Soul Purification - Anes^000000 completed";
next;
}
if (.@quest_12480 == 2) {
getexp 2500000,1625000;
getitem 25783,3;
erasequest 12480;
mes "^0000ff[Weekly] Soul Purification - Silvano^000000 completed";
next;
}
if (.@quest_12481 == 2) {
getexp 2500000,1625000;
getitem 25784,3; // Small_Flashlight
erasequest 12481;
mes "^0000ff[Weekly] Soul Purification - Cecilia^000000 completed";
next;
}
mes "[Silvano]";
mes "All compensation payments for completed quests have been completed.";
close;
OnInit:
setunittitle( getnpcid(0), "<Priest Guild New Member>" );
questinfo( QTYPE_QUEST2, QMARK_YELLOW, "checkquest(12470,HUNTING) == 2" );
questinfo( QTYPE_QUEST2, QMARK_YELLOW, "checkquest(12471,HUNTING) == 2" );
questinfo( QTYPE_QUEST2, QMARK_YELLOW, "checkquest(12472,HUNTING) == 2" );
questinfo( QTYPE_QUEST2, QMARK_YELLOW, "checkquest(12473,HUNTING) == 2" );
questinfo( QTYPE_QUEST2, QMARK_YELLOW, "checkquest(12474,HUNTING) == 2" );
questinfo( QTYPE_QUEST2, QMARK_YELLOW, "checkquest(12475,HUNTING) == 2" );
questinfo( QTYPE_QUEST2, QMARK_YELLOW, "checkquest(12476,HUNTING) == 2" );
questinfo( QTYPE_QUEST2, QMARK_YELLOW, "checkquest(12477,HUNTING) == 2" );
end;
}
prt_maze01,101,21,1 script(CLOAKED) Cecilia#1 4_F_CECILIA,{
if (ill_laby < 6) {
mes "[Cecilia]";
mes "Thank you for your help, " + strcharinfo(0) + ". Guild leader left a message through ^0000ffAndrea^000000.";
close;
}
mes "[Cecilia]";
mes "Is there anything I can help you with?";
next;
if (select( "Nothing", "Can you send me outside?" ) == 1) {
mes "[Cecilia]";
mes "I'm sorry I couldn't help you.";
close;
}
warp "prt_fild01",136,365;
end;
OnInit:
setunittitle( getnpcid(0), "<Priest Guild New Member>" );
end;
}
prt_maze01,97,25,5 script(CLOAKED) Anes#1 4_F_ANES,{
if (checkweight(1201,3) == 0) {
mes "You seem to have too many types or weights of items. Please clean up your inventory.";
close;
}
if (ill_laby < 5)
end;
if (ill_laby == 5) {
mes "[Anes]";
mes "Thank you for your help, " + strcharinfo(0) + ". Guild leader left a message through ^0000ffAndrea^000000.";
close;
}
.@quest_12478 = checkquest(12478,HUNTING);
.@quest_12479 = checkquest(12479,HUNTING);
.@quest_12480 = checkquest(12480,HUNTING);
.@quest_12481 = checkquest(12481,HUNTING);
if (.@quest_12478 == -1 && .@quest_12479 == -1 && .@quest_12480 == -1 && .@quest_12481 == -1)
.@state = 0;
else if (.@quest_12478 == 2 || .@quest_12479 == 2 || .@quest_12480 == 2 || .@quest_12481 == 2)
.@state = 2;
else
.@state = 1;
switch( checkquest(12491,PLAYTIME) ) {
case -1:
break;
case 0:
case 1:
mes "[Anes]";
mes "It's not time to make a new request yet. For now, please complete the previous quest first.";
close;
case 2:
erasequest 12491;
break;
}
switch( .@state ) {
case 0:
mes "[Anes]";
mes "" + strcharinfo(0) + ", there is one weekly request that you can receive weekly. Would you like to receive it?";
next;
if (select( "Not now", "Receive 1 weekly request" ) == 1) {
mes "[Anes]";
mes "Please come back when you are ready to receive another request.";
close;
}
setquest 12491;
setquest rand(12478, 12481);
mes "[Anes]";
mes "I hope that God's blessings will be with you this week as well.";
close;
case 1:
mes "[Anes]";
mes "There are still uncompleted quests. ^ff0000If you accept new quests now, the unfinished quests from last week will be deleted.^000000 Would you like to accept new weekly quests?";
next;
if (select( "Cancel", "Receive the weekly request" ) == 1) {
mes "[Anes]";
mes "Come back when you're ready to accept the quest.";
close;
}
if (isbegin_quest(12478) > 0)
erasequest 12478;
if (isbegin_quest(12479) > 0)
erasequest 12479;
if (isbegin_quest(12480) > 0)
erasequest 12480;
if (isbegin_quest(12481) > 0)
erasequest 12481;
setquest 12491;
setquest rand(12478, 12481);
mes "[Anes]";
mes "May God bless you this week as well.";
close;
case 2:
end;
}
end;
OnInit:
setunittitle( getnpcid(0), "<Priest Guild New Member>" );
questinfo( QTYPE_EVENT, QMARK_YELLOW, "ill_laby == 6 && checkquest(12491,PLAYTIME) == -1" ); // note: type event is not a mistake
// no questinfo when playtime 2
// questinfo( QTYPE_EVENT, QMARK_YELLOW, "checkquest(12491,PLAYTIME) == 2" );
// unknown questinfo hunting completed
end;
}
prt_maze01,99,23,5 script(CLOAKED) Twisted Crack#1 CLEAR_NPC,{
if (BaseLevel < 170)
end;
if (ill_laby < 2) {
mes "Beyond the twisted crack, a familiar yet unfamiliar labyrinth unfolds.";
close;
}
mes "Beyond the twisted crack, a familiar yet unfamiliar labyrinth unfolds.";
mes "^ff0000If you step in, you may not be able to get out again.^000000";
next;
if (select( "Pretend you didn't see it", "Enter through the crack" ) == 1) {
mes "^0000ffCuriosity killed the cat. Let's bury it quietly.^000000";
close;
}
warp "prt_mz03_i",99,26;
end;
OnInit:
questinfo( QTYPE_CLICKME, QMARK_YELLOW, "isbegin_quest(12484) == 1 || isbegin_quest(12485) == 1 || isbegin_quest(12486) == 1 || isbegin_quest(12487) == 1" );
end;
}
prt_maze01,97,26,5 script(CLOAKED) Irene#1 4_F_ERENE,2,2,{
if (BaseLevel < 170)
end;
if (ill_laby == 0) {
mes "[Irene]";
mes "Ouch! Sorry. I didn't mean to surprise you!";
next;
select( "Whoua! You surprised me!" );
mes "[Irene]";
mes "Please don't point your weapon at me and hear me out! Please.";
next;
select( "Calm down." );
mes "[Irene]";
mes "Thank you. My name is Irene, member of the Prontera Priests' Guild. Ah.. There is a bit of reason why this is happening right now.";
next;
select( "Did you die while hunting?" );
mes "[Irene]";
mes "Yes... I found this suspicious crack during training with 4 other new guild members. They rushed into this place, so I followed them...";
next;
mes "[Irene]";
mes "Please, I would like you to inform our guild leader of the current situation. We are currently recruiting people near the cathedral in Prontera. I will wait for other guild members who might come out of here...";
next;
if (select( "Sorry, I can't help you.", "Alright, no problem." ) == 1) {
mes "[Irene]";
mes "Well yeah.. it must have been an unreasonable request... sorry..";
close;
}
mes "[Irene]";
mes "Thank you! Here's a note with the guild leader's location! Please!";
next;
select( "Let's go outside first." );
ill_laby = 1;
setquest 12482;
warp "prt_fild01",136,365;
end;
}
if (ill_laby == 1) {
mes "[Irene]";
mes "If you look at the note I gave you, the guild leader's location is written down.";
close2;
warp "prt_fild01",136,365;
end;
}
if (ill_laby == 2) {
mes "[Irene]";
mes "Ugh, it looks like there's no trace of my remains...";
next;
mes "[Esmeralda]";
mes "Fortunately, your guardian relic is stored in the guild, so resurrection is possible. It might cost some money, though.";
next;
mes "[Irene]";
mes "I'm sorry...";
close;
}
if (ill_laby == 3) {
mes "[Irene]";
mes "I need to go back to the guild soon. It's quite embarrassing because of the state of my soul.";
close2;
cloakonnpcself();
end;
}
end;
OnTouch:
if (ill_laby == 0) {
npctalk "Ouch! Sorry. I didn't mean to surprise you!", "", bc_self;
end;
}
end;
OnInit:
setunittitle( getnpcid(0), "<Priest Guild Member>" );
questinfo( QTYPE_QUEST, QMARK_YELLOW, "BaseLevel >= 170 && ill_laby == 0" );
end;
}
prt_maze01,101,26,3 script(CLOAKED) Esmeralda#1 4_GEFFEN_09,{
if (ill_laby < 2)
end;
if (ill_laby == 2) {
mes "[Esmeralda]";
mes "Irene, stop crying and come to your senses.";
next;
mes "[Esmeralda]";
mes "Fortunately, your guardian relic is stored in the guild, so resurrection is possible. It might cost some money, though.";
next;
mes "[Irene]";
mes "I'm sorry...";
next;
mes "[Esmeralda]";
mes "We need to resurrect this troublemaker as soon as possible, so I'll send her back to the guild first.";
next;
mes "[Esmeralda]";
mes "I have to say thank you, but since you have already helped me, can I ask you one more favor?";
next;
if (select( "You really have no shame.", "Uh... of course." ) == 1) {
mes "[Esmeralda]";
mes "Ah, I guess that's it. I really have no shame. We'll take care of the rest.";
close;
}
mes "[Esmeralda]";
mes "Irene made a soul contract with the guardian relic a long time ago, so I don't think there will be any problems with her resurrection.";
next;
mes "[Esmeralda]";
mes "There are a total of 4 more people missing. These guys don't have a contract with the guardian relic, so they don't appear in spirit form. Ha... really...";
next;
select( "Is signing a contract with a guardian relic like insurance?" );
mes "[Esmeralda]";
mes "Yes, since our guild is made up of only priests, fatal accidents are unexpectedly rare, but they are very frequent.";
next;
mes "[Esmeralda]";
mes "As soon as you join, you enter into a contract with a guardian relic and undergo a ceremony that completely resurrects your soul and body even after death.";
next;
mes "[Esmeralda]";
mes "The problem is that the four new recruits who disappeared today are the ones who didn't even go through that process.";
next;
select( "Do I have to retrieve the remains and bring them back?" );
mes "[Esmeralda]";
mes "Ah... well, even the smallest traces of the body are fine. The more intact it is, the cheaper the resurrection price will be, but you have to save it first.";
next;
select( "(It feels like furniture repair)" );
mes "[Esmeralda]";
mes "Priests train in various things. During the training process, there are many things that are not quite beautiful.";
next;
if (select( "Well, it looks dangerous so I...", "Alright, I will do it" ) == 1) {
mes "[Esmeralda]";
mes "Ah, I guess that's it. We'll take care of the rest.";
close;
}
mes "[Esmeralda]";
mes "Thank you. I've collected information about the four guild members, so if you need anything, please check it. Perhaps traces of my members lie beyond this twisted rift.";
close2;
ill_laby = 3;
erasequest 12483;
setquest 12484;
setquest 12485;
setquest 12486;
setquest 12487;
end;
}
if (ill_laby == 3) {
mes "[Esmeralda]";
mes "I've collected information about the four guild members, so if you need anything, please check it. Perhaps traces of my members lie beyond this twisted rift.";
close;
}
if (ill_laby == 4) {
mes "[Esmeralda]";
mes "Oh, thank you. I almost gave up, but you really saved all of our new recruits.";
next;
select( "(Can these remains really be called new recruits?)" );
mes "[Esmeralda]";
mes "Thank you so much. First, we need to summon the souls of our guild members to this area. I think this place will be better than the city until complete revival work is done.";
next;
mes "[Esmeralda]";
mes "Oh, and it's a bit difficult to show our guild's soul summoning process if you're not a member of the guild. Could you please go outside the dungeon for a moment?";
next;
if (select( "Can't I just watch?", "Of course" ) == 1) {
mes "[Esmeralda]";
mes "Ah, it would be a bit awkward to show this to someone outside the guild...";
close;
}
mes "[Esmeralda]";
mes "Thank you for your consideration. Then I'll send you outside for a while.";
close2;
ill_laby = 5;
erasequest 12488;
setquest 12489;
warp "prt_fild01",136,365;
end;
}
end;
OnInit:
setunittitle( getnpcid(0), "<Priest Guild Leader>" );
questinfo( QTYPE_QUEST, QMARK_YELLOW, "isbegin_quest(12483) == 1" );
questinfo( QTYPE_QUEST, QMARK_YELLOW, "isbegin_quest(12488) == 1" );
end;
}
prontera,212,320,0 script #iol002 HIDDEN_WARP_NPC,4,4,{
end;
OnTouch:
if (ill_laby == 1) {
cloakoffnpcself( "Esmeralda#2" );
end;
}
end;
}
prontera,212,320,3 script(CLOAKED) Esmeralda#2 4_GEFFEN_09,2,3,{
if (ill_laby == 1) {
mes "[Esmeralda]";
mes "Huh? What's going on? Did something happen to our guild members?";
next;
select( "(Inform her terrible thing that happened to the priests' guild)" );
mes "[Esmeralda]";
mes "Our new recruits are missing?";
mes "Sigh... Is it a guild tradition? It always like this every year...";
next;
mes "[Esmeralda]";
mes "Thanks for telling me. I guess I'll have to go take care of these guys. God's blessings be with you, adventurer...";
close2;
ill_laby = 2;
erasequest 12482;
setquest 12483;
cloakonnpcself();
end;
}
end;
OnTouch:
if (ill_laby == 1) {
npctalk "Guided by the light, the Prontera Priests Guild is recruiting new guild members", "", bc_self;
end;
}
end;
OnInit:
setunittitle( getnpcid(0), "<Priest Guild Leader>" );
questinfo( QTYPE_QUEST, QMARK_YELLOW, "isbegin_quest(12482) == 1" );
end;
}
prt_mz03_i,107,104,0 script #iold01 HIDDEN_WARP_NPC,4,4,{
end;
OnTouch:
if (ill_laby == 3 && isbegin_quest(12484) == 1) {
cloakoffnpcself( "Trace of Andrea#D" );
end;
}
end;
}
prt_mz03_i,10,18,0 script #iold02 HIDDEN_WARP_NPC,4,4,{
end;
OnTouch:
if (ill_laby == 3 && isbegin_quest(12485) == 1) {
cloakoffnpcself( "Trace of Anes#D" );
end;
}
end;
}
prt_mz03_i,135,68,0 script #iold03 HIDDEN_WARP_NPC,4,4,{
end;
OnTouch:
if (ill_laby == 3 && isbegin_quest(12486) == 1) {
cloakoffnpcself( "Trace of Silvano#D" );
end;
}
end;
}
prt_mz03_i,183,26,0 script #iold04 HIDDEN_WARP_NPC,4,4,{
end;
OnTouch:
if (ill_laby == 3 && isbegin_quest(12487) == 1) {
cloakoffnpcself( "Trace of Cecilia#D" );
end;
}
end;
}
prt_mz03_i,107,104,3 script(CLOAKED) Trace of Andrea#D 4_M_ANDREA_D,{
getmapxy .@map$,.@x,.@y, BL_NPC;
switch( .@x ) {
case 107: // Trace of Andrea#D
.@quest_id = 12484;
break;
case 10: // Trace of Anes#D
.@quest_id = 12485;
break;
case 135: // Trace of Silvano#D
.@quest_id = 12486;
break;
case 183: // Trace of Cecilia#D
.@quest_id = 12487;
break;
}
if (ill_laby == 3 && isbegin_quest(.@quest_id) == 1) {
mes "^0000ffYou found the " + strnpcinfo(1) + ". Would you like to take care of it?^000000";
next;
if (select( "Cancel", "Take care of it" ) == 1) {
mes "^0000ffCancelled the process.^000000";
close;
}
progressbar "FFFF00",5;
specialeffect EF_HO_UP;
erasequest .@quest_id;
cloakonnpcself();
if (F_queststatus(HAVEQUEST,12484,12485,12486,12487) == 0) {
ill_laby = 4;
setquest 12488;
mes "^0000ffYou found traces of guild members. Let's go find Esmeralda inside the labyrinth.^000000";
close2;
warp "prt_fild01",136,365;
end;
}
end;
}
end;
OnInit:
getmapxy .@map$,.@x,.@y, BL_NPC;
switch( .@x ) {
case 107: // Trace of Andrea#D
.@quest_id = 12484;
break;
case 10: // Trace of Anes#D
.@quest_id = 12485;
break;
case 135: // Trace of Silvano#D
.@quest_id = 12486;
break;
case 183: // Trace of Cecilia#D
.@quest_id = 12487;
break;
}
questinfo( QTYPE_CLICKME, QMARK_YELLOW, "isbegin_quest(" + .@quest_id + ") == 1" );
end;
}
prt_mz03_i,10,18,3 duplicate(Trace of Andrea#D) Trace of Anes#D 4_F_ANES_D
prt_mz03_i,135,68,3 duplicate(Trace of Andrea#D) Trace of Silvano#D 4_M_SILVANO_D
prt_mz03_i,183,26,3 duplicate(Trace of Andrea#D) Trace of Cecilia#D 4_F_CECILIA_D

View File

@@ -14,6 +14,7 @@ npc: npc/re/battleground/bg_common.txt
// --------------------------- Cities ---------------------------
npc: npc/re/cities/alberta.txt
npc: npc/re/cities/brasilis.txt
npc: npc/re/cities/comodo.txt
npc: npc/re/cities/dewata.txt
npc: npc/re/cities/dicastes.txt
@@ -153,6 +154,7 @@ npc: npc/re/merchants/guild_warehouse.txt
npc: npc/re/merchants/hd_refiner.txt
npc: npc/re/merchants/HorrorToyFactory_merchants.txt
npc: npc/re/merchants/InfiniteSpace_merchants.txt
npc: npc/re/merchants/inn.txt
npc: npc/re/merchants/malangdo_costume.txt
npc: npc/re/merchants/moro_cav_exchange.txt
npc: npc/re/merchants/mysterious_cookie_shop.txt
@@ -244,6 +246,7 @@ npc: npc/re/quests/quests_17_1.txt
npc: npc/re/quests/quests_17_2.txt
npc: npc/re/quests/quests_18_1.txt
npc: npc/re/quests/quests_aldebaran.txt
npc: npc/re/quests/quests_brasilis.txt
npc: npc/re/quests/quests_dewata.txt
npc: npc/re/quests/quests_dicastes.txt
npc: npc/re/quests/quests_dungeons_200.txt

View File

@@ -4,6 +4,7 @@
// --------------------------- Cities ---------------------------
npc: npc/re/warps/cities/alberta.txt
npc: npc/re/warps/cities/brasilis.txt
npc: npc/re/warps/cities/dewata.txt
npc: npc/re/warps/cities/dicastes.txt
npc: npc/re/warps/cities/eclage.txt
@@ -21,6 +22,7 @@ npc: npc/re/warps/cities/yggdrasil.txt
// -------------------------- Dungeons --------------------------
npc: npc/re/warps/dungeons/amicitia.txt
npc: npc/re/warps/dungeons/bra_dun.txt
npc: npc/re/warps/dungeons/dic_dun.txt
npc: npc/re/warps/dungeons/ecl_dun.txt
npc: npc/re/warps/dungeons/ein_dun.txt
@@ -30,7 +32,6 @@ npc: npc/re/warps/dungeons/mag_dun.txt
npc: npc/re/warps/dungeons/moc_pryd.txt
npc: npc/re/warps/dungeons/nif_dun.txt
npc: npc/re/warps/dungeons/oz_dun.txt
npc: npc/re/warps/dungeons/prt_mz03_i.txt
npc: npc/re/warps/dungeons/rockmi1.txt
npc: npc/re/warps/dungeons/sp_rudus.txt
npc: npc/re/warps/dungeons/slabw01.txt
@@ -38,6 +39,7 @@ npc: npc/re/warps/dungeons/thor_v.txt
// --------------------------- Fields ---------------------------
npc: npc/re/warps/fields/bif_fild.txt
npc: npc/re/warps/fields/bra_fild.txt
npc: npc/re/warps/fields/com_fild.txt
npc: npc/re/warps/fields/dic_fild.txt
npc: npc/re/warps/fields/geffen_fild.txt

View File

@@ -1,7 +1,16 @@
//===== rAthena Script =======================================
//= Brasilis Town Warps
//===== Changelog: ===========================================
//= 1.0 First version. [L0ne_W0lf]
//= Brasilis Town Warps Script
//===== By: ==================================================
//= L0ne_W0lf
//===== Current Version: =====================================
//= 1.2
//===== Compatible With: =====================================
//= rAthena Project; RO Episode 13.1+
//===== Description: =========================================
//= [Official Conversion]
//= Warp Points for Brasilis
//===== Additional Comments: =================================
//= 1.0 First version.
//= 1.1 Fixed warps according to official. [Protimus]
//= 1.1a Added Field warp according to official. [Jguy]
//= 1.2 Added missing warps & removed duplicated one. [Daegaladh]

View File

@@ -0,0 +1,17 @@
//===== rAthena Script =======================================
//= Brasilis Dungeon Warp
//===== By: ==================================================
//= L0ne_W0lf
//===== Current Version: =====================================
//= 1.0
//===== Compatible With: =====================================
//= rAthena Project
//===== Description: =========================================
//= [Official Conversion]
//= Brasilis Dungeon warp script
//===== Additional Comments: =================================
//= 1.0 First version.
//============================================================
bra_dun01,199,35,0 warp brad1tobrad2 1,1,bra_dun02,261,263
bra_dun02,261,265,0 warp brad2tobrad1 1,1,bra_dun01,199,37

View File

@@ -1,144 +0,0 @@
//===== rAthena Script =======================================
//= Illusion of Labyrinth Warp Script
//===== Changelogs: ==========================================
//= 1.0 First version. [Atemo]
//============================================================
prt_mz03_i,5,186,0 warp2 3maze1a1_3maze2d2 1,1,prt_mz03_i,151,134
prt_mz03_i,22,194,0 warp2 3maze1a2_3maze4e1 1,1,prt_mz03_i,175,48
prt_mz03_i,85,174,0 warp2 3maze1c1_3maze4a3 1,1,prt_mz03_i,14,48
prt_mz03_i,102,165,0 warp2 3maze1c2_3maze4d2 1,1,prt_mz03_i,137,71
prt_mz03_i,125,171,0 warp2 3maze1d1_3maze3c2 1,1,prt_mz03_i,105,111
prt_mz03_i,154,181,0 warp2 3maze1d2_3maze4d1 1,1,prt_mz03_i,139,48
prt_mz03_i,175,165,0 warp2 3maze1e1_3maze5b3 1,1,prt_mz03_i,71,12
prt_mz03_i,194,175,0 warp2 3maze1e2_3maze2e2 1,1,prt_mz03_i,191,139
prt_mz03_i,5,140,0 warp2 3maze2a1_3maze4c4 1,1,prt_mz03_i,111,56
prt_mz03_i,18,154,0 warp2 3maze2a2_3maze5b1 1,1,prt_mz03_i,48,21
prt_mz03_i,23,125,0 warp2 3maze2a3_3maze4e2 1,1,prt_mz03_i,177,71
prt_mz03_i,54,154,0 warp2 3maze2b1_3maze3d2 1,1,prt_mz03_i,142,111
prt_mz03_i,63,125,0 warp2 3maze2b2_3maze3c1 1,1,prt_mz03_i,88,97
prt_mz03_i,85,146,0 warp2 3maze2c1_3maze3a2 1,1,prt_mz03_i,22,88
prt_mz03_i,98,154,0 warp2 3maze2c2_3maze5c2 1,1,prt_mz03_i,99,31
prt_mz03_i,114,145,0 warp2 3maze2c3_3maze5e1 1,1,prt_mz03_i,168,22
prt_mz03_i,137,125,0 warp2 3maze2d1_3maze4b2 1,1,prt_mz03_i,71,71
prt_mz03_i,154,134,0 warp2 3maze2d2_3maze1a1 1,1,prt_mz03_i,8,186
prt_mz03_i,166,139,0 warp2 3maze2e1_3maze3b4 1,1,prt_mz03_i,63,88
prt_mz03_i,194,139,0 warp2 3maze2e2_3maze1e2 1,1,prt_mz03_i,191,175
prt_mz03_i,17,114,0 warp2 3maze3a1_3maze3d1 1,1,prt_mz03_i,129,102
prt_mz03_i,22,85,0 warp2 3maze3a2_3maze2c1 1,1,prt_mz03_i,88,146
prt_mz03_i,45,104,0 warp2 3maze3b1_3maze4c3 1,1,prt_mz03_i,96,48
prt_mz03_i,63,114,0 warp2 3maze3b2_3maze4a2 1,1,prt_mz03_i,14,71
prt_mz03_i,74,97,0 warp2 3maze3b3_3maze5b2 1,1,prt_mz03_i,56,8
prt_mz03_i,63,85,0 warp2 3maze3b4_3maze2e1 1,1,prt_mz03_i,169,139
prt_mz03_i,85,97,0 warp2 3maze3c1_3maze2b2 1,1,prt_mz03_i,63,128
prt_mz03_i,105,114,0 warp2 3maze3c2_3maze1d1 1,1,prt_mz03_i,128,174
prt_mz03_i,114,95,0 warp2 3maze3c3_3maze5e2 1,1,prt_mz03_i,176,8
prt_mz03_i,125,105,0 warp2 3maze3d1_3maze1b1 1,1,prt_mz03_i,58,191
prt_mz03_i,142,114,0 warp2 3maze3d2_3maze2b1 1,1,prt_mz03_i,54,151
prt_mz03_i,168,94,0 warp2 3maze3e1_3maze4e3 1,1,prt_mz03_i,191,54
prt_mz03_i,182,85,0 warp2 3maze3e2_23maze3 1,1,prt_maze02,100,179
prt_mz03_i,194,94,0 warp2 3maze3e3_3maze5d1 1,1,prt_mz03_i,151,22
prt_mz03_i,5,58,0 warp2 3maze4a1_3maze5e4 1,1,prt_mz03_i,191,15
prt_mz03_i,14,74,0 warp2 3maze4a2_3maze3b2 1,1,prt_mz03_i,63,111
prt_mz03_i,14,45,0 warp2 3maze4a3_3maze1c1 1,1,prt_mz03_i,88,174
prt_mz03_i,52,45,0 warp2 3maze4b1_3maze5a2 1,1,prt_mz03_i,16,31
prt_mz03_i,85,56,0 warp2 3maze4c1_3maze5e3 1,1,prt_mz03_i,176,31
prt_mz03_i,104,74,0 warp2 3maze4c2_3maze5c3 1,1,prt_mz03_i,111,22
prt_mz03_i,96,45,0 warp2 3maze4c3_3maze3b1 1,1,prt_mz03_i,48,104
prt_mz03_i,114,56,0 warp2 3maze4c4_3maze2a1 1,1,prt_mz03_i,8,140
prt_mz03_i,137,74,0 warp2 3maze4d2_3maze1c2 1,1,prt_mz03_i,102,168
prt_mz03_i,175,45,0 warp2 3maze4e1_3maze1a2 1,1,prt_mz03_i,22,191
prt_mz03_i,177,74,0 warp2 3maze4e2_3maze2a3 1,1,prt_mz03_i,23,128
prt_mz03_i,194,54,0 warp2 3maze4e3_3maze3e1 1,1,prt_mz03_i,171,94
prt_mz03_i,23,5,0 warp2 3maze5a1_3maze5c1 1,1,prt_mz03_i,88,13
prt_mz03_i,16,34,0 warp2 3maze5a2_3maze4b1 1,1,prt_mz03_i,52,48
prt_mz03_i,45,21,0 warp2 3maze5b1_3maze2a2 1,1,prt_mz03_i,18,151
prt_mz03_i,54,5,0 warp2 3maze5b2_3maze3b3 1,1,prt_mz03_i,71,97
prt_mz03_i,74,12,0 warp2 3maze5b3_3maze1e1 1,1,prt_mz03_i,175,168
prt_mz03_i,85,13,0 warp2 3maze5c1_3maze5a1 1,1,prt_mz03_i,23,8
prt_mz03_i,99,34,0 warp2 3maze5c2_3maze2c2 1,1,prt_mz03_i,98,151
prt_mz03_i,114,22,0 warp2 3maze5c3_3maze4c2 1,1,prt_mz03_i,104,71
prt_mz03_i,165,22,0 warp2 3maze5e1_3maze2c3 1,1,prt_mz03_i,111,146
prt_mz03_i,176,5,0 warp2 3maze5e2_3maze3c3 1,1,prt_mz03_i,111,95
prt_mz03_i,176,34,0 warp2 3maze5e3_3maze4c1 1,1,prt_mz03_i,88,56
prt_mz03_i,194,15,0 warp2 3maze5e4_3maze4a1 1,1,prt_mz03_i,8,58
prt_mz03_i,58,194,0 script 3maze1b1_Random1 WARPNPC,1,1,{
end;
OnTouch:
switch( rand(1,4) ) {
case 1:
warp "prt_mz03_i",88,146;
end;
case 2:
warp "prt_mz03_i",8,58;
end;
case 3:
warp "prt_mz03_i",137,128;
end;
case 4:
warp "prt_mz03_i",48,21;
end;
}
end;
}
prt_mz03_i,74,74,0 script 3maze4b2_Random2 WARPNPC,1,1,{
end;
OnTouch:
switch( rand(1,4) ) {
case 1:
warp "prt_mz03_i",88,146;
end;
case 2:
warp "prt_mz03_i",8,58;
end;
case 3:
warp "prt_mz03_i",137,128;
end;
case 4:
warp "prt_mz03_i",48,21;
end;
}
end;
}
prt_mz03_i,139,45,0 script 3maze4d1_Random3 WARPNPC,1,1,{
end;
OnTouch:
switch( rand(1,4) ) {
case 1:
warp "prt_mz03_i",88,146;
end;
case 2:
warp "prt_mz03_i",8,58;
end;
case 3:
warp "prt_mz03_i",137,128;
end;
case 4:
warp "prt_mz03_i",48,21;
end;
}
end;
}
prt_mz03_i,154,22,0 script 3maze5d1_Random4 WARPNPC,1,1,{
end;
OnTouch:
switch( rand(1,4) ) {
case 1:
warp "prt_mz03_i",88,146;
end;
case 2:
warp "prt_mz03_i",8,58;
end;
case 3:
warp "prt_mz03_i",137,128;
end;
case 4:
warp "prt_mz03_i",48,21;
end;
}
end;
}

View File

@@ -0,0 +1,17 @@
//===== rAthena Script =======================================
//= Brasilis Fild Warps Script
//===== By: ==================================================
//= Protimus
//===== Current Version: =====================================
//= 1.0
//===== Compatible With: =====================================
//= rAthena Project
//===== Description: =========================================
//= [Official Conversion]
//= Warp Points for Brasilis
//===== Additional Comments: =================================
//= 1.0 First version.
//============================================================
bra_fild01,72,34,0 warp bra_fild01_brasilis 1,1,brasilis,309,334
brasilis,308,336,0 warp brasilis_bra_fild01 1,1,bra_fild01,74,34

View File

@@ -34,7 +34,6 @@ npc: npc/cities/alberta.txt
npc: npc/cities/aldebaran.txt
npc: npc/cities/amatsu.txt
npc: npc/cities/ayothaya.txt
npc: npc/cities/brasilis.txt
npc: npc/cities/comodo.txt
npc: npc/cities/einbech.txt
npc: npc/cities/einbroch.txt
@@ -251,7 +250,6 @@ npc: npc/quests/quests_alberta.txt
npc: npc/quests/quests_aldebaran.txt
npc: npc/quests/quests_amatsu.txt
npc: npc/quests/quests_ayothaya.txt
npc: npc/quests/quests_brasilis.txt
npc: npc/quests/quests_comodo.txt
npc: npc/quests/quests_ein.txt
npc: npc/quests/quests_geffen.txt

View File

@@ -7,7 +7,6 @@ npc: npc/warps/cities/alberta.txt
npc: npc/warps/cities/aldebaran.txt
npc: npc/warps/cities/amatsu.txt
npc: npc/warps/cities/ayothaya.txt
npc: npc/warps/cities/brasilis.txt
npc: npc/warps/cities/comodo.txt
npc: npc/warps/cities/einbech.txt
npc: npc/warps/cities/einbroch.txt
@@ -38,7 +37,6 @@ npc: npc/warps/dungeons/ama_dun.txt
npc: npc/warps/dungeons/anthell.txt
npc: npc/warps/dungeons/ayo_dun.txt
npc: npc/warps/dungeons/beach_dun.txt
npc: npc/warps/dungeons/bra_dun.txt
npc: npc/warps/dungeons/c_tower.txt
npc: npc/warps/dungeons/ein_dun.txt
npc: npc/warps/dungeons/gef_dun.txt
@@ -69,7 +67,6 @@ npc: npc/warps/dungeons/xmas_dun.txt
// --------------------------- Fields ---------------------------
npc: npc/warps/fields/abyss_warper.txt
npc: npc/warps/fields/amatsu_fild.txt
npc: npc/warps/fields/bra_fild.txt
npc: npc/warps/fields/ein_fild.txt
npc: npc/warps/fields/gefenia.txt
npc: npc/warps/fields/glastheim.txt

View File

@@ -1,8 +0,0 @@
//===== rAthena Script =======================================
//= Brasilis Dungeon Warps
//===== Changelog: ===========================================
//= 1.0 First version. [L0ne_W0lf]
//============================================================
bra_dun01,199,35,0 warp brad1tobrad2 1,1,bra_dun02,261,263
bra_dun02,261,265,0 warp brad2tobrad1 1,1,bra_dun01,199,37

View File

@@ -1,8 +0,0 @@
//===== rAthena Script =======================================
//= Brasilis Field Warps
//===== Changelog: ===========================================
//= 1.0 First version. [Protimus]
//============================================================
bra_fild01,72,34,0 warp bra_fild01_brasilis 1,1,brasilis,309,334
brasilis,308,336,0 warp brasilis_bra_fild01 1,1,bra_fild01,74,34

View File

@@ -106,6 +106,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "yamlupgrade", "src\tool\yam
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ryml", "3rdparty\rapidyaml\ryml.vcxproj", "{492E2981-34F4-3A6A-BFD9-46096C641203}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_DEPRECATED_USE_CMAKE_INSTEAD_", "_DEPRECATED_USE_CMAKE_INSTEAD_", "{7BDFFA26-6F88-4F5B-8B7E-3B51C9FD9BA3}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32

View File

@@ -1,29 +1,16 @@
#
# setup and static libraries
#
set(RA_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR} CACHE PATH
"rathena include directory"
)
mark_as_advanced( RA_INCLUDE_DIRS )
mark_as_advanced(RA_INCLUDE_DIRS)
add_subdirectory(common)
add_subdirectory(login)
add_subdirectory(char)
add_subdirectory(map)
add_subdirectory(web)
add_subdirectory( common )
if( HAVE_common )
option( BUILD_SERVERS "build server executables" ON )
else()
message( STATUS "Disabled server targets (requires common)" )
endif()
add_subdirectory(tool)
#
# targets
#
add_subdirectory( login )
add_subdirectory( char )
add_subdirectory( map )
add_subdirectory( web )
add_subdirectory( tool )
# add_subdirectory( tool )

View File

@@ -1,40 +1,52 @@
#
# setup
#
set( CHAR_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE INTERNAL "" )
add_executable(char-server)
target_sources(char-server PRIVATE
"char.cpp"
"char_clif.cpp"
"char_cnslif.cpp"
"char_logif.cpp"
"char_mapif.cpp"
"int_achievement.cpp"
"int_auction.cpp"
"int_clan.cpp"
"int_elemental.cpp"
"int_guild.cpp"
"int_homun.cpp"
"int_mail.cpp"
"int_mercenary.cpp"
"int_party.cpp"
"int_pet.cpp"
"int_quest.cpp"
"int_storage.cpp"
"inter.cpp"
)
#
# char server
#
if( BUILD_SERVERS )
message( STATUS "Creating target char-server" )
file(GLOB CHAR_HEADERS ${CHAR_SOURCE_DIR}/*.hpp)
file(GLOB CHAR_SOURCES_CXX ${CHAR_SOURCE_DIR}/*.cpp)
set(CHAR_SOURCES ${CHAR_SOURCES_C} ${CHAR_SOURCES_CXX})
#message( STATUS "CHAR_SOURCES="${CHAR_SOURCES})
set( DEPENDENCIES common )
set( LIBRARIES ${GLOBAL_LIBRARIES} )
set( INCLUDE_DIRS ${GLOBAL_INCLUDE_DIRS} ${COMMON_BASE_INCLUDE_DIRS} ${RA_INCLUDE_DIRS} )
set( DEFINITIONS "${GLOBAL_DEFINITIONS} ${COMMON_BASE_DEFINITIONS}" )
set( SOURCE_FILES ${COMMON_BASE_HEADERS} ${COMMON_HEADERS} ${CHAR_HEADERS} ${CHAR_SOURCES} )
source_group( common FILES ${COMMON_BASE_HEADERS} ${COMMON_HEADERS} )
source_group( char FILES ${CHAR_HEADERS} ${CHAR_SOURCES} )
include_directories( ${INCLUDE_DIRS} )
if(WIN32)
target_sources(char-server PRIVATE
"char_clif.hpp"
"char_cnslif.hpp"
"char.hpp"
"char_logif.hpp"
"char_mapif.hpp"
"int_achievement.hpp"
"int_auction.hpp"
"int_clan.hpp"
"int_elemental.hpp"
"inter.hpp"
"int_guild.hpp"
"int_homun.hpp"
"int_mail.hpp"
"int_mercenary.hpp"
"int_party.hpp"
"int_pet.hpp"
"int_quest.hpp"
"int_storage.hpp"
"packets.hpp"
)
#message( STATUS "char-server SOURCE_FILES=${SOURCE_FILES}")
add_executable( char-server ${SOURCE_FILES} )
#message( STATUS "char-server LIBRARIES=${LIBRARIES}, DEPENDENCIES=${DEPENDENCIES} DEFINITIONS=${DEFINITIONS}")
add_dependencies( char-server ${DEPENDENCIES} )
target_link_libraries( char-server ${LIBRARIES} ${DEPENDENCIES} )
set_target_properties( char-server PROPERTIES COMPILE_FLAGS "${DEFINITIONS}" )
set_target_properties(char-server PROPERTIES FOLDER "Servers")
endif()
if( INSTALL_COMPONENT_RUNTIME )
cpack_add_component( Runtime_charserver DESCRIPTION "char-server" DISPLAY_NAME "char-server" GROUP Runtime )
install( TARGETS char-server
DESTINATION "."
COMPONENT Runtime_charserver )
endif( INSTALL_COMPONENT_RUNTIME )
set( TARGET_LIST ${TARGET_LIST} char-server CACHE INTERNAL "" )
message( STATUS "Creating target char-server - done" )
endif( BUILD_SERVERS )
target_link_libraries(char-server PUBLIC
common
)

View File

@@ -2837,7 +2837,6 @@ void char_config_split_startpoint( char* w1_value, char* w2_value, struct s_poin
size_t fields_length = 3 + 1;
(*count) = 0; // Reset to begin reading
memset(start_point, 0, sizeof(struct s_point_str) * MAX_STARTPOINT);
fields = (char **)aMalloc(fields_length * sizeof(char *));
if (fields == nullptr)
@@ -2877,8 +2876,6 @@ void char_config_split_startitem(char *w1_value, char *w2_value, struct startite
int i = 0;
size_t fields_length = 3 + 1;
memset(start_items, 0, sizeof(struct startitem) * MAX_STARTITEM);
fields = (char **)aMalloc(fields_length * sizeof(char *));
if (fields == nullptr)
return; // Failed to allocate memory.

View File

@@ -1,191 +1,226 @@
include(CheckCSourceRuns)
include(CheckFunctionExists)
#
# Create version.hpp
# Test monotonic clock
#
message( STATUS "Creating version.hpp" )
if(GIT_VERSION)
# those 2 was done in parent to produce this
#include(GetGitVersion)
#get_git_version()
string(SUBSTRING ${GIT_VERSION} 0 10 SHORT_GIT_VERSION)
string(SUBSTRING ${GIT_HEAD_VERSION} 0 10 SHORT_GIT_HEAD_VERSION)
string(CONCAT GIT_STR_VERSIONS ${SHORT_GIT_VERSION} "_" ${SHORT_GIT_HEAD_VERSION})
#message( STATUS "git version=${GIT_STR_VERSIONS}" )
file( WRITE ${CMAKE_CURRENT_BINARY_DIR}/version.hpp
"#ifndef SVNVERSION\n#define SVNVERSION ${GIT_STR_VERSIONS}\n#endif\n" )
elseif( SVNVERSION )
file( WRITE ${CMAKE_CURRENT_BINARY_DIR}/version.hpp
"#ifndef SVNVERSION\n#define SVNVERSION ${SVNVERSION}\n#endif\n" )
# CLOCK_MONOTONIC clock for clock_gettime
# Normally defines _POSIX_TIMERS > 0 and _POSIX_MONOTONIC_CLOCK (for posix
# compliant systems) and __FreeBSD_cc_version >= 500005 (for FreeBSD
# >= 5.1.0, which does not have the posix defines (ref. r11983)) would be
# checked but some systems define them even when they do not support it
# (ref. bugreport:1003).
#
message(STATUS "Check for monotonic clock")
find_library(RT_LIBRARY rt)# (optional, rt on Debian)
mark_as_advanced(RT_LIBRARY)
set(CMAKE_REQUIRED_LIBRARIES ${GLOBAL_LIBRARIES} ${RT_LIBRARY})
file(READ "${CMAKE_SOURCE_DIR}/3rdparty/cmake/tests/HAVE_MONOTONIC_CLOCK.c" _SOURCE)
CHECK_C_SOURCE_RUNS("${_SOURCE}" HAVE_MONOTONIC_CLOCK)
if(HAVE_MONOTONIC_CLOCK)
message(STATUS "Check for monotonic clock - yes")
set(MONOTONIC_CLOCK_LIBRARIES ${RT_LIBRARY})
set(MONOTONIC_CLOCK_DEFINITIONS "-DHAVE_MONOTONIC_CLOCK")
else()
file( WRITE ${CMAKE_CURRENT_BINARY_DIR}/version.hpp "" )
message(STATUS "Check for monotonic clock - no")
endif()
set( GLOBAL_INCLUDE_DIRS ${GLOBAL_INCLUDE_DIRS} ${CMAKE_CURRENT_BINARY_DIR} CACHE INTERNAL "" )
set( SVNVERSION ${SVNVERSION}
CACHE STRING "SVN version of the source code" )
if( INSTALL_COMPONENT_DEVELOPMENT )
install( FILES ${CMAKE_CURRENT_BINARY_DIR}/version.hpp
DESTINATION "src/common"
COMPONENT Development_base )
endif( INSTALL_COMPONENT_DEVELOPMENT )
message( STATUS "Creating version.hpp - done" )
set( COMMON_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}"
CACHE PATH "common source directory" )
#message( STATUS "DEBUG COMMON_SOURCE_DIR=${COMMON_SOURCE_DIR}" )
mark_as_advanced( COMMON_SOURCE_DIR )
# Check ENABLE_MEMORY option
if(ENABLE_MEMORY STREQUAL "system")
# use the normal system functions
else()
message(STATUS "Feature not implemented, defaulting to system")
endif()
#####################################################################
# setup
#
if( WIN32 )
set( PROJECT_LIBS Ws2_32.lib )
if( MSVC )
add_definitions(-D_WINSOCK_DEPRECATED_NO_WARNINGS)
add_library(minicore EXCLUDE_FROM_ALL)
add_library(common)
# add_library(core-tools)
add_library(common-win INTERFACE)
if(WIN32)
target_link_libraries(common-win INTERFACE "ws2_32.lib")
if(MSVC)
target_compile_definitions(common-win INTERFACE
_WINSOCK_DEPRECATED_NO_WARNINGS _CRT_SECURE_NO_DEPRECATE _CRT_NONSTDC_NO_DEPRECATE)
endif()
set( COMMON_ADDITIONALL_CPP "${COMMON_SOURCE_DIR}/winapi.cpp" )
set( COMMON_ADDITIONALL_HPP "${COMMON_SOURCE_DIR}/winapi.hpp" )
endif()
set( COMMON_ALL_HEADERS
"${CMAKE_CURRENT_BINARY_DIR}/version.hpp"
"${COMMON_SOURCE_DIR}/cbasetypes.hpp"
"${COMMON_SOURCE_DIR}/mmo.hpp"
target_sources(common-win INTERFACE
"${CMAKE_CURRENT_SOURCE_DIR}/winapi.cpp"
"${CMAKE_CURRENT_SOURCE_DIR}/winapi.hpp"
)
add_library(minicore)
target_link_libraries(minicore PUBLIC common-win)
target_link_libraries(common PUBLIC common-win)
endif()
target_sources(minicore PRIVATE
"${COMMON_SOURCE_DIR}/core.cpp"
"${COMMON_SOURCE_DIR}/malloc.cpp"
"${COMMON_SOURCE_DIR}/showmsg.cpp"
"${COMMON_SOURCE_DIR}/strlib.cpp"
${LIBCONFIG_SOURCES} # needed by showmsg.cpp
${COMMON_ADDITIONALL_CPP} # needed by Windows
"core.cpp"
"database.cpp"
"des.cpp"
"grfio.cpp"
"malloc.cpp"
"nullpo.cpp"
"showmsg.cpp"
"strlib.cpp"
"utils.cpp"
)
if(WIN32)
target_sources(minicore PRIVATE
"cbasetypes.hpp"
"core.hpp"
"database.hpp"
"des.hpp"
"grfio.hpp"
"malloc.hpp"
"nullpo.hpp"
"showmsg.hpp"
"strlib.hpp"
"utils.hpp"
)
set_target_properties(minicore PROPERTIES FOLDER "Core")
endif()
target_compile_definitions(minicore PRIVATE
"-DMINICORE"
${MONOTONIC_CLOCK_DEFINITIONS}
)
target_include_directories(minicore PUBLIC
${COMMON_SOURCE_DIR}
${LIBCONFIG_INCLUDE_DIRS}
${COMMON_ADDITIONALL_HPP} # needed by Windows
"${RA_INCLUDE_DIRS}"
"${ZLIB_INCLUDE_DIRS}"
)
target_link_libraries(minicore PUBLIC
${MONOTONIC_CLOCK_LIBRARIES}
libconfig
ryml
${ZLIB_LIBRARIES}
yaml-cpp
)
target_sources(common PRIVATE
"cli.cpp"
"conf.cpp"
"core.cpp"
"database.cpp"
"db.cpp"
"des.cpp"
"ers.cpp"
"grfio.cpp"
"malloc.cpp"
"mapindex.cpp"
"md5calc.cpp"
"msg_conf.cpp"
"nullpo.cpp"
"random.cpp"
"showmsg.cpp"
"socket.cpp"
"sql.cpp"
"strlib.cpp"
"timer.cpp"
"utils.cpp"
"utilities.cpp"
)
if(WIN32)
target_sources(common PRIVATE
"cbasetypes.hpp"
"cli.hpp"
"conf.hpp"
"core.hpp"
"database.hpp"
"db.hpp"
"des.hpp"
"ers.hpp"
"grfio.hpp"
"malloc.hpp"
"mapindex.hpp"
"md5calc.hpp"
"mmo.hpp"
"msg_conf.hpp"
"nullpo.hpp"
"random.hpp"
"showmsg.hpp"
"socket.hpp"
"sql.hpp"
"strlib.hpp"
"timer.hpp"
"utilities.hpp"
"utils.hpp"
)
set_target_properties(common PROPERTIES FOLDER "Core")
endif()
# defines just for common
target_compile_definitions(common PRIVATE ${MONOTONIC_CLOCK_DEFINITIONS})
if(ENABLE_RDTSC)
target_compile_definitions(common PRIVATE "-DENABLE_RDTSC")
endif()
if(ENABLE_MEMMGR)
target_compile_definitions(common PRIVATE "-DUSE_MEMMGR")
else()
target_compile_definitions(common PRIVATE "-DNO_MEMMGR")
endif()
# Propagated defines
target_compile_definitions(common PUBLIC "-DPACKETVER=${PACKETVER}")
if(ENABLE_PRERENEWAL)
target_compile_definitions(common PUBLIC "-DPRERE")
endif()
if(ENABLE_EXTRA_DEBUG_CODE)
target_compile_definitions(common PUBLIC "-DDEBUG")
endif()
if(ENABLE_EXTRA_BUILDBOT_CODE)
target_compile_definitions(common PUBLIC "-DBUILDBOT")
endif()
if(ENABLE_EPOLL)
target_compile_definitions(common PRIVATE "-DSOCKET_EPOLL")
endif()
if(ENABLE_VIP)
target_compile_definitions(common INTERFACE "-DVIP_ENABLE")
endif()
if(MAXCONN)
target_compile_definitions(common PUBLIC "-DMAXCONN=${MAXCONN}")
endif()
CHECK_FUNCTION_EXISTS(setrlimit HAVE_SETRLIMIT)
if (HAVE_SETRLIMIT)
target_compile_definitions(common PUBLIC "-DHAVE_SETRLIMIT")
endif()
CHECK_FUNCTION_EXISTS(strnlen HAVE_STRNLEN)
if (HAVE_STRNLEN)
target_compile_definitions(common PUBLIC "-DHAVE_STRNLEN")
endif()
target_include_directories(common PUBLIC
"${MYSQL_INCLUDE_DIRS}"
"${ZLIB_INCLUDE_DIRS}"
"${RA_INCLUDE_DIRS}"
)
target_link_libraries(common PUBLIC
${MONOTONIC_CLOCK_LIBRARIES}
libconfig
ryml
${MYSQL_LIBRARIES}
${ZLIB_LIBRARIES}
)
target_compile_definitions(minicore PRIVATE "-DMINICORE" ${LIBCONFIG_DEFINITIONS})
#
# common_base
#
if( WITH_ZLIB )
message( STATUS "Creating target common_base" )
set( COMMON_BASE_HEADERS
${COMMON_ALL_HEADERS}
"${COMMON_SOURCE_DIR}/conf.hpp"
"${COMMON_SOURCE_DIR}/core.hpp"
"${COMMON_SOURCE_DIR}/database.hpp"
"${COMMON_SOURCE_DIR}/db.hpp"
"${COMMON_SOURCE_DIR}/des.hpp"
"${COMMON_SOURCE_DIR}/ers.hpp"
"${COMMON_SOURCE_DIR}/grfio.hpp"
"${COMMON_SOURCE_DIR}/malloc.hpp"
"${COMMON_SOURCE_DIR}/mapindex.hpp"
"${COMMON_SOURCE_DIR}/md5calc.hpp"
"${COMMON_SOURCE_DIR}/nullpo.hpp"
"${COMMON_SOURCE_DIR}/random.hpp"
"${COMMON_SOURCE_DIR}/showmsg.hpp"
"${COMMON_SOURCE_DIR}/socket.hpp"
"${COMMON_SOURCE_DIR}/strlib.hpp"
"${COMMON_SOURCE_DIR}/timer.hpp"
"${COMMON_SOURCE_DIR}/utils.hpp"
"${COMMON_SOURCE_DIR}/msg_conf.hpp"
"${COMMON_SOURCE_DIR}/cli.hpp"
"${COMMON_SOURCE_DIR}/utilities.hpp"
${LIBCONFIG_HEADERS} # needed by conf.hpp/showmsg.hpp
${COMMON_ADDITIONALL_HPP} # needed by Windows
CACHE INTERNAL "common_base headers" )
set( COMMON_BASE_SOURCES
"${COMMON_SOURCE_DIR}/conf.cpp"
"${COMMON_SOURCE_DIR}/core.cpp"
"${COMMON_SOURCE_DIR}/database.cpp"
"${COMMON_SOURCE_DIR}/db.cpp"
"${COMMON_SOURCE_DIR}/des.cpp"
"${COMMON_SOURCE_DIR}/ers.cpp"
"${COMMON_SOURCE_DIR}/grfio.cpp"
"${COMMON_SOURCE_DIR}/malloc.cpp"
"${COMMON_SOURCE_DIR}/mapindex.cpp"
"${COMMON_SOURCE_DIR}/md5calc.cpp"
"${COMMON_SOURCE_DIR}/nullpo.cpp"
"${COMMON_SOURCE_DIR}/random.cpp"
"${COMMON_SOURCE_DIR}/showmsg.cpp"
"${COMMON_SOURCE_DIR}/socket.cpp"
"${COMMON_SOURCE_DIR}/strlib.cpp"
"${COMMON_SOURCE_DIR}/timer.cpp"
"${COMMON_SOURCE_DIR}/utils.cpp"
"${COMMON_SOURCE_DIR}/msg_conf.cpp"
"${COMMON_SOURCE_DIR}/cli.cpp"
"${COMMON_SOURCE_DIR}/utilities.cpp"
${LIBCONFIG_SOURCES} # needed by conf.cpp/showmsg.cpp
${COMMON_ADDITIONALL_CPP} # needed by Windows
CACHE INTERNAL "common_base sources" )
set( COMMON_BASE_INCLUDE_DIRS
${LIBCONFIG_INCLUDE_DIRS}
${YAML_INCLUDE_DIRS}
CACHE INTERNAL "common_base include dirs" )
set( COMMON_BASE_DEFINITIONS
${LIBCONFIG_DEFINITIONS}
CACHE INTERNAL "common_base definitions" )
set( LIBRARIES ${GLOBAL_LIBRARIES} ${ZLIB_LIBRARIES} yaml-cpp ryml )
set( INCLUDE_DIRS ${GLOBAL_INCLUDE_DIRS} ${RA_INCLUDE_DIRS} ${YAML_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIRS} ${COMMON_BASE_INCLUDE_DIRS} )
set( DEFINITIONS "${GLOBAL_DEFINITIONS} ${COMMON_BASE_DEFINITIONS}" )
set( SOURCE_FILES ${COMMON_BASE_HEADERS} ${COMMON_BASE_SOURCES} )
source_group( common FILES ${COMMON_BASE_HEADERS} ${COMMON_BASE_SOURCES} )
add_library( common_base ${SOURCE_FILES} )
#message( STATUS "common_base LIBRARIES=${LIBRARIES}, DEFINITIONS=${DEFINITIONS}")
target_link_libraries( common_base ${LIBRARIES} )
set_target_properties( common_base PROPERTIES COMPILE_FLAGS "${DEFINITIONS}" )
include_directories( ${INCLUDE_DIRS} )
set( HAVE_common_base ON CACHE INTERNAL "" )
set( TARGET_LIST ${TARGET_LIST} common_base CACHE INTERNAL "" )
message( STATUS "Creating target common_base - done" )
else()
message( STATUS "Skipping target common_base (requires ZLIB)" )
unset( HAVE_common_base CACHE )
endif()
#
# common
#
if( HAVE_common_base AND WITH_MYSQL )
message( STATUS "Creating target common" )
set( COMMON_HEADERS
${COMMON_ALL_HEADERS}
"${CMAKE_CURRENT_SOURCE_DIR}/sql.hpp"
CACHE INTERNAL "common headers" )
set( COMMON_SOURCES
"${CMAKE_CURRENT_SOURCE_DIR}/sql.cpp"
CACHE INTERNAL "common sources" )
set( DEPENDENCIES common_base yaml-cpp ryml )
set( LIBRARIES ${GLOBAL_LIBRARIES} ${MYSQL_LIBRARIES} )
set( INCLUDE_DIRS ${GLOBAL_INCLUDE_DIRS} ${MYSQL_INCLUDE_DIRS} )
set( DEFINITIONS "${GLOBAL_DEFINITIONS}" )
set( SOURCE_FILES ${COMMON_HEADERS} ${COMMON_SOURCES} )
source_group( common FILES ${COMMON_HEADERS} ${COMMON_SOURCES} )
add_library( common ${SOURCE_FILES} )
#message( STATUS "common LIBRARIES=${LIBRARIES}, DEPENDENCIES=${DEPENDENCIES} DEFINITIONS=${DEFINITIONS}")
add_dependencies( common ${DEPENDENCIES} )
target_link_libraries( common ${LIBRARIES} ${DEPENDENCIES} )
set_target_properties( common PROPERTIES COMPILE_FLAGS "${DEFINITIONS}" )
include_directories( ${INCLUDE_DIRS} ${YAML_INCLUDE_DIRS} )
set( HAVE_common ON CACHE INTERNAL "" )
set( TARGET_LIST ${TARGET_LIST} common CACHE INTERNAL "" )
message( STATUS "Creating target common - done" )
else()
message( FATAL_ERROR "Stopping target common (requires common_base and MYSQL)" )
if(ENABLE_PROFILER STREQUAL "gprof")
target_compile_options(common PUBLIC "-pg")
target_link_libraries(common PUBLIC "-pg")
endif()

View File

@@ -1,35 +1,29 @@
#
# setup
#
set( LOGIN_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE INTERNAL "" )
add_executable(login-server)
# login server
#
if( BUILD_SERVERS )
message( STATUS "Creating target login-server" )
file(GLOB LOGIN_HEADERS ${LOGIN_SOURCE_DIR}/*.hpp)
file(GLOB LOGIN_SOURCES_CXX ${LOGIN_SOURCE_DIR}/*.cpp)
set(LOGIN_SOURCES ${LOGIN_SOURCES_C} ${LOGIN_SOURCES_CXX})
#message( STATUS "LOGIN_SOURCES="${LOGIN_SOURCES})
set( DEPENDENCIES common )
set( LIBRARIES ${GLOBAL_LIBRARIES} )
set( INCLUDE_DIRS ${GLOBAL_INCLUDE_DIRS} ${COMMON_BASE_INCLUDE_DIRS} ${RA_INCLUDE_DIRS} )
set( DEFINITIONS "${GLOBAL_DEFINITIONS} ${COMMON_BASE_DEFINITIONS} -DWITH_SQL" )
set( SOURCE_FILES ${COMMON_BASE_HEADERS} ${COMMON_HEADERS} ${LOGIN_HEADERS} ${LOGIN_SOURCES} )
source_group( common FILES ${COMMON_BASE_HEADERS} ${COMMON_HEADERS} )
source_group( login FILES ${LOGIN_HEADERS} ${LOGIN_SOURCES} )
include_directories( ${INCLUDE_DIRS} )
target_sources(login-server PRIVATE
"account.cpp"
"ipban.cpp"
"login.cpp"
"loginchrif.cpp"
"loginclif.cpp"
"logincnslif.cpp"
"loginlog.cpp"
)
add_executable( login-server ${SOURCE_FILES} )
add_dependencies( login-server ${DEPENDENCIES} )
target_link_libraries( login-server ${LIBRARIES} ${DEPENDENCIES} )
set_target_properties( login-server PROPERTIES COMPILE_FLAGS "${DEFINITIONS}" )
if( INSTALL_COMPONENT_RUNTIME )
cpack_add_component( Runtime_loginserver DESCRIPTION "login-server" DISPLAY_NAME "login-server" GROUP Runtime )
install( TARGETS login-server
DESTINATION "."
COMPONENT Runtime_loginserver )
endif( INSTALL_COMPONENT_RUNTIME )
set( TARGET_LIST ${TARGET_LIST} login-server CACHE INTERNAL "" )
message( STATUS "Creating target login-server - done" )
endif( BUILD_SERVERS )
if(WIN32)
target_sources(login-server PRIVATE
"account.hpp"
"ipban.hpp"
"loginchrif.hpp"
"loginclif.hpp"
"logincnslif.hpp"
"login.hpp"
"loginlog.hpp"
)
set_target_properties(login-server PROPERTIES FOLDER "Servers")
endif()
target_link_libraries(login-server PUBLIC
common
)

View File

@@ -1,45 +1,148 @@
#
# setup
#
set( MAP_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE INTERNAL "" )
set(MAP_SOURCES
"achievement.cpp"
"atcommand.cpp"
"battle.cpp"
"battleground.cpp"
"buyingstore.cpp"
"cashshop.cpp"
"channel.cpp"
"chat.cpp"
"chrif.cpp"
"clan.cpp"
"clif.cpp"
"date.cpp"
"duel.cpp"
"elemental.cpp"
"guild.cpp"
"homunculus.cpp"
"instance.cpp"
"intif.cpp"
"itemdb.cpp"
"log.cpp"
"mail.cpp"
"map.cpp"
"mapreg.cpp"
"mercenary.cpp"
"mob.cpp"
"navi.cpp"
"npc.cpp"
"npc_chat.cpp"
"party.cpp"
"path.cpp"
"pc.cpp"
"pc_groups.cpp"
"pet.cpp"
"quest.cpp"
"script.cpp"
"searchstore.cpp"
"skill.cpp"
"status.cpp"
"storage.cpp"
"trade.cpp"
"unit.cpp"
"vending.cpp"
"skills/skill.cpp"
"skills/skillrepository.cpp"
"skills/swordsman.cpp"
)
#
# map server
#
if( BUILD_SERVERS )
message( STATUS "Creating target map-server" )
file(GLOB MAP_HEADERS ${MAP_SOURCE_DIR}/*.hpp)
file(GLOB MAP_SOURCES ${MAP_SOURCE_DIR}/*.cpp)
set( DEPENDENCIES common ryml)
set( LIBRARIES ${GLOBAL_LIBRARIES})
set( INCLUDE_DIRS ${GLOBAL_INCLUDE_DIRS} ${COMMON_BASE_INCLUDE_DIRS} ${RA_INCLUDE_DIRS} )
set( DEFINITIONS "${GLOBAL_DEFINITIONS} ${COMMON_BASE_DEFINITIONS}" )
if( WITH_PCRE )
message( STATUS "Enabled PCRE code" )
set( LIBRARIES ${LIBRARIES} ${PCRE_LIBRARIES} )
set( INCLUDE_DIRS ${INCLUDE_DIRS} ${PCRE_INCLUDE_DIRS} )
set( DEFINITIONS "${DEFINITIONS} -DPCRE_SUPPORT" )
else()
message( STATUS "Disabled PCRE code" )
set(MAP_HEADERS
"achievement.hpp"
"atcommand.hpp"
"battleground.hpp"
"battle.hpp"
"buyingstore.hpp"
"cashshop.hpp"
"channel.hpp"
"chat.hpp"
"chrif.hpp"
"clan.hpp"
"clif.hpp"
"clif_obfuscation.hpp"
"clif_packetdb.hpp"
"clif_shuffle.hpp"
"date.hpp"
"duel.hpp"
"elemental.hpp"
"guild.hpp"
"homunculus.hpp"
"instance.hpp"
"intif.hpp"
"itemdb.hpp"
"log.hpp"
"mail.hpp"
"map.hpp"
"mapreg.hpp"
"mercenary.hpp"
"mob.hpp"
"navi.hpp"
"npc.hpp"
"packets.hpp"
"packets_struct.hpp"
"party.hpp"
"path.hpp"
"pc_groups.hpp"
"pc.hpp"
"pet.hpp"
"quest.hpp"
"script_constants.hpp"
"script.hpp"
"searchstore.hpp"
"skill.hpp"
"status.hpp"
"storage.hpp"
"trade.hpp"
"unit.hpp"
"vending.hpp"
)
add_executable(map-server)
target_sources(map-server PRIVATE ${MAP_SOURCES})
if(WIN32)
target_sources(map-server PRIVATE ${MAP_HEADERS})
set_target_properties(map-server PROPERTIES FOLDER "Servers")
endif()
set( SOURCE_FILES ${COMMON_BASE_HEADERS} ${COMMON_HEADERS} ${MAP_HEADERS} ${MAP_SOURCES} )
source_group( common FILES ${COMMON_BASE_HEADERS} ${COMMON_HEADERS} )
source_group( map FILES ${MAP_HEADERS} ${MAP_SOURCES} )
include_directories( ${INCLUDE_DIRS} )
#message( STATUS "map-server SOURCE_FILES=${SOURCE_FILES}")
add_executable( map-server ${SOURCE_FILES} )
#message( STATUS "map-server LIBRARIES=${LIBRARIES}, DEPENDENCIES=${DEPENDENCIES} DEFINITIONS=${DEFINITIONS}")
add_dependencies( map-server ${DEPENDENCIES} )
target_link_libraries( map-server ${LIBRARIES} ${DEPENDENCIES} )
set_target_properties( map-server PROPERTIES COMPILE_FLAGS "${DEFINITIONS}" )
if( INSTALL_COMPONENT_RUNTIME )
cpack_add_component( Runtime_mapserver DESCRIPTION "map-server" DISPLAY_NAME "map-server" GROUP Runtime )
install( TARGETS map-server
DESTINATION "."
COMPONENT Runtime_mapserver )
endif( INSTALL_COMPONENT_RUNTIME )
set( TARGET_LIST ${TARGET_LIST} map-server CACHE INTERNAL "" )
message( STATUS "Creating target map-server - done" )
endif( BUILD_SERVERS )
target_link_libraries(map-server PUBLIC
common
${PCRE_LIBRARIES}
)
target_include_directories(map-server PUBLIC
${PCRE_INCLUDE_DIRS}
)
if(WITH_PCRE)
target_compile_definitions(map-server PUBLIC "-DPCRE_SUPPORT")
endif()
# map-server-generator
add_executable(map-server-generator)
target_sources(map-server-generator PRIVATE ${MAP_SOURCES})
if(WIN32)
target_sources(map-server-generator PRIVATE ${MAP_HEADERS})
set_target_properties(map-server-generator PROPERTIES FOLDER "Tools")
endif()
set_target_properties(map-server-generator PROPERTIES EXCLUDE_FROM_ALL TRUE)
target_compile_definitions(map-server-generator PUBLIC "-DMAP_GENERATOR")
target_link_libraries(map-server-generator PUBLIC
common
json
${PCRE_LIBRARIES}
)
target_include_directories(map-server-generator PUBLIC
${PCRE_INCLUDE_DIRS}
)
if(PCRE_FOUND)
target_compile_definitions(map-server-generator PUBLIC "-DPCRE_SUPPORT")
endif()

View File

@@ -180,7 +180,7 @@ static inline void WBUFPOS(uint8* p, unsigned short pos, short x, short y, unsig
// client-side: x0+=sx0*0.0625-0.5 and y0+=sy0*0.0625-0.5
static inline void WBUFPOS2(uint8* p, unsigned short pos, short x0, short y0, short x1, short y1, uint8 sx0, uint8 sy0) {
static inline void WBUFPOS2(uint8* p, unsigned short pos, short x0, short y0, short x1, short y1, unsigned char sx0, unsigned char sy0) {
p += pos;
p[0] = (uint8)(x0>>2);
p[1] = (uint8)((x0<<6) | ((y0>>4)&0x3f));
@@ -1436,7 +1436,7 @@ static void clif_set_unit_walking( struct block_list& bl, map_session_data* tsd,
p.virtue = (sc) ? sc->opt3 : 0;
p.isPKModeON = (sd && sd->status.karma) ? 1 : 0;
p.sex = vd->sex;
WBUFPOS2(&p.MoveData[0], 0, bl.x, bl.y, ud.to_x, ud.to_y, ud.sx, ud.sy);
WBUFPOS2( &p.MoveData[0], 0, bl.x, bl.y, ud.to_x, ud.to_y, 8, 8 );
p.xSize = p.ySize = (sd) ? 5 : 0;
p.clevel = clif_setlevel( &bl );
#if PACKETVER >= 20080102
@@ -7674,12 +7674,15 @@ void clif_buyvending( map_session_data& sd, uint16 index, uint16 amount, e_pc_pu
/// Show's vending player its list of items for sale.
/// 0a28 <result>.B (ZC_ACK_OPENSTORE2)
void clif_openvending_ack( map_session_data& sd, e_ack_openstore2 result ){
/// result:
/// 0 = Success
/// 1 = Failed
void clif_openvending_ack( map_session_data& sd, bool failure ){
#if PACKETVER >= 20141022
PACKET_ZC_ACK_OPENSTORE2 packet{};
packet.packetType = HEADER_ZC_ACK_OPENSTORE2;
packet.result = static_cast<decltype(packet.result)>(result);
packet.result = failure;
clif_send( &packet, sizeof( packet ), &sd.bl, SELF );
#endif
@@ -7719,7 +7722,7 @@ void clif_openvending( map_session_data& sd ){
clif_send( p, p->packetLength, &sd.bl, SELF );
clif_openvending_ack( sd, OPENSTORE2_SUCCESS );
clif_openvending_ack( sd, false );
}
@@ -19145,9 +19148,6 @@ void clif_buyingstore_trade_failed_seller( map_session_data* sd, short result, t
/// amount of card slots. If the client does not know about the item it
/// cannot be searched.
static void clif_parse_SearchStoreInfo( int fd, map_session_data *sd ){
if (!battle_config.feature_search_stores)
return;
const PACKET_CZ_SEARCH_STORE_INFO* p = reinterpret_cast<PACKET_CZ_SEARCH_STORE_INFO*>( RFIFOP( fd, 0 ) );
// minimum packet length
@@ -19200,9 +19200,6 @@ static void clif_parse_SearchStoreInfo( int fd, map_session_data *sd ){
/// 1 = "next" label to retrieve more results
void clif_search_store_info_ack( map_session_data& sd ){
#if PACKETVER_MAIN_NUM >= 20100817 || PACKETVER_RE_NUM >= 20100706 || defined(PACKETVER_ZERO)
if (!battle_config.feature_search_stores)
return;
uint32 start = sd.searchstore.pages * SEARCHSTORE_RESULTS_PER_PAGE ;
uint32 end = umin( static_cast<uint32>( sd.searchstore.items.size() ), start + SEARCHSTORE_RESULTS_PER_PAGE );
@@ -19263,9 +19260,6 @@ void clif_search_store_info_ack( map_session_data& sd ){
/// 0837 <reason>.B (ZC_SEARCH_STORE_INFO_FAILED)
void clif_search_store_info_failed(map_session_data& sd, e_searchstore_failure reason){
#if PACKETVER_MAIN_NUM >= 20100601 || PACKETVER_RE_NUM >= 20100601 || defined(PACKETVER_ZERO)
if (!battle_config.feature_search_stores)
return;
PACKET_ZC_SEARCH_STORE_INFO_FAILED packet{};
packet.packetType = HEADER_ZC_SEARCH_STORE_INFO_FAILED;
@@ -19278,10 +19272,8 @@ void clif_search_store_info_failed(map_session_data& sd, e_searchstore_failure r
/// Request to display next page of results.
/// 0838 (CZ_SEARCH_STORE_INFO_NEXT_PAGE)
static void clif_parse_SearchStoreInfoNextPage(int fd, map_session_data* sd){
if (!battle_config.feature_search_stores)
return;
static void clif_parse_SearchStoreInfoNextPage(int fd, map_session_data* sd)
{
searchstore_next(*sd);
}
@@ -19290,9 +19282,6 @@ static void clif_parse_SearchStoreInfoNextPage(int fd, map_session_data* sd){
/// 083a <effect>.W <remaining uses>.B (ZC_OPEN_SEARCH_STORE_INFO)
void clif_open_search_store_info(map_session_data& sd){
#if PACKETVER_MAIN_NUM >= 20100701 || PACKETVER_RE_NUM >= 20100701 || defined(PACKETVER_ZERO)
if (!battle_config.feature_search_stores)
return;
PACKET_ZC_OPEN_SEARCH_STORE_INFO packet{};
packet.packetType = HEADER_ZC_OPEN_SEARCH_STORE_INFO;
@@ -19308,10 +19297,8 @@ void clif_open_search_store_info(map_session_data& sd){
/// Request to close the store search window.
/// 083b (CZ_CLOSE_SEARCH_STORE_INFO)
static void clif_parse_CloseSearchStoreInfo(int fd, map_session_data* sd){
if (!battle_config.feature_search_stores)
return;
static void clif_parse_CloseSearchStoreInfo(int fd, map_session_data* sd)
{
searchstore_close(*sd);
}
@@ -19319,9 +19306,6 @@ static void clif_parse_CloseSearchStoreInfo(int fd, map_session_data* sd){
/// Request to invoke catalog effect on a store from search results.
/// 083c <account id>.L <store id>.L <nameid>.W (CZ_SSILIST_ITEM_CLICK)
static void clif_parse_SearchStoreInfoListItemClick( int fd, map_session_data* sd ){
if (!battle_config.feature_search_stores)
return;
const PACKET_CZ_SSILIST_ITEM_CLICK* p = reinterpret_cast<PACKET_CZ_SSILIST_ITEM_CLICK*>( RFIFOP( fd, 0 ) );
searchstore_click( *sd, p->AID, p->storeId, p->itemId );
@@ -19332,9 +19316,6 @@ static void clif_parse_SearchStoreInfoListItemClick( int fd, map_session_data* s
/// 083d <xPos>.W <yPos>.W (ZC_SSILIST_ITEM_CLICK_ACK)
void clif_search_store_info_click_ack(map_session_data& sd, int16 x, int16 y){
#if PACKETVER_MAIN_NUM >= 20100608 || PACKETVER_RE_NUM >= 20100608 || defined(PACKETVER_ZERO)
if (!battle_config.feature_search_stores)
return;
PACKET_ZC_SSILIST_ITEM_CLICK_ACK packet{};
packet.packetType = HEADER_ZC_SSILIST_ITEM_CLICK_ACK;

View File

@@ -639,9 +639,6 @@ enum clif_messages : uint16_t {
// Currently there is no attendance check event.
MSI_CHECK_ATTENDANCE_NOT_EVENT = 3474,
// The total amount of items to sell exceeds the amount of Zeny you can have. \nPlease modify the quantity and price.
MSI_MERCHANTSHOP_TOTA_LOVER_ZENY_ERR = 3826,
// It weighs more than 70%. Decrease the Weight and try again.
MSI_ENCHANT_FAILED_OVER_WEIGHT = 3837,
@@ -787,21 +784,6 @@ enum e_pc_purchase_result_frommc : uint8 {
PURCHASEMC_NO_SALES_INFO = 7,
};
enum e_ack_openstore2 : uint8 {
// Success
OPENSTORE2_SUCCESS = 0,
// (Pop-up) Failed to open stalls. (MSI_MERCHANTSHOP_MAKING_FAIL / 2639)
OPENSTORE2_FAILED = 1,
// 2 is unused
#if PACKETVER >= 20170419
// Unable to open a shop at the current location. (MSI_MERCHANTSHOP_FAIL_POSITION / 3229)
OPENSTORE2_NOVENDING = 3,
#endif
};
enum e_ack_whisper : uint8 {
ACKWHISPER_SUCCESS = 0,
ACKWHISPER_TARGET_OFFLINE = 1,
@@ -1016,7 +998,6 @@ void clif_closevendingboard(struct block_list* bl, int fd);
void clif_vendinglist( map_session_data& sd, map_session_data& vsd );
void clif_buyvending( map_session_data& sd, uint16 index, uint16 amount, e_pc_purchase_result_frommc result );
void clif_openvending( map_session_data& sd );
void clif_openvending_ack(map_session_data& sd, e_ack_openstore2 result);
void clif_vendingreport( map_session_data& sd, uint16 index, uint16 amount, uint32 char_id, int32 zeny );
void clif_movetoattack( map_session_data& sd, block_list& bl );

View File

@@ -1566,7 +1566,7 @@ int mob_unlocktarget(struct mob_data *md, t_tick tick)
break;
default:
mob_stop_attack(md);
unit_stop_walking_soon(md->bl); //Stop chasing.
mob_stop_walking(md,1); //Stop chasing.
if (status_has_mode(&md->status,MD_ANGRY) && !md->state.aggressive)
md->state.aggressive = 1; //Restore angry state when switching to idle
md->state.skillstate = MSS_IDLE;
@@ -1908,8 +1908,6 @@ static bool mob_ai_sub_hard(struct mob_data *md, t_tick tick)
md->state.skillstate = MSS_LOOT;
if (!unit_walktobl(&md->bl, tbl, 0, 0))
mob_unlocktarget(md, tick); //Can't loot...
else
unit_set_target(&md->ud, tbl->id); //Remember current loot target
return true;
}
//Within looting range.

View File

@@ -4028,7 +4028,7 @@ static const char* npc_parse_shop(char* w1, char* w2, char* w3, char* w4, const
break;
}
case NPCTYPE_POINTSHOP: {
if (sscanf(p, ",%31[^,:]:%11d,",point_str,&is_discount) < 1) {
if (sscanf(p, ",%32[^,:]:%11d,",point_str,&is_discount) < 1) {
ShowError("npc_parse_shop: Invalid item cost definition in file '%s', line '%d'. Ignoring the rest of the line...\n * w1=%s\n * w2=%s\n * w3=%s\n * w4=%s\n", filepath, strline(buffer,start-buffer), w1, w2, w3, w4);
return strchr(start,'\n'); // skip and continue
}
@@ -4056,7 +4056,7 @@ static const char* npc_parse_shop(char* w1, char* w2, char* w3, char* w4, const
break;
#endif
default:
if( sscanf( p, ",%31[^,:]:%11d,", point_str, &is_discount ) == 2 ){
if( sscanf( p, ",%32[^,:]:%11d,", point_str, &is_discount ) == 2 ){
is_discount = 1;
}else{
if( !strcasecmp( point_str, "yes" ) ){

View File

@@ -22427,11 +22427,6 @@ BUILDIN_FUNC(buyingstore)
/// searchstores <uses>,<effect>{,<map name>};
BUILDIN_FUNC(searchstores)
{
if (!battle_config.feature_search_stores) {
ShowError("buildin_searchstores: Search stores feature is disabled.\n");
return SCRIPT_CMD_FAILURE;
}
map_session_data* sd;
if( !script_rid2sd(sd) )

View File

@@ -87,7 +87,7 @@ static int searchstore_getstoreid(map_session_data& sd, e_searchstore_searchtype
*/
bool searchstore_open(map_session_data& sd, uint16 uses, e_searchstore_effecttype effect, int16 mapid)
{
if( sd.searchstore.open )
if( !battle_config.feature_search_stores || sd.searchstore.open )
return false;
@@ -121,6 +121,9 @@ void searchstore_query(map_session_data& sd, e_searchstore_searchtype type, unsi
searchstore_searchall_t store_searchall;
time_t querytime;
if( !battle_config.feature_search_stores )
return;
if( !sd.searchstore.open )
return;
@@ -141,22 +144,11 @@ void searchstore_query(map_session_data& sd, e_searchstore_searchtype type, unsi
return;
}
// uses counter must be updated before validating the next search
sd.searchstore.uses--;
sd.searchstore.type = type;
sd.searchstore.nextquerytime = querytime + battle_config.searchstore_querydelay;
// drop previous results
searchstore_clear(sd);
// validate lists
for( i = 0; i < item_count; i++ ) {
if( !item_db.exists(itemlist[i].itemId) ) {
ShowWarning("searchstore_query: Client resolved item %u is not known.\n", itemlist[i].itemId);
clif_search_store_info_failed(sd, SSI_FAILED_NOTHING_SEARCH_ITEM);
// update uses
clif_search_store_info_ack(sd);
return;
}
}
@@ -164,9 +156,6 @@ void searchstore_query(map_session_data& sd, e_searchstore_searchtype type, unsi
if( !item_db.exists(cardlist[i].itemId) ) {
ShowWarning("searchstore_query: Client resolved card %u is not known.\n", cardlist[i].itemId);
clif_search_store_info_failed(sd, SSI_FAILED_NOTHING_SEARCH_ITEM);
// update uses
clif_search_store_info_ack(sd);
return;
}
}
@@ -174,6 +163,13 @@ void searchstore_query(map_session_data& sd, e_searchstore_searchtype type, unsi
if( max_price < min_price )
std::swap(min_price, max_price);
sd.searchstore.uses--;
sd.searchstore.type = type;
sd.searchstore.nextquerytime = querytime+battle_config.searchstore_querydelay;
// drop previous results
searchstore_clear(sd);
// search
s.search_sd = &sd;
s.itemlist = itemlist;
@@ -211,11 +207,11 @@ void searchstore_query(map_session_data& sd, e_searchstore_searchtype type, unsi
// cleanup
searchstore_clear(sd);
// notify of failure (must go before updating uses)
clif_search_store_info_failed(sd, SSI_FAILED_NOTHING_SEARCH_ITEM);
// update uses
clif_search_store_info_ack( sd );
// notify of failure
clif_search_store_info_failed(sd, SSI_FAILED_NOTHING_SEARCH_ITEM);
}
}
@@ -238,7 +234,7 @@ bool searchstore_querynext(map_session_data& sd)
*/
void searchstore_next(map_session_data& sd)
{
if( !sd.searchstore.open || sd.searchstore.items.size() <= sd.searchstore.pages*SEARCHSTORE_RESULTS_PER_PAGE ) // nothing (more) to display
if( !battle_config.feature_search_stores || !sd.searchstore.open || sd.searchstore.items.size() <= sd.searchstore.pages*SEARCHSTORE_RESULTS_PER_PAGE ) // nothing (more) to display
return;
// present results
@@ -287,7 +283,7 @@ void searchstore_click(map_session_data& sd, uint32 account_id, int store_id, t_
map_session_data* pl_sd;
searchstore_search_t store_search;
if( !sd.searchstore.open || sd.searchstore.items.empty() )
if( !battle_config.feature_search_stores || !sd.searchstore.open || sd.searchstore.items.empty() )
return;
searchstore_clearremote(sd);

File diff suppressed because it is too large Load Diff

53
src/map/skills/skill.cpp Normal file
View File

@@ -0,0 +1,53 @@
// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
// For more information, see LICENCE in the main folder
#include <common/showmsg.hpp>
#include "skill.hpp"
#include "map/battle.hpp"
#include "map/skill.hpp"
#include "map/clif.hpp"
#include "map/map.hpp"
#include "map/status.hpp"
uint16_t Skill::getSkillId() const {
return skill_id_;
}
int Skill::castendDamageImpl(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int flag) const {
throw SkillNotImplementedException(skill_id_);
}
int Skill::castendNoDamageImpl(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int flag) const {
throw SkillNotImplementedException(skill_id_);
}
int Skill::castendPositionImpl() const {
throw SkillNotImplementedException(skill_id_);
}
int Skill::castendDamage(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int flag) const {
try {
return castendDamageImpl(src, target, skill_lv, tick, flag);
} catch (SkillNotImplementedException e) {
ShowWarning("castendDamage: %s\n", e.what());
clif_skill_damage(src, target, tick, status_get_amotion(src), status_get_status_data(target)->dmotion, 0, abs(skill_get_num(skill_id_, skill_lv)), skill_id_, skill_lv, skill_get_hit(skill_id_));
return 1;
}
}
int Skill::castendNoDamage(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int flag) const {
try {
return castendNoDamageImpl(src, target, skill_lv, tick, flag);
} catch (SkillNotImplementedException e) {
ShowWarning("castendNoDamage: %s\n", e.what());
clif_skill_damage(src, target, tick, status_get_amotion(src), status_get_status_data(target)->dmotion, 0, abs(skill_get_num(skill_id_, skill_lv)), skill_id_, skill_lv, skill_get_hit(skill_id_));
return 1;
}
}
int WeaponSkill::castendDamageImpl(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int flag) const {
skill_attack(BF_WEAPON, src, src, target, skill_id_, skill_lv, tick, flag);
return 0;
};

43
src/map/skills/skill.hpp Normal file
View File

@@ -0,0 +1,43 @@
// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
// For more information, see LICENCE in the main folder
#ifndef MAP_SKILL_HPP
#define MAP_SKILL_HPP
#include <array>
#include <string>
#include "map/skill.hpp"
class SkillNotImplementedException : public std::logic_error {
public:
explicit SkillNotImplementedException(const std::string &what_arg) : std::logic_error(what_arg) {};
explicit SkillNotImplementedException(uint16_t skill_id) : std::logic_error("Skill " + std::to_string(skill_id) + " not implemented") {};
};
class Skill {
public:
uint16_t getSkillId() const;
virtual ~Skill() = default;
explicit Skill(e_skill skillid) : skill_id_(static_cast<uint16_t>(skillid)) {};
int castendDamage(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int flag) const;
int castendNoDamage(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int flag) const;
protected:
virtual int castendDamageImpl(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int flag) const;
virtual int castendNoDamageImpl(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int flag) const;
virtual int castendPositionImpl() const;
uint16_t skill_id_;
};
class WeaponSkill : public Skill {
public:
explicit WeaponSkill(e_skill skill_id) : Skill(skill_id) {};
protected:
virtual int castendDamageImpl(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int flag) const override;
};
#endif // MAP_SKILL_HPP

View File

@@ -0,0 +1,25 @@
// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
// For more information, see LICENCE in the main folder
#include "skillrepository.hpp"
#include "swordsman.hpp"
#include <memory>
SkillRepository skillRepository;
const Skill& SkillRepository::getSkill(e_skill skill_id) {
auto skill = skill_db_.find(skill_id);
if (skill == skill_db_.end()) {
throw SkillNotFoundException{};
}
return *skill->second;
}
void SkillRepository::addSkill(e_skill skill_id, std::unique_ptr<Skill> skill) {
skill_db_.emplace(skill_id, std::move(skill));
}
void init_skill_repository() {
init_swordsman_skills(skillRepository);
}

View File

@@ -0,0 +1,25 @@
// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
// For more information, see LICENCE in the main folder
#pragma once
#include <memory>
#include "skill.hpp"
#include "map/skill.hpp"
class SkillRepository {
public:
class SkillNotFoundException : public std::exception {};
const Skill& getSkill(e_skill skill_id);
void addSkill(e_skill skill_id, std::unique_ptr<Skill> skill);
private:
std::unordered_map<e_skill, std::unique_ptr<Skill>> skill_db_;
};
extern SkillRepository skillRepository;
void init_skill_repository();

View File

@@ -0,0 +1,56 @@
#include "swordsman.hpp"
#include "skillrepository.hpp"
#include "map/battle.hpp"
#include "map/clif.hpp"
#include "map/mob.hpp"
#include "map/skill.hpp"
#include "map/status.hpp"
#include "map/unit.hpp"
Provoke::Provoke() : Skill(e_skill::SM_PROVOKE) {};
int Provoke::castendNoDamageImpl(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int flag) const {
status_data *target_status = status_get_status_data(target);
if (status_has_mode(target_status, MD_STATUSIMMUNE) || battle_check_undead(target_status->race, target_status->def_ele)) {
return 1;
}
map_session_data *sd = BL_CAST(BL_PC, src);
mob_data *target_md = BL_CAST(BL_MOB, target);
sc_type type = skill_get_sc(skill_id_);
// official chance is 70% + 3% per skill level + srcBaseLevel% - targetBaseLevel%
int chance = 70 + 3 * skill_lv + status_get_lv(src) - status_get_lv(target);
int i = sc_start(src, target, type, skill_id_ == SM_SELFPROVOKE ? 100 : chance, skill_lv, skill_get_time(skill_id_, skill_lv));
if (!i) {
if (sd) {
clif_skill_fail(*sd, skill_id_);
}
return 0;
}
clif_skill_nodamage(src, target, skill_id_ == SM_SELFPROVOKE ? SM_PROVOKE : skill_id_, skill_lv, i);
unit_skillcastcancel(target, 2);
if (target_md) {
target_md->state.provoke_flag = src->id;
mob_target(target_md, src, skill_get_range2(src, skill_id_, skill_lv, true));
}
// Provoke can cause Coma even though it's a nodamage skill
if (sd && battle_check_coma(*sd, *target, BF_MISC)) {
status_change_start(src, target, SC_COMA, 10000, skill_lv, 0, src->id, 0, 0, SCSTART_NONE);
}
return 0;
}
void init_swordsman_skills(SkillRepository& repo) {
repo.addSkill(e_skill::SM_BASH, std::make_unique<WeaponSkill>(e_skill::SM_BASH));
repo.addSkill(e_skill::SM_PROVOKE, std::make_unique<Provoke>());
}

View File

@@ -0,0 +1,12 @@
#pragma once
#include "skillrepository.hpp"
class Provoke : public Skill {
public:
Provoke();
virtual int castendNoDamageImpl(block_list *src, block_list *target, uint16 skill_lv, t_tick tick, int flag) const override;
};
void init_swordsman_skills(SkillRepository& repo);

View File

@@ -397,9 +397,6 @@ static TIMER_FUNC(unit_walktoxy_timer)
}
ud->walktimer = INVALID_TIMER;
// As movement to next cell finished, set sub-cell position to center
ud->sx = 8;
ud->sy = 8;
if (bl->prev == nullptr)
return 0; // Stop moved because it is missing from the block_list
@@ -1407,78 +1404,6 @@ int unit_warp(struct block_list *bl,short m,short x,short y,clr_type type)
return 0;
}
/**
* Updates the walkpath of a unit to end after 0.5-1.5 cells moved
* Sends required packet for proper display on the client using subcoordinates
* @param bl: Object to stop walking
*/
void unit_stop_walking_soon(struct block_list& bl)
{
struct unit_data* ud = unit_bl2ud(&bl);
if (ud == nullptr)
return;
if (ud->walktimer == INVALID_TIMER)
return;
if (ud->walkpath.path_pos + 1 >= ud->walkpath.path_len)
return;
const struct TimerData* td = get_timer(ud->walktimer);
if (td == nullptr)
return;
// Get how much percent we traversed on the timer
double cell_percent = 1.0 - ((double)DIFF_TICK(td->tick, gettick()) / (double)td->data);
short ox = bl.x, oy = bl.y; // Remember original x and y coordinates
short path_remain = 1; // Remaining path to walk
if (cell_percent > 0.0 && cell_percent < 1.0) {
// Set subcell coordinates according to timer
// This gives a value between 8 and 39
ud->sx = static_cast<decltype(ud->sx)>(24.0 + dirx[ud->walkpath.path[ud->walkpath.path_pos]] * 16.0 * cell_percent);
ud->sy = static_cast<decltype(ud->sy)>(24.0 + diry[ud->walkpath.path[ud->walkpath.path_pos]] * 16.0 * cell_percent);
// 16-31 reflect sub position 0-15 on the current cell
// 8-15 reflect sub position 8-15 at -1 main coordinate
// 32-39 reflect sub position 0-7 at +1 main coordinate
if (ud->sx < 16 || ud->sy < 16 || ud->sx > 31 || ud->sy > 31) {
path_remain = 2;
if (ud->sx < 16) bl.x--;
if (ud->sy < 16) bl.y--;
if (ud->sx > 31) bl.x++;
if (ud->sy > 31) bl.y++;
}
ud->sx %= 16;
ud->sy %= 16;
}
else if (cell_percent >= 1.0) {
// Assume exactly one cell moved
bl.x += dirx[ud->walkpath.path[ud->walkpath.path_pos]];
bl.y += diry[ud->walkpath.path[ud->walkpath.path_pos]];
path_remain = 2;
}
// Shorten walkpath
if (ud->walkpath.path_pos + path_remain < ud->walkpath.path_len) {
ud->walkpath.path_len = ud->walkpath.path_pos + path_remain;
ud->to_x = ox;
ud->to_y = oy;
for (int i = 0; i < path_remain; i++) {
ud->to_x += dirx[ud->walkpath.path[ud->walkpath.path_pos + i]];
ud->to_y += diry[ud->walkpath.path[ud->walkpath.path_pos + i]];
}
// Send movement packet with calculated coordinates and subcoordinates
clif_move(*ud);
}
// Reset coordinates
bl.x = ox;
bl.y = oy;
ud->sx = 8;
ud->sy = 8;
}
/**
* Stops a unit from walking
* @param bl: Object to stop walking
@@ -1521,12 +1446,8 @@ int unit_stop_walking(struct block_list *bl,int type)
unit_walktoxy_timer(INVALID_TIMER, tick, bl->id, ud->walkpath.path_pos);
}
if (type&USW_FIXPOS) {
// Stop on cell center
ud->sx = 8;
ud->sy = 8;
clif_fixpos(*bl);
}
if(type&USW_FIXPOS)
clif_fixpos( *bl );
ud->walkpath.path_len = 0;
ud->walkpath.path_pos = 0;
@@ -3093,8 +3014,6 @@ void unit_dataset(struct block_list *bl)
ud->attackabletime =
ud->canact_tick =
ud->canmove_tick = gettick();
ud->sx = 8;
ud->sy = 8;
}
/**

View File

@@ -27,7 +27,6 @@ struct unit_data {
struct skill_unit_group_tickset skillunittick[MAX_SKILLUNITGROUPTICKSET];
short attacktarget_lv;
short to_x, to_y;
uint8 sx, sy; // Subtile position (0-15, with 8 being center of cell)
short skillx, skilly;
uint16 skill_id, skill_lv;
int skilltarget;
@@ -115,7 +114,6 @@ int unit_calc_pos(struct block_list *bl, int tx, int ty, uint8 dir);
TIMER_FUNC(unit_delay_walktoxy_timer);
TIMER_FUNC(unit_delay_walktobl_timer);
void unit_stop_walking_soon(struct block_list& bl);
// Causes the target object to stop moving.
int unit_stop_walking(struct block_list *bl,int type);
bool unit_can_move(struct block_list *bl);

View File

@@ -175,7 +175,7 @@ void vending_purchasereq(map_session_data* sd, int aid, int uid, const uint8* da
clif_buyvending( *sd, idx, amount, PURCHASEMC_NO_ZENY ); // you don't have enough zeny
return;
}
if( z + (double)vsd->status.zeny > (double)MAX_ZENY ) {
if( z + (double)vsd->status.zeny > (double)MAX_ZENY && !battle_config.vending_over_max ) {
clif_buyvending( *sd, idx, vsd->vending[j].amount, PURCHASEMC_OUT_OF_STOCK ); // too much zeny = overflow
return;
@@ -310,18 +310,12 @@ int8 vending_openvending( map_session_data& sd, const char* message, const uint8
// skill level and cart check
if( !vending_skill_lvl || !pc_iscarton(&sd) ) {
clif_skill_fail( sd, MC_VENDING );
sd.state.prevend = 0;
sd.state.workinprogress = WIP_DISABLE_NONE;
clif_openvending_ack( sd, OPENSTORE2_FAILED );
return 2;
}
// check number of items in shop
if( count < 1 || count > MAX_VENDING || count > 2 + vending_skill_lvl ) { // invalid item count
clif_skill_fail( sd, MC_VENDING );
sd.state.prevend = 0;
sd.state.workinprogress = WIP_DISABLE_NONE;
clif_openvending_ack( sd, OPENSTORE2_FAILED );
return 3;
}
@@ -330,7 +324,6 @@ int8 vending_openvending( map_session_data& sd, const char* message, const uint8
// filter out invalid items
i = 0;
int64 total = 0;
for( j = 0; j < count; j++ ) {
short index = *(uint16*)(data + 8*j + 0);
short amount = *(uint16*)(data + 8*j + 2);
@@ -351,36 +344,17 @@ int8 vending_openvending( map_session_data& sd, const char* message, const uint8
sd.vending[i].index = index;
sd.vending[i].amount = amount;
sd.vending[i].value = min(value, (unsigned int)battle_config.vending_max_value);
total += static_cast<int64>(sd.vending[i].value) * amount;
i++; // item successfully added
}
// check if the total value of the items plus the current zeny is over the limit
if ( !battle_config.vending_over_max && (static_cast<int64>(sd.status.zeny) + total) > MAX_ZENY ) {
#if PACKETVER >= 20200819
clif_msg_color( &sd, MSI_MERCHANTSHOP_TOTA_LOVER_ZENY_ERR, color_table[COLOR_RED] );
#endif
clif_skill_fail( sd, MC_VENDING );
sd.state.prevend = 0;
sd.state.workinprogress = WIP_DISABLE_NONE;
clif_openvending_ack( sd, OPENSTORE2_FAILED );
return 1;
}
if (i != j) {
clif_displaymessage(sd.fd, msg_txt(&sd, 266)); //"Some of your items cannot be vended and were removed from the shop."
clif_skill_fail( sd, MC_VENDING ); // custom reply packet
sd.state.prevend = 0;
sd.state.workinprogress = WIP_DISABLE_NONE;
clif_openvending_ack( sd, OPENSTORE2_FAILED );
return 5;
}
if( i == 0 ) { // no valid item found
clif_skill_fail( sd, MC_VENDING ); // custom reply packet
sd.state.prevend = 0;
sd.state.workinprogress = WIP_DISABLE_NONE;
clif_openvending_ack( sd, OPENSTORE2_FAILED );
return 5;
}

View File

@@ -1,80 +1,41 @@
# Define the tools interface library, all tools will inherit properties
add_library(tools INTERFACE)
target_include_directories(tools INTERFACE
${YAML_INCLUDE_DIRS}
${ZLIB_INCLUDE_DIRS}
${RA_INCLUDE_DIRS}
)
target_sources(tools INTERFACE
"${COMMON_SOURCE_DIR}/utils.cpp"
"${COMMON_SOURCE_DIR}/des.cpp"
"${COMMON_SOURCE_DIR}/grfio.cpp"
"${COMMON_SOURCE_DIR}/nullpo.cpp"
"${COMMON_SOURCE_DIR}/database.cpp"
)
target_compile_definitions(tools INTERFACE
"MINICORE"
)
target_link_libraries(tools INTERFACE
${GLOBAL_LIBRARIES}
${ZLIB_LIBRARIES}
yaml-cpp
ryml
minicore
)
# mapcache
message( STATUS "Creating target mapcache" )
add_executable(mapcache)
target_link_libraries(mapcache PRIVATE tools)
target_link_libraries(mapcache PRIVATE minicore)
target_sources(mapcache PRIVATE "mapcache.cpp")
set_target_properties(mapcache PROPERTIES EXCLUDE_FROM_ALL TRUE)
if(WIN32)
set_target_properties(mapcache PROPERTIES FOLDER "Tools")
endif()
# csv2yaml
message( STATUS "Creating target csv2yaml" )
add_executable(csv2yaml)
target_link_libraries(csv2yaml PRIVATE tools)
target_link_libraries(csv2yaml PRIVATE minicore)
target_sources(csv2yaml PRIVATE "csv2yaml.cpp")
set_target_properties(csv2yaml PROPERTIES EXCLUDE_FROM_ALL TRUE)
if(WIN32)
set_target_properties(csv2yaml PROPERTIES FOLDER "Tools")
target_sources(csv2yaml PRIVATE
"csv2yaml.hpp"
"yaml.hpp"
)
endif()
# yaml2sql
message( STATUS "Creating target yaml2sql" )
add_executable(yaml2sql)
target_link_libraries(yaml2sql PRIVATE tools)
target_link_libraries(yaml2sql PRIVATE minicore)
target_sources(yaml2sql PRIVATE "yaml2sql.cpp")
set_target_properties(yaml2sql PROPERTIES EXCLUDE_FROM_ALL TRUE)
if(WIN32)
set_target_properties(yaml2sql PROPERTIES FOLDER "Tools")
endif()
# yamlupgrade
message( STATUS "Creating target yamlupgrade" )
add_executable(yamlupgrade)
target_link_libraries(yamlupgrade PRIVATE tools)
target_link_libraries(yamlupgrade PRIVATE minicore)
target_sources(yamlupgrade PRIVATE "yamlupgrade.cpp")
set_target_properties(yamlupgrade PROPERTIES EXCLUDE_FROM_ALL TRUE)
if(WIN32)
set_target_properties(yamlupgrade PROPERTIES FOLDER "Tools")
target_sources(yamlupgrade PRIVATE
"yamlupgrade.hpp"
"yaml.hpp"
)
endif()
set( TARGET_LIST ${TARGET_LIST} mapcache csv2yaml yaml2sql yamlupgrade CACHE INTERNAL "" )
if( INSTALL_COMPONENT_RUNTIME )
cpack_add_component( Runtime_mapcache DESCRIPTION "mapcache generator" DISPLAY_NAME "mapcache" GROUP Runtime )
install( TARGETS mapcache
DESTINATION "."
COMPONENT Runtime_mapcache
)
cpack_add_component( Runtime_csv2yaml DESCRIPTION "yaml converter" DISPLAY_NAME "csv2yaml" GROUP Runtime )
install( TARGETS csv2yaml
DESTINATION "."
COMPONENT Runtime_csv2yaml
)
cpack_add_component( Runtime_yaml2sql DESCRIPTION "sql converter" DISPLAY_NAME "yaml2sql" GROUP Runtime )
install( TARGETS yaml2sql
DESTINATION "."
COMPONENT Runtime_yaml2sql
)
cpack_add_component( Runtime_yamlupgrade DESCRIPTION "yaml upgrader" DISPLAY_NAME "yamlupgrade" GROUP Runtime )
install( TARGETS yamlupgrade
DESTINATION "."
COMPONENT Runtime_yamlupgrade
)
install (TARGETS )
endif( INSTALL_COMPONENT_RUNTIME )
add_custom_target(tools DEPENDS mapcache csv2yaml yaml2sql yamlupgrade map-server-generator)

Some files were not shown because too many files have changed in this diff Show More