Compare commits

..

20 Commits

Author SHA1 Message Date
Koncord 4225cbae02 [General] Add comments to false-positive PVS messages 5 years ago
Koncord 5282541d3a [General] Add ENABLE_PVS option to CMake 5 years ago
Koncord 9b6bdf3ae8 [General] Fix minor warnings found by PVS 5 years ago
Koncord 6b3b5cdab4 [General] Fix warnings and errors found by PVS Studio in Server 5 years ago
Koncord 1248741da6 [General] Add PVS Studio macros 5 years ago
Koncord 796717bab0 [General] Update LuaBridge to 3154e94487dedc84f038c5787985ddc01a95d126 5 years ago
Koncord af228c0539 [Server] Fix mono_free_method(NULL) error 5 years ago
Koncord 9d58b2459d [Server] Fix GCC 8 build 5 years ago
Koncord 30eaabb7ce [Server] Do not export all symbols 5 years ago
Koncord e766c6fb01 [Server] Fix order of CDECL 5 years ago
Koncord 7bbf81b74d [Server] Fix rebase conflicts 5 years ago
Koncord 10d7e68dd5 [Server] Add Windows support for Mono API 5 years ago
Koncord fba99071f8 [Server] Fix warnings 5 years ago
Koncord 20b328ec67 [Server] Mark Mono headers as SYSTEM 5 years ago
Koncord 447a0ee8b2 [Server] Implement Public API for Mono 5 years ago
Koncord 6cbf6f05a1 [Server] Add --debug option to launch options.
Add Soft-Mode Debugger for Mono.
5 years ago
Koncord f37c252dbe [Server] Add timers support to Mono 5 years ago
Koncord 4601884931 [Server] Properly load Mono libraries 5 years ago
Koncord c36b692e91 [Server] Trait all API functions as "extern C"
Move Timer & Public functions to Script/Functions
5 years ago
Koncord 5840c7bba2 [Server] Init mono branch 5 years ago

@ -4,7 +4,7 @@ os:
osx_image: xcode9.4
language: cpp
sudo: required
dist: xenial
dist: trusty
branches:
only:
- master
@ -15,18 +15,18 @@ env:
global:
# The next declaration is the encrypted COVERITY_SCAN_TOKEN, created
# 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:
apt:
sources:
- sourceline: 'ppa:openmw/openmw'
- sourceline: 'ppa:rakhimov/boost'
- ubuntu-toolchain-r-test
- llvm-toolchain-precise-3.8
packages: [
# Dev
cmake, clang-6.0, libunshield-dev, libtinyxml-dev,
g++-8,
cmake, clang-3.8, libunshield-dev, libtinyxml-dev,
g++-6,
# Tests
libgtest-dev, google-mock,
# Boost
@ -45,7 +45,7 @@ addons:
project:
name: "TES3MP/openmw-tes3mp"
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: "make -j3"
branch_pattern: coverity_scan
@ -53,21 +53,21 @@ matrix:
include:
- os: linux
env:
- ANALYZE="scan-build-6.0 --use-cc clang-6.0 --use-c++ clang++-6.0 "
- MATRIX_CC="CC=clang-6.0 && CXX=clang++-6.0"
- ANALYZE="scan-build-3.8 --use-cc clang-3.8 --use-c++ clang++-3.8 "
- MATRIX_CC="CC=clang-3.8 && CXX=clang++-3.8"
compiler: clang
- os: linux
env:
- MATRIX_CC="CC=gcc-8 && CXX=g++-8"
- MATRIX_CC="CC=gcc-6 && CXX=g++-6"
- os: linux
env:
- MATRIX_CC="CC=clang-6.0 && CXX=clang++-6.0"
- MATRIX_CC="CC=clang-3.8 && CXX=clang++-3.8"
allow_failures:
- env:
- MATRIX_CC="CC=clang-6.0 && CXX=clang++-6.0"
- MATRIX_CC="CC=clang-3.8 && CXX=clang++-3.8"
- env:
- ANALYZE="scan-build-6.0 --use-cc clang-6.0 --use-c++ clang++-6.0 "
- MATRIX_CC="CC=clang-6.0 && CXX=clang++-6.0"
- ANALYZE="scan-build-3.8 --use-cc clang-3.8 --use-c++ clang++-3.8 "
- MATRIX_CC="CC=clang-3.8 && CXX=clang++-3.8"
before_install:
- ./CI/before_install.${TRAVIS_OS_NAME}.sh

@ -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
cd ~/
git clone https://github.com/TES3MP/CrabNet
cd CrabNet
cmake . -DCRABNET_ENABLE_DLL=OFF -DCRABNET_ENABLE_SAMPLES=OFF -DCMAKE_BUILD_TYPE=Release
git clone https://github.com/TES3MP/RakNet
cd RakNet
cmake . -DRAKNET_ENABLE_DLL=OFF -DRAKNET_ENABLE_SAMPLES=OFF -DCMAKE_BUILD_TYPE=Release
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

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

@ -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_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)
set(USE_QT FALSE)
else()
@ -79,6 +81,8 @@ endif(EXISTS ${PROJECT_SOURCE_DIR}/.git)
# Macros
include(OpenMWMacros)
include(PVS-Studio.cmake)
# doxygen main page
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
if (BUILD_OPENMW_MP)
add_subdirectory (extern/LuaBridge)
add_subdirectory( apps/openmw-mp )
endif()

@ -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()

@ -2,7 +2,7 @@ TES3MP
======
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)
@ -15,7 +15,7 @@ TES3MP is a project adding multiplayer functionality to [OpenMW](https://github.
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)
Project status
Project Status
--------------
[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.
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
---------------
--------------
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.
Getting started
Getting Started
---------------
* [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/)
* [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)
* [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).

@ -25,13 +25,28 @@ if(BUILD_WITH_LUA)
set(LuaScript_Sources
Script/LangLua/LangLua.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)
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)
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
Script/LangNative/LangNative.cpp
)
@ -60,11 +75,12 @@ set(SERVER
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/Spells.cpp Script/Functions/Stats.cpp Script/Functions/Timer.cpp
Script/Functions/Public.cpp
Script/API/TimerAPI.cpp Script/API/PublicFnAPI.cpp
${LuaScript_Sources}
${NativeScript_Sources}
${MonoScript_Sources}
)
set(SERVER_HEADER
@ -73,6 +89,7 @@ set(SERVER_HEADER
Script/ScriptFunctions.hpp Script/API/TimerAPI.hpp Script/API/PublicFnAPI.hpp
${LuaScript_Headers}
${NativeScript_Headers}
${MonoScript_Headers}
)
source_group(tes3mp-server FILES ${SERVER} ${SERVER_HEADER})
@ -165,10 +182,6 @@ set_target_properties(tes3mp-server PROPERTIES
CXX_EXTENSIONS YES
)
if (UNIX)
target_compile_options(tes3mp-server PRIVATE -Wno-ignored-qualifiers)
endif()
target_link_libraries(tes3mp-server
#${Boost_SYSTEM_LIBRARY}
#${Boost_THREAD_LIBRARY}
@ -177,13 +190,19 @@ target_link_libraries(tes3mp-server
${RakNet_LIBRARY}
components
${LuaJit_LIBRARIES}
${MONO_LIBRARY}
${Breakpad_Library}
)
if (BUILD_WITH_LUA)
target_link_libraries(tes3mp-server LuaBridge)
endif()
if (UNIX)
target_link_libraries(tes3mp-server dl)
# Fix for not visible pthreads functions for linker with glibc 2.15
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})
endif(NOT APPLE)
endif(UNIX)
@ -200,3 +219,10 @@ if (MSVC)
endif (CMAKE_CL_64)
add_definitions("-D_USE_MATH_DEFINES")
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()

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

@ -64,7 +64,7 @@ Cell *CellController::getCellByXY(int x, int y)
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)
{
@ -80,7 +80,7 @@ Cell *CellController::getCellByName(std::string cellName)
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());
auto it = find_if(cells.begin(), cells.end(), [cellData](const Cell *c) {

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

@ -51,7 +51,7 @@ void MasterClient::SetMaxPlayers(unsigned pl)
mutexData.unlock();
}
void MasterClient::SetHostname(std::string hostname)
void MasterClient::SetHostname(const std::string &hostname)
{
mutexData.lock();
string substr = hostname.substr(0, 200);
@ -63,7 +63,7 @@ void MasterClient::SetHostname(std::string hostname)
mutexData.unlock();
}
void MasterClient::SetModname(std::string modname)
void MasterClient::SetModname(const std::string &modname)
{
mutexData.lock();
string substr = modname.substr(0, 200);
@ -75,7 +75,7 @@ void MasterClient::SetModname(std::string modname)
mutexData.unlock();
}
void MasterClient::SetRuleString(std::string key, std::string value)
void MasterClient::SetRuleString(const std::string &key, std::string value)
{
mutexData.lock();
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();
}
void MasterClient::SetRuleValue(std::string key, double value)
void MasterClient::SetRuleValue(const std::string &key, double value)
{
mutexData.lock();
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();
}
void MasterClient::PushPlugin(Plugin plugin)
void MasterClient::PushPlugin(const Plugin &plugin)
{
mutexData.lock();
queryData.plugins.push_back(plugin);
@ -208,7 +208,7 @@ void MasterClient::Thread()
}
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)
{
@ -258,5 +258,6 @@ void MasterClient::SetUpdateRate(unsigned int rate)
timeout = min_rate;
else if (timeout > max_rate)
timeout = max_rate;
timeout = rate;
else
timeout = rate;
}

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

@ -75,9 +75,9 @@ Networking::~Networking()
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
@ -98,32 +98,25 @@ void Networking::processPlayerPacket(RakNet::Packet *packet)
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);
return;
}
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);
return;
}
if (player->serverPassword != serverPassword)
if (player->passw != serverPassword)
{
if (isPassworded())
{
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);
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());
}
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());
kickPlayer(player->guid);
return;
}
player->setHandshake();
return;
@ -132,8 +125,9 @@ void Networking::processPlayerPacket(RakNet::Packet *packet)
if (!player->isHandshaked())
{
player->incrementHandshakeAttempts();
LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Have not completed handshake with client at %s", packet->systemAddress.ToString());
LOG_APPEND(Log::LOG_WARN, "- Attempts so far: %i", player->getHandshakeAttempts());
LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Have not completed handshake with player %d", player->getId());
LOG_MESSAGE_SIMPLE(Log::LOG_WARN, "Attempts so far: %i", player->getHandshakeAttempts());
if (player->getHandshakeAttempts() > 20)
kickPlayer(player->guid, false);
@ -245,7 +239,7 @@ bool Networking::preInit(RakNet::Packet *packet, RakNet::BitStream &bsIn)
auto plugin = plugins.begin();
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());
// 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]);
}
void Networking::newPlayer(RakNet::RakNetGUID guid)
void Networking::newPlayer(const RakNet::RakNetGUID &guid)
{
playerPacketController->GetPacket(ID_PLAYER_BASEINFO)->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);
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 (pl->first == guid) continue;
if (player.first == guid) continue;
// 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
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
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_STATS_DYNAMIC)->setPlayer(pl->second);
playerPacketController->GetPacket(ID_PLAYER_ATTRIBUTE)->setPlayer(pl->second);
playerPacketController->GetPacket(ID_PLAYER_SKILL)->setPlayer(pl->second);
playerPacketController->GetPacket(ID_PLAYER_POSITION)->setPlayer(pl->second);
playerPacketController->GetPacket(ID_PLAYER_CELL_CHANGE)->setPlayer(pl->second);
playerPacketController->GetPacket(ID_PLAYER_EQUIPMENT)->setPlayer(pl->second);
playerPacketController->GetPacket(ID_PLAYER_BASEINFO)->setPlayer(player.second);
playerPacketController->GetPacket(ID_PLAYER_STATS_DYNAMIC)->setPlayer(player.second);
playerPacketController->GetPacket(ID_PLAYER_ATTRIBUTE)->setPlayer(player.second);
playerPacketController->GetPacket(ID_PLAYER_SKILL)->setPlayer(player.second);
playerPacketController->GetPacket(ID_PLAYER_POSITION)->setPlayer(player.second);
playerPacketController->GetPacket(ID_PLAYER_CELL_CHANGE)->setPlayer(player.second);
playerPacketController->GetPacket(ID_PLAYER_EQUIPMENT)->setPlayer(player.second);
playerPacketController->GetPacket(ID_PLAYER_BASEINFO)->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);
if (!player)
@ -458,7 +452,7 @@ Networking *Networking::getPtr()
return sThis;
}
RakNet::SystemAddress Networking::getSystemAddress(RakNet::RakNetGUID guid)
RakNet::SystemAddress Networking::getSystemAddress(const RakNet::RakNetGUID &guid)
{
return peer->GetSystemAddressFromGuid(guid);
}
@ -538,7 +532,7 @@ int Networking::mainLoop()
return exitCode;
}
void Networking::kickPlayer(RakNet::RakNetGUID guid, bool sendNotification)
void Networking::kickPlayer(const RakNet::RakNetGUID &guid, bool sendNotification)
{
peer->CloseConnection(guid, sendNotification);
}
@ -563,7 +557,7 @@ unsigned int Networking::maxConnections() const
return peer->GetMaximumIncomingConnections();
}
int Networking::getAvgPing(RakNet::AddressOrGUID addr) const
int Networking::getAvgPing(const RakNet::AddressOrGUID &addr) const
{
return peer->GetAveragePing(addr);
}
@ -578,15 +572,15 @@ MasterClient *Networking::getMasterClient()
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);
}
void Networking::postInit()
{
Script::Call<Script::CallbackIdentity("OnRequestDataFileList")>();
Script::Call<Script::CallbackIdentity("OnServerPostInit")>();
Script::Call<Script::CallbackIdentity("OnRequestPluginList")>();
}
PacketPreInit::PluginContainer &Networking::getSamples()

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

@ -10,7 +10,7 @@ TSlots Players::slots;
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);
@ -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);
@ -41,7 +41,7 @@ void Players::newPlayer(RakNet::RakNetGUID guid)
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);
@ -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);
if (it == players.end())
@ -70,7 +70,7 @@ unsigned short Players::getLastPlayerId()
return slots.rbegin()->first;
}
Player::Player(RakNet::RakNetGUID guid) : BasePlayer(guid)
Player::Player(const RakNet::RakNetGUID &guid) : BasePlayer(guid), id(InvalidID)
{
handshakeCounter = 0;
loadState = NOTLOADED;
@ -81,7 +81,7 @@ Player::~Player()
}
unsigned short Player::getId()
unsigned int Player::getId()
{
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();
}

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

@ -19,11 +19,21 @@ Public::Public(ScriptFunc _public, const std::string &name, char ret_type, const
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, lua, ret_type, def)
{
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)
{
@ -45,6 +55,15 @@ const std::string &Public::GetDefinition(const std::string &name)
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)
{
@ -61,7 +80,7 @@ bool Public::IsLua(const std::string &name)
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;
delete _public;

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

@ -1,3 +1,7 @@
//
// Created by koncord on 15.03.16.
//
#include "TimerAPI.hpp"
#include <chrono>
@ -6,25 +10,34 @@
using namespace mwmp;
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;
this->args = args;
isEnded = true;
end = true;
}
#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;
this->args = args;
isEnded = true;
end = 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
void Timer::Tick()
{
if (isEnded)
if (end)
return;
const auto duration = chrono::system_clock::now().time_since_epoch();
@ -32,19 +45,19 @@ void Timer::Tick()
if (time - startTime >= targetMsec)
{
isEnded = true;
end = true;
Call(args);
}
}
bool Timer::IsEnded()
bool Timer::IsEnd()
{
return isEnded;
return end;
}
void Timer::Stop()
{
isEnded = true;
end = true;
}
void Timer::Restart(int msec)
@ -55,7 +68,7 @@ void Timer::Restart(int msec)
void Timer::Start()
{
isEnded = false;
end = false;
const auto duration = chrono::system_clock::now().time_since_epoch();
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
#if defined(ENABLE_MONO)
int TimerAPI::CreateTimerMono(MonoObject *callback, long msec, const std::string& def, std::vector<boost::any> args)
{
int id = -1;
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, std::vector<boost::any> args)
int TimerAPI::CreateTimer(ScriptFunc callback, long msec, const std::string &def, const std::vector<boost::any> &args)
{
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;
try
{
ret = timers.at(timerid)->IsEnded();
ret = timers.at(timerid)->IsEnd();
}
catch(...)
{

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

@ -20,25 +20,25 @@ const BaseActor emptyActor = {};
static std::string tempCellDescription;
void ActorFunctions::ReadReceivedActorList() noexcept
extern "C" void ActorFunctions::ReadReceivedActorList() noexcept
{
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);
Cell *serverCell = CellController::get()->getCell(&esmCell);
readActorList = serverCell->getActorList();
}
void ActorFunctions::ClearActorList() noexcept
extern "C" void ActorFunctions::ClearActorList() noexcept
{
writeActorList.cell.blank();
writeActorList.baseActors.clear();
}
void ActorFunctions::SetActorListPid(unsigned short pid) noexcept
extern "C" void ActorFunctions::SetActorListPid(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, );
@ -46,143 +46,143 @@ void ActorFunctions::SetActorListPid(unsigned short pid) noexcept
writeActorList.guid = player->guid;
}
void ActorFunctions::CopyReceivedActorListToStore() noexcept
extern "C" void ActorFunctions::CopyReceivedActorListToStore() noexcept
{
writeActorList = *readActorList;
}
unsigned int ActorFunctions::GetActorListSize() noexcept
extern "C" unsigned int ActorFunctions::GetActorListSize() noexcept
{
return readActorList->count;
}
unsigned char ActorFunctions::GetActorListAction() noexcept
extern "C" unsigned char ActorFunctions::GetActorListAction() noexcept
{
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();
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();
}
unsigned int ActorFunctions::GetActorRefNum(unsigned int index) noexcept
extern "C" unsigned int ActorFunctions::GetActorRefNum(unsigned int index) noexcept
{
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;
}
double ActorFunctions::GetActorPosX(unsigned int index) noexcept
extern "C" double ActorFunctions::GetActorPosX(unsigned int index) noexcept
{
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];
}
double ActorFunctions::GetActorPosZ(unsigned int index) noexcept
extern "C" double ActorFunctions::GetActorPosZ(unsigned int index) noexcept
{
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];
}
double ActorFunctions::GetActorRotY(unsigned int index) noexcept
extern "C" double ActorFunctions::GetActorRotY(unsigned int index) noexcept
{
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];
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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();
}
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;
}
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;
}
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;
}
bool ActorFunctions::DoesActorHavePlayerKiller(unsigned int index) noexcept
extern "C" bool ActorFunctions::DoesActorHavePlayerKiller(unsigned int index) noexcept
{
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);
@ -192,136 +192,136 @@ int ActorFunctions::GetActorKillerPid(unsigned int index) noexcept
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();
}
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;
}
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;
}
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();
}
bool ActorFunctions::DoesActorHavePosition(unsigned int index) noexcept
extern "C" bool ActorFunctions::DoesActorHavePosition(unsigned int index) noexcept
{
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;
}
void ActorFunctions::SetActorListCell(const char* cellDescription) noexcept
extern "C" void ActorFunctions::SetActorListCell(const char* cellDescription) noexcept
{
writeActorList.cell = Utils::getCellFromDescription(cellDescription);
}
void ActorFunctions::SetActorListAction(unsigned char action) noexcept
extern "C" void ActorFunctions::SetActorListAction(unsigned char action) noexcept
{
writeActorList.action = action;
}
void ActorFunctions::SetActorCell(const char* cellDescription) noexcept
extern "C" void ActorFunctions::SetActorCell(const char* cellDescription) noexcept
{
tempActor.cell = Utils::getCellFromDescription(cellDescription);
}
void ActorFunctions::SetActorRefId(const char* refId) noexcept
extern "C" void ActorFunctions::SetActorRefId(const char* refId) noexcept
{
tempActor.refId = refId;
}
void ActorFunctions::SetActorRefNum(int refNum) noexcept
extern "C" void ActorFunctions::SetActorRefNum(int refNum) noexcept
{
tempActor.refNum = refNum;
}
void ActorFunctions::SetActorMpNum(int mpNum) noexcept
extern "C" void ActorFunctions::SetActorMpNum(int mpNum) noexcept
{
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[1] = y;
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[1] = y;
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;
}
void ActorFunctions::SetActorHealthCurrent(double value) noexcept
extern "C" void ActorFunctions::SetActorHealthCurrent(double value) noexcept
{
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;
}
void ActorFunctions::SetActorMagickaBase(double value) noexcept
extern "C" void ActorFunctions::SetActorMagickaBase(double value) noexcept
{
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;
}
void ActorFunctions::SetActorMagickaModified(double value) noexcept
extern "C" void ActorFunctions::SetActorMagickaModified(double value) noexcept
{
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;
}
void ActorFunctions::SetActorFatigueCurrent(double value) noexcept
extern "C" void ActorFunctions::SetActorFatigueCurrent(double value) noexcept
{
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;
}
void ActorFunctions::SetActorSound(const char* sound) noexcept
extern "C" void ActorFunctions::SetActorSound(const char* sound) noexcept
{
tempActor.sound = sound;
}
void ActorFunctions::SetActorAIAction(unsigned int action) noexcept
extern "C" void ActorFunctions::SetActorAIAction(unsigned int action) noexcept
{
tempActor.aiAction = action;
}
void ActorFunctions::SetActorAITargetToPlayer(unsigned short pid) noexcept
extern "C" void ActorFunctions::SetActorAITargetToPlayer(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, );
@ -332,7 +332,7 @@ void ActorFunctions::SetActorAITargetToPlayer(unsigned short pid) noexcept
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.aiTarget.isPlayer = false;
@ -341,29 +341,29 @@ void ActorFunctions::SetActorAITargetToObject(int refNum, int mpNum) noexcept
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[1] = y;
tempActor.aiCoordinates.pos[2] = z;
}
void ActorFunctions::SetActorAIDistance(unsigned int distance) noexcept
extern "C" void ActorFunctions::SetActorAIDistance(unsigned int distance) noexcept
{
tempActor.aiDistance = distance;
}
void ActorFunctions::SetActorAIDuration(unsigned int duration) noexcept
extern "C" void ActorFunctions::SetActorAIDuration(unsigned int duration) noexcept
{
tempActor.aiDuration = duration;
}
void ActorFunctions::SetActorAIRepetition(bool shouldRepeat) noexcept
extern "C" void ActorFunctions::SetActorAIRepetition(bool shouldRepeat) noexcept
{
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].count = count;
@ -371,26 +371,26 @@ void ActorFunctions::EquipActorItem(unsigned short slot, const char *refId, unsi
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);
}
void ActorFunctions::AddActor() noexcept
extern "C" void ActorFunctions::AddActor() noexcept
{
writeActorList.baseActors.push_back(tempActor);
tempActor = emptyActor;
}
void ActorFunctions::SendActorList() noexcept
extern "C" void ActorFunctions::SendActorList() noexcept
{
mwmp::ActorPacket *actorPacket = mwmp::Networking::get().getActorPacketController()->GetPacket(ID_ACTOR_LIST);
actorPacket->setActorList(&writeActorList);
actorPacket->Send(writeActorList.guid);
}
void ActorFunctions::SendActorAuthority() noexcept
extern "C" void ActorFunctions::SendActorAuthority() noexcept
{
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);
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);
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);
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);
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);
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);
actorPacket->setActorList(&writeActorList);
@ -521,36 +521,35 @@ void ActorFunctions::SendActorCellChange(bool sendToOtherVisitors, bool skipAtta
}
}
// All methods below are deprecated versions of methods from above
extern "C" // All methods below are deprecated versions of methods from above
void ActorFunctions::ReadLastActorList() noexcept
{
ReadReceivedActorList();
}
void ActorFunctions::InitializeActorList(unsigned short pid) noexcept
extern "C" void ActorFunctions::InitializeActorList(unsigned short pid) noexcept
{
ClearActorList();
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);
}
unsigned int ActorFunctions::GetActorKillerRefNumIndex(unsigned int index) noexcept
extern "C" unsigned int ActorFunctions::GetActorKillerRefNumIndex(unsigned int index) noexcept
{
return GetActorKillerRefNum(index);
}
void ActorFunctions::SetActorRefNumIndex(int refNum) noexcept
extern "C" void ActorFunctions::SetActorRefNumIndex(int refNum) noexcept
{
tempActor.refNum = refNum;
}

