Compare commits

..

20 commits

Author SHA1 Message Date
Koncord
4225cbae02 [General] Add comments to false-positive PVS messages 2019-01-04 13:03:31 +08:00
Koncord
5282541d3a [General] Add ENABLE_PVS option to CMake 2019-01-03 23:34:31 +08:00
Koncord
9b6bdf3ae8 [General] Fix minor warnings found by PVS 2019-01-03 12:23:23 +08:00
Koncord
6b3b5cdab4 [General] Fix warnings and errors found by PVS Studio in Server 2019-01-03 07:36:07 +08:00
Koncord
1248741da6 [General] Add PVS Studio macros 2019-01-03 05:50:17 +08:00
Koncord
796717bab0 [General] Update LuaBridge to 3154e94487dedc84f038c5787985ddc01a95d126 2019-01-03 04:55:51 +08:00
Koncord
af228c0539 [Server] Fix mono_free_method(NULL) error 2019-01-03 04:26:01 +08:00
Koncord
9d58b2459d [Server] Fix GCC 8 build 2019-01-03 04:21:29 +08:00
Koncord
30eaabb7ce [Server] Do not export all symbols 2019-01-03 04:20:03 +08:00
Koncord
e766c6fb01 [Server] Fix order of CDECL 2019-01-03 03:01:09 +08:00
Koncord
7bbf81b74d [Server] Fix rebase conflicts 2019-01-03 02:50:38 +08:00
Koncord
10d7e68dd5 [Server] Add Windows support for Mono API 2019-01-03 02:47:29 +08:00
Koncord
fba99071f8 [Server] Fix warnings 2019-01-03 02:46:16 +08:00
Koncord
20b328ec67 [Server] Mark Mono headers as SYSTEM 2019-01-03 02:46:16 +08:00
Koncord
447a0ee8b2 [Server] Implement Public API for Mono 2019-01-03 02:46:16 +08:00
Koncord
6cbf6f05a1 [Server] Add --debug option to launch options.
Add Soft-Mode Debugger for Mono.
2019-01-03 02:46:16 +08:00
Koncord
f37c252dbe [Server] Add timers support to Mono 2019-01-03 02:42:35 +08:00
Koncord
4601884931 [Server] Properly load Mono libraries 2019-01-03 02:42:35 +08:00
Koncord
c36b692e91 [Server] Trait all API functions as "extern C"
Move Timer & Public functions to Script/Functions
2019-01-03 02:42:35 +08:00
Koncord
5840c7bba2 [Server] Init mono branch 2019-01-03 02:37:02 +08:00
172 changed files with 4942 additions and 5357 deletions

View file

@ -4,7 +4,7 @@ os:
osx_image: xcode9.4 osx_image: xcode9.4
language: cpp language: cpp
sudo: required sudo: required
dist: xenial dist: trusty
branches: branches:
only: only:
- master - master
@ -15,18 +15,18 @@ env:
global: global:
# The next declaration is the encrypted COVERITY_SCAN_TOKEN, created # The next declaration is the encrypted COVERITY_SCAN_TOKEN, created
# via the "travis encrypt" command using the project repo's public key # via the "travis encrypt" command using the project repo's public key
- secure: 1QK0yVyoOB+gf2I7XzvhXu9w/5lq4stBXIwJbVCTjz4Q4XVHCosURaW1MAgKzMrPnbFEwjyn5uQ8BwsvvfkuN1AZD0YXITgc7gyI+J1wQ/p/ljxRxglakU6WEgsTs2J5z9UmGac4YTXg+quK7YP3rv+zuGim2I2rhzImejyzp0Ym3kRCnNcy+SGBsiRaevRJMe00Ch8zGAbEhduQGeSoS6W0rcu02DNlQKiq5NktWsXR+TWWWVfIeIlQR/lbPsCd0pdxMaMv2QCY0rVbwrYxWJwr/Qe45dAdWp+8/C3PbXpeMSGxlLa33nJNX4Lf/djxbjm8KWk6edaXPajrjR/0iwcpwq0jg2Jt6XfEdnJt35F1gpXlc04sxStjG45uloOKCFYT0wdhIO1Lq+hDP54wypQl+JInd5qC001O7pwhVxO36EgKWqo8HD+BqGDBwsNj2engy9Qcp3wO6G0rLBPB3CrZsk9wrHVv5cSiQSLMhId3Xviu3ZI2qEDA+kgTvxrKrsnMj4bILVCyG5Ka2Mj22wIDW9e8oIab9oTdujax3DTN1GkD6QuOAGzwDsNwGASsgfoeZ+FUhgM75RlBWGMilgkmnF7EJ0oAXLEpjtABnEr2d4qHv+y08kOuTDBLB9ExzCIj024dYYYNLZrqPKx0ncHuCMG2QNj2aJAJEZtj1rQ= - secure: NZmvVuA0O9NJXVQ12tXQZHDJC2mbFgYNFcsicw0DgW1It2Nk5hxIkF0pfu4/Z59mhQuOPgRVjl5b0FKy2Axh0gkWc1DJEXGwNaiW5lpTMNWR1LJG5rxa8LrDUpFkycpbzfAFuTUZu5z3iYVv64XzELvBuqNGhPMu1LeBnrlech0jFNjkR9p5qtJGWb8zYcPMCC57rig8a9g1ABoVYS6UXjrKpx0946ZLRsE5ukc9pXsypGwPmOMyfzZkxxzIqFaxoE5JIEdaJTWba/6Za315ozYYIi/N35ROI1YAv5GHRe/Iw9XAa4vQpbDzjM7ZSsZdTvvQsSU598gD2xC6jFUKSrpW6GZKwM2x236fZLGnOk5Uw7DUbG+AwpcEmxBwoy9PjBl9ZF3tJykI0gROewCy8MODhdsVMKr1HGIMVBIJySm/RnNqtoDbYV8mYnSl5b8rwJiCajoiR8Zuv4CIfGneeH1a3DOQDPH/qkDsU6ilzF4ANsBlMUUpgY653KBMBmTlNuVZSH527tnD7Fg6JgHVuSQkTbRa1vSkR7Zcre604RZcAoaEdbX3bhVDasPPghU/I742L0RH3oQNlR09pPBDZ8kG7ydl4aPHwpCWnvXNM1vgxtGvnYLztwrse7IoaRXRYiMFmrso78WhMWUDKgvY4wV9aeUu0DtnMezZVIQwCKg=
addons: addons:
apt: apt:
sources: sources:
- sourceline: 'ppa:openmw/openmw' - sourceline: 'ppa:openmw/openmw'
- sourceline: 'ppa:rakhimov/boost' - sourceline: 'ppa:rakhimov/boost'
- ubuntu-toolchain-r-test - ubuntu-toolchain-r-test
- llvm-toolchain-precise-3.8
packages: [ packages: [
# Dev # Dev
cmake, clang-6.0, libunshield-dev, libtinyxml-dev, cmake, clang-3.8, libunshield-dev, libtinyxml-dev,
g++-8, g++-6,
# Tests # Tests
libgtest-dev, google-mock, libgtest-dev, google-mock,
# Boost # Boost
@ -45,7 +45,7 @@ addons:
project: project:
name: "TES3MP/openmw-tes3mp" name: "TES3MP/openmw-tes3mp"
description: "<Your project description here>" description: "<Your project description here>"
notification_email: koncord@tes3mp.com notification_email: stas5978@gmail.com
build_command_prepend: "cmake . -DBUILD_UNITTESTS=FALSE -DBUILD_OPENCS=FALSE -DBUILD_BSATOOL=FALSE -DBUILD_ESMTOOL=FALSE -DBUILD_MWINIIMPORTER=FALSE -DBUILD_LAUNCHER=FALSE" build_command_prepend: "cmake . -DBUILD_UNITTESTS=FALSE -DBUILD_OPENCS=FALSE -DBUILD_BSATOOL=FALSE -DBUILD_ESMTOOL=FALSE -DBUILD_MWINIIMPORTER=FALSE -DBUILD_LAUNCHER=FALSE"
build_command: "make -j3" build_command: "make -j3"
branch_pattern: coverity_scan branch_pattern: coverity_scan
@ -53,21 +53,21 @@ matrix:
include: include:
- os: linux - os: linux
env: env:
- ANALYZE="scan-build-6.0 --use-cc clang-6.0 --use-c++ clang++-6.0 " - ANALYZE="scan-build-3.8 --use-cc clang-3.8 --use-c++ clang++-3.8 "
- MATRIX_CC="CC=clang-6.0 && CXX=clang++-6.0" - MATRIX_CC="CC=clang-3.8 && CXX=clang++-3.8"
compiler: clang compiler: clang
- os: linux - os: linux
env: env:
- MATRIX_CC="CC=gcc-8 && CXX=g++-8" - MATRIX_CC="CC=gcc-6 && CXX=g++-6"
- os: linux - os: linux
env: env:
- MATRIX_CC="CC=clang-6.0 && CXX=clang++-6.0" - MATRIX_CC="CC=clang-3.8 && CXX=clang++-3.8"
allow_failures: allow_failures:
- env: - env:
- MATRIX_CC="CC=clang-6.0 && CXX=clang++-6.0" - MATRIX_CC="CC=clang-3.8 && CXX=clang++-3.8"
- env: - env:
- ANALYZE="scan-build-6.0 --use-cc clang-6.0 --use-c++ clang++-6.0 " - ANALYZE="scan-build-3.8 --use-cc clang-3.8 --use-c++ clang++-3.8 "
- MATRIX_CC="CC=clang-6.0 && CXX=clang++-6.0" - MATRIX_CC="CC=clang-3.8 && CXX=clang++-3.8"
before_install: before_install:
- ./CI/before_install.${TRAVIS_OS_NAME}.sh - ./CI/before_install.${TRAVIS_OS_NAME}.sh

View file

@ -15,8 +15,19 @@ sudo ln -s /usr/src/gtest/build/libgtest.so /usr/lib/libgtest.so
sudo ln -s /usr/src/gtest/build/libgtest_main.so /usr/lib/libgtest_main.so sudo ln -s /usr/src/gtest/build/libgtest_main.so /usr/lib/libgtest_main.so
cd ~/ cd ~/
git clone https://github.com/TES3MP/CrabNet git clone https://github.com/TES3MP/RakNet
cd CrabNet cd RakNet
cmake . -DCRABNET_ENABLE_DLL=OFF -DCRABNET_ENABLE_SAMPLES=OFF -DCMAKE_BUILD_TYPE=Release cmake . -DRAKNET_ENABLE_DLL=OFF -DRAKNET_ENABLE_SAMPLES=OFF -DCMAKE_BUILD_TYPE=Release
make -j3 make -j3
cd ~/
git clone https://github.com/Koncord/CallFF
cd CallFF
mkdir build
cd build
cmake ../
make -j3
cd ~/
wget https://github.com/zdevito/terra/releases/download/release-2016-03-25/terra-Linux-x86_64-332a506.zip
unzip terra-Linux-x86_64-332a506.zip

View file

@ -9,7 +9,8 @@ if [ ! -z "${MATRIX_CC}" ]; then
eval "${MATRIX_CC}" eval "${MATRIX_CC}"
fi fi
export RAKNET_ROOT=~/CrabNet export RAKNET_ROOT=~/RakNet
export Terra_ROOT=~/terra-Linux-x86_64-332a506
export CODE_COVERAGE=0 export CODE_COVERAGE=0
if [ ! -z "${ANALYZE}" ]; then if [ ! -z "${ANALYZE}" ]; then
@ -35,5 +36,7 @@ ${ANALYZE}cmake .. \
-DBINDIR=/usr/games \ -DBINDIR=/usr/games \
-DCMAKE_BUILD_TYPE="None" \ -DCMAKE_BUILD_TYPE="None" \
-DUSE_SYSTEM_TINYXML=TRUE \ -DUSE_SYSTEM_TINYXML=TRUE \
-DRakNet_LIBRARY_RELEASE=~/CrabNet/lib/libRakNetLibStatic.a \ -DRakNet_LIBRARY_RELEASE=~/RakNet/lib/libRakNetLibStatic.a \
-DRakNet_LIBRARY_DEBUG=~/CrabNet/lib/libRakNetLibStatic.a -DRakNet_LIBRARY_DEBUG=~/RakNet/lib/libRakNetLibStatic.a \
-DCallFF_INCLUDES=~/CallFF/include \
-DCallFF_LIBRARY=~/CallFF/build/src/libcallff.a

View file

@ -16,6 +16,8 @@ option(BUILD_NIFTEST "build nif file tester" OFF)
option(BUILD_MYGUI_PLUGIN "build MyGUI plugin for OpenMW resources, to use with MyGUI tools" ON) option(BUILD_MYGUI_PLUGIN "build MyGUI plugin for OpenMW resources, to use with MyGUI tools" ON)
option(BUILD_DOCS "build documentation." OFF ) option(BUILD_DOCS "build documentation." OFF )
option(ENABLE_PVS "Enable PVS Studio Analyzer" FALSE)
if (NOT BUILD_LAUNCHER AND NOT BUILD_BROWSER AND NOT BUILD_OPENCS AND NOT BUILD_WIZARD) if (NOT BUILD_LAUNCHER AND NOT BUILD_BROWSER AND NOT BUILD_OPENCS AND NOT BUILD_WIZARD)
set(USE_QT FALSE) set(USE_QT FALSE)
else() else()
@ -79,6 +81,8 @@ endif(EXISTS ${PROJECT_SOURCE_DIR}/.git)
# Macros # Macros
include(OpenMWMacros) include(OpenMWMacros)
include(PVS-Studio.cmake)
# doxygen main page # doxygen main page
configure_file ("${OpenMW_SOURCE_DIR}/docs/mainpage.hpp.cmake" "${OpenMW_BINARY_DIR}/docs/mainpage.hpp") configure_file ("${OpenMW_SOURCE_DIR}/docs/mainpage.hpp.cmake" "${OpenMW_BINARY_DIR}/docs/mainpage.hpp")
@ -591,6 +595,7 @@ add_subdirectory (components)
# Apps and tools # Apps and tools
if (BUILD_OPENMW_MP) if (BUILD_OPENMW_MP)
add_subdirectory (extern/LuaBridge)
add_subdirectory( apps/openmw-mp ) add_subdirectory( apps/openmw-mp )
endif() endif()

545
PVS-Studio.cmake Executable file
View file

@ -0,0 +1,545 @@
# 2006-2008 (c) Viva64.com Team
# 2008-2018 (c) OOO "Program Verification Systems"
#
# Version 12
cmake_minimum_required(VERSION 2.8.12)
cmake_policy(SET CMP0054 NEW)
if (PVS_STUDIO_AS_SCRIPT)
# This code runs at build time.
# It executes pvs-studio-analyzer and propagates its return value.
set(in_cl_params FALSE)
set(additional_args)
foreach (arg ${PVS_STUDIO_COMMAND})
if (NOT in_cl_params)
if ("${arg}" STREQUAL "--cl-params")
set(in_cl_params TRUE)
endif ()
else ()
# A workaround for macOS frameworks (e.g. QtWidgets.framework)
# You can test this workaround on this project: https://github.com/easyaspi314/MidiEditor/tree/gba
if (APPLE AND "${arg}" MATCHES "^-I(.*)\\.framework$")
STRING(REGEX REPLACE "^-I(.*)\\.framework$" "\\1.framework" framework "${arg}")
if (IS_ABSOLUTE "${framework}")
get_filename_component(framework "${framework}" DIRECTORY)
list(APPEND additional_args "-iframework")
list(APPEND additional_args "${framework}")
endif ()
endif ()
endif ()
endforeach ()
execute_process(COMMAND ${PVS_STUDIO_COMMAND} ${additional_args}
ERROR_VARIABLE error
RESULT_VARIABLE result)
set(stderr_type "")
if (result)
set(stderr_type FATAL_ERROR)
endif ()
if (result OR error)
message(${stderr_type} "${error}")
endif ()
return()
endif ()
if (__PVS_STUDIO_INCLUDED)
return()
endif ()
set(__PVS_STUDIO_INCLUDED TRUE)
set(PVS_STUDIO_SCRIPT "${CMAKE_CURRENT_LIST_FILE}")
function(pvs_studio_log TEXT)
if (PVS_STUDIO_DEBUG)
message("PVS-Studio: ${TEXT}")
endif ()
endfunction()
function(pvs_studio_relative_path VAR ROOT FILEPATH)
set("${VAR}" "${FILEPATH}" PARENT_SCOPE)
if ("${FILEPATH}" MATCHES "^/.*$" OR "${FILEPATH}" MATCHES "^.:/.*$")
file(RELATIVE_PATH RPATH "${ROOT}" "${FILEPATH}")
if (NOT "${RPATH}" MATCHES "^\\.\\..*$")
set("${VAR}" "${RPATH}" PARENT_SCOPE)
endif ()
endif ()
endfunction()
function(pvs_studio_join_path VAR DIR1 DIR2)
if ("${DIR2}" MATCHES "^(/|~|.:/).*$" OR "${DIR1}" STREQUAL "")
set("${VAR}" "${DIR2}" PARENT_SCOPE)
else ()
set("${VAR}" "${DIR1}/${DIR2}" PARENT_SCOPE)
endif ()
endfunction()
macro(pvs_studio_append_flags_from_property CXX C DIR PREFIX)
if (NOT "${PROPERTY}" STREQUAL "NOTFOUND" AND NOT "${PROPERTY}" STREQUAL "PROPERTY-NOTFOUND")
foreach (PROP ${PROPERTY})
pvs_studio_join_path(PROP "${DIR}" "${PROP}")
if (APPLE AND "${PREFIX}" STREQUAL "-I" AND IS_ABSOLUTE "${PROP}" AND "${PROP}" MATCHES "\\.framework$")
get_filename_component(FRAMEWORK "${PROP}" DIRECTORY)
list(APPEND "${CXX}" "-iframework")
list(APPEND "${CXX}" "${FRAMEWORK}")
list(APPEND "${C}" "-iframework")
list(APPEND "${C}" "${FRAMEWORK}")
pvs_studio_log("framework: ${FRAMEWORK}")
elseif (NOT "${PROP}" STREQUAL "")
list(APPEND "${CXX}" "${PREFIX}${PROP}")
list(APPEND "${C}" "${PREFIX}${PROP}")
endif ()
endforeach ()
endif ()
endmacro()
macro(pvs_studio_append_standard_flag FLAGS STANDARD)
if ("${STANDARD}" MATCHES "^(99|11|14|17)$")
if ("${PVS_STUDIO_PREPROCESSOR}" MATCHES "gcc|clang")
list(APPEND "${FLAGS}" "-std=c++${STANDARD}")
endif ()
endif ()
endmacro()
function(pvs_studio_set_directory_flags DIRECTORY CXX C)
set(CXX_FLAGS "${${CXX}}")
set(C_FLAGS "${${C}}")
get_directory_property(PROPERTY DIRECTORY "${DIRECTORY}" INCLUDE_DIRECTORIES)
pvs_studio_append_flags_from_property(CXX_FLAGS C_FLAGS "${DIRECTORY}" "-I")
get_directory_property(PROPERTY DIRECTORY "${DIRECTORY}" COMPILE_DEFINITIONS)
pvs_studio_append_flags_from_property(CXX_FLAGS C_FLAGS "" "-D")
set("${CXX}" "${CXX_FLAGS}" PARENT_SCOPE)
set("${C}" "${C_FLAGS}" PARENT_SCOPE)
endfunction()
function(pvs_studio_set_target_flags TARGET CXX C)
set(CXX_FLAGS "${${CXX}}")
set(C_FLAGS "${${C}}")
set(prop_incdirs "$<TARGET_PROPERTY:${TARGET},INCLUDE_DIRECTORIES>")
list(APPEND CXX_FLAGS "$<$<BOOL:${prop_incdirs}>:-I$<JOIN:${prop_incdirs},$<SEMICOLON>-I>>")
list(APPEND C_FLAGS "$<$<BOOL:${prop_incdirs}>:-I$<JOIN:${prop_incdirs},$<SEMICOLON>-I>>")
set(prop_compdefs "$<TARGET_PROPERTY:${TARGET},COMPILE_DEFINITIONS>")
list(APPEND CXX_FLAGS "$<$<BOOL:${prop_compdefs}>:-D$<JOIN:${prop_compdefs},$<SEMICOLON>-D>>")
list(APPEND C_FLAGS "$<$<BOOL:${prop_compdefs}>:-D$<JOIN:${prop_compdefs},$<SEMICOLON>-D>>")
set("${CXX}" "${CXX_FLAGS}" PARENT_SCOPE)
set("${C}" "${C_FLAGS}" PARENT_SCOPE)
endfunction()
function(pvs_studio_set_source_file_flags SOURCE)
set(LANGUAGE "")
string(TOLOWER "${SOURCE}" SOURCE_LOWER)
if ("${LANGUAGE}" STREQUAL "" AND "${SOURCE_LOWER}" MATCHES "^.*\\.(c|cpp|cc|cx|cxx|cp|c\\+\\+)$")
if ("${SOURCE}" MATCHES "^.*\\.c$")
set(LANGUAGE C)
else ()
set(LANGUAGE CXX)
endif ()
endif ()
if ("${LANGUAGE}" STREQUAL "C")
set(CL_PARAMS ${PVS_STUDIO_C_FLAGS} ${PVS_STUDIO_TARGET_C_FLAGS} -DPVS_STUDIO)
elseif ("${LANGUAGE}" STREQUAL "CXX")
set(CL_PARAMS ${PVS_STUDIO_CXX_FLAGS} ${PVS_STUDIO_TARGET_CXX_FLAGS} -DPVS_STUDIO)
endif ()
set(PVS_STUDIO_LANGUAGE "${LANGUAGE}" PARENT_SCOPE)
set(PVS_STUDIO_CL_PARAMS "${CL_PARAMS}" PARENT_SCOPE)
endfunction()
function(pvs_studio_analyze_file SOURCE SOURCE_DIR BINARY_DIR)
set(PLOGS ${PVS_STUDIO_PLOGS})
pvs_studio_set_source_file_flags("${SOURCE}")
get_filename_component(SOURCE "${SOURCE}" REALPATH)
get_source_file_property(PROPERTY "${SOURCE}" HEADER_FILE_ONLY)
if (PROPERTY)
return()
endif ()
pvs_studio_relative_path(SOURCE_RELATIVE "${SOURCE_DIR}" "${SOURCE}")
pvs_studio_join_path(SOURCE "${SOURCE_DIR}" "${SOURCE}")
set(LOG "${BINARY_DIR}/PVS-Studio/${SOURCE_RELATIVE}.plog")
get_filename_component(LOG "${LOG}" REALPATH)
get_filename_component(PARENT_DIR "${LOG}" DIRECTORY)
if (EXISTS "${SOURCE}" AND NOT TARGET "${LOG}" AND NOT "${PVS_STUDIO_LANGUAGE}" STREQUAL "")
# A workaround to support implicit dependencies for ninja generators.
set(depPvsArg)
set(depCommandArg)
if (CMAKE_VERSION VERSION_GREATER 3.6 AND "${CMAKE_GENERATOR}" STREQUAL "Ninja")
pvs_studio_relative_path(relLog "${CMAKE_BINARY_DIR}" "${LOG}")
set(depPvsArg --dep-file "${LOG}.d" --dep-file-target "${relLog}")
set(depCommandArg DEPFILE "${LOG}.d")
endif ()
# https://public.kitware.com/Bug/print_bug_page.php?bug_id=14353
# https://public.kitware.com/Bug/file/5436/expand_command.cmake
#
# It is a workaround to expand generator expressions.
set(cmdline "${PVS_STUDIO_BIN}" analyze
--output-file "${LOG}"
--source-file "${SOURCE}"
${depPvsArg}
${PVS_STUDIO_ARGS}
--cl-params "${PVS_STUDIO_CL_PARAMS}" "${SOURCE}")
string(REPLACE ";" "$<SEMICOLON>" cmdline "${cmdline}")
set(pvscmd "${CMAKE_COMMAND}"
-D PVS_STUDIO_AS_SCRIPT=TRUE
-D "PVS_STUDIO_COMMAND=${cmdline}"
-P "${PVS_STUDIO_SCRIPT}"
)
add_custom_command(OUTPUT "${LOG}"
COMMAND "${CMAKE_COMMAND}" -E make_directory "${PARENT_DIR}"
COMMAND "${CMAKE_COMMAND}" -E remove_directory "${LOG}"
COMMAND ${pvscmd}
WORKING_DIRECTORY "${BINARY_DIR}"
DEPENDS "${SOURCE}" "${PVS_STUDIO_CONFIG}"
IMPLICIT_DEPENDS "${PVS_STUDIO_LANGUAGE}" "${SOURCE}"
${depCommandArg}
VERBATIM
COMMENT "Analyzing ${PVS_STUDIO_LANGUAGE} file ${SOURCE_RELATIVE}")
list(APPEND PLOGS "${LOG}")
endif ()
set(PVS_STUDIO_PLOGS "${PLOGS}" PARENT_SCOPE)
endfunction()
function(pvs_studio_analyze_target TARGET DIR)
set(PVS_STUDIO_PLOGS "${PVS_STUDIO_PLOGS}")
set(PVS_STUDIO_TARGET_CXX_FLAGS "")
set(PVS_STUDIO_TARGET_C_FLAGS "")
get_target_property(PROPERTY "${TARGET}" SOURCES)
pvs_studio_relative_path(BINARY_DIR "${CMAKE_SOURCE_DIR}" "${DIR}")
if ("${BINARY_DIR}" MATCHES "^/.*$")
pvs_studio_join_path(BINARY_DIR "${CMAKE_BINARY_DIR}" "PVS-Studio/__${BINARY_DIR}")
else ()
pvs_studio_join_path(BINARY_DIR "${CMAKE_BINARY_DIR}" "${BINARY_DIR}")
endif ()
file(MAKE_DIRECTORY "${BINARY_DIR}")
pvs_studio_set_directory_flags("${DIR}" PVS_STUDIO_TARGET_CXX_FLAGS PVS_STUDIO_TARGET_C_FLAGS)
pvs_studio_set_target_flags("${TARGET}" PVS_STUDIO_TARGET_CXX_FLAGS PVS_STUDIO_TARGET_C_FLAGS)
if (NOT "${PROPERTY}" STREQUAL "NOTFOUND" AND NOT "${PROPERTY}" STREQUAL "PROPERTY-NOTFOUND")
foreach (SOURCE ${PROPERTY})
pvs_studio_join_path(SOURCE "${DIR}" "${SOURCE}")
pvs_studio_analyze_file("${SOURCE}" "${DIR}" "${BINARY_DIR}")
endforeach ()
endif ()
set(PVS_STUDIO_PLOGS "${PVS_STUDIO_PLOGS}" PARENT_SCOPE)
endfunction()
set(PVS_STUDIO_RECURSIVE_TARGETS)
set(PVS_STUDIO_RECURSIVE_TARGETS_NEW)
macro(pvs_studio_get_recursive_targets TARGET)
get_target_property(libs "${TARGET}" LINK_LIBRARIES)
foreach (lib IN LISTS libs)
list(FIND PVS_STUDIO_RECURSIVE_TARGETS "${lib}" index)
if (TARGET "${lib}" AND "${index}" STREQUAL -1)
get_target_property(target_type "${lib}" TYPE)
if (NOT "${target_type}" STREQUAL "INTERFACE_LIBRARY")
list(APPEND PVS_STUDIO_RECURSIVE_TARGETS "${lib}")
list(APPEND PVS_STUDIO_RECURSIVE_TARGETS_NEW "${lib}")
pvs_studio_get_recursive_targets("${lib}")
endif ()
endif ()
endforeach ()
endmacro()
option(PVS_STUDIO_DISABLE OFF "Disable PVS-Studio targets")
option(PVS_STUDIO_DEBUG OFF "Add debug info")
# pvs_studio_add_target
# Target options:
# ALL add this target to default build (default: off)
# TARGET target name of analysis target (default: pvs)
# ANALYZE targets... targets to analyze
# RECURSIVE analyze target's dependencies (requires CMake 3.5+)
# COMPILE_COMMANDS use compile_commands.json mode
#
# Output options:
# OUTPUT prints report to stdout
# LOG path path to report (default: ${CMAKE_CURRENT_BINARY_DIR}/PVS-Studio.log)
# FORMAT format format of report
# MODE mode analyzers/levels filter (default: GA:1,2)
# HIDE_HELP do not print help message
#
# Analyzer options:
# PLATFORM name linux32/linux64 (default: linux64)
# PREPROCESSOR name preprocessor type: gcc/clang (default: auto detected)
# LICENSE path path to PVS-Studio.lic (default: ~/.config/PVS-Studio/PVS-Studio.lic)
# CONFIG path path to PVS-Studio.cfg
# CFG_TEXT text embedded PVS-Studio.cfg
# KEEP_COMBINED_PLOG do not delete combined plog file *.pvs.raw for further processing with plog-converter
#
# Misc options:
# DEPENDS targets.. additional target dependencies
# SOURCES path... list of source files to analyze
# BIN path path to pvs-studio-analyzer (Unix) or CompilerCommandsAnalyzer.exe (Windows)
# CONVERTER path path to plog-converter (Unix) or HtmlGenerator.exe (Windows)
# C_FLAGS flags... additional C_FLAGS
# CXX_FLAGS flags... additional CXX_FLAGS
# ARGS args... additional pvs-studio-analyzer/CompilerCommandsAnalyzer.exe flags
function(pvs_studio_add_target)
macro(default VAR VALUE)
if ("${${VAR}}" STREQUAL "")
set("${VAR}" "${VALUE}")
endif ()
endmacro()
set(PVS_STUDIO_SUPPORTED_PREPROCESSORS "gcc|clang|visualcpp")
if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
set(DEFAULT_PREPROCESSOR "clang")
elseif (MSVC)
set(DEFAULT_PREPROCESSOR "visualcpp")
else ()
set(DEFAULT_PREPROCESSOR "gcc")
endif ()
set(OPTIONAL OUTPUT ALL RECURSIVE HIDE_HELP KEEP_COMBINED_PLOG COMPILE_COMMANDS)
set(SINGLE LICENSE CONFIG TARGET LOG FORMAT BIN CONVERTER PLATFORM PREPROCESSOR CFG_TEXT)
set(MULTI SOURCES C_FLAGS CXX_FLAGS ARGS DEPENDS ANALYZE MODE)
cmake_parse_arguments(PVS_STUDIO "${OPTIONAL}" "${SINGLE}" "${MULTI}" ${ARGN})
if ("${PVS_STUDIO_CONFIG}" STREQUAL "" OR NOT "${PVS_STUDIO_CFG_TEXT}" STREQUAL "")
set(PVS_STUDIO_EMPTY_CONFIG ON)
else ()
set(PVS_STUDIO_EMPTY_CONFIG OFF)
endif ()
default(PVS_STUDIO_CFG_TEXT "analysis-mode=31")
default(PVS_STUDIO_CONFIG "${CMAKE_BINARY_DIR}/PVS-Studio.cfg")
default(PVS_STUDIO_C_FLAGS "")
default(PVS_STUDIO_CXX_FLAGS "")
default(PVS_STUDIO_TARGET "pvs")
default(PVS_STUDIO_LOG "PVS-Studio.log")
set(PATHS)
if (WIN32)
set(ROOT "PROGRAMFILES(X86)")
set(ROOT "$ENV{${ROOT}}/PVS-Studio")
string(REPLACE \\ / ROOT "${ROOT}")
if (EXISTS "${ROOT}")
set(PATHS "${ROOT}")
endif ()
default(PVS_STUDIO_BIN "CompilerCommandsAnalyzer.exe")
default(PVS_STUDIO_CONVERTER "HtmlGenerator.exe")
else ()
default(PVS_STUDIO_BIN "pvs-studio-analyzer")
default(PVS_STUDIO_CONVERTER "plog-converter")
endif ()
find_program(PVS_STUDIO_BIN_PATH "${PVS_STUDIO_BIN}" ${PATHS})
set(PVS_STUDIO_BIN "${PVS_STUDIO_BIN_PATH}")
if (NOT EXISTS "${PVS_STUDIO_BIN}")
message(FATAL_ERROR "pvs-studio-analyzer is not found")
endif ()
find_program(PVS_STUDIO_CONVERTER_PATH "${PVS_STUDIO_CONVERTER}" ${PATHS})
set(PVS_STUDIO_CONVERTER "${PVS_STUDIO_CONVERTER_PATH}")
if (NOT EXISTS "${PVS_STUDIO_CONVERTER}")
message(FATAL_ERROR "plog-converter is not found")
endif ()
default(PVS_STUDIO_MODE "GA:1,2")
default(PVS_STUDIO_PREPROCESSOR "${DEFAULT_PREPROCESSOR}")
if (WIN32)
default(PVS_STUDIO_PLATFORM "x64")
else ()
default(PVS_STUDIO_PLATFORM "linux64")
endif ()
string(REPLACE ";" "+" PVS_STUDIO_MODE "${PVS_STUDIO_MODE}")
if (PVS_STUDIO_EMPTY_CONFIG)
set(PVS_STUDIO_CONFIG_COMMAND "${CMAKE_COMMAND}" -E echo "${PVS_STUDIO_CFG_TEXT}" > "${PVS_STUDIO_CONFIG}")
else ()
set(PVS_STUDIO_CONFIG_COMMAND "${CMAKE_COMMAND}" -E touch "${PVS_STUDIO_CONFIG}")
endif ()
add_custom_command(OUTPUT "${PVS_STUDIO_CONFIG}"
COMMAND ${PVS_STUDIO_CONFIG_COMMAND}
WORKING_DIRECTORY "${BINARY_DIR}"
COMMENT "Generating PVS-Studio.cfg")
if (NOT "${PVS_STUDIO_PREPROCESSOR}" MATCHES "^${PVS_STUDIO_SUPPORTED_PREPROCESSORS}$")
message(FATAL_ERROR "Preprocessor ${PVS_STUDIO_PREPROCESSOR} isn't supported. Available options: ${PVS_STUDIO_SUPPORTED_PREPROCESSORS}.")
endif ()
pvs_studio_append_standard_flag(PVS_STUDIO_CXX_FLAGS "${CMAKE_CXX_STANDARD}")
pvs_studio_set_directory_flags("${CMAKE_CURRENT_SOURCE_DIR}" PVS_STUDIO_CXX_FLAGS PVS_STUDIO_C_FLAGS)
if (NOT "${PVS_STUDIO_LICENSE}" STREQUAL "")
pvs_studio_join_path(PVS_STUDIO_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}" "${PVS_STUDIO_LICENSE}")
list(APPEND PVS_STUDIO_ARGS --lic-file "${PVS_STUDIO_LICENSE}")
endif ()
list(APPEND PVS_STUDIO_ARGS --cfg "${PVS_STUDIO_CONFIG}"
--platform "${PVS_STUDIO_PLATFORM}"
--preprocessor "${PVS_STUDIO_PREPROCESSOR}")
if (NOT "${CMAKE_CXX_COMPILER}" STREQUAL "")
list(APPEND PVS_STUDIO_ARGS --cxx "${CMAKE_CXX_COMPILER}")
endif ()
if (NOT "${CMAKE_C_COMPILER}" STREQUAL "")
list(APPEND PVS_STUDIO_ARGS --cc "${CMAKE_C_COMPILER}")
endif ()
set(PVS_STUDIO_PLOGS "")
set(PVS_STUDIO_RECURSIVE_TARGETS_NEW)
if (${PVS_STUDIO_RECURSIVE})
foreach (TARGET IN LISTS PVS_STUDIO_ANALYZE)
list(APPEND PVS_STUDIO_RECURSIVE_TARGETS_NEW "${TARGET}")
pvs_studio_get_recursive_targets("${TARGET}")
endforeach ()
endif ()
set(inc_path)
foreach (TARGET ${PVS_STUDIO_ANALYZE})
set(DIR "${CMAKE_CURRENT_SOURCE_DIR}")
string(FIND "${TARGET}" ":" DELIM)
if ("${DELIM}" GREATER "-1")
math(EXPR DELIMI "${DELIM}+1")
string(SUBSTRING "${TARGET}" "${DELIMI}" "-1" DIR)
string(SUBSTRING "${TARGET}" "0" "${DELIM}" TARGET)
pvs_studio_join_path(DIR "${CMAKE_CURRENT_SOURCE_DIR}" "${DIR}")
else ()
get_target_property(TARGET_SOURCE_DIR "${TARGET}" SOURCE_DIR)
if (EXISTS "${TARGET_SOURCE_DIR}")
set(DIR "${TARGET_SOURCE_DIR}")
endif ()
endif ()
pvs_studio_analyze_target("${TARGET}" "${DIR}")
list(APPEND PVS_STUDIO_DEPENDS "${TARGET}")
if ("${inc_path}" STREQUAL "")
set(inc_path "$<TARGET_PROPERTY:${TARGET},INCLUDE_DIRECTORIES>")
else ()
set(inc_path "${inc_path}$<SEMICOLON>$<TARGET_PROPERTY:${TARGET},INCLUDE_DIRECTORIES>")
endif ()
endforeach ()
foreach (TARGET ${PVS_STUDIO_RECURSIVE_TARGETS_NEW})
set(DIR "${CMAKE_CURRENT_SOURCE_DIR}")
get_target_property(TARGET_SOURCE_DIR "${TARGET}" SOURCE_DIR)
if (EXISTS "${TARGET_SOURCE_DIR}")
set(DIR "${TARGET_SOURCE_DIR}")
endif ()
pvs_studio_analyze_target("${TARGET}" "${DIR}")
list(APPEND PVS_STUDIO_DEPENDS "${TARGET}")
endforeach ()
set(PVS_STUDIO_TARGET_CXX_FLAGS "")
set(PVS_STUDIO_TARGET_C_FLAGS "")
foreach (SOURCE ${PVS_STUDIO_SOURCES})
pvs_studio_analyze_file("${SOURCE}" "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}")
endforeach ()
if (PVS_STUDIO_COMPILE_COMMANDS)
set(COMPILE_COMMANDS_LOG "${PVS_STUDIO_LOG}.pvs.analyzer.raw")
if (NOT CMAKE_EXPORT_COMPILE_COMMANDS)
message(FATAL_ERROR "You should set CMAKE_EXPORT_COMPILE_COMMANDS to TRUE")
endif ()
add_custom_command(
OUTPUT "${COMPILE_COMMANDS_LOG}"
COMMAND "${PVS_STUDIO_BIN}" analyze -i
--output-file "${COMPILE_COMMANDS_LOG}.always"
${PVS_STUDIO_ARGS}
COMMENT "Analyzing with PVS-Studio"
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
DEPENDS "${PVS_STUDIO_CONFIG}"
)
list(APPEND PVS_STUDIO_PLOGS_LOGS "${COMPILE_COMMANDS_LOG}.always")
list(APPEND PVS_STUDIO_PLOGS_DEPENDENCIES "${COMPILE_COMMANDS_LOG}")
endif ()
pvs_studio_relative_path(LOG_RELATIVE "${CMAKE_BINARY_DIR}" "${PVS_STUDIO_LOG}")
if (PVS_STUDIO_PLOGS OR PVS_STUDIO_COMPILE_COMMANDS)
if (WIN32)
string(REPLACE / \\ PVS_STUDIO_PLOGS "${PVS_STUDIO_PLOGS}")
endif ()
if (WIN32)
set(COMMANDS COMMAND type ${PVS_STUDIO_PLOGS} ${PVS_STUDIO_PLOGS_LOGS} > "${PVS_STUDIO_LOG}")
else ()
set(COMMANDS COMMAND cat ${PVS_STUDIO_PLOGS} ${PVS_STUDIO_PLOGS_LOGS} > "${PVS_STUDIO_LOG}")
endif ()
set(COMMENT "Generating ${LOG_RELATIVE}")
if (NOT "${PVS_STUDIO_FORMAT}" STREQUAL "" OR PVS_STUDIO_OUTPUT)
if ("${PVS_STUDIO_FORMAT}" STREQUAL "")
set(PVS_STUDIO_FORMAT "errorfile")
endif ()
list(APPEND COMMANDS
COMMAND "${CMAKE_COMMAND}" -E remove -f "${PVS_STUDIO_LOG}.pvs.raw"
COMMAND "${CMAKE_COMMAND}" -E rename "${PVS_STUDIO_LOG}" "${PVS_STUDIO_LOG}.pvs.raw"
COMMAND "${PVS_STUDIO_CONVERTER}" -t "${PVS_STUDIO_FORMAT}" "${PVS_STUDIO_LOG}.pvs.raw" -o "${PVS_STUDIO_LOG}" -a "${PVS_STUDIO_MODE}"
)
if (NOT PVS_STUDIO_KEEP_COMBINED_PLOG)
list(APPEND COMMANDS COMMAND "${CMAKE_COMMAND}" -E remove -f "${PVS_STUDIO_LOG}.pvs.raw")
endif ()
endif ()
else ()
set(COMMANDS COMMAND "${CMAKE_COMMAND}" -E touch "${PVS_STUDIO_LOG}")
set(COMMENT "Generating ${LOG_RELATIVE}: no sources found")
endif ()
if (WIN32)
string(REPLACE / \\ PVS_STUDIO_LOG "${PVS_STUDIO_LOG}")
endif ()
add_custom_command(OUTPUT "${PVS_STUDIO_LOG}"
${COMMANDS}
COMMENT "${COMMENT}"
DEPENDS ${PVS_STUDIO_PLOGS} ${PVS_STUDIO_PLOGS_DEPENDENCIES}
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}")
if (PVS_STUDIO_ALL)
set(ALL "ALL")
else ()
set(ALL "")
endif ()
if (PVS_STUDIO_OUTPUT)
if (PVS_STUDIO_HIDE_HELP AND NOT WIN32)
set(COMMANDS COMMAND grep -v " error: Help:" ${PVS_STUDIO_LOG} 1>&2 || exit 0)
elseif (WIN32)
set(COMMANDS COMMAND type "${PVS_STUDIO_LOG}" 1>&2)
else ()
set(COMMANDS COMMAND cat "${PVS_STUDIO_LOG}" 1>&2)
endif ()
else ()
set(COMMANDS "")
endif ()
add_custom_target("${PVS_STUDIO_TARGET}" ${ALL} ${COMMANDS} WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" DEPENDS ${PVS_STUDIO_DEPENDS} "${PVS_STUDIO_LOG}")
# A workaround to add implicit dependencies of source files from include directories
set_target_properties("${PVS_STUDIO_TARGET}" PROPERTIES INCLUDE_DIRECTORIES "${inc_path}")
endfunction()

View file

@ -2,7 +2,7 @@ TES3MP
====== ======
Copyright (c) 2008-2015, OpenMW Team Copyright (c) 2008-2015, OpenMW Team
Copyright (c) 2016-2019, Stanislav Zhukov & David Cernat Copyright (c) 2016-2018, TES3MP Team
[![Build Status](https://travis-ci.org/TES3MP/openmw-tes3mp.svg?branch=0.7.0)](https://travis-ci.org/TES3MP/openmw-tes3mp) [![Build Status](https://travis-ci.org/TES3MP/openmw-tes3mp.svg?branch=0.7.0)](https://travis-ci.org/TES3MP/openmw-tes3mp)
@ -15,7 +15,7 @@ TES3MP is a project adding multiplayer functionality to [OpenMW](https://github.
Font Licenses: Font Licenses:
* DejaVuLGCSansMono.ttf: custom (see [files/mygui/DejaVu Font License.txt](https://github.com/TES3MP/openmw-tes3mp/blob/master/files/mygui/DejaVu%20Font%20License.txt) for more information) * DejaVuLGCSansMono.ttf: custom (see [files/mygui/DejaVu Font License.txt](https://github.com/TES3MP/openmw-tes3mp/blob/master/files/mygui/DejaVu%20Font%20License.txt) for more information)
Project status Project Status
-------------- --------------
[Version changelog](https://github.com/TES3MP/openmw-tes3mp/blob/master/tes3mp-changelog.md) [Version changelog](https://github.com/TES3MP/openmw-tes3mp/blob/master/tes3mp-changelog.md)
@ -24,26 +24,25 @@ As of version 0.7.0, TES3MP is fully playable, providing very extensive player,
Remaining gameplay problems mostly relate to AI and the synchronization of clientside script variables. Remaining gameplay problems mostly relate to AI and the synchronization of clientside script variables.
Donations
---------------
You can benefit the project by donating on Patreon to our two developers, [David Cernat](https://www.patreon.com/davidcernat) and [Koncord](https://www.patreon.com/Koncord), as well as by supporting [OpenMW](https://openmw.org).
Contributing Contributing
--------------- --------------
Helping us with documentation, bug hunting and video showcases is always greatly appreciated. Development has been relatively fast, but any contribution regarding [code](https://github.com/TES3MP/openmw-tes3mp/blob/master/CONTRIBUTING.md), documentation, bug hunting or video showcases is greatly appreciated.
For code contributions, it's best to start out with modestly sized fixes and features and work your way up. There are so many different possible implementations of more major features many of which would cause undesirable code or vision conflicts with OpenMW that those should be talked over in advance with the existing developers before effort is spent on them. Test sessions are often advertised on [our Discord server](https://discord.gg/ECJk293) or in [our Steam group](https://steamcommunity.com/groups/mwmulti).
Feel free to contact the [team members](https://github.com/TES3MP/openmw-tes3mp/blob/master/tes3mp-credits.md) for any questions you might have. Feel free to contact the [team members](https://github.com/TES3MP/openmw-tes3mp/blob/master/tes3mp-credits.md) for any questions you might have.
Getting started Getting Started
--------------- ---------------
* [Quickstart guide](https://github.com/TES3MP/openmw-tes3mp/wiki/Quickstart-guide) * [Quickstart guide](https://github.com/TES3MP/openmw-tes3mp/wiki/Quickstart-guide)
* [Steam group](https://steamcommunity.com/groups/mwmulti) and its [detailed FAQ](https://steamcommunity.com/groups/mwmulti/discussions/1/353916184342480541/) * [Steam group](https://steamcommunity.com/groups/mwmulti) and its [detailed FAQ](https://steamcommunity.com/groups/mwmulti/discussions/1/353916184342480541/)
* [TES3MP section on OpenMW forums](https://forum.openmw.org/viewforum.php?f=45) * [TES3MP section on OpenMW forums](https://forum.openmw.org/viewforum.php?f=45)
* [Discord server](https://discord.gg/ECJk293)
* [Subreddit](https://www.reddit.com/r/tes3mp) * [Subreddit](https://www.reddit.com/r/tes3mp)
* [Known issues and bug reports](https://github.com/TES3MP/openmw-tes3mp/issues) * [Known issues and bug reports](https://github.com/TES3MP/openmw-tes3mp/issues)
Donations
---------------
You can benefit the project by contributing to the Patreon pages of our two developers, [David Cernat](https://www.patreon.com/davidcernat) and [Koncord](https://www.patreon.com/Koncord), as well as by supporting [OpenMW](https://openmw.org).

View file

@ -25,13 +25,28 @@ if(BUILD_WITH_LUA)
set(LuaScript_Sources set(LuaScript_Sources
Script/LangLua/LangLua.cpp Script/LangLua/LangLua.cpp
Script/LangLua/LuaFunc.cpp) Script/LangLua/LuaFunc.cpp)
set(LuaScript_Headers ${LUA_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/extern/LuaBridge ${CMAKE_SOURCE_DIR}/extern/LuaBridge/detail set(LuaScript_Headers
Script/LangLua/LangLua.hpp) Script/LangLua/LangLua.hpp)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DENABLE_LUA") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DENABLE_LUA")
include_directories(SYSTEM ${LuaJit_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR}/extern/LuaBridge) include_directories(SYSTEM ${LuaJit_INCLUDE_DIRS} SYSTEM ${CMAKE_SOURCE_DIR}/extern/LuaBridge)
endif(BUILD_WITH_LUA) endif(BUILD_WITH_LUA)
option(BUILD_WITH_MONO "Enable Mono languages" ON)
if(BUILD_WITH_MONO)
message(STATUS "Mono enabled")
find_package(Mono REQUIRED)
include_directories(SYSTEM ${MONO_INCLUDE_DIR})
set(MonoScript_Sources
Script/LangMono/LangMono.cpp
)
set(MonoScript_Headers
Script/LangMono/LangMono.hpp
)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DENABLE_MONO")
endif(BUILD_WITH_MONO)
set(NativeScript_Sources set(NativeScript_Sources
Script/LangNative/LangNative.cpp Script/LangNative/LangNative.cpp
) )
@ -60,11 +75,12 @@ set(SERVER
Script/Functions/Positions.cpp Script/Functions/Quests.cpp Script/Functions/RecordsDynamic.cpp Script/Functions/Positions.cpp Script/Functions/Quests.cpp Script/Functions/RecordsDynamic.cpp
Script/Functions/Server.cpp Script/Functions/Settings.cpp Script/Functions/Shapeshift.cpp Script/Functions/Server.cpp Script/Functions/Settings.cpp Script/Functions/Shapeshift.cpp
Script/Functions/Spells.cpp Script/Functions/Stats.cpp Script/Functions/Timer.cpp Script/Functions/Spells.cpp Script/Functions/Stats.cpp Script/Functions/Timer.cpp
Script/Functions/Public.cpp
Script/API/TimerAPI.cpp Script/API/PublicFnAPI.cpp Script/API/TimerAPI.cpp Script/API/PublicFnAPI.cpp
${LuaScript_Sources} ${LuaScript_Sources}
${NativeScript_Sources} ${NativeScript_Sources}
${MonoScript_Sources}
) )
set(SERVER_HEADER set(SERVER_HEADER
@ -73,6 +89,7 @@ set(SERVER_HEADER
Script/ScriptFunctions.hpp Script/API/TimerAPI.hpp Script/API/PublicFnAPI.hpp Script/ScriptFunctions.hpp Script/API/TimerAPI.hpp Script/API/PublicFnAPI.hpp
${LuaScript_Headers} ${LuaScript_Headers}
${NativeScript_Headers} ${NativeScript_Headers}
${MonoScript_Headers}
) )
source_group(tes3mp-server FILES ${SERVER} ${SERVER_HEADER}) source_group(tes3mp-server FILES ${SERVER} ${SERVER_HEADER})
@ -165,10 +182,6 @@ set_target_properties(tes3mp-server PROPERTIES
CXX_EXTENSIONS YES CXX_EXTENSIONS YES
) )
if (UNIX)
target_compile_options(tes3mp-server PRIVATE -Wno-ignored-qualifiers)
endif()
target_link_libraries(tes3mp-server target_link_libraries(tes3mp-server
#${Boost_SYSTEM_LIBRARY} #${Boost_SYSTEM_LIBRARY}
#${Boost_THREAD_LIBRARY} #${Boost_THREAD_LIBRARY}
@ -177,13 +190,19 @@ target_link_libraries(tes3mp-server
${RakNet_LIBRARY} ${RakNet_LIBRARY}
components components
${LuaJit_LIBRARIES} ${LuaJit_LIBRARIES}
${MONO_LIBRARY}
${Breakpad_Library} ${Breakpad_Library}
) )
if (BUILD_WITH_LUA)
target_link_libraries(tes3mp-server LuaBridge)
endif()
if (UNIX) if (UNIX)
target_link_libraries(tes3mp-server dl) target_link_libraries(tes3mp-server dl)
# Fix for not visible pthreads functions for linker with glibc 2.15 # Fix for not visible pthreads functions for linker with glibc 2.15
if(NOT APPLE) if(NOT APPLE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,--exclude-libs,ALL -rdynamic -fvisibility=hidden")
target_link_libraries(tes3mp-server ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries(tes3mp-server ${CMAKE_THREAD_LIBS_INIT})
endif(NOT APPLE) endif(NOT APPLE)
endif(UNIX) endif(UNIX)
@ -200,3 +219,10 @@ if (MSVC)
endif (CMAKE_CL_64) endif (CMAKE_CL_64)
add_definitions("-D_USE_MATH_DEFINES") add_definitions("-D_USE_MATH_DEFINES")
endif (MSVC) endif (MSVC)
if (ENABLE_PVS)
pvs_studio_add_target(TARGET tes3mp-server.analyze ALL
OUTPUT FORMAT errorfile
ANALYZE tes3mp-server
LOG target_tes3mp-server.err)
endif()

View file

@ -55,7 +55,7 @@ void Cell::addPlayer(Player *player)
void Cell::removePlayer(Player *player, bool cleanPlayer) void Cell::removePlayer(Player *player, bool cleanPlayer)
{ {
for (Iterator it = begin(); it != end(); it++) for (auto it = begin(); it != end(); ++it)
{ {
if (*it == player) if (*it == player)
{ {
@ -161,7 +161,7 @@ void Cell::removeActors(const mwmp::BaseActorList *newActorList)
} }
if (!foundActor) if (!foundActor)
it++; ++it;
} }
cellActorList.count = cellActorList.baseActors.size(); cellActorList.count = cellActorList.baseActors.size();

View file

@ -64,7 +64,7 @@ Cell *CellController::getCellByXY(int x, int y)
return *it; return *it;
} }
Cell *CellController::getCellByName(std::string cellName) Cell *CellController::getCellByName(const std::string &cellName)
{ {
auto it = find_if(cells.begin(), cells.end(), [cellName](const Cell *c) auto it = find_if(cells.begin(), cells.end(), [cellName](const Cell *c)
{ {
@ -80,7 +80,7 @@ Cell *CellController::getCellByName(std::string cellName)
return *it; return *it;
} }
Cell *CellController::addCell(ESM::Cell cellData) Cell *CellController::addCell(const ESM::Cell &cellData)
{ {
LOG_APPEND(Log::LOG_INFO, "- Loaded cells: %d", cells.size()); LOG_APPEND(Log::LOG_INFO, "- Loaded cells: %d", cells.size());
auto it = find_if(cells.begin(), cells.end(), [cellData](const Cell *c) { auto it = find_if(cells.begin(), cells.end(), [cellData](const Cell *c) {

View file

@ -27,14 +27,14 @@ public:
typedef std::deque<Cell*> TContainer; typedef std::deque<Cell*> TContainer;
typedef TContainer::iterator TIter; typedef TContainer::iterator TIter;
Cell * addCell(ESM::Cell cell); Cell * addCell(const ESM::Cell &cell);
void removeCell(Cell *); void removeCell(Cell *);
void deletePlayer(Player *player); void deletePlayer(Player *player);
Cell *getCell(ESM::Cell *esmCell); Cell *getCell(ESM::Cell *esmCell);
Cell *getCellByXY(int x, int y); Cell *getCellByXY(int x, int y);
Cell *getCellByName(std::string cellName); Cell *getCellByName(const std::string &cellName);
void update(Player *player); void update(Player *player);

View file

@ -51,7 +51,7 @@ void MasterClient::SetMaxPlayers(unsigned pl)
mutexData.unlock(); mutexData.unlock();
} }
void MasterClient::SetHostname(std::string hostname) void MasterClient::SetHostname(const std::string &hostname)
{ {
mutexData.lock(); mutexData.lock();
string substr = hostname.substr(0, 200); string substr = hostname.substr(0, 200);
@ -63,7 +63,7 @@ void MasterClient::SetHostname(std::string hostname)
mutexData.unlock(); mutexData.unlock();
} }
void MasterClient::SetModname(std::string modname) void MasterClient::SetModname(const std::string &modname)
{ {
mutexData.lock(); mutexData.lock();
string substr = modname.substr(0, 200); string substr = modname.substr(0, 200);
@ -75,7 +75,7 @@ void MasterClient::SetModname(std::string modname)
mutexData.unlock(); mutexData.unlock();
} }
void MasterClient::SetRuleString(std::string key, std::string value) void MasterClient::SetRuleString(const std::string &key, std::string value)
{ {
mutexData.lock(); mutexData.lock();
if (queryData.rules.find(key) == queryData.rules.end() || queryData.rules[key].type != 's' if (queryData.rules.find(key) == queryData.rules.end() || queryData.rules[key].type != 's'
@ -90,7 +90,7 @@ void MasterClient::SetRuleString(std::string key, std::string value)
mutexData.unlock(); mutexData.unlock();
} }
void MasterClient::SetRuleValue(std::string key, double value) void MasterClient::SetRuleValue(const std::string &key, double value)
{ {
mutexData.lock(); mutexData.lock();
if (queryData.rules.find(key) == queryData.rules.end() || queryData.rules[key].type != 'v' if (queryData.rules.find(key) == queryData.rules.end() || queryData.rules[key].type != 'v'
@ -105,7 +105,7 @@ void MasterClient::SetRuleValue(std::string key, double value)
mutexData.unlock(); mutexData.unlock();
} }
void MasterClient::PushPlugin(Plugin plugin) void MasterClient::PushPlugin(const Plugin &plugin)
{ {
mutexData.lock(); mutexData.lock();
queryData.plugins.push_back(plugin); queryData.plugins.push_back(plugin);
@ -208,7 +208,7 @@ void MasterClient::Thread()
} }
else else
{ {
for (int i = 0; pIt != players->end(); i++, pIt++) for (int i = 0; pIt != players->end(); i++, ++pIt)
{ {
if (queryData.players[i] != pIt->second->npc.mName) if (queryData.players[i] != pIt->second->npc.mName)
{ {
@ -258,5 +258,6 @@ void MasterClient::SetUpdateRate(unsigned int rate)
timeout = min_rate; timeout = min_rate;
else if (timeout > max_rate) else if (timeout > max_rate)
timeout = max_rate; timeout = max_rate;
else
timeout = rate; timeout = rate;
} }

View file

@ -22,11 +22,11 @@ public:
MasterClient(RakNet::RakPeerInterface *peer, std::string queryAddr, unsigned short queryPort); MasterClient(RakNet::RakPeerInterface *peer, std::string queryAddr, unsigned short queryPort);
void SetPlayers(unsigned pl); void SetPlayers(unsigned pl);
void SetMaxPlayers(unsigned pl); void SetMaxPlayers(unsigned pl);
void SetHostname(std::string hostname); void SetHostname(const std::string &hostname);
void SetModname(std::string hostname); void SetModname(const std::string &hostname);
void SetRuleString(std::string key, std::string value); void SetRuleString(const std::string &key, std::string value);
void SetRuleValue(std::string key, double value); void SetRuleValue(const std::string &key, double value);
void PushPlugin(Plugin plugin); void PushPlugin(const Plugin &plugin);
bool Process(RakNet::Packet *packet); bool Process(RakNet::Packet *packet);
void Start(); void Start();

View file

@ -75,9 +75,9 @@ Networking::~Networking()
delete worldstatePacketController; delete worldstatePacketController;
} }
void Networking::setServerPassword(std::string password) noexcept void Networking::setServerPassword(const std::string &passw) noexcept
{ {
serverPassword = password.empty() ? TES3MP_DEFAULT_PASSW : password; serverPassword = passw.empty() ? TES3MP_DEFAULT_PASSW : passw;
} }
bool Networking::isPassworded() const bool Networking::isPassworded() const
@ -98,33 +98,26 @@ void Networking::processPlayerPacket(RakNet::Packet *packet)
if (!myPacket->isPacketValid()) if (!myPacket->isPacketValid())
{ {
LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, "Invalid handshake packet from client at %s", packet->systemAddress.ToString()); LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, "Invalid handshake packet from %d", player->getId());
kickPlayer(player->guid); kickPlayer(player->guid);
return; return;
} }
if (player->isHandshaked()) if (player->isHandshaked())
{ {
LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Wrong handshake with client at %s", packet->systemAddress.ToString()); LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Wrong handshake with player %d, name: %s", player->getId(),
player->npc.mName.c_str());
kickPlayer(player->guid); kickPlayer(player->guid);
return; return;
} }
if (player->serverPassword != serverPassword) if (player->passw != serverPassword)
{ {
if (isPassworded()) LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Wrong server password for player %d, name: %s (pass: %s)",
{ player->getId(), player->npc.mName.c_str(), player->passw.c_str());
LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Wrong server password %s used by client at %s",
player->serverPassword.c_str(), packet->systemAddress.ToString());
kickPlayer(player->guid); kickPlayer(player->guid);
return; return;
} }
else
{
LOG_MESSAGE_SIMPLE(Log::LOG_INFO, "Client at %s tried to join using password, despite the server not being passworded",
packet->systemAddress.ToString());
}
}
player->setHandshake(); player->setHandshake();
return; return;
} }
@ -132,8 +125,9 @@ void Networking::processPlayerPacket(RakNet::Packet *packet)
if (!player->isHandshaked()) if (!player->isHandshaked())
{ {
player->incrementHandshakeAttempts(); player->incrementHandshakeAttempts();
LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Have not completed handshake with client at %s", packet->systemAddress.ToString()); LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Have not completed handshake with player %d", player->getId());
LOG_APPEND(Log::LOG_WARN, "- Attempts so far: %i", player->getHandshakeAttempts());
LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Attempts so far: %i", player->getHandshakeAttempts());
if (player->getHandshakeAttempts() > 20) if (player->getHandshakeAttempts() > 20)
kickPlayer(player->guid, false); kickPlayer(player->guid, false);
@ -245,7 +239,7 @@ bool Networking::preInit(RakNet::Packet *packet, RakNet::BitStream &bsIn)
auto plugin = plugins.begin(); auto plugin = plugins.begin();
if (samples.size() == plugins.size()) if (samples.size() == plugins.size())
{ {
for (int i = 0; plugin != plugins.end(); plugin++, i++) for (int i = 0; plugin != plugins.end(); ++plugin, i++)
{ {
LOG_APPEND(Log::LOG_VERBOSE, "- %X\t%s", plugin->second[0], plugin->first.c_str()); LOG_APPEND(Log::LOG_VERBOSE, "- %X\t%s", plugin->second[0], plugin->first.c_str());
// Check if the filenames match, ignoring case // Check if the filenames match, ignoring case
@ -317,7 +311,7 @@ void Networking::update(RakNet::Packet *packet, RakNet::BitStream &bsIn)
LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Unhandled RakNet packet with identifier %i has arrived", packet->data[0]); LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Unhandled RakNet packet with identifier %i has arrived", packet->data[0]);
} }
void Networking::newPlayer(RakNet::RakNetGUID guid) void Networking::newPlayer(const RakNet::RakNetGUID &guid)
{ {
playerPacketController->GetPacket(ID_PLAYER_BASEINFO)->RequestData(guid); playerPacketController->GetPacket(ID_PLAYER_BASEINFO)->RequestData(guid);
playerPacketController->GetPacket(ID_PLAYER_STATS_DYNAMIC)->RequestData(guid); playerPacketController->GetPacket(ID_PLAYER_STATS_DYNAMIC)->RequestData(guid);
@ -327,27 +321,27 @@ void Networking::newPlayer(RakNet::RakNetGUID guid)
LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Sending info about other players to %lu", guid.g); LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Sending info about other players to %lu", guid.g);
for (TPlayers::iterator pl = players->begin(); pl != players->end(); pl++) //sending other players to new player for (auto &player : *players) //sending other players to new player
{ {
// If we are iterating over the new player, don't send the packets below // If we are iterating over the new player, don't send the packets below
if (pl->first == guid) continue; if (player.first == guid) continue;
// If an invalid key makes it into the Players map, ignore it // If an invalid key makes it into the Players map, ignore it
else if (pl->first == RakNet::UNASSIGNED_CRABNET_GUID) continue; else if (player.first == RakNet::UNASSIGNED_CRABNET_GUID) continue;
// if player not fully connected // if player not fully connected
else if (pl->second == nullptr) continue; else if (player.second == nullptr) continue;
// If we are iterating over a player who has inputted their name, proceed // If we are iterating over a player who has inputted their name, proceed
else if (pl->second->getLoadState() == Player::POSTLOADED) else if (player.second->getLoadState() == Player::POSTLOADED)
{ {
playerPacketController->GetPacket(ID_PLAYER_BASEINFO)->setPlayer(pl->second); playerPacketController->GetPacket(ID_PLAYER_BASEINFO)->setPlayer(player.second);
playerPacketController->GetPacket(ID_PLAYER_STATS_DYNAMIC)->setPlayer(pl->second); playerPacketController->GetPacket(ID_PLAYER_STATS_DYNAMIC)->setPlayer(player.second);
playerPacketController->GetPacket(ID_PLAYER_ATTRIBUTE)->setPlayer(pl->second); playerPacketController->GetPacket(ID_PLAYER_ATTRIBUTE)->setPlayer(player.second);
playerPacketController->GetPacket(ID_PLAYER_SKILL)->setPlayer(pl->second); playerPacketController->GetPacket(ID_PLAYER_SKILL)->setPlayer(player.second);
playerPacketController->GetPacket(ID_PLAYER_POSITION)->setPlayer(pl->second); playerPacketController->GetPacket(ID_PLAYER_POSITION)->setPlayer(player.second);
playerPacketController->GetPacket(ID_PLAYER_CELL_CHANGE)->setPlayer(pl->second); playerPacketController->GetPacket(ID_PLAYER_CELL_CHANGE)->setPlayer(player.second);
playerPacketController->GetPacket(ID_PLAYER_EQUIPMENT)->setPlayer(pl->second); playerPacketController->GetPacket(ID_PLAYER_EQUIPMENT)->setPlayer(player.second);
playerPacketController->GetPacket(ID_PLAYER_BASEINFO)->Send(guid); playerPacketController->GetPacket(ID_PLAYER_BASEINFO)->Send(guid);
playerPacketController->GetPacket(ID_PLAYER_STATS_DYNAMIC)->Send(guid); playerPacketController->GetPacket(ID_PLAYER_STATS_DYNAMIC)->Send(guid);
@ -363,7 +357,7 @@ void Networking::newPlayer(RakNet::RakNetGUID guid)
} }
void Networking::disconnectPlayer(RakNet::RakNetGUID guid) void Networking::disconnectPlayer(const RakNet::RakNetGUID &guid)
{ {
Player *player = Players::getPlayer(guid); Player *player = Players::getPlayer(guid);
if (!player) if (!player)
@ -458,7 +452,7 @@ Networking *Networking::getPtr()
return sThis; return sThis;
} }
RakNet::SystemAddress Networking::getSystemAddress(RakNet::RakNetGUID guid) RakNet::SystemAddress Networking::getSystemAddress(const RakNet::RakNetGUID &guid)
{ {
return peer->GetSystemAddressFromGuid(guid); return peer->GetSystemAddressFromGuid(guid);
} }
@ -538,7 +532,7 @@ int Networking::mainLoop()
return exitCode; return exitCode;
} }
void Networking::kickPlayer(RakNet::RakNetGUID guid, bool sendNotification) void Networking::kickPlayer(const RakNet::RakNetGUID &guid, bool sendNotification)
{ {
peer->CloseConnection(guid, sendNotification); peer->CloseConnection(guid, sendNotification);
} }
@ -563,7 +557,7 @@ unsigned int Networking::maxConnections() const
return peer->GetMaximumIncomingConnections(); return peer->GetMaximumIncomingConnections();
} }
int Networking::getAvgPing(RakNet::AddressOrGUID addr) const int Networking::getAvgPing(const RakNet::AddressOrGUID &addr) const
{ {
return peer->GetAveragePing(addr); return peer->GetAveragePing(addr);
} }
@ -578,15 +572,15 @@ MasterClient *Networking::getMasterClient()
return mclient; return mclient;
} }
void Networking::InitQuery(std::string queryAddr, unsigned short queryPort) void Networking::InitQuery(const std::string &queryAddr, unsigned short queryPort)
{ {
mclient = new MasterClient(peer, queryAddr, queryPort); mclient = new MasterClient(peer, queryAddr, queryPort);
} }
void Networking::postInit() void Networking::postInit()
{ {
Script::Call<Script::CallbackIdentity("OnRequestDataFileList")>();
Script::Call<Script::CallbackIdentity("OnServerPostInit")>(); Script::Call<Script::CallbackIdentity("OnServerPostInit")>();
Script::Call<Script::CallbackIdentity("OnRequestPluginList")>();
} }
PacketPreInit::PluginContainer &Networking::getSamples() PacketPreInit::PluginContainer &Networking::getSamples()

View file

@ -17,13 +17,13 @@ namespace mwmp
Networking(RakNet::RakPeerInterface *peer); Networking(RakNet::RakPeerInterface *peer);
~Networking(); ~Networking();
void newPlayer(RakNet::RakNetGUID guid); void newPlayer(const RakNet::RakNetGUID &guid);
void disconnectPlayer(RakNet::RakNetGUID guid); void disconnectPlayer(const RakNet::RakNetGUID &guid);
void kickPlayer(RakNet::RakNetGUID guid, bool sendNotification = true); void kickPlayer(const RakNet::RakNetGUID &guid, bool sendNotification = true);
void banAddress(const char *ipAddress); void banAddress(const char *ipAddress);
void unbanAddress(const char *ipAddress); void unbanAddress(const char *ipAddress);
RakNet::SystemAddress getSystemAddress(RakNet::RakNetGUID guid); RakNet::SystemAddress getSystemAddress(const RakNet::RakNetGUID &guid);
void processPlayerPacket(RakNet::Packet *packet); void processPlayerPacket(RakNet::Packet *packet);
void processActorPacket(RakNet::Packet *packet); void processActorPacket(RakNet::Packet *packet);
@ -33,7 +33,7 @@ namespace mwmp
unsigned short numberOfConnections() const; unsigned short numberOfConnections() const;
unsigned int maxConnections() const; unsigned int maxConnections() const;
int getAvgPing(RakNet::AddressOrGUID) const; int getAvgPing(const RakNet::AddressOrGUID &) const;
unsigned short getPort() const; unsigned short getPort() const;
int mainLoop(); int mainLoop();
@ -60,8 +60,8 @@ namespace mwmp
void setScriptErrorIgnoringState(bool state); void setScriptErrorIgnoringState(bool state);
MasterClient *getMasterClient(); MasterClient *getMasterClient();
void InitQuery(std::string queryAddr, unsigned short queryPort); void InitQuery(const std::string &queryAddr, unsigned short queryPort);
void setServerPassword(std::string passw) noexcept; void setServerPassword(const std::string &passw) noexcept;
bool isPassworded() const; bool isPassworded() const;
static const Networking &get(); static const Networking &get();

View file

@ -10,7 +10,7 @@ TSlots Players::slots;
using namespace std; using namespace std;
void Players::deletePlayer(RakNet::RakNetGUID guid) void Players::deletePlayer(const RakNet::RakNetGUID &guid)
{ {
LOG_MESSAGE_SIMPLE(Log::LOG_INFO, "Deleting player with guid %lu", guid.g); LOG_MESSAGE_SIMPLE(Log::LOG_INFO, "Deleting player with guid %lu", guid.g);
@ -26,7 +26,7 @@ void Players::deletePlayer(RakNet::RakNetGUID guid)
} }
} }
void Players::newPlayer(RakNet::RakNetGUID guid) void Players::newPlayer(const RakNet::RakNetGUID &guid)
{ {
LOG_MESSAGE_SIMPLE(Log::LOG_INFO, "Creating new player with guid %lu", guid.g); LOG_MESSAGE_SIMPLE(Log::LOG_INFO, "Creating new player with guid %lu", guid.g);
@ -41,7 +41,7 @@ void Players::newPlayer(RakNet::RakNetGUID guid)
for (unsigned int i = 0; i < mwmp::Networking::get().maxConnections(); i++) for (unsigned int i = 0; i < mwmp::Networking::get().maxConnections(); i++)
{ {
if (slots[i] == 0) if (slots[i] == nullptr)
{ {
LOG_APPEND(Log::LOG_INFO, "- Storing in slot %i", i); LOG_APPEND(Log::LOG_INFO, "- Storing in slot %i", i);
@ -52,7 +52,7 @@ void Players::newPlayer(RakNet::RakNetGUID guid)
} }
} }
Player *Players::getPlayer(RakNet::RakNetGUID guid) Player *Players::getPlayer(const RakNet::RakNetGUID &guid)
{ {
auto it = players.find(guid); auto it = players.find(guid);
if (it == players.end()) if (it == players.end())
@ -70,7 +70,7 @@ unsigned short Players::getLastPlayerId()
return slots.rbegin()->first; return slots.rbegin()->first;
} }
Player::Player(RakNet::RakNetGUID guid) : BasePlayer(guid) Player::Player(const RakNet::RakNetGUID &guid) : BasePlayer(guid), id(InvalidID)
{ {
handshakeCounter = 0; handshakeCounter = 0;
loadState = NOTLOADED; loadState = NOTLOADED;
@ -81,7 +81,7 @@ Player::~Player()
} }
unsigned short Player::getId() unsigned int Player::getId()
{ {
return id; return id;
} }
@ -177,7 +177,7 @@ void Player::forEachLoaded(std::function<void(Player *pl, Player *other)> func)
} }
} }
bool Players::doesPlayerExist(RakNet::RakNetGUID guid) bool Players::doesPlayerExist(const RakNet::RakNetGUID &guid)
{ {
return players.find(guid) != players.end(); return players.find(guid) != players.end();
} }

View file

@ -21,19 +21,20 @@
#include "Cell.hpp" #include "Cell.hpp"
#include "CellController.hpp" #include "CellController.hpp"
struct Player;
typedef std::map<RakNet::RakNetGUID, Player*> TPlayers; typedef std::map<RakNet::RakNetGUID, Player*> TPlayers;
typedef std::map<unsigned short, Player*> TSlots; typedef std::map<unsigned short, Player*> TSlots;
class Players class Players
{ {
public: public:
static void newPlayer(RakNet::RakNetGUID guid); static void newPlayer(const RakNet::RakNetGUID &guid);
static void deletePlayer(RakNet::RakNetGUID guid); static void deletePlayer(const RakNet::RakNetGUID &guid);
static Player *getPlayer(RakNet::RakNetGUID guid); static Player *getPlayer(const RakNet::RakNetGUID &guid);
static Player *getPlayer(unsigned short id); static Player *getPlayer(unsigned short id);
static TPlayers *getPlayers(); static TPlayers *getPlayers();
static unsigned short getLastPlayerId(); static unsigned short getLastPlayerId();
static bool doesPlayerExist(RakNet::RakNetGUID guid); static bool doesPlayerExist(const RakNet::RakNetGUID &guid);
private: private:
static TPlayers players; static TPlayers players;
@ -43,9 +44,8 @@ private:
class Player : public mwmp::BasePlayer class Player : public mwmp::BasePlayer
{ {
friend class Cell; friend class Cell;
unsigned short id;
public: public:
const unsigned int InvalidID = (unsigned int) -1;
enum enum
{ {
NOTLOADED=0, NOTLOADED=0,
@ -53,9 +53,9 @@ public:
POSTLOADED, POSTLOADED,
KICKED KICKED
}; };
Player(RakNet::RakNetGUID guid); Player(const RakNet::RakNetGUID &guid);
unsigned short getId(); unsigned int getId();
void setId(unsigned short id); void setId(unsigned short id);
bool isHandshaked(); bool isHandshaked();
@ -77,6 +77,7 @@ private:
CellController::TContainer cells; CellController::TContainer cells;
int loadState; int loadState;
int handshakeCounter; int handshakeCounter;
unsigned int id;
}; };

View file

@ -19,11 +19,21 @@ Public::Public(ScriptFunc _public, const std::string &name, char ret_type, const
publics.emplace(name, this); publics.emplace(name, this);
} }
#ifdef ENABLE_LUA
Public::Public(ScriptFuncLua _public, lua_State *lua, const std::string &name, char ret_type, const std::string &def) : ScriptFunction( Public::Public(ScriptFuncLua _public, lua_State *lua, const std::string &name, char ret_type, const std::string &def) : ScriptFunction(
_public, lua, ret_type, def) _public, lua, ret_type, def)
{ {
publics.emplace(name, this); publics.emplace(name, this);
} }
#endif
#ifdef ENABLE_MONO
Public::Public(MonoObject *delegate, const std::string &name, char ret_type, const std::string &def) :
ScriptFunction(delegate, ret_type, def)
{
publics.emplace(name, this);
}
#endif
boost::any Public::Call(const std::string &name, const std::vector<boost::any> &args) boost::any Public::Call(const std::string &name, const std::vector<boost::any> &args)
{ {
@ -45,6 +55,15 @@ const std::string &Public::GetDefinition(const std::string &name)
return it->second->def; return it->second->def;
} }
Public *Public::GetPublic(const std::string &name)
{
auto it = publics.find(name);
if (it == publics.end())
throw runtime_error("Public with name \"" + name + "\" does not exist");
return it->second;
}
bool Public::IsLua(const std::string &name) bool Public::IsLua(const std::string &name)
{ {
@ -61,7 +80,7 @@ bool Public::IsLua(const std::string &name)
void Public::DeleteAll() void Public::DeleteAll()
{ {
for (auto it = publics.begin(); it != publics.end(); it++) for (auto it = publics.begin(); it != publics.end(); ++it)
{ {
Public *_public = it->second; Public *_public = it->second;
delete _public; delete _public;

View file

@ -20,6 +20,9 @@ private:
#if defined(ENABLE_LUA) #if defined(ENABLE_LUA)
Public(ScriptFuncLua _public, lua_State *lua, const std::string &name, char ret_type, const std::string &def); Public(ScriptFuncLua _public, lua_State *lua, const std::string &name, char ret_type, const std::string &def);
#endif #endif
#if defined(ENABLE_MONO)
Public(MonoObject *delegate, const std::string &name, char ret_type, const std::string &def);
#endif
public: public:
template<typename... Args> template<typename... Args>
@ -30,6 +33,8 @@ public:
static const std::string& GetDefinition(const std::string& name); static const std::string& GetDefinition(const std::string& name);
static Public * GetPublic(const std::string& name);
static bool IsLua(const std::string &name); static bool IsLua(const std::string &name);
static void DeleteAll(); static void DeleteAll();

View file

@ -1,3 +1,7 @@
//
// Created by koncord on 15.03.16.
//
#include "TimerAPI.hpp" #include "TimerAPI.hpp"
#include <chrono> #include <chrono>
@ -6,25 +10,34 @@
using namespace mwmp; using namespace mwmp;
using namespace std; using namespace std;
Timer::Timer(ScriptFunc callback, long msec, const std::string& def, std::vector<boost::any> args) : ScriptFunction(callback, 'v', def) Timer::Timer(ScriptFunc callback, long msec, const std::string& def, std::vector<boost::any> args) : ScriptFunction(callback, 'v', def), args(args)
{ {
startTime = 0;
targetMsec = msec; targetMsec = msec;
this->args = args; end = true;
isEnded = true;
} }
#if defined(ENABLE_LUA) #if defined(ENABLE_LUA)
Timer::Timer(lua_State *lua, ScriptFuncLua callback, long msec, const std::string& def, std::vector<boost::any> args): ScriptFunction(callback, lua, 'v', def) Timer::Timer(lua_State *lua, ScriptFuncLua callback, long msec, const std::string& def, std::vector<boost::any> args): ScriptFunction(callback, lua, 'v', def), args(args)
{ {
startTime = 0;
targetMsec = msec; targetMsec = msec;
this->args = args; end = true;
isEnded = true; }
#endif
#ifdef ENABLE_MONO
Timer::Timer(MonoObject *callback, long msec, const std::string &def, std::vector<boost::any> args) : ScriptFunction(callback, 'v', def), args(args)
{
startTime = 0;
targetMsec = msec;
end = true;
} }
#endif #endif
void Timer::Tick() void Timer::Tick()
{ {
if (isEnded) if (end)
return; return;
const auto duration = chrono::system_clock::now().time_since_epoch(); const auto duration = chrono::system_clock::now().time_since_epoch();
@ -32,19 +45,19 @@ void Timer::Tick()
if (time - startTime >= targetMsec) if (time - startTime >= targetMsec)
{ {
isEnded = true; end = true;
Call(args); Call(args);
} }
} }
bool Timer::IsEnded() bool Timer::IsEnd()
{ {
return isEnded; return end;
} }
void Timer::Stop() void Timer::Stop()
{ {
isEnded = true; end = true;
} }
void Timer::Restart(int msec) void Timer::Restart(int msec)
@ -55,7 +68,7 @@ void Timer::Restart(int msec)
void Timer::Start() void Timer::Start()
{ {
isEnded = false; end = false;
const auto duration = chrono::system_clock::now().time_since_epoch(); const auto duration = chrono::system_clock::now().time_since_epoch();
const auto msec = chrono::duration_cast<chrono::milliseconds>(duration).count(); const auto msec = chrono::duration_cast<chrono::milliseconds>(duration).count();
@ -89,8 +102,30 @@ int TimerAPI::CreateTimerLua(lua_State *lua, ScriptFuncLua callback, long msec,
} }
#endif #endif
#if defined(ENABLE_MONO)
int TimerAPI::CreateTimerMono(MonoObject *callback, long msec, const std::string& def, std::vector<boost::any> args)
{
int id = -1;
int TimerAPI::CreateTimer(ScriptFunc callback, long msec, const std::string &def, std::vector<boost::any> args) for (auto timer : timers)
{
if (timer.second != nullptr)
continue;
timer.second = new Timer(callback, msec, def, args);
id = timer.first;
}
if (id == -1)
{
timers[pointer] = new Timer(callback, msec, def, args);
id = pointer;
pointer++;
}
return id;
}
#endif
int TimerAPI::CreateTimer(ScriptFunc callback, long msec, const std::string &def, const std::vector<boost::any> &args)
{ {
int id = -1; int id = -1;
@ -168,12 +203,12 @@ void TimerAPI::StopTimer(int timerid)
} }
} }
bool TimerAPI::IsTimerElapsed(int timerid) bool TimerAPI::IsEndTimer(int timerid)
{ {
bool ret = false; bool ret = false;
try try
{ {
ret = timers.at(timerid)->IsEnded(); ret = timers.at(timerid)->IsEnd();
} }
catch(...) catch(...)
{ {

View file

@ -1,3 +1,7 @@
//
// Created by koncord on 15.03.16.
//
#ifndef OPENMW_TIMERAPI_HPP #ifndef OPENMW_TIMERAPI_HPP
#define OPENMW_TIMERAPI_HPP #define OPENMW_TIMERAPI_HPP
@ -6,6 +10,10 @@
#include <Script/Script.hpp> #include <Script/Script.hpp>
#include <Script/ScriptFunction.hpp> #include <Script/ScriptFunction.hpp>
#ifdef ENABLE_MONO
#include <mono/metadata/object.h>
#endif
namespace mwmp namespace mwmp
{ {
@ -20,19 +28,22 @@ namespace mwmp
Timer(ScriptFunc callback, long msec, const std::string& def, std::vector<boost::any> args); Timer(ScriptFunc callback, long msec, const std::string& def, std::vector<boost::any> args);
#if defined(ENABLE_LUA) #if defined(ENABLE_LUA)
Timer(lua_State *lua, ScriptFuncLua callback, long msec, const std::string& def, std::vector<boost::any> args); Timer(lua_State *lua, ScriptFuncLua callback, long msec, const std::string& def, std::vector<boost::any> args);
#endif
#ifdef ENABLE_MONO
Timer(MonoObject *callback, long msec, const std::string& def, std::vector<boost::any> args);
#endif #endif
void Tick(); void Tick();
bool IsEnded(); bool IsEnd();
void Stop(); void Stop();
void Start(); void Start();
void Restart(int msec); void Restart(int msec);
private: private:
double startTime, targetMsec; double startTime, targetMsec;
std::string publ, arg_types; //std::string publ, arg_types;
std::vector<boost::any> args; std::vector<boost::any> args;
Script *scr; //Script *scr;
bool isEnded; bool end;
}; };
class TimerAPI class TimerAPI
@ -41,12 +52,15 @@ namespace mwmp
#if defined(ENABLE_LUA) #if defined(ENABLE_LUA)
static int CreateTimerLua(lua_State *lua, ScriptFuncLua callback, long msec, const std::string& def, std::vector<boost::any> args); static int CreateTimerLua(lua_State *lua, ScriptFuncLua callback, long msec, const std::string& def, std::vector<boost::any> args);
#endif #endif
static int CreateTimer(ScriptFunc callback, long msec, const std::string& def, std::vector<boost::any> args); #if defined(ENABLE_MONO)
static int CreateTimerMono(MonoObject *callback, long msec, const std::string& def, std::vector<boost::any> args);
#endif
static int CreateTimer(ScriptFunc callback, long msec, const std::string& def, const std::vector<boost::any> &args);
static void FreeTimer(int timerid); static void FreeTimer(int timerid);
static void ResetTimer(int timerid, long msec); static void ResetTimer(int timerid, long msec);
static void StartTimer(int timerid); static void StartTimer(int timerid);
static void StopTimer(int timerid); static void StopTimer(int timerid);
static bool IsTimerElapsed(int timerid); static bool IsEndTimer(int timerid);
static void Terminate(); static void Terminate();

View file

@ -20,25 +20,25 @@ const BaseActor emptyActor = {};
static std::string tempCellDescription; static std::string tempCellDescription;
void ActorFunctions::ReadReceivedActorList() noexcept extern "C" void ActorFunctions::ReadReceivedActorList() noexcept
{ {
readActorList = mwmp::Networking::getPtr()->getReceivedActorList(); readActorList = mwmp::Networking::getPtr()->getReceivedActorList();
} }
void ActorFunctions::ReadCellActorList(const char* cellDescription) noexcept extern "C" void ActorFunctions::ReadCellActorList(const char* cellDescription) noexcept
{ {
ESM::Cell esmCell = Utils::getCellFromDescription(cellDescription); ESM::Cell esmCell = Utils::getCellFromDescription(cellDescription);
Cell *serverCell = CellController::get()->getCell(&esmCell); Cell *serverCell = CellController::get()->getCell(&esmCell);
readActorList = serverCell->getActorList(); readActorList = serverCell->getActorList();
} }
void ActorFunctions::ClearActorList() noexcept extern "C" void ActorFunctions::ClearActorList() noexcept
{ {
writeActorList.cell.blank(); writeActorList.cell.blank();
writeActorList.baseActors.clear(); writeActorList.baseActors.clear();
} }
void ActorFunctions::SetActorListPid(unsigned short pid) noexcept extern "C" void ActorFunctions::SetActorListPid(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -46,143 +46,143 @@ void ActorFunctions::SetActorListPid(unsigned short pid) noexcept
writeActorList.guid = player->guid; writeActorList.guid = player->guid;
} }
void ActorFunctions::CopyReceivedActorListToStore() noexcept extern "C" void ActorFunctions::CopyReceivedActorListToStore() noexcept
{ {
writeActorList = *readActorList; writeActorList = *readActorList;
} }
unsigned int ActorFunctions::GetActorListSize() noexcept extern "C" unsigned int ActorFunctions::GetActorListSize() noexcept
{ {
return readActorList->count; return readActorList->count;
} }
unsigned char ActorFunctions::GetActorListAction() noexcept extern "C" unsigned char ActorFunctions::GetActorListAction() noexcept
{ {
return readActorList->action; return readActorList->action;
} }
const char *ActorFunctions::GetActorCell(unsigned int index) noexcept extern "C" const char *ActorFunctions::GetActorCell(unsigned int index) noexcept
{ {
tempCellDescription = readActorList->baseActors.at(index).cell.getDescription(); tempCellDescription = readActorList->baseActors.at(index).cell.getDescription();
return tempCellDescription.c_str(); return tempCellDescription.c_str();
} }
const char *ActorFunctions::GetActorRefId(unsigned int index) noexcept extern "C" const char *ActorFunctions::GetActorRefId(unsigned int index) noexcept
{ {
return readActorList->baseActors.at(index).refId.c_str(); return readActorList->baseActors.at(index).refId.c_str();
} }
unsigned int ActorFunctions::GetActorRefNum(unsigned int index) noexcept extern "C" unsigned int ActorFunctions::GetActorRefNum(unsigned int index) noexcept
{ {
return readActorList->baseActors.at(index).refNum; return readActorList->baseActors.at(index).refNum;
} }
unsigned int ActorFunctions::GetActorMpNum(unsigned int index) noexcept extern "C" unsigned int ActorFunctions::GetActorMpNum(unsigned int index) noexcept
{ {
return readActorList->baseActors.at(index).mpNum; return readActorList->baseActors.at(index).mpNum;
} }
double ActorFunctions::GetActorPosX(unsigned int index) noexcept extern "C" double ActorFunctions::GetActorPosX(unsigned int index) noexcept
{ {
return readActorList->baseActors.at(index).position.pos[0]; return readActorList->baseActors.at(index).position.pos[0];
} }
double ActorFunctions::GetActorPosY(unsigned int index) noexcept extern "C" double ActorFunctions::GetActorPosY(unsigned int index) noexcept
{ {
return readActorList->baseActors.at(index).position.pos[1]; return readActorList->baseActors.at(index).position.pos[1];
} }
double ActorFunctions::GetActorPosZ(unsigned int index) noexcept extern "C" double ActorFunctions::GetActorPosZ(unsigned int index) noexcept
{ {
return readActorList->baseActors.at(index).position.pos[2]; return readActorList->baseActors.at(index).position.pos[2];
} }
double ActorFunctions::GetActorRotX(unsigned int index) noexcept extern "C" double ActorFunctions::GetActorRotX(unsigned int index) noexcept
{ {
return readActorList->baseActors.at(index).position.rot[0]; return readActorList->baseActors.at(index).position.rot[0];
} }
double ActorFunctions::GetActorRotY(unsigned int index) noexcept extern "C" double ActorFunctions::GetActorRotY(unsigned int index) noexcept
{ {
return readActorList->baseActors.at(index).position.rot[1]; return readActorList->baseActors.at(index).position.rot[1];
} }
double ActorFunctions::GetActorRotZ(unsigned int index) noexcept extern "C" double ActorFunctions::GetActorRotZ(unsigned int index) noexcept
{ {
return readActorList->baseActors.at(index).position.rot[2]; return readActorList->baseActors.at(index).position.rot[2];
} }
double ActorFunctions::GetActorHealthBase(unsigned int index) noexcept extern "C" double ActorFunctions::GetActorHealthBase(unsigned int index) noexcept
{ {
return readActorList->baseActors.at(index).creatureStats.mDynamic[0].mBase; return readActorList->baseActors.at(index).creatureStats.mDynamic[0].mBase;
} }
double ActorFunctions::GetActorHealthCurrent(unsigned int index) noexcept extern "C" double ActorFunctions::GetActorHealthCurrent(unsigned int index) noexcept
{ {
return readActorList->baseActors.at(index).creatureStats.mDynamic[0].mCurrent; return readActorList->baseActors.at(index).creatureStats.mDynamic[0].mCurrent;
} }
double ActorFunctions::GetActorHealthModified(unsigned int index) noexcept extern "C" double ActorFunctions::GetActorHealthModified(unsigned int index) noexcept
{ {
return readActorList->baseActors.at(index).creatureStats.mDynamic[0].mMod; return readActorList->baseActors.at(index).creatureStats.mDynamic[0].mMod;
} }
double ActorFunctions::GetActorMagickaBase(unsigned int index) noexcept extern "C" double ActorFunctions::GetActorMagickaBase(unsigned int index) noexcept
{ {
return readActorList->baseActors.at(index).creatureStats.mDynamic[1].mBase; return readActorList->baseActors.at(index).creatureStats.mDynamic[1].mBase;
} }
double ActorFunctions::GetActorMagickaCurrent(unsigned int index) noexcept extern "C" double ActorFunctions::GetActorMagickaCurrent(unsigned int index) noexcept
{ {
return readActorList->baseActors.at(index).creatureStats.mDynamic[1].mCurrent; return readActorList->baseActors.at(index).creatureStats.mDynamic[1].mCurrent;
} }
double ActorFunctions::GetActorMagickaModified(unsigned int index) noexcept extern "C" double ActorFunctions::GetActorMagickaModified(unsigned int index) noexcept
{ {
return readActorList->baseActors.at(index).creatureStats.mDynamic[1].mMod; return readActorList->baseActors.at(index).creatureStats.mDynamic[1].mMod;
} }
double ActorFunctions::GetActorFatigueBase(unsigned int index) noexcept extern "C" double ActorFunctions::GetActorFatigueBase(unsigned int index) noexcept
{ {
return readActorList->baseActors.at(index).creatureStats.mDynamic[2].mBase; return readActorList->baseActors.at(index).creatureStats.mDynamic[2].mBase;
} }
double ActorFunctions::GetActorFatigueCurrent(unsigned int index) noexcept extern "C" double ActorFunctions::GetActorFatigueCurrent(unsigned int index) noexcept
{ {
return readActorList->baseActors.at(index).creatureStats.mDynamic[2].mCurrent; return readActorList->baseActors.at(index).creatureStats.mDynamic[2].mCurrent;
} }
double ActorFunctions::GetActorFatigueModified(unsigned int index) noexcept extern "C" double ActorFunctions::GetActorFatigueModified(unsigned int index) noexcept
{ {
return readActorList->baseActors.at(index).creatureStats.mDynamic[2].mMod; return readActorList->baseActors.at(index).creatureStats.mDynamic[2].mMod;
} }
const char *ActorFunctions::GetActorEquipmentItemRefId(unsigned int index, unsigned short slot) noexcept extern "C" const char *ActorFunctions::GetActorEquipmentItemRefId(unsigned int index, unsigned short slot) noexcept
{ {
return readActorList->baseActors.at(index).equipmentItems[slot].refId.c_str(); return readActorList->baseActors.at(index).equipmentItems[slot].refId.c_str();
} }
int ActorFunctions::GetActorEquipmentItemCount(unsigned int index, unsigned short slot) noexcept extern "C" int ActorFunctions::GetActorEquipmentItemCount(unsigned int index, unsigned short slot) noexcept
{ {
return readActorList->baseActors.at(index).equipmentItems[slot].count; return readActorList->baseActors.at(index).equipmentItems[slot].count;
} }
int ActorFunctions::GetActorEquipmentItemCharge(unsigned int index, unsigned short slot) noexcept extern "C" int ActorFunctions::GetActorEquipmentItemCharge(unsigned int index, unsigned short slot) noexcept
{ {
return readActorList->baseActors.at(index).equipmentItems[slot].charge; return readActorList->baseActors.at(index).equipmentItems[slot].charge;
} }
double ActorFunctions::GetActorEquipmentItemEnchantmentCharge(unsigned int index, unsigned short slot) noexcept extern "C" double ActorFunctions::GetActorEquipmentItemEnchantmentCharge(unsigned int index, unsigned short slot) noexcept
{ {
return readActorList->baseActors.at(index).equipmentItems[slot].enchantmentCharge; return readActorList->baseActors.at(index).equipmentItems[slot].enchantmentCharge;
} }
bool ActorFunctions::DoesActorHavePlayerKiller(unsigned int index) noexcept extern "C" bool ActorFunctions::DoesActorHavePlayerKiller(unsigned int index) noexcept
{ {
return readActorList->baseActors.at(index).killer.isPlayer; return readActorList->baseActors.at(index).killer.isPlayer;
} }
int ActorFunctions::GetActorKillerPid(unsigned int index) noexcept extern "C" int ActorFunctions::GetActorKillerPid(unsigned int index) noexcept
{ {
Player *player = Players::getPlayer(readActorList->baseActors.at(index).killer.guid); Player *player = Players::getPlayer(readActorList->baseActors.at(index).killer.guid);
@ -192,136 +192,136 @@ int ActorFunctions::GetActorKillerPid(unsigned int index) noexcept
return -1; return -1;
} }
const char *ActorFunctions::GetActorKillerRefId(unsigned int index) noexcept extern "C" const char *ActorFunctions::GetActorKillerRefId(unsigned int index) noexcept
{ {
return readActorList->baseActors.at(index).killer.refId.c_str(); return readActorList->baseActors.at(index).killer.refId.c_str();
} }
unsigned int ActorFunctions::GetActorKillerRefNum(unsigned int index) noexcept extern "C" unsigned int ActorFunctions::GetActorKillerRefNum(unsigned int index) noexcept
{ {
return readActorList->baseActors.at(index).killer.refNum; return readActorList->baseActors.at(index).killer.refNum;
} }
unsigned int ActorFunctions::GetActorKillerMpNum(unsigned int index) noexcept extern "C" unsigned int ActorFunctions::GetActorKillerMpNum(unsigned int index) noexcept
{ {
return readActorList->baseActors.at(index).killer.mpNum; return readActorList->baseActors.at(index).killer.mpNum;
} }
const char *ActorFunctions::GetActorKillerName(unsigned int index) noexcept extern "C" const char *ActorFunctions::GetActorKillerName(unsigned int index) noexcept
{ {
return readActorList->baseActors.at(index).killer.name.c_str(); return readActorList->baseActors.at(index).killer.name.c_str();
} }
bool ActorFunctions::DoesActorHavePosition(unsigned int index) noexcept extern "C" bool ActorFunctions::DoesActorHavePosition(unsigned int index) noexcept
{ {
return readActorList->baseActors.at(index).hasPositionData; return readActorList->baseActors.at(index).hasPositionData;
} }
bool ActorFunctions::DoesActorHaveStatsDynamic(unsigned int index) noexcept extern "C" bool ActorFunctions::DoesActorHaveStatsDynamic(unsigned int index) noexcept
{ {
return readActorList->baseActors.at(index).hasStatsDynamicData; return readActorList->baseActors.at(index).hasStatsDynamicData;
} }
void ActorFunctions::SetActorListCell(const char* cellDescription) noexcept extern "C" void ActorFunctions::SetActorListCell(const char* cellDescription) noexcept
{ {
writeActorList.cell = Utils::getCellFromDescription(cellDescription); writeActorList.cell = Utils::getCellFromDescription(cellDescription);
} }
void ActorFunctions::SetActorListAction(unsigned char action) noexcept extern "C" void ActorFunctions::SetActorListAction(unsigned char action) noexcept
{ {
writeActorList.action = action; writeActorList.action = action;
} }
void ActorFunctions::SetActorCell(const char* cellDescription) noexcept extern "C" void ActorFunctions::SetActorCell(const char* cellDescription) noexcept
{ {
tempActor.cell = Utils::getCellFromDescription(cellDescription); tempActor.cell = Utils::getCellFromDescription(cellDescription);
} }
void ActorFunctions::SetActorRefId(const char* refId) noexcept extern "C" void ActorFunctions::SetActorRefId(const char* refId) noexcept
{ {
tempActor.refId = refId; tempActor.refId = refId;
} }
void ActorFunctions::SetActorRefNum(int refNum) noexcept extern "C" void ActorFunctions::SetActorRefNum(int refNum) noexcept
{ {
tempActor.refNum = refNum; tempActor.refNum = refNum;
} }
void ActorFunctions::SetActorMpNum(int mpNum) noexcept extern "C" void ActorFunctions::SetActorMpNum(int mpNum) noexcept
{ {
tempActor.mpNum = mpNum; tempActor.mpNum = mpNum;
} }
void ActorFunctions::SetActorPosition(double x, double y, double z) noexcept extern "C" void ActorFunctions::SetActorPosition(double x, double y, double z) noexcept
{ {
tempActor.position.pos[0] = x; tempActor.position.pos[0] = x;
tempActor.position.pos[1] = y; tempActor.position.pos[1] = y;
tempActor.position.pos[2] = z; tempActor.position.pos[2] = z;
} }
void ActorFunctions::SetActorRotation(double x, double y, double z) noexcept extern "C" void ActorFunctions::SetActorRotation(double x, double y, double z) noexcept
{ {
tempActor.position.rot[0] = x; tempActor.position.rot[0] = x;
tempActor.position.rot[1] = y; tempActor.position.rot[1] = y;
tempActor.position.rot[2] = z; tempActor.position.rot[2] = z;
} }
void ActorFunctions::SetActorHealthBase(double value) noexcept extern "C" void ActorFunctions::SetActorHealthBase(double value) noexcept
{ {
tempActor.creatureStats.mDynamic[0].mBase = value; tempActor.creatureStats.mDynamic[0].mBase = value;
} }
void ActorFunctions::SetActorHealthCurrent(double value) noexcept extern "C" void ActorFunctions::SetActorHealthCurrent(double value) noexcept
{ {
tempActor.creatureStats.mDynamic[0].mCurrent = value; tempActor.creatureStats.mDynamic[0].mCurrent = value;
} }
void ActorFunctions::SetActorHealthModified(double value) noexcept extern "C" void ActorFunctions::SetActorHealthModified(double value) noexcept
{ {
tempActor.creatureStats.mDynamic[0].mMod = value; tempActor.creatureStats.mDynamic[0].mMod = value;
} }
void ActorFunctions::SetActorMagickaBase(double value) noexcept extern "C" void ActorFunctions::SetActorMagickaBase(double value) noexcept
{ {
tempActor.creatureStats.mDynamic[1].mBase = value; tempActor.creatureStats.mDynamic[1].mBase = value;
} }
void ActorFunctions::SetActorMagickaCurrent(double value) noexcept extern "C" void ActorFunctions::SetActorMagickaCurrent(double value) noexcept
{ {
tempActor.creatureStats.mDynamic[1].mCurrent = value; tempActor.creatureStats.mDynamic[1].mCurrent = value;
} }
void ActorFunctions::SetActorMagickaModified(double value) noexcept extern "C" void ActorFunctions::SetActorMagickaModified(double value) noexcept
{ {
tempActor.creatureStats.mDynamic[1].mMod = value; tempActor.creatureStats.mDynamic[1].mMod = value;
} }
void ActorFunctions::SetActorFatigueBase(double value) noexcept extern "C" void ActorFunctions::SetActorFatigueBase(double value) noexcept
{ {
tempActor.creatureStats.mDynamic[2].mBase = value; tempActor.creatureStats.mDynamic[2].mBase = value;
} }
void ActorFunctions::SetActorFatigueCurrent(double value) noexcept extern "C" void ActorFunctions::SetActorFatigueCurrent(double value) noexcept
{ {
tempActor.creatureStats.mDynamic[2].mCurrent = value; tempActor.creatureStats.mDynamic[2].mCurrent = value;
} }
void ActorFunctions::SetActorFatigueModified(double value) noexcept extern "C" void ActorFunctions::SetActorFatigueModified(double value) noexcept
{ {
tempActor.creatureStats.mDynamic[2].mMod = value; tempActor.creatureStats.mDynamic[2].mMod = value;
} }
void ActorFunctions::SetActorSound(const char* sound) noexcept extern "C" void ActorFunctions::SetActorSound(const char* sound) noexcept
{ {
tempActor.sound = sound; tempActor.sound = sound;
} }
void ActorFunctions::SetActorAIAction(unsigned int action) noexcept extern "C" void ActorFunctions::SetActorAIAction(unsigned int action) noexcept
{ {
tempActor.aiAction = action; tempActor.aiAction = action;
} }
void ActorFunctions::SetActorAITargetToPlayer(unsigned short pid) noexcept extern "C" void ActorFunctions::SetActorAITargetToPlayer(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -332,7 +332,7 @@ void ActorFunctions::SetActorAITargetToPlayer(unsigned short pid) noexcept
tempActor.aiTarget.guid = player->guid; tempActor.aiTarget.guid = player->guid;
} }
void ActorFunctions::SetActorAITargetToObject(int refNum, int mpNum) noexcept extern "C" void ActorFunctions::SetActorAITargetToObject(int refNum, int mpNum) noexcept
{ {
tempActor.hasAiTarget = true; tempActor.hasAiTarget = true;
tempActor.aiTarget.isPlayer = false; tempActor.aiTarget.isPlayer = false;
@ -341,29 +341,29 @@ void ActorFunctions::SetActorAITargetToObject(int refNum, int mpNum) noexcept
tempActor.aiTarget.mpNum = mpNum; tempActor.aiTarget.mpNum = mpNum;
} }
void ActorFunctions::SetActorAICoordinates(double x, double y, double z) noexcept extern "C" void ActorFunctions::SetActorAICoordinates(double x, double y, double z) noexcept
{ {
tempActor.aiCoordinates.pos[0] = x; tempActor.aiCoordinates.pos[0] = x;
tempActor.aiCoordinates.pos[1] = y; tempActor.aiCoordinates.pos[1] = y;
tempActor.aiCoordinates.pos[2] = z; tempActor.aiCoordinates.pos[2] = z;
} }
void ActorFunctions::SetActorAIDistance(unsigned int distance) noexcept extern "C" void ActorFunctions::SetActorAIDistance(unsigned int distance) noexcept
{ {
tempActor.aiDistance = distance; tempActor.aiDistance = distance;
} }
void ActorFunctions::SetActorAIDuration(unsigned int duration) noexcept extern "C" void ActorFunctions::SetActorAIDuration(unsigned int duration) noexcept
{ {
tempActor.aiDuration = duration; tempActor.aiDuration = duration;
} }
void ActorFunctions::SetActorAIRepetition(bool shouldRepeat) noexcept extern "C" void ActorFunctions::SetActorAIRepetition(bool shouldRepeat) noexcept
{ {
tempActor.aiShouldRepeat = shouldRepeat; tempActor.aiShouldRepeat = shouldRepeat;
} }
void ActorFunctions::EquipActorItem(unsigned short slot, const char *refId, unsigned int count, int charge, double enchantmentCharge) noexcept extern "C" void ActorFunctions::EquipActorItem(unsigned short slot, const char *refId, unsigned int count, int charge, double enchantmentCharge) noexcept
{ {
tempActor.equipmentItems[slot].refId = refId; tempActor.equipmentItems[slot].refId = refId;
tempActor.equipmentItems[slot].count = count; tempActor.equipmentItems[slot].count = count;
@ -371,26 +371,26 @@ void ActorFunctions::EquipActorItem(unsigned short slot, const char *refId, unsi
tempActor.equipmentItems[slot].enchantmentCharge = enchantmentCharge; tempActor.equipmentItems[slot].enchantmentCharge = enchantmentCharge;
} }
void ActorFunctions::UnequipActorItem(unsigned short slot) noexcept extern "C" void ActorFunctions::UnequipActorItem(unsigned short slot) noexcept
{ {
ActorFunctions::EquipActorItem(slot, "", 0, -1, -1); ActorFunctions::EquipActorItem(slot, "", 0, -1, -1);
} }
void ActorFunctions::AddActor() noexcept extern "C" void ActorFunctions::AddActor() noexcept
{ {
writeActorList.baseActors.push_back(tempActor); writeActorList.baseActors.push_back(tempActor);
tempActor = emptyActor; tempActor = emptyActor;
} }
void ActorFunctions::SendActorList() noexcept extern "C" void ActorFunctions::SendActorList() noexcept
{ {
mwmp::ActorPacket *actorPacket = mwmp::Networking::get().getActorPacketController()->GetPacket(ID_ACTOR_LIST); mwmp::ActorPacket *actorPacket = mwmp::Networking::get().getActorPacketController()->GetPacket(ID_ACTOR_LIST);
actorPacket->setActorList(&writeActorList); actorPacket->setActorList(&writeActorList);
actorPacket->Send(writeActorList.guid); actorPacket->Send(writeActorList.guid);
} }
void ActorFunctions::SendActorAuthority() noexcept extern "C" void ActorFunctions::SendActorAuthority() noexcept
{ {
Cell *serverCell = CellController::get()->getCell(&writeActorList.cell); Cell *serverCell = CellController::get()->getCell(&writeActorList.cell);
@ -407,7 +407,7 @@ void ActorFunctions::SendActorAuthority() noexcept
} }
} }
void ActorFunctions::SendActorPosition(bool sendToOtherVisitors, bool skipAttachedPlayer) noexcept extern "C" void ActorFunctions::SendActorPosition(bool sendToOtherVisitors, bool skipAttachedPlayer) noexcept
{ {
mwmp::ActorPacket *actorPacket = mwmp::Networking::get().getActorPacketController()->GetPacket(ID_ACTOR_POSITION); mwmp::ActorPacket *actorPacket = mwmp::Networking::get().getActorPacketController()->GetPacket(ID_ACTOR_POSITION);
actorPacket->setActorList(&writeActorList); actorPacket->setActorList(&writeActorList);
@ -426,7 +426,7 @@ void ActorFunctions::SendActorPosition(bool sendToOtherVisitors, bool skipAttach
} }
} }
void ActorFunctions::SendActorStatsDynamic(bool sendToOtherVisitors, bool skipAttachedPlayer) noexcept extern "C" void ActorFunctions::SendActorStatsDynamic(bool sendToOtherVisitors, bool skipAttachedPlayer) noexcept
{ {
mwmp::ActorPacket *actorPacket = mwmp::Networking::get().getActorPacketController()->GetPacket(ID_ACTOR_STATS_DYNAMIC); mwmp::ActorPacket *actorPacket = mwmp::Networking::get().getActorPacketController()->GetPacket(ID_ACTOR_STATS_DYNAMIC);
actorPacket->setActorList(&writeActorList); actorPacket->setActorList(&writeActorList);
@ -445,7 +445,7 @@ void ActorFunctions::SendActorStatsDynamic(bool sendToOtherVisitors, bool skipAt
} }
} }
void ActorFunctions::SendActorEquipment(bool sendToOtherVisitors, bool skipAttachedPlayer) noexcept extern "C" void ActorFunctions::SendActorEquipment(bool sendToOtherVisitors, bool skipAttachedPlayer) noexcept
{ {
mwmp::ActorPacket *actorPacket = mwmp::Networking::get().getActorPacketController()->GetPacket(ID_ACTOR_EQUIPMENT); mwmp::ActorPacket *actorPacket = mwmp::Networking::get().getActorPacketController()->GetPacket(ID_ACTOR_EQUIPMENT);
actorPacket->setActorList(&writeActorList); actorPacket->setActorList(&writeActorList);
@ -464,7 +464,7 @@ void ActorFunctions::SendActorEquipment(bool sendToOtherVisitors, bool skipAttac
} }
} }
void ActorFunctions::SendActorSpeech(bool sendToOtherVisitors, bool skipAttachedPlayer) noexcept extern "C" void ActorFunctions::SendActorSpeech(bool sendToOtherVisitors, bool skipAttachedPlayer) noexcept
{ {
mwmp::ActorPacket *actorPacket = mwmp::Networking::get().getActorPacketController()->GetPacket(ID_ACTOR_SPEECH); mwmp::ActorPacket *actorPacket = mwmp::Networking::get().getActorPacketController()->GetPacket(ID_ACTOR_SPEECH);
actorPacket->setActorList(&writeActorList); actorPacket->setActorList(&writeActorList);
@ -483,7 +483,7 @@ void ActorFunctions::SendActorSpeech(bool sendToOtherVisitors, bool skipAttached
} }
} }
void ActorFunctions::SendActorAI(bool sendToOtherVisitors, bool skipAttachedPlayer) noexcept extern "C" void ActorFunctions::SendActorAI(bool sendToOtherVisitors, bool skipAttachedPlayer) noexcept
{ {
mwmp::ActorPacket *actorPacket = mwmp::Networking::get().getActorPacketController()->GetPacket(ID_ACTOR_AI); mwmp::ActorPacket *actorPacket = mwmp::Networking::get().getActorPacketController()->GetPacket(ID_ACTOR_AI);
actorPacket->setActorList(&writeActorList); actorPacket->setActorList(&writeActorList);
@ -502,7 +502,7 @@ void ActorFunctions::SendActorAI(bool sendToOtherVisitors, bool skipAttachedPlay
} }
} }
void ActorFunctions::SendActorCellChange(bool sendToOtherVisitors, bool skipAttachedPlayer) noexcept extern "C" void ActorFunctions::SendActorCellChange(bool sendToOtherVisitors, bool skipAttachedPlayer) noexcept
{ {
mwmp::ActorPacket *actorPacket = mwmp::Networking::get().getActorPacketController()->GetPacket(ID_ACTOR_CELL_CHANGE); mwmp::ActorPacket *actorPacket = mwmp::Networking::get().getActorPacketController()->GetPacket(ID_ACTOR_CELL_CHANGE);
actorPacket->setActorList(&writeActorList); actorPacket->setActorList(&writeActorList);
@ -521,36 +521,35 @@ void ActorFunctions::SendActorCellChange(bool sendToOtherVisitors, bool skipAtta
} }
} }
extern "C" // All methods below are deprecated versions of methods from above
// All methods below are deprecated versions of methods from above
void ActorFunctions::ReadLastActorList() noexcept void ActorFunctions::ReadLastActorList() noexcept
{ {
ReadReceivedActorList(); ReadReceivedActorList();
} }
void ActorFunctions::InitializeActorList(unsigned short pid) noexcept extern "C" void ActorFunctions::InitializeActorList(unsigned short pid) noexcept
{ {
ClearActorList(); ClearActorList();
SetActorListPid(pid); SetActorListPid(pid);
} }
void ActorFunctions::CopyLastActorListToStore() noexcept extern "C" void ActorFunctions::CopyLastActorListToStore() noexcept
{ {
CopyReceivedActorListToStore(); CopyLastActorListToStore();
} }
unsigned int ActorFunctions::GetActorRefNumIndex(unsigned int index) noexcept extern "C" unsigned int ActorFunctions::GetActorRefNumIndex(unsigned int index) noexcept
{ {
return GetActorRefNum(index); return GetActorRefNum(index);
} }
unsigned int ActorFunctions::GetActorKillerRefNumIndex(unsigned int index) noexcept extern "C" unsigned int ActorFunctions::GetActorKillerRefNumIndex(unsigned int index) noexcept
{ {
return GetActorKillerRefNum(index); return GetActorKillerRefNum(index);
} }
void ActorFunctions::SetActorRefNumIndex(int refNum) noexcept extern "C" void ActorFunctions::SetActorRefNumIndex(int refNum) noexcept
{ {
tempActor.refNum = refNum; tempActor.refNum = refNum;
} }

View file

@ -1,6 +1,8 @@
#ifndef OPENMW_ACTORAPI_HPP #ifndef OPENMW_ACTORAPI_HPP
#define OPENMW_ACTORAPI_HPP #define OPENMW_ACTORAPI_HPP
#include <Script/Platform.hpp>
#define ACTORAPI \ #define ACTORAPI \
{"ReadReceivedActorList", ActorFunctions::ReadReceivedActorList},\ {"ReadReceivedActorList", ActorFunctions::ReadReceivedActorList},\
{"ReadCellActorList", ActorFunctions::ReadCellActorList},\ {"ReadCellActorList", ActorFunctions::ReadCellActorList},\
@ -102,16 +104,14 @@
{"GetActorKillerRefNumIndex", ActorFunctions::GetActorKillerRefNumIndex},\ {"GetActorKillerRefNumIndex", ActorFunctions::GetActorKillerRefNumIndex},\
{"SetActorRefNumIndex", ActorFunctions::SetActorRefNumIndex} {"SetActorRefNumIndex", ActorFunctions::SetActorRefNumIndex}
class ActorFunctions namespace ActorFunctions
{ {
public:
/** /**
* \brief Use the last actor list received by the server as the one being read. * \brief Use the last actor list received by the server as the one being read.
* *
* \return void * \return void
*/ */
static void ReadReceivedActorList() noexcept; EXPORT_APIFUNCTION void CDECL ReadReceivedActorList() noexcept;
/** /**
* \brief Use the temporary actor list stored for a cell as the one being read. * \brief Use the temporary actor list stored for a cell as the one being read.
@ -122,14 +122,14 @@ public:
* \param cellDescription The description of the cell whose actor list should be read. * \param cellDescription The description of the cell whose actor list should be read.
* \return void * \return void
*/ */
static void ReadCellActorList(const char* cellDescription) noexcept; EXPORT_APIFUNCTION void CDECL ReadCellActorList(const char* cellDescription) noexcept;
/** /**
* \brief Clear the data from the actor list stored on the server. * \brief Clear the data from the actor list stored on the server.
* *
* \return void * \return void
*/ */
static void ClearActorList() noexcept; EXPORT_APIFUNCTION void CDECL ClearActorList() noexcept;
/** /**
* \brief Set the pid attached to the ActorList. * \brief Set the pid attached to the ActorList.
@ -137,7 +137,7 @@ public:
* \param pid The player ID to whom the actor list should be attached. * \param pid The player ID to whom the actor list should be attached.
* \return void * \return void
*/ */
static void SetActorListPid(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL SetActorListPid(unsigned short pid) noexcept;
/** /**
* \brief Take the contents of the read-only actor list last received by the * \brief Take the contents of the read-only actor list last received by the
@ -146,21 +146,21 @@ public:
* *
* \return void * \return void
*/ */
static void CopyReceivedActorListToStore() noexcept; EXPORT_APIFUNCTION void CDECL CopyReceivedActorListToStore() noexcept;
/** /**
* \brief Get the number of indexes in the read actor list. * \brief Get the number of indexes in the read actor list.
* *
* \return The number of indexes. * \return The number of indexes.
*/ */
static unsigned int GetActorListSize() noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetActorListSize() noexcept;
/** /**
* \brief Get the action type used in the read actor list. * \brief Get the action type used in the read actor list.
* *
* \return The action type (0 for SET, 1 for ADD, 2 for REMOVE, 3 for REQUEST). * \return The action type (0 for SET, 1 for ADD, 2 for REMOVE, 3 for REQUEST).
*/ */
static unsigned char GetActorListAction() noexcept; EXPORT_APIFUNCTION unsigned char CDECL GetActorListAction() noexcept;
/** /**
* \brief Get the cell description of the actor at a certain index in the read actor list. * \brief Get the cell description of the actor at a certain index in the read actor list.
@ -168,7 +168,7 @@ public:
* \param index The index of the actor. * \param index The index of the actor.
* \return The cell description. * \return The cell description.
*/ */
static const char *GetActorCell(unsigned int index) noexcept; EXPORT_APIFUNCTION const char *CDECL GetActorCell(unsigned int index) noexcept;
/** /**
* \brief Get the refId of the actor at a certain index in the read actor list. * \brief Get the refId of the actor at a certain index in the read actor list.
@ -176,7 +176,7 @@ public:
* \param index The index of the actor. * \param index The index of the actor.
* \return The refId. * \return The refId.
*/ */
static const char *GetActorRefId(unsigned int index) noexcept; EXPORT_APIFUNCTION const char *CDECL GetActorRefId(unsigned int index) noexcept;
/** /**
* \brief Get the refNum of the actor at a certain index in the read actor list. * \brief Get the refNum of the actor at a certain index in the read actor list.
@ -184,7 +184,7 @@ public:
* \param index The index of the actor. * \param index The index of the actor.
* \return The refNum. * \return The refNum.
*/ */
static unsigned int GetActorRefNum(unsigned int index) noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetActorRefNum(unsigned int index) noexcept;
/** /**
* \brief Get the mpNum of the actor at a certain index in the read actor list. * \brief Get the mpNum of the actor at a certain index in the read actor list.
@ -192,7 +192,7 @@ public:
* \param index The index of the actor. * \param index The index of the actor.
* \return The mpNum. * \return The mpNum.
*/ */
static unsigned int GetActorMpNum(unsigned int index) noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetActorMpNum(unsigned int index) noexcept;
/** /**
* \brief Get the X position of the actor at a certain index in the read actor list. * \brief Get the X position of the actor at a certain index in the read actor list.
@ -200,7 +200,7 @@ public:
* \param index The index of the actor. * \param index The index of the actor.
* \return The X position. * \return The X position.
*/ */
static double GetActorPosX(unsigned int index) noexcept; EXPORT_APIFUNCTION double CDECL GetActorPosX(unsigned int index) noexcept;
/** /**
* \brief Get the Y position of the actor at a certain index in the read actor list. * \brief Get the Y position of the actor at a certain index in the read actor list.
@ -208,7 +208,7 @@ public:
* \param index The index of the actor. * \param index The index of the actor.
* \return The Y position. * \return The Y position.
*/ */
static double GetActorPosY(unsigned int index) noexcept; EXPORT_APIFUNCTION double CDECL GetActorPosY(unsigned int index) noexcept;
/** /**
* \brief Get the Z position of the actor at a certain index in the read actor list. * \brief Get the Z position of the actor at a certain index in the read actor list.
@ -216,7 +216,7 @@ public:
* \param index The index of the actor. * \param index The index of the actor.
* \return The Z position. * \return The Z position.
*/ */
static double GetActorPosZ(unsigned int index) noexcept; EXPORT_APIFUNCTION double CDECL GetActorPosZ(unsigned int index) noexcept;
/** /**
* \brief Get the X rotation of the actor at a certain index in the read actor list. * \brief Get the X rotation of the actor at a certain index in the read actor list.
@ -224,7 +224,7 @@ public:
* \param index The index of the actor. * \param index The index of the actor.
* \return The X rotation. * \return The X rotation.
*/ */
static double GetActorRotX(unsigned int index) noexcept; EXPORT_APIFUNCTION double CDECL GetActorRotX(unsigned int index) noexcept;
/** /**
* \brief Get the Y rotation of the actor at a certain index in the read actor list. * \brief Get the Y rotation of the actor at a certain index in the read actor list.
@ -232,7 +232,7 @@ public:
* \param index The index of the actor. * \param index The index of the actor.
* \return The Y rotation. * \return The Y rotation.
*/ */
static double GetActorRotY(unsigned int index) noexcept; EXPORT_APIFUNCTION double CDECL GetActorRotY(unsigned int index) noexcept;
/** /**
* \brief Get the Z rotation of the actor at a certain index in the read actor list. * \brief Get the Z rotation of the actor at a certain index in the read actor list.
@ -240,7 +240,7 @@ public:
* \param index The index of the actor. * \param index The index of the actor.
* \return The Z rotation. * \return The Z rotation.
*/ */
static double GetActorRotZ(unsigned int index) noexcept; EXPORT_APIFUNCTION double CDECL GetActorRotZ(unsigned int index) noexcept;
/** /**
* \brief Get the base health of the actor at a certain index in the read actor list. * \brief Get the base health of the actor at a certain index in the read actor list.
@ -248,7 +248,7 @@ public:
* \param index The index of the actor. * \param index The index of the actor.
* \return The base health. * \return The base health.
*/ */
static double GetActorHealthBase(unsigned int index) noexcept; EXPORT_APIFUNCTION double CDECL GetActorHealthBase(unsigned int index) noexcept;
/** /**
* \brief Get the current health of the actor at a certain index in the read actor list. * \brief Get the current health of the actor at a certain index in the read actor list.
@ -256,7 +256,7 @@ public:
* \param index The index of the actor. * \param index The index of the actor.
* \return The current health. * \return The current health.
*/ */
static double GetActorHealthCurrent(unsigned int index) noexcept; EXPORT_APIFUNCTION double CDECL GetActorHealthCurrent(unsigned int index) noexcept;
/** /**
* \brief Get the modified health of the actor at a certain index in the read actor list. * \brief Get the modified health of the actor at a certain index in the read actor list.
@ -264,7 +264,7 @@ public:
* \param index The index of the actor. * \param index The index of the actor.
* \return The modified health. * \return The modified health.
*/ */
static double GetActorHealthModified(unsigned int index) noexcept; EXPORT_APIFUNCTION double CDECL GetActorHealthModified(unsigned int index) noexcept;
/** /**
* \brief Get the base magicka of the actor at a certain index in the read actor list. * \brief Get the base magicka of the actor at a certain index in the read actor list.
@ -272,7 +272,7 @@ public:
* \param index The index of the actor. * \param index The index of the actor.
* \return The base magicka. * \return The base magicka.
*/ */
static double GetActorMagickaBase(unsigned int index) noexcept; EXPORT_APIFUNCTION double CDECL GetActorMagickaBase(unsigned int index) noexcept;
/** /**
* \brief Get the current magicka of the actor at a certain index in the read actor list. * \brief Get the current magicka of the actor at a certain index in the read actor list.
@ -280,7 +280,7 @@ public:
* \param index The index of the actor. * \param index The index of the actor.
* \return The current magicka. * \return The current magicka.
*/ */
static double GetActorMagickaCurrent(unsigned int index) noexcept; EXPORT_APIFUNCTION double CDECL GetActorMagickaCurrent(unsigned int index) noexcept;
/** /**
* \brief Get the modified magicka of the actor at a certain index in the read actor list. * \brief Get the modified magicka of the actor at a certain index in the read actor list.
@ -288,7 +288,7 @@ public:
* \param index The index of the actor. * \param index The index of the actor.
* \return The modified magicka. * \return The modified magicka.
*/ */
static double GetActorMagickaModified(unsigned int index) noexcept; EXPORT_APIFUNCTION double CDECL GetActorMagickaModified(unsigned int index) noexcept;
/** /**
* \brief Get the base fatigue of the actor at a certain index in the read actor list. * \brief Get the base fatigue of the actor at a certain index in the read actor list.
@ -296,7 +296,7 @@ public:
* \param index The index of the actor. * \param index The index of the actor.
* \return The base fatigue. * \return The base fatigue.
*/ */
static double GetActorFatigueBase(unsigned int index) noexcept; EXPORT_APIFUNCTION double CDECL GetActorFatigueBase(unsigned int index) noexcept;
/** /**
* \brief Get the current fatigue of the actor at a certain index in the read actor list. * \brief Get the current fatigue of the actor at a certain index in the read actor list.
@ -304,7 +304,7 @@ public:
* \param index The index of the actor. * \param index The index of the actor.
* \return The current fatigue. * \return The current fatigue.
*/ */
static double GetActorFatigueCurrent(unsigned int index) noexcept; EXPORT_APIFUNCTION double CDECL GetActorFatigueCurrent(unsigned int index) noexcept;
/** /**
* \brief Get the modified fatigue of the actor at a certain index in the read actor list. * \brief Get the modified fatigue of the actor at a certain index in the read actor list.
@ -312,7 +312,7 @@ public:
* \param index The index of the actor. * \param index The index of the actor.
* \return The modified fatigue. * \return The modified fatigue.
*/ */
static double GetActorFatigueModified(unsigned int index) noexcept; EXPORT_APIFUNCTION double CDECL GetActorFatigueModified(unsigned int index) noexcept;
/** /**
* \brief Get the refId of the item in a certain slot of the equipment of the actor at a * \brief Get the refId of the item in a certain slot of the equipment of the actor at a
@ -322,7 +322,7 @@ public:
* \param slot The slot of the equipment item. * \param slot The slot of the equipment item.
* \return The refId. * \return The refId.
*/ */
static const char *GetActorEquipmentItemRefId(unsigned int index, unsigned short slot) noexcept; EXPORT_APIFUNCTION const char *CDECL GetActorEquipmentItemRefId(unsigned int index, unsigned short slot) noexcept;
/** /**
* \brief Get the count of the item in a certain slot of the equipment of the actor at a * \brief Get the count of the item in a certain slot of the equipment of the actor at a
@ -332,7 +332,7 @@ public:
* \param slot The slot of the equipment item. * \param slot The slot of the equipment item.
* \return The item count. * \return The item count.
*/ */
static int GetActorEquipmentItemCount(unsigned int index, unsigned short slot) noexcept; EXPORT_APIFUNCTION int CDECL GetActorEquipmentItemCount(unsigned int index, unsigned short slot) noexcept;
/** /**
* \brief Get the charge of the item in a certain slot of the equipment of the actor at a * \brief Get the charge of the item in a certain slot of the equipment of the actor at a
@ -342,7 +342,7 @@ public:
* \param slot The slot of the equipment item. * \param slot The slot of the equipment item.
* \return The charge. * \return The charge.
*/ */
static int GetActorEquipmentItemCharge(unsigned int index, unsigned short slot) noexcept; EXPORT_APIFUNCTION int CDECL GetActorEquipmentItemCharge(unsigned int index, unsigned short slot) noexcept;
/** /**
* \brief Get the enchantment charge of the item in a certain slot of the equipment of the actor at a * \brief Get the enchantment charge of the item in a certain slot of the equipment of the actor at a
@ -352,7 +352,7 @@ public:
* \param slot The slot of the equipment item. * \param slot The slot of the equipment item.
* \return The enchantment charge. * \return The enchantment charge.
*/ */
static double GetActorEquipmentItemEnchantmentCharge(unsigned int index, unsigned short slot) noexcept; EXPORT_APIFUNCTION double CDECL GetActorEquipmentItemEnchantmentCharge(unsigned int index, unsigned short slot) noexcept;
/** /**
* \brief Check whether the killer of the actor at a certain index in the read actor list is a player. * \brief Check whether the killer of the actor at a certain index in the read actor list is a player.
@ -360,7 +360,7 @@ public:
* \param index The index of the actor. * \param index The index of the actor.
* \return Whether the actor was killed by a player. * \return Whether the actor was killed by a player.
*/ */
static bool DoesActorHavePlayerKiller(unsigned int index) noexcept; EXPORT_APIFUNCTION bool CDECL DoesActorHavePlayerKiller(unsigned int index) noexcept;
/** /**
* \brief Get the player ID of the killer of the actor at a certain index in the read actor list. * \brief Get the player ID of the killer of the actor at a certain index in the read actor list.
@ -368,7 +368,7 @@ public:
* \param index The index of the actor. * \param index The index of the actor.
* \return The player ID of the killer. * \return The player ID of the killer.
*/ */
static int GetActorKillerPid(unsigned int index) noexcept; EXPORT_APIFUNCTION int CDECL GetActorKillerPid(unsigned int index) noexcept;
/** /**
* \brief Get the refId of the actor killer of the actor at a certain index in the read actor list. * \brief Get the refId of the actor killer of the actor at a certain index in the read actor list.
@ -376,7 +376,7 @@ public:
* \param index The index of the actor. * \param index The index of the actor.
* \return The refId of the killer. * \return The refId of the killer.
*/ */
static const char *GetActorKillerRefId(unsigned int index) noexcept; EXPORT_APIFUNCTION const char *CDECL GetActorKillerRefId(unsigned int index) noexcept;
/** /**
* \brief Get the refNum of the actor killer of the actor at a certain index in the read actor list. * \brief Get the refNum of the actor killer of the actor at a certain index in the read actor list.
@ -384,7 +384,7 @@ public:
* \param index The index of the actor. * \param index The index of the actor.
* \return The refNum of the killer. * \return The refNum of the killer.
*/ */
static unsigned int GetActorKillerRefNum(unsigned int index) noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetActorKillerRefNum(unsigned int index) noexcept;
/** /**
* \brief Get the mpNum of the actor killer of the actor at a certain index in the read actor list. * \brief Get the mpNum of the actor killer of the actor at a certain index in the read actor list.
@ -392,7 +392,7 @@ public:
* \param index The index of the actor. * \param index The index of the actor.
* \return The mpNum of the killer. * \return The mpNum of the killer.
*/ */
static unsigned int GetActorKillerMpNum(unsigned int index) noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetActorKillerMpNum(unsigned int index) noexcept;
/** /**
* \brief Get the name of the actor killer of the actor at a certain index in the read actor list. * \brief Get the name of the actor killer of the actor at a certain index in the read actor list.
@ -400,7 +400,7 @@ public:
* \param index The index of the actor. * \param index The index of the actor.
* \return The name of the killer. * \return The name of the killer.
*/ */
static const char *GetActorKillerName(unsigned int index) noexcept; EXPORT_APIFUNCTION const char *CDECL GetActorKillerName(unsigned int index) noexcept;
/** /**
* \brief Check whether there is any positional data for the actor at a certain index in * \brief Check whether there is any positional data for the actor at a certain index in
@ -411,7 +411,7 @@ public:
* \param index The index of the actor. * \param index The index of the actor.
* \return Whether the read actor list contains positional data. * \return Whether the read actor list contains positional data.
*/ */
static bool DoesActorHavePosition(unsigned int index) noexcept; EXPORT_APIFUNCTION bool CDECL DoesActorHavePosition(unsigned int index) noexcept;
/** /**
* \brief Check whether there is any dynamic stats data for the actor at a certain index in * \brief Check whether there is any dynamic stats data for the actor at a certain index in
@ -422,7 +422,7 @@ public:
* \param index The index of the actor. * \param index The index of the actor.
* \return Whether the read actor list contains dynamic stats data. * \return Whether the read actor list contains dynamic stats data.
*/ */
static bool DoesActorHaveStatsDynamic(unsigned int index) noexcept; EXPORT_APIFUNCTION bool CDECL DoesActorHaveStatsDynamic(unsigned int index) noexcept;
/** /**
* \brief Set the cell of the temporary actor list stored on the server. * \brief Set the cell of the temporary actor list stored on the server.
@ -433,7 +433,7 @@ public:
* \param cellDescription The description of the cell. * \param cellDescription The description of the cell.
* \return void * \return void
*/ */
static void SetActorListCell(const char* cellDescription) noexcept; EXPORT_APIFUNCTION void CDECL SetActorListCell(const char* cellDescription) noexcept;
/** /**
* \brief Set the action type of the temporary actor list stored on the server. * \brief Set the action type of the temporary actor list stored on the server.
@ -441,7 +441,7 @@ public:
* \param action The action type (0 for SET, 1 for ADD, 2 for REMOVE, 3 for REQUEST). * \param action The action type (0 for SET, 1 for ADD, 2 for REMOVE, 3 for REQUEST).
* \return void * \return void
*/ */
static void SetActorListAction(unsigned char action) noexcept; EXPORT_APIFUNCTION void CDECL SetActorListAction(unsigned char action) noexcept;
/** /**
* \brief Set the cell of the temporary actor stored on the server. * \brief Set the cell of the temporary actor stored on the server.
@ -455,7 +455,7 @@ public:
* \param cellDescription The description of the cell. * \param cellDescription The description of the cell.
* \return void * \return void
*/ */
static void SetActorCell(const char* cellDescription) noexcept; EXPORT_APIFUNCTION void CDECL SetActorCell(const char* cellDescription) noexcept;
/** /**
* \brief Set the refId of the temporary actor stored on the server. * \brief Set the refId of the temporary actor stored on the server.
@ -463,7 +463,7 @@ public:
* \param refId The refId. * \param refId The refId.
* \return void * \return void
*/ */
static void SetActorRefId(const char* refId) noexcept; EXPORT_APIFUNCTION void CDECL SetActorRefId(const char* refId) noexcept;
/** /**
* \brief Set the refNum of the temporary actor stored on the server. * \brief Set the refNum of the temporary actor stored on the server.
@ -471,7 +471,7 @@ public:
* \param refNum The refNum. * \param refNum The refNum.
* \return void * \return void
*/ */
static void SetActorRefNum(int refNum) noexcept; EXPORT_APIFUNCTION void CDECL SetActorRefNum(int refNum) noexcept;
/** /**
* \brief Set the mpNum of the temporary actor stored on the server. * \brief Set the mpNum of the temporary actor stored on the server.
@ -479,7 +479,7 @@ public:
* \param mpNum The mpNum. * \param mpNum The mpNum.
* \return void * \return void
*/ */
static void SetActorMpNum(int mpNum) noexcept; EXPORT_APIFUNCTION void CDECL SetActorMpNum(int mpNum) noexcept;
/** /**
* \brief Set the position of the temporary actor stored on the server. * \brief Set the position of the temporary actor stored on the server.
@ -489,7 +489,7 @@ public:
* \param z The Z position. * \param z The Z position.
* \return void * \return void
*/ */
static void SetActorPosition(double x, double y, double z) noexcept; EXPORT_APIFUNCTION void CDECL SetActorPosition(double x, double y, double z) noexcept;
/** /**
* \brief Set the rotation of the temporary actor stored on the server. * \brief Set the rotation of the temporary actor stored on the server.
@ -499,7 +499,7 @@ public:
* \param z The Z rotation. * \param z The Z rotation.
* \return void * \return void
*/ */
static void SetActorRotation(double x, double y, double z) noexcept; EXPORT_APIFUNCTION void CDECL SetActorRotation(double x, double y, double z) noexcept;
/** /**
* \brief Set the base health of the temporary actor stored on the server. * \brief Set the base health of the temporary actor stored on the server.
@ -507,7 +507,7 @@ public:
* \param value The new value. * \param value The new value.
* \return void * \return void
*/ */
static void SetActorHealthBase(double value) noexcept; EXPORT_APIFUNCTION void CDECL SetActorHealthBase(double value) noexcept;
/** /**
* \brief Set the current health of the temporary actor stored on the server. * \brief Set the current health of the temporary actor stored on the server.
@ -515,7 +515,7 @@ public:
* \param value The new value. * \param value The new value.
* \return void * \return void
*/ */
static void SetActorHealthCurrent(double value) noexcept; EXPORT_APIFUNCTION void CDECL SetActorHealthCurrent(double value) noexcept;
/** /**
* \brief Set the modified health of the temporary actor stored on the server. * \brief Set the modified health of the temporary actor stored on the server.
@ -523,7 +523,7 @@ public:
* \param value The new value. * \param value The new value.
* \return void * \return void
*/ */
static void SetActorHealthModified(double value) noexcept; EXPORT_APIFUNCTION void CDECL SetActorHealthModified(double value) noexcept;
/** /**
* \brief Set the base magicka of the temporary actor stored on the server. * \brief Set the base magicka of the temporary actor stored on the server.
@ -531,7 +531,7 @@ public:
* \param value The new value. * \param value The new value.
* \return void * \return void
*/ */
static void SetActorMagickaBase(double value) noexcept; EXPORT_APIFUNCTION void CDECL SetActorMagickaBase(double value) noexcept;
/** /**
* \brief Set the current magicka of the temporary actor stored on the server. * \brief Set the current magicka of the temporary actor stored on the server.
@ -539,7 +539,7 @@ public:
* \param value The new value. * \param value The new value.
* \return void * \return void
*/ */
static void SetActorMagickaCurrent(double value) noexcept; EXPORT_APIFUNCTION void CDECL SetActorMagickaCurrent(double value) noexcept;
/** /**
* \brief Set the modified magicka of the temporary actor stored on the server. * \brief Set the modified magicka of the temporary actor stored on the server.
@ -547,7 +547,7 @@ public:
* \param value The new value. * \param value The new value.
* \return void * \return void
*/ */
static void SetActorMagickaModified(double value) noexcept; EXPORT_APIFUNCTION void CDECL SetActorMagickaModified(double value) noexcept;
/** /**
* \brief Set the base fatigue of the temporary actor stored on the server. * \brief Set the base fatigue of the temporary actor stored on the server.
@ -555,7 +555,7 @@ public:
* \param value The new value. * \param value The new value.
* \return void * \return void
*/ */
static void SetActorFatigueBase(double value) noexcept; EXPORT_APIFUNCTION void CDECL SetActorFatigueBase(double value) noexcept;
/** /**
* \brief Set the current fatigue of the temporary actor stored on the server. * \brief Set the current fatigue of the temporary actor stored on the server.
@ -563,7 +563,7 @@ public:
* \param value The new value. * \param value The new value.
* \return void * \return void
*/ */
static void SetActorFatigueCurrent(double value) noexcept; EXPORT_APIFUNCTION void CDECL SetActorFatigueCurrent(double value) noexcept;
/** /**
* \brief Set the modified fatigue of the temporary actor stored on the server. * \brief Set the modified fatigue of the temporary actor stored on the server.
@ -571,7 +571,7 @@ public:
* \param value The new value. * \param value The new value.
* \return void * \return void
*/ */
static void SetActorFatigueModified(double value) noexcept; EXPORT_APIFUNCTION void CDECL SetActorFatigueModified(double value) noexcept;
/** /**
* \brief Set the sound of the temporary actor stored on the server. * \brief Set the sound of the temporary actor stored on the server.
@ -579,7 +579,7 @@ public:
* \param sound The sound. * \param sound The sound.
* \return void * \return void
*/ */
static void SetActorSound(const char* sound) noexcept; EXPORT_APIFUNCTION void CDECL SetActorSound(const char* sound) noexcept;
/** /**
* \brief Set the AI action of the temporary actor stored on the server. * \brief Set the AI action of the temporary actor stored on the server.
@ -587,7 +587,7 @@ public:
* \param action The new action. * \param action The new action.
* \return void * \return void
*/ */
static void SetActorAIAction(unsigned int action) noexcept; EXPORT_APIFUNCTION void CDECL SetActorAIAction(unsigned int action) noexcept;
/** /**
* \brief Set a player as the AI target of the temporary actor stored on the server. * \brief Set a player as the AI target of the temporary actor stored on the server.
@ -595,7 +595,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return void * \return void
*/ */
static void SetActorAITargetToPlayer(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL SetActorAITargetToPlayer(unsigned short pid) noexcept;
/** /**
* \brief Set another object as the AI target of the temporary actor stored on the server. * \brief Set another object as the AI target of the temporary actor stored on the server.
@ -604,7 +604,7 @@ public:
* \param mpNum The mpNum of the target object. * \param mpNum The mpNum of the target object.
* \return void * \return void
*/ */
static void SetActorAITargetToObject(int refNum, int mpNum) noexcept; EXPORT_APIFUNCTION void CDECL SetActorAITargetToObject(int refNum, int mpNum) noexcept;
/** /**
* \brief Set the coordinates for the AI package associated with the current AI action. * \brief Set the coordinates for the AI package associated with the current AI action.
@ -614,7 +614,7 @@ public:
* \param z The Z coordinate. * \param z The Z coordinate.
* \return void * \return void
*/ */
static void SetActorAICoordinates(double x, double y, double z) noexcept; EXPORT_APIFUNCTION void CDECL SetActorAICoordinates(double x, double y, double z) noexcept;
/** /**
* \brief Set the distance of the AI package associated with the current AI action. * \brief Set the distance of the AI package associated with the current AI action.
@ -622,7 +622,7 @@ public:
* \param duration The distance of the package. * \param duration The distance of the package.
* \return void * \return void
*/ */
static void SetActorAIDistance(unsigned int distance) noexcept; EXPORT_APIFUNCTION void CDECL SetActorAIDistance(unsigned int distance) noexcept;
/** /**
* \brief Set the duration of the AI package associated with the current AI action. * \brief Set the duration of the AI package associated with the current AI action.
@ -630,7 +630,7 @@ public:
* \param duration The duration of the package. * \param duration The duration of the package.
* \return void * \return void
*/ */
static void SetActorAIDuration(unsigned int duration) noexcept; EXPORT_APIFUNCTION void CDECL SetActorAIDuration(unsigned int duration) noexcept;
/** /**
* \brief Set whether the current AI package should be repeated. * \brief Set whether the current AI package should be repeated.
@ -640,7 +640,7 @@ public:
* \param shouldRepeat Whether the package should be repeated. * \param shouldRepeat Whether the package should be repeated.
* \return void * \return void
*/ */
static void SetActorAIRepetition(bool shouldRepeat) noexcept; EXPORT_APIFUNCTION void CDECL SetActorAIRepetition(bool shouldRepeat) noexcept;
/** /**
* \brief Equip an item in a certain slot of the equipment of the temporary actor stored * \brief Equip an item in a certain slot of the equipment of the temporary actor stored
@ -653,7 +653,7 @@ public:
* \param enchantmentCharge The enchantment charge of the item. * \param enchantmentCharge The enchantment charge of the item.
* \return void * \return void
*/ */
static void EquipActorItem(unsigned short slot, const char* refId, unsigned int count, int charge, double enchantmentCharge = -1) noexcept; EXPORT_APIFUNCTION void CDECL EquipActorItem(unsigned short slot, const char* refId, unsigned int count, int charge, double enchantmentCharge = -1) noexcept;
/** /**
* \brief Unequip the item in a certain slot of the equipment of the temporary actor stored * \brief Unequip the item in a certain slot of the equipment of the temporary actor stored
@ -662,7 +662,7 @@ public:
* \param slot The equipment slot. * \param slot The equipment slot.
* \return void * \return void
*/ */
static void UnequipActorItem(unsigned short slot) noexcept; EXPORT_APIFUNCTION void CDECL UnequipActorItem(unsigned short slot) noexcept;
/** /**
* \brief Add a copy of the server's temporary actor to the server's temporary actor list. * \brief Add a copy of the server's temporary actor to the server's temporary actor list.
@ -672,7 +672,7 @@ public:
* *
* \return void * \return void
*/ */
static void AddActor() noexcept; EXPORT_APIFUNCTION void CDECL AddActor() noexcept;
/** /**
* \brief Send an ActorList packet. * \brief Send an ActorList packet.
@ -681,7 +681,7 @@ public:
* *
* \return void * \return void
*/ */
static void SendActorList() noexcept; EXPORT_APIFUNCTION void CDECL SendActorList() noexcept;
/** /**
* \brief Send an ActorAuthority packet. * \brief Send an ActorAuthority packet.
@ -693,7 +693,7 @@ public:
* *
* \return void * \return void
*/ */
static void SendActorAuthority() noexcept; EXPORT_APIFUNCTION void CDECL SendActorAuthority() noexcept;
/** /**
* \brief Send an ActorPosition packet. * \brief Send an ActorPosition packet.
@ -705,7 +705,7 @@ public:
* *
* \return void * \return void
*/ */
static void SendActorPosition(bool sendToOtherVisitors, bool skipAttachedPlayer) noexcept; EXPORT_APIFUNCTION void CDECL SendActorPosition(bool sendToOtherVisitors, bool skipAttachedPlayer) noexcept;
/** /**
* \brief Send an ActorStatsDynamic packet. * \brief Send an ActorStatsDynamic packet.
@ -717,7 +717,7 @@ public:
* *
* \return void * \return void
*/ */
static void SendActorStatsDynamic(bool sendToOtherVisitors, bool skipAttachedPlayer) noexcept; EXPORT_APIFUNCTION void CDECL SendActorStatsDynamic(bool sendToOtherVisitors, bool skipAttachedPlayer) noexcept;
/** /**
* \brief Send an ActorEquipment packet. * \brief Send an ActorEquipment packet.
@ -729,7 +729,7 @@ public:
* *
* \return void * \return void
*/ */
static void SendActorEquipment(bool sendToOtherVisitors, bool skipAttachedPlayer) noexcept; EXPORT_APIFUNCTION void CDECL SendActorEquipment(bool sendToOtherVisitors, bool skipAttachedPlayer) noexcept;
/** /**
* \brief Send an ActorSpeech packet. * \brief Send an ActorSpeech packet.
@ -740,7 +740,7 @@ public:
* to the packet (false by default). * to the packet (false by default).
* \return void * \return void
*/ */
static void SendActorSpeech(bool sendToOtherVisitors, bool skipAttachedPlayer) noexcept; EXPORT_APIFUNCTION void CDECL SendActorSpeech(bool sendToOtherVisitors, bool skipAttachedPlayer) noexcept;
/** /**
* \brief Send an ActorAI packet. * \brief Send an ActorAI packet.
@ -751,7 +751,7 @@ public:
* to the packet (false by default). * to the packet (false by default).
* \return void * \return void
*/ */
static void SendActorAI(bool sendToOtherVisitors, bool skipAttachedPlayer) noexcept; EXPORT_APIFUNCTION void CDECL SendActorAI(bool sendToOtherVisitors, bool skipAttachedPlayer) noexcept;
/** /**
* \brief Send an ActorCellChange packet. * \brief Send an ActorCellChange packet.
@ -763,18 +763,18 @@ public:
* *
* \return void * \return void
*/ */
static void SendActorCellChange(bool sendToOtherVisitors, bool skipAttachedPlayer) noexcept; EXPORT_APIFUNCTION void CDECL SendActorCellChange(bool sendToOtherVisitors, bool skipAttachedPlayer) noexcept;
// All methods below are deprecated versions of methods from above // All methods below are deprecated versions of methods from above
static void ReadLastActorList() noexcept; EXPORT_APIFUNCTION void CDECL ReadLastActorList() noexcept;
static void InitializeActorList(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL InitializeActorList(unsigned short pid) noexcept;
static void CopyLastActorListToStore() noexcept; EXPORT_APIFUNCTION void CDECL CopyLastActorListToStore() noexcept;
static unsigned int GetActorRefNumIndex(unsigned int index) noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetActorRefNumIndex(unsigned int index) noexcept;
static unsigned int GetActorKillerRefNumIndex(unsigned int index) noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetActorKillerRefNumIndex(unsigned int index) noexcept;
static void SetActorRefNumIndex(int refNum) noexcept; EXPORT_APIFUNCTION void CDECL SetActorRefNumIndex(int refNum) noexcept;
}; }
#endif //OPENMW_ACTORAPI_HPP #endif //OPENMW_ACTORAPI_HPP

View file

@ -7,7 +7,7 @@
using namespace mwmp; using namespace mwmp;
void BookFunctions::ClearBookChanges(unsigned short pid) noexcept extern "C" void BookFunctions::ClearBookChanges(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -15,7 +15,7 @@ void BookFunctions::ClearBookChanges(unsigned short pid) noexcept
player->bookChanges.books.clear(); player->bookChanges.books.clear();
} }
unsigned int BookFunctions::GetBookChangesSize(unsigned short pid) noexcept extern "C" unsigned int BookFunctions::GetBookChangesSize(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -23,7 +23,7 @@ unsigned int BookFunctions::GetBookChangesSize(unsigned short pid) noexcept
return player->bookChanges.count; return player->bookChanges.count;
} }
void BookFunctions::AddBook(unsigned short pid, const char* bookId) noexcept extern "C" void BookFunctions::AddBook(unsigned short pid, const char* bookId) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -34,7 +34,7 @@ void BookFunctions::AddBook(unsigned short pid, const char* bookId) noexcept
player->bookChanges.books.push_back(book); player->bookChanges.books.push_back(book);
} }
const char *BookFunctions::GetBookId(unsigned short pid, unsigned int index) noexcept extern "C" const char *BookFunctions::GetBookId(unsigned short pid, unsigned int index) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ""); GET_PLAYER(pid, player, "");
@ -45,7 +45,7 @@ const char *BookFunctions::GetBookId(unsigned short pid, unsigned int index) noe
return player->bookChanges.books.at(index).bookId.c_str(); return player->bookChanges.books.at(index).bookId.c_str();
} }
void BookFunctions::SendBookChanges(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept extern "C" void BookFunctions::SendBookChanges(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -62,7 +62,7 @@ void BookFunctions::SendBookChanges(unsigned short pid, bool sendToOtherPlayers,
// All methods below are deprecated versions of methods from above // All methods below are deprecated versions of methods from above
void BookFunctions::InitializeBookChanges(unsigned short pid) noexcept extern "C" void BookFunctions::InitializeBookChanges(unsigned short pid) noexcept
{ {
ClearBookChanges(pid); ClearBookChanges(pid);
} }

View file

@ -1,6 +1,8 @@
#ifndef OPENMW_BOOKAPI_HPP #ifndef OPENMW_BOOKAPI_HPP
#define OPENMW_BOOKAPI_HPP #define OPENMW_BOOKAPI_HPP
#include <Script/Platform.hpp>
#define BOOKAPI \ #define BOOKAPI \
{"ClearBookChanges", BookFunctions::ClearBookChanges},\ {"ClearBookChanges", BookFunctions::ClearBookChanges},\
\ \
@ -14,9 +16,8 @@
\ \
{"InitializeBookChanges", BookFunctions::InitializeBookChanges} {"InitializeBookChanges", BookFunctions::InitializeBookChanges}
class BookFunctions namespace BookFunctions
{ {
public:
/** /**
* \brief Clear the last recorded book changes for a player. * \brief Clear the last recorded book changes for a player.
@ -26,7 +27,7 @@ public:
* \param pid The player ID whose book changes should be used. * \param pid The player ID whose book changes should be used.
* \return void * \return void
*/ */
static void ClearBookChanges(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL ClearBookChanges(unsigned short pid) noexcept;
/** /**
* \brief Get the number of indexes in a player's latest book changes. * \brief Get the number of indexes in a player's latest book changes.
@ -34,7 +35,7 @@ public:
* \param pid The player ID whose book changes should be used. * \param pid The player ID whose book changes should be used.
* \return The number of indexes. * \return The number of indexes.
*/ */
static unsigned int GetBookChangesSize(unsigned short pid) noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetBookChangesSize(unsigned short pid) noexcept;
/** /**
* \brief Add a new book to the book changes for a player. * \brief Add a new book to the book changes for a player.
@ -43,7 +44,7 @@ public:
* \param bookId The bookId of the book. * \param bookId The bookId of the book.
* \return void * \return void
*/ */
static void AddBook(unsigned short pid, const char* bookId) noexcept; EXPORT_APIFUNCTION void CDECL AddBook(unsigned short pid, const char* bookId) noexcept;
/** /**
* \brief Get the bookId at a certain index in a player's latest book changes. * \brief Get the bookId at a certain index in a player's latest book changes.
@ -52,7 +53,7 @@ public:
* \param index The index of the book. * \param index The index of the book.
* \return The bookId. * \return The bookId.
*/ */
static const char *GetBookId(unsigned short pid, unsigned int index) noexcept; EXPORT_APIFUNCTION const char *CDECL GetBookId(unsigned short pid, unsigned int index) noexcept;
/** /**
* \brief Send a PlayerBook packet with a player's recorded book changes. * \brief Send a PlayerBook packet with a player's recorded book changes.
@ -64,12 +65,11 @@ public:
* to the packet (false by default). * to the packet (false by default).
* \return void * \return void
*/ */
static void SendBookChanges(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept; EXPORT_APIFUNCTION void CDECL SendBookChanges(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept;
// All methods below are deprecated versions of methods from above // All methods below are deprecated versions of methods from above
static void InitializeBookChanges(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL InitializeBookChanges(unsigned short pid) noexcept;
}
};
#endif //OPENMW_BOOKAPI_HPP #endif //OPENMW_BOOKAPI_HPP

View file

@ -12,7 +12,7 @@ using namespace std;
static std::string tempCellDescription; static std::string tempCellDescription;
unsigned int CellFunctions::GetCellStateChangesSize(unsigned short pid) noexcept extern "C" unsigned int CellFunctions::GetCellStateChangesSize(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -20,7 +20,7 @@ unsigned int CellFunctions::GetCellStateChangesSize(unsigned short pid) noexcept
return player->cellStateChanges.count; return player->cellStateChanges.count;
} }
unsigned int CellFunctions::GetCellStateType(unsigned short pid, unsigned int index) noexcept extern "C" unsigned int CellFunctions::GetCellStateType(unsigned short pid, unsigned int index) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -28,7 +28,7 @@ unsigned int CellFunctions::GetCellStateType(unsigned short pid, unsigned int in
return player->cellStateChanges.cellStates.at(index).type; return player->cellStateChanges.cellStates.at(index).type;
} }
const char *CellFunctions::GetCellStateDescription(unsigned short pid, unsigned int index) noexcept extern "C" const char *CellFunctions::GetCellStateDescription(unsigned short pid, unsigned int index) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ""); GET_PLAYER(pid, player, "");
@ -40,30 +40,30 @@ const char *CellFunctions::GetCellStateDescription(unsigned short pid, unsigned
return tempCellDescription.c_str(); return tempCellDescription.c_str();
} }
const char *CellFunctions::GetCell(unsigned short pid) noexcept extern "C" const char *CellFunctions::GetCell(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
tempCellDescription = player->cell.getDescription().c_str(); tempCellDescription = player->cell.getDescription();
return tempCellDescription.c_str(); return tempCellDescription.c_str();
} }
int CellFunctions::GetExteriorX(unsigned short pid) noexcept extern "C" int CellFunctions::GetExteriorX(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
return player->cell.mData.mX; return player->cell.mData.mX;
} }
int CellFunctions::GetExteriorY(unsigned short pid) noexcept extern "C" int CellFunctions::GetExteriorY(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
return player->cell.mData.mY; return player->cell.mData.mY;
} }
bool CellFunctions::IsInExterior(unsigned short pid) noexcept extern "C" bool CellFunctions::IsInExterior(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, false); GET_PLAYER(pid, player, false);
@ -71,7 +71,7 @@ bool CellFunctions::IsInExterior(unsigned short pid) noexcept
return player->cell.isExterior(); return player->cell.isExterior();
} }
const char *CellFunctions::GetRegion(unsigned short pid) noexcept extern "C" const char *CellFunctions::GetRegion(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -79,7 +79,7 @@ const char *CellFunctions::GetRegion(unsigned short pid) noexcept
return player->cell.mRegion.c_str(); return player->cell.mRegion.c_str();
} }
bool CellFunctions::IsChangingRegion(unsigned short pid) noexcept extern "C" bool CellFunctions::IsChangingRegion(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, false); GET_PLAYER(pid, player, false);
@ -87,7 +87,7 @@ bool CellFunctions::IsChangingRegion(unsigned short pid) noexcept
return player->isChangingRegion; return player->isChangingRegion;
} }
void CellFunctions::SetCell(unsigned short pid, const char *cellDescription) noexcept extern "C" void CellFunctions::SetCell(unsigned short pid, const char *cellDescription) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);
@ -98,7 +98,7 @@ void CellFunctions::SetCell(unsigned short pid, const char *cellDescription) noe
player->cell = Utils::getCellFromDescription(cellDescription); player->cell = Utils::getCellFromDescription(cellDescription);
} }
void CellFunctions::SetExteriorCell(unsigned short pid, int x, int y) noexcept extern "C" void CellFunctions::SetExteriorCell(unsigned short pid, int x, int y) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);
@ -115,7 +115,7 @@ void CellFunctions::SetExteriorCell(unsigned short pid, int x, int y) noexcept
player->cell.mData.mY = y; player->cell.mData.mY = y;
} }
void CellFunctions::SendCell(unsigned short pid) noexcept extern "C" void CellFunctions::SendCell(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );

View file

@ -3,6 +3,8 @@
#include "../Types.hpp" #include "../Types.hpp"
#include <Script/Platform.hpp>
#define CELLAPI \ #define CELLAPI \
{"GetCellStateChangesSize", CellFunctions::GetCellStateChangesSize},\ {"GetCellStateChangesSize", CellFunctions::GetCellStateChangesSize},\
\ \
@ -23,17 +25,15 @@
{"SendCell", CellFunctions::SendCell} {"SendCell", CellFunctions::SendCell}
class CellFunctions namespace CellFunctions
{ {
public:
/** /**
* \brief Get the number of indexes in a player's latest cell state changes. * \brief Get the number of indexes in a player's latest cell state changes.
* *
* \param pid The player ID whose cell state changes should be used. * \param pid The player ID whose cell state changes should be used.
* \return The number of indexes. * \return The number of indexes.
*/ */
static unsigned int GetCellStateChangesSize(unsigned short pid) noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetCellStateChangesSize(unsigned short pid) noexcept;
/** /**
* \brief Get the cell state type at a certain index in a player's latest cell state changes. * \brief Get the cell state type at a certain index in a player's latest cell state changes.
@ -42,7 +42,7 @@ public:
* \param index The index of the cell state. * \param index The index of the cell state.
* \return The cell state type (0 for LOAD, 1 for UNLOAD). * \return The cell state type (0 for LOAD, 1 for UNLOAD).
*/ */
static unsigned int GetCellStateType(unsigned short pid, unsigned int index) noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetCellStateType(unsigned short pid, unsigned int index) noexcept;
/** /**
* \brief Get the cell description at a certain index in a player's latest cell state changes. * \brief Get the cell description at a certain index in a player's latest cell state changes.
@ -51,7 +51,7 @@ public:
* \param index The index of the cell state. * \param index The index of the cell state.
* \return The cell description. * \return The cell description.
*/ */
static const char *GetCellStateDescription(unsigned short pid, unsigned int index) noexcept; EXPORT_APIFUNCTION const char *CDECL GetCellStateDescription(unsigned short pid, unsigned int index) noexcept;
/** /**
* \brief Get the cell description of a player's cell. * \brief Get the cell description of a player's cell.
@ -59,7 +59,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The cell description. * \return The cell description.
*/ */
static const char *GetCell(unsigned short pid) noexcept; EXPORT_APIFUNCTION const char *CDECL GetCell(unsigned short pid) noexcept;
/** /**
* \brief Get the X coordinate of the player's exterior cell. * \brief Get the X coordinate of the player's exterior cell.
@ -67,7 +67,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The X coordinate of the cell. * \return The X coordinate of the cell.
*/ */
static int GetExteriorX(unsigned short pid) noexcept; EXPORT_APIFUNCTION int CDECL GetExteriorX(unsigned short pid) noexcept;
/** /**
* \brief Get the Y coordinate of the player's exterior cell. * \brief Get the Y coordinate of the player's exterior cell.
@ -75,7 +75,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The Y coordinate of the cell. * \return The Y coordinate of the cell.
*/ */
static int GetExteriorY(unsigned short pid) noexcept; EXPORT_APIFUNCTION int CDECL GetExteriorY(unsigned short pid) noexcept;
/** /**
* \brief Check whether the player is in an exterior cell or not. * \brief Check whether the player is in an exterior cell or not.
@ -83,7 +83,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return Whether the player is in an exterior cell. * \return Whether the player is in an exterior cell.
*/ */
static bool IsInExterior(unsigned short pid) noexcept; EXPORT_APIFUNCTION bool CDECL IsInExterior(unsigned short pid) noexcept;
/** /**
* \brief Get the region of the player's exterior cell. * \brief Get the region of the player's exterior cell.
@ -93,7 +93,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The region. * \return The region.
*/ */
static const char *GetRegion(unsigned short pid) noexcept; EXPORT_APIFUNCTION const char *CDECL GetRegion(unsigned short pid) noexcept;
/** /**
* \brief Check whether the player's last cell change has involved a region change. * \brief Check whether the player's last cell change has involved a region change.
@ -101,7 +101,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return Whether the player has changed their region. * \return Whether the player has changed their region.
*/ */
static bool IsChangingRegion(unsigned short pid) noexcept; EXPORT_APIFUNCTION bool CDECL IsChangingRegion(unsigned short pid) noexcept;
/** /**
* \brief Set the cell of a player. * \brief Set the cell of a player.
@ -116,7 +116,7 @@ public:
* \param cellDescription The cell description. * \param cellDescription The cell description.
* \return void * \return void
*/ */
static void SetCell(unsigned short pid, const char *cellDescription) noexcept; EXPORT_APIFUNCTION void CDECL SetCell(unsigned short pid, const char *cellDescription) noexcept;
/** /**
* \brief Set the cell of a player to an exterior cell. * \brief Set the cell of a player to an exterior cell.
@ -129,7 +129,7 @@ public:
* \param y The Y coordinate of the cell. * \param y The Y coordinate of the cell.
* \return void * \return void
*/ */
static void SetExteriorCell(unsigned short pid, int x, int y) noexcept; EXPORT_APIFUNCTION void CDECL SetExteriorCell(unsigned short pid, int x, int y) noexcept;
/** /**
* \brief Send a PlayerCellChange packet about a player. * \brief Send a PlayerCellChange packet about a player.
@ -139,8 +139,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return void * \return void
*/ */
static void SendCell(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL SendCell(unsigned short pid) noexcept;
}
};
#endif //OPENMW_CELLAPI_HPP #endif //OPENMW_CELLAPI_HPP

View file

@ -12,7 +12,7 @@
using namespace std; using namespace std;
using namespace ESM; using namespace ESM;
const char *CharClassFunctions::GetDefaultClass(unsigned short pid) noexcept extern "C" const char *CharClassFunctions::GetDefaultClass(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ""); GET_PLAYER(pid, player, "");
@ -20,7 +20,7 @@ const char *CharClassFunctions::GetDefaultClass(unsigned short pid) noexcept
return player->charClass.mId.c_str(); return player->charClass.mId.c_str();
} }
const char *CharClassFunctions::GetClassName(unsigned short pid) noexcept extern "C" const char *CharClassFunctions::GetClassName(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ""); GET_PLAYER(pid, player, "");
@ -28,7 +28,7 @@ const char *CharClassFunctions::GetClassName(unsigned short pid) noexcept
return player->charClass.mName.c_str(); return player->charClass.mName.c_str();
} }
const char *CharClassFunctions::GetClassDesc(unsigned short pid) noexcept extern "C" const char *CharClassFunctions::GetClassDesc(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ""); GET_PLAYER(pid, player, "");
@ -36,7 +36,7 @@ const char *CharClassFunctions::GetClassDesc(unsigned short pid) noexcept
return player->charClass.mDescription.c_str(); return player->charClass.mDescription.c_str();
} }
int CharClassFunctions::GetClassMajorAttribute(unsigned short pid, unsigned char slot) noexcept extern "C" int CharClassFunctions::GetClassMajorAttribute(unsigned short pid, unsigned char slot) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -47,7 +47,7 @@ int CharClassFunctions::GetClassMajorAttribute(unsigned short pid, unsigned char
return player->charClass.mData.mAttribute[slot]; return player->charClass.mData.mAttribute[slot];
} }
int CharClassFunctions::GetClassSpecialization(unsigned short pid) noexcept extern "C" int CharClassFunctions::GetClassSpecialization(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -55,7 +55,7 @@ int CharClassFunctions::GetClassSpecialization(unsigned short pid) noexcept
return player->charClass.mData.mSpecialization; return player->charClass.mData.mSpecialization;
} }
int CharClassFunctions::GetClassMajorSkill(unsigned short pid, unsigned char slot) noexcept extern "C" int CharClassFunctions::GetClassMajorSkill(unsigned short pid, unsigned char slot) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -66,7 +66,7 @@ int CharClassFunctions::GetClassMajorSkill(unsigned short pid, unsigned char slo
return player->charClass.mData.mSkills[slot][1]; return player->charClass.mData.mSkills[slot][1];
} }
int CharClassFunctions::GetClassMinorSkill(unsigned short pid, unsigned char slot) noexcept extern "C" int CharClassFunctions::GetClassMinorSkill(unsigned short pid, unsigned char slot) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -77,7 +77,7 @@ int CharClassFunctions::GetClassMinorSkill(unsigned short pid, unsigned char slo
return player->charClass.mData.mSkills[slot][0]; return player->charClass.mData.mSkills[slot][0];
} }
int CharClassFunctions::IsClassDefault(unsigned short pid) noexcept extern "C" int CharClassFunctions::IsClassDefault(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -85,29 +85,32 @@ int CharClassFunctions::IsClassDefault(unsigned short pid) noexcept
return !player->charClass.mId.empty(); // true if default return !player->charClass.mId.empty(); // true if default
} }
void CharClassFunctions::SetDefaultClass(unsigned short pid, const char *id) noexcept extern "C" void CharClassFunctions::SetDefaultClass(unsigned short pid, const char *id) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);
player->charClass.mId = id; player->charClass.mId = id;
} }
void CharClassFunctions::SetClassName(unsigned short pid, const char *name) noexcept
extern "C" void CharClassFunctions::SetClassName(unsigned short pid, const char *name) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);
player->charClass.mName = name; player->charClass.mName = name;
player->charClass.mId = ""; player->charClass.mId.clear();
} }
void CharClassFunctions::SetClassDesc(unsigned short pid, const char *desc) noexcept
extern "C" void CharClassFunctions::SetClassDesc(unsigned short pid, const char *desc) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);
player->charClass.mDescription = desc; player->charClass.mDescription = desc;
} }
void CharClassFunctions::SetClassMajorAttribute(unsigned short pid, unsigned char slot, int attrId) noexcept
extern "C" void CharClassFunctions::SetClassMajorAttribute(unsigned short pid, unsigned char slot, int attrId) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);
@ -118,14 +121,16 @@ void CharClassFunctions::SetClassMajorAttribute(unsigned short pid, unsigned cha
player->charClass.mData.mAttribute[slot] = attrId; player->charClass.mData.mAttribute[slot] = attrId;
} }
void CharClassFunctions::SetClassSpecialization(unsigned short pid, int spec) noexcept
extern "C" void CharClassFunctions::SetClassSpecialization(unsigned short pid, int spec) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);
player->charClass.mData.mSpecialization = spec; player->charClass.mData.mSpecialization = spec;
} }
void CharClassFunctions::SetClassMajorSkill(unsigned short pid, unsigned char slot, int skillId) noexcept
extern "C" void CharClassFunctions::SetClassMajorSkill(unsigned short pid, unsigned char slot, int skillId) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);
@ -135,7 +140,8 @@ void CharClassFunctions::SetClassMajorSkill(unsigned short pid, unsigned char sl
player->charClass.mData.mSkills[slot][1] = skillId; player->charClass.mData.mSkills[slot][1] = skillId;
} }
void CharClassFunctions::SetClassMinorSkill(unsigned short pid, unsigned char slot, int skillId) noexcept
extern "C" void CharClassFunctions::SetClassMinorSkill(unsigned short pid, unsigned char slot, int skillId) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);
@ -146,7 +152,7 @@ void CharClassFunctions::SetClassMinorSkill(unsigned short pid, unsigned char sl
player->charClass.mData.mSkills[slot][0] = skillId; player->charClass.mData.mSkills[slot][0] = skillId;
} }
void CharClassFunctions::SendClass(unsigned short pid) noexcept extern "C" void CharClassFunctions::SendClass(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );

View file

@ -7,6 +7,8 @@
#include "../Types.hpp" #include "../Types.hpp"
#include <Script/Platform.hpp>
#define CHARCLASSAPI \ #define CHARCLASSAPI \
{"GetDefaultClass", CharClassFunctions::GetDefaultClass},\ {"GetDefaultClass", CharClassFunctions::GetDefaultClass},\
{"GetClassName", CharClassFunctions::GetClassName},\ {"GetClassName", CharClassFunctions::GetClassName},\
@ -28,17 +30,15 @@
{"SendClass", CharClassFunctions::SendClass} {"SendClass", CharClassFunctions::SendClass}
class CharClassFunctions namespace CharClassFunctions
{ {
public:
/** /**
* \brief Get the default class used by a player. * \brief Get the default class used by a player.
* *
* \param pid The player ID. * \param pid The player ID.
* \return The ID of the default class. * \return The ID of the default class.
*/ */
static const char *GetDefaultClass(unsigned short pid) noexcept; EXPORT_APIFUNCTION const char *CDECL GetDefaultClass(unsigned short pid) noexcept;
/** /**
* \brief Get the name of the custom class used by a player. * \brief Get the name of the custom class used by a player.
@ -46,7 +46,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The name of the custom class. * \return The name of the custom class.
*/ */
static const char *GetClassName(unsigned short pid) noexcept; EXPORT_APIFUNCTION const char *CDECL GetClassName(unsigned short pid) noexcept;
/** /**
* \brief Get the description of the custom class used by a player. * \brief Get the description of the custom class used by a player.
@ -54,7 +54,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The description of the custom class. * \return The description of the custom class.
*/ */
static const char *GetClassDesc(unsigned short pid) noexcept; EXPORT_APIFUNCTION const char *CDECL GetClassDesc(unsigned short pid) noexcept;
/** /**
* \brief Get the ID of one of the two major attributes of a custom class used by a player. * \brief Get the ID of one of the two major attributes of a custom class used by a player.
@ -63,7 +63,7 @@ public:
* \param slot The slot of the major attribute (0 or 1). * \param slot The slot of the major attribute (0 or 1).
* \return The ID of the major attribute. * \return The ID of the major attribute.
*/ */
static int GetClassMajorAttribute(unsigned short pid, unsigned char slot) noexcept; EXPORT_APIFUNCTION int CDECL GetClassMajorAttribute(unsigned short pid, unsigned char slot) noexcept;
/** /**
* \brief Get the specialization ID of the custom class used by a player. * \brief Get the specialization ID of the custom class used by a player.
@ -71,7 +71,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The specialization ID of the custom class (0 for Combat, 1 for Magic, 2 for Stealth). * \return The specialization ID of the custom class (0 for Combat, 1 for Magic, 2 for Stealth).
*/ */
static int GetClassSpecialization(unsigned short pid) noexcept; EXPORT_APIFUNCTION int CDECL GetClassSpecialization(unsigned short pid) noexcept;
/** /**
* \brief Get the ID of one of the five major skills of a custom class used by a player. * \brief Get the ID of one of the five major skills of a custom class used by a player.
@ -80,7 +80,7 @@ public:
* \param slot The slot of the major skill (0 to 4). * \param slot The slot of the major skill (0 to 4).
* \return The ID of the major skill. * \return The ID of the major skill.
*/ */
static int GetClassMajorSkill(unsigned short pid, unsigned char slot) noexcept; EXPORT_APIFUNCTION int CDECL GetClassMajorSkill(unsigned short pid, unsigned char slot) noexcept;
/** /**
* \brief Get the ID of one of the five minor skills of a custom class used by a player. * \brief Get the ID of one of the five minor skills of a custom class used by a player.
@ -89,7 +89,7 @@ public:
* \param slot The slot of the minor skill (0 to 4). * \param slot The slot of the minor skill (0 to 4).
* \return The ID of the minor skill. * \return The ID of the minor skill.
*/ */
static int GetClassMinorSkill(unsigned short pid, unsigned char slot) noexcept; EXPORT_APIFUNCTION int CDECL GetClassMinorSkill(unsigned short pid, unsigned char slot) noexcept;
/** /**
* \brief Check whether the player is using a default class instead of a custom one. * \brief Check whether the player is using a default class instead of a custom one.
@ -97,7 +97,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return Whether the player is using a default class. * \return Whether the player is using a default class.
*/ */
static int IsClassDefault(unsigned short pid) noexcept; EXPORT_APIFUNCTION int CDECL IsClassDefault(unsigned short pid) noexcept;
/** /**
* \brief Set the default class used by a player. * \brief Set the default class used by a player.
@ -108,7 +108,7 @@ public:
* \param id The ID of the default class. * \param id The ID of the default class.
* \return void * \return void
*/ */
static void SetDefaultClass(unsigned short pid, const char *id) noexcept; EXPORT_APIFUNCTION void CDECL SetDefaultClass(unsigned short pid, const char *id) noexcept;
/** /**
* \brief Set the name of the custom class used by a player. * \brief Set the name of the custom class used by a player.
@ -117,7 +117,7 @@ public:
* \param name The name of the custom class. * \param name The name of the custom class.
* \return void * \return void
*/ */
static void SetClassName(unsigned short pid, const char *name) noexcept; EXPORT_APIFUNCTION void CDECL SetClassName(unsigned short pid, const char *name) noexcept;
/** /**
* \brief Set the description of the custom class used by a player. * \brief Set the description of the custom class used by a player.
@ -126,7 +126,7 @@ public:
* \param desc The description of the custom class. * \param desc The description of the custom class.
* \return void * \return void
*/ */
static void SetClassDesc(unsigned short pid, const char *desc) noexcept; EXPORT_APIFUNCTION void CDECL SetClassDesc(unsigned short pid, const char *desc) noexcept;
/** /**
* \brief Set the ID of one of the two major attributes of the custom class used by a player. * \brief Set the ID of one of the two major attributes of the custom class used by a player.
@ -136,7 +136,7 @@ public:
* \param attrId The ID to use for the attribute. * \param attrId The ID to use for the attribute.
* \return void * \return void
*/ */
static void SetClassMajorAttribute(unsigned short pid, unsigned char slot, int attrId) noexcept; EXPORT_APIFUNCTION void CDECL SetClassMajorAttribute(unsigned short pid, unsigned char slot, int attrId) noexcept;
/** /**
* \brief Set the specialization of the custom class used by a player. * \brief Set the specialization of the custom class used by a player.
@ -145,7 +145,7 @@ public:
* \param spec The specialization ID to use (0 for Combat, 1 for Magic, 2 for Stealth). * \param spec The specialization ID to use (0 for Combat, 1 for Magic, 2 for Stealth).
* \return void * \return void
*/ */
static void SetClassSpecialization(unsigned short pid, int spec) noexcept; EXPORT_APIFUNCTION void CDECL SetClassSpecialization(unsigned short pid, int spec) noexcept;
/** /**
* \brief Set the ID of one of the five major skills of the custom class used by a player. * \brief Set the ID of one of the five major skills of the custom class used by a player.
@ -155,7 +155,7 @@ public:
* \param skillId The ID to use for the skill. * \param skillId The ID to use for the skill.
* \return void * \return void
*/ */
static void SetClassMajorSkill(unsigned short pid, unsigned char slot, int skillId) noexcept; EXPORT_APIFUNCTION void CDECL SetClassMajorSkill(unsigned short pid, unsigned char slot, int skillId) noexcept;
/** /**
* \brief Set the ID of one of the five minor skills of the custom class used by a player. * \brief Set the ID of one of the five minor skills of the custom class used by a player.
@ -165,7 +165,7 @@ public:
* \param skillId The ID to use for the skill. * \param skillId The ID to use for the skill.
* \return void * \return void
*/ */
static void SetClassMinorSkill(unsigned short pid, unsigned char slot, int skillId) noexcept; EXPORT_APIFUNCTION void CDECL SetClassMinorSkill(unsigned short pid, unsigned char slot, int skillId) noexcept;
/** /**
* \brief Send a PlayerCharClass packet about a player. * \brief Send a PlayerCharClass packet about a player.
@ -175,7 +175,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return void * \return void
*/ */
static void SendClass(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL SendClass(unsigned short pid) noexcept;
}; }
#endif //OPENMW_CHARCLASSAPI_HPP #endif //OPENMW_CHARCLASSAPI_HPP

View file

@ -6,7 +6,7 @@
#include <apps/openmw-mp/Script/ScriptFunctions.hpp> #include <apps/openmw-mp/Script/ScriptFunctions.hpp>
#include <apps/openmw-mp/Networking.hpp> #include <apps/openmw-mp/Networking.hpp>
void ChatFunctions::SendMessage(unsigned short pid, const char *message, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept extern "C" void ChatFunctions::SendMessage(unsigned short pid, const char *message, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);
@ -24,7 +24,7 @@ void ChatFunctions::SendMessage(unsigned short pid, const char *message, bool se
packet->Send(true); packet->Send(true);
} }
void ChatFunctions::CleanChatForPid(unsigned short pid) extern "C" void ChatFunctions::CleanChatForPid(unsigned short pid)
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);
@ -37,7 +37,7 @@ void ChatFunctions::CleanChatForPid(unsigned short pid)
packet->Send(false); packet->Send(false);
} }
void ChatFunctions::CleanChat() extern "C" void ChatFunctions::CleanChat()
{ {
for (auto player : *Players::getPlayers()) for (auto player : *Players::getPlayers())
{ {

View file

@ -3,15 +3,15 @@
#include "../Types.hpp" #include "../Types.hpp"
#include <Script/Platform.hpp>
#define CHATAPI \ #define CHATAPI \
{"SendMessage", ChatFunctions::SendMessage},\ {"SendMessage", ChatFunctions::SendMessage},\
{"CleanChatForPid", ChatFunctions::CleanChat},\ {"CleanChatForPid", ChatFunctions::CleanChat},\
{"CleanChat", ChatFunctions::CleanChatForPid} {"CleanChat", ChatFunctions::CleanChatForPid}
class ChatFunctions namespace ChatFunctions
{ {
public:
/** /**
* \brief Send a message to a certain player. * \brief Send a message to a certain player.
* *
@ -23,7 +23,7 @@ public:
* to the packet (false by default). * to the packet (false by default).
* \return void * \return void
*/ */
static void SendMessage(unsigned short pid, const char *message, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept; EXPORT_APIFUNCTION void CDECL SendMessage(unsigned short pid, const char *message, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept;
/** /**
* \brief Remove all messages from chat for a certain player. * \brief Remove all messages from chat for a certain player.
@ -31,14 +31,14 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return void * \return void
*/ */
static void CleanChatForPid(unsigned short pid); EXPORT_APIFUNCTION void CDECL CleanChatForPid(unsigned short pid);
/** /**
* \brief Remove all messages from chat for everyone on the server. * \brief Remove all messages from chat for everyone on the server.
* *
* \return void * \return void
*/ */
static void CleanChat(); EXPORT_APIFUNCTION void CDECL CleanChat();
}; }
#endif //OPENMW_CHATAPI_HPP #endif //OPENMW_CHATAPI_HPP

View file

@ -7,7 +7,7 @@
using namespace mwmp; using namespace mwmp;
void DialogueFunctions::ClearTopicChanges(unsigned short pid) noexcept extern "C" void DialogueFunctions::ClearTopicChanges(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -15,7 +15,7 @@ void DialogueFunctions::ClearTopicChanges(unsigned short pid) noexcept
player->topicChanges.topics.clear(); player->topicChanges.topics.clear();
} }
unsigned int DialogueFunctions::GetTopicChangesSize(unsigned short pid) noexcept extern "C" unsigned int DialogueFunctions::GetTopicChangesSize(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -23,7 +23,7 @@ unsigned int DialogueFunctions::GetTopicChangesSize(unsigned short pid) noexcept
return player->topicChanges.count; return player->topicChanges.count;
} }
void DialogueFunctions::AddTopic(unsigned short pid, const char* topicId) noexcept extern "C" void DialogueFunctions::AddTopic(unsigned short pid, const char* topicId) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -34,7 +34,7 @@ void DialogueFunctions::AddTopic(unsigned short pid, const char* topicId) noexce
player->topicChanges.topics.push_back(topic); player->topicChanges.topics.push_back(topic);
} }
const char *DialogueFunctions::GetTopicId(unsigned short pid, unsigned int index) noexcept extern "C" const char *DialogueFunctions::GetTopicId(unsigned short pid, unsigned int index) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ""); GET_PLAYER(pid, player, "");
@ -45,7 +45,7 @@ const char *DialogueFunctions::GetTopicId(unsigned short pid, unsigned int index
return player->topicChanges.topics.at(index).topicId.c_str(); return player->topicChanges.topics.at(index).topicId.c_str();
} }
void DialogueFunctions::SendTopicChanges(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept extern "C" void DialogueFunctions::SendTopicChanges(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -59,7 +59,7 @@ void DialogueFunctions::SendTopicChanges(unsigned short pid, bool sendToOtherPla
packet->Send(true); packet->Send(true);
} }
void DialogueFunctions::PlayAnimation(unsigned short pid, const char* groupname, int mode, int count, bool persist) noexcept extern "C" void DialogueFunctions::PlayAnimation(unsigned short pid, const char* groupname, int mode, int count, bool persist) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -76,7 +76,7 @@ void DialogueFunctions::PlayAnimation(unsigned short pid, const char* groupname,
player->sendToLoaded(packet); player->sendToLoaded(packet);
} }
void DialogueFunctions::PlaySpeech(unsigned short pid, const char* sound) noexcept extern "C" void DialogueFunctions::PlaySpeech(unsigned short pid, const char* sound) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -90,7 +90,7 @@ void DialogueFunctions::PlaySpeech(unsigned short pid, const char* sound) noexce
player->sendToLoaded(packet); player->sendToLoaded(packet);
} }
// All methods below are deprecated versions of methods from above extern "C" // All methods below are deprecated versions of methods from above
void DialogueFunctions::InitializeTopicChanges(unsigned short pid) noexcept void DialogueFunctions::InitializeTopicChanges(unsigned short pid) noexcept
{ {

View file

@ -1,6 +1,8 @@
#ifndef OPENMW_DIALOGUEAPI_HPP #ifndef OPENMW_DIALOGUEAPI_HPP
#define OPENMW_DIALOGUEAPI_HPP #define OPENMW_DIALOGUEAPI_HPP
#include <Script/Platform.hpp>
#define DIALOGUEAPI \ #define DIALOGUEAPI \
{"ClearTopicChanges", DialogueFunctions::ClearTopicChanges},\ {"ClearTopicChanges", DialogueFunctions::ClearTopicChanges},\
\ \
@ -17,10 +19,8 @@
\ \
{"InitializeTopicChanges", DialogueFunctions::InitializeTopicChanges} {"InitializeTopicChanges", DialogueFunctions::InitializeTopicChanges}
class DialogueFunctions namespace DialogueFunctions
{ {
public:
/** /**
* \brief Clear the last recorded topic changes for a player. * \brief Clear the last recorded topic changes for a player.
* *
@ -29,7 +29,7 @@ public:
* \param pid The player ID whose topic changes should be used. * \param pid The player ID whose topic changes should be used.
* \return void * \return void
*/ */
static void ClearTopicChanges(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL ClearTopicChanges(unsigned short pid) noexcept;
/** /**
* \brief Get the number of indexes in a player's latest topic changes. * \brief Get the number of indexes in a player's latest topic changes.
@ -37,7 +37,7 @@ public:
* \param pid The player ID whose topic changes should be used. * \param pid The player ID whose topic changes should be used.
* \return The number of indexes. * \return The number of indexes.
*/ */
static unsigned int GetTopicChangesSize(unsigned short pid) noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetTopicChangesSize(unsigned short pid) noexcept;
/** /**
* \brief Add a new topic to the topic changes for a player. * \brief Add a new topic to the topic changes for a player.
@ -46,7 +46,7 @@ public:
* \param topicId The topicId of the topic. * \param topicId The topicId of the topic.
* \return void * \return void
*/ */
static void AddTopic(unsigned short pid, const char* topicId) noexcept; EXPORT_APIFUNCTION void CDECL AddTopic(unsigned short pid, const char* topicId) noexcept;
/** /**
* \brief Get the topicId at a certain index in a player's latest topic changes. * \brief Get the topicId at a certain index in a player's latest topic changes.
@ -55,7 +55,7 @@ public:
* \param index The index of the topic. * \param index The index of the topic.
* \return The topicId. * \return The topicId.
*/ */
static const char *GetTopicId(unsigned short pid, unsigned int index) noexcept; EXPORT_APIFUNCTION const char *CDECL GetTopicId(unsigned short pid, unsigned int index) noexcept;
/** /**
* \brief Send a PlayerTopic packet with a player's recorded topic changes. * \brief Send a PlayerTopic packet with a player's recorded topic changes.
@ -67,7 +67,7 @@ public:
* to the packet (false by default). * to the packet (false by default).
* \return void * \return void
*/ */
static void SendTopicChanges(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept; EXPORT_APIFUNCTION void CDECL SendTopicChanges(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept;
/** /**
* \brief Play a certain animation on a player's character by sending a PlayerAnimation * \brief Play a certain animation on a player's character by sending a PlayerAnimation
@ -80,7 +80,7 @@ public:
* \param bool Whether the animation should persist or not. * \param bool Whether the animation should persist or not.
* \return void * \return void
*/ */
static void PlayAnimation(unsigned short pid, const char* groupname, int mode, int count, bool persist) noexcept; EXPORT_APIFUNCTION void CDECL PlayAnimation(unsigned short pid, const char* groupname, int mode, int count, bool persist) noexcept;
/** /**
* \brief Play a certain sound for a player as spoken by their character by sending * \brief Play a certain sound for a player as spoken by their character by sending
@ -90,12 +90,11 @@ public:
* \param sound The path of the sound file. * \param sound The path of the sound file.
* \return void * \return void
*/ */
static void PlaySpeech(unsigned short pid, const char* sound) noexcept; EXPORT_APIFUNCTION void CDECL PlaySpeech(unsigned short pid, const char* sound) noexcept;
// All methods below are deprecated versions of methods from above // All methods below are deprecated versions of methods from above
static void InitializeTopicChanges(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL InitializeTopicChanges(unsigned short pid) noexcept;
}
};
#endif //OPENMW_DIALOGUEAPI_HPP #endif //OPENMW_DIALOGUEAPI_HPP

View file

@ -11,7 +11,7 @@ using namespace mwmp;
Faction tempFaction; Faction tempFaction;
const Faction emptyFaction = {}; const Faction emptyFaction = {};
void FactionFunctions::ClearFactionChanges(unsigned short pid) noexcept extern "C" void FactionFunctions::ClearFactionChanges(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -19,7 +19,7 @@ void FactionFunctions::ClearFactionChanges(unsigned short pid) noexcept
player->factionChanges.factions.clear(); player->factionChanges.factions.clear();
} }
unsigned int FactionFunctions::GetFactionChangesSize(unsigned short pid) noexcept extern "C" unsigned int FactionFunctions::GetFactionChangesSize(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -27,7 +27,7 @@ unsigned int FactionFunctions::GetFactionChangesSize(unsigned short pid) noexcep
return player->factionChanges.count; return player->factionChanges.count;
} }
unsigned char FactionFunctions::GetFactionChangesAction(unsigned short pid) noexcept extern "C" unsigned char FactionFunctions::GetFactionChangesAction(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -35,7 +35,7 @@ unsigned char FactionFunctions::GetFactionChangesAction(unsigned short pid) noex
return player->factionChanges.action; return player->factionChanges.action;
} }
const char *FactionFunctions::GetFactionId(unsigned short pid, unsigned int index) noexcept extern "C" const char *FactionFunctions::GetFactionId(unsigned short pid, unsigned int index) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ""); GET_PLAYER(pid, player, "");
@ -46,7 +46,7 @@ const char *FactionFunctions::GetFactionId(unsigned short pid, unsigned int inde
return player->factionChanges.factions.at(index).factionId.c_str(); return player->factionChanges.factions.at(index).factionId.c_str();
} }
int FactionFunctions::GetFactionRank(unsigned short pid, unsigned int index) noexcept extern "C" int FactionFunctions::GetFactionRank(unsigned short pid, unsigned int index) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -54,7 +54,7 @@ int FactionFunctions::GetFactionRank(unsigned short pid, unsigned int index) noe
return player->factionChanges.factions.at(index).rank; return player->factionChanges.factions.at(index).rank;
} }
bool FactionFunctions::GetFactionExpulsionState(unsigned short pid, unsigned int index) noexcept extern "C" bool FactionFunctions::GetFactionExpulsionState(unsigned short pid, unsigned int index) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, false); GET_PLAYER(pid, player, false);
@ -62,7 +62,7 @@ bool FactionFunctions::GetFactionExpulsionState(unsigned short pid, unsigned int
return player->factionChanges.factions.at(index).isExpelled; return player->factionChanges.factions.at(index).isExpelled;
} }
int FactionFunctions::GetFactionReputation(unsigned short pid, unsigned int index) noexcept extern "C" int FactionFunctions::GetFactionReputation(unsigned short pid, unsigned int index) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -70,7 +70,7 @@ int FactionFunctions::GetFactionReputation(unsigned short pid, unsigned int inde
return player->factionChanges.factions.at(index).reputation; return player->factionChanges.factions.at(index).reputation;
} }
void FactionFunctions::SetFactionChangesAction(unsigned short pid, unsigned char action) noexcept extern "C" void FactionFunctions::SetFactionChangesAction(unsigned short pid, unsigned char action) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -78,27 +78,27 @@ void FactionFunctions::SetFactionChangesAction(unsigned short pid, unsigned char
player->factionChanges.action = action; player->factionChanges.action = action;
} }
void FactionFunctions::SetFactionId(const char* factionId) noexcept extern "C" void FactionFunctions::SetFactionId(const char* factionId) noexcept
{ {
tempFaction.factionId = factionId; tempFaction.factionId = factionId;
} }
void FactionFunctions::SetFactionRank(unsigned int rank) noexcept extern "C" void FactionFunctions::SetFactionRank(unsigned int rank) noexcept
{ {
tempFaction.rank = rank; tempFaction.rank = rank;
} }
void FactionFunctions::SetFactionExpulsionState(bool expulsionState) noexcept extern "C" void FactionFunctions::SetFactionExpulsionState(bool expulsionState) noexcept
{ {
tempFaction.isExpelled = expulsionState; tempFaction.isExpelled = expulsionState;
} }
void FactionFunctions::SetFactionReputation(int reputation) noexcept extern "C" void FactionFunctions::SetFactionReputation(int reputation) noexcept
{ {
tempFaction.reputation = reputation; tempFaction.reputation = reputation;
} }
void FactionFunctions::AddFaction(unsigned short pid) noexcept extern "C" void FactionFunctions::AddFaction(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -108,7 +108,7 @@ void FactionFunctions::AddFaction(unsigned short pid) noexcept
tempFaction = emptyFaction; tempFaction = emptyFaction;
} }
void FactionFunctions::SendFactionChanges(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept extern "C" void FactionFunctions::SendFactionChanges(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -122,7 +122,7 @@ void FactionFunctions::SendFactionChanges(unsigned short pid, bool sendToOtherPl
packet->Send(true); packet->Send(true);
} }
// All methods below are deprecated versions of methods from above extern "C" // All methods below are deprecated versions of methods from above
void FactionFunctions::InitializeFactionChanges(unsigned short pid) noexcept void FactionFunctions::InitializeFactionChanges(unsigned short pid) noexcept
{ {

View file

@ -1,6 +1,8 @@
#ifndef OPENMW_FACTIONAPI_HPP #ifndef OPENMW_FACTIONAPI_HPP
#define OPENMW_FACTIONAPI_HPP #define OPENMW_FACTIONAPI_HPP
#include <Script/Platform.hpp>
#define FACTIONAPI \ #define FACTIONAPI \
{"ClearFactionChanges", FactionFunctions::ClearFactionChanges},\ {"ClearFactionChanges", FactionFunctions::ClearFactionChanges},\
\ \
@ -24,10 +26,8 @@
\ \
{"InitializeFactionChanges", FactionFunctions::InitializeFactionChanges} {"InitializeFactionChanges", FactionFunctions::InitializeFactionChanges}
class FactionFunctions namespace FactionFunctions
{ {
public:
/** /**
* \brief Clear the last recorded faction changes for a player. * \brief Clear the last recorded faction changes for a player.
* *
@ -36,7 +36,7 @@ public:
* \param pid The player ID whose faction changes should be used. * \param pid The player ID whose faction changes should be used.
* \return void * \return void
*/ */
static void ClearFactionChanges(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL ClearFactionChanges(unsigned short pid) noexcept;
/** /**
* \brief Get the number of indexes in a player's latest faction changes. * \brief Get the number of indexes in a player's latest faction changes.
@ -44,7 +44,7 @@ public:
* \param pid The player ID whose faction changes should be used. * \param pid The player ID whose faction changes should be used.
* \return The number of indexes. * \return The number of indexes.
*/ */
static unsigned int GetFactionChangesSize(unsigned short pid) noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetFactionChangesSize(unsigned short pid) noexcept;
/** /**
* \brief Get the action type used in a player's latest faction changes. * \brief Get the action type used in a player's latest faction changes.
@ -52,7 +52,7 @@ public:
* \param pid The player ID whose faction changes should be used. * \param pid The player ID whose faction changes should be used.
* \return The action type (0 for RANK, 1 for EXPULSION, 2 for REPUTATION). * \return The action type (0 for RANK, 1 for EXPULSION, 2 for REPUTATION).
*/ */
static unsigned char GetFactionChangesAction(unsigned short pid) noexcept; EXPORT_APIFUNCTION unsigned char CDECL GetFactionChangesAction(unsigned short pid) noexcept;
/** /**
* \brief Get the factionId at a certain index in a player's latest faction changes. * \brief Get the factionId at a certain index in a player's latest faction changes.
@ -61,7 +61,7 @@ public:
* \param index The index of the faction. * \param index The index of the faction.
* \return The factionId. * \return The factionId.
*/ */
static const char *GetFactionId(unsigned short pid, unsigned int index) noexcept; EXPORT_APIFUNCTION const char *CDECL GetFactionId(unsigned short pid, unsigned int index) noexcept;
/** /**
* \brief Get the rank at a certain index in a player's latest faction changes. * \brief Get the rank at a certain index in a player's latest faction changes.
@ -70,7 +70,7 @@ public:
* \param index The index of the faction. * \param index The index of the faction.
* \return The rank. * \return The rank.
*/ */
static int GetFactionRank(unsigned short pid, unsigned int index) noexcept; EXPORT_APIFUNCTION int CDECL GetFactionRank(unsigned short pid, unsigned int index) noexcept;
/** /**
* \brief Get the expulsion state at a certain index in a player's latest faction changes. * \brief Get the expulsion state at a certain index in a player's latest faction changes.
@ -79,7 +79,7 @@ public:
* \param index The index of the faction. * \param index The index of the faction.
* \return The expulsion state. * \return The expulsion state.
*/ */
static bool GetFactionExpulsionState(unsigned short pid, unsigned int index) noexcept; EXPORT_APIFUNCTION bool CDECL GetFactionExpulsionState(unsigned short pid, unsigned int index) noexcept;
/** /**
* \brief Get the reputation at a certain index in a player's latest faction changes. * \brief Get the reputation at a certain index in a player's latest faction changes.
@ -88,7 +88,7 @@ public:
* \param index The index of the faction. * \param index The index of the faction.
* \return The reputation. * \return The reputation.
*/ */
static int GetFactionReputation(unsigned short pid, unsigned int index) noexcept; EXPORT_APIFUNCTION int CDECL GetFactionReputation(unsigned short pid, unsigned int index) noexcept;
/** /**
* \brief Set the action type in a player's faction changes. * \brief Set the action type in a player's faction changes.
@ -97,7 +97,7 @@ public:
* \param action The action (0 for RANK, 1 for EXPULSION, 2 for REPUTATION). * \param action The action (0 for RANK, 1 for EXPULSION, 2 for REPUTATION).
* \return void * \return void
*/ */
static void SetFactionChangesAction(unsigned short pid, unsigned char action) noexcept; EXPORT_APIFUNCTION void CDECL SetFactionChangesAction(unsigned short pid, unsigned char action) noexcept;
/** /**
* \brief Set the factionId of the temporary faction stored on the server. * \brief Set the factionId of the temporary faction stored on the server.
@ -105,7 +105,7 @@ public:
* \param factionId The factionId. * \param factionId The factionId.
* \return void * \return void
*/ */
static void SetFactionId(const char* factionId) noexcept; EXPORT_APIFUNCTION void CDECL SetFactionId(const char* factionId) noexcept;
/** /**
* \brief Set the rank of the temporary faction stored on the server. * \brief Set the rank of the temporary faction stored on the server.
@ -113,7 +113,7 @@ public:
* \param rank The rank. * \param rank The rank.
* \return void * \return void
*/ */
static void SetFactionRank(unsigned int rank) noexcept; EXPORT_APIFUNCTION void CDECL SetFactionRank(unsigned int rank) noexcept;
/** /**
* \brief Set the expulsion state of the temporary faction stored on the server. * \brief Set the expulsion state of the temporary faction stored on the server.
@ -121,7 +121,7 @@ public:
* \param expulsionState The expulsion state. * \param expulsionState The expulsion state.
* \return void * \return void
*/ */
static void SetFactionExpulsionState(bool expulsionState) noexcept; EXPORT_APIFUNCTION void CDECL SetFactionExpulsionState(bool expulsionState) noexcept;
/** /**
* \brief Set the reputation of the temporary faction stored on the server. * \brief Set the reputation of the temporary faction stored on the server.
@ -129,7 +129,7 @@ public:
* \param reputation The reputation. * \param reputation The reputation.
* \return void * \return void
*/ */
static void SetFactionReputation(int reputation) noexcept; EXPORT_APIFUNCTION void CDECL SetFactionReputation(int reputation) noexcept;
/** /**
* \brief Add the server's temporary faction to the faction changes for a player. * \brief Add the server's temporary faction to the faction changes for a player.
@ -140,7 +140,7 @@ public:
* \param pid The player ID whose faction changes should be used. * \param pid The player ID whose faction changes should be used.
* \return void * \return void
*/ */
static void AddFaction(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL AddFaction(unsigned short pid) noexcept;
/** /**
* \brief Send a PlayerFaction packet with a player's recorded faction changes. * \brief Send a PlayerFaction packet with a player's recorded faction changes.
@ -152,12 +152,11 @@ public:
* to the packet (false by default). * to the packet (false by default).
* \return void * \return void
*/ */
static void SendFactionChanges(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept; EXPORT_APIFUNCTION void CDECL SendFactionChanges(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept;
// All methods below are deprecated versions of methods from above // All methods below are deprecated versions of methods from above
static void InitializeFactionChanges(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL InitializeFactionChanges(unsigned short pid) noexcept;
}
};
#endif //OPENMW_FACTIONAPI_HPP #endif //OPENMW_FACTIONAPI_HPP

View file

@ -5,7 +5,7 @@
#include <apps/openmw-mp/Script/ScriptFunctions.hpp> #include <apps/openmw-mp/Script/ScriptFunctions.hpp>
#include <apps/openmw-mp/Networking.hpp> #include <apps/openmw-mp/Networking.hpp>
void GUIFunctions::_MessageBox(unsigned short pid, int id, const char *label) noexcept extern "C" void GUIFunctions::_MessageBox(unsigned short pid, int id, const char *label) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);
@ -20,7 +20,7 @@ void GUIFunctions::_MessageBox(unsigned short pid, int id, const char *label) no
packet->Send(false); packet->Send(false);
} }
void GUIFunctions::CustomMessageBox(unsigned short pid, int id, const char *label, const char *buttons) noexcept extern "C" void GUIFunctions::CustomMessageBox(unsigned short pid, int id, const char *label, const char *buttons) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);
@ -36,7 +36,7 @@ void GUIFunctions::CustomMessageBox(unsigned short pid, int id, const char *labe
packet->Send(false); packet->Send(false);
} }
void GUIFunctions::InputDialog(unsigned short pid, int id, const char *label, const char *note) noexcept extern "C" void GUIFunctions::InputDialog(unsigned short pid, int id, const char *label, const char *note) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);
@ -52,7 +52,7 @@ void GUIFunctions::InputDialog(unsigned short pid, int id, const char *label, co
packet->Send(false); packet->Send(false);
} }
void GUIFunctions::PasswordDialog(unsigned short pid, int id, const char *label, const char *note) noexcept extern "C" void GUIFunctions::PasswordDialog(unsigned short pid, int id, const char *label, const char *note) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);
@ -68,7 +68,7 @@ void GUIFunctions::PasswordDialog(unsigned short pid, int id, const char *label,
packet->Send(false); packet->Send(false);
} }
void GUIFunctions::ListBox(unsigned short pid, int id, const char *label, const char *items) extern "C" void GUIFunctions::ListBox(unsigned short pid, int id, const char *label, const char *items)
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);
@ -84,7 +84,7 @@ void GUIFunctions::ListBox(unsigned short pid, int id, const char *label, const
packet->Send(false); packet->Send(false);
} }
void GUIFunctions::ClearQuickKeyChanges(unsigned short pid) noexcept extern "C" void GUIFunctions::ClearQuickKeyChanges(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -92,7 +92,7 @@ void GUIFunctions::ClearQuickKeyChanges(unsigned short pid) noexcept
player->quickKeyChanges.quickKeys.clear(); player->quickKeyChanges.quickKeys.clear();
} }
unsigned int GUIFunctions::GetQuickKeyChangesSize(unsigned short pid) noexcept extern "C" unsigned int GUIFunctions::GetQuickKeyChangesSize(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -100,7 +100,7 @@ unsigned int GUIFunctions::GetQuickKeyChangesSize(unsigned short pid) noexcept
return player->quickKeyChanges.count; return player->quickKeyChanges.count;
} }
int GUIFunctions::GetQuickKeySlot(unsigned short pid, unsigned int index) noexcept extern "C" int GUIFunctions::GetQuickKeySlot(unsigned short pid, unsigned int index) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -111,7 +111,7 @@ int GUIFunctions::GetQuickKeySlot(unsigned short pid, unsigned int index) noexce
return player->quickKeyChanges.quickKeys.at(index).slot; return player->quickKeyChanges.quickKeys.at(index).slot;
} }
int GUIFunctions::GetQuickKeyType(unsigned short pid, unsigned int index) noexcept extern "C" int GUIFunctions::GetQuickKeyType(unsigned short pid, unsigned int index) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -122,7 +122,7 @@ int GUIFunctions::GetQuickKeyType(unsigned short pid, unsigned int index) noexce
return player->quickKeyChanges.quickKeys.at(index).type; return player->quickKeyChanges.quickKeys.at(index).type;
} }
const char *GUIFunctions::GetQuickKeyItemId(unsigned short pid, unsigned int index) noexcept extern "C" const char *GUIFunctions::GetQuickKeyItemId(unsigned short pid, unsigned int index) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ""); GET_PLAYER(pid, player, "");
@ -133,7 +133,7 @@ const char *GUIFunctions::GetQuickKeyItemId(unsigned short pid, unsigned int ind
return player->quickKeyChanges.quickKeys.at(index).itemId.c_str(); return player->quickKeyChanges.quickKeys.at(index).itemId.c_str();
} }
void GUIFunctions::AddQuickKey(unsigned short pid, unsigned short slot, int type, const char* itemId) noexcept extern "C" void GUIFunctions::AddQuickKey(unsigned short pid, unsigned short slot, int type, const char* itemId) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -146,7 +146,7 @@ void GUIFunctions::AddQuickKey(unsigned short pid, unsigned short slot, int type
player->quickKeyChanges.quickKeys.push_back(quickKey); player->quickKeyChanges.quickKeys.push_back(quickKey);
} }
void GUIFunctions::SendQuickKeyChanges(unsigned short pid) noexcept extern "C" void GUIFunctions::SendQuickKeyChanges(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -155,17 +155,17 @@ void GUIFunctions::SendQuickKeyChanges(unsigned short pid) noexcept
mwmp::Networking::get().getPlayerPacketController()->GetPacket(ID_PLAYER_QUICKKEYS)->Send(false); mwmp::Networking::get().getPlayerPacketController()->GetPacket(ID_PLAYER_QUICKKEYS)->Send(false);
} }
void GUIFunctions::SetMapVisibility(unsigned short targetPid, unsigned short affectedPid, unsigned short state) noexcept extern "C" void GUIFunctions::SetMapVisibility(unsigned short targetPid, unsigned short affectedPid, unsigned short state) noexcept
{ {
LOG_MESSAGE(Log::LOG_WARN, "stub"); LOG_MESSAGE(Log::LOG_WARN, "stub");
} }
void GUIFunctions::SetMapVisibilityAll(unsigned short targetPid, unsigned short state) noexcept extern "C" void GUIFunctions::SetMapVisibilityAll(unsigned short targetPid, unsigned short state) noexcept
{ {
LOG_MESSAGE(Log::LOG_WARN, "stub"); LOG_MESSAGE(Log::LOG_WARN, "stub");
} }
// All methods below are deprecated versions of methods from above extern "C" // All methods below are deprecated versions of methods from above
void GUIFunctions::InitializeQuickKeyChanges(unsigned short pid) noexcept void GUIFunctions::InitializeQuickKeyChanges(unsigned short pid) noexcept
{ {

View file

@ -1,6 +1,8 @@
#ifndef OPENMW_GUIAPI_HPP #ifndef OPENMW_GUIAPI_HPP
#define OPENMW_GUIAPI_HPP #define OPENMW_GUIAPI_HPP
#include <Script/Platform.hpp>
#define GUIAPI \ #define GUIAPI \
{"MessageBox", GUIFunctions::_MessageBox},\ {"MessageBox", GUIFunctions::_MessageBox},\
{"CustomMessageBox", GUIFunctions::CustomMessageBox},\ {"CustomMessageBox", GUIFunctions::CustomMessageBox},\
@ -25,10 +27,8 @@
\ \
{"InitializeQuickKeyChanges", GUIFunctions::InitializeQuickKeyChanges} {"InitializeQuickKeyChanges", GUIFunctions::InitializeQuickKeyChanges}
class GUIFunctions namespace GUIFunctions
{ {
public:
/** /**
* \brief Display a simple messagebox at the bottom of the screen that vanishes * \brief Display a simple messagebox at the bottom of the screen that vanishes
* after a few seconds. * after a few seconds.
@ -41,7 +41,7 @@ public:
* \param label The text in the messagebox. * \param label The text in the messagebox.
* \return void * \return void
*/ */
static void _MessageBox(unsigned short pid, int id, const char *label) noexcept; EXPORT_APIFUNCTION void CDECL _MessageBox(unsigned short pid, int id, const char *label) noexcept;
/** /**
* \brief Display an interactive messagebox at the center of the screen that * \brief Display an interactive messagebox at the center of the screen that
@ -53,7 +53,7 @@ public:
* \parm buttons The captions of the buttons, separated by semicolons (e.g. "Yes;No;Maybe"). * \parm buttons The captions of the buttons, separated by semicolons (e.g. "Yes;No;Maybe").
* \return void * \return void
*/ */
static void CustomMessageBox(unsigned short pid, int id, const char *label, const char *buttons) noexcept; EXPORT_APIFUNCTION void CDECL CustomMessageBox(unsigned short pid, int id, const char *label, const char *buttons) noexcept;
/** /**
* \brief Display an input dialog at the center of the screen. * \brief Display an input dialog at the center of the screen.
@ -64,7 +64,7 @@ public:
* \parm note The text at the bottom of the input dialog. * \parm note The text at the bottom of the input dialog.
* \return void * \return void
*/ */
static void InputDialog(unsigned short pid, int id, const char *label, const char *note) noexcept; EXPORT_APIFUNCTION void CDECL InputDialog(unsigned short pid, int id, const char *label, const char *note) noexcept;
/** /**
* \brief Display a password dialog at the center of the screen. * \brief Display a password dialog at the center of the screen.
@ -78,7 +78,7 @@ public:
* \parm note The text at the bottom of the password dialog. * \parm note The text at the bottom of the password dialog.
* \return void * \return void
*/ */
static void PasswordDialog(unsigned short pid, int id, const char *label, const char *note) noexcept; EXPORT_APIFUNCTION void CDECL PasswordDialog(unsigned short pid, int id, const char *label, const char *note) noexcept;
/** /**
* \brief Display a listbox at the center of the screen where each item takes up * \brief Display a listbox at the center of the screen where each item takes up
@ -91,7 +91,7 @@ public:
* \parm items The items in the listbox, separated by newlines (e.g. "Item 1\nItem 2"). * \parm items The items in the listbox, separated by newlines (e.g. "Item 1\nItem 2").
* \return void * \return void
*/ */
static void ListBox(unsigned short pid, int id, const char *label, const char *items); EXPORT_APIFUNCTION void CDECL ListBox(unsigned short pid, int id, const char *label, const char *items);
/** /**
* \brief Clear the last recorded quick key changes for a player. * \brief Clear the last recorded quick key changes for a player.
@ -101,7 +101,7 @@ public:
* \param pid The player ID whose quick key changes should be used. * \param pid The player ID whose quick key changes should be used.
* \return void * \return void
*/ */
static void ClearQuickKeyChanges(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL ClearQuickKeyChanges(unsigned short pid) noexcept;
/** /**
* \brief Get the number of indexes in a player's latest quick key changes. * \brief Get the number of indexes in a player's latest quick key changes.
@ -109,7 +109,7 @@ public:
* \param pid The player ID whose quick key changes should be used. * \param pid The player ID whose quick key changes should be used.
* \return The number of indexes. * \return The number of indexes.
*/ */
static unsigned int GetQuickKeyChangesSize(unsigned short pid) noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetQuickKeyChangesSize(unsigned short pid) noexcept;
/** /**
* \brief Add a new quick key to the quick key changes for a player. * \brief Add a new quick key to the quick key changes for a player.
@ -120,7 +120,7 @@ public:
* \param itemId The itemId of the item. * \param itemId The itemId of the item.
* \return void * \return void
*/ */
static void AddQuickKey(unsigned short pid, unsigned short slot, int type, const char* itemId = "") noexcept; EXPORT_APIFUNCTION void CDECL AddQuickKey(unsigned short pid, unsigned short slot, int type, const char* itemId = "") noexcept;
/** /**
* \brief Get the slot of the quick key at a certain index in a player's latest quick key changes. * \brief Get the slot of the quick key at a certain index in a player's latest quick key changes.
@ -129,7 +129,7 @@ public:
* \param index The index of the quick key in the quick key changes vector. * \param index The index of the quick key in the quick key changes vector.
* \return The slot. * \return The slot.
*/ */
static int GetQuickKeySlot(unsigned short pid, unsigned int index) noexcept; EXPORT_APIFUNCTION int CDECL GetQuickKeySlot(unsigned short pid, unsigned int index) noexcept;
/** /**
* \brief Get the type of the quick key at a certain index in a player's latest quick key changes. * \brief Get the type of the quick key at a certain index in a player's latest quick key changes.
@ -138,7 +138,7 @@ public:
* \param index The index of the quick key in the quick key changes vector. * \param index The index of the quick key in the quick key changes vector.
* \return The quick key type. * \return The quick key type.
*/ */
static int GetQuickKeyType(unsigned short pid, unsigned int index) noexcept; EXPORT_APIFUNCTION int CDECL GetQuickKeyType(unsigned short pid, unsigned int index) noexcept;
/** /**
* \brief Get the itemId at a certain index in a player's latest quick key changes. * \brief Get the itemId at a certain index in a player's latest quick key changes.
@ -147,7 +147,7 @@ public:
* \param index The index of the quick key in the quick key changes vector. * \param index The index of the quick key in the quick key changes vector.
* \return The itemId. * \return The itemId.
*/ */
static const char *GetQuickKeyItemId(unsigned short pid, unsigned int index) noexcept; EXPORT_APIFUNCTION const char *CDECL GetQuickKeyItemId(unsigned short pid, unsigned int index) noexcept;
/** /**
* \brief Send a PlayerQuickKeys packet with a player's recorded quick key changes. * \brief Send a PlayerQuickKeys packet with a player's recorded quick key changes.
@ -155,7 +155,7 @@ public:
* \param pid The player ID whose quick key changes should be used. * \param pid The player ID whose quick key changes should be used.
* \return void * \return void
*/ */
static void SendQuickKeyChanges(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL SendQuickKeyChanges(unsigned short pid) noexcept;
//state 0 - disallow, 1 - allow //state 0 - disallow, 1 - allow
@ -169,7 +169,7 @@ public:
* \param state The state of the map marker (false to hide, true to reveal). * \param state The state of the map marker (false to hide, true to reveal).
* \return void * \return void
*/ */
static void SetMapVisibility(unsigned short targetPid, unsigned short affectedPid, unsigned short state) noexcept; EXPORT_APIFUNCTION void CDECL SetMapVisibility(unsigned short targetPid, unsigned short affectedPid, unsigned short state) noexcept;
/** /**
* \brief Determine whether a player's map marker can be seen by all other players. * \brief Determine whether a player's map marker can be seen by all other players.
@ -180,12 +180,11 @@ public:
* \param state The state of the map marker (false to hide, true to reveal). * \param state The state of the map marker (false to hide, true to reveal).
* \return void * \return void
*/ */
static void SetMapVisibilityAll(unsigned short targetPid, unsigned short state) noexcept; EXPORT_APIFUNCTION void CDECL SetMapVisibilityAll(unsigned short targetPid, unsigned short state) noexcept;
// All methods below are deprecated versions of methods from above // All methods below are deprecated versions of methods from above
static void InitializeQuickKeyChanges(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL InitializeQuickKeyChanges(unsigned short pid) noexcept;
}
};
#endif //OPENMW_GUIAPI_HPP #endif //OPENMW_GUIAPI_HPP

View file

@ -9,7 +9,7 @@
using namespace mwmp; using namespace mwmp;
void ItemFunctions::ClearInventoryChanges(unsigned short pid) noexcept extern "C" void ItemFunctions::ClearInventoryChanges(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -17,12 +17,12 @@ void ItemFunctions::ClearInventoryChanges(unsigned short pid) noexcept
player->inventoryChanges.items.clear(); player->inventoryChanges.items.clear();
} }
int ItemFunctions::GetEquipmentSize() noexcept extern "C" int ItemFunctions::GetEquipmentSize() noexcept
{ {
return MWWorld::InventoryStore::Slots; return MWWorld::InventoryStore::Slots;
} }
unsigned int ItemFunctions::GetInventoryChangesSize(unsigned short pid) noexcept extern "C" unsigned int ItemFunctions::GetInventoryChangesSize(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -30,7 +30,7 @@ unsigned int ItemFunctions::GetInventoryChangesSize(unsigned short pid) noexcept
return player->inventoryChanges.count; return player->inventoryChanges.count;
} }
unsigned int ItemFunctions::GetInventoryChangesAction(unsigned short pid) noexcept extern "C" unsigned int ItemFunctions::GetInventoryChangesAction(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -38,7 +38,7 @@ unsigned int ItemFunctions::GetInventoryChangesAction(unsigned short pid) noexce
return player->inventoryChanges.action; return player->inventoryChanges.action;
} }
void ItemFunctions::SetInventoryChangesAction(unsigned short pid, unsigned char action) noexcept extern "C" void ItemFunctions::SetInventoryChangesAction(unsigned short pid, unsigned char action) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -46,7 +46,7 @@ void ItemFunctions::SetInventoryChangesAction(unsigned short pid, unsigned char
player->inventoryChanges.action = action; player->inventoryChanges.action = action;
} }
void ItemFunctions::EquipItem(unsigned short pid, unsigned short slot, const char *refId, unsigned int count, extern "C" void ItemFunctions::EquipItem(unsigned short pid, unsigned short slot, const char *refId, unsigned int count,
int charge, double enchantmentCharge) noexcept int charge, double enchantmentCharge) noexcept
{ {
Player *player; Player *player;
@ -61,7 +61,7 @@ void ItemFunctions::EquipItem(unsigned short pid, unsigned short slot, const cha
player->equipmentIndexChanges.push_back(slot); player->equipmentIndexChanges.push_back(slot);
} }
void ItemFunctions::UnequipItem(unsigned short pid, unsigned short slot) noexcept extern "C" void ItemFunctions::UnequipItem(unsigned short pid, unsigned short slot) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -69,7 +69,7 @@ void ItemFunctions::UnequipItem(unsigned short pid, unsigned short slot) noexcep
ItemFunctions::EquipItem(pid, slot, "", 0, -1, -1); ItemFunctions::EquipItem(pid, slot, "", 0, -1, -1);
} }
void ItemFunctions::AddItemChange(unsigned short pid, const char* refId, unsigned int count, int charge, extern "C" void ItemFunctions::AddItemChange(unsigned short pid, const char* refId, unsigned int count, int charge,
double enchantmentCharge, const char* soul) noexcept double enchantmentCharge, const char* soul) noexcept
{ {
Player *player; Player *player;
@ -85,7 +85,7 @@ void ItemFunctions::AddItemChange(unsigned short pid, const char* refId, unsigne
player->inventoryChanges.items.push_back(item); player->inventoryChanges.items.push_back(item);
} }
bool ItemFunctions::HasItemEquipped(unsigned short pid, const char* refId) extern "C" bool ItemFunctions::HasItemEquipped(unsigned short pid, const char* refId)
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, false); GET_PLAYER(pid, player, false);
@ -96,7 +96,7 @@ bool ItemFunctions::HasItemEquipped(unsigned short pid, const char* refId)
return false; return false;
} }
const char *ItemFunctions::GetEquipmentItemRefId(unsigned short pid, unsigned short slot) noexcept extern "C" const char *ItemFunctions::GetEquipmentItemRefId(unsigned short pid, unsigned short slot) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -104,7 +104,7 @@ const char *ItemFunctions::GetEquipmentItemRefId(unsigned short pid, unsigned sh
return player->equipmentItems[slot].refId.c_str(); return player->equipmentItems[slot].refId.c_str();
} }
int ItemFunctions::GetEquipmentItemCount(unsigned short pid, unsigned short slot) noexcept extern "C" int ItemFunctions::GetEquipmentItemCount(unsigned short pid, unsigned short slot) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -112,7 +112,7 @@ int ItemFunctions::GetEquipmentItemCount(unsigned short pid, unsigned short slot
return player->equipmentItems[slot].count; return player->equipmentItems[slot].count;
} }
int ItemFunctions::GetEquipmentItemCharge(unsigned short pid, unsigned short slot) noexcept extern "C" int ItemFunctions::GetEquipmentItemCharge(unsigned short pid, unsigned short slot) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -120,7 +120,7 @@ int ItemFunctions::GetEquipmentItemCharge(unsigned short pid, unsigned short slo
return player->equipmentItems[slot].charge; return player->equipmentItems[slot].charge;
} }
double ItemFunctions::GetEquipmentItemEnchantmentCharge(unsigned short pid, unsigned short slot) noexcept extern "C" double ItemFunctions::GetEquipmentItemEnchantmentCharge(unsigned short pid, unsigned short slot) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -128,7 +128,7 @@ double ItemFunctions::GetEquipmentItemEnchantmentCharge(unsigned short pid, unsi
return player->equipmentItems[slot].enchantmentCharge; return player->equipmentItems[slot].enchantmentCharge;
} }
const char *ItemFunctions::GetInventoryItemRefId(unsigned short pid, unsigned int index) noexcept extern "C" const char *ItemFunctions::GetInventoryItemRefId(unsigned short pid, unsigned int index) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ""); GET_PLAYER(pid, player, "");
@ -139,7 +139,7 @@ const char *ItemFunctions::GetInventoryItemRefId(unsigned short pid, unsigned in
return player->inventoryChanges.items.at(index).refId.c_str(); return player->inventoryChanges.items.at(index).refId.c_str();
} }
int ItemFunctions::GetInventoryItemCount(unsigned short pid, unsigned int index) noexcept extern "C" int ItemFunctions::GetInventoryItemCount(unsigned short pid, unsigned int index) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -147,7 +147,7 @@ int ItemFunctions::GetInventoryItemCount(unsigned short pid, unsigned int index)
return player->inventoryChanges.items.at(index).count; return player->inventoryChanges.items.at(index).count;
} }
int ItemFunctions::GetInventoryItemCharge(unsigned short pid, unsigned int index) noexcept extern "C" int ItemFunctions::GetInventoryItemCharge(unsigned short pid, unsigned int index) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -155,7 +155,7 @@ int ItemFunctions::GetInventoryItemCharge(unsigned short pid, unsigned int index
return player->inventoryChanges.items.at(index).charge; return player->inventoryChanges.items.at(index).charge;
} }
double ItemFunctions::GetInventoryItemEnchantmentCharge(unsigned short pid, unsigned int index) noexcept extern "C" double ItemFunctions::GetInventoryItemEnchantmentCharge(unsigned short pid, unsigned int index) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -163,7 +163,7 @@ double ItemFunctions::GetInventoryItemEnchantmentCharge(unsigned short pid, unsi
return player->inventoryChanges.items.at(index).enchantmentCharge; return player->inventoryChanges.items.at(index).enchantmentCharge;
} }
const char *ItemFunctions::GetInventoryItemSoul(unsigned short pid, unsigned int index) noexcept extern "C" const char *ItemFunctions::GetInventoryItemSoul(unsigned short pid, unsigned int index) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ""); GET_PLAYER(pid, player, "");
@ -174,7 +174,7 @@ const char *ItemFunctions::GetInventoryItemSoul(unsigned short pid, unsigned int
return player->inventoryChanges.items.at(index).soul.c_str(); return player->inventoryChanges.items.at(index).soul.c_str();
} }
const char *ItemFunctions::GetUsedItemRefId(unsigned short pid) noexcept extern "C" const char *ItemFunctions::GetUsedItemRefId(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ""); GET_PLAYER(pid, player, "");
@ -182,7 +182,7 @@ const char *ItemFunctions::GetUsedItemRefId(unsigned short pid) noexcept
return player->usedItem.refId.c_str(); return player->usedItem.refId.c_str();
} }
int ItemFunctions::GetUsedItemCount(unsigned short pid) noexcept extern "C" int ItemFunctions::GetUsedItemCount(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -190,7 +190,7 @@ int ItemFunctions::GetUsedItemCount(unsigned short pid) noexcept
return player->usedItem.count; return player->usedItem.count;
} }
int ItemFunctions::GetUsedItemCharge(unsigned short pid) noexcept extern "C" int ItemFunctions::GetUsedItemCharge(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -198,7 +198,7 @@ int ItemFunctions::GetUsedItemCharge(unsigned short pid) noexcept
return player->usedItem.charge; return player->usedItem.charge;
} }
double ItemFunctions::GetUsedItemEnchantmentCharge(unsigned short pid) noexcept extern "C" double ItemFunctions::GetUsedItemEnchantmentCharge(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -206,7 +206,7 @@ double ItemFunctions::GetUsedItemEnchantmentCharge(unsigned short pid) noexcept
return player->usedItem.enchantmentCharge; return player->usedItem.enchantmentCharge;
} }
const char *ItemFunctions::GetUsedItemSoul(unsigned short pid) noexcept extern "C" const char *ItemFunctions::GetUsedItemSoul(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ""); GET_PLAYER(pid, player, "");
@ -214,7 +214,7 @@ const char *ItemFunctions::GetUsedItemSoul(unsigned short pid) noexcept
return player->usedItem.soul.c_str(); return player->usedItem.soul.c_str();
} }
void ItemFunctions::SendEquipment(unsigned short pid) noexcept extern "C" void ItemFunctions::SendEquipment(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -228,7 +228,7 @@ void ItemFunctions::SendEquipment(unsigned short pid) noexcept
player->equipmentIndexChanges.clear(); player->equipmentIndexChanges.clear();
} }
void ItemFunctions::SendInventoryChanges(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept extern "C" void ItemFunctions::SendInventoryChanges(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -242,7 +242,7 @@ void ItemFunctions::SendInventoryChanges(unsigned short pid, bool sendToOtherPla
packet->Send(true); packet->Send(true);
} }
void ItemFunctions::SendItemUse(unsigned short pid) noexcept extern "C" void ItemFunctions::SendItemUse(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -253,14 +253,14 @@ void ItemFunctions::SendItemUse(unsigned short pid) noexcept
packet->Send(false); packet->Send(false);
} }
// All methods below are deprecated versions of methods from above extern "C" // All methods below are deprecated versions of methods from above
void ItemFunctions::InitializeInventoryChanges(unsigned short pid) noexcept void ItemFunctions::InitializeInventoryChanges(unsigned short pid) noexcept
{ {
ClearInventoryChanges(pid); ClearInventoryChanges(pid);
} }
void ItemFunctions::AddItem(unsigned short pid, const char* refId, unsigned int count, int charge, extern "C" void ItemFunctions::AddItem(unsigned short pid, const char* refId, unsigned int count, int charge,
double enchantmentCharge, const char* soul) noexcept double enchantmentCharge, const char* soul) noexcept
{ {
AddItemChange(pid, refId, count, charge, enchantmentCharge, soul); AddItemChange(pid, refId, count, charge, enchantmentCharge, soul);

View file

@ -1,6 +1,8 @@
#ifndef OPENMW_ITEMAPI_HPP #ifndef OPENMW_ITEMAPI_HPP
#define OPENMW_ITEMAPI_HPP #define OPENMW_ITEMAPI_HPP
#include <Script/Platform.hpp>
#define ITEMAPI \ #define ITEMAPI \
{"ClearInventoryChanges", ItemFunctions::ClearInventoryChanges},\ {"ClearInventoryChanges", ItemFunctions::ClearInventoryChanges},\
\ \
@ -41,10 +43,8 @@
{"InitializeInventoryChanges", ItemFunctions::InitializeInventoryChanges},\ {"InitializeInventoryChanges", ItemFunctions::InitializeInventoryChanges},\
{"AddItem", ItemFunctions::AddItem} {"AddItem", ItemFunctions::AddItem}
class ItemFunctions namespace ItemFunctions
{ {
public:
/** /**
* \brief Clear the last recorded inventory changes for a player. * \brief Clear the last recorded inventory changes for a player.
* *
@ -53,7 +53,7 @@ public:
* \param pid The player ID whose inventory changes should be used. * \param pid The player ID whose inventory changes should be used.
* \return void * \return void
*/ */
static void ClearInventoryChanges(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL ClearInventoryChanges(unsigned short pid) noexcept;
/** /**
* \brief Get the number of slots used for equipment. * \brief Get the number of slots used for equipment.
@ -62,7 +62,7 @@ public:
* *
* \return The number of slots. * \return The number of slots.
*/ */
static int GetEquipmentSize() noexcept; EXPORT_APIFUNCTION int CDECL GetEquipmentSize() noexcept;
/** /**
* \brief Get the number of indexes in a player's latest inventory changes. * \brief Get the number of indexes in a player's latest inventory changes.
@ -70,7 +70,7 @@ public:
* \param pid The player ID whose inventory changes should be used. * \param pid The player ID whose inventory changes should be used.
* \return The number of indexes. * \return The number of indexes.
*/ */
static unsigned int GetInventoryChangesSize(unsigned short pid) noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetInventoryChangesSize(unsigned short pid) noexcept;
/** /**
* \brief Get the action type used in a player's latest inventory changes. * \brief Get the action type used in a player's latest inventory changes.
@ -78,7 +78,7 @@ public:
* \param pid The player ID whose inventory changes should be used. * \param pid The player ID whose inventory changes should be used.
* \return The action type (0 for SET, 1 for ADD, 2 for REMOVE). * \return The action type (0 for SET, 1 for ADD, 2 for REMOVE).
*/ */
static unsigned int GetInventoryChangesAction(unsigned short pid) noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetInventoryChangesAction(unsigned short pid) noexcept;
/** /**
* \brief Set the action type in a player's inventory changes. * \brief Set the action type in a player's inventory changes.
@ -87,7 +87,7 @@ public:
* \param action The action (0 for SET, 1 for ADD, 2 for REMOVE). * \param action The action (0 for SET, 1 for ADD, 2 for REMOVE).
* \return void * \return void
*/ */
static void SetInventoryChangesAction(unsigned short pid, unsigned char action) noexcept; EXPORT_APIFUNCTION void CDECL SetInventoryChangesAction(unsigned short pid, unsigned char action) noexcept;
/** /**
* \brief Equip an item in a certain slot of the equipment of a player. * \brief Equip an item in a certain slot of the equipment of a player.
@ -100,7 +100,7 @@ public:
* \param enchantmentCharge The enchantment charge of the item. * \param enchantmentCharge The enchantment charge of the item.
* \return void * \return void
*/ */
static void EquipItem(unsigned short pid, unsigned short slot, const char* refId, unsigned int count, int charge, EXPORT_APIFUNCTION void CDECL EquipItem(unsigned short pid, unsigned short slot, const char* refId, unsigned int count, int charge,
double enchantmentCharge = -1) noexcept; double enchantmentCharge = -1) noexcept;
/** /**
@ -110,7 +110,7 @@ public:
* \param slot The equipment slot. * \param slot The equipment slot.
* \return void * \return void
*/ */
static void UnequipItem(unsigned short pid, unsigned short slot) noexcept; EXPORT_APIFUNCTION void CDECL UnequipItem(unsigned short pid, unsigned short slot) noexcept;
/** /**
* \brief Add an item change to a player's inventory changes. * \brief Add an item change to a player's inventory changes.
@ -123,7 +123,7 @@ public:
* \param soul The soul of the item. * \param soul The soul of the item.
* \return void * \return void
*/ */
static void AddItemChange(unsigned short pid, const char* refId, unsigned int count, int charge, EXPORT_APIFUNCTION void CDECL AddItemChange(unsigned short pid, const char* refId, unsigned int count, int charge,
double enchantmentCharge, const char* soul) noexcept; double enchantmentCharge, const char* soul) noexcept;
/** /**
@ -133,7 +133,7 @@ public:
* \param refId The refId of the item. * \param refId The refId of the item.
* \return Whether the player has the item equipped. * \return Whether the player has the item equipped.
*/ */
static bool HasItemEquipped(unsigned short pid, const char* refId); EXPORT_APIFUNCTION bool CDECL HasItemEquipped(unsigned short pid, const char* refId);
/** /**
* \brief Get the refId of the item in a certain slot of the equipment of a player. * \brief Get the refId of the item in a certain slot of the equipment of a player.
@ -142,7 +142,7 @@ public:
* \param slot The slot of the equipment item. * \param slot The slot of the equipment item.
* \return The refId. * \return The refId.
*/ */
static const char *GetEquipmentItemRefId(unsigned short pid, unsigned short slot) noexcept; EXPORT_APIFUNCTION const char *CDECL GetEquipmentItemRefId(unsigned short pid, unsigned short slot) noexcept;
/** /**
* \brief Get the count of the item in a certain slot of the equipment of a player. * \brief Get the count of the item in a certain slot of the equipment of a player.
@ -151,7 +151,7 @@ public:
* \param slot The slot of the equipment item. * \param slot The slot of the equipment item.
* \return The item count. * \return The item count.
*/ */
static int GetEquipmentItemCount(unsigned short pid, unsigned short slot) noexcept; EXPORT_APIFUNCTION int CDECL GetEquipmentItemCount(unsigned short pid, unsigned short slot) noexcept;
/** /**
* \brief Get the charge of the item in a certain slot of the equipment of a player. * \brief Get the charge of the item in a certain slot of the equipment of a player.
@ -160,7 +160,7 @@ public:
* \param slot The slot of the equipment item. * \param slot The slot of the equipment item.
* \return The charge. * \return The charge.
*/ */
static int GetEquipmentItemCharge(unsigned short pid, unsigned short slot) noexcept; EXPORT_APIFUNCTION int CDECL GetEquipmentItemCharge(unsigned short pid, unsigned short slot) noexcept;
/** /**
* \brief Get the enchantment charge of the item in a certain slot of the equipment of * \brief Get the enchantment charge of the item in a certain slot of the equipment of
@ -170,7 +170,7 @@ public:
* \param slot The slot of the equipment item. * \param slot The slot of the equipment item.
* \return The enchantment charge. * \return The enchantment charge.
*/ */
static double GetEquipmentItemEnchantmentCharge(unsigned short pid, unsigned short slot) noexcept; EXPORT_APIFUNCTION double CDECL GetEquipmentItemEnchantmentCharge(unsigned short pid, unsigned short slot) noexcept;
/** /**
* \brief Get the refId of the item at a certain index in a player's latest inventory * \brief Get the refId of the item at a certain index in a player's latest inventory
@ -180,7 +180,7 @@ public:
* \param index The index of the inventory item. * \param index The index of the inventory item.
* \return The refId. * \return The refId.
*/ */
static const char *GetInventoryItemRefId(unsigned short pid, unsigned int index) noexcept; EXPORT_APIFUNCTION const char *CDECL GetInventoryItemRefId(unsigned short pid, unsigned int index) noexcept;
/** /**
* \brief Get the count of the item at a certain index in a player's latest inventory * \brief Get the count of the item at a certain index in a player's latest inventory
@ -190,7 +190,7 @@ public:
* \param index The index of the inventory item. * \param index The index of the inventory item.
* \return The item count. * \return The item count.
*/ */
static int GetInventoryItemCount(unsigned short pid, unsigned int index) noexcept; EXPORT_APIFUNCTION int CDECL GetInventoryItemCount(unsigned short pid, unsigned int index) noexcept;
/** /**
* \brief Get the charge of the item at a certain index in a player's latest inventory * \brief Get the charge of the item at a certain index in a player's latest inventory
@ -200,7 +200,7 @@ public:
* \param index The index of the inventory item. * \param index The index of the inventory item.
* \return The charge. * \return The charge.
*/ */
static int GetInventoryItemCharge(unsigned short pid, unsigned int index) noexcept; EXPORT_APIFUNCTION int CDECL GetInventoryItemCharge(unsigned short pid, unsigned int index) noexcept;
/** /**
* \brief Get the enchantment charge of the item at a certain index in a player's * \brief Get the enchantment charge of the item at a certain index in a player's
@ -210,7 +210,7 @@ public:
* \param index The index of the inventory item. * \param index The index of the inventory item.
* \return The enchantment charge. * \return The enchantment charge.
*/ */
static double GetInventoryItemEnchantmentCharge(unsigned short pid, unsigned int index) noexcept; EXPORT_APIFUNCTION double CDECL GetInventoryItemEnchantmentCharge(unsigned short pid, unsigned int index) noexcept;
/** /**
* \brief Get the soul of the item at a certain index in a player's latest inventory * \brief Get the soul of the item at a certain index in a player's latest inventory
@ -220,7 +220,7 @@ public:
* \param index The index of the inventory item. * \param index The index of the inventory item.
* \return The soul. * \return The soul.
*/ */
static const char *GetInventoryItemSoul(unsigned short pid, unsigned int index) noexcept; EXPORT_APIFUNCTION const char *CDECL GetInventoryItemSoul(unsigned short pid, unsigned int index) noexcept;
/** /**
* \brief Get the refId of the item last used by a player. * \brief Get the refId of the item last used by a player.
@ -228,7 +228,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The refId. * \return The refId.
*/ */
static const char *GetUsedItemRefId(unsigned short pid) noexcept; EXPORT_APIFUNCTION const char *CDECL GetUsedItemRefId(unsigned short pid) noexcept;
/** /**
* \brief Get the count of the item last used by a player. * \brief Get the count of the item last used by a player.
@ -236,7 +236,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The item count. * \return The item count.
*/ */
static int GetUsedItemCount(unsigned short pid) noexcept; EXPORT_APIFUNCTION int CDECL GetUsedItemCount(unsigned short pid) noexcept;
/** /**
* \brief Get the charge of the item last used by a player. * \brief Get the charge of the item last used by a player.
@ -244,7 +244,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The charge. * \return The charge.
*/ */
static int GetUsedItemCharge(unsigned short pid) noexcept; EXPORT_APIFUNCTION int CDECL GetUsedItemCharge(unsigned short pid) noexcept;
/** /**
* \brief Get the enchantment charge of the item last used by a player. * \brief Get the enchantment charge of the item last used by a player.
@ -252,7 +252,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The enchantment charge. * \return The enchantment charge.
*/ */
static double GetUsedItemEnchantmentCharge(unsigned short pid) noexcept; EXPORT_APIFUNCTION double CDECL GetUsedItemEnchantmentCharge(unsigned short pid) noexcept;
/** /**
* \brief Get the soul of the item last used by a player. * \brief Get the soul of the item last used by a player.
@ -260,7 +260,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The soul. * \return The soul.
*/ */
static const char *GetUsedItemSoul(unsigned short pid) noexcept; EXPORT_APIFUNCTION const char *CDECL GetUsedItemSoul(unsigned short pid) noexcept;
/** /**
* \brief Send a PlayerEquipment packet with a player's equipment. * \brief Send a PlayerEquipment packet with a player's equipment.
@ -270,7 +270,7 @@ public:
* \param pid The player ID whose equipment should be sent. * \param pid The player ID whose equipment should be sent.
* \return void * \return void
*/ */
static void SendEquipment(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL SendEquipment(unsigned short pid) noexcept;
/** /**
* \brief Send a PlayerInventory packet with a player's recorded inventory changes. * \brief Send a PlayerInventory packet with a player's recorded inventory changes.
@ -282,7 +282,7 @@ public:
* to the packet (false by default). * to the packet (false by default).
* \return void * \return void
*/ */
static void SendInventoryChanges(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept; EXPORT_APIFUNCTION void CDECL SendInventoryChanges(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept;
/** /**
* \brief Send a PlayerItemUse causing a player to use their recorded usedItem. * \brief Send a PlayerItemUse causing a player to use their recorded usedItem.
@ -290,17 +290,14 @@ public:
* \param pid The player ID affected. * \param pid The player ID affected.
* \return void * \return void
*/ */
static void SendItemUse(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL SendItemUse(unsigned short pid) noexcept;
// All methods below are deprecated versions of methods from above // All methods below are deprecated versions of methods from above
static void InitializeInventoryChanges(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL InitializeInventoryChanges(unsigned short pid) noexcept;
static void AddItem(unsigned short pid, const char* refId, unsigned int count, int charge, EXPORT_APIFUNCTION void CDECL AddItem(unsigned short pid, const char* refId, unsigned int count, int charge,
double enchantmentCharge, const char* soul) noexcept; double enchantmentCharge, const char* soul) noexcept;
}
private:
};
#endif //OPENMW_ITEMAPI_HPP #endif //OPENMW_ITEMAPI_HPP

View file

@ -11,7 +11,7 @@ using namespace std;
static std::string tempCellDescription; static std::string tempCellDescription;
unsigned char MechanicsFunctions::GetMiscellaneousChangeType(unsigned short pid) noexcept extern "C" unsigned char MechanicsFunctions::GetMiscellaneousChangeType(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -19,16 +19,16 @@ unsigned char MechanicsFunctions::GetMiscellaneousChangeType(unsigned short pid)
return player->miscellaneousChangeType; return player->miscellaneousChangeType;
} }
const char *MechanicsFunctions::GetMarkCell(unsigned short pid) noexcept extern "C" const char *MechanicsFunctions::GetMarkCell(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
tempCellDescription = player->cell.getDescription().c_str(); tempCellDescription = player->cell.getDescription();
return tempCellDescription.c_str(); return tempCellDescription.c_str();
} }
double MechanicsFunctions::GetMarkPosX(unsigned short pid) noexcept extern "C" double MechanicsFunctions::GetMarkPosX(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0.0f); GET_PLAYER(pid, player, 0.0f);
@ -36,7 +36,7 @@ double MechanicsFunctions::GetMarkPosX(unsigned short pid) noexcept
return player->markPosition.pos[0]; return player->markPosition.pos[0];
} }
double MechanicsFunctions::GetMarkPosY(unsigned short pid) noexcept extern "C" double MechanicsFunctions::GetMarkPosY(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0.0f); GET_PLAYER(pid, player, 0.0f);
@ -44,7 +44,7 @@ double MechanicsFunctions::GetMarkPosY(unsigned short pid) noexcept
return player->markPosition.pos[1]; return player->markPosition.pos[1];
} }
double MechanicsFunctions::GetMarkPosZ(unsigned short pid) noexcept extern "C" double MechanicsFunctions::GetMarkPosZ(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0.0f); GET_PLAYER(pid, player, 0.0f);
@ -52,7 +52,7 @@ double MechanicsFunctions::GetMarkPosZ(unsigned short pid) noexcept
return player->markPosition.pos[2]; return player->markPosition.pos[2];
} }
double MechanicsFunctions::GetMarkRotX(unsigned short pid) noexcept extern "C" double MechanicsFunctions::GetMarkRotX(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0.0f); GET_PLAYER(pid, player, 0.0f);
@ -60,7 +60,7 @@ double MechanicsFunctions::GetMarkRotX(unsigned short pid) noexcept
return player->markPosition.rot[0]; return player->markPosition.rot[0];
} }
double MechanicsFunctions::GetMarkRotZ(unsigned short pid) noexcept extern "C" double MechanicsFunctions::GetMarkRotZ(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0.0f); GET_PLAYER(pid, player, 0.0f);
@ -68,7 +68,7 @@ double MechanicsFunctions::GetMarkRotZ(unsigned short pid) noexcept
return player->markPosition.rot[2]; return player->markPosition.rot[2];
} }
bool MechanicsFunctions::DoesPlayerHavePlayerKiller(unsigned short pid) noexcept extern "C" bool MechanicsFunctions::DoesPlayerHavePlayerKiller(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, false); GET_PLAYER(pid, player, false);
@ -76,7 +76,7 @@ bool MechanicsFunctions::DoesPlayerHavePlayerKiller(unsigned short pid) noexcept
return player->killer.isPlayer; return player->killer.isPlayer;
} }
int MechanicsFunctions::GetPlayerKillerPid(unsigned short pid) noexcept extern "C" int MechanicsFunctions::GetPlayerKillerPid(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -89,7 +89,7 @@ int MechanicsFunctions::GetPlayerKillerPid(unsigned short pid) noexcept
return -1; return -1;
} }
const char *MechanicsFunctions::GetPlayerKillerRefId(unsigned short pid) noexcept extern "C" const char *MechanicsFunctions::GetPlayerKillerRefId(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ""); GET_PLAYER(pid, player, "");
@ -97,7 +97,7 @@ const char *MechanicsFunctions::GetPlayerKillerRefId(unsigned short pid) noexcep
return player->killer.refId.c_str(); return player->killer.refId.c_str();
} }
unsigned int MechanicsFunctions::GetPlayerKillerRefNum(unsigned short pid) noexcept extern "C" unsigned int MechanicsFunctions::GetPlayerKillerRefNum(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -105,7 +105,7 @@ unsigned int MechanicsFunctions::GetPlayerKillerRefNum(unsigned short pid) noexc
return player->killer.refNum; return player->killer.refNum;
} }
unsigned int MechanicsFunctions::GetPlayerKillerMpNum(unsigned short pid) noexcept extern "C" unsigned int MechanicsFunctions::GetPlayerKillerMpNum(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -113,7 +113,7 @@ unsigned int MechanicsFunctions::GetPlayerKillerMpNum(unsigned short pid) noexce
return player->killer.mpNum; return player->killer.mpNum;
} }
const char *MechanicsFunctions::GetPlayerKillerName(unsigned short pid) noexcept extern "C" const char *MechanicsFunctions::GetPlayerKillerName(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ""); GET_PLAYER(pid, player, "");
@ -121,7 +121,7 @@ const char *MechanicsFunctions::GetPlayerKillerName(unsigned short pid) noexcept
return player->killer.name.c_str(); return player->killer.name.c_str();
} }
const char *MechanicsFunctions::GetSelectedSpellId(unsigned short pid) noexcept extern "C" const char *MechanicsFunctions::GetSelectedSpellId(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -129,7 +129,7 @@ const char *MechanicsFunctions::GetSelectedSpellId(unsigned short pid) noexcept
return player->selectedSpellId.c_str(); return player->selectedSpellId.c_str();
} }
unsigned int MechanicsFunctions::GetDrawState(unsigned short pid) noexcept extern "C" unsigned int MechanicsFunctions::GetDrawState(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, false); GET_PLAYER(pid, player, false);
@ -137,7 +137,7 @@ unsigned int MechanicsFunctions::GetDrawState(unsigned short pid) noexcept
return player->drawState; return player->drawState;
} }
bool MechanicsFunctions::GetSneakState(unsigned short pid) noexcept extern "C" bool MechanicsFunctions::GetSneakState(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, false); GET_PLAYER(pid, player, false);
@ -146,7 +146,7 @@ bool MechanicsFunctions::GetSneakState(unsigned short pid) noexcept
return (player->movementFlags & 8) != 0; return (player->movementFlags & 8) != 0;
} }
void MechanicsFunctions::SetMarkCell(unsigned short pid, const char *cellDescription) noexcept extern "C" void MechanicsFunctions::SetMarkCell(unsigned short pid, const char *cellDescription) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -154,7 +154,7 @@ void MechanicsFunctions::SetMarkCell(unsigned short pid, const char *cellDescrip
player->markCell = Utils::getCellFromDescription(cellDescription); player->markCell = Utils::getCellFromDescription(cellDescription);
} }
void MechanicsFunctions::SetMarkPos(unsigned short pid, double x, double y, double z) noexcept extern "C" void MechanicsFunctions::SetMarkPos(unsigned short pid, double x, double y, double z) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -164,7 +164,7 @@ void MechanicsFunctions::SetMarkPos(unsigned short pid, double x, double y, doub
player->markPosition.pos[2] = z; player->markPosition.pos[2] = z;
} }
void MechanicsFunctions::SetMarkRot(unsigned short pid, double x, double z) noexcept extern "C" void MechanicsFunctions::SetMarkRot(unsigned short pid, double x, double z) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -173,7 +173,7 @@ void MechanicsFunctions::SetMarkRot(unsigned short pid, double x, double z) noex
player->markPosition.rot[2] = z; player->markPosition.rot[2] = z;
} }
void MechanicsFunctions::SetSelectedSpellId(unsigned short pid, const char *spellId) noexcept extern "C" void MechanicsFunctions::SetSelectedSpellId(unsigned short pid, const char *spellId) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -181,7 +181,7 @@ void MechanicsFunctions::SetSelectedSpellId(unsigned short pid, const char *spel
player->selectedSpellId = spellId; player->selectedSpellId = spellId;
} }
void MechanicsFunctions::SendMarkLocation(unsigned short pid) extern "C" void MechanicsFunctions::SendMarkLocation(unsigned short pid)
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -194,7 +194,7 @@ void MechanicsFunctions::SendMarkLocation(unsigned short pid)
packet->Send(false); packet->Send(false);
} }
void MechanicsFunctions::SendSelectedSpell(unsigned short pid) extern "C" void MechanicsFunctions::SendSelectedSpell(unsigned short pid)
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -207,7 +207,7 @@ void MechanicsFunctions::SendSelectedSpell(unsigned short pid)
packet->Send(false); packet->Send(false);
} }
void MechanicsFunctions::Jail(unsigned short pid, int jailDays, bool ignoreJailTeleportation, bool ignoreJailSkillIncreases, extern "C" void MechanicsFunctions::Jail(unsigned short pid, int jailDays, bool ignoreJailTeleportation, bool ignoreJailSkillIncreases,
const char* jailProgressText, const char* jailEndText) noexcept const char* jailProgressText, const char* jailEndText) noexcept
{ {
Player *player; Player *player;
@ -225,7 +225,7 @@ void MechanicsFunctions::Jail(unsigned short pid, int jailDays, bool ignoreJailT
packet->Send(false); packet->Send(false);
} }
void MechanicsFunctions::Resurrect(unsigned short pid, unsigned int type) noexcept extern "C" void MechanicsFunctions::Resurrect(unsigned short pid, unsigned int type) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -241,7 +241,7 @@ void MechanicsFunctions::Resurrect(unsigned short pid, unsigned int type) noexce
// All methods below are deprecated versions of methods from above // All methods below are deprecated versions of methods from above
const char *MechanicsFunctions::GetDeathReason(unsigned short pid) noexcept extern "C" const char *MechanicsFunctions::GetDeathReason(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -259,7 +259,7 @@ const char *MechanicsFunctions::GetDeathReason(unsigned short pid) noexcept
return "suicide"; return "suicide";
} }
unsigned int MechanicsFunctions::GetPlayerKillerRefNumIndex(unsigned short pid) noexcept extern "C" unsigned int MechanicsFunctions::GetPlayerKillerRefNumIndex(unsigned short pid) noexcept
{ {
return GetPlayerKillerRefNum(pid); return GetPlayerKillerRefNum(pid);
} }

View file

@ -3,6 +3,8 @@
#include "../Types.hpp" #include "../Types.hpp"
#include <Script/Platform.hpp>
#define MECHANICSAPI \ #define MECHANICSAPI \
{"GetMiscellaneousChangeType", MechanicsFunctions::GetMiscellaneousChangeType},\ {"GetMiscellaneousChangeType", MechanicsFunctions::GetMiscellaneousChangeType},\
\ \
@ -38,17 +40,15 @@
{"GetDeathReason", MechanicsFunctions::GetDeathReason},\ {"GetDeathReason", MechanicsFunctions::GetDeathReason},\
{"GetPlayerKillerRefNumIndex", MechanicsFunctions::GetPlayerKillerRefNumIndex} {"GetPlayerKillerRefNumIndex", MechanicsFunctions::GetPlayerKillerRefNumIndex}
class MechanicsFunctions namespace MechanicsFunctions
{ {
public:
/** /**
* \brief Get the type of a PlayerMiscellaneous packet. * \brief Get the type of a PlayerMiscellaneous packet.
* *
* \param pid The player ID. * \param pid The player ID.
* \return The type. * \return The type.
*/ */
static unsigned char GetMiscellaneousChangeType(unsigned short pid) noexcept; EXPORT_APIFUNCTION unsigned char CDECL GetMiscellaneousChangeType(unsigned short pid) noexcept;
/** /**
* \brief Get the cell description of a player's Mark cell. * \brief Get the cell description of a player's Mark cell.
@ -56,7 +56,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The cell description. * \return The cell description.
*/ */
static const char *GetMarkCell(unsigned short pid) noexcept; EXPORT_APIFUNCTION const char *CDECL GetMarkCell(unsigned short pid) noexcept;
/** /**
* \brief Get the X position of a player's Mark. * \brief Get the X position of a player's Mark.
@ -64,7 +64,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The X position. * \return The X position.
*/ */
static double GetMarkPosX(unsigned short pid) noexcept; EXPORT_APIFUNCTION double CDECL GetMarkPosX(unsigned short pid) noexcept;
/** /**
* \brief Get the Y position of a player's Mark. * \brief Get the Y position of a player's Mark.
@ -72,7 +72,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The Y position. * \return The Y position.
*/ */
static double GetMarkPosY(unsigned short pid) noexcept; EXPORT_APIFUNCTION double CDECL GetMarkPosY(unsigned short pid) noexcept;
/** /**
* \brief Get the Z position of a player's Mark. * \brief Get the Z position of a player's Mark.
@ -80,7 +80,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The Z position. * \return The Z position.
*/ */
static double GetMarkPosZ(unsigned short pid) noexcept; EXPORT_APIFUNCTION double CDECL GetMarkPosZ(unsigned short pid) noexcept;
/** /**
* \brief Get the X rotation of a player's Mark. * \brief Get the X rotation of a player's Mark.
@ -88,7 +88,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The X rotation. * \return The X rotation.
*/ */
static double GetMarkRotX(unsigned short pid) noexcept; EXPORT_APIFUNCTION double CDECL GetMarkRotX(unsigned short pid) noexcept;
/** /**
* \brief Get the Z rotation of a player's Mark. * \brief Get the Z rotation of a player's Mark.
@ -96,7 +96,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The X rotation. * \return The X rotation.
*/ */
static double GetMarkRotZ(unsigned short pid) noexcept; EXPORT_APIFUNCTION double CDECL GetMarkRotZ(unsigned short pid) noexcept;
/** /**
* \brief Get the ID of a player's selected spell. * \brief Get the ID of a player's selected spell.
@ -104,7 +104,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The spell ID. * \return The spell ID.
*/ */
static const char *GetSelectedSpellId(unsigned short pid) noexcept; EXPORT_APIFUNCTION const char *CDECL GetSelectedSpellId(unsigned short pid) noexcept;
/** /**
* \brief Check whether the killer of a certain player is also a player. * \brief Check whether the killer of a certain player is also a player.
@ -112,7 +112,7 @@ public:
* \param pid The player ID of the killed player. * \param pid The player ID of the killed player.
* \return Whether the player was killed by another player. * \return Whether the player was killed by another player.
*/ */
static bool DoesPlayerHavePlayerKiller(unsigned short pid) noexcept; EXPORT_APIFUNCTION bool CDECL DoesPlayerHavePlayerKiller(unsigned short pid) noexcept;
/** /**
* \brief Get the player ID of the killer of a certain player. * \brief Get the player ID of the killer of a certain player.
@ -120,7 +120,7 @@ public:
* \param pid The player ID of the killed player. * \param pid The player ID of the killed player.
* \return The player ID of the killer. * \return The player ID of the killer.
*/ */
static int GetPlayerKillerPid(unsigned short pid) noexcept; EXPORT_APIFUNCTION int CDECL GetPlayerKillerPid(unsigned short pid) noexcept;
/** /**
* \brief Get the refId of the actor killer of a certain player. * \brief Get the refId of the actor killer of a certain player.
@ -128,7 +128,7 @@ public:
* \param pid The player ID of the killed player. * \param pid The player ID of the killed player.
* \return The refId of the killer. * \return The refId of the killer.
*/ */
static const char *GetPlayerKillerRefId(unsigned short pid) noexcept; EXPORT_APIFUNCTION const char *CDECL GetPlayerKillerRefId(unsigned short pid) noexcept;
/** /**
* \brief Get the refNum of the actor killer of a certain player. * \brief Get the refNum of the actor killer of a certain player.
@ -136,7 +136,7 @@ public:
* \param pid The player ID of the killed player. * \param pid The player ID of the killed player.
* \return The refNum of the killer. * \return The refNum of the killer.
*/ */
static unsigned int GetPlayerKillerRefNum(unsigned short pid) noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetPlayerKillerRefNum(unsigned short pid) noexcept;
/** /**
* \brief Get the mpNum of the actor killer of a certain player. * \brief Get the mpNum of the actor killer of a certain player.
@ -144,7 +144,7 @@ public:
* \param pid The player ID of the killed player. * \param pid The player ID of the killed player.
* \return The mpNum of the killer. * \return The mpNum of the killer.
*/ */
static unsigned int GetPlayerKillerMpNum(unsigned short pid) noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetPlayerKillerMpNum(unsigned short pid) noexcept;
/** /**
* \brief Get the name of the actor killer of a certain player. * \brief Get the name of the actor killer of a certain player.
@ -152,7 +152,7 @@ public:
* \param pid The player ID of the killed player. * \param pid The player ID of the killed player.
* \return The name of the killer. * \return The name of the killer.
*/ */
static const char *GetPlayerKillerName(unsigned short pid) noexcept; EXPORT_APIFUNCTION const char *CDECL GetPlayerKillerName(unsigned short pid) noexcept;
/** /**
* \brief Get the draw state of a player (0 for nothing, 1 for drawn weapon, * \brief Get the draw state of a player (0 for nothing, 1 for drawn weapon,
@ -161,7 +161,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The draw state. * \return The draw state.
*/ */
static unsigned int GetDrawState(unsigned short pid) noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetDrawState(unsigned short pid) noexcept;
/** /**
* \brief Get the sneak state of a player. * \brief Get the sneak state of a player.
@ -169,7 +169,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return Whether the player is sneaking. * \return Whether the player is sneaking.
*/ */
static bool GetSneakState(unsigned short pid) noexcept; EXPORT_APIFUNCTION bool CDECL GetSneakState(unsigned short pid) noexcept;
/** /**
* \brief Set the Mark cell of a player. * \brief Set the Mark cell of a player.
@ -184,7 +184,7 @@ public:
* \param cellDescription The cell description. * \param cellDescription The cell description.
* \return void * \return void
*/ */
static void SetMarkCell(unsigned short pid, const char *cellDescription) noexcept; EXPORT_APIFUNCTION void CDECL SetMarkCell(unsigned short pid, const char *cellDescription) noexcept;
/** /**
* \brief Set the Mark position of a player. * \brief Set the Mark position of a player.
@ -198,7 +198,7 @@ public:
* \param z The Z position. * \param z The Z position.
* \return void * \return void
*/ */
static void SetMarkPos(unsigned short pid, double x, double y, double z) noexcept; EXPORT_APIFUNCTION void CDECL SetMarkPos(unsigned short pid, double x, double y, double z) noexcept;
/** /**
* \brief Set the Mark rotation of a player. * \brief Set the Mark rotation of a player.
@ -211,7 +211,7 @@ public:
* \param z The Z rotation. * \param z The Z rotation.
* \return void * \return void
*/ */
static void SetMarkRot(unsigned short pid, double x, double z) noexcept; EXPORT_APIFUNCTION void CDECL SetMarkRot(unsigned short pid, double x, double z) noexcept;
/** /**
* \brief Set the ID of a player's selected spell. * \brief Set the ID of a player's selected spell.
@ -223,7 +223,7 @@ public:
* \param spellId The spell ID. * \param spellId The spell ID.
* \return void * \return void
*/ */
static void SetSelectedSpellId(unsigned short pid, const char *spellId) noexcept; EXPORT_APIFUNCTION void CDECL SetSelectedSpellId(unsigned short pid, const char *spellId) noexcept;
/** /**
* \brief Send a PlayerMiscellaneous packet with a Mark location to a player. * \brief Send a PlayerMiscellaneous packet with a Mark location to a player.
@ -231,7 +231,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return void * \return void
*/ */
static void SendMarkLocation(unsigned short pid); EXPORT_APIFUNCTION void CDECL SendMarkLocation(unsigned short pid);
/** /**
* \brief Send a PlayerMiscellaneous packet with a selected spell ID to a player. * \brief Send a PlayerMiscellaneous packet with a selected spell ID to a player.
@ -239,7 +239,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return void * \return void
*/ */
static void SendSelectedSpell(unsigned short pid); EXPORT_APIFUNCTION void CDECL SendSelectedSpell(unsigned short pid);
/** /**
* \brief Send a PlayerJail packet about a player. * \brief Send a PlayerJail packet about a player.
@ -261,7 +261,7 @@ public:
* \param jailEndText The text that should be displayed once the jailing period is over. * \param jailEndText The text that should be displayed once the jailing period is over.
* \return void * \return void
*/ */
static void Jail(unsigned short pid, int jailDays, bool ignoreJailTeleportation, bool ignoreJailSkillIncreases, EXPORT_APIFUNCTION void CDECL Jail(unsigned short pid, int jailDays, bool ignoreJailTeleportation, bool ignoreJailSkillIncreases,
const char* jailProgressText, const char* jailEndText) noexcept; const char* jailProgressText, const char* jailEndText) noexcept;
/** /**
@ -274,13 +274,12 @@ public:
* 2 for TRIBUNAL_TEMPLE). * 2 for TRIBUNAL_TEMPLE).
* \return void * \return void
*/ */
static void Resurrect(unsigned short pid, unsigned int type) noexcept; EXPORT_APIFUNCTION void CDECL Resurrect(unsigned short pid, unsigned int type) noexcept;
// All methods below are deprecated versions of methods from above // All methods below are deprecated versions of methods from above
static const char *GetDeathReason(unsigned short pid) noexcept; EXPORT_APIFUNCTION const char *CDECL GetDeathReason(unsigned short pid) noexcept;
static unsigned int GetPlayerKillerRefNumIndex(unsigned short pid) noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetPlayerKillerRefNumIndex(unsigned short pid) noexcept;
}
};
#endif //OPENMW_MECHANICSAPI_HPP #endif //OPENMW_MECHANICSAPI_HPP

View file

@ -1,23 +1,59 @@
#include "Miscellaneous.hpp" #include "Miscellaneous.hpp"
#include <components/misc/stringops.hpp>
#include <components/openmw-mp/Log.hpp> #include <components/openmw-mp/Log.hpp>
#include <apps/openmw-mp/Script/ScriptFunctions.hpp>
#include <apps/openmw-mp/Networking.hpp> #include <apps/openmw-mp/Networking.hpp>
#include <iostream> #include <iostream>
using namespace std; using namespace std;
unsigned int MiscellaneousFunctions::GetLastPlayerId() noexcept static std::string tempFilename;
extern "C" bool MiscellaneousFunctions::DoesFileExist(const char *filePath) noexcept
{
return boost::filesystem::exists(filePath);
}
extern "C" const char *MiscellaneousFunctions::GetCaseInsensitiveFilename(const char *folderPath, const char *filename) noexcept
{
if (!boost::filesystem::exists(folderPath)) return "invalid";
boost::filesystem::directory_iterator end_itr; // default construction yields past-the-end
for (boost::filesystem::directory_iterator itr(folderPath); itr != end_itr; ++itr)
{
if (Misc::StringUtils::ciEqual(itr->path().filename().string(), filename))
{
tempFilename = itr->path().filename().string();
return tempFilename.c_str();
}
}
return "invalid";
}
extern "C" unsigned int MiscellaneousFunctions::GetLastPlayerId() noexcept
{ {
return Players::getLastPlayerId(); return Players::getLastPlayerId();
} }
int MiscellaneousFunctions::GetCurrentMpNum() noexcept extern "C" int MiscellaneousFunctions::GetCurrentMpNum() noexcept
{ {
return mwmp::Networking::getPtr()->getCurrentMpNum(); return mwmp::Networking::getPtr()->getCurrentMpNum();
} }
void MiscellaneousFunctions::SetCurrentMpNum(int mpNum) noexcept extern "C" void MiscellaneousFunctions::SetCurrentMpNum(int mpNum) noexcept
{ {
mwmp::Networking::getPtr()->setCurrentMpNum(mpNum); mwmp::Networking::getPtr()->setCurrentMpNum(mpNum);
} }
extern "C" void MiscellaneousFunctions::LogMessage(unsigned short level, const char *message) noexcept
{
LOG_MESSAGE_SIMPLE(level, "[Script]: %s", message);
}
extern "C" void MiscellaneousFunctions::LogAppend(unsigned short level, const char *message) noexcept
{
LOG_APPEND(level, "[Script]: %s", message);
}

View file

@ -3,15 +3,42 @@
#include "../Types.hpp" #include "../Types.hpp"
#include <Script/Platform.hpp>
#define MISCELLANEOUSAPI \ #define MISCELLANEOUSAPI \
{"DoesFileExist", MiscellaneousFunctions::DoesFileExist},\
{"GetCaseInsensitiveFilename", MiscellaneousFunctions::GetCaseInsensitiveFilename},\
\
{"GetLastPlayerId", MiscellaneousFunctions::GetLastPlayerId},\ {"GetLastPlayerId", MiscellaneousFunctions::GetLastPlayerId},\
\ \
{"GetCurrentMpNum", MiscellaneousFunctions::GetCurrentMpNum},\ {"GetCurrentMpNum", MiscellaneousFunctions::GetCurrentMpNum},\
{"SetCurrentMpNum", MiscellaneousFunctions::SetCurrentMpNum} {"SetCurrentMpNum", MiscellaneousFunctions::SetCurrentMpNum},\
\
{"LogMessage", MiscellaneousFunctions::LogMessage},\
{"LogAppend", MiscellaneousFunctions::LogAppend}
class MiscellaneousFunctions namespace MiscellaneousFunctions
{ {
public: /**
* \brief Check whether a certain file exists.
*
* This will be a case sensitive check on case sensitive filesystems.
*
* Whenever you want to enforce case insensitivity, use GetCaseInsensitiveFilename() instead.
*
* \return Whether the file exists or not.
*/
EXPORT_APIFUNCTION bool CDECL DoesFileExist(const char *filePath) noexcept;
/**
* \brief Get the first filename in a folder that has a case insensitive match with the filename
* argument.
*
* This is used to retain case insensitivity when opening data files on Linux.
*
* \return The filename that matches.
*/
EXPORT_APIFUNCTION const char *CDECL GetCaseInsensitiveFilename(const char *folderPath, const char *filename) noexcept;
/** /**
* \brief Get the last player ID currently connected to the server. * \brief Get the last player ID currently connected to the server.
@ -21,7 +48,7 @@ public:
* *
* \return The player ID. * \return The player ID.
*/ */
static unsigned int GetLastPlayerId() noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetLastPlayerId() noexcept;
/** /**
* \brief Get the current (latest) mpNum generated by the server. * \brief Get the current (latest) mpNum generated by the server.
@ -35,7 +62,7 @@ public:
* *
* \return The mpNum. * \return The mpNum.
*/ */
static int GetCurrentMpNum() noexcept; EXPORT_APIFUNCTION int CDECL GetCurrentMpNum() noexcept;
/** /**
* \brief Set the current (latest) mpNum generated by the server. * \brief Set the current (latest) mpNum generated by the server.
@ -47,7 +74,31 @@ public:
* \param mpNum The number that should be used as the new current mpNum. * \param mpNum The number that should be used as the new current mpNum.
* \return void * \return void
*/ */
static void SetCurrentMpNum(int mpNum) noexcept; EXPORT_APIFUNCTION void CDECL SetCurrentMpNum(int mpNum) noexcept;
};
/**
* \brief Write a log message with its own timestamp.
*
* It will have "[Script]:" prepended to it so as to mark it as a script-generated log message.
*
* \param level The logging level used (0 for LOG_VERBOSE, 1 for LOG_INFO, 2 for LOG_WARN,
* 3 for LOG_ERROR, 4 for LOG_FATAL).
* \param message The message logged.
* \return void
*/
EXPORT_APIFUNCTION void CDECL LogMessage(unsigned short level, const char *message) noexcept;
/**
* \brief Write a log message without its own timestamp.
*
* It will have "[Script]:" prepended to it so as to mark it as a script-generated log message.
*
* \param level The logging level used (0 for LOG_VERBOSE, 1 for LOG_INFO, 2 for LOG_WARN,
* 3 for LOG_ERROR, 4 for LOG_FATAL).
* \param message The message logged.
* \return void
*/
EXPORT_APIFUNCTION void CDECL LogAppend(unsigned short level, const char *message) noexcept;
}
#endif //OPENMW_MISCELLANEOUSAPI_HPP #endif //OPENMW_MISCELLANEOUSAPI_HPP

View file

@ -19,19 +19,19 @@ const BaseObject emptyObject = {};
ContainerItem tempContainerItem; ContainerItem tempContainerItem;
const ContainerItem emptyContainerItem = {}; const ContainerItem emptyContainerItem = {};
void ObjectFunctions::ReadReceivedObjectList() noexcept extern "C" void ObjectFunctions::ReadReceivedObjectList() noexcept
{ {
readObjectList = mwmp::Networking::getPtr()->getReceivedObjectList(); readObjectList = mwmp::Networking::getPtr()->getReceivedObjectList();
} }
void ObjectFunctions::ClearObjectList() noexcept extern "C" void ObjectFunctions::ClearObjectList() noexcept
{ {
writeObjectList.cell.blank(); writeObjectList.cell.blank();
writeObjectList.baseObjects.clear(); writeObjectList.baseObjects.clear();
writeObjectList.packetOrigin = mwmp::PACKET_ORIGIN::SERVER_SCRIPT; writeObjectList.packetOrigin = mwmp::PACKET_ORIGIN::SERVER_SCRIPT;
} }
void ObjectFunctions::SetObjectListPid(unsigned short pid) noexcept extern "C" void ObjectFunctions::SetObjectListPid(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -39,42 +39,42 @@ void ObjectFunctions::SetObjectListPid(unsigned short pid) noexcept
writeObjectList.guid = player->guid; writeObjectList.guid = player->guid;
} }
void ObjectFunctions::CopyReceivedObjectListToStore() noexcept extern "C" void ObjectFunctions::CopyReceivedObjectListToStore() noexcept
{ {
writeObjectList = *readObjectList; writeObjectList = *readObjectList;
} }
unsigned int ObjectFunctions::GetObjectListSize() noexcept extern "C" unsigned int ObjectFunctions::GetObjectListSize() noexcept
{ {
return readObjectList->baseObjectCount; return readObjectList->baseObjectCount;
} }
unsigned char ObjectFunctions::GetObjectListOrigin() noexcept extern "C" unsigned char ObjectFunctions::GetObjectListOrigin() noexcept
{ {
return readObjectList->packetOrigin; return readObjectList->packetOrigin;
} }
const char *ObjectFunctions::GetObjectListClientScript() noexcept extern "C" const char *ObjectFunctions::GetObjectListClientScript() noexcept
{ {
return readObjectList->originClientScript.c_str(); return readObjectList->originClientScript.c_str();
} }
unsigned char ObjectFunctions::GetObjectListAction() noexcept extern "C" unsigned char ObjectFunctions::GetObjectListAction() noexcept
{ {
return readObjectList->action; return readObjectList->action;
} }
unsigned char ObjectFunctions::GetObjectListContainerSubAction() noexcept extern "C" unsigned char ObjectFunctions::GetObjectListContainerSubAction() noexcept
{ {
return readObjectList->containerSubAction; return readObjectList->containerSubAction;
} }
bool ObjectFunctions::IsObjectPlayer(unsigned int index) noexcept extern "C" bool ObjectFunctions::IsObjectPlayer(unsigned int index) noexcept
{ {
return readObjectList->baseObjects.at(index).isPlayer; return readObjectList->baseObjects.at(index).isPlayer;
} }
int ObjectFunctions::GetObjectPid(unsigned int index) noexcept extern "C" int ObjectFunctions::GetObjectPid(unsigned int index) noexcept
{ {
Player *player = Players::getPlayer(readObjectList->baseObjects.at(index).guid); Player *player = Players::getPlayer(readObjectList->baseObjects.at(index).guid);
@ -84,72 +84,72 @@ int ObjectFunctions::GetObjectPid(unsigned int index) noexcept
return -1; return -1;
} }
const char *ObjectFunctions::GetObjectRefId(unsigned int index) noexcept extern "C" const char *ObjectFunctions::GetObjectRefId(unsigned int index) noexcept
{ {
return readObjectList->baseObjects.at(index).refId.c_str(); return readObjectList->baseObjects.at(index).refId.c_str();
} }
unsigned int ObjectFunctions::GetObjectRefNum(unsigned int index) noexcept extern "C" unsigned int ObjectFunctions::GetObjectRefNum(unsigned int index) noexcept
{ {
return readObjectList->baseObjects.at(index).refNum; return readObjectList->baseObjects.at(index).refNum;
} }
unsigned int ObjectFunctions::GetObjectMpNum(unsigned int index) noexcept extern "C" unsigned int ObjectFunctions::GetObjectMpNum(unsigned int index) noexcept
{ {
return readObjectList->baseObjects.at(index).mpNum; return readObjectList->baseObjects.at(index).mpNum;
} }
int ObjectFunctions::GetObjectCount(unsigned int index) noexcept extern "C" int ObjectFunctions::GetObjectCount(unsigned int index) noexcept
{ {
return readObjectList->baseObjects.at(index).count; return readObjectList->baseObjects.at(index).count;
} }
int ObjectFunctions::GetObjectCharge(unsigned int index) noexcept extern "C" int ObjectFunctions::GetObjectCharge(unsigned int index) noexcept
{ {
return readObjectList->baseObjects.at(index).charge; return readObjectList->baseObjects.at(index).charge;
} }
double ObjectFunctions::GetObjectEnchantmentCharge(unsigned int index) noexcept extern "C" double ObjectFunctions::GetObjectEnchantmentCharge(unsigned int index) noexcept
{ {
return readObjectList->baseObjects.at(index).enchantmentCharge; return readObjectList->baseObjects.at(index).enchantmentCharge;
} }
const char *ObjectFunctions::GetObjectSoul(unsigned int index) noexcept extern "C" const char *ObjectFunctions::GetObjectSoul(unsigned int index) noexcept
{ {
return readObjectList->baseObjects.at(index).soul.c_str(); return readObjectList->baseObjects.at(index).soul.c_str();
} }
int ObjectFunctions::GetObjectGoldValue(unsigned int index) noexcept extern "C" int ObjectFunctions::GetObjectGoldValue(unsigned int index) noexcept
{ {
return readObjectList->baseObjects.at(index).goldValue; return readObjectList->baseObjects.at(index).goldValue;
} }
double ObjectFunctions::GetObjectScale(unsigned int index) noexcept extern "C" double ObjectFunctions::GetObjectScale(unsigned int index) noexcept
{ {
return readObjectList->baseObjects.at(index).scale; return readObjectList->baseObjects.at(index).scale;
} }
bool ObjectFunctions::GetObjectState(unsigned int index) noexcept extern "C" bool ObjectFunctions::GetObjectState(unsigned int index) noexcept
{ {
return readObjectList->baseObjects.at(index).objectState; return readObjectList->baseObjects.at(index).objectState;
} }
int ObjectFunctions::GetObjectDoorState(unsigned int index) noexcept extern "C" int ObjectFunctions::GetObjectDoorState(unsigned int index) noexcept
{ {
return readObjectList->baseObjects.at(index).doorState; return readObjectList->baseObjects.at(index).doorState;
} }
int ObjectFunctions::GetObjectLockLevel(unsigned int index) noexcept extern "C" int ObjectFunctions::GetObjectLockLevel(unsigned int index) noexcept
{ {
return readObjectList->baseObjects.at(index).lockLevel; return readObjectList->baseObjects.at(index).lockLevel;
} }
bool ObjectFunctions::DoesObjectHavePlayerActivating(unsigned int index) noexcept extern "C" bool ObjectFunctions::DoesObjectHavePlayerActivating(unsigned int index) noexcept
{ {
return readObjectList->baseObjects.at(index).activatingActor.isPlayer; return readObjectList->baseObjects.at(index).activatingActor.isPlayer;
} }
int ObjectFunctions::GetObjectActivatingPid(unsigned int index) noexcept extern "C" int ObjectFunctions::GetObjectActivatingPid(unsigned int index) noexcept
{ {
Player *player = Players::getPlayer(readObjectList->baseObjects.at(index).activatingActor.guid); Player *player = Players::getPlayer(readObjectList->baseObjects.at(index).activatingActor.guid);
@ -159,42 +159,42 @@ int ObjectFunctions::GetObjectActivatingPid(unsigned int index) noexcept
return -1; return -1;
} }
const char *ObjectFunctions::GetObjectActivatingRefId(unsigned int index) noexcept extern "C" const char *ObjectFunctions::GetObjectActivatingRefId(unsigned int index) noexcept
{ {
return readObjectList->baseObjects.at(index).activatingActor.refId.c_str(); return readObjectList->baseObjects.at(index).activatingActor.refId.c_str();
} }
unsigned int ObjectFunctions::GetObjectActivatingRefNum(unsigned int index) noexcept extern "C" unsigned int ObjectFunctions::GetObjectActivatingRefNum(unsigned int index) noexcept
{ {
return readObjectList->baseObjects.at(index).activatingActor.refNum; return readObjectList->baseObjects.at(index).activatingActor.refNum;
} }
unsigned int ObjectFunctions::GetObjectActivatingMpNum(unsigned int index) noexcept extern "C" unsigned int ObjectFunctions::GetObjectActivatingMpNum(unsigned int index) noexcept
{ {
return readObjectList->baseObjects.at(index).activatingActor.mpNum; return readObjectList->baseObjects.at(index).activatingActor.mpNum;
} }
const char *ObjectFunctions::GetObjectActivatingName(unsigned int index) noexcept extern "C" const char *ObjectFunctions::GetObjectActivatingName(unsigned int index) noexcept
{ {
return readObjectList->baseObjects.at(index).activatingActor.name.c_str(); return readObjectList->baseObjects.at(index).activatingActor.name.c_str();
} }
bool ObjectFunctions::GetObjectSummonState(unsigned int index) noexcept extern "C" bool ObjectFunctions::GetObjectSummonState(unsigned int index) noexcept
{ {
return readObjectList->baseObjects.at(index).isSummon; return readObjectList->baseObjects.at(index).isSummon;
} }
double ObjectFunctions::GetObjectSummonDuration(unsigned int index) noexcept extern "C" double ObjectFunctions::GetObjectSummonDuration(unsigned int index) noexcept
{ {
return readObjectList->baseObjects.at(index).summonDuration; return readObjectList->baseObjects.at(index).summonDuration;
} }
bool ObjectFunctions::DoesObjectHavePlayerSummoner(unsigned int index) noexcept extern "C" bool ObjectFunctions::DoesObjectHavePlayerSummoner(unsigned int index) noexcept
{ {
return readObjectList->baseObjects.at(index).master.isPlayer; return readObjectList->baseObjects.at(index).master.isPlayer;
} }
int ObjectFunctions::GetObjectSummonerPid(unsigned int index) noexcept extern "C" int ObjectFunctions::GetObjectSummonerPid(unsigned int index) noexcept
{ {
Player *player = Players::getPlayer(readObjectList->baseObjects.at(index).master.guid); Player *player = Players::getPlayer(readObjectList->baseObjects.at(index).master.guid);
@ -204,202 +204,202 @@ int ObjectFunctions::GetObjectSummonerPid(unsigned int index) noexcept
return -1; return -1;
} }
const char *ObjectFunctions::GetObjectSummonerRefId(unsigned int index) noexcept extern "C" const char *ObjectFunctions::GetObjectSummonerRefId(unsigned int index) noexcept
{ {
return readObjectList->baseObjects.at(index).master.refId.c_str(); return readObjectList->baseObjects.at(index).master.refId.c_str();
} }
unsigned int ObjectFunctions::GetObjectSummonerRefNum(unsigned int index) noexcept extern "C" unsigned int ObjectFunctions::GetObjectSummonerRefNum(unsigned int index) noexcept
{ {
return readObjectList->baseObjects.at(index).master.refNum; return readObjectList->baseObjects.at(index).master.refNum;
} }
unsigned int ObjectFunctions::GetObjectSummonerMpNum(unsigned int index) noexcept extern "C" unsigned int ObjectFunctions::GetObjectSummonerMpNum(unsigned int index) noexcept
{ {
return readObjectList->baseObjects.at(index).master.mpNum; return readObjectList->baseObjects.at(index).master.mpNum;
} }
double ObjectFunctions::GetObjectPosX(unsigned int index) noexcept extern "C" double ObjectFunctions::GetObjectPosX(unsigned int index) noexcept
{ {
return readObjectList->baseObjects.at(index).position.pos[0]; return readObjectList->baseObjects.at(index).position.pos[0];
} }
double ObjectFunctions::GetObjectPosY(unsigned int index) noexcept extern "C" double ObjectFunctions::GetObjectPosY(unsigned int index) noexcept
{ {
return readObjectList->baseObjects.at(index).position.pos[1]; return readObjectList->baseObjects.at(index).position.pos[1];
} }
double ObjectFunctions::GetObjectPosZ(unsigned int index) noexcept extern "C" double ObjectFunctions::GetObjectPosZ(unsigned int index) noexcept
{ {
return readObjectList->baseObjects.at(index).position.pos[2]; return readObjectList->baseObjects.at(index).position.pos[2];
} }
double ObjectFunctions::GetObjectRotX(unsigned int index) noexcept extern "C" double ObjectFunctions::GetObjectRotX(unsigned int index) noexcept
{ {
return readObjectList->baseObjects.at(index).position.rot[0]; return readObjectList->baseObjects.at(index).position.rot[0];
} }
double ObjectFunctions::GetObjectRotY(unsigned int index) noexcept extern "C" double ObjectFunctions::GetObjectRotY(unsigned int index) noexcept
{ {
return readObjectList->baseObjects.at(index).position.rot[1]; return readObjectList->baseObjects.at(index).position.rot[1];
} }
double ObjectFunctions::GetObjectRotZ(unsigned int index) noexcept extern "C" double ObjectFunctions::GetObjectRotZ(unsigned int index) noexcept
{ {
return readObjectList->baseObjects.at(index).position.rot[2]; return readObjectList->baseObjects.at(index).position.rot[2];
} }
const char *ObjectFunctions::GetVideoFilename(unsigned int index) noexcept extern "C" const char *ObjectFunctions::GetVideoFilename(unsigned int index) noexcept
{ {
return readObjectList->baseObjects.at(index).videoFilename.c_str(); return readObjectList->baseObjects.at(index).videoFilename.c_str();
} }
unsigned int ObjectFunctions::GetContainerChangesSize(unsigned int objectIndex) noexcept extern "C" unsigned int ObjectFunctions::GetContainerChangesSize(unsigned int objectIndex) noexcept
{ {
return readObjectList->baseObjects.at(objectIndex).containerItemCount; return readObjectList->baseObjects.at(objectIndex).containerItemCount;
} }
const char *ObjectFunctions::GetContainerItemRefId(unsigned int objectIndex, unsigned int itemIndex) noexcept extern "C" const char *ObjectFunctions::GetContainerItemRefId(unsigned int objectIndex, unsigned int itemIndex) noexcept
{ {
return readObjectList->baseObjects.at(objectIndex) return readObjectList->baseObjects.at(objectIndex)
.containerItems.at(itemIndex).refId.c_str(); .containerItems.at(itemIndex).refId.c_str();
} }
int ObjectFunctions::GetContainerItemCount(unsigned int objectIndex, unsigned int itemIndex) noexcept extern "C" int ObjectFunctions::GetContainerItemCount(unsigned int objectIndex, unsigned int itemIndex) noexcept
{ {
return readObjectList->baseObjects.at(objectIndex) return readObjectList->baseObjects.at(objectIndex)
.containerItems.at(itemIndex).count; .containerItems.at(itemIndex).count;
} }
int ObjectFunctions::GetContainerItemCharge(unsigned int objectIndex, unsigned int itemIndex) noexcept extern "C" int ObjectFunctions::GetContainerItemCharge(unsigned int objectIndex, unsigned int itemIndex) noexcept
{ {
return readObjectList->baseObjects.at(objectIndex) return readObjectList->baseObjects.at(objectIndex)
.containerItems.at(itemIndex).charge; .containerItems.at(itemIndex).charge;
} }
double ObjectFunctions::GetContainerItemEnchantmentCharge(unsigned int objectIndex, unsigned int itemIndex) noexcept extern "C" double ObjectFunctions::GetContainerItemEnchantmentCharge(unsigned int objectIndex, unsigned int itemIndex) noexcept
{ {
return readObjectList->baseObjects.at(objectIndex) return readObjectList->baseObjects.at(objectIndex)
.containerItems.at(itemIndex).enchantmentCharge; .containerItems.at(itemIndex).enchantmentCharge;
} }
const char *ObjectFunctions::GetContainerItemSoul(unsigned int objectIndex, unsigned int itemIndex) noexcept extern "C" const char *ObjectFunctions::GetContainerItemSoul(unsigned int objectIndex, unsigned int itemIndex) noexcept
{ {
return readObjectList->baseObjects.at(objectIndex) return readObjectList->baseObjects.at(objectIndex)
.containerItems.at(itemIndex).soul.c_str(); .containerItems.at(itemIndex).soul.c_str();
} }
int ObjectFunctions::GetContainerItemActionCount(unsigned int objectIndex, unsigned int itemIndex) noexcept extern "C" int ObjectFunctions::GetContainerItemActionCount(unsigned int objectIndex, unsigned int itemIndex) noexcept
{ {
return readObjectList->baseObjects.at(objectIndex) return readObjectList->baseObjects.at(objectIndex)
.containerItems.at(itemIndex).actionCount; .containerItems.at(itemIndex).actionCount;
} }
bool ObjectFunctions::DoesObjectHaveContainer(unsigned int index) noexcept extern "C" bool ObjectFunctions::DoesObjectHaveContainer(unsigned int index) noexcept
{ {
return readObjectList->baseObjects.at(index).hasContainer; return readObjectList->baseObjects.at(index).hasContainer;
} }
void ObjectFunctions::SetObjectListCell(const char* cellDescription) noexcept extern "C" void ObjectFunctions::SetObjectListCell(const char* cellDescription) noexcept
{ {
writeObjectList.cell = Utils::getCellFromDescription(cellDescription); writeObjectList.cell = Utils::getCellFromDescription(cellDescription);
} }
void ObjectFunctions::SetObjectListAction(unsigned char action) noexcept extern "C" void ObjectFunctions::SetObjectListAction(unsigned char action) noexcept
{ {
writeObjectList.action = action; writeObjectList.action = action;
} }
void ObjectFunctions::SetObjectListConsoleCommand(const char* consoleCommand) noexcept extern "C" void ObjectFunctions::SetObjectListConsoleCommand(const char* consoleCommand) noexcept
{ {
writeObjectList.consoleCommand = consoleCommand; writeObjectList.consoleCommand = consoleCommand;
} }
void ObjectFunctions::SetObjectRefId(const char* refId) noexcept extern "C" void ObjectFunctions::SetObjectRefId(const char* refId) noexcept
{ {
tempObject.refId = refId; tempObject.refId = refId;
} }
void ObjectFunctions::SetObjectRefNum(int refNum) noexcept extern "C" void ObjectFunctions::SetObjectRefNum(int refNum) noexcept
{ {
tempObject.refNum = refNum; tempObject.refNum = refNum;
} }
void ObjectFunctions::SetObjectMpNum(int mpNum) noexcept extern "C" void ObjectFunctions::SetObjectMpNum(int mpNum) noexcept
{ {
tempObject.mpNum = mpNum; tempObject.mpNum = mpNum;
} }
void ObjectFunctions::SetObjectCount(int count) noexcept extern "C" void ObjectFunctions::SetObjectCount(int count) noexcept
{ {
tempObject.count = count; tempObject.count = count;
} }
void ObjectFunctions::SetObjectCharge(int charge) noexcept extern "C" void ObjectFunctions::SetObjectCharge(int charge) noexcept
{ {
tempObject.charge = charge; tempObject.charge = charge;
} }
void ObjectFunctions::SetObjectEnchantmentCharge(double enchantmentCharge) noexcept extern "C" void ObjectFunctions::SetObjectEnchantmentCharge(double enchantmentCharge) noexcept
{ {
tempObject.enchantmentCharge = enchantmentCharge; tempObject.enchantmentCharge = enchantmentCharge;
} }
void ObjectFunctions::SetObjectSoul(const char* soul) noexcept extern "C" void ObjectFunctions::SetObjectSoul(const char* soul) noexcept
{ {
tempObject.soul = soul; tempObject.soul = soul;
} }
void ObjectFunctions::SetObjectGoldValue(int goldValue) noexcept extern "C" void ObjectFunctions::SetObjectGoldValue(int goldValue) noexcept
{ {
tempObject.goldValue = goldValue; tempObject.goldValue = goldValue;
} }
void ObjectFunctions::SetObjectScale(double scale) noexcept extern "C" void ObjectFunctions::SetObjectScale(double scale) noexcept
{ {
tempObject.scale = scale; tempObject.scale = scale;
} }
void ObjectFunctions::SetObjectState(bool objectState) noexcept extern "C" void ObjectFunctions::SetObjectState(bool objectState) noexcept
{ {
tempObject.objectState = objectState; tempObject.objectState = objectState;
} }
void ObjectFunctions::SetObjectLockLevel(int lockLevel) noexcept extern "C" void ObjectFunctions::SetObjectLockLevel(int lockLevel) noexcept
{ {
tempObject.lockLevel = lockLevel; tempObject.lockLevel = lockLevel;
} }
void ObjectFunctions::SetObjectSummonDuration(float summonDuration) noexcept extern "C" void ObjectFunctions::SetObjectSummonDuration(float summonDuration) noexcept
{ {
tempObject.summonDuration = summonDuration; tempObject.summonDuration = summonDuration;
} }
void ObjectFunctions::SetObjectDisarmState(bool disarmState) noexcept extern "C" void ObjectFunctions::SetObjectDisarmState(bool disarmState) noexcept
{ {
tempObject.isDisarmed = disarmState; tempObject.isDisarmed = disarmState;
} }
void ObjectFunctions::SetObjectSummonState(bool summonState) noexcept extern "C" void ObjectFunctions::SetObjectSummonState(bool summonState) noexcept
{ {
tempObject.isSummon = summonState; tempObject.isSummon = summonState;
} }
void ObjectFunctions::SetObjectPosition(double x, double y, double z) noexcept extern "C" void ObjectFunctions::SetObjectPosition(double x, double y, double z) noexcept
{ {
tempObject.position.pos[0] = x; tempObject.position.pos[0] = x;
tempObject.position.pos[1] = y; tempObject.position.pos[1] = y;
tempObject.position.pos[2] = z; tempObject.position.pos[2] = z;
} }
void ObjectFunctions::SetObjectRotation(double x, double y, double z) noexcept extern "C" void ObjectFunctions::SetObjectRotation(double x, double y, double z) noexcept
{ {
tempObject.position.rot[0] = x; tempObject.position.rot[0] = x;
tempObject.position.rot[1] = y; tempObject.position.rot[1] = y;
tempObject.position.rot[2] = z; tempObject.position.rot[2] = z;
} }
void ObjectFunctions::SetObjectActivatingPid(unsigned short pid) noexcept extern "C" void ObjectFunctions::SetObjectActivatingPid(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -408,35 +408,35 @@ void ObjectFunctions::SetObjectActivatingPid(unsigned short pid) noexcept
tempObject.activatingActor.isPlayer = true; tempObject.activatingActor.isPlayer = true;
} }
void ObjectFunctions::SetObjectDoorState(int doorState) noexcept extern "C" void ObjectFunctions::SetObjectDoorState(int doorState) noexcept
{ {
tempObject.doorState = doorState; tempObject.doorState = doorState;
} }
void ObjectFunctions::SetObjectDoorTeleportState(bool teleportState) noexcept extern "C" void ObjectFunctions::SetObjectDoorTeleportState(bool teleportState) noexcept
{ {
tempObject.teleportState = teleportState; tempObject.teleportState = teleportState;
} }
void ObjectFunctions::SetObjectDoorDestinationCell(const char* cellDescription) noexcept extern "C" void ObjectFunctions::SetObjectDoorDestinationCell(const char* cellDescription) noexcept
{ {
tempObject.destinationCell = Utils::getCellFromDescription(cellDescription); tempObject.destinationCell = Utils::getCellFromDescription(cellDescription);
} }
void ObjectFunctions::SetObjectDoorDestinationPosition(double x, double y, double z) noexcept extern "C" void ObjectFunctions::SetObjectDoorDestinationPosition(double x, double y, double z) noexcept
{ {
tempObject.destinationPosition.pos[0] = x; tempObject.destinationPosition.pos[0] = x;
tempObject.destinationPosition.pos[1] = y; tempObject.destinationPosition.pos[1] = y;
tempObject.destinationPosition.pos[2] = z; tempObject.destinationPosition.pos[2] = z;
} }
void ObjectFunctions::SetObjectDoorDestinationRotation(double x, double z) noexcept extern "C" void ObjectFunctions::SetObjectDoorDestinationRotation(double x, double z) noexcept
{ {
tempObject.destinationPosition.rot[0] = x; tempObject.destinationPosition.rot[0] = x;
tempObject.destinationPosition.rot[2] = z; tempObject.destinationPosition.rot[2] = z;
} }
void ObjectFunctions::SetPlayerAsObject(unsigned short pid) noexcept extern "C" void ObjectFunctions::SetPlayerAsObject(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -445,37 +445,37 @@ void ObjectFunctions::SetPlayerAsObject(unsigned short pid) noexcept
tempObject.isPlayer = true; tempObject.isPlayer = true;
} }
void ObjectFunctions::SetContainerItemRefId(const char* refId) noexcept extern "C" void ObjectFunctions::SetContainerItemRefId(const char* refId) noexcept
{ {
tempContainerItem.refId = refId; tempContainerItem.refId = refId;
} }
void ObjectFunctions::SetContainerItemCount(int count) noexcept extern "C" void ObjectFunctions::SetContainerItemCount(int count) noexcept
{ {
tempContainerItem.count = count; tempContainerItem.count = count;
} }
void ObjectFunctions::SetContainerItemCharge(int charge) noexcept extern "C" void ObjectFunctions::SetContainerItemCharge(int charge) noexcept
{ {
tempContainerItem.charge = charge; tempContainerItem.charge = charge;
} }
void ObjectFunctions::SetContainerItemEnchantmentCharge(double enchantmentCharge) noexcept extern "C" void ObjectFunctions::SetContainerItemEnchantmentCharge(double enchantmentCharge) noexcept
{ {
tempContainerItem.enchantmentCharge = enchantmentCharge; tempContainerItem.enchantmentCharge = enchantmentCharge;
} }
void ObjectFunctions::SetContainerItemSoul(const char* soul) noexcept extern "C" void ObjectFunctions::SetContainerItemSoul(const char* soul) noexcept
{ {
tempContainerItem.soul = soul; tempContainerItem.soul = soul;
} }
void ObjectFunctions::SetContainerItemActionCountByIndex(unsigned int objectIndex, unsigned int itemIndex, int actionCount) noexcept extern "C" void ObjectFunctions::SetContainerItemActionCountByIndex(unsigned int objectIndex, unsigned int itemIndex, int actionCount) noexcept
{ {
writeObjectList.baseObjects.at(objectIndex).containerItems.at(itemIndex).actionCount = actionCount; writeObjectList.baseObjects.at(objectIndex).containerItems.at(itemIndex).actionCount = actionCount;
} }
void ObjectFunctions::AddObject() noexcept extern "C" void ObjectFunctions::AddObject() noexcept
{ {
tempObject.droppedByPlayer = false; tempObject.droppedByPlayer = false;
writeObjectList.baseObjects.push_back(tempObject); writeObjectList.baseObjects.push_back(tempObject);
@ -483,14 +483,14 @@ void ObjectFunctions::AddObject() noexcept
tempObject = emptyObject; tempObject = emptyObject;
} }
void ObjectFunctions::AddContainerItem() noexcept extern "C" void ObjectFunctions::AddContainerItem() noexcept
{ {
tempObject.containerItems.push_back(tempContainerItem); tempObject.containerItems.push_back(tempContainerItem);
tempContainerItem = emptyContainerItem; tempContainerItem = emptyContainerItem;
} }
void ObjectFunctions::SendObjectActivate(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept extern "C" void ObjectFunctions::SendObjectActivate(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept
{ {
mwmp::ObjectPacket *packet = mwmp::Networking::get().getObjectPacketController()->GetPacket(ID_OBJECT_ACTIVATE); mwmp::ObjectPacket *packet = mwmp::Networking::get().getObjectPacketController()->GetPacket(ID_OBJECT_ACTIVATE);
packet->setObjectList(&writeObjectList); packet->setObjectList(&writeObjectList);
@ -501,7 +501,7 @@ void ObjectFunctions::SendObjectActivate(bool sendToOtherPlayers, bool skipAttac
packet->Send(true); packet->Send(true);
} }
void ObjectFunctions::SendObjectPlace(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept extern "C" void ObjectFunctions::SendObjectPlace(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept
{ {
mwmp::ObjectPacket *packet = mwmp::Networking::get().getObjectPacketController()->GetPacket(ID_OBJECT_PLACE); mwmp::ObjectPacket *packet = mwmp::Networking::get().getObjectPacketController()->GetPacket(ID_OBJECT_PLACE);
packet->setObjectList(&writeObjectList); packet->setObjectList(&writeObjectList);
@ -512,7 +512,7 @@ void ObjectFunctions::SendObjectPlace(bool sendToOtherPlayers, bool skipAttached
packet->Send(true); packet->Send(true);
} }
void ObjectFunctions::SendObjectSpawn(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept extern "C" void ObjectFunctions::SendObjectSpawn(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept
{ {
mwmp::ObjectPacket *packet = mwmp::Networking::get().getObjectPacketController()->GetPacket(ID_OBJECT_SPAWN); mwmp::ObjectPacket *packet = mwmp::Networking::get().getObjectPacketController()->GetPacket(ID_OBJECT_SPAWN);
packet->setObjectList(&writeObjectList); packet->setObjectList(&writeObjectList);
@ -523,7 +523,7 @@ void ObjectFunctions::SendObjectSpawn(bool sendToOtherPlayers, bool skipAttached
packet->Send(true); packet->Send(true);
} }
void ObjectFunctions::SendObjectDelete(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept extern "C" void ObjectFunctions::SendObjectDelete(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept
{ {
mwmp::ObjectPacket *packet = mwmp::Networking::get().getObjectPacketController()->GetPacket(ID_OBJECT_DELETE); mwmp::ObjectPacket *packet = mwmp::Networking::get().getObjectPacketController()->GetPacket(ID_OBJECT_DELETE);
packet->setObjectList(&writeObjectList); packet->setObjectList(&writeObjectList);
@ -534,7 +534,7 @@ void ObjectFunctions::SendObjectDelete(bool sendToOtherPlayers, bool skipAttache
packet->Send(true); packet->Send(true);
} }
void ObjectFunctions::SendObjectLock(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept extern "C" void ObjectFunctions::SendObjectLock(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept
{ {
mwmp::ObjectPacket *packet = mwmp::Networking::get().getObjectPacketController()->GetPacket(ID_OBJECT_LOCK); mwmp::ObjectPacket *packet = mwmp::Networking::get().getObjectPacketController()->GetPacket(ID_OBJECT_LOCK);
packet->setObjectList(&writeObjectList); packet->setObjectList(&writeObjectList);
@ -545,7 +545,7 @@ void ObjectFunctions::SendObjectLock(bool sendToOtherPlayers, bool skipAttachedP
packet->Send(true); packet->Send(true);
} }
void ObjectFunctions::SendObjectTrap(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept extern "C" void ObjectFunctions::SendObjectTrap(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept
{ {
mwmp::ObjectPacket *packet = mwmp::Networking::get().getObjectPacketController()->GetPacket(ID_OBJECT_TRAP); mwmp::ObjectPacket *packet = mwmp::Networking::get().getObjectPacketController()->GetPacket(ID_OBJECT_TRAP);
packet->setObjectList(&writeObjectList); packet->setObjectList(&writeObjectList);
@ -556,7 +556,7 @@ void ObjectFunctions::SendObjectTrap(bool sendToOtherPlayers, bool skipAttachedP
packet->Send(true); packet->Send(true);
} }
void ObjectFunctions::SendObjectScale(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept extern "C" void ObjectFunctions::SendObjectScale(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept
{ {
mwmp::ObjectPacket *packet = mwmp::Networking::get().getObjectPacketController()->GetPacket(ID_OBJECT_SCALE); mwmp::ObjectPacket *packet = mwmp::Networking::get().getObjectPacketController()->GetPacket(ID_OBJECT_SCALE);
packet->setObjectList(&writeObjectList); packet->setObjectList(&writeObjectList);
@ -567,7 +567,7 @@ void ObjectFunctions::SendObjectScale(bool sendToOtherPlayers, bool skipAttached
packet->Send(true); packet->Send(true);
} }
void ObjectFunctions::SendObjectState(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept extern "C" void ObjectFunctions::SendObjectState(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept
{ {
mwmp::ObjectPacket *packet = mwmp::Networking::get().getObjectPacketController()->GetPacket(ID_OBJECT_STATE); mwmp::ObjectPacket *packet = mwmp::Networking::get().getObjectPacketController()->GetPacket(ID_OBJECT_STATE);
packet->setObjectList(&writeObjectList); packet->setObjectList(&writeObjectList);
@ -578,7 +578,7 @@ void ObjectFunctions::SendObjectState(bool sendToOtherPlayers, bool skipAttached
packet->Send(true); packet->Send(true);
} }
void ObjectFunctions::SendDoorState(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept extern "C" void ObjectFunctions::SendDoorState(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept
{ {
mwmp::ObjectPacket *packet = mwmp::Networking::get().getObjectPacketController()->GetPacket(ID_DOOR_STATE); mwmp::ObjectPacket *packet = mwmp::Networking::get().getObjectPacketController()->GetPacket(ID_DOOR_STATE);
packet->setObjectList(&writeObjectList); packet->setObjectList(&writeObjectList);
@ -589,7 +589,7 @@ void ObjectFunctions::SendDoorState(bool sendToOtherPlayers, bool skipAttachedPl
packet->Send(true); packet->Send(true);
} }
void ObjectFunctions::SendDoorDestination(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept extern "C" void ObjectFunctions::SendDoorDestination(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept
{ {
mwmp::ObjectPacket *packet = mwmp::Networking::get().getObjectPacketController()->GetPacket(ID_DOOR_DESTINATION); mwmp::ObjectPacket *packet = mwmp::Networking::get().getObjectPacketController()->GetPacket(ID_DOOR_DESTINATION);
packet->setObjectList(&writeObjectList); packet->setObjectList(&writeObjectList);
@ -600,7 +600,7 @@ void ObjectFunctions::SendDoorDestination(bool sendToOtherPlayers, bool skipAtta
packet->Send(true); packet->Send(true);
} }
void ObjectFunctions::SendContainer(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept extern "C" void ObjectFunctions::SendContainer(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept
{ {
mwmp::ObjectPacket *packet = mwmp::Networking::get().getObjectPacketController()->GetPacket(ID_CONTAINER); mwmp::ObjectPacket *packet = mwmp::Networking::get().getObjectPacketController()->GetPacket(ID_CONTAINER);
packet->setObjectList(&writeObjectList); packet->setObjectList(&writeObjectList);
@ -611,7 +611,7 @@ void ObjectFunctions::SendContainer(bool sendToOtherPlayers, bool skipAttachedPl
packet->Send(true); packet->Send(true);
} }
void ObjectFunctions::SendVideoPlay(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept extern "C" void ObjectFunctions::SendVideoPlay(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept
{ {
mwmp::ObjectPacket *packet = mwmp::Networking::get().getObjectPacketController()->GetPacket(ID_VIDEO_PLAY); mwmp::ObjectPacket *packet = mwmp::Networking::get().getObjectPacketController()->GetPacket(ID_VIDEO_PLAY);
packet->setObjectList(&writeObjectList); packet->setObjectList(&writeObjectList);
@ -622,7 +622,7 @@ void ObjectFunctions::SendVideoPlay(bool sendToOtherPlayers, bool skipAttachedPl
packet->Send(true); packet->Send(true);
} }
void ObjectFunctions::SendConsoleCommand(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept extern "C" void ObjectFunctions::SendConsoleCommand(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept
{ {
mwmp::ObjectPacket *packet = mwmp::Networking::get().getObjectPacketController()->GetPacket(ID_CONSOLE_COMMAND); mwmp::ObjectPacket *packet = mwmp::Networking::get().getObjectPacketController()->GetPacket(ID_CONSOLE_COMMAND);
packet->setObjectList(&writeObjectList); packet->setObjectList(&writeObjectList);
@ -633,7 +633,7 @@ void ObjectFunctions::SendConsoleCommand(bool sendToOtherPlayers, bool skipAttac
packet->Send(true); packet->Send(true);
} }
extern "C"
// All methods below are deprecated versions of methods from above // All methods below are deprecated versions of methods from above
void ObjectFunctions::ReadLastObjectList() noexcept void ObjectFunctions::ReadLastObjectList() noexcept
@ -641,73 +641,73 @@ void ObjectFunctions::ReadLastObjectList() noexcept
ReadReceivedObjectList(); ReadReceivedObjectList();
} }
void ObjectFunctions::ReadLastEvent() noexcept extern "C" void ObjectFunctions::ReadLastEvent() noexcept
{ {
ReadReceivedObjectList(); ReadReceivedObjectList();
} }
void ObjectFunctions::InitializeObjectList(unsigned short pid) noexcept extern "C" void ObjectFunctions::InitializeObjectList(unsigned short pid) noexcept
{ {
ClearObjectList(); ClearObjectList();
SetObjectListPid(pid); SetObjectListPid(pid);
} }
void ObjectFunctions::InitializeEvent(unsigned short pid) noexcept extern "C" void ObjectFunctions::InitializeEvent(unsigned short pid) noexcept
{ {
InitializeObjectList(pid); InitializeObjectList(pid);
} }
void ObjectFunctions::CopyLastObjectListToStore() noexcept extern "C" void ObjectFunctions::CopyLastObjectListToStore() noexcept
{ {
CopyReceivedObjectListToStore(); CopyReceivedObjectListToStore();
} }
unsigned int ObjectFunctions::GetObjectChangesSize() noexcept extern "C" unsigned int ObjectFunctions::GetObjectChangesSize() noexcept
{ {
return GetObjectListSize(); return GetObjectListSize();
} }
unsigned char ObjectFunctions::GetEventAction() noexcept extern "C" unsigned char ObjectFunctions::GetEventAction() noexcept
{ {
return GetObjectListAction(); return GetObjectListAction();
} }
unsigned char ObjectFunctions::GetEventContainerSubAction() noexcept extern "C" unsigned char ObjectFunctions::GetEventContainerSubAction() noexcept
{ {
return GetObjectListContainerSubAction(); return GetObjectListContainerSubAction();
} }
unsigned int ObjectFunctions::GetObjectRefNumIndex(unsigned int index) noexcept extern "C" unsigned int ObjectFunctions::GetObjectRefNumIndex(unsigned int index) noexcept
{ {
return GetObjectRefNum(index); return GetObjectRefNum(index);
} }
unsigned int ObjectFunctions::GetObjectSummonerRefNumIndex(unsigned int index) noexcept extern "C" unsigned int ObjectFunctions::GetObjectSummonerRefNumIndex(unsigned int index) noexcept
{ {
return GetObjectSummonerRefNum(index); return GetObjectSummonerRefNum(index);
} }
void ObjectFunctions::SetEventCell(const char* cellDescription) noexcept extern "C" void ObjectFunctions::SetEventCell(const char* cellDescription) noexcept
{ {
SetObjectListCell(cellDescription); SetObjectListCell(cellDescription);
} }
void ObjectFunctions::SetEventAction(unsigned char action) noexcept extern "C" void ObjectFunctions::SetEventAction(unsigned char action) noexcept
{ {
SetObjectListAction(action); SetObjectListAction(action);
} }
void ObjectFunctions::SetEventConsoleCommand(const char* consoleCommand) noexcept extern "C" void ObjectFunctions::SetEventConsoleCommand(const char* consoleCommand) noexcept
{ {
SetObjectListConsoleCommand(consoleCommand); SetObjectListConsoleCommand(consoleCommand);
} }
void ObjectFunctions::SetObjectRefNumIndex(int refNum) noexcept extern "C" void ObjectFunctions::SetObjectRefNumIndex(int refNum) noexcept
{ {
SetObjectRefNum(refNum); SetObjectRefNum(refNum);
} }
void ObjectFunctions::AddWorldObject() noexcept extern "C" void ObjectFunctions::AddWorldObject() noexcept
{ {
AddObject(); AddObject();
} }

View file

@ -1,6 +1,8 @@
#ifndef OPENMW_OBJECTAPI_HPP #ifndef OPENMW_OBJECTAPI_HPP
#define OPENMW_OBJECTAPI_HPP #define OPENMW_OBJECTAPI_HPP
#include <Script/Platform.hpp>
#define OBJECTAPI \ #define OBJECTAPI \
{"ReadReceivedObjectList", ObjectFunctions::ReadReceivedObjectList},\ {"ReadReceivedObjectList", ObjectFunctions::ReadReceivedObjectList},\
\ \
@ -136,23 +138,21 @@
{"SetObjectRefNumIndex", ObjectFunctions::SetObjectRefNumIndex},\ {"SetObjectRefNumIndex", ObjectFunctions::SetObjectRefNumIndex},\
{"AddWorldObject", ObjectFunctions::AddWorldObject} {"AddWorldObject", ObjectFunctions::AddWorldObject}
class ObjectFunctions namespace ObjectFunctions
{ {
public:
/** /**
* \brief Use the last object list received by the server as the one being read. * \brief Use the last object list received by the server as the one being read.
* *
* \return void * \return void
*/ */
static void ReadReceivedObjectList() noexcept; EXPORT_APIFUNCTION void CDECL ReadReceivedObjectList() noexcept;
/** /**
* \brief Clear the data from the object list stored on the server. * \brief Clear the data from the object list stored on the server.
* *
* \return void * \return void
*/ */
static void ClearObjectList() noexcept; EXPORT_APIFUNCTION void CDECL ClearObjectList() noexcept;
/** /**
* \brief Set the pid attached to the ObjectList. * \brief Set the pid attached to the ObjectList.
@ -160,7 +160,7 @@ public:
* \param pid The player ID to whom the object list should be attached. * \param pid The player ID to whom the object list should be attached.
* \return void * \return void
*/ */
static void SetObjectListPid(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL SetObjectListPid(unsigned short pid) noexcept;
/** /**
* \brief Take the contents of the read-only object list last received by the * \brief Take the contents of the read-only object list last received by the
@ -169,14 +169,14 @@ public:
* *
* \return void * \return void
*/ */
static void CopyReceivedObjectListToStore() noexcept; EXPORT_APIFUNCTION void CDECL CopyReceivedObjectListToStore() noexcept;
/** /**
* \brief Get the number of indexes in the read object list. * \brief Get the number of indexes in the read object list.
* *
* \return The number of indexes. * \return The number of indexes.
*/ */
static unsigned int GetObjectListSize() noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetObjectListSize() noexcept;
/** /**
* \brief Get the origin of the read object list. * \brief Get the origin of the read object list.
@ -185,7 +185,7 @@ public:
* CLIENT_DIALOGUE, 3 for CLIENT_SCRIPT_LOCAL, 4 for CLIENT_SCRIPT_GLOBAL, * CLIENT_DIALOGUE, 3 for CLIENT_SCRIPT_LOCAL, 4 for CLIENT_SCRIPT_GLOBAL,
* 5 for SERVER_SCRIPT). * 5 for SERVER_SCRIPT).
*/ */
static unsigned char GetObjectListOrigin() noexcept; EXPORT_APIFUNCTION unsigned char CDECL GetObjectListOrigin() noexcept;
/** /**
* \brief Get the client script that the read object list originated from. * \brief Get the client script that the read object list originated from.
@ -194,21 +194,21 @@ public:
* *
* \return The ID of the client script. * \return The ID of the client script.
*/ */
static const char *GetObjectListClientScript() noexcept; EXPORT_APIFUNCTION const char *CDECL GetObjectListClientScript() noexcept;
/** /**
* \brief Get the action type used in the read object list. * \brief Get the action type used in the read object list.
* *
* \return The action type (0 for SET, 1 for ADD, 2 for REMOVE, 3 for REQUEST). * \return The action type (0 for SET, 1 for ADD, 2 for REMOVE, 3 for REQUEST).
*/ */
static unsigned char GetObjectListAction() noexcept; EXPORT_APIFUNCTION unsigned char CDECL GetObjectListAction() noexcept;
/** /**
* \brief Get the container subaction type used in the read object list. * \brief Get the container subaction type used in the read object list.
* *
* \return The action type (0 for NONE, 1 for DRAG, 2 for DROP, 3 for TAKE_ALL). * \return The action type (0 for NONE, 1 for DRAG, 2 for DROP, 3 for TAKE_ALL).
*/ */
static unsigned char GetObjectListContainerSubAction() noexcept; EXPORT_APIFUNCTION unsigned char CDECL GetObjectListContainerSubAction() noexcept;
/** /**
* \brief Check whether the object at a certain index in the read object list is a * \brief Check whether the object at a certain index in the read object list is a
@ -221,7 +221,7 @@ public:
* \param index The index of the object. * \param index The index of the object.
* \return Whether the object is a player. * \return Whether the object is a player.
*/ */
static bool IsObjectPlayer(unsigned int index) noexcept; EXPORT_APIFUNCTION bool CDECL IsObjectPlayer(unsigned int index) noexcept;
/** /**
* \brief Get the player ID of the object at a certain index in the read object list, * \brief Get the player ID of the object at a certain index in the read object list,
@ -233,7 +233,7 @@ public:
* \param index The index of the object. * \param index The index of the object.
* \return The player ID of the object. * \return The player ID of the object.
*/ */
static int GetObjectPid(unsigned int index) noexcept; EXPORT_APIFUNCTION int CDECL GetObjectPid(unsigned int index) noexcept;
/** /**
* \brief Get the refId of the object at a certain index in the read object list. * \brief Get the refId of the object at a certain index in the read object list.
@ -241,7 +241,7 @@ public:
* \param index The index of the object. * \param index The index of the object.
* \return The refId. * \return The refId.
*/ */
static const char *GetObjectRefId(unsigned int index) noexcept; EXPORT_APIFUNCTION const char *CDECL GetObjectRefId(unsigned int index) noexcept;
/** /**
* \brief Get the refNum of the object at a certain index in the read object list. * \brief Get the refNum of the object at a certain index in the read object list.
@ -249,7 +249,7 @@ public:
* \param index The index of the object. * \param index The index of the object.
* \return The refNum. * \return The refNum.
*/ */
static unsigned int GetObjectRefNum(unsigned int index) noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetObjectRefNum(unsigned int index) noexcept;
/** /**
* \brief Get the mpNum of the object at a certain index in the read object list. * \brief Get the mpNum of the object at a certain index in the read object list.
@ -257,7 +257,7 @@ public:
* \param index The index of the object. * \param index The index of the object.
* \return The mpNum. * \return The mpNum.
*/ */
static unsigned int GetObjectMpNum(unsigned int index) noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetObjectMpNum(unsigned int index) noexcept;
/** /**
* \brief Get the count of the object at a certain index in the read object list. * \brief Get the count of the object at a certain index in the read object list.
@ -265,7 +265,7 @@ public:
* \param index The index of the object. * \param index The index of the object.
* \return The object count. * \return The object count.
*/ */
static int GetObjectCount(unsigned int index) noexcept; EXPORT_APIFUNCTION int CDECL GetObjectCount(unsigned int index) noexcept;
/** /**
* \brief Get the charge of the object at a certain index in the read object list. * \brief Get the charge of the object at a certain index in the read object list.
@ -273,7 +273,7 @@ public:
* \param index The index of the object. * \param index The index of the object.
* \return The charge. * \return The charge.
*/ */
static int GetObjectCharge(unsigned int index) noexcept; EXPORT_APIFUNCTION int CDECL GetObjectCharge(unsigned int index) noexcept;
/** /**
* \brief Get the enchantment charge of the object at a certain index in the read object list. * \brief Get the enchantment charge of the object at a certain index in the read object list.
@ -281,7 +281,7 @@ public:
* \param index The index of the object. * \param index The index of the object.
* \return The enchantment charge. * \return The enchantment charge.
*/ */
static double GetObjectEnchantmentCharge(unsigned int index) noexcept; EXPORT_APIFUNCTION double CDECL GetObjectEnchantmentCharge(unsigned int index) noexcept;
/** /**
* \brief Get the soul of the object at a certain index in the read object list. * \brief Get the soul of the object at a certain index in the read object list.
@ -289,7 +289,7 @@ public:
* \param index The index of the object. * \param index The index of the object.
* \return The soul. * \return The soul.
*/ */
static const char *GetObjectSoul(unsigned int index) noexcept; EXPORT_APIFUNCTION const char *CDECL GetObjectSoul(unsigned int index) noexcept;
/** /**
* \brief Get the gold value of the object at a certain index in the read object list. * \brief Get the gold value of the object at a certain index in the read object list.
@ -299,7 +299,7 @@ public:
* \param index The index of the object. * \param index The index of the object.
* \return The gold value. * \return The gold value.
*/ */
static int GetObjectGoldValue(unsigned int index) noexcept; EXPORT_APIFUNCTION int CDECL GetObjectGoldValue(unsigned int index) noexcept;
/** /**
* \brief Get the object scale of the object at a certain index in the read object list. * \brief Get the object scale of the object at a certain index in the read object list.
@ -307,7 +307,7 @@ public:
* \param index The index of the object. * \param index The index of the object.
* \return The object scale. * \return The object scale.
*/ */
static double GetObjectScale(unsigned int index) noexcept; EXPORT_APIFUNCTION double CDECL GetObjectScale(unsigned int index) noexcept;
/** /**
* \brief Get the object state of the object at a certain index in the read object list. * \brief Get the object state of the object at a certain index in the read object list.
@ -315,7 +315,7 @@ public:
* \param index The index of the object. * \param index The index of the object.
* \return The object state. * \return The object state.
*/ */
static bool GetObjectState(unsigned int index) noexcept; EXPORT_APIFUNCTION bool CDECL GetObjectState(unsigned int index) noexcept;
/** /**
* \brief Get the door state of the object at a certain index in the read object list. * \brief Get the door state of the object at a certain index in the read object list.
@ -323,7 +323,7 @@ public:
* \param index The index of the object. * \param index The index of the object.
* \return The door state. * \return The door state.
*/ */
static int GetObjectDoorState(unsigned int index) noexcept; EXPORT_APIFUNCTION int CDECL GetObjectDoorState(unsigned int index) noexcept;
/** /**
* \brief Get the lock level of the object at a certain index in the read object list. * \brief Get the lock level of the object at a certain index in the read object list.
@ -331,7 +331,7 @@ public:
* \param index The index of the object. * \param index The index of the object.
* \return The lock level. * \return The lock level.
*/ */
static int GetObjectLockLevel(unsigned int index) noexcept; EXPORT_APIFUNCTION int CDECL GetObjectLockLevel(unsigned int index) noexcept;
/** /**
* \brief Check whether the object at a certain index in the read object list has been * \brief Check whether the object at a certain index in the read object list has been
@ -340,7 +340,7 @@ public:
* \param index The index of the object. * \param index The index of the object.
* \return Whether the object has been activated by a player. * \return Whether the object has been activated by a player.
*/ */
static bool DoesObjectHavePlayerActivating(unsigned int index) noexcept; EXPORT_APIFUNCTION bool CDECL DoesObjectHavePlayerActivating(unsigned int index) noexcept;
/** /**
* \brief Get the player ID of the player activating the object at a certain index in the * \brief Get the player ID of the player activating the object at a certain index in the
@ -349,7 +349,7 @@ public:
* \param index The index of the object. * \param index The index of the object.
* \return The player ID of the activating player. * \return The player ID of the activating player.
*/ */
static int GetObjectActivatingPid(unsigned int index) noexcept; EXPORT_APIFUNCTION int CDECL GetObjectActivatingPid(unsigned int index) noexcept;
/** /**
* \brief Get the refId of the actor activating the object at a certain index in the read * \brief Get the refId of the actor activating the object at a certain index in the read
@ -358,7 +358,7 @@ public:
* \param index The index of the object. * \param index The index of the object.
* \return The refId of the activating actor. * \return The refId of the activating actor.
*/ */
static const char *GetObjectActivatingRefId(unsigned int index) noexcept; EXPORT_APIFUNCTION const char *CDECL GetObjectActivatingRefId(unsigned int index) noexcept;
/** /**
* \brief Get the refNum of the actor activating the object at a certain index in the read * \brief Get the refNum of the actor activating the object at a certain index in the read
@ -367,7 +367,7 @@ public:
* \param index The index of the object. * \param index The index of the object.
* \return The refNum of the activating actor. * \return The refNum of the activating actor.
*/ */
static unsigned int GetObjectActivatingRefNum(unsigned int index) noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetObjectActivatingRefNum(unsigned int index) noexcept;
/** /**
* \brief Get the mpNum of the actor activating the object at a certain index in the read * \brief Get the mpNum of the actor activating the object at a certain index in the read
@ -376,7 +376,7 @@ public:
* \param index The index of the object. * \param index The index of the object.
* \return The mpNum of the activating actor. * \return The mpNum of the activating actor.
*/ */
static unsigned int GetObjectActivatingMpNum(unsigned int index) noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetObjectActivatingMpNum(unsigned int index) noexcept;
/** /**
* \brief Get the name of the actor activating the object at a certain index in the read * \brief Get the name of the actor activating the object at a certain index in the read
@ -385,7 +385,7 @@ public:
* \param index The index of the object. * \param index The index of the object.
* \return The name of the activating actor. * \return The name of the activating actor.
*/ */
static const char *GetObjectActivatingName(unsigned int index) noexcept; EXPORT_APIFUNCTION const char *CDECL GetObjectActivatingName(unsigned int index) noexcept;
/** /**
* \brief Check whether the object at a certain index in the read object list is a * \brief Check whether the object at a certain index in the read object list is a
@ -395,7 +395,7 @@ public:
* *
* \return The summon state. * \return The summon state.
*/ */
static bool GetObjectSummonState(unsigned int index) noexcept; EXPORT_APIFUNCTION bool CDECL GetObjectSummonState(unsigned int index) noexcept;
/** /**
* \brief Get the summon duration of the object at a certain index in the read object list. * \brief Get the summon duration of the object at a certain index in the read object list.
@ -405,7 +405,7 @@ public:
* \param index The index of the object. * \param index The index of the object.
* \return The summon duration. * \return The summon duration.
*/ */
static double GetObjectSummonDuration(unsigned int index) noexcept; EXPORT_APIFUNCTION double CDECL GetObjectSummonDuration(unsigned int index) noexcept;
/** /**
* \brief Check whether the object at a certain index in the read object list has a player * \brief Check whether the object at a certain index in the read object list has a player
@ -416,7 +416,7 @@ public:
* \param index The index of the object. * \param index The index of the object.
* \return Whether a player is the summoner of the object. * \return Whether a player is the summoner of the object.
*/ */
static bool DoesObjectHavePlayerSummoner(unsigned int index) noexcept; EXPORT_APIFUNCTION bool CDECL DoesObjectHavePlayerSummoner(unsigned int index) noexcept;
/** /**
* \brief Get the player ID of the summoner of the object at a certain index in the read object * \brief Get the player ID of the summoner of the object at a certain index in the read object
@ -425,7 +425,7 @@ public:
* \param index The index of the object. * \param index The index of the object.
* \return The player ID of the summoner. * \return The player ID of the summoner.
*/ */
static int GetObjectSummonerPid(unsigned int index) noexcept; EXPORT_APIFUNCTION int CDECL GetObjectSummonerPid(unsigned int index) noexcept;
/** /**
* \brief Get the refId of the actor summoner of the object at a certain index in the read object * \brief Get the refId of the actor summoner of the object at a certain index in the read object
@ -434,7 +434,7 @@ public:
* \param index The index of the object. * \param index The index of the object.
* \return The refId of the summoner. * \return The refId of the summoner.
*/ */
static const char *GetObjectSummonerRefId(unsigned int index) noexcept; EXPORT_APIFUNCTION const char *CDECL GetObjectSummonerRefId(unsigned int index) noexcept;
/** /**
* \brief Get the refNum of the actor summoner of the object at a certain index in the read object * \brief Get the refNum of the actor summoner of the object at a certain index in the read object
@ -443,7 +443,7 @@ public:
* \param index The index of the object. * \param index The index of the object.
* \return The refNum of the summoner. * \return The refNum of the summoner.
*/ */
static unsigned int GetObjectSummonerRefNum(unsigned int index) noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetObjectSummonerRefNum(unsigned int index) noexcept;
/** /**
* \brief Get the mpNum of the actor summoner of the object at a certain index in the read object list. * \brief Get the mpNum of the actor summoner of the object at a certain index in the read object list.
@ -451,7 +451,7 @@ public:
* \param index The index of the object. * \param index The index of the object.
* \return The mpNum of the summoner. * \return The mpNum of the summoner.
*/ */
static unsigned int GetObjectSummonerMpNum(unsigned int index) noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetObjectSummonerMpNum(unsigned int index) noexcept;
/** /**
* \brief Get the X position of the object at a certain index in the read object list. * \brief Get the X position of the object at a certain index in the read object list.
@ -459,7 +459,7 @@ public:
* \param index The index of the object. * \param index The index of the object.
* \return The X position. * \return The X position.
*/ */
static double GetObjectPosX(unsigned int index) noexcept; EXPORT_APIFUNCTION double CDECL GetObjectPosX(unsigned int index) noexcept;
/** /**
* \brief Get the Y position of the object at a certain index in the read object list. * \brief Get the Y position of the object at a certain index in the read object list.
@ -467,7 +467,7 @@ public:
* \param index The index of the object. * \param index The index of the object.
* \return The Y position. * \return The Y position.
*/ */
static double GetObjectPosY(unsigned int index) noexcept; EXPORT_APIFUNCTION double CDECL GetObjectPosY(unsigned int index) noexcept;
/** /**
* \brief Get the Z position at a certain index in the read object list. * \brief Get the Z position at a certain index in the read object list.
@ -475,7 +475,7 @@ public:
* \param index The index of the object. * \param index The index of the object.
* \return The Z position. * \return The Z position.
*/ */
static double GetObjectPosZ(unsigned int index) noexcept; EXPORT_APIFUNCTION double CDECL GetObjectPosZ(unsigned int index) noexcept;
/** /**
* \brief Get the X rotation of the object at a certain index in the read object list. * \brief Get the X rotation of the object at a certain index in the read object list.
@ -483,7 +483,7 @@ public:
* \param index The index of the object. * \param index The index of the object.
* \return The X rotation. * \return The X rotation.
*/ */
static double GetObjectRotX(unsigned int index) noexcept; EXPORT_APIFUNCTION double CDECL GetObjectRotX(unsigned int index) noexcept;
/** /**
* \brief Get the Y rotation of the object at a certain index in the read object list. * \brief Get the Y rotation of the object at a certain index in the read object list.
@ -491,7 +491,7 @@ public:
* \param index The index of the object. * \param index The index of the object.
* \return The Y rotation. * \return The Y rotation.
*/ */
static double GetObjectRotY(unsigned int index) noexcept; EXPORT_APIFUNCTION double CDECL GetObjectRotY(unsigned int index) noexcept;
/** /**
* \brief Get the Z rotation of the object at a certain index in the read object list. * \brief Get the Z rotation of the object at a certain index in the read object list.
@ -499,14 +499,14 @@ public:
* \param index The index of the object. * \param index The index of the object.
* \return The Z rotation. * \return The Z rotation.
*/ */
static double GetObjectRotZ(unsigned int index) noexcept; EXPORT_APIFUNCTION double CDECL GetObjectRotZ(unsigned int index) noexcept;
/** /**
* \brief Get the videoFilename of the object at a certain index in the read object list. * \brief Get the videoFilename of the object at a certain index in the read object list.
* *
* \return The videoFilename. * \return The videoFilename.
*/ */
static const char *GetVideoFilename(unsigned int index) noexcept; EXPORT_APIFUNCTION const char *CDECL GetVideoFilename(unsigned int index) noexcept;
/** /**
* \brief Get the number of container item indexes of the object at a certain index in the * \brief Get the number of container item indexes of the object at a certain index in the
@ -515,7 +515,7 @@ public:
* \param index The index of the object. * \param index The index of the object.
* \return The number of container item indexes. * \return The number of container item indexes.
*/ */
static unsigned int GetContainerChangesSize(unsigned int objectIndex) noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetContainerChangesSize(unsigned int objectIndex) noexcept;
/** /**
* \brief Get the refId of the container item at a certain itemIndex in the container changes * \brief Get the refId of the container item at a certain itemIndex in the container changes
@ -525,7 +525,7 @@ public:
* \param itemIndex The index of the container item. * \param itemIndex The index of the container item.
* \return The refId. * \return The refId.
*/ */
static const char *GetContainerItemRefId(unsigned int objectIndex, unsigned int itemIndex) noexcept; EXPORT_APIFUNCTION const char *CDECL GetContainerItemRefId(unsigned int objectIndex, unsigned int itemIndex) noexcept;
/** /**
* \brief Get the item count of the container item at a certain itemIndex in the container * \brief Get the item count of the container item at a certain itemIndex in the container
@ -535,7 +535,7 @@ public:
* \param itemIndex The index of the container item. * \param itemIndex The index of the container item.
* \return The item count. * \return The item count.
*/ */
static int GetContainerItemCount(unsigned int objectIndex, unsigned int itemIndex) noexcept; EXPORT_APIFUNCTION int CDECL GetContainerItemCount(unsigned int objectIndex, unsigned int itemIndex) noexcept;
/** /**
* \brief Get the charge of the container item at a certain itemIndex in the container changes * \brief Get the charge of the container item at a certain itemIndex in the container changes
@ -545,7 +545,7 @@ public:
* \param itemIndex The index of the container item. * \param itemIndex The index of the container item.
* \return The charge. * \return The charge.
*/ */
static int GetContainerItemCharge(unsigned int objectIndex, unsigned int itemIndex) noexcept; EXPORT_APIFUNCTION int CDECL GetContainerItemCharge(unsigned int objectIndex, unsigned int itemIndex) noexcept;
/** /**
* \brief Get the enchantment charge of the container item at a certain itemIndex in the container changes * \brief Get the enchantment charge of the container item at a certain itemIndex in the container changes
@ -555,7 +555,7 @@ public:
* \param itemIndex The index of the container item. * \param itemIndex The index of the container item.
* \return The enchantment charge. * \return The enchantment charge.
*/ */
static double GetContainerItemEnchantmentCharge(unsigned int objectIndex, unsigned int itemIndex) noexcept; EXPORT_APIFUNCTION double CDECL GetContainerItemEnchantmentCharge(unsigned int objectIndex, unsigned int itemIndex) noexcept;
/** /**
* \brief Get the soul of the container item at a certain itemIndex in the container changes * \brief Get the soul of the container item at a certain itemIndex in the container changes
@ -565,7 +565,7 @@ public:
* \param itemIndex The index of the container item. * \param itemIndex The index of the container item.
* \return The soul. * \return The soul.
*/ */
static const char *GetContainerItemSoul(unsigned int objectIndex, unsigned int itemIndex) noexcept; EXPORT_APIFUNCTION const char *CDECL GetContainerItemSoul(unsigned int objectIndex, unsigned int itemIndex) noexcept;
/** /**
* \brief Get the action count of the container item at a certain itemIndex in the container * \brief Get the action count of the container item at a certain itemIndex in the container
@ -575,7 +575,7 @@ public:
* \param itemIndex The index of the container item. * \param itemIndex The index of the container item.
* \return The action count. * \return The action count.
*/ */
static int GetContainerItemActionCount(unsigned int objectIndex, unsigned int itemIndex) noexcept; EXPORT_APIFUNCTION int CDECL GetContainerItemActionCount(unsigned int objectIndex, unsigned int itemIndex) noexcept;
/** /**
* \brief Check whether the object at a certain index in the read object list has a container. * \brief Check whether the object at a certain index in the read object list has a container.
@ -586,7 +586,7 @@ public:
* \param index The index of the object. * \param index The index of the object.
* \return Whether the object has a container. * \return Whether the object has a container.
*/ */
static bool DoesObjectHaveContainer(unsigned int index) noexcept; EXPORT_APIFUNCTION bool CDECL DoesObjectHaveContainer(unsigned int index) noexcept;
/** /**
* \brief Set the cell of the temporary object list stored on the server. * \brief Set the cell of the temporary object list stored on the server.
@ -597,7 +597,7 @@ public:
* \param cellDescription The description of the cell. * \param cellDescription The description of the cell.
* \return void * \return void
*/ */
static void SetObjectListCell(const char* cellDescription) noexcept; EXPORT_APIFUNCTION void CDECL SetObjectListCell(const char* cellDescription) noexcept;
/** /**
* \brief Set the action type of the temporary object list stored on the server. * \brief Set the action type of the temporary object list stored on the server.
@ -605,7 +605,7 @@ public:
* \param action The action type (0 for SET, 1 for ADD, 2 for REMOVE, 3 for REQUEST). * \param action The action type (0 for SET, 1 for ADD, 2 for REMOVE, 3 for REQUEST).
* \return void * \return void
*/ */
static void SetObjectListAction(unsigned char action) noexcept; EXPORT_APIFUNCTION void CDECL SetObjectListAction(unsigned char action) noexcept;
/** /**
* \brief Set the console command of the temporary object list stored on the server. * \brief Set the console command of the temporary object list stored on the server.
@ -616,7 +616,7 @@ public:
* \param consoleCommand The console command. * \param consoleCommand The console command.
* \return void * \return void
*/ */
static void SetObjectListConsoleCommand(const char* consoleCommand) noexcept; EXPORT_APIFUNCTION void CDECL SetObjectListConsoleCommand(const char* consoleCommand) noexcept;
/** /**
* \brief Set the refId of the temporary object stored on the server. * \brief Set the refId of the temporary object stored on the server.
@ -624,7 +624,7 @@ public:
* \param refId The refId. * \param refId The refId.
* \return void * \return void
*/ */
static void SetObjectRefId(const char* refId) noexcept; EXPORT_APIFUNCTION void CDECL SetObjectRefId(const char* refId) noexcept;
/** /**
* \brief Set the refNum of the temporary object stored on the server. * \brief Set the refNum of the temporary object stored on the server.
@ -638,7 +638,7 @@ public:
* \param refNum The refNum. * \param refNum The refNum.
* \return void * \return void
*/ */
static void SetObjectRefNum(int refNum) noexcept; EXPORT_APIFUNCTION void CDECL SetObjectRefNum(int refNum) noexcept;
/** /**
* \brief Set the mpNum of the temporary object stored on the server. * \brief Set the mpNum of the temporary object stored on the server.
@ -653,7 +653,7 @@ public:
* \param mpNum The mpNum. * \param mpNum The mpNum.
* \return void * \return void
*/ */
static void SetObjectMpNum(int mpNum) noexcept; EXPORT_APIFUNCTION void CDECL SetObjectMpNum(int mpNum) noexcept;
/** /**
* \brief Set the object count of the temporary object stored on the server. * \brief Set the object count of the temporary object stored on the server.
@ -663,7 +663,7 @@ public:
* \param count The object count. * \param count The object count.
* \return void * \return void
*/ */
static void SetObjectCount(int count) noexcept; EXPORT_APIFUNCTION void CDECL SetObjectCount(int count) noexcept;
/** /**
* \brief Set the charge of the temporary object stored on the server. * \brief Set the charge of the temporary object stored on the server.
@ -673,7 +673,7 @@ public:
* \param charge The charge. * \param charge The charge.
* \return void * \return void
*/ */
static void SetObjectCharge(int charge) noexcept; EXPORT_APIFUNCTION void CDECL SetObjectCharge(int charge) noexcept;
/** /**
* \brief Set the enchantment charge of the temporary object stored on the server. * \brief Set the enchantment charge of the temporary object stored on the server.
@ -683,7 +683,7 @@ public:
* \param charge The enchantment charge. * \param charge The enchantment charge.
* \return void * \return void
*/ */
static void SetObjectEnchantmentCharge(double enchantmentCharge) noexcept; EXPORT_APIFUNCTION void CDECL SetObjectEnchantmentCharge(double enchantmentCharge) noexcept;
/** /**
* \brief Set the soul of the temporary object stored on the server. * \brief Set the soul of the temporary object stored on the server.
@ -691,7 +691,7 @@ public:
* \param refId The soul. * \param refId The soul.
* \return void * \return void
*/ */
static void SetObjectSoul(const char* soul) noexcept; EXPORT_APIFUNCTION void CDECL SetObjectSoul(const char* soul) noexcept;
/** /**
* \brief Set the gold value of the temporary object stored on the server. * \brief Set the gold value of the temporary object stored on the server.
@ -701,7 +701,7 @@ public:
* \param goldValue The gold value. * \param goldValue The gold value.
* \return void * \return void
*/ */
static void SetObjectGoldValue(int goldValue) noexcept; EXPORT_APIFUNCTION void CDECL SetObjectGoldValue(int goldValue) noexcept;
/** /**
* \brief Set the scale of the temporary object stored on the server. * \brief Set the scale of the temporary object stored on the server.
@ -711,7 +711,7 @@ public:
* \param scale The scale. * \param scale The scale.
* \return void * \return void
*/ */
static void SetObjectScale(double scale) noexcept; EXPORT_APIFUNCTION void CDECL SetObjectScale(double scale) noexcept;
/** /**
* \brief Set the object state of the temporary object stored on the server. * \brief Set the object state of the temporary object stored on the server.
@ -721,7 +721,7 @@ public:
* \param objectState The object state. * \param objectState The object state.
* \return void * \return void
*/ */
static void SetObjectState(bool objectState) noexcept; EXPORT_APIFUNCTION void CDECL SetObjectState(bool objectState) noexcept;
/** /**
* \brief Set the lock level of the temporary object stored on the server. * \brief Set the lock level of the temporary object stored on the server.
@ -729,7 +729,7 @@ public:
* \param lockLevel The lock level. * \param lockLevel The lock level.
* \return void * \return void
*/ */
static void SetObjectLockLevel(int lockLevel) noexcept; EXPORT_APIFUNCTION void CDECL SetObjectLockLevel(int lockLevel) noexcept;
/** /**
* \brief Set the summon duration of the temporary object stored on the server. * \brief Set the summon duration of the temporary object stored on the server.
@ -737,7 +737,7 @@ public:
* \param summonDuration The summon duration. * \param summonDuration The summon duration.
* \return void * \return void
*/ */
static void SetObjectSummonDuration(float summonDuration) noexcept; EXPORT_APIFUNCTION void CDECL SetObjectSummonDuration(float summonDuration) noexcept;
/** /**
* \brief Set the disarm state of the temporary object stored on the server. * \brief Set the disarm state of the temporary object stored on the server.
@ -745,7 +745,7 @@ public:
* \param disarmState The disarmState. * \param disarmState The disarmState.
* \return void * \return void
*/ */
static void SetObjectDisarmState(bool disarmState) noexcept; EXPORT_APIFUNCTION void CDECL SetObjectDisarmState(bool disarmState) noexcept;
/** /**
* \brief Set the summon state of the temporary object stored on the server. * \brief Set the summon state of the temporary object stored on the server.
@ -756,7 +756,7 @@ public:
* \param summonState The summon state. * \param summonState The summon state.
* \return void * \return void
*/ */
static void SetObjectSummonState(bool summonState) noexcept; EXPORT_APIFUNCTION void CDECL SetObjectSummonState(bool summonState) noexcept;
/** /**
* \brief Set the position of the temporary object stored on the server. * \brief Set the position of the temporary object stored on the server.
@ -766,7 +766,7 @@ public:
* \param z The Z position. * \param z The Z position.
* \return void * \return void
*/ */
static void SetObjectPosition(double x, double y, double z) noexcept; EXPORT_APIFUNCTION void CDECL SetObjectPosition(double x, double y, double z) noexcept;
/** /**
* \brief Set the rotation of the temporary object stored on the server. * \brief Set the rotation of the temporary object stored on the server.
@ -776,7 +776,7 @@ public:
* \param z The Z rotation. * \param z The Z rotation.
* \return void * \return void
*/ */
static void SetObjectRotation(double x, double y, double z) noexcept; EXPORT_APIFUNCTION void CDECL SetObjectRotation(double x, double y, double z) noexcept;
/** /**
* \brief Set the player ID of the player activating the temporary object stored on the * \brief Set the player ID of the player activating the temporary object stored on the
@ -785,7 +785,7 @@ public:
* \param pid The pid of the player. * \param pid The pid of the player.
* \return void * \return void
*/ */
static void SetObjectActivatingPid(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL SetObjectActivatingPid(unsigned short pid) noexcept;
/** /**
* \brief Set the door state of the temporary object stored on the server. * \brief Set the door state of the temporary object stored on the server.
@ -795,7 +795,7 @@ public:
* \param doorState The door state. * \param doorState The door state.
* \return void * \return void
*/ */
static void SetObjectDoorState(int doorState) noexcept; EXPORT_APIFUNCTION void CDECL SetObjectDoorState(int doorState) noexcept;
/** /**
* \brief Set the teleport state of the temporary object stored on the server. * \brief Set the teleport state of the temporary object stored on the server.
@ -806,7 +806,7 @@ public:
* \param teleportState The teleport state. * \param teleportState The teleport state.
* \return void * \return void
*/ */
static void SetObjectDoorTeleportState(bool teleportState) noexcept; EXPORT_APIFUNCTION void CDECL SetObjectDoorTeleportState(bool teleportState) noexcept;
/** /**
* \brief Set the door destination cell of the temporary object stored on the server. * \brief Set the door destination cell of the temporary object stored on the server.
@ -817,7 +817,7 @@ public:
* \param cellDescription The description of the cell. * \param cellDescription The description of the cell.
* \return void * \return void
*/ */
static void SetObjectDoorDestinationCell(const char* cellDescription) noexcept; EXPORT_APIFUNCTION void CDECL SetObjectDoorDestinationCell(const char* cellDescription) noexcept;
/** /**
* \brief Set the door destination position of the temporary object stored on the server. * \brief Set the door destination position of the temporary object stored on the server.
@ -827,7 +827,7 @@ public:
* \param z The Z position. * \param z The Z position.
* \return void * \return void
*/ */
static void SetObjectDoorDestinationPosition(double x, double y, double z) noexcept; EXPORT_APIFUNCTION void CDECL SetObjectDoorDestinationPosition(double x, double y, double z) noexcept;
/** /**
* \brief Set the door destination rotation of the temporary object stored on the server. * \brief Set the door destination rotation of the temporary object stored on the server.
@ -839,7 +839,7 @@ public:
* \param z The Z rotation. * \param z The Z rotation.
* \return void * \return void
*/ */
static void SetObjectDoorDestinationRotation(double x, double z) noexcept; EXPORT_APIFUNCTION void CDECL SetObjectDoorDestinationRotation(double x, double z) noexcept;
/** /**
* \brief Set a player as the object in the temporary object stored on the server. * \brief Set a player as the object in the temporary object stored on the server.
@ -848,7 +848,7 @@ public:
* \param pid The pid of the player. * \param pid The pid of the player.
* \return void * \return void
*/ */
static void SetPlayerAsObject(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL SetPlayerAsObject(unsigned short pid) noexcept;
/** /**
* \brief Set the refId of the temporary container item stored on the server. * \brief Set the refId of the temporary container item stored on the server.
@ -856,7 +856,7 @@ public:
* \param refId The refId. * \param refId The refId.
* \return void * \return void
*/ */
static void SetContainerItemRefId(const char* refId) noexcept; EXPORT_APIFUNCTION void CDECL SetContainerItemRefId(const char* refId) noexcept;
/** /**
* \brief Set the item count of the temporary container item stored on the server. * \brief Set the item count of the temporary container item stored on the server.
@ -864,7 +864,7 @@ public:
* \param count The item count. * \param count The item count.
* \return void * \return void
*/ */
static void SetContainerItemCount(int count) noexcept; EXPORT_APIFUNCTION void CDECL SetContainerItemCount(int count) noexcept;
/** /**
* \brief Set the charge of the temporary container item stored on the server. * \brief Set the charge of the temporary container item stored on the server.
@ -872,7 +872,7 @@ public:
* \param charge The charge. * \param charge The charge.
* \return void * \return void
*/ */
static void SetContainerItemCharge(int charge) noexcept; EXPORT_APIFUNCTION void CDECL SetContainerItemCharge(int charge) noexcept;
/** /**
* \brief Set the enchantment charge of the temporary container item stored on the server. * \brief Set the enchantment charge of the temporary container item stored on the server.
@ -880,7 +880,7 @@ public:
* \param charge The enchantment charge. * \param charge The enchantment charge.
* \return void * \return void
*/ */
static void SetContainerItemEnchantmentCharge(double enchantmentCharge) noexcept; EXPORT_APIFUNCTION void CDECL SetContainerItemEnchantmentCharge(double enchantmentCharge) noexcept;
/** /**
* \brief Set the soul of the temporary container item stored on the server. * \brief Set the soul of the temporary container item stored on the server.
@ -888,7 +888,7 @@ public:
* \param refId The soul. * \param refId The soul.
* \return void * \return void
*/ */
static void SetContainerItemSoul(const char* soul) noexcept; EXPORT_APIFUNCTION void CDECL SetContainerItemSoul(const char* soul) noexcept;
/** /**
* \brief Set the action count of the container item at a certain itemIndex in the container * \brief Set the action count of the container item at a certain itemIndex in the container
@ -903,7 +903,7 @@ public:
* \param actionCount The action count. * \param actionCount The action count.
* \return void * \return void
*/ */
static void SetContainerItemActionCountByIndex(unsigned int objectIndex, unsigned int itemIndex, int actionCount) noexcept; EXPORT_APIFUNCTION void CDECL SetContainerItemActionCountByIndex(unsigned int objectIndex, unsigned int itemIndex, int actionCount) noexcept;
/** /**
* \brief Add a copy of the server's temporary object to the server's currently stored object * \brief Add a copy of the server's temporary object to the server's currently stored object
@ -914,7 +914,7 @@ public:
* *
* \return void * \return void
*/ */
static void AddObject() noexcept; EXPORT_APIFUNCTION void CDECL AddObject() noexcept;
/** /**
* \brief Add a copy of the server's temporary container item to the container changes of the * \brief Add a copy of the server's temporary container item to the container changes of the
@ -925,7 +925,7 @@ public:
* *
* \return void * \return void
*/ */
static void AddContainerItem() noexcept; EXPORT_APIFUNCTION void CDECL AddContainerItem() noexcept;
/** /**
* \brief Send an ObjectActivate packet. * \brief Send an ObjectActivate packet.
@ -936,7 +936,7 @@ public:
* to the packet (false by default). * to the packet (false by default).
* \return void * \return void
*/ */
static void SendObjectActivate(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept; EXPORT_APIFUNCTION void CDECL SendObjectActivate(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept;
/** /**
* \brief Send an ObjectPlace packet. * \brief Send an ObjectPlace packet.
@ -947,7 +947,7 @@ public:
* to the packet (false by default). * to the packet (false by default).
* \return void * \return void
*/ */
static void SendObjectPlace(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept; EXPORT_APIFUNCTION void CDECL SendObjectPlace(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept;
/** /**
* \brief Send an ObjectSpawn packet. * \brief Send an ObjectSpawn packet.
@ -958,7 +958,7 @@ public:
* to the packet (false by default). * to the packet (false by default).
* \return void * \return void
*/ */
static void SendObjectSpawn(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept; EXPORT_APIFUNCTION void CDECL SendObjectSpawn(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept;
/** /**
* \brief Send an ObjectDelete packet. * \brief Send an ObjectDelete packet.
@ -968,7 +968,7 @@ public:
* *
* \return void * \return void
*/ */
static void SendObjectDelete(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept; EXPORT_APIFUNCTION void CDECL SendObjectDelete(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept;
/** /**
* \brief Send an ObjectLock packet. * \brief Send an ObjectLock packet.
@ -979,7 +979,7 @@ public:
* to the packet (false by default). * to the packet (false by default).
* \return void * \return void
*/ */
static void SendObjectLock(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept; EXPORT_APIFUNCTION void CDECL SendObjectLock(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept;
/** /**
* \brief Send an ObjectTrap packet. * \brief Send an ObjectTrap packet.
@ -989,7 +989,7 @@ public:
* *
* \return void * \return void
*/ */
static void SendObjectTrap(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept; EXPORT_APIFUNCTION void CDECL SendObjectTrap(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept;
/** /**
* \brief Send an ObjectScale packet. * \brief Send an ObjectScale packet.
@ -1000,7 +1000,7 @@ public:
* to the packet (false by default). * to the packet (false by default).
* \return void * \return void
*/ */
static void SendObjectScale(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept; EXPORT_APIFUNCTION void CDECL SendObjectScale(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept;
/** /**
* \brief Send an ObjectState packet. * \brief Send an ObjectState packet.
@ -1011,7 +1011,7 @@ public:
* to the packet (false by default). * to the packet (false by default).
* \return void * \return void
*/ */
static void SendObjectState(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept; EXPORT_APIFUNCTION void CDECL SendObjectState(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept;
/** /**
* \brief Send a DoorState packet. * \brief Send a DoorState packet.
@ -1022,7 +1022,7 @@ public:
* to the packet (false by default). * to the packet (false by default).
* \return void * \return void
*/ */
static void SendDoorState(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept; EXPORT_APIFUNCTION void CDECL SendDoorState(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept;
/** /**
* \brief Send a DoorDestination packet. * \brief Send a DoorDestination packet.
@ -1033,7 +1033,7 @@ public:
* to the packet (false by default). * to the packet (false by default).
* \return void * \return void
*/ */
static void SendDoorDestination(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept; EXPORT_APIFUNCTION void CDECL SendDoorDestination(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept;
/** /**
* \brief Send a Container packet. * \brief Send a Container packet.
@ -1044,7 +1044,7 @@ public:
* to the packet (false by default). * to the packet (false by default).
* \return void * \return void
*/ */
static void SendContainer(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept; EXPORT_APIFUNCTION void CDECL SendContainer(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept;
/** /**
* \brief Send a VideoPlay packet. * \brief Send a VideoPlay packet.
@ -1055,7 +1055,7 @@ public:
* to the packet (false by default). * to the packet (false by default).
* \return void * \return void
*/ */
static void SendVideoPlay(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept; EXPORT_APIFUNCTION void CDECL SendVideoPlay(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept;
/** /**
* \brief Send a ConsoleCommand packet. * \brief Send a ConsoleCommand packet.
@ -1066,28 +1066,27 @@ public:
* to the packet (false by default). * to the packet (false by default).
* \return void * \return void
*/ */
static void SendConsoleCommand(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept; EXPORT_APIFUNCTION void CDECL SendConsoleCommand(bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept;
// All methods below are deprecated versions of methods from above // All methods below are deprecated versions of methods from above
static void ReadLastObjectList() noexcept; EXPORT_APIFUNCTION void CDECL ReadLastObjectList() noexcept;
static void ReadLastEvent() noexcept; EXPORT_APIFUNCTION void CDECL ReadLastEvent() noexcept;
static void InitializeObjectList(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL InitializeObjectList(unsigned short pid) noexcept;
static void InitializeEvent(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL InitializeEvent(unsigned short pid) noexcept;
static void CopyLastObjectListToStore() noexcept; EXPORT_APIFUNCTION void CDECL CopyLastObjectListToStore() noexcept;
static unsigned int GetObjectChangesSize() noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetObjectChangesSize() noexcept;
static unsigned char GetEventAction() noexcept; EXPORT_APIFUNCTION unsigned char CDECL GetEventAction() noexcept;
static unsigned char GetEventContainerSubAction() noexcept; EXPORT_APIFUNCTION unsigned char CDECL GetEventContainerSubAction() noexcept;
static unsigned int GetObjectRefNumIndex(unsigned int index) noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetObjectRefNumIndex(unsigned int index) noexcept;
static unsigned int GetObjectSummonerRefNumIndex(unsigned int index) noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetObjectSummonerRefNumIndex(unsigned int index) noexcept;
static void SetEventCell(const char* cellDescription) noexcept; EXPORT_APIFUNCTION void CDECL SetEventCell(const char* cellDescription) noexcept;
static void SetEventAction(unsigned char action) noexcept; EXPORT_APIFUNCTION void CDECL SetEventAction(unsigned char action) noexcept;
static void SetEventConsoleCommand(const char* consoleCommand) noexcept; EXPORT_APIFUNCTION void CDECL SetEventConsoleCommand(const char* consoleCommand) noexcept;
static void SetObjectRefNumIndex(int refNum) noexcept; EXPORT_APIFUNCTION void CDECL SetObjectRefNumIndex(int refNum) noexcept;
static void AddWorldObject() noexcept; EXPORT_APIFUNCTION void CDECL AddWorldObject() noexcept;
}
};
#endif //OPENMW_OBJECTAPI_HPP #endif //OPENMW_OBJECTAPI_HPP

View file

@ -7,7 +7,21 @@
#include <iostream> #include <iostream>
using namespace std; using namespace std;
double PositionFunctions::GetPosX(unsigned short pid) noexcept extern "C" void PositionFunctions::GetPos(unsigned short pid, float *x, float *y, float *z) noexcept
{
*x = 0.00;
*y = 0.00;
*z = 0.00;
Player *player;
GET_PLAYER(pid, player,);
*x = player->position.pos[0];
*y = player->position.pos[1];
*z = player->position.pos[2];
}
extern "C" double PositionFunctions::GetPosX(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0.0f); GET_PLAYER(pid, player, 0.0f);
@ -15,7 +29,7 @@ double PositionFunctions::GetPosX(unsigned short pid) noexcept
return player->position.pos[0]; return player->position.pos[0];
} }
double PositionFunctions::GetPosY(unsigned short pid) noexcept extern "C" double PositionFunctions::GetPosY(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0.0f); GET_PLAYER(pid, player, 0.0f);
@ -23,7 +37,7 @@ double PositionFunctions::GetPosY(unsigned short pid) noexcept
return player->position.pos[1]; return player->position.pos[1];
} }
double PositionFunctions::GetPosZ(unsigned short pid) noexcept extern "C" double PositionFunctions::GetPosZ(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0.0f); GET_PLAYER(pid, player, 0.0f);
@ -31,7 +45,7 @@ double PositionFunctions::GetPosZ(unsigned short pid) noexcept
return player->position.pos[2]; return player->position.pos[2];
} }
double PositionFunctions::GetPreviousCellPosX(unsigned short pid) noexcept extern "C" double PositionFunctions::GetPreviousCellPosX(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0.0f); GET_PLAYER(pid, player, 0.0f);
@ -39,7 +53,7 @@ double PositionFunctions::GetPreviousCellPosX(unsigned short pid) noexcept
return player->previousCellPosition.pos[0]; return player->previousCellPosition.pos[0];
} }
double PositionFunctions::GetPreviousCellPosY(unsigned short pid) noexcept extern "C" double PositionFunctions::GetPreviousCellPosY(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0.0f); GET_PLAYER(pid, player, 0.0f);
@ -47,7 +61,7 @@ double PositionFunctions::GetPreviousCellPosY(unsigned short pid) noexcept
return player->previousCellPosition.pos[1]; return player->previousCellPosition.pos[1];
} }
double PositionFunctions::GetPreviousCellPosZ(unsigned short pid) noexcept extern "C" double PositionFunctions::GetPreviousCellPosZ(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0.0f); GET_PLAYER(pid, player, 0.0f);
@ -55,7 +69,21 @@ double PositionFunctions::GetPreviousCellPosZ(unsigned short pid) noexcept
return player->previousCellPosition.pos[2]; return player->previousCellPosition.pos[2];
} }
double PositionFunctions::GetRotX(unsigned short pid) noexcept extern "C" void PositionFunctions::GetRot(unsigned short pid, float *x, float *y, float *z) noexcept
{
*x = 0.00;
*y = 0.00;
*z = 0.00;
Player *player;
GET_PLAYER(pid, player, );
*x = player->position.rot[0];
*y = player->position.rot[1];
*z = player->position.rot[2];
}
extern "C" double PositionFunctions::GetRotX(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0.0f); GET_PLAYER(pid, player, 0.0f);
@ -63,7 +91,7 @@ double PositionFunctions::GetRotX(unsigned short pid) noexcept
return player->position.rot[0]; return player->position.rot[0];
} }
double PositionFunctions::GetRotZ(unsigned short pid) noexcept extern "C" double PositionFunctions::GetRotZ(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0.0f); GET_PLAYER(pid, player, 0.0f);
@ -71,7 +99,7 @@ double PositionFunctions::GetRotZ(unsigned short pid) noexcept
return player->position.rot[2]; return player->position.rot[2];
} }
void PositionFunctions::SetPos(unsigned short pid, double x, double y, double z) noexcept extern "C" void PositionFunctions::SetPos(unsigned short pid, double x, double y, double z) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);
@ -81,7 +109,7 @@ void PositionFunctions::SetPos(unsigned short pid, double x, double y, double z)
player->position.pos[2] = z; player->position.pos[2] = z;
} }
void PositionFunctions::SetRot(unsigned short pid, double x, double z) noexcept extern "C" void PositionFunctions::SetRot(unsigned short pid, double x, double z) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -90,7 +118,7 @@ void PositionFunctions::SetRot(unsigned short pid, double x, double z) noexcept
player->position.rot[2] = z; player->position.rot[2] = z;
} }
void PositionFunctions::SetMomentum(unsigned short pid, double x, double y, double z) noexcept extern "C" void PositionFunctions::SetMomentum(unsigned short pid, double x, double y, double z) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -100,7 +128,7 @@ void PositionFunctions::SetMomentum(unsigned short pid, double x, double y, doub
player->momentum.pos[2] = z; player->momentum.pos[2] = z;
} }
void PositionFunctions::SendPos(unsigned short pid) noexcept extern "C" void PositionFunctions::SendPos(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -111,7 +139,7 @@ void PositionFunctions::SendPos(unsigned short pid) noexcept
packet->Send(false); packet->Send(false);
} }
void PositionFunctions::SendMomentum(unsigned short pid) noexcept extern "C" void PositionFunctions::SendMomentum(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );

View file

@ -3,7 +3,10 @@
#include "../Types.hpp" #include "../Types.hpp"
#include <Script/Platform.hpp>
#define POSITIONAPI \ #define POSITIONAPI \
{"GetPos", PositionFunctions::GetPos},\
{"GetPosX", PositionFunctions::GetPosX},\ {"GetPosX", PositionFunctions::GetPosX},\
{"GetPosY", PositionFunctions::GetPosY},\ {"GetPosY", PositionFunctions::GetPosY},\
{"GetPosZ", PositionFunctions::GetPosZ},\ {"GetPosZ", PositionFunctions::GetPosZ},\
@ -12,6 +15,7 @@
{"GetPreviousCellPosY", PositionFunctions::GetPreviousCellPosY},\ {"GetPreviousCellPosY", PositionFunctions::GetPreviousCellPosY},\
{"GetPreviousCellPosZ", PositionFunctions::GetPreviousCellPosZ},\ {"GetPreviousCellPosZ", PositionFunctions::GetPreviousCellPosZ},\
\ \
{"GetRot", PositionFunctions::GetRot},\
{"GetRotX", PositionFunctions::GetRotX},\ {"GetRotX", PositionFunctions::GetRotX},\
{"GetRotZ", PositionFunctions::GetRotZ},\ {"GetRotZ", PositionFunctions::GetRotZ},\
\ \
@ -23,9 +27,19 @@
{"SendMomentum", PositionFunctions::SendMomentum} {"SendMomentum", PositionFunctions::SendMomentum}
class PositionFunctions namespace PositionFunctions
{ {
public: /**
* \brief Assign the player's positional coordinate values to the variables passed as
* parameters.
*
* \param pid The player ID.
* \param x The variable for the X position.
* \param y The variable for the Y position.
* \param z The variable for the Z position.
* \return void
*/
EXPORT_APIFUNCTION void CDECL GetPos(unsigned short pid, float *x, float *y, float *z) noexcept;
/** /**
* \brief Get the X position of a player. * \brief Get the X position of a player.
@ -33,7 +47,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The X position. * \return The X position.
*/ */
static double GetPosX(unsigned short pid) noexcept; EXPORT_APIFUNCTION double CDECL GetPosX(unsigned short pid) noexcept;
/** /**
* \brief Get the Y position of a player. * \brief Get the Y position of a player.
@ -41,7 +55,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The Y position. * \return The Y position.
*/ */
static double GetPosY(unsigned short pid) noexcept; EXPORT_APIFUNCTION double CDECL GetPosY(unsigned short pid) noexcept;
/** /**
* \brief Get the Z position of a player. * \brief Get the Z position of a player.
@ -49,7 +63,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The Z position. * \return The Z position.
*/ */
static double GetPosZ(unsigned short pid) noexcept; EXPORT_APIFUNCTION double CDECL GetPosZ(unsigned short pid) noexcept;
/** /**
* \brief Get the X position of a player from before their latest cell change. * \brief Get the X position of a player from before their latest cell change.
@ -57,7 +71,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The X position. * \return The X position.
*/ */
static double GetPreviousCellPosX(unsigned short pid) noexcept; EXPORT_APIFUNCTION double CDECL GetPreviousCellPosX(unsigned short pid) noexcept;
/** /**
* \brief Get the Y position of a player from before their latest cell change. * \brief Get the Y position of a player from before their latest cell change.
@ -65,7 +79,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The Y position. * \return The Y position.
*/ */
static double GetPreviousCellPosY(unsigned short pid) noexcept; EXPORT_APIFUNCTION double CDECL GetPreviousCellPosY(unsigned short pid) noexcept;
/** /**
* \brief Get the Z position of a player from before their latest cell change. * \brief Get the Z position of a player from before their latest cell change.
@ -73,7 +87,19 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The Z position. * \return The Z position.
*/ */
static double GetPreviousCellPosZ(unsigned short pid) noexcept; EXPORT_APIFUNCTION double CDECL GetPreviousCellPosZ(unsigned short pid) noexcept;
/**
* \brief Assign the player's rotational coordinate values to the variables passed as
* parameters.
*
* \param pid The player ID.
* \param x The variable for the X rotation.
* \param y The variable for the Y rotation.
* \param z The variable for the Z rotation.
* \return void
*/
EXPORT_APIFUNCTION void CDECL GetRot(unsigned short pid, float *x, float *y, float *z) noexcept;
/** /**
* \brief Get the X rotation of a player. * \brief Get the X rotation of a player.
@ -81,7 +107,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The X rotation. * \return The X rotation.
*/ */
static double GetRotX(unsigned short pid) noexcept; EXPORT_APIFUNCTION double CDECL GetRotX(unsigned short pid) noexcept;
/** /**
* \brief Get the Z rotation of a player. * \brief Get the Z rotation of a player.
@ -89,7 +115,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The Z rotation. * \return The Z rotation.
*/ */
static double GetRotZ(unsigned short pid) noexcept; EXPORT_APIFUNCTION double CDECL GetRotZ(unsigned short pid) noexcept;
/** /**
* \brief Set the position of a player. * \brief Set the position of a player.
@ -103,7 +129,7 @@ public:
* \param z The Z position. * \param z The Z position.
* \return void * \return void
*/ */
static void SetPos(unsigned short pid, double x, double y, double z) noexcept; EXPORT_APIFUNCTION void CDECL SetPos(unsigned short pid, double x, double y, double z) noexcept;
/** /**
* \brief Set the rotation of a player. * \brief Set the rotation of a player.
@ -118,7 +144,7 @@ public:
* \param z The Z position. * \param z The Z position.
* \return void * \return void
*/ */
static void SetRot(unsigned short pid, double x, double z) noexcept; EXPORT_APIFUNCTION void CDECL SetRot(unsigned short pid, double x, double z) noexcept;
/** /**
* \brief Set the momentum of a player. * \brief Set the momentum of a player.
@ -132,7 +158,7 @@ public:
* \param z The Z momentum. * \param z The Z momentum.
* \return void * \return void
*/ */
static void SetMomentum(unsigned short pid, double x, double y, double z) noexcept; EXPORT_APIFUNCTION void CDECL SetMomentum(unsigned short pid, double x, double y, double z) noexcept;
/** /**
* \brief Send a PlayerPosition packet about a player. * \brief Send a PlayerPosition packet about a player.
@ -142,7 +168,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return void * \return void
*/ */
static void SendPos(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL SendPos(unsigned short pid) noexcept;
/** /**
* \brief Send a PlayerMomentum packet about a player. * \brief Send a PlayerMomentum packet about a player.
@ -152,7 +178,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return void * \return void
*/ */
static void SendMomentum(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL SendMomentum(unsigned short pid) noexcept;
}; }
#endif //OPENMW_POSITIONAPI_HPP #endif //OPENMW_POSITIONAPI_HPP

View file

@ -0,0 +1,29 @@
//
// Created by koncord on 09.12.18.
//
#include "Public.hpp"
#include <Script/ScriptFunctions.hpp>
#include <Script/API/PublicFnAPI.hpp>
extern "C" void PublicFunctions::MakePublic(ScriptFunc _public, const char *name, char ret_type, const char *def) noexcept
{
Public::MakePublic(_public, name, ret_type, def);
}
extern "C" boost::any PublicFunctions::CallPublic(const char *name, va_list args) noexcept
{
std::vector<boost::any> params;
try
{
std::string def = Public::GetDefinition(name);
ScriptFunctions::GetArguments(params, args, def);
return Public::Call(name, params);
}
catch (...) {}
return 0;
}

View file

@ -0,0 +1,16 @@
//
// Created by koncord on 09.12.18.
//
#ifndef OPENMW_PUBLIC_HPP
#define OPENMW_PUBLIC_HPP
#include <apps/openmw-mp/Script/ScriptFunction.hpp>
namespace PublicFunctions
{
extern "C" void MakePublic(ScriptFunc _public, const char *name, char ret_type, const char *def) noexcept;
extern "C" boost::any CallPublic(const char *name, va_list args) noexcept;
}
#endif

View file

@ -8,7 +8,7 @@
using namespace mwmp; using namespace mwmp;
void QuestFunctions::ClearJournalChanges(unsigned short pid) noexcept extern "C" void QuestFunctions::ClearJournalChanges(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -16,7 +16,7 @@ void QuestFunctions::ClearJournalChanges(unsigned short pid) noexcept
player->journalChanges.journalItems.clear(); player->journalChanges.journalItems.clear();
} }
void QuestFunctions::ClearKillChanges(unsigned short pid) noexcept extern "C" void QuestFunctions::ClearKillChanges(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -24,7 +24,7 @@ void QuestFunctions::ClearKillChanges(unsigned short pid) noexcept
player->killChanges.kills.clear(); player->killChanges.kills.clear();
} }
unsigned int QuestFunctions::GetJournalChangesSize(unsigned short pid) noexcept extern "C" unsigned int QuestFunctions::GetJournalChangesSize(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -32,7 +32,7 @@ unsigned int QuestFunctions::GetJournalChangesSize(unsigned short pid) noexcept
return player->journalChanges.count; return player->journalChanges.count;
} }
unsigned int QuestFunctions::GetKillChangesSize(unsigned short pid) noexcept extern "C" unsigned int QuestFunctions::GetKillChangesSize(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -40,7 +40,7 @@ unsigned int QuestFunctions::GetKillChangesSize(unsigned short pid) noexcept
return player->killChanges.count; return player->killChanges.count;
} }
void QuestFunctions::AddJournalEntry(unsigned short pid, const char* quest, unsigned int index, const char* actorRefId) noexcept extern "C" void QuestFunctions::AddJournalEntry(unsigned short pid, const char* quest, unsigned int index, const char* actorRefId) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -55,7 +55,7 @@ void QuestFunctions::AddJournalEntry(unsigned short pid, const char* quest, unsi
player->journalChanges.journalItems.push_back(journalItem); player->journalChanges.journalItems.push_back(journalItem);
} }
void QuestFunctions::AddJournalEntryWithTimestamp(unsigned short pid, const char* quest, unsigned int index, const char* actorRefId, extern "C" void QuestFunctions::AddJournalEntryWithTimestamp(unsigned short pid, const char* quest, unsigned int index, const char* actorRefId,
unsigned int daysPassed, unsigned int month, unsigned int day) noexcept unsigned int daysPassed, unsigned int month, unsigned int day) noexcept
{ {
Player *player; Player *player;
@ -75,7 +75,7 @@ void QuestFunctions::AddJournalEntryWithTimestamp(unsigned short pid, const char
player->journalChanges.journalItems.push_back(journalItem); player->journalChanges.journalItems.push_back(journalItem);
} }
void QuestFunctions::AddJournalIndex(unsigned short pid, const char* quest, unsigned int index) noexcept extern "C" void QuestFunctions::AddJournalIndex(unsigned short pid, const char* quest, unsigned int index) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -88,7 +88,7 @@ void QuestFunctions::AddJournalIndex(unsigned short pid, const char* quest, unsi
player->journalChanges.journalItems.push_back(journalItem); player->journalChanges.journalItems.push_back(journalItem);
} }
void QuestFunctions::AddKill(unsigned short pid, const char* refId, int number) noexcept extern "C" void QuestFunctions::AddKill(unsigned short pid, const char* refId, int number) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -100,7 +100,7 @@ void QuestFunctions::AddKill(unsigned short pid, const char* refId, int number)
player->killChanges.kills.push_back(kill); player->killChanges.kills.push_back(kill);
} }
void QuestFunctions::SetReputation(unsigned short pid, int value) noexcept extern "C" void QuestFunctions::SetReputation(unsigned short pid, int value) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -108,7 +108,7 @@ void QuestFunctions::SetReputation(unsigned short pid, int value) noexcept
player->npcStats.mReputation = value; player->npcStats.mReputation = value;
} }
const char *QuestFunctions::GetJournalItemQuest(unsigned short pid, unsigned int index) noexcept extern "C" const char *QuestFunctions::GetJournalItemQuest(unsigned short pid, unsigned int index) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ""); GET_PLAYER(pid, player, "");
@ -119,7 +119,7 @@ const char *QuestFunctions::GetJournalItemQuest(unsigned short pid, unsigned int
return player->journalChanges.journalItems.at(index).quest.c_str(); return player->journalChanges.journalItems.at(index).quest.c_str();
} }
int QuestFunctions::GetJournalItemIndex(unsigned short pid, unsigned int index) noexcept extern "C" int QuestFunctions::GetJournalItemIndex(unsigned short pid, unsigned int index) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -127,7 +127,7 @@ int QuestFunctions::GetJournalItemIndex(unsigned short pid, unsigned int index)
return player->journalChanges.journalItems.at(index).index; return player->journalChanges.journalItems.at(index).index;
} }
int QuestFunctions::GetJournalItemType(unsigned short pid, unsigned int index) noexcept extern "C" int QuestFunctions::GetJournalItemType(unsigned short pid, unsigned int index) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -135,7 +135,7 @@ int QuestFunctions::GetJournalItemType(unsigned short pid, unsigned int index) n
return player->journalChanges.journalItems.at(index).type; return player->journalChanges.journalItems.at(index).type;
} }
const char *QuestFunctions::GetJournalItemActorRefId(unsigned short pid, unsigned int index) noexcept extern "C" const char *QuestFunctions::GetJournalItemActorRefId(unsigned short pid, unsigned int index) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -143,7 +143,7 @@ const char *QuestFunctions::GetJournalItemActorRefId(unsigned short pid, unsigne
return player->journalChanges.journalItems.at(index).actorRefId.c_str(); return player->journalChanges.journalItems.at(index).actorRefId.c_str();
} }
const char *QuestFunctions::GetKillRefId(unsigned short pid, unsigned int index) noexcept extern "C" const char *QuestFunctions::GetKillRefId(unsigned short pid, unsigned int index) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ""); GET_PLAYER(pid, player, "");
@ -154,7 +154,7 @@ const char *QuestFunctions::GetKillRefId(unsigned short pid, unsigned int index)
return player->killChanges.kills.at(index).refId.c_str(); return player->killChanges.kills.at(index).refId.c_str();
} }
int QuestFunctions::GetKillNumber(unsigned short pid, unsigned int index) noexcept extern "C" int QuestFunctions::GetKillNumber(unsigned short pid, unsigned int index) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -162,7 +162,7 @@ int QuestFunctions::GetKillNumber(unsigned short pid, unsigned int index) noexce
return player->killChanges.kills.at(index).number; return player->killChanges.kills.at(index).number;
} }
int QuestFunctions::GetReputation(unsigned short pid) noexcept extern "C" int QuestFunctions::GetReputation(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -170,7 +170,7 @@ int QuestFunctions::GetReputation(unsigned short pid) noexcept
return player->npcStats.mReputation; return player->npcStats.mReputation;
} }
void QuestFunctions::SendJournalChanges(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept extern "C" void QuestFunctions::SendJournalChanges(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -184,7 +184,7 @@ void QuestFunctions::SendJournalChanges(unsigned short pid, bool sendToOtherPlay
packet->Send(true); packet->Send(true);
} }
void QuestFunctions::SendKillChanges(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept extern "C" void QuestFunctions::SendKillChanges(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -198,7 +198,7 @@ void QuestFunctions::SendKillChanges(unsigned short pid, bool sendToOtherPlayers
packet->Send(true); packet->Send(true);
} }
void QuestFunctions::SendReputation(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept extern "C" void QuestFunctions::SendReputation(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -212,14 +212,14 @@ void QuestFunctions::SendReputation(unsigned short pid, bool sendToOtherPlayers,
packet->Send(true); packet->Send(true);
} }
// All methods below are deprecated versions of methods from above extern "C" // All methods below are deprecated versions of methods from above
void QuestFunctions::InitializeJournalChanges(unsigned short pid) noexcept void QuestFunctions::InitializeJournalChanges(unsigned short pid) noexcept
{ {
ClearJournalChanges(pid); ClearJournalChanges(pid);
} }
void QuestFunctions::InitializeKillChanges(unsigned short pid) noexcept extern "C" void QuestFunctions::InitializeKillChanges(unsigned short pid) noexcept
{ {
ClearKillChanges(pid); ClearKillChanges(pid);
} }

View file

@ -1,6 +1,8 @@
#ifndef OPENMW_QUESTAPI_HPP #ifndef OPENMW_QUESTAPI_HPP
#define OPENMW_QUESTAPI_HPP #define OPENMW_QUESTAPI_HPP
#include <Script/Platform.hpp>
#define QUESTAPI \ #define QUESTAPI \
{"ClearJournalChanges", QuestFunctions::ClearJournalChanges},\ {"ClearJournalChanges", QuestFunctions::ClearJournalChanges},\
{"ClearKillChanges", QuestFunctions::ClearKillChanges},\ {"ClearKillChanges", QuestFunctions::ClearKillChanges},\
@ -31,10 +33,8 @@
{"InitializeJournalChanges", QuestFunctions::InitializeJournalChanges},\ {"InitializeJournalChanges", QuestFunctions::InitializeJournalChanges},\
{"InitializeKillChanges", QuestFunctions::InitializeKillChanges} {"InitializeKillChanges", QuestFunctions::InitializeKillChanges}
class QuestFunctions namespace QuestFunctions
{ {
public:
/** /**
* \brief Clear the last recorded journal changes for a player. * \brief Clear the last recorded journal changes for a player.
* *
@ -43,7 +43,7 @@ public:
* \param pid The player ID whose journal changes should be used. * \param pid The player ID whose journal changes should be used.
* \return void * \return void
*/ */
static void ClearJournalChanges(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL ClearJournalChanges(unsigned short pid) noexcept;
/** /**
* \brief Clear the last recorded kill count changes for a player. * \brief Clear the last recorded kill count changes for a player.
@ -53,7 +53,7 @@ public:
* \param pid The player ID whose kill count changes should be used. * \param pid The player ID whose kill count changes should be used.
* \return void * \return void
*/ */
static void ClearKillChanges(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL ClearKillChanges(unsigned short pid) noexcept;
/** /**
* \brief Get the number of indexes in a player's latest journal changes. * \brief Get the number of indexes in a player's latest journal changes.
@ -61,7 +61,7 @@ public:
* \param pid The player ID whose journal changes should be used. * \param pid The player ID whose journal changes should be used.
* \return The number of indexes. * \return The number of indexes.
*/ */
static unsigned int GetJournalChangesSize(unsigned short pid) noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetJournalChangesSize(unsigned short pid) noexcept;
/** /**
* \brief Get the number of indexes in a player's latest kill count changes. * \brief Get the number of indexes in a player's latest kill count changes.
@ -69,7 +69,7 @@ public:
* \param pid The player ID whose kill count changes should be used. * \param pid The player ID whose kill count changes should be used.
* \return The number of indexes. * \return The number of indexes.
*/ */
static unsigned int GetKillChangesSize(unsigned short pid) noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetKillChangesSize(unsigned short pid) noexcept;
/** /**
* \brief Add a new journal item of type ENTRY to the journal changes for a player, * \brief Add a new journal item of type ENTRY to the journal changes for a player,
@ -81,7 +81,7 @@ public:
* \param actorRefId The actor refId of the journal item. * \param actorRefId The actor refId of the journal item.
* \return void * \return void
*/ */
static void AddJournalEntry(unsigned short pid, const char* quest, unsigned int index, const char* actorRefId) noexcept; EXPORT_APIFUNCTION void CDECL AddJournalEntry(unsigned short pid, const char* quest, unsigned int index, const char* actorRefId) noexcept;
/** /**
* \brief Add a new journal item of type ENTRY to the journal changes for a player, * \brief Add a new journal item of type ENTRY to the journal changes for a player,
@ -96,7 +96,7 @@ public:
* \param The day of the month for the journal item. * \param The day of the month for the journal item.
* \return void * \return void
*/ */
static void AddJournalEntryWithTimestamp(unsigned short pid, const char* quest, unsigned int index, const char* actorRefId, EXPORT_APIFUNCTION void CDECL AddJournalEntryWithTimestamp(unsigned short pid, const char* quest, unsigned int index, const char* actorRefId,
unsigned int daysPassed, unsigned int month, unsigned int day) noexcept; unsigned int daysPassed, unsigned int month, unsigned int day) noexcept;
/** /**
@ -107,7 +107,7 @@ public:
* \param index The quest index of the journal item. * \param index The quest index of the journal item.
* \return void * \return void
*/ */
static void AddJournalIndex(unsigned short pid, const char* quest, unsigned int index) noexcept; EXPORT_APIFUNCTION void CDECL AddJournalIndex(unsigned short pid, const char* quest, unsigned int index) noexcept;
/** /**
* \brief Add a new kill count to the kill count changes for a player. * \brief Add a new kill count to the kill count changes for a player.
@ -117,7 +117,7 @@ public:
* \param number The number of kills in the kill count. * \param number The number of kills in the kill count.
* \return void * \return void
*/ */
static void AddKill(unsigned short pid, const char* refId, int number) noexcept; EXPORT_APIFUNCTION void CDECL AddKill(unsigned short pid, const char* refId, int number) noexcept;
/** /**
* \brief Set the reputation of a certain player. * \brief Set the reputation of a certain player.
@ -126,7 +126,7 @@ public:
* \param value The reputation. * \param value The reputation.
* \return void * \return void
*/ */
static void SetReputation(unsigned short pid, int value) noexcept; EXPORT_APIFUNCTION void CDECL SetReputation(unsigned short pid, int value) noexcept;
/** /**
* \brief Get the quest at a certain index in a player's latest journal changes. * \brief Get the quest at a certain index in a player's latest journal changes.
@ -135,7 +135,7 @@ public:
* \param index The index of the journalItem. * \param index The index of the journalItem.
* \return The quest. * \return The quest.
*/ */
static const char *GetJournalItemQuest(unsigned short pid, unsigned int index) noexcept; EXPORT_APIFUNCTION const char *CDECL GetJournalItemQuest(unsigned short pid, unsigned int index) noexcept;
/** /**
* \brief Get the quest index at a certain index in a player's latest journal changes. * \brief Get the quest index at a certain index in a player's latest journal changes.
@ -144,7 +144,7 @@ public:
* \param index The index of the journalItem. * \param index The index of the journalItem.
* \return The quest index. * \return The quest index.
*/ */
static int GetJournalItemIndex(unsigned short pid, unsigned int index) noexcept; EXPORT_APIFUNCTION int CDECL GetJournalItemIndex(unsigned short pid, unsigned int index) noexcept;
/** /**
* \brief Get the journal item type at a certain index in a player's latest journal changes. * \brief Get the journal item type at a certain index in a player's latest journal changes.
@ -153,7 +153,7 @@ public:
* \param index The index of the journalItem. * \param index The index of the journalItem.
* \return The type (0 for ENTRY, 1 for INDEX). * \return The type (0 for ENTRY, 1 for INDEX).
*/ */
static int GetJournalItemType(unsigned short pid, unsigned int index) noexcept; EXPORT_APIFUNCTION int CDECL GetJournalItemType(unsigned short pid, unsigned int index) noexcept;
/** /**
* \brief Get the actor refId at a certain index in a player's latest journal changes. * \brief Get the actor refId at a certain index in a player's latest journal changes.
@ -164,7 +164,7 @@ public:
* \param index The index of the journalItem. * \param index The index of the journalItem.
* \return The actor refId. * \return The actor refId.
*/ */
static const char *GetJournalItemActorRefId(unsigned short pid, unsigned int index) noexcept; EXPORT_APIFUNCTION const char *CDECL GetJournalItemActorRefId(unsigned short pid, unsigned int index) noexcept;
/** /**
* \brief Get the refId at a certain index in a player's latest kill count changes. * \brief Get the refId at a certain index in a player's latest kill count changes.
@ -173,7 +173,7 @@ public:
* \param index The index of the kill count. * \param index The index of the kill count.
* \return The refId. * \return The refId.
*/ */
static const char *GetKillRefId(unsigned short pid, unsigned int index) noexcept; EXPORT_APIFUNCTION const char *CDECL GetKillRefId(unsigned short pid, unsigned int index) noexcept;
/** /**
* \brief Get the number of kills at a certain index in a player's latest kill count changes. * \brief Get the number of kills at a certain index in a player's latest kill count changes.
@ -182,7 +182,7 @@ public:
* \param index The index of the kill count. * \param index The index of the kill count.
* \return The number of kills. * \return The number of kills.
*/ */
static int GetKillNumber(unsigned short pid, unsigned int index) noexcept; EXPORT_APIFUNCTION int CDECL GetKillNumber(unsigned short pid, unsigned int index) noexcept;
/** /**
* \brief Get the a certain player's reputation. * \brief Get the a certain player's reputation.
@ -190,7 +190,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The reputation. * \return The reputation.
*/ */
static int GetReputation(unsigned short pid) noexcept; EXPORT_APIFUNCTION int CDECL GetReputation(unsigned short pid) noexcept;
/** /**
* \brief Send a PlayerJournal packet with a player's recorded journal changes. * \brief Send a PlayerJournal packet with a player's recorded journal changes.
@ -202,7 +202,7 @@ public:
* to the packet (false by default). * to the packet (false by default).
* \return void * \return void
*/ */
static void SendJournalChanges(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept; EXPORT_APIFUNCTION void CDECL SendJournalChanges(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept;
/** /**
* \brief Send a WorldKillCount packet with a player's recorded kill count changes. * \brief Send a WorldKillCount packet with a player's recorded kill count changes.
@ -214,7 +214,7 @@ public:
* to the packet (false by default). * to the packet (false by default).
* \return void * \return void
*/ */
static void SendKillChanges(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept; EXPORT_APIFUNCTION void CDECL SendKillChanges(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept;
/** /**
* \brief Send a PlayerReputation packet with a player's recorded reputation. * \brief Send a PlayerReputation packet with a player's recorded reputation.
@ -226,15 +226,12 @@ public:
* to the packet (false by default). * to the packet (false by default).
* \return void * \return void
*/ */
static void SendReputation(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept; EXPORT_APIFUNCTION void CDECL SendReputation(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept;
// All methods below are deprecated versions of methods from above // All methods below are deprecated versions of methods from above
static void InitializeJournalChanges(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL InitializeJournalChanges(unsigned short pid) noexcept;
static void InitializeKillChanges(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL InitializeKillChanges(unsigned short pid) noexcept;
}
private:
};
#endif //OPENMW_QUESTAPI_HPP #endif //OPENMW_QUESTAPI_HPP

View file

@ -31,7 +31,7 @@ mwmp::Item tempInventoryItem;
const ESM::EffectList emptyEffectList = {}; const ESM::EffectList emptyEffectList = {};
const ESM::EffectList& GetRecordEffects(unsigned int recordIndex) extern "C" const ESM::EffectList& GetRecordEffects(unsigned int recordIndex)
{ {
unsigned short recordsType = RecordsDynamicFunctions::GetRecordType(); unsigned short recordsType = RecordsDynamicFunctions::GetRecordType();
@ -45,7 +45,7 @@ const ESM::EffectList& GetRecordEffects(unsigned int recordIndex)
return emptyEffectList; return emptyEffectList;
} }
void RecordsDynamicFunctions::ClearRecords() noexcept extern "C" void RecordsDynamicFunctions::ClearRecords() noexcept
{ {
WorldstateFunctions::writeWorldstate.spellRecords.clear(); WorldstateFunctions::writeWorldstate.spellRecords.clear();
WorldstateFunctions::writeWorldstate.potionRecords.clear(); WorldstateFunctions::writeWorldstate.potionRecords.clear();
@ -59,22 +59,22 @@ void RecordsDynamicFunctions::ClearRecords() noexcept
WorldstateFunctions::writeWorldstate.weaponRecords.clear(); WorldstateFunctions::writeWorldstate.weaponRecords.clear();
} }
unsigned short RecordsDynamicFunctions::GetRecordType() noexcept extern "C" unsigned short RecordsDynamicFunctions::GetRecordType() noexcept
{ {
return WorldstateFunctions::readWorldstate->recordsType; return WorldstateFunctions::readWorldstate->recordsType;
} }
unsigned int RecordsDynamicFunctions::GetRecordCount() noexcept extern "C" unsigned int RecordsDynamicFunctions::GetRecordCount() noexcept
{ {
return WorldstateFunctions::readWorldstate->recordsCount; return WorldstateFunctions::readWorldstate->recordsCount;
} }
unsigned int RecordsDynamicFunctions::GetRecordEffectCount(unsigned int recordIndex) noexcept extern "C" unsigned int RecordsDynamicFunctions::GetRecordEffectCount(unsigned int recordIndex) noexcept
{ {
return GetRecordEffects(recordIndex).mList.size(); return GetRecordEffects(recordIndex).mList.size();
} }
int RecordsDynamicFunctions::GetRecordSubtype(unsigned int index) noexcept extern "C" int RecordsDynamicFunctions::GetRecordSubtype(unsigned int index) noexcept
{ {
unsigned short readRecordsType = RecordsDynamicFunctions::GetRecordType(); unsigned short readRecordsType = RecordsDynamicFunctions::GetRecordType();
@ -86,7 +86,7 @@ int RecordsDynamicFunctions::GetRecordSubtype(unsigned int index) noexcept
return -1; return -1;
} }
const char *RecordsDynamicFunctions::GetRecordId(unsigned int index) noexcept extern "C" const char *RecordsDynamicFunctions::GetRecordId(unsigned int index) noexcept
{ {
unsigned short readRecordsType = RecordsDynamicFunctions::GetRecordType(); unsigned short readRecordsType = RecordsDynamicFunctions::GetRecordType();
@ -100,7 +100,7 @@ const char *RecordsDynamicFunctions::GetRecordId(unsigned int index) noexcept
return "invalid"; return "invalid";
} }
const char *RecordsDynamicFunctions::GetRecordBaseId(unsigned int index) noexcept extern "C" const char *RecordsDynamicFunctions::GetRecordBaseId(unsigned int index) noexcept
{ {
unsigned short readRecordsType = RecordsDynamicFunctions::GetRecordType(); unsigned short readRecordsType = RecordsDynamicFunctions::GetRecordType();
@ -122,7 +122,7 @@ const char *RecordsDynamicFunctions::GetRecordBaseId(unsigned int index) noexcep
return "invalid"; return "invalid";
} }
const char *RecordsDynamicFunctions::GetRecordName(unsigned int index) noexcept extern "C" const char *RecordsDynamicFunctions::GetRecordName(unsigned int index) noexcept
{ {
unsigned short readRecordsType = RecordsDynamicFunctions::GetRecordType(); unsigned short readRecordsType = RecordsDynamicFunctions::GetRecordType();
@ -142,7 +142,7 @@ const char *RecordsDynamicFunctions::GetRecordName(unsigned int index) noexcept
return "invalid"; return "invalid";
} }
const char *RecordsDynamicFunctions::GetRecordModel(unsigned int index) noexcept extern "C" const char *RecordsDynamicFunctions::GetRecordModel(unsigned int index) noexcept
{ {
unsigned short readRecordsType = RecordsDynamicFunctions::GetRecordType(); unsigned short readRecordsType = RecordsDynamicFunctions::GetRecordType();
@ -152,7 +152,7 @@ const char *RecordsDynamicFunctions::GetRecordModel(unsigned int index) noexcept
return "invalid"; return "invalid";
} }
const char *RecordsDynamicFunctions::GetRecordIcon(unsigned int index) noexcept extern "C" const char *RecordsDynamicFunctions::GetRecordIcon(unsigned int index) noexcept
{ {
unsigned short readRecordsType = RecordsDynamicFunctions::GetRecordType(); unsigned short readRecordsType = RecordsDynamicFunctions::GetRecordType();
@ -162,7 +162,7 @@ const char *RecordsDynamicFunctions::GetRecordIcon(unsigned int index) noexcept
return "invalid"; return "invalid";
} }
const char *RecordsDynamicFunctions::GetRecordScript(unsigned int index) noexcept extern "C" const char *RecordsDynamicFunctions::GetRecordScript(unsigned int index) noexcept
{ {
unsigned short readRecordsType = RecordsDynamicFunctions::GetRecordType(); unsigned short readRecordsType = RecordsDynamicFunctions::GetRecordType();
@ -172,7 +172,7 @@ const char *RecordsDynamicFunctions::GetRecordScript(unsigned int index) noexcep
return "invalid"; return "invalid";
} }
const char *RecordsDynamicFunctions::GetRecordEnchantmentId(unsigned int index) noexcept extern "C" const char *RecordsDynamicFunctions::GetRecordEnchantmentId(unsigned int index) noexcept
{ {
unsigned short readRecordsType = RecordsDynamicFunctions::GetRecordType(); unsigned short readRecordsType = RecordsDynamicFunctions::GetRecordType();
@ -188,7 +188,7 @@ const char *RecordsDynamicFunctions::GetRecordEnchantmentId(unsigned int index)
return "invalid"; return "invalid";
} }
int RecordsDynamicFunctions::GetRecordEnchantmentCharge(unsigned int index) noexcept extern "C" int RecordsDynamicFunctions::GetRecordEnchantmentCharge(unsigned int index) noexcept
{ {
unsigned short readRecordsType = RecordsDynamicFunctions::GetRecordType(); unsigned short readRecordsType = RecordsDynamicFunctions::GetRecordType();
@ -204,7 +204,7 @@ int RecordsDynamicFunctions::GetRecordEnchantmentCharge(unsigned int index) noex
return -1; return -1;
} }
int RecordsDynamicFunctions::GetRecordAutoCalc(unsigned int index) noexcept extern "C" int RecordsDynamicFunctions::GetRecordAutoCalc(unsigned int index) noexcept
{ {
unsigned short readRecordsType = RecordsDynamicFunctions::GetRecordType(); unsigned short readRecordsType = RecordsDynamicFunctions::GetRecordType();
@ -216,7 +216,7 @@ int RecordsDynamicFunctions::GetRecordAutoCalc(unsigned int index) noexcept
return -1; return -1;
} }
int RecordsDynamicFunctions::GetRecordCharge(unsigned int index) noexcept extern "C" int RecordsDynamicFunctions::GetRecordCharge(unsigned int index) noexcept
{ {
unsigned short readRecordsType = RecordsDynamicFunctions::GetRecordType(); unsigned short readRecordsType = RecordsDynamicFunctions::GetRecordType();
@ -226,7 +226,7 @@ int RecordsDynamicFunctions::GetRecordCharge(unsigned int index) noexcept
return -1; return -1;
} }
int RecordsDynamicFunctions::GetRecordCost(unsigned int index) noexcept extern "C" int RecordsDynamicFunctions::GetRecordCost(unsigned int index) noexcept
{ {
unsigned short readRecordsType = RecordsDynamicFunctions::GetRecordType(); unsigned short readRecordsType = RecordsDynamicFunctions::GetRecordType();
@ -238,7 +238,7 @@ int RecordsDynamicFunctions::GetRecordCost(unsigned int index) noexcept
return -1; return -1;
} }
int RecordsDynamicFunctions::GetRecordFlags(unsigned int index) noexcept extern "C" int RecordsDynamicFunctions::GetRecordFlags(unsigned int index) noexcept
{ {
unsigned short readRecordsType = RecordsDynamicFunctions::GetRecordType(); unsigned short readRecordsType = RecordsDynamicFunctions::GetRecordType();
@ -248,7 +248,7 @@ int RecordsDynamicFunctions::GetRecordFlags(unsigned int index) noexcept
return -1; return -1;
} }
int RecordsDynamicFunctions::GetRecordValue(unsigned int index) noexcept extern "C" int RecordsDynamicFunctions::GetRecordValue(unsigned int index) noexcept
{ {
unsigned short readRecordsType = RecordsDynamicFunctions::GetRecordType(); unsigned short readRecordsType = RecordsDynamicFunctions::GetRecordType();
@ -258,7 +258,7 @@ int RecordsDynamicFunctions::GetRecordValue(unsigned int index) noexcept
return -1; return -1;
} }
double RecordsDynamicFunctions::GetRecordWeight(unsigned int index) noexcept extern "C" double RecordsDynamicFunctions::GetRecordWeight(unsigned int index) noexcept
{ {
unsigned short readRecordsType = RecordsDynamicFunctions::GetRecordType(); unsigned short readRecordsType = RecordsDynamicFunctions::GetRecordType();
@ -268,52 +268,52 @@ double RecordsDynamicFunctions::GetRecordWeight(unsigned int index) noexcept
return -1; return -1;
} }
unsigned int RecordsDynamicFunctions::GetRecordEffectId(unsigned int recordIndex, unsigned int effectIndex) noexcept extern "C" unsigned int RecordsDynamicFunctions::GetRecordEffectId(unsigned int recordIndex, unsigned int effectIndex) noexcept
{ {
return GetRecordEffects(recordIndex).mList.at(effectIndex).mEffectID; return GetRecordEffects(recordIndex).mList.at(effectIndex).mEffectID;
} }
int RecordsDynamicFunctions::GetRecordEffectAttribute(unsigned int recordIndex, unsigned int effectIndex) noexcept extern "C" int RecordsDynamicFunctions::GetRecordEffectAttribute(unsigned int recordIndex, unsigned int effectIndex) noexcept
{ {
return GetRecordEffects(recordIndex).mList.at(effectIndex).mAttribute; return GetRecordEffects(recordIndex).mList.at(effectIndex).mAttribute;
} }
int RecordsDynamicFunctions::GetRecordEffectSkill(unsigned int recordIndex, unsigned int effectIndex) noexcept extern "C" int RecordsDynamicFunctions::GetRecordEffectSkill(unsigned int recordIndex, unsigned int effectIndex) noexcept
{ {
return GetRecordEffects(recordIndex).mList.at(effectIndex).mSkill; return GetRecordEffects(recordIndex).mList.at(effectIndex).mSkill;
} }
unsigned int RecordsDynamicFunctions::GetRecordEffectRangeType(unsigned int recordIndex, unsigned int effectIndex) noexcept extern "C" unsigned int RecordsDynamicFunctions::GetRecordEffectRangeType(unsigned int recordIndex, unsigned int effectIndex) noexcept
{ {
return GetRecordEffects(recordIndex).mList.at(effectIndex).mRange; return GetRecordEffects(recordIndex).mList.at(effectIndex).mRange;
} }
int RecordsDynamicFunctions::GetRecordEffectArea(unsigned int recordIndex, unsigned int effectIndex) noexcept extern "C" int RecordsDynamicFunctions::GetRecordEffectArea(unsigned int recordIndex, unsigned int effectIndex) noexcept
{ {
return GetRecordEffects(recordIndex).mList.at(effectIndex).mArea; return GetRecordEffects(recordIndex).mList.at(effectIndex).mArea;
} }
int RecordsDynamicFunctions::GetRecordEffectDuration(unsigned int recordIndex, unsigned int effectIndex) noexcept extern "C" int RecordsDynamicFunctions::GetRecordEffectDuration(unsigned int recordIndex, unsigned int effectIndex) noexcept
{ {
return GetRecordEffects(recordIndex).mList.at(effectIndex).mDuration; return GetRecordEffects(recordIndex).mList.at(effectIndex).mDuration;
} }
int RecordsDynamicFunctions::GetRecordEffectMagnitudeMax(unsigned int recordIndex, unsigned int effectIndex) noexcept extern "C" int RecordsDynamicFunctions::GetRecordEffectMagnitudeMax(unsigned int recordIndex, unsigned int effectIndex) noexcept
{ {
return GetRecordEffects(recordIndex).mList.at(effectIndex).mMagnMax; return GetRecordEffects(recordIndex).mList.at(effectIndex).mMagnMax;
} }
int RecordsDynamicFunctions::GetRecordEffectMagnitudeMin(unsigned int recordIndex, unsigned int effectIndex) noexcept extern "C" int RecordsDynamicFunctions::GetRecordEffectMagnitudeMin(unsigned int recordIndex, unsigned int effectIndex) noexcept
{ {
return GetRecordEffects(recordIndex).mList.at(effectIndex).mMagnMin; return GetRecordEffects(recordIndex).mList.at(effectIndex).mMagnMin;
} }
void RecordsDynamicFunctions::SetRecordType(unsigned int type) noexcept extern "C" void RecordsDynamicFunctions::SetRecordType(unsigned int type) noexcept
{ {
WorldstateFunctions::writeWorldstate.recordsType = type; WorldstateFunctions::writeWorldstate.recordsType = type;
} }
void RecordsDynamicFunctions::SetRecordId(const char* id) noexcept extern "C" void RecordsDynamicFunctions::SetRecordId(const char* id) noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -342,7 +342,7 @@ void RecordsDynamicFunctions::SetRecordId(const char* id) noexcept
LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, "Tried to set id for record type %i which lacks that property", writeRecordsType); LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, "Tried to set id for record type %i which lacks that property", writeRecordsType);
} }
void RecordsDynamicFunctions::SetRecordBaseId(const char* baseId) noexcept extern "C" void RecordsDynamicFunctions::SetRecordBaseId(const char* baseId) noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -370,7 +370,7 @@ void RecordsDynamicFunctions::SetRecordBaseId(const char* baseId) noexcept
LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, "Tried to set baseId for record type %i which lacks that property", writeRecordsType); LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, "Tried to set baseId for record type %i which lacks that property", writeRecordsType);
} }
void RecordsDynamicFunctions::SetRecordInventoryBaseId(const char* inventoryBaseId) noexcept extern "C" void RecordsDynamicFunctions::SetRecordInventoryBaseId(const char* inventoryBaseId) noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -382,7 +382,7 @@ void RecordsDynamicFunctions::SetRecordInventoryBaseId(const char* inventoryBase
LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, "Tried to set inventoryBaseId for record type %i which lacks that property", writeRecordsType); LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, "Tried to set inventoryBaseId for record type %i which lacks that property", writeRecordsType);
} }
void RecordsDynamicFunctions::SetRecordSubtype(unsigned int subtype) noexcept extern "C" void RecordsDynamicFunctions::SetRecordSubtype(unsigned int subtype) noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -407,7 +407,7 @@ void RecordsDynamicFunctions::SetRecordSubtype(unsigned int subtype) noexcept
tempOverrides.hasSubtype = true; tempOverrides.hasSubtype = true;
} }
void RecordsDynamicFunctions::SetRecordName(const char* name) noexcept extern "C" void RecordsDynamicFunctions::SetRecordName(const char* name) noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -438,7 +438,7 @@ void RecordsDynamicFunctions::SetRecordName(const char* name) noexcept
tempOverrides.hasName = true; tempOverrides.hasName = true;
} }
void RecordsDynamicFunctions::SetRecordModel(const char* model) noexcept extern "C" void RecordsDynamicFunctions::SetRecordModel(const char* model) noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -467,7 +467,7 @@ void RecordsDynamicFunctions::SetRecordModel(const char* model) noexcept
tempOverrides.hasModel = true; tempOverrides.hasModel = true;
} }
void RecordsDynamicFunctions::SetRecordIcon(const char* icon) noexcept extern "C" void RecordsDynamicFunctions::SetRecordIcon(const char* icon) noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -492,7 +492,7 @@ void RecordsDynamicFunctions::SetRecordIcon(const char* icon) noexcept
tempOverrides.hasIcon = true; tempOverrides.hasIcon = true;
} }
void RecordsDynamicFunctions::SetRecordScript(const char* script) noexcept extern "C" void RecordsDynamicFunctions::SetRecordScript(const char* script) noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -521,7 +521,7 @@ void RecordsDynamicFunctions::SetRecordScript(const char* script) noexcept
tempOverrides.hasScript = true; tempOverrides.hasScript = true;
} }
void RecordsDynamicFunctions::SetRecordEnchantmentId(const char* enchantmentId) noexcept extern "C" void RecordsDynamicFunctions::SetRecordEnchantmentId(const char* enchantmentId) noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -542,7 +542,7 @@ void RecordsDynamicFunctions::SetRecordEnchantmentId(const char* enchantmentId)
tempOverrides.hasEnchantmentId = true; tempOverrides.hasEnchantmentId = true;
} }
void RecordsDynamicFunctions::SetRecordEnchantmentCharge(int enchantmentCharge) noexcept extern "C" void RecordsDynamicFunctions::SetRecordEnchantmentCharge(int enchantmentCharge) noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -563,7 +563,7 @@ void RecordsDynamicFunctions::SetRecordEnchantmentCharge(int enchantmentCharge)
tempOverrides.hasEnchantmentCharge = true; tempOverrides.hasEnchantmentCharge = true;
} }
void RecordsDynamicFunctions::SetRecordAutoCalc(int autoCalc) noexcept extern "C" void RecordsDynamicFunctions::SetRecordAutoCalc(int autoCalc) noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -593,7 +593,7 @@ void RecordsDynamicFunctions::SetRecordAutoCalc(int autoCalc) noexcept
tempOverrides.hasAutoCalc = true; tempOverrides.hasAutoCalc = true;
} }
void RecordsDynamicFunctions::SetRecordCharge(int charge) noexcept extern "C" void RecordsDynamicFunctions::SetRecordCharge(int charge) noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -608,7 +608,7 @@ void RecordsDynamicFunctions::SetRecordCharge(int charge) noexcept
tempOverrides.hasCharge = true; tempOverrides.hasCharge = true;
} }
void RecordsDynamicFunctions::SetRecordCost(int cost) noexcept extern "C" void RecordsDynamicFunctions::SetRecordCost(int cost) noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -625,7 +625,7 @@ void RecordsDynamicFunctions::SetRecordCost(int cost) noexcept
tempOverrides.hasCost = true; tempOverrides.hasCost = true;
} }
void RecordsDynamicFunctions::SetRecordFlags(int flags) noexcept extern "C" void RecordsDynamicFunctions::SetRecordFlags(int flags) noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -646,7 +646,7 @@ void RecordsDynamicFunctions::SetRecordFlags(int flags) noexcept
tempOverrides.hasFlags = true; tempOverrides.hasFlags = true;
} }
void RecordsDynamicFunctions::SetRecordValue(int value) noexcept extern "C" void RecordsDynamicFunctions::SetRecordValue(int value) noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -671,7 +671,7 @@ void RecordsDynamicFunctions::SetRecordValue(int value) noexcept
tempOverrides.hasValue = true; tempOverrides.hasValue = true;
} }
void RecordsDynamicFunctions::SetRecordWeight(double weight) noexcept extern "C" void RecordsDynamicFunctions::SetRecordWeight(double weight) noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -696,7 +696,7 @@ void RecordsDynamicFunctions::SetRecordWeight(double weight) noexcept
tempOverrides.hasWeight = true; tempOverrides.hasWeight = true;
} }
void RecordsDynamicFunctions::SetRecordArmorRating(int armorRating) noexcept extern "C" void RecordsDynamicFunctions::SetRecordArmorRating(int armorRating) noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -711,7 +711,7 @@ void RecordsDynamicFunctions::SetRecordArmorRating(int armorRating) noexcept
tempOverrides.hasArmorRating = true; tempOverrides.hasArmorRating = true;
} }
void RecordsDynamicFunctions::SetRecordHealth(int health) noexcept extern "C" void RecordsDynamicFunctions::SetRecordHealth(int health) noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -732,7 +732,7 @@ void RecordsDynamicFunctions::SetRecordHealth(int health) noexcept
tempOverrides.hasHealth = true; tempOverrides.hasHealth = true;
} }
void RecordsDynamicFunctions::SetRecordDamageChop(unsigned int minDamage, unsigned int maxDamage) noexcept extern "C" void RecordsDynamicFunctions::SetRecordDamageChop(unsigned int minDamage, unsigned int maxDamage) noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -750,7 +750,7 @@ void RecordsDynamicFunctions::SetRecordDamageChop(unsigned int minDamage, unsign
tempOverrides.hasDamageChop = true; tempOverrides.hasDamageChop = true;
} }
void RecordsDynamicFunctions::SetRecordDamageSlash(unsigned int minDamage, unsigned int maxDamage) noexcept extern "C" void RecordsDynamicFunctions::SetRecordDamageSlash(unsigned int minDamage, unsigned int maxDamage) noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -768,7 +768,7 @@ void RecordsDynamicFunctions::SetRecordDamageSlash(unsigned int minDamage, unsig
tempOverrides.hasDamageSlash = true; tempOverrides.hasDamageSlash = true;
} }
void RecordsDynamicFunctions::SetRecordDamageThrust(unsigned int minDamage, unsigned int maxDamage) noexcept extern "C" void RecordsDynamicFunctions::SetRecordDamageThrust(unsigned int minDamage, unsigned int maxDamage) noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -786,7 +786,7 @@ void RecordsDynamicFunctions::SetRecordDamageThrust(unsigned int minDamage, unsi
tempOverrides.hasDamageThrust = true; tempOverrides.hasDamageThrust = true;
} }
void RecordsDynamicFunctions::SetRecordReach(double reach) noexcept extern "C" void RecordsDynamicFunctions::SetRecordReach(double reach) noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -801,7 +801,7 @@ void RecordsDynamicFunctions::SetRecordReach(double reach) noexcept
tempOverrides.hasReach = true; tempOverrides.hasReach = true;
} }
void RecordsDynamicFunctions::SetRecordSpeed(double speed) noexcept extern "C" void RecordsDynamicFunctions::SetRecordSpeed(double speed) noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -816,7 +816,7 @@ void RecordsDynamicFunctions::SetRecordSpeed(double speed) noexcept
tempOverrides.hasSpeed = true; tempOverrides.hasSpeed = true;
} }
void RecordsDynamicFunctions::SetRecordKeyState(bool keyState) noexcept extern "C" void RecordsDynamicFunctions::SetRecordKeyState(bool keyState) noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -831,7 +831,7 @@ void RecordsDynamicFunctions::SetRecordKeyState(bool keyState) noexcept
tempOverrides.hasKeyState = true; tempOverrides.hasKeyState = true;
} }
void RecordsDynamicFunctions::SetRecordScrollState(bool scrollState) noexcept extern "C" void RecordsDynamicFunctions::SetRecordScrollState(bool scrollState) noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -846,7 +846,7 @@ void RecordsDynamicFunctions::SetRecordScrollState(bool scrollState) noexcept
tempOverrides.hasScrollState = true; tempOverrides.hasScrollState = true;
} }
void RecordsDynamicFunctions::SetRecordSkillId(int skillId) noexcept extern "C" void RecordsDynamicFunctions::SetRecordSkillId(int skillId) noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -861,7 +861,7 @@ void RecordsDynamicFunctions::SetRecordSkillId(int skillId) noexcept
tempOverrides.hasSkillId = true; tempOverrides.hasSkillId = true;
} }
void RecordsDynamicFunctions::SetRecordText(const char* text) noexcept extern "C" void RecordsDynamicFunctions::SetRecordText(const char* text) noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -876,7 +876,7 @@ void RecordsDynamicFunctions::SetRecordText(const char* text) noexcept
tempOverrides.hasText = true; tempOverrides.hasText = true;
} }
void RecordsDynamicFunctions::SetRecordHair(const char* hair) noexcept extern "C" void RecordsDynamicFunctions::SetRecordHair(const char* hair) noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -891,7 +891,7 @@ void RecordsDynamicFunctions::SetRecordHair(const char* hair) noexcept
tempOverrides.hasHair = true; tempOverrides.hasHair = true;
} }
void RecordsDynamicFunctions::SetRecordHead(const char* head) noexcept extern "C" void RecordsDynamicFunctions::SetRecordHead(const char* head) noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -906,7 +906,7 @@ void RecordsDynamicFunctions::SetRecordHead(const char* head) noexcept
tempOverrides.hasHead = true; tempOverrides.hasHead = true;
} }
void RecordsDynamicFunctions::SetRecordGender(unsigned int gender) noexcept extern "C" void RecordsDynamicFunctions::SetRecordGender(unsigned int gender) noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -923,7 +923,7 @@ void RecordsDynamicFunctions::SetRecordGender(unsigned int gender) noexcept
tempOverrides.hasGender = true; tempOverrides.hasGender = true;
} }
void RecordsDynamicFunctions::SetRecordRace(const char* race) noexcept extern "C" void RecordsDynamicFunctions::SetRecordRace(const char* race) noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -933,7 +933,7 @@ void RecordsDynamicFunctions::SetRecordRace(const char* race) noexcept
LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, "Tried to set race for record type %i which lacks that property", writeRecordsType); LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, "Tried to set race for record type %i which lacks that property", writeRecordsType);
} }
void RecordsDynamicFunctions::SetRecordClass(const char* charClass) noexcept extern "C" void RecordsDynamicFunctions::SetRecordClass(const char* charClass) noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -943,7 +943,7 @@ void RecordsDynamicFunctions::SetRecordClass(const char* charClass) noexcept
LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, "Tried to set character class for record type %i which lacks that property", writeRecordsType); LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, "Tried to set character class for record type %i which lacks that property", writeRecordsType);
} }
void RecordsDynamicFunctions::SetRecordFaction(const char* faction) noexcept extern "C" void RecordsDynamicFunctions::SetRecordFaction(const char* faction) noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -958,7 +958,7 @@ void RecordsDynamicFunctions::SetRecordFaction(const char* faction) noexcept
tempOverrides.hasFaction = true; tempOverrides.hasFaction = true;
} }
void RecordsDynamicFunctions::SetRecordLevel(int level) noexcept extern "C" void RecordsDynamicFunctions::SetRecordLevel(int level) noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -975,7 +975,7 @@ void RecordsDynamicFunctions::SetRecordLevel(int level) noexcept
tempOverrides.hasLevel = true; tempOverrides.hasLevel = true;
} }
void RecordsDynamicFunctions::SetRecordMagicka(int magicka) noexcept extern "C" void RecordsDynamicFunctions::SetRecordMagicka(int magicka) noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -992,7 +992,7 @@ void RecordsDynamicFunctions::SetRecordMagicka(int magicka) noexcept
tempOverrides.hasMagicka = true; tempOverrides.hasMagicka = true;
} }
void RecordsDynamicFunctions::SetRecordFatigue(int fatigue) noexcept extern "C" void RecordsDynamicFunctions::SetRecordFatigue(int fatigue) noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -1009,7 +1009,7 @@ void RecordsDynamicFunctions::SetRecordFatigue(int fatigue) noexcept
tempOverrides.hasFatigue = true; tempOverrides.hasFatigue = true;
} }
void RecordsDynamicFunctions::SetRecordAIFight(int aiFight) noexcept extern "C" void RecordsDynamicFunctions::SetRecordAIFight(int aiFight) noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -1026,7 +1026,7 @@ void RecordsDynamicFunctions::SetRecordAIFight(int aiFight) noexcept
tempOverrides.hasAiFight = true; tempOverrides.hasAiFight = true;
} }
void RecordsDynamicFunctions::SetRecordIdByIndex(unsigned int index, const char* id) noexcept extern "C" void RecordsDynamicFunctions::SetRecordIdByIndex(unsigned int index, const char* id) noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -1048,7 +1048,7 @@ void RecordsDynamicFunctions::SetRecordIdByIndex(unsigned int index, const char*
LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, "Tried to set id for record type %i which lacks that property", writeRecordsType); LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, "Tried to set id for record type %i which lacks that property", writeRecordsType);
} }
void RecordsDynamicFunctions::SetRecordEnchantmentIdByIndex(unsigned int index, const char* enchantmentId) noexcept extern "C" void RecordsDynamicFunctions::SetRecordEnchantmentIdByIndex(unsigned int index, const char* enchantmentId) noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -1064,72 +1064,72 @@ void RecordsDynamicFunctions::SetRecordEnchantmentIdByIndex(unsigned int index,
LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, "Tried to set enchantmentId for record type %i which lacks that property", writeRecordsType); LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, "Tried to set enchantmentId for record type %i which lacks that property", writeRecordsType);
} }
void RecordsDynamicFunctions::SetRecordEffectId(unsigned int effectId) noexcept extern "C" void RecordsDynamicFunctions::SetRecordEffectId(unsigned int effectId) noexcept
{ {
tempEffect.mEffectID = effectId; tempEffect.mEffectID = effectId;
} }
void RecordsDynamicFunctions::SetRecordEffectAttribute(int attributeId) noexcept extern "C" void RecordsDynamicFunctions::SetRecordEffectAttribute(int attributeId) noexcept
{ {
tempEffect.mAttribute = attributeId; tempEffect.mAttribute = attributeId;
} }
void RecordsDynamicFunctions::SetRecordEffectSkill(int skillId) noexcept extern "C" void RecordsDynamicFunctions::SetRecordEffectSkill(int skillId) noexcept
{ {
tempEffect.mSkill = skillId; tempEffect.mSkill = skillId;
} }
void RecordsDynamicFunctions::SetRecordEffectRangeType(unsigned int rangeType) noexcept extern "C" void RecordsDynamicFunctions::SetRecordEffectRangeType(unsigned int rangeType) noexcept
{ {
tempEffect.mRange = rangeType; tempEffect.mRange = rangeType;
} }
void RecordsDynamicFunctions::SetRecordEffectArea(int area) noexcept extern "C" void RecordsDynamicFunctions::SetRecordEffectArea(int area) noexcept
{ {
tempEffect.mArea = area; tempEffect.mArea = area;
} }
void RecordsDynamicFunctions::SetRecordEffectDuration(int duration) noexcept extern "C" void RecordsDynamicFunctions::SetRecordEffectDuration(int duration) noexcept
{ {
tempEffect.mDuration = duration; tempEffect.mDuration = duration;
} }
void RecordsDynamicFunctions::SetRecordEffectMagnitudeMax(int magnitudeMax) noexcept extern "C" void RecordsDynamicFunctions::SetRecordEffectMagnitudeMax(int magnitudeMax) noexcept
{ {
tempEffect.mMagnMax = magnitudeMax; tempEffect.mMagnMax = magnitudeMax;
} }
void RecordsDynamicFunctions::SetRecordEffectMagnitudeMin(int magnitudeMin) noexcept extern "C" void RecordsDynamicFunctions::SetRecordEffectMagnitudeMin(int magnitudeMin) noexcept
{ {
tempEffect.mMagnMin = magnitudeMin; tempEffect.mMagnMin = magnitudeMin;
} }
void RecordsDynamicFunctions::SetRecordBodyPartType(unsigned int partType) noexcept extern "C" void RecordsDynamicFunctions::SetRecordBodyPartType(unsigned int partType) noexcept
{ {
tempBodyPart.mPart = partType; tempBodyPart.mPart = partType;
} }
void RecordsDynamicFunctions::SetRecordBodyPartIdForMale(const char* partId) noexcept extern "C" void RecordsDynamicFunctions::SetRecordBodyPartIdForMale(const char* partId) noexcept
{ {
tempBodyPart.mMale = partId; tempBodyPart.mMale = partId;
} }
void RecordsDynamicFunctions::SetRecordBodyPartIdForFemale(const char* partId) noexcept extern "C" void RecordsDynamicFunctions::SetRecordBodyPartIdForFemale(const char* partId) noexcept
{ {
tempBodyPart.mFemale = partId; tempBodyPart.mFemale = partId;
} }
void RecordsDynamicFunctions::SetRecordInventoryItemId(const char* itemId) noexcept extern "C" void RecordsDynamicFunctions::SetRecordInventoryItemId(const char* itemId) noexcept
{ {
tempInventoryItem.refId = itemId; tempInventoryItem.refId = itemId;
} }
void RecordsDynamicFunctions::SetRecordInventoryItemCount(unsigned int count) noexcept extern "C" void RecordsDynamicFunctions::SetRecordInventoryItemCount(unsigned int count) noexcept
{ {
tempInventoryItem.count = count; tempInventoryItem.count = count;
} }
void RecordsDynamicFunctions::AddRecord() noexcept extern "C" void RecordsDynamicFunctions::AddRecord() noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -1197,7 +1197,7 @@ void RecordsDynamicFunctions::AddRecord() noexcept
tempOverrides = {}; tempOverrides = {};
} }
void RecordsDynamicFunctions::AddRecordEffect() noexcept extern "C" void RecordsDynamicFunctions::AddRecordEffect() noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -1212,7 +1212,7 @@ void RecordsDynamicFunctions::AddRecordEffect() noexcept
tempEffect = {}; tempEffect = {};
} }
void RecordsDynamicFunctions::AddRecordBodyPart() noexcept extern "C" void RecordsDynamicFunctions::AddRecordBodyPart() noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -1225,7 +1225,7 @@ void RecordsDynamicFunctions::AddRecordBodyPart() noexcept
tempBodyPart = {}; tempBodyPart = {};
} }
void RecordsDynamicFunctions::AddRecordInventoryItem() noexcept extern "C" void RecordsDynamicFunctions::AddRecordInventoryItem() noexcept
{ {
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType; unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -1238,7 +1238,7 @@ void RecordsDynamicFunctions::AddRecordInventoryItem() noexcept
tempInventoryItem = {}; tempInventoryItem = {};
} }
void RecordsDynamicFunctions::SendRecordDynamic(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept extern "C" void RecordsDynamicFunctions::SendRecordDynamic(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );

View file

@ -3,6 +3,8 @@
#include "../Types.hpp" #include "../Types.hpp"
#include <Script/Platform.hpp>
#define RECORDSDYNAMICAPI \ #define RECORDSDYNAMICAPI \
{"ClearRecords", RecordsDynamicFunctions::ClearRecords},\ {"ClearRecords", RecordsDynamicFunctions::ClearRecords},\
\ \
@ -110,16 +112,14 @@
\ \
{"SendRecordDynamic", RecordsDynamicFunctions::SendRecordDynamic} {"SendRecordDynamic", RecordsDynamicFunctions::SendRecordDynamic}
class RecordsDynamicFunctions namespace RecordsDynamicFunctions
{ {
public:
/** /**
* \brief Clear the data from the records stored on the server. * \brief Clear the data from the records stored on the server.
* *
* \return void * \return void
*/ */
static void ClearRecords() noexcept; EXPORT_APIFUNCTION void CDECL ClearRecords() noexcept;
/** /**
* \brief Get the type of records in the read worldstate's dynamic records. * \brief Get the type of records in the read worldstate's dynamic records.
@ -127,14 +127,14 @@ public:
* \return The type of records (0 for SPELL, 1 for POTION, 2 for ENCHANTMENT, * \return The type of records (0 for SPELL, 1 for POTION, 2 for ENCHANTMENT,
* 3 for NPC). * 3 for NPC).
*/ */
static unsigned short GetRecordType() noexcept; EXPORT_APIFUNCTION unsigned short CDECL GetRecordType() noexcept;
/** /**
* \brief Get the number of records in the read worldstate's dynamic records. * \brief Get the number of records in the read worldstate's dynamic records.
* *
* \return The number of records. * \return The number of records.
*/ */
static unsigned int GetRecordCount() noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetRecordCount() noexcept;
/** /**
* \brief Get the number of effects for the record at a certain index in the read * \brief Get the number of effects for the record at a certain index in the read
@ -143,7 +143,7 @@ public:
* \param recordIndex The index of the record. * \param recordIndex The index of the record.
* \return The number of effects. * \return The number of effects.
*/ */
static unsigned int GetRecordEffectCount(unsigned int recordIndex) noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetRecordEffectCount(unsigned int recordIndex) noexcept;
/** /**
* \brief Get the id of the record at a certain index in the read worldstate's * \brief Get the id of the record at a certain index in the read worldstate's
@ -152,7 +152,7 @@ public:
* \param index The index of the record. * \param index The index of the record.
* \return The id of the record. * \return The id of the record.
*/ */
static const char *GetRecordId(unsigned int index) noexcept; EXPORT_APIFUNCTION const char *CDECL GetRecordId(unsigned int index) noexcept;
/** /**
* \brief Get the base id (i.e. the id this record should inherit default * \brief Get the base id (i.e. the id this record should inherit default
@ -162,7 +162,7 @@ public:
* \param index The index of the record. * \param index The index of the record.
* \return The base id of the record. * \return The base id of the record.
*/ */
static const char *GetRecordBaseId(unsigned int index) noexcept; EXPORT_APIFUNCTION const char *CDECL GetRecordBaseId(unsigned int index) noexcept;
/** /**
* \brief Get the subtype of the record at a certain index in the read worldstate's * \brief Get the subtype of the record at a certain index in the read worldstate's
@ -171,7 +171,7 @@ public:
* \param index The index of the record. * \param index The index of the record.
* \return The type of the record. * \return The type of the record.
*/ */
static int GetRecordSubtype(unsigned int index) noexcept; EXPORT_APIFUNCTION int CDECL GetRecordSubtype(unsigned int index) noexcept;
/** /**
* \brief Get the name of the record at a certain index in the read worldstate's * \brief Get the name of the record at a certain index in the read worldstate's
@ -180,7 +180,7 @@ public:
* \param index The index of the record. * \param index The index of the record.
* \return The name of the record. * \return The name of the record.
*/ */
static const char *GetRecordName(unsigned int index) noexcept; EXPORT_APIFUNCTION const char *CDECL GetRecordName(unsigned int index) noexcept;
/** /**
* \brief Get the model of the record at a certain index in the read worldstate's * \brief Get the model of the record at a certain index in the read worldstate's
@ -189,7 +189,7 @@ public:
* \param index The index of the record. * \param index The index of the record.
* \return The model of the record. * \return The model of the record.
*/ */
static const char *GetRecordModel(unsigned int index) noexcept; EXPORT_APIFUNCTION const char *CDECL GetRecordModel(unsigned int index) noexcept;
/** /**
* \brief Get the icon of the record at a certain index in the read worldstate's * \brief Get the icon of the record at a certain index in the read worldstate's
@ -198,7 +198,7 @@ public:
* \param index The index of the record. * \param index The index of the record.
* \return The icon of the record. * \return The icon of the record.
*/ */
static const char *GetRecordIcon(unsigned int index) noexcept; EXPORT_APIFUNCTION const char *CDECL GetRecordIcon(unsigned int index) noexcept;
/** /**
* \brief Get the script of the record at a certain index in the read worldstate's * \brief Get the script of the record at a certain index in the read worldstate's
@ -207,7 +207,7 @@ public:
* \param index The index of the record. * \param index The index of the record.
* \return The script of the record. * \return The script of the record.
*/ */
static const char *GetRecordScript(unsigned int index) noexcept; EXPORT_APIFUNCTION const char *CDECL GetRecordScript(unsigned int index) noexcept;
/** /**
* \brief Get the enchantment id of the record at a certain index in the read * \brief Get the enchantment id of the record at a certain index in the read
@ -216,7 +216,7 @@ public:
* \param index The index of the record. * \param index The index of the record.
* \return The enchantment id of the record. * \return The enchantment id of the record.
*/ */
static const char *GetRecordEnchantmentId(unsigned int index) noexcept; EXPORT_APIFUNCTION const char *CDECL GetRecordEnchantmentId(unsigned int index) noexcept;
/** /**
* \brief Get the enchantment charge of the record at a certain index in * \brief Get the enchantment charge of the record at a certain index in
@ -225,7 +225,7 @@ public:
* \param index The index of the record. * \param index The index of the record.
* \return The enchantment charge of the record. * \return The enchantment charge of the record.
*/ */
static int GetRecordEnchantmentCharge(unsigned int index) noexcept; EXPORT_APIFUNCTION int CDECL GetRecordEnchantmentCharge(unsigned int index) noexcept;
/** /**
* \brief Get the auto-calculation flag value of the record at a certain index in * \brief Get the auto-calculation flag value of the record at a certain index in
@ -234,7 +234,7 @@ public:
* \param index The index of the record. * \param index The index of the record.
* \return The auto-calculation flag value of the record. * \return The auto-calculation flag value of the record.
*/ */
static int GetRecordAutoCalc(unsigned int index) noexcept; EXPORT_APIFUNCTION int CDECL GetRecordAutoCalc(unsigned int index) noexcept;
/** /**
* \brief Get the charge of the record at a certain index in the read worldstate's * \brief Get the charge of the record at a certain index in the read worldstate's
@ -243,7 +243,7 @@ public:
* \param index The index of the record. * \param index The index of the record.
* \return The charge of the record. * \return The charge of the record.
*/ */
static int GetRecordCharge(unsigned int index) noexcept; EXPORT_APIFUNCTION int CDECL GetRecordCharge(unsigned int index) noexcept;
/** /**
* \brief Get the cost of the record at a certain index in the read worldstate's * \brief Get the cost of the record at a certain index in the read worldstate's
@ -252,7 +252,7 @@ public:
* \param index The index of the record. * \param index The index of the record.
* \return The cost of the record. * \return The cost of the record.
*/ */
static int GetRecordCost(unsigned int index) noexcept; EXPORT_APIFUNCTION int CDECL GetRecordCost(unsigned int index) noexcept;
/** /**
* \brief Get the flags of the record at a certain index in the read worldstate's * \brief Get the flags of the record at a certain index in the read worldstate's
@ -261,7 +261,7 @@ public:
* \param index The index of the record. * \param index The index of the record.
* \return The flags of the spell as an integer. * \return The flags of the spell as an integer.
*/ */
static int GetRecordFlags(unsigned int index) noexcept; EXPORT_APIFUNCTION int CDECL GetRecordFlags(unsigned int index) noexcept;
/** /**
* \brief Get the value of the record at a certain index in the read worldstate's * \brief Get the value of the record at a certain index in the read worldstate's
@ -270,7 +270,7 @@ public:
* \param index The index of the record. * \param index The index of the record.
* \return The value of the record. * \return The value of the record.
*/ */
static int GetRecordValue(unsigned int index) noexcept; EXPORT_APIFUNCTION int CDECL GetRecordValue(unsigned int index) noexcept;
/** /**
* \brief Get the weight of the record at a certain index in the read worldstate's * \brief Get the weight of the record at a certain index in the read worldstate's
@ -279,7 +279,7 @@ public:
* \param index The index of the record. * \param index The index of the record.
* \return The weight of the record. * \return The weight of the record.
*/ */
static double GetRecordWeight(unsigned int index) noexcept; EXPORT_APIFUNCTION double CDECL GetRecordWeight(unsigned int index) noexcept;
/** /**
* \brief Get the ID of the effect at a certain index in the read worldstate's * \brief Get the ID of the effect at a certain index in the read worldstate's
@ -289,7 +289,7 @@ public:
* \param effectIndex The index of the effect. * \param effectIndex The index of the effect.
* \return The ID of the effect. * \return The ID of the effect.
*/ */
static unsigned int GetRecordEffectId(unsigned int recordIndex, unsigned int effectIndex) noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetRecordEffectId(unsigned int recordIndex, unsigned int effectIndex) noexcept;
/** /**
* \brief Get the ID of the attribute modified by the effect at a certain index in the * \brief Get the ID of the attribute modified by the effect at a certain index in the
@ -299,7 +299,7 @@ public:
* \param effectIndex The index of the effect. * \param effectIndex The index of the effect.
* \return The attribute ID for the effect. * \return The attribute ID for the effect.
*/ */
static int GetRecordEffectAttribute(unsigned int recordIndex, unsigned int effectIndex) noexcept; EXPORT_APIFUNCTION int CDECL GetRecordEffectAttribute(unsigned int recordIndex, unsigned int effectIndex) noexcept;
/** /**
* \brief Get the ID of the skill modified by the effect at a certain index in the * \brief Get the ID of the skill modified by the effect at a certain index in the
@ -309,7 +309,7 @@ public:
* \param effectIndex The index of the effect. * \param effectIndex The index of the effect.
* \return The skill ID for the effect. * \return The skill ID for the effect.
*/ */
static int GetRecordEffectSkill(unsigned int recordIndex, unsigned int effectIndex) noexcept; EXPORT_APIFUNCTION int CDECL GetRecordEffectSkill(unsigned int recordIndex, unsigned int effectIndex) noexcept;
/** /**
* \brief Get the range type of the effect at a certain index in the read worldstate's * \brief Get the range type of the effect at a certain index in the read worldstate's
@ -319,7 +319,7 @@ public:
* \param effectIndex The index of the effect. * \param effectIndex The index of the effect.
* \return The range of the effect. * \return The range of the effect.
*/ */
static unsigned int GetRecordEffectRangeType(unsigned int recordIndex, unsigned int effectIndex) noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetRecordEffectRangeType(unsigned int recordIndex, unsigned int effectIndex) noexcept;
/** /**
* \brief Get the area of the effect at a certain index in the read worldstate's current * \brief Get the area of the effect at a certain index in the read worldstate's current
@ -329,7 +329,7 @@ public:
* \param effectIndex The index of the effect. * \param effectIndex The index of the effect.
* \return The area of the effect. * \return The area of the effect.
*/ */
static int GetRecordEffectArea(unsigned int recordIndex, unsigned int effectIndex) noexcept; EXPORT_APIFUNCTION int CDECL GetRecordEffectArea(unsigned int recordIndex, unsigned int effectIndex) noexcept;
/** /**
* \brief Get the duration of the effect at a certain index in the read worldstate's current * \brief Get the duration of the effect at a certain index in the read worldstate's current
@ -339,7 +339,7 @@ public:
* \param effectIndex The index of the effect. * \param effectIndex The index of the effect.
* \return The duration of the effect. * \return The duration of the effect.
*/ */
static int GetRecordEffectDuration(unsigned int recordIndex, unsigned int effectIndex) noexcept; EXPORT_APIFUNCTION int CDECL GetRecordEffectDuration(unsigned int recordIndex, unsigned int effectIndex) noexcept;
/** /**
* \brief Get the maximum magnitude of the effect at a certain index in the read * \brief Get the maximum magnitude of the effect at a certain index in the read
@ -349,7 +349,7 @@ public:
* \param effectIndex The index of the effect. * \param effectIndex The index of the effect.
* \return The maximum magnitude of the effect. * \return The maximum magnitude of the effect.
*/ */
static int GetRecordEffectMagnitudeMax(unsigned int recordIndex, unsigned int effectIndex) noexcept; EXPORT_APIFUNCTION int CDECL GetRecordEffectMagnitudeMax(unsigned int recordIndex, unsigned int effectIndex) noexcept;
/** /**
* \brief Get the minimum magnitude of the effect at a certain index in the read * \brief Get the minimum magnitude of the effect at a certain index in the read
@ -359,7 +359,7 @@ public:
* \param effectIndex The index of the effect. * \param effectIndex The index of the effect.
* \return The minimum magnitude of the effect. * \return The minimum magnitude of the effect.
*/ */
static int GetRecordEffectMagnitudeMin(unsigned int recordIndex, unsigned int effectIndex) noexcept; EXPORT_APIFUNCTION int CDECL GetRecordEffectMagnitudeMin(unsigned int recordIndex, unsigned int effectIndex) noexcept;
/** /**
* \brief Set which type of temporary records stored on the server should have * \brief Set which type of temporary records stored on the server should have
@ -368,7 +368,7 @@ public:
* \param type The type of records. * \param type The type of records.
* \return void * \return void
*/ */
static void SetRecordType(unsigned int type) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordType(unsigned int type) noexcept;
/** /**
* \brief Set the id of the temporary record stored on the server for the * \brief Set the id of the temporary record stored on the server for the
@ -377,7 +377,7 @@ public:
* \param id The id of the record. * \param id The id of the record.
* \return void * \return void
*/ */
static void SetRecordId(const char* id) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordId(const char* id) noexcept;
/** /**
* \brief Set the base id (i.e. the id this record should inherit default * \brief Set the base id (i.e. the id this record should inherit default
@ -387,7 +387,7 @@ public:
* \param baseId The baseId of the record. * \param baseId The baseId of the record.
* \return void * \return void
*/ */
static void SetRecordBaseId(const char* baseId) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordBaseId(const char* baseId) noexcept;
/** /**
* \brief Set the inventory base id (i.e. the id this record should inherit * \brief Set the inventory base id (i.e. the id this record should inherit
@ -397,7 +397,7 @@ public:
* \param inventoryBaseId The inventoryBaseId of the record. * \param inventoryBaseId The inventoryBaseId of the record.
* \return void * \return void
*/ */
static void SetRecordInventoryBaseId(const char* inventoryBaseId) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordInventoryBaseId(const char* inventoryBaseId) noexcept;
/** /**
* \brief Set the subtype of the temporary record stored on the server for * \brief Set the subtype of the temporary record stored on the server for
@ -406,7 +406,7 @@ public:
* \param type The spell type. * \param type The spell type.
* \return void * \return void
*/ */
static void SetRecordSubtype(unsigned int subtype) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordSubtype(unsigned int subtype) noexcept;
/** /**
* \brief Set the name of the temporary record stored on the server for the * \brief Set the name of the temporary record stored on the server for the
@ -415,7 +415,7 @@ public:
* \param name The name of the record. * \param name The name of the record.
* \return void * \return void
*/ */
static void SetRecordName(const char* name) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordName(const char* name) noexcept;
/** /**
* \brief Set the model of the temporary record stored on the server for the * \brief Set the model of the temporary record stored on the server for the
@ -424,7 +424,7 @@ public:
* \param model The model of the record. * \param model The model of the record.
* \return void * \return void
*/ */
static void SetRecordModel(const char* model) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordModel(const char* model) noexcept;
/** /**
* \brief Set the icon of the temporary record stored on the server for the * \brief Set the icon of the temporary record stored on the server for the
@ -433,7 +433,7 @@ public:
* \param icon The icon of the record. * \param icon The icon of the record.
* \return void * \return void
*/ */
static void SetRecordIcon(const char* icon) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordIcon(const char* icon) noexcept;
/** /**
* \brief Set the script of the temporary record stored on the server for the * \brief Set the script of the temporary record stored on the server for the
@ -442,7 +442,7 @@ public:
* \param script The script of the record. * \param script The script of the record.
* \return void * \return void
*/ */
static void SetRecordScript(const char* script) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordScript(const char* script) noexcept;
/** /**
* \brief Set the enchantment id of the temporary record stored on the server * \brief Set the enchantment id of the temporary record stored on the server
@ -451,7 +451,7 @@ public:
* \param enchantmentId The enchantment id of the record. * \param enchantmentId The enchantment id of the record.
* \return void * \return void
*/ */
static void SetRecordEnchantmentId(const char* enchantmentId) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordEnchantmentId(const char* enchantmentId) noexcept;
/** /**
* \brief Set the enchantment charge of the temporary record stored on the server * \brief Set the enchantment charge of the temporary record stored on the server
@ -460,7 +460,7 @@ public:
* \param enchantmentCharge The enchantmentCharge of the record. * \param enchantmentCharge The enchantmentCharge of the record.
* \return void * \return void
*/ */
static void SetRecordEnchantmentCharge(int enchantmentCharge) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordEnchantmentCharge(int enchantmentCharge) noexcept;
/** /**
* \brief Set the auto-calculation flag value of the temporary record stored * \brief Set the auto-calculation flag value of the temporary record stored
@ -469,7 +469,7 @@ public:
* \param autoCalc The auto-calculation flag value of the record. * \param autoCalc The auto-calculation flag value of the record.
* \return void * \return void
*/ */
static void SetRecordAutoCalc(int autoCalc) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordAutoCalc(int autoCalc) noexcept;
/** /**
* \brief Set the charge of the temporary record stored on the server for the * \brief Set the charge of the temporary record stored on the server for the
@ -478,7 +478,7 @@ public:
* \param charge The charge of the record. * \param charge The charge of the record.
* \return void * \return void
*/ */
static void SetRecordCharge(int charge) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordCharge(int charge) noexcept;
/** /**
* \brief Set the cost of the temporary record stored on the server for the * \brief Set the cost of the temporary record stored on the server for the
@ -487,7 +487,7 @@ public:
* \param cost The cost of the record. * \param cost The cost of the record.
* \return void * \return void
*/ */
static void SetRecordCost(int cost) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordCost(int cost) noexcept;
/** /**
* \brief Set the flags of the temporary record stored on the server for the * \brief Set the flags of the temporary record stored on the server for the
@ -496,7 +496,7 @@ public:
* \param flags The flags of the record. * \param flags The flags of the record.
* \return void * \return void
*/ */
static void SetRecordFlags(int flags) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordFlags(int flags) noexcept;
/** /**
* \brief Set the value of the temporary record stored on the server for the * \brief Set the value of the temporary record stored on the server for the
@ -505,7 +505,7 @@ public:
* \param value The value of the record. * \param value The value of the record.
* \return void * \return void
*/ */
static void SetRecordValue(int value) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordValue(int value) noexcept;
/** /**
* \brief Set the weight of the temporary record stored on the server for the * \brief Set the weight of the temporary record stored on the server for the
@ -514,7 +514,7 @@ public:
* \param weight The weight of the record. * \param weight The weight of the record.
* \return void * \return void
*/ */
static void SetRecordWeight(double weight) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordWeight(double weight) noexcept;
/** /**
* \brief Set the armor rating of the temporary record stored on the server * \brief Set the armor rating of the temporary record stored on the server
@ -523,7 +523,7 @@ public:
* \param armorRating The armor rating of the record. * \param armorRating The armor rating of the record.
* \return void * \return void
*/ */
static void SetRecordArmorRating(int armorRating) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordArmorRating(int armorRating) noexcept;
/** /**
* \brief Set the health of the temporary record stored on the server for the * \brief Set the health of the temporary record stored on the server for the
@ -532,7 +532,7 @@ public:
* \param health The health of the record. * \param health The health of the record.
* \return void * \return void
*/ */
static void SetRecordHealth(int health) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordHealth(int health) noexcept;
/** /**
* \brief Set the chop damage of the temporary record stored on the server for the * \brief Set the chop damage of the temporary record stored on the server for the
@ -542,7 +542,7 @@ public:
* \param maxDamage The maximum damage of the record. * \param maxDamage The maximum damage of the record.
* \return void * \return void
*/ */
static void SetRecordDamageChop(unsigned int minDamage, unsigned int maxDamage) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordDamageChop(unsigned int minDamage, unsigned int maxDamage) noexcept;
/** /**
* \brief Set the slash damage of the temporary record stored on the server for the * \brief Set the slash damage of the temporary record stored on the server for the
@ -552,7 +552,7 @@ public:
* \param maxDamage The maximum damage of the record. * \param maxDamage The maximum damage of the record.
* \return void * \return void
*/ */
static void SetRecordDamageSlash(unsigned int minDamage, unsigned int maxDamage) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordDamageSlash(unsigned int minDamage, unsigned int maxDamage) noexcept;
/** /**
* \brief Set the thrust damage of the temporary record stored on the server for the * \brief Set the thrust damage of the temporary record stored on the server for the
@ -562,7 +562,7 @@ public:
* \param maxDamage The maximum damage of the record. * \param maxDamage The maximum damage of the record.
* \return void * \return void
*/ */
static void SetRecordDamageThrust(unsigned int minDamage, unsigned int maxDamage) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordDamageThrust(unsigned int minDamage, unsigned int maxDamage) noexcept;
/** /**
* \brief Set the reach of the temporary record stored on the server for the * \brief Set the reach of the temporary record stored on the server for the
@ -571,7 +571,7 @@ public:
* \param reach The reach of the record. * \param reach The reach of the record.
* \return void * \return void
*/ */
static void SetRecordReach(double reach) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordReach(double reach) noexcept;
/** /**
* \brief Set the speed of the temporary record stored on the server for the * \brief Set the speed of the temporary record stored on the server for the
@ -580,7 +580,7 @@ public:
* \param speed The speed of the record. * \param speed The speed of the record.
* \return void * \return void
*/ */
static void SetRecordSpeed(double speed) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordSpeed(double speed) noexcept;
/** /**
* \brief Set whether the temporary record stored on the server for the * \brief Set whether the temporary record stored on the server for the
@ -591,7 +591,7 @@ public:
* \param keyState Whether the record is a key. * \param keyState Whether the record is a key.
* \return void * \return void
*/ */
static void SetRecordKeyState(bool keyState) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordKeyState(bool keyState) noexcept;
/** /**
* \brief Set whether the temporary record stored on the server for the * \brief Set whether the temporary record stored on the server for the
@ -602,7 +602,7 @@ public:
* \param scrollState Whether the record is a scroll. * \param scrollState Whether the record is a scroll.
* \return void * \return void
*/ */
static void SetRecordScrollState(bool scrollState) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordScrollState(bool scrollState) noexcept;
/** /**
* \brief Set the skill ID of the temporary record stored on the server for the * \brief Set the skill ID of the temporary record stored on the server for the
@ -611,7 +611,7 @@ public:
* \param skillId The skill ID of the record. * \param skillId The skill ID of the record.
* \return void * \return void
*/ */
static void SetRecordSkillId(int skillId) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordSkillId(int skillId) noexcept;
/** /**
* \brief Set the text of the temporary record stored on the server for the * \brief Set the text of the temporary record stored on the server for the
@ -620,7 +620,7 @@ public:
* \param text The text of the record. * \param text The text of the record.
* \return void * \return void
*/ */
static void SetRecordText(const char* text) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordText(const char* text) noexcept;
/** /**
* \brief Set the hair of the temporary record stored on the server for the * \brief Set the hair of the temporary record stored on the server for the
@ -629,7 +629,7 @@ public:
* \param hair The hair of the record. * \param hair The hair of the record.
* \return void * \return void
*/ */
static void SetRecordHair(const char* hair) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordHair(const char* hair) noexcept;
/** /**
* \brief Set the head of the temporary record stored on the server for the * \brief Set the head of the temporary record stored on the server for the
@ -638,7 +638,7 @@ public:
* \param hair The head of the record. * \param hair The head of the record.
* \return void * \return void
*/ */
static void SetRecordHead(const char* head) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordHead(const char* head) noexcept;
/** /**
* \brief Set the gender of the temporary record stored on the server for the * \brief Set the gender of the temporary record stored on the server for the
@ -647,7 +647,7 @@ public:
* \param hair The race of the record. * \param hair The race of the record.
* \return void * \return void
*/ */
static void SetRecordGender(unsigned int gender) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordGender(unsigned int gender) noexcept;
/** /**
* \brief Set the race of the temporary record stored on the server for the * \brief Set the race of the temporary record stored on the server for the
@ -656,7 +656,7 @@ public:
* \param hair The race of the record. * \param hair The race of the record.
* \return void * \return void
*/ */
static void SetRecordRace(const char* race) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordRace(const char* race) noexcept;
/** /**
* \brief Set the character class of the temporary record stored on the server * \brief Set the character class of the temporary record stored on the server
@ -665,7 +665,7 @@ public:
* \param hair The character class of the record. * \param hair The character class of the record.
* \return void * \return void
*/ */
static void SetRecordClass(const char* charClass) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordClass(const char* charClass) noexcept;
/** /**
* \brief Set the faction of the temporary record stored on the server for the * \brief Set the faction of the temporary record stored on the server for the
@ -674,7 +674,7 @@ public:
* \param faction The faction of the record. * \param faction The faction of the record.
* \return void * \return void
*/ */
static void SetRecordFaction(const char* faction) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordFaction(const char* faction) noexcept;
/** /**
* \brief Set the level of the temporary record stored on the server for the * \brief Set the level of the temporary record stored on the server for the
@ -683,7 +683,7 @@ public:
* \param level The level of the record. * \param level The level of the record.
* \return void * \return void
*/ */
static void SetRecordLevel(int level) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordLevel(int level) noexcept;
/** /**
* \brief Set the magicka of the temporary record stored on the server for the * \brief Set the magicka of the temporary record stored on the server for the
@ -692,7 +692,7 @@ public:
* \param magicka The magicka of the record. * \param magicka The magicka of the record.
* \return void * \return void
*/ */
static void SetRecordMagicka(int magicka) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordMagicka(int magicka) noexcept;
/** /**
* \brief Set the fatigue of the temporary record stored on the server for the * \brief Set the fatigue of the temporary record stored on the server for the
@ -701,7 +701,7 @@ public:
* \param fatigue The fatigue of the record. * \param fatigue The fatigue of the record.
* \return void * \return void
*/ */
static void SetRecordFatigue(int fatigue) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordFatigue(int fatigue) noexcept;
/** /**
* \brief Set the AI fight value of the temporary record stored on the server for the * \brief Set the AI fight value of the temporary record stored on the server for the
@ -710,7 +710,7 @@ public:
* \param aiFight The AI fight value of the record. * \param aiFight The AI fight value of the record.
* \return void * \return void
*/ */
static void SetRecordAIFight(int aiFight) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordAIFight(int aiFight) noexcept;
/** /**
* \brief Set the id of the record at a certain index in the records stored on the server. * \brief Set the id of the record at a certain index in the records stored on the server.
@ -722,7 +722,7 @@ public:
* \param id The id of the record. * \param id The id of the record.
* \return void * \return void
*/ */
static void SetRecordIdByIndex(unsigned int index, const char* id) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordIdByIndex(unsigned int index, const char* id) noexcept;
/** /**
* \brief Set the enchantment id of the record at a certain index in the records stored on * \brief Set the enchantment id of the record at a certain index in the records stored on
@ -735,7 +735,7 @@ public:
* \param enchantmentId The enchantment id of the record. * \param enchantmentId The enchantment id of the record.
* \return void * \return void
*/ */
static void SetRecordEnchantmentIdByIndex(unsigned int index, const char* enchantmentId) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordEnchantmentIdByIndex(unsigned int index, const char* enchantmentId) noexcept;
/** /**
* \brief Set the ID of the temporary effect stored on the server. * \brief Set the ID of the temporary effect stored on the server.
@ -743,7 +743,7 @@ public:
* \param effectId The ID of the effect. * \param effectId The ID of the effect.
* \return void * \return void
*/ */
static void SetRecordEffectId(unsigned int effectId) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordEffectId(unsigned int effectId) noexcept;
/** /**
* \brief Set the ID of the attribute modified by the temporary effect stored on * \brief Set the ID of the attribute modified by the temporary effect stored on
@ -752,7 +752,7 @@ public:
* \param attributeId The ID of the attribute. * \param attributeId The ID of the attribute.
* \return void * \return void
*/ */
static void SetRecordEffectAttribute(int attributeId) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordEffectAttribute(int attributeId) noexcept;
/** /**
* \brief Set the ID of the skill modified by the temporary effect stored on the * \brief Set the ID of the skill modified by the temporary effect stored on the
@ -761,7 +761,7 @@ public:
* \param skillId The ID of the skill. * \param skillId The ID of the skill.
* \return void * \return void
*/ */
static void SetRecordEffectSkill(int skillId) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordEffectSkill(int skillId) noexcept;
/** /**
* \brief Set the range type of the temporary effect stored on the server (0 for * \brief Set the range type of the temporary effect stored on the server (0 for
@ -770,7 +770,7 @@ public:
* \param rangeType The range type of the effect. * \param rangeType The range type of the effect.
* \return void * \return void
*/ */
static void SetRecordEffectRangeType(unsigned int rangeType) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordEffectRangeType(unsigned int rangeType) noexcept;
/** /**
* \brief Set the area of the temporary effect stored on the server. * \brief Set the area of the temporary effect stored on the server.
@ -778,7 +778,7 @@ public:
* \param area The area of the effect. * \param area The area of the effect.
* \return void * \return void
*/ */
static void SetRecordEffectArea(int area) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordEffectArea(int area) noexcept;
/** /**
* \brief Set the duration of the temporary effect stored on the server. * \brief Set the duration of the temporary effect stored on the server.
@ -786,7 +786,7 @@ public:
* \param duration The duration of the effect. * \param duration The duration of the effect.
* \return void * \return void
*/ */
static void SetRecordEffectDuration(int duration) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordEffectDuration(int duration) noexcept;
/** /**
* \brief Set the maximum magnitude of the temporary effect stored on the server. * \brief Set the maximum magnitude of the temporary effect stored on the server.
@ -794,7 +794,7 @@ public:
* \param magnitudeMax The maximum magnitude of the effect. * \param magnitudeMax The maximum magnitude of the effect.
* \return void * \return void
*/ */
static void SetRecordEffectMagnitudeMax(int magnitudeMax) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordEffectMagnitudeMax(int magnitudeMax) noexcept;
/** /**
* \brief Set the minimum magnitude of the temporary effect stored on the server. * \brief Set the minimum magnitude of the temporary effect stored on the server.
@ -802,7 +802,7 @@ public:
* \param magnitudeMin The minimum magnitude of the effect. * \param magnitudeMin The minimum magnitude of the effect.
* \return void * \return void
*/ */
static void SetRecordEffectMagnitudeMin(int magnitudeMin) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordEffectMagnitudeMin(int magnitudeMin) noexcept;
/** /**
* \brief Set the type of the temporary body part stored on the server. * \brief Set the type of the temporary body part stored on the server.
@ -810,7 +810,7 @@ public:
* \param partType The type of the body part. * \param partType The type of the body part.
* \return void * \return void
*/ */
static void SetRecordBodyPartType(unsigned int partType) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordBodyPartType(unsigned int partType) noexcept;
/** /**
* \brief Set the id of the male version of the temporary body part stored on the * \brief Set the id of the male version of the temporary body part stored on the
@ -819,7 +819,7 @@ public:
* \param partId The id of the body part. * \param partId The id of the body part.
* \return void * \return void
*/ */
static void SetRecordBodyPartIdForMale(const char* partId) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordBodyPartIdForMale(const char* partId) noexcept;
/** /**
* \brief Set the id of the female version of the temporary body part stored on the * \brief Set the id of the female version of the temporary body part stored on the
@ -828,7 +828,7 @@ public:
* \param partId The id of the body part. * \param partId The id of the body part.
* \return void * \return void
*/ */
static void SetRecordBodyPartIdForFemale(const char* partId) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordBodyPartIdForFemale(const char* partId) noexcept;
/** /**
* \brief Set the id of the of the temporary inventory item stored on the server. * \brief Set the id of the of the temporary inventory item stored on the server.
@ -836,7 +836,7 @@ public:
* \param partId The id of the inventory item. * \param partId The id of the inventory item.
* \return void * \return void
*/ */
static void SetRecordInventoryItemId(const char* itemId) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordInventoryItemId(const char* itemId) noexcept;
/** /**
* \brief Set the count of the of the temporary inventory item stored on the server. * \brief Set the count of the of the temporary inventory item stored on the server.
@ -844,7 +844,7 @@ public:
* \param count The count of the inventory item. * \param count The count of the inventory item.
* \return void * \return void
*/ */
static void SetRecordInventoryItemCount(unsigned int count) noexcept; EXPORT_APIFUNCTION void CDECL SetRecordInventoryItemCount(unsigned int count) noexcept;
/** /**
* \brief Add a copy of the server's temporary record of the current specified * \brief Add a copy of the server's temporary record of the current specified
@ -855,7 +855,7 @@ public:
* *
* \return void * \return void
*/ */
static void AddRecord() noexcept; EXPORT_APIFUNCTION void CDECL AddRecord() noexcept;
/** /**
* \brief Add a copy of the server's temporary effect to the temporary record * \brief Add a copy of the server's temporary effect to the temporary record
@ -866,7 +866,7 @@ public:
* *
* \return void * \return void
*/ */
static void AddRecordEffect() noexcept; EXPORT_APIFUNCTION void CDECL AddRecordEffect() noexcept;
/** /**
* \brief Add a copy of the server's temporary body part to the temporary record * \brief Add a copy of the server's temporary body part to the temporary record
@ -877,7 +877,7 @@ public:
* *
* \return void * \return void
*/ */
static void AddRecordBodyPart() noexcept; EXPORT_APIFUNCTION void CDECL AddRecordBodyPart() noexcept;
/** /**
* \brief Add a copy of the server's temporary inventory item to the temporary record * \brief Add a copy of the server's temporary inventory item to the temporary record
@ -891,7 +891,7 @@ public:
* *
* \return void * \return void
*/ */
static void AddRecordInventoryItem() noexcept; EXPORT_APIFUNCTION void CDECL AddRecordInventoryItem() noexcept;
/** /**
* \brief Send a RecordDynamic packet with the current specified record type. * \brief Send a RecordDynamic packet with the current specified record type.
@ -903,8 +903,7 @@ public:
* to the packet (false by default). * to the packet (false by default).
* \return void * \return void
*/ */
static void SendRecordDynamic(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept; EXPORT_APIFUNCTION void CDECL SendRecordDynamic(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept;
}
};
#endif //OPENMW_RECORDSDYNAMICAPI_HPP #endif //OPENMW_RECORDSDYNAMICAPI_HPP

View file

@ -1,6 +1,5 @@
#include "Server.hpp" #include "Server.hpp"
#include <components/misc/stringops.hpp>
#include <components/openmw-mp/NetworkMessages.hpp> #include <components/openmw-mp/NetworkMessages.hpp>
#include <components/openmw-mp/Log.hpp> #include <components/openmw-mp/Log.hpp>
#include <components/openmw-mp/Version.hpp> #include <components/openmw-mp/Version.hpp>
@ -10,25 +9,13 @@
#include <apps/openmw-mp/MasterClient.hpp> #include <apps/openmw-mp/MasterClient.hpp>
#include <Script/Script.hpp> #include <Script/Script.hpp>
static std::string tempFilename;
static std::chrono::high_resolution_clock::time_point startupTime = std::chrono::high_resolution_clock::now();
void ServerFunctions::LogMessage(unsigned short level, const char *message) noexcept extern "C" void ServerFunctions::StopServer(int code) noexcept
{
LOG_MESSAGE_SIMPLE(level, "[Script]: %s", message);
}
void ServerFunctions::LogAppend(unsigned short level, const char *message) noexcept
{
LOG_APPEND(level, "[Script]: %s", message);
}
void ServerFunctions::StopServer(int code) noexcept
{ {
mwmp::Networking::getPtr()->stopServer(code); mwmp::Networking::getPtr()->stopServer(code);
} }
void ServerFunctions::Kick(unsigned short pid) noexcept extern "C" void ServerFunctions::Kick(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);
@ -38,79 +25,45 @@ void ServerFunctions::Kick(unsigned short pid) noexcept
player->setLoadState(Player::KICKED); player->setLoadState(Player::KICKED);
} }
void ServerFunctions::BanAddress(const char *ipAddress) noexcept extern "C" void ServerFunctions::BanAddress(const char *ipAddress) noexcept
{ {
mwmp::Networking::getPtr()->banAddress(ipAddress); mwmp::Networking::getPtr()->banAddress(ipAddress);
} }
void ServerFunctions::UnbanAddress(const char *ipAddress) noexcept extern "C" void ServerFunctions::UnbanAddress(const char *ipAddress) noexcept
{ {
mwmp::Networking::getPtr()->unbanAddress(ipAddress); mwmp::Networking::getPtr()->unbanAddress(ipAddress);
} }
bool ServerFunctions::DoesFilePathExist(const char *filePath) noexcept extern "C" const char *ServerFunctions::GetOperatingSystemType() noexcept
{
return boost::filesystem::exists(filePath);
}
const char *ServerFunctions::GetCaseInsensitiveFilename(const char *folderPath, const char *filename) noexcept
{
if (!boost::filesystem::exists(folderPath)) return "invalid";
boost::filesystem::directory_iterator end_itr; // default construction yields past-the-end
for (boost::filesystem::directory_iterator itr(folderPath); itr != end_itr; ++itr)
{
if (Misc::StringUtils::ciEqual(itr->path().filename().string(), filename))
{
tempFilename = itr->path().filename().string();
return tempFilename.c_str();
}
}
return "invalid";
}
const char* ServerFunctions::GetDataPath() noexcept
{
return Script::GetModDir();
}
unsigned int ServerFunctions::GetMillisecondsSinceServerStart() noexcept
{
std::chrono::high_resolution_clock::time_point currentTime = std::chrono::high_resolution_clock::now();
std::chrono::milliseconds milliseconds = std::chrono::duration_cast<std::chrono::milliseconds>(currentTime - startupTime);
return milliseconds.count();
}
const char *ServerFunctions::GetOperatingSystemType() noexcept
{ {
return Utils::getOperatingSystemType().c_str(); return Utils::getOperatingSystemType().c_str();
} }
const char *ServerFunctions::GetArchitectureType() noexcept extern "C" const char *ServerFunctions::GetArchitectureType() noexcept
{ {
return Utils::getArchitectureType().c_str(); return Utils::getArchitectureType().c_str();
} }
const char *ServerFunctions::GetServerVersion() noexcept extern "C" const char *ServerFunctions::GetServerVersion() noexcept
{ {
return TES3MP_VERSION; return TES3MP_VERSION;
} }
const char *ServerFunctions::GetProtocolVersion() noexcept extern "C" const char *ServerFunctions::GetProtocolVersion() noexcept
{ {
static std::string version = std::to_string(TES3MP_PROTO_VERSION); static std::string version = std::to_string(TES3MP_PROTO_VERSION);
return version.c_str(); return version.c_str();
} }
int ServerFunctions::GetAvgPing(unsigned short pid) noexcept extern "C" int ServerFunctions::GetAvgPing(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, -1); GET_PLAYER(pid, player, -1);
return mwmp::Networking::get().getAvgPing(player->guid); return mwmp::Networking::get().getAvgPing(player->guid);
} }
const char *ServerFunctions::GetIP(unsigned short pid) noexcept extern "C" const char *ServerFunctions::GetIP(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ""); GET_PLAYER(pid, player, "");
@ -118,112 +71,100 @@ const char *ServerFunctions::GetIP(unsigned short pid) noexcept
return addr.ToString(false); return addr.ToString(false);
} }
unsigned short ServerFunctions::GetPort() noexcept extern "C" unsigned short ServerFunctions::GetPort() noexcept
{ {
return mwmp::Networking::get().getPort(); return mwmp::Networking::get().getPort();
} }
unsigned int ServerFunctions::GetMaxPlayers() noexcept extern "C" unsigned int ServerFunctions::GetMaxPlayers() noexcept
{ {
return mwmp::Networking::get().maxConnections(); return mwmp::Networking::get().maxConnections();
} }
bool ServerFunctions::HasPassword() noexcept extern "C" bool ServerFunctions::HasPassword() noexcept
{ {
return mwmp::Networking::get().isPassworded(); return mwmp::Networking::get().isPassworded();
} }
bool ServerFunctions::GetPluginEnforcementState() noexcept extern "C" bool ServerFunctions::GetPluginEnforcementState() noexcept
{ {
return mwmp::Networking::getPtr()->getPluginEnforcementState(); return mwmp::Networking::getPtr()->getPluginEnforcementState();
} }
bool ServerFunctions::GetScriptErrorIgnoringState() noexcept extern "C" bool ServerFunctions::GetScriptErrorIgnoringState() noexcept
{ {
return mwmp::Networking::getPtr()->getScriptErrorIgnoringState(); return mwmp::Networking::getPtr()->getScriptErrorIgnoringState();
} }
void ServerFunctions::SetGameMode(const char *gameMode) noexcept extern "C" void ServerFunctions::SetGameMode(const char *gameMode) noexcept
{ {
if (mwmp::Networking::getPtr()->getMasterClient()) if (mwmp::Networking::getPtr()->getMasterClient())
mwmp::Networking::getPtr()->getMasterClient()->SetModname(gameMode); mwmp::Networking::getPtr()->getMasterClient()->SetModname(gameMode);
} }
void ServerFunctions::SetHostname(const char *name) noexcept extern "C" void ServerFunctions::SetHostname(const char *name) noexcept
{ {
if (mwmp::Networking::getPtr()->getMasterClient()) if (mwmp::Networking::getPtr()->getMasterClient())
mwmp::Networking::getPtr()->getMasterClient()->SetHostname(name); mwmp::Networking::getPtr()->getMasterClient()->SetHostname(name);
} }
void ServerFunctions::SetServerPassword(const char *password) noexcept extern "C" void ServerFunctions::SetServerPassword(const char *password) noexcept
{ {
mwmp::Networking::getPtr()->setServerPassword(password); mwmp::Networking::getPtr()->setServerPassword(password);
} }
void ServerFunctions::SetPluginEnforcementState(bool state) noexcept extern "C" void ServerFunctions::SetPluginEnforcementState(bool state) noexcept
{ {
mwmp::Networking::getPtr()->setPluginEnforcementState(state); mwmp::Networking::getPtr()->setPluginEnforcementState(state);
} }
void ServerFunctions::SetScriptErrorIgnoringState(bool state) noexcept extern "C" void ServerFunctions::SetScriptErrorIgnoringState(bool state) noexcept
{ {
mwmp::Networking::getPtr()->setScriptErrorIgnoringState(state); mwmp::Networking::getPtr()->setScriptErrorIgnoringState(state);
} }
void ServerFunctions::SetRuleString(const char *key, const char *value) noexcept extern "C" void ServerFunctions::SetRuleString(const char *key, const char *value) noexcept
{ {
auto mc = mwmp::Networking::getPtr()->getMasterClient(); auto mc = mwmp::Networking::getPtr()->getMasterClient();
if (mc) if (mc)
mc->SetRuleString(key, value); mc->SetRuleString(key, value);
} }
void ServerFunctions::SetRuleValue(const char *key, double value) noexcept extern "C" void ServerFunctions::SetRuleValue(const char *key, double value) noexcept
{ {
auto mc = mwmp::Networking::getPtr()->getMasterClient(); auto mc = mwmp::Networking::getPtr()->getMasterClient();
if (mc) if (mc)
mc->SetRuleValue(key, value); mc->SetRuleValue(key, value);
} }
void ServerFunctions::AddDataFileRequirement(const char *dataFilename, const char *checksumString) noexcept extern "C" void ServerFunctions::AddPluginHash(const char *pluginName, const char *hashStr) noexcept
{ {
auto &samples = mwmp::Networking::getPtr()->getSamples(); auto &samples = mwmp::Networking::getPtr()->getSamples();
auto it = std::find_if(samples.begin(), samples.end(), [&dataFilename](mwmp::PacketPreInit::PluginPair &item) { auto it = std::find_if(samples.begin(), samples.end(), [&pluginName](mwmp::PacketPreInit::PluginPair &item) {
return item.first == dataFilename; return item.first == pluginName;
}); });
if (it != samples.end()) if (it != samples.end())
it->second.push_back((unsigned) std::stoul(checksumString)); it->second.push_back((unsigned) std::stoul(hashStr));
else else
{ {
mwmp::PacketPreInit::HashList checksumList; mwmp::PacketPreInit::HashList hashList;
unsigned checksum = 0; unsigned hash = 0;
if (strlen(checksumString) != 0) if (hashStr[0] != '\0')
{ {
checksum = (unsigned) std::stoul(checksumString); hash = (unsigned) std::stoul(hashStr);
checksumList.push_back(checksum); hashList.push_back(hash);
} }
samples.emplace_back(dataFilename, checksumList); samples.emplace_back(pluginName, hashList);
auto mclient = mwmp::Networking::getPtr()->getMasterClient(); auto mclient = mwmp::Networking::getPtr()->getMasterClient();
if (mclient) if (mclient)
mclient->PushPlugin({dataFilename, checksum}); mclient->PushPlugin({pluginName, hash});
} }
} }
// All methods below are deprecated versions of methods from above extern "C" const char* ServerFunctions::GetModDir() noexcept
bool ServerFunctions::DoesFileExist(const char *filePath) noexcept
{ {
return DoesFilePathExist(filePath); return Script::GetModDir();
}
const char* ServerFunctions::GetModDir() noexcept
{
return GetDataPath();
}
void ServerFunctions::AddPluginHash(const char *pluginName, const char *checksumString) noexcept
{
AddDataFileRequirement(pluginName, checksumString);
} }

View file

@ -3,20 +3,17 @@
#include "../Types.hpp" #include "../Types.hpp"
#include <Script/Platform.hpp>
#include <Script/Platform.hpp>
#define SERVERAPI \ #define SERVERAPI \
{"LogMessage", ServerFunctions::LogMessage},\
{"LogAppend", ServerFunctions::LogAppend},\
\
{"StopServer", ServerFunctions::StopServer},\ {"StopServer", ServerFunctions::StopServer},\
\ \
{"Kick", ServerFunctions::Kick},\ {"Kick", ServerFunctions::Kick},\
{"BanAddress", ServerFunctions::BanAddress},\ {"BanAddress", ServerFunctions::BanAddress},\
{"UnbanAddress", ServerFunctions::UnbanAddress},\ {"UnbanAddress", ServerFunctions::UnbanAddress},\
\ \
{"DoesFilePathExist", ServerFunctions::DoesFilePathExist},\
{"GetCaseInsensitiveFilename", ServerFunctions::GetCaseInsensitiveFilename},\
{"GetDataPath", ServerFunctions::GetDataPath},\
{"GetMillisecondsSinceServerStart", ServerFunctions::GetMillisecondsSinceServerStart},\
{"GetOperatingSystemType", ServerFunctions::GetOperatingSystemType},\ {"GetOperatingSystemType", ServerFunctions::GetOperatingSystemType},\
{"GetArchitectureType", ServerFunctions::GetArchitectureType},\ {"GetArchitectureType", ServerFunctions::GetArchitectureType},\
{"GetServerVersion", ServerFunctions::GetServerVersion},\ {"GetServerVersion", ServerFunctions::GetServerVersion},\
@ -36,48 +33,18 @@
{"SetScriptErrorIgnoringState", ServerFunctions::SetScriptErrorIgnoringState},\ {"SetScriptErrorIgnoringState", ServerFunctions::SetScriptErrorIgnoringState},\
{"SetRuleString", ServerFunctions::SetRuleString},\ {"SetRuleString", ServerFunctions::SetRuleString},\
{"SetRuleValue", ServerFunctions::SetRuleValue},\ {"SetRuleValue", ServerFunctions::SetRuleValue},\
\ {"AddPluginHash", ServerFunctions::AddPluginHash},\
{"AddDataFileRequirement", ServerFunctions::AddDataFileRequirement},\ {"GetModDir", ServerFunctions::GetModDir}
\
{"DoesFileExist", ServerFunctions::DoesFileExist},\
{"GetModDir", ServerFunctions::GetModDir},\
{"AddPluginHash", ServerFunctions::AddPluginHash}
class ServerFunctions namespace ServerFunctions
{ {
public:
/**
* \brief Write a log message with its own timestamp.
*
* It will have "[Script]:" prepended to it so as to mark it as a script-generated log message.
*
* \param level The logging level used (0 for LOG_VERBOSE, 1 for LOG_INFO, 2 for LOG_WARN,
* 3 for LOG_ERROR, 4 for LOG_FATAL).
* \param message The message logged.
* \return void
*/
static void LogMessage(unsigned short level, const char *message) noexcept;
/**
* \brief Write a log message without its own timestamp.
*
* It will have "[Script]:" prepended to it so as to mark it as a script-generated log message.
*
* \param level The logging level used (0 for LOG_VERBOSE, 1 for LOG_INFO, 2 for LOG_WARN,
* 3 for LOG_ERROR, 4 for LOG_FATAL).
* \param message The message logged.
* \return void
*/
static void LogAppend(unsigned short level, const char *message) noexcept;
/** /**
* \brief Shut down the server. * \brief Shut down the server.
* *
* \param code The shutdown code. * \param code The shutdown code.
* \return void * \return void
*/ */
static void StopServer(int code) noexcept; EXPORT_APIFUNCTION void CDECL StopServer(int code) noexcept;
/** /**
* \brief Kick a certain player from the server. * \brief Kick a certain player from the server.
@ -85,7 +52,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return void * \return void
*/ */
static void Kick(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL Kick(unsigned short pid) noexcept;
/** /**
* \brief Ban a certain IP address from the server. * \brief Ban a certain IP address from the server.
@ -93,7 +60,7 @@ public:
* \param ipAddress The IP address. * \param ipAddress The IP address.
* \return void * \return void
*/ */
static void BanAddress(const char *ipAddress) noexcept; EXPORT_APIFUNCTION void CDECL BanAddress(const char *ipAddress) noexcept;
/** /**
* \brief Unban a certain IP address from the server. * \brief Unban a certain IP address from the server.
@ -101,42 +68,7 @@ public:
* \param ipAddress The IP address. * \param ipAddress The IP address.
* \return void * \return void
*/ */
static void UnbanAddress(const char *ipAddress) noexcept; EXPORT_APIFUNCTION void CDECL UnbanAddress(const char *ipAddress) noexcept;
/**
* \brief Check whether a certain file path exists.
*
* This will be a case sensitive check on case sensitive filesystems.
*
* Whenever you want to enforce case insensitivity, use GetCaseInsensitiveFilename() instead.
*
* \return Whether the file exists or not.
*/
static bool DoesFilePathExist(const char *filePath) noexcept;
/**
* \brief Get the first filename in a folder that has a case insensitive match with the filename
* argument.
*
* This is used to retain case insensitivity when opening data files on Linux.
*
* \return The filename that matches.
*/
static const char *GetCaseInsensitiveFilename(const char *folderPath, const char *filename) noexcept;
/**
* \brief Get the path of the server's data folder.
*
* \return The data path.
*/
static const char *GetDataPath() noexcept;
/**
* \brief Get the milliseconds elapsed since the server was started.
*
* \return The time since the server's startup in milliseconds.
*/
static unsigned int GetMillisecondsSinceServerStart() noexcept;
/** /**
* \brief Get the type of the operating system used by the server. * \brief Get the type of the operating system used by the server.
@ -145,7 +77,7 @@ public:
* *
* \return The type of the operating system. * \return The type of the operating system.
*/ */
static const char *GetOperatingSystemType() noexcept; EXPORT_APIFUNCTION const char *CDECL GetOperatingSystemType() noexcept;
/** /**
* \brief Get the architecture type used by the server. * \brief Get the architecture type used by the server.
@ -154,21 +86,21 @@ public:
* *
* \return The architecture type. * \return The architecture type.
*/ */
static const char *GetArchitectureType() noexcept; EXPORT_APIFUNCTION const char *CDECL GetArchitectureType() noexcept;
/** /**
* \brief Get the TES3MP version of the server. * \brief Get the TES3MP version of the server.
* *
* \return The server version. * \return The server version.
*/ */
static const char *GetServerVersion() noexcept; EXPORT_APIFUNCTION const char *CDECL GetServerVersion() noexcept;
/** /**
* \brief Get the protocol version of the server. * \brief Get the protocol version of the server.
* *
* \return The protocol version. * \return The protocol version.
*/ */
static const char *GetProtocolVersion() noexcept; EXPORT_APIFUNCTION const char *CDECL GetProtocolVersion() noexcept;
/** /**
* \brief Get the average ping of a certain player. * \brief Get the average ping of a certain player.
@ -176,7 +108,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The average ping. * \return The average ping.
*/ */
static int GetAvgPing(unsigned short pid) noexcept; EXPORT_APIFUNCTION int CDECL GetAvgPing(unsigned short pid) noexcept;
/** /**
* \brief Get the IP address of a certain player. * \brief Get the IP address of a certain player.
@ -184,28 +116,28 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The IP address. * \return The IP address.
*/ */
static const char* GetIP(unsigned short pid) noexcept; EXPORT_APIFUNCTION const CDECL char* GetIP(unsigned short pid) noexcept;
/** /**
* \brief Get the port used by the server. * \brief Get the port used by the server.
* *
* \return The port. * \return Port
*/ */
static unsigned short GetPort() noexcept; EXPORT_APIFUNCTION unsigned short CDECL GetPort() noexcept;
/** /**
* \brief Get the maximum number of players. * \brief Get the maximum number of players.
* *
* \return Max players * \return Max players
*/ */
static unsigned int GetMaxPlayers() noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetMaxPlayers() noexcept;
/** /**
* \brief Checking if the server requires a password to connect. * \brief Checking if the server requires a password to connect.
* *
* @return * @return
*/ */
static bool HasPassword() noexcept; EXPORT_APIFUNCTION bool CDECL HasPassword() noexcept;
/** /**
* \brief Get the plugin enforcement state of the server. * \brief Get the plugin enforcement state of the server.
@ -214,7 +146,7 @@ public:
* *
* \return The enforcement state. * \return The enforcement state.
*/ */
static bool GetPluginEnforcementState() noexcept; EXPORT_APIFUNCTION bool CDECL GetPluginEnforcementState() noexcept;
/** /**
* \brief Get the script error ignoring state of the server. * \brief Get the script error ignoring state of the server.
@ -223,7 +155,7 @@ public:
* *
* \return The script error ignoring state. * \return The script error ignoring state.
*/ */
static bool GetScriptErrorIgnoringState() noexcept; EXPORT_APIFUNCTION bool CDECL GetScriptErrorIgnoringState() noexcept;
/** /**
* \brief Set the game mode of the server, as displayed in the server browser. * \brief Set the game mode of the server, as displayed in the server browser.
@ -231,7 +163,7 @@ public:
* \param name The new game mode. * \param name The new game mode.
* \return void * \return void
*/ */
static void SetGameMode(const char* gameMode) noexcept; EXPORT_APIFUNCTION void CDECL SetGameMode(const char* gameMode) noexcept;
/** /**
* \brief Set the name of the server, as displayed in the server browser. * \brief Set the name of the server, as displayed in the server browser.
@ -239,7 +171,7 @@ public:
* \param name The new name. * \param name The new name.
* \return void * \return void
*/ */
static void SetHostname(const char* name) noexcept; EXPORT_APIFUNCTION void CDECL SetHostname(const char* name) noexcept;
/** /**
* \brief Set the password required to join the server. * \brief Set the password required to join the server.
@ -247,7 +179,7 @@ public:
* \param password The password. * \param password The password.
* \return void * \return void
*/ */
static void SetServerPassword(const char *password) noexcept; EXPORT_APIFUNCTION void CDECL SetServerPassword(const char *password) noexcept;
/** /**
* \brief Set the plugin enforcement state of the server. * \brief Set the plugin enforcement state of the server.
@ -257,7 +189,7 @@ public:
* \param state The new enforcement state. * \param state The new enforcement state.
* \return void * \return void
*/ */
static void SetPluginEnforcementState(bool state) noexcept; EXPORT_APIFUNCTION void CDECL SetPluginEnforcementState(bool state) noexcept;
/** /**
* \brief Set whether script errors should be ignored or not. * \brief Set whether script errors should be ignored or not.
@ -269,7 +201,7 @@ public:
* \param state The new script error ignoring state. * \param state The new script error ignoring state.
* \return void * \return void
*/ */
static void SetScriptErrorIgnoringState(bool state) noexcept; EXPORT_APIFUNCTION void CDECL SetScriptErrorIgnoringState(bool state) noexcept;
/** /**
* \brief Set a rule string for the server details displayed in the server browser. * \brief Set a rule string for the server details displayed in the server browser.
@ -278,7 +210,7 @@ public:
* \param value The string value of the rule. * \param value The string value of the rule.
* \return void * \return void
*/ */
static void SetRuleString(const char *key, const char *value) noexcept; EXPORT_APIFUNCTION void CDECL SetRuleString(const char *key, const char *value) noexcept;
/** /**
* \brief Set a rule value for the server details displayed in the server browser. * \brief Set a rule value for the server details displayed in the server browser.
@ -287,27 +219,16 @@ public:
* \param value The numerical value of the rule. * \param value The numerical value of the rule.
* \return void * \return void
*/ */
static void SetRuleValue(const char *key, double value) noexcept; EXPORT_APIFUNCTION void CDECL SetRuleValue(const char *key, double value) noexcept;
/** /**
* \brief Add a data file and a corresponding CRC32 checksum to the data file loadout * \brief Adds plugins to the internal server structure to validate players.
* that connecting clients need to match. * @param pluginName Name with extension of the plugin or master file.
* * @param hash Hash string
* It can be used multiple times to set multiple checksums for the same data file.
*
* Note: If an empty string is provided for the checksum, a checksum will not be
* required for that data file.
*
* @param dataFilename The filename of the data file.
* @param checksumString A string with the CRC32 checksum required.
*/ */
static void AddDataFileRequirement(const char *dataFilename, const char *checksumString) noexcept; EXPORT_APIFUNCTION void CDECL AddPluginHash(const char *pluginName, const char *hash) noexcept;
// All methods below are deprecated versions of methods from above EXPORT_APIFUNCTION const char *CDECL GetModDir() noexcept;
}
static bool DoesFileExist(const char *filePath) noexcept;
static const char *GetModDir() noexcept;
static void AddPluginHash(const char *pluginName, const char *checksumString) noexcept;
};
#endif //OPENMW_SERVERAPI_HPP #endif //OPENMW_SERVERAPI_HPP

View file

@ -9,7 +9,7 @@
#include <iostream> #include <iostream>
using namespace std; using namespace std;
void SettingFunctions::SetDifficulty(unsigned short pid, int difficulty) extern "C" void SettingFunctions::SetDifficulty(unsigned short pid, int difficulty)
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -17,7 +17,7 @@ void SettingFunctions::SetDifficulty(unsigned short pid, int difficulty)
player->difficulty = difficulty; player->difficulty = difficulty;
} }
void SettingFunctions::SetEnforcedLogLevel(unsigned short pid, int enforcedLogLevel) extern "C" void SettingFunctions::SetEnforcedLogLevel(unsigned short pid, int enforcedLogLevel)
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -25,7 +25,7 @@ void SettingFunctions::SetEnforcedLogLevel(unsigned short pid, int enforcedLogLe
player->enforcedLogLevel = enforcedLogLevel; player->enforcedLogLevel = enforcedLogLevel;
} }
void SettingFunctions::SetPhysicsFramerate(unsigned short pid, double physicsFramerate) extern "C" void SettingFunctions::SetPhysicsFramerate(unsigned short pid, double physicsFramerate)
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -33,7 +33,7 @@ void SettingFunctions::SetPhysicsFramerate(unsigned short pid, double physicsFra
player->physicsFramerate = physicsFramerate; player->physicsFramerate = physicsFramerate;
} }
void SettingFunctions::SetConsoleAllowed(unsigned short pid, bool state) extern "C" void SettingFunctions::SetConsoleAllowed(unsigned short pid, bool state)
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);
@ -41,7 +41,7 @@ void SettingFunctions::SetConsoleAllowed(unsigned short pid, bool state)
player->consoleAllowed = state; player->consoleAllowed = state;
} }
void SettingFunctions::SetBedRestAllowed(unsigned short pid, bool state) extern "C" void SettingFunctions::SetBedRestAllowed(unsigned short pid, bool state)
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -49,7 +49,7 @@ void SettingFunctions::SetBedRestAllowed(unsigned short pid, bool state)
player->bedRestAllowed = state; player->bedRestAllowed = state;
} }
void SettingFunctions::SetWildernessRestAllowed(unsigned short pid, bool state) extern "C" void SettingFunctions::SetWildernessRestAllowed(unsigned short pid, bool state)
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -57,7 +57,7 @@ void SettingFunctions::SetWildernessRestAllowed(unsigned short pid, bool state)
player->wildernessRestAllowed = state; player->wildernessRestAllowed = state;
} }
void SettingFunctions::SetWaitAllowed(unsigned short pid, bool state) extern "C" void SettingFunctions::SetWaitAllowed(unsigned short pid, bool state)
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -65,7 +65,7 @@ void SettingFunctions::SetWaitAllowed(unsigned short pid, bool state)
player->waitAllowed = state; player->waitAllowed = state;
} }
void SettingFunctions::SendSettings(unsigned short pid) noexcept extern "C" void SettingFunctions::SendSettings(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);

View file

@ -3,6 +3,8 @@
#include "../Types.hpp" #include "../Types.hpp"
#include <Script/Platform.hpp>
#define SETTINGSAPI \ #define SETTINGSAPI \
{"SetDifficulty", SettingFunctions::SetDifficulty},\ {"SetDifficulty", SettingFunctions::SetDifficulty},\
{"SetEnforcedLogLevel", SettingFunctions::SetEnforcedLogLevel},\ {"SetEnforcedLogLevel", SettingFunctions::SetEnforcedLogLevel},\
@ -15,10 +17,8 @@
\ \
{"SendSettings", SettingFunctions::SendSettings} {"SendSettings", SettingFunctions::SendSettings}
class SettingFunctions namespace SettingFunctions
{ {
public:
/** /**
* \brief Set the difficulty for a player. * \brief Set the difficulty for a player.
* *
@ -29,7 +29,7 @@ public:
* \param difficulty The difficulty. * \param difficulty The difficulty.
* \return void * \return void
*/ */
static void SetDifficulty(unsigned short pid, int difficulty); EXPORT_APIFUNCTION void CDECL SetDifficulty(unsigned short pid, int difficulty);
/** /**
* \brief Set the client log level enforced for a player. * \brief Set the client log level enforced for a player.
@ -47,7 +47,7 @@ public:
* \param enforcedLogLevel The enforced log level. * \param enforcedLogLevel The enforced log level.
* \return void * \return void
*/ */
static void SetEnforcedLogLevel(unsigned short pid, int enforcedLogLevel); EXPORT_APIFUNCTION void CDECL SetEnforcedLogLevel(unsigned short pid, int enforcedLogLevel);
/** /**
* \brief Set the physics framerate for a player. * \brief Set the physics framerate for a player.
@ -59,7 +59,7 @@ public:
* \param physicsFramerate The physics framerate. * \param physicsFramerate The physics framerate.
* \return void * \return void
*/ */
static void SetPhysicsFramerate(unsigned short pid, double physicsFramerate); EXPORT_APIFUNCTION void CDECL SetPhysicsFramerate(unsigned short pid, double physicsFramerate);
/** /**
* \brief Set whether the console is allowed for a player. * \brief Set whether the console is allowed for a player.
@ -71,7 +71,7 @@ public:
* \param state The console permission state. * \param state The console permission state.
* \return void * \return void
*/ */
static void SetConsoleAllowed(unsigned short pid, bool state); EXPORT_APIFUNCTION void CDECL SetConsoleAllowed(unsigned short pid, bool state);
/** /**
* \brief Set whether resting in beds is allowed for a player. * \brief Set whether resting in beds is allowed for a player.
@ -83,7 +83,7 @@ public:
* \param state The resting permission state. * \param state The resting permission state.
* \return void * \return void
*/ */
static void SetBedRestAllowed(unsigned short pid, bool state); EXPORT_APIFUNCTION void CDECL SetBedRestAllowed(unsigned short pid, bool state);
/** /**
* \brief Set whether resting in the wilderness is allowed for a player. * \brief Set whether resting in the wilderness is allowed for a player.
@ -95,7 +95,7 @@ public:
* \param state The resting permission state. * \param state The resting permission state.
* \return void * \return void
*/ */
static void SetWildernessRestAllowed(unsigned short pid, bool state); EXPORT_APIFUNCTION void CDECL SetWildernessRestAllowed(unsigned short pid, bool state);
/** /**
* \brief Set whether waiting is allowed for a player. * \brief Set whether waiting is allowed for a player.
@ -107,7 +107,7 @@ public:
* \param state The waiting permission state. * \param state The waiting permission state.
* \return void * \return void
*/ */
static void SetWaitAllowed(unsigned short pid, bool state); EXPORT_APIFUNCTION void CDECL SetWaitAllowed(unsigned short pid, bool state);
/** /**
* \brief Send a PlayerSettings packet to the player affected by it. * \brief Send a PlayerSettings packet to the player affected by it.
@ -115,7 +115,7 @@ public:
* \param pid The player ID to send it to. * \param pid The player ID to send it to.
* \return void * \return void
*/ */
static void SendSettings(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL SendSettings(unsigned short pid) noexcept;
}; }
#endif //OPENMW_SETTINGSAPI_HPP #endif //OPENMW_SETTINGSAPI_HPP

View file

@ -9,7 +9,7 @@
#include <iostream> #include <iostream>
using namespace std; using namespace std;
double ShapeshiftFunctions::GetScale(unsigned short pid) noexcept extern "C" double ShapeshiftFunctions::GetScale(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0.0f); GET_PLAYER(pid, player, 0.0f);
@ -17,7 +17,7 @@ double ShapeshiftFunctions::GetScale(unsigned short pid) noexcept
return player->scale; return player->scale;
} }
bool ShapeshiftFunctions::IsWerewolf(unsigned short pid) noexcept extern "C" bool ShapeshiftFunctions::IsWerewolf(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -25,7 +25,7 @@ bool ShapeshiftFunctions::IsWerewolf(unsigned short pid) noexcept
return player->isWerewolf; return player->isWerewolf;
} }
const char *ShapeshiftFunctions::GetCreatureRefId(unsigned short pid) noexcept extern "C" const char *ShapeshiftFunctions::GetCreatureRefId(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -33,7 +33,7 @@ const char *ShapeshiftFunctions::GetCreatureRefId(unsigned short pid) noexcept
return player->creatureRefId.c_str(); return player->creatureRefId.c_str();
} }
bool ShapeshiftFunctions::GetCreatureNameDisplayState(unsigned short pid) noexcept extern "C" bool ShapeshiftFunctions::GetCreatureNameDisplayState(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -41,7 +41,7 @@ bool ShapeshiftFunctions::GetCreatureNameDisplayState(unsigned short pid) noexce
return player->displayCreatureName; return player->displayCreatureName;
} }
void ShapeshiftFunctions::SetScale(unsigned short pid, double scale) noexcept extern "C" void ShapeshiftFunctions::SetScale(unsigned short pid, double scale) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -49,7 +49,7 @@ void ShapeshiftFunctions::SetScale(unsigned short pid, double scale) noexcept
player->scale = scale; player->scale = scale;
} }
void ShapeshiftFunctions::SetWerewolfState(unsigned short pid, bool isWerewolf) noexcept extern "C" void ShapeshiftFunctions::SetWerewolfState(unsigned short pid, bool isWerewolf) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -57,7 +57,7 @@ void ShapeshiftFunctions::SetWerewolfState(unsigned short pid, bool isWerewolf)
player->isWerewolf = isWerewolf; player->isWerewolf = isWerewolf;
} }
void ShapeshiftFunctions::SetCreatureRefId(unsigned short pid, const char *refId) noexcept extern "C" void ShapeshiftFunctions::SetCreatureRefId(unsigned short pid, const char *refId) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -65,7 +65,7 @@ void ShapeshiftFunctions::SetCreatureRefId(unsigned short pid, const char *refId
player->creatureRefId = refId; player->creatureRefId = refId;
} }
void ShapeshiftFunctions::SetCreatureNameDisplayState(unsigned short pid, bool displayState) noexcept extern "C" void ShapeshiftFunctions::SetCreatureNameDisplayState(unsigned short pid, bool displayState) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -73,7 +73,7 @@ void ShapeshiftFunctions::SetCreatureNameDisplayState(unsigned short pid, bool d
player->displayCreatureName = displayState; player->displayCreatureName = displayState;
} }
void ShapeshiftFunctions::SendShapeshift(unsigned short pid) extern "C" void ShapeshiftFunctions::SendShapeshift(unsigned short pid)
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );

View file

@ -3,6 +3,8 @@
#include "../Types.hpp" #include "../Types.hpp"
#include <Script/Platform.hpp>
#define SHAPESHIFTAPI \ #define SHAPESHIFTAPI \
{"GetScale", ShapeshiftFunctions::GetScale},\ {"GetScale", ShapeshiftFunctions::GetScale},\
{"IsWerewolf", ShapeshiftFunctions::IsWerewolf},\ {"IsWerewolf", ShapeshiftFunctions::IsWerewolf},\
@ -16,17 +18,15 @@
\ \
{"SendShapeshift", ShapeshiftFunctions::SendShapeshift} {"SendShapeshift", ShapeshiftFunctions::SendShapeshift}
class ShapeshiftFunctions namespace ShapeshiftFunctions
{ {
public:
/** /**
* \brief Get the scale of a player. * \brief Get the scale of a player.
* *
* \param pid The player ID. * \param pid The player ID.
* \return The scale. * \return The scale.
*/ */
static double GetScale(unsigned short pid) noexcept; EXPORT_APIFUNCTION double CDECL GetScale(unsigned short pid) noexcept;
/** /**
* \brief Check whether a player is a werewolf. * \brief Check whether a player is a werewolf.
@ -36,7 +36,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The werewolf state. * \return The werewolf state.
*/ */
static bool IsWerewolf(unsigned short pid) noexcept; EXPORT_APIFUNCTION bool CDECL IsWerewolf(unsigned short pid) noexcept;
/** /**
* \brief Get the refId of the creature the player is disguised as. * \brief Get the refId of the creature the player is disguised as.
@ -44,7 +44,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The creature refId. * \return The creature refId.
*/ */
static const char *GetCreatureRefId(unsigned short pid) noexcept; EXPORT_APIFUNCTION const char *CDECL GetCreatureRefId(unsigned short pid) noexcept;
/** /**
* \brief Check whether a player's name is replaced by that of the creature they are * \brief Check whether a player's name is replaced by that of the creature they are
@ -55,7 +55,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The creature name display state. * \return The creature name display state.
*/ */
static bool GetCreatureNameDisplayState(unsigned short pid) noexcept; EXPORT_APIFUNCTION bool CDECL GetCreatureNameDisplayState(unsigned short pid) noexcept;
/** /**
* \brief Set the scale of a player. * \brief Set the scale of a player.
@ -67,7 +67,7 @@ public:
* \param scale The new scale. * \param scale The new scale.
* \return void * \return void
*/ */
static void SetScale(unsigned short pid, double scale) noexcept; EXPORT_APIFUNCTION void CDECL SetScale(unsigned short pid, double scale) noexcept;
/** /**
* \brief Set the werewolf state of a player. * \brief Set the werewolf state of a player.
@ -79,7 +79,7 @@ public:
* \param isWerewolf The new werewolf state. * \param isWerewolf The new werewolf state.
* \return void * \return void
*/ */
static void SetWerewolfState(unsigned short pid, bool isWerewolf) noexcept; EXPORT_APIFUNCTION void CDECL SetWerewolfState(unsigned short pid, bool isWerewolf) noexcept;
/** /**
* \brief Set the refId of the creature a player is disguised as. * \brief Set the refId of the creature a player is disguised as.
@ -93,7 +93,7 @@ public:
* when hovered over by others. * when hovered over by others.
* \return void * \return void
*/ */
static void SetCreatureRefId(unsigned short pid, const char *refId) noexcept; EXPORT_APIFUNCTION void CDECL SetCreatureRefId(unsigned short pid, const char *refId) noexcept;
/** /**
* \brief Set whether a player's name is replaced by that of the creature they are * \brief Set whether a player's name is replaced by that of the creature they are
@ -103,7 +103,7 @@ public:
* \param displayState The creature name display state. * \param displayState The creature name display state.
* \return void * \return void
*/ */
static void SetCreatureNameDisplayState(unsigned short pid, bool displayState) noexcept; EXPORT_APIFUNCTION void CDECL SetCreatureNameDisplayState(unsigned short pid, bool displayState) noexcept;
/** /**
* \brief Send a PlayerShapeshift packet about a player. * \brief Send a PlayerShapeshift packet about a player.
@ -114,7 +114,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return void * \return void
*/ */
static void SendShapeshift(unsigned short pid); EXPORT_APIFUNCTION void CDECL SendShapeshift(unsigned short pid);
}; }
#endif //OPENMW_SHAPESHIFTAPI_HPP #endif //OPENMW_SHAPESHIFTAPI_HPP

View file

@ -8,7 +8,7 @@
using namespace mwmp; using namespace mwmp;
void SpellFunctions::ClearSpellbookChanges(unsigned short pid) noexcept extern "C" void SpellFunctions::ClearSpellbookChanges(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -16,7 +16,7 @@ void SpellFunctions::ClearSpellbookChanges(unsigned short pid) noexcept
player->spellbookChanges.spells.clear(); player->spellbookChanges.spells.clear();
} }
unsigned int SpellFunctions::GetSpellbookChangesSize(unsigned short pid) noexcept extern "C" unsigned int SpellFunctions::GetSpellbookChangesSize(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -24,7 +24,7 @@ unsigned int SpellFunctions::GetSpellbookChangesSize(unsigned short pid) noexcep
return player->spellbookChanges.count; return player->spellbookChanges.count;
} }
unsigned int SpellFunctions::GetSpellbookChangesAction(unsigned short pid) noexcept extern "C" unsigned int SpellFunctions::GetSpellbookChangesAction(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -32,7 +32,7 @@ unsigned int SpellFunctions::GetSpellbookChangesAction(unsigned short pid) noexc
return player->spellbookChanges.action; return player->spellbookChanges.action;
} }
void SpellFunctions::SetSpellbookChangesAction(unsigned short pid, unsigned char action) noexcept extern "C" void SpellFunctions::SetSpellbookChangesAction(unsigned short pid, unsigned char action) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -40,7 +40,7 @@ void SpellFunctions::SetSpellbookChangesAction(unsigned short pid, unsigned char
player->spellbookChanges.action = action; player->spellbookChanges.action = action;
} }
void SpellFunctions::AddSpell(unsigned short pid, const char* spellId) noexcept extern "C" void SpellFunctions::AddSpell(unsigned short pid, const char* spellId) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -51,7 +51,7 @@ void SpellFunctions::AddSpell(unsigned short pid, const char* spellId) noexcept
player->spellbookChanges.spells.push_back(spell); player->spellbookChanges.spells.push_back(spell);
} }
const char *SpellFunctions::GetSpellId(unsigned short pid, unsigned int index) noexcept extern "C" const char *SpellFunctions::GetSpellId(unsigned short pid, unsigned int index) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ""); GET_PLAYER(pid, player, "");
@ -62,7 +62,7 @@ const char *SpellFunctions::GetSpellId(unsigned short pid, unsigned int index) n
return player->spellbookChanges.spells.at(index).mId.c_str(); return player->spellbookChanges.spells.at(index).mId.c_str();
} }
void SpellFunctions::SendSpellbookChanges(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept extern "C" void SpellFunctions::SendSpellbookChanges(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -76,7 +76,7 @@ void SpellFunctions::SendSpellbookChanges(unsigned short pid, bool sendToOtherPl
packet->Send(true); packet->Send(true);
} }
// All methods below are deprecated versions of methods from above extern "C" // All methods below are deprecated versions of methods from above
void SpellFunctions::InitializeSpellbookChanges(unsigned short pid) noexcept void SpellFunctions::InitializeSpellbookChanges(unsigned short pid) noexcept
{ {

View file

@ -1,6 +1,8 @@
#ifndef OPENMW_SPELLAPI_HPP #ifndef OPENMW_SPELLAPI_HPP
#define OPENMW_SPELLAPI_HPP #define OPENMW_SPELLAPI_HPP
#include <Script/Platform.hpp>
#define SPELLAPI \ #define SPELLAPI \
{"ClearSpellbookChanges", SpellFunctions::ClearSpellbookChanges},\ {"ClearSpellbookChanges", SpellFunctions::ClearSpellbookChanges},\
\ \
@ -16,10 +18,8 @@
\ \
{"InitializeSpellbookChanges", SpellFunctions::InitializeSpellbookChanges} {"InitializeSpellbookChanges", SpellFunctions::InitializeSpellbookChanges}
class SpellFunctions namespace SpellFunctions
{ {
public:
/** /**
* \brief Clear the last recorded spellbook changes for a player. * \brief Clear the last recorded spellbook changes for a player.
* *
@ -28,7 +28,7 @@ public:
* \param pid The player ID whose spellbook changes should be used. * \param pid The player ID whose spellbook changes should be used.
* \return void * \return void
*/ */
static void ClearSpellbookChanges(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL ClearSpellbookChanges(unsigned short pid) noexcept;
/** /**
* \brief Get the number of indexes in a player's latest spellbook changes. * \brief Get the number of indexes in a player's latest spellbook changes.
@ -36,7 +36,7 @@ public:
* \param pid The player ID whose spellbook changes should be used. * \param pid The player ID whose spellbook changes should be used.
* \return The number of indexes. * \return The number of indexes.
*/ */
static unsigned int GetSpellbookChangesSize(unsigned short pid) noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetSpellbookChangesSize(unsigned short pid) noexcept;
/** /**
* \brief Get the action type used in a player's latest spellbook changes. * \brief Get the action type used in a player's latest spellbook changes.
@ -44,7 +44,7 @@ public:
* \param pid The player ID whose spellbook changes should be used. * \param pid The player ID whose spellbook changes should be used.
* \return The action type (0 for SET, 1 for ADD, 2 for REMOVE). * \return The action type (0 for SET, 1 for ADD, 2 for REMOVE).
*/ */
static unsigned int GetSpellbookChangesAction(unsigned short pid) noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetSpellbookChangesAction(unsigned short pid) noexcept;
/** /**
* \brief Set the action type in a player's spellbook changes. * \brief Set the action type in a player's spellbook changes.
@ -53,7 +53,7 @@ public:
* \param action The action (0 for SET, 1 for ADD, 2 for REMOVE). * \param action The action (0 for SET, 1 for ADD, 2 for REMOVE).
* \return void * \return void
*/ */
static void SetSpellbookChangesAction(unsigned short pid, unsigned char action) noexcept; EXPORT_APIFUNCTION void CDECL SetSpellbookChangesAction(unsigned short pid, unsigned char action) noexcept;
/** /**
* \brief Add a new spell to the spellbook changes for a player. * \brief Add a new spell to the spellbook changes for a player.
@ -62,7 +62,7 @@ public:
* \param spellId The spellId of the spell. * \param spellId The spellId of the spell.
* \return void * \return void
*/ */
static void AddSpell(unsigned short pid, const char* spellId) noexcept; EXPORT_APIFUNCTION void CDECL AddSpell(unsigned short pid, const char* spellId) noexcept;
/** /**
* \brief Get the spellId at a certain index in a player's latest spellbook changes. * \brief Get the spellId at a certain index in a player's latest spellbook changes.
@ -71,7 +71,7 @@ public:
* \param index The index of the spell. * \param index The index of the spell.
* \return The spellId. * \return The spellId.
*/ */
static const char *GetSpellId(unsigned short pid, unsigned int index) noexcept; EXPORT_APIFUNCTION const char *CDECL GetSpellId(unsigned short pid, unsigned int index) noexcept;
/** /**
* \brief Send a PlayerSpellbook packet with a player's recorded spellbook changes. * \brief Send a PlayerSpellbook packet with a player's recorded spellbook changes.
@ -83,14 +83,11 @@ public:
* to the packet (false by default). * to the packet (false by default).
* \return void * \return void
*/ */
static void SendSpellbookChanges(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept; EXPORT_APIFUNCTION void CDECL SendSpellbookChanges(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept;
// All methods below are deprecated versions of methods from above // All methods below are deprecated versions of methods from above
static void InitializeSpellbookChanges(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL InitializeSpellbookChanges(unsigned short pid) noexcept;
}
private:
};
#endif //OPENMW_SPELLAPI_HPP #endif //OPENMW_SPELLAPI_HPP

View file

@ -14,17 +14,17 @@
using namespace std; using namespace std;
using namespace ESM; using namespace ESM;
int StatsFunctions::GetAttributeCount() noexcept extern "C" int StatsFunctions::GetAttributeCount() noexcept
{ {
return Attribute::Length; return Attribute::Length;
} }
int StatsFunctions::GetSkillCount() noexcept extern "C" int StatsFunctions::GetSkillCount() noexcept
{ {
return Skill::Length; return Skill::Length;
} }
int StatsFunctions::GetAttributeId(const char *name) noexcept extern "C" int StatsFunctions::GetAttributeId(const char *name) noexcept
{ {
for (int x = 0; x < Attribute::Length; x++) for (int x = 0; x < Attribute::Length; x++)
{ {
@ -37,7 +37,7 @@ int StatsFunctions::GetAttributeId(const char *name) noexcept
return -1; return -1;
} }
int StatsFunctions::GetSkillId(const char *name) noexcept extern "C" int StatsFunctions::GetSkillId(const char *name) noexcept
{ {
for (int x = 0; x < Skill::Length; x++) for (int x = 0; x < Skill::Length; x++)
{ {
@ -50,7 +50,7 @@ int StatsFunctions::GetSkillId(const char *name) noexcept
return -1; return -1;
} }
const char *StatsFunctions::GetAttributeName(unsigned short attributeId) noexcept extern "C" const char *StatsFunctions::GetAttributeName(unsigned short attributeId) noexcept
{ {
if (attributeId >= Attribute::Length) if (attributeId >= Attribute::Length)
return "invalid"; return "invalid";
@ -58,7 +58,7 @@ const char *StatsFunctions::GetAttributeName(unsigned short attributeId) noexcep
return Attribute::sAttributeNames[attributeId].c_str(); return Attribute::sAttributeNames[attributeId].c_str();
} }
const char *StatsFunctions::GetSkillName(unsigned short skillId) noexcept extern "C" const char *StatsFunctions::GetSkillName(unsigned short skillId) noexcept
{ {
if (skillId >= Skill::Length) if (skillId >= Skill::Length)
return "invalid"; return "invalid";
@ -66,7 +66,7 @@ const char *StatsFunctions::GetSkillName(unsigned short skillId) noexcept
return Skill::sSkillNames[skillId].c_str(); return Skill::sSkillNames[skillId].c_str();
} }
const char *StatsFunctions::GetName(unsigned short pid) noexcept extern "C" const char *StatsFunctions::GetName(unsigned short pid) noexcept
{ {
Player *player; Player *player;
@ -75,7 +75,7 @@ const char *StatsFunctions::GetName(unsigned short pid) noexcept
return player->npc.mName.c_str(); return player->npc.mName.c_str();
} }
const char *StatsFunctions::GetRace(unsigned short pid) noexcept extern "C" const char *StatsFunctions::GetRace(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -83,7 +83,7 @@ const char *StatsFunctions::GetRace(unsigned short pid) noexcept
return player->npc.mRace.c_str(); return player->npc.mRace.c_str();
} }
const char *StatsFunctions::GetHead(unsigned short pid) noexcept extern "C" const char *StatsFunctions::GetHead(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -91,7 +91,7 @@ const char *StatsFunctions::GetHead(unsigned short pid) noexcept
return player->npc.mHead.c_str(); return player->npc.mHead.c_str();
} }
const char *StatsFunctions::GetHairstyle(unsigned short pid) noexcept extern "C" const char *StatsFunctions::GetHairstyle(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -99,7 +99,7 @@ const char *StatsFunctions::GetHairstyle(unsigned short pid) noexcept
return player->npc.mHair.c_str(); return player->npc.mHair.c_str();
} }
int StatsFunctions::GetIsMale(unsigned short pid) noexcept extern "C" int StatsFunctions::GetIsMale(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, false); GET_PLAYER(pid, player, false);
@ -107,7 +107,7 @@ int StatsFunctions::GetIsMale(unsigned short pid) noexcept
return player->npc.isMale(); return player->npc.isMale();
} }
const char *StatsFunctions::GetBirthsign(unsigned short pid) noexcept extern "C" const char *StatsFunctions::GetBirthsign(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -115,7 +115,7 @@ const char *StatsFunctions::GetBirthsign(unsigned short pid) noexcept
return player->birthsign.c_str(); return player->birthsign.c_str();
} }
int StatsFunctions::GetLevel(unsigned short pid) noexcept extern "C" int StatsFunctions::GetLevel(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -123,7 +123,7 @@ int StatsFunctions::GetLevel(unsigned short pid) noexcept
return player->creatureStats.mLevel; return player->creatureStats.mLevel;
} }
int StatsFunctions::GetLevelProgress(unsigned short pid) noexcept extern "C" int StatsFunctions::GetLevelProgress(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -131,7 +131,7 @@ int StatsFunctions::GetLevelProgress(unsigned short pid) noexcept
return player->npcStats.mLevelProgress; return player->npcStats.mLevelProgress;
} }
double StatsFunctions::GetHealthBase(unsigned short pid) noexcept extern "C" double StatsFunctions::GetHealthBase(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0.0f); GET_PLAYER(pid, player, 0.0f);
@ -139,7 +139,7 @@ double StatsFunctions::GetHealthBase(unsigned short pid) noexcept
return player->creatureStats.mDynamic[0].mBase; return player->creatureStats.mDynamic[0].mBase;
} }
double StatsFunctions::GetHealthCurrent(unsigned short pid) noexcept extern "C" double StatsFunctions::GetHealthCurrent(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0.0f); GET_PLAYER(pid, player, 0.0f);
@ -147,7 +147,7 @@ double StatsFunctions::GetHealthCurrent(unsigned short pid) noexcept
return player->creatureStats.mDynamic[0].mCurrent; return player->creatureStats.mDynamic[0].mCurrent;
} }
double StatsFunctions::GetMagickaBase(unsigned short pid) noexcept extern "C" double StatsFunctions::GetMagickaBase(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0.0f); GET_PLAYER(pid, player, 0.0f);
@ -155,7 +155,7 @@ double StatsFunctions::GetMagickaBase(unsigned short pid) noexcept
return player->creatureStats.mDynamic[1].mBase; return player->creatureStats.mDynamic[1].mBase;
} }
double StatsFunctions::GetMagickaCurrent(unsigned short pid) noexcept extern "C" double StatsFunctions::GetMagickaCurrent(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0.0f); GET_PLAYER(pid, player, 0.0f);
@ -163,7 +163,7 @@ double StatsFunctions::GetMagickaCurrent(unsigned short pid) noexcept
return player->creatureStats.mDynamic[1].mCurrent; return player->creatureStats.mDynamic[1].mCurrent;
} }
double StatsFunctions::GetFatigueBase(unsigned short pid) noexcept extern "C" double StatsFunctions::GetFatigueBase(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0.0f); GET_PLAYER(pid, player, 0.0f);
@ -171,7 +171,7 @@ double StatsFunctions::GetFatigueBase(unsigned short pid) noexcept
return player->creatureStats.mDynamic[2].mBase; return player->creatureStats.mDynamic[2].mBase;
} }
double StatsFunctions::GetFatigueCurrent(unsigned short pid) noexcept extern "C" double StatsFunctions::GetFatigueCurrent(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0.0f); GET_PLAYER(pid, player, 0.0f);
@ -179,7 +179,7 @@ double StatsFunctions::GetFatigueCurrent(unsigned short pid) noexcept
return player->creatureStats.mDynamic[2].mCurrent; return player->creatureStats.mDynamic[2].mCurrent;
} }
int StatsFunctions::GetAttributeBase(unsigned short pid, unsigned short attributeId) noexcept extern "C" int StatsFunctions::GetAttributeBase(unsigned short pid, unsigned short attributeId) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -190,7 +190,7 @@ int StatsFunctions::GetAttributeBase(unsigned short pid, unsigned short attribut
return player->creatureStats.mAttributes[attributeId].mBase; return player->creatureStats.mAttributes[attributeId].mBase;
} }
int StatsFunctions::GetAttributeModifier(unsigned short pid, unsigned short attributeId) noexcept extern "C" int StatsFunctions::GetAttributeModifier(unsigned short pid, unsigned short attributeId) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -201,18 +201,7 @@ int StatsFunctions::GetAttributeModifier(unsigned short pid, unsigned short attr
return player->creatureStats.mAttributes[attributeId].mMod; return player->creatureStats.mAttributes[attributeId].mMod;
} }
double StatsFunctions::GetAttributeDamage(unsigned short pid, unsigned short attributeId) noexcept extern "C" int StatsFunctions::GetSkillBase(unsigned short pid, unsigned short skillId) noexcept
{
Player *player;
GET_PLAYER(pid, player, 0);
if (attributeId >= Attribute::Length)
return 0;
return player->creatureStats.mAttributes[attributeId].mDamage;
}
int StatsFunctions::GetSkillBase(unsigned short pid, unsigned short skillId) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -223,7 +212,7 @@ int StatsFunctions::GetSkillBase(unsigned short pid, unsigned short skillId) noe
return player->npcStats.mSkills[skillId].mBase; return player->npcStats.mSkills[skillId].mBase;
} }
int StatsFunctions::GetSkillModifier(unsigned short pid, unsigned short skillId) noexcept extern "C" int StatsFunctions::GetSkillModifier(unsigned short pid, unsigned short skillId) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -234,18 +223,7 @@ int StatsFunctions::GetSkillModifier(unsigned short pid, unsigned short skillId)
return player->npcStats.mSkills[skillId].mMod; return player->npcStats.mSkills[skillId].mMod;
} }
double StatsFunctions::GetSkillDamage(unsigned short pid, unsigned short skillId) noexcept extern "C" double StatsFunctions::GetSkillProgress(unsigned short pid, unsigned short skillId) noexcept
{
Player *player;
GET_PLAYER(pid, player, 0);
if (skillId >= Skill::Length)
return 0;
return player->npcStats.mSkills[skillId].mDamage;
}
double StatsFunctions::GetSkillProgress(unsigned short pid, unsigned short skillId) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0.0f); GET_PLAYER(pid, player, 0.0f);
@ -256,18 +234,18 @@ double StatsFunctions::GetSkillProgress(unsigned short pid, unsigned short skill
return player->npcStats.mSkills[skillId].mProgress; return player->npcStats.mSkills[skillId].mProgress;
} }
int StatsFunctions::GetSkillIncrease(unsigned short pid, unsigned int attributeId) noexcept extern "C" int StatsFunctions::GetSkillIncrease(unsigned short pid, unsigned int attributeId) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
if (attributeId > Attribute::Length) if (attributeId >= Attribute::Length)
return 0; return 0;
return player->npcStats.mSkillIncrease[attributeId]; return player->npcStats.mSkillIncrease[attributeId];
} }
int StatsFunctions::GetBounty(unsigned short pid) noexcept extern "C" int StatsFunctions::GetBounty(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, 0); GET_PLAYER(pid, player, 0);
@ -275,7 +253,7 @@ int StatsFunctions::GetBounty(unsigned short pid) noexcept
return player->npcStats.mBounty; return player->npcStats.mBounty;
} }
void StatsFunctions::SetName(unsigned short pid, const char *name) noexcept extern "C" void StatsFunctions::SetName(unsigned short pid, const char *name) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);
@ -286,7 +264,7 @@ void StatsFunctions::SetName(unsigned short pid, const char *name) noexcept
player->npc.mName = name; player->npc.mName = name;
} }
void StatsFunctions::SetRace(unsigned short pid, const char *race) noexcept extern "C" void StatsFunctions::SetRace(unsigned short pid, const char *race) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);
@ -300,7 +278,7 @@ void StatsFunctions::SetRace(unsigned short pid, const char *race) noexcept
player->npc.mRace = race; player->npc.mRace = race;
} }
void StatsFunctions::SetHead(unsigned short pid, const char *head) noexcept extern "C" void StatsFunctions::SetHead(unsigned short pid, const char *head) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);
@ -311,7 +289,7 @@ void StatsFunctions::SetHead(unsigned short pid, const char *head) noexcept
player->npc.mHead = head; player->npc.mHead = head;
} }
void StatsFunctions::SetHairstyle(unsigned short pid, const char *hairstyle) noexcept extern "C" void StatsFunctions::SetHairstyle(unsigned short pid, const char *hairstyle) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);
@ -322,7 +300,7 @@ void StatsFunctions::SetHairstyle(unsigned short pid, const char *hairstyle) noe
player->npc.mHair = hairstyle; player->npc.mHair = hairstyle;
} }
void StatsFunctions::SetIsMale(unsigned short pid, int state) noexcept extern "C" void StatsFunctions::SetIsMale(unsigned short pid, int state) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);
@ -330,7 +308,7 @@ void StatsFunctions::SetIsMale(unsigned short pid, int state) noexcept
player->npc.setIsMale(state == true); player->npc.setIsMale(state == true);
} }
void StatsFunctions::SetBirthsign(unsigned short pid, const char *sign) noexcept extern "C" void StatsFunctions::SetBirthsign(unsigned short pid, const char *sign) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -341,7 +319,7 @@ void StatsFunctions::SetBirthsign(unsigned short pid, const char *sign) noexcept
player->birthsign = sign; player->birthsign = sign;
} }
void StatsFunctions::SetResetStats(unsigned short pid, bool resetStats) noexcept extern "C" void StatsFunctions::SetResetStats(unsigned short pid, bool resetStats) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -349,7 +327,7 @@ void StatsFunctions::SetResetStats(unsigned short pid, bool resetStats) noexcept
player->resetStats = resetStats; player->resetStats = resetStats;
} }
void StatsFunctions::SetLevel(unsigned short pid, int value) noexcept extern "C" void StatsFunctions::SetLevel(unsigned short pid, int value) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -357,7 +335,7 @@ void StatsFunctions::SetLevel(unsigned short pid, int value) noexcept
player->creatureStats.mLevel = value; player->creatureStats.mLevel = value;
} }
void StatsFunctions::SetLevelProgress(unsigned short pid, int value) noexcept extern "C" void StatsFunctions::SetLevelProgress(unsigned short pid, int value) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -365,7 +343,7 @@ void StatsFunctions::SetLevelProgress(unsigned short pid, int value) noexcept
player->npcStats.mLevelProgress = value; player->npcStats.mLevelProgress = value;
} }
void StatsFunctions::SetHealthBase(unsigned short pid, double value) noexcept extern "C" void StatsFunctions::SetHealthBase(unsigned short pid, double value) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);
@ -376,7 +354,7 @@ void StatsFunctions::SetHealthBase(unsigned short pid, double value) noexcept
player->statsDynamicIndexChanges.push_back(0); player->statsDynamicIndexChanges.push_back(0);
} }
void StatsFunctions::SetHealthCurrent(unsigned short pid, double value) noexcept extern "C" void StatsFunctions::SetHealthCurrent(unsigned short pid, double value) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);
@ -387,7 +365,7 @@ void StatsFunctions::SetHealthCurrent(unsigned short pid, double value) noexcept
player->statsDynamicIndexChanges.push_back(0); player->statsDynamicIndexChanges.push_back(0);
} }
void StatsFunctions::SetMagickaBase(unsigned short pid, double value) noexcept extern "C" void StatsFunctions::SetMagickaBase(unsigned short pid, double value) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);
@ -398,7 +376,7 @@ void StatsFunctions::SetMagickaBase(unsigned short pid, double value) noexcept
player->statsDynamicIndexChanges.push_back(1); player->statsDynamicIndexChanges.push_back(1);
} }
void StatsFunctions::SetMagickaCurrent(unsigned short pid, double value) noexcept extern "C" void StatsFunctions::SetMagickaCurrent(unsigned short pid, double value) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);
@ -409,7 +387,7 @@ void StatsFunctions::SetMagickaCurrent(unsigned short pid, double value) noexcep
player->statsDynamicIndexChanges.push_back(1); player->statsDynamicIndexChanges.push_back(1);
} }
void StatsFunctions::SetFatigueBase(unsigned short pid, double value) noexcept extern "C" void StatsFunctions::SetFatigueBase(unsigned short pid, double value) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);
@ -420,7 +398,7 @@ void StatsFunctions::SetFatigueBase(unsigned short pid, double value) noexcept
player->statsDynamicIndexChanges.push_back(2); player->statsDynamicIndexChanges.push_back(2);
} }
void StatsFunctions::SetFatigueCurrent(unsigned short pid, double value) noexcept extern "C" void StatsFunctions::SetFatigueCurrent(unsigned short pid, double value) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);
@ -431,7 +409,7 @@ void StatsFunctions::SetFatigueCurrent(unsigned short pid, double value) noexcep
player->statsDynamicIndexChanges.push_back(2); player->statsDynamicIndexChanges.push_back(2);
} }
void StatsFunctions::SetAttributeBase(unsigned short pid, unsigned short attributeId, int value) noexcept extern "C" void StatsFunctions::SetAttributeBase(unsigned short pid, unsigned short attributeId, int value) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);
@ -445,7 +423,7 @@ void StatsFunctions::SetAttributeBase(unsigned short pid, unsigned short attribu
player->attributeIndexChanges.push_back(attributeId); player->attributeIndexChanges.push_back(attributeId);
} }
void StatsFunctions::ClearAttributeModifier(unsigned short pid, unsigned short attributeId) noexcept extern "C" void StatsFunctions::ClearAttributeModifier(unsigned short pid, unsigned short attributeId) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);
@ -459,21 +437,7 @@ void StatsFunctions::ClearAttributeModifier(unsigned short pid, unsigned short a
player->attributeIndexChanges.push_back(attributeId); player->attributeIndexChanges.push_back(attributeId);
} }
void StatsFunctions::SetAttributeDamage(unsigned short pid, unsigned short attributeId, double value) noexcept extern "C" void StatsFunctions::SetSkillBase(unsigned short pid, unsigned short skillId, int value) noexcept
{
Player *player;
GET_PLAYER(pid, player, );
if (attributeId >= Attribute::Length)
return;
player->creatureStats.mAttributes[attributeId].mDamage = value;
if (!Utils::vectorContains(player->attributeIndexChanges, attributeId))
player->attributeIndexChanges.push_back(attributeId);
}
void StatsFunctions::SetSkillBase(unsigned short pid, unsigned short skillId, int value) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);
@ -487,7 +451,7 @@ void StatsFunctions::SetSkillBase(unsigned short pid, unsigned short skillId, in
player->skillIndexChanges.push_back(skillId); player->skillIndexChanges.push_back(skillId);
} }
void StatsFunctions::ClearSkillModifier(unsigned short pid, unsigned short skillId) noexcept extern "C" void StatsFunctions::ClearSkillModifier(unsigned short pid, unsigned short skillId) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);
@ -501,21 +465,7 @@ void StatsFunctions::ClearSkillModifier(unsigned short pid, unsigned short skill
player->skillIndexChanges.push_back(skillId); player->skillIndexChanges.push_back(skillId);
} }
void StatsFunctions::SetSkillDamage(unsigned short pid, unsigned short skillId, double value) noexcept extern "C" void StatsFunctions::SetSkillProgress(unsigned short pid, unsigned short skillId, double value) noexcept
{
Player *player;
GET_PLAYER(pid, player, );
if (skillId >= Skill::Length)
return;
player->npcStats.mSkills[skillId].mDamage = value;
if (!Utils::vectorContains(player->skillIndexChanges, skillId))
player->skillIndexChanges.push_back(skillId);
}
void StatsFunctions::SetSkillProgress(unsigned short pid, unsigned short skillId, double value) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -529,12 +479,12 @@ void StatsFunctions::SetSkillProgress(unsigned short pid, unsigned short skillId
player->skillIndexChanges.push_back(skillId); player->skillIndexChanges.push_back(skillId);
} }
void StatsFunctions::SetSkillIncrease(unsigned short pid, unsigned int attributeId, int value) noexcept extern "C" void StatsFunctions::SetSkillIncrease(unsigned short pid, unsigned int attributeId, int value) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);
if (attributeId > Attribute::Length) if (attributeId >= Attribute::Length)
return; return;
player->npcStats.mSkillIncrease[attributeId] = value; player->npcStats.mSkillIncrease[attributeId] = value;
@ -543,7 +493,7 @@ void StatsFunctions::SetSkillIncrease(unsigned short pid, unsigned int attribute
player->attributeIndexChanges.push_back(attributeId); player->attributeIndexChanges.push_back(attributeId);
} }
void StatsFunctions::SetBounty(unsigned short pid, int value) noexcept extern "C" void StatsFunctions::SetBounty(unsigned short pid, int value) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -551,7 +501,7 @@ void StatsFunctions::SetBounty(unsigned short pid, int value) noexcept
player->npcStats.mBounty = value; player->npcStats.mBounty = value;
} }
void StatsFunctions::SetCharGenStage(unsigned short pid, int currentStage, int endStage) noexcept extern "C" void StatsFunctions::SetCharGenStage(unsigned short pid, int currentStage, int endStage) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);
@ -566,7 +516,7 @@ void StatsFunctions::SetCharGenStage(unsigned short pid, int currentStage, int e
packet->Send(false); packet->Send(false);
} }
void StatsFunctions::SendBaseInfo(unsigned short pid) noexcept extern "C" void StatsFunctions::SendBaseInfo(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);
@ -578,7 +528,7 @@ void StatsFunctions::SendBaseInfo(unsigned short pid) noexcept
packet->Send(true); packet->Send(true);
} }
void StatsFunctions::SendStatsDynamic(unsigned short pid) noexcept extern "C" void StatsFunctions::SendStatsDynamic(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -592,7 +542,7 @@ void StatsFunctions::SendStatsDynamic(unsigned short pid) noexcept
player->statsDynamicIndexChanges.clear(); player->statsDynamicIndexChanges.clear();
} }
void StatsFunctions::SendAttributes(unsigned short pid) noexcept extern "C" void StatsFunctions::SendAttributes(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);
@ -606,7 +556,7 @@ void StatsFunctions::SendAttributes(unsigned short pid) noexcept
player->attributeIndexChanges.clear(); player->attributeIndexChanges.clear();
} }
void StatsFunctions::SendSkills(unsigned short pid) noexcept extern "C" void StatsFunctions::SendSkills(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player,); GET_PLAYER(pid, player,);
@ -620,7 +570,7 @@ void StatsFunctions::SendSkills(unsigned short pid) noexcept
player->skillIndexChanges.clear(); player->skillIndexChanges.clear();
} }
void StatsFunctions::SendLevel(unsigned short pid) noexcept extern "C" void StatsFunctions::SendLevel(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -632,7 +582,7 @@ void StatsFunctions::SendLevel(unsigned short pid) noexcept
packet->Send(true); packet->Send(true);
} }
void StatsFunctions::SendBounty(unsigned short pid) noexcept extern "C" void StatsFunctions::SendBounty(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );

View file

@ -1,6 +1,8 @@
#ifndef OPENMW_STATAPI_HPP #ifndef OPENMW_STATAPI_HPP
#define OPENMW_STATAPI_HPP #define OPENMW_STATAPI_HPP
#include <Script/Platform.hpp>
#define STATAPI \ #define STATAPI \
{"GetAttributeCount", StatsFunctions::GetAttributeCount},\ {"GetAttributeCount", StatsFunctions::GetAttributeCount},\
{"GetSkillCount", StatsFunctions::GetSkillCount},\ {"GetSkillCount", StatsFunctions::GetSkillCount},\
@ -30,11 +32,9 @@
\ \
{"GetAttributeBase", StatsFunctions::GetAttributeBase},\ {"GetAttributeBase", StatsFunctions::GetAttributeBase},\
{"GetAttributeModifier", StatsFunctions::GetAttributeModifier},\ {"GetAttributeModifier", StatsFunctions::GetAttributeModifier},\
{"GetAttributeDamage", StatsFunctions::GetAttributeDamage},\
\ \
{"GetSkillBase", StatsFunctions::GetSkillBase},\ {"GetSkillBase", StatsFunctions::GetSkillBase},\
{"GetSkillModifier", StatsFunctions::GetSkillModifier},\ {"GetSkillModifier", StatsFunctions::GetSkillModifier},\
{"GetSkillDamage", StatsFunctions::GetSkillDamage},\
{"GetSkillProgress", StatsFunctions::GetSkillProgress},\ {"GetSkillProgress", StatsFunctions::GetSkillProgress},\
{"GetSkillIncrease", StatsFunctions::GetSkillIncrease},\ {"GetSkillIncrease", StatsFunctions::GetSkillIncrease},\
\ \
@ -60,11 +60,9 @@
\ \
{"SetAttributeBase", StatsFunctions::SetAttributeBase},\ {"SetAttributeBase", StatsFunctions::SetAttributeBase},\
{"ClearAttributeModifier", StatsFunctions::ClearAttributeModifier},\ {"ClearAttributeModifier", StatsFunctions::ClearAttributeModifier},\
{"SetAttributeDamage", StatsFunctions::SetAttributeDamage},\
\ \
{"SetSkillBase", StatsFunctions::SetSkillBase},\ {"SetSkillBase", StatsFunctions::SetSkillBase},\
{"ClearSkillModifier", StatsFunctions::ClearSkillModifier},\ {"ClearSkillModifier", StatsFunctions::ClearSkillModifier},\
{"SetSkillDamage", StatsFunctions::SetSkillDamage},\
{"SetSkillProgress", StatsFunctions::SetSkillProgress},\ {"SetSkillProgress", StatsFunctions::SetSkillProgress},\
{"SetSkillIncrease", StatsFunctions::SetSkillIncrease},\ {"SetSkillIncrease", StatsFunctions::SetSkillIncrease},\
\ \
@ -79,10 +77,8 @@
{"SendLevel", StatsFunctions::SendLevel},\ {"SendLevel", StatsFunctions::SendLevel},\
{"SendBounty", StatsFunctions::SendBounty} {"SendBounty", StatsFunctions::SendBounty}
class StatsFunctions namespace StatsFunctions
{ {
public:
/** /**
* \brief Get the number of attributes. * \brief Get the number of attributes.
* *
@ -90,7 +86,7 @@ public:
* *
* \return The number of attributes. * \return The number of attributes.
*/ */
static int GetAttributeCount() noexcept; EXPORT_APIFUNCTION int CDECL GetAttributeCount() noexcept;
/** /**
* \brief Get the number of skills. * \brief Get the number of skills.
@ -99,7 +95,7 @@ public:
* *
* \return The number of skills. * \return The number of skills.
*/ */
static int GetSkillCount() noexcept; EXPORT_APIFUNCTION int CDECL GetSkillCount() noexcept;
/** /**
* \brief Get the numerical ID of an attribute with a certain name. * \brief Get the numerical ID of an attribute with a certain name.
@ -109,7 +105,7 @@ public:
* \param name The name of the attribute. * \param name The name of the attribute.
* \return The ID of the attribute. * \return The ID of the attribute.
*/ */
static int GetAttributeId(const char *name) noexcept; EXPORT_APIFUNCTION int CDECL GetAttributeId(const char *name) noexcept;
/** /**
* \brief Get the numerical ID of a skill with a certain name. * \brief Get the numerical ID of a skill with a certain name.
@ -119,7 +115,7 @@ public:
* \param name The name of the skill. * \param name The name of the skill.
* \return The ID of the skill. * \return The ID of the skill.
*/ */
static int GetSkillId(const char *name) noexcept; EXPORT_APIFUNCTION int CDECL GetSkillId(const char *name) noexcept;
/** /**
* \brief Get the name of the attribute with a certain numerical ID. * \brief Get the name of the attribute with a certain numerical ID.
@ -129,7 +125,7 @@ public:
* \param attributeId The ID of the attribute. * \param attributeId The ID of the attribute.
* \return The name of the attribute. * \return The name of the attribute.
*/ */
static const char *GetAttributeName(unsigned short attributeId) noexcept; EXPORT_APIFUNCTION const char *CDECL GetAttributeName(unsigned short attributeId) noexcept;
/** /**
* \brief Get the name of the skill with a certain numerical ID. * \brief Get the name of the skill with a certain numerical ID.
@ -139,7 +135,7 @@ public:
* \param skillId The ID of the skill. * \param skillId The ID of the skill.
* \return The name of the skill. * \return The name of the skill.
*/ */
static const char *GetSkillName(unsigned short skillId) noexcept; EXPORT_APIFUNCTION const char *CDECL GetSkillName(unsigned short skillId) noexcept;
/** /**
* \brief Get the name of a player. * \brief Get the name of a player.
@ -147,7 +143,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The name of the player. * \return The name of the player.
*/ */
static const char *GetName(unsigned short pid) noexcept; EXPORT_APIFUNCTION const char *CDECL GetName(unsigned short pid) noexcept;
/** /**
* \brief Get the race of a player. * \brief Get the race of a player.
@ -155,7 +151,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The race of the player. * \return The race of the player.
*/ */
static const char *GetRace(unsigned short pid) noexcept; EXPORT_APIFUNCTION const char *CDECL GetRace(unsigned short pid) noexcept;
/** /**
* \brief Get the head mesh used by a player. * \brief Get the head mesh used by a player.
@ -163,7 +159,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The head mesh of the player. * \return The head mesh of the player.
*/ */
static const char *GetHead(unsigned short pid) noexcept; EXPORT_APIFUNCTION const char *CDECL GetHead(unsigned short pid) noexcept;
/** /**
* \brief Get the hairstyle mesh used by a player. * \brief Get the hairstyle mesh used by a player.
@ -171,7 +167,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The hairstyle mesh of the player. * \return The hairstyle mesh of the player.
*/ */
static const char *GetHairstyle(unsigned short pid) noexcept; EXPORT_APIFUNCTION const char *CDECL GetHairstyle(unsigned short pid) noexcept;
/** /**
* \brief Check whether a player is male or not. * \brief Check whether a player is male or not.
@ -179,7 +175,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return Whether the player is male. * \return Whether the player is male.
*/ */
static int GetIsMale(unsigned short pid) noexcept; EXPORT_APIFUNCTION int CDECL GetIsMale(unsigned short pid) noexcept;
/** /**
* \brief Get the birthsign of a player. * \brief Get the birthsign of a player.
@ -187,7 +183,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The birthsign of the player. * \return The birthsign of the player.
*/ */
static const char *GetBirthsign(unsigned short pid) noexcept; EXPORT_APIFUNCTION const char *CDECL GetBirthsign(unsigned short pid) noexcept;
/** /**
* \brief Get the character level of a player. * \brief Get the character level of a player.
@ -195,7 +191,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The level of the player. * \return The level of the player.
*/ */
static int GetLevel(unsigned short pid) noexcept; EXPORT_APIFUNCTION int CDECL GetLevel(unsigned short pid) noexcept;
/** /**
* \brief Get the player's progress to their next character level. * \brief Get the player's progress to their next character level.
@ -203,7 +199,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The level progress. * \return The level progress.
*/ */
static int GetLevelProgress(unsigned short pid) noexcept; EXPORT_APIFUNCTION int CDECL GetLevelProgress(unsigned short pid) noexcept;
/** /**
* \brief Get the base health of the player. * \brief Get the base health of the player.
@ -211,7 +207,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The base health. * \return The base health.
*/ */
static double GetHealthBase(unsigned short pid) noexcept; EXPORT_APIFUNCTION double CDECL GetHealthBase(unsigned short pid) noexcept;
/** /**
* \brief Get the current health of the player. * \brief Get the current health of the player.
@ -219,7 +215,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The current health. * \return The current health.
*/ */
static double GetHealthCurrent(unsigned short pid) noexcept; EXPORT_APIFUNCTION double CDECL GetHealthCurrent(unsigned short pid) noexcept;
/** /**
* \brief Get the base magicka of the player. * \brief Get the base magicka of the player.
@ -227,7 +223,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The base magicka. * \return The base magicka.
*/ */
static double GetMagickaBase(unsigned short pid) noexcept; EXPORT_APIFUNCTION double CDECL GetMagickaBase(unsigned short pid) noexcept;
/** /**
* \brief Get the current magicka of the player. * \brief Get the current magicka of the player.
@ -235,7 +231,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The current magicka. * \return The current magicka.
*/ */
static double GetMagickaCurrent(unsigned short pid) noexcept; EXPORT_APIFUNCTION double CDECL GetMagickaCurrent(unsigned short pid) noexcept;
/** /**
* \brief Get the base fatigue of the player. * \brief Get the base fatigue of the player.
@ -243,7 +239,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The base fatigue. * \return The base fatigue.
*/ */
static double GetFatigueBase(unsigned short pid) noexcept; EXPORT_APIFUNCTION double CDECL GetFatigueBase(unsigned short pid) noexcept;
/** /**
* \brief Get the current fatigue of the player. * \brief Get the current fatigue of the player.
@ -251,7 +247,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The current fatigue. * \return The current fatigue.
*/ */
static double GetFatigueCurrent(unsigned short pid) noexcept; EXPORT_APIFUNCTION double CDECL GetFatigueCurrent(unsigned short pid) noexcept;
/** /**
* \brief Get the base value of a player's attribute. * \brief Get the base value of a player's attribute.
@ -260,7 +256,7 @@ public:
* \param attributeId The attribute ID. * \param attributeId The attribute ID.
* \return The base value of the attribute. * \return The base value of the attribute.
*/ */
static int GetAttributeBase(unsigned short pid, unsigned short attributeId) noexcept; EXPORT_APIFUNCTION int CDECL GetAttributeBase(unsigned short pid, unsigned short attributeId) noexcept;
/** /**
* \brief Get the modifier value of a player's attribute. * \brief Get the modifier value of a player's attribute.
@ -269,17 +265,7 @@ public:
* \param attributeId The attribute ID. * \param attributeId The attribute ID.
* \return The modifier value of the attribute. * \return The modifier value of the attribute.
*/ */
static int GetAttributeModifier(unsigned short pid, unsigned short attributeId) noexcept; EXPORT_APIFUNCTION int CDECL GetAttributeModifier(unsigned short pid, unsigned short attributeId) noexcept;
/**
* \brief Get the amount of damage (as caused through the Damage Attribute effect)
* to a player's attribute.
*
* \param pid The player ID.
* \param attributeId The attribute ID.
* \return The amount of damage to the attribute.
*/
static double GetAttributeDamage(unsigned short pid, unsigned short attributeId) noexcept;
/** /**
* \brief Get the base value of a player's skill. * \brief Get the base value of a player's skill.
@ -288,7 +274,7 @@ public:
* \param skillId The skill ID. * \param skillId The skill ID.
* \return The base value of the skill. * \return The base value of the skill.
*/ */
static int GetSkillBase(unsigned short pid, unsigned short skillId) noexcept; EXPORT_APIFUNCTION int CDECL GetSkillBase(unsigned short pid, unsigned short skillId) noexcept;
/** /**
* \brief Get the modifier value of a player's skill. * \brief Get the modifier value of a player's skill.
@ -297,17 +283,7 @@ public:
* \param skillId The skill ID. * \param skillId The skill ID.
* \return The modifier value of the skill. * \return The modifier value of the skill.
*/ */
static int GetSkillModifier(unsigned short pid, unsigned short skillId) noexcept; EXPORT_APIFUNCTION int CDECL GetSkillModifier(unsigned short pid, unsigned short skillId) noexcept;
/**
* \brief Get the amount of damage (as caused through the Damage Skill effect)
* to a player's skill.
*
* \param pid The player ID.
* \param skillId The skill ID.
* \return The amount of damage to the skill.
*/
static double GetSkillDamage(unsigned short pid, unsigned short skillId) noexcept;
/** /**
* \brief Get the progress the player has made towards increasing a certain skill by 1. * \brief Get the progress the player has made towards increasing a certain skill by 1.
@ -316,7 +292,7 @@ public:
* \param skillId The skill ID. * \param skillId The skill ID.
* \return The skill progress. * \return The skill progress.
*/ */
static double GetSkillProgress(unsigned short pid, unsigned short skillId) noexcept; EXPORT_APIFUNCTION double CDECL GetSkillProgress(unsigned short pid, unsigned short skillId) noexcept;
/** /**
* \brief Get the bonus applied to a certain attribute at the next level up as a result * \brief Get the bonus applied to a certain attribute at the next level up as a result
@ -328,7 +304,7 @@ public:
* \param skillId The attribute ID. * \param skillId The attribute ID.
* \return The increase in the attribute caused by skills. * \return The increase in the attribute caused by skills.
*/ */
static int GetSkillIncrease(unsigned short pid, unsigned int attributeId) noexcept; EXPORT_APIFUNCTION int CDECL GetSkillIncrease(unsigned short pid, unsigned int attributeId) noexcept;
/** /**
* \brief Get the bounty of the player. * \brief Get the bounty of the player.
@ -336,7 +312,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return The bounty. * \return The bounty.
*/ */
static int GetBounty(unsigned short pid) noexcept; EXPORT_APIFUNCTION int CDECL GetBounty(unsigned short pid) noexcept;
/** /**
* \brief Set the name of a player. * \brief Set the name of a player.
@ -345,7 +321,7 @@ public:
* \param name The new name of the player. * \param name The new name of the player.
* \return void * \return void
*/ */
static void SetName(unsigned short pid, const char *name) noexcept; EXPORT_APIFUNCTION void CDECL SetName(unsigned short pid, const char *name) noexcept;
/** /**
* \brief Set the race of a player. * \brief Set the race of a player.
@ -354,7 +330,7 @@ public:
* \param race The new race of the player. * \param race The new race of the player.
* \return void * \return void
*/ */
static void SetRace(unsigned short pid, const char *race) noexcept; EXPORT_APIFUNCTION void CDECL SetRace(unsigned short pid, const char *race) noexcept;
/** /**
* \brief Set the head mesh used by a player. * \brief Set the head mesh used by a player.
@ -363,7 +339,7 @@ public:
* \param head The new head mesh of the player. * \param head The new head mesh of the player.
* \return void * \return void
*/ */
static void SetHead(unsigned short pid, const char *head) noexcept; EXPORT_APIFUNCTION void CDECL SetHead(unsigned short pid, const char *head) noexcept;
/** /**
* \brief Set the hairstyle mesh used by a player. * \brief Set the hairstyle mesh used by a player.
@ -372,7 +348,7 @@ public:
* \param hairstyle The new hairstyle mesh of the player. * \param hairstyle The new hairstyle mesh of the player.
* \return void * \return void
*/ */
static void SetHairstyle(unsigned short pid, const char *hairstyle) noexcept; EXPORT_APIFUNCTION void CDECL SetHairstyle(unsigned short pid, const char *hairstyle) noexcept;
/** /**
* \brief Set whether a player is male or not. * \brief Set whether a player is male or not.
@ -381,7 +357,7 @@ public:
* \param state Whether the player is male. * \param state Whether the player is male.
* \return void * \return void
*/ */
static void SetIsMale(unsigned short pid, int state) noexcept; EXPORT_APIFUNCTION void CDECL SetIsMale(unsigned short pid, int state) noexcept;
/** /**
* \brief Set the birthsign of a player. * \brief Set the birthsign of a player.
@ -390,7 +366,7 @@ public:
* \param name The new birthsign of the player. * \param name The new birthsign of the player.
* \return void * \return void
*/ */
static void SetBirthsign(unsigned short pid, const char *name) noexcept; EXPORT_APIFUNCTION void CDECL SetBirthsign(unsigned short pid, const char *name) noexcept;
/** /**
* \brief Set whether the player's stats should be reset based on their * \brief Set whether the player's stats should be reset based on their
@ -403,7 +379,7 @@ public:
* \param resetStats The stat reset state. * \param resetStats The stat reset state.
* \return void * \return void
*/ */
static void SetResetStats(unsigned short pid, bool resetStats) noexcept; EXPORT_APIFUNCTION void CDECL SetResetStats(unsigned short pid, bool resetStats) noexcept;
/** /**
* \brief Set the character level of a player. * \brief Set the character level of a player.
@ -412,7 +388,7 @@ public:
* \param value The new level of the player. * \param value The new level of the player.
* \return void * \return void
*/ */
static void SetLevel(unsigned short pid, int value) noexcept; EXPORT_APIFUNCTION void CDECL SetLevel(unsigned short pid, int value) noexcept;
/** /**
* \brief Set the player's progress to their next character level. * \brief Set the player's progress to their next character level.
@ -421,7 +397,7 @@ public:
* \param value The new level progress of the player. * \param value The new level progress of the player.
* \return void * \return void
*/ */
static void SetLevelProgress(unsigned short pid, int value) noexcept; EXPORT_APIFUNCTION void CDECL SetLevelProgress(unsigned short pid, int value) noexcept;
/** /**
* \brief Set the base health of a player. * \brief Set the base health of a player.
@ -430,7 +406,7 @@ public:
* \param name The new base health of the player. * \param name The new base health of the player.
* \return void * \return void
*/ */
static void SetHealthBase(unsigned short pid, double value) noexcept; EXPORT_APIFUNCTION void CDECL SetHealthBase(unsigned short pid, double value) noexcept;
/** /**
* \brief Set the current health of a player. * \brief Set the current health of a player.
@ -439,7 +415,7 @@ public:
* \param name The new current health of the player. * \param name The new current health of the player.
* \return void * \return void
*/ */
static void SetHealthCurrent(unsigned short pid, double value) noexcept; EXPORT_APIFUNCTION void CDECL SetHealthCurrent(unsigned short pid, double value) noexcept;
/** /**
* \brief Set the base magicka of a player. * \brief Set the base magicka of a player.
@ -448,7 +424,7 @@ public:
* \param name The new base magicka of the player. * \param name The new base magicka of the player.
* \return void * \return void
*/ */
static void SetMagickaBase(unsigned short pid, double value) noexcept; EXPORT_APIFUNCTION void CDECL SetMagickaBase(unsigned short pid, double value) noexcept;
/** /**
* \brief Set the current magicka of a player. * \brief Set the current magicka of a player.
@ -457,7 +433,7 @@ public:
* \param name The new current magicka of the player. * \param name The new current magicka of the player.
* \return void * \return void
*/ */
static void SetMagickaCurrent(unsigned short pid, double value) noexcept; EXPORT_APIFUNCTION void CDECL SetMagickaCurrent(unsigned short pid, double value) noexcept;
/** /**
* \brief Set the base fatigue of a player. * \brief Set the base fatigue of a player.
@ -466,7 +442,7 @@ public:
* \param name The new base fatigue of the player. * \param name The new base fatigue of the player.
* \return void * \return void
*/ */
static void SetFatigueBase(unsigned short pid, double value) noexcept; EXPORT_APIFUNCTION void CDECL SetFatigueBase(unsigned short pid, double value) noexcept;
/** /**
* \brief Set the current fatigue of a player. * \brief Set the current fatigue of a player.
@ -475,7 +451,7 @@ public:
* \param name The new current fatigue of the player. * \param name The new current fatigue of the player.
* \return void * \return void
*/ */
static void SetFatigueCurrent(unsigned short pid, double value) noexcept; EXPORT_APIFUNCTION void CDECL SetFatigueCurrent(unsigned short pid, double value) noexcept;
/** /**
* \brief Set the base value of a player's attribute. * \brief Set the base value of a player's attribute.
@ -485,7 +461,7 @@ public:
* \param value The new base value of the player's attribute. * \param value The new base value of the player's attribute.
* \return void * \return void
*/ */
static void SetAttributeBase(unsigned short pid, unsigned short attributeId, int value) noexcept; EXPORT_APIFUNCTION void CDECL SetAttributeBase(unsigned short pid, unsigned short attributeId, int value) noexcept;
/** /**
* \brief Clear the modifier value of a player's attribute. * \brief Clear the modifier value of a player's attribute.
@ -499,18 +475,7 @@ public:
* \param attributeId The attribute ID. * \param attributeId The attribute ID.
* \return void * \return void
*/ */
static void ClearAttributeModifier(unsigned short pid, unsigned short attributeId) noexcept; EXPORT_APIFUNCTION void CDECL ClearAttributeModifier(unsigned short pid, unsigned short attributeId) noexcept;
/**
* \brief Set the amount of damage (as caused through the Damage Attribute effect) to
* a player's attribute.
*
* \param pid The player ID.
* \param attributeId The attribute ID.
* \param value The amount of damage to the player's attribute.
* \return void
*/
static void SetAttributeDamage(unsigned short pid, unsigned short attributeId, double value) noexcept;
/** /**
* \brief Set the base value of a player's skill. * \brief Set the base value of a player's skill.
@ -520,7 +485,7 @@ public:
* \param value The new base value of the player's skill. * \param value The new base value of the player's skill.
* \return void * \return void
*/ */
static void SetSkillBase(unsigned short pid, unsigned short skillId, int value) noexcept; EXPORT_APIFUNCTION void CDECL SetSkillBase(unsigned short pid, unsigned short skillId, int value) noexcept;
/** /**
* \brief Clear the modifier value of a player's skill. * \brief Clear the modifier value of a player's skill.
@ -534,18 +499,7 @@ public:
* \param skillId The skill ID. * \param skillId The skill ID.
* \return void * \return void
*/ */
static void ClearSkillModifier(unsigned short pid, unsigned short skillId) noexcept; EXPORT_APIFUNCTION void CDECL ClearSkillModifier(unsigned short pid, unsigned short skillId) noexcept;
/**
* \brief Set the amount of damage (as caused through the Damage Skill effect) to
* a player's skill.
*
* \param pid The player ID.
* \param skillId The skill ID.
* \param value The amount of damage to the player's skill.
* \return void
*/
static void SetSkillDamage(unsigned short pid, unsigned short skillId, double value) noexcept;
/** /**
* \brief Set the progress the player has made towards increasing a certain skill by 1. * \brief Set the progress the player has made towards increasing a certain skill by 1.
@ -555,7 +509,7 @@ public:
* \param value The progress value. * \param value The progress value.
* \return void * \return void
*/ */
static void SetSkillProgress(unsigned short pid, unsigned short skillId, double value) noexcept; EXPORT_APIFUNCTION void CDECL SetSkillProgress(unsigned short pid, unsigned short skillId, double value) noexcept;
/** /**
* \brief Set the bonus applied to a certain attribute at the next level up as a result * \brief Set the bonus applied to a certain attribute at the next level up as a result
@ -568,7 +522,7 @@ public:
* \param value The increase in the attribute caused by skills. * \param value The increase in the attribute caused by skills.
* \return void * \return void
*/ */
static void SetSkillIncrease(unsigned short pid, unsigned int attributeId, int value) noexcept; EXPORT_APIFUNCTION void CDECL SetSkillIncrease(unsigned short pid, unsigned int attributeId, int value) noexcept;
/** /**
* \brief Set the bounty of a player. * \brief Set the bounty of a player.
@ -577,7 +531,7 @@ public:
* \param value The new bounty. * \param value The new bounty.
* \return void * \return void
*/ */
static void SetBounty(unsigned short pid, int value) noexcept; EXPORT_APIFUNCTION void CDECL SetBounty(unsigned short pid, int value) noexcept;
/** /**
* \brief Set the current and ending stages of character generation for a player. * \brief Set the current and ending stages of character generation for a player.
@ -589,7 +543,7 @@ public:
* \param endStage The new ending stage. * \param endStage The new ending stage.
* \return void * \return void
*/ */
static void SetCharGenStage(unsigned short pid, int currentStage, int endStage) noexcept; EXPORT_APIFUNCTION void CDECL SetCharGenStage(unsigned short pid, int currentStage, int endStage) noexcept;
/** /**
* \brief Send a PlayerBaseInfo packet with a player's name, race, head mesh, * \brief Send a PlayerBaseInfo packet with a player's name, race, head mesh,
@ -600,7 +554,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return void * \return void
*/ */
static void SendBaseInfo(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL SendBaseInfo(unsigned short pid) noexcept;
/** /**
* \brief Send a PlayerStatsDynamic packet with a player's dynamic stats (health, * \brief Send a PlayerStatsDynamic packet with a player's dynamic stats (health,
@ -611,7 +565,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return void * \return void
*/ */
static void SendStatsDynamic(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL SendStatsDynamic(unsigned short pid) noexcept;
/** /**
* \brief Send a PlayerAttribute packet with a player's attributes and bonuses * \brief Send a PlayerAttribute packet with a player's attributes and bonuses
@ -623,7 +577,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return void * \return void
*/ */
static void SendAttributes(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL SendAttributes(unsigned short pid) noexcept;
/** /**
* \brief Send a PlayerSkill packet with a player's skills. * \brief Send a PlayerSkill packet with a player's skills.
@ -633,7 +587,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return void * \return void
*/ */
static void SendSkills(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL SendSkills(unsigned short pid) noexcept;
/** /**
* \brief Send a PlayerLevel packet with a player's character level and * \brief Send a PlayerLevel packet with a player's character level and
@ -644,7 +598,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return void * \return void
*/ */
static void SendLevel(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL SendLevel(unsigned short pid) noexcept;
/** /**
* \brief Send a PlayerBounty packet with a player's bounty. * \brief Send a PlayerBounty packet with a player's bounty.
@ -654,7 +608,7 @@ public:
* \param pid The player ID. * \param pid The player ID.
* \return void * \return void
*/ */
static void SendBounty(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL SendBounty(unsigned short pid) noexcept;
}; }
#endif //OPENMW_STATAPI_HPP #endif //OPENMW_STATAPI_HPP

View file

@ -11,17 +11,17 @@
using namespace std; using namespace std;
using namespace mwmp; using namespace mwmp;
int ScriptFunctions::CreateTimer(ScriptFunc callback, int msec) noexcept extern "C" int TimerFunctions::CreateTimer(ScriptFunc callback, int msec) noexcept
{ {
return mwmp::TimerAPI::CreateTimer(callback, msec, "", vector<boost::any>()); return mwmp::TimerAPI::CreateTimer(callback, msec, "", vector<boost::any>());
} }
int ScriptFunctions::CreateTimerEx(ScriptFunc callback, int msec, const char *types, va_list args) noexcept extern "C" int TimerFunctions::CreateTimerEx(ScriptFunc callback, int msec, const char *types, va_list args) noexcept
{ {
try try
{ {
vector<boost::any> params; vector<boost::any> params;
Utils::getArguments(params, args, types); ScriptFunctions::GetArguments(params, args, types);
return mwmp::TimerAPI::CreateTimer(callback, msec, types, params); return mwmp::TimerAPI::CreateTimer(callback, msec, types, params);
} }
@ -32,27 +32,27 @@ int ScriptFunctions::CreateTimerEx(ScriptFunc callback, int msec, const char *ty
} }
void ScriptFunctions::StartTimer(int timerId) noexcept extern "C" void TimerFunctions::StartTimer(int timerId) noexcept
{ {
TimerAPI::StartTimer(timerId); TimerAPI::StartTimer(timerId);
} }
void ScriptFunctions::StopTimer(int timerId) noexcept extern "C" void TimerFunctions::StopTimer(int timerId) noexcept
{ {
TimerAPI::StopTimer(timerId); TimerAPI::StopTimer(timerId);
} }
void ScriptFunctions::RestartTimer(int timerId, int msec) noexcept extern "C" void TimerFunctions::RestartTimer(int timerId, int msec) noexcept
{ {
TimerAPI::ResetTimer(timerId, msec); TimerAPI::ResetTimer(timerId, msec);
} }
void ScriptFunctions::FreeTimer(int timerId) noexcept extern "C" void TimerFunctions::FreeTimer(int timerId) noexcept
{ {
TimerAPI::FreeTimer(timerId); TimerAPI::FreeTimer(timerId);
} }
bool ScriptFunctions::IsTimerElapsed(int timerId) noexcept extern "C" bool TimerFunctions::IsTimerElapsed(int timerId) noexcept
{ {
return TimerAPI::IsTimerElapsed(timerId); return TimerAPI::IsEndTimer(timerId);
} }

View file

@ -0,0 +1,80 @@
//
// Created by koncord on 09.12.18.
//
#ifndef OPENMW_TIMER_HPP
#define OPENMW_TIMER_HPP
#include <Script/ScriptFunction.hpp>
#include <Script/Platform.hpp>
namespace TimerFunctions
{
/**
* \brief Create a timer that will run a script function after a certain interval.
*
* \param callback The Lua script function.
* \param msec The interval in miliseconds.
* \return The ID of the timer thus created.
*/
EXPORT_APIFUNCTION int CDECL CreateTimer(ScriptFunc callback, int msec) noexcept;
/**
* \brief Create a timer that will run a script function after a certain interval and pass
* certain arguments to it.
*
* Example usage:
* - tes3mp.CreateTimerEx("OnTimerTest1", 250, "i", 90)
* - tes3mp.CreateTimerEx("OnTimerTest2", 500, "sif", "Test string", 60, 77.321)
*
* \param callback The Lua script function.
* \param msec The interval in miliseconds.
* \param types The argument types.
* \param args The arguments.
* \return The ID of the timer thus created.
*/
EXPORT_APIFUNCTION int CDECL CreateTimerEx(ScriptFunc callback, int msec, const char *types, va_list args) noexcept;
/**
* \brief Start the timer with a certain ID.
*
* \param timerId The timer ID.
* \return void
*/
EXPORT_APIFUNCTION void CDECL StartTimer(int timerId) noexcept;
/**
* \brief Stop the timer with a certain ID.
*
* \param timerId The timer ID.
* \return void
*/
EXPORT_APIFUNCTION void CDECL StopTimer(int timerId) noexcept;
/**
* \brief Restart the timer with a certain ID for a certain interval.
*
* \param timerId The timer ID.
* \param msec The interval in miliseconds.
* \return void
*/
EXPORT_APIFUNCTION void CDECL RestartTimer(int timerId, int msec) noexcept;
/**
* \brief Free the timer with a certain ID.
*
* \param timerId The timer ID.
* \return void
*/
EXPORT_APIFUNCTION void CDECL FreeTimer(int timerId) noexcept;
/**
* \brief Check whether a timer is elapsed.
*
* \param timerId The timer ID.
* \return Whether the timer is elapsed.
*/
EXPORT_APIFUNCTION bool CDECL IsTimerElapsed(int timerId) noexcept;
}
#endif //OPENMW_TIMER_HPP

View file

@ -13,157 +13,157 @@ using namespace mwmp;
BaseWorldstate *WorldstateFunctions::readWorldstate; BaseWorldstate *WorldstateFunctions::readWorldstate;
BaseWorldstate WorldstateFunctions::writeWorldstate; BaseWorldstate WorldstateFunctions::writeWorldstate;
void WorldstateFunctions::ReadReceivedWorldstate() noexcept extern "C" void WorldstateFunctions::ReadReceivedWorldstate() noexcept
{ {
readWorldstate = mwmp::Networking::getPtr()->getReceivedWorldstate(); readWorldstate = mwmp::Networking::getPtr()->getReceivedWorldstate();
} }
void WorldstateFunctions::CopyReceivedWorldstateToStore() noexcept extern "C" void WorldstateFunctions::CopyReceivedWorldstateToStore() noexcept
{ {
writeWorldstate = *readWorldstate; writeWorldstate = *readWorldstate;
} }
void WorldstateFunctions::ClearMapChanges() noexcept extern "C" void WorldstateFunctions::ClearMapChanges() noexcept
{ {
writeWorldstate.mapTiles.clear(); writeWorldstate.mapTiles.clear();
} }
unsigned int WorldstateFunctions::GetMapChangesSize() noexcept extern "C" unsigned int WorldstateFunctions::GetMapChangesSize() noexcept
{ {
return readWorldstate->mapTiles.size(); return readWorldstate->mapTiles.size();
} }
const char *WorldstateFunctions::GetWeatherRegion() noexcept extern "C" const char *WorldstateFunctions::GetWeatherRegion() noexcept
{ {
return readWorldstate->weather.region.c_str(); return readWorldstate->weather.region.c_str();
} }
int WorldstateFunctions::GetWeatherCurrent() noexcept extern "C" int WorldstateFunctions::GetWeatherCurrent() noexcept
{ {
return readWorldstate->weather.currentWeather; return readWorldstate->weather.currentWeather;
} }
int WorldstateFunctions::GetWeatherNext() noexcept extern "C" int WorldstateFunctions::GetWeatherNext() noexcept
{ {
return readWorldstate->weather.nextWeather; return readWorldstate->weather.nextWeather;
} }
int WorldstateFunctions::GetWeatherQueued() noexcept extern "C" int WorldstateFunctions::GetWeatherQueued() noexcept
{ {
return readWorldstate->weather.queuedWeather; return readWorldstate->weather.queuedWeather;
} }
double WorldstateFunctions::GetWeatherTransitionFactor() noexcept extern "C" double WorldstateFunctions::GetWeatherTransitionFactor() noexcept
{ {
return readWorldstate->weather.transitionFactor; return readWorldstate->weather.transitionFactor;
} }
int WorldstateFunctions::GetMapTileCellX(unsigned int index) noexcept extern "C" int WorldstateFunctions::GetMapTileCellX(unsigned int index) noexcept
{ {
return readWorldstate->mapTiles.at(index).x; return readWorldstate->mapTiles.at(index).x;
} }
int WorldstateFunctions::GetMapTileCellY(unsigned int index) noexcept extern "C" int WorldstateFunctions::GetMapTileCellY(unsigned int index) noexcept
{ {
return readWorldstate->mapTiles.at(index).y; return readWorldstate->mapTiles.at(index).y;
} }
void WorldstateFunctions::SetAuthorityRegion(const char* authorityRegion) noexcept extern "C" void WorldstateFunctions::SetAuthorityRegion(const char* authorityRegion) noexcept
{ {
writeWorldstate.authorityRegion = authorityRegion; writeWorldstate.authorityRegion = authorityRegion;
} }
void WorldstateFunctions::SetWeatherRegion(const char* region) noexcept extern "C" void WorldstateFunctions::SetWeatherRegion(const char* region) noexcept
{ {
writeWorldstate.weather.region = region; writeWorldstate.weather.region = region;
} }
void WorldstateFunctions::SetWeatherForceState(bool forceState) noexcept extern "C" void WorldstateFunctions::SetWeatherForceState(bool forceState) noexcept
{ {
writeWorldstate.forceWeather = forceState; writeWorldstate.forceWeather = forceState;
} }
void WorldstateFunctions::SetWeatherCurrent(int currentWeather) noexcept extern "C" void WorldstateFunctions::SetWeatherCurrent(int currentWeather) noexcept
{ {
writeWorldstate.weather.currentWeather = currentWeather; writeWorldstate.weather.currentWeather = currentWeather;
} }
void WorldstateFunctions::SetWeatherNext(int nextWeather) noexcept extern "C" void WorldstateFunctions::SetWeatherNext(int nextWeather) noexcept
{ {
writeWorldstate.weather.nextWeather = nextWeather; writeWorldstate.weather.nextWeather = nextWeather;
} }
void WorldstateFunctions::SetWeatherQueued(int queuedWeather) noexcept extern "C" void WorldstateFunctions::SetWeatherQueued(int queuedWeather) noexcept
{ {
writeWorldstate.weather.queuedWeather = queuedWeather; writeWorldstate.weather.queuedWeather = queuedWeather;
} }
void WorldstateFunctions::SetWeatherTransitionFactor(double transitionFactor) noexcept extern "C" void WorldstateFunctions::SetWeatherTransitionFactor(double transitionFactor) noexcept
{ {
writeWorldstate.weather.transitionFactor = transitionFactor; writeWorldstate.weather.transitionFactor = transitionFactor;
} }
void WorldstateFunctions::SetHour(double hour) noexcept extern "C" void WorldstateFunctions::SetHour(double hour) noexcept
{ {
writeWorldstate.time.hour = hour; writeWorldstate.time.hour = hour;
} }
void WorldstateFunctions::SetDay(int day) noexcept extern "C" void WorldstateFunctions::SetDay(int day) noexcept
{ {
writeWorldstate.time.day = day; writeWorldstate.time.day = day;
} }
void WorldstateFunctions::SetMonth(int month) noexcept extern "C" void WorldstateFunctions::SetMonth(int month) noexcept
{ {
writeWorldstate.time.month = month; writeWorldstate.time.month = month;
} }
void WorldstateFunctions::SetYear(int year) noexcept extern "C" void WorldstateFunctions::SetYear(int year) noexcept
{ {
writeWorldstate.time.year = year; writeWorldstate.time.year = year;
} }
void WorldstateFunctions::SetDaysPassed(int daysPassed) noexcept extern "C" void WorldstateFunctions::SetDaysPassed(int daysPassed) noexcept
{ {
writeWorldstate.time.daysPassed = daysPassed; writeWorldstate.time.daysPassed = daysPassed;
} }
void WorldstateFunctions::SetTimeScale(double timeScale) noexcept extern "C" void WorldstateFunctions::SetTimeScale(double timeScale) noexcept
{ {
writeWorldstate.time.timeScale = timeScale; writeWorldstate.time.timeScale = timeScale;
} }
void WorldstateFunctions::SetPlayerCollisionState(bool state) noexcept extern "C" void WorldstateFunctions::SetPlayerCollisionState(bool state) noexcept
{ {
writeWorldstate.hasPlayerCollision = state; writeWorldstate.hasPlayerCollision = state;
} }
void WorldstateFunctions::SetActorCollisionState(bool state) noexcept extern "C" void WorldstateFunctions::SetActorCollisionState(bool state) noexcept
{ {
writeWorldstate.hasActorCollision = state; writeWorldstate.hasActorCollision = state;
} }
void WorldstateFunctions::SetPlacedObjectCollisionState(bool state) noexcept extern "C" void WorldstateFunctions::SetPlacedObjectCollisionState(bool state) noexcept
{ {
writeWorldstate.hasPlacedObjectCollision = state; writeWorldstate.hasPlacedObjectCollision = state;
} }
void WorldstateFunctions::UseActorCollisionForPlacedObjects(bool useActorCollision) noexcept extern "C" void WorldstateFunctions::UseActorCollisionForPlacedObjects(bool useActorCollision) noexcept
{ {
writeWorldstate.useActorCollisionForPlacedObjects = useActorCollision; writeWorldstate.useActorCollisionForPlacedObjects = useActorCollision;
} }
void WorldstateFunctions::AddEnforcedCollisionRefId(const char *refId) noexcept extern "C" void WorldstateFunctions::AddEnforcedCollisionRefId(const char *refId) noexcept
{ {
writeWorldstate.enforcedCollisionRefIds.push_back(refId); writeWorldstate.enforcedCollisionRefIds.push_back(refId);
} }
void WorldstateFunctions::ClearEnforcedCollisionRefIds() noexcept extern "C" void WorldstateFunctions::ClearEnforcedCollisionRefIds() noexcept
{ {
writeWorldstate.enforcedCollisionRefIds.clear(); writeWorldstate.enforcedCollisionRefIds.clear();
} }
void WorldstateFunctions::SaveMapTileImageFile(unsigned int index, const char *filePath) noexcept extern "C" void WorldstateFunctions::SaveMapTileImageFile(unsigned int index, const char *filePath) noexcept
{ {
if (index >= readWorldstate->mapTiles.size()) if (index >= readWorldstate->mapTiles.size())
return; return;
@ -175,7 +175,7 @@ void WorldstateFunctions::SaveMapTileImageFile(unsigned int index, const char *f
std::copy(imageData.begin(), imageData.end(), outputIterator); std::copy(imageData.begin(), imageData.end(), outputIterator);
} }
void WorldstateFunctions::LoadMapTileImageFile(int cellX, int cellY, const char* filePath) noexcept extern "C" void WorldstateFunctions::LoadMapTileImageFile(int cellX, int cellY, const char* filePath) noexcept
{ {
mwmp::MapTile mapTile; mwmp::MapTile mapTile;
mapTile.x = cellX; mapTile.x = cellX;
@ -196,7 +196,7 @@ void WorldstateFunctions::LoadMapTileImageFile(int cellX, int cellY, const char*
} }
} }
void WorldstateFunctions::SendWorldMap(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept extern "C" void WorldstateFunctions::SendWorldMap(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -212,7 +212,7 @@ void WorldstateFunctions::SendWorldMap(unsigned short pid, bool sendToOtherPlaye
packet->Send(true); packet->Send(true);
} }
void WorldstateFunctions::SendWorldTime(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept extern "C" void WorldstateFunctions::SendWorldTime(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -228,7 +228,7 @@ void WorldstateFunctions::SendWorldTime(unsigned short pid, bool sendToOtherPlay
packet->Send(true); packet->Send(true);
} }
void WorldstateFunctions::SendWorldWeather(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept extern "C" void WorldstateFunctions::SendWorldWeather(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -244,7 +244,7 @@ void WorldstateFunctions::SendWorldWeather(unsigned short pid, bool sendToOtherP
packet->Send(true); packet->Send(true);
} }
void WorldstateFunctions::SendWorldCollisionOverride(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept extern "C" void WorldstateFunctions::SendWorldCollisionOverride(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -260,7 +260,7 @@ void WorldstateFunctions::SendWorldCollisionOverride(unsigned short pid, bool se
packet->Send(true); packet->Send(true);
} }
void WorldstateFunctions::SendWorldRegionAuthority(unsigned short pid) noexcept extern "C" void WorldstateFunctions::SendWorldRegionAuthority(unsigned short pid) noexcept
{ {
Player *player; Player *player;
GET_PLAYER(pid, player, ); GET_PLAYER(pid, player, );
@ -276,7 +276,7 @@ void WorldstateFunctions::SendWorldRegionAuthority(unsigned short pid) noexcept
packet->Send(true); packet->Send(true);
} }
extern "C"
// All methods below are deprecated versions of methods from above // All methods below are deprecated versions of methods from above
void WorldstateFunctions::ReadLastWorldstate() noexcept void WorldstateFunctions::ReadLastWorldstate() noexcept
@ -284,7 +284,7 @@ void WorldstateFunctions::ReadLastWorldstate() noexcept
ReadReceivedWorldstate(); ReadReceivedWorldstate();
} }
void WorldstateFunctions::CopyLastWorldstateToStore() noexcept extern "C" void WorldstateFunctions::CopyLastWorldstateToStore() noexcept
{ {
CopyReceivedWorldstateToStore(); CopyReceivedWorldstateToStore();
} }

View file

@ -4,6 +4,8 @@
#include <components/openmw-mp/Base/BaseWorldstate.hpp> #include <components/openmw-mp/Base/BaseWorldstate.hpp>
#include "../Types.hpp" #include "../Types.hpp"
#include <Script/Platform.hpp>
#define WORLDSTATEAPI \ #define WORLDSTATEAPI \
{"ReadReceivedWorldstate", WorldstateFunctions::ReadReceivedWorldstate},\ {"ReadReceivedWorldstate", WorldstateFunctions::ReadReceivedWorldstate},\
\ \
@ -58,19 +60,17 @@
{"ReadLastWorldstate", WorldstateFunctions::ReadLastWorldstate},\ {"ReadLastWorldstate", WorldstateFunctions::ReadLastWorldstate},\
{"CopyLastWorldstateToStore", WorldstateFunctions::CopyLastWorldstateToStore} {"CopyLastWorldstateToStore", WorldstateFunctions::CopyLastWorldstateToStore}
class WorldstateFunctions namespace WorldstateFunctions
{ {
public: EXPORT_APIFUNCTION mwmp::BaseWorldstate CDECL *readWorldstate;
EXPORT_APIFUNCTION mwmp::BaseWorldstate CDECL writeWorldstate;
static mwmp::BaseWorldstate *readWorldstate;
static mwmp::BaseWorldstate writeWorldstate;
/** /**
* \brief Use the last worldstate received by the server as the one being read. * \brief Use the last worldstate received by the server as the one being read.
* *
* \return void * \return void
*/ */
static void ReadReceivedWorldstate() noexcept; EXPORT_APIFUNCTION void CDECL ReadReceivedWorldstate() noexcept;
/** /**
* \brief Take the contents of the read-only worldstate last received by the * \brief Take the contents of the read-only worldstate last received by the
@ -79,7 +79,7 @@ public:
* *
* \return void * \return void
*/ */
static void CopyReceivedWorldstateToStore() noexcept; EXPORT_APIFUNCTION void CDECL CopyReceivedWorldstateToStore() noexcept;
/** /**
* \brief Clear the map changes for the write-only worldstate. * \brief Clear the map changes for the write-only worldstate.
@ -88,49 +88,49 @@ public:
* *
* \return void * \return void
*/ */
static void ClearMapChanges() noexcept; EXPORT_APIFUNCTION void CDECL ClearMapChanges() noexcept;
/** /**
* \brief Get the number of indexes in the read worldstate's map changes. * \brief Get the number of indexes in the read worldstate's map changes.
* *
* \return The number of indexes. * \return The number of indexes.
*/ */
static unsigned int GetMapChangesSize() noexcept; EXPORT_APIFUNCTION unsigned int CDECL GetMapChangesSize() noexcept;
/** /**
* \brief Get the weather region in the read worldstate. * \brief Get the weather region in the read worldstate.
* *
* \return The weather region. * \return The weather region.
*/ */
static const char *GetWeatherRegion() noexcept; EXPORT_APIFUNCTION const char *CDECL GetWeatherRegion() noexcept;
/** /**
* \brief Get the current weather in the read worldstate. * \brief Get the current weather in the read worldstate.
* *
* \return The current weather. * \return The current weather.
*/ */
static int GetWeatherCurrent() noexcept; EXPORT_APIFUNCTION int CDECL GetWeatherCurrent() noexcept;
/** /**
* \brief Get the next weather in the read worldstate. * \brief Get the next weather in the read worldstate.
* *
* \return The next weather. * \return The next weather.
*/ */
static int GetWeatherNext() noexcept; EXPORT_APIFUNCTION int CDECL GetWeatherNext() noexcept;
/** /**
* \brief Get the queued weather in the read worldstate. * \brief Get the queued weather in the read worldstate.
* *
* \return The queued weather. * \return The queued weather.
*/ */
static int GetWeatherQueued() noexcept; EXPORT_APIFUNCTION int CDECL GetWeatherQueued() noexcept;
/** /**
* \brief Get the transition factor of the weather in the read worldstate. * \brief Get the transition factor of the weather in the read worldstate.
* *
* \return The transition factor of the weather. * \return The transition factor of the weather.
*/ */
static double GetWeatherTransitionFactor() noexcept; EXPORT_APIFUNCTION double CDECL GetWeatherTransitionFactor() noexcept;
/** /**
* \brief Get the X coordinate of the cell corresponding to the map tile at a certain index in * \brief Get the X coordinate of the cell corresponding to the map tile at a certain index in
@ -139,7 +139,7 @@ public:
* \param index The index of the map tile. * \param index The index of the map tile.
* \return The X coordinate of the cell. * \return The X coordinate of the cell.
*/ */
static int GetMapTileCellX(unsigned int index) noexcept; EXPORT_APIFUNCTION int CDECL GetMapTileCellX(unsigned int index) noexcept;
/** /**
* \brief Get the Y coordinate of the cell corresponding to the map tile at a certain index in * \brief Get the Y coordinate of the cell corresponding to the map tile at a certain index in
@ -148,7 +148,7 @@ public:
* \param index The index of the map tile. * \param index The index of the map tile.
* \return The Y coordinate of the cell. * \return The Y coordinate of the cell.
*/ */
static int GetMapTileCellY(unsigned int index) noexcept; EXPORT_APIFUNCTION int CDECL GetMapTileCellY(unsigned int index) noexcept;
/** /**
* \brief Set the region affected by the next WorldRegionAuthority packet sent. * \brief Set the region affected by the next WorldRegionAuthority packet sent.
@ -156,7 +156,7 @@ public:
* \param region The region. * \param region The region.
* \return void * \return void
*/ */
static void SetAuthorityRegion(const char* authorityRegion) noexcept; EXPORT_APIFUNCTION void CDECL SetAuthorityRegion(const char* authorityRegion) noexcept;
/** /**
* \brief Set the weather region in the write-only worldstate stored on the server. * \brief Set the weather region in the write-only worldstate stored on the server.
@ -164,7 +164,7 @@ public:
* \param region The region. * \param region The region.
* \return void * \return void
*/ */
static void SetWeatherRegion(const char* region) noexcept; EXPORT_APIFUNCTION void CDECL SetWeatherRegion(const char* region) noexcept;
/** /**
* \brief Set the weather forcing state in the write-only worldstate stored on the server. * \brief Set the weather forcing state in the write-only worldstate stored on the server.
@ -174,7 +174,7 @@ public:
* \param forceState The weather forcing state. * \param forceState The weather forcing state.
* \return void * \return void
*/ */
static void SetWeatherForceState(bool forceState) noexcept; EXPORT_APIFUNCTION void CDECL SetWeatherForceState(bool forceState) noexcept;
/** /**
* \brief Set the current weather in the write-only worldstate stored on the server. * \brief Set the current weather in the write-only worldstate stored on the server.
@ -182,7 +182,7 @@ public:
* \param currentWeather The current weather. * \param currentWeather The current weather.
* \return void * \return void
*/ */
static void SetWeatherCurrent(int currentWeather) noexcept; EXPORT_APIFUNCTION void CDECL SetWeatherCurrent(int currentWeather) noexcept;
/** /**
* \brief Set the next weather in the write-only worldstate stored on the server. * \brief Set the next weather in the write-only worldstate stored on the server.
@ -190,7 +190,7 @@ public:
* \param nextWeather The next weather. * \param nextWeather The next weather.
* \return void * \return void
*/ */
static void SetWeatherNext(int nextWeather) noexcept; EXPORT_APIFUNCTION void CDECL SetWeatherNext(int nextWeather) noexcept;
/** /**
* \brief Set the queued weather in the write-only worldstate stored on the server. * \brief Set the queued weather in the write-only worldstate stored on the server.
@ -198,7 +198,7 @@ public:
* \param queuedWeather The queued weather. * \param queuedWeather The queued weather.
* \return void * \return void
*/ */
static void SetWeatherQueued(int queuedWeather) noexcept; EXPORT_APIFUNCTION void CDECL SetWeatherQueued(int queuedWeather) noexcept;
/** /**
* \brief Set the transition factor for the weather in the write-only worldstate stored on the server. * \brief Set the transition factor for the weather in the write-only worldstate stored on the server.
@ -206,7 +206,7 @@ public:
* \param transitionFactor The transition factor. * \param transitionFactor The transition factor.
* \return void * \return void
*/ */
static void SetWeatherTransitionFactor(double transitionFactor) noexcept; EXPORT_APIFUNCTION void CDECL SetWeatherTransitionFactor(double transitionFactor) noexcept;
/** /**
* \brief Set the world's hour in the write-only worldstate stored on the server. * \brief Set the world's hour in the write-only worldstate stored on the server.
@ -214,7 +214,7 @@ public:
* \param hour The hour. * \param hour The hour.
* \return void * \return void
*/ */
static void SetHour(double hour) noexcept; EXPORT_APIFUNCTION void CDECL SetHour(double hour) noexcept;
/** /**
* \brief Set the world's day in the write-only worldstate stored on the server. * \brief Set the world's day in the write-only worldstate stored on the server.
@ -222,7 +222,7 @@ public:
* \param day The day. * \param day The day.
* \return void * \return void
*/ */
static void SetDay(int day) noexcept; EXPORT_APIFUNCTION void CDECL SetDay(int day) noexcept;
/** /**
* \brief Set the world's month in the write-only worldstate stored on the server. * \brief Set the world's month in the write-only worldstate stored on the server.
@ -230,7 +230,7 @@ public:
* \param month The month. * \param month The month.
* \return void * \return void
*/ */
static void SetMonth(int month) noexcept; EXPORT_APIFUNCTION void CDECL SetMonth(int month) noexcept;
/** /**
* \brief Set the world's year in the write-only worldstate stored on the server. * \brief Set the world's year in the write-only worldstate stored on the server.
@ -238,7 +238,7 @@ public:
* \param year The year. * \param year The year.
* \return void * \return void
*/ */
static void SetYear(int year) noexcept; EXPORT_APIFUNCTION void CDECL SetYear(int year) noexcept;
/** /**
* \brief Set the world's days passed in the write-only worldstate stored on the server. * \brief Set the world's days passed in the write-only worldstate stored on the server.
@ -246,7 +246,7 @@ public:
* \param daysPassed The days passed. * \param daysPassed The days passed.
* \return void * \return void
*/ */
static void SetDaysPassed(int daysPassed) noexcept; EXPORT_APIFUNCTION void CDECL SetDaysPassed(int daysPassed) noexcept;
/** /**
* \brief Set the world's time scale in the write-only worldstate stored on the server. * \brief Set the world's time scale in the write-only worldstate stored on the server.
@ -255,7 +255,7 @@ public:
* \param timeScale The time scale. * \param timeScale The time scale.
* \return void * \return void
*/ */
static void SetTimeScale(double timeScale) noexcept; EXPORT_APIFUNCTION void CDECL SetTimeScale(double timeScale) noexcept;
/** /**
* \brief Set the collision state for other players in the write-only worldstate stored * \brief Set the collision state for other players in the write-only worldstate stored
@ -264,7 +264,7 @@ public:
* \param state The collision state. * \param state The collision state.
* \return void * \return void
*/ */
static void SetPlayerCollisionState(bool state) noexcept; EXPORT_APIFUNCTION void CDECL SetPlayerCollisionState(bool state) noexcept;
/** /**
* \brief Set the collision state for actors in the write-only worldstate stored on the * \brief Set the collision state for actors in the write-only worldstate stored on the
@ -273,7 +273,7 @@ public:
* \param state The collision state. * \param state The collision state.
* \return void * \return void
*/ */
static void SetActorCollisionState(bool state) noexcept; EXPORT_APIFUNCTION void CDECL SetActorCollisionState(bool state) noexcept;
/** /**
* \brief Set the collision state for placed objects in the write-only worldstate stored * \brief Set the collision state for placed objects in the write-only worldstate stored
@ -282,7 +282,7 @@ public:
* \param state The collision state. * \param state The collision state.
* \return void * \return void
*/ */
static void SetPlacedObjectCollisionState(bool state) noexcept; EXPORT_APIFUNCTION void CDECL SetPlacedObjectCollisionState(bool state) noexcept;
/** /**
* \brief Whether placed objects with collision turned on should use actor collision, i.e. * \brief Whether placed objects with collision turned on should use actor collision, i.e.
@ -291,7 +291,7 @@ public:
* \param useActorCollision Whether to use actor collision. * \param useActorCollision Whether to use actor collision.
* \return void * \return void
*/ */
static void UseActorCollisionForPlacedObjects(bool useActorCollision) noexcept; EXPORT_APIFUNCTION void CDECL UseActorCollisionForPlacedObjects(bool useActorCollision) noexcept;
/** /**
* \brief Add a refId to the list of refIds for which collision should be enforced * \brief Add a refId to the list of refIds for which collision should be enforced
@ -300,7 +300,7 @@ public:
* \param refId The refId. * \param refId The refId.
* \return void * \return void
*/ */
static void AddEnforcedCollisionRefId(const char* refId) noexcept; EXPORT_APIFUNCTION void CDECL AddEnforcedCollisionRefId(const char* refId) noexcept;
/** /**
* \brief Clear the list of refIdsd for which collision should be enforced irrespective * \brief Clear the list of refIdsd for which collision should be enforced irrespective
@ -308,7 +308,7 @@ public:
* *
* \return void * \return void
*/ */
static void ClearEnforcedCollisionRefIds() noexcept; EXPORT_APIFUNCTION void CDECL ClearEnforcedCollisionRefIds() noexcept;
/** /**
* \brief Save the .png image data of the map tile at a certain index in the read worldstate's * \brief Save the .png image data of the map tile at a certain index in the read worldstate's
@ -318,7 +318,7 @@ public:
* \param filePath The file path of the resulting file. * \param filePath The file path of the resulting file.
* \return void * \return void
*/ */
static void SaveMapTileImageFile(unsigned int index, const char *filePath) noexcept; EXPORT_APIFUNCTION void CDECL SaveMapTileImageFile(unsigned int index, const char *filePath) noexcept;
/** /**
* \brief Load a .png file as the image data for a map tile and add it to the write-only worldstate * \brief Load a .png file as the image data for a map tile and add it to the write-only worldstate
@ -329,7 +329,7 @@ public:
* \param filePath The file path of the loaded file. * \param filePath The file path of the loaded file.
* \return void * \return void
*/ */
static void LoadMapTileImageFile(int cellX, int cellY, const char* filePath) noexcept; EXPORT_APIFUNCTION void CDECL LoadMapTileImageFile(int cellX, int cellY, const char* filePath) noexcept;
/** /**
* \brief Send a WorldRegionAuthority packet establishing a certain player as the only one who * \brief Send a WorldRegionAuthority packet establishing a certain player as the only one who
@ -340,7 +340,7 @@ public:
* \param pid The player ID attached to the packet. * \param pid The player ID attached to the packet.
* \return void * \return void
*/ */
static void SendWorldRegionAuthority(unsigned short pid) noexcept; EXPORT_APIFUNCTION void CDECL SendWorldRegionAuthority(unsigned short pid) noexcept;
/** /**
* \brief Send a WorldMap packet with the current set of map changes in the write-only * \brief Send a WorldMap packet with the current set of map changes in the write-only
@ -351,7 +351,7 @@ public:
* or to all players on the server. * or to all players on the server.
* \return void * \return void
*/ */
static void SendWorldMap(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept; EXPORT_APIFUNCTION void CDECL SendWorldMap(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept;
/** /**
* \brief Send a WorldTime packet with the current time and time scale in the write-only * \brief Send a WorldTime packet with the current time and time scale in the write-only
@ -364,7 +364,7 @@ public:
* to the packet (false by default). * to the packet (false by default).
* \return void * \return void
*/ */
static void SendWorldTime(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept; EXPORT_APIFUNCTION void CDECL SendWorldTime(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept;
/** /**
* \brief Send a WorldWeather packet with the current weather in the write-only worldstate. * \brief Send a WorldWeather packet with the current weather in the write-only worldstate.
@ -376,7 +376,7 @@ public:
* to the packet (false by default). * to the packet (false by default).
* \return void * \return void
*/ */
static void SendWorldWeather(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept; EXPORT_APIFUNCTION void CDECL SendWorldWeather(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept;
/** /**
* \brief Send a WorldCollisionOverride packet with the current collision overrides in * \brief Send a WorldCollisionOverride packet with the current collision overrides in
@ -389,14 +389,13 @@ public:
* to the packet (false by default). * to the packet (false by default).
* \return void * \return void
*/ */
static void SendWorldCollisionOverride(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept; EXPORT_APIFUNCTION void CDECL SendWorldCollisionOverride(unsigned short pid, bool sendToOtherPlayers, bool skipAttachedPlayer) noexcept;
// All methods below are deprecated versions of methods from above // All methods below are deprecated versions of methods from above
static void ReadLastWorldstate() noexcept; EXPORT_APIFUNCTION void CDECL ReadLastWorldstate() noexcept;
static void CopyLastWorldstateToStore() noexcept; EXPORT_APIFUNCTION void CDECL CopyLastWorldstateToStore() noexcept;
}
};
#endif //OPENMW_WORLDSTATEAPI_HPP #endif //OPENMW_WORLDSTATEAPI_HPP

View file

@ -107,32 +107,6 @@ template<> struct F_<1> { static constexpr LuaFuctionData F{"CreateTimerEx", Lan
template<> struct F_<2> { static constexpr LuaFuctionData F{"MakePublic", LangLua::MakePublic}; }; template<> struct F_<2> { static constexpr LuaFuctionData F{"MakePublic", LangLua::MakePublic}; };
template<> struct F_<3> { static constexpr LuaFuctionData F{"CallPublic", LangLua::CallPublic}; }; template<> struct F_<3> { static constexpr LuaFuctionData F{"CallPublic", LangLua::CallPublic}; };
#ifdef __arm__
template<std::size_t... Is>
struct indices {};
template<std::size_t N, std::size_t... Is>
struct build_indices : build_indices<N-1, N-1, Is...> {};
template<std::size_t... Is>
struct build_indices<0, Is...> : indices<Is...> {};
template<std::size_t N>
using IndicesFor = build_indices<N>;
template<size_t... Indices>
LuaFuctionData *functions(indices<Indices...>)
{
static LuaFuctionData functions_[sizeof...(Indices)]{
F_<Indices>::F...
};
static_assert(
sizeof(functions_) / sizeof(functions_[0]) ==
sizeof(ScriptFunctions::functions) / sizeof(ScriptFunctions::functions[0]),
"Not all functions have been mapped to Lua");
return functions_;
}
#else
template<unsigned int I> template<unsigned int I>
struct C struct C
{ {
@ -143,6 +117,7 @@ struct C
} }
}; };
template<> template<>
struct C<0> struct C<0>
{ {
@ -166,7 +141,6 @@ LuaFuctionData *functions()
return functions_; return functions_;
} }
#endif
void LangLua::LoadProgram(const char *filename) void LangLua::LoadProgram(const char *filename)
{ {
@ -178,11 +152,8 @@ void LangLua::LoadProgram(const char *filename)
constexpr auto functions_n = sizeof(ScriptFunctions::functions) / sizeof(ScriptFunctions::functions[0]); constexpr auto functions_n = sizeof(ScriptFunctions::functions) / sizeof(ScriptFunctions::functions[0]);
#if __arm__
LuaFuctionData *functions_ = functions(IndicesFor<functions_n>{});
#else
LuaFuctionData *functions_ = functions<sizeof(ScriptFunctions::functions) / sizeof(ScriptFunctions::functions[0])>(); LuaFuctionData *functions_ = functions<sizeof(ScriptFunctions::functions) / sizeof(ScriptFunctions::functions[0])>();
#endif
luabridge::Namespace tes3mp = luabridge::getGlobalNamespace(lua).beginNamespace("tes3mp"); luabridge::Namespace tes3mp = luabridge::getGlobalNamespace(lua).beginNamespace("tes3mp");
for (unsigned i = 0; i < functions_n; i++) for (unsigned i = 0; i < functions_n; i++)
@ -252,7 +223,7 @@ boost::any LangLua::Call(const char *name, const char *argl, int buf, ...)
break; break;
default: default:
throw runtime_error("C++ call: Unknown argument identifier " + argl[index]); throw runtime_error(std::string("C++ call: Unknown argument identifier ") + argl[index]);
} }
} }
@ -304,7 +275,7 @@ boost::any LangLua::Call(const char *name, const char *argl, const std::vector<b
luabridge::Stack<bool>::push(lua, boost::any_cast<int>(args.at(index))); luabridge::Stack<bool>::push(lua, boost::any_cast<int>(args.at(index)));
break; break;
default: default:
throw runtime_error("Lua call: Unknown argument identifier " + argl[index]); throw runtime_error(std::string("Lua call: Unknown argument identifier ") + argl[index]);
} }
} }
@ -321,3 +292,13 @@ void LangLua::AddPackageCPath(const std::string& path)
{ {
packageCPath.emplace(path); packageCPath.emplace(path);
} }
void LangLua::Init()
{
}
void LangLua::Free()
{
}

View file

@ -45,6 +45,9 @@ public:
virtual bool IsCallbackPresent(const char *name) override; virtual bool IsCallbackPresent(const char *name) override;
virtual boost::any Call(const char *name, const char *argl, int buf, ...) override; virtual boost::any Call(const char *name, const char *argl, int buf, ...) override;
virtual boost::any Call(const char *name, const char *argl, const std::vector<boost::any> &args) override; virtual boost::any Call(const char *name, const char *argl, const std::vector<boost::any> &args) override;
static void Init();
static void Free();
private: private:
static std::set<std::string> packageCPath; static std::set<std::string> packageCPath;
static std::set<std::string> packagePath; static std::set<std::string> packagePath;

View file

@ -9,7 +9,7 @@
using namespace std; using namespace std;
inline vector<boost::any> DefToVec(lua_State *lua, string types, int args_begin, int args_n) inline vector<boost::any> DefToVec(lua_State *lua, const string &types, int args_begin, int args_n)
{ {
vector<boost::any> args; vector<boost::any> args;
@ -93,13 +93,15 @@ int LangLua::CallPublic(lua_State *lua)
if (result.empty()) if (result.empty())
return 0; return 0;
if (result.type().hash_code() == typeid(signed int).hash_code()) auto retTypeHash = result.type().hash_code();
if (retTypeHash == typeid(signed int).hash_code())
luabridge::Stack<signed int>::push(lua, boost::any_cast<signed int>(result)); luabridge::Stack<signed int>::push(lua, boost::any_cast<signed int>(result));
else if (result.type().hash_code() == typeid(unsigned int).hash_code()) else if (retTypeHash == typeid(unsigned int).hash_code())
luabridge::Stack<unsigned int>::push(lua, boost::any_cast<unsigned int>(result)); luabridge::Stack<unsigned int>::push(lua, boost::any_cast<unsigned int>(result));
else if (result.type().hash_code() == typeid(double).hash_code()) else if (retTypeHash == typeid(double).hash_code())
luabridge::Stack<double>::push(lua, boost::any_cast<double>(result)); luabridge::Stack<double>::push(lua, boost::any_cast<double>(result));
else if (result.type().hash_code() == typeid(const char*).hash_code()) else if (retTypeHash == typeid(const char*).hash_code())
luabridge::Stack<const char*>::push(lua, boost::any_cast<const char*>(result)); luabridge::Stack<const char*>::push(lua, boost::any_cast<const char*>(result));
return 1; return 1;
} }

View file

@ -0,0 +1,519 @@
//
// Created by koncord on 08.12.18.
//
#include <cstdarg>
#include <mono/metadata/appdomain.h>
#include <mono/metadata/object-forward.h>
#include <mono/jit/jit.h>
#include <mono/metadata/assembly.h>
#include <mono/metadata/mono-config.h>
#include <mono/metadata/mono-debug.h>
#include <Script/ScriptFunctions.hpp>
#include <Script/API/TimerAPI.hpp>
#include <Script/API/PublicFnAPI.hpp>
#include "LangMono.hpp"
static MonoDomain *domain = nullptr; // shared domain
std::string monoStringToStdString(MonoString *monoString)
{
char *utf8 = mono_string_to_utf8(monoString);
std::string str = utf8;
mono_free(utf8);
return str;
}
boost::any LangMono::ObjectToAny(MonoObject *obj)
{
MonoClass *klass = mono_object_get_class(obj);
MonoType *rawType = mono_class_get_type(klass);
switch ((MonoTypeEnum) mono_type_get_type(rawType))
{
case MONO_TYPE_END:
case MONO_TYPE_VOID:
break;
case MONO_TYPE_BOOLEAN:
return (bool) Unbox<MonoBoolean>(obj);
case MONO_TYPE_CHAR:
return Unbox<uint16_t>(obj);
case MONO_TYPE_I1:
return Unbox<int8_t>(obj);
case MONO_TYPE_U1:
return Unbox<uint8_t>(obj);
case MONO_TYPE_I2:
return Unbox<int16_t>(obj);
case MONO_TYPE_U2:
return Unbox<uint16_t>(obj);
case MONO_TYPE_I4:
return Unbox<int32_t>(obj);
case MONO_TYPE_U4:
return Unbox<uint32_t>(obj);
case MONO_TYPE_I8:
return Unbox<int64_t>(obj);
case MONO_TYPE_U8:
return Unbox<uint64_t>(obj);
case MONO_TYPE_R4:
return Unbox<float>(obj);
case MONO_TYPE_R8:
return Unbox<double>(obj);
case MONO_TYPE_STRING:
return monoStringToStdString((MonoString *) obj);
case MONO_TYPE_ARRAY:
case MONO_TYPE_SZARRAY:
{
//MonoArrayType *arrayType = mono_type_get_array_type(rawType);
break;
}
default:
return boost::any();
}
return boost::any();
}
int LangMono::CreateTimerEx(MonoObject *delegate, long msec, MonoString *monoStr, MonoArray *monoArgs)
{
size_t argsLength = mono_array_length(monoArgs);
std::vector<boost::any> params (argsLength);
try
{
for (size_t i = 0; i < argsLength; ++i)
params[i] = ObjectToAny(mono_array_get(monoArgs, MonoObject*, i));
char *types = mono_string_to_utf8(monoStr);
int id = mwmp::TimerAPI::CreateTimerMono(delegate, msec, types, params);
mono_free(types);
return id;
}
catch (...)
{
return -1;
}
}
char GetTes3mpType(MonoType *type)
{
int typeId = mono_type_get_type(type);
switch (typeId)
{
case MONO_TYPE_VOID:
return 'v';
case MONO_TYPE_BOOLEAN:
return 'b';
case MONO_TYPE_CHAR:
return 'q';
case MONO_TYPE_I1:
return 'q';
case MONO_TYPE_U1:
return 'i';
case MONO_TYPE_I2:
return 'q';
case MONO_TYPE_U2:
return 'i';
case MONO_TYPE_I4:
return 'q';
case MONO_TYPE_U4:
return 'i';
case MONO_TYPE_I8:
return 'w';
case MONO_TYPE_U8:
return 'l';
case MONO_TYPE_R4:
return 'f';
case MONO_TYPE_R8:
return 'f';
case MONO_TYPE_STRING:
return 's';
}
throw std::invalid_argument("Mono: invalid type of argument");
}
MonoObject *LangMono::AnyToObject(boost::any any, char ret_type)
{
MonoObject *object;
switch (ret_type)
{
case 'i':
{
auto val = boost::any_cast<unsigned int>(any);
object = mono_object_new(mono_get_root_domain(), mono_get_uint32_class());
ObjectSetValue(object, val);
break;
}
case 'q':
{
auto val = boost::any_cast<signed int>(any);
object = mono_object_new(mono_get_root_domain(), mono_get_int32_class());
ObjectSetValue(object, val);
break;
}
case 'l':
{
auto val = boost::any_cast<unsigned long long>(any);
object = mono_object_new(mono_get_root_domain(), mono_get_uint64_class());
ObjectSetValue(object, val);
break;
}
case 'w':
{
auto val = boost::any_cast<signed long long>(any);
object = mono_object_new(mono_get_root_domain(), mono_get_int64_class());
ObjectSetValue(object, val);
break;
}
case 'f':
{
auto val = boost::any_cast<double>(any);
object = mono_object_new(mono_get_root_domain(), mono_get_double_class());
ObjectSetValue(object, val);
break;
}
case 'p':
{
auto val = boost::any_cast<void *>(any);
object = mono_object_new(mono_get_root_domain(), mono_get_intptr_class());
ObjectSetValue(object, (intptr_t) val);
break;
}
case 's':
{
auto val = mono_string_new(mono_domain_get(), boost::any_cast<const char *>(any));
object = (MonoObject*) val;
break;
}
case 'b':
{
auto val = boost::any_cast<int>(any);
object = mono_object_new(mono_get_root_domain(), mono_get_boolean_class());
ObjectSetValue(object, (bool) val);
break;
}
default:
throw std::runtime_error(std::string("Mono call: Unknown argument identifier ") + ret_type);
}
return object;
}
void LangMono::MakePublic(MonoObject *delegate, MonoString *monoName) noexcept
{
MonoClass *klass = mono_object_get_class(delegate);
MonoMethod *method = mono_get_delegate_invoke(klass);
MonoMethodSignature *signature = mono_method_signature(method);
MonoType *retType = mono_signature_get_return_type(signature);
size_t argsCnt = mono_signature_get_param_count(signature);
void *iter = nullptr;
std::vector<char> def(argsCnt + 1);
for (size_t i = 0; i < argsCnt; ++i)
def[i] = GetTes3mpType(mono_signature_get_params(signature, &iter));
char ret_type = GetTes3mpType(retType);
char *name = mono_string_to_utf8(monoName);
Public::MakePublic(delegate, name, ret_type, def.data());
mono_free(name);
}
MonoObject *LangMono::CallPublic(MonoString *monoFnName, MonoArray *monoArgs)
{
size_t argsLength = mono_array_length(monoArgs);
char *fnName = mono_string_to_utf8(monoFnName);
auto pPublic = Public::GetPublic(fnName);
mono_free(fnName);
if (argsLength != pPublic->def.size())
throw std::invalid_argument("Mono call: Number of arguments does not match definition");
std::vector<boost::any> params(argsLength);
for (size_t i = 0; i < argsLength; ++i)
params[i] = ObjectToAny(mono_array_get(monoArgs, MonoObject*, i));
boost::any ret = pPublic->ScriptFunction::Call(params);
return AnyToObject(ret, pPublic->ret_type);
}
lib_t LangMono::GetInterface()
{
return nullptr;
}
LangMono::LangMono()
{
instance = new MonoInstance;
}
LangMono::LangMono(MonoInstance *instance) : instance(instance)
{
}
LangMono::~LangMono()
{
delete instance;
}
void LangMono::Init()
{
if (domain != nullptr)
return;
if (Script::IsDebugMode())
{
std::string debugServerAddress = "127.0.0.1:10000";
LOG_MESSAGE_SIMPLE(Log::LOG_INFO, "Waiting for debugger on %s...", debugServerAddress.c_str());
std::string connectionString = "--debugger-agent=transport=dt_socket,server=y,address=" + debugServerAddress;
std::vector<const char*> options {
"--soft-breakpoints",
connectionString.c_str()
};
mono_jit_parse_options(options.size(), (char**) options.data());
mono_debug_init(MONO_DEBUG_FORMAT_MONO);
}
domain = mono_jit_init("TES3MP Mono VM");
if (Script::IsDebugMode())
{
mono_debug_domain_create(domain);
}
mono_add_internal_call("TES3MPSharp.TES3MP::CreateTimerEx", (void*) &LangMono::CreateTimerEx);
mono_add_internal_call("TES3MPSharp.TES3MP::MakePublic", (void*) &LangMono::MakePublic);
mono_add_internal_call("TES3MPSharp.TES3MP::CallPublic", (void*) &LangMono::CallPublic);
}
void LangMono::Free()
{
mono_domain_free(domain, 0);
}
std::vector<MonoClass *> getInstanceClassList(MonoImage *image, const std::string &parentName)
{
std::vector<MonoClass *> classes;
const MonoTableInfo *tableInfo = mono_image_get_table_info(image, MONO_TABLE_TYPEDEF);
int rows = mono_table_info_get_rows(tableInfo);
for (int i = 0; i < rows; i++)
{
MonoClass *klass = nullptr;
uint32_t cols[MONO_TYPEDEF_SIZE];
mono_metadata_decode_row(tableInfo, i, cols, MONO_TYPEDEF_SIZE);
const char *name = mono_metadata_string_heap(image, cols[MONO_TYPEDEF_NAME]);
const char *nameSpace = mono_metadata_string_heap(image, cols[MONO_TYPEDEF_NAMESPACE]);
klass = mono_class_from_name(image, nameSpace, name);
if (klass == nullptr)
continue;
MonoClass *parent = mono_class_get_parent(klass);
if (parent != nullptr && parentName == mono_class_get_name(parent))
classes.push_back(klass);
}
return classes;
}
void LangMono::LoadProgram(const char *filename)
{
MonoAssembly *assembly = mono_domain_assembly_open(domain, filename);
if(!assembly)
throw std::runtime_error("Cannot load: " + std::string(filename));
instance->assembly = assembly;
instance->image = mono_assembly_get_image(instance->assembly);
std::vector<MonoClass *> list = getInstanceClassList(instance->image, "Instance");
for (auto &&klass : list)
{
instance->object = mono_object_new(domain, klass);
mono_runtime_object_init(instance->object); // call default ctor
instance->klass = klass;
}
}
int LangMono::FreeProgram()
{
for(auto &&method : methodsCache)
{
if(method.second != nullptr)
mono_free_method(method.second);
}
return 0;
}
bool LangMono::IsCallbackPresent(const char *name)
{
return true;
}
boost::any LangMono::Call(const char *name, const char *argl, int buf, ...)
{
va_list vargs;
va_start(vargs, buf);
int n_args = (int) (strlen(argl));
std::vector<void *> vec(n_args);
TMonoArgsStore argsStore(n_args);
for (int index = 0; index < n_args; index++)
{
switch (argl[index])
{
case 'i':
{
vec[index] = MonoStoreAndGetPtr<unsigned int>(argsStore, vargs, index);
break;
}
case 'q':
{
vec[index] = MonoStoreAndGetPtr<signed int>(argsStore, vargs, index);
break;
}
case 'l':
{
vec[index] = MonoStoreAndGetPtr<unsigned long long>(argsStore, vargs, index);
break;
}
case 'w':
{
vec[index] = MonoStoreAndGetPtr<signed long long>(argsStore, vargs, index);
break;
}
case 'f':
{
vec[index] = MonoStoreAndGetPtr<double>(argsStore, vargs, index);
break;
}
case 'p':
{
vec[index] = MonoStoreAndGetPtr<void *>(argsStore, vargs, index);
break;
}
case 's':
{
vec[index] = (mono_string_new(mono_domain_get(), va_arg(vargs, const char*)));
break;
}
case 'b':
{
vec[index] = MonoStoreAndGetPtr<int>(argsStore, vargs, index);
break;
}
default:
throw std::runtime_error(std::string("Mono call: Unknown argument identifier ") + argl[index]);
}
}
va_end(vargs);
MonoMethod *method;
auto it = methodsCache.find({name, n_args});
if (it != methodsCache.end())
{
method = it->second;
} else
{
method = mono_class_get_method_from_name(instance->klass, name, n_args);
methodsCache[{name, n_args}] = method;
}
if (method == nullptr)
return boost::any();
MonoObject *ret = mono_runtime_invoke(method, instance->object, vec.data(), nullptr);
if (ret)
return boost::any(mono_object_unbox(ret));
else
return boost::any();
}
boost::any LangMono::Call(const char *name, const char *argl, const std::vector<boost::any> &args)
{
int n_args = args.size();
std::vector<void *> vec(n_args);
TMonoArgsStore argsStore(n_args);
for (int index = 0; index < n_args; index++)
{
switch (argl[index])
{
case 'i':
{
vec[index] = MonoStoreAndGetPtr<unsigned int>(argsStore, args, index);
break;
}
case 'q':
{
vec[index] = MonoStoreAndGetPtr<signed int>(argsStore, args, index);
break;
}
case 'l':
{
vec[index] = MonoStoreAndGetPtr<unsigned long long>(argsStore, args, index);
break;
}
case 'w':
{
vec[index] = MonoStoreAndGetPtr<signed long long>(argsStore, args, index);
break;
}
case 'f':
{
vec[index] = MonoStoreAndGetPtr<double>(argsStore, args, index);
break;
}
case 'p':
{
vec[index] = MonoStoreAndGetPtr<void *>(argsStore, args, index);
break;
}
case 's':
{
auto val = mono_string_new(mono_domain_get(), boost::any_cast<const char *>(args.at(index)));
vec[index] = (val);
break;
}
case 'b':
{
vec[index] = MonoStoreAndGetPtr<int>(argsStore, args, index);
break;
}
default:
throw std::runtime_error(std::string("Mono call: Unknown argument identifier ") + argl[index]);
}
}
MonoMethod *method;
auto it = methodsCache.find({name, n_args});
if (it != methodsCache.end())
{
method = it->second;
}
else
{
method = mono_class_get_method_from_name(instance->klass, name, n_args);
methodsCache[{name, n_args}] = method;
}
MonoObject *ret = mono_runtime_invoke(method, instance->object, vec.data(), nullptr);
if (ret)
return boost::any(mono_object_unbox(ret));
else
return boost::any();
}

View file

@ -0,0 +1,104 @@
//
// Created by koncord on 08.12.18.
//
#pragma once
#include <Script/Language.hpp>
#include <Script/SystemInterface.hpp>
#include <unordered_map>
#include <mono/metadata/object.h>
#include <boost/variant.hpp>
typedef boost::variant<unsigned int, signed int, unsigned long long, signed long long, double, void*> TMonoArgVariant;
typedef std::vector<TMonoArgVariant> TMonoArgsStore;
template<typename T>
void *MonoStoreAndGetPtr(TMonoArgsStore &argsStore, va_list &vargs, size_t index)
{
argsStore[index] = va_arg(vargs, T);
return (void *) &boost::get<T&>(argsStore[index]);
}
template<typename T>
void *MonoStoreAndGetPtr(TMonoArgsStore &argsStore, const std::vector<boost::any> &args, size_t index)
{
argsStore[index] = boost::any_cast<T>(args.at(index));
return (void *) &boost::get<T&>(argsStore[index]);
}
struct MethodKey
{
inline bool operator==(const MethodKey &other) const
{
return other.paramsCnt == paramsCnt && other.name == name;
}
MethodKey(const std::string &name, int paramsCnt): name(name), paramsCnt(paramsCnt)
{
}
std::string name;
int paramsCnt;
};
namespace std
{
template<>
struct hash<MethodKey>
{
std::size_t operator()(const MethodKey &key) const
{
return hash<string>()(key.name)
^ (hash<uint32_t>()(key.paramsCnt) >> 1);
}
};
}
struct MonoInstance
{
MonoObject *object;
MonoClass *klass;
MonoAssembly *assembly;
MonoImage *image;
};
class LangMono: public Language
{
MonoInstance *instance;
std::unordered_map<MethodKey, MonoMethod *> methodsCache;
public:
virtual lib_t GetInterface() override;
LangMono();
LangMono(MonoInstance *instance);
~LangMono();
virtual void LoadProgram(const char *filename) override;
virtual int FreeProgram() override;
virtual bool IsCallbackPresent(const char *name) override;
virtual boost::any Call(const char *name, const char *argl, int buf, ...) override;
virtual boost::any Call(const char *name, const char *argl, const std::vector<boost::any> &args) override;
static int CreateTimerEx(MonoObject *delegate, long msec, MonoString *monoStr, MonoArray *args);
static void MakePublic(MonoObject *delegate, MonoString *name) noexcept;
static MonoObject *CallPublic(MonoString *name, MonoArray *args);
static void Init();
static void Free();
template<typename T>
static T Unbox(MonoObject *obj)
{
return *(T *) mono_object_unbox(obj);
}
template<typename T>
static void ObjectSetValue(MonoObject *obj, T value)
{
*(T*) mono_object_unbox(obj) = value;
}
static boost::any ObjectToAny(MonoObject *obj);
static MonoObject *AnyToObject(boost::any any, char ret_type);
};

View file

@ -91,7 +91,7 @@ lib_t LangNative::GetInterface()
} }
LangNative::LangNative() LangNative::LangNative(): lib(nullptr)
{ {
} }
@ -100,3 +100,13 @@ LangNative::~LangNative()
{ {
} }
void LangNative::Init()
{
}
void LangNative::Free()
{
}

View file

@ -22,6 +22,8 @@ public:
virtual boost::any Call(const char *name, const char *argl, int buf, ...) override; virtual boost::any Call(const char *name, const char *argl, int buf, ...) override;
virtual boost::any Call(const char *name, const char *argl, const std::vector<boost::any> &args) override; virtual boost::any Call(const char *name, const char *argl, const std::vector<boost::any> &args) override;
static void Init();
static void Free();
}; };

View file

@ -13,7 +13,7 @@
class Language class Language
{ {
public: public:
virtual ~Language(){} virtual ~Language() = default;
virtual void LoadProgram(const char* filename) = 0; virtual void LoadProgram(const char* filename) = 0;
virtual int FreeProgram() = 0; virtual int FreeProgram() = 0;
virtual bool IsCallbackPresent(const char* name) = 0; virtual bool IsCallbackPresent(const char* name) = 0;

View file

@ -5,16 +5,24 @@
#ifndef PLATFORM_HPP #ifndef PLATFORM_HPP
#define PLATFORM_HPP #define PLATFORM_HPP
#if _MSC_VER #ifdef _MSC_VER
#ifdef _M_X86 #ifdef _M_X86
#define ARCH_X86 #define ARCH_X86
#endif #endif
#endif #endif
#if __GNUC__ #ifdef __GNUC__
#ifdef __i386__ #ifdef __i386__
#define ARCH_X86 #define ARCH_X86
#endif #endif
#endif #endif
#ifdef _WIN32
#define EXPORT_APIFUNCTION extern "C" __declspec(dllexport)
#define CDECL __cdecl
#else
#define EXPORT_APIFUNCTION extern "C" __attribute__ ((visibility ("default")))
#define CDECL
#endif
#endif //PLATFORM_HPP #endif //PLATFORM_HPP

View file

@ -9,10 +9,28 @@
#include "LangLua/LangLua.hpp" #include "LangLua/LangLua.hpp"
#endif #endif
#ifdef ENABLE_MONO
#include "LangMono/LangMono.hpp"
#endif
using namespace std; using namespace std;
Script::ScriptList Script::scripts; Script::ScriptList Script::scripts;
std::string Script::moddir; std::string Script::moddir;
bool Script::debugMode = false;
inline void Load(Language *lang, const std::string &path)
{
try
{
lang->LoadProgram(path.c_str());
}
catch (...)
{
lang->FreeProgram();
throw std::runtime_error("Failed to load: " + path);
}
}
Script::Script(const char *path) Script::Script(const char *path)
{ {
@ -23,35 +41,45 @@ Script::Script(const char *path)
fclose(file); fclose(file);
#ifdef _WIN32
if (strstr(path, ".dll")) if (strstr(path, ".dll"))
#else {
if (strstr(path, ".so")) #ifdef ENABLE_MONO
script_type = SCRIPT_MONO;
try
{
lang = new LangMono();
Load(lang, path);
}
catch(...)
{
#endif #endif
#ifdef _WIN32
script_type = SCRIPT_CPP;
lang = new LangNative();
Load(lang, path);
#endif
#ifdef ENABLE_MONO
}
#endif
}
#ifndef _WIN32
else if (strstr(path, ".so"))
{ {
script_type = SCRIPT_CPP; script_type = SCRIPT_CPP;
lang = new LangNative(); lang = new LangNative();
Load(lang, path);
} }
#endif
#if defined (ENABLE_LUA) #if defined (ENABLE_LUA)
else if (strstr(path, ".lua") || strstr(path, ".t")) else if (strstr(path, ".lua") || strstr(path, ".t"))
{ {
lang = new LangLua();
script_type = SCRIPT_LUA; script_type = SCRIPT_LUA;
lang = new LangLua();
Load(lang, path);
} }
#endif #endif
else else
throw runtime_error("Script type not recognized: " + string(path)); throw runtime_error("Script type not recognized: " + string(path));
try
{
lang->LoadProgram(path);
}
catch (...)
{
lang->FreeProgram();
throw;
}
} }
@ -106,3 +134,35 @@ const char* Script::GetModDir()
{ {
return moddir.c_str(); return moddir.c_str();
} }
bool Script::IsDebugMode()
{
return debugMode;
}
void Script::EnableDebugMode()
{
debugMode = true;
}
void Script::Init()
{
#ifdef ENABLE_MONO
LangMono::Init();
#endif
#ifdef ENABLE_LUA
LangLua::Init();
#endif
LangNative::Init();
}
void Script::Free()
{
#ifdef ENABLE_MONO
LangMono::Free();
#endif
#ifdef ENABLE_LUA
LangLua::Free();
#endif
LangNative::Free();
}

View file

@ -27,7 +27,8 @@ private:
enum enum
{ {
SCRIPT_CPP, SCRIPT_CPP,
SCRIPT_LUA SCRIPT_LUA,
SCRIPT_MONO
}; };
template<typename R> template<typename R>
@ -56,9 +57,14 @@ private:
protected: protected:
static std::string moddir; static std::string moddir;
static bool debugMode;
public: public:
~Script(); ~Script();
static void Init();
static void Free();
static bool IsDebugMode();
static void EnableDebugMode();
static void LoadScript(const char *script, const char* base); static void LoadScript(const char *script, const char* base);
static void LoadScripts(char* scripts, const char* base); static void LoadScripts(char* scripts, const char* base);
static void UnloadScripts(); static void UnloadScripts();
@ -95,8 +101,7 @@ public:
if (script->script_type == SCRIPT_CPP) if (script->script_type == SCRIPT_CPP)
(callback)(std::forward<Args>(args)...); (callback)(std::forward<Args>(args)...);
#if defined (ENABLE_LUA) else
else if (script->script_type == SCRIPT_LUA)
{ {
try try
{ {
@ -105,13 +110,11 @@ public:
catch (std::exception &e) catch (std::exception &e)
{ {
LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, e.what()); LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, e.what());
Script::Call<Script::CallbackIdentity("OnServerScriptCrash")>(e.what());
if (!mwmp::Networking::getPtr()->getScriptErrorIgnoringState()) if (!mwmp::Networking::getPtr()->getScriptErrorIgnoringState())
throw; throw;
} }
} }
#endif
++count; ++count;
} }

View file

@ -9,6 +9,9 @@
#if defined (ENABLE_LUA) #if defined (ENABLE_LUA)
#include "LangLua/LangLua.hpp" #include "LangLua/LangLua.hpp"
#endif #endif
#if defined(ENABLE_MONO)
#include "LangMono/LangMono.hpp"
#endif
using namespace std; using namespace std;
@ -24,7 +27,12 @@ ScriptFunction::ScriptFunction(const ScriptFuncLua &fLua, lua_State *lua, char r
} }
#endif #endif
#if defined (ENABLE_MONO)
ScriptFunction::ScriptFunction(MonoObject *delegate, char ret_type, const std::string &def) :
fMono({delegate}), ret_type(ret_type), def(def), script_type(SCRIPT_MONO)
{
}
#endif
ScriptFunction::~ScriptFunction() ScriptFunction::~ScriptFunction()
{ {
@ -36,7 +44,7 @@ ScriptFunction::~ScriptFunction()
boost::any ScriptFunction::Call(const vector<boost::any> &args) boost::any ScriptFunction::Call(const vector<boost::any> &args)
{ {
boost::any result; boost::any result = boost::any();
if (def.length() != args.size()) if (def.length() != args.size())
throw runtime_error("Script call: Number of arguments does not match definition"); throw runtime_error("Script call: Number of arguments does not match definition");
@ -61,13 +69,78 @@ boost::any ScriptFunction::Call(const vector<boost::any> &args)
result = boost::any_cast<luabridge::LuaRef>(any).cast<const char*>(); result = boost::any_cast<luabridge::LuaRef>(any).cast<const char*>();
break; break;
case 'v': case 'v':
result = boost::any();
break; break;
default: default:
throw runtime_error("Lua call: Unknown return type" + ret_type); throw runtime_error("Lua call: Unknown return type" + ret_type);
} }
} }
#endif #endif
#if defined (ENABLE_MONO)
else if (script_type == SCRIPT_MONO)
{
std::vector<void *> argList(args.size());
TMonoArgsStore argsStore(args.size());
for (size_t index = 0; index < args.size(); index++)
{
switch (def[index])
{
case 'i':
{
argList[index] = MonoStoreAndGetPtr<unsigned int>(argsStore, args, index);
break;
}
case 'q':
{
argList[index] = MonoStoreAndGetPtr<signed int>(argsStore, args, index);
break;
}
case 'l':
{
argList[index] = MonoStoreAndGetPtr<unsigned long long>(argsStore, args, index);
break;
}
case 'w':
{
argList[index] = MonoStoreAndGetPtr<signed long long>(argsStore, args, index);
break;
}
case 'f':
{
argList[index] = MonoStoreAndGetPtr<double>(argsStore, args, index);
break;
}
case 'p':
{
argList[index] = MonoStoreAndGetPtr<void *>(argsStore, args, index);
break;
}
case 's':
{
if (args.at(index).type() == typeid(std::string)) // mono to mono call
argList[index] = mono_string_new(mono_domain_get(),
boost::any_cast<std::string>(args.at(index)).c_str());
else // lua to mono
argList[index] = mono_string_new(mono_domain_get(),
boost::any_cast<const char *>(args.at(index)));
break;
}
case 'b':
{
argList[index] = MonoStoreAndGetPtr<int>(argsStore, args, index);
break;
}
default:
throw std::runtime_error("Call: Unknown argument identifier " + def[index]);
}
}
MonoObject *monoRet = mono_runtime_delegate_invoke(fMono.delegate, argList.data(), NULL);
if (monoRet != nullptr)
result = LangMono::ObjectToAny(monoRet);
}
#endif
return result; return result;
} }

View file

@ -12,6 +12,11 @@
#include "LangLua/LangLua.hpp" #include "LangLua/LangLua.hpp"
#endif #endif
#if defined (ENABLE_MONO)
#include <mono/metadata/object.h>
#include <mono/metadata/appdomain.h>
#endif
typedef unsigned long long(*ScriptFunc)(); typedef unsigned long long(*ScriptFunc)();
#if defined (ENABLE_LUA) #if defined (ENABLE_LUA)
typedef std::string ScriptFuncLua; typedef std::string ScriptFuncLua;
@ -29,26 +34,37 @@ protected:
lua_State *lua; lua_State *lua;
ScriptFuncLua name; ScriptFuncLua name;
} fLua; } fLua;
#endif
#ifdef ENABLE_MONO
struct
{
MonoObject *delegate;
} fMono;
#endif #endif
}; };
protected: public:
char ret_type; char ret_type;
std::string def; std::string def;
int script_type; int script_type;
enum enum
{ {
SCRIPT_CPP, SCRIPT_CPP,
SCRIPT_LUA SCRIPT_LUA,
SCRIPT_MONO
}; };
boost::any Call(const std::vector<boost::any> &args);
protected:
ScriptFunction(ScriptFunc fCpp, char ret_type, const std::string &def); ScriptFunction(ScriptFunc fCpp, char ret_type, const std::string &def);
#if defined (ENABLE_LUA) #if defined (ENABLE_LUA)
ScriptFunction(const ScriptFuncLua &fPawn, lua_State *lua, char ret_type, const std::string &def); ScriptFunction(const ScriptFuncLua &fPawn, lua_State *lua, char ret_type, const std::string &def);
#endif
#if defined (ENABLE_MONO)
ScriptFunction(MonoObject *delegate, char ret_type, const std::string &def);
#endif #endif
virtual ~ScriptFunction(); virtual ~ScriptFunction();
boost::any Call(const std::vector<boost::any> &args);
}; };
#endif //SCRIPTFUNCTION_HPP #endif //SCRIPTFUNCTION_HPP

View file

@ -13,23 +13,58 @@ constexpr ScriptCallbackData ScriptFunctions::callbacks[];
using namespace std; using namespace std;
void ScriptFunctions::MakePublic(ScriptFunc _public, const char *name, char ret_type, const char *def) noexcept void ScriptFunctions::GetArguments(std::vector<boost::any> &params, va_list args, const std::string &def)
{ {
Public::MakePublic(_public, name, ret_type, def); params.reserve(def.length());
}
boost::any ScriptFunctions::CallPublic(const char *name, va_list args) noexcept
{
vector<boost::any> params;
try try
{ {
string def = Public::GetDefinition(name); for (char c : def)
Utils::getArguments(params, args, def); {
switch (c)
{
case 'i':
params.emplace_back(va_arg(args, unsigned int));
break;
return Public::Call(name, params); case 'q':
} params.emplace_back(va_arg(args, signed int));
catch (...) {} break;
return 0; case 'l':
params.emplace_back(va_arg(args, unsigned long long));
break;
case 'w':
params.emplace_back(va_arg(args, signed long long));
break;
case 'f':
params.emplace_back(va_arg(args, double));
break;
case 'p':
params.emplace_back(va_arg(args, void*));
break;
case 's':
params.emplace_back(va_arg(args, const char*));
break;
case 'b':
params.emplace_back(va_arg(args, int));
break;
default:
throw runtime_error(std::string("C++ call: Unknown argument identifier ") + c);
}
}
}
catch (...)
{
va_end(args);
throw;
}
va_end(args);
} }

View file

@ -14,6 +14,7 @@
#include <Script/Functions/Miscellaneous.hpp> #include <Script/Functions/Miscellaneous.hpp>
#include <Script/Functions/Objects.hpp> #include <Script/Functions/Objects.hpp>
#include <Script/Functions/Positions.hpp> #include <Script/Functions/Positions.hpp>
#include <Script/Functions/Public.hpp>
#include <Script/Functions/Quests.hpp> #include <Script/Functions/Quests.hpp>
#include <Script/Functions/RecordsDynamic.hpp> #include <Script/Functions/RecordsDynamic.hpp>
#include <Script/Functions/Shapeshift.hpp> #include <Script/Functions/Shapeshift.hpp>
@ -21,6 +22,7 @@
#include <Script/Functions/Settings.hpp> #include <Script/Functions/Settings.hpp>
#include <Script/Functions/Spells.hpp> #include <Script/Functions/Spells.hpp>
#include <Script/Functions/Stats.hpp> #include <Script/Functions/Stats.hpp>
#include <Script/Functions/Timer.hpp>
#include <Script/Functions/Worldstate.hpp> #include <Script/Functions/Worldstate.hpp>
#include <RakNetTypes.h> #include <RakNetTypes.h>
#include <tuple> #include <tuple>
@ -46,88 +48,19 @@
class ScriptFunctions class ScriptFunctions
{ {
public: public:
static void GetArguments(std::vector<boost::any> &params, va_list args, const std::string &def);
static void MakePublic(ScriptFunc _public, const char *name, char ret_type, const char *def) noexcept;
static boost::any CallPublic(const char *name, va_list args) noexcept;
/**
* \brief Create a timer that will run a script function after a certain interval.
*
* \param callback The Lua script function.
* \param msec The interval in miliseconds.
* \return The ID of the timer thus created.
*/
static int CreateTimer(ScriptFunc callback, int msec) noexcept;
/**
* \brief Create a timer that will run a script function after a certain interval and pass
* certain arguments to it.
*
* Example usage:
* - tes3mp.CreateTimerEx("OnTimerTest1", 250, "i", 90)
* - tes3mp.CreateTimerEx("OnTimerTest2", 500, "sif", "Test string", 60, 77.321)
*
* \param callback The Lua script function.
* \param msec The interval in miliseconds.
* \param types The argument types.
* \param args The arguments.
* \return The ID of the timer thus created.
*/
static int CreateTimerEx(ScriptFunc callback, int msec, const char *types, va_list args) noexcept;
/**
* \brief Start the timer with a certain ID.
*
* \param timerId The timer ID.
* \return void
*/
static void StartTimer(int timerId) noexcept;
/**
* \brief Stop the timer with a certain ID.
*
* \param timerId The timer ID.
* \return void
*/
static void StopTimer(int timerId) noexcept;
/**
* \brief Restart the timer with a certain ID for a certain interval.
*
* \param timerId The timer ID.
* \param msec The interval in miliseconds.
* \return void
*/
static void RestartTimer(int timerId, int msec) noexcept;
/**
* \brief Free the timer with a certain ID.
*
* \param timerId The timer ID.
* \return void
*/
static void FreeTimer(int timerId) noexcept;
/**
* \brief Check whether a timer is elapsed.
*
* \param timerId The timer ID.
* \return Whether the timer is elapsed.
*/
static bool IsTimerElapsed(int timerId) noexcept;
static constexpr ScriptFunctionData functions[]{ static constexpr ScriptFunctionData functions[]{
{"CreateTimer", ScriptFunctions::CreateTimer}, {"CreateTimer", TimerFunctions::CreateTimer},
{"CreateTimerEx", ScriptFunctions::CreateTimerEx}, {"CreateTimerEx", TimerFunctions::CreateTimerEx},
{"MakePublic", ScriptFunctions::MakePublic}, {"MakePublic", PublicFunctions::MakePublic},
{"CallPublic", ScriptFunctions::CallPublic}, {"CallPublic", PublicFunctions::CallPublic},
{"StartTimer", ScriptFunctions::StartTimer}, {"StartTimer", TimerFunctions::StartTimer},
{"StopTimer", ScriptFunctions::StopTimer}, {"StopTimer", TimerFunctions::StopTimer},
{"RestartTimer", ScriptFunctions::RestartTimer}, {"RestartTimer", TimerFunctions::RestartTimer},
{"FreeTimer", ScriptFunctions::FreeTimer}, {"FreeTimer", TimerFunctions::FreeTimer},
{"IsTimerElapsed", ScriptFunctions::IsTimerElapsed}, {"IsTimerElapsed", TimerFunctions::IsTimerElapsed},
ACTORAPI, ACTORAPI,
BOOKAPI, BOOKAPI,
@ -156,7 +89,6 @@ public:
{"OnServerInit", Callback<>()}, {"OnServerInit", Callback<>()},
{"OnServerPostInit", Callback<>()}, {"OnServerPostInit", Callback<>()},
{"OnServerExit", Callback<bool>()}, {"OnServerExit", Callback<bool>()},
{"OnServerScriptCrash", Callback<const char*>()},
{"OnPlayerConnect", Callback<unsigned short>()}, {"OnPlayerConnect", Callback<unsigned short>()},
{"OnPlayerDisconnect", Callback<unsigned short>()}, {"OnPlayerDisconnect", Callback<unsigned short>()},
{"OnPlayerDeath", Callback<unsigned short>()}, {"OnPlayerDeath", Callback<unsigned short>()},
@ -209,7 +141,7 @@ public:
{"OnWorldMap", Callback<unsigned short>()}, {"OnWorldMap", Callback<unsigned short>()},
{"OnWorldWeather", Callback<unsigned short>() }, {"OnWorldWeather", Callback<unsigned short>() },
{"OnMpNumIncrement", Callback<int>()}, {"OnMpNumIncrement", Callback<int>()},
{"OnRequestDataFileList", Callback<>()} {"OnRequestPluginList", Callback<>()}
}; };
}; };

View file

@ -103,13 +103,9 @@ struct CallbackIdentity
struct ScriptFunctionPointer : public ScriptIdentity struct ScriptFunctionPointer : public ScriptIdentity
{ {
void *addr; void *addr;
#if (!defined(__clang__) && defined(__GNUC__))
template<typename R, typename... Types> template<typename R, typename... Types>
constexpr ScriptFunctionPointer(Function<R, Types...> addr) : ScriptIdentity(addr), addr((void*)(addr)) {} constexpr ScriptFunctionPointer(Function<R, Types...> addr) : ScriptIdentity(addr), addr((void*)(addr)) {}
#else
template<typename R, typename... Types>
constexpr ScriptFunctionPointer(Function<R, Types...> addr) : ScriptIdentity(addr), addr(addr) {}
#endif
}; };
struct ScriptFunctionData struct ScriptFunctionData

View file

@ -1,6 +1,8 @@
#include "Utils.hpp" //
// Created by koncord on 04.03.17.
//
#include <cstdarg> #include "Utils.hpp"
using namespace std; using namespace std;
@ -15,7 +17,6 @@ const vector<string> Utils::split(const string &str, int delimiter)
else if (!buffer.empty()) else if (!buffer.empty())
{ {
result.push_back(move(buffer)); result.push_back(move(buffer));
buffer.clear();
} }
if (!buffer.empty()) if (!buffer.empty())
result.push_back(move(buffer)); result.push_back(move(buffer));
@ -23,7 +24,7 @@ const vector<string> Utils::split(const string &str, int delimiter)
return result; return result;
} }
ESM::Cell Utils::getCellFromDescription(std::string cellDescription) ESM::Cell Utils::getCellFromDescription(const std::string &cellDescription)
{ {
ESM::Cell cell; ESM::Cell cell;
cell.blank(); cell.blank();
@ -50,59 +51,3 @@ ESM::Cell Utils::getCellFromDescription(std::string cellDescription)
return cell; return cell;
} }
void Utils::getArguments(std::vector<boost::any> &params, va_list args, const std::string &def)
{
params.reserve(def.length());
try
{
for (char c : def)
{
switch (c)
{
case 'i':
params.emplace_back(va_arg(args, unsigned int));
break;
case 'q':
params.emplace_back(va_arg(args, signed int));
break;
case 'l':
params.emplace_back(va_arg(args, unsigned long long));
break;
case 'w':
params.emplace_back(va_arg(args, signed long long));
break;
case 'f':
params.emplace_back(va_arg(args, double));
break;
case 'p':
params.emplace_back(va_arg(args, void*));
break;
case 's':
params.emplace_back(va_arg(args, const char*));
break;
case 'b':
params.emplace_back(va_arg(args, int));
break;
default:
throw runtime_error("C++ call: Unknown argument identifier " + c);
}
}
}
catch (...)
{
va_end(args);
throw;
}
va_end(args);
}

View file

@ -1,3 +1,7 @@
//
// Created by koncord on 04.03.17.
//
#ifndef OPENMW_UTILS_HPP #ifndef OPENMW_UTILS_HPP
#define OPENMW_UTILS_HPP #define OPENMW_UTILS_HPP
@ -5,8 +9,6 @@
#include <regex> #include <regex>
#include <vector> #include <vector>
#include <boost/any.hpp>
#include <components/esm/loadcell.hpp> #include <components/esm/loadcell.hpp>
#include <components/openmw-mp/Utils.hpp> #include <components/openmw-mp/Utils.hpp>
@ -23,9 +25,7 @@ namespace Utils
{ {
const std::vector<std::string> split(const std::string &str, int delimiter); const std::vector<std::string> split(const std::string &str, int delimiter);
ESM::Cell getCellFromDescription(std::string cellDescription); ESM::Cell getCellFromDescription(const std::string &cellDescription);
void getArguments(std::vector<boost::any> &params, va_list args, const std::string &def);
template<size_t N> template<size_t N>
constexpr unsigned int hash(const char(&str)[N], size_t I = N) constexpr unsigned int hash(const char(&str)[N], size_t I = N)

View file

@ -27,6 +27,10 @@
#include <apps/openmw-mp/Script/Script.hpp> #include <apps/openmw-mp/Script/Script.hpp>
#ifdef ENABLE_MONO
#include <mono/metadata/assembly.h>
#endif
#ifdef ENABLE_BREAKPAD #ifdef ENABLE_BREAKPAD
#include <handler/exception_handler.h> #include <handler/exception_handler.h>
#endif #endif
@ -130,6 +134,7 @@ boost::program_options::variables_map launchOptions(int argc, char *argv[], File
desc.add_options() desc.add_options()
("resources", bpo::value<Files::EscapeHashString>()->default_value("resources"), "set resources directory") ("resources", bpo::value<Files::EscapeHashString>()->default_value("resources"), "set resources directory")
("debug", bpo::value<bool>()->implicit_value(true)->default_value(false), "Enable debug mode for scripts (if supported)")
("no-logs", bpo::value<bool>()->implicit_value(true)->default_value(false), ("no-logs", bpo::value<bool>()->implicit_value(true)->default_value(false),
"Do not write logs. Useful for daemonizing."); "Do not write logs. Useful for daemonizing.");
@ -190,29 +195,53 @@ int main(int argc, char *argv[])
LOG_INIT(logLevel); LOG_INIT(logLevel);
int players = mgr.getInt("maximumPlayers", "General"); int players = mgr.getInt("maximumPlayers", "General");
string address = mgr.getString("localAddress", "General"); string addr = mgr.getString("localAddress", "General");
int port = mgr.getInt("port", "General"); int port = mgr.getInt("port", "General");
string password = mgr.getString("password", "General"); string passw = mgr.getString("password", "General");
string pluginHome = mgr.getString("home", "Plugins"); string plugin_home = mgr.getString("home", "Plugins");
string dataDirectory = Utils::convertPath(pluginHome + "/data"); string moddir = Utils::convertPath(plugin_home + "/data");
vector<string> plugins (Utils::split(mgr.getString("plugins", "Plugins"), ',')); vector<string> plugins (Utils::split(mgr.getString("plugins", "Plugins"), ','));
Utils::printVersion("TES3MP dedicated server", TES3MP_VERSION, version.mCommitHash, TES3MP_PROTO_VERSION); Utils::printVersion("TES3MP dedicated server", TES3MP_VERSION, version.mCommitHash, TES3MP_PROTO_VERSION);
Script::SetModDir(dataDirectory); // Check for unmodified tes3mp-credits file; this makes it so people can't repackage official releases with
// their own made-up credits, though it obviously has no bearing on unofficial releases that change
// the checksum below
boost::filesystem::path folderPath(boost::filesystem::initial_path<boost::filesystem::path>());
folderPath = boost::filesystem::system_complete(boost::filesystem::path(argv[0])).remove_filename();
std::string creditsPath = folderPath.string() + "/tes3mp-credits";
unsigned int expectedChecksumInt = Utils::hexStrToInt(TES3MP_CREDITS_CHECKSUM);
bool hasValidCredits = Utils::doesFileHaveChecksum(creditsPath + ".md", expectedChecksumInt);
if (!hasValidCredits)
hasValidCredits = Utils::doesFileHaveChecksum(creditsPath + ".txt", expectedChecksumInt);
if (!hasValidCredits)
{
LOG_MESSAGE_SIMPLE(Log::LOG_FATAL, "The server is shutting down");
LOG_APPEND(Log::LOG_FATAL, "- %s", TES3MP_CREDITS_ERROR);
return 1;
}
Script::SetModDir(moddir);
#ifdef ENABLE_LUA #ifdef ENABLE_LUA
LangLua::AddPackagePath(Utils::convertPath(pluginHome + "/scripts/?.lua" + ";" LangLua::AddPackagePath(Utils::convertPath(plugin_home + "/scripts/?.lua" + ";"
+ pluginHome + "/lib/lua/?.lua" + ";")); + plugin_home + "/lib/lua/?.lua" + ";"));
#ifdef _WIN32 #ifdef _WIN32
LangLua::AddPackageCPath(Utils::convertPath(pluginHome + "/lib/?.dll")); LangLua::AddPackageCPath(Utils::convertPath(plugin_home + "/lib/?.dll"));
#else #else
LangLua::AddPackageCPath(Utils::convertPath(pluginHome + "/lib/?.so")); LangLua::AddPackageCPath(Utils::convertPath(plugin_home + "/lib/?.so"));
#endif #endif
#endif
#ifdef ENABLE_MONO
mono_set_dirs(Utils::convertPath(plugin_home + "/mono").c_str(), Utils::convertPath(plugin_home + "/mono/etc").c_str());
#endif #endif
int code; int code;
@ -226,18 +255,21 @@ int main(int argc, char *argv[])
peer->SetIncomingPassword(sstr.str().c_str(), (int) sstr.str().size()); peer->SetIncomingPassword(sstr.str().c_str(), (int) sstr.str().size());
if (RakNet::NonNumericHostString(address.c_str())) if (RakNet::NonNumericHostString(addr.c_str()))
{ {
LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, "You cannot use non-numeric addresses for the server."); LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, "You cannot use non-numeric addresses for the server.");
return 1; return 1;
} }
RakNet::SocketDescriptor sd((unsigned short) port, address.c_str()); RakNet::SocketDescriptor sd((unsigned short) port, addr.c_str());
try try
{ {
if (variables["debug"].as<bool>())
Script::EnableDebugMode();
Script::Init();
for (auto plugin : plugins) for (auto plugin : plugins)
Script::LoadScript(plugin.c_str(), pluginHome.c_str()); Script::LoadScript(plugin.c_str(), plugin_home.c_str());
switch (peer->Startup((unsigned) players, &sd, 1)) switch (peer->Startup((unsigned) players, &sd, 1))
{ {
@ -264,7 +296,7 @@ int main(int argc, char *argv[])
peer->SetMaximumIncomingConnections((unsigned short) (players)); peer->SetMaximumIncomingConnections((unsigned short) (players));
Networking networking(peer); Networking networking(peer);
networking.setServerPassword(password); networking.setServerPassword(passw);
if (mgr.getBool("enabled", "MasterServer")) if (mgr.getBool("enabled", "MasterServer"))
{ {
@ -289,13 +321,15 @@ int main(int argc, char *argv[])
} }
networking.InitQuery(masterAddr, (unsigned short) masterPort); networking.InitQuery(masterAddr, (unsigned short) masterPort);
networking.getMasterClient()->SetMaxPlayers((unsigned) players); auto masterClient = networking.getMasterClient();
networking.getMasterClient()->SetUpdateRate((unsigned) updateRate);
string hostname = mgr.getString("hostname", "General");
networking.getMasterClient()->SetHostname(hostname);
networking.getMasterClient()->SetRuleString("CommitHash", version.mCommitHash.substr(0, 10));
networking.getMasterClient()->Start(); masterClient->SetMaxPlayers((unsigned) players);
masterClient->SetUpdateRate((unsigned) updateRate);
string hostname = mgr.getString("hostname", "General");
masterClient->SetHostname(hostname);
masterClient->SetRuleString("CommitHash", version.mCommitHash.substr(0, 10));
masterClient->Start();
} }
networking.postInit(); networking.postInit();
@ -303,11 +337,11 @@ int main(int argc, char *argv[])
code = networking.mainLoop(); code = networking.mainLoop();
networking.getMasterClient()->Stop(); networking.getMasterClient()->Stop();
Script::Free();
} }
catch (std::exception &e) catch (std::exception &e)
{ {
LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, e.what()); LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, e.what());
Script::Call<Script::CallbackIdentity("OnServerScriptCrash")>(e.what());
throw; //fall through throw; //fall through
} }

View file

@ -31,7 +31,7 @@ bool ActorProcessor::Process(RakNet::Packet &packet, BaseActorList &actorList) n
if (!processor.second->avoidReading) if (!processor.second->avoidReading)
myPacket->Read(); myPacket->Read();
if (actorList.isValid) if (actorList.isValid) // -V547
processor.second->Do(*myPacket, *player, actorList); processor.second->Do(*myPacket, *player, actorList);
else else
LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, "Received %s that failed integrity check and was ignored!", processor.second->strPacketID.c_str()); LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, "Received %s that failed integrity check and was ignored!", processor.second->strPacketID.c_str());

View file

@ -31,7 +31,7 @@ bool ObjectProcessor::Process(RakNet::Packet &packet, BaseObjectList &objectList
if (!processor.second->avoidReading) if (!processor.second->avoidReading)
myPacket->Read(); myPacket->Read();
if (objectList.isValid) if (objectList.isValid) // -V547 (PVS Studio false-positive warning)
processor.second->Do(*myPacket, *player, objectList); processor.second->Do(*myPacket, *player, objectList);
else else
LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, "Received %s that failed integrity check and was ignored!", processor.second->strPacketID.c_str()); LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, "Received %s that failed integrity check and was ignored!", processor.second->strPacketID.c_str());

View file

@ -28,7 +28,7 @@ bool WorldstateProcessor::Process(RakNet::Packet &packet, BaseWorldstate &worlds
if (!processor.second->avoidReading) if (!processor.second->avoidReading)
myPacket->Read(); myPacket->Read();
if (worldstate.isValid) if (worldstate.isValid) // -V547 (PVS Studio false-positive warning)
processor.second->Do(*myPacket, *player, worldstate); processor.second->Do(*myPacket, *player, worldstate);
else else
LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, "Received %s that failed integrity check and was ignored!", processor.second->strPacketID.c_str()); LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, "Received %s that failed integrity check and was ignored!", processor.second->strPacketID.c_str());

View file

@ -1,3 +1,7 @@
//
// Created by koncord on 31.03.17.
//
#ifndef OPENMW_PROCESSORPLAYERPOSITION_HPP #ifndef OPENMW_PROCESSORPLAYERPOSITION_HPP
#define OPENMW_PROCESSORPLAYERPOSITION_HPP #define OPENMW_PROCESSORPLAYERPOSITION_HPP
@ -14,9 +18,13 @@ namespace mwmp
} }
void Do(PlayerPacket &packet, Player &player) override void Do(PlayerPacket &packet, Player &player) override
{
//DEBUG_PRINTF(strPacketID);
if (!player.creatureStats.mDead)
{ {
player.sendToLoaded(&packet); player.sendToLoaded(&packet);
} }
}
}; };
} }

View file

@ -134,7 +134,7 @@ add_openmw_dir (mwmp/processors/object BaseObjectProcessor
ProcessorScriptGlobalFloat ProcessorScriptGlobalFloat
) )
add_openmw_dir (mwmp/processors/worldstate ProcessorCellCreate ProcessorCellReset ProcessorRecordDynamic add_openmw_dir (mwmp/processors/worldstate ProcessorCellCreate ProcessorCellReplace ProcessorRecordDynamic
ProcessorWorldCollisionOverride ProcessorWorldMap ProcessorWorldRegionAuthority ProcessorWorldTime ProcessorWorldCollisionOverride ProcessorWorldMap ProcessorWorldRegionAuthority ProcessorWorldTime
ProcessorWorldWeather ProcessorWorldWeather
) )
@ -265,3 +265,10 @@ endif (MSVC)
if (WIN32) if (WIN32)
INSTALL(TARGETS tes3mp RUNTIME DESTINATION ".") INSTALL(TARGETS tes3mp RUNTIME DESTINATION ".")
endif (WIN32) endif (WIN32)
if (ENABLE_PVS)
pvs_studio_add_target(TARGET tes3mp.analyze ALL
OUTPUT FORMAT errorfile
ANALYZE tes3mp
LOG target_tes3mp.err)
endif()

View file

@ -221,11 +221,10 @@ bool parseOptions (int argc, char** argv, OMW::Engine& engine, Files::Configurat
/* /*
Start of tes3mp addition Start of tes3mp addition
Check for unmodified tes3mp-credits file on Windows; this makes it so people can't repackage official Check for unmodified tes3mp-credits file; this makes it so people can't repackage official releases with
releases with their own made-up credits, though it obviously has no bearing on unofficial releases that their own made-up credits, though it obviously has no bearing on unofficial releases that change
change the checksum below the checksum below
*/ */
#ifdef _WIN32
boost::filesystem::path folderPath(boost::filesystem::initial_path<boost::filesystem::path>()); boost::filesystem::path folderPath(boost::filesystem::initial_path<boost::filesystem::path>());
folderPath = boost::filesystem::system_complete(boost::filesystem::path(argv[0])).remove_filename(); folderPath = boost::filesystem::system_complete(boost::filesystem::path(argv[0])).remove_filename();
std::string creditsPath = folderPath.string() + "/tes3mp-credits"; std::string creditsPath = folderPath.string() + "/tes3mp-credits";
@ -243,7 +242,6 @@ bool parseOptions (int argc, char** argv, OMW::Engine& engine, Files::Configurat
SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "tes3mp", TES3MP_CREDITS_ERROR, 0); SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "tes3mp", TES3MP_CREDITS_ERROR, 0);
return false; return false;
} }
#endif
/* /*
End of tes3mp addition End of tes3mp addition
*/ */

View file

@ -553,10 +553,9 @@ namespace MWClass
/* /*
Start of tes3mp addition Start of tes3mp addition
If the attacker was the LocalPlayer or LocalActor, record their target and send a If the attacker was the LocalPlayer or LocalActor, record their target and send a packet with it
packet with it
If the victim was a LocalActor who died, record their attacker as the killer If the victim was a LocalActor who died, record their attacker as the deathReason
*/ */
mwmp::Attack *localAttack = MechanicsHelper::getLocalAttack(attacker); mwmp::Attack *localAttack = MechanicsHelper::getLocalAttack(attacker);

View file

@ -966,13 +966,12 @@ namespace MWClass
/* /*
Start of tes3mp addition Start of tes3mp addition
If the attacker was the LocalPlayer or LocalActor, record their target and send a If the attacker was the LocalPlayer or LocalActor, record their target and send a packet with it
packet with it
If the victim was the LocalPlayer, check whether packets should be sent about If the victim was the LocalPlayer, check whether packets should be sent about
their new dynamic stats and position their new dynamic stats and position
If the victim was a LocalActor who died, record their attacker as the killer If the victim was a LocalActor who died, record their attacker as the deathReason
*/ */
mwmp::Attack *localAttack = MechanicsHelper::getLocalAttack(attacker); mwmp::Attack *localAttack = MechanicsHelper::getLocalAttack(attacker);

View file

@ -458,15 +458,6 @@ namespace MWGui
updateMagicMarkers(); updateMagicMarkers();
updateCustomMarkers(); updateCustomMarkers();
/*
Start of tes3mp addition
Update player markers when cell changes to fix their locations
*/
updatePlayerMarkers();
/*
End of tes3mp addition
*/
} }
void LocalMapBase::requestMapRender(const MWWorld::CellStore *cell) void LocalMapBase::requestMapRender(const MWWorld::CellStore *cell)

View file

@ -9,19 +9,6 @@
#include <components/misc/rng.hpp> #include <components/misc/rng.hpp>
/*
Start of tes3mp addition
Include additional headers for multiplayer purposes
*/
#include "../mwmp/Main.hpp"
#include "../mwmp/Networking.hpp"
#include "../mwmp/LocalPlayer.hpp"
#include "../mwmp/MechanicsHelper.hpp"
/*
End of tes3mp addition
*/
#include "../mwbase/world.hpp" #include "../mwbase/world.hpp"
#include "../mwbase/environment.hpp" #include "../mwbase/environment.hpp"
#include "../mwbase/windowmanager.hpp" #include "../mwbase/windowmanager.hpp"
@ -176,26 +163,9 @@ void Recharge::onItemClicked(MyGUI::Widget *sender, const MWWorld::Ptr& item)
const ESM::Enchantment* enchantment = MWBase::Environment::get().getWorld()->getStore().get<ESM::Enchantment>().find( const ESM::Enchantment* enchantment = MWBase::Environment::get().getWorld()->getStore().get<ESM::Enchantment>().find(
item.getClass().getEnchantment(item)); item.getClass().getEnchantment(item));
/*
Start of tes3mp change (minor)
Send PlayerInventory packets that replace the original item with the new one
*/
mwmp::LocalPlayer *localPlayer = mwmp::Main::get().getLocalPlayer();
mwmp::Item removedItem = MechanicsHelper::getItem(item, 1);
item.getCellRef().setEnchantmentCharge( item.getCellRef().setEnchantmentCharge(
std::min(item.getCellRef().getEnchantmentCharge() + restored, static_cast<float>(enchantment->mData.mCharge))); std::min(item.getCellRef().getEnchantmentCharge() + restored, static_cast<float>(enchantment->mData.mCharge)));
mwmp::Item addedItem = MechanicsHelper::getItem(item, 1);
localPlayer->sendItemChange(addedItem, mwmp::InventoryChanges::ADD);
localPlayer->sendItemChange(removedItem, mwmp::InventoryChanges::REMOVE);
/*
End of tes3mp change (minor)
*/
MWBase::Environment::get().getWindowManager()->playSound("Enchant Success"); MWBase::Environment::get().getWindowManager()->playSound("Enchant Success");
player.getClass().getContainerStore(player).restack(item); player.getClass().getContainerStore(player).restack(item);

View file

@ -842,22 +842,6 @@ namespace MWMechanics
if (isDamageEffect) if (isDamageEffect)
{ {
/*
Start of tes3mp addition
If the victim was a LocalActor who died, record the caster as the killer
*/
if (mwmp::Main::get().getCellController()->isLocalActor(ptr))
{
bool isSuicide = ptr == caster || caster.isEmpty();
mwmp::Main::get().getCellController()->getLocalActor(ptr)->killer = isSuicide ?
MechanicsHelper::getTarget(ptr) : MechanicsHelper::getTarget(caster);
}
/*
End of tes3mp addition
*/
if (caster == player || playerFollowers.find(caster) != playerFollowers.end()) if (caster == player || playerFollowers.find(caster) != playerFollowers.end())
{ {
if (caster.getClass().getNpcStats(caster).isWerewolf()) if (caster.getClass().getNpcStats(caster).isWerewolf())

View file

@ -4,19 +4,6 @@
#include <components/misc/rng.hpp> #include <components/misc/rng.hpp>
/*
Start of tes3mp addition
Include additional headers for multiplayer purposes
*/
#include "../mwmp/Main.hpp"
#include "../mwmp/Networking.hpp"
#include "../mwmp/LocalPlayer.hpp"
#include "../mwmp/MechanicsHelper.hpp"
/*
End of tes3mp addition
*/
#include "../mwbase/world.hpp" #include "../mwbase/world.hpp"
#include "../mwbase/environment.hpp" #include "../mwbase/environment.hpp"
#include "../mwbase/mechanicsmanager.hpp" #include "../mwbase/mechanicsmanager.hpp"
@ -70,25 +57,8 @@ void Repair::repair(const MWWorld::Ptr &itemToRepair)
// repair by 'y' points // repair by 'y' points
int charge = itemToRepair.getClass().getItemHealth(itemToRepair); int charge = itemToRepair.getClass().getItemHealth(itemToRepair);
charge = std::min(charge + y, itemToRepair.getClass().getItemMaxHealth(itemToRepair)); charge = std::min(charge + y, itemToRepair.getClass().getItemMaxHealth(itemToRepair));
/*
Start of tes3mp change (minor)
Send PlayerInventory packets that replace the original item with the new one
*/
mwmp::LocalPlayer *localPlayer = mwmp::Main::get().getLocalPlayer();
mwmp::Item removedItem = MechanicsHelper::getItem(itemToRepair, 1);
itemToRepair.getCellRef().setCharge(charge); itemToRepair.getCellRef().setCharge(charge);
mwmp::Item addedItem = MechanicsHelper::getItem(itemToRepair, 1);
localPlayer->sendItemChange(addedItem, mwmp::InventoryChanges::ADD);
localPlayer->sendItemChange(removedItem, mwmp::InventoryChanges::REMOVE);
/*
End of tes3mp change (minor)
*/
// attempt to re-stack item, in case it was fully repaired // attempt to re-stack item, in case it was fully repaired
MWWorld::ContainerStoreIterator stacked = player.getClass().getContainerStore(player).restack(itemToRepair); MWWorld::ContainerStoreIterator stacked = player.getClass().getContainerStore(player).restack(itemToRepair);

View file

@ -537,7 +537,7 @@ namespace MWMechanics
/* /*
Start of tes3mp addition Start of tes3mp addition
If the victim was a LocalPlayer or LocalActor who died, record the caster as the killer If the victim was a LocalPlayer or LocalActor who died, record their attacker as the deathReason
*/ */
if (!wasDead && isDead) if (!wasDead && isDead)
{ {

View file

@ -82,10 +82,8 @@ void Cell::updateLocal(bool forceUpdate)
} }
else else
{ {
// Forcibly update this local actor if its data has never been sent before;
// otherwise, use the current forceUpdate value
if (actor->getPtr().getRefData().isEnabled()) if (actor->getPtr().getRefData().isEnabled())
actor->update(actor->hasSentData ? forceUpdate : true); actor->update(forceUpdate);
++it; ++it;
} }
@ -399,9 +397,6 @@ void Cell::readCellChange(ActorList& actorList)
void Cell::initializeLocalActor(const MWWorld::Ptr& ptr) void Cell::initializeLocalActor(const MWWorld::Ptr& ptr)
{ {
std::string mapIndex = Main::get().getCellController()->generateMapIndex(ptr);
LOG_APPEND(Log::LOG_VERBOSE, "- Initializing LocalActor %s in %s", mapIndex.c_str(), getDescription().c_str());
LocalActor *actor = new LocalActor(); LocalActor *actor = new LocalActor();
actor->cell = *store->getCell(); actor->cell = *store->getCell();
actor->setPtr(ptr); actor->setPtr(ptr);
@ -411,17 +406,16 @@ void Cell::initializeLocalActor(const MWWorld::Ptr& ptr)
if (ptr.getClass().getCreatureStats(ptr).isDead()) if (ptr.getClass().getCreatureStats(ptr).isDead())
actor->wasDead = true; actor->wasDead = true;
std::string mapIndex = Main::get().getCellController()->generateMapIndex(ptr);
localActors[mapIndex] = actor; localActors[mapIndex] = actor;
Main::get().getCellController()->setLocalActorRecord(mapIndex, getDescription()); Main::get().getCellController()->setLocalActorRecord(mapIndex, getDescription());
LOG_APPEND(Log::LOG_VERBOSE, "- Successfully initialized LocalActor %s in %s", mapIndex.c_str(), getDescription().c_str()); LOG_APPEND(Log::LOG_VERBOSE, "- Initialized LocalActor %s in %s", mapIndex.c_str(), getDescription().c_str());
} }
void Cell::initializeLocalActors() void Cell::initializeLocalActors()
{ {
LOG_MESSAGE_SIMPLE(Log::LOG_VERBOSE, "Initializing LocalActors in %s", getDescription().c_str());
for (const auto &mergedRef : store->getMergedRefs()) for (const auto &mergedRef : store->getMergedRefs())
{ {
if (mergedRef->mClass->isActor()) if (mergedRef->mClass->isActor())
@ -438,24 +432,20 @@ void Cell::initializeLocalActors()
initializeLocalActor(ptr); initializeLocalActor(ptr);
} }
} }
LOG_APPEND(Log::LOG_VERBOSE, "- Successfully initialized LocalActors in %s", getDescription().c_str());
} }
void Cell::initializeDedicatedActor(const MWWorld::Ptr& ptr) void Cell::initializeDedicatedActor(const MWWorld::Ptr& ptr)
{ {
std::string mapIndex = Main::get().getCellController()->generateMapIndex(ptr);
LOG_APPEND(Log::LOG_VERBOSE, "- Initializing DedicatedActor %s in %s", mapIndex.c_str(), getDescription().c_str());
DedicatedActor *actor = new DedicatedActor(); DedicatedActor *actor = new DedicatedActor();
actor->cell = *store->getCell(); actor->cell = *store->getCell();
actor->setPtr(ptr); actor->setPtr(ptr);
std::string mapIndex = Main::get().getCellController()->generateMapIndex(ptr);
dedicatedActors[mapIndex] = actor; dedicatedActors[mapIndex] = actor;
Main::get().getCellController()->setDedicatedActorRecord(mapIndex, getDescription()); Main::get().getCellController()->setDedicatedActorRecord(mapIndex, getDescription());
LOG_APPEND(Log::LOG_VERBOSE, "- Successfully initialized DedicatedActor %s in %s", mapIndex.c_str(), getDescription().c_str()); LOG_APPEND(Log::LOG_VERBOSE, "- Initialized DedicatedActor %s in %s", mapIndex.c_str(), getDescription().c_str());
} }
void Cell::initializeDedicatedActors(ActorList& actorList) void Cell::initializeDedicatedActors(ActorList& actorList)

View file

@ -77,8 +77,6 @@ void CellController::initializeCell(const ESM::Cell& cell)
// If this key doesn't exist, create it // If this key doesn't exist, create it
if (cellsInitialized.count(mapIndex) == 0) if (cellsInitialized.count(mapIndex) == 0)
{ {
LOG_MESSAGE_SIMPLE(Log::LOG_INFO, "Initializing mwmp::Cell %s", cell.getDescription().c_str());
MWWorld::CellStore *cellStore = getCellStore(cell); MWWorld::CellStore *cellStore = getCellStore(cell);
if (!cellStore) return; if (!cellStore) return;
@ -86,7 +84,7 @@ void CellController::initializeCell(const ESM::Cell& cell)
mwmp::Cell *mpCell = new mwmp::Cell(cellStore); mwmp::Cell *mpCell = new mwmp::Cell(cellStore);
cellsInitialized[mapIndex] = mpCell; cellsInitialized[mapIndex] = mpCell;
LOG_APPEND(Log::LOG_VERBOSE, "- Successfully initialized mwmp::Cell %s", cell.getDescription().c_str()); LOG_MESSAGE_SIMPLE(Log::LOG_INFO, "- Initialized mwmp::Cell %s", mpCell->getDescription().c_str());
} }
} }

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