45 Commits

Author SHA1 Message Date
eafbee616f english locale as base 2024-04-06 17:58:03 +02:00
026cb861a8 fix missing quote mark 2024-04-06 17:57:30 +02:00
1ba21fb1f9 translate remaining SPDLOG calls 2024-04-06 17:57:14 +02:00
8fede9a1df manual translation of non-localized strings 2024-04-06 17:28:22 +02:00
dfb3d08998 manual translation of non-localized strings 2024-04-06 12:50:34 +02:00
326c134f9e manual translation of non-localized strings 2024-04-06 11:13:11 +02:00
9b7536ee9a Initial pass of converting string literals to english 2024-04-06 10:31:54 +02:00
9056f6c6c6 convert some more comments to utf8 2024-04-06 10:24:46 +02:00
8685b02fdc libthecore encoding conversion 2024-04-06 10:20:42 +02:00
341bef9aba Merge branch 'nightly' into comment-encoding 2024-04-06 01:09:03 +02:00
8a1acefeeb move encoding tool to separate repo 2024-04-06 00:42:30 +02:00
eacc808366 convert comments to utf-8 2024-04-05 23:34:45 +02:00
4a1460f36e convert korean characters in string literals to string encoded bytes 2024-04-05 22:24:46 +02:00
aae9b169df encoding fix script 2024-04-05 21:57:49 +02:00
dd74eafc24 fix db cpp encoding 2024-04-01 14:20:00 +02:00
d471d99a24 fix libthecore header encoding 2024-04-01 12:48:58 +02:00
350fb0d424 fix libsql header encoding 2024-04-01 12:48:16 +02:00
869720f9e6 fix libgame header encoding 2024-04-01 12:46:52 +02:00
4fc612552a fix common header encoding 2024-04-01 12:45:35 +02:00
248205ae01 fix db header encoding 2024-04-01 12:43:31 +02:00
82317e6c4d fix game header encoding 2024-04-01 12:39:34 +02:00
847ab2ef89 Fixed erroneous database table parsing due to incorrect SMS phone number removal 2024-03-31 15:30:43 +03:00
ebc479b7df Fixed "Invalid Socket Count 3, set to maximum" error 2024-03-31 09:09:35 +03:00
1ee687f269 Removed unused PROTECT_CHILD_FOR_NEWCIBN 2024-03-31 08:54:34 +03:00
d85ef28eac Removed messenger SMS 2024-03-30 21:14:50 +02:00
01cc27a7df Removed Billing/VCard 2024-03-30 19:58:21 +02:00
72b495c03c Removed PCBang/iCafe code 2024-03-30 18:55:44 +02:00
0c86f802ca Removed unused highscore Lua & DB functions 2024-03-30 18:06:36 +02:00
05a1406c7c Removed database strings and automatic greeting 2024-03-30 17:50:04 +02:00
00c5634c09 Removed country blocking (and exceptions) 2024-03-30 17:09:03 +02:00
42079d56b7 Removed hotbackup 2024-03-30 16:57:24 +02:00
0101618d89 Fixed sectree not found while loading guild buildings 2024-03-25 07:01:22 +02:00
8579828ca6 Implemented official level update fix 2024-03-11 18:08:24 +02:00
3f1ce57fa1 Enforced signed datatypes for char variables, fixing ARM builds 2024-03-03 19:10:49 +02:00
e4cbdcfc4d Remove hardcoded CMake debug flag. Closes #12 2024-03-03 19:03:53 +02:00
bba0294107 Merge pull request 'Refactored the logging code' (#14) from log-rewrite into master
Reviewed-on: metin2/server#14
2024-03-03 19:02:05 +02:00
0aab8162fb Merge branch 'master' into log-rewrite 2024-03-03 18:59:23 +02:00
9fba85f947 Updated README.md with the latest changes 2024-03-03 18:55:48 +02:00
a7f4e4e54d Rewrote the log initialization functions, logs are now saved in rotating files, implemented configurable log levels 2024-03-03 18:51:51 +02:00
7e543bd05f Merge pull request 'fix arm/aarch64 builds.' (#13) from NycuRO/server:fix-arm-aarch into master
Reviewed-on: metin2/server#13
2024-01-09 20:59:11 +02:00
405b05fe59 fix arm/aarch64 builds. 2024-01-09 18:26:50 +02:00
feac4c0598 Applied changes on the db executable. Removed old logging functions. Various global changes. 2024-01-07 22:05:51 +02:00
2f829ae2dc Applied changes on the game executable. 2023-12-31 12:26:59 +02:00
2c8cb0c857 Made a small-scale test with the spdlog library. Incidentally added fmt. 2023-12-30 10:30:52 +02:00
fc3f2f232c CMake build system updates, the docker image automatically compiles quests at build 2023-12-10 10:00:55 +02:00
332 changed files with 9543 additions and 28510 deletions

View File

@ -5,5 +5,14 @@ cmake-build-release/
# Dockerfile (in order to allow changes without rebuilding)
Dockerfile
# Git files
.gitignore
.gitkeep
# Compiled quests
gamefiles/locale/english/quest/object/
gamefiles/locale/english/quest/pre_qc/
gamefiles/locale/english/quest/qc
# Test folder
test/

3
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,3 @@
{
"cmake.configureOnOpen": true
}

View File

@ -1,8 +1,5 @@
cmake_minimum_required(VERSION 3.12)
# Build mode debug/release?
set(CMAKE_BUILD_TYPE Debug)
# Set C++ standard to C++17
set(CMAKE_CXX_STANDARD 17)
@ -23,15 +20,14 @@ set(METIN2_COMPILER "${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}")
set(METIN2_CPU_TARGET ${CMAKE_SYSTEM_PROCESSOR})
# Git revision
include(FindGit)
find_package(Git)
find_package(GitInfo)
if(GIT_FOUND)
GIT_WC_INFO(${PROJECT_SOURCE_DIR} Metin2)
set(METIN2_REVISION ${Metin2_WC_REVISION_NAME})
set(METIN2_REVISION ${Metin2_WC_REVISION_HASH})
set(METIN2_LAST_CHANGED_DATE ${Metin2_WC_LAST_CHANGED_DATE})
if (${Metin2_WC_LATEST_TAG} NOT STREQUAL "")
if (Metin2_WC_LATEST_TAG)
set(METIN2_LATEST_TAG ${Metin2_WC_LATEST_TAG})
else()
set(METIN2_LATEST_TAG "unknown")

View File

@ -3,16 +3,20 @@ WORKDIR /app
# Update the system and install various dependencies
RUN apt-get update && \
apt-get install -y git cmake build-essential tar curl zip unzip pkg-config autoconf python3 \
apt-get install -y git cmake ninja-build build-essential tar curl zip unzip pkg-config autoconf python3 \
libdevil-dev libncurses5-dev libbsd-dev
# Arm specific
ENV VCPKG_FORCE_SYSTEM_BINARIES=1
# Install vcpkg and the required libraries
RUN git clone https://github.com/Microsoft/vcpkg.git
RUN bash ./vcpkg/bootstrap-vcpkg.sh
RUN ./vcpkg/vcpkg install boost-system cryptopp effolkronium-random libmysql libevent lzo
RUN ./vcpkg/vcpkg install boost-system cryptopp effolkronium-random libmysql libevent lzo fmt spdlog
COPY . .
# Build the binaries
RUN mkdir build/
RUN cd build && cmake -DCMAKE_TOOLCHAIN_FILE=vcpkg/scripts/buildsystems/vcpkg.cmake ..
RUN cd build && make -j $(nproc)
@ -20,16 +24,19 @@ RUN cd build && make -j $(nproc)
FROM ubuntu:latest as app
WORKDIR /app
RUN apt-get update && apt-get install -y libdevil-dev libbsd-dev && apt-get clean
RUN apt-get update && apt-get install -y python2 libdevil-dev libbsd-dev && apt-get clean
# Copy the binaries from the build stage
COPY --from=build /app/build/src/db/db /bin/db
COPY --from=build /app/build/src/game/game /bin/game
COPY --from=build /app/build/src/quest/quest /bin/quest
COPY --from=build /app/build/src/quest/qc /bin/qc
# Copy the game files
COPY ./gamefiles/ .
# Compile the quests
RUN cd /app/locale/english/quest && python2 make.py
# Symlink the configuration files
RUN ln -s "./conf/CMD" "CMD"
RUN ln -s ./conf/item_names_en.txt item_names.txt

View File

@ -39,7 +39,7 @@ Install `vcpkg` according to the [lastest instructions](https://vcpkg.io/en/gett
Build and install the required libraries:
```shell
vcpkg install boost-system cryptopp effolkronium-random libmysql libevent lzo
vcpkg install boost-system cryptopp effolkronium-random libmysql libevent lzo fmt spdlog
```
Then, it's time to build your binaries. Your commands should look along the lines of:
@ -80,6 +80,7 @@ goodies you wish. Also, a lot of time.
- Switched to the [effolkronium/random PRNG](https://github.com/effolkronium/random) instead of the standard C functions.
- Refactored macros to modern C++ functions.
- Network settings are manually configurable through the `PUBLIC_IP`, `PUBLIC_BIND_IP`, `INTERNAL_IP`, `INTERNAL_BIND_IP` settings in the `CONFIG` file. (Might need further work)
- Refactored logging to use [spdlog](https://github.com/gabime/spdlog) for more consistent function calls.
## 4. Bugfixes
**WARNING: This project is based on the "kraizy" leak. That was over 10 years ago.
@ -88,6 +89,7 @@ This is a very serious security risk and one of the reasons this project is stil
### Gameplay
- Fixed invisibility bug on login/respawn/teleport etc.
- Fixed player level not updating [(thread)](https://metin2.dev/topic/30612-official-level-update-fix-reversed/)
### Exploits
- See the warning above :(
@ -102,7 +104,6 @@ This is a very serious security risk and one of the reasons this project is stil
- Migrate `conf.txt` and `CONFIG` to a modern dotenv-like format, which would enable pretty nice Docker images.
- Add a health check to the Docker image.
- Use the [fmt](https://fmt.dev/latest/index.html) library for safe and modern string formatting.
- Use a modern logging library to clean up the current mess.
- Handle kernel signals (SIGTERM, SIGHUP etc.) for gracefully shutting down the game server.
- Improve memory safety.
- Use fixed width integer types instead of Microsoft-style typedefs.

View File

@ -1,176 +0,0 @@
################################################################################
#
# Program: 3D Slicer
#
# Copyright (c) Kitware Inc.
#
# See COPYRIGHT.txt
# or http://www.slicer.org/copyright/copyright.txt for details.
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# This file was originally developed by Jean-Christophe Fillion-Robin, Kitware Inc.
# and was partially funded by NIH grant 3P41RR013218-12S1
#
################################################################################
#
# The module defines the following variables:
# GIT_EXECUTABLE - path to git command line client
# GIT_FOUND - true if the command line client was found
# GIT_VERSION_STRING - the version of git found (since CMake 2.8.8)
#
# If the command line client executable is found the macro
# GIT_WC_INFO(<dir> <var-prefix>)
# is defined to extract information of a git working copy at
# a given location.
#
# The macro defines the following variables:
# <var-prefix>_WC_REVISION_HASH - Current SHA1 hash
# <var-prefix>_WC_REVISION - Current SHA1 hash
# <var-prefix>_WC_REVISION_NAME - Name associated with <var-prefix>_WC_REVISION_HASH
# <var-prefix>_WC_URL - output of command `git config --get remote.origin.url'
# <var-prefix>_WC_ROOT - Same value as working copy URL
# <var-prefix>_WC_LAST_CHANGED_DATE - date of last commit
# <var-prefix>_WC_GITSVN - Set to false
#
# ... and also the following ones if it's a git-svn repository:
# <var-prefix>_WC_GITSVN - Set to True if it is a
# <var-prefix>_WC_INFO - output of command `git svn info'
# <var-prefix>_WC_URL - url of the associated SVN repository
# <var-prefix>_WC_ROOT - root url of the associated SVN repository
# <var-prefix>_WC_REVISION - current SVN revision number
# <var-prefix>_WC_LAST_CHANGED_AUTHOR - author of last commit
# <var-prefix>_WC_LAST_CHANGED_DATE - date of last commit
# <var-prefix>_WC_LAST_CHANGED_REV - revision of last commit
# <var-prefix>_WC_LAST_CHANGED_LOG - last log of base revision
#
# Example usage:
# find_package(Git)
# if(GIT_FOUND)
# GIT_WC_INFO(${PROJECT_SOURCE_DIR} Project)
# message("Current revision is ${Project_WC_REVISION_HASH}")
# message("git found: ${GIT_EXECUTABLE}")
# endif()
#
# Look for 'git' or 'eg' (easy git)
#
set(git_names git eg)
# Prefer .cmd variants on Windows unless running in a Makefile
# in the MSYS shell.
#
if(WIN32)
if(NOT CMAKE_GENERATOR MATCHES "MSYS")
# Note: Due to a bug in 'git.cmd' preventing it from returning the exit code of 'git',
# we excluded it from the list of executables to search.
# See http://code.google.com/p/msysgit/issues/detail?id=428
# TODO Check if 'git' exists, get the associated version, if the corresponding version
# is known to have a working version of 'git.cmd', use it.
set(git_names git eg.cmd eg)
endif()
endif()
find_program(GIT_EXECUTABLE ${git_names}
PATHS
"C:/Program Files/Git/bin"
"C:/Program Files (x86)/Git/bin"
DOC "git command line client")
# XXX Comment to workaround https://gitlab.kitware.com/cmake/cmake/issues/15448
# mark_as_advanced(GIT_EXECUTABLE)
if(GIT_EXECUTABLE)
execute_process(COMMAND ${GIT_EXECUTABLE} --version
OUTPUT_VARIABLE git_version
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
if (git_version MATCHES "^git version [0-9]")
string(REPLACE "git version " "" GIT_VERSION_STRING "${git_version}")
endif()
unset(git_version)
macro(GIT_WC_INFO dir prefix)
execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --verify -q --short=7 HEAD
WORKING_DIRECTORY ${dir}
ERROR_VARIABLE GIT_error
OUTPUT_VARIABLE ${prefix}_WC_REVISION_HASH
OUTPUT_STRIP_TRAILING_WHITESPACE)
set(${prefix}_WC_REVISION ${${prefix}_WC_REVISION_HASH})
if(NOT ${GIT_error} EQUAL 0)
message(SEND_ERROR "Command \"${GIT_EXECUTBALE} rev-parse --verify -q --short=7 HEAD\" in directory ${dir} failed with output:\n${GIT_error}")
else(NOT ${GIT_error} EQUAL 0)
execute_process(COMMAND ${GIT_EXECUTABLE} name-rev ${${prefix}_WC_REVISION_HASH}
WORKING_DIRECTORY ${dir}
OUTPUT_VARIABLE ${prefix}_WC_REVISION_NAME
OUTPUT_STRIP_TRAILING_WHITESPACE)
endif(NOT ${GIT_error} EQUAL 0)
execute_process(COMMAND ${GIT_EXECUTABLE} config --get remote.origin.url
WORKING_DIRECTORY ${dir}
OUTPUT_VARIABLE ${prefix}_WC_URL
OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(COMMAND ${GIT_EXECUTABLE} show -s --format="%ci" ${${prefix}_WC_REVISION_HASH}
WORKING_DIRECTORY ${dir}
OUTPUT_VARIABLE ${prefix}_show_output
OUTPUT_STRIP_TRAILING_WHITESPACE)
string(REGEX REPLACE "^([0-9][0-9][0-9][0-9]\\-[0-9][0-9]\\-[0-9][0-9]).*"
"\\1" ${prefix}_WC_LAST_CHANGED_DATE "${${prefix}_show_output}")
set(${prefix}_WC_GITSVN False)
# Check if this git is likely to be a git-svn repository
execute_process(COMMAND ${GIT_EXECUTABLE} config --get-regexp "^svn-remote"
WORKING_DIRECTORY ${dir}
OUTPUT_VARIABLE git_config_output
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(NOT "${git_config_output}" STREQUAL "")
# In case git-svn is used, attempt to extract svn info
execute_process(COMMAND ${GIT_EXECUTABLE} svn info
WORKING_DIRECTORY ${dir}
TIMEOUT 3
ERROR_VARIABLE git_svn_info_error
OUTPUT_VARIABLE ${prefix}_WC_INFO
RESULT_VARIABLE git_svn_info_result
OUTPUT_STRIP_TRAILING_WHITESPACE)
if(${git_svn_info_result} EQUAL 0)
set(${prefix}_WC_GITSVN True)
string(REGEX REPLACE "^(.*\n)?URL: ([^\n]+).*"
"\\2" ${prefix}_WC_URL "${${prefix}_WC_INFO}")
string(REGEX REPLACE "^(.*\n)?Revision: ([^\n]+).*"
"\\2" ${prefix}_WC_REVISION "${${prefix}_WC_INFO}")
string(REGEX REPLACE "^(.*\n)?Repository Root: ([^\n]+).*"
"\\2" ${prefix}_WC_ROOT "${${prefix}_WC_INFO}")
string(REGEX REPLACE "^(.*\n)?Last Changed Author: ([^\n]+).*"
"\\2" ${prefix}_WC_LAST_CHANGED_AUTHOR "${${prefix}_WC_INFO}")
string(REGEX REPLACE "^(.*\n)?Last Changed Rev: ([^\n]+).*"
"\\2" ${prefix}_WC_LAST_CHANGED_REV "${${prefix}_WC_INFO}")
string(REGEX REPLACE "^(.*\n)?Last Changed Date: ([^\n]+).*"
"\\2" ${prefix}_WC_LAST_CHANGED_DATE "${${prefix}_WC_INFO}")
endif(${git_svn_info_result} EQUAL 0)
endif(NOT "${git_config_output}" STREQUAL "")
# If there is no 'remote.origin', default to "NA" value and print a warning message.
if(NOT ${prefix}_WC_URL)
message(WARNING "No remote origin set for git repository: ${dir}" )
set( ${prefix}_WC_URL "NA" )
else()
set(${prefix}_WC_ROOT ${${prefix}_WC_URL})
endif()
endmacro(GIT_WC_INFO)
endif(GIT_EXECUTABLE)
# Handle the QUIETLY and REQUIRED arguments and set GIT_FOUND to TRUE if
# all listed variables are TRUE
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Git DEFAULT_MSG GIT_EXECUTABLE)

View File

@ -0,0 +1,244 @@
################################################################################
#
# Program: FindGitInfo from Slicer
#
# Copyright (c) Kitware Inc.
#
# See COPYRIGHT.txt
# or http://www.slicer.org/copyright/copyright.txt for details.
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# This file was originally developed by Jean-Christophe Fillion-Robin,
# Kitware Inc. and was partially funded by NIH grant 3P41RR013218-12S1
#
################################################################################
# If the command line client executable is found the macro
# GIT_WC_INFO(<dir> <var-prefix>)
# is defined to extract information of a git working copy at
# a given location.
#
# The macro defines the following variables:
# <var-prefix>_WC_REVISION_HASH - Current SHA1 hash
# <var-prefix>_WC_REVISION - Current SHA1 hash
# <var-prefix>_WC_REVISION_NAME - Name associated with <var-prefix>_WC_REVISION_HASH
# <var-prefix>_WC_URL - output of command `git config --get remote.origin.url'
# <var-prefix>_WC_ROOT - Same value as working copy URL
# <var-prefix>_WC_LAST_CHANGED_DATE - date of last commit
# <var-prefix>_WC_GITSVN - Set to false
# <var-prefix>_WC_LATEST_TAG - Latest tag found in history
# <var-prefix>_WC_LATEST_TAG_LONG - <last tag>-<commits since then>-g<actual commit hash>
#
# ... and also the following ones if it's a git-svn repository:
# <var-prefix>_WC_GITSVN - Set to True if it is a
# <var-prefix>_WC_INFO - output of command `git svn info'
# <var-prefix>_WC_URL - url of the associated SVN repository
# <var-prefix>_WC_ROOT - root url of the associated SVN repository
# <var-prefix>_WC_REVISION - current SVN revision number
# <var-prefix>_WC_LAST_CHANGED_AUTHOR - author of last commit
# <var-prefix>_WC_LAST_CHANGED_DATE - date of last commit
# <var-prefix>_WC_LAST_CHANGED_REV - revision of last commit
# <var-prefix>_WC_LAST_CHANGED_LOG - last log of base revision
#
# Example usage:
# find_package(GitInfo)
# if(GIT_FOUND)
# GIT_WC_INFO(${PROJECT_SOURCE_DIR} Project)
# message("Current revision is ${Project_WC_REVISION_HASH}")
# message("git found: ${GIT_EXECUTABLE}")
# endif()
#
# Look for git. Respect the quiet and required flags passed to this module.
set(FIND_QUIETLY_FLAG "")
if (DEFINED GitInfo_FIND_QUIETLY)
set(FIND_QUIETLY_FLAG "QUIET")
endif ()
set(FIND_REQUIRED_FLAG "")
if (DEFINED GitInfo_FIND_REQUIRED)
set(FIND_REQUIRED_FLAG "REQUIRED")
endif ()
find_package(Git ${FIND_QUIETLY_FLAG} ${FIND_REQUIRED_FLAG})
if(GIT_FOUND)
execute_process(COMMAND ${GIT_EXECUTABLE} --version
OUTPUT_VARIABLE git_version
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
if (git_version MATCHES "^git version [0-9]")
string(REPLACE "git version " "" GIT_VERSION_STRING "${git_version}")
endif()
unset(git_version)
macro(GIT_WC_INFO dir prefix)
execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --verify -q --short=7 HEAD
WORKING_DIRECTORY ${dir}
ERROR_VARIABLE GIT_error
OUTPUT_VARIABLE ${prefix}_WC_REVISION_HASH
OUTPUT_STRIP_TRAILING_WHITESPACE)
set(${prefix}_WC_REVISION ${${prefix}_WC_REVISION_HASH})
if(NOT ${GIT_error} EQUAL 0)
message(SEND_ERROR "Command \"${GIT_EXECUTBALE} rev-parse --verify -q --short=7 HEAD\" in directory ${dir} failed with output:\n${GIT_error}")
else(NOT ${GIT_error} EQUAL 0)
execute_process(COMMAND ${GIT_EXECUTABLE} name-rev ${${prefix}_WC_REVISION_HASH}
WORKING_DIRECTORY ${dir}
OUTPUT_VARIABLE ${prefix}_WC_REVISION_NAME
OUTPUT_STRIP_TRAILING_WHITESPACE)
endif(NOT ${GIT_error} EQUAL 0)
execute_process(COMMAND ${GIT_EXECUTABLE} config --get remote.origin.url
WORKING_DIRECTORY ${dir}
OUTPUT_VARIABLE ${prefix}_WC_URL
OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(COMMAND ${GIT_EXECUTABLE} show -s --format="%ci" ${${prefix}_WC_REVISION_HASH}
WORKING_DIRECTORY ${dir}
OUTPUT_VARIABLE ${prefix}_show_output
OUTPUT_STRIP_TRAILING_WHITESPACE)
string(REGEX REPLACE "^([0-9][0-9][0-9][0-9]\\-[0-9][0-9]\\-[0-9][0-9]).*"
"\\1" ${prefix}_WC_LAST_CHANGED_DATE "${${prefix}_show_output}")
execute_process(COMMAND ${GIT_EXECUTABLE} describe --tags --abbrev=0
WORKING_DIRECTORY ${dir}
OUTPUT_VARIABLE ${prefix}_WC_LATEST_TAG
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET)
execute_process(COMMAND ${GIT_EXECUTABLE} describe --tags
WORKING_DIRECTORY ${dir}
OUTPUT_VARIABLE ${prefix}_WC_LATEST_TAG_LONG
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET)
set(${prefix}_WC_GITSVN False)
# Check if this git is likely to be a git-svn repository
execute_process(COMMAND ${GIT_EXECUTABLE} config --get-regexp "^svn-remote"
WORKING_DIRECTORY ${dir}
OUTPUT_VARIABLE git_config_output
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(NOT "${git_config_output}" STREQUAL "")
# In case git-svn is used, attempt to extract svn info
execute_process(COMMAND ${GIT_EXECUTABLE} svn info
WORKING_DIRECTORY ${dir}
TIMEOUT 3
ERROR_VARIABLE git_svn_info_error
OUTPUT_VARIABLE ${prefix}_WC_INFO
RESULT_VARIABLE git_svn_info_result
OUTPUT_STRIP_TRAILING_WHITESPACE)
if(${git_svn_info_result} EQUAL 0)
set(${prefix}_WC_GITSVN True)
string(REGEX REPLACE "^(.*\n)?URL: ([^\n]+).*"
"\\2" ${prefix}_WC_URL "${${prefix}_WC_INFO}")
string(REGEX REPLACE "^(.*\n)?Revision: ([^\n]+).*"
"\\2" ${prefix}_WC_REVISION "${${prefix}_WC_INFO}")
string(REGEX REPLACE "^(.*\n)?Repository Root: ([^\n]+).*"
"\\2" ${prefix}_WC_ROOT "${${prefix}_WC_INFO}")
string(REGEX REPLACE "^(.*\n)?Last Changed Author: ([^\n]+).*"
"\\2" ${prefix}_WC_LAST_CHANGED_AUTHOR "${${prefix}_WC_INFO}")
string(REGEX REPLACE "^(.*\n)?Last Changed Rev: ([^\n]+).*"
"\\2" ${prefix}_WC_LAST_CHANGED_REV "${${prefix}_WC_INFO}")
string(REGEX REPLACE "^(.*\n)?Last Changed Date: ([^\n]+).*"
"\\2" ${prefix}_WC_LAST_CHANGED_DATE "${${prefix}_WC_INFO}")
endif(${git_svn_info_result} EQUAL 0)
endif(NOT "${git_config_output}" STREQUAL "")
# If there is no 'remote.origin', default to "NA" value and print a warning message.
if(NOT ${prefix}_WC_URL)
message(WARNING "No remote origin set for git repository: ${dir}" )
set( ${prefix}_WC_URL "NA" )
else()
set(${prefix}_WC_ROOT ${${prefix}_WC_URL})
endif()
endmacro(GIT_WC_INFO)
# Get the version info from the latest tag and set it as the projects version.
#
# Parameters:
# prefix The prefix for all version variables.
#
macro(GIT_VERSION_INFO prefix)
# If this project is not deployed via git, the following version file will
# be used as fallback and needs to be deployed along with the sources. These
# will be generated automatically by depending on the global target
# 'project-version-files', if this project has access to the related git
# repositoy.
set(VERSION_FILE "${PROJECT_SOURCE_DIR}/.version")
if (NOT TARGET project-version-files)
add_custom_target(project-version-files)
endif ()
if (EXISTS "${PROJECT_SOURCE_DIR}/.git")
git_wc_info(${PROJECT_SOURCE_DIR} GIT)
# Add commands and targets for generating the required version file for
# source package deploys. The file will also be to a global property, so
# one is able to access a list of all generated version files, e.g. to
# clean up the source directory after the package has been packed.
add_custom_command(
OUTPUT ${VERSION_FILE}
COMMAND ${GIT_EXECUTABLE} describe --tags > ${VERSION_FILE}
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
set_property(GLOBAL APPEND
PROPERTY GIT_GENERATED_VERSION_FILES "${VERSION_FILE}")
add_custom_target(project-version-files-${prefix} DEPENDS ${VERSION_FILE})
add_dependencies(project-version-files project-version-files-${prefix})
# If git is not available (e.g. this git was packed as .tar.gz), try to read
# the version-info from a hidden file in the root directory. This file
# should not be versioned, but added at packaging time.
elseif (EXISTS "${VERSION_FILE}")
file(READ "${VERSION_FILE}" GIT_WC_LATEST_TAG_LONG)
string(STRIP "${GIT_WC_LATEST_TAG_LONG}" GIT_WC_LATEST_TAG_LONG)
# If no version could be gathered by git or the version file, print a
# warning, so the user has to define a version in the backup version file.
else ()
if (${ARGN} EQUAL "REQUIRED")
message(FATAL_ERROR "No version provided by git or .version file")
else ()
message(WARNING "No version provided by git or .version file")
endif()
endif ()
if (GIT_WC_LATEST_TAG_LONG MATCHES "^([^0-9]*)([0-9]+)[.]([0-9]+)(.*)")
set(${prefix}_VERSION ${GIT_WC_LATEST_TAG_LONG} CACHE STRING "" FORCE)
set(${prefix}_VERSION_MAJOR ${CMAKE_MATCH_2} CACHE STRING "" FORCE)
set(${prefix}_VERSION_MINOR ${CMAKE_MATCH_3} CACHE STRING "" FORCE)
if (GIT_WC_LATEST_TAG_LONG MATCHES
"^([^0-9]*)([0-9]+)[.]([0-9]+)[.]([0-9]+)")
set(${prefix}_VERSION_PATCH ${CMAKE_MATCH_4} CACHE STRING "" FORCE)
else ()
set(${prefix}_VERSION_PATCH 0 CACHE STRING "" FORCE)
endif()
if (GIT_WC_LATEST_TAG_LONG MATCHES
"^([^0-9]*)([0-9]+)[.]([0-9]+)(.*)-([0-9]+)-")
set(${prefix}_VERSION_TWEAK ${CMAKE_MATCH_5} CACHE STRING "" FORCE)
else ()
set(${prefix}_VERSION_TWEAK 0 CACHE STRING "" FORCE)
endif()
mark_as_advanced(${prefix}_VERSION
${prefix}_VERSION_MAJOR
${prefix}_VERSION_MINOR
${prefix}_VERSION_PATCH
${prefix}_VERSION_TWEAK)
else ()
message(FATAL_ERROR "Invalid version info: '${GIT_WC_LATEST_TAG_LONG}'.")
endif ()
endmacro()
endif(GIT_FOUND)

View File

@ -41,8 +41,6 @@ tstr IMPLEMENTOR
tint IMPLEMENTOR
tcon IMPLEMENTOR
mob_ld IMPLEMENTOR
pcbang_check IMPLEMENTOR
pcbang_update IMPLEMENTOR
setqf IMPLEMENTOR
delqf IMPLEMENTOR
effect IMPLEMENTOR

File diff suppressed because it is too large Load Diff

View File

@ -1,10 +1,12 @@
# Ignore compiled quest folder
# Ignore compiled quest folders
object/
pre_qc/
# Quest compiler binaries
qc
qc.core
qc.exe
# Compilde Python files
# Compiled Python files
__pycache__/
*.pyc

View File

@ -1,4 +1,4 @@
#!/usr/local/bin/python
#!/bin/python2
import pre_qc
import os
os.system('rm -rf object')
@ -13,7 +13,7 @@ for line in file('locale_list'):
else:
filename = line
if os.system('./qc '+filename):
if os.system('qc '+filename):
print 'Error occured on compile ' + line
os.system('chmod -R 770 object')
import sys

View File

@ -1,151 +0,0 @@
quest dragon_soul begin
state start begin
when levelup or letter with pc.level >= 30 begin
send_letter(gameforge.dragon_soul._1010_sendLetter)
local v = find_npc_by_vnum(20001)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20001))
end
end
when info or button begin
say(gameforge.dragon_soul._1020_say)
end
when 20001.chat.gameforge.dragon_soul._1030_npcChat with pc.level >= 30 begin
target.delete("__TARGET__")
say_title(mob_name(20001))
say(gameforge.dragon_soul._1040_say)
set_state(state_learning)
end
end
state state_learning begin
when letter begin
send_letter(gameforge.dragon_soul._1050_sendLetter)
end
when info or button begin
say(gameforge.dragon_soul._1060_say)
end
when kill begin
if npc.is_pc() then
return
end
if pc.count_item(30270) < 10 then
if drop_gamble_with_flag("ds_drop") then
game.drop_item_with_ownership(30270, 1, 300)
end
end
end
when 20001.chat.gameforge.dragon_soul._1050_sendLetter begin
say_title(mob_name(20001))
if pc.count_item(30270) >= 10 then
say(gameforge.dragon_soul._1070_say)
pc.remove_item(30270, 10)
ds.give_qualification()
char_log(pc.get_player_id(), 'DS_QUALIFICATION', 'SUCCESS')
pc.give_item2(50255)
local today = math.floor(get_global_time() / 86400)
pc.setf("dragon_soul", "eye_timestamp", today)
pc.setf("dragon_soul", "eye_left", 9)
set_state(state_farming)
else
say(gameforge.dragon_soul._1080_say)
end
end
end
state state_farming begin
when letter begin
send_letter(gameforge.dragon_soul._1090_sendLetter)
end
when info or button begin
say(string.format(gameforge.dragon_soul._1100_say, pc.getf("dragon_soul", "eye_left")))
end
when kill begin
if npc.is_pc() then
return
end
if drop_gamble_with_flag("ds_drop") then
local eye_left = pc.getf("dragon_soul", "eye_left")
local haved_gemstone_number = pc.count_item(30270)
if eye_left > haved_gemstone_number / 10 then
game.drop_item_with_ownership(30270, 1, 300)
end
end
end
when 30270.pick begin
local eye_left = pc.getf("dragon_soul", "eye_left")
if eye_left <= 0 then
return
end
if pc.count_item(30270) >= 10 then
pc.setf("dragon_soul", "eye_left", eye_left - 1)
pc.remove_item(30270, 10)
pc.give_item2(50255)
if 1 == eye_left then
notice_multiline(gameforge.dragon_soul._1110_notice, notice)
set_state(state_closed_season)
end
end
end
when 20001.chat.gameforge.dragon_soul._1120_npcChat begin
say_title(mob_name(20001))
local today = math.floor(get_global_time() / 86400)
if today == pc.getf("dragon_soul", "eye_timestamp") then
say(gameforge.dragon_soul._1130_say)
else
say(gameforge.dragon_soul._1140_say)
pc.setf("dragon_soul", "eye_timestamp", today)
pc.setf("dragon_soul", "eye_left", 10)
end
end
end
state state_closed_season begin
when letter begin
send_letter(gameforge.dragon_soul._1150_sendLetter)
end
when info or button begin
say(gameforge.dragon_soul._1160_say)
local today = math.floor(get_global_time() / 86400)
if today == pc.getf("dragon_soul", "eye_timestamp") then
say(gameforge.dragon_soul._1170_say)
else
say(gameforge.dragon_soul._1180_say)
end
end
when 20001.chat.gameforge.dragon_soul._1090_sendLetter begin
say_title(mob_name(20001))
local today = math.floor(get_global_time() / 86400)
if today == pc.getf("dragon_soul", "eye_timestamp") then
say(gameforge.dragon_soul._1130_say)
else
say(gameforge.dragon_soul._1140_say)
pc.setf("dragon_soul", "eye_timestamp", today)
pc.setf("dragon_soul", "eye_left", 10)
set_state(state_farming)
end
end
end
-- deprecated states. so, jump to new state.
state state_1 begin
when login begin
set_state(state_learning)
end
end
state state_2 begin
when login begin
set_state(state_learning)
end
end
state state_3 begin
when login begin
set_state(state_closed_season)
end
end
end

View File

@ -1,41 +0,0 @@
quest dragon_soul_daily_gift begin
state start begin
function is_event_on()
-- <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> dragon_soul_daily_gift_mgr.quest<73><74><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD> <20><EFBFBD><EBBFAA><EFBFBD><EFBFBD> Ȯ<><C8AE>.
local s_time = game.get_event_flag("ds_dg_st")
local e_time = game.get_event_flag("ds_dg_et")
local now = os.time()
return now > s_time and now < e_time
end
when 20001.chat.gameforge.dragon_soul_daily_gift._010_npcChat with dragon_soul_daily_gift.is_event_on() begin
local event_id = game.get_event_flag("ds_dg_id")
if pc.getqf("event_id") != event_id then
say_title(mob_name(20001))
if pc.level < 50 then
say(gameforge.dragon_soul_daily_gift._020_say)
return
elseif 0 == ds.is_qualified() then
say(gameforge.dragon_soul_daily_gift._030_say)
return
else
say(gameforge.dragon_soul_daily_gift._040_say)
pc.setqf("event_id", event_id)
wait()
end
end
say_title(mob_name(20001))
if 0 == get_today_count("dragon_soul_daily_gift", "gift") then
-- <20><><EFBFBD><EFBFBD>ġ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
say(gameforge.dragon_soul_daily_gift._050_say)
local gift_vnum = game.get_event_flag("ds_dg_item")
pc.give_item2(gift_vnum)
inc_today_count("dragon_soul_daily_gift", "gift")
else
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̹<EFBFBD> <20><>.
say(gameforge.dragon_soul_daily_gift._060_say)
end
end
end
end

View File

@ -1,90 +0,0 @@
quest dragon_soul_daily_gift_mgr begin
state start begin
function is_event_on()
-- <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> dragon_soul_daily_gift_mgr.quest<73><74><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD> <20><EFBFBD><EBBFAA><EFBFBD><EFBFBD> Ȯ<><C8AE>.
local s_time = game.get_event_flag("ds_dg_st")
local e_time = game.get_event_flag("ds_dg_et")
local now = os.time()
return now > s_time and now < e_time
end
function date_getter()
say(gameforge.dragon_soul_gift_mgr._040_say)
say("yy-mm-dd hh:mm")
local date = input()
local _, _, y, m, d, hour, min = string.find(date, "(%d+)-(%d+)-(%d+) (%d+):(%d+)")
return y, m, d, hour, min
end
function print_quest_info()
local s_time = game.get_event_flag("ds_dg_st")
local e_time = game.get_event_flag("ds_dg_et")
local gift_vnum = game.get_event_flag("ds_dg_item")
say(os.date("start time[ENTER] year:%Y, month:%m, day:%d hour:%H minite:%M", s_time))
say(os.date(" end time[ENTER] year:%Y, month:%m, day:%d hour:%H minite:%M", e_time))
say(string.format("gift item[ENTER] vnum : %d", gift_vnum))
say_item_vnum(gift_vnum)
end
when 20001.chat.gameforge.dragon_soul_gift_mgr._010_npcChat with pc.is_gm() begin
local sel = 0
if dragon_soul_daily_gift_mgr.is_event_on() then
say(locale.event_on_going)
local sel = select(locale.event_modify, locale.event_info_print, locale.event_cancel, locale.close)
if 2 == sel then
dragon_soul_daily_gift_mgr.print_quest_info()
return
elseif 3 == sel then
game.set_event_flag("ds_dg_et", 0)
return
elseif 4 == sel then
return
end
end
-- Get start time and end time.
local s_y, s_m, s_d, s_hour, s_min
repeat
say(gameforge.dragon_soul_gift_mgr._020_say)
s_y, s_m, s_d, s_hour, s_min = dragon_soul_daily_gift_mgr.date_getter()
s_y = s_y + 2000
say(string.format("year:%d month:%d day:%d hour:%d min:%d", s_y, s_m, s_d, s_hour, s_min))
until 1 == select(gameforge.locale.yes, gameforge.locale.no)
local e_y, e_m, e_d, e_hour, e_min
repeat
say(gameforge.dragon_soul_gift_mgr._030_say)
e_y, e_m, e_d, e_hour, e_min = dragon_soul_daily_gift_mgr.date_getter()
e_y = e_y + 2000
say(string.format("year:%d month:%d day:%d hour:%d min:%d", e_y, e_m, e_d, e_hour, e_min))
until 1 == select(gameforge.locale.yes, gameforge.locale.no)
local s_time = os.time{year=s_y, month=s_m, day=s_d, hour=s_hour, min=s_min}
local e_time = os.time{year=e_y, month=e_m, day=e_d, hour=e_hour, min=e_min}
-- Get gift item vnum
local gift_vnum = input_number("gift vnum")
-- Print settings and confirm.
say(os.date("start time[ENTER] year:%Y, month:%m, day:%d hour:%H minite:%M", s_time))
say(os.date(" end time[ENTER] year:%Y, month:%m, day:%d hour:%H minite:%M", e_time))
say(string.format("gift item[ENTER] vnum : %d", gift_vnum))
say_item_vnum(gift_vnum)
say(gameforge.dragon_soul_gift_mgr._050_say)
if 2 == select(gameforge.locale.yes, gameforge.locale.no) then
return
end
-- <20>̺<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> event_id<69><64> <20>ٲٸ<D9B2> <20>ȵ<EFBFBD>.
if 0 == sel then
local event_id = game.get_event_flag("ds_dg_id")
game.set_event_flag("ds_dg_id", event_id + 1)
end
game.set_event_flag("ds_dg_st", s_time)
game.set_event_flag("ds_dg_et", e_time)
game.set_event_flag("ds_dg_item", gift_vnum)
say (gameforge.dragon_soul_gift_mgr._060_say)
end
end
end

View File

@ -1,9 +0,0 @@
quest dragon_soul_refine begin
state start begin
when 20001.chat.gameforge.dragon_soul_refine._010_npcChat with ds.is_qualified() != 0 begin
say_title(mob_name(20001))
say (gameforge.dragon_soul_refine._020_say)
ds.open_refine_window()
end
end
end

View File

@ -1,8 +0,0 @@
quest dragon_soul_shop begin
state start begin
when 20001.chat.gameforge.dragon_soul._100_npcChat with ds.is_qualified() begin
say (gameforge.dragon_soul._110_say)
npc.open_shop(13)
end
end
end

View File

@ -1,103 +0,0 @@
quest event_flame_dungeon_open begin
state start begin
when 20381.chat.gameforge.event_flame_dungeon_open._010_npcChat with pc.get_level() >= 90 begin
say(gameforge.event_flame_dungeon_open._020_say)
wait()
say(gameforge.event_flame_dungeon_open._030_say)
wait()
say(gameforge.event_flame_dungeon_open._080_say)
pc.setqf("event_FD_time", 0)
set_state(run)
end
end
state run begin
when 20381.chat.gameforge.event_flame_dungeon_open._040_npcChat with game.get_event_flag("w21open_event")>0 begin
say(gameforge.event_flame_dungeon_open._050_say)
wait()
local t = pc.getqf("event_FD_time")
local killcount = pc.getqf("kill_done")
if killcount == 0 then
say(gameforge.event_flame_dungeon_open._080_say)
elseif (t==0) or (t+86400 < get_global_time()) then
say(gameforge.event_flame_dungeon_open._060_say)
pc.give_item2(71173, 1)
pc.give_item2(71174, 3)
pc.setqf("event_FD_time", get_global_time())
pc.setqf("kill_count_1", 0)
else
say(gameforge.event_flame_dungeon_open._070_say)
end
end
when letter with game.get_event_flag("w21open_event")>0 begin
send_letter(gameforge.event_flame_dungeon_open._010_npcChat)
--<2D><><EFBFBD><EFBFBD> óġ <20><> <20>ȳ<EFBFBD><C8B3><EFBFBD>
q.set_counter_name(gameforge.main_quest_lv98._680_counterName)
event_flame_dungeon_open.kill_count()
end
when button or info with game.get_event_flag("w21open_event")>0 begin
say_title(gameforge.event_flame_dungeon_open._010_npcChat)
say(string.format(gameforge.levelup._26_say, 100 - pc.getqf("kill_count_1")))
end
when 3101.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
event_flame_dungeon_open.kill_count()
end
when 3102.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
event_flame_dungeon_open.kill_count()
end
when 3103.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
event_flame_dungeon_open.kill_count()
end
when 3104.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
event_flame_dungeon_open.kill_count()
end
when 3105.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
event_flame_dungeon_open.kill_count()
end
when 3190.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
event_flame_dungeon_open.kill_count()
end
when 3191.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
event_flame_dungeon_open.kill_count()
end
when 71173.use begin
pc.warp(614200, 706800, 62)
pc.remove_item(71173, 1)
end
function kill_count()
local total_remain = 100
local remain1 = pc.getqf("kill_count_1")
local remain_count = total_remain - remain1
q.set_counter_value(remain_count)
if total_remain == 0 then
pc.setqf("kill_done", 1)
end
end
end
end

View File

@ -1,717 +0,0 @@
quest flame_dungeon begin
state start begin
--when 20394.click with pc.get_level() >= 90 begin
--pc.give_item2(71175, 1)
--set_state(run)
--end
--end
--state run begin
function setting()
return
{
["bossroom_entry_pos"] = {8109,6867},
["boss_pos"] = {686,637},
["doors_pos"] = {
{320,394},
{293,359},
{333,321},
{378,320},
{400,355},
{394,401}
},
["idoors_pos"] = {
{268,447},
{234,359},
{300,264},
{454,217},
{470,355},
{467,469}
},
["doors_dir"] = {135,90,210,152,90,223},
["idoors_dir"] = {135,90,210,135,90,239},
["dungeon_entry_pos"] = {7762, 6739},-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
["DUNGEON_MAN_bpos"] = {690,722},
["DUNGEON_MAN_pos"] = {354,362},
["LEVEL2_STONE_pos"] = {195,352},
["LEVEL4_TARGET_pos"] = {470,175},
["LEVEL5_STONE_pos"] = {
{486, 345},
{511, 336},
{525, 349},
{521, 365},
{503, 372},
{486, 365},
{500, 354}
},
["LEVEL6_TARGET_pos"] = {511,480},
["outside_entry_pos"] = {6142,7068}, --<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ¾<D6B4> <20><><EFBFBD>ִ<EFBFBD> <20><>
["YAK_pos"] = {376, 397} -- <20><>ȯ <20><><EFBFBD><EFBFBD>
}
end
function is_flamed(idx) -- <20><><EFBFBD><EFBFBD><E6BCBA> <20>ִ<EFBFBD><D6B4><EFBFBD> Ȯ<><C8AE>
return idx >= 351 * 10000 and idx < (351 + 1) *10000
end
function make_dungeon() -- <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
local setting = flame_dungeon.setting()
d.new_jump_party(351, setting.dungeon_entry_pos[1], setting.dungeon_entry_pos[2])
-- d.spawn_mob_ac_dir(20385, setting.DUNGEON_MAN_pos[1], setting.DUNGEON_MAN_pos[2],0)
-- d.spawn_mob(YAK,setting.YAK_pos[1],setting.YAK_pos[2])
d.regen_file("data/dungeon/flame_dungeon/npc.txt")
d.setf("level",0)
for i=1,6 do
d.set_unique("door"..i, d.spawn_mob_ac_dir(20387, setting.doors_pos[i][1], setting.doors_pos[i][2],setting.doors_dir[i]))
end
for i=1,6 do
d.set_unique("idoor"..i, d.spawn_mob_ac_dir(20388, setting.idoors_pos[i][1], setting.idoors_pos[i][2],setting.idoors_dir[i]))
end
d.setf("clear_count",0)
d.setf("started",0)
d.setf("dungeon_enter",0) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD>? // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : 0 <20><><EFBFBD><EFBFBD> : 1 // ƨ<><C6A8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѽð<D1BD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
end
function go_boss() -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
local setting = flame_dungeon.setting()
if pc.get_level() < 104 then --<2D><><EFBFBD><EFBFBD>Ȯ<EFBFBD><C8AE>
-- syschat(gameforge.flame_dungeon._580_notice)
say(gameforge.flame_dungeon._580_notice)
return
else
--if pc.getf("main_quest_flame_lv103", "__status")==main_quest_flame_lv103.__COMPLETE__ then -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ Ȯ<><C8AE>
-- -- say_title(gameforge.flame_dungeon._010_say)
say(gameforge.flame_dungeon._010_say)
local warp = select(gameforge.flame_dungeon._020_select,gameforge.flame_dungeon._030_select)
if warp == 1 then
d.setf("level",17)
d.jump_all(setting.bossroom_entry_pos[1],setting.bossroom_entry_pos[2])
d.set_regen_file ("data/dungeon/flame_dungeon/".."fd_fild_boss.txt")
-- d.spawn_mob(20385,setting.DUNGEON_MAN_bpos[1],setting.DUNGEON_MAN_bpos[2])
d.spawn_mob(6091,setting.boss_pos[1],setting.boss_pos[2])
end
-- else
-- -- syschat(gameforge.flame_dungeon._040_notice)
-- say(gameforge.flame_dungeon._040_notice)
-- return
-- end
end
end
function level_clear() -- <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD>Ŭ<EFBFBD><C5AC><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD>Ŭ<EFBFBD><C5AC><EFBFBD><EFBFBD>
d.setf("level",0)
d.clear_regen()
d.purge_area(750000,620000,817400,689400) -- <20><><EFBFBD><EFBFBD>ü -- d.purge() <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
end
function clear_timer(inx) -- Ÿ<≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
clear_server_timer ("flame_dungeon_0m_left_timer", inx)
clear_server_timer ("flame_dungeon_1m_left_timer", inx)
clear_server_timer ("flame_dungeon_5m_left_timer", inx)
clear_server_timer ("flame_dungeon_10m_left_timer", inx)
clear_server_timer ("flame_dungeon_15m_left_timer", inx)
clear_server_timer ("flame_dungeon_30m_left_timer", inx)
clear_server_timer ("flame_dungeon_45m_left_timer", inx)
clear_server_timer ("killed_A_1", inx)
clear_server_timer ("killed_A_2", inx)
clear_server_timer ("flame_dungeon_ticket_remove", inx)
end
when login begin
local idx = pc.get_map_index()
local setting = flame_dungeon.setting()
if idx == 351 then
pc.warp(setting.outside_entry_pos[1]*100, setting.outside_entry_pos[2] * 100, 62)
elseif flame_dungeon.is_flamed(idx) then -- <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
------------------------------------------------------------------------------------------------------------------------------------------------------
--<2D>Ʒ<EFBFBD><C6B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD>ƿ´<C6BF>. <20>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD><EFBFBD> Ȱ<><C8B0>ȭ <20>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȴ<EFBFBD>.
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD>ƿ<EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E6BCBA><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɼ<EFBFBD><C9BC><EFBFBD> Ȱ<><C8B0>ȭ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
------------------------------------------------------------------------------------------------------------------------------------------------------
-- pc.set_warp_location(0, 0 , 0) --ƨ<><C6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٽ<EFBFBD> <20><><EFBFBD>ƿ<EFBFBD><C6BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20>κ<EFBFBD>
pc.set_warp_location(62, setting.outside_entry_pos[1] , setting.outside_entry_pos[2]) -- <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ƨ<><C6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
local ticketGroup = {71095, 1, 71130, 1}
if d.getf("dungeon_enter") == 0 then -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴϸ<C6B4>
local canPass = false
for i=1, table.getn(ticketGroup),2 do
if pc.count_item(ticketGroup[i]) >= ticketGroup[i+1] then
canPass = true
break
end
end
if get_global_time() - pc.getf("flame_dungeon","exit_time") < 30 * 60 then -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѽð<D1BD><C3B0><EFBFBD> <20>ɷ<EFBFBD><C9B7><EFBFBD><EFBFBD><EFBFBD>
notice_multiline(gameforge.flame_dungeon._050_notice,d.notice)
say(gameforge.flame_dungeon._060_say)
timer("flame_dungeon_warp_timer", 5)
elseif not canPass then
notice_multiline(gameforge.flame_dungeon._070_notice,d.notice)
say(gameforge.flame_dungeon._080_say)
timer("flame_dungeon_warp_timer", 5)
elseif pc.get_level() < 100 then
notice_multiline(gameforge.flame_dungeon._090_notice,d.notice)
say(gameforge.flame_dungeon._100_say)
timer("flame_dungeon_warp_timer", 5)
end
elseif pc.getf("flame_dungeon","ticket_delete") == 0 then -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD> Ƽ<><C6BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for i=1, table.getn(ticketGroup),2 do
if pc.count_item(ticketGroup[i]) >= ticketGroup[i+1] then
pc.remove_item(ticketGroup[i], ticketGroup[i+1])
break
end
end
pc.setf("flame_dungeon","ticket_delete",1)
end
else
pc.setf("flame_dungeon","ticket_delete",0)
end
end
when flame_dungeon_warp_timer.timer begin
local setting = flame_dungeon.setting()
pc.warp(setting.outside_entry_pos[1]*100, setting.outside_entry_pos[2] * 100, 62)
end
when logout begin
local idx = pc.get_map_index()
if flame_dungeon.is_flamed(idx) then
if d.getf("dungeon_enter") == 1 then -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>α׾ƿ<D7BE>
pc.setf("flame_dungeon","exit_time",get_global_time()) -- <20>ν<EFBFBD><CEBD>Ͻ<EFBFBD> <20>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD>, <20>ٵ<EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> or <20>׳<EFBFBD> ƨ<><C6A8><EFBFBD>Ÿ<EFBFBD> <20>ȱ<EFBFBD><C8B1><EFBFBD>
end
end
end
when 20394.chat.gameforge.flame_dungeon._110_npcChat begin
local setting = flame_dungeon.setting()
if party.is_party() then
-- <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD>
local party_check = 0
if d.find(party.getf("dungeon_index")) then
party_check = (d.getf_from_map_index("party_leader_pid", party.getf("dungeon_index")) == party.get_leader_pid())
end
if d.find(party.getf("dungeon_index")) and party_check then
if get_global_time() - pc.getf("flame_dungeon","exit_time") < 5 * 60 then -- <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 5<><35> <20><>?
local dungeon_level = d.getf_from_map_index("level", party.getf("dungeon_index"))
if dungeon_level == 17 then -- <20><><EFBFBD><EFBFBD>
pc.warp(setting.bossroom_entry_pos[1] * 100, setting.bossroom_entry_pos[2] * 100, party.getf("dungeon_index"))
else
pc.warp(setting.dungeon_entry_pos[1] * 100, setting.dungeon_entry_pos[2] * 100, party.getf("dungeon_index"))
end
else -- 5<><35> <20>ʰ<EFBFBD><CAB0>Ͽ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20>Ұ<EFBFBD>
say_title(mob_name(20394))
say(gameforge.flame_dungeon._590_say)
end
else
local pids = {party.get_member_pids()}
local noTicketMembers = {}
local notEnoughLevelMembers = {}
local ticketCheck = true
local levelCheck = true
local ticketGroup = {71095, 1, 71130, 1}
for i, pid in next, pids, nil do
q.begin_other_pc_block(pid)
local canPass = false
for idx=1, table.getn(ticketGroup),2 do
if pc.count_item(ticketGroup[idx]) >= ticketGroup[idx+1] then
canPass = true
break
end
end
if not canPass then
table.insert(noTicketMembers, pc.get_name())
ticketCheck = false
end
if pc.level < 100 then
table.insert(notEnoughLevelMembers, pc.get_name())
levelCheck = false
end
q.end_other_pc_block()
end
if not ticketCheck then
say_title(mob_name(20394))
say(gameforge.flame_dungeon._610_say)
for i, name in next, noTicketMembers, nil do
say(color(1,1,0), " "..name)
end
if levelCheck then
return
else
wait()
end
end
if not levelCheck then
say_title(mob_name(20394))
say(gameforge.flame_dungeon._630_say)
for i, name in next, notEnoughLevelMembers, nil do
say(color(1,1,0), " "..name)
end
return
end
if party.is_leader() then
say(gameforge.flame_dungeon._120_say)
local warp = select(gameforge.flame_dungeon._130_select,gameforge.flame_dungeon._140_select)
if warp == 1 then
if party.is_map_member_flag_lt("exit_time", get_global_time() - 30 * 60 ) then
flame_dungeon.make_dungeon()
else
--say("test : <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ѽð<D1BD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʾҽ<CABE><D2BD>ϴ<EFBFBD>.")
say(gameforge.flame_dungeon._600_say)
end
end
party.setf("flame_dungeon_boss_kill_count", 0)
else
say(gameforge.flame_dungeon._150_say)
end
end
else
say(gameforge.flame_dungeon._160_say)
end
end
-- when 20394.chat."Test : <20><><EFBFBD>ҽ<EFBFBD>Ȯ<EFBFBD><C8AE>" with is_test_server() begin -- <20>׽<EFBFBD>Ʈ<EFBFBD><C6AE>
-- local setting = flame_dungeon.setting()
-- pc.setf("flame_dungeon","fdRtest",1)
-- pc.warp( setting.dungeon_entry_pos[1]*100, setting.dungeon_entry_pos[2]*100, 351)
-- end
when 20394.chat."TEST : Init time limit init" with is_test_server() begin -- <20>׽<EFBFBD>Ʈ<EFBFBD><C6AE>
pc.setf("flame_dungeon","exit_time",get_global_time()-1800)
say("Done")
end
-- when 20385.chat."Test : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>" with is_test_server() begin -- <20>׽<EFBFBD>Ʈ<EFBFBD><C6AE>
-- say("<22><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : "..d.count_monster())
-- say("level : "..d.getf("level"))
-- say("Dmap index : "..d.get_map_index())
-- say("Pmap index : "..pc.get_map_index())
-- say("access limit : "..pc.getf("flame_dungeon","exit_time"))
-- say("global time : "..get_global_time())
-- if flame_dungeon.is_flamed(d.get_map_index()) then
-- say("in dungeon") -- is_flamed <20>Լ<EFBFBD> üũ
-- end
-- if d.is_unique_dead("stone1") then
-- say("stone1 is dead")
-- else
-- say("stone1 is not dead")
-- end
-- end
-- when 20385.chat."ó<><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" begin -- <20>׽<EFBFBD>Ʈ<EFBFBD><C6AE>
-- say("<22>ʱ<EFBFBD>ȭ <20>մϴ<D5B4>")
-- flame_dungeon.clear_timer(d.get_map_index())
-- flame_dungeon.make_dungeon()
-- end
when 20385.chat."Test : Boss Room" with is_test_server() begin -- <20>׽<EFBFBD>Ʈ<EFBFBD><C6AE>
flame_dungeon.go_boss()
end
-- < <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD> Ÿ<≯<EFBFBD>>
-- when 20385.chat."<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" begin -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ƨ<><C6A8><EFBFBD><EFBFBD> <20>ʰ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD> Ȱ<><C8B0>ȭ
-- local setting = flame_dungeon.setting()
-- say("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ðڽ<C3B0><DABD>ϱ<EFBFBD>?")
-- local warp = select("Ȯ<><C8AE>","<22><><EFBFBD><EFBFBD>")
-- if warp == 1 then
-- pc.warp(setting.outside_entry_pos[1]*100, setting.outside_entry_pos[2] * 100, 62)
-- end
-- end
when flame_dungeon_45m_left_timer.server_timer begin
if d.select(get_server_timer_arg()) then
notice_multiline(string.format(gameforge.flame_dungeon._180_notice, 45),d.notice)
notice_multiline(gameforge.flame_dungeon._170_notice,d.notice)
server_timer('flame_dungeon_30m_left_timer', 15*60, get_server_timer_arg())
end
end
when flame_dungeon_30m_left_timer.server_timer begin
if d.select(get_server_timer_arg()) then
notice_multiline(string.format(gameforge.flame_dungeon._180_notice, 30),d.notice)
notice_multiline(gameforge.flame_dungeon._170_notice,d.notice)
server_timer('flame_dungeon_15m_left_timer', 15*60, get_server_timer_arg())
end
end
when flame_dungeon_15m_left_timer.server_timer begin
if d.select(get_server_timer_arg()) then
notice_multiline(string.format(gameforge.flame_dungeon._180_notice, 15),d.notice)
notice_multiline(gameforge.flame_dungeon._170_notice,d.notice)
server_timer('flame_dungeon_5m_left_timer', 10*60, get_server_timer_arg())
end
end
when flame_dungeon_5m_left_timer.server_timer begin
if d.select(get_server_timer_arg()) then
notice_multiline(string.format(gameforge.flame_dungeon._180_notice, 5),d.notice)
notice_multiline(gameforge.flame_dungeon._170_notice,d.notice)
server_timer('flame_dungeon_1m_left_timer', 4*60, get_server_timer_arg())
end
end
when flame_dungeon_1m_left_timer.server_timer begin
if d.select(get_server_timer_arg()) then
notice_multiline(string.format(gameforge.flame_dungeon._180_notice, 1),d.notice)
notice_multiline(gameforge.flame_dungeon._170_notice,d.notice)
server_timer ("flame_dungeon_0m_left_timer", 60, get_server_timer_arg())
end
end
when flame_dungeon_0m_left_timer.server_timer begin
local setting = flame_dungeon.setting()
if d.select(get_server_timer_arg()) then
notice_multiline(gameforge.flame_dungeon._190_notice,d.notice)
notice_multiline(gameforge.flame_dungeon._200_notice,d.notice)
server_timer("dungeon_end_timer",10,d.get_map_index())
end
end
-- <<<< <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>>>>> --
when 20385.chat.gameforge.flame_dungeon._210_npcChat with npc.lock() begin -- '0x'<27><> x<><78>° <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> , '1x'<27><> x<><78>° <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
local setting = flame_dungeon.setting()
if d.getf("started") == 0 then
say(gameforge.flame_dungeon._230_say)
say(gameforge.flame_dungeon._240_say)
wait()
d.setf("started",1)
-- <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> ƨ<>ܹ<EFBFBD><DCB9>ȴµ<C8B4> <20>ڱ⸸ <20><><EFBFBD>Ƽ<EFBFBD> exit timer<65><72> <20><><EFBFBD>µǸ<C2B5> <20>ȵǴϱ<C7B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ҷ<EFBFBD><D2B6><EFBFBD> <20><>
server_timer ("flame_dungeon_45m_left_timer",15*60, d.get_map_index())
notice_multiline(gameforge.flame_dungeon._250_notice,d.notice)
notice_multiline(gameforge.flame_dungeon._170_notice,d.notice)
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>õ<EFBFBD> ó<><C3B3>
-- <20><><EFBFBD><EFBFBD> <20>Ŀ<EFBFBD> Ƽ<><C6BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ƨ<>ܳ<EFBFBD><DCB3><EFBFBD> <20><><EFBFBD>ؼ<EFBFBD> Ÿ<≯Ӹ<CCB8> <20>̿<EFBFBD><CCBF><EFBFBD> Ƽ<><C6BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
local pids = {party.get_member_pids()}
local ticketGroup = {71095, 1, 71130, 1}
for i, pid in next, pids, nil do
q.begin_other_pc_block(pid)
local canPass = false
for idx=1, table.getn(ticketGroup),2 do
if pc.count_item(ticketGroup[idx]) >= ticketGroup[idx+1] then
canPass = true
pc.remove_item(ticketGroup[idx], ticketGroup[idx+1])
break
end
end
if not canPass then
pc.warp(setting.outside_entry_pos[1]*100, setting.outside_entry_pos[2] * 100, 62)
end
q.end_other_pc_block()
end
d.setqf2("flame_dungeon","ticket_delete",1)
d.setf("dungeon_enter",1)
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ƽ<EFBFBD><C6BC> <20><><EFBFBD>ο<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
party.setf("dungeon_index", d.get_map_index())
d.setf("party_leader_pid", party.get_leader_pid())
end
if d.getf("level") < 7 then --<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴϸ<C6B4>
if d.getf("clear_count") == 6 then -- <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
d.setf("level",7)
else
local rand = number(1,6)--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>湮üũ<C3BC><C5A9> <20><><EFBFBD><EFBFBD> <20><EFBFBD><E8BFAD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD> üũ<C3BC><C5A9>
local setlev = 0
d.setf("level",7) -- Ȥ<><C8A4> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>
for i=1,50 do
setlev = setlev + 1
if setlev > 6 then
setlev = 1
end
if not d.is_unique_dead("door"..setlev) then
rand = rand - 1
if rand == 0 then
d.setf("level",setlev)
d.setf("clear_count",d.getf("clear_count")+1)
break
end
end
end
end
end
if d.getf("level") == 1 then
say(gameforge.flame_dungeon._260_say)
notice_multiline(gameforge.flame_dungeon._260_say,d.notice)
d.kill_unique("door1")
d.kill_unique("idoor1")
d.setf("level",11)
d.regen_file ("data/dungeon/flame_dungeon/".."fd_a.txt")
server_timer ("killed_A_1", 12, d.get_map_index())
elseif d.getf("level") == 11 then
say(gameforge.flame_dungeon._270_say)
say_title(gameforge.flame_dungeon._280_sayTitle .. d.count_monster())
elseif d.getf("level") == 2 then
say(gameforge.flame_dungeon._290_say)
say(gameforge.flame_dungeon._300_say)
notice_multiline(gameforge.flame_dungeon._290_say,d.notice)
notice_multiline(gameforge.flame_dungeon._300_say,d.notice)
d.spawn_mob(20386, setting.LEVEL2_STONE_pos[1], setting.LEVEL2_STONE_pos[2]) -- <20><><EFBFBD>μ<EFBFBD> <20><>ȯ
d.kill_unique("door2")
d.kill_unique("idoor2")
d.set_regen_file ("data/dungeon/flame_dungeon/".."fd_b.txt")
d.setf("level",12)
elseif d.getf("level") == 12 then
say(gameforge.flame_dungeon._310_say)
elseif d.getf("level") == 3 then
say(gameforge.flame_dungeon._260_say)
notice_multiline(gameforge.flame_dungeon._260_say,d.notice)
d.kill_unique("door3")
d.kill_unique("idoor3")
d.setf("level",13)
d.regen_file ("data/dungeon/flame_dungeon/".."fd_c.txt")
server_timer ("killed_A_1", 12, d.get_map_index())
elseif d.getf("level") == 13 then
say(gameforge.flame_dungeon._270_say)
say_title(gameforge.flame_dungeon._280_sayTitle..d.count_monster())
elseif d.getf("level") == 4 then -- 474 178
say(gameforge.flame_dungeon._320_notice)
notice_multiline(gameforge.flame_dungeon._320_notice,d.notice)
d.setf("level",14)
d.kill_unique("door4")
d.kill_unique("idoor4")
d.set_regen_file ("data/dungeon/flame_dungeon/".."fd_d.txt")
d.spawn_mob(6051,setting.LEVEL4_TARGET_pos[1],setting.LEVEL4_TARGET_pos[2] ) -- Ÿ<>ٸ<EFBFBD><D9B8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
elseif d.getf("level") == 14 then
say(gameforge.flame_dungeon._330_say)
say(gameforge.flame_dungeon._340_say)
elseif d.getf("level") == 5 then -- 510 355
say(gameforge.flame_dungeon._350_say)
say(gameforge.flame_dungeon._360_say)
notice_multiline(gameforge.flame_dungeon._350_say,d.notice)
notice_multiline(gameforge.flame_dungeon._360_say,d.notice)
d.kill_unique("door5")
d.kill_unique("idoor5")
d.setf("level",15)
d.set_regen_file ("data/dungeon/flame_dungeon/".."fd_e.txt")
local vis = { 0,0,0,0,0,0,0}
for i=1,7 do
vis[i] = 0
end
for i = 1, 7 do -- <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD>ȯ
local ran = number(1,7)
local st = 0
for j = 1, 50 do
st = st + 1
if st > 7 then
st = 1
end
if vis[st] == 0 then
ran = ran - 1
if ran == 0 then
vis[st] = 1
d.set_unique("stone5_"..st, d.spawn_mob(20386, setting.LEVEL5_STONE_pos[i][1], setting.LEVEL5_STONE_pos[i][2]))
break
end
end
end
end
elseif d.getf("level") == 15 then
say(gameforge.flame_dungeon._370_say)
elseif d.getf("level") == 6 then -- 507 490
say(gameforge.flame_dungeon._380_say)
notice_multiline(gameforge.flame_dungeon._380_say,d.notice)
d.setf("level",16)
d.kill_unique("door6")
d.kill_unique("idoor6")
d.set_regen_file ("data/dungeon/flame_dungeon/".."fd_f.txt")
d.spawn_mob(8057, setting.LEVEL6_TARGET_pos[1],setting.LEVEL6_TARGET_pos[2]) -- Ÿ<>ٿ<EFBFBD><D9BF><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><>ȯ
elseif d.getf("level") == 16 then
say(gameforge.flame_dungeon._390_say)
say(gameforge.flame_dungeon._400_say)
elseif d.getf("level") == 7 then
-- setskin(NOWINDOW)
flame_dungeon.go_boss()
else
say(gameforge.flame_dungeon._410_say)
end
npc.unlock()
end
when dungeon_end_timer.server_timer begin -- <20><><EFBFBD><EFBFBD> Ÿ<≯<EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>°<EFBFBD>)
local setting = flame_dungeon.setting()
if d.select(get_server_timer_arg()) then
flame_dungeon.clear_timer(d.get_map_index())
d.set_warp_location(62, setting.outside_entry_pos[1] , setting.outside_entry_pos[2])
d.exit_all()
d.setf("party_leader_pid", 0)
end
end
when killed_A_1.server_timer begin -- Ÿ<≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1 (level1,level3)
if d.select(get_server_timer_arg()) then
if d.count_monster() <= 0 then -- 1<><31><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if d.getf("level") == 11 then
notice_multiline(gameforge.flame_dungeon._420_notice,d.notice)
notice_multiline(gameforge.flame_dungeon._430_notice,d.notice)
else
notice_multiline(gameforge.flame_dungeon._420_notice,d.notice)
notice_multiline(gameforge.flame_dungeon._430_notice,d.notice)
end
d.setf("level",0)
else
server_timer ("killed_A_1", 6, get_server_timer_arg())
end
end
end
when killed_A_2.server_timer begin -- Ÿ<≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2 (1<><31> 2 <20><><EFBFBD><EFBFBD><EFBFBD>ư<EFBFBD><C6B0><20><><EFBFBD>ư<EFBFBD>)
if d.select(get_server_timer_arg()) then
if d.count_monster() <= 0 then -- 1<><31><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if d.getf("level") == 11 then
notice_multiline(gameforge.flame_dungeon._420_notice,d.notice)
notice_multiline(gameforge.flame_dungeon._430_notice,d.notice)
else
notice_multiline(gameforge.flame_dungeon._420_notice,d.notice)
notice_multiline(gameforge.flame_dungeon._430_notice,d.notice)
end
d.setf("level",0)
else
server_timer ("killed_A_2", 6, get_server_timer_arg())
end
end
end
when kill with flame_dungeon.is_flamed(pc.get_map_index()) and d.getf("level") == 12 begin -- 2<><32><EFBFBD><EFBFBD> <20><><EFBFBD>μ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
local i = number(1, 100) -- 100<30><30><EFBFBD><EFBFBD> 1 Ȯ<><C8AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if i == 1 then
game.drop_item (30329, 1)
end
end
when 20386.take with flame_dungeon.is_flamed(pc.get_map_index()) and item.vnum == 30329 and d.getf("level") == 12 begin -- 2<><32><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ծ<EFBFBD><D4BE><EFBFBD><EFBFBD><EFBFBD>
local i = number(1, 5) -- 5<><35><EFBFBD><EFBFBD> 1 Ȯ<><C8AE><EFBFBD><EFBFBD> <20><>¥ <20><><EFBFBD><EFBFBD>
if i == 1 then
npc.purge()
item.remove()
notice_multiline(gameforge.flame_dungeon._440_notice,d.notice)
notice_multiline(gameforge.flame_dungeon._430_notice,d.notice)
flame_dungeon.level_clear()
else
item.remove()
say(gameforge.flame_dungeon._450_say)
end
end
when 6051.kill with flame_dungeon.is_flamed(pc.get_map_index()) and d.getf("level") == 14 begin
notice_multiline(gameforge.flame_dungeon._460_notice,d.notice)
notice_multiline(gameforge.flame_dungeon._430_notice,d.notice)
flame_dungeon.level_clear()
end
when kill with flame_dungeon.is_flamed(pc.get_map_index()) and d.getf("level") == 15 begin -- 5<><35><EFBFBD><EFBFBD> <20><><EFBFBD>μ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
local i = number(1, 30) -- 30<33><30><EFBFBD><EFBFBD> 1 Ȯ<><C8AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if i == 1 then
game.drop_item (30330, 1)
end
end
when 20386.take with flame_dungeon.is_flamed(d.get_map_index()) and item.vnum == 30330 and d.getf("level") == 15 begin -- 5<><35><EFBFBD><EFBFBD> <20><>¥<EFBFBD><C2A5><EFBFBD><EFBFBD> <20>Ծ<EFBFBD><D4BE><EFBFBD><EFBFBD><EFBFBD>
local setting = flame_dungeon.setting()
if npc.get_vid() == d.get_unique_vid("stone5_1") then -- ù<><C3B9>° <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ڸ<EFBFBD><DAB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
npc.purge()
item.remove()
say(gameforge.flame_dungeon._470_say)
d.setf("stonekill",2) -- 2<><32> <20><><EFBFBD><EFBFBD> <20>׿<EFBFBD><D7BF><EFBFBD>
if d.count_monster() < 100 then
d.regen_file ("data/dungeon/flame_dungeon/".."fd_e.txt")
end
elseif npc.get_vid() == d.get_unique_vid("stone5_2") then
if d.getf("stonekill") == 2 then -- 2<><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>˵<EFBFBD> 2<><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20>Կ<EFBFBD><D4BF><EFBFBD> <20><>
npc.purge()
item.remove()
say(gameforge.flame_dungeon._480_say)
d.setf("stonekill",3)
if d.count_monster() < 100 then
d.regen_file ("data/dungeon/flame_dungeon/".."fd_e.txt")
end
else
item.remove()
say(gameforge.flame_dungeon._490_say)
-- say("2<><32>")
end
elseif npc.get_vid() == d.get_unique_vid("stone5_3") then
if d.getf("stonekill") == 3 then
npc.purge()
item.remove()
say(gameforge.flame_dungeon._500_say)
d.setf("stonekill",4)
if d.count_monster() < 100 then
d.regen_file ("data/dungeon/flame_dungeon/".."fd_e.txt")
end
else
item.remove()
say(gameforge.flame_dungeon._490_say)
-- say("3<><33>")
end
elseif npc.get_vid() == d.get_unique_vid("stone5_4") then
if d.getf("stonekill") == 4 then
npc.purge()
item.remove()
say(gameforge.flame_dungeon._510_say)
d.setf("stonekill",5)
if d.count_monster() < 100 then
d.regen_file ("data/dungeon/flame_dungeon/".."fd_e.txt")
end
else
item.remove()
say(gameforge.flame_dungeon._490_say)
-- say("4<><34>")
end
elseif npc.get_vid() == d.get_unique_vid("stone5_5") then
if d.getf("stonekill") == 5 then
npc.purge()
item.remove()
say(gameforge.flame_dungeon._520_say)
d.setf("stonekill",6)
if d.count_monster() < 100 then
d.regen_file ("data/dungeon/flame_dungeon/".."fd_e.txt")
end
else
item.remove()
say(gameforge.flame_dungeon._490_say)
-- say("5<><35>")
end
elseif npc.get_vid() == d.get_unique_vid("stone5_6") then
if d.getf("stonekill") == 6 then
npc.purge()
item.remove()
say(gameforge.flame_dungeon._530_say)
d.setf("stonekill",7)
if d.count_monster() < 100 then
d.regen_file ("data/dungeon/flame_dungeon/".."fd_e.txt")
end
else
item.remove()
say(gameforge.flame_dungeon._490_say)
-- say("6<><36>")
end
else
if d.getf("stonekill") == 7 then
npc.purge()
item.remove()
notice_multiline(gameforge.flame_dungeon._440_notice,d.notice)
notice_multiline(gameforge.flame_dungeon._430_notice,d.notice)
flame_dungeon.level_clear()
else
item.remove()
say(gameforge.flame_dungeon._490_say)
-- say("7<><37>")
end
end
end
when 8057.kill with flame_dungeon.is_flamed(d.get_map_index()) and d.getf("level") ==16 begin -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD> <20><>
notice_multiline(gameforge.flame_dungeon._540_notice,d.notice)
notice_multiline(gameforge.flame_dungeon._430_notice,d.notice)
flame_dungeon.level_clear()
end
when 6091.kill with flame_dungeon.is_flamed(d.get_map_index()) and d.getf("level") ==17 begin -- <20><><EFBFBD><EFBFBD> <20>׿<EFBFBD><D7BF><EFBFBD><EFBFBD><EFBFBD>
notice_multiline(gameforge.flame_dungeon._550_notice,d.notice)
notice_multiline(gameforge.flame_dungeon._560_notice,d.notice)
server_timer("dungeon_end_timer", 60,d.get_map_index())
flame_dungeon.level_clear()
-- <20><>Ƽ<EFBFBD><C6BC> <20><>, <20>߸<EFBFBD>õ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ(104<30><34>, 105<30><35> <20><><EFBFBD><EFBFBD>Ʈ) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ Ŭ<><C5AC><EFBFBD><EFBFBD> <20>ǵ<EFBFBD><C7B5><EFBFBD>.
if party.is_party() then
party.setf("flame_dungeon_boss_kill_count", 1)
end
end
end
end

View File

@ -1,541 +0,0 @@
quest main_quest_flame_lv100 begin
state start begin
end
state state0 begin
when login or levelup or enter with pc.level >= 100 begin
set_state (state1_1)
end
end
-- Ź<><C5B9><EFBFBD><EFBFBD> <20><>ü
state state1_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv100._010_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv100._010_sendLetter)
say(gameforge.main_quest_flame_lv100._020_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv100._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv100._030_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv100._040_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv100._060_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv100._070_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv100._080_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state1_2)
end
when leave begin
--q.done()
end
end
state state1_2 begin
when enter begin
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> óġ <20><> <20><><EFBFBD><EFBFBD>
pc.setqf("kill_count_1", 0)
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv100._090_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv100._010_sendLetter)
--<2D><><EFBFBD><EFBFBD> óġ <20><> <20>ȳ<EFBFBD><C8B3><EFBFBD>
q.set_counter_name(gameforge.main_quest_lv98._680_counterName)
main_quest_flame_lv100.kill_count()
end
when button or info begin
say_title(gameforge.main_quest_flame_lv100._100_sayTitle)
say(gameforge.main_quest_flame_lv100._110_say)
--<2D><><EFBFBD><EFBFBD> óġ <20><> <20>ȳ<EFBFBD><C8B3><EFBFBD>
say(gameforge.main_quest_lv98._680_counterName)
say(string.format(gameforge.main_quest_lv98._670_sayReward, 300 - pc.getqf("kill_count_1")))
end
when 20377.chat.gameforge.main_quest_flame_lv100._010_sendLetter begin
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv100._120_say)
end
when 2202.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
main_quest_flame_lv100.kill_count()
end
when 2203.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
main_quest_flame_lv100.kill_count()
end
when 2204.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
main_quest_flame_lv100.kill_count()
end
when 2205.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
main_quest_flame_lv100.kill_count()
end
-- <20><> <20>Ʒ<EFBFBD><C6B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> vnum<75><6D> <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> Ŭ<><C5AC><EFBFBD><EFBFBD> <20>ǵ<EFBFBD><C7B5><EFBFBD> <20>Ͽ<EFBFBD><CFBF><EFBFBD>.
when 7020.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
main_quest_flame_lv100.kill_count()
end
when 7021.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
main_quest_flame_lv100.kill_count()
end
when 7022.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
main_quest_flame_lv100.kill_count()
end
when 7023.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
main_quest_flame_lv100.kill_count()
end
function kill_count()
local total_remain = 0
local remain1 = 300 - pc.getqf("kill_count_1")
if remain1 < 0 then
remain1 = 0
end
total_remain = total_remain + remain1
q.set_counter_value(total_remain)
if total_remain == 0 then
set_state ("state1_3")
end
end
when leave begin
pc.setqf("kill_count_1", 0)
--q.done()
end
end
state state1_3 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv100._130_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv100._010_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv100._010_sendLetter)
say(gameforge.main_quest_flame_lv100._140_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv100._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv100._150_say)
--<2D><><EFBFBD><EFBFBD>
wait()--reward
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 38143000))
pc.give_exp2(38143000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 149000))
pc.change_money(149000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(30051),1))
pc.give_item2(30051, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(50814),10))
pc.give_item2(50814, 10)
say()
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state2_1)
end
when leave begin
--q.done()
end
end
-- Ź<><C5B9><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>1-1
state state2_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv100._160_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20001)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20001))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv100._160_sendLetter)
say(gameforge.main_quest_flame_lv100._170_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20001.chat.gameforge.main_quest_flame_lv100._160_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20001))
say(gameforge.main_quest_flame_lv100._180_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20001))
say(gameforge.main_quest_flame_lv100._190_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv100._200_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20001))
say(gameforge.main_quest_flame_lv100._210_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv100._220_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20001))
say(gameforge.main_quest_flame_lv100._230_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state2_2)
end
when leave begin
--q.done()
end
end
state state2_2 begin -- <20><><EFBFBD><20><><EFBFBD>ƿ<EFBFBD><C6BF><EFBFBD> <20>κ<EFBFBD>. <20><><EFBFBD><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ľ<EFBFBD><C4BE><EFBFBD> <20>ȵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> state <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>Ϸ<EFBFBD><CFB7><EFBFBD> <20><> <20>ִ<EFBFBD>.
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv100._240_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv100._160_sendLetter)
q.set_counter_name(gameforge.main_quest_flame_lv100._250_say)
end
when button or info begin
say_title(gameforge.main_quest_flame_lv100._260_sayTitle)
say(gameforge.main_quest_flame_lv100._270_say)
say(gameforge.main_quest_flame_lv100._250_say)
local remain1 = 10 - pc.count_item(90010)
local remain2 = 50 - pc.count_item(30010)
local remain3 = 10 - pc.count_item(30025)
local remain4 = 200 - pc.count_item(51001)
if remain1 < 0 then
remain1 = 0
end
if remain2 < 0 then
remain2 = 0
end
if remain3 < 0 then
remain3 = 0
end
if remain4 < 0 then
remain4 = 0
end
say(string.format(gameforge.main_quest_lv98._690_sayReward,item_name(90010) ,remain1,item_name(30010) ,remain2))
say(string.format(gameforge.main_quest_lv98._690_sayReward,item_name(30025) , remain3,item_name(51001) , remain4))
say()
q.set_counter_value(remain1 + remain2 + remain3 + remain4)
local check = remain1 + remain2 + remain3 + remain4
if check <= 0 then
set_state (state2_3)
end
end
when 20001.chat.gameforge.main_quest_flame_lv100._160_sendLetter begin
if pc.count_item(90010) >= 10 and pc.count_item(30010) >= 50
and pc.count_item(30025) >= 10 and pc.count_item(51001) >= 200 then
pc.remove_item ( 90010,10)
pc.remove_item ( 30010,50)
pc.remove_item ( 30025,10)
pc.remove_item ( 51001,200)
say_title(mob_name(20001))
say(gameforge.main_quest_flame_lv100._280_say)
wait()
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 48584000))
pc.give_exp2(48584000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 150000))
pc.change_money(150000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(30015),2))
pc.give_item2(30015, 2)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(70043),1))
pc.give_item2_select(70043)
item.set_socket(2, 60)
set_state (state3_1)
else
say_title(mob_name(20001))
say(gameforge.main_quest_flame_lv100._290_say)
end
end
when leave begin
--q.done()
end
end
state state2_3 begin -- <20><><EFBFBD><20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ҵ<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>Ŀ<EFBFBD> <20><><EFBFBD><20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><E7BFA1> <20><><EFBFBD><EFBFBD> <20>ɸ<EFBFBD> state2_2<5F><32> <20>ٽ<EFBFBD> <20>Ѿ<D1BE><EEB0A1> <20>ȴ<EFBFBD>.
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv100._300_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv100._160_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20001)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20001))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv100._160_sendLetter)
say(gameforge.main_quest_flame_lv100._310_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20001.chat.gameforge.main_quest_flame_lv100._160_sendLetter begin
target.delete("__TARGET__")
if pc.count_item(90010) >= 10 and pc.count_item(30010) >= 50
and pc.count_item(30025) >= 10 and pc.count_item(51001) >= 200 then
pc.remove_item ( 90010,10)
pc.remove_item ( 30010,50)
pc.remove_item ( 30025,10)
pc.remove_item ( 51001,200)
say_title(mob_name(20001))
say(gameforge.main_quest_flame_lv100._280_say)
wait()
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 48584000))
pc.give_exp2(48584000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 150000))
pc.change_money(150000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(30015),2))
pc.give_item2(30015, 2)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(70043),1))
pc.give_item2_select(70043)
item.set_socket(2, 60)
say()
set_state (state3_1)
else
say_title(mob_name(20001))
say(gameforge.main_quest_flame_lv100._290_say)
set_state (state2_2)
end
end
when leave begin
--q.done()
end
end
-- Ź<><C5B9><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>1-2
state state3_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv100._320_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20001)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20001))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv100._320_sendLetter)
say(gameforge.main_quest_flame_lv100._170_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20001.chat.gameforge.main_quest_flame_lv100._320_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20001))
say(gameforge.main_quest_flame_lv100._330_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv100._340_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20001))
say(gameforge.main_quest_flame_lv100._350_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state3_2)
end
when leave begin
--q.done()
end
end
state state3_2 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv100._240_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv100._320_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20016)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20016))
end
q.set_counter_name(gameforge.main_quest_flame_lv100._250_say)
q.set_counter_value(1)
end
when button or info begin
say_title(gameforge.main_quest_flame_lv100._360_sayTitle)
say(gameforge.main_quest_flame_lv100._370_say)
say(gameforge.main_quest_flame_lv100._250_say)
say(gameforge.main_quest_flame_lv100._380_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20016.chat.gameforge.main_quest_flame_lv100._320_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20016))
say(gameforge.main_quest_flame_lv100._390_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv100._400_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20016))
say(gameforge.main_quest_flame_lv100._410_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv100._420_say)
pc.give_item2(31077, 1)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state3_3)
end
when 20001.chat.gameforge.main_quest_flame_lv100._320_sendLetter begin
say_title(mob_name(20001))
say(gameforge.main_quest_flame_lv100._430_say)
end
when leave begin
--q.done()
end
end
state state3_3 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv100._440_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv100._320_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20001)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20001))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv100._320_sendLetter)
say(gameforge.main_quest_flame_lv100._310_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20001.chat.gameforge.main_quest_flame_lv100._320_sendLetter begin
target.delete("__TARGET__")
pc.remove_item(31077, pc.count_item(31077))
say_title(mob_name(20001))
say(gameforge.main_quest_flame_lv100._450_say)
--<2D><><EFBFBD><EFBFBD>
wait()--reward
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 35843000))
pc.give_exp2(35843000)
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 152000))
pc.change_money(152000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71095),1))
pc.give_item2(71095, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(50708),10))
pc.give_item2(50708, 10)
say()
say_reward(string.format(gameforge.main_quest_flame_lv99._430_say, 101))
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (__COMPLETE__)
set_quest_state ("main_quest_flame_lv101", "state0")
end
when leave begin
--q.done()
end
end
state __COMPLETE__ begin
when enter begin
--q.done()
end
end
end

View File

@ -1,521 +0,0 @@
quest main_quest_flame_lv101 begin
state start begin
end
state state0 begin
when login or levelup or enter with pc.level >= 101 begin
set_state (state1_1)
end
end
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ü
state state1_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv101._010_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv101._010_sendLetter)
say(gameforge.main_quest_flame_lv101._020_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv101._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv101._030_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv101._040_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv101._050_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv101._070_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv101._080_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state1_2)
end
when leave begin
--q.done()
end
end
state state1_2 begin -- <20>ܼ<EFBFBD> X, <20><><EFBFBD><EFBFBD> X
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv101._090_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv101._010_sendLetter)
q.set_counter_name(gameforge.main_quest_lv97._670_counterName)
q.set_counter_value(2)
end
when button or info begin
say_title(gameforge.main_quest_flame_lv101._100_sayTitle)
say(gameforge.main_quest_flame_lv101._110_say)
say(gameforge.main_quest_lv97._670_counterName)
say(string.format(gameforge.main_quest_lv90._1190_say, item_name(31074), 1))
say(string.format(gameforge.main_quest_lv90._1190_say, item_name(31079), 1))
say()
say_reward(gameforge.main_quest_flame_lv101._120_sayReward)
end
when 20377.chat.gameforge.main_quest_flame_lv101._010_sendLetter begin
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv101._130_say)
end
when 20393.click begin
say(gameforge.main_quest_flame_lv101._140_say)
set_state (state1_3) -- <20>ܼ<EFBFBD> X, <20><><EFBFBD><EFBFBD> O
end
when kill with pc.get_map_index() >= 351 * 10000 and pc.get_map_index() < (351 + 1) *10000 begin
if number(1,100) == 1 then
pc.give_item2(31074, 1)
set_state (state1_4) -- <20>ܼ<EFBFBD> O, <20><><EFBFBD><EFBFBD> X
end
end
when leave begin
--q.done()
end
end
state state1_3 begin -- <20>ܼ<EFBFBD> X, <20><><EFBFBD><EFBFBD> O
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv101._150_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv101._010_sendLetter)
q.set_counter_name(gameforge.main_quest_lv97._670_counterName)
q.set_counter_value(1)
end
when button or info begin
say_title(gameforge.main_quest_flame_lv101._100_sayTitle)
say(gameforge.main_quest_flame_lv101._110_say)
say(gameforge.main_quest_lv97._670_counterName)
say(string.format(gameforge.main_quest_lv90._1190_say, item_name(31074), 1))
say(string.format(gameforge.main_quest_lv90._1190_say, item_name(31079), 0))
say()
say_reward(gameforge.main_quest_flame_lv101._120_sayReward)
end
when 20377.chat.gameforge.main_quest_flame_lv101._010_sendLetter begin
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv101._160_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv101._180_say)
end
when kill with pc.get_map_index() >= 351 * 10000 and pc.get_map_index() < (351 + 1) *10000 begin
if number(1,100) == 1 then
pc.give_item2(31074, 1)
set_state ("state1_5") -- <20>ܼ<EFBFBD> O, <20><><EFBFBD><EFBFBD> O
end
end
when leave begin
--q.done()
end
end
state state1_4 begin -- <20>ܼ<EFBFBD> O, <20><><EFBFBD><EFBFBD> X
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv101._190_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv101._010_sendLetter)
q.set_counter_name(gameforge.main_quest_lv97._670_counterName)
q.set_counter_value(1)
end
when button or info begin
say_title(gameforge.main_quest_flame_lv101._100_sayTitle)
say(gameforge.main_quest_flame_lv101._110_say)
say(gameforge.main_quest_lv97._670_counterName)
say(string.format(gameforge.main_quest_lv90._1190_say, item_name(31074), 0))
say(string.format(gameforge.main_quest_lv90._1190_say, item_name(31079), 1))
say()
say_reward(gameforge.main_quest_flame_lv101._120_sayReward)
end
when 20377.chat.gameforge.main_quest_flame_lv101._010_sendLetter begin
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv101._200_say)
end
when 20393.click begin
say(gameforge.main_quest_flame_lv101._140_say)
set_state (state1_5)
end
when leave begin
--q.done()
end
end
state state1_5 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv101._210_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv101._010_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv101._010_sendLetter)
say(gameforge.main_quest_flame_lv101._220_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv101._010_sendLetter begin
target.delete("__TARGET__")
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
pc.remove_item(31074, pc.count_item(31074))
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv101._230_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv101._250_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(gameforge.main_quest_flame_lv101._260_sayTitle)
say(gameforge.main_quest_flame_lv101._270_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv101._280_say)
--<2D><><EFBFBD><EFBFBD>
wait()--reward
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 37003000))
pc.give_exp2(37003000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 153000))
pc.change_money(153000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(30047),2))
pc.give_item2(30047, 2)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(27992),2)) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pc.give_item2(27992, 1)
pc.give_item2(27992, 1)
say()
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state2_1)
end
when leave begin
--q.done()
end
end
-- <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ص<EFBFBD>
state state2_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv101._290_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv101._290_sendLetter)
say(gameforge.main_quest_flame_lv101._300_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20380.chat.gameforge.main_quest_flame_lv101._290_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv101._310_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv101._330_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv101._340_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv101._350_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state2_2)
end
when leave begin
--q.done()
end
end
state state2_2 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv101._360_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv101._290_sendLetter)
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
q.set_counter_name(gameforge.main_quest_lv97._670_counterName)
main_quest_flame_lv101.item_count()
end
when button or info begin
say_title(gameforge.main_quest_flame_lv101._100_sayTitle)
say(gameforge.main_quest_flame_lv101._520_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȳ<EFBFBD><C8B3><EFBFBD>
say(gameforge.main_quest_lv97._670_counterName)
say(string.format(gameforge.main_quest_lv90._1190_say,item_name(31080), 1 - pc.count_item(31080)))
end
when 20380.chat.gameforge.main_quest_flame_lv101._290_sendLetter begin
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv101._370_say)
end
when 2206.kill begin
if number(1,100) == 1 then
pc.give_item2(31080, 1)
main_quest_flame_lv101.item_count()
end
end
function item_count()
if pc.count_item(31080) >= 1 then
set_state ("state2_3")
end
q.set_counter_value(1 - pc.count_item(31080))
end
when leave begin
--q.done()
end
end
state state2_3 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv101._380_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv101._290_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv101._290_sendLetter)
say(gameforge.main_quest_flame_lv101._390_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20380.chat.gameforge.main_quest_flame_lv101._290_sendLetter begin
target.delete("__TARGET__")
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
pc.remove_item(31080, pc.count_item(31080))
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv101._400_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
wait()--reward
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 48584000))
pc.give_exp2( 48584000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 154000))
pc.change_money(154000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(72024),1)) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȭ
pc.give_item2_select(72024)
item.set_socket(2, 180)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71094),1)) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
pc.give_item2(71094, 1)
say()
set_state (state2_4)
end
when leave begin
--q.done()
end
end
state state2_4 begin
when enter begin
--<2D>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
pc.setqf("limit_time", get_time() + 60*60*24)
end
when login begin
--<2D>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
local remain_time = pc.getqf("limit_time") - get_time()
timer("time_over", remain_time)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv101._290_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv101._290_sendLetter)
say(gameforge.main_quest_flame_lv101._390_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
local remain_time = pc.getqf("limit_time") - get_time()
local left_hour = math.mod(remain_time / (60 * 60), 24);
local left_minute = math.mod(remain_time / 60, 60);
say(string.format(gameforge.main_quest_flame_lv101._410_say, left_hour, left_minute))
--say_reward(locale.target_npc_info)
end
when 20380.chat.gameforge.main_quest_flame_lv101._290_sendLetter begin
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv101._420_say)
end
when time_over.timer begin
set_state ("state3_1")
end
when leave begin
pc.setqf("limit_time", 0);
--q.done()
end
end
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
state state3_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv101._430_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv101._430_sendLetter)
say(gameforge.main_quest_flame_lv101._300_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20380.chat.gameforge.main_quest_flame_lv101._430_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv101._440_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv101._450_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv101._340_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
set_state (state3_2)
end
when leave begin
--q.done()
end
end
state state3_2 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv101._470_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv101._430_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv101._480_sayTitle)
say(gameforge.main_quest_flame_lv101._490_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv101._430_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv101._500_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv101._510_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(gameforge.main_quest_lv27._120_sayTitle)
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 48584000))
pc.give_exp2( 48584000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 156000))
pc.change_money( 156000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71095),1)) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pc.give_item2(71095, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(72016),1)) -- <20><>3<EFBFBD><33> <20><>
pc.give_item2_select(72016)
item.set_socket(2, 60)
say()
say_title(string.format(gameforge.main_quest_flame_lv99._430_say, 102))
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (__COMPLETE__)
set_quest_state ("main_quest_flame_lv102", "state0")
end
when leave begin
--q.done()
end
end
state __COMPLETE__ begin
when enter begin
--q.done()
end
end
end

View File

@ -1,623 +0,0 @@
quest main_quest_flame_lv102 begin
state start begin
end
state state0 begin
when login or levelup or enter with pc.level >= 102 begin
set_state (state1_1)
end
end
-- <20><><EFBFBD><EFBFBD>
state state1_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv102._010_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv102._010_sendLetter)
say(gameforge.main_quest_flame_lv102._020_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv102._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv102._030_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv102._040_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv102._050_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv102._060_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state1_2)
end
when leave begin
--q.done()
end
end
state state1_2 begin --<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ƿ<EFBFBD><C6BF><EFBFBD> <20>κ<EFBFBD>.
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv102._070_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv102._010_sendLetter)
q.set_counter_name(gameforge.main_quest_lv97._670_counterName)
main_quest_flame_lv102.kill_count()
end
when button or info begin
say_title(gameforge.main_quest_flame_lv102._080_sayTitle)
say(gameforge.main_quest_flame_lv102._090_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȳ<EFBFBD><C8B3><EFBFBD>
local remain1 = 30 - pc.getqf("mob1")
if remain1 < 0 then
remain1 = 0
end
local remain2 = 30 - pc.getqf("mob2")
if remain2 < 0 then
remain2 = 0
end
local remain3 = 30 - pc.getqf("mob3")
if remain3 < 0 then
remain3 = 0
end
local remain4 = 30 - pc.getqf("mob4")
if remain4 < 0 then
remain4 = 0
end
say(gameforge.main_quest_lv97._670_counterName)
say(string.format(gameforge.main_quest_flame_lv102._100_say,mob_name(6005), remain1,mob_name(6006), remain2))
say(string.format(gameforge.main_quest_flame_lv102._110_say,mob_name(6007), remain3,mob_name(6008), remain4))
end
when 20377.chat.gameforge.main_quest_flame_lv102._010_sendLetter begin
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv102._120_say)
end
when 6005.kill begin
if number(1,1) == 1 then
local kill_count = pc.getqf("mob1")
pc.setqf("mob1", kill_count + 1)
main_quest_flame_lv102.kill_count()
end
end
when 6006.kill begin
if number(1,1) == 1 then
local kill_count = pc.getqf("mob2")
pc.setqf("mob2", kill_count + 1)
main_quest_flame_lv102.kill_count()
end
end
when 6007.kill begin
if number(1,1) == 1 then
local kill_count = pc.getqf("mob3")
pc.setqf("mob3", kill_count + 1)
main_quest_flame_lv102.kill_count()
end
end
when 6008.kill begin
if number(1,1) == 1 then
local kill_count = pc.getqf("mob4")
pc.setqf("mob4", kill_count + 1)
main_quest_flame_lv102.kill_count()
end
end
function kill_count()
local total_remain = 0
local remain1 = 30 - pc.getqf("mob1")
if remain1 < 0 then
remain1 = 0
end
local remain2 = 30 - pc.getqf("mob2")
if remain2 < 0 then
remain2 = 0
end
local remain3 = 30 - pc.getqf("mob3")
if remain3 < 0 then
remain3 = 0
end
local remain4 = 30 - pc.getqf("mob4")
if remain4 < 0 then
remain4 = 0
end
total_remain = remain1 + remain2 + remain3 + remain4
q.set_counter_value(total_remain)
if total_remain == 0 then
set_state ("state1_3")
end
end
when leave begin
--q.done()
end
end
state state1_3 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv102._130_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv102._010_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv102._010_sendLetter)
say(gameforge.main_quest_flame_lv102._140_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv102._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv102._150_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv102._170_say)
--<2D><><EFBFBD><EFBFBD>
wait()--reward
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 49584000))
pc.give_exp2( 49584000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 157000))
pc.change_money(157000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71095),1))
pc.give_item2(71095, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(72723),1)) -- ȭ<><C8AD><EFBFBD><EFBFBD> <20>ູ(<28><>)
pc.give_item2(72723, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(70050),1)) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ǥ
pc.give_item2(70050, 1)
say()
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state2_1)
end
when leave begin
--q.done()
end
end
-- <20><><EFBFBD><EFBFBD> <20>߸<EFBFBD>õ?!
state state2_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv102._180_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv102._180_sendLetter)
say(gameforge.main_quest_flame_lv102._190_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20380.chat.gameforge.main_quest_flame_lv102._180_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv102._200_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv102._220_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv102._250_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv102._050_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv102._260_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state2_2)
end
when leave begin
--q.done()
end
end
state state2_2 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv102._270_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv102._180_sendLetter)
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
q.set_counter_name(gameforge.main_quest_lv97._670_counterName)
end
when button or info begin
say_title(gameforge.main_quest_flame_lv102._280_sayTitle)
say(gameforge.main_quest_flame_lv102._290_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȳ<EFBFBD><C8B3><EFBFBD>
say(gameforge.main_quest_lv97._670_counterName)
say(string.format(gameforge.main_quest_lv90._1190_say,item_name(31081), 10 - pc.count_item(31081)))
say_reward(gameforge.main_quest_flame_lv102._300_sayReward)
end
when 20380.chat.gameforge.main_quest_flame_lv102._180_sendLetter begin
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv102._310_say)
end
when kill with pc.get_map_index() >= 351 * 10000 and pc.get_map_index() < (351 + 1) *10000 begin
if number(1,50) == 1 then
pc.give_item2(31081, 1)
main_quest_flame_lv102.item_count()
end
end
function item_count()
if pc.count_item(31081) >= 10 then
set_state ("state2_3")
end
q.set_counter_value(10 - pc.count_item(31081))
end
when leave begin
--q.done()
end
end
state state2_3 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv102._320_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv102._180_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv102._180_sendLetter)
say(gameforge.main_quest_flame_lv102._140_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20380.chat.gameforge.main_quest_flame_lv102._180_sendLetter begin
target.delete("__TARGET__")
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
pc.remove_item(31081, pc.count_item(31081))
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv102._330_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(gameforge.main_quest_lv27._120_sayTitle)
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 52484000))
pc.give_exp2( 52484000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 159000))
pc.change_money( 159000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(72301),5)) -- <20><EFBFBD><E0BAB9> <20><>
pc.give_item2(72301, 1)
pc.give_item2(72301, 1)
pc.give_item2(72301, 1)
pc.give_item2(72301, 1)
pc.give_item2(72301, 1)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state3_1)
end
when leave begin
--q.done()
end
end
-- Ź<><C5B9><EFBFBD><EFBFBD> <20><>ȭ
state state3_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv102._350_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv102._350_sendLetter)
say(gameforge.main_quest_flame_lv102._190_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20380.chat.gameforge.main_quest_flame_lv102._350_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv102._360_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv102._380_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv102._390_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv102._050_say)
set_state (state3_2)
end
when leave begin
--q.done()
end
end
state state3_2 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv102._410_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv102._350_sendLetter)
q.set_counter_name(gameforge.main_quest_lv97._670_counterName)
end
when button or info begin
say_title(gameforge.main_quest_flame_lv102._420_sayTitle)
say(gameforge.main_quest_flame_lv102._430_say)
say(gameforge.main_quest_lv97._670_counterName)
local remain1 = 50 - pc.count_item(50819)
local remain2 = 100 - pc.count_item(51001)
if remain1 < 0 then
remain1 = 0
end
if remain2 < 0 then
remain2 = 0
end
say(string.format(gameforge.main_quest_lv98._690_sayReward,item_name(50819) ,remain1,item_name(51001) ,remain2))
q.set_counter_value(remain1 + remain2)
if remain1 + remain2 == 0 then
set_state ("state3_3")
end
end
when 20017.chat.gameforge.main_quest_flame_lv102._350_sendLetter begin
if pc.count_item(50819) >= 50 and pc.count_item(51001) >= 100 then
pc.remove_item ( 50819,50)
pc.remove_item ( 51001,100)
say_title(mob_name(20017))
say(gameforge.main_quest_flame_lv102._440_say)
wait()
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 48584000))
pc.give_exp2( 48584000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 160000))
pc.change_money( 160000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(50708),10)) -- <20><><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD>
pc.give_item2(50708, 10)
say()
set_state (state4_1)
else
say_title(mob_name(20017))
say(gameforge.main_quest_flame_lv102._450_say)
end
end
when leave begin
--q.done()
end
end
state state3_3 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv102._460_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv102._350_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20017)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20017))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv102._350_sendLetter)
say(gameforge.main_quest_flame_lv102._470_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20017.chat.gameforge.main_quest_flame_lv102._350_sendLetter begin
if pc.count_item(50819) >= 50 and pc.count_item(51001) >= 100 then
pc.remove_item ( 50819,50)
pc.remove_item ( 51001,100)
target.delete("__TARGET__")
say_title(mob_name(20017))
say(gameforge.main_quest_flame_lv102._440_say)
wait()
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 48584000))
pc.give_exp2( 48584000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 160000))
pc.change_money( 160000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(50708),10)) -- <20><><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD>
pc.give_item2(50708, 10)
say()
set_state (state4_1)
else
say_title(mob_name(20017))
say(gameforge.main_quest_flame_lv102._450_say)
set_state (state3_2)
end
end
when leave begin
--q.done()
end
end
-- <20><>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD>
state state4_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv102._480_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20017)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20017))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv102._480_sendLetter)
say(gameforge.main_quest_flame_lv102._490_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20017.chat.gameforge.main_quest_flame_lv102._480_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20017))
say(gameforge.main_quest_flame_lv102._500_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv102._510_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20017))
say(gameforge.main_quest_flame_lv102._520_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv102._050_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20017))
say(gameforge.main_quest_flame_lv102._530_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state4_2)
end
when leave begin
--q.done()
end
end
state state4_2 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv102._540_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv102._480_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv102._480_sendLetter)
say(gameforge.main_quest_flame_lv102._140_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20017.chat.gameforge.main_quest_flame_lv102._480_sendLetter begin
say_title(mob_name(20017))
say(gameforge.main_quest_flame_lv102._550_say)
end
when 20377.chat.gameforge.main_quest_flame_lv102._480_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv102._560_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv102._570_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv102._580_say)
--<2D><><EFBFBD><EFBFBD>
wait()--reward
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 42584000))
pc.give_exp2(42584000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 161000))
pc.change_money( 161000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(76011),1)) -- <20><><EFBFBD><EFBFBD>
pc.give_item2_select(76011)
item.set_socket(2, 60)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(50707),5)) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pc.give_item2(50707, 5)
say()
say_title(string.format(gameforge.main_quest_flame_lv99._430_say, 103))
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (__COMPLETE__)
set_quest_state ("main_quest_flame_lv103", "state0")
end
when leave begin
--q.done()
end
end
state __COMPLETE__ begin
when enter begin
--q.done()
end
end
end

View File

@ -1,694 +0,0 @@
quest main_quest_flame_lv103 begin
state start begin
end
state state0 begin
when login or levelup or enter with pc.level >= 103 begin
set_state (state1_1)
end
end
-- <20><><EFBFBD><EFBFBD><E6BCBA> <20><><EFBFBD><EFBFBD>
state state1_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv103._010_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv103._010_sendLetter)
say(gameforge.main_quest_flame_lv103._020_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv103._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv103._030_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv103._040_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv103._220_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv103._060_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state1_2)
end
when leave begin
--q.done()
end
end
state state1_2 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv103._070_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv103._010_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20393)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20393))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv103._080_sayTitle)
say(gameforge.main_quest_flame_lv103._090_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_info)
end
when 20377.chat.gameforge.main_quest_flame_lv103._010_sendLetter begin
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv103._100_say)
end
when 20393.click begin
target.delete("__TARGET__")
say_title(mob_name(20393))
say(gameforge.main_quest_flame_lv103._110_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state1_3)
end
when leave begin
--q.done()
end
end
state state1_3 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv103._010_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv103._010_sendLetter)
say(gameforge.main_quest_flame_lv103._120_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv103._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv103._130_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv103._150_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv103._170_say)
--<2D><><EFBFBD><EFBFBD>
wait()--reward
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 42554000))
pc.give_exp2( 42554000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 163000))
pc.change_money( 163000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71095),1))
pc.give_item2(71095, 1)
say()
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state2_1)
end
when leave begin
--q.done()
end
end
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
state state2_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv103._180_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv103._180_sendLetter)
say(gameforge.main_quest_flame_lv103._020_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv103._180_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv103._190_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv103._200_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv103._210_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv103._220_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state2_2)
end
when leave begin
--q.done()
end
end
state state2_2 begin
when enter begin
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> óġ <20><> <20><><EFBFBD><EFBFBD>
pc.setqf("kill_count_1", 0)
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv103._230_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv103._180_sendLetter)
--<2D><><EFBFBD><EFBFBD> óġ <20><> <20>ȳ<EFBFBD><C8B3><EFBFBD>
q.set_counter_name(gameforge.main_quest_lv98._680_counterName)
main_quest_flame_lv103.kill_count_state2_2()
end
when button or info begin
say_title(gameforge.main_quest_flame_lv103._240_sayTitle)
say(gameforge.main_quest_flame_lv103._250_say)
--<2D><><EFBFBD><EFBFBD> óġ <20><> <20>ȳ<EFBFBD><C8B3><EFBFBD>
say(gameforge.main_quest_lv98._680_counterName)
say(string.format(gameforge.main_quest_lv98._670_sayReward,"<22><><EFBFBD><20><><EFBFBD><EFBFBD>", 1000 - pc.getqf("kill_count_1")))
say_reward(gameforge.main_quest_flame_lv103._260_sayReward)
end
when 20377.chat.gameforge.main_quest_flame_lv103._180_sendLetter begin
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv103._270_say)
end
when kill with pc.get_map_index() >= 351 * 10000 and pc.get_map_index() < (351 + 1) *10000 begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
main_quest_flame_lv103.kill_count_state2_2()
end
function kill_count_state2_2()
local total_remain = 0
local remain1 = 1000 - pc.getqf("kill_count_1")
if remain1 < 0 then
remain1 = 0
end
total_remain = remain1
q.set_counter_value(total_remain)
if total_remain == 0 then
set_state ("state2_3")
end
end
when leave begin
pc.setqf("kill_count_1", 0)
--q.done()
end
end
state state2_3 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv103._280_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv103._180_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv103._180_sendLetter)
say(gameforge.main_quest_flame_lv103._120_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv103._180_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv103._290_say)
--<2D><><EFBFBD><EFBFBD>
wait()--reward
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 53784000))
pc.give_exp2(53784000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 164000))
pc.change_money(164000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71095),1))
pc.give_item2(71095, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(70024),1)) -- <20><EFBFBD><E0BAB9> <20><><EFBFBD><EFBFBD>
pc.give_item2(70024, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(30039),3)) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pc.give_item2(30039, 3)
say()
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state3_1)
end
when leave begin
--q.done()
end
end
-- <20><><EFBFBD><EFBFBD><E6BCBA> <20><>ĩ<EFBFBD>Ÿ<EFBFBD>
state state3_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv103._300_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv103._300_sendLetter)
say(gameforge.main_quest_flame_lv103._020_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv103._300_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv103._310_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv103._220_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state3_2)
end
when leave begin
--q.done()
end
end
state state3_2 begin
when enter begin
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> óġ <20><> <20><><EFBFBD><EFBFBD>
pc.setqf("kill_count_1", 0)
pc.setqf("kill_count_2", 0)
pc.setqf("kill_count_3", 0)
pc.setqf("kill_count_4", 0)
pc.setqf("kill_count_5", 0)
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv103._330_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv103._300_sendLetter)
--<2D><><EFBFBD><EFBFBD> óġ <20><> <20>ȳ<EFBFBD><C8B3><EFBFBD>
q.set_counter_name(gameforge.main_quest_lv98._680_counterName)
main_quest_flame_lv103.kill_count_state3_2()
end
when button or info begin
say_title(gameforge.main_quest_flame_lv103._340_sayTitle)
say(gameforge.main_quest_flame_lv103._350_say)
--<2D><><EFBFBD><EFBFBD> óġ <20><> <20>ȳ<EFBFBD><C8B3><EFBFBD>
say(gameforge.main_quest_lv98._680_counterName)
local total_remain = 0
local remain1 = 50 - pc.getqf("kill_count_1")
if remain1 < 0 then
remain1 = 0
end
total_remain = total_remain + remain1
local remain2 = 50 - pc.getqf("kill_count_2")
if remain2 < 0 then
remain2 = 0
end
total_remain = total_remain + remain2
local remain3 = 50 - pc.getqf("kill_count_3")
if remain3 < 0 then
remain3 = 0
end
total_remain = total_remain + remain3
local remain4 = 50 - pc.getqf("kill_count_4")
if remain4 < 0 then
remain4 = 0
end
total_remain = total_remain + remain4
local remain5 = 50 - pc.getqf("kill_count_5")
if remain5 < 0 then
remain5 = 0
end
say(string.format(gameforge.main_quest_lv98._690_sayReward ,mob_name(6005), remain1,mob_name(6006), remain2))
say(string.format(gameforge.main_quest_lv98._690_sayReward ,mob_name(6007), remain3,mob_name(6008), remain4))
say(string.format(gameforge.main_quest_lv98._670_sayReward,mob_name(6009), remain5))
say_reward(gameforge.main_quest_flame_lv103._260_sayReward)
end
when 20377.chat.gameforge.main_quest_flame_lv103._300_sendLetter begin
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv103._360_say)
end
when 6005.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
main_quest_flame_lv103.kill_count_state3_2()
end
when 6006.kill begin
local kill_count = pc.getqf("kill_count_2")
pc.setqf("kill_count_2", kill_count+1)
main_quest_flame_lv103.kill_count_state3_2()
end
when 6007.kill begin
local kill_count = pc.getqf("kill_count_3")
pc.setqf("kill_count_3", kill_count+1)
main_quest_flame_lv103.kill_count_state3_2()
end
when 6008.kill begin
local kill_count = pc.getqf("kill_count_4")
pc.setqf("kill_count_4", kill_count+1)
main_quest_flame_lv103.kill_count_state3_2()
end
when 6009.kill begin
local kill_count = pc.getqf("kill_count_5")
pc.setqf("kill_count_5", kill_count+1)
main_quest_flame_lv103.kill_count_state3_2()
end
function kill_count_state3_2()
local total_remain = 0
local remain1 = 50 - pc.getqf("kill_count_1")
if remain1 < 0 then
remain1 = 0
end
total_remain = total_remain + remain1
local remain2 = 50 - pc.getqf("kill_count_2")
if remain2 < 0 then
remain2 = 0
end
total_remain = total_remain + remain2
local remain3 = 50 - pc.getqf("kill_count_3")
if remain3 < 0 then
remain3 = 0
end
total_remain = total_remain + remain3
local remain4 = 50 - pc.getqf("kill_count_4")
if remain4 < 0 then
remain4 = 0
end
total_remain = total_remain + remain4
local remain5 = 50 - pc.getqf("kill_count_5")
if remain5 < 0 then
remain5 = 0
end
total_remain = total_remain + remain5
q.set_counter_value(total_remain)
if total_remain == 0 then
set_state ("state3_3")
end
end
when leave begin
pc.setqf("kill_count_1", 0)
pc.setqf("kill_count_2", 0)
pc.setqf("kill_count_3", 0)
pc.setqf("kill_count_4", 0)
pc.setqf("kill_count_5", 0)
--q.done()
end
end
state state3_3 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv103._370_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv103._300_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv103._300_sendLetter)
say(gameforge.main_quest_flame_lv103._120_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv103._300_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv103._380_say)
--<2D><><EFBFBD><EFBFBD>
wait()--reward
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 54491000))
pc.give_exp2(54491000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 166000))
pc.change_money(166000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71095),1))
pc.give_item2(71095, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(72001),1)) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
pc.give_item2_select(72001)
item.set_socket(2, 60)
say()
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state4_1)
end
when leave begin
--q.done()
end
end
-- <20>߸<EFBFBD>õ <20><><EFBFBD><EFBFBD>1-1
state state4_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv103._390_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv103._390_sendLetter)
say(gameforge.main_quest_flame_lv103._020_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv103._390_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv103._400_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv103._220_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state4_2)
end
when leave begin
--q.done()
end
end
state state4_2 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv103._410_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv103._390_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv103._080_sayTitle)
say(gameforge.main_quest_flame_lv103._420_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20380.chat.gameforge.main_quest_flame_lv103._390_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv103._430_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv103._440_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv103._460_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv103._220_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state4_3)
end
when leave begin
--q.done()
end
end
state state4_3 begin
when enter begin
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> óġ <20><> <20><><EFBFBD><EFBFBD>
pc.setqf("kill_count_1", 0)
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv103._480_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv103._390_sendLetter)
--<2D><><EFBFBD><EFBFBD> óġ <20><> <20>ȳ<EFBFBD><C8B3><EFBFBD>
q.set_counter_name(gameforge.main_quest_lv98._680_counterName)
main_quest_flame_lv103.kill_count_state4_3()
end
when button or info begin
say_title(gameforge.main_quest_flame_lv103._490_sayTitle)
say(gameforge.main_quest_flame_lv103._500_say)
--<2D><><EFBFBD><EFBFBD> óġ <20><> <20>ȳ<EFBFBD><C8B3><EFBFBD>
say(gameforge.main_quest_flame_lv103._510_say)
say(string.format(gameforge.main_quest_lv90._1190_say,mob_name(8057), 1 - pc.getqf("kill_count_1")))
say_reward(gameforge.main_quest_flame_lv103._260_sayReward)
end
when 20377.chat.gameforge.main_quest_flame_lv103._390_sendLetter begin
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv103._520_say)
end
when 8057.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
main_quest_flame_lv103.kill_count_state4_3()
end
function kill_count_state4_3()
local total_remain = 0
local remain1 = 1 - pc.getqf("kill_count_1")
if remain1 < 0 then
remain1 = 0
end
total_remain = total_remain + remain1
q.set_counter_value(total_remain)
if total_remain == 0 then
set_state ("state4_4")
end
end
when leave begin
pc.setqf("kill_count_1", 0)
--q.done()
end
end
state state4_4 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv103._530_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv103._390_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv103._390_sendLetter)
say(gameforge.main_quest_flame_lv103._120_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv103._390_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv103._540_say)
--<2D><><EFBFBD><EFBFBD>
wait()--reward
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 49586000))
pc.give_exp2(49586000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 167000))
pc.change_money(167000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71095),1))
pc.give_item2(71095, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(31078),1)) -- <20><>ȭ<EFBFBD><C8AD> -- <20><><EFBFBD><EFBFBD>
pc.give_item2(31078, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(30015),2)) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ǰ
pc.give_item2(30015, 2)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(70043),1)) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>
pc.give_item2_select(70043)
item.set_socket(2, 60)
say()
say_title(string.format(gameforge.main_quest_flame_lv99._430_say, 104))
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (__COMPLETE__)
set_quest_state ("main_quest_flame_lv104", "state0")
end
when leave begin
--q.done()
end
end
state __COMPLETE__ begin
when enter begin
--q.done()
end
end
end

View File

@ -1,738 +0,0 @@
quest main_quest_flame_lv104 begin
state start begin
end
state state0 begin
when login or levelup or enter with pc.level >= 104 begin
set_state (state1_1)
end
end
-- <20>߸<EFBFBD>õ <20><><EFBFBD><EFBFBD> 1-2
state state1_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv104._010_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv104._010_sendLetter)
say(gameforge.main_quest_flame_lv104._020_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv104._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv104._030_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv104._040_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv104._050_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state1_2)
end
when leave begin
--q.done()
end
end
state state1_2 begin
when enter begin
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> óġ <20><> <20><><EFBFBD><EFBFBD>
pc.setqf("kill_count_1", 0)
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv104._060_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv104._010_sendLetter)
--<2D><><EFBFBD><EFBFBD> óġ <20><> <20>ȳ<EFBFBD><C8B3><EFBFBD>
q.set_counter_name(gameforge.main_quest_lv98._680_counterName)
-- <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߸<EFBFBD>õ<EFBFBD><C3B5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>, <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> Ŭ<><C5AC><EFBFBD><EFBFBD> <20>ǵ<EFBFBD><C7B5><EFBFBD> <20>ϴ<EFBFBD> <20>ڵ<EFBFBD>.
if party.is_party() then
local map_index = pc.get_map_index()
-- <20><><EFBFBD><EFBFBD><E6BCBA> <20><><EFBFBD><EFBFBD><EFBFBD>ߴٴ<DFB4> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if map_index >= 351 * 10000 and map_index < (351 + 1) *10000 then
pc.setqf("in_dungeon", 1)
else -- <20><><EFBFBD><EFBFBD><E6BCBA><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD>ش<EFBFBD>.
if pc.getqf("in_dungeon") == 1 then
if party.getf("flame_dungeon_boss_kill_count") == 1 then
set_state (state1_3)
end
pc.setqf("in_dungeon", 0)
end
end
end
main_quest_flame_lv104.kill_count()
end
when logout begin
if party.is_party() then
if party.getf("flame_dungeon_boss_kill_count") == 0 then
pc.setqf("in_dungeon", 0)
end
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv104._070_sayTitle)
say(gameforge.main_quest_flame_lv104._080_say)
--<2D><><EFBFBD><EFBFBD> óġ <20><> <20>ȳ<EFBFBD><C8B3><EFBFBD>
say(gameforge.main_quest_lv98._680_counterName)
say(string.format(gameforge.main_quest_lv98._670_sayReward,mob_name(6091), 1 - pc.getqf("kill_count_1")))
say_reward(gameforge.main_quest_flame_lv104._090_sayReward)
end
when 20377.chat.gameforge.main_quest_flame_lv104._010_sendLetter begin
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv104._100_say)
end
when 31078.use begin -- <20><>ȭ<EFBFBD><C8AD>
affect.add(apply.MAX_HP, 1000, 60 * 60)
affect.add(apply.DEF_GRADE_BONUS, 25, 60 * 60)
affect.add(apply.MELEE_MAGIC_ATTBONUS_PER, 10, 60 * 60)
pc.remove_item(31078,1)
end
when 6091.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
main_quest_flame_lv104.kill_count()
end
function kill_count()
local total_remain = 0
local remain1 = 1 - pc.getqf("kill_count_1")
if remain1 < 0 then
remain1 = 0
end
total_remain = total_remain + remain1
q.set_counter_value(total_remain)
if total_remain == 0 then
set_state ("state1_3")
end
end
when leave begin
pc.setqf("kill_count_1", 0)
pc.setqf("in_dungeon", 0)
--q.done()
end
end
state state1_3 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv104._120_notice,notice)
say_title(mob_name(6091))
say(gameforge.main_quest_flame_lv104._110_say)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv104._010_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv104._010_sendLetter)
say(gameforge.main_quest_flame_lv104._130_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv104._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv104._140_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv104._150_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv104._160_say)
--<2D><><EFBFBD><EFBFBD>
wait()--reward
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 64491000))
pc.give_exp2(64491000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 168000))
pc.change_money(168000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71095),1))
pc.give_item2(71095, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71026),1)) -- <20><>ö
pc.give_item2(71026, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71025),2)) -- <20>߰<EFBFBD><DFB0><EFBFBD>
pc.give_item2(71025, 1)
pc.give_item2(71025, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(70102),5)) -- <20><><EFBFBD><EFBFBD>
pc.give_item2(70102, 1)
pc.give_item2(70102, 1)
pc.give_item2(70102, 1)
pc.give_item2(70102, 1)
pc.give_item2(70102, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(50706),20)) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pc.give_item2(50706, 20)
say()
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state2_1)
end
when leave begin
--q.done()
end
end
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>1-1
state state2_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv104._170_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv104._170_sendLetter)
say(gameforge.main_quest_flame_lv104._020_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv104._170_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv104._180_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv104._190_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv104._050_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state2_2)
end
when leave begin
--q.done()
end
end
state state2_2 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv104._200_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv104._170_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv104._210_sayTitle)
say(gameforge.main_quest_flame_lv104._220_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv104._170_sendLetter begin
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv104._230_say)
end
when 20380.chat.gameforge.main_quest_flame_lv104._170_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv104._240_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv104._250_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv104._260_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv104._270_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv104._050_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state2_3)
end
when leave begin
--q.done()
end
end
state state2_3 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv104._280_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv104._170_sendLetter)
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
q.set_counter_name(gameforge.main_quest_lv97._670_counterName)
main_quest_flame_lv104.item_count_state2_3()
end
when button or info begin
say_title(gameforge.main_quest_flame_lv104._280_notice)
say(gameforge.main_quest_flame_lv104._290_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȳ<EFBFBD><C8B3><EFBFBD>
say(gameforge.main_quest_lv97._670_counterName)
local item_count = pc.getqf("item_count_1")
local remain = 5 - item_count
if remain < 0 then
remain = 0
end
say(string.format(gameforge.main_quest_lv90._1190_say,item_name(31082), remain))
say_reward(gameforge.main_quest_flame_lv104._090_sayReward)
main_quest_flame_lv104.item_count_state2_3()
end
when 20380.chat.gameforge.main_quest_flame_lv104._170_sendLetter with pc.count_item(31082) > 0 begin
pc.remove_item(31082, 1)
-- <20><>ǰ <20><><EFBFBD><EFBFBD>
if number(1, 100) <= 90 then
local item_count = pc.getqf("item_count_1")
item_count = item_count + 1
pc.setqf("item_count_1", item_count)
if item_count < 5 then -- <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
say_title(mob_name(20380))
say(string.format(gameforge.main_quest_flame_lv104._300_say, 5 - item_count))
else -- <20><>ǰ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ä<><C3A4>.
pc.remove_item(31082, pc.count_item(31082))
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv104._310_say)
wait()
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 57583000))
pc.give_exp2(57583000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 170000))
pc.change_money( 170000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(72723),1)) -- ȭ<><C8AD><EFBFBD><EFBFBD> <20>ູ(<28><>)
pc.give_item2(72723, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(70050),1)) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ǥ
pc.give_item2(70050, 1)
say()
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state3_1)
end
else -- <20><>ǰ <20><><EFBFBD><EFBFBD>
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv104._320_say)
end
main_quest_flame_lv104.item_count_state2_3()
end
when 6005.kill begin
if number(1,50) == 1 then
pc.give_item2(31082, 1)
main_quest_flame_lv104.item_count_state2_3()
end
end
when 6006.kill begin
if number(1,50) == 1 then
pc.give_item2(31082, 1)
main_quest_flame_lv104.item_count_state2_3()
end
end
when 6007.kill begin
if number(1,50) == 1 then
pc.give_item2(31082, 1)
main_quest_flame_lv104.item_count_state2_3()
end
end
when 6008.kill begin
if number(1,50) == 1 then
pc.give_item2(31082, 1)
main_quest_flame_lv104.item_count_state2_3()
end
end
when 6009.kill begin
if number(1,50) == 1 then
pc.give_item2(31082, 1)
main_quest_flame_lv104.item_count_state2_3()
end
end
function item_count_state2_3()
local item_count = pc.getqf("item_count_1")
local remain = 5 - item_count
if remain <= 0 then
remain = 0
end
q.set_counter_value(remain)
end
when leave begin
pc.setqf("item_count_1", 0)
--q.done()
end
end
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>1-2
state state3_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv104._330_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv104._330_sendLetter)
say(gameforge.main_quest_flame_lv104._340_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20380.chat.gameforge.main_quest_flame_lv104._330_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv104._350_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv104._360_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv104._050_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state3_2)
end
when leave begin
--q.done()
end
end
state state3_2 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv104._370_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv104._330_sendLetter)
q.set_counter_name(gameforge.main_quest_lv97._670_counterName)
end
when button or info begin
say_title(gameforge.main_quest_flame_lv104._280_notice)
say(gameforge.main_quest_flame_lv104._380_say)
say(gameforge.main_quest_lv97._670_counterName)
local remain1 = 100 - pc.count_item(50814)
if remain1 < 0 then
remain1 = 0
end
say(string.format(gameforge.main_quest_lv90._1190_say,item_name(50814) ,remain1))
say()
q.set_counter_value(remain1)
if remain1 == 0 then
set_state (state3_3)
end
end
when 20380.chat.gameforge.main_quest_flame_lv104._330_sendLetter begin
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if pc.count_item(50814) >= 100 then
pc.remove_item(50814, 100)
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv104._390_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv104._400_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv104._410_say)
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 46581000))
pc.give_exp2(46581000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 171000))
pc.change_money( 171000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(30045),2)) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ħ
pc.give_item2(30045, 2)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(50817),10)) -- <20><>Ȱ<EFBFBD>ɾ<EFBFBD>
pc.give_item2(50817, 10)
say()
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state4_1)
else
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv104._420_say)
end
end
when leave begin
--q.done()
end
end
state state3_3 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv104._430_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv104._330_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv104._280_notice)
say(gameforge.main_quest_flame_lv104._440_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20380.chat.gameforge.main_quest_flame_lv104._330_sendLetter begin
target.delete("__TARGET__")
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if pc.count_item(50814) >= 100 then
pc.remove_item(50814, 100)
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv104._390_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv104._400_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv104._410_say)
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 46581000))
pc.give_exp2(46581000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 171000))
pc.change_money( 171000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(30045),2)) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ħ
pc.give_item2(30045, 2)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(50817),10)) -- <20><>Ȱ<EFBFBD>ɾ<EFBFBD>
pc.give_item2(50817, 10)
say()
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state4_1)
else
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv104._420_say)
set_state (state3_2)
end
end
when leave begin
--q.done()
end
end
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>1-3
state state4_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv104._450_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv104._450_sendLetter)
say(gameforge.main_quest_flame_lv104._340_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20380.chat.gameforge.main_quest_flame_lv104._450_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv104._460_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv104._470_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv104._050_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state4_2)
end
when leave begin
--q.done()
end
end
state state4_2 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv104._480_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv104._450_sendLetter)
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
q.set_counter_name(gameforge.main_quest_lv97._670_counterName)
main_quest_flame_lv104.item_count_state4_2()
end
when button or info begin
say_title(gameforge.main_quest_flame_lv104._450_sendLetter)
say(gameforge.main_quest_flame_lv104._490_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȳ<EFBFBD><C8B3><EFBFBD>
say(gameforge.main_quest_lv97._670_counterName)
local remain = 5 - pc.count_item(31024)
if remain < 0 then
remain = 0
end
say(string.format(gameforge.main_quest_lv90._1190_say,item_name(31024), remain))
end
when 20380.chat.gameforge.main_quest_flame_lv104._450_sendLetter begin
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv104._500_say)
end
when 3291.kill begin
if number(1,1) == 1 then
pc.give_item2(31024, 1)
main_quest_flame_lv104.item_count_state4_2()
end
end
function item_count_state4_2()
if pc.count_item(31024) >= 5 then
set_state ("state4_3")
end
q.set_counter_value(5 - pc.count_item(31024))
end
when leave begin
--q.done()
end
end
state state4_3 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv104._520_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv104._450_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv104._450_sendLetter)
say(gameforge.main_quest_flame_lv104._440_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20380.chat.gameforge.main_quest_flame_lv104._450_sendLetter begin
target.delete("__TARGET__")
if pc.count_item(31024) < 5 then
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv104._500_say)
set_state (state4_2)
else
pc.remove_item(31024, 5)
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv104._510_say)
wait()
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 45580000))
pc.give_exp2( 45580000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 173000))
pc.change_money(173000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71095),1))
pc.give_item2(71095, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(30015),2)) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ǰ
pc.give_item2(30015, 2)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(70043),1)) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>
pc.give_item2_select(70043)
item.set_socket(2, 60)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(31083),3)) -- <20><><EFBFBD><EFBFBD> <20>ָӴ<D6B8>
pc.give_item2(31083, 3)
say()
say_title(string.format(gameforge.main_quest_flame_lv99._430_say, 105))
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_quest_state ("main_quest_flame_lv105", "state0")
set_state (__COMPLETE__)
end
end
when leave begin
--q.done()
end
end
state __COMPLETE__ begin
when enter begin
--q.done()
end
end
end

View File

@ -1,541 +0,0 @@
quest main_quest_flame_lv105 begin
state start begin
end
state state0 begin
when login or levelup or enter with pc.level >= 105 begin
set_state (state1_1)
end
end
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
state state1_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv105._010_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv105._010_sendLetter)
say(gameforge.main_quest_flame_lv105._020_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv105._010_sendLetter begin
target.delete("__TARGET__")
pc.remove_item(31083, 3)
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv105._030_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv105._040_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv105._050_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv105._060_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv105._070_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state1_2)
end
when leave begin
--q.done()
end
end
state state1_2 begin
when enter begin
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> óġ <20><> <20><><EFBFBD><EFBFBD>
pc.setqf("kill_count_1", 0)
pc.setqf("kill_count_2", 0)
pc.setqf("kill_count_3", 0)
pc.setqf("kill_count_4", 0)
pc.setqf("kill_count_5", 0)
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv105._080_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv105._010_sendLetter)
--<2D><><EFBFBD><EFBFBD> óġ <20><> <20>ȳ<EFBFBD><C8B3><EFBFBD>
q.set_counter_name(gameforge.main_quest_lv98._680_counterName)
main_quest_flame_lv105.kill_count_state1_2()
end
when button or info begin
say_title(gameforge.main_quest_flame_lv105._090_sayTitle)
say(gameforge.main_quest_flame_lv105._100_say)
--<2D><><EFBFBD><EFBFBD> óġ <20><> <20>ȳ<EFBFBD><C8B3><EFBFBD>
say(gameforge.main_quest_lv98._680_counterName)
local remain1 = 10 - pc.getqf("kill_count_1")
if remain1 < 0 then
remain1 = 0
end
local remain2 = 10 - pc.getqf("kill_count_2")
if remain2 < 0 then
remain2 = 0
end
local remain3 = 10 - pc.getqf("kill_count_3")
if remain3 < 0 then
remain3 = 0
end
local remain4 = 10 - pc.getqf("kill_count_4")
if remain4 < 0 then
remain4 = 0
end
local remain5 = 10 - pc.getqf("kill_count_5")
if remain5 < 0 then
remain5 = 0
end
say(string.format(gameforge.main_quest_lv98._690_sayReward ,mob_name(6005), remain1,mob_name(6006), remain2))
say(string.format(gameforge.main_quest_lv98._690_sayReward ,mob_name(6007), remain3,mob_name(6008), remain4))
say(string.format(gameforge.main_quest_lv98._670_sayReward,mob_name(6009), remain5))
say_reward(gameforge.main_quest_flame_lv105._110_sayReward)
end
when 20377.chat.gameforge.main_quest_flame_lv105._010_sendLetter begin
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv105._120_say)
end
when 6005.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
main_quest_flame_lv105.kill_count_state1_2()
end
when 6006.kill begin
local kill_count = pc.getqf("kill_count_2")
pc.setqf("kill_count_2", kill_count+1)
main_quest_flame_lv105.kill_count_state1_2()
end
when 6007.kill begin
local kill_count = pc.getqf("kill_count_3")
pc.setqf("kill_count_3", kill_count+1)
main_quest_flame_lv105.kill_count_state1_2()
end
when 6008.kill begin
local kill_count = pc.getqf("kill_count_4")
pc.setqf("kill_count_4", kill_count+1)
main_quest_flame_lv105.kill_count_state1_2()
end
when 6009.kill begin
local kill_count = pc.getqf("kill_count_5")
pc.setqf("kill_count_5", kill_count+1)
main_quest_flame_lv105.kill_count_state1_2()
end
function kill_count_state1_2()
local total_remain = 0
local remain1 = 10 - pc.getqf("kill_count_1")
if remain1 < 0 then
remain1 = 0
end
total_remain = total_remain + remain1
local remain2 = 10 - pc.getqf("kill_count_2")
if remain2 < 0 then
remain2 = 0
end
total_remain = total_remain + remain2
local remain3 = 10 - pc.getqf("kill_count_3")
if remain3 < 0 then
remain3 = 0
end
total_remain = total_remain + remain3
local remain4 = 10 - pc.getqf("kill_count_4")
if remain4 < 0 then
remain4 = 0
end
total_remain = total_remain + remain4
local remain5 = 10 - pc.getqf("kill_count_5")
if remain5 < 0 then
remain5 = 0
end
total_remain = total_remain + remain5
q.set_counter_value(total_remain)
if total_remain == 0 then
set_state ("state1_3")
end
end
when leave begin
pc.setqf("kill_count_1", 0)
pc.setqf("kill_count_2", 0)
pc.setqf("kill_count_3", 0)
pc.setqf("kill_count_4", 0)
pc.setqf("kill_count_5", 0)
--q.done()
end
end
state state1_3 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv105._130_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv105._010_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv105._010_sendLetter)
say(gameforge.main_quest_flame_lv105._140_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv105._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv105._150_say)
--<2D><><EFBFBD><EFBFBD>
wait()--reward
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 48584000))
pc.give_exp2(48584000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 174000))
pc.change_money(174000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71095),1))
pc.give_item2(71095, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(30033),3)) -- <09><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>׸<EFBFBD>
pc.give_item2(30033, 3)
say()
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state2_1)
end
when leave begin
--q.done()
end
end
-- <20><><EFBFBD><EFBFBD>
state state2_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv105._160_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv105._160_sendLetter)
say(gameforge.main_quest_flame_lv105._020_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv105._160_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv105._170_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv105._180_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv105._070_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state2_2)
end
when leave begin
--q.done()
end
end
state state2_2 begin
when enter begin
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> óġ <20><> <20><><EFBFBD><EFBFBD>
pc.setqf("kill_count_1", 0)
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv105._190_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv105._160_sendLetter)
--<2D><><EFBFBD><EFBFBD> óġ <20><> <20>ȳ<EFBFBD><C8B3><EFBFBD>
q.set_counter_name(gameforge.main_quest_lv98._680_counterName)
-- <20><>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߸<EFBFBD>õ<EFBFBD><C3B5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>, <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> Ŭ<><C5AC><EFBFBD><EFBFBD> <20>ǵ<EFBFBD><C7B5><EFBFBD> <20>ϴ<EFBFBD> <20>ڵ<EFBFBD>.
if party.is_party() then
local map_index = pc.get_map_index()
-- <20><><EFBFBD><EFBFBD><E6BCBA> <20><><EFBFBD><EFBFBD><EFBFBD>ߴٴ<DFB4> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if map_index >= 351 * 10000 and map_index < (351 + 1) *10000 then
pc.setqf("in_dungeon", 1)
else -- <20><><EFBFBD><EFBFBD><E6BCBA><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD>ش<EFBFBD>.
if pc.getqf("in_dungeon") == 1 then
if party.getf("flame_dungeon_boss_kill_count") == 1 then
set_state (state2_3)
end
pc.setqf("in_dungeon", 0)
end
end
end
main_quest_flame_lv105.kill_count_state2_2()
end
when logout begin
if party.is_party() then
if party.getf("flame_dungeon_boss_kill_count") == 0 then
pc.setqf("in_dungeon", 0)
end
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv105._200_sayTitle)
say(gameforge.main_quest_flame_lv105._210_say)
--<2D><><EFBFBD><EFBFBD> óġ <20><> <20>ȳ<EFBFBD><C8B3><EFBFBD>
say(gameforge.main_quest_lv98._680_counterName)
say(string.format(gameforge.main_quest_lv98._670_sayReward,mob_name(6091), 1 - pc.getqf("kill_count_1")))
say_reward(gameforge.main_quest_flame_lv105._110_sayReward)
end
when 20377.chat.gameforge.main_quest_flame_lv105._160_sendLetter begin
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv105._220_say)
end
when 6091.kill begin
local kill_count = pc.getqf("kill_count_1")
pc.setqf("kill_count_1", kill_count+1)
main_quest_flame_lv105.kill_count_state2_2()
end
function kill_count_state2_2()
local total_remain = 0
local remain1 = 1 - pc.getqf("kill_count_1")
if remain1 < 0 then
remain1 = 0
end
total_remain = total_remain + remain1
q.set_counter_value(total_remain)
if total_remain == 0 then
set_state ("state2_3")
end
end
when leave begin
pc.setqf("kill_count_1", 0)
pc.setqf("in_dungeon", 0)
--q.done()
end
end
state state2_3 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv105._230_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv105._160_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv105._160_sendLetter)
say(gameforge.main_quest_flame_lv105._140_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv105._160_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv105._240_say)
--<2D><><EFBFBD><EFBFBD>
wait()--reward
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 60583000))
pc.give_exp2(60583000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 175000))
pc.change_money(175000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71095),1))
pc.give_item2(71095, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71026),1)) -- <20><>ö
pc.give_item2(71026, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71025),2)) -- <20>߰<EFBFBD><DFB0><EFBFBD>
pc.give_item2(71025, 1)
pc.give_item2(71025, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(72001),1)) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
pc.give_item2_select(72001)
item.set_socket(2, 60)
say()
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state3_1)
end
when leave begin
--q.done()
end
end
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
state state3_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv105._250_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv105._250_sendLetter)
say(gameforge.main_quest_flame_lv105._020_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv105._250_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv105._260_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv105._270_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv105._070_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(31083),1))
pc.give_item2(31083, 1)
set_state (state3_2)
end
when leave begin
--q.done()
end
end
state state3_2 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv105._280_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv105._250_sendLetter)
q.set_counter_name(gameforge.main_quest_flame_lv105._290_say)
end
when button or info begin
say_title(gameforge.main_quest_flame_lv105._300_sayTitle)
say(gameforge.main_quest_flame_lv105._310_say)
say_title(gameforge.main_quest_flame_lv105._290_say)
say(gameforge.main_quest_flame_lv105._320_say)
say()
say_reward(gameforge.main_quest_flame_lv105._110_sayReward)
end
when 20390.take with item.vnum == 31083 begin
item.remove()
say_title(gameforge.main_quest_flame_lv105._330_sayTitle)
say(gameforge.main_quest_flame_lv105._340_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state3_3)
end
when leave begin
--q.done()
end
end
state state3_3 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv105._350_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv105._250_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv105._250_sendLetter)
say(gameforge.main_quest_flame_lv105._140_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv105._250_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv105._360_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv105._370_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv105._380_say)
--<2D><><EFBFBD><EFBFBD>
wait()--reward
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 48584000))
pc.give_exp2(177000)
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 177000))
pc.change_money(177000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(72024),1)) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȭ
pc.give_item2_select(72024)
item.set_socket(2, 180)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71094),1)) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
pc.give_item2(71094, 1)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71001),5)) -- <09>־ȼ<D6BE><C8BC><EFBFBD>
pc.give_item2(71001, 5)
say()
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (__COMPLETE__)
end
when leave begin
--q.done()
end
end
state __COMPLETE__ begin
when enter begin
--q.done()
end
end
end

View File

@ -1,483 +0,0 @@
quest main_quest_flame_lv99 begin
state start begin
when login or levelup or enter with pc.get_level() >= 99 begin
if pc.getf("main_quest_lv98", "__status")==main_quest_lv98.__COMPLETE__ then
set_state ( state0 )
end
end
end
state state0 begin
when login or levelup or enter with pc.level >= 99 begin
set_state (state1_1)
end
end
-- <20>ٽ<EFBFBD> <20><><EFBFBD>۵Ǵ<DBB5> <20><><EFBFBD><EFBFBD> : <20>ӹ<EFBFBD><D3B9>ޱ<EFBFBD>
state state1_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv99._010_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv99._010_sendLetter)
say(gameforge.main_quest_flame_lv99._020_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv99._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv99._030_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv99._050_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv99._060_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv99._070_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv99._080_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state1_2)
end
when leave begin
--q.done()
end
end
state state1_2 begin -- <20>ٽ<EFBFBD> <20><><EFBFBD>۵Ǵ<DBB5> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD>
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(string.format(gameforge.main_quest_flame_lv99._090_notice, 127, 928),notice)
end
when letter begin
target.pos ("__TARGET__",127,928,62,"")
send_letter (gameforge.main_quest_flame_lv99._010_sendLetter)
end
when button or info begin
say_title(gameforge.main_quest_flame_lv99._100_sayTitle)
say(gameforge.main_quest_flame_lv99._110_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_info)
end
when 20377.chat.gameforge.main_quest_flame_lv99._010_sendLetter begin
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv99._120_say)
end
-- <20><><EFBFBD><EFBFBD> --
when __TARGET__.target.arrive begin
target.delete("__TARGET__")
set_state (state1_3)
end
when leave begin
--q.done()
end
end
state state1_3 begin -- <20>ٽ<EFBFBD> <20><><EFBFBD>۵Ǵ<DBB5> <20><><EFBFBD><EFBFBD> : <20>Ϸ<EFBFBD> & <20><><EFBFBD><EFBFBD><EFBFBD>ޱ<EFBFBD>
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv99._130_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv99._010_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv99._010_sendLetter)
say(gameforge.main_quest_flame_lv99._140_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv99._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv99._150_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv99._160_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv99._170_say)
--<2D><><EFBFBD><EFBFBD>
wait()--reward
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 33003000))
pc.give_exp2( 33003000)
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 145000))
pc.change_money( 145000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(50705),10))
pc.give_item2(50705, 10)
say()
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state2_1)
end
when leave begin
--q.done()
end
end
-- <20><><EFBFBD><EFBFBD>1-1 : <20>ӹ<EFBFBD><D3B9>ޱ<EFBFBD>
state state2_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv99._180_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv99._180_sendLetter)
say(gameforge.main_quest_flame_lv99._020_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20377.chat.gameforge.main_quest_flame_lv99._180_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_flame_lv99._190_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv99._070_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state2_2)
end
when leave begin
--q.done()
end
end
state state2_2 begin -- <20><><EFBFBD><EFBFBD>1-1 : <20><><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> ã<>ư<EFBFBD><C6B0><EFBFBD> <20><><EFBFBD><EFBFBD>..
when letter begin
send_letter(gameforge.main_quest_flame_lv99._180_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv99._180_sendLetter)
say(gameforge.main_quest_flame_lv99._200_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20380.chat.gameforge.main_quest_flame_lv99._180_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv99._210_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv99._240_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state2_3)
end
when leave begin
--q.done()
end
end
state state2_3 begin -- <20><><EFBFBD><EFBFBD>1-1 : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
when enter begin
notice_multiline(gameforge.main_quest_flame_lv99._250_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv99._180_sendLetter)
end
when button or info begin
say_title(gameforge.main_quest_flame_lv99._260_sayTitle)
say(gameforge.main_quest_flame_lv99._270_say)
end
when 20380.chat.gameforge.main_quest_flame_lv99._180_sendLetter begin
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv99._280_say)
end
when 2202.kill begin
if number(1,100) == 1 then
set_state (state2_4)
end
end
when 2203.kill begin
if number(1,100) == 1 then
set_state (state2_4)
end
end
when 2204.kill begin
if number(1,100) == 1 then
set_state (state2_4)
end
end
when 2205.kill begin
if number(1,100) == 1 then
set_state (state2_4)
end
end
-- <20><> <20>Ʒ<EFBFBD><C6B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> vnum<75><6D> <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> Ŭ<><C5AC><EFBFBD><EFBFBD> <20>ǵ<EFBFBD><C7B5><EFBFBD> <20>Ͽ<EFBFBD><CFBF><EFBFBD>.
when 7020.kill begin
if number(1,100) == 1 then
set_state (state2_4)
end
end
when 7021.kill begin
if number(1,100) == 1 then
set_state (state2_4)
end
end
when 7022.kill begin
if number(1,100) == 1 then
set_state (state2_4)
end
end
when 7023.kill begin
if number(1,100) == 1 then
set_state (state2_4)
end
end
when leave begin
--q.done()
end
end
-- <20><><EFBFBD><EFBFBD>1-1 : <20><><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> <20><><EFBFBD>ư<EFBFBD><C6B0><EFBFBD>.
state state2_4 begin
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv99._290_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv99._180_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv99._180_sendLetter)
say(gameforge.main_quest_flame_lv99._200_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20380.chat.gameforge.main_quest_flame_lv99._180_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv99._300_say)
--<2D><><EFBFBD><EFBFBD>
wait()--reward
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 37003000))
pc.give_exp2(37003000)
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 146000))
pc.change_money(146000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(72001),1))
pc.give_item2_select(72001)
item.set_socket(2, 60)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(30046),1))
pc.give_item2(30046, 1)
say()
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state3_1)
end
when leave begin
--q.done()
end
end
-- <20><><EFBFBD><EFBFBD>1-2 : <20>ӹ<EFBFBD><D3B9>ޱ<EFBFBD>
state state3_1 begin
when letter begin
send_letter(gameforge.main_quest_flame_lv99._310_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv99._310_sendLetter)
say(gameforge.main_quest_flame_lv99._320_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20380.chat.gameforge.main_quest_flame_lv99._310_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv99._330_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv99._340_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv99._350_say)
wait()--<2D>߰<EFBFBD> <20><>ȭ
say_title(pc.getname())
say(gameforge.main_quest_flame_lv99._360_say)
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (state3_2)
end
when leave begin
--q.done()
end
end
state state3_2 begin -- <20><><EFBFBD><EFBFBD>1-2
when enter begin
notice_multiline(gameforge.main_quest_flame_lv99._370_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv99._310_sendLetter)
q.set_counter_name(gameforge.main_quest_lv97._670_counterName)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20391)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20391))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv99._380_sayTitle)
say(gameforge.main_quest_flame_lv99._390_say)
say(gameforge.main_quest_lv97._670_counterName)
say(string.format(gameforge.main_quest_lv90._1190_say,item_name(31076), 1 - pc.count_item(31076)))
--say_reward(locale.target_info)
end
when 20380.chat.gameforge.main_quest_flame_lv99._310_sendLetter begin
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv99._400_say)
end
-- <20>¾<EFBFBD><C2BE><EFBFBD> NPC<50><43> Ŭ<><C5AC><EFBFBD>Ͽ<EFBFBD> <20>¾<EFBFBD><C2BE><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>κ<EFBFBD>.
when 20391.click begin
target.delete("__TARGET__")
pc.give_item2(31076, 1)
set_state (state3_3)
end
when leave begin
--q.done()
end
end
state state3_3 begin -- <20><><EFBFBD><EFBFBD>1-2
when enter begin
-- notice <20><><EFBFBD><EFBFBD>
notice_multiline(gameforge.main_quest_flame_lv99._410_notice,notice)
end
when letter begin
send_letter(gameforge.main_quest_flame_lv99._310_sendLetter)
--npc Ÿ<><C5B8>
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_flame_lv99._310_sendLetter)
say(gameforge.main_quest_flame_lv99._200_say)
--npc Ÿ<><C5B8> <20>ȳ<EFBFBD><C8B3><EFBFBD>
--say_reward(locale.target_npc_info)
end
when 20380.chat.gameforge.main_quest_flame_lv99._310_sendLetter begin
target.delete("__TARGET__")
if pc.count_item(31076) >= 1 then
pc.remove_item ( 31076, pc.count_item(31076))
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv99._420_say)
--<2D><><EFBFBD><EFBFBD>
wait()--reward
say_title(gameforge.main_quest_lv27._120_sayTitle)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 35003000))
pc.give_exp2(35003000)
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 147000))
pc.change_money(147000)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(30021),1))
pc.give_item2(30021, 1)
say()
say_title(string.format(gameforge.main_quest_flame_lv99._430_say, 100))
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>
set_state (__COMPLETE__)
set_quest_state ("main_quest_flame_lv100", "state0")
else
say_title(mob_name(20380))
say(gameforge.main_quest_flame_lv99._400_say)
set_state (state3_2)
end
end
when leave begin
--q.done()
end
end
state __COMPLETE__ begin
when enter begin
--q.done()
end
end
end

View File

@ -1,484 +0,0 @@
quest main_quest_lv60 begin
state start begin
when login or levelup or enter with pc.get_level() >= 60 begin
if pc.getf("main_quest_lv55", "__status")==main_quest_lv55.__COMPLETE__ then
set_state ( quest1_begin )
end
end
end
state run begin
when login or levelup or enter with pc.get_level() >= 60 begin
set_state ( quest1_begin )
end
end
state quest1_begin begin
when letter begin --<2D><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD>1
send_letter(gameforge.main_quest_lv60._10_sendLetter)
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>.
local vid_20011 = find_npc_by_vnum(20011)
if 0 != vid_20011 then
target.vid("__TARGET__", vid_20011, mob_name(20011))
end
end
when button or info begin -- <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD>1 <20><><EFBFBD><EFBFBD>
say_title(gameforge.main_quest_lv60._10_sendLetter)
----"12345678901234567890123456789012345678901234567890"|
say(gameforge.main_quest_lv60._20_say)
say("")
end
when __TARGET__.target.click begin
target.delete("__TARGET__")
say_title(mob_name(20011))
----"12345678901234567890123456789012345678901234567890"|
say(gameforge.main_quest_lv60._30_say)
say("")
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv60._40_say)
say("")
wait()
say_title(mob_name(20011))
say(gameforge.main_quest_lv60._50_say)
say("")
set_state ( quest2_begin )
end
end
state quest2_begin begin
-----------<2D><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD>2------------
when letter begin
send_letter(gameforge.main_quest_lv60._60_sendLetter)
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>.
local v = find_npc_by_vnum(20011)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20011))
end
end
when button or info begin
say_title(gameforge.main_quest_lv60._60_sendLetter)
say(gameforge.main_quest_lv60._70_say)
say("")
end
when __TARGET__.target.click begin
target.delete("__TARGET__")
say_title(mob_name(20011))
----"12345678901234567890123456789012345678901234567890"|
say(gameforge.main_quest_lv60._80_say)
say("")
wait()
say_title(mob_name(20011))
say(gameforge.main_quest_lv60._90_say)
say("")
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv60._100_say)
say("")
wait()
say_title(mob_name(20011))
say(gameforge.main_quest_lv60._110_say)
set_state (quest2_ongoing)
end
end
state quest2_ongoing begin --<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD>ϰ<EFBFBD> Ź<><C5B9><EFBFBD><EFBFBD> <20>޾ƿ<DEBE><C6BF><EFBFBD><EFBFBD><EFBFBD> <20>̼<EFBFBD><CCBC><EFBFBD> <20>޾Ҵ<DEBE>.
-----------<2D><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD>2------------
when letter begin
send_letter(gameforge.main_quest_lv60._60_sendLetter)
-- <20><><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>. (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> npc<70><63> <20><><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>.)
local v = find_npc_by_vnum(20371)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20371))
end
end
when button or info begin
say_title(gameforge.main_quest_lv60._60_sendLetter)
say(gameforge.main_quest_lv60._120_say)
say("")
end
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>õ<EFBFBD> <20><>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD>.
when 20011.gameforge.main_quest_lv60._60_sendLetter begin
say_title(mob_name(20011))
say(gameforge.main_quest_lv60._130_say)
say("")
end
--<2D><><EFBFBD>ϱ<EFBFBD><CFB1><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
when 20371.click begin
target.delete("__TARGET__")
say_reward(gameforge.main_quest_lv60._140_sayReward)
pc.give_item2 ( 31001 )
say("")
set_state (quest2_end)
end
end
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ź<><C5B9><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
state quest2_end begin
-----------<2D><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD>2------------
when letter begin
send_letter(gameforge.main_quest_lv60._60_sendLetter)
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>.
local v = find_npc_by_vnum(20011)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20011))
end
end
when button or info begin
say_title(gameforge.main_quest_lv60._60_sendLetter)
say(gameforge.main_quest_lv60._150_say)
say("")
end
when __TARGET__.target.click begin
pc.remove_item ( 31001, 1 )
target.delete("__TARGET__")
say_title(mob_name(20011))
say(gameforge.main_quest_lv60._160_say)
say("")
wait()
say_title(mob_name(20011))
say(gameforge.main_quest_lv60._170_say)
say("")
wait()
say_title(mob_name(20011))
say(gameforge.main_quest_lv60._180_say)
say("")
wait()
say_title(locale.reward)
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 980000))
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 175000))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71001).." ".."10"..locale.count_postfix))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(50721).." ".."10"..locale.count_postfix))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(50725).." ".."10"..locale.count_postfix))
say("")
-- <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> --
-- <20>̰<EFBFBD><CCB0><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
pc.give_exp2(980000)
pc.change_money(175000)
pc.give_item2(71001, 10) -- <20>־ȼ<D6BE><C8BC><EFBFBD>
pc.give_item2(50721, 10) -- <20><><EFBFBD><EFBFBD><EFBFBD>Ʋ<EFBFBD>
pc.give_item2(50725, 10) -- <20><>â<EFBFBD><C3A2>
set_state (quest3_begin)
end
end
state quest3_begin begin
-------<2D><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD>3---------
when letter begin
send_letter(gameforge.main_quest_lv60._220_sendLetter)
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>.
local v = find_npc_by_vnum(20011)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20011))
end
end
when button or info begin
say_title(gameforge.main_quest_lv60._220_sendLetter)
say(gameforge.main_quest_lv60._230_say)
say("")
end
when __TARGET__.target.click begin
target.delete("__TARGET__")
say_title(mob_name(20011))
----"12345678901234567890123456789012345678901234567890"|
say(gameforge.main_quest_lv60._240_say)
say("")
set_state (quest3_ongoing1)
end
end
state quest3_ongoing1 begin
-------<2D><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD>3---------
when letter begin
send_letter(gameforge.main_quest_lv60._220_sendLetter)
-- <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD><CDB8><EFBFBD> <20><>ġ<EFBFBD><C4A1> ǥ<><C7A5><EFBFBD>Ѵ<EFBFBD>.--
--------------------------------
--------------------------------
end
when button or info begin
say_title(gameforge.main_quest_lv60._220_sendLetter)
say(gameforge.main_quest_lv60._230_say)
say("")
end
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>õ<EFBFBD> <20><>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD>.
when 20011.chat.gameforge.main_quest_lv60._220_sendLetter begin
say_title(mob_name(20011))
say(gameforge.main_quest_lv60._260_say)
say("")
end
--<2D><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD><CDB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1000<30><30><EFBFBD><EFBFBD> 1 Ȯ<><C8AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ش<EFBFBD>.
when 2305.kill begin
if number (1,100) == 1 then
pc.give_item2 (31002, 1 )
say_reward(gameforge.main_quest_lv60._270_sayReward)
say("")
--3.<2E><><EFBFBD><EFBFBD>
set_state (quest3_end1)
end
end
end
-- <20><><EFBFBD><EFBFBD><EBB9AE><EFBFBD><EFBFBD> <20>ϳ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
state quest3_end1 begin
-------<2D><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD>3---------
when letter begin
send_letter(gameforge.main_quest_lv60._220_sendLetter)
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>.
local v = find_npc_by_vnum(20011)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20011))
end
end
when button or info begin
say_title(gameforge.main_quest_lv60._220_sendLetter)
say(gameforge.main_quest_lv60._230_say)
say("")
end
when __TARGET__.target.click begin
target.delete("__TARGET__")
say_title(mob_name(20011))
----"12345678901234567890123456789012345678901234567890"|
say(gameforge.main_quest_lv60._280_say)
say("")
wait()
--@@@@@@@@@<40><><EFBFBD><EFBFBD>@@@@@@@@@@--
--1. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
say_title(mob_name(20011))
----"12345678901234567890123456789012345678901234567890"|
pc.remove_item (31002, 1 )
say(gameforge.main_quest_lv60._290_say)
say("")
set_state (quest3_ongoing2)
end
end
state quest3_ongoing2 begin
--<2D><> <20><><EFBFBD>¿<EFBFBD> ó<><C3B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǹ<EFBFBD> '<27><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>' <20><><EFBFBD><EFBFBD>Ʈ <20>÷<EFBFBD><C3B7>׸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
-- <20>ʱⰪ<CAB1><E2B0AA> 9<><39> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1<><31> <20>ٿ<EFBFBD> 0<><30><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
-- 0<><30> <20>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><>ȭ<EFBFBD><C8AD>Ų<EFBFBD><C5B2>.
when enter begin
pc.setqf("remain_item",9)
end
--*************************--
-------<2D><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD>3_1---------
when letter begin
send_letter(gameforge.main_quest_lv60._220_sendLetter)
-- <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD><CDB8><EFBFBD> <20><>ġ<EFBFBD><C4A1> ǥ<><C7A5><EFBFBD>Ѵ<EFBFBD>.--
--------------------------------
--------------------------------
end
when button or info begin
say_title(gameforge.main_quest_lv60._220_sendLetter)
say(gameforge.main_quest_lv60._230_say)
say("")
q.set_counter(gameforge.main_quest_lv60._250_counter, pc.getqf("remain_item"))
end
-----------------------------
--*************************--
--<2D><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD><CDB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1000<30><30><EFBFBD><EFBFBD> 1 Ȯ<><C8AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٿ<EFBFBD><D9BF>ش<EFBFBD>.
when 2305.kill begin
if number (1,100) == 1 then
local remain_item_prev = pc.getqf("remain_item")
pc.setqf("remain_item",remain_item_prev-1)
pc.give_item2 (31002, 1 )
notice(string.format(gameforge.main_quest_lv60._300_say,pc.getqf("remain_item")))
-- <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>Ѿ<D1BE><EEB0A3>.
if pc.getqf("remain_item")==0 then
-- <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD><CDB8><EFBFBD> <20><>ġ ǥ<>ø<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD> --
-------------------------------------
-------------------------------------
set_state (quest3_end2)
end
end
end
end
state quest3_end2 begin
--*************************--
-------<2D><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD>3_1---------
when letter begin
send_letter(gameforge.main_quest_lv60._220_sendLetter)
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>.
local v = find_npc_by_vnum(20011)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20011))
end
end
when button or info begin
say_title(gameforge.main_quest_lv60._220_sendLetter)
say(gameforge.main_quest_lv60._230_say)
say("")
q.set_counter(gameforge.main_quest_lv60._250_counter, pc.getqf("remain_item"))
end
-----------------------------
--*************************--
when __TARGET__.target.click begin
target.delete("__TARGET__")
pc.remove_item (31002, pc.count_item (31002) )
say_title(mob_name(20011))
----"12345678901234567890123456789012345678901234567890"|
say(gameforge.main_quest_lv60._310_say)
say("")
wait()
say_title(mob_name(20011))
----"12345678901234567890123456789012345678901234567890"|
say(gameforge.main_quest_lv60._320_say)
say("")
wait()
say_title(mob_name(20011))
----"12345678901234567890123456789012345678901234567890"|
say(gameforge.main_quest_lv60._330_say)
say("")
wait()
say_title(locale.reward)
----"12345678901234567890123456789012345678901234567890"|
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 3300000))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71094).." ".."3"..locale.count_postfix))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(30056)))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(30025)))
say("")
-- <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> --
pc.give_exp2(3300000)
pc.give_item2(71094, 3) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> * 3
pc.give_item2(30056) -- <20>Ź<EFBFBD><C5B9><EFBFBD>
pc.give_item2(30025) -- <20>Ź<EFBFBD><C5B9><EFBFBD> <20><><EFBFBD>ָӴ<D6B8>
set_state (quest4_begin)
end
end
state quest4_begin begin
--*************************--
-------<2D><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD>4-----------
when letter begin
send_letter(gameforge.main_quest_lv60._340_sendLetter)
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>.
local v = find_npc_by_vnum(20011)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20011))
end
end
when button or info begin
say_title(gameforge.main_quest_lv60._340_sendLetter)
say(gameforge.main_quest_lv60._350_say)
say("")
end
-----------------------------
--*************************--
when __TARGET__.target.click begin
target.delete("__TARGET__")
say_title(mob_name(20011))
----"12345678901234567890123456789012345678901234567890"|
say(gameforge.main_quest_lv60._360_say)
say("")
wait()
say_title(mob_name(20011))
----"12345678901234567890123456789012345678901234567890"|
say(gameforge.main_quest_lv60._370_say)
say("")
wait()
say_title(pc.getname())
----"12345678901234567890123456789012345678901234567890"|
say(gameforge.main_quest_lv60._380_say)
say("")
wait()
say_title(mob_name(20011))
----"12345678901234567890123456789012345678901234567890"|
say(gameforge.main_quest_lv60._390_say)
say("")
wait()
say_title(mob_name(20011))
----"12345678901234567890123456789012345678901234567890"|
say(gameforge.main_quest_lv60._400_say)
say("")
wait()
----"12345678901234567890123456789012345678901234567890"|
say_reward(gameforge.main_quest_lv60._410_sayReward)
say("")
--@@@ <20><><EFBFBD><EFBFBD> @@@--
--1. <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD>.
clear_letter()
set_quest_state ("main_quest_lv66", "state_0")
set_state (__COMPLETE__)
end
end
state __COMPLETE__ begin
when enter begin
q.done()
end
end
end

View File

@ -1,375 +0,0 @@
quest main_quest_lv66 begin
state start begin
end
state state_0 begin
when login or levelup or enter with pc.level >= 66 begin
set_state (state_1)
end
end
state state_1 begin
when letter begin
send_letter (gameforge.main_quest_lv66._10_sendLetter)
local v = find_npc_by_vnum (20011)
if v != 0 then
target.vid ("__TARGET__",v,"")
end
end
when button or info begin
say_title (gameforge.main_quest_lv66._10_sendLetter)
say (gameforge.main_quest_lv66._20_say)
end
when 20011.chat.gameforge.main_quest_lv66._10_sendLetter begin
target.delete("__TARGET__")
say_title ( mob_name(20011))
say(gameforge.main_quest_lv66._30_say)
end
when 1091.kill begin
-- target.delete("__TARGET__")
set_state (state_2)
end
end
state state_2 begin
when letter begin
local v = find_npc_by_vnum (20011)
if v != 0 then
target.vid ("__TARGET__",v,"")
end
send_letter (gameforge.main_quest_lv66._10_sendLetter)
end
when button or info begin
say_title (gameforge.main_quest_lv66._10_sendLetter)
say (gameforge.main_quest_lv66._40_say)
end
when 20011.chat.gameforge.main_quest_lv66._10_sendLetter begin
target.delete("__TARGET__")
say_title ( mob_name(20011))
say(gameforge.main_quest_lv66._50_say)
set_state (state_3)
end
end
state state_3 begin
when letter begin
local v = find_npc_by_vnum (20011)
if v != 0 then
target.vid ("__TARGET__",v,"")
end
send_letter(gameforge.main_quest_lv66._60_sendLetter)
end
when button or info begin
say_title (gameforge.main_quest_lv66._60_sendLetter)
say(gameforge.main_quest_lv66._70_say)
end
when 20011.chat.gameforge.main_quest_lv66._60_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20011))
say(gameforge.main_quest_lv66._80_say)
wait()
say_title ( mob_name(20011))
say(gameforge.main_quest_lv66._90_say)
wait()
say_title ( mob_name(20011))
say(gameforge.main_quest_lv66._100_say)
wait()
say_title ( mob_name(20011))
say(gameforge.main_quest_lv66._110_say)
wait()
say_title ( mob_name(20011))
say(gameforge.main_quest_lv66._120_say)
wait()
--say_title ("<22><><EFBFBD><EFBFBD> :")
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 5800000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(72301).." ".."3"..locale.count_postfix))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(30046)))
pc.give_exp2(5800000)
pc.give_item2(72301) -- <20><EFBFBD><E0BAB9> <20><> * 3
pc.give_item2(72301)
pc.give_item2(72301)
pc.give_item2(30046) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
set_state (state_4)
end
end
state state_4 begin
when letter begin
local v = find_npc_by_vnum (pc_find_square_guard_vid())
if v != 0 then
target.vid ("__TARGET__",v,"")
end
send_letter (gameforge.main_quest_lv66._130_sendLetter)
end
when button or info begin
say_title (gameforge.main_quest_lv66._130_sendLetter)
say (gameforge.main_quest_lv66._140_say)
end
when 11000.chat.gameforge.main_quest_lv66._130_sendLetter or 11002.chat.gameforge.main_quest_lv66._130_sendLetter or 11004.chat.gameforge.main_quest_lv66._130_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(11000))
say(gameforge.main_quest_lv66._150_say)
wait()
say_title(mob_name(11000))
say(gameforge.main_quest_lv66._160_say)
set_state (state_5)
end
end
state state_5 begin
when letter begin
local v = find_npc_by_vnum (20369)
if v != 0 then
target.vid ("__TARGET__",v,"")
end
send_letter(gameforge.main_quest_lv66._170_sendLetter)
end
when button or info begin
say_title(gameforge.main_quest_lv66._170_sendLetter)
say (gameforge.main_quest_lv66._140_say)
end
when 20369.chat.gameforge.main_quest_lv66._170_sendLetter begin
target.delete("__TARGET__")
say_title(gameforge.main_quest_lv66._190_sayTitle)
say(gameforge.main_quest_lv66._200_say)
set_state (state_6)
end
end
state state_6 begin
when letter begin
local v = find_npc_by_vnum (20369)
if v != 0 then
target.vid ("__TARGET__",v,"")
end
send_letter (gameforge.main_quest_lv66._210_sendLetter)
end
when button or info begin
say_title (gameforge.main_quest_lv66._210_sendLetter)
say (gameforge.main_quest_lv66._220_say)
end
when 20369.chat.gameforge.main_quest_lv66._210_sendLetter begin
target.delete("__TARGET__")
say_title(gameforge.main_quest_lv66._190_sayTitle)
say(gameforge.main_quest_lv66._230_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv66._240_say)
wait()
say_title(gameforge.main_quest_lv66._190_sayTitle)
say(gameforge.main_quest_lv66._250_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv66._260_say)
wait()
say_title(gameforge.main_quest_lv66._190_sayTitle)
say(gameforge.main_quest_lv66._270_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv66._280_say)
wait()
say_title(mob_name(20369))
say(gameforge.main_quest_lv66._290_say)
wait()
say_title(gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv66._310_say)
set_state (state_7)
end
end
state state_7 begin
when letter begin
local v = find_npc_by_vnum (20369)
if v != 0 then
target.vid ("__TARGET__",v,"")
end
send_letter (gameforge.main_quest_lv66._320_sendLetter)
end
when button or info begin
say_title (gameforge.main_quest_lv66._320_sendLetter)
say (gameforge.main_quest_lv66._330_say)
end
when 20369.chat.gameforge.main_quest_lv66._320_sendLetter begin
target.delete("__TARGET__")
say_title( gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv66._340_say)
wait()
say_title( gameforge.main_quest_lv66._300_sayTitle)
say(string.format(gameforge.main_quest_lv66._350_say,item_name(30033)))
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv66._360_say)
wait()
say_title(gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv66._370_say)
set_state (state_8)
end
end
state state_8 begin
when enter begin
pc.setqf ("rgd_kill", 0)
pc.setqf ("state_8_start", get_global_time())
notice_multiline(string.format(gameforge.main_quest_lv66._380_notice, 30), notice)
timer("rgd_kill_timer", 30 * 60 / 2)
end
when letter begin
send_letter (gameforge.main_quest_lv66._390_sendLetter)
local t = pc.getqf ("state_8_start") + 30 * 60 - get_global_time()
q.set_clock(locale.stash.enlarge_1_timer, t)
q.set_counter_name (mob_name (2313))
q.set_counter_value (200)
end
when button or info begin
say_title (gameforge.main_quest_lv66._390_sendLetter)
say (string.format(gameforge.main_quest_lv66._400_say, 200))
local t = pc.getqf ("state_8_start") + 30 * 60 - get_global_time()
if t < 0 then
say(gameforge.main_quest_lv66._410_say)
else
say(string.format(gameforge.main_quest_lv66._420_say, t / 60))
end
end
when 2313.kill begin
if pc.getqf("rgd_kill") >= 200 - 1 then
pc.give_item2 (31003, 1)
pc.setqf ("rgd_kill", 0)
q.set_counter_value (0)
set_state (state_9)
else
pc.setqf ("rgd_kill", pc.getqf ("rgd_kill") + 1)
q.set_counter_value (200 - pc.getqf ("rgd_kill"))
end
end
when rgd_kill_timer.timer begin
local t = pc.getqf ("state_8_start") + 30 * 60 - get_global_time()
notice (string.format(gameforge.main_quest_lv66._420_say, t / 60))
end
end
state state_9 begin
when letter begin
local v = find_npc_by_vnum (20369)
if v != 0 then
target.vid ("__TARGET__",v,"")
end
send_letter (gameforge.main_quest_lv66._390_sendLetter)
end
when button or info begin
say_title (gameforge.main_quest_lv66._390_sendLetter)
say(gameforge.main_quest_lv66._430_say)
end
when 20369.chat.gameforge.main_quest_lv66._390_sendLetter begin
target.delete("__TARGET__")
pc.remove_item (31003, 1)
if (pc.getqf ("state_8_start") + 30 * 60 - get_global_time()) >= 0 then
q.done()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv66._440_say)
wait()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv66._450_say)
wait()
say_title (locale.reward)
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 2900000))
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 200000))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(30033)))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(50727).." ".."10"..locale.count_postfix))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(50728).." ".."10"..locale.count_postfix))
pc.give_exp2(2900000)
pc.change_money(200000)
pc.give_item2(30033) -- <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>׸<EFBFBD>
pc.give_item2(50727, 10) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 10
pc.give_item2(50728, 10) -- <20><><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD> 10
else
say_title(gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv66._460_say)
wait()
say_title(gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv66._470_say)
wait()
say_title (locale.reward)
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 2000000))
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 100000))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(50727).." ".."10"..locale.count_postfix))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(50728).." ".."10"..locale.count_postfix))
pc.give_exp2(2000000)
pc.change_money(100000)
pc.give_item2(50727, 10) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 10
pc.give_item2(50728, 10) -- <20><><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD> 10
end
set_state (state_10)
end
end
state state_10 begin
when letter begin
local v = find_npc_by_vnum (20370)
if v != 0 then
target.vid ("__TARGET__",v,"")
end
send_letter (gameforge.main_quest_lv66._480_sendLetter)
end
when button or info begin
say_title (gameforge.main_quest_lv66._480_sendLetter)
say(gameforge.main_quest_lv66._490_say)
end
when 20370.chat.gameforge.main_quest_lv66._480_sendLetter begin
target.delete("__TARGET__")
say_title( mob_name(20370))
say(gameforge.main_quest_lv66._500_say)
wait()
say_title ( pc.getname())
say(gameforge.main_quest_lv66._510_say)
wait()
say_title ( mob_name(20370))
say(gameforge.main_quest_lv66._520_say)
wait()
say_title ( pc.getname())
say(gameforge.main_quest_lv66._530_say)
wait()
say_title ( mob_name(20370))
say(gameforge.main_quest_lv66._540_say)
wait()
say_title ( mob_name(20370))
say(gameforge.main_quest_lv66._550_say)
set_state (state_11)
end
end
state state_11 begin
when letter begin
local v = find_npc_by_vnum (20369)
if v != 0 then
target.vid ("__TARGET__",v,"")
end
send_letter (gameforge.main_quest_lv66._560_sendLetter)
end
when button or info begin
say_title (gameforge.main_quest_lv66._560_sendLetter)
say (gameforge.main_quest_lv66._570_say)
end
when 20369.chat.gameforge.main_quest_lv66._560_sendLetter begin
target.delete("__TARGET__")
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv66._580_say)
wait()
say_title ( pc.getname())
say(gameforge.main_quest_lv66._590_say)
wait()
say_title(gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv66._600_say)
wait()
say_title(gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv66._610_say)
wait()
say_title(gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv66._620_say)
set_state (__COMPLETE__)
q.done()
set_quest_state ("main_quest_lv72", "state_0")
end
end
state __COMPLETE__ begin
end
end

View File

@ -1,220 +0,0 @@
quest main_quest_lv72 begin
state start begin
end
state state_0 begin
when login or levelup or enter with pc.level >= 72 begin
set_state (state_1)
end
end
state state_1 begin
when letter begin
local v = find_npc_by_vnum (20369)
if v != 0 then
target.vid ("__TARGET__",v,"")
end
send_letter(gameforge.main_quest_lv72._10_sendLetter)
end
when button or info begin
say_title(gameforge.main_quest_lv72._10_sendLetter)
say (gameforge.main_quest_lv72._20_say)
end
when 20369.chat.gameforge.main_quest_lv72._10_sendLetter begin
target.delete("__TARGET__")
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv72._30_say)
wait()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv72._40_say)
wait()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv72._50_say)
set_state (state_2)
end
end
state state_2 begin
when letter begin
local v = find_npc_by_vnum (20372)
if v != 0 then
target.vid ("__TARGET__",v,"")
end
send_letter(gameforge.main_quest_lv72._60_sendLetter)
end
when button or info begin
say_title(gameforge.main_quest_lv72._60_sendLetter)
say (gameforge.main_quest_lv72._70_say)
end
when 20372.click begin
target.delete("__TARGET__")
say(gameforge.main_quest_lv72._80_say)
wait()
say_title(mob_name(20372))
say(gameforge.main_quest_lv72._90_say)
wait()
say_title(mob_name(20372))
say(gameforge.main_quest_lv72._100_say)
wait()
say(gameforge.main_quest_lv72._110_say)
pc.give_item2 (30160, 1)
set_state (report_discovery)
end
end
state report_discovery begin
when button or info begin
return
end
when 20369.chat.gameforge.main_quest_lv72._60_sendLetter begin
pc.remove_item (30160)
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv72._120_say)
wait()
say_title ( pc.getname())
say(gameforge.main_quest_lv72._130_say)
wait()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv72._140_say)
wait()
say_title ( pc.getname())
say(gameforge.main_quest_lv72._150_say)
wait()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv72._160_say)
wait()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv72._170_say)
wait()
if number (1,2) == 1 then
drug = 30009
else
drug = 30083
end
say_title (locale.reward)
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 3100000))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(70005)))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(drug)))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(30039)))
pc.give_exp2(3100000)
pc.give_item2(70005) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
pc.give_item2(drug) -- <20>˼<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> (+<2B><> <20><><EFBFBD><EFBFBD>)
pc.give_item2(30039) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
set_state (state_4)
end
end
state state_4 begin
when letter begin
local v = find_npc_by_vnum (20369)
if v != 0 then
target.vid ("__TARGET__",v,"")
end
send_letter(gameforge.main_quest_lv72._180_sendLetter)
end
when button or info begin
say_title(gameforge.main_quest_lv72._180_sendLetter)
say(gameforge.main_quest_lv72._190_say)
end
when 20369.chat.gameforge.main_quest_lv72._180_sendLetter begin
target.delete("__TARGET__")
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv72._200_say)
wait()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv72._210_say)
wait()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv72._220_say)
pc.setqf ("collect_beads", 0)
set_state (state_5)
end
end
state state_5 begin
when letter begin
send_letter(gameforge.main_quest_lv72._180_sendLetter)
end
when button or info begin
say_title(gameforge.main_quest_lv72._180_sendLetter)
say(gameforge.main_quest_lv72._190_say)
end
when 1105.kill or 1106.kill or 1107.kill begin
if number(1, 100) > 1 then
return
end
local n = pc.getqf ("pass_beads")
local i = pc.count_item (31005)
if n < 50 and pc.count_item (31005) < 50 - n then
notice_multiline(gameforge.main_quest_lv72._240_notice, notice)
notice_multiline(string.format(gameforge.main_quest_lv72._250_notice, 50 - n - 1), notice)
pc.give_item2 (31005, 1)
end
end
when 20369.chat.gameforge.main_quest_lv72._180_sendLetter with pc.count_item (31005) > 0 begin
local now = get_global_time()
local today = now - math.mod (now, 86400)
local can_report_num
if pc.getqf ("last_access_date") != today then
pc.setqf ("last_access_date", today)
pc.setqf ("blue_bead_todays_report_num", 1)
else
local reported_num = pc.getqf("blue_bead_todays_report_num")
if 10 - reported_num <= 0 then
say(gameforge.main_quest_lv72._260_say)
return
else
if not pc.is_gm() then
pc.setqf ("blue_bead_todays_report_num", reported_num + 1)
end
end
end
pc.remove_item (31005, 1)
local n = pc.getqf("pass_beads")
if number (1,100) > 60 then
say_title (mob_name(20369))
say(gameforge.main_quest_lv72._270_say)
return
elseif n < 50 -1 then
pc.setqf ("pass_beads", n + 1)
say_title (gameforge.main_quest_lv66._300_sayTitle)
say (string.format(gameforge.main_quest_lv72._280_say, 50 - n - 1))
else
pc.setqf("pass_beads", 0)
say_title(gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv72._290_say)
wait()
say_title (locale.reward)
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 20000000))
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 225000))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71035).." ".."3"..locale.count_postfix))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(70043)))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(72024)))
pc.give_exp2(20000000)
pc.change_money(225000)
pc.give_item2(71035)
pc.give_item2(71035)
pc.give_item2(71035)
pc.give_item2(70043)
pc.give_item2(72024)
wait()
say(gameforge.main_quest_lv72._300_say)
set_state (__COMPLETE__)
q.done()
set_quest_state ("main_quest_lv78", "state_0")
end
end
end
state __COMPLETE__ begin
end
end

View File

@ -1,228 +0,0 @@
quest main_quest_lv78 begin
state start begin
end
state state_0 begin
when login or levelup or enter with pc.level >= 78 begin
set_state (state_1)
end
end
state state_1 begin
when letter begin
local v = find_npc_by_vnum (20369)
if v != 0 then
target.vid ("__TARGET__",v,"")
end
send_letter(gameforge.main_quest_lv78._10_sendLetter)
end
when button or info begin
say_title(gameforge.main_quest_lv78._10_sendLetter)
say (gameforge.main_quest_lv78._20_say)
end
when 20369.chat.gameforge.main_quest_lv78._10_sendLetter begin
target.delete("__TARGET__")
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv78._30_say)
wait()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv78._40_say)
set_state (make_red_bead)
end
end
state make_red_bead begin
when enter begin
pc.setqf ("first_make_time", 0)
end
when 2205.kill or 2204.kill or 2203.kill begin
if number(1, 500) == 1 then
pc.give_item2 (31007, 1)
end
end
when 20369.chat.gameforge.main_quest_lv78._10_sendLetter begin
if pc.count_item (31006) >= 20 then
say_title (mob_name(20369))
say(string.format(gameforge.main_quest_lv78._50_say, 20))
wait()
say_title (locale.reward)
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 36000000))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(72725)))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(70024)))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(70004)))
pc.give_exp2(36000000)
pc.give_item2(72725) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ູ(<28><>)
pc.give_item2(70024) -- <20><EFBFBD><E0BAB9> <20><><EFBFBD><EFBFBD>
pc.give_item2(70004) -- <20>ٸ<EFBFBD><D9B8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
pc.remove_item (31006, pc.count_item (31006))
set_state (state_2)
return
end
local t = get_global_time()
local today = t - math.mod (t, 86400)
if pc.getqf ("first_make_time") != today then
pc.setqf ("first_make_time", today)
pc.setqf ("make_count", 0)
end
if pc.count_item (90010) < 1 or pc.count_item (30019) < 1 or
pc.count_item (31007) < 1 then
say_title (gameforge.main_quest_lv66._300_sayTitle)
say (gameforge.main_quest_lv78._60_say)
return
end
local n = pc.getqf ("make_count")
if n >= 7 then
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv78._70_say)
return
else
pc.remove_item(90010, 1)
pc.remove_item(30019, 1)
pc.remove_item(31007, 1)
say_title(gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv78._80_say)
wait()
pc.setqf ("make_count", n + 1)
local n = number (1,100)
if n > 60 then
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv78._90_say)
wait()
elseif pc.count_item (31006) < 20 then
pc.give_item2 (31006, 1)
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv78._100_say)
say_item_vnum(31006)
wait ()
else
say_title (mob_name(20369))
say(string.format(gameforge.main_quest_lv78._50_say, 20))
wait()
say_title (locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 36000000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(72725)))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(70024)))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(70004)))
pc.give_exp2(36000000)
pc.give_item2(72725) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ູ(<28><>)
pc.give_item2(70024) -- <20><EFBFBD><E0BAB9> <20><><EFBFBD><EFBFBD>
pc.give_item2(70004) -- <20>ٸ<EFBFBD><D9B8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
pc.remove_item (31006, pc.count_item (31006))
set_state (state_2)
end
end
end
end
state state_2 begin
when letter begin
local v = find_npc_by_vnum (20369)
if v != 0 then
target.vid ("__TARGET__",v,"")
end
send_letter (gameforge.main_quest_lv78._110_sendLetter)
end
when button or info begin
say_title (gameforge.main_quest_lv78._110_sendLetter)
say(gameforge.main_quest_lv78._120_say)
end
when 20369.chat.gameforge.main_quest_lv78._110_sendLetter with pc.count_item (31004) < 100 begin
target.delete("__TARGET__")
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv78._130_say)
wait()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv78._140_say)
end
when 2315.kill or 2314.kill begin
if number (1, 300) == 1 then
pc.give_item2 (31004, 1)
local n = pc.count_item (31004)
if n < 100 then
notice (string.format(gameforge.main_quest_lv78._150_say, 100 - n))
else
notice_multiline(gameforge.main_quest_lv78._160_notice, notice)
end
end
end
when 20369.chat.gameforge.main_quest_lv78._110_sendLetter with pc.count_item (31004) >= 100 begin
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv78._170_say)
wait()
say_title ( pc.getname())
say(gameforge.main_quest_lv78._180_say)
wait()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv78._190_say)
wait()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv78._200_say)
wait()
say_title (locale.reward)
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 48000000))
say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 230000))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(72729)))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(70035)))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(70003)))
pc.give_exp2(48000000)
pc.change_money(230000)
pc.give_item2(72729) -- ȭ<><C8AD><EFBFBD><EFBFBD> <20>ູ(<28><>)
pc.give_item2(70035) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö
pc.give_item2(70003) -- <20><><EFBFBD><EFBFBD>
pc.remove_item (31004, pc.count_item (31004))
set_state (state_3)
end
end
state state_3 begin
when letter begin
local v = find_npc_by_vnum (20018)
if v != 0 then
target.vid ("__TARGET__",v,"")
end
send_letter (gameforge.main_quest_lv78._210_sendLetter)
end
when button or info begin
say_title (gameforge.main_quest_lv78._210_sendLetter)
say(gameforge.main_quest_lv78._220_say)
end
when 20018.chat.gameforge.main_quest_lv78._210_sendLetter begin
target.delete("__TARGET__")
say_title ( mob_name(20018))
say(gameforge.main_quest_lv78._230_say)
wait()
say_title ( pc.get_name ())
say(gameforge.main_quest_lv78._240_say)
wait()
say_title ( mob_name(20018))
say(gameforge.main_quest_lv78._250_say)
wait()
say_title ( pc.get_name ())
say(gameforge.main_quest_lv78._260_say)
wait()
say_title ( mob_name(20018))
say(gameforge.main_quest_lv78._270_say)
wait()
say_title ( pc.get_name ())
say(gameforge.main_quest_lv78._280_say)
wait()
say_title ( mob_name(20018))
say(gameforge.main_quest_lv78._290_say)
wait()
say_title(locale.reward)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(30319).." ".."2"..locale.count_postfix))
pc.give_item2(30319,2)
wait()
say(gameforge.main_quest_lv78._300_say)
set_state (__COMPLETE__)
q.done()
set_quest_state("main_quest_lv84", "state_0")
end
end
state __COMPLETE__ begin
end
end

View File

@ -1,151 +0,0 @@
quest main_quest_lv84 begin
state start begin
end
state state_0 begin
when login or levelup or enter with pc.level >= 84 begin
set_state (state_1)
end
end
state state_1 begin
when letter begin
local v = find_npc_by_vnum (20369)
if v != 0 then
target.vid ("__TARGET__",v,"")
end
send_letter (gameforge.main_quest_lv84._10_sendLetter)
end
when button or info begin
say_title(gameforge.main_quest_lv84._10_sendLetter)
say(gameforge.main_quest_lv84._20_say)
end
when 20369.chat.gameforge.main_quest_lv84._10_sendLetter begin
target.delete("__TARGET__")
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv84._30_say)
wait()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv84._40_say)
wait()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv84._50_say)
pc.give_item2(31008)
set_state (state_4)
end
end
state state_4 begin
when letter begin
send_letter(gameforge.main_quest_lv84._60_sendLetter)
end
when button or info begin
say_title(gameforge.main_quest_lv84._60_sendLetter)
say(gameforge.main_quest_lv84._70_say)
end
when 31008.use with pc.get_map_index() >= 2160000 and pc.get_map_index() < 2170000 begin --and pc.getf("devilcatacomb_zone", "level") == 5 begin
party.give_buff(303, POINT_ATT_SPEED, 20, 13, 1800, 0, true, true)
party.give_buff(303, POINT_MOV_SPEED, 20, 12, 1800, 0, true, true)
party.give_buff(303, POINT_CASTING_SPEED, 20, 0, 1800, 0, true, true)
party.give_buff(303, POINT_ATTBONUS_MONSTER, 30, 0, 1800, 0, true, true)
party.give_buff(303, POINT_MAX_HP_PCT, 10, 0, 1800, 0, true, true)
party.give_buff(303, POINT_MAX_SP_PCT, 10, 0, 1800, 0, true, true)
say(gameforge.main_quest_lv84._80_say)
end
when 2591.kill begin
say_title(locale.reward)
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 63000000))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(71026).." ".."2"..locale.count_postfix))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(70051)))
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward, item_name(70050)))
pc.give_exp2(63000000)
pc.change_money(250000)
pc.give_item2(71026) -- <20><>ö
pc.give_item2(71026) -- <20><>ö
pc.give_item2(70051) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>
pc.give_item2(70050) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ǥ
set_state (state_2)
end
end
state state_2 begin
when letter begin
local v = find_npc_by_vnum (20369)
if v != 0 then
target.vid ("__TARGET__",v,"")
end
send_letter(gameforge.main_quest_lv84._90_sendLetter)
end
when button or info begin
say_title(gameforge.main_quest_lv84._90_sendLetter)
say (gameforge.main_quest_lv84._100_say)
end
when 20369.chat.gameforge.main_quest_lv84._90_sendLetter begin
target.delete("__TARGET__")
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv84._110_say)
wait()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv84._120_say)
end
when 2597.kill begin
say_reward(gameforge.main_quest_lv84._130_sayReward)
say(gameforge.main_quest_lv84._140_say)
set_state (state_3)
end
end
state state_3 begin
when letter begin
local v = find_npc_by_vnum (20369)
if v != 0 then
target.vid ("__TARGET__",v,"")
end
send_letter(gameforge.main_quest_lv84._150_sendLetter)
end
when button or info begin
say_title(gameforge.main_quest_lv84._150_sendLetter)
say (gameforge.main_quest_lv84._160_say)
end
when 20369.chat.gameforge.main_quest_lv84._150_sendLetter begin
target.delete("__TARGET__")
say_title (" ")
say(gameforge.main_quest_lv84._170_say)
wait()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv84._180_say)
wait()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv84._190_say)
wait()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv84._200_say)
wait()
say_title (gameforge.main_quest_lv66._300_sayTitle)
say(gameforge.main_quest_lv84._210_say)
wait()
say_title (locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 84000000))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 250000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(71025).." ".."2"..locale.count_postfix))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(70038)))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(71107)))
pc.give_exp2(84000000)
pc.change_money(250000)
pc.give_item2(71025) -- <20>߰<EFBFBD><DFB0><EFBFBD>
pc.give_item2(71025) -- <20>߰<EFBFBD><DFB0><EFBFBD>
pc.give_item2(70038) -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
pc.give_item2(71107) -- õ<><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
set_state (__COMPLETE__)
end
end
state __COMPLETE__ begin
end
end

File diff suppressed because it is too large Load Diff

View File

@ -1,768 +0,0 @@
quest main_quest_lv91 begin
state start begin
end
state state0 begin
when login or levelup or enter with pc.level >= 91 begin
set_state (state1_1)
end
end
-----------------<1> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-1-----------------
-----------------<1> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-1-----------------
-----------------<1> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-1-----------------
-----------------<1> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-1-----------------
-----------------<1> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-1-----------------
-----------------<1> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-1-----------------
-----------------<1> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-1-----------------
-----------------<1> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-1-----------------
-----------------<1> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-1-----------------
-----------------<1> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-1-----------------
-----------------<1> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-1-----------------
state state1_1 begin
when letter begin
send_letter (gameforge.main_quest_lv91._010_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv91._010_sendLetter)
say(gameforge.main_quest_lv91._020_say)
end
when 20378.chat.gameforge.main_quest_lv91._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378))
say(gameforge.main_quest_lv91._030_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv91._050_say)
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv91._060_say)
wait()
set_state (state1_2)
end
end
state state1_2 begin
when letter begin
send_letter(gameforge.main_quest_lv91._010_sendLetter)
--q.set_counter_name(locale.main_quest_lv91.remain_mob)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv91._070_sayTitle)
say(gameforge.main_quest_lv91._080_say)
-- say()
-- say_reward(locale.main_quest_lv91.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
--say_title(gameforge.main_quest_lv91._760_say)
--local remain = 10 - pc.getqf("mob1_1_killed")
--if remain < 0 then
-- remain = 0
--end
--q.set_counter_value(remain)
--say_title(string.format(gameforge.main_quest_lv91._770_say,mob_name(3205),remain))
end
--[[
--Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>--
when 20378.chat.gameforge.main_quest_lv91._010_sendLetter begin
say_title(mob_name(20378))
say(gameforge.main_quest_lv91._520_say)
end
--]]
when 3205.kill begin
local mob1_1_killed = pc.getqf("mob1_1_killed")
if mob1_1_killed < 10 then
pc.setqf("mob1_1_killed", mob1_1_killed + 1)
local remain = 10 - pc.getqf("mob1_1_killed")
if remain < 0 then
remain = 0
end
--q.set_counter_value(remain)
if remain == 0 then
say_title(mob_name(3205))
say(gameforge.main_quest_lv91._100_say)
notice_multiline(gameforge.main_quest_lv91._090_1_notice,notice)
notice_multiline(gameforge.main_quest_lv91._090_2_notice,notice)
set_state (state1_3)
end
end
end
end
state state1_3 begin
when letter begin
send_letter(gameforge.main_quest_lv91._010_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
--q.set_counter_name("")
end
when button or info begin
say_title(gameforge.main_quest_lv91._010_sendLetter)
say(gameforge.main_quest_lv91._110_say)
end
when 20378.chat.gameforge.main_quest_lv91._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378))
say(gameforge.main_quest_lv91._120_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv91._130_say)
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv91._150_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 18803050))
--say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 0))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(30051),1,locale.count_postfix))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(50814),10,locale.count_postfix))
say("")
pc.give_exp2(18803050)
--pc.change_money(0)
pc.give_item2(30051, 1)
pc.give_item2(50814, 10)
set_state (state2_1)
end
end
-----------------<2> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Żȯ<C5BB>϶<EFBFBD>!-----------------
-----------------<2> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Żȯ<C5BB>϶<EFBFBD>!-----------------
-----------------<2> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Żȯ<C5BB>϶<EFBFBD>!-----------------
-----------------<2> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Żȯ<C5BB>϶<EFBFBD>!-----------------
-----------------<2> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Żȯ<C5BB>϶<EFBFBD>!-----------------
-----------------<2> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Żȯ<C5BB>϶<EFBFBD>!-----------------
-----------------<2> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Żȯ<C5BB>϶<EFBFBD>!-----------------
-----------------<2> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Żȯ<C5BB>϶<EFBFBD>!-----------------
-----------------<2> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Żȯ<C5BB>϶<EFBFBD>!-----------------
-----------------<2> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Żȯ<C5BB>϶<EFBFBD>!-----------------
-----------------<2> <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Żȯ<C5BB>϶<EFBFBD>!-----------------
state state2_1 begin
when letter begin
send_letter(gameforge.main_quest_lv91._160_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv91._160_sendLetter)
say(gameforge.main_quest_lv91._170_say)
end
when 20378.chat.gameforge.main_quest_lv91._160_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378))
say(gameforge.main_quest_lv91._180_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv91._190_say)
set_state (state2_2)
end
end
state state2_2 begin
when letter begin
send_letter(gameforge.main_quest_lv91._160_sendLetter)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv91._200_sayTitle)
say(gameforge.main_quest_lv91._210_say)
say_item_vnum(31075)
-- say()
-- say_reward(locale.main_quest_lv91.pos_info)
-- say()
-- say()
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
--Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>--
when 20378.chat.gameforge.main_quest_lv91._160_sendLetter begin
say_title(mob_name(20378))
say(gameforge.main_quest_lv91._220_say)
end
when 3291.kill begin
if number(1,500) == 1 then
if pc.count_item(31075) < 1 then
notice_multiline(gameforge.main_quest_lv91._230_1_notice,notice)
notice_multiline(gameforge.main_quest_lv91._230_2_notice,notice)
pc.give_item2(31075, 1)
set_state (state2_3)
end
end
end
end
-- <20><><EFBFBD><EFBFBD>Ʈ <20>Ϸ<EFBFBD>
state state2_3 begin
when letter begin
send_letter(gameforge.main_quest_lv91._160_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv91._160_sendLetter)
say(gameforge.main_quest_lv91._240_say)
end
-- <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>κ<EFBFBD>.
when 3291.kill begin
if number(1,500) == 1 then
if pc.count_item(31075) < 1 then
notice_multiline(gameforge.main_quest_lv91._230_1_notice,notice)
notice_multiline(gameforge.main_quest_lv91._230_2_notice,notice)
pc.give_item2(31075, 1)
end
end
end
when 20378.chat.gameforge.main_quest_lv91._160_sendLetter begin
target.delete("__TARGET__")
if pc.count_item(31075) >= 1 then
pc.remove_item ( 31075, pc.count_item(31075))
say_title(mob_name(20378))
say(gameforge.main_quest_lv91._250_say)
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv91._260_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 24873650))
--say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 0))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(50722),20,locale.count_postfix))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(72016),1,locale.count_postfix))
say("")
pc.give_exp2(24873650)
--pc.change_money(0)
pc.give_item2(50722, 20)
pc.give_item2_select(72016)
item.set_socket(2, 120)
set_state (state3_1)
else
say_title(mob_name(20378))
say(gameforge.main_quest_lv91._220_say)
set_state (state2_2)
end
end
end
-----------------<3> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1-----------------
-----------------<3> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1-----------------
-----------------<3> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1-----------------
-----------------<3> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1-----------------
-----------------<3> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1-----------------
-----------------<3> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1-----------------
-----------------<3> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1-----------------
-----------------<3> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1-----------------
-----------------<3> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1-----------------
-----------------<3> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1-----------------
-----------------<3> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1-----------------
state state3_1 begin
when letter begin
send_letter(gameforge.main_quest_lv91._270_sendLetter)
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_lv91._270_sendLetter)
say(gameforge.main_quest_lv91._280_say)
end
when 20380.chat.gameforge.main_quest_lv91._270_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv91._290_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv91._300_say)
wait()
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv91._310_say)
wait()
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv91._320_say)
wait()
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv91._330_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv91._340_say)
set_state (state3_2)
end
end
state state3_2 begin
when letter begin
send_letter(gameforge.main_quest_lv91._270_sendLetter)
q.set_counter_name(gameforge.main_quest_lv90._1180_say)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv91._350_sayTitle)
say(gameforge.main_quest_lv91._360_say)
say_item_vnum(31018)
say(gameforge.main_quest_lv90._1180_say)
local remain = 10 - pc.getqf("item3_1_checked")
if remain < 0 then
remain = 0
end
q.set_counter_value(remain)
say_reward(string.format(gameforge.main_quest_lv90._1190_say,item_name(31018),remain))
-- say()
-- say_reward(locale.main_quest_lv91.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
--Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>--
when 20380.chat.gameforge.main_quest_lv91._270_sendLetter with pc.count_item(31018) > 0 begin
if pc.count_item(31018) > 0 then
pc.remove_item(31018, 1)
if number(1, 100 ) <= 70 then -- <20><>ǰ <20><><EFBFBD><EFBFBD>
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv91._380_say)
pc.setqf("item3_1_checked", pc.getqf("item3_1_checked") + 1)
local remain = 10 - pc.getqf("item3_1_checked")
if remain < 0 then
remain = 0
end
q.set_counter_value(remain)
if pc.getqf("item3_1_checked") >= 10 then -- <20><>ǰ <20><><EFBFBD><EFBFBD> <20>޼<EFBFBD>
pc.remove_item(31018, pc.count_item(31018))
wait()
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv91._390_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 25805450))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 214000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(30009),2,locale.count_postfix))
say("")
pc.give_exp2(25805450)
pc.change_money(214000)
pc.give_item2(30009, 2)
set_state (state4_1)
q.set_counter_name("")
else -- <20><>ǰ <20><><EFBFBD><EFBFBD> <20>̴<EFBFBD>
say(string.format(gameforge.main_quest_lv91._400_say,remain))
end
else -- <20><>ǰ <20><><EFBFBD><EFBFBD>
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv91._370_say)
end
end
end
when 3601.kill or 3602.kill or 3603.kill or 3604.kill or 3605.kill begin
if number(1,300) == 1 then
pc.give_item2(31018, 1)
notice_multiline(gameforge.main_quest_lv91._410_1_notice,notice)
notice_multiline(gameforge.main_quest_lv91._410_2_notice,notice)
end
end
end
-----------------<4> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-2-----------------
-----------------<4> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-2-----------------
-----------------<4> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-2-----------------
-----------------<4> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-2-----------------
-----------------<4> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-2-----------------
-----------------<4> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-2-----------------
-----------------<4> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-2-----------------
-----------------<4> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-2-----------------
-----------------<4> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-2-----------------
-----------------<4> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-2-----------------
-----------------<4> <20>ι<EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-2-----------------
state state4_1 begin
when letter begin
send_letter(gameforge.main_quest_lv91._420_sendLetter)
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_lv91._420_sendLetter)
say(gameforge.main_quest_lv91._430_say)
end
when 20380.chat.gameforge.main_quest_lv91._420_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv91._440_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv91._450_say)
wait()
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv91._460_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv91._470_say)
set_state (state4_2)
end
end
state state4_2 begin
when letter begin
send_letter(gameforge.main_quest_lv91._420_sendLetter)
q.set_counter_name(gameforge.main_quest_lv90._1180_say)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv91._480_sayTitle)
say(gameforge.main_quest_lv91._490_say)
say_item_vnum(31019)
say(gameforge.main_quest_lv90._1180_say)
local remain = 3 - pc.getqf("item4_1_checked")
if remain < 0 then
remain = 0
end
q.set_counter_value(remain)
say_reward(string.format(gameforge.main_quest_lv90._1190_say,item_name(31019),remain))
-- say()
-- say_reward(locale.main_quest_lv91.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
--Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>--
when 20380.chat.gameforge.main_quest_lv91._420_sendLetter with pc.count_item(31019) > 0 begin
if pc.count_item(31019) > 0 then
local cur_t = get_global_time() - 60 * 60 * 9
local today_date = cur_t - math.mod(cur_t,86400)
local last_checked_date = pc.getqf("last_checked_date")
if today_date ~= last_checked_date then
pc.setqf("last_checked_date", today_date)
pc.setqf("today_item4_1_checked",0)
end
local today_item4_1_checked = pc.getqf("today_item4_1_checked")
if today_item4_1_checked >= 1 then --1<><31> <20><>ǰ <20><><EFBFBD><EFBFBD> <20>ʰ<EFBFBD>
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv91._500_say)
else -- <20><>ǰ <20>õ<EFBFBD>.
pc.remove_item(31019, 1)
if number(1, 100 ) <= 70 then -- <20><>ǰ <20><><EFBFBD><EFBFBD>
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv91._510_say)
pc.setqf("item4_1_checked", pc.getqf("item4_1_checked") + 1)
pc.setqf("today_item4_1_checked", pc.getqf("today_item4_1_checked") + 1)
local remain = 3 - pc.getqf("item4_1_checked")
if remain < 0 then
remain = 0
end
q.set_counter_value(remain)
if pc.getqf("item4_1_checked") >= 3 then -- <20><>ǰ <20><><EFBFBD><EFBFBD> <20>޼<EFBFBD>
pc.remove_item(31019, pc.count_item(31019))
wait()
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv91._520_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 27874000))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 225000))
say("")
pc.give_exp2(27874000)
pc.change_money(225000)
set_state (state5_1)
q.set_counter_name("")
else -- <20><>ǰ <20><><EFBFBD><EFBFBD> <20>̴<EFBFBD>
say(string.format(gameforge.main_quest_lv91._530_say,remain))
end
else -- <20><>ǰ <20><><EFBFBD><EFBFBD>
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv91._540_say)
end
end
end
end
when 3690.kill or 3691.kill begin
if number(1,300) == 1 then
pc.give_item2(31019, 1)
notice_multiline(gameforge.main_quest_lv91._550_1_notice,notice)
notice_multiline(gameforge.main_quest_lv91._550_2_notice,notice)
end
end
end
-----------------<5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ-----------------
-----------------<5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ-----------------
-----------------<5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ-----------------
-----------------<5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ-----------------
-----------------<5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ-----------------
-----------------<5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ-----------------
-----------------<5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ-----------------
-----------------<5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ-----------------
-----------------<5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ-----------------
-----------------<5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ-----------------
-----------------<5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ-----------------
state state5_1 begin
when letter begin
send_letter(gameforge.main_quest_lv91._560_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv91._560_sendLetter)
say(gameforge.main_quest_lv91._570_say)
end
when 20378.chat.gameforge.main_quest_lv91._560_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv91._580_say)
wait()
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv91._590_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv91._600_say)
wait()
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv91._610_say)
set_state (state5_2)
end
end
state state5_2 begin
when letter begin
send_letter(gameforge.main_quest_lv91._560_sendLetter)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv91._620_sayTitle)
say(gameforge.main_quest_lv91._630_say)
say_item_vnum(31020)
-- say()
-- say_reward(locale.main_quest_lv91.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
when 20382.click begin
if pc.count_item(31020) < 1 then
pc.give_item2(31020, 1)
notice_multiline(gameforge.main_quest_lv91._640_1_notice,notice)
set_state (state5_3)
end
end
when 20380.chat.gameforge.main_quest_lv91._560_sendLetter with pc.count_item(31020) >= 1 begin
target.delete("__TARGET__")
pc.remove_item(31020, pc.count_item(31020))
say_title(mob_name(20380))
say(gameforge.main_quest_lv91._650_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv91._660_say)
wait()
say_title(mob_name(20380))
say(gameforge.main_quest_lv91._670_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 6766050))
--say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 0))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(30045),2,locale.count_postfix))
say("")
say_title(gameforge.main_quest_lv91._780_say)
pc.give_exp2(6766050)
--pc.change_money(0)
pc.give_item2(30045, 2)
clear_letter()
set_quest_state ("main_quest_lv92", "state0")
set_state (__COMPLETE__)
end
end
-- <20><><EFBFBD><EFBFBD>Ʈ <20>Ϸ<EFBFBD>
state state5_3 begin
when letter begin
send_letter(gameforge.main_quest_lv91._560_sendLetter)
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_lv91._560_sendLetter)
say(gameforge.main_quest_lv91._680_say)
end
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>н<EFBFBD> <20><><EFBFBD><EFBFBD>.
when 20382.click begin
if pc.count_item(31020) < 1 then
pc.give_item2(31020, 1)
notice_multiline(gameforge.main_quest_lv91._640_1_notice,notice)
end
end
when 20380.chat.gameforge.main_quest_lv91._560_sendLetter with pc.count_item(31020) >= 1 begin
target.delete("__TARGET__")
pc.remove_item(31020, pc.count_item(31020))
say_title(mob_name(20380))
say(gameforge.main_quest_lv91._650_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv91._660_say)
wait()
say_title(mob_name(20380))
say(gameforge.main_quest_lv91._670_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 6766050))
--say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 0))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(30045),2,locale.count_postfix))
say("")
say_title(gameforge.main_quest_lv91._780_say)
pc.give_exp2(6766050)
--pc.change_money(0)
pc.give_item2(30045, 2)
clear_letter()
set_quest_state ("main_quest_lv92", "state0")
set_state (__COMPLETE__)
end
end
state __COMPLETE__ begin
when enter begin
q.done()
end
end
end

View File

@ -1,699 +0,0 @@
quest main_quest_lv92 begin
state start begin
end
state state0 begin
when login or levelup or enter with pc.level >= 92 begin
set_state (state1_1)
end
end
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-2------------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-2------------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-2------------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-2------------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-2------------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-2------------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-2------------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-2------------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-2------------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-2------------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>ƶ<EFBFBD>!1-2------------------------------------
state state1_1 begin
when letter begin
send_letter(gameforge.main_quest_lv92._010_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv92._010_sendLetter)
say(gameforge.main_quest_lv92._020_say)
end
when 20378.chat.gameforge.main_quest_lv92._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378))
say(gameforge.main_quest_lv92._030_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv92._040_say)
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv92._050_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv92._060_say)
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv92._070_say)
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv92._080_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv92._090_say)
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv92._100_say)
set_state (state1_2)
q.set_counter_value(4)
end
end
--<2D><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>--
state state1_2 begin
when letter begin
send_letter(gameforge.main_quest_lv92._010_sendLetter)
local remain_item = 4 - pc.count_item(31010)
if remain_item <= 0 then
remain_item = 0
end
q.set_counter_name("<22><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>")
q.set_counter_value(remain_item)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv92._110_sayTitle)
say(gameforge.main_quest_lv92._120_say)
say_item_vnum(31010)
say(gameforge.main_quest_lv90._1180_say)
local remain_item = 4 - pc.count_item(31010)
if remain_item <= 0 then
remain_item = 0
end
q.set_counter_value(remain_item)
say_reward(string.format("%s: %d %s",item_name(31010),remain_item,locale.count_postfix))
-- say()
-- say_reward(locale.main_quest_lv92.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
--Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>--
when 20378.chat.gameforge.main_quest_lv92._010_sendLetter begin
if pc.count_item(31010) >= 4 then
pc.remove_item ( 31010, pc.count_item(31010))
say_title(mob_name(20378))
say(gameforge.main_quest_lv92._160_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 33874000))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 200000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(50817),10,locale.count_postfix))
say("")
pc.give_exp2(33874000)
pc.change_money(200000)
pc.give_item2(50817, 10)
set_state (state2_1)
else
say_title(mob_name(20378))
say(gameforge.main_quest_lv92._130_say)
set_state (state1_2)
end
end
when 3504.kill or 3505.kill begin
if number(1,500) == 1 then
if pc.count_item(31010) < 4 then
pc.give_item2(31010, 1)
--<2D><><EFBFBD><EFBFBD>Ʈ <20>޴<EFBFBD> â ī<><C4AB>Ʈ
local remain_item = 4 - pc.count_item(31010)
if remain_item <= 0 then
remain_item = 0
end
q.set_counter_value(remain_item)
if pc.count_item(31010) >= 4 then
notice_multiline(gameforge.main_quest_lv92._140_1_notice,notice)
notice_multiline(gameforge.main_quest_lv92._140_2_notice,notice)
set_state (state1_3)
end
end
end
end
end
state state1_3 begin
when letter begin
q.set_counter_name("")
send_letter(gameforge.main_quest_lv92._010_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv92._010_sendLetter)
say(gameforge.main_quest_lv92._150_say)
end
-- <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>κ<EFBFBD>.
when 3504.kill or 3505.kill begin
if number(1,500) == 1 then
if pc.count_item(31010) < 4 then
pc.give_item2(31010, 1)
--<2D><><EFBFBD><EFBFBD>Ʈ <20>޴<EFBFBD> â ī<><C4AB>Ʈ
local remain_item = 4 - pc.count_item(31010)
if remain_item <= 0 then
remain_item = 0
end
q.set_counter_value(remain_item)
if pc.count_item(31010) >= 4 then
notice_multiline(gameforge.main_quest_lv92._140_1_notice,notice)
notice_multiline(gameforge.main_quest_lv92._140_2_notice,notice)
end
end
end
end
when 20378.chat.gameforge.main_quest_lv92._010_sendLetter begin
target.delete("__TARGET__")
if pc.count_item(31010) >= 4 then
pc.remove_item ( 31010, pc.count_item(31010))
say_title(mob_name(20378))
say(gameforge.main_quest_lv92._160_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 33874000))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 200000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(50817),10,locale.count_postfix))
say("")
pc.give_exp2(33874000)
pc.change_money(200000)
pc.give_item2(50817, 10)
set_state (state2_1)
else
say_title(mob_name(20378))
say(gameforge.main_quest_lv92._130_say)
set_state (state1_2)
end
end
end
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
state state2_1 begin
when letter begin
q.set_counter_name("")
send_letter(gameforge.main_quest_lv92._170_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv92._170_sendLetter)
say(gameforge.main_quest_lv92._180_say)
end
when 20378.chat.gameforge.main_quest_lv92._170_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378))
say(gameforge.main_quest_lv92._190_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv92._200_say)
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv92._210_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv92._220_say)
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv92._230_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv92._240_say)
set_state (state2_2)
end
end
--<2D><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>--
state state2_2 begin
when letter begin
send_letter(gameforge.main_quest_lv92._170_sendLetter)
local v = find_npc_by_vnum(20379)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20379))
end
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv92._250_sayTitle)
say(gameforge.main_quest_lv92._260_say)
say_item_vnum(31010)
-- say()
-- say_reward(locale.main_quest_lv92.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
--Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>--
when 20378.chat.gameforge.main_quest_lv92._170_sendLetter begin
say_title(mob_name(20378))
say(gameforge.main_quest_lv92._270_say)
end
when 20379.chat.gameforge.main_quest_lv92._170_sendLetter begin
say_title(mob_name(20379))
say(gameforge.main_quest_lv92._280_say)
notice_multiline(gameforge.main_quest_lv92._290_1_notice,notice)
notice_multiline(gameforge.main_quest_lv92._290_2_notice,notice)
pc.give_item2(31010, 1)
set_state (state2_3)
end
end
state state2_3 begin
when letter begin
send_letter(gameforge.main_quest_lv92._170_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv92._170_sendLetter)
say(gameforge.main_quest_lv92._360_say)
end
when 20378.chat.gameforge.main_quest_lv92._170_sendLetter begin
target.delete("__TARGET__")
if pc.count_item(31010) >= 1 then
pc.remove_item ( 31010, pc.count_item(31010))
say_title(mob_name(20378))
say(gameforge.main_quest_lv92._300_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv92._310_say)
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv92._320_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv92._330_say)
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv92._340_say)
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv92._350_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 20874600))
--say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 0))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(30047),2,locale.count_postfix))
say("")
pc.give_exp2(20874600)
--pc.change_money(0)
pc.give_item2(30047, 2)
set_state (state3_1)
else
say_title(mob_name(20378))
say(gameforge.main_quest_lv92._270_say)
set_state (state2_2)
end
end
end
------------------------------------<2D><><EFBFBD><EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>° <20><><EFBFBD><EFBFBD> <20>ǵ<EFBFBD>1-1------------------------------------
state state3_1 begin
when letter begin
send_letter(gameforge.main_quest_lv92._370_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv92._370_sendLetter)
say(gameforge.main_quest_lv92._380_say)
end
when 20378.chat.gameforge.main_quest_lv92._370_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv92._390_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv92._400_say)
set_state (state3_2)
end
end
state state3_2 begin
when letter begin
send_letter(gameforge.main_quest_lv92._370_sendLetter)
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_lv92._370_sendLetter)
say(gameforge.main_quest_lv92._410_say)
end
when 20380.chat.gameforge.main_quest_lv92._370_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv92._420_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv92._430_say)
wait()
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv92._440_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv92._450_say)
wait()
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv92._460_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv92._470_say)
wait()
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv92._480_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv92._490_say)
set_state (state3_3)
end
end
state state3_3 begin
when letter begin
q.set_counter_name("<22><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>")
send_letter(gameforge.main_quest_lv92._370_sendLetter)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv92._500_sayTitle)
say(gameforge.main_quest_lv92._510_say)
say_item_vnum(31022)
say(gameforge.main_quest_lv90._1180_say)
local remain_item = 10 - pc.count_item(31022)
if remain_item <= 0 then
remain_item = 0
end
q.set_counter_value(remain_item)
say_reward(string.format("%s: %d %s",item_name(31022),remain_item,locale.count_postfix))
-- say()
-- say_reward(locale.main_quest_lv92.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
--Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>--
when 20380.chat.gameforge.main_quest_lv92._370_sendLetter begin
if pc.count_item(31022) >= 10 then
pc.remove_item ( 31022, pc.count_item(31022))
say_title(mob_name(20380))
say(gameforge.main_quest_lv92._540_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 34874000))
--say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 0))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(27992),2,locale.count_postfix))
say("")
pc.give_exp2(34874000)
--pc.change_money(0)
pc.give_item2(27992, 1)
pc.give_item2(27992, 1)
set_state (state4_1)
else
say_title(mob_name(20380))
say(gameforge.main_quest_lv92._520_say)
end
end
when 3490.kill or 3491.kill begin
if number(1,500) == 1 then
if pc.count_item(31022) < 10 then
pc.give_item2(31022, 1)
local remain_item = 10 - pc.count_item(31022)
if remain_item <= 0 then
remain_item = 0
end
q.set_counter_value(remain_item)
if pc.count_item(31022) >= 10 then
notice_multiline(gameforge.main_quest_lv92._530_1_notice,notice)
notice_multiline(gameforge.main_quest_lv92._530_2_notice,notice)
set_state (state3_4)
end
end
end
end
end
state state3_4 begin
when letter begin
q.set_counter_name("")
send_letter(gameforge.main_quest_lv92._370_sendLetter)
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_lv92._370_sendLetter)
say(gameforge.main_quest_lv92._550_say)
end
-- <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>κ<EFBFBD>.
when 3490.kill or 3491.kill begin
if number(1,500) == 1 then
if pc.count_item(31022) < 10 then
pc.give_item2(31022, 1)
if pc.count_item(31022) >= 10 then
notice_multiline(gameforge.main_quest_lv92._530_1_notice,notice)
notice_multiline(gameforge.main_quest_lv92._530_2_notice,notice)
end
end
end
end
when 20380.chat.gameforge.main_quest_lv92._370_sendLetter begin
target.delete("__TARGET__")
if pc.count_item(31022) >= 10 then
pc.remove_item ( 31022, pc.count_item(31022))
say_title(mob_name(20380))
say(gameforge.main_quest_lv92._540_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 34874000))
--say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 0))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(27992),2,locale.count_postfix))
say("")
pc.give_exp2(34874000)
--pc.change_money(0)
pc.give_item2(27992, 1)
pc.give_item2(27992, 1)
set_state (state4_1)
else
say_title(mob_name(20380))
say(gameforge.main_quest_lv92._520_say)
set_state (state3_3)
end
end
end
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>-----------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>-----------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>-----------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>-----------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>-----------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>-----------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>-----------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>-----------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>-----------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>-----------------------------------
------------------------------------<2D>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>-----------------------------------
state state4_1 begin
when letter begin
send_letter(gameforge.main_quest_lv92._560_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv92._560_sendLetter)
say(gameforge.main_quest_lv92._570_say)
end
when 20378.chat.gameforge.main_quest_lv92._560_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv92._580_say)
wait()
say(gameforge.main_quest_lv92._590_say)
wait()
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv92._600_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 24911280))
--say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 0))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(27993),2,locale.count_postfix))
say("")
say_title(gameforge.main_quest_lv92._610_say)
pc.give_exp2(24911280)
--pc.change_money(0)
pc.give_item2(27993, 1)
pc.give_item2(27993, 1)
clear_letter()
set_quest_state ("main_quest_lv93", "state0")
set_state (__COMPLETE__)
end
end
state __COMPLETE__ begin
when enter begin
q.done()
end
end
end

View File

@ -1,715 +0,0 @@
quest main_quest_lv93 begin
state start begin
end
state state0 begin
when login or levelup or enter with pc.level >= 93 begin
set_state (state1_1)
end
end
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-1------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-1------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-1------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-1------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-1------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-1------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-1------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-1------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-1------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-1------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-1------------------------------------
state state1_1 begin
when letter begin
send_letter(gameforge.main_quest_lv93._010_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv93._010_sendLetter)
say(gameforge.main_quest_lv93._020_say)
end
when 20378.chat.gameforge.main_quest_lv93._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378))
say(gameforge.main_quest_lv93._030_say)
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv93._040_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv93._050_say)
set_state (state1_2)
end
end
state state1_2 begin
when letter begin
send_letter(gameforge.main_quest_lv93._010_sendLetter)
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_lv93._010_sendLetter)
say(gameforge.main_quest_lv93._130_say)
end
when 20380.chat.gameforge.main_quest_lv93._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20380))
say(gameforge.main_quest_lv93._060_say)
wait()
say_title(mob_name(20380))
say(gameforge.main_quest_lv93._070_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv93._080_say)
set_state (state1_3)
end
end
--<2D><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>--
state state1_3 begin
when letter begin
send_letter(gameforge.main_quest_lv93._010_sendLetter)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv93._090_sayTitle)
say(gameforge.main_quest_lv93._100_say)
say_item_vnum(31029)
-- say()
-- say_reward(locale.main_quest_lv93.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
--Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>--
when 20380.chat.gameforge.main_quest_lv93._010_sendLetter begin
say_title(mob_name(20380))
say(gameforge.main_quest_lv93._110_say)
end
when 3191.kill begin
if number(1,1000) == 1 then
if pc.count_item(31029) < 1 then
pc.give_item2(31029, 1)
if pc.count_item(31029) >= 1 then
notice_multiline(gameforge.main_quest_lv93._120_1_notice,notice)
set_state (state1_4)
end
end
end
end
end
state state1_4 begin
when letter begin
send_letter(gameforge.main_quest_lv93._010_sendLetter)
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_lv93._010_sendLetter)
say(gameforge.main_quest_lv93._130_say)
end
-- <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>κ<EFBFBD>.
when 3191.kill begin
if number(1,1000) == 1 then
if pc.count_item(31029) < 1 then
pc.give_item2(31029, 1)
if pc.count_item(31029) >= 1 then
notice_multiline(gameforge.main_quest_lv93._120_1_notice,notice)
set_state (state1_4)
end
end
end
end
when 20380.chat.gameforge.main_quest_lv93._010_sendLetter begin
target.delete("__TARGET__")
if pc.count_item(31029) >= 1 then
pc.remove_item ( 31029, pc.count_item(31029))
say_title(mob_name(20380))
say(gameforge.main_quest_lv93._140_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 27874422))
--say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 0))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(27994),1,locale.count_postfix))
say("")
pc.give_exp2(27874422)
--pc.change_money(0)
pc.give_item2(27994, 1)
set_state (state2_1)
else
say_title(mob_name(20380))
say(gameforge.main_quest_lv93._110_say)
set_state (state1_3)
end
end
end
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-2------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-2------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-2------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-2------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-2------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-2------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-2------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-2------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-2------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-2------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-2------------------------------------
state state2_1 begin
when letter begin
send_letter(gameforge.main_quest_lv93._150_sendLetter)
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_lv93._150_sendLetter)
say(gameforge.main_quest_lv93._160_say)
end
when 20380.chat.gameforge.main_quest_lv93._150_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20380))
say(gameforge.main_quest_lv93._170_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv93._180_say)
set_state (state2_2)
end
end
--<2D><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>--
state state2_2 begin
when letter begin
send_letter(gameforge.main_quest_lv93._150_sendLetter)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv93._190_sayTitle)
say(gameforge.main_quest_lv93._200_say)
say_item_vnum(31030)
-- say()
-- say_reward(locale.main_quest_lv93.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
--Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>--
when 20380.chat.gameforge.main_quest_lv93._150_sendLetter begin
say_title(mob_name(20380))
say(gameforge.main_quest_lv93._210_say)
end
when 3791.kill begin
if number(1,1000) == 1 then
if pc.count_item(31030) < 1 then
pc.give_item2(31030, 1)
if pc.count_item(31030) >= 1 then
notice_multiline(gameforge.main_quest_lv93._220_1_notice,notice)
notice_multiline(gameforge.main_quest_lv93._220_2_notice,notice)
set_state (state2_3)
end
end
end
end
end
state state2_3 begin
when letter begin
send_letter(gameforge.main_quest_lv93._150_sendLetter)
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_lv93._150_sendLetter)
say(gameforge.main_quest_lv93._230_say)
end
-- <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>κ<EFBFBD>.
when 3791.kill begin
if number(1,1000) == 1 then
if pc.count_item(31030) < 1 then
pc.give_item2(31030, 1)
if pc.count_item(31030) >= 1 then
notice_multiline(gameforge.main_quest_lv93._220_1_notice,notice)
notice_multiline(gameforge.main_quest_lv93._220_2_notice,notice)
set_state (state2_3)
end
end
end
end
when 20380.chat.gameforge.main_quest_lv93._150_sendLetter begin
target.delete("__TARGET__")
if pc.count_item(31030) >= 1 then
pc.remove_item ( 31030, pc.count_item(31030))
say_title(mob_name(20380))
say(gameforge.main_quest_lv93._240_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 28914020))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 302000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(30048),1,locale.count_postfix))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(50819),10,locale.count_postfix))
say("")
pc.give_exp2(28914020)
pc.change_money(302000)
pc.give_item2(30048, 1)
pc.give_item2(50819, 10)
set_state (state3_1)
else
say_title(mob_name(20380))
say(gameforge.main_quest_lv93._210_say)
set_state (state2_2)
end
end
end
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-3------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-3------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-3------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-3------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-3------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-3------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-3------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-3------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-3------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-3------------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-3------------------------------------
state state3_1 begin
when letter begin
send_letter(gameforge.main_quest_lv93._250_sendLetter)
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_lv93._250_sendLetter)
say(gameforge.main_quest_lv93._260_say)
end
when 20380.chat.gameforge.main_quest_lv93._250_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv93._270_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv93._280_say)
wait()
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv93._290_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv93._300_say)
set_state (state3_2)
end
end
state state3_2 begin
when letter begin
send_letter(gameforge.main_quest_lv93._250_sendLetter)
local v = find_npc_by_vnum(20008)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20008))
end
end
when button or info begin
say_title(gameforge.main_quest_lv93._310_sayTitle)
say(gameforge.main_quest_lv93._320_say)
end
when 20008.chat.gameforge.main_quest_lv93._250_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20008))
say(gameforge.main_quest_lv93._330_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv93._340_say)
wait()
say_title(mob_name(20008))
say(gameforge.main_quest_lv93._350_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv93._360_say)
wait()
say_title(mob_name(20008))
say(gameforge.main_quest_lv93._370_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 17904600))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 30000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(71094),1,locale.count_postfix))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(72024),1,locale.count_postfix))
say("")
pc.give_exp2(17904600)
pc.change_money(30000)
pc.give_item2(71094, 1)
pc.give_item2_select(72024)
set_state (state3_3)
clear_letter()
local cur_t = get_global_time()
pc.setf("main_quest_lv93","ockgu_access_time",cur_t)
end
end
state state3_3 begin
when login with get_global_time() - pc.getf("main_quest_lv93","ockgu_access_time") >= 24*60*60 begin
set_state (state4_1)
end
when 20008.chat.gameforge.main_quest_lv93._400_npcChat begin
if get_global_time() - pc.getf("main_quest_lv93","ockgu_access_time") >= 24*60*60 then
set_state (state4_1)
else
say_title(mob_name(20008))
say(gameforge.main_quest_lv93._390_say)
end
end
end
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-4-----------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-4-----------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-4-----------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-4-----------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-4-----------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-4-----------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-4-----------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-4-----------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-4-----------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-4-----------------------------------
------------------------------------<2D><><EFBFBD>°<EFBFBD>ȭ1-4-----------------------------------
state state4_1 begin
when letter begin
send_letter(gameforge.main_quest_lv93._400_npcChat)
local v = find_npc_by_vnum(20008)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20008))
end
end
when button or info begin
say_title(gameforge.main_quest_lv93._400_npcChat)
say(gameforge.main_quest_lv93._410_say)
end
when 20008.chat.gameforge.main_quest_lv93._400_npcChat begin
target.delete("__TARGET__")
say_title(mob_name(20008 ))
say(gameforge.main_quest_lv93._420_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv93._430_say)
wait()
say_title(mob_name(20008 ))
say(gameforge.main_quest_lv93._440_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv93._450_say)
wait()
say_title(mob_name(20008 ))
say(gameforge.main_quest_lv93._460_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv93._470_say)
wait()
say_title(mob_name(20008 ))
say(gameforge.main_quest_lv93._480_say)
set_state (state4_2)
end
end
-- <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> --
state state4_2 begin
when letter begin
send_letter(gameforge.main_quest_lv93._400_npcChat)
q.set_counter_name(gameforge.main_quest_lv94._1080_say)
end
when button or info begin
say_title(gameforge.main_quest_lv93._490_sayTitle)
say(gameforge.main_quest_lv93._500_say)
say_item_vnum_inline(50724,0,3)
say_item_vnum_inline(50726,1,3)
say_item_vnum_inline(50707,2,3)
local remain1 = 200 - pc.count_item(50724)
local remain2 = 200 - pc.count_item(50726)
local remain3 = 200 - pc.count_item(50707)
if remain1 < 0 then
remain1 = 0
end
if remain2 < 0 then
remain2 = 0
end
if remain3 < 0 then
remain3 = 0
end
say(string.format(gameforge.main_quest_lv93._630_say,item_name(50724) ,remain1,item_name(50726) ,remain2,item_name(50707) , remain3))
q.set_counter_value(remain1 + remain2 + remain3)
if remain1 + remain2 + remain3 == 0 then
notice_multiline(gameforge.main_quest_lv93._650_1_notice,notice)
notice_multiline(gameforge.main_quest_lv93._650_2_notice,notice)
end
end
--[[
when 50724.pick or 50724.take or 50726.pick or 50726.take or 50707.pick or 50707.take begin
local remain1 = 200 - pc.count_item(50724)
local remain2 = 200 - pc.count_item(50726)
local remain3 = 200 - pc.count_item(50707)
if remain1 < 0 then
remain1 = 0
end
if remain2 < 0 then
remain2 = 0
end
if remain3 < 0 then
remain3 = 0
end
q.set_counter_value(remain1 + remain2 + remain3)
end
]]--
when 20008.chat.gameforge.main_quest_lv93._400_npcChat begin
if pc.count_item(50724) >= 200 and pc.count_item(50726) >= 200 and pc.count_item(50707) >= 200 then
pc.remove_item ( 50724,200)
pc.remove_item ( 50726,200)
pc.remove_item ( 50707,200)
say_title(mob_name(20008 ))
say(gameforge.main_quest_lv93._520_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv93._530_say)
set_state (state4_3)
clear_letter()
local cur_t = get_global_time()
pc.setf("main_quest_lv93","item4_make_start_time",cur_t)
else
say_title(mob_name(20008 ))
say(gameforge.main_quest_lv93._640_say)
end
end
end
state state4_3 begin
when login with get_global_time() - pc.getf("main_quest_lv93","item4_make_start_time") >= 24*60*60 begin
set_state (state4_4)
q.set_counter_name("")
end
when 20008.chat.gameforge.main_quest_lv93._400_npcChat begin
say_title(mob_name(20008 ))
say(gameforge.main_quest_lv93._540_say)
end
end
state state4_4 begin
when letter begin
send_letter(gameforge.main_quest_lv93._400_npcChat)
local v = find_npc_by_vnum(20008)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20008))
end
end
when button or info begin
say_title(gameforge.main_quest_lv93._400_npcChat)
say(gameforge.main_quest_lv93._550_say)
end
when 20008.chat.gameforge.main_quest_lv93._400_npcChat begin
target.delete("__TARGET__")
say_title(mob_name(20008 ))
say(gameforge.main_quest_lv93._560_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv93._570_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 31374000))
--say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 0))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(31031),1,locale.count_postfix))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(50706),20,locale.count_postfix))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(72301),5,locale.count_postfix))
say("")
pc.give_exp2(31374000)
--pc.change_money(0)
pc.give_item2(31031, 1)
pc.give_item2(50706, 20)
pc.give_item2(72301, 1)
pc.give_item2(72301, 1)
pc.give_item2(72301, 1)
pc.give_item2(72301, 1)
pc.give_item2(72301, 1)
set_state (state5_1)
end
end
------------------------------------<2D>ž<EFBFBD> <20><><EFBFBD><EFBFBD>1-1-----------------------------------
------------------------------------<2D>ž<EFBFBD> <20><><EFBFBD><EFBFBD>1-1-----------------------------------
------------------------------------<2D>ž<EFBFBD> <20><><EFBFBD><EFBFBD>1-1-----------------------------------
------------------------------------<2D>ž<EFBFBD> <20><><EFBFBD><EFBFBD>1-1-----------------------------------
------------------------------------<2D>ž<EFBFBD> <20><><EFBFBD><EFBFBD>1-1-----------------------------------
------------------------------------<2D>ž<EFBFBD> <20><><EFBFBD><EFBFBD>1-1-----------------------------------
------------------------------------<2D>ž<EFBFBD> <20><><EFBFBD><EFBFBD>1-1-----------------------------------
------------------------------------<2D>ž<EFBFBD> <20><><EFBFBD><EFBFBD>1-1-----------------------------------
------------------------------------<2D>ž<EFBFBD> <20><><EFBFBD><EFBFBD>1-1-----------------------------------
------------------------------------<2D>ž<EFBFBD> <20><><EFBFBD><EFBFBD>1-1-----------------------------------
------------------------------------<2D>ž<EFBFBD> <20><><EFBFBD><EFBFBD>1-1-----------------------------------
state state5_1 begin
when letter begin
send_letter(gameforge.main_quest_lv93._580_sendLetter)
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_lv93._580_sendLetter)
say(gameforge.main_quest_lv93._590_say)
end
when 20380.chat.gameforge.main_quest_lv93._580_sendLetter begin
target.delete("__TARGET__")
pc.remove_item(31031,pc.count_item(31031))
say_title(mob_name( 20380))
say(gameforge.main_quest_lv93._600_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv93._610_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 19920820))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 335000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(72723),1,locale.count_postfix))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(70050),1,locale.count_postfix))
say("")
say_title(gameforge.main_quest_lv93._620_say)
pc.give_exp2(19920820)
pc.change_money(335000)
pc.give_item2(72723, 1)
pc.give_item2_select(70050)
item.set_socket(2, 120)
clear_letter()
set_quest_state ("main_quest_lv94", "state0")
set_state (__COMPLETE__)
end
end
state __COMPLETE__ begin
when enter begin
q.done()
end
end
end

File diff suppressed because it is too large Load Diff

View File

@ -1,731 +0,0 @@
quest main_quest_lv95 begin
state start begin
end
state state0 begin
when login or levelup or enter with pc.level >= 95 begin
set_state (state1_1)
end
end
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ſ<EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ſ<EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ſ<EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ſ<EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ſ<EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ſ<EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ſ<EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ſ<EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ſ<EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ſ<EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ſ<EFBFBD>------------------------------------
state state1_1 begin
when letter begin
send_letter(gameforge.main_quest_lv95._010_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv95._010_sendLetter)
say(gameforge.main_quest_lv95._020_say)
end
when 20378.chat.gameforge.main_quest_lv95._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378))
say(gameforge.main_quest_lv95._030_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv95._040_say)
wait()
set_state (state1_2)
end
end
--<2D><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>--
state state1_2 begin
when letter begin
send_letter(gameforge.main_quest_lv95._010_sendLetter)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv95._070_sayTitle)
say(gameforge.main_quest_lv95._080_say)
--say_item_vnum(31015)
-- say()
-- say_reward(locale.main_quest_lv95.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
--Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ƿԴ<C6BF>.--
when 20378.chat.gameforge.main_quest_lv95._010_sendLetter begin
say_title(mob_name(20378))
say(gameforge.main_quest_lv95._090_say)
say("")
end
when 3904.kill begin
if pc.count_item(31015) < 1 then
pc.give_item2 ( 31015, 1 )
notice_multiline(gameforge.main_quest_lv95._100_1_notice,notice)
notice_multiline(gameforge.main_quest_lv95._100_2_notice,notice)
notice_multiline(gameforge.main_quest_lv95._750_say,notice)
set_state (state1_3)
end
end
end
state state1_3 begin
when letter begin
send_letter(gameforge.main_quest_lv95._010_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv95._010_sendLetter)
say(gameforge.main_quest_lv95._110_say)
end
-- <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>κ<EFBFBD>.
when 3904.kill begin
if pc.count_item(31015) < 1 then
pc.give_item2 ( 31015, 1 )
notice_multiline(gameforge.main_quest_lv95._100_1_notice,notice)
notice_multiline(gameforge.main_quest_lv95._100_2_notice,notice)
notice_multiline(gameforge.main_quest_lv95._750_say,notice)
end
end
when 20378.chat.gameforge.main_quest_lv95._010_sendLetter begin
target.delete("__TARGET__")
if pc.count_item(31015) >= 1 then
pc.remove_item ( 31015, pc.count_item(31015))
say_title(mob_name(20378))
say(gameforge.main_quest_lv95._120_say)
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv95._140_say)
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv95._150_say)
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv95._170_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 27532396))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 302000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(27994),1,locale.count_postfix))
say("")
pc.give_exp2(27532396)
pc.change_money(302000)
pc.give_item2(27994, 1)
set_state (state2_1)
else --<2D>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Դ<EFBFBD>.
say_title(mob_name(20378))
say(gameforge.main_quest_lv95._090_say)
say("")
set_state (state1_2)
end
end
end
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
state state2_1 begin
when letter begin
send_letter(gameforge.main_quest_lv95._180_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv95._180_sendLetter)
say(gameforge.main_quest_lv95._190_say)
end
when 20378.chat.gameforge.main_quest_lv95._180_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378))
say(gameforge.main_quest_lv95._200_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv95._220_say)
set_state (state2_2)
end
end
state state2_2 begin
when letter begin
send_letter(gameforge.main_quest_lv95._180_sendLetter)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv95._230_sayTitle)
say(gameforge.main_quest_lv95._240_say)
say_item_vnum(31037)
-- say()
-- say_reward(locale.main_quest_lv95.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
--Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>--
when 20378.chat.gameforge.main_quest_lv95._180_sendLetter begin
say_title(mob_name(20378))
say(gameforge.main_quest_lv95._250_say)
end
when 3890.kill begin
if pc.count_item(31037) < 1 then
if number (1,5) == 1 then
if pc.count_item(31037) < 1 then
pc.give_item2 ( 31037, 1 )
end
notice_multiline(gameforge.main_quest_lv95._260_1_notice,notice)
notice_multiline(gameforge.main_quest_lv95._260_2_notice,notice)
set_state (state2_3)
end
end
end
end
state state2_3 begin
when letter begin
send_letter(gameforge.main_quest_lv95._180_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv95._180_sendLetter)
say(gameforge.main_quest_lv95._270_say)
end
-- <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>κ<EFBFBD>.
when 3890.kill begin
if pc.count_item(31037) < 1 then
if number (1,5) == 1 then
if pc.count_item(31037) < 1 then
pc.give_item2 ( 31037, 1 )
end
notice_multiline(gameforge.main_quest_lv95._260_1_notice,notice)
notice_multiline(gameforge.main_quest_lv95._260_2_notice,notice)
end
end
end
when 20378.chat.gameforge.main_quest_lv95._180_sendLetter begin
target.delete("__TARGET__")
if pc.count_item(31037) >= 1 then
pc.remove_item ( 31037, pc.count_item(31037))
say_title(mob_name(20378))
say(gameforge.main_quest_lv95._280_say)
wait()
say(gameforge.main_quest_lv95._290_say)
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv95._300_say)
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv95._310_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 29032586))
--say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 0))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(30048),1,locale.count_postfix))
say("")
pc.give_exp2(29032586)
--pc.change_money(0)
pc.give_item2(30048, 1)
set_state (state3_1)
else -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
say_title(mob_name(20378))
say(gameforge.main_quest_lv95._250_say)
set_state (state2_2)
end
end
end
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
------------------------------------<2D><><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>------------------------------------
state state3_1 begin
when letter begin
send_letter(gameforge.main_quest_lv95._320_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv95._320_sendLetter)
say(gameforge.main_quest_lv95._330_say)
end
when 20378.chat.gameforge.main_quest_lv95._320_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv95._340_say)
wait()
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv95._350_say)
set_state (state3_2)
end
end
state state3_2 begin
when letter begin
send_letter(gameforge.main_quest_lv95._320_sendLetter)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv95._370_sayTitle)
say(gameforge.main_quest_lv95._380_say)
-- say()
-- say_reward(locale.main_quest_lv95.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
--Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>--
when 20378.chat.gameforge.main_quest_lv95._320_sendLetter begin
say_title(mob_name(20378))
say(gameforge.main_quest_lv95._390_say)
end
when 3891.kill begin
notice_multiline(gameforge.main_quest_lv95._400_notice,notice)
say(gameforge.main_quest_lv95._410_say)
wait()
say(gameforge.main_quest_lv95._420_say)
set_state (state3_3)
end
end
state state3_3 begin
when letter begin
send_letter(gameforge.main_quest_lv95._320_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv95._320_sendLetter)
say(gameforge.main_quest_lv95._430_say)
end
when 20378.chat.gameforge.main_quest_lv95._320_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378))
say(gameforge.main_quest_lv95._440_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv95._450_say)
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv95._460_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 33003907))
--say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 0))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(71094),1,locale.count_postfix))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(72024),1,locale.count_postfix))
say("")
pc.give_exp2(33003907)
--pc.change_money(0)
pc.give_item2(71094, 1)
pc.give_item2_select(72024)
item.set_socket(2, 180)
set_state (state4_1)
end
end
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-1-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-1-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-1-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-1-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-1-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-1-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-1-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-1-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-1-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-1-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-1-----------------------------------
state state4_1 begin
when letter begin
send_letter(gameforge.main_quest_lv95._470_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv95._470_sendLetter)
say(gameforge.main_quest_lv95._480_say)
end
when 20378.chat.gameforge.main_quest_lv95._470_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv95._490_say)
wait()
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv95._510_say)
wait()
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv95._520_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv95._530_say)
set_state (state4_2)
end
end
-- <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> --
state state4_2 begin
when letter begin
send_letter(gameforge.main_quest_lv95._470_sendLetter)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv95._540_sayTitle)
say(gameforge.main_quest_lv95._550_say)
say_item_vnum(31043)
-- say()
-- say_reward(locale.main_quest_lv95.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
-- Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC> --
when 20378.chat.gameforge.main_quest_lv95._470_sendLetter begin
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv95._560_say)
end
when 3303.kill begin
if pc.count_item(31043) < 1 then
if number (1,5) == 1 then
pc.give_item2 ( 31043, 1 )
notice_multiline(gameforge.main_quest_lv95._570_1_notice,notice)
notice_multiline(gameforge.main_quest_lv95._570_2_notice,notice)
set_state (state4_3)
end
end
end
end
state state4_3 begin
when letter begin
send_letter(gameforge.main_quest_lv95._470_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv95._470_sendLetter)
say(gameforge.main_quest_lv95._580_say)
end
-- <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>κ<EFBFBD>.
when 3303.kill begin
if pc.count_item(31043) < 1 then
if number (1,5) == 1 then
pc.give_item2 ( 31043, 1 )
notice_multiline(gameforge.main_quest_lv95._570_1_notice,notice)
notice_multiline(gameforge.main_quest_lv95._570_2_notice,notice)
end
end
end
when 20378.chat.gameforge.main_quest_lv95._470_sendLetter begin
target.delete("__TARGET__")
if pc.count_item(31043) >= 1 then
pc.remove_item ( 31043, pc.count_item(31043))
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv95._590_say)
wait()
say_reward(gameforge.main_quest_lv95._600_sayReward)
wait()
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv95._610_say)
wait()
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv95._620_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 30943586))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 335000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(72301),5,locale.count_postfix))
say("")
pc.give_exp2(30943586)
pc.change_money(335000)
pc.give_item2(72301, 1)
pc.give_item2(72301, 1)
pc.give_item2(72301, 1)
pc.give_item2(72301, 1)
pc.give_item2(72301, 1)
set_state (state5_1)
else
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv95._560_say)
set_state (state4_2)
end
end
end
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-2-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-2-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-2-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-2-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-2-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-2-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-2-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-2-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-2-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-2-----------------------------------
------------------------------------õ<><C3B5><EFBFBD><EFBFBD> <20><>ȭ1-2-----------------------------------
-- <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> --
state state5_1 begin
when letter begin
send_letter(gameforge.main_quest_lv95._630_sendLetter)
q.set_counter_name(gameforge.main_quest_lv95._760_say)
end
when button or info begin
if pc.get_map_index() == 1 then
addmapsignal(500 * 100, 500 * 100)
addmapsignal(600 * 100, 500 * 100)
addmapsignal(700 * 100, 300 * 100)
end
say_title(gameforge.main_quest_lv95._640_sayTitle)
say(gameforge.main_quest_lv95._650_say)
say_item_vnum(31043)
say(gameforge.main_quest_lv95._760_say)
local remain = 2 - pc.count_item(31043)
if remain < 0 then
remain = 0
end
say_reward(string.format(gameforge.main_quest_lv95._770_sayReward,item_name(31043),remain))
q.set_counter_value(remain)
-- say()
-- say_reward(locale.main_quest_lv95.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
-- Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC> --
when 20378.chat.gameforge.main_quest_lv95._630_sendLetter begin
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv95._660_say)
end
when 3303.kill begin
if pc.count_item(31043) < 2 then
if number (1,4) == 1 then
pc.give_item2 ( 31043, 1 )
local remain = 2 - pc.count_item(31043)
if remain < 0 then
remain = 0
end
q.set_counter_value(remain)
if pc.count_item(31043) >= 2 then
set_state (state5_2)
end
end
end
end
end
state state5_2 begin
when letter begin
send_letter(gameforge.main_quest_lv95._630_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
q.set_counter_name("")
end
when button or info begin
say_title(gameforge.main_quest_lv95._630_sendLetter)
say(gameforge.main_quest_lv95._670_say)
end
-- <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>κ<EFBFBD>.
when 3303.kill begin
if pc.count_item(31043) < 2 then
if number (1,4) == 1 then
pc.give_item2 ( 31043, 1 )
end
end
end
when 20378.chat.gameforge.main_quest_lv95._630_sendLetter begin
target.delete("__TARGET__")
if pc.count_item(31043) >= 2 then
pc.remove_item ( 31043, pc.count_item(31043))
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv95._680_say)
wait()
say_reward(gameforge.main_quest_lv95._690_sayReward)
wait()
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv95._700_say)
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv95._710_say)
wait()
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv95._720_say)
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 31932545))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 337000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(72723),1,locale.count_postfix))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(70050),1,locale.count_postfix))
say("")
say_title(gameforge.main_quest_lv95._740_say)
pc.give_exp2(31932545)
pc.change_money(337000)
pc.give_item2(72723, 1)
pc.give_item2(70050, 1)
clear_letter()
set_quest_state ("main_quest_lv96", "state0")
set_state (__COMPLETE__)
else
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv95._660_say)
set_state (state5_1)
end
end
end
state __COMPLETE__ begin
when enter begin
q.done()
end
end
end

View File

@ -1,750 +0,0 @@
quest main_quest_lv96 begin
state start begin
end
state state0 begin
when login or levelup or enter with pc.level >= 96 begin
set_state (state1_1)
end
end
------------------------------------<2D><><EFBFBD>ɼ<EFBFBD> <20><><EFBFBD><EFBFBD>1-1------------------------------------
state state1_1 begin
when letter begin
send_letter(gameforge.main_quest_lv96._010_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv96._010_sendLetter)
say(gameforge.main_quest_lv96._020_say)
say("")
say("")
end
when 20378.chat.gameforge.main_quest_lv96._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378))
say(gameforge.main_quest_lv96._030_say)
say("")
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv96._060_say)
say("")
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv96._070_say)
say("")
set_state (state1_2)
end
end
--<2D><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>--
state state1_2 begin
when letter begin
send_letter(gameforge.main_quest_lv96._010_sendLetter)
q.set_counter_name(gameforge.main_quest_lv96._570_counterName)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv96._080_sayTitle)
say(gameforge.main_quest_lv96._090_say)
say("")
say_item_vnum(31038)
say(gameforge.main_quest_lv96._570_counterName)
local remain = 100 - pc.count_item(31038)
if remain < 0 then
remain = 0
end
q.set_counter_value(remain)
say_reward(string.format(gameforge.main_quest_lv60._210_sayReward,item_name(31038),remain))
-- say()
-- say_reward(locale.main_quest_lv96.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
--Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ƿԴ<C6BF>.--
when 20378.chat.gameforge.main_quest_lv96._010_sendLetter begin
say_title(mob_name(20378))
say(gameforge.main_quest_lv96._100_say)
say("")
end
when 3701.kill or 3702.kill or 3703.kill or 3704.kill or 3705.kill or 3790.kill or 3791.kill begin
if pc.count_item(31038) < 100 then
if number (1,50) == 1 then
pc.give_item2 ( 31038, 1 )
local remain = 100 - pc.count_item(31038)
if remain < 0 then
remain = 0
end
q.set_counter_value(remain)
if pc.count_item(31038) >= 100 then
notice_multiline(gameforge.main_quest_lv96._110_1_notice,notice)
notice_multiline(gameforge.main_quest_lv96._110_2_notice,notice)
set_state (state1_3)
end
end
end
end
end
state state1_3 begin
when letter begin
send_letter(gameforge.main_quest_lv96._010_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
q.set_counter_name("")
end
when button or info begin
say_title(gameforge.main_quest_lv96._010_sendLetter)
say(gameforge.main_quest_lv96._120_say)
say("")
say("")
end
-- <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>κ<EFBFBD>.
when 3701.kill or 3702.kill or 3703.kill or 3704.kill or 3705.kill or 3790.kill or 3791.kill begin
if pc.count_item(31038) < 100 then
if number (1,50) == 1 then
pc.give_item2 ( 31038, 1 )
if pc.count_item(31038) >= 100 then
notice_multiline(gameforge.main_quest_lv96._110_1_notice,notice)
notice_multiline(gameforge.main_quest_lv96._110_2_notice,notice)
end
end
end
end
when 20378.chat.gameforge.main_quest_lv96._010_sendLetter begin
target.delete("__TARGET__")
if pc.count_item(31038) >= 100 then
pc.remove_item ( 31038, pc.count_item(31038))
say_title(mob_name(20378))
say(gameforge.main_quest_lv96._130_say)
say("")
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 39032537))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 346000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(30051),1,locale.count_postfix))
say("")
pc.give_exp2(39032537)
pc.change_money(346000)
pc.give_item2(30051, 1)
set_state (state2_1)
else --<2D>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Դ<EFBFBD>.
say_title(mob_name(20378))
say(gameforge.main_quest_lv96._100_say)
say("")
set_state (state1_2)
end
end
end
------------------------------------<2D><><EFBFBD>ɼ<EFBFBD> <20><><EFBFBD><EFBFBD>1-2------------------------------------
state state2_1 begin
when letter begin
send_letter(gameforge.main_quest_lv96._140_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv96._140_sendLetter)
say(gameforge.main_quest_lv96._150_say)
say("")
say("")
end
when 20378.chat.gameforge.main_quest_lv96._140_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378))
say(gameforge.main_quest_lv96._160_say)
say("")
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv96._190_say)
say("")
set_state (state2_2)
end
end
state state2_2 begin
when letter begin
send_letter(gameforge.main_quest_lv96._140_sendLetter)
q.set_counter_name(gameforge.main_quest_lv96._570_counterName)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv96._200_sayTitle)
say(gameforge.main_quest_lv96._210_say)
say("")
say_item_vnum_inline(31039,0,2)
say_item_vnum_inline(31040,1,2)
say(gameforge.main_quest_lv96._570_counterName)
local remain1 = 1 - pc.count_item(31039)
if remain1 < 0 then
remain1 = 0
end
local remain2 = 1 - pc.count_item(31040)
if remain2 < 0 then
remain2 = 0
end
q.set_counter_value(remain1 + remain2)
say_reward(string.format(gameforge.main_quest_lv96._580_sayReward,item_name(31039),remain1))
say_reward(string.format(gameforge.main_quest_lv96._580_sayReward,item_name(31040),remain2))
-- say()
-- say_reward(locale.main_quest_lv96.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
--Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>--
when 20378.chat.gameforge.main_quest_lv96._140_sendLetter begin
say_title(mob_name(20378))
say(gameforge.main_quest_lv96._220_say)
say("")
end
when 3801.kill or 3802.kill or 3803.kill or 3804.kill or 3805.kill or 3890.kill or 3891.kill begin
if pc.count_item(31039) < 1 or pc.count_item(31040) < 1 then
if number (1,100) == 1 then
if pc.count_item(31039) < 1 then
pc.give_item2 ( 31039, 1 )
end
if pc.count_item(31040) < 1 then
pc.give_item2 ( 31040, 1 )
end
local remain1 = 1 - pc.count_item(31039)
if remain1 < 0 then
remain1 = 0
end
local remain2 = 1 - pc.count_item(31040)
if remain2 < 0 then
remain2 = 0
end
q.set_counter_value(remain1 + remain2)
notice_multiline(gameforge.main_quest_lv96._230_1_notice,notice)
notice_multiline(gameforge.main_quest_lv96._230_2_notice,notice)
set_state (state2_3)
end
end
end
end
state state2_3 begin
when letter begin
send_letter(gameforge.main_quest_lv96._140_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
q.set_counter_name("")
end
when button or info begin
say_title(gameforge.main_quest_lv96._140_sendLetter)
say(gameforge.main_quest_lv96._240_say)
say("")
say("")
end
-- <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>κ<EFBFBD>.
when 3801.kill or 3802.kill or 3803.kill or 3804.kill or 3805.kill or 3890.kill or 3891.kill begin
if pc.count_item(31039) < 1 or pc.count_item(31040) < 1 then
if number (1,100) == 1 then
if pc.count_item(31039) < 1 then
pc.give_item2 ( 31039, 1 )
end
if pc.count_item(31040) < 1 then
pc.give_item2 ( 31040, 1 )
end
notice_multiline(gameforge.main_quest_lv96._230_1_notice,notice)
notice_multiline(gameforge.main_quest_lv96._230_2_notice,notice)
end
end
end
when 20378.chat.gameforge.main_quest_lv96._140_sendLetter begin
target.delete("__TARGET__")
if pc.count_item(31039) >= 1 and pc.count_item(31040) >= 1 then
pc.remove_item ( 31039, pc.count_item(31039))
pc.remove_item ( 31040, pc.count_item(31040))
say_title(mob_name(20378))
say(gameforge.main_quest_lv96._250_say)
say("")
set_state (state2_4)
else
say_title(mob_name(20378))
say(gameforge.main_quest_lv96._220_say)
say("")
set_state (state2_2)
end
end
end
--<2D><><EFBFBD>ڿ<EFBFBD><DABF>Է<EFBFBD>
state state2_4 begin
when letter begin
send_letter(gameforge.main_quest_lv96._140_sendLetter)
local v = find_npc_by_vnum(20380)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20380))
end
end
when button or info begin
say_title(gameforge.main_quest_lv96._140_sendLetter)
say(gameforge.main_quest_lv96._260_say)
say("")
say("")
end
when 20380.chat.gameforge.main_quest_lv96._140_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20380))
say(gameforge.main_quest_lv96._270_say)
say("")
wait()
say_title(mob_name(20380))
say(gameforge.main_quest_lv96._290_say)
say("")
set_state (state2_5)
end
end
--<2D>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5BFA1>
state state2_5 begin
when letter begin
send_letter(gameforge.main_quest_lv96._140_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv96._140_sendLetter)
say(gameforge.main_quest_lv96._240_say)
say("")
say("")
end
when 20378.chat.gameforge.main_quest_lv96._140_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378))
say(gameforge.main_quest_lv96._590_say)
say("")
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 40732586))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 357000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(72016),1,locale.count_postfix))
say("")
pc.give_exp2(40732586)
pc.change_money(357000)
pc.give_item2_select(72016)
item.set_socket(2, 120)
set_state (state3_1)
end
end
------------------------------------<2D><><EFBFBD>ɼ<EFBFBD> <20><><EFBFBD><EFBFBD>1-3------------------------------------
state state3_1 begin
when letter begin
send_letter(gameforge.main_quest_lv96._300_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv96._300_sendLetter)
say(gameforge.main_quest_lv96._310_say)
say("")
say("")
end
when 20378.chat.gameforge.main_quest_lv96._300_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv96._320_say)
say("")
wait()
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(31073),1,locale.count_postfix))
say("")
wait()
if pc.count_item(31073) < 1 then
pc.give_item2(31073,1)
end
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv96._330_say)
say("")
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv96._340_say)
say("")
set_state (state3_2)
end
end
state state3_2 begin
when letter begin
send_letter(gameforge.main_quest_lv96._300_sendLetter)
q.set_counter_name(gameforge.main_quest_lv96._570_counterName)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv96._350_sayTitle)
say(gameforge.main_quest_lv96._360_say)
say("")
say_item_vnum(31039)
say(gameforge.main_quest_lv96._570_counterName)
local remain = 100 - pc.getqf("checked_pocket")
if remain < 0 then
remain = 0
end
q.set_counter_value(remain)
say_reward(string.format(gameforge.main_quest_lv96._580_sayReward,item_name(31039),remain))
-- say()
-- say_reward(locale.main_quest_lv96.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
when 31073.use begin
affect.add(apply.CON, 10, 60 * 60)
affect.add(apply.INT, 10, 60 * 60)
affect.add(apply.STR, 10, 60 * 60)
affect.add(apply.DEX, 10, 60 * 60)
pc.remove_item(31073,1)
end
when 3801.kill or 3802.kill or 3803.kill or 3804.kill or 3805.kill or 3890.kill or 3891.kill begin
if number (1,100) == 1 then
pc.give_item2 ( 31039, 1 )
notice_multiline(gameforge.main_quest_lv96._620_1_notice,notice)
notice_multiline(gameforge.main_quest_lv96._620_2_notice,notice)
end
end
when 20380.chat.gameforge.main_quest_lv96._300_sendLetter with pc.count_item(31039) > 0 begin
pc.remove_item (31039, 1)
if number(1,100) <= 70 then -- <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv96._370_say)
say("")
local checked = pc.getqf("checked_pocket")
pc.setqf("checked_pocket", checked + 1)
local remain = 100 - pc.getqf("checked_pocket")
if remain < 0 then
remain = 0
end
q.set_counter_value(remain)
if pc.getqf("checked_pocket") >= 100 then
pc.remove_item ( 31039, pc.count_item(31039))
wait()
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv96._380_say)
say("")
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 42983593))
--say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 0))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(30009),2,locale.count_postfix))
say("")
pc.give_exp2(42983593)
--pc.change_money(0)
pc.give_item2(30009, 2)
set_state (state4_1)
else
say(string.format(gameforge.main_quest_lv96._390_say,remain))
say("")
end
else -- <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
say_title(mob_name(20380 ))
say(gameforge.main_quest_lv96._630_say)
say("")
end
end
end
------------------------------------<2D><><EFBFBD>ɼ<EFBFBD> <20><><EFBFBD><EFBFBD>1-4-----------------------------------
state state4_1 begin
when letter begin
send_letter(gameforge.main_quest_lv96._400_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv96._400_sendLetter)
say(gameforge.main_quest_lv96._410_say)
say("")
say("")
end
when 20378.chat.gameforge.main_quest_lv96._400_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv96._420_say)
say("")
wait()
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv96._430_say)
say("")
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv96._450_say)
say("")
set_state (state4_2)
end
end
-- <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> --
state state4_2 begin
when letter begin
send_letter(gameforge.main_quest_lv96._400_sendLetter)
q.set_counter_name(gameforge.main_quest_lv96._480_counterName)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv96._460_sayTitle)
say(gameforge.main_quest_lv96._470_say)
say("")
say_title(gameforge.main_quest_lv96._480_counterName)
local remain1 = 1 - pc.getqf("kill_tree1")
if remain1 < 0 then
remain1 = 0
end
local remain2 = 1 - pc.getqf("kill_tree2")
if remain2 < 0 then
remain2 = 0
end
local remain3 = 1 - pc.getqf("kill_tree3")
if remain3 < 0 then
remain3 = 0
end
q.set_counter_value(remain1 + remain2 + remain3)
say_reward(string.format(gameforge.main_quest_lv96._490_say,mob_name(3911) ,remain1, mob_name(3912),remain2 , mob_name(3913),remain3))
say("")
-- say()
-- say_reward(locale.main_quest_lv96.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
-- Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC> --
when 20378.chat.gameforge.main_quest_lv96._400_sendLetter begin
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv96._500_say)
say("")
end
when 3911.kill begin
pc.setqf("kill_tree1",1)
if pc.getqf("kill_tree1") == 1 and pc.getqf("kill_tree2") == 1 and pc.getqf("kill_tree3") == 1 then
notice_multiline(gameforge.main_quest_lv96._510_1_notice,notice)
notice_multiline(gameforge.main_quest_lv96._510_2_notice,notice)
set_state (state4_3)
end
local remain1 = 1 - pc.getqf("kill_tree1")
if remain1 < 0 then
remain1 = 0
end
local remain2 = 1 - pc.getqf("kill_tree2")
if remain2 < 0 then
remain2 = 0
end
local remain3 = 1 - pc.getqf("kill_tree3")
if remain3 < 0 then
remain3 = 0
end
q.set_counter_value(remain1 + remain2 + remain3)
end
when 3912.kill begin
pc.setqf("kill_tree2",1)
if pc.getqf("kill_tree1") == 1 and pc.getqf("kill_tree2") == 1 and pc.getqf("kill_tree3") == 1 then
notice_multiline(gameforge.main_quest_lv96._510_1_notice,notice)
notice_multiline(gameforge.main_quest_lv96._510_2_notice,notice)
set_state (state4_3)
end
local remain1 = 1 - pc.getqf("kill_tree1")
if remain1 < 0 then
remain1 = 0
end
local remain2 = 1 - pc.getqf("kill_tree2")
if remain2 < 0 then
remain2 = 0
end
local remain3 = 1 - pc.getqf("kill_tree3")
if remain3 < 0 then
remain3 = 0
end
q.set_counter_value(remain1 + remain2 + remain3)
end
when 3913.kill begin
pc.setqf("kill_tree3",1)
if pc.getqf("kill_tree1") == 1 and pc.getqf("kill_tree2") == 1 and pc.getqf("kill_tree3") == 1 then
notice_multiline(gameforge.main_quest_lv96._510_1_notice,notice)
notice_multiline(gameforge.main_quest_lv96._510_2_notice,notice)
set_state (state4_3)
end
local remain1 = 1 - pc.getqf("kill_tree1")
if remain1 < 0 then
remain1 = 0
end
local remain2 = 1 - pc.getqf("kill_tree2")
if remain2 < 0 then
remain2 = 0
end
local remain3 = 1 - pc.getqf("kill_tree3")
if remain3 < 0 then
remain3 = 0
end
q.set_counter_value(remain1 + remain2 + remain3)
end
end
state state4_3 begin
when letter begin
send_letter(gameforge.main_quest_lv96._400_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
q.set_counter_name("")
end
when button or info begin
say_title(gameforge.main_quest_lv96._400_sendLetter)
say(gameforge.main_quest_lv96._520_say)
say("")
say("")
end
when 20378.chat.gameforge.main_quest_lv96._400_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv96._530_say)
say("")
wait()
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv96._550_say)
say("")
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 44941086))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 379000))
say("")
say_title(gameforge.main_quest_lv96._560_sayTitle)
pc.give_exp2(44941086)
pc.change_money(379000)
clear_letter()
if pc.count_item(31073) > 1 then
pc.remove_item(31073,pc.count_item(31073))
end
set_quest_state ("main_quest_lv97", "state0")
set_state (__COMPLETE__)
end
end
state __COMPLETE__ begin
when enter begin
q.done()
end
end
end

View File

@ -1,657 +0,0 @@
quest main_quest_lv97 begin
state start begin
end
state state0 begin
when login or levelup or enter with pc.level >= 97 begin
set_state (state1_1)
end
end
----------------------------------õ<><C3B5><EFBFBD>ų<EFBFBD> óġ----------------------------------
state state1_1 begin
when letter begin
send_letter(gameforge.main_quest_lv97._010_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv97._010_sendLetter)
say(gameforge.main_quest_lv97._020_say)
say("")
say("")
end
when 20378.chat.gameforge.main_quest_lv97._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378))
say(gameforge.main_quest_lv97._030_say)
say("")
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv97._040_say)
say("")
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv97._050_say)
say("")
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv97._060_say)
say("")
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv97._070_say)
say("")
set_state (state1_2)
end
end
--<2D><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>--
state state1_2 begin
when letter begin
send_letter(gameforge.main_quest_lv97._010_sendLetter)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv97._080_sayTitle)
say(gameforge.main_quest_lv97._090_say)
-- say("")
-- say_reward(locale.main_quest_lv97.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
--Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ƿԴ<C6BF>.--
when 20378.chat.gameforge.main_quest_lv97._010_sendLetter begin
say_title(mob_name(20378))
say(gameforge.main_quest_lv97._650_say)
end
when 3905.kill begin
if pc.count_item(31074) < 1 then
pc.give_item2 ( 31074, 1 )
end
notice_multiline(gameforge.main_quest_lv97._100_notice,notice)
say(gameforge.main_quest_lv97._110_say)
say("")
wait()
say(gameforge.main_quest_lv97._120_say)
say("")
set_state (state1_3)
end
end
state state1_3 begin
when letter begin
send_letter(gameforge.main_quest_lv97._010_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv97._010_sendLetter)
say(gameforge.main_quest_lv97._130_say)
say("")
say("")
end
-- <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>κ<EFBFBD>.
when 3905.kill begin
if pc.count_item(31074) < 1 then
pc.give_item2 ( 31074, 1 )
end
notice_multiline(gameforge.main_quest_lv97._100_notice,notice)
say(gameforge.main_quest_lv97._110_say)
say("")
wait()
say(gameforge.main_quest_lv97._120_say)
say("")
end
when 20378.chat.gameforge.main_quest_lv97._010_sendLetter begin
target.delete("__TARGET__")
if pc.count_item(31074) >= 1 then
pc.remove_item ( 31074, pc.count_item(31074))
say_title(mob_name(20378))
say(gameforge.main_quest_lv97._140_say)
say("")
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv97._150_say)
say("")
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv97._160_say)
say("")
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv97._190_say)
say("")
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 45941088))
--say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 0))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(30045),2,locale.count_postfix))
say("")
pc.give_exp2(45941088)
--pc.change_money(0)
pc.give_item2(30045, 2)
set_state (state2_1)
else --<2D>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Դ<EFBFBD>.
say_title(mob_name(20378))
say(gameforge.main_quest_lv97._650_say)
set_state (state1_2)
end
end
end
---------------------------------- <20>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ----------------------------------
state state2_1 begin
when letter begin
send_letter(gameforge.main_quest_lv97._200_sendLetter)
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_lv97._200_sendLetter)
say(gameforge.main_quest_lv97._210_say)
say("")
say("")
end
when 20377.chat.gameforge.main_quest_lv97._200_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377))
say(gameforge.main_quest_lv97._220_say)
say("")
wait()
say_title(mob_name(20377))
say(gameforge.main_quest_lv97._230_say)
say("")
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv97._260_say)
set_state (state2_2)
end
end
state state2_2 begin
when letter begin
send_letter(gameforge.main_quest_lv97._200_sendLetter)
local v = find_npc_by_vnum(20001)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20001))
end
end
when button or info begin
say_title(gameforge.main_quest_lv97._270_sayTitle)
say(gameforge.main_quest_lv97._280_say)
say("")
say_item_vnum(31041)
say("")
end
--Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>--
when 20377.chat.gameforge.main_quest_lv97._200_sendLetter begin
say_title(mob_name(20377))
say(gameforge.main_quest_lv97._290_say)
say("")
end
when 20001.chat.gameforge.main_quest_lv97._200_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20001))
say(gameforge.main_quest_lv97._660_say)
if pc.count_item(31041) < 1 then
pc.give_item2(31041, 1)
notice_multiline(gameforge.main_quest_lv97._300_notice,notice)
end
set_state (state2_3)
end
end
state state2_3 begin
when letter begin
send_letter(gameforge.main_quest_lv97._200_sendLetter)
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_lv97._200_sendLetter)
say(gameforge.main_quest_lv97._300_notice)
say("")
say("")
end
when 20377.chat.gameforge.main_quest_lv97._200_sendLetter begin
target.delete("__TARGET__")
if pc.count_item(31041) >= 1 then
pc.remove_item ( 31041, pc.count_item(31041))
say_title(mob_name(20377))
say(gameforge.main_quest_lv97._310_say)
say("")
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 41032531))
--say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 0))
say_reward(string.format ("%s: %d %s", item_name(71001),3,locale.count_postfix))
say("")
pc.give_exp2(41032531)
--pc.change_money(0)
pc.give_item2(71001, 3)
set_state (state3_1)
else -- <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>߷ȴ<DFB7>.
say_title(mob_name(20377))
say(gameforge.main_quest_lv97._170_say)
say("")
set_state (state2_2)
end
end
end
---------------------------------- <20>Ĺ<EFBFBD> Ȱ<><C8B0> Ȯ<><C8AE>----------------------------------
state state3_1 begin
when letter begin
send_letter(gameforge.main_quest_lv97._320_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv97._320_sendLetter)
say(gameforge.main_quest_lv97._330_say)
say("")
say("")
end
when 20378.chat.gameforge.main_quest_lv97._320_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378))
say(gameforge.main_quest_lv97._340_say)
say("")
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv97._350_say)
say("")
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv97._370_say)
say("")
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv97._380_say)
say("")
set_state (state3_2)
end
end
state state3_2 begin
when letter begin
send_letter(gameforge.main_quest_lv97._320_sendLetter)
q.set_counter_name(gameforge.main_quest_lv97._670_counterName)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv97._390_sayTitle)
say(gameforge.main_quest_lv97._400_say)
say("")
say_title(gameforge.main_quest_lv97._670_counterName)
local remain1 = 2 - pc.getqf("mob3_1_kill")
if remain1 < 0 then
remain1 = 0
end
local remain2 = 1 - pc.getqf("mob3_2_kill")
if remain2 < 0 then
remain2 = 0
end
local remain3 = 1 - pc.getqf("mob3_3_kill")
if remain3 < 0 then
remain3 = 0
end
local remain4 = 1 - pc.getqf("mob3_4_kill")
if remain4 < 0 then
remain4 = 0
end
q.set_counter_value(remain1 + remain2 + remain3 + remain4)
say_reward(string.format(gameforge.main_quest_lv97._680_sayReward,mob_name(3907),remain1,mob_name(3908),remain2))
say_reward(string.format(gameforge.main_quest_lv97._680_sayReward,mob_name(3909),remain3,mob_name(3910),remain4))
-- say("")
-- say_reward(locale.main_quest_lv97.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
when 20378.chat.gameforge.main_quest_lv97._320_sendLetter begin
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv97._410_say)
say("")
end
function kill_count()
local remain1 = 2 - pc.getqf("mob3_1_kill")
if remain1 < 0 then
remain1 = 0
end
local remain2 = 1 - pc.getqf("mob3_2_kill")
if remain2 < 0 then
remain2 = 0
end
local remain3 = 1 - pc.getqf("mob3_3_kill")
if remain3 < 0 then
remain3 = 0
end
local remain4 = 1 - pc.getqf("mob3_4_kill")
if remain4 < 0 then
remain4 = 0
end
local total_remain = remain1 + remain2 + remain3 + remain4
q.set_counter_value(total_remain)
return total_remain
end
when 3907.kill begin
pc.setqf("mob3_1_kill",pc.getqf("mob3_1_kill") + 1)
if main_quest_lv97.kill_count() == 0 then
notice_multiline(gameforge.main_quest_lv97._690_1_notice,notice)
notice_multiline(gameforge.main_quest_lv97._690_2_notice,notice)
set_state (state3_3)
end
end
when 3908.kill begin
pc.setqf("mob3_2_kill",pc.getqf("mob3_2_kill") + 1)
if main_quest_lv97.kill_count() == 0 then
notice_multiline(gameforge.main_quest_lv97._690_1_notice,notice)
notice_multiline(gameforge.main_quest_lv97._690_2_notice,notice)
set_state (state3_3)
end
end
when 3909.kill begin
pc.setqf("mob3_3_kill",pc.getqf("mob3_3_kill") + 1)
if main_quest_lv97.kill_count() == 0 then
notice_multiline(gameforge.main_quest_lv97._690_1_notice,notice)
notice_multiline(gameforge.main_quest_lv97._690_2_notice,notice)
set_state (state3_3)
end
end
when 3910.kill begin
pc.setqf("mob3_4_kill",pc.getqf("mob3_4_kill") + 1)
if main_quest_lv97.kill_count() == 0 then
notice_multiline(gameforge.main_quest_lv97._690_1_notice,notice)
notice_multiline(gameforge.main_quest_lv97._690_2_notice,notice)
set_state (state3_3)
end
end
end
state state3_3 begin
when letter begin
send_letter(gameforge.main_quest_lv97._320_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
q.set_counter_name("")
end
when button or info begin
say_title(gameforge.main_quest_lv97._320_sendLetter)
say(gameforge.main_quest_lv97._420_say)
say("")
say("")
end
when 20378.chat.gameforge.main_quest_lv97._320_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv97._430_say)
say("")
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 47898648))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 214000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(30033),3,locale.count_postfix))
say("")
pc.give_exp2(47898648)
pc.change_money(214000)
pc.give_item2(30033, 3)
set_state (state4_1)
end
end
---------------------------------- <20><>ȣ<EFBFBD>ų<EFBFBD><C5B3><EFBFBD> <20><><EFBFBD><EFBFBD>, õ<><C3B5><EFBFBD>ų<EFBFBD>----------------------------------
state state4_1 begin
when letter begin
send_letter(gameforge.main_quest_lv97._440_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv97._440_sendLetter)
say(gameforge.main_quest_lv97._450_say)
say("")
say("")
end
when 20378.chat.gameforge.main_quest_lv97._440_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv97._460_say)
say("")
wait()
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv97._480_say)
say("")
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv97._490_say)
say("")
set_state (state4_2)
end
end
-- <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> --
state state4_2 begin
when letter begin
send_letter(gameforge.main_quest_lv97._440_sendLetter)
end
when button or info begin
say_title(gameforge.main_quest_lv97._700_sayTitle)
say(gameforge.main_quest_lv97._710_say)
end
-- Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC> --
when 20378.chat.gameforge.main_quest_lv97._440_sendLetter begin
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv97._530_say)
say("")
end
when 3910.kill begin
notice_multiline(gameforge.main_quest_lv97._550_1_notice,notice)
notice_multiline(gameforge.main_quest_lv97._550_2_notice,notice)
set_state (state4_3)
end
end
-- <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> --
state state4_3 begin
when letter begin
send_letter(gameforge.main_quest_lv97._440_sendLetter)
end
when button or info begin
say_title(gameforge.main_quest_lv97._510_sayTitle)
say(gameforge.main_quest_lv97._520_say)
say("")
end
-- Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC> --
when 20378.chat.gameforge.main_quest_lv97._440_sendLetter begin
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv97._540_say)
say("")
end
when 3906.kill begin -- õ<><C3B5><EFBFBD>ų<EFBFBD> óġ
notice_multiline(gameforge.main_quest_lv97._560_notice,notice)
say(gameforge.main_quest_lv97._570_say)
say("")
wait()
say(gameforge.main_quest_lv97._580_say)
say("")
if pc.count_item(31017) < 1 then
pc.give_item2(31017, 1)
end
set_state (state4_4)
end
end
state state4_4 begin
when letter begin
send_letter(gameforge.main_quest_lv97._440_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv97._440_sendLetter)
say(gameforge.main_quest_lv97._420_say)
say("")
say("")
end
when 20378.chat.gameforge.main_quest_lv97._440_sendLetter begin
pc.remove_item(31017,pc.count_item(31017))
target.delete("__TARGET__")
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv97._590_say)
say("")
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv97._600_say)
say("")
wait()
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv97._610_say)
say("")
wait()
say_reward(gameforge.main_quest_lv97._620_sayReward)
say("")
wait()
say_title(mob_name(20378 ))
say(gameforge.main_quest_lv97._630_say)
say("")
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 49586571))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 225000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(70024),1,locale.count_postfix))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(30039),3,locale.count_postfix))
say("")
say_title(gameforge.main_quest_lv97._640_sayTitle)
pc.give_exp2(49586571)
pc.change_money(225000)
pc.give_item2(70024, 1)
pc.give_item2(30039, 3)
clear_letter()
set_quest_state ("main_quest_lv98", "state0")
set_state (__COMPLETE__)
end
end
state __COMPLETE__ begin
when enter begin
q.done()
end
end
end

View File

@ -1,774 +0,0 @@
quest main_quest_lv98 begin
state start begin
end
state state0 begin
when login or levelup or enter with pc.level >= 98 begin
set_state (state1_1)
end
end
----------------------------------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 1-1----------------------------------
state state1_1 begin
when letter begin
send_letter(gameforge.main_quest_lv98._010_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv98._010_sendLetter)
say(gameforge.main_quest_lv98._020_say)
say("")
say_reward(gameforge.main_quest_lv98._570_sayReward)
say("")
end
when 20378.chat.gameforge.main_quest_lv98._010_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378))
say(gameforge.main_quest_lv98._030_say)
say("")
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv98._040_say)
say("")
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv98._050_say)
say("")
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv98._060_say)
say("")
set_state (state1_2)
end
end
--<2D><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>--
state state1_2 begin
when letter begin
send_letter(gameforge.main_quest_lv98._010_sendLetter)
q.set_counter_name(gameforge.main_quest_lv98._660_counterName)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv98._540_sayTitle)
say(gameforge.main_quest_lv98._550_say)
say("")
say_item_vnum(31026)
say_title(gameforge.main_quest_lv98._660_counterName)
local remain = 100 - pc.count_item(31026)
if remain < 0 then
remain = 0
end
q.set_counter_value(remain)
say_reward(string.format(gameforge.main_quest_lv98._670_sayReward,item_name(31026),remain))
-- say()
-- say_reward(locale.main_quest_lv98.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
--Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ƿԴ<C6BF>.--
when 20378.chat.gameforge.main_quest_lv98._010_sendLetter begin
say_title(mob_name(20378))
say(gameforge.main_quest_lv98._070_say)
say("")
end
when 3601.kill or 3602.kill or 3603.kill or 3604.kill or 3605.kill or 3690.kill or 3691.kill begin
if number (1,50) == 1 then
if pc.count_item(31026) < 100 then
pc.give_item2 ( 31026, 1 )
local remain = 100 - pc.count_item(31026)
if remain < 0 then
remain = 0
end
q.set_counter_value(remain)
if pc.count_item(31026) >= 100 then
notice_multiline(gameforge.main_quest_lv98._080_1_notice, notice)
notice_multiline(gameforge.main_quest_lv98._080_2_notice,notice)
set_state (state1_3)
end
end
end
end
end
state state1_3 begin
when letter begin
send_letter(gameforge.main_quest_lv98._010_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
q.set_counter_name("")
end
when button or info begin
say_title(gameforge.main_quest_lv98._010_sendLetter)
say(gameforge.main_quest_lv98._560_say)
say("")
say_reward(gameforge.main_quest_lv98._570_sayReward)
say("")
end
-- <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>κ<EFBFBD>.
when 3601.kill or 3602.kill or 3603.kill or 3604.kill or 3605.kill or 3690.kill or 3691.kill begin
if number (1,50) == 1 then
if pc.count_item(31026) < 100 then
pc.give_item2 ( 31026, 1 )
if pc.count_item(31026) >= 100 then
notice_multiline(gameforge.main_quest_lv98._080_1_notice,notice)
notice_multiline(gameforge.main_quest_lv98._080_2_notice,notice)
end
end
end
end
when 20378.chat.gameforge.main_quest_lv98._010_sendLetter begin
target.delete("__TARGET__")
if pc.count_item(31026) >= 100 then
pc.remove_item ( 31026, pc.count_item(31026))
say_title(mob_name(20378))
say(gameforge.main_quest_lv98._090_say)
say("")
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 40898550))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 346000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(72308),1,locale.count_postfix))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(76011),1,locale.count_postfix))
say("")
pc.give_exp2(40898550)
pc.change_money(346000)
pc.give_item2(72308, 1)
pc.give_item2_select(76011)
item.set_socket(2, 120)
set_state (state2_1)
else --<2D>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Դ<EFBFBD>.
say_title(mob_name(20378))
say(gameforge.main_quest_lv98._070_say)
say("")
set_state (state1_2)
end
end
end
---------------------------------- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 1-2 ----------------------------------
state state2_1 begin
when letter begin
send_letter(gameforge.main_quest_lv98._130_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv98._130_sendLetter)
say(gameforge.main_quest_lv98._140_say)
say("")
say_reward(gameforge.main_quest_lv98._570_sayReward)
say("")
end
when 20378.chat.gameforge.main_quest_lv98._130_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378))
say(gameforge.main_quest_lv98._150_say)
say("")
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv98._160_say)
say("")
set_state (state2_2)
end
end
state state2_2 begin
when letter begin
send_letter(gameforge.main_quest_lv98._130_sendLetter)
q.set_counter_name(gameforge.main_quest_lv98._660_counterName)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv98._130_sendLetter)
say(gameforge.main_quest_lv98._590_say)
say("")
say_item_vnum(31042)
say_title(gameforge.main_quest_lv98._660_counterName)
local remain = 100 - pc.count_item(31042)
if remain < 0 then
remain = 0
end
q.set_counter_value(remain)
say_reward(string.format(gameforge.main_quest_lv98._670_sayReward,item_name(31042),remain))
-- say()
-- say_reward(locale.main_quest_lv98.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
--Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>--
when 20378.chat.gameforge.main_quest_lv98._130_sendLetter begin
say_title(mob_name(20378))
say(gameforge.main_quest_lv98._170_say)
say("")
end
when 3401.kill or 3402.kill or 3403.kill or 3404.kill or 3405.kill or 3490.kill or 3491.kill begin
if number (1,50) == 1 then
if pc.count_item(31042) < 100 then
pc.give_item2 ( 31042, 1 )
local remain = 100 - pc.count_item(31042)
if remain < 0 then
remain = 0
end
q.set_counter_value(remain)
if pc.count_item(31042) >= 100 then
notice_multiline(gameforge.main_quest_lv98._180_1_notice,notice)
notice_multiline(gameforge.main_quest_lv98._180_2_notice,notice)
set_state (state2_3)
end
end
end
end
end
state state2_3 begin
when letter begin
send_letter(gameforge.main_quest_lv98._130_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
q.set_counter_name("")
end
when button or info begin
say_title(gameforge.main_quest_lv98._130_sendLetter)
say(gameforge.main_quest_lv98._600_say)
say("")
say_reward(gameforge.main_quest_lv98._570_sayReward)
say("")
end
-- <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>κ<EFBFBD>.
when 3401.kill or 3402.kill or 3403.kill or 3404.kill or 3405.kill or 3490.kill or 3491.kill begin
if number (1,50) == 1 then
if pc.count_item(31042) < 100 then
pc.give_item2 ( 31042, 1 )
if pc.count_item(31042) >= 100 then
notice_multiline(gameforge.main_quest_lv98._180_1_notice,notice)
notice_multiline(gameforge.main_quest_lv98._180_2_notice,notice)
end
end
end
end
when 20378.chat.gameforge.main_quest_lv98._130_sendLetter begin
target.delete("__TARGET__")
if pc.count_item(31042) >= 100 then
pc.remove_item ( 31042, pc.count_item(31042))
say_title(mob_name(20378))
say(gameforge.main_quest_lv98._190_say)
say("")
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 42646751))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 357000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(71026),1,locale.count_postfix))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(71025),2,locale.count_postfix))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(70102),5,locale.count_postfix))
say("")
pc.give_exp2(42646751)
pc.change_money(357000)
pc.give_item2(71026, 1)
pc.give_item2(71025, 1)
pc.give_item2(71025, 1)
pc.give_item2(70102, 1)
pc.give_item2(70102, 1)
pc.give_item2(70102, 1)
pc.give_item2(70102, 1)
pc.give_item2(70102, 1)
set_state (state3_1)
else -- <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>߷ȴ<DFB7>.
say_title(mob_name(20378))
say(gameforge.main_quest_lv98._170_say)
say("")
set_state (state2_2)
end
end
end
---------------------------------- <20><>Ȱ <20><><EFBFBD><EFBFBD>----------------------------------
state state3_1 begin
when letter begin
send_letter(gameforge.main_quest_lv98._200_sendLetter)
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_lv98._200_sendLetter)
say(gameforge.main_quest_lv98._210_say)
say("")
say_reward(gameforge.main_quest_lv98._570_sayReward)
say("")
end
when 20377.chat.gameforge.main_quest_lv98._200_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377 ))
say(gameforge.main_quest_lv98._220_say)
say("")
wait()
say_title(mob_name(20377 ))
say(gameforge.main_quest_lv98._260_say)
say("")
wait()
say_title(mob_name(20377 ))
say(gameforge.main_quest_lv98._280_say)
say("")
set_state (state3_2)
end
end
state state3_2 begin
when letter begin
send_letter(gameforge.main_quest_lv98._200_sendLetter)
q.set_counter_name(gameforge.main_quest_lv98._680_counterName)
end
when button or info begin
-- if pc.get_map_index() == 1 then
-- addmapsignal(500 * 100, 500 * 100)
-- addmapsignal(600 * 100, 500 * 100)
-- addmapsignal(700 * 100, 300 * 100)
-- end
say_title(gameforge.main_quest_lv98._610_sayTitle)
say(gameforge.main_quest_lv98._620_say)
say("")
say(gameforge.main_quest_lv98._680_counterName)
local remain1 = 50 - pc.getqf("mob3_1_kill")
if remain1 < 0 then
remain1 = 0
end
local remain2 = 1 - pc.getqf("mob3_2_kill")
if remain2 < 0 then
remain2 = 0
end
q.set_counter_value(remain1 + remain2)
say_reward(string.format(gameforge.main_quest_lv98._690_sayReward,mob_name(3805),remain1,mob_name(3890),remain2))
-- say()
-- say_reward(locale.main_quest_lv98.pos_info)
-- select(gameforge.main_quest_lv90._950_say)
-- setskin(NOWINDOW)
-- clearmapsignal()
end
when 20377.chat.gameforge.main_quest_lv98._200_sendLetter begin
say_title(mob_name(20377 ))
say(gameforge.main_quest_lv98._300_say)
say("")
end
when 3805.kill begin
local mob3_1_kill = pc.getqf("mob3_1_kill")
if mob3_1_kill < 50 then
pc.setqf("mob3_1_kill",mob3_1_kill +1)
local remain1 = 50 - pc.getqf("mob3_1_kill")
if remain1 < 0 then
remain1 = 0
end
local remain2 = 1 - pc.getqf("mob3_2_kill")
if remain2 < 0 then
remain2 = 0
end
q.set_counter_value(remain1 + remain2)
end
if pc.getqf("mob3_1_kill") >= 50 and pc.getqf("mob3_2_kill") >= 1 then
notice_multiline(gameforge.main_quest_lv98._310_1_notice,notice)
notice_multiline(gameforge.main_quest_lv98._310_2_notice,notice)
set_state (state3_3)
end
end
when 3890.kill begin
local mob3_2_kill = pc.getqf("mob3_2_kill")
if mob3_2_kill < 1 then
pc.setqf("mob3_2_kill",1)
local remain1 = 50 - pc.getqf("mob3_1_kill")
if remain1 < 0 then
remain1 = 0
end
local remain2 = 1 - pc.getqf("mob3_2_kill")
if remain2 < 0 then
remain2 = 0
end
q.set_counter_value(remain1 + remain2)
end
if pc.getqf("mob3_1_kill") >= 50 and pc.getqf("mob3_2_kill") >= 1 then
notice_multiline(gameforge.main_quest_lv98._310_1_notice,notice)
notice_multiline(gameforge.main_quest_lv98._310_2_notice,notice)
set_state (state3_3)
end
end
end
state state3_3 begin
when letter begin
send_letter(gameforge.main_quest_lv98._200_sendLetter)
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
q.set_counter_name("")
end
when button or info begin
say_title(gameforge.main_quest_lv98._200_sendLetter)
say(gameforge.main_quest_lv98._630_say)
say("")
say_reward(gameforge.main_quest_lv98._570_sayReward)
say("")
end
when 20377.chat.gameforge.main_quest_lv98._200_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377 ))
say(gameforge.main_quest_lv98._320_say)
say("")
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format(gameforge.main_quest_lv60._190_sayReward, 48584941))
--say_reward(string.format(gameforge.main_quest_lv60._200_sayReward, 0))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(30021),1,locale.count_postfix))
say("")
pc.give_exp2(48584941)
--pc.change_money(0)
pc.give_item2(30021, 1)
set_state (state4_1)
end
end
---------------------------------- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>λ<EFBFBD>----------------------------------
state state4_1 begin
when letter begin
send_letter(gameforge.main_quest_lv98._330_sendLetter)
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_lv98._330_sendLetter)
say(gameforge.main_quest_lv98._340_say)
say("")
say_reward(gameforge.main_quest_lv98._570_sayReward)
say("")
end
when 20377.chat.gameforge.main_quest_lv98._330_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377 ))
say(gameforge.main_quest_lv98._350_say)
say("")
wait()
say_title(mob_name(20377 ))
say(gameforge.main_quest_lv98._360_say)
say("")
wait()
say_title(pc.getname())
say(gameforge.main_quest_lv98._380_say)
say("")
set_state (state4_2)
end
end
-- <20>λ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> --
state state4_2 begin
when letter begin
send_letter(gameforge.main_quest_lv98._330_sendLetter)
q.set_counter_name(gameforge.main_quest_lv98._700_counterName)
local v_npc1 = find_npc_by_vnum(20381)
local v_npc2 = find_npc_by_vnum(9002)
local v_npc3 = find_npc_by_vnum(9003)
local v_npc4 = find_npc_by_vnum(9001)
if 0 != v_npc1 and pc.getqf("click_npc1") ~= 1 then
target.vid("__target_npc1__", v_npc1, mob_name(20381))
end
if 0 != v_npc2 and pc.getqf("click_npc2") ~= 1 then
target.vid("__target_npc2__", v_npc2, mob_name(9002))
end
if 0 != v_npc3 and pc.getqf("click_npc3") ~= 1 then
target.vid("__target_npc3__", v_npc3, mob_name(9003))
end
if 0 != v_npc4 and pc.getqf("click_npc4") ~= 1 then
target.vid("__target_npc4__", v_npc4, mob_name(9001))
end
end
when button or info begin
say_title(gameforge.main_quest_lv98._640_sayTitle)
say(gameforge.main_quest_lv98._650_say)
say("")
say_title(gameforge.main_quest_lv98._700_counterName)
local npc1 = " "
if pc.getqf("click_npc1") == 1 then
npc1 = "O"
end
local npc2 = " "
if pc.getqf("click_npc2") == 1 then
npc2 = "O"
end
local npc3 = " "
if pc.getqf("click_npc3") == 1 then
npc3 = "O"
end
local npc4 = " "
if pc.getqf("click_npc4") == 1 then
npc4 = "O"
end
local remain = 4 - pc.getqf("click_npc1") - pc.getqf("click_npc2") - pc.getqf("click_npc3") - pc.getqf("click_npc4")
q.set_counter_value(remain)
say(string.format(gameforge.main_quest_lv98._710_say,npc1,npc2))
say(string.format(gameforge.main_quest_lv98._720_say,npc3,npc4))
say("")
say_reward(gameforge.main_quest_lv98._570_sayReward)
say("")
end
-- Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC> --
when 20377.chat.gameforge.main_quest_lv98._330_sendLetter begin
say_title(mob_name(20377 ))
say(gameforge.main_quest_lv98._390_say)
say("")
wait()
end
when __target_npc1__.target.click or 20381.click with pc.getqf("click_npc1") ~= 1 begin -- <20><><EFBFBD><EFBFBD>
target.delete("__target_npc1__")
pc.setqf("click_npc1",1)
say_title(mob_name(20381))
say(gameforge.main_quest_lv98._400_say)
say("")
local remain = 4 - pc.getqf("click_npc1") - pc.getqf("click_npc2") - pc.getqf("click_npc3") - pc.getqf("click_npc4")
q.set_counter_value(remain)
if pc.getqf("click_npc1") == 1 and pc.getqf("click_npc2") == 1 and pc.getqf("click_npc3") == 1 and pc.getqf("click_npc4") == 1 then
notice_multiline(gameforge.main_quest_lv98._440_1_notice,notice)
notice_multiline(gameforge.main_quest_lv98._440_2_notice,notice)
set_state (state4_3)
end
end
when __target_npc2__.target.click or 9002.click with pc.getqf("click_npc2") ~= 1 begin -- <20><><EFBFBD>
target.delete("__target_npc2__")
pc.setqf("click_npc2",1)
say_title(mob_name(9002))
say(gameforge.main_quest_lv98._410_say)
say("")
local remain = 4 - pc.getqf("click_npc1") - pc.getqf("click_npc2") - pc.getqf("click_npc3") - pc.getqf("click_npc4")
q.set_counter_value(remain)
if pc.getqf("click_npc1") == 1 and pc.getqf("click_npc2") == 1 and pc.getqf("click_npc3") == 1 and pc.getqf("click_npc4") == 1 then
notice_multiline(gameforge.main_quest_lv98._440_1_notice,notice)
notice_multiline(gameforge.main_quest_lv98._440_2_notice,notice)
set_state (state4_3)
end
end
when __target_npc3__.target.click or 9003.click with pc.getqf("click_npc3") ~= 1 begin -- <20><>ȭ<EFBFBD><C8AD><EFBFBD><EFBFBD>
target.delete("__target_npc3__")
pc.setqf("click_npc3",1)
say_title(mob_name(9003))
say(gameforge.main_quest_lv98._430_say)
say("")
local remain = 4 - pc.getqf("click_npc1") - pc.getqf("click_npc2") - pc.getqf("click_npc3") - pc.getqf("click_npc4")
q.set_counter_value(remain)
if pc.getqf("click_npc1") == 1 and pc.getqf("click_npc2") == 1 and pc.getqf("click_npc3") == 1 and pc.getqf("click_npc4") == 1 then
notice_multiline(gameforge.main_quest_lv98._440_1_notice,notice)
notice_multiline(gameforge.main_quest_lv98._440_2_notice,notice)
set_state (state4_3)
end
end
when __target_npc4__.target.click or 9001.click with pc.getqf("click_npc4") ~= 1 begin -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
target.delete("__target_npc4__")
pc.setqf("click_npc4",1)
say_title(mob_name(9001))
say(gameforge.main_quest_lv98._420_say)
say("")
local remain = 4 - pc.getqf("click_npc1") - pc.getqf("click_npc2") - pc.getqf("click_npc3") - pc.getqf("click_npc4")
q.set_counter_value(remain)
if pc.getqf("click_npc1") == 1 and pc.getqf("click_npc2") == 1 and pc.getqf("click_npc3") == 1 and pc.getqf("click_npc4") == 1 then
notice_multiline(gameforge.main_quest_lv98._440_1_notice,notice)
notice_multiline(gameforge.main_quest_lv98._440_2_notice,notice)
set_state (state4_3)
end
end
end
state state4_3 begin
when letter begin
send_letter(gameforge.main_quest_lv98._330_sendLetter)
local v = find_npc_by_vnum(20377)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20377))
end
end
when button or info begin
say_title(gameforge.main_quest_lv98._330_sendLetter)
say(gameforge.main_quest_lv98._630_say)
say("")
say_reward(gameforge.main_quest_lv98._570_sayReward)
say("")
end
when 20377.chat.gameforge.main_quest_lv98._330_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20377 ))
say(gameforge.main_quest_lv98._450_say)
say("")
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 32033398))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 379000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(30015),2,locale.count_postfix))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(70043),1,locale.count_postfix))
say("")
pc.give_exp2(32033398)
pc.change_money(379000)
pc.give_item2(30015, 2)
pc.give_item2_select(70043)
item.set_socket(2, 60)
set_state (state5_1)
end
end
----------------------------------<2D>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>----------------------------------
state state5_1 begin
when letter begin
send_letter(gameforge.main_quest_lv98._480_sendLetter)
local v = find_npc_by_vnum(20378)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20378))
end
end
when button or info begin
say_title(gameforge.main_quest_lv98._480_sendLetter)
say(gameforge.main_quest_lv98._490_say)
say("")
say_reward(gameforge.main_quest_lv98._570_sayReward)
say("")
end
when 20378.chat.gameforge.main_quest_lv98._480_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20378))
say(gameforge.main_quest_lv98._500_say)
say("")
wait()
say_title(mob_name(20378))
say(gameforge.main_quest_lv98._520_say)
say("")
wait()
--<2D><><EFBFBD><EFBFBD>
say_title(locale.reward)
say_reward(string.format (gameforge.main_quest_lv60._190_sayReward, 38739560))
say_reward(string.format (gameforge.main_quest_lv60._200_sayReward, 390000))
say_reward(string.format (gameforge.main_quest_lv60._210_sayReward, item_name(30006),1,locale.count_postfix))
say("")
pc.give_exp2(38739560)
pc.change_money(390000)
pc.give_item2(30006, 1)
clear_letter()
set_state (__COMPLETE__)
end
end
state __COMPLETE__ begin
when enter begin
q.done()
end
end
end

View File

@ -1,44 +0,0 @@
quest new_christmas_2012 begin
state start begin
function has_santa()
return (game.get_event_flag("new_xmas_event") > 0)
end
when 20126.chat.gameforge.new_christmas._010_npcChat begin
say_title(mob_name(20126))
say (gameforge.new_christmas._020_say )
wait()
say_title(mob_name(20126))
say (gameforge.new_christmas._030_say )
wait()
say_title(mob_name(20126))
say (gameforge.new_christmas._040_say )
wait()
set_quest_state("new_christmas_2012_nog", "nog_first_give")
set_quest_state("new_christmas_2012_sock", "baby_dear_give")
set_state ("__COMPLETE__")
end
when login or enter with new_christmas_2012.has_santa() begin
if pc.get_map_index() == 1 or pc.get_map_index() == 21 or pc.get_map_index() == 41 then
if find_npc_by_vnum(20384) == 0 then
if pc.get_map_index() == 1 then
mob.spawn(20384, 625, 676, 0, 0 )
elseif pc.get_map_index() == 21 then
mob.spawn(20384, 542, 551, 0, 0)
elseif pc.get_map_index() == 41 then
mob.spawn(20384, 442, 717, 0, 0)
end
end
end
end
end
state __COMPLETE__ begin
when 20126.chat."init christmas quest" with is_test_server() or pc.is_gm() begin
set_state ("start")
set_quest_state("new_christmas_2012_nog", "start")
set_quest_state("new_christmas_2012_sock", "start")
say ("init complete")
end
end
end

View File

@ -1,36 +0,0 @@
quest new_christmas_2012_nog begin
state start begin
end
state nog_first_give begin
when 20126.chat.gameforge.new_christmas._050_npcChat begin
say_title(mob_name(20126))
say (gameforge.new_christmas._060_say)
wait()
say_title(mob_name(20126))
say (gameforge.new_christmas._070_say)
wait()
pc.give_item2 (50216, 6)
pc.setqf ("last_nog_give_time", get_global_time())
say_title(mob_name(20126))
say (gameforge.new_christmas._080_say)
set_state(nog_give)
end
end
state nog_give begin
when 20126.chat.gameforge.new_christmas._090_npcChat begin
say_title(mob_name(20126))
say (gameforge.new_christmas._100_say)
wait()
if get_global_time() - pc.getqf ("last_nog_give_time") >= 86400 then
say_title(mob_name(20126))
say (gameforge.new_christmas._110_say)
pc.setqf ("last_nog_give_time", get_global_time())
pc.give_item2 (50216, 6)
else
say_title(mob_name(20126))
say (gameforge.new_christmas._120_say)
end
end
end
end

View File

@ -1,70 +0,0 @@
quest new_christmas_2012_sock begin
state start begin
end
state baby_dear_give begin
when 20126.chat.gameforge.new_christmas_sock._010_npcChat begin
say_title(mob_name(20126))
say (gameforge.new_christmas_sock._020_say)
wait()
say_title(mob_name(20126))
say (gameforge.new_christmas_sock._030_say)
wait()
say_title(mob_name(20126))
say (gameforge.new_christmas_sock._040_say)
wait()
say_title(mob_name(20126))
pc.give_item2_select (53007, 1)
item.set_socket (0, get_global_time() + 7200)
pc.setqf ("last_reindeer_give_time", get_global_time())
set_state(sock_take)
end
end
state sock_take begin
when 20126.chat.gameforge.new_christmas_sock._080_npcChat begin
if get_global_time() - pc.getqf ("last_reindeer_give_time") < 86400 then
say_title (mob_name (20126))
say (gameforge.new_christmas_sock._090_say)
else
say_title (mob_name (20126))
say (gameforge.new_christmas_sock._040_say)
pc.give_item2_select (53007, 1)
item.set_socket (0, get_global_time() + 7200)
pc.setqf ("last_reindeer_give_time", get_global_time())
end
end
when 20126.chat."reset flags / reindeer, socks" with is_test_server() begin
pc.setqf ("last_reindeer_give_time", 0)
pc.setqf("last_sock_cooldown_time", 0)
end
when 20126.chat.gameforge.new_christmas_sock._050_npcChat begin
if get_time() < pc.getqf("last_sock_cooldown_time") then
say_title (mob_name(20126))
say (gameforge.new_christmas_sock._100_say)
else
local n = pc.count_item(50010)
if n < 5 then
say_title(mob_name(20126))
say (gameforge.new_christmas_sock._060_say)
wait()
else
say_title(mob_name(20126))
say (gameforge.new_christmas_sock._070_say)
wait()
pc.remove_item (50010, 5)
say_title(locale.reward)
pc.give_item2(71144)
say_reward (string.format("%s : 1%s",item_name(71144), locale.count_postfix))
if is_test_server() then
pc.setqf("last_sock_cooldown_time", get_time() + 20)
else
pc.setqf("last_sock_cooldown_time", get_time()+60*60*24) -----------------------------------24 stunden nun
end
end
end
end
end
end

View File

@ -1,470 +0,0 @@
quest spider_dungeon_3floor_boss begin
state start begin
--2, <20><><EFBFBD><EFBFBD> <20><> <20>ð<EFBFBD>.
when spider_end_timer.server_timer with game.get_event_flag("spider_dead"..get_channel_id()) == 0 begin --
warp_all_in_area_to_area(82700, 612700, 93700,625700, 69100, 614800, 69100, 614800)
game.set_event_flag("spider_lair_ongoing_"..get_channel_id(),0)
game.set_event_flag("spider_lair_leader_"..get_channel_id(), 0)
game.set_event_flag("spider_dead"..get_channel_id(),0)
purge_area(82700, 612700, 93700,625700)
end
when spider_dead_timer.server_timer begin
warp_all_in_area_to_area(82700, 612700, 93700,625700, 69100, 614800, 69100, 614800)
game.set_event_flag("spider_lair_ongoing_"..get_channel_id(), 0)
game.set_event_flag("spider_lair_leader_"..get_channel_id(), 0)
game.set_event_flag("spider_dead"..get_channel_id(),0)
purge_area(82700, 612700, 93700,625700)
end
when login or levelup or enter with pc.get_level() >= 50 begin
set_state( step1 )
end
when 30130.chat.gameforge.spider_dungeon_3floor_boss._10_npcChat begin
say(gameforge.spider_dungeon_3floor_boss._20_say)
end
end
state step1 begin
when 20011.chat.gameforge.spider_dungeon_3floor_boss._30_npcChat with is_test_server() begin --<2D>׽<EFBFBD>Ʈ<EFBFBD><C6AE>
set_state(start)
say(gameforge.spider_dungeon_3floor_boss._40_say)
end
when 30130.chat.gameforge.spider_dungeon_3floor_boss._10_npcChat begin
say(gameforge.spider_dungeon_3floor_boss._20_say)
end
when 20355.chat.gameforge.spider_dungeon_3floor_boss._50_npcChat begin --<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5BFA1> <20><><EFBFBD><EFBFBD> <20>ɾ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
say_title(mob_name(20355))
----"12345678901234567890123456789012345678901234567890"|
say(gameforge.spider_dungeon_3floor_boss._60_say)
set_state( step2 )
pc.give_item2(76019)
end
end
state step2 begin --<2D>񼮿<EFBFBD> Ź<><C5B9><EFBFBD><EFBFBD> <20>߷<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
when 20011.chat.gameforge.spider_dungeon_3floor_boss._30_npcChat with is_test_server() begin --<2D>׽<EFBFBD>Ʈ<EFBFBD><C6AE>
set_state(start)
say(gameforge.spider_dungeon_3floor_boss._40_say)
end
-----------<2D><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD>2------------
when letter begin
send_letter(gameforge.spider_dungeon_3floor_boss._70_sendLetter)
local v = find_npc_by_vnum(30130)
if 0 != v then
target.vid("__TARGET__", v, mob_name(30130))
end
end
when button or info begin
say_title(gameforge.spider_dungeon_3floor_boss._70_sendLetter)
say(gameforge.spider_dungeon_3floor_boss._80_say)
say("")
end
when 30130.chat.gameforge.spider_dungeon_3floor_boss._70_sendLetter begin
target.delete("__TARGET__")
say_title(pc.getname())
----"12345678901234567890123456789012345678901234567890"|
say(gameforge.spider_dungeon_3floor_boss._90_say)
set_state(step3)
end
when 30130.chat.gameforge.spider_dungeon_3floor_boss._10_npcChat begin
say(gameforge.spider_dungeon_3floor_boss._20_say)
end
when 20355.chat.gameforge.spider_dungeon_3floor_boss._50_npcChat begin
say_title(mob_name(20355))
----"12345678901234567890123456789012345678901234567890"|
say(gameforge.spider_dungeon_3floor_boss._100_say)
end
end
state step3 begin --Ź<><C5B9><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>񿡰<EFBFBD> <20><><EFBFBD>ư<EFBFBD><C6B0><EFBFBD>.
when 20011.chat.gameforge.spider_dungeon_3floor_boss._30_npcChat with is_test_server() begin --<2D>׽<EFBFBD>Ʈ<EFBFBD><C6AE>
set_state(start)
say(gameforge.spider_dungeon_3floor_boss._40_say)
end
when 30130.chat.gameforge.spider_dungeon_3floor_boss._10_npcChat begin
say(gameforge.spider_dungeon_3floor_boss._20_say)
end
when letter begin
send_letter(gameforge.spider_dungeon_3floor_boss._110_sendLetter)
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>.
local v = find_npc_by_vnum(20355)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20355))
end
end
when button or info begin
say_title(gameforge.spider_dungeon_3floor_boss._110_sendLetter)
say(gameforge.spider_dungeon_3floor_boss._120_say)
say("")
end
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>õ<EFBFBD> <20><>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD>.
when 20355.chat.gameforge.spider_dungeon_3floor_boss._110_sendLetter begin
say_title(mob_name(20355))
say(gameforge.spider_dungeon_3floor_boss._130_say)
set_state(step4)
end
end
state step4 begin --<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ź<><C5B9><EFBFBD><EFBFBD> <20>ñ<EFBFBD><C3B1><EFBFBD>.
when 20011.chat.gameforge.spider_dungeon_3floor_boss._30_npcChat with is_test_server() begin --<2D>׽<EFBFBD>Ʈ<EFBFBD><C6AE>
set_state(start)
say(gameforge.spider_dungeon_3floor_boss._40_say)
end
when 30130.chat.gameforge.spider_dungeon_3floor_boss._10_npcChat begin
say(gameforge.spider_dungeon_3floor_boss._20_say)
end
-----------<2D><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD>2------------
when letter begin
send_letter(gameforge.spider_dungeon_3floor_boss._110_sendLetter)
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>.
local v = find_npc_by_vnum(20011)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20011))
end
end
when button or info begin
say_title(gameforge.spider_dungeon_3floor_boss._110_sendLetter)
say(gameforge.spider_dungeon_3floor_boss._140_say)
say("")
end
when 20011.chat.gameforge.spider_dungeon_3floor_boss._110_sendLetter begin
target.delete("__TARGET__")
say_title(mob_name(20011))
say(gameforge.spider_dungeon_3floor_boss._150_say)
say("")
set_state(step5)
end
when 20355.chat.gameforge.spider_dungeon_3floor_boss._110_sendLetter begin
say_title(mob_name(20355))
say(gameforge.spider_dungeon_3floor_boss._130_say)
end
end
state step5 begin --<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
when 20011.chat.gameforge.spider_dungeon_3floor_boss._30_npcChat with is_test_server() begin --<2D>׽<EFBFBD>Ʈ<EFBFBD><C6AE>
set_state(start)
say(gameforge.spider_dungeon_3floor_boss._40_say)
end
when 30130.chat.gameforge.spider_dungeon_3floor_boss._10_npcChat begin
say(gameforge.spider_dungeon_3floor_boss._20_say)
end
when letter begin
send_letter(gameforge.spider_dungeon_3floor_boss._110_sendLetter)
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>.
local v = find_npc_by_vnum(20355)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20355))
end
end
when button or info begin
say_title(gameforge.spider_dungeon_3floor_boss._170_sayTitle)
say(gameforge.spider_dungeon_3floor_boss._180_say)
say("")
end
when 20355.chat.gameforge.spider_dungeon_3floor_boss._190_npcChat begin
target.delete("__TARGET__")
say_title(mob_name(20355))
----"12345678901234567890123456789012345678901234567890"|
say(gameforge.spider_dungeon_3floor_boss._200_say)
say("")
set_state(step6) pc.give_item2(76019)
end
when 20011.chat.gameforge.spider_dungeon_3floor_boss._110_sendLetter begin
say_title(mob_name(20011))
say(gameforge.spider_dungeon_3floor_boss._160_say)
say("")
end
end
state step6 begin --<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ͻ<EFBFBD>Ų<EFBFBD><C5B2>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
when 20011.chat.gameforge.spider_dungeon_3floor_boss._30_npcChat with is_test_server() begin --<2D>׽<EFBFBD>Ʈ<EFBFBD><C6AE>
set_state(start)
say(gameforge.spider_dungeon_3floor_boss._40_say)
end
when 30130.chat.gameforge.spider_dungeon_3floor_boss._10_npcChat begin
say(gameforge.spider_dungeon_3floor_boss._20_say)
end
when letter begin
send_letter(gameforge.spider_dungeon_3floor_boss._190_npcChat)
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>.
local v = find_npc_by_vnum(20011)
if 0 != v then
target.vid("__TARGET__", v, mob_name(20011))
end
end
when button or info begin
say_title(gameforge.spider_dungeon_3floor_boss._190_npcChat)
say(gameforge.spider_dungeon_3floor_boss._200_say)
say("")
end
--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>õ<EFBFBD> <20><>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD>.
when 20011.chat.gameforge.spider_dungeon_3floor_boss._190_npcChat begin
target.delete("__TARGET__")
say_title(mob_name(20011))
say(gameforge.spider_dungeon_3floor_boss._230_say)
set_state(boss_ok)
end
end
state boss_ok begin -- <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ְ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ẕ́<C5B9> <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD>.
when 20011.chat.gameforge.spider_dungeon_3floor_boss._30_npcChat with is_test_server() begin --<2D>׽<EFBFBD>Ʈ<EFBFBD><C6AE>
set_state(start)
say(gameforge.spider_dungeon_3floor_boss._40_say)
end
when 20011.chat.gameforge.spider_dungeon_3floor_boss._210_npcChat begin
if pc.count_item(30025) > 0 and pc.count_item(30056) > 0 and pc.count_item(30057) > 0 and pc.count_item(30058) > 0 and pc.count_item(30059) > 0 and pc.count_item(30326) > 0 then
say_title(mob_name(20011))
say(gameforge.spider_dungeon_3floor_boss._250_say)
pc.remove_item(30025, 1)
pc.remove_item(30056, 1)
pc.remove_item(30057, 1)
pc.remove_item(30058, 1)
pc.remove_item(30059, 1)
pc.remove_item(30326, 1)
if math.random(1,2000) <= 1000 then
say(gameforge.spider_dungeon_3floor_boss._260_say)
pc.give_item2(30324, 1)
else
say(gameforge.spider_dungeon_3floor_boss._270_say)
end
else
say_title(mob_name(20011))
say(gameforge.spider_dungeon_3floor_boss._280_say)
end
end
when 30130.chat.gameforge.spider_dungeon_3floor_boss._10_npcChat begin
if game.get_event_flag("spider_lair_ongoing_"..get_channel_id()) == 1 then
local starttime = game.get_event_flag("spider_lair_start_time_"..get_channel_id())
local current_time = get_global_time()
if party.get_leader_pid() == game.get_event_flag("spider_lair_leader_"..get_channel_id()) then
if starttime + 300 >= current_time and party.get_leader_pid() == game.get_event_flag("spider_lair_leader_"..get_channel_id()) and game.get_event_flag("spider_lair_ongoing_"..get_channel_id()) == 1 then
say(gameforge.spider_dungeon_3floor_boss._300_say) -- <20>׽<EFBFBD>Ʈ<EFBFBD><C6AE>
local warp = select(locale.confirm,locale.cancel)
if warp == 1 then
pc.setqf("firstIn",1)
pc.setqf("retry_limit_time", starttime + 1200 + 3600 )
set_state(inLair)
pc.warp(88100,614800)
return
end
else
say(gameforge.spider_dungeon_3floor_boss._310_say) -- <20>׽<EFBFBD>Ʈ<EFBFBD><C6AE>
return
end
else
local remain_time = (game.get_event_flag("spider_lair_end_time_"..get_channel_id() ) - get_global_time()) / 60
if remain_time < 0 then
say(gameforge.spider_dungeon_3floor_boss._410_say)
game.set_event_flag("spider_lair_ongoing_"..get_channel_id(),0)
game.set_event_flag("spider_lair_leader_"..get_channel_id(), 0)
game.set_event_flag("spider_dead"..get_channel_id(),0)
return
end
say(gameforge.spider_dungeon_3floor_boss._320_say)
--- here we should change to string.format %s key
say(string.format(gameforge.spider_dungeon_3floor_boss._330_say, math.ceil(remain_time)))
return
end
elseif pc.getqf("retry_limit_time") > get_global_time() then
local access_limit = (pc.getqf("retry_limit_time") - get_global_time()) / 60
say(gameforge.spider_dungeon_3floor_boss._340_say)
-- here we should also change to string.format %s key
say(string.format(gameforge.spider_dungeon_3floor_boss._350_say, math.ceil(access_limit)))
return
elseif party.is_leader() then
if false == pc.can_warp() then
say(gameforge.spider_dungeon_3floor_boss._360_say)
return
end
if pc.count_item(30324) > 0 then
say(gameforge.spider_dungeon_3floor_boss._370_say)
local warp = select(locale.confirm,locale.cancel)
if warp == 1 then
set_state(inLair)
pc.remove_item(30324, 1)
mob.spawn(2094,369,551,0,0)
--<2D><> <20><><EFBFBD><EFBFBD>.
game.set_event_flag("spider_lair_ongoing_"..get_channel_id() , 1)
game.set_event_flag("spider_lair_start_time_"..get_channel_id() , get_global_time())
game.set_event_flag("spider_lair_end_time_"..get_channel_id() , get_global_time() + 1200)
game.set_event_flag("spider_lair_leader_"..get_channel_id() , party.get_leader_pid())
pc.setqf("retry_limit_time", get_global_time() + 1200 + 3600 )
pc.setqf("firstIn",1)
server_timer("spider_end_timer", 1200 )
pc.warp(88100,614800)
end
return
else
say(gameforge.spider_dungeon_3floor_boss._380_say)
return
end
else --<2D><><EFBFBD><EFBFBD> <20>ƴϴ<C6B4>.
say(gameforge.spider_dungeon_3floor_boss._390_say)
return
end
end
end
state inLair begin
when 20011.chat.gameforge.spider_dungeon_3floor_boss._30_npcChat with is_test_server() begin --<2D>׽<EFBFBD>Ʈ<EFBFBD><C6AE>
set_state(start)
say(gameforge.spider_dungeon_3floor_boss._40_say)
end
when login begin
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD>.
--if pc.getqf("firstIn") == 1 and party.get_leader_pid() == game.get_event_flag("spider_lair_leader_"..get_channel_id()) then
if get_global_time() < pc.getqf("retry_limit_time") - 3600 and party.get_leader_pid() == game.get_event_flag("spider_lair_leader_"..get_channel_id()) then
pc.setqf("firstIn",0)
elseif pc.getx() >= 827 and pc.getx() <= 937 and pc.gety() >= 6127 and pc.gety() <= 6257 then
pc.warp(95900,571000)
pc.remove_item(30327, 1)
else -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ðܳ<C3B0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ۿ<EFBFBD><DBBF><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20>ϰ<EFBFBD> <20>Ǹ<EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
pc.remove_item(30327, 1)
set_state( boss_ok )
local limit = pc.getqf("retry_limit_time")
if limit > ( get_global_time() + 3600 ) then
limit = ( get_global_time() + 3600 )
end
pc.setqf("retry_limit_time", limit )
local duration = limit - get_global_time()
end
end
when 30130.chat.gameforge.spider_dungeon_3floor_boss._10_npcChat begin
if game.get_event_flag("spider_lair_ongoing_"..get_channel_id()) == 1 then
local starttime = game.get_event_flag("spider_lair_start_time_"..get_channel_id())
local current_time = get_global_time()
if party.get_leader_pid() == game.get_event_flag("spider_lair_leader_"..get_channel_id()) then
if starttime + 300 >= current_time and party.get_leader_pid() == game.get_event_flag("spider_lair_leader_"..get_channel_id()) and game.get_event_flag("spider_lair_ongoing_"..get_channel_id()) == 1 then
say(gameforge.spider_dungeon_3floor_boss._300_say) -- <20>׽<EFBFBD>Ʈ<EFBFBD><C6AE>
local warp = select(locale.confirm,locale.cancel)
if warp == 1 then
pc.warp(88100,614800)
return
end
end
end
end
end
when 2092.kill begin --<2D><><EFBFBD>հŹ<D5B0> <20><><EFBFBD><EFBFBD>
server_timer("spider_dead_timer", 180)
game.set_event_flag("spider_dead"..get_channel_id(), 1)
notice_multiline(gameforge.spider_dungeon_3floor_boss._400_say,notice_in_map)
end
when 2095.kill begin --<2D>Ź̾<C5B9> <20><><EFBFBD><EFBFBD>
local kingVid = game.get_event_flag("king_vid")
local remain_egg = game.get_event_flag("remain_egg"..get_channel_id())
notice_multiline(gameforge.spider_dungeon_3floor_boss._420_notice,notice_in_map)
if remain_egg > 0 then
remain_egg = remain_egg - 1
game.set_event_flag("remain_egg"..get_channel_id(), remain_egg)
end
--<2D>Ź<EFBFBD><C5B9><EFBFBD> <20><><EFBFBD>ݷ<EFBFBD> <20><><EFBFBD><EFBFBD>
npc.set_vid_attack_mul(kingVid, 10/(remain_egg + 1))
--<2D>Ź̰<C5B9> <20>޴<EFBFBD> <20><><EFBFBD>ط<EFBFBD> <20><><EFBFBD><EFBFBD>
npc.set_vid_damage_mul(kingVid, 10/(remain_egg + 1))
end
-- 2012.4.5 <20>̻<EFBFBD><CCBB><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ <20><><EFBFBD><EFBFBD>
when 30327.use with pc.getx() >= 827 and pc.get_map_index() == 217 and pc.getx() <= 937 and pc.gety() >= 6127 and pc.gety() <= 6257 begin
--say("<22>ʹ<EFBFBD>ȣ : "..pc.get_map_index())
pc.remove_item(30327, 1)
i = mob.spawn(2095,400,566,0,0)
mob.spawn(2095,400,594,0,0)
mob.spawn(2095,362,600,0,0)
mob.spawn(2095,337,599,0,0)
mob.spawn(2095,335,581,0,0)
mob.spawn(2095,344,562,0,0)
mob.spawn(2095,364,588,0,0)
mob.spawn(2095,379,562,0,0)
mob.spawn(2095,368,525,0,0)
local kingVid = mob.spawn(2092,367,588,0,0)
game.set_event_flag("king_vid",kingVid)
--game.set_event_flag("remain_egg",9)
game.set_event_flag("remain_egg"..get_channel_id(), 9)
end
end
end

View File

@ -1,158 +0,0 @@
quest test_att_resist begin
state start begin
when 20001.chat."ATT_TEST : ITEM - BASIC" with is_test_server() begin
say("Test items for basic")
say("Check damage with these")
local item_armor
local item_helmet
local item_bracelet
local job = pc.get_job()
if job == 0 then -- WARRIOR
item_armor = 11299
item_helmet = 12249
item_bracelet = 14109
elseif job==1 then -- ASSASSIN
item_armor = 11499
item_helmet = 12389
item_bracelet = 14109
elseif job==2 then -- SURA
item_armor = 11699
item_helmet = 12529
item_bracelet = 14109
elseif job==3 then -- SHAMAN
item_armor = 11899
item_helmet = 12669
item_bracelet = 14109
end
pc.give_item2_select(item_armor)
pc.give_item2_select(item_helmet)
pc.give_item2_select(item_bracelet)
end
when 20001.chat."ATT_TEST : ITEM - FIRE" with is_test_server() begin
say("Test items for Fire resist")
say("Use items and Type /state to check resist stat")
local item_armor
local item_helmet
local item_bracelet
local job = pc.get_job()
if job == 0 then -- WARRIOR
item_armor = 11299
item_helmet = 12249
item_bracelet = 14109
elseif job==1 then -- ASSASSIN
item_armor = 11499
item_helmet = 12389
item_bracelet = 14109
elseif job==2 then -- SURA
item_armor = 11699
item_helmet = 12529
item_bracelet = 14109
elseif job==3 then -- SHAMAN
item_armor = 11899
item_helmet = 12669
item_bracelet = 14109
end
pc.give_item2_select(item_armor)
item.set_value(0, 35, 15)
pc.give_item2_select(item_helmet)
item.set_value(0, 35, 15)
pc.give_item2_select(item_bracelet)
item.set_value(0, 35, 15)
end
when 20001.chat."ATT_TEST : ITEM - ELEC" with is_test_server() begin
say("Test items for ELEC resist")
say("Use items and Type /state to check resist stat")
local item_armor
local item_helmet
local item_bracelet
local job = pc.get_job()
if job == 0 then -- WARRIOR
item_armor = 11299
item_helmet = 12249
item_bracelet = 14109
elseif job==1 then -- ASSASSIN
item_armor = 11499
item_helmet = 12389
item_bracelet = 14109
elseif job==2 then -- SURA
item_armor = 11699
item_helmet = 12529
item_bracelet = 14109
elseif job==3 then -- SHAMAN
item_armor = 11899
item_helmet = 12669
item_bracelet = 14109
end
pc.give_item2_select(item_armor)
item.set_value(0, 36, 15)
pc.give_item2_select(item_helmet)
item.set_value(0, 36, 15)
pc.give_item2_select(item_bracelet)
item.set_value(0, 36, 15)
end
when 20001.chat."ATT_TEST : ITEM - WIND" with is_test_server() begin
say("Test items for WIND resist")
say("Use items and Type /state to check resist stat")
local item_armor
local item_helmet
local item_bracelet
local job = pc.get_job()
if job == 0 then -- WARRIOR
item_armor = 11299
item_helmet = 12249
item_bracelet = 14109
elseif job==1 then -- ASSASSIN
item_armor = 11499
item_helmet = 12389
item_bracelet = 14109
elseif job==2 then -- SURA
item_armor = 11699
item_helmet = 12529
item_bracelet = 14109
elseif job==3 then -- SHAMAN
item_armor = 11899
item_helmet = 12669
item_bracelet = 14109
end
pc.give_item2_select(item_armor)
item.set_value(0, 38, 15)
pc.give_item2_select(item_helmet)
item.set_value(0, 38, 15)
pc.give_item2_select(item_bracelet)
item.set_value(0, 38, 15)
end
when 20001.chat."ATT_TEST : MOB - FIRE" with is_test_server() begin
say("spawn FIRE monster")
say("check damage with basic and resist armors")
mob.spawn(2201, pc.get_local_x(), pc.get_local_y(),0,1,1)
end
when 20001.chat."ATT_TEST : MOB - ELEC" with is_test_server() begin
say("spawn ELEC monster")
say("check damage with basic and resist armors")
mob.spawn(2401, pc.get_local_x(), pc.get_local_y(),0,1,1)
end
when 20001.chat."ATT_TEST : MOB - WIND" with is_test_server() begin
say("spawn WIND monster")
say("check damage with basic and resist armors")
mob.spawn(777, pc.get_local_x(), pc.get_local_y(),0,1,1)
end
end
end

View File

@ -174,8 +174,6 @@ guild.level
guild.name
guild.war_bet
guild.war_enter
highscore.register
highscore.show
horse.advance
horse.feed
horse.get_grade

View File

@ -1,23 +0,0 @@
#!/usr/local/bin/python
import pre_qc
import os
import sys
os.system('rm -rf object')
os.system('mkdir object')
#os.system('rm -rf pre_qc')
os.system('mkdir pre_qc')
os.system('chgrp quest object')
for line in file('locale_list'):
r = pre_qc.run (line)
if r == True:
filename = 'pre_qc/'+line
else:
filename = line
if os.system('./qc '+filename):
print 'Error occured on compile ' + line
os.system('chmod -R 770 object')
import sys
sys.exit(-1)
os.system('chmod -R 770 object')

View File

@ -1,8 +0,0 @@
quest test begin
state start begin
when 20355.chat."bbbb" begin
setskin(NOWINDOW)
say_show_item(90013)
end
end
end

View File

@ -2,15 +2,15 @@
#define __HEADER_VNUM_HELPER__
/**
<EFBFBD>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰų<CFB0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD> <20>ҽ<EFBFBD><D2BD><EFBFBD><EFBFBD><EFBFBD> <20>ĺ<EFBFBD><C4BA><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
<EFBFBD>ĺ<EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>=VNum)<29><> <20>ϵ<EFBFBD><CFB5>ڵ<EFBFBD><DAB5>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE>־ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ſ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>
이미 존재하거나 앞으로 추가될 아이템, 몹 등을 소스에서 식별할 때 현재는 모두
식별자(숫자=VNum)를 하드코딩하는 방식으로 되어있어서 가독성이 매우 떨어지는데
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD> <20>ҽ<EFBFBD><D2BD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><C8A4> <20><>)<29><><EFBFBD><EFBFBD> <20><> <20><> <20>ְ<EFBFBD> <20><><EFBFBD>ڴ<EFBFBD> <20><>ö<EFBFBD><C3B6><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD>.
앞으로는 소스만 봐도 어떤 아이템(혹은 몹)인지 알 수 있게 하자는 승철님의 제안으로 추가.
* <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵµ<C7B4> PCH<43><48> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ü <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ؾ<EFBFBD><D8BE>ϴ<EFBFBD>
<EFBFBD>ϴ<EFBFBD><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> cpp<70><70><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD> include <20>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
* 이 파일은 변경이 잦을것으로 예상되는데 PCH에 넣으면 바뀔 때마다 전체 컴파일 해야하니
일단은 필요한 cpp파일에서 include 해서 쓰도록 했음.
* cpp<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ~ <20><>ũ<EFBFBD>ؾ<EFBFBD><D8BE>ϴ<EFBFBD> <20>׳<EFBFBD> common<6F><6E> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD>. (game, db<64><62><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
* cpp에서 구현하면 컴파일 ~ 링크해야하니 그냥 common에 헤더만 넣었음. (game, db프로젝트 둘 다 사용 예정)
@date 2011. 8. 29.
*/
@ -19,35 +19,35 @@
class CItemVnumHelper
{
public:
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> DVD<56><44> <20>һ<EFBFBD><D2BB><EFBFBD> <20><>ȯ<EFBFBD><C8AF>
static const bool IsPhoenix(DWORD vnum) { return 53001 == vnum; } // NOTE: <EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD> <20><>ȯ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 53001 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> mob-vnum<EFBFBD><EFBFBD> 34001 <EFBFBD>Դϴ<EFBFBD>.
/// 독일 DVD용 불사조 소환권
static const bool IsPhoenix(DWORD vnum) { return 53001 == vnum; } // NOTE: 불사조 소환 아이템은 53001 이지만 mob-vnum 34001 입니다.
/// <EFBFBD>󸶴<EFBFBD> <20>̺<EFBFBD>Ʈ <20>ʽ´<CABD><C2B4><EFBFBD> <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>󸶴<EFBFBD> <20>̺<EFBFBD>Ʈ<EFBFBD><C6AE> Ư<><C6AF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD><CCBE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ȱ<EFBFBD><C8B0><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ٰ<EFBFBD> <20><>)
/// 라마단 이벤트 초승달의 반지 (원래는 라마단 이벤트용 특수 아이템이었으나 앞으로 여러 방향으로 재활용해서 계속 쓴다고 함)
static const bool IsRamadanMoonRing(DWORD vnum) { return 71135 == vnum; }
/// <EFBFBD>ҷ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʽ´<CABD><C2B4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
/// 할로윈 사탕 (스펙은 초승달의 반지와 동일)
static const bool IsHalloweenCandy(DWORD vnum) { return 71136 == vnum; }
/// ũ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0BAB9> <20><><EFBFBD><EFBFBD>
/// 크리스마스 행복의 반지
static const bool IsHappinessRing(DWORD vnum) { return 71143 == vnum; }
/// <EFBFBD>߷<EFBFBD>Ÿ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ҵ<EFBFBD>Ʈ
/// 발렌타인 사랑의 팬던트
static const bool IsLovePendant(DWORD vnum) { return 71145 == vnum; }
};
class CMobVnumHelper
{
public:
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> DVD<56><44> <20>һ<EFBFBD><D2BB><EFBFBD> <20><> <20><>ȣ
/// 독일 DVD용 불사조 몹 번호
static bool IsPhoenix(DWORD vnum) { return 34001 == vnum; }
static bool IsIcePhoenix(DWORD vnum) { return 34003 == vnum; }
/// PetSystem<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD>ΰ<EFBFBD>?
/// PetSystem이 관리하는 펫인가?
static bool IsPetUsingPetSystem(DWORD vnum) { return (IsPhoenix(vnum) || IsReindeerYoung(vnum)) || IsIcePhoenix(vnum); }
/// 2011<EFBFBD><EFBFBD> ũ<><C5A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̺<EFBFBD>Ʈ<EFBFBD><C6AE> <20><> (<28>Ʊ<EFBFBD> <20><><EFBFBD><EFBFBD>)
/// 2011년 크리스마스 이벤트용 펫 (아기 순록)
static bool IsReindeerYoung(DWORD vnum) { return 34002 == vnum; }
/// <EFBFBD>󸶴<EFBFBD> <20>̺<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>渶(20119) .. <20>ҷ<EFBFBD><D2B7><EFBFBD> <20>̺<EFBFBD>Ʈ<EFBFBD><C6AE> <20>󸶴<EFBFBD> <20>渶 Ŭ<><C5AC>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, 20219)
/// 라마단 이벤트 보상용 흑마(20119) .. 할로윈 이벤트용 라마단 흑마 클론(스펙은 같음, 20219)
static bool IsRamadanBlackHorse(DWORD vnum) { return 20119 == vnum || 20219 == vnum || 22022 == vnum; }
};

View File

@ -26,7 +26,7 @@ public:
int get_price () { return offer_price; }
} TAuctionSimpleItemInfo;
// <EFBFBD><EFBFBD> auction <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// auction 정보들.
// primary key (item_id)
typedef struct _auction : public _base_auction
{
@ -49,8 +49,8 @@ public:
empire = _empire;
}
// <EFBFBD><EFBFBD> <20>޼ҵ<DEBC><D2B5><EFBFBD><EFBFBD><EFBFBD> <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> auction<6F><6E><EFBFBD><EFBFBD> <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD><CFB4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҵ<EFBFBD>.
// 이 메소드들은 어떤 변수가 auction에서 어떤 역할을 하는지 까먹을 까봐
// 만들어놓았다.
// by rtsummit
DWORD get_item_id () { return item_id; }
DWORD get_bidder_id () { return bidder_id; }
@ -89,7 +89,7 @@ typedef struct _sale : public _base_auction
} TSaleItemInfo;
// wish<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
// wish는 실제하는 아이템은 없다.
// primary key (item_num, wisher_id)
typedef struct _wish : public _base_auction
{
@ -118,9 +118,9 @@ enum AuctionCmd {OPEN_AUCTION, OPEN_WISH_AUCTION, OPEN_MY_AUCTION, OPEN_MY_WISH_
AUCTION_REBID, AUCTION_BID_CANCEL,
};
// <EFBFBD>ݵ<EFBFBD><EFBFBD><EFBFBD> FAIL <EFBFBD>տ<EFBFBD>, <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20>;<EFBFBD><CDBE>Ѵ<EFBFBD>.
// <EFBFBD>ֳ<EFBFBD>, <= AUCTION_FAIL <EFBFBD>̷<EFBFBD> CHECK<EFBFBD><EFBFBD> <20><> <20>Űŵ<C5B0>
// <EFBFBD>ݴ<EFBFBD><EFBFBD><EFBFBD> SUCCESS <EFBFBD>ڿ<EFBFBD>, <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20>;<EFBFBD><CDBE>Ѵ<EFBFBD>. <20>ٵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֱ<EFBFBD> <20>Ϸ<EFBFBD><CFB7><EFBFBD>...
// 반드시 FAIL 앞에, 실패 류 들이 와야한다.
// 왜냐, <= AUCTION_FAIL 이런 CHECK을 할 거거든
// 반대로 SUCCESS 뒤에, 성공 류 들이 와야한다. 근데 성공류가 있긴 하려나...
enum AuctionResult { AUCTION_EXPIRED, AUCTION_NOT_EXPIRED, AUCTION_NOT_ENOUGH_MONEY,
AUCTION_SOLD, AUCTION_CANCEL, AUCTION_ALREADY_IN, AUCTION_NOT_IN, AUCTION_FAIL, AUCTION_SUCCESS };
@ -218,7 +218,7 @@ typedef struct command_auction
cmd = AUCTION_CHANGING_MONEY;
price1 = _money;
}
// bid<EFBFBD><EFBFBD> cmd<EFBFBD><EFBFBD> <20>ٸ<EFBFBD><D9B8><EFBFBD>.
// bid cmd만 다르다.
void rebid (DWORD _item_id, int _bidPrice)
{
cmd = AUCTION_REBID;
@ -322,7 +322,7 @@ typedef struct auction_impur : public command_auction
// auction_type;
// start_idx;
// size;
// conditions; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ö<EFBFBD>Բ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>غ<EFBFBD><D8BA><EFBFBD>.<2E><><EFBFBD><EFBFBD>
// conditions; 정렬은 승철님께 조언을 구해보자.ㅇㅇ
//}
//
//get_auction_detail_item_info

View File

@ -1,15 +0,0 @@
#ifndef __INC_METIN_II_COMMON_BILLING_H__
#define __INC_METIN_II_COMMON_BILLING_H__
enum EBillingTypes
{
BILLING_NONE,
BILLING_IP_FREE,
BILLING_FREE,
BILLING_IP_TIME,
BILLING_IP_DAY,
BILLING_TIME,
BILLING_DAY,
};
#endif

View File

@ -41,8 +41,8 @@ namespace building
int lNPCX;
int lNPCY;
DWORD dwGroupVnum; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׷<EFBFBD><D7B7><EFBFBD> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20>Ǽ<EFBFBD><C7BC><EFBFBD><EFBFBD><EFBFBD>
DWORD dwDependOnGroupVnum; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>׷<EFBFBD>
DWORD dwGroupVnum; // 같은 그룹은 하나만 건설가능
DWORD dwDependOnGroupVnum; // 지어져 있어야하는 그룹
} TObjectProto;
typedef struct SObject

View File

@ -31,8 +31,8 @@ enum EItemDragonSoulSockets
ITEM_SOCKET_DRAGON_SOUL_ACTIVE_IDX = 2,
ITEM_SOCKET_CHARGING_AMOUNT_IDX = 2,
};
// <EFBFBD><EFBFBD> <20>̰<EFBFBD> <20><>ģ<EFBFBD><C4A3> <20>ƴϾ<C6B4>?
// <EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD> <20><><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD>ϸ<EFBFBD> <20><>¼<EFBFBD><C2BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -_-;;;
// 헐 이거 미친거 아니야?
// 나중에 소켓 확장하면 어쩌려고 이지랄 -_-;;;
enum EItemUniqueSockets
{
ITEM_SOCKET_UNIQUE_SAVE_TIME = ITEM_SOCKET_MAX_NUM - 2,
@ -42,18 +42,18 @@ enum EItemUniqueSockets
enum EItemTypes
{
ITEM_NONE, //0
ITEM_WEAPON, //1//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ITEM_ARMOR, //2//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ITEM_USE, //3//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
ITEM_WEAPON, //1//무기
ITEM_ARMOR, //2//갑옷
ITEM_USE, //3//아이템 사용
ITEM_AUTOUSE, //4
ITEM_MATERIAL, //5
ITEM_SPECIAL, //6 //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ITEM_SPECIAL, //6 //스페셜 아이템
ITEM_TOOL, //7
ITEM_LOTTERY, //8//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ITEM_ELK, //9//<EFBFBD><EFBFBD>
ITEM_LOTTERY, //8//복권
ITEM_ELK, //9//
ITEM_METIN, //10
ITEM_CONTAINER, //11
ITEM_FISH, //12//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ITEM_FISH, //12//낚시
ITEM_ROD, //13
ITEM_RESOURCE, //14
ITEM_CAMPFIRE, //15
@ -61,21 +61,21 @@ enum EItemTypes
ITEM_SKILLBOOK, //17
ITEM_QUEST, //18
ITEM_POLYMORPH, //19
ITEM_TREASURE_BOX, //20//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ITEM_TREASURE_KEY, //21//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
ITEM_TREASURE_BOX, //20//보물상자
ITEM_TREASURE_KEY, //21//보물상자 열쇠
ITEM_SKILLFORGET, //22
ITEM_GIFTBOX, //23
ITEM_PICK, //24
ITEM_HAIR, //25//<EFBFBD>Ӹ<EFBFBD>
ITEM_TOTEM, //26//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ITEM_BLEND, //27//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɶ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>Ӽ<EFBFBD><D3BC><EFBFBD> <20>ٴ<EFBFBD> <20>
ITEM_COSTUME, //28//<EFBFBD>ڽ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (2011<31><31> 8<><38> <20>߰<EFBFBD><DFB0><EFBFBD> <20>ڽ<EFBFBD><DABD><EFBFBD> <20>ý<EFBFBD><C3BD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
ITEM_DS, //29 //<EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD>
ITEM_SPECIAL_DS, //30 // Ư<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȥ<EFBFBD><C8A5> (DS_SLOT<4F><54> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> UNIQUE <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20><>)
ITEM_EXTRACT, //31 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
ITEM_SECONDARY_COIN, //32 ?? <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>??
ITEM_RING, //33 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ITEM_BELT, //34 <EFBFBD><EFBFBD>Ʈ
ITEM_HAIR, //25//머리
ITEM_TOTEM, //26//토템
ITEM_BLEND, //27//생성될때 랜덤하게 속성이 붙는 약물
ITEM_COSTUME, //28//코스츔 아이템 (2011년 8월 추가된 코스츔 시스템용 아이템)
ITEM_DS, //29 //용혼석
ITEM_SPECIAL_DS, //30 // 특수한 용혼석 (DS_SLOT에 착용하는 UNIQUE 아이템이라 생각하면 됨)
ITEM_EXTRACT, //31 추출도구.
ITEM_SECONDARY_COIN, //32 ?? 명도전??
ITEM_RING, //33 반지
ITEM_BELT, //34 벨트
};
enum EMetinSubTypes
@ -111,8 +111,8 @@ enum EArmorSubTypes
enum ECostumeSubTypes
{
COSTUME_BODY = ARMOR_BODY, // [<EFBFBD>߿<EFBFBD>!!] ECostumeSubTypes enum value<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> EArmorSubTypes<EFBFBD><EFBFBD> <20>װͰ<D7B0> <20><><EFBFBD>ƾ<EFBFBD> <20><>.
COSTUME_HAIR = ARMOR_HEAD, // <EFBFBD>̴<EFBFBD> <20>ڽ<EFBFBD><DABD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20>߰<EFBFBD> <20>Ӽ<EFBFBD><D3BC><EFBFBD> <20><><EFBFBD>̰ڴٴ<DAB4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>û<EFBFBD><C3BB> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȱ<><C8B0><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
COSTUME_BODY = ARMOR_BODY, // [중요!!] ECostumeSubTypes enum value는 종류별로 EArmorSubTypes의 그것과 같아야 함.
COSTUME_HAIR = ARMOR_HEAD, // 이는 코스츔 아이템에 추가 속성을 붙이겠다는 사업부의 요청에 따라서 기존 로직을 활용하기 위함임.
COSTUME_NUM_TYPES,
};
@ -215,8 +215,8 @@ enum EUseSubTypes
USE_UNBIND,
USE_TIME_CHARGE_PER,
USE_TIME_CHARGE_FIX, // 28
USE_PUT_INTO_BELT_SOCKET, // 29 <EFBFBD><EFBFBD>Ʈ <20><><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
USE_PUT_INTO_RING_SOCKET, // 30 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD>ũ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
USE_PUT_INTO_BELT_SOCKET, // 29 벨트 소켓에 사용할 수 있는 아이템
USE_PUT_INTO_RING_SOCKET, // 30 반지 소켓에 사용할 수 있는 아이템 (유니크 반지 말고, 새로 추가된 반지 슬롯)
};
enum EExtractSubTypes
@ -270,7 +270,7 @@ enum EItemFlag
{
ITEM_FLAG_REFINEABLE = (1 << 0),
ITEM_FLAG_SAVE = (1 << 1),
ITEM_FLAG_STACKABLE = (1 << 2), // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ĥ <20><> <20><><EFBFBD><EFBFBD>
ITEM_FLAG_STACKABLE = (1 << 2), // 여러개 합칠 수 있음
ITEM_FLAG_COUNT_PER_1GOLD = (1 << 3),
ITEM_FLAG_SLOW_QUERY = (1 << 4),
ITEM_FLAG_UNUSED01 = (1 << 5), // UNUSED
@ -287,24 +287,24 @@ enum EItemFlag
enum EItemAntiFlag
{
ITEM_ANTIFLAG_FEMALE = (1 << 0), // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ұ<EFBFBD>
ITEM_ANTIFLAG_MALE = (1 << 1), // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ұ<EFBFBD>
ITEM_ANTIFLAG_WARRIOR = (1 << 2), // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ұ<EFBFBD>
ITEM_ANTIFLAG_ASSASSIN = (1 << 3), // <EFBFBD>ڰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ұ<EFBFBD>
ITEM_ANTIFLAG_SURA = (1 << 4), // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ұ<EFBFBD>
ITEM_ANTIFLAG_SHAMAN = (1 << 5), // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ұ<EFBFBD>
ITEM_ANTIFLAG_GET = (1 << 6), // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
ITEM_ANTIFLAG_DROP = (1 << 7), // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
ITEM_ANTIFLAG_SELL = (1 << 8), // <EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
ITEM_ANTIFLAG_EMPIRE_A = (1 << 9), // A <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ұ<EFBFBD>
ITEM_ANTIFLAG_EMPIRE_B = (1 << 10), // B <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ұ<EFBFBD>
ITEM_ANTIFLAG_EMPIRE_C = (1 << 11), // C <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ұ<EFBFBD>
ITEM_ANTIFLAG_SAVE = (1 << 12), // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
ITEM_ANTIFLAG_GIVE = (1 << 13), // <EFBFBD>ŷ<EFBFBD> <20>Ұ<EFBFBD>
ITEM_ANTIFLAG_PKDROP = (1 << 14), // PK<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
ITEM_ANTIFLAG_STACK = (1 << 15), // <EFBFBD><EFBFBD>ĥ <20><> <20><><EFBFBD><EFBFBD>
ITEM_ANTIFLAG_MYSHOP = (1 << 16), // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ø<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
ITEM_ANTIFLAG_SAFEBOX = (1 << 17), // â<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
ITEM_ANTIFLAG_FEMALE = (1 << 0), // 여성 사용 불가
ITEM_ANTIFLAG_MALE = (1 << 1), // 남성 사용 불가
ITEM_ANTIFLAG_WARRIOR = (1 << 2), // 무사 사용 불가
ITEM_ANTIFLAG_ASSASSIN = (1 << 3), // 자객 사용 불가
ITEM_ANTIFLAG_SURA = (1 << 4), // 수라 사용 불가
ITEM_ANTIFLAG_SHAMAN = (1 << 5), // 무당 사용 불가
ITEM_ANTIFLAG_GET = (1 << 6), // 집을 수 없음
ITEM_ANTIFLAG_DROP = (1 << 7), // 버릴 수 없음
ITEM_ANTIFLAG_SELL = (1 << 8), // 팔 수 없음
ITEM_ANTIFLAG_EMPIRE_A = (1 << 9), // A 제국 사용 불가
ITEM_ANTIFLAG_EMPIRE_B = (1 << 10), // B 제국 사용 불가
ITEM_ANTIFLAG_EMPIRE_C = (1 << 11), // C 제국 사용 불가
ITEM_ANTIFLAG_SAVE = (1 << 12), // 저장되지 않음
ITEM_ANTIFLAG_GIVE = (1 << 13), // 거래 불가
ITEM_ANTIFLAG_PKDROP = (1 << 14), // PK시 떨어지지 않음
ITEM_ANTIFLAG_STACK = (1 << 15), // 합칠 수 없음
ITEM_ANTIFLAG_MYSHOP = (1 << 16), // 개인 상점에 올릴 수 없음
ITEM_ANTIFLAG_SAFEBOX = (1 << 17), // 창고에 넣을 수 없음
};
enum EItemWearableFlag
@ -333,18 +333,20 @@ enum ELimitTypes
LIMIT_DEX,
LIMIT_INT,
LIMIT_CON,
// TODO: Remove this and re-check the validity of item_proto afterwards
LIMIT_PCBANG,
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ο<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ǽð<C7BD><C3B0><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD> (socket0<74><30> <20>Ҹ<EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD>: unix_timestamp Ÿ<EFBFBD><EFBFBD>)
/// 착용 여부와 상관 없이 실시간으로 시간 차감 (socket0에 소멸 시간이 박힘: unix_timestamp 타입)
LIMIT_REAL_TIME,
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> ó<><C3B3> <20><><EFBFBD><EFBFBD><><C8A4> <20><><EFBFBD><EFBFBD>) <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8> Ÿ<≯<EFBFBD> <20><><EFBFBD><EFBFBD>
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> socket0<74><30> <20><><EFBFBD><EFBFBD>ɽð<C9BD>(<28>ʴ<EFBFBD><CAB4><EFBFBD>, 0<≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> limit value<75><65> <20><><EFBFBD><EFBFBD>) <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ִٰ<D6B4>
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> socket1<74><31> <20><><EFBFBD><EFBFBD> Ƚ<><C8BD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> socket0<EFBFBD><EFBFBD> unix_timestamp Ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ҹ<EFBFBD><D2B8>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD>.
/// 아이템을 맨 처음 사용(혹은 착용) 한 순간부터 리얼타임 타이머 시작
/// 최초 사용 전에는 socket0에 사용가능시간(초단위, 0이면 프로토의 limit value값 사용) 값이 쓰여있다가
/// 아이템 사용시 socket1에 사용 횟수가 박히고 socket0 unix_timestamp 타입의 소멸시간이 박힘.
LIMIT_REAL_TIME_START_FIRST_USE,
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// socket0<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20>ʴ<EFBFBD><CAB4><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ش<EFBFBD> <20><><EFBFBD><EFBFBD> 0<≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> limit value<EFBFBD><EFBFBD><EFBFBD><EFBFBD> socket0<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
/// 아이템을 착용 중일 때만 사용 시간이 차감되는 아이템
/// socket0에 남은 시간이 초단위로 박힘. (아이템 최초 사용시 해당 값이 0이면 프로토의 limit value값을 socket0에 복사)
LIMIT_TIMER_BASED_ON_WEAR,
LIMIT_MAX_NUM

View File

@ -16,17 +16,15 @@ enum EMisc
ABILITY_MAX_NUM = 50,
EMPIRE_MAX_NUM = 4,
BANWORD_MAX_LEN = 24,
SMS_MAX_LEN = 80,
MOBILE_MAX_LEN = 32,
SOCIAL_ID_MAX_LEN = 18,
MAP_ALLOW_MAX_LEN = 128,
GUILD_NAME_MAX_LEN = 12,
SHOP_HOST_ITEM_MAX_NUM = 40, /* ȣ<EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> */
SHOP_GUEST_ITEM_MAX_NUM = 18, /* <EFBFBD>Խ<EFBFBD>Ʈ<EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> */
SHOP_HOST_ITEM_MAX_NUM = 40, /* 호스트의 최대 아이템 개수 */
SHOP_GUEST_ITEM_MAX_NUM = 18, /* 게스트의 최대 아이템 개수 */
SHOP_PRICELIST_MAX_NUM = 40, ///< <EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>
SHOP_PRICELIST_MAX_NUM = 40, ///< 개인상점 가격정보 리스트에서 유지할 가격정보의 최대 갯수
CHAT_MAX_LEN = 512,
@ -80,19 +78,19 @@ enum EMisc
/**
**** <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ҵ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (DB<EFBFBD><EFBFBD> Item Position) ****
**** 현재까지 할당 된 아이템 영역 정리 (DB Item Position) ****
+------------------------------------------------------+ 0
| ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><20>κ<EFBFBD><CEBA> (45ĭ * 2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) 90ĭ |
| 캐릭터 기본 인벤토리 (45 * 2페이지) 90 |
+------------------------------------------------------+ 90 = INVENTORY_MAX_NUM(90)
| ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> â (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) 32ĭ |
| 캐릭터 장비 창 (착용중인 아이템) 32 |
+------------------------------------------------------+ 122 = INVENTORY_MAX_NUM(90) + WEAR_MAX_NUM(32)
| <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> â (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȥ<EFBFBD><C8A5>) 12ĭ |
| 용혼석 장비 창 (착용중인 용혼석) 12 |
+------------------------------------------------------+ 134 = 122 + DS_SLOT_MAX(6) * DRAGON_SOUL_DECK_MAX_NUM(2)
| <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> â <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD> <20>̻<EFBFBD><CCBB><EFBFBD>) 18ĭ |
| 용혼석 장비 창 예약 (아직 미사용) 18 |
+------------------------------------------------------+ 152 = 134 + DS_SLOT_MAX(6) * DRAGON_SOUL_DECK_RESERVED_MAX_NUM(3)
| <EFBFBD><EFBFBD>Ʈ <20>κ<EFBFBD><CEBA>丮 (<28><>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD> <20><>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ȱ<><C8B0>)|
| 벨트 인벤토리 (벨트 착용시에만 벨트 레벨에 따라 활성)|
+------------------------------------------------------+ 168 = 152 + BELT_INVENTORY_SLOT_COUNT(16) = INVENTORY_AND_EQUIP_CELL_MAX
| <EFBFBD>̻<EFBFBD><EFBFBD><EFBFBD> |
| 미사용 |
+------------------------------------------------------+ ??
*/
};
@ -127,10 +125,10 @@ enum EWearPositions
WEAR_COSTUME_BODY, // 19
WEAR_COSTUME_HAIR, // 20
WEAR_RING1, // 21 : <EFBFBD>ű<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1 (<28><><EFBFBD><EFBFBD>)
WEAR_RING2, // 22 : <EFBFBD>ű<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2 (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
WEAR_RING1, // 21 : 신규 반지슬롯1 (왼쪽)
WEAR_RING2, // 22 : 신규 반지슬롯2 (오른쪽)
WEAR_BELT, // 23 : <EFBFBD>ű<EFBFBD> <20><>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD>
WEAR_BELT, // 23 : 신규 벨트슬롯
WEAR_MAX = 32 //
};
@ -141,7 +139,7 @@ enum EDragonSoulDeckType
DRAGON_SOUL_DECK_1,
DRAGON_SOUL_DECK_MAX_NUM = 2,
DRAGON_SOUL_DECK_RESERVED_MAX_NUM = 3, // NOTE: <EFBFBD>߿<EFBFBD>! <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, 3<><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>з<EFBFBD><D0B7><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><>. DS DECK<43><4B> <20>ø<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ݵ<EFBFBD><DDB5><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>ŭ RESERVED<45><44><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <20><>!
DRAGON_SOUL_DECK_RESERVED_MAX_NUM = 3, // NOTE: 중요! 아직 사용중이진 않지만, 3페이지 분량을 예약 해 둠. DS DECK을 늘릴 경우 반드시 그 수만큼 RESERVED에서 차감해야 함!
};
enum ESex
@ -163,7 +161,7 @@ enum EDirection
DIR_MAX_NUM
};
#define ABILITY_MAX_LEVEL 10 /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> */
#define ABILITY_MAX_LEVEL 10 /* 기술 최대 레벨 */
enum EAbilityDifficulty
{
@ -176,9 +174,9 @@ enum EAbilityDifficulty
enum EAbilityCategory
{
CATEGORY_PHYSICAL, /* <EFBFBD><EFBFBD>ü<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƽ */
CATEGORY_MENTAL, /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƽ */
CATEGORY_ATTRIBUTE, /* <EFBFBD>ɷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƽ */
CATEGORY_PHYSICAL, /* 신체적 어빌리티 */
CATEGORY_MENTAL, /* 정신적 어빌리티 */
CATEGORY_ATTRIBUTE, /* 능력 어빌리티 */
CATEGORY_NUM_TYPES
};
@ -248,13 +246,13 @@ enum EParts
enum EChatType
{
CHAT_TYPE_TALKING, /* <EFBFBD>׳<EFBFBD> ä<><C3A4> */
CHAT_TYPE_INFO, /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><>) */
CHAT_TYPE_NOTICE, /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
CHAT_TYPE_PARTY, /* <EFBFBD><EFBFBD>Ƽ<EFBFBD><EFBFBD> */
CHAT_TYPE_GUILD, /* <EFBFBD><EFBFBD><EFBFBD> */
CHAT_TYPE_COMMAND, /* <EFBFBD>Ϲ<EFBFBD> <20><><EFBFBD><EFBFBD> */
CHAT_TYPE_SHOUT, /* <EFBFBD><EFBFBD>ġ<EFBFBD><EFBFBD> */
CHAT_TYPE_TALKING, /* 그냥 채팅 */
CHAT_TYPE_INFO, /* 정보 (아이템을 집었다, 경험치를 얻었다. 등) */
CHAT_TYPE_NOTICE, /* 공지사항 */
CHAT_TYPE_PARTY, /* 파티말 */
CHAT_TYPE_GUILD, /* 길드말 */
CHAT_TYPE_COMMAND, /* 일반 명령 */
CHAT_TYPE_SHOUT, /* 외치기 */
CHAT_TYPE_WHISPER,
CHAT_TYPE_BIG_NOTICE,
CHAT_TYPE_MONARCH_NOTICE,
@ -397,38 +395,38 @@ enum EApplyTypes
APPLY_ATTBONUS_SURA, // 61
APPLY_ATTBONUS_SHAMAN, // 62
APPLY_ATTBONUS_MONSTER, // 63
APPLY_MALL_ATTBONUS, // 64 <EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD> +x%
APPLY_MALL_DEFBONUS, // 65 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> +x%
APPLY_MALL_EXPBONUS, // 66 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ +x%
APPLY_MALL_ITEMBONUS, // 67 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> x/10<EFBFBD><EFBFBD>
APPLY_MALL_GOLDBONUS, // 68 <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> x/10<EFBFBD><EFBFBD>
APPLY_MAX_HP_PCT, // 69 <EFBFBD>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> +x%
APPLY_MAX_SP_PCT, // 70 <EFBFBD>ִ<EFBFBD> <20><><EFBFBD>ŷ<EFBFBD> +x%
APPLY_SKILL_DAMAGE_BONUS, // 71 <EFBFBD><EFBFBD>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> * (100+x)%
APPLY_NORMAL_HIT_DAMAGE_BONUS, // 72 <EFBFBD><EFBFBD>Ÿ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> * (100+x)%
APPLY_SKILL_DEFEND_BONUS, // 73 <EFBFBD><EFBFBD>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> * (100-x)%
APPLY_NORMAL_HIT_DEFEND_BONUS, // 74 <EFBFBD><EFBFBD>Ÿ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> * (100-x)%
APPLY_PC_BANG_EXP_BONUS, // 75 PC<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> EXP <20><><EFBFBD>ʽ<EFBFBD>
APPLY_PC_BANG_DROP_BONUS, // 76 PC<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ʽ<EFBFBD>
APPLY_MALL_ATTBONUS, // 64 공격력 +x%
APPLY_MALL_DEFBONUS, // 65 방어력 +x%
APPLY_MALL_EXPBONUS, // 66 경험치 +x%
APPLY_MALL_ITEMBONUS, // 67 아이템 드롭율 x/10
APPLY_MALL_GOLDBONUS, // 68 돈 드롭율 x/10
APPLY_MAX_HP_PCT, // 69 최대 생명력 +x%
APPLY_MAX_SP_PCT, // 70 최대 정신력 +x%
APPLY_SKILL_DAMAGE_BONUS, // 71 스킬 데미지 * (100+x)%
APPLY_NORMAL_HIT_DAMAGE_BONUS, // 72 평타 데미지 * (100+x)%
APPLY_SKILL_DEFEND_BONUS, // 73 스킬 데미지 방어 * (100-x)%
APPLY_NORMAL_HIT_DEFEND_BONUS, // 74 평타 데미지 방어 * (100-x)%
APPLY_PC_BANG_EXP_BONUS, // 75 PC방 아이템 EXP 보너스
APPLY_PC_BANG_DROP_BONUS, // 76 PC방 아이템 드롭율 보너스
APPLY_EXTRACT_HP_PCT, // 77 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> HP <EFBFBD>Ҹ<EFBFBD>
APPLY_EXTRACT_HP_PCT, // 77 사용시 HP 소모
APPLY_RESIST_WARRIOR, // 78 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
APPLY_RESIST_ASSASSIN, // 79 <EFBFBD>ڰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
APPLY_RESIST_SURA, // 80 <EFBFBD><EFBFBD><EFBFBD>󿡰<EFBFBD> <20><><EFBFBD><EFBFBD>
APPLY_RESIST_SHAMAN, // 81 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
APPLY_ENERGY, // 82 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
APPLY_DEF_GRADE, // 83 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. DEF_GRADE_BONUS<EFBFBD><EFBFBD> Ŭ<>󿡼<EFBFBD> <20>ι<EFBFBD><CEB9><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ǵ<EFBFBD><C7B5><EFBFBD> <20><><EFBFBD><EFBFBD>(...)<29><> <20>ִ<EFBFBD>.
APPLY_COSTUME_ATTR_BONUS, // 84 <EFBFBD>ڽ<EFBFBD>Ƭ <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ӽ<EFBFBD>ġ <20><><EFBFBD>ʽ<EFBFBD>
APPLY_MAGIC_ATTBONUS_PER, // 85 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ݷ<EFBFBD> +x%
APPLY_MELEE_MAGIC_ATTBONUS_PER, // 86 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> + <20>и<EFBFBD> <20><><EFBFBD>ݷ<EFBFBD> +x%
APPLY_RESIST_WARRIOR, // 78 무사에게 저항
APPLY_RESIST_ASSASSIN, // 79 자객에게 저항
APPLY_RESIST_SURA, // 80 수라에게 저항
APPLY_RESIST_SHAMAN, // 81 무당에게 저항
APPLY_ENERGY, // 82 기력
APPLY_DEF_GRADE, // 83 방어력. DEF_GRADE_BONUS는 클라에서 두배로 보여지는 의도된 버그(...)가 있다.
APPLY_COSTUME_ATTR_BONUS, // 84 코스튬 아이템에 붙은 속성치 보너스
APPLY_MAGIC_ATTBONUS_PER, // 85 마법 공격력 +x%
APPLY_MELEE_MAGIC_ATTBONUS_PER, // 86 마법 + 밀리 공격력 +x%
APPLY_RESIST_ICE, // 87 <EFBFBD>ñ<EFBFBD> <20><><EFBFBD><EFBFBD>
APPLY_RESIST_EARTH, // 88 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
APPLY_RESIST_DARK, // 89 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
APPLY_RESIST_ICE, // 87 냉기 저항
APPLY_RESIST_EARTH, // 88 대지 저항
APPLY_RESIST_DARK, // 89 어둠 저항
APPLY_ANTI_CRITICAL_PCT, //90 ũ<EFBFBD><EFBFBD>Ƽ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
APPLY_ANTI_PENETRATE_PCT, //91 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ÿ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
APPLY_ANTI_CRITICAL_PCT, //90 크리티컬 저항
APPLY_ANTI_PENETRATE_PCT, //91 관통타격 저항
MAX_APPLY_NUM, //
@ -580,7 +578,7 @@ enum EGuildWarState
GUILD_WAR_OVER,
GUILD_WAR_RESERVE,
GUILD_WAR_DURATION = 30*60, // 1<EFBFBD>ð<EFBFBD>
GUILD_WAR_DURATION = 30*60, // 1시간
GUILD_WAR_WIN_POINT = 1000,
GUILD_WAR_LADDER_HALF_PENALTY_TIME = 12*60*60,
};
@ -624,13 +622,13 @@ enum EMoneyLogType
enum EPremiumTypes
{
PREMIUM_EXP, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ<EFBFBD><EFBFBD> 1.2<EFBFBD><EFBFBD>
PREMIUM_ITEM, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2<><32>
PREMIUM_SAFEBOX, // â<EFBFBD><EFBFBD><EFBFBD><EFBFBD><31><C4AD><EFBFBD><EFBFBD> 3ĭ
PREMIUM_AUTOLOOT, // <EFBFBD><EFBFBD> <20>ڵ<EFBFBD> <20>ݱ<EFBFBD>
PREMIUM_FISH_MIND, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ȯ<><C8AE> <20><><EFBFBD><EFBFBD>
PREMIUM_MARRIAGE_FAST, // <EFBFBD>ݽ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.
PREMIUM_GOLD, // <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1.5<EFBFBD><EFBFBD>
PREMIUM_EXP, // 경험치가 1.2
PREMIUM_ITEM, // 아이템 드롭율이 2배
PREMIUM_SAFEBOX, // 창고가 1칸에서 3
PREMIUM_AUTOLOOT, // 돈 자동 줍기
PREMIUM_FISH_MIND, // 고급 물고기 낚일 확률 상승
PREMIUM_MARRIAGE_FAST, // 금실 증가 양을 빠르게합니다.
PREMIUM_GOLD, // 돈 드롭율이 1.5
PREMIUM_MAX_NUM = 9
};
@ -660,10 +658,10 @@ enum SPECIAL_EFFECT
SE_AUTO_HPUP,
SE_AUTO_SPUP,
SE_EQUIP_RAMADAN_RING, // <EFBFBD>󸶴<EFBFBD> <20>ʽ´<CABD><C2B4><EFBFBD> <20><><EFBFBD><EFBFBD>(71135) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>Ʈ (<28>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>ƴ<EFBFBD>)
SE_EQUIP_HALLOWEEN_CANDY, // <EFBFBD>ҷ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(-_-;)<29><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ߵ<EFBFBD><DFB5>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ
SE_EQUIP_HAPPINESS_RING, // ũ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0BAB9> <20><><EFBFBD><EFBFBD>(71143) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>Ʈ (<28>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>ƴ<EFBFBD>)
SE_EQUIP_LOVE_PENDANT, // <EFBFBD>߷<EFBFBD>Ÿ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ҵ<EFBFBD>Ʈ(71145) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>Ʈ (<28>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>ƴ<EFBFBD>)
SE_EQUIP_RAMADAN_RING, // 라마단 초승달의 반지(71135) 착용할 때 이펙트 (발동이펙트임, 지속이펙트 아님)
SE_EQUIP_HALLOWEEN_CANDY, // 할로윈 사탕을 착용(-_-;)한 순간에 발동하는 이펙트
SE_EQUIP_HAPPINESS_RING, // 크리스마스 행복의 반지(71143) 착용할 때 이펙트 (발동이펙트임, 지속이펙트 아님)
SE_EQUIP_LOVE_PENDANT, // 발렌타인 사랑의 팬던트(71145) 착용할 때 이펙트 (발동이펙트임, 지속이펙트 아님)
} ;
enum ETeenFlags
@ -678,10 +676,10 @@ enum ETeenFlags
#include "item_length.h"
// inventory<EFBFBD><EFBFBD> position<EFBFBD><EFBFBD> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ü
// int<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ͻ<EFBFBD><CFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȯ<EFBFBD><C8AF> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
// <EFBFBD>κ<EFBFBD> <20><><EFBFBD>õ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD><D4BC><EFBFBD> window_type<70><65> <20><><EFBFBD><EFBFBD> <20>ʰ<EFBFBD>, cell <20>ϳ<EFBFBD><CFB3><EFBFBD> <20>޾ұ<DEBE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD> <20>ϳ<EFBFBD> <20><><EFBFBD>̾ inventory type<70>̶<EFBFBD><CCB6><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,)
// <EFBFBD>κ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD> ȣ<><C8A3><EFBFBD>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> ??<3F><><EFBFBD>̴<EFBFBD>.
// inventory position을 나타내는 구조체
// int와의 암시적 형변환이 있는 이유는,
// 인벤 관련된 모든 함수가 window_type은 받지 않고, cell 하나만 받았기 때문에,(기존에는 인벤이 하나 뿐이어서 inventory type이란게 필요없었기 때문에,)
// 인벤 관련 모든 함수 호출부분을 수정하는 것이 난감하기 ??문이다.
enum EDragonSoulRefineWindowSize
{
@ -730,7 +728,7 @@ typedef struct SItemPos
return cell < INVENTORY_AND_EQUIP_SLOT_MAX;
case DRAGON_SOUL_INVENTORY:
return cell < (DRAGON_SOUL_INVENTORY_MAX_NUM);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ũ<><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> window<EFBFBD><EFBFBD> valid üũ<EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
// 동적으로 크기가 정해지는 window valid 체크를 할 수가 없다.
case SAFEBOX:
case MALL:
return false;

View File

@ -6,7 +6,7 @@
typedef DWORD IDENT;
/**
* @version 05/06/10 Bang2ni - Myshop Pricelist <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ HEADER_XX_MYSHOP_PRICELIST_XXX <EFBFBD>߰<EFBFBD>
* @version 05/06/10 Bang2ni - Myshop Pricelist 관련 패킷 HEADER_XX_MYSHOP_PRICELIST_XXX 추가
*/
enum
{
@ -49,7 +49,6 @@ enum
HEADER_GD_ADD_AFFECT = 32,
HEADER_GD_REMOVE_AFFECT = 33,
HEADER_GD_HIGHSCORE_REGISTER = 34,
HEADER_GD_ITEM_FLUSH = 35,
HEADER_GD_PARTY_CREATE = 36,
@ -63,7 +62,6 @@ enum
HEADER_GD_RELOAD_PROTO = 43,
HEADER_GD_CHANGE_NAME = 44,
HEADER_GD_SMS = 45,
HEADER_GD_GUILD_CHANGE_LADDER_POINT = 46,
HEADER_GD_GUILD_USE_SKILL = 47,
@ -99,38 +97,27 @@ enum
HEADER_GD_AUTH_LOGIN = 100,
HEADER_GD_LOGIN_BY_KEY = 101,
HEADER_GD_BILLING_EXPIRE = 104,
HEADER_GD_VCARD = 105,
HEADER_GD_BILLING_CHECK = 106,
HEADER_GD_MALL_LOAD = 107,
HEADER_GD_MYSHOP_PRICELIST_UPDATE = 108, ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>û
HEADER_GD_MYSHOP_PRICELIST_REQ = 109, ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><>û
HEADER_GD_MYSHOP_PRICELIST_UPDATE = 108, ///< 가격정보 갱신 요청
HEADER_GD_MYSHOP_PRICELIST_REQ = 109, ///< 가격정보 리스트 요청
HEADER_GD_BLOCK_CHAT = 110,
// PCBANG_IP_LIST_BY_AUTH
HEADER_GD_PCBANG_REQUEST_IP_LIST = 111,
HEADER_GD_PCBANG_CLEAR_IP_LIST = 112,
HEADER_GD_PCBANG_INSERT_IP = 113,
// END_OF_PCBANG_IP_LIST_BY_AUTH
HEADER_GD_HAMMER_OF_TOR = 114,
HEADER_GD_RELOAD_ADMIN = 115, ///<<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>û
HEADER_GD_BREAK_MARRIAGE = 116, ///< <EFBFBD><EFBFBD>ȥ <20>ı<EFBFBD>
HEADER_GD_ELECT_MONARCH = 117, ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ǥ
HEADER_GD_CANDIDACY = 118, ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
HEADER_GD_ADD_MONARCH_MONEY = 119, ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
HEADER_GD_TAKE_MONARCH_MONEY = 120, ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
HEADER_GD_COME_TO_VOTE = 121, ///< ǥ<EFBFBD><EFBFBD>
HEADER_GD_RMCANDIDACY = 122, ///< <EFBFBD>ĺ<EFBFBD> <20><><EFBFBD><EFBFBD> (<28><EFBFBD><EEBFB5>)
HEADER_GD_SETMONARCH = 123, ///<<EFBFBD><EFBFBD><EFBFBD>ּ<EFBFBD><EFBFBD><EFBFBD> (<28><EFBFBD><EEBFB5>)
HEADER_GD_RMMONARCH = 124, ///<<EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><EFBFBD><EFBFBD>
HEADER_GD_RELOAD_ADMIN = 115, ///<운영자 정보 요청
HEADER_GD_BREAK_MARRIAGE = 116, ///< 결혼 파기
HEADER_GD_ELECT_MONARCH = 117, ///< 군주 투표
HEADER_GD_CANDIDACY = 118, ///< 군주 등록
HEADER_GD_ADD_MONARCH_MONEY = 119, ///< 군주 돈 증가
HEADER_GD_TAKE_MONARCH_MONEY = 120, ///< 군주 돈 감소
HEADER_GD_COME_TO_VOTE = 121, ///< 표결
HEADER_GD_RMCANDIDACY = 122, ///< 후보 제거 (운영자)
HEADER_GD_SETMONARCH = 123, ///<군주설정 (운영자)
HEADER_GD_RMMONARCH = 124, ///<군주삭제
HEADER_GD_DEC_MONARCH_MONEY = 125,
HEADER_GD_CHANGE_MONARCH_LORD = 126,
HEADER_GD_BLOCK_COUNTRY_IP = 127, // <20><><EFBFBD>뿪 IP-Block
HEADER_GD_BLOCK_EXCEPTION = 128, // <20><><EFBFBD>뿪 IP-Block <20><><EFBFBD><EFBFBD>
HEADER_GD_REQ_CHANGE_GUILD_MASTER = 129,
@ -139,7 +126,7 @@ enum
HEADER_GD_UPDATE_HORSE_NAME = 131,
HEADER_GD_REQ_HORSE_NAME = 132,
HEADER_GD_DC = 133, // Login Key<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
HEADER_GD_DC = 133, // Login Key를 지움
HEADER_GD_VALID_LOGOUT = 134,
@ -238,12 +225,6 @@ enum
HEADER_DG_CHANGE_CHARACTER_PRIV = 127,
HEADER_DG_BILLING_REPAIR = 128,
HEADER_DG_BILLING_EXPIRE = 129,
HEADER_DG_BILLING_LOGIN = 130,
HEADER_DG_VCARD = 131,
HEADER_DG_BILLING_CHECK = 132,
HEADER_DG_CREATE_OBJECT = 140,
HEADER_DG_DELETE_OBJECT = 141,
HEADER_DG_UPDATE_LAND = 142,
@ -257,23 +238,21 @@ enum
HEADER_DG_WEDDING_START = 155,
HEADER_DG_WEDDING_END = 156,
HEADER_DG_MYSHOP_PRICELIST_RES = 157, ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>
HEADER_DG_RELOAD_ADMIN = 158, ///< <EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ε<EFBFBD>
HEADER_DG_BREAK_MARRIAGE = 159, ///< <EFBFBD><EFBFBD>ȥ <20>ı<EFBFBD>
HEADER_DG_ELECT_MONARCH = 160, ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ǥ
HEADER_DG_CANDIDACY = 161, ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
HEADER_DG_ADD_MONARCH_MONEY = 162, ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
HEADER_DG_TAKE_MONARCH_MONEY = 163, ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
HEADER_DG_COME_TO_VOTE = 164, ///< ǥ<EFBFBD><EFBFBD>
HEADER_DG_RMCANDIDACY = 165, ///< <EFBFBD>ĺ<EFBFBD> <20><><EFBFBD><EFBFBD> (<28><EFBFBD><EEBFB5>)
HEADER_DG_SETMONARCH = 166, ///<<EFBFBD><EFBFBD><EFBFBD>ּ<EFBFBD><EFBFBD><EFBFBD> (<28><EFBFBD><EEBFB5>)
HEADER_DG_RMMONARCH = 167, ///<<EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><EFBFBD><EFBFBD>
HEADER_DG_MYSHOP_PRICELIST_RES = 157, ///< 가격정보 리스트 응답
HEADER_DG_RELOAD_ADMIN = 158, ///< 운영자 정보 리로드
HEADER_DG_BREAK_MARRIAGE = 159, ///< 결혼 파기
HEADER_DG_ELECT_MONARCH = 160, ///< 군주 투표
HEADER_DG_CANDIDACY = 161, ///< 군주 등록
HEADER_DG_ADD_MONARCH_MONEY = 162, ///< 군주 돈 증가
HEADER_DG_TAKE_MONARCH_MONEY = 163, ///< 군주 돈 감소
HEADER_DG_COME_TO_VOTE = 164, ///< 표결
HEADER_DG_RMCANDIDACY = 165, ///< 후보 제거 (운영자)
HEADER_DG_SETMONARCH = 166, ///<군주설정 (운영자)
HEADER_DG_RMMONARCH = 167, ///<군주삭제
HEADER_DG_DEC_MONARCH_MONEY = 168,
HEADER_DG_CHANGE_MONARCH_LORD_ACK = 169,
HEADER_DG_UPDATE_MONARCH_INFO = 170,
HEADER_DG_BLOCK_COUNTRY_IP = 171, // <20><><EFBFBD>뿪 IP-Block
HEADER_DG_BLOCK_EXCEPTION = 172, // <20><><EFBFBD>뿪 IP-Block <20><><EFBFBD><EFBFBD> account
HEADER_DG_ACK_CHANGE_GUILD_MASTER = 173,
@ -364,7 +343,7 @@ typedef struct SPlayerItem
DWORD count;
DWORD vnum;
LONG alSockets[ITEM_SOCKET_MAX_NUM]; // <EFBFBD><EFBFBD><EFBFBD>Ϲ<EFBFBD>ȣ
LONG alSockets[ITEM_SOCKET_MAX_NUM]; // 소켓번호
TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];
@ -441,7 +420,6 @@ typedef struct SPlayerTable
BYTE skill_group;
LONG lAlignment;
char szMobile[MOBILE_MAX_LEN + 1];
WORD stat_reset_count;
@ -572,9 +550,9 @@ typedef struct SShopItemTable
DWORD vnum;
BYTE count;
TItemPos pos; // PC <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̿<EFBFBD>
DWORD price; // PC, shop_table_ex.txt <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̿<EFBFBD>
BYTE display_pos; // PC, shop_table_ex.txt <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̿<EFBFBD>, <20><><EFBFBD><EFBFBD> <20><>ġ.
TItemPos pos; // PC 상점에만 이용
DWORD price; // PC, shop_table_ex.txt 상점에만 이용
BYTE display_pos; // PC, shop_table_ex.txt 상점에만 이용, 보일 위치.
} TShopItemTable;
typedef struct SShopTable
@ -638,12 +616,12 @@ typedef struct SItemTable : public SEntityTable
BYTE bSpecular;
BYTE bGainSocketPct;
WORD sAddonType; // <EFBFBD><20>Ӽ<EFBFBD>
WORD sAddonType; // 기본 속성
// <EFBFBD>Ʒ<EFBFBD> limit flag<EFBFBD><EFBFBD><EFBFBD><EFBFBD> realtime<EFBFBD><EFBFBD> üũ <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> VNUM<55><4D> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ε<EFBFBD>,
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ź<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>۸<EFBFBD><DBB8><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD>쿡 LIMIT_MAX_NUM<55><4D><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>鼭 üũ<C3BC>ϴ<EFBFBD> <20><><EFBFBD>ϰ<EFBFBD> Ŀ<><C4BF> <20≯<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><>.
char cLimitRealTimeFirstUseIndex; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> limit <EFBFBD>ʵ尪 <20>߿<EFBFBD><DFBF><EFBFBD> LIMIT_REAL_TIME_FIRST_USE <EFBFBD>÷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -1)
char cLimitTimerBasedOnWearIndex; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> limit <EFBFBD>ʵ尪 <20>߿<EFBFBD><DFBF><EFBFBD> LIMIT_TIMER_BASED_ON_WEAR <EFBFBD>÷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -1)
// 아래 limit flag들은 realtime에 체크 할 일이 많고, 아이템 VNUM당 고정된 값인데,
// 현재 구조대로 매번 아이템마다 필요한 경우에 LIMIT_MAX_NUM까지 루프돌면서 체크하는 부하가 커서 미리 저장 해 둠.
char cLimitRealTimeFirstUseIndex; // 아이템 limit 필드값 중에서 LIMIT_REAL_TIME_FIRST_USE 플래그의 위치 (없으면 -1)
char cLimitTimerBasedOnWearIndex; // 아이템 limit 필드값 중에서 LIMIT_TIMER_BASED_ON_WEAR 플래그의 위치 (없으면 -1)
} TItemTable;
@ -681,7 +659,7 @@ typedef struct SPlayerLoadPacket
{
DWORD account_id;
DWORD player_id;
BYTE account_index; /* account <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ */
BYTE account_index; /* account 에서의 위치 */
} TPlayerLoadPacket;
typedef struct SPlayerCreatePacket
@ -758,9 +736,9 @@ typedef struct SEmpireSelectPacket
typedef struct SPacketGDSetup
{
char szPublicIP[16]; // Public IP which listen to users
BYTE bChannel; // ä<EFBFBD><EFBFBD>
WORD wListenPort; // Ŭ<EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><>Ʈ <20><>ȣ
WORD wP2PPort; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ű<EFBFBD><C5B0> P2P <20><>Ʈ <20><>ȣ
BYTE bChannel; // 채널
WORD wListenPort; // 클라이언트가 접속하는 포트 번호
WORD wP2PPort; // 서버끼리 연결 시키는 P2P 포트 번호
LONG alMaps[MAP_ALLOW_MAX_LEN];
DWORD dwLoginCount;
BYTE bAuthServer;
@ -851,14 +829,6 @@ typedef struct SPacketGDRemoveAffect
BYTE bApplyOn;
} TPacketGDRemoveAffect;
typedef struct SPacketGDHighscore
{
DWORD dwPID;
LONG lValue;
char cDir;
char szBoard[21];
} TPacketGDHighscore;
typedef struct SPacketPartyCreate
{
DWORD dwLeaderPID;
@ -938,8 +908,8 @@ typedef struct SPacketGuildWar
LONG lInitialScore;
} TPacketGuildWar;
// Game -> DB : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȭ<EFBFBD><C8AD>
// DB -> Game : <EFBFBD><EFBFBD>Ż<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Game -> DB : 상대적 변화값
// DB -> Game : 토탈된 최종값
typedef struct SPacketGuildWarScore
{
DWORD dwGuildGainPoint;
@ -960,8 +930,8 @@ typedef struct SRefineTable
//DWORD result_vnum;
DWORD id;
BYTE material_count;
DWORD cost; // <EFBFBD>ҿ<EFBFBD> <20><><EFBFBD><EFBFBD>
DWORD prob; // Ȯ<EFBFBD><EFBFBD>
DWORD cost; // 소요 비용
DWORD prob; // 확률
TRefineMaterial materials[REFINE_MATERIAL_MAX_NUM];
} TRefineTable;
@ -997,14 +967,6 @@ typedef struct SPacketGuildLadderPoint
LONG lChange;
} TPacketGuildLadderPoint;
typedef struct SPacketGDSMS
{
char szFrom[CHARACTER_NAME_MAX_LEN + 1];
char szTo[CHARACTER_NAME_MAX_LEN + 1];
char szMobile[MOBILE_MAX_LEN + 1];
char szMsg[SMS_MAX_LEN + 1];
} TPacketGDSMS;
typedef struct SPacketGuildUseSkill
{
DWORD dwGuild;
@ -1032,9 +994,7 @@ typedef struct SPacketGDAuthLogin
char szLogin[LOGIN_MAX_LEN + 1];
char szSocialID[SOCIAL_ID_MAX_LEN + 1];
DWORD adwClientKey[4];
BYTE bBillType;
DWORD dwBillID;
DWORD iPremiumTimes[PREMIUM_MAX_NUM];
DWORD iPremiumTimes[PREMIUM_MAX_NUM];
} TPacketGDAuthLogin;
typedef struct SPacketGDLoginByKey
@ -1046,14 +1006,14 @@ typedef struct SPacketGDLoginByKey
} TPacketGDLoginByKey;
/**
* @version 05/06/08 Bang2ni - <EFBFBD><EFBFBD><EFBFBD>ӽð<EFBFBD> <20>߰<EFBFBD>
* @version 05/06/08 Bang2ni - 지속시간 추가
*/
typedef struct SPacketGiveGuildPriv
{
BYTE type;
DWORD value;
DWORD guild_id;
time_t duration_sec; ///< <EFBFBD><EFBFBD><EFBFBD>ӽð<EFBFBD>
time_t duration_sec; ///< 지속시간
} TPacketGiveGuildPriv;
typedef struct SPacketGiveEmpirePriv
{
@ -1088,7 +1048,7 @@ typedef struct SPacketDGChangeCharacterPriv
} TPacketDGChangeCharacterPriv;
/**
* @version 05/06/08 Bang2ni - <EFBFBD><EFBFBD><EFBFBD>ӽð<EFBFBD> <20>߰<EFBFBD>
* @version 05/06/08 Bang2ni - 지속시간 추가
*/
typedef struct SPacketDGChangeGuildPriv
{
@ -1096,7 +1056,7 @@ typedef struct SPacketDGChangeGuildPriv
DWORD value;
DWORD guild_id;
BYTE bLog;
time_t end_time_sec; ///< <EFBFBD><EFBFBD><EFBFBD>ӽð<EFBFBD>
time_t end_time_sec; ///< 지속시간
} TPacketDGChangeGuildPriv;
typedef struct SPacketDGChangeEmpirePriv
@ -1146,26 +1106,6 @@ typedef struct SPacketSetEventFlag
LONG lValue;
} TPacketSetEventFlag;
typedef struct SPacketBillingLogin
{
DWORD dwLoginKey;
BYTE bLogin;
} TPacketBillingLogin;
typedef struct SPacketBillingRepair
{
DWORD dwLoginKey;
char szLogin[LOGIN_MAX_LEN + 1];
char szHost[MAX_HOST_LENGTH + 1];
} TPacketBillingRepair;
typedef struct SPacketBillingExpire
{
char szLogin[LOGIN_MAX_LEN + 1];
BYTE bBillType;
DWORD dwRemainSeconds;
} TPacketBillingExpire;
typedef struct SPacketLoginOnSetup
{
DWORD dwID;
@ -1193,15 +1133,6 @@ typedef struct SPacketGDHammerOfTor
DWORD delay;
} TPacketGDHammerOfTor;
typedef struct SPacketGDVCard
{
DWORD dwID;
char szSellCharacter[CHARACTER_NAME_MAX_LEN + 1];
char szSellAccount[LOGIN_MAX_LEN + 1];
char szBuyCharacter[CHARACTER_NAME_MAX_LEN + 1];
char szBuyAccount[LOGIN_MAX_LEN + 1];
} TPacketGDVCard;
typedef struct SGuildReserve
{
DWORD dwID;
@ -1277,27 +1208,27 @@ typedef struct
DWORD dwPID2;
} TPacketWeddingEnd;
/// <EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6><EFBFBD><EFBFBD> <20><> <20>ڿ<EFBFBD> byCount <EFBFBD><EFBFBD>ŭ<EFBFBD><EFBFBD> TItemPriceInfo <EFBFBD><EFBFBD> <20>´<EFBFBD>.
/// 개인상점 가격정보의 헤더. 가변 패킷으로 이 뒤에 byCount 만큼의 TItemPriceInfo 가 온다.
typedef struct SPacketMyshopPricelistHeader
{
DWORD dwOwnerID; ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7>̾<EFBFBD> ID
BYTE byCount; ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
DWORD dwOwnerID; ///< 가격정보를 가진 플레이어 ID
BYTE byCount; ///< 가격정보 갯수
} TPacketMyshopPricelistHeader;
/// <EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// 개인상점의 단일 아이템에 대한 가격정보
typedef struct SItemPriceInfo
{
DWORD dwVnum; ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> vnum
DWORD dwPrice; ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DWORD dwVnum; ///< 아이템 vnum
DWORD dwPrice; ///< 가격
} TItemPriceInfo;
/// <EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD>̺<EFBFBD>
/// 개인상점 아이템 가격정보 리스트 테이블
typedef struct SItemPriceListTable
{
DWORD dwOwnerID; ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7>̾<EFBFBD> ID
BYTE byCount; ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD>
DWORD dwOwnerID; ///< 가격정보를 가진 플레이어 ID
BYTE byCount; ///< 가격정보 리스트의 갯수
TItemPriceInfo aPriceInfo[SHOP_PRICELIST_MAX_NUM]; ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ
TItemPriceInfo aPriceInfo[SHOP_PRICELIST_MAX_NUM]; ///< 가격정보 리스트
} TItemPriceListTable;
typedef struct
@ -1306,24 +1237,15 @@ typedef struct
LONG lDuration;
} TPacketBlockChat;
// PCBANG_IP_LIST
typedef struct SPacketPCBangIP
{
DWORD id;
DWORD ip;
} TPacketPCBangIP;
// END_OF_PCBANG_IP_LIST
//ADMIN_MANAGER
typedef struct TAdminInfo
{
DWORD m_ID; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID
char m_szAccount[32]; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
char m_szName[32]; //ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD>
char m_szContactIP[16]; //<EFBFBD><EFBFBD><EFBFBD>پ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
char m_szServerIP[16]; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DWORD m_Authority; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DWORD m_ID; //고유ID
char m_szAccount[32]; //계정
char m_szName[32]; //캐릭터이름
char m_szContactIP[16]; //접근아이피
char m_szServerIP[16]; //서버아이피
DWORD m_Authority; //권한
} tAdminInfo;
//END_ADMIN_MANAGER
@ -1344,20 +1266,20 @@ typedef struct SPacketReloadAdmin
typedef struct TMonarchInfo
{
DWORD pid[4]; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> PID
int64_t money[4]; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>
char name[4][32]; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD>
char date[4][32]; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>¥
DWORD pid[4]; // 군주의 PID
int64_t money[4]; // 군주의 별개 돈
char name[4][32]; // 군주의 이름
char date[4][32]; // 군주 등록 날짜
} MonarchInfo;
typedef struct TMonarchElectionInfo
{
DWORD pid; // <EFBFBD><EFBFBD>ǥ <20>ѻ<EFBFBD><D1BB><EFBFBD> PID
DWORD selectedpid; // <EFBFBD><EFBFBD>ǥ <20><><EFBFBD><EFBFBD> PID ( <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> )
char date[32]; // <EFBFBD><EFBFBD>ǥ <20><>¥
DWORD pid; // 투표 한사람 PID
DWORD selectedpid; // 투표 당한 PID ( 군주 참가자 )
char date[32]; // 투표 날짜
} MonarchElectionInfo;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E2B8B6>
// 군주 출마자
typedef struct tMonarchCandidacy
{
DWORD pid;
@ -1379,26 +1301,6 @@ typedef struct tChangeMonarchLordACK
char szDate[32];
} TPacketChangeMonarchLordACK;
// Block Country Ip
typedef struct tBlockCountryIp
{
DWORD ip_from;
DWORD ip_to;
} TPacketBlockCountryIp;
enum EBlockExceptionCommand
{
BLOCK_EXCEPTION_CMD_ADD = 1,
BLOCK_EXCEPTION_CMD_DEL = 2,
};
// Block Exception Account
typedef struct tBlockException
{
BYTE cmd; // 1 == add, 2 == delete
char login[LOGIN_MAX_LEN + 1];
}TPacketBlockException;
typedef struct tChangeGuildMaster
{
DWORD dwGuildID;
@ -1429,14 +1331,14 @@ typedef struct tNeedLoginLogInfo
DWORD dwPlayerID;
} TPacketNeedLoginLogInfo;
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>˸<EFBFBD> <20><><EFBFBD><EFBFBD> <20>׽<EFBFBD>Ʈ<EFBFBD><C6AE> <20><>Ŷ <20><><EFBFBD><EFBFBD>
//독일 선물 알림 기능 테스트용 패킷 정보
typedef struct tItemAwardInformer
{
char login[LOGIN_MAX_LEN + 1];
char command[20]; //<EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD>
DWORD vnum; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
char command[20]; //명령어
DWORD vnum; //아이템
} TPacketItemAwardInfromer;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˸<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD>
// 선물 알림 기능 삭제용 패킷 정보
typedef struct tDeleteAwardID
{
DWORD dwID;

View File

@ -1,3 +1,6 @@
#ifndef __INC_METIN2_UTILS_H__
#define __INC_METIN2_UTILS_H__
/*----- atoi function -----*/
inline bool str_to_number (bool& out, const char *in)
{
@ -72,3 +75,5 @@ inline bool str_to_number (float& out, const char *in)
}
/*----- atoi function -----*/
#endif

View File

@ -10,6 +10,6 @@
#define __COMPILER__ "@METIN2_COMPILER@"
#define __CPU_TARGET__ "@METIN2_CPU_TARGET@"
void WriteVersion(std::ostream& out);
void WriteVersion();
#endif

View File

@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 3.8)
project(db CXX)
file(GLOB_RECURSE sources
src/*.cpp src/*.h
src/*.cpp src/*.h
)
# Add the src directory to the include path
@ -11,18 +11,25 @@ include_directories(src)
add_executable(${PROJECT_NAME} ${sources})
# Set the default log level based on the build type
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
message(STATUS "This is a debug build. Log level will be set to 'trace' for target '${PROJECT_NAME}'.")
target_compile_definitions(${PROJECT_NAME} PRIVATE SPDLOG_ACTIVE_LEVEL=SPDLOG_LEVEL_TRACE)
endif()
# Treat char variables as signed, especially useful for ARM builds
target_compile_options(${PROJECT_NAME} PUBLIC -fsigned-char)
# Find dependencies
#
# vcpkg dependencies
#
# Boost
find_package(Boost COMPONENTS system REQUIRED)
target_link_libraries (${PROJECT_NAME} PRIVATE Boost::boost Boost::system)
# Pthreads
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE Threads::Threads)
# LibBSD
target_link_libraries(${PROJECT_NAME} PRIVATE bsd)
# Libevent
find_package(Libevent CONFIG REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE libevent::core libevent::extra libevent::pthreads)
@ -31,4 +38,16 @@ target_link_libraries(${PROJECT_NAME} PRIVATE libevent::core libevent::extra lib
find_package(effolkronium_random CONFIG REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE effolkronium_random)
#
# System-provided dependencies
#
# Pthreads
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE Threads::Threads)
# LibBSD
target_link_libraries(${PROJECT_NAME} PRIVATE bsd)
target_link_libraries(${PROJECT_NAME} PRIVATE libpoly libsql libthecore)

View File

@ -135,7 +135,7 @@ void AuctionManager::LoadAuctionItem()
}
int rows;
if ((rows = mysql_num_rows(res)) <= 0) // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if ((rows = mysql_num_rows(res)) <= 0) // 데이터 없음
{
return;
}
@ -182,7 +182,7 @@ void AuctionManager::LoadAuctionInfo()
}
int rows;
if ((rows = mysql_num_rows(res)) <= 0) // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if ((rows = mysql_num_rows(res)) <= 0) // 데이터 없음
{
return;
}
@ -226,7 +226,7 @@ void AuctionManager::LoadSaleInfo()
}
int rows;
if ((rows = mysql_num_rows(res)) <= 0) // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if ((rows = mysql_num_rows(res)) <= 0) // 데이터 없음
{
return;
}
@ -269,7 +269,7 @@ void AuctionManager::LoadWishInfo()
}
int rows;
if ((rows = mysql_num_rows(res)) <= 0) // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if ((rows = mysql_num_rows(res)) <= 0) // 데이터 없음
{
return;
}
@ -311,7 +311,7 @@ void AuctionManager::LoadMyBidInfo ()
}
int rows;
if ((rows = mysql_num_rows(res)) <= 0) // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if ((rows = mysql_num_rows(res)) <= 0) // 데이터 없음
{
return;
}
@ -406,13 +406,13 @@ AuctionResult AuctionManager::EnrollInAuction(CItemCache* item_cache, TAuctionIt
CItemCache* c = GetItemCache (item_info.item_id);
if (c != NULL)
{
sys_err ("item id : %d is already in AuctionManager", item_info.item_id);
SPDLOG_ERROR("item id : {} is already in AuctionManager", item_info.item_id);
return AUCTION_FAIL;
}
if (!Auction.InsertItemInfo (&item_info))
{
sys_err ("item id : %d is already in AuctionBoard", item_info.item_id);
SPDLOG_ERROR("item id : {} is already in AuctionBoard", item_info.item_id);
return AUCTION_FAIL;
}
@ -429,19 +429,19 @@ AuctionResult AuctionManager::EnrollInSale(CItemCache* item_cache, TSaleItemInfo
CItemCache* c = GetItemCache (item_info.item_id);
if (c != NULL)
{
sys_err ("item id : %d is already in AuctionManager", item_info.item_id);
SPDLOG_ERROR("item id : {} is already in AuctionManager", item_info.item_id);
return AUCTION_FAIL;
}
if (!Wish.GetItemInfoCache (WishBoard::Key (item_info.item_num, item_info.wisher_id)))
{
sys_err ("item_num : %d, wisher_id : %d is not in wish auction.", item_info.item_num, item_info.wisher_id);
SPDLOG_ERROR("item_num : {}, wisher_id : {} is not in wish auction.", item_info.item_num, item_info.wisher_id);
return AUCTION_FAIL;
}
if (!Sale.InsertItemInfo (&item_info))
{
sys_err ("item id : %d is already in SaleBoard", item_info.item_id);
SPDLOG_ERROR("item id : {} is already in SaleBoard", item_info.item_id);
return AUCTION_FAIL;
}
@ -457,7 +457,7 @@ AuctionResult AuctionManager::EnrollInWish(TWishItemInfo &item_info)
{
if (!Wish.InsertItemInfo (&item_info))
{
sys_err ("wisher_id : %d, item_num : %d is already in WishBoard", item_info.offer_id, item_info.item_num);
SPDLOG_ERROR("wisher_id : {}, item_num : {} is already in WishBoard", item_info.offer_id, item_info.item_num);
return AUCTION_FAIL;
}
@ -469,7 +469,7 @@ AuctionResult AuctionManager::Bid(DWORD bidder_id, const char* bidder_name, DWOR
CItemCache* c = GetItemCache (item_id);
if (c == NULL)
{
sys_err ("item id : %d does not exist in auction.", item_id);
SPDLOG_ERROR("item id : {} does not exist in auction.", item_id);
return AUCTION_FAIL;
}
@ -506,7 +506,7 @@ AuctionResult AuctionManager::Impur(DWORD purchaser_id, const char* purchaser_na
CItemCache* c = GetItemCache (item_id);
if (c == NULL)
{
sys_err ("item id : %d does not exist in auction.", item_id);
SPDLOG_ERROR("item id : {} does not exist in auction.", item_id);
return AUCTION_FAIL;
}
@ -518,7 +518,7 @@ AuctionResult AuctionManager::Impur(DWORD purchaser_id, const char* purchaser_na
return AUCTION_EXPIRED;
}
// <EFBFBD><20>ع<EFBFBD><D8B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>, <20><><EFBFBD>Ŵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// 즉구 해버렸으므로, 경매는 끝났다.
item_info->expired_time = 0;
item_info->bidder_id = purchaser_id;
item_info->set_bidder_name (purchaser_name);
@ -533,14 +533,14 @@ AuctionResult AuctionManager::GetAuctionedItem (DWORD actor_id, DWORD item_id, T
CItemCache* c = GetItemCache (item_id);
if (c == NULL)
{
sys_err ("item id : %d does not exist in auction.", item_id);
SPDLOG_ERROR("item id : {} does not exist in auction.", item_id);
return AUCTION_FAIL;
}
CAuctionItemInfoCache* item_info_cache = Auction.GetItemInfoCache(item_id);
if (item_info_cache == NULL)
{
sys_err ("how can this accident happen?");
SPDLOG_ERROR("how can this accident happen?");
return AUCTION_FAIL;
}
@ -561,14 +561,14 @@ AuctionResult AuctionManager::BuySoldItem (DWORD actor_id, DWORD item_id, TPlaye
CItemCache* c = GetItemCache (item_id);
if (c == NULL)
{
sys_err ("item id : %d does not exist in auction.", item_id);
SPDLOG_ERROR("item id : {} does not exist in auction.", item_id);
return AUCTION_FAIL;
}
CSaleItemInfoCache* item_info_cache = Sale.GetItemInfoCache(item_id);
if (item_info_cache == NULL)
{
sys_err ("how can this accident happen?");
SPDLOG_ERROR("how can this accident happen?");
return AUCTION_FAIL;
}
@ -584,14 +584,14 @@ AuctionResult AuctionManager::CancelAuction (DWORD actor_id, DWORD item_id, TPla
CItemCache* c = GetItemCache (item_id);
if (c == NULL)
{
sys_err ("item id : %d does not exist in auction.", item_id);
SPDLOG_ERROR("item id : {} does not exist in auction.", item_id);
return AUCTION_FAIL;
}
CAuctionItemInfoCache* item_info_cache = Auction.GetItemInfoCache(item_id);
if (item_info_cache == NULL)
{
sys_err ("how can this accident happen?");
SPDLOG_ERROR("how can this accident happen?");
return AUCTION_FAIL;
}
TAuctionItemInfo* item_info = item_info_cache->Get(false);
@ -618,14 +618,14 @@ AuctionResult AuctionManager::CancelSale (DWORD actor_id, DWORD item_id, TPlayer
CItemCache* c = GetItemCache (item_id);
if (c == NULL)
{
sys_err ("item id : %d does not exist in auction.", item_id);
SPDLOG_ERROR("item id : {} does not exist in auction.", item_id);
return AUCTION_FAIL;
}
CSaleItemInfoCache* item_info_cache = Sale.GetItemInfoCache(item_id);
if (item_info_cache == NULL)
{
sys_err ("how can this accident happen?");
SPDLOG_ERROR("how can this accident happen?");
return AUCTION_FAIL;
}
TSaleItemInfo* item_info = item_info_cache->Get(false);
@ -639,13 +639,13 @@ AuctionResult AuctionManager::DeleteAuctionItem (DWORD actor_id, DWORD item_id)
{
if (DeleteItemCache (item_id) == false)
{
sys_err ("item id : %d does not exist in auction.", item_id);
SPDLOG_ERROR("item id : {} does not exist in auction.", item_id);
return AUCTION_FAIL;
}
if (Auction.DeleteItemInfoCache (item_id) == NULL)
{
sys_err ("how can this accident happen?");
SPDLOG_ERROR("how can this accident happen?");
return AUCTION_FAIL;
}
return AUCTION_SUCCESS;
@ -655,13 +655,13 @@ AuctionResult AuctionManager::DeleteSaleItem (DWORD actor_id, DWORD item_id)
{
if (DeleteItemCache (item_id) == false)
{
sys_err ("item id : %d does not exist in auction.", item_id);
SPDLOG_ERROR("item id : {} does not exist in auction.", item_id);
return AUCTION_FAIL;
}
if (Sale.DeleteItemInfoCache (item_id) == NULL)
{
sys_err ("how can this accident happen?");
SPDLOG_ERROR("how can this accident happen?");
return AUCTION_FAIL;
}
return AUCTION_SUCCESS;
@ -672,7 +672,7 @@ AuctionResult AuctionManager::ReBid(DWORD bidder_id, const char* bidder_name, DW
CItemCache* c = GetItemCache (item_id);
if (c == NULL)
{
sys_err ("item id : %d does not exist in auction.", item_id);
SPDLOG_ERROR("item id : {} does not exist in auction.", item_id);
return AUCTION_FAIL;
}

View File

@ -243,7 +243,7 @@ private:
TItemInfoCacheMap item_cache_map;
};
// pc<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD> <20><><EFBFBD>Ÿ<EFBFBD> <20><><EFBFBD><EFBFBD>.
// pc가 입찰에 참여했던 경매를 관리.
class MyBidBoard
{
public:
@ -255,7 +255,7 @@ public:
int GetMoney (DWORD player_id, DWORD item_id);
bool Delete (DWORD player_id, DWORD item_id);
// <EFBFBD>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// 이미 있으면 덮어 씌운다.
void Insert (DWORD player_id, DWORD item_id, int money);
private:
@ -267,11 +267,11 @@ private:
class AuctionManager : public singleton <AuctionManager>
{
private:
// auction<EFBFBD><EFBFBD> <20><><EFBFBD>ϵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>۵<EFBFBD>.
// auction에 등록된 아이템들.
typedef std::unordered_map<DWORD, CItemCache *> TItemCacheMap;
TItemCacheMap auction_item_cache_map;
// auction<EFBFBD><EFBFBD> <20><><EFBFBD>ϵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD> <20><><EFBFBD>Ե<EFBFBD><D4B5><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>͵<EFBFBD>
// auction에 등록된 정보 중 가격, 등등 아이템 테이블에 포함되지 않는 정보들을 관리하는 것들
AuctionBoard Auction;
SaleBoard Sale;
WishBoard Wish;

View File

@ -1,214 +0,0 @@
// vim:ts=4 sw=4
/*********************************************************************
* date : 2007.05.31
* file : BlockCountry.cpp
* author : mhh
* description :
*/
#include "stdafx.h"
#include "BlockCountry.h"
#include "DBManager.h"
#define DO_ALL_BLOCK_IP(iter) \
for ((iter) = m_block_ip.begin(); (iter) != m_block_ip.end(); ++(iter))
#define DO_ALL_BLOCK_EXCEPTION(iter) \
for ((iter) = m_block_exception.begin(); (iter) != m_block_exception.end(); ++(iter))
CBlockCountry::CBlockCountry()
{
}
CBlockCountry::~CBlockCountry()
{
BLOCK_IP *block_ip;
BLOCK_IP_VECTOR::iterator iter;
DO_ALL_BLOCK_IP(iter)
{
block_ip = *iter;
delete block_ip;
}
m_block_ip.clear();
}
bool CBlockCountry::Load()
{
// load blocked ip
{
char szQuery[256];
snprintf(szQuery, sizeof(szQuery), "SELECT IP_FROM, IP_TO, COUNTRY_NAME FROM iptocountry");
SQLMsg * pMsg = CDBManager::instance().DirectQuery(szQuery, SQL_ACCOUNT);
if (pMsg->Get()->uiNumRows == 0)
{
sys_err(" DirectQuery failed(%s)", szQuery);
delete pMsg;
return false;
}
MYSQL_ROW row;
for (int n = 0; (row = mysql_fetch_row(pMsg->Get()->pSQLResult)) != NULL; ++n)
{
BLOCK_IP *block_ip = new BLOCK_IP;
block_ip->ip_from = strtoul(row[0], NULL, 10);
block_ip->ip_to = strtoul(row[1], NULL, 10);
strlcpy(block_ip->country, row[2], sizeof(block_ip->country));
m_block_ip.push_back(block_ip);
sys_log(0, "BLOCKED_IP : %u - %u", block_ip->ip_from, block_ip->ip_to);
}
delete pMsg;
}
// load block exception account
{
char szQuery[256];
snprintf(szQuery, sizeof(szQuery), "SELECT login FROM block_exception");
SQLMsg * pMsg = CDBManager::instance().DirectQuery(szQuery, SQL_ACCOUNT);
if (pMsg->Get()->uiNumRows == 0)
{
sys_err(" DirectQuery failed(%s)", szQuery);
delete pMsg;
return true;
}
MYSQL_ROW row;
for (int n = 0; (row = mysql_fetch_row(pMsg->Get()->pSQLResult)) != NULL; ++n)
{
const char *login = row[0];
m_block_exception.push_back(strdup(login));
sys_log(0, "BLOCK_EXCEPTION = %s", login);
}
delete pMsg;
}
return true;
}
bool CBlockCountry::IsBlockedCountryIp(const char *user_ip)
{
BLOCK_IP* block_ip;
BLOCK_IP_VECTOR::iterator iter;
struct in_addr st_addr;
#ifndef __WIN32__
if (0 == inet_aton(user_ip, &st_addr))
#else
unsigned int in_address;
in_address = inet_addr(user_ip);
st_addr.s_addr = in_address;
if (INADDR_NONE == in_address)
#endif
return true; // <20><><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3>
DO_ALL_BLOCK_IP(iter)
{
block_ip = *iter;
if (st_addr.s_addr >= block_ip->ip_from && st_addr.s_addr <= block_ip->ip_to)
return true;
}
return false;
}
void CBlockCountry::SendBlockedCountryIp(CPeer *peer)
{
sys_log(0, "SendBlockedCountryIp start");
BLOCK_IP *block_ip;
BLOCK_IP_VECTOR::iterator iter;
TPacketBlockCountryIp packet;
DO_ALL_BLOCK_IP(iter)
{
block_ip = *iter;
packet.ip_from = block_ip->ip_from;
packet.ip_to = block_ip->ip_to;
peer->EncodeHeader(HEADER_DG_BLOCK_COUNTRY_IP, 0, sizeof(TPacketBlockCountryIp));
peer->Encode(&packet, sizeof(packet));
}
sys_log(0, "[DONE] CBlockCountry::SendBlockedCountryIp() : count = %d",
m_block_ip.size());
sys_log(0, "SendBlockedCountryIp end");
} /* end of CBlockCountry::SendBlockedCountryIp() */
void CBlockCountry::SendBlockException(CPeer *peer)
{
BLOCK_EXCEPTION_VECTOR::iterator iter;
DO_ALL_BLOCK_EXCEPTION(iter)
{
const char *login = *iter;
this->SendBlockExceptionOne(peer, login, BLOCK_EXCEPTION_CMD_ADD);
}
} /* end of CBlockCountry::SendBlockException() */
void CBlockCountry::SendBlockExceptionOne(CPeer *peer, const char *login, BYTE cmd)
{
if (NULL == peer || NULL == login)
return;
if (BLOCK_EXCEPTION_CMD_ADD != cmd && BLOCK_EXCEPTION_CMD_DEL != cmd)
return;
TPacketBlockException packet;
packet.cmd = cmd;
strlcpy(packet.login, login, sizeof(packet.login));
peer->EncodeHeader(HEADER_DG_BLOCK_EXCEPTION, 0, sizeof(TPacketBlockException));
peer->Encode(&packet, sizeof(packet));
}
void CBlockCountry::AddBlockException(const char *login)
{
BLOCK_EXCEPTION_VECTOR::iterator iter;
DO_ALL_BLOCK_EXCEPTION(iter)
{
const char *saved_login = *iter;
if (!strcmp(saved_login, login))
return;
}
m_block_exception.push_back(strdup(login));
return;
}
void CBlockCountry::DelBlockException(const char *login)
{
BLOCK_EXCEPTION_VECTOR::iterator iter;
DO_ALL_BLOCK_EXCEPTION(iter)
{
const char *saved_login = *iter;
if (!strcmp(saved_login, login))
{
::free((void*)saved_login);
m_block_exception.erase(iter);
return;
}
}
return;
}

View File

@ -1,44 +0,0 @@
// vim: ts=4 sw=4
// Date : 2007.05.31
// File : BlockCountry.h
// Author : mhh
// Description :
#ifndef __INC_METIN_II_BLOCKCOUNTRY_H__
#define __INC_METIN_II_BLOCKCOUNTRY_H__
#include "Peer.h"
#define MAX_COUNTRY_NAME_LENGTH 50
class CBlockCountry : public singleton<CBlockCountry>
{
private:
struct BLOCK_IP
{
DWORD ip_from;
DWORD ip_to;
char country[MAX_COUNTRY_NAME_LENGTH + 1];
};
typedef std::vector<BLOCK_IP*> BLOCK_IP_VECTOR;
BLOCK_IP_VECTOR m_block_ip;
typedef std::vector<const char*> BLOCK_EXCEPTION_VECTOR;
BLOCK_EXCEPTION_VECTOR m_block_exception;
public:
CBlockCountry();
~CBlockCountry();
public:
bool Load();
bool IsBlockedCountryIp(const char *user_ip);
void SendBlockedCountryIp(CPeer *peer);
void SendBlockException(CPeer *peer);
void SendBlockExceptionOne(CPeer *peer, const char *login, BYTE cmd);
void AddBlockException(const char *login);
void DelBlockException(const char *login);
};
#endif

View File

@ -29,12 +29,12 @@ CItemCache::~CItemCache()
{
}
// <EFBFBD>̰<EFBFBD> <20>̻<EFBFBD><CCBB>ѵ<EFBFBD>...
// Delete<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, Cache<68><65> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <20>ϴ°<CFB4> <20>ƴѰ<C6B4>???
// <EFBFBD>ٵ<EFBFBD> Cache<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD>.
// <EFBFBD><EFBFBD> ã<><C3A3> <20>ǰ<EFBFBD>?
// <EFBFBD>̷<EFBFBD><EFBFBD><EFBFBD> <20>س<EFBFBD><D8B3><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>...
// <EFBFBD>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD>... Ȯ<>λ<EFBFBD><CEBB><EFBFBD>??????
// 이거 이상한데...
// Delete를 했으면, Cache도 해제해야 하는것 아닌가???
// 근데 Cache를 해제하는 부분이 없어.
// 못 찾은 건가?
// 이렇게 해놓으면, 계속 시간이 될 때마다 아이템을 계속 지워...
// 이미 사라진 아이템인데... 확인사살??????
// fixme
// by rtsummit
void CItemCache::Delete()
@ -44,8 +44,7 @@ void CItemCache::Delete()
//char szQuery[QUERY_MAX_LEN];
//szQuery[QUERY_MAX_LEN] = '\0';
if (g_test_server)
sys_log(0, "ItemCache::Delete : DELETE %u", m_data.id);
SPDLOG_TRACE("ItemCache::Delete : DELETE {}", m_data.id);
m_data.vnum = 0;
m_bNeedQuery = true;
@ -53,19 +52,18 @@ void CItemCache::Delete()
OnFlush();
//m_bNeedQuery = false;
//m_lastUpdateTime = time(0) - m_expireTime; // <EFBFBD>ٷ<EFBFBD> Ÿ<>Ӿƿ<D3BE> <20>ǵ<EFBFBD><C7B5><EFBFBD> <20><><EFBFBD><EFBFBD>.
//m_lastUpdateTime = time(0) - m_expireTime; // 바로 타임아웃 되도록 하자.
}
void CItemCache::OnFlush()
{
if (m_data.vnum == 0) // vnum<EFBFBD><EFBFBD> 0<≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD><CFB6><EFBFBD> ǥ<>õ<EFBFBD> <20><><EFBFBD>̴<EFBFBD>.
if (m_data.vnum == 0) // vnum이 0이면 삭제하라고 표시된 것이다.
{
char szQuery[QUERY_MAX_LEN];
snprintf(szQuery, sizeof(szQuery), "DELETE FROM item%s WHERE id=%u", GetTablePostfix(), m_data.id);
CDBManager::instance().ReturnQuery(szQuery, QID_ITEM_DESTROY, 0, NULL);
if (g_test_server)
sys_log(0, "ItemCache::Flush : DELETE %u %s", m_data.id, szQuery);
SPDLOG_TRACE("ItemCache::Flush : DELETE {} {}", m_data.id, szQuery);
}
else
{
@ -141,8 +139,7 @@ void CItemCache::OnFlush()
char szItemQuery[QUERY_MAX_LEN + QUERY_MAX_LEN + 100];
snprintf(szItemQuery, sizeof(szItemQuery), "REPLACE INTO item%s (%s) VALUES(%s)", GetTablePostfix(), szColumns, szValues);
if (g_test_server)
sys_log(0, "ItemCache::Flush :REPLACE (%s)", szItemQuery);
SPDLOG_TRACE("ItemCache::Flush :REPLACE ({})", szItemQuery);
CDBManager::instance().ReturnQuery(szItemQuery, QID_ITEM_SAVE, 0, NULL);
@ -167,8 +164,7 @@ CPlayerTableCache::~CPlayerTableCache()
void CPlayerTableCache::OnFlush()
{
if (g_test_server)
sys_log(0, "PlayerTableCache::Flush : %s", m_data.name);
SPDLOG_TRACE("PlayerTableCache::Flush : {}", m_data.name);
char szQuery[QUERY_MAX_LEN];
CreatePlayerSaveQuery(szQuery, sizeof(szQuery), &m_data);
@ -190,7 +186,7 @@ CItemPriceListTableCache::CItemPriceListTableCache()
void CItemPriceListTableCache::UpdateList(const TItemPriceListTable* pUpdateList)
{
//
// <EFBFBD>̹<EFBFBD> ij<>̵<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>۰<EFBFBD> <20>ߺ<EFBFBD><DFBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<><C3A3> <20>ߺ<EFBFBD><DFBA><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> tmpvec <EFBFBD><EFBFBD> <20>ִ´<D6B4>.
// 이미 캐싱된 아이템과 중복된 아이템을 찾고 중복되지 않는 이전 정보는 tmpvec 에 넣는다.
//
std::vector<TItemPriceInfo> tmpvec;
@ -206,12 +202,12 @@ void CItemPriceListTableCache::UpdateList(const TItemPriceListTable* pUpdateList
}
//
// pUpdateList <EFBFBD><EFBFBD> m_data <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> tmpvec <20><> <20>տ<EFBFBD><D5BF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ŭ <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// pUpdateList m_data 에 복사하고 남은 공간을 tmpvec 의 앞에서 부터 남은 만큼 복사한다.
//
if (pUpdateList->byCount > SHOP_PRICELIST_MAX_NUM)
{
sys_err("Count overflow!");
SPDLOG_ERROR("Count overflow!");
return;
}
@ -219,7 +215,7 @@ void CItemPriceListTableCache::UpdateList(const TItemPriceListTable* pUpdateList
memcpy(m_data.aPriceInfo, pUpdateList->aPriceInfo, sizeof(TItemPriceInfo) * pUpdateList->byCount);
int nDeletedNum; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
int nDeletedNum; // 삭제된 가격정보의 갯수
if (pUpdateList->byCount < SHOP_PRICELIST_MAX_NUM)
{
@ -238,8 +234,8 @@ void CItemPriceListTableCache::UpdateList(const TItemPriceListTable* pUpdateList
m_bNeedQuery = true;
sys_log(0,
"ItemPriceListTableCache::UpdateList : OwnerID[%u] Update [%u] Items, Delete [%u] Items, Total [%u] Items",
SPDLOG_DEBUG(
"ItemPriceListTableCache::UpdateList : OwnerID[{}] Update [{}] Items, Delete [{}] Items, Total [{}] Items",
m_data.dwOwnerID, pUpdateList->byCount, nDeletedNum, m_data.byCount);
}
@ -248,14 +244,14 @@ void CItemPriceListTableCache::OnFlush()
char szQuery[QUERY_MAX_LEN];
//
// <EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DB <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// 이 캐시의 소유자에 대한 기존에 DB 에 저장된 아이템 가격정보를 모두 삭제한다.
//
snprintf(szQuery, sizeof(szQuery), "DELETE FROM myshop_pricelist%s WHERE owner_id = %u", GetTablePostfix(), m_data.dwOwnerID);
CDBManager::instance().ReturnQuery(szQuery, QID_ITEMPRICE_DESTROY, 0, NULL);
//
// ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> DB <20><> <20><><EFBFBD><EFBFBD>.
// 캐시의 내용을 모두 DB 에 쓴다.
//
for (int idx = 0; idx < m_data.byCount; ++idx)
@ -266,7 +262,7 @@ void CItemPriceListTableCache::OnFlush()
CDBManager::instance().ReturnQuery(szQuery, QID_ITEMPRICE_SAVE, 0, NULL);
}
sys_log(0, "ItemPriceListTableCache::Flush : OwnerID[%u] Update [%u]Items", m_data.dwOwnerID, m_data.byCount);
SPDLOG_DEBUG("ItemPriceListTableCache::Flush : OwnerID[{}] Update [{}]Items", m_data.dwOwnerID, m_data.byCount);
m_bNeedQuery = false;
}
@ -287,8 +283,7 @@ void CAuctionItemInfoCache::Delete()
if (m_data.item_num == 0)
return;
if (g_test_server)
sys_log(0, "CAuctionItemInfoCache::Delete : DELETE %u", m_data.item_id);
SPDLOG_TRACE("CAuctionItemInfoCache::Delete : DELETE {}", m_data.item_id);
m_data.item_num = 0;
m_bNeedQuery = true;

View File

@ -29,7 +29,7 @@ class CPlayerTableCache : public cache<TPlayerTable>
// MYSHOP_PRICE_LIST
/**
* @class CItemPriceListTableCache
* @brief <EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> ij<><C4B3> class
* @brief 개인상점의 아이템 가격정보 리스트에 대한 캐시 class
* @version 05/06/10 Bang2ni - First release.
*/
class CItemPriceListTableCache : public cache< TItemPriceListTable >
@ -38,20 +38,20 @@ class CItemPriceListTableCache : public cache< TItemPriceListTable >
/// Constructor
/**
* ij<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
* 캐시 만료 시간을 설정한다.
*/
CItemPriceListTableCache(void);
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>
/// 리스트 갱신
/**
* @param [in] pUpdateList <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ
* @param [in] pUpdateList 갱신할 리스트
*
* ij<EFBFBD>õ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> á<><C3A1> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<>̵<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڿ<EFBFBD><DABF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
* 캐시된 가격정보를 갱신한다.
* 가격정보 리스트가 가득 찼을 경우 기존에 캐싱된 정보들을 뒤에서 부터 삭제한다.
*/
void UpdateList(const TItemPriceListTable* pUpdateList);
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DB <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
/// 가격정보를 DB 에 기록한다.
virtual void OnFlush(void);
private:

File diff suppressed because it is too large Load Diff

View File

@ -48,10 +48,10 @@ class CClientManager : public singleton<CClientManager>
typedef std::unordered_map<short, BYTE> TChannelStatusMap;
// MYSHOP_PRICE_LIST
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><>û <20><><EFBFBD><EFBFBD>
/// 아이템 가격정보 리스트 요청 정보
/**
* first: Peer handle
* second: <EFBFBD><EFBFBD>û<EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7>̾<EFBFBD><CCBE><EFBFBD> ID
* second: 요청한 플레이어의 ID
*/
typedef std::pair< DWORD, DWORD > TItemPricelistReqInfo;
// END_OF_MYSHOP_PRICE_LIST
@ -77,7 +77,7 @@ class CClientManager : public singleton<CClientManager>
pAccountTable = NULL;
player_id = dwPID;
};
//<EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//독일선물기능용 생성자
ClientHandleInfo(DWORD argHandle, DWORD dwPID, DWORD accountId)
{
dwHandle = argHandle;
@ -116,7 +116,7 @@ class CClientManager : public singleton<CClientManager>
void SetChinaEventServer(bool flag) { m_bChinaEventServer = flag; }
bool IsChinaEventServer() { return m_bChinaEventServer; }
DWORD GetUserCount(); // <EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
DWORD GetUserCount(); // 접속된 사용자 수를 리턴 한다.
void SendAllGuildSkillRechargePacket();
void SendTime();
@ -136,23 +136,23 @@ class CClientManager : public singleton<CClientManager>
void UpdateItemCache();
// MYSHOP_PRICE_LIST
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ ij<>ø<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
/// 가격정보 리스트 캐시를 가져온다.
/**
* @param [in] dwID <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.(<28>÷<EFBFBD><C3B7>̾<EFBFBD> ID)
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param [in] dwID 가격정보 리스트의 소유자.(플레이어 ID)
* @return 가격정보 리스트 캐시의 포인터
*/
CItemPriceListTableCache* GetItemPriceListCache(DWORD dwID);
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ ij<>ø<EFBFBD> <20>ִ´<D6B4>.
/// 가격정보 리스트 캐시를 넣는다.
/**
* @param [in] pItemPriceList ij<EFBFBD>ÿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ
* @param [in] pItemPriceList 캐시에 넣을 아이템 가격정보 리스트
*
* ij<EFBFBD>ð<EFBFBD> <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Update <EFBFBD><EFBFBD> <20>ƴ<EFBFBD> replace <EFBFBD>Ѵ<EFBFBD>.
* 캐시가 이미 있으면 Update 가 아닌 replace 한다.
*/
void PutItemPriceListCache(const TItemPriceListTable* pItemPriceList);
/// Flush <EFBFBD>ð<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ ij<>ø<EFBFBD> Flush <20><><EFBFBD>ְ<EFBFBD> ij<>ÿ<EFBFBD><C3BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
/// Flush 시간이 만료된 아이템 가격정보 리스트 캐시를 Flush 해주고 캐시에서 삭제한다.
void UpdateItemPriceListCache(void);
// END_OF_MYSHOP_PRICE_LIST
@ -170,8 +170,8 @@ class CClientManager : public singleton<CClientManager>
void SendNotice(const char * c_pszFormat, ...);
std::string GetCommand(char* str); //<EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɿ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ɾ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD>
void ItemAward(CPeer * peer, char* login); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
std::string GetCommand(char* str); //독일선물기능에서 명령어 얻는 함수
void ItemAward(CPeer * peer, char* login); //독일 선물 기능
CPeer * AddPeer(bufferevent* bufev, sockaddr* addr);
void RemovePeer(CPeer * pPeer);
@ -199,9 +199,9 @@ class CClientManager : public singleton<CClientManager>
bool InitializeObjectTable();
bool InitializeMonarch();
// mob_proto.txt, item_proto.txt<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> mob_proto, item_proto<EFBFBD><EFBFBD> real db<EFBFBD><EFBFBD> <20>ݿ<EFBFBD>.
// item_proto, mob_proto<EFBFBD><EFBFBD> db<EFBFBD><EFBFBD> <20>ݿ<EFBFBD><DDBF><EFBFBD><EFBFBD><EFBFBD> <20>ʾƵ<CABE>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ư<EFBFBD><C6B0>µ<EFBFBD><C2B5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
// <EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EEBFA1> db<EFBFBD><EFBFBD> item_proto, mob_proto<EFBFBD><EFBFBD> <20>о<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߻<EFBFBD><DFBB>Ѵ<EFBFBD>.
// mob_proto.txt, item_proto.txt에서 읽은 mob_proto, item_proto real db에 반영.
// item_proto, mob_proto db에 반영하지 않아도, 게임 돌아가는데는 문제가 없지만,
// 운영툴 등에서 db item_proto, mob_proto를 읽어 쓰기 때문에 문제가 발생한다.
bool MirrorMobTableIntoDB();
bool MirrorItemTableIntoDB();
@ -260,20 +260,20 @@ class CClientManager : public singleton<CClientManager>
// END_PLAYER_INDEX_CREATE_BUG_FIX
// MYSHOP_PRICE_LIST
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Result ó<EFBFBD><EFBFBD>
/// 가격정보 로드 쿼리에 대한 Result 처리
/**
* @param peer <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>û<EFBFBD><C3BB> Game server <EFBFBD><EFBFBD> peer <EFBFBD><EFBFBD>ü <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param pMsg <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Result <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param peer 가격정보를 요청한 Game server peer 객체 포인터
* @param pMsg 쿼리의 Result 로 받은 객체의 포인터
*
* <EFBFBD>ε<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> ij<>ÿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> peer <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
* 로드된 가격정보 리스트를 캐시에 저장하고 peer 에게 리스트를 보내준다.
*/
void RESULT_PRICELIST_LOAD(CPeer* peer, SQLMsg* pMsg);
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Result ó<EFBFBD><EFBFBD>
/// 가격정보 업데이트를 위한 로드 쿼리에 대한 Result 처리
/**
* @param pMsg <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Result <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param pMsg 쿼리의 Result 로 받은 객체의 포인터
*
* <EFBFBD>ε<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ ij<>ø<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>Ѵ<EFBFBD>.
* 로드된 정보로 가격정보 리스트 캐시를 만들고 업데이트 받은 가격정보로 업데이트 한다.
*/
void RESULT_PRICELIST_LOAD_FOR_UPDATE(SQLMsg* pMsg);
// END_OF_MYSHOP_PRICE_LIST
@ -310,9 +310,6 @@ class CClientManager : public singleton<CClientManager>
void SendPartyOnSetup(CPeer * peer);
void QUERY_HIGHSCORE_REGISTER(CPeer * peer, TPacketGDHighscore* data);
void RESULT_HIGHSCORE_REGISTER(CPeer * pkPeer, SQLMsg * msg);
void QUERY_FLUSH_CACHE(CPeer * pkPeer, const char * c_pData);
void QUERY_PARTY_CREATE(CPeer * peer, TPacketPartyCreate* p);
@ -327,7 +324,6 @@ class CClientManager : public singleton<CClientManager>
void QUERY_CHANGE_NAME(CPeer * peer, DWORD dwHandle, TPacketGDChangeName * p);
void GetPlayerFromRes(TPlayerTable * player_table, MYSQL_RES* res);
void QUERY_SMS(CPeer * pkPeer, TPacketGDSMS * p);
void QUERY_LOGIN_KEY(CPeer * pkPeer, TPacketGDLoginKey * p);
void AddGuildPriv(TPacketGiveGuildPriv* p);
@ -347,13 +343,7 @@ class CClientManager : public singleton<CClientManager>
void SetEventFlag(TPacketSetEventFlag* p);
void SendEventFlagsOnSetup(CPeer* peer);
void BillingExpire(TPacketBillingExpire * p);
void BillingCheck(const char * data);
void SendAllLoginToBilling();
void SendLoginToBilling(CLoginData * pkLD, bool bLogin);
// <20><>ȥ
// 결혼
void MarriageAdd(TPacketMarriageAdd * p);
void MarriageUpdate(TPacketMarriageUpdate * p);
void MarriageRemove(TPacketMarriageRemove * p);
@ -363,19 +353,19 @@ class CClientManager : public singleton<CClientManager>
void WeddingEnd(TPacketWeddingEnd * p);
// MYSHOP_PRICE_LIST
// <EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 개인상점 가격정보
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><>Ŷ(HEADER_GD_MYSHOP_PRICELIST_UPDATE) ó<EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD>
/// 아이템 가격정보 리스트 업데이트 패킷(HEADER_GD_MYSHOP_PRICELIST_UPDATE) 처리함수
/**
* @param [in] pPacket <EFBFBD><EFBFBD>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param [in] pPacket 패킷 데이터의 포인터
*/
void MyshopPricelistUpdate(const TPacketMyshopPricelistHeader* pPacket);
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><>û <20><>Ŷ(HEADER_GD_MYSHOP_PRICELIST_REQ) ó<EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD>
/// 아이템 가격정보 리스트 요청 패킷(HEADER_GD_MYSHOP_PRICELIST_REQ) 처리함수
/**
* @param peer <EFBFBD><EFBFBD>Ŷ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Game server <EFBFBD><EFBFBD> peer <EFBFBD><EFBFBD>ü<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param [in] dwHandle <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>û<EFBFBD><C3BB> peer <20><> <20>ڵ<EFBFBD>
* @param [in] dwPlayerID <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><>û<EFBFBD><C3BB> <20>÷<EFBFBD><C3B7>̾<EFBFBD><CCBE><EFBFBD> ID
* @param peer 패킷을 보낸 Game server peer 객체의 포인터
* @param [in] dwHandle 가격정보를 요청한 peer 의 핸들
* @param [in] dwPlayerID 가격정보 리스트를 요청한 플레이어의 ID
*/
void MyshopPricelistRequest(CPeer* peer, DWORD dwHandle, DWORD dwPlayerID);
// END_OF_MYSHOP_PRICE_LIST
@ -385,10 +375,6 @@ class CClientManager : public singleton<CClientManager>
void DeleteObject(DWORD dwID);
void UpdateLand(DWORD * pdw);
// VCard
void VCard(TPacketGDVCard * p);
void VCardProcess();
// BLOCK_CHAT
void BlockChat(TPacketBlockChat * p);
// END_OF_BLOCK_CHAT
@ -413,7 +399,7 @@ class CClientManager : public singleton<CClientManager>
typedef std::unordered_map<DWORD, CLoginData *> TLoginDataByAID;
TLoginDataByAID m_map_pkLoginDataByAID;
// Login LoginData pair (<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20>Ǿ<EFBFBD><C7BE>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>)
// Login LoginData pair (실제 로그인 되어있는 계정)
typedef std::unordered_map<std::string, CLoginData *> TLogonAccountMap;
TLogonAccountMap m_map_kLogonAccount;
@ -441,18 +427,16 @@ class CClientManager : public singleton<CClientManager>
std::vector<building::TObjectProto> m_vec_kObjectProto;
std::map<DWORD, building::TObject *> m_map_pkObjectTable;
std::queue<TPacketGDVCard> m_queue_vcard;
bool m_bShutdowned;
TPlayerTableCacheMap m_map_playerCache; // <EFBFBD>÷<EFBFBD><EFBFBD>̾<EFBFBD> id<EFBFBD><EFBFBD> key
TPlayerTableCacheMap m_map_playerCache; // 플레이어 id key
TItemCacheMap m_map_itemCache; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> id<EFBFBD><EFBFBD> key
TItemCacheSetPtrMap m_map_pkItemCacheSetPtr; // <EFBFBD>÷<EFBFBD><EFBFBD>̾<EFBFBD> id<EFBFBD><EFBFBD> key, <EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7>̾ <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֳ<EFBFBD>?
TItemCacheMap m_map_itemCache; // 아이템 id key
TItemCacheSetPtrMap m_map_pkItemCacheSetPtr; // 플레이어 id key, 이 플레이어가 어떤 아이템 캐쉬를 가지고 있나?
// MYSHOP_PRICE_LIST
/// <EFBFBD>÷<EFBFBD><EFBFBD>̾ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ map. key: <EFBFBD>÷<EFBFBD><EFBFBD>̾<EFBFBD> ID, value: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ ij<><C4B3>
TItemPriceListCacheMap m_mapItemPriceListCache; ///< <EFBFBD>÷<EFBFBD><EFBFBD>̾ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ
/// 플레이어별 아이템 가격정보 리스트 map. key: 플레이어 ID, value: 가격정보 리스트 캐시
TItemPriceListCacheMap m_mapItemPriceListCache; ///< 플레이어별 아이템 가격정보 리스트
// END_OF_MYSHOP_PRICE_LIST
TChannelStatusMap m_mChannelStatus;
@ -490,7 +474,7 @@ class CClientManager : public singleton<CClientManager>
//BOOT_LOCALIZATION
public:
/* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ
/* 로컬 정보 초기화
**/
bool InitializeLocalization();
@ -545,7 +529,6 @@ class CClientManager : public singleton<CClientManager>
//END_MONARCH
void ChangeMonarchLord(CPeer* peer, DWORD dwHandle, TPacketChangeMonarchLord* info);
void BlockException(TPacketBlockException *data);
void SendSpareItemIDRange(CPeer* peer);

View File

@ -16,84 +16,84 @@ bool CClientManager::InitializeTables()
{
if (!InitializeMobTable())
{
sys_err("InitializeMobTable FAILED");
SPDLOG_ERROR("InitializeMobTable FAILED");
return false;
}
if (!MirrorMobTableIntoDB())
{
sys_err("MirrorMobTableIntoDB FAILED");
SPDLOG_ERROR("MirrorMobTableIntoDB FAILED");
return false;
}
if (!InitializeItemTable())
{
sys_err("InitializeItemTable FAILED");
SPDLOG_ERROR("InitializeItemTable FAILED");
return false;
}
if (!MirrorItemTableIntoDB())
{
sys_err("MirrorItemTableIntoDB FAILED");
SPDLOG_ERROR("MirrorItemTableIntoDB FAILED");
return false;
}
if (!InitializeShopTable())
{
sys_err("InitializeShopTable FAILED");
SPDLOG_ERROR("InitializeShopTable FAILED");
return false;
}
if (!InitializeSkillTable())
{
sys_err("InitializeSkillTable FAILED");
SPDLOG_ERROR("InitializeSkillTable FAILED");
return false;
}
if (!InitializeRefineTable())
{
sys_err("InitializeRefineTable FAILED");
SPDLOG_ERROR("InitializeRefineTable FAILED");
return false;
}
if (!InitializeItemAttrTable())
{
sys_err("InitializeItemAttrTable FAILED");
SPDLOG_ERROR("InitializeItemAttrTable FAILED");
return false;
}
if (!InitializeItemRareTable())
{
sys_err("InitializeItemRareTable FAILED");
SPDLOG_ERROR("InitializeItemRareTable FAILED");
return false;
}
if (!InitializeBanwordTable())
{
sys_err("InitializeBanwordTable FAILED");
SPDLOG_ERROR("InitializeBanwordTable FAILED");
return false;
}
if (!InitializeLandTable())
{
sys_err("InitializeLandTable FAILED");
SPDLOG_ERROR("InitializeLandTable FAILED");
return false;
}
if (!InitializeObjectProto())
{
sys_err("InitializeObjectProto FAILED");
SPDLOG_ERROR("InitializeObjectProto FAILED");
return false;
}
if (!InitializeObjectTable())
{
sys_err("InitializeObjectTable FAILED");
SPDLOG_ERROR("InitializeObjectTable FAILED");
return false;
}
if (!InitializeMonarch())
{
sys_err("InitializeMonarch FAILED");
SPDLOG_ERROR("InitializeMonarch FAILED");
return false;
}
@ -117,7 +117,7 @@ bool CClientManager::InitializeRefineTable()
if (m_pRefineTable)
{
sys_log(0, "RELOAD: refine_proto");
SPDLOG_DEBUG("RELOAD: refine_proto");
delete [] m_pRefineTable;
m_pRefineTable = NULL;
}
@ -153,7 +153,7 @@ bool CClientManager::InitializeRefineTable()
}
}
sys_log(0, "REFINE: id %ld cost %d prob %d mat1 %lu cnt1 %d", prt->id, prt->cost, prt->prob, prt->materials[0].vnum, prt->materials[0].count);
SPDLOG_TRACE("REFINE: id {} cost {} prob {} mat1 {} cnt1 {}", prt->id, prt->cost, prt->prob, prt->materials[0].vnum, prt->materials[0].count);
prt++;
}
@ -171,42 +171,42 @@ class FCompareVnum
bool CClientManager::InitializeMobTable()
{
//================== <EFBFBD>Լ<EFBFBD> <20><><EFBFBD><EFBFBD> ==================//
//1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> : 'mob_proto.txt', 'mob_proto_test.txt', 'mob_names.txt' <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>а<EFBFBD>,
// (!)[mob_table] <EFBFBD><EFBFBD><EFBFBD>̺<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. (Ÿ<><C5B8> : TMobTable)
//2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 1) 'mob_names.txt' <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о (a)[localMap](vnum:name) <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// 2) 'mob_proto_test.txt'<EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> (a)[localMap] <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// (b)[test_map_mobTableByVnum](vnum:TMobTable) <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// 3) 'mob_proto.txt' <EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> (a)[localMap] <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// (!)[mob_table] <EFBFBD><EFBFBD><EFBFBD>̺<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// <<EFBFBD><EFBFBD><EFBFBD><EFBFBD>>
// <EFBFBD><EFBFBD> row <EFBFBD><EFBFBD> <20><>,
// (b)[test_map_mobTableByVnum],(!)[mob_table] <EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD> <20>ִ<EFBFBD> row<EFBFBD><EFBFBD>
// (b)[test_map_mobTableByVnum]<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// 4) (b)[test_map_mobTableByVnum]<EFBFBD><EFBFBD> row<EFBFBD><EFBFBD>, (!)[mob_table]<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>Ѵ<EFBFBD>.
//3. <EFBFBD>׽<EFBFBD>Ʈ
// 1)'mob_proto.txt' <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> mob_table<EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EEB0AC><EFBFBD><EFBFBD>. -> <EFBFBD>Ϸ<EFBFBD>
// 2)'mob_names.txt' <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> mob_table<EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EEB0AC><EFBFBD><EFBFBD>.
// 3)'mob_proto_test.txt' <EFBFBD><EFBFBD><EFBFBD><EFBFBD> [<5B><>ġ<EFBFBD><C4A1>] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> mob_table <20><> <20><> <20><><EFBFBD><EFBFBD><EEB0AC><EFBFBD><EFBFBD>.
// 4)'mob_proto_test.txt' <EFBFBD><EFBFBD><EFBFBD><EFBFBD> [<5B><><EFBFBD>ο<EFBFBD>] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> mob_table <20><> <20><> <20><><EFBFBD><EFBFBD><EEB0AC><EFBFBD><EFBFBD>.
// 5) (<EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>۵<EFBFBD> <20>ϴ<EFBFBD><CFB4><EFBFBD>.
//================== 함수 설명 ==================//
//1. 요약 : 'mob_proto.txt', 'mob_proto_test.txt', 'mob_names.txt' 파일을 읽고,
// (!)[mob_table] 테이블 오브젝트를 생성한다. (타입 : TMobTable)
//2. 순서
// 1) 'mob_names.txt' 파일을 읽어서 (a)[localMap](vnum:name) 맵을 만든다.
// 2) 'mob_proto_test.txt'파일과 (a)[localMap] 맵으로
// (b)[test_map_mobTableByVnum](vnum:TMobTable) 맵을 생성한다.
// 3) 'mob_proto.txt' 파일과 (a)[localMap] 맵으로
// (!)[mob_table] 테이블을 만든다.
// <참고>
// row 들 중,
// (b)[test_map_mobTableByVnum],(!)[mob_table] 모두에 있는 row
// (b)[test_map_mobTableByVnum]의 것을 사용한다.
// 4) (b)[test_map_mobTableByVnum] row, (!)[mob_table]에 없는 것을 추가한다.
//3. 테스트
// 1)'mob_proto.txt' 정보가 mob_table에 잘 들어갔는지. -> 완료
// 2)'mob_names.txt' 정보가 mob_table에 잘 들어갔는지.
// 3)'mob_proto_test.txt' 에서 [겹치는] 정보가 mob_table 에 잘 들어갔는지.
// 4)'mob_proto_test.txt' 에서 [새로운] 정보가 mob_table 에 잘 들어갔는지.
// 5) (최종) 게임 클라이언트에서 제대로 작동 하는지.
//_______________________________________________//
//===============================================//
// 1) 'mob_names.txt' <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о (a)[localMap] <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
//<(a)localMap <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>>
// 1) 'mob_names.txt' 파일을 읽어서 (a)[localMap] 맵을 만든다.
//<(a)localMap 맵 생성>
map<int,const char*> localMap;
bool isNameFile = true;
//<<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>б<EFBFBD>>
//<파일 읽기>
cCsvTable nameData;
if(!nameData.Load("mob_names.txt",'\t'))
{
fprintf(stderr, "mob_names.txt <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>\n");
SPDLOG_ERROR("mob_names.txt Failed to read the file");
isNameFile = false;
} else {
nameData.Next(); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>row <20><><EFBFBD><EFBFBD>.
nameData.Next(); //설명row 생략.
while(nameData.Next()) {
localMap[atoi(nameData.AsStringByIndex(0))] = nameData.AsStringByIndex(1);
}
@ -215,35 +215,35 @@ bool CClientManager::InitializeMobTable()
//===============================================//
// 2) 'mob_proto_test.txt'<EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> (a)localMap <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// (b)[test_map_mobTableByVnum](vnum:TMobTable) <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// 2) 'mob_proto_test.txt'파일과 (a)localMap 맵으로
// (b)[test_map_mobTableByVnum](vnum:TMobTable) 맵을 생성한다.
//0.
set<int> vnumSet; //<EFBFBD>׽<EFBFBD>Ʈ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20>űԿ<C5B1><D4BF><EFBFBD> Ȯ<>ο<EFBFBD> <20><><EFBFBD><EFBFBD>.
//1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD>
set<int> vnumSet; //테스트용 파일 데이터중, 신규여부 확인에 사용.
//1. 파일 읽어오기
bool isTestFile = true;
cCsvTable test_data;
if(!test_data.Load("mob_proto_test.txt",'\t'))
{
fprintf(stderr, "<EFBFBD>׽<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>. <20>״<EFBFBD><D7B4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.\n");
SPDLOG_ERROR("No test file exists, proceed as is.");
isTestFile = false;
}
//2. (c)[test_map_mobTableByVnum](vnum:TMobTable) <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
//2. (c)[test_map_mobTableByVnum](vnum:TMobTable) 맵 생성.
map<DWORD, TMobTable *> test_map_mobTableByVnum;
if (isTestFile) {
test_data.Next(); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ο<EFBFBD> <20>Ѿ<D1BE><EEB0A1>.
test_data.Next(); //설명 로우 넘어가기.
//<EFBFBD><EFBFBD>. <20>׽<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD> <20><><EFBFBD><EFBFBD>.
//ㄱ. 테스트 몬스터 테이블 생성.
TMobTable * test_mob_table = NULL;
int test_MobTableSize = test_data.m_File.GetRowCount()-1;
test_mob_table = new TMobTable[test_MobTableSize];
memset(test_mob_table, 0, sizeof(TMobTable) * test_MobTableSize);
//<EFBFBD><EFBFBD>. <20>׽<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ְ<EFBFBD>, <20>ʿ<EFBFBD><CABF><EFBFBD><EFBFBD><EFBFBD> <20>ֱ<EFBFBD>.
//ㄴ. 테스트 몬스터 테이블에 값을 넣고, 맵에까지 넣기.
while(test_data.Next()) {
if (!Set_Proto_Mob_Table(test_mob_table, test_data, localMap))
{
fprintf(stderr, "<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.\n");
SPDLOG_ERROR("Mob proto table setup failed.");
}
test_map_mobTableByVnum.insert(std::map<DWORD, TMobTable *>::value_type(test_mob_table->dwVnum, test_mob_table));
@ -254,22 +254,22 @@ bool CClientManager::InitializeMobTable()
}
// 3) 'mob_proto.txt' <EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> (a)[localMap] <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// (!)[mob_table] <EFBFBD><EFBFBD><EFBFBD>̺<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// <<EFBFBD><EFBFBD><EFBFBD><EFBFBD>>
// <EFBFBD><EFBFBD> row <EFBFBD><EFBFBD> <20><>,
// (b)[test_map_mobTableByVnum],(!)[mob_table] <EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD> <20>ִ<EFBFBD> row<EFBFBD><EFBFBD>
// (b)[test_map_mobTableByVnum]<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// 3) 'mob_proto.txt' 파일과 (a)[localMap] 맵으로
// (!)[mob_table] 테이블을 만든다.
// <참고>
// row 들 중,
// (b)[test_map_mobTableByVnum],(!)[mob_table] 모두에 있는 row
// (b)[test_map_mobTableByVnum]의 것을 사용한다.
//1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>б<EFBFBD>.
//1. 파일 읽기.
cCsvTable data;
if(!data.Load("mob_proto.txt",'\t')) {
fprintf(stderr, "mob_proto.txt <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>\n");
SPDLOG_ERROR("mob_proto.txt Failed to read the file");
return false;
}
data.Next(); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> row <EFBFBD>Ѿ<EFBFBD><EFBFBD>
//2. (!)[mob_table] <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD>
//2.1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ľ<EFBFBD>
data.Next(); //설명 row 넘어가기
//2. (!)[mob_table] 생성하기
//2.1 새로 추가되는 갯수를 파악
int addNumber = 0;
while(data.Next()) {
int vnum = atoi(data.AsStringByIndex(0));
@ -279,35 +279,35 @@ bool CClientManager::InitializeMobTable()
addNumber++;
}
}
//data<EFBFBD><EFBFBD> <20>ٽ<EFBFBD> ù<>ٷ<EFBFBD> <20>ű<EFBFBD><C5B1><EFBFBD>.(<28>ٽ<EFBFBD> <20>о<EFBFBD><D0BE>´<EFBFBD>;;)
//data를 다시 첫줄로 옮긴다.(다시 읽어온다;;)
data.Destroy();
if(!data.Load("mob_proto.txt",'\t'))
{
fprintf(stderr, "mob_proto.txt <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>\n");
SPDLOG_ERROR("mob_proto.txt Failed to read the file");
return false;
}
data.Next(); //<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Į<><C4AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>κ<EFBFBD>)
//2.2 ũ<EFBFBD><20>°<EFBFBD> mob_table <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
data.Next(); //맨 윗줄 제외 (아이템 칼럼을 설명하는 부분)
//2.2 크기에 맞게 mob_table 생성
if (!m_vec_mobTable.empty())
{
sys_log(0, "RELOAD: mob_proto");
SPDLOG_DEBUG("RELOAD: mob_proto");
m_vec_mobTable.clear();
}
m_vec_mobTable.resize(data.m_File.GetRowCount()-1 + addNumber);
memset(&m_vec_mobTable[0], 0, sizeof(TMobTable) * m_vec_mobTable.size());
TMobTable * mob_table = &m_vec_mobTable[0];
//2.3 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ä<><C3A4><EFBFBD><EFBFBD>
//2.3 데이터 채우기
while (data.Next())
{
int col = 0;
//(b)[test_map_mobTableByVnum]<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> row<6F><77> <20>ִ<EFBFBD><D6B4><EFBFBD> <20><><EFBFBD><EFBFBD>.
//(b)[test_map_mobTableByVnum]에 같은 row가 있는지 조사.
bool isSameRow = true;
std::map<DWORD, TMobTable *>::iterator it_map_mobTable;
it_map_mobTable = test_map_mobTableByVnum.find(atoi(data.AsStringByIndex(col)));
if(it_map_mobTable == test_map_mobTableByVnum.end()) {
isSameRow = false;
}
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD> row <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (b)<29><><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE>´<EFBFBD>.
//같은 row 가 있으면 (b)에서 읽어온다.
if(isSameRow) {
TMobTable *tempTable = it_map_mobTable->second;
@ -378,39 +378,39 @@ bool CClientManager::InitializeMobTable()
if (!Set_Proto_Mob_Table(mob_table, data, localMap))
{
fprintf(stderr, "<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.\n");
SPDLOG_ERROR("Mob proto table setup failed.");
}
}
//<EFBFBD>¿<EFBFBD> vnum <EFBFBD>߰<EFBFBD>
//셋에 vnum 추가
vnumSet.insert(mob_table->dwVnum);
sys_log(1, "MOB #%-5d %-24s %-24s level: %-3u rank: %u empire: %d", mob_table->dwVnum, mob_table->szName, mob_table->szLocaleName, mob_table->bLevel, mob_table->bRank, mob_table->bEmpire);
SPDLOG_TRACE("MOB #{:<5} {:24} {:24} level: {:<3} rank: {} empire: {}", mob_table->dwVnum, mob_table->szName, mob_table->szLocaleName, mob_table->bLevel, mob_table->bRank, mob_table->bEmpire);
++mob_table;
}
//_____________________________________________________//
// 4) (b)[test_map_mobTableByVnum]<EFBFBD><EFBFBD> row<EFBFBD><EFBFBD>, (!)[mob_table]<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>Ѵ<EFBFBD>.
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٽ<EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD>.
// 4) (b)[test_map_mobTableByVnum] row, (!)[mob_table]에 없는 것을 추가한다.
//파일 다시 읽어오기.
test_data.Destroy();
isTestFile = true;
test_data;
if(!test_data.Load("mob_proto_test.txt",'\t'))
{
fprintf(stderr, "<EFBFBD>׽<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>. <20>״<EFBFBD><D7B4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.\n");
SPDLOG_ERROR("No test file exists, proceed as is.");
isTestFile = false;
}
if(isTestFile) {
test_data.Next(); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ο<EFBFBD> <20>Ѿ<D1BE><EEB0A1>.
test_data.Next(); //설명 로우 넘어가기.
while (test_data.Next()) //<EFBFBD>׽<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ⱦ<C8BE><EEB3AA><EFBFBD><EFBFBD>,<2C><><EFBFBD>ο<EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>Ѵ<EFBFBD>.
while (test_data.Next()) //테스트 데이터 각각을 훑어나가며,새로운 것을 추가한다.
{
//<EFBFBD>ߺ<EFBFBD><EFBFBD>Ǵ<EFBFBD> <20>κ<EFBFBD><CEBA≯<EFBFBD> <20>Ѿ<D1BE><EEB0A3>.
//중복되는 부분이면 넘어간다.
set<int>::iterator itVnum;
itVnum=vnumSet.find(atoi(test_data.AsStringByIndex(0)));
if (itVnum != vnumSet.end()) {
@ -419,10 +419,10 @@ bool CClientManager::InitializeMobTable()
if (!Set_Proto_Mob_Table(mob_table, test_data, localMap))
{
fprintf(stderr, "<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.\n");
SPDLOG_ERROR("Mob proto table setup failed.");
}
sys_log(0, "MOB #%-5d %-24s %-24s level: %-3u rank: %u empire: %d", mob_table->dwVnum, mob_table->szName, mob_table->szLocaleName, mob_table->bLevel, mob_table->bRank, mob_table->bEmpire);
SPDLOG_DEBUG("MOB #{:<5} {:24} {:24} level: {:<3} rank: {} empire: {}", mob_table->dwVnum, mob_table->szName, mob_table->szLocaleName, mob_table->bLevel, mob_table->bRank, mob_table->bEmpire);
++mob_table;
}
@ -447,13 +447,13 @@ bool CClientManager::InitializeShopTable()
std::unique_ptr<SQLMsg> pkMsg2(CDBManager::instance().DirectQuery(s_szQuery));
// shop<EFBFBD><EFBFBD> vnum<EFBFBD><EFBFBD> <20>ִµ<D6B4> shop_item <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>... <20><><EFBFBD>з<EFBFBD> ó<><C3B3><EFBFBD>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
// <EFBFBD><EFBFBD>ó<EFBFBD><EFBFBD><EFBFBD>Һκ<EFBFBD>
// shop vnum은 있는데 shop_item 이 없을경우... 실패로 처리되니 주의 요망.
// 고처야할부분
SQLResult * pRes2 = pkMsg2->Get();
if (!pRes2->uiNumRows)
{
sys_err("InitializeShopTable : Table count is zero.");
SPDLOG_ERROR("InitializeShopTable : Table count is zero.");
return false;
}
@ -487,7 +487,7 @@ bool CClientManager::InitializeShopTable()
str_to_number(shop_table->dwNPCVnum, data[col++]);
if (!data[col]) // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> NULL<4C><4C> <20><><EFBFBD><EFBFBD> <20>ǹǷ<C7B9>..
if (!data[col]) // 아이템이 하나도 없으면 NULL이 리턴 되므로..
continue;
TShopItemTable * pItem = &shop_table->items[shop_table->byItemCount];
@ -508,7 +508,7 @@ bool CClientManager::InitializeShopTable()
while (it != map_shop.end())
{
memcpy((m_pShopTable + i), (it++)->second, sizeof(TShopTable));
sys_log(0, "SHOP: #%d items: %d", (m_pShopTable + i)->dwVnum, (m_pShopTable + i)->byItemCount);
SPDLOG_DEBUG("SHOP: #{} items: {}", (m_pShopTable + i)->dwVnum, (m_pShopTable + i)->byItemCount);
++i;
}
@ -529,7 +529,7 @@ bool CClientManager::InitializeQuestItemTable()
if (!pRes->uiNumRows)
{
sys_err("query error or no rows: %s", query);
SPDLOG_ERROR("query error or no rows: {}", query);
return false;
}
@ -556,11 +556,11 @@ bool CClientManager::InitializeQuestItemTable()
if (m_map_itemTableByVnum.find(tbl.dwVnum) != m_map_itemTableByVnum.end())
{
sys_err("QUEST_ITEM_ERROR! %lu vnum already exist! (name %s)", tbl.dwVnum, tbl.szLocaleName);
SPDLOG_ERROR("QUEST_ITEM_ERROR! {} vnum already exist! (name {})", tbl.dwVnum, tbl.szLocaleName);
continue;
}
tbl.bType = ITEM_QUEST; // quest_item_proto <EFBFBD><EFBFBD><EFBFBD>̺<EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20>͵<EFBFBD><CDB5><EFBFBD> <20><><EFBFBD><EFBFBD> ITEM_QUEST <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
tbl.bType = ITEM_QUEST; // quest_item_proto 테이블에 있는 것들은 모두 ITEM_QUEST 유형
tbl.bSize = 1;
m_vec_itemTable.push_back(tbl);
@ -571,39 +571,39 @@ bool CClientManager::InitializeQuestItemTable()
bool CClientManager::InitializeItemTable()
{
//================== <EFBFBD>Լ<EFBFBD> <20><><EFBFBD><EFBFBD> ==================//
//1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> : 'item_proto.txt', 'item_proto_test.txt', 'item_names.txt' <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>а<EFBFBD>,
// <item_table>(TItemTable), <m_map_itemTableByVnum> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
//2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 1) 'item_names.txt' <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о (a)[localMap](vnum:name) <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// 2) 'item_proto_text.txt'<EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> (a)[localMap] <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// (b)[test_map_itemTableByVnum](vnum:TItemTable) <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// 3) 'item_proto.txt' <EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> (a)[localMap] <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// (!)[item_table], <m_map_itemTableByVnum><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// <<EFBFBD><EFBFBD><EFBFBD><EFBFBD>>
// <EFBFBD><EFBFBD> row <EFBFBD><EFBFBD> <20><>,
// (b)[test_map_itemTableByVnum],(!)[mob_table] <EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD> <20>ִ<EFBFBD> row<EFBFBD><EFBFBD>
// (b)[test_map_itemTableByVnum]<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// 4) (b)[test_map_itemTableByVnum]<EFBFBD><EFBFBD> row<EFBFBD><EFBFBD>, (!)[item_table]<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>Ѵ<EFBFBD>.
//3. <EFBFBD>׽<EFBFBD>Ʈ
// 1)'item_proto.txt' <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> item_table<EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EEB0AC><EFBFBD><EFBFBD>. -> <EFBFBD>Ϸ<EFBFBD>
// 2)'item_names.txt' <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> item_table<EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EEB0AC><EFBFBD><EFBFBD>.
// 3)'item_proto_test.txt' <EFBFBD><EFBFBD><EFBFBD><EFBFBD> [<5B><>ġ<EFBFBD><C4A1>] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> item_table <20><> <20><> <20><><EFBFBD><EFBFBD><EEB0AC><EFBFBD><EFBFBD>.
// 4)'item_proto_test.txt' <EFBFBD><EFBFBD><EFBFBD><EFBFBD> [<5B><><EFBFBD>ο<EFBFBD>] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> item_table <20><> <20><> <20><><EFBFBD><EFBFBD><EEB0AC><EFBFBD><EFBFBD>.
// 5) (<EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>۵<EFBFBD> <20>ϴ<EFBFBD><CFB4><EFBFBD>.
//================== 함수 설명 ==================//
//1. 요약 : 'item_proto.txt', 'item_proto_test.txt', 'item_names.txt' 파일을 읽고,
// <item_table>(TItemTable), <m_map_itemTableByVnum> 오브젝트를 생성한다.
//2. 순서
// 1) 'item_names.txt' 파일을 읽어서 (a)[localMap](vnum:name) 맵을 만든다.
// 2) 'item_proto_text.txt'파일과 (a)[localMap] 맵으로
// (b)[test_map_itemTableByVnum](vnum:TItemTable) 맵을 생성한다.
// 3) 'item_proto.txt' 파일과 (a)[localMap] 맵으로
// (!)[item_table], <m_map_itemTableByVnum>을 만든다.
// <참고>
// row 들 중,
// (b)[test_map_itemTableByVnum],(!)[mob_table] 모두에 있는 row
// (b)[test_map_itemTableByVnum]의 것을 사용한다.
// 4) (b)[test_map_itemTableByVnum] row, (!)[item_table]에 없는 것을 추가한다.
//3. 테스트
// 1)'item_proto.txt' 정보가 item_table에 잘 들어갔는지. -> 완료
// 2)'item_names.txt' 정보가 item_table에 잘 들어갔는지.
// 3)'item_proto_test.txt' 에서 [겹치는] 정보가 item_table 에 잘 들어갔는지.
// 4)'item_proto_test.txt' 에서 [새로운] 정보가 item_table 에 잘 들어갔는지.
// 5) (최종) 게임 클라이언트에서 제대로 작동 하는지.
//_______________________________________________//
//=================================================================================//
// 1) 'item_names.txt' <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о (a)[localMap](vnum:name) <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// 1) 'item_names.txt' 파일을 읽어서 (a)[localMap](vnum:name) 맵을 만든다.
//=================================================================================//
bool isNameFile = true;
map<int,const char*> localMap;
cCsvTable nameData;
if(!nameData.Load("item_names.txt",'\t'))
{
fprintf(stderr, "item_names.txt <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>\n");
SPDLOG_ERROR("item_names.txt Failed to read the file");
isNameFile = false;
} else {
nameData.Next();
@ -614,32 +614,32 @@ bool CClientManager::InitializeItemTable()
//_________________________________________________________________//
//=================================================================//
// 2) 'item_proto_text.txt'<EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> (a)[localMap] <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// (b)[test_map_itemTableByVnum](vnum:TItemTable) <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// 2) 'item_proto_text.txt'파일과 (a)[localMap] 맵으로
// (b)[test_map_itemTableByVnum](vnum:TItemTable) 맵을 생성한다.
//=================================================================//
map<DWORD, TItemTable *> test_map_itemTableByVnum;
//1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD>.
//1. 파일 읽어오기.
cCsvTable test_data;
if(!test_data.Load("item_proto_test.txt",'\t'))
{
fprintf(stderr, "item_proto_test.txt <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>\n");
SPDLOG_ERROR("item_proto_test.txt Failed to read the file");
//return false;
} else {
test_data.Next(); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ο<EFBFBD> <20>Ѿ<D1BE><EEB0A1>.
test_data.Next(); //설명 로우 넘어가기.
//2. <EFBFBD>׽<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD> <20><><EFBFBD><EFBFBD>.
//2. 테스트 아이템 테이블 생성.
TItemTable * test_item_table = NULL;
int test_itemTableSize = test_data.m_File.GetRowCount()-1;
test_item_table = new TItemTable[test_itemTableSize];
memset(test_item_table, 0, sizeof(TItemTable) * test_itemTableSize);
//3. <EFBFBD>׽<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ְ<EFBFBD>, <20>ʿ<EFBFBD><CABF><EFBFBD><EFBFBD><EFBFBD> <20>ֱ<EFBFBD>.
//3. 테스트 아이템 테이블에 값을 넣고, 맵에까지 넣기.
while(test_data.Next()) {
if (!Set_Proto_Item_Table(test_item_table, test_data, localMap))
{
fprintf(stderr, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.\n");
SPDLOG_ERROR("Item proto table setup failed.");
}
test_map_itemTableByVnum.insert(std::map<DWORD, TItemTable *>::value_type(test_item_table->dwVnum, test_item_table));
@ -651,35 +651,35 @@ bool CClientManager::InitializeItemTable()
//========================================================================//
// 3) 'item_proto.txt' <EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> (a)[localMap] <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// (!)[item_table], <m_map_itemTableByVnum><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// <<EFBFBD><EFBFBD><EFBFBD><EFBFBD>>
// <EFBFBD><EFBFBD> row <EFBFBD><EFBFBD> <20><>,
// (b)[test_map_itemTableByVnum],(!)[mob_table] <EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD> <20>ִ<EFBFBD> row<EFBFBD><EFBFBD>
// (b)[test_map_itemTableByVnum]<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// 3) 'item_proto.txt' 파일과 (a)[localMap] 맵으로
// (!)[item_table], <m_map_itemTableByVnum>을 만든다.
// <참고>
// row 들 중,
// (b)[test_map_itemTableByVnum],(!)[mob_table] 모두에 있는 row
// (b)[test_map_itemTableByVnum]의 것을 사용한다.
//========================================================================//
//vnum<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>. <20><><EFBFBD>ο<EFBFBD> <20>׽<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǻ<EFBFBD><C7BA>Ҷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>.
//vnum들을 저장할 셋. 새로운 테스트 아이템을 판별할때 사용된다.
set<int> vnumSet;
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD>.
//파일 읽어오기.
cCsvTable data;
if(!data.Load("item_proto.txt",'\t'))
{
fprintf(stderr, "item_proto.txt <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>\n");
SPDLOG_ERROR("item_proto.txt Failed to read the file");
return false;
}
data.Next(); //<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Į<><C4AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>κ<EFBFBD>)
data.Next(); //맨 윗줄 제외 (아이템 칼럼을 설명하는 부분)
if (!m_vec_itemTable.empty())
{
sys_log(0, "RELOAD: item_proto");
SPDLOG_DEBUG("RELOAD: item_proto");
m_vec_itemTable.clear();
m_map_itemTableByVnum.clear();
}
//===== <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD> <20><><EFBFBD><EFBFBD> =====//
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ľ<EFBFBD><C4BE>Ѵ<EFBFBD>.
//===== 아이템 테이블 생성 =====//
//새로 추가되는 갯수를 파악한다.
int addNumber = 0;
while(data.Next()) {
int vnum = atoi(data.AsStringByIndex(0));
@ -689,14 +689,14 @@ bool CClientManager::InitializeItemTable()
addNumber++;
}
}
//data<EFBFBD><EFBFBD> <20>ٽ<EFBFBD> ù<>ٷ<EFBFBD> <20>ű<EFBFBD><C5B1><EFBFBD>.(<28>ٽ<EFBFBD> <20>о<EFBFBD><D0BE>´<EFBFBD>;;)
//data를 다시 첫줄로 옮긴다.(다시 읽어온다;;)
data.Destroy();
if(!data.Load("item_proto.txt",'\t'))
{
fprintf(stderr, "item_proto.txt <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>\n");
SPDLOG_ERROR("item_proto.txt Failed to read the file");
return false;
}
data.Next(); //<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Į<><C4AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>κ<EFBFBD>)
data.Next(); //맨 윗줄 제외 (아이템 칼럼을 설명하는 부분)
m_vec_itemTable.resize(data.m_File.GetRowCount() - 1 + addNumber);
memset(&m_vec_itemTable[0], 0, sizeof(TItemTable) * m_vec_itemTable.size());
@ -711,16 +711,16 @@ bool CClientManager::InitializeItemTable()
std::map<DWORD, TItemTable *>::iterator it_map_itemTable;
it_map_itemTable = test_map_itemTableByVnum.find(atoi(data.AsStringByIndex(col)));
if(it_map_itemTable == test_map_itemTableByVnum.end()) {
//<EFBFBD><EFBFBD> Į<><C4AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
//각 칼럼 데이터 저장
if (!Set_Proto_Item_Table(item_table, data, localMap))
{
fprintf(stderr, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.\n");
SPDLOG_ERROR("Item proto table setup failed.");
}
} else { //$$$$$$$$$$$$$$$$$$$$$$$ <EFBFBD>׽<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD>!
} else { //$$$$$$$$$$$$$$$$$$$$$$$ 테스트 아이템 정보가 있다!
TItemTable *tempTable = it_map_itemTable->second;
item_table->dwVnum = tempTable->dwVnum;
@ -777,19 +777,19 @@ bool CClientManager::InitializeItemTable()
//_______________________________________________________________________//
//========================================================================//
// 4) (b)[test_map_itemTableByVnum]<EFBFBD><EFBFBD> row<EFBFBD><EFBFBD>, (!)[item_table]<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>Ѵ<EFBFBD>.
// 4) (b)[test_map_itemTableByVnum] row, (!)[item_table]에 없는 것을 추가한다.
//========================================================================//
test_data.Destroy();
if(!test_data.Load("item_proto_test.txt",'\t'))
{
fprintf(stderr, "item_proto_test.txt <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>\n");
SPDLOG_ERROR("item_proto_test.txt Failed to read the file");
//return false;
} else {
test_data.Next(); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ο<EFBFBD> <20>Ѿ<D1BE><EEB0A1>.
test_data.Next(); //설명 로우 넘어가기.
while (test_data.Next()) //<EFBFBD>׽<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ⱦ<C8BE><EEB3AA><EFBFBD><EFBFBD>,<2C><><EFBFBD>ο<EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0>Ѵ<EFBFBD>.
while (test_data.Next()) //테스트 데이터 각각을 훑어나가며,새로운 것을 추가한다.
{
//<EFBFBD>ߺ<EFBFBD><EFBFBD>Ǵ<EFBFBD> <20>κ<EFBFBD><CEBA≯<EFBFBD> <20>Ѿ<D1BE><EEB0A3>.
//중복되는 부분이면 넘어간다.
set<int>::iterator itVnum;
itVnum=vnumSet.find(atoi(test_data.AsStringByIndex(0)));
if (itVnum != vnumSet.end()) {
@ -798,7 +798,7 @@ bool CClientManager::InitializeItemTable()
if (!Set_Proto_Item_Table(item_table, test_data, localMap))
{
fprintf(stderr, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.\n");
SPDLOG_ERROR("Item proto table setup failed.");
}
@ -823,7 +823,7 @@ bool CClientManager::InitializeItemTable()
{
TItemTable * item_table = &(*(it++));
sys_log(1, "ITEM: #%-5lu %-24s %-24s VAL: %ld %ld %ld %ld %ld %ld WEAR %lu ANTI %lu IMMUNE %lu REFINE %lu REFINE_SET %u MAGIC_PCT %u",
SPDLOG_TRACE("ITEM: #{:<5} {:24} {:24} VAL: {} {} {} {} {} {} WEAR {} ANTI {} IMMUNE {} REFINE {} REFINE_SET {} MAGIC_PCT {}",
item_table->dwVnum,
item_table->szName,
item_table->szLocaleName,
@ -865,13 +865,13 @@ bool CClientManager::InitializeSkillTable()
if (!pRes->uiNumRows)
{
sys_err("no result from skill_proto");
SPDLOG_ERROR("no result from skill_proto");
return false;
}
if (!m_vec_skillTable.empty())
{
sys_log(0, "RELOAD: skill_proto");
SPDLOG_DEBUG("RELOAD: skill_proto");
m_vec_skillTable.clear();
}
@ -929,7 +929,7 @@ bool CClientManager::InitializeSkillTable()
str_to_number(t.bSkillAttrType, data[col++]);
str_to_number(t.dwTargetRange, data[col++]);
sys_log(0, "SKILL: #%d %s flag %u point %s affect %u cooldown %s", t.dwVnum, t.szName, t.dwFlag, t.szPointOn, t.dwAffectFlag, t.szCooldownPoly);
SPDLOG_TRACE("SKILL: #{} {} flag {} point {} affect {} cooldown {}", t.dwVnum, t.szName, t.dwFlag, t.szPointOn, t.dwAffectFlag, t.szCooldownPoly);
m_vec_skillTable.push_back(t);
}
@ -961,7 +961,7 @@ bool CClientManager::InitializeBanwordTable()
}
}
sys_log(0, "BANWORD: total %d", m_vec_banwordTable.size());
SPDLOG_DEBUG("BANWORD: total {}", m_vec_banwordTable.size());
return true;
}
@ -977,13 +977,13 @@ bool CClientManager::InitializeItemAttrTable()
if (!pRes->uiNumRows)
{
sys_err("no result from item_attr");
SPDLOG_ERROR("no result from item_attr");
return false;
}
if (!m_vec_itemAttrTable.empty())
{
sys_log(0, "RELOAD: item_attr");
SPDLOG_DEBUG("RELOAD: item_attr");
m_vec_itemAttrTable.clear();
}
@ -1016,7 +1016,7 @@ bool CClientManager::InitializeItemAttrTable()
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD], data[col++]);
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_EAR], data[col++]);
sys_log(0, "ITEM_ATTR: %-20s %4lu { %3d %3d %3d %3d %3d } { %d %d %d %d %d %d %d }",
SPDLOG_TRACE("ITEM_ATTR: {:20} {:4} ( {:3} {:3} {:3} {:3} {:3} ) ( {} {} {} {} {} {} {} )",
t.szApply,
t.dwProb,
t.lValues[0],
@ -1051,13 +1051,13 @@ bool CClientManager::InitializeItemRareTable()
if (!pRes->uiNumRows)
{
sys_err("no result from item_attr_rare");
SPDLOG_ERROR("no result from item_attr_rare");
return false;
}
if (!m_vec_itemRareTable.empty())
{
sys_log(0, "RELOAD: item_attr_rare");
SPDLOG_DEBUG("RELOAD: item_attr_rare");
m_vec_itemRareTable.clear();
}
@ -1090,7 +1090,7 @@ bool CClientManager::InitializeItemRareTable()
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_SHIELD], data[col++]);
str_to_number(t.bMaxLevelBySet[ATTRIBUTE_SET_EAR], data[col++]);
sys_log(0, "ITEM_RARE: %-20s %4lu { %3d %3d %3d %3d %3d } { %d %d %d %d %d %d %d }",
SPDLOG_TRACE("ITEM_RARE: {:20} {:4} ( {:3} {:3} {:3} {:3} {:3} ) ( {} {} {} {} {} {} {} )",
t.szApply,
t.dwProb,
t.lValues[0],
@ -1129,7 +1129,7 @@ bool CClientManager::InitializeLandTable()
if (!m_vec_kLandTable.empty())
{
sys_log(0, "RELOAD: land");
SPDLOG_DEBUG("RELOAD: land");
m_vec_kLandTable.clear();
}
@ -1156,7 +1156,7 @@ bool CClientManager::InitializeLandTable()
str_to_number(t.bGuildLevelLimit, data[col++]);
str_to_number(t.dwPrice, data[col++]);
sys_log(0, "LAND: %lu map %-4ld %7ldx%-7ld w %-4ld h %-4ld", t.dwID, t.lMapIndex, t.x, t.y, t.width, t.height);
SPDLOG_TRACE("LAND: {} map {:<4} {:7}x{:<7} w {:<4} h {:<4}", t.dwID, t.lMapIndex, t.x, t.y, t.width, t.height);
m_vec_kLandTable.push_back(t);
}
@ -1232,7 +1232,7 @@ bool CClientManager::InitializeObjectProto()
if (!m_vec_kObjectProto.empty())
{
sys_log(0, "RELOAD: object_proto");
SPDLOG_DEBUG("RELOAD: object_proto");
m_vec_kObjectProto.clear();
}
@ -1280,7 +1280,7 @@ bool CClientManager::InitializeObjectProto()
t.lNPCY = std::max(t.lRegion[1], t.lRegion[3])+300;
// END_OF_ADD_BUILDING_NPC
sys_log(0, "OBJ_PROTO: vnum %lu price %lu mat %lu %lu",
SPDLOG_TRACE("OBJ_PROTO: vnum {} price {} mat {} {}",
t.dwVnum, t.dwPrice, t.kMaterials[0].dwItemVnum, t.kMaterials[0].dwCount);
m_vec_kObjectProto.push_back(t);
@ -1301,7 +1301,7 @@ bool CClientManager::InitializeObjectTable()
if (!m_map_pkObjectTable.empty())
{
sys_log(0, "RELOAD: object");
SPDLOG_DEBUG("RELOAD: object");
m_map_pkObjectTable.clear();
}
@ -1327,7 +1327,7 @@ bool CClientManager::InitializeObjectTable()
str_to_number(k->zRot, data[col++]);
str_to_number(k->lLife, data[col++]);
sys_log(0, "OBJ: %lu vnum %lu map %-4ld %7ldx%-7ld life %ld",
SPDLOG_DEBUG("OBJ: {} vnum {} map {:<4} {:7}x{:<7} life {}",
k->dwID, k->dwVnum, k->lMapIndex, k->x, k->y, k->lLife);
m_map_pkObjectTable.insert(std::make_pair(k->dwID, k));

View File

@ -21,7 +21,7 @@ void CClientManager::LoadEventFlag()
TPacketSetEventFlag p;
strlcpy(p.szFlagName, row[0], sizeof(p.szFlagName));
str_to_number(p.lValue, row[1]);
sys_log(0, "EventFlag Load %s %d", p.szFlagName, p.lValue);
SPDLOG_DEBUG("EventFlag Load {} {}", p.szFlagName, p.lValue);
m_map_lEventFlag.insert(std::make_pair(std::string(p.szFlagName), p.lValue));
ForwardPacket(HEADER_DG_SET_EVENT_FLAG, &p, sizeof(TPacketSetEventFlag));
}
@ -56,10 +56,10 @@ void CClientManager::SetEventFlag(TPacketSetEventFlag* p)
//CDBManager::instance().ReturnQuery(szQuery, QID_QUEST_SAVE, 0, NULL);
CDBManager::instance().AsyncQuery(szQuery);
sys_log(0, "HEADER_GD_SET_EVENT_FLAG : Changed CClientmanager::SetEventFlag(%s %d) ", p->szFlagName, p->lValue);
SPDLOG_DEBUG("HEADER_GD_SET_EVENT_FLAG : Changed CClientmanager::SetEventFlag({} {}) ", p->szFlagName, p->lValue);
return;
}
sys_log(0, "HEADER_GD_SET_EVENT_FLAG : No Changed CClientmanager::SetEventFlag(%s %d) ", p->szFlagName, p->lValue);
SPDLOG_DEBUG("HEADER_GD_SET_EVENT_FLAG : No Changed CClientmanager::SetEventFlag({} {}) ", p->szFlagName, p->lValue);
}
void CClientManager::SendEventFlagsOnSetup(CPeer* peer)

View File

@ -10,7 +10,7 @@
void CClientManager::GuildCreate(CPeer * peer, DWORD dwGuildID)
{
sys_log(0, "GuildCreate %u", dwGuildID);
SPDLOG_DEBUG("GuildCreate {}", dwGuildID);
ForwardPacket(HEADER_DG_GUILD_LOAD, &dwGuildID, sizeof(DWORD));
CGuildManager::instance().Load(dwGuildID);
@ -18,14 +18,14 @@ void CClientManager::GuildCreate(CPeer * peer, DWORD dwGuildID)
void CClientManager::GuildChangeGrade(CPeer* peer, TPacketGuild* p)
{
sys_log(0, "GuildChangeGrade %u %u", p->dwGuild, p->dwInfo);
SPDLOG_DEBUG("GuildChangeGrade {} {}", p->dwGuild, p->dwInfo);
ForwardPacket(HEADER_DG_GUILD_CHANGE_GRADE, p, sizeof(TPacketGuild));
}
void CClientManager::GuildAddMember(CPeer* peer, TPacketGDGuildAddMember * p)
{
CGuildManager::instance().TouchGuild(p->dwGuild);
sys_log(0, "GuildAddMember %u %u", p->dwGuild, p->dwPID);
SPDLOG_DEBUG("GuildAddMember {} {}", p->dwGuild, p->dwPID);
char szQuery[512];
@ -42,7 +42,7 @@ void CClientManager::GuildAddMember(CPeer* peer, TPacketGDGuildAddMember * p)
if (pmsg->Get()->uiNumRows == 0)
{
sys_err("Query failed when getting guild member data %s", pmsg->stQuery.c_str());
SPDLOG_ERROR("Query failed when getting guild member data {}", pmsg->stQuery.c_str());
return;
}
@ -67,7 +67,7 @@ void CClientManager::GuildAddMember(CPeer* peer, TPacketGDGuildAddMember * p)
void CClientManager::GuildRemoveMember(CPeer* peer, TPacketGuild* p)
{
sys_log(0, "GuildRemoveMember %u %u", p->dwGuild, p->dwInfo);
SPDLOG_DEBUG("GuildRemoveMember {} {}", p->dwGuild, p->dwInfo);
char szQuery[512];
snprintf(szQuery, sizeof(szQuery), "DELETE FROM guild_member%s WHERE pid=%u and guild_id=%u", GetTablePostfix(), p->dwInfo, p->dwGuild);
@ -81,25 +81,25 @@ void CClientManager::GuildRemoveMember(CPeer* peer, TPacketGuild* p)
void CClientManager::GuildSkillUpdate(CPeer* peer, TPacketGuildSkillUpdate* p)
{
sys_log(0, "GuildSkillUpdate %d", p->amount);
SPDLOG_DEBUG("GuildSkillUpdate {}", p->amount);
ForwardPacket(HEADER_DG_GUILD_SKILL_UPDATE, p, sizeof(TPacketGuildSkillUpdate));
}
void CClientManager::GuildExpUpdate(CPeer* peer, TPacketGuildExpUpdate* p)
{
sys_log(0, "GuildExpUpdate %d", p->amount);
SPDLOG_DEBUG("GuildExpUpdate {}", p->amount);
ForwardPacket(HEADER_DG_GUILD_EXP_UPDATE, p, sizeof(TPacketGuildExpUpdate), 0, peer);
}
void CClientManager::GuildChangeMemberData(CPeer* peer, TPacketGuildChangeMemberData* p)
{
sys_log(0, "GuildChangeMemberData %u %u %d %d", p->pid, p->offer, p->level, p->grade);
SPDLOG_DEBUG("GuildChangeMemberData {} {} {} {}", p->pid, p->offer, p->level, p->grade);
ForwardPacket(HEADER_DG_GUILD_CHANGE_MEMBER_DATA, p, sizeof(TPacketGuildChangeMemberData), 0, peer);
}
void CClientManager::GuildDisband(CPeer* peer, TPacketGuild* p)
{
sys_log(0, "GuildDisband %u", p->dwGuild);
SPDLOG_DEBUG("GuildDisband {}", p->dwGuild);
char szQuery[512];
@ -126,13 +126,13 @@ const char* __GetWarType(int n)
switch (n)
{
case 0 :
return "<EFBFBD>п<EFBFBD>";
return "\xEF\xBF\xBD\xD0\xBF\xEF\xBF\xBD"; // 패왕
case 1 :
return "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
return "\xEF\xBF\xBD\xEF\xBF\xBD\xEF\xBF\xBD\xEF\xBF\xBD"; // 맹장
case 2 :
return "<EFBFBD><EFBFBD>ȣ";
return "\xEF\xBF\xBD\xEF\xBF\xBD\xC8\xA3"; // 수호
default :
return "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȣ";
return "\xEF\xBF\xBD\xEF\xBF\xBD\xEF\xBF\xBD\xEF\xBF\xBD\x20\xEF\xBF\xBD\xEF\xBF\xBD\xC8\xA3"; // 없는 번호
}
}
@ -141,12 +141,12 @@ void CClientManager::GuildWar(CPeer* peer, TPacketGuildWar* p)
switch (p->bWar)
{
case GUILD_WAR_SEND_DECLARE:
sys_log(0, "GuildWar: GUILD_WAR_SEND_DECLARE type(%s) guild(%d - %d)", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo);
SPDLOG_DEBUG("GuildWar: GUILD_WAR_SEND_DECLARE type({}) guild({} - {})", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo);
CGuildManager::instance().AddDeclare(p->bType, p->dwGuildFrom, p->dwGuildTo);
break;
case GUILD_WAR_REFUSE:
sys_log(0, "GuildWar: GUILD_WAR_REFUSE type(%s) guild(%d - %d)", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo);
SPDLOG_DEBUG("GuildWar: GUILD_WAR_REFUSE type({}) guild({} - {})", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo);
CGuildManager::instance().RemoveDeclare(p->dwGuildFrom, p->dwGuildTo);
break;
/*
@ -160,10 +160,10 @@ void CClientManager::GuildWar(CPeer* peer, TPacketGuildWar* p)
*/
case GUILD_WAR_WAIT_START:
sys_log(0, "GuildWar: GUILD_WAR_WAIT_START type(%s) guild(%d - %d)", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo);
case GUILD_WAR_RESERVE: // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
SPDLOG_DEBUG("GuildWar: GUILD_WAR_WAIT_START type({}) guild({} - {})", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo);
case GUILD_WAR_RESERVE: // 길드전 예약
if (p->bWar != GUILD_WAR_WAIT_START)
sys_log(0, "GuildWar: GUILD_WAR_RESERVE type(%s) guild(%d - %d)", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo);
SPDLOG_DEBUG("GuildWar: GUILD_WAR_RESERVE type({}) guild({} - {})", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo);
CGuildManager::instance().RemoveDeclare(p->dwGuildFrom, p->dwGuildTo);
if (!CGuildManager::instance().ReserveWar(p))
@ -173,24 +173,24 @@ void CClientManager::GuildWar(CPeer* peer, TPacketGuildWar* p)
break;
case GUILD_WAR_ON_WAR: // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ų<EFBFBD><C5B2>. (<28>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD> <20>ٷ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>)
sys_log(0, "GuildWar: GUILD_WAR_ON_WAR type(%s) guild(%d - %d)", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo);
case GUILD_WAR_ON_WAR: // 길드전을 시작 시킨다. (필드전은 바로 시작 됨)
SPDLOG_DEBUG("GuildWar: GUILD_WAR_ON_WAR type({}) guild({} - {})", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo);
CGuildManager::instance().RemoveDeclare(p->dwGuildFrom, p->dwGuildTo);
CGuildManager::instance().StartWar(p->bType, p->dwGuildFrom, p->dwGuildTo);
break;
case GUILD_WAR_OVER: // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
sys_log(0, "GuildWar: GUILD_WAR_OVER type(%s) guild(%d - %d)", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo);
case GUILD_WAR_OVER: // 길드전 정상 종료
SPDLOG_DEBUG("GuildWar: GUILD_WAR_OVER type({}) guild({} - {})", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo);
CGuildManager::instance().RecvWarOver(p->dwGuildFrom, p->dwGuildTo, p->bType, p->lWarPrice);
break;
case GUILD_WAR_END: // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
sys_log(0, "GuildWar: GUILD_WAR_END type(%s) guild(%d - %d)", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo);
case GUILD_WAR_END: // 길드전 비정상 종료
SPDLOG_DEBUG("GuildWar: GUILD_WAR_END type({}) guild({} - {})", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo);
CGuildManager::instance().RecvWarEnd(p->dwGuildFrom, p->dwGuildTo);
return; // NOTE: RecvWarEnd<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ε<EFBFBD>ij<EFBFBD><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
return; // NOTE: RecvWarEnd에서 패킷을 보내므로 따로 브로드캐스팅 하지 않는다.
case GUILD_WAR_CANCEL :
sys_log(0, "GuildWar: GUILD_WAR_CANCEL type(%s) guild(%d - %d)", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo);
SPDLOG_DEBUG("GuildWar: GUILD_WAR_CANCEL type({}) guild({} - {})", __GetWarType(p->bType), p->dwGuildFrom, p->dwGuildTo);
CGuildManager::instance().CancelWar(p->dwGuildFrom, p->dwGuildTo);
break;
}
@ -205,20 +205,20 @@ void CClientManager::GuildWarScore(CPeer* peer, TPacketGuildWarScore * p)
void CClientManager::GuildChangeLadderPoint(TPacketGuildLadderPoint* p)
{
sys_log(0, "GuildChangeLadderPoint Recv %u %d", p->dwGuild, p->lChange);
SPDLOG_DEBUG("GuildChangeLadderPoint Recv {} {}", p->dwGuild, p->lChange);
CGuildManager::instance().ChangeLadderPoint(p->dwGuild, p->lChange);
}
void CClientManager::GuildUseSkill(TPacketGuildUseSkill* p)
{
sys_log(0, "GuildUseSkill Recv %u %d", p->dwGuild, p->dwSkillVnum);
SPDLOG_DEBUG("GuildUseSkill Recv {} {}", p->dwGuild, p->dwSkillVnum);
CGuildManager::instance().UseSkill(p->dwGuild, p->dwSkillVnum, p->dwCooltime);
SendGuildSkillUsable(p->dwGuild, p->dwSkillVnum, false);
}
void CClientManager::SendGuildSkillUsable(DWORD guild_id, DWORD dwSkillVnum, bool bUsable)
{
sys_log(0, "SendGuildSkillUsable Send %u %d %s", guild_id, dwSkillVnum, bUsable?"true":"false");
SPDLOG_DEBUG("SendGuildSkillUsable Send {} {} {}", guild_id, dwSkillVnum, bUsable?"true":"false");
TPacketGuildSkillUsableChange p;

View File

@ -11,7 +11,6 @@
extern std::string g_stLocale;
extern bool CreatePlayerTableFromRes(MYSQL_RES * res, TPlayerTable * pkTab);
extern int g_test_server;
extern int g_log;
bool CClientManager::InsertLogonAccount(const char * c_pszLogin, DWORD dwHandle, const char * c_pszIP)
{
@ -49,14 +48,13 @@ bool CClientManager::DeleteLogonAccount(const char * c_pszLogin, DWORD dwHandle)
if (pkLD->GetConnectedPeerHandle() != dwHandle)
{
sys_err("%s tried to logout in other peer handle %lu, current handle %lu", szLogin, dwHandle, pkLD->GetConnectedPeerHandle());
SPDLOG_ERROR("{} tried to logout in other peer handle {}, current handle {}", szLogin, dwHandle, pkLD->GetConnectedPeerHandle());
return false;
}
if (pkLD->IsPlay())
{
pkLD->SetPlay(false);
SendLoginToBilling(pkLD, false);
}
if (pkLD->IsDeleted())
@ -87,7 +85,7 @@ void CClientManager::QUERY_LOGIN_BY_KEY(CPeer * pkPeer, DWORD dwHandle, TPacketG
if (!pkLoginData)
{
sys_log(0, "LOGIN_BY_KEY key not exist %s %lu", szLogin, p->dwLoginKey);
SPDLOG_DEBUG("LOGIN_BY_KEY key not exist {} {}", szLogin, p->dwLoginKey);
pkPeer->EncodeReturn(HEADER_DG_LOGIN_NOT_EXIST, dwHandle);
return;
}
@ -96,7 +94,7 @@ void CClientManager::QUERY_LOGIN_BY_KEY(CPeer * pkPeer, DWORD dwHandle, TPacketG
if (FindLogonAccount(r.login))
{
sys_log(0, "LOGIN_BY_KEY already login %s %lu", r.login, p->dwLoginKey);
SPDLOG_DEBUG("LOGIN_BY_KEY already login {} {}", r.login, p->dwLoginKey);
TPacketDGLoginAlready ptog;
strlcpy(ptog.szLogin, szLogin, sizeof(ptog.szLogin));
pkPeer->EncodeHeader(HEADER_DG_LOGIN_ALREADY, dwHandle, sizeof(TPacketDGLoginAlready));
@ -106,7 +104,7 @@ void CClientManager::QUERY_LOGIN_BY_KEY(CPeer * pkPeer, DWORD dwHandle, TPacketG
if (strcasecmp(r.login, szLogin))
{
sys_log(0, "LOGIN_BY_KEY login differ %s %lu input %s", r.login, p->dwLoginKey, szLogin);
SPDLOG_DEBUG("LOGIN_BY_KEY login differ {} {} input {}", r.login, p->dwLoginKey, szLogin);
pkPeer->EncodeReturn(HEADER_DG_LOGIN_NOT_EXIST, dwHandle);
return;
}
@ -115,7 +113,7 @@ void CClientManager::QUERY_LOGIN_BY_KEY(CPeer * pkPeer, DWORD dwHandle, TPacketG
{
const DWORD * pdwClientKey = pkLoginData->GetClientKey();
sys_log(0, "LOGIN_BY_KEY client key differ %s %lu %lu %lu %lu, %lu %lu %lu %lu",
SPDLOG_DEBUG("LOGIN_BY_KEY client key differ {} {} {} {} {}, {} {} {} {}",
r.login,
p->adwClientKey[0], p->adwClientKey[1], p->adwClientKey[2], p->adwClientKey[3],
pdwClientKey[0], pdwClientKey[1], pdwClientKey[2], pdwClientKey[3]);
@ -137,7 +135,7 @@ void CClientManager::QUERY_LOGIN_BY_KEY(CPeer * pkPeer, DWORD dwHandle, TPacketG
info->pAccountTable = pkTab;
strlcpy(info->ip, p->szIP, sizeof(info->ip));
sys_log(0, "LOGIN_BY_KEY success %s %lu %s", r.login, p->dwLoginKey, info->ip);
SPDLOG_DEBUG("LOGIN_BY_KEY success {} {} {}", r.login, p->dwLoginKey, info->ip);
char szQuery[QUERY_MAX_LEN];
snprintf(szQuery, sizeof(szQuery), "SELECT pid1, pid2, pid3, pid4, empire FROM player_index%s WHERE id=%u", GetTablePostfix(), r.id);
CDBManager::instance().ReturnQuery(szQuery, QID_LOGIN_BY_KEY, pkPeer->GetHandle(), info);
@ -164,11 +162,11 @@ void CClientManager::RESULT_LOGIN_BY_KEY(CPeer * peer, SQLMsg * msg)
snprintf(szQuery, sizeof(szQuery), "SELECT pid1, pid2, pid3, pid4, empire FROM player_index%s WHERE id=%u", GetTablePostfix(), account_id);
std::unique_ptr<SQLMsg> pMsg(CDBManager::instance().DirectQuery(szQuery, SQL_PLAYER));
sys_log(0, "RESULT_LOGIN_BY_KEY FAIL player_index's NULL : ID:%d", account_id);
SPDLOG_DEBUG("RESULT_LOGIN_BY_KEY FAIL player_index's NULL : ID:{}", account_id);
if (pMsg->Get()->uiNumRows == 0)
{
sys_log(0, "RESULT_LOGIN_BY_KEY FAIL player_index's NULL : ID:%d", account_id);
SPDLOG_DEBUG("RESULT_LOGIN_BY_KEY FAIL player_index's NULL : ID:{}", account_id);
// PLAYER_INDEX_CREATE_BUG_FIX
//snprintf(szQuery, sizeof(szQuery), "INSERT IGNORE INTO player_index%s (id) VALUES(%lu)", GetTablePostfix(), info->pAccountTable->id);
@ -231,7 +229,7 @@ TAccountTable * CreateAccountTableFromRes(MYSQL_RES * res)
TAccountTable * pkTab = new TAccountTable;
memset(pkTab, 0, sizeof(TAccountTable));
// ù<EFBFBD><EFBFBD>° <20>÷<EFBFBD> <20>͸<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD> (JOIN QUERY<52><59> <20><><EFBFBD><EFBFBD> <20><> <20><>)
// 첫번째 컬럼 것만 참고 한다 (JOIN QUERY를 위한 것 임)
strlcpy(input_pwd, row[col++], sizeof(input_pwd));
str_to_number(pkTab->id, row[col++]);
strlcpy(pkTab->login, row[col++], sizeof(pkTab->login));
@ -332,14 +330,14 @@ void CreateAccountPlayerDataFromRes(MYSQL_RES * pRes, TAccountTable * pkTab)
str_to_number(pkTab->players[j].bChangeName, row[col++]);
}
sys_log(0, "%s %lu %lu hair %u",
SPDLOG_DEBUG("{} {} {} hair {}",
pkTab->players[j].szName, pkTab->players[j].x, pkTab->players[j].y, pkTab->players[j].wHairPart);
break;
}
}
/*
if (j == PLAYER_PER_ACCOUNT)
sys_err("cannot find player_id on this account (login: %s id %lu account %lu %lu %lu)",
SPDLOG_ERROR("cannot find player_id on this account (login: {} id {} account {} {} {})",
pkTab->login, player_id,
pkTab->players[0].dwID,
pkTab->players[1].dwID,
@ -355,10 +353,10 @@ void CClientManager::RESULT_LOGIN(CPeer * peer, SQLMsg * msg)
if (info->account_index == 0)
{
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>?
// 계정이 없네?
if (msg->Get()->uiNumRows == 0)
{
sys_log(0, "RESULT_LOGIN: no account");
SPDLOG_DEBUG("RESULT_LOGIN: no account");
peer->EncodeHeader(HEADER_DG_LOGIN_NOT_EXIST, info->dwHandle, 0);
delete info;
return;
@ -368,7 +366,7 @@ void CClientManager::RESULT_LOGIN(CPeer * peer, SQLMsg * msg)
if (!info->pAccountTable)
{
sys_log(0, "RESULT_LOGIN: no account : WRONG_PASSWD");
SPDLOG_DEBUG("RESULT_LOGIN: no account : WRONG_PASSWD");
peer->EncodeReturn(HEADER_DG_LOGIN_WRONG_PASSWD, info->dwHandle);
delete info;
}
@ -397,17 +395,17 @@ void CClientManager::RESULT_LOGIN(CPeer * peer, SQLMsg * msg)
}
else
{
if (!info->pAccountTable) // <EFBFBD>̷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;;
if (!info->pAccountTable) // 이럴리는 없겠지만;;
{
peer->EncodeReturn(HEADER_DG_LOGIN_WRONG_PASSWD, info->dwHandle);
delete info;
return;
}
// <EFBFBD>ٸ<EFBFBD> <20><><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD> <20>̹<EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD> <20>ع<EFBFBD><D8B9>ȴٸ<C8B4>.. <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ߴٰ<DFB4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
// 다른 컨넥션이 이미 로그인 해버렸다면.. 이미 접속했다고 보내야 한다.
if (!InsertLogonAccount(info->pAccountTable->login, peer->GetHandle(), info->ip))
{
sys_log(0, "RESULT_LOGIN: already logon %s", info->pAccountTable->login);
SPDLOG_DEBUG("RESULT_LOGIN: already logon {}", info->pAccountTable->login);
TPacketDGLoginAlready p;
strlcpy(p.szLogin, info->pAccountTable->login, sizeof(p.szLogin));
@ -417,7 +415,7 @@ void CClientManager::RESULT_LOGIN(CPeer * peer, SQLMsg * msg)
}
else
{
sys_log(0, "RESULT_LOGIN: login success %s rows: %lu", info->pAccountTable->login, msg->Get()->uiNumRows);
SPDLOG_DEBUG("RESULT_LOGIN: login success {} rows: {}", info->pAccountTable->login, msg->Get()->uiNumRows);
if (msg->Get()->uiNumRows > 0)
CreateAccountPlayerDataFromRes(msg->Get()->pSQLResult, info->pAccountTable);
@ -456,23 +454,20 @@ void CClientManager::QUERY_LOGOUT(CPeer * peer, DWORD dwHandle,const char * data
{
if (pLoginData->GetAccountRef().players[n].dwID == 0)
{
if (g_test_server)
sys_log(0, "LOGOUT %s %d", packet->login, pLoginData->GetAccountRef().players[n].dwID);
SPDLOG_TRACE("LOGOUT {} {}", packet->login, pLoginData->GetAccountRef().players[n].dwID);
continue;
}
pid[n] = pLoginData->GetAccountRef().players[n].dwID;
if (g_log)
sys_log(0, "LOGOUT InsertLogoutPlayer %s %d", packet->login, pid[n]);
SPDLOG_TRACE("LOGOUT InsertLogoutPlayer {} {}", packet->login, pid[n]);
InsertLogoutPlayer(pid[n]);
}
if (DeleteLogonAccount(packet->login, peer->GetHandle()))
{
if (g_log)
sys_log(0, "LOGOUT %s ", packet->login);
SPDLOG_TRACE("LOGOUT {} ", packet->login);
}
}

View File

@ -13,11 +13,11 @@ void CClientManager::QUERY_PARTY_CREATE(CPeer* peer, TPacketPartyCreate* p)
{
pm.insert(make_pair(p->dwLeaderPID, TPartyMember()));
ForwardPacket(HEADER_DG_PARTY_CREATE, p, sizeof(TPacketPartyCreate), peer->GetChannel(), peer);
sys_log(0, "PARTY Create [%lu]", p->dwLeaderPID);
SPDLOG_DEBUG("PARTY Create [{}]", p->dwLeaderPID);
}
else
{
sys_err("PARTY Create - Already exists [%lu]", p->dwLeaderPID);
SPDLOG_ERROR("PARTY Create - Already exists [{}]", p->dwLeaderPID);
}
}
@ -28,13 +28,13 @@ void CClientManager::QUERY_PARTY_DELETE(CPeer* peer, TPacketPartyDelete* p)
if (it == pm.end())
{
sys_err("PARTY Delete - Non exists [%lu]", p->dwLeaderPID);
SPDLOG_ERROR("PARTY Delete - Non exists [{}]", p->dwLeaderPID);
return;
}
pm.erase(it);
ForwardPacket(HEADER_DG_PARTY_DELETE, p, sizeof(TPacketPartyDelete), peer->GetChannel(), peer);
sys_log(0, "PARTY Delete [%lu]", p->dwLeaderPID);
SPDLOG_DEBUG("PARTY Delete [{}]", p->dwLeaderPID);
}
void CClientManager::QUERY_PARTY_ADD(CPeer* peer, TPacketPartyAdd* p)
@ -44,7 +44,7 @@ void CClientManager::QUERY_PARTY_ADD(CPeer* peer, TPacketPartyAdd* p)
if (it == pm.end())
{
sys_err("PARTY Add - Non exists [%lu]", p->dwLeaderPID);
SPDLOG_ERROR("PARTY Add - Non exists [{}]", p->dwLeaderPID);
return;
}
@ -52,10 +52,10 @@ void CClientManager::QUERY_PARTY_ADD(CPeer* peer, TPacketPartyAdd* p)
{
it->second.insert(std::make_pair(p->dwPID, TPartyInfo()));
ForwardPacket(HEADER_DG_PARTY_ADD, p, sizeof(TPacketPartyAdd), peer->GetChannel(), peer);
sys_log(0, "PARTY Add [%lu] to [%lu]", p->dwPID, p->dwLeaderPID);
SPDLOG_DEBUG("PARTY Add [{}] to [{}]", p->dwPID, p->dwLeaderPID);
}
else
sys_err("PARTY Add - Already [%lu] in party [%lu]", p->dwPID, p->dwLeaderPID);
SPDLOG_ERROR("PARTY Add - Already [{}] in party [{}]", p->dwPID, p->dwLeaderPID);
}
void CClientManager::QUERY_PARTY_REMOVE(CPeer* peer, TPacketPartyRemove* p)
@ -65,7 +65,7 @@ void CClientManager::QUERY_PARTY_REMOVE(CPeer* peer, TPacketPartyRemove* p)
if (it == pm.end())
{
sys_err("PARTY Remove - Non exists [%lu] cannot remove [%lu]",p->dwLeaderPID, p->dwPID);
SPDLOG_ERROR("PARTY Remove - Non exists [{}] cannot remove [{}]",p->dwLeaderPID, p->dwPID);
return;
}
@ -75,10 +75,10 @@ void CClientManager::QUERY_PARTY_REMOVE(CPeer* peer, TPacketPartyRemove* p)
{
it->second.erase(pit);
ForwardPacket(HEADER_DG_PARTY_REMOVE, p, sizeof(TPacketPartyRemove), peer->GetChannel(), peer);
sys_log(0, "PARTY Remove [%lu] to [%lu]", p->dwPID, p->dwLeaderPID);
SPDLOG_DEBUG("PARTY Remove [{}] to [{}]", p->dwPID, p->dwLeaderPID);
}
else
sys_err("PARTY Remove - Cannot find [%lu] in party [%lu]", p->dwPID, p->dwLeaderPID);
SPDLOG_ERROR("PARTY Remove - Cannot find [{}] in party [{}]", p->dwPID, p->dwLeaderPID);
}
void CClientManager::QUERY_PARTY_STATE_CHANGE(CPeer* peer, TPacketPartyStateChange* p)
@ -88,7 +88,7 @@ void CClientManager::QUERY_PARTY_STATE_CHANGE(CPeer* peer, TPacketPartyStateChan
if (it == pm.end())
{
sys_err("PARTY StateChange - Non exists [%lu] cannot state change [%lu]",p->dwLeaderPID, p->dwPID);
SPDLOG_ERROR("PARTY StateChange - Non exists [{}] cannot state change [{}]",p->dwLeaderPID, p->dwPID);
return;
}
@ -96,7 +96,7 @@ void CClientManager::QUERY_PARTY_STATE_CHANGE(CPeer* peer, TPacketPartyStateChan
if (pit == it->second.end())
{
sys_err("PARTY StateChange - Cannot find [%lu] in party [%lu]", p->dwPID, p->dwLeaderPID);
SPDLOG_ERROR("PARTY StateChange - Cannot find [{}] in party [{}]", p->dwPID, p->dwLeaderPID);
return;
}
@ -106,7 +106,7 @@ void CClientManager::QUERY_PARTY_STATE_CHANGE(CPeer* peer, TPacketPartyStateChan
pit->second.bRole = 0;
ForwardPacket(HEADER_DG_PARTY_STATE_CHANGE, p, sizeof(TPacketPartyStateChange), peer->GetChannel(), peer);
sys_log(0, "PARTY StateChange [%lu] at [%lu] from %d %d",p->dwPID, p->dwLeaderPID, p->bRole, p->bFlag);
SPDLOG_DEBUG("PARTY StateChange [{}] at [{}] from {} {}",p->dwPID, p->dwLeaderPID, p->bRole, p->bFlag);
}
void CClientManager::QUERY_PARTY_SET_MEMBER_LEVEL(CPeer* peer, TPacketPartySetMemberLevel* p)
@ -116,7 +116,7 @@ void CClientManager::QUERY_PARTY_SET_MEMBER_LEVEL(CPeer* peer, TPacketPartySetMe
if (it == pm.end())
{
sys_err("PARTY SetMemberLevel - Non exists [%lu] cannot level change [%lu]",p->dwLeaderPID, p->dwPID);
SPDLOG_ERROR("PARTY SetMemberLevel - Non exists [{}] cannot level change [{}]",p->dwLeaderPID, p->dwPID);
return;
}
@ -124,12 +124,12 @@ void CClientManager::QUERY_PARTY_SET_MEMBER_LEVEL(CPeer* peer, TPacketPartySetMe
if (pit == it->second.end())
{
sys_err("PARTY SetMemberLevel - Cannot find [%lu] in party [%lu]", p->dwPID, p->dwLeaderPID);
SPDLOG_ERROR("PARTY SetMemberLevel - Cannot find [{}] in party [{}]", p->dwPID, p->dwLeaderPID);
return;
}
pit->second.bLevel = p->bLevel;
ForwardPacket(HEADER_DG_PARTY_SET_MEMBER_LEVEL, p, sizeof(TPacketPartySetMemberLevel), peer->GetChannel());
sys_log(0, "PARTY SetMemberLevel pid [%lu] level %d",p->dwPID, p->bLevel);
SPDLOG_DEBUG("PARTY SetMemberLevel pid [{}] level {}",p->dwPID, p->bLevel);
}

View File

@ -6,14 +6,10 @@
#include "Main.h"
#include "QID.h"
#include "ItemAwardManager.h"
#include "HB.h"
#include "Cache.h"
extern bool g_bHotBackup;
extern std::string g_stLocale;
extern int g_test_server;
extern int g_log;
//
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@ -32,7 +28,7 @@ bool CreateItemTableFromRes(MYSQL_RES * res, std::vector<TPlayerItem> * pVec, DW
int rows;
if ((rows = mysql_num_rows(res)) <= 0) // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if ((rows = mysql_num_rows(res)) <= 0) // 데이터 없음
{
pVec->clear();
return true;
@ -159,7 +155,7 @@ size_t CreatePlayerSaveQuery(char * pszQuery, size_t querySize, TPlayerTable * p
pkTab->horse.sStamina,
pkTab->horse_skill_point);
// Binary <EFBFBD><EFBFBD> <20>ٲٱ<D9B2> <20><><EFBFBD><EFBFBD> <20>ӽ<EFBFBD> <20><><EFBFBD><EFBFBD>
// Binary 로 바꾸기 위한 임시 공간
char text[8192 + 1];
CDBManager::instance().EscapeString(text, pkTab->skills, sizeof(pkTab->skills));
@ -196,9 +192,6 @@ void CClientManager::PutPlayerCache(TPlayerTable * pNew)
m_map_playerCache.insert(TPlayerTableCacheMap::value_type(pNew->id, c));
}
if (g_bHotBackup)
PlayerHB::instance().Put(pNew->id);
c->Put(pNew);
}
@ -211,7 +204,7 @@ void CClientManager::QUERY_PLAYER_LOAD(CPeer * peer, DWORD dwHandle, TPlayerLoad
TPlayerTable * pTab;
//
// <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>͵<EFBFBD> ij<><C4B3>ó<EFBFBD><C3B3>
// 한 계정에 속한 모든 캐릭터들 캐쉬처리
//
CLoginData * pLoginData = GetLoginDataByAID(packet->account_id);
@ -223,12 +216,12 @@ void CClientManager::QUERY_PLAYER_LOAD(CPeer * peer, DWORD dwHandle, TPlayerLoad
}
//----------------------------------------------------------------
// 1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DBCache <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : DBCache<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DBCache <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : DB<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 1. 유저정보가 DBCache 에 존재 : DBCache에서
// 2. 유저정보가 DBCache 에 없음 : DB에서
// ---------------------------------------------------------------
//----------------------------------
// 1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DBCache <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : DBCache<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 1. 유저정보가 DBCache 에 존재 : DBCache에서
//----------------------------------
if ((c = GetPlayerCache(packet->player_id)))
{
@ -236,7 +229,7 @@ void CClientManager::QUERY_PLAYER_LOAD(CPeer * peer, DWORD dwHandle, TPlayerLoad
if (!pkLD || pkLD->IsPlay())
{
sys_log(0, "PLAYER_LOAD_ERROR: LoginData %p IsPlay %d", pkLD, pkLD ? pkLD->IsPlay() : 0);
SPDLOG_DEBUG("PLAYER_LOAD_ERROR: LoginData {} IsPlay {}", (void*) pkLD, pkLD ? pkLD->IsPlay() : 0);
peer->EncodeHeader(HEADER_DG_PLAYER_LOAD_FAILED, dwHandle, 0);
return;
}
@ -244,7 +237,6 @@ void CClientManager::QUERY_PLAYER_LOAD(CPeer * peer, DWORD dwHandle, TPlayerLoad
pTab = c->Get();
pkLD->SetPlay(true);
SendLoginToBilling(pkLD, true);
memcpy(pTab->aiPremiumTimes, pkLD->GetPremiumPtr(), sizeof(pTab->aiPremiumTimes));
peer->EncodeHeader(HEADER_DG_PLAYER_LOAD_SUCCESS, dwHandle, sizeof(TPlayerTable));
@ -265,16 +257,16 @@ void CClientManager::QUERY_PLAYER_LOAD(CPeer * peer, DWORD dwHandle, TPlayerLoad
TItemCacheSet * pSet = GetItemCacheSet(pTab->id);
sys_log(0, "[PLAYER_LOAD] ID %s pid %d gold %d ", pTab->name, pTab->id, pTab->gold);
SPDLOG_DEBUG("[PLAYER_LOAD] ID {} pid {} gold {} ", pTab->name, pTab->id, pTab->gold);
//--------------------------------------------
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> & AFFECT & QUEST <EFBFBD>ε<EFBFBD> :
// 아이템 & AFFECT & QUEST 로딩 :
//--------------------------------------------
// 1) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DBCache <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : DBCache <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 2) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DBCache <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : DB <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 1) 아이템이 DBCache 에 존재 : DBCache 에서 가져옴
// 2) 아이템이 DBCache 에 없음 : DB 에서 가져옴
/////////////////////////////////////////////
// 1) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DBCache <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : DBCache <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 1) 아이템이 DBCache 에 존재 : DBCache 에서 가져옴
/////////////////////////////////////////////
if (pSet)
{
@ -289,12 +281,11 @@ void CClientManager::QUERY_PLAYER_LOAD(CPeer * peer, DWORD dwHandle, TPlayerLoad
CItemCache * c = *it++;
TPlayerItem * p = c->Get();
if (p->vnum) // vnum<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
if (p->vnum) // vnum이 없으면 삭제된 아이템이다.
memcpy(&s_items[dwCount++], p, sizeof(TPlayerItem));
}
if (g_test_server)
sys_log(0, "ITEM_CACHE: HIT! %s count: %u", pTab->name, dwCount);
SPDLOG_TRACE("ITEM_CACHE: HIT! {} count: {}", pTab->name, dwCount);
peer->EncodeHeader(HEADER_DG_ITEM_LOAD, dwHandle, sizeof(DWORD) + sizeof(TPlayerItem) * dwCount);
peer->EncodeDWORD(dwCount);
@ -316,7 +307,7 @@ void CClientManager::QUERY_PLAYER_LOAD(CPeer * peer, DWORD dwHandle, TPlayerLoad
CDBManager::instance().ReturnQuery(szQuery, QID_AFFECT, peer->GetHandle(), new ClientHandleInfo(dwHandle));
}
/////////////////////////////////////////////
// 2) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DBCache <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : DB <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 2) 아이템이 DBCache 에 없음 : DB 에서 가져옴
/////////////////////////////////////////////
else
{
@ -350,23 +341,23 @@ void CClientManager::QUERY_PLAYER_LOAD(CPeer * peer, DWORD dwHandle, TPlayerLoad
//return;
}
//----------------------------------
// 2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DBCache <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : DB<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 2. 유저정보가 DBCache 에 없음 : DB에서
//----------------------------------
else
{
sys_log(0, "[PLAYER_LOAD] Load from PlayerDB pid[%d]", packet->player_id);
SPDLOG_DEBUG("[PLAYER_LOAD] Load from PlayerDB pid[{}]", packet->player_id);
char queryStr[QUERY_MAX_LEN];
//--------------------------------------------------------------
// ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DB<44><42><EFBFBD><EFBFBD>
// 캐릭터 정보 얻어오기 : 무조건 DB에서
//--------------------------------------------------------------
snprintf(queryStr, sizeof(queryStr),
"SELECT "
"id,name,job,voice,dir,x,y,z,map_index,exit_x,exit_y,exit_map_index,hp,mp,stamina,random_hp,random_sp,playtime,"
"gold,level,level_step,st,ht,dx,iq,exp,"
"stat_point,skill_point,sub_skill_point,stat_reset_count,part_base,part_hair,"
"skill_level,quickslot,skill_group,alignment,mobile,horse_level,horse_riding,horse_hp,horse_hp_droptime,horse_stamina,"
"skill_level,quickslot,skill_group,alignment,horse_level,horse_riding,horse_hp,horse_hp_droptime,horse_stamina,"
"UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(last_play),horse_skill_point FROM player%s WHERE id=%d",
GetTablePostfix(), packet->player_id);
@ -375,7 +366,7 @@ void CClientManager::QUERY_PLAYER_LOAD(CPeer * peer, DWORD dwHandle, TPlayerLoad
CDBManager::instance().ReturnQuery(queryStr, QID_PLAYER, peer->GetHandle(), pkInfo);
//--------------------------------------------------------------
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 아이템 가져오기
//--------------------------------------------------------------
snprintf(queryStr, sizeof(queryStr),
"SELECT id,window+0,pos,count,vnum,socket0,socket1,socket2,attrtype0,attrvalue0,attrtype1,attrvalue1,attrtype2,attrvalue2,attrtype3,attrvalue3,attrtype4,attrvalue4,attrtype5,attrvalue5,attrtype6,attrvalue6 "
@ -384,15 +375,15 @@ void CClientManager::QUERY_PLAYER_LOAD(CPeer * peer, DWORD dwHandle, TPlayerLoad
CDBManager::instance().ReturnQuery(queryStr, QID_ITEM, peer->GetHandle(), new ClientHandleInfo(dwHandle, packet->player_id));
//--------------------------------------------------------------
// QUEST <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// QUEST 가져오기
//--------------------------------------------------------------
snprintf(queryStr, sizeof(queryStr),
"SELECT dwPID,szName,szState,lValue FROM quest%s WHERE dwPID=%d",
GetTablePostfix(), packet->player_id);
CDBManager::instance().ReturnQuery(queryStr, QID_QUEST, peer->GetHandle(), new ClientHandleInfo(dwHandle, packet->player_id,packet->account_id));
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ɿ<EFBFBD><C9BF><EFBFBD> item_award<72><64><EFBFBD>̺<EFBFBD><CCBA><EFBFBD><EFBFBD><EFBFBD> login <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> account id<EFBFBD><EFBFBD> <20>Ѱ<EFBFBD><D1B0>ش<EFBFBD>
//독일 선물 기능에서 item_award테이블에서 login 정보를 얻기위해 account id도 넘겨준다
//--------------------------------------------------------------
// AFFECT <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// AFFECT 가져오기
//--------------------------------------------------------------
snprintf(queryStr, sizeof(queryStr),
"SELECT dwPID,bType,bApplyOn,lApplyValue,dwFlag,lDuration,lSPCost FROM affect%s WHERE dwPID=%d",
@ -409,21 +400,21 @@ void CClientManager::ItemAward(CPeer * peer,char* login)
std::set<TItemAward *> * pSet = ItemAwardManager::instance().GetByLogin(login_t);
if(pSet == NULL)
return;
typeof(pSet->begin()) it = pSet->begin(); //taken_time<EFBFBD><EFBFBD> NULL<EFBFBD>ΰ͵<EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD>
typeof(pSet->begin()) it = pSet->begin(); //taken_time NULL인것들 읽어옴
while(it != pSet->end() )
{
TItemAward * pItemAward = *(it++);
char* whyStr = pItemAward->szWhy; //why <EFBFBD>ݷ<EFBFBD> <20>б<EFBFBD>
char cmdStr[100] = ""; //why<EFBFBD>ݷ뿡<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ӽ<EFBFBD> <20><><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>
strcpy(cmdStr,whyStr); //<EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ū<EFBFBD><C5AB><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ūȭ <20>DZ<EFBFBD> <20><><EFBFBD><EFBFBD>
char* whyStr = pItemAward->szWhy; //why 콜룸 읽기
char cmdStr[100] = ""; //why콜룸에서 읽은 값을 임시 문자열에 복사해둠
strcpy(cmdStr,whyStr); //명령어 얻는 과정에서 토큰쓰면 원본도 토큰화 되기 때문
char command[20] = "";
strcpy(command,GetCommand(cmdStr).c_str()); // command <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if( !(strcmp(command,"GIFT") )) // command <EFBFBD><EFBFBD> GIFT<EFBFBD≯<EFBFBD>
strcpy(command,GetCommand(cmdStr).c_str()); // command 얻기
if( !(strcmp(command,"GIFT") )) // command GIFT이면
{
TPacketItemAwardInfromer giftData;
strcpy(giftData.login, pItemAward->szLogin); //<EFBFBD>α<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̵<EFBFBD> <20><><EFBFBD><EFBFBD>
strcpy(giftData.command, command); //<EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD> <20><><EFBFBD><EFBFBD>
giftData.vnum = pItemAward->dwVnum; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> vnum<75><6D> <20><><EFBFBD><EFBFBD>
strcpy(giftData.login, pItemAward->szLogin); //로그인 아이디 복사
strcpy(giftData.command, command); //명령어 복사
giftData.vnum = pItemAward->dwVnum; //아이템 vnum도 복사
ForwardPacket(HEADER_DG_ITEMAWARD_INFORMER,&giftData,sizeof(TPacketItemAwardInfromer));
}
}
@ -444,7 +435,7 @@ std::string CClientManager::GetCommand(char* str)
bool CreatePlayerTableFromRes(MYSQL_RES * res, TPlayerTable * pkTab)
{
if (mysql_num_rows(res) == 0) // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if (mysql_num_rows(res) == 0) // 데이터 없음
return false;
memset(pkTab, 0, sizeof(TPlayerTable));
@ -456,7 +447,7 @@ bool CreatePlayerTableFromRes(MYSQL_RES * res, TPlayerTable * pkTab)
// "id,name,job,voice,dir,x,y,z,map_index,exit_x,exit_y,exit_map_index,hp,mp,stamina,random_hp,random_sp,playtime,"
// "gold,level,level_step,st,ht,dx,iq,exp,"
// "stat_point,skill_point,sub_skill_point,stat_reset_count,part_base,part_hair,"
// "skill_level,quickslot,skill_group,alignment,mobile,horse_level,horse_riding,horse_hp,horse_stamina FROM player%s WHERE id=%d",
// "skill_level,quickslot,skill_group,alignment,horse_level,horse_riding,horse_hp,horse_stamina FROM player%s WHERE id=%d",
str_to_number(pkTab->id, row[col++]);
strlcpy(pkTab->name, row[col++], sizeof(pkTab->name));
str_to_number(pkTab->job, row[col++]);
@ -507,13 +498,6 @@ bool CreatePlayerTableFromRes(MYSQL_RES * res, TPlayerTable * pkTab)
str_to_number(pkTab->skill_group, row[col++]);
str_to_number(pkTab->lAlignment, row[col++]);
if (row[col])
{
strlcpy(pkTab->szMobile, row[col], sizeof(pkTab->szMobile));
}
col++;
str_to_number(pkTab->horse.bLevel, row[col++]);
str_to_number(pkTab->horse.bRiding, row[col++]);
str_to_number(pkTab->horse.sHealth, row[col++]);
@ -531,11 +515,11 @@ bool CreatePlayerTableFromRes(MYSQL_RES * res, TPlayerTable * pkTab)
int max_point = pkTab->level - 9;
int skill_point =
std::min<int>(20, pkTab->skills[121].bLevel) + // SKILL_LEADERSHIP <EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>
std::min<int>(20, pkTab->skills[124].bLevel) + // SKILL_MINING ä<EFBFBD><EFBFBD>
std::min<int>(10, pkTab->skills[131].bLevel) + // SKILL_HORSE_SUMMON <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȯ
std::min<int>(20, pkTab->skills[141].bLevel) + // SKILL_ADD_HP HP<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::min<int>(20, pkTab->skills[142].bLevel); // SKILL_RESIST_PENETRATE <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::min<int>(20, pkTab->skills[121].bLevel) + // SKILL_LEADERSHIP 통솔력
std::min<int>(20, pkTab->skills[124].bLevel) + // SKILL_MINING 채광
std::min<int>(10, pkTab->skills[131].bLevel) + // SKILL_HORSE_SUMMON 말소환
std::min<int>(20, pkTab->skills[141].bLevel) + // SKILL_ADD_HP HP보강
std::min<int>(20, pkTab->skills[142].bLevel); // SKILL_RESIST_PENETRATE 관통저항
pkTab->sub_skill_point = max_point - skill_point;
}
@ -554,74 +538,74 @@ void CClientManager::RESULT_COMPOSITE_PLAYER(CPeer * peer, SQLMsg * pMsg, DWORD
MYSQL_RES * pSQLResult = pMsg->Get()->pSQLResult;
if (!pSQLResult)
{
sys_err("null MYSQL_RES QID %u", dwQID);
SPDLOG_ERROR("null MYSQL_RES QID {}", dwQID);
return;
}
switch (dwQID)
{
case QID_PLAYER:
sys_log(0, "QID_PLAYER %u %u", info->dwHandle, info->player_id);
SPDLOG_DEBUG("QID_PLAYER {} {}", info->dwHandle, info->player_id);
RESULT_PLAYER_LOAD(peer, pSQLResult, info.get());
break;
case QID_ITEM:
sys_log(0, "QID_ITEM %u", info->dwHandle);
SPDLOG_DEBUG("QID_ITEM {}", info->dwHandle);
RESULT_ITEM_LOAD(peer, pSQLResult, info->dwHandle, info->player_id);
break;
case QID_QUEST:
{
sys_log(0, "QID_QUEST %u", info->dwHandle);
SPDLOG_DEBUG("QID_QUEST {}", info->dwHandle);
RESULT_QUEST_LOAD(peer, pSQLResult, info->dwHandle, info->player_id);
//aid<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//aid얻기
ClientHandleInfo* temp1 = info.get();
if (temp1 == NULL)
break;
CLoginData* pLoginData1 = GetLoginDataByAID(temp1->account_id); //
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
//독일 선물 기능
if( pLoginData1->GetAccountRef().login == NULL)
break;
if( pLoginData1 == NULL )
break;
sys_log(0,"info of pLoginData1 before call ItemAwardfunction %d",pLoginData1);
SPDLOG_DEBUG("info of pLoginData1 before call ItemAwardfunction {}", (void*) pLoginData1);
ItemAward(peer,pLoginData1->GetAccountRef().login);
}
break;
case QID_AFFECT:
sys_log(0, "QID_AFFECT %u", info->dwHandle);
SPDLOG_DEBUG("QID_AFFECT {}", info->dwHandle);
RESULT_AFFECT_LOAD(peer, pSQLResult, info->dwHandle);
break;
/*
case QID_PLAYER_ITEM_QUEST_AFFECT:
sys_log(0, "QID_PLAYER_ITEM_QUEST_AFFECT %u", info->dwHandle);
SPDLOG_DEBUG("QID_PLAYER_ITEM_QUEST_AFFECT {}", info->dwHandle);
RESULT_PLAYER_LOAD(peer, pSQLResult, info->dwHandle);
if (!pMsg->Next())
{
sys_err("RESULT_COMPOSITE_PLAYER: QID_PLAYER_ITEM_QUEST_AFFECT: ITEM FAILED");
SPDLOG_ERROR("RESULT_COMPOSITE_PLAYER: QID_PLAYER_ITEM_QUEST_AFFECT: ITEM FAILED");
return;
}
case QID_ITEM_QUEST_AFFECT:
sys_log(0, "QID_ITEM_QUEST_AFFECT %u", info->dwHandle);
SPDLOG_DEBUG("QID_ITEM_QUEST_AFFECT {}", info->dwHandle);
RESULT_ITEM_LOAD(peer, pSQLResult, info->dwHandle, info->player_id);
if (!pMsg->Next())
{
sys_err("RESULT_COMPOSITE_PLAYER: QID_PLAYER_ITEM_QUEST_AFFECT: QUEST FAILED");
SPDLOG_ERROR("RESULT_COMPOSITE_PLAYER: QID_PLAYER_ITEM_QUEST_AFFECT: QUEST FAILED");
return;
}
case QID_QUEST_AFFECT:
sys_log(0, "QID_QUEST_AFFECT %u", info->dwHandle);
SPDLOG_DEBUG("QID_QUEST_AFFECT {}", info->dwHandle);
RESULT_QUEST_LOAD(peer, pSQLResult, info->dwHandle);
if (!pMsg->Next())
sys_err("RESULT_COMPOSITE_PLAYER: QID_PLAYER_ITEM_QUEST_AFFECT: AFFECT FAILED");
SPDLOG_ERROR("RESULT_COMPOSITE_PLAYER: QID_PLAYER_ITEM_QUEST_AFFECT: AFFECT FAILED");
else
RESULT_AFFECT_LOAD(peer, pSQLResult, info->dwHandle);
@ -645,13 +629,12 @@ void CClientManager::RESULT_PLAYER_LOAD(CPeer * peer, MYSQL_RES * pRes, ClientHa
if (!pkLD || pkLD->IsPlay())
{
sys_log(0, "PLAYER_LOAD_ERROR: LoginData %p IsPlay %d", pkLD, pkLD ? pkLD->IsPlay() : 0);
SPDLOG_DEBUG("PLAYER_LOAD_ERROR: LoginData {} IsPlay {}", (void*) pkLD, pkLD ? pkLD->IsPlay() : 0);
peer->EncodeHeader(HEADER_DG_PLAYER_LOAD_FAILED, pkInfo->dwHandle, 0);
return;
}
pkLD->SetPlay(true);
SendLoginToBilling(pkLD, true);
memcpy(tab.aiPremiumTimes, pkLD->GetPremiumPtr(), sizeof(tab.aiPremiumTimes));
peer->EncodeHeader(HEADER_DG_PLAYER_LOAD_SUCCESS, pkInfo->dwHandle, sizeof(TPlayerTable));
@ -672,18 +655,18 @@ void CClientManager::RESULT_PLAYER_LOAD(CPeer * peer, MYSQL_RES * pRes, ClientHa
void CClientManager::RESULT_ITEM_LOAD(CPeer * peer, MYSQL_RES * pRes, DWORD dwHandle, DWORD dwPID)
{
static std::vector<TPlayerItem> s_items;
//DB<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE>´<EFBFBD>.
//DB에서 아이템 정보를 읽어온다.
CreateItemTableFromRes(pRes, &s_items, dwPID);
DWORD dwCount = s_items.size();
peer->EncodeHeader(HEADER_DG_ITEM_LOAD, dwHandle, sizeof(DWORD) + sizeof(TPlayerItem) * dwCount);
peer->EncodeDWORD(dwCount);
//CacheSet<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//CacheSet을 만든다
CreateItemCacheSet(dwPID);
// ITEM_LOAD_LOG_ATTACH_PID
sys_log(0, "ITEM_LOAD: count %u pid %u", dwCount, dwPID);
SPDLOG_DEBUG("ITEM_LOAD: count {} pid {}", dwCount, dwPID);
// END_OF_ITEM_LOAD_LOG_ATTACH_PID
if (dwCount)
@ -691,7 +674,7 @@ void CClientManager::RESULT_ITEM_LOAD(CPeer * peer, MYSQL_RES * pRes, DWORD dwHa
peer->Encode(&s_items[0], sizeof(TPlayerItem) * dwCount);
for (DWORD i = 0; i < dwCount; ++i)
PutItemCache(&s_items[i], true); // <EFBFBD>ε<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>, <20><><EFBFBD><EFBFBD> bSkipQuery<EFBFBD><EFBFBD> true<EFBFBD><EFBFBD> <20>ִ´<D6B4>.
PutItemCache(&s_items[i], true); // 로드한 것은 따로 저장할 필요 없으므로, 인자 bSkipQuery true를 넣는다.
}
}
@ -699,7 +682,7 @@ void CClientManager::RESULT_AFFECT_LOAD(CPeer * peer, MYSQL_RES * pRes, DWORD dw
{
int iNumRows;
if ((iNumRows = mysql_num_rows(pRes)) == 0) // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if ((iNumRows = mysql_num_rows(pRes)) == 0) // 데이터 없음
return;
static std::vector<TPacketAffectElement> s_elements;
@ -725,7 +708,7 @@ void CClientManager::RESULT_AFFECT_LOAD(CPeer * peer, MYSQL_RES * pRes, DWORD dw
str_to_number(r.lSPCost, row[6]);
}
sys_log(0, "AFFECT_LOAD: count %d PID %u", s_elements.size(), dwPID);
SPDLOG_DEBUG("AFFECT_LOAD: count {} PID {}", s_elements.size(), dwPID);
DWORD dwCount = s_elements.size();
@ -764,7 +747,7 @@ void CClientManager::RESULT_QUEST_LOAD(CPeer * peer, MYSQL_RES * pRes, DWORD dwH
str_to_number(r.lValue, row[3]);
}
sys_log(0, "QUEST_LOAD: count %d PID %u", s_table.size(), s_table[0].dwPID);
SPDLOG_DEBUG("QUEST_LOAD: count {} PID {}", s_table.size(), s_table[0].dwPID);
DWORD dwCount = s_table.size();
@ -778,8 +761,7 @@ void CClientManager::RESULT_QUEST_LOAD(CPeer * peer, MYSQL_RES * pRes, DWORD dwH
*/
void CClientManager::QUERY_PLAYER_SAVE(CPeer * peer, DWORD dwHandle, TPlayerTable * pkTab)
{
if (g_test_server)
sys_log(0, "PLAYER_SAVE: %s", pkTab->name);
SPDLOG_TRACE("PLAYER_SAVE: {}", pkTab->name);
PutPlayerCache(pkTab);
}
@ -796,7 +778,7 @@ void CClientManager::__QUERY_PLAYER_CREATE(CPeer *peer, DWORD dwHandle, TPlayerC
int queryLen;
DWORD player_id;
// <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> X<><58> <20><><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD>.
// 한 계정에 X초 내로 캐릭터 생성을 할 수 없다.
auto it = s_createTimeByAccountID.find(packet->account_id);
if (it != s_createTimeByAccountID.end())
@ -829,7 +811,7 @@ void CClientManager::__QUERY_PLAYER_CREATE(CPeer *peer, DWORD dwHandle, TPlayerC
if (row[0] && dwPID > 0)
{
peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_ALREADY, dwHandle, 0);
sys_log(0, "ALREADY EXIST AccountChrIdx %d ID %d", packet->account_index, dwPID);
SPDLOG_DEBUG("ALREADY EXIST AccountChrIdx {} ID {}", packet->account_index, dwPID);
return;
}
}
@ -861,7 +843,7 @@ void CClientManager::__QUERY_PLAYER_CREATE(CPeer *peer, DWORD dwHandle, TPlayerC
if (*row[0] != '0')
{
sys_log(0, "ALREADY EXIST name %s, row[0] %s query %s", packet->player_table.name, row[0], queryStr);
SPDLOG_DEBUG("ALREADY EXIST name {}, row[0] {} query {}", packet->player_table.name, row[0], queryStr);
peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_ALREADY, dwHandle, 0);
return;
}
@ -886,7 +868,7 @@ void CClientManager::__QUERY_PLAYER_CREATE(CPeer *peer, DWORD dwHandle, TPlayerC
packet->player_table.job, packet->player_table.voice, packet->player_table.dir, packet->player_table.x, packet->player_table.y, packet->player_table.z,
packet->player_table.hp, packet->player_table.sp, packet->player_table.sRandomHP, packet->player_table.sRandomSP, packet->player_table.stat_point, packet->player_table.stamina, packet->player_table.part_base, packet->player_table.part_base, packet->player_table.gold);
sys_log(0, "PlayerCreate accountid %d name %s level %d gold %d, st %d ht %d job %d",
SPDLOG_DEBUG("PlayerCreate accountid {} name {} level {} gold {}, st {} ht {} job {}",
packet->account_id,
packet->player_table.name,
packet->player_table.level,
@ -899,20 +881,18 @@ void CClientManager::__QUERY_PLAYER_CREATE(CPeer *peer, DWORD dwHandle, TPlayerC
CDBManager::instance().EscapeString(text, packet->player_table.skills, sizeof(packet->player_table.skills));
queryLen += snprintf(queryStr + queryLen, sizeof(queryStr) - queryLen, "'%s', ", text);
if (g_test_server)
sys_log(0, "Create_Player queryLen[%d] TEXT[%s]", queryLen, text);
SPDLOG_TRACE("Create_Player queryLen[{}] TEXT[{}]", queryLen, text);
CDBManager::instance().EscapeString(text, packet->player_table.quickslot, sizeof(packet->player_table.quickslot));
queryLen += snprintf(queryStr + queryLen, sizeof(queryStr) - queryLen, "'%s')", text);
std::unique_ptr<SQLMsg> pMsg2(CDBManager::instance().DirectQuery(queryStr));
if (g_test_server)
sys_log(0, "Create_Player queryLen[%d] TEXT[%s]", queryLen, text);
SPDLOG_TRACE("Create_Player queryLen[{}] TEXT[{}]", queryLen, text);
if (pMsg2->Get()->uiAffectedRows <= 0)
{
peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_ALREADY, dwHandle, 0);
sys_log(0, "ALREADY EXIST3 query: %s AffectedRows %lu", queryStr, pMsg2->Get()->uiAffectedRows);
SPDLOG_DEBUG("ALREADY EXIST3 query: {} AffectedRows {}", queryStr, pMsg2->Get()->uiAffectedRows);
return;
}
@ -924,7 +904,7 @@ void CClientManager::__QUERY_PLAYER_CREATE(CPeer *peer, DWORD dwHandle, TPlayerC
if (pMsg3->Get()->uiAffectedRows <= 0)
{
sys_err("QUERY_ERROR: %s", queryStr);
SPDLOG_ERROR("QUERY_ERROR: {}", queryStr);
snprintf(queryStr, sizeof(queryStr), "DELETE FROM player%s WHERE id=%d", GetTablePostfix(), player_id);
CDBManager::instance().DirectQuery(queryStr);
@ -954,7 +934,7 @@ void CClientManager::__QUERY_PLAYER_CREATE(CPeer *peer, DWORD dwHandle, TPlayerC
peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_SUCCESS, dwHandle, sizeof(TPacketDGCreateSuccess));
peer->Encode(&pack, sizeof(TPacketDGCreateSuccess));
sys_log(0, "7 name %s job %d", pack.player.szName, pack.player.byJob);
SPDLOG_DEBUG("7 name {} job {}", pack.player.szName, pack.player.byJob);
s_createTimeByAccountID[packet->account_id] = time(0);
}
@ -985,7 +965,7 @@ void CClientManager::__QUERY_PLAYER_DELETE(CPeer* peer, DWORD dwHandle, TPlayerD
{
if (strlen(r.social_id) < 7 || strncmp(packet->private_code, r.social_id + strlen(r.social_id) - 7, 7))
{
sys_log(0, "PLAYER_DELETE FAILED len(%d)", strlen(r.social_id));
SPDLOG_DEBUG("PLAYER_DELETE FAILED len({})", strlen(r.social_id));
peer->EncodeHeader(HEADER_DG_PLAYER_DELETE_FAILED, dwHandle, 1);
peer->EncodeBYTE(packet->account_index);
return;
@ -998,7 +978,7 @@ void CClientManager::__QUERY_PLAYER_DELETE(CPeer* peer, DWORD dwHandle, TPlayerD
if (pTab->level >= m_iPlayerDeleteLevelLimit)
{
sys_log(0, "PLAYER_DELETE FAILED LEVEL %u >= DELETE LIMIT %d", pTab->level, m_iPlayerDeleteLevelLimit);
SPDLOG_DEBUG("PLAYER_DELETE FAILED LEVEL {} >= DELETE LIMIT {}", pTab->level, m_iPlayerDeleteLevelLimit);
peer->EncodeHeader(HEADER_DG_PLAYER_DELETE_FAILED, dwHandle, 1);
peer->EncodeBYTE(packet->account_index);
return;
@ -1006,7 +986,7 @@ void CClientManager::__QUERY_PLAYER_DELETE(CPeer* peer, DWORD dwHandle, TPlayerD
if (pTab->level < m_iPlayerDeleteLevelLimitLower)
{
sys_log(0, "PLAYER_DELETE FAILED LEVEL %u < DELETE LIMIT %d", pTab->level, m_iPlayerDeleteLevelLimitLower);
SPDLOG_DEBUG("PLAYER_DELETE FAILED LEVEL {} < DELETE LIMIT {}", pTab->level, m_iPlayerDeleteLevelLimitLower);
peer->EncodeHeader(HEADER_DG_PLAYER_DELETE_FAILED, dwHandle, 1);
peer->EncodeBYTE(packet->account_index);
return;
@ -1022,12 +1002,12 @@ void CClientManager::__QUERY_PLAYER_DELETE(CPeer* peer, DWORD dwHandle, TPlayerD
ClientHandleInfo * pi = new ClientHandleInfo(dwHandle, packet->player_id);
pi->account_index = packet->account_index;
sys_log(0, "PLAYER_DELETE TRY: %s %d pid%d", packet->login, packet->player_id, packet->account_index + 1);
SPDLOG_DEBUG("PLAYER_DELETE TRY: {} {} pid{}", packet->login, packet->player_id, packet->account_index + 1);
CDBManager::instance().ReturnQuery(szQuery, QID_PLAYER_DELETE, peer->GetHandle(), pi);
}
//
// @version 05/06/10 Bang2ni - <EFBFBD>÷<EFBFBD><EFBFBD>̾<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD>.
// @version 05/06/10 Bang2ni - 플레이어 삭제시 가격정보 리스트 삭제 추가.
//
void CClientManager::__RESULT_PLAYER_DELETE(CPeer *peer, SQLMsg* msg)
{
@ -1049,7 +1029,7 @@ void CClientManager::__RESULT_PLAYER_DELETE(CPeer *peer, SQLMsg* msg)
if (deletedLevelLimit >= m_iPlayerDeleteLevelLimit && !IsChinaEventServer())
{
sys_log(0, "PLAYER_DELETE FAILED LEVEL %u >= DELETE LIMIT %d", deletedLevelLimit, m_iPlayerDeleteLevelLimit);
SPDLOG_DEBUG("PLAYER_DELETE FAILED LEVEL {} >= DELETE LIMIT {}", deletedLevelLimit, m_iPlayerDeleteLevelLimit);
peer->EncodeHeader(HEADER_DG_PLAYER_DELETE_FAILED, pi->dwHandle, 1);
peer->EncodeBYTE(pi->account_index);
return;
@ -1057,7 +1037,7 @@ void CClientManager::__RESULT_PLAYER_DELETE(CPeer *peer, SQLMsg* msg)
if (deletedLevelLimit < m_iPlayerDeleteLevelLimitLower)
{
sys_log(0, "PLAYER_DELETE FAILED LEVEL %u < DELETE LIMIT %d", deletedLevelLimit, m_iPlayerDeleteLevelLimitLower);
SPDLOG_DEBUG("PLAYER_DELETE FAILED LEVEL {} < DELETE LIMIT {}", deletedLevelLimit, m_iPlayerDeleteLevelLimitLower);
peer->EncodeHeader(HEADER_DG_PLAYER_DELETE_FAILED, pi->dwHandle, 1);
peer->EncodeBYTE(pi->account_index);
return;
@ -1071,21 +1051,21 @@ void CClientManager::__RESULT_PLAYER_DELETE(CPeer *peer, SQLMsg* msg)
if (pIns->Get()->uiAffectedRows == 0 || pIns->Get()->uiAffectedRows == (uint32_t)-1)
{
sys_log(0, "PLAYER_DELETE FAILED %u CANNOT INSERT TO player%s_deleted", dwPID, GetTablePostfix());
SPDLOG_DEBUG("PLAYER_DELETE FAILED {} CANNOT INSERT TO player{}_deleted", dwPID, GetTablePostfix());
peer->EncodeHeader(HEADER_DG_PLAYER_DELETE_FAILED, pi->dwHandle, 1);
peer->EncodeBYTE(pi->account_index);
return;
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
sys_log(0, "PLAYER_DELETE SUCCESS %u", dwPID);
// 삭제 성공
SPDLOG_DEBUG("PLAYER_DELETE SUCCESS {}", dwPID);
char account_index_string[16];
snprintf(account_index_string, sizeof(account_index_string), "player_id%d", m_iPlayerIDStart + pi->account_index);
// <EFBFBD>÷<EFBFBD><EFBFBD>̾<EFBFBD> <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// 플레이어 테이블을 캐쉬에서 삭제한다.
CPlayerTableCache * pkPlayerCache = GetPlayerCache(pi->player_id);
if (pkPlayerCache)
@ -1094,7 +1074,7 @@ void CClientManager::__RESULT_PLAYER_DELETE(CPeer *peer, SQLMsg* msg)
delete pkPlayerCache;
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>۵<EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// 아이템들을 캐쉬에서 삭제한다.
TItemCacheSet * pSet = GetItemCacheSet(pi->player_id);
if (pSet)
@ -1123,7 +1103,7 @@ void CClientManager::__RESULT_PLAYER_DELETE(CPeer *peer, SQLMsg* msg)
if (pMsg->Get()->uiAffectedRows == 0 || pMsg->Get()->uiAffectedRows == (uint32_t)-1)
{
sys_log(0, "PLAYER_DELETE FAIL WHEN UPDATE account table");
SPDLOG_DEBUG("PLAYER_DELETE FAIL WHEN UPDATE account table");
peer->EncodeHeader(HEADER_DG_PLAYER_DELETE_FAILED, pi->dwHandle, 1);
peer->EncodeBYTE(pi->account_index);
return;
@ -1157,8 +1137,8 @@ void CClientManager::__RESULT_PLAYER_DELETE(CPeer *peer, SQLMsg* msg)
}
else
{
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
sys_log(0, "PLAYER_DELETE FAIL NO ROW");
// 삭제 실패
SPDLOG_DEBUG("PLAYER_DELETE FAIL NO ROW");
peer->EncodeHeader(HEADER_DG_PLAYER_DELETE_FAILED, pi->dwHandle, 1);
peer->EncodeBYTE(pi->account_index);
}
@ -1211,86 +1191,15 @@ void CClientManager::QUERY_REMOVE_AFFECT(CPeer * peer, TPacketGDRemoveAffect * p
CDBManager::instance().AsyncQuery(queryStr);
}
void CClientManager::QUERY_HIGHSCORE_REGISTER(CPeer* peer, TPacketGDHighscore * data)
{
char szQuery[128];
snprintf(szQuery, sizeof(szQuery), "SELECT value FROM highscore%s WHERE board='%s' AND pid = %u", GetTablePostfix(), data->szBoard, data->dwPID);
sys_log(0, "HEADER_GD_HIGHSCORE_REGISTER: PID %u", data->dwPID);
ClientHandleInfo * pi = new ClientHandleInfo(0);
strlcpy(pi->login, data->szBoard, sizeof(pi->login));
pi->account_id = (DWORD)data->lValue;
pi->player_id = data->dwPID;
pi->account_index = (data->cDir > 0);
CDBManager::instance().ReturnQuery(szQuery, QID_HIGHSCORE_REGISTER, peer->GetHandle(), pi);
}
void CClientManager::RESULT_HIGHSCORE_REGISTER(CPeer * pkPeer, SQLMsg * msg)
{
CQueryInfo * qi = (CQueryInfo *) msg->pvUserData;
ClientHandleInfo * pi = (ClientHandleInfo *) qi->pvData;
//DWORD dwHandle = pi->dwHandle;
char szBoard[21];
strlcpy(szBoard, pi->login, sizeof(szBoard));
int value = (int)pi->account_id;
SQLResult * res = msg->Get();
if (res->uiNumRows == 0)
{
// <20><><EFBFBD>ο<EFBFBD> <20><><EFBFBD>̽<EFBFBD><CCBD>ھ<20><><EFBFBD><EFBFBD>
char buf[256];
snprintf(buf, sizeof(buf), "INSERT INTO highscore%s VALUES('%s', %u, %d)", GetTablePostfix(), szBoard, pi->player_id, value);
CDBManager::instance().AsyncQuery(buf);
}
else
{
if (!res->pSQLResult)
{
delete pi;
return;
}
MYSQL_ROW row = mysql_fetch_row(res->pSQLResult);
if (row && row[0])
{
int current_value = 0; str_to_number(current_value, row[0]);
if (pi->account_index && current_value >= value || !pi->account_index && current_value <= value)
{
value = current_value;
}
else
{
char buf[256];
snprintf(buf, sizeof(buf), "REPLACE INTO highscore%s VALUES('%s', %u, %d)", GetTablePostfix(), szBoard, pi->player_id, value);
CDBManager::instance().AsyncQuery(buf);
}
}
else
{
char buf[256];
snprintf(buf, sizeof(buf), "INSERT INTO highscore%s VALUES('%s', %u, %d)", GetTablePostfix(), szBoard, pi->player_id, value);
CDBManager::instance().AsyncQuery(buf);
}
}
// TODO: <20>̰<EFBFBD><CCB0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̽<EFBFBD><CCBD>ھ<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD> üũ<C3BC>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ѷ<EFBFBD><D1B7><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
delete pi;
}
void CClientManager::InsertLogoutPlayer(DWORD pid)
{
TLogoutPlayerMap::iterator it = m_map_logout.find(pid);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD>
// 존재하지 않을경우 추가
if (it != m_map_logout.end())
{
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ұ<EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD>
if (g_log)
sys_log(0, "LOGOUT: Update player time pid(%d)", pid);
// 존재할경우 시간만 갱신
SPDLOG_TRACE("LOGOUT: Update player time pid({})", pid);
it->second->time = time(0);
return;
@ -1301,8 +1210,7 @@ void CClientManager::InsertLogoutPlayer(DWORD pid)
pLogout->time = time(0);
m_map_logout.insert(std::make_pair(pid, pLogout));
if (g_log)
sys_log(0, "LOGOUT: Insert player pid(%d)", pid);
SPDLOG_TRACE("LOGOUT: Insert player pid({})", pid);
}
void CClientManager::DeleteLogoutPlayer(DWORD pid)

View File

@ -67,7 +67,7 @@ bool CConfig::GetWord(FILE *fp, char *tar)
if ((c == ' ' || c == '\t' || c == '\n'))
{
// <EFBFBD><EFBFBD>.
// .
tar[i] = '\0';
return true;
}
@ -144,7 +144,7 @@ bool CConfig::LoadFile(const char* filename)
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ݴ<EFBFBD> <20>κ<EFBFBD>.
// 파일 닫는 부분.
fclose(fp);
return true;
}
@ -171,7 +171,7 @@ bool CConfig::GetParam(const char*key, int index, DWORD *Param)
str_to_number(*Param, szParam[index]);
sys_log(0, "GetParam %d", *Param);
SPDLOG_DEBUG("GetParam {}", *Param);
return true;
}
const char * CConfig::Get(const char* key)

View File

@ -11,14 +11,14 @@
namespace
{
/// <EFBFBD>Ľ̿<EFBFBD> state <EFBFBD><EFBFBD><EFBFBD>Ű<EFBFBD>
/// 파싱용 state 열거값
enum ParseState
{
STATE_NORMAL = 0, ///< <EFBFBD>Ϲ<EFBFBD> <20><><EFBFBD><EFBFBD>
STATE_QUOTE ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǥ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
STATE_NORMAL = 0, ///< 일반 상태
STATE_QUOTE ///< 따옴표 뒤의 상태
};
/// <EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD> <20>¿<EFBFBD><C2BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// 문자열 좌우의 공백을 제거해서 반환한다.
std::string Trim(std::string str)
{
str = str.erase(str.find_last_not_of(" \t\r\n") + 1);
@ -26,7 +26,7 @@ namespace
return str;
}
/// \brief <EFBFBD>־<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20>ִ<EFBFBD> <20><><EFBFBD>ĺ<EFBFBD><C4BA><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ҹ<EFBFBD><D2B9>ڷ<EFBFBD> <20>ٲ۴<D9B2>.
/// \brief 주어진 문장에 있는 알파벳을 모두 소문자로 바꾼다.
std::string Lower(std::string original)
{
std::transform(original.begin(), original.end(), original.begin(), tolower);
@ -35,9 +35,9 @@ namespace
}
////////////////////////////////////////////////////////////////////////////////
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD> <20><>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
/// \param name <EFBFBD><EFBFBD> <20≯<EFBFBD>
/// \param index <EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD>
/// \brief 셀을 액세스할 때, 숫자 대신 사용할 이름을 등록한다.
/// \param name 셀 이름
/// \param index 셀 인덱스
////////////////////////////////////////////////////////////////////////////////
void cCsvAlias::AddAlias(const char* name, size_t index)
{
@ -51,7 +51,7 @@ void cCsvAlias::AddAlias(const char* name, size_t index)
}
////////////////////////////////////////////////////////////////////////////////
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
/// \brief 모든 데이터를 삭제한다.
////////////////////////////////////////////////////////////////////////////////
void cCsvAlias::Destroy()
{
@ -60,9 +60,9 @@ void cCsvAlias::Destroy()
}
////////////////////////////////////////////////////////////////////////////////
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \param index <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD>
/// \return const char* <EFBFBD≯<EFBFBD>
/// \brief 숫자 인덱스를 이름으로 변환한다.
/// \param index 숫자 인덱스
/// \return const char* 이름
////////////////////////////////////////////////////////////////////////////////
const char* cCsvAlias::operator [] (size_t index) const
{
@ -78,9 +78,9 @@ const char* cCsvAlias::operator [] (size_t index) const
}
////////////////////////////////////////////////////////////////////////////////
/// \brief <EFBFBD≯<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \param name <EFBFBD≯<EFBFBD>
/// \return size_t <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD>
/// \brief 이름을 숫자 인덱스로 변환한다.
/// \param name 이름
/// \return size_t 숫자 인덱스
////////////////////////////////////////////////////////////////////////////////
size_t cCsvAlias::operator [] (const char* name) const
{
@ -96,11 +96,11 @@ size_t cCsvAlias::operator [] (const char* name) const
}
////////////////////////////////////////////////////////////////////////////////
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> CSV <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5>Ѵ<EFBFBD>.
/// \param fileName CSV <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD>
/// \param seperator <EFBFBD>ʵ<EFBFBD> <20>и<EFBFBD><D0B8>ڷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><EFBFBD><E2BABB><EFBFBD><EFBFBD> ','<EFBFBD>̴<EFBFBD>.
/// \param quote <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǥ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><EFBFBD><E2BABB><EFBFBD><EFBFBD> '"'<EFBFBD>̴<EFBFBD>.
/// \return bool <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5>ߴٸ<DFB4> true, <EFBFBD>ƴ϶<EFBFBD><EFBFBD><EFBFBD> false
/// \brief 지정된 이름의 CSV 파일을 로드한다.
/// \param fileName CSV 파일 이름
/// \param seperator 필드 분리자로 사용할 글자. 기본값은 ','이다.
/// \param quote 따옴표로 사용할 글자. 기본값은 '"'이다.
/// \return bool 무사히 로드했다면 true, 아니라면 false
////////////////////////////////////////////////////////////////////////////////
bool cCsvFile::Load(const char* fileName, const char seperator, const char quote)
{
@ -109,7 +109,7 @@ bool cCsvFile::Load(const char* fileName, const char seperator, const char quote
std::ifstream file(fileName, std::ios::in);
if (!file) return false;
Destroy(); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD>
Destroy(); // 기존의 데이터를 삭제
cCsvRow* row = NULL;
ParseState state = STATE_NORMAL;
@ -124,33 +124,33 @@ bool cCsvFile::Load(const char* fileName, const char seperator, const char quote
std::string line(Trim(buf));
if (line.empty() || (state == STATE_NORMAL && line[0] == '#')) continue;
std::string text = std::string(line) + " "; // <EFBFBD>Ľ<EFBFBD> lookahead <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٿ<EFBFBD><D9BF>ش<EFBFBD>.
std::string text = std::string(line) + " "; // 파싱 lookahead 때문에 붙여준다.
size_t cur = 0;
while (cur < text.size())
{
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>尡 QUOTE <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>,
// 현재 모드가 QUOTE 모드일 때,
if (state == STATE_QUOTE)
{
// '"' <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
// 1. <EFBFBD><EFBFBD> <20><><EFBFBD>ο<EFBFBD> Ư<><C6AF> <20><><EFBFBD>ڰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20≯<EFBFBD> <20>˸<EFBFBD><CBB8><EFBFBD> <20><> <20>¿<EFBFBD><C2BF><EFBFBD> <20><>
// 2. <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> '"' <20><><EFBFBD>ڰ<EFBFBD> '"' 2<><32><EFBFBD><EFBFBD> ġȯ<C4A1><C8AF> <20><>
// <EFBFBD><EFBFBD> <20><> ù<><C3B9>° <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> CSV <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD><CCB6><EFBFBD>,
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> STATE_NORMAL<EFBFBD><EFBFBD> <20>ɸ<EFBFBD><C9B8><EFBFBD> <20>Ǿ<EFBFBD><C7BE>ִ<EFBFBD>.
// <EFBFBD>׷<EFBFBD><EFBFBD>Ƿ<EFBFBD> <20><><EFBFBD><20>ɸ<EFBFBD><C9B8><EFBFBD> <20><><EFBFBD><EFBFBD> 1<><31><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>쳪, 2<><32> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̴<EFBFBD>.
// 2<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><ECBFA1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> '"' <20><><EFBFBD>ڰ<EFBFBD> 2<><32><EFBFBD><EFBFBD> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1<><31><EFBFBD><EFBFBD>
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><ECBFA1> <20>ƴϴ<C6B4>. <20≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ؼ<EFBFBD> <20>ڵ带 ¥<><C2A5>...
// '"' 문자의 종류는 두 가지이다.
// 1. 셀 내부에 특수 문자가 있을 경우 이를 알리는 셀 좌우의 것
// 2. 셀 내부의 '"' 문자가 '"' 2개로 치환된 것
// 이 중 첫번째 경우의 좌측에 있는 것은 CSV 파일이 정상적이라면,
// 무조건 STATE_NORMAL에 걸리게 되어있다.
// 그러므로 여기서 걸리는 것은 1번의 우측 경우나, 2번 경우 뿐이다.
// 2번의 경우에는 무조건 '"' 문자가 2개씩 나타난다. 하지만 1번의
// 우측 경우에는 아니다. 이를 바탕으로 해서 코드를 짜면...
if (text[cur] == quote)
{
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڰ<EFBFBD> '"' <20><><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD>, <20><> <20><><EFBFBD>ӵ<EFBFBD> '"' <20><><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD>
// <EFBFBD>̴<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> '"' <20><><EFBFBD>ڰ<EFBFBD> ġȯ<C4A1><C8AF> <20><><EFBFBD>̴<EFBFBD>.
// 다음 문자가 '"' 문자라면, 즉 연속된 '"' 문자라면
// 이는 셀 내부의 '"' 문자가 치환된 것이다.
if (text[cur+1] == quote)
{
token += quote;
++cur;
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڰ<EFBFBD> '"' <20><><EFBFBD>ڰ<EFBFBD> <20>ƴ϶<C6B4><CFB6><EFBFBD>
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> '"'<27><><EFBFBD>ڴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>˸<EFBFBD><CBB8><EFBFBD> <20><><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD> <20><> <20><> <20>ִ<EFBFBD>.
// 다음 문자가 '"' 문자가 아니라면
// 현재의 '"'문자는 셀의 끝을 알리는 문자라고 할 수 있다.
else
{
state = STATE_NORMAL;
@ -161,25 +161,25 @@ bool cCsvFile::Load(const char* fileName, const char seperator, const char quote
token += text[cur];
}
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>尡 NORMAL <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>,
// 현재 모드가 NORMAL 모드일 때,
else if (state == STATE_NORMAL)
{
if (row == NULL)
row = new cCsvRow();
// ',' <EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ǹ<EFBFBD><C7B9>Ѵ<EFBFBD>.
// <EFBFBD><EFBFBD>ū<EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD>ٰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ְ<EFBFBD>, <20><>ū<EFBFBD><C5AB> <20>ʱ<EFBFBD>ȭ<EFBFBD>Ѵ<EFBFBD>.
// ',' 문자를 만났다면 셀의 끝의 의미한다.
// 토큰으로서 셀 리스트에다가 집어넣고, 토큰을 초기화한다.
if (text[cur] == seperator)
{
row->push_back(token);
token.clear();
}
// '"' <EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ٸ<EFBFBD>, QUOTE <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
// '"' 문자를 만났다면, QUOTE 모드로 전환한다.
else if (text[cur] == quote)
{
state = STATE_QUOTE;
}
// <EFBFBD>ٸ<EFBFBD> <20>Ϲ<EFBFBD> <20><><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ū<EFBFBD><C5AB><EFBFBD>ٰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD>.
// 다른 일반 문자라면 현재 토큰에다가 덧붙인다.
else
{
token += text[cur];
@ -189,8 +189,8 @@ bool cCsvFile::Load(const char* fileName, const char seperator, const char quote
++cur;
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ',' <20><><EFBFBD>ڰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20>߰<EFBFBD><DFB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// <EFBFBD><EFBFBD>, ó<><C3B3><EFBFBD><EFBFBD> <20>Ľ<EFBFBD> lookahead <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̽<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
// 마지막 셀은 끝에 ',' 문자가 없기 때문에 여기서 추가해줘야한다.
// 단, 처음에 파싱 lookahead 때문에 붙인 스페이스 문자 두 개를 뗀다.
if (state == STATE_NORMAL)
{
Assert(row != NULL);
@ -209,49 +209,49 @@ bool cCsvFile::Load(const char* fileName, const char seperator, const char quote
}
////////////////////////////////////////////////////////////////////////////////
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CSV <20><><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
/// \param fileName CSV <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD>
/// \param append true<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD>. false<73><65> <20><><EFBFBD><EFBFBD><ECBFA1>
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
/// \param seperator <EFBFBD>ʵ<EFBFBD> <20>и<EFBFBD><D0B8>ڷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><EFBFBD><E2BABB><EFBFBD><EFBFBD> ','<EFBFBD>̴<EFBFBD>.
/// \param quote <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǥ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><EFBFBD><E2BABB><EFBFBD><EFBFBD> '"'<EFBFBD>̴<EFBFBD>.
/// \return bool <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ߴٸ<DFB4> true, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><ECBFA1> false
/// \brief 가지고 있는 내용을 CSV 파일에다 저장한다.
/// \param fileName CSV 파일 이름
/// \param append true일 경우, 기존의 파일에다 덧붙인다. false인 경우에는
/// 기존의 파일 내용을 삭제하고, 새로 쓴다.
/// \param seperator 필드 분리자로 사용할 글자. 기본값은 ','이다.
/// \param quote 따옴표로 사용할 글자. 기본값은 '"'이다.
/// \return bool 무사히 저장했다면 true, 에러가 생긴 경우에는 false
////////////////////////////////////////////////////////////////////////////////
bool cCsvFile::Save(const char* fileName, bool append, char seperator, char quote) const
{
Assert(seperator != quote);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7>׷<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// 출력 모드에 따라 파일을 적당한 플래그로 생성한다.
std::ofstream file;
if (append) { file.open(fileName, std::ios::out | std::ios::app); }
else { file.open(fileName, std::ios::out | std::ios::trunc); }
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ߴٸ<DFB4>, false<73><65> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// 파일을 열지 못했다면, false를 리턴한다.
if (!file) return false;
char special_chars[5] = { seperator, quote, '\r', '\n', 0 };
char quote_escape_string[3] = { quote, quote, 0 };
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ⱦ<><C8BE><EFBFBD>ϸ鼭...
// 모든 행을 횡단하면서...
for (size_t i=0; i<m_Rows.size(); i++)
{
const cCsvRow& row = *((*this)[i]);
std::string line;
// <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ū<EFBFBD><C5AB> Ⱦ<><C8BE><EFBFBD>ϸ鼭...
// 행 안의 모든 토큰을 횡단하면서...
for (size_t j=0; j<row.size(); j++)
{
const std::string& token = row[j];
// <EFBFBD>Ϲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>('"' <EFBFBD>Ǵ<EFBFBD> ','<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
// <EFBFBD><EFBFBD>ū<EFBFBD>̶<EFBFBD><EFBFBD><EFBFBD> <20>׳<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20>ȴ<EFBFBD>.
// 일반적인('"' 또는 ','를 포함하지 않은)
// 토큰이라면 그냥 저장하면 된다.
if (token.find_first_of(special_chars) == std::string::npos)
{
line += token;
}
// Ư<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ū<EFBFBD>̶<EFBFBD><CCB6><EFBFBD> <20><><EFBFBD>ڿ<EFBFBD> <20>¿쿡 '"'<27><> <20>ٿ<EFBFBD><D9BF>ְ<EFBFBD>,
// <EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> '"'<27><> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// 특수문자를 포함한 토큰이라면 문자열 좌우에 '"'를 붙여주고,
// 문자열 내부의 '"'를 두 개로 만들어줘야한다.
else
{
line += quote;
@ -265,11 +265,11 @@ bool cCsvFile::Save(const char* fileName, bool append, char seperator, char quot
line += quote;
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ƴ϶<C6B4><CFB6><EFBFBD> ','<27><> <20><>ū<EFBFBD><C5AB> <20>ڿ<EFBFBD><DABF><EFBFBD> <20>ٿ<EFBFBD><D9BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// 마지막 셀이 아니라면 ','를 토큰의 뒤에다 붙여줘야한다.
if (j != row.size() - 1) { line += seperator; }
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// 라인을 출력한다.
file << line << std::endl;
}
@ -277,7 +277,7 @@ bool cCsvFile::Save(const char* fileName, bool append, char seperator, char quot
}
////////////////////////////////////////////////////////////////////////////////
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20>޸𸮿<DEB8><F0B8AEBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
/// \brief 모든 데이터를 메모리에서 삭제한다.
////////////////////////////////////////////////////////////////////////////////
void cCsvFile::Destroy()
{
@ -288,9 +288,9 @@ void cCsvFile::Destroy()
}
////////////////////////////////////////////////////////////////////////////////
/// \brief <EFBFBD>ش<EFBFBD><EFBFBD>ϴ<EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \param index <EFBFBD>ε<EFBFBD><EFBFBD><EFBFBD>
/// \return cCsvRow* <EFBFBD>ش<EFBFBD> <20><>
/// \brief 해당하는 인덱스의 행을 반환한다.
/// \param index 인덱스
/// \return cCsvRow* 해당 행
////////////////////////////////////////////////////////////////////////////////
cCsvRow* cCsvFile::operator [] (size_t index)
{
@ -299,9 +299,9 @@ cCsvRow* cCsvFile::operator [] (size_t index)
}
////////////////////////////////////////////////////////////////////////////////
/// \brief <EFBFBD>ش<EFBFBD><EFBFBD>ϴ<EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \param index <EFBFBD>ε<EFBFBD><EFBFBD><EFBFBD>
/// \return const cCsvRow* <EFBFBD>ش<EFBFBD> <20><>
/// \brief 해당하는 인덱스의 행을 반환한다.
/// \param index 인덱스
/// \return const cCsvRow* 해당 행
////////////////////////////////////////////////////////////////////////////////
const cCsvRow* cCsvFile::operator [] (size_t index) const
{
@ -310,7 +310,7 @@ const cCsvRow* cCsvFile::operator [] (size_t index) const
}
////////////////////////////////////////////////////////////////////////////////
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// \brief 생성자
////////////////////////////////////////////////////////////////////////////////
cCsvTable::cCsvTable()
: m_CurRow(-1)
@ -318,18 +318,18 @@ cCsvTable::cCsvTable()
}
////////////////////////////////////////////////////////////////////////////////
/// \brief <EFBFBD>Ҹ<EFBFBD><EFBFBD><EFBFBD>
/// \brief 소멸자
////////////////////////////////////////////////////////////////////////////////
cCsvTable::~cCsvTable()
{
}
////////////////////////////////////////////////////////////////////////////////
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> CSV <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5>Ѵ<EFBFBD>.
/// \param fileName CSV <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD>
/// \param seperator <EFBFBD>ʵ<EFBFBD> <20>и<EFBFBD><D0B8>ڷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><EFBFBD><E2BABB><EFBFBD><EFBFBD> ','<EFBFBD>̴<EFBFBD>.
/// \param quote <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǥ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><EFBFBD><E2BABB><EFBFBD><EFBFBD> '"'<EFBFBD>̴<EFBFBD>.
/// \return bool <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5>ߴٸ<DFB4> true, <EFBFBD>ƴ϶<EFBFBD><EFBFBD><EFBFBD> false
/// \brief 지정된 이름의 CSV 파일을 로드한다.
/// \param fileName CSV 파일 이름
/// \param seperator 필드 분리자로 사용할 글자. 기본값은 ','이다.
/// \param quote 따옴표로 사용할 글자. 기본값은 '"'이다.
/// \return bool 무사히 로드했다면 true, 아니라면 false
////////////////////////////////////////////////////////////////////////////////
bool cCsvTable::Load(const char* fileName, const char seperator, const char quote)
{
@ -338,19 +338,19 @@ bool cCsvTable::Load(const char* fileName, const char seperator, const char quot
}
////////////////////////////////////////////////////////////////////////////////
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѿ<D1BE><EEB0A3>.
/// \return bool <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѿ <20><><EFBFBD><EFBFBD> true<75><65> <20><>ȯ<EFBFBD>ϰ<EFBFBD>, <20><> <20>̻<EFBFBD>
/// <EFBFBD>Ѿ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD><ECBFA1> false<73><65> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 다음 행으로 넘어간다.
/// \return bool 다음 행으로 무사히 넘어간 경우 true를 반환하고, 더 이상
/// 넘어갈 행이 존재하지 않는 경우에는 false를 반환한다.
////////////////////////////////////////////////////////////////////////////////
bool cCsvTable::Next()
{
// 20<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>÷ΰ<C3B7> <20>Ͼ<CFBE>ٵ<EFBFBD>...<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
// 20억번 정도 호출하면 오버플로가 일어날텐데...괜찮겠지?
return ++m_CurRow < (int)m_File.GetRowCount() ? true : false;
}
////////////////////////////////////////////////////////////////////////////////
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>ڸ<EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \return size_t <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
/// \brief 현재 행의 셀 숫자를 반환한다.
/// \return size_t 현재 행의 셀 숫자
////////////////////////////////////////////////////////////////////////////////
size_t cCsvTable::ColCount() const
{
@ -358,9 +358,9 @@ size_t cCsvTable::ColCount() const
}
////////////////////////////////////////////////////////////////////////////////
/// \brief <EFBFBD>ε<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> int <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \param index <EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD>
/// \return int <EFBFBD><EFBFBD> <20><>
/// \brief 인덱스를 이용해 int 형으로 셀 값을 반환한다.
/// \param index 셀 인덱스
/// \return int 셀 값
////////////////////////////////////////////////////////////////////////////////
int cCsvTable::AsInt(size_t index) const
{
@ -371,9 +371,9 @@ int cCsvTable::AsInt(size_t index) const
}
////////////////////////////////////////////////////////////////////////////////
/// \brief <EFBFBD>ε<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \param index <EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD>
/// \return double <EFBFBD><EFBFBD> <20><>
/// \brief 인덱스를 이용해 double 형으로 셀 값을 반환한다.
/// \param index 셀 인덱스
/// \return double 셀 값
////////////////////////////////////////////////////////////////////////////////
double cCsvTable::AsDouble(size_t index) const
{
@ -384,9 +384,9 @@ double cCsvTable::AsDouble(size_t index) const
}
////////////////////////////////////////////////////////////////////////////////
/// \brief <EFBFBD>ε<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> std::string <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \param index <EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD>
/// \return const char* <EFBFBD><EFBFBD> <20><>
/// \brief 인덱스를 이용해 std::string 형으로 셀 값을 반환한다.
/// \param index 셀 인덱스
/// \return const char* 셀 값
////////////////////////////////////////////////////////////////////////////////
const char* cCsvTable::AsStringByIndex(size_t index) const
{
@ -397,7 +397,7 @@ const char* cCsvTable::AsStringByIndex(size_t index) const
}
////////////////////////////////////////////////////////////////////////////////
/// \brief alias<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
/// \brief alias를 포함해 모든 데이터를 삭제한다.
////////////////////////////////////////////////////////////////////////////////
void cCsvTable::Destroy()
{
@ -407,10 +407,10 @@ void cCsvTable::Destroy()
}
////////////////////////////////////////////////////////////////////////////////
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \return const cCsvRow* <EFBFBD>׼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><ECBFA1> <20><> <20><><EFBFBD><EFBFBD>
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><>ȯ<EFBFBD>ϰ<EFBFBD>, <20><> <20>̻<EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><ECBFA1> NULL<EFBFBD><EFBFBD>
/// <EFBFBD><EFBFBD>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 현재 행을 반환한다.
/// \return const cCsvRow* 액세스가 가능한 현재 행이 존재하는 경우에는 그 행의
/// 포인터를 반환하고, 더 이상 액세스 가능한 행이 없는 경우에는 NULL
/// 반환한다.
////////////////////////////////////////////////////////////////////////////////
const cCsvRow* const cCsvTable::CurRow() const
{

View File

@ -12,28 +12,28 @@
////////////////////////////////////////////////////////////////////////////////
/// \class cCsvAlias
/// \brief CSV <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>߻<EFBFBD><DFBB>ϴ<EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̱<EFBFBD> <20><><EFBFBD><EFBFBD>
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ü.
/// \brief CSV 파일을 수정했을 때 발생하는 인덱스 문제를 줄이기 위한
/// 별명 객체.
///
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 0<><30> <20>÷<EFBFBD><C3B7><EFBFBD> A<><41> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>, 1<><31> <20>÷<EFBFBD><C3B7><EFBFBD> B<><42> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>־<EFBFBD><D6BE>µ<EFBFBD>...
/// 예를 들어 0번 컬럼이 A에 관한 내용을 포함하고, 1번 컬럼이 B에 관한 내용을
/// 포함하고 있었는데...
///
/// <pre>
/// int a = row.AsInt(0);
/// int b = row.AsInt(1);
/// </pre>
///
/// <EFBFBD><EFBFBD> <20><><EFBFBD>̿<EFBFBD> C<><43> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20>ϵ<EFBFBD><CFB5>ڵ<EFBFBD><DAB5>Ǿ<EFBFBD> <20>ִ<EFBFBD>
/// 1<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>Ƽ<EFBFBD> <20><><EFBFBD>ľ<EFBFBD> <20>ϴµ<CFB4>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߻<EFBFBD><DFBB>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>۾<EFBFBD><DBBE>̴<EFBFBD>.
/// 그 사이에 C에 관한 내용을 포함하는 컬럼이 끼어든 경우, 하드코딩되어 있는
/// 1번을 찾아서 고쳐야 하는데, 상당히 에러가 발생하기 쉬운 작업이다.
///
/// <pre>
/// int a = row.AsInt(0);
/// int c = row.AsInt(1);
/// int b = row.AsInt(2); <-- <EFBFBD><EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ű<EFBFBD><C5B0><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
/// int b = row.AsInt(2); <-- 이 부분을 일일이 신경써야 한다.
/// </pre>
///
/// <EFBFBD><EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> ó<><C3B3><EFBFBD>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EEB0A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD>̳<EFBFBD><CCB3><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>
/// <EFBFBD>ִ<EFBFBD>.
/// 이 부분을 문자열로 처리하면 유지보수에 들어가는 수고를 약간이나마 줄일 수
/// 있다.
////////////////////////////////////////////////////////////////////////////////
class cCsvAlias
@ -47,51 +47,51 @@ private:
typedef std::map<size_t, std::string> INDEX2NAME_MAP;
#endif
NAME2INDEX_MAP m_Name2Index; ///< <EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD>
INDEX2NAME_MAP m_Index2Name; ///< <EFBFBD>߸<EFBFBD><EFBFBD><EFBFBD> alias<EFBFBD><EFBFBD> <20>˻<EFBFBD><CBBB>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD><EFBFBD><EFBFBD> <20><>
NAME2INDEX_MAP m_Name2Index; ///< 셀 인덱스 대신으로 사용하기 위한 이름들
INDEX2NAME_MAP m_Index2Name; ///< 잘못된 alias를 검사하기 위한 추가적인 맵
public:
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// \brief 생성자
cCsvAlias() {}
/// \brief <EFBFBD>Ҹ<EFBFBD><EFBFBD><EFBFBD>
/// \brief 소멸자
virtual ~cCsvAlias() {}
public:
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD> <20><>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
/// \brief 셀을 액세스할 때, 숫자 대신 사용할 이름을 등록한다.
void AddAlias(const char* name, size_t index);
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
/// \brief 모든 데이터를 삭제한다.
void Destroy();
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 숫자 인덱스를 이름으로 변환한다.
const char* operator [] (size_t index) const;
/// \brief <EFBFBD≯<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 이름을 숫자 인덱스로 변환한다.
size_t operator [] (const char* name) const;
private:
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
/// \brief 복사 생성자 금지
cCsvAlias(const cCsvAlias&) {}
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
/// \brief 대입 연산자 금지
const cCsvAlias& operator = (const cCsvAlias&) { return *this; }
};
////////////////////////////////////////////////////////////////////////////////
/// \class cCsvRow
/// \brief CSV <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> ĸ<><C4B8>ȭ<EFBFBD><C8AD> Ŭ<><C5AC><EFBFBD><EFBFBD>
/// \brief CSV 파일의 한 행을 캡슐화한 클래스
///
/// CSV<EFBFBD><EFBFBD> <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̴<EFBFBD> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20><><EFBFBD><EFBFBD> ',' <20><><EFBFBD>ڷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̴<EFBFBD>.
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20>ȿ<EFBFBD> Ư<><C6AF> <20><><EFBFBD>ڷ<EFBFBD> <20><><EFBFBD>̴<EFBFBD> ',' <20><><EFBFBD>ڳ<EFBFBD> '"' <20><><EFBFBD>ڰ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD>,
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><20>̻<EFBFBD><CCBB>ϰ<EFBFBD> <20><><EFBFBD>Ѵ<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><>ȭ<EFBFBD><C8AD> <20><><EFBFBD>̴<EFBFBD>.
/// CSV의 기본 포맷은 엑셀에서 보이는 하나의 셀을 ',' 문자로 구분한 것이다.
/// 하지만, 셀 안에 특수 문자로 쓰이는 ',' 문자나 '"' 문자가 들어갈 경우,
/// 모양이 약간 이상하게 변한다. 다음은 그 변화의 예이다.
///
/// <pre>
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̴<EFBFBD> <20><><EFBFBD><EFBFBD> | <20><><EFBFBD><EFBFBD> CSV <20><><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>
/// 엑셀에서 보이는 모양 | 실제 CSV 파일에 들어가있는 모양
/// ---------------------+----------------------------------------------------
/// ItemPrice | ItemPrice
/// Item,Price | "Item,Price"
@ -101,9 +101,9 @@ private:
/// Item",Price | "Item"",Price"
/// </pre>
///
/// <EFBFBD><EFBFBD> <20><><EFBFBD>μ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20>ִ<EFBFBD>.
/// - <EFBFBD><EFBFBD> <20><><EFBFBD>ο<EFBFBD> ',' <EFBFBD>Ǵ<EFBFBD> '"' <EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD>, <20><> <20>¿쿡 '"' <20><><EFBFBD>ڰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
/// - <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> '"' <20><><EFBFBD>ڴ<EFBFBD> 2<><32><EFBFBD><EFBFBD> ġȯ<C4A1>ȴ<EFBFBD>.
/// 이 예로서 다음과 같은 사항을 알 수 있다.
/// - 셀 내부에 ',' 또는 '"' 문자가 들어갈 경우, 셀 좌우에 '"' 문자가 생긴다.
/// - 셀 내부의 '"' 문자는 2개로 치환된다.
///
/// \sa cCsvFile
////////////////////////////////////////////////////////////////////////////////
@ -111,51 +111,51 @@ private:
class cCsvRow : public std::vector<std::string>
{
public:
/// \brief <EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// \brief 기본 생성자
cCsvRow() {}
/// \brief <EFBFBD>Ҹ<EFBFBD><EFBFBD><EFBFBD>
/// \brief 소멸자
~cCsvRow() {}
public:
/// \brief <EFBFBD>ش<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> int <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 해당 셀의 데이터를 int 형으로 반환한다.
int AsInt(size_t index) const { return atoi(at(index).c_str()); }
/// \brief <EFBFBD>ش<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 해당 셀의 데이터를 double 형으로 반환한다.
double AsDouble(size_t index) const { return atof(at(index).c_str()); }
/// \brief <EFBFBD>ش<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 해당 셀의 데이터를 문자열로 반환한다.
const char* AsString(size_t index) const { return at(index).c_str(); }
/// \brief <EFBFBD>ش<EFBFBD><EFBFBD>ϴ<EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> int <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 해당하는 이름의 셀 데이터를 int 형으로 반환한다.
int AsInt(const char* name, const cCsvAlias& alias) const {
return atoi( at(alias[name]).c_str() );
}
/// \brief <EFBFBD>ش<EFBFBD><EFBFBD>ϴ<EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> int <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 해당하는 이름의 셀 데이터를 int 형으로 반환한다.
double AsDouble(const char* name, const cCsvAlias& alias) const {
return atof( at(alias[name]).c_str() );
}
/// \brief <EFBFBD>ش<EFBFBD><EFBFBD>ϴ<EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 해당하는 이름의 셀 데이터를 문자열로 반환한다.
const char* AsString(const char* name, const cCsvAlias& alias) const {
return at(alias[name]).c_str();
}
private:
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
/// \brief 복사 생성자 금지
cCsvRow(const cCsvRow&) {}
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
/// \brief 대입 연산자 금지
const cCsvRow& operator = (const cCsvRow&) { return *this; }
};
////////////////////////////////////////////////////////////////////////////////
/// \class cCsvFile
/// \brief CSV(Comma Seperated Values) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> read/write<EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD>
/// \brief CSV(Comma Seperated Values) 파일을 read/write하기 위한 클래스
///
/// <b>sample</b>
/// <pre>
@ -179,8 +179,8 @@ private:
/// file.save("test.csv", false);
/// </pre>
///
/// \todo <EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ƴ϶<C6B4>, <20>޸<EFBFBD><DEB8><EFBFBD> <20>ҽ<EFBFBD><D2BD>κ<EFBFBD><CEBA><EFBFBD> <20>д<EFBFBD> <20>Լ<EFBFBD><D4BC><EFBFBD>
/// <EFBFBD>־<EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20>ϴ<EFBFBD>.
/// \todo 파일에서만 읽어들일 것이 아니라, 메모리 소스로부터 읽는 함수도
/// 있어야 할 듯 하다.
////////////////////////////////////////////////////////////////////////////////
class cCsvFile
@ -188,55 +188,55 @@ class cCsvFile
private:
typedef std::vector<cCsvRow*> ROWS;
ROWS m_Rows; ///< <EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD>
ROWS m_Rows; ///< 행 컬렉션
public:
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// \brief 생성자
cCsvFile() {}
/// \brief <EFBFBD>Ҹ<EFBFBD><EFBFBD><EFBFBD>
/// \brief 소멸자
virtual ~cCsvFile() { Destroy(); }
public:
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> CSV <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5>Ѵ<EFBFBD>.
/// \brief 지정된 이름의 CSV 파일을 로드한다.
bool Load(const char* fileName, const char seperator=',', const char quote='"');
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CSV <20><><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
/// \brief 가지고 있는 내용을 CSV 파일에다 저장한다.
bool Save(const char* fileName, bool append=false, char seperator=',', char quote='"') const;
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20>޸𸮿<DEB8><F0B8AEBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
/// \brief 모든 데이터를 메모리에서 삭제한다.
void Destroy();
/// \brief <EFBFBD>ش<EFBFBD><EFBFBD>ϴ<EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 해당하는 인덱스의 행을 반환한다.
cCsvRow* operator [] (size_t index);
/// \brief <EFBFBD>ش<EFBFBD><EFBFBD>ϴ<EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 해당하는 인덱스의 행을 반환한다.
const cCsvRow* operator [] (size_t index) const;
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 행의 갯수를 반환한다.
size_t GetRowCount() const { return m_Rows.size(); }
private:
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
/// \brief 복사 생성자 금지
cCsvFile(const cCsvFile&) {}
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
/// \brief 대입 연산자 금지
const cCsvFile& operator = (const cCsvFile&) { return *this; }
};
////////////////////////////////////////////////////////////////////////////////
/// \class cCsvTable
/// \brief CSV <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> <20><><EFBFBD>̺<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20>ε<EFBFBD><CEB5>ϴ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// <EFBFBD><EFBFBD> <20>۾<EFBFBD><DBBE><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD> <20>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ƿ<EFBFBD><C6BF>Ƽ Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
/// \brief CSV 파일을 이용해 테이블 데이터를 로드하는 경우가 많은데, 이 클래스는
/// 그 작업을 좀 더 쉽게 하기 위해 만든 유틸리티 클래스다.
///
/// CSV <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD>ڸ<EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> <20><><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD><EFBFBD>ؾ<EFBFBD> <20>ϴµ<CFB4>, CSV
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. <20><> <20>۾<EFBFBD><DBBE><EFBFBD> <20><>
/// <EFBFBD>Ű<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD>ٰ<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߻<EFBFBD><DFBB>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD>. <20>׷<EFBFBD><D7B7>Ƿ<EFBFBD> <20><><EFBFBD>ڷ<EFBFBD>
/// <EFBFBD>׼<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD>ٴ<EFBFBD> <20><><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ٰ<EFBFBD> <20><> <20><> <20>ִ<EFBFBD>.
/// CSV 파일을 로드하는 경우, 숫자를 이용해 셀을 액세스해야 하는데, CSV
/// 파일의 포맷이 바뀌는 경우, 이 숫자들을 변경해줘야한다. 이 작업이 꽤
/// 신경 집중을 요구하는 데다가, 에러가 발생하기 쉽다. 그러므로 숫자로
/// 액세스하기보다는 문자열로 액세스하는 것이 약간 느리지만 낫다고 할 수 있다.
///
/// <b>sample</b>
/// <pre>
@ -259,63 +259,63 @@ private:
class cCsvTable
{
public :
cCsvFile m_File; ///< CSV <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ü
cCsvFile m_File; ///< CSV 파일 객체
private:
cCsvAlias m_Alias; ///< <EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD><EFBFBD><EFBFBD> <20><> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ü
int m_CurRow; ///< <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ⱦ<><C8BE> <20><><EFBFBD><EFBFBD> <20><> <20><>ȣ
cCsvAlias m_Alias; ///< 문자열을 셀 인덱스로 변환하기 위한 객체
int m_CurRow; ///< 현재 횡단 중인 행 번호
public:
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// \brief 생성자
cCsvTable();
/// \brief <EFBFBD>Ҹ<EFBFBD><EFBFBD><EFBFBD>
/// \brief 소멸자
virtual ~cCsvTable();
public:
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> CSV <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5>Ѵ<EFBFBD>.
/// \brief 지정된 이름의 CSV 파일을 로드한다.
bool Load(const char* fileName, const char seperator=',', const char quote='"');
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD> <20><>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
/// \brief 셀을 액세스할 때, 숫자 대신 사용할 이름을 등록한다.
void AddAlias(const char* name, size_t index) { m_Alias.AddAlias(name, index); }
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѿ<D1BE><EEB0A3>.
/// \brief 다음 행으로 넘어간다.
bool Next();
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>ڸ<EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 현재 행의 셀 숫자를 반환한다.
size_t ColCount() const;
/// \brief <EFBFBD>ε<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> int <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 인덱스를 이용해 int 형으로 셀값을 반환한다.
int AsInt(size_t index) const;
/// \brief <EFBFBD>ε<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 인덱스를 이용해 double 형으로 셀값을 반환한다.
double AsDouble(size_t index) const;
/// \brief <EFBFBD>ε<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> std::string <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 인덱스를 이용해 std::string 형으로 셀값을 반환한다.
const char* AsStringByIndex(size_t index) const;
/// \brief <EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> int <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 셀 이름을 이용해 int 형으로 셀값을 반환한다.
int AsInt(const char* name) const { return AsInt(m_Alias[name]); }
/// \brief <EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 셀 이름을 이용해 double 형으로 셀값을 반환한다.
double AsDouble(const char* name) const { return AsDouble(m_Alias[name]); }
/// \brief <EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD> std::string <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 셀 이름을 이용해 std::string 형으로 셀값을 반환한다.
const char* AsString(const char* name) const { return AsStringByIndex(m_Alias[name]); }
/// \brief alias<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
/// \brief alias를 포함해 모든 데이터를 삭제한다.
void Destroy();
private:
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>.
/// \brief 현재 행을 반환한다.
const cCsvRow* const CurRow() const;
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
/// \brief 복사 생성자 금지
cCsvTable(const cCsvTable&) {}
/// \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
/// \brief 대입 연산자 금지
const cCsvTable& operator = (const cCsvTable&) { return *this; }
};

View File

@ -98,7 +98,7 @@ int CDBManager::Connect(int iSlot, const char * db_address, const int db_port, c
if (iSlot < 0 || iSlot >= SQL_MAX_NUM)
return false;
sys_log(0, "CREATING DIRECT_SQL");
SPDLOG_INFO("CREATING DIRECT_SQL");
m_directSQL[iSlot] = new CAsyncSQL2;
if (!m_directSQL[iSlot]->Setup(db_address, user, pwd, db_name, g_stLocale.c_str(), true, db_port))
{
@ -107,7 +107,7 @@ int CDBManager::Connect(int iSlot, const char * db_address, const int db_port, c
}
sys_log(0, "CREATING MAIN_SQL");
SPDLOG_INFO("CREATING MAIN_SQL");
m_mainSQL[iSlot] = new CAsyncSQL2;
if (!m_mainSQL[iSlot]->Setup(db_address, user, pwd, db_name, g_stLocale.c_str(), false, db_port))
{
@ -115,7 +115,7 @@ int CDBManager::Connect(int iSlot, const char * db_address, const int db_port, c
return false;
}
sys_log(0, "CREATING ASYNC_SQL");
SPDLOG_INFO("CREATING ASYNC_SQL");
m_asyncSQL[iSlot] = new CAsyncSQL2;
if (!m_asyncSQL[iSlot]->Setup(db_address, user, pwd, db_name, g_stLocale.c_str(), false, db_port))
{
@ -137,7 +137,7 @@ extern int g_query_count[2];
void CDBManager::ReturnQuery(const char * c_pszQuery, int iType, IDENT dwIdent, void * udata, int iSlot)
{
assert(iSlot < SQL_MAX_NUM);
//sys_log(0, "ReturnQuery %s", c_pszQuery);
//SPDLOG_DEBUG("ReturnQuery {}", c_pszQuery);
CQueryInfo * p = new CQueryInfo;
p->iType = iType;
@ -166,14 +166,14 @@ unsigned int CDBManager::EscapeString(void *to, const void *from, unsigned int l
void CDBManager::SetLocale(const char * szLocale)
{
const std::string stLocale(szLocale);
sys_log(0, "SetLocale start" );
SPDLOG_DEBUG("SetLocale start");
for (int n = 0; n < SQL_MAX_NUM; ++n)
{
m_mainSQL[n]->SetLocale(stLocale);
m_directSQL[n]->SetLocale(stLocale);
m_asyncSQL[n]->SetLocale(stLocale);
}
sys_log(0, "End setlocale %s", szLocale);
SPDLOG_DEBUG("End setlocale {}", szLocale);
}
void CDBManager::QueryLocaleSet()

View File

@ -2,9 +2,9 @@
#ifndef __INC_METIN2_DB_DBMANAGER_H__
#define __INC_METIN2_DB_DBMANAGER_H__
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŀ<>ؼ<EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>... <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>޾ƿ<DEBE><C6BF><EFBFBD>
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϵ<EFBFBD><CFB5><EFBFBD> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>.
// <EFBFBD>ڵ<EFBFBD> by <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ķα׷<CEB1><D7B7><EFBFBD> <20>Ƴ<EFBFBD><C6B3><EFBFBD>~ = _=)b
// 디비 커넥션 클래스의 목적은... 디비에 접속해서 쿼리보내고 결과 받아오는
// 모든 일들을 처리한다.
// 코드 by 꼬붕 후로그래머 아노아~ = _=)b
#include <libsql/include/CAsyncSQL.h>
#define SQL_SAFE_LENGTH(size) (size * 2 + 1)
@ -23,7 +23,6 @@ enum eSQL_SLOT
SQL_PLAYER,
SQL_ACCOUNT,
SQL_COMMON,
SQL_HOTBACKUP,
SQL_MAX_NUM,
};

View File

@ -145,8 +145,8 @@ void CGuildManager::ParseResult(SQLResult * pRes)
str_to_number(r_info.gold, row[6]);
str_to_number(r_info.level, row[7]);
sys_log(0,
"GuildWar: %-24s ladder %-5d win %-3d draw %-3d loss %-3d",
SPDLOG_DEBUG(
"GuildWar: {:24} ladder {:<5} win {:<3} draw {:<3} loss {:<3}",
r_info.szName,
r_info.ladder_point,
r_info.win,
@ -170,17 +170,17 @@ void CGuildManager::Initialize()
*str = '\0';
if (!polyPower.Analyze(str))
sys_err("cannot set power poly: %s", str);
SPDLOG_ERROR("cannot set power poly: {}", str);
else
sys_log(0, "POWER_POLY: %s", str);
SPDLOG_DEBUG("POWER_POLY: {}", str);
if (!CConfig::instance().GetValue("POLY_HANDICAP", str, sizeof(str)))
*str = '\0';
if (!polyHandicap.Analyze(str))
sys_err("cannot set handicap poly: %s", str);
SPDLOG_ERROR("cannot set handicap poly: {}", str);
else
sys_log(0, "HANDICAP_POLY: %s", str);
SPDLOG_DEBUG("HANDICAP_POLY: {}", str);
QueryRanking();
}
@ -234,7 +234,7 @@ void CGuildManager::ResultRanking(MYSQL_RES * pRes)
if (iLadderPoint != iLastLadderPoint)
++iRank;
sys_log(0, "GUILD_RANK: %-24s %2d %d", row[1], iRank, iLadderPoint);
SPDLOG_DEBUG("GUILD_RANK: {:24} {:2} {}", row[1], iRank, iLadderPoint);
map_kLadderPointRankingByGID.insert(std::make_pair(dwGID, iRank));
}
@ -242,7 +242,7 @@ void CGuildManager::ResultRanking(MYSQL_RES * pRes)
void CGuildManager::Update()
{
ProcessReserveWar(); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3>
ProcessReserveWar(); // 예약 전쟁 처리
time_t now = CClientManager::instance().GetCurrentTime();
@ -250,7 +250,7 @@ void CGuildManager::Update()
{
// UNKNOWN_GUILD_MANAGE_UPDATE_LOG
/*
sys_log(0, "GuildManager::Update size %d now %d top %d, %s(%u) vs %s(%u)",
SPDLOG_DEBUG("GuildManager::Update size {} now {} top {}, {}({}) vs {}({})",
m_WarMap.size(),
now,
m_pqOnWar.top().first,
@ -307,7 +307,7 @@ void CGuildManager::Update()
p.dwGuildTo = ws.GID[1];
CClientManager::instance().ForwardPacket(HEADER_DG_GUILD_WAR, &p, sizeof(p));
sys_log(0, "GuildWar: GUILD sending start of wait start war %d %d", ws.GID[0], ws.GID[1]);
SPDLOG_DEBUG("GuildWar: GUILD sending start of wait start war {} {}", ws.GID[0], ws.GID[1]);
}
}
@ -402,7 +402,7 @@ bool CGuildManager::IsHalfWinLadderPoint(DWORD dwGuildWinner, DWORD dwGuildLoser
void CGuildManager::ProcessDraw(DWORD dwGuildID1, DWORD dwGuildID2)
{
sys_log(0, "GuildWar: \tThe war between %d and %d is ended in draw", dwGuildID1, dwGuildID2);
SPDLOG_DEBUG("GuildWar: \tThe war between {} and {} is ended in draw", dwGuildID1, dwGuildID2);
GuildWarDraw(dwGuildID1);
GuildWarDraw(dwGuildID2);
@ -416,7 +416,7 @@ void CGuildManager::ProcessWinLose(DWORD dwGuildWinner, DWORD dwGuildLoser)
{
GuildWarWin(dwGuildWinner);
GuildWarLose(dwGuildLoser);
sys_log(0, "GuildWar: \tWinner : %d Loser : %d", dwGuildWinner, dwGuildLoser);
SPDLOG_DEBUG("GuildWar: \tWinner : {} Loser : {}", dwGuildWinner, dwGuildLoser);
int iPoint = GetLadderPoint(dwGuildLoser);
int gain = (int)(iPoint * 0.05);
@ -425,7 +425,7 @@ void CGuildManager::ProcessWinLose(DWORD dwGuildWinner, DWORD dwGuildLoser)
if (IsHalfWinLadderPoint(dwGuildWinner, dwGuildLoser))
gain /= 2;
sys_log(0, "GuildWar: \tgain : %d loss : %d", gain, loss);
SPDLOG_DEBUG("GuildWar: \tgain : {} loss : {}", gain, loss);
ChangeLadderPoint(dwGuildWinner, gain);
ChangeLadderPoint(dwGuildLoser, -loss);
@ -435,7 +435,7 @@ void CGuildManager::ProcessWinLose(DWORD dwGuildWinner, DWORD dwGuildLoser)
void CGuildManager::RemoveWar(DWORD GID1, DWORD GID2)
{
sys_log(0, "GuildWar: RemoveWar(%d, %d)", GID1, GID2);
SPDLOG_DEBUG("GuildWar: RemoveWar({}, {})", GID1, GID2);
if (GID1 > GID2)
std::swap(GID2, GID1);
@ -462,20 +462,20 @@ void CGuildManager::RemoveWar(DWORD GID1, DWORD GID2)
}
//
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ʵ<EFBFBD><CAB5><EFBFBD> <20><><EFBFBD><EFBFBD>
// 길드전 비정상 종료 및 필드전 종료
//
void CGuildManager::WarEnd(DWORD GID1, DWORD GID2, bool bForceDraw)
{
if (GID1 > GID2)
std::swap(GID2, GID1);
sys_log(0, "GuildWar: WarEnd %d %d", GID1, GID2);
SPDLOG_DEBUG("GuildWar: WarEnd {} {}", GID1, GID2);
itertype(m_WarMap[GID1]) itWarMap = m_WarMap[GID1].find(GID2);
if (itWarMap == m_WarMap[GID1].end())
{
sys_err("GuildWar: war not exist or already ended. [1]");
SPDLOG_ERROR("GuildWar: war not exist or already ended. [1]");
return;
}
@ -484,7 +484,7 @@ void CGuildManager::WarEnd(DWORD GID1, DWORD GID2, bool bForceDraw)
if (!pData || pData->bEnd)
{
sys_err("GuildWar: war not exist or already ended. [2]");
SPDLOG_ERROR("GuildWar: war not exist or already ended. [2]");
return;
}
@ -493,7 +493,7 @@ void CGuildManager::WarEnd(DWORD GID1, DWORD GID2, bool bForceDraw)
bool bDraw = false;
if (!bForceDraw) // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ºΰ<C2BA> <20>ƴ<EFBFBD> <20><><EFBFBD><EFBFBD><ECBFA1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ<C3BC>Ѵ<EFBFBD>.
if (!bForceDraw) // 강제 무승부가 아닐 경우에는 점수를 체크한다.
{
if (pData->iScore[0] > pData->iScore[1])
{
@ -508,7 +508,7 @@ void CGuildManager::WarEnd(DWORD GID1, DWORD GID2, bool bForceDraw)
else
bDraw = true;
}
else // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>º<EFBFBD><C2BA><EFBFBD> <20><><EFBFBD><EFBFBD><ECBFA1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>º<EFBFBD>
else // 강제 무승부일 경우에는 무조건 무승부
bDraw = true;
if (bDraw)
@ -516,18 +516,18 @@ void CGuildManager::WarEnd(DWORD GID1, DWORD GID2, bool bForceDraw)
else
ProcessWinLose(win_guild, lose_guild);
// DB <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ֱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
// DB 서버에서 자체적으로 끝낼 때도 있기 때문에 따로 패킷을 보내줘야 한다.
CClientManager::instance().for_each_peer(FSendPeerWar(0, GUILD_WAR_END, GID1, GID2));
RemoveWar(GID1, GID2);
}
//
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// 길드전 정상 종료
//
void CGuildManager::RecvWarOver(DWORD dwGuildWinner, DWORD dwGuildLoser, bool bDraw, int lWarPrice)
{
sys_log(0, "GuildWar: RecvWarOver : winner %u vs %u draw? %d war_price %d", dwGuildWinner, dwGuildLoser, bDraw ? 1 : 0, lWarPrice);
SPDLOG_DEBUG("GuildWar: RecvWarOver : winner {} vs {} draw? {} war_price {}", dwGuildWinner, dwGuildLoser, bDraw ? 1 : 0, lWarPrice);
DWORD GID1 = dwGuildWinner;
DWORD GID2 = dwGuildLoser;
@ -570,13 +570,13 @@ void CGuildManager::RecvWarOver(DWORD dwGuildWinner, DWORD dwGuildLoser, bool bD
void CGuildManager::RecvWarEnd(DWORD GID1, DWORD GID2)
{
sys_log(0, "GuildWar: RecvWarEnded : %u vs %u", GID1, GID2);
WarEnd(GID1, GID2, true); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ѿ<EFBFBD> <20>Ѵ<EFBFBD>.
SPDLOG_DEBUG("GuildWar: RecvWarEnded : {} vs {}", GID1, GID2);
WarEnd(GID1, GID2, true); // 무조건 비정상 종료 시켜야 한다.
}
void CGuildManager::StartWar(BYTE bType, DWORD GID1, DWORD GID2, CGuildWarReserve * pkReserve)
{
sys_log(0, "GuildWar: StartWar(%d,%d,%d)", bType, GID1, GID2);
SPDLOG_DEBUG("GuildWar: StartWar({},{},{})", bType, GID1, GID2);
if (GID1 > GID2)
std::swap(GID1, GID2);
@ -610,7 +610,7 @@ void CGuildManager::UpdateScore(DWORD dwGainGID, DWORD dwOppGID, int iScoreDelta
if (!p || p->bEnd)
{
sys_err("GuildWar: war not exist or already ended.");
SPDLOG_ERROR("GuildWar: war not exist or already ended.");
return;
}
@ -634,7 +634,7 @@ void CGuildManager::UpdateScore(DWORD dwGainGID, DWORD dwOppGID, int iScoreDelta
iNewBetScore = p->iBetScore[1];
}
sys_log(0, "GuildWar: SendGuildWarScore guild %u wartype %u score_delta %d betscore_delta %d result %u, %u",
SPDLOG_DEBUG("GuildWar: SendGuildWarScore guild {} wartype {} score_delta {} betscore_delta {} result {}, {}",
dwGainGID, p->bType, iScoreDelta, iBetScoreDelta, iNewScore, iNewBetScore);
CClientManager::instance().for_each_peer(FSendGuildWarScore(dwGainGID, dwOppGID, iNewScore, iNewBetScore));
@ -648,7 +648,7 @@ void CGuildManager::AddDeclare(BYTE bType, DWORD guild_from, DWORD guild_to)
if (m_DeclareMap.find(di) == m_DeclareMap.end())
m_DeclareMap.insert(di);
sys_log(0, "GuildWar: AddDeclare(Type:%d,from:%d,to:%d)", bType, guild_from, guild_to);
SPDLOG_DEBUG("GuildWar: AddDeclare(Type:{},from:{},to:{})", bType, guild_from, guild_to);
}
void CGuildManager::RemoveDeclare(DWORD guild_from, DWORD guild_to)
@ -663,7 +663,7 @@ void CGuildManager::RemoveDeclare(DWORD guild_from, DWORD guild_to)
if (it != m_DeclareMap.end())
m_DeclareMap.erase(it);
sys_log(0, "GuildWar: RemoveDeclare(from:%d,to:%d)", guild_from, guild_to);
SPDLOG_DEBUG("GuildWar: RemoveDeclare(from:{},to:{})", guild_from, guild_to);
}
bool CGuildManager::TakeBetPrice(DWORD dwGuildTo, DWORD dwGuildFrom, int lWarPrice)
@ -673,14 +673,14 @@ bool CGuildManager::TakeBetPrice(DWORD dwGuildTo, DWORD dwGuildFrom, int lWarPri
if (it_from == m_map_kGuild.end() || it_to == m_map_kGuild.end())
{
sys_log(0, "TakeBetPrice: guild not exist %u %u",
SPDLOG_DEBUG("TakeBetPrice: guild not exist {} {}",
dwGuildFrom, dwGuildTo);
return false;
}
if (it_from->second.gold < lWarPrice || it_to->second.gold < lWarPrice)
{
sys_log(0, "TakeBetPrice: not enough gold %u %d to %u %d",
SPDLOG_DEBUG("TakeBetPrice: not enough gold {} {} to {} {}",
dwGuildFrom, it_from->second.gold, dwGuildTo, it_to->second.gold);
return false;
}
@ -704,8 +704,8 @@ bool CGuildManager::WaitStart(TPacketGuildWar * p)
TGuildWaitStartInfo info(p->bType, p->dwGuildFrom, p->dwGuildTo, p->lWarPrice, p->lInitialScore, NULL);
m_pqWaitStart.push(std::make_pair(dwCurTime + GetGuildWarWaitStartDuration(), info));
sys_log(0,
"GuildWar: WaitStart g1 %d g2 %d price %d start at %u",
SPDLOG_DEBUG(
"GuildWar: WaitStart g1 {} g2 {} price {} start at {}",
p->dwGuildFrom,
p->dwGuildTo,
p->lWarPrice,
@ -742,10 +742,10 @@ void CGuildManager::ChangeLadderPoint(DWORD GID, int change)
snprintf(buf, sizeof(buf), "UPDATE guild%s SET ladder_point=%d WHERE id=%u", GetTablePostfix(), r.ladder_point, GID);
CDBManager::instance().AsyncQuery(buf);
sys_log(0, "GuildManager::ChangeLadderPoint %u %d", GID, r.ladder_point);
sys_log(0, "%s", buf);
SPDLOG_DEBUG("GuildManager::ChangeLadderPoint {} {}", GID, r.ladder_point);
SPDLOG_DEBUG("{}", buf);
// Packet <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Packet 보내기
TPacketGuildLadder p;
p.dwGuild = GID;
@ -760,14 +760,14 @@ void CGuildManager::ChangeLadderPoint(DWORD GID, int change)
void CGuildManager::UseSkill(DWORD GID, DWORD dwSkillVnum, DWORD dwCooltime)
{
// GUILD_SKILL_COOLTIME_BUG_FIX
sys_log(0, "UseSkill(gid=%d, skill=%d) CoolTime(%d:%d)", GID, dwSkillVnum, dwCooltime, CClientManager::instance().GetCurrentTime() + dwCooltime);
SPDLOG_DEBUG("UseSkill(gid={}, skill={}) CoolTime({}:{})", GID, dwSkillVnum, dwCooltime, CClientManager::instance().GetCurrentTime() + dwCooltime);
m_pqSkill.push(std::make_pair(CClientManager::instance().GetCurrentTime() + dwCooltime, TGuildSkillUsed(GID, dwSkillVnum)));
// END_OF_GUILD_SKILL_COOLTIME_BUG_FIX
}
void CGuildManager::MoneyChange(DWORD dwGuild, DWORD dwGold)
{
sys_log(0, "GuildManager::MoneyChange %d %d", dwGuild, dwGold);
SPDLOG_DEBUG("GuildManager::MoneyChange {} {}", dwGuild, dwGold);
TPacketDGGuildMoneyChange p;
p.dwGuild = dwGuild;
@ -788,12 +788,12 @@ void CGuildManager::DepositMoney(DWORD dwGuild, INT iGold)
if (it == m_map_kGuild.end())
{
sys_err("No guild by id %u", dwGuild);
SPDLOG_ERROR("No guild by id {}", dwGuild);
return;
}
it->second.gold += iGold;
sys_log(0, "GUILD: %u Deposit %u Total %d", dwGuild, iGold, it->second.gold);
SPDLOG_DEBUG("GUILD: {} Deposit {} Total {}", dwGuild, iGold, it->second.gold);
MoneyChange(dwGuild, it->second.gold);
}
@ -804,15 +804,15 @@ void CGuildManager::WithdrawMoney(CPeer* peer, DWORD dwGuild, INT iGold)
if (it == m_map_kGuild.end())
{
sys_err("No guild by id %u", dwGuild);
SPDLOG_ERROR("No guild by id {}", dwGuild);
return;
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>÷<EFBFBD><C3B7>ش<EFBFBD>
// 돈이있으니 출금하고 올려준다
if (it->second.gold >= iGold)
{
it->second.gold -= iGold;
sys_log(0, "GUILD: %u Withdraw %d Total %d", dwGuild, iGold, it->second.gold);
SPDLOG_DEBUG("GUILD: {} Withdraw {} Total {}", dwGuild, iGold, it->second.gold);
TPacketDGGuildMoneyWithdraw p;
p.dwGuild = dwGuild;
@ -830,7 +830,7 @@ void CGuildManager::WithdrawMoneyReply(DWORD dwGuild, BYTE bGiveSuccess, INT iGo
if (it == m_map_kGuild.end())
return;
sys_log(0, "GuildManager::WithdrawMoneyReply : guild %u success %d gold %d", dwGuild, bGiveSuccess, iGold);
SPDLOG_DEBUG("GuildManager::WithdrawMoneyReply : guild {} success {} gold {}", dwGuild, bGiveSuccess, iGold);
if (!bGiveSuccess)
it->second.gold += iGold;
@ -839,7 +839,7 @@ void CGuildManager::WithdrawMoneyReply(DWORD dwGuild, BYTE bGiveSuccess, INT iGo
}
//
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD>)
// 예약 길드전(관전자가 배팅할 수 있다)
//
const int c_aiScoreByLevel[GUILD_MAX_LEVEL+1] =
{
@ -869,7 +869,7 @@ const int c_aiScoreByLevel[GUILD_MAX_LEVEL+1] =
const int c_aiScoreByRanking[GUILD_RANK_MAX_NUM+1] =
{
0,
55000, // 1<EFBFBD><EFBFBD>
55000, // 1
50000,
45000,
40000,
@ -878,7 +878,7 @@ const int c_aiScoreByRanking[GUILD_RANK_MAX_NUM+1] =
28000,
24000,
21000,
18000, // 10<EFBFBD><EFBFBD>
18000, // 10
15000,
12000,
10000,
@ -888,7 +888,7 @@ const int c_aiScoreByRanking[GUILD_RANK_MAX_NUM+1] =
3000,
2000,
1000,
500 // 20<EFBFBD><EFBFBD>
500 // 20
};
void CGuildManager::BootReserveWar()
@ -932,22 +932,22 @@ void CGuildManager::BootReserveWar()
char buf[512];
snprintf(buf, sizeof(buf), "GuildWar: BootReserveWar : step %d id %u GID1 %u GID2 %u", i, t.dwID, t.dwGuildFrom, t.dwGuildTo);
// i == 0 <EFBFBD≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> DB<44><42> ƨ<><C6A8> <20><><EFBFBD>̹Ƿ<CCB9> <20><><EFBFBD>º<EFBFBD> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>.
// <EFBFBD>Ǵ<EFBFBD>, 5<><35> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>º<EFBFBD> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>. (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>þ<EFBFBD><C3BE><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>)
// i == 0 이면 길드전 도중 DB가 튕긴 것이므로 무승부 처리한다.
// 또는, 5분 이하 남은 예약 길드전도 무승부 처리한다. (각자의 배팅액을 돌려준다)
//if (i == 0 || (int) t.dwTime - CClientManager::instance().GetCurrentTime() < 60 * 5)
if (i == 0 || (int) t.dwTime - CClientManager::instance().GetCurrentTime() < 0)
{
if (i == 0)
sys_log(0, "%s : DB was shutdowned while war is being.", buf);
SPDLOG_DEBUG("{} : DB was shutdowned while war is being.", buf);
else
sys_log(0, "%s : left time lower than 5 minutes, will be canceled", buf);
SPDLOG_DEBUG("{} : left time lower than 5 minutes, will be canceled", buf);
pkReserve->Draw();
delete pkReserve;
}
else
{
sys_log(0, "%s : OK", buf);
SPDLOG_DEBUG("{} : OK", buf);
m_map_kWarReserve.insert(std::make_pair(t.dwID, pkReserve));
}
}
@ -1010,7 +1010,7 @@ bool CGuildManager::ReserveWar(TPacketGuildWar * p)
int lvp, rkp, alv, mc;
// <EFBFBD>Ŀ<EFBFBD> <20><><EFBFBD><EFBFBD>
// 파워 계산
TGuild & k1 = TouchGuild(GID1);
lvp = c_aiScoreByLevel[std::min<size_t>(GUILD_MAX_LEVEL, k1.level)];
@ -1024,9 +1024,9 @@ bool CGuildManager::ReserveWar(TPacketGuildWar * p)
polyPower.SetVar("mc", mc);
t.lPowerFrom = (int) polyPower.Eval();
sys_log(0, "GuildWar: %u lvp %d rkp %d alv %d mc %d power %d", GID1, lvp, rkp, alv, mc, t.lPowerFrom);
SPDLOG_DEBUG("GuildWar: {} lvp {} rkp {} alv {} mc {} power {}", GID1, lvp, rkp, alv, mc, t.lPowerFrom);
// <EFBFBD>Ŀ<EFBFBD> <20><><EFBFBD><EFBFBD>
// 파워 계산
TGuild & k2 = TouchGuild(GID2);
lvp = c_aiScoreByLevel[std::min<size_t>(GUILD_MAX_LEVEL, k2.level)];
@ -1040,9 +1040,9 @@ bool CGuildManager::ReserveWar(TPacketGuildWar * p)
polyPower.SetVar("mc", mc);
t.lPowerTo = (int) polyPower.Eval();
sys_log(0, "GuildWar: %u lvp %d rkp %d alv %d mc %d power %d", GID2, lvp, rkp, alv, mc, t.lPowerTo);
SPDLOG_DEBUG("GuildWar: {} lvp {} rkp {} alv {} mc {} power {}", GID2, lvp, rkp, alv, mc, t.lPowerTo);
// <EFBFBD>ڵ<EFBFBD>ĸ <20><><EFBFBD><EFBFBD>
// 핸디캡 계산
if (t.lPowerTo > t.lPowerFrom)
{
polyHandicap.SetVar("pA", t.lPowerTo);
@ -1055,9 +1055,9 @@ bool CGuildManager::ReserveWar(TPacketGuildWar * p)
}
t.lHandicap = (int) polyHandicap.Eval();
sys_log(0, "GuildWar: handicap %d", t.lHandicap);
SPDLOG_DEBUG("GuildWar: handicap {}", t.lHandicap);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 쿼리
char szQuery[512];
snprintf(szQuery, sizeof(szQuery),
@ -1069,7 +1069,7 @@ bool CGuildManager::ReserveWar(TPacketGuildWar * p)
if (pmsg->Get()->uiAffectedRows == 0 || pmsg->Get()->uiInsertID == 0 || pmsg->Get()->uiAffectedRows == (uint32_t)-1)
{
sys_err("GuildWar: Cannot insert row");
SPDLOG_ERROR("GuildWar: Cannot insert row");
return false;
}
@ -1094,14 +1094,14 @@ void CGuildManager::ProcessReserveWar()
CGuildWarReserve * pk = it2->second;
TGuildWarReserve & r = pk->GetDataRef();
if (!r.bStarted && r.dwTime - 1800 <= dwCurTime) // 30<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˸<EFBFBD><CBB8><EFBFBD>.
if (!r.bStarted && r.dwTime - 1800 <= dwCurTime) // 30분 전부터 알린다.
{
int iMin = (int) ceil((int)(r.dwTime - dwCurTime) / 60.0);
TGuild & r_1 = m_map_kGuild[r.dwGuildFrom];
TGuild & r_2 = m_map_kGuild[r.dwGuildTo];
sys_log(0, "GuildWar: started GID1 %u GID2 %u %d time %d min %d", r.dwGuildFrom, r.dwGuildTo, r.bStarted, dwCurTime - r.dwTime, iMin);
SPDLOG_DEBUG("GuildWar: started GID1 {} GID2 {} {} time {} min {}", r.dwGuildFrom, r.dwGuildTo, r.bStarted, dwCurTime - r.dwTime, iMin);
if (iMin <= 0)
{
@ -1135,9 +1135,9 @@ void CGuildManager::ProcessReserveWar()
pk->SetLastNoticeMin(iMin);
if (!g_stLocale.compare("euckr"))
CClientManager::instance().SendNotice("%s <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> %s <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> %d<><64> <20><> <20><><EFBFBD><EFBFBD> <20>˴ϴ<CBB4>!", r_1.szName, r_2.szName, iMin);
CClientManager::instance().SendNotice("The war between guild %s and guild %s will begin in approximately %d minutes!", r_1.szName, r_2.szName, iMin);
else if (!g_stLocale.compare("gb2312"))
CClientManager::instance().SendNotice("%s <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> %s <20><><EFBFBD><EFBFBD><EFBFBD>İ<EFBFBD><C4B0><EFBFBD>ս<EFBFBD><D5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> %d<><64><EFBFBD>Ӻ<EFBFBD><D3BA><EFBFBD>ʼ!", r_1.szName, r_2.szName, iMin);
CClientManager::instance().SendNotice("The war between guild %s and guild %s will begin in approximately %d minutes!", r_1.szName, r_2.szName, iMin);
}
}
}
@ -1152,7 +1152,7 @@ bool CGuildManager::Bet(DWORD dwID, const char * c_pszLogin, DWORD dwGold, DWORD
if (it == m_map_kWarReserve.end())
{
sys_log(0, "WAR_RESERVE: Bet: cannot find reserve war by id %u", dwID);
SPDLOG_DEBUG("WAR_RESERVE: Bet: cannot find reserve war by id {}", dwID);
snprintf(szQuery, sizeof(szQuery), "INSERT INTO item_award (login, vnum, socket0, given_time) VALUES('%s', %d, %u, NOW())",
c_pszLogin, ITEM_ELK_VNUM, dwGold);
CDBManager::instance().AsyncQuery(szQuery);
@ -1161,7 +1161,7 @@ bool CGuildManager::Bet(DWORD dwID, const char * c_pszLogin, DWORD dwGold, DWORD
if (!it->second->Bet(c_pszLogin, dwGold, dwGuild))
{
sys_log(0, "WAR_RESERVE: Bet: cannot bet id %u, login %s, gold %u, guild %u", dwID, c_pszLogin, dwGold, dwGuild);
SPDLOG_DEBUG("WAR_RESERVE: Bet: cannot bet id {}, login {}, gold {}, guild {}", dwID, c_pszLogin, dwGold, dwGuild);
snprintf(szQuery, sizeof(szQuery), "INSERT INTO item_award (login, vnum, socket0, given_time) VALUES('%s', %d, %u, NOW())",
c_pszLogin, ITEM_ELK_VNUM, dwGold);
CDBManager::instance().AsyncQuery(szQuery);
@ -1239,7 +1239,7 @@ void CGuildWarReserve::Initialize()
void CGuildWarReserve::OnSetup(CPeer * peer)
{
if (m_data.bStarted) // <EFBFBD>̹<EFBFBD> <20><><EFBFBD>۵<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
if (m_data.bStarted) // 이미 시작된 것은 보내지 않는다.
return;
FSendPeerWar(m_data.bType, GUILD_WAR_RESERVE, m_data.dwGuildFrom, m_data.dwGuildTo) (peer);
@ -1271,19 +1271,19 @@ bool CGuildWarReserve::Bet(const char * pszLogin, DWORD dwGold, DWORD dwGuild)
if (m_data.dwGuildFrom != dwGuild && m_data.dwGuildTo != dwGuild)
{
sys_log(0, "GuildWarReserve::Bet: invalid guild id");
SPDLOG_DEBUG("GuildWarReserve::Bet: invalid guild id");
return false;
}
if (m_data.bStarted)
{
sys_log(0, "GuildWarReserve::Bet: war is already started");
SPDLOG_DEBUG("GuildWarReserve::Bet: war is already started");
return false;
}
if (mapBet.find(pszLogin) != mapBet.end())
{
sys_log(0, "GuildWarReserve::Bet: failed. already bet");
SPDLOG_DEBUG("GuildWarReserve::Bet: failed. already bet");
return false;
}
@ -1295,7 +1295,7 @@ bool CGuildWarReserve::Bet(const char * pszLogin, DWORD dwGold, DWORD dwGuild)
if (pmsg->Get()->uiAffectedRows == 0 || pmsg->Get()->uiAffectedRows == (uint32_t)-1)
{
sys_log(0, "GuildWarReserve::Bet: failed. cannot insert row to guild_war_bet table");
SPDLOG_DEBUG("GuildWarReserve::Bet: failed. cannot insert row to guild_war_bet table");
return false;
}
@ -1311,7 +1311,7 @@ bool CGuildWarReserve::Bet(const char * pszLogin, DWORD dwGold, DWORD dwGuild)
CDBManager::instance().AsyncQuery(szQuery);
sys_log(0, "GuildWarReserve::Bet: success. %s %u war_id %u bet %u : %u", pszLogin, dwGuild, m_data.dwID, m_data.dwBetFrom, m_data.dwBetTo);
SPDLOG_DEBUG("GuildWarReserve::Bet: success. {} {} war_id {} bet {} : {}", pszLogin, dwGuild, m_data.dwID, m_data.dwBetFrom, m_data.dwBetTo);
mapBet.insert(std::make_pair(pszLogin, std::make_pair(dwGuild, dwGold)));
TPacketGDGuildWarBet pckBet;
@ -1325,8 +1325,8 @@ bool CGuildWarReserve::Bet(const char * pszLogin, DWORD dwGold, DWORD dwGuild)
}
//
// <EFBFBD><EFBFBD><EFBFBD>º<EFBFBD> ó<><C3B3>: <20><><EFBFBD>κ<EFBFBD> <20>ºΰ<C2BA> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> Ư<><C6AF> <20><>Ȳ<EFBFBD><C8B2> <20><><EFBFBD><EFBFBD><ECBFA1>
// <EFBFBD><EFBFBD><EFBFBD>º<EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD> <20>Ѵ<EFBFBD>.
// 무승부 처리: 대부분 승부가 나야 정상이지만, 서버 문제 등 특정 상황일 경우에는
// 무승부 처리가 있어야 한다.
//
void CGuildWarReserve::Draw()
{
@ -1338,7 +1338,7 @@ void CGuildWarReserve::Draw()
if (mapBet.empty())
return;
sys_log(0, "WAR_REWARD: Draw. war_id %u", m_data.dwID);
SPDLOG_DEBUG("WAR_REWARD: Draw. war_id {}", m_data.dwID);
itertype(mapBet) it = mapBet.begin();
@ -1368,7 +1368,7 @@ void CGuildWarReserve::Draw()
if (iRow > 0)
{
sys_log(0, "WAR_REWARD: QUERY: %s", szQuery);
SPDLOG_DEBUG("WAR_REWARD: QUERY: {}", szQuery);
CDBManager::instance().AsyncQuery(szQuery);
}
@ -1381,18 +1381,18 @@ void CGuildWarReserve::End(int iScoreFrom, int iScoreTo)
{
DWORD dwWinner;
sys_log(0, "WAR_REWARD: End: From %u %d To %u %d", m_data.dwGuildFrom, iScoreFrom, m_data.dwGuildTo, iScoreTo);
SPDLOG_DEBUG("WAR_REWARD: End: From {} {} To {} {}", m_data.dwGuildFrom, iScoreFrom, m_data.dwGuildTo, iScoreTo);
if (m_data.lPowerFrom > m_data.lPowerTo)
{
if (m_data.lHandicap > iScoreFrom - iScoreTo)
{
sys_log(0, "WAR_REWARD: End: failed to overcome handicap, From is strong but To won");
SPDLOG_DEBUG("WAR_REWARD: End: failed to overcome handicap, From is strong but To won");
dwWinner = m_data.dwGuildTo;
}
else
{
sys_log(0, "WAR_REWARD: End: success to overcome handicap, From win!");
SPDLOG_DEBUG("WAR_REWARD: End: success to overcome handicap, From win!");
dwWinner = m_data.dwGuildFrom;
}
}
@ -1400,12 +1400,12 @@ void CGuildWarReserve::End(int iScoreFrom, int iScoreTo)
{
if (m_data.lHandicap > iScoreTo - iScoreFrom)
{
sys_log(0, "WAR_REWARD: End: failed to overcome handicap, To is strong but From won");
SPDLOG_DEBUG("WAR_REWARD: End: failed to overcome handicap, To is strong but From won");
dwWinner = m_data.dwGuildFrom;
}
else
{
sys_log(0, "WAR_REWARD: End: success to overcome handicap, To win!");
SPDLOG_DEBUG("WAR_REWARD: End: success to overcome handicap, To win!");
dwWinner = m_data.dwGuildTo;
}
}
@ -1427,17 +1427,17 @@ void CGuildWarReserve::End(int iScoreFrom, int iScoreTo)
dwWinnerBet = m_data.dwBetTo;
else
{
sys_err("WAR_REWARD: fatal error, winner does not exist!");
SPDLOG_ERROR("WAR_REWARD: fatal error, winner does not exist!");
return;
}
if (dwWinnerBet == 0)
{
sys_err("WAR_REWARD: total bet money on winner is zero");
SPDLOG_ERROR("WAR_REWARD: total bet money on winner is zero");
return;
}
sys_log(0, "WAR_REWARD: End: Total bet: %u, Winner bet: %u", dwTotalBet, dwWinnerBet);
SPDLOG_DEBUG("WAR_REWARD: End: Total bet: {}, Winner bet: {}", dwTotalBet, dwWinnerBet);
itertype(mapBet) it = mapBet.begin();
@ -1458,8 +1458,8 @@ void CGuildWarReserve::End(int iScoreFrom, int iScoreTo)
double ratio = (double) it->second.second / dwWinnerBet;
// 10% <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>й<EFBFBD>
sys_log(0, "WAR_REWARD: %s %u ratio %f", it->first.c_str(), it->second.second, ratio);
// 10% 세금 공제 후 분배
SPDLOG_DEBUG("WAR_REWARD: {} {} ratio {}", it->first.c_str(), it->second.second, ratio);
DWORD dwGold = (DWORD) (dwTotalBet * ratio * 0.9);
@ -1480,7 +1480,7 @@ void CGuildWarReserve::End(int iScoreFrom, int iScoreTo)
if (iRow > 0)
{
sys_log(0, "WAR_REWARD: query: %s", szQuery);
SPDLOG_DEBUG("WAR_REWARD: query: {}", szQuery);
CDBManager::instance().AsyncQuery(szQuery);
}

View File

@ -150,7 +150,7 @@ class CGuildWarReserve
void SetLastNoticeMin(int iMin) { m_iLastNoticeMin = iMin; }
private:
CGuildWarReserve(); // <EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> <20>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
CGuildWarReserve(); // 기본 생성자를 사용하지 못하도록 의도적으로 구현하지 않음
TGuildWarReserve m_data;
// <login, <guild, gold>>
@ -235,7 +235,7 @@ class CGuildManager : public singleton<CGuildManager>
std::map<DWORD, TGuild> m_map_kGuild;
std::map<DWORD, std::map<DWORD, time_t> > m_mapGuildWarEndTime;
std::set<TGuildDeclareInfo> m_DeclareMap; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>¸<EFBFBD> <20><><EFBFBD><EFBFBD>
std::set<TGuildDeclareInfo> m_DeclareMap; // 선전 포고 상태를 저장
std::map<DWORD, std::map<DWORD, TGuildWarInfo> > m_WarMap;
typedef std::pair<time_t, TGuildWarPQElement *> stPairGuildWar;

View File

@ -1,86 +0,0 @@
#include "stdafx.h"
#include "HB.h"
#include "Main.h"
#include "DBManager.h"
#include <memory>
PlayerHB::PlayerHB()
{
m_iExpireTime = 3600; // 1 hour hotbackup default.
}
PlayerHB::~PlayerHB()
{
}
bool PlayerHB::Initialize()
{
char szQuery[128];
snprintf(szQuery, sizeof(szQuery), "SHOW CREATE TABLE player%s", GetTablePostfix());
std::unique_ptr<SQLMsg> pMsg(CDBManager::instance().DirectQuery(szQuery));
if (pMsg->Get()->uiNumRows == 0)
return false;
MYSQL_ROW row = mysql_fetch_row(pMsg->Get()->pSQLResult);
m_stCreateTableQuery = row[1];
return true;
}
//
// @version 05/07/05 Bang2ni - id <20><> <20>ش<EFBFBD><D8B4>ϴ<EFBFBD> data <20><> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> data <20><> insert <20>ϴ<EFBFBD><CFB4>ڵ<EFBFBD> <20>߰<EFBFBD>.
//
void PlayerHB::Put(DWORD id)
{
itertype(m_map_data) it = m_map_data.find(id);
if (it == m_map_data.end())
{
Query(id);
m_map_data.insert(std::pair< DWORD, time_t >(id, get_dword_time()));
return;
}
if (time(0) - it->second > m_iExpireTime)
Query(id);
}
//
// @version 05/07/05 Bang2ni - Query string <20><><EFBFBD>۰<EFBFBD> <20>۾Ƽ<DBBE> <20>÷<EFBFBD><C3B7><EFBFBD>.
//
bool PlayerHB::Query(DWORD id)
{
time_t ct = time(0);
struct tm curr_tm = *localtime(&ct);
char szTableName[64];
snprintf(szTableName, sizeof(szTableName), "hb_%02d%02d%02d%02d_player%s",
curr_tm.tm_year - 100, curr_tm.tm_mon + 1, curr_tm.tm_mday, curr_tm.tm_hour, GetTablePostfix());
char szQuery[4096];
if (m_stTableName.compare(szTableName))
{
char szFind[32];
snprintf(szFind, sizeof(szFind), "CREATE TABLE `player%s`", GetTablePostfix());
int pos = m_stCreateTableQuery.find(szFind);
if (pos < 0)
{
sys_err("cannot find %s ", szFind);
// sys_err("cannot find %s in %s", szFind, m_stCreateTableQuery.c_str());
return false;
}
snprintf(szQuery, sizeof(szQuery), "CREATE TABLE IF NOT EXISTS %s%s", szTableName, m_stCreateTableQuery.c_str() + strlen(szFind));
// sys_log(0, "%s", szQuery);
std::unique_ptr<SQLMsg> pMsg(CDBManager::instance().DirectQuery(szQuery, SQL_HOTBACKUP));
m_stTableName = szTableName;
}
snprintf(szQuery, sizeof(szQuery), "REPLACE INTO %s SELECT * FROM %splayer%s WHERE id=%u", m_stTableName.c_str(), GetPlayerDBName(), GetTablePostfix(), id);
CDBManager::instance().AsyncQuery(szQuery, SQL_HOTBACKUP);
return true;
}

View File

@ -1,24 +0,0 @@
// vim:ts=8 sw=4
#ifndef __INC_METIN_II_PLAYERHB_H__
#define __INC_METIN_II_PLAYERHB_H__
class PlayerHB : public singleton<PlayerHB>
{
public:
PlayerHB();
virtual ~PlayerHB();
bool Initialize();
void Put(DWORD id);
private:
bool Query(DWORD id);
std::map<DWORD, time_t> m_map_data;
std::string m_stCreateTableQuery;
std::string m_stTableName;
int m_iExpireTime;
};
#endif

View File

@ -54,19 +54,19 @@ void ItemAwardManager::Load(SQLMsg * pMsg)
if (row[col])
{
strlcpy(kData->szWhy, row[col], sizeof(kData->szWhy));
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߿<EFBFBD> why<68>ݷ뿡 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
char* whyStr = kData->szWhy; //why <EFBFBD>ݷ<EFBFBD> <20>б<EFBFBD>
char cmdStr[100] = ""; //why<EFBFBD>ݷ뿡<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ӽ<EFBFBD> <20><><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>
strcpy(cmdStr,whyStr); //<EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ū<EFBFBD><C5AB><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ūȭ <20>DZ<EFBFBD> <20><><EFBFBD><EFBFBD>
//게임 중에 why콜룸에 변동이 생기면
char* whyStr = kData->szWhy; //why 콜룸 읽기
char cmdStr[100] = ""; //why콜룸에서 읽은 값을 임시 문자열에 복사해둠
strcpy(cmdStr,whyStr); //명령어 얻는 과정에서 토큰쓰면 원본도 토큰화 되기 때문
char command[20] = "";
strcpy(command,CClientManager::instance().GetCommand(cmdStr).c_str()); // command <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//sys_err("%d, %s",pItemAward->dwID,command);
if( !(strcmp(command,"GIFT") )) // command <EFBFBD><EFBFBD> GIFT<EFBFBD≯<EFBFBD>
strcpy(command,CClientManager::instance().GetCommand(cmdStr).c_str()); // command 얻기
//SPDLOG_ERROR("{}, {}",pItemAward->dwID,command);
if( !(strcmp(command,"GIFT") )) // command GIFT이면
{
TPacketItemAwardInfromer giftData;
strcpy(giftData.login, kData->szLogin); //<EFBFBD>α<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̵<EFBFBD> <20><><EFBFBD><EFBFBD>
strcpy(giftData.command, command); //<EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD> <20><><EFBFBD><EFBFBD>
giftData.vnum = kData->dwVnum; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> vnum<75><6D> <20><><EFBFBD><EFBFBD>
strcpy(giftData.login, kData->szLogin); //로그인 아이디 복사
strcpy(giftData.command, command); //명령어 복사
giftData.vnum = kData->dwVnum; //아이템 vnum도 복사
CClientManager::instance().ForwardPacket(HEADER_DG_ITEMAWARD_INFORMER,&giftData,sizeof(TPacketItemAwardInfromer));
}
}
@ -74,7 +74,7 @@ void ItemAwardManager::Load(SQLMsg * pMsg)
m_map_award.insert(std::make_pair(dwID, kData));
printf("ITEM_AWARD load id %u bMall %d \n", kData->dwID, kData->bMall);
sys_log(0, "ITEM_AWARD: load id %lu login %s vnum %lu count %u socket %lu", kData->dwID, kData->szLogin, kData->dwVnum, kData->dwCount, kData->dwSocket0);
SPDLOG_DEBUG("ITEM_AWARD: load id {} login {} vnum {} count {} socket {}", kData->dwID, kData->szLogin, kData->dwVnum, kData->dwCount, kData->dwSocket0);
std::set<TItemAward *> & kSet = m_map_kSetAwardByLogin[kData->szLogin];
kSet.insert(kData);
@ -99,7 +99,7 @@ void ItemAwardManager::Taken(DWORD dwAwardID, DWORD dwItemID)
if (it == m_map_award.end())
{
sys_log(0, "ITEM_AWARD: Taken ID not exist %lu", dwAwardID);
SPDLOG_DEBUG("ITEM_AWARD: Taken ID not exist {}", dwAwardID);
return;
}

View File

@ -79,7 +79,7 @@ TItemIDRangeTable CItemIDRangeManager::GetRange()
}
for (int i = 0; i < 10; ++i)
sys_err("ItemIDRange: NO MORE ITEM ID RANGE");
SPDLOG_ERROR("ItemIDRange: NO MORE ITEM ID RANGE");
return ret;
}
@ -112,7 +112,7 @@ bool CItemIDRangeManager::BuildRange(DWORD dwMin, DWORD dwMax, TItemIDRangeTable
if ((dwMax < dwItemMaxID) || (dwMax - dwItemMaxID < cs_dwMinimumRemainCount))
{
sys_log(0, "ItemIDRange: Build %u ~ %u start: %u\tNOT USE remain count is below %u",
SPDLOG_DEBUG("ItemIDRange: Build {} ~ {} start: {}\tNOT USE remain count is below {}",
dwMin, dwMax, dwItemMaxID, cs_dwMinimumRemainCount);
}
else
@ -136,12 +136,12 @@ bool CItemIDRangeManager::BuildRange(DWORD dwMin, DWORD dwMax, TItemIDRangeTable
if (count > 0)
{
sys_err("ItemIDRange: Build: %u ~ %u\thave a item", range.dwUsableItemIDMin, range.dwMax);
SPDLOG_ERROR("ItemIDRange: Build: {} ~ {}\thave a item", range.dwUsableItemIDMin, range.dwMax);
return false;
}
else
{
sys_log(0, "ItemIDRange: Build: %u ~ %u start:%u", range.dwMin, range.dwMax, range.dwUsableItemIDMin);
SPDLOG_TRACE("ItemIDRange: Build: {} ~ {} start:{}", range.dwMin, range.dwMax, range.dwUsableItemIDMin);
return true;
}
}

View File

@ -2,16 +2,18 @@
#ifndef __INC_METIN_II_ITEM_ID_RANGE_MANAGER_H__
#define __INC_METIN_II_ITEM_ID_RANGE_MANAGER_H__
namespace {
static const uint32_t cs_dwMaxItemID = 4290000000UL;
static const uint32_t cs_dwMinimumRange = 10000000UL;
static const uint32_t cs_dwMinimumRemainCount = 10000UL;
}
class CItemIDRangeManager : public singleton<CItemIDRangeManager>
{
private :
const static DWORD cs_dwMaxItemID = 4290000000UL;
const static DWORD cs_dwMinimumRange = 10000000UL;
const static DWORD cs_dwMinimumRemainCount = 10000UL;
private:
std::list<TItemIDRangeTable> m_listData;
public :
public:
CItemIDRangeManager();
void Build();

View File

@ -11,8 +11,6 @@ CLoginData::CLoginData()
memset(m_szIP, 0, sizeof(m_szIP));
m_bPlay = false;
m_bDeleted = false;
m_bBillType = 0;
m_dwBillID = 0;
m_lastPlayTime = 0;
m_dwLastPlayerID = 0;
@ -78,11 +76,11 @@ void CLoginData::SetPlay(bool bOn)
{
if (bOn)
{
sys_log(0, "SetPlay on %lu %s", GetKey(), m_data.login);
SPDLOG_DEBUG("SetPlay on {} {}", GetKey(), m_data.login);
SetLogonTime();
}
else
sys_log(0, "SetPlay off %lu %s", GetKey(), m_data.login);
SPDLOG_DEBUG("SetPlay off {} {}", GetKey(), m_data.login);
m_bPlay = bOn;
m_lastPlayTime = CClientManager::instance().GetCurrentTime();

View File

@ -29,12 +29,6 @@ class CLoginData
void SetDeleted(bool bSet);
bool IsDeleted();
void SetBillID(DWORD id) { m_dwBillID = id; }
DWORD GetBillID() { return m_dwBillID; }
void SetBillType(BYTE type) { m_bBillType = type; }
BYTE GetBillType() { return m_bBillType; }
time_t GetLastPlayTime() { return m_lastPlayTime; }
void SetPremium(DWORD * paiPremiumTimes);
@ -53,8 +47,6 @@ class CLoginData
bool m_bPlay;
bool m_bDeleted;
BYTE m_bBillType;
DWORD m_dwBillID;
time_t m_lastPlayTime;
DWORD m_aiPremiumTimes[PREMIUM_MAX_NUM];

View File

@ -5,12 +5,10 @@
#include "ClientManager.h"
#include "GuildManager.h"
#include "ItemAwardManager.h"
#include "HB.h"
#include "PrivManager.h"
#include "MoneyLog.h"
#include "Marriage.h"
#include "Monarch.h"
#include "BlockCountry.h"
#include "ItemIDRangeManager.h"
#include <version.h>
#ifdef __AUCTION__
@ -28,18 +26,15 @@ std::string g_stLocale = "euckr";
std::string g_stPlayerDBName = "";
bool g_bHotBackup = false;
BOOL g_test_server = false;
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
//단위 초
int g_iPlayerCacheFlushSeconds = 60*7;
int g_iItemCacheFlushSeconds = 60*5;
//g_iLogoutSeconds <EFBFBD><EFBFBD>ġ<EFBFBD><EFBFBD> g_iPlayerCacheFlushSeconds <EFBFBD><EFBFBD> g_iItemCacheFlushSeconds <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
//g_iLogoutSeconds 수치는 g_iPlayerCacheFlushSeconds g_iItemCacheFlushSeconds 보다 길어야 한다.
int g_iLogoutSeconds = 60*10;
int g_log = 1;
// MYSHOP_PRICE_LIST
int g_iItemPriceListTableCacheFlushSeconds = 540;
@ -52,9 +47,9 @@ extern const char * _malloc_options;
void emergency_sig(int sig)
{
if (sig == SIGSEGV)
sys_log(0, "SIGNAL: SIGSEGV");
SPDLOG_DEBUG("SIGNAL: SIGSEGV");
else if (sig == SIGUSR1)
sys_log(0, "SIGNAL: SIGUSR1");
SPDLOG_DEBUG("SIGNAL: SIGUSR1");
if (sig == SIGSEGV)
abort();
@ -62,7 +57,8 @@ void emergency_sig(int sig)
int main()
{
WriteVersion(std::cout);
WriteVersion();
log_init();
#ifdef __FreeBSD__
_malloc_options = "A";
@ -71,14 +67,12 @@ int main()
CConfig Config;
CDBManager DBManager;
CClientManager ClientManager;
PlayerHB player_hb;
CGuildManager GuildManager;
CPrivManager PrivManager;
CMoneyLog MoneyLog;
ItemAwardManager ItemAwardManager;
marriage::CManager MarriageManager;
CMonarch Monarch;
CBlockCountry BlockCountry;
CItemIDRangeManager ItemIDRangeManager;
#ifdef __AUCTION__
AuctionManager auctionManager;
@ -88,12 +82,11 @@ int main()
GuildManager.Initialize();
MarriageManager.Initialize();
BlockCountry.Load();
ItemIDRangeManager.Build();
#ifdef __AUCTION__
AuctionManager::instance().Initialize();
#endif
sys_log(0, "Metin2DBCacheServer Start\n");
SPDLOG_DEBUG("Metin2DBCacheServer Start");
CClientManager::instance().MainLoop();
@ -113,65 +106,53 @@ int main()
break;
usleep(1000);
sys_log(0, "WAITING_QUERY_COUNT %d", iCount);
SPDLOG_DEBUG("WAITING_QUERY_COUNT {}", iCount);
}
log_destroy();
return 1;
}
void emptybeat(LPHEART heart, int pulse)
{
if (!(pulse % heart->passes_per_sec)) // 1<EFBFBD>ʿ<EFBFBD> <20>ѹ<EFBFBD>
if (!(pulse % heart->passes_per_sec)) // 1초에 한번
{
}
}
//
// @version 05/06/13 Bang2ni - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3> flush timeout <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD>.
// @version 05/06/13 Bang2ni - 아이템 가격정보 캐시 flush timeout 설정 추가.
//
int Start()
{
if (!CConfig::instance().LoadFile("conf.txt"))
{
fprintf(stderr, "Loading conf.txt failed.\n");
SPDLOG_ERROR("Loading conf.txt failed.");
return false;
}
if (!CConfig::instance().GetValue("TEST_SERVER", &g_test_server))
{
fprintf(stderr, "Real Server\n");
SPDLOG_INFO("Real Server");
}
else
fprintf(stderr, "Test Server\n");
SPDLOG_INFO("Test Server");
if (!CConfig::instance().GetValue("LOG", &g_log))
{
fprintf(stderr, "Log Off");
g_log= 0;
}
else
{
g_log = 1;
fprintf(stderr, "Log On");
}
int tmpValue;
int heart_beat = 50;
if (!CConfig::instance().GetValue("CLIENT_HEART_FPS", &heart_beat))
{
fprintf(stderr, "Cannot find CLIENT_HEART_FPS configuration.\n");
SPDLOG_ERROR("Cannot find CLIENT_HEART_FPS configuration.");
return false;
}
log_set_expiration_days(3);
if (CConfig::instance().GetValue("LOG_KEEP_DAYS", &tmpValue))
if (CConfig::instance().GetValue("LOG_LEVEL", &tmpValue))
{
tmpValue = std::clamp(tmpValue, 3, 30);
log_set_expiration_days(tmpValue);
fprintf(stderr, "Setting log keeping days to %d\n", tmpValue);
SPDLOG_INFO("Setting log level to {}", tmpValue);
tmpValue = std::clamp(tmpValue, SPDLOG_LEVEL_TRACE, SPDLOG_LEVEL_OFF);
log_set_level(tmpValue);
}
thecore_init(heart_beat, emptybeat);
@ -182,31 +163,12 @@ int Start()
if (CConfig::instance().GetValue("LOCALE", szBuf, 256))
{
g_stLocale = szBuf;
sys_log(0, "LOCALE set to %s", g_stLocale.c_str());
// CHINA_DISABLE_HOTBACKUP
if ("gb2312" == g_stLocale)
{
sys_log(0, "CIBN_LOCALE: DISABLE_HOTBACKUP");
g_bHotBackup = false;
}
// END_OF_CHINA_DISABLE_HOTBACKUP
SPDLOG_INFO("LOCALE set to {}", g_stLocale.c_str());
}
int iDisableHotBackup;
if (CConfig::instance().GetValue("DISABLE_HOTBACKUP", &iDisableHotBackup))
{
if (iDisableHotBackup)
{
sys_log(0, "CONFIG: DISABLE_HOTBACKUP");
g_bHotBackup = false;
}
}
if (!CConfig::instance().GetValue("TABLE_POSTFIX", szBuf, 256))
{
sys_err("TABLE_POSTFIX not configured use default");
SPDLOG_WARN("TABLE_POSTFIX not configured use default");
szBuf[0] = '\0';
}
@ -215,20 +177,20 @@ int Start()
if (CConfig::instance().GetValue("PLAYER_CACHE_FLUSH_SECONDS", szBuf, 256))
{
str_to_number(g_iPlayerCacheFlushSeconds, szBuf);
sys_log(0, "PLAYER_CACHE_FLUSH_SECONDS: %d", g_iPlayerCacheFlushSeconds);
SPDLOG_INFO("PLAYER_CACHE_FLUSH_SECONDS: {}", g_iPlayerCacheFlushSeconds);
}
if (CConfig::instance().GetValue("ITEM_CACHE_FLUSH_SECONDS", szBuf, 256))
{
str_to_number(g_iItemCacheFlushSeconds, szBuf);
sys_log(0, "ITEM_CACHE_FLUSH_SECONDS: %d", g_iItemCacheFlushSeconds);
SPDLOG_INFO("ITEM_CACHE_FLUSH_SECONDS: {}", g_iItemCacheFlushSeconds);
}
// MYSHOP_PRICE_LIST
if (CConfig::instance().GetValue("ITEM_PRICELIST_CACHE_FLUSH_SECONDS", szBuf, 256))
{
str_to_number(g_iItemPriceListTableCacheFlushSeconds, szBuf);
sys_log(0, "ITEM_PRICELIST_CACHE_FLUSH_SECONDS: %d", g_iItemPriceListTableCacheFlushSeconds);
SPDLOG_INFO("ITEM_PRICELIST_CACHE_FLUSH_SECONDS: {}", g_iItemPriceListTableCacheFlushSeconds);
}
// END_OF_MYSHOP_PRICE_LIST
//
@ -241,7 +203,7 @@ int Start()
int iIDStart;
if (!CConfig::instance().GetValue("PLAYER_ID_START", &iIDStart))
{
sys_err("PLAYER_ID_START not configured");
SPDLOG_ERROR("PLAYER_ID_START not configured");
return false;
}
@ -249,7 +211,7 @@ int Start()
if (CConfig::instance().GetValue("NAME_COLUMN", szBuf, 256))
{
fprintf(stderr, "%s %s", g_stLocaleNameColumn.c_str(), szBuf);
SPDLOG_INFO("{} {}", g_stLocaleNameColumn, szBuf);
g_stLocaleNameColumn = szBuf;
}
@ -260,7 +222,7 @@ int Start()
if (CConfig::instance().GetValue("SQL_PLAYER", line, 256))
{
sscanf(line, " %s %s %s %s %d ", szAddr, szDB, szUser, szPassword, &iPort);
sys_log(0, "connecting to MySQL server (player)");
SPDLOG_DEBUG("Connecting to MySQL server (player)");
int iRetry = 5;
@ -268,27 +230,25 @@ int Start()
{
if (CDBManager::instance().Connect(SQL_PLAYER, szAddr, iPort, szDB, szUser, szPassword))
{
sys_log(0, " OK");
SPDLOG_INFO("Connected to MySQL server (player)");
break;
}
sys_log(0, " failed, retrying in 5 seconds");
fprintf(stderr, " failed, retrying in 5 seconds");
SPDLOG_ERROR("Connection to MySQL server (player) failed, retrying in 5 seconds");
sleep(5);
} while (iRetry--);
fprintf(stderr, "Success PLAYER\n");
SetPlayerDBName(szDB);
}
else
{
sys_err("SQL_PLAYER not configured");
SPDLOG_ERROR("SQL_PLAYER not configured");
return false;
}
if (CConfig::instance().GetValue("SQL_ACCOUNT", line, 256))
{
sscanf(line, " %s %s %s %s %d ", szAddr, szDB, szUser, szPassword, &iPort);
sys_log(0, "connecting to MySQL server (account)");
SPDLOG_DEBUG("connecting to MySQL server (account)");
int iRetry = 5;
@ -296,26 +256,26 @@ int Start()
{
if (CDBManager::instance().Connect(SQL_ACCOUNT, szAddr, iPort, szDB, szUser, szPassword))
{
sys_log(0, " OK");
SPDLOG_DEBUG(" OK");
break;
}
sys_log(0, " failed, retrying in 5 seconds");
fprintf(stderr, " failed, retrying in 5 seconds");
SPDLOG_DEBUG(" failed, retrying in 5 seconds");
SPDLOG_ERROR(" failed, retrying in 5 seconds");
sleep(5);
} while (iRetry--);
fprintf(stderr, "Success ACCOUNT\n");
SPDLOG_INFO("Success ACCOUNT");
}
else
{
sys_err("SQL_ACCOUNT not configured");
SPDLOG_ERROR("SQL_ACCOUNT not configured");
return false;
}
if (CConfig::instance().GetValue("SQL_COMMON", line, 256))
{
sscanf(line, " %s %s %s %s %d ", szAddr, szDB, szUser, szPassword, &iPort);
sys_log(0, "connecting to MySQL server (common)");
SPDLOG_DEBUG("connecting to MySQL server (common)");
int iRetry = 5;
@ -323,66 +283,29 @@ int Start()
{
if (CDBManager::instance().Connect(SQL_COMMON, szAddr, iPort, szDB, szUser, szPassword))
{
sys_log(0, " OK");
SPDLOG_DEBUG(" OK");
break;
}
sys_log(0, " failed, retrying in 5 seconds");
fprintf(stderr, " failed, retrying in 5 seconds");
SPDLOG_DEBUG(" failed, retrying in 5 seconds");
SPDLOG_ERROR(" failed, retrying in 5 seconds");
sleep(5);
} while (iRetry--);
fprintf(stderr, "Success COMMON\n");
SPDLOG_INFO("Success COMMON");
}
else
{
sys_err("SQL_COMMON not configured");
SPDLOG_ERROR("SQL_COMMON not configured");
return false;
}
if (CConfig::instance().GetValue("SQL_HOTBACKUP", line, 256))
{
sscanf(line, " %s %s %s %s %d ", szAddr, szDB, szUser, szPassword, &iPort);
sys_log(0, "connecting to MySQL server (hotbackup)");
int iRetry = 5;
do
{
if (CDBManager::instance().Connect(SQL_HOTBACKUP, szAddr, iPort, szDB, szUser, szPassword))
{
sys_log(0, " OK");
break;
}
sys_log(0, " failed, retrying in 5 seconds");
fprintf(stderr, " failed, retrying in 5 seconds");
sleep(5);
}
while (iRetry--);
fprintf(stderr, "Success HOTBACKUP\n");
}
else
{
sys_err("SQL_HOTBACKUP not configured");
return false;
}
sys_log(0, "ClientManager initialization.. ");
if (!CClientManager::instance().Initialize())
{
sys_log(0, " failed");
SPDLOG_ERROR("ClientManager initialization failed");
return false;
}
sys_log(0, " OK");
if (!PlayerHB::instance().Initialize())
{
sys_err("cannot initialize player hotbackup");
return false;
}
SPDLOG_INFO("ClientManager initialization OK");
#ifndef __WIN32__
signal(SIGUSR1, emergency_sig);

View File

@ -44,7 +44,7 @@ namespace marriage
unique_ptr<SQLMsg> pmsg(CDBManager::instance().DirectQuery(szQuery));
SQLResult * pRes = pmsg->Get();
sys_log(0, "MarriageList(size=%lu)", pRes->uiNumRows);
SPDLOG_DEBUG("MarriageList(size={})", pRes->uiNumRows);
if (pRes->uiNumRows > 0)
{
@ -65,7 +65,7 @@ namespace marriage
m_MarriageByPID.insert(make_pair(pid1, pMarriage));
m_MarriageByPID.insert(make_pair(pid2, pMarriage));
sys_log(0, "Marriage %lu: LP:%d TM:%u ST:%d %10lu:%16s %10lu:%16s ", uiRow, love_point, time, is_married, pid1, name1, pid2, name2);
SPDLOG_DEBUG("Marriage {}: LP:{} TM:{} ST:{} {:10}:{:16} {:10}:{:16} ", uiRow, love_point, time, is_married, pid1, name1, pid2, name2);
}
}
return true;
@ -92,7 +92,7 @@ namespace marriage
DWORD now = CClientManager::instance().GetCurrentTime();
if (IsMarried(dwPID1) || IsMarried(dwPID2))
{
sys_err("cannot marry already married character. %d - %d", dwPID1, dwPID2);
SPDLOG_ERROR("cannot marry already married character. {} - {}", dwPID1, dwPID2);
return;
}
@ -106,11 +106,11 @@ namespace marriage
SQLResult* res = pmsg->Get();
if (res->uiAffectedRows == 0 || res->uiAffectedRows == (uint32_t)-1)
{
sys_err("cannot insert marriage");
SPDLOG_ERROR("cannot insert marriage");
return;
}
sys_log(0, "MARRIAGE ADD %u %u", dwPID1, dwPID2);
SPDLOG_DEBUG("MARRIAGE ADD {} {}", dwPID1, dwPID2);
TMarriage* pMarriage = new TMarriage(dwPID1, dwPID2, 0, now, 0, szName1, szName2);
m_Marriages.insert(pMarriage);
@ -131,7 +131,7 @@ namespace marriage
TMarriage* pMarriage = Get(dwPID1);
if (!pMarriage || pMarriage->GetOther(dwPID1) != dwPID2)
{
sys_err("not under marriage : %u %u", dwPID1, dwPID2);
SPDLOG_ERROR("not under marriage : {} {}", dwPID1, dwPID2);
return;
}
@ -146,11 +146,11 @@ namespace marriage
SQLResult* res = pmsg->Get();
if (res->uiAffectedRows == 0 || res->uiAffectedRows == (uint32_t)-1)
{
sys_err("cannot update marriage : PID:%u %u", dwPID1, dwPID2);
SPDLOG_ERROR("cannot update marriage : PID:{} {}", dwPID1, dwPID2);
return;
}
sys_log(0, "MARRIAGE UPDATE PID:%u %u LP:%u ST:%d", dwPID1, dwPID2, iLovePoint, byMarried);
SPDLOG_DEBUG("MARRIAGE UPDATE PID:{} {} LP:{} ST:{}", dwPID1, dwPID2, iLovePoint, byMarried);
pMarriage->love_point = iLovePoint;
pMarriage->is_married = byMarried;
@ -168,7 +168,7 @@ namespace marriage
if (pMarriage)
{
sys_log(0, "Break Marriage pid1 %d pid2 %d Other %d", dwPID1, dwPID2, pMarriage->GetOther(dwPID1));
SPDLOG_DEBUG("Break Marriage pid1 {} pid2 {} Other {}", dwPID1, dwPID2, pMarriage->GetOther(dwPID1));
}
if (!pMarriage || pMarriage->GetOther(dwPID1) != dwPID2)
{
@ -176,9 +176,9 @@ namespace marriage
for (; it != m_MarriageByPID.end(); ++it)
{
sys_log(0, "Marriage List pid1 %d pid2 %d", it->second->pid1, it->second->pid2);
SPDLOG_DEBUG("Marriage List pid1 {} pid2 {}", it->second->pid1, it->second->pid2);
}
sys_err("not under marriage : PID:%u %u", dwPID1, dwPID2);
SPDLOG_ERROR("not under marriage : PID:{} {}", dwPID1, dwPID2);
return;
}
@ -192,11 +192,11 @@ namespace marriage
SQLResult* res = pmsg->Get();
if (res->uiAffectedRows == 0 || res->uiAffectedRows == (uint32_t)-1)
{
sys_err("cannot delete marriage : PID:%u %u", dwPID1, dwPID2);
SPDLOG_ERROR("cannot delete marriage : PID:{} {}", dwPID1, dwPID2);
return;
}
sys_log(0, "MARRIAGE REMOVE PID:%u %u", dwPID1, dwPID2);
SPDLOG_DEBUG("MARRIAGE REMOVE PID:{} {}", dwPID1, dwPID2);
m_Marriages.erase(pMarriage);
m_MarriageByPID.erase(dwPID1);
@ -215,13 +215,13 @@ namespace marriage
TMarriage* pMarriage = Get(dwPID1);
if (!pMarriage || pMarriage->GetOther(dwPID1) != dwPID2)
{
sys_err("not under marriage : PID:%u %u", dwPID1, dwPID2);
SPDLOG_ERROR("not under marriage : PID:{} {}", dwPID1, dwPID2);
return;
}
if (pMarriage->is_married)
{
sys_err("already married, cannot change engage to marry : PID:%u %u", dwPID1, dwPID2);
SPDLOG_ERROR("already married, cannot change engage to marry : PID:{} {}", dwPID1, dwPID2);
return;
}
@ -236,11 +236,11 @@ namespace marriage
SQLResult* res = pmsg->Get();
if (res->uiAffectedRows == 0 || res->uiAffectedRows == (uint32_t)-1)
{
sys_err("cannot change engage to marriage : PID:%u %u", dwPID1, dwPID2);
SPDLOG_ERROR("cannot change engage to marriage : PID:{} {}", dwPID1, dwPID2);
return;
}
sys_log(0, "MARRIAGE ENGAGE->MARRIAGE PID:%u %u", dwPID1, dwPID2);
SPDLOG_DEBUG("MARRIAGE ENGAGE->MARRIAGE PID:{} {}", dwPID1, dwPID2);
pMarriage->is_married = 1;
TPacketMarriageUpdate p;
@ -253,7 +253,7 @@ namespace marriage
void CManager::OnSetup(CPeer* peer)
{
// <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 결혼한 사람들 보내기
for (itertype(m_Marriages) it = m_Marriages.begin(); it != m_Marriages.end(); ++it)
{
TMarriage* pMarriage = *it;
@ -280,7 +280,7 @@ namespace marriage
}
}
// <EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 결혼식 보내기
for (itertype(m_mapRunningWedding) it = m_mapRunningWedding.begin(); it != m_mapRunningWedding.end(); ++it)
{
const TWedding& t = it->second;
@ -313,7 +313,7 @@ namespace marriage
itertype(m_mapRunningWedding) it = m_mapRunningWedding.find(make_pair(dwPID1, dwPID2));
if (it == m_mapRunningWedding.end())
{
sys_err("try to end wedding %u %u", dwPID1, dwPID2);
SPDLOG_ERROR("try to end wedding {} {}", dwPID1, dwPID2);
return;
}

View File

@ -49,7 +49,7 @@ namespace marriage
DWORD pid2;
int love_point;
DWORD time;
BYTE is_married; // false : <EFBFBD><EFBFBD>ȥ <20><><EFBFBD><EFBFBD>, true : <EFBFBD><EFBFBD>ȥ <20><><EFBFBD><EFBFBD>
BYTE is_married; // false : 약혼 상태, true : 결혼 상태
std::string name1;
std::string name2;

View File

@ -1,3 +1,5 @@
#include "stdafx.h"
#include "Monarch.h"
#include <common/utils.h>
#include "Main.h"
@ -53,8 +55,7 @@ void CMonarch::ElectMonarch()
++s[idx];
if (g_test_server)
sys_log (0, "[MONARCH_VOTE] pid(%d) come to vote candidacy pid(%d)", it->second->pid, m_vec_MonarchCandidacy[idx].pid);
SPDLOG_TRACE("[MONARCH_VOTE] pid({}) come to vote candidacy pid({})", it->second->pid, m_vec_MonarchCandidacy[idx].pid);
}
delete [] s;
@ -167,8 +168,7 @@ bool CMonarch::TakeMoney(int Empire, DWORD pid, int64_t Money)
CDBManager::instance().AsyncQuery(szQuery);
if (g_test_server)
sys_log(0, "[MONARCH] Take money empire(%d) money(%lld)", Empire, m_MonarchInfo.money[Empire]);
SPDLOG_TRACE("[MONARCH] Take money empire({}) money({})", Empire, m_MonarchInfo.money[Empire]);
return true;
}
@ -197,8 +197,7 @@ bool CMonarch::LoadMonarch()
str_to_number(p->money[Empire], row[idx++]);
strlcpy(p->date[Empire], row[idx++], sizeof(p->date[Empire]));
if (g_test_server)
sys_log(0, "[LOAD_MONARCH] Empire %d pid %d money %lld windate %s", Empire, p->pid[Empire], p->money[Empire], p->date[Empire]);
SPDLOG_TRACE("[LOAD_MONARCH] Empire {} pid {} money {} windate {}", Empire, p->pid[Empire], p->money[Empire], p->date[Empire]);
}
delete pMsg;
@ -230,12 +229,11 @@ bool CMonarch::SetMonarch(const char * name)
strlcpy(p->name[Empire], row[idx++], sizeof(p->name[Empire]));
p->money[Empire] = atoll(row[idx++]);
if (g_test_server)
sys_log(0, "[Set_MONARCH] Empire %d pid %d money %lld windate %s", Empire, p->pid[Empire], p->money[Empire], p->date[Empire]);
SPDLOG_TRACE("[Set_MONARCH] Empire {} pid {} money {} windate {}", Empire, p->pid[Empire], p->money[Empire], p->date[Empire]);
}
delete pMsg;
//db<EFBFBD><EFBFBD> <20>Է<EFBFBD>
//db에 입력
snprintf(szQuery, sizeof(szQuery),
"REPLACE INTO monarch (empire, name, windate, money) VALUES(%d, %d, now(), %ld)", Empire, p->pid[Empire], p->money[Empire]);
@ -278,7 +276,7 @@ bool CMonarch::DelMonarch(const char * name)
if (pMsg->Get()->uiNumRows == 0)
{
sys_err(" DirectQuery failed(%s)", szQuery);
SPDLOG_ERROR(" DirectQuery failed({})", szQuery);
delete pMsg;
return false;
}

View File

@ -29,15 +29,15 @@ void CPeer::OnAccept()
static DWORD current_handle = 0;
m_dwHandle = ++current_handle;
sys_log(0, "Connection accepted. (host: %s handle: %u)", m_host, m_dwHandle);
SPDLOG_DEBUG("Connection accepted. (host: {} handle: {})", m_host, m_dwHandle);
}
void CPeer::OnClose()
{
m_state = STATE_CLOSE;
sys_log(0, "Connection closed. (host: %s)", m_host);
sys_log(0, "ItemIDRange: returned. %u ~ %u", m_itemRange.dwMin, m_itemRange.dwMax);
SPDLOG_DEBUG("Connection closed. (host: {})", m_host);
SPDLOG_DEBUG("ItemIDRange: returned. {} ~ {}", m_itemRange.dwMin, m_itemRange.dwMax);
CItemIDRangeManager::instance().UpdateRange(m_itemRange.dwMin, m_itemRange.dwMax);
@ -69,7 +69,7 @@ bool CPeer::PeekPacket(int & iBytesProceed, BYTE & header, DWORD & dwHandle, DWO
const char * buf = (const char *) GetRecvBuffer(iBytesProceed + 9);
if (!buf) {
sys_err("PeekPacket: Failed to get network buffer!");
SPDLOG_ERROR("PeekPacket: Failed to get network buffer!");
return false;
}
@ -87,7 +87,7 @@ bool CPeer::PeekPacket(int & iBytesProceed, BYTE & header, DWORD & dwHandle, DWO
// Ensure that all the data was fully received
if (iBytesProceed + dwLength + 9 > (DWORD) GetRecvLength())
{
sys_log(0, "PeekPacket: not enough buffer size: len %u, recv %d",
SPDLOG_DEBUG("PeekPacket: not enough buffer size: len {}, recv {}",
9+dwLength, GetRecvLength()-iBytesProceed);
return false;
}
@ -95,7 +95,7 @@ bool CPeer::PeekPacket(int & iBytesProceed, BYTE & header, DWORD & dwHandle, DWO
// Ensure that all the required data is available in a contiguous area
buf = (const char *) GetRecvBuffer(iBytesProceed + dwLength + 9);
if (!buf) {
sys_err("PeekPacket: Failed to get network buffer!");
SPDLOG_ERROR("PeekPacket: Failed to get network buffer!");
return false;
}
@ -112,7 +112,7 @@ void CPeer::EncodeHeader(BYTE header, DWORD dwHandle, DWORD dwSize)
{
HEADER h;
sys_log(1, "EncodeHeader %u handle %u size %u", header, dwHandle, dwSize);
SPDLOG_TRACE("EncodeHeader {} handle {} size {}", header, dwHandle, dwSize);
h.bHeader = header;
h.dwHandle = dwHandle;
@ -149,7 +149,7 @@ void CPeer::SendSpareItemIDRange()
if (SetSpareItemIDRange(CItemIDRangeManager::instance().GetRange()) == false)
{
sys_log(0, "ItemIDRange: spare range set error");
SPDLOG_DEBUG("ItemIDRange: spare range set error");
m_itemSpareRange.dwMin = m_itemSpareRange.dwMax = m_itemSpareRange.dwUsableItemIDMin = 0;
}
@ -163,7 +163,7 @@ bool CPeer::SetItemIDRange(TItemIDRangeTable itemRange)
if (itemRange.dwMin == 0 || itemRange.dwMax == 0 || itemRange.dwUsableItemIDMin == 0) return false;
m_itemRange = itemRange;
sys_log(0, "ItemIDRange: SET %s %u ~ %u start: %u", GetPublicIP(), m_itemRange.dwMin, m_itemRange.dwMax, m_itemRange.dwUsableItemIDMin);
SPDLOG_DEBUG("ItemIDRange: SET {} {} ~ {} start: {}", GetPublicIP(), m_itemRange.dwMin, m_itemRange.dwMax, m_itemRange.dwUsableItemIDMin);
return true;
}
@ -173,7 +173,7 @@ bool CPeer::SetSpareItemIDRange(TItemIDRangeTable itemRange)
if (itemRange.dwMin == 0 || itemRange.dwMax == 0 || itemRange.dwUsableItemIDMin == 0) return false;
m_itemSpareRange = itemRange;
sys_log(0, "ItemIDRange: SPARE SET %s %u ~ %u start: %u", GetPublicIP(), m_itemSpareRange.dwMin, m_itemSpareRange.dwMax,
SPDLOG_DEBUG("ItemIDRange: SPARE SET {} {} ~ {} start: {}", GetPublicIP(), m_itemSpareRange.dwMin, m_itemSpareRange.dwMax,
m_itemSpareRange.dwUsableItemIDMin);
return true;
@ -183,14 +183,14 @@ bool CPeer::CheckItemIDRangeCollision(TItemIDRangeTable itemRange)
{
if (m_itemRange.dwMin < itemRange.dwMax && m_itemRange.dwMax > itemRange.dwMin)
{
sys_err("ItemIDRange: Collision!! this %u ~ %u check %u ~ %u",
SPDLOG_ERROR("ItemIDRange: Collision!! this {} ~ {} check {} ~ {}",
m_itemRange.dwMin, m_itemRange.dwMax, itemRange.dwMin, itemRange.dwMax);
return false;
}
if (m_itemSpareRange.dwMin < itemRange.dwMax && m_itemSpareRange.dwMax > itemRange.dwMin)
{
sys_err("ItemIDRange: Collision with spare range this %u ~ %u check %u ~ %u",
SPDLOG_ERROR("ItemIDRange: Collision with spare range this {} ~ {} check {} ~ {}",
m_itemSpareRange.dwMin, m_itemSpareRange.dwMax, itemRange.dwMin, itemRange.dwMax);
return false;
}

View File

@ -64,9 +64,9 @@ class CPeer : public CPeerBase
BYTE m_bChannel;
DWORD m_dwHandle;
DWORD m_dwUserCount;
WORD m_wListenPort; // <EFBFBD><EFBFBD><EFBFBD>Ӽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> listen <EFBFBD>ϴ<EFBFBD> <20><>Ʈ
WORD m_wP2PPort; // <EFBFBD><EFBFBD><EFBFBD>Ӽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD> P2P <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> listen <EFBFBD>ϴ<EFBFBD> <20><>Ʈ
LONG m_alMaps[MAP_ALLOW_MAX_LEN]; // <EFBFBD><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>ִ°<D6B4>?
WORD m_wListenPort; // 게임서버가 클라이언트를 위해 listen 하는 포트
WORD m_wP2PPort; // 게임서버가 게임서버 P2P 접속을 위해 listen 하는 포트
LONG m_alMaps[MAP_ALLOW_MAX_LEN]; // 어떤 맵을 관장하고 있는가?
TItemIDRangeTable m_itemRange;
TItemIDRangeTable m_itemSpareRange;

View File

@ -23,12 +23,12 @@ void CPeerBase::Destroy()
bool CPeerBase::Accept(bufferevent* bufev, sockaddr* addr)
{
if (!bufev) {
sys_err("Cannot accept empty bufferevent!");
SPDLOG_ERROR("Cannot accept empty bufferevent!");
return false;
}
if (m_bufferevent != nullptr) {
sys_err("Peer is already initialized");
SPDLOG_ERROR("Peer is already initialized");
return false;
}
@ -57,7 +57,7 @@ bool CPeerBase::Accept(bufferevent* bufev, sockaddr* addr)
// Trigger the OnAccept event
OnAccept();
sys_log(0, "ACCEPT FROM %s", m_host);
SPDLOG_DEBUG("ACCEPT FROM {}", m_host);
return true;
}
@ -86,12 +86,12 @@ void CPeerBase::Encode(const void* data, size_t size)
{
if (!m_bufferevent)
{
sys_err("Bufferevent not ready!");
SPDLOG_ERROR("Bufferevent not ready!");
return;
}
if (bufferevent_write(m_bufferevent, data, size) != 0) {
sys_err("Buffer write error!");
SPDLOG_ERROR("Buffer write error!");
return;
}
}
@ -100,7 +100,7 @@ void CPeerBase::RecvEnd(size_t proceed_bytes)
{
if (!m_bufferevent)
{
sys_err("Bufferevent not ready!");
SPDLOG_ERROR("Bufferevent not ready!");
return;
}
@ -112,7 +112,7 @@ size_t CPeerBase::GetRecvLength()
{
if (!m_bufferevent)
{
sys_err("Bufferevent not ready!");
SPDLOG_ERROR("Bufferevent not ready!");
return 0;
}
@ -124,7 +124,7 @@ const void * CPeerBase::GetRecvBuffer(ssize_t ensure_bytes)
{
if (!m_bufferevent)
{
sys_err("Bufferevent not ready!");
SPDLOG_ERROR("Bufferevent not ready!");
return nullptr;
}
@ -136,7 +136,7 @@ size_t CPeerBase::GetSendLength()
{
if (!m_bufferevent)
{
sys_err("Bufferevent not ready!");
SPDLOG_ERROR("Bufferevent not ready!");
return 0;
}

View File

@ -20,7 +20,7 @@ CPrivManager::~CPrivManager()
}
//
// @version 05/06/07 Bang2ni - <EFBFBD>ߺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><20><><EFBFBD><EFBFBD> ó<><C3B3>
// @version 05/06/07 Bang2ni - 중복적으로 보너스가 적용 된 길드에 대한 처리
//
void CPrivManager::Update()
{
@ -37,8 +37,8 @@ void CPrivManager::Update()
typeof(m_aPrivGuild[p->type].begin()) it = m_aPrivGuild[p->type].find(p->guild_id);
// ADD_GUILD_PRIV_TIME
// <EFBFBD><EFBFBD><EFBFBD><20>ߺ<EFBFBD><DFBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD> <20><><EFBFBD><EFBFBD> map <EFBFBD><EFBFBD> value <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>) <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>Ƿ<EFBFBD>
// TPrivGuildData <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ְ<EFBFBD> <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD><E9BFA1> cast <20><> <20>ش<EFBFBD>.
// 길드에 중복적으로 보너스가 설정되었을 경우 map value 가 갱신(수정) 되었으므로
// TPrivGuildData 의 포인터가 같을때 실제로 삭제해 주고 게임서버들에게 cast 해 준다.
if (it != m_aPrivGuild[p->type].end() && it->second == p) {
m_aPrivGuild[p->type].erase(it);
SendChangeGuildPriv(p->guild_id, p->type, 0, 0);
@ -84,7 +84,7 @@ void CPrivManager::AddCharPriv(DWORD pid, BYTE type, int value)
{
if (MAX_PRIV_NUM <= type)
{
sys_err("PRIV_MANAGER: AddCharPriv: wrong char priv type(%u) recved", type);
SPDLOG_ERROR("PRIV_MANAGER: AddCharPriv: wrong char priv type({}) recved", type);
return;
}
@ -108,18 +108,18 @@ void CPrivManager::AddCharPriv(DWORD pid, BYTE type, int value)
m_aPrivChar[type].insert(std::make_pair(pid, p));
// TODO send packet
sys_log(0, "AddCharPriv %d %d %d", pid, type, value);
SPDLOG_DEBUG("AddCharPriv {} {} {}", pid, type, value);
SendChangeCharPriv(pid, type, value);
}
//
// @version 05/06/07 Bang2ni - <EFBFBD>̹<EFBFBD> <20><><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><20><><EFBFBD>ʽ<EFBFBD> <20><><EFBFBD><EFBFBD>
// @version 05/06/07 Bang2ni - 이미 보너스가 적용 된 길드에 보너스 설정
//
void CPrivManager::AddGuildPriv(DWORD guild_id, BYTE type, int value, time_t duration_sec)
{
if (MAX_PRIV_NUM <= type)
{
sys_err("PRIV_MANAGER: AddGuildPriv: wrong guild priv type(%u) recved", type);
SPDLOG_ERROR("PRIV_MANAGER: AddGuildPriv: wrong guild priv type({}) recved", type);
return;
}
@ -131,8 +131,8 @@ void CPrivManager::AddGuildPriv(DWORD guild_id, BYTE type, int value, time_t dur
m_pqPrivGuild.push(std::make_pair(end, p));
// ADD_GUILD_PRIV_TIME
// <EFBFBD>̹<EFBFBD> <20><><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִٸ<D6B4> map <EFBFBD><EFBFBD> value <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ش<EFBFBD>.
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> value <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD> priority queue <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>.
// 이미 보너스가 설정되 있다면 map value 를 갱신해 준다.
// 이전 value 의 포인터는 priority queue 에서 삭제될 때 해제된다.
if (it != m_aPrivGuild[type].end())
it->second = p;
else
@ -141,14 +141,14 @@ void CPrivManager::AddGuildPriv(DWORD guild_id, BYTE type, int value, time_t dur
SendChangeGuildPriv(guild_id, type, value, end);
// END_OF_ADD_GUILD_PRIV_TIME
sys_log(0, "Guild Priv guild(%d) type(%d) value(%d) duration_sec(%d)", guild_id, type, value, duration_sec);
SPDLOG_DEBUG("Guild Priv guild({}) type({}) value({}) duration_sec({})", guild_id, type, value, duration_sec);
}
void CPrivManager::AddEmpirePriv(BYTE empire, BYTE type, int value, time_t duration_sec)
{
if (MAX_PRIV_NUM <= type)
{
sys_err("PRIV_MANAGER: AddEmpirePriv: wrong empire priv type(%u) recved", type);
SPDLOG_ERROR("PRIV_MANAGER: AddEmpirePriv: wrong empire priv type({}) recved", type);
return;
}
@ -158,8 +158,8 @@ void CPrivManager::AddEmpirePriv(BYTE empire, BYTE type, int value, time_t durat
time_t now = CClientManager::instance().GetCurrentTime();
time_t end = now+duration_sec;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȿȭ
// priority_queue<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> pointer == m_aaPrivEmpire[type][empire]
// 이전 설정값 무효화
// priority_queue에 들어있는 pointer == m_aaPrivEmpire[type][empire]
{
if (m_aaPrivEmpire[type][empire])
m_aaPrivEmpire[type][empire]->bRemoved = true;
@ -173,11 +173,11 @@ void CPrivManager::AddEmpirePriv(BYTE empire, BYTE type, int value, time_t durat
SendChangeEmpirePriv(empire, type, value, end);
// END_OF_ADD_EMPIRE_PRIV_TIME
sys_log(0, "Empire Priv empire(%d) type(%d) value(%d) duration_sec(%d)", empire, type, value, duration_sec);
SPDLOG_DEBUG("Empire Priv empire({}) type({}) value({}) duration_sec({})", empire, type, value, duration_sec);
}
/**
* @version 05/06/08 Bang2ni - <EFBFBD><EFBFBD><EFBFBD>ӽð<EFBFBD> <20>߰<EFBFBD>
* @version 05/06/08 Bang2ni - 지속시간 추가
*/
struct FSendChangeGuildPriv
{

View File

@ -23,7 +23,7 @@ struct TPrivEmpireData
};
/**
* @version 05/06/08 Bang2ni - <EFBFBD><EFBFBD><EFBFBD>ӽð<EFBFBD> <20>߰<EFBFBD>
* @version 05/06/08 Bang2ni - 지속시간 추가
*/
struct TPrivGuildData
{
@ -33,7 +33,7 @@ struct TPrivGuildData
DWORD guild_id;
// ADD_GUILD_PRIV_TIME
time_t end_time_sec; ///< <EFBFBD><EFBFBD><EFBFBD>ӽð<EFBFBD>
time_t end_time_sec; ///< 지속시간
TPrivGuildData(BYTE type, int value, DWORD guild_id, time_t _end_time_sec)
: type(type), value(value), bRemoved(false), guild_id(guild_id), end_time_sec(_end_time_sec )
@ -53,7 +53,7 @@ struct TPrivCharData
};
/**
* @version 05/06/08 Bang2ni - Guild privilege <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Լ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD> <20>߰<EFBFBD>
* @version 05/06/08 Bang2ni - Guild privilege 관련 함수 지속 시간 추가
*/
class CPrivManager : public singleton<CPrivManager>
{

View File

@ -25,23 +25,23 @@ string trim(const string& str){return trim_left(trim_right(str));}
static string* StringSplit(string strOrigin, string strTok)
{
int cutAt; //<EFBFBD>ڸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ
int index = 0; //<EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD><EFBFBD>ε<EFBFBD><EFBFBD><EFBFBD>
string* strResult = new string[30]; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>return <EFBFBD>Һ<EFBFBD><EFBFBD><EFBFBD>
int cutAt; //자르는위치
int index = 0; //문자열인덱스
string* strResult = new string[30]; //결과return 할변수
//strTok<EFBFBD><EFBFBD>ã<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݺ<EFBFBD>
//strTok을찾을때까지반복
while ((cutAt = strOrigin.find_first_of(strTok)) != strOrigin.npos)
{
if (cutAt > 0) //<EFBFBD>ڸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ<EFBFBD><EFBFBD>0<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ũ<EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
if (cutAt > 0) //자르는위치가0보다크면(성공시)
{
strResult[index++] = strOrigin.substr(0, cutAt); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߰<EFBFBD>
strResult[index++] = strOrigin.substr(0, cutAt); //결과배열에추가
}
strOrigin = strOrigin.substr(cutAt+1); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD><EFBFBD>κ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
strOrigin = strOrigin.substr(cutAt+1); //원본은자른부분제외한나머지
}
if(strOrigin.length() > 0) //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(strOrigin.length() > 0) //원본이아직남았으면
{
strResult[index++] = strOrigin.substr(0, cutAt); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߰<EFBFBD>
strResult[index++] = strOrigin.substr(0, cutAt); //나머지를결과배열에추가
}
for( int i=0;i<index;i++)
@ -49,7 +49,7 @@ static string* StringSplit(string strOrigin, string strTok)
strResult[i] = trim(strResult[i]);
}
return strResult; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>return
return strResult; //결과return
}
@ -60,25 +60,25 @@ int get_Item_Type_Value(string inputString)
"ITEM_ARMOR", "ITEM_USE",
"ITEM_AUTOUSE", "ITEM_MATERIAL",
"ITEM_SPECIAL", "ITEM_TOOL",
"ITEM_LOTTERY", "ITEM_ELK", //10<EFBFBD><EFBFBD>
"ITEM_LOTTERY", "ITEM_ELK", //10
"ITEM_METIN", "ITEM_CONTAINER",
"ITEM_FISH", "ITEM_ROD",
"ITEM_RESOURCE", "ITEM_CAMPFIRE",
"ITEM_UNIQUE", "ITEM_SKILLBOOK",
"ITEM_QUEST", "ITEM_POLYMORPH", //20<EFBFBD><EFBFBD>
"ITEM_QUEST", "ITEM_POLYMORPH", //20
"ITEM_TREASURE_BOX", "ITEM_TREASURE_KEY",
"ITEM_SKILLFORGET", "ITEM_GIFTBOX",
"ITEM_PICK", "ITEM_HAIR",
"ITEM_TOTEM", "ITEM_BLEND",
"ITEM_COSTUME", "ITEM_DS", //30<EFBFBD><EFBFBD>
"ITEM_COSTUME", "ITEM_DS", //30
"ITEM_SPECIAL_DS", "ITEM_EXTRACT",
"ITEM_SECONDARY_COIN", //33<EFBFBD><EFBFBD>
"ITEM_SECONDARY_COIN", //33
"ITEM_RING",
"ITEM_BELT", //35<EFBFBD><EFBFBD> (EItemTypes <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ġ<><C4A1> 34)
"ITEM_BELT", //35 (EItemTypes 값으로 치면 34)
};
@ -159,8 +159,8 @@ int get_Item_SubType_Value(int type_value, string inputString)
arSub29, //30
arSub31, //31
0, //32
0, //33 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
0, //34 <EFBFBD><EFBFBD>Ʈ
0, //33 반지
0, //34 벨트
};
static int arNumberOfSubtype[_countof(arSubType)] = {
0,
@ -196,21 +196,21 @@ int get_Item_SubType_Value(int type_value, string inputString)
sizeof(arSub29)/sizeof(arSub29[0]),
sizeof(arSub31)/sizeof(arSub31[0]),
0, // 32
0, // 33 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
0, // 34 <EFBFBD><EFBFBD>Ʈ
0, // 33 반지
0, // 34 벨트
};
assert(_countof(arSubType) > type_value && "Subtype rule: Out of range!!");
// assert <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>..
// assert 안 먹히는 듯..
if (_countof(arSubType) <= type_value)
{
sys_err("SubType : Out of range!! (type_value: %d, count of registered subtype: %d", type_value, _countof(arSubType));
SPDLOG_ERROR("SubType : Out of range!! (type_value: {}, count of registered subtype: {}", type_value, _countof(arSubType));
return -1;
}
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8> <20><EFBFBD>̰<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD> <20>˾ƺ<CBBE><C6BA><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0 <20><><EFBFBD><EFBFBD>
//아이템 타입의 서브타입 어레이가 존재하는지 알아보고, 없으면 0 리턴
if (arSubType[type_value]==0) {
return 0;
}
@ -246,13 +246,13 @@ int get_Item_AntiFlag_Value(string inputString)
int retValue = 0;
string* arInputString = StringSplit(inputString, "|"); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ܾ<DCBE><EEBAB0> <20>ɰ<EFBFBD> <20>.
string* arInputString = StringSplit(inputString, "|"); //프로토 정보 내용을 단어별로 쪼갠 배열.
for(int i =0;i<sizeof(arAntiFlag)/sizeof(arAntiFlag[0]);i++) {
string tempString = arAntiFlag[i];
for (int j=0; j<30 ; j++) //<EFBFBD>ִ<EFBFBD> 30<33><30> <20>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD><EFBFBD>. (<28>ϵ<EFBFBD><CFB5>ڵ<EFBFBD>)
for (int j=0; j<30 ; j++) //최대 30개 단어까지. (하드코딩)
{
string tempString2 = arInputString[j];
if (tempString2.compare(tempString)==0) { //<EFBFBD><EFBFBD>ġ<EFBFBD>ϴ<EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE>.
if (tempString2.compare(tempString)==0) { //일치하는지 확인.
retValue = retValue + pow((float)2,(float)i);
}
@ -275,13 +275,13 @@ int get_Item_Flag_Value(string inputString)
int retValue = 0;
string* arInputString = StringSplit(inputString, "|"); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ܾ<DCBE><EEBAB0> <20>ɰ<EFBFBD> <20>.
string* arInputString = StringSplit(inputString, "|"); //프로토 정보 내용을 단어별로 쪼갠 배열.
for(int i =0;i<sizeof(arFlag)/sizeof(arFlag[0]);i++) {
string tempString = arFlag[i];
for (int j=0; j<30 ; j++) //<EFBFBD>ִ<EFBFBD> 30<33><30> <20>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD><EFBFBD>. (<28>ϵ<EFBFBD><CFB5>ڵ<EFBFBD>)
for (int j=0; j<30 ; j++) //최대 30개 단어까지. (하드코딩)
{
string tempString2 = arInputString[j];
if (tempString2.compare(tempString)==0) { //<EFBFBD><EFBFBD>ġ<EFBFBD>ϴ<EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE>.
if (tempString2.compare(tempString)==0) { //일치하는지 확인.
retValue = retValue + pow((float)2,(float)i);
}
@ -303,13 +303,13 @@ int get_Item_WearFlag_Value(string inputString)
int retValue = 0;
string* arInputString = StringSplit(inputString, "|"); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ܾ<DCBE><EEBAB0> <20>ɰ<EFBFBD> <20>.
string* arInputString = StringSplit(inputString, "|"); //프로토 정보 내용을 단어별로 쪼갠 배열.
for(int i =0;i<sizeof(arWearrFlag)/sizeof(arWearrFlag[0]);i++) {
string tempString = arWearrFlag[i];
for (int j=0; j<30 ; j++) //<EFBFBD>ִ<EFBFBD> 30<33><30> <20>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD><EFBFBD>. (<28>ϵ<EFBFBD><CFB5>ڵ<EFBFBD>)
for (int j=0; j<30 ; j++) //최대 30개 단어까지. (하드코딩)
{
string tempString2 = arInputString[j];
if (tempString2.compare(tempString)==0) { //<EFBFBD><EFBFBD>ġ<EFBFBD>ϴ<EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE>.
if (tempString2.compare(tempString)==0) { //일치하는지 확인.
retValue = retValue + pow((float)2,(float)i);
}
@ -329,13 +329,13 @@ int get_Item_Immune_Value(string inputString)
string arImmune[] = {"PARA","CURSE","STUN","SLEEP","SLOW","POISON","TERROR"};
int retValue = 0;
string* arInputString = StringSplit(inputString, "|"); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ܾ<DCBE><EEBAB0> <20>ɰ<EFBFBD> <20>.
string* arInputString = StringSplit(inputString, "|"); //프로토 정보 내용을 단어별로 쪼갠 배열.
for(int i =0;i<sizeof(arImmune)/sizeof(arImmune[0]);i++) {
string tempString = arImmune[i];
for (int j=0; j<30 ; j++) //<EFBFBD>ִ<EFBFBD> 30<33><30> <20>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD><EFBFBD>. (<28>ϵ<EFBFBD><CFB5>ڵ<EFBFBD>)
for (int j=0; j<30 ; j++) //최대 30개 단어까지. (하드코딩)
{
string tempString2 = arInputString[j];
if (tempString2.compare(tempString)==0) { //<EFBFBD><EFBFBD>ġ<EFBFBD>ϴ<EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE>.
if (tempString2.compare(tempString)==0) { //일치하는지 확인.
retValue = retValue + pow((float)2,(float)i);
}
@ -414,7 +414,7 @@ int get_Item_ApplyType_Value(string inputString)
}
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><20>д´<D0B4>.
//몬스터 프로토도 읽는다.
int get_Mob_Rank_Value(string inputString)
@ -508,13 +508,13 @@ int get_Mob_AIFlag_Value(string inputString)
int retValue = 0;
string* arInputString = StringSplit(inputString, ","); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ܾ<DCBE><EEBAB0> <20>ɰ<EFBFBD> <20>.
string* arInputString = StringSplit(inputString, ","); //프로토 정보 내용을 단어별로 쪼갠 배열.
for(int i =0;i<sizeof(arAIFlag)/sizeof(arAIFlag[0]);i++) {
string tempString = arAIFlag[i];
for (int j=0; j<30 ; j++) //<EFBFBD>ִ<EFBFBD> 30<33><30> <20>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD><EFBFBD>. (<28>ϵ<EFBFBD><CFB5>ڵ<EFBFBD>)
for (int j=0; j<30 ; j++) //최대 30개 단어까지. (하드코딩)
{
string tempString2 = arInputString[j];
if (tempString2.compare(tempString)==0) { //<EFBFBD><EFBFBD>ġ<EFBFBD>ϴ<EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE>.
if (tempString2.compare(tempString)==0) { //일치하는지 확인.
retValue = retValue + pow((float)2,(float)i);
}
@ -533,13 +533,13 @@ int get_Mob_RaceFlag_Value(string inputString)
"ATT_ELEC","ATT_FIRE","ATT_ICE","ATT_WIND","ATT_EARTH","ATT_DARK"};
int retValue = 0;
string* arInputString = StringSplit(inputString, ","); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ܾ<DCBE><EEBAB0> <20>ɰ<EFBFBD> <20>.
string* arInputString = StringSplit(inputString, ","); //프로토 정보 내용을 단어별로 쪼갠 배열.
for(int i =0;i<sizeof(arRaceFlag)/sizeof(arRaceFlag[0]);i++) {
string tempString = arRaceFlag[i];
for (int j=0; j<30 ; j++) //<EFBFBD>ִ<EFBFBD> 30<33><30> <20>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD><EFBFBD>. (<28>ϵ<EFBFBD><CFB5>ڵ<EFBFBD>)
for (int j=0; j<30 ; j++) //최대 30개 단어까지. (하드코딩)
{
string tempString2 = arInputString[j];
if (tempString2.compare(tempString)==0) { //<EFBFBD><EFBFBD>ġ<EFBFBD>ϴ<EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE>.
if (tempString2.compare(tempString)==0) { //일치하는지 확인.
retValue = retValue + pow((float)2,(float)i);
}
@ -557,13 +557,13 @@ int get_Mob_ImmuneFlag_Value(string inputString)
string arImmuneFlag[] = {"STUN","SLOW","FALL","CURSE","POISON","TERROR", "REFLECT"};
int retValue = 0;
string* arInputString = StringSplit(inputString, ","); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ܾ<DCBE><EEBAB0> <20>ɰ<EFBFBD> <20>.
string* arInputString = StringSplit(inputString, ","); //프로토 정보 내용을 단어별로 쪼갠 배열.
for(int i =0;i<sizeof(arImmuneFlag)/sizeof(arImmuneFlag[0]);i++) {
string tempString = arImmuneFlag[i];
for (int j=0; j<30 ; j++) //<EFBFBD>ִ<EFBFBD> 30<33><30> <20>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD><EFBFBD>. (<28>ϵ<EFBFBD><CFB5>ڵ<EFBFBD>)
for (int j=0; j<30 ; j++) //최대 30개 단어까지. (하드코딩)
{
string tempString2 = arInputString[j];
if (tempString2.compare(tempString)==0) { //<EFBFBD><EFBFBD>ġ<EFBFBD>ϴ<EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE>.
if (tempString2.compare(tempString)==0) { //일치하는지 확인.
retValue = retValue + pow((float)2,(float)i);
}
@ -581,14 +581,14 @@ int get_Mob_ImmuneFlag_Value(string inputString)
#ifndef __DUMP_PROTO__
//<EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
//몹 테이블을 셋팅해준다.
bool Set_Proto_Mob_Table(TMobTable *mobTable, cCsvTable &csvTable,std::map<int,const char*> &nameMap)
{
int col = 0;
str_to_number(mobTable->dwVnum, csvTable.AsStringByIndex(col++));
strlcpy(mobTable->szName, csvTable.AsStringByIndex(col++), sizeof(mobTable->szName));
//3. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD> <20>־<EFBFBD><D6BE>ֱ<EFBFBD>.
//3. 지역별 이름 넣어주기.
map<int,const char*>::iterator it;
it = nameMap.find(mobTable->dwVnum);
if (it != nameMap.end()) {
@ -683,7 +683,7 @@ bool Set_Proto_Mob_Table(TMobTable *mobTable, cCsvTable &csvTable,std::map<int,c
str_to_number(mobTable->bDeathBlowPoint, csvTable.AsStringByIndex(col++));
str_to_number(mobTable->bRevivePoint, csvTable.AsStringByIndex(col++));
sys_log(0, "MOB #%-5d %-24s level: %-3u rank: %u empire: %d", mobTable->dwVnum, mobTable->szLocaleName, mobTable->bLevel, mobTable->bRank, mobTable->bEmpire);
SPDLOG_TRACE("MOB #{:<5} {:24} level: {:<3} rank: {} empire: {}", mobTable->dwVnum, mobTable->szLocaleName, mobTable->bLevel, mobTable->bRank, mobTable->bEmpire);
return true;
}
@ -739,9 +739,9 @@ bool Set_Proto_Item_Table(TItemTable *itemTable, cCsvTable &csvTable,std::map<in
for (int j = 0; j < i; ++j)
dataStream << dataArray[j] << ",";
//fprintf(stderr, "ItemProto Reading Failed : Invalid value.\n");
sys_err("ItemProto Reading Failed : Invalid value. (index: %d, col: %d, value: %s)", i, col, csvTable.AsStringByIndex(col));
sys_err("\t%d ~ %d Values: %s", 0, i, dataStream.str().c_str());
//SPDLOG_ERROR("ItemProto Reading Failed : Invalid value.");
SPDLOG_ERROR("ItemProto Reading Failed : Invalid value. (index: {}, col: {}, value: {})", i, col, csvTable.AsStringByIndex(col));
SPDLOG_ERROR("\t{} ~ {} Values: {}", 0, i, dataStream.str().c_str());
exit(0);
}
@ -749,11 +749,11 @@ bool Set_Proto_Item_Table(TItemTable *itemTable, cCsvTable &csvTable,std::map<in
col = col + 1;
}
// vnum <EFBFBD><EFBFBD> vnum range <EFBFBD>б<EFBFBD>.
// vnum vnum range 읽기.
{
std::string s(csvTable.AsStringByIndex(0));
int pos = s.find("~");
// vnum <EFBFBD>ʵ忡 '~'<EFBFBD><EFBFBD> <20><><EFBFBD>ٸ<EFBFBD> <20>н<EFBFBD>
// vnum 필드에 '~'가 없다면 패스
if (std::string::npos == pos)
{
itemTable->dwVnum = dataArray[0];
@ -768,7 +768,7 @@ bool Set_Proto_Item_Table(TItemTable *itemTable, cCsvTable &csvTable,std::map<in
int end_vnum = atoi(s_end_vnum.c_str());
if (0 == start_vnum || (0 != end_vnum && end_vnum < start_vnum))
{
sys_err ("INVALID VNUM %s", s.c_str());
SPDLOG_ERROR("INVALID VNUM {}", s.c_str());
return false;
}
itemTable->dwVnum = start_vnum;
@ -777,7 +777,7 @@ bool Set_Proto_Item_Table(TItemTable *itemTable, cCsvTable &csvTable,std::map<in
}
strlcpy(itemTable->szName, csvTable.AsStringByIndex(1), sizeof(itemTable->szName));
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD> <20>־<EFBFBD><D6BE>ֱ<EFBFBD>.
//지역별 이름 넣어주기.
map<int,const char*>::iterator it;
it = nameMap.find(itemTable->dwVnum);
if (it != nameMap.end()) {

View File

@ -6,8 +6,8 @@
#include "CsvReader.h"
//csv <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE>ͼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD> <20>־<EFBFBD><D6BE>ش<EFBFBD>.
void putItemIntoTable(); //(<EFBFBD><EFBFBD><EFBFBD>̺<EFBFBD>, <20>׽<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD>)
//csv 파일을 읽어와서 아이템 테이블에 넣어준다.
void putItemIntoTable(); //(테이블, 테스트여부)
int get_Item_Type_Value(std::string inputString);
int get_Item_SubType_Value(int type_value, std::string inputString);
@ -19,7 +19,7 @@ int get_Item_LimitType_Value(std::string inputString);
int get_Item_ApplyType_Value(std::string inputString);
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD>.
//몬스터 프로토도 읽을 수 있다.
int get_Mob_Rank_Value(std::string inputString);
int get_Mob_Type_Value(std::string inputString);
int get_Mob_BattleType_Value(std::string inputString);

View File

@ -2,7 +2,7 @@
#define __INC_METIN_II_DB_QID_H__
/**
* @version 05/06/10 Bang2ni - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD>(QID_ITEMPRICE_XXX)
* @version 05/06/10 Bang2ni - 아이템 가격정보 쿼리 추가(QID_ITEMPRICE_XXX)
*/
enum QID
{
@ -20,19 +20,18 @@ enum QID
QID_ITEM_DESTROY, // 11
QID_QUEST_SAVE, // 12
QID_PLAYER_SAVE, // 13
QID_HIGHSCORE_REGISTER, // 14
QID_PLAYER_DELETE, // 15
QID_LOGIN_BY_KEY, // 16
QID_PLAYER_INDEX_CREATE, // 17
QID_ITEM_AWARD_LOAD, // 18
QID_ITEM_AWARD_TAKEN, // 19
QID_GUILD_RANKING, // 20
QID_PLAYER_DELETE, // 14
QID_LOGIN_BY_KEY, // 15
QID_PLAYER_INDEX_CREATE, // 16
QID_ITEM_AWARD_LOAD, // 17
QID_ITEM_AWARD_TAKEN, // 18
QID_GUILD_RANKING, // 19
// MYSHOP_PRICE_LIST
QID_ITEMPRICE_SAVE, ///< 21, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
QID_ITEMPRICE_DESTROY, ///< 22, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
QID_ITEMPRICE_LOAD_FOR_UPDATE, ///< 23, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD>
QID_ITEMPRICE_LOAD, ///< 24, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><><EFBFBD><EFBFBD>
QID_ITEMPRICE_SAVE, ///< 20, 아이템 가격정보 저장 쿼리
QID_ITEMPRICE_DESTROY, ///< 21, 아이템 가격정보 저장 쿼리
QID_ITEMPRICE_LOAD_FOR_UPDATE, ///< 22, 가격정보 업데이트를 위한 아이템 가격정보 로드 쿼리
QID_ITEMPRICE_LOAD, ///< 22, 아이템 가격정보 로드 쿼리
// END_OF_MYSHOP_PRICE_LIST
};

View File

@ -28,7 +28,7 @@ void CGrid::Clear()
int CGrid::FindBlank(int w, int h)
{
// ũ<EFBFBD><20><> ũ<>ٸ<EFBFBD> Ȯ<><C8AE><EFBFBD><EFBFBD> <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>׳<EFBFBD> <20><><EFBFBD><EFBFBD>
// 크기가 더 크다면 확인할 필요 없이 그냥 리턴
if (w > m_iWidth || h > m_iHeight)
return -1;
@ -86,7 +86,7 @@ bool CGrid::IsEmpty(int iPos, int w, int h)
{
int iRow = iPos / m_iWidth;
// Grid <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΰ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>˻<EFBFBD>
// Grid 안쪽인가를 먼저 검사
if (iRow + h > m_iHeight)
return false;

View File

@ -1,15 +1,8 @@
#include <fmt/core.h>
#include <version.h>
void WriteVersion(std::ostream& out) {
out << "Metin2 DB Cache version " << __COMMIT_TAG__ << " "
<< "(rev. " << __REVISION__ << ", date: " << __COMMIT_DATE__ << ")"
<< std::endl;
out << "OS: " << __OS_NAME__ << ", "
<< "target arch: " << __CPU_TARGET__ << ", "
<< "compiler: " << __COMPILER__
<< std::endl;
out << std::endl;
void WriteVersion() {
fmt::println("Metin2 DB Cache version {} (rev. {}, date: {})", __COMMIT_TAG__, __REVISION__, __COMMIT_DATE__);
fmt::println("OS: {}, target arch: {}, compiler: {}", __OS_NAME__, __CPU_TARGET__, __COMPILER__);
}

View File

@ -3,15 +3,29 @@ cmake_minimum_required(VERSION 3.8)
project(game CXX)
file(GLOB_RECURSE sources
src/*.cpp src/*.h
src/*.cpp src/*.h
)
# Add the src directory to the include path
include_directories(src)
add_executable(${PROJECT_NAME} ${sources})
# Set the default log level based on the build type
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
message(STATUS "This is a debug build. Log level will be set to 'trace' for target '${PROJECT_NAME}'.")
target_compile_definitions(${PROJECT_NAME} PRIVATE SPDLOG_ACTIVE_LEVEL=SPDLOG_LEVEL_TRACE)
endif()
# Treat char variables as signed, especially useful for ARM builds
target_compile_options(${PROJECT_NAME} PUBLIC -fsigned-char)
# Find dependencies
#
# vcpkg dependencies
#
# MySQL
find_package(unofficial-libmysql REQUIRED)
target_link_libraries(${PROJECT_NAME} unofficial::libmysql::libmysql)
@ -28,11 +42,6 @@ target_link_libraries (${PROJECT_NAME} Boost::boost)
find_package(Libevent CONFIG REQUIRED)
target_link_libraries(${PROJECT_NAME} libevent::core libevent::extra libevent::pthreads)
# DevIL
find_package(DevIL REQUIRED)
include_directories(${IL_INCLUDE_DIR})
target_link_libraries(${PROJECT_NAME} ${IL_LIBRARIES})
# LZO
find_package(LZO REQUIRED)
if (LZO_FOUND)
@ -40,6 +49,19 @@ if (LZO_FOUND)
target_link_libraries(${PROJECT_NAME} ${LZO_LIBRARIES})
endif (LZO_FOUND)
# effolkronium/random
find_package(effolkronium_random CONFIG REQUIRED)
target_link_libraries(${PROJECT_NAME} effolkronium_random)
#
# System-provided dependencies
#
# DevIL
find_package(DevIL REQUIRED)
include_directories(${IL_INCLUDE_DIR})
target_link_libraries(${PROJECT_NAME} ${IL_LIBRARIES})
# Pthreads
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
@ -48,8 +70,8 @@ target_link_libraries(${PROJECT_NAME} Threads::Threads)
# LibBSD
target_link_libraries(${PROJECT_NAME} bsd)
# effolkronium/random
find_package(effolkronium_random CONFIG REQUIRED)
target_link_libraries(${PROJECT_NAME} effolkronium_random)
#
# Project-provided dependencies
#
target_link_libraries(${PROJECT_NAME} libgame libpoly libsql libthecore liblua)

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