@ -1,6 +1,8 @@
#ifndef OPENMW_ACTORAPI_HPP
#define OPENMW_ACTORAPI_HPP
#include <Script/Platform.hpp>
#define ACTORAPI \
{"ReadReceivedActorList", ActorFunctions::ReadReceivedActorList},\
{"ReadCellActorList", ActorFunctions::ReadCellActorList},\
@ -102,16 +104,14 @@
{"GetActorKillerRefNumIndex", ActorFunctions::GetActorKillerRefNumIndex},\
{"SetActorRefNumIndex", ActorFunctions::SetActorRefNumIndex}
class ActorFunctions
namespace ActorFunctions
{
public:
/**
* \brief Use the last actor list received by the server as the one being read.
*
* \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.
@ -122,14 +122,14 @@ public:
* \param cellDescription The description of the cell whose actor list should be read.
* \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.
*
* \return void
*/
static void ClearActorList() noexcept;
EXPORT_APIFUNCTION void CDECL ClearActorList() noexcept;
/**
* \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.
* \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
@ -146,21 +146,21 @@ public:
*
* \return void
*/
static void CopyReceivedActorListToStore() noexcept;
EXPORT_APIFUNCTION void CDECL CopyReceivedActorListToStore() noexcept;
/**
* \brief Get the number of indexes in the read actor list.
*
* \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.
*
* \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.
@ -168,7 +168,7 @@ public:
* \param index The index of the actor.
* \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.
@ -176,7 +176,7 @@ public:
* \param index The index of the actor.
* \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.
@ -184,7 +184,7 @@ public:
* \param index The index of the actor.
* \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.
@ -192,7 +192,7 @@ public:
* \param index The index of the actor.
* \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.
@ -200,7 +200,7 @@ public:
* \param index The index of the actor.
* \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.
@ -208,7 +208,7 @@ public:
* \param index The index of the actor.
* \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.
@ -216,7 +216,7 @@ public:
* \param index The index of the actor.
* \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.
@ -224,7 +224,7 @@ public:
* \param index The index of the actor.
* \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.
@ -232,7 +232,7 @@ public:
* \param index The index of the actor.
* \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.
@ -240,7 +240,7 @@ public:
* \param index The index of the actor.
* \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.
@ -248,7 +248,7 @@ public:
* \param index The index of the actor.
* \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.
@ -256,7 +256,7 @@ public:
* \param index The index of the actor.
* \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.
@ -264,7 +264,7 @@ public:
* \param index The index of the actor.
* \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.
@ -272,7 +272,7 @@ public:
* \param index The index of the actor.
* \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.
@ -280,7 +280,7 @@ public:
* \param index The index of the actor.
* \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.
@ -288,7 +288,7 @@ public:
* \param index The index of the actor.
* \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.
@ -296,7 +296,7 @@ public:
* \param index The index of the actor.
* \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.
@ -304,7 +304,7 @@ public:
* \param index The index of the actor.
* \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.
@ -312,7 +312,7 @@ public:
* \param index The index of the actor.
* \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
@ -322,7 +322,7 @@ public:
* \param slot The slot of the equipment item.
* \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
@ -332,7 +332,7 @@ public:
* \param slot The slot of the equipment item.
* \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
@ -342,7 +342,7 @@ public:
* \param slot The slot of the equipment item.
* \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
@ -352,7 +352,7 @@ public:
* \param slot The slot of the equipment item.
* \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.
@ -360,7 +360,7 @@ public:
* \param index The index of the actor.
* \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.
@ -368,7 +368,7 @@ public:
* \param index The index of the actor.
* \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.
@ -376,7 +376,7 @@ public:
* \param index The index of the actor.
* \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.
@ -384,7 +384,7 @@ public:
* \param index The index of the actor.
* \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.
@ -392,7 +392,7 @@ public:
* \param index The index of the actor.
* \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.
@ -400,7 +400,7 @@ public:
* \param index The index of the actor.
* \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
@ -411,7 +411,7 @@ public:
* \param index The index of the actor.
* \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
@ -422,7 +422,7 @@ public:
* \param index The index of the actor.
* \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.
@ -433,7 +433,7 @@ public:
* \param cellDescription The description of the cell.
* \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.
@ -441,7 +441,7 @@ public:
* \param action The action type (0 for SET, 1 for ADD, 2 for REMOVE, 3 for REQUEST).
* \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.
@ -455,7 +455,7 @@ public:
* \param cellDescription The description of the cell.
* \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.
@ -463,7 +463,7 @@ public:
* \param refId The refId.
* \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.
@ -471,7 +471,7 @@ public:
* \param refNum The refNum.
* \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.
@ -479,7 +479,7 @@ public:
* \param mpNum The mpNum.
* \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.
@ -489,7 +489,7 @@ public:
* \param z The Z position.
* \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.
@ -499,7 +499,7 @@ public:
* \param z The Z rotation.
* \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.
@ -507,7 +507,7 @@ public:
* \param value The new value.
* \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.
@ -515,7 +515,7 @@ public:
* \param value The new value.
* \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.
@ -523,7 +523,7 @@ public:
* \param value The new value.
* \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.
@ -531,7 +531,7 @@ public:
* \param value The new value.
* \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.
@ -539,7 +539,7 @@ public:
* \param value The new value.
* \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.
@ -547,7 +547,7 @@ public:
* \param value The new value.
* \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.
@ -555,7 +555,7 @@ public:
* \param value The new value.
* \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.
@ -563,7 +563,7 @@ public:
* \param value The new value.
* \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.
@ -571,7 +571,7 @@ public:
* \param value The new value.
* \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.
@ -579,7 +579,7 @@ public:
* \param sound The sound.
* \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.
@ -587,7 +587,7 @@ public:
* \param action The new action.
* \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.
@ -595,7 +595,7 @@ public:
* \param pid The player ID.
* \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.
@ -604,7 +604,7 @@ public:
* \param mpNum The mpNum of the target object.
* \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.
@ -614,7 +614,7 @@ public:
* \param z The Z coordinate.
* \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.
@ -622,7 +622,7 @@ public:
* \param duration The distance of the package.
* \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.
@ -630,7 +630,7 @@ public:
* \param duration The duration of the package.
* \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.
@ -640,7 +640,7 @@ public:
* \param shouldRepeat Whether the package should be repeated.
* \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
@ -653,7 +653,7 @@ public:
* \param enchantmentCharge The enchantment charge of the item.
* \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
@ -662,7 +662,7 @@ public:
* \param slot The equipment slot.
* \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.
@ -672,7 +672,7 @@ public:
*
* \return void
*/
static void AddActor() noexcept;
EXPORT_APIFUNCTION void CDECL AddActor() noexcept;
/**
* \brief Send an ActorList packet.
@ -681,7 +681,7 @@ public:
*
* \return void
*/
static void SendActorList() noexcept;
EXPORT_APIFUNCTION void CDECL SendActorList() noexcept;
/**
* \brief Send an ActorAuthority packet.
@ -693,7 +693,7 @@ public:
*
* \return void
*/
static void SendActorAuthority() noexcept;
EXPORT_APIFUNCTION void CDECL SendActorAuthority() noexcept;
/**
* \brief Send an ActorPosition packet.
@ -705,7 +705,7 @@ public:
*
* \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.
@ -717,7 +717,7 @@ public:
*
* \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.
@ -729,7 +729,7 @@ public:
*
* \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.
@ -740,7 +740,7 @@ public:
* to the packet (false by default).
* \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.
@ -751,7 +751,7 @@ public:
* to the packet (false by default).
* \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.
@ -763,18 +763,18 @@ public:
*
* \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
static void ReadLastActorList() noexcept;
static void InitializeActorList(unsigned short pid) noexcept;
static void CopyLastActorListToStore() noexcept;
static unsigned int GetActorRefNumIndex(unsigned int index) noexcept;
static unsigned int GetActorKillerRefNumIndex(unsigned int index) noexcept;
static void SetActorRefNumIndex(int refNum) noexcept;
};
EXPORT_APIFUNCTION void CDECL ReadLastActorList() noexcept;
EXPORT_APIFUNCTION void CDECL InitializeActorList(unsigned short pid) noexcept;
EXPORT_APIFUNCTION void CDECL CopyLastActorListToStore() noexcept;
EXPORT_APIFUNCTION unsigned int CDECL GetActorRefNumIndex(unsigned int index) noexcept;
EXPORT_APIFUNCTION unsigned int CDECL GetActorKillerRefNumIndex(unsigned int index) noexcept;
EXPORT_APIFUNCTION void CDECL SetActorRefNumIndex(int refNum) noexcept;
}
#endif //OPENMW_ACTORAPI_HPP

@ -7,7 +7,7 @@
using namespace mwmp;
void BookFunctions::ClearBookChanges(unsigned short pid) noexcept
extern "C" void BookFunctions::ClearBookChanges(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, );
@ -15,7 +15,7 @@ void BookFunctions::ClearBookChanges(unsigned short pid) noexcept
player->bookChanges.books.clear();
}
unsigned int BookFunctions::GetBookChangesSize(unsigned short pid) noexcept
extern "C" unsigned int BookFunctions::GetBookChangesSize(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, 0);
@ -23,7 +23,7 @@ unsigned int BookFunctions::GetBookChangesSize(unsigned short pid) noexcept
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;
GET_PLAYER(pid, player, );
@ -34,7 +34,7 @@ void BookFunctions::AddBook(unsigned short pid, const char* bookId) noexcept
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;
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();
}
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;
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
void BookFunctions::InitializeBookChanges(unsigned short pid) noexcept
extern "C" void BookFunctions::InitializeBookChanges(unsigned short pid) noexcept
{
ClearBookChanges(pid);
}

@ -1,6 +1,8 @@
#ifndef OPENMW_BOOKAPI_HPP
#define OPENMW_BOOKAPI_HPP
#include <Script/Platform.hpp>
#define BOOKAPI \
{"ClearBookChanges", BookFunctions::ClearBookChanges},\
\
@ -14,9 +16,8 @@
\
{"InitializeBookChanges", BookFunctions::InitializeBookChanges}
class BookFunctions
namespace BookFunctions
{
public:
/**
* \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.
* \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.
@ -34,7 +35,7 @@ public:
* \param pid The player ID whose book changes should be used.
* \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.
@ -43,7 +44,7 @@ public:
* \param bookId The bookId of the book.
* \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.
@ -52,7 +53,7 @@ public:
* \param index The index of the book.
* \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.
@ -64,12 +65,11 @@ public:
* to the packet (false by default).
* \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
static void InitializeBookChanges(unsigned short pid) noexcept;
};
EXPORT_APIFUNCTION void CDECL InitializeBookChanges(unsigned short pid) noexcept;
}
#endif //OPENMW_BOOKAPI_HPP

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

@ -3,6 +3,8 @@
#include "../Types.hpp"
#include <Script/Platform.hpp>
#define CELLAPI \
{"GetCellStateChangesSize", CellFunctions::GetCellStateChangesSize},\
\
@ -23,17 +25,15 @@
{"SendCell", CellFunctions::SendCell}
class CellFunctions
namespace CellFunctions
{
public:
/**
* \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.
* \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.
@ -42,7 +42,7 @@ public:
* \param index The index of the cell state.
* \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.
@ -51,7 +51,7 @@ public:
* \param index The index of the cell state.
* \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.
@ -59,7 +59,7 @@ public:
* \param pid The player ID.
* \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.
@ -67,7 +67,7 @@ public:
* \param pid The player ID.
* \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.
@ -75,7 +75,7 @@ public:
* \param pid The player ID.
* \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.
@ -83,7 +83,7 @@ public:
* \param pid The player ID.
* \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.
@ -93,7 +93,7 @@ public:
* \param pid The player ID.
* \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.
@ -101,7 +101,7 @@ public:
* \param pid The player ID.
* \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.
@ -116,7 +116,7 @@ public:
* \param cellDescription The cell description.
* \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.
@ -129,7 +129,7 @@ public:
* \param y The Y coordinate of the cell.
* \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.
@ -139,8 +139,7 @@ public:
* \param pid The player ID.
* \return void
*/
static void SendCell(unsigned short pid) noexcept;
};
EXPORT_APIFUNCTION void CDECL SendCell(unsigned short pid) noexcept;
}
#endif //OPENMW_CELLAPI_HPP

@ -12,7 +12,7 @@
using namespace std;
using namespace ESM;
const char *CharClassFunctions::GetDefaultClass(unsigned short pid) noexcept
extern "C" const char *CharClassFunctions::GetDefaultClass(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, "");
@ -20,7 +20,7 @@ const char *CharClassFunctions::GetDefaultClass(unsigned short pid) noexcept
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;
GET_PLAYER(pid, player, "");
@ -28,7 +28,7 @@ const char *CharClassFunctions::GetClassName(unsigned short pid) noexcept
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;
GET_PLAYER(pid, player, "");
@ -36,7 +36,7 @@ const char *CharClassFunctions::GetClassDesc(unsigned short pid) noexcept
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;
GET_PLAYER(pid, player, 0);
@ -47,7 +47,7 @@ int CharClassFunctions::GetClassMajorAttribute(unsigned short pid, unsigned char
return player->charClass.mData.mAttribute[slot];
}
int CharClassFunctions::GetClassSpecialization(unsigned short pid) noexcept
extern "C" int CharClassFunctions::GetClassSpecialization(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, 0);
@ -55,7 +55,7 @@ int CharClassFunctions::GetClassSpecialization(unsigned short pid) noexcept
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;
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];
}
int CharClassFunctions::GetClassMinorSkill(unsigned short pid, unsigned char slot) noexcept
extern "C" int CharClassFunctions::GetClassMinorSkill(unsigned short pid, unsigned char slot) noexcept
{
Player *player;
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];
}
int CharClassFunctions::IsClassDefault(unsigned short pid) noexcept
extern "C" int CharClassFunctions::IsClassDefault(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, 0);
@ -85,29 +85,32 @@ int CharClassFunctions::IsClassDefault(unsigned short pid) noexcept
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;
GET_PLAYER(pid, player,);
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;
GET_PLAYER(pid, player,);
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;
GET_PLAYER(pid, player,);
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;
GET_PLAYER(pid, player,);
@ -118,14 +121,16 @@ void CharClassFunctions::SetClassMajorAttribute(unsigned short pid, unsigned cha
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;
GET_PLAYER(pid, player,);
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;
GET_PLAYER(pid, player,);
@ -135,7 +140,8 @@ void CharClassFunctions::SetClassMajorSkill(unsigned short pid, unsigned char sl
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;
GET_PLAYER(pid, player,);
@ -146,7 +152,7 @@ void CharClassFunctions::SetClassMinorSkill(unsigned short pid, unsigned char sl
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;
GET_PLAYER(pid, player, );

@ -7,6 +7,8 @@
#include "../Types.hpp"
#include <Script/Platform.hpp>
#define CHARCLASSAPI \
{"GetDefaultClass", CharClassFunctions::GetDefaultClass},\
{"GetClassName", CharClassFunctions::GetClassName},\
@ -28,17 +30,15 @@
{"SendClass", CharClassFunctions::SendClass}
class CharClassFunctions
namespace CharClassFunctions
{
public:
/**
* \brief Get the default class used by a player.
*
* \param pid The player ID.
* \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.
@ -46,7 +46,7 @@ public:
* \param pid The player ID.
* \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.
@ -54,7 +54,7 @@ public:
* \param pid The player ID.
* \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.
@ -63,7 +63,7 @@ public:
* \param slot The slot of the major attribute (0 or 1).
* \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.
@ -71,7 +71,7 @@ public:
* \param pid The player ID.
* \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.
@ -80,7 +80,7 @@ public:
* \param slot The slot of the major skill (0 to 4).
* \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.
@ -89,7 +89,7 @@ public:
* \param slot The slot of the minor skill (0 to 4).
* \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.
@ -97,7 +97,7 @@ public:
* \param pid The player ID.
* \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.
@ -108,7 +108,7 @@ public:
* \param id The ID of the default class.
* \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.
@ -117,7 +117,7 @@ public:
* \param name The name of the custom class.
* \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.
@ -126,7 +126,7 @@ public:
* \param desc The description of the custom class.
* \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.
@ -136,7 +136,7 @@ public:
* \param attrId The ID to use for the attribute.
* \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.
@ -145,7 +145,7 @@ public:
* \param spec The specialization ID to use (0 for Combat, 1 for Magic, 2 for Stealth).
* \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.
@ -155,7 +155,7 @@ public:
* \param skillId The ID to use for the skill.
* \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.
@ -165,7 +165,7 @@ public:
* \param skillId The ID to use for the skill.
* \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.
@ -175,7 +175,7 @@ public:
* \param pid The player ID.
* \return void
*/
static void SendClass(unsigned short pid) noexcept;
};
EXPORT_APIFUNCTION void CDECL SendClass(unsigned short pid) noexcept;
}
#endif //OPENMW_CHARCLASSAPI_HPP

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

@ -3,15 +3,15 @@
#include "../Types.hpp"
#include <Script/Platform.hpp>
#define CHATAPI \
{"SendMessage", ChatFunctions::SendMessage},\
{"CleanChatForPid", ChatFunctions::CleanChat},\
{"CleanChat", ChatFunctions::CleanChatForPid}
class ChatFunctions
namespace ChatFunctions
{
public:
/**
* \brief Send a message to a certain player.
*
@ -23,7 +23,7 @@ public:
* to the packet (false by default).
* \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.
@ -31,14 +31,14 @@ public:
* \param pid The player ID.
* \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.
*
* \return void
*/
static void CleanChat();
};
EXPORT_APIFUNCTION void CDECL CleanChat();
}
#endif //OPENMW_CHATAPI_HPP

@ -7,7 +7,7 @@
using namespace mwmp;
void DialogueFunctions::ClearTopicChanges(unsigned short pid) noexcept
extern "C" void DialogueFunctions::ClearTopicChanges(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, );
@ -15,7 +15,7 @@ void DialogueFunctions::ClearTopicChanges(unsigned short pid) noexcept
player->topicChanges.topics.clear();
}
unsigned int DialogueFunctions::GetTopicChangesSize(unsigned short pid) noexcept
extern "C" unsigned int DialogueFunctions::GetTopicChangesSize(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, 0);
@ -23,7 +23,7 @@ unsigned int DialogueFunctions::GetTopicChangesSize(unsigned short pid) noexcept
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;
GET_PLAYER(pid, player, );
@ -34,7 +34,7 @@ void DialogueFunctions::AddTopic(unsigned short pid, const char* topicId) noexce
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;
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();
}
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;
GET_PLAYER(pid, player, );
@ -59,7 +59,7 @@ void DialogueFunctions::SendTopicChanges(unsigned short pid, bool sendToOtherPla
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;
GET_PLAYER(pid, player, );
@ -76,7 +76,7 @@ void DialogueFunctions::PlayAnimation(unsigned short pid, const char* groupname,
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;
GET_PLAYER(pid, player, );
@ -90,7 +90,7 @@ void DialogueFunctions::PlaySpeech(unsigned short pid, const char* sound) noexce
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
{

@ -1,6 +1,8 @@
#ifndef OPENMW_DIALOGUEAPI_HPP
#define OPENMW_DIALOGUEAPI_HPP
#include <Script/Platform.hpp>
#define DIALOGUEAPI \
{"ClearTopicChanges", DialogueFunctions::ClearTopicChanges},\
\
@ -17,10 +19,8 @@
\
{"InitializeTopicChanges", DialogueFunctions::InitializeTopicChanges}
class DialogueFunctions
namespace DialogueFunctions
{
public:
/**
* \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.
* \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.
@ -37,7 +37,7 @@ public:
* \param pid The player ID whose topic changes should be used.
* \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.
@ -46,7 +46,7 @@ public:
* \param topicId The topicId of the topic.
* \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.
@ -55,7 +55,7 @@ public:
* \param index The index of the topic.
* \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.
@ -67,7 +67,7 @@ public:
* to the packet (false by default).
* \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
@ -80,7 +80,7 @@ public:
* \param bool Whether the animation should persist or not.
* \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
@ -90,12 +90,11 @@ public:
* \param sound The path of the sound file.
* \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
static void InitializeTopicChanges(unsigned short pid) noexcept;
};
EXPORT_APIFUNCTION void CDECL InitializeTopicChanges(unsigned short pid) noexcept;
}
#endif //OPENMW_DIALOGUEAPI_HPP

@ -11,7 +11,7 @@ using namespace mwmp;
Faction tempFaction;
const Faction emptyFaction = {};
void FactionFunctions::ClearFactionChanges(unsigned short pid) noexcept
extern "C" void FactionFunctions::ClearFactionChanges(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, );
@ -19,7 +19,7 @@ void FactionFunctions::ClearFactionChanges(unsigned short pid) noexcept
player->factionChanges.factions.clear();
}
unsigned int FactionFunctions::GetFactionChangesSize(unsigned short pid) noexcept
extern "C" unsigned int FactionFunctions::GetFactionChangesSize(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, 0);
@ -27,7 +27,7 @@ unsigned int FactionFunctions::GetFactionChangesSize(unsigned short pid) noexcep
return player->factionChanges.count;
}
unsigned char FactionFunctions::GetFactionChangesAction(unsigned short pid) noexcept
extern "C" unsigned char FactionFunctions::GetFactionChangesAction(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, 0);
@ -35,7 +35,7 @@ unsigned char FactionFunctions::GetFactionChangesAction(unsigned short pid) noex
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;
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();
}
int FactionFunctions::GetFactionRank(unsigned short pid, unsigned int index) noexcept
extern "C" int FactionFunctions::GetFactionRank(unsigned short pid, unsigned int index) noexcept
{
Player *player;
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;
}
bool FactionFunctions::GetFactionExpulsionState(unsigned short pid, unsigned int index) noexcept
extern "C" bool FactionFunctions::GetFactionExpulsionState(unsigned short pid, unsigned int index) noexcept
{
Player *player;
GET_PLAYER(pid, player, false);
@ -62,7 +62,7 @@ bool FactionFunctions::GetFactionExpulsionState(unsigned short pid, unsigned int
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;
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;
}
void FactionFunctions::SetFactionChangesAction(unsigned short pid, unsigned char action) noexcept
extern "C" void FactionFunctions::SetFactionChangesAction(unsigned short pid, unsigned char action) noexcept
{
Player *player;
GET_PLAYER(pid, player, );
@ -78,27 +78,27 @@ void FactionFunctions::SetFactionChangesAction(unsigned short pid, unsigned char
player->factionChanges.action = action;
}
void FactionFunctions::SetFactionId(const char* factionId) noexcept
extern "C" void FactionFunctions::SetFactionId(const char* factionId) noexcept
{
tempFaction.factionId = factionId;
}
void FactionFunctions::SetFactionRank(unsigned int rank) noexcept
extern "C" void FactionFunctions::SetFactionRank(unsigned int rank) noexcept
{
tempFaction.rank = rank;
}
void FactionFunctions::SetFactionExpulsionState(bool expulsionState) noexcept
extern "C" void FactionFunctions::SetFactionExpulsionState(bool expulsionState) noexcept
{
tempFaction.isExpelled = expulsionState;
}
void FactionFunctions::SetFactionReputation(int reputation) noexcept
extern "C" void FactionFunctions::SetFactionReputation(int reputation) noexcept
{
tempFaction.reputation = reputation;
}
void FactionFunctions::AddFaction(unsigned short pid) noexcept
extern "C" void FactionFunctions::AddFaction(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, );
@ -108,7 +108,7 @@ void FactionFunctions::AddFaction(unsigned short pid) noexcept
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;
GET_PLAYER(pid, player, );
@ -122,7 +122,7 @@ void FactionFunctions::SendFactionChanges(unsigned short pid, bool sendToOtherPl
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
{

@ -1,6 +1,8 @@
#ifndef OPENMW_FACTIONAPI_HPP
#define OPENMW_FACTIONAPI_HPP
#include <Script/Platform.hpp>
#define FACTIONAPI \
{"ClearFactionChanges", FactionFunctions::ClearFactionChanges},\
\
@ -24,10 +26,8 @@
\
{"InitializeFactionChanges", FactionFunctions::InitializeFactionChanges}
class FactionFunctions
namespace FactionFunctions
{
public:
/**
* \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.
* \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.
@ -44,7 +44,7 @@ public:
* \param pid The player ID whose faction changes should be used.
* \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.
@ -52,7 +52,7 @@ public:
* \param pid The player ID whose faction changes should be used.
* \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.
@ -61,7 +61,7 @@ public:
* \param index The index of the faction.
* \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.
@ -70,7 +70,7 @@ public:
* \param index The index of the faction.
* \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.
@ -79,7 +79,7 @@ public:
* \param index The index of the faction.
* \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.
@ -88,7 +88,7 @@ public:
* \param index The index of the faction.
* \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.
@ -97,7 +97,7 @@ public:
* \param action The action (0 for RANK, 1 for EXPULSION, 2 for REPUTATION).
* \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.
@ -105,7 +105,7 @@ public:
* \param factionId The factionId.
* \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.
@ -113,7 +113,7 @@ public:
* \param rank The rank.
* \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.
@ -121,7 +121,7 @@ public:
* \param expulsionState The expulsion state.
* \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.
@ -129,7 +129,7 @@ public:
* \param reputation The reputation.
* \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.
@ -140,7 +140,7 @@ public:
* \param pid The player ID whose faction changes should be used.
* \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.
@ -152,12 +152,11 @@ public:
* to the packet (false by default).
* \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
static void InitializeFactionChanges(unsigned short pid) noexcept;
};
EXPORT_APIFUNCTION void CDECL InitializeFactionChanges(unsigned short pid) noexcept;
}
#endif //OPENMW_FACTIONAPI_HPP

@ -5,7 +5,7 @@
#include <apps/openmw-mp/Script/ScriptFunctions.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;
GET_PLAYER(pid, player,);
@ -20,7 +20,7 @@ void GUIFunctions::_MessageBox(unsigned short pid, int id, const char *label) no
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;
GET_PLAYER(pid, player,);
@ -36,7 +36,7 @@ void GUIFunctions::CustomMessageBox(unsigned short pid, int id, const char *labe
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;
GET_PLAYER(pid, player,);
@ -52,7 +52,7 @@ void GUIFunctions::InputDialog(unsigned short pid, int id, const char *label, co
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;
GET_PLAYER(pid, player,);
@ -68,7 +68,7 @@ void GUIFunctions::PasswordDialog(unsigned short pid, int id, const char *label,
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;
GET_PLAYER(pid, player,);
@ -84,7 +84,7 @@ void GUIFunctions::ListBox(unsigned short pid, int id, const char *label, const
packet->Send(false);
}
void GUIFunctions::ClearQuickKeyChanges(unsigned short pid) noexcept
extern "C" void GUIFunctions::ClearQuickKeyChanges(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, );
@ -92,7 +92,7 @@ void GUIFunctions::ClearQuickKeyChanges(unsigned short pid) noexcept
player->quickKeyChanges.quickKeys.clear();
}
unsigned int GUIFunctions::GetQuickKeyChangesSize(unsigned short pid) noexcept
extern "C" unsigned int GUIFunctions::GetQuickKeyChangesSize(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, 0);
@ -100,7 +100,7 @@ unsigned int GUIFunctions::GetQuickKeyChangesSize(unsigned short pid) noexcept
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;
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;
}
int GUIFunctions::GetQuickKeyType(unsigned short pid, unsigned int index) noexcept
extern "C" int GUIFunctions::GetQuickKeyType(unsigned short pid, unsigned int index) noexcept
{
Player *player;
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;
}
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;
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();
}
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;
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);
}
void GUIFunctions::SendQuickKeyChanges(unsigned short pid) noexcept
extern "C" void GUIFunctions::SendQuickKeyChanges(unsigned short pid) noexcept
{
Player *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);
}
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");
}
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");
}
// 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
{

@ -1,6 +1,8 @@
#ifndef OPENMW_GUIAPI_HPP
#define OPENMW_GUIAPI_HPP
#include <Script/Platform.hpp>
#define GUIAPI \
{"MessageBox", GUIFunctions::_MessageBox},\
{"CustomMessageBox", GUIFunctions::CustomMessageBox},\
@ -25,10 +27,8 @@
\
{"InitializeQuickKeyChanges", GUIFunctions::InitializeQuickKeyChanges}
class GUIFunctions
namespace GUIFunctions
{
public:
/**
* \brief Display a simple messagebox at the bottom of the screen that vanishes
* after a few seconds.
@ -41,7 +41,7 @@ public:
* \param label The text in the messagebox.
* \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
@ -53,7 +53,7 @@ public:
* \parm buttons The captions of the buttons, separated by semicolons (e.g. "Yes;No;Maybe").
* \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.
@ -64,7 +64,7 @@ public:
* \parm note The text at the bottom of the input dialog.
* \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.
@ -78,7 +78,7 @@ public:
* \parm note The text at the bottom of the password dialog.
* \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
@ -91,7 +91,7 @@ public:
* \parm items The items in the listbox, separated by newlines (e.g. "Item 1\nItem 2").
* \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.
@ -101,7 +101,7 @@ public:
* \param pid The player ID whose quick key changes should be used.
* \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.
@ -109,7 +109,7 @@ public:
* \param pid The player ID whose quick key changes should be used.
* \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.
@ -120,7 +120,7 @@ public:
* \param itemId The itemId of the item.
* \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.
@ -129,7 +129,7 @@ public:
* \param index The index of the quick key in the quick key changes vector.
* \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.
@ -138,7 +138,7 @@ public:
* \param index The index of the quick key in the quick key changes vector.
* \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.
@ -147,7 +147,7 @@ public:
* \param index The index of the quick key in the quick key changes vector.
* \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.
@ -155,7 +155,7 @@ public:
* \param pid The player ID whose quick key changes should be used.
* \return void
*/
static void SendQuickKeyChanges(unsigned short pid) noexcept;
EXPORT_APIFUNCTION void CDECL SendQuickKeyChanges(unsigned short pid) noexcept;
//state 0 - disallow, 1 - allow
@ -169,7 +169,7 @@ public:
* \param state The state of the map marker (false to hide, true to reveal).
* \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.
@ -180,12 +180,11 @@ public:
* \param state The state of the map marker (false to hide, true to reveal).
* \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
static void InitializeQuickKeyChanges(unsigned short pid) noexcept;
};
EXPORT_APIFUNCTION void CDECL InitializeQuickKeyChanges(unsigned short pid) noexcept;
}
#endif //OPENMW_GUIAPI_HPP

@ -9,7 +9,7 @@
using namespace mwmp;
void ItemFunctions::ClearInventoryChanges(unsigned short pid) noexcept
extern "C" void ItemFunctions::ClearInventoryChanges(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, );
@ -17,12 +17,12 @@ void ItemFunctions::ClearInventoryChanges(unsigned short pid) noexcept
player->inventoryChanges.items.clear();
}
int ItemFunctions::GetEquipmentSize() noexcept
extern "C" int ItemFunctions::GetEquipmentSize() noexcept
{
return MWWorld::InventoryStore::Slots;
}
unsigned int ItemFunctions::GetInventoryChangesSize(unsigned short pid) noexcept
extern "C" unsigned int ItemFunctions::GetInventoryChangesSize(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, 0);
@ -30,7 +30,7 @@ unsigned int ItemFunctions::GetInventoryChangesSize(unsigned short pid) noexcept
return player->inventoryChanges.count;
}
unsigned int ItemFunctions::GetInventoryChangesAction(unsigned short pid) noexcept
extern "C" unsigned int ItemFunctions::GetInventoryChangesAction(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, 0);
@ -38,7 +38,7 @@ unsigned int ItemFunctions::GetInventoryChangesAction(unsigned short pid) noexce
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;
GET_PLAYER(pid, player, );
@ -46,7 +46,7 @@ void ItemFunctions::SetInventoryChangesAction(unsigned short pid, unsigned char
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
{
Player *player;
@ -61,7 +61,7 @@ void ItemFunctions::EquipItem(unsigned short pid, unsigned short slot, const cha
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;
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);
}
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
{
Player *player;
@ -85,7 +85,7 @@ void ItemFunctions::AddItemChange(unsigned short pid, const char* refId, unsigne
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;
GET_PLAYER(pid, player, false);
@ -96,7 +96,7 @@ bool ItemFunctions::HasItemEquipped(unsigned short pid, const char* refId)
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;
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();
}
int ItemFunctions::GetEquipmentItemCount(unsigned short pid, unsigned short slot) noexcept
extern "C" int ItemFunctions::GetEquipmentItemCount(unsigned short pid, unsigned short slot) noexcept
{
Player *player;
GET_PLAYER(pid, player, 0);
@ -112,7 +112,7 @@ int ItemFunctions::GetEquipmentItemCount(unsigned short pid, unsigned short slot
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;
GET_PLAYER(pid, player, 0);
@ -120,7 +120,7 @@ int ItemFunctions::GetEquipmentItemCharge(unsigned short pid, unsigned short slo
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;
GET_PLAYER(pid, player, 0);
@ -128,7 +128,7 @@ double ItemFunctions::GetEquipmentItemEnchantmentCharge(unsigned short pid, unsi
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;
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();
}
int ItemFunctions::GetInventoryItemCount(unsigned short pid, unsigned int index) noexcept
extern "C" int ItemFunctions::GetInventoryItemCount(unsigned short pid, unsigned int index) noexcept
{
Player *player;
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;
}
int ItemFunctions::GetInventoryItemCharge(unsigned short pid, unsigned int index) noexcept
extern "C" int ItemFunctions::GetInventoryItemCharge(unsigned short pid, unsigned int index) noexcept
{
Player *player;
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;
}
double ItemFunctions::GetInventoryItemEnchantmentCharge(unsigned short pid, unsigned int index) noexcept
extern "C" double ItemFunctions::GetInventoryItemEnchantmentCharge(unsigned short pid, unsigned int index) noexcept
{
Player *player;
GET_PLAYER(pid, player, 0);
@ -163,7 +163,7 @@ double ItemFunctions::GetInventoryItemEnchantmentCharge(unsigned short pid, unsi
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;
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();
}
const char *ItemFunctions::GetUsedItemRefId(unsigned short pid) noexcept
extern "C" const char *ItemFunctions::GetUsedItemRefId(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, "");
@ -182,7 +182,7 @@ const char *ItemFunctions::GetUsedItemRefId(unsigned short pid) noexcept
return player->usedItem.refId.c_str();
}
int ItemFunctions::GetUsedItemCount(unsigned short pid) noexcept
extern "C" int ItemFunctions::GetUsedItemCount(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, 0);
@ -190,7 +190,7 @@ int ItemFunctions::GetUsedItemCount(unsigned short pid) noexcept
return player->usedItem.count;
}
int ItemFunctions::GetUsedItemCharge(unsigned short pid) noexcept
extern "C" int ItemFunctions::GetUsedItemCharge(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, 0);
@ -198,7 +198,7 @@ int ItemFunctions::GetUsedItemCharge(unsigned short pid) noexcept
return player->usedItem.charge;
}
double ItemFunctions::GetUsedItemEnchantmentCharge(unsigned short pid) noexcept
extern "C" double ItemFunctions::GetUsedItemEnchantmentCharge(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, 0);
@ -206,7 +206,7 @@ double ItemFunctions::GetUsedItemEnchantmentCharge(unsigned short pid) noexcept
return player->usedItem.enchantmentCharge;
}
const char *ItemFunctions::GetUsedItemSoul(unsigned short pid) noexcept
extern "C" const char *ItemFunctions::GetUsedItemSoul(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, "");
@ -214,7 +214,7 @@ const char *ItemFunctions::GetUsedItemSoul(unsigned short pid) noexcept
return player->usedItem.soul.c_str();
}
void ItemFunctions::SendEquipment(unsigned short pid) noexcept
extern "C" void ItemFunctions::SendEquipment(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, );
@ -228,7 +228,7 @@ void ItemFunctions::SendEquipment(unsigned short pid) noexcept
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;
GET_PLAYER(pid, player, );
@ -242,7 +242,7 @@ void ItemFunctions::SendInventoryChanges(unsigned short pid, bool sendToOtherPla
packet->Send(true);
}
void ItemFunctions::SendItemUse(unsigned short pid) noexcept
extern "C" void ItemFunctions::SendItemUse(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, );
@ -253,14 +253,14 @@ void ItemFunctions::SendItemUse(unsigned short pid) noexcept
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
{
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
{
AddItemChange(pid, refId, count, charge, enchantmentCharge, soul);

@ -1,6 +1,8 @@
#ifndef OPENMW_ITEMAPI_HPP
#define OPENMW_ITEMAPI_HPP
#include <Script/Platform.hpp>
#define ITEMAPI \
{"ClearInventoryChanges", ItemFunctions::ClearInventoryChanges},\
\
@ -41,10 +43,8 @@
{"InitializeInventoryChanges", ItemFunctions::InitializeInventoryChanges},\
{"AddItem", ItemFunctions::AddItem}
class ItemFunctions
namespace ItemFunctions
{
public:
/**
* \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.
* \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.
@ -62,7 +62,7 @@ public:
*
* \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.
@ -70,7 +70,7 @@ public:
* \param pid The player ID whose inventory changes should be used.
* \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.
@ -78,7 +78,7 @@ public:
* \param pid The player ID whose inventory changes should be used.
* \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.
@ -87,7 +87,7 @@ public:
* \param action The action (0 for SET, 1 for ADD, 2 for REMOVE).
* \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.
@ -100,7 +100,7 @@ public:
* \param enchantmentCharge The enchantment charge of the item.
* \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;
/**
@ -110,7 +110,7 @@ public:
* \param slot The equipment slot.
* \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.
@ -123,7 +123,7 @@ public:
* \param soul The soul of the item.
* \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;
/**
@ -133,7 +133,7 @@ public:
* \param refId The refId of the item.
* \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.
@ -142,7 +142,7 @@ public:
* \param slot The slot of the equipment item.
* \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.
@ -151,7 +151,7 @@ public:
* \param slot The slot of the equipment item.
* \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.
@ -160,7 +160,7 @@ public:
* \param slot The slot of the equipment item.
* \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
@ -170,7 +170,7 @@ public:
* \param slot The slot of the equipment item.
* \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
@ -180,7 +180,7 @@ public:
* \param index The index of the inventory item.
* \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
@ -190,7 +190,7 @@ public:
* \param index The index of the inventory item.
* \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
@ -200,7 +200,7 @@ public:
* \param index The index of the inventory item.
* \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
@ -210,7 +210,7 @@ public:
* \param index The index of the inventory item.
* \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
@ -220,7 +220,7 @@ public:
* \param index The index of the inventory item.
* \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.
@ -228,7 +228,7 @@ public:
* \param pid The player ID.
* \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.
@ -236,7 +236,7 @@ public:
* \param pid The player ID.
* \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.
@ -244,7 +244,7 @@ public:
* \param pid The player ID.
* \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.
@ -252,7 +252,7 @@ public:
* \param pid The player ID.
* \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.
@ -260,7 +260,7 @@ public:
* \param pid The player ID.
* \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.
@ -270,7 +270,7 @@ public:
* \param pid The player ID whose equipment should be sent.
* \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.
@ -282,7 +282,7 @@ public:
* to the packet (false by default).
* \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.
@ -290,17 +290,14 @@ public:
* \param pid The player ID affected.
* \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
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;
private:
};
}
#endif //OPENMW_ITEMAPI_HPP

@ -11,7 +11,7 @@ using namespace std;
static std::string tempCellDescription;
unsigned char MechanicsFunctions::GetMiscellaneousChangeType(unsigned short pid) noexcept
extern "C" unsigned char MechanicsFunctions::GetMiscellaneousChangeType(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, 0);
@ -19,16 +19,16 @@ unsigned char MechanicsFunctions::GetMiscellaneousChangeType(unsigned short pid)
return player->miscellaneousChangeType;
}
const char *MechanicsFunctions::GetMarkCell(unsigned short pid) noexcept
extern "C" const char *MechanicsFunctions::GetMarkCell(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, 0);
tempCellDescription = player->cell.getDescription().c_str();
tempCellDescription = player->cell.getDescription();
return tempCellDescription.c_str();
}
double MechanicsFunctions::GetMarkPosX(unsigned short pid) noexcept
extern "C" double MechanicsFunctions::GetMarkPosX(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, 0.0f);
@ -36,7 +36,7 @@ double MechanicsFunctions::GetMarkPosX(unsigned short pid) noexcept
return player->markPosition.pos[0];
}
double MechanicsFunctions::GetMarkPosY(unsigned short pid) noexcept
extern "C" double MechanicsFunctions::GetMarkPosY(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, 0.0f);
@ -44,7 +44,7 @@ double MechanicsFunctions::GetMarkPosY(unsigned short pid) noexcept
return player->markPosition.pos[1];
}
double MechanicsFunctions::GetMarkPosZ(unsigned short pid) noexcept
extern "C" double MechanicsFunctions::GetMarkPosZ(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, 0.0f);
@ -52,7 +52,7 @@ double MechanicsFunctions::GetMarkPosZ(unsigned short pid) noexcept
return player->markPosition.pos[2];
}
double MechanicsFunctions::GetMarkRotX(unsigned short pid) noexcept
extern "C" double MechanicsFunctions::GetMarkRotX(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, 0.0f);
@ -60,7 +60,7 @@ double MechanicsFunctions::GetMarkRotX(unsigned short pid) noexcept
return player->markPosition.rot[0];
}
double MechanicsFunctions::GetMarkRotZ(unsigned short pid) noexcept
extern "C" double MechanicsFunctions::GetMarkRotZ(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, 0.0f);
@ -68,7 +68,7 @@ double MechanicsFunctions::GetMarkRotZ(unsigned short pid) noexcept
return player->markPosition.rot[2];
}
bool MechanicsFunctions::DoesPlayerHavePlayerKiller(unsigned short pid) noexcept
extern "C" bool MechanicsFunctions::DoesPlayerHavePlayerKiller(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, false);
@ -76,7 +76,7 @@ bool MechanicsFunctions::DoesPlayerHavePlayerKiller(unsigned short pid) noexcept
return player->killer.isPlayer;
}
int MechanicsFunctions::GetPlayerKillerPid(unsigned short pid) noexcept
extern "C" int MechanicsFunctions::GetPlayerKillerPid(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, 0);
@ -89,7 +89,7 @@ int MechanicsFunctions::GetPlayerKillerPid(unsigned short pid) noexcept
return -1;
}
const char *MechanicsFunctions::GetPlayerKillerRefId(unsigned short pid) noexcept
extern "C" const char *MechanicsFunctions::GetPlayerKillerRefId(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, "");
@ -97,7 +97,7 @@ const char *MechanicsFunctions::GetPlayerKillerRefId(unsigned short pid) noexcep
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;
GET_PLAYER(pid, player, 0);
@ -105,7 +105,7 @@ unsigned int MechanicsFunctions::GetPlayerKillerRefNum(unsigned short pid) noexc
return player->killer.refNum;
}
unsigned int MechanicsFunctions::GetPlayerKillerMpNum(unsigned short pid) noexcept
extern "C" unsigned int MechanicsFunctions::GetPlayerKillerMpNum(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, 0);
@ -113,7 +113,7 @@ unsigned int MechanicsFunctions::GetPlayerKillerMpNum(unsigned short pid) noexce
return player->killer.mpNum;
}
const char *MechanicsFunctions::GetPlayerKillerName(unsigned short pid) noexcept
extern "C" const char *MechanicsFunctions::GetPlayerKillerName(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, "");
@ -121,7 +121,7 @@ const char *MechanicsFunctions::GetPlayerKillerName(unsigned short pid) noexcept
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;
GET_PLAYER(pid, player, 0);
@ -129,7 +129,7 @@ const char *MechanicsFunctions::GetSelectedSpellId(unsigned short pid) noexcept
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;
GET_PLAYER(pid, player, false);
@ -137,7 +137,7 @@ unsigned int MechanicsFunctions::GetDrawState(unsigned short pid) noexcept
return player->drawState;
}
bool MechanicsFunctions::GetSneakState(unsigned short pid) noexcept
extern "C" bool MechanicsFunctions::GetSneakState(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, false);
@ -146,7 +146,7 @@ bool MechanicsFunctions::GetSneakState(unsigned short pid) noexcept
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;
GET_PLAYER(pid, player, );
@ -154,7 +154,7 @@ void MechanicsFunctions::SetMarkCell(unsigned short pid, const char *cellDescrip
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;
GET_PLAYER(pid, player, );
@ -164,7 +164,7 @@ void MechanicsFunctions::SetMarkPos(unsigned short pid, double x, double y, doub
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;
GET_PLAYER(pid, player, );
@ -173,7 +173,7 @@ void MechanicsFunctions::SetMarkRot(unsigned short pid, double x, double z) noex
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;
GET_PLAYER(pid, player, );
@ -181,7 +181,7 @@ void MechanicsFunctions::SetSelectedSpellId(unsigned short pid, const char *spel
player->selectedSpellId = spellId;
}
void MechanicsFunctions::SendMarkLocation(unsigned short pid)
extern "C" void MechanicsFunctions::SendMarkLocation(unsigned short pid)
{
Player *player;
GET_PLAYER(pid, player, );
@ -194,7 +194,7 @@ void MechanicsFunctions::SendMarkLocation(unsigned short pid)
packet->Send(false);
}
void MechanicsFunctions::SendSelectedSpell(unsigned short pid)
extern "C" void MechanicsFunctions::SendSelectedSpell(unsigned short pid)
{
Player *player;
GET_PLAYER(pid, player, );
@ -207,7 +207,7 @@ void MechanicsFunctions::SendSelectedSpell(unsigned short pid)
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
{
Player *player;
@ -225,7 +225,7 @@ void MechanicsFunctions::Jail(unsigned short pid, int jailDays, bool ignoreJailT
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;
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
const char *MechanicsFunctions::GetDeathReason(unsigned short pid) noexcept
extern "C" const char *MechanicsFunctions::GetDeathReason(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, 0);
@ -259,7 +259,7 @@ const char *MechanicsFunctions::GetDeathReason(unsigned short pid) noexcept
return "suicide";
}
unsigned int MechanicsFunctions::GetPlayerKillerRefNumIndex(unsigned short pid) noexcept
extern "C" unsigned int MechanicsFunctions::GetPlayerKillerRefNumIndex(unsigned short pid) noexcept
{
return GetPlayerKillerRefNum(pid);
}

@ -3,6 +3,8 @@
#include "../Types.hpp"
#include <Script/Platform.hpp>
#define MECHANICSAPI \
{"GetMiscellaneousChangeType", MechanicsFunctions::GetMiscellaneousChangeType},\
\
@ -38,17 +40,15 @@
{"GetDeathReason", MechanicsFunctions::GetDeathReason},\
{"GetPlayerKillerRefNumIndex", MechanicsFunctions::GetPlayerKillerRefNumIndex}
class MechanicsFunctions
namespace MechanicsFunctions
{
public:
/**
* \brief Get the type of a PlayerMiscellaneous packet.
*
* \param pid The player ID.
* \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.
@ -56,7 +56,7 @@ public:
* \param pid The player ID.
* \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.
@ -64,7 +64,7 @@ public:
* \param pid The player ID.
* \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.
@ -72,7 +72,7 @@ public:
* \param pid The player ID.
* \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.
@ -80,7 +80,7 @@ public:
* \param pid The player ID.
* \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.
@ -88,7 +88,7 @@ public:
* \param pid The player ID.
* \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.
@ -96,7 +96,7 @@ public:
* \param pid The player ID.
* \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.
@ -104,7 +104,7 @@ public:
* \param pid The player 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.
@ -112,7 +112,7 @@ public:
* \param pid The player ID of the killed 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.
@ -120,7 +120,7 @@ public:
* \param pid The player ID of the killed player.
* \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.
@ -128,7 +128,7 @@ public:
* \param pid The player ID of the killed player.
* \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.
@ -136,7 +136,7 @@ public:
* \param pid The player ID of the killed player.
* \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.
@ -144,7 +144,7 @@ public:
* \param pid The player ID of the killed player.
* \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.
@ -152,7 +152,7 @@ public:
* \param pid The player ID of the killed player.
* \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,
@ -161,7 +161,7 @@ public:
* \param pid The player ID.
* \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.
@ -169,7 +169,7 @@ public:
* \param pid The player ID.
* \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.
@ -184,7 +184,7 @@ public:
* \param cellDescription The cell description.
* \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.
@ -198,7 +198,7 @@ public:
* \param z The Z position.
* \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.
@ -211,7 +211,7 @@ public:
* \param z The Z rotation.
* \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.
@ -223,7 +223,7 @@ public:
* \param spellId The spell ID.
* \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.
@ -231,7 +231,7 @@ public:
* \param pid The player ID.
* \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.
@ -239,7 +239,7 @@ public:
* \param pid The player ID.
* \return void
*/
static void SendSelectedSpell(unsigned short pid);
EXPORT_APIFUNCTION void CDECL SendSelectedSpell(unsigned short pid);
/**
* \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.
* \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;
/**
@ -274,13 +274,12 @@ public:
* 2 for TRIBUNAL_TEMPLE).
* \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
static const char *GetDeathReason(unsigned short pid) noexcept;
static unsigned int GetPlayerKillerRefNumIndex(unsigned short pid) noexcept;
};
EXPORT_APIFUNCTION const char *CDECL GetDeathReason(unsigned short pid) noexcept;
EXPORT_APIFUNCTION unsigned int CDECL GetPlayerKillerRefNumIndex(unsigned short pid) noexcept;
}
#endif //OPENMW_MECHANICSAPI_HPP

@ -1,23 +1,59 @@
#include "Miscellaneous.hpp"
#include <components/misc/stringops.hpp>
#include <components/openmw-mp/Log.hpp>
#include <apps/openmw-mp/Script/ScriptFunctions.hpp>
#include <apps/openmw-mp/Networking.hpp>
#include <iostream>
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();
}
int MiscellaneousFunctions::GetCurrentMpNum() noexcept
extern "C" int MiscellaneousFunctions::GetCurrentMpNum() noexcept
{
return mwmp::Networking::getPtr()->getCurrentMpNum();
}
void MiscellaneousFunctions::SetCurrentMpNum(int mpNum) noexcept
extern "C" void MiscellaneousFunctions::SetCurrentMpNum(int mpNum) noexcept
{
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);
}

@ -3,15 +3,42 @@
#include "../Types.hpp"
#include <Script/Platform.hpp>
#define MISCELLANEOUSAPI \
{"DoesFileExist", MiscellaneousFunctions::DoesFileExist},\
{"GetCaseInsensitiveFilename", MiscellaneousFunctions::GetCaseInsensitiveFilename},\
\
{"GetLastPlayerId", MiscellaneousFunctions::GetLastPlayerId},\
\
{"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.
@ -21,7 +48,7 @@ public:
*
* \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.
@ -35,7 +62,7 @@ public:
*
* \return The mpNum.
*/
static int GetCurrentMpNum() noexcept;
EXPORT_APIFUNCTION int CDECL GetCurrentMpNum() noexcept;
/**
* \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.
* \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

@ -19,19 +19,19 @@ const BaseObject emptyObject = {};
ContainerItem tempContainerItem;
const ContainerItem emptyContainerItem = {};
void ObjectFunctions::ReadReceivedObjectList() noexcept
extern "C" void ObjectFunctions::ReadReceivedObjectList() noexcept
{
readObjectList = mwmp::Networking::getPtr()->getReceivedObjectList();
}
void ObjectFunctions::ClearObjectList() noexcept
extern "C" void ObjectFunctions::ClearObjectList() noexcept
{
writeObjectList.cell.blank();
writeObjectList.baseObjects.clear();
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;
GET_PLAYER(pid, player, );
@ -39,42 +39,42 @@ void ObjectFunctions::SetObjectListPid(unsigned short pid) noexcept
writeObjectList.guid = player->guid;
}
void ObjectFunctions::CopyReceivedObjectListToStore() noexcept
extern "C" void ObjectFunctions::CopyReceivedObjectListToStore() noexcept
{
writeObjectList = *readObjectList;
}
unsigned int ObjectFunctions::GetObjectListSize() noexcept
extern "C" unsigned int ObjectFunctions::GetObjectListSize() noexcept
{
return readObjectList->baseObjectCount;
}
unsigned char ObjectFunctions::GetObjectListOrigin() noexcept
extern "C" unsigned char ObjectFunctions::GetObjectListOrigin() noexcept
{
return readObjectList->packetOrigin;
}
const char *ObjectFunctions::GetObjectListClientScript() noexcept
extern "C" const char *ObjectFunctions::GetObjectListClientScript() noexcept
{
return readObjectList->originClientScript.c_str();
}
unsigned char ObjectFunctions::GetObjectListAction() noexcept
extern "C" unsigned char ObjectFunctions::GetObjectListAction() noexcept
{
return readObjectList->action;
}
unsigned char ObjectFunctions::GetObjectListContainerSubAction() noexcept
extern "C" unsigned char ObjectFunctions::GetObjectListContainerSubAction() noexcept
{
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;
}
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);
@ -84,72 +84,72 @@ int ObjectFunctions::GetObjectPid(unsigned int index) noexcept
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();
}
unsigned int ObjectFunctions::GetObjectRefNum(unsigned int index) noexcept
extern "C" unsigned int ObjectFunctions::GetObjectRefNum(unsigned int index) noexcept
{
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;
}
int ObjectFunctions::GetObjectCount(unsigned int index) noexcept
extern "C" int ObjectFunctions::GetObjectCount(unsigned int index) noexcept
{
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;
}
double ObjectFunctions::GetObjectEnchantmentCharge(unsigned int index) noexcept
extern "C" double ObjectFunctions::GetObjectEnchantmentCharge(unsigned int index) noexcept
{
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();
}
int ObjectFunctions::GetObjectGoldValue(unsigned int index) noexcept
extern "C" int ObjectFunctions::GetObjectGoldValue(unsigned int index) noexcept
{
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;
}
bool ObjectFunctions::GetObjectState(unsigned int index) noexcept
extern "C" bool ObjectFunctions::GetObjectState(unsigned int index) noexcept
{
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;
}
int ObjectFunctions::GetObjectLockLevel(unsigned int index) noexcept
extern "C" int ObjectFunctions::GetObjectLockLevel(unsigned int index) noexcept
{
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;
}
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);
@ -159,42 +159,42 @@ int ObjectFunctions::GetObjectActivatingPid(unsigned int index) noexcept
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();
}
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;
}
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;
}
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();
}
bool ObjectFunctions::GetObjectSummonState(unsigned int index) noexcept
extern "C" bool ObjectFunctions::GetObjectSummonState(unsigned int index) noexcept
{
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;
}
bool ObjectFunctions::DoesObjectHavePlayerSummoner(unsigned int index) noexcept
extern "C" bool ObjectFunctions::DoesObjectHavePlayerSummoner(unsigned int index) noexcept
{
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);
@ -204,202 +204,202 @@ int ObjectFunctions::GetObjectSummonerPid(unsigned int index) noexcept
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();
}
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;
}
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;
}
double ObjectFunctions::GetObjectPosX(unsigned int index) noexcept
extern "C" double ObjectFunctions::GetObjectPosX(unsigned int index) noexcept
{
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];
}
double ObjectFunctions::GetObjectPosZ(unsigned int index) noexcept
extern "C" double ObjectFunctions::GetObjectPosZ(unsigned int index) noexcept
{
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];
}
double ObjectFunctions::GetObjectRotY(unsigned int index) noexcept
extern "C" double ObjectFunctions::GetObjectRotY(unsigned int index) noexcept
{
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];
}
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();
}
unsigned int ObjectFunctions::GetContainerChangesSize(unsigned int objectIndex) noexcept
extern "C" unsigned int ObjectFunctions::GetContainerChangesSize(unsigned int objectIndex) noexcept
{
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)
.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)
.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)
.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)
.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)
.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)
.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;
}
void ObjectFunctions::SetObjectListCell(const char* cellDescription) noexcept
extern "C" void ObjectFunctions::SetObjectListCell(const char* cellDescription) noexcept
{
writeObjectList.cell = Utils::getCellFromDescription(cellDescription);
}
void ObjectFunctions::SetObjectListAction(unsigned char action) noexcept
extern "C" void ObjectFunctions::SetObjectListAction(unsigned char action) noexcept
{
writeObjectList.action = action;
}
void ObjectFunctions::SetObjectListConsoleCommand(const char* consoleCommand) noexcept
extern "C" void ObjectFunctions::SetObjectListConsoleCommand(const char* consoleCommand) noexcept
{
writeObjectList.consoleCommand = consoleCommand;
}
void ObjectFunctions::SetObjectRefId(const char* refId) noexcept
extern "C" void ObjectFunctions::SetObjectRefId(const char* refId) noexcept
{
tempObject.refId = refId;
}
void ObjectFunctions::SetObjectRefNum(int refNum) noexcept
extern "C" void ObjectFunctions::SetObjectRefNum(int refNum) noexcept
{
tempObject.refNum = refNum;
}
void ObjectFunctions::SetObjectMpNum(int mpNum) noexcept
extern "C" void ObjectFunctions::SetObjectMpNum(int mpNum) noexcept
{
tempObject.mpNum = mpNum;
}
void ObjectFunctions::SetObjectCount(int count) noexcept
extern "C" void ObjectFunctions::SetObjectCount(int count) noexcept
{
tempObject.count = count;
}
void ObjectFunctions::SetObjectCharge(int charge) noexcept
extern "C" void ObjectFunctions::SetObjectCharge(int charge) noexcept
{
tempObject.charge = charge;
}
void ObjectFunctions::SetObjectEnchantmentCharge(double enchantmentCharge) noexcept
extern "C" void ObjectFunctions::SetObjectEnchantmentCharge(double enchantmentCharge) noexcept
{
tempObject.enchantmentCharge = enchantmentCharge;
}
void ObjectFunctions::SetObjectSoul(const char* soul) noexcept
extern "C" void ObjectFunctions::SetObjectSoul(const char* soul) noexcept
{
tempObject.soul = soul;
}
void ObjectFunctions::SetObjectGoldValue(int goldValue) noexcept
extern "C" void ObjectFunctions::SetObjectGoldValue(int goldValue) noexcept
{
tempObject.goldValue = goldValue;
}
void ObjectFunctions::SetObjectScale(double scale) noexcept
extern "C" void ObjectFunctions::SetObjectScale(double scale) noexcept
{
tempObject.scale = scale;
}
void ObjectFunctions::SetObjectState(bool objectState) noexcept
extern "C" void ObjectFunctions::SetObjectState(bool objectState) noexcept
{
tempObject.objectState = objectState;
}
void ObjectFunctions::SetObjectLockLevel(int lockLevel) noexcept
extern "C" void ObjectFunctions::SetObjectLockLevel(int lockLevel) noexcept
{
tempObject.lockLevel = lockLevel;
}
void ObjectFunctions::SetObjectSummonDuration(float summonDuration) noexcept
extern "C" void ObjectFunctions::SetObjectSummonDuration(float summonDuration) noexcept
{
tempObject.summonDuration = summonDuration;
}
void ObjectFunctions::SetObjectDisarmState(bool disarmState) noexcept
extern "C" void ObjectFunctions::SetObjectDisarmState(bool disarmState) noexcept
{
tempObject.isDisarmed = disarmState;
}
void ObjectFunctions::SetObjectSummonState(bool summonState) noexcept
extern "C" void ObjectFunctions::SetObjectSummonState(bool summonState) noexcept
{
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[1] = y;
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[1] = y;
tempObject.position.rot[2] = z;
}
void ObjectFunctions::SetObjectActivatingPid(unsigned short pid) noexcept
extern "C" void ObjectFunctions::SetObjectActivatingPid(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, );
@ -408,35 +408,35 @@ void ObjectFunctions::SetObjectActivatingPid(unsigned short pid) noexcept
tempObject.activatingActor.isPlayer = true;
}
void ObjectFunctions::SetObjectDoorState(int doorState) noexcept
extern "C" void ObjectFunctions::SetObjectDoorState(int doorState) noexcept
{
tempObject.doorState = doorState;
}
void ObjectFunctions::SetObjectDoorTeleportState(bool teleportState) noexcept
extern "C" void ObjectFunctions::SetObjectDoorTeleportState(bool teleportState) noexcept
{
tempObject.teleportState = teleportState;
}
void ObjectFunctions::SetObjectDoorDestinationCell(const char* cellDescription) noexcept
extern "C" void ObjectFunctions::SetObjectDoorDestinationCell(const char* cellDescription) noexcept
{
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[1] = y;
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[2] = z;
}
void ObjectFunctions::SetPlayerAsObject(unsigned short pid) noexcept
extern "C" void ObjectFunctions::SetPlayerAsObject(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, );
@ -445,37 +445,37 @@ void ObjectFunctions::SetPlayerAsObject(unsigned short pid) noexcept
tempObject.isPlayer = true;
}
void ObjectFunctions::SetContainerItemRefId(const char* refId) noexcept
extern "C" void ObjectFunctions::SetContainerItemRefId(const char* refId) noexcept
{
tempContainerItem.refId = refId;
}
void ObjectFunctions::SetContainerItemCount(int count) noexcept
extern "C" void ObjectFunctions::SetContainerItemCount(int count) noexcept
{
tempContainerItem.count = count;
}
void ObjectFunctions::SetContainerItemCharge(int charge) noexcept
extern "C" void ObjectFunctions::SetContainerItemCharge(int charge) noexcept
{
tempContainerItem.charge = charge;
}
void ObjectFunctions::SetContainerItemEnchantmentCharge(double enchantmentCharge) noexcept
extern "C" void ObjectFunctions::SetContainerItemEnchantmentCharge(double enchantmentCharge) noexcept
{
tempContainerItem.enchantmentCharge = enchantmentCharge;
}
void ObjectFunctions::SetContainerItemSoul(const char* soul) noexcept
extern "C" void ObjectFunctions::SetContainerItemSoul(const char* soul) noexcept
{
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;
}
void ObjectFunctions::AddObject() noexcept
extern "C" void ObjectFunctions::AddObject() noexcept
{
tempObject.droppedByPlayer = false;
writeObjectList.baseObjects.push_back(tempObject);
@ -483,14 +483,14 @@ void ObjectFunctions::AddObject() noexcept
tempObject = emptyObject;
}
void ObjectFunctions::AddContainerItem() noexcept
extern "C" void ObjectFunctions::AddContainerItem() noexcept
{
tempObject.containerItems.push_back(tempContainerItem);
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);
packet->setObjectList(&writeObjectList);
@ -501,7 +501,7 @@ void ObjectFunctions::SendObjectActivate(bool sendToOtherPlayers, bool skipAttac
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);
packet->setObjectList(&writeObjectList);
@ -512,7 +512,7 @@ void ObjectFunctions::SendObjectPlace(bool sendToOtherPlayers, bool skipAttached
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);
packet->setObjectList(&writeObjectList);
@ -523,7 +523,7 @@ void ObjectFunctions::SendObjectSpawn(bool sendToOtherPlayers, bool skipAttached
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);
packet->setObjectList(&writeObjectList);
@ -534,7 +534,7 @@ void ObjectFunctions::SendObjectDelete(bool sendToOtherPlayers, bool skipAttache
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);
packet->setObjectList(&writeObjectList);
@ -545,7 +545,7 @@ void ObjectFunctions::SendObjectLock(bool sendToOtherPlayers, bool skipAttachedP
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);
packet->setObjectList(&writeObjectList);
@ -556,7 +556,7 @@ void ObjectFunctions::SendObjectTrap(bool sendToOtherPlayers, bool skipAttachedP
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);
packet->setObjectList(&writeObjectList);
@ -567,7 +567,7 @@ void ObjectFunctions::SendObjectScale(bool sendToOtherPlayers, bool skipAttached
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);
packet->setObjectList(&writeObjectList);
@ -578,7 +578,7 @@ void ObjectFunctions::SendObjectState(bool sendToOtherPlayers, bool skipAttached
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);
packet->setObjectList(&writeObjectList);
@ -589,7 +589,7 @@ void ObjectFunctions::SendDoorState(bool sendToOtherPlayers, bool skipAttachedPl
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);
packet->setObjectList(&writeObjectList);
@ -600,7 +600,7 @@ void ObjectFunctions::SendDoorDestination(bool sendToOtherPlayers, bool skipAtta
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);
packet->setObjectList(&writeObjectList);
@ -611,7 +611,7 @@ void ObjectFunctions::SendContainer(bool sendToOtherPlayers, bool skipAttachedPl
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);
packet->setObjectList(&writeObjectList);
@ -622,7 +622,7 @@ void ObjectFunctions::SendVideoPlay(bool sendToOtherPlayers, bool skipAttachedPl
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);
packet->setObjectList(&writeObjectList);
@ -633,7 +633,7 @@ void ObjectFunctions::SendConsoleCommand(bool sendToOtherPlayers, bool skipAttac
packet->Send(true);
}
extern "C"
// All methods below are deprecated versions of methods from above
void ObjectFunctions::ReadLastObjectList() noexcept
@ -641,73 +641,73 @@ void ObjectFunctions::ReadLastObjectList() noexcept
ReadReceivedObjectList();
}
void ObjectFunctions::ReadLastEvent() noexcept
extern "C" void ObjectFunctions::ReadLastEvent() noexcept
{
ReadReceivedObjectList();
}
void ObjectFunctions::InitializeObjectList(unsigned short pid) noexcept
extern "C" void ObjectFunctions::InitializeObjectList(unsigned short pid) noexcept
{
ClearObjectList();
SetObjectListPid(pid);
}
void ObjectFunctions::InitializeEvent(unsigned short pid) noexcept
extern "C" void ObjectFunctions::InitializeEvent(unsigned short pid) noexcept
{
InitializeObjectList(pid);
}
void ObjectFunctions::CopyLastObjectListToStore() noexcept
extern "C" void ObjectFunctions::CopyLastObjectListToStore() noexcept
{
CopyReceivedObjectListToStore();
}
unsigned int ObjectFunctions::GetObjectChangesSize() noexcept
extern "C" unsigned int ObjectFunctions::GetObjectChangesSize() noexcept
{
return GetObjectListSize();
}
unsigned char ObjectFunctions::GetEventAction() noexcept
extern "C" unsigned char ObjectFunctions::GetEventAction() noexcept
{
return GetObjectListAction();
}
unsigned char ObjectFunctions::GetEventContainerSubAction() noexcept
extern "C" unsigned char ObjectFunctions::GetEventContainerSubAction() noexcept
{
return GetObjectListContainerSubAction();
}
unsigned int ObjectFunctions::GetObjectRefNumIndex(unsigned int index) noexcept
extern "C" unsigned int ObjectFunctions::GetObjectRefNumIndex(unsigned int index) noexcept
{
return GetObjectRefNum(index);
}
unsigned int ObjectFunctions::GetObjectSummonerRefNumIndex(unsigned int index) noexcept
extern "C" unsigned int ObjectFunctions::GetObjectSummonerRefNumIndex(unsigned int index) noexcept
{
return GetObjectSummonerRefNum(index);
}
void ObjectFunctions::SetEventCell(const char* cellDescription) noexcept
extern "C" void ObjectFunctions::SetEventCell(const char* cellDescription) noexcept
{
SetObjectListCell(cellDescription);
}
void ObjectFunctions::SetEventAction(unsigned char action) noexcept
extern "C" void ObjectFunctions::SetEventAction(unsigned char action) noexcept
{
SetObjectListAction(action);
}
void ObjectFunctions::SetEventConsoleCommand(const char* consoleCommand) noexcept
extern "C" void ObjectFunctions::SetEventConsoleCommand(const char* consoleCommand) noexcept
{
SetObjectListConsoleCommand(consoleCommand);
}
void ObjectFunctions::SetObjectRefNumIndex(int refNum) noexcept
extern "C" void ObjectFunctions::SetObjectRefNumIndex(int refNum) noexcept
{
SetObjectRefNum(refNum);
}
void ObjectFunctions::AddWorldObject() noexcept
extern "C" void ObjectFunctions::AddWorldObject() noexcept
{
AddObject();
}

@ -1,6 +1,8 @@
#ifndef OPENMW_OBJECTAPI_HPP
#define OPENMW_OBJECTAPI_HPP
#include <Script/Platform.hpp>
#define OBJECTAPI \
{"ReadReceivedObjectList", ObjectFunctions::ReadReceivedObjectList},\
\
@ -136,23 +138,21 @@
{"SetObjectRefNumIndex", ObjectFunctions::SetObjectRefNumIndex},\
{"AddWorldObject", ObjectFunctions::AddWorldObject}
class ObjectFunctions
namespace ObjectFunctions
{
public:
/**
* \brief Use the last object list received by the server as the one being read.
*
* \return void
*/
static void ReadReceivedObjectList() noexcept;
EXPORT_APIFUNCTION void CDECL ReadReceivedObjectList() noexcept;
/**
* \brief Clear the data from the object list stored on the server.
*
* \return void
*/
static void ClearObjectList() noexcept;
EXPORT_APIFUNCTION void CDECL ClearObjectList() noexcept;
/**
* \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.
* \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
@ -169,14 +169,14 @@ public:
*
* \return void
*/
static void CopyReceivedObjectListToStore() noexcept;
EXPORT_APIFUNCTION void CDECL CopyReceivedObjectListToStore() noexcept;
/**
* \brief Get the number of indexes in the read object list.
*
* \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.
@ -185,7 +185,7 @@ public:
* CLIENT_DIALOGUE, 3 for CLIENT_SCRIPT_LOCAL, 4 for CLIENT_SCRIPT_GLOBAL,
* 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.
@ -194,21 +194,21 @@ public:
*
* \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.
*
* \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.
*
* \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
@ -221,7 +221,7 @@ public:
* \param index The index of the object.
* \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,
@ -233,7 +233,7 @@ public:
* \param index The index 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.
@ -241,7 +241,7 @@ public:
* \param index The index of the object.
* \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.
@ -249,7 +249,7 @@ public:
* \param index The index of the object.
* \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.
@ -257,7 +257,7 @@ public:
* \param index The index of the object.
* \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.
@ -265,7 +265,7 @@ public:
* \param index The index of the object.
* \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.
@ -273,7 +273,7 @@ public:
* \param index The index of the object.
* \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.
@ -281,7 +281,7 @@ public:
* \param index The index of the object.
* \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.
@ -289,7 +289,7 @@ public:
* \param index The index of the object.
* \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.
@ -299,7 +299,7 @@ public:
* \param index The index of the object.
* \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.
@ -307,7 +307,7 @@ public:
* \param index The index of the object.
* \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.
@ -315,7 +315,7 @@ public:
* \param index The index of the object.
* \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.
@ -323,7 +323,7 @@ public:
* \param index The index of the object.
* \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.
@ -331,7 +331,7 @@ public:
* \param index The index of the object.
* \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
@ -340,7 +340,7 @@ public:
* \param index The index of the object.
* \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
@ -349,7 +349,7 @@ public:
* \param index The index of the object.
* \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
@ -358,7 +358,7 @@ public:
* \param index The index of the object.
* \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
@ -367,7 +367,7 @@ public:
* \param index The index of the object.
* \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
@ -376,7 +376,7 @@ public:
* \param index The index of the object.
* \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
@ -385,7 +385,7 @@ public:
* \param index The index of the object.
* \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
@ -395,7 +395,7 @@ public:
*
* \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.
@ -405,7 +405,7 @@ public:
* \param index The index of the object.
* \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
@ -416,7 +416,7 @@ public:
* \param index The index 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
@ -425,7 +425,7 @@ public:
* \param index The index of the object.
* \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
@ -434,7 +434,7 @@ public:
* \param index The index of the object.
* \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
@ -443,7 +443,7 @@ public:
* \param index The index of the object.
* \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.
@ -451,7 +451,7 @@ public:
* \param index The index of the object.
* \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.
@ -459,7 +459,7 @@ public:
* \param index The index of the object.
* \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.
@ -467,7 +467,7 @@ public:
* \param index The index of the object.
* \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.
@ -475,7 +475,7 @@ public:
* \param index The index of the object.
* \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.
@ -483,7 +483,7 @@ public:
* \param index The index of the object.
* \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.
@ -491,7 +491,7 @@ public:
* \param index The index of the object.
* \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.
@ -499,14 +499,14 @@ public:
* \param index The index of the object.
* \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.
*
* \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
@ -515,7 +515,7 @@ public:
* \param index The index of the object.
* \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
@ -525,7 +525,7 @@ public:
* \param itemIndex The index of the container item.
* \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
@ -535,7 +535,7 @@ public:
* \param itemIndex The index of the container item.
* \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
@ -545,7 +545,7 @@ public:
* \param itemIndex The index of the container item.
* \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
@ -555,7 +555,7 @@ public:
* \param itemIndex The index of the container item.
* \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
@ -565,7 +565,7 @@ public:
* \param itemIndex The index of the container item.
* \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
@ -575,7 +575,7 @@ public:
* \param itemIndex The index of the container item.
* \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.
@ -586,7 +586,7 @@ public:
* \param index The index of the object.
* \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.
@ -597,7 +597,7 @@ public:
* \param cellDescription The description of the cell.
* \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.
@ -605,7 +605,7 @@ public:
* \param action The action type (0 for SET, 1 for ADD, 2 for REMOVE, 3 for REQUEST).
* \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.
@ -616,7 +616,7 @@ public:
* \param consoleCommand The console command.
* \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.
@ -624,7 +624,7 @@ public:
* \param refId The refId.
* \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.
@ -638,7 +638,7 @@ public:
* \param refNum The refNum.
* \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.
@ -653,7 +653,7 @@ public:
* \param mpNum The mpNum.
* \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.
@ -663,7 +663,7 @@ public:
* \param count The object count.
* \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.
@ -673,7 +673,7 @@ public:
* \param charge The charge.
* \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.
@ -683,7 +683,7 @@ public:
* \param charge The enchantment charge.
* \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.
@ -691,7 +691,7 @@ public:
* \param refId The soul.
* \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.
@ -701,7 +701,7 @@ public:
* \param goldValue The gold value.
* \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.
@ -711,7 +711,7 @@ public:
* \param scale The scale.
* \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.
@ -721,7 +721,7 @@ public:
* \param objectState The object state.
* \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.
@ -729,7 +729,7 @@ public:
* \param lockLevel The lock level.
* \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.
@ -737,7 +737,7 @@ public:
* \param summonDuration The summon duration.
* \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.
@ -745,7 +745,7 @@ public:
* \param disarmState The disarmState.
* \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.
@ -756,7 +756,7 @@ public:
* \param summonState The summon state.
* \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.
@ -766,7 +766,7 @@ public:
* \param z The Z position.
* \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.
@ -776,7 +776,7 @@ public:
* \param z The Z rotation.
* \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
@ -785,7 +785,7 @@ public:
* \param pid The pid of the player.
* \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.
@ -795,7 +795,7 @@ public:
* \param doorState The door state.
* \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.
@ -806,7 +806,7 @@ public:
* \param teleportState The teleport state.
* \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.
@ -817,7 +817,7 @@ public:
* \param cellDescription The description of the cell.
* \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.
@ -827,7 +827,7 @@ public:
* \param z The Z position.
* \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.
@ -839,7 +839,7 @@ public:
* \param z The Z rotation.
* \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.
@ -848,7 +848,7 @@ public:
* \param pid The pid of the player.
* \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.
@ -856,7 +856,7 @@ public:
* \param refId The refId.
* \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.
@ -864,7 +864,7 @@ public:
* \param count The item count.
* \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.
@ -872,7 +872,7 @@ public:
* \param charge The charge.
* \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.
@ -880,7 +880,7 @@ public:
* \param charge The enchantment charge.
* \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.
@ -888,7 +888,7 @@ public:
* \param refId The soul.
* \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
@ -903,7 +903,7 @@ public:
* \param actionCount The action count.
* \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
@ -914,7 +914,7 @@ public:
*
* \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
@ -925,7 +925,7 @@ public:
*
* \return void
*/
static void AddContainerItem() noexcept;
EXPORT_APIFUNCTION void CDECL AddContainerItem() noexcept;
/**
* \brief Send an ObjectActivate packet.
@ -936,7 +936,7 @@ public:
* to the packet (false by default).
* \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.
@ -947,7 +947,7 @@ public:
* to the packet (false by default).
* \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.
@ -958,7 +958,7 @@ public:
* to the packet (false by default).
* \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.
@ -968,7 +968,7 @@ public:
*
* \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.
@ -979,7 +979,7 @@ public:
* to the packet (false by default).
* \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.
@ -989,7 +989,7 @@ public:
*
* \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.
@ -1000,7 +1000,7 @@ public:
* to the packet (false by default).
* \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.
@ -1011,7 +1011,7 @@ public:
* to the packet (false by default).
* \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.
@ -1022,7 +1022,7 @@ public:
* to the packet (false by default).
* \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.
@ -1033,7 +1033,7 @@ public:
* to the packet (false by default).
* \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.
@ -1044,7 +1044,7 @@ public:
* to the packet (false by default).
* \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.
@ -1055,7 +1055,7 @@ public:
* to the packet (false by default).
* \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.
@ -1066,28 +1066,27 @@ public:
* to the packet (false by default).
* \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
static void ReadLastObjectList() noexcept;
static void ReadLastEvent() noexcept;
static void InitializeObjectList(unsigned short pid) noexcept;
static void InitializeEvent(unsigned short pid) noexcept;
static void CopyLastObjectListToStore() noexcept;
static unsigned int GetObjectChangesSize() noexcept;
static unsigned char GetEventAction() noexcept;
static unsigned char GetEventContainerSubAction() noexcept;
static unsigned int GetObjectRefNumIndex(unsigned int index) noexcept;
static unsigned int GetObjectSummonerRefNumIndex(unsigned int index) noexcept;
static void SetEventCell(const char* cellDescription) noexcept;
static void SetEventAction(unsigned char action) noexcept;
static void SetEventConsoleCommand(const char* consoleCommand) noexcept;
static void SetObjectRefNumIndex(int refNum) noexcept;
static void AddWorldObject() noexcept;
};
EXPORT_APIFUNCTION void CDECL ReadLastObjectList() noexcept;
EXPORT_APIFUNCTION void CDECL ReadLastEvent() noexcept;
EXPORT_APIFUNCTION void CDECL InitializeObjectList(unsigned short pid) noexcept;
EXPORT_APIFUNCTION void CDECL InitializeEvent(unsigned short pid) noexcept;
EXPORT_APIFUNCTION void CDECL CopyLastObjectListToStore() noexcept;
EXPORT_APIFUNCTION unsigned int CDECL GetObjectChangesSize() noexcept;
EXPORT_APIFUNCTION unsigned char CDECL GetEventAction() noexcept;
EXPORT_APIFUNCTION unsigned char CDECL GetEventContainerSubAction() noexcept;
EXPORT_APIFUNCTION unsigned int CDECL GetObjectRefNumIndex(unsigned int index) noexcept;
EXPORT_APIFUNCTION unsigned int CDECL GetObjectSummonerRefNumIndex(unsigned int index) noexcept;
EXPORT_APIFUNCTION void CDECL SetEventCell(const char* cellDescription) noexcept;
EXPORT_APIFUNCTION void CDECL SetEventAction(unsigned char action) noexcept;
EXPORT_APIFUNCTION void CDECL SetEventConsoleCommand(const char* consoleCommand) noexcept;
EXPORT_APIFUNCTION void CDECL SetObjectRefNumIndex(int refNum) noexcept;
EXPORT_APIFUNCTION void CDECL AddWorldObject() noexcept;
}
#endif //OPENMW_OBJECTAPI_HPP

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

@ -3,7 +3,10 @@
#include "../Types.hpp"
#include <Script/Platform.hpp>
#define POSITIONAPI \
{"GetPos", PositionFunctions::GetPos},\
{"GetPosX", PositionFunctions::GetPosX},\
{"GetPosY", PositionFunctions::GetPosY},\
{"GetPosZ", PositionFunctions::GetPosZ},\
@ -12,6 +15,7 @@
{"GetPreviousCellPosY", PositionFunctions::GetPreviousCellPosY},\
{"GetPreviousCellPosZ", PositionFunctions::GetPreviousCellPosZ},\
\
{"GetRot", PositionFunctions::GetRot},\
{"GetRotX", PositionFunctions::GetRotX},\
{"GetRotZ", PositionFunctions::GetRotZ},\
\
@ -23,9 +27,19 @@
{"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.
@ -33,7 +47,7 @@ public:
* \param pid The player ID.
* \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.
@ -41,7 +55,7 @@ public:
* \param pid The player ID.
* \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.
@ -49,7 +63,7 @@ public:
* \param pid The player ID.
* \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.
@ -57,7 +71,7 @@ public:
* \param pid The player ID.
* \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.
@ -65,7 +79,7 @@ public:
* \param pid The player ID.
* \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.
@ -73,7 +87,19 @@ public:
* \param pid The player ID.
* \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.
@ -81,7 +107,7 @@ public:
* \param pid The player ID.
* \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.
@ -89,7 +115,7 @@ public:
* \param pid The player ID.
* \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.
@ -103,7 +129,7 @@ public:
* \param z The Z position.
* \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.
@ -118,7 +144,7 @@ public:
* \param z The Z position.
* \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.
@ -132,7 +158,7 @@ public:
* \param z The Z momentum.
* \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.
@ -142,7 +168,7 @@ public:
* \param pid The player ID.
* \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.
@ -152,7 +178,7 @@ public:
* \param pid The player ID.
* \return void
*/
static void SendMomentum(unsigned short pid) noexcept;
};
EXPORT_APIFUNCTION void CDECL SendMomentum(unsigned short pid) noexcept;
}
#endif //OPENMW_POSITIONAPI_HPP

@ -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;
}

@ -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

@ -8,7 +8,7 @@
using namespace mwmp;
void QuestFunctions::ClearJournalChanges(unsigned short pid) noexcept
extern "C" void QuestFunctions::ClearJournalChanges(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, );
@ -16,7 +16,7 @@ void QuestFunctions::ClearJournalChanges(unsigned short pid) noexcept
player->journalChanges.journalItems.clear();
}
void QuestFunctions::ClearKillChanges(unsigned short pid) noexcept
extern "C" void QuestFunctions::ClearKillChanges(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, );
@ -24,7 +24,7 @@ void QuestFunctions::ClearKillChanges(unsigned short pid) noexcept
player->killChanges.kills.clear();
}
unsigned int QuestFunctions::GetJournalChangesSize(unsigned short pid) noexcept
extern "C" unsigned int QuestFunctions::GetJournalChangesSize(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, 0);
@ -32,7 +32,7 @@ unsigned int QuestFunctions::GetJournalChangesSize(unsigned short pid) noexcept
return player->journalChanges.count;
}
unsigned int QuestFunctions::GetKillChangesSize(unsigned short pid) noexcept
extern "C" unsigned int QuestFunctions::GetKillChangesSize(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, 0);
@ -40,7 +40,7 @@ unsigned int QuestFunctions::GetKillChangesSize(unsigned short pid) noexcept
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;
GET_PLAYER(pid, player, );
@ -55,7 +55,7 @@ void QuestFunctions::AddJournalEntry(unsigned short pid, const char* quest, unsi
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
{
Player *player;
@ -75,7 +75,7 @@ void QuestFunctions::AddJournalEntryWithTimestamp(unsigned short pid, const char
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;
GET_PLAYER(pid, player, );
@ -88,7 +88,7 @@ void QuestFunctions::AddJournalIndex(unsigned short pid, const char* quest, unsi
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;
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);
}
void QuestFunctions::SetReputation(unsigned short pid, int value) noexcept
extern "C" void QuestFunctions::SetReputation(unsigned short pid, int value) noexcept
{
Player *player;
GET_PLAYER(pid, player, );
@ -108,7 +108,7 @@ void QuestFunctions::SetReputation(unsigned short pid, int value) noexcept
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;
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();
}
int QuestFunctions::GetJournalItemIndex(unsigned short pid, unsigned int index) noexcept
extern "C" int QuestFunctions::GetJournalItemIndex(unsigned short pid, unsigned int index) noexcept
{
Player *player;
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;
}
int QuestFunctions::GetJournalItemType(unsigned short pid, unsigned int index) noexcept
extern "C" int QuestFunctions::GetJournalItemType(unsigned short pid, unsigned int index) noexcept
{
Player *player;
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;
}
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;
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();
}
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;
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();
}
int QuestFunctions::GetKillNumber(unsigned short pid, unsigned int index) noexcept
extern "C" int QuestFunctions::GetKillNumber(unsigned short pid, unsigned int index) noexcept
{
Player *player;
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;
}
int QuestFunctions::GetReputation(unsigned short pid) noexcept
extern "C" int QuestFunctions::GetReputation(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, 0);
@ -170,7 +170,7 @@ int QuestFunctions::GetReputation(unsigned short pid) noexcept
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;
GET_PLAYER(pid, player, );
@ -184,7 +184,7 @@ void QuestFunctions::SendJournalChanges(unsigned short pid, bool sendToOtherPlay
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;
GET_PLAYER(pid, player, );
@ -198,7 +198,7 @@ void QuestFunctions::SendKillChanges(unsigned short pid, bool sendToOtherPlayers
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;
GET_PLAYER(pid, player, );
@ -212,14 +212,14 @@ void QuestFunctions::SendReputation(unsigned short pid, bool sendToOtherPlayers,
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
{
ClearJournalChanges(pid);
}
void QuestFunctions::InitializeKillChanges(unsigned short pid) noexcept
extern "C" void QuestFunctions::InitializeKillChanges(unsigned short pid) noexcept
{
ClearKillChanges(pid);
}

@ -1,6 +1,8 @@
#ifndef OPENMW_QUESTAPI_HPP
#define OPENMW_QUESTAPI_HPP
#include <Script/Platform.hpp>
#define QUESTAPI \
{"ClearJournalChanges", QuestFunctions::ClearJournalChanges},\
{"ClearKillChanges", QuestFunctions::ClearKillChanges},\
@ -31,10 +33,8 @@
{"InitializeJournalChanges", QuestFunctions::InitializeJournalChanges},\
{"InitializeKillChanges", QuestFunctions::InitializeKillChanges}
class QuestFunctions
namespace QuestFunctions
{
public:
/**
* \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.
* \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.
@ -53,7 +53,7 @@ public:
* \param pid The player ID whose kill count changes should be used.
* \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.
@ -61,7 +61,7 @@ public:
* \param pid The player ID whose journal changes should be used.
* \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.
@ -69,7 +69,7 @@ public:
* \param pid The player ID whose kill count changes should be used.
* \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,
@ -81,7 +81,7 @@ public:
* \param actorRefId The actor refId of the journal item.
* \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,
@ -96,7 +96,7 @@ public:
* \param The day of the month for the journal item.
* \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;
/**
@ -107,7 +107,7 @@ public:
* \param index The quest index of the journal item.
* \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.
@ -117,7 +117,7 @@ public:
* \param number The number of kills in the kill count.
* \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.
@ -126,7 +126,7 @@ public:
* \param value The reputation.
* \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.
@ -135,7 +135,7 @@ public:
* \param index The index of the journalItem.
* \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.
@ -144,7 +144,7 @@ public:
* \param index The index of the journalItem.
* \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.
@ -153,7 +153,7 @@ public:
* \param index The index of the journalItem.
* \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.
@ -164,7 +164,7 @@ public:
* \param index The index of the journalItem.
* \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.
@ -173,7 +173,7 @@ public:
* \param index The index of the kill count.
* \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.
@ -182,7 +182,7 @@ public:
* \param index The index of the kill count.
* \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.
@ -190,7 +190,7 @@ public:
* \param pid The player ID.
* \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.
@ -202,7 +202,7 @@ public:
* to the packet (false by default).
* \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.
@ -214,7 +214,7 @@ public:
* to the packet (false by default).
* \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.
@ -226,15 +226,12 @@ public:
* to the packet (false by default).
* \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
static void InitializeJournalChanges(unsigned short pid) noexcept;
static void InitializeKillChanges(unsigned short pid) noexcept;
private:
};
EXPORT_APIFUNCTION void CDECL InitializeJournalChanges(unsigned short pid) noexcept;
EXPORT_APIFUNCTION void CDECL InitializeKillChanges(unsigned short pid) noexcept;
}
#endif //OPENMW_QUESTAPI_HPP

@ -31,7 +31,7 @@ mwmp::Item tempInventoryItem;
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();
@ -45,7 +45,7 @@ const ESM::EffectList& GetRecordEffects(unsigned int recordIndex)
return emptyEffectList;
}
void RecordsDynamicFunctions::ClearRecords() noexcept
extern "C" void RecordsDynamicFunctions::ClearRecords() noexcept
{
WorldstateFunctions::writeWorldstate.spellRecords.clear();
WorldstateFunctions::writeWorldstate.potionRecords.clear();
@ -59,22 +59,22 @@ void RecordsDynamicFunctions::ClearRecords() noexcept
WorldstateFunctions::writeWorldstate.weaponRecords.clear();
}
unsigned short RecordsDynamicFunctions::GetRecordType() noexcept
extern "C" unsigned short RecordsDynamicFunctions::GetRecordType() noexcept
{
return WorldstateFunctions::readWorldstate->recordsType;
}
unsigned int RecordsDynamicFunctions::GetRecordCount() noexcept
extern "C" unsigned int RecordsDynamicFunctions::GetRecordCount() noexcept
{
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();
}
int RecordsDynamicFunctions::GetRecordSubtype(unsigned int index) noexcept
extern "C" int RecordsDynamicFunctions::GetRecordSubtype(unsigned int index) noexcept
{
unsigned short readRecordsType = RecordsDynamicFunctions::GetRecordType();
@ -86,7 +86,7 @@ int RecordsDynamicFunctions::GetRecordSubtype(unsigned int index) noexcept
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();
@ -100,7 +100,7 @@ const char *RecordsDynamicFunctions::GetRecordId(unsigned int index) noexcept
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();
@ -122,7 +122,7 @@ const char *RecordsDynamicFunctions::GetRecordBaseId(unsigned int index) noexcep
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();
@ -142,7 +142,7 @@ const char *RecordsDynamicFunctions::GetRecordName(unsigned int index) noexcept
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();
@ -152,7 +152,7 @@ const char *RecordsDynamicFunctions::GetRecordModel(unsigned int index) noexcept
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();
@ -162,7 +162,7 @@ const char *RecordsDynamicFunctions::GetRecordIcon(unsigned int index) noexcept
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();
@ -172,7 +172,7 @@ const char *RecordsDynamicFunctions::GetRecordScript(unsigned int index) noexcep
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();
@ -188,7 +188,7 @@ const char *RecordsDynamicFunctions::GetRecordEnchantmentId(unsigned int index)
return "invalid";
}
int RecordsDynamicFunctions::GetRecordEnchantmentCharge(unsigned int index) noexcept
extern "C" int RecordsDynamicFunctions::GetRecordEnchantmentCharge(unsigned int index) noexcept
{
unsigned short readRecordsType = RecordsDynamicFunctions::GetRecordType();
@ -204,7 +204,7 @@ int RecordsDynamicFunctions::GetRecordEnchantmentCharge(unsigned int index) noex
return -1;
}
int RecordsDynamicFunctions::GetRecordAutoCalc(unsigned int index) noexcept
extern "C" int RecordsDynamicFunctions::GetRecordAutoCalc(unsigned int index) noexcept
{
unsigned short readRecordsType = RecordsDynamicFunctions::GetRecordType();
@ -216,7 +216,7 @@ int RecordsDynamicFunctions::GetRecordAutoCalc(unsigned int index) noexcept
return -1;
}
int RecordsDynamicFunctions::GetRecordCharge(unsigned int index) noexcept
extern "C" int RecordsDynamicFunctions::GetRecordCharge(unsigned int index) noexcept
{
unsigned short readRecordsType = RecordsDynamicFunctions::GetRecordType();
@ -226,7 +226,7 @@ int RecordsDynamicFunctions::GetRecordCharge(unsigned int index) noexcept
return -1;
}
int RecordsDynamicFunctions::GetRecordCost(unsigned int index) noexcept
extern "C" int RecordsDynamicFunctions::GetRecordCost(unsigned int index) noexcept
{
unsigned short readRecordsType = RecordsDynamicFunctions::GetRecordType();
@ -238,7 +238,7 @@ int RecordsDynamicFunctions::GetRecordCost(unsigned int index) noexcept
return -1;
}
int RecordsDynamicFunctions::GetRecordFlags(unsigned int index) noexcept
extern "C" int RecordsDynamicFunctions::GetRecordFlags(unsigned int index) noexcept
{
unsigned short readRecordsType = RecordsDynamicFunctions::GetRecordType();
@ -248,7 +248,7 @@ int RecordsDynamicFunctions::GetRecordFlags(unsigned int index) noexcept
return -1;
}
int RecordsDynamicFunctions::GetRecordValue(unsigned int index) noexcept
extern "C" int RecordsDynamicFunctions::GetRecordValue(unsigned int index) noexcept
{
unsigned short readRecordsType = RecordsDynamicFunctions::GetRecordType();
@ -258,7 +258,7 @@ int RecordsDynamicFunctions::GetRecordValue(unsigned int index) noexcept
return -1;
}
double RecordsDynamicFunctions::GetRecordWeight(unsigned int index) noexcept
extern "C" double RecordsDynamicFunctions::GetRecordWeight(unsigned int index) noexcept
{
unsigned short readRecordsType = RecordsDynamicFunctions::GetRecordType();
@ -268,52 +268,52 @@ double RecordsDynamicFunctions::GetRecordWeight(unsigned int index) noexcept
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
void RecordsDynamicFunctions::SetRecordType(unsigned int type) noexcept
extern "C" void RecordsDynamicFunctions::SetRecordType(unsigned int type) noexcept
{
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;
@ -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);
}
void RecordsDynamicFunctions::SetRecordBaseId(const char* baseId) noexcept
extern "C" void RecordsDynamicFunctions::SetRecordBaseId(const char* baseId) noexcept
{
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);
}
void RecordsDynamicFunctions::SetRecordInventoryBaseId(const char* inventoryBaseId) noexcept
extern "C" void RecordsDynamicFunctions::SetRecordInventoryBaseId(const char* inventoryBaseId) noexcept
{
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);
}
void RecordsDynamicFunctions::SetRecordSubtype(unsigned int subtype) noexcept
extern "C" void RecordsDynamicFunctions::SetRecordSubtype(unsigned int subtype) noexcept
{
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -407,7 +407,7 @@ void RecordsDynamicFunctions::SetRecordSubtype(unsigned int subtype) noexcept
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;
@ -438,7 +438,7 @@ void RecordsDynamicFunctions::SetRecordName(const char* name) noexcept
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;
@ -467,7 +467,7 @@ void RecordsDynamicFunctions::SetRecordModel(const char* model) noexcept
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;
@ -492,7 +492,7 @@ void RecordsDynamicFunctions::SetRecordIcon(const char* icon) noexcept
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;
@ -521,7 +521,7 @@ void RecordsDynamicFunctions::SetRecordScript(const char* script) noexcept
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;
@ -542,7 +542,7 @@ void RecordsDynamicFunctions::SetRecordEnchantmentId(const char* enchantmentId)
tempOverrides.hasEnchantmentId = true;
}
void RecordsDynamicFunctions::SetRecordEnchantmentCharge(int enchantmentCharge) noexcept
extern "C" void RecordsDynamicFunctions::SetRecordEnchantmentCharge(int enchantmentCharge) noexcept
{
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -563,7 +563,7 @@ void RecordsDynamicFunctions::SetRecordEnchantmentCharge(int enchantmentCharge)
tempOverrides.hasEnchantmentCharge = true;
}
void RecordsDynamicFunctions::SetRecordAutoCalc(int autoCalc) noexcept
extern "C" void RecordsDynamicFunctions::SetRecordAutoCalc(int autoCalc) noexcept
{
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -593,7 +593,7 @@ void RecordsDynamicFunctions::SetRecordAutoCalc(int autoCalc) noexcept
tempOverrides.hasAutoCalc = true;
}
void RecordsDynamicFunctions::SetRecordCharge(int charge) noexcept
extern "C" void RecordsDynamicFunctions::SetRecordCharge(int charge) noexcept
{
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -608,7 +608,7 @@ void RecordsDynamicFunctions::SetRecordCharge(int charge) noexcept
tempOverrides.hasCharge = true;
}
void RecordsDynamicFunctions::SetRecordCost(int cost) noexcept
extern "C" void RecordsDynamicFunctions::SetRecordCost(int cost) noexcept
{
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -625,7 +625,7 @@ void RecordsDynamicFunctions::SetRecordCost(int cost) noexcept
tempOverrides.hasCost = true;
}
void RecordsDynamicFunctions::SetRecordFlags(int flags) noexcept
extern "C" void RecordsDynamicFunctions::SetRecordFlags(int flags) noexcept
{
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -646,7 +646,7 @@ void RecordsDynamicFunctions::SetRecordFlags(int flags) noexcept
tempOverrides.hasFlags = true;
}
void RecordsDynamicFunctions::SetRecordValue(int value) noexcept
extern "C" void RecordsDynamicFunctions::SetRecordValue(int value) noexcept
{
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -671,7 +671,7 @@ void RecordsDynamicFunctions::SetRecordValue(int value) noexcept
tempOverrides.hasValue = true;
}
void RecordsDynamicFunctions::SetRecordWeight(double weight) noexcept
extern "C" void RecordsDynamicFunctions::SetRecordWeight(double weight) noexcept
{
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -696,7 +696,7 @@ void RecordsDynamicFunctions::SetRecordWeight(double weight) noexcept
tempOverrides.hasWeight = true;
}
void RecordsDynamicFunctions::SetRecordArmorRating(int armorRating) noexcept
extern "C" void RecordsDynamicFunctions::SetRecordArmorRating(int armorRating) noexcept
{
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -711,7 +711,7 @@ void RecordsDynamicFunctions::SetRecordArmorRating(int armorRating) noexcept
tempOverrides.hasArmorRating = true;
}
void RecordsDynamicFunctions::SetRecordHealth(int health) noexcept
extern "C" void RecordsDynamicFunctions::SetRecordHealth(int health) noexcept
{
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -732,7 +732,7 @@ void RecordsDynamicFunctions::SetRecordHealth(int health) noexcept
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;
@ -750,7 +750,7 @@ void RecordsDynamicFunctions::SetRecordDamageChop(unsigned int minDamage, unsign
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;
@ -768,7 +768,7 @@ void RecordsDynamicFunctions::SetRecordDamageSlash(unsigned int minDamage, unsig
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;
@ -786,7 +786,7 @@ void RecordsDynamicFunctions::SetRecordDamageThrust(unsigned int minDamage, unsi
tempOverrides.hasDamageThrust = true;
}
void RecordsDynamicFunctions::SetRecordReach(double reach) noexcept
extern "C" void RecordsDynamicFunctions::SetRecordReach(double reach) noexcept
{
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -801,7 +801,7 @@ void RecordsDynamicFunctions::SetRecordReach(double reach) noexcept
tempOverrides.hasReach = true;
}
void RecordsDynamicFunctions::SetRecordSpeed(double speed) noexcept
extern "C" void RecordsDynamicFunctions::SetRecordSpeed(double speed) noexcept
{
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -816,7 +816,7 @@ void RecordsDynamicFunctions::SetRecordSpeed(double speed) noexcept
tempOverrides.hasSpeed = true;
}
void RecordsDynamicFunctions::SetRecordKeyState(bool keyState) noexcept
extern "C" void RecordsDynamicFunctions::SetRecordKeyState(bool keyState) noexcept
{
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -831,7 +831,7 @@ void RecordsDynamicFunctions::SetRecordKeyState(bool keyState) noexcept
tempOverrides.hasKeyState = true;
}
void RecordsDynamicFunctions::SetRecordScrollState(bool scrollState) noexcept
extern "C" void RecordsDynamicFunctions::SetRecordScrollState(bool scrollState) noexcept
{
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -846,7 +846,7 @@ void RecordsDynamicFunctions::SetRecordScrollState(bool scrollState) noexcept
tempOverrides.hasScrollState = true;
}
void RecordsDynamicFunctions::SetRecordSkillId(int skillId) noexcept
extern "C" void RecordsDynamicFunctions::SetRecordSkillId(int skillId) noexcept
{
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -861,7 +861,7 @@ void RecordsDynamicFunctions::SetRecordSkillId(int skillId) noexcept
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;
@ -876,7 +876,7 @@ void RecordsDynamicFunctions::SetRecordText(const char* text) noexcept
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;
@ -891,7 +891,7 @@ void RecordsDynamicFunctions::SetRecordHair(const char* hair) noexcept
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;
@ -906,7 +906,7 @@ void RecordsDynamicFunctions::SetRecordHead(const char* head) noexcept
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;
@ -923,7 +923,7 @@ void RecordsDynamicFunctions::SetRecordGender(unsigned int gender) noexcept
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;
@ -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);
}
void RecordsDynamicFunctions::SetRecordClass(const char* charClass) noexcept
extern "C" void RecordsDynamicFunctions::SetRecordClass(const char* charClass) noexcept
{
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);
}
void RecordsDynamicFunctions::SetRecordFaction(const char* faction) noexcept
extern "C" void RecordsDynamicFunctions::SetRecordFaction(const char* faction) noexcept
{
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -958,7 +958,7 @@ void RecordsDynamicFunctions::SetRecordFaction(const char* faction) noexcept
tempOverrides.hasFaction = true;
}
void RecordsDynamicFunctions::SetRecordLevel(int level) noexcept
extern "C" void RecordsDynamicFunctions::SetRecordLevel(int level) noexcept
{
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -975,7 +975,7 @@ void RecordsDynamicFunctions::SetRecordLevel(int level) noexcept
tempOverrides.hasLevel = true;
}
void RecordsDynamicFunctions::SetRecordMagicka(int magicka) noexcept
extern "C" void RecordsDynamicFunctions::SetRecordMagicka(int magicka) noexcept
{
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -992,7 +992,7 @@ void RecordsDynamicFunctions::SetRecordMagicka(int magicka) noexcept
tempOverrides.hasMagicka = true;
}
void RecordsDynamicFunctions::SetRecordFatigue(int fatigue) noexcept
extern "C" void RecordsDynamicFunctions::SetRecordFatigue(int fatigue) noexcept
{
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -1009,7 +1009,7 @@ void RecordsDynamicFunctions::SetRecordFatigue(int fatigue) noexcept
tempOverrides.hasFatigue = true;
}
void RecordsDynamicFunctions::SetRecordAIFight(int aiFight) noexcept
extern "C" void RecordsDynamicFunctions::SetRecordAIFight(int aiFight) noexcept
{
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -1026,7 +1026,7 @@ void RecordsDynamicFunctions::SetRecordAIFight(int aiFight) noexcept
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;
@ -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);
}
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;
@ -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);
}
void RecordsDynamicFunctions::SetRecordEffectId(unsigned int effectId) noexcept
extern "C" void RecordsDynamicFunctions::SetRecordEffectId(unsigned int effectId) noexcept
{
tempEffect.mEffectID = effectId;
}
void RecordsDynamicFunctions::SetRecordEffectAttribute(int attributeId) noexcept
extern "C" void RecordsDynamicFunctions::SetRecordEffectAttribute(int attributeId) noexcept
{
tempEffect.mAttribute = attributeId;
}
void RecordsDynamicFunctions::SetRecordEffectSkill(int skillId) noexcept
extern "C" void RecordsDynamicFunctions::SetRecordEffectSkill(int skillId) noexcept
{
tempEffect.mSkill = skillId;
}
void RecordsDynamicFunctions::SetRecordEffectRangeType(unsigned int rangeType) noexcept
extern "C" void RecordsDynamicFunctions::SetRecordEffectRangeType(unsigned int rangeType) noexcept
{
tempEffect.mRange = rangeType;
}
void RecordsDynamicFunctions::SetRecordEffectArea(int area) noexcept
extern "C" void RecordsDynamicFunctions::SetRecordEffectArea(int area) noexcept
{
tempEffect.mArea = area;
}
void RecordsDynamicFunctions::SetRecordEffectDuration(int duration) noexcept
extern "C" void RecordsDynamicFunctions::SetRecordEffectDuration(int duration) noexcept
{
tempEffect.mDuration = duration;
}
void RecordsDynamicFunctions::SetRecordEffectMagnitudeMax(int magnitudeMax) noexcept
extern "C" void RecordsDynamicFunctions::SetRecordEffectMagnitudeMax(int magnitudeMax) noexcept
{
tempEffect.mMagnMax = magnitudeMax;
}
void RecordsDynamicFunctions::SetRecordEffectMagnitudeMin(int magnitudeMin) noexcept
extern "C" void RecordsDynamicFunctions::SetRecordEffectMagnitudeMin(int magnitudeMin) noexcept
{
tempEffect.mMagnMin = magnitudeMin;
}
void RecordsDynamicFunctions::SetRecordBodyPartType(unsigned int partType) noexcept
extern "C" void RecordsDynamicFunctions::SetRecordBodyPartType(unsigned int partType) noexcept
{
tempBodyPart.mPart = partType;
}
void RecordsDynamicFunctions::SetRecordBodyPartIdForMale(const char* partId) noexcept
extern "C" void RecordsDynamicFunctions::SetRecordBodyPartIdForMale(const char* partId) noexcept
{
tempBodyPart.mMale = partId;
}
void RecordsDynamicFunctions::SetRecordBodyPartIdForFemale(const char* partId) noexcept
extern "C" void RecordsDynamicFunctions::SetRecordBodyPartIdForFemale(const char* partId) noexcept
{
tempBodyPart.mFemale = partId;
}
void RecordsDynamicFunctions::SetRecordInventoryItemId(const char* itemId) noexcept
extern "C" void RecordsDynamicFunctions::SetRecordInventoryItemId(const char* itemId) noexcept
{
tempInventoryItem.refId = itemId;
}
void RecordsDynamicFunctions::SetRecordInventoryItemCount(unsigned int count) noexcept
extern "C" void RecordsDynamicFunctions::SetRecordInventoryItemCount(unsigned int count) noexcept
{
tempInventoryItem.count = count;
}
void RecordsDynamicFunctions::AddRecord() noexcept
extern "C" void RecordsDynamicFunctions::AddRecord() noexcept
{
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -1197,7 +1197,7 @@ void RecordsDynamicFunctions::AddRecord() noexcept
tempOverrides = {};
}
void RecordsDynamicFunctions::AddRecordEffect() noexcept
extern "C" void RecordsDynamicFunctions::AddRecordEffect() noexcept
{
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -1212,7 +1212,7 @@ void RecordsDynamicFunctions::AddRecordEffect() noexcept
tempEffect = {};
}
void RecordsDynamicFunctions::AddRecordBodyPart() noexcept
extern "C" void RecordsDynamicFunctions::AddRecordBodyPart() noexcept
{
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -1225,7 +1225,7 @@ void RecordsDynamicFunctions::AddRecordBodyPart() noexcept
tempBodyPart = {};
}
void RecordsDynamicFunctions::AddRecordInventoryItem() noexcept
extern "C" void RecordsDynamicFunctions::AddRecordInventoryItem() noexcept
{
unsigned short writeRecordsType = WorldstateFunctions::writeWorldstate.recordsType;
@ -1238,7 +1238,7 @@ void RecordsDynamicFunctions::AddRecordInventoryItem() noexcept
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;
GET_PLAYER(pid, player, );

@ -3,6 +3,8 @@
#include "../Types.hpp"
#include <Script/Platform.hpp>
#define RECORDSDYNAMICAPI \
{"ClearRecords", RecordsDynamicFunctions::ClearRecords},\
\
@ -110,16 +112,14 @@
\
{"SendRecordDynamic", RecordsDynamicFunctions::SendRecordDynamic}
class RecordsDynamicFunctions
namespace RecordsDynamicFunctions
{
public:
/**
* \brief Clear the data from the records stored on the server.
*
* \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.
@ -127,14 +127,14 @@ public:
* \return The type of records (0 for SPELL, 1 for POTION, 2 for ENCHANTMENT,
* 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.
*
* \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
@ -143,7 +143,7 @@ public:
* \param recordIndex The index of the record.
* \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
@ -152,7 +152,7 @@ public:
* \param index The index 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
@ -162,7 +162,7 @@ public:
* \param index The index 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
@ -171,7 +171,7 @@ public:
* \param index The index 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
@ -180,7 +180,7 @@ public:
* \param index The index 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
@ -189,7 +189,7 @@ public:
* \param index The index 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
@ -198,7 +198,7 @@ public:
* \param index The index 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
@ -207,7 +207,7 @@ public:
* \param index The index 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
@ -216,7 +216,7 @@ public:
* \param index The index 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
@ -225,7 +225,7 @@ public:
* \param index The index 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
@ -234,7 +234,7 @@ public:
* \param index The index 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
@ -243,7 +243,7 @@ public:
* \param index The index 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
@ -252,7 +252,7 @@ public:
* \param index The index 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
@ -261,7 +261,7 @@ public:
* \param index The index of the record.
* \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
@ -270,7 +270,7 @@ public:
* \param index The index 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
@ -279,7 +279,7 @@ public:
* \param index The index 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
@ -289,7 +289,7 @@ public:
* \param effectIndex The index 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
@ -299,7 +299,7 @@ public:
* \param effectIndex The index of 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
@ -309,7 +309,7 @@ public:
* \param effectIndex The index of 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
@ -319,7 +319,7 @@ public:
* \param effectIndex The index 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
@ -329,7 +329,7 @@ public:
* \param effectIndex The index 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
@ -339,7 +339,7 @@ public:
* \param effectIndex The index 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
@ -349,7 +349,7 @@ public:
* \param effectIndex The index 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
@ -359,7 +359,7 @@ public:
* \param effectIndex The index 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
@ -368,7 +368,7 @@ public:
* \param type The type of records.
* \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
@ -377,7 +377,7 @@ public:
* \param id The id of the record.
* \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
@ -387,7 +387,7 @@ public:
* \param baseId The baseId of the record.
* \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
@ -397,7 +397,7 @@ public:
* \param inventoryBaseId The inventoryBaseId of the record.
* \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
@ -406,7 +406,7 @@ public:
* \param type The spell type.
* \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
@ -415,7 +415,7 @@ public:
* \param name The name of the record.
* \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
@ -424,7 +424,7 @@ public:
* \param model The model of the record.
* \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
@ -433,7 +433,7 @@ public:
* \param icon The icon of the record.
* \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
@ -442,7 +442,7 @@ public:
* \param script The script of the record.
* \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
@ -451,7 +451,7 @@ public:
* \param enchantmentId The enchantment id of the record.
* \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
@ -460,7 +460,7 @@ public:
* \param enchantmentCharge The enchantmentCharge of the record.
* \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
@ -469,7 +469,7 @@ public:
* \param autoCalc The auto-calculation flag value of the record.
* \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
@ -478,7 +478,7 @@ public:
* \param charge The charge of the record.
* \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
@ -487,7 +487,7 @@ public:
* \param cost The cost of the record.
* \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
@ -496,7 +496,7 @@ public:
* \param flags The flags of the record.
* \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
@ -505,7 +505,7 @@ public:
* \param value The value of the record.
* \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
@ -514,7 +514,7 @@ public:
* \param weight The weight of the record.
* \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
@ -523,7 +523,7 @@ public:
* \param armorRating The armor rating of the record.
* \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
@ -532,7 +532,7 @@ public:
* \param health The health of the record.
* \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
@ -542,7 +542,7 @@ public:
* \param maxDamage The maximum damage of the record.
* \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
@ -552,7 +552,7 @@ public:
* \param maxDamage The maximum damage of the record.
* \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
@ -562,7 +562,7 @@ public:
* \param maxDamage The maximum damage of the record.
* \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
@ -571,7 +571,7 @@ public:
* \param reach The reach of the record.
* \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
@ -580,7 +580,7 @@ public:
* \param speed The speed of the record.
* \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
@ -591,7 +591,7 @@ public:
* \param keyState Whether the record is a key.
* \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
@ -602,7 +602,7 @@ public:
* \param scrollState Whether the record is a scroll.
* \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
@ -611,7 +611,7 @@ public:
* \param skillId The skill ID of the record.
* \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
@ -620,7 +620,7 @@ public:
* \param text The text of the record.
* \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
@ -629,7 +629,7 @@ public:
* \param hair The hair of the record.
* \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
@ -638,7 +638,7 @@ public:
* \param hair The head of the record.
* \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
@ -647,7 +647,7 @@ public:
* \param hair The race of the record.
* \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
@ -656,7 +656,7 @@ public:
* \param hair The race of the record.
* \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
@ -665,7 +665,7 @@ public:
* \param hair The character class of the record.
* \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
@ -674,7 +674,7 @@ public:
* \param faction The faction of the record.
* \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
@ -683,7 +683,7 @@ public:
* \param level The level of the record.
* \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
@ -692,7 +692,7 @@ public:
* \param magicka The magicka of the record.
* \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
@ -701,7 +701,7 @@ public:
* \param fatigue The fatigue of the record.
* \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
@ -710,7 +710,7 @@ public:
* \param aiFight The AI fight value of the record.
* \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.
@ -722,7 +722,7 @@ public:
* \param id The id of the record.
* \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
@ -735,7 +735,7 @@ public:
* \param enchantmentId The enchantment id of the record.
* \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.
@ -743,7 +743,7 @@ public:
* \param effectId The ID of the effect.
* \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
@ -752,7 +752,7 @@ public:
* \param attributeId The ID of the attribute.
* \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
@ -761,7 +761,7 @@ public:
* \param skillId The ID of the skill.
* \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
@ -770,7 +770,7 @@ public:
* \param rangeType The range type of the effect.
* \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.
@ -778,7 +778,7 @@ public:
* \param area The area of the effect.
* \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.
@ -786,7 +786,7 @@ public:
* \param duration The duration of the effect.
* \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.
@ -794,7 +794,7 @@ public:
* \param magnitudeMax The maximum magnitude of the effect.
* \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.
@ -802,7 +802,7 @@ public:
* \param magnitudeMin The minimum magnitude of the effect.
* \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.
@ -810,7 +810,7 @@ public:
* \param partType The type of the body part.
* \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
@ -819,7 +819,7 @@ public:
* \param partId The id of the body part.
* \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
@ -828,7 +828,7 @@ public:
* \param partId The id of the body part.
* \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.
@ -836,7 +836,7 @@ public:
* \param partId The id of the inventory item.
* \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.
@ -844,7 +844,7 @@ public:
* \param count The count of the inventory item.
* \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
@ -855,7 +855,7 @@ public:
*
* \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
@ -866,7 +866,7 @@ public:
*
* \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
@ -877,7 +877,7 @@ public:
*
* \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
@ -891,7 +891,7 @@ public:
*
* \return void
*/
static void AddRecordInventoryItem() noexcept;
EXPORT_APIFUNCTION void CDECL AddRecordInventoryItem() noexcept;
/**
* \brief Send a RecordDynamic packet with the current specified record type.
@ -903,8 +903,7 @@ public:
* to the packet (false by default).
* \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

@ -1,6 +1,5 @@
#include "Server.hpp"
#include <components/misc/stringops.hpp>
#include <components/openmw-mp/NetworkMessages.hpp>
#include <components/openmw-mp/Log.hpp>
#include <components/openmw-mp/Version.hpp>
@ -10,25 +9,13 @@
#include <apps/openmw-mp/MasterClient.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
{
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
extern "C" void ServerFunctions::StopServer(int code) noexcept
{
mwmp::Networking::getPtr()->stopServer(code);
}
void ServerFunctions::Kick(unsigned short pid) noexcept
extern "C" void ServerFunctions::Kick(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player,);
@ -38,79 +25,45 @@ void ServerFunctions::Kick(unsigned short pid) noexcept
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);
}
void ServerFunctions::UnbanAddress(const char *ipAddress) noexcept
extern "C" void ServerFunctions::UnbanAddress(const char *ipAddress) noexcept
{
mwmp::Networking::getPtr()->unbanAddress(ipAddress);
}
bool ServerFunctions::DoesFilePathExist(const char *filePath) 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
extern "C" const char *ServerFunctions::GetOperatingSystemType() noexcept
{
return Utils::getOperatingSystemType().c_str();
}
const char *ServerFunctions::GetArchitectureType() noexcept
extern "C" const char *ServerFunctions::GetArchitectureType() noexcept
{
return Utils::getArchitectureType().c_str();
}
const char *ServerFunctions::GetServerVersion() noexcept
extern "C" const char *ServerFunctions::GetServerVersion() noexcept
{
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);
return version.c_str();
}
int ServerFunctions::GetAvgPing(unsigned short pid) noexcept
extern "C" int ServerFunctions::GetAvgPing(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, -1);
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;
GET_PLAYER(pid, player, "");
@ -118,112 +71,100 @@ const char *ServerFunctions::GetIP(unsigned short pid) noexcept
return addr.ToString(false);
}
unsigned short ServerFunctions::GetPort() noexcept
extern "C" unsigned short ServerFunctions::GetPort() noexcept
{
return mwmp::Networking::get().getPort();
}
unsigned int ServerFunctions::GetMaxPlayers() noexcept
extern "C" unsigned int ServerFunctions::GetMaxPlayers() noexcept
{
return mwmp::Networking::get().maxConnections();
}
bool ServerFunctions::HasPassword() noexcept
extern "C" bool ServerFunctions::HasPassword() noexcept
{
return mwmp::Networking::get().isPassworded();
}
bool ServerFunctions::GetPluginEnforcementState() noexcept
extern "C" bool ServerFunctions::GetPluginEnforcementState() noexcept
{
return mwmp::Networking::getPtr()->getPluginEnforcementState();
}
bool ServerFunctions::GetScriptErrorIgnoringState() noexcept
extern "C" bool ServerFunctions::GetScriptErrorIgnoringState() noexcept
{
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())
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())
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);
}
void ServerFunctions::SetPluginEnforcementState(bool state) noexcept
extern "C" void ServerFunctions::SetPluginEnforcementState(bool state) noexcept
{
mwmp::Networking::getPtr()->setPluginEnforcementState(state);
}
void ServerFunctions::SetScriptErrorIgnoringState(bool state) noexcept
extern "C" void ServerFunctions::SetScriptErrorIgnoringState(bool state) noexcept
{
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();
if (mc)
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();
if (mc)
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 it = std::find_if(samples.begin(), samples.end(), [&dataFilename](mwmp::PacketPreInit::PluginPair &item) {
return item.first == dataFilename;
auto it = std::find_if(samples.begin(), samples.end(), [&pluginName](mwmp::PacketPreInit::PluginPair &item) {
return item.first == pluginName;
});
if (it != samples.end())
it->second.push_back((unsigned) std::stoul(checksumString));
it->second.push_back((unsigned) std::stoul(hashStr));
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);
checksumList.push_back(checksum);
hash = (unsigned) std::stoul(hashStr);
hashList.push_back(hash);
}
samples.emplace_back(dataFilename, checksumList);
samples.emplace_back(pluginName, hashList);
auto mclient = mwmp::Networking::getPtr()->getMasterClient();
if (mclient)
mclient->PushPlugin({dataFilename, checksum});
mclient->PushPlugin({pluginName, hash});
}
}
// All methods below are deprecated versions of methods from above
bool ServerFunctions::DoesFileExist(const char *filePath) noexcept
{
return DoesFilePathExist(filePath);
}
const char* ServerFunctions::GetModDir() noexcept
extern "C" const char* ServerFunctions::GetModDir() noexcept
{
return GetDataPath();
}
void ServerFunctions::AddPluginHash(const char *pluginName, const char *checksumString) noexcept
{
AddDataFileRequirement(pluginName, checksumString);
return Script::GetModDir();
}

@ -3,81 +3,48 @@
#include "../Types.hpp"
#include <Script/Platform.hpp>
#include <Script/Platform.hpp>
#define SERVERAPI \
{"LogMessage", ServerFunctions::LogMessage},\
{"LogAppend", ServerFunctions::LogAppend},\
\
{"StopServer", ServerFunctions::StopServer},\
{"StopServer", ServerFunctions::StopServer},\
\
{"Kick", ServerFunctions::Kick},\
{"BanAddress", ServerFunctions::BanAddress},\
{"UnbanAddress", ServerFunctions::UnbanAddress},\
{"Kick", ServerFunctions::Kick},\
{"BanAddress", ServerFunctions::BanAddress},\
{"UnbanAddress", ServerFunctions::UnbanAddress},\
\
{"DoesFilePathExist", ServerFunctions::DoesFilePathExist},\
{"GetCaseInsensitiveFilename", ServerFunctions::GetCaseInsensitiveFilename},\
{"GetDataPath", ServerFunctions::GetDataPath},\
{"GetMillisecondsSinceServerStart", ServerFunctions::GetMillisecondsSinceServerStart},\
{"GetOperatingSystemType", ServerFunctions::GetOperatingSystemType},\
{"GetArchitectureType", ServerFunctions::GetArchitectureType},\
{"GetServerVersion", ServerFunctions::GetServerVersion},\
{"GetProtocolVersion", ServerFunctions::GetProtocolVersion},\
{"GetAvgPing", ServerFunctions::GetAvgPing},\
{"GetIP", ServerFunctions::GetIP},\
{"GetMaxPlayers", ServerFunctions::GetMaxPlayers},\
{"GetPort", ServerFunctions::GetPort},\
{"HasPassword", ServerFunctions::HasPassword},\
{"GetPluginEnforcementState", ServerFunctions::GetPluginEnforcementState},\
{"GetScriptErrorIgnoringState", ServerFunctions::GetScriptErrorIgnoringState},\
{"GetOperatingSystemType", ServerFunctions::GetOperatingSystemType},\
{"GetArchitectureType", ServerFunctions::GetArchitectureType},\
{"GetServerVersion", ServerFunctions::GetServerVersion},\
{"GetProtocolVersion", ServerFunctions::GetProtocolVersion},\
{"GetAvgPing", ServerFunctions::GetAvgPing},\
{"GetIP", ServerFunctions::GetIP},\
{"GetMaxPlayers", ServerFunctions::GetMaxPlayers},\
{"GetPort", ServerFunctions::GetPort},\
{"HasPassword", ServerFunctions::HasPassword},\
{"GetPluginEnforcementState", ServerFunctions::GetPluginEnforcementState},\
{"GetScriptErrorIgnoringState", ServerFunctions::GetScriptErrorIgnoringState},\
\
{"SetGameMode", ServerFunctions::SetGameMode},\
{"SetHostname", ServerFunctions::SetHostname},\
{"SetServerPassword", ServerFunctions::SetServerPassword},\
{"SetPluginEnforcementState", ServerFunctions::SetPluginEnforcementState},\
{"SetScriptErrorIgnoringState", ServerFunctions::SetScriptErrorIgnoringState},\
{"SetRuleString", ServerFunctions::SetRuleString},\
{"SetRuleValue", ServerFunctions::SetRuleValue},\
\
{"AddDataFileRequirement", ServerFunctions::AddDataFileRequirement},\
\
{"DoesFileExist", ServerFunctions::DoesFileExist},\
{"GetModDir", ServerFunctions::GetModDir},\
{"AddPluginHash", ServerFunctions::AddPluginHash}
class ServerFunctions
{"SetGameMode", ServerFunctions::SetGameMode},\
{"SetHostname", ServerFunctions::SetHostname},\
{"SetServerPassword", ServerFunctions::SetServerPassword},\
{"SetPluginEnforcementState", ServerFunctions::SetPluginEnforcementState},\
{"SetScriptErrorIgnoringState", ServerFunctions::SetScriptErrorIgnoringState},\
{"SetRuleString", ServerFunctions::SetRuleString},\
{"SetRuleValue", ServerFunctions::SetRuleValue},\
{"AddPluginHash", ServerFunctions::AddPluginHash},\
{"GetModDir", ServerFunctions::GetModDir}
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.
*
* \param code The shutdown code.
* \return void
*/
static void StopServer(int code) noexcept;
EXPORT_APIFUNCTION void CDECL StopServer(int code) noexcept;
/**
* \brief Kick a certain player from the server.
@ -85,7 +52,7 @@ public:
* \param pid The player ID.
* \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.
@ -93,7 +60,7 @@ public:
* \param ipAddress The IP address.
* \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.
@ -101,42 +68,7 @@ public:
* \param ipAddress The IP address.
* \return void
*/
static void 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;
EXPORT_APIFUNCTION void CDECL UnbanAddress(const char *ipAddress) noexcept;
/**
* \brief Get the type of the operating system used by the server.
@ -145,7 +77,7 @@ public:
*
* \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.
@ -154,21 +86,21 @@ public:
*
* \return The architecture type.
*/
static const char *GetArchitectureType() noexcept;
EXPORT_APIFUNCTION const char *CDECL GetArchitectureType() noexcept;
/**
* \brief Get the TES3MP version of the server.
*
* \return The server version.
*/
static const char *GetServerVersion() noexcept;
EXPORT_APIFUNCTION const char *CDECL GetServerVersion() noexcept;
/**
* \brief Get the protocol version of the server.
*
* \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.
@ -176,7 +108,7 @@ public:
* \param pid The player ID.
* \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.
@ -184,28 +116,28 @@ public:
* \param pid The player ID.
* \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.
*
* \return The port.
* \return Port
*/
static unsigned short GetPort() noexcept;
EXPORT_APIFUNCTION unsigned short CDECL GetPort() noexcept;
/**
* \brief Get the maximum number of 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.
*
* @return
*/
static bool HasPassword() noexcept;
EXPORT_APIFUNCTION bool CDECL HasPassword() noexcept;
/**
* \brief Get the plugin enforcement state of the server.
@ -214,7 +146,7 @@ public:
*
* \return The enforcement state.
*/
static bool GetPluginEnforcementState() noexcept;
EXPORT_APIFUNCTION bool CDECL GetPluginEnforcementState() noexcept;
/**
* \brief Get the script error ignoring state of the server.
@ -223,7 +155,7 @@ public:
*
* \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.
@ -231,7 +163,7 @@ public:
* \param name The new game mode.
* \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.
@ -239,7 +171,7 @@ public:
* \param name The new name.
* \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.
@ -247,7 +179,7 @@ public:
* \param password The password.
* \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.
@ -257,7 +189,7 @@ public:
* \param state The new enforcement state.
* \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.
@ -269,7 +201,7 @@ public:
* \param state The new script error ignoring state.
* \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.
@ -278,7 +210,7 @@ public:
* \param value The string value of the rule.
* \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.
@ -287,27 +219,16 @@ public:
* \param value The numerical value of the rule.
* \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
* that connecting clients need to match.
*
* 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.
* \brief Adds plugins to the internal server structure to validate players.
* @param pluginName Name with extension of the plugin or master file.
* @param hash Hash string
*/
static void AddDataFileRequirement(const char *dataFilename, const char *checksumString) noexcept;
// All methods below are deprecated versions of methods from above
EXPORT_APIFUNCTION void CDECL AddPluginHash(const char *pluginName, const char *hash) noexcept;
static bool DoesFileExist(const char *filePath) noexcept;
static const char *GetModDir() noexcept;
static void AddPluginHash(const char *pluginName, const char *checksumString) noexcept;
};
EXPORT_APIFUNCTION const char *CDECL GetModDir() noexcept;
}
#endif //OPENMW_SERVERAPI_HPP

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

@ -3,6 +3,8 @@
#include "../Types.hpp"
#include <Script/Platform.hpp>
#define SETTINGSAPI \
{"SetDifficulty", SettingFunctions::SetDifficulty},\
{"SetEnforcedLogLevel", SettingFunctions::SetEnforcedLogLevel},\
@ -15,10 +17,8 @@
\
{"SendSettings", SettingFunctions::SendSettings}
class SettingFunctions
namespace SettingFunctions
{
public:
/**
* \brief Set the difficulty for a player.
*
@ -29,7 +29,7 @@ public:
* \param difficulty The difficulty.
* \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.
@ -47,7 +47,7 @@ public:
* \param enforcedLogLevel The enforced log level.
* \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.
@ -59,7 +59,7 @@ public:
* \param physicsFramerate The physics framerate.
* \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.
@ -71,7 +71,7 @@ public:
* \param state The console permission state.
* \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.
@ -83,7 +83,7 @@ public:
* \param state The resting permission state.
* \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.
@ -95,7 +95,7 @@ public:
* \param state The resting permission state.
* \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.
@ -107,7 +107,7 @@ public:
* \param state The waiting permission state.
* \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.
@ -115,7 +115,7 @@ public:
* \param pid The player ID to send it to.
* \return void
*/
static void SendSettings(unsigned short pid) noexcept;
};
EXPORT_APIFUNCTION void CDECL SendSettings(unsigned short pid) noexcept;
}
#endif //OPENMW_SETTINGSAPI_HPP

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

@ -3,6 +3,8 @@
#include "../Types.hpp"
#include <Script/Platform.hpp>
#define SHAPESHIFTAPI \
{"GetScale", ShapeshiftFunctions::GetScale},\
{"IsWerewolf", ShapeshiftFunctions::IsWerewolf},\
@ -16,17 +18,15 @@
\
{"SendShapeshift", ShapeshiftFunctions::SendShapeshift}
class ShapeshiftFunctions
namespace ShapeshiftFunctions
{
public:
/**
* \brief Get the scale of a player.
*
* \param pid The player ID.
* \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.
@ -36,7 +36,7 @@ public:
* \param pid The player ID.
* \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.
@ -44,7 +44,7 @@ public:
* \param pid The player ID.
* \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
@ -55,7 +55,7 @@ public:
* \param pid The player ID.
* \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.
@ -67,7 +67,7 @@ public:
* \param scale The new scale.
* \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.
@ -79,7 +79,7 @@ public:
* \param isWerewolf The new werewolf state.
* \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.
@ -93,7 +93,7 @@ public:
* when hovered over by others.
* \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
@ -103,7 +103,7 @@ public:
* \param displayState The creature name display state.
* \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.
@ -114,7 +114,7 @@ public:
* \param pid The player ID.
* \return void
*/
static void SendShapeshift(unsigned short pid);
};
EXPORT_APIFUNCTION void CDECL SendShapeshift(unsigned short pid);
}
#endif //OPENMW_SHAPESHIFTAPI_HPP

@ -8,7 +8,7 @@
using namespace mwmp;
void SpellFunctions::ClearSpellbookChanges(unsigned short pid) noexcept
extern "C" void SpellFunctions::ClearSpellbookChanges(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, );
@ -16,7 +16,7 @@ void SpellFunctions::ClearSpellbookChanges(unsigned short pid) noexcept
player->spellbookChanges.spells.clear();
}
unsigned int SpellFunctions::GetSpellbookChangesSize(unsigned short pid) noexcept
extern "C" unsigned int SpellFunctions::GetSpellbookChangesSize(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, 0);
@ -24,7 +24,7 @@ unsigned int SpellFunctions::GetSpellbookChangesSize(unsigned short pid) noexcep
return player->spellbookChanges.count;
}
unsigned int SpellFunctions::GetSpellbookChangesAction(unsigned short pid) noexcept
extern "C" unsigned int SpellFunctions::GetSpellbookChangesAction(unsigned short pid) noexcept
{
Player *player;
GET_PLAYER(pid, player, 0);
@ -32,7 +32,7 @@ unsigned int SpellFunctions::GetSpellbookChangesAction(unsigned short pid) noexc
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;
GET_PLAYER(pid, player, );
@ -40,7 +40,7 @@ void SpellFunctions::SetSpellbookChangesAction(unsigned short pid, unsigned char
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;
GET_PLAYER(pid, player, );
@ -51,7 +51,7 @@ void SpellFunctions::AddSpell(unsigned short pid, const char* spellId) noexcept
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;
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();
}
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;
GET_PLAYER(pid, player, );
@ -76,7 +76,7 @@ void SpellFunctions::SendSpellbookChanges(unsigned short pid, bool sendToOtherPl
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
{

@ -1,6 +1,8 @@
#ifndef OPENMW_SPELLAPI_HPP
#define OPENMW_SPELLAPI_HPP
#include <Script/Platform.hpp>
#define SPELLAPI \
{"ClearSpellbookChanges", SpellFunctions::ClearSpellbookChanges},\
\
@ -16,10 +18,8 @@
\
{"InitializeSpellbookChanges", SpellFunctions::InitializeSpellbookChanges}
class SpellFunctions
namespace SpellFunctions
{
public:
/**
* \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.
* \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.
@ -36,7 +36,7 @@ public:
* \param pid The player ID whose spellbook changes should be used.
* \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.
@ -44,7 +44,7 @@ public:
* \param pid The player ID whose spellbook changes should be used.
* \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.
@ -53,7 +53,7 @@ public:
* \param action The action (0 for SET, 1 for ADD, 2 for REMOVE).
* \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.
@ -62,7 +62,7 @@ public:
* \param spellId The spellId of the spell.
* \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.
@ -71,7 +71,7 @@ public:
* \param index The index of the spell.
* \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.
@ -83,14 +83,11 @@ public:
* to the packet (false by default).
* \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
static void InitializeSpellbookChanges(unsigned short pid) noexcept;
private:
};
EXPORT_APIFUNCTION void CDECL InitializeSpellbookChanges(unsigned short pid) noexcept;
}
#endif //OPENMW_SPELLAPI_HPP

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

@ -1,6 +1,8 @@
#ifndef OPENMW_STATAPI_HPP
#define OPENMW_STATAPI_HPP
#include <Script/Platform.hpp>
#define STATAPI \
{"GetAttributeCount", StatsFunctions::GetAttributeCount},\
{"GetSkillCount", StatsFunctions::GetSkillCount},\
@ -30,11 +32,9 @@
\
{"GetAttributeBase", StatsFunctions::GetAttributeBase},\
{"GetAttributeModifier", StatsFunctions::GetAttributeModifier},\
{"GetAttributeDamage", StatsFunctions::GetAttributeDamage},\
\
{"GetSkillBase", StatsFunctions::GetSkillBase},\
{"GetSkillModifier", StatsFunctions::GetSkillModifier},\
{"GetSkillDamage", StatsFunctions::GetSkillDamage},\
{"GetSkillProgress", StatsFunctions::GetSkillProgress},\
{"GetSkillIncrease", StatsFunctions::GetSkillIncrease},\
\
@ -60,11 +60,9 @@
\
{"SetAttributeBase", StatsFunctions::SetAttributeBase},\
{"ClearAttributeModifier", StatsFunctions::ClearAttributeModifier},\
{"SetAttributeDamage", StatsFunctions::SetAttributeDamage},\
\
{"SetSkillBase", StatsFunctions::SetSkillBase},\
{"ClearSkillModifier", StatsFunctions::ClearSkillModifier},\
{"SetSkillDamage", StatsFunctions::SetSkillDamage},\
{"SetSkillProgress", StatsFunctions::SetSkillProgress},\
{"SetSkillIncrease", StatsFunctions::SetSkillIncrease},\
\
@ -79,10 +77,8 @@
{"SendLevel", StatsFunctions::SendLevel},\
{"SendBounty", StatsFunctions::SendBounty}
class StatsFunctions
namespace StatsFunctions
{
public:
/**
* \brief Get the number of attributes.
*
@ -90,7 +86,7 @@ public:
*
* \return The number of attributes.
*/
static int GetAttributeCount() noexcept;
EXPORT_APIFUNCTION int CDECL GetAttributeCount() noexcept;
/**
* \brief Get the number of skills.
@ -99,7 +95,7 @@ public:
*
* \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.
@ -109,7 +105,7 @@ public:
* \param name The name 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.
@ -119,7 +115,7 @@ public:
* \param name The name 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.
@ -129,7 +125,7 @@ public:
* \param attributeId The ID 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.
@ -139,7 +135,7 @@ public:
* \param skillId The ID 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.
@ -147,7 +143,7 @@ public:
* \param pid The player ID.
* \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.
@ -155,7 +151,7 @@ public:
* \param pid The player ID.
* \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.
@ -163,7 +159,7 @@ public:
* \param pid The player ID.
* \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.
@ -171,7 +167,7 @@ public:
* \param pid The player ID.
* \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.
@ -179,7 +175,7 @@ public:
* \param pid The player ID.
* \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.
@ -187,7 +183,7 @@ public:
* \param pid The player ID.
* \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.
@ -195,7 +191,7 @@ public:
* \param pid The player ID.
* \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.
@ -203,7 +199,7 @@ public:
* \param pid The player ID.
* \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.
@ -211,7 +207,7 @@ public:
* \param pid The player ID.
* \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.
@ -219,7 +215,7 @@ public:
* \param pid The player ID.
* \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.
@ -227,7 +223,7 @@ public:
* \param pid The player ID.
* \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.
@ -235,7 +231,7 @@ public:
* \param pid The player ID.
* \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.
@ -243,7 +239,7 @@ public:
* \param pid The player ID.
* \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.
@ -251,7 +247,7 @@ public:
* \param pid The player ID.
* \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.
@ -260,7 +256,7 @@ public:
* \param attributeId The attribute ID.
* \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.
@ -269,17 +265,7 @@ public:
* \param attributeId The attribute ID.
* \return The modifier value of the attribute.
*/
static int 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;
EXPORT_APIFUNCTION int CDECL GetAttributeModifier(unsigned short pid, unsigned short attributeId) noexcept;
/**
* \brief Get the base value of a player's skill.
@ -288,7 +274,7 @@ public:
* \param skillId The skill ID.
* \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.
@ -297,17 +283,7 @@ public:
* \param skillId The skill ID.
* \return The modifier value of the skill.
*/
static int 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;
EXPORT_APIFUNCTION int CDECL GetSkillModifier(unsigned short pid, unsigned short skillId) noexcept;
/**
* \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.
* \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
@ -328,7 +304,7 @@ public:
* \param skillId The attribute ID.
* \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.
@ -336,7 +312,7 @@ public:
* \param pid The player ID.
* \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.
@ -345,7 +321,7 @@ public:
* \param name The new name of the player.
* \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.
@ -354,7 +330,7 @@ public:
* \param race The new race of the player.
* \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.
@ -363,7 +339,7 @@ public:
* \param head The new head mesh of the player.
* \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.
@ -372,7 +348,7 @@ public:
* \param hairstyle The new hairstyle mesh of the player.
* \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.
@ -381,7 +357,7 @@ public:
* \param state Whether the player is male.
* \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.
@ -390,7 +366,7 @@ public:
* \param name The new birthsign of the player.
* \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
@ -403,7 +379,7 @@ public:
* \param resetStats The stat reset state.
* \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.
@ -412,7 +388,7 @@ public:
* \param value The new level of the player.
* \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.
@ -421,7 +397,7 @@ public:
* \param value The new level progress of the player.
* \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.
@ -430,7 +406,7 @@ public:
* \param name The new base health of the player.
* \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.
@ -439,7 +415,7 @@ public:
* \param name The new current health of the player.
* \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.
@ -448,7 +424,7 @@ public:
* \param name The new base magicka of the player.
* \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.
@ -457,7 +433,7 @@ public:
* \param name The new current magicka of the player.
* \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.
@ -466,7 +442,7 @@ public:
* \param name The new base fatigue of the player.
* \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.
@ -475,7 +451,7 @@ public:
* \param name The new current fatigue of the player.
* \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.
@ -485,7 +461,7 @@ public:
* \param value The new base value of the player's attribute.
* \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.
@ -499,18 +475,7 @@ public:
* \param attributeId The attribute ID.
* \return void
*/
static void 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;
EXPORT_APIFUNCTION void CDECL ClearAttributeModifier(unsigned short pid, unsigned short attributeId) noexcept;
/**
* \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.
* \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.
@ -534,18 +499,7 @@ public:
* \param skillId The skill ID.
* \return void
*/
static void 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;
EXPORT_APIFUNCTION void CDECL ClearSkillModifier(unsigned short pid, unsigned short skillId) noexcept;
/**
* \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.
* \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
@ -568,7 +522,7 @@ public:
* \param value The increase in the attribute caused by skills.
* \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.
@ -577,7 +531,7 @@ public:
* \param value The new bounty.
* \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.
@ -589,7 +543,7 @@ public:
* \param endStage The new ending stage.
* \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,
@ -600,7 +554,7 @@ public:
* \param pid The player ID.
* \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,
@ -611,7 +565,7 @@ public:
* \param pid The player ID.
* \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
@ -623,7 +577,7 @@ public:
* \param pid The player ID.
* \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.
@ -633,7 +587,7 @@ public:
* \param pid The player ID.
* \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
@ -644,7 +598,7 @@ public:
* \param pid The player ID.
* \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.
@ -654,7 +608,7 @@ public:
* \param pid The player ID.
* \return void
*/
static void SendBounty(unsigned short pid) noexcept;
};
EXPORT_APIFUNCTION void CDECL SendBounty(unsigned short pid) noexcept;
}
#endif //OPENMW_STATAPI_HPP

@ -11,17 +11,17 @@
using namespace std;
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>());
}
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
{
vector<boost::any> params;
Utils::getArguments(params, args, types);
ScriptFunctions::GetArguments(params, args, types);
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);
}
void ScriptFunctions::StopTimer(int timerId) noexcept
extern "C" void TimerFunctions::StopTimer(int timerId) noexcept
{
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);
}
void ScriptFunctions::FreeTimer(int timerId) noexcept
extern "C" void TimerFunctions::FreeTimer(int timerId) noexcept
{
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);
}

@ -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

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

@ -4,6 +4,8 @@
#include <components/openmw-mp/Base/BaseWorldstate.hpp>
#include "../Types.hpp"
#include <Script/Platform.hpp>
#define WORLDSTATEAPI \
{"ReadReceivedWorldstate", WorldstateFunctions::ReadReceivedWorldstate},\
\
@ -58,19 +60,17 @@
{"ReadLastWorldstate", WorldstateFunctions::ReadLastWorldstate},\
{"CopyLastWorldstateToStore", WorldstateFunctions::CopyLastWorldstateToStore}
class WorldstateFunctions
namespace WorldstateFunctions
{
public:
static mwmp::BaseWorldstate *readWorldstate;
static mwmp::BaseWorldstate writeWorldstate;
EXPORT_APIFUNCTION mwmp::BaseWorldstate CDECL *readWorldstate;
EXPORT_APIFUNCTION mwmp::BaseWorldstate CDECL writeWorldstate;
/**
* \brief Use the last worldstate received by the server as the one being read.
*
* \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
@ -79,7 +79,7 @@ public:
*
* \return void
*/
static void CopyReceivedWorldstateToStore() noexcept;
EXPORT_APIFUNCTION void CDECL CopyReceivedWorldstateToStore() noexcept;
/**
* \brief Clear the map changes for the write-only worldstate.
@ -88,49 +88,49 @@ public:
*
* \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.
*
* \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.
*
* \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.
*
* \return The current weather.
*/
static int GetWeatherCurrent() noexcept;
EXPORT_APIFUNCTION int CDECL GetWeatherCurrent() noexcept;
/**
* \brief Get the next weather in the read worldstate.
*
* \return The next weather.
*/
static int GetWeatherNext() noexcept;
EXPORT_APIFUNCTION int CDECL GetWeatherNext() noexcept;
/**
* \brief Get the queued weather in the read worldstate.
*
* \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.
*
* \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
@ -139,7 +139,7 @@ public:
* \param index The index of the map tile.
* \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
@ -148,7 +148,7 @@ public:
* \param index The index of the map tile.
* \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.
@ -156,7 +156,7 @@ public:
* \param region The region.
* \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.
@ -164,7 +164,7 @@ public:
* \param region The region.
* \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.
@ -174,7 +174,7 @@ public:
* \param forceState The weather forcing state.
* \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.
@ -182,7 +182,7 @@ public:
* \param currentWeather The current weather.
* \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.
@ -190,7 +190,7 @@ public:
* \param nextWeather The next weather.
* \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.
@ -198,7 +198,7 @@ public:
* \param queuedWeather The queued weather.
* \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.
@ -206,7 +206,7 @@ public:
* \param transitionFactor The transition factor.
* \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.
@ -214,7 +214,7 @@ public:
* \param hour The hour.
* \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.
@ -222,7 +222,7 @@ public:
* \param day The day.
* \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.
@ -230,7 +230,7 @@ public:
* \param month The month.
* \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.
@ -238,7 +238,7 @@ public:
* \param year The year.
* \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.
@ -246,7 +246,7 @@ public:
* \param daysPassed The days passed.
* \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.
@ -255,7 +255,7 @@ public:
* \param timeScale The time scale.
* \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
@ -264,7 +264,7 @@ public:
* \param state The collision state.
* \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
@ -273,7 +273,7 @@ public:
* \param state The collision state.
* \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
@ -282,7 +282,7 @@ public:
* \param state The collision state.
* \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.
@ -291,7 +291,7 @@ public:
* \param useActorCollision Whether to use actor collision.
* \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
@ -300,7 +300,7 @@ public:
* \param refId The refId.
* \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
@ -308,7 +308,7 @@ public:
*
* \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
@ -318,7 +318,7 @@ public:
* \param filePath The file path of the resulting file.
* \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
@ -329,7 +329,7 @@ public:
* \param filePath The file path of the loaded file.
* \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
@ -340,7 +340,7 @@ public:
* \param pid The player ID attached to the packet.
* \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
@ -351,7 +351,7 @@ public:
* or to all players on the server.
* \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
@ -364,7 +364,7 @@ public:
* to the packet (false by default).
* \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.
@ -376,7 +376,7 @@ public:
* to the packet (false by default).
* \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
@ -389,14 +389,13 @@ public:
* to the packet (false by default).
* \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
static void ReadLastWorldstate() noexcept;
static void CopyLastWorldstateToStore() noexcept;
};
EXPORT_APIFUNCTION void CDECL ReadLastWorldstate() noexcept;
EXPORT_APIFUNCTION void CDECL CopyLastWorldstateToStore() noexcept;
}
#endif //OPENMW_WORLDSTATEAPI_HPP

@ -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_<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>
struct C
{
@ -143,6 +117,7 @@ struct C
}
};
template<>
struct C<0>
{
@ -166,7 +141,6 @@ LuaFuctionData *functions()
return functions_;
}
#endif
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]);
#if __arm__
LuaFuctionData *functions_ = functions(IndicesFor<functions_n>{});
#else
LuaFuctionData *functions_ = functions<sizeof(ScriptFunctions::functions) / sizeof(ScriptFunctions::functions[0])>();
#endif
luabridge::Namespace tes3mp = luabridge::getGlobalNamespace(lua).beginNamespace("tes3mp");
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;
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)));
break;
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);
}
void LangLua::Init()
{
}
void LangLua::Free()
{
}

@ -45,6 +45,9 @@ public:
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 void Init();
static void Free();
private:
static std::set<std::string> packageCPath;
static std::set<std::string> packagePath;

@ -9,7 +9,7 @@
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;
@ -93,13 +93,15 @@ int LangLua::CallPublic(lua_State *lua)
if (result.empty())
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));
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));
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));
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));
return 1;
}

@ -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();
}

@ -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);
};

@ -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()
{
}

@ -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, const std::vector<boost::any> &args) override;
static void Init();
static void Free();
};

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

@ -5,16 +5,24 @@
#ifndef PLATFORM_HPP
#define PLATFORM_HPP
#if _MSC_VER
#ifdef _MSC_VER
#ifdef _M_X86
#define ARCH_X86
#endif
#endif
#if __GNUC__
#ifdef __GNUC__
#ifdef __i386__
#define ARCH_X86
#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

@ -9,10 +9,28 @@
#include "LangLua/LangLua.hpp"
#endif
#ifdef ENABLE_MONO
#include "LangMono/LangMono.hpp"
#endif
using namespace std;
Script::ScriptList Script::scripts;
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)
{
@ -23,35 +41,45 @@ Script::Script(const char *path)
fclose(file);
#ifdef _WIN32
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
#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;
lang = new LangNative();
Load(lang, path);
}
#endif
#if defined (ENABLE_LUA)
else if (strstr(path, ".lua") || strstr(path, ".t"))
{
lang = new LangLua();
script_type = SCRIPT_LUA;
lang = new LangLua();
Load(lang, path);
}
#endif
else
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();
}
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();
}

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

@ -9,6 +9,9 @@
#if defined (ENABLE_LUA)
#include "LangLua/LangLua.hpp"
#endif
#if defined(ENABLE_MONO)
#include "LangMono/LangMono.hpp"
#endif
using namespace std;
@ -24,7 +27,12 @@ ScriptFunction::ScriptFunction(const ScriptFuncLua &fLua, lua_State *lua, char r
}
#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()
{
@ -36,7 +44,7 @@ ScriptFunction::~ScriptFunction()
boost::any ScriptFunction::Call(const vector<boost::any> &args)
{
boost::any result;
boost::any result = boost::any();
if (def.length() != args.size())
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*>();
break;
case 'v':
result = boost::any();
break;
default:
throw runtime_error("Lua call: Unknown return type" + ret_type);
}
}
#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;
}

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

@ -13,23 +13,58 @@ constexpr ScriptCallbackData ScriptFunctions::callbacks[];
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);
}
boost::any ScriptFunctions::CallPublic(const char *name, va_list args) noexcept
{
vector<boost::any> params;
params.reserve(def.length());
try
{
string def = Public::GetDefinition(name);
Utils::getArguments(params, args, def);
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;
return Public::Call(name, params);
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 (...) {}
return 0;
catch (...)
{
va_end(args);
throw;
}
va_end(args);
}

@ -14,6 +14,7 @@
#include <Script/Functions/Miscellaneous.hpp>
#include <Script/Functions/Objects.hpp>
#include <Script/Functions/Positions.hpp>
#include <Script/Functions/Public.hpp>
#include <Script/Functions/Quests.hpp>
#include <Script/Functions/RecordsDynamic.hpp>
#include <Script/Functions/Shapeshift.hpp>
@ -21,6 +22,7 @@
#include <Script/Functions/Settings.hpp>
#include <Script/Functions/Spells.hpp>
#include <Script/Functions/Stats.hpp>
#include <Script/Functions/Timer.hpp>
#include <Script/Functions/Worldstate.hpp>
#include <RakNetTypes.h>
#include <tuple>
@ -46,88 +48,19 @@
class ScriptFunctions
{
public:
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 void GetArguments(std::vector<boost::any> &params, va_list args, const std::string &def);
static constexpr ScriptFunctionData functions[]{
{"CreateTimer", ScriptFunctions::CreateTimer},
{"CreateTimerEx", ScriptFunctions::CreateTimerEx},
{"MakePublic", ScriptFunctions::MakePublic},
{"CallPublic", ScriptFunctions::CallPublic},
{"CreateTimer", TimerFunctions::CreateTimer},
{"CreateTimerEx", TimerFunctions::CreateTimerEx},
{"MakePublic", PublicFunctions::MakePublic},
{"CallPublic", PublicFunctions::CallPublic},
{"StartTimer", ScriptFunctions::StartTimer},
{"StopTimer", ScriptFunctions::StopTimer},
{"RestartTimer", ScriptFunctions::RestartTimer},
{"FreeTimer", ScriptFunctions::FreeTimer},
{"IsTimerElapsed", ScriptFunctions::IsTimerElapsed},
{"StartTimer", TimerFunctions::StartTimer},
{"StopTimer", TimerFunctions::StopTimer},
{"RestartTimer", TimerFunctions::RestartTimer},
{"FreeTimer", TimerFunctions::FreeTimer},
{"IsTimerElapsed", TimerFunctions::IsTimerElapsed},
ACTORAPI,
BOOKAPI,
@ -156,7 +89,6 @@ public:
{"OnServerInit", Callback<>()},
{"OnServerPostInit", Callback<>()},
{"OnServerExit", Callback<bool>()},
{"OnServerScriptCrash", Callback<const char*>()},
{"OnPlayerConnect", Callback<unsigned short>()},
{"OnPlayerDisconnect", Callback<unsigned short>()},
{"OnPlayerDeath", Callback<unsigned short>()},
@ -209,7 +141,7 @@ public:
{"OnWorldMap", Callback<unsigned short>()},
{"OnWorldWeather", Callback<unsigned short>() },
{"OnMpNumIncrement", Callback<int>()},
{"OnRequestDataFileList", Callback<>()}
{"OnRequestPluginList", Callback<>()}
};
};

@ -103,13 +103,9 @@ struct CallbackIdentity
struct ScriptFunctionPointer : public ScriptIdentity
{
void *addr;
#if (!defined(__clang__) && defined(__GNUC__))
template<typename R, typename... Types>
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

@ -1,6 +1,8 @@
#include "Utils.hpp"
//
// Created by koncord on 04.03.17.
//
#include <cstdarg>
#include "Utils.hpp"
using namespace std;
@ -15,7 +17,6 @@ const vector<string> Utils::split(const string &str, int delimiter)
else if (!buffer.empty())
{
result.push_back(move(buffer));
buffer.clear();
}
if (!buffer.empty())
result.push_back(move(buffer));
@ -23,7 +24,7 @@ const vector<string> Utils::split(const string &str, int delimiter)
return result;
}
ESM::Cell Utils::getCellFromDescription(std::string cellDescription)
ESM::Cell Utils::getCellFromDescription(const std::string &cellDescription)
{
ESM::Cell cell;
cell.blank();
@ -50,59 +51,3 @@ ESM::Cell Utils::getCellFromDescription(std::string cellDescription)
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);
}

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

@ -27,6 +27,10 @@
#include <apps/openmw-mp/Script/Script.hpp>
#ifdef ENABLE_MONO
#include <mono/metadata/assembly.h>
#endif
#ifdef ENABLE_BREAKPAD
#include <handler/exception_handler.h>
#endif
@ -130,6 +134,7 @@ boost::program_options::variables_map launchOptions(int argc, char *argv[], File
desc.add_options()
("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),
"Do not write logs. Useful for daemonizing.");
@ -190,29 +195,53 @@ int main(int argc, char *argv[])
LOG_INIT(logLevel);
int players = mgr.getInt("maximumPlayers", "General");
string address = mgr.getString("localAddress", "General");
string addr = mgr.getString("localAddress", "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 dataDirectory = Utils::convertPath(pluginHome + "/data");
string plugin_home = mgr.getString("home", "Plugins");
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);
// 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(dataDirectory);
Script::SetModDir(moddir);
#ifdef ENABLE_LUA
LangLua::AddPackagePath(Utils::convertPath(pluginHome + "/scripts/?.lua" + ";"
+ pluginHome + "/lib/lua/?.lua" + ";"));
LangLua::AddPackagePath(Utils::convertPath(plugin_home + "/scripts/?.lua" + ";"
+ plugin_home + "/lib/lua/?.lua" + ";"));
#ifdef _WIN32
LangLua::AddPackageCPath(Utils::convertPath(pluginHome + "/lib/?.dll"));
LangLua::AddPackageCPath(Utils::convertPath(plugin_home + "/lib/?.dll"));
#else
LangLua::AddPackageCPath(Utils::convertPath(pluginHome + "/lib/?.so"));
LangLua::AddPackageCPath(Utils::convertPath(plugin_home + "/lib/?.so"));
#endif
#endif
#ifdef ENABLE_MONO
mono_set_dirs(Utils::convertPath(plugin_home + "/mono").c_str(), Utils::convertPath(plugin_home + "/mono/etc").c_str());
#endif
int code;
@ -226,18 +255,21 @@ int main(int argc, char *argv[])
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.");
return 1;
}
RakNet::SocketDescriptor sd((unsigned short) port, address.c_str());
RakNet::SocketDescriptor sd((unsigned short) port, addr.c_str());
try
{
if (variables["debug"].as<bool>())
Script::EnableDebugMode();
Script::Init();
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))
{
@ -264,7 +296,7 @@ int main(int argc, char *argv[])
peer->SetMaximumIncomingConnections((unsigned short) (players));
Networking networking(peer);
networking.setServerPassword(password);
networking.setServerPassword(passw);
if (mgr.getBool("enabled", "MasterServer"))
{
@ -289,13 +321,15 @@ int main(int argc, char *argv[])
}
networking.InitQuery(masterAddr, (unsigned short) masterPort);
networking.getMasterClient()->SetMaxPlayers((unsigned) players);
networking.getMasterClient()->SetUpdateRate((unsigned) updateRate);
auto masterClient = networking.getMasterClient();
masterClient->SetMaxPlayers((unsigned) players);
masterClient->SetUpdateRate((unsigned) updateRate);
string hostname = mgr.getString("hostname", "General");
networking.getMasterClient()->SetHostname(hostname);
networking.getMasterClient()->SetRuleString("CommitHash", version.mCommitHash.substr(0, 10));
masterClient->SetHostname(hostname);
masterClient->SetRuleString("CommitHash", version.mCommitHash.substr(0, 10));
networking.getMasterClient()->Start();
masterClient->Start();
}
networking.postInit();
@ -303,11 +337,11 @@ int main(int argc, char *argv[])
code = networking.mainLoop();
networking.getMasterClient()->Stop();
Script::Free();
}
catch (std::exception &e)
{
LOG_MESSAGE_SIMPLE(Log::LOG_ERROR, e.what());
Script::Call<Script::CallbackIdentity("OnServerScriptCrash")>(e.what());
throw; //fall through
}

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

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

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

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

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

@ -221,11 +221,10 @@ bool parseOptions (int argc, char** argv, OMW::Engine& engine, Files::Configurat
/*
Start of tes3mp addition
Check for unmodified tes3mp-credits file on Windows; 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
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
*/
#ifdef _WIN32
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";
@ -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);
return false;
}
#endif
/*
End of tes3mp addition
*/

@ -553,10 +553,9 @@ namespace MWClass
/*
Start of tes3mp addition
If the attacker was the LocalPlayer or LocalActor, record their target and send a
packet with it
If the attacker was the LocalPlayer or LocalActor, record their target and send a 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);

@ -966,13 +966,12 @@ namespace MWClass
/*
Start of tes3mp addition
If the attacker was the LocalPlayer or LocalActor, record their target and send a
packet with it
If the attacker was the LocalPlayer or LocalActor, record their target and send a packet with it
If the victim was the LocalPlayer, check whether packets should be sent about
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);

@ -458,15 +458,6 @@ namespace MWGui
updateMagicMarkers();
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)

@ -9,19 +9,6 @@
#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/environment.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(
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(
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");
player.getClass().getContainerStore(player).restack(item);

@ -842,22 +842,6 @@ namespace MWMechanics
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.getClass().getNpcStats(caster).isWerewolf())

@ -4,19 +4,6 @@
#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/environment.hpp"
#include "../mwbase/mechanicsmanager.hpp"
@ -70,25 +57,8 @@ void Repair::repair(const MWWorld::Ptr &itemToRepair)
// repair by 'y' points
int charge = itemToRepair.getClass().getItemHealth(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);
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
MWWorld::ContainerStoreIterator stacked = player.getClass().getContainerStore(player).restack(itemToRepair);

@ -537,7 +537,7 @@ namespace MWMechanics
/*
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)
{

@ -82,10 +82,8 @@ void Cell::updateLocal(bool forceUpdate)
}
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())
actor->update(actor->hasSentData ? forceUpdate : true);
actor->update(forceUpdate);
++it;
}
@ -399,9 +397,6 @@ void Cell::readCellChange(ActorList& actorList)
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();
actor->cell = *store->getCell();
actor->setPtr(ptr);
@ -411,17 +406,16 @@ void Cell::initializeLocalActor(const MWWorld::Ptr& ptr)
if (ptr.getClass().getCreatureStats(ptr).isDead())
actor->wasDead = true;
std::string mapIndex = Main::get().getCellController()->generateMapIndex(ptr);
localActors[mapIndex] = actor;
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()
{
LOG_MESSAGE_SIMPLE(Log::LOG_VERBOSE, "Initializing LocalActors in %s", getDescription().c_str());
for (const auto &mergedRef : store->getMergedRefs())
{
if (mergedRef->mClass->isActor())
@ -438,24 +432,20 @@ void Cell::initializeLocalActors()
initializeLocalActor(ptr);
}
}
LOG_APPEND(Log::LOG_VERBOSE, "- Successfully initialized LocalActors in %s", getDescription().c_str());
}
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();
actor->cell = *store->getCell();
actor->setPtr(ptr);
std::string mapIndex = Main::get().getCellController()->generateMapIndex(ptr);
dedicatedActors[mapIndex] = actor;
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)

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

Loading…
Cancel
Save